From 14e751885f4d02564954292bdc3297293d44ec5a Mon Sep 17 00:00:00 2001 From: David Beal Date: Mon, 28 Oct 2024 22:22:24 +0100 Subject: [PATCH 1/8] [ADD] polars_process: process polars dataframe from file --- polars_process/README.rst | 122 +++++ polars_process/__init__.py | 2 + polars_process/__manifest__.py | 34 ++ polars_process/data/action.xml | 10 + polars_process/data/demo.xml | 44 ++ polars_process/models/__init__.py | 4 + polars_process/models/df_field.py | 34 ++ polars_process/models/df_source.py | 105 ++++ polars_process/models/ir_model_fields.py | 14 + polars_process/models/model_map.py | 40 ++ polars_process/pyproject.toml | 3 + polars_process/readme/CONTRIBUTORS.md | 3 + polars_process/readme/DESCRIPTION.md | 26 + polars_process/security/ir.model.access.xml | 41 ++ polars_process/static/description/icon.png | Bin 0 -> 2605 bytes polars_process/static/description/index.html | 466 ++++++++++++++++++ polars_process/tests/__init__.py | 1 + polars_process/tests/files/4_fields.xlsx | Bin 0 -> 5432 bytes .../tests/files/missing_required_column.xlsx | Bin 0 -> 5340 bytes polars_process/tests/files/wrong_date.xlsx | Bin 0 -> 5415 bytes polars_process/tests/test_module.py | 45 ++ polars_process/views/df_field.xml | 27 + polars_process/views/df_source.xml | 83 ++++ polars_process/views/menu.xml | 28 ++ polars_process/views/model_map.xml | 69 +++ polars_process/wizards/__init__.py | 1 + polars_process/wizards/df_process_wiz.py | 119 +++++ polars_process/wizards/df_process_wiz.xml | 52 ++ requirements.txt | 3 + 29 files changed, 1376 insertions(+) create mode 100644 polars_process/README.rst create mode 100644 polars_process/__init__.py create mode 100644 polars_process/__manifest__.py create mode 100644 polars_process/data/action.xml create mode 100644 polars_process/data/demo.xml create mode 100644 polars_process/models/__init__.py create mode 100644 polars_process/models/df_field.py create mode 100644 polars_process/models/df_source.py create mode 100644 polars_process/models/ir_model_fields.py create mode 100644 polars_process/models/model_map.py create mode 100644 polars_process/pyproject.toml create mode 100644 polars_process/readme/CONTRIBUTORS.md create mode 100644 polars_process/readme/DESCRIPTION.md create mode 100644 polars_process/security/ir.model.access.xml create mode 100644 polars_process/static/description/icon.png create mode 100644 polars_process/static/description/index.html create mode 100644 polars_process/tests/__init__.py create mode 100644 polars_process/tests/files/4_fields.xlsx create mode 100644 polars_process/tests/files/missing_required_column.xlsx create mode 100644 polars_process/tests/files/wrong_date.xlsx create mode 100644 polars_process/tests/test_module.py create mode 100644 polars_process/views/df_field.xml create mode 100644 polars_process/views/df_source.xml create mode 100644 polars_process/views/menu.xml create mode 100644 polars_process/views/model_map.xml create mode 100644 polars_process/wizards/__init__.py create mode 100644 polars_process/wizards/df_process_wiz.py create mode 100644 polars_process/wizards/df_process_wiz.xml create mode 100644 requirements.txt diff --git a/polars_process/README.rst b/polars_process/README.rst new file mode 100644 index 000000000..7d94bdb5c --- /dev/null +++ b/polars_process/README.rst @@ -0,0 +1,122 @@ +============== +Polars Process +============== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:3fb8a401fe8c3d73e23b477915bbd9ff0b2bcb331711726a4fd5be280ad53d5d + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--backend-lightgray.png?logo=github + :target: https://github.com/OCA/server-backend/tree/18.0/polars_process + :alt: OCA/server-backend +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-backend-18-0/server-backend-18-0-polars_process + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-backend&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +From an imported spreadsheet (xlsx) or db query, this module allows to +transform data in Polars dataframe and process them according to rules +in order to: + +- filter data and display +- obtain another dataframe with only the expected data to use in Odoo + +A such dataframe can help to prepare data in order to be used to +create/update or import + +Typical use case: + +You receive files from your vendors and these files have many difference +(column names, number of columns, dirty paging) but contains data +related to same concepts. Then you want apply them a common process to +automate things. For that you need to transform/arrange data to the same +way + +Why dataframe ? + +- a dataframe is a kind of in-memory dataset on which you can operate +- you can operates on your entire dataset a bit like with a database + but in memory: you don't need to iterate on each line to perform + operations +- the operations are powerful: filter, add column resulting from + calculation, select a subset of data + +Why Polars ? + +- performance: code in rust +- environment consideration +- dynamic project + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Akretion + +Contributors +------------ + +- Akretion + + - David BEAL + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-bealdav| image:: https://github.com/bealdav.png?size=40px + :target: https://github.com/bealdav + :alt: bealdav + +Current `maintainer `__: + +|maintainer-bealdav| + +This module is part of the `OCA/server-backend `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/polars_process/__init__.py b/polars_process/__init__.py new file mode 100644 index 000000000..aee8895e7 --- /dev/null +++ b/polars_process/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/polars_process/__manifest__.py b/polars_process/__manifest__.py new file mode 100644 index 000000000..424d0dc6a --- /dev/null +++ b/polars_process/__manifest__.py @@ -0,0 +1,34 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Polars Process", + "version": "18.0.1.0.0", + "summary": "Allow to create a Polars model_map from file or db query and " + "process it according to rules", + "category": "Reporting", + "license": "AGPL-3", + "author": "Akretion, Odoo Community Association (OCA)", + "development_status": "Alpha", + "website": "https://github.com/OCA/server-backend", + "maintainers": ["bealdav"], + "depends": [ + "contacts", + ], + "external_dependencies": { + "python": [ + "polars", + "fastexcel", + ] + }, + "data": [ + "data/action.xml", + "data/demo.xml", + "security/ir.model.access.xml", + "wizards/df_process_wiz.xml", + "views/model_map.xml", + "views/df_field.xml", + "views/df_source.xml", + "views/menu.xml", + ], + "installable": True, +} diff --git a/polars_process/data/action.xml b/polars_process/data/action.xml new file mode 100644 index 000000000..79956c9e0 --- /dev/null +++ b/polars_process/data/action.xml @@ -0,0 +1,10 @@ + + + + βš™ Populate data source + + + code + env["df.source"]._populate() + + diff --git a/polars_process/data/demo.xml b/polars_process/data/demo.xml new file mode 100644 index 000000000..92bcdec35 --- /dev/null +++ b/polars_process/data/demo.xml @@ -0,0 +1,44 @@ + + + + stop + import_preprocess + + + + + + + Country + + + + + Name + + + + + + Street + + + + + + 2nd Street + street2 + + + + + Date + + + + + + Colour + Color + + diff --git a/polars_process/models/__init__.py b/polars_process/models/__init__.py new file mode 100644 index 000000000..7bea59dc5 --- /dev/null +++ b/polars_process/models/__init__.py @@ -0,0 +1,4 @@ +from . import model_map +from . import df_field +from . import df_source +from . import ir_model_fields diff --git a/polars_process/models/df_field.py b/polars_process/models/df_field.py new file mode 100644 index 000000000..c07d16e94 --- /dev/null +++ b/polars_process/models/df_field.py @@ -0,0 +1,34 @@ +from odoo import fields, models + + +class FileField(models.Model): + _name = "df.field" + _inherit = ["mail.thread"] + _description = "Configuration de l'import de champ" + _order = "field_id ASC" + _rec_name = "field_id" + _rec_names_search = ["field_id"] + + model_map_id = fields.Many2one( + comodel_name="model.map", required=True, ondelete="cascade" + ) + sequence = fields.Integer() + field_id = fields.Many2one( + comodel_name="ir.model.fields", + ondelete="cascade", + required=True, + domain="[('model_id', '=', model_id)]", + ) + model_id = fields.Many2one( + comodel_name="ir.model", + related="model_map_id.model_id", + readonly=True, + ) + name = fields.Char(help="Name field in the source file (spreadsheet)") + renamed = fields.Char(help="If specified, renamed in model_map") + required = fields.Boolean( + help="Prevent to import missing data if field is missing in some records", + ) + check_type = fields.Boolean( + help="Check data type is compatible", + ) diff --git a/polars_process/models/df_source.py b/polars_process/models/df_source.py new file mode 100644 index 000000000..17f7e9a90 --- /dev/null +++ b/polars_process/models/df_source.py @@ -0,0 +1,105 @@ +import base64 +from pathlib import Path + +from odoo import _, fields, models +from odoo.modules.module import get_module_path + + +class DfSource(models.Model): + _name = "df.source" + _description = "Dataframe data source" + _rec_name = "name" + _rec_names_search = ["name"] + + model_map_id = fields.Many2one( + comodel_name="model.map", required=True, ondelete="cascade" + ) + name = fields.Char(help="Supported files: .xlsx") + sequence = fields.Integer() + state = fields.Selection(selection=[('draft', "Draft"), ("ready", "Ready"), ("done", "Done")], default="draft") + rename = fields.Boolean(help="Display renamed Dataframe in wizard") + template = fields.Binary(string="File", attachment=False) + readonly = fields.Boolean(help="Imported records from module are readonly created") + + def start(self): + self.ensure_one() + vals = { + "filename": self.name, + "df_source_id": self.id, + "model_map_id": self.model_map_id.id, + } + if ".xlsx" in self.name: + vals["file"] = base64.b64encode(self._get_file()) + transient = self.env["df.process.wiz"].create(vals) + action = self.env.ref("polars_process.df_process_wiz_action")._get_action_dict() + action["res_id"] = transient.id + self.state = "done" + return action + + def reset_process(self): + self.ensure_one() + self._reset_process() + + def _reset_process(self): + "Inherit me" + self.state = "draft" + + def _populate(self): + def create_attach(myfile, addon, idstring, relative_path): + with open(myfile, "rb") as f: + name = f.name[f.name.find(addon) :] + vals = { + "model_map_id": self.env.ref(idstring).id, + "name": name, + "readonly": True, + "rename": True, + } + vals.update(self._file_hook(name)) + self.env[self._name].sudo().create(vals) + + self.env[self._name].search([("template", "=", False)]).unlink() + paths = self._get_test_file_paths() + for addon, data in paths.items(): + relative_path = data["relative_path"] + idstring = data["xmlid"] + if self.env.ref(idstring): + mpath = Path(get_module_path(addon)) / relative_path + for mfile in tuple(mpath.iterdir()): + create_attach(mfile, addon, idstring, relative_path) + action = self.env.ref("polars_process.df_source_action")._get_action_dict() + return action + + def _get_file(self, name=None): + # TODO Clean + if self.template: + return self.template + name = self.name or name + module = name[: name.find("/")] + relative = self._get_test_file_paths().get(module) + relative = relative and relative.get("relative_path") + if relative: + path = Path(get_module_path(module)) + path = path / relative / name[name.rfind("/") + 1 :] + with open(path, "rb") as f: + return f.read() + + def _get_test_file_paths(self): + """ + You may override if you want populate files in your module + returns: + {"module_name": { + "relative_path": "tests/files", + "xmlid": "model_map_xml_id"} + } + } + """ + return { + "polars_process": { + "relative_path": "tests/files", + "xmlid": "polars_process.model_map_contact", + } + } + + def _file_hook(self, file): + "Overide me in your own module" + return {} diff --git a/polars_process/models/ir_model_fields.py b/polars_process/models/ir_model_fields.py new file mode 100644 index 000000000..14d2039c8 --- /dev/null +++ b/polars_process/models/ir_model_fields.py @@ -0,0 +1,14 @@ +from odoo import api, models + + +class IrModelFields(models.Model): + _inherit = "ir.model.fields" + + @api.depends("field_description", "model") + def _compute_display_name(self): + super()._compute_display_name() + if self.env.context.get("technical_name"): + for field in self: + if self.env.context.get("technical_name"): + field.display_name = field.name + return diff --git a/polars_process/models/model_map.py b/polars_process/models/model_map.py new file mode 100644 index 000000000..83642a33b --- /dev/null +++ b/polars_process/models/model_map.py @@ -0,0 +1,40 @@ +from odoo import fields, models + + +class ModelMap(models.Model): + _name = "model.map" + _inherit = "mail.thread" + _description = "File Configuration" + _rec_name = "code" + _rec_names_search = ["model_id", "code"] + + model_id = fields.Many2one( + comodel_name="ir.model", + required=True, + copy=False, + ondelete="cascade", + tracking=True, + ) + code = fields.Char(help="Allow to browse between several identical models") + rename = fields.Boolean(help="Rename Dataframe fields") + action = fields.Selection( + selection=[ + ("display", "Display"), + ("import", "Import data"), + ], + default="display", + tracking=True, + help="Some other behaviors can be implemented", + ) + on_fail = fields.Selection( + selection=[("stop", "Stop"), ("skip", "Skip record (TODO)")], + default="stop", + tracking=True, + help="What should be the behavior in case of failure regarding constraint " + "fields (required, format, etc)\n\n" + " - Stop: stop the process by raising an exception\n" + " - Skip record: current line'll be ignored from the next process", + ) + field_ids = fields.One2many( + comodel_name="df.field", inverse_name="model_map_id", copy=True + ) diff --git a/polars_process/pyproject.toml b/polars_process/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/polars_process/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/polars_process/readme/CONTRIBUTORS.md b/polars_process/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..a388703b6 --- /dev/null +++ b/polars_process/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- Akretion + + > - David BEAL \<\> diff --git a/polars_process/readme/DESCRIPTION.md b/polars_process/readme/DESCRIPTION.md new file mode 100644 index 000000000..9d5d69103 --- /dev/null +++ b/polars_process/readme/DESCRIPTION.md @@ -0,0 +1,26 @@ +From an imported spreadsheet (xlsx) or db query, this module allows to transform data in Polars dataframe and process them according to rules in order to: + +- filter data and display +- obtain another dataframe with only the expected data to use in Odoo + +A such dataframe can help to prepare data in order to be used to create/update or import + +Typical use case: + +You receive files from your vendors and these files have many difference (column names, number of columns, dirty paging) but contains data related to same concepts. +Then you want apply them a common process to automate things. +For that you need to transform/arrange data to the same way + + +Why dataframe ? + +- a dataframe is a kind of in-memory dataset on which you can operate +- you can operates on your entire dataset a bit like with a database but in memory: you don't need to iterate on each line to perform operations +- the operations are powerful: filter, add column resulting from calculation, select a subset of data + + +Why Polars ? + +- performance: code in rust +- environment consideration +- dynamic project diff --git a/polars_process/security/ir.model.access.xml b/polars_process/security/ir.model.access.xml new file mode 100644 index 000000000..3f311460e --- /dev/null +++ b/polars_process/security/ir.model.access.xml @@ -0,0 +1,41 @@ + + + Dataframe + + + + + + + + + + Df Field + + + + + + + + + + df.process.wiz + + + + + + + + + + df.source + + + + + + + + diff --git a/polars_process/static/description/icon.png b/polars_process/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d1d2b572970f1b1180a2fef75dc439bffb034de6 GIT binary patch literal 2605 zcmV+|3exq7P)^6 zrc5)2DbtK$$}~ea1ozl_)bf6v8Nl{M&h_PP``crr>kS+4>^^UL?T7`y`ZD+SN@ug1 z`o=|DGWf~4+z>oia!40tJI|P%esa1!ST)Y)2@=vp4@dYzgghq1!^`z{0eEtc{gzV) z;Oq-c0A4<1^>bJ?#j|>fr^82HYiA6!Fk@t}(?`B^(CP^iON)KgW$rgmWWQUR3E=Nf zIcALtr0I=hq=mAZowQ^-c_#kcxTeH^=#G%<@{>0@=p*$k0D{2kDW2-T=ALY10o1H< zcsb&W+Zg~{eyY06eWi_-?>lQ$pzQtpCbw>)l{@}?OKRUsLdqyR(ZJR=>PZ4?XSfA1 ze39b;V6rW|$|eqCx%F^ix7+0>XllS=E@EEm?`sIJJ z1K2pb>y^1(iBFO|Wt=1itUG|Cn>t?;pz}NQsBQq~MSflYNubomseF1? zVHZXwj*Y0`C$qZaj^PEoeKPBvQ&|AsSm@d?v-?Ur4WP|SwRxjI$<=lmKu?go(?tyt zWgBL8ZDxs? z8)eJ?Xs>P31L$wqFCMh+xnu;ee^sm1&?ihIi0DQ_PZo(Y`p5c>Zk;zo0J!K#bhDH0 zJju$PZqeHeyv>lj63|9jOT@)=`l16Txy#`pqbL)_K8@Ks^TQ)IH>lieQK9ekd9FZ+ zcxYS-_E6~&K3k&}KPHHwcK=GjBxg8c!a$2JJrLVr$v-0q5kRSplT`ZnoH){A+wtr( z&5X?`eDG+y%CIK4Zu6lWKZmELdRCTtqI%Op*+eV1xuOezeGp3cf`eK1i9Ns*KP+=^ zt8^;6`FobG+`|K6WIs6m3nM7>iN;0XYi;>myu4(8CU42BZd4nk}v4sDbv9eEZj%qj3ovOH>- z%TLb!FyHAX=a2F4UD=wF2UWo@zsjt+X#kLC;;T~O_)K)zjiF#f{_uY**PhQ9|-R)=@Z<}Dd-hdN{#u*c;Eh2tpKE0f9G7oy`5fi_UJgpi_dRmJiFfpV0)!=eI#=m6YI;}>&xW{MLd`k9KG{!=WQn~ zd5vZ_wQyG+fblupzkiULGS8mN#tRMx!1=pOl!P)dN!m+t7(~Ljuazkwi(ywkUG*)% zAbeS0E8FyW&f)qD06UkrMyV_1iC9=(ONX3Xy1XfwB zn7Aw-VrcVaPw%tc?4$u4e)ewEj@g^TQnX1@8X%7Z`X;j1&ghwx%LyV;o*w|PcSWmo zSZb6xR7WuKgaAk)=KRT550Zwqg&B-^q97l=WA^5-6m3C}2FN1;pwJR3wDczal?ox> z%*$sLdVeKNrT9}Z|B#;WkPw5i4F{}ud#Ef{-1S)7cuP23m@*=UrvLv$49fOhHA;<6 zAGxT|KTw8#R=!$_aquX#g!Ggc;0gI0(S3qA3$w08zx~TBAbgZi*_Fi#$|QtRV=8j< zK(gn{rrCoH8}Gz^=!C1~=|CLH&a^Pnp&h$PSUtt_v-z&;9WXAT5;ToB3mFTjYEh7co9g=o1Eq!?Z@dAQEMH z0an#9ZC&8}R|9LH#d%}=CmL9-)$$ZV8)Z9cGmq7?*{ty1k`DDlD3fzJAcnIS#Xjv_ z=S*AvnFCE%nsro?b<9#*u&T)C2@*?+eTY=m0O&|j`CwFfHiI~nEuG+% zlF^k#egJP)cAjq5XJ-i0MGcilxfB=WtuTenP&VK(M1O$P%M+& P00000NkvXXu0mjf2J`yU literal 0 HcmV?d00001 diff --git a/polars_process/static/description/index.html b/polars_process/static/description/index.html new file mode 100644 index 000000000..969020a9b --- /dev/null +++ b/polars_process/static/description/index.html @@ -0,0 +1,466 @@ + + + + + +Polars Process + + + +
+

Polars Process

+ + +

Alpha License: AGPL-3 OCA/server-backend Translate me on Weblate Try me on Runboat

+

From an imported spreadsheet (xlsx) or db query, this module allows to +transform data in Polars dataframe and process them according to rules +in order to:

+
    +
  • filter data and display
  • +
  • obtain another dataframe with only the expected data to use in Odoo
  • +
+

A such dataframe can help to prepare data in order to be used to +create/update or import

+

Typical use case:

+

You receive files from your vendors and these files have many difference +(column names, number of columns, dirty paging) but contains data +related to same concepts. Then you want apply them a common process to +automate things. For that you need to transform/arrange data to the same +way

+

Why dataframe ?

+
    +
  • a dataframe is a kind of in-memory dataset on which you can operate
  • +
  • you can operates on your entire dataset a bit like with a database +but in memory: you don’t need to iterate on each line to perform +operations
  • +
  • the operations are powerful: filter, add column resulting from +calculation, select a subset of data
  • +
+

Why Polars ?

+
    +
  • performance: code in rust
  • +
  • environment consideration
  • +
  • dynamic project
  • +
+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

bealdav

+

This module is part of the OCA/server-backend project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/polars_process/tests/__init__.py b/polars_process/tests/__init__.py new file mode 100644 index 000000000..d9b96c4fa --- /dev/null +++ b/polars_process/tests/__init__.py @@ -0,0 +1 @@ +from . import test_module diff --git a/polars_process/tests/files/4_fields.xlsx b/polars_process/tests/files/4_fields.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..815bedfc2aba0d8a63554938426a0d7dd061f396 GIT binary patch literal 5432 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 literal 0 HcmV?d00001 diff --git a/polars_process/tests/files/missing_required_column.xlsx b/polars_process/tests/files/missing_required_column.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c6f9f226f49d09d86e0380b1b372de298abac1f2 GIT binary patch literal 5340 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 literal 0 HcmV?d00001 diff --git a/polars_process/tests/files/wrong_date.xlsx b/polars_process/tests/files/wrong_date.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..52e5c8213610202a04a622234479ab8f91800977 GIT binary patch literal 5415 zcmaJ_1z6L2_aCu=z=%5wZ|K%`4T!qJ@)Q&PGc zUgrHjS6<)$_3YVi+w=U+`R>H;b3W%N$Y5cU0dR3~0VXgFO~5t5zxu9cZ(`-Z#fiQa z#Wu@*;wA{%bPr=aw zSsV5l?z=L&p{kmpm<@N0JPTU8F6>;npglQW?IZ$El@JoF_R;ds_PSBxoq6t#G0*Up zci}Pv7)wTL#sE>VV0#@^XPyh=ki`JawFrovnOe@cH+Fph+}e`Q21a|w?csy3>I`x8 zPM@F2=6Vze)I-1~L3pk+CZ082vzzgRw+OhU;Ur1)iyNOQhN`0I&*QsRl9NemYZmQo z4fjAj^^gE=Ge>tgqo=g&MkYD+1HEVAS{Y|ui=+xNIJkkSyr~;kLFmN<02KZ;Ohi|A zxL9#HBkU~=5eQ387i+6XWu(m%H*v!u8}^Jfhwh8piCF4UF@R~}0%S_86oq9N+2`%V zoXZ&!lYEv*38Gj5{Mq^xSFM>e%N6QojcnEK7K0`cg&NL)$+opABcbH`eGKZrBrWl7 zPW_3V@6$VZJr9T6HU~USjMV6%__I~6K)x!8X`dYFxA2}5{Gobfq2tr9P<_ znY8WUZLZWArHRZ3z9=6o;F@s${7UGn5>Lq-E=uI)A&a+|d7dn*MDOS})10w)hxQQt zj0K}^`D4zingOMDf*zDsWJu2EOY(_If4BLR_4FmPY&_4fTSdz|iyrnJW{Ucf_-Rq5 z-)5X~4Al*~O;I9-G&^hA)GFO~F?84hOP9k0$mG)R_eHId>(C$4;N+a66ZeOSo+cI7N7BkwbTBc8pX;Y@Q#^0~{S$TvtUDsawA z0jdDhy786)ZwA5O6mR|j^K0Xb3nl}>VW24N>1003;Uepfc&zsttK(bdYt0bMlf8ajw6Ix^4M60!Oc0gKqmxb?!- zcndD&iZ_FK7DU7CP*z%s80ba`?aisuA*a`aFd61Y7)kEEq7Qu@3M#xWp0NCTA3sBu%-OHBG65T!wj zjKvj>gSC~GN+dAqu=**li=|~-5VI3^s5A+XS$>?C@_$ks7&=#uk1^{3E2?ZGz?64p zQD$3sK=Q-@G*E`zHLy=*=v7p$u^NsK|0Ek`J#uT$S711Lj^;rZWOzQA^wCF!;ju36 zf_FR3Z}FLcYLjj#gO?=o6*vaA+*`GFP{npo_%}>D4MU?4h>S1*?yZ_IYGqIrR`7QB zA|{>fIsDBoO_q(-wDw!2I=-n+((xd%XLg)GQ+^Zd2i?5BI?Hh$#Maz|w~!IcYP?*} zEsaC(gx-&xk_)%X7j+mbT_9~4ub5hzEn6SMNpy@8oleT38UOaJoL{GJn7~%^!wVMb zP({l@?1!T){{6t*nmOZp+s|MU5M|mSp*z9VaO^;py#b{WPa^=y2N9Oyl+j z0hc}(-j_Nl?8aJt+EIrMCwNMBOLV_-Q~vy&s^hq0fbAIr;0)KxDXR@o?m|(n78a8C zo%Y;`e?ohx&yjOtQHs-h&#rK940Mf$FWobFdj*TcWWTHN zn?Iq^!Q8~e(Shs7$9;6UH>krAQv$>dn`JBng$_e>a+6<&W=m7dI|Ai0@~HhpPi|@AsLWLo$5!M zW3)@fjO2zaIcccC(}4U_*W;)4OJBtoZ?fS4lAl-CC@s`1A(=XWv5dNgpp1xcOqOag zZTUpZ++lXsKPgWxhS`V>iX{ao5zTX&QVl>*XTrXaHV(qIhqkKt$)D9t+7ExJv3gFDH24_DJy%n{= z1D&gCLE@@vcr3B(F-xczZY7w9Z@xd#q-v~Ps?s=y6`EEFVChwmOn3uWsWx8|)~~lsNsPl};(8fI z{>Bldi(MSIJl+WK7P3n>>kY5NRwQOgK1pA-EUQP1*z0EB)4iqHwCb-uOK`iFwjB2D zq!#uDj{_097pYukON~8BU1>Ec-p@B)5p`xQl#_1V!RvVFJ(N~4@t}WA3%?&l2~#EP z_8YK*fOa*9@qpIHK^4n$;HS1`k0gYtWTpW&2_IX8W$9;#zfaQna`d~u^1kI?IOt*N z$-K)8tdv{fZa;N^)=khQ)Vg1^(9^4JlGB}|c? zM42W;1`8tWlPjHlH4c%M?QvO-HZ_eUQA=BdykT{C5!#}8>dVUi+&8vEq$UMM1h}ZsZ>r)FsPGy~P<0_q%*$e}svHlFU*+&2-{tceP$Cb=u$dARnlV+~XoXo`o~ zmO9kg!cn7uNpkZBKN&L-CHr{-=?LK}VH#Y>-wtyZ6-Ie7&bV*Y^}d%aZ;*85rK;6? z&wJ{SlG8;mHclB#1f!1hkiS1Oin+Px(|BP8luD2V$+JwV47wC6yFZ(^k~D1~%w?4E z<^cEonNQfxP^X9Yk&fN|3JoFcU`>#J8<8&EK>>ATQC|Qs`?w~g0V@nt{``V6ORe?( zB?9~cOzu9-iuxcr$$1GxV^fwe-q&AWW>!=_N@&~o|SXbeoKm+PL%{TY0t$DZcZg8`*z!#OrC9-KYv z;|0-$M-0^CjGZO^nMzRS8zXwAG@EYth#ONy3SMhxOuIW(DUwAcGt(ZJ=*Y-#9lH%) z`OW-W!g~ezXu|7YZeVX>tn6rSVPp1#z(mHv<*@D(1Rka_bW)|V;0F}S7AmPY(QP{b zEZf(gqzVj;D=)9#*J&a&u{bT8jmtPcVT)W02sC;#%1If?C#|!=NUe3c{jsj5DhT*z z@O{$Cg9xiJROf^60oAXggbYKSf*T;&rf?DZ72`}9%z+Pg?#KhPmoO9umu+4z_A-YU z!;{P)392J0U+vo05sWTT&3aGNM8pdw-2zL~`h)P*dS_r;8^Nc+o677hlTeUxQP=(40gT2JsM)nEKv8cBQ=!T1R7_A0#5v5-I}7sGG7} zof2#%U5ikPV|eA{`XXjb;00F6+m_^Q<6B^rZfrSv>YC!0ZSVYRo5Hra)BsT}wn1#~ z+07DBqy6f+j6zzA9_1?9I!++L4u!|SK`L2HKY1z?>ucm#Uc$?DKd&G8eP6K85N3}AR}~Y zb4!5pRX9s_^!$!0)DD+7SyJEOW~0FA?PiQ%kd6shc;KQTLbkS$(Pj!d6)itknQ4K| zS=o}*9qSKTf14p!=2i#L~)z%6aODO@gyPjWKk!Cl82A>nUc!IIi`8jt<1HtQKQrRRmH;z3=f6TVe>HjcwZ7V*0R3_ z)ORzu6e$?^V-H8gBBO}=Q$+{l5!6S2(iw;9KaM=OUrSCez9zowqdb)-XV$QIKf&v% z)ffu~LXCh*mdQj>1-l(r%CCExJcP4#g#IC3f?C=J{?y_!Bzgc;zUqoCh2*fdn)l4* zeeW7u0`#;iR`=_e$DR6`Y=I3Pa5!#&*@{WhY4X&=fBiJnWmBc336 zQNzW?0^k4>-s3===L^7^k#qVq0a*(m_ByAr=ZwG*Bt|$pouyy_*^B(~-Z^lRpb;md zBtj{}PKh_Fw5>0LN7lGmVqTrvve)}d*Iqk!KinN_fYOs5~kJsINEZc~_g?ia|w-A?-S6 z#ri6)backD6n%9ho1j{HIK6&G%S-KM`V{3=+P4JYdA_^!E^{I}&t9i`nAdp>xrLsV zG)TZH1NEEuw2^@3UX83TssP>5YR%HT$J7JPUfTY*wHoNpC3Zk_(q*zBXz8~{UvsGs zFYa7e>=oxw9FOgt-u z<5dXN7A#qq*x~4r-&T}L)pI+!flks_;VL5ItHK)wqLYMyNe1}2lDfWyL9e9#Tdpmr zepS3ahohG?Kjq%lQNOHgepS9c;GjqKpQ3v;)}!0sKZEk3s*O`#1GKjkLD-;Vs+$A7hO9Z}K!?WgcwMdp9H-LLA` zfdvh_KjjPIHTC}k;a|0{KfY-2`6*;q#(p0D4;1}s;CgBOw}G`Q1OLx6uOI`wN)rHp PclGkQY9g;7=wJT<4Lt-6 literal 0 HcmV?d00001 diff --git a/polars_process/tests/test_module.py b/polars_process/tests/test_module.py new file mode 100644 index 000000000..e7bafcad7 --- /dev/null +++ b/polars_process/tests/test_module.py @@ -0,0 +1,45 @@ +from lxml import etree + +from odoo.tests.common import TransactionCase + + +class TestModule(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env["df.source"]._populate() + cls.file_records = cls.env["df.source"].search([]) + + def test_missing_required_column(self): + wiz = self.get_wizard(self.file_records, "missing_required_column") + comment = sanitize(str(wiz.comment)) + root = etree.fromstring(comment) + self.assertEqual( + root.xpath('//div[@id="missing-columns-data"]')[0].text, + "['Street']", + ) + + def test_four_fields(self): + wiz = self.get_wizard(self.file_records, "4_fields") + comment = sanitize(str(wiz.comment)) + root = etree.fromstring(comment) + self.assertEqual( + len(root.xpath('//div[@id="missing-values-in-name"]')), + 1, + "Missing value in Name column", + ) + self.assertEqual( + len(root.xpath('//div[@id="missing-values-in-street"]')), + 1, + "Missing values in Street column", + ) + + def get_wizard(self, source_recs, file_str): + source = source_recs.filtered(lambda s, file_str=file_str: file_str in s.name) + action = source.start() + return self.env["df.process.wiz"].browse(action.get("res_id")) + + +def sanitize(string): + string = string.replace("
", "
") + return string diff --git a/polars_process/views/df_field.xml b/polars_process/views/df_field.xml new file mode 100644 index 000000000..c6a0e583b --- /dev/null +++ b/polars_process/views/df_field.xml @@ -0,0 +1,27 @@ + + + df.field + + + + + + + + + + + + + + + Df Field + df.field + list + df-field + + diff --git a/polars_process/views/df_source.xml b/polars_process/views/df_source.xml new file mode 100644 index 000000000..98a6e4269 --- /dev/null +++ b/polars_process/views/df_source.xml @@ -0,0 +1,83 @@ + + + df.source + +
+ +
+ + + + + + + + + + + + + + + + + df.source + + + + +
+ + + + + + + + + + + +
+ PASSWORD in string connexion'll be replaced by password field +
+
+
+ +
+
+ + + db.config + + + + + + + + + Database Config + db.config + list,form + db-config + + + +
diff --git a/polars_db_process/views/df_field.xml b/polars_db_process/views/df_field.xml new file mode 100644 index 000000000..238507479 --- /dev/null +++ b/polars_db_process/views/df_field.xml @@ -0,0 +1 @@ + diff --git a/polars_db_process/views/df_source.xml b/polars_db_process/views/df_source.xml new file mode 100644 index 000000000..6fae3bc79 --- /dev/null +++ b/polars_db_process/views/df_source.xml @@ -0,0 +1,62 @@ + + + df.source + + + + + + + + + + + + + + + df.source + + + + + + + Remove data for model map action on 'import' + + + {'accepted_file_extensions': '.xlsx,.sql'} + + + query and not db_conf_id + + + + + + df.source + + + + + + + + + + + diff --git a/polars_db_process/views/model_map.xml b/polars_db_process/views/model_map.xml new file mode 100644 index 000000000..238507479 --- /dev/null +++ b/polars_db_process/views/model_map.xml @@ -0,0 +1 @@ + diff --git a/polars_db_process/wizards/__init__.py b/polars_db_process/wizards/__init__.py new file mode 100644 index 000000000..9c2ab917e --- /dev/null +++ b/polars_db_process/wizards/__init__.py @@ -0,0 +1 @@ +from . import df_process_wiz diff --git a/polars_db_process/wizards/df_process_wiz.py b/polars_db_process/wizards/df_process_wiz.py new file mode 100644 index 000000000..f6b19c5b2 --- /dev/null +++ b/polars_db_process/wizards/df_process_wiz.py @@ -0,0 +1,80 @@ +import logging + +from odoo import _, exceptions, models + +logger = logging.getLogger(__name__) + + +class DfProcessWiz(models.TransientModel): + _inherit = "df.process.wiz" + + def _pre_process(self): + res = super()._pre_process() + if not self.file: + self._pre_process_query() + return res + + def _pre_process_query(self): + "You may inherit to set your own behavior" + if not self.df_source_id.db_conf_id: + raise exceptions.ValidationError( + _("Missing database configuration in your df source ") + ) + self._process_query() + + def _process_query(self): + self.ensure_one() + df = self.df_source_id.db_conf_id._read_sql(self.df_source_id.query) + if self.model_map_id: + if self.model_map_id.action == "import": + self._odoo_data_import(df) + + def _odoo_data_import(self, df): + model = self.model_map_id.model_id.model + vals_list = df.to_dicts() + mapper = {} + rebellious = {} + for vals in vals_list: + for key in self.env["model.map"]._get_touchy_fields_to_import().get(model): + if key in vals: + rebellious[key] = vals.pop(key) + uidstring = vals.pop("id") + nvals = { + x: val for x, val in vals.items() if x in self.env[model]._fields.keys() + } + if "parent_id" in nvals: + # here for product.category + # TODO move this specific behavior elsewhere + nvals["parent_id"] = mapper.get(nvals["parent_id"]) + rec = self.env[model].create(nvals) + mapper[uidstring] = rec.id + logger.info(f" >>> {vals}") + self._set_uidstring(uidstring, rec, model) + self._process_touchy_fields(rec, rebellious) + + def _set_uidstring(self, uidstring, record, model): + """Create Unique Id String also know as XmlId in the Odoo world, + even if not really xml ;-)""" + self.env["ir.model.data"].create( + { + "res_id": record.id, + "model": model, + "module": self.model_map_id._get_uidstring_module_name(), + "name": uidstring, + "noupdate": False, + } + ) + + def _process_touchy_fields(self, record, rebellious): + """Override Suggestion: + self._touchy_fields_fallback(record, rebellious) + or any other alternative + """ + + def _touchy_fields_fallback(self, record, rebellious): + for key in rebellious: + try: + record[key] = rebellious[key] + except Exception: + logger.warning(f"\n\n\n\n\nPb here {rebellious[key]}") + continue diff --git a/polars_db_process/wizards/df_process_wiz.xml b/polars_db_process/wizards/df_process_wiz.xml new file mode 100644 index 000000000..238507479 --- /dev/null +++ b/polars_db_process/wizards/df_process_wiz.xml @@ -0,0 +1 @@ + From 6c3f6b7f04088b427383c135c18990d449c53994 Mon Sep 17 00:00:00 2001 From: David Beal Date: Thu, 31 Oct 2024 08:42:48 +0100 Subject: [PATCH 3/8] [ADD] polars_db_schema: introspect databases with dataframe capabilities --- polars_db_schema/README.rst | 88 ++++ polars_db_schema/__init__.py | 1 + polars_db_schema/__manifest__.py | 21 + polars_db_schema/data/db_type.xml | 44 ++ polars_db_schema/models/__init__.py | 4 + polars_db_schema/models/db_config.py | 46 ++ polars_db_schema/models/db_source.py | 17 + polars_db_schema/models/db_table.py | 91 ++++ polars_db_schema/models/db_type.py | 15 + polars_db_schema/pyproject.toml | 3 + polars_db_schema/readme/CONTRIBUTORS.md | 2 + polars_db_schema/readme/DESCRIPTION.md | 5 + polars_db_schema/security/ir.model.access.xml | 20 + .../static/description/figure1.png | Bin 0 -> 124093 bytes .../static/description/index.html | 435 ++++++++++++++++++ polars_db_schema/views/db_config.xml | 25 + polars_db_schema/views/db_table.xml | 32 ++ polars_db_schema/views/db_type.xml | 50 ++ 18 files changed, 899 insertions(+) create mode 100644 polars_db_schema/README.rst create mode 100644 polars_db_schema/__init__.py create mode 100644 polars_db_schema/__manifest__.py create mode 100644 polars_db_schema/data/db_type.xml create mode 100644 polars_db_schema/models/__init__.py create mode 100644 polars_db_schema/models/db_config.py create mode 100644 polars_db_schema/models/db_source.py create mode 100644 polars_db_schema/models/db_table.py create mode 100644 polars_db_schema/models/db_type.py create mode 100644 polars_db_schema/pyproject.toml create mode 100644 polars_db_schema/readme/CONTRIBUTORS.md create mode 100644 polars_db_schema/readme/DESCRIPTION.md create mode 100644 polars_db_schema/security/ir.model.access.xml create mode 100644 polars_db_schema/static/description/figure1.png create mode 100644 polars_db_schema/static/description/index.html create mode 100644 polars_db_schema/views/db_config.xml create mode 100644 polars_db_schema/views/db_table.xml create mode 100644 polars_db_schema/views/db_type.xml diff --git a/polars_db_schema/README.rst b/polars_db_schema/README.rst new file mode 100644 index 000000000..7eb218475 --- /dev/null +++ b/polars_db_schema/README.rst @@ -0,0 +1,88 @@ +================ +Polars Db Schema +================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:0e6c26c886f0fc18c585b743314981ec58966dd913b8a469530e62e313327de2 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--backend-lightgray.png?logo=github + :target: https://github.com/OCA/server-backend/tree/18.0/polars_db_schema + :alt: OCA/server-backend +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-backend-18-0/server-backend-18-0-polars_db_schema + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-backend&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Introspect external database + +.. image:: https://raw.githubusercontent.com/OCA/server-backend/18.0/polars_db_schema/static/description/figure1.png + +Use case: you want discover an external database extracting data from +only relevant tables and columns + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Akretion + +Contributors +------------ + +- Akretion + + - David BEAL david.beal@akretion.com + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/server-backend `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/polars_db_schema/__init__.py b/polars_db_schema/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/polars_db_schema/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/polars_db_schema/__manifest__.py b/polars_db_schema/__manifest__.py new file mode 100644 index 000000000..2e63b2f9f --- /dev/null +++ b/polars_db_schema/__manifest__.py @@ -0,0 +1,21 @@ +{ + "name": "Polars Db Schema", + "version": "18.0.1.0.0", + "author": "Akretion, Odoo Community Association (OCA)", + "development_status": "Alpha", + "website": "https://github.com/OCA/server-backend", + "license": "AGPL-3", + "depends": [ + "polars_db_process", + ], + "external_dependencies": {"python": []}, + "data": [ + "security/ir.model.access.xml", + "views/db_config.xml", + "views/db_table.xml", + "views/db_type.xml", + "data/db_type.xml", + ], + "demo": [], + "installable": True, +} diff --git a/polars_db_schema/data/db_type.xml b/polars_db_schema/data/db_type.xml new file mode 100644 index 000000000..b8bd3898d --- /dev/null +++ b/polars_db_schema/data/db_type.xml @@ -0,0 +1,44 @@ + + + SQL Server + mssql + Binary + +-- This query order tables by rows count +SELECT sOBJ.name AS 'name', SUM(sPTN.Rows) AS row_count +FROM + sys.objects AS sOBJ + INNER JOIN sys.partitions AS sPTN + ON sOBJ.object_id = sPTN.object_id +WHERE + sOBJ.type = 'U' + AND sOBJ.is_ms_shipped = 0x0 + AND index_id < 2 -- 0:Heap, 1:Clustered +GROUP BY + sOBJ.schema_id, sOBJ.name +ORDER BY row_count desc + + + + + Sqlite + sqlite + BLOB + +-- This query order tables by rows count +SELECT tbl, stat FROM sqlite_stat1 + + + + + PostgreSQL + postgresql + bytea + +-- This query order tables by rows count +SELECT relname AS name, n_live_tup AS row_count + FROM pg_stat_user_tables +ORDER BY row_count DESC; + + + diff --git a/polars_db_schema/models/__init__.py b/polars_db_schema/models/__init__.py new file mode 100644 index 000000000..0ee0fe9c7 --- /dev/null +++ b/polars_db_schema/models/__init__.py @@ -0,0 +1,4 @@ +from . import db_config +from . import db_type +from . import db_table +from . import db_source diff --git a/polars_db_schema/models/db_config.py b/polars_db_schema/models/db_config.py new file mode 100644 index 000000000..8e721d795 --- /dev/null +++ b/polars_db_schema/models/db_config.py @@ -0,0 +1,46 @@ +import polars as pl + +from odoo import fields, models + + +class DbConfig(models.Model): + _inherit = "db.config" + + db_type_id = fields.Many2one(comodel_name="db.type") + db_table_ids = fields.One2many(comodel_name="db.table", inverse_name="db_config_id") + row_count_query = fields.Text(related="db_type_id.row_count_query") + + def get_db_metadata(self): + self.ensure_one() + if self.row_count_query: + self._read_sql("SELECT 1") + df = self._read_sql(self.row_count_query) + if self.db_type_id.code == "sqlite": + # https://docs.pola.rs/user-guide/expressions/user-defined-functions/#processing-individual-values-with-map_elements + df = ( + df.with_columns( + pl.col("stat").map_elements(sqlite, return_dtype=pl.Int32) + ) + # rename columns + .rename({"tbl": "name", "stat": "row_count"}) + # stat columns store extra info leading to duplicate lines, + # then make it unique + .unique(maintain_order=True) + ) + df = df.filter(pl.col("row_count") > 0).with_columns( + # add m2o foreign key + db_config_id=pl.lit(self.id) + ) + df = self._filter_df(df) + self.env["db.table"].search([("db_config_id", "=", self.id)]).unlink() + self.env["db.table"].create(df.to_dicts()) + + def _filter_df(self, df): + "You may want ignore some tables: inherit me" + return df + + +def sqlite(value): + "Extract row_count info from 'stat' column" + values = value.split(" ") + return values and int(values[0]) or int(value) diff --git a/polars_db_schema/models/db_source.py b/polars_db_schema/models/db_source.py new file mode 100644 index 000000000..9b83b133f --- /dev/null +++ b/polars_db_schema/models/db_source.py @@ -0,0 +1,17 @@ +from odoo import models + + +class DfSource(models.Model): + _inherit = "df.source" + + # def _get_test_file_paths(self): + # res = super()._get_test_file_paths() + # res.update( + # { + # "polars_db_schema": { + # "relative_path": "tests/files", + # "xmlid": "migr.contact", + # } + # } + # ) + # return res diff --git a/polars_db_schema/models/db_table.py b/polars_db_schema/models/db_table.py new file mode 100644 index 000000000..fec0a4771 --- /dev/null +++ b/polars_db_schema/models/db_table.py @@ -0,0 +1,91 @@ +import base64 +import io + +import connectorx as cx +import polars as pl + +from odoo import _, exceptions, fields, models + + +class DbTable(models.Model): + _name = "db.table" + _description = "Access to database tables" + _order = "row_count DESC" + + name = fields.Char(required=True, help="Name of the table") + row_count = fields.Integer(required=True, help="Number of rows contained in table") + xlsx = fields.Binary(string="File", attachment=False, readonly=True) + db_config_id = fields.Many2one(comodel_name="db.config") + filename = fields.Char() + sql = fields.Text( + string="Significant Columns", help="Columns with variable data over rows" + ) + uniques = fields.Text( + string="Unique Values", + help="Columns with the same value over rows.\n" + "It could be useless to extract data from these columns,\n" + "because they're probably unused by the application", + ) + + def get_metadata_info(self): + self.ensure_one() + query = f"SELECT * FROM {self.name}" + connexion = self.db_config_id._get_connexion() + df = cx.read_sql(connexion, query, return_type="polars") + excluded_types = self.db_config_id.db_type_id.excluded_types.split("\n") + cols = [x[0] for x in df.schema.items() if str(x[1]) not in excluded_types] + new_cols = [] + uniques = {} + for col in cols: + # TODO improve it + # Some database have dirty column names: :-( + conditions = [x for x in (" ", "*", "-") if x in col] + if any(conditions): + continue + query = f"SELECT distinct {col} FROM self" + res = df.sql(query) + if len(res) > 1: + new_cols.append(col) + else: + # column has the same value whatever row + uniques[col] = res.to_series()[0] + self.uniques = f"{uniques}" + if new_cols: + self.sql = f"SELECT {', '. join(new_cols)}\nFROM {self.name};\n" + + # WARNING Thread virtual real time limit (151/120s) reached. + # Dumping stacktrace of limit exceeding threads before reloading + + def get_spreadsheet(self): + self.ensure_one() + if not self.sql: + self.get_metadata_info() + if not self.sql: + raise exceptions.ValidationError( + _( + "There is no column with varaiable data in this table: " + "check Uniques Values column" + ) + ) + df = cx.read_sql( + self.db_config_id._get_connexion(), self.sql, return_type="polars" + ) + excel_stream = io.BytesIO() + vals = {"workbook": excel_stream} + vals.update(self.get_spreadsheet_settings()) + df.write_excel(**vals) + excel_stream.seek(0) + self.filename = f"{self.name}.xlsx" + self.xlsx = base64.encodebytes(excel_stream.read()) + + def get_spreadsheet_settings(self): + return { + "position": "A1", + "table_style": "Table Style Light 16", + "dtype_formats": {pl.Date: "dd/mm/yyyy"}, + "float_precision": 6, + "header_format": {"bold": True, "font_color": "#702963"}, + "freeze_panes": "A2", + "autofit": True, + } diff --git a/polars_db_schema/models/db_type.py b/polars_db_schema/models/db_type.py new file mode 100644 index 000000000..4967dc704 --- /dev/null +++ b/polars_db_schema/models/db_type.py @@ -0,0 +1,15 @@ +from odoo import fields, models + + +class DbType(models.Model): + _name = "db.type" + _description = "Constant parameters about database" + + name = fields.Char(required=True) + code = fields.Char(required=True) + row_count_query = fields.Text( + required=True, help="SQL code to find how many records contains each table" + ) + excluded_types = fields.Text( + help="Column types to ignore for better introspection (set 1 data by line)" + ) diff --git a/polars_db_schema/pyproject.toml b/polars_db_schema/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/polars_db_schema/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/polars_db_schema/readme/CONTRIBUTORS.md b/polars_db_schema/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..dbb2754b0 --- /dev/null +++ b/polars_db_schema/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- Akretion + - David BEAL diff --git a/polars_db_schema/readme/DESCRIPTION.md b/polars_db_schema/readme/DESCRIPTION.md new file mode 100644 index 000000000..2832ea239 --- /dev/null +++ b/polars_db_schema/readme/DESCRIPTION.md @@ -0,0 +1,5 @@ +Introspect external database + +.. image:: ../static/description/figure1.png + +Use case: you want discover an external database extracting data from only relevant tables and columns diff --git a/polars_db_schema/security/ir.model.access.xml b/polars_db_schema/security/ir.model.access.xml new file mode 100644 index 000000000..cd5d12469 --- /dev/null +++ b/polars_db_schema/security/ir.model.access.xml @@ -0,0 +1,20 @@ + + + Database Table + + + + + + + + + Database Type + + + + + + + + diff --git a/polars_db_schema/static/description/figure1.png b/polars_db_schema/static/description/figure1.png new file mode 100644 index 0000000000000000000000000000000000000000..c180b61355e2ab45f4bc7e8a9f1f7dfdf213a0f0 GIT binary patch literal 124093 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

TkkTOfz_&z*hU0(XJt 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

&JqwFZ_NwhcuA`tc39p;(2CG0x3; z18+ZTAtfjgnB`k`Bc9~f-}0>D)J8rPSYaK#aOHeFL{5fs%X3aI4$|QJ`tqnA9L!jy z!SF?SP^<-CS0a`)eE_m$Fe)@RRM^G0g%SOL90x>Hk0mW!3tQce(CyX z=ki_+kE;@Gc-t^cxQxVH`Rfz`{6zpcYnRK_eg7kAt0?jV5DM%kcmu+TSf%stphV#uSb)sKp zY1-mSe73ZZ2)qrC`(%hC1{OMQU%a zcq^Y`poHg7wHX$K1ICtXqX+soN`6vnK&#>1tY+Mtu!#2bODGo>mRhQ>o&mT^WU*1a zzmLUV3&}RnzdH=Y0K?#(q3j(5cg-m^4=k8!YL5}1i59JOVz)jw))%^{uD-#p6t?h9 zQKA$eHP&SY2b&+!0+b0G9#(>43w>X)5@5)Ft3TG)eiGOkB#MVpRddwx6MB!*FJk4uAP;ZrDu?F zb$v?igomT*33#mZ_hA9QljH)6=jO!;All-jp(E(490Szb?}Y6L=$bx$X%|wT2$7(; z1HP6PG3Slb4kcyJNiHShBpf-imZElL7sp!O3sarMmCIIJO!Qf{;q{QL#l0}8gKdkt#q_&p9~W{ic4K1M$W%GxV5pue}LxZ2kq; z?eNk#+MUWIO{W%t91Rkcq{xTtjAX&aKc{cP87R5>Ao{cV0ctJlo=51%(A=ErcWZfW zpsyGj=#vSlOhCHEV^_N0fQL2^WPj3~O!JK4ubMU&aicqM^k`S3xnTlJf3)&#z`*i( zXGiA>o4TUitGn?t_K8khQ6@JR4?`+z$zL8(7q zlnqr@S5Gd-Tz!4-=I{H`Oe&xaHy_->A9G3$rsmq?HVi89A<^47l!R-AjcZ&#G#@}MR-=IY4NXHn3@|{ zO`stZmA*lk6%Ntfbl>!FUjyU02}Qv~6FFH)Nx7)+DG7gzueWbk^g*2iaV}DQ%b4}< ze#K9jSgnH@ssz|{`o~ZpxDE{%cy0su_gEDWvo`Evvfoc>X)Aq-l0P5h9DWNe7){V{ zl)U{xsS}6xsSVGH3!UfaAN$; z8JR9sd-<|2v&j7##@C^`g&(MW;Gsi-2@w~ION)LYy!SLDjrRY;1@OQh6J1>~hMYvn z9u+K^xSgT?IYtdOmD8o}u(gKNROk|yF@9sz728eZU9d{smj2BQQHdlEPa2z>Gvr;Y znVC45X0nBp3`@n*3+k4w|nOLC)6Lup*iOP z+@8Hl?dS{a3yB@IM^}@QR-1;RWbe29&n#-z&(IyNcDVw@sYAuNPfgjzzYyv%5QSwd zTO$&zQWDd;op;!Vn>Ek6I+^qeMyK2H5Vg%|RmFv0*^1bTSZ{gukPM{E*Y6K%YFlTP zSS+43`|GfrP=2Tr+n}2MMJAYuahi_> ze~YQqJz!Dq>Y`%OsZ%S`U29A9qQC|5yAHspj+=kf*unijy!NhO^<`u_2SAc(zAiG_ z#E4=WGwb8>9*8!CQj)}vujCo4l7f=ItoXu?Q_$hn)PD3IQ4x;BSf=-Ad*a;uImZsvU^=KpRScnbkV zMG{Zs!Um^Q^fQN)6djtremZ1k#NdfBU%ygESJzF?VFr!$NmtOpeN0Z+1`edFlnRs~ z%s7acOD<73w|(79-4|aa7n`fEXkr7mS8NFpzci}lxtaI;&{OxHQtKD&-1T?i9v2?m z55;fP&T8t)Ov$M}-yhr4l_j^e-Gc-kBu^Fj8wj{z2K)N5@NeCy&n#NLeWT%b%>+=K zvl#LQ8%S+3+^g7Se*O?!Ml!Q=hyR0UvNB2?y1+nns>pHj_sb^UIR2A2^KaS=`jB2|u4v>}N^Rt0`6^eS zrT5V&=Na;yR!GR#&Ub9p`8<4WIYYY1f$m!v?uqYNxVyWU%?UQ~R@zm95)uVz=Cb5E zITOWTs`_xM${~aTd8RfZGS*KF+6ccf@)i&sSa)O5J#nAMf zvINLfj}{*x5;7AlO)L**UuOgq2^p&%!+a2FR-^7x=VCyq#HJnb%y6N1Nq&RWJo2a1 z`TZtLMM`SwkqZ5@ZlVd$(>N|Pn^523NfLSjQ{?GjDOfebl>3H;k)a~jF(rAv^RxG{ z9pXu4%{2=Yq#22_jSO8~At4G&J#om0LZbG3KTKK@Nqj_(M#Xn>c4DtWy+GkDcT*1boM1P;~01S*l%Q@JN&B+&`^cb?Ph?RqoATo*i~rBrewvMdg+r1KbMfaGZb z(HI-MElL_q(2*l0RL}8HNrZ&zFXNsY?Vq2Y3mz{ki<@6CtuT1EVevIKgP-r=czO z0$5GHU5UOAbJLPl&bxs!1A}t;`_CwjaM5bV5ezY`ZWrOP5qX+tX1_c{3BN{!D#$Nj z9I>SMx6A=U{M3beyQc{4L!s#sYxc@yw(#l4k;~gU_L;C4w~p^_dSR&GE`Ll9W)xtH zV=(=IKa)WVBQ4fSm+DWlrTu-pXA6saOqqxmRKfcdt3Yq_%&y7ewYZ8k;%y+|DS7fm zh4zAjsmy6=&X(VAi$30sg_KcfcjE;aQhs?c45UL{U86s|(-!`7_D4l$-0s-L&CsCn zVw*z(^M0!^CBid!#iKGd!-R(Ad$FSxChen)Pine5^j2ef_kq zSg48vk&vC-VpyatQWLxYbe>OLhDxRw5LWqyITBXT6WJtR?tpd*bpZ;GtgOPgb{q4< zBN;~`!ELw7&%{KT5wfPT1fl8v2#kCJ_ZS|Bgv zbX=;=*cLH6u-pR)FB`n-km#kRp(fsc|Neo3ynIn%VRoLLnMH~FQ2)ZhAmCfdwP$x< zn1euRxp1TbGy$Zf5~oFEI@J`R?ak5{j|XE>QT*jS)vQwnBAxrKljZNix-4EY2n9yShNQ>V$QXC(jKlPH(OBLIAiuRENntsI_H+RUgk;L`@=C zG7&~QDh#D*w)r^hM2qU-hbv+LAq3U{%g)&y=ky*{N`Pb z%E_G#t@Fm@p+~CJLS*E1#;h5N%%N$FJxO2NL%B<%?Dq9uWfe$;I?Mg2t|mKd8o85N z?ONsjQ3B8&5ER*C-pMkfRiAhaLBT3&N)6-Pp5p7Qcwf-#QSA8#O$D&0FgyrV9DFb2q!%e7)?Xe8H45G7&$xJ;74r@Hy4L0l3gc= zD+YAXhZp^ethjnr5~EnK#r*VcoBzNWI*HX<-=}i-)IQ^6-~0Sd`xIg?8-`oC;Y$Ux z0vUXP%6@jNFu}*%8CL}gM#gMW0BKlv4T0#at-cl}`~WK_Nj&4{PxOe7W8wG`9UaN< zg1NbH?A>Aj4!R&SgSmj!c&Tgapnr3YKaenWN?qnhAqed$4kl*k5~FrsnaWYa#o2j% z=}e`o06%H_c)y@bP;5j5$v+3&v7$xA$EO%i;(NZFZlOHJF{DC6zKMW_EOj19!kh3~ zuV;F$D8B%SH{IX4ts4r5JbJ#5)XB=a@ew7;;l+P%HY`|u_sM5di@PhPj)I?bWy@cO zr%o*@y2Ns&a%;8#BrLv_Jr~-x;-c*u#8d z(bSZR;*uc7PasgU#65uii<$Bo=T@pt4HpQd04oL6!T9(j=5$@nZl&Xj9eA|1(2d+* zACZz)VyB~e zC~ydkFyi6ja&T}6Qt@+`*5cN##V>{!@%I-l(3CGPEm=QD4QmxU@wyfcCPZ25_@S>} z(bBpAN!iWCWny9+^yEK2wgE6V?p#de%T5*AzL`74s8f}g(bhLG)ZX^%TaLy+g-XEq z7n>3(5X+4W4vrSPmBHpQS-k5tTxVG=_g{jnsoQM^n1RzYhD?x6;*Rz*iqsxvQKhkreYsG&jAfD@uYj#n_hMB zC$(o|VIGO9(wl8z{SriiLKQ5YwMxi$Q;jEPe|?69GyS;vy#^X`*I3tNVui#qan~d4 zu?7{gx*8T!JRq>3AmAPjO95)B8E(&w7ZP`MPU3MIfkFV~nz-z9e!V~Sk|Vldc=&(v zRe87mv=2xr=Z?s!M02irK!0hkYK!dEml~Q5O4yndcQIEdM?;oKcibBwuIcNQi)Xec zV@9&3yl`<;QB-{H!MuGMsDVaR1VetH`ko!FK%MOLTYk1{;z;#XT3%kMqY=~NiC|GQ zqOW1GH5Mc8IH4=k9l5Dyi%*68d6?{n@H<}1eUuf4P3vKPig$7X>?+*$b58B`aZfW% z!j_x`%8jDqf;bSoE|`~pB+4n=c6Icl)YK65{sXoBCvatIK69-EEH=)9!0qDZjr`k- zi@3ceY(zvGGD@w6$IhTfgg?Oc32}akcr*Pg6Q&X%(|fch396ye9G#~ZU(=iCPKp4X z)j_Qe*OAM}NqG+YuY!Iuko6~8*?)p*mBX(2-T3?`Of$baT`-pZ#^!Uoz4X!W4 zmM}frt-^bP;}6-O)x6m!jlsb_6)WKfbYBPsYTo`NeiHoZGa695!}NH{Hm0HuX2!g&YTb2cDDK;ZWbP1=4!)pQEse@fWY%A8 zKFvcB^!Nbdv*{WV8_0z`%@dz87LLZcIGj39%?=_OO&wz+&OQs(L@9?+^780=t&#=j z9a>XZCxK+MG2D`^O+1v>4j|>V|HIsD+|08`j8j&&+U1+6U4Qz+Uu8W%o%Pv&BmHl6 z#$_6XEE+O9gW}6|4q*L6vMx!>wt2gE7^BTX<_+dB2QU5{&`Jw=-L-v)DQUNi6E;-x#N-LB_@lk zUGS#gt++J)(iURW@Df9WN2>CeSIfq#_TxYHT~9Seg`2>@tPI;h4z1u zk?>o+T_^lCR!NmzOFFhm54LU3CyGko!Szy?{py}C@@e2AD&95mixgNRY_bWdTyf!Qa4ZYyOXJ%95L%}-fD}Fw$Xda8{QXXpR zvf8x|a$2X!OM%zY#sDo`O|Qa27F3_4loVqNUH$|eCIx+R ziBc$`?jflpO;^q2cqM}yolImk(CR4MAVU?EEk}g399{UAZE$)qX-Ejidj#Z^N zxCpq-P7gM%K?(OxF9c+PZX@W4++P2`X%yvND`%+(!n}EZeK@td%o0dj_p4uc_vRn| z)?WvabVU9P%sf`?@B>j15Oi{&$mH#Q_b>IRU06veH8Sk&kR49ITMH8;1V>lSH6y`k z(0g{`h~d{O$e)IcZ7UPqQil^V{6JBI!(DS8i|!=YR|vw z)GGk1`+~>myqdBDtv<+$eN zWTXO8f*{TQ-h*=IGq}uyE2CD|R}?Sg)b~)YxT)~=U;`5I2FhtX|OT#VQf;u$Erq;6DWF(?0fe9faAIR{#%IR zgi(fzlIC)p=Xp}G6VmVf@d=fAsbmxGTt+%J6dw9tPX?Az$Nqo_=*cUuKbA#>e zzEBu6uTRzX^}f()t>Jvzs0y$aA|Wvk83ESA65_8;&Gu1(KAb)5vs6IA89)XBqE}n7lef-dn5Px`}Q=;4H?^Pv1(GQUMNS{@@bX-DKR!m4# zTGj`*A&gTs3e1)I&0P5RN#{ry4&-X1`jBDzucqq3o%wgE36ZD|TLT3pR=$#w(nlOF zf9M@xC!ia#g7F5ZU2l1&q+qi|nw#n=W)i|25+VLd5+*F25M3NB4%HV3hPqF53d<~% zm6dV+SyaE8=KJWL4%*X_=J(g1ZOPc`9^(IG3ZRgAb&22V9t24S*99N+-BOqk4dvE- z^5F4k8IXApKT3-~zS~&^y$~>8JIjxND+Hr}k0bvLgHJl5kI3e7X&i+18j3z7&+Y_} zfFgN0GSJoD1r>^oy>*ftjW8+V2TWie(|KWJDW^`~ z>4(xoC|sPA`z zL#66#!=|}K=)#K4HAlprSg$qPrlpiIMO)9r#=jNfW4C;tIcg%QSdMeuv~7B{xA6HM z0ztbncx^7Q`DsK6Gd;mw=uv*)E#G@fzl@jWMNooOtdgRV<}exkgc9Z8#(nm-H3nei zI%fi=&~{h5EuaVpqdcXjRc7X;^3pY@kV9j$m?}I8nj(dK5sR_OqwX3S>N~DLYHm(3 zNR<1tv69H!{Ihd!-KVqtX{JLdM@QpmME+e;{;;fvg8luh&3Zf2y+6L*{QU{jUpOQz zHd)VHsoI%97A3N3d%44BY)D<71<%E$^0tr9CuwqWB+?Xsj4}G_WWP{$j>trDXS z1;-AJ{xMar%pTC`tWj0}-f2)+etZj;`e(<%Omhoe5SjP4ZzvU-=%mf#9Z5<7hTu6V zAtAjsQgz3#OBs#v5vos?SepS0O(q(A?5)-GAH{NQCmjt6>k)S!cbT zMZV(EAOH;j$x?She+J#iRi3J8zQr02A-a)lTSG_BDHf_vqOM5a zkuHe&gTRdSaDCbbqtUPcg_Kh8_5F0kmtYw}PDY|xeBlyv$;%P*u^DdjH z+OqY&0%L@}iLUm^3k?D~!M6E7-#dI-MQ@--$A152Zep2s{@VJsGjW6vm{eV+>kkZ% zM`45nM=DjYGcah^Fn-NX9m;p?J(OOvD?Xv_iOC-+K*;GZ_vq}ej7?4cDlWK*Wc=*U zgIfqs-^AoxKBLpJd+z6p%`3KUuD4f=&3e9{9<18e$;KD`fJ+$p)CKyP-(s>TK1q}T z%XFgQs3K(DGtLQKHB;bja_fc=@fR@^-Dh}q__^8_@54&WCRTg+&N#M4r>5&l$XfKC z;lXrps+3hVy2sJc)(vEh6#*(#vVTF4CT>k3pEGsF%K^38*5hAMWe| zAw7O><(D@`LHW0?6C=CDHeD~;veu;^K3fwcZF&U|yoBw(ZxFBjvZGP^<$H4up7rel zD9G_2-!*)7!JVLgw)&GXhSO}OVLO>x1{WJ=Wo7j<32WnYw*v^bxw*OhzQjF;cx}I~ z(jU+6p{^(CQBT9B&v9OGvHUjM&fXr94%ZjnT-BWv2|e(Q=XI_9kszlLy|uQXme2d_ za4~zrk=%zYm?M5B%eg36=*~kyVG!n#-hw0r*>C-Yb#eZYabad={@s?~%U{Cgu_KQ~ zp8Qy$&T{<)qLvM+rwiX8wL;@sy@&LkOgERVGmkTBV0TGL`8Ex1s}4^PI#EDRVqIo> zP4kV`)*oq*==3_mczU2Twt-qEK3m)UnUi1XVY+*`mm+OTXcxHj`*uyl3;#r0ouQ_A zmQbLNWGvqH_eT`KpkeO4yV9ttMrNTm8Upb`zk!<>j%%wO+*n%D#o*yPnh)MAU8PCx0LPzj)anl9B`OZ=b)6^Z)$~^+uh;{lx`B z8Dl@YZsz{_%x`-3ulJDC!NW!U`|$spBRGK;_-{zGCsT+fqpWmCn0TsE2Se^HJLKHg zf;Wap;YNjjJYA}+S5^|gMh|sH+s4A_dWRG^1$8mEkm7X1C$7rF5FWZs`6 zCvV>r77#KGy%R2#qB1}5NwQN7`=n%_(1P36$;{CLJ-cB3Z+wQQ$48O3I@0&DGQQGq zq{=^z1rJt!9{4%YbVGwjpO9TfcT`^mhaMzt?@i=|dkj=W;zW;)CL(#dOb`_ctTxOC znz_GyhIfB-J;ynKp8l7i+mZCmQiv(v2B2lvJJ>(ZW?&*;VtI2q5bwdDxW&?)X_qkL zM#F8@SAr-J?V9X4Mz3t<-n;gsu#7D(-wh-pLcF85n#b}Dirk-PqRal~N5nPl+S|7O z`PEwq@RS(8A1(Gdn%7{zc?eLBYGI|sV%IbleyDbtcfA6fH5hVBzLV65|oNY>#*GxRzeXpp0SJJlSnX2G~H} zIx{%<&ER%}g+@u6hsraD{=uiAt&VH`64q^nN^1d9lFIaI!YCEMS$Myl3{>q_(GSqx z+izPXXRx|9=)vkaHjqxkVKwFd9K)TBoHZanmEGwD@Qtf51sOGKU3P!@tj7>4V1)vw zs&spg)En?s3!WqXcbE(~5m9&q;E*ve`D@>6M&|m9@yL)S{`1CMoO1DOi$At^T8xXj zx8sGCCeMsOz5w3z_)&B6@+ognU8vH0>s`eC#WLv$-pOd#f7uTg>E4q12%gNBDPf~7 z_JyV^tR%c__4Qo(rLJW#&VbGb4;;rG;qdeEa*(>x22!_;`On`i1xB%8?c- zNQ4{{+)Di!gQ;GXJ?MPk#Gg}FWIq^POqv@d{}fx6uIRNzO(VI^tx6tmG0{C$G!lY$ z*60a`;G!2C70&OtG`L!IX}hrk&JD2*iBpw!kQ(LmMSRQ&mMpNzRV=7XT65w4n6JjeYrO;elnB$VhX;i;qwuE{m-97##nAe z8A(ccleWw4de0!NpFxT^%8H8KzC@2%e&i?V_qMd}{GR`l&1o4(z|PAgpray|?#yb1 zAGl;Zv%tp)djulE(v;(q%}H+pwST)2Nge;`cKgt%ut;Kj?prh0B0vAJOBrR-GLrNf zI?F*kq*3JY#iqZh z85!KpDSR<(IOl4U-LRlW29pb@kr#jG@itEk2+?4trKBlYQZq2rl&7TFunUTVLL5{N zj!&wueiU5z1rj}br>X291NO(HDLPvT&`w#U^>EpoD?-M10v!E|CWYwB7q_VbIe6Nx zBCtld%byeae;WS%<9z)Wh`8bnE&W@7dY@}xa}s3sz|h_*Q0(4~jC|ME4+1`YipW*Z zAN?jy;r%r+xsJQsQEcjtq2XI5)#|~np|^1Fn-n8EDLxEs|E4I80#wBt)OXIno`h|0 zryA=am%$4i!M3`Q%*?PPs~?g~X>*Ss>5HNt9PG$n7rcTWqq94M1ctRL9M%TM_J04A zxj3(@kU>8rac6+<93g2sOd^g_z}6d$GfKt%v}^3wpEtt$$<1hjC}DyHEDzfjci(sM z?K|&pj1b@L>>%KgM>xsmswzzO9j!ZD0a`JHBYCRwN3XAE_zW8V7j0h|Rn;1< zi`zm`Ksp2j6%^@|Mx>;>L+M7kK@>z9q`SMjK}EW|ySuyYi|%vIk9)@*_uO&s8vfX@ z8EehC=A7U6zR&x_!n_`r;VARN@3-W7a)i^G(>;bv#;GvFtPQrr5owv}XUti8Xs_7g zXIuJkpq%|+B6q^AsreK+N_Bw+>u)t19IbI(&C(t_$l}+A%7JG{nGxhFbZ}W6@_bRh zehl*VdTY%48>CvCSVQd3dH$u*Q50|H{tfD-_e8u~6pVSJ#}c|JCy| z!m4M}!fv_B0;xxRXp7cWh0fxMw>&t)g5Hjt_NAiaFP$P$Q6GGA@+&4vn~jM&E8UM( zrJ#+sbwj=Lh1OtrnxN`!@rh#@j8Qe!W5KN-`T*Hj0r9k+ugI%)x>Gmqe3{u;$zA5% z-`l~X%QyX~hvVHKWqFU3l=R{9n72@hT9sK;*HAA^f?7IWJ-UBjX@$3n2B(4-P~b`B zzB`qq=_7i;`R=s@mqEl`G#;f<<+{#hPf-`ip6p!ZT z!LVwN2IsNb=*eFU0|L9eyp2M{W(BHQtf+~KFLiPLL!WAEEG;el2)V3gb{UbQj7>~N zYYabyVr?~K4cTn+-Qy!M=B!JJ+k!g(-&2q%lJkr0Sl8;UM0-OX^6P!3VdIW=Qt%~* zGabjPp}|5|bg~SY(fo&U1)Jl(boZ?I-wPw}sZZ6a+n#1B@DnUAY)f{*pch^e9{#lQ zDR0uJ&VRI~S{=k(e@o67_Z=i)n_GXxYUJX^l}Bm19)r!wTF8ds5+)C||0d{&{l3f|$adGc@J zdI!sH>ABR;u82rqB&X2Or@^h3iVw&%FB<)B|2Z!MO!)uATI0do4^S^2WQY_ z3BSY$E6A8PP%1_K!dRG-#^f)1>Lxw+1b0oaWZ*<;OT&kBI$?a`5fh|R9bA$DV;gOE8)>Lcb zga#cZYdwT*Z7-*tRsD90hBfewgr@B7?K^)?AbrfV%^x>v^(C`YHE7 zZkpDL=o#p=YSP{#Rw1?M_%@lu?D2JSMr3{2V!@6_{)p6<;0Xc)%x|gGz@(3bg-_Uf zX=c*$S9lyA2DdqNZ`XKD>4Wfs0Eq_@uzHtGgwYu_I)@Cm)zO$WVt;z=Fq3FaCm1L zNm5B^v_Mta@Rc`s1FJe5UCC8jt<2sId1W+us%zO^1pbk_T`#Dq<*Tv0c-!Q1Oncgo z`uL#vLWt+=Cq;Si(c(cZZj9yEnJz(%KXuNy<||Q zg=zBDO&8XJi}x+C^JFF+&ihBwx-^zLVh=Aq6NR`B%3-w*t+`AkCUwLyI0ut235g1; zS8BjQ6Dvb%VY<58AwSnHB5IIb;iUUf#gWHT0+LJ5H-^wb>2i-aEO%1j>MZo>-NTQ= z>*P@&;b(C?mw|Rs;u#$p&fx|o1P!CvU3~yhJS3%|JtHV;cmy0MgT9w-Ja8t!7Dv?A zFsv~c5znl>E~yc=_>2ol1<-H!N)>D!27T`}*G>p=opeKXE>o`|7#ZA>YHu6M`;Je` zgP`}(yn>yRc*lfSrizI?@~$^9#V;(0wJ_^QuI?s&cn%bNhv;;o>J-t!L}91~Ev zQYo^#T&}MG$2SYCx^hUv+G6PRfBBf!Im=7X7*3KT2+G*B-Fx>Ayo@b$#8fM7-$=_Z zfo?}zM_c?co59R@1jck9qBr`;V1&xcWKWda{R*D}w(?8;6-GiF`|bRoFHTSilE;2)S|~Lf6WUQy zAy=z$mIl_ow`{%n@24IQr7STknXPb-4s0MckD$9ucfyxmQG|#Zh36ZHIDDgQ##K}? zmZ0$z4$T874<-}M9WG0A8!HPlsTx17uK|&u@h-P}NWDWRGK(SwRn^XJ3Aaa@0%2-J zjI5H{%*Ap0Ar;e4W+J>bJ;h~1X6s~x?S$yZ8_e04j4z)*U*Fz|u)sD^sfupUAYgI! zYMQ%q$1-yxeLZ^oTl(FiG*QV5UT8oZ-qy!9)Pm;O+)jn(n;=ClEs6{sO*b<$v$wdQ z%mszWowwrRW%2nE1^Qagp15IPVLsyFMEVde2}*FW zGk+xaEFP|+27Mpx8QA$aACz9E?}mEcy?3ZfRoP=s-*8~GM`J7`oy1I0Q{X-VkynET zV?hysz*jDNIw{F1Q@+*Wh!r1K493UYYTxo7;j*ue;ac1yw!pr0oIloIkOVJ6?Sk+e znau~mZ42I^6yjo{F|<~@qnN_>mTQT#u5=m2)rp@`f5rFRBW`_eu=?XYO|n$RE+a87 zNgx^zjO7ZP`dG;X&bUf9B3TWc&E9!>T|+1c)kFtpgCo7%ru;Tn2fC&eijkXjXW{%Q z$D@&wFEL)ByQ)wT_5Y$TnjQ>oJ4&-Q&b4j6g^Uzv*A@CaIq<(gwdpU^&)MMcT+l!N|N zzAzcjw}gZn#Lr%`4AgfVaO8^pZ12~a9S(fsdILSJz1)JjP&uq~YXSof_J@m99eV)k ztj-6zf+Tf?-}E=)&>i=Fez`@D6+@*VPML@c-kz0a#(B3bfXQ@Ron^zY zATSnVq9aqsQ}Xh{qN1=L9mKm&sdvTMJ|+l?3X6*fv6}9d)O`A;Yg6?eF_joH|3CHc zz&<2m=av^>16Ek=kON%2yAEu~Q5UlVhCJVL{Y;#c;Y5!2MMMr>U`Vyer-o!kthjvt z81LLqhw{v=*gW4ZCUB2}(Uey?FWAt74F zx~M#r)|=bMEq!n=7>!g%xYovI74==_KW%7eP@yW*-qV>AK#|WD5K8I^y*#cbQod3t zGb<7y?Hd@_IXF!2(<6^nRZ+61-gVYfDCZ@?#KH3+V9eIGU_S(qzyFiEAsKZYDV@Hm z=aUej4>SXebH{~}LT#6kec!JkMa4Q4abJ^;2*VW2;E^}RuSNJ5cK3Ryy_17~a*Fw4 z;#}X92tRa%I|e;7H2BL7WxTYO4g?B?2zt>XD9TiH48OU`{`ngOMu{!<0I?+Jp#d&V zHp8=lySTR-%voMygs6FnzAp@?;H-` zzMiH31``vlAytMvsjtAOU01+(_lLRXzJa5Xq&|x`NnL1clBh1S=|*nH2gW~z9^i!j zzOTe_B9_USYc3)!H#aA~?Qr`-@!})a(M*ofml>dbyT(v+H-XgitK; zCo~v{4=@+xbEiZ^ght92RXJplr{fpj@@8>@VI|m%j>)iXsbX8CQv^i>2Z3 zslqv!mOSnWf}s;nLib>!{X}buTYx567mzBxqV`q^l;t)0-bd!J-B^s_7;`3b8~3fQ z<5~wC2O56l$w@gmrxpAAmL3mRP2b1Mt57_cw0XbrwF3;aiQTGg4_Kd5IxY6+Rj8PN4PT-; zca!yn{m~P*?GvRCd`O{GFWEdYQDwbOeJ?J~-WBX=_2`#;2**1eBpJmXz@I`z(C=iu zoKb(Ic@dM7G@1NRe;`;W!B#24*I*5k@Pwp$f|#8yvPt83IGo8kAEEnwY@Myu=4{By zlo$-YL)yC3tAQ)v@nAiT;w2?z-_Q`!L$*SvAvMjXKjSZJV8E4OexERGZ7MZowxnF9 z+PZ!b=tW>ojrgHRk@DQ}mHgt~3F9F%76vA`!%?F!>k4>~SCJF#!Y*2B0LO_C=L0>} z{Wgy~9TP683M$rn1Ng4U;sxwJfZ{HD00nEg`O7NA-_SYs;imIa4JY=rRyBSEwv{wRX^D+C0z3D}Tzhw1}uu9CqT^GDDeepakIY*(&Y(4!0N2OIp?UBiEC-6#SmR}l04r^Ng zI!L|F)spA$*LPo{T@nP+ZWWiUZb+~qfq>+WomcKsW z?G7`LTS=vbPHnPWlGLZ-lHUI(JtyF%N4tpcgh~v^NHCt;SHg?cYbbB(cg1TqxfO#d zvo#Ytz6#GkNlyvOi@_N9@D}u@%O%fp6+d9my0^*0puCcGv?W8|O2*nUzs`xecWjN& zqa#!(g))j+db72q#n=8=VJG@J9J5=G0Y=*gZzG3C`xXA20E6Me@<_WFX~>YIhfoSl zxIu)O<4*rUS#R&;sTIGN(P`C(91dhYb{+Z%3wz7%nf!aiMt72evL?o=Nnn>-U0YaV zhQy4%+N(E;bih(haLKzL6dXOu82>ip?R{^rPSxt~5fOYzeK|Q4iye`R(89DkNu zd~LK!$$$K}E?~gJ^Bo)}?iaaOyer3)lf~sOvtE0`OL~>Y zr9=|6Ap9*S!Q|RA(xG7BAjRx4m+A!yY*-Ahv3K_w^80rO^hPbO7Wt1 z&P?%vmFoH55379^XH0m^mm)%1IqFOB_s@SUiPbFqJF4Y&`gff9e^WI5Z%eR!|51B$ z`@{dJoTiJk4fRLiD_WmhbdB54{tNx-QT$uI{6G45$ML1+Kkxhl`yEwS+OtK$#Lar&RV@Iz=09^4{QpO)i?J1I>1uJXG8r&-4{5Q)}>b74@HA$+oHwQkp-X^ z@8GHYr7Q76B1EIj*8U zfA8IG^b_uT{#%>0L6^}Q1HpG|V6B|lY{!@2HiJ*%>@3?O$zFq3(@w~_;P=Tqd+G4l zmW;$;{zYWYU*lhfgv$f>v*68qzZWZi}TX+ zVLxBpBcqD+;|gcm%7Uk#@zOc6YNydlES1vWqXT zP9_)J?3Z9;iapSud2g&cKJ5DG4#XnBXf)p(%BVBNzFNs@PP4`Hp1HJ1ObjK(aPdf* zMrdt=_(~i*OpTSxEc46Gv~%&&5?qZg^xT0_ud0#MpGvH->5vz-xmx?5(#B; zS60`Hbxyk60^U4rylcI}V7A`e>M)0nmev`mp0cCOMY(@yNp_7+5U`q)z~vA#A&lxM zEGgZ@!~jcQFqwLH5a4s`t3#=2rj&vv5`1#{Py_#@OY!9qr2z8!OgG*V(mGJM<`)-C zRrb~#9$%w#8&!vLR5NB3GYM72CrWamSSrW@2dSA;10X4Qi2U&EV9A|I%&+wqC}oUC zEBBgRIUX~ear|?M>g9d$Lt4JB9p3O+T5_&x0k43vvSPW$#@BtH?4z?3hHu}}J<>X3 zU4UF^$LF5lTANliR^C&8tfb_N*@eB*F?Q>z>j&RG54++R(yK>ac#2+U2>Q9UDkJk4PbcK(A4@N}b&bI&Zohoy!!o6{*N z@aGxbHJFdkSCweaUOiJ3~V&n?{ zc-dKHd(a!-#;HvMDi<5mMsnspDRY#Kn!sZwZ&VHar^n7aPxzj~6{)sdBqmO_VBY$f zG=|QTxLM8a#6U-#*32D0k>uiyWgLyk=)Ycvc|lWKE+Io4sHA{vy*zs||8q>f;3X!e zl)OzAt-8&E{>6d&W=>XDZnQ&ioU)Nt;+Wz4SK{ixmJ=Z#t2xj(kMc?6A@=3RXDKMk z@;La(F%&C677`kI_2_)!Ze3D5p_jL?kMFHPxlq|w@tB(K$vUgNcy2%|gEZUshLgy; z9Jwx(Wk((HobVk3}JORLYm|u6LDb6`&)M`0sF-{*y7S&qE=;bURALc^NYw>ff8AX>FBvza*D3e z7;bbxu!@4h@1b6$GV=^9|0?aK*t`C5-x^X#8~MGl9ZgMiPG?L@q%1|UdC6lqE|i^W z@N}LOjjX3qbsiXWxArEU60b3tV1nG>E1O}7RV&syiHmZfr)SJ?MgsXZ9G7}i13FLSuu`7VVbE+k zxlKu8cT3OZlDd4J`hoC4XF8P2DX#_>7Z=}Y(;cN!O*t}lw)eZCLZC=YeUmsqX-Iq| zuvSf}y?NL2GVq893j<40QK>zewZbz-bYe@YrXP!6L#og#OkdvwxDVhqvq-eqo?ctq z;Gw=)G#uu@gA5+xFp|2yyu*3SC5I?9J+xgY1ROokzCsmDjs&SJskS?=Hab$~twdwi zsk&NNm|-6)qUAcGfH$GSLa=#un+vE4o(&pENPC`|0;jfiGWroe>b`kA@W!sPkb$B)@D4C-v~6?+PXIg$F~3kv1EAE{Q~pMge#)IMclhX215yVS#){2 z?82bGxzxFd@b~iG>kU;SJjQnM%(vL$5i*3ONA?T9tYaoT{5H~CXD}DOV|pWZA0z6a7Bl=()@0EddYGckfsH z;(KlZo@TJMe0xZQ$7T>7lXKv!Y!jBNu-9}N0^Ico#Ss)jjuZP?1vdOFo2~l~AMTf} z52IhKpA?&t;{HnrV&3*@4aL%N3$VbZM#1l|YZT84N$c&A!4ZBL)Dq$$ks)*6{d;8S zCB@;jIYh`y6{i|?Bp4_laoF0nChs60UdKr->X5doLUu0%@W8;5sw_L(Xz-km0?VSY zEC`VpsMj%!E;x* zlP0-T;Pmg|7cKD|CAdXPc52(Z%CQJg(*hNBA%#24Y_p zYjk`~@y3>^AOgrm-~q1QAIN3Ah8a}FqHFROJc#cEg`i)IVRiuZPL=)KAec@AVTH_( zph1K7h~R;Gp+-lnah>#wVAjbL`wU7S7_mw3(19&o@k{lN=(1(*chiS!y~1#h zn4B*YpM$uZh|NF&YJ)h3L$iu;psNj9v%uVI=HqM76=v10)o-=K4X;~3ohE{3`oSbL zHW1f(-nM;@FN!%^hYrUrptj~Stb*p(?60G?){?5Si(J5s^z2sW?=9-+Kv*&?6eh=- zXNf087mn4`DwUDJ(V2qh8nF$)1gyz1pWNGw74sm8)hmdoE!FWQSWoNAh{ARkVkuvW z)F^WL)Rb=)Bcl?2beghkbMjnx$e)qse9IrhE#UL{_f*2cP7_(S54Mhe5h<>-CA=gY z*4tuZekK$gvA?#Iale(ctWCJA=V=;f2vLqw!H;cYyr3qhL>AmU-+4;BK+EWT|8e<^ zv~*AdS9`|XnQe-VySr3I|5#tm?)i(`oN;;UDUJuEn~NI`7P?MDKkFV6|Lz((i(0X; z2ELD0kGk|6;0Wc6R>ZKuYP%6}^yJw9qhWS!!){5fKdGt5^#%cGW_gg^Q1Hjqd+MQ3 z--m1((AAJv5y6$hP(^hMs6Kb(P@TYX=48O@X!)rYl9d~#!>I;$2HfWJvkQhd2*$2C zl22%4HhmrNrwpeN7Z(4H`d3Xpw(JhH4%JS^3S(0PW%Q}rYu4&3t*s+NVrs59v9vOi zm9#YFlB~YoUn(Oh)~oC8O|5QBy-*)hC`xOtLg0MxawNNW6-GHJ=lL4^iP##rdrxAWpLD0XVX|;TYZjD zOsh=^T2zA)!_}Go6gA>QHg@1mwN}}xQ!G_$aB#*h2B zvULSv2mtyTpHN8?iL+Q7PjRmKf=Jw2Q39zdNu*+S z=-5;3O~R713o|A<2D2-Z#rgTRTbDEtt2VdrQ>Tbzi|hCmisR+4A>n}=LUA{*El#E- zgGft5kTy1qP#&}5VaL5U)m0vIMKBQhZw#-qf``*zR;a{&4}W@c<~^xHN$>*0{9{+i zp(^_sigDC7(_2Zg6p8kn2e>{;E)AyYx;Rm*8R56kc$8b0*v-X!? zn#wh@1*W$TOb98?u6}R=H95ahZOTDiDk46PK01$=_vLB0$&+rXmsBBb@8lM%dV6=# zJvL+69mNZT$paS`F#;nkS7wT|H!>Qg?w;A0qpS~zG$7ruDzp9hnCF|si)uSEjj_(@ z!a}c%ATm^l1b8kL`Z{BHFOPgguYO#)tYQgDTM$+uA!@W4RZl_KbR`J z7oU3rR1=2ThpSePiGMfsy)Af`AW_XR4weXtHK_#!@zseu&(L;k*{^jx@z>%ah|nR% z@;>_d)&23YVFvi3fGkORZUq8g3bal}-%0CUqpF770>;ku)MlKv+*5=TmE*P8Ry(aF z+nQvM*O2LG>6+qhx3E)|DS{ux;9P93lAd^1L~Py-71ITY(Y_7~QtT`)XG7qT+LW;ZMdfU)|VI&UHWFr~5nxXzqxk~OVHr^3aE$<7N zR9*83AJppuvoU=qXYE&B++UL+TtnrBS_qsHuTBv-n;w_EZW{CDA3(7+GexhwYi%-= ziWzfBM1%r?);dni3t=IK6Dn7j$^c`71`GBIAt5&v!Z1`4G;hVL*v3XJ8rabw%L+4! zpZ_18W{+x!OvK`MqArp}s)NQNNA2p2s4mB#yG;bui`VInztsA7p%g2Br;s+ongXu# z&g@^kOY6 zuv`8aTAil@SYIBo=B`=L+nq*3Nl%3Bs9w?CH8j>SU^lvc8>)pxJ%8DIGv0{+UIU^& zmQ~*+Ky71b#s2t&H>}NM@^>^(!v2AUKef+xamn|Vg|S@Tj+K?G+gwW9qwdSCnr{yF zOHwImnBMc}YWFf>}X@3aRw7T-cMW_6jBCbczfK^H-NO zcG^tmHYa>)>@V-_a*Ni_?Nr)qoU?9jK)r=w7ayCu`JHbMW>35%v_UO6%qwin@*$)- zv^e{#doIhC_P&NUB{KTmEp$1(o$OA>-EVVU_CjF?b>btQ%;NZ6uG@*r?ZM<%lr+m| zp24Vzg4#{Kgp=(<%8C)nZHeDDMOAH#CqAC6cA%$qeI;Niu-rMnS`TzUVJD=fiPr=c zH8k;;<3(LfZEp)|k-Qr+w|FviQb}cz3ux${y8W&ZO)pRu!L%xq7^9XEmp}4aKOV%L%d;w)lKknjm9`;n z@^hCFNoTVQYs=wFeW{Kq#};?DpG(&DSccxQr>{KYdM9E<%RK3Fv{Ub9`CoMAH z6x6;*BibPolcV*bTc-e5zomjy=d_h*Vl?e)r+E0r8&0k~Tvg@U$Fl`2SEu=HL%l#> z+Z?TmlX$^VIl$VPNvDjz2E(zIs|&`jKf0f=k)^>@u<K-9 zgC#dKoiMQ$b=awxcYi(|5Z|AK?U~e%;N)y{0o19$D*kR@V`T+2wC>(sR?B@i4QUE0 zQBh%(`|GnCD<+!8+PX=2|lPH!-5+!#!;IC%D$dm=;8CH`}i zd&_S>=MRs%ZaIo=cicrmYge$WjP5|yGXpKq{HMVn8$wUfvc0}=&(D~c-^=A!yoTO5 zDOY=m_6*MK77tr3xe`>`s#R^zmn{fX9qsh>EiEl!+MP1#&%QT!pI+l~G!T2CyleIP zrRPZNDYiIQaREKtL_4M+UL9ox0-G`VoW~Lt8-9^JfxA`zs7Rm6#N1)t6-Y~u40BhE(nu_A>@~Bk1a{a zVt5rcyZ8|#tgB)p*)TBzTXqv5U4?ZLoR1Zc+t4@;oKC@Lxlkc{J-Y6W*5dp;Kc}tM z)bCK#-Q590Jm1vg__^ixE^8)k{zt0FQIsJ<$|c)|eVGlAN(%bKz#rRCH^XN_Qn2iW zkUqm`{?7{=kH?UI;zjlI_wVFUEX?ZvNz<9`Od_jNZB9x1vSDDvvuUo@LH^@x64tU>oF)c1@?4)kXtIOXbH&@98XmNa4=+ipGizEtK7R-T23o&9E zM$ft-aa&9@%M{0|TG&d(sJ%!*JGVK$Zz8g?AFJ_9HI>BbTyw1RYh^q1!R?C2ed2Z5 z;Il#R-y|yBwY~qbh=Cd1i}wq^4>ZNY)0a--u*8!FS6N7Fh)VamrTi>^9YcVzHn zSrQAq=$lAF@*GeMWChrakS%^v*Vn%_aoeZ?_iJLB-hvY51^t4wjxGGkwbj@hY;C%T zQslA>4@O^p%2zqIyVDyhPajETh;(shO?5MQ>9Xt-4wG}`X>|>HQ()DXr6kE0krGtd z7Y_SaG$m3++rNLG&S5VVCbzMA^gHv1TE{W#I1(Arc6q;APCpGMcA&xffS;lyhQ?o*)6;?JY|Kz$6amP%L2baam|i;L8u@7N#TBxWx0S zA7&!XBxl zxeh!xrntE9V8??~%7&M~%mxwF{8_&ef=*gsnA46E^uv)qgPtb>5#i?Xg!k<(ZTZk?G~^qjP;18Hf|@!!=Vo; zEEg~(Wj;Q4zg$1>Ac*wALVUor-6@0W$s1L=iQ&a7sv3>e8I`h(7DuC_#pkZI=cn4x z@LUDCsrOfP<8Y?lRH+p#VY9uxOgX{K2023qxKd6sT&O(fN^Eu~jDhdg?8nk&?tjV1 z#cc}nl{!5-ZrRUPQEvO{IN48@zt~>Vd%tx(o+;XeOZ3=rzm4RjcD}!m<~8xN-;b9B zm&S1%Fa=hShpsDdvOcUB*6mVnS1#5X8uZPi*yxiW=Taz47>%ylCd1Zk0#lGzOh-hl z<_n`80Dv&aoDp@+02fTHyxMS$U%MrDx*G(G7+tq-9RK>GB+{`o6i*SfR&#ll)lW?}I8fF@HV%#<9` zC)4+NnzM$?Y8*0~ekDNZ0L6{X(@k$)jR+B}xNys>p1IX7j2p*v={7D;h?5mm4(9@q z{8Ce$9AiW+k6|eI?YNjHg1xy%C@YkY6xf@!2vQlr{L)s3C6#>v-WU5}BcCo@`*Z;M z5w)m#n29cNBL>+JFD!T+wryioWLUf zUlUyiG;56hjQtThcK%D;lyyj!_Luwc13QE+V%dP%`mcN*A&%_;2htAyydM5{bn^`P zAdi{yu2!E?h5Q(JZtUrqw^>^M6w3i!(&d8j-V*^iQ{3#C`veIa~@DJCC=19W? zQ#|}0i;H&|4eQ+C4sw#b)?i zXz3Y^`wCB>h$#7Y((Qq2P6K_}gq4bnBL3ZN`g`rDZy!uh#*mQT(fDwrp^;sZ8?&|= zX}C5z;fZ5d_Tmol9WTWDf;RQ-67|(CDmI~EXsVcj*LE)!T`WiAOR>1Yx}6nAvHs#B z=GMhm>q$_ET!4ZassTDWBT7+U=NkKB!!^R)`4O0lb;YtjYkJ>b=TNUaxaH)ScvXQk zlcxrA!I$LZV2|>Ufc?jC^LE|7VxJ39t^puqi_}V?K~VyTfk7bygM&tMn}c~_Wj;Rb zWj-5YK599&(}<2{pxr@1ewd}yo0-x!d%Fn#6(Pd$)-`Q}`)v%1OJG{^@p?nsvJEYO zVZH=nZ$rYusFg}rAxANWwRmk~LR2jlKQ2H#V0}`1 zACV|QFgQG%;uYB$pZ(>tp9$i?7Jnxyo1$)NYD`J#%8h!tYNf5cQ06}`4RhDU`Nb2z z?Sc{$Vzdz6T2D@^({b-@`K&PNOC4H<&1EN)rxGZt1RMHwK4B*0s!oosaO3$&p!JqvR<^>hx zMz*{ci8(J4z(0a1dX0x)ts`cO79FSonof|z!j{l@X3^1Xwz$rjNc~VXG_>-q7tnZ` zlcu}p(mEk~5=>C74~@92`?o7exU3e>+rBje0#IyblOzOaVg|N&oCkba22*}@#U%{) zh-nMVCNG>x+;H&mC{COvo3B%dE-RFm#AN1h_neoqGA@~P`Evy94oOr5lnr-}X-fu? zw|7$1j)}&)7RjMjyi#jsJd{dofC<8c(49M7W{cx-dnMGWAt71t zd;{ZK<*!c5%PnrdwQf31oS%Q5I79K^bP_|oh>N=_UDeO{`k>C~QJ|!UU#ufh z+>g1JRtKxEL21TXQ`_dQrLCQ#tRVL)x@Ouxc^(786SK1DJ8dA3NEPnH?AzX+Zbk|< zK4NLQS~{Y!oHq0M#7_2>Sy#VrOymF2G(I$6I2EN7eaI|NR!|Pvs2wndTXkg2gh;&u zu)GJW;2w#kI%o6?^4X~>#eUi6x!Kj&$LU$}O@133Ah;<=a20$Oc`-(GYG1jhD~^tM z%K`cENTtQrXBLp>WDQ=VWG7bZT~d$+MTCV3fX9D}YK^nS5mk(H3_~ukye{k1A>!H4 z)R0p2pEbx$WOEs000BscoU|-0UBAoW?DLSu;NalK-?dwd3yMRvm8`5Ex_;Hi)_gQG zPggt}stlns0(Efx3@VROIgITe{?#Pi?!>?K_72_=NTC@H66Kq>+b^A(NX;s7|q3wRy%dU zRLTGuoA?HcwTyaF0(T~HA z*2aomIz=$n#3bCY2eZ4(%vLa0%_Ju;X-v&-$7j+4mosz8!0GA0xiu!^v103nFuWRj z&MQM^V`1=78?kXq{CsX!2YpfAWR(+oRKsciqj)B8>EmFt4Gsy3+2^`C>*Ye(7-`ig zSjCODpR5fZEx1UjR<&x!k_=BXXvU$W z3J3}c8U&vs370C#)!nZoqj>79V{Q`e;4xYaj{Y$TbGV1MIM$8-oDKzAa*QyQ_7+okr;^L z{SKlh$v2W^T1^xn6xSa-Z-9jYlFmUbnr`?p9of+7 z44IH)W&Zuq-tr?iRQy+M!{tY1o0C~wC_bLPYm6VmErTNYOvg^^hhF_jXc2YBMqiqp zkIzYAvF^|3xa+5-yVO`KK3ri3O;c8yE`lD$wTxwYj_|fSJeHQL({B(H`c@`Y*+506 z?bh`K%Nw%Hz+9okMA9P9KGVR<)Atn?;+=J+pCqZ2i0l+^eJYw71w=0jz+Jn;v z2j6p-RBprXfq@ashM8N4aWM9asrq;VeUXLkxe}vI&MH(NLnf2&guC7sDL^Ck0%LGA zJC-)1q~_Y{G^aGk*BSpUqFLcpz*k7#6JU!PyWwgTBbEbxTF=nlsi`@0%t;K8J$#}) zl4;eC1WpI8U^LC2aUZGy5eVil`Znpl&`3{tY}eg3P0o`fU`##sf^{+Ju1druv2~#5lN` z%8@z90xL|q(?hBWtS_`WWqr?eErHjTKT>VQo$Jf|?H8r#(R9AxtJjd#` zL|1sfki390Nno{0-1`q|7gU_zD>YL|kA$ui9TiY;ahZsds}mCk^$bsaZan7FNzN$= zsb-gtNaLkkd3N<|uLP)}toep}8&$5b$Q`gbd^njs0e$a)Mv&k$@6ep@fgi-<=p-Z3 zFu;>2aL$>r>a@BiYw2yLP7xxp3zcemdio1W89AxUDtew(9M@HjHlWNy;!yJB&y3X7 zu_m3O#{}bFFBk-s+Kz{9p3~9M>7+Kw3PWz$*^3uifcgB*@3{UXxrK!#vS*|g72|NG z)m8RRli0Kf+p;r5V1vO)^71+3>_HT6o!DrpS;>CW;OOe8FPj_cs{dklej1}qHe8mc zH@~!J8$Y|1`p<_f?{VJqw(te4unSnuyxU6 zz<`(YMPMzht3J-7E|UuZ*+Uu@%^X;F2!9fPc$7EwEG1b88_O9ZsKwGcpPGWAwWDpx z{Iy#Eub->Dlu%rOTk4m(6WQYa2DXWBkwg+`Z*yTAj<{Lf2_o63bI1}(}jOvOsQX1HpqrKuZ~((wb*E2`i4{g$@%y=J0IWe z)y#?_7j-6j#?YV;C-jR@)L+uGu*rG2anLi;lDP5m)q&C1?yicf#B04_oT*2gU(Sv) zM)y9(y#bq63boow8-J71LAeKaI5?itKW8+aeLa=g0S5s*$wimVM9+c`;L>9wPt7Bk z6-tGNw+f}gz+f)}Gh>31SOklDL|U=q&gaakEe=~=HMPm#%>fM>&!4A7*IDw33n=qN z=o%RDruBjO$-=@2Cp~>zPKvi@LC;iJE_6seor95LNuInUnI4hXWfLs_DizLazgCiD zH6f86Wk+ zVNZY?!zs?iLK?EZpkV{EcThHiTTJ)lEuEQXQg}%mG{a&pf~WA-bb)Xn6njRjzTZ!_^yJt^QofHOBsvB!LGL4%>RL zSFw&Nsc&cBn6CR%Kp$kFdT-sjRcbtuIog^#xJg+CeytaS6LA9m;T%q0(AdhGjC0!e z#8Xp$GO8f!ww-bvJ!Y@m>MrQ*1;_UVSQpWFV10(2-tX*0Ugq10L1yh! zN2L-=XMA*rh0~7UeoNAzgsh~!v+4-1`}g~UztQ>2*XUB&%&jiycBaD@($_FjSPMtxapQRuvM1A5BTNSEkcEpn>&N4A?icgsuOV&Hgi6dUpn^X2 zG24R6zMFahx1NDfvGah`%3P021dVmqWj%z4qlE-Fw^@KDlG9#PzGEh{M3La8g2T2| zU`WVFxlTi_(_LnxNijq->%zF#CJa_Z(aq`09{z7{@gyXE{_G$eHpBHWld%-k;F}yD zwIF^Oo;?++rvBk?4O)+Qz*-$*wA(hSj-+kuPW~+UmuKgSP2wl&)%G<{>bNB(e~$FT zw%&x&iqrJtYR|7;$BWDqpaf3kYu}CG2cZYR%@VGGqt2cNjLE)W`6`U!{Il*uge!ua?HGzp@LEgo9qLA;QrbQAtTxR4GYG+V{)L`aw+&*4xLQ1x{r4 zu&IY+35j zMY_9NO1iu5n69<<+2`#2JolV)@BGK-!O3LK`Mux!j`176crkeM3v2pJZSbc3^_o6L z?1f4m(|3!vc0swln2P<{6y}PXU`hmFzq|8UT(){T-j+R8|7y#P{?!0oVP*VNg;rugZZ7a4!I`fKBgOj`20FLH zthKHP;Ea-JNQIOUYv2a~ufWLrxQB5_qRsZRBQXR*NEc<_n5N+uoQ{PBHiWeAAhv@C z!>vz61m(&*Dxc92`282SPhoq0FQZaCpZfk>7~{bXX{DmVm*L_5g_c&fJXdS+l^|TV zT#DoySKnu3_>`x&=7zW}z9pwmrB|rpQWI5} zd=9~nVTh`3-ZrodEVQvM&AQx`K$?BN`-2gF2SPeeb)_iB;NZZ8b3B{{B@)?$BV`ab zSIVc9H)=LL%LlPEaDX;YKVrAQQ3(eajD5qx)!Ckro)%m^0RHEHYcvv2JLDSQ3*Z+E zSY`qC2*&S?6(9ABe;#=@m{%SEAb^K=kCvvz!Dv|c<;&TPY82yTg6DC4X*vSW$DL*9 z{~M47i$9JRQyUJv8e(^2Q)4$)Fx3tP2}U`K`}$1pceSw1qbDG}Azb3F8UrUetr`rFN6wVCC_FZ4w}}lynpf9h^F# zwzo6BX1*^^eQ9Q4Adae9U`<~<2Q4@NQMbrk*aq>wE_!02a6d3N&!(gu^8CcJ+LMD$ z_K23&c{4GYQCo;P5)GV{t!nBQ7Ro)pfL$#w1|m2-Tw6`)duk?+SxdrDwuWhdhafqp z!)zOfFMWM(K(t>{Fbcz}SZHanRv@EBV1U@yy#t{%4^c&8?(i-d^w6d~3O1Z*1 zaBPORsx?CaalFv&ebI#OEm1n&VY9C_+28r4&MbH=rgmMJpMGb9_GVuJn}5i1>SFJ> zUAF#H+U}sm)U60k%igc(nP}*HjbUMjS4ja18p*Hr5`DzX&YBhq?2(Y>Kxn;QqRK7} zGfQTqJ(Na;_~3`0p9PafYtIvNQ@O!`{r!u)r5`~Mg~SlS5{rdHvaR;=rQ6RDS*UMc zlIhS6nMJ_10!?)0zJ1^2#I4#wpgWi3n*_xKJDsfEK)NDqrT;-yJz{Dd7tR`K2TbvN z?Pm96jl;72p*a2SZ|6&`(;fNhW>|$vL?i^`9F6*hE07o&?&_SU+TCgYA@Y)uf}D>H zGc(vbj4zGGdCQ^wy-da%^< z3NCJ`D0cW5xb1kIsRsqD93gR1!UlL`g0Z;<3AxJaWjNk|F0nE_Ii3j$Aqt4e47o-& z|10bPCFM6?ybg$f@x+o9Yi*+EHVh4gi7FO9>)>E4@%k+?=vYAYfPxXfwbm2R`dai9 z9MxeggQSI~>F{Cm#}Kbi3)Xgab)BaKfkna#q%j!!uhFSw@P{5SC5%-veISYMW~T9c zUrj5nefDii_xm#Y-7Wx{zGH$Zi&a7-+3KB9 z7ZQW4>27p*?Y&bQvvV^i082Ds@yD#Kr_ms7BMoi1A8v*4^Ek{F>{(&Ju-;VptZwcJ zHvgM9b3QjdysU4MQ4DSq=NA<=`1-!aqL>6axNBEQq5e|pe9FRH2=&Fl1O@WM`5XNE zIrk(ol5lwXQ{x+N+D1k8$X~aa$mX?Xl3{h61Z=^w1z#*}kS`m0)#*J2fUVfpDk+EF zOviYtQiOvlL{&*?=*uJl8dr2@My>eHlkFa(;?xGn$y*(6uS_YjZH)4Ng(vT{K<3-o zCj+B@LzAGS^sZbs5+uZzqb3?_AS8tATmgDn7t5_P*szaQrW%_v9`D{f+|)HQf+W?p z1#8oiL>w9uw=6PX^N!Fdx$xtVdFFnP`Vw*0s|k$yT6u6%Qhrb(u=6boQ$?!WY|aJC4&1Q zC#8AU-jm`u!tnON-l2-O$5G6I)OT+W4j$tfT!u4^sg!OJ3|yvMmMhU~f<(Q#5^?Uj zypp7!c@y(@a@P_he8I#;lrap=9a^F`J1E+QgJi*_f{@b|)sBzk2~`NEQ%ZM<=BfUO znFELNO^=|+NX=|y(IWEqtOBw1_;+3M!)2<#REYE0xVbT&uQ^_{=hr@LLBhMytj8RN z5N9L3t7Bo(SLhrL4U_r8N>)O`3)J+389T06h8!$X&W-SR?T6IVsi~P1)nO9KjNMSS zL)sCvBw|uhO7a59D=DPDjnCayUV*C;biX@|cQSa-lX5ctn_^OzqQ0UF8Hf^Hx~W=W zO&^%b`qS`jF?cC4>&eu5y{zLtAQ>rh;ta1JEx73BK?&U8w#_OkdZj2-4#{?XUo{vG z?UCPj0U)o?WxF~fhM&hc40qkWeH&wlC*+)y;U6RtN~gXbmOy3cCn_u_Gu8natROHFl^!y4yX za8UsK^QH%EK&q+{n1nr0Ws8o{G4Rd;^3AAS%|J)@YdbV1mgp1O@67Z>sX?E{UsE2R z9L$F85B9V(?6p)?Iqin7@+X^*m!0^=OGrs=z`FcO7t^jRfBq{LCbg`${yvAnB4e_@ z($`jAUcdusbO=v~-Ck`Fx6*eqSOhE=iQsQ^Q^H)&^NUDbqA9ys?@%8Rm)^S!A8|FO zCSZMDBfXh@r27&%-w_48Opv@Bdb>c2Sap>s3GP~_IeQJ44?fJB(eadUvlsqdi2YMA zbplh06CAPmKl|I=IsD4N=TGQ9r}XY)q_K`pFA^uG?@+qfe&E}fMCbq$G`j;!B$Qw1 ziW^eb(%Mep`P;}8@Dh_wpGJk~zP`SY)b78tav&dy&|hi&bH3F!j7+@UP6Ha>lo#8^ z@vMjYtJ^nGQ<ysb@nV~)*gIi zC0&R|RoZR8HY#HIPGwfv9^F0L`nYAzi9A&arEUn2GjH&KOd z9M8EK;?rwaJDgIn`-Xwu>0qtV)2gQF(+L7`1CZB{)J|C?SuIv~ypUGNb2#ldgatjr z_jkQu4Q%{f{9GAiSWUpjxNLDrRu&!1@PCD^LV>bAR)NbO94zwxpi+R_S$c9$HWAi?00uW z$K^-?@bGHl)WpVW^UbfcYE-hu#;X`2FnUkOUENr;{bS?B-!eKkkz3$@%$tkl8D0X)&0?+%(`c7KXs%qbjn|@Xizl zA;|^$Kt>w8y|t-GEOJ^3$X>xi%_Qz>>6vM4M_s{^gC?ybD+_KzHHxDAf*7#I9%!B0 z0sI7y0d^NGKQuH{GU!C1BkLnYAS^W3i;G!- z!Z2N-qX>0Sa>AES$Wm;^_ixmeK-|a2=KFa83?l&PUmb5(7n22w&@B*o$FdvhfU~}$ zVkpr2&bl?RP(9o6x>NB4ZhP{VyYIYUk)KQSK-mhV#0mJ93vg^Q5G;Y`+o<={qzeV( z(zpjE=n%a%K3aG!yuG!nYk4BwLnKgtb9eynQ zFTTqV4)iLdm$W{K^y9l3nY+M5A1kX|A8~#0_-;C~o5KLPTQrNSczyTe&xwJ?R-NG* z0oXgfQwj4Y=B1UD0h^+jo%i%mpG97mQ+1T1*YXzGb4n62y|#|yw&&j#K>Vot~V9eC6%Otp1mm`+1g8T`MhqnsE*n5FRe2etSiP+@52ulh0+e)z32z zF#r7gO8o8Be@qYm*IEt!|No}+)BX?FLxEt?N3FL;@4c}qw&ro=4QVtA{gNlIfffdVk^51KF3?bTr{RgNF;b8cdm-6Zp)h*FZIlTg}k`l$x5aYEnLR@%r6UWZ7|oZ z;g$r0W@)MR$5jt2`m6HN=9eBFc7U zV+8CGv!h;-96jWkQd9S(t*7z?g?2G7kH{vk9kZzYD`&5F9JjQFgptP8E_VPLy0pRH zhuKL-2N7g#^pLZ^0M|=a~D&`tEsWkaN*QxgoU7N9sLL9MqTm@bQtIaJ&>bL z`EYAC?wW{#qM}-5xm+=SVp_Pvuth9Sx}@Sg4N<@fugLgPg`n6MuydbmDJlhh$^DTi z{>*IXm1Us+Fi8nBTg@?ZaBj=;^6RDqihI|Og6x(D>IywjLh2rRJ{ueV^ohs){KTIX zla7XAsDBW$;?4&wrl}uojJnU8zcSO;{}z?u6XG$M5-%dJ$YC*E?YJNe!Lwh#FXoY5 z1Di8cvRmF_;|`=P9c?spGzR$*3;`IpP5yEUG7migkK5&QV4~*{c!+hMfY3~%Fa~Sq zL~?IdHx(FYFk$P8TSwVj7fJJ5C#qygK8v)Q&}MFt=dL0$SbzeuLnCcIvdv$ z?(L(6kprnd)2sW6VIrkAQx1$~My5-5y0tRjEux5uzX0kJ4Gd&Y6jw8P(-} zku{8;A1D$0UR{`9toC-}Mw}TDo39t`?NKyKTTYf+&Q1_`eu14hL{84|RpgJ^w}2g? zlI2@%x}WL_ZIVn1qhCJRa6NlZLH&$K3i=Du=eK!5L)Tzc0|Vmn^5ZczLTxj@KOb-q zKH$yR8W)*E)n>+61kSRKG1du#{^v?I2tywpCg~lj2IpJkggwoDGe;{9eHn}(`k@N-#qTh93iA6r zLq>p~P{{z=g6CpD;vg^uJip-KEdsG`y880<-si*tAdavD$;F;s2}mw*#zD?B1ikTp z&dTzO&MYjt6lj*>92*ZHX7j^(Gx?JoKIi(oQ?TRfYV8DRz=j1w+jA18;}5#XTW$** zmVHXrNvrdQH?2@o-;du8E|d&*&i9omszYNwq;5x&;GKw&@(#-c56dbUAwB+RX=ssH zlLU+p+bHiqK&IkjTG~RWulYrllz;>~4D`P4pgC5(Z~7Cbj`-9fHKI5Qinot0?y2 zOx;SjuK@0O;CO<(E|;>n?bk-pn&>Q{qPWUc^pyJnVa_A!Ig>2O%n|`+Wn}E3<2qzZwBnc zpU~73v7J#HQll7?i71sANc;zr;bPS6tB0#ZeBHGa%7L(sw&zn{{WCp2#3Na>FxH!E z_FL=C-W5qk`pq6~Monod?kR+UNi}ZVmpAFzZZyx%R9y(kJf)JCO?N19T7P`Cr_or9 zduRBeub?U5?v)xJfc#-iXRGX}XNx_Ayf|R;~9}(MN-AFy*u^D1bZr zPwl0s7$%KA@Qom4b` zsP}&V)F>aToTS#l?|MV&xnjMDSLDq~b8XDO_qOA*-8lCSqge&;H6EjG)g$7++<$vH z3tP<6{5(D)xJG> zOqP<6hfI)KUM4`J>VKi_014=jABw)*4{a*|K`<6Sn6dg?5k&(%__;h=f+Zu|%P=vm zu;P9prKBVxlIe`kxUy37sj%p&dgV^wH7{wiu@YaYI}&Irh>`w&eV`bKafL5MarFXj$xEpIAo~%nGAjbSx({QG zoQ6@9*ou8o{6k66Tx3=C`74qNm`gw0Pv0hFdV0l(AKG(`TDwC?^Z^LkDtWBoUt0qmlnVC*`vE(nIregCA`v1w+Ok(kss{}&dy^WEM_Nb<-be8 z;~xdLw+GXXlq1X25ywk$HB(l!MKTIwBQIU?Y1$e&M?aG57|SN6m5J^NoxBojn<`$m zmYt+Le!WWRkF&u`DHu%?VeRJj9cBN zX0|Kto7WS*w{Y|Vrh4H=+}_@{G3EXxJYL#dD!%aT`Qo}A8v`AU(_JE(9IINkqYocG z#6O~*~F*OaKLEhQAE(ONc1?=c*{1yIE|1 z9b9sc>=#j0oK+XT!S@OFFj5{Xr_BRNs6G0AzWdOnLyU^N+amt;`>=SjYaNd~}iFd3cAOn3AC>!BwW0Re%lCh@%muJCCf z0F%Z?%&!?S(kFH~wEiro*Nowv`|R<_-zu;490oQS@$-qv)Q%;GY3zBR`l$AG&Fxa& zT^WfR1GvQ2!3IH0Fj*$cCe$c&St=^oo!52wS0Xm_NHU*ZN^~7NsA70XO>?t!DgMh~Nrow49ZTH=!U5{*P^{K*2d2gk!0(3OPJDTKQ2s4}-aJ{|5IGLa7%~?YHhADrTEkNr z9v)6jl?r-@qb;i~ATn$_ieJvIT{gWT&5{XYC@bwG+4M z)8Czs@6plH=dyQS(9IK*r3e_FavdD;rHgS=V@!3v>c+nt-qM!89_xR4S`?=IC3Dnz zJ-B~4y__t7?*JELAJ4q6`Vsdie+ z9NO0QTdT`M#>O`B)-g&qoLiBlwy3dE?X5H#?3*g_b=f?XoUATA3F*LTeNeiVXQIPo zzH=lwZm*bq`}QpsCT60MQhc(8fre+SYomquj1PiQkh6Fg&Oj~<|9crBq0!1r<;$At zh+@gkPOU8wIcp!$M@VzRCGLsVItFM#DF`jj3CoY>aHm;!GrsWl>`c{URQG$TWO&_C2NK!x zI)EV#(bJiJ9Tw1*E?s1Rw~iGSYBpUYEH4mCV?15Lw*RxM$;Sx>&Om|d>x?=w$x!%Y zY-nn3@`lxBD#`05u&OSn9pu15pBsSLor zW`Tk`R*rBTByMkO2V@KR4dul0+_+lTRqgdNt`^H%oRw_=pD`jkIa>(T+uMJ4;}92# zBflR1&Nlc{LQ-NHSb(b>y|;HXXim=`JFBm%J8Uj5FYhh)W*e*nhaHoIGbmj9Aw|8# zaFZ+8lf$sX6YRhPQTPy1;o34BzLSEgiC^eRYS6 z8e4i6S_yFYJCgPQwx5M4gmLr?z|G#H5z?IyM(TX@rYbeFiY}UFKv|Jwyw0wBvS-#@ zv)ij$Znmx1QfDMh$4#D?Yh2lf(oJMTk=|^$^?-Uh0DY8)vGlj5f={5O2rSeNzcW*O z{^7IPQpe7>c$p`uKQk*SlwT^5lR4zpjubENv~}v5t)UyUs?E1wr@{0?M5{f?DJtMd zTU9wOZ*(rvFduHUKPr>@_H98C|JkwMhLJ_O1gh*Tt>=yEY8UnqLtBw+6#gGv{u(U5 z8!PpIrF?wnMstp~OJB8gyFjHSVU&sOn$M#=L}ITIWQ`~E8nNa6?CY5UozCMYoI=vd zB9CyYrA7BPehq%%h5Z@WNu5z#k*#{dwZ5Fo?!2J7fo;a5WDNjb*_T@UEg##5m9j?P zzCBbj6ak|<7`{lryLQ2)$McOPT3g{#nyF6!W!ozl0(A^LDt$7CYbpkG^Mji!7I%9L76ndv?&GnyjDA^vcg-=cY;# z=4NEX1V??(*qLP*x_JVsDM<=I@YhT#K_+0(ajpqnyldNac3RDI z7c|ew@u)diRz80Jx>NP!6z3PS84+41o!!s)M!Vl{q)`!vRH~AiVwxV*cZb|?hkstx z`Bql&(Z41?QmL5c9-EMPHKy|B{L(#^2wM?+Tp^OuA-4fG#I;XON2KT-?etOs-D*|# z4To0S_%8BxnmZf`(%q$-Z&EvtJCp4)OPTWN={jzr|L*_6tFNaAWSLuJT>%FfZEevG zYs=&9;{zjUYK1TlNyGoo>X_HMgXGUx{i3X#0Q~#@sRAfZFCM1tzu+t{e??VjN2{!_ zweQWwqe)C-nO>`!3`(^v5WE193LpnZJG1HRLhATjs%-y%6gV~@We07-zC)SWAlI^~ zp~xvf`;Vx;fy}e>VzqG!LfPr??g%A$dZu_ZOEDApePsw39DB=2w0xG4CRk+AU((kn z2ZS?K)yOZ@I;1;4hAm@=SJc&mLZUM}=E}>tnC_$9VUdUEm_~4|%(M&7Tu`If&qcWs03ktf6ekn${VvXr?qZsvGmLFEOg6BsuTao<)Z z;kN-Y9skd`$cVG)+OzLX!T@#pdOK_Hx?g|yJ*Rd4eJGoNa~GFWzNmr|-wM69x5OmL z_iy=b;!<@XWqSwoXqYIxgMbw&rteNY;=2MaX?Nolx4V^>8L~T!SgluNUYvFvoV%Nx z@*dPH58Dz-ifCsq&TDD17Ap?0Ip$l+XD+-4QaJv($Itktg{6D#?d=c*pCrdG+Rpx! z8WY^h!{09GPYXU$9UtT*fNzCuhP#+`vijIZUZUSV){H*O1?8{0Yrt&sx7Ur@${! zNdGo4EpE1N)C*kA~BFxWwsKE5}I7`(8^ z?|O$Ks(>^^!iz!hJRw)+u@gQn(j(0YW1v<#P(PF1FP<5O=2DtfT;k!XLlnGZveF{a z;#c_wBV_BR1Zy=bt=cp6eKWq+IuRqEx2(|B@I?|?jOgt513jl_ zoxAyUU0k?Vey79wu~c=9qj50SUvyu)2x;z>qL;+|)#tqDkeO@9W&U$7ZZk=4WAgTN z(N2s6?XFd=JvAGZ-Ce{)qvY84s9&h3r0ojQf1)aPAPj|O*G`B(0|T;8n&X09N4dRA5n?>w?|vAS?*3*GHb zVSQm!`1+toag`&!((!nym*U$;%cQAKwN5;CJKZXb=zMXYp1H@PxUf9Qqt!rN+SB`N z`{=m;Fx?Z2%l~_BYq;nmkBK$K1yycKKJ0ApVM*xIwydC#m>{J1ll5_CS`+einm?kJ4u} zAFrKc5`iXMS+em!iE(wNw`sEjvD1yt4r$%1mIvnv-(St)@-A7q*fI4Cv$3;21Fk*9 z47x9SHOn)zF%1p%WyM|ZGYZ4GMJD(^E4bpFlAnNd7KXmcmJ_!z&~0qi`MHCEp3K5=xrnwTs)Hi;+avWkkwRa;l0xFl=}rPg`0gsRfj zj)1zUtey#T^}(D6&;+yQAHVSN&si)B$Z@N~cDYerU&(>}>|ZXxdmWw4V*Q9$-gLf< zjLixC)K0~5WtV1p8TqD#ZLv)*hy{vA&ipS&jXy zH<8!+tg!&9?5|c_ei9U6Cj|G(gB@+p#!ok@6^G|#Y5Bi#A-Hc&xL7S{d=7~w2x)!j z+0xe9(ozt|=bfK7lv!cK!cqBqVfUFUg&n`>+PDIjM^{+*!dpGoqR>qZ_r$aYNIDrf z^3nfx@5YU*cIaASVya3`??2##W8siS*DQD2RHIZltZdxhdAg#huoGNNp?K_b?lKm~ ziT8V=?UjH;WUAkdq!(Zj0TVt;lQ(7tZ$e{&?Uz^3m6twE38y6_Y_(YNnbNlVb#&A> zpAoH_r;pOyySK2m7BkcHltbB2UKi*Xc|W{fj*Uh2@ijbwT(2_Q{ifD_!|@V(UFJwn ztbmx9n5?zAFVqM2>?VpAd2R&Qk>T;V+38Pkyyg1)(w7J#2p<5`rM_7Tfhg(j=&&|j z4vq-bC{(4WKu|yAC2MW#`_R5Hzpw!M;*XtgRMlKmY-n-3wUo-~{ITBX7(gW=fZE#D z=0|=D@|fe|fJJw@HQ)rfi;H)c-m> z-QO{IdU-Cr3xbK;w|9Vu0S<3(-oF4H6e<{4Rs#d~vfP)d=@S^AOle+P3JF6s1k3)y zbvYiiex@cyGKB%5Gd+3wnM3Y-eQg-)W7j`^;&I%Y&ETgHaJ}hawX?^$X`xlX%sk4; z8P7_EcC+5_?WKo^bX!Y{jQoe~?OWGQ_b)axZT^aSj2Eq_cH-{70^*&5FMkb5%1cBF zQ`os&YJZDluX%k!!q$q+5VbHkVyCAi=QLDNN2yIPEHFE$(uxzeF7U)s#cOYGVx_8_ z5$U{EY^S)4=Jc)Xpi)_rla$M^wecBoRL`L%dyJt zvd1}W7(X@-gjJn#`+@?h9qOi>{h7R(Op==L{Mnjts+pR!WE!s0WM%8V!vjVllLTm!8|nht;B>*1-qpC9;nc&yqDB!$r*D74#@ zYjn+}%u_T|e6BN^Oj<5uqEJ|fS+47hQS}KOFVORbY|s zlQY0J2%%o(whKZ98N*=aiWXjFW`RdFh#!06el;_G* zyERtpG_-eY$SYjvcXo2A|9&=SHI6*cIiH3G2!sg@r3 z$gDO&GSU`PUm! zPu*VGc3c}Q0oJ`ADb@NdZpe~;L*CarWb%9QL@Dqa@V6m&4SWE&z{B@lcWDtT=31ZF zAolHq$f?lYAJeQR8*7tk@A^ci-@v=$G&2~2K;E-Tck~r|0FaE6CWP188 z(9C&j1FR{oTdE#f65g7^bz0KuSkd>LR#uQvc8g(|9&9x3_?$?(n^Y-)8N=glym~Ut zwj6(u^%G^JW)$!UFLn&~q0 zVYF*#eBO;ie9GMgTF)iht6etgBIg_iEIm;bO|H_D;};FzZAzVv%Oh4y@LR~>1gC#Nk$NnGTH&dQft`_ZVIZ%Qn74-K7+$Oqt` zu?oC*P`ox!EbPYX>TIW7Xdw?tTWY0dyt-XimGM&{Pkg{m;|i(ZImEG%KcSD#KTLZ^ zJ5#_3o)Ir3o>qkAs(6Ow{+VuF$=K$ce{V8+L&%AoEO*FK>hB?2&x?4)Ha(i5^wqy- zf>(I$_MKyqE^P2{RR4#u^uLp9JHujitTw;7%3fXXoo+0R$9S5Zm-f5b3xq&h#(${K z@!n-eUQCC&)3Xg(Ylg$*mJo`9(_0ubfjvh>6!>gcI?UI{H&=M-OZ&nm3DBrsXr5+G zAqkD7E$?)6Ddmg@gW--p*uXA>zFyvt5t`~k6}o(t;m%Rx7qwb&&#joiHHJmgJP}Aw zLj%gIbC+tA{Z&9mv$$x&+nq7)PvzLP8_U;ZkCpK!MzGr9G2J&+K0m?U$e|$#G&DC( z%%#3ay)DbJnRTIi{+{RMRlHSQWIo;&$sa|BnsI*t0)oF+H05z|$=jUcEcJ}G&KTNOo{nsHB(80kD zQLXV1tE~JPuB?E=uz~+MN+2Pr)k#%hvVg4Y_6pxng9++6&TZ@SY{JR`Ywojjc_8hfjj2t@b7?T=oStFULn$2)hO{H|WQdDBueH^b)C zVsGN3#PDTJ!HW07y?fOt0TIu2T*9T+y^S1xzyHj#q+Rv6rytjy$y#OgYp25C2|7Xc z80vU&*ykZjj0(HMxK~Ohpn0?$V!dNi2&9^un^UDnOQVoAwt3P53z_#Wa{MeqEB;N6 z=Se`_>!*=}9Z&I5uM=TZ78C@3&d~^jdsX)nrY!Y)K|obLVXPgFN7=!mbFJn9y1uv3 z&!c=k`XkB{x2$k4Zfs&+JTm1LpuR&o&hA~rlI zQa>U0atIS2=JRuZZku8pwF`Xu)s zY%Z-U*3&SGrjvaLAn{kfCGw}NJGv1;e*13ivlSt=FB#qIWMKx%#by8W_|v5uB`F|_XV z8YkmN-h9_>H+sr-xq;cHHo=A5gMK>gNB*FQm>qHMK->^TLu^?wZ^6fRv4Z@I^$V#k;A|rT_i5>Fi>tia zk8p5;phM@Rq4E_IgqR(ZM7eaRRhC0irBh#>os??hgAJ~jYnnv!0RY*?(s5H2Hi4fZ z#KP1_Lz?bl_we4dE6>Jkazie)B)8MAyV&Qh73A1KUX|k|=(P@*zpeKg(iv+agSUQL zbus~oV*vJk*hg~TmTNe3t2?VlkMc?B6hyQuT_!5fc&F*_QeA!j@Uf#M%ylaYz=?OX zbh=@rr7$ttB>b|rH_YQ?zuc9hqD-)lCjl3G8}Xc+CP*~1T<;#!;oRqzsi9Aw@1uQM z>0?%1?)U5X!4L~?)XY3fQA7~}H`dq90!3m1s;t_Z$K@p?Qn-RXhu&^nT`yG48lsOr zKUn=)lC8EjPAVlxp7`Z61hHi(^$+!}^s~I}A4A$MgYSV$y9k^DTls(1&!K>_h~de+ zrS2RK@bDAIVwtxyk379VJLLV$=3*$;StLNjg$3aR>$~X5bcXO(@f5jzI&Kk^Q&>y> zq}+0kaImqx>U9cL1`km1@bK2rMjc?++Wy?{o;AHTw=nzrwY1>Li4*K{6qXY>s7K(x z4`oBO4I>pN<$i0wUqfbZ0*#GT$L-;jD^(nEBpaGsC74sVLnVrL@>NO|cfT)w|DK3~xsE!juAxCbG`PKg zKr~PrSU%eRkwd>guI61Xuj|p5zZBKy?i>ZLoLu{Vt;FM5=Da$`?HN>SDyph99^r6} zj9ZN`hSMWWF~NgY|JyhEC^p%!Xa7^}T2v&X4HQIY*woMPZ(RLr8WLyDMuG(O^z@D< zIkaKhb~si`iS!1N@oAZ-mvWAfSc)9nRB&E-VUoNMluP&ftfl=Lj@B9ZACKv2mCf~$ zl_qoMxDgZ{CM7(MhvmM?TB_N5=I750YchTNA$SG~#@umYrT@PXI6vHB0q$O!LW!c)}0Rt)b9{xx7oQ2mD!e&zrC zX&=vDs!NM?pCqjR!?G$^%j#I+@?3EpdEPTNapY0*56|85&fGsdch-MxA+B`(YXz{WtlP&g0|I+sHiulg}^wco%g=RmLsoVc>upGNB zG@L&xY{~yIctyS-U&@F00w;F9r|c}!88R!@qf$*yc1Se>JgUU0=ufTXUJD6*Gf`$x z&Kp%>Uks7A-1)I1eq289m(*uXB7op!QTFO29-9yl`H{H_+;@`#?!9+157#Cs5^|8_ z`XkXHI&M8P8l}w>R+ApGAE_8~?@b1ypFce@9xCKFc9(X>4y3g!iF{yhJy*VC$#rD9 zU2aEAc;yG5k6*>Y@7LPHvhY@1!1$ve_)VnKaNAHChR1t%Im<;9Ew>1hwx!RG8ss?E z|Vy7y76KmK}UCJtxAm3YrP;kj-cb_SO^y0wwddFalbQawU`GKI{kJ(L|4 zztnEufl4|mn|l0f2Aka2c#YLTF)>lY2#E)Q3t zgtWpO1YDszS~@^2Vo;zGhpzeH^f->onT(UozkL?YMf>@@myq-G+5Xd7rQ6()Fa8bv zg$0P56F@nz9BQZ?yQ5j8+o>yc_{ru7US(y9d4X}b+2-MB|18%Ntx)jf}R=E^+c5 zpsvBPn(>x5^cKyLnJCAf+gv^0h16gdPA(`!n#{SQ*tX+&T*bRLG%=8l;}GHptVjBdE1)l`a!bTb?K&$l(1a3zuk$ET757rnbSVCr-KWoIu2u0% zwT{7Yi5UkE*{6QIm>z56rwZwesFb0iJ>T})tT}lzP#tmVZZVOOVe|X9clJxNzhb%R zj*LG=`}PMfWcJ0S;PwW5=>cO)Z*BimyWWYvT%8GjuU@vNBDtLL-<>6e-%n@b%gJHG3cL9{n#X7xV3I%PW!trG}+&eDQU} zj2Ebehq_WN|6Tr!V>aXL3Y zf2FM%hsnrm@}1r7V9^x#0e7+GDkN_$?Iu}F6_gY_OghcquF;AUg!Iq!zPCd~z{6i$#Rp<;_YOVq6Y=fjH@-y^T7SsN`4%<6$Zp1Gw`P$h%I6ci%p`-S? zxw$$D4ALKl->2r^(@3D8T$G)v2lK`JdHf)^Jj>9y6x+ul`D+=4q(s|6&a~-uAj~THyj9rrs7Cea7Y=uVYPhc z>&z=GHtuWLT-kqc?c^X>Tptv!Kop})0$n7Ix87C@qvC$p?Hky@T7MFDJMvYDsk91w z_zVH~F1xL*z0;(-e>Ao$xkDKg9jG^qwe>@^wZ*_@8Pk<{OJ=e7eknTb#9xyydqg>JT8@=voU{b&O6OAcVidt zyux7eJD)P6`N8z*=rR_Ocp~~YAeH#^ql`|3ReSn#D zM%K=YIejv5Or_DBf6ECQ#IAvKu3G=V$YYL8PHcZd-jVKMbxnr(UGKES=+#9&&jo*;uI5;1fsaIIm>-C2aa$ZYqP6VKUwzhQK={fw!fjky2d*3nrJ^|E3+I+~W$jRB}-Cn;W^Z_?V@6$KIn z9&vEM;*+_CE6?O1>uX}*M9PcjXu6-pC(}6jQ_t){ZQcW`Piki~vi)shYwYhD_42HUa0oFmnREWdug&7#`>f#~~BLpEdR9M2nZ43-3wBiLrTg& zsL6S~`lmX1ml4=dW%x52G+-sl-^y0)g~?x&0&64Aes0U1TE_Jo@V3am04L6FSMo4 z3H?A^{Cj1E&8r8MX=^`w^j6n>nK#u(os# zrJC!?yS4$ zcFo#9a*uwb6sP=uT00YHsQ-WeS1Ls%DJr2xD1<1o3q|&2WF18IEz8)Kb|fSr#*%#> z`@SXnzV8{?_ubf;`_lJ!|NsB_-+TV&f9}0=Iwv_tGiQ9}^M1Xa&&TWex*{dr#uR7m zq-7-5{OS1X-BEuuCb2Cv>U(&$F;2$fUi$y~X&0@ePjR{C&u6S}$=4g$ewRro_Y%(j zP@q;#I1>Ve_R&jZidraaZ@Wc?Y+}39NpaRGe7AV}pEU!nazX+i3GBtc?ntx#b zpNUxaqdfnk$LoR*|Ef^`3&rpMvqsJoHlCN~v=uVm`};)4qFDJ^a*8iRJJWHK?Z335 z{`*}K{TEty{(kj8(+5mel}kXd7CeNcrQ$gS9~LOFdBp!7to`2dqUV{Ug3G^;ji#d> zT`6;@`_R|qvE#OI;Bwc3&zbY;XMftuu$t$eZsn&Y%iX&NiDCgE;{_Q$3d})tT(piX z|Nb8c`V@z~hI;&YTkQv-`ud>yD|)nb1L74}{T*celvmbI5H=L*0{W9KV)+X1-2SY%-A?qX*$oIaYWOo4yUGl5pH8q zvIx1{G{-^qxjf=qAgVnXqk}qiY{lEF)S88hr36k8G|icP76yi|2cw=tc_s$>7V3Rj z-HnxE5-l>aVGm7^eQ%C+>k}XHISY*0`Tu0Q7sh?Kns^Ed3>fw5?&!eI7tUQvj@wAR zI}D|SN{LO;+m_nw`%&S}Tx=WK&W84H;u0|^I`-)X8jL_|tCqv=(`P15sJc@Ghw(x1 zu>+Aq($h-=IuRG~)_h(Q9D$nsHg)I=~>&L4niv3Rfp!F%DE3q)Dha9`1 z0+aZR3?7j9&yvwC4^ltxv+fZls9!I4YFYh(PejsD$&L06Bql*~pe-e7&BH^nS}1;d z!bbJNJg*H(vRiJgfrvXT?$eeJ*6P!@tX^%d9*c=K}4D zv|gCM><8Pa{>3{lUMMh>eM}~$wSOuL|2oO)L(N%l6Y`+J=p|C+k^v$0r=JyN3blFyf`ANX3 zcV2YzEZcXOs_Y@nX2CXtb7jw<@`kDr6M7UB8#5kr!AvH}pVJi;9LMM4>z>_(=c5@a z+pp8noza3& z@iO1mQyUvo%gTOkA@lQ1H?XKr($emX8T%f61GD-Lc6J~11k+z@qXpQEH~J#xxsSEW zC?%&E6=0zzPqIIMe$E}Sy4P}iP72*MLW6XjPZAu6SvZSG8S_sR1Xk*OEnf8Hqll0F?dO&R>{o2khvb-^oglT~{5y6LIQb2B6^ zWab@l@jfYr?%LLB_3@rrv*z5X(FGQS7wI1mwB&b#>~{MXZJCy(ZpSA~?E=N2G009( zKb$Wut7RO^8nI`H!SvC6TrSd3yEAGta3~wGd)};O+Sbg^qO(6_e8ye-zD?yuL{%Lc z0vV%=4Fri6GZ-CU^#OjVr8-8`R)r z27O!9v~-*j1ZLp`Pjp4bNeq{w6x3c?80;KWXHfSKrI=1lO<7zZ@hhT(!0UZCw_0CX zY&-)35wGO5(w-$I;ZGGJna0`-;#n~t`(9N=)M{W+^6bVk)1{8!A1J7Y?y|9gKee~9 z(3@yf5Jn^|BXwbc>$}&2g~b%%f&N6{*+53ufjnhmbkoz1r*jfL2+w);EMu1IR2nCh znLJW;P|vHT*N0IkT*_mhQ2ON6^9&=>ayQy~nqUEl3WJ3Px2lCBw`=ITEOm2wF(UjD z%i6lmcT6a*h{{%&yS3`TAR@MoKJHSoTH0RB4-wS*#B7cS4ewFcZE48uy7D@~S4Ymg zwYl-ocDxswoIwqQihYXBKmJZZ+Ma(==v{JI4Bi$>sZbe16O;Rv8?SV%~ArU=&eWVMWSys!m z=DkgKACQe*g7y&hu6WlJgZ4Q;lE}24r}K(4)Vyo+4@+N+SA9ced0K87Wm_Z!Xi@HG z>*3dG1~oJ?Za9Yp6wUOFtgS^hT_GWJ=(8%n5nDXsK@fx*A}Y)|keDy@de+q|CD`B8 zBjo|TgzPhBL}l!Q+=F&YwJX8CzpRG)sLl=+4)&USr&Ae{(_ArjRWLypPD%n_}n)k-)_>JT*#YMy>XL%Rq=DO~@Rj`$Q zw;EUsXKHjMm4gLztTsFdK1y2jg6_)@THhO}=A0buZ~<582;%1kCKeAI?KA^|Z}M|_ zz>}W1m9hLK_+cHlS;s}T5Lt1`-T2ZV zb^c0U&|_+XF2_}Pdj}Vy($iUuxPQHnc zhaUDWia+0@gm?p+#@gaNQ=QBuc6!52kop#)NDGTI%)*skeJvV|jQaJG^V+#ua1w~E z&q6hiWO}pw=gH&fjDo}nU-ZgS`=s;~g`$ax`b?!5bjP2Iof7|e9K3;xm$sDOZo}&q z@KmrFOLJqs5qi{|yezi60j`8`dFVKm8Qp6pU$LXgHsz_HD^rlrlzwIh!b(k(`%w9+ z|Ml{T>pRXmr8ct3$durw62eVf-%wzs?(M`lp{9liK9due7WeH(*79oGfr;0;7(JxL zp)rTUccDiRQUY$l)Q#p_dq~z^I-cQ|qn2rBU^*D6Samw|Ds@e*aH)=gg57yTnTUHj&4Vxj*0r}ydpwEivdyWjphFQh3GC0X zQ!7p>JWe-#8nif*hPEm_MPq4m?elz{H|!)y$r#^_TIk~Q!pC1xNdou7Pw_xo`1 zAqN{{OJU%)YjxRL_9rX%nby%v@1(R`0pqIV>}-+?81&psx;?5CHY3W3FKOpD_~&Q~ zusa=GGNjyvKjPg#8(4R&d#ef)tv)w4i$>LX?7ZtQ38)IycVK3jH0NfSeUTuFeYKvc zNW=M{6TOvt3n8zwS5RoQEd!gOX6NTmEuS6AWT>z1H&!6v=CCjoGbs z_P{lmuE|XgcUm|V8#fZKLEYf#{{%3vmWYS4c-6OQxpqBa_>quc>qiSjqY}>c^L+mj zmOgoGLuMxdpPIz)1po~js*HC1CU#2TOV#M}#UXQC+-hZ29Wx8dfVsWaFEO|%Kkd-3 zY~g7IU00Ueh~*-9N3u{DY{Ve-wQDKyZj{}qlk3wwcFU0q$P*rsfdG|wC-p7+AUl3VZh zdr;~gx-w%PTDZ>iH@uhdM@2+PNjHJ3+H;M@zs{_)ULJq(+{T8xPC>GRzX-8Q$zr98 zYnfoh4X(Fd*Ncl_(LlJ6!)TBI2RN+X_p;`m`TOp>%0&q3U=pjRSEpLTxlIPszPRm4 zoV%um{~~z@={89bkcP~M%M=n0Y5gS#OD^x*>c(&iWc4qzlQbQ!Kgdkgn9;Q=VA{~t zv-$L{Y*;wrjDkGW5()+b?Muq<$f%kc*%$>lJFg@MdzzSAMXZ*t7~0rVs}9kGSYkkG zo2zIdVZZ|#AtT?C4kHnr2N*uitGPTgt{6FOH{t>qYgP*4x^|A#OiX3%IrYb#&#GQ z^WiOlpr|RWbwNU2UQ1y+d%V8C-^&YxJ+C|W?-m^`E;LV@`=S(mGX_-f8y7U6Ys`%< z?bg=Hhx56Nbq@ge0zb+e_$^m`})~W<%ky+?g;D(Fs zi){{SlXIr4ev$dp3aK6Fodbtig+17L%QyYV#}s5k9@)rWzlkF)jPw^_yCrz`)Mib= zEtsXV{EtRv>)v_#Z7%jiv`u@9$ApIqAR0kwY#Ssb=Jv1Wc5gb^;^>XB0 z;r7={-U_#GBa&qj8i{&vqb_mfrH(`oe)k0?QeD1$C}5`1^9zWl^TS$GE7IXN zGMR6=KA%&ktvASWU+A!}tmIn!9lj|sOhLNiORWZ=0M1w7D=B^1LfRFn$=V#A1P3ep zwF-?DS8=@3e^OQ)x+EgqdBqkL7p2zSp9n#16wtfk=~zEnG-gr z$gK;_iNqq74L7hF1MQMq>YJp9l(cWkzH2rlefzs1^7@`#fjLj&PIRMqKcWrOi&#;1I#1 zTSsj`XrydDfRsX*_yIai90{LqTQD$D2l@w79rPc!_naYRhE)eI(Sp}m?&sm*vY45& z+58m`yhe=WZ_|n8JxT|>5ad_0(F~zy``PX|wn1$Px5|`jb^^3*9ixl86D=(=I=nTV zzr(#Q1u7v)JD1-6s0@OZORUD48qEU#d_T@5RDzSKJqm_@5SM|9;J_gDK_I! z*H#S*z7w~W4~Kb5Wm)JCoSr-}*eaJ@plN2c_5}69wFI)WyzIpLw z=`En0tm|AZEwV>T-Bv;^pb3v%dwzWefc%N#VpbXqW*G=hI30@2_8IjayBmsbsQK%VdLA+_X#=(Y?P`%SR zRuLkQi6-{vVp_tgQ{wWB=;7o1mWn}R@a;!jJ~Wxje<*JawOT(iw<4TorQ{MW_+IIn zM_Sc6_@zOQmek+0t0S;!ytLi}zdWd_HgugU^t0F=_MzGMra(b`Q=7J?#LT3Tm2p}L zdhx8ja+U=V1$y#*|HeA`*5{UuOB9^W=gkk7ttjX6z)B5P{RRoJu;_Q19o5j>7|G$j z;9@SEX;xR^cOwdD9{}$^`+kOd?aYkv-kx*Lz`}ic&$Qvppt?zJvrgFdHaRg-CRCpF zrfgV8LT-Ufcwu%FoV%Bt>UpY)w)S?9>^8*vE33{gSmZ=a0?Q;RE=#?K`F@pM=fJZl zG}-yR64(??st5NC##GZa9?-}1Z@+i)3HGJoMdEEffJf0a-Ml=Mx(5l|xE-8)gkV%y z@Y2*6>!q_m>75a_`P?*G_^2ZMB!De?hvlN)Ir>CBy1#z^E-mTU>Y1Fo6$_l_wo0~L z7S=B>X!4u4PD^;f%+Ouo&E>8xurk>~5`~^ok(?APL8r@pNvRB-GxQ|8_9KyLY2aY8 z$o04mBH$A2M8D3NxxD#DP=Hpxhv9ozSb~Ocj)ZQ=IJuF##!3^EMY6Ioosr0>8Q@Y- z{;*G@5p8R$oE-Q3olA}0@TP@^)^HQw&9jZb-7kQ)EN!Yx2LYSW1W5!#UBr>N#pyNlcGPWIJX!{gcEakBT|paag^-GO7DrW z1%;@7!sqgxD!<{|TO6AxsrhO_w;L~QZGJ&om37Txe{Sp|VEa09=N?hg=9xAeM|5_M z@fUYLP!u0gaM>>O^Ayb(_H#BjPBYUtN=v7I$#Ip2$W=5y!o?t3G1|-FKuOE+X?ZXu zozqPixCDENkALr)PfLDYR@g&}Mt*;ev|!0QS~+VWvP16*P6ABN!qeWTEdK>M`DdD% zF7h*#;C|Z_-4M)DEA#WxDCxbIlO07PXl*J{FT{;WXXk97-Wpqox>JlWQGWzn?a+k8Isso`? z3>Ywqm7U<=sW&J-6BBPo0UV5Q7A&6|$k#7GG6J$@<8U;xnRZ|xHA*?zm2&lbumS$n`(L%vCY2n9Z^4Gg#ve(Y<%f?Q%;(V{)nRqD3%@|lY z+S~Vee7*M0!N_()vyqeib3-(B%aDfCf~(0XeN$c1%8?O9S5CfY$=0hgnyI6F3hcM5 z6EZZNwnHB3r@B44^?J&yoUY_g$mC<{zPTCQ%D7!|M3CQ&t;K~|<$YJ}@-g)PhW~LH z_?z7B;7$&4r`@moE%3S^OL%`})r%{Ip$?h9c&3PsI>Y%52{`kIEo5n?QhnSqPbYgx z9WJZz#j#xZRBH1fViZFlBZ(>>Lkt9d3*U24wzuS?X)jUCTV^`he)7YUCqPR=CLak#gZfMiy_a~ari zp5@=^yN9%|+nyaP#T$SFhPK47zwwftw#2X5-tXyQ`x^9=(ddv0B54zYb4s7e6Iie^?zTX{ z!sGSn-83aerX7rLL*_TIky}7#9sB9Ird}otRGQG2<5jg%ah)j) z<8^*OeZ3k^ut;pxhOXWyOHD5ei^=JF?Ot|cVX?dCt8&+-Cmjg1novYj&hPFxlg;%F zbyusQk!&GbH#kaB^TAySu9|t)A4Kn)%(3cm^kR4M^uHrW{OfY^bKCnUDyoWHs(vX) z#qI4lmTe`$>lHfr4}A{m>N0J=dYPH2o~XD}+q&<$^W}skvkzJU5rMYbYSm<1Q`l{T z@|;*Aa+Ggr)OYVmw!SUt6O)_#hq9s#x|zr{Gl3<0q#pz^I#M(_ZS$3j_uB z6ghSEfynlE!IV?rc1gv5g|(|?K=G??5zrGm>#p8NQ*eq(By8uq| z+h`&eO_df9=^j_Qz#8&uy zHDDwqcBb;;pp-#4dwgLb5Ce-)-$ERZ(4Qv{Ty%T@>p9?|s%!yXXw?k)LT z1NNm+>A2lz{$cC+L|QdL=ovfYt8&!0)HwZ~8O`VJoueMf<5}qJkxWKTP3RJOsAA!D z9+6{dBRA~kmjwSI$8c#Tlv9QkX=(?L?mG>81e2b8Td*$!Z|@OD`Fc>1Imo6+E3ZYD z1IgRNa`MD+&nj$M+U*#YKKgj2f$yVY-Op~4Lq82L@c~d>%?D~aR&9{Dj(`!Y1$k0; z?{d2N$x%6RkfiFbtbzD<54hT-LN!&1#5o3~&Q1t4012>KFRK+*T58$FElihT9V@Zo z_#5R?MR{1vX*^B`TU77gb(;G9p{$trGwuD`ybNgRcD87Re!(AHf!j@7h3OGicDXC>X3z%na_T#8^%QlT4l{JTIv;?p^e$RebCfFZ=&jTT2DqO#A;tVC`HgC4!`0ZIAm%$qXouVk%M)gg!A zQmxeNRT0$C){cZb?RI|ypj%LKkt;eopN9RK#=2Wl{BnNhy=I>6Dj&U(zeHh~?BYPC z!FqzruM5sjg%Ee;NhdT2Pi2(#el+)*czF!=`KiJoXq`y>4Af4n#m5- z#YInXh4GC7%XPJwu&WqMXs{~sVnCo65lG?U-KEcB0ly!jEp@@A&90vH$4U%qmAPh_ zN~R|#H_WV3EY}DaFHEls2baSg;#9x}fd}OwJS*1KK?Fr^d4TI>L*Oj{GX!@;weLH#@S|$dT%Z--DBS=Yo zypkXd{bN_r4L^WiAXIa*$Jh7hdtOKF{%s|bj5qX1Pss5P4)*d=>WaJw69V(p`ux^& z3qUtQL1xW+BUy&=V2_j6sv9fogQhOHa)oN%*i52MAj$shwF{o(<)j#6 z=%!hdG;T35g?R05&gH+FwHjwSyx3kOHtn|vSI7u6tZjYW_s@_AxeuC#W;}I zXSeIKkYLH#ZP%VZO5Wm1w#XY7Bm^~79v;ifR+596iMqOyhRjN$?uY6!jO0)ZUsQY& zUpi&Tu2sAX#s#dTT;0NBlakcR=lsLw32qnY$rV#6Tez)A%VE0I$IzFKf$=DV~xMuVDQis~k^ImRAk&68JrwZ?S#Q3}K9Zv?C6G+GCu!P~kVs{D6=7Vd&^_ z6Sn=aXtDL-T6=N5hMWG%-&v=!dpzz0Ng+%JO1(vHo*}_$Dk?@}!AlX{T;#dWt>jw_ zS^lm=FSH6fNP>-xO2WJA09V03^ zVgV9NUnYw)U)g6Tv$M;j+b`tF92no-3T!Yf56_9Mf{4Ih7id9i!W^(N zWlBpR=DKo*0>;T*M9FfYyql98gf7jx@W#D>8JHH3?~Ib$-z7!Z*xP`fkIQ73sqqo@ zJZ-O(oLd+dXO?(D+-~WYfrZ6A!7NKl-1@)fF(6k;z?IXXc}X&|Op*ap$JTF21!$ypC{R|XyF5F(cJtctXk!JV9{8e37YMbaG)g^FOfjwyI`KK z!&?TGiuypCU*w}a`j>Q=mR^ea6n*UTR7zP2T0xw{O|4`FxLu)5M?O}KUZuX4Z;qSj z44Q|n92pv+RWCdjhNHFwMt(QjfiE#vV7>pq*0dg%Syd-bNeNE8F%&n+Yd`<<84a1B zi*PWO5ELwM8y7%FeC**K-djF=P~?R z89(>@%>E+kLY-Wskh8$A=4QLO2`lQ}F`6q@K6T@ZgZYs)dS(CotnLwvC6W%sbA~hT zC=1LTh03H=07-^FyL&VeU|IuU^-qxsY%H8lj$|tYY4{r+|D6en{{$lYb@(GaG0w=X zee;OZhf-1fsFk7-#S59!Za3h#|9 + + + + +Polars Db Schema + + + +

+

Polars Db Schema

+ + +

Alpha License: AGPL-3 OCA/server-backend Translate me on Weblate Try me on Runboat

+

Introspect external database

+https://raw.githubusercontent.com/OCA/server-backend/18.0/polars_db_schema/static/description/figure1.png +

Use case: you want discover an external database extracting data from +only relevant tables and columns

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/server-backend project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/polars_db_schema/views/db_config.xml b/polars_db_schema/views/db_config.xml new file mode 100644 index 000000000..e6536188b --- /dev/null +++ b/polars_db_schema/views/db_config.xml @@ -0,0 +1,25 @@ + + + db.config + + + +