From 7650301978c0ad141f8b71f56df84b3fbb7ea6a9 Mon Sep 17 00:00:00 2001 From: AleSim94 Date: Thu, 26 Sep 2024 16:28:38 +0200 Subject: [PATCH 01/28] added neo4j+s as default protocol and tested it and it works! --- docs/modules/ROOT/pages/developer-guide/configuration.adoc | 4 ++-- docs/modules/ROOT/pages/developer-guide/standalone-mode.adoc | 2 +- docs/modules/ROOT/pages/developer-guide/state-management.adoc | 2 +- public/config.json | 2 +- src/application/ApplicationReducer.ts | 2 +- src/application/ApplicationThunks.ts | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/modules/ROOT/pages/developer-guide/configuration.adoc b/docs/modules/ROOT/pages/developer-guide/configuration.adoc index 604ed1298..93f226e69 100644 --- a/docs/modules/ROOT/pages/developer-guide/configuration.adoc +++ b/docs/modules/ROOT/pages/developer-guide/configuration.adoc @@ -19,7 +19,7 @@ will look like this: "ssoProviders": [], "ssoDiscoveryUrl": "https://example.com", "standalone": false, - "standaloneProtocol": "neo4j", + "standaloneProtocol": "neo4j+s", "standaloneHost": "localhost", "standalonePort": "7687", "standaloneDatabase": "neo4j", @@ -55,7 +55,7 @@ mode (false), or reader mode (true). The terms ``Reader mode'' and ``Standalone mode'' are used interchangibly. |standaloneProtocol |string |neo4j |When running in standalone mode, the -protocol to used for the Neo4j driver. This shoudl be set to one of +protocol to used for the Neo4j driver. This should be set to one of `neo4j`, `neo4j+s`, `neo4j+ssc`, `bolt`, `bolt+s`, or `bolt+ssc`. |standaloneHost |string |localhost |When running in standalone mode, the diff --git a/docs/modules/ROOT/pages/developer-guide/standalone-mode.adoc b/docs/modules/ROOT/pages/developer-guide/standalone-mode.adoc index f752cbad1..9ecb34074 100644 --- a/docs/modules/ROOT/pages/developer-guide/standalone-mode.adoc +++ b/docs/modules/ROOT/pages/developer-guide/standalone-mode.adoc @@ -42,7 +42,7 @@ docker run -it --rm -p 5005:5005 \ -e ssoProviders=[] \ -e ssoDiscoveryUrl="https://example.com" \ -e standalone=true \ - -e standaloneProtocol="neo4j" \ + -e standaloneProtocol="neo4j+s" \ -e standaloneHost="localhost" \ -e standalonePort="7687" \ -e standaloneDatabase="neo4j" \ diff --git a/docs/modules/ROOT/pages/developer-guide/state-management.adoc b/docs/modules/ROOT/pages/developer-guide/state-management.adoc index bdece9b9e..e3c003f6c 100644 --- a/docs/modules/ROOT/pages/developer-guide/state-management.adoc +++ b/docs/modules/ROOT/pages/developer-guide/state-management.adoc @@ -129,7 +129,7 @@ standalone mode. "ssoEnabled": false, "ssoProviders": [], "ssoDiscoveryUrl": "https://example.com", - "standaloneProtocol": "neo4j", + "standaloneProtocol": "neo4j+s", "standaloneHost": "localhost", "standalonePort": "7687", "standaloneDatabase": "neo4j", diff --git a/public/config.json b/public/config.json index 4e8d475a2..17d012515 100644 --- a/public/config.json +++ b/public/config.json @@ -3,7 +3,7 @@ "ssoProviders": [], "ssoDiscoveryUrl": "https://example.com", "standalone": false, - "standaloneProtocol": "neo4j", + "standaloneProtocol": "neo4j+s", "standaloneHost": "localhost", "standalonePort": "7687", "standaloneDatabase": "neo4j", diff --git a/src/application/ApplicationReducer.ts b/src/application/ApplicationReducer.ts index e662ade63..fefbedf92 100644 --- a/src/application/ApplicationReducer.ts +++ b/src/application/ApplicationReducer.ts @@ -58,7 +58,7 @@ const initialState = { draft: false, aboutModalOpen: false, connection: { - protocol: 'neo4j', + protocol: 'neo4j+s', url: DEFAULT_NEO4J_URL, port: '7687', database: '', diff --git a/src/application/ApplicationThunks.ts b/src/application/ApplicationThunks.ts index 5076e855c..ff50d2ac7 100644 --- a/src/application/ApplicationThunks.ts +++ b/src/application/ApplicationThunks.ts @@ -410,7 +410,7 @@ export const loadApplicationConfigThunk = () => async (dispatch: any, getState: ssoProviders: [], ssoDiscoveryUrl: 'http://example.com', standalone: false, - standaloneProtocol: 'neo4j', + standaloneProtocol: 'neo4j+s', standaloneHost: 'localhost', standalonePort: '7687', standaloneDatabase: 'neo4j', From 601c95fde970e15f226849124ac4c7ea37eee321 Mon Sep 17 00:00:00 2001 From: Niels de Jong Date: Thu, 14 Nov 2024 16:06:58 +0100 Subject: [PATCH 02/28] 2.4.9 Release (#973) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Bump es5-ext from 0.10.62 to 0.10.64 Bumps [es5-ext](https://github.com/medikoo/es5-ext) from 0.10.62 to 0.10.64. - [Release notes](https://github.com/medikoo/es5-ext/releases) - [Changelog](https://github.com/medikoo/es5-ext/blob/main/CHANGELOG.md) - [Commits](https://github.com/medikoo/es5-ext/compare/v0.10.62...v0.10.64) --- updated-dependencies: - dependency-name: es5-ext dependency-type: indirect ... Signed-off-by: dependabot[bot] * Disable form button until all parameters in given * fix: check empty string as well * Bump webpack-dev-middleware from 5.3.3 to 5.3.4 Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.3 to 5.3.4. - [Release notes](https://github.com/webpack/webpack-dev-middleware/releases) - [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.3...v5.3.4) --- updated-dependencies: - dependency-name: webpack-dev-middleware dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /gallery Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.3 to 5.3.4. - [Release notes](https://github.com/webpack/webpack-dev-middleware/releases) - [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.3...v5.3.4) --- updated-dependencies: - dependency-name: webpack-dev-middleware dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump express from 4.18.1 to 4.19.2 in /docs Bumps [express](https://github.com/expressjs/express) from 4.18.1 to 4.19.2. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.1...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump express from 4.18.2 to 4.19.2 in /gallery Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump express from 4.18.2 to 4.19.2 Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: indirect ... Signed-off-by: dependabot[bot] * added cypress * Added cypress * Add a dependabot config file * Add docs directory to dependabot * Fix dependabot yarn to npm * Migrate DataGrid to 7.x #850 ; Initial changes * Fix compact x wrapping * feat: Updated JSDoc * Bump micromatch from 4.0.5 to 4.0.8 in /gallery (#948) Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8. - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8) --- updated-dependencies: - dependency-name: micromatch dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Niels de Jong * Bump webpack from 5.77.0 to 5.94.0 (#947) Bumps [webpack](https://github.com/webpack/webpack) from 5.77.0 to 5.94.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.77.0...v5.94.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump fast-loops from 1.1.3 to 1.1.4 in /gallery (#920) Bumps [fast-loops](https://github.com/robinweser/fast-loops) from 1.1.3 to 1.1.4. - [Commits](https://github.com/robinweser/fast-loops/commits) --- updated-dependencies: - dependency-name: fast-loops dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ws from 8.12.1 to 8.17.1 (#911) Bumps [ws](https://github.com/websockets/ws) from 8.12.1 to 8.17.1. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/8.12.1...8.17.1) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump braces from 3.0.2 to 3.0.3 in /gallery (#908) Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Niels de Jong * Bump follow-redirects from 1.15.4 to 1.15.6 in /gallery (#831) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump follow-redirects from 1.15.4 to 1.15.6 (#830) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Added evolution notice * Fixed typo in README * Fixed typo in README * Bumped version number to 2.4.9 * Improve method for checking "low" property existence in downloadCSV function (#951) Co-authored-by: “Bastien <“bastien.hubert@hotmail.com”> * Update configuration.adoc (#946) Default loggingDatabase is logs not neo4j, updated same in document. Issue Closed : https://github.com/neo4j-labs/neodash/issues/915 Document Referred : https://github.com/neo4j-labs/neodash/blob/42b196a3ec9a1d5740e4c81420a762646b1295b7/scripts/config-entrypoint.sh#L26 https://neo4j.com/labs/neodash/2.4/developer-guide/configuration/#_configuration_options Signed-off-by: Singh, Jyotsana * Feature/rule based styling table colouring (#944) * rule based styling cell colouring feature * changing cell text/background colour now plays nicely * TODO note about row/cell rule mix and match behaviour * Bugfix/array table wrap (#943) * table wrap bug fix * typo fix * changes to add ssl support (#935) Signed-off-by: Parekh, Geet * adding param to manage SSO redirection (#918) * adding param to manage SSO redirection * added standalone when not sharing credentials * Removed superfluous log statements --------- Co-authored-by: Niels de Jong * Add possibility to hide Y axes and grid lines in BarChart (#895) * Add possibility to hide Y axes and grid lines in BarChart * Add Husky prepare stage * Fix stacked grouped function test * Fix pie chart e2e test in start_page.cy * Add Bar chart Y axis e2e tests * Add Cypress support in eslintrc.json * Create Page helper class for Cypress * Update browserlist * Fix e2e bar tests by removing within --------- Co-authored-by: “Bastien <“bastien.hubert@hotmail.com”> Co-authored-by: Niels de Jong * Markdown tables not rendered #836 (#893) Co-authored-by: Marius Conjeaud * Added banner to all docs pages referring to new docs * Updated README * Current Users or ALL Users getting deleted in an Update (#906) * fixed: when updating a user permission by DELETING a user from a certain role, it drops ALL the users. Also if you add a user to a role it will still keep the role on previously added users * updated the code so that if datbase selected is empty we show feedback there is nothing to fetch and do not provide labels and also enable to save users to role even though db is empty --------- Co-authored-by: Niels de Jong * Finalized release notes and updated README for 2.4.9 * [Feature #884] Helm chart for Kubernetes deployments PR#902 (#971) * Include the Helm Chart and Kubernetes YAMLs - Includes the Helm chart required for the NeoDash deployment for the Kubernetes clusters - Includes the example YAML files for the Kubernetes manifests - Appropriate document changes to include the new Kubernetes deployments. Signed-off-by: Lolla, Venkata * Fix the chart notes Signed-off-by: Lolla, Venkata * Patch a typo in the build-and-run.adoc file Signed-off-by: Lolla, Venkata * Resolves SonarCloud warning Signed-off-by: Lolla, Venkata * Review + small fixes, LGTM --------- Signed-off-by: Lolla, Venkata Co-authored-by: Lolla, Venkata --------- Signed-off-by: dependabot[bot] Signed-off-by: Singh, Jyotsana Signed-off-by: Parekh, Geet Signed-off-by: Lolla, Venkata Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Monish <139316519+m-o-n-i-s-h@users.noreply.github.com> Co-authored-by: Marius Conjeaud Co-authored-by: MariusC Co-authored-by: Bastien Hubert <43408420+bastienhubert@users.noreply.github.com> Co-authored-by: “Bastien <“bastien.hubert@hotmail.com”> Co-authored-by: JyotsanaSingh <62237566+Jyots6914@users.noreply.github.com> Co-authored-by: LiamEdwardsLamarche <134382136+LiamEdwardsLamarche@users.noreply.github.com> Co-authored-by: geetparekh Co-authored-by: alfredorubin96 <103421036+alfredorubin96@users.noreply.github.com> Co-authored-by: Aleksandar Co-authored-by: Morgan Senechal Co-authored-by: Lolla, Venkata --- .eslintrc.json | 7 +- .github/dependabot.yml | 19 + .github/workflows/master-deployment.yml | 4 +- Dockerfile | 2 +- README.md | 22 +- changelog.md | 20 + cypress.config.ts | 1 + cypress/Page.js | 156 ++++ cypress/e2e/bar_chart.cy.js | 316 --------- cypress/e2e/{render => charts}/array.cy.js | 77 +- cypress/e2e/charts/bar.cy.js | 211 ++++++ cypress/e2e/{ => charts}/table.cy.js | 30 +- cypress/e2e/start_page.cy.js | 139 ++-- cypress/e2e/utils.js | 84 --- cypress/{support => }/index.js | 2 +- cypress/support/commands.js | 84 +-- docs/modules/ROOT/pages/banner.adoc | 6 + .../adding-visualizations.adoc | 2 + .../pages/developer-guide/build-and-run.adoc | 121 +++- .../developer-guide/component-overview.adoc | 2 + .../pages/developer-guide/configuration.adoc | 4 +- .../pages/developer-guide/contributing.adoc | 2 + .../pages/developer-guide/deploy-a-build.adoc | 4 +- .../ROOT/pages/developer-guide/design.adoc | 2 + .../ROOT/pages/developer-guide/index.adoc | 2 + .../developer-guide/session-storage.adoc | 2 + .../developer-guide/standalone-mode.adoc | 2 + .../developer-guide/state-management.adoc | 2 + .../developer-guide/style-configuration.adoc | 4 +- .../ROOT/pages/developer-guide/testing.adoc | 2 + docs/modules/ROOT/pages/index.adoc | 2 + docs/modules/ROOT/pages/quickstart.adoc | 2 + .../ROOT/pages/user-guide/access-control.adoc | 2 + .../pages/user-guide/bloom-integration.adoc | 2 + .../ROOT/pages/user-guide/dashboards.adoc | 2 + .../extensions/access-control-management.adoc | 2 + .../extensions/advanced-visualizations.adoc | 2 + .../pages/user-guide/extensions/forms.adoc | 2 + .../pages/user-guide/extensions/index.adoc | 2 + .../extensions/natural-language-queries.adoc | 2 + .../user-guide/extensions/report-actions.adoc | 2 + .../extensions/rule-based-styling.adoc | 2 + .../user-guide/extensions/workflows.adoc | 2 + docs/modules/ROOT/pages/user-guide/faq.adoc | 2 + docs/modules/ROOT/pages/user-guide/index.adoc | 2 + docs/modules/ROOT/pages/user-guide/pages.adoc | 2 + .../ROOT/pages/user-guide/publishing.adoc | 2 + .../pages/user-guide/reports/areamap.adoc | 2 + .../pages/user-guide/reports/bar-chart.adoc | 2 + .../pages/user-guide/reports/choropleth.adoc | 2 + .../user-guide/reports/circle-packing.adoc | 2 + .../ROOT/pages/user-guide/reports/form.adoc | 2 + .../ROOT/pages/user-guide/reports/gantt.adoc | 2 + .../pages/user-guide/reports/gauge-chart.adoc | 2 + .../ROOT/pages/user-guide/reports/graph.adoc | 2 + .../pages/user-guide/reports/graph3d.adoc | 2 + .../ROOT/pages/user-guide/reports/iframe.adoc | 2 + .../ROOT/pages/user-guide/reports/index.adoc | 2 + .../pages/user-guide/reports/line-chart.adoc | 2 + .../ROOT/pages/user-guide/reports/map.adoc | 2 + .../pages/user-guide/reports/markdown.adoc | 2 + .../user-guide/reports/parameter-select.adoc | 2 + .../pages/user-guide/reports/pie-chart.adoc | 2 + .../ROOT/pages/user-guide/reports/radar.adoc | 2 + .../pages/user-guide/reports/raw-json.adoc | 2 + .../ROOT/pages/user-guide/reports/sankey.adoc | 2 + .../user-guide/reports/single-value.adoc | 2 + .../pages/user-guide/reports/sunburst.adoc | 2 + .../ROOT/pages/user-guide/reports/table.adoc | 2 + .../pages/user-guide/reports/treemap.adoc | 2 + docs/package-lock.json | 388 ++++++---- docs/yarn.lock | 46 +- evolving.png | Bin 0 -> 223331 bytes gallery/yarn.lock | 92 ++- k8s-deploy/neodash/.helmignore | 23 + k8s-deploy/neodash/Chart.yaml | 24 + k8s-deploy/neodash/README.md | 78 ++ k8s-deploy/neodash/templates/NOTES.txt | 26 + k8s-deploy/neodash/templates/_helpers.tpl | 62 ++ k8s-deploy/neodash/templates/deployment.yaml | 76 ++ k8s-deploy/neodash/templates/hpa.yaml | 32 + k8s-deploy/neodash/templates/ingress.yaml | 61 ++ k8s-deploy/neodash/templates/service.yaml | 19 + .../neodash/templates/serviceaccount.yaml | 13 + .../templates/tests/test-connection.yaml | 18 + k8s-deploy/neodash/values.yaml | 108 +++ k8s-deploy/sample-k8s-yamls/deployment.yaml | 66 ++ k8s-deploy/sample-k8s-yamls/service.yaml | 17 + package.json | 8 +- release-notes.md | 28 +- src/application/ApplicationThunks.ts | 36 +- src/chart/ChartUtils.ts | 2 +- src/chart/bar/BarChart.tsx | 18 +- src/chart/markdown/MarkdownChart.tsx | 38 +- src/chart/table/TableActionsHelper.ts | 11 +- src/chart/table/TableChart.tsx | 46 +- src/config/ReportConfig.tsx | 12 + src/extensions/forms/chart/NeoForm.tsx | 11 +- src/extensions/rbac/RBACManagementModal.tsx | 85 ++- src/extensions/rbac/RBACUtils.ts | 73 +- .../styling/StyleRuleCreationModal.tsx | 29 + src/extensions/styling/StyleRuleEvaluator.ts | 26 +- src/index.pcss | 23 + src/modal/AboutModal.tsx | 2 +- src/report/ReportRecordProcessing.tsx | 19 +- src/utils/parameterUtils.ts | 35 + ssl/Dockerfile | 25 + ssl/default.conf | 34 + yarn.lock | 671 ++++++++++-------- 109 files changed, 2489 insertions(+), 1303 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 cypress/Page.js delete mode 100644 cypress/e2e/bar_chart.cy.js rename cypress/e2e/{render => charts}/array.cy.js (70%) create mode 100644 cypress/e2e/charts/bar.cy.js rename cypress/e2e/{ => charts}/table.cy.js (66%) delete mode 100644 cypress/e2e/utils.js rename cypress/{support => }/index.js (95%) create mode 100644 docs/modules/ROOT/pages/banner.adoc create mode 100644 evolving.png create mode 100644 k8s-deploy/neodash/.helmignore create mode 100644 k8s-deploy/neodash/Chart.yaml create mode 100644 k8s-deploy/neodash/README.md create mode 100644 k8s-deploy/neodash/templates/NOTES.txt create mode 100644 k8s-deploy/neodash/templates/_helpers.tpl create mode 100644 k8s-deploy/neodash/templates/deployment.yaml create mode 100644 k8s-deploy/neodash/templates/hpa.yaml create mode 100644 k8s-deploy/neodash/templates/ingress.yaml create mode 100644 k8s-deploy/neodash/templates/service.yaml create mode 100644 k8s-deploy/neodash/templates/serviceaccount.yaml create mode 100644 k8s-deploy/neodash/templates/tests/test-connection.yaml create mode 100644 k8s-deploy/neodash/values.yaml create mode 100644 k8s-deploy/sample-k8s-yamls/deployment.yaml create mode 100644 k8s-deploy/sample-k8s-yamls/service.yaml create mode 100644 src/utils/parameterUtils.ts create mode 100644 ssl/Dockerfile create mode 100644 ssl/default.conf diff --git a/.eslintrc.json b/.eslintrc.json index 6f7a0eccf..c6d98d2c6 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,7 +4,8 @@ "extends": ["eslint:recommended", "prettier", "plugin:@typescript-eslint/recommended"], // this is optional "env": { "browser": true, - "node": true + "node": true, + "jest": true }, "settings": { "react": { @@ -166,5 +167,9 @@ ], "symbol-description": "error", "yoda": "error" + }, + "globals": { + "cy": "readonly", + "Cypress": "readonly" } } diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..8f7a92ae3 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,19 @@ +version: 2 +updates: + - package-ecosystem: 'npm' + directory: '/' + schedule: + interval: 'weekly' + target-branch: 'develop' + + - package-ecosystem: 'npm' + directory: '/gallery' + schedule: + interval: 'weekly' + target-branch: 'develop' + + - package-ecosystem: 'npm' + directory: '/docs' + schedule: + interval: 'weekly' + target-branch: 'develop' diff --git a/.github/workflows/master-deployment.yml b/.github/workflows/master-deployment.yml index 55cf525c4..820b12d8c 100644 --- a/.github/workflows/master-deployment.yml +++ b/.github/workflows/master-deployment.yml @@ -79,7 +79,7 @@ jobs: context: . file: ./Dockerfile push: true - tags: ${{ secrets.DOCKER_HUB_LABS_USERNAME }}/neodash:latest,${{ secrets.DOCKER_HUB_LABS_USERNAME }}/neodash:2.4.8 + tags: ${{ secrets.DOCKER_HUB_LABS_USERNAME }}/neodash:latest,${{ secrets.DOCKER_HUB_LABS_USERNAME }}/neodash:2.4.9 build-docker-legacy: needs: build-test runs-on: neodash-runners @@ -103,7 +103,7 @@ jobs: context: . file: ./Dockerfile push: true - tags: ${{ secrets.DOCKER_HUB_USERNAME }}/neodash:latest,${{ secrets.DOCKER_HUB_USERNAME }}/neodash:2.4.8 + tags: ${{ secrets.DOCKER_HUB_USERNAME }}/neodash:latest,${{ secrets.DOCKER_HUB_USERNAME }}/neodash:2.4.9 deploy-gallery: runs-on: neodash-runners strategy: diff --git a/Dockerfile b/Dockerfile index 44320dcaf..a31be8d85 100644 --- a/Dockerfile +++ b/Dockerfile @@ -44,4 +44,4 @@ USER nginx EXPOSE $NGINX_PORT HEALTHCHECK cmd curl --fail "http://localhost:$NGINX_PORT" || exit 1 -LABEL version="2.4.8" +LABEL version="2.4.9" diff --git a/README.md b/README.md index 5c4db07c9..7ba0e71da 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,24 @@ -## NeoDash - Neo4j Dashboard Builder -NeoDash is an open source tool for visualizing your Neo4j data. It lets you group visualizations together as dashboards, and allow for interactions between reports. +## NeoDash Labs - Neo4j Dashboard Builder -![screenshot](public/screenshot.png) +![screenshot](evolving.png) + +In September 2024 **Neo4j [announced](https://www.datanami.com/2024/09/04/neo4j-simplifies-graph-database-in-the-cloud/#:~:text=NeoDash%20is%20an%20open%20source,was%20open%20source%2C%20not%20supported) NeoDash is evolving into a fully supported dashboard builder, as part of the Neo4j product suite**. + +This project (NeoDash Labs) will still be available and contain experimental features, but will **not** have official support. If you're interested to get official support for NeoDash as part of a Neo4j License agreement, please reach out to your Neo4j contact person. + +## About NeoDash Labs +NeoDash is a web-based tool for visualizing your Neo4j data. It lets you group visualizations together as dashboards, and allow for interactions between reports. Neodash supports presenting your data as tables, graphs, bar charts, line charts, maps and more. It contains a Cypher editor to directly write the Cypher queries that populate the reports. You can save dashboards to your database, and share them with others. -## Try NeoDash +## Try NeoDash Labs You can run NeoDash in one of three ways: -1. You can install NeoDash into Neo4j Desktop from the [graph app gallery](https://install.graphapp.io). NeoDash will automatically connect to your active database. -2. You can run NeoDash from a web browser by visiting http://neodash.graphapp.io. +1. You can install NeoDash Labs into Neo4j Desktop from the [graph app gallery](https://install.graphapp.io). NeoDash will automatically connect to your active database. +> Note: never versions of Neo4j Desktop do not support adding experimental graph apps such as NeoDash. + +2. You can run NeoDash Labs from a web browser by visiting http://neodash.graphapp.io. 3. For on-prem deployments, you can build the application yourself, or pull the latest Docker image from Docker Hub. ``` # Run the application on http://localhost:5005 @@ -79,4 +87,4 @@ If you have any questions about NeoDash, please reach out to the maintainers: - Connect with us on the [Neo4j Discord](https://neo4j.com/developer/discord/). - Create a post on the Neo4j [Community Forum](https://community.neo4j.com/). -> NeoDash is a free and open-source tool developed by the Neo4j community - not an official Neo4j product. If you have a need for a commercial agreement around training, custom extensions or other services, please contact the [Neo4j Professional Services](https://neo4j.com/professional-services/) team. \ No newline at end of file +> NeoDash Labs is a free and open-source tool developed by the Neo4j community - not an official Neo4j product. Use at your own risk! \ No newline at end of file diff --git a/changelog.md b/changelog.md index ae99c6f96..9227e1fff 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,23 @@ +## NeoDash 2.4.9 +This release adds some minor changes to documentation and implements some community contributions. +- Added notice about project evolution: [#967](https://github.com/neo4j-labs/neodash/pull/967) +- Added community contributions and bug fixes: +[#967](https://github.com/neo4j-labs/neodash/pull/967) +[#894](https://github.com/neo4j-labs/neodash/pull/894) +[#822](https://github.com/neo4j-labs/neodash/pull/822) +[#951](https://github.com/neo4j-labs/neodash/pull/951) +[#946](https://github.com/neo4j-labs/neodash/pull/946) +[#944](https://github.com/neo4j-labs/neodash/pull/944) +[#943](https://github.com/neo4j-labs/neodash/pull/943) +[#938](https://github.com/neo4j-labs/neodash/pull/938) +[#935](https://github.com/neo4j-labs/neodash/pull/935) +[#918](https://github.com/neo4j-labs/neodash/pull/918) +[#908](https://github.com/neo4j-labs/neodash/pull/908) +[#906](https://github.com/neo4j-labs/neodash/pull/906) +[#902](https://github.com/neo4j-labs/neodash/pull/902) +[#895](https://github.com/neo4j-labs/neodash/pull/895) +[#893](https://github.com/neo4j-labs/neodash/pull/893) + ## NeoDash 2.4.8 This is a minor release containing an important fix and other minor fixes: diff --git a/cypress.config.ts b/cypress.config.ts index 73948909e..93f8cffdf 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -5,6 +5,7 @@ export default defineConfig({ projectId: 'a8nh14', video: false, e2e: { + defaultCommandTimeout: 20000, experimentalMemoryManagement: true, numTestsKeptInMemory: 0, baseUrl: 'http://localhost:3000', diff --git a/cypress/Page.js b/cypress/Page.js new file mode 100644 index 000000000..f90742a41 --- /dev/null +++ b/cypress/Page.js @@ -0,0 +1,156 @@ +const DB_URL = 'localhost'; +const DB_USERNAME = 'neo4j'; +const DB_PASSWORD = 'test1234'; + +export class Page { + constructor(cardSelector) { + this.cardSelector = cardSelector; + } + + init() { + cy.viewport(1920, 1080); + cy.visit('/', { + onBeforeLoad(win) { + win.localStorage.clear(); + }, + }); + return this; + } + + createNewDashboard() { + cy.get('#form-dialog-title').then(($div) => { + const text = $div.text(); + if (text == 'NeoDash - Neo4j Dashboard Builder') { + cy.wait(100); + // Create new dashboard + cy.contains('New Dashboard').click(); + } + }); + return this; + } + + connectToNeo4j() { + cy.get('#form-dialog-title', { timeout: 20000 }).should('contain', 'Connect to Neo4j'); + cy.get('#url').clear().type(DB_URL); + cy.get('#dbusername').clear().type(DB_USERNAME); + cy.get('#dbpassword').type(DB_PASSWORD); + cy.get('button').contains('Connect').click(); + cy.wait(100); + return this; + } + + enableReportActions() { + cy.get('main button[aria-label="Extensions').should('be.visible').click(); + cy.get('#checkbox-actions').scrollIntoView(); + cy.get('#checkbox-actions').should('be.visible').click(); + cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click(); + cy.wait(100); + return this; + } + + enableAdvancedVisualizations() { + cy.get('main button[aria-label="Extensions').should('be.visible').click(); + cy.get('#checkbox-advanced-charts').should('be.visible').click(); + cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click(); + cy.wait(100); + return this; + } + + enableFormsExtension() { + cy.get('main button[aria-label="Extensions').should('be.visible').click(); + cy.get('#checkbox-forms').scrollIntoView(); + cy.get('#checkbox-forms').should('be.visible').click(); + cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click(); + cy.wait(100); + return this; + } + + selectReportOfType(type) { + cy.get('main .react-grid-item button[aria-label="add report"]').should('be.visible').click(); + cy.get('main .react-grid-item') + .contains('No query specified.') + .parentsUntil('.react-grid-item') + .find('button[aria-label="settings"]', { timeout: 2000 }) + .should('be.visible') + .click(); + cy.get(`${this.cardSelector} #type`, { timeout: 2000 }).should('be.visible').click(); + cy.contains(type).click(); + cy.wait(100); + return this; + } + + createReportOfType(type, query, fast = false, run = true) { + this.selectReportOfType(type); + if (fast) { + cy.get(`${this.cardSelector} .ReactCodeMirror`).type(query, { + delay: 1, + parseSpecialCharSequences: false, + }); + } else { + cy.get(`${this.cardSelector} .ReactCodeMirror`).type(query, { parseSpecialCharSequences: false }); + } + cy.wait(400); + + if (run) { + this.closeSettings(); + } + + cy.wait(100); + return this; + } + + openSettings() { + cy.get(this.cardSelector).find('button[aria-label="settings"]', { WAITING_TIME: 2000 }).click(); + cy.wait(100); + return this; + } + + closeSettings() { + cy.get(`${this.cardSelector} button[aria-label="run"]`).click(); + cy.wait(100); + return this; + } + + openAdvancedSettings() { + this.openSettings(); + cy.get(this.cardSelector).contains('Advanced settings').click(); + cy.wait(100); + return this; + } + + closeAdvancedSettings() { + cy.get(this.cardSelector).contains('Advanced settings').click(); + this.closeSettings(); + return this; + } + + openReportActionsMenu() { + this.openSettings(); + cy.get(this.cardSelector).find('button[aria-label="custom actions"]').click(); + cy.wait(100); + return this; + } + + updateDropdownAdvancedSetting(settingLabel, targetValue) { + this.openAdvancedSettings(); + cy.get(`${this.cardSelector} .ndl-dropdown`).contains(settingLabel).siblings('div').click(); + cy.contains(targetValue).click(); + this.closeAdvancedSettings(); + return this; + } + + updateChartQuery(query) { + this.openSettings(); + + cy.get(this.cardSelector) + .find('.ndl-cypher-editor div[role="textbox"]') + .should('be.visible') + .click() + .clear() + .type(query); + cy.wait(100); + + this.closeSettings(); + return this; + } +} diff --git a/cypress/e2e/bar_chart.cy.js b/cypress/e2e/bar_chart.cy.js deleted file mode 100644 index 3f9c20faa..000000000 --- a/cypress/e2e/bar_chart.cy.js +++ /dev/null @@ -1,316 +0,0 @@ -import { barChartCypherQuery } from '../fixtures/cypher_queries'; - -const WAITING_TIME = 20000; -// Ignore warnings that may appear when using the Cypress dev server -Cypress.on('uncaught:exception', (err, runnable) => { - console.log(err, runnable); - return false; -}); - -describe('Testing bar chart', () => { - beforeEach('open neodash', () => { - cy.viewport(1920, 1080); - cy.visit('/', { - onBeforeLoad(win) { - win.localStorage.clear(); - }, - }); - - cy.get('#form-dialog-title', { timeout: 20000 }).should('contain', 'NeoDash - Neo4j Dashboard Builder').click(); - - cy.get('#form-dialog-title').then(($div) => { - const text = $div.text(); - if (text == 'NeoDash - Neo4j Dashboard Builder') { - cy.wait(500); - // Create new dashboard - cy.contains('New Dashboard').click(); - } - }); - - cy.get('#form-dialog-title', { timeout: 20000 }).should('contain', 'Connect to Neo4j'); - - cy.get('#url').clear().type('localhost'); - cy.get('#dbusername').clear().type('neo4j'); - cy.get('#dbpassword').type('test1234'); - cy.get('button').contains('Connect').click(); - cy.wait(100); - - //Opens the div containing all report cards - cy.get('.react-grid-layout:eq(0)').within(() => { - //Finds the 2nd card - cy.get('.MuiGrid-root') - .eq(1) - .within(() => { - //Clicks the 2nd button (opens settings) - cy.get('button').eq(1).click(); - }); - }); - cy.get('.react-grid-layout:eq(0)').within(() => { - //Finds the 2nd card - cy.get('.MuiGrid-root') - .eq(1) - .within(() => { - //Opens the drop down - cy.getDataTest('type-dropdown').click(); - }); - }); - // Selects the Bar option - cy.get('[id^="react-select-5-option"]') - .contains(/Bar Chart/i) - .should('be.visible') - .click({ force: true }); - cy.get('.react-grid-layout .MuiGrid-root:eq(1) #type input[name="Type"]').should('have.value', 'Bar Chart'); - - // Creates basic bar chart - cy.get('.react-grid-layout') - .first() - .within(() => { - //Finds the 2nd card - cy.get('.MuiGrid-root') - .eq(1) - .within(() => { - //Removes text in cypher editor and types new query - cy.get('.ndl-cypher-editor div[role="textbox"]') - .should('be.visible') - .click() - .clear() - .type(barChartCypherQuery); - - cy.wait(400); - cy.get('button[aria-label="run"]').click(); - }); - }); - - cy.wait(500); - }); - - it.skip('Checking Colour Picker settings', () => { - //Opens advanced settings - cy.get('.react-grid-layout') - .first() - .within(() => { - //Finds the 2nd card - cy.get('.MuiGrid-root') - .eq(1) - .within(() => { - // Access advanced settings - cy.get('button').eq(1).click(); - cy.get('[role="switch"]').click(); - cy.wait(200); - // Changing setting for colour picker - cy.get('[data-testid="colorpicker-input"]').find('input').click().type('{selectall}').type('red'); - cy.get('button[aria-label="run"]').click(); - // Checking that colour picker was applied correctly - cy.get('.card-view').should('have.css', 'background-color', 'rgb(255, 0, 0)'); - cy.wait(200); - // Changing colour back to white - cy.get('button').eq(1).click(); - cy.get('[data-testid="colorpicker-input"]').find('input').click().type('{selectall}').type('white'); - cy.get('button[aria-label="run"]').click(); - // Checking colour has been set back to white - cy.wait(200); - cy.get('.card-view').should('have.css', 'background-color', 'rgb(255, 255, 255)'); - }); - }); - }); - - it.skip('Checking Selector Description', () => { - //Opens first 2nd card - cy.get('.react-grid-layout:eq(0) .MuiGrid-root:eq(1)').within(() => { - // Access advanced settings - cy.get('button').eq(1).click(); - cy.get('[role="switch"]').click(); - cy.wait(200); - // Changing Selector Description to 'Test' - cy.get('.ndl-textarea').contains('span', 'Selector Description').click().type('Test'); - cy.get('button[aria-label="run"]').click(); - // Pressing Selector Description button - cy.get('button[aria-label="details"]').click(); - }); - // Checking that Selector Description is behaving as expected - cy.get('.MuiDialog-paper').should('be.visible').and('contain.text', 'Test'); - cy.wait(1000); - - // Click elsewhere on the page to close dialog box - cy.get('div[role="dialog"]').parent().click(-100, -100, { force: true }); - }); - - it.skip('Checking full screen bar chart setting', () => { - //Opens first 2nd card - cy.get('.react-grid-layout:eq(0) .MuiGrid-root:eq(1)').within(() => { - // Opening settings - cy.get('button').eq(1).click(); - // Activating advanced settings - cy.get('[role="switch"]').click(); - cy.wait(200); - // Finding fullscreen setting and changing it to 'on' - cy.get('.ndl-dropdown') - .contains('label', 'Fullscreen enabled') - .scrollIntoView() - .should('be.visible') - .click() - .type('on{enter}'); - // Pressing run to return to card view - cy.get('button[aria-label="run"]').click(); - cy.get('button[aria-label="maximize"]').click(); - }); - // Modal outside of scope of card - // Checking existence of full-screen modal - cy.get('.dialog-xxl').should('be.visible'); - // Action to close full-screen modal - cy.get('button[aria-label="un-maximize"]').click(); - // Checking that fullscreen has un-maximized - // Check that the div is no longer in the DOM - cy.get('div[data-focus-lock-disabled="false"]').should('not.exist'); - }); - - it.skip('Checking "Autorun Query" works as intended', () => { - // Custom command to open advanced settings - cy.advancedSettings(() => { - // Finding 'Auto-run query setting and changing it to 'off' - cy.get('.ndl-dropdown') - .contains('label', 'Auto-run query') - .scrollIntoView() - .should('be.visible') - .click() - .type('off{enter}'); - cy.wait(200); - cy.get('button[aria-label="run"]').click(); - cy.get('.ndl-cypher-editor').should('be.visible'); - cy.get('g').should('not.exist'); - cy.wait(100); - cy.get('.MuiCardContent-root').find('button[aria-label="run"]').filter(':visible').click(); - cy.get('g').should('exist'); - }); - }); - - it.skip('Checking Legend integration works as intended', () => { - cy.advancedSettings(() => { - // Checking that legend appears - cy.setDropdownValue('Show Legend', 'on'); - cy.wait(100); - cy.get('button[aria-label="run"]').click(); - cy.wait(100); - //Checking that legend matches value specified: in the case - 'count' - cy.get('svg g g text').last().contains(/count/i); - }); - cy.advancedSettings(() => { - // Activating advanced settings - cy.get('[role="switch"]').click(); - // Checking that legend disappears - cy.setDropdownValue('Show Legend', 'off'); - cy.wait(100); - cy.get('button[aria-label="run"]').click(); - cy.wait(100); - cy.get('svg g g text').last().contains(/count/i).should('not.exist'); - }); - }); - - it.skip('Checking the stacked grouping function works as intended', () => { - cy.advancedSettings(() => { - cy.get('.ndl-cypher-editor div[role="textbox"]') - .should('be.visible') - .click() - .clear() - .type( - 'MATCH (p:Person)-[:DIRECTED]->(n:Movie) RETURN n.released AS released, p.name AS Director, count(n.title) AS count LIMIT 5' - ); - cy.setDropdownValue('Grouping', 'on'); - cy.wait(100); - cy.get('button[aria-label="run"]').click(); - cy.get('.ndl-dropdown:contains("Group")').find('svg').parent().click().type('Director{enter}'); - // Checking that the groups are stacked - cy.get('.MuiCardContent-root') - .find('g') - .children('g') - .eq(3) // Get the fourth g element (index starts from 0) - .invoke('attr', 'transform') - .then((transformValue) => { - // Captures the first number in the tranlsate attribute using the parenthisis to capture the first digit and put it in the second value of the resulting array - // if transformValue is translate(100,200), then transformValue.match(/translate\((\d+),\d+\)/) will produce an array like ["translate(100,200)", "100"], - const match = transformValue.match(/translate\((\d+),\d+\)/); - if (match?.[1]) { - const xValue = match[1]; - console.log('xValue: ', xValue); - - // Now find sibling g elements with the same x transform value - cy.get('.MuiCardContent-root') - .find('g') - .children('g') - .filter((index, element) => { - const siblingTransform = Cypress.$(element).attr('transform'); - return siblingTransform?.includes(`translate(${xValue},`); - }) - .should('have.length', 3); // Check that there's at least one element - } else { - throw new Error('Transform attribute not found or invalid format'); - } - }); - }); - cy.get('.ndl-dropdown:contains("Group")').find('svg').parent().click().type('(none){enter}'); - // Checking that the stacked grouped elements do not exist - cy.get('.MuiCardContent-root') - .find('g') - .children('g') - .eq(3) // Get the fourth g element (index starts from 0) - .invoke('attr', 'transform') - .then((transformValue) => { - // Captures the first number in the tranlsate attribute using the parenthisis to capture the first digit and put it in the second value of the resulting array - // if transformValue is translate(100,200), then transformValue.match(/translate\((\d+),\d+\)/) will produce an array like ["translate(100,200)", "100"], - const match = transformValue.match(/translate\((\d+),\d+\)/); - if (match?.[1]) { - const xValue = match[1]; - console.log('xValue: ', xValue); - - // Now find sibling g elements with the same x transform value - cy.get('.MuiCardContent-root') - .find('g') - .children('g') - .filter((index, element) => { - const siblingTransform = Cypress.$(element).attr('transform'); - return siblingTransform?.includes(`translate(${xValue},`); - }) - .should('have.length', 1); // Check that there are no matching elements - } else { - throw new Error('Transform attribute not found or invalid format'); - } - }); - }); - - // How to properly test this? - it.skip('Testing grouped grouping mode', () => { - cy.advancedSettings(() => { - cy.get('.ndl-cypher-editor div[role="textbox"]') - .should('be.visible') - .click() - .clear() - .type( - 'MATCH (p:Person)-[:DIRECTED]->(n:Movie) RETURN n.released AS released, p.name AS Director, count(n.title) AS count LIMIT 5' - ); - cy.setDropdownValue('Grouping', 'on'); - cy.setDropdownValue('Group Mode', 'grouped'); - cy.wait(400); - cy.get('button[aria-label="run"]').click(); - cy.get('.ndl-dropdown:contains("Group")').find('svg').parent().click().type('Director{enter}'); - }); - }); - - it.skip('Testing "Show Value on Bars"', () => { - cy.advancedSettings(() => { - cy.setDropdownValue('Show Values On Bars', 'on'); - cy.get('button[aria-label="run"]').click(); - cy.get('.MuiCardContent-root') - .find('div svg > g > g > text') - .should('have.length', 5) - .then((textElements) => { - cy.log('Number of text elements:', textElements.length); - }); - }); - cy.wait(100); - cy.openSettings(() => { - cy.setDropdownValue('Show Values On Bars', 'off'); - cy.get('button[aria-label="run"]').click(); - cy.get('.MuiCardContent-root').find('div svg > g > g > text').should('not.exist'); - }); - }); -}); diff --git a/cypress/e2e/render/array.cy.js b/cypress/e2e/charts/array.cy.js similarity index 70% rename from cypress/e2e/render/array.cy.js rename to cypress/e2e/charts/array.cy.js index 108d4aceb..1da231f01 100644 --- a/cypress/e2e/render/array.cy.js +++ b/cypress/e2e/charts/array.cy.js @@ -1,17 +1,9 @@ import { stringArrayCypherQuery, intArrayCypherQuery, pathArrayCypherQuery } from '../../fixtures/cypher_queries'; -import { - enableReportActions, - createReportOfType, - closeSettings, - toggleTableTranspose, - openReportActionsMenu, - selectReportOfType, - openAdvancedSettings, - updateDropdownAdvancedSetting, -} from '../utils'; +import { Page } from '../../Page'; -const WAITING_TIME = 20000; const CARD_SELECTOR = 'main .react-grid-item:eq(2)'; +const page = new Page(CARD_SELECTOR); + // Ignore warnings that may appear when using the Cypress dev server Cypress.on('uncaught:exception', (err, runnable) => { console.log(err, runnable); @@ -20,62 +12,34 @@ Cypress.on('uncaught:exception', (err, runnable) => { describe('Testing array rendering', () => { beforeEach('open neodash', () => { - cy.viewport(1920, 1080); - cy.visit('/', { - onBeforeLoad(win) { - win.localStorage.clear(); - }, - }); - - cy.get('#form-dialog-title', { WAITING_TIME: WAITING_TIME }) - .should('contain', 'NeoDash - Neo4j Dashboard Builder') - .click(); - - cy.get('#form-dialog-title').then(($div) => { - const text = $div.text(); - if (text == 'NeoDash - Neo4j Dashboard Builder') { - cy.wait(500); - // Create new dashboard - cy.contains('New Dashboard').click(); - } - }); - - cy.get('#form-dialog-title', { WAITING_TIME: WAITING_TIME }).should('contain', 'Connect to Neo4j'); - - cy.get('#url').clear().type('localhost'); - cy.get('#dbusername').clear().type('neo4j'); - cy.get('#dbpassword').type('test1234'); - cy.get('button').contains('Connect').click(); + page.init().createNewDashboard().connectToNeo4j(); cy.wait(100); }); it('creates a table that contains string arrays', () => { cy.checkInitialState(); - enableReportActions(); - createReportOfType('Table', stringArrayCypherQuery, true, true); + page.enableReportActions(); + page.createReportOfType('Table', stringArrayCypherQuery, true, true); // Standard array, displays strings joined with comma and whitespace cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0)`).should('have.text', 'initial, list'); cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(1)`).should('have.text', 'other, list'); // Now, transpose the table - toggleTableTranspose(CARD_SELECTOR, true); - cy.get(`${CARD_SELECTOR} .MuiDataGrid-columnHeaderTitle:eq(1)`, { timeout: WAITING_TIME }).should( - 'have.text', - 'initial,list' - ); + page.updateDropdownAdvancedSetting('Transpose Rows & Columns', 'on'); + cy.get(`${CARD_SELECTOR} .MuiDataGrid-columnHeaderTitle:eq(1)`).should('have.text', 'initial,list'); cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(1)`).should('have.text', 'other, list'); // Transpose back // And add a report action - toggleTableTranspose(CARD_SELECTOR, false); - openReportActionsMenu(CARD_SELECTOR); + page.updateDropdownAdvancedSetting('Transpose Rows & Columns', 'off'); + page.openReportActionsMenu(); cy.get('.ndl-modal').find('button[aria-label="add"]').click(); cy.get('.ndl-modal').find('input:eq(2)').type('column'); cy.get('.ndl-modal').find('input:eq(5)').type('test_param'); cy.get('.ndl-modal').find('input:eq(6)').type('column'); cy.get('.ndl-modal').find('button').contains('Save').click(); - closeSettings(CARD_SELECTOR); + page.closeSettings(); cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0)`) .find('button') .should('be.visible') @@ -90,24 +54,21 @@ describe('Testing array rendering', () => { it('creates a table that contains int arrays', () => { cy.checkInitialState(); - createReportOfType('Table', intArrayCypherQuery, true, true); + page.createReportOfType('Table', intArrayCypherQuery, true, true); // Standard array, displays strings joined with comma and whitespace cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0)`).should('have.text', '1, 2'); cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(1)`).should('have.text', '3, 4'); // Now, transpose the table - toggleTableTranspose(CARD_SELECTOR, true); - cy.get(`${CARD_SELECTOR} .MuiDataGrid-columnHeaderTitle:eq(1)`, { timeout: WAITING_TIME }).should( - 'have.text', - '1,2' - ); + page.updateDropdownAdvancedSetting('Transpose Rows & Columns', 'on'); + cy.get(`${CARD_SELECTOR} .MuiDataGrid-columnHeaderTitle:eq(1)`).should('have.text', '1,2'); cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(1)`).should('have.text', '3, 4'); }); it('creates a table that contains nodes and rels', () => { cy.checkInitialState(); - createReportOfType('Table', pathArrayCypherQuery, true, true); + page.createReportOfType('Table', pathArrayCypherQuery, true, true); // Standard array, displays a path with two nodes and a relationship cy.get(`${CARD_SELECTOR} .MuiDataGrid-cell:eq(0)`).should('have.text', 'PersonACTED_INMovie'); @@ -120,13 +81,13 @@ describe('Testing array rendering', () => { it('creates a single value report which is an array', () => { cy.checkInitialState(); - createReportOfType('Single Value', stringArrayCypherQuery, true, true); + page.createReportOfType('Single Value', stringArrayCypherQuery, true, true); cy.get(CARD_SELECTOR).should('have.text', 'initial, list'); }); it('creates a multi parameter select', () => { cy.checkInitialState(); - selectReportOfType('Parameter Select'); + page.selectReportOfType('Parameter Select'); cy.get('main .react-grid-item:eq(2) label[for="Selection Type"]').siblings('div').click(); // Set up the parameter select cy.contains('Node Property').click(); @@ -140,8 +101,8 @@ describe('Testing array rendering', () => { cy.wait(1000); cy.get('.MuiAutocomplete-popper').contains('title').click(); // Enable multiple selection - closeSettings(CARD_SELECTOR); - updateDropdownAdvancedSetting(CARD_SELECTOR, 'Multiple Selection', 'on'); + page.closeSettings(); + page.updateDropdownAdvancedSetting('Multiple Selection', 'on'); // Finally, select a few values in the parameter select cy.get(CARD_SELECTOR).contains('Movie title').click(); cy.get(CARD_SELECTOR).contains('Movie title').siblings('div').find('input').type('a'); diff --git a/cypress/e2e/charts/bar.cy.js b/cypress/e2e/charts/bar.cy.js new file mode 100644 index 000000000..80f13d640 --- /dev/null +++ b/cypress/e2e/charts/bar.cy.js @@ -0,0 +1,211 @@ +import { barChartCypherQuery } from '../../fixtures/cypher_queries'; +import { Page } from '../../Page'; + +const CARD_SELECTOR = '.react-grid-layout:eq(0) .MuiGrid-root:eq(2)'; +const page = new Page(CARD_SELECTOR); + +// Ignore warnings that may appear when using the Cypress dev server +Cypress.on('uncaught:exception', (err, runnable) => { + console.log(err, runnable); + return false; +}); + +describe('Testing bar chart', () => { + beforeEach('open neodash', () => { + page.init().createNewDashboard().connectToNeo4j().createReportOfType('Bar Chart', barChartCypherQuery); + }); + + it('Checking Colour Picker settings', () => { + //Opens advanced settings + cy.get('.react-grid-layout') + .first() + .within(() => { + //Finds the 2nd card + cy.get('.MuiGrid-root:eq(2)').within(() => { + // Access advanced settings + cy.get('button').eq(1).click(); + cy.get('[role="switch"]').click(); + cy.wait(200); + // Changing setting for colour picker + cy.get('[data-testid="colorpicker-input"]').find('input').click().type('{selectall}').type('red'); + cy.get('button[aria-label="run"]').click(); + // Checking that colour picker was applied correctly + cy.get('.card-view').should('have.css', 'background-color', 'rgb(255, 0, 0)'); + cy.wait(200); + // Changing colour back to white + cy.get('button').eq(1).click(); + cy.get('[data-testid="colorpicker-input"]').find('input').click().type('{selectall}').type('white'); + cy.get('button[aria-label="run"]').click(); + // Checking colour has been set back to white + cy.wait(200); + cy.get('.card-view').should('have.css', 'background-color', 'rgb(255, 255, 255)'); + }); + }); + }); + + it('Checking Selector Description', () => { + //Opens first 2nd card + cy.get('.react-grid-layout:eq(0) .MuiGrid-root:eq(2)').within(() => { + // Access advanced settings + cy.get('button').eq(1).click(); + cy.get('[role="switch"]').click(); + cy.wait(200); + // Changing Selector Description to 'Test' + cy.get('.ndl-textarea').contains('span', 'Selector Description').click().type('Test'); + cy.get('button[aria-label="run"]').click(); + // Pressing Selector Description button + cy.get('button[aria-label="details"]').click(); + }); + // Checking that Selector Description is behaving as expected + cy.get('.MuiDialog-paper').should('be.visible').and('contain.text', 'Test'); + cy.wait(1000); + + // Click elsewhere on the page to close dialog box + cy.get('div[role="dialog"]').parent().click(-100, -100, { force: true }); + }); + + it('Checking full screen bar chart setting', () => { + page.updateDropdownAdvancedSetting('Fullscreen enabled', 'on'); + cy.get('button[aria-label="maximize"]').click(); + // Checking existence of full-screen modal + cy.get('.dialog-xxl').should('be.visible'); + // Action to close full-screen modal + cy.get('button[aria-label="un-maximize"]').click(); + // Checking that fullscreen has un-maximized + // Check that the div is no longer in the DOM + cy.get('div[data-focus-lock-disabled="false"]').should('not.exist'); + }); + + it('Checking "Autorun Query" works as intended', () => { + page.updateDropdownAdvancedSetting('Auto-run query', 'off'); + cy.get('.MuiCardContent-root').find('.ndl-cypher-editor').should('be.visible'); + cy.get('.MuiCardContent-root').find('g').should('not.exist'); + cy.wait(100); + cy.get('.MuiCardContent-root').find('button[aria-label="run"]').filter(':visible').click(); + cy.get('g').should('exist'); + }); + + it('Checking Legend integration works as intended', () => { + page.updateDropdownAdvancedSetting('Show Legend', 'on'); + // Checking that legend matches value specified: in the case - 'count' + cy.get('svg g g text').last().contains(/count/i); + + page.updateDropdownAdvancedSetting('Show Legend', 'off'); + cy.get('svg g g text').last().contains(/count/i).should('not.exist'); + }); + + it('Checking the stacked grouping function works as intended', () => { + const TRANSLATE_REGEXP = /translate\(([0-9]{1,3}), [0-9]{1,3}\)/; + + page + .updateChartQuery( + 'MATCH (p:Person)-[:DIRECTED]->(n:Movie) RETURN n.released AS released, p.name AS Director, count(n.title) AS count LIMIT 5' + ) + .updateDropdownAdvancedSetting('Grouping', 'on'); + + cy.get('.MuiGrid-root:eq(2)') + .find('.ndl-dropdown:contains("Group")') + .find('svg') + .parent() + .click() + .type('Director{enter}'); + // Checking that the groups are stacked + cy.get('.MuiGrid-root:eq(2)') + .find('g') + .children('g') + .eq(3) // Get the fourth g element (index starts from 0) + .invoke('attr', 'transform') + .then((transformValue) => { + // Captures the first number in the translate attribute using the parenthesis to capture the first digit and put it in the second value of the resulting array + // if transformValue is translate(100,200), then it will produce an array like ["translate(100,200)", "100"], + const match = transformValue.match(TRANSLATE_REGEXP); + if (match?.[1]) { + const xValue = match[1]; + // Now find sibling g elements with the same x transform value + cy.get('.MuiCardContent-root') + .find('g') + .children('g') + .filter((_, element) => { + const siblingTransform = Cypress.$(element).attr('transform'); + return siblingTransform?.includes(`translate(${xValue},`); + }) + .should('have.length', 3); // Check that there's at least one element + } else { + throw new Error('Transform attribute not found or invalid format'); + } + }); + cy.get('.ndl-dropdown:contains("Group")').find('svg').parent().click().type('(none){enter}'); + //Checking that the stacked grouped elements do not exist + cy.get('.MuiCardContent-root') + .find('g') + .children('g') + .eq(3) // Get the fourth g element (index starts from 0) + .invoke('attr', 'transform') + .then((transformValue) => { + // Captures the first number in the translate attribute using the parenthesis to capture the first digit and put it in the second value of the resulting array + // if transformValue is translate(100,200), then it will produce an array like ["translate(100,200)", "100"], + const match = transformValue.match(TRANSLATE_REGEXP); + if (match?.[1]) { + const xValue = match[1]; + // Now find sibling g elements with the same x transform value + cy.get('.MuiCardContent-root') + .find('g') + .children('g') + .filter((_, element) => { + const siblingTransform = Cypress.$(element).attr('transform'); + return siblingTransform?.includes(`translate(${xValue},`); + }) + .should('have.length', 1); // Check that there are no matching elements + } else { + throw new Error('Transform attribute not found or invalid format'); + } + }); + }); + + // How to properly test this? + it.skip('Testing grouped grouping mode', () => { + page + .updateChartQuery( + 'MATCH (p:Person)-[:DIRECTED]->(n:Movie) RETURN n.released AS released, p.name AS Director, count(n.title) AS count LIMIT 5' + ) + .updateDropdownAdvancedSetting('Grouping', 'on') + .updateDropdownAdvancedSetting('Group Mode', 'grouped'); + cy.get('.ndl-dropdown:contains("Group")').find('svg').parent().click().type('Director{enter}'); + }); + + it('Testing "Show Value on Bars"', () => { + page.updateDropdownAdvancedSetting('Show Values On Bars', 'on'); + cy.get('.react-grid-layout:eq(0) .MuiGrid-root:eq(2)').find('div svg > g > g > text').should('have.length', 5); + + page.updateDropdownAdvancedSetting('Show Values On Bars', 'off'); + cy.get('.react-grid-layout:eq(0) .MuiGrid-root:eq(2)').find('div svg > g > g > text').should('not.exist'); + }); + + describe('Y axis display', () => { + it('Checking Y axis is displayed', () => { + page.updateDropdownAdvancedSetting('Display Y axis', 'on'); + cy.get('.MuiCardContent-root svg > g > g:nth-child(3)') + .invoke('attr', 'transform') + .should('eq', 'translate(0,0)'); + }); + + it('Checking Y axis is hidden', () => { + page.updateDropdownAdvancedSetting('Display Y axis', 'off'); + cy.get('.MuiCardContent-root svg > g > g:nth-child(3)') + .invoke('attr', 'transform') + .should('not.eq', 'translate(0,0)'); + }); + }); + + describe('Y grid lines display', () => { + it('Checking Y grid lines are displayed', () => { + page.updateDropdownAdvancedSetting('Display Y grid lines', 'on'); + cy.get('.MuiCardContent-root svg g > g > line').invoke('attr', 'stroke').should('eq', '#dddddd'); + }); + + it('Checking Y grid lines are hidden', () => { + page.updateDropdownAdvancedSetting('Display Y grid lines', 'off'); + cy.get('.MuiCardContent-root svg g > g > line').invoke('attr', 'stroke').should('not.eq', '#dddddd'); + }); + }); +}); diff --git a/cypress/e2e/table.cy.js b/cypress/e2e/charts/table.cy.js similarity index 66% rename from cypress/e2e/table.cy.js rename to cypress/e2e/charts/table.cy.js index 8ae2ac3c8..5c086df1b 100644 --- a/cypress/e2e/table.cy.js +++ b/cypress/e2e/charts/table.cy.js @@ -1,6 +1,7 @@ -import { tableCypherQuery } from '../fixtures/cypher_queries'; +import { tableCypherQuery } from '../../fixtures/cypher_queries'; +import { Page } from '../../Page'; -const WAITING_TIME = 20000; +const page = new Page(); // Ignore warnings that may appear when using the Cypress dev server Cypress.on('uncaught:exception', (err, runnable) => { console.log(err, runnable); @@ -9,30 +10,7 @@ Cypress.on('uncaught:exception', (err, runnable) => { describe('Testing table', () => { beforeEach('open neodash', () => { - cy.viewport(1920, 1080); - cy.visit('/', { - onBeforeLoad(win) { - win.localStorage.clear(); - }, - }); - - cy.get('#form-dialog-title', { timeout: 20000 }).should('contain', 'NeoDash - Neo4j Dashboard Builder').click(); - - cy.get('#form-dialog-title').then(($div) => { - const text = $div.text(); - if (text == 'NeoDash - Neo4j Dashboard Builder') { - cy.wait(500); - // Create new dashboard - cy.contains('New Dashboard').click(); - } - }); - - cy.get('#form-dialog-title', { timeout: 20000 }).should('contain', 'Connect to Neo4j'); - - cy.get('#url').clear().type('localhost'); - cy.get('#dbusername').clear().type('neo4j'); - cy.get('#dbpassword').type('test1234'); - cy.get('button').contains('Connect').click(); + page.init().createNewDashboard().connectToNeo4j(); cy.wait(100); }); diff --git a/cypress/e2e/start_page.cy.js b/cypress/e2e/start_page.cy.js index c6e9f7c4b..8038866b3 100644 --- a/cypress/e2e/start_page.cy.js +++ b/cypress/e2e/start_page.cy.js @@ -10,9 +10,12 @@ import { gaugeChartCypherQuery, formCypherQuery, } from '../fixtures/cypher_queries'; -import { createReportOfType, selectReportOfType, enableAdvancedVisualizations, enableFormsExtension } from './utils'; -const WAITING_TIME = 20000; +import { Page } from '../Page'; + +const CARD_SELECTOR = 'main .react-grid-item:eq(2)'; +const page = new Page(CARD_SELECTOR); + // Ignore warnings that may appear when using the Cypress dev server Cypress.on('uncaught:exception', (err, runnable) => { console.log(err, runnable); @@ -21,40 +24,7 @@ Cypress.on('uncaught:exception', (err, runnable) => { describe('NeoDash E2E Tests', () => { beforeEach(() => { - cy.viewport(1920, 1080); - // Navigate to index - cy.visit('/', { - onBeforeLoad(win) { - win.localStorage.clear(); - }, - }); - - cy.get('#form-dialog-title', { timeout: 20000 }).should('contain', 'NeoDash - Neo4j Dashboard Builder').click(); - - cy.get('#form-dialog-title').then(($div) => { - const text = $div.text(); - if (text == 'NeoDash - Neo4j Dashboard Builder') { - cy.wait(500); - // Create new dashboard - cy.contains('New Dashboard').click(); - } - }); - - // If an old dashboard exists in cache, do a check to make sure we clear it. - // if (cy.contains("Create new dashboard")) { - // cy.contains('Yes').click() - // } - - cy.get('#form-dialog-title', { timeout: 20000 }).should('contain', 'Connect to Neo4j'); - - // Connect to Neo4j database - // cy.get('#protocol').click() - // cy.contains('neo4j').click() - cy.get('#url').clear().type('localhost'); - // cy.get('#database').type('neo4j') - cy.get('#dbusername').clear().type('neo4j'); - cy.get('#dbpassword').type('test1234'); - cy.get('button').contains('Connect').click(); + page.init().createNewDashboard().connectToNeo4j(); cy.wait(100); }); @@ -85,7 +55,7 @@ describe('NeoDash E2E Tests', () => { cy.get('main .react-grid-item:eq(2)').contains('Advanced settings').click(); cy.get('main .react-grid-item:eq(2) button[aria-label="run"]').click(); - cy.get('main .react-grid-item:eq(2) .MuiDataGrid-columnHeaders', { timeout: WAITING_TIME }) + cy.get('main .react-grid-item:eq(2) .MuiDataGrid-columnHeaders') .should('contain', 'title') .and('contain', 'released') .and('not.contain', '__id'); @@ -98,34 +68,25 @@ describe('NeoDash E2E Tests', () => { it('creates a bar chart report', () => { cy.checkInitialState(); - createReportOfType('Bar Chart', barChartCypherQuery); - cy.get('main .react-grid-item:eq(2) #index input[name="Category"]', { timeout: WAITING_TIME }).should( - 'have.value', - 'released' - ); + page.createReportOfType('Bar Chart', barChartCypherQuery); + cy.get('main .react-grid-item:eq(2) #index input[name="Category"]').should('have.value', 'released'); cy.get('main .react-grid-item:eq(2) #value input[name="Value"]').should('have.value', 'count'); cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g').should('have.length', 8); }); it('creates a pie chart report', () => { cy.checkInitialState(); - createReportOfType('Pie Chart', barChartCypherQuery); - cy.get('main .react-grid-item:eq(2) #index input[name="Category"]', { timeout: WAITING_TIME }).should( - 'have.value', - 'released' - ); + page.createReportOfType('Pie Chart', barChartCypherQuery); + cy.get('main .react-grid-item:eq(2) #index input[name="Category"]').should('have.value', 'released'); cy.get('main .react-grid-item:eq(2) #value input[name="Value"]').should('have.value', 'count'); cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g').should('have.length', 3); - cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g:nth-child(2) > path').should('have.length', 5); + cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g > path').should('have.length', 5); }); it('creates a line chart report', () => { cy.checkInitialState(); - createReportOfType('Line Chart', barChartCypherQuery); - cy.get('main .react-grid-item:eq(2) #x input[name="X-value"]', { timeout: WAITING_TIME }).should( - 'have.value', - 'released' - ); + page.createReportOfType('Line Chart', barChartCypherQuery); + cy.get('main .react-grid-item:eq(2) #x input[name="X-value"]').should('have.value', 'released'); cy.get('main .react-grid-item:eq(2) #value input[name="Y-value"]').should('have.value', 'count'); cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g').should('have.length', 6); cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g:nth-child(2) > line').should( @@ -136,19 +97,14 @@ describe('NeoDash E2E Tests', () => { it('creates a map chart report', () => { cy.checkInitialState(); - createReportOfType('Map', mapChartCypherQuery, true); - cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > path', { timeout: WAITING_TIME }).should( - 'have.length', - 5 - ); + page.createReportOfType('Map', mapChartCypherQuery, true); + cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > path').should('have.length', 5); }); it('creates a single value report', () => { cy.checkInitialState(); - createReportOfType('Single Value', barChartCypherQuery); - cy.get('main .react-grid-item:eq(2) .MuiCardContent-root > div > div:nth-child(2) > span', { - timeout: WAITING_TIME, - }) + page.createReportOfType('Single Value', barChartCypherQuery); + cy.get('main .react-grid-item:eq(2) .MuiCardContent-root > div > div:nth-child(2) > span') .invoke('text') .then((text) => { expect(text).to.be.oneOf(['1999', '1,999', '1 999']); @@ -156,62 +112,49 @@ describe('NeoDash E2E Tests', () => { }); it.skip('creates a gauge chart report', () => { - enableAdvancedVisualizations(); + page.enableAdvancedVisualizations(); cy.checkInitialState(); - createReportOfType('Gauge Chart', gaugeChartCypherQuery); - cy.get('.text-group > text', { timeout: WAITING_TIME }).contains('69'); + page.createReportOfType('Gauge Chart', gaugeChartCypherQuery); + cy.get('.text-group > text').contains('69'); }); it('creates a sunburst chart report', () => { - enableAdvancedVisualizations(); + page.enableAdvancedVisualizations(); cy.checkInitialState(); - createReportOfType('Sunburst Chart', sunburstChartCypherQuery); - cy.get('main .react-grid-item:eq(2) #index input[name="Path"]', { timeout: WAITING_TIME }).should( - 'have.value', - 'x.path' - ); + page.createReportOfType('Sunburst Chart', sunburstChartCypherQuery); + cy.get('main .react-grid-item:eq(2) #index input[name="Path"]').should('have.value', 'x.path'); cy.get('main .react-grid-item:eq(2) #value input[name="Value"]').should('have.value', 'x.value'); cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g:nth-child(1) > path').should('have.length', 5); }); it('creates a circle packing report', () => { - enableAdvancedVisualizations(); + page.enableAdvancedVisualizations(); cy.checkInitialState(); - createReportOfType('Circle Packing', sunburstChartCypherQuery); - cy.get('main .react-grid-item:eq(2) #index input[name="Path"]', { timeout: WAITING_TIME }).should( - 'have.value', - 'x.path' - ); + page.createReportOfType('Circle Packing', sunburstChartCypherQuery); + cy.get('main .react-grid-item:eq(2) #index input[name="Path"]').should('have.value', 'x.path'); cy.get('main .react-grid-item:eq(2) #value input[name="Value"]').should('have.value', 'x.value'); cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > circle').should('have.length', 6); }); it('creates a tree map report', () => { - enableAdvancedVisualizations(); + page.enableAdvancedVisualizations(); cy.checkInitialState(); - createReportOfType('Treemap', sunburstChartCypherQuery); - cy.get('main .react-grid-item:eq(2) #index input[name="Path"]', { timeout: WAITING_TIME }).should( - 'have.value', - 'x.path' - ); + page.createReportOfType('Treemap', sunburstChartCypherQuery); + cy.get('main .react-grid-item:eq(2) #index input[name="Path"]').should('have.value', 'x.path'); cy.get('main .react-grid-item:eq(2) #value input[name="Value"]').should('have.value', 'x.value'); cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > g').should('have.length', 6); }); it('creates a sankey chart report', () => { - enableAdvancedVisualizations(); + page.enableAdvancedVisualizations(); cy.checkInitialState(); - createReportOfType('Sankey Chart', sankeyChartCypherQuery, true); - cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > path', { timeout: WAITING_TIME }).should( - 'have.attr', - 'fill-opacity', - 0.5 - ); + page.createReportOfType('Sankey Chart', sankeyChartCypherQuery, true); + cy.get('main .react-grid-item:eq(2) .MuiCardContent-root svg > g > path').should('have.attr', 'fill-opacity', 0.5); }); it('creates a raw json report', () => { cy.checkInitialState(); - createReportOfType('Raw JSON', barChartCypherQuery); + page.createReportOfType('Raw JSON', barChartCypherQuery); cy.get('main .react-grid-item:eq(2) .MuiCardContent-root textarea:nth-child(1)', { timeout: 45000 }).should( ($div) => { const text = $div.text(); @@ -222,7 +165,7 @@ describe('NeoDash E2E Tests', () => { it('creates a parameter select report', () => { cy.checkInitialState(); - selectReportOfType('Parameter Select'); + page.selectReportOfType('Parameter Select'); cy.wait(500); cy.get('#autocomplete-label-type').type('Movie'); cy.get('#autocomplete-label-type-option-0').click(); @@ -236,20 +179,20 @@ describe('NeoDash E2E Tests', () => { it('creates an iframe report', () => { cy.checkInitialState(); - createReportOfType('iFrame', iFrameText); + page.createReportOfType('iFrame', iFrameText); cy.get('main .react-grid-item:eq(2) .MuiCardContent-root iframe', { timeout: 45000 }).should('be.visible'); }); it('creates a markdown report', () => { cy.checkInitialState(); - createReportOfType('Markdown', markdownText); + page.createReportOfType('Markdown', markdownText); cy.get('main .react-grid-item:eq(2) .MuiCardContent-root h1', { timeout: 45000 }).should('have.text', 'Hello'); }); it.skip('creates a form report', () => { - enableFormsExtension(); + page.enableFormsExtension(); cy.checkInitialState(); - createReportOfType('Form', formCypherQuery, true, false); + page.createReportOfType('Form', formCypherQuery, true, false); cy.get('main .react-grid-item:eq(2) .form-add-parameter').click(); cy.wait(200); cy.get('#autocomplete-label-type').type('Movie'); @@ -262,8 +205,10 @@ describe('NeoDash E2E Tests', () => { cy.get('main .react-grid-item:eq(2) button[aria-label="run"]').scrollIntoView().should('be.visible').click(); cy.wait(500); + cy.get('#form-submit').should('be.disabled'); cy.get('#autocomplete').type('The Matrix'); cy.get('#autocomplete-option-0').click(); + cy.get('#form-submit').should('not.be.disabled'); cy.get('#form-submit').click(); cy.wait(500); cy.get('.form-submitted-message').should('have.text', 'Form Submitted.Reset Form'); @@ -273,7 +218,7 @@ describe('NeoDash E2E Tests', () => { // TODO - this test is flaky, especially in GitHub actions environment. it.skip('test load dashboard from file and stress test report customizations', () => { try { - var NUMBER_OF_PAGES_IN_STRESS_TEST_DASHBOARD = 5; + const NUMBER_OF_PAGES_IN_STRESS_TEST_DASHBOARD = 5; const file = cy.request(loadDashboardURL).should((response) => { cy.get('#root .MuiDrawer-root .MuiIconButton-root:eq(2)').click(); cy.get('.MuiDialog-root .MuiPaper-root .MuiDialogContent-root textarea:eq(0)') diff --git a/cypress/e2e/utils.js b/cypress/e2e/utils.js deleted file mode 100644 index ae5639cf9..000000000 --- a/cypress/e2e/utils.js +++ /dev/null @@ -1,84 +0,0 @@ -export function enableReportActions() { - cy.get('main button[aria-label="Extensions').should('be.visible').click(); - cy.get('#checkbox-actions').scrollIntoView(); - cy.get('#checkbox-actions').should('be.visible').click(); - cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click(); - cy.wait(200); -} - -export function enableAdvancedVisualizations() { - cy.get('main button[aria-label="Extensions').should('be.visible').click(); - cy.get('#checkbox-advanced-charts').should('be.visible').click(); - cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click(); - cy.wait(200); -} - -export function enableFormsExtension() { - cy.get('main button[aria-label="Extensions').should('be.visible').click(); - cy.get('#checkbox-forms').scrollIntoView(); - cy.get('#checkbox-forms').should('be.visible').click(); - cy.get('.ndl-dialog-close').scrollIntoView().should('be.visible').click(); - cy.wait(200); -} - -export function selectReportOfType(type) { - cy.get('main .react-grid-item button[aria-label="add report"]').should('be.visible').click(); - cy.get('main .react-grid-item') - .contains('No query specified.') - .parentsUntil('.react-grid-item') - .find('button[aria-label="settings"]', { timeout: 2000 }) - .should('be.visible') - .click(); - cy.get('main .react-grid-item:eq(2) #type', { timeout: 2000 }).should('be.visible').click(); - cy.contains(type).click(); - cy.wait(100); -} - -export function createReportOfType(type, query, fast = false, run = true) { - selectReportOfType(type); - if (fast) { - cy.get('main .react-grid-item:eq(2) .ReactCodeMirror').type(query, { delay: 1, parseSpecialCharSequences: false }); - } else { - cy.get('main .react-grid-item:eq(2) .ReactCodeMirror').type(query, { parseSpecialCharSequences: false }); - } - cy.wait(400); - - if (run) { - closeSettings('main .react-grid-item:eq(2)'); - } -} - -export function openSettings(cardSelector) { - cy.get(cardSelector).find('button[aria-label="settings"]', { WAITING_TIME: 2000 }).click(); -} - -export function closeSettings(cardSelector) { - cy.get(`${cardSelector} button[aria-label="run"]`).click(); -} - -export function openAdvancedSettings(cardSelector) { - openSettings(cardSelector); - cy.get(cardSelector).contains('Advanced settings').click(); -} - -export function closeAdvancedSettings(cardSelector) { - cy.get(cardSelector).contains('Advanced settings').click(); - closeSettings(cardSelector); -} - -export function openReportActionsMenu(cardSelector) { - openSettings(cardSelector); - cy.get(cardSelector).find('button[aria-label="custom actions"]').click(); -} - -export function updateDropdownAdvancedSetting(cardSelector, settingLabel, targetValue) { - openAdvancedSettings(cardSelector); - cy.get(`${cardSelector} .ndl-dropdown`).contains(settingLabel).siblings('div').click(); - cy.contains(targetValue).click(); - closeAdvancedSettings(cardSelector); -} - -export function toggleTableTranspose(cardSelector, enable) { - let transpose = enable ? 'on' : 'off'; - updateDropdownAdvancedSetting(cardSelector, 'Transpose Rows & Columns', transpose); -} diff --git a/cypress/support/index.js b/cypress/index.js similarity index 95% rename from cypress/support/index.js rename to cypress/index.js index 37a498fb5..cbfe0a766 100644 --- a/cypress/support/index.js +++ b/cypress/index.js @@ -14,7 +14,7 @@ // *********************************************************** // Import commands.js using ES2015 syntax: -import './commands'; +import './support/commands'; // Alternatively you can use CommonJS syntax: // require('./commands') diff --git a/cypress/support/commands.js b/cypress/support/commands.js index e486473bc..c7e9831e0 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -24,61 +24,29 @@ // -- This will overwrite an existing command -- // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) Cypress.Commands.add('getDataTest', (dataTestSelector) => { - return cy.get(`[data-test="${dataTestSelector}"]`); - }); - - /** - * Function to interact with a specific element and execute additional custom commands. - * @param {Function} customAction - A callback function containing custom Cypress commands. - */ - - // Used to open the 2nd report card and activate 'advanced settings' - Cypress.Commands.add('advancedSettings', (customAction) => { - cy.get('.react-grid-layout:eq(0) .MuiGrid-root:eq(1)').within(() => { - // Opening settings - cy.get('button').eq(1).click(); - // Activating advanced settings - cy.get('[role="switch"]').click(); - cy.wait(200); - customAction(); - }); - }); - - // Used to open 2nd the report card - Cypress.Commands.add('openSettings', (customAction) => { - cy.get('.react-grid-layout:eq(0) .MuiGrid-root:eq(1)').within(() => { - // Opening settings - cy.get('button').eq(1).click(); - cy.wait(200); - customAction(); - }); - }); - - // Needs to be used when already inside scole of a report card - Cypress.Commands.add('setDropdownValue', (labelName, setting) => { - cy.get('.ndl-dropdown') - .contains('label', labelName) - .scrollIntoView() - .should('be.visible') - .click() - .type(`${setting}{enter}`); - }); - - //Used in start_page.cy.js - Cypress.Commands.add('checkInitialState', () => { - // Check the starter cards - cy.get('main .react-grid-item:eq(0)').should('contain', 'This is your first dashboard!'); - cy.get('main .react-grid-item:eq(1) .force-graph-container canvas').should('be.visible'); - cy.get('main .react-grid-item:eq(2) button').should('have.attr', 'aria-label', 'add report'); - }); - - // Creates a card - const WAITING_TIME = 20000; - Cypress.Commands.add('createCard', () => { - // Check the starter cards - cy.get('main .react-grid-item button[aria-label="add report"]', { timeout: WAITING_TIME }) - .should('be.visible') - .click(); - cy.wait(1000); - cy.get('main .react-grid-item:eq(2)').should('contain', 'No query specified.'); - }); \ No newline at end of file + return cy.get(`[data-test="${dataTestSelector}"]`); +}); + +/** + * Function to interact with a specific element and execute additional custom commands. + * @param {Function} customAction - A callback function containing custom Cypress commands. + */ + +//Used in start_page.cy.js +Cypress.Commands.add('checkInitialState', () => { + // Check the starter cards + cy.get('main .react-grid-item:eq(0)').should('contain', 'This is your first dashboard!'); + cy.get('main .react-grid-item:eq(1) .force-graph-container canvas').should('be.visible'); + cy.get('main .react-grid-item:eq(2) button').should('have.attr', 'aria-label', 'add report'); +}); + +// Creates a card +const WAITING_TIME = 20000; +Cypress.Commands.add('createCard', () => { + // Check the starter cards + cy.get('main .react-grid-item button[aria-label="add report"]', { timeout: WAITING_TIME }) + .should('be.visible') + .click(); + cy.wait(1000); + cy.get('main .react-grid-item:eq(2)').should('contain', 'No query specified.'); +}); diff --git a/docs/modules/ROOT/pages/banner.adoc b/docs/modules/ROOT/pages/banner.adoc new file mode 100644 index 000000000..fdb12c826 --- /dev/null +++ b/docs/modules/ROOT/pages/banner.adoc @@ -0,0 +1,6 @@ +[NOTE] +==== +This documentation pertains to the unsupported version of NeoDash, as part of Neo4j Labs. +For users of the supported NeoDash offering, refer to https://neo4j.com/docs/neodash-commercial/[NeoDash commercial]. + +==== \ No newline at end of file diff --git a/docs/modules/ROOT/pages/developer-guide/adding-visualizations.adoc b/docs/modules/ROOT/pages/developer-guide/adding-visualizations.adoc index dc47ee4ab..4d9fd76eb 100644 --- a/docs/modules/ROOT/pages/developer-guide/adding-visualizations.adoc +++ b/docs/modules/ROOT/pages/developer-guide/adding-visualizations.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Adding Visualizations You can extend NeoDash with your own visualizations without diving deep diff --git a/docs/modules/ROOT/pages/developer-guide/build-and-run.adoc b/docs/modules/ROOT/pages/developer-guide/build-and-run.adoc index 45cbc2641..f52b88fb5 100644 --- a/docs/modules/ROOT/pages/developer-guide/build-and-run.adoc +++ b/docs/modules/ROOT/pages/developer-guide/build-and-run.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Build & Run To start developing the application, you will need to set up the @@ -76,7 +78,9 @@ docker run -it –rm -p 5005:5005 neodash == Run on Kubernetes -An example of a pod definition YAML file to create a NeoDash pod in a cluster: +=== To deploy using YAML files + +YAML examples are available in the https://github.com/neo4j-labs/neodash[NeoDash repository]. Here is an example of a pod definition YAML file to create a NeoDash pod in a cluster: .... apiVersion: v1 @@ -108,3 +112,118 @@ spec: selector: project: neodash .... + +=== To deploy using a Helm Charts + +A Kubernetes Helm chart is available in the https://github.com/neo4j-labs/neodash[the NeoDash repository] and here is the full example of the Helm chart values.yaml file, + +.... +# Name override or full name override +nameOverride: '' +fullnameOverride: neodash-test + +# Number of pods +replicaCount: 1 + +# Image Details +image: + repository: neo4jlabs/neodash + pullPolicy: IfNotPresent + tag: 'latest' +imagePullSecrets: [] # Image pull secret if any + +# Pod annotations, labels and security context +podAnnotations: {} +podLabels: {} +podSecurityContext: {} + +# Mode configuration using environment variables +# Set reader mode environment variables when enable_reader_mode is true +enable_reader_mode: true +env: + - name: "ssoEnabled" + value: "false" + - name: "standalone" + value: "true" + - name: "standaloneProtocol" + value: "neo4j+s" + - name: "standaloneHost" + value: "localhost" + - name: "standalonePort" + value: "7687" + - name: "standaloneDatabase" + value: neo4j + - name: "standaloneDashboardName" + value: "test" + - name: "standaloneDashboardDatabase" + value: neo4j + - name: "standaloneAllowLoad" + value: "false" + - name: "standaloneLoadFromOtherDatabases" + value: "false" + - name: "standaloneMultiDatabase" + value: "false" + +# Environment variable from secret +envFromSecrets: [] + # standaloneUsername: + # secretName: "neo4j-connection-secrets" + # key: "username" + # standalonePassword: + # secretName: "neo4j-connection-secrets" + # key: "password" + +# Service details +service: + type: LoadBalancer # Can also be ClusterIP or NodePort + port: 5005 # For the service to listen in for Traffic + targetPort: 5005 # Target port is the container port + annotations: {} # Service annotations for the LoadBalance + +# Ingress +ingress: + enabled: false # Enable Kubernetes Ingress + className: 'alb' # Class Name + annotations: {} # Cloud LoadBalancer annotations + hosts: [] + # - host: neodash.example.com + # paths: + # - path: '/' + # pathType: Prefix + tls: [] + +# Pod resources request, limits and health check +resources: + requests: + memory: "64Mi" + cpu: "250m" + limits: + memory: "128Mi" + cpu: "500m" +livenessProbe: + httpGet: + path: /* + port: 5005 +readinessProbe: + httpGet: + path: /* + port: 5005 + +# Pod Autoscaler +autoscaling: + enabled: false + # minReplicas: 1 + # maxReplicas: 100 + # targetCPUUtilizationPercentage: 80 + +# Pod Volumes +volumes: [] +volumeMounts: [] + +# Service Account +serviceAccount: + create: true + automount: true + # annotations: {} + # name: '' +.... \ No newline at end of file diff --git a/docs/modules/ROOT/pages/developer-guide/component-overview.adoc b/docs/modules/ROOT/pages/developer-guide/component-overview.adoc index e02da7989..27d78236d 100644 --- a/docs/modules/ROOT/pages/developer-guide/component-overview.adoc +++ b/docs/modules/ROOT/pages/developer-guide/component-overview.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Component Overview diff --git a/docs/modules/ROOT/pages/developer-guide/configuration.adoc b/docs/modules/ROOT/pages/developer-guide/configuration.adoc index 604ed1298..cca62fdbd 100644 --- a/docs/modules/ROOT/pages/developer-guide/configuration.adoc +++ b/docs/modules/ROOT/pages/developer-guide/configuration.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Configuration When using a custom NeoDash deployment, there are several settings that @@ -133,7 +135,7 @@ must be granted to enble any user to create logs. ⚠️ * Load/Save from/to file are not logged (only from/to Database) -|loggingDatabase |string |neo4j |When loggingMode is set to anything +|loggingDatabase |string |logs |When loggingMode is set to anything else than '0', the database to use for logging. Log records (nodes) will be created in this database. diff --git a/docs/modules/ROOT/pages/developer-guide/contributing.adoc b/docs/modules/ROOT/pages/developer-guide/contributing.adoc index 1cb695dde..90c198ff9 100644 --- a/docs/modules/ROOT/pages/developer-guide/contributing.adoc +++ b/docs/modules/ROOT/pages/developer-guide/contributing.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Contributing Contributions to the project are highly welcomed. Please consider diff --git a/docs/modules/ROOT/pages/developer-guide/deploy-a-build.adoc b/docs/modules/ROOT/pages/developer-guide/deploy-a-build.adoc index a5f2fd529..5646b89ad 100644 --- a/docs/modules/ROOT/pages/developer-guide/deploy-a-build.adoc +++ b/docs/modules/ROOT/pages/developer-guide/deploy-a-build.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Deploy a Build If you have a pre-built NeoDash application, you can easily deploy it on an any webserver. A NeoDash build is "just" a collection of HTML, CSS and JavaScript files, so it can run virtually anywhere. @@ -37,7 +39,7 @@ Depending on the webserver type and version, this could be different directory. As an example - to copy the files to an nginx webserver using `scp`: ```bash -scp neodash-2.4.8 username@host:/usr/share/nginx/html +scp neodash-2.4.9-labs username@host:/usr/share/nginx/html ``` NeoDash should now be visible by visiting your (sub)domain in the browser. diff --git a/docs/modules/ROOT/pages/developer-guide/design.adoc b/docs/modules/ROOT/pages/developer-guide/design.adoc index 5f498bb2d..3c7bd32eb 100644 --- a/docs/modules/ROOT/pages/developer-guide/design.adoc +++ b/docs/modules/ROOT/pages/developer-guide/design.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Design This page contains some key guidelines for design of the application. diff --git a/docs/modules/ROOT/pages/developer-guide/index.adoc b/docs/modules/ROOT/pages/developer-guide/index.adoc index f4538d764..b9424ebb0 100644 --- a/docs/modules/ROOT/pages/developer-guide/index.adoc +++ b/docs/modules/ROOT/pages/developer-guide/index.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Developer Guide This guide contains information for developers looking to deploy NeoDash, or extend it for their own needs. diff --git a/docs/modules/ROOT/pages/developer-guide/session-storage.adoc b/docs/modules/ROOT/pages/developer-guide/session-storage.adoc index a4861a4cf..7a668e4a7 100644 --- a/docs/modules/ROOT/pages/developer-guide/session-storage.adoc +++ b/docs/modules/ROOT/pages/developer-guide/session-storage.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Session Storage This reducer serves only to store data that we want to reset at each new session. diff --git a/docs/modules/ROOT/pages/developer-guide/standalone-mode.adoc b/docs/modules/ROOT/pages/developer-guide/standalone-mode.adoc index f752cbad1..58575256e 100644 --- a/docs/modules/ROOT/pages/developer-guide/standalone-mode.adoc +++ b/docs/modules/ROOT/pages/developer-guide/standalone-mode.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Standalone Mode Next to being a dashboard editor, NeoDash can be deployed in a diff --git a/docs/modules/ROOT/pages/developer-guide/state-management.adoc b/docs/modules/ROOT/pages/developer-guide/state-management.adoc index bdece9b9e..1083bf2c1 100644 --- a/docs/modules/ROOT/pages/developer-guide/state-management.adoc +++ b/docs/modules/ROOT/pages/developer-guide/state-management.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = State Management NeoDash is an application with a complex internal state. If you are diff --git a/docs/modules/ROOT/pages/developer-guide/style-configuration.adoc b/docs/modules/ROOT/pages/developer-guide/style-configuration.adoc index b82124d2f..4d5495a91 100644 --- a/docs/modules/ROOT/pages/developer-guide/style-configuration.adoc +++ b/docs/modules/ROOT/pages/developer-guide/style-configuration.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Style Configuration When using a custom NeoDash deployment, there are several theme variables that @@ -14,7 +16,7 @@ docker run -p 5005:5005 \ -e DASHBOARD_HEADER_BRAND_LOGO=https://picsum.photos/500/100 \ neo4jlabs/neodash .... - + An example configuration for NeoDash .... diff --git a/docs/modules/ROOT/pages/developer-guide/testing.adoc b/docs/modules/ROOT/pages/developer-guide/testing.adoc index 402ed1bca..5c492a375 100644 --- a/docs/modules/ROOT/pages/developer-guide/testing.adoc +++ b/docs/modules/ROOT/pages/developer-guide/testing.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Testing NeoDash uses *Cypress* for automated testing. To install Cypress, check diff --git a/docs/modules/ROOT/pages/index.adoc b/docs/modules/ROOT/pages/index.adoc index 6c7816dce..83eadebd0 100644 --- a/docs/modules/ROOT/pages/index.adoc +++ b/docs/modules/ROOT/pages/index.adoc @@ -1,3 +1,5 @@ +include::/banner.adoc[] + = Introduction This portal contains information on getting started with NeoDash - A Low-Code Dashboard Builder for Neo4j. diff --git a/docs/modules/ROOT/pages/quickstart.adoc b/docs/modules/ROOT/pages/quickstart.adoc index b128dac71..4ae165058 100644 --- a/docs/modules/ROOT/pages/quickstart.adoc +++ b/docs/modules/ROOT/pages/quickstart.adoc @@ -1,3 +1,5 @@ +include::/banner.adoc[] + = Quickstart There are three easy ways to run NeoDash and start dashboarding your Neo4j data: diff --git a/docs/modules/ROOT/pages/user-guide/access-control.adoc b/docs/modules/ROOT/pages/user-guide/access-control.adoc index 03c62dfd1..47cf3da31 100644 --- a/docs/modules/ROOT/pages/user-guide/access-control.adoc +++ b/docs/modules/ROOT/pages/user-guide/access-control.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Access Control The Access Control feature in NeoDash is a security measure that allows Users with write access or higher privileges to manage who has access to specific dashboards. diff --git a/docs/modules/ROOT/pages/user-guide/bloom-integration.adoc b/docs/modules/ROOT/pages/user-guide/bloom-integration.adoc index 8acdc4e92..09dcce58c 100644 --- a/docs/modules/ROOT/pages/user-guide/bloom-integration.adoc +++ b/docs/modules/ROOT/pages/user-guide/bloom-integration.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Bloom Integration NeoDash can be linked to Neo4j Bloom perspectives by using diff --git a/docs/modules/ROOT/pages/user-guide/dashboards.adoc b/docs/modules/ROOT/pages/user-guide/dashboards.adoc index dc6b70571..d0aa53b11 100644 --- a/docs/modules/ROOT/pages/user-guide/dashboards.adoc +++ b/docs/modules/ROOT/pages/user-guide/dashboards.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Dashboards In NeoDash, a dashboard consists of several pages, each of which can diff --git a/docs/modules/ROOT/pages/user-guide/extensions/access-control-management.adoc b/docs/modules/ROOT/pages/user-guide/extensions/access-control-management.adoc index 941b4dbda..9a6219c45 100644 --- a/docs/modules/ROOT/pages/user-guide/extensions/access-control-management.adoc +++ b/docs/modules/ROOT/pages/user-guide/extensions/access-control-management.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Access Control Management This extension lets you manage access control for roles and users, letting you assign users to roles as well as controlling which node labels can be read by a user. diff --git a/docs/modules/ROOT/pages/user-guide/extensions/advanced-visualizations.adoc b/docs/modules/ROOT/pages/user-guide/extensions/advanced-visualizations.adoc index fb02c5a94..f4e7e8e98 100644 --- a/docs/modules/ROOT/pages/user-guide/extensions/advanced-visualizations.adoc +++ b/docs/modules/ROOT/pages/user-guide/extensions/advanced-visualizations.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Advanced Visualizations Advanced visualizations let you extend your dashboard with complex, powerful visualizations beyond the standard visualizations. diff --git a/docs/modules/ROOT/pages/user-guide/extensions/forms.adoc b/docs/modules/ROOT/pages/user-guide/extensions/forms.adoc index 4bce11d4d..3ea8c965e 100644 --- a/docs/modules/ROOT/pages/user-guide/extensions/forms.adoc +++ b/docs/modules/ROOT/pages/user-guide/extensions/forms.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Forms The 'forms' extension lets you combine different parameter selectors to update / modify your graph data. diff --git a/docs/modules/ROOT/pages/user-guide/extensions/index.adoc b/docs/modules/ROOT/pages/user-guide/extensions/index.adoc index f267315ff..6d16b1700 100644 --- a/docs/modules/ROOT/pages/user-guide/extensions/index.adoc +++ b/docs/modules/ROOT/pages/user-guide/extensions/index.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Extensions Extensions provide a way to expand the basic functionality of NeoDash with extra features. diff --git a/docs/modules/ROOT/pages/user-guide/extensions/natural-language-queries.adoc b/docs/modules/ROOT/pages/user-guide/extensions/natural-language-queries.adoc index e7f9ea059..675a00a2d 100644 --- a/docs/modules/ROOT/pages/user-guide/extensions/natural-language-queries.adoc +++ b/docs/modules/ROOT/pages/user-guide/extensions/natural-language-queries.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Text2Cypher - Natural Language Queries Use natural language to generate Cypher queries in NeoDash. Connect to an LLM through an API, and let NeoDash use your database schema + the report types to generate queries automatically. diff --git a/docs/modules/ROOT/pages/user-guide/extensions/report-actions.adoc b/docs/modules/ROOT/pages/user-guide/extensions/report-actions.adoc index 8b50f1651..a381c0076 100644 --- a/docs/modules/ROOT/pages/user-guide/extensions/report-actions.adoc +++ b/docs/modules/ROOT/pages/user-guide/extensions/report-actions.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Report Actions link:../#_2_pro_extensions[label:Pro Extension[]] diff --git a/docs/modules/ROOT/pages/user-guide/extensions/rule-based-styling.adoc b/docs/modules/ROOT/pages/user-guide/extensions/rule-based-styling.adoc index ee6adc4ca..8a4b0ea9c 100644 --- a/docs/modules/ROOT/pages/user-guide/extensions/rule-based-styling.adoc +++ b/docs/modules/ROOT/pages/user-guide/extensions/rule-based-styling.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Rule-Based Styling diff --git a/docs/modules/ROOT/pages/user-guide/extensions/workflows.adoc b/docs/modules/ROOT/pages/user-guide/extensions/workflows.adoc index 2b95b06d5..a735dbc2c 100644 --- a/docs/modules/ROOT/pages/user-guide/extensions/workflows.adoc +++ b/docs/modules/ROOT/pages/user-guide/extensions/workflows.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Workflows Introducing an advanced extension for creating, managing, and running workflows with Cypher queries. Simplify ETL flows, execute complex query chains, and run graph data science workloads effortlessly from Neodash. diff --git a/docs/modules/ROOT/pages/user-guide/faq.adoc b/docs/modules/ROOT/pages/user-guide/faq.adoc index cdd5efaad..08ece7dd1 100644 --- a/docs/modules/ROOT/pages/user-guide/faq.adoc +++ b/docs/modules/ROOT/pages/user-guide/faq.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = FAQ == 1. How can I learn more about NeoDash? diff --git a/docs/modules/ROOT/pages/user-guide/index.adoc b/docs/modules/ROOT/pages/user-guide/index.adoc index dde9d9e05..d87dffb6d 100644 --- a/docs/modules/ROOT/pages/user-guide/index.adoc +++ b/docs/modules/ROOT/pages/user-guide/index.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = User Guide The following pages contain everything you need to get started with NeoDash. diff --git a/docs/modules/ROOT/pages/user-guide/pages.adoc b/docs/modules/ROOT/pages/user-guide/pages.adoc index b332e4ae7..0d01f37d4 100644 --- a/docs/modules/ROOT/pages/user-guide/pages.adoc +++ b/docs/modules/ROOT/pages/user-guide/pages.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Pages A page is a collection of link:../reports[reports] that can be viewed at diff --git a/docs/modules/ROOT/pages/user-guide/publishing.adoc b/docs/modules/ROOT/pages/user-guide/publishing.adoc index 2b1015a03..8fe77739c 100644 --- a/docs/modules/ROOT/pages/user-guide/publishing.adoc +++ b/docs/modules/ROOT/pages/user-guide/publishing.adoc @@ -1,3 +1,5 @@ +include::../banner.adoc[] + = Publishing When you are done building a dashboard, you may want to *publish* that diff --git a/docs/modules/ROOT/pages/user-guide/reports/areamap.adoc b/docs/modules/ROOT/pages/user-guide/reports/areamap.adoc index d28f4c6bc..9d3c4a79e 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/areamap.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/areamap.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Area Map link:../../extensions/advanced-visualizations[label:Advanced Visualization[]] diff --git a/docs/modules/ROOT/pages/user-guide/reports/bar-chart.adoc b/docs/modules/ROOT/pages/user-guide/reports/bar-chart.adoc index 56a8773c1..6a280c750 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/bar-chart.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/bar-chart.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Bar Chart A bar chart will draw categories and values in a familiar bar-layout. diff --git a/docs/modules/ROOT/pages/user-guide/reports/choropleth.adoc b/docs/modules/ROOT/pages/user-guide/reports/choropleth.adoc index 35fdbdd19..8cfd6037c 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/choropleth.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/choropleth.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Choropleth link:../../extensions/advanced-visualizations[label:Advanced Visualization[]] diff --git a/docs/modules/ROOT/pages/user-guide/reports/circle-packing.adoc b/docs/modules/ROOT/pages/user-guide/reports/circle-packing.adoc index 61146b24d..cab5079bd 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/circle-packing.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/circle-packing.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Circle Packing link:../../extensions/advanced-visualizations[label:Advanced Visualization[]] diff --git a/docs/modules/ROOT/pages/user-guide/reports/form.adoc b/docs/modules/ROOT/pages/user-guide/reports/form.adoc index d7817f171..f10776561 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/form.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/form.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Form A form is a special type of report that lets users run predefined, parameterized queries. diff --git a/docs/modules/ROOT/pages/user-guide/reports/gantt.adoc b/docs/modules/ROOT/pages/user-guide/reports/gantt.adoc index c54567aa5..0332fdd04 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/gantt.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/gantt.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Gantt Chart link:../../extensions/advanced-visualizations[label:Advanced Visualization[]] diff --git a/docs/modules/ROOT/pages/user-guide/reports/gauge-chart.adoc b/docs/modules/ROOT/pages/user-guide/reports/gauge-chart.adoc index 067acd6aa..41ed80eba 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/gauge-chart.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/gauge-chart.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Gauge Chart link:../../extensions/advanced-visualizations[label:Advanced Visualization[]] diff --git a/docs/modules/ROOT/pages/user-guide/reports/graph.adoc b/docs/modules/ROOT/pages/user-guide/reports/graph.adoc index 4d18523dd..8638ac9e6 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/graph.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/graph.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Graph The graph report will render all returned nodes, relationships and paths diff --git a/docs/modules/ROOT/pages/user-guide/reports/graph3d.adoc b/docs/modules/ROOT/pages/user-guide/reports/graph3d.adoc index 31d2ef6a2..d2ddeb9dc 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/graph3d.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/graph3d.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = 3D Graph link:../../extensions/advanced-visualizations[label:Advanced Visualization[]] diff --git a/docs/modules/ROOT/pages/user-guide/reports/iframe.adoc b/docs/modules/ROOT/pages/user-guide/reports/iframe.adoc index 44e822e08..8f0fb9598 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/iframe.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/iframe.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = iFrame An iFrame report lets you embed a webpage inside your NeoDash dashboard. diff --git a/docs/modules/ROOT/pages/user-guide/reports/index.adoc b/docs/modules/ROOT/pages/user-guide/reports/index.adoc index da44ed606..d05324060 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/index.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/index.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Reports A report is the smallest building build of your dashboard. Each report diff --git a/docs/modules/ROOT/pages/user-guide/reports/line-chart.adoc b/docs/modules/ROOT/pages/user-guide/reports/line-chart.adoc index ec0c21d52..56adcd965 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/line-chart.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/line-chart.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Line Chart A line chart can be used to draw one or more lines in a two-dimensional diff --git a/docs/modules/ROOT/pages/user-guide/reports/map.adoc b/docs/modules/ROOT/pages/user-guide/reports/map.adoc index 081b917f2..4779c3c98 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/map.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/map.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Map The map report will render all returned nodes, relationships and paths diff --git a/docs/modules/ROOT/pages/user-guide/reports/markdown.adoc b/docs/modules/ROOT/pages/user-guide/reports/markdown.adoc index fc09c3726..85d19cec6 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/markdown.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/markdown.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Markdown Markdown reports let you specify diff --git a/docs/modules/ROOT/pages/user-guide/reports/parameter-select.adoc b/docs/modules/ROOT/pages/user-guide/reports/parameter-select.adoc index 2951b7133..cfa09b69a 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/parameter-select.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/parameter-select.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Parameter Select Parameter select reports provide you with an easy way to add interactivity into your dashboards. diff --git a/docs/modules/ROOT/pages/user-guide/reports/pie-chart.adoc b/docs/modules/ROOT/pages/user-guide/reports/pie-chart.adoc index 9300388a7..f4ad133b5 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/pie-chart.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/pie-chart.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Pie Chart A pie chart will draw categories and values in a circular disc layout. diff --git a/docs/modules/ROOT/pages/user-guide/reports/radar.adoc b/docs/modules/ROOT/pages/user-guide/reports/radar.adoc index 4cd805e22..e6a4bcaf6 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/radar.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/radar.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Radar Chart link:../../extensions/advanced-visualizations[label:Advanced Visualization[]] diff --git a/docs/modules/ROOT/pages/user-guide/reports/raw-json.adoc b/docs/modules/ROOT/pages/user-guide/reports/raw-json.adoc index cf523529e..ec9725e83 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/raw-json.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/raw-json.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Raw JSON The Raw JSON report renders the JSON response received from Neo4j diff --git a/docs/modules/ROOT/pages/user-guide/reports/sankey.adoc b/docs/modules/ROOT/pages/user-guide/reports/sankey.adoc index f725d2d3e..22d014803 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/sankey.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/sankey.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Sankey Chart link:../../extensions/advanced-visualizations[label:Advanced Visualization[]] diff --git a/docs/modules/ROOT/pages/user-guide/reports/single-value.adoc b/docs/modules/ROOT/pages/user-guide/reports/single-value.adoc index 593f92a11..f5a2f99c7 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/single-value.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/single-value.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Single Value A single value report will render the first column of the first row diff --git a/docs/modules/ROOT/pages/user-guide/reports/sunburst.adoc b/docs/modules/ROOT/pages/user-guide/reports/sunburst.adoc index c3385bcdc..6f17c7541 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/sunburst.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/sunburst.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Sunburst link:../../extensions/advanced-visualizations[label:Advanced Visualization[]] diff --git a/docs/modules/ROOT/pages/user-guide/reports/table.adoc b/docs/modules/ROOT/pages/user-guide/reports/table.adoc index 8bb11cb14..8b352f2c2 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/table.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/table.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Table The most common report in a dashboard is often a simple table view. diff --git a/docs/modules/ROOT/pages/user-guide/reports/treemap.adoc b/docs/modules/ROOT/pages/user-guide/reports/treemap.adoc index 9a07ec12a..a8e620060 100644 --- a/docs/modules/ROOT/pages/user-guide/reports/treemap.adoc +++ b/docs/modules/ROOT/pages/user-guide/reports/treemap.adoc @@ -1,3 +1,5 @@ +include::../../banner.adoc[] + = Treemap link:../../extensions/advanced-visualizations[label:Advanced Visualization[]] diff --git a/docs/package-lock.json b/docs/package-lock.json index 994e25648..6f4bd14e6 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -420,20 +420,20 @@ } }, "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", + "qs": "6.11.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -521,12 +521,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -662,9 +668,9 @@ } }, "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { "node": ">= 0.6" } @@ -695,9 +701,9 @@ } }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -753,6 +759,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -822,6 +844,25 @@ "once": "^1.4.0" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -852,16 +893,16 @@ } }, "node_modules/express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -877,7 +918,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -1034,18 +1075,26 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1137,6 +1186,17 @@ "node": ">=10.13.0" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -1179,17 +1239,6 @@ "uglify-js": "^3.1.4" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -1199,11 +1248,22 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1220,6 +1280,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/help-me": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.1.0.tgz", @@ -1776,9 +1847,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2083,9 +2154,9 @@ } }, "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -2118,9 +2189,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -2307,6 +2378,22 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -2330,13 +2417,17 @@ "integrity": "sha512-RPQhIndEIVUCjkfkQ6rs6sOR6pkxJWCNdxtfG5pP0RVgUYbK5911kLTF0TNcCC0G3YCGd492rMollFT2aTd9iQ==" }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3178,20 +3269,20 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "requires": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", + "qs": "6.11.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } @@ -3246,12 +3337,15 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "chokidar": { @@ -3362,9 +3456,9 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "convert-source-map": { "version": "1.8.0", @@ -3391,9 +3485,9 @@ } }, "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" }, "cookie-signature": { "version": "1.0.6", @@ -3431,6 +3525,16 @@ "mimic-response": "^3.1.0" } }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -3484,6 +3588,19 @@ "once": "^1.4.0" } }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3505,16 +3622,16 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -3530,7 +3647,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -3661,18 +3778,20 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "glob": { @@ -3747,6 +3866,14 @@ } } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -3778,32 +3905,37 @@ "wordwrap": "^1.0.0" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "requires": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" } }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, "help-me": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.1.0.tgz", @@ -4222,9 +4354,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" }, "object-keys": { "version": "1.1.1", @@ -4478,9 +4610,9 @@ } }, "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "requires": { "side-channel": "^1.0.4" } @@ -4504,9 +4636,9 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "requires": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -4642,6 +4774,19 @@ "send": "0.18.0" } }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -4662,13 +4807,14 @@ "integrity": "sha512-RPQhIndEIVUCjkfkQ6rs6sOR6pkxJWCNdxtfG5pP0RVgUYbK5911kLTF0TNcCC0G3YCGd492rMollFT2aTd9iQ==" }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "simple-concat": { diff --git a/docs/yarn.lock b/docs/yarn.lock index 8c2a976bd..5f4adab6a 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -285,13 +285,13 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== +body-parser@1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== dependencies: bytes "3.1.2" - content-type "~1.0.4" + content-type "~1.0.5" debug "2.6.9" depd "2.0.0" destroy "1.2.0" @@ -299,7 +299,7 @@ body-parser@1.20.1: iconv-lite "0.4.24" on-finished "2.4.1" qs "6.11.0" - raw-body "2.5.1" + raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -429,10 +429,10 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^1.5.0: version "1.9.0" @@ -452,10 +452,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== core-util-is@~1.0.0: version "1.0.3" @@ -574,16 +574,16 @@ events@^3.3.0: integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== express@^4.17.1: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" + body-parser "1.20.2" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" @@ -1420,10 +1420,10 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" http-errors "2.0.0" diff --git a/evolving.png b/evolving.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc85364bb342ec508a4038b8fada99e734440fc GIT binary patch literal 223331 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�<5bZ(k;>Hb3M73&6-LTutj zeTd(zlcn?JrcvY;q0Ss(bE6~o(@pMMgK~TRNj|iMa9p{1OU-ZU)43d)5EpKCF!wS~ zq-RhnC1NK6Lm$n~o$rc&AIYenc&O_~5s3kOrMB^+im>~+#G9G8>scDihQ0`Z!{Fj! z0YCVwCM(=LEX)U%hPRsE&l)QErX4kC)JQLOom%i5V%ZP5?`Os^`H!!AFOAdCd|5Gl z0F?w<0?ev}Z@v~#{Rx+JW9eiff>MYDY7oCFU?Y%iZXfd-Zy5Uy9Fe9W&3{A>fI6YE zfk-Z4&!&Sb_z5!%CNjGPb+%={QuePX#h+dFspYzM?4e@Ye3&T^c^{wkH#WqKkui35 zfPQuA#_qm2q*uXL(cVFN(n*Hg6Ba+lr=^B)Dl20{6ZINKf1N%If{-19_bG?@Np3L|#qWx?{*qz)3Y=C+1Hn(W8I8i5M<`E5rHLeAW&W z;U13ESjZk@|UqT8eFIh(EObz`!w_8%lzl$ zuXgsjj8mUOc?iQD$x<4sm!~0V>Ze$)2C@z{FNCF-QUzUacXBL)9}?RbYYLu!PA!b* z3RoPO)?YAO1Fjj^8G#dIjcq0J0+~=?wbyiJ=_DmHXp=k=p;I% ziVRrZ6OI7DQ0Z>@;k+;*-8QM?r%)U)#;D{J46_Kh^|wC`b&I}hxoj#+M(=Kj4e^pP zp-^iYCh5}1jL3x9L-`oN!T}uD1YMAYP1WS0c=UMz9IA}181*F9V>ei{keb5e*0B4x z7nn|+uZTS%8xB#z3kF3RGi5y9 z?>J`KIw~|PaW7t-%Wfz8i|W?e@Dj2-W*t%A%i2iVq2~)izyr@4!-mFg4t=J%fLhGn?mYu0}Fwtbxh^?FUfQiXN;6hFN28_of5=q60JB zt3H+j1&#|{jXSfPgju$qWICo`*GKK9+?fJ6=hkaK^O8FU~I95H^3Tp){m>I1UZI;U3E*+O%JHwqdSnpV$e ze7-s}?3ud$#votQh+1ARmDSE!R<)#HDWU9<6WZf@*p*wfXE7^!Hh~HUSZv*Mer)bd z7Fz!j7BxcgX-A5E0rKL~@bWs())+OFru&+Kk(eDQGKbzdSe+wVFB5#>J;J0#yg;(1 zdAKJAYUey}*`*kXcXT8Od3WPt~rb{Ga7=<+UTz(J$ za@zcX${QKpZ=&V3PfkUO3>vAliQe2yO_BU=kq+GOQI~~fw+JbQMPYf^CpgVsAIf>Z zctV-XW+=Tissx?dst=RW@g&6{4+ny{f_3UnD&5*Il!_M*xK}wWYMm#Nq;_^SQP&-m zu*6k;uzbianRF}lq@p74Egx-X=M1NK-ut+{Ils&+B9ai-Df6tZOAs0e({&SLPmQz> zn10+lbW4;PyFdEET%YcC8aWGYQ_X7=3IsM#2E?HQPbQ)1x{e07>gR)7&r{wWR17+; zc}1vrc*omnZ$7xO9ijX5?gP}5oL(j9-wtUs|>UCbp@tO>eg zf)EScUxv*eo5O;c%cS_QoMkDl#%5*4jL)Yh484*=-{xM0lTLeAgi+Is3So&IgWo=m z=rC+3^ma+GQR$H=EZY1-4PEsjNF$m(RG zB*jb)ftrsYFz&}5E-bl$?=I69uSVncm9)J|t4KdW-QVty>*+HpNSRX#V(fHo6i?vk zFmhZ9h99dEJo?%DUj&{4qp136HQXIfxAm^0JuMNUU7zmv1w~-}OVirIwdKM`O;<}j z4KhEi3|5d>IhUT^58aeGy&NCs@&sX^>o#czB`nS_<@<`}ek#4I#}+GUO08^?gB1RK zYg{j84Bk!6WFNHf+gLOsTH;Gw-A4+oO1%5>D@59&0`jz;&cT|h$$lu~Lh-QVid#BE zFT1Vv_9Wo{1ByU(zd$pKiJEWUZNTv40+p!KAtvYP=rcPm6?&L1)Gw2XXg>xc$5x47 z)?*K|$CvrL#P`k*#R0!V%Xs={-hFw1PJm@%g$bi~+y#C{uEi+h8R&?a{I91C2>9vh zUfU?;>$Y+2Q!fkN!?|!_izaH1cm*(o-8Msu)OBP)CR|Wcwb`hXwZ7B4_Un4;LXypc zq=$K?i`+?Me74flQGH<2_1%rMlrdktJ0or8c%0YzSk-&-t5kb-Y`GTc5>nCvdhFlS zPs#5^G>f{Ly=_Zv8-)(vcaUIj{x92B&7i!p_H^`Gk+OL39C3+uSs%Svt0m5Nbqp7+ zg%c^lCnqd<_u8@Pn)$#M;97t8()Iwm6L9e=d^evwc|6Emt^UKVuQ7gDGfN0*i?@Y< zSeGlhG}1!=n#kUfU8GX!eV%LQQgRnYuM^E`oAfMZ5UG}gmX#v`n&%=}sfAaQA{)4LR25L1rF34~*-$Cp}6FwpkNq7ESvQ{n~@gS+66T z3vE0ghHM-$&XRxY$CZ7;$7)EdVYF{}YD&J$>VeUjv=!C?OFO|B;T`Gc-TId7%biLU zK+@k4Eg~claj-6+uE-iw#Q&gEmPyw(O^6)KWkt$ok@?Pj^{tu1A)j}Z>oiBi1Sm}zmYn$70Sbw^0Zw0sJ(a;he$hM6)% zjX{xXaIVW$S5hFAu_ae2^hJ!zwLC%PKgoio<`IED^z&P+TP4O-6>LIX;G)(Io9H22 z{MZ8q+LMpPb)h|t{STggE+h~SBIOE#>)LZ4| zvMuDsr(1MqWAwvvU`;!jVK(;sM#@OAw0aKX3h7%>(>BUdHzqs6uS_~z&ApTWZ|!EQ z5d?n84L++y=LH{UpTQV(GM-U_-Be5M2aLrng6;UFv5|$rEqnAdG4CmpocIB*E#JC) zdfc-yyb`)5ce5ajxMByxN!_a7y0PG9s_bKgY105*@^!%zHe0*P>l{1GD$BQKXBS?n zMrxTw9^LB>7&|fWr{B%SBE`Tm=11p?o4S0D20XQ(XLwnso*oawD`)b^puUhrEzpz+ zp`&*d+?IeES_l5bvIa#ceeiF$A=!RSauNWIlu!DC$lmK@6Vh9zLfrWz_V9%JR@9eP{AHh!63 z)|QGCn}DHjCG9COS^4PNvR2etI~ex5PN{umB$DS=HC1*t6|q^1)K@5Ey-)##FJNFY zvW@iwf`z(eW8sA z&;EftcBfUj@B8*X4u<2{QSxg`*mqO366Z`oofY-gRn6_jos!UOu!~~KX^prd<>>U2RWt&al z%sc7EvhvPU`o6WTN3>y+=7*HX<4&Iy0>+9HiOnRxmTAaKLh4sN8St=N3=-x<%y$Ce z4Jp|=w%?yxfydWy>s;yryYX*FkS6tfQ~E0N%%6QgwcYVwiMS%vnAq&E?)9vK`!o2i z8Q;tuF-Ox7DrSLH@st}hED0aJToZ|-_R+deGv$6A0@ zn!qP>+Gzr{+Uk|UdgklNwv_$KS~j1dz2)=KC+Zqw=_p_95wgRLfxRI(u^`3$e-|HImkNo{i{XUO(b+=k-TbFCmtL0#LM6K$F2&)2!t zV1*T-vafZ~01L|Nl(dCOE&VnH&NJFup|hn}-+@{F=aHz(@x?>LW(;4xXHu?_si@$> zZ%Ce1o98LF#3v8VhJBxJWfOeYma2M6>8P3k(3CNdyKo0?&dECRb>AD%b5~8i`*Inr zpUYEy7Q6D&j+q|Y)O(sKMz4@bOBjT;lJR7KlK&Y67}B&n;;F~Dz=dBhcsa(yb43ZO zY`rdp0J-MqnSNi_q}7+uw07ckUcSPhex3t;)h6TmCUpG;^coAj`d$g3CY`EY1y4N- zDM9QJMT+AKrHF8%!Y^JBa4@n|L)d_u%Uta6&&_}iSAA%SC{^pbz~r)ifg2QAWtbS6 zaXe6sZSMr5SM2TPUecefuux(S$sF+2xYj(8Ax{aa3eTTA4&ElR5)*xQ9*$u@ytH*a z6!bFeSYWSF*3^9uPV5=ot=)_7{IkDqDhXW>6BuI3|z}lgl|U z5PejmBwsdsb4LDTs7W(sJ=I|@tGp8~8a)jb4C2c7A=8xKB`CxIXBY3+veSY8XuBNg zkaX&Pr)-@SiQlz-?KT%`1JmP^9wh*nJAK{7(KvV$Y3QwW*T&$A<-_rM|FSK5=9GQN zl^vnFk=sz2DP>LxrqyijUoHVOR*$R3`#vjOyXvyBYOhzx^{ieHwIwj2UmMC=&YV?* zfMSujhxPl?>{f{e2#X`b&0MCz!X%nYbgX{oD)zB0S;1tFg+(4MMaJD#walxGE^w@)zdLB|RiJzLg`mL{b zZLJ!2T6lPdAJ#MVHLkc{;QvyWlq%{CIVl=S>{1>qG4Fp#>dB@fFCXYX@UO&a{XJ>} zKu(c@GPy4TR$?e8yF;#J{#I(qIqRp$sQ=NX*3|k8@#~{NzPLFoSCF@5tj#D@AHLs` zg?OT%YzbCNjX1i32c7mNxjhRkTHh~2N7~{CU9WZBFSh$Kc0cowRP;@xzMsoiWVH)R zgZv@ro6ELenQZ-^o&Zj&Z|;`2G=QoOR}J<;N%ESVMkp$kdF4yH%Q9tpKF^IhU-v#4 zMz75FY1!g&=P}YL{2LQ8+Ncc6AC+s<8`Z7I#iXd!ra`uk4f&lJjJY*0ebfptE=>cR zZ+ffS$^+B@8u@l7884VOKPi8acrWwh77R0 zBMnTe%>FEIh>Dw1+CFCoSNl&BJ4v2yn}`0khQL*wqE97MNwtg)_#|Lbachrd6X{!R zncj8HuP1TVw90p9)ohe)-XtMg`N#vq`irhUf-mz`46cl`Dz)WW~29&F-85!`f-Dp=2D7NjkE~ zlh~s-1bQ}6+eS0J|2sLZ;Ne!fK((w zzAmE}by6W8KSj-!n&KsE$)-ux*}HpHTWB)C%_X08rn#i=ynZhDuQv2$NY&}dvzdKDg2{{}cCSwofc_({7TI2}o?FkXOzEeTS9=)wrOb-7p0zUk=K!TN z?L#crRpb6FP)BKYz--tf-v0@s5-@uklA@^LVwH=4O*%$-pq}_0MbK>sH*9EFwI!OA zNCI27Tw`(3EOsKu_a)<3BywrL2x`S#tYwO^OFTm=A8^yo-;FPTlF(m6d)2U(PUS}u4JZ#`gBzWdwTLr~8lI4#TyA!nGU zl=Gd|-zlX{uV8@W>cL_iZN=i0x`Ak8)8?amje$*=><1vMbG`wgEN`=G*jT&vohxKw zE16pLpbcBTFt#~rB%2Kg_Jo5i(_RZd(pTZ#SBS0qKWzNA8n2bB@0a%dT*BRS?7aVl zZeI^1Y(yjNn1gHLsNmAZgQ>S-UqHSV0k!#GsesUF8a~RBG9~=}{FpNP!s$c;VgnQd zdfX*=u#Pi=9J1(AjE)$zkqq}so*p0LoUO{32DgdrTVQH*3LDQ(FK-h=5{UL6XVNvK zz0*fC{}y6pL_lST)O zXj~DJ7gJ9llK+i4bGqWo;!epJ>0CL1*rQZ1g=099@3n0+(H*Od#1*fFF@Db3YKolk z?)OvY7|oNpR;NgHnzEJR*Af3RMF9-Vk#*uP3#<`bT0IcTW#RI?ELQUA$MTTF4h9^{HD+D+quV(lXkPD%+2RUPfm6}L9lX! zE1fbC592cXoW{-obS0wOT2+d@NEYuk+UyOlp{d?D<#YKobNayx9g70<^g%q(?*Jc!%0(&VelY=m0{ep- zzIN7~Qk|rdR(hndY^7!HmggYCx*G8CxCn;Y|=e%Fck{9wB zu-ka5PrU2nzUU>SvU)`S%qOLnV9Dfgx(D*pl3t|yi$HKd+t0UD`kZ7DvwIrGThx1t zP1S=jr&(;8fu?EK*Z}B_d3~liHS#QH%O#h-?@x5drq0Y|pMmjJS11Hjl!W}DWl$Wk zSHSd6ZMF4eXqqS?<1J#h|K#Wjp1AsidEW{=RtGE}5SU~5Tq1ngTRK+jPd~HadN5+w zEs|Jm!q!6awFn5*iAeKZcQCbCV0z$89zZO!=#}_pUnvokYtt?o1MK6gkhiUvVJIm0 zGR}?mBN9Z1kEk9)?hiVTVhN7hFN)tnaYYqvB*6G? zq$Ui*VlNDI5rTYSfVjiI(~qQ!wM(AwNhGF_z$U|(v#tfk*|8xT_?C>FFNlo48IqbK zHW&^&AYU4IX!(&gi(~bS%H3D`7VXWBOC7GID?8bm#O6dIbk+Q>XbqNDn~YB{uvQ$z z6YZh}f@w)@gcvT0So|hUo;L8skBW|UASRN8jZ$#y7>71jB$G2!wGkKqBe!bwTcYhZo>rk?a0^j2@4s zt$eo?&Y_+|9HMa)aa-*)9*URb=|ZQ}cYq3=+>}j6I`R7Pvlc8Cy#OtNTO8J|lONd& z#YD#j{_U}=(t`e_kM{{E-DC?)9@MvVWUnl^_zTuzV`CuVfyEtM!DRd~C+MohG+&Eoo2!w3l$Sb* zfoV>IL-)6d^{VGlx@nSrvL4ueaNojJ_LnJ|#fA(z?B%j}%#$vVyJU~?$tFESm(5Ik ziXMoLDlD#!iPeYmC#>-;f<2dHldzSEQ;+w0rx!BJr#%E)##=nd!a*l+!0`?t;w)zH zKpk7GCsUXnk3*4XC!Gy9J7I_R#2`=h+h02<@OP)ornbamNLhW+WxL733-z4*z1QK) zh4(T?pV+uE*Rt4QPf399+V)x^*_s-;w)5~OA6h*ZnPS`9MUp&(RIbfK%G{G|(|7gs z1o#5yUfWoY*JY*cUg&sPr0#=_c2r((1*P5>(v%cBJQi4WcXuDQOw7yi0FMW7B{3r% z5g%+X$L7tL*rw8T)A-H}e6K|;jwPsraS1Nxp+Up~v1>+zl@I1)&RtS^jjb*^jDBCt$G7gV-Cv+WDxwv{P?!Rr`q$CfK~&-3Yl zOYwkh!Du|1lmrl4G#>)v|gZ# z>0_Kxp2-+)y-UOb=^J(7;Lt@DWE_#6=6g%KyL+~BF{D;g(>H@hBy@9FCsxGAUR`TD zL(CWwjnd@7GP&(0)8eg7Pt}Jf1$ucU=JDrA_gWr4v3{wq;azMrJb&x?^442#EjKUS zEH^joYiQ^PS1sx{+E+o|Ym)$s)Iq8DKF_T$Bf8r7Xn#6h{J#cw1oQwIr z;CB378HMpcQXa$L2?hnyZqMkiM9l{oXS1Wd6&?o;9O zFMZH2>7?7L98aM68)@eQ1rMil6*}jLE4kbqd!}UM7KWX?K~I&ePqdkqi`~CDnXe zls2WUHt6WJgR-oxr!p^{s|yd49uuBjf_e54Hnm80bJTlb?}iE!bX9=jd21C*7=f8BNs87WU?WbsRV!|NbT=smt| zKLdv4krvUOuDosF$0xU^)Ox??nF|j$}!XGyuH0!zVyXET0ZlyerNgm*S@K6-}`;gnH0B$HhcWWv9$kmSo)>a37qC2iKKh3P>)lM#{X=#Bs2q_Yt-c7BaC{zHvEMxKWPdof&k4WruQ)b`aa{9}X4UZbP&DnJmrgOV*{aqV@) zQ@LI}S>PUn?O{G-9-^VR6LmBd_@rE%;o8;_?!MVHt5Bxn-TE%&5Hsa9KW{n*bY{a& zG2x>OSMyw=!Hbu^CpGCI)TIOiw9?LcAGveQ}UhdO2rUz}{ z82!24vaPVYY?H@eN*RPzAjUn)X|c)mbH3Te9#(FxkqM8718i91S(Nm%xZ=NBE-imQ zpGcVfzqwBPxet|^J>KZQWBx@6=3nGT;&;eGY3ar-88D#9_i$vRS=9yp_?i*`Y=RH7 zZMb`Vwfx!FzP|j^U;N*f|L0%)#`5NyZ!T|s_bnBNdEfJWuPuM|Z~XM~SAO=VmUq7E z9sMz~ae2m1THC);K%P|b57^`5T;T~6M+8|;_D+4IU*ud`TST+n*${`;e8dmcBm!I_ zG2UvcQ#z5?)RCwr@mpi|u3%4X(MT#F)+@SCOMdAXv6sLJ%ddo;3vQEBc;l>d*;Fq| zk23;Xx8lqCGkHG`ozO`C+RRmK-C{n&tYutSdAJ4d6Iy)(l|8kqL?4sQ4N|EU`Q~bQ z+pdu!aR;v-V^xrhO(6Otw@zKn86#gUSTyyHRC)UA7pUpJkQPk4ljwjUlm+X`PaPg% zRCVfr&R96lhwbQrNpN$~@{>I><2|NX;yjjf8C2UweGGZ2lgf9fBkO;udpn3Xs?f>w z>bDS742xalYkb(>O=#m|{ItLhTjSf)1D)8I@%hTbt0g%(hkWwS8vk{>Fa`9IcdS75 zx#-)VDG(;orQP{Fe?m*Pp~v)+(uA|bWxhY`G7GeAI!3Bz{5k-K?8zY?Z37&qE}!dU z7fWc5Rhz7(54qxeZTqUxY5ARap0B5k>l!0niJmOfWQ!L4|3>S($*vN_SEQf0)y17x z2NG3e(@G~*B(Byzpdx54q8>EG9_TW}miPs|S^DQ00ZqQPh=0*y{F;UqKgK#uM|K;Vs`p7@ykq&XAN|4-Gi^Nn!kIF=2I1G5CV4xmD$f!lX zCL{e>NY&9oCBH~yN?n&lx_T{6TcAy`K#<^4wv@fbQwe2@LpV3>BBF*)7HbfB=K@~4 zP$$|;OBUDlWW6U5OXE90F&r*sY}^;fjae)r6RRui0O>@qYrJjn{HBeNo(-0>e|=T?CCg_2Z<*)&0U*S z=lz|5H+;+eJ6^P|>}oHp>E#)hDdVs#xt^zfp2^w#JYmbW$`2SecLP=((KB$dn(DI1 z%{uFx{S}G1B!{tJU!rcV`($j?mHo^7|z>jPI78{K-!&ANtUT zmtXjWUs(RdKmXM7iJ$(-$chV z;%xPO(r$^#wev(r{7HkJZeuUTbW6vG1Oz0$?Gvi7skW>2O{0h;pf|HOc5D$Cz^mPi6!9G^uK99f zosC}|dM$K>%PJ$Ymffxfb`#k|ey1&kUFo=%MoL)~^(D|~Lss>R?@}>Tcx)2i5kwwn z#C`}mK;XLW0QCja4t+l_GXTnZ;G8Jl3tL|?|DvERvj;0qN=Hxb>MSdK^+`X zqfhQSBA6#eHLW_2J!9<%`4Jgw5U%qU3eF=Ir82%Hz+rqWmp)<}!!_(8{_Y}0GYxJ|WudzCgqRy{ym zuTo2lX(>y!dQ!@YB+pxZOD5;&3Z)=e=>M3w`aqFxrZ%BRW+l?gjiiC4&vb_p5JF6y z&Pen*AfVAcdfF?nrmZ%vX{euDW4Y$8B9e=XB4OtW`ypfbJdW`Iy;CKi;@dntk5r@q z(61*v(p(Od*avL((;Eoe0rGZ@c=4x22o_P)=vuAQcn#cPPMzLb?wB*saHuF`+Jy0f zTx`a|$`Gn9yYw1p6|yZ2Y`ibx1UX2F0q7-2L(SK$=@=hgDbzBG7pV#^C!#Huz@URm`R*dT2 zcu2Fz)E@#P;V?9xTc9*`%ssQDk9TXmo(k*6X@YZJpIy3yGiMV+Vg^F~S;K zY&B=5*XFC1svac;yKLnlmwZ8gxSvWD=^T2E?pA1~JOU3~QY~H*m;0!?x8$cL|Hoha zpO7SObLj2_ZiG`lNZ++`q(hc7&Z+{2IobU8R_GwSucY8zcuZHFKOC6Oe9cQf#{w`B64X+n)$ZaOgWf95mjSY9Ysp7B{ zjNC^@?qWJfPb*6oEs@4XWD5U|9HiA)4Wu1ORBkDw{7e8e#gJdhV1ufTtEPyWLu436 z1Ny)T2=LMkhEB?Y;cH!{w4xB)FaBR808*DRu$@c6)5Uy&+mQ+-6`PNczrqG_V51;} zT?q--UdK|&L@o~XRS#3PQ0#jH$~K`zP)B7gb$qRTVkf<)a+p@?7z)jd>4E8i!UJFW z{8yIGe&&nI2R`t@<*)s$#JV0Y=7b~Yn?+fD44a~f$zPF$6 za+|wieLat>niyM_-}k|BscA>nYDDuW4!uliRx(NDji928PNHj^ym3%UwdZ{et=wrT zHM2g}d6@Kd*Qw`Ys{>-09Im46f0 z2;;I8&f7BQvI#GAY>$>tD^sUL`0npgG2t4zb9FdB3sU!IJwiPlR<0*wHTl;-K)bcb zWvSD(lxXvOdf;(-ATI#F``tH}-}v-rm-oK+y~`&*`N`$xX8hCwEdA2&e@XUB@0K6^ z@qcHxZ#rAl!$-jBb)X1N$C>i?qt4FcUV+oOJiI?AgDpJ3VhTEDw4CPYUJJB{rH==_ zJ77vN3xR8v-z)R5X_w8oWS5tTWm?pCwoD`>qS&X&S!So9T}tV5SQV?o*v7%>d=tV} zIOnOyhKchv45l`#y1v!BOTkOUlNzcI0|lC8xw7MAmRb^Gr#-UFD+mH+P9WZ z{^Us{|!{=#4Q^UKRGzwF8)^Y=dg zd&|du>?6zfd>{J>N(wavrU#}6rU#}6PWAxXVpwnf%*}<9o&C505DIHJJghDD+tl~T z=926V*~!{8KuASK{QKzq5^~;U2%!oi)wmVg-WMkh#g4?xp_mUXkLSYjvth?`xtx{~ zjVs1Dg2OP5_vbA6ls)kJcivcj@3VifeCR_T(x0AWwtn-Q-(0@^oo_6E<;Q<)xv{^} z!wS#*<2(=~s3~Mf7iETu( zY}LMKVa}^)t(x`BdUq@DTio7tdS}jw8exh;oQ9(?W4H9^AC(51?Kk=wASDyA=M03^ zxn&z|*h+$M%|H9m%a$~TFeuh0i^-m6x*pL2WhuP5p_ZhtooJb8N-}%xYwGXir$Wt} zrzkr3F?95NXlcm&(7?k-vl7IC0Mb<@*>`=jb}M>rrk_mx$Qw%xU!} zVrKPhowr`qe9^XI`d5Uro+-K0{F~a_W-TgU{+MsB!hKwI&{Ch*$taS5!!YoE_N=cc zTAkL>P-Q*Zi%3oLcJgS=KbiO+edSM=Kl|!8m!J8mzp}jcn*8zuIq)kH?~s=`e&{3b zlb{^Oegz|e$zrpTzkmy7nzlA(lz;?1@`6Z<@DXwWN|N1;rZmbSU|9YsN?bdF4&Ao>b{ZcC@ z#U5r>e>BKKiNt3lvJsH&AB^ygI`Stov#GIE8 zop6g6o7W}6{ttcc@}76UUHlqvXYDU$xvCyKllS#}J1@1{xQ`y(=uHS<_9d3X zc;_J5PRX2wF;Zsr&h7$qIN3WO+*;V8hfr;q+~8Am5yP=WVT)Uxak@CDfwu|{ePK4o z;1M2MUtH@1te|5~QAc=Yksh=%ndhhm6~H*^A;G)1fxeH;4buWd)SItGBU7rvk1Svm;qWx7jyXoGy!GAk zH2iRc72kQ|JIfcp_(%HFlRx-_KR^-Qdh4y_jW=JH&4nLWu5RA8kL_F8q`)supx=Dy zZ8!3hmh~6|;7Bh{37k;?H=6u|FTK)FHbzHOU)y8KUB}D&WsSLv7guQZ`x~@MrPo;q zg4FftU4-_ouEFVvP_D_d2?~_01EX_(?eu!~?kGz6D>fKF#_^1z%OL1bQDq(m1ny+6 z!!Yv+tk6@@96wOiH!ANVt@w`*ilN{TrF=C19ysc zg>mP}9^4JKgcx*vrVg*A+mbm`$~6L*Osqp*3E0E}6DBj6CgzUzlXf*nmp*sFJ5opB z!@9HG-ubzy->bfKCxr)}#!V- zM6`cf>2`HN#&0j+Q1EC_Ft~}5ot{QA>xVsoj=X^{5;9bg)SQA1pWHUZ+63WSKK+EY zm2e|0TDX~FJRq^q8Img@jU~_BBH+hvid;_y6KFI?)^~!7@~Id;?hDT^ud*5Bnw;o&EVZ7~e&T~i|bMk;O^qe4^I9?2)FFK>=xs@<- zeTh}JdxpZ&r#{=yCv@}{Oua?0FOvF(^kk_w&%iUn6094L@~u)mcH(58sMN8-8!)h8 z;_FcdT;-e7J9ij8X}KsNtIW?WDrn*He*N0{iCf3*E8K9^0KktUYMwM5*;S z?`0v8?Jf=33&@EOaWQsOyE4fL{foLDsYqHh?n}+x^TIE(x$tt;Iio=0v1(HJF1arJ zE)nHd3{UdpybJ1Bb(fR)D$zZcZ;IL;IC={v8k-kX4+B#*86II1WC$|9z+Bo7sm90j z2Sca7{pGLsWjGPP*hc`9FISJIVcPc#^zi6KJpp&++`~>XBYjeWD#BJ$cA24&Ef%aYb(N4eITZu zNsDAn#cKgI;^VoBv=YyEkH^yOnSTAN-(KGO?%nc3KlIV%=Ef{WI_j{ne&y9ym$$$A z%JTca`)`*2`oH*Zm#_Zm*Os@x{T<6Y-|EHB#y&yLz7Hau+9{qvS-Act_jyn%iP%8Mn?K-^hI_Pr zlo%g6C-Ox)g^%e~u$bR_XxH)Aiqjmeqb?^&aonl)HcKFS-P|Cud=bH9b3t?!Y%_!X zXU%+{+?+IDpNbZ=NFJHJ?6Kf`0P%~Ar4CG*L*=*{kwW??Z>LLw7`p1CR(vO$LiHS@ z#U-_<@V9sC*SBx3uB3>a3D$a3lQC&E(cTpb99*aeMAOg#@F@?4*+@VZA;fIWW%f^W=I2QsK!m3_AH!&K)IVbx5)N9>>(5YLH~j2;!KftJ zM*4AFdVWz0#5ocFZecC@Oj6ZbsM!qTtAG48d3VBlmiN8yz4fAOpaB~YZ-4vSm(P6q zx0YZ2rC*V_y6I4vV8EvA5gUG zEjs!EudS0K?HVl~+uD9?<(9cM!x~Tdjt2f(^kS~y8P9iKJIbMiO?b#D&JNHnq0uvz zbD5q4x^tqQ;64pn?fj?Jycge{fa3F}!&<$dCdd=k{05sW6xU)_jb7h2U#rBtrSPio zuycbFC~+xM`sZn$GA5%ngtcsOVB^k)EC1?R!M(t$PDR8%-JqLI1-*G$Ap5XmC@r z<9I}pHxvS}QMQ^*u_WkEbT3t*0%+D_MJWe=$1*WJN$NZ{9m1$D8>=HU?0)&2%3hk2 zuRq9EU}EbG7cvkh|N3n|JslwfW#i*A0X)j<%whf1-<)VfeBEp5L(dp4ANaMW zchy1%)8hg>KxWICZ3;aA$w#cR^>1U0v;i+_w262EJ3z0`OYK^a@~pcd@q`naKIQ>! zMMcs_AcKJWSS=gV*Y#%GrQ!|KsIf|K@KmKluLdm!~4IxbViVy^4!CK}fNu1R>FG zm0S8iI#+;3#yHFGa`t5bZKz57I#eL;WUmVK&blM1m1Oe+zFIZJ&s2>u)EMcFqfnHX;;-f0 z((tjQ9&>=UMKy)@AA^D{S#2KkmuJ+lxqt-&gmw-yj$%6c`S(<@9c8}rI|c43DS1$; za_sM<*~I0DjvF)5Tb-%~G+6gC;%3v&SKC(e{av$aV)@%LW3|17Ht1;eSUb^M3_COx zzLQ#~NF# zND5*iAE90h9(4Bmz>Q{gD|5|?SSO4YmcmB?Qxctq( z`8StWUU|9U`Zjs*!Vmq>4=rzd>21rO{LvpTZ+!P#%k|BxGU{k;HS$#g3vvk4NnC|^ z^aZO)+>zyN2{s4pKAPnN6g1!6?=p}^!2H)OXA>32CZ=okY7q7Pa%{gp* z*e4FGo^N{&gpYu3XnQ%H|fKiTM+MD|2s`LgwC6c-?Oh>^0 z!H^yU8exXggN-1B#f0v|aZG0?A2jft)Hd*puy$597;6~}vi^aPV={t3M8Nf^PS29_ z&9Tz+`XCR$x#w}PKF(FdjGi{XJvUzPr=n#S(=!x(j0{|AQlU&mOFN(Q7zfVT4z^^6 zE!Li6$enIelm*_Pyv0#YAfTI17q-y);$W2i?ODA=j?0dMXEO ziL??rWN+mVaqwgD@3+78&E@W`yXC_l{xG#3G5*=leRlcfU;gFgZ~TqFzWnXK{kIlu zB8(2mzx?vc%UA#H*F;3-v3K8<&vN`2l?!+ zQlmZ^3Ug$ud)1^lcXAt+Vk%1njWeoUoy-yA|gK zFJRC>!@b7c4jp^ROmYaEk{#1?VlR!+zt8;4b)-Z1N(XW3fe9Gf_3jTShM&1?c^%hP zwK#aN+_$^;>me2=AqZ*k#>JtZJHXm(0WzJ6T8&O|hz|*4k9MLpveuI|!d`oJh-?VM zVjg|HHrhS}$Qrx*f^KT+0ty^)n~gLbMr(Igm?+I+D)lkaH8nV^Zggf>3nq;0uplc2 zE4k*g+Jp|&fz`DlB>#_fBWIkOabi+gdh`htkLg;@kE^5Dh+=N%%3z+I<^lCJsq9>j zraP?^v$-Z(2ExQ{4#lZe3JtNxpze-a-&a>7#8b0fzZ3N-a681IxMF4 zcx#I)bEqOe79bR}3qMz>5q{ z34(Yu^vKGWnGi8&*c!Qb*IbIbJR zJPX=S74#Qo4c0IL;8{UWD91+r?8)G}SN>qDUAPC4SrD0?cAMr|lVqX9SA^Ka)+akG zN~@dK(=}`R5?I^xaICJGwXyux2cvS#zub3FbYlU4U;XM=mp9(P zPgBaf7WD3DZ!T+9x3gUG5YSB)d@W3%cPNi_2p1srxr@t$PB_R|i@8U3nCB*s^W-dWnD=;h=zFj?bHe-{Wz;Df-91v8|5$B01iu%58R z8rNBY(DhY>uXkG~qy<8##A7%!KlBJ3Q>KT*(jt18OpY?5tAUY(%AF9X5;}keL>sy( zV=g-&7no%1Y8b+(v5ei(Y>HoG056!ZGjQD>vTyB7Q7B>J%`HIrPr%< zpjy-B+4R8lz@>TM_1C|wUzgZe|22$NyRE$&pUD^j!x>`BM{^0BkafP)|jY?w%2t1W^@g8Aohx zOPQ3qF`3K*E(@;RQpo2Etz;5$P8a_n5}D0ga^icgRgeu-`@8t55c7V7$w2+RBy+w{ z%VV!52ULb!m*`(@fzd~vsrToBNUfc-_1~YRH8QjNDcbyoY%2WLZ~X4^`Op2q@|8dQ z)8$Y9=&Q@OzxBF0=H*x3rteJn+@F_Ui}=V#`67P;wmk2tIWEoGnY7r{8krrq0r7<|d||;)QvUqU|J?F{559kS$J^hzyzkx1 z@})0*Y58CO$*(Q{?qB@i^06QLaI=ZQuusdk?ZRGLbe5mx{ixCLtr8L3W*(KXPWh~q zI6(MG(9r>mD9#8Yr*r?+^Xy!1{oIPlig@Z-#3o-y-zJ;d(_>|DZPQBKJ&ZDc%X8sz zHY%lEJ*9*T%-*Q|RqL3ZJ7sNCvQ-hiV_fhSF2z+3C79M|GUaM5-OYvO?y-TuWoNzC zk*bxo)N<2rb5<~5c=@a3=nSsK&P+{DbQ=&&@Yq5C8w)mmEmH4M zO)F!sx3j<^U($8*?iMx9tztEKogNh$0-=`Ei++Y8n!&7z)-2&fet=g@ct=e+ctUdeB%-S`!XJmV8J$A|V*z#DUaB|^?yiNf{KYyP?3OnPHm!ascLWqRTJuTw{R zC;j}-|2%EmwvCo9UBXvK_EJ0Vb)V(yGp=48qYD=<(7}U;Xy3lQ^zOUw(pzu6MH@D( zr#tT0O?TgY7j53WnNFWRO;0}gWHOV$6W3ZEJ$jTnJ3CcAUJL*LKmbWZK~(8Ce&c^s z<2vv%4;&b)SFff&|I(ilR!(f)zQH6_@tf1D$Lc{v4m}={N(9nvoS2A!Nz+lO!GL_e z+TXM+^0r{em1EzSEvk>pv4W&g^<3ua@LZ2n>#bX?9Hq!>FtrA?hD z=F4c|^S)O3d<_e}@YT04!mb_k0r%;xG;?$8U<>MGA=82c<|{fWB8~$)TMH-$(FxO* zVMTqwxKg+Ewumyeera5RsYOdq7&S<(mkuUgIGiN)fJeQ2QuHfnm@1}asle9%Cg~)l zLxM_ysb8KJh0p^203$3NhzVmuO4Y?Qo?>v~o!X@j!rhA2*w`5D z+4DBN_~MK7gCG2W-gx5;y8r(B==}K$?3gIt$}lxG#mSV%V}UqUkt3yIKLjC53gmMR11zTx-W~L-pnv$X@pLVkQuV1AM~X% zRGLOJQ*-+MxK2JM!hW2siAhUY$H3Tl*Xg}sqR4~*k+KRbfR9A!wZ=Ji0;lHGCFP<> zD#fzMrg4;F=YpBo7|K;raLCyK&@(jcc>5i^8pY418@{)-g&kiACCM9N_%YJ06dE2j zPxJCukErj~j;U<>ItgXknuG6Q^I;M8_F`a0LePC%X? z9R;QZ$(*;TJOY-gO9kjAI;V(SSG9csud6V|YOP<<0)D>55L$T|v&zjBcaG0ixOo1O zI(+f2yY7lQ7Gm}o7#N_3AAU%kt$-B>&p-b>egFIaK%=9hysBX@?cRNdT9shqPEJnJ z4}bVWwff<)#~!8O;cbPE1>j*N!}jgl>CLxZqvJ=;(vDr$_6XJd3S}JqWKBi9CM1Zw zKpuar=!*sY%zVL5(_uZOa_t*VkKFVkO7VCrRvcphw*EYk#=e$B$=8N_w2hQsMK`G? z5|aR>bQea2+^9gmoSY1hf(S54GZO0~>>`xSfNge!FCSLIr{|M%>MGE*PBQyE>(22C zvDBkhgA1bMl+833BSD2xXIopR&el>zRg;fOy1@v3~{{xaY0@o zU2{ZbOVbg=Wpvmj-NCg{7sL5FRCLyF`s8Ro)`XSC1yKPjS2&zZEy%(d7cN|KnZy3= zH8qSj9d-b`OrgPd0mrp^leT)h;1v|DX%SRhC!QSlYC9)R~{_;y*55UYgVt#b}ZPk zcXxLaRv=(Y#0Ng`2tE7kGxRrq^JSWunO3VDuKfjVz8w=;b3HG%?6j9CQ?|mm-jz#(aE5JzQP!{fSk@ zIO;8OH{P5z8B+x!S=qoeosWQkT~r}Qpx~L~LKUcFN3g)NcDR5}vQQ};Gdsva;U_i^p3QY)r%K^qv- zddrNYS_xbE_VUGyG!G64`kRbC$H6HKI0KasO50ccTS`O+ZNqU1lFecxsQ185+{QR$ z1B}K+XqCY&#jysZY7j9;iX2HAL8o~+z?N5iN=mb!gw$Z&MxwawP9rHVG+L`x52>1g zaU-sg#5o7GJa97X*l{cU;xGOZef6tfrEh-oTk4=jY^9i)nNh16zW(*E(Nj-7MR(qL zXSO2)4v2|~Ycw@A%Q(Gd(Q@iQ894RAgu-SqEUW2u9MXi3jWfrAobj*AIi{sQ-VFJs z+d9CzT%r^_5ML4`Ymm6^hNjfcfCj$Ex>Vedp_Tdt9l6%}T7aU@OKX+lm6N9DDK?~= z`{3d_4$w~evfxvdtyL)7++1g%fz4G})-H&4qV=8uVnG+Zf?Ft~3(ey|UriUl(b!8W z2gSLL#DppN_SeKc;ljqDEQ5JbV{H?N{%X5;ls!mJ6-;NB1P{3!6iAfeQZJCx9<7(R zMZjR10eiiKi6Y(#Q|7i5o#iWXPHedb?RrKrrGZ z()nZHp^TuAs`HLa(#Y4z70@qHDs0t@HeNP1E6Ac;m}+^M zOWO`9=`6Y`&BKADev!3l;9d96X`Or=Kdf|=7;#N8Ev=7V4*SL{Csba1l`AQgw+u2B z;CkOYX1;tKK^>48>cOK$n6oEu+nG#Tg3zrQx=Opd^s&-)$%me=FiNdur9w7R=>`p{ zeQoEyARNpVvaBlsZB=-{uS>F7vbbCeLSDO50Cht|ui_O8gR55ZfsI$``0*1pI~R;G za5lqF{KSvb7r*#N>L!Sd8#mJ1Z@*2?Jo5|<4-eCW4?aj;UA$^BhV6;T3Hpn4Z3ix!n$5G3;Ayx6y zsJc|Gw7x`YN)=3)eJF%|`&Q36qc>(YzCFR)=B0BRv8kt4`-ZvZ$9QE(tx!$(O^SkN zW4G;(>73H8p0u1?uxc}riIHMGmyrO>z#zP$Tdht!)R3rd;T zhy?i*v3UT)lr1GS55GM7S_8pCLMRvzgHlMxi7{KLeDb9*mPUr8i7KEM-!xU;d^bFvB23qJmtMU@WFJzH*+a;^LMW zpO{`-mX^jF$M__oVU!}fCg%)6qJ(OQ1TUqLQJn*Bu5dyF%3YRdMurq{+WdaCPf(JW zVQe5VOOUT32`lEL#~lz$(DR)R+e!ADZyB0He`aQiZohLU-xl!_I~R^e&q}C960~`6 z9<+0VgB1%nXW^?~{hE4z@WBVvHJ3T`u#E!OTEZ!@am!k|b?30-Fhj|eR#C~NPERe9 z%{Vh^7t1fCN!KN`oBqnds2!YQ=hMwAmttLlEK)=6$PtxPQkjvs_04EwU>7$Ja&pd- zDQ$iYY{6(7c_SCtMSZ06XnVm@kK)BvA7rf^B!3k-Y$D|)veC62lLVecc~)%?u#~sb z^eghomnHxbBXk*0@c{|stpp>b8#?$cek9w4`3S4omIG~;#gDQgR1)l)6d6$Iwb5AF z6k!AbuFGSWDbKk8K~Yp=`*G5;+JitqDwU;%NEufBQ%D@CX$Xxf6^M`lQ}r7##V9Bd zA!;%PL{cWv7I}?jnS*}8pxPZ+yEHuTO3>lW4N)+Wt$;T4 zjh!D!2~}bZ9Z}6f+S2g5S3LA~2AepVFFQ}zc0Lj}wr-w)sEuROGw*=$m?TY~Go*Ei&QmCCJBk=tmNIR=Q}+#CwVGLUnS>#2sLk&$^Da*g3gmXh zYm7LGl}8wHUR1!$@5=&!#TLQsOHPJI%h~nOHEg4=j~vb5+SS>?6Zh@(@(+JRufF;! z;h@E3%a%o1Pft(twUpSN&=G8FKpx`;iDSo(DLPmQv3vJ!I&$O)?cKYVZoBO^bvA>2 z-DHdj=;MIM=bn3x-rBQ=)@@u(pZ@GmM8-cc?CRrC>j9TM zM;J5~{uj@5zoa-zb&1K!WgLBfsD~XRB$q%XC`jVB5x{Zr+>k9r@q5_sRcxo}VZ32c z=2v}yUolNxTAWNu0VmVqtM@9j)woa?V?-G+i3$}!SUN@#bRI;LtVpRD*W*};7bMGp zu^0!h5RTgrBn=OQeY)*j}$Y=YRhY|-QSp9Z3v`GTvF*at-^N@5Zf5& z%zw(jEEE5#tv8(4eqBvTtS!QnjL_igl@~3i0VtHZK?&dwURL>Y3K43tTQ6#2?9K{G zMMEwhKCckNvmXaT7@rF4@7uQ$20lW%&iS~F4J+GLSQik7jt$6z0_xR9&k-D|qR`cn zU6AnbyKUUEhBj^8pjHZCwE(s*#2&0BxOC}~x^8l0WQ4}Yuc~(9+O-MZRxw6!KA_E5 zx^xNs+|T_SZ)w=CuBe=tn4k?C*3HM7jY~0jaLYxs0|@Dh;55@pp=vBnf2q9QTl3eRVGBrAXj| zVTuoQ4%_S!h4PQo9e{%48{L9{j^_Eby4sKNlr>v?QRqI61yH`zd73V@6jiA6ayJ`!?Bvg8bi(uG$y zLcVvpdTnsPpEQZWF@Ou@ku2LdIdk$+=BDL!r4IV|$Tky)GNVgX4SA^cC^MozsWY^c zMgen^s(-^1HyP-Q z1{q?R!4$|e<577~HcXr&+RbEh#%MwoDZ*06q)ZnVAv+c{R9*@KLnqi;>xTBEG&nO3 z2FB0PNwwonc|yRB03UZnOtvyr0{V4G+tV&dkgNXo7j?krRi&s3+^JiJfNeUC^MVGd z{EKwtUg|-)%gM_WjqEggqELXO99acv&5efL7EV9e4Bdy;4bUBTZ>J-Nj?rKKQ@`Xr?TTNwZ(WC3D^UBvdcQeFx~QGH}W5;x1dS#p3<{Tk^hm%vb(WJ3~36jc$>0CPSR!7@xyl95n% z7Ipy!hSxBu34fYWOa=#o1C9Cu8t?*bqY(e1gS5j|QiET?$hKXKd`^9mC#@(~$wx>| z;(Cdu4f*n4eA7#*1XJwL$x2qylzb{KmQMA`Vnu`ozq!0s2@1r^8SqGA`9$OJ5|l4( zj7lSDzz!0f81HK1v_3gnRZDq3;hSNZ`INsx`}W=234f^vw`D){!8_=+m*1h2$Ij5# zzy5Xl%x8X@Fwu`a*xJz7*Qfqs=_YPqV1Rb++{vpJHqh&@zd^tIyT8ZVBX;u557Tt! z%xSd(0^28WOU2r?L%b#9F?KB6OE?5_&%3WsUq8O&yH_C_+Q^}xzc7iV-<(`jtxysW z^@O34FdpMb&^T(7WP;UuJ|SQyDU=aJC=q};3Dq_j&zHH|FM5rD9b>;E57pSU6bZ44 zMN0{!2r)KtwAAW2;~P#_<7}Hc-t92Pz9}9Ijz zD7J;$E>7=Pi^vTxhL02t3G98IRW745X!?IdhQIH`rie|c-1QFObZDV;F z!xOmj9`Rzqq?2i8Zh3+$h!!16JWY?op^Op0um9P1it_5G?zbgHoedBJu{ z0x=KRc0wV~%7aXG-`#V7e*6FUgG}faSjz$}3)~16xPA99{jdM$uL`QP(Oa**Pk;KK z|BjX}Sx&$33qMbH-+gy*wt_$;NX80>7hil)T}^r7#EH_@3G{LN9gbH#?AWn`9)J9C z+O}=0y1Eh$jn`g#mD>9+)3#gI2J}pX>S|4?KIg6Z@snH*UHl&YuxX1 zzmDOIafq+6FRiwi1m$DZ8usk%lgYGy&K2H1=~!5#Bh~_@nz5x%8f$CW(s|%sOB&Or zL2;~)Z5Oq20m~-J9tV|45VlgeYGaMUkgo1|4T2Aaa4oXcidUufYJw-oCsqW;7bXvR zQswB3d`ioU)O1dQf&`H#alKGR6G@tKc~3BuXaLplDCL~W%weE0~Tt8kIO#?I2JRjbq?kJw^?Nwt|+pFMky z4j+Gy9{t$uMI`g$xpBq^fm9of_P4low%LG6ijoam`@8sU4N^2f4CpM8$*~K@UecH- z#Y^#!1j#lh2;mP@^%%e%%OcGmgK!)=Sm#05k8=Pr0+2yzmw;^qACS-Cl@Oyup%L36 z(p(a$8I$u6J3Y?J88=Be1fGDAOM?WJ!zt9zjlt)4mc_SKhI7fKlM{k%jn-|{sg{p1 zcQ_dE=&zp*D8QhZ(dvojVWo(YDexv8BWM{UYX2Nn_ z!?v=04ZZlUT45qkL8I~UIBY)*NQ_cEbQNXygNDVI^kC3(R~T6K_}2g!^|CMq%2 zdIE7IBA1zT6Ao5@kjgLM(lFU}0jb2JoK1px#FbWT7HKsG2E*dPra4t#unQ!S^8f}( z+ZPamSpd>{S{7(o;0Ck+`eTg1QcpK;b@;%C@1w&9Ptl$|Z_(Gj_I3LF=YLL}qmaUr z(r`89t+(E)Zi_%aTXbUtuCDxtAAFxS?pR6fy*=t!O^J3gJ*)jqQfO$R*d1qZ6Zlc!ykyZZ7{=VID|stpga z+QpIEhm6&-%%hE0mEplS*E(~-XbxoqNlaq)ucpw5q8GCCCx$9}8qorWtmZLBDpXQB zESzIs2?m8s;?*cKNU}hu`paIPv^la!FyNE}BT0ljXapUJ5As>c>xEPvnq?Q5CBrri zDVj~xNi0*%ltn6=t@M@!S{7J%7C^fw_f2az4ARGb;$iypKYE6~_r34Y>eZ|0si&S& zhcecylf6R0r-dyNufF;kjf|b9M|bSZlGUeiQ-mARcQwjV8GWsCEJ$OOM#-~K=pd8i zx|RpCP;_dH99bp7ayB%E>y1JsqrNq&eK2{ToeLOOvu~p`ImZ}V@u`=Y!q2HFQU+oG z>^^Pnp>T5H3+cF2n-wyWhB{OvV1H`H!7e7xDtP`I=oo%}nh96(-o(t;uPh7OBxRQQ z66_|TE9C*Mb!}zBjZq+^yoRGmZbNPiTeP%jS)gTs`L)3AdvB$Wf9g^C@}GZ;4|n{A zy8YpyhaRf?{DmT^(Y_rxaDe{trRV60Pd~tp3~8ld5v5jqvn{aL`X*Uk*@CUUR<_Z6 zLo^~E8zrMSHDgBJBK-(!ta^?_U*{;;nO83Ok2D$e;fum>EY#~U@8x8)N*%IX7s!&{nMZODf;Zs{IhxG(IVcm zK+6Knv%qit*8fKD?s>0fhL}7(_G1swl}n@a?Pp)0zy9mLrsd0*t1}Xcwlvhtj1i9< zIZEI9_BZL)J2%kKy1{x#wQyS&D73&rnvfO>S#<)&da3aqM&mc)h&-h;jJVizhP;wa z(5v|mI~PhP8kAfl$_v7W68aPPP_%R=sC~t4)q0YPXu8Jpp%9iD0JQ@oR3aS{?8Sn! z#OIzS5l@w9z#ElgyGGG*?HiZ5zE~|ObV~42OKKA7^@-qNOMH+n!9Xhs#$y`|hAT`$ zFL#bSQQ}r4%9SLqRHiI)b-ji;E_1m(*Vz7W(>Bw~j{gEoqXy*||-BJyg9IxR* zZKbi5jnU4lO5tF*d})kc{^48n2Y>K~^o1{cfpDusBOlx#@ys({p}`G3bm#rIs&=B0 z^lvm;IiLBsxAoMHVfio~N>(su9L=S%-fl8OmYkkcY3z)fAXqKJdA3su+H`WHvEhpq zltxWDXC+!vdNKd%Qdn=tzSUt@2i+{4s*|cdXs=ua#JFY$mC3b(4heLGWX-ljiD5f& zXq`S_tb!TdbstC@G(#Z-Vk$J_>9N?ESfmgKg`?P7(W_oAO9@@2gHyt{7khb4)i_!)Yq05&p z(fIf{t>Y8m&zw0!a1`LK`=dvWD3}c!H&B27fO?;rno^F5ZgyZCc>jG`wrm;Sdw-6$ zZ@-0R*fG)D+e?#tjUAjAc+3~mbLY-cJM&t`UsB=Nfa3!6*9;92PNoM>(8e$RFrm73 zZ9?@KQ&ZElbmxyTxK+q$}+wfTf}bbh#4 zK9uI=$9iFjjR!ujK{l{!-;kRmF483!O|`mw3nghxjFL4^;3PwBIe`!tm$1Crb})B- zr0Kx5Fha3Pz)_r% ztdJ;tH3uQ_!R@-X^8<1v85d9lUP>pWQ30+UZ5I$b-n=iI2D+3>MzF-Mq*DU5iX?Ox zjd&VEM=B4Hv=MokLnB9)Mp%wZggN}BkX(+ug~-(# zH)s^IOdIWa>rL9XcQ0)l9;VUJQToT{pQqhCf#~Y$ra%7Tf1%HP{`2(cV~^93!-r`9 zzWwyq|Lrg77oPq_`q3+|&;t)VNNqgX=^yB)XJo14Da}C;pYgwSF7J$=WgzL|dqbJx2HbC2lx3MFQ$8@}k0QGY3 zes;of{ki3q?JO4$0=YULKXH;vfFuf2PlT=BMfL#~)YDJCQ&H;Of<@^vWwgqUX7tnd_LQkA3{ddE3Rx z2xKd2ek{hJ(WjAXUmwr4kxC7#vJ14JLTq12URElt zwXBe~OTAQNJ~ zb0!8c`qv|_Q93n7_Sitmr(Cp5)P~EUW5dVa!}8$r&b3{fdL=f8PAE$Szp-y}y_O*w zB~eyBrm8Fp5{w-p!s&dK>TLwkiOR`G2O$xVWGQkkw5!Q`2Y&_a>crRnZtCvoRuhL8 zp8p};d*6NZ@=GtV!{8x$^wG!ZH~-DQqECF{r|6ll{2e{@99Stj24$>II53$2wfSnk7-`%TLEcCO(VIAY(%k6W| z{ebb;s%!JG5@OxD^>jZwIj&tBXNSjSwN+#1PQA(^VZ>Ha%L3Qc0%N1&yz*w6Caz6c za?G(qZAPtJz?LQR%(BC5|N95&?RWOk(3(|hJ5#3`>iFXwV03V8>@ld>zi+>`m$nRT zr>CF3mv4?(&Gqbu^k;weXS|B(Abs|;KTB}(SOMLlH)>|jq*(DZ7WlDeYAL$QzTsR1F&o6@Jugq2FcLGMb-Ud9q$7|Gi5 zkFhVD$kLNKTt8<(tVq>(5p>;|vIBA-SVgtyc8J9fGX-P^N2IV8f$^c;`NvYy=Y<1Yos|?nx z8RG2`$JN$>yYIe-_U+qC8#iv^FaLYhvg^LSetP(kN9f0Y@)I;YGff}-(4#bZWmK&w z7~Ve2UmsT}=R^m8fgR^b{iaQuXcb>&hZPQc-h7kkuTf45Y`>U2HA~wc`hW`W+O>;5 z@l&6qAF_kskw-pAx88aytz$V(oIK8xrXl5=ILzBKFuB3Dih=$m)Yspq_>GKQREN!B znf0MV2kDMGcGG%xENtDjP1R{^ujuOTqP1&>loKViZY!o`frViKOupBx8&XwyDQ`o< zY8%tq_H_5q8ZQ6KmhrZpQY6krxbu$NXx-2n8XR1~<=Y<9xH_S|GK*&2l;Y5Z^CNV4 z-*NiL!%wQZ^T|(sQaSCu|NXybC&P2RlHpbQ=tnME6F*72d21DL{^(D>NNd)v=EEGKT z2@;wY%7XOB5E2EsPm(F*LO|t4NL;R5Nye^$wKaY2K8#DS5n~5X%o`iHyh9yX*4U)l zLraz#rG8E>fR{(u3#PxlYn|oKRVP>s#WItTYXukb}adb5;XjfkNA*>0`WZ!8R1$?XZJgMF32al9Xs=Gk1%bY9hWV1AiL zZu^ceY$uZHPOFsUG?*PtL znBa2|uu{RFkkrci;K2jDZR0S14ZWLI4h}ZRSy-zyExeWmYOnx*E$Ze~JZKZpU(c{} zVVYMeun$3#bjE8&F~UZA($dW%;eoKb0O)~r?zN;m+q`UwZGPEJnH6?Q(t zVF~8~&TaX?2Og%Uo_dO%g#G1nRKD}w@6f69$LJIPX0)=Zl>)};_)}%PmX;B7*(Fqvg(nSz3m#s&_4^Ry@oH< zjk1qB&QlY0KJO*{pv?GVK^tS1uqr`%g0iVlD)z)%yT=D{Hfc=6^?at78^%m?!NAGY zyBNEYqQ2XwRxVUP>wII4yqyO=L3~J+S`Z({4{HlZRM4Z8@`QPI&dyCn4DMHy>W!-_ zeTk7TsT1~jIf)qoRfIC&BtD=c8IKFzVskF!WPz%v6%*oE4)@`(RZCG+Lo@g|E`?TT zaaaJIS@j)utdRMg4$6mAMq+d%9KTKiUaITYGcV*eCQmw9$FPp(Q4XQ}yaYrnF2rnP z47N`+`WYVHPWWp*EekAK3vin~!Dob&A0F6YK#7)cVv6f&sUbid&N-RoFb;M!k6OjY zY4LV*is@W6pjp48S4L=Tbi#p!GjMo#m{&AyCXQQgF=qh5RSB|dlM94%d@4}6X5U?HjQMCwyw z{g6eYsjoTx1@sYg%5awGVj|E9#>nW0Y@8fBNRT|mZujUDr2z;oTW#?xl#emnu1NP`Vx;XjxiV>*)zYYw2enT{$g5~hak+~5v%6zo{ygFVeF{ac2 z6D7oNLwp#(`48~?Cl=?zq#H#ScD_TBee>EOK}uzk47=D_B9Kfc$9PrZu(bexxMjht zC_tHy*@F8V8X29Uf!+@4=}NbQ_@WBBShihs9i=TdzItB0I!;UYdiJ@J*q61>Owiap!~<2COu&AJnhgZo5rwVZyeD3w&nE$Oxa2GI>q4AA`Jl2+jqpjKr^xZ_`2>Gs`P6 zMz369o_sEZngsa$j*Zdi_l7mF3BgK(`UHeN3BJ-EM?uS@{%C4mr0T+b`}%xQAevwo z#ln{*PmQXf<}fcv>%`yRdDP?E!sisPqXr7)8LN%b59(u@P8z?S)KI^+8BZ1kVkyC| zbL}`c&pdcDApqm9LfN^XxAJ@Zt)MD$)(23{P184=^{-TBw2Q~V(ZsDNjBPCDNKrvA z&Tn@u3XOZ^QkONijdL_@w>0KKE2JBGPe+fe+4_#M+&MP~&$N%=hdl}$l!OT}Vlm(& z^NL|s;!sd?X{6w)p;O@=zNL5=Xdeaz#H5*DsS-e5{H33u5(MB}nLOquZ*|=$`4r0s zb!Y-%y$KWuI4!J*#>i`IRiqoZ$hib;S010PpGQUf>W^F} z#^eJ_s=K->@VJU^|9kKA9`jYIHsS1;F`mG{T39v?9KbAJzKr*puPi%4perUhCr_TH zZNppnY=%BWwVsv*S{6X<6eo*r`>=UX|VpoRCYGE>(Y9x0=}e zUtAk|ly7%Io6ymLHh}vVj8RNOlTWHPNIqS?IS<=bnoO$ko0|u&Y~1JglOY$N_K>oJ z%^UA_I8Hh}o+;`hExJnQX5~R#hf1uu=+BZ*^*|K}^%m5lP*2?(R`7glVpd=#a22R# zz4`KDB|y7p`nz{GhIb zPHcWw;ibl;-n`1ysBxkCH$AW{Y4a;#L))Zuz{U`6bd*;jqd`cKil_O7%7=nR8Cv;h zL0A`~Ai5mEI!X<68MfXR=xi6VkewWE{#ZHAH!&ctx3`C#3%yK5+YTZv z>FeO-+Osq<&VN&Lyf0ikFgrUmjA04qKp!8h2nWF=J1ua#Ll=Mfgrfko^=gTVb3uLW zWcaJ&<7&?~iW7Jnrw2T^dQbPHIw2o4%mZBP3vZ&y4C~f!%K{750vM2|#}E+RZHusq zVEb(w=(~K?>#9|Qv}4DPsDq(arBR1*e#46|zC;^`SJ0AWXkReN;r1h#2zXr7QfgOT z4}xjPU#eAq*RTnDs&B%_pR~M~+S&`x1AVk*V$n{VoX@dU6uxX|!`*h=VPXOz2y9~8 zB}UgyH-zWmSDi}d>*@2U^d*%P8;5NdEKBfp^lMURNzB$ylVzE*bfwU=-T zfF!m`*bla4Y~Q|3IUUCN;78yLln#J{;{fd#@Zd;*jP|o)#d5VQ8_tZ@)3QLz0=5Mb zZFi&{>h0^M2S2!*{^rlWO@Hwhe?dYCru{gms^u$RmX`Uwwhk7kvCU zB|w$`fJP(eRLM31uBAxH0-a0Ftq6W4%Fk;#PeQITPK95i-$LH!_zt3bul zLTgmu@#f+vXeUa-2Mxg3aP~XW@i;_v)J^bjX$^a!rm)I%>0>sm=8nz^(Qb}}oQYSx zonvz?iR_M5jw+>K67WRXPs$ECcC=|-kM|rIQ#w{7b2E8Ct{i^V$Uk4Ojk0f!e9f_m z{FSd^I!j;Za*Wa-7=MxiMm>rOVYBdp@d^rzRD!@62-)EkAmVWSqA5cfv9DV##AEHfL*YVsN;~aj}gkNZ2 zym5?1jQra$=Rt&aHBlIQiH)XAP^6J0p+|r1y!y9n>m+G&h0ds&Q}7Jz0{BhmH4Df9O;f3u zk?ADzI-Lbz*F`FVv2#j%DGzdJfWAa0B||l7x$;y)vjy8c3#j}nZW5 zd51P^*g#wPkcCZ~HmMsSuwn=+lPkFu$DgYna648uC30QD>tpB(FTj-#U@!t^#|!rA)T6%)5pwF+Q&)JkEcmrY&DiI ziysD5EH2KoFjhI58bGIzK@|z?Sm^M!?1a|Fq|}XdL$C^B{8(2G|Kp~cYC`GBuZBwV z0gP;2@Tow>DOS=o-}(GEEt|gBz(u!0;s%xs8de5b zlq;`_M9gq*oG*QaK;_LZ;FT2XP4HH?!3$TUcUe|fHeG4lxE#v}b&Z7v%^XU0p#hF9 z3*Kj(7>)>^s9iK2cy;xnW}9wEA}@xC71_5$0C&~8I)s$*8EGeh7yLBvomT76jmu1$1~1ZxpZlSw^7Z|(7ILh(T5(SM?ZEytsYvT7~q<_ z>L01y%UR-XwHKbq?ypT~Sx5`HgCxqY_`v!+7 z0Qc=4Zy$^W_UBcuMvM^XqqQ+`T1pf08C1gZNP}tQlyP~sBiA<;%U;bDw=|Cx#fn?e zudcVa02WCerHLlaX!B;lC{3u{%I{8;)j5uE<;ywH#>KESsq!^J$LJweC=79n>7Za1 zr&h$38bw9KZ-5PYSyrj>H3-tLB(anpqaVkK$J+R!Wo+O&-XV!Jfs5_(GRC)AOIpQn zY<#@OV0^lM*r&0O!nv}>^qvnrVtgbSkuJgbWe9ar!imY^>ny=Y>7bVb2=_|aN;r!VPY9)eAwWp_>;4r}9us95M-Nx0lEgz3tWhE|g|VUhy=z6>r8xs}%xd@4Ndv!XBzmzG9rI+9MlbYU2y zJU@@aQD~Y^NOk^V{7H746DDx>$C&{lWw5?cf4sNFcye2pkdN5>?6 z&DL%rKQG;|-60n8a>{%N1&Th1Dq~LmBj7}YgcQWWDHEc7mC~*~qe?X(GPEy@<=ayV zM+EWDBM4|laK!dOl?V^fmkp(1o@`eWSqUkW-&2r-#eD%vH8?0LIiy13H+KvhPqm3` zyIdztvkj)318#MLlg^thNt5`M@2rlil%_3(iLJ8}h^$2-_g;ysw|W z_w|?9xiI38>fjSyAARC}+PZxMtr%QJYt{}@XBRsX_`H^Gb~yVROg=7h!_ASvyoOEr*QZfVD8FP~SLgMUYI^Ue!tHhdU&DkY(%`CJmKF9-<|Q+p6Y^TEB4%My zU?{sW9UOU#P+?>#1|>1az=Z^=N)W84^pSPqk)RAzm0U64obe`Xm&&6U-7v0=W`rz2 zvOP@D&IQL@3WUJ~N{J366s(>YAR`YWs661L6dko}G=g4rlrwsaV59uT9I4>MVfUHLmeZ7#%!$ z>**=A6V;KJS7;R7iHT`ml0M7ZTDs?z*FqrML*m+jW3;GB;6(eV-sFg&5c~PWv zUS^Yx1KMS?1mUvgkfm}bwekN}0S8W-it}UR{N^_nqGQnIst`6_mPSe-H>_;plc-7X zbd}X4(XiV58^X9IX%`w&(o?F0&Di(Dw#9$WW0rxL=!X3oLWUdXC9<;|&E>(`V`QM5 zUwER8d?vx*OTV?k8$ACP{2~p64c2BH3yAdPvjKD84UHIlEX}DdG5abdENVIREvMf4 zbW1E^GM2fsu%^>9a3-(IVULcAH;H9J)=S9%2BiG!#?R5Tg=1a~Fv9k`Ne_R6x)g#i zrH~fl%3nV?S+3g=!Z&$T8gDw?6>=SWpJ!Rdn<;!`a;%=? z+E>2nvGn*5D7)dALZ!9}I0nJ`9l0<{lkCv&pJgkSs`D4xyp^dHIDgU_Yndw0@iz!! zgo#6B#X2MqfX-TP)a&wN;LLA1q4c8qiwZnWTW_-*=z5YDAbAlL-d;j}5R6RURmSq{ z3y`_kO5!pCzW~S2r;2_W5`Bk_6M4s0ZQG6tL_!MbC|ja!HTL&^Llim2&~PAGHbE(O zMF(_o^--todn*_Gx}~zItc)Xo6NrjvLA3ElJPBqN`IrJ?@iDngf^a@o+80Xz=M@xE zR2<+Y1Ttii@*4HH34J3WMxu~}3}bBkIra3aNbHi4vVDb)H7%PuA7f(^n5Y!ub3 zFt#ojZo1;%CN(k%DYKKnH|AV$2TKBl{)2BWUv$CFwM8j3b04Sz`9}t5c3`V{{_o#PSJW zm(QF!ONR~|rSoSl(Ad~GFVAhKWqeTCx{X7$dGlskwR&Z_BhiyZ9Fi(27Zad3&h4Nv z+4H_6D?9kcDW+#q(o3EJRn*=YUTHl?MlKN!Wm~sytzp^vwJeaf9^V^1Jxy0e$M`h; zKI-8sHtpx!x%29zee6@mgEBHbJ=53|^p${;l(tm*9ed`nH-2hrN*&&323k0*50ANK zR6{SUf1z!T#xpZ|;0!%)jK|bzOB*#YE7lK#+qqyuWZ`?Su-VyD7r9NCbW%`0R;?PO z-o7OqUvXwsfFPSIpBkgOQ5EpQx7^$Y*%X#{DkM8n2gxa<{6r&B4)} zQ({Z#(EuJn;l3Z_WVm|Drm8QTu8ObS0I4b=ly z37v2`*ww@M(9s=`hKlZ#o= zCKn?Q4y7fuhl|VU^Tpm}wD>|QFY7f9v>l&}=RX{R4e8JvTv9 zG^T#_$=CH|g4CJCsY`7Y+V?o7iA6sUdt$NIu1%=>=zDv6%S+1JdAr0*ulz_I(6)X1 zHkx3VH}||vt9c@^jjyEJxN$wLS-m>O;)aYH8M#a=RxFF^21mjKZZIEgvp^b;TdF-}h{ zWskB~k(c<|zh!(ipm7G+keC?4QG_ip$YVU?$#;g%^L2sCmMx^a)JX#>;fq;u!b)7mv_*zq((J8r$jX4SNJI6EfTws73U z93Hc*^ZAPxxs0wV%XH<+D7|;!Am3tenXX*9Qoi}%)?0>Y!}@h)xP|&MK7LK*FAhx1 zd17_Ff|pLM!0ESXb~>FobzZd-b{ZTsLmP&us~a*E(6k1w3b&?4v4FNMO!j-dw9tpR z;~6&uK``3(C+F5An-R1WvMjMWZL2zqtq947nU(rI118Z_`uSrmItWUnzAZI=MDMt`$GZiID~=Moy;83sL5nt9MekWTKWFe55>Jka=RYe}jgJsaN4$FO)@fZoaJwp<4;Q1v2bsCT%{d3G2?R-aOzA zTV1PSsK$Tgj+2X()G@KBy3)mY=vYivQ|XOMlXSvRrU~t$Qb>}eaavbL>BZ-MM9==s zx9A+7X1-*}5_<5#2WiKSTWR&`H9YC-QUl}B(NQ|ZlcfU(4$#4a2kDt-o}q7l``dhv z`+9ov$*1ViM?XaUovV2B!X#aty~rNj*fxghVfOt!l^QD#GexB~IQ zg%QWOFvd1`|G+`zJVAYjO)gv<;jv*XGd;~t6^k{#eC(lSBBm` zqewV(0EIwe9x;kL>4)L0+-LQb1tiA+_x)*0fevPULB@DObGiW1E=+78y|ip!4}JxS zG3H6hqSB-i%s^`FWUHAXYQt6g&ibe^ShaZh@Q@t#m(IOVH;|;7)qIu?B-HbB4Y_R| zy>bB#2HVC8!vG<{PBf@6o_U|AU&!GIR>a2_#18`x#FS!1L_{xVA!4-&EM82)YRN1% zc*%>LqmOokrSnmy!`2TPnFv;vz!^Cy(LounSEY#fVU%14R2SV8Sy(#BE)0@0c<~2! zq23uW+*0B&w;%rf%k-E3-&fRXgkSolU!=z#dyJQ)_a_P9>+M@_y+tp)@Q<{A|9<-7 z7r#iaz4jV??sK1|_3PKuK*uT?n>oYXK)BC1Nw}&+ulLBxLkurWJ0EAJ2OzOB9>xu> z)OXMOlpg=kBZR-!L%dpJbDud(T~J5{|7zvFG83 z>XSD{vzoZx9=19E6+O`Tww>;(igjy;=(C^sbP>vek6+0Sp!gHkX+34Dv|E4(p~9Fr zed3iY=jr^p3qf-Kl0I6oY6-WI?ska^VAyxXrcl;Ytb%I2Wi^Y@HqmWgjmGH0%)4RZ zhfRF&%VUrnc_f|i;Y{oUA!kZ3PUjtf{1gLW$mCxusG&U^r(XwSPfIoS@^C!kV6yH) zp#5-TJQO!ofvV%~d@v^ruryT%yfA<~lIXw*lzcdYg6$P-OVHJr{4d*191|sPchM4H z!Y|1yxgQ`CF3*%6=v2%NRLoy7B|sz}0QluBK!C=Q)&WwD5nNuKdQc;o1R83DswF~w zg2sMrN|4P?3iAXpmGaPuOrODWCWwG(Copkk>O|e_` zVl4y=sk>DJ3c-GU;~T^AVPd*VodHT_aiggzg0~>9YVIUDG5HpIoMd0r zXVQt2XXx24e}{JN+)2OoYrm$Jn&;qRiTXniJ*2ipoI7`pUVQOI`pQ?Hp@0AH|8M&B zU;j1QwQCpkwlAkEvnO-N)d&-7vvWwrCw(?%tZc^OY@F76<1K(b3}4C@(gUXg{)!%~ zTxmUv#RB123zLT#$0;he7xn#-x43>Jy?#?ob?(HDQmfDeTEQj~`UIHM*pF_|@xO2HweDN4*_uH9dk z;Pxqy!;RsHVz!z&{tYHsIY>UI*p>~@328x2GtZQ6AIq^XR1lv~i~z;gC;&i20iALg zD8EFpOOY{Kx$rWC3m*$nYmp$9yRDb5fyE2|U zewN0^uDOvM8d|@K2A1~mo6XAylcq#z-afVK9oAOFzqQ*_>yV~_@kJXZM9HNKObO|Z zD5<%=$BWC2Ka{)BE(jn>L*AQT>C9;UmJ2^yf?ERNW5UXR5?N# z>U9bx*Qz-*l{nIRHgapbWlvUu4hC;??cOksRf)QaFqBswFR*g%gvx7Tz&B^~b@! zQeB7r|`=&6rF?b9i@jKen@SJ$Yfmzwq?r}`ob6fXZro${{#AyKly*@ zU;pcWMSVSkG&MKIIgry#7m{8e2~s&)AY!(}Xj!0Tfd*P2r|pWj4U>~obo}rsb-1f9 z(1uN`sizk!U~=gD*d~l2vCF$TJ(=NO?JrBG1axH%sYo^f5lK_#k(^*)WWanRQ3By0 zTZ%X5NaX9Q^Zind1ANAk&Ve8t;nTnv19Zap3U;`q#As8&LQEx8!L{F{bQ^ZQ-yyHj zV!nAn?-VbjOL-~D3+I@uhkTm|f0hjB_z^5`TVnN;5(BMFS|>fB_Z=CQ4yrEV!+vqO zfn*XNEYZO&Bgx{ac%J8!U_N!?%S*|ASi+u1)am8jO!~FWUJu z>?M2%V9r5*IPD+&aL}RZiWwib8sO>Vl_WSQ4)k$KJr3u?UE{b(0b5x*7!UaP!(n`L zyy4pkiI+Y+$16ufZ#8T3%+5HJtK zPq2RAi|%&GKtJo&qiUJye?bE`4}hz}W!aZ7pKjjsU(Ex0kSlicfkX$lARrHCU<1|x zHzWjmfF&ZW^c&CukpXy8%lM%B^2k-bDdIvfpziJKp^aPCahWaNUXx^3PUOnvPh`W{ zL>YQvyu@u)kqvFH1cUtX^Qb}rZ)*O*?EI_>?~Nq#1to&}am1v-E|m;8m~QjgmJ<4jZP3uMHE=55Z5z7U8jm zazKDboR8%AQsrB;E$U62eq8c+EO^;k*Gf^J+oE}Ns;f_Is&U?}*p>xa7PuiSAT=8| zZ(}gDZnc^~HZq$xY}i1z@-=(7U80T8+FsJm2R!mN^ntt9(yOn&N`LaZU#6e>?1$<0 zyM`Odw&}Ev9y_6~7R2Pa7pMR8X!hQ_?@Uf|F%ibZ9;fx=n!*vjNdY$x;I@gKY_lF- z=^;Isv}2-v@X#TZcc6*W`;`-c9SbY?R)TT9K5=xEuLWfXLkC}Zw|?C^eH|j>;dTq8 z9XoN7og0(t%Eu|5Tz7ToTS4yJy^G%G>mbMY76;JX%Fd_TZ`+~tg6w!M@=XCpj~!RK z01i$K=rpiofSnNo?6|n9VAii+%M<@O8s4^5-R^+i+&CyOv43~(dx{>eom|4WxSp|_ z<*(*}{%~;A;#@evhee*{t0E^RCzSm@_L0YwPVNA{8fk8BSmY_3Zn*hlif_tj=RNJX z)dOV&4;)EdT-MFaAlKhoMQy(ok5{h?L7B6kqVjU$=oz|vDclyelFwUMy;iR4Hjkor z)O-6WlEsFp<=xl078=TsYAdLK?b$no76H`6VNTgbPgw#Q++O>(t2k=h{Izkl3)YI^ zS(jTJKv$M8{&hQrXVT2CC4==E=wzkoS7@MV_*zydyJadMQI7B_loOi#QjvUq85@1) zn;+;KUMYos5Z_voXK(qX<{@W1|-uh19%_g|t_Lq(^!*DFE2_;Q`xwsniTNdT(> zFoDN_QkpaY2CEKmOTxyD>v=oMYMSBI0i9i)G%#T7m6jc=13=@J?ZY%VF{y4*P+#7; zSHlDVD*~|k01r<7$G{h>0lN5#M?9E>V3udb-}0liur3*fVL%O-VwB+4sRd7z+T6^T1ps8*tz7ybfY!?|z&`-Hq5 zV+T_o=lc-fwt*EYcu*F)xqJ)`HfCa7uchNdYD^Z*&=VZE%sUfeq`R2vgH=SB_xB#= zI#s!O!hmevwvPG-P$yhECcTf15?Ww6r+PryFfPl&9M?d-z`o=fDL2tkD9zFi#g8|G!k5KapE-tu| z5P$w74ffHIVIq$||B-M3Z}8Nu1XW&40Q%;(15Ef0I<`!xC*j}#u5m8FiIQ@p#I7$sU?RMAq=OwRkpY=3#tjXDZ8R4y zTvR&3nS{|1wvb>o%WB?Eg6l0;@V2O(w{GW&b3Z$LI+ark`Hkyo@c?#YWJJ9$?0+f) z;!sY1X?h5O7_1uF|MuZ%;*MQgqwzO>B>LIwH?DRk5ypua>-&w2aEwcnbyHRh9sHU& zlcRpv#M{3H-;SG~cV})HWdWTfy`zXXcqH;j$|sZ^Q+^hxIm%AAO!*XitvaC`<&^)F zEVc4Z(QJG!m7ELnBWzlgR%*)vEekZ)0y&)l8oryeJy^bS8BNU;-LvlI6ee$2zK$i% z*Lc}Ime=FUHkLVKa=MJaRwC}DmtUe^`ITRBzE<0m*6|YkrF>oAd+#1)=fcBw(xQ2n zh8K%Lkv)el(~&ddG{gBSJp(W(jou$QLz6S%*XkloI@y`AZpjK-+h5&wkRp0H@t9;8M^O$uV6dtM zy2A#ey#2vA$Z$3X&gH=B7&wgJXn^wpD{*`t2$vmMxs0z1oIkOuzT93se~C_?Iv+^i z(a}!Zcf#>nJm-@u!4MQA|t?v(iq2qZ5*Fwc(@$b3O1-c5%O`0 z82ftpcz!rW2QVo(@UZoX(P&hhk;AVCjiSGZ=}6^MUF&GBbMw~A-hSS`u(X@MK=MF~9R;!F<(McOIB_q5fSK3XHmV~vvbw*z zGs0kA|LL#`vp7O<6n*{W)AX&^F7UPlx!+s2vYVd%v5mB8O@Cbqn*6~MO7mV9!6qZ) z%lo-==jjTcCxW_SR!m?O2ez6_ceT+Wb}o!gg;x(2iQ3CsGJ5#Di)K0(ieyQ}<4{kW ziGlMe;9%@xxv^yid5LX4WhaWun?I zs}XhLTUFftCTxRDo@h8oDoD$-2K}F#pDv$>c#)`BIkUl#E=yx$#NL%o7Aw4lD;W$Q zV~-dmIWDxXj1z;%S(VlZUO9YJn-vq%i8J(&mbLlskl9env#UxD!joF}YU$+2?93f^iEZk32h zkGwf}=m;OA*v|aN6$s7>z*k|Mx3H9*J*fwSsPmU6>D(ng(6QuPSiQWP>GAmpUF|f% zaU)kI>Dr_oBzJPwTp8!H5f~48jf`AUw@sjGojH4!aQ*}ilC0*zp^yg;9ad*8;Hx(d ze#C7J=Ddh%Xw?FH`pj8n`%|aSsBIuvuJ zk59^G`y&q~d9plF#mWWP6KC4{U-^@QT!%zBQu_Mv*Q>Taq(s1~1$&@A%Ql%CGYg0!=vrepaEYG1a3&_2!Y6Sn)P`|WdbTO-N! z)+_s>Ah++nl{(wFo~OH|C~hn=)y~A=uWMXr?m(OjkN_thfjqRRaogp7eMMX5VQ?Imsfn9J$&RS4f2E&Uvc3m!1ayd!#0D10Pq@TT7^YC3jlc7o^s^q zF|}$0Ut6bmpEu~%@?h|Q$ua)eXTg6l8)(YdYY$$ipC}hKO^lhmnppE>bGmItm7`i^ zuSH*DcQX*NC&NYb;8Zzt<{TeTILfzUj4Ou{Zsr)ImFikiY%n@|^)iiI)3+lO(Xr$E zyLxDJg14t|em3hteicnhN5`(xh4U9^aMem)ozO{>T*k2~K|9cTqN|&Hxv@G41D$JE zc?-$tMgD?+jry;xppKc&%8CU>n!P$g(gimn~OLhR(I? zshypfk(r>+R$VI!XBYBvIbREl`hl|_Z~$ri3ClQcxM^>*&f)M7=hRp+#IwQ1Mz7Mr z_mA6A<@Y=8-pwst=Jq0Hlja1nGDMmA0(i-(XAKdP%ah{}<_^OBU}VPPsWAo@$&z`C z>WjiIktn8ATbtYvJJdi#+0EG=QUj3|N?jIcZ%1h=E>W7eJ0=Mk=Fk9^M2DTfi>jHC z=IXF4>ZD}f(4wgr?)Bi&bdBjQgDXOptecmSMU7Mu*H(OUEr3aizOS_reBE*uQp_nc zD0foX%jvupk}S>930!6c)9E3I02F524H0v7^fLYM`!CbK{KCHqCWx4TV6}qupgqHv z_Xi$$fYz>EN5B2szfJ%BzyBStaJV;mDm*5TxULSj19W!{aHqxl)}_@jEQIO?)ITYS z8kLVRI&K_RDB$ZgRtsRsI94uT0*1-9)W&1EIIie}lLeZ=2H3Bj`yg*{(*Y* z?zrQ2H4y{?tXt&3$|6`L5LQWGqJw;d(!Lmf|FMrA z`QOFsBJWteiLOrPonr!q-8}hS%V#dsmk042F@R>p1>9^Y~?6&E;y6VlDXR2 z_=b~&b3xY+)Z5}`&+Gg6T#C@av}WyU+B&?I>F2G;Naa&8_b{bt6Z(*K5Ci))=ZWQ! z%REOGGdFNCD;gkvu0*H^25tP}dSqAs;?igFNz1)WhS0?&P9x`*JBbcjN}rZApU4n@ z-asI4N^p&rCh2DSv{it&R*V0|!iP^SWc(Q-Fo(gz=>}=fR}G-lLv_FRIV4Epk{(peaT(~@OHATuv>+9sJ8GDz|@CtTvH0d$<7-I*g(LHzH zscu41=SZ+~0oy^4UkD@LjUxnfaL6md+McsCIewZ(&YYl$vCHgK!0HzLOw3(MI~NR~ z`DI7WEZcmR9St)VFVOV)v($6z?P@gx8=J23b|k~s=+n+CA9mtg2tIrg+f*jFJt}f6 zfK9AtnB#V4ZcaFmGttbz!T8!MZx}7gzmW0v-M7#HpK(KN6}yxHqAv+XQTT$$-2Sux zJv*A4$e2xCd{-wGa-&@ET0_z}C7Z6!E4THpAnR#(QECOQG#arZ7VvwHJ_}g<8$dL< z9yMD@zmhg@rCs%!vaG4q+(=fN5mV(HKq&`>FBN|v!v4N+{}U5Q@lkXn08SShanO+H z_(HeB&9(q4wqKQMlR+q)YGNgnhm2*Is!XQ@R4fEpRJqKNMVgFA=@1mwO;|X`E=pfX zC)BoLosgn)TBf7e-9Z0f>F)F2e~JE=FZ|1fX@$W)uA0=&g#+}^Lk|VC_wL=xle1~s zar-uIiS-~}?Q2aG2i<1omaBke4G}S3x*VZs;;e;*+_mN?{DEDo>8{~rJdrA{ABIjR zPbio4ch|jiU#-+&e#me0_1o}RD8EH}tl`Mn$Y1VpedaMfXJmYQLYL8sRyF|Nq)x+jxtFm$H0W=eGp9Y);3nz-(@MJU2lA3a4gochOdm6ave<6t^jX;&h^QrNJfW2sw#c9l< z)ok$y9aEADz)04ELmonZCypfXAY0;ODn$(Z=2ymU(N99bZ)R6aome~Cxw z(+HhFBSlBnNl_5&tCuuNdMETbzd!RA}^UjI0yh;sGuu`=RP zDNWTqvkP6cOCmdj{sez@JW4QESXsw9_$>fbSWM-TtM&qrtR=$rvH+ZajT>7vM+>=4 zK>-&EIU4)ihe@#)fj!gSGF(2MDuaa7@n;B|!KDRqeJy~775~-mO-FfXM47<=Emg>K z%3Y&m$)QsjP!{K8vvh(4kU8}rJ!Rh%?&3_tvfR>MYoHn!eBtH*d;!Jw z2ke6$8X8iEt3CJJ59tlw&;6kfeUNtTxSL*j^ZRuBU0X{zB;=DG^)yh@+DM_l(SM7# z%wR(D-~QnwefxD>MJd-;Tt)c{Pi&;0c&M@kq!#O$fjQb%^Ii*``Nh%sit{XRlf;!P zmw7wH8Fl6WZc4bqd+9Ip)}9r79tmKu&F7Zw+tdM=th129a`nc;fEPClG(aBxNGYi@Cg!EFmTEbr*iWBR~6o_uWFuz^u>g@ld)X>py)ZUS<74JXI)3eO~FrEotHsaXu)+ zrr04Zm2Pq-2gbm*ey@iG=J+JhhBUBZRx^N9$klRjK^m4 zQU|bY-n_Yd0|iccKXUlEI()6CABX9s$`x`bmCmJrK^m8ju`*SO!yvki9U=z~9adki zFJ9!s>Ud8zB-qY33GBLkXVPgies!EiE{@O@zQXe)@6pCekHNwGz4qwHa24hY|M(KG z2$`U(d@UlD?L+^&?!1Gxl=jSXF#GB6>7Zr&#d+tZC3NuARhqI7daS6f=#4SIgNKf& z>;B+SnU&gvh!j}SvhV!^H2&rucC4&Zj;N!2mO%%9k%m*@&fUAzjT#ZuhD71YLOfW7 z(9K&CR;_j&JFsyt-)Pd)Q#o`JGQ+V0=gOtam$(kGGoina#`yY1I3L=&+Gu%qKd)Ew z#}Bf|1AHZA7avI2jO#eDl>_?K_wWXSi|^CyrT3^~)lzC_CmU81n5UiV$Kd(_I&pwM z=BQgy&{DHAYHo~r+Ljrxnt$geuhIA$uTsaO%c;G;`a?}?W?X=q8!Z2~l ztyrCd_2#0oW6nfdGI*mZb|Yj#*$z5eNr6cE0@4YS(uU-9M9qa7b(ybf!&m2Jd>vr5 z586%q#rDi&;`P<9evR(A=WhO*J*-FrZu|D_0h_~oW!xlB)+$#n<+OVN87CsAg?11M z0Y#_h>0j}EP&m6dC5M88r9IT`5omY>}@>X-g{(}W>g;AsqQ-*C|lW41i3LsmGpJ7 zb!hdP)%5Wn`)Ii=f!6J}>3#IL_7STY^7`c%bvf?wM?a|Qy>b*WIPxy`*fR9+wTtW5 zt!1aj5S=)AlJ@RrKJwd{TX_1%e@+ z6>NwcH#3o0l&Xdpv>ByyG3FGETd#pD_~--j?h32PR{jzyGzS&thGab*x}nkfZCRjY zftCeowE(`dVPaZz8ZOet`Rnu;pU!^b#0lQkaFE~(ICt(Gjq=xa+*{wxch2K5$Q?U& z(7pHGqYiQ0zkffcU!h<9)n8SoxfjWYhWMR#-llH;D%^oJ_lw}Uc>Z!lN^aIMp~fG+ zSXcX?59m-^L2B0>P6Ye~S1M)*1O7WV^w6vC@pcN{0wFyc2HR-E%8K*D=q}-<(%V^v zcJKN};~4RxQ)FsRt0v#DGUVdLi)?Q`xRJN8U>gJ`=y%<@OWk~en+sO1SV3bmlXS=A zCB7{J2OL)Sbnupt%e>9twUJ{Av7gUixP3L>PSG>}&ITi?a=9M7ryj`J_x8<~18Mu_sUKqbTMOQ~BFl|>W7qmM!gO8?O{4cj7(`Qc6)XC%2 zwSHqU+&rg@T^Xl0UfD-uqwZN7sAn5D578~R>DxEvS&ZvI9%EeVkv=@A*>Uyxj&f-~ z3uz1umE;!GmVV*CLnqhbq0A~zEX5`Gkb;iEm9ed-Wr0O$0ngi4{YbDTtxc_KRh*j4 z*FtJppk;x1vj9%E#{dn7)x{oM6?u`D?T?IHRA0rnY}rcK(tt1ISQ?Hq74W4N4u`LO z?Q8Vxv(NHge_r~_U-N(Ym;YJPu>gK*N&LQjG_-zD?XQo?u+ZYpoII~Y!Z;VpysQ1X zxzO}^`l(_1g(tUViG{L)KMW}SfqoW&5|FxzlHb+WVRm3G#3wdL#?_+-4jiHb2al+; z6*_rU#YH}Q0rd#wp}(((9{IpSG~3%r`!AfNi`T~LR&8it8LeBgoR+YYq0x`YPn+&H zzxf?Hefq3&Rz3FUBeZ4n#&Ukcp@=%afmiCl0W^E{3||X*hBMN&)+}$gn&S4MYtu$* zW9N%`R`FJwYx~$C!S%*$jp%Nx?u-sY%m1C@wrcXdz0|di&tBj%+Uy5y!Qq1^XwU2K z1$CoufE`4Q{(0TaU%W4{Z?2@IrV{1Ke7$5Tu%a8I;Zq$btrtn15xj1Bco_ zJ6s20TP&3YYIH83DoNEq55RO&16cFdvV6+|Eeo_Puy8EUzoeJHy7N(Nd>Vf2!I#)g zJVC&p^x$B^ud{>U@4x?jrgw@Da=e3{c;bm98XOac_`HHo{Osd$vznyTyhI$rhzDa@ zd~K;^D?sz4l{sO>!o(EcoRl##?qGfUdOE4QtKK1xb|`R9xnS)V>*WUq`sp#=M)CM# zdinj2UVUAy{F$1~wVU`3oDC(D~z6)cG7ZccD?v1!TYsua?3JhR(HoIBb(2+#d4A%X{g{CB5~-X1`(6 z5beB!ZxUg<-gr+&!{I9(t6VBH#Aa!NHaE`G5L(df>qa==Xl__vlMs`U|@4w%cgq z#<*hwZS9x8{I}f1&C&fI*v-aUSaolP&!QOPZ6neXn}h+UC_Y9HlQleMl4pKnuzp-M zd}6r2^OyVS*%#08Z4s4WjB=cCe&GAE?R40Pr8@EI}y5)A7 z;F~Avefrozv6@#d^zinhWDp*7jgDNSNg7jStO&i@__^sRnmTc;LC%GoF`SkVW#Z6#C+M9w4>#I@+pd$aW&DZJibKwKtT;7jkN~O_HAQWiiGSpIn2VW8 z%d9d9wZK{yXubvPwu-N!v>!MP>~PULfO5XtWDzT3(u%)s7H~_&brYk-xMhJRSYXBA zavE6Dr>;W8a_8mCm)FG=6OWxcchb{OKTZGfKmI@TjcpPa<11>+g#UjiEIb2Q0U-mD0%zK)GVLJps$~r`TyB_(rO0dU%RSn z>FRy&2GEU#00EE?1d1F{TtqEH(^@FUc)|)RVj?{Df8fv;hrjp_us@8yj5MLKwb%|( z6CUjnNrS^7M1l)IVn?I*wYsZoUwwWjU%s1pGH+(S_inv@-FOL9znht7&*f&Gn+tuB zx1A7>eTA-X1U^>4z#)TRZjHdo1j?d1Hp=G{*u2g28hzo$xgI$C0M|f{kPQauJcD)x zEcNfFTOx2<1Z=mux~h%_R_fr2&v)PZKwYM@M<6rG8;2nxeQ|M#%6LRg&`k-?J^PGW zBk}+0z1P*975^)Cqk7GeW8rI0d|KfaiQNcgPJ}owsxRyJY1IO*o=gO)09&*|X@~6E zzkeT}!?1U5M6E8<%7=|jMVC~zcp;_5A7?(y-zM4UYD{W-t%tmE+``=@^@IQXQ?+o{ zFYiOg_N&LAJVmQEnp`ZKt;B;HyV!LI7R#|3)gYmnzpBHgD}ZZJI7B6#Fl0MYbM&rC zj`r|MaiNuGJRfr5+*pprD8tSv#~g{fFkK7S7O>APqXl~C>~)1scVdPNHJcs36EwN{ zmuTj=Fl+Z>y13og1G7MbCqq9lIlGLz7O2Pq6XZ-dcJi?L$q(MKl!+toT6*&9#B|YU8nuhZ>!f{{jqwN zPJ71$G8w3={~6sBut7I9Ku1haF~P*78;%7y6_)9`$yZ+fbdc2Y^0IoD_V8b)$=3jV z{XR&C;2k(H$5$T)5kw-K8L$8F$Lw4fC0-XUT;yvZF>uFWgK#eFA$iW6J}EHEqeu6T zs!6(va)izexO8(_EiP}>oeL6ci6+&zZsQCJoZE3kh3zm?5XZRW7gh$$=1Z zE{xOC{?n&Ukh6piIi>mwefLgIkTYb2bfz!xG>Jxe_mMNFpWgom_e`m=L0n7PT9_Ug zQv*HZxFUxU2JQJ{l{DX`X>D)P1fC|+n`>z%HHd9;!flY<29D5q4OG{s_K&IgD=U1k z<4Bd~Yt#0Tt@%6T$Y|us$Ix^LACXdHJu(3~)PDAp57e8lzr%IFHpnoY!SU3ykE;WR zAxoN;joa8W#<9EYyeN|hyzyrR5w&uPM`>~%S6hiWV`#e4)Z<-n=svY<0joTMw8(ud z=R+x!Ae}%R3c__0yB6qB3t01cb}rDzmWBhaXNd>OPu};9l@jR{5E!s@Lz^rhJ4s@T zFK?;h)-When&M&}H*TSpfY^xk5DeRG<6e%XBaM&(xp(>7S}|=g#rz_vILQ zIrsu>zC=q5^l7iY`W^M=n{RT~r3=^8pZvjpP=Ef%f32RRf%q%`>_v6(@P0K&%Zc%I zxS5b@Z=i{l0-N;Z^!~zytLoN``6N4BF=>YvpMQ>N!J*KPTLfs54BC(Z zwl`-q*f{2Sj3%s4KXqO`y>pIn01JmeZh(#d*=Jv=9k98s&e0W)y@U@NGk+qKw1uc2 z?_So25F#0>k}5@@L>qi&W}40!m}GvqK>-7O@Y^7}!odM~F!@5dk*Of2pXTT)$|<6O zYbSx*Y?({Cx$#2>^(6Gkb5F30$BrH;Ma9*jxNh=3t#&v-j-XL;ETGJAL&PSny1+^X z{Pp*4tMjvm)haF1Z#AI4-CiZf4c$C(Y;sl&^;Wm4BUv{}gx`TvVWaWGDzTzq{i92C z=;D61)9BuQwLZV1hE;Vdmv+eEwzas>pmQOlDAjapz!-u+oxXPImiq3uen=}`d}kya zx96UIj1K&yRTS|dLWq0=X^^!&&IR;oP7ohu;1iG_4m?F*3icg1fI@z2%WV8B}3pYNY?_c1+4iz^<<$&;lledG`5`1%pHJAI{Kv^ zhXJ3Qmp@)`-B5)EP#&Q&iFcHGXL5{x93Pl?VRy?hX2Wh?a~4R~y%Y3R`!m1zlKRKL zepUVPAOErX`q#hS)U}4TeAu6kn;<48CV8p3$wM9g!4H0*{^*bXh$qt~9luyP@csYv zWA(%Dy{TsQO{s%N_N${O4yzMqj?p!42i3^va8`e)X_o7~NX~?hKD?yffBQpq;r&bM z%EfEsVDOhS+p^iuM^4ab^d=A+I8yM36$_09^zVJO(YjpSkxL7B_`^zxMg#aic9^~( z->1FmTj}@6EbW&+Ff~*!2g6(PwRK5dkqH@^kzMj^HlDi$1@!T%U0GeDRSwtqN=oPk z*>Tt+>ia=*RE&%atEHYz^&j8+5#1J%U$0W~@1a!?zxV7f(#;WjQ=kpy=ZrBtg4-Kv zXS4BZHkl6f4I5XlsXjWRWqf>0-CNmKTg&+?AUs)Q0$q>0v)s7jLz2<)@_q#QE6c0u z_3yo*KKkIYhdxT%WS;rtIl2jFALYgAc*qSWl#N{)CX|Oz>$5bls~ZmHTmw$Z`Jhl zwEDsqzR=Qy?=~%!$JU4A$B#Sx(-qpU{s({XhnyFZ1!-97f8*LM{`=u;Z!j1R%R6%H zkUDkdBs&}C4$jd&{xSZ_jTKpE-)KA`Ns{<$OSpTD$^C(bDmagM|2NaIcnNw+Xt@g!j$WW3DL zi?b_Eo;b#T*REZsD_ZZ7(`$szt=OP?u6QfZ*yt$T7O|#I?wwOJYmGac%Jd#1C&mz+ z4bchj`>m}WwX!y%wl=0};uhuDOMOmH&lauT*q{p{uxf?k3{}8TBUf9u@2H-!H8nOm zrPdZ!lbZ&1$iR5lZqc@r^`3sUNxz%))wKR?g_t0}htkKk`&A>GBIJ7?;$k;>5Ai7r zs3RBNzpB3f-Jj43DCk)Pl+k17PphY%J5P?<-8n0x;8uIe=<7Y4T}t3-qAv6XIJh=M z37}2If*yOtAdm+l2|~&I6c58E2ky~=(UwiwH?4DCS*Gc9A-Wc5zXh-|vv7{lTf=(U zWlNKblM5GPTm_97{i^e%yok$ACzMvT9H1xp=I|&gN1X!RZc;5tir;|E@RNkP@va4` zwt!owgVd@1PEL=i-~I1?NBy7w_Wz;P3xA^Ce*10pJR_$-_dylOKNs*M%})7htnA#@ej5yeE8l+{HOks)|}CH2^{)2 zOkary=+{255G@f08)CwT)evj+rCBe{PcRYL&})z;lPh#)f*afpp==`R;&g88!i`mR z@#ZS+>38)CNjx^(r_LPeRr{y%w{C>!m_8L8A6EO#%*=4zzj52j2o!eeVlRiU3&$Gma#q8c91q_(VKXS?4)7f9soSQGJ$~w3xiu~y>CFR3{TeEsrKh+^3#VQ!{YBl+%!S-MDK39EzI`Df`CDF-<=gA|*#Ioreofml0ZNH*_uV zakfCw2I#g3eM)v?=Fl(4G)@&?=yN*Ov?SF*$j-AcW}S!gl^^+1hjw-JkjR!dAZuM{ z^We$~j9yQE16%y=(9*pe>IFvkscV5YS)ewkk8-OmJ)NZk*8bc7;WyMb{`7C@P{SYb z_Ju=-4y%`5dP$u=eVVV>!^B{DWm(;wpQk<3BkJj=pXRd_Z2H%(T~pus*0ZEE3X+)A*5 zKU$Vtbr_&k5;$1$3%~Y?`sUyKC-v4F?+X@IKS5ngqZ2bh?14sM^S}7+HSa3QGNBI7 zQ2Bl7sQS_i`^!MG(#`5W`ZoDc+7H_xmg$y^HF97rQT^_vNiUx=Su$`ybz;E}!vi0q)e%fL~lmCqg zkF@J#KsLEw=q8fY(RFp39GuH51NvP`?FwHq;V>}k9z0?u!G6tC8m%|bG)#Wezi8+3 zYq}MNR-c>C*CpA7Xs-~tV=&NME`rK!}s16@ER{vsaRK9uhrusMk=6|R2 z6n5CL@bCZq|Dk^R(>K-H=CbB}|R?i#I@z%u#a zAv%+QwrSw2Ft&J{I(fn;QA&xu`Hl&+`hM_7U){Qb-HE}VPdSGzrOeN^{6qrj`GsY6*{a? z=Zy{ZGA!^we~E5~xP3>jK*8aT*b>laKZfly`1%i;n4p6u0=Bx~aKwGHbci9XAla=j zKYv&4nb^bEv7*dS9#5WsBFYZ+`|jPld=2O1#02Y%Eh9ri!?dkvMlJ5Ft2sIwVPuz< z#J@RzMeQ9PQ%@bD32f@+6V;?S=NQV^-inl9QP0+^42sGBPT#iL7^fQ}_AINOz7e&# zK1B5(@iMJbD|sMvdFW~hq?PQpX=LDw><;hgx4`HTZT8I{|5SbFo3GKc9N#E)^yDG+ z{Lek9#`a+4O6v!Dy4)Y4Sc}D&qp4qN0jz)nOhRE)+N!vaB}*R3{2`C$tuDz>veg2} zV9^D6bSwbpGrfl5A!9Wrx7h@pbh~z2KRFlhVgOa`wM+`iYNXldE~bh}wEyDrEt#-N zw#+_dHwBIa$xGTo!pMA3G&XmsS08f=JCA-y-W<#vyd0PuUR{{31@bM>!;XbS-NRln ztMkL-fx|QWSLek0$uylee{ezl==C?$$fw46@`p*`BAuT9{qKKYed8N{q1HFn)UW)P zzo3qtnp4{}DSh$tze3A{^#n}QE94m*>ZerQ6~lu1-nV~D`gaayB%@D&@<;XprJQHV(wAmDE+M=5aa2CbTVB`C}`$+zNaxB2P06BOP zS#sDTZb*Pr1Yf|hngn_`>RbR0?1Xa0%?r0_FFv*tOwu)vSRH_aGI!It0N!xYpd2u9 zL>Z<6oItpC^o=)v#uHh-Ap$F2;AkM(H);FG{naIPZ(VMwNl|VfpKOIKKaJYk<^X33 z96F8C=t12eXG$w!hi=r^Ag98{#1c6cw$;!GZKYTqBAr^h4Fju41_v6I&F^1$%>+I! zh;WS#fc<+~admJ0zQ|GJq#9E%k^}YV(S1}8@L|FO`4}b0@#1c%o;EPb(I2}?S<-YQ zhKxhoc4#d5KFBy*jryUFpXTkddRe{vxYab@-i3?W&nr^O>{meGO~F;TNNVz_C=+bf zv)Y7dAoxuS6z2{mt3w_Y z=81juw_nX2npOJ`&G3Yvd~%hx;M^PzL&S7g@im2*Xk)TUGd4a{GA1P)98*(MgpWh; z^cI0emZ}5x(8>M9 z#QgZNqwH9KwQ;Q@DL}Nxs9w=Eg~N?INOE}tZklc_fbCD8I?49qvP%#E{N$bqa(qmv zF*@KA*J)y+4kySct=?FpiSz8}gc=^$y%iUuv?}8A(tQ2xG(cB@9vExvCW-QTA2$FT z3w;AEocTc8wKn&xuwwzM7ZCaf=qk_AHMPE0oTCtzBAg57!WcOX8w#P$1Zl##uy}u2 z{pFv3Q{nnt8L(RDndcu@&pdaQ>H_5oTnXQerz}AINyx)%6YT7df5 zQ)dtJpV6NOaQMt!QGhdGc5aIQ&VS-eohk+(3-=c3CW(1INbTnJJACfKy?OV_zp3eQ z-qtWRGpP>JDh$vX-!sZi1}27cQs@hP6#-vZ->WRq%iLiBURJ z?~dBoOuvL@_x7pB4i478bYuB><4e$8i68?e=4Pt8msTv8FhScDb~}J~GXYMeGqh^s z25kkxmJ}QyitQEH9zvHZsRZ&K1E?tOLERfsYTH({qza?ODL`a?8@G(8SGskpUFrhY>h4_dA zc@qq(%iTVP3O&72Qjc-kRI#k~PtFCs_*1{cNC0#md@plMm_|D(z{lwAcEd2dV{!w= zz(F27$KU}I3b1E6p3W)H4^eDBP3qJfC6?AUO><-_!s-}7D$?iSBoiwI95Ry*d2Jwv zQkoaF;+fh6V@8`7)`tX)(kvoqC22GHu@R z)Tl0_v<0KlZ7|K2ADa3AITr>;>8jR+^cfXKm(4La7VeW{A#9i4-W^)Ku%T85H+g%6 z!OQ){`5=48hv>|O=2oMG_@FL)^KZVd{{An&$G6%@n32&T_2SPz#RtKnKX_0f)^vAM zCf!Si`s&@}YG_x%H)J_XTnrEVQp8QLGi%SNb0Jy*&_^hVS1q=xHcysYC6Z~>l#?iv zjIt(^xhOtdvpPGK(gkJ)wy45w(~GG$^@WZH z(7B#^0|(_E+)IZ$#$=~g7)HbA8nl3;aRCLQQ_|?b0p~BLgDp!4I+sR@PKdUfmcz-# z*zH*BI_FtE49FB!JNKI!82srLFbAT~@CZ5d%!K6X18XY`F0!?phTSUqpbkOJYp!)649#X&b$yTqT#Nd6CC&Qg;zx55QTqs|? zu&{7nz5Cw#bX&$eJ4kRKZ|*$S~RIJCjrBXIUYqhWyBXc<3!i_EWNv;dN47X6fZUtuuVf_rA0~iCsC=A z@1-bqW0|xi#}2NBc229$yGOZI$(qIIRgD#>mAZ9;SyuE@7TP}XRjAv@(bn|uQYSQYYEZ!QdTG1M$F z1DIBlhPDzOfk&ykjOVDBuF!dw%i*2kh5Q^kIeK*p4D@-_bZXtUY!$8!<#mE5vRNHO z>++;0t>Dq7a;&Twv??zNB0Kr0Y%zYZJY(A&7o;zyrR8Py!t>A3^@}rE;^6D~+wZ)mo_PE$IR`fB8pkER zAp$oZOi$$;rh($*KhLe5TJN<5boti$%J| z5?7M0(;H3Z6*97CNG;K-m-W^7m5bZtFj$?vn{+IIKh9nl z9$8asD}%J{$Qq_0GZN6f@1g5s=k|_9pz^b@72-Sp_`3SjfA`mXlZnJc`9J>TarH}d z#qQYnFlCp&ebIPm7&w_>lGS|`}WBx10TyxAsQtsfLyo=VpW+fNhb-AsZ64O;QlAY z3-(R*;~CBeB6FW6l$hXS5(ei2esRme(W7+eCEer@TdIyLJU_a4QQf79^eQ<7u)H4E z8RiB|@~@F&;^L)CG{GUh#DAI&6oixE%&AlA;KBF`1O4U1<+gt>4s2BFxw8}MjSm;q z;!63KX6Sk2#x1(>Vv_Y_J?Q$#F}g7!udNVovf)P;FRA6Xm({70C&*E8pL_Vxkzty= zFOgl=)E#nSoIZV0J^keQ${h?iQ1jNUJ3M(F85?G2hHH^<4CgJp@cgrMg(a=PsEwwu z#RIoRjFKbmcb@u;+SqRIdkSI<_YbNqsuz&S$Q9NgoO=G;<9y2rI}gawg9AfRPq?m7 zS@qM`dQ+!I>HLk6iIu2xVVkx%tnSNmEEtIf>0n3vHR4>rIS?lfOfdeE+KY z&NqJ&bSyy5VtB)Gf<*1nhY$A%$!oLM zO17Yjh1$*)85Y~!eGD0}5srCR7^iRkfE;3cAnh$bax@~Q11tDAdASj)WOh9ZqJdAN z_RSc(1bJ1E$f7nXZPqLf}400~ml>^B1m)NVz=$=Bt zkX(6DxS(H?DA@T{Pyr;}LcijPCn-Y4BA1?^yKM`dPf!fUZjQ3f`NCZbO~_87raogs06 zgQeEF0b2?_{i)~GHk}UuUeF0!HMZ$ijYjC${IHS%#dL{QGpwy|(Tap}I~_bQM_;n1 z_$xN7g0I_ybnZa5V}WqsjQRPW`xJi_$3%7uOD2dV_Rr%>IUoK=`XO&{u==IvC_fy| z38pv$0z7j9Y(GJcpfz%SeD`~=(ZP;ad0WIYPn}n|?BM@;>$~c1o3=$b@=`(clO9j) zJF0&5%qN{J89|+qb#yPSSm>|apph!a{=q)AXL?kvF40PZCI4oOo&IgLIybMj>7d3& z0?u9-rfn2!tAljTLApJldzzgXR)=QB8)0L?qV~Gsy|*q>TMF}@otsu)`<*Y6gW(WW z8z0xDwEHnFL8zUE(pr%RoY4Qqb=GTvZ9Z{$8`61h63wBJ6>;sPV^$i!E39}H%@7b2 zYMW9a0d^s+3Z2mBr|d%Z7cksE*=RfXU|=U8D&jo8sG=;ZFeS+$#q-DpbP_P;>gggm z^x-5iZYq#ld!jP(Ox`d>lut$(dA5@{#tt&QQGq;0f`FUf-_t|KE|3*4Aj2=6z(DG_ z1>nX&kA$SXqHX|Tm$(}TjvTN6-ly);O~pVr$7tXq<+EvrfSrLv&!?XrVuxA^2-0zy{d*@Sp;m7W98Z z0XIZo`@{iquAtgaPfe-0*?nq~Cg!+4^Y;3ZTBfTa7dQNU`VBE^61b1r46ed#s%)rE zxNSEs#Ml&^3+rlQb(5W326~4&mesjC4LcSLKAa0H%NtqF1+38c#L0bhEou)txbEJ) z%erGLjS26)|Djr^b1~oy8y*_sax!_k?=50@f}v-v=QA;$`5$WK|~m+9x^)T?cGx z(srorjnsIXR%_3?lZhKIZ9CNXIE~h%Y(F-%p=0%;jCEHfJDws(w3B) zd}GAfGp8uKM{Ux%7rj`~Ff^*ZeCk=cEuyh6_BM}Jp4n+c2RybTfY;Q)NwvPRp%!lG zGbXU|YIQ$tHKDBy&4wO6dqJ;W*xZQs?=PI$uSRPJDq=;+^z<};G&0wTLPnGg&Xa&6 z@c6N#>d7acAg7i-8)T>EP)o^*Ef8P(`mfSi3r`SeppOpqfx_vU;?Yb##x3n@lcJ9% zGw79r%}AcYiM7HMZf-txYRUHwT_nihAXtpq8TyB6TABz2v{w zJ$BKAYU+dD=FzGwFo~cMn*UT%PEn&|WwNBjKP5OQYpM@ItrFl`GRh=ShnNOv)#{D3 zRjfYM8DT$(teVN$gVv&P{_?B2q>x?(ATgSaS64TZ?SMMTv|c2S z5DACY)dQ+F4Sww!UeA*cf{v4&O&|pbCN`sH26Tj<>d*M)Yx6PMAdT$fy?{*qqxaiS zOA~l$e5zV+W{b1po6VpbiRb+?P8`G<564d) zQD6P~SJc@jPEsR4zm(ZG#VS&qWp*xD_-w3xKATb+utzLC?;%^rvpryAw>y!xLaqzp zbJkj=pnSZ>Q}8B@hg5zX+s>_yl1=piKBJf_P|7U>zc#x}N*J06WXv2q$u7Z<;W>GP z&%9cpgU=KpJsn0A0go6TqT%T+aR4LRpybn@xY3!%5+y8IdUndj^e#bml3`!`5uH*} z>2WkDq(fof2kcx(i`rI*Dk>hzue1QQHpq^Hq#<-=NfmdR4$I*QQ&fasr${O>T@DdhhkT>StqHnLN!n?pc6Jg6#?ebBb_kN@SkA|^XFeaH z9E`hfDZQ^XAW~3Z5@F;M4W~5KpFuXmpPq?^93q2RC@m~R=cnR)f#3hPKUIJEPq*v0 zMZ}~&M7Kx$-Y*|jUwh?{H+hTUJ!*M#bNke9|JK(OuA_XNZkyOoah$vH4qZ)om=5LK z80b+)mv5+v2XW>?iLpOinpYRz`!45VGWctcy`W|rxYeVCY(05kxL@r*Ijb%%yr-77 zF==nT9h;jY)>j8;<$=3;0cUcYKQ^Pz9Ll>D#Rw{$4oJVhP=2ci;13?2Q@{JKe@o5G zg4bqkoMZY5Lm9ujGoiORls(HWy;ayh#EVPSa=t=iZ#A6fToATud14lltogLObG}-y z&&^BN!I=C(F7;l|k>73KK1OXDvp12pAia-+R$l#)_*nI~p4`v_>Vh77h58di${**M z9R1tFD{kX`2Hid7A_ZfTMraHwVSFZ~snE-n(&*G$<=f^)Z}Tv8 z3vSg}E+uOP6_dr565IL}dUc;3tOa(G9R$3S07 z-8LbGRd1aaAUI3z+oX|9vuOf_cv&DIX+;@0NrRwz{7ro>BQ_w~WZjbVT=cALePV3q zx&(A=+g?>s18|)q8AOOLdh%3oiwRaSmH{s8W|m>Pl;jD-xOxy@uJKu4uL{w6<4`=T zB*JY3WdW0WTp@{m640WENHJ`R|~Z;GBdW5LLXl?>Rs zj<7|`#q9$fA*a1c2+PiKTLJ>c42TcWes(NP&kan2Yygg+4VjUq54UXaFoayD795t# zLoZVXut&~07_c?2&77Xz%QtqsOOAzu2M(ygfkCxN=Q0gaSq?RDIHx7ju0Nul%CF5; zFdZDBEeAtq)b_o%)%|t4AtGzAALl$WhSdwhj&os>z?@mU8+IIrvgg#9iKWa}hSC&rGojRDjM zhYw7)xu%Ka$eYsH=2-p=rQLGWRm@JKwv;7MITy}BU9`z2z(d&>8<>s&?+qQSu^T7Q z+|p_%VLCaEgAiupX}ERZ*RGo4IWH`FG$ z8NJ?4fXmm1$ktKrP=YzN#E>jBF&8gahl1>dITO;zc93N5zgL5_9q!49Zu?S}0u4EO zQl7G4zo(Hskk$H@^U)kLhx7?kX)Xa?V#4&s8$VS)d;48FByNzG#^Vq;Tq}9v#8KLp zKgQQl7M5_ImX?>*`yX83t0QrJBd)K+;efdTlko3+_j~G{ci&TU`}VO6z{SCWQ+xN) zlKp)R(F5+mnPD|EImlzDoAYbx%I)$)32)Q(fVba%PYn(Ys3E!~;%$=S7hZXpzvP2f zPMDv+t8myJoHX-v5Fc)!xOnlhI&=Dz`ouF&<&bCz=A%oO)!N#+ZWlBd+#orgrW+q} z0vsv09#e)T_TGwAwob$Aa5;)#ns-%Fxl(6EUoR ziUsGZUI}0^fhhr?B5DUL%N}~ z%t8}z>lKY+(NWQqf(G?mS85d|r<1NoqDPF3+wp7VswmwMjf}?hh*`I*PRs(KI%318 z^7ShxHP7}v(N)z$YC9?BwmQLQ$P#LULEw5~H5y_l%FLPdxo(i5}@>tPuFc&wYmf;AmK0 zSy7cr^aj@v>9i>?CgxfpB+B+!t-`?SD#OvI9@q@vkIb&u*|pP zW<@{p!NKch$!Bx?0`Lt5YGq<6~QNNmsu*G&!w~ z&rQ$@pVY)DM5VE`$Ic&DU;6c*BgY1AV+ns@G-XvrIj84J(I}(cTza}+Y>sZ&K5<$p z99U1v>sk~O+w_|~E=5(ju4GkF_3405QfGXq5bvolC23zDDw)CpB_&Fb0e;GYxouwF z<|kQKpfk%VkyA$!brJnRs#9dIxa5_f>kAx6 z$)OSAYp2oVJY!NVO;yeC4DzRRNWmZ<`q(+7BGQ5vTs>0@VN?JzaQBTJ<3v5-v0grus zy=s|Or>v~5@fC>B9ZT@(CKe2}B2U#@-2{n<3Ot-w;YOT-yB`o1mro=WUp}V( z#pmX{x)hQa=OAE`+70CvSYBRHSFT-CCypH>=faS>e&eRPdhLdK`K1>b2^0PgKD?lw zedcL)G%PGEu*2Z^u~9CA8#iyU(*V~cBHX-nTVdQzQM_al#0@ z^v}fPxLPEKj~#Geq(6SKA&@Wnh)~xgKx_(aeTHly`RYQDpvkY@HI4lawN53$#DWVw z+5(2wCAiK7$ZOt(A!C3Rwm z6qKMVqiKam5SmM*i%L>1iMJ*%#K4(GF?r+)$B-aA=B!Mo5C@&6SKPLN5wXjtRRon| z|MtjRZnfrf#D)&8F3nSW=rOA($Q&9ul}Z{jhpxn_Dh_#5GCxT9s?zger&C24&>WI4vw+2L0;LiSyf?me z>!jt4O3~&_IB!Vjq}nO#H9O{Pv$_qiqa&G9m zrcn&-=3Wp6JO4L_Pr9Se=hrGEDveulTBX>W53&?sY)?bQURA7PO-La z`eU2UZoXi0`XX1$Pz-}2f1n(K45!(Hs%Gf4!XLPQ_RY)c&tAPj2P)RerdAC2apn*d zKfZrh{j0AWQ(t~@e_iL0{3Z?hKUHm1VaCxHzMEVHs^6b7! zQmxgaT6^+yb&6f@%3!KW59`?|^@Ku=lB>gmu1mW)XF{EzN6*f2pCje$0zM=$IAUB| z`hr8}RQ>g_+!VN)QhZ#D@>r@2Vq*uJYKo2xyPMB`ecnxO4-;*;X5`qylRvlx*@Nnk z1hk`~e)jkD(p6#XX{HQzG@wDo8(W8HQn47F)CfL~_OG}&yW~C|7T~_BQ`$>T9|BoZ zFaA`1=N0YkJ9pIb685!YF&w=^XgM|Z$sav(n7>TNB*rrK1v&&0hcRNgJSKuz!k!y2 zF}X?0=ogok)X4A%^TxH9{WQVcPhYoF0r>Nabd}~7-Be$D+fR=6^Rjy64Gr|FYj@V_ zWLDR<)Z%J!U>5k|d;ttnSLs{M(wFwTbo;~PT2U-EHNMK?5N0oV_J2(Y8ECsMd~uqHcv z?gX9xuv_KILbUh~WRCVm=zqQOqKl!e(V`%Po}MVS&LfXPPCuVVsTwF)xK%4>=# zq+%h5PKpNTC+QFotG$Iq0+9rvL^jh+tbPdd4y6{8vruk+T2*xNIkpCwW8~I2=pMLL z8WrMGzZtKd?0z7I?XXQ%dKG;?jRX;)!64IaM2Vc%UzNbE($RXwB+k`5Mgvmj(E(Hn zvI^_AokSeR3atP6Vw9;HFAtvh{oTF}iuI{Ts6}EIW zsDffA&{$ZwPm}0-G`Xj<20H3qVob<4=ukgg#kjS(rLdG8%jI(d zCUCcDKmL81s9{2n$vEf?W;z!_JVu84hz?!yM%8PWo^Rb-FFov$9SX!7a^TRyc{(5v z4ie}C=K|tzTJ(}#_Og?~*K2)4I~VXJdvS4z4=)_20}5e-5xNd=f(|}(zs-lFZZ?ga zD`dZskzp!2y{+Kd^&4I1LKEghJ-&BuL0!3ejSm*Z;gg7u)9od2oIUmAIlA&wJE~A$ z%<76JSUplGo#QxYw^`*R(0zCD+d|Gjs86!rX+3;yPU5{%+2ps~_StQIu$yZ;ZSEqi zcq*60Oasdya&vOHrD(Nptk|1a`OcCgRN^g0q6~ZutJ2ABUp}8sOL@5DwMRDn=%h>q zF^#H6R2Uq}A&a(m$0pNh1tR5vmUee6^UV|`-U_gy19W0x8;wNR&xJSmab7BUA1l6) zxGyGl5m{t$3y9(7%3#H6t5vKN@kkW-#bi?g6N?dZab*!i8i?9-8$feFZCRa+1|w-% zat1{hMCuwQ*=zdL0(n9vbM5#J_GcwZ)3jq7&wXy6T~e}YxzhG^!IJ^*3oAm#$9(DH2A+9KrgL? zg9-Zk`uVUty^(|-Jc<3|a9hxg^Ujwfs~I5A36g7_RwQiG3W2gPJT$CVd64e7DFM!i zF}fK6l@f<$!BMhX0WzOCeUfE`Gh~1cthCQd*e$+~B3<3r)AkB-By7^{7dQ|Rw_IQ~ z3LHmh)&>Uk7EXuG31uB%SvpB>R=qk(xP2aCZi)lkKqP}oR{xs85(O0vAz8}XcR49Z zNARWW5QKk2goJWAVs&yH0`RGc3|(*R5pi|yCGqjsYDkUO^%xuSdICAD`D~`hiygyX zDeexBiHlT>`sEnIv|+=nhu+6=NeHqaY0&&%kBFOqkxUL5pRk((r@2en&95rPC6o}@ ztwCj+^PtMGb$YJGDY%3}#B4j&52Z;E70e7$vcxskxjD>I_JtfNSzJD}a)BBJed*Jv zU=ZqHa9w4As2f^i1Hc>;Gz-J>MD*s4D)F)ay5DiS67|r2l9Y3S7P3;m7qX$Dr3cWd zoR)b;Bdy0^fOM3J-ZlAMToR|-0 zUkwKR0iZxK{X>yLZ$@VvN~64_N(3N8VH8KcBoSML$g^MmE-(oqK4^s$2lmWUT=n1kdTIvk>Hrxg_K zRQK8b=oKzg=o8n8`H<5+7GPP-Fk209@Kh6ISxc&-Zpv(mqa2;49)fY&Z~%bIJ*T8X zxOQ5)oOC&+${=MImrre5M6FP$m7zl6bYQpBbHCUFiYuNi{{wu6H1R<4Ckj%VHEvw( zM~d@;rJUZ1qON?zqbL0p8l9P222w+}Opq(3XL+NJ4oNcGkJ`Px@UJvAWnbG1C6$v85~-0TH*iFKNIWG z;yF|v^ zI|$DVw!?!LWB2l3;5Um4s)qk(o}N~x_Vv-~3A>Gk`HqbYsv`$R>dV`k6N6kn_$?kLl6ZCi+K|Nfq^+1-5u`x!Z*g^Xc<_N=?EBkN01o zm@+@|(<)I}rU)fDfsYugc;g3rD2eL?dt{Y235>Eb??B+$f$Ib7RHhiLC(6VoP z#h=UgWXfbPkkCcg&SW+ED{U_EQ*D6Yv5GjpdI369NU4=EzmVej@s#UEmtne`Qo@3B zQ6H#vqJz^*dbpyMOlsjVV_2dOjGV!3S*7)rZ!IO&nPGBd>N=0g0sAs54p~wBY7Lx-NKapV+xP(=_tsOX-rsD@6m+*yR_J4h3NIg3=Nv zSxD)+0M=E#NJDB^X{O(|l4_5Iz0ARbKFq_Da$t5!;jg`c>Ix6=^udko<(D5YbavyF58lXF|dvO z;+y zE+LS>DC1-5mv#ur_qIzjOGg()NKq4+9VS**VcJ?E61+qUK|iJ-m>eq?|c5gR!6TosKpo%BlugL9Hq*o&=E)0aJlDOQ{xvmmuef{8Ut zmer6b;iub5%(l=4d<>xySg%u*wX{S4ha7k$_#`L%hG2@0fh+rkym1=*qJ}&%)o4%@ zvz?}avWyYQuz#5v4W~nna#^saypIm8>!-c?-O!i?a4tj-?Z=06rk~C^=)};wK{r>_ zRxjWTiR(9Rs@d5YIs>Ag534jy0@W3D*8IhELH%E?9cqZ%F$Vf^t>hs0U$8|dh3hwN z(dvy&wU2b>Hfh==>3}%o<@5}p@8d=kD)TMXca2H(O{?Rwc19Ynw z!cdI&zXqz+UsJ>}I{xbqb`bIjAd#!d3z!(s(!5&RE6wK&ym#Udv3|Y`Q|WrA{&*Y#>azK)?w0I53u}2p&2{Np9d(!d|KkL#x2lhMf?2CaQ@-((|zR zyH-ymJ)s?bEI)y0D5;GD>O}0Z3!5kLm0ynf9AdRdjtqKLOP$ zpQr%DDJJQ_LW}g%^7YV=noY2l*Gb{5tF**v2)hsI*TQ3&4Qa`pBb31anFw*kG5!^* zCUry5v+PLgVz&RmKUaWcw>@eY(33uO@dF}q?oM&NSOA3ZdugdlykYA@77I>zl7kPu z)VP2Nc5lgYM0rSg-3kN;kgGL#+I&M=iZqrZUBT(q3QYyF6-8F+(>m9=2IaF@)F17# zuO~M8Kmv2?kKt*pV-Rpy`HqDe2KUZ*1|7HTBu#XjadBWbDyK*h0K(M8GApAkrAr&w zWfY9$aeWL_{5Qn|*pN1&G&9JNH-{G!EByzp%^zs{)})e*(4g;xi9UvrxsI39DP_=T z2EPN^z^75Uy6_Lc0z14F1UDhzz`{LrGY1Z;Tv}S@$?^o<@G&_#!H$BMa6ECKw({27 z@AAQwGt*N{7YAd`Wn3K^qg{30BHjLg_WJJo7gRqv1^W7XN!ATM;{yjY;#QN{neg?Z zQkF|suF!#>{c3r6h0bNz!&^>p*k`9YmRNp_^LQJl)TS11XaA6Vuj8FvB4-21+>a;V z^-x7H6Y`1NAjKS*AflHTe+Tj^);LIde8$H0-)AXNn$po3?34)3<4HR&H0DUlYg2$O z^+~D`ygp9zG<6bumxG;ch}miK8J{Lofpm0ic437OPh{>kh{Yl(Esc_4%~ZZxr^`I+f9ABpvOd zRG1o}*r>D-UIlEwqEqPWN>atq(@~=!1VUv-eKu)8rs;9wkdA`IZal*0R|>s>HSWUc41%SK#Bk#M_xds_yp)MjiM6i&Mws9N(m!z2=Cb! zY6!XF{xq4)`~Z~WyC7ZDHQ9OOi~IKnc~Y#`M}1*}6pAYJs7lA$9cVVgCA#RTuqqv&Gi-mYSKF;z=`ZnZRumIJmGZ zm~#gP2M5&gV@IgM({X|HjO$3Tf+2=mMic3VZVaZGyh8`~Q=9H#XNs9)Y|*VBkQujs zz%dY$*_P|b;X~|vgkuJH=!is51? zD~mp1atW7~rYL3$H#pX^@&lr3`^RBQKQh(nrR|IPm_Np-6W|9ucS!5*Vg+KT&$ddU z&Lb;T9|BYZNww9zft-30+Lt3tJ*W17{C15=QhaFMz!fVre}J6$qd*4adQ+cwx^zLJ znl6P1rP_ZrjI>_0f9Wd9Ez+^3EDxS-gP{7DmxqA?re&ZSp$GSqAqxiTMK2N*6;$-H zHd{{@G^+z~Q8Hu1lN*l#*LF9t@?X0$26U`XUdt(D<=`4bTRwIyh{(DQEK=f-z}S)^-_~Wa~F&U(}WaiQ1qF@K-X7}zexBPWkuqlxQ4G065;pfsj8_d_ZBvbc@W&CxIj!?MV-1Y{^JNa3MR#G!_Z zi%V38dep63w^^TQ`r3}K+W2~X=gvIe4shVWen;2)_wUme{V`rTZ!#`kyhvZY=|+Lc zNt0B`FD9(>ckglyym0Z7I)CnQb$?+|t*ox7n>TOMihx;l>?lphrSt zs|bnAtknBWzubHsGRfD$(2IK?PwKh$gUzc={jtry_H0WL$ks{Qsdr>4rj-FsS==m~ z<{rT%e(o5`NZMS+!8@)u+Oup=emzUISmdW*AWJIb*cbZ5b<&gUkS$XDWj@jHin~bQ zr;N6rni^<(7j&f*Iv!s!u3@UsIn3QjbygZUIXXf%fi~q%SDlO14LTUP-Fl?!X38!# z644)`t6yAEsMa$vMmD<8b>z;nZPtS_O*=7@Q!yi9Zxy8(u-1iYkpdTzC5Z zNokSY-Y3$}YABWRhMwHEU<~}hmcBg;p0uukw!ru=y#fMH@+Il!G6ek-FMlqlXd!`- zPuWi?IvJgZc&zY!3Yt+0hlEMWBV`HkN~K{!5%;ib|E1(*$~Z;e1hs0QduwhYV5%L>;H+UE%D-Md%4 z`s%CdOJDku1aB#hwtxHfyqccg%jY4y|G@>du&}__BCf2i^40~(U}hWVJ&Bx+VdqjJ4@dONK zN*ajEv?vupv?R*)t|X6>F@8h+l)MlpdFu0N$VO?VZ8E%#gPv8&ALARyWAyl#KY-O- z67(>-5CwW`6L&He%fL#bO4Wqncvv|UbvUOvxmv=C$f@Z<(zvu~2vEv{(mY%Jw;5h; zLq}bWYn>@05#g7q1MX6`n}h@AM9`3&1Q9`|YzVGS0-+=-X_SDalB2SwkYoAM4k;aB zYwoUMM3Z^kW_L{|n?2+W>C_B!x1QNt^fPFNc=?d=6!1y$!o(&{#m@yoV@NrY`0d2! z+)b&*0+{^G(7t-R58OI@5S=1V{7_!_qAbJg?5sEG9v>f9pZ)A-C1}fW$awnnNtR=3 zif+9i*)W;K#PkeJW^D(DVFpKs95e$i=J;46N5#AEf1p16@FIUn$M%48k3Xi)o;hvE z)_+0!1A@Z}iO0^Ks;8R=OxWN2>09c;M;Ccp1GZcM7L#f?Z?M7xD@4}ms?+6_Wrb}8 zXHTD2!^1=B+Kn6P?)*LV#N%fSxn28RSh%k~AbEcJ)1MKK9yKyLqQ+@O3eHVH*`GRb zoDaE#05@;lQFmzt$>Bo>)%f@rlAHj!-+bd|>eA)Q>e**Mq277-RXyvd002M$NklmJTG;FPpA@ zL&p2sR%PLlG7-_kew(|LH)I)COGxi(AZg^qb9Bn1B%xe+bt%d;7e{LpF9Tr2ENAkm z`>F^1Em+jV;JClwji+8~vZIN)@`D6l?P&1=oLw%o_K5n@g07}x|69w8fjATmuB#8r zE95Yc#VU^XAgj~D;(I!_T-WQAIN75gj)rPju`|wB$;A>56ven5)Mj@ zVb%ni5kuITh|Y2Id*n(}D#Q3{n3_Q1hu`~_4zOhw9j>1?F^33|LEK7{aT~StnRJfU z%~C{>;kFBrNl}v1t5*_=O44!&(g1}(dcTH2oFc$ghW@1i3BjAXBT>8Yhs^?RVQcBF z%FGG5%PeD+PtttY?DU}Jbvs30npD1zvAZemOEJtVR$syx4>lDx?le0;Sc`PI7Z#9{ zb4=z_Aq0a7(eUta3bmioGnNJvkUdE)pH_&IpR z!S=R$05P^3JW1O(o;v>ogF_y`Vu12Vnt1C~3g}1h9)n)=O|<63IkW4w(F zt^Q7s6XEG6&#CiIJWg`ZcR^ZhfiY4)$&a|%CIUWl`)0_|FkN~E#DTdvHAhY-tZ;zr z*uG-p+pw$bry$IB#)j}JgKKCuPe^!P!SL75C%(!hcsfly|DOHTrkW$h9%cCv6> z0E!U>FWcvhO-QNGcs=te>X}}Om!HomR%1=cf;pvj3>7l;3bI(a5VtQ`k8lK9L6Dwc zT4`R7CUx2p#vxJ?VZH)UL`yK^$*CF+zA>Ha)IDKRlY#R@gc5I8V>0{W4bOhko!SGEDa&4T3p6R`2 zc*5C%0R8KM1PkeJCQsHloD7966Z#!zoFZ8962h<3rw2m|Y4P{4jn(*bm^M-)gH_5l zWz#sv0wae;SiXWrJD>bpf!fKvUA*L&jhuV_3|R<6IEjKn3y##NIz78hgJjQ6(e5A_ zHVDL7xqXEuEYd&##GJs~tP~Hx$}^9EiNiU4fk6|$dMkoRbfU0aTx-aIJ|z~w2NVC@ z4`u~K!O6C+mLR@@2QYSBC@8s4dYep<2F{qfG!|^>G$yvg?nbDFDy$>R5tL;ek#V6B zcfc_i$wT1RqNbcs|H!!@3CehwNH_IiwLqvcrW#Q`GqaI^;Mia?5H(YO08nC_+?E$cxT``+}jm_Tv9d}hb*pb!qNqFcK}oQwk+&i0Mpuw9$%l?kPbzP*ho4LFU)jE z0i}cm2Oq|5IB6*~gs(#`W}|Q^+XPMAC=<4eZyT2kbdGmK8a`D{_~PPH_G6GGC6A9K zQ%omTq$e2{ptYya%fSPB=n@*YLo?;UFOLMPQ2*Q6=FF*=fJrFc*-ExuI`qT1rQjYN zPG`REwq1yam?5qq?5D}=>e>d~Jh9S|nv9O^AqR+}z5n+}zDK`(^bZX4s)>dBD|CQk zd^JW#7FfeVk;7=vEMN_lFVb?x5Dhba#1QJMC zRDKn=^EC^Lrk!a$^Y#Ei+RCPREgZP6EOx$mPL0L=12uiwc(X#p!2=9l-C!|er-l{B zb*=7M6t3)=hA2l$^i6;iKh@}qih!H?A`lu>3`{xdA=z~vXppi9C}(eeDd@r*l5V%I zEea0$N!v!I`f(iS8xNj>aqwU+Xr$<5N^I&Bfzw+BMyMHr8#IVWg^001f^aal9YN| zzak*TrGFp&=81Thdq2ALN)q!b{&MBaF&HG=aBu- zw#CF0NOrJQwA1b95NSKVQ)ob@re!JmL9Rv_6)1<5ZKh_PF}>5~w+aEWab-6Ytvr*& zzcO9M9bk&&XcT}EWR1iHb%~?vtWJg9K>#rWhdE4*sGv<5^?*sXCpR1^rv?h{yUVAb zVf=JArJP3rm#{DECg=PGcJY+rg?DiQ(+@`hzMwGsT89IribjfOdb#LCL^u>AOiDAq zM8$0dSw!g7FW{({gnSMFJ3``>%7Je&(u7J)aLlQC=zwdbS!y8IGG-g#!$TYsF-Mjd ze${zVVXJ0V0X?cWBj z`lHDc4$aG`{iU>aC4>6pP5wGgUytc9#!izDUBL!j2Z=rZg9G@w-C3Ojq}il0-Xs}^ zAYc3?wJSxKB8n|TupzdDxaUZuFx!)lm4eusQx-5Wh<#10mD3Q%%`1@L&pnhX=~v29 z#->$Sz$al}=gOKgexMVR8F|2s!BBQbg_KU6BrI%ORyMYrRp^94WP%rG$IBX>U4n`& zc;vYnDiH?VtX;E!9@L;N^wC%CvJ>xjjeQ1Tn$z**9f#%(kOQRC0?r87q;m~m!%mbB z_S&FrFL2Tf4q#7y2L`%;Vr_Lp4UCe5tMyS>Ytxa3P0nD=g!8Irp&Lw7liFWe^{mOpsk#XI%Ffn<8t+WSmZr^{yqlwlYT0rhrQZ z_D{3}u5YdCq{}VX6fE6gKfkS70Q8ump`l~)=F~e-0gYs((d_8o{@&i9S_36is-*A+ zax-xxMw(3&!o-B7Y;J0@Adzkb=4I2h^5{`>r9z01f!~b2P0_y=9rj+zMoL6%Ix(WI z7}dv|PP2r3N(J} zzz@OD*7ZWZ>s|V=#U|MhWsI91pd*4@Nq`j)`ua=1M8F5O1&*n+s9Ofo$b(-gBjD;U zVmtxQ>SPh$*w|pYcKd*gp&;=?FtIc#pVL4jB5t?X!K#(!1KUU!Tk}K+Gc_bKWszc% zqLaeseA36|hdNa_F!4@Ljdx%Ymqrd}w=Mz0-(&C7(GyUs5NJG6)Lsp*S1?;Jk__s$ zOcQbF!_{4++fmg0x^371#tMcy#rb9klOD1Y!7?K=;iYmo}_YEKEDLqnHqyd9X*l=O=@$!Zl+e@_qH)y$nDY7UwRRfT#3EztZYQSm$g zG?I*l60trSWG@xA*RW-!r?@^Dv?c^Rjk57L%ei1g^XCa3Nk|uTnl5M*FQIZ~3EOd{ zD=7nFq5D(2D=6ob%z>#=0rs}c!;c`@fS0jVj6u*;zSbxWm2;?);0?>(3PQZB^C^eQ(yxztc{NS$ zt%>EeYu9=5J~T9>=I8IK{d4?L?FF|j8^vf(tAk92c`wlChhkPm}zGx5cZ5^E&K z3LTo+L!Y5wukCHx20*9#ZyjV42CcX1_@2aCmj;KqQFSE=j6Z8vPgu|0kdhVw! z1fwG(d`pFNK7{4d(i-_lK(--L0e}6*Ex!3;f^3K~TwGkD@*7lJ*bYFvpwsa1F!Nts zUFB!sf}Yu~GPiFQNy)GU#{e~D?P&4Ap)b?L^$`^Cyl`)UWW1>+_Us|vLsZ{3*dA;% z=tA~`17dk;S93CnP$jML#mMLZBY0naqJvXfXWVLUJ2l|3yh z;8Xe-m;{{NvASZ^W4b&ObjlhvrvsN>7YV)V3|o2tubRDWe)cod_YxegdO25~l^w)~ zJQBA`O*t}gx{k){3;3k!0}m#%1WFkl^&w6O-MFr$DO#=N@35mWE=y}1IuYAylWh_Y zlPaG0(!|HSh%R2dq?T#2hDq-#O~z(sX4tuK>((8bkd3iqn56BY$=NecKSd6ORdt;l z68C6QeV-=&s6zW@XVsb0r_@_-zsnP=+w=447)_vYP2#QFchup-huFD*i5n)bWzGdm zb~o^)pTA)1ud#P&;`y_;-lB=t06RP|p&T6@QR^G)>h|qMJ2kn)wB;UgF=U`f3gw z*b6qleEEucn`D4(QTA}!EG;cjc~6tGW?Rin?^QR*39(3N$BrIVxB?Lq46JB@-oN^l zFV*Xe;TQVdAjbguFgTQC|AKcW$`>mT#`{MZ9kQU`gnjPbyT=YA*mj=k5a2-vlla@W zZgYJ+y?RQ0@WF>XX@|{m*x|tg`_;z!COIf>sOjk`HBL^HNpe)c7I*L7qk1^6jvP6x zKK)<#gFcm zygsLDQqZ@i9S3GCPz}%Br()(I1t+&$vh?ZE+Z_uU;)$w;S7ihU`rbfIbD$tuy7im7 z2&VLB&*f{>0KqTBTHO9I(^V~vofCiV-(jzkQ2{K_naR$Jk_-o?hu1ZW!?Ex`$WOs& z(}eLUmCKZ9*k#Lx5p>C5uHV>30Cj@LNWu#)TnNHN33c=?gzFuWc_t1{E^m`#e$$N> z_-Tm^z1{tV99kBBUzN3*U>OvW=`z$`XNpwuR7P8XJuK0p78FlG*|}2)=F}3?bwQU> z9FEH%4iXchp4V%6Fzbop0jnt3E4tfd%Jr@SrG)&Q9VLCaF;*dE$aa1jUb^zddtm>5 zb>-SMb^O>-`dU6rle`t4(CrzcFTHywd6fX_0InjNqBtB5Sfwy ziR5vb1jBK0izc2`1#DwTg+e-|4$#E*D%tPY(Ie`_@nbxp9cJfEFMTPWP=EUm|EQik z_XNv`WzEOQ>4M2AoCmP$v13R0i~YpJI8FAKdE$);Dx4H@)dJ*-*$?@$j0cF$e)`&v zN%sx18794;fBEWFUh#o4#Yz#p?y#z1baYhBQMq2bdYv5$_==7Rx2!kd6$%XNe@S3a zlrJ0yv`)i8MSX%j;QYdB7|1b6<&JuVkppxdqvyki4zgWfYpfEPB>T?o+s96vt0eD% zgZtUJg*pm+(1qM@z4I=|u_^)qI&r_|NTDNu@1>OzcEC*`aG=3~fHnbK)B)6eIK3e6 z&6~9Hf_P$u#FZ;o>H1QfmEu*>-`smn7XWao9iAH$a~ZTh-{S2dX6Kq`syjwrR?S3AKK%xgtlZjT+%7q?pZA@8(+iSo*--V!o065h)3pk-cOp{*%2S)LfzD*+y~Jd*!9t@K!0S|vxzSYQ$+ zq1zuv880lZs4?1JgX=syEnutA%E~&6^*{a3|D*cZ8}B$Ge)YG$sJ{B!Uv$#Ckz5Pl z-4%O(Va$|xA=4ODj~8v85-0V3Lw*Rx9zW*DV#`qW40%)aJS2ZezA_#UIvr&S+nKTr z**8`8B|7j~6D4_Gvf=M#v?qbb82Y@Oa)x9lZ!&JnO}4Y6<%BB8$*E)8bnc*CKmD@R zTUSy-qYae9AScK7q|ZPsSDkNBiSR+Y-(iP|t-JjU+P;nvk*C_=aJRF)lXz5YBP*S>m+ zozUE);WLX;$iVk0HlG4Z#he|6vew=I@SBYD0J`APQ zoMX7Ijf2yv*D!LvJXm_OdX|p$ChfRgL#25yHjqHTC|f4dgw zTHwK2z;EYtLInMnUTyPW}Q zs9~D>t7}XQy6g%>7l&jOdb;_rF2)#f8%vyU+#aih>=eRsZK=onc3Ks3h4_MQReFc$ zH;_hytDfFO9inlU`+1maz01Tlo10T{j7}e@4+z7g;aG@|v#AxayeXmMtMP!X4_b`Z z6Ix>y7POYC&q#~QqUV0Hoa|nMR!GFf;HIc=(uj#emb2_j&IMMph7lJsM%K>*BU=F< z0*%C)7lZ(Gn%&7@l3>Tnu`0+($qyFNX26kYwkRmYSiXTx!GKSqMi^3n+;y8tTLt9L z7uS*;jlxC@(6yi+)z*B8T`A zjl|%KNkv#`+5m_EvA(V9Tvw_?9`K5kZL(R>61Jgie4*{65N!vYBxqNbt_3>A0%h&I zEWKj{??6Fdv-re7zh~pN)#n9OpL^@#~nr6+E=b*)yerQj(0=4y?r0@azM;#Ki-IX}=?HE&W< zp|pVN>cP2?s(W?dHawUE5p7nG5p_3Re+w+=)Chcmsh_}8%7OzBk&d$o-~uuMyznRC zO@8Rt*t}U8L;CG(+@UUaS@jGZapW`nAv^wX7C=rgHo%zzc*a=)2G`^nI*yG=4|t}oHSoV3*?c2yfotp9-w_)F?b;DD3mZO*Q+Z=tZr zmp_6p-sm8NSxH)2V$XPKlolkD1)akzgp-5Uf|#9% zD$Nj(G3C4olaQ&1e+=y#u;;^_gb9Q!+h#PXsxDL^OEdC6IykA9ayvEEvJ`dWG97}4 z6ZtWz9iTs4J%}4B0Eb%yaKi-BaA@Lz{d09uaR?wLZWk|IR`=)z1brLD5MNz+gbsT& zH(t~c!~-VOI6Toz20`n!*Ir}3FTeaUO{D1}X!1wnHjQ`Qd5_ZpkAnws8w8$l^8#uo zCf$b)9;AZ@57Z~;pa&g3qFW*E(+wNAjbUhr_V?2{6DN)z&$t96SiyzpL^X_|e zo#-9);`7fk4dB2&zjG{v!NH(7xDkgXngIDg_sZ34eEY*Z-2j1rLmQ7% zeZaw)u>cvs-#AQG?%hb*sl?lz6Kv3)qI%buq%53Z^N?nzEZjkAp z+r>m}iPxCzL|cQ%*f@~_%j!`p0Q482Pt~I28jjC3@2CKo>Yg2)5=rsOI zG(0|%3iueIWZr{_r}QRSJrKxW=)g~PI~pA%64e8lWI)Yt#zB_`w6$LnBqa+NcsdEL z$+FI%AxM@*%_OHRpWA*yr<6Ku6i+9#UqQGi`kFXiLYbKLbn52o&*cx`odZ`+q1v2S zzX%%%J2lBXec)>@pIo>m1#JTwZka%DzK^0 zFk!_PaXqmcpb7jSPvC91oM*JZxw$#!%XPBWPS)t)Nn8<#+aZke1J@bqulxfv;Ut-9 z5<5l?2iyu_2hiNJXN(Tj>}8!Wp+*|6g={7a>^-lxhxe0s1s{mnOZ0I)Vn0pPaa|^E zSwLTaJhKH7^1`XmOE5CvMhQ4RFqyVPKjBPG?WIZg2ss+)cxJ*ydBE;N^xaDD%90zc^z<$6(d*XLF=QC?qfu! z%Am(UMLnpJ_9IOzqs!!)!Sy3HwxxETq(zj9YF1)ayQP$XWF#lqWYEX~v6@X7oCT>s zC$ephPVW3T2O}i5EJ&Y@=|@A@oJRdqYKt?d>N#8~70MtetAF<)A*+=8pekrqlXXvcF6T%yr3SfPc%s{S{JhtbG}_3e=I2&U^L zYD!=-Y1l(~W@0ClSR{3rAbA5bsHFO#EE@3sh6dM;s>e-_QfC z!Tq16YJn9IO0Q5LyI>^*Ru4$WfUaY@S7y0DfC6s7F*M0N3zB_R!d*nmzs`QstGTn?5BASp7ekxeU%5KeV<&#A>WCv62cC4J~QByn-16i_-20UCi(T%ynS z`5+}#I}1LLNoY*7bOUOq{Y=Wu^@BV z1M4V>cH$%uImBH|SMS;@MxePELJjLx?bf`Sv24I+sKak`073)uFI0zUXmO#H^^ zt8pq|5^M)EX+#>Hn+ay}Zg4>d6KVu}kvDYl)w-6ZdJ8gF}>y4P)@}8!BUyZ{x^kTfQ84i7#<_Y2^a`5U}mV zbUwC>4WEs`)bu~LyfNEYD5a138syS!%0Su1%QuGI&5K#Uyoh4qbV$*Fz^RZUOAa3?Z;Ed^pWc9AT$_~eXdi=oF-ehh znjC0JGRca`2>6oZV!HR}B2xg=@Cqyg6EiZVLxK*0V?u}2I%fSrQ`fQ)gh(%VBg4)# zJnXarI{(R$suV5dYtphMWT6>d90Iv<2$YeQ#pquuaw3EHM3+B-zTm;4iL|7=P)XuQ z(Na2V_!N~KQIa&IXdHL35cBG|#LH93!3x$f&vqaj?^m?6zRV7@AYBI{5Fx(Fn`;7S z-K0mx0&)V_35w}!U(qJrNp>g5CS~YE``I#LNYaTi7E72rvy9!|*0!kq+{8=4M(;kC zSb*%xFXhPBb(%1BV!bX=sHRV8Zhi(q>; zX)&FU=jQ9XKMgKrmj)XqU{9AUiGl=~SV}ySk<)Re_~<2}5hgWRV|1jwL)47UF*+eU znU;Flwn|^}dzj)MdAvim&QFw!!kVkrU4O+A841Sw`aaIDBkmHN78F;PJVS?C`Z+{66i3Pl+rDa-i z&_`z)=xr73bSB%Ra3wt~hX*YL`!Gnzx4OECdqX!7I&z* zZp~v?SI;BKCYzK*ijp-vN>9?_=?yj@7_b+9Z(+a-!+;m|!VAOj!p4KWGQ6~Ga+ym0xra52Zq3S z_xE1vxHO*3Fx@SZM9OcjOQ$%Jn%ZmEV~1)^TC>X692eC2UD)!U1xbg z7dp~-R4xQh%99FO2Av=>1xen7E|JTlj zaO6=TG0L6D?p!lj0G6X)_4UiruPfOzaqN*mSyS)Zsvf3g?A=3i zIR{H8zAn{6wbUfQXxVyf3E@#7{?#t;abd)*(_k0|8HTG%I*|}%IZPt5*|fHr;OZON zy2=%0DM_T$Vz_3%XuFp3*K{FRACL64ygICvu;W&phcNQ3Ul|x~|4mwUz++8g;NlS? zWbAb?6eoGT9;-`ByQuFG1%T)g$Vrw{YC;GGDP$ZXwF4Rutgt~Qkr9KA)R>!_>jabX z>s16V#N>x~=^|&z3{FWYp$sw4Cj_siu&k-P8R3xpc!N z#8($^Amb|i9-{Li9yxz*a3YE}=cSi_$nv3;fNXcy@A8CwgLdrTEP}7S@Rg2NOW-H3 zy%E0kbKmGdaoFS!e(*~8%Zp=Ibveljjb2AaLOLQ{ncf?~;F~eu={@ z-+1#a{$d7RZNOJ3(B5Hz;M%q8yjXDj*fGw(di6T-T%yH>z2VbKm*^nNL*c70e3cg= zUV7<=lt!P?BpYB{f#37bJri&?LCbaV(@WtheVGGa2En-vpM3f$AME(m7rxA25ow_z zFduzD z@o?-v`PX6N?v3#ApZ^bG`R=Z;^3r8$mTB>U{7D8f2Y=z8heN;luLgLb4NNcilO3aJ zhy}Hpn&mbQ=k^;GmSDMm#e=e8yiJTr(?K!8dwt?C*LiYU${O9lUC2hlMa`t(aQ%VCdu4^dos@$c%UUQ-Gj+rC%xe~H7 zCP|k&WKHFhob>L)Sglih_zSf$To-JP#7R~%zbCP;Gx=3kmxM>WW47sy79opw$ZD(u z+Gk2u(D~qR<4E!Bo8zP!O_~|2x3Tw1!xuXssY@-JG;UBHKN8k3 z*5o8y>u@3rKF{Pdf~Y{`AT4xI_*Ej5Ssy$^Y?laud6mGEW0Cn(4XR}{(b`oTbW*vw0qoKwAomn@ z!X>9ce3xtwO^j+(m{wNUwi6NxxTCxz4n;NWB)?P6HN=FT(7|13Q*h=BZHVVr;N$V~ z@*$wdXJ#b~BFW;muevM@`d}0`*X7h=mqB8E2K!XOey$EZiR}W zO&nk7z#>3*21Vy{aqt3O_{nY&#-;cM?E=Bq67JA}iLlYneB)~@Uo4}@0lQ6FFB}HB zNe4?l_2d)b^*7$6&q6-WJ0@Cu#PYy`2EOWnPh!gT^plUX4qv5%J5eT(d7kU|zx?m0 zAczJn!jL0}B|1nFO~6Cn`5)PTmVSlW5fqk;>*&6;Z>_=-u=XPRZKhxMNFh)*Y04Kf zHf@`YN`&%<@oEOdkloV8&YBvIEdlso?}s*bn)ozahv<45M;`RI+Q-n+f;%B1ot-%d z+S!g@LEvaPPvQb%mPC{yqbx@!V4}^}P;s%&Lzxpw*xBujn>J|CsxD5{T+3DpFFSmo zj^D~rJ6~x;@cQ8LWbu?8--2ldgD#Rc@$tIJDtn)RfDaU%w2sWOSQ{J+>?;1NoN&1nMPqXDdv z%Q&8vF$14zaWW#5(93M~?^k(jXOYvfyEAeK$m+;T+4tCnmo=-{DZ5j{Er`BFycNQwDjq^)o3W+;yFS5`fjpARll@ z)9Dn=E}<*1pjFp7BT-Cfr85RE(V-~Fc!_9)^MXq07j{sk0Hv5M>k`cLX|PK1@^mO7 zRT60sxUv2j)u%i3u=NOyyZ2Urr_aJfZujol`~>aEv|H?J5(+KsVvq~+&9g;bXbQb~ z@0Q*eHrTgDU)#XXT%bM61fB|oJ|DWyiwhuWWj1WwC_V{^b_?fiVzHy89~mMl3p#oN zBs$J3r|?`kagKthp=fven!3CPhnG_PkfiJOyN4qnbCvR76Fh(_U!d$wQ_7g1x75Ba zw`m4jm+YNlqr2ElcKQHE_uVP{a114-{a_e!Cp1+Q?j!!L574XoG{mH-H~@z)Dgw_Z zR>&?Wh2e{Gu>))Fi?nvm-lAm#;#HG{T#Dw%_nQ2(E-)7}(;2oiFQ`|@!1``KMU}R$ z5n3XWrUt~q+RXwq$CvU)KG_9t8sLIjt8wxv1qTSG!T|L@RuUTrcHO}vuU38{4fw?O z7W))ZC}BS>O`$X^p5WsS8j()k5DR^|YrHh!-H;_6mT zHNM7+VAa0>XLP}ndlk#cY@q?BEpQ%8OF22>wq$c>qU~Hl@_edeJ-uByz?80i_Gb9#o&SfP^xg_<$G#elo%wlsC15q&yY(IoXzBg_ zy${hiG5?I@JYsAI+*m>_<+L57ol}Mp24r(e(2VX5*qSMAC7{$@xeG6e+q>jXdlx!o zyjfbSGNlJO6*kiKScjut$pnfA;*?HxB8OCV;7n`(DuzPtgKd+^9=;TU6jqW9jzr5B zn^JkpqccsJru*bnIwj*n3Gu5|nsxz$pQx6wC5@(4nuH{)yZ8012wLE+Xuvlx74t4< zUh7WOnLaCICxR(wcwH(@$q1#il#U@{GGnw{-aRP4`ctn31Pm&v#61OsAgeF0Ckr^Z zWzYcAA`9w%Jk+_Y8|p0NscB8wO%M^T_O~oUhk=QiF)uG!Bx!wH2AOGb0Zu6013~ft zz*`jPSgL@~P)SX}L^>aXEp2cpYEq~`Y>_ytH{1vr9Ew^x{-obmp#_4zx?Tn2740Di zX;8gZv%@!fcj++@7oe<#4bT`-p6u3TXAT^>cmF_@X2q66A%4t*tL851qRe#y-Oey>OLjJ z_dla0x1)S8i7Gj}yWN(XvI!O6@JRi%aRl94l%4 zeQ66l5Feo}Ews=B%(f;O&+YUTyVX7oO!a? zu`Ii!EU?_Y;*w=e63VjJ`GjmMAEJU%^3DwiOV|nEC}kON8Kt%|#bz-$E>Eh9nXQSA zZ$?IT?Al7ahl^9+RL4G7LS$bF4&1q(xaKXFw`$X_YDMJQ&(Y3 zSRA#zy3Yj6j#`#Bp$orTj>|xl9(OK)H`SgfB8nivP*T={v)~XtBXEtwP+pO1U?2>^qV~CN2Aa$FnF?}QJnW88K}c>uddu($Q^*p0w~8? zSz14`@r>a8O{l3Nl0gMC2$ih#&VXrBwJk89s6QY<^?T#qdU*TISHdelc#Y0q+8Z8u z@_6{>x1XQ|hDXA;fAP2I)rc!$&)V~0WzXSo?fR{7>9ZT*z&?6qfDZlR*N145wz+wW zh|!>Yc@KzMW?3AQ&UxQ&&xnqZfC(}GqYin__wUCLr$j>rGuu|a<=8($zU{cU5N(S7 zVk^oRx|9FgnGaV9T`#!uMOa(N-M9}KrFxEj=eEUCapDs@LzOm55WGwL+i5}L`6#sW zvXFLaZ1WN42S#eL!1B5R<3V4YdcRsl8r1Q?qq z+J#J=l(EUjH^b6KLeVOk5W+eR3LX{EvUo_73-~0PDmTeV?id?t)=8#Bto^KPEpsoT zk4-1Iz}q|tTAY%g`Jg7j+c|gptQy-4glCH9l3#mtCc~AJ71uG`fi;| z=#p%M`osda1uvM%of|4&q39b!_L~ereKHB_JVNv<6*7mPCdJC$>f=~aqB3AxqXQHr zai?FU(oQ2?9Tu|RtCTmeC-PJY!N;orqh}8LC``9tVXE4tjbs_r*2V24zm*uWlJ5?- z5%2}bZ*{VC5Vv(_C@sg`*ti?+-u!@Gceou^_nf6y9rlOkzVxl|#Q8lmDA^bG9{w3d zT3$UA?kqna?k?R8`*t7Wv?reW+3?WmgLGp5IxRSSna*N35N=$3BV4=qXYB0JBPNCy(((~mV@1P;DvAa;N?U^(F9U`I@B@jiWxhKK}O zx9E!%c>1(&Z-1@?K2dp>&JO@RT%d{f_FHHI{`T$L3=5f1taxG$UZ4YBE6XcPFPo8SM&rVGHnWy+9LRqrg`ppg+FkfgS}kkcYkp=M*6Q z9+hLXHNE#rUqQG_WhxhJ0C*UH4|%2x*igAGPy%v zaS%M=2l=1_K7Yz~B>nJ3kXf(wYi|)9((&3gTKA?;k8aQc+{&)7v5$Olc~@B8b)4$m z9r}U&9mPxlc*&?tKFfuW?1qXjS2HA5B$_?e`HP2}S3SdMiuK`cfzCr~cPm*4?j za+Ubxv=bD}eVoM*`fd$L*S9k%K4if^vYizt15Eo`ZUZu$`Ys{n zmYF6?@MW>G72^I-ocw`+e7FMf`;o-{l9oY93@*!3MwcdIr!Juopn}c((|}RGrrQIP z%h9|Vr1JBFPNI@tHeRY12E()|X)a<^)?5dAhmEpZd7|q9dUEE%gcQ7lSFm~lITJ~- zFjgUftKC7v(y77Ep4Zl)lw>KT%`QhfCKVc3XRDNvLLA}^*&K*)C=~nxFQhIe26zi0q=FB~}XTzLGs-wvz$ z9;apPhr;F0J`2nD4u-wd31cw1n?4bVb{Y!-m_S~?8N!{7C+M?>hiG9To>>3(>)#7M ze&q)=`P&SSKYcR1@QvSU5)_{X{P4q%!i^g@!|px1!`eamT;p9@$k?}!KUKJg(uS^E zG%0-fxCpG+L0A?cVz|Lu4Go);2+^_PE9lIatQ zm&03cy%P=|+)sQqnC7XI$D0m$gw0-k?F~Mo;toxaaaP66n>Tqu0gDWfAD`VkN%Zi= zjF#)W^jXYb{PwpxP?X90ACUcS-k`;pU2HonHlPN8J{B-AQQk|RheukSOKXlxgsOjcy#L4S`^lHuOuQ1&!0?W-`@uebHQ zoR^X)#wxNhd}*9gmp`(x@?rv46d)#&7*Qt;0|bra=?q+&B5l;=+r+NXfpIt}P}9fO z)tr%@U#X6qpCBPpt80|aJ0$d28#)dzd@zruKj57RL-B&V87=T%#5Dq+Zhl*lm+foq zkiysJUIJUH2a<<7>BByy^&-A{lFwpTS<*5=t&Q?%+SZ?eW9evkgd2Paj;=0VY*1v8 z3-RM(6D=;Vl3X=_1%)Sf+^Sc~s4RR7OqIzbQ)y5Hr)I_|UIc4O)V!?xO$6o!>bSBf z)=?sPzq1gB()yG{>$sINRa&jGfQQFNks1t+LBkS1yfrF)CcB|Mup3!PbTEZ@&} z{Kk!Iv`DZ{lieG%pm4QQc7+xT4jw!du3o*$lR+#j;KGC-KTPKEgnvIxQY8;{?xBaD z3a3xt$u!NQj!%TGS^xk*07*naRDYGKFP>--4LCXc2=N~@Diyqgn-yoaq<4N)EUGy}Y^6p}>h87&KVAFaXJ9abyU8bk) zSolEM>>^s=ahIOXuh6F+kCL3Q5f%bqTRfSc_Bu$Da4gcGEOEyo!`d1q<~04H9SW2j z4%4LkVOqq&0?`4I1=lJqXkdVa>&%%`yn_P^Dp(9*`KFNNvBw?_XU?7pAAfWq93tK* zUo1rJqs4>+2WZy}@$LHyW;yuh*iri83FYe3$? z{l{S+>9@LkIjrnI6gH@?Es@<0?4$DDyB78xJ{#`sIS`iau7uqb-kOWb$2kSRjW2wC z{`S3mM zQMIZoMNWw=%0l(bAC0Fi6Zjw2pnJlqK=87Ob)TAAfN5SZUHPdT)%T7oH%}lCYAeW zQnNc;yZjT<5|gQOVb8w&Gl!xLCZ_n!azWm64?Q#sYK8-yo_g|ePKTayVetdMS+B!~ zqi(V&aQt}N4uv6p&p-Q2l7&SB?0RV3`H&zxk-fCA^7vzqI8b@^iQ~t4_sDfRn*(k3 znbW6opea(YV1geO25_A^H9I}*uE3?s7zL51Xbbm2haW{CUOJV)p_7+U-B)`tAf>)+Jk3LCyH{42QG004Na$ocZtp-(%`%)pVUzyy8%eSr;LG~wv9$7KD?bs zr_Bs7;NxyUp5-*Ba^vaZpuB2F@E_#z)b5uWw( zc+6|xt(0$8odr+q#7s>(-O4a5 z3x%|NVh7}j>{@BagLJo40H`kLtNEy`NiaS&uhWIK>b%9SIsNHVth^=OQQqOM3;AQn zRN_6YMy)hFdA)qn*aP8(QU4VIeU?u~0xQ{btU)Rf`@@ z>(Zy{Q16t&PwpCOtZ*zQZHuueZzUb;&tfytL+2wb=^_)Y#BpPz;Uo`t+X3pl`w@=* zi?V|M6^AJgE@`{i(7|7%0H_E&a zFv#lJW^44h@WCtLvkTuP?#toi!@nAi9D9U)@d&+Rj@<{JeDVn|BCM^g@tFcR9{@ir zB;dl9cAQOst>{>6z(NDI<70ONb~0eG0l#b4=pA!9H{!-kIxLd5f)8G#rhbAv2se=7 zx5Wd9ljI?Mq@zEBWq#=IY@gR4wfA5Q ziwTKJplSIe02A%?Mm7$cs z9n-Yk%JMBayQhIwvr3t2OKMA*I6O>j8bnf z=+o#|&q}bf=sPIPM5huT;DFaG4Lfl4<*oK<*p@Kll^+j{d2i>NBA3Bv*?3bqIF>S{@cbqyBsd(R6=Lb0@5t1}t-u^YD1hI=S1=|jGxr+|K zzdfBGlOAA>BjbgSUJW0-`xZ^6*2B{7$HT$3vjOky<5h?~bkN>WI$ZG5rAxeUfCCk= zsDK3o>}EjwjRgoSDqtZ2iw;-lfIqyGk2vyiP6MvBBahJ6Bz~QoU_GqtdyLacfAB?! z)-MK>@V6=r6JmVT0N+U8j`BfoezHnWJ-4fT_a=iy$X9OjwyN~n=*C4O8VgOn*3pKw zI4B&%$)67!WQq2^rEhP68DfHVN`6Byjp-2Ax%zRF16awn56-~0X&$bdWOPg|{e`QO zwH**Fk{<6sF|_-(?bmU^*8&4?QCCR^EfZvwxX3ii*v8inTzn{71|pNbYy0Z-X~HN+ zO-F2yO4#C7E>|8nrF1hKX5_$RNHzgFSsGSH(bM9#$74Bax;ZYsev!+P!}%#zpArUS znP0CG=nHht0xblPDRv!r zm`?eRuRUOa0A~(hK>@EpU_k+W57O|(0PI-6WK4D~fEP~J$AScKu+Sg}KH{LqwY5{U z2!YS*!K%2??uCK(!*38S=;E+JeDV=I`Ll=k;sGY6gpOA$QI6`*fBGEl^#i#kQ3_VPg%v=rfv^>G0HLdTvAqEiUal7M4#xKP!tV@OnL`KpGV^ z_5~@)(%80C$5SjnM(#!S?c4fE3)Ca>B*mr@yh%zAV(ihAP|qewmdFb2is4-bk`Q~v zE`|Ug@Greg+s{e~3<+vhOCUPxRsBkzUe;l2xsXF-8G`fjhwyZ|v4PH-gkx*u>D?l4 zf%w!(#Sf1rRD6x1WnJqPeK=timYs1avg?+^;wFCPGDvNkzWg>Q+hA|lM$6Rca7i2a zEEz2?`jO&Ag#6c{ikL~_ApHcY9^p1ID})rso6mDeD;m@TNel*{FuXyMQrcatHTP0fy-I6?sa1`N)<<29NL-UutZ&(b_AKN7}kOjdD_-y;v7D=rjZ zK#fmDeth8qPgHN-yhXUX_yER-&z<8*;;^0a94vCY_U2m;)Zzjb0Pv|u-c>@2d6*bK z@%Uq1S>;;hDfo2cr$7B5TU@w9U!C~yOW6|RD=@a3R^XGGcOv>d;pV30t zRr;jnZkmi?hs-tlYR7K=q~yuT0gVP_FpAHt;*iaKd;0~Lix)rT&ul_Ie9rPX`SBV0 z%;l`trC0xm)(_Uho|j$^D|B$z8_m4gZ%e(i`S{p6AJpARbZ|=o~vD&^_ zHJt}<3uQNx?_5gDyVPb{n4F5A0vdHX;9Q3w0B14@8qzjX@N;u{4>{Tt^{k72t!1QF zUm9qk0GK+J@kSs#EOqNa-GZfMuVi71#)0S$JPX^0t#z(LxqeN7x~%sQ2};*gmi$?H zg_4&AVLZ!tG?34=dl0aVMJfj^F5syR{((FMZE;^r4e+EdC8i}~noaNQ4AT&LZi9ve z5q-5;LSs-Ele4-k$aZBhRA-I)eBz3qrq2^LoiJM1^9k6^ltIS3?z|BkUgPniX47Gn zm*a4`)=1HDa+wx+g4c}WNoS5FDUm<@tqB5PcgYn`!z?2m2M^fRWhA0)={>eJB^E}$ zhBl-`B}tPd^jB`HTM{VW#cK0s0aHPVg5T;H|E# z(nKb?DzIBY7M~#J{{3xV;lS4%u-kx~jd#{y7=cewa+)w{ydNStMFv4RN}obK zK>mA|CjHp40NRXK5!uwKOfY<(Nl8x&Kf#96R4<}ica$pjl$i~}n97t-E~jKU2wpG8 zh~`bQp^v9i3k(WjP*Bdu?Er)Uq(PAyWf`K|iHMq_?U&1vex9mBOat68rAbMQ$nxeg zt!8pUH1r`kDjfmSYij8=lSGOsBA}t|0@Q-dH~YqF3gQ`P?h_US^310f8f9ouzc4ZO zq3Sf+a($giUQZPEJ6lfRpCf*9;jQrgTYnO+U%L?YAATl0_1t&DuHEq!2w6-;nIKnOXpmU_eus87 z$fqdh{Y)kn7w9C9j^W116Ul20T}DG-ZS5dK=`xHMj?PTTt4NBWGSc9J`nQzntTDVWvY>XD$1=6DL>V~c;AF!J;NXI}0HEYu7)?|N_Epszw);MXItKp?B&;D<#7{BU6r0r_~6d;RvUaPK*Z^l()4HO0SUDbJV5k4nEVKlx(=jw5{-g zTz=Te+krM@7;R&;OSTWR+yJj}Z2lxZ#E!C&mGy2&Ovs|Qtq_^8aY3lPPRI)0w!Sy$ zJ%apA4;7jo?#w5Qu$aG`Kq2jGtz__qY~E*pn*5G%MDBK1#ZQxZ#oGO*2QFDyhYT#rf!X`@P?zPQYkxWj_n?`tq+R=)|+(k1~NdSqSrKH+> z4wF)5r}M}ViU(r(&K_?u-t5#z#pIfn+H+L;2{CFw+!n&K9sJCLNtg~q;0=yP6tit& zgY6nXnnX$HSUE@=?vN9pg6>W}8pO2qo!Ck91B{Lr*g&BgE5fg3mnfFfKqFfVVZfd` zw=&-AAf7tH-0@$xKjDJ*nRy=0OAEbU4DaxwhvYp;a2KYBkrar#{N_LsjF zj;ciWVc53tP=mzg)jhs4XOtRo8`ZosG$Mv>!AP zxp0^8Y#MG2R+NbCk6y@w3_~t>b}1;`#*HqtKMk_NUQ-V_z>H;|q4b z3RAGC`6lw+UD_4;eHJLy7suGEXbd-`Hgwsbj?f!b!pBn@z|`fIL-cY^6Cz1mC-*%Z z$gu?lgmOd*?TK9FmW#3{e558&qb%OmeiXK=61#BSEnFG|AUgt5x(}^^L%(Cb}rz|23%NJz(NIfK7bAu z8BqS4n|H&;or}csKv>>&lwsu$``Z1oxd>6XdVX3h<=}AvjWOtW>Y(k|tk^fo zfcB*>jsJ}dBC+JvNl)5|)hhA=f|l~=Z=Dz0cY)QQZoP?Kt+$ey8W;dgAHYtF3+rSo z!enF$QBP5#oy&#JGEdbho93xw&nH5mQ}Wk<0NbFMW;|0EJQl$R!ohHk@c>r6ddsn0 ztFZHCw$ze(WsCZbVc$mERn0qPS(n7F(%1IJ6xy?m-?(augJE8BtO-`ji&WzPxTU-Y zrD)24MZD8}={YnFQ+!$MN^6q<28iFgES2*F4rRFMbY85Jp=+aYI_Z~##hX439yQw` z9};`M3AmDBN_b=?+O@E`euZ`}oS{!V9^?b|@Ja*DM}Ti(*8=Xc`vAKVPSQbvUw`q% zaBX=b{P3MO!%E62hF&St=30~Qys$bba~>{z&W{rlni z)px_*eMiHQ)4vc79eIf4?k{{50=QVDnD&4^@Bz;iIwTLL{Nut7j1Ag(fzK9Bdx733 zpMDzVJtJURzGK2eca#Z#_L20#R~_(~Pn>~qhsp_IlugTpg(iHi6!mzO4$WMrMJMzZ z_ypx$$^#uf!+-#8-MY=~F2}aJs!nETLobAB4QjxQauyYqK=XitLql>8XYQ%KBNg#l# z^@K9nf2%+|5={LQ@CK*FzAZ`{vaF~2g99r4Su(*mbQH-4BIxM@b>*dBgy{q=>O@f} zY;+75F}B2rvj7$gugTAaZl(UuKmstQf=J(y^lI!~{8 zsAI=ma^8t;*sd)oGr@pKX(C~XdG>3u3(=hDWT|&??g%^}f_96kMW+eZ26ml%S%8q8 z&I<#Tg&iuC$(JU?-4AmqoDv+05et0ot#+Z7Y?uYg48GLjIrh$IP{MM>$5Fpf*ET9o z@H(2F=_*?UI~t<|V7*~s^k_Buy6li zvR(YL0>1Phd@+f;L7x@GL>m*uM;cQIdFAYMOy^)>q3;T`@;#1c(hA3A$BoPYQsre8BT zK7sgymtP52u3Y8ACGpuxEDqokiTEnOGEIoFP=G@k@kImgx^d%X_?y4^ZuqU={B;j> z+vMX589)BXtKlMjj&e6mnqfyQv|zHlm(IYz!VM7&XYY_zKDP?Lf|uv zpL}|WXzmWzuEsK7-L*oCI=6}D-EfK)psvv3fqWhkcE+bD@nwlGJ@+N{i`UvTGkL@ZBPxq|a$?tcQIkz7mdq{XcD_o!9Bu_pjIShntx?-srh_%u>=pGlH;V z2rOe}O?&#VCvCKUU0(E~c!V*}1#E0#cP}MM#IYD-+1JvYHSXC3BOayHtZW=Sww0L= zl~7t_@kg$_^i?9?rJ#sdgjJ@g-!@F0Eyan&0hZEI{$C52RUZ(>J zb%UofmsA7wRq8`Wq)K9ME23vzop zh~+R$Jvs$|BMd$5(^pgl4QK9?8ZHf&d{1=2UBW3=jG?T{zGw9*VfSgN9(}rmYBEe< zh=jB<*6#ojG<;9M5 zT2R=%dsjG3lTKWCIt@8N2k9->UXta-7hh-r-8L|oaGyDSik`UBS2yT~K?I)4EH!zybgX!F~nbdh&_KcsBrc%3$}zUh*gS1{Q~K_@{TBIddu;KYo-Kkyc3G4cb|7 z>{$AWjYmWBk3biaN!PuH&z+@3k`sJ5DRxA_cjmc{Jo_KSI<| zB6=-Jb}sCR=a$UM2e!8li8QUYR#9VYU3jRaN;$Scr8s^Jc4%o$HKjI5d?+76bFGE@ zK5z(1`fSO^W0CwSrR7ldlolG$ymtAP0hbm|H7+fAz9f)?{>|`U#PY|Jbz4prW}JAN z^}GcW4DsSatzoIq2D#6OE;*&U$Rl?P0~$kl8dhM`9jJ*co;-pJ zx;m`+cr-NZb_k0ea!1n_!?B#k)o1O&JbKnmq-Dggp9?0FE z$=IQA;>2;b9dy=u$F?x_u^eVtuT@%@IYE>9NC$A(Ddd;SAu5x*IJe`*Z6+?~azqzz zqrr%iKiFk}pI(S)kwepvFm|-y!s{b)?I+s!p)N4p1|0>rbl-cDc0G`ppf5<-d+fG- zJCa>hbdOr|+JY43 z(HLzVx8R`jjCjH+;>F*ObrLyyStO-)7rz_QX}+=sXDyE>FH2zy$Iz&0 zBY7o0$cwVH>IC?bU1C~WLoX8LchGLD*AcfQ3vwczoPH@KrxD9P+68s8#ed6o0l#T= zD#s8YY^B403X6c54#qyC~=HlJ2-RZ48vpB!>9CG0v0H`od>+AF#M!k z`((@e_tq*JA9*%z;k`H(EbtWmLAoIG@YVa{w6+1}QbN0@HOw!T!IIi)EPP`d)<#3q z@A0R{)pQWV6>|Ve^#HmxKcwqvI6F4C9 zjW^z)_u*+5!mWRxZQ%#$jE8T~Bz1QtC7vG30exBKeN4b>1dAI4&Y>u|$#%3KG?E1x z$mdRu<}ksms8K#DWqPH9MBH{4>LPyI(RNcC3th$iYW}yNDV@9i zEDT_A0Xq>8$6^#60_-CJeHvHKi|1aV8 zwf88E&QLgiGd%yoKgtBfR|jUtq`#PEDwWh?XUx)ViNWR=HHRv^zr(pr(!FlkqQ=)xBX zaOj|(fVNIZA=5f=JL2NsG~}VqABz{7ZU;6H06px=nDsM<17x>68BgJ*eB>^A>o~$F zA1NbGFu>!pj2rZHKVGnB3?VPtm`)3)F$Q*_h`li}#*P=cbQr@?)M*?Ri3_rbtO9TE zvO6Q{g2NbT@rUp&Udti@Xj%P{7I!i%@fRs9T`P|l-(0^&Af(@wi?sT)D{RoF9X|V> zKG#Vnn})ET&IzG2PnMSZ`d6h{XbP}yTYC@+6g|1D(*L|?7VPJ$Tr;kVJT?Fnm{hzX zX}iM(ur>H15kB-d_P6EyNV8==!QMASgk{6h*!H;^9Ap%6J-du)5eV$)MW2cu_LKU^ ztCw^X!}R0^LU?>s_ss#sElS4Gob?N~UyN<)a)=aB7W4@NI~P(i=mcYjtJAeY5_X(S zqq9K-FUc?wF`nFYw&2TM=jpJ>C2$f445e{0{z$&Y9SUn2fDv4|58)wQZ~-e}fk&F9 zF${yTQ(rb3Pr`B+`uQF2Aw?R)d~%sI9l;Y`5(f;WaWei$zQ(PEQ#v%vYoq}<;L2U| z5EDd_15p1ouEfU}W7!_t8aB8S{9evHGndh9-g-2OeiI*l^rSyDBh zRFO(tu8qC-)MK+0u@m{u&*CNL|b3-LPxz>om#2yWvzqBnA#}#O?$6 z3IrA#Fv-SF1-Ya>!-4}QjF^<+Yz5%qP{#xGDafT&Ocqzd6VLrdSikuyh4+TleNPC9 z?Ec<+?}yjlc#}V8iOC@jRebV^$N6)E8L&yf0>?}ADN1}{0u#=al~rDB0396MclOL_ zS}18h`5&)&{M$eM^YEL${vE?<`$n-C0vlePoQZLrzSMv^vuDpPej<-gMDpt_^mPV= zA9?s3eNp37)6@D}AET;Ly%J^BdK{rJMgaP-KLaB%Ga zox5>~C-Bca{VXp!eE+4F*~j27d+;?090q!5jqC5(v!}xm@}JuE=38%bHa>Z|d)IC{ zC*&f(%7e0nZde$AA3jN6rSPsd-+m{YqQx#*Gy^>7zyHC9Y?J4odnO#CPgTx*QDwUM z*#*+~Zdm_6{+keX9}KsiLQ6~(H2*RzW+7BpVm1ljW!k+&62;Pt(3Hw{@2k42}>WxQOGSMDXs$g}mJ24A8v zURoTBgI;y#Ldvioj3OPvrwa4~@Dy)2meVN10xmjc*QR8EEfo?^Aq3Gny2#Q22%xzG z539FGF3~``&_cL=)#*gs@=2?yoIOmM-X=?nPV?B8ns*ip3shD zoIIUsvVd+cL%AGVU_b+McsfBA*fGik%IPKey-aDo#A-STuFw*k;d@zcp)-bkTVxqe zr?NiKU*r(ohHWxtPFWt2VNv!S(n#dU^Osf+g*}JA-DPavyG6SOuF$6nSLySC*Z6e^ zWMZ<0*B@Wc+2yUU-v8uqMS2`hU}h5c(!(3dIb)O_c{g!HK= zpWx3Ia$iQ`r+wNm0Zeqy(`5O|m8)TuCeLV6u!{np8^i=SJ~3}!T!0QwJ@Lda!)=;_ zns$>u8HzFf+S)<>)FX^>@Zf=PgzO7DU||6ZE*S2hd|RIKLtRY5pL^yR@{zbZ0h9SP zqKoUsjhi&TUED@*+V+#WFw4QKm*JlbSPii5$=KO?XxO)tGrO;A0)6 zL~pn)V`%JFYkTHiB0hRrEJak0#?YySk13N93Y$jCx@0G$mC`jaFJHrY;rVEN^wYlxcdx%f6URN_)Fc12V}^+z zo`}nN3&@bkCbv_pzr(5B%MV{tKywEn{c!(;TxqH1X7z<5K%*l}fIYpPF>pG@0x^_|cwHop zuD|{?n*iK#6C_RP=5g@zG-6?*VBKGfV||XaoUrZ|N-&v8u7ci<);uIiXylPNX|;Oi zaP<_ioz=6)isfka9)|BRZ3uSp*9i13vc2EhSjTqjmp-^4rc{neMr_rLo$^rV*F1E=hVFZ_8paq2M!!;|M*v~~T`l}|b} zyfT0Z*?zqGKu>Y7Eq)h0J>I>0PqfL#?eM|Hd*RY$;z=y_|L7%pI@?XFIy!hSAL6X9 z)6-m%Z)L^njXG2gcs`Xv&lW@Z-X$BLOm{Ut5pUrH`+e~K$Kl?3xp&>Ydo`Rsdy@Hj z^zM@Va2~>5di}v(AAfj}&cwK5lR3VNc$|6Ylv6W{s8c24EREZDXn~4egOIv06@e`V z#!ieoch>1OkJYfk^}eqcTgTQvCp;-NX2YW&ah>Ag^;cK4jowj%W7X-kAsMN$M2mLzk#vZ*IdU}N>Palw}RW?0$m&xeuJXU>T)EplE$2I~O!jgwuv88obq{B65k2mF7)tp5hiswUKor$gdhyu>pJmQU`nP)sDVa}PD7{8^lCH+09&kFSwN^xr%fj_ zcwqVZKXDn9KXFL7_=!G2CZhC^-vnEk|RRw`u0Qe(&G>LHND!2aQBD*h@Mx zfB5&lH$ROX3Og3qvA}=@F#WA9A5eRiHxC1}=1ay?e*bEL@u+~tymZh9_6MMrITDZI zMxIe1g?CswCckNaP?F#4cSzn$mf37j=LCO2KdPaK4^Q69RzhlG%S=weOZCRWg61Mn z)8C0MNGHT}1oE3Ph>Y_(W*}f-x;zP#U^E}Vp_~MMo;zMm=?NjYIr;KVM^)u_X(oVk zkNnHg8w)7T*j39q%+KL7j5t+Jw3;m!OTx=1cxOivDDvWsC9UIBM)N;tf~*blYQDvA z+71o$8e=dja-T8L%F|bh842EJG&@O|MI6|`vjgmAS8hF=k}QtAOwz*4#wV^~mSm8$ zmIlPiBDl4CNnU5Axkhd%k6jt^fgkC@am(BKJHU}vNT*c3c;IE}NT%F@Z~Z~?Cif;f zWS5F4(Jeh$!0)bMZlX=HjHy#asbWW4fj6p56J5eU#W9~>Pp08mfo&>-3jR*kjslpke8zXyw=}IE`brDrsA8(-@$vNlXPDl8U`lgQr*vITbfi+c`6!G%d&2N@6>ns&@J4;LxxV#-8CmUtt zfDlhW_)w{ETNl%92z{rB1nVpng|sWB)*0GF0~==|(?%#Z(h7Dqc@%*y4SF?zm^Z9g zxgv5=dAtZngEZlkI2$?^g#Cw!s~miRLPeW`K=6>DkXEWhxUr*3P;DpQB1=M`F+y~4 zegdy_%Ouk3RN`Gq(=0*5TSbOlJlnty))tx%f&UL*> z8UF6;*2>XQH@552rwzMspQ@R$^J(YKYkWxXzq*Gd?oxvz@W<~?Q z3D52o2@wp9v8A0h&=bhy=DuG@G<~gLU2TVi#Uz43QT-Z67Qe1%9b!SOC9Is++6?Ll zJbgfx?NT!hKjo<{%%D`$_5tK_lGx5!mng?6C_X|G}v*0bRrMq(w`C$HQ7aQ z9Dg7xolaohMN*lwm{t|WcuS<;#4&abb#O0bO8ac%_BZ;VWUd+<6n9$LOVPJ03#5h zo4Ok4Drf|0D6SZpOpe9@v|(fbquo*%vk+!5?r)ThTQ6-A5c;G#-CwD`%*k%gb28saxyTR{FNLWtK_oBxdPgnF2ale%VRO2x$hXH zHY>ZvL`Api^IXF7J%9Y``!629^>mgluK$p25UVMM;S_?jb6ciiae-RZxWFK0%I~~d z;#x1qyI(2X5mXmd<~Hp8Qf-iL^qs-%aWe`XRmLEjm}d~%ECF>+iIj{sBpm=6NYZ!i zz6Dxr*Efnjy&42+!|;Xn6$=bWOWfh!xPCMI_y5)JhR-fv?b3AM-1*btKmV`)Rah;4 zp`um>Js(Uc|L1@GzlK*|d0Uh2!u$5`3ID}^`yYp6#}9XDTM_Wa4_m==Oq$-;0@`@# z_APVVHWHr~sBJT|qPoIQ)@$W~Jk&Q0)7P=)B5Bpx8%Kk6a%BlgE+QoetxZHoq2j_q znq~>xsbo%bh`XjlSYwO@lf?y1f0{64sV~w+f2rFA95)=DT6)@PB;O9O*ddksfN!g5 zWgl;Gfjqc64{VgIsCOf72L{X4`gH)d*wU6j?rFLy8aU9glWH3T$S6)_+6F=@5nymz z2r8Qkv85n2&Q5qL3$!diOhs@2cr?Exe{o#`04~sgpo>n1|JUk($dfltk`wP<_agupWiJq3?xKUK5(N#!bWDV2WKYx6iMmP@p5y}yoJ zE#+mB&fK(RYg|oGMaJ2Q1z#QZ&1R`do>(86F$MtZRFGST zAOPo!E*sqc^y8?>;({1K?l4Oq9+1`~yP_HRHq&GE$KOJgk-mQkY=-G=F`K|1pJ~f* zHYr-M+N7yN#ZNBQINCMu9M-d1jxmrzix}?vZ;V>w81=1d-B9s~k4Ixbi!DfozMeES zn}|p)4fG=Eh+Mdr_#&;8-sADkFl8H_-&s@fAkZfEG!U}$!V=dy1)*2Mlsvx_dq^EB zaW19hI9nl&=28ylve}ekIhBcxo?5rbgq@mL!hLEuoClZ;$ZB0sh4~;Iur+wfBUt~y zuL6(eq*$Ap!M7YRGiU?HnhhJ!JCL#HbOaj%Ejpu5uE8O97WoNBqt#e6YSa0(ZD3pQ zb%o-3;%E(dGd@r#Rm6_P(_9Faryw=GJeZts#5Z{M!3||=hbv;&SQ+=THRU0cJ@$uM16vuxj_H}8w09L>} zu6KJ5KZQ^Ir9>r9LyE>5LD&fsO|{I|PqlU5$Cw@ha$=5MlQ&w$+6Hm_;-cR&c3CJQ z+0F&z@d|_jqNK)4ArTkNsF6Sc40IIT0>l?H2{!TUg8Xb9`M#OUx@InjIBT9GDcrC+ zYS)`YqC{*Q62i{CdphxF1sy7=Cq5mA2xX5`-+Vqk1hnxi?BxrWRyctlx{pOi)3-Dc zw`m$4Vb~@uZCh@!sjk!6;FHE9?FgB}`!#>Wr(#hQ_1Eawa8S-lQ#+s1RSd@q5{r%8 zoRcS!)3WhOA(nQHYWr5rXq%R|JpogM>lP1c5|K`1pMCrG)PRWoy|CcOJe0M6D0_+nA)}8>#N``k<5# znlC1+f|01j{y~v~s2k+0o>rd!Dw36;?k5o@s?50WU%fN_*n`X~rx8aR9rdrLIV4ca z?gmYDh>n{cm8^hy)~}$dEVNxUd69R|j^V^kA_6rA+8ZW|3z{q%dJUo^m?o%O$Z7C) zV86f?fFFvdmdv32w3PoKq(KM#qyeKaRQ^1umYBa*jtSuBDAH1hfSKPmy2EDoDUB3b z#Mu(-Pp{*B6Lm}Ue^80GmRt1SQ)iAkiUMwaU#~OSMxIleY1M__$sN@Kt^PYN(;>gs zzP@#SDI*8b0#mKoxG8x%0y<5FnHd3<`WX>~?-nP?>?0mnCr^*E6Z)cBz&Zos)`2X{ z=fhV1G@9n>?gB*J7IDU3hpFZ!#nG1wEiTAvD4Z#-speK$ySfLv1TGpcMJ7UYITG>Chk~|8*Z!5YVa7;!0E& zL8aQs19nwuOy1I5W20#GL86e^w58vfno-YkC-mT006wOjtR#7(EBL!qO2loNWhQZZ zw|Hqhl?AwhpTbQWOX&i89J(!Xj7wl+OJ#0?I07t zr1>ITd-XI_PAZ}6oC>oK776#+pMy|&HOks9jnAewXpBLpfqPT2iEn}40%fz}LyQHP z1!Ldp_hH#?Ey6IM)ua$_p;bT|J*h?B?IP>w%2x@N>%T(51kW*z-2%9T?S97O`m;ca z`T~NE@C%UOi_GHVk3J2zZr%R;n}8PWeUpckjue`85!A|O zfgmr^TtXJ{KE@l$C@Dwi2v4$CUFQ;prO*V!b*Ta={!ksz0KY=R3RaBQ^wl=i;SwRp zp<#yP(l8}Db`g%`gDpBSyFdwf$}~@waqJ5!HL2NB82}})4@_iapuYa|;zBeyasY%^ zBK)=8vcF{99YX?sS{#Su1CYIGU+A6bsUw$UgSHE@uPYA8k#+q2$)XL4L=b7vY6!&! zxrQ)LUSF9?RN`AmeHoy3B`+OuqhuQ^O9}Wr4V&A?TVQ(VFHXp_?^u>-DJLp@TmLP4 z)DzWV=Tzx^`OUiqi=dJ^h_-yv=o`o`D(}p739|+g#!Mt1GyA@2U+K%FA)EMAGOQUA zXjz8anHf+slopBWFx+C)K{~FtZ`}!h_<#OMz|r9c(S`7Y+{sTYK;_{Ufi1Iyz$D_dX9OkRUnpU78jTG$ zyH^qip{Sjy$%8!kX&NFQ&R;+;?@B|+j$zOaB@<3+)eTDi-nf>jJzUe6si;0_h$?7o zZthaqMp(+>Ga2#@Lg64-vTq9F%1gG5Y;qY=O4}!vd=Y~cER0>8zR5c)q0`nii*I3+ zll8}rJ_o?WWt5^6W0r=DyQR(*kxXJqmfXIZ%R<|rcTv=9Ef0A#>L`(lRfKFpW2<@_ z(h-|803XkFn3m|k2}~&&t#Xpn`-$$4SL4$ym;nF~5)I?xt}zU=IBCb>RPGE0ORmgx zrUi*Isd-c3FD*V3eNA!82Dd72AQ=6$&docJ1*U80CkG@*lQW&t>=;wbN)3NJVY!4j zNn_XW8qv0cXU9STK z4NJ#xW0LcCOe~vT(4&sFrTn!tfL~t5-)S*5l`+GfEVfKayjyMSlv7gnB|d%Ho3FkZ ze*E$qeS!%sk&U1K%2Q!=rG6NrLF=QuASJ$7lN)CAeLfUva|B4a{^W3Gs2>(jGGfVxu1#JpdaN)v?~zwuIWyb6f3Wp zTrQ)XAHm7(Zn#9ZX(H~z0d(>Rx&TDLgP~|0v6oq7(6R!q@e6; z0fdOnwgVZDa!QF5a+Mk`XQ9OdS4Ai9=0U@pxnN5c9iF?W z0y@4tBG>TU*q3FO&VLw7=fD->z-nPmq1hM0QKCY|B&o%2E%x>JfF03k7$jpy!C(K` z_rtw=raY7qM~)s2Kl=+mL%y+FrAn|x-o6cq?Uvx?_a*YtC0byZ_0ms4n1*o;_OPrE znU&iP-qu;b47>}B;;VzTI)y=hnjf3U)G6}uWQsFNb61d`TQBOz<7d;OOpqm&E=7!z z#oe16HlhN0i6$~=|C3Ag4V+HjpU)?y2}WDQu*s2X+Vs%rVhG_Fx_GMV8wR{Qet2rz z^UXt(F@{GbN8Fl}s;t7&3LB9)wabcqYwqij26o-m?IOJD_wqwfjYG0EJT=eSaZREr z3>#SE$@l_B!EfjZerL1^Crc;qE0-E}F7yYogFVS&`k^>xv%DuFG~Y^kHzQ98NW5y| zayD!(K)!78%mp$|GzKA%k?iwRSVJLn?!>KMGLv?lb@|*YC0LqYH4|$k}74*2*#;+QAwp` z^$1AD<_zQU5jG&8!`x+V+ifL-9R3|s0FaJ>422}n(r z$oIW>-Vd*Q|0gjr@b}9vekq(jbCz;Tbq_pzK0WCYjXoE<7RrklJxnbGACi&)980H1 z%`B>CyBdd`yv106%F$UEPX_A)LfIyz>%-=bJ(OSMh_O6whVE==3rGSiv<)ax6@GTClU)&H`J>o(eZD~m!_%av{UX;njSTCpLRH;E~!x_X! zk7v3u7F%P2hJ8X-j?{J$F!ejwGMSeU?e&a~l?-%KUR?i_p8jH~rCEw={Yv?gmg*#_ zQ{By+#NtAd^g>E%gESwbBkHVq`xb)&xJ}S{<7?TJ<1MDEiy!Icis$@V=;T;7WgJeq z?I4}*K)~0=tt?~4J-zDIL#{^w(&}+xFTJI0<2@uo$vbIjRv#lqwFR;^c?qg4aL)%^ z>f(}J$THmMz(UmZQn-4+qoOXsmVTCD1fjcI;U=Xd$;Cp8a&{zU3bfHk8ubA_o_*Q8 z1Gthb>PozHFPg#tw$R~Da0rl?#4UG20EVH8CKxDeyD*b2IJ9U42I)Xmv7929NJn_! zo$}AbGt?urrIS~|vY$s{J=c`CVbvJTWl0f{@AZ{lJ}5%gIvh_@>=Pmuub1&A9pLx} z|K|S=H?H3V(c*RJ@LKrQU;B30y_ye>dIZmQJx>o3?cB6&T`z|nR>z#2XWe$1-aO%) zZ%(bZOrAGhN{b}uX%=&}NCTK!e;jGFO5DStZ;;7()E3iPJE16X_I*ap6NU}B(aXZs znCmFg;@E8yef=;t<&gB$FvdQvr^n3`w?PGD3v*RY|2>H4wJI3ifnO8lmSyC0_$3zp78F-HI_h)O-HL9011y9@<(75 zIgLZ8Q>rL?#v@DU@V7ot;B9=m0Aa*}mZ_$^qemg;5Ge`dqlHO3{uHJ;rucR^iFg3O zE|f)F7%C>rY1ow3)0e;ZQuyKbe>^A*o~(TPm%b4mdiXfO*uy{v(VUD_1`UkK&gSMi z$vuya(n3gM#ElZ%NtG7ra}&1xXs%f5EqVT!DOtH>#B=}6K(etx4v|k5EDR*crAbp@ znfa~5{;lZ{N&6aFV% zmR2i`sMEC6OYmZ=QXbOk6@Lip{-)P-g5}1to>y8ewgb$fAgvea#Z#Rt4KiP~i5 zTOIMHrz9QpyaBIXlRkR!qo|(O&`?)npR{InA{x$Ctf*;GfW!#?aK@(rf^AR<>z&Ae z1*|P?yo?4Y4XMKu499(k>R6fIaB69Rq8~sBUacJxm@)2YyBH@Vy>0H?xf}lK&%Rq_ zbo%V^@U35Zfljp^?-P|+JQ%v}(AO&7d-vUN{N(;25H~%Rr7rMZXBT;704+s{G$dP` zbdaVdQIup6@<58T{Vj1tS}C29yQ`%xrS+gg?E(e6lo|xxzje6N26CM+$=4Uyq_)wy zF`Tt2EU&gzL8pvN>6qvgD9Tau8F-ZDo8n8%hX9?_4uZRLpWg!U6RG{GTb!muyh{U3=%f9Yh;}>$5PHKl@+-*V`le@F;q^tlPgk#3H?g=Nk43pP zqynK;uetr9!S=E7tph?15w8RZ_sM*00C0YtO3rGTvBWlU8^>F88l%Fs@M*DK3!O3K zZ7DM1qgPK$C~#i-)qJm(S0XukT1(?V(j*nimI>@{w`rCnO3NU2icwQ}Ka`)iI4djm z$xexr&@1I}8dR#5z#!&M#z+=OTxy6W5Bj5zlt3^*_UOPn$G9w?D3!<-xh!fBt?Lf! zh9*UA$$sreZ-&=?@^)42Z~Xl8;l$~KR11bbQCTHW%uMUJ2EqHU>+5&u?^wGeH1)-Y ztv^@^;2GW*W-ZRF@#VoS!ac>fJ5KzyPaivkI+>rRVEIy<>-G?LICQL2LlB(a($^*v z5Oif$780c@OI3m{llv1(+Vo{MyF>N@O6E=ax=U%HGbKU&y245GBv$YHA!|bkH1HuR zElq1Pg47|@k06&8n4XbP%CgbUUdZV_-W zv1K(ic1krqn7Gwtjk%yvqcbRGpV4Go@Tkkv6Wk^t&n(;-kD!ywr_mmkPF5))>j?6? z;^4IiuW|KdiIRHqTBS?Ewb1Zjs6EgF6$Vdv`-2_SG`(^T{GLV(MJk$ANu!puF=({# z*@2nE0-oEINVB8#e#0ORoj9a0ILh}*Z0c#6;ly*fk3_%Y)%`l<=3H{{Y(P1gAlSZq4Hvm(Hn!$8cl#Q&v zD}m?7o8?fc{CR#`N}jF(02|}7%;qq%Y-&J_2eOk0fnLB6KLK><^Vyy`a3Wf$poKDxoNw7nf~;t zMwX0#w<;?Lbvm)Js>Ag4SZGdvw_C1@#nseuT3M9?aTdi@LsXI!Ys~ryZ3zbT-t(Cv z-cI7Sw*U{Klv5+lX;sOw>rVL^J8->yE0Y5bcIbc>e)u+f^yyefB%QME$2F-tKlq2& z!`rWaFet(D%5wOX-}q)Ydg2IMVi0hK3|qr336w)x78YXuczH54KV3^9`kmI8%HKwn zuUh;V2ZBZ_LwTv$P8Ne8o{9VLRnHy9vpMK*ZQ3k4HsE;uPKgA|W-_XD2*H3`?KtlA zT}7P6MBT2%yrUSY62UGm|A)^xE~gK?!RoEm~m1YtXzW??h&q=VmB} zp$mTC`@#m-lNubpQet`eLf}8W%_k2y0U!$2f4r( zFm#s%Sr$e31I}ImkbIlh9_QM|ylObqJ7%o1gc^ax=H(52#$T6+_bsgqc_(4V0<&Ad zt!*=sE;SM}l9~z)4S~lS`C~K~WIL~N=PlJ#+Ux-DSYUfw0QJbPOUcd~9$f;Ro4=>LBc+;VH@&rE|ST9&iN)nMALXQRe{$ysXVfupLNebdhE+2DFLW zFivvH0!^cI+kSB&&X;Nh5c8~iH0r+t2A`=8*kND4Ia`z=Z9`S!yVXz2dY(1EB&$st z%_fRl~$zdVTRDUVS`pw>dC=eiTx3JauV;QLQm1{vVc zU<3n`>?scD&Puz?ak|u{@PqHY7T$XOy(-#^Kli1ucKFa1$?EBk{GmZ&RqQD;TWbFl z@k+C;N#G8vgcA$BNtUhqRy~!O<=3T*8gA_&o~xmD`oU#0dEVVZHqp~mk$(b zU`-`NM7(~q%ETA*3lD*vD&DoU?D;45sEjZ{_5|U=CV`WkKz7$k$+JqbiB8C)5&Uwz zvk27x#^EtwKu?S$cZQmzBOkbcMZW$?T|pY)cCM|oz_wdlu#FeH!DxP<34!wX7bfak zLwS5z7fms)Xb)RwILDJzmuuSmc$o9&r@Tw_tWTF<7L!Juj$>qK<7ve2R3;-D5KRf& zE@n3UQkugwJc%3Vz%YqU!`y~)JSm3ocGAlhunTI7wJ&j#ryb0g{%8T%rF24B2S2sJ zH<@wD>$6K&!yo_QUxs_@!!_;HnPcJSe*T59iYJLJYCOf5;&C2;-u-ySoT* znh(PAlRU&l9)XqmkGr%>n!luj#(dW-^>jXtTa4XOCd!nnXt%`NT{@pnP!klLR|j1L zjJYi^;ND;Pdtq<@+d=g32;ocypOdL7g-)I)UgCq1a5~>`bY`i@p!w;^oO2)kkTO|s zo7%gtV8h};pZe~GVcb3kvLH5GQcZlg+zgGx>Epo4K=fj?hS(44eg{%$V27?|KUl&9 zK|9_M#d^Axmg|xsJ1i||0~in*3TfJBC@*`8OCSa&`|>u>0G3>uZjv#Hn8PJYAVhV! zVH>6ypJkMyY{pmy%A*1B&)?D_ER&a9Y8tN`Q|O@>+{)uLgga__=ikQn>+Uh52-DjR zllkxd<@du!A6y*dxog*I_$UAFuY{8)*9b=1mvI$1apGWDrl)B4?&S*{(QDSJ=l*YW&0il-0-O5uEz^Btfr9@e$jX^`x+uCrO|N3QMI`BcE{W2ItrHoi>t%b?) zbX~6z*owSbyT=2j87f9e&W27~qhZ&=-~7eP)q45p6KBI$zV;~DZ}=+`nr3@AwyuEZ z-MO~N6d`0S>Iu4Hy9GgM1C5VQS#E8Dq23xkZHU_l3iU$Q4GNE9EB2^CJ^8R_%ZJAY z6(=2}Hk=VZK^vDfBIBPC3QG?u&dj z1JbAbl7@)rnaN^YX{z(#&)!w##iR;@1GY5q&48{IBgTJ676ZzP?7ZHz{Ww( zmv>sOGsCmlYLg-qvMFfB(K-}hGJ)cTt}Iz6xUvXvP2LFOl{fEx=mrte_@#6s4Hilm zCwKPVj>aU58uflEAhHb800fgr>L7N4q_X5sp$3 z&lfn7pX6+fL0*%r_S<~KOD95GIC^s3)UjJU6{j+cWi9^MQjZn>qJz!tgC|(2O|Iko z)t|i*-v8VKW`w7I%(DdD0`@auR9bGxObz6t5J%0J;)QU|u1 z6>@oEzhl#-51XXd7U?W%E$;Oxz}-fDf!Alpa!&hAt3GHf#v5AvdAs?h*Z#EVWG((6 z#66Gj>;fH49i2gKj9Xa}Pn;QOPmi)KgqU9J&oKt|{JXh9jzxpYNDebf1Km=wSJQ?w zvNz_2WHrYj7vEgT`jmW9f(obU6t;3Adv4u5dD+57$E}K@>(`A4Y@p-dYwc2!1ry9t zdY_g*HShCcNbFK0G`I1YmH)J?Wl{xF^^QN5qz4nVum2^RbgR2!gPNT{4GU&HRRlM) z{cs9EKP1P+rrO+Mb4ONeG*$|;s#CPX1MUP^#s;NkJfkY-G9 z$8c1xE$w1f1T)IxqLE?hwsDN>GT5E~{)3yAa+=>Zco^Ms_Q<0A!5u$r&*J>tN;TQJ zKvk4{jT>j0Y@+ea8{pm<(RbvPy3dc+igDdw<&7;m3q^^7`NVLbWABOt!k{u){)#U1 zFuZt@ZE;d@Iu=QwfRp4~K1rsEX!%rf7xegafYpGti!Ki!a%bVx%DhYpEa4PYk)bba zQ@iZKM+p{mwC%vuFm|8Df`Y-xSXn+9z$8J-lEZLr)xMB}?Bce-hEF8iF+{Y=W&&x; zpRIsDM4;!OZPTZA%o+lDU5AR6u8t28ZQAyPRe^e1(vr4MMA zr~$J0oqMxj$%`;zySi?5j^6lz#(~)adrA>f%p(C)gOT~QD2I}$oQj}gE`P1#j#^<|ShoLS3c(#eEXoSdeP!S z9Ds7c@L&`TIIYU6f!?NFq34ODZDy!p(*Df&Sl!jtK?6W1#Pt9eiv;PVv15*H04+v@ zvYl)kxN2CP5K`E* zj8S8PH<)Q8QEs=C#9D$Hfzn<3MLcJAR&J;;g495#MEO3ncfa|fINnGWa>00 z*fygX@pA@k-nri^Q2w9ZWw3D6#4oldkC>ARK}>|**E zo`{c8rk-{1f~?_f*g{$>u>tX;%wh~mAXJwZM^w5y$9##KAnKAdk(lT+4ke!>{9*3W z^x14H2((1bcm{K?g)K;Vb+XVNY?VFLoOK=+Uo?-J$5s|s_mea#qywL*P;_&UIj_!S zY9L_~$%#}_EFemNpIZsKIC2zH7DH~SBBeMWr&A)olxy4~Y@oC=(#RF>A8QEE)mOAq z4Fb@}FUhPa-M?@;2!R~_iTtdwr}q6*Dd$X!Vd+!y9K=t7|D-aUGnt{4*lc5-12eYtktGFe~%zgy#(ea#`&nQ4Z0bQuhF~ zuBN`RL#J42tey9?kZlWo(^8!e{!jk+&%>vmTpA>TFE@Pa-}!o2T0wiV^?eYZbu=i= z|Igl=M%z_f=c09vj{3euLLh_?qBoenZ*7AO#x{=axQUavxk+x`u#=4Oe%$-xjra5B z{kU(8yqk<9JnMl#v)OLMI~@`#Wdd3_uRLkqu~HPdUWM;%kreJbhaq z|K_02sBk%KDx#@Q=h0OUDl%W?YzBttQ&D<#)HsSBfTmp-!$6m5x=-_FKhnI>l;#IQn zCMdefTWE1?{o0M{spZcm`>4fBPE@CzwKPf7gegk1MB53A8f7k*yOp8z7JSU2XQw>C z14CudG3WC{hrw{dDYt`~5DAH$By= zPS%s0V3exLGAW1>Wxe$xP_m#<5hOu!I+dX>C0@VMtd3ODxj`REC-P~5gxf2LD9}2s z-)Kl}xjM3v*l1iqTjV>HXFy$qK9N_joGcAyJjP80YjSIFJQNm3AFq{E(JgA@!GrtN z?|$=`+Q08WDc7mfCac@Ne3KeK5r-RBxm!R#CU9(E>e6tz9FXkXv7PGXU@2xXp>AHf zp<+ipHc|C9DW{z=nMwsZ+Qq3r;_xZ3xEUNGHz^~89!KI3>y-ixf`|;^O_1oewTX<) zWD(0+k4&3k-AEpoHrfi=__z?ILeQgaxx^)p$VD&k$(p$OvV5L79_;gIE?jQ|n#*2s zF4)1hg)IWUAo&C6qn=eT!r0amNicRmw9(zhdstY+ z*tlU6;W^}S%@6XcV5Gmc2mYrg_6(pvA&)1?io)o&U#KTQ%zjXaB`>6a239B}K3OkF zQ+Jk_C>h%0phuQ6MLAUz>D$3G48AB4ka(g4eY|u8`-Pov*jbu4R*5igFe=1L8d`pa zGpJC1{7Y(+1A5|_EgEE3TvV!{x|$n zStZ1&ye18DBw0D_d=5?MH3o(L^=#=T)Bj4O*MgU<+&nEu9ym)da9RpAXrUhlU# z3z%|3`O(e=R4h1s&9Qm)QmO_Qx`BN5+B37~eIM~IvjjuNvnbB0Up^vYF zwn*`RPQ&Rf%oLd$xI;%;h3%@~(E#kDh%`QsX~v$__(P}a(hz@6vGszC+ppkTiF+69 z5_c%GX38zWa>SF+PF3MovLZaVp~(u$v#fQ*=JcvByTn-A!$WHMBhRV>`wy0i8b4v2 zy5O?2XfZ_U<4RdX6M)5hXwVGyfJtkOR6&1C_L_PcT7y%YOtO@^D6jvu4OYwM|44Om zhzMd6L7NW`=`C3rlNABtIz~HZ_4l1?Lz>0z+688*!ZcpVmw>B6QVHvZqtjSWjzcvc zFJleA3>R5_YLerc+$8`EVF6A1RNBH|V-9*R)=@&i^>qgqMT4P`Z-Wdn$(gh>2$36-DvcQPGIh&KjbW+$vSt>z`v8WlkL(Jg+K6S<5p8nGM=#i za|dJqP#1 zwULV1!2zLe8RV#mBk}xx-OYz5;_~xA($yL{X-u~MB%_su6c^Gc57~AhRoE`+G8p9w z6MX1w>8%~ujpJmC2B~h4V*D%TfeUI`ni0b(Rs?(@wJM!1Bb}OVf2-^Npif$-K#8Uz zAS0)hO4$Z!IXom9@JY!r3QBwo-Dv$acF3{CXw~uP#BKM_*3Jd0WIUL|D-xZk)ZJ#> zn9i}dZo}Qf)3ZR&0eesZpvDfQ4`VBnBk7w0dQ62%zdH7~T{!-++K0);25 zNZ>m@jNFT}gN#-(9aatk8dom!u^BgcFD=|^wgH%kG#6ilfZk@2`js3xG0r0y*DaW3 z`-fIS9^h{#Z^*3|(@6^yWj3H)(5_rXVkaSWhpb~+_wFcxYEZzdQ;jRi`PeLLblQ0x zck?BoC8X@%Jn#1Alzc);?=G*B(YDu`t#a3|NZDG@6XrHP9kyGIq1uxuI}Xpc>lX&v z^y$Y|FPp#N)kph^5&!nO;dnBG-?qr*s!FO zG|0%YUTGn-6!7R5>N?u_p)6T7mTmm$CnTmkV`6j}IXx?t2Kg&xGNl5VA@c7cCdP^4 zoNYj$_S+re+(*yTkD&`TGt;-=rk(p+_UOYh7wsP6`R&?*SXMs^?fmB1EN*i^G zW&`E{DK)_D*PbL~J#EQ`-XrW;psjw3I^p(yZV2NRyWXJNj%9z`5u|DAy_YrCjqBasvCn9}pm2hvjw>n(Dd(ViB+0Nz*`!?PO8t$X_H?_E9 zv}*3bgUM}v-TF$)IJ)RKIiv9~YQDNoJUVKlVr6-{Uj%gw9XC&ag0J?Opx?b(rGiMsj*`R)RDvTz^~3S z^9E9FtT7~-m5(nbAWegBFW9nT9CVyTMYmRntu#DLpKVQwvU8M6Nu?ML_TXF7kKkm& zfGPo=wn<5*CZo+3ceB%`Nj7cF#>JfhUeG$M2d;40_tG+4Ze=0jAqy(Y?8WEcNz=5pgyq3$F{oWuZkz1B z)xJ04<&$&Zy{=t!EwSqgIJ-24|55#Gn;@cSu0;ekHO>VUEiTxNU6ByM(2MF>;3%@d zvFPh)MmnW;r{o+(E?KE6M~nRnJ+M_Wws^igpQ|0g-fsfFjwass~EI-n2nV1mxpJyNy@m16V#Y7sqNV2iD}43 zieY=#h-?dL{3bO=8?uh@RI!gvi%)UV^6ha_h#oX)E+&tyO)Ac$g}=w0S&FH+W&KRu@h0fZz3Wt4$_0-EN59S2T3nZY+k zl9qxTSXL0I2nZ-_>xHsFA@B(^c`=ZXmVyjs;mgZx1;HcYBNj#Oj)c4ySS-eEyT!sn zs*ix+unhbK2J_XTBusySCvuRi&o{}hg+$pKnrGgqw}QS3Jn|9|bSnIJppV``F<&7@ z;{gz1gN95ab7`aart!lvwshkw=g+2aI{kRAyuo0G3;C5PE^hS1vh51zEC()?e~#^> zr)?QL$^m*Q72su#DLyh@y^S!%!@!n!NjxZj)(9hmkAc+Cug90wk#r)z^RhK0vMY)6 zx`PySe$Tz-!B5_$n(L~rb9JT3#t?H@eFRG!$$KvNNoTol?-q~bz>bpC9^;tgEZw=gHFfcLd z?;A@=F@I>>nnjL?W5fVZoX%6^jFaW?lYLy0!m_1yC=M_Z>q*OL4M<`B5d7z<4TNJY^~~->P-pF3_>FM*n{LqGDVTBQXKId z<*}(s2_ZSMO#LjA0v-}zi3gz6@RW(+c!^IA7BEWL1?i~!_-*v^@r@z1{K9RW{ut2Q9R!a=Iepw9L8V{ri&>ZG}-Oe<=~4afHW zmieHqQ+pA(+?&#?!gk6(aZ!^(98Y%^@q$F*0IOX{r2vCfw^GVclOXEN1sS(pzLMmZ!Rlm~d#IAd8&qt` zf7wGr08R|}NP0_ha(HwSi-Z>j$f2y=VLFt>b1Aj3(vfqRQ&97&rla%_F)>hjFf%J7f`&^ z_vqIw%6$XvRlR26Kso0cDf|wI1_H7An9{ug)(w(kKs!r|p1Lw|!_< zknc0@pqZ^uNuMp_)9s#2Cs8CeC`nnZ^pPxk3q}{-YQIbSXBWcmK?*E@x}NrP-5(Vh zHMN}wb1T0M;nu0hL_Jm|O$fxcJn4+#wV>jb7DsFiz0_I|I;W{H&z5S5dpZ<)cU*2R z+jg|LU<(DI9p>C4`X46i=9}Zq0)bW?n}=g-j&0!x=wT|zvdx58Y2#fV!HQbQsG7-d z$akb-xGsu%b7{5=QGP7~#aKaI$a#XxI=huLP*CJU`Nhd3=_6HyEG)2#U>ouEiVQ3; zg2*SZR2V@z3uvp66H0C_hRaAmEZK#1b_d_hfr;g^eHE=0R<-Ro@z8UY(`>vo}58_d2W-U#~~&Z`DNP*eF6KX zKoem-a#4O?(F77!SMobFJEO@iP1vE?EcGHNu}`Lbv&8#tr;~|*lt8e_^qN455D!zl zbk@<1GcTI`Q{s#KJ`X>S9}e;0 zU|#=9wO<26!-s1|pbm@p4^v|nvhZ2vhULni!>M&Hq*25$IkFq4A;%QU2?Qx36j{dL zF~y>B;3J*`ekc2$WV>87(14^QlAOpkt6c5{ozzefrMMd-g|m=U$yWKwut+7DtCPgX z(w}cbd-K*ZkxiJ-=iITdxJZOLAmC+v1)8Q6Dq3Xp=e$sAFD@hp6HN;}sx!X)!t3gl z7hg~6c*fbMswJnMNcPU?8W7-p40h%E zZ`W`8z6qX9XF*%w?@Do*q5Z|HQ>|Up&;(;RU+2!%43vI)440>^gcy&S@Gp6ZeOoej zhZ6y|D!{T&=_l2a{i?##VN;fhqe*n|gx)7cAL7>^i$*Y+McLvl3F2|KATVfueX)@; zj6}KTGJqf?!W=k#(Wi?AxZsO_e2KJW(kP=nu8NX@xgdbgqOkO2o^G2>9+Tw554?>& zbsRDODdf=31#+@_XHOu52E5Lxu^W~V6W$n`YN!i^tKnD11#)s^Ne%%X-D0~kT}LWj zvRw`?Q%)%xLrzXvO7c=NOx_%wa`;G%qS4#Pjs12L7T}X~@^y%n8RDRqefe~Lx=q{Z zd#S8*$_SVxKF#Xo^QAI!%$MV5&B{Ld@@=CpL;Uh5zgB~X21}KjGIf%=?#4^hxbZNw z`~M zz|)~io?!?;2&*`0vg=zJJLud&y~|*9VLTQaH z(>+gg@p!@+K!n07nU_*&*Q-fcodFKnE_F5`QXRvBM5?mfR(wwVx5#6+QD1PeVL>JJ z>Kdr^0)#C9u{IxCg0O-EigqrTaz%nqZnJ9W-V)MKzR^xxU#KZlL~o}{n+FAvrYPfn z^v5?k*(|dN8W6H^s?icxFw1yb@i`56jvSE>HA3Plr=TxjGmo5xUhq#zC$XN?Y$)-u zOkH~GmvPiiRrysZiUty3Tfx3ri!O2}nFA_nE-Pbr*isIDi@`B)i{=~$HVz%pWinZB#dQMXXO08z@I(u88LGmNoA;@Y`m7wLP5 zHdMvhlWKf3A^zx3;ywX&4Q>BOwO@Dwiof*LmPuT!VT!q08d_7S+&c4rO=YiT0t0~w z7BFIZI%0{3-^V%WM`<9_=LHKNoyKXX9*kgH%sVXF(mF)SHKV?9u8g)+bgEog5t#KT z6k=kOfGpcddO;6Eq9oXDHXPIM^+*=bqjB)JxB;Qg6Jv zM(y0bo2%)x8B^4>=~L9y>66uykG@cnQ%BD~evZ22s|x^uQ0#yj9WHs zQ-g;Osd3}X7b9%Co{!kpX#O5$09!WCq4k_;Kal&ACJ~5RznkRS(QHyXP6aFW>op(f zDDIIK2D?bM8)=LqBVVeG8kK1<@~GRV3FLRO93@$>i$nu!82jNqcIEJh@7QET4X(3Eo6s(A4g z=cw6pXC(9ISX`{*`kaUYN_}lA{lDRKZ8$;Ueo~2v*3o zL??0CvO0q=#}YZ^n1eQlk8OeS`?NGZ&!#-Hm6GOT5q80CPDx3VvpjuyJ|k#cZ_Y~S zBF$F`Wgc&QKGMz=vbliX9QWxX@2>>YW1{>by{(T7&39ou%(qW`cOJ9ey^F=GbbA2@J8?ccv&4GpCSA&ZwTRF_?I9z9f$ z{5Rdw%ei%a$*Y);8D#Kpc@Ct&FMQv~!GiKF=UkMko+=wo*h50fVckD=|{Z!Y?F zBI*VVTE845QaR@EfHa9up2cNpvK*O59+pl~#U?wxY=1YLpDu^>gjKeUWM7$sjD;sy z(oPGSgbj=BJkX^342?$8Dg$$eNVGSk@yd%X04v!Aw#zBaVuIXW6O1GlUpDMtMHv(p z^L8%i1abER$b4)C&tvQ^T_Bw^Mz26RXX~D%o&|aq=vg3c0W2i^>ZiX~Ptf8577q|! zxNxER+~@v8op;`OoN2|1XViDU`(1@ahO%qoqzUTQ&tI=5O`cFj(u?m|pl5-e1$q|f zSzy#!fES;oX_UC=GHTWD0B{&rnjcC9&^XNK;(}hmkc3HK%fLu{%kq`QH;bc;U!(C= z>(i)wLk}D|E5e4p_uI2T&jLLQ^ej-N1vY=MO+9eWl=aIK&U;El$stYf?P_19TUj5TQ{eNo5jvZOh zF_=1Za8Ui~Cy%IM`ohHZH(jFeg^98&s}GmD1H0=e5k#=KhdFrQkb3L&ch#Z9=QFo# z+O8hB`!RLxjTfuwGpD*7B`l!Mz#|Sha`;q*#nrGE8VL(XW!Wj88VTJ;jZ73$svwXq z6=aUGlALO!;g$ScFCd1L)|S@u*%V=Rkv8T9XN(-iwnftcIiIx6kZ(1 zWaprQ4@w>poqBhr9mXl+*{%hWGI@=}2ZfN48F`w?XS0Scxc(4^A)_MO`J!wnx%aKA zoGYhC*Rw#y7QhrU>mB^CQFf42QS%*!K_J#H1Vl$g#LgXi)Q|r6f2vilt>LHjixw?X zU-`;c)LCbp$@*>CvPJFPyC+N62@@u$%P+rNJ@?#mycqGwgHNlI>FkA5mYtZ)FE(i+ zf!q@e9vD>5KJ}V<^taEdjq5ij&x{xxJgk2Az*FkkCtp>UTz#&(`lA=BDN`qD9V)<* z+igjrglfWg!9(JcES#e{v7&yx12#fgOXVn~17;4N4yZFqMU*d+77C#ha!R7e5#CY% zBUJ7jDZ{iQSUPY}A9g3&?qlZXKRKmotujCoc6D0+J)QBFrB9km z{?2ZRPv~jQ#pK9AU6K4sl3s-z@W|m)`1pY88$;NU2@2qk?#0I-pr?G+r4NC$BOoLP zjFqS9Tgd5ztWN4A8KX*ltKjAF;QC;7BD^YFIG&_kJY83^oQYLDe-W!W72)1p&jO>x z0(~@K8Y8rK@NatCKdBOG?2uP&lNquTja)Fd+JNl*ql*x`41ROZa$Z;f@&yYPsK5T} zzfxFWFxLquoIr;;&QzN>Z#GfUU+}_ChcAEmOX`$UmZ;lr|DM{tbFcctL(kIU!s7Iz zQlcz*0GCJy7?fIS3^z!-6z;$Kaavedp$;ED!iy+UTZ}JeVBzKA`<_(qy}Ma`<-dGN zO{TLXQgV!8BpRqAs3htHSrQL}C!esM;~2Ps*K|i6mnSK;;t&d)hbmIZ2|T3i$98&- zzqC45)b+YA$2Wzt#KM9=l3ARRPLLu#wi&`i zJ}s$hW$sKpFg3vv9J!Tz6Io=u!^6dff&si4fdK+cu0IcjJ9HTME4x7NE-q+FyWj|{ zbUJDo`>u^A{iKRLV%Vv?{9ciZ&@Pi0IHXH7v3!1<=bQn{s^pMT!fLdSEEdjdtYSHP zaXkx+oCQ#e`l+7x^%aeH3=LZ7R10qMNE0|i*Vu1O^04WQg2tdRc3n(;@Zcf!pFew8 zJ@wd&3KQw2OP8u|eB?ca zEhthxoHrdqazwdfC&ysrAXx$zvM?tCAzx4&%}SFP*u7MFLYPD51WKAwXC}a3MpG z$%i|4>(DS)*-jQz0k5rhNe6GMD-zkQk}+=tct`Sa8 z>dNacQ&Xo*_Q`{Aj(=KXnIJzR;E82A)iY$-hWbgdvgGuEb*Uvc5F!dH$vYC!uyA)= z{DE}g!GrdPw0${MQcHBIR&0{S7jl-sB8S8?heuU>a>ks%BVkJGq}#kS4J0Isk_f;d zNdvPGRaz2gr1pU&fw1)AFDr4OK&Bur7|SOWL$|${9(2as&)HnpUc23 zBF^EFQx7Dad>h2VvR}z{4Sc0i0!^Ve?OYh6`fCj`vhvz5UX>7PQ(yh56c|D*3{@D5 zSNnv9o-?-Lzv0M^i9TL5DU4%i{CF1*Rb^@P;%2BWlw&)mj8LeBez`!91It2 z0>jd!r>MXG`@d7qKmWXX_SxsuJMX;1lkS0m0fjG1ELbpKU3=}dbapCbAU6{K!keM*}zrSaI&r?Jsc zIeX)1MdzKR{LId6?#)=%gk!(yaV~Pi{MY5g-t6ObNod-O@k2^yFGFdNqzPxgW$7eg zk*XSsh#Cm|B`?A6bUR@CM+rBq;yUra8o6nP>8Zlc0c6u&kaF_BnP|-y!1{4#F8;-kg0tQ zM~X;Z$C+GIEY}up-)mC2U|p8kA+FfAJlxx1EOkI>JI>tOy4v@UZfJ0Cu2`H&tL~R= zl@bN0&cp!3ego%$%{_nf!Jb_(m>eQ*~&;INy>ckVv7Zz-^lO|14S6p!g zpRMrHOE0Pa^}qg^!#Cgj34SF4>GowW5|xz~b_#}SxiN0YmQd7?Sh4NdwMVU5xtfY} zn0IBIfBpsPvBw@yE-V=C*xB&ro2%(y%d^x&4?U#z?>nH@zV)s;X^H#Vh@o%vH>Fb} zyi$C$&)|Q)D`5)`u@R2uY;wlz>oUweyv)tj3sLEiaZ`0x+en@`aEX}$iyBrZhGl7c z5$-eER*wm`72}_CmI?HV;-E-|Lg^l#kQ{oKa;cFEc%|&brJrORsi04B^beKc7(HW2 zfa1j+EXXEkc#@bbZ0%Di7PT@cfyvQW2r)CPGCE9a6D3__W4(%CaF@bbBbMt)z%>#< zilrNrU1;Y54NC}_h6ji+J`GgL(6T600|Q&j4l9nEuBq^Ul5s)Sz@0usLUJ1S zwGD#$CS%fkE+Zd?ZTi$<5lG6~Df`-tQ#@?C-hF5RJYANzPwUbQ zb2ky=xG(iX&Y(G`BthfS4G$mY_K8{5c7G)&2An1jGc@<=x|`iHYVN{i99Bs9pB)6mT$)7TXNtJrOsmLP(~Ht zHSA))ghQ&=8bLL-D|@g}Ky%jx2GE$*2PV{_;gcV52FWa3`3tUeM>*_*W2ZxfvM-^~ zY|`v|peNZ*!yabFK*!YyA^c%SLm4g~zsVEw&xsKr=CCMeXtze6zZENJ1bzHP_WB*E z?%JiElDI(*zk$o)QfB9bsJ10Zc)JN}l}5ISz9)nFBg|?xg@R2P+-Ak`6ExMS6_OAUsu2( zjpv^Gp={xM_wMBb5OLTcE=;y@;ebS32M->k&rj~;2|W6&O`G)BB_>WBucplyPvss? z=7E(LlI;FB@CIgI{$H8G%=-}64B)}58(8SL>86|bYZ!m{!=tn_;Z3z?&mMj~1T#{^FOlMN_}^@zxV+ zH^5)6gHPSoF#D9GQ*C~h0HVKrW%G&Xn6ht;w^U6uS&r>&ED_)+PjOs|a?Ftx;h!C4 za0qxAN9$O^MIsL<{K0yaiCSW;?7mtuR{7j;46Y1{4Bk2mslXE z2_7z?B6-wp4f0}{zv>;4DEVTr=oaCD#;a^_5F>A6oL*c=mxKMuA3)*pi`Ta1EH3C% zu2afL{u0mI+^&fZwJD^Mq*Zh*PMO|(eXaWSJ-^38F?Gu=H>)eJyfSWplGva8XVxNxC*>#eucj%~Zt)=gW~q{;K^qPzVj`I=G*w(pN@*Q6J}PPI|nX*1?yF*T#oMEW|T8m?mAMaR~dagbi|hgd-W2 z%80yIunP`ib?Oon4C=A0cQ_yN?IK|{^f`1nG@U3Ys@L4{80?YXEWe86^P>DQr=!b8Ik9}Xy2WIa#03?Y-mfsRj=nrcW$hr*6IVR^Gi}^5p!UamMNDg%@5> zKls59_%n`JSil0$8*i*qD^{#fYu2pgR}LmloXB5d*tTsevz;?VYI zPC7|F{qzbxxDxb7jtr>}Hf~iXEH3-Zh=TRy2b*@ee!MIOVw_{Ai! z3cHYuN_-Pz?E+o=P9zAj`L=_<_&(#;EtVpJ0aXf*ly0)8cm(QnK|~raZ0XxG1RW`B z(cU4KwEYczst#xx-ycj)_cyJ#eqb%h%J2zSXe5M(Z-ShrY#EA@+Xs|&(T320j#k42 z5M29mRyjlAa*R|UGKcn1G=eLKww$J-a%MBgl@?^>STqyb20{4pMrr%Y1EpE!>e z1h%P-8#k)=-+!MM49fV!?@m4SR9<+&E{tv4wy8VsypvyvKpOPj_}&)Ip68=wk~$Y3 zvx_fXDuXin`h4VYfo8PWPu8hZ6jio&!q|#cl4xW+x?S|`WAnwm9gfk$XHqnNo@T>U z$*77?T92Ii!?i752o`hTE$XF}(BN$qJQ@_)1>~W58@EGMbE_Pm$XS4p`BddIQUNw@ z%Q#1gkDHGDKEwx$3HUSjan`-qsw@CIr~lx*_Ma`eGtI6ov3K9IK+gg_3*=h>9jn~A z`uxx)cIUPB?TzZU_diAF2rN+F_{KNXtXZ>~0t%a)eDcZa+u#0{`p8FaP*_~Rh2Kwn z;^XRbpZgpyEFkXCp+P<{5udP}HAkPxfcQ>dW5)EW)6ZJWVsU`uJMXL!A>bfKyas_+ zJ%0V`2h`4;JJrWN_EG*C1~PBkOb1mS&UocXlyqzoG*`cl1zVv$rT#E_N~Pzdm5spc zyk#_g8JMwmyMN8tJ|)M;7KV-ArG8ttuWiT9-{aL9`%iDtmvB_!SCWj;n4Vh?LSL&s zMvqBSzKgV+OX88sCr8$3rJ;S6WK1f5{b~g6VO;vdPus5?A>HMi`R6kf#?$_4>xz3j zT+r$}=^U=Nz*~Gnx}LFi1FN-KO3>NXTeHT1R?#aA^XavWvFgD7gKF*CHMAIV zRq!dwef##QXP$Y6bXZCUQqEJCTyn8`{PE=qhgi;?J6GL!okb#eWx#Fit=L|!nleVdNf#ix6aiQmbh zK@Y9%@V|6flOy1DisTh@DpWwr0qVOZQjGNAri=o(^};Q>>k!y!@SzXo ze;Fc%6AK1UJn^Ku`|i8>HGvaOIDua^IP0vlXwtq`{nJ1Fle+fWYiS3=pU?!JzS>k~ zKd(J#t(0O&5l3ZLJN(m{0{E!z$@M%uy zhF3fA1&nL1xrPs@#491tbN9}DYHZh+tM6X(%h5mc@>{q*X>{Z*g?ojV<*vbb& z?xMws9rU-4(heRx#JF%4M%guizP5pdh3PY<&{sF6sCn~esS{6{uZ}-qo|-*(x*8Z; z97I*d!-;3Nw!Op|**K()1lm)MjUZ@{HrBR!zFFPj&vNV9Ao`If_ig1PirF`yAwPsa z!g)%5`yhvX*3aBPnD|R2fd0g-6(N5*dQ7~y9<+*=+b@qv&LCby7a@>zV!8f8s&7rg z%H>_~$6P@dEUb!qdW|mlv|~Y!JD;nYszZirEUlq9!GCkclYK;_^=wFTNbHXvLkg+` zl6S^3xp6}oa!`ztOEA|gB3J&%h0?Y|O|xs8-nrmtnX7FsooxyW99K3|VQd=z9yB&& zHyw_N&MURRP*hMiuOG@8+?FFT++dfuZLkBDQ&~`)#&D_Tw-YinQnPT9!d*I0PGuVH zY3!e}*Nk>GE5XkV|0uRqR&|RJ#p0^4Xxf(Y!b0m9OuLY3pS2X&z{AUZMC%w@;jn+- z0s1<`W9pP8OVwvT`&s__K`Z=z``h2CyY9M+S$y$}e@dUAoT2{ZU;ag1c;SWW;)^d< z-}%mWXa~b`b;AuG;WG>HN(5i9MFj(+#;`-C&Vd6QXUv?cHh-|KzF^=lE}VMmQuWoZ z{+YV(zWe9^$EVdF|M*AV-7qjPpf0%J0={3k@OXZh0lQ++VCL-Nbr19p_}jnlAj?_3 zYOQ+vjd#_$cQ>h>J9ZNmq=y>h^ecG91irX!%T9*@7937lc7nR>nh&cp&sn0z)9!|x zae(gPBVZiv?GN}^WAvHWfN~b`K)%5cS1BhJ52}ZJ zKk_oRF2!Rw3WCttF4+c`>un8NFrQVS)14!rnm=2%e{ZYgrudGMvp5&Ub+m@(?AtFBV# zpMO5R{_rXtQuzz@-h1!ys~xxBemgIqV8;U%Oz?We`}D<#S@gQcCR(uAxPFsbzxI9F znXpA|q4OAa@5E~pdMASME%@r#v19p6im6kl()kV3X*a}lKF49ol*zP{Vj>-iIgV(| zL7T(%b1U#_#;#pE)z+=s_^TDzQGxR#uoL6;SJseT>(p@zW~=iqJYAiC@tM4{!LA$j zy|1?k8=NNGiC;Y?u_SeTbs_fU3h&ve_3d*DsdJlSyPPs`n6@>LQ~v}S9vDdNctv%+ zk}?3+9K5dKhcVulvbkAUjx=s!>w5kk^AX3lcpPPy3zj-+3%CJ>1|q?T{ocNrVtlP%W=bhkGNt5gsKl z>d{`iQ;)ZADky7Vo@h%;-xHQ(8EC(-{Ws>{X&LQJwXv}ztC+2w3kHNP__Pu^4uMHZ z8V*y)vB^zr&OlpgSZ%(k z`>Ob)WaOn8e@Iv`3#=}yv`pWp($w)(;7nkxXELQ)kFai#KZZAz$I5PQnVkO1fn)MC z{TsvEC^IyQ4eH1uswlTcu~tW~i>H}FYBWzXwyjRjwsE2}1zgPkJ?8MEu~>xT(7Y}5L;X@>?Tj1tWH1u z3|br*mg7q@}?nD2%Ts`p1$JEx%+xgrC6OUi~p$)+oIcCqEtrjg> z#AUE#$;ou6=6p3}$`oFt0F7yD%&);={~F#nI1>vyn>KCY1&}}f@hLi>@*T#yVcjNL zm248*%-6XSB3&5Ak|SA$~TtJ59tygKTj+y$%*9&<3ui~kAhA)zL~1a z1{Grw9mhi)jLp%0NM&gxmjAMg2Z|MKCvxfsk2ViK1F**85O4IrugllwXzqDOw+RHl z=7E>t84z#;>l9D2V$(c;n_tPXa`?B*!B^WSsw50a5?+*3nq~+-E`7EY4;4ks85E2~ z_lKIDoJSN}A%SlyJ3P?WN9zmqg2fFgTRox_MxWr|nnSD-6vjbi^DDMLeMb?=-`A81 z5;ENeL>s~AiFD{KG~(1S73j-MLp((ynU6tMCI#`Lm{jJrr)irOVz9V?xP)f3-AFuS ziz+oZb;HG_XxF9^P+>WRF(p~8X!uq8^+t!{*Fg(J_N~-F#~D$3;i>2aquH9VW|UC{ zk=xl}$2>%)MWsRA%U~-Fk z;e{8~yYIeB`n<-wGB(g|1#@BYkDU)QX3S8F7cb_8gcD9!$e-=RmpSlh&PK}si!v|1 z_#*98*i7eF4D%TgQ)z(&3pR7-%vG0Nb{U@qv3~t~3X40>KKm?x-D1z~ed=fb@f)@J z^>@|BKYb1DXqXd`?fW9iqdjF}Y*hTFN=Z|p9g?XEj?LboOvG{#&4MwWj6jsb8fP#P zMP-y_j+mTDtHg(G=Z;-N_+TP1;#X6`oOX=pF_kq*g-aFM1)OcG$0QkE_{BwB`XzrreR5^% zy!QW81`>%)-t;}R_WO008K(+Z$}Hn@5}0`9;pWW`L7!o9Cy+sGetmDK$&(-xW_v!~ zwld3VA3_@i@GZZi8ZiL)lnV_98GkulqnKo^jI`6#m)WZ+| zw$2T&5d7mm{y(&salQKZ$3L#H1K^TNE>#ac_@LtR2Ue|D%g$U%^sU>VF4Vb^oKu%6 zp8R9?LfM7%r=EI>lRy6Po7Bpcuk))5pZw%4yeRRn|N3ug#flZ&55h;W;DQ|qS6_WK z9hiA8(N5*K93L;kfcQCcX4B%v>2&_XZo>0NIym!vCdX?T*b#w6i*wF7hZY#FR=3^u z8U9q}?|=V$b^rap=C64?_w=jkoz?5rU;ND%=v;UeYh6y7O6Vob$L5OQ( z7`^CLP;gBW>l^4HiCWk^frWsE@3fp$wxa$Tst^=D5MeI*T7+o`h>!=PvJiImn$ZlS z;5Vqm0R=^{iHih34|@~vr5XTqZDWX2sHkDAQ+!#(7lmsU7C3)O4i|A!j**xAB`|rN zF)N>B1y1sn!$;=QIE80##wy`Oy79*{iIG=rY|@UZOKX_of{DE{Z3FGrd%xV8#VM6_ zE?>zX(sedhN)>e6SJZlea0{fCz}EF9{msdi?HginZKXM+`JkV0Qv`4q$?hFGpZ3 zz~7BGeoVdj=4#%_uyW-}-YtT~9Q-~0_~VS@+H0>-IPc=L(@sBcH;7#KFpX~$?WkZS(y z)Y?6b*ny|~57{9L1*dWOzgTgB1P2h$1c;s!bgGli^zMIxIyGWYm1BVneU>X|Qh#w> zT-{RnOwkol7ko6{9kgp<`R|@lpa0zF`H6dT0?Kpk*|SIe z+rRz0dimv->5#(<)R({fWm-&lh87mat8ablTYR1XCgYfN<7|QBj+;-f61=M3UAs>0 z-nB=aan7l=*CTux#`b=Eei%hv_P6%!b?UX3-=y?@dbQ&sh1WP@7yM<}vSsSrbI+v% z7RQqgQ|S=Mz4T>_>9i~0e%eW}f+q1dsxN)%OUwt03|I(g=LHQg&p!K{+O};w?H0M1{x0F&3pkHq&+fhI)feBO#f3$50Od@A2``NO zwNry`=55#WX7A~>>g{iNdeKIg)5v2uj9XD=J`W#XuDyId zjf8V$NOWi$@VWvPO=^GqYO_5)2M?T+mcj?S=!F+dNAOQyx=!gB2}@2owd>Tz+y6pb z;3HizS$-a~7!qq2D2{QYY=ShBgNe5#j%O}bSW7LD!FJ3|11FmnVFK_`?P%0KxJ z{GgZ3*H#D`x?#rvjilB4bK=*|dwu|F+b(u*6vi)J12SRD4rDw1Fg2FH7Kg>ADsJ5=qLK$Mwp;vQBE2{0ZZ{r&1CnJe`rlUxZXa`RlImfzw z8EB3!U)>p`z~})6&O$NywT?D|;@+O5r?`e`;6Z;5JOu2BVwpJ1pC6;UC8JHP2jV_J z^LX?1)#}6Nov-H2o0reD0m_{_chVO94Se>(*T4QXe(mC8ANwdhE&ru@?6Jqx7ryX$ zK7YVWxaZG5PW|~;|6JYvz3-`K{`i7Ad}L64;?viu`Nz+tE>`QIH^UU=&;XolQrTAu zR`{xexp2(}TD3~; z-@l*laoFRRzx*XChc6JMJ}#4;J9g2|k>9AV{~upglc!9g_?o}gLHpr)LW4KH&&RTN zSDP0@*m#_5zhNHKH_o{oIr3^6#>jU2rKhc^diN*lW1hyxj0-Cw11;aJ=E4Smi@5-}sOhP@b0v2^%$(z&;69Q3x_-QlojY;Lq6Hc3^)<4yw^n|`1 zjNQ(Lk zQ`iqnr~XKGXoz;91o_+u^CfCG)((M#z=e_}3uBQ;x?)Y0ZwI@q`?eo`bNDc;P2!o7 zEZ65R97tkg=_r9>i$sjVHhwgnJuasbL~~n_U_{2_?Krh)=3OfkJKo9_-13$sp&+G# zW~LC%00I&92*y-SgO&60)H)YgP6iiyFm7{h?4I!Yp6D?^Rm4fG_SGLXw@YKwclusz zh_HAU=v@{5s`ylGHEK&lXlQTJ?M%!cLZnd#3CTJTgY#iTwX<-@4Sg0Hkq8}L+I~nK z3ff0#sWnA8>jmmG9}x-@_&j_&RAXI@CC+PzK0o=(A3dTzb@ONGbC7fMU^hsGFBaes zN1UmEoe8)wvHc(a;~&);`aI*L>_^ zbo}k@KCCCd1;-s zEZDZ(zPxU0Ky|^d91fwo6L;LG$ff0>PxRHc(1o03(Ln%?UF}}o}Ela=NI)&qJu(q88{5AKuU46LvH)U z3l>&i#ZpWML|kbvqCQ-O*^>6iptpQUfGteXTjJ}J|=bo(2Jogk2E__OQnBrxL1~JA+FS?@64$(l5 z+Y*lldvX%t>_8}yLo7P-4OyroHI-5h|*4sdTN*z>ha!=p%E5;wDGguU^b7Qhly4urNsx$Nb=)_U}TzbO(hb zrF6uw@%zLamXKexA*tarm6v)eBjC=`ICAz}uqz(BONM(m38wx)URV zB{{zTIvi?&9DQVA`W3Die=`G*n z2x<#_9WBQ6S_Ey_sA~RFLK*6JSD30KAHMUDcF z@CRu~1XuCet}fRM8l?wc+Q$=>02=bDcLh!&wc`vUlw+d<-eIc{nA#gGw6Fa@|6${^ zk+tFqaXyC*4XP*q@PfMG>W?dXTYoE({Jh(?ZR5il@rgtnCb)a|F8cDqAbl#)?koHF z={~+Ffx{2+dBzztrt>ZbEHL0p2iVnsGXwAm#XG-yznV3BnmYf|v(&{`o}*^Wn&ykG zG^`gF@(*9c)Bkqavr5Ha>o0xji|W)13Z1K|aNm+xFKc(B)(&ImP0EpMh#4NBKVPhk?z{>*I~(@o5m2 zCLxlX7|&Q-8V{$^>s!(#wpTp!lKJ>@0>07qw{gBgmr~*Q&9^VGdU&Hc`IeBv={{1* zJ$lo9y(9LumGexmll(IB!-hdwe2ok7PE&wRz-L4?`l|;)MXsEk3k7xJ&bO~eN(xJ3 zPUHycvBw5Md5$b#At};2oklD0$*7NdOd542OEY`?VMW`w);JK+@E>PkgCcCS^mxS1 zo#SvWeLCc?bfl@nRAUeiWJuV-7zvA%ULDk-$krQ|I~8??^Hp8yE(RR}46fKoJaA3d z$$4@UV>nvkxCL=_@=pXFEvn?=)McHfMlJFCm{^Wcx44w_Zzv5PH|<(XV^kEjPAsvZ zI0*`1NQ)s52sGxx@^kD;X%wT+i-Rn??$}*d9*0J#wtTQ%?cH^VzZTF)K8Y3!0eGe1 z@yD0*mkF@IfTxjovVk25cr{|yteLbG{{*#o@k#Wzn9qB_*CViy;6DMe<>6pNZ0TRV z{0X)Ew=bv_%U@Af-f+G;_rlXE-^s9J`!2?fg@W&b+^&v4(La;J_Ep2N4Zq|!MH>>Yk8Zt* zVE~Vu`c%f><_SJ2I;5r2!K(@^wq3xp*$aHS>FN}ooHFPpyNq@$v2tyu4e{%jR3CHg zCe_(YJ~1_etZ5>orWOXY1q8fl5f&nWk40I2o5Mq+F6V)i9Dk5xNpfHqsqTYExHHe* zRRu0Kk^vsP+c88?-IZOM)rmZYIN|-w)FmWyR&fHNsZwG%4X5(vU1`h#4`S=)a6Pv~CPjwa$h85&&x5`F0(uC+NV%D&5`Np%7 z8oBNBb{K?t35RH4DurN+un$nsCls6+(+po9TTE1(@9NjzRi~b^tkN$;;OheqJ@laZ z;~$?=`26INBXsILO%8FW;OVEI!CzFsrxIt+p2geq%^{94)UmjU6DO(*F1SFQO%vZO zTehf|UV2$Ae_}Z;GQ6xla?9oFL+3A3{bQtoLyU76w{Oq>`r^XavH6P&A*b$-S+?v{ z_04a7Q~mqD|2rS@h_7Q@df8>XxUhHce)Ys7FR0tT@=4SV}EHTbu9JS*?yJ%C93|<7X z*f-Dam{h*<%(NC8qA3E zhB(_utmK?j1!NN9+qgf3IkE&rbZA$Ughxux#Z?ubTzRe0h2`e*L%OuM0RPTew{ zhEV&P^;g}L z+$mt^N!?=+;mtSSR6qRTfAArJpvA($amUT$&m3NL)m408BwjJ7;=+NC3l}crzw58R zPCf9z1L_xdJf!yQ+N&M55MGb?+rRx= zUSL>52W_5y+G%_!B@W|!<%QMircYm`rc9e$hoxtum(}Cm(0?rs zwc8vTzn+9#a${1vYviY5&=`|-BMpky0}be7@~3`VuLs<3@xp?S(UMC^><>XvHrk^B zZ$b`>M7l&{VT;~Es{m|-Qo`T5eIr6kq9na@>OcwW%A>2qVwXV~U#To5e?k6=%2E_1 zm1B-~=io&fBiV)278fzAa1Q94V_)FSz+4JRwk@*i=2np7+fE>F^Ws9O#=V4|1$q`Z zhAn_5Pg)$)<`G)3uCgJtI`%GiqcF~5$Sb9| zy$&8Yq+lalcwGZBj)m)_lNPDlZu<;>vhq`(x>bGn!yl%yeNgS#wp*=RyGfmK&JxQE zaobr0;w{?5@=2cIk6&|N#!^Zz%V)<|S*ufcYI5o%xbbBpjK4aO4YYy#DtJI#45I}D zqjes!+j#9sp+(z~TTEnZEXJNjxSeL=V!yd`vApew>oz=PI_CHtXmT!pdwR|!)#p2s zzUX5?xYcr$^K0v-ZH)7!WKJ>sqdN}k294+qE2b^k_MHoo!E@A+RFGuo^w4EUc7v?( zl&`@odEnYam1A9qZdE5ON9IyKXsX%(IhyA*t~q>iuuFVo+vP~fYaXhSRgOr~7CD*5 zUkMFZ5*0P}qvwKc+i%}Id!V)nwjUVr^{>egFtZJBo?xNw%kY4oK1Q@4IvefRe7sKrYcs(JHg z2`tECO5FFr-h*n-?!A2QpU3^arK~Nc#JUKH>Va_=z{B%8J?!}Z8c8yBLn%COtQIjBxh1oQ|^qjWJ zQ?G47w5-7APx3;6wnlkRDt#W1;NmLUj2doS?`r8gTR+1G%T z=yK$zd8Buqfj_VmZH7jc?qz7_g4^hrOku;5qd=oH#&}Y`v|*%18&bkSQxmIwyf0D0 zBI(k7>A9tlMlN%aDbf=1Qn|DRQj}p6u)TM{gj^SyYK@(n>6&Yf#0Z zl0kMWINF;RT1xiKDJO}CtOcLP0#T_;KCYPD5=_!QEUpoyFpNl=YZ!hd;*IqR=NGiH zqX2yFzyE&z!`B~{E?vq`z0W-JOnxO|Bvf6tY?(TF@hR$+=U1!iZn`)*5k?>BTBbm} zWz%+bVE;jmz}FwJcyX*;7+0TB-482aI(3& z_j(%MU}NjD$PVQqO`*{|@PC>cMyka^CfZ0jPpC*Ud3-L=Mk-0f-FyT7=$jCJ|RIZ269rea{5|{N2zctA(uxE9*ZsC z=Gei{lM_zaEhj(GWI*HdR>BEdrT|Tb>_cYtwIpXhd|pzC#zgHqMBEqdhf9FBIT|SX zv&Mn|;$ilJHq?PJSbeP#^wR-g{JB6AVN-VT{TRlZ(2}qZk@sczxu9iQhRK{qWvILV zw?D%lhAOabjwN7QcR4J~1uUtuM*bX~=p(Hmb1Mc7TEEbs=`KCZr(OXq-tD^`nMnaG z;7>xOdLpH_&qmF0)}<`j7v7iB48v#rmqa0U22=+E8eMw|zQfe|r+pLK1a+TKHD~5=S%aY{Pg+=b>ZzyHz4!h~4GtdW z*B}1oZ~nT{!y#jGr8s>3;F3!&QBOSc2<@c6xeqD-bjyf&qmiTQ-FG%ne)0tJhvSbw zKDkK28IIEbrc9a4hjC(YVaJX=w1c6a4$Q>crBvSp$HO4H?t4rdW(Z?KL+X=g>YPFX zu4y@(B3T=bf}He3yN^D1E?&{euAPf~)B0qcv1F)a%D=&na^N9R>Z5{_Fg0gf;IFw`JNH#l4&jalk?;b#< zG9Z#M6<{F;j|lhTq;|;T5Dx;Z0GRzspb^?|$mTk0v0-hjFyreh+F$AwDL{pN2tph!SZ%SZ+Vt{1_O+89xO0tSI6*SCN2JhTwk^yE~s%Q zPh^N_7#rXUKDcuRvdqWThiQcRMcEp@vfE!v_Q3;#3SUClH-4WwGL$h9ilBP??YH^x zMx3{B)m2xj&wu`NBfhX;V9uL2mkxH^uLchesR8L=$D$Z(+38s&Eh?;kcQc2vy90|0 z$LfWhEt4kcLmUt6J4k&V^^Sd5Tp*w4ud}#*?%IirTeEM~b9QsoG#kYmdR7VnZK&>nePgRG9_6Kn(lf7<{- zZrZ+j!Kxe|Qs4uAKhrkINydamb}Hf^`KIi5Nf;F;mRny7(q*9kFBeVe*4Ut&uJx20 zF_PD{j>2%jVyG>R?BMx`4%##(ulbd13%VSi$)U-SMdCn~xOlEuOCRW0V`(vGfb-zf zW%%4rO5FtC5lMosKx``&1wsWan1Fr_002M$NklnpN-#5%yw6s|D;&)5Ud24=~s_d6E*(UBssOXu4t* zxyWbV!F$tuunkr(FxdILdzxGYlO=2NuBp-47WvTD+TkLl^}7Iz&l1=yEc^EzR(xRL z?%lNOV9=+|3jgLe5323kx2yBdKVSXDU;Me6FkwPgzD^KfLOf>7SbEqxj%;532}wO+ zvnC)la0d?_P@CT0%8SP{X3S8tW=Ur^bV93Lq_9%3wN*~QED zwId)lt&avK)!X*KZ-%R`0rD858Qx9h@!Nt36RFNdvNRb*WATCI;)A@ep z%2B-I%Zu}aY`Z)}e%2yPI4l;lq)fXN@Z^a>qJp3c6u=hTy5r7Ls2os+PJ%Nq?{ z)xrXB?%%&(O`SGHjUAXss+SK2QP$zYEOsvR@!|`3jU79-e#QX8$KrM5a8V!NJH~&c zPne+!O0UuJBM`B_2p1RnohSCpC0gB`^2(|!PL4>Rq+M|+QSXbo?rqy7*R!)&*47_8Du4%Mfa9eCm^vAY7ehg$qtupFB1^(hg z8~Lzcn4Hx<9?l4ST2)jRPevheBP~hm6dy85hHQOvcx2tPZfs02Nha20V%wMrCbm1a zZEIrN6Wg|J+v*q{w_Xo9T5l5lK&M-Z7(XIa4W7-ge|O9VsZifa zdyd*4o_zxbM5aH@rM=vr^BD90GD~K=V2WC9@W2+^dkx#^?7PEvu3qd%M3ElhT%dN7 zugM3-P2!FAy#L(}``N-8NB&klGO-u*T%9gBO?C9uKSE{jT%2T1$B-nbz)v>`|CsU{ zDrl&vrcXS?s@GjKHnWSHwP#FTibKe(?f8~$c71uZab#}aN+yxQw%Ed%uZOR@4Pif` zVXa)8-J|2nd6)Z%QBhPQ%TZ12K{MUWzDG~4`^V9DCH(#CRLy$w9*`RcCTxtzUJVE* zi2o36-v3H$O<+$+znm>Ae;`PRjn%XGa90W3^)E_d?L4|sL#D6pt};rCA_=*WUK7E_ zFoLgD{$x@H370&0v^d!@HH=Pf7yDXr!M4CooD$4D5_>Jb@-^Dsj-febf%CQ6I(&>l zYvteTY+|?V?PRV!L6@9erX5}5BGOKOKcRSmKMw~pdV26jhMA8N3E5S*db;qzes8RT zrQhB@aRP-;h)rz%lUAU%`}3S#rsH}L4>*Wtqx2)&(_SS@27L$Vk8+txNr4HGtWGau zJb@ax&-*Wa3^#wKU{UzTh=bFr;|&6v&K3=A&+A{_hX$nWdVMerZgu=V`p@Mh2#xZr z!TJ^mPMSo?+C5f!%_TTkXsyQbK_!DE97#JYkF$buz>NiTpIDiCZ353e`2^IJ4en_F*_kd3V^G0=EU8IV0 za~>n08k^Y-)atX3oYiW*I^WYi(ZU3WkMJw)cPypqYF`nQs;&#}Sbnfszd!#Jr!16h zDPaRT67qKx<4TxAlzVFn$?)c%urn*OJnz(o-1*Fu4#Ht8${^Owl|bd>WSfCQrTuymaw3(N>a= ztqxjAA&I@Ovg-jAGYsqyrqcEg9JG_vwIFVD5&AYJ#-H8sjW@APk6#a})T|#rWZq{U8zELM&)1T=Y(PiQEt>P2eve|`FS}B&5>UAm`pNN3@ zyZ;mXXso3Bc|&47%XKxkbq_6d-YR(tw!gkJt&R54cy{GrBwpEP`It&o=X07yjebz; z%_vQqy-xDK zBUjGZlP4$_zBt*RJ=OrvZe^5hx>}+>5&V}=TA#emcTm+ec(74z&1Wmics%Ro&IrSw zdv@%-eW(KESaj++6tV?<_?e-~<-DWVzLu!nE0~{zRM>R15%QnOgC|UO-DCitmea~M z%*o~MAbSC855TqPbv`(*4gs@-DufUT) z2CL?9C7krLr~&WfQIdKY{HmS5;M&Mo4y(Rx(~>pfpr5!p<^&92gC zP+2K!GPDN&-VX9^9BN4O7&urSd0GA#bi>ZBBy_tnYw$QCbl+wy&vM;`|EFr)X>6jY z*si{g#QA*7N03gvHlIcZmDBZ#n27ahGZ+MXmfak+5E%ITd(UdNU*g{bx%o}Lmle!5 z=W~UvkN1a#B)aqkwk55+tI*#iUSTWMYkT7)*`LBLT5WZ*&>m_Tn#kXvc7X4+lI+S_ zHq)5<`#?F9QTIpbd+Hh*0dN|HYT*h>1)gD*cchc+eD`>zv(k#@B*TDb`jH={ligvtZPSXig#Yi{2&4=UCw`5FtI zjN6H}ww|9F3my_mI81VWl++{X_-80IGeI2(|APw!Q>kBpT^poeYN2qwmvMLdwYFbpOR#Y{rsxS z@bP(n>LhW}4SM$P5qg|4f!enC{vJ+dm&gEGW3K9roBV3tUNr*ckr3e@`wuo;wnVDL zdGjjUE;Rlr^8I9&D#VGCe+v&_)cFLsK-&SRvlhfO3x1F)6R1c&DEJG5?_n!2#%VUT#>#-)Id!W^qIb5tsdiFamM68 z#(ih%fi+ww$f-X%wv=by1F`cBt@zA&ZyDkiZL~C7qX74s_f2@M8R6u|WuXWYa{dI~ zgK7UcXL1NiYI_Z9{|sqR{7;K|+VArWPhYD-C`KxP_;2ITVuVuGX6& z_-r`pt-WK6Wh)6hjmR#17R4>NVP}d~{gfj9<5r=ZN^kmHIF*4*Zh+qDe69iNxb(_K zXgz1QbcGK**CyA<#TN{yWi~`$1dSi`x zzxW9A+7co`1byC%>P?w7t}afO)xd7&6vr41Y`CH3@Z`=MttgLFPh8A`Lk-o{GUuP#q8$o_6tCySVCaqHI_p^n(S4PQs z^(vn|JMq$wW3_8mD#{{)Q8SU&k}lI(Orb{Slk*2uE~78L79_pNHfm0|A+bCf-VU#N z^~bY)D+E}!ry14Fy2R;Hg?mgG0|^0Xyuo5;9Ek#=0=T>OJQN0!$A()+z!ZZm90sE7 zr+c>ub`F&I#bv>PNz`nn?6cZEybca~gsqv&+8)AZAYR;gYF)GLW2%l$RA{pI#;-&i z_AV*%sFo8Z^`K1qmillRZ&;>afnd>Ds$|&+7oJ@WI-6s~L>cs?+MaYP>=wFGV?XJ^ zIDjup%GkNfABstr*VC%`v8j#|T1K#sKzNMft3kYZF@F1iG&T#BJ7svX-1x2(xGMEJ z(YMds+5k=+AV`}Cf+UF`x&?#+oV5l z2T0#N@cTGB9!+Mpe}UZO>SW1Av3q6k`EX-P2jqR*zy_9|NH$QoHX9P1glhN?NzEo2 zaD;AkFLSe=~!P{W^C9otbB(xs@#k#&tM+zVM#M3&&HK* zy{mRkhL&ScOkT4tq|}t9F--jAau894n3A=kGI-O4>-%Xgt`Wl1%DKQme6bWkb5EfhVD%S-D@=ebFuqp;ey$2dk4Qz=ULkAyh-PsJe#+0 z!!rMJv+~>H{mTgZ>Ac(^X=O#L8O_9Ba4dqWkYCWRpCNtHhm=~;14bmkvD$6rK~2h+ z?kYr8=u99ZoQbn|F9t>9b;sOM!E-ilZz0?J90T}>akR24cEb0%b-wl70&E6R*|-3j zQivD%AD8V{OY!*?+D^s@Myh8*5SyXI-8|F`;k*jPSzJVu;D@{&O!c2$IpH0C>trw0 zU`>|5ZWv>fw6`JK{J7drFi-|b&kiMG=xF7@$7<3=LRcGTkuPB5k@pP!=3b#T(DXJ% zUfR`b#SS2i-M?D&ajE{2ZRxLGrWz>bTO~wb5VO3M6CWG$Lko)}G)CJ#1rQ!n{YA&- z>Z^C2mOyG*ImkEZuy>uDLF`_U)spSU|*cog{|x$0+0ZO zf<#>?P*4OB!#y-TLM@U;4A+b&l{RV1yBtH#%EwCLv|YD%QH$W)UoBZ8B$QW88m%@e ztv_@G6i*i|9i16*EK?{A&?A<wi&@DC~CtdQ^ z)<^MqUHe`wN+>GB<-S+w?B59BC>jV_GE4ax4j(8#WmnB)?fVY4swD~zi5{}HFpE@Y zj3B_x$;vEt!XSGXVK?f?cuy-i70O{0D`GJx2dlqr_YyTpTGUtV_W02MXHrqu8I&(4 z#sXFu&*~&nrP6J)yhR*v5sAv&6*j4*``)M>fv+klALNT_@9O!)NE%vYBWp%XOp0d* zaZ5f2X0|C{>49r~Z^N-N${>bka>3{M>n2$XpuAj(kZFH)cKYl?|-mSWNH_K;46XxjUI#@Q1!V@$`#7&hY!?*yZcOxqS++7HE3kt9buU z75XRL#9S)aWogrkM2}Va> zt{^M$?yvFo%u}zK6Q;W9NkxV?c*K#M(JHR(c@T0UNm|rsRby;epC4p5k5TsRej09z&?dN{J;>eOIo{a>RZuagrvjc&;DpB%t`sY z`$@KJ$X{iaTmkXs5DA;ALVVFtp%D?H-g8#XhvbhUWV@nh6}(C2yR?jHcMC^eY?{NU zKBbJf_}E67w%gSGO5-B*0n|{vUEhg9&huMIuZIUTu1?mxAL-Jtfc_#!y@<%K{p`vy z&SZucBJLgN02G8RJdT#J;_2g{3~gXWg$F5?K9#_J;xw)ny1t0&`>7;EirO~fz!y$C06D(JAY$c-L1d6aFdM{E>iKnj08y>^%xE*;qbwAuFlOQ2Gy z)jB(BHtH;H$1HcvzMxcWNW+eNFhf(0U#FUPzm8q(WD@F$`+1VYG8b`|tidgm%W&cu ze5;H$KR}0Gb2<91w=)XB3~S{vG%IGHRdg4OFQGDNNMyuVet)r2+p&}wE7Re~z9!?wtAlo(XWN>ks=)(9^qVeDh1_Z&^DHE+d*?l4FRPzmh;jmsG zMnu44x0L%#*vdP9dyeT@&M~@4kO0PKw@GN*F9h}1IXJ=aPyswnkU=4^*>a!Vm6BbU zQy-Wa=D_+@5&yInDOM|Qs|iD8XaT=3WF}>?KN2Wr^1o1+$b*gN2Z5W(gYhy}Nu(w_ zNuv3}YolY)eGiB=UYh-QS9!)^p@k}_D#eYdPnaxJDTp_0Teok#KGvAe;IltSv`aQR zf8-uc>Kz$5ymmH8w9v5iqB*=@WB*)fsqPv-u_{iIv(^t#Mw zd5Tlm>Ks-OJ;*6xa%}h_#^W@8T>>%Y_XfKV_9II%`r}>#)H8^R%Wct33uYiBm`x&= z!Q{&b$Yl&id>nxA=i=$k${)hQ)Xn{51u8W%$t>$8#4XLjw=vOX7+1s&n~^ltAzEqDi4YqcJ{8j4spu8}>-h=`~ram7Rb zic0#U4+-h_KcN%D=RnEt65FDCg%bRPhv*UX_l(`4{PShN7nAf4tynB3VlBRyFQiYk zWhnYD2~4(_dU12&?=qLy(hr*~XCxn6rIi~C9Ud+ZTqfBL4_q$)d`2!)sQ^{2dbw9r z?$nJzLgYE*c5Vq{#9y=*%WyDSRo}_OO0>4>DteYe=HdlRD9ktfEQ``5w}Nw-@4C~E zOglq%b+~oHPb+D)SCws2tEgEfRmVASmZj-0mz6!e)&1-SVZ^)NHO7l_`v@pEEo@F; zy>6Okz5k6%Jwd}U(O>af@q>?zZ~Vs|t(|ML>VDN}j3nmFhy(E2`$trU-l%>@uA~$P zNK^54Z6ge6>@rvQYIAx0P-3xTF=hEACZSyv8)pP0jvG}cb z{KgfOxYTP>f4xWK^(@;*1@JjXeu38>R1@F3*&g&x8HT^@k9UDc>9|@v zvbqd3$(oZwFIXueonen$s~9r~^GKdk_Mt6xDdpd5xU?}i{bJ|G{pI+*tT2WSC?v0m`MI(4?Lt;JB?d`wM16`S3I)&HBqCLZ9zDk8B^r%OkX< zBv1A}*N94gMT(1Rbf3`ra?75|!4^)6D?$LlLDd@DUKbTrNz@}6xb_9ZyHWeG@h#># zyrx#&Kx9GYsCRVjscx9UYa)J4ra&iZc+ekgu+wiGW7F=`lP2g>m(3jSz18PKXVV9 zZPVOrIS0+$zk)^IPBmZ7hTQCovN$SMaGKHVxC0^$_J`Dz7|9)%9VnEB^L)sNPpZb z%(+JuCN!n}6yP__p9<~M0% zB~NwHCCUMn5>@juuU@J|oT>-AgbL+xG}M)|IMiRo2C0!HD@Lm|2*>Pk?SVG|m#wX_ zea4;f_$RCVU%7y9+C_QZODQEwB$-W;JSTHM+aldu%N+<*j3R9MTc2w)hp3n84yR=_ zHQ_%%H?^?~HA#$~@6lbw-!Zx@qJmWc-fzO2uhNEspIP*CI{{nQpqu3WOWlTI*q5U}aZn51dTN|9*4-Ti80WNGl!$H6?1HU5P5sQ2>If|P#ltn;#H zLoDGe#dWWOYy}Y;!>uZ;Q|Gg1R=a7(MsXgSB=C%=PL>9qIjI_tcAzU-y`_?!STsY9 z&2FuJIw}Eiwh0=>cDdO>jaKss`zBE*91CM}D>J@?IkBc*$4N_+tKO9Qn;^}fv)BLxoyS+zdWJs9Rhw;P4?G`7SM-Z(Q2^_Y)#})$ z2VC;+BFe_2{2o89Adf0udLlb)MY1{gUJP9?CTtKso9t1g&!TSRVYEI|lE}Z&6|A3n z9b9^|2g|X$^wS~_Gw2Qcda?e|LuXjRKr%tsaVR}swUjE(&)Ia<@f#-7i5(4sZ9qqFHwkGoN59LOdMrKx>n0P+W*X7c-rE=Xi*yzJ1&-bydg z%O_kDvcc4QL)|U#$|12IgE4z}>R589QfoscU{RdkmLYwSVM7{s_6~9sl23MuUhWi^ zblyX%1_s3CKJe6J=YV-(69dE-S_Gd2BGYdfF7ND(=_2iAOLnHMKFT25BjK;n=A}_4 z4UQ}&{65iTZ)(=(&EMcBy9-`&?~tSziV?t6!P|3!-KDCGsBeBXTzGPXfZ5b>3|a9N z@e90rqh@G}3NQ?|dN*j-wM-j$;5(hlS0upgRz8t^eP#=#DSE)=D_z+Lc(wP2RW3v>8xQvCZKDpWw*!&{lS40CKaZkGE|MZVSGPz*Y$C|(a{wM24(oedZnJ9EmFEFqe6n6n(o8Lo|H7p$W-a*6kgx) z5NoB-%5A>SI^7H}H~hj5f8B>_uCxaX7$+Kh-CDTm866=iW8L5_o{N&=^)plsX>Z_v z-oHZ?*j#65(XzYTM@nygHnF-htp*YEN$=*Bzip_hfErVuiO7L2Npq_%z%U=helYnq@o})Ia=KWf} z-`7^SU0#MKtpbkM$4gDTJ;>aJQS_{D2|h=tMN3qKijy{!!SpDxrBmov{nz?cZ|>*>k6ZuBIME%d$jfif&jsiIB)4D|hp~EnpUHrV2%%b#dWS>0*#B?!y z6k9KtPBo__Tk#RO&YyO@F5J>*PCV_cTiLmtP9|N8qeIstXO%i-CMz2k7s8*6IcTjS zlr>IsCn;R{0Tt=?v*Aszt;XsF8;;p$(jrBOnA(>HKt z8_JaTr_8E0Mg2AgJ>z?#C*8IVaLW72-v*m2Rrq{#+p3owWRtDigtDXN*yZ<9#$F85 z4IR|~HIDynBTx_~UW+HU5OylY`I1go%ce4p<7(awWVsh_ml|BY-lQ{%yHh-!HW$3UuJ-?6xWwCH=l443 zG;NjMv7fQ${t!b2A3Stw{lV|fcZ|ye5#>u}+wf)EM&{k6=;Trk&?(a<&8G=6v&clE z>I$J9K;$%@ihvEcp1o5)UKU>LyIcEd*N{6}drdBT+5msGh!7cc$fo|aDE7Y8aFPX8 zF2T*o*0Q&(Axw-&#I<3u-~cX|`V&{uI9danDpAUsB4oU2$3Ia8ZT6>|JDAU>myTI% ze%zGAAH2`&u_%26_Fn5~Y$vd`-1TcG#Md3RScO9Oj>iyymI>)^N>2=sgoclWKU zf?#FxU8!JwXl+nLhwFK^0nWrGcI`>`G*e(&G<~ursCjDsd9jsC4%>6hNn@)wSdu)L zfM>IpeOGgfq5Qq6Q2On~mB09lS$@q}4&1ko?e=y{1mh<2??8pL0&{Eo7dhU!_lGOT@Sy zf}>1W$+ZL5Q@0qgq>oSrcveqHDkNs5mtfZ%eWcb)xv!-X9AdHc%8_9H1gBy4kmbQ6 z_f}3)GDR#s*Ky-GexOy|EGvZ(NoZ$DUwf;0E<4qoQO;H0w->foZaER{Ow=SGUlsOf z`A}BevI(^XqRAf-opJ9iuM$=ZDl3TmWO6ITU88UqkW-gj=@MkT`oV|_QvdCS&4#QE#GSx>vZQ5Vtuw}bD$XEC zT7t%doyLS(>`3H~f=;NyiDxTZlp^_=N6Ypcl67`H#Evw3F@i>NH@XA*I7JPPmjVln-eC<#>57f8?j!g;_f(@H!ACru=mZH*iA#U;eFAOPVbDI>L z00Zi73IHoU_bRm(M~=OXLt7z>rCE9&o69e zw@B;M!H$*fDb}Qi@6+DV)qvfy@BJ7Q8gTRtaCrHAw1y&8t2hlBNrvm?sM?K_&uK;y ztj}w!xru3(Mj+-z&cffFyiK*}q(MwkfokP8@7-a3(qxuyF^!{7bInHLL4-F2!5r=l z!IIxOMql)pFp>&H!89S45G2D`!qr{ySvP3Sr8$}wydi72J04jbrX1P^S9D3D^+Yiv zds%cBKzPS_3A~jHO~lOPDz?Xd+9-k|yqowcI2>|-pDH`ArPZ6=0W`qzQ_o$pOf&Nb zYA4VQV7^?SWyZ4%4hLfl&zPSd_Yo&Pqi|9ZDkAx3?Y?GF00r8@SeT=H(-N`|a=7FK zyBi*38C-1pV~xP609`?HF`$Z(=Hy(A= zWpvwJQu~Ha1~<6^k>hJgq)*do=&EEMoR=wg;D)XpcH=Ka0v{K5_<84GLk5`Zn)-Al zuMt^u?P`-a&r~te@gctEgyjfq_dLucufvQ~6~YixF4toK-(x>;tze7YIPJ0$x%U2UK?_UkqYenZ2X&2tJmu0VLzp!q#uxiu1 z>kp#qOE%mAX1q&oOH@m>7oAS z-eyzZ->6yTKwtAa=p3e_kbHKf5CnFQ_XcM0d1HLK*4UFOqr06`+o6@*} zehRz-8+hrUxP9uS>%OSOj6FLSSiUgtZf|twtbm0}=VD}goeCsrXoR`EF%{!%rlVK- zO-*NzSb+gIW4DaZqZ_G13!N)+rysG6g9-=pWM`8C8W@G|+)yE-8a0+vD76nn9bwAL zHy6FXSLEqO0;yQ!ttxO+btAbA4}PwF6l3=X&1&I-Y{qGU){nKRk)7{hFt~sTO-0KCAT3LH7g#5&Kq}=4CQvF?wI51O?fJE_oSmO)|&0v5DQ1f3nvCw zO?PCkr0+FvP73*J1ocz^F~$Wzh3cuXZOfI?Qz^7Fo!(1$$;+u)=5D8&@yAA#cAT2h}K-bwJ*w83mc0P3To@r zc+k8X$pkYI2~&qx?nt)@JB|Bkzwqj70*ehu{Y9$;=@&vd|k zmS3c53p(8Vki7Qsg`H7e_0X0Rrz*iQsPSe?up@%ihh~&XAnNb+Lu?g zK%Yfw7OLq{th1sMhh2zh(&M7Dq5>C@*fuq(oXb4hhAgnFnV(e^4Kex29<4aKEO^lZ zaOn&yB=Sb6E+0l%Yv^NfprxB=^m?5j0IP3Q+HxLz!*9jGa=VTwteYi$K;f?3M(JiT zhYHJwE4mGxdu&+-X9@FEb}w^QI-+^bBFhC4O$ssIPa8eNO#^WsIPbnThvlnzH}q9r zbAXL_wM208(#?c`32@m;T9V^7 zz&M1NoEQmVm2gqkqKAu8aU0I)WaP>WNeYR{55|-hIFeqKeFjaO5ZHc#tw&l=Hb*C) zH&NY%g`ivX!Z+`Mc*Ubs!sJDgH*%pokgVsMt5(|Y%^0#Pxi4xTh$jp(?L2oyTQI-d zwu~5lGzn28=Mq6Y>6C@#=}Cj`yR2#y-v73SA`e9!TBS+~L=t&}WyCdw5-BR~Wx2G# zE$4}_o2NZDP+i&=@M>BdCGrFqRe&8?8PM&~0IK27wr4`7jD!=7hsrHjCeqYZFP=`( zuC`{~E!+1Y(34<&`96 zx#8)~)D@hHEiQ&itkHY!$m`H00Shg#qklF*PccWOg4IUQm zJAG0!fq&5Pz4F__PeutYJr=ZwAD&fY*BUP&bJqk|TLj7oKP~)=io9pE=5Nl+R-k4} zkE|EOC+m-w5>XnJtPJ;Tk(R#fByal5u>f7P*#YSj|2Gpq&&>Me;B zR`jZJbOLT1-;Ujn-zejjy$%I2d!&p1syPaqjpB6=3`p1BSGG@sF zjqIU>13lBB85o=pG;sBAVJd$ZzUS>V(fB1d`Q8rKd4*+*rI)EU)uFOtaR>ML_e@JK z`k^9m<0_CnorPR8MkF~g^3D`Ybw@-6I8U_kk`S!&&JLUp-v_`Dwy^X(Hv$@DMZ8Rb zo=v>k-1CcY?#NDnypxhTydn9?f*;PAUNN`rpZv_4me%8$1ryD8qvu={?$`Ez>qxe} zY}wb9%5Jlk0(QqEb;Jj(BkA+iO@RNXaj?*mt8WB+7@OJYyK`_-D6|Wabwx zzkdznbCdYTPNKT8h;xoq(iLrSU*4tk=j5JZc;8pD-+jU-e6HXy0e&n@*2Ve3hw29Z zpvHc1cd35%eiJ+vpFq@q2mJqY@skwRt(hh%g`_)+es{P{)k4qMl!^kY!%~B2z z@McG|I_TX}n5Mzjn7IrXZ97=4etA3~PqfHOq}lyvF8@8H|8tr41-sYrx)!XRz#E=Q zRc7OCIPy>bIQltX_Ag%W@BIJI;D7EkL%Rn$Y%8D9*ITL+H!g*_{_~mt3`-Z<-o-~M z@Z1aMmfqei1SIr&jQ^)N{+Wj@)GAst`H`>_wMd)zo8&~xbb(){`pQD5bGGGyh#rj) zNqrm7^Fx**_y6ygv?QR+o!P}`P4foAr~`r;J?D#%4oXms0IKDq4(ns|m%DC@_L#us zTRpv_&)0k!SP8Yt*AW6lWnP)=-;~*%g-idhRR8;K84AKm#b%c%6Q%%~Bc@KT(t!F_ zm-VYL_r9K7!N|!=|4;^o{LV^|3Mwwk5zFA$BJt>FnOZ(Lt@+v1^O@=IcK^9z+vdd8 z6^#w-j_oP8q$y7F&%bwRBiyp=*q$c}9RG9pKZ0q50G9%u5xlDmCj>Gc3IEpW|9TM8 zcnAsGCn%VpNJmK{fJWLmhJ!wlIJuK2%C~<2VxCRlSg`mDYUhS<5|i&(pZkvm|7UTq zqXmnMX#D+4sCeuZ(|D0#{--$0MX=!LPm6-@HmN1uOH zBeBN4jT$!lp;iufT1~Veb5XC{B;>(a)S#b_?Ack6_QCm-$JiDMPbyK zk&+*6r&DPyc3x^+Z5;G%*o1i=0*(ulm8uUYs}!YQU~CK4+H6hEj-4AJO}Fn9ikYv- z$feL*Ij=QQ5##z74g7gI)*^6_h2Xy|_*0JCBxJf%!S6XYF&;hXpBt8+G)c_aDYt;N zgJbOCE@hJJn5L09?h_YU8M# zqEIl}^gmqGMKy}SH4-VD#rAp3tXWJ^*T>i0Jbp)e_l6v2V=T2C*}+}~Hj%+Qg1E>H z^LnJ;DFQ^O9Pl=oiDgStIGTfBy#kDRLhXh?gczmPYFJ+W1Lis@xN6 zdCoDv2zkvLr|SO=b@>9$Pui^3(N`;otYI8Uzg(nz>%_z~h8YjCT>d74BQWo_m<%$Iu7(MQhE|S?bi*8?Ir3wD4IBu6dfD}s zO{Z(8F7>D_x*Tg^#P;E=L(AV#PUg_v%a6O4v!kz%Pb#QqN-`Yh#u-^2%plwol-pGM zEmJ?QC-#Ifpnj0c1*6AkxDwD)XV`D)f2YQmz)XH5B9Ea;rsyUIv+C=gNgsX3rSi7d zyq4Dxjsa2B3qN{_(B#y^{s&VV!Kyx#qKkPTkQ$tUyYOY3YKE5cTdF;z>3s*%%Lw^6tA&qEW%9-Ics;Ft?h4}V zi4dn6{z_J`$GGXV)EiS2BoK%QIMgLB{IK&5aOS231csMQcy9lC)9>+wr;D5pzo`Mr z+zDq}ArKZPIg7K3q$@*|HQIdL33KSla!WV=BhRW(kTd!N{aCt9L6r294Z51w|?wFp9Kr1$tH-$#>b;sAofLHRg$>AtM~EH zssech-oxCr{2OxJH6{M28&ix!k1>xpRtACPZ=r6tST;R3L7EY&hCB5xr0l;ei`O|p zw+*#Xx8H6)NjiH1K4oHw2%+f|vWz9Ch4QasH5mjJUFpgDU%Eo@MSKz(Fnzn<{Bjq+ z`dd&F`B=2+hk;9Z9=S=?7UJ#8!+{hhN?ToC^~(T5kjL}*B~e&XJf=}-8UGKlZm6u8 zmTnhM!p!5a4jBZVEHavh2I!s+E=h97h=Q|ChDnsZw-Y<@AHP!q{17aJ2U@0kvg7|Z z7XX;_o+O(Q#gA^e$w0md+GeiJ_@bX;5;D>IhB(1%oZpmmIx)Gx<-|8JEHGu^G|Z4g z;Cr#Hp{dG_Q(%-m`?KIYR*TVs2K%m{rRAEN%E(wyoO^Ba)e%(4Mw_PJQ4rH1NCd)w zxa7{zJgd8qfmGt|@jX!DsYRX6T-aaWGkIQ7i>x2czM^B99Bs3GzOr=V;cQX4x4cY0 znE)C7l~g4p#CyF1f%}Zp=T_qP6>5BQfgq{_{SM+ooc+RUrQUssP{vVf*OEJ~Pmkej zYOr>KZBFO@l3>PeKYwMJ`M0d$F9Raf@hn-oZQW|p&(9F}TD7*w1?3Vjsf75!p zy%Epqx}T88?TN=HsKs)$z94zic?p{N*+##8-6zpQ4G{6-B+#c08l=`dj$aBi>1q7~ z4+oj;`TH>+Hw_yNJB9KxL&%csLz&;09`m5=2P?U{%Bi*|ikj;`vpg5 zb2(a>6=aZTM(+!76~p_cNob+8_#8)rb`CH_GL3)3s%{R^Fz%6v(ICt5!rDEFS$>7; z%#~*6ceA?ztHCLy%U|D3WB0|;+n4+s%2_+q>xbK(H-ZM+xYR4roU1ZSB;kiPMza4D z!!V%HG>3`cZHdd&txjyMOXdCcHwu0>?gd5k3wlGdtR-bJ_Z~b!J%=rw1v+med-TSoCM4)2;lo z`x08UW=YHVQy-SSptG9qYVx zy37x&(Fbd;hWi=a+igJ`3vaJep6Y${@~;d>PD1}tn1+G~{X4iYT#0jDdKH`j7kz3z zM%sTND2cn<5;ty2X-rovGeQARY)el0ck=u3am|mu{R)QRP+}8*b~F6-=5N6+mvD3$ zsHGJLr~yGqKZlhe|43Y648%hWhjQt_6f2Awy)&wok^=@6B8>*q#PKqT(N$)nhZh4| z>x?X*9E9-w#J+%EAb%dJxk9ydD?5LR!6MXG;9P6W+Nt34OBBDtAHQz?rju|(6^`Ou zm<|Q*AakKBQ9y#!7*4UHH<0EqGQo1+;ESr-(J#F2$=7EHkqq3Rmh)$fseOx+1b%un zn6E@tUk+#<$sbokTcJ?3y*HlSwD2n?k_#o~t3NgPN@t7L423%E_GPgv zuE+1c*pr`?k!0@Z;&EM=I>4vb5C?eElbk8yJiyU$2=OlXIkV>Z4MvJOaLLr`?i-q5 zMm0?JVpjcOw?CEYyve>$>r+fbo)$z|y}u@?SnMp%YXZ zl0*{iPa4*hqa0S8%VW-wKTCIyoa1-;?@sdO>4DWO-d`>(NP7In-%<&42G2q$HM5}6 zY3p!CV=~61#x?g^!py)LH+r_kClOcP0wi2ToNRF!S9}wZ@DmunGBr|qFkVUI?rMoY z$={idi*PC!;V|*(lj<>DsC)Flg71BH1~L^_d%=b_stRzOhsHNLG>08c)`G(_~05KxO;*R9yA1ZcXxMp4em~G3&CB2yFK>3=iRf9{G6Y&zO}lmtE;QijPGfW zPUq++L!Q3irphOr+Ht5<@{qg7%Xkv%p>^OP;+cB*PnB}%VC6o5yBxPRT&JVWNnCVvMGUFZ4o!buHSYoI~5dJ`W0TO_G(0 zlwk*|0{k3t*#7|c%RYlpVr5!gAOA3es63Bl6&+zg1e#shBHmt zbj~iieZ3S!+yz-yaeW?>WjI}3gVa9@uD`QOzQ>UtqI@1EK@lcq+YS^3)wEA~`f|baL^5-f37Q_c^4Lyt#gnIV*C-RU8%q%f3?VEqWdkW(jhFKpO=7FDzR5+5 z5)uolzVPhL!GD5&xL#Wne@0|I70D^b`q5UK@2iTfPp$n}LVeQosZfYQA6FiaW%!~5 zwPWlE%690lxcra0)7R#skJ-TEy9r^_qud}5E!Sm6$f;M!GV&d#zhOZl)GQV++z#E+ zd=RobyB4n@|&P{8PxjDMW$KwjrZU*`arb>p>9wZKqIEhIJ(PkaN%BV(Zx}&+jqVB;j1^pjQ zO^*r7M+rg!3XU|;dB@hC>Ryz|IQXhI+oR9lZJ-IU8<3KPClE|My$rl7OLQ2FGH8ZJ@7sgY8L`=eq^fF_mpO*rU{R=Q4N# zyL|g7u_*Si6DsbD_Vb(lSD({_k{6;S5(p_j8U%CLzJO(yksSA{4|BWz5UxnTr zo?l<=A3!JgVV~uzTgYj6b{Lj+1K_#B&HP{R(Mz$BP@zLoi55vqU+&{GrIr$l>f&hyysthNDw|v zJh0P~QZCAjTh`FY318ve{4~i!ASSL9g2~++2}CgHkCkpx!zc!(2X6YzBV8B-&ua$0 z=g(IDlB%NZU}6eetKtztqlW5IbazZ7G#EAOYmvS^;*w81bJ$_Lzcgjg+v)mrdBj>; zNux8=PM5z5I6Kfpht1=azUp?z&=xq!4V#jAEZOyRQ>VHw#|7Q&RC);Kxh>m~qCt$i#*H9qwchx-n_R~qq@U@RgdDE|0IZS*@ z%x<+n<#b1QBNs$If~<;T7ya(&Y&eclP+YOP?+lAqG;UR7h%0i zuOm(4&%d&~+29-AAX$ng%DZpa?Q<({+qQPeo8;^CvKH3j{vP^^r3{Mjo@h@R$>N_R zEI-bU&H&YqhLgKni?Cj+JB;nkirTK+jlB7Xke)f?D_JCt>+Mw3xrngQZ!QPri zqayp0AeO#q*wWhGST1miHyMi9hK=Zm;Y{k%T`BRDg!5yM(Jgo_iFf!#iL*&5O`hyN zSgBvTo^AI;zEH}Mm+YE+90u|R*TcSXHT;FW*q4BitT|1`c2UYEeZsB06&sr~PqHXz zw-2xEp4d1kqH?gL6U9Bi5{bqHPG0xLN-2qQ5;N0uIQKIcQ(1Jg-!M`MU_Dm`PZNu= z?WHx98|a-#%5AN zC|}OZ_34L9;=WSf`BWpP*|7&EK`l+;P4IzMocE&Zj%lJh0D>5)G~kB*UuP~JaY7*UOkWPD z=jH8-q596C{TAog$vB>I8)DteoEw54L@dJ>1@)@Da?jkx9VU9^mB z*CvtefuRD$t;AIg$I-g*@KSYxq%R}TYXG=249XLXP4n8oMVFLXxvi`S$_LuwJs zjCw`^No_k_687zXu^ayy2U~*RGsgY^-5VPWeT(N?eGK`Ndj`Hh2Y3m=AUAy*RQ_61 zJ5IsU*c}j6539AWP*#z>C=w);8*P|$zqPG(kTQ|p_Oxl0<=zvu@NRGaR26l0zw3R= zxS6PVHa4}d7XH!YD3$hoig7k0?Lt56zPk?2|63FMPoWD5m&-|FUBp^YYLNRoDM0$P zbQW;vWXVBrdw18%x-313ZX{*f;5B5Nh4o%VYG(o* zA*5^2)?Rh_?lAfRD^8{uD`0O$E@cJjVm<) zrV~28zik~bYsO~r@T;5agD^j2?X zK-5K1>`D2{8;rHq@B@Nv-PfObUni@$tN)tEv3d6Ix~tzr6M7h0>DZD4?IlFmy6U%l zyK?0v1j)rIY?VyXmD;=(YZJ2yJ?Xi;xvvw_%mkvadRj-;G>RdGDce3$W?b9$>pV+ zw(5^iDZywbQp!IKoHx#CJN&X)Bf91IpCwF-ej6(wX=rzRulR(UHj&;*M|3218yiTf zmF-n=B_#Xf(-~3nHvv}J&Tpsgoqx|bng|f?f0#+yVezvYMPdcB7qXy6qMg6qAlUS< zTtOoj1x@|Ylg2>|7Y4kV^i{=hC|4FF!|39Fs{3XAfu1{VS9qH6?DqwooJnL#EZ<@% zZmZhVfMHW08FB5oZdYHIRF+^T% zQk0Bi6bTw{%RVm^)$v=FVQ0}*+RFNEd%%;$E~k@^QVLKU0uJ5NIR{JXHjtc-J*8(A z8J&Siyg#-x>#$;xc%E=mP|2HwgjB~H&Ftt6MsJ556KYkGqY(lyRH;>RuE%~C^7sGz zk3gpD->q#^rAqG;sbf`=?P$0xqwy=n^pJXDJ{;N9I!#q1FM5}!+a(hA1auN4I6;yU z5LmPk9gLqHU~Veex6YoV--7Hy8GY8h3dbIFni2(!ogQ1xX>+TeyhL*uCM_5f!9B5K ztL2OU^WDY+XwQo~cEDE9D+Qx-@C827mBxUt{upmJ!8y zy(KUEBh`bwpuR(W4OQ8J`5B6;|2y`|ELR&19gWk(Oe-dsDP`kc z{ZZ#7sEz#QDXvoL|6}^U0l^kY_>9q=iZtts`%#@Qw49v7LnmE%H}@>-a}aU);>dYN`47PHnAYhs-I_E_^A01OB(Pi?w3hv`#f#OSHH?YkZJdSxh$=c7y>zhtY$o6}K-yVYd zem?)sj*S92eN7=u^*6g z3B}K6_vb|tjv1I%`{bW0qEPN5;OTNLOHZ-2>FI-m57X9g(XN9)Fl*e!!Ny~K`Q25I zby+sHo*b*dBOuH`7T58k+3{NB&zcl)m8GRQIo}gm#0;fp(H8G)aP#CRlCqhvk5sNL zNqc5lx`UBYsd|LsPTQ=XHz1`EQN<`rfDdon%n}9X$?f!w&cL{O(PfL$(2Z z0PGFC2*REw`FZV7G&+GrpLS<(_coTz55fq*!e62QtqnB-P6m; ztp!)e?QKyfF~x?|;~9B>+&u8dWZq%+LJb>;*)~W(pMMPX8m}iS{dp;E+-UI2fHU6K&%+xDV-#`H$5jFvm<9?QC=m2k)beN@C|u1{WgrM zBICiwEuB$=eMB&8|J&yIN7%y)7J1DuOVSvEIta={ z!Yf|7wfpjMPDF8-ma&Dxu1pob9DI@l>lk>QMh%?5Ku#(Dv>*VF%%y4~fFIcR-f&bh zAgADXTpr-$Gyg#0wgh~ApxT~E%J@)f+F!`n#P7HI6+~Oqr0=&iN6!FgO^Il**bgNZ z(N0kQ!01SI9=|ExrYHDcFy#h(%5nm79hY5;qah0LxDH9TAy8T={iVAt6d`h zRBvW3MZAtBg*gL9r7=>7vSYP`>G^PkQ{Zk+b(8lrv3oD|$^B__K6xF!>;CPT@&S7s zjwW?)WqpH8;AwB)noo3wmN}8Fe!U&0h5S0Ujw*kl1vuk{;(wlmmyOcKgBlT}jo#!W zI)<0C{BFd_BmC6B%RV0XAsZ5OYn4M>^m;(Jr(N<+AvsDm*R4;M&K8yJFYR2&U!08v zH<5y$S~Hx}V}ZJqiY%+Rn`&5N@&8238}I^k@N>+mkB(G_d?*GNt0Uo`CnxKvF++z* zq;pGx>iO|Z8fq~pju}rXulYj5ZsUmN_wq5-c2&{lEXtCrJ)3^WOMC+p$_@!qS9}8G z+ar3aWUbQ3t8CXI&*F^X?-*%y%;?({LsO>4fO-E9RiM3_o z^v^y9$X`LS*)Jp-jV&n|HgTrE9uJMszgPYJ4D}45O=t@}>s*|-jk(i3KX!!dIXma| z{2{P(eo({3;bdYYrJKDiRaIyRri^|+Qlpnh4@#=+a`YM~JV*{eb~|8*C{k3j-fheT zgOMc=gV9tq(zF9HH>#Rb1n79&K%L7=KWZYXy{ktrBu;TFtIo>ZDEFAmlpA4#WgKHT z^(zNklJ8l0$jzu-DtIJ{`!i9Nxof}NUOUj3EV^-dSLwl#S_B@c>{;EAcY``P>567U;xVFq?uItM5#_~|YR zhfPz$e+wacO9ws>iXyQo;0>!huO;gJJ0UIB|4tj6i5^n{X?<67-F;*o8s!a9>nGsm~d zD9=d%_iGMBV_7uRj}eXin!uwOX&uup#Xu&VBHQGCXPY;rIgM*^^cbQ z)#^|`N9kB0vCGv;uOk+FbI!^ptRW^Ec;NgExiCFOjUl?#RF+NLDy4cjYDO{T)m(w| zTw5PeklGvZSk5_5mMIO`IQ-qn`?BgJ(i)JVR_sNs!?mHPzj|>qmLen9R*Nl!JC(%g!KV42^6bRW>7NFKBc&fu zG?N&7h<#h(bm(#gWW$0ka`hVJi4bwsiAW}Ut*V9L^XX|78Au6+dPOys zYK53=OlwR-L`Md780HnFJraGo;I+5Dd~?x{AjZ+8O{@W)Hg=j*!oGx`MPf5Ne6ndf zEV}Ibkdn;ln3k17uxBH&$Vahjb>&CM^FTioLLAm*a-iR~RyPVpc+KH5x-r%7yW2s- zDxPzu#Ep`{&3D94=S_B|Fo$Q1CoZr+(}^E3uaChKag+)eP@NWqq7L#nN=^|+(4z^- z_g2075Tg`IL^(Jy=wmdhYaZ0?BowDt`+30 z^1-tN3g&d&`dnFP5hHP=1q=?jj5R9F7$}s@wTjhi zm00|giW1!}H5zvsiKApw?ZcA#FL38CL2894nGRbku`%zG`I3+JuuZxICC8XtyYC6p zNw+!F-l_~N<78mn0fiB9($YuHR*Wo+_m$-?0`2?6wux+v#x4Tz`u8)koAuexEr2%h z-3hZO;R!W6n~%Z`Ik7#a;(BMu(Q@=}RH<)u%`r{MiS@h9Y}*YRiI%cj;C zB2^Z9-cKL$JYS09AYN$fAsAl)+f{x<(w9udfP5^#uZ5%|3%8!xp8|y)=#&%E3cmZ< zp4>#zu&UZldqRFFdR|^w`MuO!9#<6VnOpu!9T7^2 zHc50{hr&W7ULh(8$O$aE{l$nNu=k(Tb~lcAH@LEz!=a2O)&ku0B|IwmM9)0dL^d3= zXzBRO>q)oo&SQvYh0wGAW!L*rcT=_N;=-@h(1ddPlpyPslxE6YF|U3}wLTtivEW%Z5* ze>jjAgzdP@%gtEJ93!XjT7U7iMTve_1PGcI$LTHXM2g8cJzkr=az4*Rzjd5HzEHYv z{~Qd@@Az~-=Dn-Gh>XfBVG?~N@7(vj{S0a|wCy|MZ)08jGY}vpHFp3OR}t0seLp$8 z_e=|$7SO(+! zempG{y{{=UrbHs;aKMluCm31b5wRG(C#Wa&i+H;5>p;sHbYW(|#v7Bvb1d_Iq}&6C~#Q3lOUq;U$T`fI40$s)6eQl$s}{? zD9VzZ-3B*Ia8=iiz0v~e_>LoZm7U{o`Jf>UR6PC}`X4kWB{F?73h*!Wo;c&RAEG(s zr4B-AU_nyFP-GPRQKfR;qRu#qtf2}rAe5$=y+p?Z)jX~buopX>IU6ngbV$`g-#O-Q38l;PX zcoVtA*okmGj`X#32%|}TazwBqG?CsdTy13!f^xyX%P8E9F{Iv#HXKj?US{xy+F0$! z5~~2{rze#Q+U(i%{AjXtMr;o2&n=ur6%s==_XKvFb)r!4^3{wRZk;;IR!Ep+7 z6m=m(deT9jZ*9S(Vd|RtW+pIarq8DG9>})_+TksAvl$~(0!t(p_mLiVQXx-%m;|b&a%c_JZagk%#@AQffd|I zfahM;XO;T{+vlkJLzE8W+oiC3+$7hsOul<*cZ~L3=AXe`FU_y+R>b>*vidKU_o>-$ z19pn0s@i+onZM5)*Uz);jwgN1^Lz!Tto=z}rr)^68-jZ}GteDSq-h(%E{&D*{Ypji zW!5{~d7h`dulx<;ZUd%h&{(@}CGUm3AJ42vVQok(2A_e?ueQ%fr=dRD(bpNyJ>&lP zb`Bm-%^kweR^AV+!zmRpl3ZBhdqu2{9SYYXUGCxnPKkFLiPVnM6WQ{Ar zZgOP5wjabU?L{7>DQRA3K#Zu=tea=WA~x;(;H_+yAjj+b8^!#;FpUMq7lj{><>Q{L zRY3FNlJAA5GbayQn(MZub64t*(U|E`;a}KF7oEN+*k-fZ_dB$&RL_sqZ=EgjC*m&< zvmcmDp2M7rXDwPBpT6EFp?PI0+okl7dhOM377D*Pw9xv$NwXt=r`Z%d^K35YeO_o@ zlH0|9XYb$CTB;|=?t;hRr&JJr4dnu-=c(SiPG;4N#h~_6t1rmjr@~L2HQpRwL7{z{ zg_>W`gl`Lz`v`3XM3gQ_0$IKOWF1NFLn3hmmHli*W->@2$qv}hcEwF$ni^!RZpRRM zF7F~%C=l+gr8kD>xk)10hwMJq($`VrKQ#325##Sn&{=U6PQl|I!oqDMnvY%x;# z`+e=ptfJLJ5STt>fL6Z?Pw3LBt8kWiut}N9kxDX+oPCa-MjHA1@z4IH>i-f;^(diT z>@zDE=IWAL-gnwMbwKY!Vj5xZ<_NLhobS+bPs7=^YE{^mQ3iXObme)%*L z4~CjCq2vzHQ82$0#gN5343=h5X2&W|k3p_q{co`GjKVWQn4%U#1acKN0D>dR3Iqe!#SEewFM8 zdsQrymnt{*)HN*k&d&PW^%MeeZ?ZZAI_r*o$UzAyiq$Tb3S9qO<2^2cdgE{jOpr9H zc;(W+&?o;BV$adhf$7qxEE7|>fD;i&_3jyMp zFrXbtaZ9o<4}*px+xW9#hGdK+f>3n?;j@?&*;?T)$Xav{w0k<992e|?Y7#ajtO6zE z_1p7#hfYVZvh;9G?IL!`+Ey)w!-IKsXC_2rDWnHWBO&_~?Z?M!m62HAd*vQD-2D}a zdB3Y63xv;O?$B&viW1>n1M>e*hm5raZ*5f`UTt zsV-07pRcAVDIvKj>NV)(eVfE*US>;Op5mwh;+}ci5VbqpQ*IIQ=i}juV+P4=tPpJ1 z^x^fmRArc|pB#=SE6;J6`?{Aoldm9Y!-J}L319~}!~BO($01@&g3yi}1}^+w_21U+ z0)}kYLKR>VS6ja^@&VLHzQOjDJQ(CHW5wIMJpEb+INP3v-Gu^&Vsi_Lb;J#ae3FRO z8;ZhVbUMEHrV?(XLYDcL!u#yK+ zHuOxyna}l@)-=H`sg&YT;h= z`n2HHv+Cxb`0u?4&oBxCy&TMAIle#sxaR-2X~GQxO0x7Yz`d+)mFWDJNtpB!GVV|e zutu0v*1VcH|00MHkXc@mp>DAXPn%XIJkR)Ax|YY`=u7`JEgdx(SQ_!C%IA<&*wK+H zVuu<(B$>G~re%+lP7p4Z_~BNR)T)lNd_>3jo5xkxwa_pEd%UV)8QLTaw?lu#;=L*{ zGmn?3ar%@ zm5YAEGkFoJf07f}n~nw#>niB$I8W0MNmWSrrkqOi3lpe@BDTL7=_a;>e^7ni{(?9s zq+jD~x>|&SY<8}Zrp}VGdMG_Qs1c(sd8IT4|7Wc|*A&H_Jw;hrpYLT8Df_7&=y{qX z=aw1Ot(Kg&W=|Sc@Wga7eD3vUnKt=6g;4~uu1mCnI8$M~DddT&fO7^QB1$W`;s8HG zBSn7i^TK!HKLx_D6Sf^y$`Cb~Iu#W1gZpprVD6&x=M7%li)Uj9jbWQ82gLgB)U6b>Rn&r?>m@JN!-SrLef<$4vfmEUnE-O zbPMTza63lWw%#=91|1eb&fY)NxQl+>pn#Ngr19lKSZg8885FexE+f6o+<7G50%MFt ze0R~RJKR{GHHGijgQ`6?cY(r55W>3wi1zuE@o8=y!kS1>Huo*?Lz|vw?zZ=5uY2q7 zLrG_>zc`1)>`$nQx@>kzxW{|Q7SS5L753FONUSI`!1>Wai{n zq-1AVO`~S zFy_4Uja)|kwj86MJIwal5^3Yh3vq+8t<2pX@p?K#7hJ{AIxA zDlP{6lv`L*C{4tnOwRn}ku{ihP0|BqkYv|#l2%V$0&=#s@z|9QcBG2S;4WH&rOh{B zVAPj1t0c&JXd3pM(xJP^jt)By7b>Yfx`^+lCRQ4~212!_P#P1RTBAOq!YK92${;T? zO@9|PKm4?dYB{y)NfLC0(Ru(P4RU3^xD%$@eTs=G>WWHoH<#s?0xaezbizRTt}vt* zQ%~s3*XVbvuneUaf;sjO3}p8}TB=!oZ~{@BcdVTOpN`?C8rA z@!;gl@nOPF@8>;3vVpCnyG{`MB;<*j=ePmSw#FYA;(^w#>gER>ukJ4pAOh>+7ZhH+ zZbkVO+MzfvgFO-5?i7;u8We#w_fP<^R3?^OtM_4fc?aXq$!{{@fB}1R^eq@#Un5Gu z*7+zD^lcAuP8~?ZAxuX=y~K1eJ}@H0pD{QF49i5!`>_*;+hdanBp|d90S)#t*Y3yO zhwsaHKyXMsaQWFXL8*Y%ZHL8K2aUff|YL|A4EOF^E~#Nm%4 z$(2=0t1ZmPwv4mB5Mvi%kO1nL=UH1{)tqp|1c(bg!ha7NBYSa0|-$D*>A(L_Lg}=E$<7?c+u2C zJBCWR06@an zvZ!#{=k~bLO!Dg=PZO+LwpK$p#N!63l^btWtPc5R*wV8fcZ&P0^dHNv=MgY2GoHg0 zy)|Z{c3*pPfeEVSJOU3ps=Xo}gE|DcyG&Tb&7n|~d1+Taw+o?39RHIrHqb@ywhYB3 z*7%$qQ*zvJ^X#>{k#_|z!;$#CUFblR>Anf8`n9b_^#i#+bna)i>oa9Ql*yP~b`cIfX{Tg69@&h)foaYqe5 z1n%AkMPA7~onj`2y+Up=7AzAn&+a)f9A-Qw!9Kn@u@_2@?mwUu<G8TRI(x~Pnh`d%%Zq0! zsBlhc(LaYJTtzNRhqYTfsJo$4P2%LeY8d*vzV{!uxdj=z#*D3eA%%qtLt+VkSkcr@ zj@(|}l)kGSJVxO_5%F54lu*>(&s`e|*7_ox=%l9(vklxgv!P>Mb|NO4{4D1VUd7ei z;DFLw3|%;;B(8g3Yy0hC_E3ofVA2p4vkL>lrNLSY!MpFSq0~x;LAgj!xcz1Vk>x?B zsFuWZY1F|Utfd_ffT?vZsBuZcz;hUuFTem2j@0H*vf2ZEV0;TP+qQU;_x-40TX^b@ z!qN{bY39M!8rUE_;CODN0^kU{6PA)gg;BF7O@vqo`hdB^y031Gb(bSZ1ts3HqJtWY zY;zm$6I_spMgF6IE;#PO#DypdZ)ndTM^4)6V zKOVd9m^fLQ{BcC_52DWtvXivYix2%ydwS+H=c_~z-LzB&#sp7kKB8ZkLm$!~f*gB( zSFFydAbk%tleC9IsK-lT?!Jg+LaXV(L)?c%#eGm5FYP9L-m#-weP08ziO{pjJ~J2S zA&Cf0!+ahBz;hM|sZ;W^^3#|kp!j2Yij0IqJc5(w4;(KgfAiDn<@F1f9OG|j?)C4< zHR9k^o02!3ac?j&j7zQ%{4Zpy59L&-4?ms`xsFao>}Zkpup8HQR>jP)JSwbZ!K%*b z@b>DuD-su&)4EPHU(sG0Q7uO5fi3`g+f4%mXu+LVBSNvg%n2hu)Sz0_m%!)AieL$K z2$kDOB*K+9FKkLnE&hn(N`J**G}@ME)SUic>$EIN$aVmW(ahQ6O5hpr>X%?h+W2LWW*hI$~}^&k=9S2yK2MY!jOr z&+DU*x+=>Bc7v>oRG)9u>9Ry$Xtol!Gq zosT}>9&qyHX=?tAZw++I@43c_xk4!@hS-idJ{W7p#sA=%FGYfr7j34}mOSc*>FTe~ z1(_NOgxhd#$$HU)SprO27_laR7Z2uR{Vfq9$oE6+zOlfKzAS`dl-TccGhp!&!5ssB zDP)&h4l-{I{O6VrcH+nZ%%^O+6nhq;f#%XucWUEi;-8NC5IQ~JPaeAIF+ivXg{FYh zoZ8Ro-+di@x$_;8$2lZq>5X;^#sFHbIR8;Ixu{`uqxVNe z(o7cSpHF2XC0E%;!@BNQi<3Idd?4gC%9;7ZCu-ErxQ#a(%}i=qhWfoCg2`dO&bd;U z*_2AKb8_u!t^qAlSAbx%KN!A>jBqtToF$2-hGb)BhmNV?u3IE~bJ}o;R|uCBu=+SS z97Oz@n3=1fp=3!;28(6$WeQ*Ii#3VGP023_+QD;Z+0kXa*nF1gDBfam(R4FZaNPER zbg`0oyqrxAuiBc}%}D~>QOTCtB%H#o7T$(n(xmaX4Y{_jlf`kFT<9|cD?DT%Vu^$c z?;eI91V%=JZ{JSc{zX;z4>~ED9rBN!`N4}ZpglkH)BQ;H^YZxss|WqKlgj3w_cHdW z>rRS&;m$PSPaUhl{r#B-_wza08}V`pyURDGp4f=%vlrQQoX)GZ&JJIztU!cuDTwfg zh@P@h)Isd1v*rBFNy4|jzP|I^?EAwS@0xs-R+I)`O53-tH{ttozD*-0UEN=VGJEeE zT?JNKTFp4E-9lK6g6c)&q}cnv?-VQ%Dq3@k#*YwZGQWRWu1beUIn|4YVOtN*=UMN2 z#T`(}$oV?LcUxh?*T?mHh+j_zWtl)JKAx++)AY?r<7OMl-gk-rZaHgk_S1ttvcA{h zw|J`t4rJE$?LfP`&^FF_{Fo=gwU5l6 zT!x<3Y!u))n*f+2hQ3!l*fujwwV!_e7blaASg9O4770gmN5o$YflOr;<4X*A3A)6e z%Ns()?;1-37u4{q%+V7p#~MTI_t?HI(DoJ!J!k_;-TZ~u774vOAV`PN z_0Ms=F}}Foh~B@wj#Sf+@_Ub8estMi>?k)f_(kRAOW+A_KG6H2BXLo<-b_6*!2&tf zJpRu^gC~X-5F--60c%HCf~e_fq&`3;K>?O~V`+*><1#u7wS!2qScK)CZ@|-P_KWMi zfAn(|nAUt*96z|ZWB2o>@SCr%OPusVlXf!T7kn43;uk>FcBUSv#|&`?1WO>n`L|}4t5t~ zu`XaBfQx1rZ4j;Evt7OO^+zPiU)CzFTNfe$aJ@S;KV)()>@b~ijrn1EV+`Nm)$>es z1;|OTrt|rK)Bpowd6PWakZ!1DDLJu>*;i29!{5bAB9q33Qe%4>Q;F!m>81^_9q(Dl zw7@iAY#yo$>8~?U{aIQpJ32974%Ns*49w8(i;mt-O#XsUJu)nua$-T>4Kn{0 zfP765 zM4v3H6-Up5CtztVJ!qSk2!aBP>AODo zj+%BKuOoY!^hY-+_L^4^)NOnZZZq`urf@~Qfz)>xZUu54YgORj0~z7N!{ze+zZXDx zM_@Z12m$te^2w0u_&zcD42fffpd9(^13RTLAn9GA793{}Sw%txgsL$W7@xB7P zd;&!d*s}GdX!>aQZ7_7Z-V9o;_-|^lB)6_${C=NbH0iPbfIIi;Kx=G}DuCymc=+;g zL|8^ERBz~V{v)ZiL_Zdw&HIU>^h@GOOT`Pr66=_v>UZrC%71$*e+dip#G&0lcvZOz zfihr_aoK3jOTO^y>^YL~&0XJ#(iQS`l6wWuue(3>?^>F;Q-MV$KikKRr`{`DPoeR5 z^DT{bt|9!ver7%N&F$>_fLnxnSHPxqAZWo0MVuE6IAywI8Pt#0_3U=v^Y$2Q`bPFPzihAb>D>7hs4@0&w&(l+xj-I+2{QT^;SrP!W17e ziD0j!Z}7Zr66%2(z3ZcWf&}%_*Gi_T5QhTi4?~1`P{HXWe6cMI5PBQ(t^y!oc@F9< zP+af9QADN;GKSpAs_Q{+$>)qt^Sg%;&cgDk=7BWK~LWN<%fkTuHg^%<56Tmz$h z4ptNY>S~QPQt_eC0!vZM&|KV>1C#UWL;mZM$$S8Uf<(97f)G+HE7s$Hjg-wvuj~+e zotkJ?D322X)MccLJF6L7I!_%m1l$MA6zr`?2t_j5AGj?HSoU&@q2^kTKH?(nk$j#w ziK;4#zCaRlaY@~h95>Zdh>MLB3uF*VPB0n=(vH`LCHax>2S?ykLoAi4s8Xv4dp7e< z#dJ{8mSAdhZ>ZCtVUHg|($|d~e0HonmDzs}*Z=FbwlA7f?3g=Iz^{0PR{fPzLwm|c zyWAGg^l8#JyHGJC*gKLJ`)2?0EjVUrRews$2DFy!Ok1w?3&yHOQ?aHomj zgfSp96W4n|1E@as#K{xGw_-#&it)O=2ra6F9%c~Zp!Q?M3oUF_3fS(Sq6h}PcxbA= z*fSVh&El>M)BDwnI7!v_)fA)9as3p_qbMaJ4ZiCg*;0Dki1De1Y`T*HS{PLU_GS9! zz-rQxD}EBP!p^tOy%*)lgRja-{;~d@MDnyT%jVD$7S9_AR>?hW~WB5OKpX? zrpb0X0CC7N+LUG}&K09*(+8M$BhS2Stp|`Nyw6phJ(4s^n-j8w9tv65X2c++a_Ml8jGM+!^-#+p}RWOYT9`-(?Ps4_n6 zM+&7RJrU!FJgXnPQ!iqU&6QrRc}h0@c0TB(seG*D-$Ta4^0EK?a?rICRR> zp!7{HoCWHUR>UsRQZxsf9q!T$0@xWpkfp!>Bo!|U!)q%KK#XLFf2S1^l~;OjCg4Tu ztXYv~OH~;}r^@y7zY9_(;00zTVfbN0TWWH*tGM}}S8P4Z48fAket;o%rwO`2pZUQM z`vpizVTC|WD008@dF)O3pB?l9R~Zqy9c)8l+$37VY~aO53O}v3S7z|il?EOZA1uhQ zXx-x(eE-9CzBZXbX4O?Z%F$OFX097w7?6Q4$f-k%zIK6f7GnFtHaY=RY$PY!04dJ` z=|E%ixuD(+I#F7{$$}VFPbqM!0`fLD#1T6I&DKiof+9sO4`A8U8`<`~*S+h)Ie}C; zqN}lHE)+WoW+#?k%skw(;PI11q7+1P=hFu?82C+%*tAHa^kPlP*BY!%% zx227Y{c_o3K?f?ZIo(voQ{krVc6&gK+PsSEXc#zMoVriVq+kysGT%2XKm=-Qur!3x=4JzD zLeqWB*7h>r71i?@|C6Y?En`vgsdjv!{Uo7_6`_bp&My+ot+7?#LKzxDNl(O5A%{)P zFpD|v+t7*@7L=!+Ty4S-`E!-Q7&Jmi#GV=p!0sh zjgN(@hrz7ogf#eIqs$y;Stq#wk{D;J-5KjVWZvcC4`enNY>K{!5ml%6R7x| zr$Y2+bXqbapiZ(Z)gitjHXGw9`QM}KM~vZY%h{`I9QA>LKfXShobZ|7oSkUVqd)P& zA=37Vq_3nCYb+@rYpViuK*MfHn^DVhD@n!itm$zoa=-r{S??HLSyvBc=Gj%qRv zvRT55k}Pt)q_(#_s!Po=Ivv*(owbZB{z+!($Nu#P8&)KY^}dzw2(1z=?II>~Wxh6~ zOCo9>W>Idqs-@?M`PhZ->{J7B`rN{!R>v_(-R69}R;l%e!e3&KS^0BbZ~R*oLup%L znt9*<3laPRtMt(-H#urtJ=AMgdB4Z=@6sh zx3nntPMtKDO&%*X$CXtIXmp{fl2=!LOe#FXvEI`=PM$L@x?rkX_4e8Lzi~03G&Hy; zi@D%;rAk(gRw-dmHe=`2om#6E!jk2mb6yQSv0b(ZR?unIy*P^pi<*(Xw2QT1=@nEF zl4*=sHuz$k`u8=fHs$9jgcZm4MfN44WH++pjyzdv{}`Lx79;-eH22qFzvKdpXT$uM z1D&{=B-r`)W4)Q06|*vWsn_Vf+yZgmiH^48A&&lUYW}b&9OxxYYFl^(cEs}94Kqk~ zXr8=$#lwXW=f(3&Yri)NjV_mCyD;o<)g%qH&z7^AsvmE!Ru(Sz@D|NX`2RcVL#EP+`fYyGfAyLk zdE6`g|C?I+K#~6AqdK&eunrEmOpk7@4YyeXP*E^Uz5D=_V1iKQ@>Y@MV||s%p+w%F z`tRyh>BtET1q7m~s0<$AL8RSK&f_dpE zAwQpa4H#LY=QF?a+x#@;yq^_ccseLaq|mj%esS%ZUa`_E|9{W&n@S4jugZk~fXqG* zTH8(qdZN=S(cisnQL4l^{LEga6P$@j;Bz6`Y|IvFCkiBVJT>zS#%R{FosDTEwJTFJ z=AzdQd>?&`w5?>gro3PHjF&={IX?w5FeN7&0;Xn?Ex$=kbx!yCc&5c2f1N4=l+hvq zpVq+x|5q;>Ope92xO(Ioeh5nZTN?Rca}rdvzE-OhE#={xQ{#8Wi^$A5ey3%nbr27& z7qhIXd&V`d`RpoSz5;-q=`y0sfFjuvjZl?KEfqWP^kJ#FySVakxu?deY;gAM{o==bkSox43CBiq%f9fy7@a!f$wSJy zxw_>2Q))fiRVmPDgIn-B$^S+SK|W*y&C6#yX9n#tfg9C)xPX=>r^FGf<%f}ds!?4H z`h4%s$x0h1SfsIgHaQ{`1IF;G*2YPv6kdBO9iGg&Mf-O}{x3*P3hxYUp1}!ChAs$L zTJ=vdUcOp?P{sp>uiV8ZDrTQ;ngO6!gWb1BMe{sN-gC|ZXGv7bt!a;CqKc9S9lZR+ zMsUW7y%$;K%JE|)<219^hSmXDpDI3XWy6Ds^80K%@5g8JBQeN>c&szT*JZ&M7Cx8^ z{$X2#E?T2Cy5^7R*j$v6{n+2fWC8xhlpes3J-}SRHFewml@3dE%mIe{)tN>GQ*`g+ zHX2yJP^=mKy$y!cKbs$A(7FTUE4PA{b^Wzjenoi>${$2_eDp$jn^-0q$Hew3R$w=yF zfv|IEnF1|a`G@e(fS*ZgT#vra&!ryM!4qz1kLggCjwkFX@Qt;#qA}0llG(rEye57f-FWH)x zKNhD`HK>8W=#Os>YnAkFLWQ-c5Pwx_M+-N_GzEy78dpDpR zIYKE75QuRtJW!H~O=MSi^#-g$34b$C#v&CR@@qa+h$_rgZ1<#0mcGlvQIb_I7zE3U z+o^ZPj}i6}Mulpct1uvgNy{saOp6f8Gj=!X$9d}H69IffRX1}D!4e`Ag0iV5GOVrL8$DmH+l>>}8&x>)(Ph1NXYp^>Q} z-;Spd(#TkQ`BTt!Jt9kRG+7pVsX=BuQh$o^ZpPG+ z11CZZJeoXUPVuqtA#+#n;6I-zdvAd8@r${PSOi>B1|S};pFDSsX8OXaACXzIi&!hh zP-Wx!N6+pqBKGEdq^@rQ95IS0EL4MaIf zD2bIdRzX=;5G@UakSU|!8jnk6OygGn4GN696PrYiUpX|?B`P!pBGhi&B2+Okb0R>a zeCG<8oW~1O7Xo*_YZGj8I7g8n&os3^#yXbORpkAKh9@f#D#mm&R5J>EyCBNqt2e}! zdV9NnpgOFoC`f;3W0^OHeU{fk)`4&t7zxHZw*)(|AEbq0{9;@kRo!Pg#O71 zXg~DmW5dc!8c1@?cL?*_=6yySPOLw%ZO>|nz{U?vsL(;h+ZDi8Z-IW_w6{eR&w2;! zev#7mk&nOX#gawQA!0ExL{>0nZH#icdS{y+k8SpE+02*9HXW|Lw6vCDRIak9N?;Ax zt0;x1LMT`{W_J5&ku#@SkIDo|n}~TuSy>Mn9~*@j(i7;ZqB0Z?Q2`1NhfQ}Z;1x#1 zjEoAnmJ`x!;xJcyfRrJOAa**eSX*!->e%b=`j3<0X*G=)`DJG9c+p{Y43pH9=*oAq z{TMUQWqfp(I!9aK%L}$kMw^dAJp#Hd#=yRPmxldcjVZTVPTPzX*?RNNZa#`caz$eI z`Ytx;sSi)C)ITPVQz~;J|pwYNQ=Mq8mw@!?)mxyCt$OA+HCdQ3HOohiHB8(drf`1L z&V|$eFlNQ)qPuk-X=|GWGf-H@FNvFz@Sd zagnj8+PUWf9p5dVl+?3qL#?!?k~VV|h>HeVLMUHaahJyu7!c;M+3zu5F=wX53S6h; zVGK3w{n&-W1@V*fvMgS(tCt!u?pw$3e^ZQs|1Sgnrh#=gdB9M#`}!`4?E6spqM7?m z^?E4gdofsAtS1B>q$B8*M2o+r)%XNI42oHQYfimSmF!B%@U*B*p#7eTJV{japi;56 z$Q@OK*F*y5Zi(QUd5pr2sFWzGLtgjYrD;0f9P9ZEIohh?kTv{ko{@ym;`w?HfqeZ`7yd8(TnLa z&eEo82(vC+CAvBhf0v%FV!0YqAXdp`5~V|3@@}+k9ObIZz<+E%NNEbK{V~aM8k!OJ ztusRHSB1Rfo(#|Wt{YLu8=%4b3@MA-GFEx*#ozZ}0{Q&yc#2x=nU#lA9ih2N1MM8> z`7B{%u%X}8Fdr4TR!e+6ir}%xS#spLi-8!If#_7v&39o#Mf^R_wfHpkR}ra<82wjW z)Ry?L6IKXpD#+tj=ykVW@xj)##h=r zUoJvUQ3IA?cXtu;p~Drv+I@#wEC0SnK0)puVWwEa)n%+kM{T zT;_W=Ar)icAOGBCr9InQ+S;d*mJ~t05$=0gjCU+hM0Dd5Nln3G!sJe9eJ>&zWPAQT zNS6N3(>Y_-MEM^!Ya}TowY+8{_^ggJOxPU8#^~o|W_?1nqWe=|yd2vR{_Dwgq|EgS zv>s0WsUUfqWbC>L!S8giPl`&_4DWPc)V@kA2XeWcxJ##G1B@Kf>7l;wD zY0jSsCQL4GD%r=h>vTkw`2_2rZXWPG1&vhX5iy8IiAvQY{FcFYaSFt3^2CCuzqvA& zay)d4I~<84H0vUK(%D)uuW3E{AC;K10oWn3ep!Fp?iRO2OOVeYVAR-4j}0CfuQ7;V z|6_*UC~No#$7}-q30lRm`@wH%Kz?Q^-kseGslXlBtQ9=EyI18e!o?o|YA}k3JSM3M zIP1G@nKp~@sL4bZTevd;ccJ_coE%0iRFam)#%b`TA11a~ zwNakLO~4?s3es{YM+Bb1xAZj(n4s5C#QPC`5M>$iP>#n_--%XKzuhmZCDh*wjj~jWdg^Zyi@Wy}dcZ3$gn{zL> z#82(8DQ%^)rzjA=U|*wZxpF~0E#ke1%rWOX;f=IZpd?F5L2`bdq0QwnD92q9#7c_00FIxzeJ-hd|Kqy=Pz?SNsn~@jy6&p6 zOJL*W6A4Csy=n$NgP13#GP;Hco_8LFsno|-#=mhAge(5}TdwuI>twX(im#&br^&b} zwu+vZJO8&BkmW*syXiA=Cl#QO=w@PRpqI&N5%vyk<_PWe$=p6QXXt16gNWCh%P_zO zxAOu3M$V3j@^=q^9pIBF-_r?5k1s%zOPCKG`c;if%63QIeNpKN^&J95r4wzqEs`X2 zy^4ltM??<}kNh1&1E7$)+~(WwfuT%QT2}`-$(s2@+nE<*hPw)n*WY_XTs&!kWbsuw zS8mY$zN9+VizQ5Rge~WeA?R+a4Hui0Pf6J3kS2~OX%?5a;yR|-cVTF^M)JpYb2Ov6LYi5BBPEZJjy(g50Ul)>( z;oqn0kGAcyjjMvWLIQ9qo!P|jJ^ivk$Os}EnKPYai zd$%#G8F+!ljk6W66U;!l9}Tz}rdSYMr_y;Z!s1<^^P-q^TiZOaHxf(^xRCjZGiZtX z1$$UFeF(12Pcyw!VU)#fup==u$^~UyJx`T*4Fi%?D6Y=T{hs{77;!zW0F8len+in;j#rf)e#}2wZ#$`yzqWKv6%R_gkP*np45kXwG6gwl6tca7fD~; zPubtaF|=z|C1bNfe|*Jp3nDP!xYtHBUqxB##@>wo{#-nKw?}^4FG~#Q6))l>j$Ms@ z8NO7COZlNrc&$Qb{6-@eLse0%V|Ng;ke2LIzzxPV-bgJv;1@J{IQ zmN&3AwJtfWq;TJB>N`xX;d|WCs+1a8Jx2{}U#uN&7TUL{jeKsXzU6VRuRtwo;T{=$xU%V8d8^%F0wMh4fx{;tqz`*)hnOWX>b* zi~Cb4MX_Bmwz*v$UBqcUbnRZc}D$lH#414WdSla+pa~?Y)z|dKbY-^9E){V5+@304!LsYum_{ z-{dtDhR^>es00CSHjW20`|$rwc!~e$;Mec>v@13EVCvj ze%oqtZi=mDx{An8N1AicXGJWJ%^2Mv5dIWw-zGz4(q|D4bgk<-JX%lAz|57rhU^@# z83o5KYgi$toW)CMVh_eIs5A&76o^v|GL03B@u}8ik5g8KAI;qiK8S&1z&kC75eY6X zr^bz-bU4-6C}zTIkg;vl82Gq{U{@Bt32{{UTd*jp;8ZpRzgWp#j8^BbP>j}y5M|tr z#3_cAk_sj{88UJ6R}ySEY?f4;=op%ky#qjJA~U=c%z*)HmR$k4taW8HHjS|fGU2S{ZKs8zu@IA!Xq3l8% zF_#JI`oCwA$|K^svVHb^9ojU@8n4m0VW7`x7qf$B#ZB|aB6SWkvCEaIQthh4m+COX zcjMhvDh^>p!^gNtn_uc4zS7{+k%dooZ|6%Ac~+;kO*qG-$|_$sqYDy;5o-k*v>qE! zB=`J1Zkz)e`Sfb&NlSH$vQDeK!8L4S#psI2J2u41J5@#KtYnIy7YOK#Z_R!t+DE8P z=#X8@y6MjLs|my(nA9+3t>* zTj!EB>}A5D9%RLLOe_FEBn>+YtwEz6Bd?@I*U<@UZ+niZd7CW#&~1NDTo&tO1Cymx z;m?kluyZlY$2vHWQ=*W+b!+la_O()OZ)s_rsA{eoJ%52)9$o254)&v;oJpyjhB}j% z;SuQaEUJH~XW?Dhi1s~(TjmnL%0a!#*tDEk*r(U!0RMUCX~?Ocztx~=sMD=ZlTf$V zQe;}TNI~d8DeQec3|MKt+=b6~xLlybfV3CjNctcT$82)u6JuAxpO~A);VV%9NyI`e zcJ=a&|8|V6S&c`rad1)(#2g+B6w-;$S$y-0%@HUAdbE4|7{_;-&NL&Ni?9IsA(W01 z1_Q}`-+pth$F$Lyt9{SgW%Xk-w>TWn{-$q!y&Xaa#`@-E_X3)3Y^#^LMZ7cKF@~aT z_5eqKCY$<|2D`0Dva_b#(RxjEUW&I~Ay$aq^J7Fw5BEJ#54v!b|debELZB$2QTS}V=6I-8AH{8zG9q3Y(Bs8~!U;->0;XFL)B-)z;JDmqsMyL+}+h=D`7c_65~6jp%i~ zTRudo;nEHdRnF4HszNTAt(pEN-CC331}~?(eQ&zRvPy#iXHE7RJ3Et-rP)I&w^E^* z;G3p_{?Y<9E|aN@)qK&JpSUb+2Y4~HZAph_M-a29Jybb zQma6e$J+&?rOLY@*VfW4f3R+~3d&r;8Q*xa47$-vonW0Dal@^?NU2W7s1g;NC4ek23r&mbIg4fQzmJ@1x1c-5ys>jCy#DtGY2wtX5s0g|_u~s7 zB3Y00F^Y@~yu?ae7(5F%{+o{4uiOM3z&WRUj1CNBZrWXu0f2NPRqw{y<}gni3X+rw ztT@9Cu;Qvk^1V|@=pmlxiRy!V`nLb(Zl}s@jPOVyvG@(70ZD2NMPUIQ=DNRps?+*Y zQ&boz>qHZ(0iy)iCQp~#{Y8;%IbR2 zII;Zh8&8^2!Bdyfj23NFHNUz}pM!dl5f+#7#&F$b8UOa~89+g+RFL*<6J`9{65(49 zkV0dTDT`ZODnk?x*pPSlH$~k8p-?b$?Jo9JWAL?;ImdkXqZhI$u2elrgwJZ3r&5iM zP>lP$sfUW~ubqE~r-&&z>tg|crRK+VDkifP#S_Z`IVwV2PWfCieaZQJ#<~v@)p-R( z8S-S2f8}{nYmEl42lq^x41y)7n5b;`KXO1xwM%K6O2% zf{xwqo#{Ia-%Ex^k#3XiKg;Kbc9H>1p;nNlqhtEAhK495T1x(`(1iTKH+Zvn&!_e+PA7NI3#rNu1@M>F}6>`;s_ zXl@55vd@1}Nz#U;<9G8YMoXvZvgtLSRft02_jDGasv9NB_wwwCgq4WlU29g%r*KcdWRWIc|w0i#!yn=m@+NNL>IxMM%oqZJC34^ z;%|2zD)-Z!YuAOD(!sX;vRJ&IP*aJe41QiJaae$0D)ldXx}SJ=`JddGGf_tmuW>-@ z3=`v%pmJFj??bUzP)xuvVy@4+dh?JQWLyP(L4f|RXIpRN1GluJ&3=EmkCQgSvg+k0 z=<(su>&?J_qMeuf1!+4%?V{VyUC)$ff07vEc@(l}VrY~#2f2s|_cOuVG!uSzaE=G@bT{j|m*e ztb`hl_d;q=hh=+M6beUfH0P4&RM!*gompi;43DtDy?B1hF9@ zHHW)8`IJYXT^j0{z#fyfWTu9BD1j~+zoPw#f`ykOeekWq8nkZmPdP#yh-*n!M-oT= z#)eysar|Y5>U~NH6{E+DJq=%smucBSdP@9UY>IRL6_mgsoaRX+U7F?UNOXEeI=Ih_ zo?>Xo%{JR+drVpHeL(w75QIF&FoqAmOt^@=Lq6n&R3oBDRc=p8H2cF-93Ea$lP`vb z7*S*knX&Q$DpIR7JsUJ@4zqnP7QFQXU7DYlM2B|Au8qB%73MW9UG(Xz0&{7cS+Y@| z4(b!c2tgX#ubHc(5fMBXb=;4=EIB11%(W>kK>F@AVwwX&f{!TpC?Fw@cybko!sGvl z1LY3Da1FUmsCE}y2WC}Sz9VPQTjpEN2V=j^y`7Lx*_OHQro!81_n(7g*W>I;A=03o zx*e04^0+DMf->t#l!SgpQ0yV!x%dQIh3BHMe5>m##)yu}fzf0tP2Y915e4?Vca6wV zo(E754XU%jR-~RlBS6VpnvUQV)s@KW&6c&7W^z?4eLR(K9)wRUvB)%vycztxJ{f|? z>F6TUC`Hs*?D0HhKK^Qtaf+*NR9d-J#_c?exG@XX?d9j&^Xma>1`GaTM^W;wB4T|C z2^=LQv1w{O7aEU{YR73UOiM;Kx~S+6E3JBEMn8Ei=Q0nhsj$a3c^3MC%RKHcT?h2;<`8M z6Q$1#>L#*PS4m;qA#I`5psZ?~p!pT6lYOm>d?3sGpO6?Wd>0*c^Pn~W)O_FU54dA^ zolIjphzLNaYd13$ru(9g2&*+L2l)v-vJ`P*zDlVY3iVvoKyh%;;kS5+wyfZ9*upw( z5x3+phvI*903y5te4GPgNVba3)Gnu-OFiyKVM`o9+6XbW4e2taU@>p)b}I5n+V1W$ z+-oJ$G^AmaLUyd>pI|36sOv@ch}g(I5g`vOi*J3%hb4!TM2EnLh-nT4=*)Ydr6yRl zwS%*>#9c9-l01xNPay`%Auw1q9-llP0T_^>C+l*N*;DF>Z_>>cJ}9r}>poOn)eX6c zK99X_ZNoAuYiQXP9|CyF0=nc~46cm|Lb~4xMw-2umwboc6YbR zMY#zSYDx`;a{F91PGbA>rg4^zZAc(3o&Ym<7ylastw%yJ&i;i@SfRvM&?BMoXoNxH zDp{nvl{jT!7?f-M{?>_oyUVl9vNXErzFJ%8530{O)Lt7_Xny-!!sw2DX-Ze|{Kik# zl2C)9Bn4uyT3T;zvfq;OMtW@_^|MTyw#Q@Una!pMbUmKAfmSVoAUw}wFE=DHY*a$w z%1cJb9aI__7coInu-@su*V=M4F`?@r6^_}H=;SQo>Lg6($Ax&)ksx^NaBAaeK9q_as zm+seMFsSY~3x*>mT!hW5pFgA+UeGR9vT{_MdW-=5Df_ zq?lbdVm6tcvy?fUUR3F2Kv##tKVEcwdD~8;>5|Q(`#N(mUNg*#<9ViaJTU(_gLvSB zYtdop$5jAa&lju=xCEoi6G--)#tC?=7GfdEB8vDMj`Sco)xiqyQRT!pwm$11K0Za48 zXJ~5*tW=nBY<>oy3115fc)Y|8a6ea%)F^HqXq3aRuc$0j-Kn&p3R5<~$VsJR0r`l7k-BukTjM*K5{P8l5!_bhWY7qx$#u84ojF}NU`vgZHqT$EGa&Cz{{{5(79!yR*G=QkBPIL9*UyhR3ksr@^_#Be z<^xKjPasiH${-JG9`y(`@OE^_V4j$1AF$sayXrK*r-N2PcAKYQScT7!F&xHETmu9D)wK2r{%%78*nz9NntV7Fy{jh`g)fIEL0B^ zlneuou{PR1H-T6~*qdFS&)F0tL3r|;X%?RaQLcd{q+#i)dvi;^V_NzC%*%9Nw74kx zV;O)Fsm6v6D&R2d2)%jGLHXN!C|6)G4$#VrjSHN0PtqAmM<0AFF;V)|t@QNCX1yzb z@YYxsJYRm10VQhWo-R#HW3Q4L{7F+=n{I#f_aM9lIPP{?FXkDP&Tejy8go`&B1`S0 zb^?R4__}wp2Bq1Cbr<}5giq_-gaBR5UbVBBaPqq04!Tw#m0(=FW;a`2uhBEt)oW*KO6dws(zr`?$4WAFfDk_LSRitE!(Si%Bh+0L9qd^(^|2*`409q~vfw&2E00w2nprdad8 zUozsriR@CsVm|nfDUbUKJ!11BLkA%nfFIl7^oL0QYu!XO6+1zNMWo;vtlE7_^nl_d zG3?a)*qahgMeas@j)pFGQ+6{%QK}jbsd%2*JZ$TK-&tJtN!KOt@);@U{qVS5yRB>b zv{v7EVY(REt^$LP;HceLcSaj(L~a4=beX)5GzIDt2D}U*-li)D7zQ-^De8?tY;GXz z_G2E6?9La2>>2<=#-k%Wpu9g$uRje8x0`5-bwKi&DQQ6^z4jgudT`Q(0?($TwTL7} zy`pU-03u0&P+Gk-zhkq&>WWCTw}A=F+w1=4GCy<_>A<(OscIc#K4yHap~2mPz(e0N zvUnS$QVXSho%O&{S;IeI;x)KQjID{;vA%`29)} zF;RvViY_h{Ac!@#UKBVh2HVD@Z}THB!0d3}gu2qTHcEHwFXWKElm=7C0Iqkqx*P_z zck1-dg_Vh;TpeXilD^QYR0m1FTMT83kEqjuP4~0$f-RCDRQyX|)F7C5PHr1xon%kO zNHkuWrZe3MkqSye<(>hNJ0;a4vq3WlgbhEzPjVa!fai(T;BXo+(fGnj-GtNHIWs-( zxx>gBBZ;13RV+fSpE*H*T6AR#jWAA9BuH89Er8sy{#LIE3}BlCB|jhyL8m~mIzkV3 z%I&yIfgYb-YwoD7mm9%iNF_s!+4*QlI>7*ZLpmh}!f||J%nnoxm^tFo!YSAP4$tiY z&Q*b5x|Oagu=RX9uj81v3++ANp7=U zipt#M*jGk`E?j@zwfx zA$)wivq?mxo;e67(8)_Bpq6t~GWQJ|;a%&63*Z<6LcF|uUkKPwk9%&Q!iPLhhk(2P z6D$G@iH=p$DRm!^=&UMJL>Y##6plx@kW+OI{Ts25NR#kLs_nQ#*{}Pa+|%JwArRJw zdRIg8PpS52vWrLATKxh=YuV^zs6NB!;=bTe`j+%Txi_Y!%OPcNB;286Z_w~P(GI@v z-xNvqQK)!kp>+da9#U?Etqw9O3o*LtfyOuuD13Nsv~Vm!gd4J4vzeJ>Z@fu@paq0N z!d0Y|eW~+m9&A)eZ0d2&HAn`gZy`HrO58|5|E-9!7r@ODM-iC5o@f2vBK1!FrIzEB_7<19{zM+^DoNBaH{vdAfGe!TSaW^Z}^ex4MNZRMo7)fc528$Vq z$v+xmPPE~&B1J8~be@zVsFnSdgh5y(ewHgnK6=*+eFyA=k_F7oR~cfT5AuT_WBurL zfSWCmPin$0!QP>S7!pC;umm}rKWHXembY&N-~A(!JH-;PNLCq6@JeMDD9QPU^ndtq|1XUXhZ`;IU2bZ`UWX8l>AH()d~3ZwHJI+}b*Sh4b{O}ddL3uRa7f%fr#=8xFAlh+dEb$Q%76#^vCBE4dQe!Uh1-V|N{oTnp-64`28 zQhPo|v$g}wgypq29*Kl0xO$JPaF7h*KBs)IQg`}Vr1HINYI=_A!}|8f>Ae3oYRp}@ zn`TB$0NN$jm?;JN?q+%KDAS08IAs`Yv-KblQQI29EjOGxZPM$vHz5SBIIY-rAT387 z2LCDT!0d|rxie99J~?1eWC>b-CJm-Njc1w}%KsG831eF}(VwV|vLtHp);H!dgA3HU zT%-K`IZ|Bdh8Vd^0hKwj@ zt1xi6IS*IB0z@K7*+EhSc)fb2o_|uxG3)tfwfG%Z2)Tm2Vy=(eF!Z z>Z!6;^p)N^L`xmgrqxR|+V7xQ8bNu7tRR)gP&3q$`}&vl)dg#LR05sw|JDLPuYrHK z5@g7Yf(#GyA}<}v(l9S^%ugTMSQnJVkk@{M@+fYQ3CcW6B15hs--yiCzSbp;H-&i zoL!T#HX}qJ69sngD$Nk~!C^-**f%@6C`(`DD4H(X|5_$M?NrD&L2fsak8)HZ0AgeR zR(UM2)dn(yh=J(XJfKjdx<-@_o;Z_B=>~30mJI#mO|F908fUR1*_5VJ$TlvNwt{BN zZhSyf65U{^g2hY7sMpG~G`us;>`<`%51F)5+j#u@V89F9JQ-??i7cAe8c&c>7^LX= zV-S6dPRDy!)jJmAwB7Lb`c>j^!`_>K4wJD3j>-9U$s)WRB+RV`R=fbxohR*V#pgOF zt4-fKC-TtY7SHTSg-*k>^c>gJETt;u2emVsE(Fl&dRM*4bxH`4uhtO7_F?l#3JWnQc-RZD?J5d#gKYSJAy3Y-0z}Y+avl#c97}|kQ z#_kDj&ZD6ZUk*e|>vw7e8)$7J0-jyIp}_f5*ev$08_0j_OYWj;f$kO+BN(-p?`$RH zrw})cWZ;Vrp(B+$2?3{@MF#}L(*{NHD4EE(=OF&QlKANk(T14zZwRUf(c_<3!`Xo0 zzj~@ah=-rS-7zftITQBcJdBGKn2*uBWC8SVzmFKVW5tV{~ ze71CW61q6Bp#==~c>>7q$qVpFFGR-95gNAV<;kL9`q}xfLmYPBJQ~||SbuyM0WL(< z!C6zDXigz(m?))!WRcl&U<(-pRl+^rew#7v8lhV}E9~YgF|AXq?)sNRp(MP-pGFIK z%`)TlSgR!jI!yfFWpr4~UZ6SV;G(&l&^i@4>zu_&y!yx3m;zfH{I5a1m1Vik^53+| zBwQi}n7k03z*XvYl0^QJbCekkJ-`w7eVkH~GkKeytWp}AVt`cITa&7g4jbvut>`6S z$t#IqQIbSuVJN285gSP_2jMk{THX1tW3dESzUq3>0XQP;w{3bg5qYxYX`IAQA0$Sw zQ#|#AEGYF8&SFHfMo!C7TWy?CN1Tl$=!(|GD!(i7?s3Y8-abq@()QPzUSmWZNIGgK z=VvpSP1B8~sbCdDOOfAOxYt9KHqyNgc>J}8weI(Mkd7bRiI|o(iHmVq+w1X#j>Dv@ zVFv+&DrU)5BB!vD<{JcUCy#*1!5Taz%P$HaGB$atwGn zJcfvTu4pc8aRXYTOrpolo<`ON!p#wjbut~IqsbAoWpiZAKaU0tWLUxEG*~_=@nY)L z9aSG@e2kIGLi>RUyu32|ybP#R9d};djee6FXeR%5kVI@j7HRnneZaLT(tJlGjk3PTh1%trdmPVU2yf!4*jr3vI%aU!I z-Uj#db;m~2eW9IXG6?r1RC{eeuEX`s=FBAl{6RuZbbZ&C#8RZy@1Y4@x-WW*o@00V zri#=k*|EYV?>edx?5+rH+|I{2>g43l&zL_PR-?|_$!yu=BmFl<{VB&hj_Pa84geqY zq82*kZMR1;kESY!QELQm(V&xz1!NQ0 zU~?EK7Pup})u+qXIR1)ZaBy@-`&Xz`M8PQSTUVek=J3Mq+bX?UpkaiHMyB0#> zKoP9^JRLlZd5(qD{!;LCv_kY_FpAk2_q}>|Pw~RTq(Cf0dL%+>m`xj&Dbjd{NH4Dg z+n!NDygyj!i?*!Jh1i9JPhhpx5UEA=Vf7@PWx$ebh;L!`uW=R`DQc7=>Zx3~E;%B6 zUXqX!wu&oFB2r8KZqU*A407(>Fk}<@ADX9J(Fn@+8HbK9FToTr@##cZe$j{SA#`2+n4-)PFPtFXtBFYKxLl+?wFF zARVC&IO+U<#upyqg9Gd~sfw27>Mo%n6oQfniz*`0%qsH~K>x8qzayh^I|RyUPLI>b z@Gyu!oKOBzR^`2Z$~Orf7~vqMqBoAn%xnxe_GLCSroTv z@5YC1@OK@4`hmU&c=KuGa(2!JD#fV)N}WkjOspchQSwuvRq#~Ckw`OSp32jk*LLP) zyWmS)mQB~b%E~JD769C6zQI?Z$EFzVSt}uQM1c5>#lBkzXU51DmW(rIV;8z)HyIYDDBC zH>kHHgbT=PZj$;zIC1v+ba6Q0B|ohn!{>qmej>(7a=yMf3f4q*i^{NVZU?*L!$WTh z_6cnJd3c&C`*KaIU_f}+cUc|ue?Qdc!{(uC!gQ1jINUhMol6L4C^88@Q9i|^>oo^! zair(t@e%FFdO{pjerReQ?dnJYoRA#q8X@@3%j`8%m8r=|{V00iPQq@1I~gG=FAke+ z+Dq$ZeS3m+<^Ws-{va>xF?E~ z^EfrBuh#H6-0`??P{0=)b$TTIgGBnNi^jT$jrk*%rIXw#wxf`>Uqq;13wa#Q0kqw@2Jav@reGy5HH zMmQwHi0djA%zw_mjzNd}WPniN7Dj#?ZBVw;@CerYCQ^WR>PPwnhKslEeURw)8YO-3 zJtjlWLe)i>=`c*P36EB1-i5Zkv8Tta`;8=?oxh94Ak&K4&hzThivDhtx_LQJT$thw zicv8W3Zb9dIafs$v+YNN_i-;~Tyfiz$M?9bwf7lnXGFyv-MaJ$YnZMT4)Kx-1j{m} zp^q-d;)7|K5C+qrd7AjWfg*&{U`fc*bcVwdGm$?jK5wEDCQ_>~TTGAq_6c{=X!E@= zK8QhYs1OIKHYo?<*MUE8qelr}3rn95cKoG$8Z78A`y@Ibw%1o-N2E!d6Eln21hKiR zjp5ATvx$GHB;k&?79r;SY9Nsw`&b#{mg8v`79r;;uh;tcn?jnFoy|~|e?4a<^r)%Z zdBod7NQuvQckQ)#ewfd{9oom{@%K8T?}=IWVU0t_^3c>?95BWW4fFktnjnQ=Phjf_8UtBp9&G2BtJ0^v8tR$`2lS zLyjmx9(y5o>^a-`X7J*KM13#l|ELpuXam)6ATd1Ux`ese=ZP_suWAM`gxg>vH5w84 zbOpWp*!wjR00-w^!ZxZF2!FO4k*$G()1A2>`@PU~nv^Xv#M+A4nO-#F!lV*?Iv7@vL6SB)M3p5&anJtmUY|0B z=4tJq*l~i{Zb?oLpy&4`OQyb{!AOew_(Nm=YJ#*qhA)TeC?!Cy#$y|?r5*ZL9Ly5vnZEDqk>f3e(!SaP|DhNCe4YPa)6Pg=j zOLbUV;~GgcMVLKrKz50Ni!}H#G&LEONI!Z7f-*v4INWLEpumkS1#j|_w44l1vS3FO z)sNAgJfI<^G#E;hfsRBQL)H&x=rc+L_kr=)WE~KHV!$;=OeX{$bvUkOXPT@$j6qQ@taY8od(TZ}ig@;%E3|0$irl>~m0 zq?R{_LJr*?RRj(D(2^KD#HBz|kQ7|hye1-ao*`t27(6EfGpKzm30~MSy0a7A2Qh3d zBUU)5NFv0riwPGRwl4uAiMRXk>uNe^AwmNZHufhywfQ)7YfLnT)@wDSB-)O-4y{@L z&+@yWYF22OaISbTaqB+SM(`w-9xHB;nS-6(=CHA7v8(nNa-`=V0TIHtQ3tYlQ^}Va zERv`oG!Yv7JT8e?cQD+F%J#E%5<9r*T||54j6r*{OGk&{!Z(Fhr5%!z+x!q_=vX7c z5VB}>wo9U*`R9J9G&WriIq&Ql-nR*A?B^k`3gYDFiW}W5zT-dtKVAKw(@EXAj|Q;d z_T*8cK@{eFl@ZE{(qp&YN7YApU>?MfR+Oq7uxYzEl@lbf{WBJl;S2TjhCB6KjLu zuPK=F^;#~0rHHB~kw7yQ4BxcEM?jkD$gajl4Os>^Ut?CAi4bVF&D>*sl9H9l9*L`^G=s zrJsZP6u==waIN5?l;cr^f?=>>1p-RSB4rF2gy^v~;1CWdrD->t1rU_9S3Fw}F0RQDf|jA~J!imzokoK^<3&92z>s3JqUVQ+h< z;4Ng?cVgTH-YK9z0s3i4gQ_hpcBlS&}q<4R3ZYpZR3pq z#_1Grc$)V;WiuyC$Kn~*AZ&)w9@|jUxEOq!rn!Wc1qyMrs5xxjEJh1@&t8#=yBqA2t$M?PNFk z3^S5KRP?VPP$z?ZJ|qTn)j`G&qAjeLM!6)3;-iL9Evke{dA!db|ABJ0%Qs|~18DIS zEH@+<>=mN5p_{WU`7K#B5&e)c%Un>qg&v$rHGzW6@8~g{>j^go2??oUpiQH%bna%% zNA6PTbc+-7I-{tY5wSNUZjt%|A<=6Gbq* zxFP~x25hX)91<5qE@OH{Lhs;Br;{}!mf+w#4u#$2ep5f)hx2mx zZ<(r~8D6C_h$vK*Ee(RJtauow${TsampR$vKgJ>nO$fwPP)6S-OSxL=)FNu73~I%W zhu3pkj7!qhDi{H-D^%<4V!`(vnN*7jE0dTg1)!Eg?X%lp6|cao8|jJ@p;tWw_2Go3 zE|gTFm$t`Jjm#~8b`6YU9d?Jj3~P^=FtgloNx|+z@#e8?w_v=Yd@Vv#i}2Z11P~Wk z&67SmXSNv;wn{V?8y5Oa%%;&hhy$ZHe8bwQ;cj5DK-rm;EwOP_^mJ%lkH0|&DQ|K! zqPEGtJqqaL*@$~GdELdJp8}>KxY)mQU{nyH9P)ROnY?HBibY{I9NVY&RvXdpu6zSy z+1u}yl10U^4A=|>KHI)TS<$sS^@qGhK+vxEV%Zw<-GPb08t^#yhC(%G0{)bN1-(=X zc}bB0ufHDpcf^r$PAQ!sXg?M$%#^H$f!JMf;CoJI|A%kKgKKg^$GQZgYv&SYNyBLu zC8KpOBCzpP8WECkS;8u=vE!WO@Zn%5yOe(F|F%q@s&VWSFdQr!H??sO_o2SB4m}d# z#X#6og-V;sBK?ojtdlbX?WoP=y$kz>Lc3=JNT4j?W=ti4yd`%O^)@cdV;2_wz>lxR zw~@l^)1D!W9P{$}1DVf6>9ip&ZoDMD&t#y5Bh1}dh3z+lz==U!qmhO&@p*8Iknk%Z zwX0u5*&wg${uS>7T?i_az{bGXpmi!=hl$O3zyEkE(tJ3cpy{w)fWh;7Q9IFBC}&ku zup8@K(INVcPxaLE?ars*cS){0tWC8AIIwKe*hLCxTzcPcc6UcQ2?!_RpW|N^-2xKjc z9ecR>Lq;W4q<)lw?nBBF$tt6;z1U^^<)Rcax(X((MHb1swuRQuiV<9|H`vJ%Gcu!W zqXNxC_HUl)>qsP&NCEbwNHs`)hpCDtpg=(SMOHEs^U1F+m*`_6;Pkgs?7h;gJX)s^ zv+paF+-7e~9`JMk@~1#0O>Z?tY?@)NDJ}A}$T+AP*cZBeU_&HDlr%I+Qmw6cRbfk0 zUXyw)?vTNZQ+#e_*u^bLb&$o?{;_xkx6adrEW~;t`^l`J>xzI1`OaS0qm6JJpz8)eStXy z#IHMWPXuA~hnavMU$Lc#8{#~3ku~VS{-QbfoRk#Q*To_R3vY;&%$V@2yP-W4^-)A# zx00!bIyp35LIB>(TI1YyTSbuk7K^zZQ(aVH)R2W^?Tt7w_3Of3US%Ba;u*HY87|Bp z`0$$(gRL3s^4?#LW_Hh&|HE83;kXC|PI61$1}v$T!CO;9K?Gb3Iu-82Ay=-M91J0% zqw}3ZKtbZ1K+t69>}Mte6!esG&@EyN^1H`Tsf3}3Ws>Xe#FO|I=>5oVmIJw*?n>EnIGT2*X5;`A1zm*zG z%h9at(!!?oQD*x~E1J=0>Qwl0-N<9A;0>r__Sh$9W)~;{EDgJ@qw=^gZ-K9@S6TU)&p(=J+Lr|Q0$!D z52nUE?2^Z5gN~xXn(#3I4SHPe*Rh8oM2&Ui7|PV(c^JED8G2eL4?z*{@1)kl%6TQZ zrJX!d=%=QsQ7edhebu^b+y_@v+IyzL5T=)u!c35*5WkgL7PEl6{=6!d`|KL z#zfrkiPS*?E|4frROvH1DPX18y-{GLHZ+)lTtX?dCu}}w0cpvL1Fk7;MT0t~38Y^w z4I$)+BQT)@Gh_l=C-}A*HM~Uzz8>c7@4uhYtk2H^F7$h&uvbEklzY?|H}+815vo>@ z|70t4B0~Gg2A{uIo}zb&)iZkjPjn6_l2}036_enJ5rFUkfY*DHqpcNtGAdyOF*o?~ zo5At~bL!}F5Sg(3%Z{|)EcoTjxH&$>Me~!4fa25R5iV1UccM**y3mPv=yoCAzRB%X zZoDkg6+(x_?^(WWyu9a$?J;#OxcJZucVHOm-&{}f=uy^)G!Kxnr*nc8rcL(nTX80i z@4M*#ykQ()j9ybM z7wI78+7mWA=)AgnE}pzq9{@mV8W_|~WpEM=c=o^Ul!vj!4$+EEFqvi@ z{e!syzDvyx|HPMckE(#diNe z$es+}%*us0Sv?zghPU8dhyFNvJ3W=u*7Ks^eZso~LjvduMKfEjLcB}J2P4uVRN_Yo z)17G@%z_+Xc2e%TDctWp)bqSLuOYCIrBel4k-f5{9)N?b_C=s#uKg9oXN9KQ}ll|bWVawf%j1f zQ#Jxp<;t+P2np-T-|Thw7xWy=Y#beDJ1#LA-<1CfN%!F$NK?(kn0l zMKI2HilsPE(g}_?cz#jtmI`EN9R6?I7H$vZgeZsXR)$j&$AK;CWS?SVZ^b9P-_>_8 zI(Nftd9ZhpTE{LOs3T_`HxE0=SeDNmQ?;@{<T22X=%57 z^!=T`8RUNKQJo2!%Ae7h{%-*L{wnVgM^7d6FLj#(d9%mYe z8zE)kFN~e{M|34KrzAVDHr_eIAy|A!X-LV{rvd&Lz=Y+^7e&}_2W~`xGALRshYVKv zTC5s(h>KmDQbb6n5>6#zdw#A|Vn3A;p@zyc_T_x8G8N5&P(GM2pMavV#xf0Vr)FtN z&LxO7O`%v39P!LO2uzRuC%>8j&D3-mq#nJ?M-f`o282A=VZ666x_`qI-bvv37#Q!d zbB=$#waJFE1y=ctWW~+_zbN1Jh6yJu=U-8jdXWrZTj_pavuwoz>Rd*RwUzV?$TPW* zlPfi}Y>L9MM4U>|iY(MhkA#r6`gCF?dh=TzN zydkKWzH`LwQMWT4!WDm2IERuTKyux5&(n(BD1nr66OIIbhop%bJ@!=?osRrzed;6O zhKEOto`JPXrjBT`*e`*VK{vDWemO$?j&=*Exja~vE@?8X;7AbeFdCs81#Q#n^8s0b z_ivBdu+tR6Lzo07?ZQsB_ohSyITl8KjL4#SR?XZaiG9!%WCsDWBlJ^L6G=?X6qSu| zXl_zmXO8f=;(;gy9f6+0t#L;v^)1#5LZgtt!)yk?MKfyoO!r!l$n58WCd}^OMPz7! z-57DVRRS3#wYB($R8!&msy1{|Oh0h<{wEWt&IPF?Thic&{_MM8-u?}+3x1q?1)f^L z)dB|0t7T)3Y`^Y%Ww~>@u6P$PAPIMWhRBk<(`*JaU>#H~z?Zn4K98-dcfOj>rw9eT zz2|pBk18EcoHM++r|ukw-(cWd<+5-NCk5$ZtXyxNgsMo@2M4*61e?<|DB|c--GrEs zToQ$Ztdr6G9b2?*6H}V)(+GtK>*RQ@L-w2#{!Fj;8?^9Vcj zWctfby)tN`Vy>|V%j(?XHJm*nqe}TxnCAz!4h|t12?UWeG9d=I)gdfQgoXxq771du zJt5yw{~SKdC$W;U=tmzfqdHij{DZQPxd;=k@jJtuLnuSUFJ!LaQgcMO*3^EXjCKKE z=CVBE4-->kEFHbQs#TRc-M0BtFE(B7=K57F>aZXQk9ypOZJr5rVaT9-U@nJl$$Y=9i#PclgY$cw?!2`By#)RW z{Cc@L#MdajgI=}iv&Xf_hpx154XB)y}P|^#oqo#J?)jUyD0WLYv({BF9?-YK=d=w#{o*sB}Ql&3VFYW9g?!o8B3ZA3qAi?t}`RU7(Hri?^4$y>d<>dX&yj00`+vD z*zcRzmr?FC)7O+I6$_)OVhmc?!-il`MNb?r;#34;J+-BslwJ#%4+!?wXfFwp3$~ul zYH1=EHMJ;Y9)3p4>2kWS zCPo*n;|DmsR5apO{DOq7al1I?WEkLKJ?uD1mqpTe`F;Bs`GeOF+ibkHUN?*{`sZp0 zC|xW~+<_8d0DSubG9QB4^Q|n3WCyk!MPA^wcMG$0$gThv85g`Dy`C^<4y$`(jxm(8 zmz;2{JPiNcI7F)~o|Vyo){lDdKwj^qZ|i^}M8e7;GGLV81|QG`O+u5ZzMQ0=L)L9Y zoC;TJUb>ECQd%?ub6GNoLGI3eZwY7oaOZTOd_j7UIYU~rkzzIw4!v(Y_bR9M1x<9;~2M>a-Pj!2Xz!o#kQK~h1QcB0zKhV ze30EsG=dZV%)&bEs~^jFoj3Sn+7NV_w!>sdk$a_9p$rQpNcxOeQCBN{774@p^gl{R zxKrPZGneLW^MU}fM32Mp@K6LifPOHXCU>!jxk#ad8T;OjFg$(qZ+(B`&jV7rYmUGM z-pQVJ|Crbjndh2Us3~3fHhCO2nVy$KWU2q)bRIVj+zXrJmW`6U$RZMu|56p}YLgpN z)jubEZ3u=o5Yf+<7V+}d+YK;LDNtf@(A-2i9(cU(iy)h9{xYupb(70drmBU(C5|%O z;KC`F5mVIN#R?1joS!utPTNYfDUYvD-4||kR>J^Hw0)j~C$gUSa=}tL5WNp{JGtO! zIscO6oUsiPge$(>71HmqucprkI`}8DArSR8=-4IC#N#1*1bII@@N;{x;dIqww<5*- zDi}EeR>Jj3l0lTd8qQxR6rbNT62SOBr;qmhnw7?-&1Q!o*KD%aRsw-=o5UZ_Zh1 z7}lTfuo!tTc!Om7Rnc&%iG!bsa}~{Gk@4xzSHE!Nt*OY~FvLHlSD{`CX)X%Cy%&J_ zQ|lG;N95e<7F|r8KK0i_X76$Wif4M8dv-14_Qf8VDgRypyV2zZ7Qhb-b@>VtWAJs? zJK+(LUkGE6HzlaxeKDVp+){yE7T>h+%C6e)j!1x#$nT3cRbZV0rF!Qx1j?@(I80_l*o8AVqpNz1=X4JvVK5JtenZ#siT^tIumikJ>C5l%=G zN;(J;omPYS>{KihG|G6qyQLr74a7kiJLqV*JaZUrEmYXjDcAul2_N-y-h9NHxjjk? zoSycz9n}N7U-}}iflk?YQjtnXREg0$C5;k2-iIGRQOP5+z!zt0#~ZNa4l62+(Kn-b zBEwyaO1KECa@3s{5lX*Vb_Ht)E&S+kIXi}*!N}$lfiZDMiH)iw z!W}|X@%*bCCXAnBEMgZUUi~1&=Y3@t3C4nB6}NS3WDk)KkxUE1kRYiD%{}9hNjBG; z<0?UmPS{e8>eHas4*a!hzXK}~itRzcAIXO#hcQLz(M`dg8qr5^=uqT;9Q=(b>uz*I z?TL)RVw|&=DY;k97GqZtyjh@1YlQDW+{|kitH~CSs+^y8Sml5W;12A~r~} zHZ!WVlGbKD<6<0@b2)6Fp+me02_JUb^Fe}@zEh)9h_sC*pI7zv+rER9YrfNbg#L}| zG?z-rP3U$f;o}w0gD@?0H2X-@Q6Hbiwd^X#?_^x^X!@^SxeQeGRKda6MY&wsg}Doa zz+>>JWx$Ij@?_xq>zNc51FS>F55^=97G$+}zK4OyyQiI(Mz~L7y$8g^bD|=6q|1Qk zOVztNyfhA;JhYQtc_8y*j}0N}#SQK6;g_+<7!>8p+Ef#tFGby{lIrXx8;-QEL6 zvY`+xFY$*!tzffPOg~wz8k(cno&-b zO86hff&pR#p(xp5VY!ImD2icGmLg&2!HZ&Dwz)J7t$Hxo5*-sWi@2`^d}A|vt6|u& zs&ub?4-x2#r?T{arNCnfbhJsnZxXqD^Tzj z$n7=;>pv4ZdFO@@DZ(1fT|uI7pgTpc!ors@Qgf_AS4kD9+4NzgjldBTy^|xMYqb~z znJzbKA;ljJwPJ#)M1?;>z$+(;Uj0b51yw0V0xHp5E4dr6+U{dckT^&UUn*|lihyYe z%I-Q?m8?#6b}WN?Yf0Y>c{CV2+n%1^w?YRInowXy5D=1-_I)O|G!8jmJ1`mTIRFxdTrNXEAN_3zcc{7bj0G>?@m{lj0 z+#C)8nEo}HYw`H)cjqgZ zn%;UD7Bq0?isFSk%-=R8?VB_(f4q2i0LV)f?EX-wu|pDY)4W_I$$vW&y&IC%J<{_n z*JuE*ZrEccoCw#$NA*6|%hq9X!pz>_#%@pD?@v#gd^~l`vvVd1?%|Lc1O(n$m3S!& z$Fs+F-lf26gc&DPHbD1>NHQYP8hT~&-;Vta<^SZ@dWko-bB4_0f`UK0b8jxdw=Qh3 zgwUP%bIK_rsS_1dd?0htuLWPuTK7w;JZK$}q!$?r13w8C|IIR25J{qV`k>;cD7LIf zWuH)FsE;Hh24v+z!9pLt_E^@H`8M04#w|o#v?$H5QVs0BpLaHALWOxl`^X;{zb@Qr zM$y@R23POc<%Xbq^D3f8p>-ajQYC0nEjq-}=T!hB5)`9l#*!TAh~7h2jxhaIkpk9( zUQqWUWbHslqEtMMC3E4l;}Nu0ltA_0A<)AxHJ4OU8X=cq?~ z@q5&k1R?juCWU$`!Incwa-_*6T*5&sFV*6b1j=@alAXc@+_TDm8cg+~qB8YeD2WcI zL1kYLBB2!uDU_nPL#tsp#p2|l5qU-X4SK2qxU2a?d&s9BCXJ(Rw&$F*mKKs>~x*LYti{7=;h(L$4=WpOHkP6??-J)BuA zgsOPl2{Y?K8NRZnp(xBPWH;zUC3bM`<=g^{bsTGv2z{+phw}TBY^;N=f&a-F!U&tT zzz=S9zfoTE_c9`aspJ|@kca*^UPbVylT#dC<& zNFm?##;^2IqdWm$q$_U94P?UpGt6>kWRBv&Nb!=UW}$7LNxcjx$u{dS;|inaHbZ`D zS3KNOKIH8~$-gqF_!@+c0%XueBX92`_AXydfM)qh_e&lZHG|d8HOZ%ik#5?cwJ=qN z6Tf^6y$*wK{mfu9dfu%H{gcVYX~?o8B{;IwX>8n=MegUC;}y!jPTwpzmBLwuR)>H3 z`*G=yCV~wXmBE2C#EZpRmSY8^`>u5 zQ{?P6UfP%f0LPop5S5{#Frg@QFq7-g2?I%($f`dr>@jE++4GYx96A+vfLCWBuETz> z7}6Pc@2%K{%f3h?#=g{YjT~@Y#kiv~M^;=Ykp5d%8xzxi%pX_$*J-cksR%Hdq2Pu* z&xfq>-)zFf;rgBNb-B%LLSK<~S771x#4(2##4Y{SHPTFYD~Jmo!B2&G3H|*t`98;3 zgQ)hPDRhzW4>=>;iwUSlZ_GVoMfhdWnc9#2ebt#E@HM|InKJ0~y`Ip{l~^e+JTH@L z4L=p#=`%s|7BK|lT`+X5A&n|XbP^bccp3Q*M@b@jT`peO zT4B`glQu-&XuDPxPzDuM`o};ZRJAC4hjAmd>78$xd8Mc)u=bzGyv)3A#$L6}`VcEQ-OREH=C=<&TouZ=q( z1kkWEu%-MWrBxyFHp%3B9ZTl=0olVmS67Q|X%ifBgUFyCZ;G(>Rtrs$Hk@x^()Wk0 zQ?4$P6Yl`xs*iUVSk%tH6noELO7QM~@DufqC&4dAfk*x!VNBcv@)80u;r#-W=mVH& zBs&V0G!$uWm&-7}gX|}ot8Zvkq4G3IgYdrkhKd&4f$+^{8*&4>V&%V$sKK(6puExx zI&N6ZLjF1UC5IPeCu;z*E)@B7WQWP!0H3vp*j5K}S3G@<|hu(bLQRQNBF4<);sh&Yt#s zUDDTh75%1Ja(M%XoKm2MY0nZ+svsEZC}LPly-ab3_LwNYeq+k@aw$!Z$MdC8Ga4E9 zXm%fH&iFl>A~ZaJ=a56PxN9q{39WjUztuFaxYlsc@c!EI$P@g89*Md)ALq%G2MWr5 zUQbK_M~M77&??{L{iN(|aiq|~aSBy`%3J6k)QSOm^W*o$qZne$J)K~H&Ww<>+2FUU zvB#yq3>W|xU763)I!dzhs4o``Wz&_9qI4V4mTQ~7 zJWHR>0b|PkagrL$e`mwJn|i>jsGKTEWih8r{2e!0kU~>WJIafcC#=Qoe4D}dczfW) zF13U1R3jY&HT2A2+{X-wMb>8}@{9~);_KUYGOpw&pUa6U$?ro2+2`8B-5u;T)doGc zEy*l2;Gt4*(#8n>q0L{1qydJ~PQo`bSLV)CpZfjfNZ0dlg#Ch@@XrA)OTl(JL-7J}~DcDtvBT8dveH^%^bmKDa4-YC4>i0MRsPR|T0LTp!S48F5r z09p5Sk_m!K`s(d=eQPA=p7G7KeR`O>oI>)nOrPAM=s0wdj>a&PB0hvK1sIx*u|j|c zu)dc-3kT*AK9IvlK+dPh&81l5uv56kLDIy?M)Ce$TugVh_wS9GP}O!n*Xw+HkW*AN z^UST9h>eYXXRW3syR#TCCQriKE}zqxiJr9y7TY~sgWS6L8h(oYdMZvZ6Y41Cvo?#^ z_jn|1K*cO&XN+N4PH0H1;ouQ_3BhUaz906C@vXP*7s8RIw(RDgco45wM*2Fb|LT0M zzWHKefTF4FUu;m-H#UPdWcv91XD|~(cTkvhAiaesN%$Ax^UddrXN+RAyk#Kcrg>PA zK(4h<`l<{Dh7SQ+Mwj9^bYN+0w9(7KUuI?83}p${R==Cs9!-23UM;rO3Pu?l;2_Ef zR{DDfjpPsAyM{^0^5@&Ze5|j7KRbWB{U*68ArJv3(n!*#O=lvjw4eL7i1pgQP@>O< zXI}Y4+?jvsNb4`6T|T%J;MB2Z&*6C+f-kdQ(`HH>;afG&kAd&Pz?;vj-i0VEW2=;~ zB?5u8l%d_Vm*0Xf3c%68hkOLZyd4oJ)Rl3g4FzW9pRk;%`DPrUskGb0l8Vtc@9Bce z>?Gq=E*D16znkuL_FkZu>PmXGq6JJ8 z_xXVr)x$)eXUHqKAR55-TF8%pxBL$k;7$ux-_HBt2`U_enIK<&M_z9%_()!k4cZ0F@4XAJV!znhqZfPWRw9T>@q z0{lAGLRPGO#K7DBt^L0}pAP;1vg{+WEOIV9X5nEV=OjoA4#x}n{&`i@Qae%)kIxTY z*&>`ShX!ibbVb#)EzR6XR3)Zs;_CQTgK}qjEA~FwY7{obGrf`F&u^=fP;DpJDNdEfnwff8r|ZLGz7ih{btCajp??P6Uhbp7Exv8jBmevP8Mvx&#dx+a;&oBi|DS*47p<_tjN(Won5%? zyl^43rbO5;kNrBjElP!wIPb8gGgkF7wRRFx$-`lm$Vk5jVz-unC|TP2sWljAU=}SS zk%8jiMNG0bqubdXw#5Y9yL5~@_ZV`ayyXwE{t;mzQ#p~BHcJfK&;GHT|0!-gO$h9HD|^@$=n1GP9cA16 z_m&j(U0GYb=WmC}-z8l~c^1*oj?WW!B0pf<{*&QX>jdS=?~W7xQdil*ufTiF9j2bg zIHs}o+mh$K$Ux1xgZHQPvR`|Du+dM)zcvSbv(j!0yq@Bqbz+Q^m?wgHoCzb7K6Jkh zFIHSXRUhZRZiv3V_LHebS7eb84!_iEAwE-QdzJmpT-|2Bfp5sY-D#Uy z`7TEbf;J`r1jvNh&JXWlbFnn#OU> z?|bVMhqT}`Q+JUK&H#1-YTN6d-w+QZW(0eC$ciU#KCT68m+AKNNBNb!zxsQ>;&f7) z^TeiIW3t7sG}bbQRm?e)!OTZMBD#yG3i?v&)E@Qb=b2_B>9V?JheQ!Z@9=CZR17)k zDOVd4*(#J?7qbykZS4s(U2682(}ImHim{YD))c;V6y>ot_by#&UCY1{x3~iX?nsN||!mD9>9~{Dp3s%2h@#43JfAluXQ}_`mki!G&@~-0_iDRhv zrv@TuK({aInU63_k`8~&nES}7i=s+Mk65w%W#f!22d0Ktn;)?3sT~;Kk@TiR8iOPL zwFFL7PS}kUGD{$mzlGuO9tv72gNhe8pv)qI@{kDzn!5uZ-qZcGGF_`r551~}sY$Nr zLP&_cm2>S=LUFLX0w~C|et{y%vH%aa{dua|j_F=D8^}zCL+f8c!;vH+yZe8>$PX|oHrtj&P3 zurbUmHns%Y*kb)~w+-0rt?sx3xTtSqGsdEMYD*@(`l_6AJC(&&Do3LA$VPVAQH%p+ z4c8soLYL1@nsUc?=i7=E49hDcYdd)j@d;yjS!3VN|8BRKV*cd_+~1;cDMqududk$@ zhko<*=mHvf|Aor~bqr`LZOBXN+fq2==vPO06xyQMX<}4l(Q4cZcmemeJ{(Bl*rqwU%vhy}YH|+cIM4tVm zxA6dbag{MDzSZ#A^-_M||jSS)PY?nO~E7%RvRBn=xALvVOtLmuiB&Bm8eIFV8$Z)a|OL)dHDfz*^p*G z?5ej&Tx;hm9SF|LATM_}PjuV%tDUp27xChN z0gIfuZuEuQ-2LUM^bdvEOpl5e(JQXv7dSXn7Hf`k)PHC$#y@G_M+HB}u4VR8ZVZ5B z9_?q7PUA57Ys9Qnc(9J$w?7uQy{U1aVt^TRaVuyub>UzB!G>_L`2rtCoJ-5 zZ%;96-Mqt55lyU>9>0H7?S`)Axb}3an?~-O98Fxe>fFJ&X%}|=vaz$yad27z(HC`f z*IIUVI=i@AAU2dJRrpQ+%8ImYs;k_3L^ImYMNg&2qUD`>Vx5}99mgipuXD0~s4tm6 z;E`NDWWVLjt$0x(Kb{A4(=EW{34u&i38#TX>(*gKr?kV1b1CFNsYTtJDddX3nyn z=3pM8NV`?+3zS*VJWJnb_;a1eg2|g$&NC?wJKlegfyq zWQ2;9$|y3>$*z6T5JO{tV$M{Kups4bE+1Jn6O&{NVsG7oU+`=gYXb$WGFHW7Ndt?2 zRR}e1^mL9yE_$b$q2x7HNyt+yf*)e)KPNb&J-2-|BOtEULoO#$%we&3D%$W3;`KrS z5>VmU>{)1Jote+2Ex0g1Phv5ND9!f&Z)E;HypCZ~h}_-?tL=;B!H)9U;V4&;@Kj)&d|a#x7=-gVoxqsrk)ZD-psVilXyMTtf>thoi9fv;tpK2_Yld{d3J>sYAa4wyx z*$G=*fUug+{CLbLxjf{>E}?k_3+l*vK-xv@7*;%&Lw!|`URrTdK38;lVX0wmTsZ;> zs}b{E5L4cwZqRic8R+qia{&nYEu(FXG1=PLBWEU%>EIZP;C;%Aw8h{hA|%cYc@$T> zU`rc2xX9TAEfiIg5xjS)UuOomw1Bo`UR~VTlE~x`t|V6|!GmS60&hBm94R~MMp4Ze zQ$83+Ww27Bbv$b_r1)Rsr67bA?{k|!Rg-y5k}%1MFUf((8hMjMj6PLD&ON+`{*Oux zc!mBY_{i8B(tCNr={NICD`tnHCO&&o9gFT##pM(VSfYm<$@DSaV+=+s*@W44yv2&j01*0?=cz4H$S zam8QeS~Bo5?*oPLseaSCELd<==-#=GB`fXv4S)I|OV{X)lYJqXMC;@P^~>>>AH;_h zP0H@!(ux*y{1DY8hZ)@66LFt(FjNfydayPpv5rYJ$|Y}QvEE?2ApV~iuK8XiblXvr z3ISDQ*D$k3Cp`=b(lbBXNm)Weii$4rIA7+IuN5qp%bO{|)W_8iS-qxVW3RSCv|1vO zk@a}U%E>@7?dxs!hAhNHir8lF;<Rib_Iy=Bn3H3T_6=F>sukev~O-FmDJe z4=PZ_e-{ffZzuuH6gdMzN#E!v$_h{5QwQRn>t@1KgJu@Raq*TsA$H;*Q z=QIZ6klARW3i2Us>&j)7u+krGOncrhanmkxL&k0%B9KkvJNM(0-rsjqDdG{jns5=% z_7e$G_=W*=C(#u~eql+J09%jJ}~G@F?mqPEidyHM9ZEdvm%eI_tnPxT{fs24De z&pM+UKjA2F>@E|HPrE+U_1>d*?i$3BmfW|`8bt+?e-ru@^433=g3%)7jas}imI^M@ zn3r$nSkctLAVy*c-&0Qsh-Zxm0PkI8SQ6`b{;(HuSnU6dJR%*I@>}eV{Bu_Ab8Nd4 zBaWfp?nKCq3G!Z8sK+2C0lw@wLYc#0#TTtgLvXN0v+eh04AgaepWHt@ZI8`X^T!i0 zJL~^W2F+#YNTP7JQe4E#Tp7T{+?H}O^_JOAqU-1zG+V?mjoNte@< z&H-~&#%HzMmf<*oo?0hvqMaZH8K`^r6U)?)40*ftZyOF<93ih=T_u=h8X^wXo?aUm9Ec-vV9UVcux zd*{7tIC_`zoS5URVv(#2-rh`%;l>ql;%Wz@?nj-3S0SF+Q!PM0I)!dQnv5aIP^Qm} zS#cX>452oXv3ukw-z96Gb2h^8j(s=F|Jx-z%-kyvJk&PsxpiAmX`S$Vq3wn@p62uQ z^cMMSjU;&izB9rcsb0hbaGdX-XIMUTDvGF(6vhes+N&c=yc~k|>ktg9RK5AWs(}90 zX3_`dRqS0D=!&zFwQ?{jb!+~E`r}L#6tilYRc^EsZmARHpC9f9P7wr63Ns@*LCVP_ z2DOf*wiu4Eo+;Y9L9Rpb=yqsN>l zs?M?1|5p~P{9t~GuA|+73yYj7L#!c1ZaS1}<$Jd9W6bA}PJ3xp&ZWaa9VD9_2)|fT8L}_Yol#{J z#6Q=20GkM({yAwosmPxcu4ce&#caKaMpDU$Ca8MW3K9 zk-huFHMi*R%qOm*LEiCs3i{TaH)g=bT?nJ^L^`_GSu*&p7+)K}Q~U6e^`wnQ(L3tI zqGNjh1*KkDxqbZqyI#(M1;4X75RIKfT(j_24Ow<|7q*0!=hTZ zJ_AU|&@l`hN(n)RNNOwp#0|*QtNDQ4K9n#Wq0FjcGQV}o5bI(2Z ze$Ti6+t2=It@nBNdVjI^T2CjBNE!@U!?b-2pTlNJ?nj7*QE%G^K`xUypMLrsWY@W3 z*J_?L%?ZzoL&IM9WiGjLM9?;`;yvbnQkcU60CDpsn=@q}@}i5LvbKdZCOt|^3SPi> zFxo3f=}{8!Rim`RIZ1X4aUv7i1;*+e=!RQZeB1?DO$zP=B@vzJ6f@2h3^dSz2!f0p zYU29V%9Wj4LwNz2uFv?V*%+5@oUUoC1=K!cP~Wi zp&LU5uKLSUcDVYmAU+QX=jE_yLffmIHEWWQ2z6?!1I9n-K>->~JHn!tVo6?M&b`W! zA7!xh$s#NgFGkj@U^eepZNd4Z$Ojb)NdAEp1*2}9Z|+STL%I9dbMax2E{i3uQ5k3Y zBcqA?R6Mz#byn(Q5;yAcP(3LId9XLejD!{T|Anl7r@V$x=sLH{-q}AbUI0wBWmyDi z2CC_>94cr1G3QJ4DQoswmrfmpo$YoJ6;PV{{x{3-l@kKfo>8@Ugt;-7wH&;;QCf5z zrMM5c4|WcQX5xshigq&JL+8qVh^#suvl1d zJ_Qj*fx#1GKz#>^oDcQ%v$|Q*e68{br01Jsq#GMfX!4{nuxd8hC|9GNtolo(e@pT9 z55(OlOq*+^J={^B*B^D%_xegzFi|wa$4Dw%i2o|t#X|}O)#+5@Xyf?)-LyLT#bJSM zMyW@v4Z>XB5+Bi#M|HDd0wZ$Yjju%sJ;wQ4ng91T05Jxm$EjFNL$B}6_Ip2dJxw@?Z#`=l^R0{<|LW933M0Z zCYd=zMMabl)6znf;HwnoLJ*0H??<|ig*(jMnc+Pn8AJqKk~&++B5ZWo~pISUh-XfFly&r?3rwm)`6q*t;w}YhCu9QvCnK z{#Oe8+}LHq9$*UeKxvvQWtj|l%8?llAL`)0lllp65tuHFFEf=J z7qG&`4!!HIAI!h}LL{Fia>Iu!{HFY|;>5g!kNVwAuDvQ7(=vQLAIcKy?e3DV2G9ABa5?E3vDKiIviKf`YXuvvqKW8=6Zlvb zC95JaNe2`o40UZWYN0K*B_2zw=&im+4e1Rp-=}1UAzym;ULCQ@rtU<>alwUC^bJ8kT z&pyU$jIuJ;A!TIzDRZ)x+g84@I7Kiu!}&T#6_y`E8cKvVei!_dRCQ>>Pq<^O@Tj$2 zd`*@-Swt`m!cHmTAos+hPFtDx?JI$gR1usQYarqfoN=UWgqgrr z(@9n&{k1(szpg>qLB5Slq0UV9j90*CP=iSR*0vl<|HA(0WM;LT{ELf*I|$epUiDEL z*Vhf?0~j2EHMq7u#dJ7*=0`;cnIgw>GaS^K!3uq6L!1PXR-q5mDWLPVBPiJ{@ zuk41nAt4U;O31l;{3f=;>P;b?&fBJmq{85EhT57BN2}c5%@fyT-+D;Wa-ri$egx&j zQ9<%Dqqo1hrq}YGt1>yMZ;rjvz{p+tyVs~-2uS}U1pmFyGe`k*`(~Z~k46}B8o5MW z-v-M)Q89TEtkkrHDhD>Q0E(!rpX|gHmyEpVn!@RL_Y*02b7kA;YGt4p833jwsVC_{ zNuB->QtiUcTM^ZwNPOw+?==d=KCvYoNW!D~V7)xSk-oQoL_Lsa?^bL$z!1|#fVVxF zu$b&t7$4VLgX&W8lQ--~4UdZ@>28Ew4%L#pEnWk)zIR<)NX)3(!X!X(AMo<`tv?m? z^L^div5`Rb(9gA6q9f2C7?TdXur_SI&)%a&^pGO|C&wBFB0ce}ggs@5Rq3TUc4EjJ zYFxf8{V6Wq-}-lOS2%gWGYpPW&sIw#%sVkMH+<21{ohZ$UqKh6<-T8cf2J$(D~0}Q zZ1z5AlbFvY6vB#YQ2um%R=+cpDDaUWe2KHPZ*AAj&4iuS#jz<$Hq)UvI6jE$-BU&| z)v{#ZrxLaPk9ENARC1!$M>DBWwKhC(Q#fFtwwr^3Hrw4PxX%9D%5d}A0uLx4@%@@E zwvgAlI&*$iK#*@=Cq-j`@O_4}{c58HrBq~_JobWmCLZh1{M6Ltx=f0mLKd~Mp}C@J zQS~}Kqmgkd@C%vzK6e}(iy|94NKR_<Sg@+iiuo*@;mUcW0V@s0@g0QdD_(DHoH+ z=Ks%$vbINFpjUg7(~$<8Rc*I7zjQvW!`W}dev!gEemfjw<=%)sxYg!K&aof)*LH50 zcmprLK?B$BO4@}O!c`J!-aD_-VGifZOlJNjH?9zD>!#QVn-DYx$kKO!8EJ9)P(XtH z&1TM(Z|P@SZKu*=bXf$&YVy)^x1$I?z0vg5u9d`3XTrg&S1AF5Z1Us;r~8SD#)fQz3soV1y4*`b|aNHQIk8BO$vV^Oe1pndcv2;NllUq9V0#w6;_!1 zM-PCL60>?u zkGM2p3PqE|hOnp#{|x_Tag`Q330V0$GJ1*QQ8DYmsEhQQQU4IO-^TdwvH=P165}gz zo}VUi*U3d7V$);d6+1Tk`G;*&WRgD_r3MexsnGCX6JJiT&NXJDCC0zE6MJX-b*z3y zMkM<`51sL?0^Mz}CO(^)6i>f@;=$A!arAX~dM|fh2KOhg4-r-I;HU^yARA*1o`$Ar zn^|w=x6XZW!Ze1@*HXKfDt^Dn?_rD}POG;*T#P1I7aUW8%(4()W2<0pQk-w+qV#J} zM}E(bf`J^5#FPrgFsi|%coV`7txd1A6SKNK?Zq4<(tnkYab{~Am#6+HHMU*1-)@$m zs4n%*&r{vbFQ|wGoi0U1Qr}r{Fl8|wmN;ooXkqT*;JEv9^K9OrQ1_~HR$YSL&LOlL z50fh}@Tp3>V}OJ#oj;CHg)HzJT+U)s-d9mt8R@I*|NYUgVVV#b)|K^_lgI-(!QIPP z9WbRP?Qmf^MX13cbw?qb>Up!qNZg+L`lgpNUFIEA}wwdaWgzf7dS~#ltcED_W$H z7@ywS$iQ~r@d4dfGpP2V2!i9?5-lhyvTgYL8h7rmrmRxuy_vcXQG+zk>{I`(8q5V)1I*VWs>iZ6q3T8 zHlWLXQ<4{p!W7zEo&y){@VPf=L0n_PV1l1R)+#uRt?z4G*|K3?zv>4XQ$jZ=!LLvs z`uhsw2*XA<$Jem;?wq*gI_mZM|FjKvV=b~XMXA^!=5Bp>)%!%kDEsY5O1{>K48iw` zvV#OQugECg@b}2WbeOI@q@!a)_y8lBqd$X658LQgPrv{Ut2iL-Ys#bdCvJj!j-8QP z0sFDHb}voS#T_aelJT;6Lk>{H-68eh{nflng?e6qWs8EV-fc%U!h9$kL||C=;LQr8 z0LXNECLDLOLBB>lN4o!B_j>-et774HpZB1L<2}EZeiKVgN8VEt33FT8;opm7$hq3W zBx=^>@@IPsGr8YGW?Sqs@g^6tuRosWkkPr`4sc1y@_)DAAFexRp6cHILiTli`JJKj zOuTB_MDBympg>uf$v&hH0i0GD#)ucuNir)>`-YB05b}Xzk=4?==w_j|_K~gLlMX~N zl~0NF50l|iSr)yiv<{jF%bw4jMaz@!vZo#Cw*FWi+nX>@t*jNWJ;w4hWF@mv^Ktov z?O*O{rD7i|zUPGPCHhDn533P<&u^M(Nkuc>hAY_D?q<;?8T8OYdGOvApz`hq{Bf1dC$ZV=${=bFZ;^V05W2I z3t3$z0*`6v9y64vEvR3P*2&HxnW{`s+1N*0orJN^1GzS-T+!#pt{T}Z#SEsWqS>_3Jmasi9!FTHB=Lw&cLb;1EjT+Ff_!p|IoqTMXRurq+fa4aZ~ zxH?EZMrj@M59Sc7m_ge1d*o3PLL6dkho$4g_*2-C#F=fi=P(eTPp_-h9d z!1h2kj!^QP7G7{6&uXpES3`@QtXYjr2jV*jILjAhb8I0loLEA1R40(c(8$Rw`oxQD z-^?G6)9OdR7Z?z%hj_ih6J~6nb6)@guPeyT5oz73ObOifT74@#MsK*qU+Aq(gRYDL z(Ou21U|_N`huFa!*t-kkr4Nr~?kVM2_G<=8fJ&!WLDKG3n$tYihXJlvC>JGA^QQmAb~+AQgT9*JP^e4n39gM#r4 zbN@mn0h9Nm&cAm4sF<><>1@&R2gk$RA6WzTZD#qL%p$EQbo>|NcR9y^KhPa1p{{Aj zht<4;UV5jdis`Yvqk^3nN7yfRdw(KtIP+dN9 z#X>MS#8pUol7n#ndJqltU=)^qRh)sj2j~yG?c!{h9N}Z=>u~K37l-?e=($uR5mm5# zf|1JXzhy$#xfmJ*@jaMtwG^P`GRfu_nxBrso7GL!Q%J&Fw6HV>TMvi!vqh0IzvyRw z!GYC}vbfrPUiFk5*9c90@nMCIWt=nCU4Dr73LHX2^FkV%sJfW|ca{wrpyCzLVzf2Y z(jKq#o0?USuMuN3Enxhqo@RaAf%FZNWP$Wdz0Z`I`0~Aw8yza_4ze015SPwBr1tZ@ z4xh*H&T%s@rLQ9pole)zpO@2JK&Sg51C6H-nWe;A(fTFU6D1dSKDzodyO3hv%zm&# zy($wI(cA4S2{A`#m9RB0Ipkj)8oIk+(b9Z1GT*a-AxfVyMlaK611uoyj|+_ey?x99 zIf8c+i?#bET*-YbK82Vx?5VJ6?QzdI5g0-1Eki^Qib6oqy#mKbp>oo1hNnz*4kZbw zN{#?Tb;TFSFG8s;Y(>YW4D(F0VlN2-0j4|+)UUOXG~SWaBI}F`?&k;ZJQ=Yr|F6LUiN^=2UQ0K;}NgGpnZ)6h{DxxSbvOR3A(A>+>93g zxns5aoLy9)BPG)Z*__ADVz{e)8NkSM*jU3x6G{we_*N)0wUbQA_(34kQHjty;)N&L z2p~kK{$$W8sP@dk^D;}Zq`=L@zDYlfn9%k;NDN{vLz7{Bk9dfKonUAqfflSt@%@FT zDTC@oFweFYmIa`v1|G?k#eF+37Lh#Pe0@z3_r%!RSEp{6@RK;1VSG>roM2YI*Xysk zq|aXS!m5&^mf!t5Pc_?8#CV;Mwi7#%iOm4LyPkc-pRBxHhJbhVP$has@|(svN``_; zNxNTNuwl-oUE0S)ns(vP*}E~>RMBU__SttzK3RbSJ4`5z(??XoRPD@3wR`T!S{D#! zxX~6-={I^W$N>os^Wv_LJowNI*9hkwHx-(+;3>4VUnkXYoJh#U^b<6Te0)qJfEl|X#SU0&=ng5y-0eO+FXwf`Qm*)cJqb3F9Z^c z?ERBc=EOs_>!*H*=IwsA@d2E>*4^ZdeH9osGt$HIId0^4CK+) z+tj6FmJNvYLIiAe!;V@)=HCoR2zTP?grj&zNgbCP5`udzZS*7CJ=A9_yFZL~kYCi2 z70kKlB*#eKpk=!#X7+k0gZ4}3sez3tG%>Xht>yM#dhy>x`Y&z43wP0TN9>(%<%|za zlZ%p}O1u4=HK`tK^&abY6pIA^tK$CW&gCJt$s+SC_6aFoB0x!gwr?Km_EJ&Md{Xro G9`Y}5w$ye2 literal 0 HcmV?d00001 diff --git a/gallery/yarn.lock b/gallery/yarn.lock index 0483d3743..aa9a0cde5 100644 --- a/gallery/yarn.lock +++ b/gallery/yarn.lock @@ -2994,13 +2994,13 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== +body-parser@1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== dependencies: bytes "3.1.2" - content-type "~1.0.4" + content-type "~1.0.5" debug "2.6.9" depd "2.0.0" destroy "1.2.0" @@ -3008,7 +3008,7 @@ body-parser@1.20.1: iconv-lite "0.4.24" on-finished "2.4.1" qs "6.11.0" - raw-body "2.5.1" + raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -3042,12 +3042,19 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" browser-process-hrtime@^1.0.0: version "1.0.0" @@ -3395,7 +3402,7 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: +content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== @@ -3410,10 +3417,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== copy-to-clipboard@^3.3.1: version "3.3.3" @@ -4467,16 +4474,16 @@ expect@^27.5.1: jest-message-util "^27.5.1" express@^4.17.3: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" + body-parser "1.20.2" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" @@ -4530,9 +4537,9 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-loops@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-loops/-/fast-loops-1.1.3.tgz#ce96adb86d07e7bf9b4822ab9c6fac9964981f75" - integrity sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-loops/-/fast-loops-1.1.4.tgz#61bc77d518c0af5073a638c6d9d5c7683f069ce2" + integrity sha512-8dbd3XWoKCTms18ize6JmQF1SFnnfj5s0B7rRry22EofgMu7B6LKHVh+XfFqFGsqnbH54xgeO83PzpKI+ODhlg== fast-shallow-equal@^1.0.0: version "1.0.0" @@ -4606,10 +4613,17 @@ filesize@^8.0.6: resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -4677,9 +4691,9 @@ flatted@^3.1.0: integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== follow-redirects@^1.0.0: - version "1.15.4" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" - integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== for-each@^0.3.3: version "0.3.3" @@ -6476,11 +6490,11 @@ methods@~1.1.2: integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": @@ -7735,10 +7749,10 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" http-errors "2.0.0" @@ -9338,9 +9352,9 @@ webidl-conversions@^6.1.0: integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== dependencies: colorette "^2.0.10" memfs "^3.4.3" diff --git a/k8s-deploy/neodash/.helmignore b/k8s-deploy/neodash/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/k8s-deploy/neodash/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/k8s-deploy/neodash/Chart.yaml b/k8s-deploy/neodash/Chart.yaml new file mode 100644 index 000000000..41e4e6c4e --- /dev/null +++ b/k8s-deploy/neodash/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: neodash +description: A NeoDash Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 1.0.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "2.4.9" \ No newline at end of file diff --git a/k8s-deploy/neodash/README.md b/k8s-deploy/neodash/README.md new file mode 100644 index 000000000..0185710c9 --- /dev/null +++ b/k8s-deploy/neodash/README.md @@ -0,0 +1,78 @@ +# NeoDash + +![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 1.16.0](https://img.shields.io/badge/AppVersion-1.16.0-informational?style=flat-square) + +A NeoDash Helm chart for Kubernetes + +## Resources + +Following are the Kubernetes resources utilized for the NeoDash. + +- Deployment +- Service +- Ingress +- Service Account +- Horizontal Pod Autoscalar (HPA) + +## Values Configuration + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| autoscaling.enabled | bool | `false` | Enable/disable Autoscaling | +| enable_reader_mode | bool | `true` | Enable/disable Reader mode | +| envFromSecrets | list | `[]` | Environment variables from secrets | +| fullnameOverride | string | `"neodash-test"` | Name override applies to all resources | +| image.pullPolicy | string | `"IfNotPresent"` | Image pull policy | +| image.repository | string | `"neo4jlabs/neodash"` | Image repository and Image name | +| image.tag | string | `"latest"` | Image version | +| imagePullSecrets | list | `[]` | Image pull secrets if any | +| podAnnotations | object | `{}` | Pod annotations | +| podLabels | object | `{}` | Additional labels | +| podSecurityContext | object | `{}` | Security Context if any | +| ingress.annotations | object | `{}` | Ingress Annotations for load balancers | +| ingress.className | string | `"alb"` | Ingress Class | +| ingress.enabled | bool | `false` | Enable/disable Ingress | +| ingress.hosts | list | `[]` | Host Details | +| ingress.tls | list | `[]` | TLS details | +| livenessProbe.httpGet.path | string | `"/*"` | LivenessProbe path | +| livenessProbe.httpGet.port | int | `5005` | LivenessProbe port | +| readinessProbe.httpGet.path | string | `"/*"` | Readiness path | +| readinessProbe.httpGet.port | int | `5005` | Readiness port | +| replicaCount | int | `1` | Replica count | +| resources.limits.cpu | string | `"500m"` | CPU limit | +| resources.limits.memory | string | `"128Mi"` | Memory limit | +| resources.requests.cpu | string | `"250m"` | CPU request | +| resources.requests.memory | string | `"64Mi"` | Memory request | +| service.annotations | object | `{}` | Service annotations | +| service.port | int | `5005` | Service port | +| service.targetPort | int | `5005` | Service target port | +| service.type | string | `"LoadBalancer"` | Type of service, other options are `ClusterIP` or `NodePort` | +| serviceAccount.automount | bool | `true` | Enable/disable service account auto mount to pod | +| serviceAccount.create | bool | `true` | Enable/disable service account | +| volumeMounts | list | `[]` | Volume mounts on pod | +| volumes | list | `[]` | Volumes for pod | +| env | list |
- name: "ssoEnabled" 
  value: "false" 
- name: "standalone" 
  value: "true" 
- name: "standaloneProtocol" 
  value: "neo4j+s" 
- name: "standaloneHost" 
  value: "localhost" 
- name: "standalonePort" 
  value: "7687" 
- name: "standaloneDatabase" 
  value: "neo4j" 
- name: "standaloneDashboardName" 
  value: "test" 
- name: "standaloneDashboardDatabase" 
  value: "neo4j" 
- name: "standaloneAllowLoad" 
  value: "false" 
- name: "standaloneLoadFromOtherDatabases" 
  value: "false" 
- name: "standaloneMultiDatabase" 
  value: "false" 
| Env variables for reader mode | + +## Usage + +- To install this helm chart run the following command, + + ```bash + helm install ./neodash -n + ``` + +- To upgrade the release run the following command, + + ```bash + helm upgrade ./neodash -n + ``` + +- To uninstall the release run the following command, + + ```bash + helm uninstall -n + ``` + +> **Note:** To use custom values files, pass `-f .yaml` for the above command. +> **Note:** To use custom values, pass `--set param=value` for the above command. +For example, to install neodash and set the service type to NodePort, run: `helm install ./neodash -n --set service.type=NodePort` diff --git a/k8s-deploy/neodash/templates/NOTES.txt b/k8s-deploy/neodash/templates/NOTES.txt new file mode 100644 index 000000000..099242813 --- /dev/null +++ b/k8s-deploy/neodash/templates/NOTES.txt @@ -0,0 +1,26 @@ +The NeoDash application has been successfully deployed, here is the application URL: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + Run the following command to retrieve the IP address: + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "neodash.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of the LoadBalancer by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "neodash.fullname" . }}' + + Once available, run the following command to retrieve the IP address: + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "neodash.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + Run the following command to retrieve the IP address: + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "neodash.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} \ No newline at end of file diff --git a/k8s-deploy/neodash/templates/_helpers.tpl b/k8s-deploy/neodash/templates/_helpers.tpl new file mode 100644 index 000000000..9bb54f5c5 --- /dev/null +++ b/k8s-deploy/neodash/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "neodash.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "neodash.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "neodash.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "neodash.labels" -}} +helm.sh/chart: {{ include "neodash.chart" . }} +{{ include "neodash.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "neodash.selectorLabels" -}} +app.kubernetes.io/name: {{ include "neodash.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "neodash.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "neodash.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/k8s-deploy/neodash/templates/deployment.yaml b/k8s-deploy/neodash/templates/deployment.yaml new file mode 100644 index 000000000..63778a9c1 --- /dev/null +++ b/k8s-deploy/neodash/templates/deployment.yaml @@ -0,0 +1,76 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "neodash.fullname" . }} + labels: + {{- include "neodash.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "neodash.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "neodash.labels" . | nindent 8 }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "neodash.serviceAccountName" . }} + automountServiceAccountToken: false + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- with .Values.podSecurityContext }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 12 }} + {{- end }} + ports: + - name: http + containerPort: {{ .Values.service.targetPort }} + protocol: TCP + env: + {{- if ne 5005 (int .Values.service.targetPort) }} + - name: NGINX_PORT + value: {{ .Values.service.port | quote }} + {{- end }} + {{- if .Values.enable_reader_mode}} + {{- with .Values.env }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.envFromSecrets }} + {{- range $key, $value := .Values.envFromSecrets }} + - name: {{ $key }} + valueFrom: + secretKeyRef: + name: {{ $value.secretName }} + key: {{ $value.key }} + {{- end }} + {{- end }} + {{- end }} + livenessProbe: + {{- toYaml .Values.livenessProbe | nindent 12 }} + readinessProbe: + {{- toYaml .Values.readinessProbe | nindent 12 }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.volumeMounts }} + volumeMounts: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.volumes }} + volumes: + {{- toYaml . | nindent 8 }} + {{- end }} \ No newline at end of file diff --git a/k8s-deploy/neodash/templates/hpa.yaml b/k8s-deploy/neodash/templates/hpa.yaml new file mode 100644 index 000000000..ce2bae2db --- /dev/null +++ b/k8s-deploy/neodash/templates/hpa.yaml @@ -0,0 +1,32 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "neodash.fullname" . }} + labels: + {{- include "neodash.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "neodash.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/k8s-deploy/neodash/templates/ingress.yaml b/k8s-deploy/neodash/templates/ingress.yaml new file mode 100644 index 000000000..8dccdc279 --- /dev/null +++ b/k8s-deploy/neodash/templates/ingress.yaml @@ -0,0 +1,61 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "neodash.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "neodash.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/k8s-deploy/neodash/templates/service.yaml b/k8s-deploy/neodash/templates/service.yaml new file mode 100644 index 000000000..b1080ab59 --- /dev/null +++ b/k8s-deploy/neodash/templates/service.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "neodash.fullname" . }} + labels: + {{- include "neodash.labels" . | nindent 4 }} + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: {{ .Values.service.targetPort }} + protocol: TCP + name: http + selector: + {{- include "neodash.selectorLabels" . | nindent 4 }} \ No newline at end of file diff --git a/k8s-deploy/neodash/templates/serviceaccount.yaml b/k8s-deploy/neodash/templates/serviceaccount.yaml new file mode 100644 index 000000000..a7dd2c3ac --- /dev/null +++ b/k8s-deploy/neodash/templates/serviceaccount.yaml @@ -0,0 +1,13 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "neodash.serviceAccountName" . }} + labels: + {{- include "neodash.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automount }} +{{- end }} diff --git a/k8s-deploy/neodash/templates/tests/test-connection.yaml b/k8s-deploy/neodash/templates/tests/test-connection.yaml new file mode 100644 index 000000000..b7def4d87 --- /dev/null +++ b/k8s-deploy/neodash/templates/tests/test-connection.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "neodash.fullname" . }}-test-connection" + labels: + {{- include "neodash.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + automountServiceAccountToken: false + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "neodash.fullname" . }}:{{ .Values.service.port }}'] + resources: + {{- toYaml .Values.resources | nindent 8 }} + restartPolicy: Never diff --git a/k8s-deploy/neodash/values.yaml b/k8s-deploy/neodash/values.yaml new file mode 100644 index 000000000..56b781213 --- /dev/null +++ b/k8s-deploy/neodash/values.yaml @@ -0,0 +1,108 @@ +# Name override or full name override +nameOverride: '' +fullnameOverride: neodash-test + +# Number of pods +replicaCount: 1 + +# Image Details +image: + repository: neo4jlabs/neodash + pullPolicy: IfNotPresent + tag: 'latest' +imagePullSecrets: [] # Image pull secret if any + +# Pod annotations, labels and security context +podAnnotations: {} +podLabels: {} +podSecurityContext: {} + +# Mode configuration using environment variables +# Set reader mode environment variables when enable_reader_mode is true +enable_reader_mode: true +env: + - name: "ssoEnabled" + value: "false" + - name: "standalone" + value: "true" + - name: "standaloneProtocol" + value: "neo4j+s" + - name: "standaloneHost" + value: "localhost" + - name: "standalonePort" + value: "7687" + - name: "standaloneDatabase" + value: neo4j + - name: "standaloneDashboardName" + value: "test" + - name: "standaloneDashboardDatabase" + value: neo4j + - name: "standaloneAllowLoad" + value: "false" + - name: "standaloneLoadFromOtherDatabases" + value: "false" + - name: "standaloneMultiDatabase" + value: "false" + +# Environment variable from secret +envFromSecrets: [] + # standaloneUsername: + # secretName: "neo4j-connection-secrets" + # key: "username" + # standalonePassword: + # secretName: "neo4j-connection-secrets" + # key: "password" + +# Service details +service: + type: LoadBalancer # Can also be ClusterIP or NodePort + port: 5005 # For the service to listen in for Traffic + targetPort: 5005 # Target port is the container port + annotations: {} # Service annotations for the LoadBalance + +# Ingress +ingress: + enabled: false # Enable Kubernetes Ingress + className: 'alb' # Class Name + annotations: {} # Cloud LoadBalancer annotations + hosts: [] + # - host: neodash.example.com + # paths: + # - path: '/' + # pathType: Prefix + tls: [] + +# Pod resources request, limits and health check +resources: + requests: + memory: "64Mi" + cpu: "250m" + limits: + memory: "128Mi" + cpu: "500m" +livenessProbe: + httpGet: + path: /* + port: 5005 +readinessProbe: + httpGet: + path: /* + port: 5005 + +# Pod Autoscaler +autoscaling: + enabled: false + # minReplicas: 1 + # maxReplicas: 100 + # targetCPUUtilizationPercentage: 80 + +# Pod Volumes +volumes: [] +volumeMounts: [] + +# Service Account +serviceAccount: + create: true + automount: true + # annotations: {} + # name: '' \ No newline at end of file diff --git a/k8s-deploy/sample-k8s-yamls/deployment.yaml b/k8s-deploy/sample-k8s-yamls/deployment.yaml new file mode 100644 index 000000000..e9e490a27 --- /dev/null +++ b/k8s-deploy/sample-k8s-yamls/deployment.yaml @@ -0,0 +1,66 @@ +--- +# Source: neodash/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: neodash + labels: + application: neodash-deploy +spec: + replicas: 1 + selector: + matchLabels: + application: neodash-deploy + template: + metadata: + labels: + application: neodash-deploy + spec: + serviceAccountName: neodash-test + automountServiceAccountToken: false + containers: + - name: neodash + image: "neo4jlabs/neodash:latest" + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: 5005 + protocol: TCP + env: + - name: ssoEnabled + value: "false" + - name: standalone + value: "true" + - name: standaloneProtocol + value: neo4j+s + - name: standaloneHost + value: localhost + - name: standalonePort + value: "7687" + - name: standaloneDatabase + value: neo4j + - name: standaloneDashboardName + value: test + - name: standaloneDashboardDatabase + value: neo4j + - name: standaloneAllowLoad + value: "false" + - name: standaloneLoadFromOtherDatabases + value: "false" + - name: standaloneMultiDatabase + value: "false" + livenessProbe: + httpGet: + path: /* + port: 5005 + readinessProbe: + httpGet: + path: /* + port: 5005 + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 250m + memory: 64Mi \ No newline at end of file diff --git a/k8s-deploy/sample-k8s-yamls/service.yaml b/k8s-deploy/sample-k8s-yamls/service.yaml new file mode 100644 index 000000000..28633b71c --- /dev/null +++ b/k8s-deploy/sample-k8s-yamls/service.yaml @@ -0,0 +1,17 @@ +--- +# Source: neodash/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: neodash + labels: + application: neodash-deploy +spec: + type: LoadBalancer + ports: + - port: 5005 + targetPort: 5005 + protocol: TCP + name: http + selector: + application: neodash-deploy \ No newline at end of file diff --git a/package.json b/package.json index c3886272b..f52801638 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "neodash", - "version": "2.4.8", + "version": "2.4.9", "description": "NeoDash - Neo4j Dashboard Builder", "neo4jDesktop": { "apiVersion": "^1.2.0" @@ -30,7 +30,8 @@ "lint": "eslint --ext .ts --ext .tsx .", "lint-staged": "lint-staged --config .lintstagedrc.json", "test": "yarn cypress open", - "test-headless": "yarn cypress run" + "test-headless": "yarn cypress run", + "prepare": "husky install" }, "keywords": [], "author": "Neo4j Labs", @@ -41,7 +42,7 @@ "@dnd-kit/sortable": "^7.0.2", "@mui/material": "^5.12.3", "@mui/styles": "^5.12.3", - "@mui/x-data-grid": "5.17.26", + "@mui/x-data-grid": "7.4.0", "@mui/x-date-pickers": "^5.0.17", "@neo4j-cypher/react-codemirror": "^1.0.3", "@neo4j-ndl/base": "1.10.3", @@ -101,6 +102,7 @@ "tailwindcss": "^3.3.2", "three": "^0.159.0", "three-spritetext": "^1.8.1", + "urijs": "^1.19.11", "use-neo4j": "^0.3.13", "yaml": "^2.2.1" }, diff --git a/release-notes.md b/release-notes.md index ea7c80484..68200808b 100644 --- a/release-notes.md +++ b/release-notes.md @@ -1,9 +1,19 @@ -## NeoDash 2.4.8 -This is a minor release containing an important fix and other minor fixes: - -- Fixed a bug where loading a dashboard would reset parameters to null ([887](https://github.com/neo4j-labs/neodash/pull/887)). -- Fix relationship width parameter for Graph report ([889](https://github.com/neo4j-labs/neodash/pull/889)). - -Thanks to all the contributors for this release: -- [alfredorubin96](https://github.com/alfredorubin96), -- [nielsdejong](https://github.com/nielsdejong). \ No newline at end of file +## NeoDash 2.4.9 +This release adds some minor changes to documentation and implements some community contributions. +- Added notice about project evolution: [#967](https://github.com/neo4j-labs/neodash/pull/967) +- Added community contributions and bug fixes: +[#967](https://github.com/neo4j-labs/neodash/pull/967) +[#894](https://github.com/neo4j-labs/neodash/pull/894) +[#822](https://github.com/neo4j-labs/neodash/pull/822) +[#951](https://github.com/neo4j-labs/neodash/pull/951) +[#946](https://github.com/neo4j-labs/neodash/pull/946) +[#944](https://github.com/neo4j-labs/neodash/pull/944) +[#943](https://github.com/neo4j-labs/neodash/pull/943) +[#938](https://github.com/neo4j-labs/neodash/pull/938) +[#935](https://github.com/neo4j-labs/neodash/pull/935) +[#918](https://github.com/neo4j-labs/neodash/pull/918) +[#908](https://github.com/neo4j-labs/neodash/pull/908) +[#906](https://github.com/neo4j-labs/neodash/pull/906) +[#902](https://github.com/neo4j-labs/neodash/pull/902) +[#895](https://github.com/neo4j-labs/neodash/pull/895) +[#893](https://github.com/neo4j-labs/neodash/pull/893) \ No newline at end of file diff --git a/src/application/ApplicationThunks.ts b/src/application/ApplicationThunks.ts index 5076e855c..6af4b6339 100644 --- a/src/application/ApplicationThunks.ts +++ b/src/application/ApplicationThunks.ts @@ -261,7 +261,6 @@ export const handleSharedDashboardsThunk = () => (dispatch: any) => { if (dashboardDatabase) { dispatch(setStandaloneDashboardDatabase(dashboardDatabase)); } - if (urlParams.get('credentials')) { setWelcomeScreenOpen(false); const connection = decodeURIComponent(urlParams.get('credentials')); @@ -271,32 +270,6 @@ export const handleSharedDashboardsThunk = () => (dispatch: any) => { const database = connection.split('@')[1].split(':')[0]; const url = connection.split('@')[1].split(':')[1]; const port = connection.split('@')[1].split(':')[2]; - // if (url == password) { - // // Special case where a connect link is generated without a password. - // // Here, the format is parsed incorrectly and we open the connection window instead. - // dispatch(setConnectionProperties(protocol, url, port, database, username.split('@')[0], '')); - // dispatch( - // setShareDetailsFromUrl( - // type, - // id, - // standalone, - // protocol, - // url, - // port, - // database, - // username.split('@')[0], - // '', - // dashboardDatabase, - // true - // ) - // ); - // setDashboardToLoadAfterConnecting(id); - // window.history.pushState({}, document.title, window.location.pathname); - // dispatch(setConnectionModalOpen(true)); - // dispatch(setWelcomeScreenOpen(false)); - // // window.history.pushState({}, document.title, "/"); - // return; - // } dispatch(setConnectionModalOpen(false)); dispatch( @@ -327,7 +300,7 @@ export const handleSharedDashboardsThunk = () => (dispatch: any) => { setShareDetailsFromUrl( type, id, - undefined, + standalone, undefined, undefined, undefined, @@ -385,6 +358,7 @@ export const onConfirmLoadSharedDashboardThunk = () => (dispatch: any, getState: } if (shareDetails.standalone == true) { dispatch(setStandaloneMode(true)); + localStorage.setItem('standaloneShared', 'true'); // EDGE CASE: redirect SSO removes the shareDetails when redirecting } dispatch(resetShareDetails()); } catch (e) { @@ -455,10 +429,13 @@ export const loadApplicationConfigThunk = () => async (dispatch: any, getState: dispatch(setSSOEnabled(config.ssoEnabled, state.application.cachedSSODiscoveryUrl)); dispatch(setSSOProviders(config.ssoProviders)); + // Check if we are in standalone mode + // const standaloneShared = localStorage.getItem('standaloneShared') == 'true'; // EDGE case: from url param it could happen that we lose the value due to SSO redirect const { standalone } = config; + // || standaloneShared; + // if a dashboard database was previously set, remember to use it. const dashboardDatabase = state.application.standaloneDashboardDatabase; - dispatch( setStandaloneEnabled( standalone, @@ -478,6 +455,7 @@ export const loadApplicationConfigThunk = () => async (dispatch: any, getState: config.standaloneDatabaseList ) ); + localStorage.removeItem('standaloneShared'); dispatch(setLoggingMode(config.loggingMode)); dispatch(setLoggingDatabase(config.loggingDatabase)); diff --git a/src/chart/ChartUtils.ts b/src/chart/ChartUtils.ts index c88afe17a..6a2911ef4 100644 --- a/src/chart/ChartUtils.ts +++ b/src/chart/ChartUtils.ts @@ -164,7 +164,7 @@ export const downloadCSV = (rows) => { headers.forEach((header) => { // Parse value let value = row[header]; - if (value && value.low) { + if (value && 'low' in value) { value = value.low; } csv += `${JSON.stringify(value)}`; diff --git a/src/chart/bar/BarChart.tsx b/src/chart/bar/BarChart.tsx index 132d13ecb..cd3a5582f 100644 --- a/src/chart/bar/BarChart.tsx +++ b/src/chart/bar/BarChart.tsx @@ -28,6 +28,9 @@ const NeoBarChart = (props: ChartProps) => { const padding = settings.padding ? settings.padding : 0.25; const innerPadding = settings.innerPadding ? settings.innerPadding : 0; const expandHeightForLegend = settings.expandHeightForLegend ? settings.expandHeightForLegend : false; + const displayYAxis = settings.displayYAxis ?? true; + const displayYGridLines = settings.displayYGridLines ?? true; + const actionsRules = extensionEnabled(props.extensions, 'actions') && props.settings && props.settings.actionsRules ? props.settings.actionsRules @@ -408,11 +411,16 @@ const NeoBarChart = (props: ChartProps) => { tickPadding: 5, tickRotation: labelRotation, }} - axisLeft={{ - tickSize: 5, - tickPadding: 5, - tickRotation: 0, - }} + axisLeft={ + displayYAxis + ? { + tickSize: 5, + tickPadding: 5, + tickRotation: 0, + } + : null + } + enableGridY={displayYGridLines} labelSkipWidth={labelSkipWidth} labelSkipHeight={labelSkipHeight} labelTextColor={{ from: 'color', modifiers: [['darker', 1.6]] }} diff --git a/src/chart/markdown/MarkdownChart.tsx b/src/chart/markdown/MarkdownChart.tsx index d373b0da5..a6958edcc 100644 --- a/src/chart/markdown/MarkdownChart.tsx +++ b/src/chart/markdown/MarkdownChart.tsx @@ -1,13 +1,40 @@ import React from 'react'; import { ChartProps } from '../Chart'; import ReactMarkdown from 'react-markdown'; -import gfm from 'remark-gfm'; +import remarkGfm from 'remark-gfm'; +import URI from 'urijs'; import { replaceDashboardParameters } from '../ChartUtils'; +// Sanitizes URIs +const transformUri = (uri: string): string | undefined => { + const parsedUri = URI(uri); + if (parsedUri.protocol() === 'http' || parsedUri.protocol() === 'https') { + return parsedUri.toString(); // Convert URI object back to string + } + return undefined; // Return undefined to skip rendering of potentially unsafe URLs +}; + +// Define custom components for Markdown elements +const CustomTable = ({ _, ...props }) => ; +const CustomTh = ({ _, ...props }) =>
; +const CustomTd = ({ _, ...props }) => ; +const CustomATag = ({ _, href, ...props }) => ( + // Apply URI transformation right in the anchor element for additional security + +); + /** * Renders Markdown text provided by the user. */ const NeoMarkdownChart = (props: ChartProps) => { + // Define custom components for Markdown elements + const components = { + table: CustomTable, + th: CustomTh, + td: CustomTd, + a: CustomATag, + }; + // Records are overridden to be a single element array with a field called 'input'. const { records } = props; const parameters = props.parameters ? props.parameters : {}; @@ -17,13 +44,18 @@ const NeoMarkdownChart = (props: ChartProps) => { : true; const markdown = records[0].input; const modifiedMarkdown = replaceGlobalParameters ? replaceDashboardParameters(markdown, parameters) : markdown; - // TODO: we should check if the gfm plugin has an impact on the standard security provided by ReactMarkdown return (
- + +
); }; diff --git a/src/chart/table/TableActionsHelper.ts b/src/chart/table/TableActionsHelper.ts index 7b946df2e..1dc3a4508 100644 --- a/src/chart/table/TableActionsHelper.ts +++ b/src/chart/table/TableActionsHelper.ts @@ -15,17 +15,17 @@ export const getCheckboxes = (actionsRules, rows, getGlobalParameter) => { // If the parameter is an array (to be expected), iterate over it to find the rows to check. if (Array.isArray(values)) { values.forEach((value) => { - rows.forEach((row, index) => { + rows.forEach((row) => { if (row[fieldName] == value) { - selection.push(index); + selection.push(row.id); } }); }); } else { // Else (special case), still check the row if it's a single value parameter. - rows.forEach((row, index) => { + rows.forEach((row) => { if (row[fieldName] == values) { - selection.push(index); + selection.push(row.id); } }); } @@ -35,7 +35,8 @@ export const getCheckboxes = (actionsRules, rows, getGlobalParameter) => { export const updateCheckBoxes = (actionsRules, rows, selection, setGlobalParameter) => { if (hasCheckboxes(actionsRules)) { - const selectedRows = rows.filter((_, i) => selection.includes(i)); + const selectedRows = rows.filter((row) => selection.includes(row.id)); + console.log(selectedRows); let rules = actionsRules.filter((rule) => rule.condition && rule.condition == 'rowCheck'); rules.forEach((rule) => { const parameterValues = selectedRows.map((row) => row[rule.value]).filter((v) => v !== undefined); diff --git a/src/chart/table/TableChart.tsx b/src/chart/table/TableChart.tsx index d64633056..57e579207 100644 --- a/src/chart/table/TableChart.tsx +++ b/src/chart/table/TableChart.tsx @@ -3,6 +3,7 @@ import { DataGrid, GridColumnVisibilityModel } from '@mui/x-data-grid'; import { ChartProps } from '../Chart'; import { evaluateRulesOnDict, + evaluateSingleRuleOnDict, generateClassDefinitionsBasedOnRules, useStyleRules, } from '../../extensions/styling/StyleRuleEvaluator'; @@ -24,8 +25,6 @@ import Button from '@mui/material/Button'; import { extensionEnabled } from '../../utils/ReportUtils'; import { getCheckboxes, hasCheckboxes, updateCheckBoxes } from './TableActionsHelper'; -const TABLE_HEADER_HEIGHT = 32; -const TABLE_FOOTER_HEIGHT = 62; const TABLE_ROW_HEIGHT = 52; const HIDDEN_COLUMN_PREFIX = '__'; const theme = createTheme({ @@ -92,7 +91,6 @@ export const NeoTableChart = (props: ChartProps) => { const useStyles = generateClassDefinitionsBasedOnRules(styleRules); const classes = useStyles(); const tableRowHeight = compact ? TABLE_ROW_HEIGHT / 2 : TABLE_ROW_HEIGHT; - const pageSizeReducer = compact ? 3 : 1; const columnWidthsType = props.settings && props.settings.columnWidthsType ? props.settings.columnWidthsType : 'Relative (%)'; @@ -209,16 +207,14 @@ export const NeoTableChart = (props: ChartProps) => { ); }); - const availableRowHeight = (props.dimensions.height - TABLE_HEADER_HEIGHT - TABLE_FOOTER_HEIGHT) / tableRowHeight; - const tablePageSize = compact - ? Math.round(availableRowHeight) - pageSizeReducer - : Math.floor(availableRowHeight) - pageSizeReducer; - const pageNames = getPageNumbersAndNamesList(); + const customStyles = { '&.MuiDataGrid-root .MuiDataGrid-footerContainer > div': { marginTop: '0px' } }; + const commonGridProps = { key: 'tableKey', - headerHeight: 32, - density: compact ? 'compact' : 'standard', + columnHeaderHeight: 32, + rowHeight: tableRowHeight, + autoPageSize: true, rows: rows, columns: columns, columnVisibilityModel: columnVisibilityModel, @@ -234,15 +230,14 @@ export const NeoTableChart = (props: ChartProps) => { } }, checkboxSelection: hasCheckboxes(actionsRules), - selectionModel: getCheckboxes(actionsRules, rows, props.getGlobalParameter), - onSelectionModelChange: (selection) => updateCheckBoxes(actionsRules, rows, selection, props.setGlobalParameter), - pageSize: tablePageSize > 0 ? tablePageSize : 5, - rowsPerPageOptions: rows.length < 5 ? [rows.length, 5] : [5], - disableSelectionOnClick: true, + rowSelectionModel: getCheckboxes(actionsRules, rows, props.getGlobalParameter), + onRowSelectionModelChange: (selection) => updateCheckBoxes(actionsRules, rows, selection, props.setGlobalParameter), + disableRowSelectionOnClick: true, components: { ColumnSortedDescendingIcon: () => <>, ColumnSortedAscendingIcon: () => <>, }, + // TODO: if mixing and matching row and cell styling, row rules MUST be set first or will not populate correctly getRowClassName: (params) => { return ['row color', 'row text color'] .map((e) => { @@ -253,7 +248,19 @@ export const NeoTableChart = (props: ChartProps) => { getCellClassName: (params) => { return ['cell color', 'cell text color'] .map((e) => { - return `rule${evaluateRulesOnDict({ [params.field]: params.value }, styleRules, [e])}`; + let trueRulesList = ['']; + let trueRule; + for (const [index, rule] of styleRules.entries()) { + if (rule.targetField) { + if (rule.targetField === params.field) { + trueRule = `rule${evaluateSingleRuleOnDict({ [rule.field]: params.row[rule.field] }, rule, index, [e])}`; + } + } else { + trueRule = `rule${evaluateSingleRuleOnDict({ [params.field]: params.value }, rule, index, [e])}`; + } + trueRulesList.push(trueRule); + } + return trueRulesList.join(' '); }) .join(' '); }, @@ -308,15 +315,12 @@ export const NeoTableChart = (props: ChartProps) => { {...commonGridProps} getRowHeight={() => 'auto'} sx={{ - '&.MuiDataGrid-root--densityCompact .MuiDataGrid-cell': { py: '3px' }, - '&.MuiDataGrid-root--densityCompact .MuiDataGrid-cell:has(button)': { py: '0px' }, - '&.MuiDataGrid-root--densityStandard .MuiDataGrid-cell': { py: '15px' }, - '&.MuiDataGrid-root--densityComfortable .MuiDataGrid-cell': { py: '22px' }, + ...customStyles, '&.MuiDataGrid-root .MuiDataGrid-cell': { wordBreak: 'break-word' }, }} /> ) : ( - + )} diff --git a/src/config/ReportConfig.tsx b/src/config/ReportConfig.tsx index a8e716d52..be72ffb9d 100644 --- a/src/config/ReportConfig.tsx +++ b/src/config/ReportConfig.tsx @@ -421,6 +421,18 @@ const _REPORT_TYPES = { type: SELECTION_TYPES.NUMBER, default: 0.25, }, + displayYAxis: { + label: 'Display Y axis', + type: SELECTION_TYPES.LIST, + values: [true, false], + default: true, + }, + displayYGridLines: { + label: 'Display Y grid lines', + type: SELECTION_TYPES.LIST, + values: [true, false], + default: true, + }, }, }, pie: { diff --git a/src/extensions/forms/chart/NeoForm.tsx b/src/extensions/forms/chart/NeoForm.tsx index 9ae9c9109..b1608c644 100644 --- a/src/extensions/forms/chart/NeoForm.tsx +++ b/src/extensions/forms/chart/NeoForm.tsx @@ -7,6 +7,7 @@ import { REPORT_LOADING_ICON } from '../../../report/Report'; import debounce from 'lodash/debounce'; import { RUN_QUERY_DELAY_MS } from '../../../config/ReportConfig'; import NeoParameterSelectionChart from '../../../chart/parameter/ParameterSelectionChart'; +import { checkParametersNameInGlobalParameter, extractAllParameterNames } from '../../../utils/parameterUtils'; enum FormStatus { DATA_ENTRY = 0, // The user is filling in the form. @@ -42,6 +43,14 @@ const NeoForm = (props: ChartProps) => { }); } + const isParametersDefined = (cypherQuery: string | undefined) => { + const parameterNames = extractAllParameterNames(cypherQuery); + if (props.parameters) { + return checkParametersNameInGlobalParameter(parameterNames, props.parameters); + } + return false; + }; + useEffect(() => { // If the parameters change after the form is completed, reset it, as there might be another submission. if (status == FormStatus.SUBMITTED) { @@ -77,7 +86,7 @@ const NeoForm = (props: ChartProps) => {