From 90eb9b15697e067a0f00bb4f2ad69a5f8f0ed954 Mon Sep 17 00:00:00 2001 From: akash Date: Tue, 17 Oct 2023 13:36:02 +0100 Subject: [PATCH 1/8] Added path ATen/native --- torchdrug/layers/functional/extension/rspmm.h | 2 +- torchdrug/layers/functional/extension/spmm.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/torchdrug/layers/functional/extension/rspmm.h b/torchdrug/layers/functional/extension/rspmm.h index c09216a5..8025f4d7 100644 --- a/torchdrug/layers/functional/extension/rspmm.h +++ b/torchdrug/layers/functional/extension/rspmm.h @@ -3,7 +3,7 @@ #include #include -#include +#include namespace at { diff --git a/torchdrug/layers/functional/extension/spmm.h b/torchdrug/layers/functional/extension/spmm.h index 94004d67..905e7836 100644 --- a/torchdrug/layers/functional/extension/spmm.h +++ b/torchdrug/layers/functional/extension/spmm.h @@ -3,7 +3,7 @@ #include #include -#include +#include #include "rspmm.h" From bc17c3008ac439b9467508135ffb32577ab3bf44 Mon Sep 17 00:00:00 2001 From: akash Date: Mon, 30 Oct 2023 11:01:14 +0000 Subject: [PATCH 2/8] pop graph in load --- torchdrug/core/engine.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/torchdrug/core/engine.py b/torchdrug/core/engine.py index 1bc83e86..e0321689 100644 --- a/torchdrug/core/engine.py +++ b/torchdrug/core/engine.py @@ -238,8 +238,9 @@ def load(self, checkpoint, load_optimizer=True, strict=True): logger.warning("Load checkpoint from %s" % checkpoint) checkpoint = os.path.expanduser(checkpoint) state = torch.load(checkpoint, map_location=self.device) - - self.model.load_state_dict(state["model"], strict=strict) + state["model"].pop("graph") # Made changes as per Issue #89 + state["model"].pop("fact_graph") # Made changes as per Issue #89 + self.model.load_state_dict(state["model"], strict=False) if load_optimizer: self.optimizer.load_state_dict(state["optimizer"]) From a0a300e6603122ac935dbfea384398a8fe3423bd Mon Sep 17 00:00:00 2001 From: akash Date: Mon, 30 Oct 2023 11:09:36 +0000 Subject: [PATCH 3/8] pop graphs --- build/lib/torchdrug/__init__.py | 15 + build/lib/torchdrug/core/__init__.py | 9 + build/lib/torchdrug/core/core.py | 372 ++++ build/lib/torchdrug/core/engine.py | 296 +++ build/lib/torchdrug/core/logger.py | 127 ++ build/lib/torchdrug/core/meter.py | 124 ++ build/lib/torchdrug/data/__init__.py | 19 + build/lib/torchdrug/data/constant.py | 52 + build/lib/torchdrug/data/dataloader.py | 104 + build/lib/torchdrug/data/dataset.py | 1223 +++++++++++ build/lib/torchdrug/data/dictionary.py | 285 +++ build/lib/torchdrug/data/feature.py | 347 +++ build/lib/torchdrug/data/graph.py | 1851 +++++++++++++++++ build/lib/torchdrug/data/molecule.py | 1034 +++++++++ build/lib/torchdrug/data/protein.py | 1358 ++++++++++++ build/lib/torchdrug/data/rdkit/__init__.py | 0 build/lib/torchdrug/data/rdkit/draw.py | 54 + build/lib/torchdrug/datasets/__init__.py | 64 + build/lib/torchdrug/datasets/alphafolddb.py | 155 ++ build/lib/torchdrug/datasets/bace.py | 36 + build/lib/torchdrug/datasets/bbbp.py | 36 + .../lib/torchdrug/datasets/beta_lactamase.py | 51 + .../torchdrug/datasets/binary_localization.py | 52 + build/lib/torchdrug/datasets/bindingdb.py | 72 + build/lib/torchdrug/datasets/cep.py | 36 + .../lib/torchdrug/datasets/chembl_filtered.py | 36 + build/lib/torchdrug/datasets/citeseer.py | 35 + build/lib/torchdrug/datasets/clintox.py | 38 + build/lib/torchdrug/datasets/cora.py | 35 + build/lib/torchdrug/datasets/delaney.py | 36 + .../torchdrug/datasets/enzyme_commission.py | 135 ++ build/lib/torchdrug/datasets/fb15k.py | 106 + build/lib/torchdrug/datasets/fluorescence.py | 51 + build/lib/torchdrug/datasets/fold.py | 53 + build/lib/torchdrug/datasets/freesolv.py | 37 + build/lib/torchdrug/datasets/gene_ontology.py | 145 ++ build/lib/torchdrug/datasets/hetionet.py | 57 + build/lib/torchdrug/datasets/hiv.py | 36 + build/lib/torchdrug/datasets/human_ppi.py | 67 + build/lib/torchdrug/datasets/lipophilicity.py | 36 + build/lib/torchdrug/datasets/malaria.py | 37 + build/lib/torchdrug/datasets/moses.py | 48 + build/lib/torchdrug/datasets/muv.py | 38 + build/lib/torchdrug/datasets/opv.py | 97 + build/lib/torchdrug/datasets/pcqm4m.py | 38 + build/lib/torchdrug/datasets/pdbbind.py | 74 + build/lib/torchdrug/datasets/ppi_affinity.py | 67 + build/lib/torchdrug/datasets/proteinnet.py | 69 + build/lib/torchdrug/datasets/pubchem110m.py | 47 + build/lib/torchdrug/datasets/pubmed.py | 95 + build/lib/torchdrug/datasets/qm8.py | 85 + build/lib/torchdrug/datasets/qm9.py | 71 + .../torchdrug/datasets/secondary_structure.py | 70 + build/lib/torchdrug/datasets/sider.py | 37 + build/lib/torchdrug/datasets/solubility.py | 51 + build/lib/torchdrug/datasets/stability.py | 51 + .../datasets/subcellular_localization.py | 51 + build/lib/torchdrug/datasets/tox21.py | 39 + build/lib/torchdrug/datasets/toxcast.py | 37 + build/lib/torchdrug/datasets/uspto50k.py | 264 +++ build/lib/torchdrug/datasets/wn18.py | 106 + build/lib/torchdrug/datasets/yago310.py | 56 + build/lib/torchdrug/datasets/yeast_ppi.py | 67 + build/lib/torchdrug/datasets/zinc250k.py | 37 + build/lib/torchdrug/datasets/zinc2m.py | 53 + build/lib/torchdrug/layers/__init__.py | 37 + build/lib/torchdrug/layers/block.py | 167 ++ build/lib/torchdrug/layers/common.py | 349 ++++ build/lib/torchdrug/layers/conv.py | 813 ++++++++ build/lib/torchdrug/layers/distribution.py | 50 + build/lib/torchdrug/layers/flow.py | 64 + .../torchdrug/layers/functional/__init__.py | 17 + .../torchdrug/layers/functional/embedding.py | 269 +++ .../layers/functional/extension/__init__.py | 0 .../layers/functional/extension/embedding.cpp | 416 ++++ .../layers/functional/extension/embedding.cu | 412 ++++ .../layers/functional/extension/embedding.h | 88 + .../layers/functional/extension/operator.cuh | 82 + .../layers/functional/extension/rspmm.cpp | 263 +++ .../layers/functional/extension/rspmm.cu | 374 ++++ .../layers/functional/extension/rspmm.h | 85 + .../layers/functional/extension/spmm.cpp | 283 +++ .../layers/functional/extension/spmm.cu | 333 +++ .../layers/functional/extension/spmm.h | 85 + .../layers/functional/extension/util.cuh | 28 + .../torchdrug/layers/functional/functional.py | 529 +++++ build/lib/torchdrug/layers/functional/spmm.py | 378 ++++ .../lib/torchdrug/layers/geometry/__init__.py | 9 + .../lib/torchdrug/layers/geometry/function.py | 343 +++ build/lib/torchdrug/layers/geometry/graph.py | 194 ++ build/lib/torchdrug/layers/pool.py | 207 ++ build/lib/torchdrug/layers/readout.py | 197 ++ build/lib/torchdrug/layers/sampler.py | 92 + build/lib/torchdrug/metrics/__init__.py | 14 + build/lib/torchdrug/metrics/metric.py | 396 ++++ build/lib/torchdrug/metrics/rdkit/__init__.py | 0 build/lib/torchdrug/metrics/rdkit/sascorer.py | 90 + build/lib/torchdrug/models/__init__.py | 49 + build/lib/torchdrug/models/bert.py | 100 + build/lib/torchdrug/models/chebnet.py | 89 + build/lib/torchdrug/models/cnn.py | 214 ++ build/lib/torchdrug/models/embedding.py | 242 +++ build/lib/torchdrug/models/esm.py | 172 ++ build/lib/torchdrug/models/flow.py | 121 ++ build/lib/torchdrug/models/gat.py | 88 + build/lib/torchdrug/models/gcn.py | 168 ++ build/lib/torchdrug/models/gearnet.py | 123 ++ build/lib/torchdrug/models/gin.py | 91 + build/lib/torchdrug/models/infograph.py | 167 ++ build/lib/torchdrug/models/kbgat.py | 62 + build/lib/torchdrug/models/lstm.py | 90 + build/lib/torchdrug/models/mpnn.py | 91 + build/lib/torchdrug/models/neuralfp.py | 96 + build/lib/torchdrug/models/neurallp.py | 112 + build/lib/torchdrug/models/physicochemical.py | 145 ++ build/lib/torchdrug/models/schnet.py | 84 + build/lib/torchdrug/models/statistic.py | 82 + build/lib/torchdrug/patch.py | 145 ++ build/lib/torchdrug/tasks/__init__.py | 50 + .../lib/torchdrug/tasks/contact_prediction.py | 172 ++ build/lib/torchdrug/tasks/generation.py | 1552 ++++++++++++++ build/lib/torchdrug/tasks/pretrain.py | 584 ++++++ .../torchdrug/tasks/property_prediction.py | 569 +++++ build/lib/torchdrug/tasks/reasoning.py | 253 +++ build/lib/torchdrug/tasks/retrosynthesis.py | 1208 +++++++++++ build/lib/torchdrug/tasks/task.py | 39 + build/lib/torchdrug/transforms/__init__.py | 7 + build/lib/torchdrug/transforms/transform.py | 314 +++ build/lib/torchdrug/utils/__init__.py | 13 + build/lib/torchdrug/utils/comm.py | 269 +++ build/lib/torchdrug/utils/decorator.py | 297 +++ .../lib/torchdrug/utils/extension/__init__.py | 0 .../torchdrug/utils/extension/torch_ext.cpp | 14 + build/lib/torchdrug/utils/file.py | 168 ++ build/lib/torchdrug/utils/io.py | 86 + build/lib/torchdrug/utils/plot.py | 175 ++ build/lib/torchdrug/utils/pretty.py | 75 + .../lib/torchdrug/utils/template/echarts.html | 63 + build/lib/torchdrug/utils/torch.py | 190 ++ dist/torchdrug-0.2.1-py3.9.egg | Bin 0 -> 610596 bytes torchdrug/core/engine.py | 2 +- 141 files changed, 25654 insertions(+), 1 deletion(-) create mode 100644 build/lib/torchdrug/__init__.py create mode 100644 build/lib/torchdrug/core/__init__.py create mode 100644 build/lib/torchdrug/core/core.py create mode 100644 build/lib/torchdrug/core/engine.py create mode 100644 build/lib/torchdrug/core/logger.py create mode 100644 build/lib/torchdrug/core/meter.py create mode 100644 build/lib/torchdrug/data/__init__.py create mode 100644 build/lib/torchdrug/data/constant.py create mode 100644 build/lib/torchdrug/data/dataloader.py create mode 100644 build/lib/torchdrug/data/dataset.py create mode 100644 build/lib/torchdrug/data/dictionary.py create mode 100644 build/lib/torchdrug/data/feature.py create mode 100644 build/lib/torchdrug/data/graph.py create mode 100644 build/lib/torchdrug/data/molecule.py create mode 100644 build/lib/torchdrug/data/protein.py create mode 100644 build/lib/torchdrug/data/rdkit/__init__.py create mode 100644 build/lib/torchdrug/data/rdkit/draw.py create mode 100644 build/lib/torchdrug/datasets/__init__.py create mode 100644 build/lib/torchdrug/datasets/alphafolddb.py create mode 100644 build/lib/torchdrug/datasets/bace.py create mode 100644 build/lib/torchdrug/datasets/bbbp.py create mode 100644 build/lib/torchdrug/datasets/beta_lactamase.py create mode 100644 build/lib/torchdrug/datasets/binary_localization.py create mode 100644 build/lib/torchdrug/datasets/bindingdb.py create mode 100644 build/lib/torchdrug/datasets/cep.py create mode 100644 build/lib/torchdrug/datasets/chembl_filtered.py create mode 100644 build/lib/torchdrug/datasets/citeseer.py create mode 100644 build/lib/torchdrug/datasets/clintox.py create mode 100644 build/lib/torchdrug/datasets/cora.py create mode 100644 build/lib/torchdrug/datasets/delaney.py create mode 100644 build/lib/torchdrug/datasets/enzyme_commission.py create mode 100644 build/lib/torchdrug/datasets/fb15k.py create mode 100644 build/lib/torchdrug/datasets/fluorescence.py create mode 100644 build/lib/torchdrug/datasets/fold.py create mode 100644 build/lib/torchdrug/datasets/freesolv.py create mode 100644 build/lib/torchdrug/datasets/gene_ontology.py create mode 100644 build/lib/torchdrug/datasets/hetionet.py create mode 100644 build/lib/torchdrug/datasets/hiv.py create mode 100644 build/lib/torchdrug/datasets/human_ppi.py create mode 100644 build/lib/torchdrug/datasets/lipophilicity.py create mode 100644 build/lib/torchdrug/datasets/malaria.py create mode 100644 build/lib/torchdrug/datasets/moses.py create mode 100644 build/lib/torchdrug/datasets/muv.py create mode 100644 build/lib/torchdrug/datasets/opv.py create mode 100644 build/lib/torchdrug/datasets/pcqm4m.py create mode 100644 build/lib/torchdrug/datasets/pdbbind.py create mode 100644 build/lib/torchdrug/datasets/ppi_affinity.py create mode 100644 build/lib/torchdrug/datasets/proteinnet.py create mode 100644 build/lib/torchdrug/datasets/pubchem110m.py create mode 100644 build/lib/torchdrug/datasets/pubmed.py create mode 100644 build/lib/torchdrug/datasets/qm8.py create mode 100644 build/lib/torchdrug/datasets/qm9.py create mode 100644 build/lib/torchdrug/datasets/secondary_structure.py create mode 100644 build/lib/torchdrug/datasets/sider.py create mode 100644 build/lib/torchdrug/datasets/solubility.py create mode 100644 build/lib/torchdrug/datasets/stability.py create mode 100644 build/lib/torchdrug/datasets/subcellular_localization.py create mode 100644 build/lib/torchdrug/datasets/tox21.py create mode 100644 build/lib/torchdrug/datasets/toxcast.py create mode 100644 build/lib/torchdrug/datasets/uspto50k.py create mode 100644 build/lib/torchdrug/datasets/wn18.py create mode 100644 build/lib/torchdrug/datasets/yago310.py create mode 100644 build/lib/torchdrug/datasets/yeast_ppi.py create mode 100644 build/lib/torchdrug/datasets/zinc250k.py create mode 100644 build/lib/torchdrug/datasets/zinc2m.py create mode 100644 build/lib/torchdrug/layers/__init__.py create mode 100644 build/lib/torchdrug/layers/block.py create mode 100644 build/lib/torchdrug/layers/common.py create mode 100644 build/lib/torchdrug/layers/conv.py create mode 100644 build/lib/torchdrug/layers/distribution.py create mode 100644 build/lib/torchdrug/layers/flow.py create mode 100644 build/lib/torchdrug/layers/functional/__init__.py create mode 100644 build/lib/torchdrug/layers/functional/embedding.py create mode 100644 build/lib/torchdrug/layers/functional/extension/__init__.py create mode 100644 build/lib/torchdrug/layers/functional/extension/embedding.cpp create mode 100644 build/lib/torchdrug/layers/functional/extension/embedding.cu create mode 100644 build/lib/torchdrug/layers/functional/extension/embedding.h create mode 100644 build/lib/torchdrug/layers/functional/extension/operator.cuh create mode 100644 build/lib/torchdrug/layers/functional/extension/rspmm.cpp create mode 100644 build/lib/torchdrug/layers/functional/extension/rspmm.cu create mode 100644 build/lib/torchdrug/layers/functional/extension/rspmm.h create mode 100644 build/lib/torchdrug/layers/functional/extension/spmm.cpp create mode 100644 build/lib/torchdrug/layers/functional/extension/spmm.cu create mode 100644 build/lib/torchdrug/layers/functional/extension/spmm.h create mode 100644 build/lib/torchdrug/layers/functional/extension/util.cuh create mode 100644 build/lib/torchdrug/layers/functional/functional.py create mode 100644 build/lib/torchdrug/layers/functional/spmm.py create mode 100644 build/lib/torchdrug/layers/geometry/__init__.py create mode 100644 build/lib/torchdrug/layers/geometry/function.py create mode 100644 build/lib/torchdrug/layers/geometry/graph.py create mode 100644 build/lib/torchdrug/layers/pool.py create mode 100644 build/lib/torchdrug/layers/readout.py create mode 100644 build/lib/torchdrug/layers/sampler.py create mode 100644 build/lib/torchdrug/metrics/__init__.py create mode 100644 build/lib/torchdrug/metrics/metric.py create mode 100644 build/lib/torchdrug/metrics/rdkit/__init__.py create mode 100644 build/lib/torchdrug/metrics/rdkit/sascorer.py create mode 100644 build/lib/torchdrug/models/__init__.py create mode 100644 build/lib/torchdrug/models/bert.py create mode 100644 build/lib/torchdrug/models/chebnet.py create mode 100644 build/lib/torchdrug/models/cnn.py create mode 100644 build/lib/torchdrug/models/embedding.py create mode 100644 build/lib/torchdrug/models/esm.py create mode 100644 build/lib/torchdrug/models/flow.py create mode 100644 build/lib/torchdrug/models/gat.py create mode 100644 build/lib/torchdrug/models/gcn.py create mode 100644 build/lib/torchdrug/models/gearnet.py create mode 100644 build/lib/torchdrug/models/gin.py create mode 100644 build/lib/torchdrug/models/infograph.py create mode 100644 build/lib/torchdrug/models/kbgat.py create mode 100644 build/lib/torchdrug/models/lstm.py create mode 100644 build/lib/torchdrug/models/mpnn.py create mode 100644 build/lib/torchdrug/models/neuralfp.py create mode 100644 build/lib/torchdrug/models/neurallp.py create mode 100644 build/lib/torchdrug/models/physicochemical.py create mode 100644 build/lib/torchdrug/models/schnet.py create mode 100644 build/lib/torchdrug/models/statistic.py create mode 100644 build/lib/torchdrug/patch.py create mode 100644 build/lib/torchdrug/tasks/__init__.py create mode 100644 build/lib/torchdrug/tasks/contact_prediction.py create mode 100644 build/lib/torchdrug/tasks/generation.py create mode 100644 build/lib/torchdrug/tasks/pretrain.py create mode 100644 build/lib/torchdrug/tasks/property_prediction.py create mode 100644 build/lib/torchdrug/tasks/reasoning.py create mode 100644 build/lib/torchdrug/tasks/retrosynthesis.py create mode 100644 build/lib/torchdrug/tasks/task.py create mode 100644 build/lib/torchdrug/transforms/__init__.py create mode 100644 build/lib/torchdrug/transforms/transform.py create mode 100644 build/lib/torchdrug/utils/__init__.py create mode 100644 build/lib/torchdrug/utils/comm.py create mode 100644 build/lib/torchdrug/utils/decorator.py create mode 100644 build/lib/torchdrug/utils/extension/__init__.py create mode 100644 build/lib/torchdrug/utils/extension/torch_ext.cpp create mode 100644 build/lib/torchdrug/utils/file.py create mode 100644 build/lib/torchdrug/utils/io.py create mode 100644 build/lib/torchdrug/utils/plot.py create mode 100644 build/lib/torchdrug/utils/pretty.py create mode 100644 build/lib/torchdrug/utils/template/echarts.html create mode 100644 build/lib/torchdrug/utils/torch.py create mode 100644 dist/torchdrug-0.2.1-py3.9.egg diff --git a/build/lib/torchdrug/__init__.py b/build/lib/torchdrug/__init__.py new file mode 100644 index 00000000..03e5aacc --- /dev/null +++ b/build/lib/torchdrug/__init__.py @@ -0,0 +1,15 @@ +from . import patch +from .data.constant import * + +import sys +import logging + +logger = logging.getLogger("") +logger.setLevel(logging.INFO) +format = logging.Formatter("%(asctime)-10s %(message)s", "%H:%M:%S") + +handler = logging.StreamHandler(sys.stdout) +handler.setFormatter(format) +logger.addHandler(handler) + +__version__ = "0.2.1" diff --git a/build/lib/torchdrug/core/__init__.py b/build/lib/torchdrug/core/__init__.py new file mode 100644 index 00000000..2e0abba2 --- /dev/null +++ b/build/lib/torchdrug/core/__init__.py @@ -0,0 +1,9 @@ +from .core import _MetaContainer, Registry, Configurable, make_configurable +from .engine import Engine +from .meter import Meter +from .logger import LoggerBase, LoggingLogger, WandbLogger + +__all__ = [ + "_MetaContainer", "Registry", "Configurable", + "Engine", "Meter", "LoggerBase", "LoggingLogger", "WandbLogger", +] \ No newline at end of file diff --git a/build/lib/torchdrug/core/core.py b/build/lib/torchdrug/core/core.py new file mode 100644 index 00000000..0227b66b --- /dev/null +++ b/build/lib/torchdrug/core/core.py @@ -0,0 +1,372 @@ +import re +import types +import inspect +from collections import defaultdict +from contextlib import contextmanager + +from decorator import decorator + + +class _MetaContainer(object): + """ + Meta container that maintains meta types about members. + + The meta type of each member is tracked when a member is assigned. + We use a context manager to define the meta types for a bunch of assignment. + + The meta types are stored as a dict in ``instance.meta_dict``, + where keys are member names and values are meta types. + + >>> class MyClass(_MetaContainer): + >>> ... + + >>> instance = MyClass() + >>> with instance.context("important"): + >>> instance.value = 1 + >>> assert instance.meta_dict["value"] == "important" + + Members assigned with :meth:`context(None) ` or without a context won't be tracked. + + >>> instance.random = 0 + >>> assert "random" not in instance.meta_dict + + You can also restrict available meta types by defining a set :attr:`_meta_types` in the derived class. + + .. note:: + + Meta container also supports auto inference of meta types. + This can be enabled by setting :attr:`enable_auto_context` to ``True`` in the derived class. + + Once auto inference is on, any member without an explicit context will be recognized through their name prefix. + For example, ``instance.node_value`` will be recognized as ``node`` if ``node`` is defined in ``meta_types``. + + This may make code hard to maintain. Use with caution. + """ + + _meta_types = set() + enable_auto_context = False + + def __init__(self, meta_dict=None, **kwargs): + if meta_dict is None: + meta_dict = {} + else: + meta_dict = meta_dict.copy() + + self._setattr("_meta_contexts", set()) + self._setattr("meta_dict", meta_dict) + for k, v in kwargs.items(): + self._setattr(k, v) + + @contextmanager + def context(self, type): + """ + Context manager for assigning members with a specific meta type. + """ + if type is not None and self._meta_types and type not in self._meta_types: + raise ValueError("Expect context type in %s, but got `%s`" % (self._meta_types, type)) + self._meta_contexts.add(type) + yield + self._meta_contexts.remove(type) + + def __setattr__(self, key, value): + if hasattr(self, "meta_dict"): + types = self._meta_contexts + if not types and self.enable_auto_context: + for type in self._meta_types: + if key.startswith(type): + types.append(type) + if len(types) > 1: + raise ValueError("Auto context found multiple contexts for key `%s`. " + "If this is desired, set `enable_auto_context` to False " + "and manually specify the context. " % key) + if types: + self.meta_dict[key] = types.copy() + self._setattr(key, value) + + def __delattr__(self, key): + if hasattr(self, "meta_dict") and key in self.meta_dict: + del self.meta_dict[key] + super(_MetaContainer, self).__delattr__(self, key) + + def _setattr(self, key, value): + return super(_MetaContainer, self).__setattr__(key, value) + + @property + def data_dict(self): + """A dict that maps tracked names to members.""" + return {k: getattr(self, k) for k in self.meta_dict} + + def data_by_meta(self, include=None, exclude=None): + """ + Return members based on the specific meta types. + + Parameters: + include (list of string, optional): meta types to include + exclude (list of string, optional): meta types to exclude + + Returns: + (dict, dict): data member dict and meta type dict + """ + if include is None and exclude is None: + return self.data_dict, self.meta_dict + + include = self._standarize_type(include) + exclude = self._standarize_type(exclude) + types = include or set().union(*self.meta_dict.values()) + types = types - exclude + data_dict = {} + meta_dict = {} + for k, v in self.meta_dict.items(): + if v.issubset(types): + data_dict[k] = getattr(self, k) + meta_dict[k] = v + return data_dict, meta_dict + + def _standarize_type(self, types): + if types is None: + types = set() + elif isinstance(types, str): + types = {types} + else: + types = set(types) + return types + + +class Tree(defaultdict): + + def __init__(self): + super(Tree, self).__init__(Tree) + + def flatten(self, prefix=None, result=None): + if prefix is None: + prefix = "" + else: + prefix = prefix + "." + if result is None: + result = {} + for k, v in self.items(): + if isinstance(v, Tree): + v.flatten(prefix + k, result) + else: + result[prefix + k] = v + return result + + +class Registry(object): + """ + Registry class for managing all call-by-name access to objects. + + Typical scenarios: + + 1. Create a model according to a string. + + >>> gcn = R.search("GCN")(128, [128]) + + 2. Register a customize hook to the package. + + >>> @R.register("features.atom.my_feature") + >>> def my_featurizer(atom): + >>> ... + >>> + >>> data.Molecule.from_smiles("C1=CC=CC=C1", atom_feature="my_feature") + """ + + table = Tree() + + def __new__(cls): + raise ValueError("Registry shouldn't be instantiated.") + + @classmethod + def register(cls, name): + """ + Register an object with a canonical name. Hierarchical names are separated by ``.``. + """ + + def wrapper(obj): + entry = cls.table + keys = name.split(".") + for key in keys[:-1]: + entry = entry[key] + if keys[-1] in entry: + raise KeyError("`%s` has already been registered by %s" % (name, entry[keys[-1]])) + + entry[keys[-1]] = obj + obj._registry_key = name + + return obj + + return wrapper + + @classmethod + def get(cls, name): + """ + Get an object with a canonical name. Hierarchical names are separated by ``.``. + """ + entry = cls.table + keys = name.split(".") + for i, key in enumerate(keys): + if key not in entry: + raise KeyError("Can't find `%s` in `%s`" % (key, ".".join(keys[:i]))) + entry = entry[key] + return entry + + @classmethod + def search(cls, name): + """ + Search an object with the given name. The name doesn't need to be canonical. + + For example, we can search ``GCN`` and get the object of ``models.GCN``. + """ + keys = [] + pattern = re.compile(r"\b%s\b" % name) + for k, v in cls.table.flatten().items(): + if pattern.search(k): + keys.append(k) + value = v + if len(keys) == 0: + raise KeyError("Can't find any registered key containing `%s`" % name) + if len(keys) > 1: + keys = ["`%s`" % key for key in keys] + raise KeyError("Ambiguous key `%s`. Found %s" % (name, ", ".join(keys))) + return value + + +class _Configurable(type): + + def config_dict(self): + + def unroll_config_dict(obj): + if isinstance(type(obj), _Configurable): + obj = obj.config_dict() + elif isinstance(obj, (str, bytes)): + return obj + elif isinstance(obj, dict): + return type(obj)({k: unroll_config_dict(v) for k, v in obj.items()}) + elif isinstance(obj, (list, tuple)): + return type(obj)(unroll_config_dict(x) for x in obj) + return obj + + cls = getattr(self, "_registry_key", self.__class__.__name__) + config = {"class": cls} + for k, v in self._config.items(): + config[k] = unroll_config_dict(v) + return config + + @classmethod + def load_config_dict(cls, config): + if cls == _Configurable: + real_cls = Registry.search(config["class"]) + custom_load_func = real_cls.load_config_dict.__func__ != cls.load_config_dict.__func__ + if custom_load_func: + return real_cls.load_config_dict(config) + cls = real_cls + elif getattr(cls, "_registry_key", cls.__name__) != config["class"]: + raise ValueError("Expect config class to be `%s`, but found `%s`" % (cls.__name__, config["class"])) + + new_config = {} + for k, v in config.items(): + if isinstance(v, dict) and "class" in v: + v = _Configurable.load_config_dict(v) + elif isinstance(v, list): + v = [_Configurable.load_config_dict(_v) + if isinstance(_v, dict) and "class" in _v else _v + for _v in v] + if k != "class": + new_config[k] = v + + return cls(**new_config) + + def __new__(typ, *args, **kwargs): + + cls = type.__new__(typ, *args, **kwargs) + + @decorator + def wrapper(init, self, *args, **kwargs): + sig = inspect.signature(init) + func = sig.bind(self, *args, **kwargs) + func.apply_defaults() + config = {} + keys = list(sig.parameters.keys()) + for k, v in zip(keys[1:], func.args[1:]): # exclude self + config[k] = v + config.update(func.kwargs) + for k in getattr(self, "_ignore_args", {}): + config.pop(k) + self._config = dict(config) + return init(self, *args, **kwargs) + + def get_function(method): + if isinstance(method, types.MethodType): + return method.__func__ + return method + + if isinstance(cls.__init__, types.FunctionType): + cls.__init__ = wrapper(cls.__init__) + custom_load_func = hasattr(cls, "load_config_dict") and \ + get_function(cls.load_config_dict) != get_function(typ.load_config_dict) + custom_config_func = hasattr(cls, "config_dict") and \ + get_function(cls.config_dict) != get_function(typ.config_dict) + if not custom_load_func: + cls.load_config_dict = _Configurable.load_config_dict + if not custom_config_func: + cls.config_dict = _Configurable.config_dict + + return cls + + +class Configurable(metaclass=_Configurable): + """ + Class for load/save configuration. + It will automatically record every argument passed to the ``__init__`` function. + + This class is inspired by :meth:`state_dict()` in PyTorch, but designed for hyperparameters. + + Inherit this class to construct a configurable class. + + >>> class MyClass(nn.Module, core.Configurable): + + Note :class:`Configurable` only applies to the current class rather than any derived class. + For example, the following definition only records the arguments of ``MyClass``. + + >>> class DerivedClass(MyClass): + + In order to record the arguments of ``DerivedClass``, explicitly specify the inheritance. + + >>> class DerivedClass(MyClass, core.Configurable): + + To get the configuration of an instance, use :meth:`config_dict()`, + which returns a dict of argument names and values. + If an argument is also an instance of :class:`Configurable`, it will be recursively expanded in the dict. + The configuration dict can be passed to :meth:`load_config_dict()` to create a copy of the instance. + + For classes already registered in :class:`Registry`, + they can be directly created from the :class:`Configurable` class. + This is convenient for building models from configuration files. + + >>> config = models.GCN(128, [128]).config_dict() + >>> gcn = Configurable.load_config_dict(config) + """ + pass + + +def make_configurable(cls, module=None, ignore_args=()): + """ + Make a configurable class out of an existing class. + The configurable class will automatically record every argument passed to its ``__init__`` function. + + Parameters: + cls (type): input class + module (str, optional): bind the output class to this module. + By default, bind to the original module of the input class. + ignore_args (set of str, optional): arguments to ignore in the ``__init__`` function + """ + ignore_args = set(ignore_args) + module = module or cls.__module__ + Metaclass = type(cls) + if issubclass(Metaclass, _Configurable): # already a configurable class + return cls + if Metaclass != type: # already have a meta class + MetaClass = type(_Configurable.__name__, (Metaclass, _Configurable), {}) + else: + MetaClass = _Configurable + return MetaClass(cls.__name__, (cls,), {"_ignore_args": ignore_args, "__module__": module}) diff --git a/build/lib/torchdrug/core/engine.py b/build/lib/torchdrug/core/engine.py new file mode 100644 index 00000000..e0321689 --- /dev/null +++ b/build/lib/torchdrug/core/engine.py @@ -0,0 +1,296 @@ +import os +import sys +import logging +from itertools import islice + +import torch +from torch import distributed as dist +from torch import nn +from torch.utils import data as torch_data + +from torchdrug import data, core, utils +from torchdrug.core import Registry as R +from torchdrug.utils import comm, pretty + + +module = sys.modules[__name__] +logger = logging.getLogger(__name__) + + +@R.register("core.Engine") +class Engine(core.Configurable): + """ + General class that handles everything about training and test of a task. + + This class can perform synchronous distributed parallel training over multiple CPUs or GPUs. + To invoke parallel training, launch with one of the following commands. + + 1. Single-node multi-process case. + + .. code-block:: bash + + python -m torch.distributed.launch --nproc_per_node={number_of_gpus} {your_script.py} {your_arguments...} + + 2. Multi-node multi-process case. + + .. code-block:: bash + + python -m torch.distributed.launch --nnodes={number_of_nodes} --node_rank={rank_of_this_node} + --nproc_per_node={number_of_gpus} {your_script.py} {your_arguments...} + + If :meth:`preprocess` is defined by the task, it will be applied to ``train_set``, ``valid_set`` and ``test_set``. + + Parameters: + task (nn.Module): task + train_set (data.Dataset): training set + valid_set (data.Dataset): validation set + test_set (data.Dataset): test set + optimizer (optim.Optimizer): optimizer + scheduler (lr_scheduler._LRScheduler, optional): scheduler + gpus (list of int, optional): GPU ids. By default, CPUs will be used. + For multi-node multi-process case, repeat the GPU ids for each node. + batch_size (int, optional): batch size of a single CPU / GPU + gradient_interval (int, optional): perform a gradient update every n batches. + This creates an equivalent batch size of ``batch_size * gradient_interval`` for optimization. + num_worker (int, optional): number of CPU workers per GPU + logger (str or core.LoggerBase, optional): logger type or logger instance. + Available types are ``logging`` and ``wandb``. + log_interval (int, optional): log every n gradient updates + """ + + def __init__(self, task, train_set, valid_set, test_set, optimizer, scheduler=None, gpus=None, batch_size=1, + gradient_interval=1, num_worker=0, logger="logging", log_interval=100): + self.rank = comm.get_rank() + self.world_size = comm.get_world_size() + self.gpus = gpus + self.batch_size = batch_size + self.gradient_interval = gradient_interval + self.num_worker = num_worker + + if gpus is None: + self.device = torch.device("cpu") + else: + if len(gpus) != self.world_size: + error_msg = "World size is %d but found %d GPUs in the argument" + if self.world_size == 1: + error_msg += ". Did you launch with `python -m torch.distributed.launch`?" + raise ValueError(error_msg % (self.world_size, len(gpus))) + self.device = torch.device(gpus[self.rank % len(gpus)]) + + if self.world_size > 1 and not dist.is_initialized(): + if self.rank == 0: + module.logger.info("Initializing distributed process group") + backend = "gloo" if gpus is None else "nccl" + comm.init_process_group(backend, init_method="env://") + + if hasattr(task, "preprocess"): + if self.rank == 0: + module.logger.warning("Preprocess training set") + # TODO: more elegant implementation + # handle dynamic parameters in optimizer + old_params = list(task.parameters()) + result = task.preprocess(train_set, valid_set, test_set) + if result is not None: + train_set, valid_set, test_set = result + new_params = list(task.parameters()) + if len(new_params) != len(old_params): + optimizer.add_param_group({"params": new_params[len(old_params):]}) + if self.world_size > 1: + task = nn.SyncBatchNorm.convert_sync_batchnorm(task) + buffers_to_ignore = [] + for name, buffer in task.named_buffers(): + if not isinstance(buffer, torch.Tensor): + buffers_to_ignore.append(name) + task._ddp_params_and_buffers_to_ignore = set(buffers_to_ignore) + if self.device.type == "cuda": + task = task.cuda(self.device) + + self.model = task + self.train_set = train_set + self.valid_set = valid_set + self.test_set = test_set + self.optimizer = optimizer + self.scheduler = scheduler + + if isinstance(logger, str): + if logger == "logging": + logger = core.LoggingLogger() + elif logger == "wandb": + logger = core.WandbLogger(project=task.__class__.__name__) + else: + raise ValueError("Unknown logger `%s`" % logger) + self.meter = core.Meter(log_interval=log_interval, silent=self.rank > 0, logger=logger) + self.meter.log_config(self.config_dict()) + + def train(self, num_epoch=1, batch_per_epoch=None): + """ + Train the model. + + If ``batch_per_epoch`` is specified, randomly draw a subset of the training set for each epoch. + Otherwise, the whole training set is used for each epoch. + + Parameters: + num_epoch (int, optional): number of epochs + batch_per_epoch (int, optional): number of batches per epoch + """ + sampler = torch_data.DistributedSampler(self.train_set, self.world_size, self.rank) + dataloader = data.DataLoader(self.train_set, self.batch_size, sampler=sampler, num_workers=self.num_worker) + batch_per_epoch = batch_per_epoch or len(dataloader) + model = self.model + model.split = "train" + if self.world_size > 1: + if self.device.type == "cuda": + model = nn.parallel.DistributedDataParallel(model, device_ids=[self.device], + find_unused_parameters=True) + else: + model = nn.parallel.DistributedDataParallel(model, find_unused_parameters=True) + model.train() + + for epoch in self.meter(num_epoch): + sampler.set_epoch(epoch) + + metrics = [] + start_id = 0 + # the last gradient update may contain less than gradient_interval batches + gradient_interval = min(batch_per_epoch - start_id, self.gradient_interval) + + for batch_id, batch in enumerate(islice(dataloader, batch_per_epoch)): + if self.device.type == "cuda": + batch = utils.cuda(batch, device=self.device) + + loss, metric = model(batch) + if not loss.requires_grad: + raise RuntimeError("Loss doesn't require grad. Did you define any loss in the task?") + loss = loss / gradient_interval + loss.backward() + metrics.append(metric) + + if batch_id - start_id + 1 == gradient_interval: + self.optimizer.step() + self.optimizer.zero_grad() + + metric = utils.stack(metrics, dim=0) + metric = utils.mean(metric, dim=0) + if self.world_size > 1: + metric = comm.reduce(metric, op="mean") + self.meter.update(metric) + + metrics = [] + start_id = batch_id + 1 + gradient_interval = min(batch_per_epoch - start_id, self.gradient_interval) + + if self.scheduler: + self.scheduler.step() + + @torch.no_grad() + def evaluate(self, split, log=True): + """ + Evaluate the model. + + Parameters: + split (str): split to evaluate. Can be ``train``, ``valid`` or ``test``. + log (bool, optional): log metrics or not + + Returns: + dict: metrics + """ + if comm.get_rank() == 0: + logger.warning(pretty.separator) + logger.warning("Evaluate on %s" % split) + test_set = getattr(self, "%s_set" % split) + sampler = torch_data.DistributedSampler(test_set, self.world_size, self.rank) + dataloader = data.DataLoader(test_set, self.batch_size, sampler=sampler, num_workers=self.num_worker) + model = self.model + model.split = split + + model.eval() + preds = [] + targets = [] + for batch in dataloader: + if self.device.type == "cuda": + batch = utils.cuda(batch, device=self.device) + + pred, target = model.predict_and_target(batch) + preds.append(pred) + targets.append(target) + + pred = utils.cat(preds) + target = utils.cat(targets) + if self.world_size > 1: + pred = comm.cat(pred) + target = comm.cat(target) + metric = model.evaluate(pred, target) + if log: + self.meter.log(metric, category="%s/epoch" % split) + + return metric + + def load(self, checkpoint, load_optimizer=True, strict=True): + """ + Load a checkpoint from file. + + Parameters: + checkpoint (file-like): checkpoint file + load_optimizer (bool, optional): load optimizer state or not + strict (bool, optional): whether to strictly check the checkpoint matches the model parameters + """ + if comm.get_rank() == 0: + logger.warning("Load checkpoint from %s" % checkpoint) + checkpoint = os.path.expanduser(checkpoint) + state = torch.load(checkpoint, map_location=self.device) + state["model"].pop("graph") # Made changes as per Issue #89 + state["model"].pop("fact_graph") # Made changes as per Issue #89 + self.model.load_state_dict(state["model"], strict=False) + + if load_optimizer: + self.optimizer.load_state_dict(state["optimizer"]) + for state in self.optimizer.state.values(): + for k, v in state.items(): + if isinstance(v, torch.Tensor): + state[k] = v.to(self.device) + + comm.synchronize() + + def save(self, checkpoint): + """ + Save checkpoint to file. + + Parameters: + checkpoint (file-like): checkpoint file + """ + if comm.get_rank() == 0: + logger.warning("Save checkpoint to %s" % checkpoint) + checkpoint = os.path.expanduser(checkpoint) + if self.rank == 0: + state = { + "model": self.model.state_dict(), + "optimizer": self.optimizer.state_dict() + } + torch.save(state, checkpoint) + + comm.synchronize() + + @classmethod + def load_config_dict(cls, config): + """ + Construct an instance from the configuration dict. + """ + if getattr(cls, "_registry_key", cls.__name__) != config["class"]: + raise ValueError("Expect config class to be `%s`, but found `%s`" % (cls.__name__, config["class"])) + + optimizer_config = config.pop("optimizer") + new_config = {} + for k, v in config.items(): + if isinstance(v, dict) and "class" in v: + v = core.Configurable.load_config_dict(v) + if k != "class": + new_config[k] = v + optimizer_config["params"] = new_config["task"].parameters() + new_config["optimizer"] = core.Configurable.load_config_dict(optimizer_config) + + return cls(**new_config) + + @property + def epoch(self): + """Current epoch.""" + return self.meter.epoch_id diff --git a/build/lib/torchdrug/core/logger.py b/build/lib/torchdrug/core/logger.py new file mode 100644 index 00000000..ce69de8c --- /dev/null +++ b/build/lib/torchdrug/core/logger.py @@ -0,0 +1,127 @@ +import logging +import warnings + +from torchdrug.core import Registry as R +from torchdrug.utils import pretty + + +class LoggerBase(object): + """ + Base class for loggers. + + Any custom logger should be derived from this class. + """ + + def log(self, record, step_id, category="train/batch"): + """ + Log a record. + + Parameters: + record (dict): dict of any metric + step_id (int): index of this log step + category (str, optional): log category. + Available types are ``train/batch``, ``train/epoch``, ``valid/epoch`` and ``test/epoch``. + """ + raise NotImplementedError + + def log_config(self, config): + """ + Log a hyperparameter config. + + Parameters: + config (dict): hyperparameter config + """ + raise NotImplementedError + + +@R.register("core.LoggingLogger") +class LoggingLogger(LoggerBase): + """ + Log outputs with the builtin logging module of Python. + + By default, the logs will be printed to the console. To additionally log outputs to a file, + add the following lines in the beginning of your code. + + .. code-block: python + + import logging + + format = logging.Formatter("%(asctime)-10s %(message)s", "%H:%M:%S") + handler = logging.FileHandler("log.txt") + handler.setFormatter(format) + logger = logging.getLogger("") + logger.addHandler(handler) + """ + + def __init__(self): + self.logger = logging.getLogger(__name__) + + def log(self, record, step_id, category="train/batch"): + if category.endswith("batch"): + self.logger.warning(pretty.separator) + elif category.endswith("epoch"): + self.logger.warning(pretty.line) + if category == "train/epoch": + for k in sorted(record.keys()): + self.logger.warning("average %s: %g" % (k, record[k])) + else: + for k in sorted(record.keys()): + self.logger.warning("%s: %g" % (k, record[k])) + + def log_config(self, config): + self.logger.warning(pretty.format(config, compact=True)) + + +@R.register("core.WandbLogger") +class WandbLogger(LoggingLogger): + """ + Log outputs with `Weights and Biases`_ and track the experiment progress. + + Note this class also output logs with the builtin logging module. + + See `wandb.init`_ for more details. + + .. _Weights and Biases: + https://docs.wandb.ai + + .. _wandb.init: + https://docs.wandb.ai/ref/python/init + + Parameters: + project (str, optional): name of the project + name (str, optional): name of this run + dir (str, optional): path to store meta data. Default is `./wandb`. + kwargs: keyword arguments for `wandb.init`_ + """ + + def __init__(self, project=None, name=None, dir=None, **kwargs): + super(WandbLogger, self).__init__() + try: + import wandb + except ModuleNotFoundError: + raise ModuleNotFoundError("Wandb is not found. Please install it with `pip install wandb`") + + if wandb.run is not None: + warnings.warn( + "There is a wandb run already in progress and newly created instances of `WandbLogger` will reuse " + "this run. If this is not desired, call `wandb.finish()` or `WandbLogger.finish()` before " + "instantiating `WandbLogger`." + ) + self.run = wandb.run + else: + self.run = wandb.init(project=project, name=name, dir=dir, **kwargs) + + self.run.define_metric("train/batch/*", step_metric="batch", summary="none") + for split in ["train", "valid", "test"]: + self.run.define_metric("%s/epoch/*" % split, step_metric="epoch") + + def log(self, record, step_id, category="train/batch"): + super(WandbLogger, self).log(record, step_id, category) + record = {"%s/%s" % (category, k): v for k, v in record.items()} + step_name = category.split("/")[-1] + record[step_name] = step_id + self.run.log(record) + + def log_config(self, confg_dict): + super(WandbLogger, self).log_config(confg_dict) + self.run.config.update(confg_dict) \ No newline at end of file diff --git a/build/lib/torchdrug/core/meter.py b/build/lib/torchdrug/core/meter.py new file mode 100644 index 00000000..41bd0a49 --- /dev/null +++ b/build/lib/torchdrug/core/meter.py @@ -0,0 +1,124 @@ +import time +import logging +from collections import defaultdict + +import numpy as np +import torch + +from torchdrug import core +from torchdrug.utils import pretty + +logger = logging.getLogger(__name__) + + +class Meter(object): + """ + Meter for recording metrics and training progress. + + Parameters: + log_interval (int, optional): log every n updates + silent (int, optional): surpress all outputs or not + logger (core.LoggerBase, optional): log handler + """ + def __init__(self, log_interval=100, silent=False, logger=None): + self.records = defaultdict(list) + self.log_interval = log_interval + self.epoch2batch = [0] + self.time = [time.time()] + self.epoch_id = 0 + self.batch_id = 0 + self.silent = silent + self.logger = logger + + def log(self, record, category="train/batch"): + """ + Log a record. + + Parameters: + record (dict): dict of any metric + category (str, optional): log category. + Available types are ``train/batch``, ``train/epoch``, ``valid/epoch`` and ``test/epoch``. + """ + if self.silent: + return + + if category.endswith("batch"): + step_id = self.batch_id + elif category.endswith("epoch"): + step_id = self.epoch_id + self.logger.log(record, step_id=step_id, category=category) + + def log_config(self, config): + """ + Log a hyperparameter config. + + Parameters: + config (dict): hyperparameter config + """ + if self.silent: + return + + self.logger.log_config(config) + + def update(self, record): + """ + Update the meter with a record. + + Parameters: + record (dict): dict of any metric + """ + if self.batch_id % self.log_interval == 0: + self.log(record, category="train/batch") + self.batch_id += 1 + + for k, v in record.items(): + if isinstance(v, torch.Tensor): + v = v.item() + self.records[k].append(v) + + def step(self): + """ + Step an epoch for this meter. + + Instead of manually invoking :meth:`step()`, it is suggested to use the following line + + >>> for epoch in meter(num_epoch): + >>> # do something + """ + self.epoch_id += 1 + self.epoch2batch.append(self.batch_id) + self.time.append(time.time()) + index = slice(self.epoch2batch[-2], self.epoch2batch[-1]) + duration = self.time[-1] - self.time[-2] + speed = (self.epoch2batch[-1] - self.epoch2batch[-2]) / duration + if self.silent: + return + + logger.warning("duration: %s" % pretty.time(duration)) + logger.warning("speed: %.2f batch / sec" % speed) + + eta = (self.time[-1] - self.time[self.start_epoch]) \ + / (self.epoch_id - self.start_epoch) * (self.end_epoch - self.epoch_id) + logger.warning("ETA: %s" % pretty.time(eta)) + if torch.cuda.is_available(): + logger.warning("max GPU memory: %.1f MiB" % (torch.cuda.max_memory_allocated() / 1e6)) + torch.cuda.reset_peak_memory_stats() + + record = {} + for k, v in self.records.items(): + record[k] = np.mean(v[index]) + self.log(record, category="train/epoch") + + def __call__(self, num_epoch): + self.start_epoch = self.epoch_id + self.end_epoch = self.start_epoch + num_epoch + + for epoch in range(self.start_epoch, self.end_epoch): + if not self.silent: + logger.warning(pretty.separator) + logger.warning("Epoch %d begin" % epoch) + yield epoch + if not self.silent: + logger.warning(pretty.separator) + logger.warning("Epoch %d end" % epoch) + self.step() diff --git a/build/lib/torchdrug/data/__init__.py b/build/lib/torchdrug/data/__init__.py new file mode 100644 index 00000000..508da327 --- /dev/null +++ b/build/lib/torchdrug/data/__init__.py @@ -0,0 +1,19 @@ +from .dictionary import PerfectHash, Dictionary +from .graph import Graph, PackedGraph, cat +from .molecule import Molecule, PackedMolecule +from .protein import Protein, PackedProtein +from .dataset import MoleculeDataset, ReactionDataset, ProteinDataset, \ + ProteinPairDataset, ProteinLigandDataset, \ + NodeClassificationDataset, KnowledgeGraphDataset, SemiSupervised, \ + semisupervised, key_split, scaffold_split, ordered_scaffold_split +from .dataloader import DataLoader, graph_collate +from . import constant +from . import feature + +__all__ = [ + "Graph", "PackedGraph", "Molecule", "PackedMolecule", "Protein", "PackedProtein", "PerfectHash", "Dictionary", + "MoleculeDataset", "ReactionDataset", "NodeClassificationDataset", "KnowledgeGraphDataset", "SemiSupervised", + "ProteinDataset", "ProteinPairDataset", "ProteinLigandDataset", + "semisupervised", "key_split", "scaffold_split", "ordered_scaffold_split", + "DataLoader", "graph_collate", "feature", "constant", +] diff --git a/build/lib/torchdrug/data/constant.py b/build/lib/torchdrug/data/constant.py new file mode 100644 index 00000000..ea3cba97 --- /dev/null +++ b/build/lib/torchdrug/data/constant.py @@ -0,0 +1,52 @@ +import sys + +module = sys.modules[__name__] + +# orderd by perodic table +ATOM_NAME = ["Null", + "Hydrogen", "Helium", "Lithium", "Beryllium", "Boron", "Carbon", "Nitrogen", "Oxygen", "Fluorine", + "Neon", "Sodium", "Magnesium", "Aluminium", "Silicon", "Phosphorus", "Sulfur", "Chlorine", "Argon", + "Potassium", "Calcium", "Scandium", "Titanium", "Vanadium", "Chromium", "Manganese", "Iron", "Cobalt", + "Nickel", "Copper", "Zinc", "Gallium", "Germanium", "Arsenic", "Selenium", "Bromine", "Krypton", + "Rubidium", "Strontium", "Yttrium", "Zirconium", "Niobium", "Molybdenum", "Technetium", "Ruthenium", + "Rhodium", "Palladium", "Silver", "Cadmium", "Indium", "Tin", "Antimony", "Tellurium", "Iodine", + "Xenon", "Cesium", "Barium", "Lanthanum", "Cerium", "Praseodymium", "Neodymium", "Promethium", + "Samarium", "Europium", "Gadolinium", "Terbium", "Dysprosium", "Holmium", "Erbium", "Thulium", + "Ytterbium", "Lutetium", "Hafnium", "Tantalum", "Tungsten", "Rhenium", "Osmium", "Iridium", + "Platinum", "Gold", "Mercury", "Thallium", "Lead", "Bismuth", "Polonium", "Astatine", "Radon", + "Francium", "Radium", "Actinium", "Thorium", "Protactinium", "Uranium", "Neptunium", "Plutonium", + "Americium", "Curium", "Berkelium", "Californium", "Einsteinium", "Fermium", "Mendelevium", + "Nobelium", "Lawrencium", "Rutherfordium", "Dubnium", "Seaborgium", "Bohrium", "Hassium", + "Meitnerium", "Darmstadtium", "Roentgenium", "Copernicium", "Nihonium", "Flerovium", "Moscovium", + "Livermorium", "Tennessine", "Oganesson"] + +ATOM_SYMBOL = ["Null", + "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", + "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", + "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", + "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", + "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", + "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", + "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og"] + +# ordered by molecular mass +RESIDUE_NAME = ["Glycine", "Alanine", "Serine", "Proline", "Valine", "Threonine", "Cysteine", "Isoleucine", + "Leucine", "Asparagine", "Aspartic acid", "Glutamine", "Lysine", "Glutamic acid", "Methionine", + "Histidine", "Phenylalanine", "Arginine", "Tyrosine", "Tryptophan"] + +RESIDUE_INITIAL = ["G", "A", "S", "P", "V", "T", "C", "I", "L", "N", "D", "Q", "K", "E", "M", "H", "F", "R", "Y", "W"] + +RESIDUE_ATOM_NAME = ["C", "CA", "CB", "CD", "CD1", "CD2", "CE", "CE1", "CE2", "CE3", "CG", "CG1", "CG2", "CH2", + "CZ", "CZ2", "CZ3", "N", "ND1", "ND2", "NE", "NE1", "NE2", "NH1", "NH2", "NZ", "O", "OD1", + "OD2", "OE1", "OE2", "OG", "OG1", "OH", "OXT", "SD", "SG"] + +NUM_ATOM = len(ATOM_NAME) +NUM_AMINO_ACID = len(RESIDUE_NAME) + +for i, name in enumerate(ATOM_NAME): + if i == 0: + continue + setattr(module, name.upper(), i) + +for i, name in enumerate(RESIDUE_NAME): + setattr(module, name.upper(), i) \ No newline at end of file diff --git a/build/lib/torchdrug/data/dataloader.py b/build/lib/torchdrug/data/dataloader.py new file mode 100644 index 00000000..64cfbe3d --- /dev/null +++ b/build/lib/torchdrug/data/dataloader.py @@ -0,0 +1,104 @@ +from collections import deque +from collections.abc import Mapping, Sequence + +import torch + +from torchdrug import data + + +def graph_collate(batch): + """ + Convert any list of same nested container into a container of tensors. + + For instances of :class:`data.Graph `, they are collated + by :meth:`data.Graph.pack `. + + Parameters: + batch (list): list of samples with the same nested container + """ + elem = batch[0] + if isinstance(elem, torch.Tensor): + out = None + if torch.utils.data.get_worker_info() is not None: + numel = sum([x.numel() for x in batch]) + storage = elem.storage()._new_shared(numel) + out = elem.new(storage) + return torch.stack(batch, 0, out=out) + elif isinstance(elem, float): + return torch.tensor(batch, dtype=torch.float) + elif isinstance(elem, int): + return torch.tensor(batch) + elif isinstance(elem, (str, bytes)): + return batch + elif isinstance(elem, data.Graph): + return elem.pack(batch) + elif isinstance(elem, Mapping): + return {key: graph_collate([d[key] for d in batch]) for key in elem} + elif isinstance(elem, Sequence): + it = iter(batch) + elem_size = len(next(it)) + if not all(len(elem) == elem_size for elem in it): + raise RuntimeError('Each element in list of batch should be of equal size') + return [graph_collate(samples) for samples in zip(*batch)] + + raise TypeError("Can't collate data with type `%s`" % type(elem)) + + +class DataLoader(torch.utils.data.DataLoader): + """ + Extended data loader for batching graph structured data. + + See `torch.utils.data.DataLoader`_ for more details. + + .. _torch.utils.data.DataLoader: + https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader + + Parameters: + dataset (Dataset): dataset from which to load the data + batch_size (int, optional): how many samples per batch to load + shuffle (bool, optional): set to ``True`` to have the data reshuffled at every epoch + sampler (Sampler, optional): sampler that draws single sample from the dataset + batch_sampler (Sampler, optional): sampler that draws a mini-batch of data from the dataset + num_workers (int, optional): how many subprocesses to use for data loading + collate_fn (callable, optional): merge a list of samples into a mini-batch + kwargs: keyword arguments for `torch.utils.data.DataLoader`_ + """ + def __init__(self, dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0, + collate_fn=graph_collate, **kwargs): + super(DataLoader, self).__init__(dataset, batch_size, shuffle, sampler, batch_sampler, num_workers, collate_fn, + **kwargs) + + +class DataQueue(torch.utils.data.Dataset): + + def __init__(self): + self.queue = deque() + + def append(self, item): + self.queue.append(item) + + def pop(self): + self.queue.popleft() + + def __getitem__(self, index): + return self.queue[index] + + def __len__(self): + return len(self.deque) + + +class ExperienceReplay(torch.utils.data.DataLoader): + + def __init__(self, cache_size, batch_size=1, shuffle=True, **kwargs): + super(ExperienceReplay, self).__init__(DataQueue(), batch_size, shuffle, **kwargs) + self.cache_size = cache_size + + def update(self, items): + for item in items: + self.dataset.append(item) + while len(self.dataset) > self.cache_size: + self.dataset.pop() + + @property + def cold(self): + return len(self.dataset) < self.cache_size \ No newline at end of file diff --git a/build/lib/torchdrug/data/dataset.py b/build/lib/torchdrug/data/dataset.py new file mode 100644 index 00000000..34e9606b --- /dev/null +++ b/build/lib/torchdrug/data/dataset.py @@ -0,0 +1,1223 @@ +import os +import csv +import math +import lmdb +import pickle +import logging +import warnings +from collections import defaultdict +from collections.abc import Sequence + +from tqdm import tqdm + +import numpy as np + +from rdkit import Chem +from rdkit.Chem.Scaffolds import MurckoScaffold +import torch +from torch.utils import data as torch_data + +from torchdrug import core, data, utils + + +logger = logging.getLogger(__name__) + + +class MoleculeDataset(torch_data.Dataset, core.Configurable): + """ + Molecule dataset. + + Each sample contains a molecule graph, and any number of prediction targets. + """ + + @utils.copy_args(data.Molecule.from_molecule) + def load_smiles(self, smiles_list, targets, transform=None, lazy=False, verbose=0, **kwargs): + """ + Load the dataset from SMILES and targets. + + Parameters: + smiles_list (list of str): SMILES strings + targets (dict of list): prediction targets + transform (Callable, optional): data transformation function + lazy (bool, optional): if lazy mode is used, the molecules are processed in the dataloader. + This may slow down the data loading process, but save a lot of CPU memory and dataset loading time. + verbose (int, optional): output verbose level + **kwargs + """ + num_sample = len(smiles_list) + if num_sample > 1000000: + warnings.warn("Preprocessing molecules of a large dataset consumes a lot of CPU memory and time. " + "Use load_smiles(lazy=True) to construct molecules in the dataloader instead.") + for field, target_list in targets.items(): + if len(target_list) != num_sample: + raise ValueError("Number of target `%s` doesn't match with number of molecules. " + "Expect %d but found %d" % (field, num_sample, len(target_list))) + + self.transform = transform + self.lazy = lazy + self.kwargs = kwargs + self.smiles_list = [] + self.data = [] + self.targets = defaultdict(list) + + if verbose: + smiles_list = tqdm(smiles_list, "Constructing molecules from SMILES") + for i, smiles in enumerate(smiles_list): + if not self.lazy or len(self.data) == 0: + mol = Chem.MolFromSmiles(smiles) + if not mol: + logger.debug("Can't construct molecule from SMILES `%s`. Ignore this sample." % smiles) + continue + mol = data.Molecule.from_molecule(mol, **kwargs) + else: + mol = None + self.data.append(mol) + self.smiles_list.append(smiles) + for field in targets: + self.targets[field].append(targets[field][i]) + + @utils.copy_args(load_smiles) + def load_csv(self, csv_file, smiles_field="smiles", target_fields=None, verbose=0, **kwargs): + """ + Load the dataset from a csv file. + + Parameters: + csv_file (str): file name + smiles_field (str, optional): name of the SMILES column in the table. + Use ``None`` if there is no SMILES column. + target_fields (list of str, optional): name of target columns in the table. + Default is all columns other than the SMILES column. + verbose (int, optional): output verbose level + **kwargs + """ + if target_fields is not None: + target_fields = set(target_fields) + + with open(csv_file, "r") as fin: + reader = csv.reader(fin) + if verbose: + reader = iter(tqdm(reader, "Loading %s" % csv_file, utils.get_line_count(csv_file))) + fields = next(reader) + smiles = [] + targets = defaultdict(list) + for values in reader: + if not any(values): + continue + if smiles_field is None: + smiles.append("") + for field, value in zip(fields, values): + if field == smiles_field: + smiles.append(value) + elif target_fields is None or field in target_fields: + value = utils.literal_eval(value) + if value == "": + value = math.nan + targets[field].append(value) + + self.load_smiles(smiles, targets, verbose=verbose, **kwargs) + + def load_pickle(self, pkl_file, verbose=0): + """ + Load the dataset from a pickle file. + + Parameters: + pkl_file (str): file name + verbose (int, optional): output verbose level + """ + with utils.smart_open(pkl_file, "rb") as fin: + num_sample, tasks = pickle.load(fin) + + self.smiles_list = [] + self.data = [] + self.targets = {task: [] for task in tasks} + indexes = range(num_sample) + if verbose: + indexes = tqdm(indexes, "Loading %s" % pkl_file) + for i in indexes: + smiles, mol, values = pickle.load(fin) + self.smiles_list.append(smiles) + self.data.append(mol) + for task, value in zip(tasks, values): + self.targets[task] = value + + def save_pickle(self, pkl_file, verbose=0): + """ + Save the dataset to a pickle file. + + Parameters: + pkl_file (str): file name + verbose (int, optional): output verbose level + """ + with utils.smart_open(pkl_file, "wb") as fout: + num_sample = len(self.data) + tasks = self.targets.keys() + pickle.dump((num_sample, tasks), fout) + + indexes = range(num_sample) + if verbose: + indexes = tqdm(indexes, "Dumping to %s" % pkl_file) + for i in indexes: + values = [v[i] for v in self.targets.values()] + pickle.dump((self.smiles_list[i], self.data[i], values), fout) + + def _standarize_index(self, index, count): + if isinstance(index, slice): + start = index.start or 0 + if start < 0: + start += count + stop = index.stop or count + if stop < 0: + stop += count + step = index.step or 1 + index = range(start, stop, step) + elif not isinstance(index, list): + raise ValueError("Unknown index `%s`" % index) + return index + + def get_item(self, index): + if getattr(self, "lazy", False): + # TODO: what if the smiles is invalid here? + item = {"graph": data.Molecule.from_smiles(self.smiles_list[index], **self.kwargs)} + else: + item = {"graph": self.data[index]} + item.update({k: v[index] for k, v in self.targets.items()}) + if self.transform: + item = self.transform(item) + return item + + def __getitem__(self, index): + if isinstance(index, int): + return self.get_item(index) + + index = self._standarize_index(index, len(self)) + return [self.get_item(i) for i in index] + + @property + def tasks(self): + """List of tasks.""" + return list(self.targets.keys()) + + @property + def node_feature_dim(self): + """Dimension of node features.""" + return self.data[0].node_feature.shape[-1] + + @property + def edge_feature_dim(self): + """Dimension of edge features.""" + return self.data[0].edge_feature.shape[-1] + + @property + def num_atom_type(self): + """Number of different atom types.""" + return len(self.atom_types) + + @property + def num_bond_type(self): + """Number of different bond types.""" + return len(self.bond_types) + + @utils.cached_property + def atom_types(self): + """All atom types.""" + atom_types = set() + + if getattr(self, "lazy", False): + warnings.warn("Calling this function for dataset with lazy=True may take a large amount of time.") + for smiles in self.smiles_list: + graph = data.Molecule.from_smiles(smiles, **self.kwargs) + atom_types.update(graph.atom_type.tolist()) + else: + for graph in self.data: + atom_types.update(graph.atom_type.tolist()) + + return sorted(atom_types) + + @utils.cached_property + def bond_types(self): + """All bond types.""" + bond_types = set() + + if getattr(self, "lazy", False): + warnings.warn("Calling this function for dataset with lazy=True may take a large amount of time.") + for smiles in self.smiles_list: + graph = data.Molecule.from_smiles(smiles, **self.kwargs) + bond_types.update(graph.edge_list[:, 2].tolist()) + else: + for graph in self.data: + bond_types.update(graph.edge_list[:, 2].tolist()) + + return sorted(bond_types) + + def __len__(self): + return len(self.data) + + def __repr__(self): + lines = [ + "#sample: %d" % len(self), + "#task: %d" % len(self.tasks), + ] + return "%s(\n %s\n)" % (self.__class__.__name__, "\n ".join(lines)) + + +class ReactionDataset(MoleculeDataset, core.Configurable): + """ + Chemical reaction dataset. + + Each sample contains two molecule graphs, and any number of prediction targets. + """ + + @utils.copy_args(data.Molecule.from_molecule) + def load_smiles(self, smiles_list, targets, transform=None, verbose=0, **kwargs): + """ + Load the dataset from SMILES and targets. + + Parameters: + smiles_list (list of str): SMILES strings + targets (dict of list): prediction targets + transform (Callable, optional): data transformation function + verbose (int, optional): output verbose level + **kwargs + """ + num_sample = len(smiles_list) + for field, target_list in targets.items(): + if len(target_list) != num_sample: + raise ValueError("Number of target `%s` doesn't match with number of molecules. " + "Expect %d but found %d" % (field, num_sample, len(target_list))) + + self.smiles_list = [] + self.data = [] + self.targets = defaultdict(list) + + if verbose: + smiles_list = tqdm(smiles_list, "Constructing molecules from SMILES") + for i, smiles in enumerate(smiles_list): + smiles_reactant, agent, smiles_product = smiles.split(">") + mols = [] + for _smiles in [smiles_reactant, smiles_product]: + mol = Chem.MolFromSmiles(_smiles) + if not mol: + logger.debug("Can't construct molecule from SMILES `%s`. Ignore this sample." % _smiles) + break + mol = data.Molecule.from_molecule(mol, **kwargs) + mols.append(mol) + else: + self.data.append(mols) + self.smiles_list.append(smiles) + for field in targets: + self.targets[field].append(targets[field][i]) + self.transform = transform + + @property + def node_feature_dim(self): + """Dimension of node features.""" + return self.data[0][0].node_feature.shape[-1] + + @property + def edge_feature_dim(self): + """Dimension of edge features.""" + return self.data[0][0].edge_feature.shape[-1] + + @property + def num_atom_type(self): + """Number of different atom types.""" + return len(self.atom_types) + + @property + def num_bond_type(self): + """Number of different bond types.""" + return len(self.bond_types) + + @utils.cached_property + def atom_types(self): + """All atom types.""" + atom_types = set() + for graphs in self.data: + for graph in graphs: + atom_types.update(graph.atom_type.tolist()) + return sorted(atom_types) + + @utils.cached_property + def bond_types(self): + """All bond types.""" + bond_types = set() + for graphs in self.data: + for graph in graphs: + bond_types.update(graph.edge_list[:, 2].tolist()) + return sorted(bond_types) + + def __len__(self): + return len(self.data) + + +class NodeClassificationDataset(torch_data.Dataset, core.Configurable): + """ + Node classification dataset. + + The whole dataset contains one graph, where each node has its own node feature and label. + """ + + def load_tsv(self, node_file, edge_file, verbose=0): + """ + Load the edge list from a tsv file. + + Parameters: + node_file (str): node feature and label file + edge_file (str): edge list file + verbose (int, optional): output verbose level + """ + inv_node_vocab = {} + inv_label_vocab = {} + node_feature = [] + node_label = [] + + with open(node_file, "r") as fin: + reader = csv.reader(fin, delimiter="\t") + if verbose: + reader = tqdm(reader, "Loading %s" % node_file, utils.get_line_count(node_file)) + for tokens in reader: + node_token = tokens[0] + feature_tokens = tokens[1: -1] + label_token = tokens[-1] + inv_node_vocab[node_token] = len(inv_node_vocab) + if label_token not in inv_label_vocab: + inv_label_vocab[label_token] = len(inv_label_vocab) + feature = [utils.literal_eval(f) for f in feature_tokens] + label = inv_label_vocab[label_token] + node_feature.append(feature) + node_label.append(label) + + edge_list = [] + + with open(edge_file, "r") as fin: + reader = csv.reader(fin, delimiter="\t") + if verbose: + reader = tqdm(reader, "Loading %s" % edge_file, utils.get_line_count(edge_file)) + for tokens in reader: + h_token, t_token = tokens + if h_token not in inv_node_vocab: + inv_node_vocab[h_token] = len(inv_node_vocab) + h = inv_node_vocab[h_token] + if t_token not in inv_node_vocab: + inv_node_vocab[t_token] = len(inv_node_vocab) + t = inv_node_vocab[t_token] + edge_list.append((h, t)) + + self.load_edge(edge_list, node_feature, node_label, inv_node_vocab=inv_node_vocab, + inv_label_vocab=inv_label_vocab) + + def load_edge(self, edge_list, node_feature, node_label, node_vocab=None, inv_node_vocab=None, label_vocab=None, + inv_label_vocab=None): + node_vocab, inv_node_vocab = self._standarize_vocab(node_vocab, inv_node_vocab) + label_vocab, inv_label_vocab = self._standarize_vocab(label_vocab, inv_label_vocab) + + self.num_labeled_node = len(node_feature) + if len(node_vocab) > len(node_feature): + logger.warning("Missing features & labels for %d / %d nodes" % + (len(node_vocab) - len(node_feature), len(node_vocab))) + dummy_label = 0 + dummy_feature = [0] * len(node_feature[0]) + node_label += [dummy_label] * (len(node_vocab) - len(node_feature)) + node_feature += [dummy_feature] * (len(node_vocab) - len(node_feature)) + + self.graph = data.Graph(edge_list, num_node=len(node_vocab), node_feature=node_feature) + with self.graph.node(): + self.graph.node_label = torch.as_tensor(node_label) + self.node_vocab = node_vocab + self.inv_node_vocab = inv_node_vocab + self.label_vocab = label_vocab + self.inv_node_vocab = inv_label_vocab + + def _standarize_vocab(self, vocab, inverse_vocab): + if vocab is not None: + if isinstance(vocab, dict): + assert set(vocab.keys()) == set(range(len(vocab))), "Vocab keys should be consecutive numbers" + vocab = [vocab[k] for k in range(len(vocab))] + if inverse_vocab is None: + inverse_vocab = {v: i for i, v in enumerate(vocab)} + if inverse_vocab is not None: + assert set(inverse_vocab.values()) == set(range(len(inverse_vocab))), \ + "Inverse vocab values should be consecutive numbers" + if vocab is None: + vocab = sorted(inverse_vocab, key=lambda k: inverse_vocab[k]) + return vocab, inverse_vocab + + @property + def num_node(self): + """Number of nodes.""" + return self.graph.num_node + + @property + def num_edge(self): + """Number of edges.""" + return self.graph.num_edge + + @property + def node_feature_dim(self): + """Dimension of node features.""" + return self.graph.node_feature.shape[-1] + + def __getitem__(self, index): + return { + "node_index": index, + "label": self.graph.node_label[index] + } + + def __len__(self): + return self.num_labeled_node + + def __repr__(self): + lines = [ + "#node: %d" % self.num_node, + "#edge: %d" % self.num_edge, + "#class: %d" % len(self.label_vocab), + ] + return "%s(\n %s\n)" % (self.__class__.__name__, "\n ".join(lines)) + + +class KnowledgeGraphDataset(torch_data.Dataset, core.Configurable): + """ + Knowledge graph dataset. + + The whole dataset contains one knowledge graph. + """ + + def load_triplet(self, triplets, entity_vocab=None, relation_vocab=None, inv_entity_vocab=None, + inv_relation_vocab=None): + """ + Load the dataset from triplets. + The mapping between indexes and tokens is specified through either vocabularies or inverse vocabularies. + + Parameters: + triplets (array_like): triplets of shape :math:`(n, 3)` + entity_vocab (dict of str, optional): maps entity indexes to tokens + relation_vocab (dict of str, optional): maps relation indexes to tokens + inv_entity_vocab (dict of str, optional): maps tokens to entity indexes + inv_relation_vocab (dict of str, optional): maps tokens to relation indexes + """ + entity_vocab, inv_entity_vocab = self._standarize_vocab(entity_vocab, inv_entity_vocab) + relation_vocab, inv_relation_vocab = self._standarize_vocab(relation_vocab, inv_relation_vocab) + + num_node = len(entity_vocab) if entity_vocab else None + num_relation = len(relation_vocab) if relation_vocab else None + self.graph = data.Graph(triplets, num_node=num_node, num_relation=num_relation) + self.entity_vocab = entity_vocab + self.relation_vocab = relation_vocab + self.inv_entity_vocab = inv_entity_vocab + self.inv_relation_vocab = inv_relation_vocab + + def load_tsv(self, tsv_file, verbose=0): + """ + Load the dataset from a tsv file. + + Parameters: + tsv_file (str): file name + verbose (int, optional): output verbose level + """ + inv_entity_vocab = {} + inv_relation_vocab = {} + triplets = [] + + with open(tsv_file, "r") as fin: + reader = csv.reader(fin, delimiter="\t") + if verbose: + reader = tqdm(reader, "Loading %s" % tsv_file) + for tokens in reader: + h_token, r_token, t_token = tokens + if h_token not in inv_entity_vocab: + inv_entity_vocab[h_token] = len(inv_entity_vocab) + h = inv_entity_vocab[h_token] + if r_token not in inv_relation_vocab: + inv_relation_vocab[r_token] = len(inv_relation_vocab) + r = inv_relation_vocab[r_token] + if t_token not in inv_entity_vocab: + inv_entity_vocab[t_token] = len(inv_entity_vocab) + t = inv_entity_vocab[t_token] + triplets.append((h, t, r)) + + self.load_triplet(triplets, inv_entity_vocab=inv_entity_vocab, inv_relation_vocab=inv_relation_vocab) + + def load_tsvs(self, tsv_files, verbose=0): + """ + Load the dataset from multiple tsv files. + + Parameters: + tsv_files (list of str): list of file names + verbose (int, optional): output verbose level + """ + inv_entity_vocab = {} + inv_relation_vocab = {} + triplets = [] + num_samples = [] + + for tsv_file in tsv_files: + with open(tsv_file, "r") as fin: + reader = csv.reader(fin, delimiter="\t") + if verbose: + reader = tqdm(reader, "Loading %s" % tsv_file, utils.get_line_count(tsv_file)) + + num_sample = 0 + for tokens in reader: + h_token, r_token, t_token = tokens + if h_token not in inv_entity_vocab: + inv_entity_vocab[h_token] = len(inv_entity_vocab) + h = inv_entity_vocab[h_token] + if r_token not in inv_relation_vocab: + inv_relation_vocab[r_token] = len(inv_relation_vocab) + r = inv_relation_vocab[r_token] + if t_token not in inv_entity_vocab: + inv_entity_vocab[t_token] = len(inv_entity_vocab) + t = inv_entity_vocab[t_token] + triplets.append((h, t, r)) + num_sample += 1 + num_samples.append(num_sample) + + self.load_triplet(triplets, inv_entity_vocab=inv_entity_vocab, inv_relation_vocab=inv_relation_vocab) + self.num_samples = num_samples + + def _standarize_vocab(self, vocab, inverse_vocab): + if vocab is not None: + if isinstance(vocab, dict): + assert set(vocab.keys()) == set(range(len(vocab))), "Vocab keys should be consecutive numbers" + vocab = [vocab[k] for k in range(len(vocab))] + if inverse_vocab is None: + inverse_vocab = {v: i for i, v in enumerate(vocab)} + if inverse_vocab is not None: + assert set(inverse_vocab.values()) == set(range(len(inverse_vocab))), \ + "Inverse vocab values should be consecutive numbers" + if vocab is None: + vocab = sorted(inverse_vocab, key=lambda k: inverse_vocab[k]) + return vocab, inverse_vocab + + @property + def num_entity(self): + """Number of entities.""" + return self.graph.num_node + + @property + def num_triplet(self): + """Number of triplets.""" + return self.graph.num_edge + + @property + def num_relation(self): + """Number of relations.""" + return self.graph.num_relation + + def __getitem__(self, index): + return self.graph.edge_list[index] + + def __len__(self): + return self.graph.num_edge + + def __repr__(self): + lines = [ + "#entity: %d" % self.num_entity, + "#relation: %d" % self.num_relation, + "#triplet: %d" % self.num_triplet, + ] + return "%s(\n %s\n)" % (self.__class__.__name__, "\n ".join(lines)) + + +class ProteinDataset(MoleculeDataset, core.Configurable): + """ + Protein dataset. + + Each sample contains a protein graph, and any number of prediction targets. + """ + + @utils.copy_args(data.Protein.from_sequence) + def load_sequence(self, sequences, targets, attributes=None, transform=None, lazy=False, verbose=0, **kwargs): + """ + Load the dataset from protein sequences and targets. + + Parameters: + sequences (list of str): protein sequence strings + targets (dict of list): prediction targets + attributes (dict of list): protein-level attributes + transform (Callable, optional): protein sequence transformation function + lazy (bool, optional): if lazy mode is used, the proteins are processed in the dataloader. + This may slow down the data loading process, but save a lot of CPU memory and dataset loading time. + verbose (int, optional): output verbose level + **kwargs + """ + num_sample = len(sequences) + if num_sample > 1000000: + warnings.warn("Preprocessing proteins of a large dataset consumes a lot of CPU memory and time. " + "Use load_sequence(lazy=True) to construct molecules in the dataloader instead.") + for field, target_list in targets.items(): + if len(target_list) != num_sample: + raise ValueError("Number of target `%s` doesn't match with number of molecules. " + "Expect %d but found %d" % (field, num_sample, len(target_list))) + + self.transform = transform + self.lazy = lazy + self.kwargs = kwargs + self.sequences = [] + self.data = [] + self.targets = defaultdict(list) + + if verbose: + sequences = tqdm(sequences, "Constructing proteins from sequences") + for i, sequence in enumerate(sequences): + if not self.lazy or len(self.data) == 0: + protein = data.Protein.from_sequence(sequence, **kwargs) + else: + protein = None + if attributes is not None: + with protein.graph(): + for field in attributes: + setattr(protein, field, attributes[field][i]) + self.data.append(protein) + self.sequences.append(sequence) + for field in targets: + self.targets[field].append(targets[field][i]) + + @utils.copy_args(load_sequence) + def load_lmdbs(self, lmdb_files, sequence_field="primary", target_fields=None, number_field="num_examples", + transform=None, lazy=False, verbose=0, **kwargs): + """ + Load the dataset from lmdb files. + + Parameters: + lmdb_files (list of str): list of lmdb files + sequence_field (str, optional): name of the field of protein sequence in lmdb files + target_fields (list of str, optional): name of target fields in lmdb files + number_field (str, optional): name of the field of sample count in lmdb files + transform (Callable, optional): protein sequence transformation function + lazy (bool, optional): if lazy mode is used, the proteins are processed in the dataloader. + This may slow down the data loading process, but save a lot of CPU memory and dataset loading time. + verbose (int, optional): output verbose level + **kwargs + """ + if target_fields is not None: + target_fields = set(target_fields) + + sequences = [] + num_samples = [] + targets = defaultdict(list) + for lmdb_file in lmdb_files: + env = lmdb.open(lmdb_file, readonly=True, lock=False, readahead=False, meminit=False) + with env.begin(write=False) as txn: + num_sample = pickle.loads(txn.get(number_field.encode())) + for i in range(num_sample): + item = pickle.loads(txn.get(str(i).encode())) + sequences.append(item[sequence_field]) + if target_fields: + for field in target_fields: + value = item[field] + if isinstance(value, np.ndarray) and value.size == 1: + value = value.item() + targets[field].append(value) + num_samples.append(num_sample) + + self.load_sequence(sequences, targets, attributes=None, transform=transform, + lazy=lazy, verbose=verbose, **kwargs) + self.num_samples = num_samples + + @utils.copy_args(data.Protein.from_molecule) + def load_pdbs(self, pdb_files, transform=None, lazy=False, verbose=0, **kwargs): + """ + Load the dataset from pdb files. + + Parameters: + pdb_files (list of str): pdb file names + transform (Callable, optional): protein sequence transformation function + lazy (bool, optional): if lazy mode is used, the proteins are processed in the dataloader. + This may slow down the data loading process, but save a lot of CPU memory and dataset loading time. + verbose (int, optional): output verbose level + **kwargs + """ + num_sample = len(pdb_files) + if num_sample > 1000000: + warnings.warn("Preprocessing proteins of a large dataset consumes a lot of CPU memory and time. " + "Use load_pdbs(lazy=True) to construct molecules in the dataloader instead.") + + self.transform = transform + self.lazy = lazy + self.kwargs = kwargs + self.data = [] + self.pdb_files = [] + self.sequences = [] + + if verbose: + pdb_files = tqdm(pdb_files, "Constructing proteins from pdbs") + for i, pdb_file in enumerate(pdb_files): + if not lazy or i == 0: + mol = Chem.MolFromPDBFile(pdb_file) + if not mol: + logger.debug("Can't construct molecule from pdb file `%s`. Ignore this sample." % pdb_file) + continue + protein = data.Protein.from_molecule(mol, **kwargs) + if not protein: + logger.debug("Can't construct protein from pdb file `%s`. Ignore this sample." % pdb_file) + continue + else: + protein = None + if hasattr(protein, "residue_feature"): + with protein.residue(): + protein.residue_feature = protein.residue_feature.to_sparse() + self.data.append(protein) + self.pdb_files.append(pdb_file) + self.sequences.append(protein.to_sequence() if protein else None) + + @utils.copy_args(load_sequence) + def load_fasta(self, fasta_file, verbose=0, **kwargs): + """ + Load the dataset from a fasta file. + + Parameters: + fasta_file (str): file name + verbose (int, optional): output verbose level + **kwargs + """ + with open(fasta_file, "r") as fin: + if verbose: + fin = tqdm(fin, "Loading %s" % fasta_file, utils.get_line_count(fasta_file)) + sequences = [] + lines = [] + for line in fin: + line = line.strip() + if line.startswith(">") and lines: + sequence = "".join(lines) + sequences.append(sequence) + lines = [] + else: + lines.append(line) + if lines: + sequence = "".join(lines) + sequences.append(sequence) + + return self.load_sequence(sequences, verbose=verbose, **kwargs) + + @utils.copy_args(data.Protein.from_molecule) + def load_pickle(self, pkl_file, transform=None, lazy=False, verbose=0, **kwargs): + """ + Load the dataset from a pickle file. + + Parameters: + pkl_file (str): file name + transform (Callable, optional): protein sequence transformation function + lazy (bool, optional): if lazy mode is used, the proteins are processed in the dataloader. + This may slow down the data loading process, but save a lot of CPU memory and dataset loading time. + verbose (int, optional): output verbose level + **kwargs + """ + with utils.smart_open(pkl_file, "rb") as fin: + num_sample = pickle.load(fin) + + self.transform = transform + self.lazy = lazy + self.kwargs = kwargs + self.sequences = [] + self.pdb_files = [] + self.data = [] + indexes = range(num_sample) + if verbose: + indexes = tqdm(indexes, "Loading %s" % pkl_file) + for i in indexes: + pdb_file, sequence, protein = pickle.load(fin) + self.sequences.append(sequence) + self.pdb_files.append(pdb_file) + self.data.append(protein) + + def save_pickle(self, pkl_file, verbose=0): + with utils.smart_open(pkl_file, "wb") as fout: + num_sample = len(self.data) + pickle.dump(num_sample, fout) + + indexes = range(num_sample) + if verbose: + indexes = tqdm(indexes, "Dumping to %s" % pkl_file) + for i in indexes: + pdb_dir, pdb_name = os.path.split(self.pdb_files[i]) + split = os.path.basename(pdb_dir) + pdb_file = os.path.join(split, pdb_name) + pickle.dump((pdb_file, self.sequences[i], self.data[i]), fout) + + @property + def residue_feature_dim(self): + """Dimension of residue features.""" + return self.data[0].residue_feature.shape[-1] + + +class ProteinPairDataset(ProteinDataset, core.Configurable): + """ + Protein pair dataset. + + Each sample contains two protein graphs, and any number of prediction targets. + """ + + @utils.copy_args(data.Protein.from_sequence) + def load_sequence(self, sequences, targets, attributes=None, transform=None, lazy=False, verbose=0, **kwargs): + """ + Load the dataset from protein sequences and targets. + + Parameters: + sequences (list of list of str): protein sequence string pairs + targets (dict of list): prediction targets + attributes (dict of list): protein-level attributes + transform (Callable, optional): protein sequence transformation function + lazy (bool, optional): if lazy mode is used, the protein pairs are processed in the dataloader. + This may slow down the data loading process, but save a lot of CPU memory and dataset loading time. + verbose (int, optional): output verbose level + **kwargs + """ + num_sample = len(sequences) + if num_sample > 1000000: + warnings.warn("Preprocessing proteins of a large dataset consumes a lot of CPU memory and time. " + "Use load_sequence(lazy=True) to construct molecules in the dataloader instead.") + for field, target_list in targets.items(): + if len(target_list) != num_sample: + raise ValueError("Number of target `%s` doesn't match with number of molecules. " + "Expect %d but found %d" % (field, num_sample, len(target_list))) + + self.transform = transform + self.lazy = lazy + self.kwargs = kwargs + self.sequences = [] + self.data = [] + self.targets = defaultdict(list) + + if verbose: + sequences = tqdm(sequences, "Constructing proteins from sequences") + for i, sequence in enumerate(sequences): + if not self.lazy or len(self.data) == 0: + proteins = [data.Protein.from_sequence(seq, **kwargs) for seq in sequence] + else: + proteins = None + if attributes is not None: + for protein in proteins: + with protein.graph(): + for field in attributes: + setattr(protein, field, attributes[field][i]) + self.data.append(proteins) + self.sequences.append(sequence) + for field in targets: + self.targets[field].append(targets[field][i]) + + @utils.copy_args(load_sequence) + def load_lmdbs(self, lmdb_files, sequence_field="primary", target_fields=None, number_field="num_examples", + transform=None, lazy=False, verbose=0, **kwargs): + """ + Load the dataset from lmdb files. + + Parameters: + lmdb_files (list of str): file names + sequence_field (str or list of str, optional): names of the fields of protein sequence in lmdb files + target_fields (list of str, optional): name of target fields in lmdb files + number_field (str, optional): name of the field of sample count in lmdb files + transform (Callable, optional): protein sequence transformation function + lazy (bool, optional): if lazy mode is used, the protein pairs are processed in the dataloader. + This may slow down the data loading process, but save a lot of CPU memory and dataset loading time. + verbose (int, optional): output verbose level + **kwargs + """ + if target_fields is not None: + target_fields = set(target_fields) + else: + target_fields = set() + if not isinstance(sequence_field, Sequence): + sequence_field = [sequence_field] + + sequences = [] + num_samples = [] + targets = defaultdict(list) + for lmdb_file in lmdb_files: + env = lmdb.open(lmdb_file, readonly=True, lock=False, readahead=False, meminit=False) + with env.begin(write=False) as txn: + num_sample = pickle.loads(txn.get(number_field.encode())) + for i in range(num_sample): + item = pickle.loads(txn.get(str(i).encode())) + sequences.append([item[field] for field in sequence_field]) + for field in target_fields: + value = item[field] + if isinstance(value, np.ndarray) and value.size == 1: + value = value.item() + targets[field].append(value) + num_samples.append(num_sample) + + self.load_sequence(sequences, targets, transform=transform, lazy=lazy, verbose=verbose, **kwargs) + self.num_samples = num_samples + + @property + def node_feature_dim(self): + """Dimension of node features.""" + return self.data[0][0].node_feature.shape[-1] + + @property + def residue_feature_dim(self): + """Dimension of residue features.""" + return self.data[0][0].residue_feature.shape[-1] + + +class ProteinLigandDataset(ProteinDataset, core.Configurable): + """ + Protein-ligand dataset. + + Each sample contains a protein graph and a molecule graph, and any number of prediction targets. + """ + + @utils.copy_args(data.Protein.from_sequence) + def load_sequence(self, sequences, smiles, targets, num_samples, attributes=None, transform=None, + lazy=False, verbose=0, **kwargs): + """ + Load the dataset from protein sequences, ligand SMILES strings and targets. + + Parameters: + sequences (list of str): protein sequence strings + smiles (list of str): ligand SMILES strings + targets (dict of list): prediction targets + num_samples (list of int): numbers of protein-ligand pairs in all splits + attributes (dict of list): protein-level attributes + transform (Callable, optional): protein sequence transformation function + lazy (bool, optional): if lazy mode is used, the protein-ligand pairs are processed in the dataloader. + This may slow down the data loading process, but save a lot of CPU memory and dataset loading time. + verbose (int, optional): output verbose level + **kwargs + """ + num_sample = len(sequences) + if num_sample > 1000000: + warnings.warn("Preprocessing proteins of a large dataset consumes a lot of CPU memory and time. " + "Use load_sequence(lazy=True) to construct molecules in the dataloader instead.") + if len(smiles) != len(sequences): + raise ValueError("Number of smiles doesn't match with number of proteins. " + "Expect %d but found %d" % (num_sample, len(smiles))) + for field, target_list in targets.items(): + if len(target_list) != num_sample: + raise ValueError("Number of target `%s` doesn't match with number of molecules. " + "Expect %d but found %d" % (field, num_sample, len(target_list))) + + self.transform = transform + self.lazy = lazy + self.kwargs = kwargs + self.sequences = [] + self.smiles = [] + self.data = [] + self.targets = defaultdict(list) + cum_num_samples = [num_samples[0]] + for num in num_samples[1:]: + cum_num_samples.append(cum_num_samples[-1] + num) + _cur_split = 0 + + if verbose: + sequences = tqdm(sequences, "Constructing proteins from sequences") + for i, (sequence, smile) in enumerate(zip(sequences, smiles)): + if i >= cum_num_samples[_cur_split]: + _cur_split += 1 + if not self.lazy or len(self.data) == 0: + protein = data.Protein.from_sequence(sequence, **kwargs) + mol = Chem.MolFromSmiles(smile) + if not mol: + logger.debug("Can't construct molecule from SMILES `%s`. Ignore this sample." % smile) + num_samples[_cur_split] -= 1 + continue + mol = data.Molecule.from_molecule(mol) + else: + protein = None + mol = None + if attributes is not None: + with protein.graph(): + for field in attributes: + setattr(protein, field, attributes[field][i]) + self.data.append([protein, mol]) + self.sequences.append(sequence) + self.smiles.append(smile) + for field in targets: + self.targets[field].append(targets[field][i]) + + return num_samples + + @utils.copy_args(load_sequence) + def load_lmdbs(self, lmdb_files, sequence_field="target", smiles_field="drug", target_fields=None, + number_field="num_examples", transform=None, lazy=False, verbose=0, **kwargs): + """ + Load the dataset from lmdb files. + + Parameters: + lmdb_files (list of str): file names + sequence_field (str, optional): name of the field of protein sequence in lmdb files + smiles_field (str, optional): name of the field of ligand SMILES string in lmdb files + target_fields (list of str, optional): name of target fields in lmdb files + number_field (str, optional): name of the field of sample count in lmdb files + transform (Callable, optional): protein sequence transformation function + lazy (bool, optional): if lazy mode is used, the protein-ligand pairs are processed in the dataloader. + This may slow down the data loading process, but save a lot of CPU memory and dataset loading time. + verbose (int, optional): output verbose level + **kwargs + """ + if target_fields is not None: + target_fields = set(target_fields) + + sequences = [] + smiles = [] + num_samples = [] + targets = defaultdict(list) + for lmdb_file in lmdb_files: + env = lmdb.open(lmdb_file, readonly=True, lock=False, readahead=False, meminit=False) + with env.begin(write=False) as txn: + num_sample = pickle.loads(txn.get(number_field.encode())) + for i in range(num_sample): + item = pickle.loads(txn.get(str(i).encode())) + sequences.append(item[sequence_field]) + smiles.append(item[smiles_field]) + if target_fields: + for field in target_fields: + value = item[field] + if isinstance(value, np.ndarray) and value.size == 1: + value = value.item() + targets[field].append(value) + num_samples.append(num_sample) + + num_samples = self.load_sequence(sequences, smiles, targets, num_samples, transform=transform, + lazy=lazy, verbose=verbose, **kwargs) + self.num_samples = num_samples + + @property + def ligand_node_feature_dim(self): + """Dimension of node features for ligands.""" + return self.data[0][1].node_feature.shape[-1] + + @property + def protein_node_feature_dim(self): + """Dimension of node features for proteins.""" + return self.data[0][0].node_feature.shape[-1] + + @property + def residue_feature_dim(self): + """Dimension of residue features for proteins.""" + return self.data[0][0].residue_feature.shape[-1] + + +class SemiSupervised(torch_data.Dataset, core.Configurable): + """ + Semi-supervised dataset. + + Parameters: + dataset (Dataset): supervised dataset + indices (list of int): sample indices to keep supervision + """ + + def __init__(self, dataset, indices): + self.dataset = dataset + self.indices = set(indices) + + def __getitem__(self, idx): + item = self.dataset[idx] + item["labeled"] = (idx in self.indices) + return item + + def __len__(self): + return len(self.dataset) + + +def semisupervised(dataset, length): + """ + Randomly construct a semi-supervised dataset based on the given length. + + Parameters: + dataset (Dataset): supervised dataset + length (int): length of supervised data to keep + """ + if length > len(dataset): + raise ValueError("Length of labeled data exceeds the length of the dataset") + + indexes = torch.randperm(length)[:length].tolist() + return SemiSupervised(dataset, indexes) + + +def key_split(dataset, keys, lengths=None, key_lengths=None): + + def round_to_boundary(i): + for j in range(min(i, len(dataset) - i)): + if keys[indexes[i - j]] != keys[indexes[i - j - 1]]: + return i - j + if keys[indexes[i + j]] != keys[indexes[i + j - 1]]: + return i + j + if i < len(dataset) - i: + return 0 + else: + return len(dataset) + + keys = torch.as_tensor(keys) + key_set, keys = torch.unique(keys, return_inverse=True) + perm = torch.randperm(len(key_set)) + keys = perm[keys] + indexes = keys.argsort().tolist() + + if key_lengths is not None: + assert lengths is None + key2count = keys.bincount() + key_offset = 0 + lengths = [] + for key_length in key_lengths: + lengths.append(key2count[key_offset: key_offset + key_length].sum().item()) + key_offset += key_length + + offset = 0 + offsets = [offset] + for length in lengths: + offset = round_to_boundary(offset + length) + offsets.append(offset) + offsets[-1] = len(dataset) + return [torch_data.Subset(dataset, indexes[offsets[i]: offsets[i + 1]]) for i in range(len(lengths))] + + +def scaffold_split(dataset, lengths): + """ + Randomly split a dataset into new datasets with non-overlapping scaffolds. + + Parameters: + dataset (Dataset): dataset to split + lengths (list of int): expected length for each split. + Note the results may be different in length due to rounding. + """ + + scaffold2id = {} + keys = [] + for sample in dataset: + scaffold = sample["graph"].to_scaffold() + if scaffold not in scaffold2id: + id = len(scaffold2id) + scaffold2id[scaffold] = id + else: + id = scaffold2id[scaffold] + keys.append(id) + + return key_split(dataset, keys, lengths) + + +def ordered_scaffold_split(dataset, lengths, chirality=True): + """ + Split a dataset into new datasets with non-overlapping scaffolds and sorted w.r.t. number of each scaffold. + + Parameters: + dataset (Dataset): dataset to split + lengths (list of int): expected length for each split. + Note the results may be different in length due to rounding. + """ + frac_train, frac_valid, frac_test = 0.8, 0.1, 0.1 + + scaffold2id = defaultdict(list) + for idx, smiles in enumerate(dataset.smiles_list): + scaffold = MurckoScaffold.MurckoScaffoldSmiles(smiles=smiles, includeChirality=chirality) + scaffold2id[scaffold].append(idx) + + scaffold2id = {key: sorted(value) for key, value in scaffold2id.items()} + scaffold_sets = [ + scaffold_set for (scaffold, scaffold_set) in sorted( + scaffold2id.items(), key=lambda x: (len(x[1]), x[1][0]), reverse=True) + ] + train_cutoff = frac_train * len(dataset) + valid_cutoff = (frac_train + frac_valid) * len(dataset) + train_idx, valid_idx, test_idx = [], [], [] + for scaffold_set in scaffold_sets: + if len(train_idx) + len(scaffold_set) > train_cutoff: + if len(train_idx) + len(valid_idx) + len(scaffold_set) > valid_cutoff: + test_idx.extend(scaffold_set) + else: + valid_idx.extend(scaffold_set) + else: + train_idx.extend(scaffold_set) + + return torch_data.Subset(dataset, train_idx), torch_data.Subset(dataset, valid_idx), torch_data.Subset(dataset, test_idx) diff --git a/build/lib/torchdrug/data/dictionary.py b/build/lib/torchdrug/data/dictionary.py new file mode 100644 index 00000000..e6fa9361 --- /dev/null +++ b/build/lib/torchdrug/data/dictionary.py @@ -0,0 +1,285 @@ +import math +import torch + +from torch_scatter import scatter_max + +from torchdrug import utils + + +class PerfectHash(object): + """ + Perfect hash function. + + The function can be applied to either scalar keys or vector keys. + It takes :math:`O(n\log n)` time and :math:`O(n)` space to construct the hash table. + It maps queries to their indexes in the original key set in :math:`O(1)` time. + If the query is not present in the key set, it returns -1. + + The algorithm is adapted from `Storing a Sparse Table with O(1) Worst Case Access Time`_. + + .. _Storing a Sparse Table with O(1) Worst Case Access Time: + http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.91.346&rep=rep1&type=pdf + + Parameters: + keys (LongTensor): keys of shape :math:`(N,)` or :math:`(N, D)` + weight (LongTensor, optional): weight of the level-1 hash + bias (LongTensor, optional): bias of the level-1 hash + sub_weights (LongTensor, optional): weight of level-2 hashes + sub_biases (LongTensor, optional): bias of level-2 hashes + """ + + prime = 1000000000039 + max_attempt = 10 + max_input_dim = (torch.iinfo(torch.int64).max - prime) / prime + + def __init__(self, keys, weight=None, bias=None, sub_weights=None, sub_biases=None): + if keys.ndim == 1: + keys = keys.unsqueeze(-1) + num_input, input_dim = keys.shape + if weight is None: + weight = torch.randint(0, self.prime, (1, input_dim), device=keys.device) + if bias is None: + bias = torch.randint(0, self.prime, (1,), device=keys.device) + if sub_weights is None: + sub_weights = torch.randint(0, self.prime, (num_input, input_dim), device=keys.device) + if sub_biases is None: + sub_biases = torch.randint(0, self.prime, (num_input,), device=keys.device) + + self.keys = keys + self.weight = weight + self.bias = bias + self.sub_weights = sub_weights + self.sub_biases = sub_biases + self.num_input = num_input + self.num_output = num_input + self.input_dim = input_dim + + self._construct_hash_table() + + def _construct_hash_table(self): + index = self.hash(self.keys) + count = index.bincount(minlength=self.num_output) + for i in range(self.max_attempt): + if (count ** 2).sum() < 4 * self.num_output: + break + self._reset_hash() + index = self.hash(self.keys) + count = index.bincount(minlength=self.num_output) + else: + raise RuntimeError("Fail to generate a level-1 hash after %d attempts. " + "Are you sure the keys are unique?" % self.max_attempt) + self.num_sub_outputs = (count ** 2).clamp(min=1) + self.num_sub_output = self.num_sub_outputs.sum() + self.offsets = self.num_sub_outputs.cumsum(0) - self.num_sub_outputs + + sub_index = self.sub_hash(self.keys, index) + count = sub_index.bincount(minlength=self.num_sub_output) + has_collision = scatter_max(count, self.second2first, dim_size=self.num_output)[0] > 1 + max_attempt = int(self.max_attempt * math.log(self.num_input) / math.log(2)) + for i in range(max_attempt): + if not has_collision.any(): + break + self._reset_sub_hash(has_collision) + sub_index = self.sub_hash(self.keys, index) + count = sub_index.bincount(minlength=self.num_sub_output) + has_collision = scatter_max(count, self.second2first, dim_size=self.num_output)[0] > 1 + else: + raise RuntimeError("Fail to generate level-2 hashes after %d attempts. " + "Are you sure the keys are unique?" % max_attempt) + + self.table = -torch.ones(self.num_sub_output, dtype=torch.long, device=self.device) + self.table[sub_index] = torch.arange(self.num_input, device=self.device) + + def __call__(self, keys): + """ + Get the indexes of keys in the original key set. + + Return -1 for keys that are not present in the key set. + """ + keys = torch.as_tensor(keys, dtype=torch.long, device=self.device) + if self.input_dim == 1 and keys.shape[-1] != 1: + keys = keys.unsqueeze(-1) + index = self.hash(keys) + sub_index = self.sub_hash(keys, index) + final_index = self.table[sub_index] + found = final_index != -1 + found_index = final_index[found] + equal = (keys[found] == self.keys[final_index[found]]).all(dim=-1) + final_index[found] = torch.where(equal, found_index, -torch.ones_like(found_index)) + return final_index + + def _reset_hash(self): + self.weight = torch.randint_like(self.weight, 0, self.prime) + self.bias = torch.randint_like(self.bias, 0, self.prime) + + def _reset_sub_hash(self, mask=None): + if mask is None: + self.sub_weights = torch.randint_like(self.sub_weights, 0, self.prime) + self.sub_biases = torch.randint_like(self.sub_biases, 0, self.prime) + else: + self.sub_weights[mask] = torch.randint_like(self.sub_weights[mask], 0, self.prime) + self.sub_biases[mask] = torch.randint_like(self.sub_biases[mask], 0, self.prime) + + def hash(self, keys): + """Apply the level-1 hash function to the keys.""" + keys = keys % self.prime + hash = (keys * self.weight % self.prime).sum(dim=-1) + self.bias + return hash % self.prime % self.num_output + + def sub_hash(self, keys, index): + """ + Apply level-2 hash functions to the keys. + + Parameters: + keys (LongTensor): query keys + index (LongTensor): output of the level-1 hash function + """ + keys = keys % self.prime + weight = self.sub_weights[index] + bias = self.sub_biases[index] + num_outputs = self.num_sub_outputs[index] + offsets = self.offsets[index] + hash = (keys * weight % self.prime).sum(dim=-1) + bias + return hash % self.prime % num_outputs + offsets + + @utils.cached_property + def second2first(self): + """Level-2 hash values to level-1 hash values mapping.""" + range = torch.arange(self.num_output, device=self.device) + second2first = range.repeat_interleave(self.num_sub_outputs) + return second2first + + @property + def device(self): + """Device.""" + return self.keys.device + + def cpu(self): + """ + Return a copy of this hash function in CPU memory. + + This is a non-op if the hash function is already in CPU memory. + """ + keys = self.keys.cpu() + + if keys is self.keys: + return self + else: + return type(self)(keys, weight=self.weight.cpu(), bias=self.bias.cpu(), + sub_weights=self.sub_weights.cpu(), sub_biases=self.sub_biases.cpu()) + + def cuda(self, *args, **kwargs): + """ + Return a copy of this hash function in CUDA memory. + + This is a non-op if the hash function is already on the correct device. + """ + keys = self.keys.cuda(*args, **kwargs) + + if keys is self.keys: + return self + else: + return type(self)(keys, weight=self.weight.cuda(*args, **kwargs), + bias=self.bias.cuda(*args, **kwargs), + sub_weights=self.sub_weights.cuda(*args, **kwargs), + sub_biases=self.sub_biases.cuda(*args, **kwargs)) + + +class Dictionary(object): + """ + Dictionary for mapping keys to values. + + This class has the same behavior as the built-in dict, except it operates on tensors and support batching. + + Example:: + + >>> keys = torch.tensor([[0, 0], [1, 1], [2, 2]]) + >>> values = torch.tensor([[0, 1], [1, 2], [2, 3]]) + >>> d = data.Dictionary(keys, values) + >>> assert (d[[[0, 0], [2, 2]]] == values[[0, 2]]).all() + >>> assert (d.has_key([[0, 1], [1, 2]]) == torch.tensor([False, False])).all() + + Parameters: + keys (LongTensor): keys of shape :math:`(N,)` or :math:`(N, D)` + values (Tensor): values of shape :math:`(N, ...)` + hash (PerfectHash, optional): hash function for keys + """ + def __init__(self, keys, values, hash=None): + self.keys = keys + self.values = values + self.hash = hash or PerfectHash(keys) + + def __getitem__(self, keys): + """ + Return the value for each key. Raise key error if any key is not in the dictionary. + """ + keys = torch.as_tensor(keys, dtype=torch.long, device=self.device) + index = self.hash(keys) + not_found = index == -1 + if not_found.any(): + raise KeyError(keys[not_found].tolist()) + return self.values[index] + + def get(self, keys, default=None): + """ + Return the value for each key if the key is in the dictionary, otherwise the default value is returned. + + Parameters: + keys (LongTensor): keys of arbitrary shape + default (int or Tensor, optional): default return value. By default, 0 is used. + """ + keys = torch.as_tensor(keys, dtype=torch.long, device=self.device) + if default is None: + default = 0 + default = torch.as_tensor(default, dtype=self.values.dtype, device=self.device) + index = self.hash(keys) + shape = list(index.shape) + list(self.values.shape[1:]) + values = torch.ones(shape, dtype=self.values.dtype, device=self.device) * default + found = index != -1 + values[found] = self.values[index[found]] + return values + + def has_key(self, keys): + """Check whether each key exists in the dictionary.""" + index = self.hash(keys) + return index != -1 + + def to_dict(self): + """ + Return a built-in dict object of this dictionary. + """ + keys = self.keys.tolist() + values = self.values.tolist() + dict = {tuple(k): tuple(v) for k, v in zip(keys, values)} + return dict + + @property + def device(self): + """Device.""" + return self.keys.device + + def cpu(self): + """ + Return a copy of this dictionary in CPU memory. + + This is a non-op if the dictionary is already in CPU memory. + """ + keys = self.keys.cpu() + + if keys is self.keys: + return self + else: + return type(self)(keys, self.values.cpu(), hash=self.hash.cpu()) + + def cuda(self, *args, **kwargs): + """ + Return a copy of this dictionary in CUDA memory. + + This is a non-op if the dictionary is already in CUDA memory. + """ + keys = self.keys.cuda(*args, **kwargs) + + if keys is self.keys: + return self + else: + return type(self)(keys, self.values.cuda(*args, **kwargs), hash=self.hash.cuda(*args, **kwargs)) \ No newline at end of file diff --git a/build/lib/torchdrug/data/feature.py b/build/lib/torchdrug/data/feature.py new file mode 100644 index 00000000..397d30df --- /dev/null +++ b/build/lib/torchdrug/data/feature.py @@ -0,0 +1,347 @@ +import warnings + +from rdkit import Chem +from rdkit.Chem import AllChem + +from torchdrug.core import Registry as R + + +# orderd by perodic table +atom_vocab = ["H", "B", "C", "N", "O", "F", "Mg", "Si", "P", "S", "Cl", "Cu", "Zn", "Se", "Br", "Sn", "I"] +atom_vocab = {a: i for i, a in enumerate(atom_vocab)} +degree_vocab = range(7) +num_hs_vocab = range(7) +formal_charge_vocab = range(-5, 6) +chiral_tag_vocab = range(4) +total_valence_vocab = range(8) +num_radical_vocab = range(8) +hybridization_vocab = range(len(Chem.rdchem.HybridizationType.values)) + +bond_type_vocab = [Chem.rdchem.BondType.SINGLE, Chem.rdchem.BondType.DOUBLE, + Chem.rdchem.BondType.TRIPLE, Chem.rdchem.BondType.AROMATIC] +bond_type_vocab = {b: i for i, b in enumerate(bond_type_vocab)} +bond_dir_vocab = range(len(Chem.rdchem.BondDir.values)) +bond_stereo_vocab = range(len(Chem.rdchem.BondStereo.values)) + +# orderd by molecular mass +residue_vocab = ["GLY", "ALA", "SER", "PRO", "VAL", "THR", "CYS", "ILE", "LEU", "ASN", + "ASP", "GLN", "LYS", "GLU", "MET", "HIS", "PHE", "ARG", "TYR", "TRP"] + + +def onehot(x, vocab, allow_unknown=False): + if x in vocab: + if isinstance(vocab, dict): + index = vocab[x] + else: + index = vocab.index(x) + else: + index = -1 + if allow_unknown: + feature = [0] * (len(vocab) + 1) + if index == -1: + warnings.warn("Unknown value `%s`" % x) + feature[index] = 1 + else: + feature = [0] * len(vocab) + if index == -1: + raise ValueError("Unknown value `%s`. Available vocabulary is `%s`" % (x, vocab)) + feature[index] = 1 + + return feature + + +# TODO: this one is too slow +@R.register("features.atom.default") +def atom_default(atom): + """Default atom feature. + + Features: + GetSymbol(): one-hot embedding for the atomic symbol + + GetChiralTag(): one-hot embedding for atomic chiral tag + + GetTotalDegree(): one-hot embedding for the degree of the atom in the molecule including Hs + + GetFormalCharge(): one-hot embedding for the number of formal charges in the molecule + + GetTotalNumHs(): one-hot embedding for the total number of Hs (explicit and implicit) on the atom + + GetNumRadicalElectrons(): one-hot embedding for the number of radical electrons on the atom + + GetHybridization(): one-hot embedding for the atom's hybridization + + GetIsAromatic(): whether the atom is aromatic + + IsInRing(): whether the atom is in a ring + """ + return onehot(atom.GetSymbol(), atom_vocab, allow_unknown=True) + \ + onehot(atom.GetChiralTag(), chiral_tag_vocab) + \ + onehot(atom.GetTotalDegree(), degree_vocab, allow_unknown=True) + \ + onehot(atom.GetFormalCharge(), formal_charge_vocab) + \ + onehot(atom.GetTotalNumHs(), num_hs_vocab) + \ + onehot(atom.GetNumRadicalElectrons(), num_radical_vocab) + \ + onehot(atom.GetHybridization(), hybridization_vocab) + \ + [atom.GetIsAromatic(), atom.IsInRing()] + + +@R.register("features.atom.center_identification") +def atom_center_identification(atom): + """Reaction center identification atom feature. + + Features: + GetSymbol(): one-hot embedding for the atomic symbol + + GetTotalNumHs(): one-hot embedding for the total number of Hs (explicit and implicit) on the atom + + GetTotalDegree(): one-hot embedding for the degree of the atom in the molecule including Hs + + GetTotalValence(): one-hot embedding for the total valence (explicit + implicit) of the atom + + GetIsAromatic(): whether the atom is aromatic + + IsInRing(): whether the atom is in a ring + """ + return onehot(atom.GetSymbol(), atom_vocab, allow_unknown=True) + \ + onehot(atom.GetTotalNumHs(), num_hs_vocab) + \ + onehot(atom.GetTotalDegree(), degree_vocab, allow_unknown=True) + \ + onehot(atom.GetTotalValence(), total_valence_vocab) + \ + [atom.GetIsAromatic(), atom.IsInRing()] + + +@R.register("features.atom.synthon_completion") +def atom_synthon_completion(atom): + """Synthon completion atom feature. + + Features: + GetSymbol(): one-hot embedding for the atomic symbol + + GetTotalNumHs(): one-hot embedding for the total number of Hs (explicit and implicit) on the atom + + GetTotalDegree(): one-hot embedding for the degree of the atom in the molecule including Hs + + IsInRing(): whether the atom is in a ring + + IsInRingSize(3, 4, 5, 6): whether the atom is in a ring of a particular size + + IsInRing() and not IsInRingSize(3, 4, 5, 6): whether the atom is in a ring and not in a ring of 3, 4, 5, 6 + """ + return onehot(atom.GetSymbol(), atom_vocab, allow_unknown=True) + \ + onehot(atom.GetTotalNumHs(), num_hs_vocab) + \ + onehot(atom.GetTotalDegree(), degree_vocab, allow_unknown=True) + \ + [atom.IsInRing(), atom.IsInRingSize(3), atom.IsInRingSize(4), + atom.IsInRingSize(5), atom.IsInRingSize(6), + atom.IsInRing() and (not atom.IsInRingSize(3)) and (not atom.IsInRingSize(4)) \ + and (not atom.IsInRingSize(5)) and (not atom.IsInRingSize(6))] + + +@R.register("features.atom.symbol") +def atom_symbol(atom): + """Symbol atom feature. + + Features: + GetSymbol(): one-hot embedding for the atomic symbol + """ + return onehot(atom.GetSymbol(), atom_vocab, allow_unknown=True) + + +@R.register("features.atom.explicit_property_prediction") +def atom_explicit_property_prediction(atom): + """Explicit property prediction atom feature. + + Features: + GetSymbol(): one-hot embedding for the atomic symbol + + GetDegree(): one-hot embedding for the degree of the atom in the molecule + + GetTotalValence(): one-hot embedding for the total valence (explicit + implicit) of the atom + + GetFormalCharge(): one-hot embedding for the number of formal charges in the molecule + + GetIsAromatic(): whether the atom is aromatic + """ + return onehot(atom.GetSymbol(), atom_vocab, allow_unknown=True) + \ + onehot(atom.GetDegree(), degree_vocab, allow_unknown=True) + \ + onehot(atom.GetTotalValence(), total_valence_vocab, allow_unknown=True) + \ + onehot(atom.GetFormalCharge(), formal_charge_vocab) + \ + [atom.GetIsAromatic()] + + +@R.register("features.atom.property_prediction") +def atom_property_prediction(atom): + """Property prediction atom feature. + + Features: + GetSymbol(): one-hot embedding for the atomic symbol + + GetDegree(): one-hot embedding for the degree of the atom in the molecule + + GetTotalNumHs(): one-hot embedding for the total number of Hs (explicit and implicit) on the atom + + GetTotalValence(): one-hot embedding for the total valence (explicit + implicit) of the atom + + GetFormalCharge(): one-hot embedding for the number of formal charges in the molecule + + GetIsAromatic(): whether the atom is aromatic + """ + return onehot(atom.GetSymbol(), atom_vocab, allow_unknown=True) + \ + onehot(atom.GetDegree(), degree_vocab, allow_unknown=True) + \ + onehot(atom.GetTotalNumHs(), num_hs_vocab, allow_unknown=True) + \ + onehot(atom.GetTotalValence(), total_valence_vocab, allow_unknown=True) + \ + onehot(atom.GetFormalCharge(), formal_charge_vocab, allow_unknown=True) + \ + [atom.GetIsAromatic()] + + +@R.register("features.atom.position") +def atom_position(atom): + """ + Atom position in the molecular conformation. + Return 3D position if available, otherwise 2D position is returned. + + Note it takes much time to compute the conformation for large molecules. + """ + mol = atom.GetOwningMol() + if mol.GetNumConformers() == 0: + mol.Compute2DCoords() + conformer = mol.GetConformer() + pos = conformer.GetAtomPosition(atom.GetIdx()) + return [pos.x, pos.y, pos.z] + + +@R.register("features.atom.pretrain") +def atom_pretrain(atom): + """Atom feature for pretraining. + + Features: + GetSymbol(): one-hot embedding for the atomic symbol + + GetChiralTag(): one-hot embedding for atomic chiral tag + """ + return onehot(atom.GetSymbol(), atom_vocab, allow_unknown=True) + \ + onehot(atom.GetChiralTag(), chiral_tag_vocab) + + +@R.register("features.atom.residue_symbol") +def atom_residue_symbol(atom): + """Residue symbol as atom feature. Only support atoms in a protein. + + Features: + GetSymbol(): one-hot embedding for the atomic symbol + GetResidueName(): one-hot embedding for the residue symbol + """ + residue = atom.GetPDBResidueInfo() + return onehot(atom.GetSymbol(), atom_vocab, allow_unknown=True) + \ + onehot(residue.GetResidueName() if residue else -1, residue_vocab, allow_unknown=True) + + +@R.register("features.bond.default") +def bond_default(bond): + """Default bond feature. + + Features: + GetBondType(): one-hot embedding for the type of the bond + + GetBondDir(): one-hot embedding for the direction of the bond + + GetStereo(): one-hot embedding for the stereo configuration of the bond + + GetIsConjugated(): whether the bond is considered to be conjugated + """ + return onehot(bond.GetBondType(), bond_type_vocab) + \ + onehot(bond.GetBondDir(), bond_dir_vocab) + \ + onehot(bond.GetStereo(), bond_stereo_vocab) + \ + [int(bond.GetIsConjugated())] + + +@R.register("features.bond.length") +def bond_length(bond): + """ + Bond length in the molecular conformation. + + Note it takes much time to compute the conformation for large molecules. + """ + mol = bond.GetOwningMol() + if mol.GetNumConformers() == 0: + mol.Compute2DCoords() + conformer = mol.GetConformer() + h = conformer.GetAtomPosition(bond.GetBeginAtomIdx()) + t = conformer.GetAtomPosition(bond.GetEndAtomIdx()) + return [h.Distance(t)] + + +@R.register("features.bond.property_prediction") +def bond_property_prediction(bond): + """Property prediction bond feature. + + Features: + GetBondType(): one-hot embedding for the type of the bond + + GetIsConjugated(): whether the bond is considered to be conjugated + + IsInRing(): whether the bond is in a ring + """ + return onehot(bond.GetBondType(), bond_type_vocab) + \ + [int(bond.GetIsConjugated()), bond.IsInRing()] + + +@R.register("features.bond.pretrain") +def bond_pretrain(bond): + """Bond feature for pretraining. + + Features: + GetBondType(): one-hot embedding for the type of the bond + + GetBondDir(): one-hot embedding for the direction of the bond + """ + return onehot(bond.GetBondType(), bond_type_vocab) + \ + onehot(bond.GetBondDir(), bond_dir_vocab) + + +@R.register("features.residue.symbol") +def residue_symbol(residue): + """Symbol residue feature. + + Features: + GetResidueName(): one-hot embedding for the residue symbol + """ + return onehot(residue.GetResidueName(), residue_vocab, allow_unknown=True) + + +@R.register("features.residue.default") +def residue_default(residue): + """Default residue feature. + + Features: + GetResidueName(): one-hot embedding for the residue symbol + """ + return residue_symbol(residue) + + +@R.register("features.molecule.ecfp") +def ExtendedConnectivityFingerprint(mol, radius=2, length=1024): + """Extended Connectivity Fingerprint molecule feature. + + Features: + GetMorganFingerprintAsBitVect(): a Morgan fingerprint for a molecule as a bit vector + """ + ecfp = AllChem.GetMorganFingerprintAsBitVect(mol, radius, length) + return list(ecfp) + + +@R.register("features.molecule.default") +def molecule_default(mol): + """Default molecule feature.""" + return ExtendedConnectivityFingerprint(mol) + + +ECFP = ExtendedConnectivityFingerprint + + +__all__ = [ + "atom_default", "atom_center_identification", "atom_synthon_completion", + "atom_symbol", "atom_explicit_property_prediction", "atom_property_prediction", + "atom_position", "atom_pretrain", "atom_residue_symbol", + "bond_default", "bond_length", "bond_property_prediction", "bond_pretrain", + "residue_symbol", "residue_default", + "ExtendedConnectivityFingerprint", "molecule_default", + "ECFP", +] \ No newline at end of file diff --git a/build/lib/torchdrug/data/graph.py b/build/lib/torchdrug/data/graph.py new file mode 100644 index 00000000..6439736c --- /dev/null +++ b/build/lib/torchdrug/data/graph.py @@ -0,0 +1,1851 @@ +import math +import warnings +from functools import reduce +from collections import defaultdict + +import networkx as nx + +from matplotlib import pyplot as plt +import torch +from torch_scatter import scatter_add, scatter_min + +from torchdrug import core, utils +from torchdrug.data import Dictionary +from torchdrug.utils import pretty + +plt.switch_backend("agg") + + +class Graph(core._MetaContainer): + r""" + Basic container for sparse graphs. + + To batch graphs with variadic sizes, use :meth:`data.Graph.pack `. + This will return a PackedGraph object with the following block diagonal adjacency matrix. + + .. math:: + + \begin{bmatrix} + A_1 & \cdots & 0 \\ + \vdots & \ddots & \vdots \\ + 0 & \cdots & A_n + \end{bmatrix} + + where :math:`A_i` is the adjacency of :math:`i`-th graph. + + You may register dynamic attributes for each graph. + The registered attributes will be automatically processed during packing. + + .. warning:: + + This class doesn't enforce any order on the edges. + + Example:: + + >>> graph = data.Graph(torch.randint(10, (30, 2))) + >>> with graph.node(): + >>> graph.my_node_attr = torch.rand(10, 5, 5) + + Parameters: + edge_list (array_like, optional): list of edges of shape :math:`(|E|, 2)` or :math:`(|E|, 3)`. + Each tuple is (node_in, node_out) or (node_in, node_out, relation). + edge_weight (array_like, optional): edge weights of shape :math:`(|E|,)` + num_node (int, optional): number of nodes. + By default, it will be inferred from the largest id in `edge_list` + num_relation (int, optional): number of relations + node_feature (array_like, optional): node features of shape :math:`(|V|, ...)` + edge_feature (array_like, optional): edge features of shape :math:`(|E|, ...)` + graph_feature (array_like, optional): graph feature of any shape + """ + + _meta_types = {"node", "edge", "graph", "node reference", "edge reference", "graph reference"} + + def __init__(self, edge_list=None, edge_weight=None, num_node=None, num_relation=None, + node_feature=None, edge_feature=None, graph_feature=None, **kwargs): + super(Graph, self).__init__(**kwargs) + # edge_list: N * [h, t] or N * [h, t, r] + edge_list, num_edge = self._standarize_edge_list(edge_list, num_relation) + edge_weight = self._standarize_edge_weight(edge_weight, edge_list) + + num_node = self._standarize_num_node(num_node, edge_list) + num_relation = self._standarize_num_relation(num_relation, edge_list) + + self._edge_list = edge_list + self._edge_weight = edge_weight + self.num_node = num_node + self.num_edge = num_edge + self.num_relation = num_relation + + if node_feature is not None: + with self.node(): + self.node_feature = torch.as_tensor(node_feature, device=self.device) + if edge_feature is not None: + with self.edge(): + self.edge_feature = torch.as_tensor(edge_feature, device=self.device) + if graph_feature is not None: + with self.graph(): + self.graph_feature = torch.as_tensor(graph_feature, device=self.device) + + def node(self): + """ + Context manager for node attributes. + """ + return self.context("node") + + def edge(self): + """ + Context manager for edge attributes. + """ + return self.context("edge") + + def graph(self): + """ + Context manager for graph attributes. + """ + return self.context("graph") + + def node_reference(self): + """ + Context manager for node references. + """ + return self.context("node reference") + + def edge_reference(self): + """ + Context manager for edge references. + """ + return self.context("edge reference") + + def graph_reference(self): + """ + Context manager for graph references. + """ + return self.context("graph reference") + + def _check_attribute(self, key, value): + for type in self._meta_contexts: + if "reference" in type: + if value.dtype != torch.long: + raise TypeError("Tensors used as reference must be long tensors") + if type == "node": + if len(value) != self.num_node: + raise ValueError("Expect node attribute `%s` to have shape (%d, *), but found %s" % + (key, self.num_node, value.shape)) + elif type == "edge": + if len(value) != self.num_edge: + raise ValueError("Expect edge attribute `%s` to have shape (%d, *), but found %s" % + (key, self.num_edge, value.shape)) + elif type == "node reference": + is_valid = (value >= -1) & (value < self.num_node) + if not is_valid.all(): + error_value = value[~is_valid] + raise ValueError("Expect node reference in [-1, %d), but found %d" % + (self.num_node, error_value[0])) + elif type == "edge reference": + is_valid = (value >= -1) & (value < self.num_edge) + if not is_valid.all(): + error_value = value[~is_valid] + raise ValueError("Expect edge reference in [-1, %d), but found %d" % + (self.num_edge, error_value[0])) + elif type == "graph reference": + is_valid = (value >= -1) & (value < self.batch_size) + if not is_valid.all(): + error_value = value[~is_valid] + raise ValueError("Expect graph reference in [-1, %d), but found %d" % + (self.batch_size, error_value[0])) + + def __setattr__(self, key, value): + if hasattr(self, "meta_dict"): + self._check_attribute(key, value) + super(Graph, self).__setattr__(key, value) + + def _standarize_edge_list(self, edge_list, num_relation): + if edge_list is not None and len(edge_list): + if isinstance(edge_list, torch.Tensor) and edge_list.dtype != torch.long: + try: + edge_list = torch.LongTensor(edge_list) + except TypeError: + raise TypeError("Can't convert `edge_list` to torch.long") + else: + edge_list = torch.as_tensor(edge_list, dtype=torch.long) + else: + num_element = 2 if num_relation is None else 3 + if isinstance(edge_list, torch.Tensor): + device = edge_list.device + else: + device = "cpu" + edge_list = torch.zeros(0, num_element, dtype=torch.long, device=device) + if (edge_list < 0).any(): + raise ValueError("`edge_list` should only contain non-negative indexes") + num_edge = torch.tensor(len(edge_list), device=edge_list.device) + return edge_list, num_edge + + def _standarize_edge_weight(self, edge_weight, edge_list): + if edge_weight is not None: + edge_weight = torch.as_tensor(edge_weight, dtype=torch.float, device=edge_list.device) + if len(edge_list) != len(edge_weight): + raise ValueError("`edge_list` and `edge_weight` should be the same size, but found %d and %d" + % (len(edge_list), len(edge_weight))) + else: + edge_weight = torch.ones(len(edge_list), device=edge_list.device) + return edge_weight + + def _standarize_num_node(self, num_node, edge_list): + if num_node is None: + num_node = self._maybe_num_node(edge_list) + num_node = torch.as_tensor(num_node, device=edge_list.device) + if (edge_list[:, :2] >= num_node).any(): + raise ValueError("`num_node` is %d, but found node %d in `edge_list`" % (num_node, edge_list[:, :2].max())) + return num_node + + def _standarize_num_relation(self, num_relation, edge_list): + if num_relation is None and edge_list.shape[1] > 2: + num_relation = self._maybe_num_relation(edge_list) + if num_relation is not None: + num_relation = torch.as_tensor(num_relation, device=edge_list.device) + if edge_list.shape[1] <= 2: + raise ValueError("`num_relation` is provided, but the number of dims of `edge_list` is less than 3.") + elif (edge_list[:, 2] >= num_relation).any(): + raise ValueError("`num_relation` is %d, but found relation %d in `edge_list`" % (num_relation, edge_list[:, 2].max())) + return num_relation + + def _maybe_num_node(self, edge_list): + warnings.warn("_maybe_num_node() is used to determine the number of nodes. " + "This may underestimate the count if there are isolated nodes.") + if len(edge_list): + return edge_list[:, :2].max().item() + 1 + else: + return 0 + + def _maybe_num_relation(self, edge_list): + warnings.warn("_maybe_num_relation() is used to determine the number of relations. " + "This may underestimate the count if there are unseen relations.") + return edge_list[:, 2].max().item() + 1 + + def _standarize_index(self, index, count): + if isinstance(index, slice): + start = index.start or 0 + if start < 0: + start += count + stop = index.stop or count + if stop < 0: + stop += count + step = index.step or 1 + index = torch.arange(start, stop, step, device=self.device) + else: + index = torch.as_tensor(index, device=self.device) + if index.ndim == 0: + index = index.unsqueeze(0) + if index.dtype == torch.bool: + if index.shape != (count,): + raise IndexError("Invalid mask. Expect mask to have shape %s, but found %s" % + ((int(count),), tuple(index.shape))) + index = index.nonzero().squeeze(-1) + else: + index = index.long() + max_index = -1 if len(index) == 0 else index.max().item() + if max_index >= count: + raise IndexError("Invalid index. Expect index smaller than %d, but found %d" % (count, max_index)) + return index + + def _get_mapping(self, index, count): + index = self._standarize_index(index, count) + if (index.bincount() > 1).any(): + raise ValueError("Can't create mapping for duplicate index") + mapping = -torch.ones(count + 1, dtype=torch.long, device=self.device) + mapping[index] = torch.arange(len(index), device=self.device) + return mapping + + def _get_repeat_pack_offsets(self, num_xs, repeats): + new_num_xs = num_xs.repeat_interleave(repeats) + cum_repeats_shifted = repeats.cumsum(0) - repeats + new_num_xs[cum_repeats_shifted] -= num_xs + offsets = new_num_xs.cumsum(0) + return offsets + + @classmethod + def from_dense(cls, adjacency, node_feature=None, edge_feature=None): + """ + Create a sparse graph from a dense adjacency matrix. + For zero entries in the adjacency matrix, their edge features will be ignored. + + Parameters: + adjacency (array_like): adjacency matrix of shape :math:`(|V|, |V|)` or :math:`(|V|, |V|, |R|)` + node_feature (array_like): node features of shape :math:`(|V|, ...)` + edge_feature (array_like): edge features of shape :math:`(|V|, |V|, ...)` or :math:`(|V|, |V|, |R|, ...)` + """ + adjacency = torch.as_tensor(adjacency) + if adjacency.shape[0] != adjacency.shape[1]: + raise ValueError("`adjacency` should be a square matrix, but found %d and %d" % adjacency.shape[:2]) + + edge_list = adjacency.nonzero() + edge_weight = adjacency[tuple(edge_list.t())] + num_node = adjacency.shape[0] + num_relation = adjacency.shape[2] if adjacency.ndim > 2 else None + if edge_feature is not None: + edge_feature = torch.as_tensor(edge_feature) + edge_feature = edge_feature[tuple(edge_list.t())] + + return cls(edge_list, edge_weight, num_node, num_relation, node_feature, edge_feature) + + def connected_components(self): + """ + Split this graph into connected components. + + Returns: + (PackedGraph, LongTensor): connected components, number of connected components per graph + """ + node_in, node_out = self.edge_list.t()[:2] + range = torch.arange(self.num_node, device=self.device) + node_in, node_out = torch.cat([node_in, node_out, range]), torch.cat([node_out, node_in, range]) + + # find connected component + # O(|E|d), d is the diameter of the graph + min_neighbor = torch.arange(self.num_node, device=self.device) + last = torch.zeros_like(min_neighbor) + while not torch.equal(min_neighbor, last): + last = min_neighbor + min_neighbor = scatter_min(min_neighbor[node_out], node_in, dim_size=self.num_node)[0] + anchor = torch.unique(min_neighbor) + num_cc = self.node2graph[anchor].bincount(minlength=self.batch_size) + return self.split(min_neighbor), num_cc + + def split(self, node2graph): + """ + Split a graph into multiple disconnected graphs. + + Parameters: + node2graph (array_like): ID of the graph each node belongs to + + Returns: + PackedGraph + """ + node2graph = torch.as_tensor(node2graph, dtype=torch.long, device=self.device) + # coalesce arbitrary graph IDs to [0, n) + _, node2graph = torch.unique(node2graph, return_inverse=True) + num_graph = node2graph.max() + 1 + index = node2graph.argsort() + mapping = torch.zeros_like(index) + mapping[index] = torch.arange(len(index), device=self.device) + + node_in, node_out = self.edge_list.t()[:2] + edge_mask = node2graph[node_in] == node2graph[node_out] + edge2graph = node2graph[node_in] + edge_index = edge2graph.argsort() + edge_index = edge_index[edge_mask[edge_index]] + + prepend = torch.tensor([-1], device=self.device) + is_first_node = torch.diff(node2graph[index], prepend=prepend) > 0 + graph_index = self.node2graph[index[is_first_node]] + + edge_list = self.edge_list.clone() + edge_list[:, :2] = mapping[edge_list[:, :2]] + + num_nodes = node2graph.bincount(minlength=num_graph) + num_edges = edge2graph[edge_index].bincount(minlength=num_graph) + + num_cum_nodes = num_nodes.cumsum(0) + offsets = (num_cum_nodes - num_nodes)[edge2graph[edge_index]] + + data_dict, meta_dict = self.data_mask(index, edge_index, graph_index=graph_index, exclude="graph reference") + + return self.packed_type(edge_list[edge_index], edge_weight=self.edge_weight[edge_index], num_nodes=num_nodes, + num_edges=num_edges, num_relation=self.num_relation, offsets=offsets, + meta_dict=meta_dict, **data_dict) + + @classmethod + def pack(cls, graphs): + """ + Pack a list of graphs into a PackedGraph object. + + Parameters: + graphs (list of Graph): list of graphs + + Returns: + PackedGraph + """ + edge_list = [] + edge_weight = [] + num_nodes = [] + num_edges = [] + num_relation = -1 + num_cum_node = 0 + num_cum_edge = 0 + num_graph = 0 + data_dict = defaultdict(list) + meta_dict = graphs[0].meta_dict + for graph in graphs: + edge_list.append(graph.edge_list) + edge_weight.append(graph.edge_weight) + num_nodes.append(graph.num_node) + num_edges.append(graph.num_edge) + for k, v in graph.data_dict.items(): + for type in meta_dict[k]: + if type == "graph": + v = v.unsqueeze(0) + elif type == "node reference": + v = v + num_cum_node + elif type == "edge reference": + v = v + num_cum_edge + elif type == "graph reference": + v = v + num_graph + data_dict[k].append(v) + if num_relation == -1: + num_relation = graph.num_relation + elif num_relation != graph.num_relation: + raise ValueError("Inconsistent `num_relation` in graphs. Expect %d but got %d." + % (num_relation, graph.num_relation)) + num_cum_node += graph.num_node + num_cum_edge += graph.num_edge + num_graph += 1 + + edge_list = torch.cat(edge_list) + edge_weight = torch.cat(edge_weight) + data_dict = {k: torch.cat(v) for k, v in data_dict.items()} + + return cls.packed_type(edge_list, edge_weight=edge_weight, num_nodes=num_nodes, num_edges=num_edges, + num_relation=num_relation, meta_dict=meta_dict, **data_dict) + + def repeat(self, count): + """ + Repeat this graph. + + Parameters: + count (int): number of repetitions + + Returns: + PackedGraph + """ + edge_list = self.edge_list.repeat(count, 1) + edge_weight = self.edge_weight.repeat(count) + num_nodes = [self.num_node] * count + num_edges = [self.num_edge] * count + num_relation = self.num_relation + + data_dict = {} + for k, v in self.data_dict.items(): + if "graph" in self.meta_dict[k]: + v = v.unsqueeze(0) + shape = [1] * v.ndim + shape[0] = count + length = len(v) + v = v.repeat(shape) + for type in self.meta_dict[k]: + if type == "node reference": + offsets = torch.arange(count, device=self.device) * self.num_node + v = v + offsets.repeat_interleave(length) + elif type == "edge reference": + offsets = torch.arange(count, device=self.device) * self.num_edge + v = v + offsets.repeat_interleave(length) + elif type == "graph reference": + offsets = torch.arange(count, device=self.device) + v = v + offsets.repeat_interleave(length) + data_dict[k] = v + + return self.packed_type(edge_list, edge_weight=edge_weight, num_nodes=num_nodes, num_edges=num_edges, + num_relation=num_relation, meta_dict=self.meta_dict, **data_dict) + + def get_edge(self, edge): + """ + Get the weight of of an edge. + + Parameters: + edge (array_like): index of shape :math:`(2,)` or :math:`(3,)` + + Returns: + Tensor: weight of the edge + """ + if len(edge) != self.edge_list.shape[1]: + raise ValueError("Incorrect edge index. Expect %d axes but got %d axes" + % (self.edge_list.shape[1], len(edge))) + + edge_index, num_match = self.match(edge) + return self.edge_weight[edge_index].sum() + + def match(self, pattern): + """ + Return all matched indexes for each pattern. Support patterns with ``-1`` as the wildcard. + + Parameters: + pattern (array_like): index of shape :math:`(N, 2)` or :math:`(N, 3)` + + Returns: + (LongTensor, LongTensor): matched indexes, number of matches per edge + + Examples:: + + >>> graph = data.Graph([[0, 1], [1, 0], [1, 2], [2, 1], [2, 0], [0, 2]]) + >>> index, num_match = graph.match([[0, -1], [1, 2]]) + >>> assert (index == torch.tensor([0, 5, 2])).all() + >>> assert (num_match == torch.tensor([2, 1])).all() + + """ + if len(pattern) == 0: + index = num_match = torch.zeros(0, dtype=torch.long, device=self.device) + return index, num_match + + if not hasattr(self, "edge_inverted_index"): + self.edge_inverted_index = {} + pattern = torch.as_tensor(pattern, dtype=torch.long, device=self.device) + if pattern.ndim == 1: + pattern = pattern.unsqueeze(0) + mask = pattern != -1 + scale = 2 ** torch.arange(pattern.shape[-1], device=self.device) + query_type = (mask * scale).sum(dim=-1) + query_index = query_type.argsort() + num_query = query_type.unique(return_counts=True)[1] + query_ends = num_query.cumsum(0) + query_starts = query_ends - num_query + mask_set = mask[query_index[query_starts]].tolist() + + type_ranges = [] + type_orders = [] + # get matched range for each query type + for i, mask in enumerate(mask_set): + query_type = tuple(mask) + type_index = query_index[query_starts[i]: query_ends[i]] + type_edge = pattern[type_index][:, mask] + if query_type not in self.edge_inverted_index: + self.edge_inverted_index[query_type] = self._build_edge_inverted_index(mask) + inverted_range, order = self.edge_inverted_index[query_type] + ranges = inverted_range.get(type_edge, default=0) + type_ranges.append(ranges) + type_orders.append(order) + ranges = torch.cat(type_ranges) + orders = torch.stack(type_orders) + types = torch.arange(len(mask_set), device=self.device) + types = types.repeat_interleave(num_query) + + # reorder matched ranges according to the query order + ranges = scatter_add(ranges, query_index, dim=0, dim_size=len(pattern)) + types = scatter_add(types, query_index, dim_size=len(pattern)) + # convert range to indexes + starts, ends = ranges.t() + num_match = ends - starts + offsets = num_match.cumsum(0) - num_match + types = types.repeat_interleave(num_match) + ranges = torch.arange(num_match.sum(), device=self.device) + ranges = ranges + (starts - offsets).repeat_interleave(num_match) + index = orders[types, ranges] + + return index, num_match + + def _build_edge_inverted_index(self, mask): + keys = self.edge_list[:, mask] + base = torch.tensor(self.shape, device=self.device) + base = base[mask] + max = reduce(int.__mul__, base.tolist()) + if max > torch.iinfo(torch.int64).max: + raise ValueError("Fail to build an inverted index table based on sorting. " + "The graph is too large.") + scale = base.cumprod(0) + scale = torch.div(scale[-1], scale, rounding_mode="floor") + key = (keys * scale).sum(dim=-1) + order = key.argsort() + num_keys = key.unique(return_counts=True)[1] + ends = num_keys.cumsum(0) + starts = ends - num_keys + ranges = torch.stack([starts, ends], dim=-1) + keys_set = keys[order[starts]] + inverted_range = Dictionary(keys_set, ranges) + return inverted_range, order + + def __getitem__(self, index): + # why do we check tuple? + # case 1: x[0, 1] is parsed as (0, 1) + # case 2: x[[0, 1]] is parsed as [0, 1] + if not isinstance(index, tuple): + index = (index,) + index = list(index) + + while len(index) < 2: + index.append(slice(None)) + if len(index) > 2: + raise ValueError("Graph has only 2 axis, but %d axis is indexed" % len(index)) + + if all([isinstance(axis_index, int) for axis_index in index]): + return self.get_edge(index) + + edge_list = self.edge_list.clone() + for i, axis_index in enumerate(index): + axis_index = self._standarize_index(axis_index, self.num_node) + mapping = -torch.ones(self.num_node, dtype=torch.long, device=self.device) + mapping[axis_index] = axis_index + edge_list[:, i] = mapping[edge_list[:, i]] + edge_index = (edge_list >= 0).all(dim=-1) + + return self.edge_mask(edge_index) + + def __len__(self): + return 1 + + @property + def batch_size(self): + """Batch size.""" + return 1 + + def subgraph(self, index): + """ + Return a subgraph based on the specified nodes. + Equivalent to :meth:`node_mask(index, compact=True) `. + + Parameters: + index (array_like): node index + + Returns: + Graph + + See also: + :meth:`Graph.node_mask` + """ + return self.node_mask(index, compact=True) + + def data_mask(self, node_index=None, edge_index=None, graph_index=None, include=None, exclude=None): + data_dict, meta_dict = self.data_by_meta(include, exclude) + node_mapping = None + edge_mapping = None + graph_mapping = None + for k, v in data_dict.items(): + for type in meta_dict[k]: + if type == "node" and node_index is not None: + v = v[node_index] + elif type == "edge" and edge_index is not None: + v = v[edge_index] + elif type == "graph" and graph_index is not None: + v = v.unsqueeze(0)[graph_index] + elif type == "node reference" and node_index is not None: + if node_mapping is None: + node_mapping = self._get_mapping(node_index, self.num_node) + v = node_mapping[v] + elif type == "edge reference" and edge_index is not None: + if edge_mapping is None: + edge_mapping = self._get_mapping(edge_index, self.num_edge) + v = edge_mapping[v] + elif type == "graph reference" and graph_index is not None: + if graph_mapping is None: + graph_mapping = self._get_mapping(graph_index, self.batch_size) + v = graph_mapping[v] + data_dict[k] = v + + return data_dict, meta_dict + + def node_mask(self, index, compact=False): + """ + Return a masked graph based on the specified nodes. + + This function can also be used to re-order the nodes. + + Parameters: + index (array_like): node index + compact (bool, optional): compact node ids or not + + Returns: + Graph + + Examples:: + + >>> graph = data.Graph.from_dense(torch.eye(3)) + >>> assert graph.node_mask([1, 2]).adjacency.shape == (3, 3) + >>> assert graph.node_mask([1, 2], compact=True).adjacency.shape == (2, 2) + + """ + index = self._standarize_index(index, self.num_node) + mapping = -torch.ones(self.num_node, dtype=torch.long, device=self.device) + if compact: + mapping[index] = torch.arange(len(index), device=self.device) + num_node = len(index) + else: + mapping[index] = index + num_node = self.num_node + + edge_list = self.edge_list.clone() + edge_list[:, :2] = mapping[edge_list[:, :2]] + edge_index = (edge_list[:, :2] >= 0).all(dim=-1) + + if compact: + data_dict, meta_dict = self.data_mask(index, edge_index) + else: + data_dict, meta_dict = self.data_mask(edge_index=edge_index) + + return type(self)(edge_list[edge_index], edge_weight=self.edge_weight[edge_index], num_node=num_node, + num_relation=self.num_relation, meta_dict=meta_dict, **data_dict) + + def compact(self): + """ + Remove isolated nodes and compact node ids. + + Returns: + Graph + """ + index = self.degree_out + self.degree_in > 0 + return self.subgraph(index) + + def edge_mask(self, index): + """ + Return a masked graph based on the specified edges. + + This function can also be used to re-order the edges. + + Parameters: + index (array_like): edge index + + Returns: + Graph + """ + index = self._standarize_index(index, self.num_edge) + data_dict, meta_dict = self.data_mask(edge_index=index) + + return type(self)(self.edge_list[index], edge_weight=self.edge_weight[index], num_node=self.num_node, + num_relation=self.num_relation, meta_dict=meta_dict, **data_dict) + + def line_graph(self): + """ + Construct a line graph of this graph. + The node feature of the line graph is inherited from the edge feature of the original graph. + + In the line graph, each node corresponds to an edge in the original graph. + For a pair of edges (a, b) and (b, c) that share the same intermediate node in the original graph, + there is a directed edge (a, b) -> (b, c) in the line graph. + + Returns: + Graph + """ + node_in, node_out = self.edge_list.t()[:2] + edge_index = torch.arange(self.num_edge, device=self.device) + edge_in = edge_index[node_out.argsort()] + edge_out = edge_index[node_in.argsort()] + + degree_in = node_in.bincount(minlength=self.num_node) + degree_out = node_out.bincount(minlength=self.num_node) + size = degree_out * degree_in + starts = (size.cumsum(0) - size).repeat_interleave(size) + range = torch.arange(size.sum(), device=self.device) + # each node u has degree_out[u] * degree_in[u] local edges + local_index = range - starts + local_inner_size = degree_in.repeat_interleave(size) + edge_in_offset = (degree_out.cumsum(0) - degree_out).repeat_interleave(size) + edge_out_offset = (degree_in.cumsum(0) - degree_in).repeat_interleave(size) + edge_in_index = torch.div(local_index, local_inner_size, rounding_mode="floor") + edge_in_offset + edge_out_index = local_index % local_inner_size + edge_out_offset + + edge_in = edge_in[edge_in_index] + edge_out = edge_out[edge_out_index] + edge_list = torch.stack([edge_in, edge_out], dim=-1) + node_feature = getattr(self, "edge_feature", None) + num_node = self.num_edge + num_edge = size.sum() + + return Graph(edge_list, num_node=num_node, num_edge=num_edge, node_feature=node_feature) + + def full(self): + """ + Return a fully connected graph over the nodes. + + Returns: + Graph + """ + index = torch.arange(self.num_node, device=self.device) + if self.num_relation: + edge_list = torch.meshgrid(index, index, torch.arange(self.num_relation, device=self.device)) + else: + edge_list = torch.meshgrid(index, index) + edge_list = torch.stack(edge_list).flatten(1) + edge_weight = torch.ones(len(edge_list)) + + data_dict, meta_dict = self.data_by_meta(exclude="edge") + + return type(self)(edge_list, edge_weight=edge_weight, num_node=self.num_node, num_relation=self.num_relation, + meta_dict=meta_dict, **data_dict) + + def directed(self, order=None): + """ + Mask the edges to create a directed graph. + Edges that go from a node index to a larger or equal node index will be kept. + + Parameters: + order (Tensor, optional): topological order of the nodes + """ + node_in, node_out = self.edge_list.t()[:2] + if order is not None: + edge_index = order[node_in] <= order[node_out] + else: + edge_index = node_in <= node_out + + return self.edge_mask(edge_index) + + def undirected(self, add_inverse=False): + """ + Flip all the edges to create an undirected graph. + + For knowledge graphs, the flipped edges can either have the original relation or an inverse relation. + The inverse relation for relation :math:`r` is defined as :math:`|R| + r`. + + Parameters: + add_inverse (bool, optional): whether to use inverse relations for flipped edges + """ + edge_list = self.edge_list.clone() + edge_list[:, :2] = edge_list[:, :2].flip(1) + num_relation = self.num_relation + if num_relation and add_inverse: + edge_list[:, 2] += num_relation + num_relation = num_relation * 2 + edge_list = torch.stack([self.edge_list, edge_list], dim=1).flatten(0, 1) + + index = torch.arange(self.num_edge, device=self.device).unsqueeze(-1).expand(-1, 2).flatten() + data_dict, meta_dict = self.data_mask(edge_index=index) + + return type(self)(edge_list, edge_weight=self.edge_weight[index], num_node=self.num_node, + num_relation=num_relation, meta_dict=meta_dict, **data_dict) + + @utils.cached_property + def adjacency(self): + """ + Adjacency matrix of this graph. + + If :attr:`num_relation` is specified, a sparse tensor of shape :math:`(|V|, |V|, num\_relation)` will be + returned. + Otherwise, a sparse tensor of shape :math:`(|V|, |V|)` will be returned. + """ + return utils.sparse_coo_tensor(self.edge_list.t(), self.edge_weight, self.shape) + + _tensor_names = ["edge_list", "edge_weight", "num_node", "num_relation", "edge_feature"] + + def to_tensors(self): + edge_feature = getattr(self, "edge_feature", torch.tensor(0, device=self.device)) + return self.edge_list, self.edge_weight, self.num_node, self.num_relation, edge_feature + + @classmethod + def from_tensors(cls, tensors): + edge_list, edge_weight, num_node, num_relation, edge_feature = tensors + if edge_feature.ndim == 0: + edge_feature = None + return cls(edge_list, edge_weight, num_node, num_relation, edge_feature=edge_feature) + + @property + def node2graph(self): + """Node id to graph id mapping.""" + return torch.zeros(self.num_node, dtype=torch.long, device=self.device) + + @property + def edge2graph(self): + """Edge id to graph id mapping.""" + return torch.zeros(self.num_edge, dtype=torch.long, device=self.device) + + @utils.cached_property + def degree_out(self): + """ + Weighted number of edges containing each node as output. + + Note this is the **in-degree** in graph theory. + """ + return scatter_add(self.edge_weight, self.edge_list[:, 1], dim_size=self.num_node) + + @utils.cached_property + def degree_in(self): + """ + Weighted number of edges containing each node as input. + + Note this is the **out-degree** in graph theory. + """ + return scatter_add(self.edge_weight, self.edge_list[:, 0], dim_size=self.num_node) + + @property + def edge_list(self): + """List of edges.""" + return self._edge_list + + @property + def edge_weight(self): + """Edge weights.""" + return self._edge_weight + + @property + def device(self): + """Device.""" + return self.edge_list.device + + @property + def requires_grad(self): + return self.edge_weight.requires_grad + + @property + def grad(self): + return self.edge_weight.grad + + @property + def data(self): + return self + + def requires_grad_(self): + self.edge_weight.requires_grad_() + return self + + def size(self, dim=None): + if self.num_relation: + size = torch.Size((self.num_node, self.num_node, self.num_relation)) + else: + size = torch.Size((self.num_node, self.num_node)) + if dim is None: + return size + return size[dim] + + @property + def shape(self): + return self.size() + + def copy_(self, src): + """ + Copy data from ``src`` into ``self`` and return ``self``. + + The ``src`` graph must have the same set of attributes as ``self``. + """ + self.edge_list.copy_(src.edge_list) + self.edge_weight.copy_(src.edge_weight) + self.num_node.copy_(src.num_node) + self.num_edge.copy_(src.num_edge) + if self.num_relation is not None: + self.num_relation.copy_(src.num_relation) + + keys = set(self.data_dict.keys()) + src_keys = set(src.data_dict.keys()) + if keys != src_keys: + raise RuntimeError("Attributes mismatch. Trying to assign attributes %s, " + "but current graph has attributes %s" % (src_keys, keys)) + for k, v in self.data_dict.items(): + v.copy_(src.data_dict[k]) + + return self + + def detach(self): + """ + Detach this graph. + """ + return type(self)(self.edge_list.detach(), edge_weight=self.edge_weight.detach(), + num_node=self.num_node, num_relation=self.num_relation, + meta_dict=self.meta_dict, **utils.detach(self.data_dict)) + + def clone(self): + """ + Clone this graph. + """ + return type(self)(self.edge_list.clone(), edge_weight=self.edge_weight.clone(), + num_node=self.num_node, num_relation=self.num_relation, + meta_dict=self.meta_dict, **utils.clone(self.data_dict)) + + def cuda(self, *args, **kwargs): + """ + Return a copy of this graph in CUDA memory. + + This is a non-op if the graph is already on the correct device. + """ + edge_list = self.edge_list.cuda(*args, **kwargs) + + if edge_list is self.edge_list: + return self + else: + return type(self)(edge_list, edge_weight=self.edge_weight, + num_node=self.num_node, num_relation=self.num_relation, + meta_dict=self.meta_dict, **utils.cuda(self.data_dict, *args, **kwargs)) + + def cpu(self): + """ + Return a copy of this graph in CPU memory. + + This is a non-op if the graph is already in CPU memory. + """ + edge_list = self.edge_list.cpu() + + if edge_list is self.edge_list: + return self + else: + return type(self)(edge_list, edge_weight=self.edge_weight, num_node=self.num_node, + num_relation=self.num_relation, meta_dict=self.meta_dict, **utils.cpu(self.data_dict)) + + def to(self, device, *args, **kwargs): + """ + Return a copy of this graph on the given device. + """ + device = torch.device(device) + if device.type == "cpu": + return self.cpu(*args, **kwargs) + else: + return self.cuda(device, *args, **kwargs) + + def __repr__(self): + fields = ["num_node=%d" % self.num_node, "num_edge=%d" % self.num_edge] + if self.num_relation is not None: + fields.append("num_relation=%d" % self.num_relation) + if self.device.type != "cpu": + fields.append("device='%s'" % self.device) + return "%s(%s)" % (self.__class__.__name__, ", ".join(fields)) + + def visualize(self, title=None, save_file=None, figure_size=(3, 3), ax=None, layout="spring"): + """ + Visualize this graph with matplotlib. + + Parameters: + title (str, optional): title for this graph + save_file (str, optional): ``png`` or ``pdf`` file to save visualization. + If not provided, show the figure in window. + figure_size (tuple of int, optional): width and height of the figure + ax (matplotlib.axes.Axes, optional): axis to plot the figure + layout (str, optional): graph layout + + See also: + `NetworkX graph layout`_ + + .. _NetworkX graph layout: + https://networkx.github.io/documentation/stable/reference/drawing.html#module-networkx.drawing.layout + """ + is_root = ax is None + if ax is None: + fig = plt.figure(figsize=figure_size) + if title is not None: + ax = plt.gca() + else: + ax = fig.add_axes([0, 0, 1, 1]) + if title is not None: + ax.set_title(title) + + edge_list = self.edge_list[:, :2].tolist() + G = nx.DiGraph(edge_list) + G.add_nodes_from(range(self.num_node)) + if hasattr(nx, "%s_layout" % layout): + func = getattr(nx, "%s_layout" % layout) + else: + raise ValueError("Unknown networkx layout `%s`" % layout) + if layout == "spring" or layout == "random": + pos = func(G, seed=0) + else: + pos = func(G) + nx.draw_networkx(G, pos, ax=ax) + if self.num_relation: + edge_labels = self.edge_list[:, 2].tolist() + edge_labels = {tuple(e): l for e, l in zip(edge_list, edge_labels)} + nx.draw_networkx_edge_labels(G, pos, edge_labels, ax=ax) + ax.set_frame_on(False) + + if is_root: + if save_file: + fig.savefig(save_file) + else: + fig.show() + + @classmethod + def __torch_function__(cls, func, types, args=(), kwargs=None): + return NotImplemented + + def __getstate__(self): + state = {} + cls = self.__class__ + for k, v in self.__dict__.items(): + # do not pickle property / cached property + if hasattr(cls, k) and isinstance(getattr(cls, k), property): + continue + state[k] = v + return state + + +class PackedGraph(Graph): + """ + Container for sparse graphs with variadic sizes. + + To create a PackedGraph from Graph objects + + >>> batch = data.Graph.pack(graphs) + + To retrieve Graph objects from a PackedGraph + + >>> graphs = batch.unpack() + + .. warning:: + + Edges of the same graph are guaranteed to be consecutive in the edge list. + However, this class doesn't enforce any order on the edges. + + Parameters: + edge_list (array_like, optional): list of edges of shape :math:`(|E|, 2)` or :math:`(|E|, 3)`. + Each tuple is (node_in, node_out) or (node_in, node_out, relation). + edge_weight (array_like, optional): edge weights of shape :math:`(|E|,)` + num_nodes (array_like, optional): number of nodes in each graph + By default, it will be inferred from the largest id in `edge_list` + num_edges (array_like, optional): number of edges in each graph + num_relation (int, optional): number of relations + node_feature (array_like, optional): node features of shape :math:`(|V|, ...)` + edge_feature (array_like, optional): edge features of shape :math:`(|E|, ...)` + offsets (array_like, optional): node id offsets of shape :math:`(|E|,)`. + If not provided, nodes in `edge_list` should be relative index, i.e., the index in each graph. + If provided, nodes in `edge_list` should be absolute index, i.e., the index in the packed graph. + """ + + unpacked_type = Graph + + def __init__(self, edge_list=None, edge_weight=None, num_nodes=None, num_edges=None, num_relation=None, + offsets=None, **kwargs): + edge_list, num_nodes, num_edges, num_cum_nodes, num_cum_edges, offsets = \ + self._get_cumulative(edge_list, num_nodes, num_edges, offsets) + + if offsets is None: + offsets = self._get_offsets(num_nodes, num_edges, num_cum_nodes) + edge_list = edge_list.clone() + edge_list[:, :2] += offsets.unsqueeze(-1) + + num_node = num_nodes.sum() + if (edge_list[:, :2] >= num_node).any(): + raise ValueError("Sum of `num_nodes` is %d, but found %d in `edge_list`" % + (num_node, edge_list[:, :2].max())) + + self._offsets = offsets + self.num_nodes = num_nodes + self.num_edges = num_edges + self.num_cum_nodes = num_cum_nodes + self.num_cum_edges = num_cum_edges + + super(PackedGraph, self).__init__(edge_list, edge_weight=edge_weight, num_node=num_node, + num_relation=num_relation, **kwargs) + + def _get_offsets(self, num_nodes=None, num_edges=None, num_cum_nodes=None, num_cum_edges=None): + if num_nodes is None: + prepend = torch.tensor([0], device=self.device) + num_nodes = torch.diff(num_cum_nodes, prepend=prepend) + if num_edges is None: + prepend = torch.tensor([0], device=self.device) + num_edges = torch.diff(num_cum_edges, prepend=prepend) + if num_cum_nodes is None: + num_cum_nodes = num_nodes.cumsum(0) + return (num_cum_nodes - num_nodes).repeat_interleave(num_edges) + + def merge(self, graph2graph): + """ + Merge multiple graphs into a single graph. + + Parameters: + graph2graph (array_like): ID of the new graph each graph belongs to + """ + graph2graph = torch.as_tensor(graph2graph, dtype=torch.long, device=self.device) + # coalesce arbitrary graph IDs to [0, n) + _, graph2graph = torch.unique(graph2graph, return_inverse=True) + + graph_key = graph2graph * self.batch_size + torch.arange(self.batch_size, device=self.device) + graph_index = graph_key.argsort() + graph = self.subbatch(graph_index) + graph2graph = graph2graph[graph_index] + + num_graph = graph2graph[-1] + 1 + num_nodes = scatter_add(graph.num_nodes, graph2graph, dim_size=num_graph) + num_edges = scatter_add(graph.num_edges, graph2graph, dim_size=num_graph) + offsets = self._get_offsets(num_nodes, num_edges) + + data_dict, meta_dict = graph.data_mask(exclude="graph") + + return type(self)(graph.edge_list, edge_weight=graph.edge_weight, num_nodes=num_nodes, + num_edges=num_edges, num_relation=graph.num_relation, offsets=offsets, + meta_dict=meta_dict, **data_dict) + + def unpack(self): + """ + Unpack this packed graph into a list of graphs. + + Returns: + list of Graph + """ + graphs = [] + for i in range(self.batch_size): + graphs.append(self.get_item(i)) + return graphs + + def __iter__(self): + self._iter_index = 0 + return self + + def __next__(self): + if self._iter_index < self.batch_size: + item = self[self._iter_index] + self._iter_index += 1 + return item + raise StopIteration + + def _check_attribute(self, key, value): + for type in self._meta_contexts: + if "reference" in type: + if value.dtype != torch.long: + raise TypeError("Tensors used as reference must be long tensors") + if type == "node": + if len(value) != self.num_node: + raise ValueError("Expect node attribute `%s` to have shape (%d, *), but found %s" % + (key, self.num_node, value.shape)) + elif type == "edge": + if len(value) != self.num_edge: + raise ValueError("Expect edge attribute `%s` to have shape (%d, *), but found %s" % + (key, self.num_edge, value.shape)) + elif type == "graph": + if len(value) != self.batch_size: + raise ValueError("Expect graph attribute `%s` to have shape (%d, *), but found %s" % + (key, self.batch_size, value.shape)) + elif type == "node reference": + is_valid = (value >= -1) & (value < self.num_node) + if not is_valid.all(): + error_value = value[~is_valid] + raise ValueError("Expect node reference in [-1, %d), but found %d" % + (self.num_node, error_value[0])) + elif type == "edge reference": + is_valid = (value >= -1) & (value < self.num_edge) + if not is_valid.all(): + error_value = value[~is_valid] + raise ValueError("Expect edge reference in [-1, %d), but found %d" % + (self.num_edge, error_value[0])) + elif type == "graph reference": + is_valid = (value >= -1) & (value < self.batch_size) + if not is_valid.all(): + error_value = value[~is_valid] + raise ValueError("Expect graph reference in [-1, %d), but found %d" % + (self.batch_size, error_value[0])) + + def unpack_data(self, data, type="auto"): + """ + Unpack node or edge data according to the packed graph. + + Parameters: + data (Tensor): data to unpack + type (str, optional): data type. Can be ``auto``, ``node``, or ``edge``. + + Returns: + list of Tensor + """ + if type == "auto": + if self.num_node == self.num_edge: + raise ValueError("Ambiguous type. Please specify either `node` or `edge`") + if len(data) == self.num_node: + type = "node" + elif len(data) == self.num_edge: + type = "edge" + else: + raise ValueError("Graph has %d nodes and %d edges, but data has %d entries" % + (self.num_node, self.num_edge, len(data))) + data_list = [] + if type == "node": + for i in range(self.batch_size): + data_list.append(data[self.num_cum_nodes[i] - self.num_nodes[i]: self.num_cum_nodes[i]]) + elif type == "edge": + for i in range(self.batch_size): + data_list.append(data[self.num_cum_edges[i] - self.num_edges[i]: self.num_cum_edges[i]]) + + return data_list + + def repeat(self, count): + """ + Repeat this packed graph. This function behaves similarly to `torch.Tensor.repeat`_. + + .. _torch.Tensor.repeat: + https://pytorch.org/docs/stable/generated/torch.Tensor.repeat.html + + Parameters: + count (int): number of repetitions + + Returns: + PackedGraph + """ + num_nodes = self.num_nodes.repeat(count) + num_edges = self.num_edges.repeat(count) + offsets = self._get_offsets(num_nodes, num_edges) + edge_list = self.edge_list.repeat(count, 1) + edge_list[:, :2] += (offsets - self._offsets.repeat(count)).unsqueeze(-1) + + data_dict = {} + for k, v in self.data_dict.items(): + shape = [1] * v.ndim + shape[0] = count + length = len(v) + v = v.repeat(shape) + for _type in self.meta_dict[k]: + if _type == "node reference": + pack_offsets = torch.arange(count, device=self.device) * self.num_node + v = v + pack_offsets.repeat_interleave(length) + elif _type == "edge reference": + pack_offsets = torch.arange(count, device=self.device) * self.num_edge + v = v + pack_offsets.repeat_interleave(length) + elif _type == "graph reference": + pack_offsets = torch.arange(count, device=self.device) * self.batch_size + v = v + pack_offsets.repeat_interleave(length) + data_dict[k] = v + + return type(self)(edge_list, edge_weight=self.edge_weight.repeat(count), + num_nodes=num_nodes, num_edges=num_edges, num_relation=self.num_relation, + offsets=offsets, meta_dict=self.meta_dict, **data_dict) + + def repeat_interleave(self, repeats): + """ + Repeat this packed graph. This function behaves similarly to `torch.repeat_interleave`_. + + .. _torch.repeat_interleave: + https://pytorch.org/docs/stable/generated/torch.repeat_interleave.html + + Parameters: + repeats (Tensor or int): number of repetitions for each graph + + Returns: + PackedGraph + """ + repeats = torch.as_tensor(repeats, dtype=torch.long, device=self.device) + if repeats.numel() == 1: + repeats = repeats * torch.ones(self.batch_size, dtype=torch.long, device=self.device) + num_nodes = self.num_nodes.repeat_interleave(repeats) + num_edges = self.num_edges.repeat_interleave(repeats) + num_cum_nodes = num_nodes.cumsum(0) + num_cum_edges = num_edges.cumsum(0) + num_node = num_nodes.sum() + num_edge = num_edges.sum() + batch_size = repeats.sum() + num_graphs = torch.ones(batch_size, device=self.device) + + # special case 1: graphs[i] may have no node or no edge + # special case 2: repeats[i] may be 0 + cum_repeats_shifted = repeats.cumsum(0) - repeats + graph_mask = cum_repeats_shifted < batch_size + cum_repeats_shifted = cum_repeats_shifted[graph_mask] + + index = num_cum_nodes - num_nodes + index = torch.cat([index, index[cum_repeats_shifted]]) + value = torch.cat([-num_nodes, self.num_nodes[graph_mask]]) + mask = index < num_node + node_index = scatter_add(value[mask], index[mask], dim_size=num_node) + node_index = (node_index + 1).cumsum(0) - 1 + + index = num_cum_edges - num_edges + index = torch.cat([index, index[cum_repeats_shifted]]) + value = torch.cat([-num_edges, self.num_edges[graph_mask]]) + mask = index < num_edge + edge_index = scatter_add(value[mask], index[mask], dim_size=num_edge) + edge_index = (edge_index + 1).cumsum(0) - 1 + + graph_index = torch.repeat_interleave(repeats) + + offsets = self._get_offsets(num_nodes, num_edges) + edge_list = self.edge_list[edge_index] + edge_list[:, :2] += (offsets - self._offsets[edge_index]).unsqueeze(-1) + + node_offsets = None + edge_offsets = None + graph_offsets = None + data_dict = {} + for k, v in self.data_dict.items(): + num_xs = None + pack_offsets = None + for _type in self.meta_dict[k]: + if _type == "node": + v = v[node_index] + num_xs = num_nodes + elif _type == "edge": + v = v[edge_index] + num_xs = num_edges + elif _type == "graph": + v = v[graph_index] + num_xs = num_graphs + elif _type == "node reference": + if node_offsets is None: + node_offsets = self._get_repeat_pack_offsets(self.num_nodes, repeats) + pack_offsets = node_offsets + elif _type == "edge reference": + if edge_offsets is None: + edge_offsets = self._get_repeat_pack_offsets(self.num_edges, repeats) + pack_offsets = edge_offsets + elif _type == "graph reference": + if graph_offsets is None: + graph_offsets = self._get_repeat_pack_offsets(num_graphs, repeats) + pack_offsets = graph_offsets + # add offsets to make references point to indexes in their own graph + if num_xs is not None and pack_offsets is not None: + v = v + pack_offsets.repeat_interleave(num_xs) + data_dict[k] = v + + return type(self)(edge_list, edge_weight=self.edge_weight[edge_index], + num_nodes=num_nodes, num_edges=num_edges, num_relation=self.num_relation, + offsets=offsets, meta_dict=self.meta_dict, **data_dict) + + def get_item(self, index): + """ + Get the i-th graph from this packed graph. + + Parameters: + index (int): graph index + + Returns: + Graph + """ + node_index = torch.arange(self.num_cum_nodes[index] - self.num_nodes[index], self.num_cum_nodes[index], + device=self.device) + edge_index = torch.arange(self.num_cum_edges[index] - self.num_edges[index], self.num_cum_edges[index], + device=self.device) + graph_index = index + edge_list = self.edge_list[edge_index].clone() + edge_list[:, :2] -= self._offsets[edge_index].unsqueeze(-1) + data_dict, meta_dict = self.data_mask(node_index, edge_index, graph_index=graph_index) + + return self.unpacked_type(edge_list, edge_weight=self.edge_weight[edge_index], num_node=self.num_nodes[index], + num_relation=self.num_relation, meta_dict=meta_dict, **data_dict) + + def _get_cumulative(self, edge_list, num_nodes, num_edges, offsets): + if edge_list is None: + raise ValueError("`edge_list` should be provided") + if num_edges is None: + raise ValueError("`num_edges` should be provided") + + edge_list = torch.as_tensor(edge_list) + num_edges = torch.as_tensor(num_edges, device=edge_list.device) + num_edge = num_edges.sum() + if num_edge != len(edge_list): + raise ValueError("Sum of `num_edges` is %d, but found %d edges in `edge_list`" % (num_edge, len(edge_list))) + num_cum_edges = num_edges.cumsum(0) + + if offsets is None: + _edge_list = edge_list + else: + offsets = torch.as_tensor(offsets, device=edge_list.device) + _edge_list = edge_list.clone() + _edge_list[:, :2] -= offsets.unsqueeze(-1) + if num_nodes is None: + num_nodes = [] + for num_edge, num_cum_edge in zip(num_edges, num_cum_edges): + num_nodes.append(self._maybe_num_node(_edge_list[num_cum_edge - num_edge: num_cum_edge])) + num_nodes = torch.as_tensor(num_nodes, device=edge_list.device) + num_cum_nodes = num_nodes.cumsum(0) + + return edge_list, num_nodes, num_edges, num_cum_nodes, num_cum_edges, offsets + + def _get_num_xs(self, index, num_cum_xs): + x = torch.zeros(num_cum_xs[-1], dtype=torch.long, device=self.device) + x[index] = 1 + num_cum_indexes = x.cumsum(0) + num_cum_indexes = torch.cat([torch.zeros(1, dtype=torch.long, device=self.device), num_cum_indexes]) + new_num_cum_xs = num_cum_indexes[num_cum_xs] + prepend = torch.zeros(1, dtype=torch.long, device=self.device) + new_num_xs = torch.diff(new_num_cum_xs, prepend=prepend) + return new_num_xs + + def data_mask(self, node_index=None, edge_index=None, graph_index=None, include=None, exclude=None): + data_dict, meta_dict = self.data_by_meta(include, exclude) + node_mapping = None + edge_mapping = None + graph_mapping = None + for k, v in data_dict.items(): + for type in meta_dict[k]: + if type == "node" and node_index is not None: + v = v[node_index] + elif type == "edge" and edge_index is not None: + v = v[edge_index] + elif type == "graph" and graph_index is not None: + v = v[graph_index] + elif type == "node reference" and node_index is not None: + if node_mapping is None: + node_mapping = self._get_mapping(node_index, self.num_node) + v = node_mapping[v] + elif type == "edge reference" and edge_index is not None: + if edge_mapping is None: + edge_mapping = self._get_mapping(edge_index, self.num_edge) + v = edge_mapping[v] + elif type == "graph reference" and graph_index is not None: + if graph_mapping is None: + graph_mapping = self._get_mapping(graph_index, self.batch_size) + v = graph_mapping[v] + data_dict[k] = v + + return data_dict, meta_dict + + def __getitem__(self, index): + # why do we check tuple? + # case 1: x[0, 1] is parsed as (0, 1) + # case 2: x[[0, 1]] is parsed as [0, 1] + if not isinstance(index, tuple): + index = (index,) + + if isinstance(index[0], int): + item = self.get_item(index[0]) + if len(index) > 1: + item = item[index[1:]] + return item + if len(index) > 1: + raise ValueError("Complex indexing is not supported for PackedGraph") + + index = self._standarize_index(index[0], self.batch_size) + count = index.bincount(minlength=self.batch_size) + if self.batch_size > 0 and count.max() > 1: + graph = self.repeat_interleave(count) + index_order = index.argsort() + order = torch.zeros_like(index) + order[index_order] = torch.arange(len(index), dtype=torch.long, device=self.device) + return graph.subbatch(order) + + return self.subbatch(index) + + def __len__(self): + return len(self.num_nodes) + + def full(self): + """ + Return a pack of fully connected graphs. + + This is useful for computing node-pair-wise features. + The computation can be implemented as message passing over a fully connected graph. + + Returns: + PackedGraph + """ + # TODO: more efficient implementation? + graphs = self.unpack() + graphs = [graph.full() for graph in graphs] + return graphs[0].pack(graphs) + + @utils.cached_property + def node2graph(self): + """Node id to graph id mapping.""" + node2graph = torch.repeat_interleave(self.num_nodes) + return node2graph + + @utils.cached_property + def edge2graph(self): + """Edge id to graph id mapping.""" + edge2graph = torch.repeat_interleave(self.num_edges) + return edge2graph + + @property + def batch_size(self): + """Batch size.""" + return len(self.num_nodes) + + def node_mask(self, index, compact=False): + """ + Return a masked packed graph based on the specified nodes. + + Note the compact option is only applied to node ids but not graph ids. + To generate compact graph ids, use :meth:`subbatch`. + + Parameters: + index (array_like): node index + compact (bool, optional): compact node ids or not + + Returns: + PackedGraph + """ + index = self._standarize_index(index, self.num_node) + mapping = -torch.ones(self.num_node, dtype=torch.long, device=self.device) + if compact: + mapping[index] = torch.arange(len(index), device=self.device) + num_nodes = self._get_num_xs(index, self.num_cum_nodes) + offsets = self._get_offsets(num_nodes, self.num_edges) + else: + mapping[index] = index + num_nodes = self.num_nodes + offsets = self._offsets + + edge_list = self.edge_list.clone() + edge_list[:, :2] = mapping[edge_list[:, :2]] + edge_index = (edge_list[:, :2] >= 0).all(dim=-1) + num_edges = self._get_num_xs(edge_index, self.num_cum_edges) + + if compact: + data_dict, meta_dict = self.data_mask(index, edge_index) + else: + data_dict, meta_dict = self.data_mask(edge_index=edge_index) + + return type(self)(edge_list[edge_index], edge_weight=self.edge_weight[edge_index], num_nodes=num_nodes, + num_edges=num_edges, num_relation=self.num_relation, offsets=offsets[edge_index], + meta_dict=meta_dict, **data_dict) + + def edge_mask(self, index): + """ + Return a masked packed graph based on the specified edges. + + Parameters: + index (array_like): edge index + + Returns: + PackedGraph + """ + index = self._standarize_index(index, self.num_edge) + data_dict, meta_dict = self.data_mask(edge_index=index) + num_edges = self._get_num_xs(index, self.num_cum_edges) + + return type(self)(self.edge_list[index], edge_weight=self.edge_weight[index], num_nodes=self.num_nodes, + num_edges=num_edges, num_relation=self.num_relation, offsets=self._offsets[index], + meta_dict=meta_dict, **data_dict) + + def graph_mask(self, index, compact=False): + """ + Return a masked packed graph based on the specified graphs. + + This function can also be used to re-order the graphs. + + Parameters: + index (array_like): graph index + compact (bool, optional): compact graph ids or not + + Returns: + PackedGraph + """ + index = self._standarize_index(index, self.batch_size) + graph_mapping = -torch.ones(self.batch_size, dtype=torch.long, device=self.device) + graph_mapping[index] = torch.arange(len(index), device=self.device) + + node_index = graph_mapping[self.node2graph] >= 0 + node_index = self._standarize_index(node_index, self.num_node) + mapping = -torch.ones(self.num_node, dtype=torch.long, device=self.device) + if compact: + key = graph_mapping[self.node2graph[node_index]] * self.num_node + node_index + order = key.argsort() + node_index = node_index[order] + mapping[node_index] = torch.arange(len(node_index), device=self.device) + num_nodes = self.num_nodes[index] + else: + mapping[node_index] = node_index + num_nodes = torch.zeros_like(self.num_nodes) + num_nodes[index] = self.num_nodes[index] + + edge_list = self.edge_list.clone() + edge_list[:, :2] = mapping[edge_list[:, :2]] + edge_index = (edge_list[:, :2] >= 0).all(dim=-1) + edge_index = self._standarize_index(edge_index, self.num_edge) + if compact: + key = graph_mapping[self.edge2graph[edge_index]] * self.num_edge + edge_index + order = key.argsort() + edge_index = edge_index[order] + num_edges = self.num_edges[index] + else: + num_edges = torch.zeros_like(self.num_edges) + num_edges[index] = self.num_edges[index] + offsets = self._get_offsets(num_nodes, num_edges) + + if compact: + data_dict, meta_dict = self.data_mask(node_index, edge_index, graph_index=index) + else: + data_dict, meta_dict = self.data_mask(edge_index=edge_index) + + return type(self)(edge_list[edge_index], edge_weight=self.edge_weight[edge_index], num_nodes=num_nodes, + num_edges=num_edges, num_relation=self.num_relation, offsets=offsets, + meta_dict=meta_dict, **data_dict) + + def subbatch(self, index): + """ + Return a subbatch based on the specified graphs. + Equivalent to :meth:`graph_mask(index, compact=True) `. + + Parameters: + index (array_like): graph index + + Returns: + PackedGraph + + See also: + :meth:`PackedGraph.graph_mask` + """ + return self.graph_mask(index, compact=True) + + def line_graph(self): + """ + Construct a packed line graph of this packed graph. + The node features of the line graphs are inherited from the edge features of the original graphs. + + In the line graph, each node corresponds to an edge in the original graph. + For a pair of edges (a, b) and (b, c) that share the same intermediate node in the original graph, + there is a directed edge (a, b) -> (b, c) in the line graph. + + Returns: + PackedGraph + """ + node_in, node_out = self.edge_list.t()[:2] + edge_index = torch.arange(self.num_edge, device=self.device) + edge_in = edge_index[node_out.argsort()] + edge_out = edge_index[node_in.argsort()] + + degree_in = node_in.bincount(minlength=self.num_node) + degree_out = node_out.bincount(minlength=self.num_node) + size = degree_out * degree_in + starts = (size.cumsum(0) - size).repeat_interleave(size) + range = torch.arange(size.sum(), device=self.device) + # each node u has degree_out[u] * degree_in[u] local edges + local_index = range - starts + local_inner_size = degree_in.repeat_interleave(size) + edge_in_offset = (degree_out.cumsum(0) - degree_out).repeat_interleave(size) + edge_out_offset = (degree_in.cumsum(0) - degree_in).repeat_interleave(size) + edge_in_index = torch.div(local_index, local_inner_size, rounding_mode="floor") + edge_in_offset + edge_out_index = local_index % local_inner_size + edge_out_offset + + edge_in = edge_in[edge_in_index] + edge_out = edge_out[edge_out_index] + edge_list = torch.stack([edge_in, edge_out], dim=-1) + node_feature = getattr(self, "edge_feature", None) + num_nodes = self.num_edges + num_edges = scatter_add(size, self.node2graph, dim=0, dim_size=self.batch_size) + offsets = self._get_offsets(num_nodes, num_edges) + + return PackedGraph(edge_list, num_nodes=num_nodes, num_edges=num_edges, offsets=offsets, + node_feature=node_feature) + + def undirected(self, add_inverse=False): + """ + Flip all the edges to create undirected graphs. + + For knowledge graphs, the flipped edges can either have the original relation or an inverse relation. + The inverse relation for relation :math:`r` is defined as :math:`|R| + r`. + + Parameters: + add_inverse (bool, optional): whether to use inverse relations for flipped edges + """ + edge_list = self.edge_list.clone() + edge_list[:, :2] = edge_list[:, :2].flip(1) + num_relation = self.num_relation + if num_relation and add_inverse: + edge_list[:, 2] += num_relation + num_relation = num_relation * 2 + edge_list = torch.stack([self.edge_list, edge_list], dim=1).flatten(0, 1) + offsets = self._offsets.unsqueeze(-1).expand(-1, 2).flatten() + + index = torch.arange(self.num_edge, device=self.device).unsqueeze(-1).expand(-1, 2).flatten() + data_dict, meta_dict = self.data_mask(edge_index=index, exclude="edge reference") + + return type(self)(edge_list, edge_weight=self.edge_weight[index], num_nodes=self.num_nodes, + num_edges=self.num_edges * 2, num_relation=num_relation, offsets=offsets, + meta_dict=meta_dict, **data_dict) + + def detach(self): + """ + Detach this packed graph. + """ + return type(self)(self.edge_list.detach(), edge_weight=self.edge_weight.detach(), + num_nodes=self.num_nodes, num_edges=self.num_edges, num_relation=self.num_relation, + offsets=self._offsets, meta_dict=self.meta_dict, **utils.detach(self.data_dict)) + + def clone(self): + """ + Clone this packed graph. + """ + return type(self)(self.edge_list.clone(), edge_weight=self.edge_weight.clone(), + num_nodes=self.num_nodes, num_edges=self.num_edges, num_relation=self.num_relation, + offsets=self._offsets, meta_dict=self.meta_dict, **utils.clone(self.data_dict)) + + def cuda(self, *args, **kwargs): + """ + Return a copy of this packed graph in CUDA memory. + + This is a non-op if the graph is already on the correct device. + """ + edge_list = self.edge_list.cuda(*args, **kwargs) + + if edge_list is self.edge_list: + return self + else: + return type(self)(edge_list, edge_weight=self.edge_weight, + num_nodes=self.num_nodes, num_edges=self.num_edges, num_relation=self.num_relation, + offsets=self._offsets, meta_dict=self.meta_dict, + **utils.cuda(self.data_dict, *args, **kwargs)) + + def cpu(self): + """ + Return a copy of this packed graph in CPU memory. + + This is a non-op if the graph is already in CPU memory. + """ + edge_list = self.edge_list.cpu() + + if edge_list is self.edge_list: + return self + else: + return type(self)(edge_list, edge_weight=self.edge_weight, + num_nodes=self.num_nodes, num_edges=self.num_edges, num_relation=self.num_relation, + offsets=self._offsets, meta_dict=self.meta_dict, **utils.cpu(self.data_dict)) + + def __repr__(self): + fields = ["batch_size=%d" % self.batch_size, + "num_nodes=%s" % pretty.long_array(self.num_nodes.tolist()), + "num_edges=%s" % pretty.long_array(self.num_edges.tolist())] + if self.num_relation is not None: + fields.append("num_relation=%d" % self.num_relation) + if self.device.type != "cpu": + fields.append("device='%s'" % self.device) + return "%s(%s)" % (self.__class__.__name__, ", ".join(fields)) + + def visualize(self, titles=None, save_file=None, figure_size=(3, 3), layout="spring", num_row=None, num_col=None): + """ + Visualize the packed graphs with matplotlib. + + Parameters: + titles (list of str, optional): title for each graph. Default is the ID of each graph. + save_file (str, optional): ``png`` or ``pdf`` file to save visualization. + If not provided, show the figure in window. + figure_size (tuple of int, optional): width and height of the figure + layout (str, optional): graph layout + num_row (int, optional): number of rows in the figure + num_col (int, optional): number of columns in the figure + + See also: + `NetworkX graph layout`_ + + .. _NetworkX graph layout: + https://networkx.github.io/documentation/stable/reference/drawing.html#module-networkx.drawing.layout + """ + if titles is None: + graph = self.get_item(0) + titles = ["%s %d" % (type(graph).__name__, i) for i in range(self.batch_size)] + if num_col is None: + if num_row is None: + num_col = math.ceil(self.batch_size ** 0.5) + else: + num_col = math.ceil(self.batch_size / num_row) + if num_row is None: + num_row = math.ceil(self.batch_size / num_col) + + figure_size = (num_col * figure_size[0], num_row * figure_size[1]) + fig = plt.figure(figsize=figure_size) + + for i in range(self.batch_size): + graph = self.get_item(i) + ax = fig.add_subplot(num_row, num_col, i + 1) + graph.visualize(title=titles[i], ax=ax, layout=layout) + # remove the space of axis labels + fig.tight_layout() + + if save_file: + fig.savefig(save_file) + else: + fig.show() + + +Graph.packed_type = PackedGraph + + +def cat(graphs): + for i, graph in enumerate(graphs): + if not isinstance(graph, PackedGraph): + graphs[i] = graph.pack([graph]) + + edge_list = torch.cat([graph.edge_list for graph in graphs]) + pack_num_nodes = torch.stack([graph.num_node for graph in graphs]) + pack_num_edges = torch.stack([graph.num_edge for graph in graphs]) + pack_num_cum_edges = pack_num_edges.cumsum(0) + graph_index = pack_num_cum_edges < len(edge_list) + pack_offsets = scatter_add(pack_num_nodes[graph_index], pack_num_cum_edges[graph_index], + dim_size=len(edge_list)) + pack_offsets = pack_offsets.cumsum(0) + + edge_list[:, :2] += pack_offsets.unsqueeze(-1) + offsets = torch.cat([graph._offsets for graph in graphs]) + pack_offsets + + edge_weight = torch.cat([graph.edge_weight for graph in graphs]) + num_nodes = torch.cat([graph.num_nodes for graph in graphs]) + num_edges = torch.cat([graph.num_edges for graph in graphs]) + num_relation = graphs[0].num_relation + assert all(graph.num_relation == num_relation for graph in graphs) + + # only keep attributes that exist in all graphs + # TODO: this interface is not safe. re-design the interface + keys = set(graphs[0].meta_dict.keys()) + for graph in graphs: + keys = keys.intersection(graph.meta_dict.keys()) + + meta_dict = {k: graphs[0].meta_dict[k] for k in keys} + data_dict = {} + for k in keys: + data_dict[k] = torch.cat([graph.data_dict[k] for graph in graphs]) + + return type(graphs[0])(edge_list, edge_weight=edge_weight, + num_nodes=num_nodes, num_edges=num_edges, num_relation=num_relation, offsets=offsets, + meta_dict=meta_dict, **data_dict) \ No newline at end of file diff --git a/build/lib/torchdrug/data/molecule.py b/build/lib/torchdrug/data/molecule.py new file mode 100644 index 00000000..edf5406f --- /dev/null +++ b/build/lib/torchdrug/data/molecule.py @@ -0,0 +1,1034 @@ +import math +import warnings +from copy import copy +from collections.abc import Sequence + +from matplotlib import pyplot as plt +from rdkit import Chem +from rdkit.Chem.Scaffolds import MurckoScaffold +import torch +from torch_scatter import scatter_add, scatter_min + +from torchdrug import utils +from torchdrug.data import constant, Graph, PackedGraph +from torchdrug.core import Registry as R +from torchdrug.data.rdkit import draw +from torchdrug.utils import pretty + +plt.switch_backend("agg") + + +class Molecule(Graph): + """ + Molecules with predefined chemical features. + + By nature, molecules are undirected graphs. Each bond is stored as two directed edges in this class. + + .. warning:: + + This class doesn't enforce any order on edges. + + Parameters: + edge_list (array_like, optional): list of edges of shape :math:`(|E|, 3)`. + Each tuple is (node_in, node_out, bond_type). + atom_type (array_like, optional): atom types of shape :math:`(|V|,)` + bond_type (array_like, optional): bond types of shape :math:`(|E|,)` + formal_charge (array_like, optional): formal charges of shape :math:`(|V|,)` + explicit_hs (array_like, optional): number of explicit hydrogens of shape :math:`(|V|,)` + chiral_tag (array_like, optional): chirality tags of shape :math:`(|V|,)` + radical_electrons (array_like, optional): number of radical electrons of shape :math:`(|V|,)` + atom_map (array_likeb optional): atom mappings of shape :math:`(|V|,)` + bond_stereo (array_like, optional): bond stereochem of shape :math:`(|E|,)` + stereo_atoms (array_like, optional): ids of stereo atoms of shape :math:`(|E|,)` + """ + + bond2id = {"SINGLE": 0, "DOUBLE": 1, "TRIPLE": 2, "AROMATIC": 3} + atom2valence = {1: 1, 5: 3, 6: 4, 7: 3, 8: 2, 9: 1, 14: 4, 15: 5, 16: 6, 17: 1, 35: 1, 53: 7} + bond2valence = [1, 2, 3, 1.5] + id2bond = {v: k for k, v in bond2id.items()} + empty_mol = Chem.MolFromSmiles("") + dummy_mol = Chem.MolFromSmiles("CC") + + def __init__(self, edge_list=None, atom_type=None, bond_type=None, atom_feature=None, bond_feature=None, + mol_feature=None, formal_charge=None, explicit_hs=None, chiral_tag=None, radical_electrons=None, + atom_map=None, bond_stereo=None, stereo_atoms=None, node_position=None, **kwargs): + if "num_relation" not in kwargs: + kwargs["num_relation"] = len(self.bond2id) + super(Molecule, self).__init__(edge_list=edge_list, **kwargs) + atom_type, bond_type = self._standarize_atom_bond(atom_type, bond_type) + + formal_charge = self._standarize_attribute(formal_charge, self.num_node) + explicit_hs = self._standarize_attribute(explicit_hs, self.num_node) + chiral_tag = self._standarize_attribute(chiral_tag, self.num_node) + radical_electrons = self._standarize_attribute(radical_electrons, self.num_node) + atom_map = self._standarize_attribute(atom_map, self.num_node) + bond_stereo = self._standarize_attribute(bond_stereo, self.num_edge) + stereo_atoms = self._standarize_attribute(stereo_atoms, (self.num_edge, 2)) + if node_position is not None: + node_position = torch.as_tensor(node_position, dtype=torch.float, device=self.device) + + with self.atom(): + if atom_feature is not None: + self.atom_feature = torch.as_tensor(atom_feature, device=self.device) + self.atom_type = atom_type + self.formal_charge = formal_charge + self.explicit_hs = explicit_hs + self.chiral_tag = chiral_tag + self.radical_electrons = radical_electrons + self.atom_map = atom_map + if node_position is not None: + self.node_position = node_position + + with self.bond(): + if bond_feature is not None: + self.bond_feature = torch.as_tensor(bond_feature, device=self.device) + self.bond_type = bond_type + self.bond_stereo = bond_stereo + self.stereo_atoms = stereo_atoms + + with self.mol(): + if mol_feature is not None: + self.mol_feature = torch.as_tensor(mol_feature, device=self.device) + + def _standarize_atom_bond(self, atom_type, bond_type): + if atom_type is None: + raise ValueError("`atom_type` should be provided") + if bond_type is None: + raise ValueError("`bond_type` should be provided") + + atom_type = torch.as_tensor(atom_type, dtype=torch.long, device=self.device) + bond_type = torch.as_tensor(bond_type, dtype=torch.long, device=self.device) + return atom_type, bond_type + + def _standarize_attribute(self, attribute, size, dtype=torch.long, default=0): + if attribute is not None: + attribute = torch.as_tensor(attribute, dtype=dtype, device=self.device) + else: + if isinstance(size, torch.Tensor): + size = size.tolist() + if not isinstance(size, Sequence): + size = [size] + attribute = torch.full(size, default, dtype=dtype, device=self.device) + return attribute + + @classmethod + def _standarize_option(cls, option): + if option is None: + option = [] + elif isinstance(option, str): + option = [option] + return option + + def _check_no_stereo(self): + if (self.bond_stereo > 0).any(): + warnings.warn("Try to apply masks on molecules with stereo bonds. This may produce invalid molecules. " + "To discard stereo information, call `mol.bond_stereo[:] = 0` before applying masks.") + + def _maybe_num_node(self, edge_list): + if len(edge_list): + return edge_list[:, :2].max().item() + 1 + else: + return 0 + + @classmethod + @utils.deprecated_alias(node_feature="atom_feature", edge_feature="bond_feature", graph_feature="mol_feature") + def from_molecule(cls, mol, atom_feature="default", bond_feature="default", mol_feature=None, + with_hydrogen=False, kekulize=False): + """ + Create a molecule from an RDKit object. + + Parameters: + mol (rdchem.Mol): molecule + atom_feature (str or list of str, optional): atom features to extract + bond_feature (str or list of str, optional): bond features to extract + mol_feature (str or list of str, optional): molecule features to extract + with_hydrogen (bool, optional): store hydrogens in the molecule graph. + By default, hydrogens are dropped + kekulize (bool, optional): convert aromatic bonds to single/double bonds. + Note this only affects the relation in ``edge_list``. + For ``bond_type``, aromatic bonds are always stored explicitly. + By default, aromatic bonds are stored. + """ + if mol is None: + mol = cls.empty_mol + # some RDKit operations are in-place + # copy the object to avoid undesired behavior in the caller + mol = copy(mol) + if with_hydrogen: + mol = Chem.AddHs(mol) + if kekulize: + Chem.Kekulize(mol) + + atom_feature = cls._standarize_option(atom_feature) + bond_feature = cls._standarize_option(bond_feature) + mol_feature = cls._standarize_option(mol_feature) + + atom_type = [] + formal_charge = [] + explicit_hs = [] + chiral_tag = [] + radical_electrons = [] + atom_map = [] + _atom_feature = [] + dummy_atom = copy(cls.dummy_mol).GetAtomWithIdx(0) + atoms = [mol.GetAtomWithIdx(i) for i in range(mol.GetNumAtoms())] + [dummy_atom] + if mol.GetNumConformers() > 0: + node_position = torch.tensor(mol.GetConformer().GetPositions()) + else: + node_position = None + for atom in atoms: + atom_type.append(atom.GetAtomicNum()) + formal_charge.append(atom.GetFormalCharge()) + explicit_hs.append(atom.GetNumExplicitHs()) + chiral_tag.append(atom.GetChiralTag()) + radical_electrons.append(atom.GetNumRadicalElectrons()) + atom_map.append(atom.GetAtomMapNum()) + feature = [] + for name in atom_feature: + func = R.get("features.atom.%s" % name) + feature += func(atom) + _atom_feature.append(feature) + atom_type = torch.tensor(atom_type)[:-1] + atom_map = torch.tensor(atom_map)[:-1] + formal_charge = torch.tensor(formal_charge)[:-1] + explicit_hs = torch.tensor(explicit_hs)[:-1] + chiral_tag = torch.tensor(chiral_tag)[:-1] + radical_electrons = torch.tensor(radical_electrons)[:-1] + if len(atom_feature) > 0: + _atom_feature = torch.tensor(_atom_feature)[:-1] + else: + _atom_feature = None + + edge_list = [] + bond_type = [] + bond_stereo = [] + stereo_atoms = [] + _bond_feature = [] + dummy_bond = copy(cls.dummy_mol).GetBondWithIdx(0) + bonds = [mol.GetBondWithIdx(i) for i in range(mol.GetNumBonds())] + [dummy_bond] + for bond in bonds: + type = str(bond.GetBondType()) + stereo = bond.GetStereo() + if stereo: + _atoms = [a for a in bond.GetStereoAtoms()] + else: + _atoms = [0, 0] + if type not in cls.bond2id: + continue + type = cls.bond2id[type] + h, t = bond.GetBeginAtomIdx(), bond.GetEndAtomIdx() + edge_list += [[h, t, type], [t, h, type]] + # always explicitly store aromatic bonds, no matter kekulize or not + if bond.GetIsAromatic(): + type = cls.bond2id["AROMATIC"] + bond_type += [type, type] + bond_stereo += [stereo, stereo] + stereo_atoms += [_atoms, _atoms] + feature = [] + for name in bond_feature: + func = R.get("features.bond.%s" % name) + feature += func(bond) + _bond_feature += [feature, feature] + edge_list = edge_list[:-2] + bond_type = torch.tensor(bond_type)[:-2] + bond_stereo = torch.tensor(bond_stereo)[:-2] + stereo_atoms = torch.tensor(stereo_atoms)[:-2] + if len(bond_feature) > 0: + _bond_feature = torch.tensor(_bond_feature)[:-2] + else: + _bond_feature = None + + _mol_feature = [] + for name in mol_feature: + func = R.get("features.molecule.%s" % name) + _mol_feature += func(mol) + if len(mol_feature) > 0: + _mol_feature = torch.tensor(_mol_feature) + else: + _mol_feature = None + + num_relation = len(cls.bond2id) - 1 if kekulize else len(cls.bond2id) + return cls(edge_list, atom_type, bond_type, + formal_charge=formal_charge, explicit_hs=explicit_hs, + chiral_tag=chiral_tag, radical_electrons=radical_electrons, atom_map=atom_map, + bond_stereo=bond_stereo, stereo_atoms=stereo_atoms, node_position=node_position, + atom_feature=_atom_feature, bond_feature=_bond_feature, mol_feature=_mol_feature, + num_node=mol.GetNumAtoms(), num_relation=num_relation) + + @classmethod + @utils.deprecated_alias(node_feature="atom_feature", edge_feature="bond_feature", graph_feature="mol_feature") + def from_smiles(cls, smiles, atom_feature="default", bond_feature="default", mol_feature=None, + with_hydrogen=False, kekulize=False): + """ + Create a molecule from a SMILES string. + + Parameters: + smiles (str): SMILES string + atom_feature (str or list of str, optional): atom features to extract + bond_feature (str or list of str, optional): bond features to extract + mol_feature (str or list of str, optional): molecule features to extract + with_hydrogen (bool, optional): store hydrogens in the molecule graph. + By default, hydrogens are dropped + kekulize (bool, optional): convert aromatic bonds to single/double bonds. + Note this only affects the relation in ``edge_list``. + For ``bond_type``, aromatic bonds are always stored explicitly. + By default, aromatic bonds are stored. + """ + mol = Chem.MolFromSmiles(smiles) + if mol is None: + raise ValueError("Invalid SMILES `%s`" % smiles) + + return cls.from_molecule(mol, atom_feature, bond_feature, mol_feature, with_hydrogen, kekulize) + + def to_smiles(self, isomeric=True, atom_map=True, canonical=False): + """ + Return a SMILES string of this molecule. + + Parameters: + isomeric (bool, optional): keep isomeric information or not + atom_map (bool, optional): keep atom mapping or not + canonical (bool, optional): if true, return the canonical form of smiles + + Returns: + str + """ + mol = self.to_molecule() + if not atom_map: + for atom in mol.GetAtoms(): + atom.SetAtomMapNum(0) + smiles = Chem.MolToSmiles(mol, isomericSmiles=isomeric) + if canonical: + smiles_set = set() + while smiles not in smiles_set: + smiles_set.add(smiles) + mol = Chem.MolFromSmiles(smiles) + smiles = Chem.MolToSmiles(mol, isomericSmiles=isomeric) + return smiles + + def to_molecule(self, ignore_error=False): + """ + Return an RDKit object of this molecule. + + Parameters: + ignore_error (bool, optional): if true, return ``None`` for illegal molecules. + Otherwise, raise an exception. + + Returns: + rdchem.Mol + """ + mol = Chem.RWMol() + + atom_type = self.atom_type.tolist() + bond_type = self.bond_type.tolist() + formal_charge = self.formal_charge.tolist() + explicit_hs = self.explicit_hs.tolist() + chiral_tag = self.chiral_tag.tolist() + radical_electrons = self.radical_electrons.tolist() + atom_map = self.atom_map.tolist() + bond_stereo = self.bond_stereo.tolist() + stereo_atoms = self.stereo_atoms.tolist() + if hasattr(self, "node_position"): + node_position = self.node_position.tolist() + conformer = Chem.Conformer() + else: + conformer = None + for i in range(self.num_node): + atom = Chem.Atom(atom_type[i]) + atom.SetFormalCharge(formal_charge[i]) + atom.SetNumExplicitHs(explicit_hs[i]) + atom.SetChiralTag(Chem.ChiralType(chiral_tag[i])) + atom.SetNumRadicalElectrons(radical_electrons[i]) + atom.SetNoImplicit(explicit_hs[i] > 0 or radical_electrons[i] > 0) + atom.SetAtomMapNum(atom_map[i]) + if conformer: + conformer.SetAtomPosition(i, node_position[i]) + mol.AddAtom(atom) + if conformer: + mol.AddConformer(conformer) + + edge_list = self.edge_list.tolist() + for i in range(self.num_edge): + h, t, type = edge_list[i] + if h < t: + j = mol.AddBond(h, t, Chem.BondType.names[self.id2bond[type]]) + bond = mol.GetBondWithIdx(j - 1) + bond.SetIsAromatic(bond_type[i] == self.bond2id["AROMATIC"]) + bond.SetStereo(Chem.BondStereo(bond_stereo[i])) + j = 0 + for i in range(self.num_edge): + h, t, type = edge_list[i] + if h < t: + if bond_stereo[i]: + bond = mol.GetBondWithIdx(j) + bond.SetStereoAtoms(*stereo_atoms[i]) + j += 1 + + if ignore_error: + try: + with utils.no_rdkit_log(): + mol.UpdatePropertyCache() + Chem.AssignStereochemistry(mol) + mol.ClearComputedProps() + mol.UpdatePropertyCache() + except: + mol = None + else: + mol.UpdatePropertyCache() + Chem.AssignStereochemistry(mol) + mol.ClearComputedProps() + mol.UpdatePropertyCache() + + return mol + + def ion_to_molecule(self): + """ + Convert ions to molecules by adjusting hydrogens and electrons. + + Note [N+] will not be converted. + """ + data_dict = self.data_dict + + formal_charge = data_dict.pop("formal_charge") + explicit_hs = data_dict.pop("explicit_hs") + radical_electrons = data_dict.pop("radical_electrons") + pos_nitrogen = (self.atom_type == 7) & (self.explicit_valence > 3) + formal_charge = pos_nitrogen.long() + explicit_hs = torch.zeros_like(explicit_hs) + radical_electrons = torch.zeros_like(radical_electrons) + + return type(self)(self.edge_list, edge_weight=self.edge_weight, + num_node=self.num_node, num_relation=self.num_relation, + formal_charge=formal_charge, explicit_hs=explicit_hs, radical_electrons=radical_electrons, + meta_dict=self.meta_dict, **data_dict) + + def to_scaffold(self, chirality=False): + """ + Return a scaffold SMILES string of this molecule. + + Parameters: + chirality (bool, optional): consider chirality in the scaffold or not + + Returns: + str + """ + smiles = self.to_smiles() + scaffold = MurckoScaffold.MurckoScaffoldSmiles(smiles, includeChirality=chirality) + return scaffold + + def node_mask(self, index, compact=False): + self._check_no_stereo() + return super(Molecule, self).node_mask(index, compact) + + def edge_mask(self, index): + self._check_no_stereo() + return super(Molecule, self).edge_mask(index) + + def undirected(self, add_inverse=False): + if add_inverse: + raise ValueError("Bonds are undirected relations, but `add_inverse` is specified") + return super(Molecule, self).undirected(add_inverse) + + def atom(self): + """ + Context manager for atom attributes. + """ + return self.node() + + def bond(self): + """ + Context manager for bond attributes. + """ + return self.edge() + + def mol(self): + """ + Context manager for molecule attributes. + """ + return self.graph() + + def atom_reference(self): + """ + Context manager for atom references. + """ + return self.node_reference() + + def bond_reference(self): + """ + Context manager for bond references. + """ + return self.edge_reference() + + def mol_reference(self): + """ + Context mangaer for molecule references. + """ + return self.graph_reference() + + @property + def num_node(self): + return self.num_atom + + @num_node.setter + def num_node(self, value): + self.num_atom = value + + @property + def num_edge(self): + return self.num_bond + + @num_edge.setter + def num_edge(self, value): + self.num_bond = value + + atom2graph = Graph.node2graph + bond2graph = Graph.edge2graph + + @property + def node_feature(self): + return self.atom_feature + + @node_feature.setter + def node_feature(self, value): + self.atom_feature = value + + @property + def edge_feature(self): + return self.bond_feature + + @edge_feature.setter + def edge_feature(self, value): + self.bond_feature = value + + @property + def graph_feature(self): + return self.mol_feature + + @graph_feature.setter + def graph_feature(self, value): + self.mol_feature = value + + @utils.cached_property + def explicit_valence(self): + bond2valence = torch.tensor(self.bond2valence, device=self.device) + explicit_valence = scatter_add(bond2valence[self.edge_list[:, 2]], self.edge_list[:, 0], dim_size=self.num_node) + return explicit_valence.round().long() + + @utils.cached_property + def is_valid(self): + """A coarse implementation of valence check.""" + # TODO: cross-check by any domain expert + atom2valence = torch.tensor(float("nan")).repeat(constant.NUM_ATOM) + for k, v in self.atom2valence: + atom2valence[k] = v + atom2valence = torch.as_tensor(atom2valence, device=self.device) + + max_atom_valence = atom2valence[self.atom_type] + # special case for nitrogen + pos_nitrogen = (self.atom_type == 7) & (self.formal_charge == 1) + max_atom_valence[pos_nitrogen] = 4 + if torch.isnan(max_atom_valence).any(): + index = torch.isnan(max_atom_valence).nonzero()[0] + raise ValueError("Fail to check valence. Unknown atom type %d" % self.atom_type[index]) + + is_valid = (self.explicit_valence <= max_atom_valence).all() + return is_valid + + @utils.cached_property + def is_valid_rdkit(self): + try: + with utils.no_rdkit_log(): + mol = self.to_molecule() + Chem.SanitizeMol(mol, sanitizeOps=Chem.SanitizeFlags.SANITIZE_PROPERTIES) + is_valid = torch.ones(1, dtype=torch.bool, device=self.device) + except ValueError: + is_valid = torch.zeros(1, dtype=torch.bool, device=self.device) + return is_valid + + def __repr__(self): + fields = ["num_atom=%d" % self.num_atom, "num_bond=%d" % self.num_bond] + if self.device.type != "cpu": + fields.append("device='%s'" % self.device) + return "%s(%s)" % (self.__class__.__name__, ", ".join(fields)) + + def visualize(self, title=None, save_file=None, figure_size=(3, 3), ax=None, atom_map=False): + """ + Visualize this molecule with matplotlib. + + Parameters: + title (str, optional): title for this molecule + save_file (str, optional): ``png`` or ``pdf`` file to save visualization. + If not provided, show the figure in window. + figure_size (tuple of int, optional): width and height of the figure + ax (matplotlib.axes.Axes, optional): axis to plot the figure + atom_map (bool, optional): visualize atom mapping or not + """ + is_root = ax is None + if ax is None: + fig = plt.figure(figsize=figure_size) + if title is not None: + ax = plt.gca() + else: + ax = fig.add_axes([0, 0, 1, 1]) + if title is not None: + ax.set_title(title) + + mol = self.to_molecule() + if not atom_map: + for atom in mol.GetAtoms(): + atom.SetAtomMapNum(0) + draw.MolToMPL(mol, ax=ax) + ax.set_frame_on(False) + + if is_root: + if save_file: + fig.savefig(save_file) + else: + fig.show() + + def __eq__(self, other): + smiles = self.to_smiles(isomeric=False, atom_map=False, canonical=True) + other_smiles = other.to_smiles(isomeric=False, atom_map=False, canonical=True) + return smiles == other_smiles + + +class PackedMolecule(PackedGraph, Molecule): + """ + Container for molecules with variadic sizes. + + .. warning:: + + Edges of the same molecule are guaranteed to be consecutive in the edge list. + However, this class doesn't enforce any order on the edges. + + Parameters: + edge_list (array_like, optional): list of edges of shape :math:`(|E|, 3)`. + Each tuple is (node_in, node_out, bond_type). + atom_type (array_like, optional): atom types of shape :math:`(|V|,)` + bond_type (array_like, optional): bond types of shape :math:`(|E|,)` + num_nodes (array_like, optional): number of nodes in each graph + By default, it will be inferred from the largest id in `edge_list` + num_edges (array_like, optional): number of edges in each graph + offsets (array_like, optional): node id offsets of shape :math:`(|E|,)`. + If not provided, nodes in `edge_list` should be relative index, i.e., the index in each graph. + If provided, nodes in `edge_list` should be absolute index, i.e., the index in the packed graph. + """ + + unpacked_type = Molecule + atom2graph = PackedGraph.node2graph + bond2graph = PackedGraph.edge2graph + + def __init__(self, edge_list=None, atom_type=None, bond_type=None, num_nodes=None, num_edges=None, offsets=None, + **kwargs): + if "num_relation" not in kwargs: + kwargs["num_relation"] = len(self.bond2id) + super(PackedMolecule, self).__init__(edge_list=edge_list, num_nodes=num_nodes, num_edges=num_edges, + offsets=offsets, atom_type=atom_type, bond_type=bond_type, **kwargs) + + def ion_to_molecule(self): + """ + Convert ions to molecules by adjusting hydrogens and electrons. + + Note [N+] will not be converted. + """ + data_dict = self.data_dict + + formal_charge = data_dict.pop("formal_charge") + explicit_hs = data_dict.pop("explicit_hs") + radical_electrons = data_dict.pop("radical_electrons") + pos_nitrogen = (self.atom_type == 7) & (self.explicit_valence > 3) + formal_charge = pos_nitrogen.long() + explicit_hs = torch.zeros_like(explicit_hs) + radical_electrons = torch.zeros_like(radical_electrons) + + return type(self)(self.edge_list, edge_weight=self.edge_weight, + num_nodes=self.num_nodes, num_edges=self.num_edges, num_relation=self.num_relation, + offsets=self._offsets, formal_charge=formal_charge, explicit_hs=explicit_hs, + radical_electrons=radical_electrons, meta_dict=self.meta_dict, **data_dict) + + @utils.cached_property + def is_valid(self): + """A coarse implementation of valence check.""" + # TODO: cross-check by any domain expert + atom2valence = torch.tensor(float("nan")).repeat(constant.NUM_ATOM) + for k, v in self.atom2valence.items(): + atom2valence[k] = v + atom2valence = torch.as_tensor(atom2valence, device=self.device) + + max_atom_valence = atom2valence[self.atom_type] + # special case for nitrogen + pos_nitrogen = (self.atom_type == 7) & (self.formal_charge == 1) + max_atom_valence[pos_nitrogen] = 4 + if torch.isnan(max_atom_valence).any(): + index = torch.isnan(max_atom_valence).nonzero()[0] + raise ValueError("Fail to check valence. Unknown atom type %d" % self.atom_type[index]) + + is_valid = self.explicit_valence <= max_atom_valence + is_valid = scatter_min(is_valid.long(), self.node2graph, dim_size=self.batch_size)[0].bool() + return is_valid + + @utils.cached_property + def is_valid_rdkit(self): + return torch.cat([mol.is_valid_rdkit for mol in self]) + + @classmethod + @utils.deprecated_alias(node_feature="atom_feature", edge_feature="bond_feature", graph_feature="mol_feature") + def from_molecule(cls, mols, atom_feature="default", bond_feature="default", mol_feature=None, + with_hydrogen=False, kekulize=False): + """ + Create a packed molecule from a list of RDKit objects. + + Parameters: + mols (list of rdchem.Mol): molecules + atom_feature (str or list of str, optional): atom features to extract + bond_feature (str or list of str, optional): bond features to extract + mol_feature (str or list of str, optional): molecule features to extract + with_hydrogen (bool, optional): store hydrogens in the molecule graph. + By default, hydrogens are dropped + kekulize (bool, optional): convert aromatic bonds to single/double bonds. + Note this only affects the relation in ``edge_list``. + For ``bond_type``, aromatic bonds are always stored explicitly. + By default, aromatic bonds are stored. + """ + atom_feature = cls._standarize_option(atom_feature) + bond_feature = cls._standarize_option(bond_feature) + mol_feature = cls._standarize_option(mol_feature) + + atom_type = [] + formal_charge = [] + explicit_hs = [] + chiral_tag = [] + radical_electrons = [] + atom_map = [] + + edge_list = [] + bond_type = [] + bond_stereo = [] + stereo_atoms = [] + node_position = [] + + _atom_feature = [] + _bond_feature = [] + _mol_feature = [] + num_nodes = [] + num_edges = [] + + mols = mols + [cls.dummy_mol] + for mol in mols: + if mol is None: + mol = cls.empty_mol + # some RDKit operations are in-place + # copy the object to avoid undesired behavior in the caller + mol = copy(mol) + if with_hydrogen: + mol = Chem.AddHs(mol) + if kekulize: + Chem.Kekulize(mol) + + if mol.GetNumConformers() > 0: + node_position += mol.GetConformer().GetPositions().tolist() + for atom in mol.GetAtoms(): + atom_type.append(atom.GetAtomicNum()) + formal_charge.append(atom.GetFormalCharge()) + explicit_hs.append(atom.GetNumExplicitHs()) + chiral_tag.append(atom.GetChiralTag()) + radical_electrons.append(atom.GetNumRadicalElectrons()) + atom_map.append(atom.GetAtomMapNum()) + feature = [] + for name in atom_feature: + func = R.get("features.atom.%s" % name) + feature += func(atom) + _atom_feature.append(feature) + + for bond in mol.GetBonds(): + type = str(bond.GetBondType()) + stereo = bond.GetStereo() + if stereo: + _atoms = list(bond.GetStereoAtoms()) + else: + _atoms = [0, 0] + if type not in cls.bond2id: + continue + type = cls.bond2id[type] + h, t = bond.GetBeginAtomIdx(), bond.GetEndAtomIdx() + feature = [] + for name in bond_feature: + func = R.get("features.bond.%s" % name) + feature += func(bond) + edge_list += [[h, t, type], [t, h, type]] + # always explicitly store aromatic bonds + if bond.GetIsAromatic(): + type = cls.bond2id["AROMATIC"] + bond_type += [type, type] + bond_stereo += [stereo, stereo] + stereo_atoms += [_atoms, _atoms] + _bond_feature += [feature, feature] + + feature = [] + for name in mol_feature: + func = R.get("features.molecule.%s" % name) + feature += func(mol) + _mol_feature.append(feature) + + num_nodes.append(mol.GetNumAtoms()) + num_edges.append(mol.GetNumBonds() * 2) + + atom_type = torch.tensor(atom_type)[:-2] + atom_map = torch.tensor(atom_map)[:-2] + formal_charge = torch.tensor(formal_charge)[:-2] + explicit_hs = torch.tensor(explicit_hs)[:-2] + chiral_tag = torch.tensor(chiral_tag)[:-2] + radical_electrons = torch.tensor(radical_electrons)[:-2] + if len(node_position) > 0: + node_position = torch.tensor(node_position) + else: + node_position = None + if len(atom_feature) > 0: + _atom_feature = torch.tensor(_atom_feature)[:-2] + else: + _atom_feature = None + + num_nodes = num_nodes[:-1] + num_edges = num_edges[:-1] + edge_list = torch.tensor(edge_list)[:-2] + bond_type = torch.tensor(bond_type)[:-2] + bond_stereo = torch.tensor(bond_stereo)[:-2] + stereo_atoms = torch.tensor(stereo_atoms)[:-2] + if len(bond_feature) > 0: + _bond_feature = torch.tensor(_bond_feature)[:-2] + else: + _bond_feature = None + if len(mol_feature) > 0: + _mol_feature = torch.tensor(_mol_feature)[:-1] + else: + _mol_feature = None + + num_relation = len(cls.bond2id) - 1 if kekulize else len(cls.bond2id) + return cls(edge_list, atom_type, bond_type, + formal_charge=formal_charge, explicit_hs=explicit_hs, + chiral_tag=chiral_tag, radical_electrons=radical_electrons, atom_map=atom_map, + bond_stereo=bond_stereo, stereo_atoms=stereo_atoms, node_position=node_position, + atom_feature=_atom_feature, bond_feature=_bond_feature, mol_feature=_mol_feature, + num_nodes=num_nodes, num_edges=num_edges, num_relation=num_relation) + + @classmethod + @utils.deprecated_alias(node_feature="atom_feature", edge_feature="bond_feature", graph_feature="mol_feature") + def from_smiles(cls, smiles_list, atom_feature="default", bond_feature="default", mol_feature=None, + with_hydrogen=False, kekulize=False): + """ + Create a packed molecule from a list of SMILES strings. + + Parameters: + smiles_list (str): list of SMILES strings + atom_feature (str or list of str, optional): atom features to extract + bond_feature (str or list of str, optional): bond features to extract + mol_feature (str or list of str, optional): molecule features to extract + with_hydrogen (bool, optional): store hydrogens in the molecule graph. + By default, hydrogens are dropped + kekulize (bool, optional): convert aromatic bonds to single/double bonds. + Note this only affects the relation in ``edge_list``. + For ``bond_type``, aromatic bonds are always stored explicitly. + By default, aromatic bonds are stored. + """ + mols = [] + for smiles in smiles_list: + mol = Chem.MolFromSmiles(smiles) + if mol is None: + raise ValueError("Invalid SMILES `%s`" % smiles) + mols.append(mol) + + return cls.from_molecule(mols, atom_feature, bond_feature, mol_feature, with_hydrogen, kekulize) + + def to_smiles(self, isomeric=True, atom_map=True, canonical=False): + """ + Return a list of SMILES strings. + + Parameters: + isomeric (bool, optional): keep isomeric information or not + atom_map (bool, optional): keep atom mapping or not + canonical (bool, optional): if true, return the canonical form of smiles + + Returns: + list of str + """ + mols = self.to_molecule() + smiles_list = [] + for mol in mols: + if not atom_map: + for atom in mol.GetAtoms(): + atom.SetAtomMapNum(0) + smiles = Chem.MolToSmiles(mol, isomericSmiles=isomeric) + if canonical: + smiles_set = set() + while smiles not in smiles_set: + smiles_set.add(smiles) + mol = Chem.MolFromSmiles(smiles) + smiles = Chem.MolToSmiles(mol, isomericSmiles=isomeric) + smiles_list.append(smiles) + return smiles_list + + def to_molecule(self, ignore_error=False): + """ + Return a list of RDKit objects. + + Parameters: + ignore_error (bool, optional): if true, return ``None`` for illegal molecules. + Otherwise, raise an exception. + + Returns: + list of rdchem.Mol + """ + atom_type = self.atom_type.tolist() + bond_type = self.bond_type.tolist() + formal_charge = self.formal_charge.tolist() + explicit_hs = self.explicit_hs.tolist() + chiral_tag = self.chiral_tag.tolist() + radical_electrons = self.radical_electrons.tolist() + atom_map = self.atom_map.tolist() + bond_stereo = self.bond_stereo.tolist() + stereo_atoms = self.stereo_atoms.tolist() + if hasattr(self, "node_position"): + node_position = self.node_position.tolist() + else: + node_position = None + num_cum_nodes = [0] + self.num_cum_nodes.tolist() + num_cum_edges = [0] + self.num_cum_edges.tolist() + edge_list = self.edge_list.clone() + edge_list[:, :2] -= self._offsets.unsqueeze(-1) + edge_list = edge_list.tolist() + + mols = [] + for i in range(self.batch_size): + mol = Chem.RWMol() + if node_position: + conformer = Chem.Conformer() + else: + conformer = None + for j in range(num_cum_nodes[i], num_cum_nodes[i + 1]): + atom = Chem.Atom(atom_type[j]) + atom.SetFormalCharge(formal_charge[j]) + atom.SetNumExplicitHs(explicit_hs[j]) + atom.SetChiralTag(Chem.ChiralType(chiral_tag[j])) + atom.SetNumRadicalElectrons(radical_electrons[j]) + atom.SetNoImplicit(explicit_hs[j] > 0 or radical_electrons[j] > 0) + atom.SetAtomMapNum(atom_map[j]) + if conformer: + conformer.SetAtomPosition(j - num_cum_nodes[i], node_position[j]) + mol.AddAtom(atom) + if conformer: + mol.AddConformer(conformer) + + for j in range(num_cum_edges[i], num_cum_edges[i + 1]): + h, t, type = edge_list[j] + if h < t: + k = mol.AddBond(h, t, Chem.BondType.names[self.id2bond[type]]) + bond = mol.GetBondWithIdx(k - 1) + bond.SetIsAromatic(bond_type[j] == self.bond2id["AROMATIC"]) + bond.SetStereo(Chem.BondStereo(bond_stereo[j])) + k = 0 + for j in range(num_cum_edges[i], num_cum_edges[i + 1]): + h, t, type = edge_list[j] + if h < t: + if bond_stereo[j]: + bond = mol.GetBondWithIdx(k) + # These do not necessarily need to be the highest 'ranking' atoms like CIP stereo requires. + # They can be any arbitrary atoms neighboring the begin and end atoms of this bond respectively. + # STEREOCIS or STEREOTRANS is then set relative to only these atoms. + bond.SetStereoAtoms(*stereo_atoms[j]) + k += 1 + + if ignore_error: + try: + with utils.no_rdkit_log(): + mol.UpdatePropertyCache() + Chem.AssignStereochemistry(mol) + mol.ClearComputedProps() + mol.UpdatePropertyCache() + except: + mol = None + else: + mol.UpdatePropertyCache() + Chem.AssignStereochemistry(mol) + mol.ClearComputedProps() + mol.UpdatePropertyCache() + mols.append(mol) + + return mols + + def node_mask(self, index, compact=False): + self._check_no_stereo() + return super(PackedMolecule, self).node_mask(index, compact) + + def edge_mask(self, index): + self._check_no_stereo() + return super(PackedMolecule, self).edge_mask(index) + + def undirected(self, add_inverse=False): + if add_inverse: + raise ValueError("Bonds are undirected relations, but `add_inverse` is specified") + return super(PackedMolecule, self).undirected(add_inverse) + + @property + def num_nodes(self): + return self.num_atoms + + @num_nodes.setter + def num_nodes(self, value): + self.num_atoms = value + + @property + def num_edges(self): + return self.num_bonds + + @num_edges.setter + def num_edges(self, value): + self.num_bonds = value + + def __repr__(self): + fields = ["batch_size=%d" % self.batch_size, + "num_atoms=%s" % pretty.long_array(self.num_atoms.tolist()), + "num_bonds=%s" % pretty.long_array(self.num_bonds.tolist())] + if self.device.type != "cpu": + fields.append("device='%s'" % self.device) + return "%s(%s)" % (self.__class__.__name__, ", ".join(fields)) + + def visualize(self, titles=None, save_file=None, figure_size=(3, 3), num_row=None, num_col=None, atom_map=False): + """ + Visualize the packed molecules with matplotlib. + + Parameters: + titles (list of str, optional): title for each molecule. Default is the ID of each molecule. + save_file (str, optional): ``png`` or ``pdf`` file to save visualization. + If not provided, show the figure in window. + figure_size (tuple of int, optional): width and height of the figure + num_row (int, optional): number of rows in the figure + num_col (int, optional): number of columns in the figure + atom_map (bool, optional): visualize atom mapping or not + """ + if titles is None: + graph = self.get_item(0) + titles = ["%s %d" % (type(graph).__name__, i) for i in range(self.batch_size)] + if num_col is None: + if num_row is None: + num_col = math.ceil(self.batch_size ** 0.5) + else: + num_col = math.ceil(self.batch_size / num_row) + if num_row is None: + num_row = math.ceil(self.batch_size / num_col) + + figure_size = (num_col * figure_size[0], num_row * figure_size[1]) + fig = plt.figure(figsize=figure_size) + + for i in range(self.batch_size): + graph = self.get_item(i) + ax = fig.add_subplot(num_row, num_col, i + 1) + graph.visualize(title=titles[i], ax=ax, atom_map=atom_map) + # remove the space of axis labels + fig.tight_layout() + + if save_file: + fig.savefig(save_file) + else: + fig.show() + + +Molecule.packed_type = PackedMolecule \ No newline at end of file diff --git a/build/lib/torchdrug/data/protein.py b/build/lib/torchdrug/data/protein.py new file mode 100644 index 00000000..4d9724d4 --- /dev/null +++ b/build/lib/torchdrug/data/protein.py @@ -0,0 +1,1358 @@ +import os +import string +import warnings +from collections import defaultdict + +from rdkit import Chem +import torch +from torch_scatter import scatter_add, scatter_max, scatter_min + +from torchdrug import utils +from torchdrug.data import Molecule, PackedMolecule, Dictionary, feature +from torchdrug.core import Registry as R +from torchdrug.utils import pretty + + +class Protein(Molecule): + """ + Proteins with predefined chemical features. + Support both residue-level and atom-level operations and ensure consistency between two views. + + .. warning:: + + The order of residues must be the same as the protein sequence. + However, this class doesn't enforce any order on nodes or edges. + Nodes may have a different order with residues. + + Parameters: + edge_list (array_like, optional): list of edges of shape :math:`(|E|, 3)`. + Each tuple is (node_in, node_out, bond_type). + atom_type (array_like, optional): atom types of shape :math:`(|V|,)` + bond_type (array_like, optional): bond types of shape :math:`(|E|,)` + residue_type (array_like, optional): residue types of shape :math:`(|V_{res}|,)` + view (str, optional): default view for this protein. Can be ``atom`` or ``residue``. + atom_name (array_like, optional): atom names in a residue of shape :math:`(|V|,)` + atom2residue (array_like, optional): atom id to residue id mapping of shape :math:`(|V|,)` + residue_feature (array_like, optional): residue features of shape :math:`(|V_{res}|, ...)` + is_hetero_atom (array_like, optional): hetero atom indicators of shape :math:`(|V|,)` + occupancy (array_like, optional): occupancy of shape :math:`(|V|,)` + b_factor (array_like, optional): temperature factors of shape :math:`(|V|,)` + residue_number (array_like, optional): residue numbers of shape :math:`(|V_{res}|,)` + insertion_code (array_like, optional): insertion codes of shape :math:`(|V_{res}|,)` + chain_id (array_like, optional): chain ids of shape :math:`(|V_{res}|,)` + """ + + _meta_types = {"node", "edge", "residue", "graph", + "node reference", "edge reference", "residue reference", "graph reference"} + dummy_protein = Chem.MolFromSequence("G") + dummy_atom = dummy_protein.GetAtomWithIdx(0) + + # TODO: rdkit isn't compatible with X in the sequence + residue2id = {"GLY": 0, "ALA": 1, "SER": 2, "PRO": 3, "VAL": 4, "THR": 5, "CYS": 6, "ILE": 7, "LEU": 8, + "ASN": 9, "ASP": 10, "GLN": 11, "LYS": 12, "GLU": 13, "MET": 14, "HIS": 15, "PHE": 16, + "ARG": 17, "TYR": 18, "TRP": 19} + residue_symbol2id = {"G": 0, "A": 1, "S": 2, "P": 3, "V": 4, "T": 5, "C": 6, "I": 7, "L": 8, "N": 9, + "D": 10, "Q": 11, "K": 12, "E": 13, "M": 14, "H": 15, "F": 16, "R": 17, "Y": 18, "W": 19} + atom_name2id = {"C": 0, "CA": 1, "CB": 2, "CD": 3, "CD1": 4, "CD2": 5, "CE": 6, "CE1": 7, "CE2": 8, + "CE3": 9, "CG": 10, "CG1": 11, "CG2": 12, "CH2": 13, "CZ": 14, "CZ2": 15, "CZ3": 16, + "N": 17, "ND1": 18, "ND2": 19, "NE": 20, "NE1": 21, "NE2": 22, "NH1": 23, "NH2": 24, + "NZ": 25, "O": 26, "OD1": 27, "OD2": 28, "OE1": 29, "OE2": 30, "OG": 31, "OG1": 32, + "OH": 33, "OXT": 34, "SD": 35, "SG": 36, "UNK": 37} + alphabet2id = {c: i for i, c in enumerate(" " + string.ascii_uppercase + string.ascii_lowercase + string.digits)} + id2residue = {v: k for k, v in residue2id.items()} + id2residue_symbol = {v: k for k, v in residue_symbol2id.items()} + id2atom_name = {v: k for k, v in atom_name2id.items()} + id2alphabet = {v: k for k, v in alphabet2id.items()} + + def __init__(self, edge_list=None, atom_type=None, bond_type=None, residue_type=None, view=None, + atom_name=None, atom2residue=None, residue_feature=None, is_hetero_atom=None, occupancy=None, + b_factor=None, residue_number=None, insertion_code=None, chain_id=None, **kwargs): + super(Protein, self).__init__(edge_list, atom_type, bond_type, **kwargs) + residue_type, num_residue = self._standarize_num_residue(residue_type) + self.num_residue = num_residue + self.view = self._standarize_view(view) + + atom_name = self._standarize_attribute(atom_name, self.num_node) + atom2residue = self._standarize_attribute(atom2residue, self.num_node) + is_hetero_atom = self._standarize_attribute(is_hetero_atom, self.num_node, dtype=torch.bool) + occupancy = self._standarize_attribute(occupancy, self.num_node, dtype=torch.float, default=1) + b_factor = self._standarize_attribute(b_factor, self.num_node, dtype=torch.float) + residue_number = self._standarize_attribute(residue_number, self.num_residue) + insertion_code = self._standarize_attribute(insertion_code, self.num_residue) + chain_id = self._standarize_attribute(chain_id, self.num_residue) + + with self.atom(): + self.atom_name = atom_name + with self.residue_reference(): + self.atom2residue = atom2residue + self.is_hetero_atom = is_hetero_atom + self.occupancy = occupancy + self.b_factor = b_factor + + with self.residue(): + self.residue_type = residue_type + if residue_feature is not None: + self.residue_feature = torch.as_tensor(residue_feature, device=self.device) + self.residue_number = residue_number + self.insertion_code = insertion_code + self.chain_id = chain_id + + def residue(self): + """ + Context manager for residue attributes. + """ + return self.context("residue") + + def residue_reference(self): + """ + Context manager for residue references. + """ + return self.context("residue reference") + + @property + def node_feature(self): + if getattr(self, "view", "atom") == "atom": + return self.atom_feature + else: + return self.residue_feature + + @node_feature.setter + def node_feature(self, value): + self.atom_feature = value + + @property + def num_node(self): + return self.num_atom + + @num_node.setter + def num_node(self, value): + self.num_atom = value + + def _check_attribute(self, key, value): + super(Protein, self)._check_attribute(key, value) + for type in self._meta_contexts: + if type == "residue": + if len(value) != self.num_residue: + raise ValueError("Expect residue attribute `%s` to have shape (%d, *), but found %s" % + (key, self.num_residue, value.shape)) + elif type == "residue reference": + is_valid = (value >= -1) & (value < self.num_residue) + if not is_valid.all(): + error_value = value[~is_valid] + raise ValueError("Expect residue reference in [-1, %d), but found %d" % + (self.num_residue, error_value[0])) + + def _standarize_num_residue(self, residue_type): + if residue_type is None: + raise ValueError("`residue_type` should be provided") + + residue_type = torch.as_tensor(residue_type, dtype=torch.long, device=self.device) + num_residue = torch.tensor(len(residue_type), device=self.device) + return residue_type, num_residue + + def __setattr__(self, key, value): + if key == "view" and value not in ["atom", "residue"]: + raise ValueError("Expect `view` to be either `atom` or `residue`, but found `%s`" % value) + return super(Protein, self).__setattr__(key, value) + + def _standarize_view(self, view): + if view is None: + if self.num_atom > 0: + view = "atom" + else: + view = "residue" + return view + + @classmethod + @utils.deprecated_alias(node_feature="atom_feature", edge_feature="bond_feature", graph_feature="mol_feature") + def from_molecule(cls, mol, atom_feature="default", bond_feature="default", residue_feature="default", + mol_feature=None, kekulize=False): + """ + Create a protein from an RDKit object. + + Parameters: + mol (rdchem.Mol): molecule + atom_feature (str or list of str, optional): atom features to extract + bond_feature (str or list of str, optional): bond features to extract + residue_feature (str, list of str, optional): residue features to extract + mol_feature (str or list of str, optional): molecule features to extract + kekulize (bool, optional): convert aromatic bonds to single/double bonds. + Note this only affects the relation in ``edge_list``. + For ``bond_type``, aromatic bonds are always stored explicitly. + By default, aromatic bonds are stored. + """ + protein = Molecule.from_molecule(mol, atom_feature=atom_feature, bond_feature=bond_feature, + mol_feature=mol_feature, with_hydrogen=False, kekulize=kekulize) + residue_feature = cls._standarize_option(residue_feature) + + if kekulize: + Chem.Kekulize(mol) + + residue_type = [] + atom_name = [] + is_hetero_atom = [] + occupancy = [] + b_factor = [] + atom2residue = [] + residue_number = [] + insertion_code = [] + chain_id = [] + _residue_feature = [] + last_residue = None + atoms = [mol.GetAtomWithIdx(i) for i in range(mol.GetNumAtoms())] + [cls.dummy_atom] + for atom in atoms: + pdbinfo = atom.GetPDBResidueInfo() + number = pdbinfo.GetResidueNumber() + code = pdbinfo.GetInsertionCode() + type = pdbinfo.GetResidueName().strip() + canonical_residue = (number, code, type) + if canonical_residue != last_residue: + last_residue = canonical_residue + if type not in cls.residue2id: + warnings.warn("Unknown residue `%s`. Treat as glycine" % type) + type = "GLY" + residue_type.append(cls.residue2id[type]) + residue_number.append(number) + if pdbinfo.GetInsertionCode() not in cls.alphabet2id: + warnings.warn(f"Fail to create the protein. Unknown insertion code {pdbinfo.GetInsertionCode()}.") + return None + if pdbinfo.GetChainId() not in cls.alphabet2id: + warnings.warn(f"Fail to create the protein. Unknown chain id {pdbinfo.GetChainId()}.") + return None + insertion_code.append(cls.alphabet2id[pdbinfo.GetInsertionCode()]) + chain_id.append(cls.alphabet2id[pdbinfo.GetChainId()]) + feature = [] + for name in residue_feature: + func = R.get("features.residue.%s" % name) + feature += func(pdbinfo) + _residue_feature.append(feature) + name = pdbinfo.GetName().strip() + if name not in cls.atom_name2id: + name = "UNK" + atom_name.append(cls.atom_name2id[name]) + is_hetero_atom.append(pdbinfo.GetIsHeteroAtom()) + occupancy.append(pdbinfo.GetOccupancy()) + b_factor.append(pdbinfo.GetTempFactor()) + atom2residue.append(len(residue_type) - 1) + residue_type = torch.tensor(residue_type)[:-1] + atom_name = torch.tensor(atom_name)[:-1] + is_hetero_atom = torch.tensor(is_hetero_atom)[:-1] + occupancy = torch.tensor(occupancy)[:-1] + b_factor = torch.tensor(b_factor)[:-1] + atom2residue = torch.tensor(atom2residue)[:-1] + residue_number = torch.tensor(residue_number)[:-1] + insertion_code = torch.tensor(insertion_code)[:-1] + chain_id = torch.tensor(chain_id)[:-1] + if len(residue_feature) > 0: + _residue_feature = torch.tensor(_residue_feature)[:-1] + else: + _residue_feature = None + + return cls(protein.edge_list, num_node=protein.num_node, residue_type=residue_type, + atom_name=atom_name, atom2residue=atom2residue, residue_feature=_residue_feature, + is_hetero_atom=is_hetero_atom, occupancy=occupancy, b_factor=b_factor, + residue_number=residue_number, insertion_code=insertion_code, chain_id=chain_id, + meta_dict=protein.meta_dict, **protein.data_dict) + + @classmethod + def _residue_from_sequence(cls, sequence): + residue_type = [] + residue_feature = [] + sequence = sequence + "G" + for residue in sequence: + if residue not in cls.residue_symbol2id: + warnings.warn("Unknown residue symbol `%s`. Treat as glycine" % residue) + residue = "G" + residue_type.append(cls.residue_symbol2id[residue]) + residue_feature.append(feature.onehot(residue, cls.residue_symbol2id, allow_unknown=True)) + + residue_type = residue_type[:-1] + residue_feature = torch.tensor(residue_feature)[:-1] + + return cls(edge_list=None, atom_type=[], bond_type=[], num_node=0, residue_type=residue_type, + residue_feature=residue_feature) + + @classmethod + @utils.deprecated_alias(node_feature="atom_feature", edge_feature="bond_feature", graph_feature="mol_feature") + def from_sequence(cls, sequence, atom_feature="default", bond_feature="default", residue_feature="default", + mol_feature=None, kekulize=False): + """ + Create a protein from a sequence. + + .. note:: + + It takes considerable time to construct proteins with a large number of atoms and bonds. + If you only need residue information, you may speed up the construction by setting + ``atom_feature`` and ``bond_feature`` to ``None``. + + Parameters: + sequence (str): protein sequence + atom_feature (str or list of str, optional): atom features to extract + bond_feature (str or list of str, optional): bond features to extract + residue_feature (str, list of str, optional): residue features to extract + mol_feature (str or list of str, optional): molecule features to extract + kekulize (bool, optional): convert aromatic bonds to single/double bonds. + Note this only affects the relation in ``edge_list``. + For ``bond_type``, aromatic bonds are always stored explicitly. + By default, aromatic bonds are stored. + """ + if atom_feature is None and bond_feature is None and residue_feature == "default": + return cls._residue_from_sequence(sequence) + + mol = Chem.MolFromSequence(sequence) + if mol is None: + raise ValueError("Invalid sequence `%s`" % sequence) + + return cls.from_molecule(mol, atom_feature, bond_feature, residue_feature, mol_feature, kekulize) + + @classmethod + @utils.deprecated_alias(node_feature="atom_feature", edge_feature="bond_feature", graph_feature="mol_feature") + def from_pdb(cls, pdb_file, atom_feature="default", bond_feature="default", residue_feature="default", + mol_feature=None, kekulize=False): + """ + Create a protein from a PDB file. + + Parameters: + pdb_file (str): file name + atom_feature (str or list of str, optional): atom features to extract + bond_feature (str or list of str, optional): bond features to extract + residue_feature (str, list of str, optional): residue features to extract + mol_feature (str or list of str, optional): molecule features to extract + kekulize (bool, optional): convert aromatic bonds to single/double bonds. + Note this only affects the relation in ``edge_list``. + For ``bond_type``, aromatic bonds are always stored explicitly. + By default, aromatic bonds are stored. + """ + if not os.path.exists(pdb_file): + raise FileNotFoundError("No such file `%s`" % pdb_file) + mol = Chem.MolFromPDBFile(pdb_file) + if mol is None: + raise ValueError("RDKit cannot read PDB file `%s`" % pdb_file) + return cls.from_molecule(mol, atom_feature, bond_feature, residue_feature, mol_feature, kekulize) + + def to_molecule(self, ignore_error=False): + """ + Return an RDKit object of this protein. + + Parameters: + ignore_error (bool, optional): if true, return ``None`` for illegal molecules. + Otherwise, raise an exception. + + Returns: + rdchem.Mol + """ + mol = super(Protein, self).to_molecule(ignore_error) + if mol is None: + return mol + + residue_type = self.residue_type.tolist() + atom_name = self.atom_name.tolist() + atom2residue = self.atom2residue.tolist() + is_hetero_atom = self.is_hetero_atom.tolist() + occupancy = self.occupancy.tolist() + b_factor = self.b_factor.tolist() + residue_number = self.residue_number.tolist() + chain_id = self.chain_id.tolist() + insertion_code = self.insertion_code.tolist() + for i, atom in enumerate(mol.GetAtoms()): + r = atom2residue[i] + residue = Chem.AtomPDBResidueInfo() + residue.SetResidueNumber(residue_number[r]) + residue.SetChainId(self.id2alphabet[chain_id[r]]) + residue.SetInsertionCode(self.id2alphabet[insertion_code[r]]) + residue.SetName(" %-3s" % self.id2atom_name[atom_name[i]]) + residue.SetResidueName(self.id2residue[residue_type[r]]) + residue.SetIsHeteroAtom(is_hetero_atom[i]) + residue.SetOccupancy(occupancy[i]) + residue.SetTempFactor(b_factor[i]) + atom.SetPDBResidueInfo(residue) + + return mol + + def to_sequence(self): + """ + Return a sequence of this protein. + + Returns: + str + """ + residue_type = self.residue_type.tolist() + cc_id = self.connected_component_id.tolist() + sequence = [] + for i in range(self.num_residue): + if i > 0 and cc_id[i] > cc_id[i - 1]: + sequence.append(".") + sequence.append(self.id2residue_symbol[residue_type[i]]) + return "".join(sequence) + + def to_pdb(self, pdb_file): + """ + Write this protein to a pdb file. + + Parameters: + pdb_file (str): file name + """ + mol = self.to_molecule() + Chem.MolToPDBFile(mol, pdb_file, flavor=10) + + def split(self, node2graph): + node2graph = torch.as_tensor(node2graph, dtype=torch.long, device=self.device) + # coalesce arbitrary graph IDs to [0, n) + _, node2graph = torch.unique(node2graph, return_inverse=True) + num_graph = node2graph.max() + 1 + index = node2graph.argsort() + mapping = torch.zeros_like(index) + mapping[index] = torch.arange(len(index), device=self.device) + + node_in, node_out = self.edge_list.t()[:2] + edge_mask = node2graph[node_in] == node2graph[node_out] + edge2graph = node2graph[node_in] + edge_index = edge2graph.argsort() + edge_index = edge_index[edge_mask[edge_index]] + + prepend = torch.tensor([-1], device=self.device) + is_first_node = torch.diff(node2graph[index], prepend=prepend) > 0 + graph_index = self.node2graph[index[is_first_node]] + + # a residue can be split into multiple graphs + max_num_node = node2graph.bincount(minlength=num_graph).max() + key = node2graph[index] * max_num_node + self.atom2residue[index] + key_set, atom2residue = key.unique(return_inverse=True) + residue_index = key_set % max_num_node + + edge_list = self.edge_list.clone() + edge_list[:, :2] = mapping[edge_list[:, :2]] + + num_nodes = node2graph.bincount(minlength=num_graph) + num_edges = edge2graph[edge_index].bincount(minlength=num_graph) + num_cum_residues = scatter_max(atom2residue, node2graph[index], dim_size=num_graph)[0] + 1 + prepend = torch.tensor([0], device=self.device) + num_residues = torch.diff(num_cum_residues, prepend=prepend) + + num_cum_nodes = num_nodes.cumsum(0) + offsets = (num_cum_nodes - num_nodes)[edge2graph[edge_index]] + + data_dict, meta_dict = self.data_mask(index, edge_index, residue_index, graph_index, + exclude=("residue reference", "graph reference")) + + return self.packed_type(edge_list[edge_index], edge_weight=self.edge_weight[edge_index], + num_nodes=num_nodes, num_edges=num_edges, num_residues=num_residues, view=self.view, + offsets=offsets, atom2residue=atom2residue, meta_dict=meta_dict, **data_dict) + + @classmethod + def pack(cls, graphs): + edge_list = [] + edge_weight = [] + num_nodes = [] + num_edges = [] + num_residues = [] + num_cum_node = 0 + num_cum_edge = 0 + num_cum_residue = 0 + num_graph = 0 + data_dict = defaultdict(list) + meta_dict = graphs[0].meta_dict + view = graphs[0].view + for graph in graphs: + edge_list.append(graph.edge_list) + edge_weight.append(graph.edge_weight) + num_nodes.append(graph.num_node) + num_edges.append(graph.num_edge) + num_residues.append(graph.num_residue) + for k, v in graph.data_dict.items(): + for type in meta_dict[k]: + if type == "graph": + v = v.unsqueeze(0) + elif type == "node reference": + v = torch.where(v != -1, v + num_cum_node, -1) + elif type == "edge reference": + v = torch.where(v != -1, v + num_cum_edge, -1) + elif type == "residue reference": + v = torch.where(v != -1, v + num_cum_residue, -1) + elif type == "graph reference": + v = torch.where(v != -1, v + num_graph, -1) + data_dict[k].append(v) + num_cum_node += graph.num_node + num_cum_edge += graph.num_edge + num_cum_residue += graph.num_residue + num_graph += 1 + + edge_list = torch.cat(edge_list) + edge_weight = torch.cat(edge_weight) + data_dict = {k: torch.cat(v) for k, v in data_dict.items()} + + return cls.packed_type(edge_list, edge_weight=edge_weight, num_relation=graphs[0].num_relation, + num_nodes=num_nodes, num_edges=num_edges, num_residues=num_residues, view=view, + meta_dict=meta_dict, **data_dict) + + def repeat(self, count): + edge_list = self.edge_list.repeat(count, 1) + edge_weight = self.edge_weight.repeat(count) + num_nodes = [self.num_node] * count + num_edges = [self.num_edge] * count + num_residues = [self.num_residue] * count + num_relation = self.num_relation + + data_dict = {} + for k, v in self.data_dict.items(): + if "graph" in self.meta_dict[k]: + v = v.unsqueeze(0) + shape = [1] * v.ndim + shape[0] = count + length = len(v) + v = v.repeat(shape) + for type in self.meta_dict[k]: + if type == "node reference": + offsets = torch.arange(count, device=self.device) * self.num_node + v = v + offsets.repeat_interleave(length) + elif type == "edge reference": + offsets = torch.arange(count, device=self.device) * self.num_edge + v = v + offsets.repeat_interleave(length) + elif type == "residue reference": + offsets = torch.arange(count, device=self.device) * self.num_residue + v = v + offsets.repeat_interleave(length) + elif type == "graph reference": + offsets = torch.arange(count, device=self.device) + v = v + offsets.repeat_interleave(length) + data_dict[k] = v + + return self.packed_type(edge_list, edge_weight=edge_weight, + num_nodes=num_nodes, num_edges=num_edges, num_residues=num_residues, view=self.view, + num_relation=num_relation, meta_dict=self.meta_dict, **data_dict) + + def residue2atom(self, residue_index): + """Map residue ids to atom ids.""" + residue_index = self._standarize_index(residue_index, self.num_residue) + if not hasattr(self, "node_inverted_index"): + self.node_inverted_index = self._build_node_inverted_index() + inverted_range, order = self.node_inverted_index + starts, ends = inverted_range[residue_index].t() + num_match = ends - starts + offsets = num_match.cumsum(0) - num_match + ranges = torch.arange(num_match.sum(), device=self.device) + ranges = ranges + (starts - offsets).repeat_interleave(num_match) + index = order[ranges] + return index + + def _build_node_inverted_index(self): + keys = self.atom2residue + order = keys.argsort() + keys_set, num_keys = keys.unique(return_counts=True) + ends = num_keys.cumsum(0) + starts = ends - num_keys + ranges = torch.stack([starts, ends], dim=-1) + inverted_range = Dictionary(keys_set, ranges) + return inverted_range, order + + def __getitem__(self, index): + # why do we check tuple? + # case 1: x[0, 1] is parsed as (0, 1) + # case 2: x[[0, 1]] is parsed as [0, 1] + if not isinstance(index, tuple): + index = (index,) + + if len(index) > 1: + raise ValueError("Protein has only 1 axis, but %d axis is indexed" % len(index)) + + return self.residue_mask(index[0], compact=True) + + def data_mask(self, node_index=None, edge_index=None, residue_index=None, graph_index=None, include=None, + exclude=None): + data_dict, meta_dict = super(Protein, self).data_mask(node_index, edge_index, graph_index=graph_index, + include=include, exclude=exclude) + residue_mapping = None + for k, v in data_dict.items(): + for type in meta_dict[k]: + if type == "residue" and residue_index is not None: + if v.is_sparse: + v = v.to_dense()[residue_index].to_sparse() + else: + v = v[residue_index] + elif type == "residue reference" and residue_index is not None: + if residue_mapping is None: + residue_mapping = self._get_mapping(residue_index, self.num_residue) + v = residue_mapping[v] + data_dict[k] = v + + return data_dict, meta_dict + + def residue_mask(self, index, compact=False): + """ + Return a masked protein based on the specified residues. + + Note the compact option is applied to both residue and atom ids. + + Parameters: + index (array_like): residue index + compact (bool, optional): compact residue ids or not + + Returns: + Protein + """ + index = self._standarize_index(index, self.num_residue) + if (torch.diff(index) <= 0).any(): + warnings.warn("`residue_mask()` is called to re-order the residues. This will change the protein sequence. " + "If this is not desired, you might have passed a wrong index to this function.") + residue_mapping = -torch.ones(self.num_residue, dtype=torch.long, device=self.device) + residue_mapping[index] = torch.arange(len(index), device=self.device) + + node_index = residue_mapping[self.atom2residue] >= 0 + node_index = self._standarize_index(node_index, self.num_node) + mapping = -torch.ones(self.num_node, dtype=torch.long, device=self.device) + if compact: + mapping[node_index] = torch.arange(len(node_index), device=self.device) + num_node = len(node_index) + else: + mapping[node_index] = node_index + num_node = self.num_node + + edge_list = self.edge_list.clone() + edge_list[:, :2] = mapping[edge_list[:, :2]] + edge_index = (edge_list[:, :2] >= 0).all(dim=-1) + edge_index = self._standarize_index(edge_index, self.num_edge) + + if compact: + data_dict, meta_dict = self.data_mask(node_index, edge_index, residue_index=index) + else: + data_dict, meta_dict = self.data_mask(edge_index=edge_index) + + return type(self)(edge_list[edge_index], edge_weight=self.edge_weight[edge_index], num_node=num_node, + view=self.view, num_relation=self.num_relation, meta_dict=meta_dict, **data_dict) + + def subresidue(self, index): + """ + Return a subgraph based on the specified residues. + Equivalent to :meth:`residue_mask(index, compact=True) `. + + Parameters: + index (array_like): residue index + + Returns: + Protein + + See also: + :meth:`Protein.residue_mask` + """ + return self.residue_mask(index, compact=True) + + @property + def residue2graph(self): + """Residue id to graph id mapping.""" + return torch.zeros(self.num_residue, dtype=torch.long, device=self.device) + + @utils.cached_property + def connected_component_id(self): + """Connected component id of each residue.""" + node_in, node_out = self.edge_list.t()[:2] + residue_in, residue_out = self.atom2residue[node_in], self.atom2residue[node_out] + mask = residue_in != residue_out + residue_in, residue_out = residue_in[mask], residue_out[mask] + range = torch.arange(self.num_residue, device=self.device) + residue_in, residue_out = torch.cat([residue_in, residue_out, range]), \ + torch.cat([residue_out, residue_in, range]) + + min_neighbor = torch.arange(self.num_residue, device=self.device) + last = torch.zeros_like(min_neighbor) + while not torch.equal(min_neighbor, last): + last = min_neighbor + min_neighbor = scatter_min(min_neighbor[residue_out], residue_in, dim_size=self.num_residue)[0] + cc_id = torch.unique(min_neighbor, return_inverse=True)[1] + return cc_id + + def __repr__(self): + fields = ["num_atom=%d" % self.num_node, "num_bond=%d" % self.num_edge, + "num_residue=%d" % self.num_residue] + if self.device.type != "cpu": + fields.append("device='%s'" % self.device) + return "%s(%s)" % (self.__class__.__name__, ", ".join(fields)) + + +class PackedProtein(PackedMolecule, Protein): + """ + Container for proteins with variadic sizes. + Support both residue-level and atom-level operations and ensure consistency between two views. + + .. warning:: + + Edges of the same graph are guaranteed to be consecutive in the edge list. + The order of residues must be the same as the protein sequence. + However, this class doesn't enforce any order on nodes or edges. + Nodes may have a different order with residues. + + Parameters: + edge_list (array_like, optional): list of edges of shape :math:`(|E|, 3)`. + Each tuple is (node_in, node_out, bond_type). + atom_type (array_like, optional): atom types of shape :math:`(|V|,)` + bond_type (array_like, optional): bond types of shape :math:`(|E|,)` + residue_type (array_like, optional): residue types of shape :math:`(|V_{res}|,)` + view (str, optional): default view for this protein. Can be ``atom`` or ``residue``. + num_nodes (array_like, optional): number of nodes in each graph + By default, it will be inferred from the largest id in `edge_list` + num_edges (array_like, optional): number of edges in each graph + num_residues (array_like, optional): number of residues in each graph + offsets (array_like, optional): node id offsets of shape :math:`(|E|,)`. + If not provided, nodes in `edge_list` should be relative index, i.e., the index in each graph. + If provided, nodes in `edge_list` should be absolute index, i.e., the index in the packed graph. + """ + + unpacked_type = Protein + _check_attribute = Protein._check_attribute + + def __init__(self, edge_list=None, atom_type=None, bond_type=None, residue_type=None, view=None, num_nodes=None, + num_edges=None, num_residues=None, offsets=None, **kwargs): + super(PackedProtein, self).__init__(edge_list=edge_list, num_nodes=num_nodes, num_edges=num_edges, + offsets=offsets, atom_type=atom_type, bond_type=bond_type, + residue_type=residue_type, view=view, **kwargs) + + num_residues = torch.as_tensor(num_residues, device=self.device) + num_cum_residues = num_residues.cumsum(0) + + self.num_residues = num_residues + self.num_cum_residues = num_cum_residues + + @property + def num_nodes(self): + return self.num_atoms + + @num_nodes.setter + def num_nodes(self, value): + self.num_atoms = value + + def data_mask(self, node_index=None, edge_index=None, residue_index=None, graph_index=None, include=None, + exclude=None): + data_dict, meta_dict = super(PackedProtein, self).data_mask(node_index, edge_index, graph_index=graph_index, + include=include, exclude=exclude) + residue_mapping = None + for k, v in data_dict.items(): + for type in meta_dict[k]: + if type == "residue" and residue_index is not None: + if v.is_sparse: + v = v.to_dense()[residue_index].to_sparse() + else: + v = v[residue_index] + elif type == "residue reference" and residue_index is not None: + if residue_mapping is None: + residue_mapping = self._get_mapping(residue_index, self.num_residue) + v = residue_mapping[v] + data_dict[k] = v + + return data_dict, meta_dict + + def node_mask(self, index, compact=True): + index = self._standarize_index(index, self.num_node) + mapping = -torch.ones(self.num_node, dtype=torch.long, device=self.device) + if compact: + mapping[index] = torch.arange(len(index), device=self.device) + num_nodes = self._get_num_xs(index, self.num_cum_nodes) + offsets = self._get_offsets(num_nodes, self.num_edges) + else: + mapping[index] = index + num_nodes = self.num_nodes + offsets = self._offsets + + edge_list = self.edge_list.clone() + edge_list[:, :2] = mapping[edge_list[:, :2]] + edge_index = (edge_list[:, :2] >= 0).all(dim=-1) + num_edges = self._get_num_xs(edge_index, self.num_cum_edges) + + if compact: + data_dict, meta_dict = self.data_mask(index, edge_index) + else: + data_dict, meta_dict = self.data_mask(edge_index=edge_index) + + return type(self)(edge_list[edge_index], edge_weight=self.edge_weight[edge_index], + num_nodes=num_nodes, num_edges=num_edges, num_residues=self.num_residues, + view=self.view, num_relation=self.num_relation, offsets=offsets[edge_index], + meta_dict=meta_dict, **data_dict) + + def edge_mask(self, index): + index = self._standarize_index(index, self.num_edge) + data_dict, meta_dict = self.data_mask(edge_index=index) + num_edges = self._get_num_xs(index, self.num_cum_edges) + + return type(self)(self.edge_list[index], edge_weight=self.edge_weight[index], + num_nodes=self.num_nodes, num_edges=num_edges, num_residues=self.num_residues, + view=self.view, num_relation=self.num_relation, offsets=self._offsets[index], + meta_dict=meta_dict, **data_dict) + + def residue_mask(self, index, compact=False): + """ + Return a masked packed protein based on the specified residues. + + Note the compact option is applied to both residue and atom ids, but not graph ids. + + Parameters: + index (array_like): residue index + compact (bool, optional): compact residue ids or not + + Returns: + PackedProtein + """ + index = self._standarize_index(index, self.num_residue) + residue_mapping = -torch.ones(self.num_residue, dtype=torch.long, device=self.device) + residue_mapping[index] = torch.arange(len(index), device=self.device) + + node_index = residue_mapping[self.atom2residue] >= 0 + node_index = self._standarize_index(node_index, self.num_node) + mapping = -torch.ones(self.num_node, dtype=torch.long, device=self.device) + if compact: + mapping[node_index] = torch.arange(len(node_index), device=self.device) + num_nodes = self._get_num_xs(node_index, self.num_cum_nodes) + num_residues = self._get_num_xs(index, self.num_cum_residues) + else: + mapping[node_index] = node_index + num_nodes = self.num_nodes + num_residues = self.num_residues + + edge_list = self.edge_list.clone() + edge_list[:, :2] = mapping[edge_list[:, :2]] + edge_index = (edge_list[:, :2] >= 0).all(dim=-1) + edge_index = self._standarize_index(edge_index, self.num_edge) + num_edges = self._get_num_xs(edge_index, self.num_cum_edges) + offsets = self._get_offsets(num_nodes, num_edges) + + if compact: + data_dict, meta_dict = self.data_mask(node_index, edge_index, residue_index=index) + else: + data_dict, meta_dict = self.data_mask(edge_index=edge_index) + + return type(self)(edge_list[edge_index], edge_weight=self.edge_weight[edge_index], + num_nodes=num_nodes, num_edges=num_edges, num_residues=num_residues, + view=self.view, num_relation=self.num_relation, offsets=offsets, + meta_dict=meta_dict, **data_dict) + + def graph_mask(self, index, compact=False): + index = self._standarize_index(index, self.batch_size) + graph_mapping = -torch.ones(self.batch_size, dtype=torch.long, device=self.device) + graph_mapping[index] = torch.arange(len(index), device=self.device) + + node_index = graph_mapping[self.node2graph] >= 0 + node_index = self._standarize_index(node_index, self.num_node) + residue_index = graph_mapping[self.residue2graph] >= 0 + residue_index = self._standarize_index(residue_index, self.num_residue) + mapping = -torch.ones(self.num_node, dtype=torch.long, device=self.device) + if compact: + key = graph_mapping[self.node2graph[node_index]] * self.num_node + node_index + order = key.argsort() + node_index = node_index[order] + key = graph_mapping[self.residue2graph[residue_index]] * self.num_residue + residue_index + order = key.argsort() + residue_index = residue_index[order] + mapping[node_index] = torch.arange(len(node_index), device=self.device) + num_nodes = self.num_nodes[index] + num_residues = self.num_residues[index] + else: + mapping[node_index] = node_index + num_nodes = torch.zeros_like(self.num_nodes) + num_nodes[index] = self.num_nodes[index] + num_residues = torch.zeros_like(self.num_residues) + num_residues[index] = self.num_residues[index] + + edge_list = self.edge_list.clone() + edge_list[:, :2] = mapping[edge_list[:, :2]] + edge_index = (edge_list[:, :2] >= 0).all(dim=-1) + edge_index = self._standarize_index(edge_index, self.num_edge) + if compact: + key = graph_mapping[self.edge2graph[edge_index]] * self.num_edge + edge_index + order = key.argsort() + edge_index = edge_index[order] + num_edges = self.num_edges[index] + else: + num_edges = torch.zeros_like(self.num_edges) + num_edges[index] = self.num_edges[index] + offsets = self._get_offsets(num_nodes, num_edges) + + if compact: + data_dict, meta_dict = self.data_mask(node_index, edge_index, + residue_index=residue_index, graph_index=index) + else: + data_dict, meta_dict = self.data_mask(edge_index=edge_index) + + return type(self)(edge_list[edge_index], edge_weight=self.edge_weight[edge_index], + num_nodes=num_nodes, num_edges=num_edges, num_residues=num_residues, + view=self.view, num_relation=self.num_relation, offsets=offsets, + meta_dict=meta_dict, **data_dict) + + def get_item(self, index): + node_index = torch.arange(self.num_cum_nodes[index] - self.num_nodes[index], self.num_cum_nodes[index], + device=self.device) + edge_index = torch.arange(self.num_cum_edges[index] - self.num_edges[index], self.num_cum_edges[index], + device=self.device) + residue_index = torch.arange(self.num_cum_residues[index] - self.num_residues[index], + self.num_cum_residues[index], device=self.device) + graph_index = index + edge_list = self.edge_list[edge_index].clone() + edge_list[:, :2] -= self._offsets[edge_index].unsqueeze(-1) + data_dict, meta_dict = self.data_mask(node_index, edge_index, + residue_index=residue_index, graph_index=graph_index) + + return self.unpacked_type(edge_list, edge_weight=self.edge_weight[edge_index], num_node=self.num_nodes[index], + num_relation=self.num_relation, meta_dict=meta_dict, **data_dict) + + @classmethod + @utils.deprecated_alias(node_feature="atom_feature", edge_feature="bond_feature", graph_feature="mol_feature") + def from_molecule(cls, mols, atom_feature="default", bond_feature="default", residue_feature="default", + mol_feature=None, kekulize=False): + """ + Create a packed protein from a list of RDKit objects. + + Parameters: + mols (list of rdchem.Mol): molecules + atom_feature (str or list of str, optional): atom features to extract + bond_feature (str or list of str, optional): bond features to extract + residue_feature (str or list of str, optional): residue features to extract + mol_feature (str or list of str, optional): molecule features to extract + kekulize (bool, optional): convert aromatic bonds to single/double bonds. + Note this only affects the relation in ``edge_list``. + For ``bond_type``, aromatic bonds are always stored explicitly. + By default, aromatic bonds are stored. + """ + protein = PackedMolecule.from_molecule(mols, atom_feature=atom_feature, bond_feature=bond_feature, + mol_feature=mol_feature, with_hydrogen=False, kekulize=kekulize) + residue_feature = cls._standarize_option(residue_feature) + + residue_type = [] + atom_name = [] + is_hetero_atom = [] + occupancy = [] + b_factor = [] + atom2residue = [] + residue_number = [] + insertion_code = [] + chain_id = [] + _residue_feature = [] + last_residue = None + num_residues = [] + num_cum_residue = 0 + + mols = mols + [cls.dummy_protein] + for mol in mols: + if mol is None: + mol = cls.empty_mol + + if kekulize: + Chem.Kekulize(mol) + + for atom in mol.GetAtoms(): + residue = atom.GetPDBResidueInfo() + number = residue.GetResidueNumber() + code = residue.GetInsertionCode() + type = residue.GetResidueName().strip() + canonical_residue = (number, code, type) + if canonical_residue != last_residue: + last_residue = canonical_residue + if type not in cls.residue2id: + warnings.warn("Unknown residue `%s`. Treat as glycine" % type) + type = "GLY" + residue_type.append(cls.residue2id[type]) + residue_number.append(number) + insertion_code.append(cls.alphabet2id[residue.GetInsertionCode()]) + chain_id.append(cls.alphabet2id[residue.GetChainId()]) + feature = [] + for name in residue_feature: + func = R.get("features.residue.%s" % name) + feature += func(residue) + _residue_feature.append(feature) + name = residue.GetName().strip() + if name not in cls.atom_name2id: + name = "UNK" + atom_name.append(cls.atom_name2id[name]) + is_hetero_atom.append(residue.GetIsHeteroAtom()) + occupancy.append(residue.GetOccupancy()) + b_factor.append(residue.GetTempFactor()) + atom2residue.append(len(residue_type) - 1) + + num_residues.append(len(residue_type) - num_cum_residue) + num_cum_residue = len(residue_type) + + residue_type = torch.tensor(residue_type)[:-1] + atom_name = torch.tensor(atom_name)[:-5] + is_hetero_atom = torch.tensor(is_hetero_atom)[:-5] + occupancy = torch.tensor(occupancy)[:-5] + b_factor = torch.tensor(b_factor)[:-5] + atom2residue = torch.tensor(atom2residue)[:-5] + residue_number = torch.tensor(residue_number)[:-1] + insertion_code = torch.tensor(insertion_code)[:-1] + chain_id = torch.tensor(chain_id)[:-1] + if len(residue_feature) > 0: + _residue_feature = torch.tensor(_residue_feature)[:-1] + else: + _residue_feature = None + + num_residues = num_residues[:-1] + + return cls(protein.edge_list, residue_type=residue_type, + num_nodes=protein.num_nodes, num_edges=protein.num_edges, num_residues=num_residues, + atom_name=atom_name, atom2residue=atom2residue, residue_feature=_residue_feature, + is_hetero_atom=is_hetero_atom, occupancy=occupancy, b_factor=b_factor, + residue_number=residue_number, insertion_code=insertion_code, chain_id=chain_id, + offsets=protein._offsets, meta_dict=protein.meta_dict, **protein.data_dict) + + @classmethod + def _residue_from_sequence(cls, sequences): + num_residues = [] + residue_type = [] + residue_feature = [] + sequences = sequences + ["G"] + for sequence in sequences: + for residue in sequence: + if residue not in cls.residue_symbol2id: + warnings.warn("Unknown residue symbol `%s`. Treat as glycine" % residue) + residue = "G" + residue_type.append(cls.residue_symbol2id[residue]) + residue_feature.append(feature.onehot(residue, cls.residue_symbol2id, allow_unknown=True)) + num_residues.append(len(sequence)) + + residue_type = residue_type[:-1] + residue_feature = torch.tensor(residue_feature)[:-1] + + edge_list = torch.zeros(0, 3, dtype=torch.long) + num_nodes = [0] * (len(sequences) - 1) + num_edges = [0] * (len(sequences) - 1) + num_residues = num_residues[:-1] + + return cls(edge_list=edge_list, atom_type=[], bond_type=[], residue_type=residue_type, + num_nodes=num_nodes, num_edges=num_edges, num_residues=num_residues, + residue_feature=residue_feature) + + @classmethod + @utils.deprecated_alias(node_feature="atom_feature", edge_feature="bond_feature", graph_feature="mol_feature") + def from_sequence(cls, sequences, atom_feature="default", bond_feature="default", residue_feature="default", + mol_feature=None, kekulize=False): + """ + Create a packed protein from a list of sequences. + + .. note:: + + It takes considerable time to construct proteins with a large number of atoms and bonds. + If you only need residue information, you may speed up the construction by setting + ``atom_feature`` and ``bond_feature`` to ``None``. + + Parameters: + sequences (str): list of protein sequences + atom_feature (str or list of str, optional): atom features to extract + bond_feature (str or list of str, optional): bond features to extract + residue_feature (str or list of str, optional): residue features to extract + mol_feature (str or list of str, optional): molecule features to extract + kekulize (bool, optional): convert aromatic bonds to single/double bonds. + Note this only affects the relation in ``edge_list``. + For ``bond_type``, aromatic bonds are always stored explicitly. + By default, aromatic bonds are stored. + """ + if atom_feature is None and bond_feature is None and residue_feature == "default": + return cls._residue_from_sequence(sequences) + + mols = [] + for sequence in sequences: + mol = Chem.MolFromSequence(sequence) + if mol is None: + raise ValueError("Invalid sequence `%s`" % sequence) + mols.append(mol) + + return cls.from_molecule(mols, atom_feature, bond_feature, residue_feature, mol_feature, kekulize) + + @classmethod + @utils.deprecated_alias(node_feature="atom_feature", edge_feature="bond_feature", graph_feature="mol_feature") + def from_pdb(cls, pdb_files, atom_feature="default", bond_feature="default", residue_feature="default", + mol_feature=None, kekulize=False): + """ + Create a protein from a list of PDB files. + + Parameters: + pdb_files (str): list of file names + atom_feature (str or list of str, optional): atom features to extract + bond_feature (str or list of str, optional): bond features to extract + residue_feature (str, list of str, optional): residue features to extract + mol_feature (str or list of str, optional): molecule features to extract + kekulize (bool, optional): convert aromatic bonds to single/double bonds. + Note this only affects the relation in ``edge_list``. + For ``bond_type``, aromatic bonds are always stored explicitly. + By default, aromatic bonds are stored. + """ + mols = [] + for pdb_file in pdb_files: + mol = Chem.MolFromPDBFile(pdb_file) + mols.append(mol) + + return cls.from_molecule(mols, atom_feature, bond_feature, residue_feature, mol_feature, kekulize) + + def to_molecule(self, ignore_error=False): + mols = super(PackedProtein, self).to_molecule(ignore_error) + + residue_type = self.residue_type.tolist() + atom_name = self.atom_name.tolist() + atom2residue = self.atom2residue.tolist() + is_hetero_atom = self.is_hetero_atom.tolist() + occupancy = self.occupancy.tolist() + b_factor = self.b_factor.tolist() + residue_number = self.residue_number.tolist() + chain_id = self.chain_id.tolist() + insertion_code = self.insertion_code.tolist() + num_cum_nodes = [0] + self.num_cum_nodes.tolist() + + for i, mol in enumerate(mols): + for j, atom in enumerate(mol.GetAtoms(), num_cum_nodes[i]): + r = atom2residue[j] + residue = Chem.AtomPDBResidueInfo() + residue.SetResidueNumber(residue_number[r]) + residue.SetChainId(self.id2alphabet[chain_id[r]]) + residue.SetInsertionCode(self.id2alphabet[insertion_code[r]]) + residue.SetName(" %-3s" % self.id2atom_name[atom_name[j]]) + residue.SetResidueName(self.id2residue[residue_type[r]]) + residue.SetIsHeteroAtom(is_hetero_atom[j]) + residue.SetOccupancy(occupancy[j]) + residue.SetTempFactor(b_factor[j]) + atom.SetPDBResidueInfo(residue) + + return mols + + def to_sequence(self): + """ + Return a list of sequences. + + Returns: + list of str + """ + residue_type = self.residue_type.tolist() + cc_id = self.connected_component_id.tolist() + num_cum_residues = [0] + self.num_cum_residues.tolist() + sequences = [] + for i in range(self.batch_size): + sequence = [] + for j in range(num_cum_residues[i], num_cum_residues[i + 1]): + if j > num_cum_residues[i] and cc_id[j] > cc_id[j - 1]: + sequence.append(".") + sequence.append(self.id2residue_symbol[residue_type[j]]) + sequence = "".join(sequence) + sequences.append(sequence) + return sequences + + def to_pdb(self, pdb_files): + """ + Write this packed protein to several pdb files. + + Parameters: + pdb_files (list of str): list of file names + """ + mols = self.to_molecule() + for mol, pdb_file in zip(mols, pdb_files): + Chem.MolToPDBFile(mol, pdb_file, flavor=10) + + def merge(self, graph2graph): + graph2graph = torch.as_tensor(graph2graph, dtype=torch.long, device=self.device) + # coalesce arbitrary graph IDs to [0, n) + _, graph2graph = torch.unique(graph2graph, return_inverse=True) + + graph_key = graph2graph * self.batch_size + torch.arange(self.batch_size, device=self.device) + graph_index = graph_key.argsort() + graph = self.subbatch(graph_index) + graph2graph = graph2graph[graph_index] + + num_graph = graph2graph[-1] + 1 + num_nodes = scatter_add(graph.num_nodes, graph2graph, dim_size=num_graph) + num_edges = scatter_add(graph.num_edges, graph2graph, dim_size=num_graph) + num_residues = scatter_add(graph.num_residues, graph2graph, dim_size=num_graph) + offsets = self._get_offsets(num_nodes, num_edges) + + data_dict, meta_dict = graph.data_mask(exclude="graph") + + return type(self)(graph.edge_list, edge_weight=graph.edge_weight, num_nodes=num_nodes, + num_edges=num_edges, num_residues=num_residues, view=self.view, offsets=offsets, + meta_dict=meta_dict, **data_dict) + + def repeat(self, count): + num_nodes = self.num_nodes.repeat(count) + num_edges = self.num_edges.repeat(count) + num_residues = self.num_residues.repeat(count) + offsets = self._get_offsets(num_nodes, num_edges) + edge_list = self.edge_list.repeat(count, 1) + edge_list[:, :2] += (offsets - self._offsets.repeat(count)).unsqueeze(-1) + + data_dict = {} + for k, v in self.data_dict.items(): + shape = [1] * v.ndim + shape[0] = count + length = len(v) + v = v.repeat(shape) + for _type in self.meta_dict[k]: + if _type == "node reference": + pack_offsets = torch.arange(count, device=self.device) * self.num_node + v = v + pack_offsets.repeat_interleave(length) + elif _type == "edge reference": + pack_offsets = torch.arange(count, device=self.device) * self.num_edge + v = v + pack_offsets.repeat_interleave(length) + elif _type == "residue reference": + pack_offsets = torch.arange(count, device=self.device) * self.num_residue + v = v + pack_offsets.repeat_interleave(length) + elif _type == "graph reference": + pack_offsets = torch.arange(count, device=self.device) * self.batch_size + v = v + pack_offsets.repeat_interleave(length) + data_dict[k] = v + + return type(self)(edge_list, edge_weight=self.edge_weight.repeat(count), + num_nodes=num_nodes, num_edges=num_edges, num_residues=num_residues, view=self.view, + num_relation=self.num_relation, offsets=offsets, + meta_dict=self.meta_dict, **data_dict) + + def repeat_interleave(self, repeats): + repeats = torch.as_tensor(repeats, dtype=torch.long, device=self.device) + if repeats.numel() == 1: + repeats = repeats * torch.ones(self.batch_size, dtype=torch.long, device=self.device) + num_nodes = self.num_nodes.repeat_interleave(repeats) + num_edges = self.num_edges.repeat_interleave(repeats) + num_residues = self.num_residues.repeat_interleave(repeats) + num_cum_nodes = num_nodes.cumsum(0) + num_cum_edges = num_edges.cumsum(0) + num_cum_residues = num_residues.cumsum(0) + num_node = num_nodes.sum() + num_edge = num_edges.sum() + num_residue = num_residues.sum() + batch_size = repeats.sum() + num_graphs = torch.ones(batch_size, device=self.device) + + # special case 1: graphs[i] may have no node or no edge + # special case 2: repeats[i] may be 0 + cum_repeats_shifted = repeats.cumsum(0) - repeats + graph_mask = cum_repeats_shifted < batch_size + cum_repeats_shifted = cum_repeats_shifted[graph_mask] + + index = num_cum_nodes - num_nodes + index = torch.cat([index, index[cum_repeats_shifted]]) + value = torch.cat([-num_nodes, self.num_nodes[graph_mask]]) + mask = index < num_node + node_index = scatter_add(value[mask], index[mask], dim_size=num_node) + node_index = (node_index + 1).cumsum(0) - 1 + + index = num_cum_edges - num_edges + index = torch.cat([index, index[cum_repeats_shifted]]) + value = torch.cat([-num_edges, self.num_edges[graph_mask]]) + mask = index < num_edge + edge_index = scatter_add(value[mask], index[mask], dim_size=num_edge) + edge_index = (edge_index + 1).cumsum(0) - 1 + + index = num_cum_residues - num_residues + index = torch.cat([index, index[cum_repeats_shifted]]) + value = torch.cat([-num_residues, self.num_residues[graph_mask]]) + mask = index < num_residue + residue_index = scatter_add(value[mask], index[mask], dim_size=num_residue) + residue_index = (residue_index + 1).cumsum(0) - 1 + + graph_index = torch.repeat_interleave(repeats) + + offsets = self._get_offsets(num_nodes, num_edges) + edge_list = self.edge_list[edge_index] + edge_list[:, :2] += (offsets - self._offsets[edge_index]).unsqueeze(-1) + + node_offsets = None + edge_offsets = None + residue_offsets = None + graph_offsets = None + data_dict = {} + for k, v in self.data_dict.items(): + num_xs = None + pack_offsets = None + for _type in self.meta_dict[k]: + if _type == "node": + v = v[node_index] + num_xs = num_nodes + elif _type == "edge": + v = v[edge_index] + num_xs = num_edges + elif _type == "residue": + v = v[residue_index] + num_xs = num_residues + elif _type == "graph": + v = v[graph_index] + num_xs = num_graphs + elif _type == "node reference": + if node_offsets is None: + node_offsets = self._get_repeat_pack_offsets(self.num_nodes, repeats) + pack_offsets = node_offsets + elif _type == "edge reference": + if edge_offsets is None: + edge_offsets = self._get_repeat_pack_offsets(self.num_edges, repeats) + pack_offsets = edge_offsets + elif _type == "residue reference": + if residue_offsets is None: + residue_offsets = self._get_repeat_pack_offsets(self.num_residues, repeats) + pack_offsets = residue_offsets + elif _type == "graph reference": + if graph_offsets is None: + graph_offsets = self._get_repeat_pack_offsets(num_graphs, repeats) + pack_offsets = graph_offsets + # add offsets to make references point to indexes in their own graph + if num_xs is not None and pack_offsets is not None: + v = v + pack_offsets.repeat_interleave(num_xs) + data_dict[k] = v + + return type(self)(edge_list, edge_weight=self.edge_weight[edge_index], + num_nodes=num_nodes, num_edges=num_edges, num_residues=num_residues, view=self.view, + num_relation=self.num_relation, offsets=offsets, meta_dict=self.meta_dict, **data_dict) + + def undirected(self, add_inverse=True): + undirected = PackedMolecule.undirected(self, add_inverse=add_inverse) + + return type(self)(undirected.edge_list, edge_weight=undirected.edge_weight, + num_nodes=undirected.num_nodes, num_edges=undirected.num_edges, + num_residues=self.num_residues, view=self.view, num_relation=undirected.num_relation, + offsets=undirected._offsets, meta_dict=undirected.meta_dict, **undirected.data_dict) + + def detach(self): + return type(self)(self.edge_list.detach(), edge_weight=self.edge_weight.detach(), + num_nodes=self.num_nodes, num_edges=self.num_edges, num_residues=self.num_residues, + view=self.view, num_relation=self.num_relation, offsets=self._offsets, + meta_dict=self.meta_dict, **utils.detach(self.data_dict)) + + def clone(self): + return type(self)(self.edge_list.clone(), edge_weight=self.edge_weight.clone(), + num_nodes=self.num_nodes, num_edges=self.num_edges, num_residues=self.num_residues, + view=self.view, num_relation=self.num_relation, offsets=self._offsets, + meta_dict=self.meta_dict, **utils.clone(self.data_dict)) + + def cuda(self, *args, **kwargs): + edge_list = self.edge_list.cuda(*args, **kwargs) + + if edge_list is self.edge_list: + return self + else: + return type(self)(edge_list, edge_weight=self.edge_weight, + num_nodes=self.num_nodes, num_edges=self.num_edges, num_residues=self.num_residues, + view=self.view, num_relation=self.num_relation, offsets=self._offsets, + meta_dict=self.meta_dict, **utils.cuda(self.data_dict, *args, **kwargs)) + + def cpu(self): + edge_list = self.edge_list.cpu() + + if edge_list is self.edge_list: + return self + else: + return type(self)(edge_list, edge_weight=self.edge_weight, + num_nodes=self.num_nodes, num_edges=self.num_edges, num_residues=self.num_residues, + view=self.view, num_relation=self.num_relation, offsets=self._offsets, + meta_dict=self.meta_dict, **utils.cpu(self.data_dict)) + + @utils.cached_property + def residue2graph(self): + """Residue id to graph id mapping.""" + range = torch.arange(self.batch_size, device=self.device) + residue2graph = range.repeat_interleave(self.num_residues) + return residue2graph + + @utils.cached_property + def connected_component_id(self): + cc_id = super(PackedProtein, self).connected_component_id + cc_id_offsets = scatter_min(cc_id, self.residue2graph, dim_size=self.num_residue)[0][self.residue2graph] + cc_id = cc_id - cc_id_offsets + return cc_id + + def __repr__(self): + fields = ["batch_size=%d" % self.batch_size, + "num_atoms=%s" % pretty.long_array(self.num_nodes.tolist()), + "num_bonds=%s" % pretty.long_array(self.num_edges.tolist()), + "num_residues=%s" % pretty.long_array(self.num_residues.tolist())] + if self.device.type != "cpu": + fields.append("device='%s'" % self.device) + return "%s(%s)" % (self.__class__.__name__, ", ".join(fields)) + + +Protein.packed_type = PackedProtein diff --git a/build/lib/torchdrug/data/rdkit/__init__.py b/build/lib/torchdrug/data/rdkit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/build/lib/torchdrug/data/rdkit/draw.py b/build/lib/torchdrug/data/rdkit/draw.py new file mode 100644 index 00000000..a0e2a4b7 --- /dev/null +++ b/build/lib/torchdrug/data/rdkit/draw.py @@ -0,0 +1,54 @@ +from matplotlib import pyplot as plt + +from rdkit import Chem +from rdkit.Chem import AllChem +from rdkit.Chem.Draw.MolDrawing import MolDrawing, DrawingOptions +from rdkit.Chem.Draw import mplCanvas + + +class Canvas(mplCanvas.Canvas): + + def __init__(self, ax, name="", imageType="png"): + self._name = name + if ax is None: + size = (3, 3) + self._figure = plt.figure(figsize=size) + self._axes = self._figure.add_axes([0, 0, 1, 1]) + else: + bbox = ax.get_window_extent().transformed(ax.figure.dpi_scale_trans.inverted()) + size = (bbox.width, bbox.height) + self._figure = ax.figure + self._axes = ax + self._axes.set_axis_off() + # these are rdkit internal size and dpi + self.size = tuple(s * 100 for s in size) + self._dpi = max(self.size) + + +def MolToMPL(mol, ax=None, kekulize=True, wedgeBonds=True, imageType=None, fitImage=False, + options=None, **kwargs): + """Generates a drawing of a molecule on a matplotlib canvas.""" + if not mol: + raise ValueError("Null molecule provided") + + canvas = Canvas(ax) + if options is None: + options = DrawingOptions() + options.bgColor = None + if fitImage: + options.dotsPerAngstrom = int(min(canvas.size) / 10) + options.wedgeDashedBonds = wedgeBonds + drawer = MolDrawing(canvas=canvas, drawingOptions=options) + omol = mol + if kekulize: + mol = Chem.Mol(mol.ToBinary()) + Chem.Kekulize(mol) + + if not mol.GetNumConformers(): + AllChem.Compute2DCoords(mol) + + drawer.AddMol(mol, **kwargs) + omol._atomPs = drawer.atomPs[mol] + for k, v in omol._atomPs.items(): + omol._atomPs[k] = canvas.rescalePt(v) + return canvas._figure \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/__init__.py b/build/lib/torchdrug/datasets/__init__.py new file mode 100644 index 00000000..7eb75646 --- /dev/null +++ b/build/lib/torchdrug/datasets/__init__.py @@ -0,0 +1,64 @@ +from .bace import BACE +from .bbbp import BBBP +from .cep import CEP +from .clintox import ClinTox +from .delaney import Delaney +from .freesolv import FreeSolv +from .hiv import HIV +from .lipophilicity import Lipophilicity +from .malaria import Malaria +from .moses import MOSES +from .muv import MUV +from .opv import OPV +from .qm8 import QM8 +from .qm9 import QM9 +from .sider import SIDER +from .tox21 import Tox21 +from .toxcast import ToxCast +from .uspto50k import USPTO50k +from .zinc250k import ZINC250k +from .zinc2m import ZINC2m +from .pcqm4m import PCQM4M +from .pubchem110m import PubChem110m +from .chembl_filtered import ChEMBLFiltered + +from .beta_lactamase import BetaLactamase +from .fluorescence import Fluorescence +from .stability import Stability +from .solubility import Solubility +from .fold import Fold +from .binary_localization import BinaryLocalization +from .subcellular_localization import SubcellularLocalization +from .secondary_structure import SecondaryStructure +from .human_ppi import HumanPPI +from .yeast_ppi import YeastPPI +from .ppi_affinity import PPIAffinity +from .bindingdb import BindingDB +from .pdbbind import PDBBind +from .proteinnet import ProteinNet + +from .enzyme_commission import EnzymeCommission +from .gene_ontology import GeneOntology +from .alphafolddb import AlphaFoldDB + +from .fb15k import FB15k, FB15k237 +from .wn18 import WN18, WN18RR +from .yago310 import YAGO310 +from .hetionet import Hetionet + +from .cora import Cora +from .citeseer import CiteSeer +from .pubmed import PubMed + +__all__ = [ + "BACE", "BBBP", "CEP", "ClinTox", "Delaney", "FreeSolv", "HIV", "Lipophilicity", + "Malaria", "MOSES", "MUV", "OPV", "QM8", "QM9", "SIDER", "Tox21", "ToxCast", + "USPTO50k", "ZINC250k", + "ZINC2m", "PCQM4M", "PubChem110m", "ChEMBLFiltered", + "EnzymeCommission", "GeneOntology", "AlphaFoldDB", + "BetaLactamase", "Fluorescence", "Stability", "Solubility", "Fold", + "BinaryLocalization", "SubcellularLocalization", "SecondaryStructure", + "HumanPPI", "YeastPPI", "PPIAffinity", "BindingDB", "PDBBind", "ProteinNet", + "FB15k", "FB15k237", "WN18", "WN18RR", "Hetionet", + "Cora", "CiteSeer", "PubMed", +] diff --git a/build/lib/torchdrug/datasets/alphafolddb.py b/build/lib/torchdrug/datasets/alphafolddb.py new file mode 100644 index 00000000..c8ce6e88 --- /dev/null +++ b/build/lib/torchdrug/datasets/alphafolddb.py @@ -0,0 +1,155 @@ +import os +import glob + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.AlphaFoldDB") +@utils.copy_args(data.ProteinDataset.load_pdbs) +class AlphaFoldDB(data.ProteinDataset): + """ + 3D protein structures predicted by AlphaFold. + This dataset covers proteomes of 48 organisms, as well as the majority of Swiss-Prot. + + Statistics: + See https://alphafold.ebi.ac.uk/download + + Parameters: + path (str): path to store the dataset + species_id (int, optional): the id of species to be loaded. The species are numbered + by the order appeared on https://alphafold.ebi.ac.uk/download (0-20 for model + organism proteomes, 21 for Swiss-Prot) + split_id (int, optional): the id of split to be loaded. To avoid large memory consumption + for one dataset, we have cut each species into several splits, each of which contains + at most 22000 proteins. + verbose (int, optional): output verbose level + **kwargs + """ + + urls = [ + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000006548_3702_ARATH_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000001940_6239_CAEEL_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000000559_237561_CANAL_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000000437_7955_DANRE_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000002195_44689_DICDI_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000000803_7227_DROME_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000000625_83333_ECOLI_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000008827_3847_SOYBN_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000005640_9606_HUMAN_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000008153_5671_LEIIN_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000000805_243232_METJA_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000000589_10090_MOUSE_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000001584_83332_MYCTU_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000059680_39947_ORYSJ_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000001450_36329_PLAF7_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000002494_10116_RAT_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000002311_559292_YEAST_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000002485_284812_SCHPO_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000008816_93061_STAA8_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000002296_353153_TRYCC_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000007305_4577_MAIZE_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/swissprot_pdb_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000001631_447093_AJECG_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000006672_6279_BRUMA_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000000799_192222_CAMJE_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000094526_86049_9EURO1_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000274756_318479_DRAME_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000325664_1352_ENTFC_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000053029_1442368_9EURO2_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000000579_71421_HAEIN_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000000429_85962_HELPY_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000007841_1125630_KLEPH_v2.tar", + # "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000008153_5671_LEIIN_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000078237_100816_9PEZI1_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000000806_272631_MYCLE_v2.tar", + # "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000001584_83332_MYCTU_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000020681_1299332_MYCUL_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000000535_242231_NEIG1_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000006304_1133849_9NOCA1_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000024404_6282_ONCVO_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000002059_502779_PARBA_v2.tar", + # "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000001450_36329_PLAF7_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000002438_208964_PSEAE_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000001014_99287_SALTY_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000008854_6183_SCHMA_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000002716_300267_SHIDS_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000018087_1391915_SPOS1_v2.tar", + # "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000008816_93061_STAA8_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000000586_171101_STRR6_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000035681_6248_STRER_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000030665_36087_TRITR_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000008524_185431_TRYB2_v2.tar", + # "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000002296_353153_TRYCC_v2.tar", + "https://ftp.ebi.ac.uk/pub/databases/alphafold/v2/UP000270924_6293_WUCBA_v2.tar" + ] + md5s = [ + "4cd5f596ebfc3d45d9f6b647dc5684af", "b89bee5507f78f971417cc8fd75b40f7", "a6459a1f1a0a22fbf25f1c05c2889ae3", + "24dfba8ab93dbf3f51e7db6b912dd6b4", "6b81b3086ed9e57e04a54f148ecf974c", "a50f4fd9f581c89e79e1b2857e54b786", + "fdd16245769bf1f7d91a0e285ac00e52", "66b9750c511182bc5f8ee71fe2ab2a17", "5dadeb5aac704025cac33f7557794858", + "99b22e0f050d845782d914becbfe4d2f", "da938dfae4fabf6e144f4b5ede5885ec", "2003c09d437cfb4093552c588a33e06d", + "fba59f386cfa33af3f70ae664b7feac0", "d7a1a6c02213754ee1a1ffb3b41ad4ba", "8a0e8deadffec2aba3b7edd6534b7481", + "1854d0bbcf819de1de7b0cfdb6d32b2e", "d9720e3809db6916405db096b520c236", "6b918e9e4d645b12a80468bcea805f1f", + "ed0eefe927eb8c3b81cf87eaabbb8d6e", "051369e0dc8fed4798c8b2c68e6cbe2e", "b05ff57164167851651c625dca66ed28", + "68e7a6e57bd43cb52e344b3190073387", "75d027ac7833f284fda65ea620353e8a", "7d85bb2ee4130096a6d905ab8d726bcc", + "63498210c88e8bfb1a7346c4ddf73bb1", "5bf2211304ef91d60bb3838ec12d89cd", "4981758eb8980e9df970ac6113e4084c", + "322431789942595b599d2b86670f41b3", "35d7b32e37bcc23d02b12b03b1e0c093", "1b8847dd786fa41b5b38f5e7aa58b813", + "126bdbe59fa82d55bfa098b710bdf650", "6c6d3248ed943dd7137637fc92d7ba37", "532203c6877433df5651b95d27685825", + "6e7112411da5843bec576271c44e0a0a", "0e4f913a9b4672b0ad3cc9c4f2de5c8d", "a138d0060b2e8a0ef1f90cf3ab7b7ca0", + "04d491dd1c679e91b5a2f3b9f14db555", "889c051e39305614accdff00414bfa67", "cd87cf24e5135c9d729940194ccc65c8", + "75eb8bfe866cf3040f4c08a566c32bc1", "fd8e6ddb9c159aab781a11c287c85feb", "b91a2e103980b96f755712f2b559ad66", + "26187d09b093649686d7c158aa4fd113", "62e16894bb4b8951a82befd24ad4ee21", "85c001df1d91788bf3cc1f97230b1dac", + "91a25af808351757b101a8c9c787db9e", "8b3e8645cc4c2484c331759b9d1df5bc", "e8a76a6ab290e6743233510e8d1eb4a5", + "38280bd7804f4c060b0775c4abed9b89" + ] + species_nsplit = [ + 2, 1, 1, 2, 1, 1, 1, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 20, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, #1, 1, 1, 1, 1 + ] + split_length = 22000 + + def __init__(self, path, species_id=0, split_id=0, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + species_name = os.path.basename(self.urls[species_id])[:-4] + if split_id >= self.species_nsplit[species_id]: + raise ValueError("Split id %d should be less than %d in species %s" % + (split_id, self.species_nsplit[species_id], species_name)) + self.processed_file = "%s_%d.pkl.gz" % (species_name, split_id) + pkl_file = os.path.join(path, self.processed_file) + + if os.path.exists(pkl_file): + self.load_pickle(pkl_file, verbose=verbose, **kwargs) + else: + tar_file = utils.download(self.urls[species_id], path, md5=self.md5s[species_id]) + pdb_path = utils.extract(tar_file) + gz_files = sorted(glob.glob(os.path.join(pdb_path, "*.pdb.gz"))) + pdb_files = [] + index = slice(split_id * self.split_length, (split_id + 1) * self.split_length) + for gz_file in gz_files[index]: + pdb_files.append(utils.extract(gz_file)) + self.load_pdbs(pdb_files, verbose=verbose, **kwargs) + self.save_pickle(pkl_file, verbose=verbose) + + def get_item(self, index): + if getattr(self, "lazy", False): + protein = data.Protein.from_pdb(self.pdb_files[index], self.kwargs) + else: + protein = self.data[index].clone() + if hasattr(protein, "residue_feature"): + with protein.residue(): + protein.residue_feature = protein.residue_feature.to_dense() + item = {"graph": protein} + if self.transform: + item = self.transform(item) + return item + + def __repr__(self): + lines = [ + "#sample: %d" % len(self), + ] + return "%s(\n %s\n)" % (self.__class__.__name__, "\n ".join(lines)) diff --git a/build/lib/torchdrug/datasets/bace.py b/build/lib/torchdrug/datasets/bace.py new file mode 100644 index 00000000..f3dc53b3 --- /dev/null +++ b/build/lib/torchdrug/datasets/bace.py @@ -0,0 +1,36 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.BACE") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class BACE(data.MoleculeDataset): + r""" + Binary binding results for a set of inhibitors of human :math:`\beta`-secretase 1(BACE-1). + + Statistics: + - #Molecule: 1,513 + - #Classification task: 1 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://deepchem.io.s3-website-us-west-1.amazonaws.com/datasets/bace.csv" + md5 = "ba7f8fa3fdf463a811fa7edea8c982c2" + target_fields = ["Class"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + file_name = utils.download(self.url, path, md5=self.md5) + + self.load_csv(file_name, smiles_field="mol", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/bbbp.py b/build/lib/torchdrug/datasets/bbbp.py new file mode 100644 index 00000000..3256419a --- /dev/null +++ b/build/lib/torchdrug/datasets/bbbp.py @@ -0,0 +1,36 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.BBBP") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class BBBP(data.MoleculeDataset): + """ + Binary labels of blood-brain barrier penetration. + + Statistics: + - #Molecule: 2,039 + - #Classification task: 1 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://deepchem.io.s3-website-us-west-1.amazonaws.com/datasets/BBBP.csv" + md5 = "66286cb9e6b148bd75d80c870df580fb" + target_fields = ["p_np"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + file_name = utils.download(self.url, path, md5=self.md5) + + self.load_csv(file_name, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/beta_lactamase.py b/build/lib/torchdrug/datasets/beta_lactamase.py new file mode 100644 index 00000000..3b50c64f --- /dev/null +++ b/build/lib/torchdrug/datasets/beta_lactamase.py @@ -0,0 +1,51 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.BetaLactamase") +@utils.copy_args(data.ProteinDataset.load_lmdbs, ignore=("target_fields",)) +class BetaLactamase(data.ProteinDataset): + """ + The activity values of first-order mutants of the TEM-1 beta-lactamase protein. + + Statistics: + - #Train: 4,158 + - #Valid: 520 + - #Test: 520 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://miladeepgraphlearningproteindata.s3.us-east-2.amazonaws.com/peerdata/beta_lactamase.tar.gz" + md5 = "65766a3969cc0e94b101d4063d204ba4" + splits = ["train", "valid", "test"] + target_fields = ["scaled_effect1"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "beta_lactamase/beta_lactamase_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, target_fields=self.target_fields, verbose=verbose, **kwargs) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/binary_localization.py b/build/lib/torchdrug/datasets/binary_localization.py new file mode 100644 index 00000000..d7b8d95e --- /dev/null +++ b/build/lib/torchdrug/datasets/binary_localization.py @@ -0,0 +1,52 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.BinaryLocalization") +@utils.copy_args(data.ProteinDataset.load_lmdbs, ignore=("target_fields",)) +class BinaryLocalization(data.ProteinDataset): + """ + Simpler version of the Subcellular Localization with binary labels indicating + whether a protein is membrane-bound or soluble. + + Statistics: + - #Train: 5,161 + - #Valid: 1,727 + - #Test: 1,746 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://miladeepgraphlearningproteindata.s3.us-east-2.amazonaws.com/peerdata/subcellular_localization_2.tar.gz" + md5 = "5d2309bf1c0c2aed450102578e434f4e" + splits = ["train", "valid", "test"] + target_fields = ["localization"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "subcellular_localization_2/subcellular_localization_2_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, target_fields=self.target_fields, verbose=verbose, **kwargs) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/bindingdb.py b/build/lib/torchdrug/datasets/bindingdb.py new file mode 100644 index 00000000..03d8ae9a --- /dev/null +++ b/build/lib/torchdrug/datasets/bindingdb.py @@ -0,0 +1,72 @@ +import os + +from rdkit import Chem + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.BindingDB") +@utils.copy_args(data.ProteinLigandDataset.load_lmdbs, ignore=("sequence_field", "smiles_field", "target_fields")) +class BindingDB(data.ProteinLigandDataset): + """ + The BindingDB dataset with binding affinity indicating the interaction strength + between pairs of protein and ligand. + + Statistics: + - #Train: 7,900 + - #Valid: 878 + - #Test: 5,230 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://miladeepgraphlearningproteindata.s3.us-east-2.amazonaws.com/peerdata/BindingDB_Kd.tar.gz" + md5 = "0b207cb962c4945f9003fc020b415a74" + splits = ["train", "valid", "random_test", "holdout_test"] + target_fields = ["affinity"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "BindingDB_Kd_%s.lmdb" % split) for split in self.splits] + + self.load_lmdbs(lmdb_files, sequence_field="target", smiles_field="drug", + target_fields=self.target_fields, verbose=verbose, **kwargs) + + def split(self, keys=None): + keys = keys or self.splits + offset = 0 + splits = [] + for split_name, num_sample in zip(self.splits, self.num_samples): + if split_name in keys: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits + + def get_item(self, index): + if self.lazy: + graph1 = data.Protein.from_sequence(self.sequences[index], **self.kwargs) + mol = Chem.MolFromSmiles(self.smiles[index]) + if not mol: + graph2 = None + else: + graph2 = data.Molecule.from_molecule(mol, **self.kwargs) + else: + graph1 = self.data[index][0] + graph2 = self.data[index][1] + item = {"graph1": graph1, "graph2": graph2} + item.update({k: v[index] for k, v in self.targets.items()}) + if self.transform: + item = self.transform(item) + return item \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/cep.py b/build/lib/torchdrug/datasets/cep.py new file mode 100644 index 00000000..44a1b805 --- /dev/null +++ b/build/lib/torchdrug/datasets/cep.py @@ -0,0 +1,36 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.CEP") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class CEP(data.MoleculeDataset): + """ + Photovoltaic efficiency estimated by Havard clean energy project. + + Statistics: + - #Molecule: 20,000 + - #Regression task: 1 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://raw.githubusercontent.com/HIPS/neural-fingerprint/master/data/2015-06-02-cep-pce/cep-processed.csv" + md5 = "b6d257ff416917e4e6baa5e1103f3929" + target_fields = ["PCE"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + file_name = utils.download(self.url, self.path, md5=self.md5) + + self.load_csv(file_name, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) diff --git a/build/lib/torchdrug/datasets/chembl_filtered.py b/build/lib/torchdrug/datasets/chembl_filtered.py new file mode 100644 index 00000000..74f3ea68 --- /dev/null +++ b/build/lib/torchdrug/datasets/chembl_filtered.py @@ -0,0 +1,36 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.ChEMBLFiltered") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class ChEMBLFiltered(data.MoleculeDataset): + """ + Statistics: + - #Molecule: 430,710 + - #Regression task: 1,310 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://zenodo.org/record/5528681/files/chembl_filtered_torchdrug.csv.gz" + md5 = "2fff04fecd6e697f28ebb127e8a37561" + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + csv_file = utils.extract(zip_file) + + self.target_fields = ["target_{}".format(i) for i in range(1310)] + + self.load_csv(csv_file, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/citeseer.py b/build/lib/torchdrug/datasets/citeseer.py new file mode 100644 index 00000000..d61f0a49 --- /dev/null +++ b/build/lib/torchdrug/datasets/citeseer.py @@ -0,0 +1,35 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.CiteSeer") +class CiteSeer(data.NodeClassificationDataset): + """ + A citation network of scientific publications with binary word features. + + Statistics: + - #Node: 3,327 + - #Edge: 8,059 + - #Class: 6 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + """ + + url = "https://linqs-data.soe.ucsc.edu/public/lbc/citeseer.tgz" + md5 = "c8ded8ed395b31899576bfd1e91e4d6e" + + def __init__(self, path, verbose=1): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + node_file = utils.extract(zip_file, "citeseer/citeseer.content") + edge_file = utils.extract(zip_file, "citeseer/citeseer.cites") + + self.load_tsv(node_file, edge_file, verbose=verbose) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/clintox.py b/build/lib/torchdrug/datasets/clintox.py new file mode 100644 index 00000000..aba7a440 --- /dev/null +++ b/build/lib/torchdrug/datasets/clintox.py @@ -0,0 +1,38 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.ClinTox") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class ClinTox(data.MoleculeDataset): + """ + Qualitative data of drugs approved by the FDA and those that have failed clinical + trials for toxicity reasons. + + Statistics: + - #Molecule: 1,478 + - #Classification task: 2 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://deepchem.io.s3-website-us-west-1.amazonaws.com/datasets/clintox.csv.gz" + md5 = "db4f2df08be8ae92814e9d6a2d015284" + target_fields = ["FDA_APPROVED", "CT_TOX"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + csv_file = utils.extract(zip_file) + + self.load_csv(csv_file, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/cora.py b/build/lib/torchdrug/datasets/cora.py new file mode 100644 index 00000000..72935a97 --- /dev/null +++ b/build/lib/torchdrug/datasets/cora.py @@ -0,0 +1,35 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.Cora") +class Cora(data.NodeClassificationDataset): + """ + A citation network of scientific publications with binary word features. + + Statistics: + - #Node: 2,708 + - #Edge: 5,429 + - #Class: 7 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + """ + + url = "https://linqs-data.soe.ucsc.edu/public/lbc/cora.tgz" + md5 = "2fc040bee8ce3d920e4204effd1e9214" + + def __init__(self, path, verbose=1): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + node_file = utils.extract(zip_file, "cora/cora.content") + edge_file = utils.extract(zip_file, "cora/cora.cites") + + self.load_tsv(node_file, edge_file, verbose=verbose) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/delaney.py b/build/lib/torchdrug/datasets/delaney.py new file mode 100644 index 00000000..b744eadd --- /dev/null +++ b/build/lib/torchdrug/datasets/delaney.py @@ -0,0 +1,36 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.Delaney") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class Delaney(data.MoleculeDataset): + """ + Log-scale water solubility of molecules. + + Statistics: + - #Molecule: 1,128 + - #Regression task: 1 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://deepchem.io.s3-website-us-west-1.amazonaws.com/datasets/delaney-processed.csv" + md5 = "0c90a51668d446b9e3ab77e67662bd1c" + target_fields = ["measured log solubility in mols per litre"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + file_name = utils.download(self.url, self.path, md5=self.md5) + + self.load_csv(file_name, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/enzyme_commission.py b/build/lib/torchdrug/datasets/enzyme_commission.py new file mode 100644 index 00000000..799b9a02 --- /dev/null +++ b/build/lib/torchdrug/datasets/enzyme_commission.py @@ -0,0 +1,135 @@ +import os +import csv +import glob + +import torch +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.EnzymeCommission") +@utils.copy_args(data.ProteinDataset.load_pdbs) +class EnzymeCommission(data.ProteinDataset): + """ + A set of proteins with their 3D structures and EC numbers, which describes their + catalysis of biochemical reactions. + + Statistics (test_cutoff=0.95): + - #Train: 15,011 + - #Valid: 1,664 + - #Test: 1,840 + + Parameters: + path (str): the path to store the dataset + test_cutoff (float, optional): the test cutoff used to split the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://zenodo.org/record/6622158/files/EnzymeCommission.zip" + md5 = "33f799065f8ad75f87b709a87293bc65" + processed_file = "enzyme_commission.pkl.gz" + test_cutoffs = [0.3, 0.4, 0.5, 0.7, 0.95] + + def __init__(self, path, test_cutoff=0.95, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + if test_cutoff not in self.test_cutoffs: + raise ValueError("Unknown test cutoff `%.2f` for EnzymeCommission dataset" % test_cutoff) + self.test_cutoff = test_cutoff + + zip_file = utils.download(self.url, path, md5=self.md5) + path = os.path.join(utils.extract(zip_file), "EnzymeCommission") + pkl_file = os.path.join(path, self.processed_file) + + csv_file = os.path.join(path, "nrPDB-EC_test.csv") + pdb_ids = [] + with open(csv_file, "r") as fin: + reader = csv.reader(fin, delimiter=",") + idx = self.test_cutoffs.index(test_cutoff) + 1 + _ = next(reader) + for line in reader: + if line[idx] == "0": + pdb_ids.append(line[0]) + + if os.path.exists(pkl_file): + self.load_pickle(pkl_file, verbose=verbose, **kwargs) + else: + pdb_files = [] + for split in ["train", "valid", "test"]: + split_path = utils.extract(os.path.join(path, "%s.zip" % split)) + pdb_files += sorted(glob.glob(os.path.join(split_path, split, "*.pdb"))) + self.load_pdbs(pdb_files, verbose=verbose, **kwargs) + self.save_pickle(pkl_file, verbose=verbose) + if len(pdb_ids) > 0: + self.filter_pdb(pdb_ids) + + tsv_file = os.path.join(path, "nrPDB-EC_annot.tsv") + pdb_ids = [os.path.basename(pdb_file).split("_")[0] for pdb_file in self.pdb_files] + self.load_annotation(tsv_file, pdb_ids) + + splits = [os.path.basename(os.path.dirname(pdb_file)) for pdb_file in self.pdb_files] + self.num_samples = [splits.count("train"), splits.count("valid"), splits.count("test")] + + def filter_pdb(self, pdb_ids): + pdb_ids = set(pdb_ids) + sequences = [] + pdb_files = [] + data = [] + for sequence, pdb_file, protein in zip(self.sequences, self.pdb_files, self.data): + if os.path.basename(pdb_file).split("_")[0] in pdb_ids: + continue + sequences.append(sequence) + pdb_files.append(pdb_file) + data.append(protein) + self.sequences = sequences + self.pdb_files = pdb_files + self.data = data + + def load_annotation(self, tsv_file, pdb_ids): + with open(tsv_file, "r") as fin: + reader = csv.reader(fin, delimiter="\t") + _ = next(reader) + tasks = next(reader) + task2id = {task: i for i, task in enumerate(tasks)} + _ = next(reader) + pos_targets = {} + for pdb_id, pos_target in reader: + pos_target = [task2id[t] for t in pos_target.split(",")] + pos_target = torch.tensor(pos_target) + pos_targets[pdb_id] = pos_target + + # fake targets to enable the property self.tasks + self.targets = task2id + self.pos_targets = [] + for pdb_id in pdb_ids: + self.pos_targets.append(pos_targets[pdb_id]) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits + + def get_item(self, index): + if getattr(self, "lazy", False): + protein = data.Protein.from_pdb(self.pdb_files[index], self.kwargs) + else: + protein = self.data[index].clone() + if hasattr(protein, "residue_feature"): + with protein.residue(): + protein.residue_feature = protein.residue_feature.to_dense() + item = {"graph": protein} + if self.transform: + item = self.transform(item) + indices = self.pos_targets[index].unsqueeze(0) + values = torch.ones(len(self.pos_targets[index])) + item["targets"] = utils.sparse_coo_tensor(indices, values, (len(self.tasks),)).to_dense() + return item \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/fb15k.py b/build/lib/torchdrug/datasets/fb15k.py new file mode 100644 index 00000000..9a12fe97 --- /dev/null +++ b/build/lib/torchdrug/datasets/fb15k.py @@ -0,0 +1,106 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.FB15k") +class FB15k(data.KnowledgeGraphDataset): + """ + Subset of Freebase knowledge base for knowledge graph reasoning. + + Statistics: + - #Entity: 14,951 + - #Relation: 1,345 + - #Triplet: 592,213 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + """ + + urls = [ + "https://github.com/DeepGraphLearning/KnowledgeGraphEmbedding/raw/master/data/FB15k/train.txt", + "https://github.com/DeepGraphLearning/KnowledgeGraphEmbedding/raw/master/data/FB15k/valid.txt", + "https://github.com/DeepGraphLearning/KnowledgeGraphEmbedding/raw/master/data/FB15k/test.txt", + ] + md5s = [ + "5a87195e68d7797af00e137a7f6929f2", + "275835062bb86a86477a3c402d20b814", + "71098693b0efcfb8ac6cd61cf3a3b505" + ] + + def __init__(self, path, verbose=1): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + txt_files = [] + for url, md5 in zip(self.urls, self.md5s): + save_file = "fb15k_%s" % os.path.basename(url) + txt_file = utils.download(url, self.path, save_file=save_file, md5=md5) + txt_files.append(txt_file) + + self.load_tsvs(txt_files, verbose=verbose) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits + + +@R.register("datasets.FB15k237") +class FB15k237(data.KnowledgeGraphDataset): + """ + A filtered version of FB15k dataset without trivial cases. + + Statistics: + - #Entity: 14,541 + - #Relation: 237 + - #Triplet: 310,116 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + """ + + urls = [ + "https://github.com/DeepGraphLearning/KnowledgeGraphEmbedding/raw/master/data/FB15k-237/train.txt", + "https://github.com/DeepGraphLearning/KnowledgeGraphEmbedding/raw/master/data/FB15k-237/valid.txt", + "https://github.com/DeepGraphLearning/KnowledgeGraphEmbedding/raw/master/data/FB15k-237/test.txt", + ] + md5s = [ + "c05b87b9ac00f41901e016a2092d7837", + "6a94efd530e5f43fcf84f50bc6d37b69", + "f5bdf63db39f455dec0ed259bb6f8628" + ] + + def __init__(self, path, verbose=1): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + txt_files = [] + for url, md5 in zip(self.urls, self.md5s): + save_file = "fb15k237_%s" % os.path.basename(url) + txt_file = utils.download(url, self.path, save_file=save_file, md5=md5) + txt_files.append(txt_file) + + self.load_tsvs(txt_files, verbose=verbose) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/fluorescence.py b/build/lib/torchdrug/datasets/fluorescence.py new file mode 100644 index 00000000..81d31d05 --- /dev/null +++ b/build/lib/torchdrug/datasets/fluorescence.py @@ -0,0 +1,51 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.Fluorescence") +@utils.copy_args(data.ProteinDataset.load_lmdbs, ignore=("target_fields",)) +class Fluorescence(data.ProteinDataset): + """ + The fitness values of a set of green fluorescent protein mutants. + + Statistics: + - #Train: 21,446 + - #Valid: 5,362 + - #Test: 27,217 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://s3.amazonaws.com/songlabdata/proteindata/data_pytorch/fluorescence.tar.gz" + md5 = "d63d1d51ec8c20ff0d981e4cbd67457a" + splits = ["train", "valid", "test"] + target_fields = ["log_fluorescence"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "fluorescence/fluorescence_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, target_fields=self.target_fields, verbose=verbose, **kwargs) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/fold.py b/build/lib/torchdrug/datasets/fold.py new file mode 100644 index 00000000..a41a8c3b --- /dev/null +++ b/build/lib/torchdrug/datasets/fold.py @@ -0,0 +1,53 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.Fold") +@utils.copy_args(data.ProteinDataset.load_lmdbs, ignore=("target_fields",)) +class Fold(data.ProteinDataset): + """ + Fold labels for a set of proteins determined by the global structural topology. + + Statistics: + - #Train: 12,312 + - #Valid: 736 + - #Test: 718 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://s3.amazonaws.com/songlabdata/proteindata/data_pytorch/remote_homology.tar.gz" + md5 = "1d687bdeb9e3866f77504d6079eed00a" + splits = ["train", "valid", "test_fold_holdout", "test_family_holdout", "test_superfamily_holdout"] + target_fields = ["fold_label"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "remote_homology/remote_homology_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, target_fields=self.target_fields, verbose=verbose, **kwargs) + + def split(self, keys=None): + keys = keys or self.splits + offset = 0 + splits = [] + for split_name, num_sample in zip(self.splits, self.num_samples): + if split_name in keys: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/freesolv.py b/build/lib/torchdrug/datasets/freesolv.py new file mode 100644 index 00000000..51ae15b9 --- /dev/null +++ b/build/lib/torchdrug/datasets/freesolv.py @@ -0,0 +1,37 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.FreeSolv") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class FreeSolv(data.MoleculeDataset): + """ + Experimental and calculated hydration free energy of small molecules in water. + + Statistics: + - #Molecule: 642 + - #Regression task: 1 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://s3-us-west-1.amazonaws.com/deepchem.io/datasets/molnet_publish/FreeSolv.zip" + md5 = "8d681babd239b15e2f8b2d29f025577a" + target_fields = ["expt"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, self.path, md5=self.md5) + csv_file = utils.extract(zip_file, "SAMPL.csv") + + self.load_csv(csv_file, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/gene_ontology.py b/build/lib/torchdrug/datasets/gene_ontology.py new file mode 100644 index 00000000..68ea4427 --- /dev/null +++ b/build/lib/torchdrug/datasets/gene_ontology.py @@ -0,0 +1,145 @@ +import os +import csv +import glob + +import torch +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.GeneOntology") +@utils.copy_args(data.ProteinDataset.load_pdbs) +class GeneOntology(data.ProteinDataset): + """ + A set of proteins with their 3D structures and GO terms. These terms classify proteins + into hierarchically related functional classes organized into three ontologies: molecular + function (MF), biological process (BP) and cellular component (CC). + + Statistics (test_cutoff=0.95): + - #Train: 27,496 + - #Valid: 3,053 + - #Test: 2,991 + + Parameters: + path (str): the path to store the dataset + branch (str, optional): the GO branch + test_cutoff (float, optional): the test cutoff used to split the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://zenodo.org/record/6622158/files/GeneOntology.zip" + md5 = "376be1f088cd1fe720e1eaafb701b5cb" + branches = ["MF", "BP", "CC"] + processed_file = "gene_ontology.pkl.gz" + test_cutoffs = [0.3, 0.4, 0.5, 0.7, 0.95] + + def __init__(self, path, branch="MF", test_cutoff=0.95, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + if branch not in self.branches: + raise ValueError("Unknown branch `%s` for GeneOntology dataset" % branch) + self.branch = branch + if test_cutoff not in self.test_cutoffs: + raise ValueError("Unknown test cutoff `%.2f` for GeneOntology dataset" % test_cutoff) + self.test_cutoff = test_cutoff + + zip_file = utils.download(self.url, path, md5=self.md5) + path = os.path.join(utils.extract(zip_file), "GeneOntology") + pkl_file = os.path.join(path, self.processed_file) + + csv_file = os.path.join(path, "nrPDB-GO_test.csv") + pdb_ids = [] + with open(csv_file, "r") as fin: + reader = csv.reader(fin, delimiter=",") + idx = self.test_cutoffs.index(test_cutoff) + 1 + _ = next(reader) + for line in reader: + if line[idx] == "0": + pdb_ids.append(line[0]) + + if os.path.exists(pkl_file): + self.load_pickle(pkl_file, verbose=verbose, **kwargs) + else: + pdb_files = [] + for split in ["train", "valid", "test"]: + split_path = utils.extract(os.path.join(path, "%s.zip" % split)) + pdb_files += sorted(glob.glob(os.path.join(split_path, split, "*.pdb"))) + self.load_pdbs(pdb_files, verbose=verbose, **kwargs) + self.save_pickle(pkl_file, verbose=verbose) + if len(pdb_ids) > 0: + self.filter_pdb(pdb_ids) + + tsv_file = os.path.join(path, "nrPDB-GO_annot.tsv") + pdb_ids = [os.path.basename(pdb_file).split("_")[0] for pdb_file in self.pdb_files] + self.load_annotation(tsv_file, pdb_ids) + + splits = [os.path.basename(os.path.dirname(pdb_file)) for pdb_file in self.pdb_files] + self.num_samples = [splits.count("train"), splits.count("valid"), splits.count("test")] + + def filter_pdb(self, pdb_ids): + pdb_ids = set(pdb_ids) + sequences = [] + pdb_files = [] + data = [] + for sequence, pdb_file, protein in zip(self.sequences, self.pdb_files, self.data): + if os.path.basename(pdb_file).split("_")[0] in pdb_ids: + continue + sequences.append(sequence) + pdb_files.append(pdb_file) + data.append(protein) + self.sequences = sequences + self.pdb_files = pdb_files + self.data = data + + def load_annotation(self, tsv_file, pdb_ids): + idx = self.branches.index(self.branch) + with open(tsv_file, "r") as fin: + reader = csv.reader(fin, delimiter="\t") + for i in range(12): + _ = next(reader) + if i == idx * 4 + 1: + tasks = _ + task2id = {task: i for i, task in enumerate(tasks)} + _ = next(reader) + pos_targets = {} + for line in reader: + pdb_id, pos_target = line[0], line[idx + 1] if idx + 1 < len(line) else None + pos_target = [task2id[t] for t in pos_target.split(",")] if pos_target else [] + pos_target = torch.LongTensor(pos_target) + pos_targets[pdb_id] = pos_target + + # fake targets to enable the property self.tasks + self.targets = task2id + self.pos_targets = [] + for pdb_id in pdb_ids: + self.pos_targets.append(pos_targets[pdb_id]) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits + + def get_item(self, index): + if getattr(self, "lazy", False): + protein = data.Protein.from_pdb(self.pdb_files[index], self.kwargs) + else: + protein = self.data[index].clone() + if hasattr(protein, "residue_feature"): + with protein.residue(): + protein.residue_feature = protein.residue_feature.to_dense() + item = {"graph": protein} + if self.transform: + item = self.transform(item) + indices = self.pos_targets[index].unsqueeze(0) + values = torch.ones(len(self.pos_targets[index])) + item["targets"] = utils.sparse_coo_tensor(indices, values, (len(self.tasks),)).to_dense() + return item \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/hetionet.py b/build/lib/torchdrug/datasets/hetionet.py new file mode 100644 index 00000000..83aadee2 --- /dev/null +++ b/build/lib/torchdrug/datasets/hetionet.py @@ -0,0 +1,57 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.Hetionet") +class Hetionet(data.KnowledgeGraphDataset): + """ + Hetionet for knowledge graph reasoning. + + Statistics: + - #Entity: 45,158 + - #Relation: 24 + - #Triplet: 2,025,177 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + """ + + urls = [ + "https://www.dropbox.com/s/y47bt9oq57h6l5k/train.txt?dl=1", + "https://www.dropbox.com/s/a0pbrx9tz3dgsff/valid.txt?dl=1", + "https://www.dropbox.com/s/4dhrvg3fyq5tnu4/test.txt?dl=1", + ] + md5s = [ + "6e58915d70ce6d9389c6e4785245e0b3", + "77f15fac4f8170b836392a5b1d315afa", + "e8877aafe89d0c9b9c1efb9027cb7226" + ] + + def __init__(self, path, verbose=1): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + txt_files = [] + for url, md5 in zip(self.urls, self.md5s): + save_file = "hetionet_%s.txt" % os.path.splitext(os.path.basename(url))[0] + txt_file = utils.download(url, self.path, save_file=save_file, md5=md5) + txt_files.append(txt_file) + + self.load_tsvs(txt_files, verbose=verbose) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits + diff --git a/build/lib/torchdrug/datasets/hiv.py b/build/lib/torchdrug/datasets/hiv.py new file mode 100644 index 00000000..f6ec3023 --- /dev/null +++ b/build/lib/torchdrug/datasets/hiv.py @@ -0,0 +1,36 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.HIV") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class HIV(data.MoleculeDataset): + """ + Experimentally measured abilities to inhibit HIV replication. + + Statistics: + - #Molecule: 41,127 + - #Classification task: 1 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://deepchem.io.s3-website-us-west-1.amazonaws.com/datasets/HIV.csv" + md5 = "9ad10c88f82f1dac7eb5c52b668c30a7" + target_fields = ["HIV_active"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + file_name = utils.download(self.url, path, md5=self.md5) + + self.load_csv(file_name, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/human_ppi.py b/build/lib/torchdrug/datasets/human_ppi.py new file mode 100644 index 00000000..da149a10 --- /dev/null +++ b/build/lib/torchdrug/datasets/human_ppi.py @@ -0,0 +1,67 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.HumanPPI") +@utils.copy_args(data.ProteinPairDataset.load_lmdbs, ignore=("sequence_field", "target_fields")) +class HumanPPI(data.ProteinPairDataset): + """ + Binary labels indicating whether two human proteins interact or not. + + Statistics: + - #Train: 6,844 + - #Valid: 277 + - #Test: 227 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://miladeepgraphlearningproteindata.s3.us-east-2.amazonaws.com/ppidata/human_ppi.zip" + md5 = "89885545ebc2c11d774c342910230e20" + splits = ["train", "valid", "test", "cross_species_test"] + target_fields = ["interaction"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "human_ppi/human_ppi_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, sequence_field=["primary_1", "primary_2"], target_fields=self.target_fields, + verbose=verbose, **kwargs) + + def split(self, keys=None): + keys = keys or self.splits + offset = 0 + splits = [] + for split_name, num_sample in zip(self.splits, self.num_samples): + if split_name in keys: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits + + def get_item(self, index): + if self.lazy: + graph1 = data.Protein.from_sequence(self.sequences[index][0], **self.kwargs) + graph2 = data.Protein.from_sequence(self.sequences[index][1], **self.kwargs) + else: + graph1 = self.data[index][0] + graph2 = self.data[index][1] + item = {"graph1": graph1, "graph2": graph2} + item.update({k: v[index] for k, v in self.targets.items()}) + if self.transform: + item = self.transform(item) + return item \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/lipophilicity.py b/build/lib/torchdrug/datasets/lipophilicity.py new file mode 100644 index 00000000..73935a58 --- /dev/null +++ b/build/lib/torchdrug/datasets/lipophilicity.py @@ -0,0 +1,36 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.Lipophilicity") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class Lipophilicity(data.MoleculeDataset): + """ + Experimental results of octanol/water distribution coefficient (logD at pH 7.4). + + Statistics: + - #Molecule: 4,200 + - #Regression task: 1 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://deepchem.io.s3-website-us-west-1.amazonaws.com/datasets/Lipophilicity.csv" + md5 = "85a0e1cb8b38b0dfc3f96ff47a57f0ab" + target_fields = ["exp"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + file_name = utils.download(self.url, self.path, md5=self.md5) + + self.load_csv(file_name, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) diff --git a/build/lib/torchdrug/datasets/malaria.py b/build/lib/torchdrug/datasets/malaria.py new file mode 100644 index 00000000..0ae4078b --- /dev/null +++ b/build/lib/torchdrug/datasets/malaria.py @@ -0,0 +1,37 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.Malaria") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class Malaria(data.MoleculeDataset): + """ + Half-maximal effective concentration (EC50) against a parasite that causes malaria. + + Statistics: + - #Molecule: 10,000 + - #Regression task: 1 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://raw.githubusercontent.com/HIPS/neural-fingerprint/master/data/2015-06-03-malaria/" \ + "malaria-processed.csv" + md5 = "ef40ddfd164be0e5ed1bd3dd0cce9b88" + target_fields = ["activity"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + file_name = utils.download(self.url, self.path, md5=self.md5) + + self.load_csv(file_name, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/moses.py b/build/lib/torchdrug/datasets/moses.py new file mode 100644 index 00000000..83fca6c7 --- /dev/null +++ b/build/lib/torchdrug/datasets/moses.py @@ -0,0 +1,48 @@ +import os +from collections import defaultdict + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.MOSES") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class MOSES(data.MoleculeDataset): + """ + Subset of ZINC database for molecule generation. + This dataset doesn't contain any label information. + + Statistics: + - #Molecule: 1,936,963 + + Parameters: + path (str): path for the CSV dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://media.githubusercontent.com/media/molecularsets/moses/master/data/dataset_v1.csv" + md5 = "6bdb0d9526ddf5fdeb87d6aa541df213" + target_fields = ["SPLIT"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + file_name = utils.download(self.url, path, md5=self.md5) + + self.load_csv(file_name, smiles_field="SMILES", target_fields=self.target_fields, + lazy=True, verbose=verbose, **kwargs) + + def split(self): + indexes = defaultdict(list) + for i, split in enumerate(self.targets["SPLIT"]): + indexes[split].append(i) + train_set = torch_data.Subset(self, indexes["train"]) + valid_set = torch_data.Subset(self, indexes["valid"]) + test_set = torch_data.Subset(self, indexes["test"]) + return train_set, valid_set, test_set diff --git a/build/lib/torchdrug/datasets/muv.py b/build/lib/torchdrug/datasets/muv.py new file mode 100644 index 00000000..ffa283b3 --- /dev/null +++ b/build/lib/torchdrug/datasets/muv.py @@ -0,0 +1,38 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.MUV") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class MUV(data.MoleculeDataset): + """ + Subset of PubChem BioAssay by applying a refined nearest neighbor analysis. + + Statistics: + - #Molecule: 93,087 + - #Classification task: 17 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://deepchem.io.s3-website-us-west-1.amazonaws.com/datasets/muv.csv.gz" + md5 = "9c40bd41310991efd40f4d4868fa3ddf" + target_fields = ["MUV-466", "MUV-548", "MUV-600", "MUV-644", "MUV-652", "MUV-689", "MUV-692", "MUV-712", "MUV-713", + "MUV-733", "MUV-737", "MUV-810", "MUV-832", "MUV-846", "MUV-852", "MUV-858", "MUV-859"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + csv_file = utils.extract(zip_file) + + self.load_csv(csv_file, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/opv.py b/build/lib/torchdrug/datasets/opv.py new file mode 100644 index 00000000..728c3ed8 --- /dev/null +++ b/build/lib/torchdrug/datasets/opv.py @@ -0,0 +1,97 @@ +import os +import csv +import math +from collections import defaultdict +from tqdm import tqdm + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.OPV") +@utils.copy_args(data.MoleculeDataset.load_smiles) +class OPV(data.MoleculeDataset): + """ + Quantum mechanical calculations on organic photovoltaic candidate molecules. + + Statistics: + - #Molecule: 94,576 + - #Regression task: 8 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + train_url = "https://cscdata.nrel.gov/api/datasets/ad5d2c9a-af0a-4d72-b943-1e433d5750d6/download/" \ + "b69cf9a5-e7e0-405b-88cb-40df8007242e" + valid_url = "https://cscdata.nrel.gov/api/datasets/ad5d2c9a-af0a-4d72-b943-1e433d5750d6/download/" \ + "1c8e7379-3071-4360-ba8e-0c6481c33d2c" + test_url = "https://cscdata.nrel.gov/api/datasets/ad5d2c9a-af0a-4d72-b943-1e433d5750d6/download/" \ + "4ef40592-0080-4f00-9bb7-34b25f94962a" + train_md5 = "16e439b7411ea0a8d3a56ba4802b61b1" + valid_md5 = "3aa2ac62015932ca84661feb5d29adda" + test_md5 = "bad072224f0755478f0729476ca99a33" + target_fields = ["gap", "homo", "lumo", "spectral_overlap", "gap_extrapolated", "homo_extrapolated", + "lumo_extrapolated", "optical_lumo_extrapolated"] + + def read_csv(self, csv_file, smiles_field="smiles", target_fields=None, verbose=0): + if target_fields is not None: + target_fields = set(target_fields) + + with open(csv_file, "r") as fin: + reader = csv.reader(fin) + if verbose: + reader = iter(tqdm(reader, "Loading %s" % csv_file, utils.get_line_count(csv_file))) + fields = next(reader) + smiles = [] + targets = defaultdict(list) + for i, values in enumerate(reader): + if not any(values): + continue + if smiles_field is None: + smiles.append("") + for field, value in zip(fields, values): + if field == smiles_field: + smiles.append(value) + elif target_fields is None or field in target_fields: + value = utils.literal_eval(value) + if value == "": + value = math.nan + targets[field].append(value) + + return smiles, targets + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + train_zip_file = utils.download(self.train_url, path, save_file="mol_train.csv.gz", md5=self.train_md5) + valid_zip_file = utils.download(self.valid_url, path, save_file="mol_valid.csv.gz", md5=self.valid_md5) + test_zip_file = utils.download(self.test_url, path, save_file="mol_test.csv.gz", md5=self.test_md5) + train_file = utils.extract(train_zip_file) + valid_file = utils.extract(valid_zip_file) + test_file = utils.extract(test_zip_file) + + train_smiles, train_targets = self.read_csv(train_file, smiles_field="smile", target_fields=self.target_fields) + valid_smiles, valid_targets = self.read_csv(valid_file, smiles_field="smile", target_fields=self.target_fields) + test_smiles, test_targets = self.read_csv(test_file, smiles_field="smile", target_fields=self.target_fields) + self.num_train = len(train_smiles) + self.num_valid = len(valid_smiles) + self.num_test = len(test_smiles) + + smiles = train_smiles + valid_smiles + test_smiles + targets = {k: train_targets[k] + valid_targets[k] + test_targets[k] for k in train_targets} + + self.load_smiles(smiles, targets, verbose=verbose, **kwargs) + + def split(self): + train_set = torch_data.Subset(self, range(self.num_train)) + valid_set = torch_data.Subset(self, range(self.num_train, self.num_train + self.num_valid)) + test_set = torch_data.Subset(self, range(-self.num_test, 0)) + return train_set, valid_set, test_set \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/pcqm4m.py b/build/lib/torchdrug/datasets/pcqm4m.py new file mode 100644 index 00000000..bc0c61ec --- /dev/null +++ b/build/lib/torchdrug/datasets/pcqm4m.py @@ -0,0 +1,38 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.PCQM4M") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class PCQM4M(data.MoleculeDataset): + """ + Quantum chemistry dataset originally curated under the PubChemQC of molecules. + + Statistics: + - #Molecule: 3,803,453 + - #Regression task: 1 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://dgl-data.s3-accelerate.amazonaws.com/dataset/OGB-LSC/pcqm4m_kddcup2021.zip" + md5 = "5144ebaa7c67d24da1a2acbe41f57f6a" + target_fields = ["homolumogap"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, self.path, md5=self.md5) + zip_file = utils.extract(zip_file, "pcqm4m_kddcup2021/raw/data.csv.gz") + file_name = utils.extract(zip_file) + + self.load_csv(file_name, smiles_field="smiles", target_fields=self.target_fields, + lazy=True, verbose=verbose, **kwargs) diff --git a/build/lib/torchdrug/datasets/pdbbind.py b/build/lib/torchdrug/datasets/pdbbind.py new file mode 100644 index 00000000..5c2543f4 --- /dev/null +++ b/build/lib/torchdrug/datasets/pdbbind.py @@ -0,0 +1,74 @@ +import os + +from rdkit import Chem + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.PDBBind") +@utils.copy_args(data.ProteinLigandDataset.load_lmdbs, ignore=("sequence_field", "smiles_field", "target_fields")) +class PDBBind(data.ProteinLigandDataset): + """ + The PDBbind-2019 dataset with binding affinity indicating the interaction strength + between pairs of protein and ligand. + + Statistics: + - #Train: 16,436 + - #Valid: 937 + - #Test: 285 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://miladeepgraphlearningproteindata.s3.us-east-2.amazonaws.com/peerdata/pdbind.tar.gz" + md5 = "5f5b3d2cd5f5a5fcf9e6da922850f4a0" + splits = ["train", "valid", "test"] + target_fields = ["affinity"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "pdbind/pdbind_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, sequence_field="target", smiles_field="drug", + target_fields=self.target_fields, verbose=verbose, **kwargs) + + def split(self, keys=None): + keys = keys or self.splits + offset = 0 + splits = [] + for split_name, num_sample in zip(self.splits, self.num_samples): + if split_name in keys: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits + + def get_item(self, index): + if self.lazy: + graph1 = data.Protein.from_sequence(self.sequences[index], **self.kwargs) + mol = Chem.MolFromSmiles(self.smiles[index]) + if not mol: + graph2 = None + else: + graph2 = data.Molecule.from_molecule(mol, **self.kwargs) + else: + graph1 = self.data[index][0] + graph2 = self.data[index][1] + item = {"graph1": graph1, "graph2": graph2} + item.update({k: v[index] for k, v in self.targets.items()}) + if self.transform: + item = self.transform(item) + return item \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/ppi_affinity.py b/build/lib/torchdrug/datasets/ppi_affinity.py new file mode 100644 index 00000000..e287486e --- /dev/null +++ b/build/lib/torchdrug/datasets/ppi_affinity.py @@ -0,0 +1,67 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.PPIAffinity") +@utils.copy_args(data.ProteinPairDataset.load_lmdbs, ignore=("sequence_field", "target_fields")) +class PPIAffinity(data.ProteinPairDataset): + r""" + The binding affinity values measured by :math:`p_{K_d}` between two proteins. + + Statistics: + - #Train: 2,127 + - #Valid: 212 + - #Test: 343 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://miladeepgraphlearningproteindata.s3.us-east-2.amazonaws.com/ppidata/ppi_affinity.zip" + md5 = "d114907fd20c75820e41881f8901e9e4" + splits = ["train", "valid", "test"] + target_fields = ["interaction"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "ppi_affinity/ppi_affinity_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, sequence_field=["primary_1", "primary_2"], target_fields=self.target_fields, + verbose=verbose, **kwargs) + + def split(self, keys=None): + keys = keys or self.splits + offset = 0 + splits = [] + for split_name, num_sample in zip(self.splits, self.num_samples): + if split_name in keys: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits + + def get_item(self, index): + if self.lazy: + graph1 = data.Protein.from_sequence(self.sequences[index][0], **self.kwargs) + graph2 = data.Protein.from_sequence(self.sequences[index][1], **self.kwargs) + else: + graph1 = self.data[index][0] + graph2 = self.data[index][1] + item = {"graph1": graph1, "graph2": graph2} + item.update({k: v[index] for k, v in self.targets.items()}) + if self.transform: + item = self.transform(item) + return item \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/proteinnet.py b/build/lib/torchdrug/datasets/proteinnet.py new file mode 100644 index 00000000..f2231fea --- /dev/null +++ b/build/lib/torchdrug/datasets/proteinnet.py @@ -0,0 +1,69 @@ +import os + +import torch +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.ProteinNet") +@utils.copy_args(data.ProteinDataset.load_lmdbs, ignore=("target_fields",)) +class ProteinNet(data.ProteinDataset): + """ + A set of proteins with 3D structures for the contact prediction task. + + Statistics: + - #Train: 25,299 + - #Valid: 224 + - #Test: 40 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://miladeepgraphlearningproteindata.s3.us-east-2.amazonaws.com/data/proteinnet.tar.gz" + md5 = "ab44ab201b1570c0171a2bba9eb4d389" + splits = ["train", "valid", "test"] + target_fields = ["tertiary", "valid_mask"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "proteinnet/proteinnet_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, target_fields=self.target_fields, verbose=verbose, **kwargs) + + def get_item(self, index): + if self.lazy: + graph = data.Protein.from_sequence(self.sequences[index], **self.kwargs) + else: + graph = self.data[index] + with graph.residue(): + residue_position = torch.as_tensor(self.targets["tertiary"][index], dtype=torch.float) + graph.residue_position = residue_position + mask = torch.as_tensor(self.targets["valid_mask"][index], dtype=torch.bool) + graph.mask = mask + item = {"graph": graph} + if self.transform: + item = self.transform(item) + return item + + def split(self, keys=None): + keys = keys or self.splits + offset = 0 + splits = [] + for split_name, num_sample in zip(self.splits, self.num_samples): + if split_name in keys: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/pubchem110m.py b/build/lib/torchdrug/datasets/pubchem110m.py new file mode 100644 index 00000000..bae71bc6 --- /dev/null +++ b/build/lib/torchdrug/datasets/pubchem110m.py @@ -0,0 +1,47 @@ +import os +import csv +from tqdm import tqdm + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.PubChem110m") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class PubChem110m(data.MoleculeDataset): + """ + PubChem. + This dataset doesn't contain any label information. + + Statistics: + - #Molecule: + + Parameters: + path (str): + verbose (int, optional): output verbose level + **kwargs + """ + # TODO: download path & md5. Is it the statistics right? + + target_fields = [] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + smiles_file = os.path.join(path, "CID-SMILES") + + with open(smiles_file, "r") as fin: + reader = csv.reader(fin, delimiter="\t") + if verbose: + reader = iter(tqdm(reader, "Loading %s" % path, utils.get_line_count(smiles_file))) + smiles_list = [] + + for values in reader: + smiles = values[1] + smiles_list.append(smiles) + + targets = {} + self.load_smiles(smiles_list, targets, lazy=True, verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/pubmed.py b/build/lib/torchdrug/datasets/pubmed.py new file mode 100644 index 00000000..1078c2b6 --- /dev/null +++ b/build/lib/torchdrug/datasets/pubmed.py @@ -0,0 +1,95 @@ +import os +import re +import csv + +from tqdm import tqdm + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.PubMed") +class PubMed(data.NodeClassificationDataset): + """ + A citation network of scientific publications with TF-IDF word features. + + Statistics: + - #Node: 19,717 + - #Edge: 44,338 + - #Class: 3 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + """ + + url = "https://linqs-data.soe.ucsc.edu/public/Pubmed-Diabetes.tgz" + md5 = "9fa24b917990c47e264a94079b9599fe" + + def __init__(self, path, verbose=1): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + node_file = utils.extract(zip_file, "Pubmed-Diabetes/data/Pubmed-Diabetes.NODE.paper.tab") + edge_file = utils.extract(zip_file, "Pubmed-Diabetes/data/Pubmed-Diabetes.DIRECTED.cites.tab") + + inv_node_vocab = {} + node_feature = [] + node_label = [] + + with open(node_file, "r") as fin: + reader = csv.reader(fin, delimiter="\t") + if verbose: + reader = iter(tqdm(reader, "Loading %s" % node_file, utils.get_line_count(node_file))) + _ = next(reader) + fields = next(reader) + group, = re.match(r"cat=(\S+):label", fields[0]).groups() + label_tokens = group.split(",") + inv_label_vocab = {token: i for i, token in enumerate(label_tokens)} + inv_feature_vocab = {} + for field in fields[1:]: + match = re.match(r"numeric:(\S+):0\.0", field) + if not match: + continue + feature_token, = match.groups() + inv_feature_vocab[feature_token] = len(inv_feature_vocab) + + for tokens in reader: + node_token = tokens[0] + label_token, = re.match(r"label=(\S+)", tokens[1]).groups() + feature = [0] * len(inv_feature_vocab) + inv_node_vocab[node_token] = len(inv_node_vocab) + for token in tokens[2:]: + match = re.match(r"(\S+)=([0-9.]+)", token) + if not match: + continue + feature_token, value = match.groups() + feature[inv_feature_vocab[feature_token]] = utils.literal_eval(value) + label = inv_label_vocab[label_token] + node_feature.append(feature) + node_label.append(label) + + edge_list = [] + + with open(edge_file, "r") as fin: + reader = csv.reader(fin, delimiter="\t") + if verbose: + reader = iter(tqdm(reader, "Loading %s" % edge_file, utils.get_line_count(edge_file))) + _ = next(reader) + _ = next(reader) + for tokens in reader: + h_token, = re.match(r"paper:(\S+)", tokens[1]).groups() + t_token, = re.match(r"paper:(\S+)", tokens[3]).groups() + if h_token not in inv_node_vocab: + inv_node_vocab[h_token] = len(inv_node_vocab) + h = inv_node_vocab[h_token] + if t_token not in inv_node_vocab: + inv_node_vocab[t_token] = len(inv_node_vocab) + t = inv_node_vocab[t_token] + edge_list.append((h, t)) + + self.load_edge(edge_list, node_feature, node_label, inv_node_vocab=inv_node_vocab, + inv_label_vocab=inv_label_vocab) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/qm8.py b/build/lib/torchdrug/datasets/qm8.py new file mode 100644 index 00000000..32a24c1f --- /dev/null +++ b/build/lib/torchdrug/datasets/qm8.py @@ -0,0 +1,85 @@ +import os +import csv +from collections import defaultdict + +from tqdm import tqdm +from rdkit import Chem, RDLogger + +import torch + +from torchdrug import data, utils +from torchdrug.data import feature +from torchdrug.core import Registry as R + + +@R.register("datasets.QM8") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class QM8(data.MoleculeDataset): + """ + Electronic spectra and excited state energy of small molecules. + + Statistics: + - #Molecule: 21,786 + - #Regression task: 12 + + Parameters: + path (str): path to store the dataset + node_position (bool, optional): load node position or not. + This will add `node_position` as a node attribute to each sample. + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://deepchem.io.s3-website-us-west-1.amazonaws.com/datasets/gdb8.tar.gz" + md5 = "b7e2a2c823c75b35c596f3013319c86e" + target_fields = ["E1-CC2", "E2-CC2", "f1-CC2", "f2-CC2", + "E1-PBE0/def2SVP", "E2-PBE0/def2SVP", "f1-PBE0/def2SVP", "f2-PBE0/def2SVP", + "E1-PBE0/def2TZVP", "E2-PBE0/def2TZVP", "f1-PBE0/def2TZVP", "f2-PBE0/def2TZVP", + "E1-CAM", "E2-CAM", "f1-CAM", "f2-CAM"] + + def __init__(self, path, node_position=False, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + sdf_file = utils.extract(zip_file, "qm8.sdf") + csv_file = utils.extract(zip_file, "qm8.sdf.csv") + csv_file2 = os.path.join(path, "qm8.sdf.clean.csv") + + if not os.path.exists(csv_file2): + with open(csv_file, "r") as fin, open(csv_file2, "w") as fout: + reader = csv.reader(fin) + writer = csv.writer(fout) + fields = next(reader) + fields[5:9] = [field + "/def2SVP" for field in fields[5:9]] + fields[9:13] = [field + "/def2TZVP" for field in fields[9:13]] + writer.writerow(fields) + for values in reader: + writer.writerow(values) + + self.load_csv(csv_file2, smiles_field=None, target_fields=self.target_fields, verbose=verbose) + + with utils.no_rdkit_log(): + molecules = Chem.SDMolSupplier(sdf_file, True, True, False) + + targets = self.targets + self.data = [] + self.targets = defaultdict(list) + assert len(molecules) == len(targets[self.target_fields[0]]) + indexes = range(len(molecules)) + if verbose: + indexes = tqdm(indexes, "Constructing molecules from SDF") + for i in indexes: + with utils.capture_rdkit_log() as log: + mol = molecules[i] + if mol is None: + continue + d = data.Molecule.from_molecule(mol, **kwargs) + if node_position: + with d.node(): + d.node_position = torch.tensor([feature.atom_position(atom) for atom in mol.GetAtoms()]) + self.data.append(d) + for k in targets: + self.targets[k].append(targets[k][i]) diff --git a/build/lib/torchdrug/datasets/qm9.py b/build/lib/torchdrug/datasets/qm9.py new file mode 100644 index 00000000..5ba94b59 --- /dev/null +++ b/build/lib/torchdrug/datasets/qm9.py @@ -0,0 +1,71 @@ +import os +from collections import defaultdict + +from tqdm import tqdm +from rdkit import Chem, RDLogger + +import torch + +from torchdrug import data, utils +from torchdrug.data import feature +from torchdrug.core import Registry as R + + +@R.register("datasets.QM9") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class QM9(data.MoleculeDataset): + """ + Geometric, energetic, electronic and thermodynamic properties of DFT-modeled small molecules. + + Statistics: + - #Molecule: 133,885 + - #Regression task: 12 + + Parameters: + path (str): path to store the dataset + node_position (bool, optional): load node position or not. + This will add `node_position` as a node attribute to each sample. + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://deepchem.io.s3-website-us-west-1.amazonaws.com/datasets/gdb9.tar.gz" + md5 = "560f62d8e6c992ca0cf8ed8d013f9131" + target_fields = ["mu", "alpha", "homo", "lumo", "gap", "r2", "zpve", "u0", "u298", "h298", "g298"] + + def __init__(self, path, node_position=False, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + sdf_file = utils.extract(zip_file, "gdb9.sdf") + csv_file = utils.extract(zip_file, "gdb9.sdf.csv") + + self.load_csv(csv_file, smiles_field=None, target_fields=self.target_fields, verbose=verbose) + + with utils.no_rdkit_log(): + molecules = Chem.SDMolSupplier(sdf_file, True, True, False) + + targets = self.targets + self.data = [] + self.targets = defaultdict(list) + assert len(molecules) == len(targets[self.target_fields[0]]) + indexes = range(len(molecules)) + if verbose: + indexes = tqdm(indexes, "Constructing molecules from SDF") + for i in indexes: + with utils.capture_rdkit_log() as log: + mol = molecules[i] + if mol is None: + continue + if log.content: + print(log.content) + d = data.Molecule.from_molecule(mol, **kwargs) + if node_position: + with d.node(): + d.node_position = torch.tensor([feature.atom_position(atom) for atom in mol.GetAtoms()]) + self.data.append(d) + for k in targets: + self.targets[k].append(targets[k][i]) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/secondary_structure.py b/build/lib/torchdrug/datasets/secondary_structure.py new file mode 100644 index 00000000..dff07da5 --- /dev/null +++ b/build/lib/torchdrug/datasets/secondary_structure.py @@ -0,0 +1,70 @@ +import os + +import torch +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.SecondaryStructure") +@utils.copy_args(data.ProteinDataset.load_lmdbs, ignore=("target_fields",)) +class SecondaryStructure(data.ProteinDataset): + """ + Secondary structure labels for a set of proteins determined by the local structures + of protein residues in their natural state + + Statistics: + - #Train: 8,678 + - #Valid: 2,170 + - #Test: 513 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://s3.amazonaws.com/songlabdata/proteindata/data_pytorch/secondary_structure.tar.gz" + md5 = "2f61e8e09c215c032ef5bc8b910c8e97" + splits = ["train", "valid", "casp12", "ts115", "cb513"] + target_fields = ["ss3", "valid_mask"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "secondary_structure/secondary_structure_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, target_fields=self.target_fields, verbose=verbose, **kwargs) + + def get_item(self, index): + if self.lazy: + graph = data.Protein.from_sequence(self.sequences[index], **self.kwargs) + else: + graph = self.data[index] + with graph.residue(): + target = torch.as_tensor(self.targets["ss3"][index], dtype=torch.long) + graph.target = target + mask = torch.as_tensor(self.targets["valid_mask"][index], dtype=torch.bool) + graph.mask = mask + item = {"graph": graph} + if self.transform: + item = self.transform(item) + return item + + def split(self, keys=None): + keys = keys or self.splits + offset = 0 + splits = [] + for split_name, num_sample in zip(self.splits, self.num_samples): + if split_name in keys: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/sider.py b/build/lib/torchdrug/datasets/sider.py new file mode 100644 index 00000000..39a86c60 --- /dev/null +++ b/build/lib/torchdrug/datasets/sider.py @@ -0,0 +1,37 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.SIDER") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class SIDER(data.MoleculeDataset): + """ + Marketed drugs and adverse drug reactions (ADR) dataset, grouped into 27 system organ classes. + + Statistics: + - #Molecule: 1,427 + - #Classification task: 27 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://deepchem.io.s3-website-us-west-1.amazonaws.com/datasets/sider.csv.gz" + md5 = "77c0ef421f7cc8ce963c5836c8761fd2" + target_fields = None # pick all targets + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + csv_file = utils.extract(zip_file) + + self.load_csv(csv_file, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/solubility.py b/build/lib/torchdrug/datasets/solubility.py new file mode 100644 index 00000000..29c019b9 --- /dev/null +++ b/build/lib/torchdrug/datasets/solubility.py @@ -0,0 +1,51 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.Solubility") +@utils.copy_args(data.ProteinDataset.load_lmdbs, ignore=("target_fields",)) +class Solubility(data.ProteinDataset): + """ + Proteins with binary labels indicating their solubility. + + Statistics: + - #Train: 62,478 + - #Valid: 6,942 + - #Test: 1,999 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://miladeepgraphlearningproteindata.s3.us-east-2.amazonaws.com/peerdata/solubility.tar.gz" + md5 = "8a8612b7bfa2ed80375db6e465ccf77e" + splits = ["train", "valid", "test"] + target_fields = ["solubility"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "solubility/solubility_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, target_fields=self.target_fields, verbose=verbose, **kwargs) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/stability.py b/build/lib/torchdrug/datasets/stability.py new file mode 100644 index 00000000..e6f8a7a3 --- /dev/null +++ b/build/lib/torchdrug/datasets/stability.py @@ -0,0 +1,51 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.Stability") +@utils.copy_args(data.ProteinDataset.load_lmdbs, ignore=("target_fields",)) +class Stability(data.ProteinDataset): + """ + The stability values of proteins under natural environment. + + Statistics: + - #Train: 53,571 + - #Valid: 2,512 + - #Test: 12,851 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://s3.amazonaws.com/songlabdata/proteindata/data_pytorch/stability.tar.gz" + md5 = "aa1e06eb5a59e0ecdae581e9ea029675" + splits = ["train", "valid", "test"] + target_fields = ["stability_score"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "stability/stability_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, target_fields=self.target_fields, verbose=verbose, **kwargs) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/subcellular_localization.py b/build/lib/torchdrug/datasets/subcellular_localization.py new file mode 100644 index 00000000..d77cc475 --- /dev/null +++ b/build/lib/torchdrug/datasets/subcellular_localization.py @@ -0,0 +1,51 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.SubcellularLocalization") +@utils.copy_args(data.ProteinDataset.load_lmdbs, ignore=("target_fields",)) +class SubcellularLocalization(data.ProteinDataset): + """ + Class labels indicating where a natural protein locates in the cell. + + Statistics: + - #Train: 8,945 + - #Valid: 2,248 + - #Test: 2,768 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://miladeepgraphlearningproteindata.s3.us-east-2.amazonaws.com/peerdata/subcellular_localization.tar.gz" + md5 = "37cb6138b8d4603512530458b7c8a77d" + splits = ["train", "valid", "test"] + target_fields = ["localization"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "subcellular_localization/subcellular_localization_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, target_fields=self.target_fields, verbose=verbose, **kwargs) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/tox21.py b/build/lib/torchdrug/datasets/tox21.py new file mode 100644 index 00000000..5e73e58e --- /dev/null +++ b/build/lib/torchdrug/datasets/tox21.py @@ -0,0 +1,39 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.Tox21") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class Tox21(data.MoleculeDataset): + """ + Qualitative toxicity measurements on 12 biological targets, including nuclear receptors + and stress response pathways. + + Statistics: + - #Molecule: 7,831 + - #Classification task: 12 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://deepchem.io.s3-website-us-west-1.amazonaws.com/datasets/tox21.csv.gz" + md5 = "2882d69e70bba0fec14995f26787cc25" + target_fields = ["NR-AR", "NR-AR-LBD", "NR-AhR", "NR-Aromatase", "NR-ER", "NR-ER-LBD", "NR-PPAR-gamma", + "SR-ARE", "SR-ATAD5", "SR-HSE", "SR-MMP", "SR-p53"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + csv_file = utils.extract(zip_file) + + self.load_csv(csv_file, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/toxcast.py b/build/lib/torchdrug/datasets/toxcast.py new file mode 100644 index 00000000..3bb05869 --- /dev/null +++ b/build/lib/torchdrug/datasets/toxcast.py @@ -0,0 +1,37 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.ToxCast") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class ToxCast(data.MoleculeDataset): + """ + Toxicology data based on in vitro high-throughput screening. + + Statistics: + - #Molecule: 8,575 + - #Classification task: 617 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "http://deepchem.io.s3-website-us-west-1.amazonaws.com/datasets/toxcast_data.csv.gz" + md5 = "92911bbf9c1e2ad85231014859388cd6" + target_fields = None # pick all targets + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + csv_file = utils.extract(zip_file) + + self.load_csv(csv_file, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/uspto50k.py b/build/lib/torchdrug/datasets/uspto50k.py new file mode 100644 index 00000000..1169985e --- /dev/null +++ b/build/lib/torchdrug/datasets/uspto50k.py @@ -0,0 +1,264 @@ +import os +import copy +from collections import defaultdict + +import numpy as np +import networkx as nx +from tqdm import tqdm +from rdkit import Chem + +import torch +from torch.utils import data as torch_data +from torch_scatter import scatter_max + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.USPTO50k") +@utils.copy_args(data.ReactionDataset.load_csv, ignore=("smiles_field", "target_fields")) +class USPTO50k(data.ReactionDataset): + """ + Chemical reactions extracted from USPTO patents. + + Statistics: + - #Reaction: 50,017 + - #Reaction class: 10 + + Parameters: + path (str): path to store the dataset + as_synthon (bool, optional): whether decompose (reactant, product) pairs into (reactant, synthon) pairs + verbose (int, optional): output verbose level + **kwargs + """ + + target_fields = ["class"] + target_alias = {"class": "reaction"} + + reaction_names = ["Heteroatom alkylation and arylation", + "Acylation and related processes", + "C-C bond formation", + "Heterocycle formation", + "Protections", + "Deprotections", + "Reductions", + "Oxidations", + "Functional group interconversion (FGI)", + "Functional group addition (FGA)"] + + url = "https://raw.githubusercontent.com/connorcoley/retrosim/master/retrosim/data/data_processed.csv" + md5 = "404c361dd1568fbdb4d16ca588953749" + + def __init__(self, path, as_synthon=False, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + self.as_synthon = as_synthon + + file_name = utils.download(self.url, path, md5=self.md5) + + self.load_csv(file_name, smiles_field="rxn_smiles", target_fields=self.target_fields, verbose=verbose, + **kwargs) + + if as_synthon: + prefix = "Computing synthons" + process_fn = self._get_synthon + else: + prefix = "Computing reaction centers" + process_fn = self._get_reaction_center + + data = self.data + targets = self.targets + self.data = [] + self.targets = defaultdict(list) + indexes = range(len(data)) + if verbose: + indexes = tqdm(indexes, prefix) + invalid = 0 + for i in indexes: + reactant, product = data[i] + reactant.bond_stereo[:] = 0 + product.bond_stereo[:] = 0 + + reactants, products = process_fn(reactant, product) + if not reactants: + invalid += 1 + continue + + self.data += zip(reactants, products) + for k in targets: + new_k = self.target_alias.get(k, k) + self.targets[new_k] += [targets[k][i] - 1] * len(reactants) + self.targets["sample id"] += [i] * len(reactants) + + self.valid_rate = 1 - invalid / len(data) + + def _get_difference(self, reactant, product): + product2id = product.atom_map + id2reactant = torch.zeros(product2id.max() + 1, dtype=torch.long) + id2reactant[reactant.atom_map] = torch.arange(reactant.num_node) + prod2react = id2reactant[product2id] + + # check edges in the product + product = product.directed() + # O(n^2) brute-force match is faster than O(nlogn) data.Graph.match for small molecules + mapped_edge = product.edge_list.clone() + mapped_edge[:, :2] = prod2react[mapped_edge[:, :2]] + is_same_index = mapped_edge.unsqueeze(0) == reactant.edge_list.unsqueeze(1) + has_typed_edge = is_same_index.all(dim=-1).any(dim=0) + has_edge = is_same_index[:, :, :2].all(dim=-1).any(dim=0) + is_added = ~has_edge + is_modified = has_edge & ~has_typed_edge + edge_added = product.edge_list[is_added, :2] + edge_modified = product.edge_list[is_modified, :2] + + return edge_added, edge_modified, prod2react + + def _get_reaction_center(self, reactant, product): + edge_added, edge_modified, prod2react = self._get_difference(reactant, product) + + edge_label = torch.zeros(product.num_edge, dtype=torch.long) + node_label = torch.zeros(product.num_node, dtype=torch.long) + + if len(edge_added) > 0: + if len(edge_added) == 1: # add a single edge + any = -torch.ones(1, 1, dtype=torch.long) + pattern = torch.cat([edge_added, any], dim=-1) + index, num_match = product.match(pattern) + assert num_match.item() == 1 + edge_label[index] = 1 + h, t = edge_added[0] + reaction_center = torch.tensor([product.atom_map[h], product.atom_map[t]]) + else: + if len(edge_modified) == 1: # modify a single edge + h, t = edge_modified[0] + if product.degree_in[h] == 1: + node_label[h] = 1 + reaction_center = torch.tensor([product.atom_map[h], 0]) + elif product.degree_in[t] == 1: + node_label[t] = 1 + reaction_center = torch.tensor([product.atom_map[t], 0]) + else: + # pretend the reaction center is h + node_label[h] = 1 + reaction_center = torch.tensor([product.atom_map[h], 0]) + else: + product_hs = torch.tensor([atom.GetTotalNumHs() for atom in product.to_molecule().GetAtoms()]) + reactant_hs = torch.tensor([atom.GetTotalNumHs() for atom in reactant.to_molecule().GetAtoms()]) + atom_modified = (product_hs != reactant_hs[prod2react]).nonzero().flatten() + if len(atom_modified) == 1: # modify single node + node_label[atom_modified] = 1 + reaction_center = torch.tensor([product.atom_map[atom_modified[0]], 0]) + + if edge_label.sum() + node_label.sum() == 0: + return [], [] + + with product.edge(): + product.edge_label = edge_label + with product.node(): + product.node_label = node_label + with reactant.graph(): + reactant.reaction_center = reaction_center + with product.graph(): + product.reaction_center = reaction_center + return [reactant], [product] + + def _get_synthon(self, reactant, product): + edge_added, edge_modified, prod2react = self._get_difference(reactant, product) + + reactants = [] + synthons = [] + + if len(edge_added) > 0: + if len(edge_added) == 1: # add a single edge + reverse_edge = edge_added.flip(1) + any = -torch.ones(2, 1, dtype=torch.long) + pattern = torch.cat([edge_added, reverse_edge]) + pattern = torch.cat([pattern, any], dim=-1) + index, num_match = product.match(pattern) + edge_mask = torch.ones(product.num_edge, dtype=torch.bool) + edge_mask[index] = 0 + product = product.edge_mask(edge_mask) + _reactants = reactant.connected_components()[0] + _synthons = product.connected_components()[0] + assert len(_synthons) >= len(_reactants) # because a few samples contain multiple products + + h, t = edge_added[0] + reaction_center = torch.tensor([product.atom_map[h], product.atom_map[t]]) + with _reactants.graph(): + _reactants.reaction_center = reaction_center.expand(len(_reactants), -1) + with _synthons.graph(): + _synthons.reaction_center = reaction_center.expand(len(_synthons), -1) + # reactant / sython can be uniquely indexed by their maximal atom mapping ID + reactant_id = scatter_max(_reactants.atom_map, _reactants.node2graph, dim_size=len(_reactants))[0] + synthon_id = scatter_max(_synthons.atom_map, _synthons.node2graph, dim_size=len(_synthons))[0] + react2synthon = (reactant_id.unsqueeze(-1) == synthon_id.unsqueeze(0)).long().argmax(-1) + react2synthon = react2synthon.tolist() + for r, s in enumerate(react2synthon): + reactants.append(_reactants[r]) + synthons.append(_synthons[s]) + else: + num_cc = reactant.connected_components()[1] + assert num_cc == 1 + + if len(edge_modified) == 1: # modify a single edge + synthon = product + h, t = edge_modified[0] + if product.degree_in[h] == 1: + reaction_center = torch.tensor([product.atom_map[h], 0]) + elif product.degree_in[t] == 1: + reaction_center = torch.tensor([product.atom_map[t], 0]) + else: + # pretend the reaction center is h + reaction_center = torch.tensor([product.atom_map[h], 0]) + with reactant.graph(): + reactant.reaction_center = reaction_center + with synthon.graph(): + synthon.reaction_center = reaction_center + reactants.append(reactant) + synthons.append(synthon) + else: + product_hs = torch.tensor([atom.GetTotalNumHs() for atom in product.to_molecule().GetAtoms()]) + reactant_hs = torch.tensor([atom.GetTotalNumHs() for atom in reactant.to_molecule().GetAtoms()]) + atom_modified = (product_hs != reactant_hs[prod2react]).nonzero().flatten() + if len(atom_modified) == 1: # modify single node + synthon = product + reaction_center = torch.tensor([product.atom_map[atom_modified[0]], 0]) + with reactant.graph(): + reactant.reaction_center = reaction_center + with synthon.graph(): + synthon.reaction_center = reaction_center + reactants.append(reactant) + synthons.append(synthon) + + return reactants, synthons + + def split(self, ratios=(0.8, 0.1, 0.1)): + react2index = defaultdict(list) + react2sample = defaultdict(list) + for i in range(len(self)): + reaction = self.targets["reaction"][i] + sample_id = self.targets["sample id"][i] + react2index[reaction].append(i) + react2sample[reaction].append(sample_id) + + indexes = [[] for _ in ratios] + for reaction in react2index: + num_sample = len(set(react2sample[reaction])) + key_lengths = [int(round(num_sample * ratio)) for ratio in ratios] + key_lengths[-1] = num_sample - sum(key_lengths[:-1]) + react_indexes = data.key_split(react2index[reaction], react2sample[reaction], key_lengths=key_lengths) + for index, react_index in zip(indexes, react_indexes): + index += [i for i in react_index] + + return [torch_data.Subset(self, index) for index in indexes] + + @property + def num_reaction_type(self): + return len(self.reaction_types) + + @utils.cached_property + def reaction_types(self): + """All reaction types.""" + return sorted(set(self.target["class"])) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/wn18.py b/build/lib/torchdrug/datasets/wn18.py new file mode 100644 index 00000000..dca6c95e --- /dev/null +++ b/build/lib/torchdrug/datasets/wn18.py @@ -0,0 +1,106 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.WN18") +class WN18(data.KnowledgeGraphDataset): + """ + WordNet knowledge base. + + Statistics: + - #Entity: 40,943 + - #Relation: 18 + - #Triplet: 151,442 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + """ + + urls = [ + "https://github.com/DeepGraphLearning/KnowledgeGraphEmbedding/raw/master/data/wn18/train.txt", + "https://github.com/DeepGraphLearning/KnowledgeGraphEmbedding/raw/master/data/wn18/valid.txt", + "https://github.com/DeepGraphLearning/KnowledgeGraphEmbedding/raw/master/data/wn18/test.txt", + ] + md5s = [ + "7d68324d293837ac165c3441a6c8b0eb", + "f4f66fec0ca83b5ebe7ad7003404e61d", + "b035247a8916c7ec3443fa949e1ff02c" + ] + + def __init__(self, path, verbose=1): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + txt_files = [] + for url, md5 in zip(self.urls, self.md5s): + save_file = "wn18_%s" % os.path.basename(url) + txt_file = utils.download(url, self.path, save_file=save_file, md5=md5) + txt_files.append(txt_file) + + self.load_tsvs(txt_files, verbose=verbose) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits + + +@R.register("datasets.WN18RR") +class WN18RR(data.KnowledgeGraphDataset): + """ + A filtered version of WN18 dataset without trivial cases. + + Statistics: + - #Entity: 40,943 + - #Relation: 11 + - #Triplet: 93,003 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + """ + + urls = [ + "https://github.com/DeepGraphLearning/KnowledgeGraphEmbedding/raw/master/data/wn18rr/train.txt", + "https://github.com/DeepGraphLearning/KnowledgeGraphEmbedding/raw/master/data/wn18rr/valid.txt", + "https://github.com/DeepGraphLearning/KnowledgeGraphEmbedding/raw/master/data/wn18rr/test.txt", + ] + md5s = [ + "35e81af3ae233327c52a87f23b30ad3c", + "74a2ee9eca9a8d31f1a7d4d95b5e0887", + "2b45ba1ba436b9d4ff27f1d3511224c9" + ] + + def __init__(self, path, verbose=1): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + txt_files = [] + for url, md5 in zip(self.urls, self.md5s): + save_file = "wn18rr_%s" % os.path.basename(url) + txt_file = utils.download(url, self.path, save_file=save_file, md5=md5) + txt_files.append(txt_file) + + self.load_tsvs(txt_files, verbose=verbose) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/yago310.py b/build/lib/torchdrug/datasets/yago310.py new file mode 100644 index 00000000..87e58af4 --- /dev/null +++ b/build/lib/torchdrug/datasets/yago310.py @@ -0,0 +1,56 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.YAGO310") +class YAGO310(data.KnowledgeGraphDataset): + """ + Subset of YAGO3 knowledge base for knowledge graph reasoning. + + Statistics: + - #Entity: 123,182 + - #Relation: 37 + - #Triplet: 1,089,040 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + """ + + urls = [ + "https://raw.githubusercontent.com/DeepGraphLearning/KnowledgeGraphEmbedding/master/data/YAGO3-10/train.txt", + "https://raw.githubusercontent.com/DeepGraphLearning/KnowledgeGraphEmbedding/master/data/YAGO3-10/valid.txt", + "https://raw.githubusercontent.com/DeepGraphLearning/KnowledgeGraphEmbedding/master/data/YAGO3-10/test.txt", + ] + md5s = [ + "a9da8f583ec3920570eeccf07199229a", + "2d679a906f2b1ac29d74d5c948c1ad09", + "14bf97890b2fee774dbce5f326acd189" + ] + + def __init__(self, path, verbose=1): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + txt_files = [] + for url, md5 in zip(self.urls, self.md5s): + save_file = "yago310_%s" % os.path.basename(url) + txt_file = utils.download(url, self.path, save_file=save_file, md5=md5) + txt_files.append(txt_file) + + self.load_tsvs(txt_files, verbose=verbose) + + def split(self): + offset = 0 + splits = [] + for num_sample in self.num_samples: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits diff --git a/build/lib/torchdrug/datasets/yeast_ppi.py b/build/lib/torchdrug/datasets/yeast_ppi.py new file mode 100644 index 00000000..f7dd9470 --- /dev/null +++ b/build/lib/torchdrug/datasets/yeast_ppi.py @@ -0,0 +1,67 @@ +import os + +from torch.utils import data as torch_data + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.YeastPPI") +@utils.copy_args(data.ProteinPairDataset.load_lmdbs, ignore=("sequence_field", "target_fields")) +class YeastPPI(data.ProteinPairDataset): + """ + Binary labels indicating whether two yeast proteins interact or not. + + Statistics: + - #Train: 1,668 + - #Valid: 131 + - #Test: 373 + + Parameters: + path (str): the path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://miladeepgraphlearningproteindata.s3.us-east-2.amazonaws.com/ppidata/yeast_ppi.zip" + md5 = "3993b02c3080d74996cddf6fe798b1e8" + splits = ["train", "valid", "test", "cross_species_test"] + target_fields = ["interaction"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + zip_file = utils.download(self.url, path, md5=self.md5) + data_path = utils.extract(zip_file) + lmdb_files = [os.path.join(data_path, "yeast_ppi/yeast_ppi_%s.lmdb" % split) + for split in self.splits] + + self.load_lmdbs(lmdb_files, sequence_field=["primary_1", "primary_2"], + target_fields=self.target_fields, verbose=verbose, **kwargs) + + def split(self, keys=None): + keys = keys or self.splits + offset = 0 + splits = [] + for split_name, num_sample in zip(self.splits, self.num_samples): + if split_name in keys: + split = torch_data.Subset(self, range(offset, offset + num_sample)) + splits.append(split) + offset += num_sample + return splits + + def get_item(self, index): + if self.lazy: + graph1 = data.Protein.from_sequence(self.sequences[index][0], **self.kwargs) + graph2 = data.Protein.from_sequence(self.sequences[index][1], **self.kwargs) + else: + graph1 = self.data[index][0] + graph2 = self.data[index][1] + item = {"graph1": graph1, "graph2": graph2} + item.update({k: v[index] for k, v in self.targets.items()}) + if self.transform: + item = self.transform(item) + return item \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/zinc250k.py b/build/lib/torchdrug/datasets/zinc250k.py new file mode 100644 index 00000000..24959c00 --- /dev/null +++ b/build/lib/torchdrug/datasets/zinc250k.py @@ -0,0 +1,37 @@ +import os + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.ZINC250k") +@utils.copy_args(data.MoleculeDataset.load_csv, ignore=("smiles_field", "target_fields")) +class ZINC250k(data.MoleculeDataset): + """ + Subset of ZINC compound database for virtual screening. + + Statistics: + - #Molecule: 498,910 + - #Regression task: 2 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + url = "https://raw.githubusercontent.com/aspuru-guzik-group/chemical_vae/master/models/zinc_properties/" \ + "250k_rndm_zinc_drugs_clean_3.csv" + md5 = "b59078b2b04c6e9431280e3dc42048d5" + target_fields = ["logP", "qed"] + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + file_name = utils.download(self.url, path, md5=self.md5) + + self.load_csv(file_name, smiles_field="smiles", target_fields=self.target_fields, + verbose=verbose, **kwargs) \ No newline at end of file diff --git a/build/lib/torchdrug/datasets/zinc2m.py b/build/lib/torchdrug/datasets/zinc2m.py new file mode 100644 index 00000000..957748c0 --- /dev/null +++ b/build/lib/torchdrug/datasets/zinc2m.py @@ -0,0 +1,53 @@ +import os +import csv +from tqdm import tqdm +import shutil + +from torchdrug import data, utils +from torchdrug.core import Registry as R + + +@R.register("datasets.ZINC2m") +@utils.copy_args(data.MoleculeDataset.load_smiles, ignore=("smiles_field", "target_fields")) +class ZINC2m(data.MoleculeDataset): + """ + ZINC compound database for virtual screening. + This dataset doesn't contain any label information. + + Statistics: + - #Molecule: 2,000,000 + + Parameters: + path (str): path to store the dataset + verbose (int, optional): output verbose level + **kwargs + """ + + target_fields = [] + + url = "http://snap.stanford.edu/gnn-pretrain/data/chem_dataset.zip" + md5 = "e95da4dffa0fdb1d4af2726bdf8c23e0" + member = "dataset/zinc_standard_agent/processed/smiles.csv" + + def __init__(self, path, verbose=1, **kwargs): + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + zip_file_name = utils.download(self.url, path, md5=self.md5) + + save_file = utils.extract(zip_file=zip_file_name, member=self.member) + neo_save_file = os.path.join(os.path.dirname(zip_file_name), 'zinc2m_'+os.path.basename(self.member)) + shutil.move(save_file, neo_save_file) + + with open(neo_save_file, "r") as fin: + reader = csv.reader(fin) + if verbose: + reader = iter(tqdm(reader, "Loading %s" % path, utils.get_line_count(neo_save_file))) + smiles_list = [] + + for idx, values in enumerate(reader): + smiles = values[0] + smiles_list.append(smiles) + + targets = {} + self.load_smiles(smiles_list, targets, lazy=True, verbose=verbose, **kwargs) diff --git a/build/lib/torchdrug/layers/__init__.py b/build/lib/torchdrug/layers/__init__.py new file mode 100644 index 00000000..d9df9a8c --- /dev/null +++ b/build/lib/torchdrug/layers/__init__.py @@ -0,0 +1,37 @@ +from .common import MultiLayerPerceptron, GaussianSmearing, MutualInformation, PairNorm, InstanceNorm, Sequential, \ + SinusoidalPositionEmbedding + +from .block import ProteinResNetBlock, SelfAttentionBlock, ProteinBERTBlock +from .conv import MessagePassingBase, GraphConv, GraphAttentionConv, RelationalGraphConv, GraphIsomorphismConv, \ + NeuralFingerprintConv, ContinuousFilterConv, MessagePassing, ChebyshevConv, GeometricRelationalGraphConv +from .pool import DiffPool, MinCutPool +from .readout import MeanReadout, SumReadout, MaxReadout, AttentionReadout, Softmax, Set2Set, Sort +from .flow import ConditionalFlow +from .sampler import NodeSampler, EdgeSampler +from .geometry import GraphConstruction, SpatialLineGraph +from . import distribution, functional + +# alias +MLP = MultiLayerPerceptron +RBF = GaussianSmearing +GCNConv = GraphConv +RGCNConv = RelationalGraphConv +GINConv = GraphIsomorphismConv +NFPConv = NeuralFingerprintConv +CFConv = ContinuousFilterConv +MPConv = MessagePassing + +__all__ = [ + "MultiLayerPerceptron", "GaussianSmearing", "MutualInformation", "PairNorm", "InstanceNorm", "Sequential", + "SinusoidalPositionEmbedding", + "MessagePassingBase", "GraphConv", "GraphAttentionConv", "RelationalGraphConv", "GraphIsomorphismConv", + "NeuralFingerprintConv", "ContinuousFilterConv", "MessagePassing", "ChebyshevConv", "GeometricRelationalGraphConv", + "DiffPool", "MinCutPool", + "MeanReadout", "SumReadout", "MaxReadout", "AttentionReadout", "Softmax", "Set2Set", "Sort", + "ConditionalFlow", + "NodeSampler", "EdgeSampler", + "GraphConstruction", "SpatialLineGraph", + "distribution", "functional", + "MLP", "RBF", "GCNConv", "RGCNConv", "GINConv", "NFPConv", "CFConv", "MPConv", + "ProteinResNetBlock", "SelfAttentionBlock", "ProteinBERTBlock", +] \ No newline at end of file diff --git a/build/lib/torchdrug/layers/block.py b/build/lib/torchdrug/layers/block.py new file mode 100644 index 00000000..f6bd5ac7 --- /dev/null +++ b/build/lib/torchdrug/layers/block.py @@ -0,0 +1,167 @@ +from torch import nn +from torch.nn import functional as F + +from torchdrug import layers + + +class ProteinResNetBlock(nn.Module): + """ + Convolutional block with residual connection from `Deep Residual Learning for Image Recognition`_. + + .. _Deep Residual Learning for Image Recognition: + https://arxiv.org/pdf/1512.03385.pdf + + Parameters: + input_dim (int): input dimension + output_dim (int): output dimension + kernel_size (int, optional): size of convolutional kernel + stride (int, optional): stride of convolution + padding (int, optional): padding added to both sides of the input + activation (str or function, optional): activation function + """ + + def __init__(self, input_dim, output_dim, kernel_size=3, stride=1, padding=1, activation="gelu"): + super(ProteinResNetBlock, self).__init__() + self.input_dim = input_dim + self.output_dim = output_dim + + if isinstance(activation, str): + self.activation = getattr(F, activation) + else: + self.activation = activation + + self.conv1 = nn.Conv1d(input_dim, output_dim, kernel_size, stride, padding, bias=False) + self.layer_norm1 = nn.LayerNorm(output_dim) + self.conv2 = nn.Conv1d(output_dim, output_dim, kernel_size, stride, padding, bias=False) + self.layer_norm2 = nn.LayerNorm(output_dim) + + def forward(self, input, mask): + """ + Perform 1D convolutions over the input. + + Parameters: + input (Tensor): input representations of shape `(..., length, dim)` + mask (Tensor): bool mask of shape `(..., length, dim)` + """ + identity = input + + input = input * mask # (B, L, d) + out = self.conv1(input.transpose(1, 2)).transpose(1, 2) + out = self.layer_norm1(out) + out = self.activation(out) + + out = out * mask + out = self.conv2(out.transpose(1, 2)).transpose(1, 2) + out = self.layer_norm2(out) + + out += identity + out = self.activation(out) + + return out + + +class SelfAttentionBlock(nn.Module): + """ + Multi-head self-attention block from + `Attention Is All You Need`_. + + .. _Attention Is All You Need: + https://arxiv.org/pdf/1706.03762.pdf + + Parameters: + hidden_dim (int): hidden dimension + num_heads (int): number of attention heads + dropout (float, optional): dropout ratio of attention maps + """ + + def __init__(self, hidden_dim, num_heads, dropout=0.0): + super(SelfAttentionBlock, self).__init__() + if hidden_dim % num_heads != 0: + raise ValueError( + "The hidden size (%d) is not a multiple of the number of attention " + "heads (%d)" % (hidden_dim, num_heads)) + self.hidden_dim = hidden_dim + self.num_heads = num_heads + self.head_size = hidden_dim // num_heads + + self.query = nn.Linear(hidden_dim, hidden_dim) + self.key = nn.Linear(hidden_dim, hidden_dim) + self.value = nn.Linear(hidden_dim, hidden_dim) + + self.attn = nn.MultiheadAttention(hidden_dim, num_heads, dropout=dropout) + + def forward(self, input, mask): + """ + Perform self attention over the input. + + Parameters: + input (Tensor): input representations of shape `(..., length, dim)` + mask (Tensor): bool mask of shape `(..., length)` + """ + query = self.query(input).transpose(0, 1) + key = self.key(input).transpose(0, 1) + value = self.value(input).transpose(0, 1) + + mask = (~mask.bool()).squeeze(-1) + output = self.attn(query, key, value, key_padding_mask=mask)[0].transpose(0, 1) + + return output + + +class ProteinBERTBlock(nn.Module): + """ + Transformer encoding block from + `Attention Is All You Need`_. + + .. _Attention Is All You Need: + https://arxiv.org/pdf/1706.03762.pdf + + Parameters: + input_dim (int): input dimension + hidden_dim (int): hidden dimension + num_heads (int): number of attention heads + attention_dropout (float, optional): dropout ratio of attention maps + hidden_dropout (float, optional): dropout ratio of hidden features + activation (str or function, optional): activation function + """ + + def __init__(self, input_dim, hidden_dim, num_heads, attention_dropout=0, + hidden_dropout=0, activation="relu"): + super(ProteinBERTBlock, self).__init__() + self.input_dim = input_dim + self.num_heads = num_heads + self.attention_dropout = attention_dropout + self.hidden_dropout = hidden_dropout + self.hidden_dim = hidden_dim + + self.attention = SelfAttentionBlock(input_dim, num_heads, attention_dropout) + self.linear1 = nn.Linear(input_dim, input_dim) + self.dropout1 = nn.Dropout(hidden_dropout) + self.layer_norm1 = nn.LayerNorm(input_dim) + + self.intermediate = layers.MultiLayerPerceptron(input_dim, hidden_dim, activation=activation) + + self.linear2 = nn.Linear(hidden_dim, input_dim) + self.dropout2 = nn.Dropout(hidden_dropout) + self.layer_norm2 = nn.LayerNorm(input_dim) + + def forward(self, input, mask): + """ + Perform a BERT-block transformation over the input. + + Parameters: + input (Tensor): input representations of shape `(..., length, dim)` + mask (Tensor): bool mask of shape `(..., length)` + """ + x = self.attention(input, mask) + x = self.linear1(x) + x = self.dropout1(x) + x = self.layer_norm1(x + input) + + hidden = self.intermediate(x) + + hidden = self.linear2(hidden) + hidden = self.dropout2(hidden) + output = self.layer_norm2(hidden + x) + + return output \ No newline at end of file diff --git a/build/lib/torchdrug/layers/common.py b/build/lib/torchdrug/layers/common.py new file mode 100644 index 00000000..7334ed5f --- /dev/null +++ b/build/lib/torchdrug/layers/common.py @@ -0,0 +1,349 @@ +import inspect +import warnings +from collections.abc import Sequence + +import torch +from torch import nn +from torch.nn import functional as F +from torch_scatter import scatter_mean + +from torchdrug.layers import functional + + +class MultiLayerPerceptron(nn.Module): + """ + Multi-layer Perceptron. + Note there is no batch normalization, activation or dropout in the last layer. + + Parameters: + input_dim (int): input dimension + hidden_dim (list of int): hidden dimensions + short_cut (bool, optional): use short cut or not + batch_norm (bool, optional): apply batch normalization or not + activation (str or function, optional): activation function + dropout (float, optional): dropout rate + """ + + def __init__(self, input_dim, hidden_dims, short_cut=False, batch_norm=False, activation="relu", dropout=0): + super(MultiLayerPerceptron, self).__init__() + + if not isinstance(hidden_dims, Sequence): + hidden_dims = [hidden_dims] + self.dims = [input_dim] + hidden_dims + self.short_cut = short_cut + + if isinstance(activation, str): + self.activation = getattr(F, activation) + else: + self.activation = activation + if dropout: + self.dropout = nn.Dropout(dropout) + else: + self.dropout = None + + self.layers = nn.ModuleList() + for i in range(len(self.dims) - 1): + self.layers.append(nn.Linear(self.dims[i], self.dims[i + 1])) + if batch_norm: + self.batch_norms = nn.ModuleList() + for i in range(len(self.dims) - 2): + self.batch_norms.append(nn.BatchNorm1d(self.dims[i + 1])) + else: + self.batch_norms = None + + def forward(self, input): + """""" + layer_input = input + + for i, layer in enumerate(self.layers): + hidden = layer(layer_input) + if i < len(self.layers) - 1: + if self.batch_norms: + x = hidden.flatten(0, -2) + hidden = self.batch_norms[i](x).view_as(hidden) + hidden = self.activation(hidden) + if self.dropout: + hidden = self.dropout(hidden) + if self.short_cut and hidden.shape == layer_input.shape: + hidden = hidden + layer_input + layer_input = hidden + + return hidden + + +class GaussianSmearing(nn.Module): + r""" + Gaussian smearing from + `SchNet: A continuous-filter convolutional neural network for modeling quantum interactions`_. + + There are two modes for Gaussian smearing. + + Non-centered mode: + + .. math:: + + \mu = [0, 1, ..., n], \sigma = [1, 1, ..., 1] + + Centered mode: + + .. math:: + + \mu = [0, 0, ..., 0], \sigma = [0, 1, ..., n] + + .. _SchNet\: A continuous-filter convolutional neural network for modeling quantum interactions: + https://arxiv.org/pdf/1706.08566.pdf + + Parameters: + start (int, optional): minimal input value + stop (int, optional): maximal input value + num_kernel (int, optional): number of RBF kernels + centered (bool, optional): centered mode or not + learnable (bool, optional): learnable gaussian parameters or not + """ + + def __init__(self, start=0, stop=5, num_kernel=100, centered=False, learnable=False): + super(GaussianSmearing, self).__init__() + if centered: + mu = torch.zeros(num_kernel) + sigma = torch.linspace(start, stop, num_kernel) + else: + mu = torch.linspace(start, stop, num_kernel) + sigma = torch.ones(num_kernel) * (mu[1] - mu[0]) + + if learnable: + self.mu = nn.Parameter(mu) + self.sigma = nn.Parameter(sigma) + else: + self.register_buffer("mu", mu) + self.register_buffer("sigma", sigma) + + def forward(self, x, y): + """ + Compute smeared gaussian features between data. + + Parameters: + x (Tensor): data of shape :math:`(..., d)` + y (Tensor): data of shape :math:`(..., d)` + Returns: + Tensor: features of shape :math:`(..., num\_kernel)` + """ + distance = (x - y).norm(2, dim=-1, keepdim=True) + z = (distance - self.mu) / self.sigma + prob = torch.exp(-0.5 * z * z) + return prob + + +class PairNorm(nn.Module): + """ + Pair normalization layer proposed in `PairNorm: Tackling Oversmoothing in GNNs`_. + + .. _PairNorm\: Tackling Oversmoothing in GNNs: + https://openreview.net/pdf?id=rkecl1rtwB + + Parameters: + scale_individual (bool, optional): additionally normalize each node representation to have the same L2-norm + """ + + eps = 1e-8 + + def __init__(self, scale_individual=False): + super(PairNorm, self).__init__() + self.scale_individual = scale_individual + + def forward(self, graph, input): + """""" + if graph.batch_size > 1: + warnings.warn("PairNorm is proposed for a single graph, but now applied to a batch of graphs.") + + x = input.flatten(1) + x = x - x.mean(dim=0) + if self.scale_individual: + output = x / (x.norm(dim=-1, keepdim=True) + self.eps) + else: + output = x * x.shape[0] ** 0.5 / (x.norm() + self.eps) + return output.view_as(input) + + +class InstanceNorm(nn.modules.instancenorm._InstanceNorm): + """ + Instance normalization for graphs. This layer follows the definition in + `GraphNorm: A Principled Approach to Accelerating Graph Neural Network Training`_. + + .. _GraphNorm\: A Principled Approach to Accelerating Graph Neural Network Training: + https://arxiv.org/pdf/2009.03294.pdf + + Parameters: + input_dim (int): input dimension + eps (float, optional): epsilon added to the denominator + affine (bool, optional): use learnable affine parameters or not + """ + def __init__(self, input_dim, eps=1e-5, affine=False): + super(InstanceNorm, self).__init__(input_dim, eps, affine=affine) + + def forward(self, graph, input): + """""" + assert (graph.num_nodes >= 1).all() + + mean = scatter_mean(input, graph.node2graph, dim=0, dim_size=graph.batch_size) + centered = input - mean[graph.node2graph] + var = scatter_mean(centered ** 2, graph.node2graph, dim=0, dim_size=graph.batch_size) + std = (var + self.eps).sqrt() + output = centered / std[graph.node2graph] + + if self.affine: + output = torch.addcmul(self.bias, self.weight, output) + return output + + +class MutualInformation(nn.Module): + """ + Mutual information estimator from + `Learning deep representations by mutual information estimation and maximization`_. + + .. _Learning deep representations by mutual information estimation and maximization: + https://arxiv.org/pdf/1808.06670.pdf + + Parameters: + input_dim (int): input dimension + num_mlp_layer (int, optional): number of MLP layers + activation (str or function, optional): activation function + """ + + def __init__(self, input_dim, num_mlp_layer=2, activation="relu"): + super(MutualInformation, self).__init__() + self.x_mlp = MultiLayerPerceptron(input_dim, [input_dim] * num_mlp_layer, activation=activation) + self.y_mlp = MultiLayerPerceptron(input_dim, [input_dim] * num_mlp_layer, activation=activation) + + def forward(self, x, y, pair_index=None): + """""" + x = self.x_mlp(x) + y = self.y_mlp(y) + score = x @ y.t() + score = score.flatten() + + if pair_index is None: + assert len(x) == len(y) + pair_index = torch.arange(len(x), device=x.device).unsqueeze(-1).expand(-1, 2) + + index = pair_index[:, 0] * len(y) + pair_index[:, 1] + positive = torch.zeros_like(score, dtype=torch.bool) + positive[index] = 1 + negative = ~positive + + mutual_info = - functional.shifted_softplus(-score[positive]).mean() \ + - functional.shifted_softplus(score[negative]).mean() + return mutual_info + + +class Sequential(nn.Sequential): + """ + Improved sequential container. + Modules will be called in the order they are passed to the constructor. + + Compared to the vanilla nn.Sequential, this layer additionally supports the following features. + + 1. Multiple input / output arguments. + + >>> # layer1 signature: (...) -> (a, b) + >>> # layer2 signature: (a, b) -> (...) + >>> layer = layers.Sequential(layer1, layer2) + + 2. Global arguments. + + >>> # layer1 signature: (graph, a) -> b + >>> # layer2 signature: (graph, b) -> c + >>> layer = layers.Sequential(layer1, layer2, global_args=("graph",)) + + Note the global arguments don't need to be present in every layer. + + >>> # layer1 signature: (graph, a) -> b + >>> # layer2 signature: b -> c + >>> # layer3 signature: (graph, c) -> d + >>> layer = layers.Sequential(layer1, layer2, global_args=("graph",)) + + 3. Dict outputs. + + >>> # layer1 signature: a -> {"b": b, "c": c} + >>> # layer2 signature: b -> d + >>> layer = layers.Sequential(layer1, layer2, allow_unused=True) + + When dict outputs are used with global arguments, the global arguments can be explicitly + overwritten by any layer outputs. + + >>> # layer1 signature: (graph, a) -> {"graph": graph, "b": b} + >>> # layer2 signature: (graph, b) -> c + >>> # layer2 takes in the graph output by layer1 + >>> layer = layers.Sequential(layer1, layer2, global_args=("graph",)) + """ + + def __init__(self, *args, global_args=None, allow_unused=False): + super(Sequential, self).__init__(*args) + if global_args is not None: + self.global_args = set(global_args) + else: + self.global_args = {} + self.allow_unused = allow_unused + + def forward(self, *args, **kwargs): + """""" + global_kwargs = {} + for i, module in enumerate(self._modules.values()): + sig = inspect.signature(module.forward) + parameters = list(sig.parameters.values()) + param_names = [param.name for param in parameters] + j = 0 + for name in param_names: + if j == len(args): + break + if name in kwargs: + continue + if name in global_kwargs and name not in kwargs: + kwargs[name] = global_kwargs[name] + continue + kwargs[name] = args[j] + j += 1 + if self.allow_unused: + param_names = set(param_names) + # pop unused kwargs + kwargs = {k: v for k, v in kwargs.items() if k in param_names} + if j < len(args): + raise TypeError("too many positional arguments") + + output = module(**kwargs) + + global_kwargs.update({k: v for k, v in kwargs.items() if k in self.global_args}) + args = [] + kwargs = {} + if isinstance(output, dict): + kwargs.update(output) + elif isinstance(output, Sequence): + args += list(output) + else: + args.append(output) + + return output + + +class SinusoidalPositionEmbedding(nn.Module): + """ + Positional embedding based on sine and cosine functions, proposed in `Attention Is All You Need`_. + + .. _Attention Is All You Need: + https://arxiv.org/pdf/1706.03762.pdf + + Parameters: + output_dim (int): output dimension + """ + + def __init__(self, output_dim): + super(SinusoidalPositionEmbedding, self).__init__() + inverse_frequency = 1 / (10000 ** (torch.arange(0.0, output_dim, 2.0) / output_dim)) + self.register_buffer("inverse_frequency", inverse_frequency) + + def forward(self, input): + """""" + # input: [B, L, ...] + positions = torch.arange(input.shape[1] - 1, -1, -1.0, dtype=input.dtype, device=input.device) + sinusoidal_input = torch.outer(positions, self.inverse_frequency) + position_embedding = torch.cat([sinusoidal_input.sin(), sinusoidal_input.cos()], -1) + return position_embedding \ No newline at end of file diff --git a/build/lib/torchdrug/layers/conv.py b/build/lib/torchdrug/layers/conv.py new file mode 100644 index 00000000..2efaed38 --- /dev/null +++ b/build/lib/torchdrug/layers/conv.py @@ -0,0 +1,813 @@ +import functools + +import torch +from torch import nn +from torch.nn import functional as F +from torch.utils import checkpoint +from torch_scatter import scatter_mean, scatter_add, scatter_max + +from torchdrug import data, layers, utils +from torchdrug.layers import functional + + +class MessagePassingBase(nn.Module): + """ + Base module for message passing. + + Any custom message passing module should be derived from this class. + """ + gradient_checkpoint = False + + def message(self, graph, input): + """ + Compute edge messages for the graph. + + Parameters: + graph (Graph): graph(s) + input (Tensor): node representations of shape :math:`(|V|, ...)` + + Returns: + Tensor: edge messages of shape :math:`(|E|, ...)` + """ + raise NotImplementedError + + def aggregate(self, graph, message): + """ + Aggregate edge messages to nodes. + + Parameters: + graph (Graph): graph(s) + message (Tensor): edge messages of shape :math:`(|E|, ...)` + + Returns: + Tensor: node updates of shape :math:`(|V|, ...)` + """ + raise NotImplementedError + + def message_and_aggregate(self, graph, input): + """ + Fused computation of message and aggregation over the graph. + This may provide better time or memory complexity than separate calls of + :meth:`message ` and :meth:`aggregate `. + + Parameters: + graph (Graph): graph(s) + input (Tensor): node representations of shape :math:`(|V|, ...)` + + Returns: + Tensor: node updates of shape :math:`(|V|, ...)` + """ + message = self.message(graph, input) + update = self.aggregate(graph, message) + return update + + def _message_and_aggregate(self, *tensors): + graph = data.Graph.from_tensors(tensors[:-1]) + input = tensors[-1] + update = self.message_and_aggregate(graph, input) + return update + + def combine(self, input, update): + """ + Combine node input and node update. + + Parameters: + input (Tensor): node representations of shape :math:`(|V|, ...)` + update (Tensor): node updates of shape :math:`(|V|, ...)` + """ + raise NotImplementedError + + def forward(self, graph, input): + """ + Perform message passing over the graph(s). + + Parameters: + graph (Graph): graph(s) + input (Tensor): node representations of shape :math:`(|V|, ...)` + """ + if self.gradient_checkpoint: + update = checkpoint.checkpoint(self._message_and_aggregate, *graph.to_tensors(), input) + else: + update = self.message_and_aggregate(graph, input) + output = self.combine(input, update) + return output + + +class GraphConv(MessagePassingBase): + """ + Graph convolution operator from `Semi-Supervised Classification with Graph Convolutional Networks`_. + + .. _Semi-Supervised Classification with Graph Convolutional Networks: + https://arxiv.org/pdf/1609.02907.pdf + + Parameters: + input_dim (int): input dimension + output_dim (int): output dimension + edge_input_dim (int, optional): dimension of edge features + batch_norm (bool, optional): apply batch normalization on nodes or not + activation (str or function, optional): activation function + """ + + def __init__(self, input_dim, output_dim, edge_input_dim=None, batch_norm=False, activation="relu"): + super(GraphConv, self).__init__() + self.input_dim = input_dim + self.output_dim = output_dim + self.edge_input_dim = edge_input_dim + + if batch_norm: + self.batch_norm = nn.BatchNorm1d(output_dim) + else: + self.batch_norm = None + if isinstance(activation, str): + self.activation = getattr(F, activation) + else: + self.activation = activation + + self.linear = nn.Linear(input_dim, output_dim) + if edge_input_dim: + self.edge_linear = nn.Linear(edge_input_dim, input_dim) + else: + self.edge_linear = None + + def message(self, graph, input): + # add self loop + node_in = torch.cat([graph.edge_list[:, 0], torch.arange(graph.num_node, device=graph.device)]) + degree_in = graph.degree_in.unsqueeze(-1) + 1 + message = input[node_in] + if self.edge_linear: + edge_input = self.edge_linear(graph.edge_feature.float()) + edge_input = torch.cat([edge_input, torch.zeros(graph.num_node, self.input_dim, device=graph.device)]) + message += edge_input + message /= (degree_in[node_in].sqrt() + 1e-10) + return message + + def aggregate(self, graph, message): + # add self loop + node_out = torch.cat([graph.edge_list[:, 1], torch.arange(graph.num_node, device=graph.device)]) + edge_weight = torch.cat([graph.edge_weight, torch.ones(graph.num_node, device=graph.device)]) + edge_weight = edge_weight.unsqueeze(-1) + degree_out = graph.degree_out.unsqueeze(-1) + 1 + update = scatter_add(message * edge_weight, node_out, dim=0, dim_size=graph.num_node) + update = update / (degree_out.sqrt() + 1e-10) + return update + + def message_and_aggregate(self, graph, input): + node_in, node_out = graph.edge_list.t()[:2] + node_in = torch.cat([node_in, torch.arange(graph.num_node, device=graph.device)]) + node_out = torch.cat([node_out, torch.arange(graph.num_node, device=graph.device)]) + edge_weight = torch.cat([graph.edge_weight, torch.ones(graph.num_node, device=graph.device)]) + degree_in = graph.degree_in + 1 + degree_out = graph.degree_out + 1 + edge_weight = edge_weight / ((degree_in[node_in] * degree_out[node_out]).sqrt() + 1e-10) + adjacency = utils.sparse_coo_tensor(torch.stack([node_in, node_out]), edge_weight, + (graph.num_node, graph.num_node)) + update = torch.sparse.mm(adjacency.t(), input) + if self.edge_linear: + edge_input = graph.edge_feature.float() + edge_input = torch.cat([self.edge_linear(edge_input), torch.zeros(graph.num_node, self.input_dim, device=graph.device)]) + edge_weight = edge_weight.unsqueeze(-1) + node_out = torch.cat([graph.edge_list[:, 1], torch.arange(graph.num_node, device=graph.device)]) + edge_update = scatter_add(edge_input * edge_weight, node_out, dim=0, dim_size=graph.num_node) + update += edge_update + + return update + + def combine(self, input, update): + output = self.linear(update) + if self.batch_norm: + output = self.batch_norm(output) + if self.activation: + output = self.activation(output) + return output + + +class GraphAttentionConv(MessagePassingBase): + """ + Graph attentional convolution operator from `Graph Attention Networks`_. + + .. _Graph Attention Networks: + https://arxiv.org/pdf/1710.10903.pdf + + Parameters: + input_dim (int): input dimension + output_dim (int): output dimension + edge_input_dim (int, optional): dimension of edge features + num_head (int, optional): number of attention heads + negative_slope (float, optional): negative slope of leaky relu activation + batch_norm (bool, optional): apply batch normalization on nodes or not + activation (str or function, optional): activation function + """ + + eps = 1e-10 + + def __init__(self, input_dim, output_dim, edge_input_dim=None, num_head=1, negative_slope=0.2, concat=True, + batch_norm=False, activation="relu"): + super(GraphAttentionConv, self).__init__() + self.input_dim = input_dim + self.output_dim = output_dim + self.edge_input_dim = edge_input_dim + self.num_head = num_head + self.concat = concat + self.leaky_relu = functools.partial(F.leaky_relu, negative_slope=negative_slope) + + if batch_norm: + self.batch_norm = nn.BatchNorm1d(output_dim) + else: + self.batch_norm = None + if isinstance(activation, str): + self.activation = getattr(F, activation) + else: + self.activation = activation + if output_dim % num_head != 0: + raise ValueError("Expect output_dim to be a multiplier of num_head, but found `%d` and `%d`" + % (output_dim, num_head)) + + self.linear = nn.Linear(input_dim, output_dim) + if edge_input_dim: + self.edge_linear = nn.Linear(edge_input_dim, output_dim) + else: + self.edge_linear = None + self.query = nn.Parameter(torch.zeros(num_head, output_dim * 2 // num_head)) + nn.init.kaiming_uniform_(self.query, negative_slope, mode="fan_in") + + def message(self, graph, input): + # add self loop + node_in = torch.cat([graph.edge_list[:, 0], torch.arange(graph.num_node, device=graph.device)]) + node_out = torch.cat([graph.edge_list[:, 1], torch.arange(graph.num_node, device=graph.device)]) + edge_weight = torch.cat([graph.edge_weight, torch.ones(graph.num_node, device=graph.device)]) + edge_weight = edge_weight.unsqueeze(-1) + hidden = self.linear(input) + + key = torch.stack([hidden[node_in], hidden[node_out]], dim=-1) + if self.edge_linear: + edge_input = self.edge_linear(graph.edge_feature.float()) + edge_input = torch.cat([edge_input, torch.zeros(graph.num_node, self.output_dim, device=graph.device)]) + key += edge_input.unsqueeze(-1) + key = key.view(-1, *self.query.shape) + weight = torch.einsum("hd, nhd -> nh", self.query, key) + weight = self.leaky_relu(weight) + + weight = weight - scatter_max(weight, node_out, dim=0, dim_size=graph.num_node)[0][node_out] + attention = weight.exp() * edge_weight + # why mean? because with mean we have normalized message scale across different node degrees + normalizer = scatter_mean(attention, node_out, dim=0, dim_size=graph.num_node)[node_out] + attention = attention / (normalizer + self.eps) + + value = hidden[node_in].view(-1, self.num_head, self.query.shape[-1] // 2) + attention = attention.unsqueeze(-1).expand_as(value) + message = (attention * value).flatten(1) + return message + + def aggregate(self, graph, message): + # add self loop + node_out = torch.cat([graph.edge_list[:, 1], torch.arange(graph.num_node, device=graph.device)]) + update = scatter_mean(message, node_out, dim=0, dim_size=graph.num_node) + return update + + def combine(self, input, update): + output = update + if self.batch_norm: + output = self.batch_norm(output) + if self.activation: + output = self.activation(output) + return output + + +class GraphIsomorphismConv(MessagePassingBase): + """ + Graph isomorphism convolution operator from `How Powerful are Graph Neural Networks?`_ + + .. _How Powerful are Graph Neural Networks?: + https://arxiv.org/pdf/1810.00826.pdf + + Parameters: + input_dim (int): input dimension + output_dim (int): output dimension + edge_input_dim (int, optional): dimension of edge features + hidden_dims (list of int, optional): hidden dimensions + eps (float, optional): initial epsilon + learn_eps (bool, optional): learn epsilon or not + batch_norm (bool, optional): apply batch normalization on nodes or not + activation (str or function, optional): activation function + """ + + def __init__(self, input_dim, output_dim, edge_input_dim=None, hidden_dims=None, eps=0, learn_eps=False, + batch_norm=False, activation="relu"): + super(GraphIsomorphismConv, self).__init__() + self.input_dim = input_dim + self.output_dim = output_dim + self.edge_input_dim = edge_input_dim + + eps = torch.tensor([eps], dtype=torch.float32) + if learn_eps: + self.eps = nn.Parameter(eps) + else: + self.register_buffer("eps", eps) + if batch_norm: + self.batch_norm = nn.BatchNorm1d(output_dim) + else: + self.batch_norm = None + if isinstance(activation, str): + self.activation = getattr(F, activation) + else: + self.activation = activation + + if hidden_dims is None: + hidden_dims = [] + self.mlp = layers.MLP(input_dim, list(hidden_dims) + [output_dim], activation) + if edge_input_dim: + self.edge_linear = nn.Linear(edge_input_dim, input_dim) + else: + self.edge_linear = None + + def message(self, graph, input): + node_in = graph.edge_list[:, 0] + message = input[node_in] + if self.edge_linear: + message += self.edge_linear(graph.edge_feature.float()) + return message + + def aggregate(self, graph, message): + node_out = graph.edge_list[:, 1] + edge_weight = graph.edge_weight.unsqueeze(-1) + update = scatter_add(message * edge_weight, node_out, dim=0, dim_size=graph.num_node) + return update + + def message_and_aggregate(self, graph, input): + adjacency = utils.sparse_coo_tensor(graph.edge_list.t()[:2], graph.edge_weight, + (graph.num_node, graph.num_node)) + update = torch.sparse.mm(adjacency.t(), input) + if self.edge_linear: + edge_input = graph.edge_feature.float() + edge_weight = graph.edge_weight.unsqueeze(-1) + edge_input = self.edge_linear(edge_input) + edge_update = scatter_add(edge_input * edge_weight, graph.edge_list[:, 1], dim=0, + dim_size=graph.num_node) + update += edge_update + + return update + + def combine(self, input, update): + output = self.mlp((1 + self.eps) * input + update) + if self.batch_norm: + output = self.batch_norm(output) + if self.activation: + output = self.activation(output) + return output + + +class RelationalGraphConv(MessagePassingBase): + """ + Relational graph convolution operator from `Modeling Relational Data with Graph Convolutional Networks`_. + + .. _Modeling Relational Data with Graph Convolutional Networks: + https://arxiv.org/pdf/1703.06103.pdf + + Parameters: + input_dim (int): input dimension + output_dim (int): output dimension + num_relation (int): number of relations + edge_input_dim (int, optional): dimension of edge features + batch_norm (bool, optional): apply batch normalization on nodes or not + activation (str or function, optional): activation function + """ + eps = 1e-10 + + def __init__(self, input_dim, output_dim, num_relation, edge_input_dim=None, batch_norm=False, activation="relu"): + super(RelationalGraphConv, self).__init__() + self.input_dim = input_dim + self.output_dim = output_dim + self.num_relation = num_relation + self.edge_input_dim = edge_input_dim + + if batch_norm: + self.batch_norm = nn.BatchNorm1d(output_dim) + else: + self.batch_norm = None + if isinstance(activation, str): + self.activation = getattr(F, activation) + else: + self.activation = activation + + self.self_loop = nn.Linear(input_dim, output_dim) + self.linear = nn.Linear(num_relation * input_dim, output_dim) + if edge_input_dim: + self.edge_linear = nn.Linear(edge_input_dim, input_dim) + else: + self.edge_linear = None + + def message(self, graph, input): + node_in = graph.edge_list[:, 0] + message = input[node_in] + if self.edge_linear: + message += self.edge_linear(graph.edge_feature.float()) + return message + + def aggregate(self, graph, message): + assert graph.num_relation == self.num_relation + + node_out = graph.edge_list[:, 1] * self.num_relation + graph.edge_list[:, 2] + edge_weight = graph.edge_weight.unsqueeze(-1) + update = scatter_add(message * edge_weight, node_out, dim=0, dim_size=graph.num_node * self.num_relation) / \ + (scatter_add(edge_weight, node_out, dim=0, dim_size=graph.num_node * self.num_relation) + self.eps) + return update.view(graph.num_node, self.num_relation * self.input_dim) + + def message_and_aggregate(self, graph, input): + assert graph.num_relation == self.num_relation + + node_in, node_out, relation = graph.edge_list.t() + node_out = node_out * self.num_relation + relation + degree_out = scatter_add(graph.edge_weight, node_out, dim_size=graph.num_node * graph.num_relation) + edge_weight = graph.edge_weight / degree_out[node_out] + adjacency = utils.sparse_coo_tensor(torch.stack([node_in, node_out]), edge_weight, + (graph.num_node, graph.num_node * graph.num_relation)) + update = torch.sparse.mm(adjacency.t(), input) + if self.edge_linear: + edge_input = graph.edge_feature.float() + edge_input = self.edge_linear(edge_input) + edge_weight = edge_weight.unsqueeze(-1) + edge_update = scatter_add(edge_input * edge_weight, node_out, dim=0, + dim_size=graph.num_node * graph.num_relation) + update += edge_update + + return update.view(graph.num_node, self.num_relation * self.input_dim) + + def combine(self, input, update): + output = self.linear(update) + self.self_loop(input) + if self.batch_norm: + output = self.batch_norm(output) + if self.activation: + output = self.activation(output) + return output + + +class NeuralFingerprintConv(MessagePassingBase): + """ + Graph neural network operator from `Convolutional Networks on Graphs for Learning Molecular Fingerprints`_. + + Note this operator doesn't include the sparsifying step of the original paper. + + .. _Convolutional Networks on Graphs for Learning Molecular Fingerprints: + https://arxiv.org/pdf/1509.09292.pdf + + Parameters: + input_dim (int): input dimension + output_dim (int): output dimension + edge_input_dim (int, optional): dimension of edge features + batch_norm (bool, optional): apply batch normalization on nodes or not + activation (str or function, optional): activation function + """ + + def __init__(self, input_dim, output_dim, edge_input_dim=None, batch_norm=False, activation="relu"): + super(NeuralFingerprintConv, self).__init__() + self.input_dim = input_dim + self.output_dim = output_dim + self.edge_input_dim = edge_input_dim + + if batch_norm: + self.batch_norm = nn.BatchNorm1d(output_dim) + else: + self.batch_norm = None + if isinstance(activation, str): + self.activation = getattr(F, activation) + else: + self.activation = activation + + self.linear = nn.Linear(input_dim, output_dim) + if edge_input_dim: + self.edge_linear = nn.Linear(edge_input_dim, input_dim) + else: + self.edge_linear = None + + def message(self, graph, input): + node_in = graph.edge_list[:, 0] + message = input[node_in] + if self.edge_linear: + message += self.edge_linear(graph.edge_feature.float()) + return message + + def aggregate(self, graph, message): + node_out = graph.edge_list[:, 1] + edge_weight = graph.edge_weight.unsqueeze(-1) + update = scatter_add(message * edge_weight, node_out, dim=0, dim_size=graph.num_node) + return update + + def message_and_aggregate(self, graph, input): + adjacency = utils.sparse_coo_tensor(graph.edge_list.t()[:2], graph.edge_weight, + (graph.num_node, graph.num_node)) + update = torch.sparse.mm(adjacency.t(), input) + if self.edge_linear: + edge_input = graph.edge_feature.float() + edge_weight = graph.edge_weight.unsqueeze(-1) + edge_input = self.edge_linear(edge_input) + edge_update = scatter_add(edge_input * edge_weight, graph.edge_list[:, 1], dim=0, + dim_size=graph.num_node) + update += edge_update + + return update + + def combine(self, input, update): + output = self.linear(input + update) + if self.batch_norm: + output = self.batch_norm(output) + if self.activation: + output = self.activation(output) + return output + + +class ContinuousFilterConv(MessagePassingBase): + """ + Continuous filter operator from + `SchNet: A continuous-filter convolutional neural network for modeling quantum interactions`_. + + .. _SchNet\: A continuous-filter convolutional neural network for modeling quantum interactions: + https://arxiv.org/pdf/1706.08566.pdf + + Parameters: + input_dim (int): input dimension + output_dim (int): output dimension + edge_input_dim (int, optional): dimension of edge features + hidden_dim (int, optional): hidden dimension. By default, same as :attr:`output_dim` + cutoff (float, optional): maximal scale for RBF kernels + num_gaussian (int, optional): number of RBF kernels + batch_norm (bool, optional): apply batch normalization on nodes or not + activation (str or function, optional): activation function + """ + + def __init__(self, input_dim, output_dim, edge_input_dim=None, hidden_dim=None, cutoff=5, num_gaussian=100, + batch_norm=False, activation="shifted_softplus"): + super(ContinuousFilterConv, self).__init__() + self.input_dim = input_dim + self.output_dim = output_dim + self.edge_input_dim = edge_input_dim + if hidden_dim is None: + hidden_dim = output_dim + self.hidden_dim = hidden_dim + self.rbf = layers.RBF(stop=cutoff, num_kernel=num_gaussian) + + if batch_norm: + self.batch_norm = nn.BatchNorm1d(output_dim) + else: + self.batch_norm = None + if activation == "shifted_softplus": + self.activation = functional.shifted_softplus + elif isinstance(activation, str): + self.activation = getattr(F, activation) + else: + self.activation = activation + + self.input_layer = nn.Linear(input_dim, hidden_dim) + self.rbf_layer = nn.Linear(num_gaussian, hidden_dim) + self.output_layer = nn.Linear(hidden_dim, output_dim) + if edge_input_dim: + self.edge_linear = nn.Linear(edge_input_dim, hidden_dim) + else: + self.edge_linear = None + + def message(self, graph, input): + node_in, node_out = graph.edge_list.t()[:2] + position = graph.node_position + message = self.input_layer(input)[node_in] + if self.edge_linear: + message += self.edge_linear(graph.edge_feature.float()) + weight = self.rbf_layer(self.rbf(position[node_in], position[node_out])) + message *= weight + return message + + def aggregate(self, graph, message): + node_out = graph.edge_list[:, 1] + edge_weight = graph.edge_weight.unsqueeze(-1) + update = scatter_add(message * edge_weight, node_out, dim=0, dim_size=graph.num_node) + return update + + def message_and_aggregate(self, graph, input): + node_in, node_out = graph.edge_list.t()[:2] + position = graph.node_position + rbf_weight = self.rbf_layer(self.rbf(position[node_in], position[node_out])) + indices = torch.stack([node_out, node_in, torch.arange(graph.num_edge, device=graph.device)]) + adjacency = utils.sparse_coo_tensor(indices, graph.edge_weight, (graph.num_node, graph.num_node, graph.num_edge)) + update = functional.generalized_rspmm(adjacency, rbf_weight, self.input_layer(input)) + if self.edge_linear: + edge_input = graph.edge_feature.float() + edge_input = self.edge_linear(edge_input) + edge_weight = graph.edge_weight.unsqueeze(-1) * rbf_weight + edge_update = scatter_add(edge_input * edge_weight, graph.edge_list[:, 1], dim=0, + dim_size=graph.num_node) + update += edge_update + + return update + + def combine(self, input, update): + output = self.output_layer(update) + if self.batch_norm: + output = self.batch_norm(output) + if self.activation: + output = self.activation(output) + return output + + +class MessagePassing(MessagePassingBase): + """ + Message passing operator from `Neural Message Passing for Quantum Chemistry`_. + + This implements the edge network variant in the original paper. + + .. _Neural Message Passing for Quantum Chemistry: + https://arxiv.org/pdf/1704.01212.pdf + + Parameters: + input_dim (int): input dimension + edge_input_dim (int): dimension of edge features + hidden_dims (list of int, optional): hidden dims of edge network + batch_norm (bool, optional): apply batch normalization on nodes or not + activation (str or function, optional): activation function + """ + + def __init__(self, input_dim, edge_input_dim, hidden_dims=None, batch_norm=False, activation="relu"): + super(MessagePassing, self).__init__() + self.input_dim = input_dim + self.output_dim = input_dim + self.edge_input_dim = edge_input_dim + if hidden_dims is None: + hidden_dims = [] + + if batch_norm: + self.batch_norm = nn.BatchNorm1d(input_dim) + else: + self.batch_norm = None + if isinstance(activation, str): + self.activation = getattr(F, activation) + else: + self.activation = activation + + self.edge_mlp = layers.MLP(edge_input_dim, list(hidden_dims) + [input_dim * input_dim], activation) + + def message(self, graph, input): + node_in = graph.edge_list[:, 0] + transform = self.edge_mlp(graph.edge_feature.float()).view(-1, self.input_dim, self.input_dim) + if graph.num_edge: + message = torch.einsum("bed, bd -> be", transform, input[node_in]) + else: + message = torch.zeros(0, self.input_dim, device=graph.device) + return message + + def aggregate(self, graph, message): + node_out = graph.edge_list[:, 1] + edge_weight = graph.edge_weight.unsqueeze(-1) + update = scatter_add(message * edge_weight, node_out, dim=0, dim_size=graph.num_node) + return update + + def combine(self, input, update): + output = update + if self.batch_norm: + output = self.batch_norm(output) + if self.activation: + output = self.activation(output) + return output + + +class ChebyshevConv(MessagePassingBase): + """ + Chebyshev spectral graph convolution operator from + `Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering`_. + + .. _Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering: + https://arxiv.org/pdf/1606.09375.pdf + + Parameters: + input_dim (int): input dimension + output_dim (int): output dimension + edge_input_dim (int, optional): dimension of edge features + k (int, optional): number of Chebyshev polynomials. + This also corresponds to the radius of the receptive field. + hidden_dims (list of int, optional): hidden dims of edge network + batch_norm (bool, optional): apply batch normalization on nodes or not + activation (str or function, optional): activation function + """ + + def __init__(self, input_dim, output_dim, edge_input_dim=None, k=1, batch_norm=False, activation="relu"): + super(ChebyshevConv, self).__init__() + self.input_dim = input_dim + self.output_dim = output_dim + self.k = k + self.edge_input_dim = edge_input_dim + + if batch_norm: + self.batch_norm = nn.BatchNorm1d(output_dim) + else: + self.batch_norm = None + if isinstance(activation, str): + self.activation = getattr(F, activation) + else: + self.activation = activation + + self.linear = nn.Linear((k + 1) * input_dim, output_dim) + if edge_input_dim: + self.edge_linear = nn.Linear(edge_input_dim, input_dim) + else: + self.edge_linear = None + + def message(self, graph, input): + node_in = graph.edge_list[:, 0] + degree_in = graph.degree_in.unsqueeze(-1) + # because self-loop messages have a different scale, they are processed in combine() + message = input[node_in] + if self.edge_linear: + message += self.edge_linear(graph.edge_feature.float()) + message /= (degree_in[node_in].sqrt() + 1e-10) + return message + + def aggregate(self, graph, message): + node_out = graph.edge_list[:, 1] + edge_weight = graph.edge_weight.unsqueeze(-1) + degree_out = graph.degree_out.unsqueeze(-1) + # because self-loop messages have a different scale, they are processed in combine() + update = -scatter_add(message * edge_weight, node_out, dim=0, dim_size=graph.num_node) + update = update / (degree_out.sqrt() + 1e-10) + return update + + def message_and_aggregate(self, graph, input): + node_in, node_out = graph.edge_list.t()[:2] + edge_weight = -graph.edge_weight / ((graph.degree_in[node_in] * graph.degree_out[node_out]).sqrt() + 1e-10) + adjacency = utils.sparse_coo_tensor(graph.edge_list.t()[:2], edge_weight, (graph.num_node, graph.num_node)) + update = torch.sparse.mm(adjacency.t(), input) + if self.edge_linear: + edge_input = graph.edge_feature.float() + edge_input = self.edge_linear(edge_input) + edge_weight = edge_weight.unsqueeze(-1) + edge_update = scatter_add(edge_input * edge_weight, graph.edge_list[:, 1], dim=0, + dim_size=graph.num_node) + update += edge_update + + return update + + def forward(self, graph, input): + # Chebyshev polynomial bases + bases = [input] + for i in range(self.k): + x = super(ChebyshevConv, self).forward(graph, bases[-1]) + if i > 0: + x = 2 * x - bases[-2] + bases.append(x) + bases = torch.cat(bases, dim=-1) + + output = self.linear(bases) + if self.batch_norm: + x = self.batch_norm(output) + if self.activation: + output = self.activation(output) + return output + + def combine(self, input, update): + output = input + update + return output + + +class GeometricRelationalGraphConv(RelationalGraphConv): + """ + Geometry-aware relational graph convolution operator from + `Protein Representation Learning by Geometric Structure Pretraining`_. + + .. _Protein Representation Learning by Geometric Structure Pretraining: + https://arxiv.org/pdf/2203.06125.pdf + + Parameters: + input_dim (int): input dimension + output_dim (int): output dimension + num_relation (int): number of relations + edge_input_dim (int, optional): dimension of edge features + batch_norm (bool, optional): apply batch normalization on nodes or not + activation (str or function, optional): activation function + """ + + def __init__(self, input_dim, output_dim, num_relation, edge_input_dim=None, batch_norm=False, activation="relu"): + super(GeometricRelationalGraphConv, self).__init__(input_dim, output_dim, num_relation, edge_input_dim, + batch_norm, activation) + + def aggregate(self, graph, message): + assert graph.num_relation == self.num_relation + + node_out = graph.edge_list[:, 1] * self.num_relation + graph.edge_list[:, 2] + edge_weight = graph.edge_weight.unsqueeze(-1) + update = scatter_add(message * edge_weight, node_out, dim=0, dim_size=graph.num_node * self.num_relation) + update = update.view(graph.num_node, self.num_relation * self.input_dim) + + return update + + def message_and_aggregate(self, graph, input): + assert graph.num_relation == self.num_relation + + node_in, node_out, relation = graph.edge_list.t() + node_out = node_out * self.num_relation + relation + adjacency = utils.sparse_coo_tensor(torch.stack([node_in, node_out]), graph.edge_weight, + (graph.num_node, graph.num_node * graph.num_relation)) + update = torch.sparse.mm(adjacency.t(), input) + if self.edge_linear: + edge_input = graph.edge_feature.float() + edge_input = self.edge_linear(edge_input) + edge_weight = graph.edge_weight.unsqueeze(-1) + edge_update = scatter_add(edge_input * edge_weight, node_out, dim=0, + dim_size=graph.num_node * graph.num_relation) + update += edge_update + + return update.view(graph.num_node, self.num_relation * self.input_dim) diff --git a/build/lib/torchdrug/layers/distribution.py b/build/lib/torchdrug/layers/distribution.py new file mode 100644 index 00000000..bdb0ebb5 --- /dev/null +++ b/build/lib/torchdrug/layers/distribution.py @@ -0,0 +1,50 @@ +import math +from collections.abc import Sequence + +import torch +from torch import nn + + +class IndependentGaussian(nn.Module): + """ + Independent Gaussian distribution. + + Parameters: + mu (Tensor): mean of shape :math:`(N,)` + sigma2 (Tensor): variance of shape :math:`(N,)` + learnable (bool, optional): learnable parameters or not + """ + + def __init__(self, mu, sigma2, learnable=False): + super(IndependentGaussian, self).__init__() + if learnable: + self.mu = nn.Parameter(torch.as_tensor(mu)) + self.sigma2 = nn.Parameter(torch.as_tensor(sigma2)) + else: + self.register_buffer("mu", torch.as_tensor(mu)) + self.register_buffer("sigma2", torch.as_tensor(sigma2)) + self.dim = len(mu) + + def forward(self, input): + """ + Compute the likelihood of input data. + + Parameters: + input (Tensor): input data of shape :math:`(..., N)` + """ + log_likelihood = -0.5 * (math.log(2 * math.pi) + self.sigma2.log() + (input - self.mu) ** 2 / self.sigma2) + return log_likelihood + + def sample(self, *size): + """ + Draw samples from the distribution. + + Parameters: + size (tuple of int): shape of the samples + """ + if len(size) == 1 and isinstance(size[0], Sequence): + size = size[0] + size = list(size) + [self.dim] + + sample = torch.randn(size, device=self.mu.device) * self.sigma2.sqrt() + self.mu + return sample diff --git a/build/lib/torchdrug/layers/flow.py b/build/lib/torchdrug/layers/flow.py new file mode 100644 index 00000000..ab0b27f4 --- /dev/null +++ b/build/lib/torchdrug/layers/flow.py @@ -0,0 +1,64 @@ +import torch +from torch import nn +from torch.nn import functional as F + +from torchdrug import layers + + +class ConditionalFlow(nn.Module): + """ + Conditional flow transformation from `Masked Autoregressive Flow for Density Estimation`_. + + .. _Masked Autoregressive Flow for Density Estimation: + https://arxiv.org/pdf/1705.07057.pdf + + Parameters: + input_dim (int): input & output dimension + condition_dim (int): condition dimension + hidden_dims (list of int, optional): hidden dimensions + activation (str or function, optional): activation function + """ + + def __init__(self, input_dim, condition_dim, hidden_dims=None, activation="relu"): + super(ConditionalFlow, self).__init__() + self.input_dim = input_dim + self.output_dim = input_dim + + if hidden_dims is None: + hidden_dims = [] + self.mlp = layers.MLP(condition_dim, list(hidden_dims) + [input_dim * 2], activation) + self.rescale = nn.Parameter(torch.zeros(1)) + + def forward(self, input, condition): + """ + Transform data into latent representations. + + Parameters: + input (Tensor): input representations + condition (Tensor): conditional representations + + Returns: + (Tensor, Tensor): latent representations, log-likelihood of the transformation + """ + scale, bias = self.mlp(condition).chunk(2, dim=-1) + scale = (F.tanh(scale) * self.rescale) + output = (input + bias) * scale.exp() + log_det = scale + return output, log_det + + def reverse(self, latent, condition): + """ + Transform latent representations into data. + + Parameters: + latent (Tensor): latent representations + condition (Tensor): conditional representations + + Returns: + (Tensor, Tensor): input representations, log-likelihood of the transformation + """ + scale, bias = self.mlp(condition).chunk(2, dim=-1) + scale = (F.tanh(scale) * self.rescale) + output = latent / scale.exp() - bias + log_det = scale + return output, log_det \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/__init__.py b/build/lib/torchdrug/layers/functional/__init__.py new file mode 100644 index 00000000..36b2988e --- /dev/null +++ b/build/lib/torchdrug/layers/functional/__init__.py @@ -0,0 +1,17 @@ +from .functional import multinomial, masked_mean, mean_with_nan, shifted_softplus, multi_slice, multi_slice_mask, \ + as_mask, _extend, variadic_log_softmax, variadic_softmax, variadic_sum, variadic_mean, variadic_max, \ + variadic_cross_entropy, variadic_sort, variadic_topk, variadic_arange, variadic_randperm, variadic_sample,\ + variadic_meshgrid, variadic_to_padded, padded_to_variadic, one_hot, clipped_policy_gradient_objective, \ + policy_gradient_objective +from .embedding import transe_score, distmult_score, complex_score, simple_score, rotate_score +from .spmm import generalized_spmm, generalized_rspmm + +__all__ = [ + "multinomial", "masked_mean", "mean_with_nan", "shifted_softplus", "multi_slice_mask", "as_mask", + "variadic_log_softmax", "variadic_softmax", "variadic_sum", "variadic_mean", "variadic_max", + "variadic_cross_entropy", "variadic_sort", "variadic_topk", "variadic_arange", "variadic_randperm", + "variadic_sample", "variadic_meshgrid", "variadic_to_padded", "padded_to_variadic", + "one_hot", "clipped_policy_gradient_objective", "policy_gradient_objective", + "transe_score", "distmult_score", "complex_score", "simple_score", "rotate_score", + "generalized_spmm", "generalized_rspmm", +] \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/embedding.py b/build/lib/torchdrug/layers/functional/embedding.py new file mode 100644 index 00000000..eb422ae8 --- /dev/null +++ b/build/lib/torchdrug/layers/functional/embedding.py @@ -0,0 +1,269 @@ +import os + +import torch +from torch import autograd + +from torchdrug import utils + +backend = "fast" + +path = os.path.join(os.path.dirname(__file__), "extension") +embedding = utils.load_extension("embedding", + [os.path.join(path, "embedding.cpp"), os.path.join(path, "embedding.cu")]) + + +class TransEFunction(autograd.Function): + + @staticmethod + def forward(ctx, entity, relation, h_index, t_index, r_index): + if entity.device.type == "cuda": + forward = embedding.transe_forward_cuda + else: + forward = embedding.transe_forward_cpu + score = forward(entity, relation, h_index, t_index, r_index) + ctx.save_for_backward(entity, relation, h_index, t_index, r_index) + return score + + @staticmethod + def backward(ctx, score_grad): + if score_grad.device.type == "cuda": + backward = embedding.transe_backward_cuda + else: + backward = embedding.transe_backward_cpu + entity_grad, relation_grad = backward(*ctx.saved_tensors, score_grad) + return entity_grad, relation_grad, None, None, None + + +class DistMultFunction(autograd.Function): + + @staticmethod + def forward(ctx, entity, relation, h_index, t_index, r_index): + if entity.device.type == "cuda": + forward = embedding.distmult_forward_cuda + else: + forward = embedding.distmult_forward_cpu + score = forward(entity, relation, h_index, t_index, r_index) + ctx.save_for_backward(entity, relation, h_index, t_index, r_index) + return score + + @staticmethod + def backward(ctx, score_grad): + if score_grad.device.type == "cuda": + backward = embedding.distmult_backward_cuda + else: + backward = embedding.distmult_backward_cpu + entity_grad, relation_grad = backward(*ctx.saved_tensors, score_grad) + return entity_grad, relation_grad, None, None, None + + +class ComplExFunction(autograd.Function): + + @staticmethod + def forward(ctx, entity, relation, h_index, t_index, r_index): + if entity.device.type == "cuda": + forward = embedding.complex_forward_cuda + else: + forward = embedding.complex_forward_cpu + score = forward(entity, relation, h_index, t_index, r_index) + ctx.save_for_backward(entity, relation, h_index, t_index, r_index) + return score + + @staticmethod + def backward(ctx, score_grad): + if score_grad.device.type == "cuda": + backward = embedding.complex_backward_cuda + else: + backward = embedding.complex_backward_cpu + entity_grad, relation_grad = backward(*ctx.saved_tensors, score_grad) + return entity_grad, relation_grad, None, None, None + + +class SimplEFunction(autograd.Function): + + @staticmethod + def forward(ctx, entity, relation, h_index, t_index, r_index): + if entity.device.type == "cuda": + forward = embedding.simple_forward_cuda + else: + forward = embedding.simple_forward_cpu + score = forward(entity, relation, h_index, t_index, r_index) + ctx.save_for_backward(entity, relation, h_index, t_index, r_index) + return score + + @staticmethod + def backward(ctx, score_grad): + if score_grad.device.type == "cuda": + backward = embedding.simple_backward_cuda + else: + backward = embedding.simple_backward_cpu + entity_grad, relation_grad = backward(*ctx.saved_tensors, score_grad) + return entity_grad, relation_grad, None, None, None + + +class RotatEFunction(autograd.Function): + + @staticmethod + def forward(ctx, entity, relation, h_index, t_index, r_index): + if entity.device.type == "cuda": + forward = embedding.rotate_forward_cuda + else: + forward = embedding.rotate_forward_cpu + score = forward(entity, relation, h_index, t_index, r_index) + ctx.save_for_backward(entity, relation, h_index, t_index, r_index) + return score + + @staticmethod + def backward(ctx, score_grad): + if score_grad.device.type == "cuda": + backward = embedding.rotate_backward_cuda + else: + backward = embedding.rotate_backward_cpu + entity_grad, relation_grad = backward(*ctx.saved_tensors, score_grad) + return entity_grad, relation_grad, None, None, None + + +def transe_score(entity, relation, h_index, t_index, r_index): + """ + TransE score function from `Translating Embeddings for Modeling Multi-relational Data`_. + + .. _Translating Embeddings for Modeling Multi-relational Data: + https://proceedings.neurips.cc/paper/2013/file/1cecc7a77928ca8133fa24680a88d2f9-Paper.pdf + + Parameters: + entity (Tensor): entity embeddings of shape :math:`(|V|, d)` + relation (Tensor): relation embeddings of shape :math:`(|R|, d)` + h_index (LongTensor): index of head entities + t_index (LongTensor): index of tail entities + r_index (LongTensor): index of relations + """ + if backend == "native": + h = entity[h_index] + r = relation[r_index] + t = entity[t_index] + score = (h + r - t).norm(p=1, dim=-1) + elif backend == "fast": + score = TransEFunction.apply(entity, relation, h_index, t_index, r_index) + else: + raise ValueError("Unknown embedding backend `%s`" % backend) + return score + + +def distmult_score(entity, relation, h_index, t_index, r_index): + """ + DistMult score function from `Embedding Entities and Relations for Learning and Inference in Knowledge Bases`_. + + .. _Embedding Entities and Relations for Learning and Inference in Knowledge Bases: + https://arxiv.org/pdf/1412.6575.pdf + + Parameters: + entity (Tensor): entity embeddings of shape :math:`(|V|, d)` + relation (Tensor): relation embeddings of shape :math:`(|R|, d)` + h_index (LongTensor): index of head entities + t_index (LongTensor): index of tail entities + r_index (LongTensor): index of relations + """ + if backend == "native": + h = entity[h_index] + r = relation[r_index] + t = entity[t_index] + score = (h * r * t).sum(dim=-1) + elif backend == "fast": + score = DistMultFunction.apply(entity, relation, h_index, t_index, r_index) + else: + raise ValueError("Unknown embedding backend `%s`" % backend) + return score + + +def complex_score(entity, relation, h_index, t_index, r_index): + """ + ComplEx score function from `Complex Embeddings for Simple Link Prediction`_. + + .. _Complex Embeddings for Simple Link Prediction: + http://proceedings.mlr.press/v48/trouillon16.pdf + + Parameters: + entity (Tensor): entity embeddings of shape :math:`(|V|, 2d)` + relation (Tensor): relation embeddings of shape :math:`(|R|, 2d)` + h_index (LongTensor): index of head entities + t_index (LongTensor): index of tail entities + r_index (LongTensor): index of relations + """ + if backend == "native": + h = entity[h_index] + r = relation[r_index] + t = entity[t_index] + + h_re, h_im = h.chunk(2, dim=-1) + r_re, r_im = r.chunk(2, dim=-1) + t_re, t_im = t.chunk(2, dim=-1) + + x_re = h_re * r_re - h_im * r_im + x_im = h_re * r_im + h_im * r_re + x = x_re * t_re + x_im * t_im + score = x.sum(dim=-1) + elif backend == "fast": + score = ComplExFunction.apply(entity, relation, h_index, t_index, r_index) + else: + raise ValueError("Unknown embedding backend `%s`" % backend) + return score + + +def simple_score(entity, relation, h_index, t_index, r_index): + """ + SimplE score function from `SimplE Embedding for Link Prediction in Knowledge Graphs`_. + + .. _SimplE Embedding for Link Prediction in Knowledge Graphs: + https://papers.nips.cc/paper/2018/file/b2ab001909a8a6f04b51920306046ce5-Paper.pdf + + Parameters: + entity (Tensor): entity embeddings of shape :math:`(|V|, 2d)` + relation (Tensor): relation embeddings of shape :math:`(|R|, d)` + h_index (LongTensor): index of head entities + t_index (LongTensor): index of tail entities + r_index (LongTensor): index of relations + """ + if backend == "native": + h = entity[h_index] + r = relation[r_index] + t = entity[t_index] + t_flipped = torch.cat(t.chunk(2, dim=-1)[::-1], dim=-1) + score = (h * r * t_flipped).sum(dim=-1) + elif backend == "fast": + score = SimplEFunction.apply(entity, relation, h_index, t_index, r_index) + else: + raise ValueError("Unknown embedding backend `%s`" % backend) + return score + + +def rotate_score(entity, relation, h_index, t_index, r_index): + """ + RotatE score function from `RotatE: Knowledge Graph Embedding by Relational Rotation in Complex Space`_. + + .. _RotatE\: Knowledge Graph Embedding by Relational Rotation in Complex Space: + https://arxiv.org/pdf/1902.10197.pdf + + Parameters: + entity (Tensor): entity embeddings of shape :math:`(|V|, 2d)` + relation (Tensor): relation embeddings of shape :math:`(|R|, d)` + h_index (LongTensor): index of head entities + t_index (LongTensor): index of tail entities + r_index (LongTensor): index of relations + """ + if backend == "native": + h = entity[h_index] + r = relation[r_index] + t = entity[t_index] + + h_re, h_im = h.chunk(2, dim=-1) + r_re, r_im = torch.cos(r), torch.sin(r) + t_re, t_im = t.chunk(2, dim=-1) + + x_re = h_re * r_re - h_im * r_im - t_re + x_im = h_re * r_im + h_im * r_re - t_im + x = torch.stack([x_re, x_im], dim=-1) + score = x.norm(p=2, dim=-1).sum(dim=-1) + elif backend == "fast": + score = RotatEFunction.apply(entity, relation, h_index, t_index, r_index) + else: + raise ValueError("Unknown embedding backend `%s`" % backend) + return score \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/extension/__init__.py b/build/lib/torchdrug/layers/functional/extension/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/build/lib/torchdrug/layers/functional/extension/embedding.cpp b/build/lib/torchdrug/layers/functional/extension/embedding.cpp new file mode 100644 index 00000000..a4a20fba --- /dev/null +++ b/build/lib/torchdrug/layers/functional/extension/embedding.cpp @@ -0,0 +1,416 @@ +#include + +#include "embedding.h" + +namespace at { + +// In PyTorch 1.4.0, parallel_for depends on some functions from at::internal in ATen/Parallel.h +// which are not explicitly included +// This is fixed in some new PyTorch release +using namespace at::internal; + +void embedding_forward_check(CheckedFrom c, const TensorArg &entity_arg, const TensorArg &relation_arg, + const TensorArg &h_index_arg, const TensorArg &t_index_arg, const TensorArg &r_index_arg) { + checkDim(c, entity_arg, 2); + checkDim(c, relation_arg, 2); + checkAllSameNumel(c, {h_index_arg, r_index_arg, t_index_arg}); + checkScalarType(c, h_index_arg, kLong); + checkScalarType(c, t_index_arg, kLong); + checkScalarType(c, r_index_arg, kLong); +} + +void embedding_backward_check(CheckedFrom c, const TensorArg &entity_arg, const TensorArg &relation_arg, + const TensorArg &h_index_arg, const TensorArg &t_index_arg, const TensorArg &r_index_arg, + const TensorArg &score_grad_arg) { + embedding_forward_check(c, entity_arg, relation_arg, h_index_arg, t_index_arg, r_index_arg); + checkSameSize(c, h_index_arg, score_grad_arg); +} + +template +void transe_forward_out_cpu(const scalar_t *entity, const scalar_t *relation, const int64_t *h_index, + const int64_t *t_index, const int64_t *r_index, scalar_t *score, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + parallel_for(0, num_sample, 0, [&](int64_t start, int64_t end) { + for (int64_t sample_id = start; sample_id < end; sample_id++) { + const scalar_t *h = entity + h_index[sample_id] * embedding_dim; + const scalar_t *r = relation + r_index[sample_id] * embedding_dim; + const scalar_t *t = entity + t_index[sample_id] * embedding_dim; + scalar_t x = 0; + for (int64_t i = 0; i < embedding_dim; i++) + x += ::abs(h[i] + r[i] - t[i]); + + score[sample_id] = x; + } + }); +} + +template +void transe_backward_out_cpu(const scalar_t *entity, const scalar_t *relation, + const int64_t *h_index, const int64_t *t_index, const int64_t *r_index, + const scalar_t *score_grad, scalar_t *entity_grad, scalar_t *relation_grad, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + // since #CPU thread < embedding_dim + // we can parallel over embedding_dim to avoid atomic operations + parallel_for(0, embedding_dim, 0, [&](int64_t start, int64_t end) { + for (int64_t sample_id = 0; sample_id < num_sample; sample_id++) { + int64_t h_sample = h_index[sample_id]; + int64_t r_sample = r_index[sample_id]; + int64_t t_sample = t_index[sample_id]; + const scalar_t *h = entity + h_sample * embedding_dim; + const scalar_t *r = relation + r_sample * embedding_dim; + const scalar_t *t = entity + t_sample * embedding_dim; + scalar_t *h_grad = entity_grad + h_sample * embedding_dim; + scalar_t *r_grad = relation_grad + r_sample * embedding_dim; + scalar_t *t_grad = entity_grad + t_sample * embedding_dim; + scalar_t grad = score_grad[sample_id]; + + for (int64_t i = start; i < end; i++) { + scalar_t s = h[i] + r[i] - t[i] > 0 ? 1 : -1; + h_grad[i] += grad * s; + r_grad[i] += grad * s; + t_grad[i] += -grad * s; + } + } + }); +} + +template +void distmult_forward_out_cpu(const scalar_t *entity, const scalar_t *relation, const int64_t *h_index, + const int64_t *t_index, const int64_t *r_index, scalar_t *score, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + parallel_for(0, num_sample, 0, [&](int64_t start, int64_t end) { + for (int64_t sample_id = start; sample_id < end; sample_id++) { + const scalar_t *h = entity + h_index[sample_id] * embedding_dim; + const scalar_t *r = relation + r_index[sample_id] * embedding_dim; + const scalar_t *t = entity + t_index[sample_id] * embedding_dim; + scalar_t x = 0; + for (int64_t i = 0; i < embedding_dim; i++) + x += h[i] * r[i] * t[i]; + + score[sample_id] = x; + } + }); +} + +template +void distmult_backward_out_cpu(const scalar_t *entity, const scalar_t *relation, + const int64_t *h_index, const int64_t *t_index, const int64_t *r_index, + const scalar_t *score_grad, scalar_t *entity_grad, scalar_t *relation_grad, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + // since #CPU thread < embedding_dim + // we can parallel over embedding_dim to avoid atomic operations + parallel_for(0, embedding_dim, 0, [&](int64_t start, int64_t end) { + for (int64_t sample_id = 0; sample_id < num_sample; sample_id++) { + int64_t h_sample = h_index[sample_id]; + int64_t r_sample = r_index[sample_id]; + int64_t t_sample = t_index[sample_id]; + const scalar_t *h = entity + h_sample * embedding_dim; + const scalar_t *r = relation + r_sample * embedding_dim; + const scalar_t *t = entity + t_sample * embedding_dim; + scalar_t *h_grad = entity_grad + h_sample * embedding_dim; + scalar_t *r_grad = relation_grad + r_sample * embedding_dim; + scalar_t *t_grad = entity_grad + t_sample * embedding_dim; + scalar_t grad = score_grad[sample_id]; + + for (int64_t i = start; i < end; i++) { + scalar_t h_i = h[i], r_i = r[i], t_i = t[i]; + h_grad[i] += grad * r_i * t_i; + r_grad[i] += grad * h_i * t_i; + t_grad[i] += grad * h_i * r_i; + } + } + }); +} + +template +void complex_forward_out_cpu(const scalar_t *entity, const scalar_t *relation, const int64_t *h_index, + const int64_t *t_index, const int64_t *r_index, scalar_t *score, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + parallel_for(0, num_sample, 0, [&](int64_t start, int64_t end) { + for (int64_t sample_id = start; sample_id < end; sample_id++) { + const scalar_t *h = entity + h_index[sample_id] * embedding_dim; + const scalar_t *r = relation + r_index[sample_id] * embedding_dim; + const scalar_t *t = entity + t_index[sample_id] * embedding_dim; + scalar_t x = 0; + for (int64_t i = 0; i < embedding_dim / 2; i++) { + scalar_t h_re = h[i], h_im = h[i + embedding_dim / 2]; + scalar_t r_re = r[i], r_im = r[i + embedding_dim / 2]; + scalar_t t_re = t[i], t_im = t[i + embedding_dim / 2]; + scalar_t product_re = h_re * r_re - h_im * r_im; + scalar_t product_im = h_re * r_im + h_im * r_re; + x += product_re * t_re + product_im * t_im; + } + + score[sample_id] = x; + } + }); +} + +template +void complex_backward_out_cpu(const scalar_t *entity, const scalar_t *relation, + const int64_t *h_index, const int64_t *t_index, const int64_t *r_index, + const scalar_t *score_grad, scalar_t *entity_grad, scalar_t *relation_grad, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + // since #CPU thread < embedding_dim + // we can parallel over embedding_dim to avoid atomic operations + parallel_for(0, embedding_dim / 2, 0, [&](int64_t start, int64_t end) { + for (int64_t sample_id = 0; sample_id < num_sample; sample_id++) { + int64_t h_sample = h_index[sample_id]; + int64_t r_sample = r_index[sample_id]; + int64_t t_sample = t_index[sample_id]; + const scalar_t *h = entity + h_sample * embedding_dim; + const scalar_t *r = relation + r_sample * embedding_dim; + const scalar_t *t = entity + t_sample * embedding_dim; + scalar_t *h_grad = entity_grad + h_sample * embedding_dim; + scalar_t *r_grad = relation_grad + r_sample * embedding_dim; + scalar_t *t_grad = entity_grad + t_sample * embedding_dim; + scalar_t grad = score_grad[sample_id]; + + for (int64_t i = start; i < end; i++) { + scalar_t h_re = h[i], h_im = h[i + embedding_dim / 2]; + scalar_t r_re = r[i], r_im = r[i + embedding_dim / 2]; + scalar_t t_re = t[i], t_im = t[i + embedding_dim / 2]; + h_grad[i] = grad * (r_re * t_re + r_im * t_im); + h_grad[i + embedding_dim / 2] = grad * (-r_im * t_re + r_re * t_im); + r_grad[i] = grad * (h_re * t_re + h_im * t_im); + r_grad[i + embedding_dim / 2] = grad * (-h_im * t_re + h_re * t_im); + t_grad[i] = grad * (h_re * r_re - h_im * r_im); + t_grad[i + embedding_dim / 2] = grad * (h_re * r_im + h_im * r_re); + } + } + }); +} + +template +void rotate_forward_out_cpu(const scalar_t *entity, const scalar_t *relation, const int64_t *h_index, + const int64_t *t_index, const int64_t *r_index, scalar_t *score, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + parallel_for(0, num_sample, 0, [&](int64_t start, int64_t end) { + for (int64_t sample_id = start; sample_id < end; sample_id++) { + const scalar_t *h = entity + h_index[sample_id] * embedding_dim; + const scalar_t *r = relation + r_index[sample_id] * embedding_dim / 2; + const scalar_t *t = entity + t_index[sample_id] * embedding_dim; + scalar_t x = 0; + for (int64_t i = 0; i < embedding_dim / 2; i++) { + scalar_t h_re = h[i], h_im = h[i + embedding_dim / 2]; + scalar_t r_re = ::cos(r[i]), r_im = ::sin(r[i]); + scalar_t t_re = t[i], t_im = t[i + embedding_dim / 2]; + scalar_t distance_re = h_re * r_re - h_im * r_im - t_re; + scalar_t distance_im = h_re * r_im + h_im * r_re - t_im; + x += ::sqrt(distance_re * distance_re + distance_im * distance_im); + } + + score[sample_id] = x; + } + }); +} + +template +void rotate_backward_out_cpu(const scalar_t *entity, const scalar_t *relation, + const int64_t *h_index, const int64_t *t_index, const int64_t *r_index, + const scalar_t *score_grad, scalar_t *entity_grad, scalar_t *relation_grad, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + const float kEpsilon = 1e-15; // 1e-15 from GraphVite + // since #CPU thread < embedding_dim / 2 + // we can parallel over embedding_dim to avoid atomic operations + parallel_for(0, embedding_dim / 2, 0, [&](int64_t start, int64_t end) { + for (int64_t sample_id = 0; sample_id < num_sample; sample_id++) { + int64_t h_sample = h_index[sample_id]; + int64_t r_sample = r_index[sample_id]; + int64_t t_sample = t_index[sample_id]; + const scalar_t *h = entity + h_sample * embedding_dim; + const scalar_t *r = relation + r_sample * embedding_dim / 2; + const scalar_t *t = entity + t_sample * embedding_dim; + scalar_t *h_grad = entity_grad + h_sample * embedding_dim; + scalar_t *r_grad = relation_grad + r_sample * embedding_dim / 2; + scalar_t *t_grad = entity_grad + t_sample * embedding_dim; + scalar_t grad = score_grad[sample_id]; + + for (int64_t i = start; i < end; i++) { + scalar_t h_re = h[i], h_im = h[i + embedding_dim / 2]; + scalar_t r_re = ::cos(r[i]), r_im = ::sin(r[i]); + scalar_t t_re = t[i], t_im = t[i + embedding_dim / 2]; + scalar_t distance_re = h_re * r_re - h_im * r_im - t_re; + scalar_t distance_im = h_re * r_im + h_im * r_re - t_im; + scalar_t g = grad / (::sqrt(distance_re * distance_re + distance_im * distance_im) + kEpsilon); + h_grad[i] += g * (distance_re * r_re + distance_im * r_im); + h_grad[i + embedding_dim / 2] += g * (-distance_re * r_im + distance_im * r_re); + r_grad[i] += g * (-distance_re * (h_re * r_im + h_im * r_re) + + distance_im * (h_re * r_re - h_im * r_im)); + t_grad[i] += -g * distance_re; + t_grad[i + embedding_dim / 2] += -g * distance_im; + } + } + }); +} + +template +void simple_forward_out_cpu(const scalar_t *entity, const scalar_t *relation, const int64_t *h_index, + const int64_t *t_index, const int64_t *r_index, scalar_t *score, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + parallel_for(0, num_sample, 0, [&](int64_t start, int64_t end) { + for (int64_t sample_id = start; sample_id < end; sample_id++) { + const scalar_t *h = entity + h_index[sample_id] * embedding_dim; + const scalar_t *r = relation + r_index[sample_id] * embedding_dim; + const scalar_t *t = entity + t_index[sample_id] * embedding_dim; + scalar_t x = 0; + for (int64_t i = 0; i < embedding_dim; i++) { + int64_t j = (i + embedding_dim / 2) % embedding_dim; + x += h[i] * r[i] * t[j]; + } + score[sample_id] = x; + } + }); +} + +template +void simple_backward_out_cpu(const scalar_t *entity, const scalar_t *relation, + const int64_t *h_index, const int64_t *t_index, const int64_t *r_index, + const scalar_t *score_grad, scalar_t *entity_grad, scalar_t *relation_grad, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + // since #CPU thread < embedding_dim + // we can parallel over embedding_dim to avoid atomic operations + parallel_for(0, embedding_dim, 0, [&](int64_t start, int64_t end) { + for (int64_t sample_id = 0; sample_id < num_sample; sample_id++) { + int64_t h_sample = h_index[sample_id]; + int64_t r_sample = r_index[sample_id]; + int64_t t_sample = t_index[sample_id]; + const scalar_t *h = entity + h_sample * embedding_dim; + const scalar_t *r = relation + r_sample * embedding_dim; + const scalar_t *t = entity + t_sample * embedding_dim; + scalar_t *h_grad = entity_grad + h_sample * embedding_dim; + scalar_t *r_grad = relation_grad + r_sample * embedding_dim; + scalar_t *t_grad = entity_grad + t_sample * embedding_dim; + scalar_t grad = score_grad[sample_id]; + + for (int64_t i = start; i < end; i++) { + int64_t j = (i + embedding_dim / 2) % embedding_dim; + scalar_t h_i = h[i], r_i = r[i], t_j = t[j]; + h_grad[i] += grad * r_i * t_j; + r_grad[i] += grad * h_i * t_j; + t_grad[j] += grad * h_i * r_i; + } + } + }); +} + +// If written in templates, the partial instantiation of template template parameters can't be resolved +// Therefore we opt for a macro implementation +#define DECLARE_FORWARD_IMPL(NAME) \ + Tensor NAME##_forward_cpu(const Tensor &entity_, const Tensor &relation_, \ + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_) { \ + constexpr const char *fn_name = #NAME"_forward_cpu"; \ + TensorArg entity_arg(entity_, "entity", 1), relation_arg(relation_, "relation", 2), \ + h_index_arg(h_index_, "h_index", 3), r_index_arg(r_index_, "r_index", 4), \ + t_index_arg(t_index_, "t_index", 5); \ + \ + embedding_forward_check(fn_name, entity_arg, relation_arg, h_index_arg, r_index_arg, t_index_arg); \ + checkDeviceType(fn_name, {entity_, relation_, h_index_, r_index_, t_index_}, kCPU); \ + \ + const Tensor entity = entity_.contiguous(); \ + const Tensor relation = relation_.contiguous(); \ + const Tensor h_index = h_index_.contiguous(); \ + const Tensor r_index = r_index_.contiguous(); \ + const Tensor t_index = t_index_.contiguous(); \ + \ + int64_t num_entity = entity.size(0); \ + int64_t num_relation = relation.size(0); \ + int64_t embedding_dim = entity.size(-1); \ + int64_t num_sample = h_index.numel(); \ + \ + Tensor score = at::empty(h_index.sizes(), entity.options()); \ + \ + AT_DISPATCH_FLOATING_TYPES(entity.scalar_type(), #NAME"_forward_cpu", [&] { \ + NAME##_forward_out_cpu( \ + entity.data_ptr(), relation.data_ptr(), \ + h_index.data_ptr(), t_index.data_ptr(), r_index.data_ptr(), \ + score.data_ptr(), \ + num_entity, num_relation, embedding_dim, num_sample \ + ); \ + }); \ + \ + return score; \ + } + +#define DECLARE_BACKWARD_IMPL(NAME) \ + std::tuple NAME##_backward_cpu( \ + const Tensor &entity_, const Tensor &relation_, const Tensor &h_index_, \ + const Tensor &t_index_, const Tensor &r_index_, const Tensor &score_grad_) { \ + constexpr const char *fn_name = #NAME"_backward_cpu"; \ + TensorArg entity_arg(entity_, "entity", 1), relation_arg(relation_, "relation", 2), \ + h_index_arg(h_index_, "h_index", 3), r_index_arg(r_index_, "r_index", 4), \ + t_index_arg(t_index_, "t_index", 5), score_grad_arg(score_grad_, "score_grad", 6); \ + \ + embedding_backward_check(fn_name, entity_arg, relation_arg, h_index_arg, r_index_arg, t_index_arg, \ + score_grad_arg); \ + checkDeviceType(fn_name, {entity_, relation_, h_index_, r_index_, t_index_, score_grad_}, kCPU); \ + \ + const Tensor entity = entity_.contiguous(); \ + const Tensor relation = relation_.contiguous(); \ + const Tensor h_index = h_index_.contiguous(); \ + const Tensor r_index = r_index_.contiguous(); \ + const Tensor t_index = t_index_.contiguous(); \ + const Tensor score_grad = score_grad_.contiguous(); \ + \ + int64_t num_entity = entity.size(0); \ + int64_t num_relation = relation.size(0); \ + int64_t embedding_dim = entity.size(1); \ + int64_t num_sample = h_index.numel(); \ + \ + Tensor entity_grad = at::zeros_like(entity); \ + Tensor relation_grad = at::zeros_like(relation); \ + \ + AT_DISPATCH_FLOATING_TYPES(entity.scalar_type(), #NAME"_backward_cpu", [&] { \ + NAME##_backward_out_cpu( \ + entity.data_ptr(), relation.data_ptr(), \ + h_index.data_ptr(), t_index.data_ptr(), r_index.data_ptr(), \ + score_grad.data_ptr(), \ + entity_grad.data_ptr(), relation_grad.data_ptr(), \ + num_entity, num_relation, embedding_dim, num_sample \ + ); \ + }); \ + \ + return std::make_tuple(entity_grad, relation_grad); \ + } + +DECLARE_FORWARD_IMPL(transe) +DECLARE_BACKWARD_IMPL(transe) + +DECLARE_FORWARD_IMPL(distmult) +DECLARE_BACKWARD_IMPL(distmult) + +DECLARE_FORWARD_IMPL(complex) +DECLARE_BACKWARD_IMPL(complex) + +DECLARE_FORWARD_IMPL(rotate) +DECLARE_BACKWARD_IMPL(rotate) + +DECLARE_FORWARD_IMPL(simple) +DECLARE_BACKWARD_IMPL(simple) + +} // namespace at + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("transe_forward_cpu", &at::transe_forward_cpu); + m.def("transe_backward_cpu", &at::transe_backward_cpu); + m.def("distmult_forward_cpu", &at::distmult_forward_cpu); + m.def("distmult_backward_cpu", &at::distmult_backward_cpu); + m.def("complex_forward_cpu", &at::complex_forward_cpu); + m.def("complex_backward_cpu", &at::complex_backward_cpu); + m.def("rotate_forward_cpu", &at::rotate_forward_cpu); + m.def("rotate_backward_cpu", &at::rotate_backward_cpu); + m.def("simple_forward_cpu", &at::simple_forward_cpu); + m.def("simple_backward_cpu", &at::simple_backward_cpu); +#ifdef CUDA_OP + m.def("transe_forward_cuda", &at::transe_forward_cuda); + m.def("transe_backward_cuda", &at::transe_backward_cuda); + m.def("distmult_forward_cuda", &at::distmult_forward_cuda); + m.def("distmult_backward_cuda", &at::distmult_backward_cuda); + m.def("complex_forward_cuda", &at::complex_forward_cuda); + m.def("complex_backward_cuda", &at::complex_backward_cuda); + m.def("rotate_forward_cuda", &at::rotate_forward_cuda); + m.def("rotate_backward_cuda", &at::rotate_backward_cuda); + m.def("simple_forward_cuda", &at::simple_forward_cuda); + m.def("simple_backward_cuda", &at::simple_backward_cuda); +#endif +} \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/extension/embedding.cu b/build/lib/torchdrug/layers/functional/extension/embedding.cu new file mode 100644 index 00000000..d48dc488 --- /dev/null +++ b/build/lib/torchdrug/layers/functional/extension/embedding.cu @@ -0,0 +1,412 @@ +#include +#include + +#include "util.cuh" +#include "embedding.h" + +// Memory & time efficient implementation of embedding score functions +// Much of the code is adapted from GraphVite +// https://github.com/DeepGraphLearning/graphvite + +namespace at { + +template +__global__ +void transe_forward_out_cuda(const scalar_t *entity, const scalar_t *relation, const int64_t *h_index, + const int64_t *t_index, const int64_t *r_index, scalar_t *score, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + const int thread_id = blockIdx.x * blockDim.x + threadIdx.x; + const int lane_id = thread_id % warpSize; + const int num_thread = gridDim.x * blockDim.x; + + for (int64_t sample_id = thread_id / warpSize; sample_id < num_sample; sample_id += num_thread / warpSize) { + const scalar_t *h = entity + h_index[sample_id] * embedding_dim; + const scalar_t *r = relation + r_index[sample_id] * embedding_dim; + const scalar_t *t = entity + t_index[sample_id] * embedding_dim; + scalar_t x = 0; + for (int64_t i = lane_id; i < embedding_dim; i += warpSize) + x += ::abs(h[i] + r[i] - t[i]); + x = warp_broadcast(warp_reduce(x), 0); + + if (lane_id == 0) + score[sample_id] = x; + } +} + +template +__global__ +void transe_backward_out_cuda(const scalar_t *entity, const scalar_t *relation, + const int64_t *h_index, const int64_t *t_index, const int64_t *r_index, + const scalar_t *score_grad, scalar_t *entity_grad, scalar_t *relation_grad, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + const int thread_id = blockIdx.x * blockDim.x + threadIdx.x; + const int lane_id = thread_id % warpSize; + const int num_thread = gridDim.x * blockDim.x; + + for (int64_t sample_id = thread_id / warpSize; sample_id < num_sample; sample_id += num_thread / warpSize) { + int64_t h_sample = h_index[sample_id]; + int64_t r_sample = r_index[sample_id]; + int64_t t_sample = t_index[sample_id]; + const scalar_t *h = entity + h_sample * embedding_dim; + const scalar_t *r = relation + r_sample * embedding_dim; + const scalar_t *t = entity + t_sample * embedding_dim; + scalar_t *h_grad = entity_grad + h_sample * embedding_dim; + scalar_t *r_grad = relation_grad + r_sample * embedding_dim; + scalar_t *t_grad = entity_grad + t_sample * embedding_dim; + scalar_t grad = score_grad[sample_id]; + + for (int64_t i = lane_id; i < embedding_dim; i += warpSize) { + scalar_t s = h[i] + r[i] - t[i] > 0 ? 1 : -1; + atomicAdd(&h_grad[i], grad * s); + atomicAdd(&r_grad[i], grad * s); + atomicAdd(&t_grad[i], -grad * s); + } + } +} + +template +__global__ +void distmult_forward_out_cuda(const scalar_t *entity, const scalar_t *relation, const int64_t *h_index, + const int64_t *t_index, const int64_t *r_index, scalar_t *score, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + const int thread_id = blockIdx.x * blockDim.x + threadIdx.x; + const int lane_id = thread_id % warpSize; + const int num_thread = gridDim.x * blockDim.x; + + for (int64_t sample_id = thread_id / warpSize; sample_id < num_sample; sample_id += num_thread / warpSize) { + const scalar_t *h = entity + h_index[sample_id] * embedding_dim; + const scalar_t *r = relation + r_index[sample_id] * embedding_dim; + const scalar_t *t = entity + t_index[sample_id] * embedding_dim; + scalar_t x = 0; + for (int64_t i = lane_id; i < embedding_dim; i += warpSize) + x += h[i] * r[i] * t[i]; + x = warp_broadcast(warp_reduce(x), 0); + + if (lane_id == 0) + score[sample_id] = x; + } +} + +template +__global__ +void distmult_backward_out_cuda(const scalar_t *entity, const scalar_t *relation, + const int64_t *h_index, const int64_t *t_index, const int64_t *r_index, + const scalar_t *score_grad, scalar_t *entity_grad, scalar_t *relation_grad, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + const int thread_id = blockIdx.x * blockDim.x + threadIdx.x; + const int lane_id = thread_id % warpSize; + const int num_thread = gridDim.x * blockDim.x; + + for (int64_t sample_id = thread_id / warpSize; sample_id < num_sample; sample_id += num_thread / warpSize) { + int64_t h_sample = h_index[sample_id]; + int64_t r_sample = r_index[sample_id]; + int64_t t_sample = t_index[sample_id]; + const scalar_t *h = entity + h_sample * embedding_dim; + const scalar_t *r = relation + r_sample * embedding_dim; + const scalar_t *t = entity + t_sample * embedding_dim; + scalar_t *h_grad = entity_grad + h_sample * embedding_dim; + scalar_t *r_grad = relation_grad + r_sample * embedding_dim; + scalar_t *t_grad = entity_grad + t_sample * embedding_dim; + scalar_t grad = score_grad[sample_id]; + + for (int64_t i = lane_id; i < embedding_dim; i += warpSize) { + scalar_t h_i = h[i], r_i = r[i], t_i = t[i]; + atomicAdd(&h_grad[i], grad * r_i * t_i); + atomicAdd(&r_grad[i], grad * h_i * t_i); + atomicAdd(&t_grad[i], grad * h_i * r_i); + } + } +} + +template +__global__ +void complex_forward_out_cuda(const scalar_t *entity, const scalar_t *relation, const int64_t *h_index, + const int64_t *t_index, const int64_t *r_index, scalar_t *score, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + const int thread_id = blockIdx.x * blockDim.x + threadIdx.x; + const int lane_id = thread_id % warpSize; + const int num_thread = gridDim.x * blockDim.x; + + for (int64_t sample_id = thread_id / warpSize; sample_id < num_sample; sample_id += num_thread / warpSize) { + const scalar_t *h = entity + h_index[sample_id] * embedding_dim; + const scalar_t *r = relation + r_index[sample_id] * embedding_dim; + const scalar_t *t = entity + t_index[sample_id] * embedding_dim; + scalar_t x = 0; + for (int64_t i = lane_id; i < embedding_dim / 2; i += warpSize) { + scalar_t h_re = h[i], h_im = h[i + embedding_dim / 2]; + scalar_t r_re = r[i], r_im = r[i + embedding_dim / 2]; + scalar_t t_re = t[i], t_im = t[i + embedding_dim / 2]; + scalar_t product_re = h_re * r_re - h_im * r_im; + scalar_t product_im = h_re * r_im + h_im * r_re; + x += product_re * t_re + product_im * t_im; + } + x = warp_broadcast(warp_reduce(x), 0); + + if (lane_id == 0) + score[sample_id] = x; + } +} + +template +__global__ +void complex_backward_out_cuda(const scalar_t *entity, const scalar_t *relation, + const int64_t *h_index, const int64_t *t_index, const int64_t *r_index, + const scalar_t *score_grad, scalar_t *entity_grad, scalar_t *relation_grad, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + const int thread_id = blockIdx.x * blockDim.x + threadIdx.x; + const int lane_id = thread_id % warpSize; + const int num_thread = gridDim.x * blockDim.x; + + for (int64_t sample_id = thread_id / warpSize; sample_id < num_sample; sample_id += num_thread / warpSize) { + int64_t h_sample = h_index[sample_id]; + int64_t r_sample = r_index[sample_id]; + int64_t t_sample = t_index[sample_id]; + const scalar_t *h = entity + h_sample * embedding_dim; + const scalar_t *r = relation + r_sample * embedding_dim; + const scalar_t *t = entity + t_sample * embedding_dim; + scalar_t *h_grad = entity_grad + h_sample * embedding_dim; + scalar_t *r_grad = relation_grad + r_sample * embedding_dim; + scalar_t *t_grad = entity_grad + t_sample * embedding_dim; + scalar_t grad = score_grad[sample_id]; + + for (int64_t i = lane_id; i < embedding_dim / 2; i += warpSize) { + scalar_t h_re = h[i], h_im = h[i + embedding_dim / 2]; + scalar_t r_re = r[i], r_im = r[i + embedding_dim / 2]; + scalar_t t_re = t[i], t_im = t[i + embedding_dim / 2]; + atomicAdd(&h_grad[i], grad * (r_re * t_re + r_im * t_im)); + atomicAdd(&h_grad[i + embedding_dim / 2], grad * (-r_im * t_re + r_re * t_im)); + atomicAdd(&r_grad[i], grad * (h_re * t_re + h_im * t_im)); + atomicAdd(&r_grad[i + embedding_dim / 2], grad * (-h_im * t_re + h_re * t_im)); + atomicAdd(&t_grad[i], grad * (h_re * r_re - h_im * r_im)); + atomicAdd(&t_grad[i + embedding_dim / 2], grad * (h_re * r_im + h_im * r_re)); + } + } +} + +template +__global__ +void rotate_forward_out_cuda(const scalar_t *entity, const scalar_t *relation, const int64_t *h_index, + const int64_t *t_index, const int64_t *r_index, scalar_t *score, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + const int thread_id = blockIdx.x * blockDim.x + threadIdx.x; + const int lane_id = thread_id % warpSize; + const int num_thread = gridDim.x * blockDim.x; + + for (int64_t sample_id = thread_id / warpSize; sample_id < num_sample; sample_id += num_thread / warpSize) { + const scalar_t *h = entity + h_index[sample_id] * embedding_dim; + const scalar_t *r = relation + r_index[sample_id] * embedding_dim / 2; + const scalar_t *t = entity + t_index[sample_id] * embedding_dim; + scalar_t x = 0; + for (int64_t i = lane_id; i < embedding_dim / 2; i += warpSize) { + scalar_t h_re = h[i], h_im = h[i + embedding_dim / 2]; + scalar_t r_re = ::cos(r[i]), r_im = ::sin(r[i]); + scalar_t t_re = t[i], t_im = t[i + embedding_dim / 2]; + scalar_t distance_re = h_re * r_re - h_im * r_im - t_re; + scalar_t distance_im = h_re * r_im + h_im * r_re - t_im; + x += ::sqrt(distance_re * distance_re + distance_im * distance_im); + } + x = warp_broadcast(warp_reduce(x), 0); + + if (lane_id == 0) + score[sample_id] = x; + } +} + +template +__global__ +void rotate_backward_out_cuda(const scalar_t *entity, const scalar_t *relation, + const int64_t *h_index, const int64_t *t_index, const int64_t *r_index, + const scalar_t *score_grad, scalar_t *entity_grad, scalar_t *relation_grad, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + const float kEpsilon = 1e-15; // 1e-15 from GraphVite + const int thread_id = blockIdx.x * blockDim.x + threadIdx.x; + const int lane_id = thread_id % warpSize; + const int num_thread = gridDim.x * blockDim.x; + + for (int64_t sample_id = thread_id / warpSize; sample_id < num_sample; sample_id += num_thread / warpSize) { + int64_t h_sample = h_index[sample_id]; + int64_t r_sample = r_index[sample_id]; + int64_t t_sample = t_index[sample_id]; + const scalar_t *h = entity + h_sample * embedding_dim; + const scalar_t *r = relation + r_sample * embedding_dim / 2; + const scalar_t *t = entity + t_sample * embedding_dim; + scalar_t *h_grad = entity_grad + h_sample * embedding_dim; + scalar_t *r_grad = relation_grad + r_sample * embedding_dim / 2; + scalar_t *t_grad = entity_grad + t_sample * embedding_dim; + scalar_t grad = score_grad[sample_id]; + + for (int64_t i = lane_id; i < embedding_dim / 2; i += warpSize) { + scalar_t h_re = h[i], h_im = h[i + embedding_dim / 2]; + scalar_t r_re = ::cos(r[i]), r_im = ::sin(r[i]); + scalar_t t_re = t[i], t_im = t[i + embedding_dim / 2]; + scalar_t distance_re = h_re * r_re - h_im * r_im - t_re; + scalar_t distance_im = h_re * r_im + h_im * r_re - t_im; + scalar_t g = grad / (::sqrt(distance_re * distance_re + distance_im * distance_im) + kEpsilon); + atomicAdd(&h_grad[i], g * (distance_re * r_re + distance_im * r_im)); + atomicAdd(&h_grad[i + embedding_dim / 2], g * (-distance_re * r_im + distance_im * r_re)); + atomicAdd(&r_grad[i], g * (-distance_re * (h_re * r_im + h_im * r_re) + + distance_im * (h_re * r_re - h_im * r_im))); + atomicAdd(&t_grad[i], -g * distance_re); + atomicAdd(&t_grad[i + embedding_dim / 2], -g * distance_im); + } + } +} + +template +__global__ +void simple_forward_out_cuda(const scalar_t *entity, const scalar_t *relation, const int64_t *h_index, + const int64_t *t_index, const int64_t *r_index, scalar_t *score, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + const int thread_id = blockIdx.x * blockDim.x + threadIdx.x; + const int lane_id = thread_id % warpSize; + const int num_thread = gridDim.x * blockDim.x; + + for (int64_t sample_id = thread_id / warpSize; sample_id < num_sample; sample_id += num_thread / warpSize) { + const scalar_t *h = entity + h_index[sample_id] * embedding_dim; + const scalar_t *r = relation + r_index[sample_id] * embedding_dim; + const scalar_t *t = entity + t_index[sample_id] * embedding_dim; + scalar_t x = 0; + for (int64_t i = lane_id; i < embedding_dim; i += warpSize) { + int64_t j = (i + embedding_dim / 2) % embedding_dim; + x += h[i] * r[i] * t[j]; + } + x = warp_broadcast(warp_reduce(x), 0); + + if (lane_id == 0) + score[sample_id] = x; + } +} + +template +__global__ +void simple_backward_out_cuda(const scalar_t *entity, const scalar_t *relation, + const int64_t *h_index, const int64_t *t_index, const int64_t *r_index, + const scalar_t *score_grad, scalar_t *entity_grad, scalar_t *relation_grad, + int64_t num_entity, int64_t num_relation, int64_t embedding_dim, int64_t num_sample) { + const int thread_id = blockIdx.x * blockDim.x + threadIdx.x; + const int lane_id = thread_id % warpSize; + const int num_thread = gridDim.x * blockDim.x; + + for (int64_t sample_id = thread_id / warpSize; sample_id < num_sample; sample_id += num_thread / warpSize) { + int64_t h_sample = h_index[sample_id]; + int64_t r_sample = r_index[sample_id]; + int64_t t_sample = t_index[sample_id]; + const scalar_t *h = entity + h_sample * embedding_dim; + const scalar_t *r = relation + r_sample * embedding_dim; + const scalar_t *t = entity + t_sample * embedding_dim; + scalar_t *h_grad = entity_grad + h_sample * embedding_dim; + scalar_t *r_grad = relation_grad + r_sample * embedding_dim; + scalar_t *t_grad = entity_grad + t_sample * embedding_dim; + scalar_t grad = score_grad[sample_id]; + + for (int64_t i = lane_id; i < embedding_dim; i += warpSize) { + int64_t j = (i + embedding_dim / 2) % embedding_dim; + scalar_t h_i = h[i], r_i = r[i], t_j = t[j]; + atomicAdd(&h_grad[i], grad * r_i * t_j); + atomicAdd(&r_grad[i], grad * h_i * t_j); + atomicAdd(&t_grad[j], grad * h_i * r_i); + } + } +} + +// If written in templates, the partial instantiation of template template parameters can't be resolved +// Therefore we opt for a macro implementation +#define DECLARE_FORWARD_IMPL(NAME) \ + Tensor NAME##_forward_cuda(const Tensor &entity_, const Tensor &relation_, const Tensor &h_index_, \ + const Tensor &t_index_, const Tensor &r_index_) { \ + constexpr const char *fn_name = #NAME"_forward_cuda"; \ + TensorArg entity_arg(entity_, "entity", 1), relation_arg(relation_, "relation", 2), \ + h_index_arg(h_index_, "h_index", 3), r_index_arg(r_index_, "r_index", 4), \ + t_index_arg(t_index_, "t_index", 5); \ + \ + embedding_forward_check(fn_name, entity_arg, relation_arg, h_index_arg, r_index_arg, t_index_arg); \ + checkAllSameGPU(fn_name, {entity_arg, relation_arg, h_index_arg, r_index_arg, t_index_arg}); \ + \ + const Tensor entity = entity_.contiguous(); \ + const Tensor relation = relation_.contiguous(); \ + const Tensor h_index = h_index_.contiguous(); \ + const Tensor r_index = r_index_.contiguous(); \ + const Tensor t_index = t_index_.contiguous(); \ + \ + int64_t num_entity = entity.size(0); \ + int64_t num_relation = relation.size(0); \ + int64_t embedding_dim = entity.size(-1); \ + int64_t num_sample = h_index.numel(); \ + \ + Tensor score = at::empty(h_index.sizes(), entity.options()); \ + \ + cudaSetDevice(entity.get_device()); \ + auto stream = at::cuda::getCurrentCUDAStream(); \ + \ + AT_DISPATCH_FLOATING_TYPES(entity.scalar_type(), fn_name, [&] { \ + NAME##_forward_out_cuda<<<4096, 512, 0, stream>>>( \ + entity.data_ptr(), relation.data_ptr(), \ + h_index.data_ptr(), t_index.data_ptr(), r_index.data_ptr(), \ + score.data_ptr(), \ + num_entity, num_relation, embedding_dim, num_sample \ + ); \ + }); \ + \ + return score; \ + } \ + +#define DECLARE_BACKWARD_IMPL(NAME) \ + std::tuple NAME##_backward_cuda( \ + const Tensor &entity_, const Tensor &relation_, const Tensor &h_index_, \ + const Tensor &t_index_, const Tensor &r_index_, const Tensor &score_grad_) { \ + constexpr const char *fn_name = #NAME"_backward_cuda"; \ + TensorArg entity_arg(entity_, "entity", 1), relation_arg(relation_, "relation", 2), \ + h_index_arg(h_index_, "h_index", 3), r_index_arg(r_index_, "r_index", 4), \ + t_index_arg(t_index_, "t_index", 5), score_grad_arg(score_grad_, "score_grad", 6); \ + \ + embedding_backward_check(fn_name, entity_arg, relation_arg, h_index_arg, r_index_arg, t_index_arg, \ + score_grad_arg); \ + checkAllSameGPU(fn_name, {entity_arg, relation_arg, h_index_arg, r_index_arg, t_index_arg, score_grad_arg}); \ + \ + const Tensor entity = entity_.contiguous(); \ + const Tensor relation = relation_.contiguous(); \ + const Tensor h_index = h_index_.contiguous(); \ + const Tensor r_index = r_index_.contiguous(); \ + const Tensor t_index = t_index_.contiguous(); \ + const Tensor score_grad = score_grad_.contiguous(); \ + \ + int64_t num_entity = entity.size(0); \ + int64_t num_relation = relation.size(0); \ + int64_t embedding_dim = entity.size(-1); \ + int64_t num_sample = h_index.numel(); \ + \ + Tensor entity_grad = at::zeros_like(entity); \ + Tensor relation_grad = at::zeros_like(relation); \ + \ + cudaSetDevice(entity.get_device()); \ + auto stream = at::cuda::getCurrentCUDAStream(); \ + \ + AT_DISPATCH_FLOATING_TYPES(entity.scalar_type(), fn_name, [&] { \ + NAME##_backward_out_cuda<<<4096, 512, 0, stream>>>( \ + entity.data_ptr(), relation.data_ptr(), \ + h_index.data_ptr(), t_index.data_ptr(), r_index.data_ptr(), \ + score_grad.data_ptr(), \ + entity_grad.data_ptr(), relation_grad.data_ptr(), \ + num_entity, num_relation, embedding_dim, num_sample \ + ); \ + }); \ + \ + return std::make_tuple(entity_grad, relation_grad); \ + } + +DECLARE_FORWARD_IMPL(transe) +DECLARE_BACKWARD_IMPL(transe) + +DECLARE_FORWARD_IMPL(distmult) +DECLARE_BACKWARD_IMPL(distmult) + +DECLARE_FORWARD_IMPL(complex) +DECLARE_BACKWARD_IMPL(complex) + +DECLARE_FORWARD_IMPL(rotate) +DECLARE_BACKWARD_IMPL(rotate) + +DECLARE_FORWARD_IMPL(simple) +DECLARE_BACKWARD_IMPL(simple) + +} // namespace at \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/extension/embedding.h b/build/lib/torchdrug/layers/functional/extension/embedding.h new file mode 100644 index 00000000..bb48d53f --- /dev/null +++ b/build/lib/torchdrug/layers/functional/extension/embedding.h @@ -0,0 +1,88 @@ +#pragma once + +#include + +#include + +namespace at { + +void embedding_forward_check(CheckedFrom c, const TensorArg &entity_arg, const TensorArg &relation_arg, + const TensorArg &h_index_arg, const TensorArg &t_index_arg, const TensorArg &r_index_arg); + +void embedding_backward_check(CheckedFrom c, const TensorArg &entity_arg, const TensorArg &relation_arg, + const TensorArg &h_index_arg, const TensorArg &t_index_arg, const TensorArg &r_index_arg, + const TensorArg &score_grad_arg); + +Tensor transe_forward_cpu(const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_); + +std::tuple transe_backward_cpu( + const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_, const Tensor &score_grad_); + +Tensor distmult_forward_cpu(const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_); + +std::tuple distmult_backward_cpu( + const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_, const Tensor &score_grad_); + +Tensor complex_forward_cpu(const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_); + +std::tuple complex_backward_cpu( + const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_, const Tensor &score_grad_); + +Tensor rotate_forward_cpu(const Tensor &entity_, const Tensor &relation_, const Tensor &h_index_, + const Tensor &t_index_, const Tensor &r_index_); + +std::tuple rotate_backward_cpu( + const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_, const Tensor &score_grad_); + +Tensor simple_forward_cpu(const Tensor &entity_, const Tensor &relation_, const Tensor &h_index_, + const Tensor &t_index_, const Tensor &r_index_); + +std::tuple simple_backward_cpu( + const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_, const Tensor &score_grad_); + +#ifdef CUDA_OP +Tensor transe_forward_cuda(const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_); + +std::tuple transe_backward_cuda( + const Tensor &entity, const Tensor &relation_, + const Tensor &h_index, const Tensor &t_index_, const Tensor &r_index_, const Tensor &score_grad_); + +Tensor distmult_forward_cuda(const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_); + +std::tuple distmult_backward_cuda( + const Tensor &entity, const Tensor &relation_, + const Tensor &h_index, const Tensor &t_index_, const Tensor &r_index_, const Tensor &score_grad_); + +Tensor complex_forward_cuda(const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_); + +std::tuple complex_backward_cuda( + const Tensor &entity, const Tensor &relation_, + const Tensor &h_index, const Tensor &t_index_, const Tensor &r_index_, const Tensor &score_grad_); + +Tensor rotate_forward_cuda(const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_); + +std::tuple rotate_backward_cuda( + const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_, const Tensor &score_grad_); + +Tensor simple_forward_cuda(const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_); + +std::tuple simple_backward_cuda( + const Tensor &entity_, const Tensor &relation_, + const Tensor &h_index_, const Tensor &t_index_, const Tensor &r_index_, const Tensor &score_grad_); +#endif + +} // namespace at \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/extension/operator.cuh b/build/lib/torchdrug/layers/functional/extension/operator.cuh new file mode 100644 index 00000000..ad217734 --- /dev/null +++ b/build/lib/torchdrug/layers/functional/extension/operator.cuh @@ -0,0 +1,82 @@ +#pragma once + +#include + +#ifdef __CUDA_ARCH__ + #define HOST_DEVICE __host__ __device__ +#else + #define HOST_DEVICE +#endif + +namespace at { + +template +struct BinaryAdd { + HOST_DEVICE static scalar_t forward(scalar_t x, scalar_t y) { + return x + y; + } + + HOST_DEVICE static scalar_t backward_lhs(scalar_t x, scalar_t y) { + return 1; + } + + HOST_DEVICE static scalar_t backward_rhs(scalar_t x, scalar_t y) { + return 1; + } +}; + +template +struct BinaryMul { + HOST_DEVICE static scalar_t forward(scalar_t x, scalar_t y) { + return x * y; + } + + HOST_DEVICE static scalar_t backward_lhs(scalar_t x, scalar_t y) { + return y; + } + + HOST_DEVICE static scalar_t backward_rhs(scalar_t x, scalar_t y) { + return x; + } +}; + +template +struct NaryAdd { + HOST_DEVICE static scalar_t forward(scalar_t result, scalar_t x) { + return result + x; + } + + HOST_DEVICE static scalar_t backward(scalar_t result, scalar_t x) { + return 1; + } + + static constexpr scalar_t zero = 0; +}; + +template +struct NaryMin { + HOST_DEVICE static scalar_t forward(scalar_t result, scalar_t x) { + return result < x ? result : x; + } + + HOST_DEVICE static scalar_t backward(scalar_t result, scalar_t x) { + return result == x ? 1 : 0; + } + + static constexpr scalar_t zero = std::numeric_limits::max(); +}; + +template +struct NaryMax { + HOST_DEVICE static scalar_t forward(scalar_t result, scalar_t x) { + return result > x ? result : x; + } + + HOST_DEVICE static scalar_t backward(scalar_t result, scalar_t x) { + return result == x ? 1 : 0; + } + + static constexpr scalar_t zero = std::numeric_limits::lowest(); +}; + +} // namespace at \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/extension/rspmm.cpp b/build/lib/torchdrug/layers/functional/extension/rspmm.cpp new file mode 100644 index 00000000..a2c3f54a --- /dev/null +++ b/build/lib/torchdrug/layers/functional/extension/rspmm.cpp @@ -0,0 +1,263 @@ +#include + +#include + +#include "operator.cuh" +#include "rspmm.h" + +namespace at { + +// In PyTorch 1.4.0, parallel_for depends on some functions from at::internal in ATen/Parallel.h +// which are not explicitly included +// This is fixed in some new PyTorch release +using namespace at::internal; + +void rspmm_forward_check(CheckedFrom c, const TensorArg &sparse_arg, const TensorArg &relation_arg, + const TensorArg &input_arg) { + TORCH_CHECK(sparse_arg->sparse_dim() == 3, + "Expected 3-dimensional sparse tensor, but got ", sparse_arg->sparse_dim(), + "-dimensional tensor for ", sparse_arg," (while checking arguments for ", c, ")"); + TORCH_CHECK(sparse_arg->dense_dim() == 0, + "Expected 3-dimensional sparse tensor, but got ", sparse_arg->dense_dim(), + " dense dimensions for", sparse_arg," (while checking arguments for ", c, ")"); + checkDim(c, relation_arg, 2); + checkDim(c, input_arg, 2); + checkScalarType(c, input_arg, sparse_arg->scalar_type()); + checkSameType(c, relation_arg, input_arg); + checkSize(c, input_arg, 0, sparse_arg->size(1)); + checkSize(c, relation_arg, {sparse_arg->size(2), input_arg->size(1)}); +} + +void rspmm_backward_check(CheckedFrom c, const TensorArg &sparse_arg, const TensorArg &relation_arg, + const TensorArg &input_arg, const TensorArg &output_arg, const TensorArg &output_grad_arg) { + rspmm_forward_check(c, sparse_arg, relation_arg, input_arg); + checkDim(c, output_arg, 2); + checkSameSize(c, output_arg, output_grad_arg); + checkSameType(c, input_arg, output_arg); + checkSameType(c, input_arg, output_grad_arg); + checkSize(c, output_arg, {sparse_arg->size(0), input_arg->size(1)}); +} + +std::tuple coo2csr3d(const SparseTensor &sparse) { + TORCH_CHECK(sparse.is_coalesced(), "Expect coalesced sparse tensor"); + Tensor index = sparse.indices(); + Tensor row_ind = index.select(0, 0); + Tensor col_ind = index.select(0, 1); + Tensor layer_ind = index.select(0, 2); + Tensor value = sparse.values(); + // scatter_add is super slow for int64, due to non-hardware atomic operations + // use int32 instead + Tensor nnz_per_row = at::zeros({sparse.size(0)}, row_ind.options().dtype(at::ScalarType::Int)); + nnz_per_row.scatter_add_(0, row_ind, at::ones(row_ind.sizes(), nnz_per_row.options())); + nnz_per_row = nnz_per_row.toType(at::ScalarType::Long); + Tensor row_ptr = nnz_per_row.cumsum(0) - nnz_per_row; + return std::make_tuple(row_ptr, col_ind, layer_ind, value); +} + +SparseTensor csr2coo3d(const Tensor &row_ptr_, const Tensor &col_ind, const Tensor &layer_ind, const Tensor &value, + IntArrayRef size) { + Tensor row_ptr = row_ptr_.masked_select(row_ptr_ < col_ind.size(0)); + // scatter_add is super slow for int64, due to non-hardware atomic operations + // use int32 instead + Tensor row_ind = at::zeros(col_ind.sizes(), col_ind.options().dtype(at::ScalarType::Int)); + row_ind.scatter_add_(0, row_ptr, at::ones(row_ptr.sizes(), row_ind.options())); + row_ind = row_ind.toType(at::ScalarType::Long); + row_ind = row_ind.cumsum(0) - 1; + Tensor index = at::stack({row_ind, col_ind, layer_ind}, 0); + return at::_sparse_coo_tensor_unsafe(index, value, size, value.options().layout(kSparse)); +} + +template +void rspmm_forward_out_cpu(const int64_t *row_ptr, const int64_t *col_ind, const int64_t *layer_ind, + const scalar_t *value, const scalar_t *relation, const scalar_t *input, + scalar_t *output, + int64_t num_row, int64_t nnz, int64_t dim) { + parallel_for(0, num_row, 0, [&](int64_t row_start, int64_t row_end) { + for (int64_t row = row_start; row < row_end; row++) { + for (int64_t d = 0; d < dim; d++) + output[row * dim + d] = NaryOp::zero; + + int64_t ptr_start = row_ptr[row]; + int64_t ptr_end = row + 1 < num_row ? row_ptr[row + 1] : nnz; + for (int64_t ptr = ptr_start; ptr < ptr_end; ptr++) { + int64_t col = col_ind[ptr]; + int64_t layer = layer_ind[ptr]; + scalar_t val = value[ptr]; + for (int64_t d = 0; d < dim; d++) { + scalar_t x = BinaryOp::forward(relation[layer * dim + d], input[col * dim + d]); + scalar_t y = val * x; + scalar_t &out = output[row * dim + d]; + out = NaryOp::forward(out, y); + } + } + } + }); +} + +template +void rspmm_backward_out_cpu(const int64_t *row_ptr, const int64_t *col_ind, const int64_t *layer_ind, + const scalar_t *value, const scalar_t *relation, const scalar_t *input, + const scalar_t *output, const scalar_t *output_grad, + scalar_t *value_grad, scalar_t *relation_grad, scalar_t *input_grad, + int64_t num_row, int64_t nnz, int64_t dim, + std::vector &relation_mutex, std::vector &input_mutex) { + parallel_for(0, num_row, 0, [&](int64_t row_start, int64_t row_end) { + for (int64_t row = row_start; row < row_end; row++) { + int64_t ptr_start = row_ptr[row]; + int64_t ptr_end = row + 1 < num_row ? row_ptr[row + 1] : nnz; + for (int64_t ptr = ptr_start; ptr < ptr_end; ptr++) { + int64_t col = col_ind[ptr]; + int64_t layer = layer_ind[ptr]; + scalar_t val = value[ptr]; + scalar_t val_grad = 0; + for (int64_t d = 0; d < dim; d++) { + scalar_t rel = relation[layer * dim + d]; + scalar_t in = input[col * dim + d]; + scalar_t out = output[row * dim + d]; + scalar_t out_grad = output_grad[row * dim + d]; + scalar_t x = BinaryOp::forward(rel, in); + scalar_t y = val * x; + scalar_t dx_drel = BinaryOp::backward_lhs(rel, in); + scalar_t dx_din = BinaryOp::backward_rhs(rel, in); + scalar_t dout_dy = NaryOp::backward(out, y); + scalar_t dy_dval = x; + scalar_t dy_dx = val; + val_grad += out_grad * dout_dy * dy_dval; + { + std::lock_guard lock(relation_mutex[layer * dim + d]); + relation_grad[layer * dim + d] += out_grad * dout_dy * dy_dx * dx_drel; + } + { + std::lock_guard lock(input_mutex[col * dim + d]); + input_grad[col * dim + d] += out_grad * dout_dy * dy_dx * dx_din; + } + } + value_grad[ptr] = val_grad; + } + } + }); +} + +template class NaryOp, template class BinaryOp> +Tensor rspmm_forward_cpu(const SparseTensor &sparse, const Tensor &relation_, const Tensor &input_) { + constexpr const char *fn_name = "rspmm_forward_cpu"; + TensorArg sparse_arg(sparse, "sparse", 1), relation_arg(relation_, "relation", 2), input_arg(input_, "input", 3); + + rspmm_forward_check(fn_name, sparse_arg, relation_arg, input_arg); + checkDeviceType(fn_name, {sparse, relation_, input_}, kCPU); + + const Tensor relation = relation_.contiguous(); + const Tensor input = input_.contiguous(); + + int64_t nnz = sparse._nnz(); + int64_t dim = input.size(1); + int64_t num_row = sparse.size(0); + Tensor output = at::empty({num_row, dim}, input.options()); + + auto csr = coo2csr3d(sparse); + Tensor row_ptr = std::get<0>(csr); + Tensor col_ind = std::get<1>(csr); + Tensor layer_ind = std::get<2>(csr); + Tensor value = std::get<3>(csr); + + AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "rspmm_forward_cpu", [&] { + rspmm_forward_out_cpu, BinaryOp>( + row_ptr.data_ptr(), + col_ind.data_ptr(), + layer_ind.data_ptr(), + value.data_ptr(), + relation.data_ptr(), + input.data_ptr(), + output.data_ptr(), + num_row, nnz, dim + ); + }); + + return output; +} + +template class NaryOp, template class BinaryOp> +std::tuple rspmm_backward_cpu( + const SparseTensor &sparse, const Tensor &relation_, const Tensor &input_, const Tensor &output_, + const Tensor &output_grad_) { + constexpr const char *fn_name = "rspmm_backward_cpu"; + TensorArg sparse_arg(sparse, "sparse", 1), relation_arg(relation_, "relation", 2), input_arg(input_, "input", 3), + output_arg(output_, "output", 4), output_grad_arg(output_grad_, "output_grad", 5); + + rspmm_backward_check(fn_name, sparse_arg, relation_arg, input_arg, output_arg, output_grad_arg); + checkDeviceType(fn_name, {sparse, relation_, input_, output_, output_grad_}, kCPU); + + const Tensor relation = relation_.contiguous(); + const Tensor input = input_.contiguous(); + const Tensor output = output_.contiguous(); + const Tensor output_grad = output_grad_.contiguous(); + + int64_t nnz = sparse._nnz(); + int64_t dim = input.size(1); + int64_t num_row = sparse.size(0); + Tensor value_grad = at::zeros_like(sparse.values()); + Tensor relation_grad = at::zeros_like(relation); + Tensor input_grad = at::zeros_like(input); + SparseTensor sparse_grad = at::_sparse_coo_tensor_unsafe(sparse.indices(), value_grad, sparse.sizes()); + + auto csr = coo2csr3d(sparse); + Tensor row_ptr = std::get<0>(csr); + Tensor col_ind = std::get<1>(csr); + Tensor layer_ind = std::get<2>(csr); + Tensor value = std::get<3>(csr); + std::vector relation_mutex(relation.numel()); + std::vector input_mutex(input.numel()); + + AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "rspmm_backward_cpu", [&] { + rspmm_backward_out_cpu, BinaryOp>( + row_ptr.data_ptr(), + col_ind.data_ptr(), + layer_ind.data_ptr(), + value.data_ptr(), + relation.data_ptr(), + input.data_ptr(), + output.data_ptr(), + output_grad.data_ptr(), + value_grad.data_ptr(), + relation_grad.data_ptr(), + input_grad.data_ptr(), + num_row, nnz, dim, + relation_mutex, input_mutex + ); + }); + + return std::make_tuple(sparse_grad, relation_grad, input_grad); +} + +#define DECLARE_FORWARD_IMPL(ADD, MUL, NARYOP, BINARYOP) \ + Tensor rspmm_##ADD##_##MUL##_forward_cpu( \ + const SparseTensor &sparse, const Tensor &relation, const Tensor &input) { \ + return rspmm_forward_cpu(sparse, relation, input); \ + } + +#define DECLARE_BACKWARD_IMPL(ADD, MUL, NARYOP, BINARYOP) \ + std::tuple rspmm_##ADD##_##MUL##_backward_cpu( \ + const SparseTensor &sparse, const Tensor &relation, const Tensor &input, const Tensor &output, \ + const Tensor &output_grad) { \ + return rspmm_backward_cpu(sparse, relation, input, output, output_grad); \ + } + +DECLARE_FORWARD_IMPL(add, mul, NaryAdd, BinaryMul) +DECLARE_BACKWARD_IMPL(add, mul, NaryAdd, BinaryMul) + +DECLARE_FORWARD_IMPL(min, mul, NaryMin, BinaryMul) +DECLARE_BACKWARD_IMPL(min, mul, NaryMin, BinaryMul) + +DECLARE_FORWARD_IMPL(max, mul, NaryMax, BinaryMul) +DECLARE_BACKWARD_IMPL(max, mul, NaryMax, BinaryMul) + +DECLARE_FORWARD_IMPL(add, add, NaryAdd, BinaryAdd) +DECLARE_BACKWARD_IMPL(add, add, NaryAdd, BinaryAdd) + +DECLARE_FORWARD_IMPL(min, add, NaryMin, BinaryAdd) +DECLARE_BACKWARD_IMPL(min, add, NaryMin, BinaryAdd) + +DECLARE_FORWARD_IMPL(max, add, NaryMax, BinaryAdd) +DECLARE_BACKWARD_IMPL(max, add, NaryMax, BinaryAdd) + +} // namespace at \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/extension/rspmm.cu b/build/lib/torchdrug/layers/functional/extension/rspmm.cu new file mode 100644 index 00000000..1794719f --- /dev/null +++ b/build/lib/torchdrug/layers/functional/extension/rspmm.cu @@ -0,0 +1,374 @@ +#include +#include + +#include "util.cuh" +#include "operator.cuh" +#include "rspmm.h" + +namespace at { + +// Memory & time efficient implementation of generalized spmm +// Much of the code is inspired by GE-SpMM +// https://github.com/hgyhungry/ge-spmm + +namespace { + +const int kCoarseningFactor = 2; +const int kThreadPerBlock = 256; + +} // namespace anonymous + +template +__global__ +void rspmm_forward_out_cuda(const int64_t *row_ptr, const int64_t *col_ind, const int64_t *layer_ind, + const scalar_t *value, const scalar_t *relation, const scalar_t *input, + scalar_t *output, + int64_t num_row, int64_t nnz, int64_t dim) { + // for best optimization, the following code is compiled with constant warpSize + assert(blockDim.x == warpSize); + + extern __shared__ int64_t buffer[]; + int64_t *col_ind_buf = buffer; + int64_t *layer_ind_buf = buffer + blockDim.y * warpSize; + scalar_t *value_buf = reinterpret_cast(layer_ind_buf + blockDim.y * warpSize); + col_ind_buf += threadIdx.y * warpSize; + layer_ind_buf += threadIdx.y * warpSize; + value_buf += threadIdx.y * warpSize; + + int64_t row = blockIdx.x * blockDim.y + threadIdx.y; + if (row >= num_row) + return; + int64_t d_start = blockIdx.y * warpSize * kCoarseningFactor + threadIdx.x; + int64_t ptr_start = row_ptr[row]; + int64_t ptr_end = row + 1 < num_row ? row_ptr[row + 1] : nnz; + scalar_t out[kCoarseningFactor]; +#pragma unroll + for (int64_t i = 0; i < kCoarseningFactor; i++) + out[i] = NaryOp::zero; + + for (int64_t block_ptr = ptr_start; block_ptr < ptr_end; block_ptr += warpSize) { + int64_t ptr = block_ptr + threadIdx.x; + if (ptr < ptr_end) { + col_ind_buf[threadIdx.x] = col_ind[ptr]; + layer_ind_buf[threadIdx.x] = layer_ind[ptr]; + value_buf[threadIdx.x] = value[ptr]; + } + __syncwarp(); + + int64_t max_offset = warpSize < ptr_end - block_ptr ? warpSize : ptr_end - block_ptr; + for (int64_t offset_ptr = 0; offset_ptr < max_offset; offset_ptr++) { + int64_t col = col_ind_buf[offset_ptr]; + int64_t layer = layer_ind_buf[offset_ptr]; + scalar_t val = value_buf[offset_ptr]; +#pragma unroll + for (int64_t i = 0; i < kCoarseningFactor; i++) { + int64_t d = d_start + i * warpSize; + if (d >= dim) + break; + scalar_t x = BinaryOp::forward(relation[layer * dim + d], input[col * dim + d]); + scalar_t y = val * x; + out[i] = NaryOp::forward(out[i], y); + } + } + __syncwarp(); + } + +#pragma unroll + for (int64_t i = 0; i < kCoarseningFactor; i++) { + int64_t d = d_start + i * warpSize; + if (d >= dim) + break; + output[row * dim + d] = out[i]; + } +} + +template +__global__ +void rspmm_backward_out_cuda(const int64_t *row_ptr, const int64_t *col_ind, const int64_t *layer_ind, + const scalar_t *value, const scalar_t *relation, const scalar_t *input, + const scalar_t *output, const scalar_t *output_grad, + scalar_t *value_grad, scalar_t *relation_grad, scalar_t *input_grad, + int64_t num_row, int64_t nnz, int64_t dim) { + // for best optimization, the following code is compiled with constant warpSize + assert(blockDim.x == warpSize); + + extern __shared__ int64_t buffer[]; + int64_t *col_ind_buf = buffer; + int64_t *layer_ind_buf = col_ind_buf + blockDim.y * warpSize; + scalar_t *value_buf = reinterpret_cast(layer_ind_buf + blockDim.y * warpSize); + col_ind_buf += threadIdx.y * warpSize; + layer_ind_buf += threadIdx.y * warpSize; + value_buf += threadIdx.y * warpSize; + + int64_t row = blockIdx.x * blockDim.y + threadIdx.y; + if (row >= num_row) + return; + int64_t d_start = blockIdx.y * warpSize * kCoarseningFactor + threadIdx.x; + int64_t ptr_start = row_ptr[row]; + int64_t ptr_end = row + 1 < num_row ? row_ptr[row + 1] : nnz; + + for (int64_t block_ptr = ptr_start; block_ptr < ptr_end; block_ptr += warpSize) { + int64_t ptr = block_ptr + threadIdx.x; + if (ptr < ptr_end) { + col_ind_buf[threadIdx.x] = col_ind[ptr]; + layer_ind_buf[threadIdx.x] = layer_ind[ptr]; + value_buf[threadIdx.x] = value[ptr]; + } + __syncwarp(); + + int64_t max_offset = warpSize < ptr_end - block_ptr ? warpSize : ptr_end - block_ptr; + for (int64_t offset_ptr = 0; offset_ptr < max_offset; offset_ptr++) { + int64_t col = col_ind_buf[offset_ptr]; + int64_t layer = layer_ind_buf[offset_ptr]; + scalar_t val = value_buf[offset_ptr]; + scalar_t val_grad = 0; +#pragma unroll + for (int64_t i = 0; i < kCoarseningFactor; i++) { + int64_t d = d_start + i * warpSize; + if (d >= dim) + break; + scalar_t rel = relation[layer * dim + d]; + scalar_t in = input[col * dim + d]; + scalar_t out = output[row * dim + d]; + scalar_t out_grad = output_grad[row * dim + d]; + scalar_t x = BinaryOp::forward(rel, in); + scalar_t y = val * x; + scalar_t dx_drel = BinaryOp::backward_lhs(rel, in); + scalar_t dx_din = BinaryOp::backward_rhs(rel, in); + scalar_t dout_dy = NaryOp::backward(out, y); + scalar_t dy_dval = x; + scalar_t dy_dx = val; + val_grad += out_grad * dout_dy * dy_dval; + atomicAdd(&relation_grad[layer * dim + d], out_grad * dout_dy * dy_dx * dx_drel); + atomicAdd(&input_grad[col * dim + d], out_grad * dout_dy * dy_dx * dx_din); + } + val_grad = warp_reduce(val_grad); + if (threadIdx.x == 0) + atomicAdd(&value_grad[block_ptr + offset_ptr], val_grad); + } + __syncwarp(); + } +} + +// only relation & input require gradients +template +__global__ +void rspmm_backward_out_cuda(const int64_t *row_ptr, const int64_t *col_ind, const int64_t *layer_ind, + const scalar_t *value, const scalar_t *relation, const scalar_t *input, + const scalar_t *output, const scalar_t *output_grad, + scalar_t *relation_grad, scalar_t *input_grad, + int64_t num_row, int64_t nnz, int64_t dim) { + // for best optimization, the following code is compiled with constant warpSize + assert(blockDim.x == warpSize); + + extern __shared__ int64_t buffer[]; + int64_t *col_ind_buf = buffer; + int64_t *layer_ind_buf = col_ind_buf + blockDim.y * warpSize; + scalar_t *value_buf = reinterpret_cast(layer_ind_buf + blockDim.y * warpSize); + col_ind_buf += threadIdx.y * warpSize; + layer_ind_buf += threadIdx.y * warpSize; + value_buf += threadIdx.y * warpSize; + + int64_t row = blockIdx.x * blockDim.y + threadIdx.y; + if (row >= num_row) + return; + int64_t d_start = blockIdx.y * warpSize * kCoarseningFactor + threadIdx.x; + int64_t ptr_start = row_ptr[row]; + int64_t ptr_end = row + 1 < num_row ? row_ptr[row + 1] : nnz; + + for (int64_t block_ptr = ptr_start; block_ptr < ptr_end; block_ptr += warpSize) { + int64_t ptr = block_ptr + threadIdx.x; + if (ptr < ptr_end) { + col_ind_buf[threadIdx.x] = col_ind[ptr]; + layer_ind_buf[threadIdx.x] = layer_ind[ptr]; + value_buf[threadIdx.x] = value[ptr]; + } + __syncwarp(); + + int64_t max_offset = warpSize < ptr_end - block_ptr ? warpSize : ptr_end - block_ptr; + for (int64_t offset_ptr = 0; offset_ptr < max_offset; offset_ptr++) { + int64_t col = col_ind_buf[offset_ptr]; + int64_t layer = layer_ind_buf[offset_ptr]; + scalar_t val = value_buf[offset_ptr]; +#pragma unroll + for (int64_t i = 0; i < kCoarseningFactor; i++) { + int64_t d = d_start + i * warpSize; + if (d >= dim) + break; + scalar_t rel = relation[layer * dim + d]; + scalar_t in = input[col * dim + d]; + scalar_t out = output[row * dim + d]; + scalar_t out_grad = output_grad[row * dim + d]; + scalar_t x = BinaryOp::forward(rel, in); + scalar_t y = val * x; + scalar_t dx_drel = BinaryOp::backward_lhs(rel, in); + scalar_t dx_din = BinaryOp::backward_rhs(rel, in); + scalar_t dout_dy = NaryOp::backward(out, y); + scalar_t dy_dx = val; + atomicAdd(&relation_grad[layer * dim + d], out_grad * dout_dy * dy_dx * dx_drel); + atomicAdd(&input_grad[col * dim + d], out_grad * dout_dy * dy_dx * dx_din); + } + } + __syncwarp(); + } +} + +template class NaryOp, template class BinaryOp> +Tensor rspmm_forward_cuda(const SparseTensor &sparse, const Tensor &relation_, const Tensor &input_) { + constexpr const char *fn_name = "rspmm_forward_cuda"; + TensorArg sparse_arg(sparse, "sparse", 1), relation_arg(relation_, "relation", 2), input_arg(input_, "input", 3); + + rspmm_forward_check(fn_name, sparse_arg, relation_arg, input_arg); + checkAllSameGPU(fn_name, {sparse_arg, relation_arg, input_arg}); + + const Tensor relation = relation_.contiguous(); + const Tensor input = input_.contiguous(); + + int64_t nnz = sparse._nnz(); + int64_t dim = input.size(1); + int64_t num_row = sparse.size(0); + Tensor output = at::empty({num_row, dim}, input.options()); + + auto csr = coo2csr3d(sparse); + Tensor row_ptr = std::get<0>(csr); + Tensor col_ind = std::get<1>(csr); + Tensor layer_ind = std::get<2>(csr); + Tensor value = std::get<3>(csr); + + cudaSetDevice(input.get_device()); + auto stream = at::cuda::getCurrentCUDAStream(); + + const int dim_per_block = 32; // warpSize + const int num_dim_block = (dim + dim_per_block * kCoarseningFactor - 1) / (dim_per_block * kCoarseningFactor); + const int row_per_block = kThreadPerBlock / dim_per_block; + const int num_row_block = (num_row + row_per_block - 1) / row_per_block; + + AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "rspmm_forward_cuda", [&] { + const int memory_size = kThreadPerBlock * (sizeof(int64_t) * 2 + sizeof(scalar_t)); + rspmm_forward_out_cuda, BinaryOp> + <<>>( + row_ptr.data_ptr(), + col_ind.data_ptr(), + layer_ind.data_ptr(), + value.data_ptr(), + relation.data_ptr(), + input.data_ptr(), + output.data_ptr(), + num_row, nnz, dim + ); + }); + + return output; +} + +template class NaryOp, template class BinaryOp> +std::tuple rspmm_backward_cuda( + const SparseTensor &sparse, const Tensor &relation_, const Tensor &input_, const Tensor &output_, + const Tensor &output_grad_) { + constexpr const char *fn_name = "rspmm_backward_cuda"; + TensorArg sparse_arg(sparse, "sparse", 1), relation_arg(relation_, "relation", 2), input_arg(input_, "input", 3), + output_arg(output_, "output", 4), output_grad_arg(output_grad_, "output_grad", 5); + + rspmm_backward_check(fn_name, sparse_arg, relation_arg, input_arg, output_arg, output_grad_arg); + checkAllSameGPU(fn_name, {sparse_arg, relation_arg, input_arg, output_arg, output_grad_arg}); + + const Tensor relation = relation_.contiguous(); + const Tensor input = input_.contiguous(); + const Tensor output = output_.contiguous(); + const Tensor output_grad = output_grad_.contiguous(); + + int64_t nnz = sparse._nnz(); + int64_t dim = input.size(1); + int64_t num_row = sparse.size(0); + Tensor value_grad = at::zeros_like(sparse.values()); + Tensor relation_grad = at::zeros_like(relation); + Tensor input_grad = at::zeros_like(input); + SparseTensor sparse_grad = at::_sparse_coo_tensor_unsafe(sparse.indices(), value_grad, sparse.sizes()); + + auto csr = coo2csr3d(sparse); + Tensor row_ptr = std::get<0>(csr); + Tensor col_ind = std::get<1>(csr); + Tensor layer_ind = std::get<2>(csr); + Tensor value = std::get<3>(csr); + + cudaSetDevice(input.get_device()); + auto stream = at::cuda::getCurrentCUDAStream(); + + const int dim_per_block = 32; // warpSize + const int num_dim_block = (dim + dim_per_block * kCoarseningFactor - 1) / (dim_per_block * kCoarseningFactor); + const int row_per_block = kThreadPerBlock / dim_per_block; + const int num_row_block = (num_row + row_per_block - 1) / row_per_block; + + if (sparse.requires_grad()) + AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "rspmm_backward_cuda", [&] { + const int memory_size = kThreadPerBlock * (sizeof(int64_t) * 2 + sizeof(scalar_t)); + rspmm_backward_out_cuda, BinaryOp> + <<>>( + row_ptr.data_ptr(), + col_ind.data_ptr(), + layer_ind.data_ptr(), + value.data_ptr(), + relation.data_ptr(), + input.data_ptr(), + output.data_ptr(), + output_grad.data_ptr(), + value_grad.data_ptr(), + relation_grad.data_ptr(), + input_grad.data_ptr(), + num_row, nnz, dim + ); + }); + else + AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "rspmm_backward_cuda", [&] { + const int memory_size = kThreadPerBlock * (sizeof(int64_t) * 2 + sizeof(scalar_t)); + rspmm_backward_out_cuda, BinaryOp> + <<>>( + row_ptr.data_ptr(), + col_ind.data_ptr(), + layer_ind.data_ptr(), + value.data_ptr(), + relation.data_ptr(), + input.data_ptr(), + output.data_ptr(), + output_grad.data_ptr(), + relation_grad.data_ptr(), + input_grad.data_ptr(), + num_row, nnz, dim + ); + }); + + return std::make_tuple(sparse_grad, relation_grad, input_grad); +} + +#define DECLARE_FORWARD_IMPL(ADD, MUL, NARYOP, BINARYOP) \ + Tensor rspmm_##ADD##_##MUL##_forward_cuda( \ + const SparseTensor &sparse, const Tensor &relation, const Tensor &input) { \ + return rspmm_forward_cuda(sparse, relation, input); \ + } + +#define DECLARE_BACKWARD_IMPL(ADD, MUL, NARYOP, BINARYOP) \ + std::tuple rspmm_##ADD##_##MUL##_backward_cuda( \ + const SparseTensor &sparse, const Tensor &relation, const Tensor &input, const Tensor &output, \ + const Tensor &output_grad) { \ + return rspmm_backward_cuda(sparse, relation, input, output, output_grad); \ + } + +DECLARE_FORWARD_IMPL(add, mul, NaryAdd, BinaryMul) +DECLARE_BACKWARD_IMPL(add, mul, NaryAdd, BinaryMul) + +DECLARE_FORWARD_IMPL(min, mul, NaryMin, BinaryMul) +DECLARE_BACKWARD_IMPL(min, mul, NaryMin, BinaryMul) + +DECLARE_FORWARD_IMPL(max, mul, NaryMax, BinaryMul) +DECLARE_BACKWARD_IMPL(max, mul, NaryMax, BinaryMul) + +DECLARE_FORWARD_IMPL(add, add, NaryAdd, BinaryAdd) +DECLARE_BACKWARD_IMPL(add, add, NaryAdd, BinaryAdd) + +DECLARE_FORWARD_IMPL(min, add, NaryMin, BinaryAdd) +DECLARE_BACKWARD_IMPL(min, add, NaryMin, BinaryAdd) + +DECLARE_FORWARD_IMPL(max, add, NaryMax, BinaryAdd) +DECLARE_BACKWARD_IMPL(max, add, NaryMax, BinaryAdd) + +} // namespace at \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/extension/rspmm.h b/build/lib/torchdrug/layers/functional/extension/rspmm.h new file mode 100644 index 00000000..8025f4d7 --- /dev/null +++ b/build/lib/torchdrug/layers/functional/extension/rspmm.h @@ -0,0 +1,85 @@ +#pragma once + +#include + +#include +#include + +namespace at { + +using namespace at::sparse; + +void rspmm_forward_check(CheckedFrom c, const TensorArg &sparse_arg, const TensorArg &relation_arg, + const TensorArg &input_arg); + +void rspmm_backward_check(CheckedFrom c, const TensorArg &sparse_arg, const TensorArg &relation_arg, + const TensorArg &input_arg, const TensorArg &output_arg, const TensorArg &output_grad_arg); + +std::tuple coo2csr3d(const SparseTensor &sparse); + +SparseTensor csr2coo3d(const Tensor &row_ptr, const Tensor &col_ind, const Tensor &layer_ind, const Tensor &value, + IntArrayRef size); + +Tensor rspmm_add_mul_forward_cpu(const SparseTensor &sparse, const Tensor &relation, const Tensor &input); + +std::tuple rspmm_add_mul_backward_cpu(const SparseTensor &sparse, + const Tensor &relation, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor rspmm_min_mul_forward_cpu(const SparseTensor &sparse, const Tensor &relation, const Tensor &input); + +std::tuple rspmm_min_mul_backward_cpu(const SparseTensor &sparse, + const Tensor &relation, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor rspmm_max_mul_forward_cpu(const SparseTensor &sparse, const Tensor &relation, const Tensor &input); + +std::tuple rspmm_max_mul_backward_cpu(const SparseTensor &sparse, + const Tensor &relation, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor rspmm_add_add_forward_cpu(const SparseTensor &sparse, const Tensor &relation, const Tensor &input); + +std::tuple rspmm_add_add_backward_cpu(const SparseTensor &sparse, + const Tensor &relation, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor rspmm_min_add_forward_cpu(const SparseTensor &sparse, const Tensor &relation, const Tensor &input); + +std::tuple rspmm_min_add_backward_cpu(const SparseTensor &sparse, + const Tensor &relation, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor rspmm_max_add_forward_cpu(const SparseTensor &sparse, const Tensor &relation, const Tensor &input); + +std::tuple rspmm_max_add_backward_cpu(const SparseTensor &sparse, + const Tensor &relation, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +#ifdef CUDA_OP +Tensor rspmm_add_mul_forward_cuda(const SparseTensor &sparse, const Tensor &relation, const Tensor &input); + +std::tuple rspmm_add_mul_backward_cuda(const SparseTensor &sparse, + const Tensor &relation, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor rspmm_min_mul_forward_cuda(const SparseTensor &sparse, const Tensor &relation, const Tensor &input); + +std::tuple rspmm_min_mul_backward_cuda(const SparseTensor &sparse, + const Tensor &relation, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor rspmm_max_mul_forward_cuda(const SparseTensor &sparse, const Tensor &relation, const Tensor &input); + +std::tuple rspmm_max_mul_backward_cuda(const SparseTensor &sparse, + const Tensor &relation, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor rspmm_add_add_forward_cuda(const SparseTensor &sparse, const Tensor &relation, const Tensor &input); + +std::tuple rspmm_add_add_backward_cuda(const SparseTensor &sparse, + const Tensor &relation, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor rspmm_min_add_forward_cuda(const SparseTensor &sparse, const Tensor &relation, const Tensor &input); + +std::tuple rspmm_min_add_backward_cuda(const SparseTensor &sparse, + const Tensor &relation, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor rspmm_max_add_forward_cuda(const SparseTensor &sparse, const Tensor &relation, const Tensor &input); + +std::tuple rspmm_max_add_backward_cuda(const SparseTensor &sparse, + const Tensor &relation, const Tensor &input, const Tensor &output, const Tensor &output_grad); +#endif + +} // namespace at \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/extension/spmm.cpp b/build/lib/torchdrug/layers/functional/extension/spmm.cpp new file mode 100644 index 00000000..9a3d4afd --- /dev/null +++ b/build/lib/torchdrug/layers/functional/extension/spmm.cpp @@ -0,0 +1,283 @@ +#include + +#include + +#include "operator.cuh" +#include "spmm.h" + +namespace at { + +// In PyTorch 1.4.0, parallel_for depends on some functions from at::internal in ATen/Parallel.h +// which are not explicitly included +// This is fixed in some new PyTorch release +using namespace at::internal; + +void spmm_forward_check(CheckedFrom c, const TensorArg &sparse_arg, const TensorArg &input_arg) { + TORCH_CHECK(sparse_arg->sparse_dim() == 2, + "Expected 2-dimensional sparse tensor, but got ", sparse_arg->sparse_dim(), + "-dimensional tensor for ", sparse_arg," (while checking arguments for ", c, ")"); + TORCH_CHECK(sparse_arg->dense_dim() == 0, + "Expected 2-dimensional sparse tensor, but got ", sparse_arg->dense_dim(), + " dense dimensions for", sparse_arg," (while checking arguments for ", c, ")"); + checkDim(c, input_arg, 2); + checkScalarType(c, input_arg, sparse_arg->scalar_type()); + checkSize(c, input_arg, 0, sparse_arg->size(1)); +} + +void spmm_backward_check(CheckedFrom c, const TensorArg &sparse_arg, const TensorArg &input_arg, + const TensorArg &output_arg, const TensorArg &output_grad_arg) { + spmm_forward_check(c, sparse_arg, input_arg); + checkDim(c, output_arg, 2); + checkSameSize(c, output_arg, output_grad_arg); + checkSameType(c, input_arg, output_arg); + checkSameType(c, input_arg, output_grad_arg); + checkSize(c, output_arg, {sparse_arg->size(0), input_arg->size(1)}); +} + +std::tuple coo2csr(const SparseTensor &sparse) { + TORCH_CHECK(sparse.is_coalesced(), "Expect coalesced sparse tensor"); + Tensor index = sparse.indices(); + Tensor row_ind = index.select(0, 0); + Tensor col_ind = index.select(0, 1); + Tensor value = sparse.values(); + // scatter_add is super slow for int64, due to non-hardware atomic operations + // use int32 instead + Tensor nnz_per_row = at::zeros({sparse.size(0)}, row_ind.options().dtype(at::ScalarType::Int)); + nnz_per_row.scatter_add_(0, row_ind, at::ones(row_ind.sizes(), nnz_per_row.options())); + nnz_per_row = nnz_per_row.toType(at::ScalarType::Long); + Tensor row_ptr = nnz_per_row.cumsum(0) - nnz_per_row; + return std::make_tuple(row_ptr, col_ind, value); +} + +SparseTensor csr2coo(const Tensor &row_ptr_, const Tensor &col_ind, const Tensor &value, IntArrayRef size) { + Tensor row_ptr = row_ptr_.masked_select(row_ptr_ < col_ind.size(0)); + // scatter_add is super slow for int64, due to non-hardware atomic operations + // use int32 instead + Tensor row_ind = at::zeros(col_ind.sizes(), col_ind.options().dtype(at::ScalarType::Int)); + row_ind.scatter_add_(0, row_ptr, at::ones(row_ptr.sizes(), row_ind.options())); + row_ind = row_ind.toType(at::ScalarType::Long); + row_ind = row_ind.cumsum(0) - 1; + Tensor index = at::stack({row_ind, col_ind}, 0); + return at::_sparse_coo_tensor_unsafe(index, value, size, value.options().layout(kSparse)); +} + +template +void spmm_forward_out_cpu(const int64_t *row_ptr, const int64_t *col_ind, const scalar_t *value, + const scalar_t *input, scalar_t *output, + int64_t num_row, int64_t nnz, int64_t dim) { + parallel_for(0, num_row, 0, [&](int64_t row_start, int64_t row_end) { + for (int64_t row = row_start; row < row_end; row++) { + for (int64_t d = 0; d < dim; d++) + output[row * dim + d] = NaryOp::zero; + + int64_t ptr_start = row_ptr[row]; + int64_t ptr_end = row + 1 < num_row ? row_ptr[row + 1] : nnz; + for (int64_t ptr = ptr_start; ptr < ptr_end; ptr++) { + int64_t col = col_ind[ptr]; + scalar_t val = value[ptr]; + for (int64_t d = 0; d < dim; d++) { + scalar_t x = BinaryOp::forward(val, input[col * dim + d]); + scalar_t &out = output[row * dim + d]; + out = NaryOp::forward(out, x); + } + } + } + }); +} + +template +void spmm_backward_out_cpu(const int64_t *row_ptr, const int64_t *col_ind, const scalar_t *value, + const scalar_t *input, const scalar_t *output, const scalar_t *output_grad, + scalar_t *value_grad, scalar_t *input_grad, + int64_t num_row, int64_t nnz, int64_t dim, + std::vector &mutex) { + parallel_for(0, num_row, 0, [&](int64_t row_start, int64_t row_end) { + for (int64_t row = row_start; row < row_end; row++) { + int64_t ptr_start = row_ptr[row]; + int64_t ptr_end = row + 1 < num_row ? row_ptr[row + 1] : nnz; + for (int64_t ptr = ptr_start; ptr < ptr_end; ptr++) { + int64_t col = col_ind[ptr]; + scalar_t val = value[ptr]; + scalar_t val_grad = 0; + for (int64_t d = 0; d < dim; d++) { + scalar_t in = input[col * dim + d]; + scalar_t out = output[row * dim + d]; + scalar_t out_grad = output_grad[row * dim + d]; + scalar_t x = BinaryOp::forward(val, in); + scalar_t dx_dval = BinaryOp::backward_lhs(val, in); + scalar_t dx_din = BinaryOp::backward_rhs(val, in); + scalar_t dout_dx = NaryOp::backward(out, x); + val_grad += out_grad * dout_dx * dx_dval; + { + std::lock_guard lock(mutex[col * dim + d]); + input_grad[col * dim + d] += out_grad * dout_dx * dx_din; + } + } + value_grad[ptr] = val_grad; + } + } + }); +} + +template class NaryOp, template class BinaryOp> +Tensor spmm_forward_cpu(const SparseTensor &sparse, const Tensor &input_) { + constexpr const char *fn_name = "spmm_forward_cpu"; + TensorArg sparse_arg(sparse, "sparse", 1), input_arg(input_, "input", 2); + + spmm_forward_check(fn_name, sparse_arg, input_arg); + checkDeviceType(fn_name, {sparse, input_}, kCPU); + + const Tensor input = input_.contiguous(); + + int64_t nnz = sparse._nnz(); + int64_t dim = input.size(1); + int64_t num_row = sparse.size(0); + Tensor output = at::empty({num_row, dim}, input.options()); + + auto csr = coo2csr(sparse); + Tensor row_ptr = std::get<0>(csr); + Tensor col_ind = std::get<1>(csr); + Tensor value = std::get<2>(csr); + + AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "spmm_forward_cpu", [&] { + spmm_forward_out_cpu, BinaryOp>( + row_ptr.data_ptr(), + col_ind.data_ptr(), + value.data_ptr(), + input.data_ptr(), + output.data_ptr(), + num_row, nnz, dim + ); + }); + + return output; +} + +template class NaryOp, template class BinaryOp> +std::tuple spmm_backward_cpu( + const SparseTensor &sparse, const Tensor &input_, const Tensor &output_, const Tensor &output_grad_) { + constexpr const char *fn_name = "spmm_backward_cpu"; + TensorArg sparse_arg(sparse, "sparse", 1), input_arg(input_, "input", 2), output_arg(output_, "output", 3), + output_grad_arg(output_grad_, "output_grad", 4); + + spmm_backward_check(fn_name, sparse_arg, input_arg, output_arg, output_grad_arg); + checkDeviceType(fn_name, {sparse, input_, output_, output_grad_}, kCPU); + + const Tensor input = input_.contiguous(); + const Tensor output = output_.contiguous(); + const Tensor output_grad = output_grad_.contiguous(); + + int64_t nnz = sparse._nnz(); + int64_t dim = input.size(1); + int64_t num_row = sparse.size(0); + Tensor value_grad = at::zeros_like(sparse.values()); + Tensor input_grad = at::zeros_like(input); + SparseTensor sparse_grad = at::_sparse_coo_tensor_unsafe(sparse.indices(), value_grad, sparse.sizes()); + + auto csr = coo2csr(sparse); + Tensor row_ptr = std::get<0>(csr).contiguous(); + Tensor col_ind = std::get<1>(csr).contiguous(); + Tensor value = std::get<2>(csr).contiguous(); + std::vector mutex(input.numel()); + + AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "spmm_backward_cpu", [&] { + spmm_backward_out_cpu, BinaryOp>( + row_ptr.data_ptr(), + col_ind.data_ptr(), + value.data_ptr(), + input.data_ptr(), + output.data_ptr(), + output_grad.data_ptr(), + value_grad.data_ptr(), + input_grad.data_ptr(), + num_row, nnz, dim, + mutex + ); + }); + + return std::make_tuple(sparse_grad, input_grad); +} + +#define DECLARE_FORWARD_IMPL(ADD, MUL, NARYOP, BINARYOP) \ + Tensor spmm_##ADD##_##MUL##_forward_cpu(const SparseTensor &sparse, const Tensor &input) { \ + return spmm_forward_cpu(sparse, input); \ + } + +#define DECLARE_BACKWARD_IMPL(ADD, MUL, NARYOP, BINARYOP) \ + std::tuple spmm_##ADD##_##MUL##_backward_cpu( \ + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad) { \ + return spmm_backward_cpu(sparse, input, output, output_grad); \ + } + +DECLARE_FORWARD_IMPL(add, mul, NaryAdd, BinaryMul) +DECLARE_BACKWARD_IMPL(add, mul, NaryAdd, BinaryMul) + +DECLARE_FORWARD_IMPL(min, mul, NaryMin, BinaryMul) +DECLARE_BACKWARD_IMPL(min, mul, NaryMin, BinaryMul) + +DECLARE_FORWARD_IMPL(max, mul, NaryMax, BinaryMul) +DECLARE_BACKWARD_IMPL(max, mul, NaryMax, BinaryMul) + +DECLARE_FORWARD_IMPL(add, add, NaryAdd, BinaryAdd) +DECLARE_BACKWARD_IMPL(add, add, NaryAdd, BinaryAdd) + +DECLARE_FORWARD_IMPL(min, add, NaryMin, BinaryAdd) +DECLARE_BACKWARD_IMPL(min, add, NaryMin, BinaryAdd) + +DECLARE_FORWARD_IMPL(max, add, NaryMax, BinaryAdd) +DECLARE_BACKWARD_IMPL(max, add, NaryMax, BinaryAdd) + +} // namespace at + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("spmm_add_mul_forward_cpu", &at::spmm_add_mul_forward_cpu); + m.def("spmm_add_mul_backward_cpu", &at::spmm_add_mul_backward_cpu); + m.def("spmm_min_mul_forward_cpu", &at::spmm_min_mul_forward_cpu); + m.def("spmm_min_mul_backward_cpu", &at::spmm_min_mul_backward_cpu); + m.def("spmm_max_mul_forward_cpu", &at::spmm_max_mul_forward_cpu); + m.def("spmm_max_mul_backward_cpu", &at::spmm_max_mul_backward_cpu); + m.def("spmm_add_add_forward_cpu", &at::spmm_add_add_forward_cpu); + m.def("spmm_add_add_backward_cpu", &at::spmm_add_add_backward_cpu); + m.def("spmm_min_add_forward_cpu", &at::spmm_min_add_forward_cpu); + m.def("spmm_min_add_backward_cpu", &at::spmm_min_add_backward_cpu); + m.def("spmm_max_add_forward_cpu", &at::spmm_max_add_forward_cpu); + m.def("spmm_max_add_backward_cpu", &at::spmm_max_add_backward_cpu); + m.def("rspmm_add_mul_forward_cpu", &at::rspmm_add_mul_forward_cpu); + m.def("rspmm_add_mul_backward_cpu", &at::rspmm_add_mul_backward_cpu); + m.def("rspmm_min_mul_forward_cpu", &at::rspmm_min_mul_forward_cpu); + m.def("rspmm_min_mul_backward_cpu", &at::rspmm_min_mul_backward_cpu); + m.def("rspmm_max_mul_forward_cpu", &at::rspmm_max_mul_forward_cpu); + m.def("rspmm_max_mul_backward_cpu", &at::rspmm_max_mul_backward_cpu); + m.def("rspmm_add_add_forward_cpu", &at::rspmm_add_add_forward_cpu); + m.def("rspmm_add_add_backward_cpu", &at::rspmm_add_add_backward_cpu); + m.def("rspmm_min_add_forward_cpu", &at::rspmm_min_add_forward_cpu); + m.def("rspmm_min_add_backward_cpu", &at::rspmm_min_add_backward_cpu); + m.def("rspmm_max_add_forward_cpu", &at::rspmm_max_add_forward_cpu); + m.def("rspmm_max_add_backward_cpu", &at::rspmm_max_add_backward_cpu); +#ifdef CUDA_OP + m.def("spmm_add_mul_forward_cuda", &at::spmm_add_mul_forward_cuda); + m.def("spmm_add_mul_backward_cuda", &at::spmm_add_mul_backward_cuda); + m.def("spmm_min_mul_forward_cuda", &at::spmm_min_mul_forward_cuda); + m.def("spmm_min_mul_backward_cuda", &at::spmm_min_mul_backward_cuda); + m.def("spmm_max_mul_forward_cuda", &at::spmm_max_mul_forward_cuda); + m.def("spmm_max_mul_backward_cuda", &at::spmm_max_mul_backward_cuda); + m.def("spmm_add_add_forward_cuda", &at::spmm_add_add_forward_cuda); + m.def("spmm_add_add_backward_cuda", &at::spmm_add_add_backward_cuda); + m.def("spmm_min_add_forward_cuda", &at::spmm_min_add_forward_cuda); + m.def("spmm_min_add_backward_cuda", &at::spmm_min_add_backward_cuda); + m.def("spmm_max_add_forward_cuda", &at::spmm_max_add_forward_cuda); + m.def("spmm_max_add_backward_cuda", &at::spmm_max_add_backward_cuda); + m.def("rspmm_add_mul_forward_cuda", &at::rspmm_add_mul_forward_cuda); + m.def("rspmm_add_mul_backward_cuda", &at::rspmm_add_mul_backward_cuda); + m.def("rspmm_min_mul_forward_cuda", &at::rspmm_min_mul_forward_cuda); + m.def("rspmm_min_mul_backward_cuda", &at::rspmm_min_mul_backward_cuda); + m.def("rspmm_max_mul_forward_cuda", &at::rspmm_max_mul_forward_cuda); + m.def("rspmm_max_mul_backward_cuda", &at::rspmm_max_mul_backward_cuda); + m.def("rspmm_add_add_forward_cuda", &at::rspmm_add_add_forward_cuda); + m.def("rspmm_add_add_backward_cuda", &at::rspmm_add_add_backward_cuda); + m.def("rspmm_min_add_forward_cuda", &at::rspmm_min_add_forward_cuda); + m.def("rspmm_min_add_backward_cuda", &at::rspmm_min_add_backward_cuda); + m.def("rspmm_max_add_forward_cuda", &at::rspmm_max_add_forward_cuda); + m.def("rspmm_max_add_backward_cuda", &at::rspmm_max_add_backward_cuda); +#endif +} \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/extension/spmm.cu b/build/lib/torchdrug/layers/functional/extension/spmm.cu new file mode 100644 index 00000000..7abd3ef5 --- /dev/null +++ b/build/lib/torchdrug/layers/functional/extension/spmm.cu @@ -0,0 +1,333 @@ +#include +#include + +#include "util.cuh" +#include "operator.cuh" +#include "spmm.h" + +// Memory & time efficient implementation of generalized spmm +// Much of the code is inspired by GE-SpMM +// https://github.com/hgyhungry/ge-spmm + +namespace at { + +namespace { + +const int kCoarseningFactor = 2; +const int kThreadPerBlock = 256; + +} // namespace anonymous + +template +__global__ +void spmm_forward_out_cuda(const int64_t *row_ptr, const int64_t *col_ind, const scalar_t *value, + const scalar_t *input, scalar_t *output, + int64_t num_row, int64_t nnz, int64_t dim) { + // for best optimization, the following code is compiled with constant warpSize + assert(blockDim.x == warpSize); + + extern __shared__ int64_t buffer[]; + int64_t *col_ind_buf = buffer; + scalar_t *value_buf = reinterpret_cast(col_ind_buf + blockDim.y * warpSize); + col_ind_buf += threadIdx.y * warpSize; + value_buf += threadIdx.y * warpSize; + + int64_t row = blockIdx.x * blockDim.y + threadIdx.y; + if (row >= num_row) + return; + int64_t d_start = blockIdx.y * warpSize * kCoarseningFactor + threadIdx.x; + int64_t ptr_start = row_ptr[row]; + int64_t ptr_end = row + 1 < num_row ? row_ptr[row + 1] : nnz; + scalar_t out[kCoarseningFactor]; +#pragma unroll + for (int64_t i = 0; i < kCoarseningFactor; i++) + out[i] = NaryOp::zero; + + for (int64_t block_ptr = ptr_start; block_ptr < ptr_end; block_ptr += warpSize) { + int64_t ptr = block_ptr + threadIdx.x; + if (ptr < ptr_end) { + col_ind_buf[threadIdx.x] = col_ind[ptr]; + value_buf[threadIdx.x] = value[ptr]; + } + __syncwarp(); + + int64_t max_offset = warpSize < ptr_end - block_ptr ? warpSize : ptr_end - block_ptr; + for (int64_t offset_ptr = 0; offset_ptr < max_offset; offset_ptr++) { + int64_t col = col_ind_buf[offset_ptr]; + scalar_t val = value_buf[offset_ptr]; +#pragma unroll + for (int64_t i = 0; i < kCoarseningFactor; i++) { + int64_t d = d_start + i * warpSize; + if (d >= dim) + break; + scalar_t x = BinaryOp::forward(val, input[col * dim + d]); + out[i] = NaryOp::forward(out[i], x); + } + } + __syncwarp(); + } + +#pragma unroll + for (int64_t i = 0; i < kCoarseningFactor; i++) { + int64_t d = d_start + i * warpSize; + if (d >= dim) + break; + output[row * dim + d] = out[i]; + } +} + +// both sparse and input require gradients +template +__global__ +void spmm_backward_out_cuda(const int64_t *row_ptr, const int64_t *col_ind, const scalar_t *value, + const scalar_t *input, const scalar_t *output, const scalar_t *output_grad, + scalar_t *value_grad, scalar_t *input_grad, + int64_t num_row, int64_t nnz, int64_t dim) { + // for best optimization, the following code is compiled with constant warpSize + assert(blockDim.x == warpSize); + + extern __shared__ int64_t buffer[]; + int64_t *col_ind_buf = buffer; + scalar_t *value_buf = reinterpret_cast(col_ind_buf + blockDim.y * warpSize); + col_ind_buf += threadIdx.y * warpSize; + value_buf += threadIdx.y * warpSize; + + int64_t row = blockIdx.x * blockDim.y + threadIdx.y; + if (row >= num_row) + return; + int64_t d_start = blockIdx.y * warpSize * kCoarseningFactor + threadIdx.x; + int64_t ptr_start = row_ptr[row]; + int64_t ptr_end = row + 1 < num_row ? row_ptr[row + 1] : nnz; + + for (int64_t block_ptr = ptr_start; block_ptr < ptr_end; block_ptr += warpSize) { + int64_t ptr = block_ptr + threadIdx.x; + if (ptr < ptr_end) { + col_ind_buf[threadIdx.x] = col_ind[ptr]; + value_buf[threadIdx.x] = value[ptr]; + } + __syncwarp(); + + int64_t max_offset = warpSize < ptr_end - block_ptr ? warpSize : ptr_end - block_ptr; + for (int64_t offset_ptr = 0; offset_ptr < max_offset; offset_ptr++) { + int64_t col = col_ind_buf[offset_ptr]; + scalar_t val = value_buf[offset_ptr]; + scalar_t val_grad = 0; +#pragma unroll + for (int64_t i = 0; i < kCoarseningFactor; i++) { + int64_t d = d_start + i * warpSize; + if (d >= dim) + break; + scalar_t in = input[col * dim + d]; + scalar_t out = output[row * dim + d]; + scalar_t out_grad = output_grad[row * dim + d]; + scalar_t x = BinaryOp::forward(val, in); + scalar_t dx_dval = BinaryOp::backward_lhs(val, in); + scalar_t dx_din = BinaryOp::backward_rhs(val, in); + scalar_t dout_dx = NaryOp::backward(out, x); + val_grad += out_grad * dout_dx * dx_dval; + atomicAdd(&input_grad[col * dim + d], out_grad * dout_dx * dx_din); + } + val_grad = warp_reduce(val_grad); + if (threadIdx.x == 0) + atomicAdd(&value_grad[block_ptr + offset_ptr], val_grad); + } + __syncwarp(); + } +} + +// only input requires gradients +template +__global__ +void spmm_backward_out_cuda(const int64_t *row_ptr, const int64_t *col_ind, const scalar_t *value, + const scalar_t *input, const scalar_t *output, const scalar_t *output_grad, + scalar_t *input_grad, + int64_t num_row, int64_t nnz, int64_t dim) { + // for best optimization, the following code is compiled with constant warpSize + assert(blockDim.x == warpSize); + + extern __shared__ int64_t buffer[]; + int64_t *col_ind_buf = buffer; + scalar_t *value_buf = reinterpret_cast(col_ind_buf + blockDim.y * warpSize); + col_ind_buf += threadIdx.y * warpSize; + value_buf += threadIdx.y * warpSize; + + int64_t row = blockIdx.x * blockDim.y + threadIdx.y; + if (row >= num_row) + return; + int64_t d_start = blockIdx.y * warpSize * kCoarseningFactor + threadIdx.x; + int64_t ptr_start = row_ptr[row]; + int64_t ptr_end = row + 1 < num_row ? row_ptr[row + 1] : nnz; + + for (int64_t block_ptr = ptr_start; block_ptr < ptr_end; block_ptr += warpSize) { + int64_t ptr = block_ptr + threadIdx.x; + if (ptr < ptr_end) { + col_ind_buf[threadIdx.x] = col_ind[ptr]; + value_buf[threadIdx.x] = value[ptr]; + } + __syncwarp(); + + int64_t max_offset = warpSize < ptr_end - block_ptr ? warpSize : ptr_end - block_ptr; + for (int64_t offset_ptr = 0; offset_ptr < max_offset; offset_ptr++) { + int64_t col = col_ind_buf[offset_ptr]; + scalar_t val = value_buf[offset_ptr]; +#pragma unroll + for (int64_t i = 0; i < kCoarseningFactor; i++) { + int64_t d = d_start + i * warpSize; + if (d >= dim) + break; + scalar_t in = input[col * dim + d]; + scalar_t out = output[row * dim + d]; + scalar_t out_grad = output_grad[row * dim + d]; + scalar_t x = BinaryOp::forward(val, in); + scalar_t dx_din = BinaryOp::backward_rhs(val, in); + scalar_t dout_dx = NaryOp::backward(out, x); + atomicAdd(&input_grad[col * dim + d], out_grad * dout_dx * dx_din); + } + } + __syncwarp(); + } +} + +template class NaryOp, template class BinaryOp> +Tensor spmm_forward_cuda(const SparseTensor &sparse, const Tensor &input_) { + constexpr const char *fn_name = "spmm_forward_cuda"; + TensorArg sparse_arg(sparse, "sparse", 1), input_arg(input_, "input", 2); + + spmm_forward_check(fn_name, sparse_arg, input_arg); + checkAllSameGPU(fn_name, {sparse_arg, input_arg}); + + const Tensor input = input_.contiguous(); + + int64_t nnz = sparse._nnz(); + int64_t dim = input.size(1); + int64_t num_row = sparse.size(0); + Tensor output = at::empty({num_row, dim}, input.options()); + + auto csr = coo2csr(sparse); + Tensor row_ptr = std::get<0>(csr); + Tensor col_ind = std::get<1>(csr); + Tensor value = std::get<2>(csr); + + cudaSetDevice(input.get_device()); + auto stream = at::cuda::getCurrentCUDAStream(); + + const int dim_per_block = 32; // warpSize + const int num_dim_block = (dim + dim_per_block * kCoarseningFactor - 1) / (dim_per_block * kCoarseningFactor); + const int row_per_block = kThreadPerBlock / dim_per_block; + const int num_row_block = (num_row + row_per_block - 1) / row_per_block; + + AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "spmm_forward_cuda", [&] { + const int memory_size = kThreadPerBlock * (sizeof(int64_t) + sizeof(scalar_t)); + spmm_forward_out_cuda, BinaryOp> + <<>>( + row_ptr.data_ptr(), + col_ind.data_ptr(), + value.data_ptr(), + input.data_ptr(), + output.data_ptr(), + num_row, nnz, dim + ); + }); + + return output; +} + +template class NaryOp, template class BinaryOp> +std::tuple spmm_backward_cuda( + const SparseTensor &sparse, const Tensor &input_, const Tensor &output_, const Tensor &output_grad_) { + constexpr const char *fn_name = "spmm_backward_cuda"; + TensorArg sparse_arg(sparse, "sparse", 1), input_arg(input_, "input", 2), output_arg(output_, "output", 3), + output_grad_arg(output_grad_, "output_grad", 4); + + spmm_backward_check(fn_name, sparse_arg, input_arg, output_arg, output_grad_arg); + checkAllSameGPU(fn_name, {sparse_arg, input_arg, output_arg, output_grad_arg}); + + const Tensor input = input_.contiguous(); + const Tensor output = output_.contiguous(); + const Tensor output_grad = output_grad_.contiguous(); + + int64_t nnz = sparse._nnz(); + int64_t dim = input.size(1); + int64_t num_row = sparse.size(0); + Tensor value_grad = at::zeros_like(sparse.values()); + Tensor input_grad = at::zeros_like(input); + SparseTensor sparse_grad = at::_sparse_coo_tensor_unsafe(sparse.indices(), value_grad, sparse.sizes()); + + auto csr = coo2csr(sparse); + Tensor row_ptr = std::get<0>(csr).contiguous(); + Tensor col_ind = std::get<1>(csr).contiguous(); + Tensor value = std::get<2>(csr).contiguous(); + + cudaSetDevice(input.get_device()); + auto stream = at::cuda::getCurrentCUDAStream(); + + const int dim_per_block = 32; // warpSize + const int num_dim_block = (dim + dim_per_block * kCoarseningFactor - 1) / (dim_per_block * kCoarseningFactor); + const int row_per_block = kThreadPerBlock / dim_per_block; + const int num_row_block = (num_row + row_per_block - 1) / row_per_block; + + if (sparse.requires_grad()) + AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "spmm_backward_cuda", [&] { + const int memory_size = kThreadPerBlock * (sizeof(int64_t) + sizeof(scalar_t)); + spmm_backward_out_cuda, BinaryOp> + <<>>( + row_ptr.data_ptr(), + col_ind.data_ptr(), + value.data_ptr(), + input.data_ptr(), + output.data_ptr(), + output_grad.data_ptr(), + value_grad.data_ptr(), + input_grad.data_ptr(), + num_row, nnz, dim + ); + }); + else + AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "spmm_backward_cuda", [&] { + const int memory_size = kThreadPerBlock * (sizeof(int64_t) + sizeof(scalar_t)); + spmm_backward_out_cuda, BinaryOp> + <<>>( + row_ptr.data_ptr(), + col_ind.data_ptr(), + value.data_ptr(), + input.data_ptr(), + output.data_ptr(), + output_grad.data_ptr(), + input_grad.data_ptr(), + num_row, nnz, dim + ); + }); + + return std::make_tuple(sparse_grad, input_grad); +} + +#define DECLARE_FORWARD_IMPL(ADD, MUL, NARYOP, BINARYOP) \ + Tensor spmm_##ADD##_##MUL##_forward_cuda(const SparseTensor &sparse, const Tensor &input) { \ + return spmm_forward_cuda(sparse, input); \ + } + +#define DECLARE_BACKWARD_IMPL(ADD, MUL, NARYOP, BINARYOP) \ + std::tuple spmm_##ADD##_##MUL##_backward_cuda( \ + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad) { \ + return spmm_backward_cuda(sparse, input, output, output_grad); \ + } + +DECLARE_FORWARD_IMPL(add, mul, NaryAdd, BinaryMul) +DECLARE_BACKWARD_IMPL(add, mul, NaryAdd, BinaryMul) + +DECLARE_FORWARD_IMPL(min, mul, NaryMin, BinaryMul) +DECLARE_BACKWARD_IMPL(min, mul, NaryMin, BinaryMul) + +DECLARE_FORWARD_IMPL(max, mul, NaryMax, BinaryMul) +DECLARE_BACKWARD_IMPL(max, mul, NaryMax, BinaryMul) + +DECLARE_FORWARD_IMPL(add, add, NaryAdd, BinaryAdd) +DECLARE_BACKWARD_IMPL(add, add, NaryAdd, BinaryAdd) + +DECLARE_FORWARD_IMPL(min, add, NaryMin, BinaryAdd) +DECLARE_BACKWARD_IMPL(min, add, NaryMin, BinaryAdd) + +DECLARE_FORWARD_IMPL(max, add, NaryMax, BinaryAdd) +DECLARE_BACKWARD_IMPL(max, add, NaryMax, BinaryAdd) + +} // namespace at \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/extension/spmm.h b/build/lib/torchdrug/layers/functional/extension/spmm.h new file mode 100644 index 00000000..905e7836 --- /dev/null +++ b/build/lib/torchdrug/layers/functional/extension/spmm.h @@ -0,0 +1,85 @@ +#pragma once + +#include + +#include +#include + +#include "rspmm.h" + +namespace at { + +using namespace at::sparse; + +void spmm_forward_check(CheckedFrom c, const TensorArg &sparse_arg, const TensorArg &input_arg); + +void spmm_backward_check(CheckedFrom c, const TensorArg &sparse_arg, const TensorArg &input_arg, + const TensorArg &output_arg, const TensorArg &output_grad_arg); + +std::tuple coo2csr(const SparseTensor &sparse); + +SparseTensor csr2coo(const Tensor &row_ptr_, const Tensor &col_ind, const Tensor &value, IntArrayRef size); + +Tensor spmm_add_mul_forward_cpu(const SparseTensor &sparse, const Tensor &input); + +std::tuple spmm_add_mul_backward_cpu( + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor spmm_min_mul_forward_cpu(const SparseTensor &sparse, const Tensor &input); + +std::tuple spmm_min_mul_backward_cpu( + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor spmm_max_mul_forward_cpu(const SparseTensor &sparse, const Tensor &input); + +std::tuple spmm_max_mul_backward_cpu( + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor spmm_add_add_forward_cpu(const SparseTensor &sparse, const Tensor &input); + +std::tuple spmm_add_add_backward_cpu( + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor spmm_min_add_forward_cpu(const SparseTensor &sparse, const Tensor &input); + +std::tuple spmm_min_add_backward_cpu( + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor spmm_max_add_forward_cpu(const SparseTensor &sparse, const Tensor &input); + +std::tuple spmm_max_add_backward_cpu( + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +#ifdef CUDA_OP +Tensor spmm_add_mul_forward_cuda(const SparseTensor &sparse, const Tensor &input); + +std::tuple spmm_add_mul_backward_cuda( + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor spmm_min_mul_forward_cuda(const SparseTensor &sparse, const Tensor &input); + +std::tuple spmm_min_mul_backward_cuda( + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor spmm_max_mul_forward_cuda(const SparseTensor &sparse, const Tensor &input); + +std::tuple spmm_max_mul_backward_cuda( + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor spmm_add_add_forward_cuda(const SparseTensor &sparse, const Tensor &input); + +std::tuple spmm_add_add_backward_cuda( + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor spmm_min_add_forward_cuda(const SparseTensor &sparse, const Tensor &input); + +std::tuple spmm_min_add_backward_cuda( + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad); + +Tensor spmm_max_add_forward_cuda(const SparseTensor &sparse, const Tensor &input); + +std::tuple spmm_max_add_backward_cuda( + const SparseTensor &sparse, const Tensor &input, const Tensor &output, const Tensor &output_grad); +#endif + +} // namespace at \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/extension/util.cuh b/build/lib/torchdrug/layers/functional/extension/util.cuh new file mode 100644 index 00000000..e014f2dc --- /dev/null +++ b/build/lib/torchdrug/layers/functional/extension/util.cuh @@ -0,0 +1,28 @@ +#pragma once + +namespace at { + +const unsigned kFullMask = 0xFFFFFFFF; + +template +__device__ scalar_t warp_reduce(scalar_t value) { +#pragma unroll + for (int delta = 1; delta < warpSize; delta *= 2) +#if __CUDACC_VER_MAJOR__ >= 9 + value += __shfl_down_sync(kFullMask, value, delta); +#else + value += __shfl_down(value, delta); +#endif + return value; +} + +template +__device__ scalar_t warp_broadcast(scalar_t value, int lane_id) { +#if __CUDACC_VER_MAJOR__ >= 9 + return __shfl_sync(kFullMask, value, lane_id); +#else + return __shfl(value, lane_id); +#endif +} + +} // namespace at \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/functional.py b/build/lib/torchdrug/layers/functional/functional.py new file mode 100644 index 00000000..bbb989cc --- /dev/null +++ b/build/lib/torchdrug/layers/functional/functional.py @@ -0,0 +1,529 @@ +import torch +from torch_scatter import scatter_add, scatter_mean, scatter_max +from torch_scatter.composite import scatter_log_softmax, scatter_softmax +from torch.nn import functional as F + + +def multinomial(input, num_sample, replacement=False): + """ + Fast multinomial sampling. This is the default implementation in PyTorch v1.6.0+. + + Parameters: + input (Tensor): unnormalized distribution + num_sample (int): number of samples + replacement (bool, optional): sample with replacement or not + """ + if replacement: + return torch.multinomial(input, num_sample, replacement) + + rand = torch.rand_like(input).log() / input + samples = rand.topk(num_sample).indices + return samples + + +def masked_mean(input, mask, dim=None, keepdim=False): + """ + Masked mean of a tensor. + + Parameters: + input (Tensor): input tensor + mask (BoolTensor): mask tensor + dim (int or tuple of int, optional): dimension to reduce + keepdim (bool, optional): whether retain ``dim`` or not + """ + input = input.masked_scatter(~mask, torch.zeros_like(input)) # safe with nan + if dim is None: + return input.sum() / mask.sum().clamp(1) + return input.sum(dim, keepdim=keepdim) / mask.sum(dim, keepdim=keepdim).clamp(1) + + +def mean_with_nan(input, dim=None, keepdim=False): + """ + Mean of a tensor. Ignore all nan values. + + Parameters: + input (Tensor): input tensor + dim (int or tuple of int, optional): dimension to reduce + keepdim (bool, optional): whether retain ``dim`` or not + """ + mask = ~torch.isnan(input) + return masked_mean(input, mask, dim, keepdim) + + +def shifted_softplus(input): + """ + Shifted softplus function. + + Parameters: + input (Tensor): input tensor + """ + return F.softplus(input) - F.softplus(torch.zeros(1, device=input.device)) + + +def multi_slice(starts, ends): + """ + Compute the union of indexes in multiple slices. + + Example:: + + >>> mask = multi_slice(torch.tensor([0, 1, 4]), torch.tensor([2, 3, 6]), 6) + >>> assert (mask == torch.tensor([0, 1, 2, 4, 5]).all() + + Parameters: + starts (LongTensor): start indexes of slices + ends (LongTensor): end indexes of slices + """ + values = torch.cat([torch.ones_like(starts), -torch.ones_like(ends)]) + slices = torch.cat([starts, ends]) + slices, order = slices.sort() + values = values[order] + depth = values.cumsum(0) + valid = ((values == 1) & (depth == 1)) | ((values == -1) & (depth == 0)) + slices = slices[valid] + + starts, ends = slices.view(-1, 2).t() + size = ends - starts + indexes = variadic_arange(size) + indexes = indexes + starts.repeat_interleave(size) + return indexes + + +def multi_slice_mask(starts, ends, length): + """ + Compute the union of multiple slices into a binary mask. + + Example:: + + >>> mask = multi_slice_mask(torch.tensor([0, 1, 4]), torch.tensor([2, 3, 6]), 6) + >>> assert (mask == torch.tensor([1, 1, 1, 0, 1, 1])).all() + + Parameters: + starts (LongTensor): start indexes of slices + ends (LongTensor): end indexes of slices + length (int): length of mask + """ + values = torch.cat([torch.ones_like(starts), -torch.ones_like(ends)]) + slices = torch.cat([starts, ends]) + if slices.numel(): + assert slices.min() >= 0 and slices.max() <= length + mask = scatter_add(values, slices, dim=0, dim_size=length + 1)[:-1] + mask = mask.cumsum(0).bool() + return mask + + +def as_mask(indexes, length): + """ + Convert indexes into a binary mask. + + Parameters: + indexes (LongTensor): positive indexes + length (int): maximal possible value of indexes + """ + mask = torch.zeros(length, dtype=torch.bool, device=indexes.device) + mask[indexes] = 1 + return mask + + +def _extend(data, size, input, input_size): + """ + Extend variadic-sized data with variadic-sized input. + This is a variadic variant of ``torch.cat([data, input], dim=-1)``. + + Example:: + + >>> data = torch.tensor([0, 1, 2, 3, 4]) + >>> size = torch.tensor([3, 2]) + >>> input = torch.tensor([-1, -2, -3]) + >>> input_size = torch.tensor([1, 2]) + >>> new_data, new_size = _extend(data, size, input, input_size) + >>> assert (new_data == torch.tensor([0, 1, 2, -1, 3, 4, -2, -3])).all() + >>> assert (new_size == torch.tensor([4, 4])).all() + + Parameters: + data (Tensor): variadic data + size (LongTensor): size of data + input (Tensor): variadic input + input_size (LongTensor): size of input + + Returns: + (Tensor, LongTensor): output data, output size + """ + new_size = size + input_size + new_cum_size = new_size.cumsum(0) + new_data = torch.zeros(new_cum_size[-1], *data.shape[1:], dtype=data.dtype, device=data.device) + starts = new_cum_size - new_size + ends = starts + size + index = multi_slice_mask(starts, ends, new_cum_size[-1]) + new_data[index] = data + new_data[~index] = input + return new_data, new_size + + +def variadic_sum(input, size): + """ + Compute sum over sets with variadic sizes. + + Suppose there are :math:`N` sets, and the sizes of all sets are summed to :math:`B`. + + Parameters: + input (Tensor): input of shape :math:`(B, ...)` + size (LongTensor): size of sets of shape :math:`(N,)` + """ + index2sample = torch.repeat_interleave(size) + index2sample = index2sample.view([-1] + [1] * (input.ndim - 1)) + index2sample = index2sample.expand_as(input) + + value = scatter_add(input, index2sample, dim=0) + return value + + +def variadic_mean(input, size): + """ + Compute mean over sets with variadic sizes. + + Suppose there are :math:`N` sets, and the sizes of all sets are summed to :math:`B`. + + Parameters: + input (Tensor): input of shape :math:`(B, ...)` + size (LongTensor): size of sets of shape :math:`(N,)` + """ + index2sample = torch.repeat_interleave(size) + index2sample = index2sample.view([-1] + [1] * (input.ndim - 1)) + index2sample = index2sample.expand_as(input) + + value = scatter_mean(input, index2sample, dim=0) + return value + + +def variadic_max(input, size): + """ + Compute max over sets with variadic sizes. + + Suppose there are :math:`N` sets, and the sizes of all sets are summed to :math:`B`. + + Parameters: + input (Tensor): input of shape :math:`(B, ...)` + size (LongTensor): size of sets of shape :math:`(N,)` + + Returns + (Tensor, LongTensor): max values and indexes + """ + index2sample = torch.repeat_interleave(size) + index2sample = index2sample.view([-1] + [1] * (input.ndim - 1)) + index2sample = index2sample.expand_as(input) + + value, index = scatter_max(input, index2sample, dim=0) + index = index + (size - size.cumsum(0)).view([-1] + [1] * (index.ndim - 1)) + return value, index + + +def variadic_log_softmax(input, size): + """ + Compute log softmax over categories with variadic sizes. + + Suppose there are :math:`N` samples, and the numbers of categories in all samples are summed to :math:`B`. + + Parameters: + input (Tensor): input of shape :math:`(B, ...)` + size (LongTensor): number of categories of shape :math:`(N,)` + """ + index2sample = torch.repeat_interleave(size) + index2sample = index2sample.view([-1] + [1] * (input.ndim - 1)) + index2sample = index2sample.expand_as(input) + + log_likelihood = scatter_log_softmax(input, index2sample, dim=0) + return log_likelihood + + +def variadic_softmax(input, size): + """ + Compute softmax over categories with variadic sizes. + + Suppose there are :math:`N` samples, and the numbers of categories in all samples are summed to :math:`B`. + + Parameters: + input (Tensor): input of shape :math:`(B, ...)` + size (LongTensor): number of categories of shape :math:`(N,)` + """ + index2sample = torch.repeat_interleave(size) + index2sample = index2sample.view([-1] + [1] * (input.ndim - 1)) + index2sample = index2sample.expand_as(input) + + log_likelihood = scatter_softmax(input, index2sample, dim=0) + return log_likelihood + + +def variadic_cross_entropy(input, target, size, reduction="mean"): + """ + Compute cross entropy loss over categories with variadic sizes. + + Suppose there are :math:`N` samples, and the numbers of categories in all samples are summed to :math:`B`. + + Parameters: + input (Tensor): prediction of shape :math:`(B, ...)` + target (Tensor): target of shape :math:`(N, ...)`. Each target is a relative index in a sample. + size (LongTensor): number of categories of shape :math:`(N,)` + reduction (string, optional): reduction to apply to the output. + Available reductions are ``none``, ``sum`` and ``mean``. + """ + index2sample = torch.repeat_interleave(size) + index2sample = index2sample.view([-1] + [1] * (input.ndim - 1)) + index2sample = index2sample.expand_as(input) + + log_likelihood = scatter_log_softmax(input, index2sample, dim=0) + size = size.view([-1] + [1] * (input.ndim - 1)) + assert (target >= 0).all() and (target < size).all() + target_index = target + size.cumsum(0) - size + loss = -log_likelihood.gather(0, target_index) + if reduction == "mean": + return loss.mean() + elif reduction == "sum": + return loss.sum() + elif reduction == "none": + return loss + else: + raise ValueError("Unknown reduction `%s`" % reduction) + + +def variadic_topk(input, size, k, largest=True): + """ + Compute the :math:`k` largest elements over sets with variadic sizes. + + Suppose there are :math:`N` sets, and the sizes of all sets are summed to :math:`B`. + + If any set has less than than :math:`k` elements, the size-th largest element will be + repeated to pad the output to :math:`k`. + + Parameters: + input (Tensor): input of shape :math:`(B, ...)` + size (LongTensor): size of sets of shape :math:`(N,)` + k (int or LongTensor): the k in "top-k". Can be a fixed value for all sets, + or different values for different sets of shape :math:`(N,)`. + largest (bool, optional): return largest or smallest elements + + Returns + (Tensor, LongTensor): top-k values and indexes + """ + index2graph = torch.repeat_interleave(size) + index2graph = index2graph.view([-1] + [1] * (input.ndim - 1)) + + mask = ~torch.isinf(input) + max = input[mask].max().item() + min = input[mask].min().item() + abs_max = input[mask].abs().max().item() + # special case: max = min + gap = max - min + abs_max * 1e-6 + safe_input = input.clamp(min - gap, max + gap) + offset = gap * 4 + if largest: + offset = -offset + input_ext = safe_input + offset * index2graph + index_ext = input_ext.argsort(dim=0, descending=largest) + if isinstance(k, torch.Tensor) and k.shape == size.shape: + num_actual = torch.min(size, k) + else: + num_actual = size.clamp(max=k) + num_padding = k - num_actual + starts = size.cumsum(0) - size + ends = starts + num_actual + mask = multi_slice_mask(starts, ends, len(index_ext)).nonzero().flatten() + + if (num_padding > 0).any(): + # special case: size < k, pad with the last valid index + padding = ends - 1 + padding2graph = torch.repeat_interleave(num_padding) + mask = _extend(mask, num_actual, padding[padding2graph], num_padding)[0] + + index = index_ext[mask] # (N * k, ...) + value = input.gather(0, index) + if isinstance(k, torch.Tensor) and k.shape == size.shape: + value = value.view(-1, *input.shape[1:]) + index = index.view(-1, *input.shape[1:]) + index = index - (size.cumsum(0) - size).repeat_interleave(k).view([-1] + [1] * (index.ndim - 1)) + else: + value = value.view(-1, k, *input.shape[1:]) + index = index.view(-1, k, *input.shape[1:]) + index = index - (size.cumsum(0) - size).view([-1] + [1] * (index.ndim - 1)) + + return value, index + + +def variadic_sort(input, size, descending=False): + """ + Sort elements in sets with variadic sizes. + + Suppose there are :math:`N` sets, and the sizes of all sets are summed to :math:`B`. + + Parameters: + input (Tensor): input of shape :math:`(B, ...)` + size (LongTensor): size of sets of shape :math:`(N,)` + descending (bool, optional): return ascending or descending order + + Returns + (Tensor, LongTensor): sorted values and indexes + """ + index2sample = torch.repeat_interleave(size) + index2sample = index2sample.view([-1] + [1] * (input.ndim - 1)) + + mask = ~torch.isinf(input) + max = input[mask].max().item() + min = input[mask].min().item() + abs_max = input[mask].abs().max().item() + # special case: max = min + gap = max - min + abs_max * 1e-6 + safe_input = input.clamp(min - gap, max + gap) + offset = gap * 4 + if descending: + offset = -offset + input_ext = safe_input + offset * index2sample + index = input_ext.argsort(dim=0, descending=descending) + value = input.gather(0, index) + index = index - (size.cumsum(0) - size)[index2sample] + return value, index + + +def variadic_arange(size): + """ + Return a 1-D tensor that contains integer intervals of variadic sizes. + This is a variadic variant of ``torch.arange(stop).expand(batch_size, -1)``. + + Suppose there are :math:`N` intervals. + + Parameters: + size (LongTensor): size of intervals of shape :math:`(N,)` + """ + starts = size.cumsum(0) - size + + range = torch.arange(size.sum(), device=size.device) + range = range - starts.repeat_interleave(size) + return range + + +def variadic_randperm(size): + """ + Return random permutations for sets with variadic sizes. + The ``i``-th permutation contains integers from 0 to ``size[i] - 1``. + + Suppose there are :math:`N` sets. + + Parameters: + size (LongTensor): size of sets of shape :math:`(N,)` + device (torch.device, optional): device of the tensor + """ + rand = torch.rand(size.sum(), device=size.device) + perm = variadic_sort(rand, size)[1] + return perm + + +def variadic_sample(input, size, num_sample): + """ + Draw samples with replacement from sets with variadic sizes. + + Suppose there are :math:`N` sets, and the sizes of all sets are summed to :math:`B`. + + Parameters: + input (Tensor): input of shape :math:`(B, ...)` + size (LongTensor): size of sets of shape :math:`(N,)` + num_sample (int): number of samples to draw from each set + """ + rand = torch.rand(len(size), num_sample, device=size.device) + index = (rand * size.unsqueeze(-1)).long() + index = index + (size.cumsum(0) - size).unsqueeze(-1) + sample = input[index] + return sample + + +def variadic_meshgrid(input1, size1, input2, size2): + """ + Compute the Cartesian product for two batches of sets with variadic sizes. + + Suppose there are :math:`N` sets in each input, + and the sizes of all sets are summed to :math:`B_1` and :math:`B_2` respectively. + + Parameters: + input1 (Tensor): input of shape :math:`(B_1, ...)` + size1 (LongTensor): size of :attr:`input1` of shape :math:`(N,)` + input2 (Tensor): input of shape :math:`(B_2, ...)` + size2 (LongTensor): size of :attr:`input2` of shape :math:`(N,)` + + Returns + (Tensor, Tensor): the first and the second elements in the Cartesian product + """ + grid_size = size1 * size2 + local_index = variadic_arange(grid_size) + local_inner_size = size2.repeat_interleave(grid_size) + offset1 = (size1.cumsum(0) - size1).repeat_interleave(grid_size) + offset2 = (size2.cumsum(0) - size2).repeat_interleave(grid_size) + index1 = torch.div(local_index, local_inner_size, rounding_mode="floor") + offset1 + index2 = local_index % local_inner_size + offset2 + return input1[index1], input2[index2] + + +def variadic_to_padded(input, size, value=0): + """ + Convert a variadic tensor to a padded tensor. + + Suppose there are :math:`N` sets, and the sizes of all sets are summed to :math:`B`. + + Parameters: + input (Tensor): input of shape :math:`(B, ...)` + size (LongTensor): size of sets of shape :math:`(N,)` + value (scalar): fill value for padding + + Returns: + (Tensor, BoolTensor): padded tensor and mask + """ + num_sample = len(size) + max_size = size.max() + starts = torch.arange(num_sample, device=size.device) * max_size + ends = starts + size + mask = multi_slice_mask(starts, ends, num_sample * max_size) + mask = mask.view(num_sample, max_size) + shape = (num_sample, max_size) + input.shape[1:] + padded = torch.full(shape, value, dtype=input.dtype, device=size.device) + padded[mask] = input + return padded, mask + + +def padded_to_variadic(padded, size): + """ + Convert a padded tensor to a variadic tensor. + + Parameters: + padded (Tensor): padded tensor of shape :math:`(N, ...)` + size (LongTensor): size of sets of shape :math:`(N,)` + """ + num_sample, max_size = padded.shape[:2] + starts = torch.arange(num_sample, device=size.device) * max_size + ends = starts + size + mask = multi_slice_mask(starts, ends, num_sample * max_size) + mask = mask.view(num_sample, max_size) + return padded[mask] + + +def one_hot(index, size): + """ + Expand indexes into one-hot vectors. + + Parameters: + index (Tensor): index + size (int): size of the one-hot dimension + """ + shape = list(index.shape) + [size] + result = torch.zeros(shape, device=index.device) + if index.numel(): + assert index.min() >= 0 + assert index.max() < size + result.scatter_(-1, index.unsqueeze(-1), 1) + return result + + +def clipped_policy_gradient_objective(policy, agent, reward, eps=0.2): + ratio = (policy - agent.detach()).exp() + ratio = ratio.clamp(-10, 10) + objective = torch.min(ratio * reward, ratio.clamp(1 - eps, 1 + eps) * reward) + return objective + + +def policy_gradient_objective(policy, reward): + return policy * reward \ No newline at end of file diff --git a/build/lib/torchdrug/layers/functional/spmm.py b/build/lib/torchdrug/layers/functional/spmm.py new file mode 100644 index 00000000..18dc29bb --- /dev/null +++ b/build/lib/torchdrug/layers/functional/spmm.py @@ -0,0 +1,378 @@ +import os +import sys + +import torch +from torch import autograd + +from torchdrug import utils + +module = sys.modules[__name__] + +path = os.path.join(os.path.dirname(__file__), "extension") +spmm = utils.load_extension("spmm", [os.path.join(path, "spmm.cpp"), os.path.join(path, "rspmm.cpp"), + os.path.join(path, "spmm.cu"), os.path.join(path, "rspmm.cu")]) + + +class SPMMAddMulFunction(autograd.Function): + + @staticmethod + def forward(ctx, sparse, input): + assert sparse.is_coalesced() + if input.device.type == "cuda": + forward = spmm.spmm_add_mul_forward_cuda + else: + forward = spmm.spmm_add_mul_forward_cpu + output = forward(sparse, input) + ctx.save_for_backward(sparse, input, output) + return output + + @staticmethod + def backward(ctx, output_grad): + if output_grad.device.type == "cuda": + backward = spmm.spmm_add_mul_backward_cuda + else: + backward = spmm.spmm_add_mul_backward_cpu + sparse_grad, input_grad = backward(*ctx.saved_tensors, output_grad) + if not ctx.saved_tensors[0].requires_grad: + sparse_grad = None + return sparse_grad, input_grad + + +class SPMMMinMulFunction(autograd.Function): + + @staticmethod + def forward(ctx, sparse, input): + assert sparse.is_coalesced() + if input.device.type == "cuda": + forward = spmm.spmm_min_mul_forward_cuda + else: + forward = spmm.spmm_min_mul_forward_cpu + output = forward(sparse, input) + ctx.save_for_backward(sparse, input, output) + return output + + @staticmethod + def backward(ctx, output_grad): + if output_grad.device.type == "cuda": + backward = spmm.spmm_min_mul_backward_cuda + else: + backward = spmm.spmm_min_mul_backward_cpu + sparse_grad, input_grad = backward(*ctx.saved_tensors, output_grad) + if not ctx.saved_tensors[0].requires_grad: + sparse_grad = None + return sparse_grad, input_grad + + +class SPMMMaxMulFunction(autograd.Function): + + @staticmethod + def forward(ctx, sparse, input): + assert sparse.is_coalesced() + if input.device.type == "cuda": + forward = spmm.spmm_max_mul_forward_cuda + else: + forward = spmm.spmm_max_mul_forward_cpu + output = forward(sparse, input) + ctx.save_for_backward(sparse, input, output) + return output + + @staticmethod + def backward(ctx, output_grad): + if output_grad.device.type == "cuda": + backward = spmm.spmm_max_mul_backward_cuda + else: + backward = spmm.spmm_max_mul_backward_cpu + sparse_grad, input_grad = backward(*ctx.saved_tensors, output_grad) + if not ctx.saved_tensors[0].requires_grad: + sparse_grad = None + return sparse_grad, input_grad + + +class SPMMAddAddFunction(autograd.Function): + + @staticmethod + def forward(ctx, sparse, input): + assert sparse.is_coalesced() + if input.device.type == "cuda": + forward = spmm.spmm_add_add_forward_cuda + else: + forward = spmm.spmm_add_add_forward_cpu + output = forward(sparse, input) + ctx.save_for_backward(sparse, input, output) + return output + + @staticmethod + def backward(ctx, output_grad): + if output_grad.device.type == "cuda": + backward = spmm.spmm_add_add_backward_cuda + else: + backward = spmm.spmm_add_add_backward_cpu + sparse_grad, input_grad = backward(*ctx.saved_tensors, output_grad) + if not ctx.saved_tensors[0].requires_grad: + sparse_grad = None + return sparse_grad, input_grad + + +class SPMMMinAddFunction(autograd.Function): + + @staticmethod + def forward(ctx, sparse, input): + assert sparse.is_coalesced() + if input.device.type == "cuda": + forward = spmm.spmm_min_add_forward_cuda + else: + forward = spmm.spmm_min_add_forward_cpu + output = forward(sparse, input) + ctx.save_for_backward(sparse, input, output) + return output + + @staticmethod + def backward(ctx, output_grad): + if output_grad.device.type == "cuda": + backward = spmm.spmm_min_add_backward_cuda + else: + backward = spmm.spmm_min_add_backward_cpu + sparse_grad, input_grad = backward(*ctx.saved_tensors, output_grad) + if not ctx.saved_tensors[0].requires_grad: + sparse_grad = None + return sparse_grad, input_grad + + +class SPMMMaxAddFunction(autograd.Function): + + @staticmethod + def forward(ctx, sparse, input): + assert sparse.is_coalesced() + if input.device.type == "cuda": + forward = spmm.spmm_max_add_forward_cuda + else: + forward = spmm.spmm_max_add_forward_cpu + output = forward(sparse, input) + ctx.save_for_backward(sparse, input, output) + return output + + @staticmethod + def backward(ctx, output_grad): + if output_grad.device.type == "cuda": + backward = spmm.spmm_max_add_backward_cuda + else: + backward = spmm.spmm_max_add_backward_cpu + sparse_grad, input_grad = backward(*ctx.saved_tensors, output_grad) + if not ctx.saved_tensors[0].requires_grad: + sparse_grad = None + return sparse_grad, input_grad + + +class RSPMMAddMulFunction(autograd.Function): + + @staticmethod + def forward(ctx, sparse, relation, input): + assert sparse.is_coalesced() + if input.device.type == "cuda": + forward = spmm.rspmm_add_mul_forward_cuda + else: + forward = spmm.rspmm_add_mul_forward_cpu + output = forward(sparse, relation, input) + ctx.save_for_backward(sparse, relation, input, output) + return output + + @staticmethod + def backward(ctx, output_grad): + if output_grad.device.type == "cuda": + backward = spmm.rspmm_add_mul_backward_cuda + else: + backward = spmm.rspmm_add_mul_backward_cpu + sparse_grad, relation_grad, input_grad = backward(*ctx.saved_tensors, output_grad) + if not ctx.saved_tensors[0].requires_grad: + sparse_grad = None + return sparse_grad, relation_grad, input_grad + + +class RSPMMMinMulFunction(autograd.Function): + + @staticmethod + def forward(ctx, sparse, relation, input): + assert sparse.is_coalesced() + if input.device.type == "cuda": + forward = spmm.rspmm_min_mul_forward_cuda + else: + forward = spmm.rspmm_min_mul_forward_cpu + output = forward(sparse, relation, input) + ctx.save_for_backward(sparse, relation, input, output) + return output + + @staticmethod + def backward(ctx, output_grad): + if output_grad.device.type == "cuda": + backward = spmm.rspmm_min_mul_backward_cuda + else: + backward = spmm.rspmm_min_mul_backward_cpu + sparse_grad, relation_grad, input_grad = backward(*ctx.saved_tensors, output_grad) + if not ctx.saved_tensors[0].requires_grad: + sparse_grad = None + return sparse_grad, relation_grad, input_grad + + +class RSPMMMaxMulFunction(autograd.Function): + + @staticmethod + def forward(ctx, sparse, relation, input): + assert sparse.is_coalesced() + if input.device.type == "cuda": + forward = spmm.rspmm_max_mul_forward_cuda + else: + forward = spmm.rspmm_max_mul_forward_cpu + output = forward(sparse, relation, input) + ctx.save_for_backward(sparse, relation, input, output) + return output + + @staticmethod + def backward(ctx, output_grad): + if output_grad.device.type == "cuda": + backward = spmm.rspmm_max_mul_backward_cuda + else: + backward = spmm.rspmm_max_mul_backward_cpu + sparse_grad, relation_grad, input_grad = backward(*ctx.saved_tensors, output_grad) + if not ctx.saved_tensors[0].requires_grad: + sparse_grad = None + return sparse_grad, relation_grad, input_grad + + +class RSPMMAddAddFunction(autograd.Function): + + @staticmethod + def forward(ctx, sparse, relation, input): + assert sparse.is_coalesced() + if input.device.type == "cuda": + forward = spmm.rspmm_add_add_forward_cuda + else: + forward = spmm.rspmm_add_add_forward_cpu + output = forward(sparse, relation, input) + ctx.save_for_backward(sparse, relation, input, output) + return output + + @staticmethod + def backward(ctx, output_grad): + if output_grad.device.type == "cuda": + backward = spmm.rspmm_add_add_backward_cuda + else: + backward = spmm.rspmm_add_add_backward_cpu + sparse_grad, relation_grad, input_grad = backward(*ctx.saved_tensors, output_grad) + if not ctx.saved_tensors[0].requires_grad: + sparse_grad = None + return sparse_grad, relation_grad, input_grad + + +class RSPMMMinAddFunction(autograd.Function): + + @staticmethod + def forward(ctx, sparse, relation, input): + assert sparse.is_coalesced() + if input.device.type == "cuda": + forward = spmm.rspmm_min_add_forward_cuda + else: + forward = spmm.rspmm_min_add_forward_cpu + output = forward(sparse, relation, input) + ctx.save_for_backward(sparse, relation, input, output) + return output + + @staticmethod + def backward(ctx, output_grad): + if output_grad.device.type == "cuda": + backward = spmm.rspmm_min_add_backward_cuda + else: + backward = spmm.rspmm_min_add_backward_cpu + sparse_grad, relation_grad, input_grad = backward(*ctx.saved_tensors, output_grad) + if not ctx.saved_tensors[0].requires_grad: + sparse_grad = None + return sparse_grad, relation_grad, input_grad + + +class RSPMMMaxAddFunction(autograd.Function): + + @staticmethod + def forward(ctx, sparse, relation, input): + assert sparse.is_coalesced() + if input.device.type == "cuda": + forward = spmm.rspmm_max_add_forward_cuda + else: + forward = spmm.rspmm_max_add_forward_cpu + output = forward(sparse, relation, input) + ctx.save_for_backward(sparse, relation, input, output) + return output + + @staticmethod + def backward(ctx, output_grad): + if output_grad.device.type == "cuda": + backward = spmm.rspmm_max_add_backward_cuda + else: + backward = spmm.rspmm_max_add_backward_cpu + sparse_grad, relation_grad, input_grad = backward(*ctx.saved_tensors, output_grad) + if not ctx.saved_tensors[0].requires_grad: + sparse_grad = None + return sparse_grad, relation_grad, input_grad + + +def generalized_spmm(sparse, input, sum="add", mul="mul"): + r""" + Generalized sparse-dense matrix multiplication. + + This function computes the matrix multiplication of a sparse matrix and a dense input matrix. + The output dense matrix satisfies + + .. math:: + + output_{i,k} = \bigoplus_{j: sparse_{i,j} \neq 0} sparse_{i,j} \otimes input_{j,k} + + where :math:`\oplus` and :math:`\otimes` are the summation and the multiplication operators respectively. + + .. warning:: + + Gradient w.r.t. the sparse matrix is only computed for non-zero entries of the sparse matrix. + This behaves differently from dense-dense matrix multiplication with zero entries. + + Parameters: + sparse (SparseTensor): 2D sparse tensor + input (Tensor): 2D dense tensor + sum (str, optional): generalized summation operator. Available operators are ``add``, ``min`` and ``max``. + mul (str, optional): generalized multiplication operator. Available operators are ``add`` and ``mul``. + """ + name = "SPMM%s%sFunction" % (sum.capitalize(), mul.capitalize()) + if not hasattr(module, name): + raise ValueError("No generalized spmm implementation found for summation `%s` and multiplication `%s`" + % (sum, mul)) + Function = getattr(module, name) + return Function.apply(sparse.coalesce(), input) + + +def generalized_rspmm(sparse, relation, input, sum="add", mul="mul"): + r""" + Generalized relational sparse-dense matrix multiplication. + + This function computes the matrix multiplication of a sparse matrix, a dense relation matrix and + a dense input matrix. The output dense matrix satisfies + + .. math:: + + output_{i,l} = \bigoplus_{j,k: sparse_{i,j,k} \neq 0} sparse_{i, j, k} \times (relation_{k,l} \otimes input_{j,l}) + + where :math:`\oplus` and :math:`\otimes` are the summation and the multiplication operators respectively. + + .. warning:: + + Gradient w.r.t. the sparse matrix is only computed for non-zero entries of the sparse matrix. + This behaves differently from dense-dense matrix multiplication with zero entries. + + Parameters: + sparse (SparseTensor): 3D sparse tensor + relation (Tensor): 2D dense tensor + input (Tensor): 2D dense tensor + sum (str, optional): generalized summation operator. Available operators are ``add``, ``min`` and ``max``. + mul (str, optional): generalized multiplication operator. Available operators are ``add`` and ``mul``. + """ + name = "RSPMM%s%sFunction" % (sum.capitalize(), mul.capitalize()) + if not hasattr(module, name): + raise ValueError("No generalized rspmm implementation found for summation `%s` and multiplication `%s`" + % (sum, mul)) + Function = getattr(module, name) + return Function.apply(sparse.coalesce(), relation, input) \ No newline at end of file diff --git a/build/lib/torchdrug/layers/geometry/__init__.py b/build/lib/torchdrug/layers/geometry/__init__.py new file mode 100644 index 00000000..e1e851a9 --- /dev/null +++ b/build/lib/torchdrug/layers/geometry/__init__.py @@ -0,0 +1,9 @@ +from .graph import GraphConstruction, SpatialLineGraph +from .function import BondEdge, KNNEdge, SpatialEdge, SequentialEdge, AlphaCarbonNode, \ + IdentityNode, RandomEdgeMask, SubsequenceNode, SubspaceNode + +__all__ = [ + "GraphConstruction", "SpatialLineGraph", + "BondEdge", "KNNEdge", "SpatialEdge", "SequentialEdge", "AlphaCarbonNode", + "IdentityNode", "RandomEdgeMask", "SubsequenceNode", "SubspaceNode" +] \ No newline at end of file diff --git a/build/lib/torchdrug/layers/geometry/function.py b/build/lib/torchdrug/layers/geometry/function.py new file mode 100644 index 00000000..22fc10e5 --- /dev/null +++ b/build/lib/torchdrug/layers/geometry/function.py @@ -0,0 +1,343 @@ +import torch +from torch import nn +from torch_cluster import knn_graph, radius_graph + +from torchdrug import core, data +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("layers.geometry.BondEdge") +class BondEdge(nn.Module, core.Configurable): + """ + Construct all bond edges. + """ + + def forward(self, graph): + """ + Return bond edges from the input graph. Edge types are inherited from the input graph. + + Parameters: + graph (Graph): :math:`n` graph(s) + + Returns: + (Tensor, int): edge list of shape :math:`(|E|, 3)`, number of relations + """ + return graph.edge_list, graph.num_relation + + +@R.register("layers.geometry.KNNEdge") +class KNNEdge(nn.Module, core.Configurable): + """ + Construct edges between each node and its nearest neighbors. + + Parameters: + k (int, optional): number of neighbors + min_distance (int, optional): minimum distance between the residues of two nodes + """ + + eps = 1e-10 + + def __init__(self, k=10, min_distance=5, max_distance=None): + super(KNNEdge, self).__init__() + self.k = k + self.min_distance = min_distance + self.max_distance = max_distance + + def forward(self, graph): + """ + Return KNN edges constructed from the input graph. + + Parameters: + graph (Graph): :math:`n` graph(s) + + Returns: + (Tensor, int): edge list of shape :math:`(|E|, 3)`, number of relations + """ + edge_list = knn_graph(graph.node_position, k=self.k, batch=graph.node2graph).t() + relation = torch.zeros(len(edge_list), 1, dtype=torch.long, device=graph.device) + edge_list = torch.cat([edge_list, relation], dim=-1) + + if self.min_distance > 0: + node_in, node_out = edge_list.t()[:2] + mask = (graph.atom2residue[node_in] - graph.atom2residue[node_out]).abs() < self.min_distance + edge_list = edge_list[~mask] + + if self.max_distance: + node_in, node_out = edge_list.t()[:2] + mask = (graph.atom2residue[node_in] - graph.atom2residue[node_out]).abs() > self.max_distance + edge_list = edge_list[~mask] + + node_in, node_out = edge_list.t()[:2] + mask = (graph.node_position[node_in] - graph.node_position[node_out]).norm(dim=-1) < self.eps + edge_list = edge_list[~mask] + + return edge_list, 1 + + +@R.register("layers.geometry.SpatialEdge") +class SpatialEdge(nn.Module, core.Configurable): + """ + Construct edges between nodes within a specified radius. + + Parameters: + radius (float, optional): spatial radius + min_distance (int, optional): minimum distance between the residues of two nodes + """ + + eps = 1e-10 + + def __init__(self, radius=5, min_distance=5, max_distance=None, max_num_neighbors=32): + super(SpatialEdge, self).__init__() + self.radius = radius + self.min_distance = min_distance + self.max_distance = max_distance + self.max_num_neighbors = max_num_neighbors + + def forward(self, graph): + """ + Return spatial radius edges constructed based on the input graph. + + Parameters: + graph (Graph): :math:`n` graph(s) + + Returns: + (Tensor, int): edge list of shape :math:`(|E|, 3)`, number of relations + """ + edge_list = radius_graph(graph.node_position, r=self.radius, batch=graph.node2graph, max_num_neighbors=self.max_num_neighbors).t() + relation = torch.zeros(len(edge_list), 1, dtype=torch.long, device=graph.device) + edge_list = torch.cat([edge_list, relation], dim=-1) + + if self.min_distance > 0: + node_in, node_out = edge_list.t()[:2] + mask = (graph.atom2residue[node_in] - graph.atom2residue[node_out]).abs() < self.min_distance + edge_list = edge_list[~mask] + + if self.max_distance: + node_in, node_out = edge_list.t()[:2] + mask = (graph.atom2residue[node_in] - graph.atom2residue[node_out]).abs() > self.max_distance + edge_list = edge_list[~mask] + + node_in, node_out = edge_list.t()[:2] + mask = (graph.node_position[node_in] - graph.node_position[node_out]).norm(dim=-1) < self.eps + edge_list = edge_list[~mask] + + return edge_list, 1 + + +@R.register("layers.geometry.SequentialEdge") +class SequentialEdge(nn.Module, core.Configurable): + """ + Construct edges between atoms within close residues. + + Parameters: + max_distance (int, optional): maximum distance between two residues in the sequence + """ + + def __init__(self, max_distance=2, only_backbone=False): + super(SequentialEdge, self).__init__() + self.max_distance = max_distance + self.only_backbone = only_backbone + + def forward(self, graph): + """ + Return sequential edges constructed based on the input graph. + Edge types are defined by the relative distance between two residues in the sequence + + Parameters: + graph (Graph): :math:`n` graph(s) + + Returns: + (Tensor, int): edge list of shape :math:`(|E|, 3)`, number of relations + """ + if self.only_backbone: + is_backbone = (graph.atom_name == graph.atom_name2id["CA"]) \ + | (graph.atom_name == graph.atom_name2id["C"]) \ + | (graph.atom_name == graph.atom_name2id["N"]) + atom2residue = graph.atom2residue[is_backbone] + else: + atom2residue = graph.atom2residue + residue2num_atom = atom2residue.bincount(minlength=graph.num_residue) + edge_list = [] + for i in range(-self.max_distance, self.max_distance + 1): + node_index = torch.arange(graph.num_node, device=graph.device) + residue_index = torch.arange(graph.num_residue, device=graph.device) + if i > 0: + is_node_in = graph.atom2residue < graph.num_cum_residues[graph.atom2graph] - i + is_node_out = graph.atom2residue >= (graph.num_cum_residues - graph.num_residues)[graph.atom2graph] + i + is_residue_in = residue_index < graph.num_cum_residues[graph.residue2graph] - i + is_residue_out = residue_index >= (graph.num_cum_residues - graph.num_residues)[graph.residue2graph] + i + else: + is_node_in = graph.atom2residue >= (graph.num_cum_residues - graph.num_residues)[graph.atom2graph] - i + is_node_out = graph.atom2residue < graph.num_cum_residues[graph.atom2graph] + i + is_residue_in = residue_index >= (graph.num_cum_residues - graph.num_residues)[graph.residue2graph] - i + is_residue_out = residue_index < graph.num_cum_residues[graph.residue2graph] + i + if self.only_backbone: + is_node_in = is_node_in & is_backbone + is_node_out = is_node_out & is_backbone + node_in = node_index[is_node_in] + node_out = node_index[is_node_out] + # group atoms by residue ids + node_in = node_in[graph.atom2residue[node_in].argsort()] + node_out = node_out[graph.atom2residue[node_out].argsort()] + num_node_in = residue2num_atom[is_residue_in] + num_node_out = residue2num_atom[is_residue_out] + node_in, node_out = functional.variadic_meshgrid(node_in, num_node_in, node_out, num_node_out) + # exclude cross-chain edges + is_same_chain = (graph.chain_id[graph.atom2residue[node_in]] == graph.chain_id[graph.atom2residue[node_out]]) + node_in = node_in[is_same_chain] + node_out = node_out[is_same_chain] + relation = torch.ones(len(node_in), dtype=torch.long, device=graph.device) * (i + self.max_distance) + edges = torch.stack([node_in, node_out, relation], dim=-1) + edge_list.append(edges) + + edge_list = torch.cat(edge_list) + + return edge_list, 2 * self.max_distance + 1 + + +@R.register("layers.geometry.AlphaCarbonNode") +class AlphaCarbonNode(nn.Module, core.Configurable): + """ + Construct only alpha carbon atoms. + """ + + def forward(self, graph): + """ + Return a subgraph that only consists of alpha carbon nodes. + + Parameters: + graph (Graph): :math:`n` graph(s) + """ + mask = (graph.atom_name == data.Protein.atom_name2id["CA"]) & (graph.atom2residue != -1) + residue2num_atom = graph.atom2residue[mask].bincount(minlength=graph.num_residue) + residue_mask = residue2num_atom > 0 + mask = mask & residue_mask[graph.atom2residue] + graph = graph.subgraph(mask).subresidue(residue_mask) + assert (graph.num_node == graph.num_residue).all() + + return graph + + +@R.register("layers.geometry.IdentityNode") +class IdentityNode(nn.Module, core.Configurable): + """ + Construct all nodes as the input. + """ + + def forward(self, graph): + """ + Return the input graph as is. + + Parameters: + graph (Graph): :math:`n` graph(s) + """ + return graph + + +@R.register("layers.geometry.RandomEdgeMask") +class RandomEdgeMask(nn.Module, core.Configurable): + """ + Construct nodes by random edge masking. + + Parameters: + mask_rate (float, optional): rate of masked edges + """ + + def __init__(self, mask_rate=0.15): + super(RandomEdgeMask, self).__init__() + self.mask_rate = mask_rate + + def forward(self, graph): + """ + Return a graph with some edges masked out. + + Parameters: + graph (Graph): :math:`n` graph(s) + """ + num_samples = (graph.num_edges * self.mask_rate).long().clamp(min=1) + num_sample = num_samples.sum() + sample2graph = torch.repeat_interleave(num_samples) + edge_index = (torch.rand(num_sample, device=graph.device) * graph.num_edges[sample2graph]).long() + edge_index = edge_index + (graph.num_cum_edges - graph.num_edges)[sample2graph] + edge_mask = ~functional.as_mask(edge_index, graph.num_edge) + + return graph.edge_mask(edge_mask) + + +@R.register("layers.geometry.SubsequenceNode") +class SubsequenceNode(nn.Module, core.Configurable): + """ + Construct nodes by taking a random subsequence of the original graph. + + Parameters: + max_length (int, optional): maximal length of the sequence after cropping + """ + + def __init__(self, max_length=100): + super(SubsequenceNode, self).__init__() + self.max_length = max_length + + def forward(self, graph): + """ + Randomly take a subsequence of the specified length. + Return the full sequence if the sequence is shorter than the specified length. + + Parameters: + graph (Graph): :math:`n` graph(s) + """ + starts = (torch.rand(graph.batch_size, device=graph.device) * + (graph.num_residues - self.max_length).clamp(min=0)).long() + ends = torch.min(starts + self.max_length, graph.num_residues) + starts = starts + graph.num_cum_residues - graph.num_residues + ends = ends + graph.num_cum_residues - graph.num_residues + + residue_mask = functional.multi_slice_mask(starts, ends, graph.num_residue) + graph = graph.subresidue(residue_mask) + + return graph + + +@R.register("layers.geometry.SubspaceNode") +class SubspaceNode(nn.Module, core.Configurable): + """ + Construct nodes by taking a spatial ball of the original graph. + + Parameters: + entity_level (str, optional): level to perform cropping. + Available options are ``node``, ``atom`` and ``residue``. + min_radius (float, optional): minimum radius of the spatial ball + min_neighbor (int, optional): minimum number of nodes in the spatial ball + """ + + def __init__(self, entity_level="node", min_radius=15.0, min_neighbor=50): + super(SubspaceNode, self).__init__() + self.entity_level = entity_level + self.min_radius = min_radius + self.min_neighbor = min_neighbor + + def forward(self, graph): + """ + Randomly pick a node as the center, and crop a spatial ball + that is at least `radius` large and contain at least `k` nodes. + + Parameters: + graph (Graph): :math:`n` graph(s) + """ + node_in = torch.arange(graph.num_node, device=graph.device) + node_in = functional.variadic_sample(node_in, graph.num_nodes, 1).squeeze(-1) + node_in = node_in.repeat_interleave(graph.num_nodes) + node_out = torch.arange(graph.num_node, device=graph.device) + dist = (graph.node_position[node_in] - graph.node_position[node_out]).norm(dim=-1) + topk_dist = functional.variadic_topk(dist, graph.num_nodes, self.min_neighbor, largest=False)[0] + radius = (topk_dist[:, -1] * 1.5).clamp(min=self.min_radius) + radius = radius.repeat_interleave(graph.num_nodes) + node_index = node_out[dist < radius] + + if self.entity_level in ["node", "atom"]: + graph = graph.subgraph(node_index) + else: + residue_index = graph.atom2residue[node_index].unique() + graph = graph.subresidue(residue_index) + + return graph diff --git a/build/lib/torchdrug/layers/geometry/graph.py b/build/lib/torchdrug/layers/geometry/graph.py new file mode 100644 index 00000000..7aa16a83 --- /dev/null +++ b/build/lib/torchdrug/layers/geometry/graph.py @@ -0,0 +1,194 @@ +import math + +import torch +from torch import nn + +from torchdrug import core, data +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("layers.GraphConstruction") +class GraphConstruction(nn.Module, core.Configurable): + """ + Construct a new graph from an existing graph. + + See `torchdrug.layers.geometry` for a full list of available node and edge layers. + + Parameters: + node_layers (list of nn.Module, optional): modules to construct nodes of the new graph + edge_layers (list of nn.Module, optional): modules to construct edges of the new graph + edge_feature (str, optional): edge features in the new graph. + Available features are ``residue_type``, ``gearnet``. + + 1. For ``residue_type``, the feature of the edge :math:`e_{ij}` between residue :math:`i` and residue + :math:`j` is the concatenation ``[residue_type(i), residue_type(j)]``. + 2. For ``gearnet``, the feature of the edge :math:`e_{ij}` between residue :math:`i` and residue :math:`j` + is the concatenation ``[residue_type(i), residue_type(j), edge_type(e_ij), + sequential_distance(i,j), spatial_distance(i,j)]``. + + .. note:: + You may customize your own edge features by inheriting this class and define a member function + for your features. Use ``edge_feature="my_feature"`` to call the following feature function. + + .. code:: python + + def edge_my_feature(self, graph, edge_list, num_relation): + ... + return feature # the first dimension must be ``graph.num_edge`` + """ + + max_seq_dist = 10 + + def __init__(self, node_layers=None, edge_layers=None, edge_feature="residue_type"): + super(GraphConstruction, self).__init__() + if node_layers is None: + self.node_layers = nn.ModuleList() + else: + self.node_layers = nn.ModuleList(node_layers) + if edge_layers is None: + edge_layers = nn.ModuleList() + else: + edge_layers = nn.ModuleList(edge_layers) + self.edge_layers = edge_layers + self.edge_feature = edge_feature + + def edge_residue_type(self, graph, edge_list, num_relation): + node_in, node_out, _ = edge_list.t() + residue_in, residue_out = graph.atom2residue[node_in], graph.atom2residue[node_out] + in_residue_type = graph.residue_type[residue_in] + out_residue_type = graph.residue_type[residue_out] + + return torch.cat([ + functional.one_hot(in_residue_type, len(data.Protein.residue2id)), + functional.one_hot(out_residue_type, len(data.Protein.residue2id)) + ], dim=-1) + + def edge_gearnet(self, graph, edge_list, num_relation): + node_in, node_out, r = edge_list.t() + residue_in, residue_out = graph.atom2residue[node_in], graph.atom2residue[node_out] + in_residue_type = graph.residue_type[residue_in] + out_residue_type = graph.residue_type[residue_out] + sequential_dist = torch.abs(residue_in - residue_out) + spatial_dist = (graph.node_position[node_in] - graph.node_position[node_out]).norm(dim=-1) + + return torch.cat([ + functional.one_hot(in_residue_type, len(data.Protein.residue2id)), + functional.one_hot(out_residue_type, len(data.Protein.residue2id)), + functional.one_hot(r, num_relation), + functional.one_hot(sequential_dist.clamp(max=self.max_seq_dist), self.max_seq_dist + 1), + spatial_dist.unsqueeze(-1) + ], dim=-1) + + def apply_node_layer(self, graph): + for layer in self.node_layers: + graph = layer(graph) + return graph + + def apply_edge_layer(self, graph): + if not self.edge_layers: + return graph + + edge_list = [] + num_edges = [] + num_relations = [] + for layer in self.edge_layers: + edges, num_relation = layer(graph) + edge_list.append(edges) + num_edges.append(len(edges)) + num_relations.append(num_relation) + + edge_list = torch.cat(edge_list) + num_edges = torch.tensor(num_edges, device=graph.device) + num_relations = torch.tensor(num_relations, device=graph.device) + num_relation = num_relations.sum() + offsets = (num_relations.cumsum(0) - num_relations).repeat_interleave(num_edges) + edge_list[:, 2] += offsets + + # reorder edges into a valid PackedGraph + node_in = edge_list[:, 0] + edge2graph = graph.node2graph[node_in] + order = edge2graph.argsort() + edge_list = edge_list[order] + num_edges = edge2graph.bincount(minlength=graph.batch_size) + offsets = (graph.num_cum_nodes - graph.num_nodes).repeat_interleave(num_edges) + + if hasattr(self, "edge_%s" % self.edge_feature): + edge_feature = getattr(self, "edge_%s" % self.edge_feature)(graph, edge_list, num_relation) + elif self.edge_feature is None: + edge_feature = None + else: + raise ValueError("Unknown edge feature `%s`" % self.edge_feature) + data_dict, meta_dict = graph.data_by_meta(include=( + "node", "residue", "node reference", "residue reference", "graph" + )) + + if isinstance(graph, data.PackedProtein): + data_dict["num_residues"] = graph.num_residues + if isinstance(graph, data.PackedMolecule): + data_dict["bond_type"] = torch.zeros_like(edge_list[:, 2]) + return type(graph)(edge_list, num_nodes=graph.num_nodes, num_edges=num_edges, num_relation=num_relation, + view=graph.view, offsets=offsets, edge_feature=edge_feature, + meta_dict=meta_dict, **data_dict) + + def forward(self, graph): + """ + Generate a new graph based on the input graph and pre-defined node and edge layers. + + Parameters: + graph (Graph): :math:`n` graph(s) + + Returns: + graph (Graph): new graph(s) + """ + graph = self.apply_node_layer(graph) + graph = self.apply_edge_layer(graph) + return graph + + +@R.register("layers.SpatialLineGraph") +class SpatialLineGraph(nn.Module, core.Configurable): + """ + Spatial line graph construction module from `Protein Representation Learning by Geometric Structure Pretraining`_. + + .. _Protein Representation Learning by Geometric Structure Pretraining: + https://arxiv.org/pdf/2203.06125.pdf + + Parameters: + num_angle_bin (int, optional): number of bins to discretize angles between edges + """ + + def __init__(self, num_angle_bin=8): + super(SpatialLineGraph, self).__init__() + self.num_angle_bin = num_angle_bin + + def forward(self, graph): + """ + Generate the spatial line graph of the input graph. + The edge types are decided by the angles between two adjacent edges in the input graph. + + Parameters: + graph (PackedGraph): :math:`n` graph(s) + + Returns: + graph (PackedGraph): the spatial line graph + """ + line_graph = graph.line_graph() + node_in, node_out = graph.edge_list[:, :2].t() + edge_in, edge_out = line_graph.edge_list.t() + + # compute the angle ijk + node_i = node_out[edge_out] + node_j = node_in[edge_out] + node_k = node_in[edge_in] + vector1 = graph.node_position[node_i] - graph.node_position[node_j] + vector2 = graph.node_position[node_k] - graph.node_position[node_j] + x = (vector1 * vector2).sum(dim=-1) + y = torch.cross(vector1, vector2).norm(dim=-1) + angle = torch.atan2(y, x) + relation = (angle / math.pi * self.num_angle_bin).long().clamp(max=self.num_angle_bin - 1) + edge_list = torch.cat([line_graph.edge_list, relation.unsqueeze(-1)], dim=-1) + + return type(line_graph)(edge_list, num_nodes=line_graph.num_nodes, offsets=line_graph._offsets, + num_edges=line_graph.num_edges, num_relation=self.num_angle_bin, + meta_dict=line_graph.meta_dict, **line_graph.data_dict) diff --git a/build/lib/torchdrug/layers/pool.py b/build/lib/torchdrug/layers/pool.py new file mode 100644 index 00000000..973def24 --- /dev/null +++ b/build/lib/torchdrug/layers/pool.py @@ -0,0 +1,207 @@ +import torch +from torch import nn +from torch.nn import functional as F +from torch_scatter import scatter_add, scatter_mean + +from torchdrug import data + + +class DiffPool(nn.Module): + """ + Differentiable pooling operator from `Hierarchical Graph Representation Learning with Differentiable Pooling`_ + + .. _Hierarchical Graph Representation Learning with Differentiable Pooling: + https://papers.nips.cc/paper/7729-hierarchical-graph-representation-learning-with-differentiable-pooling.pdf + + Parameter + input_dim (int): input dimension + output_node (int): number of nodes after pooling + feature_layer (Module, optional): graph convolution layer for embedding + pool_layer (Module, optional): graph convolution layer for pooling assignment + loss_weight (float, optional): weight of entropy regularization + zero_diagonal (bool, optional): remove self loops in the pooled graph or not + sparse (bool, optional): use sparse assignment or not + """ + + tau = 1 + eps = 1e-10 + + def __init__(self, input_dim, output_node, feature_layer=None, pool_layer=None, loss_weight=1, zero_diagonal=False, + sparse=False): + super(DiffPool, self).__init__() + self.input_dim = input_dim + self.output_dim = feature_layer.output_dim + self.output_node = output_node + self.feature_layer = feature_layer + self.pool_layer = pool_layer + self.loss_weight = loss_weight + self.zero_diagonal = zero_diagonal + self.sparse = sparse + + if pool_layer is not None: + self.linear = nn.Linear(pool_layer.output_dim, output_node) + else: + self.linear = nn.Linear(input_dim, output_node) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the node cluster assignment and pool the nodes. + + Parameters: + graph (Graph): graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + (PackedGraph, Tensor, Tensor): + pooled graph, output node representations, node-to-cluster assignment + """ + feature = input + if self.feature_layer: + feature = self.feature_layer(graph, feature) + + x = input + if self.pool_layer: + x = self.pool_layer(graph, x) + x = self.linear(x) + if self.sparse: + assignment = F.gumbel_softmax(x, hard=True, tau=self.tau, dim=-1) + new_graph, output = self.sparse_pool(graph, feature, assignment) + else: + assignment = F.softmax(x, dim=-1) + new_graph, output = self.dense_pool(graph, feature, assignment) + + if all_loss is not None: + prob = scatter_mean(assignment, graph.node2graph, dim=0, dim_size=graph.batch_size) + entropy = -(prob * (prob + self.eps).log()).sum(dim=-1) + entropy = entropy.mean() + metric["assignment entropy"] = entropy + if self.loss_weight > 0: + all_loss -= entropy * self.loss_weight + + if self.zero_diagonal: + edge_list = new_graph.edge_list[:, :2] + is_diagonal = edge_list[:, 0] == edge_list[:, 1] + new_graph = new_graph.edge_mask(~is_diagonal) + + return new_graph, output, assignment + + def dense_pool(self, graph, input, assignment): + node_in, node_out = graph.edge_list.t()[:2] + # S^T A S, O(|V|k^2 + |E|k) + x = graph.edge_weight.unsqueeze(-1) * assignment[node_out] + x = scatter_add(x, node_in, dim=0, dim_size=graph.num_node) + x = torch.einsum("np, nq -> npq", assignment, x) + adjacency = scatter_add(x, graph.node2graph, dim=0, dim_size=graph.batch_size) + # S^T X + x = torch.einsum("na, nd -> nad", assignment, input) + output = scatter_add(x, graph.node2graph, dim=0, dim_size=graph.batch_size).flatten(0, 1) + + index = torch.arange(self.output_node, device=graph.device).expand(len(graph), self.output_node, -1) + edge_list = torch.stack([index.transpose(-1, -2), index], dim=-1).flatten(0, -2) + edge_weight = adjacency.flatten() + if isinstance(graph, data.PackedGraph): + num_nodes = torch.ones(len(graph), dtype=torch.long, device=input.device) * self.output_node + num_edges = torch.ones(len(graph), dtype=torch.long, device=input.device) * self.output_node ** 2 + graph = data.PackedGraph(edge_list, edge_weight=edge_weight, num_nodes=num_nodes, num_edges=num_edges) + else: + graph = data.Graph(edge_list, edge_weight=edge_weight, num_node=self.output_node) + return graph, output + + def sparse_pool(self, graph, input, assignment): + assignment = assignment.argmax(dim=-1) + edge_list = graph.edge_list[:, :2] + edge_list = assignment[edge_list] + pooled_node = graph.node2graph * self.output_node + assignment + output = scatter_add(input, pooled_node, dim=0, dim_size=graph.batch_size * self.output_node) + + edge_weight = graph.edge_weight + if isinstance(graph, data.PackedGraph): + num_nodes = torch.ones(len(graph), dtype=torch.long, device=input.device) * self.output_node + num_edges = graph.num_edges + graph = data.PackedGraph(edge_list, edge_weight=edge_weight, num_nodes=num_nodes, num_edges=num_edges) + else: + graph = data.Graph(edge_list, edge_weight=edge_weight, num_node=self.output_node) + return graph, output + + +class MinCutPool(DiffPool): + """ + Min cut pooling operator from `Spectral Clustering with Graph Neural Networks for Graph Pooling`_ + + .. _Spectral Clustering with Graph Neural Networks for Graph Pooling: + http://proceedings.mlr.press/v119/bianchi20a/bianchi20a.pdf + + Parameters: + input_dim (int): input dimension + output_node (int): number of nodes after pooling + feature_layer (Module, optional): graph convolution layer for embedding + pool_layer (Module, optional): graph convolution layer for pooling assignment + loss_weight (float, optional): weight of entropy regularization + zero_diagonal (bool, optional): remove self loops in the pooled graph or not + sparse (bool, optional): use sparse assignment or not + """ + + eps = 1e-10 + + def __init__(self, input_dim, output_node, feature_layer=None, pool_layer=None, loss_weight=1, zero_diagonal=True, + sparse=False): + super(MinCutPool, self).__init__(input_dim, output_node, feature_layer, pool_layer, loss_weight, zero_diagonal, + sparse) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the node cluster assignment and pool the nodes. + + Parameters: + graph (Graph): graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + (PackedGraph, Tensor, Tensor): + pooled graph, output node representations, node-to-cluster assignment + """ + feature = input + if self.feature_layer: + feature = self.feature_layer(graph, feature) + + x = input + if self.pool_layer: + x = self.pool_layer(graph, x) + x = self.linear(x) + if self.sparse: + assignment = F.gumbel_softmax(x, hard=True, tau=self.tau, dim=-1) + new_graph, output = self.sparse_pool(graph, feature, assignment) + else: + assignment = F.softmax(x, dim=-1) + new_graph, output = self.dense_pool(graph, feature, assignment) + + if all_loss is not None: + edge_list = new_graph.edge_list + is_diagonal = edge_list[:, 0] == edge_list[:, 1] + num_intra = scatter_add(new_graph.edge_weight[is_diagonal], new_graph.edge2graph[is_diagonal], + dim=0, dim_size=new_graph.batch_size) + x = torch.einsum("na, n, nc -> nac", assignment, graph.degree_in, assignment) + x = scatter_add(x, graph.node2graph, dim=0, dim_size=graph.batch_size) + num_all = torch.einsum("baa -> b", x) + cut_loss = (1 - num_intra / (num_all + self.eps)).mean() + metric["normalized cut loss"] = cut_loss + + x = torch.einsum("na, nc -> nac", assignment, assignment) + x = scatter_add(x, graph.node2graph, dim=0, dim_size=graph.batch_size) + x = x / x.flatten(-2).norm(dim=-1, keepdim=True).unsqueeze(-1) + x = x - torch.eye(self.output_node, device=x.device) / (self.output_node ** 0.5) + regularization = x.flatten(-2).norm(dim=-1).mean() + metric["orthogonal regularization"] = regularization + if self.loss_weight > 0: + all_loss += (cut_loss + regularization) * self.loss_weight + + if self.zero_diagonal: + edge_list = new_graph.edge_list[:, :2] + is_diagonal = edge_list[:, 0] == edge_list[:, 1] + new_graph = new_graph.edge_mask(~is_diagonal) + + return new_graph, output, assignment \ No newline at end of file diff --git a/build/lib/torchdrug/layers/readout.py b/build/lib/torchdrug/layers/readout.py new file mode 100644 index 00000000..0446e7e0 --- /dev/null +++ b/build/lib/torchdrug/layers/readout.py @@ -0,0 +1,197 @@ +import torch +from torch import nn +from torch_scatter import scatter_mean, scatter_add, scatter_max, scatter_softmax + + +class Readout(nn.Module): + + def __init__(self, type="node"): + super(Readout, self).__init__() + self.type = type + + def get_index2graph(self, graph): + if self.type == "node": + input2graph = graph.node2graph + elif self.type == "edge": + input2graph = graph.edge2graph + elif self.type == "residue": + input2graph = graph.residue2graph + else: + raise ValueError("Unknown input type `%s` for readout functions" % self.type) + return input2graph + + +class MeanReadout(Readout): + """Mean readout operator over graphs with variadic sizes.""" + + def forward(self, graph, input): + """ + Perform readout over the graph(s). + + Parameters: + graph (Graph): graph(s) + input (Tensor): node representations + + Returns: + Tensor: graph representations + """ + input2graph = self.get_index2graph(graph) + output = scatter_mean(input, input2graph, dim=0, dim_size=graph.batch_size) + return output + + +class SumReadout(Readout): + """Sum readout operator over graphs with variadic sizes.""" + + def forward(self, graph, input): + """ + Perform readout over the graph(s). + + Parameters: + graph (Graph): graph(s) + input (Tensor): node representations + + Returns: + Tensor: graph representations + """ + input2graph = self.get_index2graph(graph) + output = scatter_add(input, input2graph, dim=0, dim_size=graph.batch_size) + return output + + +class MaxReadout(Readout): + """Max readout operator over graphs with variadic sizes.""" + + def forward(self, graph, input): + """ + Perform readout over the graph(s). + + Parameters: + graph (Graph): graph(s) + input (Tensor): node representations + + Returns: + Tensor: graph representations + """ + input2graph = self.get_index2graph(graph) + output = scatter_max(input, input2graph, dim=0, dim_size=graph.batch_size)[0] + return output + + +class AttentionReadout(Readout): + """Attention readout operator over graphs with variadic sizes.""" + + def __init__(self, input_dim, type="node"): + super(AttentionReadout, self).__init__(type) + self.input_dim = input_dim + self.linear = nn.Linear(input_dim, 1) + + def forward(self, graph, input): + index2graph = self.get_index2graph(graph) + weight = self.linear(input) + attention = scatter_softmax(weight, index2graph, dim=0) + output = scatter_add(attention * input, index2graph, dim=0, dim_size=graph.batch_size) + return output + + +class Softmax(Readout): + """Softmax operator over graphs with variadic sizes.""" + + eps = 1e-10 + + def forward(self, graph, input): + """ + Perform softmax over the graph(s). + + Parameters: + graph (Graph): graph(s) + input (Tensor): node logits + + Returns: + Tensor: node probabilities + """ + input2graph = self.get_index2graph(graph) + x = input - scatter_max(input, input2graph, dim=0, dim_size=graph.batch_size)[0][input2graph] + x = x.exp() + normalizer = scatter_add(x, input2graph, dim=0, dim_size=graph.batch_size)[input2graph] + return x / (normalizer + self.eps) + + +class Sort(Readout): + """ + Sort operator over graphs with variadic sizes. + + Parameters: + descending (bool, optional): use descending sort order or not + """ + + def __init__(self, type="node", descending=False): + super(Sort, self).__init__(type) + self.descending = descending + + def forward(self, graph, input): + """ + Perform sort over graph(s). + + Parameters: + graph (Graph): graph(s) + input (Tensor): node values + + Returns: + (Tensor, LongTensor): sorted values, sorted indices + """ + input2graph = self.get_index2graph(graph) + step = input.max(dim=0) - input.min(dim=0) + 1 + if self.descending: + step = -step + x = input + input2graph * step + sorted, index = x.sort(dim=0, descending=self.descending) + sorted = sorted - input2graph * step + return sorted, index + + +class Set2Set(Readout): + """ + Set2Set operator from `Order Matters: Sequence to sequence for sets`_. + + .. _Order Matters\: Sequence to sequence for sets: + https://arxiv.org/pdf/1511.06391.pdf + + Parameters: + input_dim (int): input dimension + num_step (int, optional): number of process steps + num_lstm_layer (int, optional): number of LSTM layers + """ + + def __init__(self, input_dim, type="node", num_step=3, num_lstm_layer=1): + super(Set2Set, self).__init__(type) + self.input_dim = input_dim + self.output_dim = self.input_dim * 2 + self.num_step = num_step + self.lstm = nn.LSTM(input_dim * 2, input_dim, num_lstm_layer) + self.softmax = Softmax(type) + + def forward(self, graph, input): + """ + Perform Set2Set readout over graph(s). + + Parameters: + graph (Graph): graph(s) + input (Tensor): node representations + + Returns: + Tensor: graph representations + """ + input2graph = self.get_index2graph(graph) + hx = (torch.zeros(self.lstm.num_layers, graph.batch_size, self.lstm.hidden_size, device=input.device),) * 2 + query_star = torch.zeros(graph.batch_size, self.output_dim, device=input.device) + + for i in range(self.num_step): + query, hx = self.lstm(query_star.unsqueeze(0), hx) + query = query.squeeze(0) + product = torch.einsum("bd, bd -> b", query[input2graph], input) + attention = self.softmax(graph, product) + output = scatter_add(attention.unsqueeze(-1) * input, input2graph, dim=0, dim_size=graph.batch_size) + query_star = torch.cat([query, output], dim=-1) + + return query_star \ No newline at end of file diff --git a/build/lib/torchdrug/layers/sampler.py b/build/lib/torchdrug/layers/sampler.py new file mode 100644 index 00000000..0f97107b --- /dev/null +++ b/build/lib/torchdrug/layers/sampler.py @@ -0,0 +1,92 @@ +from torch import nn +from torch_scatter import scatter_add + +from torchdrug.layers import functional + + +class NodeSampler(nn.Module): + """ + Node sampler from `GraphSAINT: Graph Sampling Based Inductive Learning Method`_. + + .. _GraphSAINT\: Graph Sampling Based Inductive Learning Method: + https://arxiv.org/pdf/1907.04931.pdf + + Parameters: + budget (int, optional): number of node to keep + ratio (int, optional): ratio of node to keep + """ + + def __init__(self, budget=None, ratio=None): + super(NodeSampler, self).__init__() + if budget is None and ratio is None: + raise ValueError("At least one of `budget` and `ratio` should be provided") + self.budget = budget + self.ratio = ratio + + def forward(self, graph): + """ + Sample a subgraph from the graph. + + Parameters: + graph (Graph): graph(s) + """ + # this is exact for a single graph + # but approximate for packed graphs + num_sample = graph.num_node + if self.budget: + num_sample = min(num_sample, self.budget) + if self.ratio: + num_sample = min(num_sample, int(self.ratio * graph.num_node)) + + prob = scatter_add(graph.edge_weight ** 2, graph.edge_list[:, 1], dim_size=graph.num_node) + prob /= prob.mean() + index = functional.multinomial(prob, num_sample) + new_graph = graph.node_mask(index) + node_out = new_graph.edge_list[:, 1] + new_graph._edge_weight /= num_sample * prob[node_out] / graph.num_node + + return new_graph + + +class EdgeSampler(nn.Module): + """ + Edge sampler from `GraphSAINT: Graph Sampling Based Inductive Learning Method`_. + + .. _GraphSAINT\: Graph Sampling Based Inductive Learning Method: + https://arxiv.org/pdf/1907.04931.pdf + + Parameters: + budget (int, optional): number of node to keep + ratio (int, optional): ratio of node to keep + """ + + def __init__(self, budget=None, ratio=None): + super(EdgeSampler, self).__init__() + if budget is None and ratio is None: + raise ValueError("At least one of `budget` and `ratio` should be provided") + self.budget = budget + self.ratio = ratio + + def forward(self, graph): + """ + Sample a subgraph from the graph. + + Parameters: + graph (Graph): graph(s) + """ + # this is exact for a single graph + # but approximate for packed graphs + node_in, node_out = graph.edge_list.t()[:2] + num_sample = graph.num_edge + if self.budget: + num_sample = min(num_sample, self.budget) + if self.ratio: + num_sample = min(num_sample, int(self.ratio * graph.num_edge)) + + prob = 1 / graph.degree_out[node_out] + 1 / graph.degree_in[node_in] + prob = prob / prob.mean() + index = functional.multinomial(prob, num_sample) + new_graph = graph.edge_mask(index) + new_graph._edge_weight /= num_sample * prob[index] / graph.num_edge + + return new_graph diff --git a/build/lib/torchdrug/metrics/__init__.py b/build/lib/torchdrug/metrics/__init__.py new file mode 100644 index 00000000..a5292fc2 --- /dev/null +++ b/build/lib/torchdrug/metrics/__init__.py @@ -0,0 +1,14 @@ +from .metric import area_under_roc, area_under_prc, r2, QED, logP, penalized_logP, SA, chemical_validity, \ + accuracy, variadic_accuracy, matthews_corrcoef, pearsonr, spearmanr, \ + variadic_area_under_prc, variadic_area_under_roc, variadic_top_precision, f1_max + +# alias +AUROC = area_under_roc +AUPRC = area_under_prc + +__all__ = [ + "area_under_roc", "area_under_prc", "r2", "QED", "logP", "penalized_logP", "SA", "chemical_validity", + "accuracy", "variadic_accuracy", "matthews_corrcoef", "pearsonr", "spearmanr", + "variadic_area_under_prc", "variadic_area_under_roc", "variadic_top_precision", "f1_max", + "AUROC", "AUPRC", +] \ No newline at end of file diff --git a/build/lib/torchdrug/metrics/metric.py b/build/lib/torchdrug/metrics/metric.py new file mode 100644 index 00000000..89d34166 --- /dev/null +++ b/build/lib/torchdrug/metrics/metric.py @@ -0,0 +1,396 @@ +import torch +from torch.nn import functional as F +from torch_scatter import scatter_add, scatter_mean, scatter_max +import networkx as nx +from rdkit import Chem +from rdkit.Chem import Descriptors + +from torchdrug import utils +from torchdrug.layers import functional +from torchdrug.core import Registry as R +from torchdrug.metrics.rdkit import sascorer + + +@R.register("metrics.auroc") +def area_under_roc(pred, target): + """ + Area under receiver operating characteristic curve (ROC). + + Parameters: + pred (Tensor): predictions of shape :math:`(n,)` + target (Tensor): binary targets of shape :math:`(n,)` + """ + order = pred.argsort(descending=True) + target = target[order] + hit = target.cumsum(0) + all = (target == 0).sum() * (target == 1).sum() + auroc = hit[target == 0].sum() / (all + 1e-10) + return auroc + + +@R.register("metrics.auprc") +def area_under_prc(pred, target): + """ + Area under precision-recall curve (PRC). + + Parameters: + pred (Tensor): predictions of shape :math:`(n,)` + target (Tensor): binary targets of shape :math:`(n,)` + """ + order = pred.argsort(descending=True) + target = target[order] + precision = target.cumsum(0) / torch.arange(1, len(target) + 1, device=target.device) + auprc = precision[target == 1].sum() / ((target == 1).sum() + 1e-10) + return auprc + + +@R.register("metrics.r2") +def r2(pred, target): + """ + :math:`R^2` regression score. + + Parameters: + pred (Tensor): predictions of shape :math:`(n,)` + target (Tensor): targets of shape :math:`(n,)` + """ + total = torch.var(target, unbiased=False) + residual = F.mse_loss(pred, target) + return 1 - residual / total + + +@R.register("metrics.logp") +def logP(pred): + """ + Logarithm of partition coefficient between octanol and water for a compound. + + Parameters: + pred (PackedMolecule): molecules to evaluate + """ + logp = [] + for mol in pred: + mol = mol.to_molecule() + try: + with utils.no_rdkit_log(): + mol.UpdatePropertyCache() + score = Descriptors.MolLogP(mol) + except Chem.AtomValenceException: + score = 0 + logp.append(score) + + return torch.tensor(logp, dtype=torch.float, device=pred.device) + + +@R.register("metrics.plogp") +def penalized_logP(pred): + """ + Logarithm of partition coefficient, penalized by cycle length and synthetic accessibility. + + Parameters: + pred (PackedMolecule): molecules to evaluate + """ + # statistics from ZINC250k + logp_mean = 2.4570953396190123 + logp_std = 1.434324401111988 + sa_mean = 3.0525811293166134 + sa_std = 0.8335207024513095 + cycle_mean = 0.0485696876403053 + cycle_std = 0.2860212110245455 + + plogp = [] + for mol in pred: + cycles = nx.cycle_basis(nx.Graph(mol.edge_list[:, :2].tolist())) + if cycles: + max_cycle = max([len(cycle) for cycle in cycles]) + cycle = max(0, max_cycle - 6) + else: + cycle = 0 + mol = mol.to_molecule() + try: + with utils.no_rdkit_log(): + mol.UpdatePropertyCache() + Chem.GetSymmSSSR(mol) + logp = Descriptors.MolLogP(mol) + sa = sascorer.calculateScore(mol) + logp = (logp - logp_mean) / logp_std + sa = (sa - sa_mean) / sa_std + cycle = (cycle - cycle_mean) / cycle_std + score = logp - sa - cycle + except Chem.AtomValenceException: + score = -30 + plogp.append(score) + + return torch.tensor(plogp, dtype=torch.float, device=pred.device) + + +@R.register("metrics.SA") +def SA(pred): + """ + Synthetic accesibility score. + + Parameters: + pred (PackedMolecule): molecules to evaluate + """ + sa = [] + for mol in pred: + with utils.no_rdkit_log(): + score = sascorer.calculateScore(mol.to_molecule()) + sa.append(score) + + return torch.tensor(sa, dtype=torch.float, device=pred.device) + + +@R.register("metrics.qed") +def QED(pred): + """ + Quantitative estimation of drug-likeness. + + Parameters: + pred (PackedMolecule): molecules to evaluate + """ + qed = [] + for mol in pred: + try: + with utils.no_rdkit_log(): + score = Descriptors.qed(mol.to_molecule()) + except Chem.AtomValenceException: + score = -1 + qed.append(score) + + return torch.tensor(qed, dtype=torch.float, device=pred.device) + + +@R.register("metrics.validity") +def chemical_validity(pred): + """ + Chemical validity of molecules. + + Parameters: + pred (PackedMolecule): molecules to evaluate + """ + validity = [] + for i, mol in enumerate(pred): + with utils.no_rdkit_log(): + smiles = mol.to_smiles() + mol = Chem.MolFromSmiles(smiles) + validity.append(1 if mol else 0) + + return torch.tensor(validity, dtype=torch.float, device=pred.device) + + +@R.register("metrics.variadic_auroc") +def variadic_area_under_roc(pred, target, size): + """ + Area under receiver operating characteristic curve (ROC) for sets with variadic sizes. + + Suppose there are :math:`N` sets, and the sizes of all sets are summed to :math:`B`. + + Parameters: + pred (Tensor): prediction of shape :math:`(B,)` + target (Tensor): target of shape :math:`(B,)`. + size (Tensor): size of sets of shape :math:`(N,)` + """ + index2graph = torch.repeat_interleave(size) + _, order = functional.variadic_sort(pred, size, descending=True) + cum_size = (size.cumsum(0) - size)[index2graph] + target = target[order + cum_size] + total_hit = functional.variadic_sum(target, size) + total_hit = total_hit.cumsum(0) - total_hit + hit = target.cumsum(0) - total_hit[index2graph] + hit = torch.where(target == 0, hit, torch.zeros_like(hit)) + all = functional.variadic_sum((target == 0).float(), size) * \ + functional.variadic_sum((target == 1).float(), size) + auroc = functional.variadic_sum(hit, size) / (all + 1e-10) + return auroc + + +@R.register("metrics.variadic_auprc") +def variadic_area_under_prc(pred, target, size): + """ + Area under precision-recall curve (PRC) for sets with variadic sizes. + + Suppose there are :math:`N` sets, and the sizes of all sets are summed to :math:`B`. + + Parameters: + pred (Tensor): prediction of shape :math:`(B,)` + target (Tensor): target of shape :math:`(B,)`. + size (Tensor): size of sets of shape :math:`(N,)` + """ + index2graph = torch.repeat_interleave(size) + _, order = functional.variadic_sort(pred, size, descending=True) + cum_size = (size.cumsum(0) - size)[index2graph] + target = target[order + cum_size] + total_hit = functional.variadic_sum(target, size) + total_hit = total_hit.cumsum(0) - total_hit + hit = target.cumsum(0) - total_hit[index2graph] + total = torch.ones_like(target).cumsum(0) - (size.cumsum(0) - size)[index2graph] + precision = hit / total + precision = torch.where(target == 1, precision, torch.zeros_like(precision)) + auprc = functional.variadic_sum(precision, size) / \ + (functional.variadic_sum((target == 1).float(), size) + 1e-10) + return auprc + + +@R.register("metrics.f1_max") +def f1_max(pred, target): + """ + F1 score with the optimal threshold. + + This function first enumerates all possible thresholds for deciding positive and negative + samples, and then pick the threshold with the maximal F1 score. + + Parameters: + pred (Tensor): predictions of shape :math:`(B, N)` + target (Tensor): binary targets of shape :math:`(B, N)` + """ + order = pred.argsort(descending=True, dim=1) + target = target.gather(1, order) + precision = target.cumsum(1) / torch.ones_like(target).cumsum(1) + recall = target.cumsum(1) / (target.sum(1, keepdim=True) + 1e-10) + is_start = torch.zeros_like(target).bool() + is_start[:, 0] = 1 + is_start = torch.scatter(is_start, 1, order, is_start) + + all_order = pred.flatten().argsort(descending=True) + order = order + torch.arange(order.shape[0], device=order.device).unsqueeze(1) * order.shape[1] + order = order.flatten() + inv_order = torch.zeros_like(order) + inv_order[order] = torch.arange(order.shape[0], device=order.device) + is_start = is_start.flatten()[all_order] + all_order = inv_order[all_order] + precision = precision.flatten() + recall = recall.flatten() + all_precision = precision[all_order] - \ + torch.where(is_start, torch.zeros_like(precision), precision[all_order - 1]) + all_precision = all_precision.cumsum(0) / is_start.cumsum(0) + all_recall = recall[all_order] - \ + torch.where(is_start, torch.zeros_like(recall), recall[all_order - 1]) + all_recall = all_recall.cumsum(0) / pred.shape[0] + all_f1 = 2 * all_precision * all_recall / (all_precision + all_recall + 1e-10) + return all_f1.max() + + +@R.register("metrics.accuracy") +def accuracy(pred, target): + """ + Classification accuracy. + + Suppose there are :math:`N` sets and :math:`C` categories. + + Parameters: + pred (Tensor): prediction of shape :math:`(N, C)` + target (Tensor): target of shape :math:`(N,)` + """ + return (pred.argmax(dim=-1) == target).float().mean() + + +@R.register("metrics.variadic_accuracy") +def variadic_accuracy(input, target, size): + """ + Classification accuracy for categories with variadic sizes. + + Suppose there are :math:`N` samples, and the number of categories in all samples is summed to :math:`B`. + + Parameters: + input (Tensor): prediction of shape :math:`(B,)` + target (Tensor): target of shape :math:`(N,)`. Each target is a relative index in a sample. + size (Tensor): number of categories of shape :math:`(N,)` + """ + index2graph = torch.repeat_interleave(size) + + input_class = scatter_max(input, index2graph)[1] + target_index = target + size.cumsum(0) - size + accuracy = (input_class == target_index).float() + return accuracy + + +@R.register("metrics.variadic_top_precision") +def variadic_top_precision(pred, target, size, k): + """ + Top-k precision for sets with variadic sizes. + + Suppose there are :math:`N` sets, and the sizes of all sets are summed to :math:`B`. + + Parameters: + pred (Tensor): prediction of shape :math:`(B,)` + target (Tensor): target of shape :math:`(B,)` + size (Tensor): size of sets of shape :math:`(N,)` + k (LongTensor): the k in "top-k" for different sets of shape :math:`(N,)` + """ + index = functional.variadic_topk(pred, size, k, largest=True)[1] + index = index + (size.cumsum(0) - size).repeat_interleave(k) + precision = functional.variadic_sum(target[index], k) / k + precision[size < k] = 0 + return precision + + +@R.register("metrics.mcc") +def matthews_corrcoef(pred, target): + """ + Matthews correlation coefficient between prediction and target. + + Definition follows matthews_corrcoef for K classes in sklearn. + For details, see: `https://scikit-learn.org/stable/modules/model_evaluation.html#matthews-corrcoef` + + Parameters: + pred (Tensor): prediction of shape :math: `(N, K)` + target (Tensor): target of shape :math: `(N,)` + """ + num_class = pred.size(-1) + pred = pred.argmax(-1) + ones = torch.ones(len(target), device=pred.device) + confusion_matrix = scatter_add(ones, target * num_class + pred, dim=0, dim_size=num_class ** 2) + confusion_matrix = confusion_matrix.view(num_class, num_class) + t = confusion_matrix.sum(dim=1) + p = confusion_matrix.sum(dim=0) + c = confusion_matrix.trace() + s = confusion_matrix.sum() + return (c * s - t @ p) / ((s * s - p @ p) * (s * s - t @ t) + 1e-10).sqrt() + + +@R.register("metrics.pearsonr") +def pearsonr(pred, target): + """ + Pearson correlation between prediction and target. + + Parameters: + pred (Tensor): prediction of shape :math: `(N,)` + target (Tensor): target of shape :math: `(N,)` + """ + pred_mean = pred.float().mean() + target_mean = target.float().mean() + pred_centered = pred - pred_mean + target_centered = target - target_mean + pred_normalized = pred_centered / pred_centered.norm(2) + target_normalized = target_centered / target_centered.norm(2) + pearsonr = pred_normalized @ target_normalized + return pearsonr + + +@R.register("metrics.spearmanr") +def spearmanr(pred, target): + """ + Spearman correlation between prediction and target. + + Parameters: + pred (Tensor): prediction of shape :math: `(N,)` + target (Tensor): target of shape :math: `(N,)` + """ + + def get_ranking(input): + input_set, input_inverse = input.unique(return_inverse=True) + order = input_inverse.argsort() + ranking = torch.zeros(len(input_inverse), device=input.device) + ranking[order] = torch.arange(1, len(input) + 1, dtype=torch.float, device=input.device) + + # for elements that have the same value, replace their rankings with the mean of their rankings + mean_ranking = scatter_mean(ranking, input_inverse, dim=0, dim_size=len(input_set)) + ranking = mean_ranking[input_inverse] + return ranking + + pred = get_ranking(pred) + target = get_ranking(target) + covariance = (pred * target).mean() - pred.mean() * target.mean() + pred_std = pred.std(unbiased=False) + target_std = target.std(unbiased=False) + spearmanr = covariance / (pred_std * target_std + 1e-10) + return spearmanr diff --git a/build/lib/torchdrug/metrics/rdkit/__init__.py b/build/lib/torchdrug/metrics/rdkit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/build/lib/torchdrug/metrics/rdkit/sascorer.py b/build/lib/torchdrug/metrics/rdkit/sascorer.py new file mode 100644 index 00000000..49c5c7b9 --- /dev/null +++ b/build/lib/torchdrug/metrics/rdkit/sascorer.py @@ -0,0 +1,90 @@ +import os +import sys +import math +import pickle + +from rdkit import Chem +from rdkit.Chem import rdMolDescriptors + +from torchdrug import utils + +module = sys.modules[__name__] +path = os.path.dirname(__file__) + +# Calculate synthetic accessibility of molecules +# Code adapted from RDKit +# https://github.com/rdkit/rdkit/blob/master/Contrib/SA_Score/sascorer.py + + +def readFragmentScores(): + url = "https://github.com/rdkit/rdkit/raw/master/Contrib/SA_Score/fpscores.pkl.gz" + md5 = "2f80a169f9075e977154f9caec9e5c26" + + zip_file = utils.download(url, path, md5=md5) + pkl_file = utils.extract(zip_file) + with open(pkl_file, "rb") as fin: + data = pickle.load(fin) + outDict = {} + for i in data: + for j in range(1, len(i)): + outDict[i[j]] = float(i[0]) + return outDict + + +def numBridgeheadsAndSpiro(mol, ri=None): + nSpiro = rdMolDescriptors.CalcNumSpiroAtoms(mol) + nBridgehead = rdMolDescriptors.CalcNumBridgeheadAtoms(mol) + return nBridgehead, nSpiro + + +def calculateScore(m): + if not hasattr(module, "fscores"): + module.fscores = readFragmentScores() + fscores = module.fscores + + fp = rdMolDescriptors.GetMorganFingerprint(m, 2) + fps = fp.GetNonzeroElements() + score1 = 0.0 + nf = 0 + for bitId, v in fps.items(): + nf += v + sfp = bitId + score1 += fscores.get(sfp, -4) * v + score1 /= nf + + nAtoms = m.GetNumAtoms() + nChiralCenters = len(Chem.FindMolChiralCenters(m, includeUnassigned=True)) + ri = m.GetRingInfo() + nBridgeheads, nSpiro = numBridgeheadsAndSpiro(m, ri) + nMacrocycles = 0 + for x in ri.AtomRings(): + if len(x) > 8: + nMacrocycles += 1 + + sizePenalty = nAtoms**1.005 - nAtoms + stereoPenalty = math.log10(nChiralCenters + 1) + spiroPenalty = math.log10(nSpiro + 1) + bridgePenalty = math.log10(nBridgeheads + 1) + macrocyclePenalty = 0.0 + if nMacrocycles > 0: + macrocyclePenalty = math.log10(2) + + score2 = 0.0 - sizePenalty - stereoPenalty - spiroPenalty - bridgePenalty - macrocyclePenalty + + score3 = 0.0 + if nAtoms > len(fps): + score3 = math.log(float(nAtoms) / len(fps)) * 0.5 + + sascore = score1 + score2 + score3 + + min = -4.0 + max = 2.5 + sascore = 11. - (sascore - min + 1) / (max - min) * 9.0 + if sascore > 8.0: + sascore = 8.0 + math.log(sascore + 1.0 - 9.0) + if sascore > 10.0: + sascore = 10.0 + elif sascore < 1.0: + sascore = 1.0 + + return sascore \ No newline at end of file diff --git a/build/lib/torchdrug/models/__init__.py b/build/lib/torchdrug/models/__init__.py new file mode 100644 index 00000000..deb00084 --- /dev/null +++ b/build/lib/torchdrug/models/__init__.py @@ -0,0 +1,49 @@ +from .chebnet import ChebyshevConvolutionalNetwork +from .gcn import GraphConvolutionalNetwork, RelationalGraphConvolutionalNetwork +from .gat import GraphAttentionNetwork +from .gin import GraphIsomorphismNetwork +from .schnet import SchNet +from .mpnn import MessagePassingNeuralNetwork +from .neuralfp import NeuralFingerprint +from .infograph import InfoGraph, MultiviewContrast +from .flow import GraphAutoregressiveFlow +from .esm import EvolutionaryScaleModeling +from .embedding import TransE, DistMult, ComplEx, RotatE, SimplE +from .neurallp import NeuralLogicProgramming +from .kbgat import KnowledgeBaseGraphAttentionNetwork +from .cnn import ProteinConvolutionalNetwork, ProteinResNet +from .lstm import ProteinLSTM +from .bert import ProteinBERT +from .statistic import Statistic +from .physicochemical import Physicochemical +from .gearnet import GeometryAwareRelationalGraphNeuralNetwork + +# alias +ChebNet = ChebyshevConvolutionalNetwork +GCN = GraphConvolutionalNetwork +GAT = GraphAttentionNetwork +RGCN = RelationalGraphConvolutionalNetwork +GIN = GraphIsomorphismNetwork +MPNN = MessagePassingNeuralNetwork +NFP = NeuralFingerprint +GraphAF = GraphAutoregressiveFlow +ESM = EvolutionaryScaleModeling +NeuralLP = NeuralLogicProgramming +KBGAT = KnowledgeBaseGraphAttentionNetwork +ProteinCNN = ProteinConvolutionalNetwork +GearNet = GeometryAwareRelationalGraphNeuralNetwork + +__all__ = [ + "ChebyshevConvolutionalNetwork", "GraphConvolutionalNetwork", "RelationalGraphConvolutionalNetwork", + "GraphAttentionNetwork", "GraphIsomorphismNetwork", "SchNet", "MessagePassingNeuralNetwork", + "NeuralFingerprint", + "InfoGraph", "MultiviewContrast", + "GraphAutoregressiveFlow", + "EvolutionaryScaleModeling", "ProteinConvolutionalNetwork", "GeometryAwareRelationalGraphNeuralNetwork", + "Statistic", "Physicochemical", + "TransE", "DistMult", "ComplEx", "RotatE", "SimplE", + "NeuralLogicProgramming", "KnowledgeBaseGraphAttentionNetwork", + "ChebNet", "GCN", "GAT", "RGCN", "GIN", "MPNN", "NFP", + "GraphAF", "ESM", "NeuralLP", "KBGAT", + "ProteinCNN", "ProteinResNet", "ProteinLSTM", "ProteinBERT", "GearNet", +] \ No newline at end of file diff --git a/build/lib/torchdrug/models/bert.py b/build/lib/torchdrug/models/bert.py new file mode 100644 index 00000000..6d700574 --- /dev/null +++ b/build/lib/torchdrug/models/bert.py @@ -0,0 +1,100 @@ +import torch +from torch import nn +from torch.nn import functional as F + +from torchdrug import core, layers +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("models.ProteinBERT") +class ProteinBERT(nn.Module, core.Configurable): + """ + Protein BERT proposed in `Evaluating Protein Transfer Learning with TAPE`_. + + .. _Evaluating Protein Transfer Learning with TAPE: + https://arxiv.org/pdf/1906.08230.pdf + + Parameters: + input_dim (int): input dimension + hidden_dim (int, optional): hidden dimension + num_layers (int, optional): number of Transformer blocks + num_heads (int, optional): number of attention heads + intermediate_dim (int, optional): intermediate hidden dimension of Transformer block + activation (str or function, optional): activation function + hidden_dropout (float, optional): dropout ratio of hidden features + attention_dropout (float, optional): dropout ratio of attention maps + max_position (int, optional): maximum number of positions + """ + + def __init__(self, input_dim, hidden_dim=768, num_layers=12, num_heads=12, intermediate_dim=3072, + activation="gelu", hidden_dropout=0.1, attention_dropout=0.1, max_position=8192): + super(ProteinBERT, self).__init__() + self.input_dim = input_dim + self.hidden_dim = hidden_dim + self.output_dim = hidden_dim + self.num_layers = num_layers + self.num_heads = num_heads + self.intermediate_dim = intermediate_dim + self.hidden_dropout = hidden_dropout + self.attention_dropout = attention_dropout + self.max_position = max_position + + self.num_residue_type = input_dim + self.embedding = nn.Embedding(input_dim + 3, hidden_dim) + self.position_embedding = nn.Embedding(max_position, hidden_dim) + self.layer_norm = nn.LayerNorm(hidden_dim) + self.dropout = nn.Dropout(hidden_dropout) + + self.layers = nn.ModuleList() + for i in range(self.num_layers): + self.layers.append(layers.ProteinBERTBlock(hidden_dim, intermediate_dim, num_heads, + attention_dropout, hidden_dropout, activation)) + + self.linear = nn.Linear(hidden_dim, hidden_dim) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the residue representations and the graph representation(s). + + Parameters: + graph (Protein): :math:`n` protein(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``residue_feature`` and ``graph_feature`` fields: + residue representations of shape :math:`(|V_{res}|, d)`, graph representations of shape :math:`(n, d)` + """ + input = graph.residue_type + size_ext = graph.num_residues + # Prepend BOS + bos = torch.ones(graph.batch_size, dtype=torch.long, device=self.device) * self.num_residue_type + input, size_ext = functional._extend(bos, torch.ones_like(size_ext), input, size_ext) + # Append EOS + eos = torch.ones(graph.batch_size, dtype=torch.long, device=self.device) * (self.num_residue_type + 1) + input, size_ext = functional._extend(input, size_ext, eos, torch.ones_like(size_ext)) + # Padding + input, mask = functional.variadic_to_padded(input, size_ext, value=self.num_residue_type + 2) + mask = mask.long().unsqueeze(-1) + + input = self.embedding(input) + position_indices = torch.arange(input.shape[1], device=input.device) + input = input + self.position_embedding(position_indices).unsqueeze(0) + input = self.layer_norm(input) + input = self.dropout(input) + + for layer in self.layers: + input = layer(input, mask) + + residue_feature = functional.padded_to_variadic(input, graph.num_residues) + + graph_feature = input[:, 0] + graph_feature = self.linear(graph_feature) + graph_feature = F.tanh(graph_feature) + + return { + "graph_feature": graph_feature, + "residue_feature": residue_feature + } diff --git a/build/lib/torchdrug/models/chebnet.py b/build/lib/torchdrug/models/chebnet.py new file mode 100644 index 00000000..15d11295 --- /dev/null +++ b/build/lib/torchdrug/models/chebnet.py @@ -0,0 +1,89 @@ +from collections.abc import Sequence + +import torch +from torch import nn + +from torchdrug import core, layers +from torchdrug.core import Registry as R + + +@R.register("models.ChebNet") +class ChebyshevConvolutionalNetwork(nn.Module, core.Configurable): + """ + Chebyshev convolutional network proposed in + `Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering`_. + + .. _Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering: + https://arxiv.org/pdf/1606.09375.pdf + + Parameters: + input_dim (int): input dimension + hidden_dims (list of int): hidden dimensions + edge_input_dim (int, optional): dimension of edge features + k (int, optional): number of Chebyshev polynomials + short_cut (bool, optional): use short cut or not + batch_norm (bool, optional): apply batch normalization or not + activation (str or function, optional): activation function + concat_hidden (bool, optional): concat hidden representations from all layers as output + readout (str, optional): readout function. Available functions are ``sum`` and ``mean``. + """ + + def __init__(self, input_dim, hidden_dims, edge_input_dim=None, k=1, short_cut=False, batch_norm=False, + activation="relu", concat_hidden=False, readout="sum"): + super(ChebyshevConvolutionalNetwork, self).__init__() + + if not isinstance(hidden_dims, Sequence): + hidden_dims = [hidden_dims] + self.input_dim = input_dim + self.output_dim = sum(hidden_dims) if concat_hidden else hidden_dims[-1] + self.dims = [input_dim] + list(hidden_dims) + self.short_cut = short_cut + self.concat_hidden = concat_hidden + + self.layers = nn.ModuleList() + for i in range(len(self.dims) - 1): + self.layers.append(layers.ChebyshevConv(self.dims[i], self.dims[i + 1], edge_input_dim, k, + batch_norm, activation)) + + if readout == "sum": + self.readout = layers.SumReadout() + elif readout == "mean": + self.readout = layers.MeanReadout() + else: + raise ValueError("Unknown readout `%s`" % readout) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the node representations and the graph representation(s). + + Parameters: + graph (Graph): :math:`n` graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``node_feature`` and ``graph_feature`` fields: + node representations of shape :math:`(|V|, d)`, graph representations of shape :math:`(n, d)` + """ + hiddens = [] + layer_input = input + + for layer in self.layers: + hidden = layer(graph, layer_input) + assert not torch.isnan(hidden).any() + if self.short_cut and hidden.shape == layer_input.shape: + hidden = hidden + layer_input + hiddens.append(hidden) + layer_input = hidden + + if self.concat_hidden: + node_feature = torch.cat(hiddens, dim=-1) + else: + node_feature = hiddens[-1] + graph_feature = self.readout(graph, node_feature) + + return { + "graph_feature": graph_feature, + "node_feature": node_feature + } \ No newline at end of file diff --git a/build/lib/torchdrug/models/cnn.py b/build/lib/torchdrug/models/cnn.py new file mode 100644 index 00000000..24ec7437 --- /dev/null +++ b/build/lib/torchdrug/models/cnn.py @@ -0,0 +1,214 @@ +from collections.abc import Sequence + +import torch +from torch import nn +from torch.nn import functional as F + +from torchdrug import core, layers +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("models.ProteinResNet") +class ProteinResNet(nn.Module, core.Configurable): + """ + Protein ResNet proposed in `Evaluating Protein Transfer Learning with TAPE`_. + + .. _Evaluating Protein Transfer Learning with TAPE: + https://arxiv.org/pdf/1906.08230.pdf + + Parameters: + input_dim (int): input dimension + hidden_dims (list of int): hidden dimensions + kernel_size (int, optional): size of convolutional kernel + stride (int, optional): stride of convolution + padding (int, optional): padding added to both sides of the input + activation (str or function, optional): activation function + short_cut (bool, optional): use short cut or not + concat_hidden (bool, optional): concat hidden representations from all layers as output + layer_norm (bool, optional): apply layer normalization or not + dropout (float, optional): dropout ratio of input features + readout (str, optional): readout function. Available functions are ``sum``, ``mean`` and ``attention``. + """ + + def __init__(self, input_dim, hidden_dims, kernel_size=3, stride=1, padding=1, + activation="gelu", short_cut=False, concat_hidden=False, layer_norm=False, + dropout=0, readout="attention"): + super(ProteinResNet, self).__init__() + if not isinstance(hidden_dims, Sequence): + hidden_dims = [hidden_dims] + self.input_dim = input_dim + self.output_dim = sum(hidden_dims) if concat_hidden else hidden_dims[-1] + self.dims = list(hidden_dims) + self.short_cut = short_cut + self.concat_hidden = concat_hidden + self.padding_id = input_dim - 1 + + self.embedding = nn.Linear(input_dim, hidden_dims[0]) + self.position_embedding = layers.SinusoidalPositionEmbedding(hidden_dims[0]) + if layer_norm: + self.layer_norm = nn.LayerNorm(hidden_dims[0]) + else: + self.layer_norm = None + if dropout: + self.dropout = nn.Dropout(dropout) + else: + self.dropout = None + + self.layers = nn.ModuleList() + for i in range(len(self.dims) - 1): + self.layers.append(layers.ProteinResNetBlock(self.dims[i], self.dims[i + 1], kernel_size, + stride, padding, activation)) + + if readout == "sum": + self.readout = layers.SumReadout("residue") + elif readout == "mean": + self.readout = layers.MeanReadout("residue") + elif readout == "attention": + self.readout = layers.AttentionReadout(self.output_dim, "residue") + else: + raise ValueError("Unknown readout `%s`" % readout) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the residue representations and the graph representation(s). + + Parameters: + graph (Protein): :math:`n` protein(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``residue_feature`` and ``graph_feature`` fields: + residue representations of shape :math:`(|V_{res}|, d)`, graph representations of shape :math:`(n, d)` + """ + input = graph.residue_feature.float() + input, mask = functional.variadic_to_padded(input, graph.num_residues, value=self.padding_id) + mask = mask.unsqueeze(-1) + + input = self.embedding(input) + self.position_embedding(input).unsqueeze(0) + if self.layer_norm: + input = self.layer_norm(input) + if self.dropout: + input = self.dropout(input) + input = input * mask + + hiddens = [] + layer_input = input + + for layer in self.layers: + hidden = layer(layer_input, mask) + if self.short_cut and hidden.shape == layer_input.shape: + hidden = hidden + layer_input + hiddens.append(hidden) + layer_input = hidden + + if self.concat_hidden: + hidden = torch.cat(hiddens, dim=-1) + else: + hidden = hiddens[-1] + + residue_feature = functional.padded_to_variadic(hidden, graph.num_residues) + graph_feature = self.readout(graph, residue_feature) + + return { + "graph_feature": graph_feature, + "residue_feature": residue_feature + } + + +@R.register("models.ProteinConvolutionalNetwork") +class ProteinConvolutionalNetwork(nn.Module, core.Configurable): + """ + Protein Shallow CNN proposed in `Is Transfer Learning Necessary for Protein Landscape Prediction?`_. + + .. _Is Transfer Learning Necessary for Protein Landscape Prediction?: + https://arxiv.org/pdf/2011.03443.pdf + + Parameters: + input_dim (int): input dimension + hidden_dims (list of int): hidden dimensions + kernel_size (int, optional): size of convolutional kernel + stride (int, optional): stride of convolution + padding (int, optional): padding added to both sides of the input + activation (str or function, optional): activation function + short_cut (bool, optional): use short cut or not + concat_hidden (bool, optional): concat hidden representations from all layers as output + readout (str, optional): readout function. Available functions are ``sum``, ``mean``, ``max`` and ``attention``. + """ + + def __init__(self, input_dim, hidden_dims, kernel_size=3, stride=1, padding=1, + activation='relu', short_cut=False, concat_hidden=False, readout="max"): + super(ProteinConvolutionalNetwork, self).__init__() + if not isinstance(hidden_dims, Sequence): + hidden_dims = [hidden_dims] + self.input_dim = input_dim + self.output_dim = sum(hidden_dims) if concat_hidden else hidden_dims[-1] + self.dims = [input_dim] + list(hidden_dims) + self.short_cut = short_cut + self.concat_hidden = concat_hidden + self.padding_id = input_dim - 1 + + if isinstance(activation, str): + self.activation = getattr(F, activation) + else: + self.activation = activation + + self.layers = nn.ModuleList() + for i in range(len(self.dims) - 1): + self.layers.append( + nn.Conv1d(self.dims[i], self.dims[i+1], kernel_size, stride, padding) + ) + + if readout == "sum": + self.readout = layers.SumReadout("residue") + elif readout == "mean": + self.readout = layers.MeanReadout("residue") + elif readout == "max": + self.readout = layers.MaxReadout("residue") + elif readout == "attention": + self.readout = layers.AttentionReadout(self.output_dim, "residue") + else: + raise ValueError("Unknown readout `%s`" % readout) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the residue representations and the graph representation(s). + + Parameters: + graph (Protein): :math:`n` protein(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``residue_feature`` and ``graph_feature`` fields: + residue representations of shape :math:`(|V_{res}|, d)`, graph representations of shape :math:`(n, d)` + """ + input = graph.residue_feature.float() + input = functional.variadic_to_padded(input, graph.num_residues, value=self.padding_id)[0] + + hiddens = [] + layer_input = input + + for layer in self.layers: + hidden = layer(layer_input.transpose(1, 2)).transpose(1, 2) + hidden = self.activation(hidden) + if self.short_cut and hidden.shape == layer_input.shape: + hidden = hidden + layer_input + hiddens.append(hidden) + layer_input = hidden + + if self.concat_hidden: + hidden = torch.cat(hiddens, dim=-1) + else: + hidden = hiddens[-1] + + residue_feature = functional.padded_to_variadic(hidden, graph.num_residues) + graph_feature = self.readout(graph, residue_feature) + + return { + "graph_feature": graph_feature, + "residue_feature": residue_feature + } diff --git a/build/lib/torchdrug/models/embedding.py b/build/lib/torchdrug/models/embedding.py new file mode 100644 index 00000000..ce8ef09f --- /dev/null +++ b/build/lib/torchdrug/models/embedding.py @@ -0,0 +1,242 @@ +import torch +from torch import nn + +from torchdrug import core +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("models.TransE") +class TransE(nn.Module, core.Configurable): + """ + TransE embedding proposed in `Translating Embeddings for Modeling Multi-relational Data`_. + + .. _Translating Embeddings for Modeling Multi-relational Data: + https://proceedings.neurips.cc/paper/2013/file/1cecc7a77928ca8133fa24680a88d2f9-Paper.pdf + + Parameters: + num_entity (int): number of entities + num_relation (int): number of relations + embedding_dim (int): dimension of embeddings + max_score (float, optional): maximal score for triplets + """ + + def __init__(self, num_entity, num_relation, embedding_dim, max_score=12): + super(TransE, self).__init__() + self.num_entity = num_entity + self.num_relation = num_relation + self.max_score = max_score + + self.entity = nn.Parameter(torch.empty(num_entity, embedding_dim)) + self.relation = nn.Parameter(torch.empty(num_relation, embedding_dim)) + + nn.init.uniform_(self.entity, -self.max_score / embedding_dim, self.max_score / embedding_dim) + nn.init.uniform_(self.relation, -self.max_score / embedding_dim, self.max_score / embedding_dim) + + def forward(self, graph, h_index, t_index, r_index, all_loss=None, metric=None): + """ + Compute the score for each triplet. + + Parameters: + graph (Graph): fact graph + h_index (Tensor): indexes of head entities + t_index (Tensor): indexes of tail entities + r_index (Tensor): indexes of relations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + """ + score = functional.transe_score(self.entity, self.relation, h_index, t_index, r_index) + return self.max_score - score + + +@R.register("models.DistMult") +class DistMult(nn.Module, core.Configurable): + """ + DistMult embedding proposed in `Embedding Entities and Relations for Learning and Inference in Knowledge Bases`_. + + .. _Embedding Entities and Relations for Learning and Inference in Knowledge Bases: + https://arxiv.org/pdf/1412.6575.pdf + + Parameters: + num_entity (int): number of entities + num_relation (int): number of relations + embedding_dim (int): dimension of embeddings + l3_regularization (float, optional): weight for l3 regularization + """ + + def __init__(self, num_entity, num_relation, embedding_dim, l3_regularization=0): + super(DistMult, self).__init__() + self.num_entity = num_entity + self.num_relation = num_relation + self.l3_regularization = l3_regularization + + self.entity = nn.Parameter(torch.empty(num_entity, embedding_dim)) + self.relation = nn.Parameter(torch.empty(num_relation, embedding_dim)) + + nn.init.uniform_(self.entity, -0.5, 0.5) + nn.init.uniform_(self.relation, -0.5, 0.5) + + def forward(self, graph, h_index, t_index, r_index, all_loss=None, metric=None): + """ + Compute the score for each triplet. + + Parameters: + graph (Graph): fact graph + h_index (Tensor): indexes of head entities + t_index (Tensor): indexes of tail entities + r_index (Tensor): indexes of relations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + """ + score = functional.distmult_score(self.entity, self.relation, h_index, t_index, r_index) + + if all_loss is not None and self.l3_regularization > 0: + loss = (self.entity.abs() ** 3).sum() + (self.relation.abs() ** 3).sum() + all_loss += loss * self.l3_regularization + metric["l3 regularization"] = loss / (self.num_entity + self.num_relation) + + return score + + +@R.register("models.ComplEx") +class ComplEx(nn.Module, core.Configurable): + """ + ComplEx embedding proposed in `Complex Embeddings for Simple Link Prediction`_. + + .. _Complex Embeddings for Simple Link Prediction: + http://proceedings.mlr.press/v48/trouillon16.pdf + + Parameters: + num_entity (int): number of entities + num_relation (int): number of relations + embedding_dim (int): dimension of embeddings + l3_regularization (float, optional): weight for l3 regularization + """ + + def __init__(self, num_entity, num_relation, embedding_dim, l3_regularization=0): + super(ComplEx, self).__init__() + self.num_entity = num_entity + self.num_relation = num_relation + self.l3_regularization = l3_regularization + + self.entity = nn.Parameter(torch.empty(num_entity, embedding_dim)) + self.relation = nn.Parameter(torch.empty(num_relation, embedding_dim)) + + nn.init.uniform_(self.entity, -0.5, 0.5) + nn.init.uniform_(self.relation, -0.5, 0.5) + + def forward(self, graph, h_index, t_index, r_index, all_loss=None, metric=None): + """ + Compute the score for triplets. + + Parameters: + graph (Graph): fact graph + h_index (Tensor): indexes of head entities + t_index (Tensor): indexes of tail entities + r_index (Tensor): indexes of relations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + """ + score = functional.complex_score(self.entity, self.relation, h_index, t_index, r_index) + + if all_loss is not None and self.l3_regularization > 0: + loss = (self.entity.abs() ** 3).sum() + (self.relation.abs() ** 3).sum() + all_loss += loss * self.l3_regularization + metric["l3 regularization"] = loss / (self.num_entity + self.num_relation) + + return score + + +@R.register("models.RotatE") +class RotatE(nn.Module, core.Configurable): + """ + RotatE embedding proposed in `RotatE: Knowledge Graph Embedding by Relational Rotation in Complex Space`_. + + .. _RotatE\: Knowledge Graph Embedding by Relational Rotation in Complex Space: + https://arxiv.org/pdf/1902.10197.pdf + + Parameters: + num_entity (int): number of entities + num_relation (int): number of relations + embedding_dim (int): dimension of embeddings + max_score (float, optional): maximal score for triplets + """ + + def __init__(self, num_entity, num_relation, embedding_dim, max_score=12): + super(RotatE, self).__init__() + self.num_entity = num_entity + self.num_relation = num_relation + self.max_score = max_score + + self.entity = nn.Parameter(torch.empty(num_entity, embedding_dim)) + self.relation = nn.Parameter(torch.empty(num_relation, embedding_dim // 2)) + + nn.init.uniform_(self.entity, -max_score * 2 / embedding_dim, max_score * 2 / embedding_dim) + nn.init.uniform_(self.relation, -max_score * 2 / embedding_dim, max_score * 2 / embedding_dim) + pi = torch.acos(torch.zeros(1)).item() * 2 + self.relation_scale = pi * embedding_dim / max_score / 2 + + def forward(self, graph, h_index, t_index, r_index, all_loss=None, metric=None): + """ + Compute the score for each triplet. + + Parameters: + graph (Graph): fact graph + h_index (Tensor): indexes of head entities + t_index (Tensor): indexes of tail entities + r_index (Tensor): indexes of relations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + """ + score = functional.rotate_score(self.entity, self.relation * self.relation_scale, + h_index, t_index, r_index) + return self.max_score - score + + +@R.register("models.SimplE") +class SimplE(nn.Module, core.Configurable): + """ + SimplE embedding proposed in `SimplE Embedding for Link Prediction in Knowledge Graphs`_. + + .. _SimplE Embedding for Link Prediction in Knowledge Graphs: + https://papers.nips.cc/paper/2018/file/b2ab001909a8a6f04b51920306046ce5-Paper.pdf + + Parameters: + num_entity (int): number of entities + num_relation (int): number of relations + embedding_dim (int): dimension of embeddings + l3_regularization (float, optional): maximal score for triplets + """ + + def __init__(self, num_entity, num_relation, embedding_dim, l3_regularization=0): + super(SimplE, self).__init__() + self.num_entity = num_entity + self.num_relation = num_relation + self.l3_regularization = l3_regularization + + self.entity = nn.Parameter(torch.empty(num_entity, embedding_dim)) + self.relation = nn.Parameter(torch.empty(num_relation, embedding_dim)) + + nn.init.uniform_(self.entity, -0.5, 0.5) + nn.init.uniform_(self.relation, -0.5, 0.5) + + def forward(self, graph, h_index, t_index, r_index, all_loss=None, metric=None): + """ + Compute the score for each triplet. + + Parameters: + graph (Graph): fact graph + h_index (Tensor): indexes of head entities + t_index (Tensor): indexes of tail entities + r_index (Tensor): indexes of relations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + """ + score = functional.simple_score(self.entity, self.relation, h_index, t_index, r_index) + + if all_loss is not None and self.l3_regularization > 0: + loss = (self.entity.abs() ** 3).sum() + (self.relation.abs() ** 3).sum() + all_loss += loss * self.l3_regularization + metric["l3 regularization"] = loss / (self.num_entity + self.num_relation) + + return score \ No newline at end of file diff --git a/build/lib/torchdrug/models/esm.py b/build/lib/torchdrug/models/esm.py new file mode 100644 index 00000000..d80aaace --- /dev/null +++ b/build/lib/torchdrug/models/esm.py @@ -0,0 +1,172 @@ +import os +import warnings + +import torch +from torch import nn +import esm + +from torchdrug import core, layers, utils, data +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("models.ESM") +class EvolutionaryScaleModeling(nn.Module, core.Configurable): + """ + The protein language model, Evolutionary Scale Modeling (ESM) proposed in + `Biological Structure and Function Emerge from Scaling Unsupervised Learning to 250 Million Protein Sequences`_. + + .. _Biological Structure and Function Emerge from Scaling Unsupervised Learning to 250 Million Protein Sequences: + https://www.biorxiv.org/content/10.1101/622803v1.full.pdf + + Parameters: + path (str): path to store ESM model weights + model (str, optional): model name. Available model names are ``ESM-1b``, ``ESM-1v`` and ``ESM-1b-regression``. + readout (str, optional): readout function. Available functions are ``sum`` and ``mean``. + """ + + url = { + "ESM-1b": "https://dl.fbaipublicfiles.com/fair-esm/models/esm1b_t33_650M_UR50S.pt", + "ESM-1v": "https://dl.fbaipublicfiles.com/fair-esm/models/esm1v_t33_650M_UR90S_1.pt", + "ESM-1b-regression": + "https://dl.fbaipublicfiles.com/fair-esm/regression/esm1b_t33_650M_UR50S-contact-regression.pt", + "ESM-2-8M": "https://dl.fbaipublicfiles.com/fair-esm/models/esm2_t6_8M_UR50D.pt", + "ESM-2-35M": "https://dl.fbaipublicfiles.com/fair-esm/models/esm2_t12_35M_UR50D.pt", + "ESM-2-150M": "https://dl.fbaipublicfiles.com/fair-esm/models/esm2_t30_150M_UR50D.pt", + "ESM-2-650M": "https://dl.fbaipublicfiles.com/fair-esm/models/esm2_t33_650M_UR50D.pt", + "ESM-2-3B": "https://dl.fbaipublicfiles.com/fair-esm/models/esm2_t36_3B_UR50D.pt", + "ESM-2-15B": "https://dl.fbaipublicfiles.com/fair-esm/models/esm2_t48_15B_UR50D.pt", + } + + md5 = { + "ESM-1b": "ba8914bc3358cae2254ebc8874ee67f6", + "ESM-1v": "1f04c2d2636b02b544ecb5fbbef8fefd", + "ESM-1b-regression": "e7fe626dfd516fb6824bd1d30192bdb1", + "ESM-2-8M": "8039fc9cee7f71cd2633b13b5a38ff50", + "ESM-2-35M": "a894ddb31522e511e1273abb23b5f974", + "ESM-2-150M": "229fcf8f9f3d4d442215662ca001b906", + "ESM-2-650M": "ba6d997e29db07a2ad9dca20e024b102", + "ESM-2-3B": "d37a0d0dbe7431e48a72072b9180b16b", + "ESM-2-15B": "af61a9c0b792ae50e244cde443b7f4ac", + } + + output_dim = { + "ESM-1b": 1280, + "ESM-1v": 1280, + "ESM-2-8M": 320, + "ESM-2-35M": 480, + "ESM-2-150M": 640, + "ESM-2-650M": 1280, + "ESM-2-3B": 2560, + "ESM-2-15B": 5120, + } + + num_layer = { + "ESM-1b": 33, + "ESM-1v": 33, + "ESM-2-8M": 6, + "ESM-2-35M": 12, + "ESM-2-150M": 30, + "ESM-2-650M": 33, + "ESM-2-3B": 36, + "ESM-2-15B": 48, + } + + max_input_length = 1024 - 2 + + def __init__(self, path, model="ESM-1b", readout="mean"): + super(EvolutionaryScaleModeling, self).__init__() + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + + _model, alphabet = self.load_weight(path, model) + self.alphabet = alphabet + mapping = self.construct_mapping(alphabet) + self.output_dim = self.output_dim[model] + self.model = _model + self.alphabet = alphabet + self.repr_layer = self.num_layer[model] + self.register_buffer("mapping", mapping) + + if readout == "sum": + self.readout = layers.SumReadout("residue") + elif readout == "mean": + self.readout = layers.MeanReadout("residue") + else: + raise ValueError("Unknown readout `%s`" % readout) + + def load_weight(self, path, model): + if model not in self.url: + raise ValueError("Unknown model `%s`" % model) + model_file = utils.download(self.url[model], path, md5=self.md5[model]) + model_data = torch.load(model_file, map_location="cpu") + if model != "ESM-1v" and not model.startswith("ESM-2"): + regression_model = "%s-regression" % model + regression_file = utils.download(self.url[regression_model], path, md5=self.md5[regression_model]) + regression_data = torch.load(regression_file, map_location="cpu") + else: + regression_data = None + model_name = os.path.basename(self.url[model]) + return esm.pretrained.load_model_and_alphabet_core(model_name, model_data, regression_data) + + def construct_mapping(self, alphabet): + mapping = [-1] * max(len(data.Protein.id2residue_symbol), len(self.alphabet)) + for i, token in data.Protein.id2residue_symbol.items(): + mapping[i] = alphabet.get_idx(token) + mapping = torch.tensor(mapping) + return mapping + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the residue representations and the graph representation(s). + + Parameters: + graph (Protein): :math:`n` protein(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``residue_feature`` and ``graph_feature`` fields: + residue representations of shape :math:`(|V_{res}|, d)`, graph representations of shape :math:`(n, d)` + """ + input = graph.residue_type + input = self.mapping[input] + input[input == -1] = graph.residue_type[input == -1] + size = graph.num_residues + if (size > self.max_input_length).any(): + warnings.warn("ESM can only encode proteins within %d residues. Truncate the input to fit into ESM." + % self.max_input_length) + starts = size.cumsum(0) - size + size = size.clamp(max=self.max_input_length) + ends = starts + size + mask = functional.multi_slice_mask(starts, ends, graph.num_residue) + input = input[mask] + graph = graph.subresidue(mask) + size_ext = size + if self.alphabet.prepend_bos: + bos = torch.ones(graph.batch_size, dtype=torch.long, device=self.device) * self.alphabet.cls_idx + input, size_ext = functional._extend(bos, torch.ones_like(size_ext), input, size_ext) + if self.alphabet.append_eos: + eos = torch.ones(graph.batch_size, dtype=torch.long, device=self.device) * self.alphabet.eos_idx + input, size_ext = functional._extend(input, size_ext, eos, torch.ones_like(size_ext)) + input = functional.variadic_to_padded(input, size_ext, value=self.alphabet.padding_idx)[0] + + output = self.model(input, repr_layers=[self.repr_layer]) + residue_feature = output["representations"][self.repr_layer] + + residue_feature = functional.padded_to_variadic(residue_feature, size_ext) + starts = size_ext.cumsum(0) - size_ext + if self.alphabet.prepend_bos: + starts = starts + 1 + ends = starts + size + mask = functional.multi_slice_mask(starts, ends, len(residue_feature)) + residue_feature = residue_feature[mask] + graph_feature = self.readout(graph, residue_feature) + + return { + "graph_feature": graph_feature, + "residue_feature": residue_feature + } diff --git a/build/lib/torchdrug/models/flow.py b/build/lib/torchdrug/models/flow.py new file mode 100644 index 00000000..a1184f90 --- /dev/null +++ b/build/lib/torchdrug/models/flow.py @@ -0,0 +1,121 @@ +import torch +from torch import nn + +from torchdrug import core, layers +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("models.GraphAF") +class GraphAutoregressiveFlow(nn.Module, core.Configurable): + """ + Graph autoregressive flow proposed in `GraphAF: a Flow-based Autoregressive Model for Molecular Graph Generation`_. + + .. _GraphAF\: a Flow-based Autoregressive Model for Molecular Graph Generation: + https://arxiv.org/pdf/2001.09382.pdf + + Parameters: + model (nn.Module): graph representation model + prior (nn.Module): prior distribution + use_edge (bool, optional): use edge or not + num_flow_layer (int, optional): number of conditional flow layers + num_mlp_layer (int, optional): number of MLP layers in each conditional flow + dequantization_noise (float, optional): scale of dequantization noise + """ + + def __init__(self, model, prior, use_edge=False, num_layer=6, num_mlp_layer=2, dequantization_noise=0.9): + super(GraphAutoregressiveFlow, self).__init__() + self.model = model + self.prior = prior + self.use_edge = use_edge + self.input_dim = self.output_dim = prior.dim + self.dequantization_noise = dequantization_noise + assert dequantization_noise < 1 + + self.layers = nn.ModuleList() + for i in range(num_layer): + condition_dim = model.output_dim * (3 if use_edge else 1) + self.layers.append(layers.ConditionalFlow(self.input_dim, condition_dim, + [model.output_dim] * (num_mlp_layer - 1))) + + def _standarize_edge(self, graph, edge): + if edge is not None: + edge = edge.clone() + if (edge[:, :2] >= graph.num_nodes.unsqueeze(-1)).any(): + raise ValueError("Edge index exceeds the number of nodes in the graph") + edge[:, :2] += (graph.num_cum_nodes - graph.num_nodes).unsqueeze(-1) + return edge + + def forward(self, graph, input, edge=None, all_loss=None, metric=None): + """ + Compute the log-likelihood for the input given the graph(s). + + Parameters: + graph (Graph): :math:`n` graph(s) + input (Tensor): discrete data of shape :math:`(n,)` + edge (Tensor, optional): edge list of shape :math:`(n, 2)`. + If specified, additionally condition on the edge for each input. + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + """ + if self.use_edge and edge is None: + raise ValueError("`use_edge` is true, but no edge is provided") + + edge = self._standarize_edge(graph, edge) + + node_feature = functional.one_hot(graph.atom_type, self.model.input_dim) + feature = self.model(graph, node_feature, all_loss, metric) + node_feature = feature["node_feature"] + graph_feature = feature["graph_feature"] + if self.use_edge: + condition = torch.cat([node_feature[edge], graph_feature.unsqueeze(1)], dim=1).flatten(1) + else: + condition = graph_feature + + x = functional.one_hot(input, self.input_dim) + x = x + self.dequantization_noise * torch.rand_like(x) + + log_dets = [] + for layer in self.layers: + x, log_det = layer(x, condition) + log_dets.append(log_det) + + log_prior = self.prior(x) + log_det = torch.stack(log_dets).sum(dim=0) + log_likelihood = log_prior + log_det + log_likelihood = log_likelihood.sum(dim=-1) + + return log_likelihood # (batch_size,) + + def sample(self, graph, edge=None, all_loss=None, metric=None): + """ + Sample discrete data based on the given graph(s). + + Parameters: + graph (Graph): :math:`n` graph(s) + edge (Tensor, optional): edge list of shape :math:`(n, 2)`. + If specified, additionally condition on the edge for each input. + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + """ + if self.use_edge and edge is None: + raise ValueError("`use_edge` is true, but no edge is provided") + + edge = self._standarize_edge(graph, edge) + + node_feature = functional.one_hot(graph.atom_type, self.model.input_dim) + feature = self.model(graph, node_feature, all_loss, metric) + node_feature = feature["node_feature"] + graph_feature = feature["graph_feature"] + if self.use_edge: + condition = torch.cat([node_feature[edge], graph_feature.unsqueeze(1)], dim=1).flatten(1) + else: + condition = graph_feature + + x = self.prior.sample(len(graph)) + for layer in self.layers[::-1]: + x, log_det = layer.reverse(x, condition) + + output = x.argmax(dim=-1) + + return output # (batch_size,) \ No newline at end of file diff --git a/build/lib/torchdrug/models/gat.py b/build/lib/torchdrug/models/gat.py new file mode 100644 index 00000000..9154fcce --- /dev/null +++ b/build/lib/torchdrug/models/gat.py @@ -0,0 +1,88 @@ +from collections.abc import Sequence + +import torch +from torch import nn + +from torchdrug import core, layers +from torchdrug.core import Registry as R + + +@R.register("models.GAT") +class GraphAttentionNetwork(nn.Module, core.Configurable): + """ + Graph Attention Network proposed in `Graph Attention Networks`_. + + .. _Graph Attention Networks: + https://arxiv.org/pdf/1710.10903.pdf + + Parameters: + input_dim (int): input dimension + hidden_dims (list of int): hidden dimensions + edge_input_dim (int, optional): dimension of edge features + num_head (int, optional): number of attention heads + negative_slope (float, optional): negative slope of leaky relu activation + short_cut (bool, optional): use short cut or not + batch_norm (bool, optional): apply batch normalization or not + activation (str or function, optional): activation function + concat_hidden (bool, optional): concat hidden representations from all layers as output + readout (str, optional): readout function. Available functions are ``sum`` and ``mean``. + """ + + def __init__(self, input_dim, hidden_dims, edge_input_dim=None, num_head=1, negative_slope=0.2, short_cut=False, + batch_norm=False, activation="relu", concat_hidden=False, readout="sum"): + super(GraphAttentionNetwork, self).__init__() + + if not isinstance(hidden_dims, Sequence): + hidden_dims = [hidden_dims] + self.input_dim = input_dim + self.output_dim = sum(hidden_dims) if concat_hidden else hidden_dims[-1] + self.dims = [input_dim] + list(hidden_dims) + self.short_cut = short_cut + self.concat_hidden = concat_hidden + + self.layers = nn.ModuleList() + for i in range(len(self.dims) - 1): + self.layers.append(layers.GraphAttentionConv(self.dims[i], self.dims[i + 1], edge_input_dim, num_head, + negative_slope, batch_norm, activation)) + + if readout == "sum": + self.readout = layers.SumReadout() + elif readout == "mean": + self.readout = layers.MeanReadout() + else: + raise ValueError("Unknown readout `%s`" % readout) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the node representations and the graph representation(s). + + Parameters: + graph (Graph): :math:`n` graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``node_feature`` and ``graph_feature`` fields: + node representations of shape :math:`(|V|, d)`, graph representations of shape :math:`(n, d)` + """ + hiddens = [] + layer_input = input + + for layer in self.layers: + hidden = layer(graph, layer_input) + if self.short_cut and hidden.shape == layer_input.shape: + hidden = hidden + layer_input + hiddens.append(hidden) + layer_input = hidden + + if self.concat_hidden: + node_feature = torch.cat(hiddens, dim=-1) + else: + node_feature = hiddens[-1] + graph_feature = self.readout(graph, node_feature) + + return { + "graph_feature": graph_feature, + "node_feature": node_feature + } \ No newline at end of file diff --git a/build/lib/torchdrug/models/gcn.py b/build/lib/torchdrug/models/gcn.py new file mode 100644 index 00000000..5415d346 --- /dev/null +++ b/build/lib/torchdrug/models/gcn.py @@ -0,0 +1,168 @@ +from collections.abc import Sequence + +import torch +from torch import nn + +from torchdrug import core, layers +from torchdrug.core import Registry as R + + +@R.register("models.GCN") +class GraphConvolutionalNetwork(nn.Module, core.Configurable): + """ + Graph Convolutional Network proposed in `Semi-Supervised Classification with Graph Convolutional Networks`_. + + .. _Semi-Supervised Classification with Graph Convolutional Networks: + https://arxiv.org/pdf/1609.02907.pdf + + Parameters: + input_dim (int): input dimension + hidden_dims (list of int): hidden dimensions + edge_input_dim (int, optional): dimension of edge features + short_cut (bool, optional): use short cut or not + batch_norm (bool, optional): apply batch normalization or not + activation (str or function, optional): activation function + concat_hidden (bool, optional): concat hidden representations from all layers as output + readout (str, optional): readout function. Available functions are ``sum`` and ``mean``. + """ + + def __init__(self, input_dim, hidden_dims, edge_input_dim=None, short_cut=False, batch_norm=False, + activation="relu", concat_hidden=False, readout="sum"): + super(GraphConvolutionalNetwork, self).__init__() + + if not isinstance(hidden_dims, Sequence): + hidden_dims = [hidden_dims] + self.input_dim = input_dim + self.output_dim = sum(hidden_dims) if concat_hidden else hidden_dims[-1] + self.dims = [input_dim] + list(hidden_dims) + self.short_cut = short_cut + self.concat_hidden = concat_hidden + + self.layers = nn.ModuleList() + for i in range(len(self.dims) - 1): + self.layers.append(layers.GraphConv(self.dims[i], self.dims[i + 1], edge_input_dim, batch_norm, activation)) + + if readout == "sum": + self.readout = layers.SumReadout() + elif readout == "mean": + self.readout = layers.MeanReadout() + else: + raise ValueError("Unknown readout `%s`" % readout) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the node representations and the graph representation(s). + + Parameters: + graph (Graph): :math:`n` graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``node_feature`` and ``graph_feature`` fields: + node representations of shape :math:`(|V|, d)`, graph representations of shape :math:`(n, d)` + """ + hiddens = [] + layer_input = input + + for layer in self.layers: + hidden = layer(graph, layer_input) + if self.short_cut and hidden.shape == layer_input.shape: + hidden = hidden + layer_input + hiddens.append(hidden) + layer_input = hidden + + if self.concat_hidden: + node_feature = torch.cat(hiddens, dim=-1) + else: + node_feature = hiddens[-1] + graph_feature = self.readout(graph, node_feature) + + return { + "graph_feature": graph_feature, + "node_feature": node_feature + } + + +@R.register("models.RGCN") +class RelationalGraphConvolutionalNetwork(nn.Module, core.Configurable): + """ + Relational Graph Convolutional Network proposed in `Modeling Relational Data with Graph Convolutional Networks?`_. + + .. _Modeling Relational Data with Graph Convolutional Networks?: + https://arxiv.org/pdf/1703.06103.pdf + + Parameters: + input_dim (int): input dimension + hidden_dims (list of int): hidden dimensions + num_relation (int): number of relations + edge_input_dim (int, optional): dimension of edge features + short_cut (bool, optional): use short cut or not + batch_norm (bool, optional): apply batch normalization or not + activation (str or function, optional): activation function + concat_hidden (bool, optional): concat hidden representations from all layers as output + readout (str, optional): readout function. Available functions are ``sum`` and ``mean``. + """ + + def __init__(self, input_dim, hidden_dims, num_relation, edge_input_dim=None, short_cut=False, batch_norm=False, + activation="relu", concat_hidden=False, readout="sum"): + super(RelationalGraphConvolutionalNetwork, self).__init__() + + if not isinstance(hidden_dims, Sequence): + hidden_dims = [hidden_dims] + self.input_dim = input_dim + self.output_dim = hidden_dims[-1] * (len(hidden_dims) if concat_hidden else 1) + self.dims = [input_dim] + list(hidden_dims) + self.num_relation = num_relation + self.short_cut = short_cut + self.concat_hidden = concat_hidden + + self.layers = nn.ModuleList() + for i in range(len(self.dims) - 1): + self.layers.append(layers.RelationalGraphConv(self.dims[i], self.dims[i + 1], num_relation, edge_input_dim, + batch_norm, activation)) + + if readout == "sum": + self.readout = layers.SumReadout() + elif readout == "mean": + self.readout = layers.MeanReadout() + else: + raise ValueError("Unknown readout `%s`" % readout) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the node representations and the graph representation(s). + + Require the graph(s) to have the same number of relations as this module. + + Parameters: + graph (Graph): :math:`n` graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``node_feature`` and ``graph_feature`` fields: + node representations of shape :math:`(|V|, d)`, graph representations of shape :math:`(n, d)` + """ + hiddens = [] + layer_input = input + + for layer in self.layers: + hidden = layer(graph, layer_input) + if self.short_cut and hidden.shape == layer_input.shape: + hidden = hidden + layer_input + hiddens.append(hidden) + layer_input = hidden + + if self.concat_hidden: + node_feature = torch.cat(hiddens, dim=-1) + else: + node_feature = hiddens[-1] + graph_feature = self.readout(graph, node_feature) + + return { + "graph_feature": graph_feature, + "node_feature": node_feature + } \ No newline at end of file diff --git a/build/lib/torchdrug/models/gearnet.py b/build/lib/torchdrug/models/gearnet.py new file mode 100644 index 00000000..82fe0224 --- /dev/null +++ b/build/lib/torchdrug/models/gearnet.py @@ -0,0 +1,123 @@ +from collections.abc import Sequence + +import torch +from torch import nn +from torch_scatter import scatter_add + +from torchdrug import core, layers +from torchdrug.core import Registry as R + + +@R.register("models.GearNet") +class GeometryAwareRelationalGraphNeuralNetwork(nn.Module, core.Configurable): + """ + Geometry Aware Relational Graph Neural Network proposed in + `Protein Representation Learning by Geometric Structure Pretraining`_. + + .. _Protein Representation Learning by Geometric Structure Pretraining: + https://arxiv.org/pdf/2203.06125.pdf + + Parameters: + input_dim (int): input dimension + hidden_dims (list of int): hidden dimensions + num_relation (int): number of relations + edge_input_dim (int, optional): dimension of edge features + num_angle_bin (int, optional): number of bins to discretize angles between edges. + The discretized angles are used as relations in edge message passing. + If not provided, edge message passing is disabled. + short_cut (bool, optional): use short cut or not + batch_norm (bool, optional): apply batch normalization or not + activation (str or function, optional): activation function + concat_hidden (bool, optional): concat hidden representations from all layers as output + readout (str, optional): readout function. Available functions are ``sum`` and ``mean``. + """ + + def __init__(self, input_dim, hidden_dims, num_relation, edge_input_dim=None, num_angle_bin=None, + short_cut=False, batch_norm=False, activation="relu", concat_hidden=False, readout="sum"): + super(GeometryAwareRelationalGraphNeuralNetwork, self).__init__() + + if not isinstance(hidden_dims, Sequence): + hidden_dims = [hidden_dims] + self.input_dim = input_dim + self.output_dim = sum(hidden_dims) if concat_hidden else hidden_dims[-1] + self.dims = [input_dim] + list(hidden_dims) + self.edge_dims = [edge_input_dim] + self.dims[:-1] + self.num_relation = num_relation + self.num_angle_bin = num_angle_bin + self.short_cut = short_cut + self.concat_hidden = concat_hidden + self.batch_norm = batch_norm + + self.layers = nn.ModuleList() + for i in range(len(self.dims) - 1): + self.layers.append(layers.GeometricRelationalGraphConv(self.dims[i], self.dims[i + 1], num_relation, + None, batch_norm, activation)) + if num_angle_bin: + self.spatial_line_graph = layers.SpatialLineGraph(num_angle_bin) + self.edge_layers = nn.ModuleList() + for i in range(len(self.edge_dims) - 1): + self.edge_layers.append(layers.GeometricRelationalGraphConv( + self.edge_dims[i], self.edge_dims[i + 1], num_angle_bin, None, batch_norm, activation)) + + if batch_norm: + self.batch_norms = nn.ModuleList() + for i in range(len(self.dims) - 1): + self.batch_norms.append(nn.BatchNorm1d(self.dims[i + 1])) + + if readout == "sum": + self.readout = layers.SumReadout() + elif readout == "mean": + self.readout = layers.MeanReadout() + else: + raise ValueError("Unknown readout `%s`" % readout) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the node representations and the graph representation(s). + + Parameters: + graph (Graph): :math:`n` graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``node_feature`` and ``graph_feature`` fields: + node representations of shape :math:`(|V|, d)`, graph representations of shape :math:`(n, d)` + """ + hiddens = [] + layer_input = input + if self.num_angle_bin: + line_graph = self.spatial_line_graph(graph) + edge_input = line_graph.node_feature.float() + + for i in range(len(self.layers)): + hidden = self.layers[i](graph, layer_input) + if self.short_cut and hidden.shape == layer_input.shape: + hidden = hidden + layer_input + if self.num_angle_bin: + edge_hidden = self.edge_layers[i](line_graph, edge_input) + edge_weight = graph.edge_weight.unsqueeze(-1) + node_out = graph.edge_list[:, 1] * self.num_relation + graph.edge_list[:, 2] + update = scatter_add(edge_hidden * edge_weight, node_out, dim=0, + dim_size=graph.num_node * self.num_relation) + update = update.view(graph.num_node, self.num_relation * edge_hidden.shape[1]) + update = self.layers[i].linear(update) + update = self.layers[i].activation(update) + hidden = hidden + update + edge_input = edge_hidden + if self.batch_norm: + hidden = self.batch_norms[i](hidden) + hiddens.append(hidden) + layer_input = hidden + + if self.concat_hidden: + node_feature = torch.cat(hiddens, dim=-1) + else: + node_feature = hiddens[-1] + graph_feature = self.readout(graph, node_feature) + + return { + "graph_feature": graph_feature, + "node_feature": node_feature + } \ No newline at end of file diff --git a/build/lib/torchdrug/models/gin.py b/build/lib/torchdrug/models/gin.py new file mode 100644 index 00000000..990bb4b2 --- /dev/null +++ b/build/lib/torchdrug/models/gin.py @@ -0,0 +1,91 @@ +from collections.abc import Sequence + +import torch +from torch import nn + +from torchdrug import core, layers +from torchdrug.core import Registry as R + + +@R.register("models.GIN") +class GraphIsomorphismNetwork(nn.Module, core.Configurable): + """ + Graph Ismorphism Network proposed in `How Powerful are Graph Neural Networks?`_ + + .. _How Powerful are Graph Neural Networks?: + https://arxiv.org/pdf/1810.00826.pdf + + Parameters: + input_dim (int): input dimension + hidden_dims (list of int): hidden dimensions + edge_input_dim (int, optional): dimension of edge features + num_mlp_layer (int, optional): number of MLP layers + eps (int, optional): initial epsilon + learn_eps (bool, optional): learn epsilon or not + short_cut (bool, optional): use short cut or not + batch_norm (bool, optional): apply batch normalization or not + activation (str or function, optional): activation function + concat_hidden (bool, optional): concat hidden representations from all layers as output + readout (str, optional): readout function. Available functions are ``sum`` and ``mean``. + """ + + def __init__(self, input_dim, hidden_dims, edge_input_dim=None, num_mlp_layer=2, eps=0, learn_eps=False, + short_cut=False, batch_norm=False, activation="relu", concat_hidden=False, + readout="sum"): + super(GraphIsomorphismNetwork, self).__init__() + + if not isinstance(hidden_dims, Sequence): + hidden_dims = [hidden_dims] + self.input_dim = input_dim + self.output_dim = sum(hidden_dims) if concat_hidden else hidden_dims[-1] + self.dims = [input_dim] + list(hidden_dims) + self.short_cut = short_cut + self.concat_hidden = concat_hidden + + self.layers = nn.ModuleList() + for i in range(len(self.dims) - 1): + layer_hidden_dims = [self.dims[i + 1]] * (num_mlp_layer - 1) + self.layers.append(layers.GraphIsomorphismConv(self.dims[i], self.dims[i + 1], edge_input_dim, + layer_hidden_dims, eps, learn_eps, batch_norm, activation)) + + if readout == "sum": + self.readout = layers.SumReadout() + elif readout == "mean": + self.readout = layers.MeanReadout() + else: + raise ValueError("Unknown readout `%s`" % readout) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the node representations and the graph representation(s). + + Parameters: + graph (Graph): :math:`n` graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``node_feature`` and ``graph_feature`` fields: + node representations of shape :math:`(|V|, d)`, graph representations of shape :math:`(n, d)` + """ + hiddens = [] + layer_input = input + + for layer in self.layers: + hidden = layer(graph, layer_input) + if self.short_cut and hidden.shape == layer_input.shape: + hidden = hidden + layer_input + hiddens.append(hidden) + layer_input = hidden + + if self.concat_hidden: + node_feature = torch.cat(hiddens, dim=-1) + else: + node_feature = hiddens[-1] + graph_feature = self.readout(graph, node_feature) + + return { + "graph_feature": graph_feature, + "node_feature": node_feature + } \ No newline at end of file diff --git a/build/lib/torchdrug/models/infograph.py b/build/lib/torchdrug/models/infograph.py new file mode 100644 index 00000000..935845d7 --- /dev/null +++ b/build/lib/torchdrug/models/infograph.py @@ -0,0 +1,167 @@ +import copy +import random + +import torch +from torch import nn +from torch.nn import functional as F + +from torchdrug import core, layers +from torchdrug.core import Registry as R + + +@R.register("models.InfoGraph") +class InfoGraph(nn.Module, core.Configurable): + """ + InfoGraph proposed in + `InfoGraph: Unsupervised and Semi-supervised Graph-Level Representation Learning via Mutual Information + Maximization`_. + + .. _InfoGraph\: + Unsupervised and Semi-supervised Graph-Level Representation Learning via Mutual Information Maximization: + https://arxiv.org/pdf/1908.01000.pdf + + Parameters: + model (nn.Module): node & graph representation model + num_mlp_layer (int, optional): number of MLP layers in mutual information estimators + activation (str or function, optional): activation function + loss_weight (float, optional): weight of both unsupervised & transfer losses + separate_model (bool, optional): separate supervised and unsupervised encoders. + If true, the unsupervised loss will be applied on a separate encoder, + and a transfer loss is applied between the two encoders. + """ + + def __init__(self, model, num_mlp_layer=2, activation="relu", loss_weight=1, separate_model=False): + super(InfoGraph, self).__init__() + self.model = model + self.separate_model = separate_model + self.loss_weight = loss_weight + self.output_dim = self.model.output_dim + + if separate_model: + self.unsupervised_model = copy.deepcopy(model) + self.transfer_mi = layers.MutualInformation(model.output_dim, num_mlp_layer, activation) + else: + self.unsupervised_model = model + self.unsupervised_mi = layers.MutualInformation(model.output_dim, num_mlp_layer, activation) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the node representations and the graph representation(s). + Add the mutual information between graph and nodes to the loss. + + Parameters: + graph (Graph): :math:`n` graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``node_feature`` and ``graph_feature`` fields: + node representations of shape :math:`(|V|, d)`, graph representations of shape :math:`(n, d)` + """ + output = self.model(graph, input) + + if all_loss is not None: + if self.separate_model: + unsupervised_output = self.unsupervised_model(graph, input) + mutual_info = self.transfer_mi(output["graph_feature"], unsupervised_output["graph_feature"]) + + metric["distillation mutual information"] = mutual_info + if self.loss_weight > 0: + all_loss -= mutual_info * self.loss_weight + else: + unsupervised_output = output + + graph_index = graph.node2graph + node_index = torch.arange(graph.num_node, device=graph.device) + pair_index = torch.stack([graph_index, node_index], dim=-1) + + mutual_info = self.unsupervised_mi(unsupervised_output["graph_feature"], + unsupervised_output["node_feature"], pair_index) + + metric["graph-node mutual information"] = mutual_info + if self.loss_weight > 0: + all_loss -= mutual_info * self.loss_weight + + return output + + +@R.register("models.MultiviewContrast") +class MultiviewContrast(nn.Module, core.Configurable): + """ + Multiview Contrast proposed in `Protein Representation Learning by Geometric Structure Pretraining`_. + + .. _Protein Representation Learning by Geometric Structure Pretraining: + https://arxiv.org/pdf/2203.06125.pdf + + Parameters: + model (nn.Module): node & graph representation model + crop_funcs (list of nn.Module): list of cropping functions + noise_funcs (list of nn.Module): list of noise functions + num_mlp_layer (int, optional): number of MLP layers in mutual information estimators + activation (str or function, optional): activation function + tau (float, optional): temperature in InfoNCE loss + """ + + eps = 1e-10 + + def __init__(self, model, crop_funcs, noise_funcs, num_mlp_layer=2, activation="relu", tau=0.07): + super(MultiviewContrast, self).__init__() + self.model = model + self.crop_funcs = crop_funcs + self.noise_funcs = noise_funcs + self.tau = tau + + self.mlp = layers.MLP(model.output_dim, [model.output_dim] * num_mlp_layer, activation=activation) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the graph representations of two augmented views. + Each view is generated by randomly picking a cropping function and a noise function. + Add the mutual information between two augmented views to the loss. + + Parameters: + graph (Graph): :math:`n` graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``node_feature1``, ``node_feature2``, ``graph_feature1`` and ``graph_feature2`` fields: + node representations of shape :math:`(|V|, d)`, graph representations of shape :math:`(n, d)` + for two augmented views respectively + """ + # Get two augmented views + graph = copy.copy(graph) + if graph.view == "residue": + with graph.residue(): + graph.input = input + else: + with graph.atom(): + graph.input = input + crop_func1, noise_func1 = random.sample(self.crop_funcs, 1)[0], random.sample(self.noise_funcs, 1)[0] + graph1 = crop_func1(graph) + graph1 = noise_func1(graph1) + output1 = self.model(graph1, graph1.input) + + crop_func2, noise_func2 = random.sample(self.crop_funcs, 1)[0], random.sample(self.noise_funcs, 1)[0] + graph2 = crop_func2(graph) + graph2 = noise_func2(graph2) + output2 = self.model(graph2, graph2.input) + + # Compute mutual information loss + if all_loss is not None: + x = self.mlp(output1["graph_feature"]) + y = self.mlp(output2["graph_feature"]) + + score = F.cosine_similarity(x.unsqueeze(1), y.unsqueeze(0), dim=-1) + score = score / self.tau + is_positive = torch.diag(torch.ones(len(x), dtype=torch.bool, device=self.device)) + mutual_info = (score[is_positive] - score.logsumexp(dim=-1)).mean() + + metric["multiview mutual information"] = mutual_info + all_loss -= mutual_info + + output = {"node_feature1": output1["node_feature"], "graph_feature1": output1["graph_feature"], + "node_feature2": output2["node_feature"], "graph_feature2": output2["graph_feature"]} + return output diff --git a/build/lib/torchdrug/models/kbgat.py b/build/lib/torchdrug/models/kbgat.py new file mode 100644 index 00000000..4a4a44b1 --- /dev/null +++ b/build/lib/torchdrug/models/kbgat.py @@ -0,0 +1,62 @@ +import torch +from torch import nn + +from torchdrug import core, models, utils +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("models.KBGAT") +@utils.copy_args(models.GraphAttentionNetwork) +class KnowledgeBaseGraphAttentionNetwork(models.GraphAttentionNetwork, core.Configurable): + """ + Knowledge Base Graph Attention Network proposed in + `Learning Attention-based Embeddings for Relation Prediction in Knowledge Graphs`_. + + .. _Learning Attention-based Embeddings for Relation Prediction in Knowledge Graphs: + https://arxiv.org/pdf/1906.01195.pdf + + Parameters: + num_entity (int): number of entities + num_relation (int): number of relations + embedding_dim (int): dimension of embeddings + hidden_dims (list of int): hidden dimensions + max_score (float, optional): maximal score for triplets + **kwargs + """ + + def __init__(self, num_entity, num_relation, embedding_dim, hidden_dims, max_score=12, **kwargs): + super(KnowledgeBaseGraphAttentionNetwork, self).__init__(embedding_dim, hidden_dims, embedding_dim, **kwargs) + self.num_entity = num_entity + self.num_relation = num_relation + self.max_score = max_score + + self.linear = nn.Linear(self.output_dim, embedding_dim) + self.output_dim = embedding_dim + + self.entity = nn.Parameter(torch.zeros(num_entity, embedding_dim)) + self.relation = nn.Parameter(torch.zeros(num_relation, embedding_dim)) + + nn.init.uniform_(self.entity, -max_score / embedding_dim, max_score / embedding_dim) + nn.init.uniform_(self.relation, -max_score / embedding_dim, max_score / embedding_dim) + + def forward(self, graph, h_index, t_index, r_index, all_loss=None, metric=None): + """ + Compute the score for triplets. + + Parameters: + graph (Graph): fact graph + h_index (Tensor): indexes of head entities + t_index (Tensor): indexes of tail entities + r_index (Tensor): indexes of relations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + """ + with graph.edge(): + graph.edge_feature = self.relation[graph.edge_list[:, 2]].detach() + + output = super(KnowledgeBaseGraphAttentionNetwork, self).forward(graph, self.entity, all_loss, metric) + entity = self.linear(output["node_feature"]) + score = functional.transe_score(entity, self.relation, h_index, t_index, r_index) + return self.max_score - score + diff --git a/build/lib/torchdrug/models/lstm.py b/build/lib/torchdrug/models/lstm.py new file mode 100644 index 00000000..eab1406b --- /dev/null +++ b/build/lib/torchdrug/models/lstm.py @@ -0,0 +1,90 @@ +from torch import nn +from torch.nn import functional as F + +from torchdrug import core +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("models.ProteinLSTM") +class ProteinLSTM(nn.Module, core.Configurable): + """ + Protein LSTM proposed in `Evaluating Protein Transfer Learning with TAPE`_. + + .. _Evaluating Protein Transfer Learning with TAPE: + https://arxiv.org/pdf/1906.08230.pdf + + Parameters: + input_dim (int): input dimension + hidden_dim (int, optional): hidden dimension + num_layers (int, optional): number of LSTM layers + activation (str or function, optional): activation function + layer_norm (bool, optional): apply layer normalization or not + dropout (float, optional): dropout ratio of input features + """ + + def __init__(self, input_dim, hidden_dim, num_layers, activation='tanh', layer_norm=False, + dropout=0): + super(ProteinLSTM, self).__init__() + self.input_dim = input_dim + self.output_dim = hidden_dim # output_dim for node feature is 2 * hidden_dim + self.node_output_dim = 2 * hidden_dim + self.num_layers = num_layers + self.padding_id = input_dim - 1 + + self.embedding = nn.Linear(input_dim, hidden_dim) + if layer_norm: + self.layer_norm = nn.LayerNorm(hidden_dim) + else: + self.layer_norm = None + if dropout: + self.dropout = nn.Dropout(dropout) + else: + self.dropout = None + if isinstance(activation, str): + self.activation = getattr(F, activation) + else: + self.activation = activation + + self.lstm = nn.LSTM(hidden_dim, hidden_dim, num_layers, batch_first=True, dropout=dropout, + bidirectional=True) + + self.reweight = nn.Linear(2 * num_layers, 1) + self.linear = nn.Linear(hidden_dim, hidden_dim) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the residue representations and the graph representation(s). + + Parameters: + graph (Protein): :math:`n` protein(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``residue_feature`` and ``graph_feature`` fields: + residue representations of shape :math:`(|V_{res}|, d)`, graph representations of shape :math:`(n, d)` + """ + input = graph.residue_feature.float() + input = functional.variadic_to_padded(input, graph.num_residues, value=self.padding_id)[0] + + input = self.embedding(input) + if self.layer_norm: + input = self.layer_norm(input) + if self.dropout: + input = self.dropout(input) + + output, hidden = self.lstm(input) + + residue_feature = functional.padded_to_variadic(output, graph.num_residues) + + # (2 * num_layer, B, d) + graph_feature = self.reweight(hidden[0].permute(1, 2, 0)).squeeze(-1) + graph_feature = self.linear(graph_feature) + graph_feature = self.activation(graph_feature) + + return { + "graph_feature": graph_feature, + "residue_feature": residue_feature + } diff --git a/build/lib/torchdrug/models/mpnn.py b/build/lib/torchdrug/models/mpnn.py new file mode 100644 index 00000000..db8873ad --- /dev/null +++ b/build/lib/torchdrug/models/mpnn.py @@ -0,0 +1,91 @@ +import torch +from torch import nn + +from torchdrug import core, layers +from torchdrug.core import Registry as R + + +@R.register("models.MPNN") +class MessagePassingNeuralNetwork(nn.Module, core.Configurable): + """ + Message Passing Neural Network proposed in `Neural Message Passing for Quantum Chemistry`_. + + This implements the enn-s2s variant in the original paper. + + .. _Neural Message Passing for Quantum Chemistry: + https://arxiv.org/pdf/1704.01212.pdf + + Parameters: + input_dim (int): input dimension + hidden_dim (int): hidden dimension + edge_input_dim (int): dimension of edge features + num_layer (int, optional): number of hidden layers + num_gru_layer (int, optional): number of GRU layers in each node update + num_mlp_layer (int, optional): number of MLP layers in each message function + num_s2s_step (int, optional): number of processing steps in set2set + short_cut (bool, optional): use short cut or not + batch_norm (bool, optional): apply batch normalization or not + activation (str or function, optional): activation function + concat_hidden (bool, optional): concat hidden representations from all layers as output + """ + + def __init__(self, input_dim, hidden_dim, edge_input_dim, num_layer=1, num_gru_layer=1, num_mlp_layer=2, + num_s2s_step=3, short_cut=False, batch_norm=False, activation="relu", concat_hidden=False): + super(MessagePassingNeuralNetwork, self).__init__() + + self.input_dim = input_dim + self.edge_input_dim = edge_input_dim + if concat_hidden: + feature_dim = hidden_dim * num_layer + else: + feature_dim = hidden_dim + self.output_dim = feature_dim * 2 + self.node_output_dim = feature_dim + self.num_layer = num_layer + self.short_cut = short_cut + self.concat_hidden = concat_hidden + + self.linear = nn.Linear(input_dim, hidden_dim) + self.layer = layers.MessagePassing(hidden_dim, edge_input_dim, [hidden_dim] * (num_mlp_layer - 1), + batch_norm, activation) + self.gru = nn.GRU(hidden_dim, hidden_dim, num_gru_layer) + + self.readout = layers.Set2Set(feature_dim, num_step=num_s2s_step) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the node representations and the graph representation(s). + + Parameters: + graph (Graph): :math:`n` graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``node_feature`` and ``graph_feature`` fields: + node representations of shape :math:`(|V|, d)`, graph representations of shape :math:`(n, d)` + """ + hiddens = [] + layer_input = self.linear(input) + hx = layer_input.repeat(self.gru.num_layers, 1, 1) + + for i in range(self.num_layer): + x = self.layer(graph, layer_input) + hidden, hx = self.gru(x.unsqueeze(0), hx) + hidden = hidden.squeeze(0) + if self.short_cut and hidden.shape == layer_input.shape: + hidden = hidden + layer_input + hiddens.append(hidden) + layer_input = hidden + + if self.concat_hidden: + node_feature = torch.cat(hiddens, dim=-1) + else: + node_feature = hiddens[-1] + graph_feature = self.readout(graph, node_feature) + + return { + "graph_feature": graph_feature, + "node_feature": node_feature + } diff --git a/build/lib/torchdrug/models/neuralfp.py b/build/lib/torchdrug/models/neuralfp.py new file mode 100644 index 00000000..ec47c2c5 --- /dev/null +++ b/build/lib/torchdrug/models/neuralfp.py @@ -0,0 +1,96 @@ +from collections.abc import Sequence + +import torch +from torch import nn +from torch.nn import functional as F + +from torchdrug import core, layers +from torchdrug.core import Registry as R + + +@R.register("models.NeuralFP") +class NeuralFingerprint(nn.Module, core.Configurable): + """ + Neural Fingerprints from `Convolutional Networks on Graphs for Learning Molecular Fingerprints`_. + + .. _Convolutional Networks on Graphs for Learning Molecular Fingerprints: + https://arxiv.org/pdf/1509.09292.pdf + + Parameters: + input_dim (int): input dimension + output_dim (int): fingerprint dimension + hidden_dims (list of int): hidden dimensions + edge_input_dim (int, optional): dimension of edge features + short_cut (bool, optional): use short cut or not + batch_norm (bool, optional): apply batch normalization or not + activation (str or function, optional): activation function + concat_hidden (bool, optional): concat hidden representations from all layers as output + readout (str, optional): readout function. Available functions are ``sum`` and ``mean``. + """ + + def __init__(self, input_dim, output_dim, hidden_dims, edge_input_dim=None, short_cut=False, batch_norm=False, + activation="relu", concat_hidden=False, readout="sum"): + super(NeuralFingerprint, self).__init__() + + if not isinstance(hidden_dims, Sequence): + hidden_dims = [hidden_dims] + self.input_dim = input_dim + self.output_dim = output_dim * (len(hidden_dims) if concat_hidden else 1) + self.dims = [input_dim] + list(hidden_dims) + self.short_cut = short_cut + self.concat_hidden = concat_hidden + + self.layers = nn.ModuleList() + self.linears = nn.ModuleList() + for i in range(len(self.dims) - 1): + self.layers.append(layers.NeuralFingerprintConv(self.dims[i], self.dims[i + 1], edge_input_dim, + batch_norm, activation)) + self.linears.append(nn.Linear(self.dims[i + 1], output_dim)) + + if readout == "sum": + self.readout = layers.SumReadout() + elif readout == "mean": + self.readout = layers.MeanReadout() + else: + raise ValueError("Unknown readout `%s`" % readout) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the node representations and the graph representation(s). + + Parameters: + graph (Graph): :math:`n` graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``node_feature`` and ``graph_feature`` fields: + node representations of shape :math:`(|V|, d)`, graph representations of shape :math:`(n, d)` + """ + hiddens = [] + outputs = [] + layer_input = input + + for layer, linear in zip(self.layers, self.linears): + hidden = layer(graph, layer_input) + if self.short_cut and hidden.shape == layer_input.shape: + hidden = hidden + layer_input + output = F.softmax(linear(hidden), dim=-1) + hiddens.append(hidden) + outputs.append(output) + layer_input = hidden + + if self.concat_hidden: + node_feature = torch.cat(hiddens, dim=-1) + graph_feature = torch.cat(outputs, dim=-1) + else: + node_feature = hiddens[-1] + graph_feature = torch.stack(outputs).sum(dim=0) + + graph_feature = self.readout(graph, graph_feature) + + return { + "graph_feature": graph_feature, + "node_feature": node_feature + } \ No newline at end of file diff --git a/build/lib/torchdrug/models/neurallp.py b/build/lib/torchdrug/models/neurallp.py new file mode 100644 index 00000000..da4ce58f --- /dev/null +++ b/build/lib/torchdrug/models/neurallp.py @@ -0,0 +1,112 @@ +import torch +from torch import nn +from torch.nn import functional as F +from torch_scatter import scatter_add + +from torchdrug import core, utils +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("models.NeuralLP") +class NeuralLogicProgramming(nn.Module, core.Configurable): + """ + Neural Logic Programming proposed in `Differentiable Learning of Logical Rules for Knowledge Base Reasoning`_. + + .. _Differentiable Learning of Logical Rules for Knowledge Base Reasoning: + https://papers.nips.cc/paper/2017/file/0e55666a4ad822e0e34299df3591d979-Paper.pdf + + Parameters: + num_relation (int): number of relations + hidden_dim (int): dimension of hidden units in LSTM + num_step (int): number of recurrent steps + num_lstm_layer (int, optional): number of LSTM layers + """ + + eps = 1e-10 + + def __init__(self, num_relation, hidden_dim, num_step, num_lstm_layer=1): + super(NeuralLogicProgramming, self).__init__() + + num_relation = int(num_relation) + self.num_relation = num_relation + self.num_step = num_step + + self.query = nn.Embedding(num_relation * 2 + 1, hidden_dim) + self.lstm = nn.LSTM(hidden_dim, hidden_dim, num_lstm_layer) + self.weight_linear = nn.Linear(hidden_dim, num_relation * 2) + self.linear = nn.Linear(1, 1) + + def negative_sample_to_tail(self, h_index, t_index, r_index): + # convert p(h | t, r) to p(t' | h', r') + # h' = t, r' = r^{-1}, t' = h + is_t_neg = (h_index == h_index[:, [0]]).all(dim=-1, keepdim=True) + new_h_index = torch.where(is_t_neg, h_index, t_index) + new_t_index = torch.where(is_t_neg, t_index, h_index) + new_r_index = torch.where(is_t_neg, r_index, r_index + self.num_relation) + return new_h_index, new_t_index, new_r_index + + @utils.cached + def get_t_output(self, graph, h_index, r_index): + end_index = torch.ones_like(r_index) * graph.num_relation + q_index = torch.stack([r_index] * (self.num_step - 1) + [end_index], dim=0) + query = self.query(q_index) + + hidden, hx = self.lstm(query) + memory = functional.one_hot(h_index, graph.num_node).unsqueeze(0) + + for i in range(self.num_step): + key = hidden[i] + value = hidden[:i + 1] + x = torch.einsum("bd, tbd -> bt", key, value) + attention = F.softmax(x, dim=-1) + input = torch.einsum("bt, tbn -> nb", attention, memory) + weight = F.softmax(self.weight_linear(key), dim=-1).t() + + node_in, node_out, relation = graph.edge_list.t() + if graph.num_node * graph.num_relation < graph.num_edge: + # O(|V|d) memory + node_out = node_out * graph.num_relation + relation + adjacency = utils.sparse_coo_tensor(torch.stack([node_in, node_out]), graph.edge_weight, + (graph.num_node, graph.num_node * graph.num_relation)) + output = adjacency.t() @ input + output = output.view(graph.num_node, graph.num_relation, -1) + output = (output * weight).sum(dim=1) + else: + # O(|E|) memory + message = input[node_in] + message = message * weight[relation] + edge_weight = graph.edge_weight.unsqueeze(-1) + output = scatter_add(message * edge_weight, node_out, dim=0, dim_size=graph.num_node) + output = output / output.sum(dim=0, keepdim=True).clamp(self.eps) + + memory = torch.cat([memory, output.t().unsqueeze(0)]) + + return output + + def forward(self, graph, h_index, t_index, r_index, all_loss=None, metric=None): + """ + Compute the score for triplets. + + Parameters: + graph (Tensor): fact graph + h_index (Tensor): indexes of head entities + t_index (Tensor): indexes of tail entities + r_index (Tensor): indexes of relations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + """ + assert graph.num_relation == self.num_relation + graph = graph.undirected(add_inverse=True) + + h_index, t_index, r_index = self.negative_sample_to_tail(h_index, t_index, r_index) + hr_index = h_index * graph.num_relation + r_index + hr_index_set, hr_inverse = hr_index.unique(return_inverse=True) + h_index_set = torch.div(hr_index_set, graph.num_relation, rounding_mode="floor") + r_index_set = hr_index_set % graph.num_relation + + output = self.get_t_output(graph, h_index_set, r_index_set) + + score = output[t_index, hr_inverse] + score = self.linear(score.unsqueeze(-1)).squeeze(-1) + return score \ No newline at end of file diff --git a/build/lib/torchdrug/models/physicochemical.py b/build/lib/torchdrug/models/physicochemical.py new file mode 100644 index 00000000..b9e5b6eb --- /dev/null +++ b/build/lib/torchdrug/models/physicochemical.py @@ -0,0 +1,145 @@ +import os + +import torch +from torch import nn + +from torch_scatter import scatter_mean, scatter_add + +from torchdrug import core, layers, utils, data +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("models.Physicochemical") +class Physicochemical(nn.Module, core.Configurable): + """ + The physicochemical feature engineering for protein sequence proposed in + `Prediction of Membrane Protein Types based on the Hydrophobic Index of Amino Acids`_. + + .. _Prediction of Membrane Protein Types based on the Hydrophobic Index of Amino Acids: + https://link.springer.com/article/10.1023/A:1007091128394 + + Parameters: + path (str): path to store feature file + type (str, optional): physicochemical feature. Available features are ``moran``, ``geary`` and ``nmbroto``. + nlag (int, optional): maximum position interval to compute features + hidden_dims (list of int, optional): hidden dimensions + """ + + url = "https://miladeepgraphlearningproteindata.s3.us-east-2.amazonaws.com/documents/AAidx.txt" + md5 = "ec612f4df41b93ae03c31ae376c23ce0" + + property_key = ["CIDH920105", "BHAR880101", "CHAM820101", "CHAM820102", + "CHOC760101", "BIGC670101", "CHAM810101", "DAYM780201"] + num_residue_type = len(data.Protein.id2residue_symbol) + + def __init__(self, path, type="moran", nlag=30, hidden_dims=(512,)): + super(Physicochemical, self).__init__() + self.type = type + path = os.path.expanduser(path) + if not os.path.exists(path): + os.makedirs(path) + self.path = path + index_file = utils.download(self.url, path, md5=self.md5) + property = self.read_property(index_file) + self.register_buffer("property", property) + + self.nlag = nlag + self.input_dim = len(self.property_key) * nlag + self.output_dim = hidden_dims[-1] + + self.mlp = layers.Sequential( + layers.MultiLayerPerceptron(self.input_dim, hidden_dims), + nn.ReLU() + ) + + def read_property(self, file): + with open(file, "r") as fin: + lines = fin.readlines() + vocab = lines[0].strip().split("\t")[1:] + + property_dict = {} + for line in lines[1:]: + line = line.strip().split("\t") + property_dict[line[0]] = [float(x) if x != "NA" else 0 for x in line[1:]] + + _property = [] + for key in self.property_key: + _property.append(property_dict[key]) + _property = torch.tensor(_property) + mapping = [data.Protein.residue_symbol2id[residue] for residue in vocab] + property = torch.zeros((len(self.property_key), self.num_residue_type), dtype=torch.float) + property[:, mapping] = _property + + property = (property - property.mean(dim=1, keepdim=True)) / \ + (property.std(dim=1, keepdim=True) + 1e-10) + return property.transpose(0, 1) + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the residue representations and the graph representation(s). + + Parameters: + graph (Protein): :math:`n` protein(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``graph_feature`` field: graph representations of shape :math:`(n, d)` + """ + input = graph.residue_type + + x = self.property[input] # num_residue * 8 + x_mean = scatter_mean(x, graph.residue2graph, dim=0, dim_size=graph.batch_size) # batch_size * 8 + + size = graph.num_residues + starts = size.cumsum(0) - size # batch_size * nlag + starts = starts.unsqueeze(-1).expand(-1, self.nlag) + steps = torch.arange(self.nlag, dtype=torch.long, device=graph.device) + 1 + steps = (graph.num_residues.unsqueeze(-1) - steps.unsqueeze(0)).clamp(min=0) + ends = starts + steps + mask_0 = functional.multi_slice_mask(starts, ends, graph.num_residue) # num_residue * nlag + + ends = size.cumsum(0) # batch_size * nlag + ends = ends.unsqueeze(-1).expand(-1, self.nlag) + starts = ends - steps + mask_1 = functional.multi_slice_mask(starts, ends, graph.num_residue) # num_residue * nlag + + index2sample = torch.repeat_interleave(size) + numerator = torch.zeros((graph.num_residue, self.nlag, x.shape[-1]), dtype=torch.float, device=graph.device) + if self.type == "moran": + _numerator = (x - x_mean[index2sample]).unsqueeze(1).expand(-1, self.nlag, -1)[mask_0] * \ + (x - x_mean[index2sample]).unsqueeze(1).expand(-1, self.nlag, -1)[mask_1] + numerator[mask_0] = _numerator + numerator = numerator / (steps[index2sample].unsqueeze(-1) + 1e-10) + numerator = scatter_add(numerator, graph.residue2graph, dim=0, dim_size=graph.batch_size) # batch_size * nlag * 8 + demonimator = scatter_add((x - x_mean[index2sample]) ** 2, graph.residue2graph, dim=0, dim_size=graph.batch_size) + demonimator = demonimator / graph.num_residues.unsqueeze(-1) + demonimator = demonimator.unsqueeze(1) # batch_size * 1 * 8 + elif self.type == "geary": + _numerator = x.unsqueeze(1).expand(-1, self.nlag, -1)[mask_0] - \ + x.unsqueeze(1).expand(-1, self.nlag, -1)[mask_1] + _numerator = _numerator ** 2 + numerator[mask_0] = _numerator + numerator = numerator / (steps[index2sample].unsqueeze(-1) * 2 + 1e-10) + numerator = scatter_add(numerator, graph.residue2graph, dim=0, dim_size=graph.batch_size) # batch_size * nlag * 8 + demonimator = scatter_add((x - x_mean[index2sample]) ** 2, graph.residue2graph, dim=0, dim_size=graph.batch_size) + demonimator = demonimator / (graph.num_residues - 1 + 1e-10).unsqueeze(-1) + demonimator = demonimator.unsqueeze(1) # batch_size * 1 * 8 + elif self.type == "nmbroto": + _numerator = x.unsqueeze(1).expand(-1, self.nlag, -1)[mask_0] * \ + x.unsqueeze(1).expand(-1, self.nlag, -1)[mask_1] + numerator[mask_0] = _numerator + numerator = scatter_add(numerator, graph.residue2graph, dim=0, dim_size=graph.batch_size) # batch_size * nlag * 8 + demonimator = steps.unsqueeze(-1) # batch_size * nlag * 1 + else: + raise ValueError("Unknown physicochemical feature type `%s`" % self.type) + feature = numerator / (demonimator + 1e-10) + feature = feature.flatten(1, 2) + + graph_feature = self.mlp(feature) + + return { + "graph_feature": graph_feature, + } \ No newline at end of file diff --git a/build/lib/torchdrug/models/schnet.py b/build/lib/torchdrug/models/schnet.py new file mode 100644 index 00000000..0bfb2cf9 --- /dev/null +++ b/build/lib/torchdrug/models/schnet.py @@ -0,0 +1,84 @@ +from collections.abc import Sequence + +import torch +from torch import nn + +from torchdrug import core, layers +from torchdrug.core import Registry as R + + +@R.register("models.SchNet") +class SchNet(nn.Module, core.Configurable): + """ + SchNet from `SchNet: A continuous-filter convolutional neural network for modeling quantum interactions`_. + + .. _SchNet\: A continuous-filter convolutional neural network for modeling quantum interactions: + https://arxiv.org/pdf/1706.08566.pdf + + Parameters: + input_dim (int): input dimension + hidden_dims (list of int): hidden dimensions + edge_input_dim (int, optional): dimension of edge features + cutoff (float, optional): maximal scale for RBF kernels + num_gaussian (int, optional): number of RBF kernels + short_cut (bool, optional): use short cut or not + batch_norm (bool, optional): apply batch normalization or not + activation (str or function, optional): activation function + concat_hidden (bool, optional): concat hidden representations from all layers as output + """ + + def __init__(self, input_dim, hidden_dims, edge_input_dim=None, cutoff=5, num_gaussian=100, short_cut=True, + batch_norm=False, activation="shifted_softplus", concat_hidden=False): + super(SchNet, self).__init__() + + if not isinstance(hidden_dims, Sequence): + hidden_dims = [hidden_dims] + self.input_dim = input_dim + self.output_dim = hidden_dims[-1] * (len(hidden_dims) if concat_hidden else 1) + self.dims = [input_dim] + list(hidden_dims) + self.short_cut = short_cut + self.concat_hidden = concat_hidden + + self.layers = nn.ModuleList() + for i in range(len(self.dims) - 1): + self.layers.append(layers.ContinuousFilterConv(self.dims[i], self.dims[i + 1], edge_input_dim, None, cutoff, + num_gaussian, batch_norm, activation)) + + self.readout = layers.SumReadout() + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the node representations and the graph representation(s). + + Require the graph(s) to have node attribute ``node_position``. + + Parameters: + graph (Graph): :math:`n` graph(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``node_feature`` and ``graph_feature`` fields: + node representations of shape :math:`(|V|, d)`, graph representations of shape :math:`(n, d)` + """ + hiddens = [] + layer_input = input + + for layer in self.layers: + hidden = layer(graph, layer_input) + if self.short_cut and hidden.shape == layer_input.shape: + hidden = hidden + layer_input + hiddens.append(hidden) + layer_input = hidden + + if self.concat_hidden: + node_feature = torch.cat(hiddens, dim=-1) + else: + node_feature = hiddens[-1] + graph_feature = self.readout(graph, node_feature) + + return { + "graph_feature": graph_feature, + "node_feature": node_feature + } \ No newline at end of file diff --git a/build/lib/torchdrug/models/statistic.py b/build/lib/torchdrug/models/statistic.py new file mode 100644 index 00000000..941cde81 --- /dev/null +++ b/build/lib/torchdrug/models/statistic.py @@ -0,0 +1,82 @@ +import torch +from torch import nn + +from torch_scatter import scatter_add + +from torchdrug import core, layers, data +from torchdrug.core import Registry as R + + +@R.register("models.Statistic") +class Statistic(nn.Module, core.Configurable): + """ + The statistic feature engineering for protein sequence proposed in + `Harnessing Computational Biology for Exact Linear B-cell Epitope Prediction`_. + + .. _Harnessing Computational Biology for Exact Linear B-cell Epitope Prediction: + https://www.liebertpub.com/doi/abs/10.1089/omi.2015.0095 + + Parameters: + type (str, optional): statistic feature. Available feature is ``DDE``. + hidden_dims (list of int, optional): hidden dimensions + """ + + num_residue_type = len(data.Protein.id2residue_symbol) + input_dim = num_residue_type ** 2 + _codons = {"A": 4, "C": 2, "D": 2, "E": 2, "F": 2, "G": 4, "H": 2, "I": 3, "K": 2, "L": 6, + "M": 1, "N": 2, "P": 4, "Q": 2, "R": 6, "S": 6, "T": 4, "V": 4, "W": 1, "Y": 2} + + def __init__(self, type="DDE", hidden_dims=(512,)): + super(Statistic, self).__init__() + self.type = type + self.output_dim = hidden_dims[-1] + + codons = self.calculate_codons() + self.register_buffer("codons", codons) + self.mlp = layers.Sequential( + layers.MultiLayerPerceptron(self.input_dim, hidden_dims), + nn.ReLU() + ) + + def calculate_codons(self): + codons = [0] * self.num_residue_type + for i, token in data.Protein.id2residue_symbol.items(): + codons[i] = self._codons[token] + codons = torch.tensor(codons) + return codons + + def forward(self, graph, input, all_loss=None, metric=None): + """ + Compute the residue representations and the graph representation(s). + + Parameters: + graph (Protein): :math:`n` protein(s) + input (Tensor): input node representations + all_loss (Tensor, optional): if specified, add loss to this tensor + metric (dict, optional): if specified, output metrics to this dict + + Returns: + dict with ``graph_feature`` field: graph representations of shape :math:`(n, d)` + """ + input = graph.residue_type + + index = input[:-1] * self.num_residue_type + input[1:] + index = graph.residue2graph[:-1] * self.input_dim + index + value = torch.ones(graph.num_residue - 1, dtype=torch.float, device=graph.device) + mask = graph.residue2graph[:-1] == graph.residue2graph[1:] + feature = scatter_add(value * mask.float(), index, dim=0, dim_size=graph.batch_size * self.input_dim) + feature = feature.view(graph.batch_size, self.input_dim) + feature = feature / (feature.sum(dim=-1, keepdim=True) + 1e-10) + if self.type == "DDE": + TM = self.codons.unsqueeze(0) * self.codons.unsqueeze(1) / 61 ** 2 + TM = TM.flatten() + TV = (TM * (1 - TM)).unsqueeze(0) / (graph.num_residues - 1 + 1e-10).unsqueeze(1) + feature = (feature - TM.unsqueeze(0)) / (TV.sqrt() + 1e-10) + else: + raise ValueError("Unknown statistic feature type `%s`" % self.type) + + graph_feature = self.mlp(feature) + + return { + "graph_feature": graph_feature, + } \ No newline at end of file diff --git a/build/lib/torchdrug/patch.py b/build/lib/torchdrug/patch.py new file mode 100644 index 00000000..d2f6ace3 --- /dev/null +++ b/build/lib/torchdrug/patch.py @@ -0,0 +1,145 @@ +import os +import inspect +import importlib + +import torch +from torch import nn +from torch import optim +from torch.optim import lr_scheduler as scheduler +from torch.utils.data import dataset +from torch.utils import cpp_extension +from torch import distributed as dist + +from torchdrug import core, data +from torchdrug.core import Registry as R + + +class PatchedModule(nn.Module): + + def __init__(self): + super(PatchedModule, self).__init__() + # TODO: these hooks are bugged. + # self._register_state_dict_hook(PatchedModule.graph_state_dict) + # self._register_load_state_dict_pre_hook(PatchedModule.load_graph_state_dict) + + def graph_state_dict(self, destination, prefix, local_metadata): + local_graphs = [] + for name, param in self._buffers.items(): + if isinstance(param, data.Graph): + local_graphs.append(name) + destination.pop(prefix + name) + for t_name, tensor in zip(data.Graph._tensor_names, param.to_tensors()): + if tensor is not None: + destination[prefix + name + "." + t_name] = tensor + if local_graphs: + local_metadata["graph"] = local_graphs + return destination + + @classmethod + def load_graph_state_dict(cls, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs): + if "graph" not in local_metadata: + return + + for name in local_metadata["graph"]: + tensors = [] + for t_name in data.Graph._tensor_names: + key = prefix + name + "." + t_name + input_tensor = state_dict.get(key, None) + tensors.append(input_tensor) + try: + state_dict[prefix + name] = data.Graph.from_tensors(tensors) + print("successfully assigned %s" % (prefix + name)) + except: + error_msgs.append("Can't construct Graph `%s` from tensors in the state dict" % key) + return state_dict + + @property + def device(self): + try: + tensor = next(self.parameters()) + except StopIteration: + tensor = next(self.buffers()) + return tensor.device + + def register_buffer(self, name, tensor, persistent=True): + if persistent is False and isinstance(self, torch.jit.ScriptModule): + raise RuntimeError("ScriptModule does not support non-persistent buffers") + + if '_buffers' not in self.__dict__: + raise AttributeError( + "cannot assign buffer before Module.__init__() call") + elif not isinstance(name, str): + raise TypeError("buffer name should be a string. " + "Got {}".format(torch.typename(name))) + elif '.' in name: + raise KeyError("buffer name can't contain \".\"") + elif name == '': + raise KeyError("buffer name can't be empty string \"\"") + elif hasattr(self, name) and name not in self._buffers: + raise KeyError("attribute '{}' already exists".format(name)) + elif tensor is not None and not isinstance(tensor, torch.Tensor) and not isinstance(tensor, data.Graph): + raise TypeError("cannot assign '{}' object to buffer '{}' " + "(torch.Tensor, torchdrug.data.Graph or None required)" + .format(torch.typename(tensor), name)) + else: + self._buffers[name] = tensor + if persistent: + self._non_persistent_buffers_set.discard(name) + else: + self._non_persistent_buffers_set.add(name) + + +def _get_build_directory(name, verbose): + root_extensions_directory = os.environ.get('TORCH_EXTENSIONS_DIR') + if root_extensions_directory is None: + root_extensions_directory = cpp_extension.get_default_build_root() + + if verbose: + print('Using {} as PyTorch extensions root...'.format( + root_extensions_directory)) + + build_directory = os.path.join(root_extensions_directory, name) + if not os.path.exists(build_directory): + if verbose: + print('Creating extension directory {}...'.format(build_directory)) + # This is like mkdir -p, i.e. will also create parent directories. + baton = cpp_extension.FileBaton("lock_%s" % name) + if baton.try_acquire(): + os.makedirs(build_directory) + baton.release() + else: + baton.wait() + + return build_directory + + +def patch(module, name, cls): + backup = getattr(module, name) + setattr(module, "_%s" % name, backup) + setattr(module, name, cls) + + +patch(nn, "Module", PatchedModule) +patch(cpp_extension, "_get_build_directory", _get_build_directory) + +Optimizer = optim.Optimizer +for name, cls in inspect.getmembers(optim): + if inspect.isclass(cls) and issubclass(cls, Optimizer): + cls = core.make_configurable(cls, ignore_args=("params",)) + cls = R.register("optim.%s" % name)(cls) + patch(optim, name, cls) + +Scheduler = scheduler._LRScheduler +for name, cls in inspect.getmembers(scheduler): + if inspect.isclass(cls) and issubclass(cls, Scheduler): + cls = core.make_configurable(cls, ignore_args=("optimizer",)) + cls = R.register("scheduler.%s" % name)(cls) + setattr(optim, name, cls) + +Dataset = dataset.Dataset +for name, cls in inspect.getmembers(dataset): + if inspect.isclass(cls) and issubclass(cls, Dataset): + cls = core.make_configurable(cls) + cls = R.register("dataset.%s" % name)(cls) + patch(dataset, name, cls) +importlib.reload(torch.utils.data) diff --git a/build/lib/torchdrug/tasks/__init__.py b/build/lib/torchdrug/tasks/__init__.py new file mode 100644 index 00000000..0682a543 --- /dev/null +++ b/build/lib/torchdrug/tasks/__init__.py @@ -0,0 +1,50 @@ +from .task import Task + +from .property_prediction import PropertyPrediction, MultipleBinaryClassification, \ + NodePropertyPrediction, InteractionPrediction, Unsupervised +from .pretrain import EdgePrediction, AttributeMasking, ContextPrediction, DistancePrediction, \ + AnglePrediction, DihedralPrediction +from .generation import AutoregressiveGeneration, GCPNGeneration +from .retrosynthesis import CenterIdentification, SynthonCompletion, Retrosynthesis +from .reasoning import KnowledgeGraphCompletion +from .contact_prediction import ContactPrediction + + +_criterion_name = { + "mse": "mean squared error", + "mae": "mean absolute error", + "bce": "binary cross entropy", + "ce": "cross entropy", +} + +_metric_name = { + "mae": "mean absolute error", + "mse": "mean squared error", + "rmse": "root mean squared error", + "acc": "accuracy", + "mcc": "matthews correlation coefficient", +} + + +def _get_criterion_name(criterion): + if criterion in _criterion_name: + return _criterion_name[criterion] + return "%s loss" % criterion + + +def _get_metric_name(metric): + if metric in _metric_name: + return _metric_name[metric] + return metric + + +__all__ = [ + "PropertyPrediction", "MultipleBinaryClassification", "NodePropertyPrediction", "InteractionPrediction", + "Unsupervised", + "EdgePrediction", "AttributeMasking", "ContextPrediction", "DistancePrediction", "AnglePrediction", + "DihedralPrediction", + "AutoregressiveGeneration", "GCPNGeneration", + "CenterIdentification", "SynthonCompletion", "Retrosynthesis", + "KnowledgeGraphCompletion", + "ContactPrediction", +] \ No newline at end of file diff --git a/build/lib/torchdrug/tasks/contact_prediction.py b/build/lib/torchdrug/tasks/contact_prediction.py new file mode 100644 index 00000000..5bf0dd4c --- /dev/null +++ b/build/lib/torchdrug/tasks/contact_prediction.py @@ -0,0 +1,172 @@ +import torch +from torch import nn +from torch.nn import functional as F + +from torchdrug import core, layers, tasks, metrics +from torchdrug.core import Registry as R +from torchdrug.layers import functional + + +@R.register("tasks.ContactPrediction") +class ContactPrediction(tasks.Task, core.Configurable): + """ + Predict whether each amino acid pair contact or not in the folding structure. + + Parameters: + model (nn.Module): protein sequence representation model + max_length (int, optional): maximal length of sequence. Truncate the sequence if it exceeds this limit. + random_truncate (bool, optional): truncate the sequence at a random position. + If not, truncate the suffix of the sequence. + threshold (float, optional): distance threshold for contact + gap (int, optional): sequential distance cutoff for evaluation + criterion (str or dict, optional): training criterion. For dict, the key is criterion and the value + is the corresponding weight. Available criterion is ``bce``. + metric (str or list of str, optional): metric(s). + Available metrics are ``accuracy``, ``prec@Lk`` and ``prec@k``. + num_mlp_layer (int, optional): number of layers in mlp prediction head + verbose (int, optional): output verbose level + """ + + eps = 1e-10 + _option_members = {"task", "criterion", "metric"} + + def __init__(self, model, max_length=500, random_truncate=True, threshold=8.0, gap=6, criterion="bce", + metric=("accuracy", "prec@L5"), num_mlp_layer=1, verbose=0): + super(ContactPrediction, self).__init__() + self.model = model + self.max_length = max_length + self.random_truncate = random_truncate + self.threshold = threshold + self.gap = gap + self.criterion = criterion + self.metric = metric + self.num_mlp_layer = num_mlp_layer + self.verbose = verbose + + if hasattr(self.model, "node_output_dim"): + model_output_dim = self.model.node_output_dim + else: + model_output_dim = self.model.output_dim + hidden_dims = [model_output_dim] * (self.num_mlp_layer - 1) + self.mlp = layers.MLP(2 * model_output_dim, hidden_dims + [1]) + + def truncate(self, batch): + graph = batch["graph"] + size = graph.num_residues + if (size > self.max_length).any(): + if self.random_truncate: + starts = (torch.rand(graph.batch_size, device=graph.device) * \ + (graph.num_residues - self.max_length).clamp(min=0)).long() + ends = torch.min(starts + self.max_length, graph.num_residues) + starts = starts + (graph.num_cum_residues - graph.num_residues) + ends = ends + (graph.num_cum_residues - graph.num_residues) + mask = functional.multi_slice_mask(starts, ends, graph.num_residue) + else: + starts = size.cumsum(0) - size + size = size.clamp(max=self.max_length) + ends = starts + size + mask = functional.multi_slice_mask(starts, ends, graph.num_residue) + graph = graph.subresidue(mask) + + return { + "graph": graph + } + + def forward(self, batch): + """""" + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + batch = self.truncate(batch) + pred = self.predict(batch, all_loss, metric) + target = self.target(batch) + + for criterion, weight in self.criterion.items(): + if criterion == "bce": + loss = F.binary_cross_entropy_with_logits(pred, target["label"], reduction="none") + loss = functional.variadic_mean(loss * target["mask"].float(), size=target["size"]) + else: + raise ValueError("Unknown criterion `%s`" % criterion) + loss = loss.mean() + + name = tasks._get_criterion_name(criterion) + metric[name] = loss + all_loss += loss * weight + + return all_loss, metric + + def predict(self, batch, all_loss=None, metric=None): + graph = batch["graph"] + output = self.model(graph, graph.residue_feature.float(), all_loss=all_loss, metric=metric) + output = output["residue_feature"] + + range = torch.arange(graph.num_residue, device=self.device) + node_in, node_out = functional.variadic_meshgrid(range, graph.num_residues, range, graph.num_residues) + if all_loss is None and node_in.shape[0] > (self.max_length ** 2) * graph.batch_size: + # test + # split large input to reduce memory cost + size = (self.max_length ** 2) * graph.batch_size + node_in_splits = node_in.split(size, dim=0) + node_out_splits = node_out.split(size, dim=0) + pred = [] + for _node_in, _node_out in zip(node_in_splits, node_out_splits): + prod = output[_node_in] * output[_node_out] + diff = (output[_node_in] - output[_node_out]).abs() + pairwise_features = torch.cat((prod, diff), -1) + _pred = self.mlp(pairwise_features) + pred.append(_pred) + pred = torch.cat(pred, dim=0) + else: + prod = output[node_in] * output[node_out] + diff = (output[node_in] - output[node_out]).abs() + pairwise_features = torch.cat((prod, diff), -1) + pred = self.mlp(pairwise_features) + + return pred.squeeze(-1) + + def target(self, batch): + graph = batch["graph"] + valid_mask = graph.mask + residue_position = graph.residue_position + + range = torch.arange(graph.num_residue, device=self.device) + node_in, node_out = functional.variadic_meshgrid(range, graph.num_residues, range, graph.num_residues) + dist = (residue_position[node_in] - residue_position[node_out]).norm(p=2, dim=-1) + label = (dist < self.threshold).float() + + mask = valid_mask[node_in] & valid_mask[node_out] & ((node_in - node_out).abs() >= self.gap) + + return { + "label": label, + "mask": mask, + "size": graph.num_residues ** 2 + } + + def evaluate(self, pred, target): + label = target["label"] + mask = target["mask"] + size = functional.variadic_sum(mask.long(), target["size"]) + label = label[mask] + pred = pred[mask] + + metric = {} + for _metric in self.metric: + if _metric == "accuracy": + score = (pred > 0) == label + score = functional.variadic_mean(score.float(), size).mean() + elif _metric.startswith("prec@L"): + l = target["size"].sqrt().long() + k = int(_metric[7:]) if len(_metric) > 7 else 1 + l = torch.div(l, k, rounding_mode="floor") + score = metrics.variadic_top_precision(pred, label, size, l).mean() + elif _metric.startswith("prec@"): + k = int(_metric[5:]) + k = torch.full_like(size, k) + score = metrics.variadic_top_precision(pred, label, size, k).mean() + else: + raise ValueError("Unknown criterion `%s`" % _metric) + + name = tasks._get_metric_name(_metric) + metric[name] = score + + return metric diff --git a/build/lib/torchdrug/tasks/generation.py b/build/lib/torchdrug/tasks/generation.py new file mode 100644 index 00000000..47b19031 --- /dev/null +++ b/build/lib/torchdrug/tasks/generation.py @@ -0,0 +1,1552 @@ +import copy +import logging +import warnings +from collections import defaultdict + +from tqdm import tqdm + +import torch +import torch.nn.functional as F +from torch import nn +from torch_scatter import scatter_add, scatter_max +from torch_scatter.composite import scatter_log_softmax, scatter_softmax + +from torchdrug import core, data, tasks, metrics, transforms +from torchdrug.core import Registry as R +from torchdrug.layers import functional +from torchdrug import layers + + +logger = logging.getLogger(__name__) + + +@R.register("tasks.AutoregressiveGeneration") +class AutoregressiveGeneration(tasks.Task, core.Configurable): + """ + Autoregressive graph generation task. + + This class can be used to implement GraphAF proposed in + `GraphAF: A Flow-based Autoregressive Model for Molecular Graph Generation`_. + To do so, instantiate the node model and the edge model with two + :class:`GraphAutoregressiveFlow ` models. + + .. _GraphAF\: A Flow-based Autoregressive Model for Molecular Graph Generation: + https://arxiv.org/pdf/2001.09382.pdf + + Parameters: + node_model (nn.Module): node likelihood model + edge_model (nn.Module): edge likelihood model + task (str or list of str, optional): property optimization task(s). Available tasks are ``plogp`` and ``qed``. + num_node_sample (int, optional): number of node samples per graph. -1 for all samples. + num_edge_sample (int, optional): number of edge samples per graph. -1 for all samples. + max_edge_unroll (int, optional): max node id difference. + If not provided, use the statistics from the training set. + max_node (int, optional): max number of node. + If not provided, use the statistics from the training set. + criterion (str, list or dict, optional): training criterion(s). For dict, the keys are criterions and the values + are the corresponding weights. Available criterions are ``nll`` and ``ppo``. + agent_update_interval (int, optional): update agent every n batch + gamma (float, optional): reward discount rate + reward_temperature (float, optional): temperature for reward. Higher temperature encourages larger mean reward, + while lower temperature encourages larger maximal reward. + baseline_momentum (float, optional): momentum for value function baseline + """ + + eps = 1e-10 + top_k = 10 + _option_members = {"task", "criterion"} + + def __init__(self, node_model, edge_model, task=(), num_node_sample=-1, num_edge_sample=-1, + max_edge_unroll=None, max_node=None, criterion="nll", agent_update_interval=5, gamma=0.9, + reward_temperature=1, baseline_momentum=0.9): + super(AutoregressiveGeneration, self).__init__() + self.node_model = node_model + self.edge_model = edge_model + self.agent_node_model = copy.deepcopy(node_model) + self.agent_edge_model = copy.deepcopy(edge_model) + self.task = task + self.num_atom_type = self.node_model.input_dim + self.num_bond_type = self.edge_model.input_dim + self.num_node_sample = num_node_sample + self.num_edge_sample = num_edge_sample + self.max_edge_unroll = max_edge_unroll + self.max_node = max_node + self.criterion = criterion + self.agent_update_interval = agent_update_interval + self.gamma = gamma + self.reward_temperature = reward_temperature + self.baseline_momentum = baseline_momentum + self.best_results = defaultdict(list) + self.batch_id = 0 + + def preprocess(self, train_set, valid_set, test_set): + """ + Add atom id mapping and random BFS order to the training set. + + Compute ``max_edge_unroll`` and ``max_node`` on the training set if not provided. + """ + remap_atom_type = transforms.RemapAtomType(train_set.atom_types) + train_set.transform = transforms.Compose([ + train_set.transform, + remap_atom_type, + transforms.RandomBFSOrder(), + ]) + self.register_buffer("id2atom", remap_atom_type.id2atom) + self.register_buffer("atom2id", remap_atom_type.atom2id) + + if self.max_edge_unroll is None or self.max_node is None: + self.max_edge_unroll = 0 + self.max_node = 0 + + train_set = tqdm(train_set, "Computing max number of nodes and edge unrolling") + for sample in train_set: + graph = sample["graph"] + if graph.edge_list.numel(): + edge_unroll = (graph.edge_list[:, 0] - graph.edge_list[:, 1]).abs().max().item() + self.max_edge_unroll = max(self.max_edge_unroll, edge_unroll) + self.max_node = max(self.max_node, graph.num_node) + + logger.warning("max node = %d, max edge unroll = %d" % (self.max_node, self.max_edge_unroll)) + + self.register_buffer("node_baseline", torch.zeros(self.max_node + 1)) + self.register_buffer("edge_baseline", torch.zeros(self.max_node + 1)) + + def forward(self, batch): + """""" + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + for criterion, weight in self.criterion.items(): + if criterion == "nll": + _loss, _metric = self.density_estimation_forward(batch) + all_loss += _loss * weight + metric.update(_metric) + elif criterion == "ppo": + _loss, _metric = self.reinforce_forward(batch) + all_loss += _loss * weight + metric.update(_metric) + else: + raise ValueError("Unknown criterion `%s`" % criterion) + + return all_loss, metric + + def reinforce_forward(self, batch): + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + if self.batch_id % self.agent_update_interval == 0: + self.agent_node_model.load_state_dict(self.node_model.state_dict()) + self.agent_edge_model.load_state_dict(self.edge_model.state_dict()) + self.batch_id += 1 + + # generation takes less time when early_stop=True + graph = self.generate(len(batch["graph"]), off_policy=True, early_stop=True) + if len(graph) == 0 or graph.num_nodes.max() == 1: + logger.error("Generation results collapse to singleton molecules") + + all_loss.requires_grad_() + nan = torch.tensor(float("nan"), device=self.device) + for task in self.task: + if task == "plogp": + metric["Penalized logP"] = nan + metric["Penalized logP (max)"] = nan + elif task == "qed": + metric["QED"] = nan + metric["QED (max)"] = nan + metric["node PPO objective"] = nan + metric["edge PPO objective"] = nan + + return all_loss, metric + + reward = torch.zeros(len(graph), device=self.device) + for task in self.task: + if task == "plogp": + plogp = metrics.penalized_logP(graph) + metric["Penalized logP"] = plogp.mean() + metric["Penalized logP (max)"] = plogp.max() + self.update_best_result(graph, plogp, "Penalized logP") + reward += (plogp / self.reward_temperature).exp() + + if plogp.max().item() > 5: + print("Penalized logP max = %s" % plogp.max().item()) + print(self.best_results["Penalized logP"]) + + elif task == "qed": + qed = metrics.QED(graph) + metric["QED"] = qed.mean() + metric["QED (max)"] = qed.max() + self.update_best_result(graph, qed, "QED") + reward += (qed / self.reward_temperature).exp() + #reward += qed * 3 + + if qed.max().item() > 0.93: + print("QED max = %s" % qed.max().item()) + print(self.best_results["QED"]) + + else: + raise ValueError("Unknown task `%s`" % task) + + # these graph-level features will broadcast to all masked graphs + with graph.graph(): + graph.reward = reward + graph.original_num_nodes = graph.num_nodes + graph.atom_type = self.atom2id[graph.atom_type] + + is_training = self.training + # easily got nan if BN is trained + self.bn_eval() + + masked_graph, node_target = self.mask_node(graph, metric) + # reward reshaping + reward = masked_graph.reward + masked_graph.atom_type = self.id2atom[masked_graph.atom_type] + reward = reward * self.gamma ** (masked_graph.original_num_nodes - masked_graph.num_nodes).float() + + # per graph size reward baseline + weight = torch.ones_like(masked_graph.num_nodes, dtype=torch.float) + baseline = scatter_add(reward, masked_graph.num_nodes, dim_size=self.max_node + 1) / \ + (scatter_add(weight, masked_graph.num_nodes, dim_size=self.max_node + 1) + self.eps) + self.node_baseline = self.node_baseline * self.baseline_momentum + baseline * (1 - self.baseline_momentum) + reward -= self.node_baseline[masked_graph.num_nodes] + reward += masked_graph.is_valid + masked_graph.atom_type = self.atom2id[masked_graph.atom_type] + + log_likelihood = self.node_model(masked_graph, node_target, None, all_loss, metric) + agent_log_likelihood = self.agent_node_model(masked_graph, node_target, None, all_loss, metric) + objective = functional.clipped_policy_gradient_objective(log_likelihood, agent_log_likelihood, reward) + objective = objective.mean() + metric["node PPO objective"] = objective + all_loss += -objective + + masked_graph, edge_target, edge = self.mask_edge(graph, metric) + # reward reshaping + reward = masked_graph.reward + masked_graph.atom_type = self.id2atom[masked_graph.atom_type] + reward = reward * self.gamma ** (masked_graph.original_num_nodes - masked_graph.num_nodes).float() + + # per graph size reward baseline + weight = torch.ones_like(masked_graph.num_nodes, dtype=torch.float) + baseline = scatter_add(reward, masked_graph.num_nodes, dim_size=self.max_node + 1) / \ + (scatter_add(weight, masked_graph.num_nodes, dim_size=self.max_node + 1) + self.eps) + self.edge_baseline = self.edge_baseline * self.baseline_momentum + baseline * (1 - self.baseline_momentum) + reward -= self.edge_baseline[masked_graph.num_nodes] + reward += masked_graph.is_valid + masked_graph.atom_type = self.atom2id[masked_graph.atom_type] + + log_likelihood = self.edge_model(masked_graph, edge_target, edge, all_loss, metric) + agent_log_likelihood = self.agent_edge_model(masked_graph, edge_target, edge, all_loss, metric) + objective = functional.clipped_policy_gradient_objective(log_likelihood, agent_log_likelihood, reward) + objective = objective.mean() + metric["edge PPO objective"] = objective + all_loss += -objective + + self.bn_train(is_training) + + return all_loss, metric + + def density_estimation_forward(self, batch): + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + graph = batch["graph"] + masked_graph, node_target = self.mask_node(graph, metric) + log_likelihood = self.node_model(masked_graph, node_target, None, all_loss, metric) + log_likelihood = log_likelihood.mean() + metric["node log likelihood"] = log_likelihood + all_loss += -log_likelihood + + masked_graph, edge_target, edge = self.mask_edge(graph, metric) + log_likelihood = self.edge_model(masked_graph, edge_target, edge, all_loss, metric) + log_likelihood = log_likelihood.mean() + metric["edge log likelihood"] = log_likelihood + all_loss += -log_likelihood + + return all_loss, metric + + def evaluate(self, batch): + pred = None + metric = {} + + graph, target = self.all_node(batch["graph"]) + log_likelihood = self.node_model(graph, target) + log_likelihood = log_likelihood.mean() + metric["node log likelihood"] = log_likelihood + + graph, target = self.all_edge(batch["graph"]) + log_likelihood = self.edge_model(graph, target) + log_likelihood = log_likelihood.mean() + metric["edge log likelihood"] = log_likelihood + + return pred, metric + + def bn_train(self, mode=True): + for module in self.modules(): + if isinstance(module, nn.BatchNorm1d): + module.train(mode) + + def bn_eval(self): + for module in self.modules(): + if isinstance(module, nn.BatchNorm1d): + module.eval() + + def update_best_result(self, graph, score, task): + score = score.cpu() + best_results = self.best_results[task] + for s, i in zip(*score.sort(descending=True)): + s = s.item() + i = i.item() + if len(best_results) == self.top_k and s < best_results[-1][0]: + break + best_results.append((s, graph[i].to_smiles())) + best_results.sort(reverse=True) + best_results = best_results[:self.top_k] + self.best_results[task] = best_results + + @torch.no_grad() + def generate(self, num_sample, max_resample=20, off_policy=False, early_stop=False, verbose=0): + num_relation = self.num_bond_type - 1 + is_training = self.training + self.eval() + + if off_policy: + node_model = self.agent_node_model + edge_model = self.agent_edge_model + else: + node_model = self.node_model + edge_model = self.edge_model + + edge_list = torch.zeros(0, 3, dtype=torch.long, device=self.device) + num_nodes = torch.zeros(num_sample, dtype=torch.long, device=self.device) + num_edges = torch.zeros_like(num_nodes) + atom_type = torch.zeros(0, dtype=torch.long, device=self.device) + graph = data.PackedMolecule(edge_list, atom_type, edge_list[:, -1], num_nodes, num_edges, + num_relation=num_relation) + completed = torch.zeros(num_sample, dtype=torch.bool, device=self.device) + + for node_in in range(self.max_node): + atom_pred = node_model.sample(graph) + # why we add atom_pred even if it is completed? + # because we need to batch edge model over (node_in, node_out), even on completed graphs + atom_type, num_nodes = self._append(atom_type, num_nodes, atom_pred) + graph = node_graph = data.PackedMolecule(edge_list, atom_type, edge_list[:, -1], num_nodes, num_edges, + num_relation=num_relation) + + start = max(0, node_in - self.max_edge_unroll) + for node_out in range(start, node_in): + is_valid = completed.clone() + edge = torch.tensor([node_in, node_out], device=self.device).repeat(num_sample, 1) + # default: non-edge + bond_pred = (self.num_bond_type - 1) * torch.ones(num_sample, dtype=torch.long, device=self.device) + for i in range(max_resample): + # only resample invalid graphs + mask = ~is_valid + bond_pred[mask] = edge_model.sample(graph, edge)[mask] + # check valency + mask = (bond_pred < edge_model.input_dim - 1) & ~completed + edge_pred = torch.cat([edge, bond_pred.unsqueeze(-1)], dim=-1) + tmp_edge_list, tmp_num_edges = self._append(edge_list, num_edges, edge_pred, mask) + edge_pred = torch.cat([edge.flip(-1), bond_pred.unsqueeze(-1)], dim=-1) + tmp_edge_list, tmp_num_edges = self._append(tmp_edge_list, tmp_num_edges, edge_pred, mask) + tmp_graph = data.PackedMolecule(tmp_edge_list, self.id2atom[atom_type], tmp_edge_list[:, -1], + num_nodes, tmp_num_edges, num_relation=num_relation) + + is_valid = tmp_graph.is_valid | completed + + if is_valid.all(): + break + + if not is_valid.all() and verbose: + num_invalid = num_sample - is_valid.sum().item() + num_working = num_sample - completed.sum().item() + logger.warning("edge (%d, %d): %d / %d molecules are invalid even after %d resampling" % + (node_in, node_out, num_invalid, num_working, max_resample)) + + mask = (bond_pred < edge_model.input_dim - 1) & ~completed + edge_pred = torch.cat([edge, bond_pred.unsqueeze(-1)], dim=-1) + edge_list, num_edges = self._append(edge_list, num_edges, edge_pred, mask) + edge_pred = torch.cat([edge.flip(-1), bond_pred.unsqueeze(-1)], dim=-1) + edge_list, num_edges = self._append(edge_list, num_edges, edge_pred, mask) + graph = data.PackedMolecule(edge_list, atom_type, edge_list[:, -1], num_nodes, num_edges, + num_relation=num_relation) + + if node_in > 0: + assert (graph.num_edges[completed] == node_graph.num_edges[completed]).all() + completed |= graph.num_edges == node_graph.num_edges + if early_stop: + graph.atom_type = self.id2atom[graph.atom_type] + completed |= ~graph.is_valid + graph.atom_type = self.atom2id[graph.atom_type] + if completed.all(): + break + + self.train(is_training) + + # remove isolated atoms + index = graph.degree_out > 0 + # keep at least the first atom for each graph + index[graph.num_cum_nodes - graph.num_nodes] = 1 + graph = graph.subgraph(index) + graph.atom_type = self.id2atom[graph.atom_type] + + graph = graph[graph.is_valid_rdkit] + return graph + + def _append(self, data, num_xs, input, mask=None): + if mask is None: + mask = torch.ones_like(num_xs, dtype=torch.bool) + new_num_xs = num_xs + mask + new_num_cum_xs = new_num_xs.cumsum(0) + new_num_x = new_num_cum_xs[-1].item() + new_data = torch.zeros(new_num_x, *data.shape[1:], dtype=data.dtype, device=data.device) + starts = new_num_cum_xs - new_num_xs + ends = starts + num_xs + index = functional.multi_slice_mask(starts, ends, new_num_x) + new_data[index] = data + new_data[~index] = input[mask] + return new_data, new_num_xs + + @torch.no_grad() + def mask_node(self, graph, metric=None): + if self.num_node_sample == -1: + masked_graph, node_target = self.all_node(graph) + if metric is not None: + metric["node mask / graph"] = torch.tensor([len(masked_graph) / len(graph)], device=graph.device) + else: + masked_graph, node_target = self.sample_node(graph, self.num_node_sample) + return masked_graph, node_target + + @torch.no_grad() + def mask_edge(self, graph, metric=None): + if self.num_edge_sample == -1: + masked_graph, edge_target, edge = self.all_edge(graph) + if metric is not None: + metric["edge mask / graph"] = torch.tensor([len(masked_graph) / len(graph)], device=graph.device) + else: + masked_graph, edge_target, edge = self.sample_edge(graph, self.num_edge_sample) + return masked_graph, edge_target, edge + + @torch.no_grad() + def sample_node(self, graph, num_sample): + graph = graph.repeat(num_sample) + num_nodes = graph.num_nodes + num_keep_nodes = torch.rand(len(graph), device=graph.device) * num_nodes # [0, num_nodes) + num_keep_nodes = num_keep_nodes.long() # [0, num_nodes - 1] + + starts = graph.num_cum_nodes - graph.num_nodes + ends = starts + num_keep_nodes + mask = functional.multi_slice_mask(starts, ends, graph.num_node) + + new_graph = graph.subgraph(mask) + target = graph.subgraph(ends).atom_type + return new_graph, target + + @torch.no_grad() + def all_node(self, graph): + starts, ends, valid = self._all_prefix_slice(graph.num_nodes) + + num_repeat = len(starts) // len(graph) + graph = graph.repeat(num_repeat) + mask = functional.multi_slice_mask(starts, ends, graph.num_node) + new_graph = graph.subgraph(mask) + target = graph.subgraph(ends).atom_type + + return new_graph[valid], target[valid] + + @torch.no_grad() + def sample_edge(self, graph, num_sample): + if (graph.num_nodes < 2).any(): + graph = graph[graph.num_nodes >= 2] + warnings.warn("Graphs with less than 2 nodes can't be used for edge generation learning. Dropped") + + lengths = self._valid_edge_prefix_lengths(graph) + graph = graph.repeat(num_sample) + + num_max_node = graph.num_nodes.max().item() + num_node2num_dense_edge = torch.arange(num_max_node + 1, device=graph.device) ** 2 + num_node2length_idx = (lengths.unsqueeze(-1) < num_node2num_dense_edge.unsqueeze(0)).sum(dim=0) + # uniformly sample a mask from each graph's valid masks + length_indexes = torch.rand(len(graph), device=graph.device) * num_node2length_idx[graph.num_nodes] + length_indexes = length_indexes.long() + num_keep_dense_edges = lengths[length_indexes] + + # undirected: all upper triangular edge ids are flipped to lower triangular ids + # 1 -> 2, 4 -> 6, 5 -> 7 + node_index = graph.edge_list[:, :2] - graph._offsets.unsqueeze(-1) + node_in, node_out = node_index.t() + node_large = node_index.max(dim=-1)[0] + node_small = node_index.min(dim=-1)[0] + edge_id = node_large ** 2 + (node_in >= node_out) * node_large + node_small + undirected_edge_id = node_large * (node_large + 1) + node_small + + edge_mask = undirected_edge_id < num_keep_dense_edges[graph.edge2graph] + circum_box_size = (num_keep_dense_edges + 1.0).sqrt().ceil().long() + starts = graph.num_cum_nodes - graph.num_nodes + ends = starts + circum_box_size + node_mask = functional.multi_slice_mask(starts, ends, graph.num_node) + # compact nodes so that succeeding nodes won't affect graph pooling + new_graph = graph.edge_mask(edge_mask).node_mask(node_mask, compact=True) + + positive_edge = edge_id == num_keep_dense_edges[graph.edge2graph] + positive_graph = scatter_add(positive_edge.long(), graph.edge2graph, dim=0, dim_size=len(graph)).bool() + # default: non-edge + target = (self.num_bond_type - 1) * torch.ones(graph.batch_size, dtype=torch.long, device=graph.device) + target[positive_graph] = graph.edge_list[positive_edge, 2] + + node_in = circum_box_size - 1 + node_out = num_keep_dense_edges - node_in * circum_box_size + edge = torch.stack([node_in, node_out], dim=-1) + + return new_graph, target, edge + + @torch.no_grad() + def all_edge(self, graph): + if (graph.num_nodes < 2).any(): + graph = graph[graph.num_nodes >= 2] + warnings.warn("Graphs with less than 2 nodes can't be used for edge generation learning. Dropped") + + lengths = self._valid_edge_prefix_lengths(graph) + + starts, ends, valid = self._all_prefix_slice(graph.num_nodes ** 2, lengths) + + num_keep_dense_edges = ends - starts + num_repeat = len(starts) // len(graph) + graph = graph.repeat(num_repeat) + + # undirected: all upper triangular edge ids are flipped to lower triangular ids + # 1 -> 2, 4 -> 6, 5 -> 7 + node_index = graph.edge_list[:, :2] - graph._offsets.unsqueeze(-1) + node_in, node_out = node_index.t() + node_large = node_index.max(dim=-1)[0] + node_small = node_index.min(dim=-1)[0] + edge_id = node_large ** 2 + (node_in >= node_out) * node_large + node_small + undirected_edge_id = node_large * (node_large + 1) + node_small + + edge_mask = undirected_edge_id < num_keep_dense_edges[graph.edge2graph] + circum_box_size = (num_keep_dense_edges + 1.0).sqrt().ceil().long() + starts = graph.num_cum_nodes - graph.num_nodes + ends = starts + circum_box_size + node_mask = functional.multi_slice_mask(starts, ends, graph.num_node) + # compact nodes so that succeeding nodes won't affect graph pooling + new_graph = graph.edge_mask(edge_mask).node_mask(node_mask, compact=True) + + positive_edge = edge_id == num_keep_dense_edges[graph.edge2graph] + positive_graph = scatter_add(positive_edge.long(), graph.edge2graph, dim=0, dim_size=len(graph)).bool() + # default: non-edge + target = (self.num_bond_type - 1) * torch.ones(graph.batch_size, dtype=torch.long, device=graph.device) + target[positive_graph] = graph.edge_list[positive_edge, 2] + + node_in = circum_box_size - 1 + node_out = num_keep_dense_edges - node_in * circum_box_size + edge = torch.stack([node_in, node_out], dim=-1) + + return new_graph[valid], target[valid], edge[valid] + + @torch.no_grad() + def _all_prefix_slice(self, num_xs, lengths=None): + # extract a bunch of slices that correspond to the following num_repeat * n masks + # ------ repeat 0 ----- + # graphs[0]: [0, 0, ..., 0] + # ... + # graphs[-1]: [0, 0, ..., 0] + # ------ repeat 1 ----- + # graphs[0]: [1, 0, ..., 0] + # ... + # graphs[-1]: [1, 0, ..., 0] + # ... + # ------ repeat -1 ----- + # graphs[0]: [1, ..., 1, 0] + # ... + # graphs[-1]: [1, ..., 1, 0] + num_cum_xs = num_xs.cumsum(0) + starts = num_cum_xs - num_xs + if lengths is None: + num_max_x = num_xs.max().item() + lengths = torch.arange(num_max_x, device=num_xs.device) + + pack_offsets = torch.arange(len(lengths), device=num_xs.device) * num_cum_xs[-1] + # starts, lengths, ends: (num_repeat, num_graph) + starts = starts.unsqueeze(0) + pack_offsets.unsqueeze(-1) + valid = lengths.unsqueeze(-1) <= num_xs.unsqueeze(0) - 1 + lengths = torch.min(lengths.unsqueeze(-1), num_xs.unsqueeze(0) - 1) + ends = starts + lengths + + starts = starts.flatten() + ends = ends.flatten() + valid = valid.flatten() + + return starts, ends, valid + + @torch.no_grad() + def _valid_edge_prefix_lengths(self, graph): + # valid prefix lengths are across a batch, according to the largest graph + num_max_node = graph.num_nodes.max().item() + # edge id in an adjacency (snake pattern) + # in + # o 0 1 4 + # u 2 3 5 + # t 6 7 8 + lengths = torch.arange(num_max_node ** 2, device=graph.device) + circum_box_size = (lengths + 1.0).sqrt().ceil().long() + # only keep lengths that ends in the lower triangular part of adjacency matrix + lengths = lengths[lengths >= circum_box_size * (circum_box_size - 1)] + # lengths: [0, 2, 3, 6, 7, 8, ...] + # num_node2length_idx: [0, 1, 4, 6, ...] + # num_edge_unrolls + # 0 + # 1 0 + # 2 1 0 + num_edge_unrolls = (lengths + 1.0).sqrt().ceil().long() ** 2 - lengths - 1 + # num_edge_unrolls: [0, 1, 0, 2, 1, 0, ...] + # remove lengths that unroll too much. they always lead to empty targets + lengths = lengths[(num_edge_unrolls <= self.max_edge_unroll) & (num_edge_unrolls > 0)] + + return lengths + + +@R.register("tasks.GCPNGeneration") +class GCPNGeneration(tasks.Task, core.Configurable): + """ + The graph generative model from `Graph Convolutional Policy Network for Goal-Directed Molecular Graph Generation`_. + + .. _Graph Convolutional Policy Network for Goal-Directed Molecular Graph Generation: + https://papers.nips.cc/paper/7877-graph-convolutional-policy-network-for-goal-directed-molecular-graph-generation.pdf + + Parameters: + model (nn.Module): graph representation model + atom_types (list or set): set of all possible atom types + task (str or list of str, optional): property optimization task(s) + max_edge_unroll (int, optional): max node id difference. + If not provided, use the statistics from the training set. + max_node (int, optional): max number of node. + If not provided, use the statistics from the training set. + criterion (str, list or dict, optional): training criterion(s). For dict, the keys are criterions and the values + are the corresponding weights. Available criterions are ``nll`` and ``ppo``. + agent_update_interval (int, optional): update the agent every n batch + gamma (float, optional): reward discount rate + reward_temperature (float, optional): temperature for reward. Higher temperature encourages larger mean reward, + while lower temperature encourages larger maximal reward. + baseline_momentum (float, optional): momentum for value function baseline + """ + + eps = 1e-10 + top_k = 10 + _option_members = {"task", "criterion"} + + def __init__(self, model, atom_types, max_edge_unroll=None, max_node=None, task=(), criterion="nll", + hidden_dim_mlp=128, agent_update_interval=10, gamma=0.9, reward_temperature=1, baseline_momentum=0.9): + super(GCPNGeneration, self).__init__() + self.model = model + self.task = task + self.max_edge_unroll = max_edge_unroll + self.max_node = max_node + self.criterion = criterion + self.hidden_dim_mlp = hidden_dim_mlp + self.agent_update_interval = agent_update_interval + self.gamma = gamma + self.reward_temperature = reward_temperature + self.baseline_momentum = baseline_momentum + self.best_results = defaultdict(list) + self.batch_id = 0 + + + remap_atom_type = transforms.RemapAtomType(atom_types) + self.register_buffer("id2atom", remap_atom_type.id2atom) + self.register_buffer("atom2id", remap_atom_type.atom2id) + + self.new_atom_embeddings = nn.Parameter(torch.zeros(self.id2atom.size(0), self.model.output_dim)) + nn.init.normal_(self.new_atom_embeddings, mean=0, std=0.1) + self.inp_dim_stop = self.model.output_dim + self.mlp_stop = layers.MultiLayerPerceptron(self.inp_dim_stop, [self.hidden_dim_mlp, 2], activation='tanh') + + self.inp_dim_node1 = self.model.output_dim + self.model.output_dim + self.mlp_node1 = layers.MultiLayerPerceptron(self.inp_dim_node1, [self.hidden_dim_mlp, 1], activation='tanh') + self.inp_dim_node2 = 2 * self.model.output_dim + self.model.output_dim + self.mlp_node2 = layers.MultiLayerPerceptron(self.inp_dim_node2, [self.hidden_dim_mlp, 1], activation='tanh') + self.inp_dim_edge = 2 * self.model.output_dim + self.mlp_edge = layers.MultiLayerPerceptron(self.inp_dim_edge, [self.hidden_dim_mlp, self.model.num_relation], activation='tanh') + + self.agent_model = copy.deepcopy(self.model) + self.agent_new_atom_embeddings = copy.deepcopy(self.new_atom_embeddings) + self.agent_mlp_stop = copy.deepcopy(self.mlp_stop) + self.agent_mlp_node1 = copy.deepcopy(self.mlp_node1) + self.agent_mlp_node2 = copy.deepcopy(self.mlp_node2) + self.agent_mlp_edge = copy.deepcopy(self.mlp_edge) + + + def preprocess(self, train_set, valid_set, test_set): + """ + Add atom id mapping and random BFS order to the training set. + + Compute ``max_edge_unroll`` and ``max_node`` on the training set if not provided. + """ + remap_atom_type = transforms.RemapAtomType(train_set.atom_types) + train_set.transform = transforms.Compose([ + train_set.transform, + transforms.RandomBFSOrder(), + ]) + + if self.max_edge_unroll is None or self.max_node is None: + self.max_edge_unroll = 0 + self.max_node = 0 + + train_set = tqdm(train_set, "Computing max number of nodes and edge unrolling") + for sample in train_set: + graph = sample["graph"] + if graph.edge_list.numel(): + edge_unroll = (graph.edge_list[:, 0] - graph.edge_list[:, 1]).abs().max().item() + self.max_edge_unroll = max(self.max_edge_unroll, edge_unroll) + self.max_node = max(self.max_node, graph.num_node) + + logger.warning("max node = %d, max edge unroll = %d" % (self.max_node, self.max_edge_unroll)) + + self.register_buffer("moving_baseline", torch.zeros(self.max_node + 1)) + + def forward(self, batch): + """""" + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + for criterion, weight in self.criterion.items(): + if criterion == "nll": + _loss, _metric = self.MLE_forward(batch) + all_loss += _loss * weight + metric.update(_metric) + elif criterion == "ppo": + _loss, _metric = self.reinforce_forward(batch) + all_loss += _loss * weight + metric.update(_metric) + else: + raise ValueError("Unknown criterion `%s`" % criterion) + + return all_loss, metric + + def predict(self, graph, label_dict, use_agent=False): + # step1: get node/graph embeddings + if not use_agent: + output = self.model(graph, graph.node_feature.float()) + else: + output = self.agent_model(graph, graph.node_feature.float()) + + extended_node2graph = torch.arange(graph.num_nodes.size(0), + device=self.device).unsqueeze(1).repeat([1, self.id2atom.size(0)]).view(-1) # (num_graph * 16) + extended_node2graph = torch.cat((graph.node2graph, extended_node2graph)) # (num_node + 16 * num_graph) + + graph_feature_per_node = output["graph_feature"][extended_node2graph] + + # step2: predict stop + stop_feature = output["graph_feature"] #(num_graph, n_out) + if not use_agent: + stop_logits = self.mlp_stop(stop_feature) #(num_graph, 2) + else: + stop_logits = self.agent_mlp_stop(stop_feature) #(num_graph, 2) + + if label_dict == None: + return stop_logits + # step3: predict first node: node1 + node1_feature = output["node_feature"] #(num_node, n_out) + + node1_feature = torch.cat((node1_feature, + self.new_atom_embeddings.repeat([graph.num_nodes.size(0), 1])), 0) # (num_node + 16 * num_graph, n_out) + + node2_feature_node2 = node1_feature.clone() # (num_node + 16 * num_graph, n_out) + # cat graph emb + node1_feature = torch.cat((node1_feature, graph_feature_per_node), 1) + + if not use_agent: + node1_logits = self.mlp_node1(node1_feature).squeeze(1) #(num_node + 16 * num_graph) + else: + node1_logits = self.agent_mlp_node1(node1_feature).squeeze(1) #(num_node + 16 * num_graph) + + #mask the extended part + mask = torch.zeros(node1_logits.size(), device=self.device) + mask[:graph.num_node] = 1 + node1_logits = torch.where(mask>0, node1_logits, -10000.0*torch.ones(node1_logits.size(), device=self.device)) + + # step4: predict second node: node2 + + node1_index_per_graph = (graph.num_cum_nodes - graph.num_nodes) + label_dict["label1"] #(num_graph) + node1_index = node1_index_per_graph[extended_node2graph] # (num_node + 16 * num_graph) + node2_feature_node1 = node1_feature[node1_index] #(num_node + 16 * num_graph, n_out) + node2_feature = torch.cat((node2_feature_node1, node2_feature_node2), 1) #(num_node + 16 * num_graph, 2n_out) + if not use_agent: + node2_logits = self.mlp_node2(node2_feature).squeeze(1) #(num_node + 16 * num_graph) + else: + node2_logits = self.agent_mlp_node2(node2_feature).squeeze(1) #(num_node + 16 * num_graph) + + #mask the selected node1 + mask = torch.zeros(node2_logits.size(), device=self.device) + mask[node1_index_per_graph] = 1 + node2_logits = torch.where(mask==0, node2_logits, -10000.0*torch.ones(node2_logits.size(), device=self.device)) + + # step5: predict edge type + is_new_node = label_dict["label2"] - graph.num_nodes # if an entry is non-negative, this is a new added node. (num_graph) + graph_offset = torch.arange(graph.num_nodes.size(0), device=self.device) + node2_index_per_graph = torch.where(is_new_node >= 0, + graph.num_node + graph_offset * self.id2atom.size(0) + is_new_node, + label_dict["label2"] + graph.num_cum_nodes - graph.num_nodes) # (num_graph) + node2_index = node2_index_per_graph[extended_node2graph] + + edge_feature_node1 = node2_feature_node2[node1_index_per_graph] #(num_graph, n_out) + edge_feature_node2 = node2_feature_node2[node2_index_per_graph] # #(num_graph, n_out) + edge_feature = torch.cat((edge_feature_node1, edge_feature_node2), 1) #(num_graph, 2n_out) + if not use_agent: + edge_logits = self.mlp_edge(edge_feature) # (num_graph, num_relation) + else: + edge_logits = self.agent_mlp_edge(edge_feature) # (num_graph, num_relation) + + index_dict = { + "node1_index_per_graph": node1_index_per_graph, + "node2_index_per_graph": node2_index_per_graph, + "extended_node2graph": extended_node2graph + } + return stop_logits, node1_logits, node2_logits, edge_logits, index_dict + + def reinforce_forward(self, batch): + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + if self.batch_id % self.agent_update_interval == 0: + self.agent_model.load_state_dict(self.model.state_dict()) + self.agent_mlp_stop.load_state_dict(self.mlp_stop.state_dict()) + self.agent_mlp_node1.load_state_dict(self.mlp_node1.state_dict()) + self.agent_mlp_node2.load_state_dict(self.mlp_node2.state_dict()) + self.agent_mlp_edge.load_state_dict(self.mlp_edge.state_dict()) + self.agent_new_atom_embeddings.data = self.new_atom_embeddings.data.clone() + + self.batch_id += 1 + + # generation takes less time when early_stop=True + graph = self.generate(len(batch["graph"]), max_resample=20, off_policy=True, max_step=40 * 2, verbose=1) + if len(graph) == 0 or graph.num_nodes.max() == 1: + logger.error("Generation results collapse to singleton molecules") + + all_loss.requires_grad_() + nan = torch.tensor(float("nan"), device=self.device) + for task in self.task: + if task == "plogp": + metric["Penalized logP"] = nan + metric["Penalized logP (max)"] = nan + elif task == "qed": + metric["QED"] = nan + metric["QED (max)"] = nan + metric["PPO objective"] = nan + + return all_loss, metric + + reward = torch.zeros(len(graph), device=self.device) + for task in self.task: + if task == "plogp": + plogp = metrics.penalized_logP(graph) + metric["Penalized logP"] = plogp.mean() + metric["Penalized logP (max)"] = plogp.max() + self.update_best_result(graph, plogp, "Penalized logP") + # TODO: + reward += (plogp / self.reward_temperature).exp() + + if plogp.max().item() > 5: + print("Penalized logP max = %s" % plogp.max().item()) + print(self.best_results["Penalized logP"]) + + elif task == "qed": + qed = metrics.QED(graph) + metric["QED"] = qed.mean() + metric["QED (max)"] = qed.max() + self.update_best_result(graph, qed, "QED") + # TODO: + #reward += ((qed - 0.9) * 20).exp() + #reward += ((qed - 0.4) * 4 / self.reward_temperature).exp() + #reward += qed + reward += (qed / self.reward_temperature).exp() + + + if qed.max().item() > 0.93: + print("QED max = %s" % qed.max().item()) + print(self.best_results["QED"]) + else: + raise ValueError("Unknown task `%s`" % task) + + # these graph-level features will broadcast to all masked graphs + with graph.graph(): + graph.reward = reward + graph.original_num_nodes = graph.num_nodes + + #graph.atom_type = self.atom2id[graph.atom_type] + + is_training = self.training + # easily got nan if BN is trained + self.bn_eval() + + + + stop_graph, stop_label1, stop_label2, stop_label3, stop_label4 = self.all_stop(graph) + edge_graph, edge_label1, edge_label2, edge_label3, edge_label4 = self.all_edge(graph) + + graph = self._cat([stop_graph, edge_graph]) + label1_target = torch.cat([stop_label1, edge_label1]) + label2_target = torch.cat([stop_label2, edge_label2]) + label3_target = torch.cat([stop_label3, edge_label3]) + label4_target = torch.cat([stop_label4, edge_label4]) + label_dict = {"label1": label1_target, "label2": label2_target, "label3": label3_target, "label4": label4_target} + + # reward reshaping + reward = graph.reward + reward = reward * self.gamma ** (graph.original_num_nodes - graph.num_nodes).float() + + # per graph size reward baseline + weight = torch.ones_like(graph.num_nodes, dtype=torch.float) + baseline = scatter_add(reward, graph.num_nodes, dim_size=self.max_node + 1) / \ + (scatter_add(weight, graph.num_nodes, dim_size=self.max_node + 1) + self.eps) + # TODO: + self.moving_baseline = self.moving_baseline * self.baseline_momentum + baseline * (1 - self.baseline_momentum) + reward -= self.moving_baseline[graph.num_nodes] + reward += graph.is_valid + + # calculate object + stop_logits, node1_logits, node2_logits, edge_logits, index_dict = self.predict(graph, label_dict) + with torch.no_grad(): + old_stop_logits, old_node1_logits, old_node2_logits, old_edge_logits, old_index_dict = self.predict(graph, label_dict, use_agent=True) + + stop_prob = F.log_softmax(stop_logits, dim=-1) + node1_prob = scatter_log_softmax(node1_logits, index_dict["extended_node2graph"]) + node2_prob = scatter_log_softmax(node2_logits, index_dict["extended_node2graph"]) + edge_prob = F.log_softmax(edge_logits, dim=-1) + old_stop_prob = F.log_softmax(old_stop_logits, dim=-1) + old_node1_prob = scatter_log_softmax(old_node1_logits, old_index_dict["extended_node2graph"]) + old_node2_prob = scatter_log_softmax(old_node2_logits, old_index_dict["extended_node2graph"]) + old_edge_prob = F.log_softmax(old_edge_logits, dim=-1) + + cur_logp = stop_prob[:, 0] + node1_prob[index_dict["node1_index_per_graph"]] \ + + node2_prob[index_dict["node2_index_per_graph"]] + torch.gather(edge_prob, -1, label3_target.view(-1, 1)).view(-1) + cur_logp[label4_target==1] = stop_prob[:, 1][label4_target==1] + + old_logp = old_stop_prob[:, 0] + old_node1_prob[old_index_dict["node1_index_per_graph"]] \ + + old_node2_prob[index_dict["node2_index_per_graph"]] + torch.gather(old_edge_prob, -1, label3_target.view(-1, 1)).view(-1) + old_logp[label4_target==1] = old_stop_prob[:, 1][label4_target==1] + objective = functional.clipped_policy_gradient_objective(cur_logp, old_logp, reward) + objective = objective.mean() + metric["PPO objective"] = objective + all_loss += (-objective) + + self.bn_train(is_training) + + return all_loss, metric + + + def MLE_forward(self, batch): + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + graph = batch["graph"] + stop_graph, stop_label1, stop_label2, stop_label3, stop_label4 = self.all_stop(graph) + edge_graph, edge_label1, edge_label2, edge_label3, edge_label4 = self.all_edge(graph) + + graph = self._cat([stop_graph, edge_graph]) + label1_target = torch.cat([stop_label1, edge_label1]) + label2_target = torch.cat([stop_label2, edge_label2]) + label3_target = torch.cat([stop_label3, edge_label3]) + label4_target = torch.cat([stop_label4, edge_label4]) + label_dict = {"label1": label1_target, "label2": label2_target, "label3": label3_target, "label4": label4_target} + stop_logits, node1_logits, node2_logits, edge_logits, index_dict = self.predict(graph, label_dict) + + loss_stop = F.nll_loss(F.log_softmax(stop_logits, dim=-1), label4_target, reduction='none') + loss_stop = 0.5 * (torch.mean(loss_stop[label4_target==0]) + torch.mean(loss_stop[label4_target==1])) + #loss_stop = torch.mean(loss_stop) + metric["stop bce loss"] = loss_stop + all_loss += loss_stop + + loss_node1 = -(scatter_log_softmax(node1_logits, index_dict["extended_node2graph"])[index_dict["node1_index_per_graph"]]) + loss_node1 = torch.mean(loss_node1[label4_target==0]) + metric["node1 loss"] = loss_node1 + all_loss += loss_node1 + + loss_node2 = -(scatter_log_softmax(node2_logits, index_dict["extended_node2graph"])[index_dict["node2_index_per_graph"]]) + loss_node2 = torch.mean(loss_node2[label4_target==0]) + metric["node2 loss"] = loss_node2 + all_loss += loss_node2 + + loss_edge = F.nll_loss(F.log_softmax(edge_logits, dim=-1), label3_target, reduction='none') + + loss_edge = torch.mean(loss_edge[label4_target==0]) + metric["edge loss"] = loss_edge + all_loss += loss_edge + + metric["total loss"] = all_loss + + pred = stop_logits, node1_logits, node2_logits, edge_logits + target = label1_target, label2_target, label3_target, label4_target, index_dict + + metric.update(self.evaluate(pred, target)) + + return all_loss, metric + + def evaluate(self, pred, target): + stop_logits, node1_logits, node2_logits, edge_logits = pred + label1_target, label2_target, label3_target, label4_target, index_dict = target + metric = {} + stop_acc = torch.argmax(stop_logits, -1) == label4_target + metric["stop acc"] = stop_acc.float().mean() + + node1_pred = scatter_max(node1_logits, index_dict["extended_node2graph"])[1] + node1_acc = node1_pred == index_dict["node1_index_per_graph"] + metric["node1 acc"] = node1_acc[label4_target == 0].float().mean() + + node2_pred = scatter_max(node2_logits, index_dict["extended_node2graph"])[1] + node2_acc = node2_pred == index_dict["node2_index_per_graph"] + metric["node2 acc"] = node2_acc[label4_target == 0].float().mean() + + edge_acc = torch.argmax(edge_logits, -1) == label3_target + metric["edge acc"] = edge_acc[label4_target == 0].float().mean() + return metric + + # generation step + # 1. top-1 action + # 2. apply action + + @torch.no_grad() + def _construct_dist(self, prob_, graph): + max_size = max(graph.num_nodes) + self.id2atom.size(0) + probs = torch.zeros((len(graph), max_size), device=prob_.device).view(-1) + start = (graph.num_cum_nodes - graph.num_nodes)[graph.node2graph] + start = torch.arange(graph.num_node, device=self.device) - start + index = torch.arange(graph.num_nodes.size(0), device=self.device) * max_size + index = index[graph.node2graph] + start + probs[index] = prob_[:graph.num_node] + + start_extend = torch.arange(len(self.id2atom), device=self.device).repeat(graph.num_nodes.size()) # (num_graph * 16) + index_extend = torch.arange(len(graph), device=self.device) * max_size + graph.num_nodes + index2graph = torch.arange(len(graph), device=self.device).repeat_interleave(len(self.id2atom)) + index_extend = index_extend[index2graph] + start_extend + probs[index_extend] = prob_[graph.num_node:] + probs = probs.view(len(graph.num_nodes), max_size) + return torch.distributions.Categorical(probs), probs # (n_graph, max_size) + + @torch.no_grad() + def _sample_action(self, graph, off_policy): + if off_policy: + model = self.agent_model + new_atom_embeddings = self.agent_new_atom_embeddings + mlp_stop = self.agent_mlp_stop + mlp_node1 = self.agent_mlp_node1 + mlp_node2 = self.agent_mlp_node2 + mlp_edge = self.agent_mlp_edge + else: + model = self.model + new_atom_embeddings = self.new_atom_embeddings + mlp_stop = self.mlp_stop + mlp_node1 = self.mlp_node1 + mlp_node2 = self.mlp_node2 + mlp_edge = self.mlp_edge + + # step1: get feature + output = model(graph, graph.node_feature.float()) + + extended_node2graph = torch.arange(len(graph), device=self.device).repeat_interleave(len(self.id2atom)) # (num_graph * 16) + extended_node2graph = torch.cat((graph.node2graph, extended_node2graph)) # (num_node + 16 * num_graph) + + graph_feature_per_node = output["graph_feature"][extended_node2graph] + + # step2: predict stop + stop_feature = output["graph_feature"] # (num_graph, n_out) + stop_logits = mlp_stop(stop_feature) # (num_graph, 2) + stop_prob = F.softmax(stop_logits, -1) # (num_graph, 2) + stop_prob_dist = torch.distributions.Categorical(stop_prob) + stop_pred = stop_prob_dist.sample() + # step3: predict first node: node1 + + node1_feature = output["node_feature"] #(num_node, n_out) + + node1_feature = torch.cat((node1_feature, + new_atom_embeddings.repeat([graph.num_nodes.size(0), 1])), 0) # (num_node + 16 * num_graph, n_out) + node2_feature_node2 = node1_feature.clone() # (num_node + 16 * num_graph, n_out) + + node1_feature = torch.cat((node1_feature, graph_feature_per_node), 1) + + node1_logits = mlp_node1(node1_feature).squeeze(1) #(num_node + 16 * num_graph) + #mask the extended part + mask = torch.zeros(node1_logits.size(), device=self.device) + mask[:graph.num_node] = 1 + node1_logits = torch.where(mask>0, node1_logits, -10000.0*torch.ones(node1_logits.size(), device=self.device)) + + node1_prob = scatter_softmax(node1_logits, extended_node2graph) # (num_node + 16 * num_graph) + node1_prob_dist, tmp = self._construct_dist(node1_prob, graph) # (num_graph, max) + + node1_pred = node1_prob_dist.sample() #(num_graph) + node1_index_per_graph = node1_pred + (graph.num_cum_nodes - graph.num_nodes) + # step4: predict second node: node2 + node1_index = node1_index_per_graph[extended_node2graph] # (num_node + 16 * num_graph) + node2_feature_node1 = node1_feature[node1_index] # (num_node + 16 * num_graph, n_out) + + node2_feature = torch.cat((node2_feature_node1, node2_feature_node2), 1) # (num_node + 16 * num_graph, 2n_out) + node2_logits = mlp_node2(node2_feature).squeeze(1) # (num_node + 16 * num_graph) + + # mask the selected node1 + mask = torch.zeros(node2_logits.size(), device=self.device) + mask[node1_index_per_graph] = 1 + node2_logits = torch.where(mask==0, node2_logits, -10000.0*torch.ones(node2_logits.size(), device=self.device)) + node2_prob = scatter_softmax(node2_logits, extended_node2graph) # (num_node + 16 * num_graph) + node2_prob_dist, tmp = self._construct_dist(node2_prob, graph) # (num_graph, max) + node2_pred = node2_prob_dist.sample() # (num_graph,) + is_new_node = node2_pred - graph.num_nodes + graph_offset = torch.arange(graph.num_nodes.size(0), device=self.device) + node2_index_per_graph = torch.where(is_new_node >= 0, + graph.num_node + graph_offset * self.id2atom.size(0) + is_new_node, + node2_pred + graph.num_cum_nodes - graph.num_nodes) + + + # step5: predict edge type + edge_feature_node1 = node2_feature_node2[node1_index_per_graph] # (num_graph, n_out) + edge_feature_node2 = node2_feature_node2[node2_index_per_graph] # (num_graph, n_out) + edge_feature = torch.cat((edge_feature_node1, edge_feature_node2), 1) # (num_graph, 2n_out) + edge_logits = mlp_edge(edge_feature) + edge_prob = F.softmax(edge_logits, -1) # (num_graph, 3) + edge_prob_dist = torch.distributions.Categorical(edge_prob) + edge_pred = edge_prob_dist.sample() + + return stop_pred, node1_pred, node2_pred, edge_pred + + @torch.no_grad() + def _top1_action(self, graph, off_policy): + + if off_policy: + model = self.agent_model + new_atom_embeddings = self.agent_new_atom_embeddings + mlp_stop = self.agent_mlp_stop + mlp_node1 = self.agent_mlp_node1 + mlp_node2 = self.agent_mlp_node2 + mlp_edge = self.agent_mlp_edge + else: + model = self.model + new_atom_embeddings = self.new_atom_embeddings + mlp_stop = self.mlp_stop + mlp_node1 = self.mlp_node1 + mlp_node2 = self.mlp_node2 + mlp_edge = self.mlp_edge + + # step1: get feature + output = model(graph, graph.node_feature.float()) + + extended_node2graph = torch.arange(graph.num_nodes.size(0), + device=self.device).unsqueeze(1).repeat([1, self.id2atom.size(0)]).view(-1) # (num_graph * 16) + extended_node2graph = torch.cat((graph.node2graph, extended_node2graph)) # (num_node + 16 * num_graph) + + graph_feature_per_node = output["graph_feature"][extended_node2graph] + + # step2: predict stop + stop_feature = output["graph_feature"] # (num_graph, n_out) + stop_logits = mlp_stop(stop_feature) # (num_graph, 2) + stop_pred = torch.argmax(stop_logits, -1) # (num_graph,) + # step3: predict first node: node1 + + node1_feature = output["node_feature"] #(num_node, n_out) + + node1_feature = torch.cat((node1_feature, + new_atom_embeddings.repeat([graph.num_nodes.size(0), 1])), 0) # (num_node + 16 * num_graph, n_out) + node2_feature_node2 = node1_feature.clone() # (num_node + 16 * num_graph, n_out) + + node1_feature = torch.cat((node1_feature, graph_feature_per_node), 1) + + node1_logits = mlp_node1(node1_feature).squeeze(1) # (num_node + 16 * num_graph) + # mask the extended part + mask = torch.zeros(node1_logits.size(), device=self.device) + mask[:graph.num_node] = 1 + node1_logits = torch.where(mask>0, node1_logits, -10000.0*torch.ones(node1_logits.size(), device=self.device)) + + node1_index_per_graph = scatter_max(node1_logits, extended_node2graph)[1] # (num_node + 16 * num_graph) + node1_pred = node1_index_per_graph - (graph.num_cum_nodes - graph.num_nodes) + + # step4: predict second node: node2 + node1_index = node1_index_per_graph[extended_node2graph] # (num_node + 16 * num_graph) + node2_feature_node1 = node1_feature[node1_index] # (num_node + 16 * num_graph, n_out) + + node2_feature = torch.cat((node2_feature_node1, node2_feature_node2), 1) # (num_node + 16 * num_graph, 2n_out + node2_logits = mlp_node2(node2_feature).squeeze(1) # (num_node + 16 * num_graph) + + #mask the selected node1 + mask = torch.zeros(node2_logits.size(), device=self.device) + mask[node1_index_per_graph] = 1 + node2_logits = torch.where(mask==0, node2_logits, -10000.0*torch.ones(node2_logits.size(), device=self.device)) + node2_index_per_graph = scatter_max(node2_logits, extended_node2graph)[1] # (num_node + 16 * num_graph) + + is_new_node = node2_index_per_graph - graph.num_node # non negative if is new node + graph_offset = torch.arange(graph.num_nodes.size(0), device=self.device) + node2_pred = torch.where(is_new_node>=0, graph.num_nodes + is_new_node - graph_offset * self.id2atom.size(0), + node2_index_per_graph - (graph.num_cum_nodes - graph.num_nodes)) + + # step5: predict edge type + edge_feature_node1 = node2_feature_node2[node1_index_per_graph] #(num_graph, n_out) + edge_feature_node2 = node2_feature_node2[node2_index_per_graph] # #(num_graph, n_out) + edge_feature = torch.cat((edge_feature_node1, edge_feature_node2), 1) #(num_graph, 2n_out) + edge_logits = mlp_edge(edge_feature) + edge_pred = torch.argmax(edge_logits, -1) + + return stop_pred, node1_pred, node2_pred, edge_pred + + @torch.no_grad() + def _apply_action(self, graph, off_policy, max_resample=10, verbose=0, min_node=5): + # action (num_graph, 4) + + # stopped graph is removed, initialize is_valid as False + is_valid = torch.zeros(len(graph), dtype=torch.bool, device=self.device) + stop_action = torch.zeros(len(graph), dtype=torch.long, device=self.device) + node1_action = torch.zeros(len(graph), dtype=torch.long, device=self.device) + node2_action = torch.zeros(len(graph), dtype=torch.long, device=self.device) + edge_action = torch.zeros(len(graph), dtype=torch.long, device=self.device) + + for i in range(max_resample): + # maximal resample time + mask = ~is_valid + if max_resample == 1: + tmp_stop_action, tmp_node1_action, tmp_node2_action, tmp_edge_action = \ + self._top1_action(graph, off_policy) + else: + tmp_stop_action, tmp_node1_action, tmp_node2_action, tmp_edge_action = \ + self._sample_action(graph, off_policy) + + stop_action[mask] = tmp_stop_action[mask] + node1_action[mask] = tmp_node1_action[mask] + node2_action[mask] = tmp_node2_action[mask] + edge_action[mask] = tmp_edge_action[mask] + + stop_action[graph.num_nodes <= 5] = 0 + # tmp add new nodes + has_new_node = (node2_action >= graph.num_nodes) & (stop_action == 0) + new_atom_id = (node2_action - graph.num_nodes)[has_new_node] + new_atom_type = self.id2atom[new_atom_id] + + atom_type, num_nodes = functional._extend(graph.atom_type, graph.num_nodes, new_atom_type, has_new_node) + + # tmp cast to regular node ids + node2_action = torch.where(has_new_node, graph.num_nodes, node2_action) + + # tmp modify edges + new_edge = torch.stack([node1_action, node2_action], dim=-1) + edge_list = graph.edge_list.clone() + bond_type = graph.bond_type.clone() + edge_list[:, :2] -= graph._offsets.unsqueeze(-1) + is_modified_edge = (edge_list[:, :2] == new_edge[graph.edge2graph]).all(dim=-1) & \ + (stop_action[graph.edge2graph] == 0) + has_modified_edge = scatter_max(is_modified_edge.long(), graph.edge2graph, dim_size=len(graph))[0] > 0 + bond_type[is_modified_edge] = edge_action[has_modified_edge] + edge_list[is_modified_edge, 2] = edge_action[has_modified_edge] + # tmp modify reverse edges + new_edge = new_edge.flip(-1) + is_modified_edge = (edge_list[:, :2] == new_edge[graph.edge2graph]).all(dim=-1) & \ + (stop_action[graph.edge2graph] == 0) + bond_type[is_modified_edge] = edge_action[has_modified_edge] + edge_list[is_modified_edge, 2] = edge_action[has_modified_edge] + + + # tmp add new edges + has_new_edge = (~has_modified_edge) & (stop_action == 0) + new_edge_list = torch.stack([node1_action, node2_action, edge_action], dim=-1)[has_new_edge] + bond_type = functional._extend(bond_type, graph.num_edges, edge_action[has_new_edge], has_new_edge)[0] + edge_list, num_edges = functional._extend(edge_list, graph.num_edges, new_edge_list, has_new_edge) + + # tmp add reverse edges + new_edge_list = torch.stack([node2_action, node1_action, edge_action], dim=-1)[has_new_edge] + bond_type = functional._extend(bond_type, num_edges, edge_action[has_new_edge], has_new_edge)[0] + edge_list, num_edges = functional._extend(edge_list, num_edges, new_edge_list, has_new_edge) + + tmp_graph = type(graph)(edge_list, atom_type=atom_type, bond_type=bond_type, num_nodes=num_nodes, + num_edges=num_edges, num_relation=graph.num_relation) + is_valid = tmp_graph.is_valid | (stop_action == 1) + if is_valid.all(): + break + if not is_valid.all() and verbose: + num_invalid = len(graph) - is_valid.sum().item() + num_working = len(graph) + logger.warning("%d / %d molecules are invalid even after %d resampling" % + (num_invalid, num_working, max_resample)) + + # apply the true action + # inherit attributes + data_dict = graph.data_dict + meta_dict = graph.meta_dict + for key in ["atom_type", "bond_type"]: + data_dict.pop(key) + # pad 0 for node / edge attributes + for k, v in data_dict.items(): + if "node" in meta_dict[k]: + shape = (len(new_atom_type), *v.shape[1:]) + new_data = torch.zeros(shape, dtype=v.dtype, device=self.device) + data_dict[k] = functional._extend(v, graph.num_nodes, new_data, has_new_node)[0] + if "edge" in meta_dict[k]: + shape = (len(new_edge_list) * 2, *v.shape[1:]) + new_data = torch.zeros(shape, dtype=v.dtype, device=self.device) + data_dict[k] = functional._extend(v, graph.num_edges, new_data, has_new_edge * 2)[0] + + new_graph = type(graph)(edge_list, atom_type=atom_type, bond_type=bond_type, num_nodes=num_nodes, + num_edges=num_edges, num_relation=graph.num_relation, + meta_dict=meta_dict, **data_dict) + with new_graph.graph(): + new_graph.is_stopped = stop_action == 1 + + new_graph, feature_valid = self._update_molecule_feature(new_graph) + + return new_graph[feature_valid] + + def _update_molecule_feature(self, graphs): + # This function is very slow + mols = graphs.to_molecule(ignore_error=True) + valid = [mol is not None for mol in mols] + valid = torch.tensor(valid, device=graphs.device) + new_graphs = type(graphs).from_molecule(mols, kekulize=True, atom_feature="symbol") + + node_feature = torch.zeros(graphs.num_node, *new_graphs.node_feature.shape[1:], + dtype=new_graphs.node_feature.dtype, device=graphs.device) + edge_feature = torch.zeros(graphs.num_edge, *new_graphs.edge_feature.shape[1:], + dtype=new_graphs.edge_feature.dtype, device=graphs.device) + bond_type = torch.zeros_like(graphs.bond_type) + node_mask = valid[graphs.node2graph] + edge_mask = valid[graphs.edge2graph] + node_feature[node_mask] = new_graphs.node_feature.to(device=graphs.device) + edge_feature[edge_mask] = new_graphs.edge_feature.to(device=graphs.device) + bond_type[edge_mask] = new_graphs.bond_type.to(device=graphs.device) + + with graphs.node(): + graphs.node_feature = node_feature + with graphs.edge(): + graphs.edge_feature = edge_feature + graphs.bond_type = bond_type + + return graphs, valid + + def bn_train(self, mode=True): + for module in self.modules(): + if isinstance(module, nn.BatchNorm1d): + module.train(mode) + + def bn_eval(self): + for module in self.modules(): + if isinstance(module, nn.BatchNorm1d): + module.eval() + + def update_best_result(self, graph, score, task): + score = score.cpu() + best_results = self.best_results[task] + for s, i in zip(*score.sort(descending=True)): + s = s.item() + i = i.item() + if len(best_results) == self.top_k and s < best_results[-1][0]: + break + best_results.append((s, graph[i].to_smiles())) + best_results.sort(reverse=True) + best_results = best_results[:self.top_k] + self.best_results[task] = best_results + + @torch.no_grad() + def generate(self, num_sample, max_resample=20, off_policy=False, max_step=30 * 2, initial_smiles="C", verbose=0): + is_training = self.training + self.eval() + + graph = data.Molecule.from_smiles(initial_smiles, kekulize=True, atom_feature="symbol").repeat(num_sample) + + # TODO: workaround + if self.device.type == "cuda": + graph = graph.cuda(self.device) + + result = [] + for i in range(max_step): + new_graph = self._apply_action(graph, off_policy, max_resample, verbose=1) + if i == max_step - 1: + # last step, collect all graph that is valid + result.append(new_graph[(new_graph.num_nodes <= (self.max_node))]) + else: + result.append(new_graph[new_graph.is_stopped | (new_graph.num_nodes == (self.max_node))]) + + is_continue = (~new_graph.is_stopped) & (new_graph.num_nodes < (self.max_node)) + graph = new_graph[is_continue] + if len(graph) == 0: + break + + self.train(is_training) + + result = self._cat(result) + return result + + def _append(self, data, num_xs, input, mask=None): + if mask is None: + mask = torch.ones_like(num_xs, dtype=torch.bool) + new_num_xs = num_xs + mask + new_num_cum_xs = new_num_xs.cumsum(0) + new_num_x = new_num_cum_xs[-1].item() + new_data = torch.zeros(new_num_x, *data.shape[1:], dtype=data.dtype, device=data.device) + starts = new_num_cum_xs - new_num_xs + ends = starts + num_xs + index = functional.multi_slice_mask(starts, ends, new_num_x) + new_data[index] = data + new_data[~index] = input[mask] + return new_data, new_num_xs + + @torch.no_grad() + def all_stop(self, graph): + if (graph.num_nodes < 2).any(): + graph = graph[graph.num_nodes >= 2] + warnings.warn("Graphs with less than 2 nodes can't be used for stop prediction learning. Dropped") + + label1 = torch.zeros(len(graph), dtype=torch.long, device=self.device) + label2 = torch.zeros_like(label1) + label3 = torch.zeros_like(label1) + return graph, label1, label2, label3, torch.ones(len(graph), dtype=torch.long, device=self.device) + + + @torch.no_grad() + def all_edge(self, graph): + if (graph.num_nodes < 2).any(): + graph = graph[graph.num_nodes >= 2] + warnings.warn("Graphs with less than 2 nodes can't be used for edge generation learning. Dropped") + + lengths = self._valid_edge_prefix_lengths(graph) + + starts, ends, valid = self._all_prefix_slice(graph.num_nodes ** 2, lengths) + + num_keep_dense_edges = ends - starts + num_repeat = len(starts) // len(graph) + graph = graph.repeat(num_repeat) + + # undirected: all upper triangular edge ids are flipped to lower triangular ids + # 1 -> 2, 4 -> 6, 5 -> 7 + node_index = graph.edge_list[:, :2] - graph._offsets.unsqueeze(-1) + node_in, node_out = node_index.t() + node_large = node_index.max(dim=-1)[0] + node_small = node_index.min(dim=-1)[0] + edge_id = node_large ** 2 + (node_in >= node_out) * node_large + node_small + undirected_edge_id = node_large * (node_large + 1) + node_small + + edge_mask = undirected_edge_id < num_keep_dense_edges[graph.edge2graph] + circum_box_size = (num_keep_dense_edges + 1.0).sqrt().ceil().long() + + # check whether we need to add a new node for the current edge + masked_undirected_edge_id = torch.where(edge_mask, undirected_edge_id, -torch.ones(undirected_edge_id.size(), + dtype=torch.long, device=graph.device)) + current_circum_box_size = scatter_max(masked_undirected_edge_id, graph.edge2graph, dim=0)[0] + current_circum_box_size = (current_circum_box_size + 1.0).sqrt().ceil().long() + is_new_node_edge = (circum_box_size > current_circum_box_size).long() + + starts = graph.num_cum_nodes - graph.num_nodes + ends = starts + circum_box_size - is_new_node_edge + node_mask = functional.multi_slice_mask(starts, ends, graph.num_node) + # compact nodes so that succeeding nodes won't affect graph pooling + new_graph = graph.edge_mask(edge_mask).node_mask(node_mask, compact=True) + + positive_edge = edge_id == num_keep_dense_edges[graph.edge2graph] + positive_graph = scatter_add(positive_edge.long(), graph.edge2graph, dim=0, dim_size=len(graph)).bool() + # default: non-edge + target = (self.model.num_relation) * torch.ones(graph.batch_size, dtype=torch.long, device=graph.device) + target[positive_graph] = graph.edge_list[:, 2][positive_edge] + + # node_in > node_out + node_in = circum_box_size - 1 + node_out = num_keep_dense_edges - node_in * circum_box_size + # if we need to add a new node, what will be its atomid? + new_node_atomid = self.atom2id[graph.atom_type[starts +node_in]] + + # keep only the positive graph, as we will add an edge at each step + new_graph = new_graph[positive_graph] + target = target[positive_graph] + node_in = node_in[positive_graph] + node_out = node_out[positive_graph] + is_new_node_edge = is_new_node_edge[positive_graph] + new_node_atomid = new_node_atomid[positive_graph] + + node_in_extend = new_graph.num_nodes + new_node_atomid + node_in_final = torch.where(is_new_node_edge == 0, node_in, node_in_extend) + + return new_graph, node_out, node_in_final, target, torch.zeros_like(node_out) + + @torch.no_grad() + def _all_prefix_slice(self, num_xs, lengths=None): + # extract a bunch of slices that correspond to the following num_repeat * n masks + # ------ repeat 0 ----- + # graphs[0]: [0, 0, ..., 0] + # ... + # graphs[-1]: [0, 0, ..., 0] + # ------ repeat 1 ----- + # graphs[0]: [1, 0, ..., 0] + # ... + # graphs[-1]: [1, 0, ..., 0] + # ... + # ------ repeat -1 ----- + # graphs[0]: [1, ..., 1, 0] + # ... + # graphs[-1]: [1, ..., 1, 0] + num_cum_xs = num_xs.cumsum(0) + starts = num_cum_xs - num_xs + if lengths is None: + num_max_x = num_xs.max().item() + lengths = torch.arange(num_max_x, device=num_xs.device) + + pack_offsets = torch.arange(len(lengths), device=num_xs.device) * num_cum_xs[-1] + # starts, lengths, ends: (num_repeat, num_graph) + starts = starts.unsqueeze(0) + pack_offsets.unsqueeze(-1) + valid = lengths.unsqueeze(-1) <= num_xs.unsqueeze(0) - 1 + lengths = torch.min(lengths.unsqueeze(-1), num_xs.unsqueeze(0) - 1).clamp(0) + ends = starts + lengths + + starts = starts.flatten() + ends = ends.flatten() + valid = valid.flatten() + + return starts, ends, valid + + @torch.no_grad() + def _valid_edge_prefix_lengths(self, graph): + num_max_node = graph.num_nodes.max().item() + # edge id in an adjacency (snake pattern) + # in + # o 0 1 4 + # u 2 3 5 + # t 6 7 8 + lengths = torch.arange(num_max_node ** 2, device=graph.device) + circum_box_size = (lengths + 1.0).sqrt().ceil().long() + # only keep lengths that ends in the lower triangular part of adjacency matrix + lengths = lengths[lengths >= circum_box_size * (circum_box_size - 1)] + # lengths: [0, 2, 3, 6, 7, 8, ...] + # num_node2length_idx: [0, 1, 4, 6, ...] + # num_edge_unrolls + # 0 + # 1 0 + # 2 1 0 + num_edge_unrolls = (lengths + 1.0).sqrt().ceil().long() ** 2 - lengths - 1 + # num_edge_unrolls: [0, 1, 0, 2, 1, 0, ...] + # remove lengths that unroll too much. they always lead to empty targets. + lengths = lengths[(num_edge_unrolls <= self.max_edge_unroll) & (num_edge_unrolls > 0)] + + return lengths + + def _cat(self, graphs): + for i, graph in enumerate(graphs): + if not isinstance(graph, data.PackedGraph): + graphs[i] = graph.pack([graph]) + + edge_list = torch.cat([graph.edge_list for graph in graphs]) + pack_num_nodes = torch.stack([graph.num_node for graph in graphs]) + pack_num_edges = torch.stack([graph.num_edge for graph in graphs]) + pack_num_cum_edges = pack_num_edges.cumsum(0) + graph_index = pack_num_cum_edges < len(edge_list) + pack_offsets = scatter_add(pack_num_nodes[graph_index], pack_num_cum_edges[graph_index], + dim_size=len(edge_list)) + pack_offsets = pack_offsets.cumsum(0) + + edge_list[:, :2] += pack_offsets.unsqueeze(-1) + offsets = torch.cat([graph._offsets for graph in graphs]) + pack_offsets + + edge_weight = torch.cat([graph.edge_weight for graph in graphs]) + num_nodes = torch.cat([graph.num_nodes for graph in graphs]) + num_edges = torch.cat([graph.num_edges for graph in graphs]) + num_relation = graphs[0].num_relation + assert all(graph.num_relation == num_relation for graph in graphs) + + # only keep attributes that exist in all graphs + keys = set(graphs[0].meta_dict.keys()) + for graph in graphs: + keys = keys.intersection(graph.meta_dict.keys()) + + meta_dict = {k: graphs[0].meta_dict[k] for k in keys} + data_dict = {} + for k in keys: + data_dict[k] = torch.cat([graph.data_dict[k] for graph in graphs]) + + return type(graphs[0])(edge_list, edge_weight=edge_weight, + num_nodes=num_nodes, num_edges=num_edges, num_relation=num_relation, offsets=offsets, + meta_dict=meta_dict, **data_dict) \ No newline at end of file diff --git a/build/lib/torchdrug/tasks/pretrain.py b/build/lib/torchdrug/tasks/pretrain.py new file mode 100644 index 00000000..df974a50 --- /dev/null +++ b/build/lib/torchdrug/tasks/pretrain.py @@ -0,0 +1,584 @@ +import copy +import math + +import torch +from torch import nn +from torch.nn import functional as F +from torch_scatter import scatter_min + +from torchdrug import core, tasks, layers +from torchdrug.data import constant +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("tasks.EdgePrediction") +class EdgePrediction(tasks.Task, core.Configurable): + """ + Edge prediction task proposed in `Inductive Representation Learning on Large Graphs`_. + + .. _Inductive Representation Learning on Large Graphs: + https://arxiv.org/abs/1706.02216 + + Parameters: + model (nn.Module): node representation model + """ + + def __init__(self, model): + super(EdgePrediction, self).__init__() + self.model = model + + def _get_directed(self, graph): + mask = graph.edge_list[:, 0] < graph.edge_list[:, 1] + graph = graph.edge_mask(mask) + return graph + + def predict(self, batch, all_loss=None, metric=None): + graph = batch["graph"] + + output = self.model(graph, graph.node_feature.float(), all_loss, metric) + node_feature = output["node_feature"] + + graph = self._get_directed(graph) + node_in, node_out = graph.edge_list.t()[:2] + neg_index = (torch.rand(2, graph.num_edge, device=self.device) * graph.num_nodes[graph.edge2graph]).long() + neg_index = neg_index + (graph.num_cum_nodes - graph.num_nodes)[graph.edge2graph] + node_in = torch.cat([node_in, neg_index[0]]) + node_out = torch.cat([node_out, neg_index[1]]) + + pred = torch.einsum("bd, bd -> b", node_feature[node_in], node_feature[node_out]) + return pred + + def target(self, batch): + graph = batch["graph"] + target = torch.ones(graph.num_edge, device=self.device) + target[len(target) // 2:] = 0 + return target + + def evaluate(self, pred, target): + metric = {} + accuracy = ((pred > 0) == (target > 0.5)).float().mean() + + name = tasks._get_metric_name("acc") + metric[name] = accuracy + + return metric + + def forward(self, batch): + """""" + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred = self.predict(batch, all_loss, metric) + target = self.target(batch) + loss = F.binary_cross_entropy_with_logits(pred, target) + name = tasks._get_criterion_name("bce") + metric[name] = loss + metric.update(self.evaluate(pred, target)) + + all_loss += loss + + return all_loss, metric + + +@R.register("tasks.AttributeMasking") +class AttributeMasking(tasks.Task, core.Configurable): + """ + Attribute masking proposed in `Strategies for Pre-training Graph Neural Networks`_. + + .. _Strategies for Pre-training Graph Neural Networks: + https://arxiv.org/abs/1905.12265 + + Parameters: + model (nn.Module): node representation model + mask_rate (float, optional): rate of masked nodes + num_mlp_layer (int, optional): number of MLP layers + """ + + def __init__(self, model, mask_rate=0.15, num_mlp_layer=2, graph_construction_model=None): + super(AttributeMasking, self).__init__() + self.model = model + self.mask_rate = mask_rate + self.num_mlp_layer = num_mlp_layer + self.graph_construction_model = graph_construction_model + + def preprocess(self, train_set, valid_set, test_set): + data = train_set[0] + self.view = getattr(data["graph"], "view", "atom") + if hasattr(self.model, "node_output_dim"): + model_output_dim = self.model.node_output_dim + else: + model_output_dim = self.model.output_dim + if self.view == "atom": + num_label = constant.NUM_ATOM + else: + num_label = constant.NUM_AMINO_ACID + self.mlp = layers.MLP(model_output_dim, [model_output_dim] * (self.num_mlp_layer - 1) + [num_label]) + + def predict_and_target(self, batch, all_loss=None, metric=None): + graph = batch["graph"] + if self.graph_construction_model: + graph = self.graph_construction_model.apply_node_layer(graph) + + num_nodes = graph.num_nodes if self.view in ["atom", "node"] else graph.num_residues + num_cum_nodes = num_nodes.cumsum(0) + num_samples = (num_nodes * self.mask_rate).long().clamp(1) + num_sample = num_samples.sum() + sample2graph = torch.repeat_interleave(num_samples) + node_index = (torch.rand(num_sample, device=self.device) * num_nodes[sample2graph]).long() + node_index = node_index + (num_cum_nodes - num_nodes)[sample2graph] + + if self.view == "atom": + target = graph.atom_type[node_index] + input = graph.node_feature.float() + input[node_index] = 0 + else: + target = graph.residue_type[node_index] + with graph.residue(): + graph.residue_feature[node_index] = 0 + graph.residue_type[node_index] = 0 + # Generate masked edge features. Any better implementation? + if self.graph_construction_model: + graph = self.graph_construction_model.apply_edge_layer(graph) + input = graph.residue_feature.float() + + output = self.model(graph, input, all_loss, metric) + if self.view in ["node", "atom"]: + node_feature = output["node_feature"] + else: + node_feature = output.get("residue_feature", output.get("node_feature")) + node_feature = node_feature[node_index] + pred = self.mlp(node_feature) + + return pred, target + + def evaluate(self, pred, target): + metric = {} + accuracy = (pred.argmax(dim=-1) == target).float().mean() + + name = tasks._get_metric_name("acc") + metric[name] = accuracy + + return metric + + def forward(self, batch): + """""" + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred, target = self.predict_and_target(batch, all_loss, metric) + metric.update(self.evaluate(pred, target)) + + loss = F.cross_entropy(pred, target) + name = tasks._get_criterion_name("ce") + metric[name] = loss + + all_loss += loss + + return all_loss, metric + + +@R.register("tasks.ContextPrediction") +class ContextPrediction(tasks.Task, core.Configurable): + """ + Context prediction task proposed in `Strategies for Pre-training Graph Neural Networks`_. + + .. _Strategies for Pre-training Graph Neural Networks: + https://arxiv.org/abs/1905.12265 + + For a given center node, the subgraph is defined as a k-hop neighborhood (inclusive) around the selected node. + The context graph is defined as the surrounding graph structure between r1- (exclusive) and r2-hop (inclusive) + from the center node. Nodes between k- and r1-hop are picked as anchor nodes for the context representation. + + Parameters: + model (nn.Module): node representation model for subgraphs. + context_model (nn.Module, optional): node representation model for context graphs. + By default, use the same architecture as ``model`` without parameter sharing. + k (int, optional): radius for subgraphs + r1 (int, optional): inner radius for context graphs + r2 (int, optional): outer radius for context graphs + readout (nn.Module, optional): readout function over context anchor nodes + num_negative (int, optional): number of negative samples per positive sample + """ + + def __init__(self, model, context_model=None, k=5, r1=4, r2=7, readout="mean", num_negative=1): + super(ContextPrediction, self).__init__() + self.model = model + self.k = k + self.r1 = r1 + self.r2 = r2 + self.num_negative = num_negative + assert r1 < k < r2 + + if context_model is None: + self.context_model = copy.deepcopy(model) + else: + self.context_model = context_model + if readout == "sum": + self.readout = layers.SumReadout() + elif readout == "mean": + self.readout = layers.MeanReadout() + else: + raise ValueError("Unknown readout `%s`" % readout) + + def substruct_and_context(self, graph): + center_index = (torch.rand(len(graph), device=self.device) * graph.num_nodes).long() + center_index = center_index + graph.num_cum_nodes - graph.num_nodes + dist = torch.full((graph.num_node,), self.r2 + 1, dtype=torch.long, device=self.device) + dist[center_index] = 0 + + # single source shortest path + node_in, node_out = graph.edge_list.t()[:2] + for i in range(self.r2): + new_dist = scatter_min(dist[node_in], node_out, dim_size=graph.num_node)[0] + 1 + dist = torch.min(dist, new_dist) + + substruct_mask = dist <= self.k + context_mask = (dist > self.r1) & (dist <= self.r2) + is_center_node = functional.as_mask(center_index, graph.num_node) + is_anchor_node = (dist > self.r1) & (dist <= self.k) + + substruct = graph.clone() + context = graph.clone() + with substruct.node(): + substruct.is_center_node = is_center_node + with context.node(): + context.is_anchor_node = is_anchor_node + + substruct = substruct.subgraph(substruct_mask) + context = context.subgraph(context_mask) + valid = context.num_nodes > 0 + substruct = substruct[valid] + context = context[valid] + + return substruct, context + + def predict_and_target(self, batch, all_loss=None, metric=None): + graph = batch["graph"] + substruct, context = self.substruct_and_context(graph) + anchor = context.subgraph(context.is_anchor_node) + + substruct_output = self.model(substruct, substruct.node_feature.float(), all_loss, metric) + substruct_feature = substruct_output["node_feature"][substruct.is_center_node] + + context_output = self.context_model(context, context.node_feature.float(), all_loss, metric) + anchor_feature = context_output["node_feature"][context.is_anchor_node] + context_feature = self.readout(anchor, anchor_feature) + + shift = torch.arange(self.num_negative, device=self.device) + 1 + neg_index = (torch.arange(len(context), device=self.device).unsqueeze(-1) + shift) % len(context) # (batch_size, num_negative) + context_feature = torch.cat([context_feature.unsqueeze(1), context_feature[neg_index]], dim=1) + substruct_feature = substruct_feature.unsqueeze(1).expand_as(context_feature) + + pred = torch.einsum("bnd, bnd -> bn", substruct_feature, context_feature) + target = torch.zeros_like(pred) + target[:, 0] = 1 + return pred, target + + def evaluate(self, pred, target): + metric = {} + accuracy = ((pred > 0) == (target > 0.5)).float().mean() + + name = tasks._get_metric_name("acc") + metric[name] = accuracy + + return metric + + def forward(self, batch): + """""" + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred, target = self.predict_and_target(batch, all_loss, metric) + metric.update(self.evaluate(pred, target)) + + loss = F.binary_cross_entropy_with_logits(pred, target) + name = tasks._get_criterion_name("bce") + metric[name] = loss + + all_loss += loss + + return all_loss, metric + + +@R.register("tasks.DistancePrediction") +class DistancePrediction(tasks.Task, core.Configurable): + """ + Pairwise spatial distance prediction task proposed in + `Protein Representation Learning by Geometric Structure Pretraining`_. + + .. _Protein Representation Learning by Geometric Structure Pretraining: + https://arxiv.org/pdf/2203.06125.pdf + + Randomly select some edges and predict the lengths of the edges using the representations of two nodes. + The selected edges are removed from the input graph to prevent trivial solutions. + + Parameters: + model (nn.Module): node representation model + num_sample (int, optional): number of edges selected from each graph + num_mlp_layer (int, optional): number of MLP layers in distance predictor + graph_construction_model (nn.Module, optional): graph construction model + """ + + def __init__(self, model, num_sample=256, num_mlp_layer=2, graph_construction_model=None): + super(DistancePrediction, self).__init__() + self.model = model + self.num_sample = num_sample + self.num_mlp_layer = num_mlp_layer + self.graph_construction_model = graph_construction_model + + self.mlp = layers.MLP(2 * model.output_dim, [model.output_dim] * (num_mlp_layer - 1) + [1]) + + def predict_and_target(self, batch, all_loss=None, metric=None): + graph = batch["graph"] + if self.graph_construction_model: + graph = self.graph_construction_model(graph) + + node_in, node_out = graph.edge_list[:, :2].t() + indices = torch.arange(graph.num_edge, device=self.device) + indices = functional.variadic_sample(indices, graph.num_edges, self.num_sample).flatten(-2, -1) + node_i = node_in[indices] + node_j = node_out[indices] + graph = graph.edge_mask(~functional.as_mask(indices, graph.num_edge)) + + # Calculate distance + target = (graph.node_position[node_i] - graph.node_position[node_j]).norm(p=2, dim=-1) + + output = self.model(graph, graph.node_feature.float() , all_loss, metric)["node_feature"] + node_feature = torch.cat([output[node_i], output[node_j]], dim=-1) + pred = self.mlp(node_feature).squeeze(-1) + + return pred, target + + def evaluate(self, pred, target): + metric = {} + mse = F.mse_loss(pred, target) + + name = tasks._get_metric_name("mse") + metric[name] = mse + + return metric + + def forward(self, batch): + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred, target = self.predict_and_target(batch, all_loss, metric) + metric.update(self.evaluate(pred, target)) + + loss = F.mse_loss(pred, target) + name = tasks._get_criterion_name("mse") + metric[name] = loss + + all_loss += loss + + return all_loss, metric + + +@R.register("tasks.AnglePrediction") +class AnglePrediction(tasks.Task, core.Configurable): + """ + Angle prediction task proposed in `Protein Representation Learning by Geometric Structure Pretraining`_. + + .. _Protein Representation Learning by Geometric Structure Pretraining: + https://arxiv.org/pdf/2203.06125.pdf + + Randomly select pairs of adjacent edges and predict the angles between them using the representations of three + nodes. The selected edges are removed from the input graph to prevent trivial solutions. + + Parameters: + model (nn.Module): node representation model + num_sample (int, optional): number of edge pairs selected from each graph + num_class (int, optional): number of classes to discretize the angles + num_mlp_layer (int, optional): number of MLP layers in angle predictor + graph_construction_model (nn.Module, optional): graph construction model + """ + + def __init__(self, model, num_sample=256, num_class=8, num_mlp_layer=2, graph_construction_model=None): + super(AnglePrediction, self).__init__() + self.model = model + self.num_sample = num_sample + self.num_mlp_layer = num_mlp_layer + self.graph_construction_model = graph_construction_model + + boundary = torch.arange(0, math.pi, math.pi / num_class) + self.register_buffer("boundary", boundary) + + self.mlp = layers.MLP(3 * model.output_dim, [model.output_dim] * (num_mlp_layer - 1) + [num_class]) + + def predict_and_target(self, batch, all_loss=None, metric=None): + graph = batch["graph"] + if self.graph_construction_model: + graph = self.graph_construction_model(graph) + + node_in, node_out = graph.edge_list[:, :2].t() + + line_graph = graph.line_graph() + edge_in, edge_out = line_graph.edge_list[:, :2].t() + is_self_loop1 = (edge_in == edge_out) + is_self_loop2 = (node_in[edge_in] == node_out[edge_out]) + is_remove = is_self_loop1 | is_self_loop2 + line_graph = line_graph.edge_mask(~is_remove) + edge_in, edge_out = line_graph.edge_list[:, :2].t() + # (k->j) - (j->i) + node_i = node_out[edge_out] + node_j = node_in[edge_out] + node_k = node_in[edge_in] + indices = torch.arange(line_graph.num_edge, device=self.device) + indices = functional.variadic_sample(indices, line_graph.num_edges, self.num_sample).flatten(-2, -1) + node_i = node_i[indices] + node_j = node_j[indices] + node_k = node_k[indices] + + mask = torch.ones((graph.num_edge,), device=graph.device, dtype=torch.bool) + mask[edge_out[indices]] = 0 + mask[edge_in[indices]] = 0 + graph = graph.edge_mask(mask) + + # Calculate angles + vector1 = graph.node_position[node_i] - graph.node_position[node_j] + vector2 = graph.node_position[node_k] - graph.node_position[node_j] + x = (vector1 * vector2).sum(dim=-1) + y = torch.cross(vector1, vector2).norm(dim=-1) + angle = torch.atan2(y, x) + target = torch.bucketize(angle, self.boundary, right=True) - 1 + + output = self.model(graph, graph.node_feature.float() , all_loss, metric)["node_feature"] + node_feature = torch.cat([output[node_i], output[node_j], output[node_k]], dim=-1) + pred = self.mlp(node_feature) + + return pred, target + + def evaluate(self, pred, target): + metric = {} + accuracy = (pred.argmax(dim=-1) == target).float().mean() + + name = tasks._get_metric_name("acc") + metric[name] = accuracy + + return metric + + def forward(self, batch): + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred, target = self.predict_and_target(batch, all_loss, metric) + metric.update(self.evaluate(pred, target)) + + loss = F.cross_entropy(pred, target) + name = tasks._get_criterion_name("ce") + metric[name] = loss + + all_loss += loss + + return all_loss, metric + + +@R.register("tasks.DihedralPrediction") +class DihedralPrediction(tasks.Task, core.Configurable): + """ + Dihedral prediction task proposed in `Protein Representation Learning by Geometric Structure Pretraining`_. + + .. _Protein Representation Learning by Geometric Structure Pretraining: + https://arxiv.org/pdf/2203.06125.pdf + + Randomly select three consecutive edges and predict the dihedrals among them using the representations of four + nodes. The selected edges are removed from the input graph to prevent trivial solutions. + + Parameters: + model (nn.Module): node representation model + num_sample (int, optional): number of edge triplets selected from each graph + num_class (int, optional): number of classes for discretizing the dihedrals + num_mlp_layer (int, optional): number of MLP layers in dihedral angle predictor + graph_construction_model (nn.Module, optional): graph construction model + """ + + def __init__(self, model, num_sample=256, num_class=8, num_mlp_layer=2, graph_construction_model=None): + super(DihedralPrediction, self).__init__() + self.model = model + self.num_sample = num_sample + self.num_mlp_layer = num_mlp_layer + self.graph_construction_model = graph_construction_model + + boundary = torch.arange(0, math.pi, math.pi / num_class) + self.register_buffer("boundary", boundary) + + self.mlp = layers.MLP(4 * model.output_dim, [model.output_dim] * (num_mlp_layer - 1) + [num_class]) + + def predict_and_target(self, batch, all_loss=None, metric=None): + graph = batch["graph"] + if self.graph_construction_model: + graph = self.graph_construction_model(graph) + + node_in, node_out = graph.edge_list[:, :2].t() + line_graph = graph.line_graph() + edge_in, edge_out = line_graph.edge_list[:, :2].t() + is_self_loop1 = (edge_in == edge_out) + is_self_loop2 = (node_in[edge_in] == node_out[edge_out]) + is_remove = is_self_loop1 | is_self_loop2 + line_graph = line_graph.edge_mask(~is_remove) + edge_in, edge_out = line_graph.edge_list[:, :2].t() + + line2_graph = line_graph.line_graph() + edge2_in, edge2_out = line2_graph.edge_list.t()[:2] + is_self_loop1 = (edge2_in == edge2_out) + is_self_loop2 = (edge_in[edge2_in] == edge_out[edge2_out]) + is_remove = is_self_loop1 | is_self_loop2 + line2_graph = line2_graph.edge_mask(~is_remove) + edge2_in, edge2_out = line2_graph.edge_list[:, :2].t() + # (k->t->j) - (t->j->i) + node_i = node_out[edge_out[edge2_out]] + node_j = node_in[edge_out[edge2_out]] + node_t = node_in[edge_out[edge2_in]] + node_k = node_in[edge_in[edge2_in]] + indices = torch.arange(line2_graph.num_edge, device=self.device) + indices = functional.variadic_sample(indices, line2_graph.num_edges, self.num_sample).flatten(-2, -1) + node_i = node_i[indices] + node_j = node_j[indices] + node_t = node_t[indices] + node_k = node_k[indices] + mask = torch.ones((graph.num_edge,), device=graph.device, dtype=torch.bool) + mask[edge_out[edge2_out[indices]]] = 0 + mask[edge_out[edge2_in[indices]]] = 0 + mask[edge_in[edge2_in[indices]]] = 0 + graph = graph.edge_mask(mask) + + v_ctr = graph.node_position[node_t] - graph.node_position[node_j] # (A, 3) + v1 = graph.node_position[node_i] - graph.node_position[node_j] + v2 = graph.node_position[node_k] - graph.node_position[node_t] + n1 = torch.cross(v_ctr, v1, dim=-1) # Normal vectors of the two planes + n2 = torch.cross(v_ctr, v2, dim=-1) + a = (n1 * n2).sum(dim=-1) + b = torch.cross(n1, n2).norm(dim=-1) + dihedral = torch.atan2(b, a) + target = torch.bucketize(dihedral, self.boundary, right=True) - 1 + + output = self.model(graph, graph.node_feature.float() , all_loss, metric)["node_feature"] + node_feature = torch.cat([output[node_i], output[node_j], output[node_k], output[node_t]], dim=-1) + pred = self.mlp(node_feature) + + return pred, target + + def evaluate(self, pred, target): + metric = {} + accuracy = (pred.argmax(dim=-1) == target).float().mean() + + name = tasks._get_metric_name("acc") + metric[name] = accuracy + + return metric + + def forward(self, batch): + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred, target = self.predict_and_target(batch, all_loss, metric) + metric.update(self.evaluate(pred, target)) + + loss = F.cross_entropy(pred, target) + name = tasks._get_criterion_name("ce") + metric[name] = loss + + all_loss += loss + + return all_loss, metric diff --git a/build/lib/torchdrug/tasks/property_prediction.py b/build/lib/torchdrug/tasks/property_prediction.py new file mode 100644 index 00000000..fb60fe2d --- /dev/null +++ b/build/lib/torchdrug/tasks/property_prediction.py @@ -0,0 +1,569 @@ +import math +from collections import defaultdict + +import torch +from torch import nn +from torch.nn import functional as F + +from torchdrug import core, layers, tasks, metrics, utils +from torchdrug.core import Registry as R +from torchdrug.layers import functional + + +@R.register("tasks.PropertyPrediction") +class PropertyPrediction(tasks.Task, core.Configurable): + """ + Graph / molecule / protein property prediction task. + + This class is also compatible with semi-supervised learning. + + Parameters: + model (nn.Module): graph representation model + task (str, list or dict, optional): training task(s). + For dict, the keys are tasks and the values are the corresponding weights. + criterion (str, list or dict, optional): training criterion(s). For dict, the keys are criterions and the values + are the corresponding weights. Available criterions are ``mse``, ``bce`` and ``ce``. + metric (str or list of str, optional): metric(s). + Available metrics are ``mae``, ``rmse``, ``auprc`` and ``auroc``. + num_mlp_layer (int, optional): number of layers in mlp prediction head + normalization (bool, optional): whether to normalize the target + num_class (int, optional): number of classes + mlp_batch_norm (bool, optional): apply batch normalization in mlp or not + mlp_dropout (float, optional): dropout in mlp + graph_construction_model (nn.Module, optional): graph construction model + verbose (int, optional): output verbose level + """ + + eps = 1e-10 + _option_members = {"task", "criterion", "metric"} + + def __init__(self, model, task=(), criterion="mse", metric=("mae", "rmse"), num_mlp_layer=1, + normalization=True, num_class=None, mlp_batch_norm=False, mlp_dropout=0, + graph_construction_model=None, verbose=0): + super(PropertyPrediction, self).__init__() + self.model = model + self.task = task + self.criterion = criterion + self.metric = metric + self.num_mlp_layer = num_mlp_layer + # For classification tasks, we disable normalization tricks. + self.normalization = normalization and ("ce" not in criterion) and ("bce" not in criterion) + self.num_class = (num_class,) if isinstance(num_class, int) else num_class + self.mlp_batch_norm = mlp_batch_norm + self.mlp_dropout = mlp_dropout + self.graph_construction_model = graph_construction_model + self.verbose = verbose + + def preprocess(self, train_set, valid_set, test_set): + """ + Compute the mean and derivation for each task on the training set. + """ + values = defaultdict(list) + for sample in train_set: + if not sample.get("labeled", True): + continue + for task in self.task: + if not math.isnan(sample[task]): + values[task].append(sample[task]) + mean = [] + std = [] + weight = [] + num_class = [] + for task, w in self.task.items(): + value = torch.tensor(values[task]) + mean.append(value.float().mean()) + std.append(value.float().std()) + weight.append(w) + if value.ndim > 1: + num_class.append(value.shape[1]) + elif value.dtype == torch.long: + task_class = value.max().item() + if task_class == 1 and "bce" in self.criterion: + num_class.append(1) + else: + num_class.append(task_class + 1) + else: + num_class.append(1) + + self.register_buffer("mean", torch.as_tensor(mean, dtype=torch.float)) + self.register_buffer("std", torch.as_tensor(std, dtype=torch.float)) + self.register_buffer("weight", torch.as_tensor(weight, dtype=torch.float)) + self.num_class = self.num_class or num_class + + hidden_dims = [self.model.output_dim] * (self.num_mlp_layer - 1) + self.mlp = layers.MLP(self.model.output_dim, hidden_dims + [sum(self.num_class)], + batch_norm=self.mlp_batch_norm, dropout=self.mlp_dropout) + + def forward(self, batch): + """""" + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred = self.predict(batch, all_loss, metric) + + if all([t not in batch for t in self.task]): + # unlabeled data + return all_loss, metric + + target = self.target(batch) + labeled = ~torch.isnan(target) + target[~labeled] = 0 + + for criterion, weight in self.criterion.items(): + if criterion == "mse": + if self.normalization: + loss = F.mse_loss((pred - self.mean) / self.std, (target - self.mean) / self.std, reduction="none") + else: + loss = F.mse_loss(pred, target, reduction="none") + elif criterion == "bce": + loss = F.binary_cross_entropy_with_logits(pred, target, reduction="none") + elif criterion == "ce": + loss = F.cross_entropy(pred, target.long().squeeze(-1), reduction="none").unsqueeze(-1) + else: + raise ValueError("Unknown criterion `%s`" % criterion) + loss = functional.masked_mean(loss, labeled, dim=0) + + name = tasks._get_criterion_name(criterion) + if self.verbose > 0: + for t, l in zip(self.task, loss): + metric["%s [%s]" % (name, t)] = l + loss = (loss * self.weight).sum() / self.weight.sum() + metric[name] = loss + all_loss += loss * weight + + return all_loss, metric + + def predict(self, batch, all_loss=None, metric=None): + graph = batch["graph"] + if self.graph_construction_model: + graph = self.graph_construction_model(graph) + output = self.model(graph, graph.node_feature.float(), all_loss=all_loss, metric=metric) + pred = self.mlp(output["graph_feature"]) + if self.normalization: + pred = pred * self.std + self.mean + return pred + + def target(self, batch): + target = torch.stack([batch[t].float() for t in self.task], dim=-1) + labeled = batch.get("labeled", torch.ones(len(target), dtype=torch.bool, device=target.device)) + target[~labeled] = math.nan + return target + + def evaluate(self, pred, target): + labeled = ~torch.isnan(target) + + metric = {} + for _metric in self.metric: + if _metric == "mae": + score = F.l1_loss(pred, target, reduction="none") + score = functional.masked_mean(score, labeled, dim=0) + elif _metric == "rmse": + score = F.mse_loss(pred, target, reduction="none") + score = functional.masked_mean(score, labeled, dim=0).sqrt() + elif _metric == "acc": + score = [] + num_class = 0 + for i, cur_num_class in enumerate(self.num_class): + _pred = pred[:, num_class:num_class + cur_num_class] + _target = target[:, i] + _labeled = labeled[:, i] + _score = metrics.accuracy(_pred[_labeled], _target[_labeled].long()) + score.append(_score) + num_class += cur_num_class + score = torch.stack(score) + elif _metric == "mcc": + score = [] + num_class = 0 + for i, cur_num_class in enumerate(self.num_class): + _pred = pred[:, num_class:num_class + cur_num_class] + _target = target[:, i] + _labeled = labeled[:, i] + _score = metrics.matthews_corrcoef(_pred[_labeled], _target[_labeled].long()) + score.append(_score) + num_class += cur_num_class + score = torch.stack(score) + elif _metric == "auroc": + score = [] + for _pred, _target, _labeled in zip(pred.t(), target.long().t(), labeled.t()): + _score = metrics.area_under_roc(_pred[_labeled], _target[_labeled]) + score.append(_score) + score = torch.stack(score) + elif _metric == "auprc": + score = [] + for _pred, _target, _labeled in zip(pred.t(), target.long().t(), labeled.t()): + _score = metrics.area_under_prc(_pred[_labeled], _target[_labeled]) + score.append(_score) + score = torch.stack(score) + elif _metric == "r2": + score = [] + for _pred, _target, _labeled in zip(pred.t(), target.t(), labeled.t()): + _score = metrics.r2(_pred[_labeled], _target[_labeled]) + score.append(_score) + score = torch.stack(score) + elif _metric == "spearmanr": + score = [] + for _pred, _target, _labeled in zip(pred.t(), target.t(), labeled.t()): + _score = metrics.spearmanr(_pred[_labeled], _target[_labeled]) + score.append(_score) + score = torch.stack(score) + elif _metric == "pearsonr": + score = [] + for _pred, _target, _labeled in zip(pred.t(), target.t(), labeled.t()): + _score = metrics.pearsonr(_pred[_labeled], _target[_labeled]) + score.append(_score) + score = torch.stack(score) + else: + raise ValueError("Unknown metric `%s`" % _metric) + + name = tasks._get_metric_name(_metric) + for t, s in zip(self.task, score): + metric["%s [%s]" % (name, t)] = s + + return metric + + +@R.register("tasks.MultipleBinaryClassification") +class MultipleBinaryClassification(tasks.Task, core.Configurable): + """ + Multiple binary classification task for graphs / molecules / proteins. + + Parameters: + model (nn.Module): graph representation model + task (list of int, optional): training task id(s). + criterion (list or dict, optional): training criterion(s). For dict, the keys are criterions and the values + are the corresponding weights. Available criterions are ``bce``. + metric (str or list of str, optional): metric(s). + Available metrics are ``auroc@macro``, ``auprc@macro``, ``auroc@micro``, ``auprc@micro`` and ``f1_max``. + num_mlp_layer (int, optional): number of layers in the MLP prediction head + normalization (bool, optional): whether to normalize the target + reweight (bool, optional): whether to re-weight tasks according to the number of positive samples + graph_construction_model (nn.Module, optional): graph construction model + verbose (int, optional): output verbose level + """ + + eps = 1e-10 + _option_members = {"criterion", "metric"} + + def __init__(self, model, task=(), criterion="bce", metric=("auprc@micro", "f1_max"), num_mlp_layer=1, + normalization=True, reweight=False, graph_construction_model=None, verbose=0): + super(MultipleBinaryClassification, self).__init__() + self.model = model + self.task = task + self.register_buffer("task_indices", torch.LongTensor(task)) + self.criterion = criterion + self.metric = metric + self.num_mlp_layer = num_mlp_layer + self.normalization = normalization + self.reweight = reweight + self.graph_construction_model = graph_construction_model + self.verbose = verbose + + hidden_dims = [self.model.output_dim] * (self.num_mlp_layer - 1) + self.mlp = layers.MLP(self.model.output_dim, hidden_dims + [len(task)]) + + def preprocess(self, train_set, valid_set, test_set): + """ + Compute the weight for each task on the training set. + """ + values = [] + for data in train_set: + values.append(data["targets"][self.task_indices]) + values = torch.stack(values, dim=0) + + if self.reweight: + num_positive = values.sum(dim=0) + weight = (num_positive.mean() / num_positive).clamp(1, 10) + else: + weight = torch.ones(len(self.task), dtype=torch.float) + + self.register_buffer("weight", torch.as_tensor(weight, dtype=torch.float)) + + def forward(self, batch): + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred = self.predict(batch, all_loss, metric) + target = self.target(batch) + + for criterion, weight in self.criterion.items(): + if criterion == "bce": + loss = F.binary_cross_entropy_with_logits(pred, target, reduction="none") + else: + raise ValueError("Unknown criterion `%s`" % criterion) + loss = loss.mean(dim=0) + loss = (loss * self.weight).sum() / self.weight.sum() + + name = tasks._get_criterion_name(criterion) + metric[name] = loss + all_loss += loss * weight + + return all_loss, metric + + def predict(self, batch, all_loss=None, metric=None): + graph = batch["graph"] + if self.graph_construction_model: + graph = self.graph_construction_model(graph) + output = self.model(graph, graph.node_feature.float(), all_loss=all_loss, metric=metric) + pred = self.mlp(output["graph_feature"]) + return pred + + def target(self, batch): + target = batch["targets"][:, self.task_indices] + return target + + def evaluate(self, pred, target): + metric = {} + for _metric in self.metric: + if _metric == "auroc@micro": + score = metrics.area_under_roc(pred.flatten(), target.long().flatten()) + elif _metric == "auroc@macro": + score = metrics.variadic_area_under_roc(pred, target.long(), dim=0).mean() + elif _metric == "auprc@micro": + score = metrics.area_under_prc(pred.flatten(), target.long().flatten()) + elif _metric == "auprc@macro": + score = metrics.variadic_area_under_prc(pred, target.long(), dim=0).mean() + elif _metric == "f1_max": + score = metrics.f1_max(pred, target) + else: + raise ValueError("Unknown criterion `%s`" % _metric) + + name = tasks._get_metric_name(_metric) + metric[name] = score + + return metric + + +@R.register("tasks.NodePropertyPrediction") +class NodePropertyPrediction(tasks.Task, core.Configurable): + """ + Node / atom / residue property prediction task. + + Parameters: + model (nn.Module): graph representation model + criterion (str, list or dict, optional): training criterion(s). For dict, the keys are criterions and the values + are the corresponding weights. Available criterions are ``mse``, ``bce`` and ``ce``. + metric (str or list of str, optional): metric(s). + Available metrics are ``mae``, ``rmse``, ``auprc`` and ``auroc``. + num_mlp_layer (int, optional): number of layers in mlp prediction head + normalization (bool, optional): whether to normalize the target + Available entities are ``node``, ``atom`` and ``residue``. + num_class (int, optional): number of classes + verbose (int, optional): output verbose level + """ + + _option_members = {"criterion", "metric"} + + def __init__(self, model, criterion="bce", metric=("macro_auprc", "macro_auroc"), num_mlp_layer=1, + normalization=True, num_class=None, verbose=0): + super(NodePropertyPrediction, self).__init__() + self.model = model + self.criterion = criterion + self.metric = metric + # For classification tasks, we disable normalization tricks. + self.normalization = normalization and ("ce" not in criterion) and ("bce" not in criterion) + self.num_mlp_layer = num_mlp_layer + self.num_class = num_class + self.verbose = verbose + + def preprocess(self, train_set, valid_set, test_set): + """ + Compute the mean and derivation on the training set. + """ + self.view = getattr(train_set[0]["graph"], "view", "atom") + values = torch.cat([data["graph"].target for data in train_set]) + mean = values.float().mean() + std = values.float().std() + if values.dtype == torch.long: + num_class = values.max().item() + if num_class > 1 or "bce" not in self.criterion: + num_class += 1 + else: + num_class = 1 + + self.register_buffer("mean", torch.as_tensor(mean, dtype=torch.float)) + self.register_buffer("std", torch.as_tensor(std, dtype=torch.float)) + self.num_class = self.num_class or num_class + + if hasattr(self.model, "node_output_dim"): + model_output_dim = self.model.node_output_dim + else: + model_output_dim = self.model.output_dim + hidden_dims = [model_output_dim] * (self.num_mlp_layer - 1) + self.mlp = layers.MLP(model_output_dim, hidden_dims + [self.num_class]) + + def predict(self, batch, all_loss=None, metric=None): + graph = batch["graph"] + output = self.model(graph, graph.node_feature.float(), all_loss=all_loss, metric=metric) + if self.view in ["node", "atom"]: + output_feature = output["node_feature"] + else: + output_feature = output.get("residue_feature", output.get("node_feature")) + pred = self.mlp(output_feature) + if self.normalization: + pred = pred * self.std + self.mean + return pred + + def target(self, batch): + size = batch["graph"].num_nodes if self.view in ["node", "atom"] else batch["graph"].num_residues + return { + "label": batch["graph"].target, + "mask": batch["graph"].mask, + "size": size + } + + def forward(self, batch): + """""" + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred, target = self.predict_and_target(batch, all_loss, metric) + labeled = ~torch.isnan(target["label"]) & target["mask"] + + for criterion, weight in self.criterion.items(): + if criterion == "mse": + if self.normalization: + loss = F.mse_loss((pred - self.mean) / self.std, (target - self.mean) / self.std, reduction="none") + else: + loss = F.mse_loss(pred, target, reduction="none") + elif criterion == "bce": + loss = F.binary_cross_entropy_with_logits(pred, target["label"].float(), reduction="none") + elif criterion == "ce": + loss = F.cross_entropy(pred, target["label"], reduction="none") + else: + raise ValueError("Unknown criterion `%s`" % criterion) + loss = functional.masked_mean(loss, labeled, dim=0) + + name = tasks._get_criterion_name(criterion) + metric[name] = loss + all_loss += loss * weight + + all_loss += loss + + return all_loss, metric + + def evaluate(self, pred, target): + metric = {} + _target = target["label"] + _labeled = ~torch.isnan(_target) & target["mask"] + _size = functional.variadic_sum(_labeled.long(), target["size"]) + for _metric in self.metric: + if _metric == "micro_acc": + score = metrics.accuracy(pred[_labeled], _target[_labeled].long()) + elif metric == "micro_auroc": + score = metrics.area_under_roc(pred[_labeled], _target[_labeled]) + elif metric == "micro_auprc": + score = metrics.area_under_prc(pred[_labeled], _target[_labeled]) + elif _metric == "macro_auroc": + score = metrics.variadic_area_under_roc(pred[_labeled], _target[_labeled], _size).mean() + elif _metric == "macro_auprc": + score = metrics.variadic_area_under_prc(pred[_labeled], _target[_labeled], _size).mean() + elif _metric == "macro_acc": + score = pred[_labeled].argmax(-1) == _target[_labeled] + score = functional.variadic_mean(score.float(), _size).mean() + else: + raise ValueError("Unknown criterion `%s`" % _metric) + + name = tasks._get_metric_name(_metric) + metric[name] = score + + return metric + + +@R.register("tasks.InteractionPrediction") +@utils.copy_args(PropertyPrediction, ignore=("graph_construction_model",)) +class InteractionPrediction(PropertyPrediction): + """ + Predict the interaction property of graph pairs. + + Parameters: + model (nn.Module): graph representation model + model2 (nn.Module, optional): graph representation model for the second item. If ``None``, use tied-weight + model for the second item. + **kwargs + """ + + def __init__(self, model, model2=None, **kwargs): + super(InteractionPrediction, self).__init__(model, **kwargs) + self.model2 = model2 or model + + def preprocess(self, train_set, valid_set, test_set): + """ + Compute the mean and derivation for each task on the training set. + """ + values = defaultdict(list) + for sample in train_set: + if not sample.get("labeled", True): + continue + for task in self.task: + if not math.isnan(sample[task]): + values[task].append(sample[task]) + mean = [] + std = [] + weight = [] + num_class = [] + for task, w in self.task.items(): + value = torch.tensor(values[task]) + mean.append(value.float().mean()) + std.append(value.float().std()) + weight.append(w) + if value.ndim > 1: + num_class.append(value.shape[1]) + elif value.dtype == torch.long: + task_class = value.max().item() + if task_class == 1 and "bce" in self.criterion: + num_class.append(1) + else: + num_class.append(task_class + 1) + else: + num_class.append(1) + + self.register_buffer("mean", torch.as_tensor(mean, dtype=torch.float)) + self.register_buffer("std", torch.as_tensor(std, dtype=torch.float)) + self.register_buffer("weight", torch.as_tensor(weight, dtype=torch.float)) + self.num_class = self.num_class or num_class + + hidden_dims = [self.model.output_dim] * (self.num_mlp_layer - 1) + self.mlp = layers.MLP(self.model.output_dim + self.model2.output_dim, hidden_dims + [sum(self.num_class)]) + + def predict(self, batch, all_loss=None, metric=None): + graph1 = batch["graph1"] + output1 = self.model(graph1, graph1.node_feature.float(), all_loss=all_loss, metric=metric) + graph2 = batch["graph2"] + output2 = self.model2(graph2, graph2.node_feature.float(), all_loss=all_loss, metric=metric) + pred = self.mlp(torch.cat([output1["graph_feature"], output2["graph_feature"]], dim=-1)) + if self.normalization: + pred = pred * self.std + self.mean + return pred + + +@R.register("tasks.Unsupervised") +class Unsupervised(nn.Module, core.Configurable): + """ + Wrapper task for unsupervised learning. + + The unsupervised loss should be computed by the model. + + Parameters: + model (nn.Module): any model + """ + + def __init__(self, model, graph_construction_model=None): + super(Unsupervised, self).__init__() + self.model = model + self.graph_construction_model = graph_construction_model + + def forward(self, batch): + """""" + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred = self.predict(batch, all_loss, metric) + + return all_loss, metric + + def predict(self, batch, all_loss=None, metric=None): + graph = batch["graph"] + if self.graph_construction_model: + graph = self.graph_construction_model(graph) + pred = self.model(graph, graph.node_feature.float(), all_loss=all_loss, metric=metric) + return pred diff --git a/build/lib/torchdrug/tasks/reasoning.py b/build/lib/torchdrug/tasks/reasoning.py new file mode 100644 index 00000000..1052a973 --- /dev/null +++ b/build/lib/torchdrug/tasks/reasoning.py @@ -0,0 +1,253 @@ +import torch +from torch import nn +from torch.nn import functional as F +from torch.utils import data as torch_data + +from torchdrug import core, tasks +from torchdrug.layers import functional +from torchdrug.core import Registry as R + + +@R.register("tasks.KnowledgeGraphCompletion") +class KnowledgeGraphCompletion(tasks.Task, core.Configurable): + """ + Knowledge graph completion task. + + This class provides routines for the family of knowledge graph embedding models. + + Parameters: + model (nn.Module): knowledge graph completion model + criterion (str, list or dict, optional): training criterion(s). For dict, the keys are criterions and the values + are the corresponding weights. Available criterions are ``bce``, ``ce`` and ``ranking``. + metric (str or list of str, optional): metric(s). Available metrics are ``mr``, ``mrr`` and ``hits@K``. + num_negative (int, optional): number of negative samples per positive sample + margin (float, optional): margin in ranking criterion + adversarial_temperature (float, optional): temperature for self-adversarial negative sampling. + Set ``0`` to disable self-adversarial negative sampling. + strict_negative (bool, optional): use strict negative sampling or not + fact_ratio (float, optional): split the training set into facts and labels. + Set ``None`` to use the whole training set as both facts and labels. + sample_weight (bool, optional): whether to down-weight triplets from entities of large degrees + filtered_ranking (bool, optional): use filtered or unfiltered ranking for evaluation + full_batch_eval (bool, optional): whether to feed test negative samples by full batch or mini batch. + Full batch speeds up evaluation significantly, but may cause OOM problems for some models and datasets. + """ + _option_members = {"criterion", "metric"} + + def __init__(self, model, criterion="bce", metric=("mr", "mrr", "hits@1", "hits@3", "hits@10"), + num_negative=128, margin=6, adversarial_temperature=0, strict_negative=True, fact_ratio=None, + sample_weight=True, filtered_ranking=True, full_batch_eval=False): + super(KnowledgeGraphCompletion, self).__init__() + self.model = model + self.criterion = criterion + self.metric = metric + self.num_negative = num_negative + self.margin = margin + self.adversarial_temperature = adversarial_temperature + self.strict_negative = strict_negative + self.fact_ratio = fact_ratio + self.sample_weight = sample_weight + self.filtered_ranking = filtered_ranking + self.full_batch_eval = full_batch_eval + + def preprocess(self, train_set, valid_set, test_set): + if isinstance(train_set, torch_data.Subset): + dataset = train_set.dataset + else: + dataset = train_set + self.num_entity = dataset.num_entity + self.num_relation = dataset.num_relation + self.register_buffer("graph", dataset.graph) + fact_mask = torch.ones(len(dataset), dtype=torch.bool) + fact_mask[valid_set.indices] = 0 + fact_mask[test_set.indices] = 0 + if self.fact_ratio: + length = int(len(train_set) * self.fact_ratio) + index = torch.randperm(len(train_set))[length:] + train_indices = torch.tensor(train_set.indices) + fact_mask[train_indices[index]] = 0 + train_set = torch_data.Subset(train_set, index) + self.register_buffer("fact_graph", dataset.graph.edge_mask(fact_mask)) + + if self.sample_weight: + degree_hr = torch.zeros(self.num_entity, self.num_relation, dtype=torch.long) + degree_tr = torch.zeros(self.num_entity, self.num_relation, dtype=torch.long) + for h, t, r in train_set: + degree_hr[h, r] += 1 + degree_tr[t, r] += 1 + self.register_buffer("degree_hr", degree_hr) + self.register_buffer("degree_tr", degree_tr) + + return train_set, valid_set, test_set + + def forward(self, batch, all_loss=None, metric=None): + """""" + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred = self.predict(batch, all_loss, metric) + pos_h_index, pos_t_index, pos_r_index = batch.t() + + for criterion, weight in self.criterion.items(): + if criterion == "bce": + target = torch.zeros_like(pred) + target[:, 0] = 1 + loss = F.binary_cross_entropy_with_logits(pred, target, reduction="none") + + neg_weight = torch.ones_like(pred) + if self.adversarial_temperature > 0: + with torch.no_grad(): + neg_weight[:, 1:] = F.softmax(pred[:, 1:] / self.adversarial_temperature, dim=-1) + else: + neg_weight[:, 1:] = 1 / self.num_negative + loss = (loss * neg_weight).sum(dim=-1) / neg_weight.sum(dim=-1) + elif criterion == "ce": + target = torch.zeros(len(pred), dtype=torch.long, device=self.device) + loss = F.cross_entropy(pred, target, reduction="none") + elif criterion == "ranking": + positive = pred[:, :1] + negative = pred[:, 1:] + target = torch.ones_like(negative) + loss = F.margin_ranking_loss(positive, negative, target, margin=self.margin) + else: + raise ValueError("Unknown criterion `%s`" % criterion) + + if self.sample_weight: + sample_weight = self.degree_hr[pos_h_index, pos_r_index] * self.degree_tr[pos_t_index, pos_r_index] + sample_weight = 1 / sample_weight.float().sqrt() + loss = (loss * sample_weight).sum() / sample_weight.sum() + else: + loss = loss.mean() + + name = tasks._get_criterion_name(criterion) + metric[name] = loss + all_loss += loss * weight + + return all_loss, metric + + def predict(self, batch, all_loss=None, metric=None): + pos_h_index, pos_t_index, pos_r_index = batch.t() + batch_size = len(batch) + + if all_loss is None: + # test + all_index = torch.arange(self.num_entity, device=self.device) + t_preds = [] + h_preds = [] + num_negative = self.num_entity if self.full_batch_eval else self.num_negative + for neg_index in all_index.split(num_negative): + r_index = pos_r_index.unsqueeze(-1).expand(-1, len(neg_index)) + h_index, t_index = torch.meshgrid(pos_h_index, neg_index) + t_pred = self.model(self.fact_graph, h_index, t_index, r_index, all_loss=all_loss, metric=metric) + t_preds.append(t_pred) + t_pred = torch.cat(t_preds, dim=-1) + for neg_index in all_index.split(num_negative): + r_index = pos_r_index.unsqueeze(-1).expand(-1, len(neg_index)) + t_index, h_index = torch.meshgrid(pos_t_index, neg_index) + h_pred = self.model(self.fact_graph, h_index, t_index, r_index, all_loss=all_loss, metric=metric) + h_preds.append(h_pred) + h_pred = torch.cat(h_preds, dim=-1) + pred = torch.stack([t_pred, h_pred], dim=1) + # in case of GPU OOM + pred = pred.cpu() + else: + # train + if self.strict_negative: + neg_index = self._strict_negative(pos_h_index, pos_t_index, pos_r_index) + else: + neg_index = torch.randint(self.num_entity, (batch_size, self.num_negative), device=self.device) + h_index = pos_h_index.unsqueeze(-1).repeat(1, self.num_negative + 1) + t_index = pos_t_index.unsqueeze(-1).repeat(1, self.num_negative + 1) + r_index = pos_r_index.unsqueeze(-1).repeat(1, self.num_negative + 1) + t_index[:batch_size // 2, 1:] = neg_index[:batch_size // 2] + h_index[batch_size // 2:, 1:] = neg_index[batch_size // 2:] + pred = self.model(self.fact_graph, h_index, t_index, r_index, all_loss=all_loss, metric=metric) + + return pred + + def target(self, batch): + # test target + batch_size = len(batch) + pos_h_index, pos_t_index, pos_r_index = batch.t() + any = -torch.ones_like(pos_h_index) + + pattern = torch.stack([pos_h_index, any, pos_r_index], dim=-1) + edge_index, num_t_truth = self.graph.match(pattern) + t_truth_index = self.graph.edge_list[edge_index, 1] + pos_index = torch.repeat_interleave(num_t_truth) + t_mask = torch.ones(batch_size, self.num_entity, dtype=torch.bool, device=self.device) + t_mask[pos_index, t_truth_index] = 0 + + pattern = torch.stack([any, pos_t_index, pos_r_index], dim=-1) + edge_index, num_h_truth = self.graph.match(pattern) + h_truth_index = self.graph.edge_list[edge_index, 0] + pos_index = torch.repeat_interleave(num_h_truth) + h_mask = torch.ones(batch_size, self.num_entity, dtype=torch.bool, device=self.device) + h_mask[pos_index, h_truth_index] = 0 + + mask = torch.stack([t_mask, h_mask], dim=1) + target = torch.stack([pos_t_index, pos_h_index], dim=1) + + # in case of GPU OOM + return mask.cpu(), target.cpu() + + def evaluate(self, pred, target): + mask, target = target + + pos_pred = pred.gather(-1, target.unsqueeze(-1)) + if self.filtered_ranking: + ranking = torch.sum((pos_pred <= pred) & mask, dim=-1) + 1 + else: + ranking = torch.sum(pos_pred <= pred, dim=-1) + 1 + + metric = {} + for _metric in self.metric: + if _metric == "mr": + score = ranking.float().mean() + elif _metric == "mrr": + score = (1 / ranking.float()).mean() + elif _metric.startswith("hits@"): + threshold = int(_metric[5:]) + score = (ranking <= threshold).float().mean() + else: + raise ValueError("Unknown metric `%s`" % _metric) + + name = tasks._get_metric_name(_metric) + metric[name] = score + + return metric + + def visualize(self, batch): + h_index, t_index, r_index = batch.t() + return self.model.visualize(self.fact_graph, h_index, t_index, r_index) + + @torch.no_grad() + def _strict_negative(self, pos_h_index, pos_t_index, pos_r_index): + batch_size = len(pos_h_index) + any = -torch.ones_like(pos_h_index) + + pattern = torch.stack([pos_h_index, any, pos_r_index], dim=-1) + pattern = pattern[:batch_size // 2] + edge_index, num_t_truth = self.fact_graph.match(pattern) + t_truth_index = self.fact_graph.edge_list[edge_index, 1] + pos_index = torch.repeat_interleave(num_t_truth) + t_mask = torch.ones(len(pattern), self.num_entity, dtype=torch.bool, device=self.device) + t_mask[pos_index, t_truth_index] = 0 + neg_t_candidate = t_mask.nonzero()[:, 1] + num_t_candidate = t_mask.sum(dim=-1) + neg_t_index = functional.variadic_sample(neg_t_candidate, num_t_candidate, self.num_negative) + + pattern = torch.stack([any, pos_t_index, pos_r_index], dim=-1) + pattern = pattern[batch_size // 2:] + edge_index, num_h_truth = self.fact_graph.match(pattern) + h_truth_index = self.fact_graph.edge_list[edge_index, 0] + pos_index = torch.repeat_interleave(num_h_truth) + h_mask = torch.ones(len(pattern), self.num_entity, dtype=torch.bool, device=self.device) + h_mask[pos_index, h_truth_index] = 0 + neg_h_candidate = h_mask.nonzero()[:, 1] + num_h_candidate = h_mask.sum(dim=-1) + neg_h_index = functional.variadic_sample(neg_h_candidate, num_h_candidate, self.num_negative) + + neg_index = torch.cat([neg_t_index, neg_h_index]) + + return neg_index \ No newline at end of file diff --git a/build/lib/torchdrug/tasks/retrosynthesis.py b/build/lib/torchdrug/tasks/retrosynthesis.py new file mode 100644 index 00000000..019ceef7 --- /dev/null +++ b/build/lib/torchdrug/tasks/retrosynthesis.py @@ -0,0 +1,1208 @@ +import inspect +from collections import deque + +import torch +from torch import nn +from torch.nn import functional as F +from torch.utils import data as torch_data +from torch_scatter import scatter_max, scatter_add + +from torchdrug import core, tasks, data, metrics, transforms +from torchdrug.layers import functional +from torchdrug.core import Registry as R +from torchdrug import layers + +import logging +logger = logging.getLogger(__name__) + + +@R.register("tasks.CenterIdentification") +class CenterIdentification(tasks.Task, core.Configurable): + """ + Reaction center identification task. + + This class is a part of retrosynthesis prediction. + + Parameters: + model (nn.Module): graph representation model + feature (str or list of str, optional): additional features for prediction. Available features are + reaction: type of the reaction + graph: graph representation of the product + atom: original atom feature + bond: original bond feature + num_mlp_layer (int, optional): number of MLP layers + """ + + _option_members = {"feature"} + + def __init__(self, model, feature=("reaction", "graph", "atom", "bond"), num_mlp_layer=2): + super(CenterIdentification, self).__init__() + self.model = model + self.num_mlp_layer = num_mlp_layer + self.feature = feature + + def preprocess(self, train_set, valid_set, test_set): + reaction_types = set() + bond_types = set() + for sample in train_set: + reaction_types.add(sample["reaction"]) + for graph in sample["graph"]: + bond_types.update(graph.edge_list[:, 2].tolist()) + self.num_reaction = len(reaction_types) + self.num_relation = len(bond_types) + node_feature_dim = train_set[0]["graph"][0].node_feature.shape[-1] + edge_feature_dim = train_set[0]["graph"][0].edge_feature.shape[-1] + + node_dim = self.model.output_dim + edge_dim = 0 + graph_dim = 0 + for _feature in sorted(self.feature): + if _feature == "reaction": + graph_dim += self.num_reaction + elif _feature == "graph": + graph_dim += self.model.output_dim + elif _feature == "atom": + node_dim += node_feature_dim + elif _feature == "bond": + edge_dim += edge_feature_dim + else: + raise ValueError("Unknown feature `%s`" % _feature) + + node_dim += graph_dim # inherit graph features + edge_dim += node_dim * 2 # inherit node features + + hidden_dims = [self.model.output_dim] * (self.num_mlp_layer - 1) + self.edge_mlp = layers.MLP(edge_dim, hidden_dims + [1]) + self.node_mlp = layers.MLP(node_dim, hidden_dims + [1]) + + def forward(self, batch): + """""" + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred = self.predict(batch, all_loss, metric) + target = self.target(batch) + metric.update(self.evaluate(pred, target)) + + target, size = target + target = functional.variadic_max(target, size)[1] + loss = functional.variadic_cross_entropy(pred, target, size) + + name = tasks._get_criterion_name("ce") + metric[name] = loss + + all_loss += loss + + return all_loss, metric + + def _collate(self, edge_data, node_data, graph): + new_data = torch.zeros(len(edge_data) + len(node_data), *edge_data.shape[1:], + dtype=edge_data.dtype, device=edge_data.device) + num_cum_xs = graph.num_cum_edges + graph.num_cum_nodes + num_xs = graph.num_edges + graph.num_nodes + starts = num_cum_xs - num_xs + ends = starts + graph.num_edges + index = functional.multi_slice_mask(starts, ends, num_cum_xs[-1]) + new_data[index] = edge_data + new_data[~index] = node_data + return new_data + + def target(self, batch): + reactant, product = batch["graph"] + graph = product.directed() + + target = self._collate(graph.edge_label, graph.node_label, graph) + size = graph.num_edges + graph.num_nodes + return target, size + + def predict(self, batch, all_loss=None, metric=None): + reactant, product = batch["graph"] + output = self.model(product, product.node_feature.float(), all_loss, metric) + + graph = product.directed() + + node_feature = [output["node_feature"]] + edge_feature = [] + graph_feature = [] + for _feature in sorted(self.feature): + if _feature == "reaction": + reaction_feature = torch.zeros(len(graph), self.num_reaction, dtype=torch.float32, device=self.device) + reaction_feature.scatter_(1, batch["reaction"].unsqueeze(-1), 1) + graph_feature.append(reaction_feature) + elif _feature == "graph": + graph_feature.append(output["graph_feature"]) + elif _feature == "atom": + node_feature.append(graph.node_feature.float()) + elif _feature == "bond": + edge_feature.append(graph.edge_feature.float()) + else: + raise ValueError("Unknown feature `%s`" % _feature) + + graph_feature = torch.cat(graph_feature, dim=-1) + # inherit graph features + node_feature.append(graph_feature[graph.node2graph]) + node_feature = torch.cat(node_feature, dim=-1) + # inherit node features + edge_feature.append(node_feature[graph.edge_list[:, :2]].flatten(1)) + edge_feature = torch.cat(edge_feature, dim=-1) + + edge_pred = self.edge_mlp(edge_feature).squeeze(-1) + node_pred = self.node_mlp(node_feature).squeeze(-1) + + pred = self._collate(edge_pred, node_pred, graph) + + return pred + + def evaluate(self, pred, target): + target, size = target + + metric = {} + target = functional.variadic_max(target, size)[1] + accuracy = metrics.variadic_accuracy(pred, target, size).mean() + + name = tasks._get_metric_name("acc") + metric[name] = accuracy + + return metric + + @torch.no_grad() + def predict_synthon(self, batch, k=1): + """ + Predict top-k synthons from target molecules. + + Parameters: + batch (dict): batch of target molecules + k (int, optional): return top-k results + + Returns: + list of dict: top k records. + Each record is a batch dict of keys ``synthon``, ``num_synthon``, ``reaction_center``, + ``log_likelihood`` and ``reaction``. + """ + pred = self.predict(batch) + target, size = self.target(batch) + logp = functional.variadic_log_softmax(pred, size) + + reactant, product = batch["graph"] + graph = product.directed() + with graph.graph(): + graph.product_id = torch.arange(len(graph), device=self.device) + + graph = graph.repeat_interleave(k) + reaction = batch["reaction"].repeat_interleave(k) + with graph.graph(): + graph.split_id = torch.arange(k, device=self.device).repeat(len(graph) // k) + + logp, center_topk = functional.variadic_topk(logp, size, k) + logp = logp.flatten() + center_topk = center_topk.flatten() + + is_edge = center_topk < graph.num_edges + node_index = center_topk + graph.num_cum_nodes - graph.num_nodes - graph.num_edges + edge_index = center_topk + graph.num_cum_edges - graph.num_edges + center_topk_shifted = torch.cat([-torch.ones(1, dtype=torch.long, device=self.device), + center_topk[:-1]]) + product_id_shifted = torch.cat([-torch.ones(1, dtype=torch.long, device=self.device), + graph.product_id[:-1]]) + is_duplicate = (center_topk == center_topk_shifted) & (graph.product_id == product_id_shifted) + node_index = node_index[~is_edge] + edge_index = edge_index[is_edge] + edge_mask = ~functional.as_mask(edge_index, graph.num_edge) + + reaction_center = torch.zeros(len(graph), 2, dtype=torch.long, device=self.device) + reaction_center[is_edge] = graph.atom_map[graph.edge_list[edge_index, :2]] + reaction_center[~is_edge, 0] = graph.atom_map[node_index] + + # remove the edges from products + graph = graph.edge_mask(edge_mask) + graph = graph[~is_duplicate] + reaction_center = reaction_center[~is_duplicate] + logp = logp[~is_duplicate] + reaction = reaction[~is_duplicate] + synthon, num_synthon = graph.connected_components() + synthon = synthon.undirected() # (< num_graph * k) + + result = { + "synthon": synthon, + "num_synthon": num_synthon, + "reaction_center": reaction_center, + "log_likelihood": logp, + "reaction": reaction, + } + + return result + + +class RandomBFSOrder(object): + + def __call__(self, item): + assert hasattr(item["graph"][0], "reaction_center") + reactant, synthon = item["graph"] + + edge_list = reactant.edge_list[:, :2].tolist() + neighbor = [[] for _ in range(reactant.num_node)] + for h, t in edge_list: + neighbor[h].append(t) + depth = [-1] * reactant.num_node + + # select a mapped atom as BFS root + reactant2id = reactant.atom_map + id2synthon = -torch.ones(synthon.atom_map.max() + 1, dtype=torch.long, device=synthon.device) + id2synthon[synthon.atom_map] = torch.arange(synthon.num_node, device=synthon.device) + reactant2synthon = id2synthon[reactant2id] + + candidate = (reactant2synthon != -1).nonzero().squeeze(-1) + i = candidate[torch.randint(len(candidate), (1,))].item() + + queue = deque([i]) + depth[i] = 0 + order = [] + while queue: + h = queue.popleft() + order.append(h) + for t in neighbor[h]: + if depth[t] == -1: + depth[t] = depth[h] + 1 + queue.append(t) + + reactant = reactant.subgraph(order) + + if reactant.num_edge > 0: + node_index = reactant.edge_list[:, :2] + node_large = node_index.max(dim=-1)[0] + node_small = node_index.min(dim=-1)[0] + undirected_edge_id = node_large * (node_large + 1) + node_small + undirected_edge_id = undirected_edge_id * 2 + (node_index[:, 0] > node_index[:, 1]) + + # rearrange edges into autoregressive order + edge_order = undirected_edge_id.argsort() + reactant = reactant.edge_mask(edge_order) + + assert hasattr(reactant, "reaction_center") + + item = item.copy() + item["graph"] = (reactant, synthon) + + return item + + +@R.register("tasks.SynthonCompletion") +class SynthonCompletion(tasks.Task, core.Configurable): + """ + Synthon completion task. + + This class is a part of retrosynthesis prediction. + + Parameters: + model (nn.Module): graph representation model + feature (str or list of str, optional): additional features for prediction. Available features are + reaction: type of the reaction + graph: graph representation of the synthon + atom: original atom feature + num_mlp_layer (int, optional): number of MLP layers + """ + + _option_members = {"feature"} + + def __init__(self, model, feature=("reaction", "graph", "atom"), num_mlp_layer=2): + super(SynthonCompletion, self).__init__() + self.model = model + self.num_mlp_layer = num_mlp_layer + self.feature = feature + self.input_linear = nn.Linear(2, self.model.input_dim) + + def preprocess(self, train_set, valid_set, test_set): + reaction_types = set() + atom_types = set() + bond_types = set() + for sample in train_set: + reaction_types.add(sample["reaction"]) + for graph in sample["graph"]: + atom_types.update(graph.atom_type.tolist()) + bond_types.update(graph.edge_list[:, 2].tolist()) + # TODO: only for fast debugging, to remove + # atom_types = torch.tensor([5, 6, 7, 8, 9, 12, 14, 15, 16, 17, 29, 30, 34, 35, 50, 53]) + # bond_types = torch.tensor([0, 1, 2]) + atom_types = torch.tensor(sorted(atom_types)) + atom2id = -torch.ones(atom_types.max() + 1, dtype=torch.long) + atom2id[atom_types] = torch.arange(len(atom_types)) + self.register_buffer("id2atom", atom_types) + self.register_buffer("atom2id", atom2id) + self.num_reaction = len(reaction_types) + self.num_atom_type = len(atom_types) + self.num_bond_type = len(bond_types) + node_feature_dim = train_set[0]["graph"][0].node_feature.shape[-1] + + if isinstance(train_set, torch_data.Subset): + dataset = train_set.dataset + else: + dataset = train_set + dataset.transform = transforms.Compose([ + dataset.transform, + RandomBFSOrder(), + ]) + sig = inspect.signature(data.PackedMolecule.from_molecule) + keys = set(sig.parameters.keys()) + kwargs = dataset.config_dict() + feature_kwargs = {} + for k, v in kwargs.items(): + if k in keys: + feature_kwargs[k] = v + self.feature_kwargs = feature_kwargs + + node_dim = self.model.output_dim + edge_dim = 0 + graph_dim = 0 + for _feature in sorted(self.feature): + if _feature == "reaction": + graph_dim += self.num_reaction + elif _feature == "graph": + graph_dim += self.model.output_dim + elif _feature == "atom": + node_dim += node_feature_dim + else: + raise ValueError("Unknown feature `%s`" % _feature) + + self.new_atom_feature = nn.Embedding(self.num_atom_type, node_dim) + + node_dim += graph_dim # inherit graph features + edge_dim += node_dim * 2 # inherit node features + + hidden_dims = [self.model.output_dim] * (self.num_mlp_layer - 1) + self.node_in_mlp = layers.MLP(node_dim, hidden_dims + [1]) + self.node_out_mlp = layers.MLP(edge_dim, hidden_dims + [1]) + self.edge_mlp = layers.MLP(edge_dim, hidden_dims + [1]) + self.bond_mlp = layers.MLP(edge_dim, hidden_dims + [self.num_bond_type]) + self.stop_mlp = layers.MLP(graph_dim, hidden_dims + [1]) + + def _update_molecule_feature(self, graphs): + # This function is very slow + graphs = graphs.ion_to_molecule() + mols = graphs.to_molecule(ignore_error=True) + valid = [mol is not None for mol in mols] + valid = torch.tensor(valid, device=graphs.device) + new_graphs = type(graphs).from_molecule(mols, **self.feature_kwargs) + + node_feature = torch.zeros(graphs.num_node, *new_graphs.node_feature.shape[1:], + dtype=new_graphs.node_feature.dtype, device=graphs.device) + edge_feature = torch.zeros(graphs.num_edge, *new_graphs.edge_feature.shape[1:], + dtype=new_graphs.edge_feature.dtype, device=graphs.device) + bond_type = torch.zeros_like(graphs.bond_type) + node_mask = valid[graphs.node2graph] + edge_mask = valid[graphs.edge2graph] + node_feature[node_mask] = new_graphs.node_feature.to(device=graphs.device) + edge_feature[edge_mask] = new_graphs.edge_feature.to(device=graphs.device) + bond_type[edge_mask] = new_graphs.bond_type.to(device=graphs.device) + + with graphs.node(): + graphs.node_feature = node_feature + with graphs.edge(): + graphs.edge_feature = edge_feature + graphs.bond_type = bond_type + + return graphs, valid + + @torch.no_grad() + def _all_prefix_slice(self, num_xs, lengths=None): + # extract a bunch of slices that correspond to the following num_repeat * n masks + # ------ repeat 0 ----- + # graphs[0]: [0, 0, ..., 0] + # ... + # graphs[-1]: [0, 0, ..., 0] + # ------ repeat 1 ----- + # graphs[0]: [1, 0, ..., 0] + # ... + # graphs[-1]: [1, 0, ..., 0] + # ... + # ------ repeat -1 ----- + # graphs[0]: [1, ..., 1, 0] + # ... + # graphs[-1]: [1, ..., 1, 0] + num_cum_xs = num_xs.cumsum(0) + starts = num_cum_xs - num_xs + if lengths is None: + num_max_x = num_xs.max().item() + lengths = torch.arange(0, num_max_x, 2, device=num_xs.device) + + pack_offsets = torch.arange(len(lengths), device=num_xs.device) * num_cum_xs[-1] + # starts, lengths, ends: (num_repeat, num_graph) + starts = starts.unsqueeze(0) + pack_offsets.unsqueeze(-1) + valid = lengths.unsqueeze(-1) <= num_xs.unsqueeze(0) - 2 + lengths = torch.min(lengths.unsqueeze(-1), num_xs.unsqueeze(0) - 2).clamp(0) + ends = starts + lengths + + starts = starts.flatten() + ends = ends.flatten() + valid = valid.flatten() + + return starts, ends, valid + + @torch.no_grad() + def _get_reaction_feature(self, reactant, synthon): + + def get_edge_map(graph, num_nodes): + node_in, node_out = graph.edge_list.t()[:2] + node_in2id = graph.atom_map[node_in] + node_out2id = graph.atom_map[node_out] + edge_map = node_in2id * num_nodes[graph.edge2graph] + node_out2id + # edges containing any unmapped node is considered to be unmapped + edge_map[(node_in2id == 0) | (node_out2id == 0)] = 0 + return edge_map + + def get_mapping(reactant_x, synthon_x, reactant_x2graph, synthon_x2graph): + num_xs = scatter_max(reactant_x, reactant_x2graph)[0] + num_xs = num_xs.clamp(0) + 1 + num_cum_xs = num_xs.cumsum(0) + offset = num_cum_xs - num_xs + reactant2id = reactant_x + offset[reactant_x2graph] + synthon2id = synthon_x + offset[synthon_x2graph] + assert synthon2id.min() > 0 + id2synthon = -torch.ones(num_cum_xs[-1], dtype=torch.long, device=self.device) + id2synthon[synthon2id] = torch.arange(len(synthon2id), device=self.device) + reactant2synthon = id2synthon[reactant2id] + + return reactant2synthon + + # reactant & synthon may have different number of nodes + # reactant.num_nodes >= synthon.num_nodes + assert (reactant.num_nodes >= synthon.num_nodes).all() + reactant_edge_map = get_edge_map(reactant, reactant.num_nodes) + synthon_edge_map = get_edge_map(synthon, reactant.num_nodes) + + node_r2s = get_mapping(reactant.atom_map, synthon.atom_map, reactant.node2graph, synthon.node2graph) + edge_r2s = get_mapping(reactant_edge_map, synthon_edge_map, reactant.edge2graph, synthon.edge2graph) + + is_new_node = node_r2s == -1 + is_new_edge = edge_r2s == -1 + is_modified_edge = (edge_r2s != -1) & (reactant.bond_type != synthon.bond_type[edge_r2s]) + is_reaction_center = (reactant.atom_map > 0) & \ + (reactant.atom_map.unsqueeze(-1) == + reactant.reaction_center[reactant.node2graph]).any(dim=-1) + + return node_r2s, edge_r2s, is_new_node, is_new_edge, is_modified_edge, is_reaction_center + + @torch.no_grad() + def all_edge(self, reactant, synthon): + graph = reactant.clone() + node_r2s, edge_r2s, is_new_node, is_new_edge, is_modified_edge, is_reaction_center = \ + self._get_reaction_feature(reactant, synthon) + with graph.node(): + graph.node_r2s = node_r2s + graph.is_new_node = is_new_node + graph.is_reaction_center = is_reaction_center + with graph.edge(): + graph.edge_r2s = edge_r2s + graph.is_new_edge = is_new_edge + graph.is_modified_edge = is_modified_edge + + starts, ends, valid = self._all_prefix_slice(reactant.num_edges) + num_repeat = len(starts) // len(reactant) + graph = graph.repeat(num_repeat) + + # autoregressive condition range for each sample + condition_mask = functional.multi_slice_mask(starts, ends, graph.num_edge) + # special case: end == graph.num_edge. In this case, valid is always false + assert ends.max() <= graph.num_edge + ends = ends.clamp(0, graph.num_edge - 1) + node_in, node_out, bond_target = graph.edge_list[ends].t() + # modified edges which don't appear in conditions should keep their old bond types + # i.e. bond types in synthons + unmodified = ~condition_mask & graph.is_modified_edge + unmodified = unmodified.nonzero().squeeze(-1) + assert not (graph.bond_type[unmodified] == synthon.bond_type[graph.edge_r2s[unmodified]]).any() + graph.edge_list[unmodified, 2] = synthon.edge_list[graph.edge_r2s[unmodified], 2] + + reverse_target = graph.edge_list[ends][:, [1, 0, 2]] + is_reverse_target = (graph.edge_list == reverse_target[graph.edge2graph]).all(dim=-1) + # keep edges that exist in the synthon + # remove the reverse of new target edges + edge_mask = (condition_mask & ~is_reverse_target) | ~graph.is_new_edge + + atom_in = graph.atom_type[node_in] + atom_out = graph.atom_type[node_out] + # keep one supervision for undirected edges + # remove samples that try to predict existing edges + valid &= (node_in < node_out) & (graph.is_new_edge[ends] | graph.is_modified_edge[ends]) + graph = graph.edge_mask(edge_mask) + + # sanitize the molecules + # this will change atom index, so we manually remap the target nodes + compact_mapping = -torch.ones(graph.num_node, dtype=torch.long, device=self.device) + node_mask = graph.degree_in + graph.degree_out > 0 + # special case: for graphs without any edge, the first node should be kept + index = torch.arange(graph.num_node, device=self.device) + single_node_mask = (graph.num_edges == 0)[graph.node2graph] & \ + (index == (graph.num_cum_nodes - graph.num_nodes)[graph.node2graph]) + node_index = (node_mask | single_node_mask).nonzero().squeeze(-1) + compact_mapping[node_index] = torch.arange(len(node_index), device=self.device) + node_in = compact_mapping[node_in] + node_out = compact_mapping[node_out] + graph = graph.subgraph(node_index) + + node_in_target = node_in - graph.num_cum_nodes + graph.num_nodes + assert (node_in_target[valid] < graph.num_nodes[valid]).all() and (node_in_target[valid] >= 0).all() + # node2 might be a new node + node_out_target = torch.where(node_out == -1, self.atom2id[atom_out] + graph.num_nodes, + node_out - graph.num_cum_nodes + graph.num_nodes) + stop_target = torch.zeros(len(node_in_target), device=self.device) + + graph = graph[valid] + node_in_target = node_in_target[valid] + node_out_target = node_out_target[valid] + bond_target = bond_target[valid] + stop_target = stop_target[valid] + + assert (graph.num_edges % 2 == 0).all() + # node / edge features may change because we mask some nodes / edges + graph, feature_valid = self._update_molecule_feature(graph) + + return graph[feature_valid], node_in_target[feature_valid], node_out_target[feature_valid], \ + bond_target[feature_valid], stop_target[feature_valid] + + @torch.no_grad() + def all_stop(self, reactant, synthon): + graph = reactant.clone() + node_r2s, edge_r2s, is_new_node, is_new_edge, is_modified_edge, is_reaction_center = \ + self._get_reaction_feature(reactant, synthon) + with graph.node(): + graph.node_r2s = node_r2s + graph.is_new_node = is_new_node + graph.is_reaction_center = is_reaction_center + with graph.edge(): + graph.edge_r2s = edge_r2s + graph.is_new_edge = is_new_edge + graph.is_modified_edge = is_modified_edge + + node_in_target = torch.zeros(len(graph), dtype=torch.long, device=self.device) + node_out_target = torch.zeros_like(node_in_target) + bond_target = torch.zeros_like(node_in_target) + stop_target = torch.ones(len(graph), device=self.device) + + # keep consistent with other training data + graph, feature_valid = self._update_molecule_feature(graph) + + return graph[feature_valid], node_in_target[feature_valid], node_out_target[feature_valid], \ + bond_target[feature_valid], stop_target[feature_valid] + + def forward(self, batch): + """""" + all_loss = torch.tensor(0, dtype=torch.float32, device=self.device) + metric = {} + + pred, target = self.predict_and_target(batch, all_loss, metric) + node_in_pred, node_out_pred, bond_pred, stop_pred = pred + node_in_target, node_out_target, bond_target, stop_target, size = target + + loss = functional.variadic_cross_entropy(node_in_pred, node_in_target, size, reduction="none") + loss = functional.masked_mean(loss, stop_target == 0) + metric["node in ce loss"] = loss + all_loss += loss + + loss = functional.variadic_cross_entropy(node_out_pred, node_out_target, size, reduction="none") + loss = functional.masked_mean(loss, stop_target == 0) + metric["node out ce loss"] = loss + all_loss += loss + + loss = F.cross_entropy(bond_pred, bond_target, reduction="none") + loss = functional.masked_mean(loss, stop_target == 0) + metric["bond ce loss"] = loss + all_loss += loss + + # Do we need to balance stop pred? + loss = F.binary_cross_entropy_with_logits(stop_pred, stop_target) + metric["stop bce loss"] = loss + all_loss += loss + + metric["total loss"] = all_loss + metric.update(self.evaluate(pred, target)) + + return all_loss, metric + + def evaluate(self, pred, target): + node_in_pred, node_out_pred, bond_pred, stop_pred = pred + node_in_target, node_out_target, bond_target, stop_target, size = target + + metric = {} + + node_in_acc = metrics.variadic_accuracy(node_in_pred, node_in_target, size) + accuracy = functional.masked_mean(node_in_acc, stop_target == 0) + metric["node in accuracy"] = accuracy + + node_out_acc = metrics.variadic_accuracy(node_out_pred, node_out_target, size) + accuracy = functional.masked_mean(node_out_acc, stop_target == 0) + metric["node out accuracy"] = accuracy + + bond_acc = (bond_pred.argmax(-1) == bond_target).float() + accuracy = functional.masked_mean(bond_acc, stop_target == 0) + metric["bond accuracy"] = accuracy + + stop_acc = ((stop_pred > 0.5) == (stop_target > 0.5)).float() + metric["stop accuracy"] = stop_acc.mean() + + total_acc = (node_in_acc > 0.5) & (node_out_acc > 0.5) & (bond_acc > 0.5) & (stop_acc > 0.5) + total_acc = torch.where(stop_target == 0, total_acc, stop_acc > 0.5).float() + metric["total accuracy"] = total_acc.mean() + + return metric + + def _cat(self, graphs): + for i, graph in enumerate(graphs): + if not isinstance(graph, data.PackedGraph): + graphs[i] = graph.pack([graph]) + + edge_list = torch.cat([graph.edge_list for graph in graphs]) + pack_num_nodes = torch.stack([graph.num_node for graph in graphs]) + pack_num_edges = torch.stack([graph.num_edge for graph in graphs]) + pack_num_cum_edges = pack_num_edges.cumsum(0) + graph_index = pack_num_cum_edges < len(edge_list) + pack_offsets = scatter_add(pack_num_nodes[graph_index], pack_num_cum_edges[graph_index], + dim_size=len(edge_list)) + pack_offsets = pack_offsets.cumsum(0) + + edge_list[:, :2] += pack_offsets.unsqueeze(-1) + offsets = torch.cat([graph._offsets for graph in graphs]) + pack_offsets + + edge_weight = torch.cat([graph.edge_weight for graph in graphs]) + num_nodes = torch.cat([graph.num_nodes for graph in graphs]) + num_edges = torch.cat([graph.num_edges for graph in graphs]) + num_relation = graphs[0].num_relation + assert all(graph.num_relation == num_relation for graph in graphs) + + # only keep attributes that exist in all graphs + keys = set(graphs[0].meta_dict.keys()) + for graph in graphs: + keys = keys.intersection(graph.meta_dict.keys()) + + meta_dict = {k: graphs[0].meta_dict[k] for k in keys} + data_dict = {} + for k in keys: + data_dict[k] = torch.cat([graph.data_dict[k] for graph in graphs]) + + return type(graphs[0])(edge_list, edge_weight=edge_weight, + num_nodes=num_nodes, num_edges=num_edges, num_relation=num_relation, offsets=offsets, + meta_dict=meta_dict, **data_dict) + + def target(self, batch): + reactant, synthon = batch["graph"] + + graph1, node_in_target1, node_out_target1, bond_target1, stop_target1 = self.all_edge(reactant, synthon) + graph2, node_in_target2, node_out_target2, bond_target2, stop_target2 = self.all_stop(reactant, synthon) + + node_in_target = torch.cat([node_in_target1, node_in_target2]) + node_out_target = torch.cat([node_out_target1, node_out_target2]) + bond_target = torch.cat([bond_target1, bond_target2]) + stop_target = torch.cat([stop_target1, stop_target2]) + size = torch.cat([graph1.num_nodes, graph2.num_nodes]) + # add new atom candidates into the size of each graph + size_ext = size + self.num_atom_type + + return node_in_target, node_out_target, bond_target, stop_target, size_ext + + def _topk_action(self, graph, k): + synthon_feature = torch.stack([graph.is_new_node, graph.is_reaction_center], dim=-1).float() + node_feature = graph.node_feature.float() + self.input_linear(synthon_feature) + output = self.model(graph, node_feature) + + node_feature = [output["node_feature"]] + graph_feature = [] + for _feature in sorted(self.feature): + if _feature == "reaction": + reaction_feature = torch.zeros(len(graph), self.num_reaction, dtype=torch.float32, device=self.device) + reaction_feature.scatter_(1, graph.reaction.unsqueeze(-1), 1) + graph_feature.append(reaction_feature) + elif _feature == "graph": + graph_feature.append(output["graph_feature"]) + elif _feature == "atom": + node_feature.append(graph.node_feature.float()) + else: + raise ValueError("Unknown feature `%s`" % _feature) + + graph_feature = torch.cat(graph_feature, dim=-1) + # inherit graph features + node_feature.append(graph_feature[graph.node2graph]) + node_feature = torch.cat(node_feature, dim=-1) + + new_node_feature = self.new_atom_feature.weight.repeat(len(graph), 1) + new_graph_feature = graph_feature.unsqueeze(1).repeat(1, self.num_atom_type, 1).flatten(0, 1) + new_node_feature = torch.cat([new_node_feature, new_graph_feature], dim=-1) + node_feature, num_nodes_ext = self._extend(node_feature, graph.num_nodes, new_node_feature) + + node2graph_ext = torch.repeat_interleave(num_nodes_ext) + num_cum_nodes_ext = num_nodes_ext.cumsum(0) + starts = num_cum_nodes_ext - num_nodes_ext + graph.num_nodes + ends = num_cum_nodes_ext + is_new_node = functional.multi_slice_mask(starts, ends, num_cum_nodes_ext[-1]) + infinity = float("inf") + + node_in_pred = self.node_in_mlp(node_feature).squeeze(-1) + stop_pred = self.stop_mlp(graph_feature).squeeze(-1) + + # mask out node-in prediction on new atoms + node_in_pred[is_new_node] = -infinity + node_in_logp = functional.variadic_log_softmax(node_in_pred, num_nodes_ext) # (num_node,) + stop_logp = F.logsigmoid(stop_pred) + act_logp = F.logsigmoid(-stop_pred) + node_in_topk = functional.variadic_topk(node_in_logp, num_nodes_ext, k)[1] + assert (node_in_topk >= 0).all() and (node_in_topk < num_nodes_ext.unsqueeze(-1)).all() + node_in = node_in_topk + (num_cum_nodes_ext - num_nodes_ext).unsqueeze(-1) # (num_graph, k) + + # (num_node, node_in_k, feature_dim) + node_out_feature = torch.cat([node_feature[node_in][node2graph_ext], + node_feature.unsqueeze(1).expand(-1, k, -1)], dim=-1) + node_out_pred = self.node_out_mlp(node_out_feature).squeeze(-1) + # mask out node-out prediction on self-loops + node_out_pred.scatter_(0, node_in, -infinity) + # (num_node, node_in_k) + node_out_logp = functional.variadic_log_softmax(node_out_pred, num_nodes_ext) + # (num_graph, node_out_k, node_in_k) + node_out_topk = functional.variadic_topk(node_out_logp, num_nodes_ext, k)[1] + assert (node_out_topk >= 0).all() and (node_out_topk < num_nodes_ext.view(-1, 1, 1)).all() + node_out = node_out_topk + (num_cum_nodes_ext - num_nodes_ext).view(-1, 1, 1) + + # (num_graph, node_out_k, node_in_k, feature_dim * 2) + edge = torch.stack([node_in.unsqueeze(1).expand_as(node_out), node_out], dim=-1) + bond_feature = node_feature[edge].flatten(-2) + bond_pred = self.bond_mlp(bond_feature).squeeze(-1) + bond_logp = F.log_softmax(bond_pred, dim=-1) # (num_graph, node_out_k, node_in_k, num_relation) + bond_type = torch.arange(bond_pred.shape[-1], device=self.device) + bond_type = bond_type.view(1, 1, 1, -1).expand_as(bond_logp) + + # (num_graph, node_out_k, node_in_k, num_relation) + node_in_logp = node_in_logp.gather(0, node_in.flatten(0, 1)).view(-1, 1, k, 1) + node_out_logp = node_out_logp.gather(0, node_out.flatten(0, 1)).view(-1, k, k, 1) + act_logp = act_logp.view(-1, 1, 1, 1) + logp = node_in_logp + node_out_logp + bond_logp + act_logp + + # (num_graph, node_out_k, node_in_k, num_relation, 4) + node_in_topk = node_in_topk.view(-1, 1, k, 1).expand_as(logp) + node_out_topk = node_out_topk.view(-1, k, k, 1).expand_as(logp) + action = torch.stack([node_in_topk, node_out_topk, bond_type, torch.zeros_like(bond_type)], dim=-1) + + # add stop action + logp = torch.cat([logp.flatten(1), stop_logp.unsqueeze(-1)], dim=1) + stop = torch.tensor([0, 0, 0, 1], device=self.device) + stop = stop.view(1, 1, -1).expand(len(graph), -1, -1) + action = torch.cat([action.flatten(1, -2), stop], dim=1) + topk = logp.topk(k, dim=-1)[1] + + return action.gather(1, topk.unsqueeze(-1).expand(-1, -1, 4)), logp.gather(1, topk) + + def _apply_action(self, graph, action, logp): + # only support non-variadic k-actions + assert len(graph) == len(action) + num_action = action.shape[1] + + graph = graph.repeat_interleave(num_action) + + action = action.flatten(0, 1) # (num_graph * k, 4) + logp = logp.flatten(0, 1) # (num_graph * k) + new_node_in, new_node_out, new_bond_type, stop = action.t() + + # add new nodes + has_new_node = (new_node_out >= graph.num_nodes) & (stop == 0) + new_atom_id = (new_node_out - graph.num_nodes)[has_new_node] + new_atom_type = self.id2atom[new_atom_id] + is_new_node = torch.ones(len(new_atom_type), dtype=torch.bool, device=self.device) + is_reaction_center = torch.zeros(len(new_atom_type), dtype=torch.bool, device=self.device) + atom_type, num_nodes = functional._extend(graph.atom_type, graph.num_nodes, new_atom_type, has_new_node) + is_new_node = functional._extend(graph.is_new_node, graph.num_nodes, is_new_node, has_new_node)[0] + is_reaction_center = functional._extend(graph.is_reaction_center, graph.num_nodes, is_reaction_center, has_new_node)[0] + + # cast to regular node ids + new_node_out = torch.where(has_new_node, graph.num_nodes, new_node_out) + + # modify edges + new_edge = torch.stack([new_node_in, new_node_out], dim=-1) + edge_list = graph.edge_list.clone() + bond_type = graph.bond_type.clone() + edge_list[:, :2] -= graph._offsets.unsqueeze(-1) + is_modified_edge = (edge_list[:, :2] == new_edge[graph.edge2graph]).all(dim=-1) & \ + (stop[graph.edge2graph] == 0) + has_modified_edge = scatter_max(is_modified_edge.long(), graph.edge2graph, dim_size=len(graph))[0] > 0 + bond_type[is_modified_edge] = new_bond_type[has_modified_edge] + edge_list[is_modified_edge, 2] = new_bond_type[has_modified_edge] + # modify reverse edges + new_edge = new_edge.flip(-1) + is_modified_edge = (edge_list[:, :2] == new_edge[graph.edge2graph]).all(dim=-1) & \ + (stop[graph.edge2graph] == 0) + bond_type[is_modified_edge] = new_bond_type[has_modified_edge] + edge_list[is_modified_edge, 2] = new_bond_type[has_modified_edge] + + # add new edges + has_new_edge = (~has_modified_edge) & (stop == 0) + new_edge_list = torch.stack([new_node_in, new_node_out, new_bond_type], dim=-1)[has_new_edge] + bond_type = functional._extend(bond_type, graph.num_edges, new_bond_type[has_new_edge], has_new_edge)[0] + edge_list, num_edges = functional._extend(edge_list, graph.num_edges, new_edge_list, has_new_edge) + # add reverse edges + new_edge_list = torch.stack([new_node_out, new_node_in, new_bond_type], dim=-1)[has_new_edge] + bond_type = functional._extend(bond_type, num_edges, new_bond_type[has_new_edge], has_new_edge)[0] + edge_list, num_edges = functional._extend(edge_list, num_edges, new_edge_list, has_new_edge) + + logp = logp + graph.logp + + # inherit attributes + data_dict = graph.data_dict + meta_dict = graph.meta_dict + for key in ["atom_type", "bond_type", "is_new_node", "is_reaction_center", "logp"]: + data_dict.pop(key) + # pad 0 for node / edge attributes + for k, v in data_dict.items(): + if "node" in meta_dict[k]: + shape = (len(new_atom_type), *v.shape[1:]) + new_data = torch.zeros(shape, dtype=v.dtype, device=self.device) + data_dict[k] = functional._extend(v, graph.num_nodes, new_data, has_new_node)[0] + if "edge" in meta_dict[k]: + shape = (len(new_edge_list) * 2, *v.shape[1:]) + new_data = torch.zeros(shape, dtype=v.dtype, device=self.device) + data_dict[k] = functional._extend(v, graph.num_edges, new_data, has_new_edge * 2)[0] + + new_graph = type(graph)(edge_list, atom_type=atom_type, bond_type=bond_type, num_nodes=num_nodes, + num_edges=num_edges, num_relation=graph.num_relation, + is_new_node=is_new_node, is_reaction_center=is_reaction_center, logp=logp, + meta_dict=meta_dict, **data_dict) + with new_graph.graph(): + new_graph.is_stopped = stop == 1 + valid = logp > float("-inf") + new_graph = new_graph[valid] + + new_graph, feature_valid = self._update_molecule_feature(new_graph) + return new_graph[feature_valid] + + @torch.no_grad() + def predict_reactant(self, batch, num_beam=10, max_prediction=20, max_step=20): + if "synthon" in batch: + synthon = batch["synthon"] + synthon2product = torch.repeat_interleave(batch["num_synthon"]) + assert (synthon2product < len(batch["reaction"])).all() + reaction = batch["reaction"][synthon2product] + else: + reactant, synthon = batch["graph"] + reaction = batch["reaction"] + + # In any case, ensure that the synthon is a molecule rather than an ion + # This is consistent across train/test routines in synthon completion + synthon, feature_valid = self._update_molecule_feature(synthon) + synthon = synthon[feature_valid] + reaction = reaction[feature_valid] + + graph = synthon + with graph.graph(): + # for convenience, because we need to manipulate graph a lot + graph.reaction = reaction + graph.synthon_id = torch.arange(len(graph), device=graph.device) + if not hasattr(graph, "logp"): + graph.logp = torch.zeros(len(graph), device=graph.device) + with graph.node(): + graph.is_new_node = torch.zeros(graph.num_node, dtype=torch.bool, device=graph.device) + graph.is_reaction_center = (graph.atom_map > 0) & \ + (graph.atom_map.unsqueeze(-1) == + graph.reaction_center[graph.node2graph]).any(dim=-1) + + result = [] + num_prediction = torch.zeros(len(synthon), dtype=torch.long, device=self.device) + for i in range(max_step): + logger.warning("action step: %d" % i) + logger.warning("batched beam size: %d" % len(graph)) + # each candidate has #beam actions + action, logp = self._topk_action(graph, num_beam) + + # each candidate is expanded to at most #beam (depending on validity) new candidates + new_graph = self._apply_action(graph, action, logp) + # assert (new_graph[is_stopped].logp > float("-inf")).all() + offset = -2 * (new_graph.logp.max() - new_graph.logp.min()) + key = new_graph.synthon_id * offset + new_graph.logp + order = key.argsort(descending=True) + new_graph = new_graph[order] + + num_candidate = new_graph.synthon_id.bincount(minlength=len(synthon)) + topk = functional.variadic_topk(new_graph.logp, num_candidate, num_beam)[1] + topk_index = topk + (num_candidate.cumsum(0) - num_candidate).unsqueeze(-1) + topk_index = torch.unique(topk_index) + new_graph = new_graph[topk_index] + result.append(new_graph[new_graph.is_stopped]) + num_added = scatter_add(new_graph.is_stopped.long(), new_graph.synthon_id, dim_size=len(synthon)) + num_prediction += num_added + + # remove samples that already hit max prediction + is_continue = (~new_graph.is_stopped) & (num_prediction[new_graph.synthon_id] < max_prediction) + graph = new_graph[is_continue] + if len(graph) == 0: + break + + result = self._cat(result) + # sort by synthon id + order = result.synthon_id.argsort() + result = result[order] + + # remove duplicate predictions + is_duplicate = [] + synthon_id = -1 + for graph in result: + if graph.synthon_id != synthon_id: + synthon_id = graph.synthon_id + smiles_set = set() + smiles = graph.to_smiles(isomeric=False, atom_map=False, canonical=True) + is_duplicate.append(smiles in smiles_set) + smiles_set.add(smiles) + is_duplicate = torch.tensor(is_duplicate, device=self.device) + result = result[~is_duplicate] + num_prediction = result.synthon_id.bincount(minlength=len(synthon)) + + # remove extra predictions + topk = functional.variadic_topk(result.logp, num_prediction, max_prediction)[1] + topk_index = topk + (num_prediction.cumsum(0) - num_prediction).unsqueeze(-1) + topk_index = topk_index.flatten(0) + topk_index_shifted = torch.cat([-torch.ones(1, dtype=torch.long, device=self.device), topk_index[:-1]]) + is_duplicate = topk_index == topk_index_shifted + result = result[topk_index[~is_duplicate]] + + return result # (< num_graph * max_prediction) + + def _extend(self, data, num_xs, input, input2graph=None): + if input2graph is None: + num_input_per_graph = len(input) // len(num_xs) + input2graph = torch.arange(len(num_xs), device=data.device).unsqueeze(-1) + input2graph = input2graph.repeat(1, num_input_per_graph).flatten() + num_inputs = input2graph.bincount(minlength=len(num_xs)) + new_num_xs = num_xs + num_inputs + new_num_cum_xs = new_num_xs.cumsum(0) + new_num_x = new_num_cum_xs[-1].item() + new_data = torch.zeros(new_num_x, *data.shape[1:], dtype=data.dtype, device=data.device) + starts = new_num_cum_xs - new_num_xs + ends = starts + num_xs + index = functional.multi_slice_mask(starts, ends, new_num_x) + new_data[index] = data + new_data[~index] = input + return new_data, new_num_xs + + def predict_and_target(self, batch, all_loss=None, metric=None): + reactant, synthon = batch["graph"] + reactant = reactant.clone() + with reactant.graph(): + reactant.reaction = batch["reaction"] + + graph1, node_in_target1, node_out_target1, bond_target1, stop_target1 = self.all_edge(reactant, synthon) + graph2, node_in_target2, node_out_target2, bond_target2, stop_target2 = self.all_stop(reactant, synthon) + + graph = self._cat([graph1, graph2]) + + node_in_target = torch.cat([node_in_target1, node_in_target2]) + node_out_target = torch.cat([node_out_target1, node_out_target2]) + bond_target = torch.cat([bond_target1, bond_target2]) + stop_target = torch.cat([stop_target1, stop_target2]) + size = graph.num_nodes + # add new atom candidates into the size of each graph + size_ext = size + self.num_atom_type + + synthon_feature = torch.stack([graph.is_new_node, graph.is_reaction_center], dim=-1).float() + node_feature = graph.node_feature.float() + self.input_linear(synthon_feature) + output = self.model(graph, node_feature, all_loss, metric) + + node_feature = [output["node_feature"]] + graph_feature = [] + for _feature in sorted(self.feature): + if _feature == "reaction": + reaction_feature = torch.zeros(len(graph), self.num_reaction, dtype=torch.float32, device=self.device) + reaction_feature.scatter_(1, graph.reaction.unsqueeze(-1), 1) + graph_feature.append(reaction_feature) + elif _feature == "graph": + graph_feature.append(output["graph_feature"]) + elif _feature == "atom": + node_feature.append(graph.node_feature) + else: + raise ValueError("Unknown feature `%s`" % _feature) + + graph_feature = torch.cat(graph_feature, dim=-1) + # inherit graph features + node_feature.append(graph_feature[graph.node2graph]) + node_feature = torch.cat(node_feature, dim=-1) + + new_node_feature = self.new_atom_feature.weight.repeat(len(graph), 1) + new_graph_feature = graph_feature.unsqueeze(1).repeat(1, self.num_atom_type, 1).flatten(0, 1) + new_node_feature = torch.cat([new_node_feature, new_graph_feature], dim=-1) + node_feature, num_nodes_ext = self._extend(node_feature, graph.num_nodes, new_node_feature) + assert (num_nodes_ext == size_ext).all() + + node2graph_ext = torch.repeat_interleave(num_nodes_ext) + num_cum_nodes_ext = num_nodes_ext.cumsum(0) + starts = num_cum_nodes_ext - num_nodes_ext + graph.num_nodes + ends = num_cum_nodes_ext + is_new_node = functional.multi_slice_mask(starts, ends, num_cum_nodes_ext[-1]) + + node_in = node_in_target + num_cum_nodes_ext - num_nodes_ext + node_out = node_out_target + num_cum_nodes_ext - num_nodes_ext + edge = torch.stack([node_in, node_out], dim=-1) + + node_out_feature = torch.cat([node_feature[node_in][node2graph_ext], node_feature], dim=-1) + bond_feature = node_feature[edge].flatten(-2) + node_in_pred = self.node_in_mlp(node_feature).squeeze(-1) + node_out_pred = self.node_out_mlp(node_out_feature).squeeze(-1) + bond_pred = self.bond_mlp(bond_feature).squeeze(-1) + stop_pred = self.stop_mlp(graph_feature).squeeze(-1) + + infinity = torch.tensor(float("inf"), device=self.device) + # mask out node-in prediction on new atoms + node_in_pred[is_new_node] = -infinity + # mask out node-out prediction on self-loops + node_out_pred[node_in] = -infinity + + return (node_in_pred, node_out_pred, bond_pred, stop_pred), \ + (node_in_target, node_out_target, bond_target, stop_target, size_ext) + + +@R.register("tasks.Retrosynthesis") +class Retrosynthesis(tasks.Task, core.Configurable): + """ + Retrosynthesis task. + + This class wraps pretrained center identification and synthon completion modeules into a pipeline. + + Parameters: + center_identification (CenterIdentification): sub task of center identification + synthon_completion (SynthonCompletion): sub task of synthon completion + center_topk (int, optional): number of reaction centers to predict for each product + num_synthon_beam (int, optional): size of beam search for each synthon + max_prediction (int, optional): max number of final predictions for each product + metric (str or list of str, optional): metric(s). Available metrics are ``top-K``. + """ + + _option_members = {"metric"} + + def __init__(self, center_identification, synthon_completion, center_topk=2, num_synthon_beam=10, max_prediction=20, + metric=("top-1", "top-3", "top-5", "top-10")): + super(Retrosynthesis, self).__init__() + self.center_identification = center_identification + self.synthon_completion = synthon_completion + self.center_topk = center_topk + self.num_synthon_beam = num_synthon_beam + self.max_prediction = max_prediction + self.metric = metric + + def load_state_dict(self, state_dict, strict=True): + if not strict: + raise ValueError("Retrosynthesis only supports load_state_dict() with strict=True") + keys = set(state_dict.keys()) + for model in [self.center_identification, self.synthon_completion]: + if set(model.state_dict().keys()) == keys: + return model.load_state_dict(state_dict, strict) + raise RuntimeError("Neither of sub modules matches with state_dict") + + def predict(self, batch, all_loss=None, metric=None): + synthon_batch = self.center_identification.predict_synthon(batch, self.center_topk) + + synthon = synthon_batch["synthon"] + num_synthon = synthon_batch["num_synthon"] + assert (num_synthon >= 1).all() and (num_synthon <= 2).all() + synthon2split = torch.repeat_interleave(num_synthon) + with synthon.graph(): + synthon.reaction_center = synthon_batch["reaction_center"][synthon2split] + synthon.split_logp = synthon_batch["log_likelihood"][synthon2split] + + reactant = self.synthon_completion.predict_reactant(synthon_batch, self.num_synthon_beam, self.max_prediction) + + logps = [] + reactant_ids = [] + product_ids = [] + + # case 1: one synthon + is_single = num_synthon[synthon2split[reactant.synthon_id]] == 1 + reactant_id = is_single.nonzero().squeeze(-1) + logps.append(reactant.split_logp[reactant_id] + reactant.logp[reactant_id]) + product_ids.append(reactant.product_id[reactant_id]) + # pad -1 + reactant_ids.append(torch.stack([reactant_id, -torch.ones_like(reactant_id)], dim=-1)) + + # case 2: two synthons + # use proposal to avoid O(n^2) complexity + reactant1 = torch.arange(len(reactant), device=self.device) + reactant1 = reactant1.unsqueeze(-1).expand(-1, self.max_prediction * 2) + reactant2 = reactant1 + torch.arange(self.max_prediction * 2, device=self.device) + valid = reactant2 < len(reactant) + reactant1 = reactant1[valid] + reactant2 = reactant2[valid] + synthon1 = reactant.synthon_id[reactant1] + synthon2 = reactant.synthon_id[reactant2] + valid = (synthon1 < synthon2) & (synthon2split[synthon1] == synthon2split[synthon2]) + reactant1 = reactant1[valid] + reactant2 = reactant2[valid] + logps.append(reactant.split_logp[reactant1] + reactant.logp[reactant1] + reactant.logp[reactant2]) + product_ids.append(reactant.product_id[reactant1]) + reactant_ids.append(torch.stack([reactant1, reactant2], dim=-1)) + + # combine case 1 & 2 + logps = torch.cat(logps) + reactant_ids = torch.cat(reactant_ids) + product_ids = torch.cat(product_ids) + + order = product_ids.argsort() + logps = logps[order] + reactant_ids = reactant_ids[order] + num_prediction = product_ids.bincount() + logps, topk = functional.variadic_topk(logps, num_prediction, self.max_prediction) + topk_index = topk + (num_prediction.cumsum(0) - num_prediction).unsqueeze(-1) + topk_index_shifted = torch.cat([-torch.ones(len(topk_index), 1, dtype=torch.long, device=self.device), + topk_index[:, :-1]], dim=-1) + is_duplicate = topk_index == topk_index_shifted + reactant_id = reactant_ids[topk_index] # (num_graph, k, 2) + + # why we need to repeat the graph? + # because reactant_id may be duplicated, which is not directly supported by graph indexing + is_padding = reactant_id == -1 + num_synthon = (~is_padding).sum(dim=-1) + num_synthon = num_synthon[~is_duplicate] + logps = logps[~is_duplicate] + offset = torch.arange(self.max_prediction, device=self.device) * len(reactant) + reactant_id = reactant_id + offset.view(1, -1, 1) + reactant_id = reactant_id[~(is_padding | is_duplicate.unsqueeze(-1))] + reactant = reactant.repeat(self.max_prediction) + reactant = reactant[reactant_id] + assert num_synthon.sum() == len(reactant) + synthon2graph = torch.repeat_interleave(num_synthon) + first_synthon = num_synthon.cumsum(0) - num_synthon + # inherit graph attributes from the first synthon + data_dict = reactant.data_mask(graph_index=first_synthon, include="graph")[0] + # merge synthon pairs from the same split into a single graph + reactant = reactant.merge(synthon2graph) + with reactant.graph(): + for k, v in data_dict.items(): + setattr(reactant, k, v) + reactant.logps = logps + + num_prediction = reactant.product_id.bincount() + + return reactant, num_prediction # (num_graph * k) + + def target(self, batch): + reactant, product = batch["graph"] + reactant = reactant.ion_to_molecule() + return reactant + + def evaluate(self, pred, target): + pred, num_prediction = pred + infinity = torch.iinfo(torch.long).max - 1 + + metric = {} + ranking = [] + # any better solution for parallel graph isomorphism? + num_cum_prediction = num_prediction.cumsum(0) + for i in range(len(target)): + target_smiles = target[i].to_smiles(isomeric=False, atom_map=False, canonical=True) + offset = (num_cum_prediction[i] - num_prediction[i]).item() + for j in range(num_prediction[i]): + pred_smiles = pred[offset + j].to_smiles(isomeric=False, atom_map=False, canonical=True) + if pred_smiles == target_smiles: + break + else: + j = infinity + ranking.append(j + 1) + + ranking = torch.tensor(ranking, device=self.device) + for _metric in self.metric: + if _metric.startswith("top-"): + threshold = int(_metric[4:]) + score = (ranking <= threshold).float().mean() + metric["top-%d accuracy" % threshold] = score + else: + raise ValueError("Unknown metric `%s`" % _metric) + + return metric \ No newline at end of file diff --git a/build/lib/torchdrug/tasks/task.py b/build/lib/torchdrug/tasks/task.py new file mode 100644 index 00000000..72c9dbdc --- /dev/null +++ b/build/lib/torchdrug/tasks/task.py @@ -0,0 +1,39 @@ +from collections.abc import Mapping, Sequence + +from torch import nn + + +class Task(nn.Module): + + _option_members = set() + + def _standarize_option(self, x, name): + if x is None: + x = {} + elif isinstance(x, str): + x = {x: 1} + elif isinstance(x, Sequence): + x = dict.fromkeys(x, 1) + elif not isinstance(x, Mapping): + raise ValueError("Invalid value `%s` for option member `%s`" % (x, name)) + return x + + def __setattr__(self, key, value): + if key in self._option_members: + value = self._standarize_option(value, key) + super(Task, self).__setattr__(key, value) + + def preprocess(self, train_set, valid_set, test_set): + pass + + def predict_and_target(self, batch, all_loss=None, metric=None): + return self.predict(batch, all_loss, metric), self.target(batch) + + def predict(self, batch, all_loss=None, metric=None): + raise NotImplementedError + + def target(self, batch): + raise NotImplementedError + + def evaluate(self, pred, target): + raise NotImplementedError \ No newline at end of file diff --git a/build/lib/torchdrug/transforms/__init__.py b/build/lib/torchdrug/transforms/__init__.py new file mode 100644 index 00000000..f8109df9 --- /dev/null +++ b/build/lib/torchdrug/transforms/__init__.py @@ -0,0 +1,7 @@ +from .transform import NormalizeTarget, RemapAtomType, RandomBFSOrder, Shuffle, VirtualNode, \ + VirtualAtom, TruncateProtein, ProteinView, Compose + +__all__ = [ + "NormalizeTarget", "RemapAtomType", "RandomBFSOrder", "Shuffle", + "VirtualNode", "VirtualAtom", "TruncateProtein", "ProteinView", "Compose", +] diff --git a/build/lib/torchdrug/transforms/transform.py b/build/lib/torchdrug/transforms/transform.py new file mode 100644 index 00000000..a971f0a4 --- /dev/null +++ b/build/lib/torchdrug/transforms/transform.py @@ -0,0 +1,314 @@ +import copy +import logging +from collections import deque + +import torch + +from torchdrug import core +from torchdrug.core import Registry as R + + +logger = logging.getLogger(__name__) + + +@R.register("transforms.NormalizeTarget") +class NormalizeTarget(core.Configurable): + """ + Normalize the target values in a sample. + + Parameters: + mean (dict of float): mean of targets + std (dict of float): standard deviation of targets + """ + def __init__(self, mean, std): + self.mean = mean + self.std = std + + def __call__(self, item): + item = item.copy() + for k in self.mean: + if k in item: + item[k] = (item[k] - self.mean[k]) / self.std[k] + else: + raise ValueError("Can't find target `%s` in data item" % k) + return item + + +@R.register("transforms.RemapAtomType") +class RemapAtomType(core.Configurable): + """ + Map atom types to their index in a vocabulary. Atom types that don't present in the vocabulary are mapped to -1. + + Parameters: + atom_types (array_like): vocabulary of atom types + """ + + def __init__(self, atom_types): + atom_types = torch.as_tensor(atom_types) + self.id2atom = atom_types + self.atom2id = - torch.ones(atom_types.max() + 1, dtype=torch.long, device=atom_types.device) + self.atom2id[atom_types] = torch.arange(len(atom_types), device=atom_types.device) + + def __call__(self, item): + graph = copy.copy(item["graph"]) + graph.atom_type = self.atom2id[graph.atom_type] + item = item.copy() + item["graph"] = graph + return item + + +@R.register("transforms.RandomBFSOrder") +class RandomBFSOrder(core.Configurable): + """ + Order the nodes in a graph according to a random BFS order. + """ + + def __call__(self, item): + graph = item["graph"] + edge_list = graph.edge_list[:, :2].tolist() + neighbor = [[] for _ in range(graph.num_node)] + for h, t in edge_list: + neighbor[h].append(t) + depth = [-1] * graph.num_node + + i = torch.randint(graph.num_node, (1,)).item() + queue = deque([i]) + depth[i] = 0 + order = [] + while queue: + h = queue.popleft() + order.append(h) + for t in neighbor[h]: + if depth[t] == -1: + depth[t] = depth[h] + 1 + queue.append(t) + + item = item.copy() + item["graph"] = graph.subgraph(order) + return item + + +@R.register("transforms.Shuffle") +class Shuffle(core.Configurable): + """ + Shuffle the order of nodes and edges in a graph. + + Parameters: + shuffle_node (bool, optional): shuffle node order or not + shuffle_edge (bool, optional): shuffle edge order or not + """ + + def __init__(self, shuffle_node=True, shuffle_edge=True): + self.shuffle_node = shuffle_node + self.shuffle_edge = shuffle_edge + + def __call__(self, item): + graph = item["graph"] + data = self.transform_data(graph.data_dict, graph.meta) + + item = item.copy() + item["graph"] = type(graph)(**data) + return item + + def transform_data(self, data, meta): + edge_list = data["edge_list"] + num_node = data["num_node"] + num_edge = data["num_edge"] + if self.shuffle_edge: + node_perm = torch.randperm(num_node, device=edge_list.device) + else: + node_perm = torch.arange(num_node, device=edge_list.device) + if self.shuffle_edge: + edge_perm = torch.randperm(num_edge, device=edge_list.device) + else: + edge_perm = torch.randperm(num_edge, device=edge_list.device) + new_data = {} + for key in data: + if meta[key] == "node": + new_data[key] = data[key][node_perm] + elif meta[key] == "edge": + new_data[key] = node_perm[data[key][edge_perm]] + else: + new_data[key] = data[key] + + return new_data + + +@R.register("transforms.VirtualNode") +class VirtualNode(core.Configurable): + """ + Add a virtual node and connect it with every node in the graph. + + Parameters: + relation (int, optional): relation of virtual edges. + By default, use the maximal relation in the graph plus 1. + weight (int, optional): weight of virtual edges + node_feature (array_like, optional): feature of the virtual node + edge_feature (array_like, optional): feature of virtual edges + kwargs: other attributes of the virtual node or virtual edges + """ + + def __init__(self, relation=None, weight=1, node_feature=None, edge_feature=None, **kwargs): + self.relation = relation + self.weight = weight + + self.default = {k: torch.as_tensor(v) for k, v in kwargs.items()} + if node_feature is not None: + self.default["node_feature"] = torch.as_tensor(node_feature) + if edge_feature is not None: + self.default["edge_feature"] = torch.as_tensor(edge_feature) + + def __call__(self, item): + graph = item["graph"] + edge_list = graph.edge_list + edge_weight = graph.edge_weight + num_node = graph.num_node + num_relation = graph.num_relation + + existing_node = torch.arange(num_node, device=edge_list.device) + virtual_node = torch.ones(num_node, dtype=torch.long, device=edge_list.device) * num_node + node_in = torch.cat([virtual_node, existing_node]) + node_out = torch.cat([existing_node, virtual_node]) + if edge_list.shape[1] == 2: + new_edge = torch.stack([node_in, node_out], dim=-1) + else: + if self.relation is None: + relation = num_relation + num_relation = num_relation + 1 + else: + relation = self.relation + relation = relation * torch.ones(num_node * 2, dtype=torch.long, device=edge_list.device) + new_edge = torch.stack([node_in, node_out, relation], dim=-1) + edge_list = torch.cat([edge_list, new_edge]) + new_edge_weight = self.weight * torch.ones(num_node * 2, device=edge_weight.device) + edge_weight = torch.cat([edge_weight, new_edge_weight]) + + # add default node/edge attributes + data = graph.data_dict.copy() + for key, value in graph.meta.items(): + if value == "node": + if key in self.default: + new_data = self.default[key].unsqueeze(0) + else: + new_data = torch.zeros(1, *data[key].shape[1:], dtype=data[key].dtype, device=data[key].device) + data[key] = torch.cat([data[key], new_data]) + elif value == "edge": + if key in self.default: + repeat = [-1] * (data[key].ndim - 1) + new_data = self.default[key].expand(num_node * 2, *repeat) + else: + new_data = torch.zeros(num_node * 2, *data[key].shape[1:], + dtype=data[key].dtype, device=data[key].device) + data[key] = torch.cat([data[key], new_data]) + + graph = type(graph)(edge_list, edge_weight=edge_weight, num_node=num_node + 1, + num_relation=num_relation, meta=graph.meta, **data) + + item = item.copy() + item["graph"] = graph + return item + + +@R.register("transforms.VirtualAtom") +class VirtualAtom(VirtualNode, core.Configurable): + """ + Add a virtual atom and connect it with every atom in the molecule. + + Parameters: + atom_type (int, optional): type of the virtual atom + bond_type (int, optional): type of the virtual bonds + node_feature (array_like, optional): feature of the virtual atom + edge_feature (array_like, optional): feature of virtual bonds + kwargs: other attributes of the virtual atoms or virtual bonds + """ + + def __init__(self, atom_type=None, bond_type=None, node_feature=None, edge_feature=None, **kwargs): + super(VirtualAtom, self).__init__(relation=bond_type, weight=1, node_feature=node_feature, + edge_feature=edge_feature, atom_type=atom_type, **kwargs) + + +@R.register("transforms.TruncateProtein") +class TruncateProtein(core.Configurable): + """ + Truncate over long protein sequences into a fixed length. + + Parameters: + max_length (int, optional): maximal length of the sequence. Truncate the sequence if it exceeds this limit. + random (bool, optional): truncate the sequence at a random position. + If not, truncate the suffix of the sequence. + keys (str or list of str, optional): keys for the items that require truncation in a sample + """ + + def __init__(self, max_length=None, random=False, keys="graph"): + self.truncate_length = max_length + self.random = random + if isinstance(keys, str): + keys = [keys] + self.keys = keys + + def __call__(self, item): + new_item = item.copy() + for key in self.keys: + graph = item[key] + if graph.num_residue > self.truncate_length: + if self.random: + start = torch.randint(graph.num_residue - self.truncate_length, (1,)).item() + else: + start = 0 + end = start + self.truncate_length + mask = torch.zeros(graph.num_residue, dtype=torch.bool, device=graph.device) + mask[start:end] = True + graph = graph.subresidue(mask) + + new_item[key] = graph + return new_item + + +@R.register("transforms.ProteinView") +class ProteinView(core.Configurable): + """ + Convert proteins to a specific view. + + Parameters: + view (str): protein view. Can be ``atom`` or ``residue``. + keys (str or list of str, optional): keys for the items that require view change in a sample + """ + + def __init__(self, view, keys="graph"): + self.view = view + if isinstance(keys, str): + keys = [keys] + self.keys = keys + + def __call__(self, item): + item = item.copy() + for key in self.keys: + graph = copy.copy(item[key]) + graph.view = self.view + item[key] = graph + return item + + +@R.register("transforms.Compose") +class Compose(core.Configurable): + """ + Compose a list of transforms into one. + + Parameters: + transforms (list of callable): list of transforms + """ + + def __init__(self, transforms): + # flatten recursive composition + new_transforms = [] + for transform in transforms: + if isinstance(transform, Compose): + new_transforms += transform.transforms + elif transform is not None: + new_transforms.append(transform) + self.transforms = new_transforms + + def __call__(self, item): + for transform in self.transforms: + item = transform(item) + return item diff --git a/build/lib/torchdrug/utils/__init__.py b/build/lib/torchdrug/utils/__init__.py new file mode 100644 index 00000000..e1b7727f --- /dev/null +++ b/build/lib/torchdrug/utils/__init__.py @@ -0,0 +1,13 @@ +from .io import input_choice, literal_eval, no_rdkit_log, capture_rdkit_log +from .file import download, smart_open, extract, compute_md5, get_line_count +from .torch import load_extension, cpu, cuda, detach, clone, mean, cat, stack, sparse_coo_tensor +from .decorator import copy_args, cached_property, cached, deprecated_alias +from . import pretty, comm, plot + +__all__ = [ + "input_choice", "literal_eval", "no_rdkit_log", "capture_rdkit_log", + "download", "smart_open", "extract", "compute_md5", "get_line_count", + "load_extension", "cpu", "cuda", "detach", "clone", "mean", "cat", "stack", "sparse_coo_tensor", + "copy_args", "cached_property", "cached", "deprecated_alias", + "pretty", "comm", "plot", +] \ No newline at end of file diff --git a/build/lib/torchdrug/utils/comm.py b/build/lib/torchdrug/utils/comm.py new file mode 100644 index 00000000..817c2812 --- /dev/null +++ b/build/lib/torchdrug/utils/comm.py @@ -0,0 +1,269 @@ +import os +import multiprocessing +from collections import defaultdict + +import torch +from torch import distributed as dist + + +cpu_group = None +gpu_group = None + + +def get_rank(): + """ + Get the rank of this process in distributed processes. + + Return 0 for single process case. + """ + if dist.is_initialized(): + return dist.get_rank() + if "RANK" in os.environ: + return int(os.environ["RANK"]) + return 0 + + +def get_world_size(): + """ + Get the total number of distributed processes. + + Return 1 for single process case. + """ + if dist.is_initialized(): + return dist.get_world_size() + if "WORLD_SIZE" in os.environ: + return int(os.environ["WORLD_SIZE"]) + return 1 + + +def get_group(device): + """ + Get the process group corresponding to the given device. + + Parameters: + device (torch.device): query device + """ + group = cpu_group if device.type == "cpu" else gpu_group + if group is None: + raise ValueError("%s group is not initialized. Use comm.init_process_group() to initialize it" + % device.type.upper()) + return group + + +def init_process_group(backend, init_method=None, **kwargs): + """ + Initialize CPU and/or GPU process groups. + + Parameters: + backend (str): Communication backend. Use ``nccl`` for GPUs and ``gloo`` for CPUs. + init_method (str, optional): URL specifying how to initialize the process group + """ + global cpu_group + global gpu_group + + dist.init_process_group(backend, init_method, **kwargs) + gpu_group = dist.group.WORLD + if backend == "nccl": + cpu_group = dist.new_group(backend="gloo") + else: + cpu_group = gpu_group + + +def get_cpu_count(): + """ + Get the number of CPUs on this node. + """ + return multiprocessing.cpu_count() + + +def synchronize(): + """ + Synchronize among all distributed processes. + """ + if get_world_size() > 1: + dist.barrier() + + +def _recursive_read(obj): + values = defaultdict(list) + sizes = defaultdict(list) + if isinstance(obj, torch.Tensor): + values[obj.dtype] += [obj.flatten()] + sizes[obj.dtype] += [torch.tensor([obj.numel()], device=obj.device)] + elif isinstance(obj, dict): + for v in obj.values(): + child_values, child_sizes = _recursive_read(v) + for k, v in child_values.items(): + values[k] += v + for k, v in child_sizes.items(): + sizes[k] += v + elif isinstance(obj, list) or isinstance(obj, tuple): + for v in obj: + child_values, child_sizes = _recursive_read(v) + for k, v in child_values.items(): + values[k] += v + for k, v in child_sizes.items(): + sizes[k] += v + else: + raise ValueError("Unknown type `%s`" % type(obj)) + return values, sizes + + +def _recursive_write(obj, values, sizes=None): + if isinstance(obj, torch.Tensor): + if sizes is None: + size = torch.tensor([obj.numel()], device=obj.device) + else: + s = sizes[obj.dtype] + size, s = s.split([1, len(s) - 1]) + sizes[obj.dtype] = s + v = values[obj.dtype] + new_obj, v = v.split([size, v.shape[-1] - size], dim=-1) + # compatible with reduce / stack / cat + new_obj = new_obj.view(new_obj.shape[:-1] + (-1,) + obj.shape[1:]) + values[obj.dtype] = v + return new_obj, values + elif isinstance(obj, dict): + new_obj = {} + for k, v in obj.items(): + new_obj[k], values = _recursive_write(v, values, sizes) + elif isinstance(obj, list) or isinstance(obj, tuple): + new_obj = [] + for v in obj: + new_v, values = _recursive_write(v, values, sizes) + new_obj.append(new_v) + else: + raise ValueError("Unknown type `%s`" % type(obj)) + return new_obj, values + + +def reduce(obj, op="sum", dst=None): + """ + Reduce any nested container of tensors. + + Parameters: + obj (Object): any container object. Can be nested list, tuple or dict. + op (str, optional): element-wise reduction operator. + Available operators are ``sum``, ``mean``, ``min``, ``max``, ``product``. + dst (int, optional): rank of destination worker. If not specified, broadcast the result to all workers. + + Example:: + + >>> # assume 4 workers + >>> rank = comm.get_rank() + >>> x = torch.rand(5) + >>> obj = {"polynomial": x ** rank} + >>> obj = comm.reduce(obj) + >>> assert torch.allclose(obj["polynomial"], x ** 3 + x ** 2 + x + 1) + """ + values = _recursive_read(obj)[0] + values = {k: torch.cat(v) for k, v in values.items()} + + is_mean = op == "mean" + if is_mean: + op = "sum" + op = getattr(dist.ReduceOp, op.upper()) + + reduced = {} + for k, v in values.items(): + dtype = v.dtype + # NCCL can't solve bool. Cast them to byte + if dtype == torch.bool: + v = v.byte() + group = get_group(v.device) + if dst is None: + dist.all_reduce(v, op=op, group=group) + else: + dist.reduce(v, op=op, dst=dst, group=group) + if is_mean: + v = v / get_world_size() + reduced[k] = v.type(dtype) + + return _recursive_write(obj, reduced)[0] + + +def stack(obj, dst=None): + """ + Stack any nested container of tensors. The new dimension will be added at the 0-th axis. + + Parameters: + obj (Object): any container object. Can be nested list, tuple or dict. + dst (int, optional): rank of destination worker. If not specified, broadcast the result to all workers. + + Example:: + + >>> # assume 4 workers + >>> rank = comm.get_rank() + >>> x = torch.rand(5) + >>> obj = {"exponent": x ** rank} + >>> obj = comm.stack(obj) + >>> truth = torch.stack([torch.ones_like(x), x, x ** 2, x ** 3] + >>> assert torch.allclose(obj["exponent"], truth)) + """ + values = _recursive_read(obj)[0] + values = {k: torch.cat(v) for k, v in values.items()} + + stacked = {} + for k, v in values.items(): + dtype = v.dtype + # NCCL can't solve bool. Cast them to byte + if dtype == torch.bool: + dtype = torch.uint8 + s = torch.zeros(get_world_size(), *v.shape, dtype=dtype, device=v.device) + s[get_rank()] = v + group = get_group(s.device) + if dst is None: + dist.all_reduce(s, op=dist.ReduceOp.SUM, group=group) + else: + dist.reduce(s, op=dist.ReduceOp.SUM, dst=dst, group=group) + stacked[k] = s.type(v.dtype) + + return _recursive_write(obj, stacked)[0] + + +def cat(obj, dst=None): + """ + Concatenate any nested container of tensors along the 0-th axis. + + Parameters: + obj (Object): any container object. Can be nested list, tuple or dict. + dst (int, optional): rank of destination worker. If not specified, broadcast the result to all workers. + + Example:: + + >>> # assume 4 workers + >>> rank = comm.get_rank() + >>> rng = torch.arange(10) + >>> obj = {"range": rng[rank * (rank + 1) // 2: (rank + 1) * (rank + 2) // 2]} + >>> obj = comm.cat(obj) + >>> assert torch.allclose(obj["range"], rng) + """ + values, sizes = _recursive_read(obj) + sizes = {k: torch.cat(v) for k, v in sizes.items()} + + sizes = stack(sizes) + cated = {} + for k, value in values.items(): + size = sizes[k].t().flatten() # sizes[k]: (num_worker, num_obj) + dtype = value[0].dtype + # NCCL can't solve bool. Cast them to byte + if dtype == torch.bool: + dtype = torch.uint8 + s = torch.zeros(size.sum(), dtype=dtype, device=value[0].device) + obj_id = get_rank() + world_size = get_world_size() + offset = size[:obj_id].sum() + for v in value: + assert offset + v.numel() <= len(s) + s[offset: offset + v.numel()] = v + offset += size[obj_id: obj_id + world_size].sum() + obj_id += world_size + group = get_group(s.device) + if dst is None: + dist.all_reduce(s, op=dist.ReduceOp.SUM, group=group) + else: + dist.reduce(s, op=dist.ReduceOp.SUM, dst=dst, group=group) + cated[k] = s.type(value[0].dtype) + sizes = {k: v.sum(dim=0) for k, v in sizes.items()} + + return _recursive_write(obj, cated, sizes)[0] \ No newline at end of file diff --git a/build/lib/torchdrug/utils/decorator.py b/build/lib/torchdrug/utils/decorator.py new file mode 100644 index 00000000..bd486ebe --- /dev/null +++ b/build/lib/torchdrug/utils/decorator.py @@ -0,0 +1,297 @@ +import re +import inspect +import warnings +import functools + +from decorator import decorator + +import torch +from torch import nn + +from torchdrug import data + + +def copy_args(obj, args=None, ignore=None): + """ + Copy argument documentation from another function to fill the document of \*\*kwargs in this function. + + This class should be applied as a decorator. + + Parameters: + obj (object): object to copy document from + args (tuple of str, optional): arguments to copy. + By default, it copies all argument documentation from ``obj``, + except those already exist in the current function. + ignore (tuple of str, optional): arguments to ignore + """ + + def wrapper(obj): + sig = get_signature(obj) + parameters = list(sig.parameters.values()) + if parameters[0].name == "cls" or parameters[0].name == "self": + parameters.pop(0) + docs = get_param_docs(obj) + if len(docs) != len(parameters): + raise ValueError("Fail to parse the docstring of `%s`. " + "Inconsistent number of parameters in signature and docstring." % obj.__name__) + new_params = [] + new_docs = [] + param_names = {p.name for p in parameters} + for param, doc in zip(parameters, docs): + if param.kind == inspect.Parameter.VAR_POSITIONAL: + for arg in from_args: + if arg.name in param_names: + continue + new_params.append(arg) + new_docs.append(from_docs[arg.name]) + elif param.kind == inspect.Parameter.VAR_KEYWORD: + for kwarg in from_kwargs: + if kwarg.name in param_names: + continue + new_params.append(kwarg) + new_docs.append(from_docs[kwarg.name]) + else: + new_params.append(param) + new_docs.append(doc) + + new_sig = sig.replace(parameters=new_params) + set_signature(obj, new_sig) + set_param_docs(obj, new_docs) + + return obj + + from_obj = obj + if args is not None: + args = set(args) + if ignore is not None: + ignore = set(ignore) + + sig = get_signature(from_obj) + parameters = list(sig.parameters.values()) + if parameters[0].name == "cls" or parameters[0].name == "self": + parameters.pop(0) + from_args = [] + from_kwargs = [] + for param in parameters: + if (args is None or param.name in args) and (ignore is None or param.name not in ignore): + if param.default == inspect._empty: + from_args.append(param) + else: + from_kwargs.append(param) + + from_docs = get_param_docs(from_obj, as_dict=True) + if len(from_docs) != len(parameters): + raise ValueError("Fail to parse the docstring of `%s`. " + "Inconsistent number of parameters in signature and docstring." % from_obj.__name__) + + return wrapper + + +class cached_property(property): + """ + Cache the property once computed. + """ + + def __init__(self, func): + self.func = func + self.__doc__ = func.__doc__ + + def __get__(self, obj, cls): + if obj is None: + return self + result = self.func(obj) + obj.__dict__[self.func.__name__] = result + return result + + +def cached(forward, debug=False): + """ + Cache the result of last function call. + """ + + @decorator + def wrapper(forward, self, *args, **kwargs): + + def equal(x, y): + if isinstance(x, nn.Parameter): + x = x.data + if isinstance(y, nn.Parameter): + y = y.data + if type(x) != type(y): + return False + if isinstance(x, torch.Tensor): + return x.shape == y.shape and (x == y).all() + elif isinstance(x, data.Graph): + if x.num_node != y.num_node or x.num_edge != y.num_edge or x.num_relation != y.num_relation: + return False + edge_feature = getattr(x, "edge_feature", torch.tensor(0, device=x.device)) + y_edge_feature = getattr(y, "edge_feature", torch.tensor(0, device=y.device)) + if edge_feature.shape != y_edge_feature.shape: + return False + return (x.edge_list == y.edge_list).all() and (x.edge_weight == y.edge_weight).all() \ + and (edge_feature == y_edge_feature).all() + else: + return x == y + + if self.training: + return forward(self, *args, **kwargs) + + sig = inspect.signature(forward) + func = sig.bind(self, *args, **kwargs) + func.apply_defaults() + arguments = func.arguments.copy() + arguments.pop(next(iter(arguments.keys()))) + + if hasattr(self, "_forward_cache"): + hit = True + message = [] + for k, v in arguments.items(): + if not equal(self._forward_cache[k], v): + hit = False + message.append("%s: miss" % k) + break + message.append("%s: hit" % k) + if debug: + print("[cache] %s" % ", ".join(message)) + else: + hit = False + if debug: + print("[cache] cold start") + if hit: + return self._forward_cache["result"] + else: + self._forward_cache = {} + + for k, v in arguments.items(): + if isinstance(v, torch.Tensor) or isinstance(v, data.Graph): + v = v.detach() + self._forward_cache[k] = v + result = forward(self, *args, **kwargs) + self._forward_cache["result"] = result + return result + + return wrapper(forward) + + +def deprecated_alias(**alias): + """ + Handle argument alias for a function and output deprecated warnings. + """ + + def decorate(obj): + + @functools.wraps(obj) + def wrapper(*args, **kwargs): + for key, value in alias.items(): + if key in kwargs: + if value in kwargs: + raise TypeError("%s() got values for both `%s` and `%s`" % (obj.__name__, value, key)) + warnings.warn("%s(): argument `%s` is deprecated in favor of `%s`" % (obj.__name__, key, value)) + kwargs[value] = kwargs.pop(key) + + return obj(*args, **kwargs) + + sig = get_signature(obj) + parameters = list(sig.parameters.values()) + param_docs = get_param_docs(obj, as_dict=True) + docs = list(param_docs.values()) + alias_params = [] + alias_docs = [] + for key, value in alias.items(): + param = inspect.Parameter(key, inspect.Parameter.POSITIONAL_OR_KEYWORD, + default=None, annotation=sig.parameters[value].annotation) + alias_params.append(param) + param_doc = param_docs[value] + match = re.search(r" \(.*?\)", param_doc) + if match: + type_str = match.group() + else: + type_str = "" + alias_docs.append("%s%s: deprecated alias of ``%s``" % (key, type_str, value)) + + if parameters[-1].kind == inspect.Parameter.VAR_KEYWORD: + new_params = parameters[:-1] + alias_params + parameters[-1:] + new_docs = docs[:-1] + alias_docs + docs[-1:] + else: + new_params = parameters + alias_params + new_docs = docs + alias_docs + new_sig = sig.replace(parameters=new_params) + set_signature(wrapper, new_sig) + set_param_docs(wrapper, new_docs) + + return wrapper + + return decorate + + +def get_param_docs(obj, as_dict=False): + doc = obj.__doc__ or "" + + match = re.search(r"Parameters:\n", doc) + if not match: + return [] + begin = match.end() + indent = re.search(r"\s+", doc[begin:]).group() + match = re.search(r"^(?!%s)" % indent, doc[begin:]) + if match: + end = begin + match.start() + else: + end = None + param_docs = [] + pattern = r"^%s\S.*(?:\n%s\s+\S.*)*" % (indent, indent) + for match in re.finditer(pattern, doc[begin:end], re.MULTILINE): + doc = match.group() + doc = re.sub("^%s" % indent, "", doc, re.MULTILINE) # remove indent + param_docs.append(doc) + if as_dict: + param_docs = {re.search("\S+", doc).group(): doc for doc in param_docs} + + return param_docs + + +def set_param_docs(obj, param_docs): + doc = obj.__doc__ or "" + if isinstance(param_docs, dict): + param_docs = param_docs.values() + + match = re.search(r"Parameters:\n", doc) + if not match: + indent = None + for match in re.finditer(r"^(\s*)", doc): + if indent is None or len(match.group(1)) < len(indent): + indent = match.group(1) + param_docs = [re.sub("^", indent, doc, re.MULTILINE) for doc in param_docs] # add indent + param_docs = "\n".join(param_docs) + doc = "\n".join([doc, "%sParameters" % indent, param_docs]) + else: + begin = match.end() + indent = re.search(r"\s*", doc[begin:]).group() + pattern = r"^%s\S.*(?:\n%s\s+\S.*)*(?:\n%s\S.*(?:\n%s\s+\S.*)*)*" % ((indent,) * 4) + end = begin + re.search(pattern, doc[begin:], re.MULTILINE).end() + param_docs = [re.sub("^", indent, doc, re.MULTILINE) for doc in param_docs] # add indent + param_docs = "\n".join(param_docs) + doc = "".join([doc[:begin], param_docs, doc[end:]]) + obj.__doc__ = doc + + +def get_signature(obj): + if hasattr(obj, "__signature__"): # already overrided + sig = obj.__signature__ + elif inspect.isclass(obj): + sig = inspect.signature(obj.__init__) + else: + sig = inspect.signature(obj) + + return sig + + +def set_signature(obj, sig): + doc = obj.__doc__ or "" + match = re.search(r"^\s*\W+\(.*?\)( *-> *\W+)?", doc, re.MULTILINE) + if not match: + doc = "%s%s\n%s" % (obj.__name__, sig, doc) + else: + begin, end = match.span() + doc = "".join([doc[:begin], obj.__name__, str(sig), doc[end:]]) + obj.__doc__ = doc + obj.__signature__ = sig diff --git a/build/lib/torchdrug/utils/extension/__init__.py b/build/lib/torchdrug/utils/extension/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/build/lib/torchdrug/utils/extension/torch_ext.cpp b/build/lib/torchdrug/utils/extension/torch_ext.cpp new file mode 100644 index 00000000..15d01514 --- /dev/null +++ b/build/lib/torchdrug/utils/extension/torch_ext.cpp @@ -0,0 +1,14 @@ +#include + +namespace at { + +Tensor sparse_coo_tensor_unsafe(const Tensor &indices, const Tensor &values, IntArrayRef size) { + return _sparse_coo_tensor_unsafe(indices, values, size, values.options().layout(kSparse)); +} + +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("sparse_coo_tensor_unsafe", &at::sparse_coo_tensor_unsafe, + "Construct sparse COO tensor without index check"); +} \ No newline at end of file diff --git a/build/lib/torchdrug/utils/file.py b/build/lib/torchdrug/utils/file.py new file mode 100644 index 00000000..100a775e --- /dev/null +++ b/build/lib/torchdrug/utils/file.py @@ -0,0 +1,168 @@ +import os +import struct +import logging +from tqdm import tqdm + + +logger = logging.getLogger(__name__) + + +def download(url, path, save_file=None, md5=None): + """ + Download a file from the specified url. + Skip the downloading step if there exists a file satisfying the given MD5. + + Parameters: + url (str): URL to download + path (str): path to store the downloaded file + save_file (str, optional): name of save file. If not specified, infer the file name from the URL. + md5 (str, optional): MD5 of the file + """ + from six.moves.urllib.request import urlretrieve + + if save_file is None: + save_file = os.path.basename(url) + if "?" in save_file: + save_file = save_file[:save_file.find("?")] + save_file = os.path.join(path, save_file) + + if not os.path.exists(save_file) or compute_md5(save_file) != md5: + logger.info("Downloading %s to %s" % (url, save_file)) + urlretrieve(url, save_file) + return save_file + + +def smart_open(file_name, mode="rb"): + """ + Open a regular file or a zipped file. + + This function can be used as drop-in replacement of the builtin function `open()`. + + Parameters: + file_name (str): file name + mode (str, optional): open mode for the file stream + """ + import bz2 + import gzip + + extension = os.path.splitext(file_name)[1] + if extension == '.bz2': + return bz2.BZ2File(file_name, mode) + elif extension == '.gz': + return gzip.GzipFile(file_name, mode) + else: + return open(file_name, mode) + + +def extract(zip_file, member=None): + """ + Extract files from a zip file. Currently, ``zip``, ``gz``, ``tar.gz``, ``tar`` file types are supported. + + Parameters: + zip_file (str): file name + member (str, optional): extract specific member from the zip file. + If not specified, extract all members. + """ + import gzip + import shutil + import zipfile + import tarfile + + zip_name, extension = os.path.splitext(zip_file) + if zip_name.endswith(".tar"): + extension = ".tar" + extension + zip_name = zip_name[:-4] + save_path = os.path.dirname(zip_file) + + if extension == ".gz": + member = os.path.basename(zip_name) + members = [member] + save_files = [os.path.join(save_path, member)] + for _member, save_file in zip(members, save_files): + with open(zip_file, "rb") as fin: + fin.seek(-4, 2) + file_size = struct.unpack(">> with utils.capture_rdkit_log() as log: + >>> ... + >>> print(log.content) + """ + return CaptureStdIO(True, True) \ No newline at end of file diff --git a/build/lib/torchdrug/utils/plot.py b/build/lib/torchdrug/utils/plot.py new file mode 100644 index 00000000..6ed102df --- /dev/null +++ b/build/lib/torchdrug/utils/plot.py @@ -0,0 +1,175 @@ +import io +import os +import json +import jinja2 +from PIL import Image + +from rdkit.Chem import AllChem, Draw + + +path = os.path.join(os.path.dirname(__file__), "template") + + +def reaction(reactants, products, save_file=None, figure_size=(3, 3), atom_map=False): + """ + Visualize a chemical reaction. + + Parameters: + reactants (list of Molecule): list of reactants + products (list of Molecule): list of products + save_file (str, optional): save_file (str, optional): ``png`` file to save visualization. + If not provided, show the figure in window. + figure_size (tuple of int, optional): width and height of the figure + atom_map (bool, optional): visualize atom mapping or not + """ + rxn = AllChem.ChemicalReaction() + for reactant in reactants: + mol = reactant.to_molecule() + if not atom_map: + for atom in mol.GetAtoms(): + atom.SetAtomMapNum(0) + rxn.AddReactantTemplate(mol) + for product in products: + mol = product.to_molecule() + if not atom_map: + for atom in mol.GetAtoms(): + atom.SetAtomMapNum(0) + rxn.AddProductTemplate(mol) + size = [100 * s for s in figure_size] + img = Draw.ReactionToImage(rxn, size) + + if save_file is None: + img.show() + else: + img.save(save_file) + + +def highlight(molecule, atoms=None, bonds=None, atom_colors=None, bond_colors=None, save_file=None, figure_size=(3, 3), + atom_map=False): + """ + Visualize a molecule with highlighted atoms or bonds. + + Parameters: + molecule (Molecule): molecule to visualize + atoms (list of int): indexes of atoms to highlight + bonds (list of int): indexes of bonds to highlight + atom_colors (tuple or dict): highlight color for atoms. + Can be a tuple of 3 float between 0 and 1, or a dict that maps each index to a different color. + bond_colors (tuple or dict): highlight color for bonds. + Can be a tuple of 3 float between 0 and 1, or a dict that maps each index to a different color. + save_file (str, optional): save_file (str, optional): ``png`` file to save visualization. + If not provided, show the figure in window. + figure_size (tuple of int, optional): width and height of the figure + atom_map (bool, optional): visualize atom mapping or not + """ + if not isinstance(atom_colors, dict): + atom_colors = dict.fromkeys(atoms, atom_colors) + if not isinstance(bond_colors, dict): + bond_colors = dict.fromkeys(bonds, bond_colors) + + mol = molecule.to_molecule() + if not atom_map: + for atom in mol.GetAtoms(): + atom.SetAtomMapNum(0) + size = [100 * s for s in figure_size] + canvas = Draw.rdMolDraw2D.MolDraw2DCairo(*size) + Draw.rdMolDraw2D.PrepareAndDrawMolecule(canvas, mol, highlightAtoms=atoms, highlightBonds=bonds, + highlightAtomColors=atom_colors, highlightBondColors=bond_colors) + + if save_file is None: + stream = io.BytesIO(canvas.GetDrawingText()) + img = Image.open(stream) + img.show() + else: + canvas.WriteDrawingText(save_file) + + +def echarts(graph, title=None, node_colors=None, edge_colors=None, node_labels=None, relation_labels=None, + node_types=None, type_labels=None, dynamic_size=False, dynamic_width=False, save_file=None): + """ + Visualize a graph in ECharts. + + Parameters: + graph (Graph): graph to visualize + title (str, optional): title of the graph + node_colors (dict, optional): specify colors for some nodes. + Each color is either a tuple of 3 integers between 0 and 255, or a hex color code. + edge_colors (dict, optional): specify colors for some edges. + Each color is either a tuple of 3 integers between 0 and 255, or a hex color code. + node_labels (list of str, optional): labels for each node + relation_labels (list of str, optional): labels for each relation + node_types (list of int, optional): type for each node + type_labels (list of str, optional): labels for each node type + dynamic_size (bool, optional): if true, set the size of nodes based on the logarithm of degrees + dynamic_width (bool, optional): if true, set the width of edges based on the edge weights + save_file (str, optional): ``html`` file to save visualization, accompanied by a ``json`` file + """ + if dynamic_size: + symbol_size = (graph.degree_in + graph.degree_out + 2).log() + symbol_size = symbol_size / symbol_size.mean() * 10 + symbol_size = symbol_size.tolist() + else: + symbol_size = [10] * graph.num_node + nodes = [] + node_colors = node_colors or {} + for i in range(graph.num_node): + node = { + "id": i, + "symbolSize": symbol_size[i], + } + if i in node_colors: + color = node_colors[i] + if isinstance(color, tuple): + color = "rgb%s" % (color,) + node["itemStyle"] = {"color": color} + if node_labels: + node["name"] = node_labels[i] + if node_types: + node["category"] = node_types[i] + nodes.append(node) + + if dynamic_width: + width = graph.edge_weight / graph.edge_weight.mean() * 3 + width = width.tolist() + else: + width = [3] * graph.num_edge + edges = [] + if graph.num_relation: + node_in, node_out, relation = graph.edge_list.t().tolist() + else: + node_in, node_out = graph.edge_list.t().tolist() + relation = None + edge_colors = edge_colors or {} + for i in range(graph.num_edge): + edge = { + "source": node_in[i], + "target": node_out[i], + "lineStyle": {"width": width[i]}, + } + if i in edge_colors: + color = edge_colors[i] + if isinstance(color, tuple): + color = "rgb%s" % (color,) + edge["lineStyle"] = {"color": color} + if relation_labels: + edge["value"] = relation_labels[relation[i]] + edges.append(edge) + + json_file = os.path.splitext(save_file)[0] + ".json" + data = { + "title": title, + "nodes": nodes, + "edges": edges, + } + if type_labels: + data["categories"] = [{"name": label} for label in type_labels] + variables = { + "data_file": os.path.basename(json_file), + "show_label": "true" if node_labels else "false", + } + with open(os.path.join(path, "echarts.html"), "r") as fin, open(save_file, "w") as fout: + template = jinja2.Template(fin.read()) + instance = template.render(variables) + fout.write(instance) + with open(json_file, "w") as fout: + json.dump(data, fout, sort_keys=True, indent=4) \ No newline at end of file diff --git a/build/lib/torchdrug/utils/pretty.py b/build/lib/torchdrug/utils/pretty.py new file mode 100644 index 00000000..9fc622b6 --- /dev/null +++ b/build/lib/torchdrug/utils/pretty.py @@ -0,0 +1,75 @@ +import pprint +from itertools import islice, chain + + +separator = ">" * 30 +line = "-" * 30 + + +class Ellipsis(object): + + def __repr__(self): + return "..." + + +ellipsis = Ellipsis() + + +class PrettyPrinter(pprint.PrettyPrinter): + + truncation = 10 + display = 3 + + def _format_items(self, items, stream, indent, allowance, context, level): + if self._compact and len(items) > self.truncation: + items = chain(islice(items, self.display), [ellipsis], islice(items, len(items) - self.display, None)) + super(PrettyPrinter, self)._format_items(items, stream, indent, allowance, context, level) + + +def print(object, *args, **kwargs): + """ + Print a python object to a stream. + """ + return PrettyPrinter(*args, **kwargs).pprint(object) + + +def format(object, *args, **kwargs): + """ + Format a python object as a string. + """ + return PrettyPrinter(*args, **kwargs).pformat(object) + + +def time(seconds): + """ + Format time as a string. + + Parameters: + seconds (float): time in seconds + """ + sec_per_min = 60 + sec_per_hour = 60 * 60 + sec_per_day = 24 * 60 * 60 + + if seconds > sec_per_day: + return "%.2f days" % (seconds / sec_per_day) + elif seconds > sec_per_hour: + return "%.2f hours" % (seconds / sec_per_hour) + elif seconds > sec_per_min: + return "%.2f mins" % (seconds / sec_per_min) + else: + return "%.2f secs" % seconds + + +def long_array(array, truncation=10, display=3): + """ + Format an array as a string. + + Parameters: + array (array_like): array-like data + truncation (int, optional): truncate array if its length exceeds this threshold + display (int, optional): number of elements to display at the beginning and the end in truncated mode + """ + if len(array) <= truncation: + return "%s" % array + return "%s, ..., %s" % (str(array[:display])[:-1], str(array[-display:])[1:]) \ No newline at end of file diff --git a/build/lib/torchdrug/utils/template/echarts.html b/build/lib/torchdrug/utils/template/echarts.html new file mode 100644 index 00000000..d88eb603 --- /dev/null +++ b/build/lib/torchdrug/utils/template/echarts.html @@ -0,0 +1,63 @@ + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/build/lib/torchdrug/utils/torch.py b/build/lib/torchdrug/utils/torch.py new file mode 100644 index 00000000..ff7088a7 --- /dev/null +++ b/build/lib/torchdrug/utils/torch.py @@ -0,0 +1,190 @@ +import os + +import torch +from torch.utils import cpp_extension + +from torchdrug import data +from . import decorator, comm + + +class LazyExtensionLoader(object): + + def __init__(self, name, sources, extra_cflags=None, extra_cuda_cflags=None, extra_ldflags=None, + extra_include_paths=None, build_directory=None, verbose=False, **kwargs): + self.name = name + self.sources = sources + self.extra_cflags = extra_cflags + self.extra_cuda_cflags = extra_cuda_cflags + self.extra_ldflags = extra_ldflags + self.extra_include_paths = extra_include_paths + worker_name = "%s_%d" % (name, comm.get_rank()) + self.build_directory = build_directory or cpp_extension._get_build_directory(worker_name, verbose) + self.verbose = verbose + self.kwargs = kwargs + + def __getattr__(self, key): + return getattr(self.module, key) + + @decorator.cached_property + def module(self): + return cpp_extension.load(self.name, self.sources, self.extra_cflags, self.extra_cuda_cflags, + self.extra_ldflags, self.extra_include_paths, self.build_directory, + self.verbose, **self.kwargs) + + +def load_extension(name, sources, extra_cflags=None, extra_cuda_cflags=None, **kwargs): + """ + Load a PyTorch C++ extension just-in-time (JIT). + Automatically decide the compilation flags if not specified. + + This function performs lazy evaluation and is multi-process-safe. + + See `torch.utils.cpp_extension.load`_ for more details. + + .. _torch.utils.cpp_extension.load: + https://pytorch.org/docs/stable/cpp_extension.html#torch.utils.cpp_extension.load + """ + if extra_cflags is None: + extra_cflags = ["-Ofast"] + if torch.backends.openmp.is_available(): + extra_cflags += ["-fopenmp", "-DAT_PARALLEL_OPENMP"] + else: + extra_cflags.append("-DAT_PARALLEL_NATIVE") + if extra_cuda_cflags is None: + if torch.cuda.is_available(): + extra_cuda_cflags = ["-O3"] + extra_cflags.append("-DCUDA_OP") + else: + new_sources = [] + for source in sources: + if not cpp_extension._is_cuda_file(source): + new_sources.append(source) + sources = new_sources + + return LazyExtensionLoader(name, sources, extra_cflags, extra_cuda_cflags, **kwargs) + + +def cpu(obj, *args, **kwargs): + """ + Transfer any nested container of tensors to CPU. + """ + if hasattr(obj, "cpu"): + return obj.cpu(*args, **kwargs) + elif isinstance(obj, (str, bytes)): + return obj + elif isinstance(obj, dict): + return type(obj)({k: cpu(v, *args, **kwargs) for k, v in obj.items()}) + elif isinstance(obj, (list, tuple)): + return type(obj)(cpu(x, *args, **kwargs) for x in obj) + + raise TypeError("Can't transfer object type `%s`" % type(obj)) + + +def cuda(obj, *args, **kwargs): + """ + Transfer any nested container of tensors to CUDA. + """ + if hasattr(obj, "cuda"): + return obj.cuda(*args, **kwargs) + elif isinstance(obj, (str, bytes)): + return obj + elif isinstance(obj, dict): + return type(obj)({k: cuda(v, *args, **kwargs) for k, v in obj.items()}) + elif isinstance(obj, (list, tuple)): + return type(obj)(cuda(x, *args, **kwargs) for x in obj) + + raise TypeError("Can't transfer object type `%s`" % type(obj)) + + +def detach(obj): + """ + Detach tensors in any nested conatiner. + """ + if hasattr(obj, "detach"): + return obj.detach() + elif isinstance(obj, dict): + return type(obj)({k: detach(v) for k, v in obj.items()}) + elif isinstance(obj, (list, tuple)): + return type(obj)(detach(x) for x in obj) + + raise TypeError("Can't perform detach over object type `%s`" % type(obj)) + + +def clone(obj, *args, **kwargs): + """ + Clone tensors in any nested conatiner. + """ + if hasattr(obj, "clone"): + return obj.clone(*args, **kwargs) + elif isinstance(obj, dict): + return type(obj)({k: clone(v, *args, **kwargs) for k, v in obj.items()}) + elif isinstance(obj, (list, tuple)): + return type(obj)(clone(x, *args, **kwargs) for x in obj) + + raise TypeError("Can't perform detach over object type `%s`" % type(obj)) + + +def mean(obj, *args, **kwargs): + """ + Compute mean of tensors in any nested container. + """ + if hasattr(obj, "mean"): + return obj.mean(*args, **kwargs) + elif isinstance(obj, dict): + return type(obj)({k: mean(v, *args, **kwargs) for k, v in obj.items()}) + elif isinstance(obj, (list, tuple)): + return type(obj)(mean(x, *args, **kwargs) for x in obj) + + raise TypeError("Can't perform mean over object type `%s`" % type(obj)) + + +def cat(objs, *args, **kwargs): + """ + Concatenate a list of nested containers with the same structure. + """ + obj = objs[0] + if isinstance(obj, torch.Tensor): + return torch.cat(objs, *args, **kwargs) + elif isinstance(obj, data.PackedGraph): + return data.cat(objs) + elif isinstance(obj, dict): + return {k: cat([x[k] for x in objs], *args, **kwargs) for k in obj} + elif isinstance(obj, (list, tuple)): + return type(obj)(cat(xs, *args, **kwargs) for xs in zip(*objs)) + + raise TypeError("Can't perform concatenation over object type `%s`" % type(obj)) + + +def stack(objs, *args, **kwargs): + """ + Stack a list of nested containers with the same structure. + """ + obj = objs[0] + if isinstance(obj, torch.Tensor): + return torch.stack(objs, *args, **kwargs) + elif isinstance(obj, dict): + return {k: stack([x[k] for x in objs], *args, **kwargs) for k in obj} + elif isinstance(obj, (list, tuple)): + return type(obj)(stack(xs, *args, **kwargs) for xs in zip(*objs)) + + raise TypeError("Can't perform stack over object type `%s`" % type(obj)) + + +def sparse_coo_tensor(indices, values, size): + """ + Construct a sparse COO tensor without index check. Much faster than `torch.sparse_coo_tensor`_. + + .. _torch.sparse_coo_tensor: + https://pytorch.org/docs/stable/generated/torch.sparse_coo_tensor.html + + Parameters: + indices (Tensor): 2D indices of shape (2, n) + values (Tensor): values of shape (n,) + size (list): size of the tensor + """ + return torch_ext.sparse_coo_tensor_unsafe(indices, values, size) + + +path = os.path.join(os.path.dirname(__file__), "extension") + +torch_ext = load_extension("torch_ext", [os.path.join(path, "torch_ext.cpp")]) \ No newline at end of file diff --git a/dist/torchdrug-0.2.1-py3.9.egg b/dist/torchdrug-0.2.1-py3.9.egg new file mode 100644 index 0000000000000000000000000000000000000000..6e0560c3dcf1e2a7ddeccb66b373910a8b415b32 GIT binary patch literal 610596 zcmZ^~bC4xb^DWx8ak{5%+qP}nwr$(CZQIkvv~Am*H{ZSS?(cr_;{A~o6(=gAYGp?5 zTr2lJ3euopXh1+fP(ZO7dg@916;iFRKtRvfKtRayjI$ zx^i)(C5+Ad2D}~E3wNTar#kgw zR{^OPa%ZBcjCv$CiILu%b6``RJt?6EnR{IcqLY&`o1u%G!}wxEnnbcScAq(D z(s@FMiyMnE5W%e{5mSN=3hSkd#BP%Ih?e)Id!Bbeu_TM(#7rTRvOw0&Fv_=6#`!3tQTaq zwfrije$}UH^u$7ni$+}|Wwn72lW)<9&eq1v_;)`Ebgw3v&op0Vnw!JvlD$P9Ru=MVWY7vrHyu8C~>d&`-@72DQCTV5N_v18T9Dbj5|2%$MaKIsi zMz+$>60zn`3~h&{S0@o^Zfyb!y^txoi=uMuQ)e1p&DTCMxQXxx!8(TDp^n!YaRlb$KRm$bI2<_0>;YI$+UK& z2Jf8o&i1KOXZ^n3Ptx6olbcPyeq>$$PVwjC$ql`I-a$hV0mLI)jH{^|jR&ZmUHywt z_Vu17>^5|0PtmVi)+r#Z5;dg~Ny(C|_O60OYdiOICya`+Js}jcQz>7{v$(kt2eIo} z>C^44Zq}~u4Du>Dhb9cPA(NYzrrO8pcXjdd`{Eu()|X9g!V>r_b5=PfzM|$VzkxHT zczp-_Pz52NL%~Iep4{qkKJ(t7+!k zs)V$d)6gEl$y+?xn5ivh-I*F2m~X|ZMy7E-*}VEW=;8!_kccn;}VrWU)QLz{cR1zlcR+uSonY*%j-$zn_m zVH%ii*<;{s^&oY_%iL>l-}aZ0)Rvy;q-{z`^{go|;vp9I7l8Y+AZ2BsGX9ZwR71vX zcDP4+VL-2ttx#(`Oz1W}8Rl^b>W{46ztL-H@qEz;zg)~6O}FB8>Mi}*7;SapUIL23 zNOlj0yjppEEsGb^C6Gq?2{JSjC~`rsAO0Xd79Y-Co@bGpwsNJtqEiXY>VwAzYv2&h z@RvC zWf6HVJ)+yO{H!@>(O4et-5Bxi$pllBKF8J3iJ>7)t?IvSXql>EdW}9tkp20+6 ztm^>3`0TG!(OGr8o&ma2_tY;-Ng&p)3ByP9?j;2nIggu74ZtcxyXkFC-Y*` zNk0;BwPjd#$d_GKS>&oTZox9^X^iLrkA!DJ4+LM*dUf2O22_XXMN*SCUIwAS5TlSz zmZGy=pxOFMn-+yo{+I-J%{E;2u&h?twKKW7UNyt9ZTSlrN=(`Nd9Nsk{v;i@uEwYF z6SVuQF!dEKai-42uM&rxs}bs}L75-cldI_b(l7LZzuOAaki^^$6aj`wrg+O~QvQ0; z`dcwZG%N~HfoRpWme<#q8aL*Qw=2NEXs-J&2s{|>QoB#N+cRQCo=^#-MAfC8f^jEs zwgX0lEV%320=W!y9iaG(mqZl0Hyr-K0UME;WP^6bZmzAH=EIixy6~Si@qDizHu-$7 zpI4N=eAmtP=Z~9wo4InJh@)%5r)OQ=X{+XQ#08!Uu7D&*UVJ=qD%8e9H6Z|ewN*p#9@_)*r=ludyOLop zE*di$q$e#AkiOw+4O$<3aa=S8HHrExq2+drtzhgZJYFm%@*qDm=YniIb7qcg*J1OH zB_y{sV*^sof&G@`NRWEw=qG1a()g`61C)6+or*|^Jah5)j-<$C`|~2z?aj zNb;C2rlIm+$F=AZZVhCby`v%NkE?g_9^wZ;h^~ zWVBoyB$6P@D$@~I6}H60mRA?i1EnQb=p$aa{rgzWU0;aHI$Y7V?SpZI4^`YO99Pie zRUx!hNm(it!3XB-mcMt9B(?fGHgd(< z>o$st2QFpMDs{1p;6d!zKk~kRJ*m4~zW3_ozX$FQ2cCN|N^6ytw16}QAROfvaf;P+j`ht#^M2(5yVd7ivRu2?fxe8F7TqOM6B+P&H;V0M=ER> zrV^8mXpuDX1*ay^Vy?2MlS97Oqd$z4n7|>1yS+4%$1TQM8003gh#vZK4I_&GL6x@%ZCRAq{D(4sE| zR;T&*g4tGl`u0$)Y*FRR@iguxoV#^9ztO;Xd|$0&H#KO6*C~;&V~>N#tL%`nskD!U z>_T^!EczrOxy5foz|Tf2W^W6>v{j>{nZG+q`$9vj&`&`v)ADs+x2YP9b1%?kDsnsM zL_B)$khUHmr#VEWqBB#+#y&q|FS2Ck{1+SiFR;RYaeRDgal8>wAfTgv1phzG|Nn4& zWqDO4VNqo|7Y~=zbZO^9Hn@P>cY5pb%^Ml-E1T_Exy|iaGp`i|5)#L0^*4#4uaBUl z>l)L6M*5~$L>6Eqpu+xspB+EnwH@ExpO;Vm%~Vx)Xea1uh8aMEv6dqw`hS z;@nwTXDWE2seO@_puWEax~Hpuf1Xdn>Gl7{0peWMkj4jcxDav?j1+v?S{!iii@CCbpMOu|VlD31$6gMFd1Oc(gOt8@)a+0fOY-7@fPt_F*C#!Ia=pON$y^0;Cf$jX6#J`xWs)f-o@-0wnVygS~M8tn=Ds%KIJn>yxE8 z<1&L$l1SCL&`v!1a3X<+lgL3{4hx>HxYS8bMgd;-svxtPPJa9-^g3uk=B=~6;eyz) z;eEFDp@@pkGwu9_-;6a5Ztnw$1o+o;X~9*snv)9!*bA<$08afE-2g;W3fq~JnUlQM z!j`m|d+|?LX+Kj5kgMt{faPSPMAz|5R@PNL^J7_yM?%fzS|`2p6HW}J$J(k3EX{H} zcAjKoPicHhNy2xzcimdvc3AX2h1cJulf2>pZ@r0U_3I;Xzg=j0gzX4qqSf8khEaoS z2_^4YCO`3`Jc$ApvOv2j&!bnE-1|8as2yw+5v0jfUcJ;dtsDnKZ(!zOt)Y#;)`){vV44mw=lpxJS$fzX z6TC zdVSEBhYvk5+#MNrTJvDZ%$G3;G7bbOv@%$XfUc#irZ-${c>Y%N5t5+PuwNPzp}q&#h%I9v}ysXbMi(l$H#9 z$xd*SPDk0lpRz%2x67n!BU#?O7p`A7f#fiWhOv$ajO3~bwIBKayXuo6R+;`4JrM9e z!~MUj-o(_w)Xv1z&e&7m#?sE(`9I}<2m` z-2OeC^3VRu%gNNy)zZoIf4z$~S{h-P08Zq!4;Db6DuwY|7fK;CL_fBet({(EJBHEbCp8ntA!4}g~e<)1v9Q)@d{V%%z0qSD!WNcyL7uVs=isRtH)S=f@MLzB^6MBr^(H~)Gh=-|@kIG157f4RH65UsktBhbMBN*{MK%|f52>fnq zC`Q@chpQUlo+BgO>xaW%i|G_O;6FJIey6hnQE|#xw0+}F(i$lN225KStMcJ8e+%hb zhk5|=TmCQ3tPaw_`Jn8w+X&z8TH6)PQ}^@yTO#E8c&w4K;v7y3t}BBWctN0AoI z%cDgfeV6PTo7Tip!cFPVO*uKCZ1bH`OV;Y3x0U`=b?UULV?a~207}`!9g>qvmU>j0 zOmp7Mms)|j$hX%*8|Rj#1saC5RH}~U@AllVMG4k;NddJf&a=V%hbH%deCha7gDQ_r%3jeU@N{N+}HW+($; z8hBid70_q-qmP5H1Mme%1px%1Evg}fZrk=mg9k0lZ+kWY%9}X5gUIY%)Vzv%-7;ZjVAM4|u3V4p0oWL~r}hNF(XvQ!dYYJ#~z zVm{YK$X18z+vt^G2uFnTXw~S)R5a8MD__1eqcG8}_XGyjD1UbdnX?<>MrJf*u^)(X z;k$LCdSJ<-nSJyFFbpUjmvc}fZJy43ghz-1_Gvi$idUX6$d$_WTw7oP^QM?*2JE!t zzBEj5du7}RnnQIoQnJZA*ZcIl3gu*AO5f-#Daz%flZAqK%W~qsg#68`UXtCC4n_t`bL^(a$%h>>BljRAHCZ}F--${_AdJ(pgokr^J8BJLJKttNYalJO;~ zdwxqWT5Fi+W{zZBq6pm4k$)XIgX$;MqHL%=J8Zz0dK+pilg*l&t`>%3T+)>-YpViE z^HY|GFfym@TrBd9wszy@gE@}2k2r*P82Mw#=@wad$sxB(GE^0zjfo7eSUgu}3VAPv zgCSe#JwtVsRYN(9R`sz4|_G+5qQ2U8P z4~d3Z6$`9gsJ4cxI6G&F(GbJe$=Aj^+(Wa?rXu*P3gsBZOxmisoP>AXyyn1O;p+P} zrKpT`DKk1+%mehy>(Z;}JgP2cX?i2c&VRsBu(fD6IE(N$JjGAK9FM`p+}xz~qrbs| z;ZH4}S240*oS#9IAzE;b-sYbc21UHLD-R9m6>~7nZGU}aHA#bGb^C#Fae{50V?ux0v;9CJw zZ|#RDlh4B$ zc=2)YaD4k-?O&(g+wJ9je?!IZ@7?KiQ7kM+Y}ho$d?_qcEL@bBUCdik?d1$-eq$ z&|@(D25<4^$2u72O+2$UsJFfm_`=wcAlbIF16Uw-$_Rj1-2f6`aT4qs? zalt9K>TmRbO-&Dj zdoMdp$IVs?zLWZEY{J4NAz8J>fnV5&4KkcC!n!$l@OT5t?35+hZ$ZY_l0^cTjE)VM=0>V^L8EL7>MZ)1 z%qW?wB*d$gH&$ujYZY+-sSoq6uY1UfJ@V7nk8wAXznL3+1LNz;dials7rj0b+hNJ_ zoLBMbV&u5q&_R6%&OOyW{!HFM^F8qJ?-f2qJW~F6PC)kF#FIpmNAoajZDb{pXk^OP zE3N+a|DX2vpY0M0W8cice?9;4pV9tT`_tEV@H93wwlLM#{~r!u?BMBQVQ)vv%=xb| z8tW?X%5MoEZ9lKR$K)bLQmJA|V?yH-gb<;TRw60BQN&HoSaoK;#jLPx=n{A6JFB12 z+h#}c3kZ(hkU~W!?o2N&WiKq<(MU(sj=ymK6oq_|+EX>W85VMF1^}U#l%ki$c@K4y z>Z8jXc0V)hl2AX3*{%Ho1;SyJd8S zJGcM^Q&x(>w;@teK;3cR&DIub$JeQF76#-$(AJrCSvIb%Z>r`$)&f!wSOHeZr{v=A z>xz83A>GG*o$5X*g}TXkwyF?1k4`J@Qjc=j`rFjZD89Pvy0&Ai7s^wLSrT8_jZG*! zMGS*;kB6|#d^e_3t!`<%)>ciGX%m~MJAn>Oi}Q#ZF(-dR|KxdWOK}WDy9PIEr&OJD zkNqHZo-1{|wD_~KfRL%rQ|LyOVc)pj^x-rO2Scwsi@Z9qL2~{<9m}d)h)HFCCHvWU zVSxHN*(uw~Oc~R&Nt{n9)00BY@|gSYT-pGyrb+xGfK&fuG1dQXF8?>J`R_#9V#wMb zj=6^E7g0>=U$*vY-iA5$bgOMxUrx*t1Ec|BQawk?j!93I}P;VC>E_ z>bAZiopm0Hf9g!5=Ud%9t6c+lpHq=C2t&<-DtLA;_7A+=_?&~Y&@M^8@2T=k|9SoJ zG;JSW;eobacKstZIhFuyulYNdwu!X=3XrkqRipLS2~4I!pP!JSS#0(f*?_?7ownU; z-XlAjskY)ypUgWoRU6uMEUN4v`tvdDpL+eGpD)hm`m=q2yI1y4Sfm%b!KG9W%BBM|>c5 zWI;S!2R50G0LR!+rs+wO#tQt7diEiLX&1q{{ie&B<2jCklZtv*m z@I}?XW%KQ7;eZ2)9iT?NL~^Dxe-dlD;1#pW0*9elw1hOcB-b-0_M zGZP6>udv+(=zPW1B^9+vs}uX5;R1?2ikP9ZEvo@!7TUXXmfbAfL^wDtI0~xf9sP5n zdRdJ}-#sn|JaW#z%8)TA1TFhwD@xH3Ab3nm`6eJr`Jy0AnFZV@MH0e%^FHII%TPV5 z=}sK2gYR|5EGY(0rK}0w{JvUpq?;&Yg80%2yRvW9j7Jspuq0|&APb>BOG(jf->AAk zuJwE80mnfbs6fq0kTh{e@PD47ni2%lE2MF`#PbW;bb}jZ#oOt%uPcwRD} z`@%4aLw`bGFmw@~B<%~}`#IVMt6U|$TEf*l_t$`_*9^enYxZiA4k0v@=&@pCT8!H( z;$w$Iqw(zG+8i*}y7>wx-Pkr{v}Ee{&?7LU_{hQ&RPXiwj6pC*jYT~~$Q%3s^GueV zv~|R3X@;#@(Bg|B&pmz{CgFJQ-8-@$Pj@HB`@Jy8+)C0<4)hseO3G`ld|t`@WVX{c z^|7<&W0dFd?By-SglAbUr_e*GG<1Y^t#<1~nFBrOZh4t`HsnMoLo?QjL%)r5I*m4W ztPb}A%?y3d4fVzWI2##_jJE|vZGJ$N;aO5?t2b^5`5U@ zAccQ@b@=PZHzk0p*ZN?^WA7rSID>pmTZsG*y35luAcRb)V7K z7Z3tSC{=3m=Z!xYCGD|Ati-P;v#ez6SNI4kUx135&96}QhgQ;{9f8)nTvTuzBJbC? zQrGu%fvO#J44MY5tWM~`O<#;*)LvN%)ifK~QN>IqdO>Y>Sf;Hzgl^l}#7 zYvxs`zPNMBfz6#AjKJq!0cbYOV^1#d!gfU*a_t0L0Y-v^f)@w7K=g6x2~?z&)ncnv z$Pj*0+kPxwp6n?10%}^18e`7%GbNDV775VM4j)7*ML1Tl@}=yp$pbwsUX(D(Beg?L zT_>(@d@1_3QjF_Xo(Y)A3)_@{G9h~Yi7@D3T)i_x%+l?)S2m=tua2l6ZH&a?W{-5j zkS8(kVv^z+d?Fym9sG%6NPcf*D>1^AY<(X6UoXkGQMMiKyw zRJ|_lVYDo~A3zyY%`0ZSpu+6;LCmd{C}iT~$IgNQSDV1Xw?bN52&Jm_)$5yLs~R_y zGn%&MWII*b++&_UGtd;oX&P^J4seUcy!EIj8canzp)qZ7)adCf2nvX2+qG3%7Dm<*xQ!YsGgjJm*y58;vlMH`+;mGd!fzS`J&6D`!sqyzN4- z8mMZhQE*ib!5Otkz%~H~PMBnCQ5LSFIJ(0!lOPD!M8;dBRV@S&sOC|k6xD%ijcNSfPhe-iZ|doTFqnfBHSF+ zzAH^VG>t8hH%=%8g3B1ly{H#JLB`yM4}B)EPAYFwzDZX%UODmErSfYqv{S5+fYX8I47kc96Q+O%byEl;PWl0{jt*m-&W7@ zG6!VkW!CRobd6?$@b%yEvH$m!*?*wDa})&MApil9F#qpy>;H^P{};6XT>c59R&3q) z!?t^0fAHc1h4%~PW>2b^4~KKMbet&J;LA4AM$L&Pk%5)p5D z@GdC3)f0z4a}H*c$?rnNT!n|KKmM-e!8SADO?HS(w{>h)>(M=xRBsAwuGAjA3E4IE zT}3zs7jk^=s-0{EUo(8w&9y4(STzZr#Z7gJphQ0h7Z+6ZO>OAswO38pYdNW{Dvr%R z;1+WLbr8QIilSX8AuuR0m+l%=?>B7zcBA-elDLT#Swv~4{6}U^S*U5`}dG%to!i1YNaLCc!hbe*M~$5D1Hzu#`kvnT^QS-%_aDsIA7%kcqBOgq>*)V4ixEbPcw}CNjq~w6g71m zOT>u_IxNGsf)Uz+p0=p~4Xali$~``!y)!|Y^dUjt(H|iM1KJ8rt$~|uBU8+e#>!)v zuT1_vU1$c3p+ZP_H9xD1U3Vke*le(r1PTRKj!z{YUNfFW>BI``rehVP*c*OX`UkkJ zdMoURg*Ii2ud9qy)wVhwcFp{j?$l?%nvE$rKy$Tnl!`P5tVKxcEH+f-82N~toB2{Q zXlr6r$RBP5!*SsSQiY155fYL965az#3x{Xjl{EOk4iY(-D4@zDRt95&>TZ>=e7aaq z64`VTOV1FfR?WRCy*k?GaBep-7+F}Lz4CPLhWzmFN>ppYTzJ*=lwE_lrs_m-kVs4I zlzyN@yRvNmHsQV!WIP9j!u=z`w)a0Ko^y?un$r!e$sQ{68#VA1$O`Ic875GnCHB#M zinDkg`6k2eI6_)#+nhk-g+eeyC`z{s=1+#Cf8-mv3F*Tv4jQN=cVlJpkHZ!S58BmW zA{GO9O+VzObT2X{nk7u!N~z`6q!ly9igh|BkMsS<^PzHC8!aRY_@h~X5F@gK#%R8w zCncY6n=}ekK4go(Fdt`*02pj!4k_hCC>}suO9xO9d!lu)&gl@%?o@(Zz!=IuJBnOe zA}Tv6cSE@OUh|>h207HXtCe&?-R@xpYIV?>}1>;dD* z%_ZC8$mbA0_q2IfaK%`an}b?&$%q@(e$*9n^AB&|sEl2X@zN8)C*I^V%3{sCR=VN< z6Q>kWQFDwJ{{p0g<8)q%*^S`mo zEk>&I2BY*492W@YJzYpql5YJ4#sr)oui~HXU@HS__a>F-7;wTSKd~P*jH4}YoUlGY z^-T{F=goaHt&{tuLm?aANVAQ`a;YDm})S$+lrHq^V^uZj2e=%lMis+O43}DAtXAL&Ft+ zP{58OD~j!iZVXpWaw8C^)qF~*2|tX^CcF|j-Xa!Q1afjT=7wbk0)TA{e<5on`Goiq zVGH}~Bw!$^X#(v}Y)Zee9{#}&5`TN(YB>A}5L3#)ZUvUq2NnxX{|o2RwfZGM8Y1xL zdrWJfMw{|m=|(2>6rfDJI9LQ@;~+EHcD*{$%BNcvx%A-hH{zEwjwz}KxhCP4BTiM^ zv6$GBr)9}gVF0%3pq9CycqZV`WCtd->C=!Wrn)T9|P}VwS=QHbxtBrSBvKjD+hguAn+AUrPzwJ?8fIzqnpAjry zQCOM9KL#Y#afO!Knx&QtQ_#EOvp5C-*u(vIYUJ%JlxH7w+EVgZ>9}3FaixIJY!SfI zsj|~_&$*Drxyr zhomorKyR+PvtVjnWIRjtYw-!*9j9jhi$!~@Q@8a;)gEQ~%UT^6D7vIcwuTE>P9AG$ zsqr#I$cYMAF0DX}s?`hfQr(H>_Maot4qjyb6s5x0Yjqy9RLBYuE?xz#S`?hbj*zfJ zs5LL8wW@g>Pc+*mG0XJ5Wm}=iM>Wf^u0Js?;Z;`$6p>#*EU{3tAV42}_a`5QSP5Zp z-!HI6Ukl&r-iY4F$b#TSS<}z#o<_!ox54P#BluwQjv&gvH?jn*PgJFCS)>^7D^N?r zGnpA0We}zY=+35s1Lh>F*2I<2w5i9(htI*;E z=0k>K273u{HfSxX!oi7@U_6I_taWK?fd&qpnH}rJS8*B$*4Vc!zS}YK5BS2VK0AG` zemP~e%0)w>0js%PJM?jDqcdPS5%7jn0iVdu>;$vYa8_i>dE^NqoExT2tQSu1EHK~S z+L9zWEA>GQ5O2C?*LRBFFxfFi!_J(Ea8BXDr)zq>_S3cdEVIuYob$#)^pvC+0Ll7n0fm61$PGbF zALsyjS^$008A-@LP1xh2xB>OZ1^XtVs(YI&Xc!vdn1-@AQPvtNIOt2ubSv9lC3q$d}gF9EV*5_eR*739@*^XqMx8 zw`Z-tdPv#WbbguRR3nxe^A3tmERhve|5WG$Fu?IPrZV3?qp?jh8sYhE{qhFi?TEK{ zKH{Db;);nfuD+PQn_m!q&QcaHEfe*DB04u?Yq*z`6Mx?6O3(%!d>OX=oK!5wr89}| zLcq*9;sDpuV{~MsOpQZt4o47nPV`6aaPSf20gY+d#8{*1DM#Zx@x$@U7m%uGCRN2F z_X*?zmCQt@0r8k2xJ+_a&F1&*6#&Z;m_T=Wz`CRDmEKwmCV>%((GJJG15fWUt!}p& znv9>zB8zMn}KgupgA^)@+KhW>D-yXDr2OOGp1VhwFhK&woJlJl4XbU)8hw3Mk#De(Z6P{ zI{I8R_^yDpvsB)FKU&(9jt7a%N5z9+R%C~`615V~6l>@<^BBky1Bb;FWa#^2lz3t5 z_xZ3%PREp!^X-n|HiE z`AfcRdk#(dxCB)CRo8AR&7rt*cglo$9sbtu+bxVBX^Lbdx&b|qNI$ioZwFB-@W{>d(pZKHzv&!!@60^Uy4lg!TIMEITb z4n5P!B*V4S9awNN%33J>ZVkbs%cQ-X1+ZnJ(opM=V_B3i? zH$x%LLzRN#;2GqGzU2X39c~(YrXT$wanY(8-ISjxGaSJzvurOE;gfxv?w_4FYH<)) zmMnJ#0wSyaTg{HKp|S}qptPs_fhqt0>y#$?zpceLb8BO1_(7HrG^9T&mkO`0F+M zR}vAWC408CHGyU{&Me%iw^*HAZ2~T;mEyVm1&>edsGmOT=crs1YBd)fH=)(&v|Z_i z)f5Jx1J%iUzTjy&C^hxMr1hLzuSsa(5Kd*uBieFTHBL^`1w5~$7AGHoXG8hfilG+;gx(bMI?r>bx1?Y``PbKYxT6@NChsxfG%-!#CdWBFoZky)|vD ze0OR!xQi@``1u*Zri;!x7v3&BTPw7X+Kar$rkmRa_AnR~dnzE(RDtJZBfabZX}#4L z>=MFV0yp&buSgMWrNvrt>O_42W4CRCq{LdN7Ra{+F0t0*o(8dKQr34@g=O-3Il&kW zG2tKFRY66nv9cRUl%FH3q4O#jwyVAw5E)MFz8P4T`_tMXdQ}0vr~At;zw8Q^X7#HH znRL~JUYoKl=S_WUpp-I)=KZ(~uz6@T$`;CXhWph*K)lc(ZSAuIt~|VOY#MCgoFE=o z(u64MzcCQJcKq3d}dnL)@0S)!n+wNbn}U7&y`wsE-w3UOX)2d^YhL_41WA5 z1&i+p+jrDt5w{Nch5tIBfClV?Q}LC!>epyoje3hv&B~F~d5dKPMg5L&)nk&)Oo<)K z7-#^hrm$)=thvzU3jUdEaLKwZRp-&JM}Fs_{71DC|92TMP>mKnCTAZoGiaAi)v^P9 z$>2emq<-QnoqEeb8!a-xSVYo4;O`#vU`^)mArKz}BXD_cQMG{b5Af6>8gEw#BIQOM zmui2o^ym|-uPp|U*BZ{i^2@-z5RhK6+O%?3zt86^ABl?`izqw=L;^5)6}p@{7n_PK z#y~KBGt5@JufJF?xqGGs>-fv6|#LU@XE#$&C) zM9@9$VM-pk0w84Kqev_aJj!tkoEP3o5#jRzZl`I)6`nO%%jh#{;j4dFWfhk*ilJ~w zfY#l5**qN_7PQ}*1^+&Ebc&-la6|c)z_FSLeSiRdI}NC~dg4**-J+n%LWIlZG?N8m zlg%choFcE!B?O{8Kt3*8(s*Zqz2>!31w5#v@=C_sHBCs6NCj1!%jffGb`gYPNHB5; zQwDk>UP8gF-!p{(f4NrD{tkAjHuiA3kFf*Td5~p#w&UjJamcgvdU=dAuTCdNOqngq zjpI7tp*>R}(G^m>!~e;0*ec=n3hAo6CU)o6t6tC)fSbi2ejxp{W=mVODiWnDO?a2Q z4pe!f2C+&9pQR%Z6@+g^<<(&1F^~oI6HuHw>9z<$;>e(&G?p(<5x&p|eNXvTNQHZ_ zRKTd^&;3~4m3s$5RLJ@6uJHcBsT_%00go1^A(OM3Iu=e1+*6;mpvQ^3G%dJjs6Q7NUp4TQN*)+lcqK!H?ja5jlATpFr1~*l3rwA zeAkt2M9y9!VKRRj!p8xUC+ z#D!LM#`WtG3D8+Z`JoiJ1we_;;P7JJgQLn$MCvoT)&G0v1uj9NmvIXVH8790j3b-p zv;?KcPEf-m+^uX|xwuM-`7zaEGZ+tKO~3&stKm1_tL)B#r&)9aLj}zu6ohSuvWtI} zZoKe|r$C{l-|}s6?wcYIGM0p6^=@;nJ0Vi_21k@e$EitE&J%ki6Hp4w-1b7a7+#b* zKD~^&|2%$7p2J)s*~%PpPv#3LyZ@R&>K7&jt#t{J!~zAT<}8H=PqS1i&bNH)=J4Hv z>e*^PU-s`GN4Nn7=fSy7Mgf%5MNbZm)9_)A1`O;1tZI`0ibe=InHsM-Y|^9YLCsmE zGu{DhW0LM13BsAFCRV5E!Gp)n>_Fd<~&gq%)eI`=w}*{+ha+)`xGvrnrV3Bq69t~*Gu+t(`PSe|d4JOFqP`vsp^L&*3&IOmcZI_XYY2c)#4 zw~2e4ybxS0ND@R|-+~PX7})^=^93nhpPj)9h7_=NKKho*bW7zD0?bQmU}P>A)7(1q ze0iu#;;e+GSTAAW!S_vagX_@_g=A})F>H8LO;3=|d z4W*$mXBp1nwn(nXtXop5+Ul4f#6~<>V9%e6XXapj`4|%2Zgv-!;H2+kHRE8}46&T` zQmMM0C3WUnt8;HxR1z+}!ESloT4dhz-aiQqFaBGHf@rNmE(P~Vgq}p_omM>)=!gjH zQeeuF)^*}< zGt&{191a0)br}4CU}Iu_oDOMQ3nTG%5l%}IcM*8H!2UQ#W26qam+t&|n=(P~PJLXT zIK|`fWx408oLx7Cq}IFZKIkU=tqN3(Fv9xzj0NbIi;-fm~#tv zU*J{P*~I%pnrqN>Sp6?E1_ia8dVBEPg@?V#q}+l6N{8APQYeFdKjn|V!fE-up>@kx zJWP5-&8^kd+B_e|>{V?W0Oh?m)EBDHnL+S962V9hs<`d^f2{6M4l@(gEnj~QSL z?7mpgfqu|cE5DfJ&7bW>V#IQ~-!_JaJZUnqKqV+_1+{B%70nQl@D$$&0=kA484v7e zIhB|fECx=C77LW-4{5IQ0g5$1;Zpuo-4452uz|ki-R))!FghcPNuZ^8q9xVRlM^ak z7heqe(tPaUW>dertyprejI9Kwg~=g4D7_&Ry@#)Rm zrb}@pBO!5ZK1C>0hXFV zEDy;J<`@SE|B5{y-F}Uhnx~%_nQ$}WXw}3Nce7|`;at#mj?A>PX-4OZIc0G1hAqJ7 zz3>>i*Kr9Eq7`3+C4ifp%Z~cRb!412jZ@ASW9l~Vp-@^PZ1Gr%;Q&s@@mOVYHWTgx zI`XDB;S7=Yl5x;}Y7Gh^nKUTO2`Yd$`5#23ap~Ll_OJEZ#o8 zmBT0usplNu=Xn3HCvgoo@DY^gi@}Jn0-5#+=tew)P!@>IpT>YbHXlV)t+g2OuC5mZ zB2WPrTnPA>L#?$o|L1DU8g2%OyLCm5JYKS^us9T(<@+U?ip~gj`(Drafvxj{|A(=6 z3KA`9wsgz3ZQHKeW!tuG+qP}nwad0`+jiC6f8UO{=X7^;+=n%v*4vE8%$Yg9k?t{r z2hGTC(k0{3*L7o0+~zv}c~LtcL_i}A@S znMJ!Frgxbqj-3UMG|ntn;HJm-_D1(4vXWL?&48q}Ul7I$blXm9jYveSK82({=FtwMZyO=BhLENy(oRl`-xKnP^?@oQ40ht^ zA6QPR!fz0D!v1E;e&+qIJlL4YuH(BwT`g$0F@r@fx+ntZQ&*dcGHf^1Y zUpQYsMbIOF@4?G9`NlJHm=;Zu{LME{d)nBw567@AH8>gR8NTxa%92I#WA;e%6fVHt zQfj{8BXi!S%%=WCL+$S}LX@>;cz36FHXA|(c@5h(nd)yA1(q3&!{a1c5!0k3m~}B* z#ao0y#$|I3GwV*~2wI}2@E&AC>5@#;&!5-(`d{X+Y4kF8d7uCQCJ6t>2bi^;nVE^> zf5wz*dRCj_2!5|+7$9I391qW|`t8teB_XZJt#e@rM=dO=uQV3JH&hXvH=VmvHxr50 z(Z8Q;^t3DsI9w91t1Xv460eZjBVr3FlP~kW8V*u?h7>waM+ef zGh6%k(|`{%>VK#4{nsmMsq};7^HX2d{YM*m@|g)fLmEys;Xp49==(d;a>NcIBR4_eW;*Y>gzA$7TjzHF}?7h zle9F99G_p?SAca5YDRbX+DLi z5a8arB!m?%;D8mBYVMy@aF$F>g#CmLdOGSdH_5Oro@PozDpKAv`Iz$2SdnKi(|EAD z$lHQT0m&M$=NXyDT!(CAc}iYm2WG-M#bAx@M^o29yN(>E7Iu0gP1_r=1f4Gr7g0*s zvVOs74Gn~g;z)kx#gop?*8W8a7T+o=H4p0O2=&11$2st^JKp@(VNzY)`vurLkJ3}n z$!n;Ee_Cr|u-cB?s_nUidyj=qxdj(_Iw`)1c{z}P^{%+9@yn-iYd)}bBCb%*bU8sg zTJye@gyU0$Ow*39=&4XFIxhpKTH(lq;a3&~efQDvZfyr++>QS@1g?sAltcn>)tMet z2uSs;z`W3Mg>$ceoY`2>rcVo*khuVb;;e^L>*{MzQ-6qavJJYkVA4i8Qo|Zp&4)8VRwk<=_hC%Zb}(A0VQ%s5C3ZU)-TBVHA1a#%l*DJPLUDTTV&I%-+}*o>=!zwMT6+=gt4ao13dsc1ZGL6O2X ze}e8dls1Qq*`PQZD=m}jgBjzdRxi90KB#Wp3bKFd6RTy)wJwZAHaaO<*f7MVK_LV1M*g_O7ZHXU897}EP4cz5g4vP z>i{H!uFr&&h-y*wnvRhmE_+R|a1Q)CvRMQ!G#)(ELQG9KqGu(~Dljy06zdv*-@z9U zTuPUIT)N0oc(gF%B3)$V2vtoZz}jkC4H&IL#r-5HJ_Mq3LFhgTllRW2&qcagbk$%S zZ!k4rs$uQkp%s_7wxz9Cx4Fmmr!leG(=AIc%0_CAV>sLo{%o2VO-rFWXbf% zk!H*)1>ZI=eHxzP)xI0o4w>5`XXl1kwiOzTNg;pf*?kmKXUih0!2&riWaklX{z`x7 z7EJ(t5X+I~UiW;_^jO^an5PyjKZI&7CB(%gC z5vT$C;Lr3bn`UfksHYB;Hrk2Enow6}!L_8h$F&vT0YCZRq=^yTjaoElCGCBPuEU;4 zRhz{waA7e1c(|%Y?U5{q>wBDC$wui~(B9_p znR^c4UQ-f?*WO-H>Bl!axD}*-ZG|=sE7uhZGFS`KJvHs2^r>f4Ko%cyropTgM_@dm zj)8~C0i+G1szESI>Uj3(XiHx6IXPX-0+Zdw2@#Gw>B#mX!O?LXeV(6F)Jz;(^HFScvVmj2zdq9EEAv`dNN(a#)=4v+SZ?JDyqd>Z@a zj^MnxC^1np+XFw6J?B>s?$k!6lVvdUj%SSo0;IM}?2iO_hPL+tdg*x}T3uiRcRK?$ zPry&*+5SIBGrjbJ4tz<*&TY>QM-4+tHg!vN!RsW|Wt`6N(5YTpOAb%^<#oLOFIJ$) zkohyXCZsohuHsd$JC^;yEQ6nJ5lMv?j3%j!yioZ{hYMT>XR!@3St^GEe*Y( zRt3Ag*}5oN`?Z`@?1J5)nGjLq9M$acx3@jnSyx{J-p!)TPJ!L0Mw(IOPUvSv@C?_2RI^xB(UhMJJ^4hqv8O&J40nShNS0*r({RSDb3fP74%_{C+-owQE63ji3o z$60{)(wFPE93Q_emUZ{${ zJGMIe!|0^ola{nw0S0z~wZ9UiuH!PqKB;krdLnB~&hIwVCG~36$hKe&mPfLVi)Jf# zp0AY5(9jzQ2!KfZP-6hd0NQ6g*`4OwnhkjfUh%@w$kFR0Yz#x{L!_QpO=?pm$xJnr z-@>kNM0>Bzc*!R!)87ZsHJJuZU7T7A#}cH))gLRhdL6jNpi0Wgm7>qdbUSTy-0ZaY z&F%h1u5%X<=s&n%{|hyid%O2T@Gtwg{gXfbo9_GL8RvGW}hEiPjQ=nB@m@`**bCM9ei{J0B*C!x?4|hPwDON7}7gny-moMUM zlrQe=bAIfpk~`lq{k{h!$8p||k(1ZB-_)POx~fKTK20F z-!+N*_N9m-miDxl?y*f+5KXkNd}L_)7!flxJ*96lpfrABoPfL@8z4!W&I9btR=<_D zFQ}Couvoj#<4z|^y|Xj*E)E7~B_yBVN@U#ZmPo$d=v+mc#3&vVoM`fM#a9lV^| zcyd4>t!_qyxuZV00VS|l@w}br$~!w8)?&No@Gg(SBD16Fp1SUJy1fRDJxkJekwCf? z_1QhJ?80vuAhjdG%`K@2yDYAOE(2ohK~3~I8wK2O4?;{DXmINM319H=H{e8Uhr|Gu z=i%uX5@L_ua>W)e)m?(jT8y_)_L&O3qj{6GuwrUEfmr|#?O<}5=D=aMg8svWF$`h_f zAEARtQbBOy1+KgH=<2Ct*yuztOdIVAXo^&P6Pi|PShRh>*`buRLS*p-jED!|chUsZ zy-s2t7z6vxA=Zl#Y0N=T7#J=j?vCL?XffmO6NNIZ`U<3ggPZbVfp2rXBO({^R zpKPbeVj`u`E(5h>yNfcI|J`A~c*+gZ55up{9=k$#6PEFHsvW(xx08?VI?%jlwswga z4diOi4ke~evW||>Ywh$4FKi4cjGZY9%*t?ckYX>8gbkSJP_GI-pIL6a>w!Ma<^>p)3GYAH3Yug{lOcuE|ZcLc=7|Pnfb-!nS&`f|#0*j2yo+OzL z_Fb%yp)N6Z8A-*Twbpj)X~>>&)<*u(PoAkRdg#~H%nal8^T_R+UOcUf0ej2qcDt;m zS=aUDUElf1!`aNM2ji9(<^}z>a5Strm)yMU8E~gdBzYEViyhlgy!ve7>6Aek*=(E~KN4W%Y?w%k_=7$4TnA?_2E_<8o-koiXfCtDJ>FrR=La-%z- zV|h^eijYpb(W5}f4MCi(W!$t8!(l6_ZLtbIjQkY?W7>P4hq$#m#$}qsh?Rc6fa8>+ zwM_%UkK(AwQ<7a`&A9klOxRt8&yX4+jKB&FF0VI3Qqy_Qb_i*}PGc-N;nzD?*0~r~ zFT1`SupS{^O3SL~RE?WNWU;`{ofvG$!$j;>Zn(-S;N4iOCq$C;&C)u+M}H2DgFm*v0%y~zlk=RHAb z!8Z9;&A?YN!+@>0voqYN1*^m(LyhQen4-@PT^}r!W>$7KOXC%HVtg>&pdZ{wsQ`8DT7Sx8pd?A6l$`2#T*d{yyLeY356HE2TU+9(EQYpva1kHZ9d7pk{u{kpdQ zdP8j4;rU;GXke>F3B1q_AKS>vdN5jL6!oKfal|P^)dpin>hDC}nG>;i7}12!SZtbq zRRc_$tY@O*+;c2>-xo>|+XEYBo13RlFo_j!yKy8mrFD$!>b5(-L-?wdbuzFT+=lzm z5>0>i?=_93unkxX=GjWP#U;&5dcazGNEpq&we4edJn{XO8ynh?Q^&WutwQyw7Z4zB zr?`Sq6H_$6_E0Kjs(LXSxpd+_+>=~&LNfP4tt#qDQYDZ!k4Vxfb^Tq`qLZ{uPKe!U z{I(N$TT9fW=Qe?q7u?I(z%JBH+8r)0qnvxwebdOw)KOc-@&2A;C9V>`J0s~dtG>6| z=tr(Bp`oOvG!u*zVGj{4s!|~unFddEe5|tO#k~?aBU1AcVvUAb)zMyEDL2^EMVf4S zgGD8~K6Ok@%?Q-6vvIU$jYQ4z#pqAH*z2?EC7gGer&5SYEO-4e2w|u2J&4X29JHXe z_81Huwnu9vvKfKl9XoIGlm};!yQ3s$nC#r837jEk+q4-Iu?*YjvYYBP(W{s9`SGNtf+wZ)Q|tL=<(;8JM={WIt!#A`5d`1v6gnSy3SgNkL)`aF zN;XxRqc@c6d=$P_NFApL^$Fv{O2k=BVuW%hLItT_8fK_nb{Wjz-ik^(d+ z%n6GBvSGm{mKF+2-1K8+^wf=Zpa!$?q=_e!aZiEFlj)%0HL~99U50Y!QG5_Zl(lun zi~>RyfxB1nK*Xy3yM!or3T1sPt&p@@JahDgbbz%llDO6v8LUqVU2lp~k||PJSsF!f zNd8y+3L*XhhD(yxNhGLDvbR*0Uc%$_=SC~8vIa+a&&eKN-Q<2QwNrcDJ1c^9p_9`w=B8%8pJ5~=NR1s*5*EeuoyZP zl7QKvFeC##l* zmw~9d+Rod3&nm*so;78ErH+AXm?V~)LFINY2k$IXvN|^Yqd=NUmUk=mOu-mUt!toK zLXyIB1M4QgHAUDe5mIQ*zgfL~PlhocGnCO4r-lSDc8{K0&|LMh)3xEBHO2TZfyOp2 zk0I1qSzo^c7k{N5O`!EOcmanXui2PjtD0Pi`9xKV40q=jIq8$S-PayfjwLluSwOJA z$cTuLY=iYp%hIyN_w}`cI%`(SNK5o)Ol>ODlyZk?d^o4RlM(-VDbHLBzUU?oomiPZH;sY66k8y)ha+ZC7EMN{(~|B^9zM`66zQ*`a&rdw=v^bwiIbZJZO zz%2ZtpBs(D&DePsyKN%?k~QT)dB1H3vKM-5bcr-;LKG5mgk%hDPPKn?MDIyKK`G@( zXqUNpQZ)5r>aZpVe&?j7v`{71#r}|h20s6b)GQ)5l|-CLpGMlQ0>#ObzRDzofs>ib zLe~MqGwUkGYR9Piu`%GSG|kb}VlTMtHL&mTk6L2XRMmYis$^$d{bH zsDJ^F`T>mv*(PilEeszll^ zx>h1qP;qneCqmtGaQ>_-XF8wi$P5#9CQGiy=^sbb`wdt)3*l?@(7!A8*SSxk%dB(U##Ny zwMgvy#?WQMtUKD?V=q0B=!nmO7A%*i9%YMkapn6<3YW}H@kYeF0n+{ES0DwcmV7L5 z)^e_EyHq|to;|^MYQ+q%W7r5y8tR39xC9y`026EwNBZ1%E`4oVPb1-gG87B=<*uuM zL{LMZQBM4cvfG|}|1J{Znm~w(hnrC>s-I!^i2`noR8F@6aoTGI{^P$?4($u^fUE?R zlp?bZoa8`>6ox-Zgk{m(V~3N4Kx9=NcJ$foqjcUzb>>$bQ)9%GMFw<5hCMy867d#< zW*GJXu9>SdCVUT6=z$SKOuJDaqC{QeT=9+6A!6Hb?<^Ec!9P@fAw-VlSpbDG}?JXw<11I&w9|n_nR;X)LdJP=lS``S<}FQ zdh00x${j^8Ro2gjWDZ>^K~l%#e)ElgLlyK$R~{Bq`z&-E zHrb+Qvu9zpf2wQabhA%huCgC-Y>H+8>O13S$Vl9?Rjat8%Y$1|AV0`Ed<@L_l#gAc-FrmCjjY8Zj#@?4F3Ld@g zYrc$Ue8CiklDpG3nGkNUd`~nW-Vz8fyy7-1e&h7Yqh#$GN`HlYxe9da?6oa7k9Mpuo`+V}cf@*Jxx zrGj}VoXXvnJfV7$P1Z)N6j=zzy96q01p#q)E*BQ;I!jeSXp+;H|FocnPb87>BDld zF4(jeId^J%hMM&F9&esIc))}CnFh|VhgJ?(q0I;126xx6Tv>4NEf{zJhjRgw5Eted z+}U1wo(jX}b@fVYG0UN=uV*}*HY14h8bBm=Wnd!LX=?G@AGTgA*jm9ZC-)@Taq&}0 zG2}OMoPb`j0eOlh&HZb0dISS1Ip!leEC`}DEY~H%j%*qwvliK0+UUX)mz^pNw|9Hl zj6zry+MUS7zU@5+>}$ucR%|f>%=LWv8^DMD@B##3<_-jk9`e~x(QLO_9767d_eB_; zp|E?MiQ(e}E}}YZNk{U1T}&q=4G?*ZWAGLz?YePN(t%2?(9O+s^|y!ia>MWJj!EWb zL@<-lRnyqu;6!F`kZV7nq0_l9(`+@aQsFeYYBX@P)%QCqhd`#sD}AhmJs`3fyAZ*|QKvJ7hEOIr??Y&!}h0yxP4b9GU?n!~|h6pv$a z+p-2@hUJD~!B>>rCIgsrL<|1bB7xI&2%ho8;wg9}RxmCK%ia=61cFKXiAdDQ*z`*V z;IS}KxA0d-k+aJ1&#nz`Qp$)A85bbPIeZWW@n%wyQ)XxH}iu41ZZns#tPf)VL^hIIC`)jLvyOz&Fy z47UMb%;3%u?pthx)qeT)^{?(N54TleXd)i(Mnco6vL?EvnUK?+wFTMI7k(z$=1r6yuN@(!@LeDd8znIJsDs`m}MA!PHYo zbPS1Rc6eTwyci!RH8v<=bbi{6CbTvOTs8` zV<5fA>=`0oB>cI|k<@Bn+NfKz{@gRGMuNpl&}exg7%)v-)T z`DqxL2rNp>I#xMK@)?teYZYGTbX>k2h1E;ZZEZeHzRs_lV>h+jpZ{h4QNZlQl?Dj_ z5RME0!0>$EZ)*ZH{4{-jPcB4taD~ux%pQcDE>oNiN!8wcBo#TDYQL zWA&5q%eO#hu0)e;pj1pnTT8{$TLEWDd0NEru0`oSz(4m{$$8Pu3Hcj-`Uok)|5+$0 zKxBQKo?_oUeElBj-_jNdI{lNQ$Jm;0@w*_)i{|YMi$5O{YMCso$@@v>0<`-l& zQ9m1A9jnt8@sc1aV~K0AWLP3pbi?r2E`5y*^i6uf-#eHsbQr%xZCP9`O63eDYN{?0 zGbR5ZT{Yty!)2{3ap66pSrFd^f9smYO!*nJ_!ldrR%(s`_POdZc?tGHJ}6VH81CQp z8u2QvW{|41#R>dG)u?;10R5mpD%$RM%QnIR2)4}ow#6eMY6?NU5udh2OsTt zvs(^1_ho6B{z6krvsMYI_X?#l`PY~cvwl!Jzt&}FV$ID$1P5J|k?wEqPxzb9*FV(_ zs#RpjJLXC|R?GUBs*^G4b41Z$j;6t%Kf_I;zzWL(IvUk9w?rrzY z+Y*MR>z`>236ODy`#L70r$=n&4q|2$GL~jUQ#cz<;X0}9Vg6uy+BwfH?0q~5I6;bQ z#oj5jD2=`vt*yK+M&7z1ZA9Jqti0;I1XAErzVpdo^~|0+bWRqGBv1(QoIfB4 zt)@g^0VhS080LQRH~>oy(rg#@NVW+A#=~xzVl=3<@Qqb;Op`<=@+yNEVmiXHC}{!} zjxf3g8GaXs5ejJ3W}Q~(xwRG+H#D8NrtBQXLvwEjPagOm`u0u95^U?C5$_-`1Kzhb zHg_R~hr)1Id!CZJg>-f;7zl#Us-j9&-7GweT21EF(*Dt^j775&$`nJWK(6Xv=bQ0V zOU++Q`h2(okz?T8VOO%CNhW@EpGQl|P*Y1ym5uVyA2b~FewHp4ARCB0Dkw?x5FmYI zO!$DrwCoXRG26gy1iVw4aFd=aqJ2kAu~|2br=M95A3cIRl>hh%QkY2SKTziJ3<;NP zuK)_dEfH+%6<}tGE%44m@O3J;Nix#G+B|_I)btjL@n8AcF&`R8C=iIj&0#O$B^fP2 zzK-Wv;p=tLH&tB1$rNH@>8)aY7J)t1`u^x`caYs{LnWo1cEsU z(i!VOb4nY|?A*dyTX$QQz(rFE@EEl#tdR5q91TA?i)p687{J|gu{1m?YxU1JVPSPs z*Hf;U+Ay(>2f4@07Iu{-hC7(2pYv2pKBqPYF zX^kNy;9J(aG>0$&GdlE0S(1t=UW5f`l5wH>@v&ZtxS~maFLClmM0_lYfaq`#tyyf> zR-7NLGjxK@x?Jm0%YHY6(G523pwN!B)pdp8H~7a!QK0w&Ry4W*f}!_QuE-hLA4}Cp zpeRuTBh8lUvC;O^OLcQMdmk-b(;Gx^J+!Smn;I7F_4p!^+4blfRKfPfv-3a|NJq%% zefv{bT~V+Yf6C(u9YF(hOGGg%)bs5jSqIK{2#_Rte*-n{Mtr_A&0;X*@Gh+mYJ-Bt z>$~=8%Y%~C6ETMB{#FkhF6^W>Qmq_S1HK$}yOYQY`KtcK&No5M&od{Jr?$5s0G{>9UY0>e zTYs{=5JpC^2iMOBMF6zu38TUAeV%K=EX#8gJlUrl5^f&q6XihAqhv|*KMMP3@CB0p zlO9sMOmx`iSuo5lBa`_J9}()eQ2aso9{8mY_1w8Jx6xX@Lj2Xy94ECTFAn7+k6ism z*2O6UTQ3jp%=&8!Gwm1OtKaQ^Z)4RN%>qI>W(AyI0E6Lq*f%3aCFF%jC+Yms0{7-o z>~CZnWQ2&tqYN2f8i5R1c0Ii0lqU*f$7(=BA`ix%?4jyBcvH^IyuX(>y9q-B`xsOW z?E`{1tHJ*%juW{hpMcrKt4{!nAzWIR8i~!%(AS%VoY9eyfHmV87=v@$k$0pJPc4-J z!C6#g?*XvCB_VT{XkMqxuH(Ell!;8NRUI*(U_(F1Z+IbdeXA1FoIGk~X$VmYHngd4 zd$6O>Ic-Ncl<9!fRGB+dzA50U7FZ=%w+OlSV6jBYO5U;*Lc)3v$5c)eRjt@hbW7Zb z^kei@S)6(XSbYZ%r7uJ4Qu}mK289KnnVTQC1WL- zG${a7R}*al0s;Q7TiUNY>en{AaLUiP*9_NAMm@}*t+3tS5m@j)>CGUCvo3oh@-TRw zM(1tCFVF0E$~L-#%X}1(7M3B2E+D_0u3JK=GbQ-XjZoY$3bD>{b#dCERaXZF%YUrL zSR2d5$MzN|TV~?ni|i*CDBCE67g_^;akY$u9&htqlRot5oKK*sraW~348{;${5?T6 zL?*?Mjj8065`nigM4;|U`VS~goFsvU%#4Jkvh4(<7CLw;v1uYB$5f|-=5NYBZ(A6p zI@tVtdWt=(n!dm!zfhj@@V8HSkLa}31nxDy7utKt3%E{UXx0T$6x3#x_Al}jzfZ!SZmqGgpW8ompXu59WsVCvy|BI^cKOz@P4%M~}Z~%bOf1XnG|Mw#A z|5f76+ zx$yw8{fG4}`HwE~QQpypN&mN1dz27DG(%=0e;Z5w999J*18~v>BXzyXB?w%zsU~)N zK-EcgGv6Ih9Fi`wNA{xS4`^+^}u)PB{eY5mBVTCt8-ROd~b#j<`Ec8ub9qPpN} zq*H%^OK6~!2bLcDQa1JnCWP!HXo@+^<)`%wP`nN}d1n3_gb zbDb5#w)`4qXzBIxEBcNj!!NtpFe%>8ZSA+fAX=Jn&mVuOgrN|8lc_W!NhTbe$S!hs z1!tb;ohWf(VDGjyC7-T^E_5=?Xk4+1URXJ9U%q6CToDT|crzd0so{#e_aee55_&W{ zG>HjjkH;KClF;@F{E~{ixFdTKXngBw$Br&5cs>K{gsU%Ims}Ch-Uc^(KJsJ1?$=bn z?AceNODuAjcE2Ed;*&&iPgyA>EKAK4*V^Byl}4oSsUuQB~Y*-Yc2q&PX>XAbW#^R!pbP9}7Rya)w5 z^ny*5ohukQYIcw&B+O7Zga|Z4A>Ir5G&X?)yRJ&}#SCiSRe6?m71NOuR{3kr@>%}m zqi_iLph6b1WK1Qho56GkQ&U=2!+|ll=yWrHqXZXY;5SnXhD$9NF&Hv#B7n<*-#y1a znGJ5DGq=PPx|;L5s(|gMMu(?5dmrb~uWHRk`4;rxGq&i8Tlq`gtxm_dUAcH-5?HvU zTWMuNa9^lfe>l_y&-e7r81uiX!Tq5iv*61CKuC4R-sg^GKT~SP4XY|z6_%mK!y@UN zIyYhuKo}^EhA)L*hM^RTIZq`_2Gp8q1NdrjVxrduG@QE+;?XWCc7X2zKM+?*T*5R% z!HfAVqc1ZN>b0$DI(E}b7><8lYyalq%tH#VB+qPFMjx~0y#R7CW`EAdJyvHu{eYue z4TnVSc1)4R+B`DZQ^5x*S~bUD(*5aLKP zw2@ry?jUtYm$4*;Y~b@8z79~`1aierb^p;g>k|Xkc<_tNNA(&3D=ns+a6zkLmR}~J zo~KmVh&&E1a!e|ch{`l!sJl+Z4mz{SL+z-bQBJ6R9AnM_!Zs^TeY20@qcMMI^;3c4 zGvfW1z`906?Ywe6kmh8;L8()cdf0hfragw)ZPAW0gFA2rr@#Xm5{hsHg_W_GwV@Q` zb78~-Ojf?eBP|=-45j5xqlKYOWG4FkOWO|`>45iISS))_fz}E+ZM~7NK~g*^%hLzP zNmA)Gbv0yDsmff@L+c2y752(50oKv9!p+K(*Q!DH(cGkwi`1`ZKo~sY4fX`0f{zHfB z$GSYKm>L1+1HbzNYz89$P8=1#mFHgR+~@clKc7VpE?b%$>;oSfMm874(Mq*1h>*yJ zP^da08N;6BL(4ki0MeX3V`Wx?qu?by&1J&or=m9mGGJ=F1`2aB5sYd0W_{o*=oTBo zH{#L3P*Asg=|d)*hqGgEB(&6!NX`92Sy8s?YQQ)q)E67IGBxgTj6VTHE}@G0)WK9q zK{^;a2Y`|IyFBsvPk^((fP>9NvLq088--cULADB0qu2;H*h`%Zdn3BYBfNu!m-);u z&Om*nwZ;}sstx*-y3yzwTtftNd0e51kGphGEl0srDvD!IMWa=1L zP4cWi!p?nY=diR!1)v?+z}L%RmHsTRqg8p-s(kuCgtw&Y?Hy-EXiv?XZt~vMb0`Wc zT8^!6lu*ZKp8fX-!BbRtL_ehif6D3I>DYDy7*T>4-8o^x!oe;7nGVIc@V7&{b2q&- zk}O@+^N`J--sOqq0NTK(P3%cS4o*N13e1R7^05!zp$D$cTMjI!hF&lenU;M#4xF?#({#;-u{$0YcX&b^NUA zZ+@AmWl5>Z63)N%s{M)i`bK~jDZTXiD`3>ma%d> zq>jHpH(L$cNVdicc{I{yiF{&n4ZwHMkuV%@G`P{CzRThlZPAng_Nj6!?#hQuBQO%# z1}ji^dvkWwx2AuM@F6U2LdMRae=ODCn7jZ?+9tZW`YG5x+=%Zaf}A8P?`9hNFU@^f zBaus4X`T?lUAkn={gQD3VMNbW$ur-O^s)kF?z2^Sjt`mPsBe$Jv*o>`woes_Z}a5nYUh%Ki_a+x@p$>HlyaMs~JN&IY#5{}8$u zwSL<}HiYg^>fonDfd0bmZqT(L8tzsFEms>e_VGdniip;5`Cl&}yIi$yu_Y&lPM~ zZKhKwEE6G7V6D5{e>{_G*aYtZlAJbt0LsReLUmBud=n>H5hvu}1S1n$Z!K-=TG(oa z(QA0x!1k@qrw28h&e@S?WVua)mZQg+)@U-I#>Dp3`#uIxpf5FSoRPbg(7}EP2dF@5 zpviP#B$Dm47d}wWZp7*YQ@(ElMJCX;SPg>A;Itp=d9DK}Gk0a&T!eT&TM_zu zfe~u5^SU_9zV1{o@+ajS3!)H$Qgsv@j*CuAYTP+`>~ya8dF64Ln}AP=DdVHvB593O z^vzfgkTN9t>qM(!{fn)G?5OLxl>3?0a>vu(DWSDir8_b`?3nRV-9j~LtLXGk569uc z4||j$5Bf6A9d@vMU@i1hQX7V1w?I-&bGor`w=^s@ z0O)5pAFcVTF6PrvXSC49wqW5M>jNuw5`1b|cTx3AiJi>RvMZ4XH;JnS>XjG&oN4DZLQ&$U{lw+NPx2n9sj|MD_ zW(9@ygm)Bs~P#nNYriY@MROvji(0EiO^@zzmpgoH;be(!Z9p>^Q^ zV+DA9dMzZ*FAJP@@wO-!wi-Do$Q<}_CBJvK*$_!yP#`7sXz){ zQUAhKngs5?nq*nf1WF&1Sfu1f40X7>-Ad?THUi}!a3M~yq#RuWqe7UHoFu5&Um*#~ zJFJS{9Vg5~K$^%`;=FW6@U($Y5r(Qtyk-uD7upbW^>fq-rEDq@Pk}W7LgAg5B6C9l z)WfBp!v0%5J~=)(-gA%3!bLzbz-|`sHXK85-f5zhl#!nxOkoZ&`Z&B|4Rz^e>AW4> z?Iyxi2v%lV+6G4jR4tDol^Rd%kTQk-c>p_h_UsSWqqs;E;|W9?8N?QI(O15g5{aLM z(QCdIb8};v@tjLRX)b@~*}(@cZj16A`yg-Vp-Aa`Vp@$cnMM8|^3QhzRw2Y9e z347#t0%;bWJ9}P$=S1JPkdXNXHhaSRq-vq@g3Nk=)zm?Dt1ocJO;H*zlTe)zX7E*7 zRVWfGK+UlMcAxE#(3i=<9+}_ghup8|Hk6eJDiEN&SlLEG(e}4+20qts_NlmgD2EU` z3prB)>y*0Ks^ns$fKj8gTSIvKgt#>vt0@e!M!&Cp6M#x!pV4R|F2>0Qnci3jzb?M=3{r%^#wlgsPAADPi>gIm}uFtC)0wr1kkcxy}jElTJ`(|3JIlBilP)4dK8e-&9 z;?l;B;cxd~lx>f>7O((`Ct*-Bo10sy;1Q*RfwDGY>1^BF9WM{gF1?QVosqaz+P$N|-M_B< z;g4VZ0d+nys@OmVn{cY|B33wnO+LTnfIJyLB3U$vbF+UcSa7Oj8FbjQgeJ8Oh2pZS zSB6vNv!fAaNv{Uok&hfZt|~q|BqJ&gqzXUK=74~0oUukw#R!Il&|}*qzwM<1^4pgP zs;D8q1%4B7Gbcd;EURuTu`P$=4zrR5S(*}q1de_A_{3oizV0>_HRPfW7?D-N+e0xu zox**eP%BvXZ!*va>C?+dje+)OxvPF-x3XP66PYCDusZ>=i^pCI>u$c7r%KS(C zU$tiX1`2SRD6a19C*~*mg$ao8o-wbNz0Z;78M=Xq5t%&rgW+k zEb+574Ar6JCH2;Aawv5z&j1G1N^VWxKC3C#9s;fUX$&Y65xgfa(hZju7lL|s6&INx zg?>gd&ZmRE&)p+Vo&vO4 z3=L-2`fJ=4hjQRcb^+59xI;M+#Mk15%3Wl4166FJ;z1_n$+P~+rf{3aa8;>mxzK&4 zW1Xpar6gGnI2Wpzi)Y8*K2A?3iq|*L8JAwk>#2j?PSw)WewhKCJ1aE>U_ym)KY(6d zZAYO;J%$v(IQnd?wS%3M>m8jm9>*eU#PwpVu2@R394T8#8?mFcKd`~guI{|iwHu8` z;SDK?a{M%i%{$h*%FtOcKDB3RXBqiFfldPDg#OI$;`s>$865U*T}1Oue(48cGD-z* z1!uZNeZ#RrYxf#wvO;WS1;29kl9ps^vwX1bW!f-mvwe_ArRlkocAYlKLvr9T5+fij z8?OPn3mEe7m~^VDP)NsX;??0~_5TlB=hUWIl&ssdZQC|0S!wf2+qP}nwry70wr#W0 z+STW-&(ptPUCo%WX1p;5I~AVwU+bZ;+4KNk#JAQm%d)gqauSW|ppBN+9P?4bZ(kXP zqOXSudtKHflLQD|3LUY;gatq^S&lv+k7`vyfXve*%!{Q)MjhA0@hM)W^FUG)kR+EH z-^EL~Tb_1-QGy3=Km<${HQ0OT8{jhAVdf?5Jiv^N+}ZcMQFqE?5$V@9H*lPLX8U>I z_%I55X!SlkuxIYLyQ}!ieP3pn00$;CsHW#E1A^6ziHozb!&fu13r~ubpMLUgb0+XF zj=@?V;wh<*zXosADl?2c95q{0gx+u@l!@0kSnQNwBXz1c0;>Z-cl?giT%CkH(gfK#D0}te9ZT>6M+ok%PsQlfl}($~_a^8|sU9JJiLSFU zvoi*lb^Rg2IU)#oT-lYWe@$+nrtffVcm~U8F28Q&L73>RoR6R9Mel!?&aP*nIqrWo z)3px>2>XARPA8N9G^*EpR!N&;vAd^gcg@GVG^rh~Hif4VD=j3PQ~E{-)-;sla(vM@V|EwT*%{Iv{lGlQ@O+%k|KHCC<%?@=Nb zaPji~Zf)Snl=>!5tM-wdJs2*O;k0hR0$ppA$f9^J071Bhd4^G7tB!F=iEw8tkV;Hb z?U-P6bMaKHzkkyJTQz4Z>_vf`2PRKs_58Hy)E1ZRTp!3XQEjzA&`A-)h4#@X+k7IE znuPn_CTU~zzp_NPu?qEp+Qw+HfM4Q_sEqUd#AIjJ0Bml81FU%rxen>DwdfvRbEX09jyer!8pHdTfAK;4A@<*?kUIN z@Zpc>dB3=Tpv9bG!VX-uDyO$xjig3)+1n)S@%y^gvTU-~bLS!h) z{D3B9wi4t?d)xme9i$__6K8%vk=B=_I&fNLpwJ>5W?U@nyU7(<#@Js3iA=Jl$xptk zb|oinMk3xUd@Zbmsq*eQu;Wl2Df|bsgP)`rqFOg1B4Y<-sUo-9Gf7U1j9Uw-maF!> zd$)j3=Qy`nLR*&oH_z^ba^YnXC&?DU?7|p&$P|5z<$8RWo}CZ1seDiM6njpmTR*`y zU8No(ihOKr(Nw$MpwCacg>{{VsVYv+%%AE*QV$0PElNvin13_^2ghRr>W$F-RW_N5 zT|tNXi5$1HB-2cYTg(j~1Idt&RSpYSn(yaSuYM5Wnoe|_Q@2DalNNi z^ba}J(Ys{+M*Ysf;C;5yQFHnAu2?}COX>Mi>;YLglKHSZmLJgAHNM$WFsgF--a(%6 zeEmU>RdpsQhSFK-+ILC0PUVR*TsWV35V2Z#uTG1yWE(*+rp%{ngM<^Vj1%_^%TRPT zfei4ps4TKz%i6TFn0kvV;mFJc@SFtNNVQ^dZ^PJ2aqzUNyquLJQ)zX=r(8-XGNcH= zAcFQZ^4Mgs@BG51F<>)q1xCRsXq-MY=ZVSvNCaB~nm)qy4|qqQ@}!kP`oi`C7m-z% z5f8=WypO#tr|m!^r_$DO-U~71Wpt}9Qspz{ z+{xcj<5&>xgJ}z5mtyO1-Ia!*Ja?U(fJ2V+fhsyB(=RuW3c`{aq#RCO!w#4wSNb@o z%ZuaHM*024%>eb($10E+u&BVwzyLEr5S9|8 zI!{ssYlAX8J}d^2R@g9xKE|7#fvB_UST+kLfm&f~!LWbNfe^khqVNt4LdOl>lpbqO zVxsv93_%N1DB`dr;}P&~Bm*d6NAi;d)23%V==mw6b%sf8#k1Fwim5(h)+as%S}zuepJXMd=k1GXO5Z%klyXdniM1r1xtX_4MGXf(`3I{l5XT5bj>XroV+J#brAx>5YdyRW zi=`D@XRkMw`8}PEhdT+GGyZ%OxjkULW6OeBY~8j#(!gmsib~RtU5UtJsS8YwMqYWt zWxu4Jp)=SW$cw7pcK`($IqFo`K8)qY20Rc!z~W39ylaRx@wd=okwyCQ)2)?AGsJk& z4h|wH&Lo`ej?Rt=kd!Ko0h?bsmNtd02BcV&NERQwD}a}zuiUC9#?cB$f9Jq^M;1}Wh{!!JN zC(e1P^d&_=}0ArUSAl^YZ`lCCWn z@@n32cEhWe`>=pY8Jk0;us~!ieuz>iqtL?>KS1OBwpQeGl26DxVaFg$v57M!vAt7i znh0|$L7(-eIkkW8V~9hcNGc_cSC4mCn>j&a6ooEbz@}yVMxk(CuUn?-5QxAIAeIde_2gkRM_a)DuK%;$2t>>SlY3l+4tIk> z(MVq_1LECoRXna{o^_)eu)$c#!dvVbOsLQ$yvYUJ<=kP)#Oo+IzXWmidRusA*}^~> zNbBnE)$Z$pVQ)_#+YJ}JGx5ZMqqg8fMkq_)JZGt%rOVvXlVm$rJ{WD5t8clF!yaYS9U zjV{Wk;0BYHJ`~?@nRupiOR^dPlXjY~t4NYF(ahoB1)aNFWsk3G78dT28N~~hzaGr0 z|F^#C>6LAgDrB9reMWtGpCP=`c&;4!yLTboaCSXQ~L|i`eHH{@u za*^>k9l+hu+mJt$JWP@>PD3;Y#VO@m^T0x(Im#1oOh`vwkOEC7Cp`Img|3}BnPw4i zugUNYx}d(1H6dwi!5<`(s{A~$ca;*Cx$iLH#6>i_FP{-hv=cuer6{~89qKpabjQmw z1rcw>BH2X$z(L@1NcRI|6L8E>Y+i7l;gPc5GKDDNsqP%&M96ztkc8CDkYAyOAH&0P zD&*M3s);Wb2_@Rm6}S%xHXBwVL^TzpOnjx(4^|wnlnISTT!=lRQX z^73@fEla-h;C{X=>18(d&`jrr9~i|cgir{wdr0pM=9jP2ioMJRuVGXw29Mdr9V*wq zWrxc8M5{M2kR~hCt zdl9d7P5vVK6SrY&7eO9dS#?r$+#VMy#|D_ZpfO)41lH??eEJ{23#nptndMI(dm!Qp zFA2-v1vawQTM;|=!?O<00@R9VUv9P}OOP+^BU~Bnj96a_@xe3(^nspYnxIB~K#J$B zsp>wAm&@?PPBtZt?7v;lfFSh0Unm9+;KJbV2fu_b&jKI$9p^%Uu4i&BEKdw^OhLi6 zm77>JduVmI&&T2$156DUUO^^dBpbQc`dKt5u1aaPycRT&cky#k!ozk&*E>UqQAWZrV3U>(EWmdW&^*3%MTqKBAdzdVdZ&F2#@Tw7U z!K{cmf#HbXH+UCU3B>d+7gt^9%ZwFZEZ|bxp8{cx0mvKxaEcZCbgTz{2g|&Twj})| zQu*I9d@lN09wcE|Z$cv2VE0V zlKgFM`nJ?2u1&M|=dA1-$948W%pR6BkJK2sThDL_w=nFHdyuLa@6W=rZ-)|n8DK@+5*X;YRWHl2aKzx5u`H(#b>uX zXmDN3=_H6^ zHiInHlc#@MQIPD#5I&~LWH^vIlRJiwJ#?{8{}Ic;JD<63>(>u;^dUHAN%yuHP4G}9 zoO!o|W?k3MRuw)bhEO+mqi%e_jC-Gd!IP+$D&{BXGgamvfKxgN5J#q~q*$w2B-z$B zws3Z_bpm~#gcS`gZei3GEBeEzBv$!{Re{PmP;f~t!4aa9M%bSiop|dI!VG?R6&VUY z^_{~0+d#4}{0`;pO#7&I1E{#hSS-IPSo9{3=H9^ki26(puNNe)-TjIm z5s9$VAFciYa4EZcw!eDyQ&(*ZLl!G@qhn|flLRGBfacfL2Sr|dKZ9|q=g+YE#MaE8JabeyC4Q><|NON8HAKR1Zr6x_-VOWESgn^{jrMhMhy zoki~$ZhmF?#u2|En}ZXDz6<1vD;GyWTGpJ85D722S=2#umD)Y{4V_I+U}Ons33#6S zCZER-b5Q$rcl7p(tDs*xhj8!aHu#wXM5U#rMtIR8YuAfOYLAa=n}0V*)fs57k^0%5 zK%{EqLJ2>aB1u=zvWrsl>sUtFa)BSZrK~CT%LIN^_ds;OLPwBHh=writnrlH*s zOMG7?L;`QZhfN0+u10X_Q<&PN>ZZcukn3A+Hoc7_e^mb?;C7ieeOufYxDMjS;FLwQ z%JqSu3-R7RB*Jx0_xVFZ!@m8jn%>ImA_J$X+`*_<3ecizB zSGA4B?gIyg8MQA#Eo-SeP3=Gw2AFPGxXWCxa9z}J1A1*-MWg=Guyc-$Cbo2*r#{G0 z_ne@vct2FkfIF*_SYT8vGRH}_ZjQSPh&Ua%BtI8JJew=P-XqcfBa0L#S2qnWo2Fn6 ztA1`&McnfU<3>FbmLybM<+QLM`^KAMun|_|kT1Kf&bi}PmVjT2TU-$JBCf2sJws97q94gNr2F|!=NbWj~ zB}bmxb*>Ews6`)wmFl(6Ju~*n0w125jxfDMo4jd@X{mm`g%gP){vLLvEGRFdViaqo zBN)1RcBM*YFQ;N0>)cN~H>IYfOv4rmb9mL7upFCeMXyubQ`$v5XF0Ark^uDbcB7M6 z{3HiUzdW&Bd<63$U=)xK5d>`=j^^pOG-p>T7_xk4iWU_DM8FK_)o>vVN z?9t&}mU!C!V~y!ep55Xnn^A*l?LQLg5AM5<5`9$Zz<2SrD6NL}NE)0Sw2{^G;G;kB zi}~D8+|{vzAicbIgl^qUzXV!QYt|J(BLK17xqb`3@5VJg(6U>+_(*X3;j*xs>vsl1 zVtRkrES3T+p``XACIVSX)oIU{!it#LSL%mdAoklHH9K7P+Gv68rmT%43RvqoEr5rU zEZ57~bh;zqjsAJcZMRWuF@x6^gepDU%d2sfY29G-m?N45jvZ{Bw2PMjp`E2feUnU= zV9YIee`ty}o8#&*qB~5WILAkI;7k2o z3M9I0ZXiV}%4GLwRnGb?1{^mV84mSYn;s5oYHe}lp47ZtxL)cqcu@44z*2;2j)-$` zA6XJ}f%p&Z1Yc^lisa}h7#D!rJ!Bv*f7h1cW_~w~#QJxWqsua4LRyqs-SpzR0R39#XlBt#2(Qb`K1dv1RKbZ!fg&Oe8$MG(S!GJ!x-Xg=4R; zsBCDr%w?0P=nRP4HyCzh)5S2|e&NoF`^56RejUI?(O&k)JtQTTrWm1UO!}t^5q}zc zCpp)YO5I80kJCistrx#rI!Ca8@fWZ}Qh%2!E|Y0}&fp7ZuiU8H<;1_E0LKJk=64{e(ba#DFa1)+ zBw>|FXJZZsJXwvGLFO!3{-8v-04Vhbi$$OYlfmqx5WW8umM#;Pkb!h#x@M%z{*q}zePL6mkF)2hY zdUu+KyBrp%8}yBW%dwId^BioP#!p(Tcddw4B!sQr51+b|;fQ$8x8~@+5h$v`MrqKdXJGJd@MeQ=Z+Gk+5f~H7gY1K3cqrpQ!2fW8nf>vgC8++^O)q^;J4X zUCIB(2+k)gahG4dcln7Dd>iY~Zw79_ZOBU#2g9=~_GxSw^5FIFO%y(3lTh#qD-IC{ zFcdeSthTl*<-Md+d!TH;!ygZ%^Maht))H8m#Bah7_ls%ElDcB+W$?{F@y;cbk!!<( z^L_T>E;lgukB~g_AGAE6p}vx7($lfN+`ba5pFhmfL@K!4PrE2)_;}r*@Sv@3?2A&efuNw{IdDG$w5w4FT=iP``vTr~KDwomA!cHhKzS}Nf04p?Xr zX&q8p@GHLOkt;Ga3qaXj5CisZ_VnK)XY}JiU7ad?VHKC>v+p=od&rucY%p_Ck~lXO zuE`m0l|BqhzB4MU>Fmr~oW}xy3nF+MmG3NCU%3>y>S~VGb<&6v2Si>vjgLkR6M4!T z1b!6|n84s!-)|$}>m2Ax9{vigx6;7Hlos6JcI$`Jy_Q9^)@1akA;6Et(E|Ut5YGGg}e=l-XI792X6SG!!rm!LD=T=W8Aqh$ zK{U@I3l7Fu^tA!YNIH?x`pL_ICD-AjaeE&L(7>|@rQg3c9Dy;&^=j0oMT#R1g=Ucj zn!U$m?XDOLSAV(`P64j z5P@Lz8m2X*Ntq|VM*qQ~+h2M3^u@#bCK^6{IHdh0Ok#5^0;YS_Pt%0WuReycpzg6m zXATU?RC)iaVP{^rp}f~Bd6K8*w!d2-ZcL>+?@wRM!Yd?2kI`Qr?XoaL2b73m$JIb! z5T%xM5xuw87-KQeQHa0Fzbi)y8oNmnQDZ}W3y=007aCFT<*l@mbRb3}8cs_|O7LJc z2Geo>uAQ850<;D_C>bC`Eik2$NPDX2w9@Kd=;_HaORoEz>@Cz(cjJiafdx6pwC9%g z`FtZyM~e|q|2EC{fqQ%d>^1>(6KA(-%qtWxoc6kwW48-!f8Pcfcn#y3PeP zgERK-;t>*7*@61E0tKwtq(Ez`jVEk$ZJ~4p zvuGEf3$37N2IdA0M|tyB4KbCoS&sPK)V|R1}Y+|rlEYP z7o>HmHFf??t1Xd>L@8XW<>@pSBGdt(Bpbmm#8Yh%geT2bDI7G7pF%Gg$w`F$qO= zhvMEP2mekcbdKs^UNboh2tPSEo{WZR$253>J|?kn&x-H%@sJ+Z(KTaye6OXk%=SxK zb!HZjKDoQS^mw>9}RHQ>&n0i77S{F5*(7f_jOUkUBCD6JwI_Q$>VN;%^dsWc~1XYS{?LkDs_x z;1Isv6xC#}k#N!+a4ZH96Sion?K+k6e&Ue>LdmiG%j{V}$Tpr`tq7xDF0mM%WXPv% znVrGQ=vz+9qCAx)F0MNh+0(5V?uA=mg-=T}OnA3#r-7E0Q*t8g9a2BD1;I#Q!?h&B)b~D|O#C&z6oJ##;BNiK65@Ah z!k^CvPH#o--cbE#{x3wru^lk|t4E|_+hJX-)$(g6qL3xi36+s(6_ar)*DW_R!CV&| z#S>W%;s~WcQNYlj)~3#yU_)?!q4*Tda4Ajn;*IcYl6G}JM|j}e2{xF@UGswo)F#7S zi5USZ0a~%U7`p%|8I}|)Xpsi_>-Z|aohQkD&^rBe z;lyvK)BeA`Ce^0%_ipJJjfv~=kxX>?*>_4P16CRcJ!1(8IP!D%d++_Huk@tmYHj)z zclwc7<+6L?T8dB=yLd&I=J|026;jfxtBJ0+6_69tjR}V8Q!fNp#(4RQ7f*;Qm+aD%x9*goBi@CfP%~sS}KZ53va@Cgm2(Y(s+WXEoztyb~wv?{_ zmXFQSm!q*{8c$eDF|VIB;t}*jqB2!Lfpyx0vw$^wc5kAHk%(HIJa9ODQPQ8mM`Y_z z@?1IuNe?vGmo-CA@buz6SK7%=1E&+$5g>XyR+~5|j9mi<#{Xt?o+awM%SuR9V32P{ z8D#N^B!skl&?T6-#~|-351>Fs81xvMRMNeVoB|VHTGi41a62h}_mU zUYLb_Vv`$!`k5!c^B^jXI>KVyK&^J@HL%SL@0iNf^{ zJ2$!kR*DehZWq8QDhhzuz_*=ojKT?D!;wo_!DHS?*I2T;BV2Wgh(rwsO$y%+@&K!D zE_6qaO?&=IMBC9GZ4dD<_g9?kUf1Te?Q$*?%{u*7huvxeS;l}nv;f-Nb%UNL@0A%w z>fi2{uP`~aRjbplze<4<=X_|k%NE;X(Z;)if6IXL{dXvKL&Be5HT($2dzBRyYv+#m zWacpbqO7m}GN;lYwY(SEsa}CD%LHX@Z`oh0=AYwjN8Mp!aCXnhutP#+3r@0VNwH!I>VzG$`tJKh??_RpCdS;F#P;xgXlkacX zHP4N7m>3$l8-5->^Qvr)Ubp@HW8VAEd5`KRtEHAzZ@v2-@XV&kL~KHX$MQ=vfxf52 zeuJ)7Q!`wdX%a7f7O7)ag7nBs1e>Cu>~vyIMfkK*=+LHU=e)Lltd-@{%5!(;u#tLf zSkz9;Zm0V`OKg#uAx&W`M<}K(dv;FSH*a>1n~iZtGRb&kW@dWb$>~|u9nh-JjltzW zRw*lQ^i&`u7LTlu%;+`4CSJL}AilKXv1%Yo6u)f>6D-V8XBaWoJLZPYn%5Qi5z{+>joE{EJEw<+M0bB;oO4$4mBXw8C~{FXQ%zmUntUW*_RK_KQ)aI^hh` zZ&5|>0`}G6=SmO}46l|$L_uiccPTT)l=P{h%CZTxiq?ZdAb+J$Ms_h0H+fP&np&mq zjqXmCfwZm7xBo-BLwZ`}PSWb7u#{6G63a$bVinqni(ishA zEyaFgsFz*PEGybX+HI+p3V1}z<>>_ysDVHwUv_G1)CrTr zPmgQ?<@bD#RetQe?S;U9_ndgx4HYL)KtPNCC@B9U<7R4N;Oye~AEE3u&X?T**R$I< zOw{7V9tWzd8Lv~7R7$MU2Fa6jGPXslRs%6}Jg!8%k!Jex_wCD0lWaB;3eRfX`sO7f zbjxnqZkth9lLsA{*PRHO*kLgMH^O~HURmEk*^}Y!O(jT1!U$UVWhYtOm*C56Sk*nBA8bNi4)7ZpVqZ-@)FC+w!V{h?ixz}X z&y2&`kNuS4PW!HSy?Qy+0S%5Ux+JtgF-|{|$+k1C>=Zu?U5-G{=U3o3&gLg=@a;?I zs#Zjcry6FBZ<~)A(dO;%$;82Ga;G_cIUHzV#R7sOZ@fqq>fkg92KR2z3wU5nnif!f z4Ec`UbkD%)Zn6sK+~EF!1(&bCpRDiJm))WWTjvSAFH{KpEi?Da0!97LW|96k9*}yc zIdQ>mpaxA9ZdhgM+D1=ZBZo(m|_cB6Z8Wj zdZ2tHT(h%QDT*Xm0_c*=bUx?H{ZwSI-XK1%!;ac`J_6{oJWAU{?hxE>(dmd8HE7o4 zSfCkYxIThOoP)zf6Vw^3w!QYznwpiUJFj4>TQNLseoQO=vQcuuiJN9h3IANYUigng zD}eb453s~)fTWgxRh`1n5aWp~az#XWtb@NiVkm3aC6X#tuKZ4JYx!8Zd@^E}A_}dm z3g(_iQ!dGN^k~Y2KeQ2E zj|<3$LxWPdC#vspOdekAEz`SV_gs7oS= zttm(SbbOYgwkpV9VI6{)9H;z1`2s^N=mrdZDR)ChHkr)Gj~%9a?}I zB2gSJh4~i`sfTUv0*1B#?wRc^TVpd0{=kJ|0M1U($T*MTJ71(hx#p~Zj>RJ7P5woPS5*ISGJD{lXtb;_T0C-oD$ zZwD=gZlZYJY!x^7zx!n0O&(kkMP1F-Cln&0W*|tVPl6L64P|v4Dr~j|dzBT{BxSWc z$;!$v6jZRGhaq>aBwMmXY2RMV&t!-X+prbzkx&X?LBRJwu*2~eL1NUBn8uaSO8BY0 z)Q!Vg)+$PcBig%E6~b&63+~S`iPMpUV$_BJeDaVyq^iCs zd0i@5!#z?Jxycw8EyqHK$TRBbS~tP#5rKHQ6@O7*xRy8#j8jb7Zt=#aM0rQ6r=whB z>*7OmNxE6t+I&Dbhg`WC-czR(FiK#&$_CMGwq!ud=qqvCtFhzglK4skK747$X~|A& zHaK;JORXl^t>1TJ3M?&Jp9{0F)DDg@SO`ye@ zq8Ol~InUTZfa&~qhey#}0UXgLTZFlF|e2S7Yba@ zX}4{;1+4B(&ofv!z~MRL4-j}}JyWrDyD;FaJC{Q@91-e+?iCv4K8|o!w1MIMgMf#o z^!?rFQmCFyes?2xeT7bXw(d1=HH4o#8|6#OTf-^rXNx+0O;d`_i4MaZwU*h=Q!;IXH2=zGp$Ghv0QsESG zlZpj$lZlK9&$Yv^YjGfNAhO4T$_rh)AsU{}Vi^=NAtW$CpeeVHM$1H<4ej2s^A8? z{?faovqF#Z-&dACnk$=(L76VrVd-9!Gqg)9g}&GnYxF4FEKgSZomQ; z*fe6Ca!P2m5=@DkTpHOKW0ajLHU!v8EZOx+Hm`&J*?Ur!TWC7@RhV#@N-pXKJ9YQ) z?zxsl$}d@}qITIO0p&Z@Xn%!csx+$*(!dcowd`1a2NT{bZu@3ADBSM$mfcW34k52# zRoDPZhItq>@6R_aSiZHtUTj%1!Yd`@*ggxj&5Zv1nzDMG+uR;RfuRE?uB3(}4ETw9 z=PZ!>qOMVD0c)&u&DV#UtQoLik*lKdQP{OZ)1rE5KWj^B0@JH}8=4*nrxWqr_?>TysH-%Vk z1!T(kovcEA?OMp%c1?*fj{2r`QkN!4=q?&DZ?eC0x-o%1Z5i5W?) zrt^`SOd|j_Fk_ji^p;pwd*e%q!8l9&HlP(AgSW903u$+ikLD-$F};oLW5q>%D?(m) zYqdv;qkFzY+_MH{)Z72?;<}Em_r&GZx|JuFU0OReG->99`(&S)R3lHG;~NNs83plx znd7*4q^LSGG;1A(>BMS9%Ry9s^XE?(@HVjre#aPqY${nW77zjdmT@Y%|1OsDE2kMI z6B8i*7e+(Y4KnHH$htzX{H-KR3nU$0wp0|cD{t-2Pbp-Hc74D>I}(g=RQ5QL6Lw`PxAui(nu74KQ$mO_lp6jBCqVKw{s*HKe#^YcBHgq+7(kCkPx(Z2!)u zgLRV*0BFvwUA@DzngW#)#gZaV!0={3G2U|I-@mOEu0ODrTk{5?Sfj9icCU%5M%=F4 z8`1A8^*_vovz?06VlS>N(ov9kE+L;`vkpEw1g)3FbghUdzr^Wd4~oY)V0zp7QdZV| zMoQ#Nd-CNjpi?Kuo;Sn`L5oek!v9nnty}S;YP}Y;P;0+zST0uHNiWJJJIk_qd)Bs^ zY`|ev+(Zr`F+qI<=Zl9oc)k1IYBK@33a2apwO;dVn?T!udyDsbS{j}20(8myyWf3s zo#}V64AGx2%M_zHx~2s~l+XN%XDelTs8ycqGHdg@kJG`T2M z%dW`EOtIj~$n{+un?^~^AE*#hdSK4z=u^2qnth;V3`#6IjO@1{XW4U(6?l`dv@@Q3 zpYfb*HitX))J<%9=bUFimhK@`ue>41hjK|PsvS&mLD?W& z*A**9ZMyQrAR)U{MX8kV;g2tCt>>DLiy39ho8FoHdZ3llM>C&P1X;pCaB=fU@JKHM zoh*(4jk~MIjXgj|N%mFXd}FYI8j~U}73xAHcrG&^V_3FtY=PiK3Em>#dDp5}KWge8 zceUiQOI$=is1xdrF$vWtjoxD%hf*n9B=5aY zvom@SCh52oc*1TCEOur#2iBlRO`WM}RGjaHps{%t1rLoWLiBjDmdUx#P4a=(`ckbK zFbCJ^w)(5tY37^Zd4|r(lN-CAVp*kN*vkRq=aTGEgPilfKwGQ?S+2K?IAJoea<82V zGb_}qh=|!_<_AV5e|wHK_L>~F(dVy>TnPDe(oNbd#aASRgo=?1#v)fOVmN`{Z{Frd zp0w?v8#At#JWbQhr$W8%uQTZ_$Fb`L`hh)JvZy-Zd!|Hd)KMmdgNqSKpA+U|SA-bH zyE^iSd?YIfy5NM#R-kvXfy>Lm`wdZ|W=k!QK||=xG>qH#?O46@yAqV+vm%34?UZcR z7+SW2PF^F$2$?SEJnj>O#bLj!8^;_}fBZRU=8G0Tq~HQjmXcdS8>EOiW?;U`HT1rW zp9>PJW)W4wr8nG==dM(v-yhMsN6umYu$L^6v6KX+w;y!jYdSltTG_)|pKP6S#tL^9 zm~UC>6FgU0*NwD+$+!Ir_o$l5PLu6_;AB_igT0_pH+GT#S+)gwd6F4atfH%G&CqNx zQl159?Vm&-raig%f+zNG`R7%%JsFf?DLNYFisERC_-9j6mg2UC62SbOU2&0pEuSxe zX8#GD@!osWsHLy%qqph+Tyf#nwZc%ZI5_Z({XsB6tq*APD4uLMIe2XcP zFcp*0E=5(34E9~tkD%qAq@22&;Lmc1YM5MRJnn^afAx>{n=q&+HRb=oP-A||JAEw6 ztNihOP3iF34{qZs=bNC1=eMb~0L5Fd=0vuvJmA}!lS1DNV3T|NzP58RtAs3!ba_lL}up$9K>NP4MzH8Gc3`)@~&8~7m=^s_Gqm|U;;eyox(iVtUwj@a_3#Idm1R9 zQxl0sqS9Yj*c|vXAcpU1YVxE0iC1N6lev(7!_q#8-_?f{b+_F2>zxkW0GHfp8Om2Q zPl8BXHCE^PgSV7;Lc)#tj^cIG`ncuTv1-LJxAJgYwSgf#m|6syhyfAnJ1Q;M_m;_Ww9$ri zy`1E%JH_x3^%d4`zKK8LNd3IiT*}vIeWK`>8}S4k(0aU3Ru#ICmO`R0owXX~%|7?$ z(o6m*n$=IAql2U8&LOilW8Fig?UBa}Pj9DTa?z=&WoE`@Z$20=r;3VHyg6ynF}tF0G3YNz81VxQR+ zgaRJ`+=sjlYJO|AE@U9Dgj*gFwWwIuo-}eG40)B0GqmRanfh#37eQ&8;_bosYs7rH zL$thMdEclB0kbA^bKJtYqk_{e2y9JDaHn2%*3o(T%#BkBjvRZgOr*q*AeC89XVTW)^j5Wv*j~rrd4aVry}89yc`y{*w`}N%Oe{AIA2x35&twT#N;DB^z-n8vwu8 zx3&#FIu7;2?{_MVH6V30^Rct1ro+ttZE(ON7a**_uuX4~IwGWoS*G-c4=W%b!KOsffEFC% zQsqwLl9jUpL|948k;xYIxd>;7f4@0n#cwBq2?WdkA2Cx@Tttv!LDWRWrGV%z-#39m z2#^ywa65P1Fk=$8i4^){pb#wRe0j_IlxAA1~|sLB(TA1>L&T7Mx<8VBEfILF^RmJ+?;o z#?`YC(K&${=qU{D7LChc0WjUiybMU+NXXgJdpJ6+dYRt$X%!4Pn@BfAkohvCmwF002iQiJxKz z7`6q-wb8Z@z%e+q%Dll^HiB<6a#hqURPl4nGl5kG>NhJnShM7Cq3Zs4gx}PA@JX<`#)9->z3_HROn1gBeC+-v?QEzQ-IqeFt{# zjLti+^M=ch>gW}n&LK%!kU9-g&GR6^rzIEC0?g<@35(Nd@>c(S2Y=t`=kN4$$dGh? zJ_&$E2*nu9VT!SVlT!;h0wJwyh)Ei2tEq3kr4&l<&L4QIh2ouAK|5@Rpfa)ItI5zC(K5no_tHt)qt5C$wGqoaSz zwFx&+SEwNQl%`(E;+YyiR;5igHvRT!T+AN%d_YOL#ISdA#=-$F^7Au>JoWQD1fmV4 zn#2|k@Hw2dK+Cd{S_`a)7=2u{uFI~xII`rz0X?@qoRXprF$BVx)#z8G7*UrghQF8qV!GihFbp<3Ofn=&<;V4i2A%(7M39v@yrD`qc=uJmYvdEkNx=ZiT z#ToMcf-P{iT<#9r<#LLJ?Up5^5vcQCcO=h?t5PQbRn`CZ|C)erN1symO`30ka1m3W zpBg;rNodkbC5%81AjCQWF#xihwgxEa&*&%Xm;Bh=6Orn9JZEKQP`hv5RbK-b>C;&lALGX2fLt7Zhhb=L_sj0#)74z7DFiS2H zni1J!d18(Y7_PIOP0T?aK4*+`-d#T=>oU2^5=^&20?xm3)(Q*d^enk2Ee_*A!SNmQ zOMyOeI`K=tgVI#oD^Cx7y(0`y!(RBNV9ktlnUG82y3|fj_9eL`vcQ}#{ODJ*f9Opg zY5+lSaJZPsGeD_RlnvoslHTV!3JUEh3McRn_b7DQcHk#MD+66}!O#O$ z&87&)6e!HPhamcqtQZf@q)daxbmpV#2-hGjL(7((B<+(Kd|27mkRU$1j?_`{h#lXv z^=LKOI5)XofaL3b1$IHZE#ZQ|Of#|1 zR{2$K1CX83>92?UR&5*wI2fBO@8|)@-KxNSI$bri4J2RK_mJeh*Az!{6A4{mA#iR8 zUS&G}!rHNnMLF>Y-1m&0YZjDjZ2fQ*ib+; z*$V%7ghqQ0k79MLcWyg;_#EcqcF1)4Lq29=O`OxB$~whRk9157|F0 zJ)X*Jj^)9l_Blg1Y~fwoo6XORT)_2*-h1d8W0hXIV8*dM{{D^HL)uO@?M@2SO)N*x zZfYxI{tCS923$E-X@R>H1R9#`7*%#c>KG=+@Txy@3*|-i5R)+^C=k~Im^V~W>13D~ zxjAkFKJJie#)5@){L(`<{@imYV<$lyxrLAE52q4zDk?jwlT`IQ-uoU`W%mWK}uJ$2QbJP~Ah2wDyal!26vGLO-ijtZs_l|qey z*!U~zkodR`Je?9tR2brKg|N#=0&y~a*;#bREJfAVLF8| zbE6ZLbNY3pl!-JH#@UM1M3dZgR^<)9(+LT~t5jC`CWpJ;e9z+V3J>U%#lxc4RlP64 z$_!ydg(12qOal^9hNQ_p%`105*EpRfmy{}ae5pi*2_*Pwz*neZ$vW|DXP2#W$XB9; zut-yGQYl}VLPMIY^NIq5wf`HockSvX&MGY0Sf}3S!$r(1V^`~P?1$j zi5E2`eIwMfty3)ls$3@p!rbG2v>9p&p{gE5fab+On0etX4LGr5NSX%7Xgj`Bl7bw1 z*m-;O!Y1KWi0wE2a05qBx2P6k6z$6oC`9%na&MV`W~X6KEr`g$oycP}2j`-|DNer~ zP0=6`&DR_EOE(XofL$WN9!_qP%r`rfWG$q*<8~sc75~Au)~kck7CHq}Ev`Yqhr~-1 zktm@xZVz~*sPx#>B#i%{kilIlV zE^usiwFQ@#V%!=P)S3*N(biy#y$w1?BlIv8Z9w>dCrS3niye~Y5t5`4WAy4pRiP`n z+aEA}rBNk7N?Vz9Z&o7mr(%zUxM*5;Gs9y{LE&G7ZYyQT& ze3O^;dLVwjPTuv4H4-ZZ2Mr zTDG2#Wzcw(E#uz~O}?#Xs}vkWWM4)ybw-1lzq?A#Ku|pk^Wa+p+tj5k zC3nfL)R_v*FD|nF!faIDoIn~<^W=}P+VAo@JE9#2I07)@4nZg-;LBB6F1g>Q*tVuY zu$X?LgL4tGuD&c3d&9Vbk%eJykJgp(dTC8I=DWep$X5)`-G4WH~MnznsH)w9sR=}?-5xrJ^W~ZoE`HLZ5h-(D8gIh2`M@` z*g5}U)_$KCO>>M>(R8 z-8|HpT)LR(|Ha9Ka~2!js3k7CrwUFxogoU`HV@7Iz{Tb5{p;w!tnLi>xMk+t&!cqbh8MmP@3Cukl4IY`0nJE9qL`S4w47noSKS zGV2!iQh%0aqEZ{=V*qx+0lBLK&Wrd^0$17YK`h77{gwH^8XsDcxjidGzr{-1rHL#4 z2*7;S-nUzK8m5i}FWui^YmK^J8B8d60d~~0g{pYoHf<<}bDE6BPAeTQYTswt-&6Az3yc zc*BFN6p$q^tzfnnR{h4ZkRwCai-m0ba44F5XM#4qbQ8JDYl^l@eySdHOr(-|^G(60 z8!oo#&098tppVs|s=#r5W8*>u7`%wZbQEvTt=V9XO__Ad(9WF`<6#BNR;u)mRp*KO z*H|KYydIPP+B^|vx}{0C>h6m5DCr-|x{TF?f=_}LLzF`>zYv+MQeCbKP~ho!)Yh*a zG@4TXWLR`aYC+;*ooZhH8V=W?=FJ^^>pQvv@|R{3SUO+*{PmZrTRRj!8K)UxDL!vq_DUF(KOEt;=PHBYM$~Q%>FU_^A8k16%jWd_ zBr}j~3|Y*WQPIaJC!_sg(0OMI(fsM>C(w)s;88j6*N`O@5mdor~Vy)~%f`NGXe)TWcUTPy#OZZV%Rk0SEk|cS@-$tdurP z@VLP$+gD-W;8mV&*JKj4vrRV)c`JToT@k$3@Jt*W9wAFo>n18!7+d{joLK2M#Zmp6 zD5||?v=!=iuj=2~CR%Q08@;N>uj5NU@Y)#NztrU&rRc?P@<(os5k$r=r2_W`Xzucw|<)N96>V2g|)lmzP|JgLh zsT(twDM@#~Et_qAIpDw#dkOg@yt8L~j1hGfy3`HKh{C!T7yDv!fl1BO*EMKoSWwB_ zP|G69JLWW>?KE z#cPqHk7^5m={@9jvbcn-d9yDury7HYvEOQBP^t|OO=yTHnlpOa7ifC%eb(HS)y;p1 zS{F+h3p1M~%V@zc#_GCh_Vw9kpA}U6ezsAxbGV%4QTigH?NmfS>iQh_r?gpm%4lEuWbln*>9T};aIJ~ z4Xz+I^Fe}bBIM54G)xZyU^lDO%M=&COcX1qMrUwX3}k`%=HMU}Gsf|;^faH|&y@1J z#8PAYe^B_oIr+BPwoH|8;k5aF_I2)goUszvY4jjjf;nXzan+KFw@D&b+)sf?E@@^l z$pL=zqi_$!iXDEn*6P~yg8U0V7vOGDB!wHeHSl%0 z^Y)K@2|FZ=Vf-x^(6TkpKNWVBmuDUbv<{Z0y8ug-L>`~sAMf>+UaFR(R1hPAu-@PG z&314(1*K9`yA1HrzvcTtMxYkiB6sb($^exb`r#V zGqIK~zAu~aAbJtlYPR+=x+o6YWTC)@j}wu2aplOsiYM)Mr6mf~N`Q%)m0m)c7~E;| z)s13O#+;jcme9#lA`HB2LJUVhWZY2L0?TP)mcD*HwQwRASiosiUL53pi32y$w;m$# z-HR75aPT}o`&eJUf)&hm^A#O-WfdZaU+}84yxyi&o+>P%aohO6{=~cl`OPqBe&(0N zu=Mc|0D7sjjj7!p%QCB{-5$r4WXKn zfJoD^F0&f0Yt9OVZn%Z5crc!e4vxWcOd@q#9t-9YGSilyV5TF62YZlE7o0$@|d?inT|-e$%> zKA&YXa#nSTp6nC_O$}})y{yaaq3LP{eo(S{-Wc#|{6Y*(XR=ppjKn6|a;hipGK6=mB4t*hoOBm)^A%l+Z8wp=?MX&%#%m^!UqmW-kADfN z-#NWye~iuDXA^s5 ztn|t0xwwd$vkUHNkinvBbrRv0_EZqd0y%+MY@CN-7F1kl9zf4=|5AEq7JfAG4u@1^_e}`N z7=k&lFMR&w8Aes-_2O9gb!9@k05V>4$xE2*(+Z^PKgz{FHs$`i29f~V%K&j4m|J>j zo!;~ws2JWfxdl<0pF8{a|7HXq)XPK?0Y1hN1z9wCg^_yk06;Ij9kY6wuC9>sYmIeQDOJ78 z?fK9w9mM~O(JY7dtZ1eceFT~}Uc%ca;JGU&?SB!bz0o}zsyW{XknPEsOB?4iMVXz> zROh4g(3EX%Pg?fG^;pt9h7=nT+;=1`&Al2m0vX$T6!9nIIl%TrNu-d#nTIOCU2Vx% zX#wKH#RUxH;$o`4L4V;J`b0seMR-c5TufbxB7>7FA}u^S=UfKL_3XhRy?nX5%r}Sf zQ0u|{X`8{7AQXcBVA5OA0C9LYx=>t#jSz4&5xt0uLizxJB&%?V#zDmgWI&;e;(>}e z26Wy1@rvj5e5Es7&}zZi*JZK-j(3Ocx~(Bw#IEc}8K**>O>u0Bk0zBLGPIUKhgAtzTcC$b31`)%fuwe=6Gk3PrEW}MzV(wci z9B+ZLq}?6_z?%|REya$+#-c+z%cX01EYiRjq)Go7G3S)4-t##_wG5Ef87 zyefk|lG_;OwA5L=Z{@Z?_fD9lLs>ldd+6y>*baK{^;izqM&N^D$dj(Ahi0On&6V%G ziDU1oUk(@gpJz1C%qJL4zij>V;kd2hxd+sHL&WhBIC4b~3GL&Sc2ZP9W?-yR_#t$R>;lp{j$E!uOQov8yZi!te@GMbb6}qijRT$B8luC@%AE57Y;r< zoVAHB+q@2flI~*a1y41*h&0I+D`OyH)lb-7;i+n@uMCF9jX8-51Rd=ctM5l(2fk$O zL2#zK`iD5|mBw8Gjosb_ht?A@lc(+Yq@{Ec@pJk}_|)61r$-LPr=WZk1)hLUX~h-L zSQ^God`b_7mTk>(y^pFUMen>jMnmENTJ9*YuFDz_%N0@4P`AkX|pzA&W4j)e{ z4&FamX=;(i`>#9{{SMihMQy0rbT%2Ih1MqJ%5Q11?Yz#lDg0}C8`Ta2J*^H>NX=!4 zonE`5Ba(>S8q{l-lZ&)A)=nNDqJHs)o<&-zn zSf9yskJeG)aU&J2hzc(u6|!aSO2OKtH*8LohF0cubuV3eU26}2xYp*bh{U02KhFD_ zhr^;NUG%9lRCl1#PVIbjrCr=k_TOD)w+>OHsdrrg_H9O??)gb$+)8y2k*~N9zPgK) zUgJgfluNsWEE&&&%?>2!vcT~CLMNGStun+JeZXZ!eZACY5J4~b^J((*xo2u}nhJ&G~3&!QBwR@K0+cs54;LCnwMiXMA4qJq@0PC&L?qmYiwy~Mlxt=^qEe5_T0;}1kkp~OOG>>%phr z<`nTF!d94oJ+PH7GgHjn8=K)0^1yaFO-r2))kmYx7?aGT4>Kk?5^**M{Y(heJ)YWT z#2n`0cE}9+Lq29M^DDUsh8dN*hRk(`95u0Ql%6HJUddbyH-CD|MhzLDZ(a(DdzX^rl(1S6Cv!OOq00_I@y9>Pse&l9v* zR5}DmU#8`ieg~zgxL2MY3ds*$xos*Wb0sD8ViGfa%oAP4PlY8xV4QVc_&NZK0b>De zx+H26c}$l~7B>Q-9} z^IqV(+mJii5nHV!OP-0^oY8vya;&EDr)Ed#?~}K311CAMW34EDKid~y?ctaQexgG_%mvKd=yv98!c{;iJ7rRqu; zC#mZ~H>EMH}zQ}<-$DfzUPk;RSk7voQtg+oV_A3xY=4?Y?YY?br26M@Ul>gP2qc+Q!>1Q z=%_{m8f;N!R`~K(bETaDEks*viua_RL0-wT3&ZS&+{3DmMMP!~>WwhM!^bolUe{{g z*kPc{Rr5sdF=PjBRSulQdEz_$nZl3oI@AM|<1j*~wXC%7bVp>@ae}fo75U?B$&EG8 zOQvnnhQ`ofcp+u9J41GMO<2aT@%C_r0r&Nqj{2`W#~$gf zYx0SS>TS+k`l6SBh8;5nCrn+FcJ#fu9IVe|V+Ypq*vj;M#8o*!|z zrS)#PvpnNgLPs5sxkn6a|eCzobo zCIR1$7DzRZ4`q<1w8u#?LeufGlNrcF?N*DS{We~)1xW*p!kh_;&i!D% zlR?k{aBE-B`UwMuEb{7y?%_K>N}eZkSAq-S}+lw`!dT@o5CzAI)aXO z^q*h&6ct-m#(=YfqsiDQ?p%U8_oFx!8N1gh2lbgYR{k*5iX ziV-S`w*7=;f=|;9hB%@9kJfO6*6>WimNh&dp(vO-eFBxK_~EaI{5IWY zt}O08c4=7n{ecN9%oAtkJ(dEsTyB0qT1HO+j6C77gvG>fzK>8P;XB3u!2HGRxKr7)Rgp%P|vm&BLG#dlLBGxaX;D&HHA=B zk0LAeDB!1K)LD9qNW^7h~@i**DvKujHDoyNC*QU47A)gBot)u;aq@gInDDOq3no^{GJaja?WmW;z`n zCOQyXtG(_Bw(la*9k!39bmG6o!*u&YUk+5Ed%r@7+H}!{KtKQWhhNpws)h)U40REU z+ue1BgMloFb=WD&Mj}uU#rx9~c>mE18XS9PKo&J@fthDqkrQP>T4D&0m=VoVsCg7< zqzB^X>*QTO|B+Z>(Kwn9olexKfhiQ8gIdeUoeWHvW%qkE)-h!FeCHrVe5#HVng%vw zT6x^jgY%^JT|FIDe$W%Us83QU#QQk;}~40kZ+V)$aKWQ+BKF%+S? zuUMYG#Qx~L62|6_N|-5KW!1Q>?Wf>!S5w%Q!&{gi%T)U!T0bqZJ%-?Vz*%xMuiR=a{}dxX>Ze^N~Xk-WLH;bWQVs$FNH@E_=s%_S*62zA|!H?FC0pH5Qx*rwFj# z9t%SVFp;h!F?kFP{CVivuX(e%Q)Z;*!cR&qo6%zN?_SlvvrYKsEKSs-SM~T+J;6|G zA_{YZxB6DVwdl)fGE)C$e<|}~Obzj=zs>7Ix;5^&N(0TCt-XBE-hQrsU*#L6Hxm_% zKZpB|r^z;bC=bniRPU?2*o-uVmv{XB!gA|}EOOrPXVZls!@j;xTdAP?ZP{$|%K_>q z4ImktO!t0DeSGibyqqa17B4dfN`Ow#eRpj)*jluN3HvWD_QmFca@Jq$*H`K*7F6mk z)UxRI^mFqGuHl92W8#QW)OsIRKNc3r$&-kE$pu_iU8bU{$B54*w#(sRai@qO0ZmDSCEh|XUu zUx-qW#5Gzl3~4fHTnj3GKieoGJzUQ660*4-Y_Nk#>uR;j&(>9X2X6O}#`Wc{TpzaC ziG^ZbddT&!W+3v8#^Q;PARD^%b`o13z|&vVbQOmp8Q2@K`h@X~eA1ULUxuma35@p5 z7)lh0w8jw{0N`QKT+dcnzV%yF8(Q*q_AmYwE3r!#hCutwbSlWS(ArV+vLCE!oXItO ziO%&kp{jSU`3sCOGY!Z$r!4eNJy#(1+h#^36kFdQPi7T(%SYd87l!{ygr{KGQH{;O z)KwoYfjf_Nzb(sG^n;fa`*h5H-vW(Kd+-?1&yEDFkBZhb(4@QwD=-<2`F8dQBnZx;2+oVptT#RherjLMtL>dZ6;| zWi0%Pu!FhNLI*BwizGPK7j6I;>A@3#p%e3dFg&e{gzY80kV&Z`^}q1)*SL0=y_6lY zNQ8*^{AmQfEYPC`xHB3rr%tR>BCDO3_#`lmzwye4$!Pp^IgCzhqtS`+66~=Kkh0ZE zdHQwxY=>mWK)9FP03^YA0O(~m0A{Rr5r~0#Uy0^f)xe1nyT#U3^$h)y7WK@%q_DD^ zEZe)g`)cyg$nH^fF7RB6YUw%@p@|j%JlVYh25JJO)2nO-&e#f9`Gy26TL|mlWDj&I zVE7k|(CV5qcsCBOyer$<6zJzd1`HU4RS#m~#YLh02sE zH z|6iX1H?BQ%)?-F1$MKyilge6_9aXZA+Le>4Q>jMO5HsS6Lyk#~q{$`U{krjD<3SEb zUMHKJST66702+-(qX9G;KV_?RSv72xG&cvC{C%HPMOG~9gGE)Y*t}eCnM%Rm`fHx^ zd6Shz9Vgdwo#8$IX~T;-KajbA>N+o*JiFEz)?56*lA5jaMrNwg+pN*)CpUaWKF9bT zzn>?IMVY6y&h=_j&2LNnS@YeL)%->l7C&e8JZTzU=~C)-mZa&#ysWa~fRstA%~I#z zG+ACdX>pn~Nh^+`Zjz#zupg>qeKTQilld)A#fw{RURGR}d&ieq-Beo?!@E!gu_cqV zO77iUf;S`7iZ{*n-~dD#*Y{ZiO}|D?iZmJ}%jIZ%aBwisle%WFO6avs&LhF&`1pXq zGa8M=zdEsIK;s6frhJhVJY{p}g>0VWY{8ReQ}H@J5GB6dvO;{Au$3vCKtnf0npL15 zPCmeBLl#EI>${CB>GNRSLad7Lu-_^fsxI6^E{`j}0A6pXJaeEJ~^>*~0HzXj8dH z1yAzvF%ya9LU9N`>YHTE*)firMyu_qTMH@n%URk`HF?h58NSp{4-$+DBa%#t-* z2Dx@qtdbN*!;GT|tiT8iU|f}9ZJAxQ2t8OOYfAjuQv=AbMq@op6Kc?VUiRyP%!5OI zr$WfAGi0P&23abZlU2*SeT2~*9cYe^vXo8P|Bl|Dz5d}(r=w$bIANpj-u(EjczFRY z=kLzmikBmJdHL?mtC#0zC-C~!-w(7DkM5EjXCT5~ht7G=f-&;1@8ZICeC;`bA@z<9kN0uH5$wKva z$LtnI2)muIJG6AFk#W}WRUM5bNxoV)+ZmWtC?aM+FwNh?1n_>9frX7mV9_yKx>>FI zvYniu=@&Wqg3ZA8z%ZLdHP085*5*xLmj(2gF+1wrSPq)5>_5$7eX`7-cz`>nlx0QK zH(~_Tmv+>u58j~bs!@*{%A{02^@VD!`Xns!x~wzQTJ`Pu^IMp5mi4%uC$a?_!H}L+ zJWnv^2nsgXi!$f2#fD*G!J0+?ZrC{$v6&|&w3l$t8L-ZVV2vdRX;C;$}jIB4^G$&rkm z#E5}HQ-b;yOB*ai_#$n^#OO587u*jkZ#%?^O z1H>9ixbDFrf+NZv9d@>u79O4s23$*3G4mlcr*_``psxFlS+kYG|6@el~aPS?_*!dt{L}KdUuv+7~}# zXjFLLIvOZ-UjKAEVW6%UlCIKN@1f2Y*3IvHI&lrC*2?a8K209j`P43(-yPY^cqeau zR(CX$*N|XfS`NsCOx6R$LUa34A*nrMRV++`bCO)81ZO5|LT<+qaO`tiC0WhcpObvU zPpb;}8eN$ZSFi{zH+jmgIqY`JyDa7D$TDVaKMf^rN^}qpZ1XzIiEK4Be0fPoFtR!muAVtGNwh%LbS|nH2gV0v!chqS#7&6{wP@@czs9Gl9cbM&FYw>X9U@q4 z@?23=lHEfBroRvGE%>As|Lne$-@*e)r9ta1Nk`a%mw9mc z?n=BZEq`6QO_868vcm3mehZ5$Wln{j+T2E-0sb939LGtqb?v5hm&W)b8l6{L=mZAa z@_Y-s^ZK?%57f%`ttpa7zK*3EYn5!#PNW;yMP>!;Ct>GnO2usCZ*0I8o?~n02)teMnO={&8%SGlxVs4@ zk?t_b7snHJd~_MFl80z4w!qPteZgMz3`RxbutO<-FC3$w((8)PlZK}=5M)xz<)q$+ zj_7i2q*`JU>2wZ>!hhMOl4(uv!a+jlot^34l0yLAoK5pc4aJeOb0*)t-Ev2-qY}-u z3vBv*0%Dr5TYkIAVI<0TB6{uM#pk2~^3dBxw*>DjDcHO3{+Knay#4?yy11RELjF>G z(CrXa>0J38#>a-DW1Gmr8FmsCD=Xtog;(FPseQ~iiuglQCG*CjXsyO}Q51fcT@>j; zW*5O$Y&(crUBqDaMSUQIgbSRwF@@KgxAcYH#a{n^yKOCcTNr)r@O!=HsqKSMDiNrE zUKV$}YM^L|c497#5w-?Q?lR}UO3TeP@F8uK$H(guv`Dz=%K{8tvRHuH)S?O6*?~>E zx-x_P>dL3`JxKbBteLJREJxLcE4C~l< z=1lr$tS(nvkDfKJMB8P3S@GpMPv)Ft7RPBQB{|TI(daSR@Vc^R#^hk#o6TgKiu2CkX2s<0AWIe4SrB_&3Go8KJhTUtro zBkpJ8W+MrXQ;iyIX9DvKwmR_ZFxcNhYQSL2l}c-{X|_Itjrkmdjif9ERIwNG#L+Q_ z`h=*FULsxfIed0UyXB3M zG)$e*VK1l?H=hoyhMTO|@Q_$Y!3+Fk*K#vq4H3t;e3=#40PM5z#C$(3QuEbrmr+%) zViy-kZX#;FoUjXAv?xC@SoVv^B&U#L4y{r&%_*kl25T`N zm>YtpEP8IR3ftrZbAv<5o*QQN{=wb`7{wr&Y~md{q4({bdSO+o6~oB_O8I zsf(79wdv`Rk4?iC4-HpP!3t!skJ*>(1>G(R@?I|20SjpniCG98B?MhvcC3gKTtI_H zXrMrd5D6!taR7c$N#IQ11eBQb`A`is&cr@`r{N~{QMw&=Vjp>j>ag62)(XgRDOw}I zb}Q1(4_2bxyi;#OII)ytN?*pGpg*>jVNk*wD}Vn|4%v_Ij%Dv(o&D+bJubm*Zo*^pii<>!T-s>?iM!?F?&_nr=;-osL`ofc{J!t*H@m^{l?a`C1bVOkA;j zxZ|Dc*v7*$853LUTAM%)*P2orDtWAyp*y+C=F{_P!^z|$U*}0t7C1rmT9tR|1lP6$ zIDCYLn6=7ov!b~PDC{lg>o%PnIEMBYZ7_3~4vl3Fl{f7U5Wsz&5RU3I=`+{)ku703 zgpdy$8M#)psd|)A90@~z8C`G!-x||QXURyMk;D~ShxS*(=k?z5w-E<{vhwY?I4{+x z5NfG=Lw=j;SBp&}nb7<(t9c_D>c%VF-$1giUTvt`B7tB9lNKjw>Wx`jt^)@7#}a^2 z5vmMo5SmU^!*E%EZJKek8iU4~eSrF?u|}#KpypRsXz#ABq+2M@`4Y6fjTrDm_XfsA zb)VHDmKx0>u*@IkT+|Tn7#QtA?=EBg?k}$}wk&++Vn;sup)p>(viacW4Mru~ZhEgw zAn=&_=e_)XY%y`md$~KqhkeJqSJsUXHh%c9jO-v_^2yI1iu0x4{1TvPH%X20KWZ?H ztgXpt+`5aXQky8T84@Bu!2q3`Uu=b@mA3Ec-G|P1o8pV7N+Erd2|dZyY{Ykmf^w z2pXuMK8i4WyYANOYx(#x&!K(8e#-*W?FT5P_(#WmBoY4t6s6;)C}-j>@+>cxq2($* z*q|TRY0~hw6$ZdG+mi%V3sJaH(&pAR@buo?G!)mNZEvVs!%5DQ>ZDw)Hw{m*qPnAk zVeH72kKZ70ucufMniWy*80W4Pwp$I-Rr$E)u%m}87_H6Oa~qM0o5 zx?D#iD|ytl@N){0#8Llh&MD|+A;n>CniW|i-Az*!PfXUrQ})f6{iphFIMDYm#TffsYFsDa*=dL{h`08i_%VN$yydu~)N-Fu!bZ<=YFCO>oq zx#DA-(bj6taYUOm{iToMqmC2?9TfCb3fn!YHIpi;O2_@FvpKB z{qsFQ?cMmG&$7-CW1-EY+@_{}<;!`T+r{kmwdX~7%E;zM*E4lML1O#Wax1{@zL@8m zl%E)(ng;l;0*x|aI!7!$F-l&$3W}6JKo5cCPN0X~{*f0e-5UpfJ;A%bZC!RPL|4Q} za@qM<^|!<&*|ypi;zQr^Nz++|_PzFxJn$+{o4m_M`>k;h6C4pewxRc~Hx0WY^sWS? z$ePcyMP}XL>TMcn0HH-%C~l7SPnHdTK)VzAl^P)TtI>Jh>=r3VU|ROg8O@r;NL*oP4@ ztb&Z->A}8yEEBg=_TfbysCvx&ey!G+t=*&de+XBWgdq=hi=v^6#5Kndq%f%oyTifn znk-EUOuI<$V@oLX4z{q92wPYr#Fin|!(huHesIj|~~ zqpNM?n7prj^gK$pkregX>5}bes}p0{+YR*4zK>OUSf*&vqAsf**$!5nke^;wtq_7f zUdd6OqGc6zdG+abFl)!(P+sM(dyd<>bmq(0*(SKWJ5V%sfR^#Us0=%R4{U(;+g!<(u0ir$;E-TLFI+~8e)z26xkuB@Jk!`^@yeF+Px z1g3k0P|Nv>7mYf)Trk~Wv0{p;)%=W|zxnPBEPG*7RDUVb#lE=Mvb0Q%G8ecdO%Kp;#`y|WJ@gkK=>puIjxGl>2qD6jV z&r%V#V9Dh|uyaZJNRI#`LvL9BcIwFpTAJtn20_!>Yv@Vup*sLQuj3vb$DK#<`jOC) z33N7C8$6Q~C&ab-@Mc|4tsLLy$+C{$zkGdme)d17v$yZwyghw)es=oaIkIRaDm%R_ zU|;#d#x#%{<$m*u?nlz~ZrFuWi*Us3Urn&|5OA`EdhgI{>+F`EIu@L&9)%!)`>G$w2AyR6Oql`I6cCtmykUX zy_3L4T{-2pi<1msvljxWL^<*@qgavD?#O^R5OKzB==wecK%ZrdqelKNE{~8SIfm|a zG0mJUZ}L~{^@UqL2oSNGFr#sZnVTX`G}!0$O~}0(m`+i^=0A!GZ?XCs#iity2Z{wmz0ak(V}ni#yKV%Hyt z4tYksh~b4TCv2Ix>v&H)HjxnJXfM8nKjiK@*3V4~R2$2lLf*caAL3q4pCkC_XTY}w zP=u^p7vW<;=CD4fJYjMB4N%7v{^O0zxpxG}+G&u{S^sgcjiz0v2fq8mTId!~!h33(T{jp z4W_>`s5kc)2J5~wA(D&d9#vOO^M>EZ#VaR(CGQgI3nHLL%zL6s0sOhPv*l82k{|YG zg>8RGz+tmBQ@?rOM12?2c5j|Y=~pQuytZBza##;~a`PrK?|>oqfZ=E4kilxx);gAn zdbsw7lM%~nYht?_(-;4m%_6N^xQ+i6a@*rU+&aD_sLB69n*Y7T{jCJNt0Xvdv+n@; zeD*Jr{06aqN4-;gZY}bcFz28>&^7wZlK#?pO>EN{(jGSw1-%<)59o66#e;IU`t`of zkI`!-|KDk=mQr_mjZ0j*o)%U3p`H-hBsyG>{%YQ;SC_+&^U-H=|HF;Q7mq<_lvzEG zI6(MKdJusVz0RVP*L=yBy;Rr3gJwU5+omV_^<`*i&XixD0Xmu|W^5brX_s{7r#6T| za>7ce70~ghS-t$~#{OAwGtwB(z3NIuUVs|gbGigIQDT^-D0zGhYwBge`kc2ls+Z7? zjwRSt%-++ETf-^8{_M)Iu|Vg8M~whEA3VT?$k{P~3zmfq=xSw&DrgK@_Z5aYxx~-J z{+#4kyE{3b4?rGX-bI4&qd&R|vo8WX!{!(lgnYc?;ia4wxFZ~pgLq&pEFN>_iO~J{ zRCZv(1P90=f+P89^PeI&;zVzXY@Lcb>SzhP=Hfm6J`^AxJ}5dTZa{eWuJrw%fbsF2si(dHW8%2duXz23ML(+F zcKycqOAA`W*U|5W_r%X;17EH4+2^AJUv2<-6F(CxK#ygn zxd;m0ofIJf7Y>h!4r1;=uKa6Q4>3?k6Yx{g)NL2sfn@lgXGXTsm|m|n~9tPp<#I$d%N)bb3} zOvSHGr3P)6v+-W=4)l|m3bM#1>Lkds9u4}6T@*fO+=#7aoDJxbRlm0lUP`D6g+&f! z6@Q!ezv_5C9z@%t0Q64dM022tBo9Wp(%i5>GRVxKwcmIH%BsN;*tcrz9ILclrTLm^ z8#*6}y0RHgp?@$>CgXs$(8OlG5deyol%3$c?DQM#K(>38f)!l&+bKHbdVmvLygA{E z&i&2=7rzk%7E4Gb8pX0|2%x{qJKtQ0FNu1s1=wlow-s`>1G>66u|T?`<-_5mUm2GT zpG%~}x$pG&L1yK-8T9WvOz}}&(evzL);1X)YU!3Ddp`~3pLC@h0D$V)V-zUD^IY0E z9eVJ&_PpF(#5J7Wd`4&NIcOdhl&Wu_`A%JPR5W`-cTYaZ?bhrXk70M7KXFK$p|kpD zm-DVhqVcYdu4>}A%irX)VBm=~{Y$jBG9oVRMp8+aT~|~jTU14$yN?`op>QOszp&y@ zjzq|eqsXzhhVQl!LPx@tHbk& zSKxSzwnO7JUJJ%Ct!xN{4&-)B+7&0Wwi;anNN$c~y%uP9z=Ysiv}vN~mi%CIf-t)a zy{L*@R^~d*sO^BKhhbmGQ#02A;EXoNFq@1dot^>m0qqf_?Al7fB@ z;NGv11jmpvsI4FVyhjxL-@2P0+ps;eXvNq2PoL7=q$ARXj2(Ryg5Ztl~z zGVk2&$2DDrWExVVj_MH}FEg)yPp5b3<8tTLlBDML^e@louFWzGeVKTW~qrYW0@UTM>$jh+8Ln@GaK z^fZH}iDl2W30=Ns#{^5h`no5aM5p8emFF=U%Jv-TYF2fv{mph4yLPE+O7~W>Ybv_$ z_QT$p9*}>Jp8Qu;W7QE?9eq7rJ{x_bClfHvNs~(jw|cC|`|4(k#c_4WK|7zD{VpZ#^SIoDqYhE{4c#pM^e?7U2O{*Y)p>bwAH!3 zX@sa_RiZ=|`liaa#xOZLfC_-(_IX=WNyV9h0;eRCN9S0uFK@a9^>bOLL_NVAlU#bV zbuwxzRrP$8SC!an)6PIWAWchr6m4eV-611ei>jz0}UdmD@Nc_hIJTu)Tmec4|j?OXyBOU zv?oJXMv17gaUB9^N&2W-u?a^lg6*7KA}%@kL_Rrr)yuLnI6mm&DKQ@-NR2_zghV_c zY^R2u0=g{-9&nU2FuE_Tl1o;ax)m~(zo_sQBb_IxvJv6OyhO4`%TGY7!knnOu`L9X z<@+f8Z~NAZaskISt-597Hbw!qk!nV{bPJfxSfHxr)B}$Q%8eG@;H+WM*B3O=!7C7{ zBb`WWch5G#45iE(kBWPx8ca#mwa9ntqM7K*1f>`niU8#`&;na=!(%Av##|{??%7{G z;Zv3DGG62Fclx0aUp%|Tm(e>3_dL(!m4FK%+_{(lJfermq)_=J=jecby}C7arC#!w z(16Au+!x4e;rdm$rMuo6*a-_kDr4OjXO?RI(C7YvIs5Bhw*LME;@_eVCnH7Z;#yIN z-t*NuHHN=Dz%R6He||-72wFLp_jrZ)!x`WsYRmY4mbj%}3<-9B-e`Sr`&Tc=>h>-X zdi8p}0QKSbFK2guAoPEM^zD1cwsr?s@8#?EFWv8+ug1pip8v&d-rwi#UFr)<-1vTe za2|aFZhCzqZ4R2{{X|59uieB0?FcW_4anPke3};mw0=K$+uZND?}zE} zj>ufiX64nlf&WJ3)rl1Ozl9zcYHe4~{4Eg-7Yh>$6$=py77G#!6br!X#qe230)|!0 zyf`4{{rR0M`W1}-ZouroY{Pp-<~%8Wm5RS5=k4rEXvm-yfxpy%z0`=meB)-VKNPnz z8Hu_wBx9{tsE(KguYIC}+b{lVe(Yp3sJ_`MVGG5R5F{rU1v{7~?T zTJn!%4awmi#@m;&%8G+^fVqm0h8tr_J!|` zVZbIy@0lMbThyF+{EkBMXu~XBH8rgfG<<0?_4wFb3)Z;oV>b+8@pM7affB0+mqcx| z)R?Xar>(R6T3MmGsxATw&<5ai!MwZ z9G{m4dSxsIqt+KoQst*?s6twhPr>h-$xuYF$NGX3Ar+=np~IsTDP|VQS|*AL-kglb zVnT*fF49v`m8b9P3Q6AZXk`FTy^K~~T^ASYAOUs-D+ZPU77G##;t67;P>o+0z}zw% zF(LL~6!9cxoDsCyKb`{N9QAT5W@@Laf0)xL6{T07F5@5#^J8 z$EP`J2CLA?wp*PJTF7WTY>ZA6EESRc^VGGM$RK}5t>DD6>&GZ0_rV;3H7zf+X2=!J zc&J+K(0e!Y*E0phG>3pVmSCcWF_nsUt)*=oB&# z(&0Rv{0$W%@ptYuAB!NS*Wxg{DMnSRM zPlChOnFhyWn_$>$5)Kof?F@lavaR*V$9jah)V zPzHrDs;Nt&fOmu`NV1%+l1lHDqFiE?g<^-6ka~u$ah=q#7wNC58!`ZDa=Z>eab*Ri zOU$^r6DwN{W{QK0*|GQD-mB-pweXZ*<{$C-I$)9!8#&@>=Or#H|79!_1H48S5@8CL@ZPe0kjzB{<*e7%xs)l1j)&ki&%T5QV(FmP1{IEy^JjEA06^ zz>$!xVwQIZFL1Uu`6}TsfM+wNcA4hk^6_r@$&6r>a@o@;|0Duf!XX@Uppwu`oJqfA z>#wVoTnJJ=oHC=^^p>8n>hA67b#7#a79e4MiZiA`3>!e6)$HpuHBIj*9)eoW=VDwp z^Vf}K%_wBbI90Z#3c8zHsvRsDz`;_@IP&U$(YEqvs|11{-6T7{hg!Rae*JlOFh$n%CUR0NT z7Ivr1r5yP=q*#zN7|C+;B@xbbwDonN3-XDLAA&@IHlM)aFky&94X8y7VQquYFpoi! zF(hVL&;zAT%389pTx$fLQOJFl$Q>>fG<5=-(~24LEOTau*Ff{B=x5T_`DZ6-H~2&z z#)&IW1z;D5w9zKBNOWle;EK=vlW0SC0ULW4m5UO&c%KV+5Y@Dca=Ad|PM*j?U5Y0! zpGtvflCx~!4t3}sHTCH2eLQxzEn3775<(F8L^Tfoyewhdw_MOGe++3>Jc$Qy4}KR# zC;PyUSbBOnGVdmzY7(N;X!d^$t+r`M;%mSznn)-)$hVuYqkm?GOr|w5^nT|zBG5V_ z8W@>USDq3~bo5iBdG+cVc2x3XWRt-Efs`w1vEK-5Xl0t2413G2IW_le zph%&D0POR5+NNHgHBXp7J!lb3sSHO|IX@+uq^wI2m*QWH;2l-Qr>}`12EZOK;>Re6 zHMwq0Kr;>eQ2^=ktszXt;;juwYwChn3RcF*A=NK;IGGDZ;EISKq;!NY8{e=Q1V_3y zWFL(8yOkd?Rn)_-P=RnPI)c6FIa6@$?anwB4KvE&mjJIC1i41dzjR8jUDaf~ee{!K zxEuzbR*$cx_6MCcaU{xzAQ~;8!_a!lEq+IGFUvrYh=^aOm_Iv=Lz&n;)O|Nyf;Lu! zjI-Gf19y+P`d8He!$@;G)dOan*t4UIzEX%LAj%xPK_f(&rQrr-^n&+;tXEEe(2>6& z7_F(G4xZ`RL}Lbcv2x8`_|3K}Rdx~=pd%s-Q7q+nGN2`VSi$%ix~tDgFlc}q4K`j+uB1;-z! zyX0z1+TR9p**7kKM2@>q&u{CiKcN6m=sE30OUP&=DyYJciF$SH+5Ng z5!12%b;)tGWI0KzrY@ncs~Mv9FCryfpIFO#D(w6~dpgv3ZEG8H%7KmHwDu!J>WQf4 z>ogNYP*`Y_PU`An4bJV`v{@GH!KvN{^AtDn6xo!uP&V-m11o32jndm>ee$=iXT&7( z;6+fpR0o!xXI^$#%2qa`s5r4s4Q5YDu>b5uu^fGql-^B-c@_$)yDJ&om=f%U2*%7gQ-;}^9>?jtBUpD8~xG-LYyHF3SY6&UIhHR8u^eS}dla#yk1U>1kR^k6C(aQ_3Y z?B7`^%TM+yWo;VZZ316=#ZhOz8^>G2!KHIG!=L+WeTSVCZFCmHvc z-JqPC{@mv`7H_oO+}A_%-meV$Un?KXSus;qt+MA43U6rL+K)^ta6-OU5GDY4`8j0a zhOX0q-s>wNr8YBHFbUwH(3Ft955M*8w;GnE*##hQ;3_w}6$@c^K7>QjQuQ>n&L`@L zS?KhXin{+O&1gP8Ml~dKSI> z!x`5&Hf>J+xx=e#8f4mpn~8f4-zGU^K^%!e$d6}*sRcy0ViHcZ@pwFEUUXXvBy=`K zL+@3#YBVm5m7a_NlrFv4yJKi^^XugYJ7o>t7WI`LB*W%KJxO_LtUJ(G>y9+o7}ODb z>$}EawQTv?XUe5Y7MWu6fIN=*%jo^6!w4uG<#TK;w;N} zEOAj=`s|B>dka=;FUF8vm23@NmS^vg5h3quPgD%sysid}+Cnz~C$z{N#JR1VT%3a# zzHv!G3n-wSoT_Ovmx)wSz)d(Dq`SWyck_jCbOwc;ISym62QT{_yxv}$II?kxwdWGhCP2qD&qH;gj$0-K%c<->FWHMFV_ z4=3&waDXP#ZH@YMH_UD>Xud%s9w;G*-V$a`Xu^g2PsH#9lFZ{n1o+p(@z$Xh4a=!F ziNZBaz7rOCrtk9=OqHPR#DP_+2-l>FR6knzCGbeVO~|v%?L7&*|7h8rSb0 zWEe|J2dR#lo7t>rjdO_NnT*E7IlTCxq7Mk0xr}ZgybC0;0v3JyCEsyKs^j13(Obtc8X7mR-p12<^vW>>PQadOe!)2ssgY&OF1=5 zw49e!<2FcBO_jG(tSm$62F}meRzbw`w3_KS!zI}C?9EgwM{277S7F9fjG)c=O@2^% zw4FUTa$VQudhY37bXPL2Rc6e__b7jNX&u%(CG%bKlVjD)Ym)K*9w z5w;~(yGwA)CoG;N)PCUdl>F0X=g_u2+Te8FV0uVf>`fLFwprh^^6qTEqa(eTn7v_;c{ae44c6tu$y{iwE zAeB3Mb?6Y8Eu0tD?LRz*pqJ5;;`M#UL8$hXnW{6aOav+6)p0idG@2!ON z2l&`D>=e6J1Dg7_FJ_>0l0Ig_&yY9L?>+w%!q;95jn%neH~T(b_^Gf?@b`$x!C{c! zt3#E~6OE3%6wW?vP)v6~Ea#iHNGFXjXFJ_>N6I>k?lt@pnqsR@NZ+m7!wZxfvE-3Z zuk?DZ@sVtkyESI6v-Rrn(%ojOzRvEtOM8gBxi(I$zzvob$k8&W_rY?fz6{)IIco%k zhRQ4!btKt9G1g3t%O!T;ftA7wAr+n!O~B>?+ynCTP);!|R>AN6b&^==%c?)Mxh>rv zaw9Aln`5_mqHRaBMApjYokrGfTlv-w|F${QeJka72>X&|*$bQyN4(Wgd{6yZB$n_w z`Na7$ioY5!&3gK08V_pFIgtWqXGvC51~RRLyQhjFdRYNY;sqpF20EfyBCW5UR$aLm z)&9^Mh5@TZIUQ?yQ)aT2FwZrh0dH@wRtywJ{0qo~0FzsIjNg+gh~^#%G@J%|1%!CV z?XFe*g+%O;!)<5zN-^Zz1_crOj@wqNTojq)rFNWVQ#;>ZEAtK00k)f4dxSV z^N<^MzCFSiaVCbjsAuXe8F~T#}mVS&AfA+H~@Dh^SmR{X0MhJT6*DL^{KECq5v9EX0(fW7l3&<8tpV74 zP|TmHP|HMQkgCSK-8SN{H|OrZm|D_Mtz&ih zt6H!nS>v|k37b}mNLufSr+(o^On-&7O@D&?HQKyD_)D?rx@lQkS-R~7&fD@?HdgwB zn>kSK@9Q1c64rRR6>DxP$Gx4RS5S7HKHE{eJNn9snoa#QQaM~{shqid?2?PBx`OY4 ztz04SWSp6!b_O?|6MCWzx0}F9EQBva4jpmF`;m`c<~tGXBJ$~KAK(c`UxD2{OKmwkSc{7ZI#Gukz*^%jE# znPmb*26^8QoK&9fj$|AB=H%P~{p-Rm94pZ@@R7F7~}&PE=BcVLX|btr{+Nw`hC)DN=b5(M#>A7Lks)Tc+B z4)v6hla*<+ir~V=ZL&hhU_c8Zr&F!=r8UDr{Hjg^S|@l}l=V}t7o+-5A}=q(?s!YD z&Wr9uu4+sIL`r75SG0870Oa+FBtp`BJI6YgO^z}V)?=qiYwOeKW78A$KJ#4*~$lV;8(!w z6E(33L2Alj0Hgpr)Khr7_KsIkQcg-5g*j#R*r{^esbSlBKSG@Az%a@%p#g_jOno`; z^0|WD{-ou4gehe)k@LplPsWf2-s6J`TwyCFhVB{4+ z-WzU1>c+nmDy94E{?bo<+_(wA03?V|I>0}h6P}E;38A@(WpQ?_NBVIKasfs{OjcO6w_yql2R$- z-uO;*IXE7fihz-or)=w5{7JH4@Y(*9$%#q1ey^T1dZO;cV-Ysp;%8>id4B*fpT{w_ zxwK|Voc>t}6FE+Ykgldzw8!E|xNT}BDgM4c_&t|c5BH8ilMI}zaE!~A z-G#owl`3P9eUZ~kjE5-zmkohHcO}4~U4c=noy%Prz+@(#ghHha=)blD?bC$j@Cr7* zEgOULuQ)o(rWZhZFzc#I5aYe3<;> zakr&wq+NUSG~(=R3|AmihfP!TZ04>ir8tq{9Zj(Pi^me91iwIs|5g#Q8pM8k0phz% zEiQern{e8n+9PdSqSA3(KXe| z$%t>9SIAeT46wPb z6CrlgiO}$nq_(E5~5&M^2f<}{gQ*)mXdDu@JQ)7q9tr-+#_lCq@U=eGK-R4+k zhH-EXf8iiOBp9Y{zb8iIjAhxibg&5CZg((FI&k%-)yPM<11vA(uh#hrs7CJc8KoA^uuda zmaU!nRbfK8bw`ehjIXxmA?qr3PT554Z)Rxz!iUMEc~nGYG~+l7y&Vu!O=iewZN+Y0 zKtaUEy*Dy)Gr}~D)$O>pA!E6rb$7{79l73iiR(n7br+l|cu}%vFM(0gMk3@x zS2(wFps;$Z$!_R@FVMlH*Ft1~TLJEjA0HNw5lr1sfLkZ3YuS(F1IEw5c5<;Xxs>!q z@~fo>-F%WT!oclC-_yF`>2KMPT*4_>I6fi>Zi+DZPtD|RhqFSo3C0EWVxrF%(E;}d zlA_F(*20niS1w>wf86(a%6YI<9lnG^53!;!RYxZ@7Wb8}xks#I`UkDy*-7EomfA*2 z5%ZjT=cVJglhst0^sV`rGd(ESKbl2Fw%*or&LDg{;N%@F`X(9NGUlPPVC?RJ%mEBmGPS51R&6;L$-sb&|kbCI$3m?emE`*t1Y%?7)V4>RVe(+cUrOn z&y;u00X6a5{i&tzj)S+{Z-ixAp*ZjYtY-7&ZYgf(MrMvxbMF5CyFtmOdB#?$8e=lX z^h3m1D%p7l^dn|Wn@ApODMR|_3RIZLljR6el59Q}=k4hFUBKc(XpEz9y6Zkt0x!}@ zLL6UAKlgOTd*_>CL7{TLaU2V%;k+z}z?NpFyfHK2gy(+7sPy{bURAdyXz)Hv2 zN_dH8IVSVYrlr=tlqMt-Q>>E-#)MFOLQIX3xJNCyJkJ@I$6R zglkMqoF@4`8Hf7Z^KqR6EV&h?rDFII(f$_j6Uuo6WbO)_LO61CAXFoX8UQYS0{Cg@ zV1lj`PC=0d`waVIYJr<)`n_UZregM3^-88-NXlKwoWa z23omA5YWf7#9gz1DB8Ays+csOZv0#3L0}Vj{Ui$PbM`jF*HinkEnY-9%b-zqJylXs zPjG$t;6*x2_1z{IVc7CPhnyykp>Mfdim zNj6g_OTE{WBg8j)>BCZ$|CVI5EdXb^GO+2#&THy?heY=p5c{mhyw4Wsau`3dvP2tK z^9LnxzQ_IB5$-qsakhwX`L|5(jyQtUrp z6?#uB@wK<&vBMY(fm-?#W-N7U8ILa`Lm=r?u+3R$z<9ZDDFtdzaqiSxU3tJK_Ii)z zsJdd8poMLUK4}RE*pMVEW7NXCDx@!9V1X7lhksaD{b_a%Ixu9UOE-CWt`?`OH)9EJ z9Xz!HG7)3n^h9o6Ol!k26&ft%{joFq!{B+wog)&&byakn7F(>;2t`{vU5y)kJ9Qqs z>VDm`F#*}5z|Gn5&F9ee!k-o&{w#o>;>A0N%XbHBg|A;=hc_WDaK3>*|I)V=VOAZA)IM?D8sx2B zxI>c?IM!pIsb^plOu?i}Ee%QqUIE<)EJITlIM{6O7#S5SudJ*PTZ-5Q*^qvqcQXgGkZKO5f{)M&WRz=XV|^K>DMnMW5L1bL<>r+mxinF`{>!c9u8|=^G%zZzHa8+tLjv_Qiql@|6yI36xtdFkG7x&Sl}2c&)f4^H z(#?|(XmM;v9;Cdmj6-pam7XmTVd}~3qxAmOwOE>QDVuxUT2tc6xO?~@TkN*7tzHiW zZ29I2IC)9Q%{U&?r>6ys7EO)A&Adn38As%V)@_Z>S#2KvFS72b62q0EcQs^=vLbc5 z(j0k(6J)iuUK)pAf-cAxP+|p_sbAD7S&d?E@q0Ys)VDQJzT-6Aj}@uobnjYC6gnGGnieZ zLVcf|E$?jdFf8Y!L2Z|j0m^Ws7`7bN)nGFCpB6@Ik{dD96laR#papL(U|dOHERV=ab>uanivC=LeKu| zM_TDF%`OzN2b10BNP$}?OM)w+kLSb$&`@7W9cKLyPN7Jws0hEQbt&a&Sd2fGl=rd~ zrXpY_=`^Y5s1f?$pCT&3(|0=1mIw8exB7^4B&_#&HY6QgdSu@~agdZSz`OiA*~bq3 zYg^^&;<>y?;h-^r>TCbHll9COIgTqybIgaYZwaMGSeZd@Dc;~%YGwZZLECOOJ{1Ga znCo-HgghG z(O=$<$#(Vwo%<%pcaL%o=6^fy56ikh6Y_4*1o1+{Dss+V5yf)Z8mzyZxUn3WKfdF^ zvfcrT=Eu%n`SWFi)1J5EDzqcs-LVr<caTo6 zD?iFfkPF*IG4&YDMn)$GDAYRH-FHS;Mh;DhuI%fTy1C)aU#ZC@5-TeH z?A_Js3PzZN3cg^mef_35zj|q-qUOe?$G+E#T2k02uqCgLiKkm>)gQKE(M;+l;AF=9 z3(=26Gxw*OAfxpWg_9vFjeftombgaRp&W(L&@oC$>>6QKjLfFZ=>i|`JkAQh9MdyS zvQYa-zAD-$@P7Yl4rWmBLCJDvKwi`oI`Ewfvi{t`J8&s7R36Uj1e8Q9(A({y=MM=} zW~Uilo)9F9ze0N=@B7Bn{2wUqgy`%?kwY$#oU7W80XUB@ zT{^H>oz*emyMXBJb(Hg^qR zPQHPyjFSkJBH1Q99f~Dc`(kSvU6%_CQY(8)Q!_?eTXZQen_D&{%M$6|qAX)w z531=W@ldo2iZ6I(&E@HI<+_>+xD`E)pl1NI{&{AjLq!F0uCce}rI;Twc zoCfes4EjEZCfOl(0v?Q6PoSsiB$|m0sm*+?U_zG^xk)xXZ#N3y--C9%mte1}0XNVd zeTcsZlP|z2LbaK$r`8)IU&m#MaUQlUVjBgF$SB)F8l_z`8I;&L+~s<+M^`!&k#P)E zV(SRGVlyypE#zleE3i6wq#D<+lAaI%1XuqI85D`B-<>Pj`rGMw05xy5hr z)|kLyYqlj7(l#%QS}uD9IWv%$$R9EWbjw6|<<^*pJC{x&8<36eaWmqtc~q~isa>ie z#4K&=TcbYgWM4#TYhb*|>u|dhgGFs7cbq}mcHlO5us-XH?*+$;h$AhKFc9rw+@&Zd zs@raW?1&I3zB35;XoD1xubg3A1+Bq&__E}C#(S)?7tAU4q&}r~lTaC(T>@ynkv=0j zh6{UESa)xZ_(r*c!O1}o6GnS9A9N@%i{&C9ypK9D80EU}qp=MIaDaG2DM!w!=s$?; z$Fn1O&FS2)f+v0?DdxgfP2X?vZUds(6D5mMfFIbYv^WKah-Oor_m#JroVk1X+4*iw zMuD5Rhkl|zH;mtTR_Zw{sE8^#u}}}!aFS6#I2@@faI>4=T7sEz3Q!AAeRvJz z0T6}oBZ+_P_afjYmpNCYW3b#!Tcmos^?fZJF6z)2P5sqbxPt94t$03-Oyzkf{v0V5=d7)ztJQ>2Ww>FRe$D)P|lONYbJ(}v+lWc>hO z@~`4+E;5{V@?ZSE@9QzcYqz0>WAXLa5dX)JCSq1@L?;1$t*uRtCtKYe8xSRh6;0X9nn}53qz4go33=N zH&1oXSkRdmuT58_z-SkBF8- zdTKZw&Ug0!w%(+B9rlLt_xdBv&9?BcCj9tMeDhw7cQC`_#D?JfesB8B{BvBm{M~mx zaQENA@1_lIs}nTXuiC~mgWiGD0cZW`&j9yfb-xow^*tzGgt6Zz_W+gf}#57O2& z+~sQgO?n5;qf60MvXQ;@#)x(sVxCT8%9e9A^t8zSV8&#WcP!w>IwuYdmly$Cfm^O~ zh0tK57`gxui7+HNe%qSe6P^E9cr7vgwd{I!ZVxqB>N(xspa) zlj#WKavFgb4KUGL7BJAHJ=B<7J*S#c1>u&Es+PYnXDZe>BPZT&zOBa*0h6@Okse|H zm0o~fxQ0Dc;=@TN;QeE!Z8Tj@=fPlXRA)#ljzS~d7BRuGSlJLF9=4*ah%dFCsM;dw zI%3^SMxC;5stHv>Tp`dQgt5m#C@W3}~#T0>Ynlgtbka+Dg!?X<8ga6IAJmJYgjZF2}|3@i@ z29#CEb`#<_Me_d=9f zifY@DrOLIwr*dh!{^UvP);5HMQe7wIItqz7{N;@Ac}U1m3%cO7U(ZRaw6So9=9IC) zhpaWFd_TJxd+QNnWRQdQ<&2%jsg`}*ElP>2NS_*oSX_Hf23FU9IWDbMlu$TlXQad4D_+$^9Z0BLa-adCfGr!2O?CWe(! zS0c_Lrp&;weg}zp@PIi2=mnE;cK`C^4!l_#F-d?u_#DQo?4KPLqgDRCnk^yF4U#zm zPz1jgQ9<27mvmTX)Ik`_ZYv#Hpyn933qq4V;$24!_yPlwhllQ{BqV6l30|2;Szww# z+#zd;0*A1)KC<2oGAI1`oz-LmW0#PMKuCbjppgbqmyS3XqJ-X%Ps~tSfI~xjBFK~w z;(A z;0K5D4dQT{2xVn(`y5!OqYYTIWEAEh!PP12!SCGBq9uH*)C8K^~shLvclazM(4nv{^{-_*3$vD(*zUT46 z@!8d-mm^0;m1#G&c@@%&JHQ(8QjZJgIyZa0Oy%(FaTHoMK&!YsRi zKluOimT9O^?Kg)60H8qu0ATrlmqhcsZX%782 z_$PtyzD3@XZZ5pH`4q;!s}tiIid%XHW|nie!^fPWYq?VT?tS%6_~SZ=!~R^MP6IhNKB>b|-@f(Mvyt$Z`etTdAD$?Dc<@>gWLtjOOw ze5qZDjA8aIG=FEH&s5R|;A(sNHTV8NS75%^p*`up?S|mSL$5@3A-u$m;Y$z}!xh#X zhW)nm`BQg5cvvq}AXi5$5khFL7eXsV2=1a=VFY6B-6wBuC^fE(={aLlc(5^DJSH>! zrjC8eGqvvaSUv({|K@ZQcfQyv(1}^b#nNFfphh8+uuyJP!jWy7BOHf0}d&LKtNJk~>#Wnv1puR(N8D^|B=PTHql-bh^;^ zQs0(iFHk2w3-T26ne=RVvJ-m4Bx%9?{unU7__(_+f<|-oq7QrDUVR_Lxt{i@Zrs+P zX{aMsVSLTGQT`WU=MbJrpl#9Ewr$(CZQHhO+twf3b_X4H?4)Dcxc!FjPVS)2poTT5 z?_lq>FXG0fzZiy{hWD+$XrkUJb6S5w1>Q%d^47a9A``A8FY;X&vr5C59Z{*g1PB(m zrM&dRZ^*+QNwN6C-2T#5k}yQ~hVyvW6Q;01{*Vy0AF*z`oVDsAlwV})%3!vdSBxl% zY-t*;bKnDHC+us1L3M_5qOOj;*YxJ3n`Q>VjO)6->`5Mt*u+>GVY_f{&4`PaJnAW9 z`v6L$lG_qXj)Op1nJO7MAlLS9u1?npmm=-GBvS4%ilKNtGX6YaT{z!5$sLNalw@r^ z{y6h}$hwBqajdhf47=Sw-=erE1V;-&qTU$Xg&HDkP^P==9MlTHz?=QSHa{Jo3c@oG z_a@j# zT_=)ox}o01id}8E&Gu7tjHltzC}SgKI76r&g*ouFMLim9KpD=c;Pt5RW;~nGE1@3^VyJ!G#o|AwZ zA{1I-)*H`Mg&XpL3Eu_%;yWL7;T+XEl0GEaEZ zD*a8tQSK^`6FM;=+7VqK_UoBPHS#%Yk!QAYrfEmTLOWL$fOVPk za6MctSCsc3>Mf24gT21gZeT4rBQ8xyx4k%$lGQiP9lR!_1ZHF|Y&cMPgGknp0DK}WJmA@Iw_2f2UUj`~OpZQDEd=L-{57ds(zwKtiH|&0kjn!s; z%h6Pk7Dcbp$>vee+g7B1!bKz^MHMl>K_vgQ1XewY1DG0ODj<}qGt!snZLzwW5?AG? zhYK?6)aYTofY|7chEp{vR*L%zYcNLUU`gjuYplS!)hW+a@P8w<0M;;g&-l0Acknj5 zS$a*V&un9=EE@E5-iOUK7B%Tw&N+fybEV<$z62`n&QNh<1`-c)N$ORt{$Nm>QnGF( zS@FK!(hfVI8y)k%>!K0E7JtZww-0A0_<i8H+}N9dExn#jqX~o+v-&4Yx9Qn zPHQcBC~sMEE=WZT6I33GaIf>1RvYQK>WV<=Y)vI@(zPQod1rs=VHQKcLiJxCdEF_I zl=xF8zZv`Y_I(qt_^I@O%IjYLDz^dV53xH9>Om4e#IehOi`EF!|->R!(=P zd`G{jrWacb95|_}Nyz8%HZs^K5nAh4vem>sf2e|QpO^_1ZDDlA`Ywa++Q(| zl=vN2vg)+T{lPx`g-(T8G*AH23aDs>45QMv$(F?N#SHe>>jWt#bB9z|Q)9xvL=u0( z#cLd2|KQq6b{WoMY!xiR9u~OASRV*L8C*vPm|=-MDzkh)?8T0Oa@X)-(>h8X9R$EY zwWryqZ==-Etc=ax)0J$BOJ%}NGk4mP&lyM!M)|u*;HV!UH}YS}V82K^&FTfIo_;T@ zN-gG}Sl%7TVT@2YX2MgpU3eI8X+zhEOgs6Cb4-6|Drg7s7BPt_^0 zfh{^miOLB<6C+4Vxd5mA{M2*IZDzdZ~v71lK!P zcfPr$-xC)H2hcvZAp>W9&83^kWF4f?ziBni-qmSfzN*pF1KMIF2C8IY0-jvl_c@oT?BdkNsT3X2ILB%K9=wT}g9QAEpNy}X zBA#N!`GXrt8@V4~V_LyND(g|rX-l}CPP^Kx-OQ5lmS&dyT-;Xryx(T)**e8MF{8sh zF|+?JzWku7y3tTE{)z+B_d!tKROSK~V3aF@zI}a9mfyjxYdjJDd}?%iLon zuN_&Cve)O_S2^Fw$GgBqR6`1G&f@e;G3lnQGn}Vf9!u+D~5K@E%O@kEwW=Yu~38bkp(^@dunU zm)p9rDzUVX`kuL`Z|~V;oMRj0oY2?&VS?MGaNORjDo~U6#wqIth~^k16R}gxbXMes zK!Zr?&Gl zT>}>IZ{)SQGxIYV%XJBzSZz~nRSg`p>tzeRLq3J6R+nno(js_#B75D1i5O3?TTl*ZUoWy-dS?Z<--FU4tl4Zjs8hs1V}1y1mTOaba1;!zv)ediEC~ZH zL>+l#T~QT;U#CdfH8vadbGbbuy>}|8?Sv>nQy7_8RnVi3RPEYE7mxbKtaG++3+)V^y>(Gbj!K>TpUJ9_8f#C z2;aONFzohA3~6~17k-mA`8NY9!=6S?Aux)W7@G`qh4wvRb5>^8frt9#@V=#E4D-Li zSTTCfRyZ$TIXmpz*IX_a_4>}neO7IHa+UmVdyO48ww@Myk5-nWmxS((LGa*USNQeZ)1*tclXW4ys^N8R3xC)7d-0ukoDe8@2`s<7lIs<(368EYT= zo8W#B$?y0pXjXGcNvVK?^t&kjaB>_(v;YT7m!j;VPKTQrl8Ke=Qintu(( zSu@dLrEK({RixH}=*2DM8@~E`8MUj^GxDw$S>hgnCy>$VOcoaL0K#tDVI|UHu|Y{P z&S<}EU7oEMLG!@JC4lD`KM9( zp&xIo>I5nJp;OGSX2)agtO9|u4C~N^VwDX#i~p%-0M3Ze%y~{_Fy`S1ol`fW){d^{ zd6E}g9elCNXW;=l8gUZ}>pAH^ zq_v1S4^VZuT(h=fCqc8eFrQm@x9!R(Pn<6kOd{h$^pujEFs&ERi0Dze3b4fMz2TeO zO`-&Uy9QA8D+okgfDxfpHApDsZ=`oqmrUhk>SzF+qX*fN>JcM$VQUe~*oAL>#XYvR z(&<*0^P4NtQ^1soEi_SB)B7stjHQ<>I{IiIJvs2Rw37Hh)BcOdb+lA=h^mJ&D*th* zi+qU9d_ZjF|EjXuc$lNn9P~}wg6{6saFW3StN>mJjtF_KW)PbRkLQ9JP zZz}aTI%Zq0zM)bWLARr`QRg#zX$4QoG8ipmy{kX=K@B$+fhHqNhu^K`rCMFiktHJI zis$(PqJ}WJ>8z8Nvu9qBy2l=t(LR}=6lZ^W3k&sQlwqH`eZWG6p#ejFr?f?%op6{UIsy$Ok1@P%P03ah_*QwL2 zQ=^pEAOGC;9(TtvHk-D>NFAf8U@Q=u3_U(qgx}Lf=SoRRABP<;*!UvSvwb2tZm4jb zNz8`?hHW#<>z$>o zh4fsbQS7ol)6c=yQs97Z-z{ zla>Guu zRNGaO%gm#Iaacjp{nfUb$uXgB8Jy8qVKjUY@*i>FsdNgXU{?<8v|HWcXvz0Zcr*wJ z%v5ubnJ^BnrUHU;Xlu8oY+GfNfYqpbA3q_DXN2bnXuM5-DMh`Bw6BAE4kbQ9`l>u^ z6uK2Zj>B>vz@m?U|2Xk|GHJX$HOL~?Ba+ig;az=V57zMa#vZ+?(5>zw!tBK4D24>; zgc|6N_Ew*gwR0j+S2xZ!Ol*DLC}vK~@avM-w=0fd+fn>0RC$Whvs7(vZ*=3I z18i|8(2%-?z}Y5fJNA%tve1~ZGr|6>PzwIe02?!&=32^jD)8U7Po7or)cM_3*F27F zA_-HLqXTk31TcitC@ecCd&s?SsBcxA9CN~O7l=hxI&PWhM_&xbMCNL6c!Xw53h{+xRlbEE|LXHi z;1&29DRX8V>LirKdihS_eGM@{g3a(GvM#TvS&rDQ)%ao4D|I=!W#TVmiH-yIf6Q`5UKhgzf&2oGOc)F0Q%ksHK&k9m} zsBpWEtP&+PJBw`H46OQ+h{WDGkDLG*aL|)Hi9y1^= zB$<6N#?B@*Fvl)ozpz*ZzSJL?&l=G%j2eZclQG2lOe5#=N4rxZ5Uh80i2a>(&z+!t zffTp_w!NKW{0n8TUdr<@Kd2vSSkO4+69VDQ^rqD|3;;S13|j^zlo-o%n?p`PKsXva z$iIu@MC?>Q5gF8jBu38`V^M`K3Ory+UXxir=wIi{= ziTBvTm)j98tgA%REnsx!1t#M--dPiPu%m_{?hA*H)K0;KG>z_YypP0_f=K>PrzR4c zP`EAY0ZWh%pfwW$PT-pQ^};-CdXUheE(LTHY?X0&r)?no*mlBs54| z#+d3aT^c3#J$W|9(IAvO+zg)HD6#w>WRam+i_+^9=1l!iXdB7(HfKN06cB3fywu;o zzV=qTdsEbGMvbW{Nc7Nzn&YE!3&VBn+cMSdAab_lMEAhZI#=W!B||dqG-pC~g|b3{ zQU0*aLV+p?v<@H7YlA4dqkP8k%ZJoS%U$fxR8T3PYveYG`0}kyp}}jYnEqHaR%;n- zA`W7QKR(VQrG>&_uICS?*Z&2 zNTMiX-K7FChfhOa0z5id(CdGB%YyjF5kb#+BQ~0p(3FFU)qQh}OaSdJ4l<2REFT!r zYO$kLi!fpwY5uqrqHt7;{)Q)M)?_z79@=prw?$>Tc`3Y-5Fc%jbA<>z?z=_+g=mHJ z_k0j(AqWP2Vg~-IP#WLDFuj!z)Sfpt6VB)sZ-b4{IRVbKUn(Mm4S53=n0KIaaUmFH z?F5;mc29el;JW%6V4B?0eqRQtfVSnR zw;1Q=`eitL(Ye&Quy{El>IDs3g(`$c0(fxcIvi$Pp^X(B@0aV7@nv@1S}gT!(wlAg?PUo>xk+dV9oH zZhB67w|3&|$;%MV#ql1_Yo)`^@&duBwbknLy@8Fc1tu{gxHmOppv1wSgQE!utwBC7 z+ux$PL?O=QWo3`h~kf;(T{&|n+ONv z6FezH%jDJO1Y3a*p!m!|}BQ}*G3TJ=uGj5Sizl17POUJEG;g2ayE)Z@M-Rpb=s zk%`8f!GLH&UVEmykGdt}bTSb>%T0&%VWwJjfO$T1MFaoJ!DsmR>$V^w(=v?}E*te}bIb|+12#e8g!iS<8-`Id1mP#^)cEU39GBa~Novw>k!CvtdN^SO8)}R*33Ln( zq~~61t4t1Qj{Q}fPO5DkBXFN;D8=aoJy&)o?lEzV#&AR=AVyF3OKzsB8z`TC{M&%A z*ZT?TEr6qYRBjf)k6#Pn6ZxgpDJOthi(d426(0}Vt1onXM!|FlXB34=^hPCe4?QeI zlu1pM51iIt7FxzZ{10?X^#`aN5Kd`-@+zPdL(6rXi`0_-gGPoK++scb?*>H6QYUag zgK54s4V+X`lzJ&{1b6q-eX#Y$kyNIH{?OV>mkOG@z!+@yjQvJ3D2baTsp2nPAHeKI zvVfZH4|AUBb0+nrqV*G59DsiT(2!PI>72;-SZ#} zlWc^vhjV&bZiPrzU&BdwW~ObD{((!G!|#<2gOrRJ3~!XSg|Ug5CBa-x0n>#7;e$sk zep9aSOws(8Wl^N+%Vwn%&VKrU@@|^+67)OwI2q@{Tg(r}DL7<^#F6Uxh1`U%DqAcH z2bx|?ce=p@);h8fgypu-Q{fue$d@ZFEVU{&8TF!#u7!|*U5Kjg$4AWF>C2#S=NCt0 zzYs<|tj@8LC-6Wq;#q5JiHCVCpY*DVMm0c^&h1@<(iJaKVeJHo<#drxL51C*p3#fsa?V5~2Hp+Zj8Nv3L8mN$b!mZWH2ga|<6nr0C}@7;kTvXWgPzn< z(I=?%Eo_)<=TzCQ3TM`hf30aCW(p1m3OiFJ6|-Y#m;YoQ2aK|MbTKYXI({9+&=|66 z>hCa{lyxO}m#~|Wx>G%Q73ob0F=>;>bTTJ=t)2*U@>awS6{3q(_V3~jPTdn+uGoJ> zxv3P-)K^S_zdDJus%f>q3^6e3*S@t#VbbKKZ$D!I$cc&ld0q`L*h1jgLdF2@pY1T? z^YenK*}*=V>pu)WG*eXMS}@KBI7<<}X6hTHHOP($TW!LdK1&;$FT3{V&F>bZYzyG{ zyOs7Sp0_1e1s(SLcrlyM3+-YiIM?RR99QH)s<<`gbb<)kSEm$5*`efxR57`b zFLP@kJfDOD@s-&wYc^5zZ8;bHxK#Jr zFqz&ki9J5jjmeHrI{9XIzxcVG1Sd;h!z${cg|xbfk=1`o8lG&-R1UIHh>yPSrc3oy zl|;CLds02J=klC^xfi3#jff0Ps~clO_INF}h9jPw#zX;&<|EtX{R_h8+Dh9K(UT^02G8;UstsVQA z5Nu)Hk`6~1-?cQ)JY~FvYo0H2=%*0dp!Vo~*i-z^{#ky46s^k;S`$bPK_QgXBO>Tn zADLQKbU{K3YW270po9^5r?g#bznI^^`jaj61jiVRS16f_F}{pI+Qf6dETIZr#du3> zszaPY=EBcu3U;d960X48{{04#ZdrjF6(*gH#NGM2#RR|2RVD$@PJ+B;zsG0T_0sb( zsxR3z&2_8lrOz)Bf*de{xK?LC2alkzI`s8{OcR2bC99wLfbTrRr!M(`nXC6>fl6L? z5W{cKPy0ala3P5leE&(!H4la2rhZms^<6LUfLwVXej6qLvsORLI|Pv~b3)pI0_V0W zW5+Bco%uNs-tJg&>WxAYrx8YFK(9GN^wEX%AYJEcLf?M8UxG*Ux0*i`#Te;;2ec13 zZ&52k`8%!Ejk4e6W_{MYo^uiCl3a2!tp|ET>9hIGa#w>9z)BR&9Cho)d&E#OrkC(h zp3Faeb@yS$J!onXjytJNOe?!L6%HO!{`G=QS40#M*K4|enjHDSEZQ{r;R3EI5xAgd z1UP@$=M>`O^@36X))YD&?ccj=u$bz@O%^%btEWdLSb!bkiLs;MqxKs}$V2~&ZznD6^H{QcQHCXc!q$K-F7*&2FRKTpI8K1@ zPgi>8isW7dJ4%H7E8Efa*W?>gO_b-O&PgB;Hx<+-+>X2gokfY3Eo2gwT|^HZ&2xc3 zRt=7r_++CvkX~B(YThyY>NDM_`egy(i-l|e)xDH>dp^!P-}`S+fE2qL4SyM-i1D33 z9*)~H_8Fx=6|u!8TljQomc8*h-63H`kT=Vl0;IVml~IA5z|ul<3mOaJ1MCViOd6%C z8YfJmWWkbNq?%V)n_drr&qgh3COHcthNrzMTK{>Y?b$?Su>ejs+kJLG>kTV>^WOsF zRiWyz6pF?_5?CJef3f)(Q9R^H(^X>BWX|}9>(8Q%R|AAc)36YFo>?6t{K~zJ+SuM? zPI8H~Lw;B5_~7#ER`mKg`f2(&5Ny4MsAlUJ{f@vw+Y1|HiWjp2w?4S@E=@Mo~`5W7Jb9*ve7qILO8VDnLf0;}M6WJ`;NH$7ZE@cDJ8@rrEzLS+b=yT%b<#F~Ueh)T4=h59N)yghxQw9m%{*q{6 zzTynVe3LiS%1ZKYnzeuie|t&4vMFX~`$|BH>@{;kSrrv^mofoDQiSmA-kh88d)Nn^ zbyPr4u4}O3y$jW!#lWj|GzcnP*&+9H?YAz>Zg7}tl~e43mFc3*hx#piS9!;{D6vvq zxPl(-hECE*^KojdjZT1*+hvtqHq?;*AzpMsLaLA(#rE(9meg+H1I21gM!$ll6jyhu z0fwwFernm-+r&z<+u-NIUdvqMg#A24p}3hO-XW%O3d*CzG9C&3b20a81SvEp~51orsFG==AwacWi*l z3AWEh2~Trv6XO^%Kgouy>Q;FLp{BwJHf4T!p-!tN(16NTA=>lIoq7e&cp zC=WOHWElH<_4d}Y`pYB*fcP-F4MipOBLbY>3ZcZkcF0>8*`<~(Vd$I@FkUx41;D%YU>;79{jV(m(v|Y7hqnJ_e?Y1Zi z2@|dp)RRJw1rIXv0LcD#9hz9$ktBiF-%zWGtDA){&n!L3k|CQJ;pc%A40bdA#Dh42BFV&ChXV=SUnjioC(jvZwHX!xiHtSa3!&c)F>omI5%Rf z!(paLRlm@BBvggur1@;=;dd?f-?QORf^cbZ$1(Hn`=RwJF@%E7 zE)3AeruPa*l{^7R(mN-4S85}dJ${yroUa`*p+|V)-TVB!^=eN0XF`d4Qng=&G$KE= z+1wins7_>jLL?Dh!d7{>L;gzm%-5t*nX*Bz*wh%1k0VW3+c3`fHinwmM?4_<r4tzTO!3`zvQJR%B$tcMh-pLVa?#DubS22Gw%{<6K8S?X9TO=z% ziFi7?la)>zloIq?rclCwX=bf~u;oCkQHxee3x4g(Cyj133{* zBVE5hpq}H#GFfzTaiff9BXou_A<+A}c|p)xn<3Tm)F1(b*!>*2T0kG7?^3Q+!b8JG zLCYe9tpStN7FHOg&eoFG-dNaKw_0>e#YRcbQSwr~|A>iUsi1NM4qjeL@mgJwIE6}h zb%i7*>9hTDwuxT^6~bsWdm;+`g5BqPeEIdtNGHIw<5)5^_S z&IW?Zs-&7uK_4JQ_GP=8p#;s^=K_G@=;4yMhqzhfb=`lnXJq?B{0gG(V7Kg-U6reNI-NHNo zJvJ2~?)#>v2;+m$4{=IG@V+8Opve4%9k&$}Hk+zE;-xGi%z`r_j86n6OazH;@sRTS zt*KM-kRyrt`oQxS6GMFNd5S2v9NrSy)cOQ}eDPMx#jY%{EjNeJt(?kWVuEPIr}-F^ z)+ZDoJ2Mnnh{qcP`fWR`3DIOPuY~rx-&fPv(4~{EJttiAL~uVW!1VcpBZVGl&*Y9K_FF6~ zXE5kn+t7@${6>->O;YwMNz z57-vp1SLnxHD2e)bpsD+N(&h`1J)+`ow1r;VQ)>Xc5P3okuAE?xyh)K;dA&T!C z;B4c-IB0^{(Qir$(BlM-taBgoRPULv3d$yS*V35pT~ z3vg+sg80_s@z67!F2#J_tM9;J*8#T!$sisW1bk?xVqro4u}F=Ezx-3GekW@vOBJL|z!p@$BXb94ST@`&IUXaM2(&7bd{0b8?=p zt8-zyB7dNB-EyO16YC}U?*fsd^)e&u2JOY)-FldPKWzmrJj_S^5aX05etSp zA&{{0%>-N7i@ZS=_d?LcPdUa%HFIE9-K~`atj-mvR5a7wSKW4_YiBD&oI@|I5_N1I_F}fJ`s|vbB}U zR!YzT=dvwzUeu zXFKOQZ!;~wXN}wmgg`)9u6x7XJTXJKNT24R3@FlNVd9&h)6E$pT-I`uciv-#Mw*hd z((SmYZj=#gv^f92_UhygH>m+)mxLTdskKhxPcJ%qqWu2nji-K=9ZRZ%H+zYuJr0(x&q42EB87*Y^d-Wa3YO* z54jEU7JzAzlf>*u_xSalc6-I}JReK?c;O-Mn8!w(e=T;qHRFSdyn7>kzf=I{KhWX^ zh~bT|OD>$$7rGB(nvvNSb=cu0;~NSb`M|H>jcq=NlBiPk;d^F$TCq>F4 z38s{2Ep|MCxiwl!)VtLzA?y--D9`|NARl=gv9ovbgJL6Ypv-t1TDXM2QXocTsM^vi zfnsQ!g7v5U)@sI-3g;WM4E0YaPDDc{LWRY@&r9ihf%E*hMUjmDYDbWqa2irFDXp;S z-0_bw#tYJMbs=H;L95J9C337u9Zto z=v8;irZoZeq>nD)X(N$FV6(Le~)5 zI4O{#JVxPd>ad`kp=f-U_Ezdk?S1(yI>(Qb8%3D(J@aA;dRDATo(SWv-}O$Nf5^MO z5d<`gb`xB(*K5JFqs7Wa8S9kAjDt3-seJ0y$IQa-2kh7ODGP4yw61&LJK3HUB$X%I>Pm5vZG4Q}keuFXJ} zM=01LfaVdP(}JY`bt7P@jkf2p+K)TDQv#&7LY?Vryu+i=KQ4DanTgpGB%0kJ&_j91 zNXmL9z_B~JVa4_(NK(gwLLnyV_+V-5FF2h|=ARWKsuIP5YZ*#UTWMsJ++n9=KoXQa z2T_#R4c;@s%}6OX)nP4}&=13q}IeOm_~5HQCUDH{f3c;fB^ z7ziFy9VEWsY(|kQH4AzL$W34Bc<+Uwr)~W)p}{|NDaa_uDAdSM514h=6!rWaJ5~P~ zcOYXsB_1Be0mq#)oL6vuP<%%fbXE|6T=9xc^+)zfhTmV)N8(uxM(l}M%R@!i1!I@O zA9pE&xT@Qlc9~tn$-3I@U3pwp=oC~K`r8sg7L0*t>q#!)8u_^2;2cMH6OC?GFS$^8 z68=nzGj;*C@6y;UhJ~?O2^Mkbne_AUI<~sJaQ{oC*br@JYDT0dohS{%XjH0U&b;eAdjFP`oM7xparD5+qH;SMrb@SQyV`c8u6Eub2UF z-d-K+^>312LH3FXGf$YH3|i$A?gp1X%hT#$bYhp>W#f8$?`qbgX2PWkY@s3PeAbRF zZsG`S8uy1aTjLu_6z!tY4?~u~OQ<5>uOzm*q}kfj&Uj-`8sj{x4X3H6HWb`65L;Bu z9CjD&d;U{*WDYqJG%jDf3+#VXF>j0dj=`lZTWY z{xg59PS{3q2p^*{;|`7t?ttoM4*|NI1NSlsiW>3>q*5a24A`?nM*hPuX&aw z{wiWR{6d`9W!#Iu$cxveysjZ5|TA=Y|f96z~KGnz9<@jjH}7D6dTL5VZzn4nz|KOQ%fz&;!() z?CG!1TA4X{MR!&L!M_x-$oz=1`~D8%!#^}cRB;j;_z!Ycze=}B(k5>9j2p-B2Nw-6 zxC$D=yup9N79Q=bXZAG}P$#(c$q5*IzJoLF4phMZPRZO=A5|yr#n}XRk&|fb0WA{z zU@^{TqyJocSbX#5xS5q~{lcRYUl^= zXutf>yr^BlfF5j3AH?iAxA+b0BzeVZPkV_NQN zlFsQ{OQH@9mQP><94&T(rcKn*tFy!X53dP$Go(OLP9-&_jV=;QgGGbIHaz^R*qDh@ zuQJ9@OV34>VXcspDS#G?pu|G(00OGZj}NS+hYl^Rmj%XsMu5jZRq|Tdw1*YXXOq;d zpS^Q5Zwj%UrbFz}c?-QD33d^3dL=z_&%l~4Jwt2OrL{kAS8n5!`9{LVFxG$I zyP%S|m;&1RFCPdIwNQaE#)+Ukzg;MdI* zUn+YfQ7B0dMZkp#(8$)tNEo3f$QVVE0vjh}1B49jm!Og&`OesZQHTbIxlbO=yCX-I zr`F(@m$#SI0oAidyqU%Ptg4o`Z#UPz_k{x^Yk`eTi4eQExA21D5==w-D>C)HWBb*e zGMe^Pcpqw-7w7c(Es0t4Vc%)c`ZympH6U{lm4mL~1vMeN#_{K{WdjR)cWP_xrBV5w)j9_`RByDRnqp^(pPx4%VXTduz#r? z<)dRN1v;X7>pRI+Gr?x%X>Y|h(yyc_Vk z_%&z)JUu(icg)-E=eE)+wlBI8&@2vf7o*$FjX*;6c$qwp46NRR-;gTbCQVZ-{Ww`j zeKjMF)9dl=4ZD86&~Ip0cUk(z{aIbQg%(l6J?C+sFWX1aH~KLpgbCXrX~}itF6A|k z!+Jaz*$5xa_kjGffJX8L-S~(JMI-+%@CiD#lo!;`kqcm4m&nL|0JKhw|gnR&bB?l&bYt&diK3Nmrpx_ zH+#bOUpR{U@_W}&@=Wdsw1D=|4yg<;sFb177QXMS=%0lL%y*_#OaB7HznqkVqs6Tu zf|$=)Xz}iG76d#<@#tNIM+*;|QFbo1N4o{U82a^xV?8>~ z!@VK=3wc1HLwEzmoFWb!E>?V#@&0$oheIEFr|U$n;tf&|Z7+otsC7fbGKRX!eip;7 zW;>7!NA~&Fz_)pPMwE1nl(6pSSh5}!b{2~~xd~oL(r!ewsuA^aT#mqLeJVz{LQ^tb zVQXU@foW|K^+NgqYuMcMJ43pOwh2$hFh` z!JX8kK!bTiRa=Tc_qD99QXCYBB18bv6UA?_Kh>L{k=jm19;M4%~ z9Ve(v0-ydL!p>n!6m8kIY1_7Kn=5VGwr$(CZQHhO+s?eZd5M?8moL6QtgYf21Rgxz zXD+bVo33FbkE(%aqmp_LRH#A7tbnX~BaGLc`NWxIHMFy|@jT!mQ7|8tB8iuk3OjDy z&07zJx=_>_AXuw059mTp3LSElK_9l9#`!C9S4-GZE<_}$B<$DfXJk-&D-`E<0qoWIXAinS@TyPxMY9b7a^FKq>L1Lf)^_HF< zce))(KCjUF$v1#t7IYp7AYHBkDeHCTVlh$<;T{y25w0B0Q(0|crsa)HKuZ9H+N)py zjDfazBeSPd9JZQ8Odp+>)@}==L zgW$)Og4~lJc1d$4NQ|w?bnzwbuKB4rX@v-Mh_(~7{gLpdr$ z?sPCe<9-)YbDT#?*Yd;mD(i5@R=)MQo*!{0NX;g7ly0tzOGZWuto?&CCnzeyQWkCt z99ZV-@aFG#_vVZ_cxe=zOkH`xJqV5PC7Wq7OC{h0aTE^_bccVmPpkthY)b3h5i@S} z9@tqQBFH-ItN4Qb^jfUSyi+c&18E7Vq_x*=^&a3c)|EkKO^Pd5{+E#FLsF~c_|GDLlx#R~etxiJv(C9a$-cUOI&n zh9$mQgz&*SJa#lD^rz(BTXV&ro{vY2?EK~$#dB`)RiITyR0;2j? z*t>m?qubBDmlWfQw2Y@Euf6YY2M3wSt8#T``d-}M%^w&zSw|Rv`13g>kj{;R74Q@R zXPfG8N-oBUYY6d|!KvB_<#xJ}6yldONi?PxR~VBIbWLnr)RP?9nK6;6EyzPx{+@y) z813C1tx__mUFKH?eH?CF^j~6(o`C-YW-4*M+EbW#$`Q`(J-2UNGCCM8#Q*51dO7WBp81i2_u_vQvOV` zvjny#)8*%}M}1Pz1H{(@q{0+`J|=ibYUcxUJp3;Mi4V40DJXHl;Dy zkZRlI`19y&BKp()n@M>Umav{w##9R2XD83b{rY86GeQ0N((iCS6*_hVar1Ds-NvLk zfCHC437WK#T*#bD5urKu+|8@!>3ydr5jf9>LyMFm_t3Raz)2m0$}5h-yB~t#KoBI< z?j0i1|MOieJM?NUdaf)}1Fj<=_<?#$rQT1m^LY)~NYTMZ zs!w>>9w|^q0K&h`dGjh=!bEKmYclZ1{-<>vgFJc8vqn}Djg4?iYTLPUHHHP+j~vRY z2Bpe4`W%=4VP#A(3OHR3>~As2l=tV!pk~ZJPyc|If^+iXlZ|x@gzp#zo6>jYHw!qh ztPEx<2$uYcI#xh4n)}jVR`jl&xFDyeA*Q$8`$3J6m^Z9%6JA;$o_TIci1JlWfnBqM z?t1S484cCAptxrVu4Q0-%{O=@B2f_f2i)kDOVScA0rlsr>&n^wpS0LtF365$RzLUz zFjPxbyREvG{*!K3P75v6=prl91hUUY1F~OH(SLn$5qIqB-Tt9)DvhA5i7=qQnX=9e zq^^O*2x8aB0!BnZkT73FJNj(X)k_Pi3jIC5Yys~;MtcU|DuZuP0eTGofk26SaFuFJ zR*($nK+LD()6}J)a-~Y8h^y|Qv*5l{HK*j^zx$&04D5f$Vb;}_en`Z>W!)tTK6tZq zXcaWyW&15XJz)eqhG#} zj~*JB&Tx&h@hln2bRY&9S&m!2=l$2s$WtN<9`bh8fHj$q4qC57G|I$AghOx=1`|)A z%C7KVJ-PTIr=_?pZ3|f>S3dU`NZM+;9ZXCyS8H|TUR|b&Jrx=88Xu2S&{d})UR9@Q zS5>E6y7aY~=yy9-$)=@zR*Ty&&bK4Zw_8U}pwdHws!qcVsM`~kk}W(~?jT&owc+&Q z+)}R2bKS1AIYM>zNiyR&sq2Mj|DfOjw{7eJz`?7e?4@$jV`2R ziLTQ5Mr>I#gVI9HDL~4}m-8mwQ;YJM-3zOu^Li6JcULqK`m|y$I{ojvNcp^bV|*!4 z@&H1bK%rudDooOYVWFz`GW_ETM$@;5hQA>u36LsO;N;?wj8sZgMqSfQRKt4{Eg%qM ziIM?`M8T4;dV&za2abX{B1c56RV`E z3G*%Mcq8K*@G=%cdgXhuC(js1ES3_*ZlGBTU~=7>#27!h+eKU|)*`)E!HA4a!#dGn zTCD1eh1uRbuz8Kuw3wU;*P5$+jWk5_XiG5Ox$voyICJ1>iCK~f7yP`j7yXtnFu|W9 z1#eIxfS!CnQ*2-nqA^s$E@ho_MNlynP%;#LK!)pQ@weuPsm{%h*9DE?6NyyMI;e`I z(wWNz0irntd@Qv>QT$}Acc>h9NMfCMW-jmLWlUaHaaJ%lrC`r>3zV#_a z*rzI)qU(cX$f4$);#1N}O{8l5v&4?m@2Qp8NH(M!J4!!(bzgzxk>57q9r8$Fr6-As zHWiEb6fh?|_r{l*R{ud)bT`K)Q4y;|Q(t6C#Iohg^|~&<8lj@x>?ve1XdAAG&WqlE zbjz|9Q0eUlZ3OBL?jKb_V|Xsm!(7@Keh-zy!@mlk4roCvp(Y}9V%r*!d&a#N1 z4PbELxxnETBz2+un`oRw7`6=x8LV9b6c@VYNz*ndc?PSFxGg7oOctd|<#p#g zN`B|MgcIdOxT9E_Z07m{zh3%M9e+H1(u9`IbS@H= z3DQ}31f`C1^y6D6Sqa(p<9OsMM=6!cL-F)mu=*$+IthtZV>MD^1F$9L|K5(?+q8a6 zY-}`$-yfA8^Pi(?;x8TRPsP1AM4XpsDhZu~YNGS>2@>^G=k&b}C8ddq+Jz1+>7)ej zNO9pXa-W%JCb`FDgmG)e1u7d&4Zz5>z5CkM5D&Bm_FVP2CwO-Ya0&7w&9RQbu8rw5 zo>K3cm)%%T4mAu#S9$Z7u3q{bnDpcC?M;KFX< zWGey8vmozt$jNJ*h0p-DLGg+ekEd*3KoSpJ5|4x?OiDK+*cuC_F>e?10UF_4EQ*xD zwdZDyW^Fl|6Hjlp($G$|?4!P9CEV>q#@_P9EjJvcjoOSY@R&aM0t{ zxlw2u(>6)-E@AVoF2aW5%IBzAx#O|x2JMupYv>PV7coz=2-)&!%HD0iRWpWgK@iE_ zP8PKW$?s{Lu!)y6ny$z5=c1{!$27WZ#;6hITw*9_ZRJR__5)0_Q<0hE`yOnhyqOhh5jz&9 zMnvw08(EzWJ_j{5FfuS_6H{YNwbD|%i^-e-NSzGapu_ncOdZTTjD?hlgspj7Q=}xy zYcM-xbuS+vD%;rU%gJ>Pl(NzMhyG_5eS36_X<4}#wB+?bqzBL+xWr0j6L=Db?VxQV z>P8NE6BUcPXZ4S3UFBHW~wMoI`oV(<$?9~Me>_uyegHDrmx2Lb)`JA zcFmBN8YX)INmR>PNmsuf@#+`)9um3z^`}Q$hNU@;$2*&^ z-W#6g7I3i&L(4oo2YwyCu7uS(SRRJzL`F5H7I4{t^r~c-hGGr6l~YCEQAgUX7nm;n zPpZt&yn1U}zQ>eAi?55Y(0bag^G~YYj|}c{4-p9QV=c#KMqLUQp$g`ZMYI#+)p=6)GXjqJcg0_H1h9!M>|f_9o?A zC&@7!QahpVivmr5?xh6rwWT2r|hZuK+@>NYK84=h4EqmTGlxV zOIpquu3QBywx~gtwp^4lwoGQdtU}X`XI)oG(*mGYvyBkN5U!XGT5xO^kqv+{tMEg% zq7766NF1Bo&wj4@q%EG)Q>)DCvBdlZd*Q08Vyir6icTWD)0~-h6?(w zlXQmdX25wSNn!?OIgVGhptUemLH?O&u2FF-&h_=h?E3Z=Yxh(mJ3FZ{Z5zVfBGNer zHvtZla(aTHFle%8G)A4SOvF{YYrfmqttEy_Q(i%fP_lf$mvo=eVZ>+<-e9l38Zc=7 zAl}D-u8Gl`?K?OaPWVuqRW~-xx;$7Kmg*ZzCU!q@{eK_*@q?#~^>*$HqGp!5{3s z;nbH?Uu}B8Y!z|EC-fqwz#ZP}B~!l(U5XrKx?-C0ruL)e6L7z?4rSlG0{cf!^zW_J zp9O5pgc)FjI@Z77NI8>qU6SRdz`Xvc&i?0~Cx=6VwJQqZxP97g}B&mSODlC>s+XiJS_STB9tFKC77RaSm zR%c;GJ^Ef~J9oK@ILkxAQ>-mc4{Wt$prEGvZK#$ysOpwY7S150h)iEdD`}!3 zrAstZi_T*-wyljo2q_HJF?b!VQcJDRK`$U= z9^qw1wQjZ#vXS{mBUBKA`Fcq08p?xiMuShRv? z_PR-89@zA>SZD}KaqDrCl9#;wHkR%T#vHNX=9}NnY_VrHm4$To`Fty$ds(ta~rWGc(zHw*8AxJ({MVsY>n(4OBD@4s1g(MOFX$ z1A+PG;7kxUXXt2c(ZdTwQ7jUiq`V2M45X}^om)>&6|o;DRU3$+ z&kT8P1EYG>D6w)UvVvG6U<-lmL4JUoViEOYas1Xp)I-87`*_KO`k=ke6jTpDT}$au z`;w>(J`Ql*wQM4M;Z;DbAibzkZxa6Ec5L_gF}bC!V8 zC_))A2aHjYuHw%r-UR=PSYgx=>|VYT8V;W-F!EZ1>V*-KeB*fS^dFa@B%^zu+O%U5 z{D4g9)K!qHz;_|IKPe7XgfBnwloe*y?pnX%LUmW2;{(kE=b@%27}w0P@cWOw^Tn_C zJ2h?fhie?!=+j|}gknmYGJaqrbtyWx)wDredHu_vRbCn?gxJe9>A5;osxY8NwRBFZ zQI?4TZ-oIY??0gjH_G%(uvv~9TNC%H=sdPFax`Nua0?cKPxYuLyI^y67!;6rTOq*> zJx%M=Y98tuF|T^S$$!7yN;^+{KqGq>eZWNKw<3(39nBe&Q0=pz$;WxMjvq4Jg5yLI z;X)aPBK~qL53i%jewQdTnw|qBA!dm;Y z)qGV7?PI8%teP|$Nve{h2Mgc)o;ZM`W=F9M|jOpV*h{CbfbH8M*8)DT4wF zXC`FB%SuAQLIn)k95%G83Lb{Yy0{@`1#Ro(SM6f!{D4%r5EJR?@663 zKW~%nprw;N0(UBlmZk8QEba_@&~n&3UHcora_Br8_ZP5JIR+iH?v0q^$d!-(LkXQe zT-_d$0{~dr005x>e^Wxu91ZNv|F@y+f%GO>^T1bE(b>__*)h)!8h{B?jyjA7U)2v}3!PVTx_v`}3;PRdHcw*gtr&^LvOdul0PX^&E5S zyR(XoZU_7MDr$N2bh=}S@iTe;X}Y-M`-J|*?t~Cdw<)6Yo9UG3Q{B>>T5%#cN@>Lz(G@C z{Onff6HAxFb~4%_Y{57j`7C*HWzTN%Jkf8!49(p$ zhf3h7ZsB^K)xG}IrSC&*-2_B+#4jAIu`RpMJEZcahoN6_nmIWc`7NNS+}jtOV&DND zQfmv=n9C_K_?9x=LCgE9ZZL+@I?khCc`77`T>c5P7m4tVdMvt%{a*Hz@X4hf9p?B+ z9SKe^-h*0WB!%O-TNWQ~=J;o!!bl9aa97SjQ(Lgd=pdpk)pvBr^}zO-gTVUW`k8~W z7Ued7m)tIhQ?dtqDCU6tBkKh|5*Mz)_}1;QQ9T!)HNs8#63;$h8tkIGMlhXTK_6LVjwUESafLQ z?MJ?|HZu0{OILfK@qokM6P3qDi1qE9{g{I&)7zJIi#|-Ww_Qxct&;X$x2G653QR0r@xAp*o@)M zvDd7#CB(GdUA1JDu6eMjS*r5IKPS~E-6zPeSgM7G-FU;~*&-M}e#D^t&ou69*6 zRLAe3`kp=Y>`OO?i&)6HN+3&y1DKqHQ8)7Fi? znQN*g#5D~Iq2}~IOPXs9rD|rBuGxd4O%3K}P1Ggu>Dhz#>oDX;xZfO|`&7*=Jl(jr z78mZ{t=)EP9=6pSU8F6>{ESWId{c(^T&`MO9_mAk^u<(}WZ7j`--3kap^L~Oylk)i z>Jww;`BTOhb`3Kt7M{2Jqt8ysyU*1$Z9yj1O9%dy?flz+3l?o#P>^}cL&dTVF(uLc z89Q3*VBLPF8&-4|K~Csgx}ykZ+uTf0OF!ak#j2VS(=MNi)>}999)kR8!=W*2eaQ=U z%ok{xK4HjK>1N#ASE`DqK8wyRa|JEx zmSM08)*w53`6G@cJ^MaTWhL)W{ct3RGhF!2Ua$MD=wBoy@+K?jKE%tT{c!2*#!fu7 zcLO}3s)9>Wf&Vl;^95;Hv7&RZVyH)}+-R+vHxE}q1y^R;v~psi+O)gR+>hRM+B~PG z+AJGSRrT|9&W*lv1sXeXJDyXHTOdMX3W#*j>i-qTEg%^b#$v2UVdtnbC{FuIXCWx^}UOEnLZx4doTm(*seL z2UB6$LzorTccaf|3@gg4XJjQbH=NdbSR5l;8N%Ucjd`Tu4)e;o{WTnV0tQ*Uxr}1nAY+}T|`*Z z0FLFk6}OB6t3mCM(X_#=SB+;2Wxl8DunH5vL>6Y!7kPipSkg11ceFcN?-R+N@w3*9$Z4eXi^qS} zl(jj$mt3I7#CMp3+?tq1*Hck(u(?FW`Y=x6(`K}zP7yQAY6AL-^bnJa9FhS8JM=C} zdkpDSm2PD+PM*4iw#z8$8%@&*a{EM{tx@!W)GNvn3dnlv1b67qQymdbv+#|$ag2gi za#=EWl)KM(LA|St-OjTf(g2M1{3#c|lvCbXkCLUoGne`2O}`2V-J5;P%Gtpu=xrZ0 zN{+e580bl=*oh}LpP_DhkbzUXGBqvVJdnb!wTOU50&r#~;h&`ISFJjN65bM%8i#}_e(ar7v90f#tV$!BI_prxl7AuLty%j!n zxqET?Y84edwrv%>B58kkNlXJu+%ig6|KX=E+(xT2vesbp_S;`XsaYr5+m0mo3;=ZO zvi6z%3o%!A0xWK{emii1u|+GnC zVN@bF3PAD`NG)j~w5(?2Pj!kH;H+v$dEP}VKM~N~F1&aOB&R~|6}0Q=!d>l?N%+q< z+LHt>h+&d73);lOuR?dk-iMq&$}kX9fivk61X-y~13vj2^f_3!T#ZaQUKl0`n_b;8 zP7sj3*SmR)3$E?noA2LV;10yd@4ICyy_v$DTJ^?$#*PG^@v~xHDN6yPhXPfEdh* zvLmg1je=mb{6r8UkWVARrWCkDN<@K#MDSdEGZk@95uz9^NfO6Ne6N=hI&Pqp0_#(l zPO9WD>lT0h8Pft@`0`dmapQnm>M#v4c1s}8r{I-MWFvSi&vS~-C2@lhW>Q|`+a9=y z^d2dG0#35a+(98acvg8FQrJ{tYU>dKZ%3Aq`aLPYZr^%T55WM)*w%CDDNRG;ePYxU z3F61O;Ee3yqMKz(rJa>&){8|$(2|CFYP^eC&k6oXTxWRC+X@QE3XH&exgxl(IlQcr zekqxM&dfHFA85p|YlIP4*NIqNZ-<^C8oc7k>YTf7Au)Bv6}XJhv~U^F&w1wSCWMR3 zJG>ZbBN^*8`go8cT?}+9=JFS$ovqvmH=gDVlt`p`Mj)63F+Vp+9$D;G5A_;424mt^ci1EW1aw#e zQ@pbWb5f#0+7R8+8sM><*XFO<)Jl8#=jPN88}lmOq|s2I%VH_S7BJ9f&1i^jec=)G zYdZPhUdoP#fxtRhAyznA^I_CAa<17KIcJBcio=zYagj`Z#utR!bIw6ObR#tDt9J%M zlQ{JhTGspRQ^%OlTbHN(EzCbdCM>h8hCv3{$d)6@nBeTsuuKkKmI5X>;|4%L+7MfT z0R#vL>;jlLzyq4V#Cc2c$p2axY9EtjHF+NOw#gQWAd3UE-Yl42qN1^{2F9?Ca6Cf+ z7@`O1DxAW2+KzS2%SR+d!5qAc5_4>65>+o#yQZavx50dZ>xcG9u|k|U37br3NG^tf zs55X-h|T*i#T>B6LPOjQr;deW z1nGF)2x+0L4J=5Pq^g|@(T6HKh0m0(LW`8$8u9Lxp*8bhe9Yv6&^3q9fgpI0(xnZ6 zxc0qP%5<%7P^w)u6D=C1oW=(Eh1iN^NQ;Q>8?4IKF9wUFGX*UWXL18?9AWg&=EFx) zvZh$)*4amHnjGuP0Lt-O>QbhH`b-w4xh+aFh0f>GAw@E+tT5RU<K?KMyc(K=97E4oP_9<7EUrZ zOGN_W8MkPZk|#G9O3XBQe3lo&AeB)xX4%n589$Fw1xLm7;GafmugJXq?#Cn(7+NEx zT0>*t>4lsi-ZmppdT}=1Gy!TrxO|X<7@XI;R3F<2$4>3iex|cQ!vFkS*N6)46U99? z)@l!IRE_)P?H|ydnt5c(K(mqKvK?BGp{|6t7YIIr##e@JHa%Mfw3x-M%SzS^D{XnE zN~=m^mJ!imsmJw~u_X}u26t9hxr@Q)s2FP|%mqH@kSQ?^@W(TU{HsO-NF15!=0%rn3}2~A^)VXpc7J?No*gR zr*DF!JApChfmok`SkvPhGU5wH{sqGnL?^A|(UD{@Fsp182~5oo4;EV`$fviQjGxsg zDj$08jK^e;^MbrYNU^E~H&tKlP$^A9Tr-!4GLaMv>a?`gk6T!XqtdYs-oz^E)Hf0g zYNLef9r5{_6(#yukOwG^<>M9FFkz+4clzQ*iM5S|NbPar#fTR%hkDE1NXv60FIQs6 z^y|NpX7$=RT16_77g0UZ6znOrM~M|NcJd?0h$t0)N)l!Uw?HZjWcBT~L1taxwzn?8 zY1LOE)evmpVIoiT#A`J=f7K5e!5a(#)=joq$Bl8A4+Ir+5V#&wVe_`kAzuSvJ!5VL zt5`@&XdUvnOiFPOw0Oi#&1h+Zb1o}b=Hm~Vh%7pqR1_pz3nrZ3zlQpog2wl%MP|GT z>^6R6g8a<8e8v^TUZ6NinD0!9(eP3XJ{Mkv{lZ&~+e;FofMLoJXVGd(N&P-`pP^fr z^FV@l--1WeW9{#Hp19z}f>|ZnMl&vK14_s{IW!S^Q42yYt>bF*1x=ZC@Qt2n=S698 zx;*MK3gne}za*&6t6P2uQjkXTmv;S#YWD_Liea=44-F3$c0#AX#L4#o?1Of8Zz&JA zAINGT(;$*xo69h3+@+&RX0cVJTFq+4=K`C_E@_Q5_u6T#z8NV2gT-RDGn*E(Fs9#{ z7)=%S;rwhor=bTohhNYy<_Y_es+;MsL1Lv7xTu+*iJuCOI{Ars?QG79{wFgjVdU(c zd+M2a1O2b~B-~L`&$?QST)`_gxsQG`D=X&KXT1$R$ zZjOisx-)@JUfL-}7AZl=>nTY}l(d(pY}OR6I2kDG7Yy_jy-sO`%({p$E$vvsL7mqV zMLudk!$h8c?SKu4gY%YglT$&4`AVI|h7kvME^tTPr8A(D9`M?8#sHvJi$fBw z--g^sjT)*qcsw#1I&uR_hjAO!=q+wV1enlJ6Jnu&TsWe)J;9_ivFOs!jh(^^P&Gru z@UoLqauY~WlKmyR%=&8H=5k62Wy&4!tu>w6U1e19K79jVdLn7TyMHXFRgC;0*NjvX z=8t_(xVklLz{$>#W7Zv$GAv+g32}ni8}U`$Tf;DvAs95w&Ns)AnWn6(VFU^qV!aEg zC69y5d;O6c_he~j;Iu27Y{)KCTOceg$pNVT%8klM{u_E~4T9#-{7Vo#Uut3m0on&w z)GD&h+W0HRDJ%TVn$NUX`=dk%>8?Yi`RA$KE32-ulbmJo!AdY2bm<9rn*fj&ue-dxh+9VBTl+GdGU6Pf2HlFE1L|Wx%v!M$vN{LTf?w14b|@{!+-oDv~kokNVd) zsETp65_hD1?(vt}DNFy@SFOfnN6S!?nEtOFu9R=~LPj+uc%V{jXQ=f6e# z<`}P&p*`WdPcp5~oQgI6Ky@XSQl0H4lgbHJ5l^$EO62;H3rscrRZ{RaC32hkaf!K$ zlo$+@v&=%F5lMCx5q;lrQfIMzr5b3BKGzy577(fTGrdGFAPc*CXD105mx&T6Z) z`WlZZAxbx1Nb;LUOM#pKc(V(mvedpc|w> z+`!8i9HCtxKB~MZO%?Jppz$(Op!af6zmHa}QL?3$3jm zrJ;Y@9x$73g-5pgh{GY&Xb=T8us%t_KDy@%$#>UY-RL)q?H#8$nLe1YQ)puu!sM(OgMtE6i;^?xH4W zVZhuIOxs5`Rw22l46~MTjMebkiK8QbE325Tv?v2p_>?f40aHc+JBbHOmFLc>NM=ql zA|y}o>}vA{t4>aCxKwx|q27fLY%8OVx2K_3c3LAlU-mbL(`o9)Y_^{*u|TMb7A@=7 zx4649^9L|!2{yPN}?CZKrL^->dtA2iT*<}vIE2QoNA?_iNNO?=FgSW^YtNa z&$Zh1%W2FKzwbx=hV8`*-1koY!mZpH=bzVYM@N8UhubzgB!9WD3k0lOV}O?J8Y_H7 z0VYU2e^$zor=7R143^!DuXe6_*HK4DhleIeQ&*atOFrhqK85_?Zk`&#giN{>bGG>as zP31&pU@)$L_ww7@{N;^qEOhr0*dJwhhcC$8`#!lEh(6RELr7OU_9uX@c% z{(Xod?Q|IEU}T4l*;xCu7$V4nlz$I*@SCd5-;e<*TjL&{!7ZVjU6leJMr^Hz0>L<( zk+c4=0^mPd#>4c%@FR|6IgAAr3Qv>;9r_L zW~XYrx8+;Ib@JFLp2d|b8^8kA_6pPH-uwK$t&bfA5+%CH^H#lL-bhTx^-gW(&8uyi zv0?wPpOxp@G;>Pmew+u7+$6j}5Y%6Y8tSin)d1MC@mqC#&V9VY=Z&y_)7-`X8zh<= z98#Ou{L#``Pkm37r@g@&@i&yGSEdJoD-Rh z_BH#G3k5ZpFq1eB6HP#VeF774OEU;rB`X|{c>ji$Ro!m}v58`mL|Aw+Ad+y@uWF;_ z;Obxs97-{8F+q8IhDQA4Xeh4F)jy0&f%#Y;Mlc4CdQ+MkF7{2#g|7NYDWsrcT3F8w zhw=t1BRN^fYWrufrcp?Ld%Rd zO>ZnBDmMz9c-z+CsIAPm-95rP!8V2ff?H<#T~|;gZj|(9V&A{3S(Jc;bMd{1C1OXq z%jA^Q=%SDQR~C~lZo={y;ST=(cJ#;|o&NUjp#956S5KL+eaAqY_%}Ge%7gSDEXMBe z5#GT-;Y|*f&LJCcUXQ6PtrIr?Mqr#~rdcBu7ywq~=0$!b7Cw5Ye}bA>cWYn$pb&JF z2!CY;o|{`#J`m$t>`0KBkJ-dFc9`}dtE!F3tVh$=e**oS^z6+xVI?B&eATf5ii=aO zv8#Yw9tQzZS_MvJ-$a0iH0&9HNfU1a5 z^-RjAoWNV!j})-C8NdmM&pNE_qz39>pK0p17kGOL=Z$$%=nHdjA|H?HEOrSyYS;Pw zI6|Ti^`G)G_BlHr{>l5yS;P_v3_PD)Uzq7pnsQDb3a2&h@6#m?j{+6<`~uf}P33ny zg|A%8b5Hs3hhN-NP-nrNVI|Q7e8!=}%J0LtsPAE1SqF%D0Z@wnDm$G*z-b`B8!Q8p zq2>_hOxaFxdXb!MnW(GNh;9h0Hgwv%e_HY+BjD~z{?(@Ylup9BR^=P&yUG2t5e%3n z?kdM8J+TCI6B-$=QTF*GNy$gZD0fwVXy(47%|V`+&F@^l!Nl|2mN z_sT>YH5Jbk(ygo_#~BOMV`9uJE(D6r=<7IGn@aO)fkGQ9C**I*BxI#b60y`jkP_6v z!o>533^I#Uilx?TS=3T$>+*lB^(fgdR$BKl@#MjIUIRdzYn!jV%}KzNVKACO9@!y^ z%2g+SOfPLPQvkc9BeZ4AWHOrmgC>&d5#i_-~J zzQoXx`J>=1Lu=sDdU^YVCe$U{d+ur78{B8EC%0)$`|hfe$l*nCF}yUTZP#9l zlaY=gMwi&e&MCe2f6>1&|;uFNupf_ZMoTiT%Sc zA&>1w8g+oNy6PZdG@xOQS$iHv0u(o~m#_c@zlU|;5TsmDYwTKoKt}MK z<5+T9hBeDd3FobY$;r*h_QfEIsWxdP&!n~k0VdhDz|V3Pqw7R4WsZm^Ws+zv5`*?s zHTg@G%37pU!b?)?%;+&V!M1_9WijQR2wafZo{_ZmQ%2W`{Y26da#Lth!PPYn^;iRY zB_5n(Y&Nf}#n(Hl${biR;_m*8ej55*c4^T?6O$)L}MKi;^ zuruD)Fx4Q7o=t6fHXf1fEShGFT0%HOt(u^NT~6)q$%3f{zY=R-|!iCu^GZ(I=hU1F6Q$AEIM>=;d7zQ9m!m!PDs!U}KltW&5^b@E zU^9Q+XvZp%PuRpHsqG>|rm;RilSJiQ|5LyVDhf=DfFQE}V8^94)UiH1)fmX)n(wV; z)({`g=pm_y6PO2m0p_>H1b_kk7kzJq2XFroxHrU15xC{d!9NP9Cx;U+x!Q&78z6r= zf4$GhR&($Za1Tkc&WJ^;pt>Qys`c2~F>42k&2ghAgDpd>|I;tMj{-~a=u8~oh13f- z?s-`7hN$kFKJ{PXWr&!M%7phJEhvba9N&++^-Dfl85XNS{W0%k)6jhXQyGg!4(QAQ zgDCm;$n7~^UeMG|jr;(#jWj;-G>efv9gDy>vJ!QWCCu(hYq2DuH3qo%Q55m@ePcg; zTQOQd2nliPVdbMvsH5nuU2BDfwtMo6*MD3W-KXUY#pi(%n>B8$SBQGrc-ba5I(k^! zotx+SmMp0N@$j+YI=xC)K63wz@n>zp_=jv;h{y}jFTrJLP&7|&E}5XGKC?&A?|j!E z{w`>wUE~47m(k+IqO!tG9-AM3(rh^*W6(FE?vKzW`~bLE6kN<#4{2;M)3AI3w*XZW zOBEC6(M{-czEsB?u#9r%iH=^n(cYh5b}$za(^VQzjJ3$ta|;z<$s>`jlVwP9eyx|% zT_5{K)a-2L1~%QbZmjh9l23_h97A>dEn8~cbW|Lqew&)hn1VQ&L46hqI(1FrNYEDZ zrUdqYQW8u`Ou>_`i3g3St6wON+?t3~* z;=&eTk?+=?k+jAP%4v+e>iT9ixA8nN>y%)BD#~7D}y9EoM$Hv_@0wW!j@#SXV4B@y% zCJbFr(r)_X4V;4y@yrYE9Ww!93f_FeeA#q!^{D`j`{c;J14|cSNmw5r&=~f$~w)Ol9zV55#*r~fJPL~eP z`utHff_mKXf0J}Yb5}qyu^Fr=0n%(N=&=O^&v}0r>n z=eOfxFYYX82dZZ-WQ&*5G|LNc^KxRU%l`A45$Qa07e;@*DkG9N=GO4KGlret!+AiH zgmvD0mm0`!Fw7GxSBoXda=7A-b7r!|;prqOwKZRl*a@Gm$cR$V4tkq{Qz7D$4Oo$! zWv;=rHK_e}XkJi_DR4cTJ_2fTA85@ykv+0!&uB%+`_`5JBoVul73Qv=2C$t85FAdU z@R3pQQ^rqO6q*;qQ6;gV4;VEPZJd#KeH>9J51u^BR9htrhqG9K1l&(!c}XVXcfTxR zo&PF|*+(uhdm}5P0s6D_&aEMoy(OM73rmCIklZDymkj+Mi(V=00NLVDGnvGw>v)!gtHaw@gd*z48EN}Fc}ZNRlxP`pQ+ zFd)%e$h~iwNOx1u{@aI%B!lMKE|Kyy>NO4*+bx`pt0;z9J%#sfCwLG>pk@}0C-mA< zE|d`F1v$nqEijXpi2KLQ0uSH|5V|$Ofh+&^+j8#9%ST@RqIem&l}zQ4PrJSKDZze! z4xo+lGy6L>3W(-6?PXJs2x3K;#bo-3nocEJ$<$elkmyVnhW1#c6nvOd~Euj?*BG9tqc0$Lnz{s}M zyM~%(%x2@uErSg2H{_o=nv<5^(@vD>my}=x8X!i^ZPijX>FQ<5|7<%d@y}!W>m7~xisQ*h zr`^iM<*59sFtwpP#g&FN5Bb8DZ%stsHtUl!VCI=AA=Xd=@K%){o1#?DdZdBsIIg@b zdakbjq|pX5>{{GQM3G?$%VZV6y!9HOvDr+J;4X_bGlLl*_j^q2fM+m$;>81CvL_<2 z{{e}At zIxtHpi8#6A$BwOth}5#~f!fP1Z63t8`!U}9`%gt>ShPVN#M^WKrb@Kn1U0!~Pj@9! zPS85os*wdh$iIV1A!3@hoJ)m)G_j#+4Nv29I_+)o4oARQtOHz`%7QEwsoe5ddFEFc z^R{Pl*Nsz}O$uqzg;5Mr(gGI@9n^}UjknN~Ku5FJsNBs?W776V^#W1ey@1RzLeMO4 z2G=#Ur0F9rx@BWo^APj#>)UsiNsWM@B%eW~c8A)UgTXD*5+9S2%i`gBC8lpK`(+ST zFW|W-L)ijbD{J)qUE9QR6a{q1mmO{`7^Q7@GjW4qmSJggLo?mM%>iv^1l}|M47!tT zA5@|3LKC$OrY|xg@zG+a<%MUp)A(Ors?a9Vpt3GXhsSTE`rnR?kq2x~t3UZI=>(QQ zmkJLayYcU7BBEQq#O3l~=aG{rE@Hr-sRRUT;tm^`iTFCT!hGFIH|IVmctk>cvtaKq zzan|ES2FLFLkVAgx^HR7+lgHu@6u()wSUZ48fsWdxaKYqk$HFHzfQXXen!^K$?6tS zAaklDUt9NjHIE{^hgvA{iLe2!bvHHjvLSnFb&UmaaTK#O~D3fYD_4z3m8Ro2i}4 zl&90%6qT;oyi=~kCRK*kps>B`upV5qMAEW%%4ulsXjZtLe0}+r-S~WIZ_-~a`j>sy zgJF8*^jg=Np;BI9meT1zxF=u06gYZuNa_pbC!PHErc8O-c;+}+t{+|@+5jp4|BE(sFz7$&EWygriIZpkb1i)n*W4Cy&3_}os}YOGEC;M{*{luh{|;B$0oD=O?y`MX4Y5W z3*W!%JPS`t?g7r5A!8jJs>dPNt-50(pWU!jylJfPAE`Yd>`2uFE+HE8OC^437XkAOyF*!{=jap>VWFnmlKwI}DV}^?-+P zqQH1;rnh_{3~$y5buT5P-#d{G83p}1@B^MB?kY9_`7%b zz^D7;p}X%NnGv!3*BGVj5$Arm!McgRP}NwL9O9=>;^i0iAG1&Md}tHiDm<0)IDI-K zCjF$9UtYhyUIpgmW(b@a1D!{b9v`*4_$0a==ji*tDO~zC!%T5i!+x>4SkUT;&5T$K zB%HYdyVSQoC|qZn%~A$c`0g+jzt$<;F8xk;V^m89yIitsg=XsJ*;Z#c&7(KY_Rga@ z;n`H)fFg@6ESEaBv+`lEo{WE)cr4?5-7#ldZyiB|FQv@jzBjG!lS6?qcbPAr`GG#A zvMBy`52Y!toA<(nSBBEmV1PM$T!+Ql6{9&?O|1Nw?2jLSG}3iGsxI_y0?%80+#I9(xPj4P@`D^FEv zx=a=I5tKUWz1hRjOkA9~&vq5@9>qB0=)B$|HpX23Rbu#agw8nEx>J3d+Wx5gL?L2p z1TXo4-KnfS`Y5$e23KO+`5xG*tv!5KmtmJqUU8CV*k@QOPT#+dQ>;&7#An3s$)~8@ zfVV$!O2GxrrHOy4q3tXJ=Etxu+xfrc?j#M;`{1szU3_#ip2)G9>ybtMLruXfcg!^B zsSpwz*vSG>1Ed?Rjs5J}?brRM49i_vy@my?%`}x#@0D90GoD8ryjov-NyfkJs(Ef% z#MWB4v=f4w_w)|^c>aH-qCdbTqxO+KMMC+cWdQ~9G7*=rZVdAjZ)2o1cMu@*zgmoE zRgf+S?(t#S@RC81(u1)U{7-aoceq=j1~od&dw2HVXUJ6A9ld*9MXcLSy?Uu)?gt2t zgWkY!(3Y)8Tbm<9)0XhlK97q}irTg2rIz^>ejH1>P@UJYj&PEqP;t4st?J@h z@^(sgUPgUM07#A*PJE?97SBgL1&3;{z$In13kiHLGHN}m4>J=t}l}`c8-yh z_t$i%yiZ}G!p7G?8NsB)s$TUOuIk#ZT$0T7(}Ojb4$|XCQCm0ul)-$d{xepWw8+T@ z`@fb(O-NFWebNzrf6f@^TGf0HIpX@n-*dOg@@gKmd=a(-?H*g{j?aU1O=tIMgIbD= z>&Z^58L+C?ubNIiAKU+ek~M_-yOSU9`{~E)FndOP|1{Se*>hc?GxZ{8u>r7(movvH zVf%rsBrbk~8v-OQ5(4FkJcQ0o)-6BtT?f>Y$v5s^=YZwc7dl)+|4}f(C)J>2l<;rv zi1}|?)Q-;@{oU7nq!V9w;ttL<#EZ8Gtao;(AMIJF++3m8n2w9~oW`|6Kc$7bVCWrg zNF^Y6h5aKboW*RYGzNeZ)vgB~C49J{d!r;C;yj41Q*?8pWw(>Y+@vgye&R1i23zMg zW#yd90s^Nn>ZQruUm<5>NN|J#HWcac(-V^2?I$`1C$YSP5{0Bg(~NquKg53-h)YQE zK&!peimU8z))maFPILOI7F_+|UGAWHUgDIq8_BCl79Z(gU64-wVqz7NNp9|+h))+q zdT<{vz#X;N*Nxz7j9!LWz-_SpRvs)HNqB!$h%d6+$j$YKr_ZLE+GG2SM3Y>8yjxTF zFvk_4sF>+QU3+8W7Ll-A+m{AE z5-0|;6<44H9%gUQ6v6g#qp(l6PFjuQ#$wpoovAWH3Nl)3d~dUX(cE`jstxa)QiMT+ zl^MzTa-ikcX3W3&Z-R|J1q>M)UG+357IQqfuImNRhPZGgoK4=mZyfa8cw#`)_|C36 z#ZX_l4&wjqnr`>Gx|>U{SUDfLR<>_o)4ZWi;F_jGjJX2f4PiH_akk(`#dy%y*d?N zpRonqhqo)f$FnuE;=6C-kWIgtkTu*jSe>gjOc<}4C zOxtjQb;z#^wLKjW{KAy4a+sp~2Pp5r{hGyef{{m^v;@!jEQj#i|L)PVrmVo$)f1so z8Cv7A)hjqJRoI|}8`##>0KYVj?may;Uc;EQw@>)&pe7nfnYKo(`icOkZtJTX`B?cy z%&MX1Ydp3#-k{7~kbso?WlQOKI5;Qy=tF^AHjE zz-tua9$n6?o(>4PPPhCs1Pda{IeIAbe{3{!92Mm8DII_n{+oYT+JWR|&9r-0iLRy-7}pa#KdtHZ(qjH7?LA<4;(f zhd<88#M%a0r%e&-lH;h%49YB>hzrc05W*>ji8g_ZYMh$??zq~ddpIr7 z24;e>sc~O&Fc@U#BjE#|=qc2l&a*0R#e8}Yc`$9$txh!PBW-g3HY-02)&%Xla$C=- zZFiGYtB(C$iV;XivcAF(4dhC*>R{0VO}!(U_S=r-NmV9wf=c=e8gKQL8A51i=tv)} z_SuaTTWpN-dFPoUvMPX9m0!PYl7GY_R4aj5x4s^$0mm3)mSkrgoVdpOrPd^u` zmQFa2L6K|PQeD{-ll+|0N4&Ck#*%{K2WMFtC13FqOc{gdG5|jKhER>K-vy|d8BNYk zZ^a^ol>`4xX zyyv@Yf$if)(G@=S+6dw_{O`FTt4osj;kHBA65KQeRyx73$G_Cp5D5>NICL_BYQAsv zhJTgNyWrm)z5aK>UJl4b$jU7WO${S|6BuODHGD$;NQL_B6~5lyeorY)AL!Gzk9xs8 zBeB)45>fE*FzAL0FU~jznOibM%W^;YV0-kGM$Au@_T#!Z5lk0d+#sCVly;)&!!UlU zmQh+a4ajcTuSdZ@H;v9oSk=-Jz=%g67@Pk89=jlx0glP@(m{&JbMvp_Z2QsiQbacJ zcHR(wK1+m$7|eVD2x{*{r9Zm;1m>=&5(pmCOgQC|&cRDD5#-FTwV~T%)tu5Rs0LNK zz4IP!8Bp@S$ekp`>L>Ny*e!ZI5u3`FJi#Z-4TT5IQam6@^nceoc$=)9Uk=X^a4a zG_B<9(OCi&ukyHHOScS$9_}f=RY{nx7ZvGn4m$wsOCy( z51t->HKwu==R3xxT2l#^tHCGEW{@QtI|2wk(T3ubKKYk^>b3}?q(T0iaNuu?tET+t*V@~N*_yM2Nv!aL zH)v%71O)SDri1F)jKIXPMt|QI|J&mE;Z`T^wve{!eVrmRs4cH)d{ zJzbH#1N=mTnxUV5u9ZEk4N_tK5^~LJfxo&HdN@SF!NM;peL%0noQx<;&%;Q*g?@GX zXgqbXV$bG1J!=xL@_h#rCvXolqF%U*A3H%_g7TmFI+HP1H5Qsgsg(7drgtWnyxf`C zv!C|4ruW-ks<~4J>bXOP#jN2nF4BxW#TGx2ch+C7^Llgu`~DK{MaXSAdvB3%<}bpT z#jQIi{|u~%UuL`$beyG!THfghaNeok%{1&HG~SYl2yXi4?_IO#*^m)dqzmrn

fj*!o6K!M7I_?%J@VL#ACM~^WjE}ci8bYt};Jv<)Z*aUE zNnO3Nk*rh1Gm$BQik0IXAc%g%%nP-`Sc{8`Ax|;J!0r%G4~y~|o#Y;fl(o-98xMlj z0#|A>%v3C{?7eRK%8XJ$h#LVqh^Z}X5H@4SH*m!Z2%cc1`Za^^2w0DxiUD&cbao;C zfv|a1KN?YEa4|3wB|itPb2#r$|2TVSSVzC-c!Tl`#rQ+1hAAmqrCB9Wui7YR9M6f1 zrDk1irmp_1LHm9kqY##(73TNa_8`R?H(^^9%*4g~q2e3!)KEVn#C)j9YO4aAxuS|< z>(I;YsR~HJ2=NZ*uEo6@ll^r7!#_FM7{f}17v(m#`lfTl_ks2GwBqTgR^iU*srcp^ zLSW*O0FDQ<(MMuUE1-flbR+sUzd2NWwBC#|;=Sl6ydV**H$E(9M?=qCF!U#Kc{}rQ z#&2UIz04X65KRk^SD~Ey*-pq6eDb&a!sahDeXsvL1qEtY{FqGmSoo3o<>s3pAK>hdr{JX7tuQo9&-C_EgS(QBn5T)n-t%baRW18bTPuLz_nLSM3m zF&0pwp1ndZ5r#+yk)eJT*s5JN6Z~DukQS>gXSCrNOw6jj>=p#LV0CCBLfH%vr6Ln)D}XfbtaftI|m@S#hJN*YHca8=UU)Ddz>ZguSV zeFCjS14c>ebN|c8CB7UTD>~Z`qD_&%p7*-api&lilapTE#jj^4>GY0!6f7Nyux~v_ z8@t}kreRoqt-J}(q%VzHQo+{w8C?`X+QP3&#O#WGYm3b{)f!h5gaR6mo$+KJ*<39= zt$f(r67mChpO7s>VF<`E$45eUe3)#of$!Y2B>#v3HAQmbz|X)q8oZbgS%e5J^5D|J z`sgbFS;^?HwM?o?hd?bz9kxEa-%F%HOd42So@UeDS^2Y!h&evR897WtO|{O6OOb@- zY50r-vKtZnk;KyD=eOU`o8AGBGY^=POO;pHt#a_(y#9*XMHS85eTZ|zb2O@^yb@RX z67eobbgZqQW-aLTW`(<1x)2oW0DwE^@@PJ|pheGU8`W$j-jj_Zu0*<`4adB+aeX-wSrVZ9SGzJRH{W9C|+y{UTQ zLw*ItyeTJdRrPe2ByU7nt%Hxg3C(eHlz{Nib`l-6QC*dO(QXndGTwfl`Vjv+gzQl~ zYhyK4vdTuhfrwU;_RksPnuFulpP>S{L2C(N^10r>(@*HjTMO>dCb$*RcGY z-ZtYZva0C*w(rm1MN8$mNA{(gdJX|&zSbdQd850`amEadaiGO5{8B(P0n+yh60-@9 z$}y7aqp|$Nct^3~AS~tqj`HS*beD6&Kc>PzG4^s{Cezk2O^HIMH|?)oVAEc;Mi!#)ws86BB2mp$;$75(5W^j zqg(i^6rpg0hkvPCPVMvGy7qqOtzUZjUvZL(Hk<4eUju^lpt4A`K&tfZTY($IT-|ab zmUK!q&~k(4x{3<{_Mc{wSVOlQI{n|DimG#5bXT+Ny9&e~XixBZ?t^Y0)ON@uN>T!Lt%BWH%in9Iwk>FzO3y z5Z`^x*ONxt4gWHM=|3suc*~4hF9npf**Z73#vfg8wK+mRmIOWU?O^~yD5r6zp>4ST z*qOSY<1a`((f7=)=M`zD8U>a!8c>Chxno|I;*R#JAo^{J+&ETaPeCI)0e$9Rxj&^t z`sDpM|7sJR2)7z@FNWHVl6zp(bvQg5Zf7GAM80l+$B7+^zQV_WQ@@24m?U!fb8T19 zhXwJ)=CbX^sO($;HE5-EmAUMsL2LkGBo=#vvjZ0S-I-|0QhsgDVXekW*bLY2)G&Qteris~7lZNuGnFqQC%sM3B}K8@d3#%o+ZV7O{~_GDq= z5}MNeEWPGwqTyR^l;M1VO1oz~tUL&RQ%6oA|19dk8kBg0c+W22bKoM1K4lo&d;&T1 zWuJV!MIn+y-HrYto#uzhY2YNAG#H|ywkThM&CZQ?yhw>qCw_Wx)#%?r7N$GXcq3)t zye_^zyD^T3gm^og!x|RAFbYNEx=Z;-2c_xJRZGSSfdAz19m zdLYnQ{V|c5$#U*`i=V;QfZHv{(K1FpG70Yb1ju>i6UEH!MjZmNEm{oP(_8 zNHm;-T4|945f3ygG}xG->Ntf0j)KM!u?!;#gP(|^*o`$f{}6vmwp zLJE!rxAlA3(yR;7Y?-8~3!rn>x3Iq4@D{T7>kGqhh|j9RSXoTwXb$=ENWT~|D|>4q z8cg1cEA=OEBpBaJ50MmtX{T8COl_&h{cAUv-HJOE=CB4TB4JsZuN$$s=tD`MCI5+h z@(VkeNNED^?bI|Z^Vq%}HDwobH{T-RG*&CDMd|{A(R#!cI_1}1pEeKaI97(OH9Iu) zO;66!tWI=)_s%EhP3Y`1346vP$0oFRK=Juu3e8+RvUvILhI{J7;?(M8@oz;R$3~>c z9U?+Zxu5>BWqYpaGD^p@#)&rO{!hqxvz5(tW-{CCGVHWtbHKZV)gs3cFTgqE>flVi zeKecSa)xh?k!~_ue&oE9K?iEyfl9K!#|Yn|1T~{q2ex8vI#9_RnBh&|m>Q|=wGjAn zlZ~>uXYa)zfSGcnROmMWpyH}ov}on(L5OqflFMIEMO6u zGN&z?)IU;2vS+|v;9TYm#^m5w}_6Jph+j1qj%%B!>R5z!>_3&z^QKYY}fYMV6*Ba>$Mus-i-5u zeuaPzn00` zi?Vsh&3Lfr{5(EWU#Ub)Cs#GbMkc!k5&-g$@^#%$?T&lOi;}>ydFm%KUc4I{e!Pg^ z(RYd`?O%Tj$Kl)6Dg!CmU-p{~_iQ|vMh)B4bblBO^sL6kkmvVm9HR{?M6Syl_?f{e zB;#ry7+&_wgoc|j<=*D>)x*a$HU7Cet-WOymcD1`?`%%~V}O_C z+fXD>7xG-#)g#Z51COREh)6IZwXCMH$6@0UPzZ%f&E*VMj`#4W)g+b8U`SRXHb6w# ze5z#z?_MC#f5mH~VL`HO3&D3VbFSiBmg<~S&xF&Jm%*8IQ$}KLtS&hy1yw1QuXa*LW=Hz~e>K-2U za5(IC-FocxyzYD&k^-2ZfBbr0%paEs(u#jcpTA%S&gkx}{IP%l>AEQ}hdT7*cQvXh znaYZ$vMN>9ax|8xtCa=X?MMZV<&|rNp_HLRE1Gor5mSXRqC~)ZiPnv&)Wy~!p+wSa zRp*zmF}H218o8NCr)z*&j!DVgoPuD*M-vdJ~I z@8#p^N0=5v1`2wpCBU_BE8E4x$SZW=^ z&yD{sAK2b#WNm${>wVURUe8H&OugJ0mKjH+ulU(P3-GS|*ND>+W86iiY zSCsqh(Svm+i27@=T^qmP5%x7Z=jTY-%Fa&JzgMiyd6BC*`ld}!p5&YtH@E7)| zo?PR(#xu$nBp)6h$o*eNnkJ7%4!|MX06!;(4t6&H&KnKXf?;(lC3 zl8m|D&Px6*5ouPP5zL8M(x}}4C(`u@)MQ1OI?V7k!C5mKm_7IFE4n$z=FV)tX2Dq< zvD{UTO{N1~X4%&>8{1Yz&DlD(%UZRI(`+>m$+;|3$STN6i^lux^)kf@>kTuy_2G(~;87vnXF7UImxi-sU9rjXZaQ4fx znzb_~{#V6KBhr54690{cv59;uHP_Z=yw7HZt&}Tm3Ys!X zAhJ#S^Dgqz32z&lqZ67J*(1$4SJ+_YBeGa}io#k?0|D~7}czlY4 zwNU6SHnKl9(T5?4*!O|vhcobn8{iCr_AMrfAnvDoE+GQ50!x1{@q^M=Xo+fLff5Hw z9{Kr<c01q%9ubYe`>tM#o&dsGOWWMH$TuA;)oGoiwaG>! zXWc1XQ@uh-$L9$O^{Ef3Xy#9R>YRHncT!O{FP8>3OnzMK=xhYZMIUIaaU-9r)Ts$N zs}cB%p-;rb7@16is!nHVwWUly^rkcTq5ypW*c-i$b$EW{MJmXQns!1JUMtC+y{U|q z7-eY}Q;x9`2YQL-bnFNvx`&BV6d7Tu2(3^9>1cXqv7q##Jd>5kX`iK-hVefKS#O5n zCag6Lcn3gdQDP6i-75LADp{row*UiGhq}}@L?pt3DfSI5{7;=R#649UA^u2p`BB(( znJr}#=LfE1F7}t6idjXjmtZFmM?7w#>4#6aC?6BVGe1m0!sjW-3NFktue}H&8b!U` zh?K30Q>8-3+-q_d=s)3v;yT@{Ma8yb{`NV4i7$~R48U*=agGZ*UsB9o9bPwAetGZB zGHy>b8)>MfADZP+xx{og`JGmNBPULq?NT1>d}sm2MR+Eb4d9Z^7pEV>2S4tyfJH~# zHU+1@!5T@9$`s(xI6@PRlY0I)0{SL|I3%5uDDzBy*%FC^s#(fW@ zlGBc59llSNEwe4|1F1X6Xe)Qb6W!obpd+}TQDOoNE(dx6EuPn zK!e_zz+B+!wUR2Gi-hs;&JfdjcJ?l7K?3Wr^?t1Em9%Y^AbFeZsz&6&XFualKC>2% z)Zy9dP2z4tyfa?Gj~s>uJ&EKRElLd08?_GD;Wk#G=Zkt;@@__ed@L~+?xE-KFJa@Toc)>t4$+cRluZWsv5glcjg62E6 zl6Q0+sv&*QITFE5)?c|A@Dsr^Dwo20@3H}7sS)ZKn2B;S6n52y<3aUc${^{T#%86O zQ;}to_VwFMrwCz+^*P)tX&<@18Cr_9c4`vlOs?OxemU*JK?bDQMT^!&%0Q z@}8WH6l$4yHpVeWa-p%SMzg;V)(>)C^mTW)B44VOun||*6`QVuK@8_YD-&Q&j!lMo z#mq{s+NefeE)oXWVn6h8f(XRCu~0HJ^+@V1t=-_X5hcw+rV=gSiDqtbnz=Iydi(u> zAkodO>OC+qdM+)IgEBQbv@Y+I*>Z$xiD0TMwTHA8IE1gN7iob2vz#_UL}|^LqyfHN z1m-_AqTLqGf-qGb;Nt=~`R2F0?o6+eH{&3*gyYsQ*@1JYmNOt0Pn^$m5n6FK(&lm! zLrAvR3ibwU^4L&KTH4@Ax9Sa%IYmkyCC4)p@_R4GTkL4Q`mpbKxL-ER0wF3vQUr>M zJ5RubSODY~H=PZTAQpt4>1D5ltE38oWsGHb_(zzl=0N3K5ln}eF^1fl6+Oz|FD!sKWo)FG-c zR!ED6c4GTQLliK1n7)U1QvDQG6N)l#ncH#uto9|6Q-#deo%ZK*GS`36mt(ofc+^tI zN>-7IM;r;&*?u0?yK_8qJ)7OFVec$UF0nx^5p$C0{oC1WB{oG~9C>=k9G9usuSN?| zr`j7ZN5r=^vyHVlQuEi#BY8L5N9eigkg z(!b{yno9vX2UwPnvK*uI9o=U^$b){9{V-vYGGP)k`Ex&JJV_8ug&mFeg77!IuBEgF z@5R*zJFnGU*pkAQvg=BZ1NFzgbZ85?_!>ELVD+YR7Pa&rcE#R@V!8D*3GSVKNAaIA z$ov)zt|4X{y|={zR^5tbZPO%vlglT*r>Pob`oKf$KY#pCUY|Bn$^(o$JM@yavHatl zC*NuOHeeK(_$`zddmoNa3QN?Le#+5Kai>i@F|+U2YbnWzc^yE=3FVV%wzqTghkMM2 zdU1@>q$i!vo)P)PiNK2J0aGUKL?h~6(_ za@qTdU)3W+TvSb7 zC*1GAXNO33L8c+PB>wojex%+;(6sjr($#PW#A}Kb(oXH#gKA7WN~Q*_eR6dza&Y$> zo(yT|XpS@-r#Hts*aeC}*# zjXEsris8H%Nb%xcqBP3Boh68Vf;2d;b;ho0Di4F|k zXK6iPS_{+?)!r1xOGh)Yf-aQ%g#D{I3Y=@nxX>Gmw|6t;c&*%y+cZ-k+5<#0=&1I z<@>As5X3)eyPQ=H#&fxy!PE1bc49=XIA1`ljQwFy5Q(Qe>gMS7nQ1?~bBdj^( zEO;1pq(3J;bSau3Ga39KfBf3k1t5BkjOS<~)~q=&48ZT|_U=5&}nlb?Q8G!I3N};&59Zx8`Scv;;P8OF-og4<9DFQZju)ufvhHqs6XV z3eD|iI-^AT8_aM&7oc+tuOdr}1kUM6f8=Fj8)LQQO!Z22x66x0fjeF7i`;{bf14w+ zZIPoJu;ot? z!lwG=yvqIw*fRu#2v{sxC(?LJhT2M@WtX&=d|SK+^mAYSKM2+DS1$)nNqVBo3w+Mx zqK`r*H>A-6dSyr`MWI%qNK_WXx}GSfv7T^k>fv?>BRk$wci$GBrHH85+n(LROf^Wv zFhdGP>~iIEx+#k5Y7i4sakgBM#)f4DRut%il?o(DdaC=N?e#y<^eumogw*s_1>r&w ztxS!h$RU3ho#o{NBWfl(ahD$=Jh5}lKmw?yD_r|(rYLiR9cv9GN#N(fR#Nf>>WbyH z^r?vd^@RvqWyEbYjL!O0vLJFSU4AQ*5h>5thO#>k8!bN>@QwW@ryNWlJPi);?P&8L&8{%^PEkpznW z0&s)RCY7Dq<*5Q(TTp?5Ct~L!yfN*r0-ks+EOki)(_0AH0jBwaJYJqz!}_{aEXfmE zEjNzPf<_J)&TUyngO30iS7V^8sjqo3qj7~lcIUB`pr7#Fh-)4aWF)LBX(hq5w%WO^ zCTIia$^d{KA9q9Bl=SBJtR`;_NT+Hzt zC&H69Md^-SJCQo@0Tzy~X?(!qX8hyj5fj+q87>7xyROTnR$P?>n7>R+22wILJ}0pD zgcn8hL(?2qL z)Kd-nFE1)l>${46@zNiyFhtz9`AE6SVU!_dVMZ_qTm~V+p0$-KP;;t9sDqEon4x#H zZ1Vp!i1qi|Vh6Xu&7>t{w2N(t~LFF*2r#XA}@+Opg1%m zrqISD_5R!qw8!G#pe5~A<%PDP&o%85dHqV!i=_|2JTN7=^R-2RlvRrAQ-VK`wr@P% zW%FBDw||@vG%#*1X2cN2NEQcb?jN?OO?8A#C)r=9+AAj=wf-W5JO=i;QtVUNXhtQ?E+m<5%G2~kVPov*>WU9@x*#Xp;9$?xnJk_}o1h=9ciW7J zL3Jox8m+OvOp97ujWXa2tWL*<-4mhYMH<9-ADAKL@!FF1=xBb(Mev?Tpnj->`eLw7 z(2`JmRtR-~@P~6C;_*t_=|#J*0|;%sg7nb&yY^AY|D%;PCMq2}whBbKE9-Fj5;>ry zrE!jVq0`I#j{`Xh>QX3-wjRyH%I7YE=JeY5Hf=bO{K9*a+1bET8IdS-Hi0puObQ!M z#HOl!se-n-vPX>AU#@8A66wy^^;DFI+ojPkyesSs>jPPMbIVb~C6uq(1G*2h!K|4N zWD>RGIX7I}pH^=2w4{V`STWl0M z7D|_icw7yV9C8NM6nR{lmcZ$d6hW7r=ESV3$n3&vC=x`CHOewSMS)wX`KmCYsFrQj z5}Dg-F9Lksqgmn1QkO_oszDCGk!k86;UY8LHs@t3vi!!7a0U~7G;MGlENl!PRX(&h zCcojn3Z0_`CmZp42)85FM07PfU%elk%vyoaEU=(@q5xu%&j;>$FP4eAe^*ADH>44Q z2jzJD0BfmKS_nLJde+8rB)5kD+jTa{^OENWK5hRO^- zY0vmrtYNKxk~f$;7OFn(?t|N&-6(#f8S#;hM4&UzC)x^aG@j5o=P&s(TVYaOd#-=4 zUuwtBm-&f@NwAM$DkEgm-x{^brPEJxcShQns@q?w6igyJROs3tiw?>WDi@1Vxt!ru zf+Q5%3M_MbZqNL73B*tSX%6h2(D5>LVS_C!DGw*;EQ23IOs6Wm!1we^9E9JkDDoW% z?D-B3HyTYVXqtQXKYX1-bS_M^ro$7R*tTukwr$(CZQHhO+xU{4*f#Iqch)`V8Wg8h zwbovHzt0;}=;hd5Ib+NBkwM=F5p&9mE9^|x-eGu*Ca^}SmVm@M3*J<$&n%r<8Z}v9 zI`7g>vqm{)t3`WTyvD|jKB_&`wfEUza6B6xRIvV;9Gl+Y=%I9?x2Vpq){E1{%roh^wkNOP+y6zgL7tw?RbvE{2c ztov>LQ6%Q3?;gF?xLtH&J^N7zQREuYV(EJ?Ja%#l@6geX$W( zYP>yR-!2ON7?}D$O<~=w3Bn3!Z`MO#Eoge_wgu4Fga5iJz%;aJgK909&hnBMjyZuJ zGZKyys?%v>t+gOI#nMggC$X68MMY6o43pIV-9KHNZ>dF=g_*q{jsV>>?9wvKRkadj zp_&s9O?>bsL6M(097y(EFv&ceEJSdX;6yrrHIS2_dHCDD*q!d*C!fuDz0DV2Y;r^_ z*uAW$SY0jM6-UfR2}N30O2FSv+O8_C4P{$+&dBnX;=*{%HH;AKqw^mMcG?EX<~&2N zi~*~!PyySNDsqAmB~?+xjF4xOC(d<5k-?6O^HUxh-sv!c`=nx zTRU~p2T5MOu=!d09hqPRW8m?asM<$F0bQm zW_c)o7~g1*rPp~3UPu^u(F;9{_*o41Sa0z9Ab_h%v33`w%l`)ga=|~k*w=&L#=e=w&Sq`FYzDSowW{i@EtS(g?LEtfV0vso=o$; z`WE?p-?E53Ug2$PC>F#c$YU8O5r1uq*?K5Q%mac%a(e6+6GTNK(X1IE-vhc<^UkNbC~bNQ4$hnH7=SZ@K#wK?*JIkpNz4yRryLIrJ?i}&*R zh0Sj2QmODdTY-lhM3kZ-ZUWg!C@%@LNA(rkH@3)vLZN!xA#)(eu;c8Av9e}iNHw6X zvYLwDXxcV5@y04fjuInpbRQvf8xdtAjR3b*-Z|SbzSZ*x2pO?N9l>#BX=|*u<2U39$v@@Lk7c99MK!F{uJQR0!KLaZ zGkbSII}NQKjh%82h*~E!E(*YP8}WmHW<@cP0yIPyC0dC?MPvhOORq)fC_BGgb^!Df z%r%pVMDlwLsacbn{AOaCR$9gfV2PP=r6JF)0z%Vz4 zASr0PgWD{ReW*Mn9CgwR<{x+-xQ?o>Ox8!y9?yUiock*~X%F#B^2%<>sGFXLV0mDW zucSgjcatCY&cdKapLjLCr5sonE$rJkQwWUTdGfKYKhxtAp<{wLo6kLot-_$s9UTw+ zF6`hyFoD27+8^uVVLARSCJN@SH1;J@#Ya=@Th%wABfnDn39 zrksQf)P|%Z7C@JIKt+i`puAZmpNmZHCQHaZ{zDwBRG2bysW-x@o&{XVCLLxv6jP%X zL$-N%moIQf>F-Wfz2hGYv|3hDOhTKN!B+l-`{Iu9&V!&1EbrwMypS;w%C>LWmfTw1- zCw%6ve0?jt-!Qq7^kqqtvV@`q_vG@wORE|j|Ad=1EM=el43mfCBfg6~|F^+6WV_AF zo9AfEOzpn6Y-|;pfT?CC${s)1+jOd9g`K4VKKj1tw1F|u^V zIKV_Rhx+djJax9gFwOCH8gujI$&YQQ>1LTG+x7Mm(=`0N53iG9EDqt1hq-(UgPdVc zyEwf}0|Z4|^mQ0{@(IfByfDWVgL{okbFZIG)V1*^WzX^slsudVW7niO)s>MrK-41*p7cI+omzJgCh>7YM?>X)A%VTmMm1lU4@V@68z);?st#wxMC(TK~ z8`|5%6SVEC%QWjRJGtY~ddRriand>N-F^r;%;X&3hsa@*=VZwBPS=jjesw3CCTgs}IZ-oM20|tByYMNl)Ks zddLcA6TPelqmB502zeekyGL-S#K5WOCk9y%i5JY+15Ey{Sc33fO8-CC6@)i8)q6Wkg^&xvFI-u*zGlu{Ssre8Ca_~YlYFG4>BVpG z^WVnNu$G|Lb`sy|SQMCkjB5?MJN?8GJ>!r7a8Z>FMwhP07|e=#uU$dV@UMgh+qZN- za{t}aj)>O}*2&~XZZ;%Ed@h}CtnrFJdkxz^+(Cj|qCflyUwCi_8u3F3{;xBZK(z@?h3Zo4E0qB!hA=i)^PPwitB_=3;kKMfPl_1uXMt_oSf>S|4r0M=<4~5 zsCL7-eaqZWj^2D2*g+Bf7@^JplZdTi&w4XwG3VW-s>%R zhQlp*!aJ-r(t%6<5O*&&FeEo?K<-*7pd}t~dTp}T z4VrYI7K9C*KjgI_g?%CU?ha9MMfiIYK*)W)hnvtQUJxb;9Z!%J5{WiIvJ*Pl5gpm| zQ4+@|1Kg>fFqa3nau-DQ!w2RM2b@*+ zXbo9MEP!tvciIdNcy>gmyZ!P6!%sRh<9H$z0G5LE@JAdBN9+mMrwW3X%Bv8(qLvDN z_Z{+85*A|E@O)^iyZYu?6m16x+zCVawRCTDK|t^a?9&sz34)a%kYS#MBYvTR;hu)X zv3rHr3zt5kJ-AMY7vGx2uXirdrxYM>6|{Q=!4ZFclu$#hpYovIalYpL@tt4pOXtLM zG)cA7e*x=5UNNK| zSC%nCxh3Uy1*E1D*`l_)8vMPxP_B)i|G3nj6k9R9_G9NxygZ>mi5W`l_1CPo6@R;J zy*~3ceW8ozsAfzNPhH^QP}e^cz`Dxf=F;W_-CRIj5QCqQRkK2i8$#}AidLY zt->cgKb?;Y8Bu@OUpstnPFEZbOOohCZA(2tLDcWay z(SXQH@&rvH#*jp;&i=pa>F~;ZDZf$JM)y!te!XD(wWH5i`_6o_heyB$@Vn`uO~h&* z4+to`97p_u1LyoCe?Y1#I0O$%wi z;1a2EQf^VxWTlCzfOO=gn8oHpa{_`)7G(vZ_q)S#TmZdg*F6GMjzH>@fx zK1g62Hr_ZdFNuY>yVJRygpcx@nJ;z-&QRS@P$7GW>xq6Hxx$KBIBUu&ug?Gd5jqY~ z*OE%!NxIjKTEqlm@d?DA7S=VaaYM|UP5zj>fM`bQ?k0Ov{-F5;EfaE%f7vV5Df*Z!YnN?4!pGk1^P0@ppSt58|6XX`qfEEM6+MM0#V76ozD=`@dbU)c zxR>F+;~(5<*6^+P2=Z(G(|AJEy25?5gnpe{;lKI5m+hA#A0HdZI_J?TL)$-R)2|Ju z{O3@za!By^Qa_n__@&Ogjz{QJs)fXFc$nWb>=(1ou**9vq0B#eo5lP7FoSzy0_yMI zEJ6Lj`?o}I-jF|hLH_&5Kly@p@Q7c;VEobh_{0OBy&+w<(g-3)DbCrSY- zx@O{0ug>P;ov^drMh||P0t1fH!VQU{)#mtK8(8+F;|vx%Kjp=Xy7`{Ny+^ z_RzVWd#}sLf6EduN(ZJAgFK!a&9 zl~mYCk4jTi9Upp;47aML@|%v^)Hu5;jbPM=A|6xw=>bLi)9%ecvTE%NaHga0Om z$RZL0KrsHm+6?`QI=~FFlYSf%6urJ#bB1F4aEK&cIlcKdwF3j<3;9kyO%$en!3Ntu zT~Ony4x^JzCNkdJ%9472+=k%{Tjj^9wo#NZ%E8}gv8W1zgr)-2aPgBs+MAO7gF7H_ zx|l^c_l~h%_`x5F8a^Ro2_Dg^%6n0?w*@Kf)8rIkaqd`I>0=76sz~@5^i@-_u<;bi^1g7u#IUm zCDTII`wwrs2ttw2a6CPkT?!)SoT3N_ML5pTPWEofFfE4f!>f+A9A=&rpz!znPOxw6 z(|nI-gJQ?JdmgCP6W!kDAl^j;>9f@kX}7q0>WT{u3yV`{q*AR%zNU6*k!E8>b$CrC zbR{%6jz+5-TN@4U8BSs*`uK_w(5l15?*;$rM|3y~fEm<)X=A-&$`9GZ?;);0Xsr5+ zba}$Jkw?Y=z#82!yL`!NWq^{?i-Xa)N_?tB@MYEid-oaU_JOD_$W=z&JX(P8Vqg*B##4u8iH3&#)LP!1?s9}OlBbo~4EYub1(D(ZzXE71|3%K7McS4>h zlhEG-u{Tv&qk8$eKW%L8Zl3p!mE$^BN=Pt4hk=ABjO2hMG(c$YK=6K?K9V3eL@j_o zcmzy1XL$MW-G6a&?s)}(VgU2&>a9Gls{60~TvXqx{#Kqir3wA|*&ph@pzkWA{MP*a zl3q9kJX!juAr(Tl7N#7xYpK0!Q(HgPvOd8U+f;Crvm;?oIw_?-D;=ZwV#7KU>&n?{ zm|7Dn&)s#35O*h1pT2QyPT0q!jvajE6ntPB)~j&Cs;^kn znZ_QTUdMt1=3A^)*IRR?R3r4via(5KliBokGXiL_)S zHq)m~tJSXK6>nv3*YVc7Li8TxYt+Xzr^-Y_ zbeIrPWg_OTZ+cMLKzp z6d&mN^z7}*oA2VDbo7po9MWeWgC2Bn2wtajT$ON$nzl!hk62Q1TkP5GHM&XgQ0@}% zQs;G5MMoc4-p@>5png#AS?f58UX%yOfjZ}5a z>$^qQ-Z9dxQH+Lvhx^w6Z`r(hFFp7TeIm65h_(uP-@$3sI88SZqCXmhCi&tX-P zG37xq%Q-LKYs|9KtylBgLrJj)=^F-mt5n+c)hCh+cy`Qd8LbpccG#Z@l=;*vZS~IjTg6%dbdhNQyWL|Ya&;}a zSS(9DxZ714R_!3W6(^}S4cKtt-?R>&Vy{k@KCi?&%E*tYsOt?`_Kvi0mMhCUn|T%7 z3sT4Wm&FRg7H!LgiWE3?+;XqXxbRME zx9h)FDGJ6a@_CPOG&JI|qU;;3j4Kuk{azRZG{_7%l2tGBASr z(t}MT^GKQ!UQlONjV?V~U;tWrV~(_RLHz0IK|p#s#8@-bRL?(;BC&1}Fzr~pe`dka zmpAa#dkyzou#VJL=}y?Iv$9!w?7gBKN5JqM=M~{S2V$V|%ifG`(O%t7c#nmu|LShs zAT-H6a>yp3U5<8gfV5k+%$uRjnze^}vDisZrleZM+ySkW>$?Vd;fYDA_Pc`)A=$aH z&M!Bz;h;3t04hUd{dU|I#mdE;z1I5*tx7UY04=K?w|*@ojV_mR;$fxNK76 zm&#p6AF!Cat<7qsT~IKSdhO==*s$Rl>ha*Lm*<|qj~3qgxD@hEQa#_l3YYwK&c%c? ziN7QWmHP5Tl7xc(dh*19BtKq%B+(?{B=IIOl0cFiNsuMTC^acQK9J>k_1EydFB+Tt zPL7&QzcbDA=`QDaUsN>ty|bFe^ZAw6@_jB$H2p7*J}Y-KNlE5Y&Y8Hppw06=qU3sR zk2ah9J|w63oU^F-U#^f>1|C-iHqG-jDY%$1n4cN-c@L}S-!7c{yw=p?KQEH|K2qxG z-Y=l^zp?av>+AELR$t#QEcJPhtLHy19{WB5*Q3vFQIaf4EUupalLtziBwh(Np-=LW zd?w-uCI)%DTNp)VY5eba&JyRasI;kWS&%O_T3%W7 z!$QR?o7z%-jwZiM+fpvSJP0wL*2+wN_83y%?|JClkl6c zrrMoV?s?H}i5|l|WgX>=24DTTb+GN*dQ;6xw|}%He9HA4*72HC5bE8iXz!-ib2{qI zqvCls=zYDq>K)0vG6z%M>{VaUwdy_0YWmn@j~k4oVr^@~_W{}Z$bGi3CPGj``y!{O zEbX5l_v-bQb<>kSX%0}Qe~HS4C-Tfo5_eQ6JA!w|KNVh7^#8p5fNuZ2sdxB{551;e z9W!DFq6XRq8n*DK25hP7tSZ-8Sg&vZ1oRir(~R@g_zSCCE^PtCv59u}E--q7%2a<+ zNqa`%bd@ES9H)w1W_K35n9`x0-sC(jk9MB2NLQ-8*k?`E6w(m07V5EdqotV@DXq*p zYH3n2SJcv+I|t_nbQ{NG5`*G}bDM}zn)AW?TLjoes0uE^{=9o@|s1V-I zY?L<8FIl|}^P_#C)0$f0J!XoPrMrTbO1;bzvJQ6D2u%BT->>&5tozhH z@Dea0Ls1Iu1}95xyO>Zidu6;*K;h5{;W7lwK6+dT}mfKWI@xnW$Bshncpi?RB}`W+axE;d4lUu08sqQs`K zvEW#3_$2A?VzFNP#GIGRT!GGWKA;-B@h@3-h%XZ^cdnBE+vePhIhwz9%CC>+4ZyQz z#q?2F`%x=x=dgP`=qL{Su0JPFLEovnITtE*|H50pYoS)Lrfsa_#&=H!aiu)9w5~+; z)#@zr>-92Bv$|CAURw@nlsoO3d{^+s{9w`cEzxs+OW;uI^8P0gNwuJJ&LVoQkbOFGxqiO4 z_6-^~HbuHEhR3 z{ZxA@phJ#Ze!Ku3#`odXx~L%`wY9u{Jw2yCkT@8#QIZ-o(MUIiiM_5uV%xX!YgMo0 z1YU1PuY3r`D3PpDUT9XIoh9j+ES0dG6^n5qkp3C**CYWl@(Lhh(y~S^_n#eeoccjk zLKej;VJu`U3Hs3)xEED&h#*qjn(2WiAzFh0jV+)JM}Io)9K4ka7FZcJaufY>2(5nd zIB%Wp6i1Bn*avC+QiATGf< zTA&4wSTw9}Gf9e~XBy3v;h@ZhbW5$SN^UO;PZzpEZFLvcJb~^U0Up>%AjxU~jFgoh z3&DWt1inl!3xOMeSH4GAt6?Jmb*uiM1ky>L;Ry0Mf>F7$h19-QWyo+a#;gj9B*(t| zh(26KS`o%d4UlzJTd64A-CUp)&-D^?xfp;kS3}U)E6K8;%B#x9K_+|Km?=#w;YYn5 z8u;p(mvkG~Pp|dDDjd6b8vrzpvoqhcgCr%K8LLJ-lb{6-r#IKsgN%~qY~vS^mQS_H zp(;I^hkEg>@iqm+g>jhm!3h2V!brJFT;|RSm6?x0dJZ$Pk~CLTZI6ww>?RSfq1r{} zyY$p}mRu;G#>e?_bj~c658^v!SwgmvZ4fasU6%cp(UiLb<-@apq_&D#%6%@IN6`5m zYJZK^OQd1$K9#*CxBSZDtNp|)yqAf)2GiBN`yUN(w(bnTX+M{(u`a3f8^gYyduLWT zij#Or-|>FUnD}H?-dRs1x}LEOp7U&W+A%Y&?3We)2Ipe;MP%~B{iday=2uR%v{zb; z)>@P=2#C}Gn0M5XN{3&>-Q$j%N)PJ7C~k^qh!wNkVzvOKc6skiUKdSxcrV=E=-KaX zU&`t#;+J97SD@=XjGbS+7tAXUT3p?~2=M>=`AV5k;+uWVczFSPZK2?A^cIQ5G;8~CRev2M9d)`KZkF^-M~HtuYI%!7 zHM`VYzNh^rP3v?mVw?6QN4$84?oC{|-DLyO!Hu@B9=!TkY@g+(8Z8}fQyIt(lgsoE zE`&{S9L>KGD@$89iOmaZ#yLT|Eh277yS0Oa+C1&e+DXFbZ@Stsk8Rm*OgMlnwr=}6 zH>^=*>9B&sXY5$*iKr5(w5nIWYP;T{`DxhJ^NH1PpLz?|=^2{N&h70`KWWjQ^9oB= z>~!hXRMaBSb3~V`|ClX=PPFvmA7>8_4%FovnaGso(=B*#Pvug>incmcdUnecEjZc> z&US1UtzFw4JUhFG>B9C)6JaJWz0-2NY5T5YgIVW35NpXeK9Q-9>7mP7t=WB;ar;X7 zK?UF-s5J{V04>u?we++kTP;5K75j6|b~F|K-;irQv5^m8t53;$BH9!ND6Vj3XRCtl62m6(cnM^U3o znldIFw(8jF*3V_vJ+Rk&4pmzA`=#qgJn^0`=+cJ5-*(YS^>lUs=l`CkU*uBjd2-d~6- zju@7A4cv@mB$nLE>^{`Lqu;LovIDXEuCX~DlK+bzx+%Y8S{pt4yyn~#CyU(Tj3x3> z<`|!J$V<273)?N&urX^CJpTeL^394-@*U&c--Ewh7WXiFdZLq?QA zzL(zl@U$`Jk2h`}pS6mwZ4PzpPjsNm;~#Y^@}VgRU$7wbc0&>E8x$~G{7kV|+pyEp zkUjd?rgM&0$~e@=-^f9SGk~XD`e3hP)~jaKkP%V;mBQJK^bNN07?&>p{eti(O_J-+ zNAlUKH*k_qu<_!p)FjD2V7|B|ur_&{UP5$XjDBtg@kL*;WW_95ko>y_a3GWRuNXFC z;9_Qc5--gvJl@1eQ;DU=47)F_txR<8mk)uUXA(yIK|K-IjpgHF!9rq{v>{i#WN~qU zd?umcJFD6*Irb1Epb=ULwG%eyB}OQGvIVe8c%NEJv@p~)6}T6k5gySF28ErFwJYPL zij%H{6@1oHkwhhF&?>1Xlc;4#Ux{|R%@ep=>F;ugHw{{lxxTQr<`BDfxmGSEu8(?% zDlJ)}Pl^*qU59{m8oc~%e;{L_&*=|c=8riNPhc=5(U$%6nZA|{2n~5ep1~R_NYkrU z0$?_n$-YXU*HiRFjZrE5%Z!mx^CrohvDS1A;@f(z{Z52tX-edK9*yZY-^t$%k*eAf z+;Di?Ht+@r(rbjzQFzRA5S5aRy6#?Il&n@MRhN2&r5inu-y!KaLEKJN^cC*ufW?S@ ziKwEZOUqUv$CC~9lLL~pb;%h+gOebEL@;qnOEabI*043u?B?k9i6^e%O~P$AkNjCpfbAM{BQi?DVw?=$F~Luki8V;- zcY*P8iaZ)!lIk_w17Rn~EDNe4WZyT2q_zLgjBjHg9|3y zUx{lo0Ee-F1{-R;4MxR$274RtbxDseVRO8V{Om(=UPw|!?Wjpce=}ua!@#Pbm(!Gs zCckh=)5!I{%UKVpHE4&2aahkT-dwCRheanT?(P{Q6TDYyoR{pqM%KBJ(}H*8>l)_0 zm$SO2o-I<2`br3!(fM+vV7W0K!S(@GI5DR8@>y(Hua=DnjnU|W57vFQ)C-$dXK zzb&#w49A8x`#)%9Z8<8)9C$3MIhZV}8seuatC37Kae^#Q2j33ND zWU6_2Q~wPC$g{T;$| z$@<12y#-C~z*pv1Cir7$k;e6=ZURm>&-HDCF#{q<;?yvzXOZ8Eu;s~wB8(OFmwZFb zy&#?18VkR%?WXB7)%>$~VRiHU1?B79*+DVUj$PV0Y5M6pWC4^Gmxt`UvV!#VUuf`9 zf)-~`Lt7qpRsgS~-D@X%Qb#10cOk_Us0rxqtC7cGHrTJ4(h^g$ z`s>nb%hqcik)xwJ`@5d#*wsFu!CNPo7QD{!{7j3XEo)K1XP`1X+Lz)tF+(9#;#Hjd zn==B`PnMQk9cwk3*4$Fid?}TgPx|Y`hFU{JnE$>XVCzUC7tDHV8k0I`Y+9xLzVY^# zE&?M~hJ!_4sg&fpGQ|jSk#h}^Gx!hGVgeSe8rF>5b|kJS2D4365PXYuM?%>@ZP^YS zN+^D`_Qd}J=L0hwWe>%ftGhmljFbx6HxpHQ&hWbo6j|WdG`YFuq0AFETCE3}`5}}u ztraJ=618GCOUh96l=6sl#1mE7l6BY-}?gLR?lwJewn2Df-WiC+#4MA@QL$pzV~T-vm7V+V@*7H{djGH3UMs{JwdQ-nGoM|+vVw5jM& z73Hhg(N3)RPu2kV+lKaDY0#f(ANDyLM4(`|J5+d;!Bcm4JaQKUYP?Dq7PEQ;r!lzDWvfU)uHu|GavhL6pAZ>lG{_yFes4;Up|BiI= z>+$CHr&Fa!)+^={ilK7ZK*&lln_v@HZAH^oi&g@ZCsnrE6ZelhRbl97Lt1Dk>WRw~ z>c*7SxoAjEkDN( zS?wq@*GD@$?pxH5#=7BceqkOHarim% zvoG||xoqFlgn$rJ+V08cvg-ku`en3F)y7hv!0xE)J%0{J+gh( zO#(G2JuP#lBT2ZI!>10|=Gww|k`pFQd3!%cBY5=oNv9&63eVwjocxNe!xV8jwCPCPiWm_cj*2u@3AyT>oa#Jp*%eDwp^+Rt#W_t1r{Z`}2 zr?>jtn7KE7xb~+p=-;8n6+S(Mc)cwc3BH)4Z7~KY(8E{beZ&bWVjMR!f&uel{z=ih z%;R`eA9NwZ{Lx=1*ub=`Bh1aW%L`*nW5+aLGtyG;gkv}%GR-0LYTy#@Tr|5@3R*BR zhZ)AELB<*|lB< zBtnw#3+(O{dB^YYunTgxN_!=HK7hWr2ycYvx$#t}IcJGX6Am+}$%Rdq_s>Bq+s%$jO3 zwLg&4C1`!qhea8o1WI-NV3X)Oovgk^jfVAH8PZI)VeG^k8~#qmm-$aK>6UE(g4cQN z2p(t_BaS)s3bhuto(yhaIBFhkjndh|u!SZea4x$uX#vxW(Jo1Qau7#TdWp`IY;C4W z(n*78ba1+C5%#e3EY&t9{p5-X(s71TsDZED?PpbX?^9@d?_F_gR*v_U31 z4dK&>fFUq|?%mCDfc{)tc>d;XX3y#I3>HpEv=hquN+oHo<5f(mI(8NkVj{qy)Q(QSKHQ-93uXZpTFschND?h^gNG+|%8)v1Sx6})`+yU8jXC(G z4MCj$TZh7kQiK~z!WPp7J@jlDhr;73dd&GBS8zKzuA^(ggwI94QL9ckaD?I^gHe8` zi~USIQbMJR@`hSfzoy+(=l72WT^^>*-v*`@{FHRa z!lt=wqD|aoKJXWz=zrpsGex1v*AOY_Ef!{)WxFKT+UFHdxth#5s7V5m_Z}=MHqH|| zZ+1yet|A|L98&562YgsMjw{m6DBtB9-W3qtl98((nFW4fXw=bYP2K0)V3hr417*yC zmAOQyNL}@h{tQCK|Cmts$_`3a3B*r0&=l}A7CNvPFz$ozRwO>35)_xV3V*k;5@z)-^1;sj^=dU#17&x|Tt-w3wS|Dl zMnch=P$G1;jSZ{gP>%a{vl{qC<#gt8^;j90kHMV;K;K3>w`V6%2UT@!VI6@~HJdg0 z6zH!qH?&(>r)5L6b(DBEQ@1+G{98}W9X<&MBWbnWCF)Kq{=^W}?hI^0$~*C4vzU)) z9sfhCxhBi@C=<3cl4`6;-_JXSR~V9x1SO&X>_Wwa37dk8O_k`YLk(1RQ3aiu_z~q7 zdmA7w^y8IsOcX4on%Gw*&Do^6uY^2Crgj(O=W6OG^Bu{O={Wy%?e!ic7q5qIEYo& zu5P=g?LM!nR9ddO6DtMfdF8Amb0T^yv_dC62$eIy$3W@BEN&w9G}@<4Z(;-k z|1~&wD1j%Or246abGt4Cq4pepe&tB(f_nU*G25!?n)b>upHvt5hLXHSBh6crw$hWP zQr-%(+E9lb@r<34Ns_+pS~?HGq`dE$fVb)%m*ajt#|d@dw2XzblopJ$nkMmCdfWi;0a0cdPE#x&tc~>j*D( zUh@QcDtO3t*<}<$XtW>+w$9e-=w{ms{&Sv-x5b3>9#@t+ASl$u?>jAV3knx5SYy!iV?6hX=XR}f$_KD84 zL+prncRz2i{Ezw+9bl*{bEFJ1TEJhBnaB0y53tL}Kid=D_v6L?A-rCD8FFb9i3AR( zT87*xm)OB}L)dC-F0QuA+@XdW9^p7ZJn1{|MzWi8t!YV>p6n#8hIbv}koKlRvM=#D zNlgAMN=_UZyn8fw5Zbo!Rz0w_`&vKkgo8^VmI~ z{mk-&Z_GE`Ky3I(b11ld2Nx{1U9Te8u`1THb$-hDtMHvJ@q>%>lJe_L@(VM`(&Y{W zC8IyrD^bwIeH(KGsYjS6@PPOCRU>u-6hL%Af0FU&moo)!K*8F*2nnpn;Ypd5pfPC( zWkGB)s}kGmprXlwC<*UHT#3GV@La++Xx0*BpZ<%bpg;JG~L?yYeG4LB4Fb6v>~gzJ`j;MX4R`eB7jVd0 zd6eKG!Xx#3W5Tf69YM}_eo8Xs1WB06M?Kj1Lk>sj z%@m>>yI@?p5uC8R3g>fKhfCq{z~)waxJJ)p1wm(+BIwcPb#SRo(Q03~@)x~arHe@Yxl{%=yaH+Lu*8VpBGPRNce1#u$W68A>+)@Jag zaIO__Tv0dZ!my@*co%BWWH*b4;bw}aqSB}(^Z>B%9Q>Rh`sjMR7LZ~;zrjY_0vf5X z_D}x0sgS{P&?R52x$F^ja|7Z22WAK=6<#gnMZ)-t`*SWqzuso{af{&?#vTrDc4#U7 zFZiDu|8_SZpVd6lSp~PCasvMVNB98}38OOCU6gCTTRhxJOpAjHx6$>Klm%-5)+E@GPb;=sO{WIiq}$FsDefMde{F zYt1;?Nk^5)C%OUite7DA=ZS6x1vi@tFg)QGx&#(~RZ|U;WMUeS+n~p66{f(19o*Xa zdI7KR0DZ#92Eaglf)RBhrY9PLN!GrSbjC=c5WcWirMY9;NybF&w3_)Tn9baYY!F)p zBiLZRyV#iC32%7Vo%9WbK1G;FNB1KP*tig8HjSzCh`XmNYCdm?@;-XQK*k1|| zszNdPY11b{#EmmRjWg*lL)_FD?KwW>y!YQ!J$n|-;6bKf7R7X3s9k;6u@^0fG_EqK zJj%61F=q+kj``i<@cJm>-c|9u2mAZaxNQ@7Zl>&zE@)|JGFzW4+7c_>V9PZ zu-?!)$c-mRM>!Y%0>QRx;!g|W5cPL?>AF@)U0;xr;QWCb=F3zIfJTkqR6sy5)- zWi!SulX(yd;3s64;LHxYC1OO0j$pbu@{QCC7GPB|tPW*f9%Z1)&h{snag`vsXHiaz zK;X=8!o60;Ee4TB5e$EBNjc{r(b z;$@4+WINGyi3^|5n|gf}#NV^?;W?r+X$6p@8ydi4#yAu=d2;*;!yEdL<%t4jKe@fa z4*Mz0p9Ko%gyKsCK9A!@57*$h7D$#Gwggjxdzta!$3JssALg9($U(NX(wCGQJg(W% z37RGq0yIOXOFdZSCDcw`UstG>_%%gfK{TWhpuxJc2YChXjJ!Oq&?TbZ1+pw1v*SIQ zP;A(>JNes_uQ6+6r)G};&el67SRjLYG;4=rHq!^eXj~mhK5$0YRP=cVlr`a{n$WBo=oaQ3S!C)(dTD-(p`pdQ zCq$q#1kcDBG0c{8knvxWX8s;=5PhM^I3bxM(PQmY5m*^54fJ)8179VmBf+>177smiH(#6c?d3;4x6xQ zNY?Zzf+s0kHgEOBB{Xy|B13>JP2QMHNDu6mT3-mbA$rW6s6u(#q`brKKqkcXR)l89 zy@^}y zc>E#+*qT59us4GUU}pyD&Bg@UnS=qn(GmveTtWb-TLka5W&pT0Hv;HX!w0xFQDMRi zyv>3c$=2fDk&O#Epq)KtOZ0V(>4pc}AW>HpH*S19#|J!9I3b7{u-S<6tDm)MmJT1N z7Vm#-{gx>}+^m>wyNUSv9wO#C>>Pt4f{xlAxI<2oCq5lX_WgXW)9>kKAj1U%9`0ig zronE)-?|d0P245*M;*OSxSe|%F7w9xi_bK8R7ZH5_~A;DFL)O$;Ri9gEzs}C1}u?+ z!+PJA2(Z5R$}RClhXgnD>Mh|1GrFxV6zK*~*YX_ms8F*5>bn~-sK~_7?mnXMhLgk& zymIydOu~-|d*-*{iY?xi5Bd@=@r8(lmj2BcO(5|FndHw!V|laVg}_8GFjA=D{yI-m zq@2{Jb^j-*aSI_rRT$;k&Y(uKy*l=LVw)Xl_}c#R6y4G-+_WWSWl7=Ucl&()iZGin2}ze)|gi|wJ=n(d^1{`BiRzD8qoGYEWY$-Y3n#umVPl&tH85le{c zVhE_LP!HF)j3CG%KRkIw&cMs7a5>V{#!MZ@&NX&Mcg$5*VxSfAjZSVp9;0X;%ws>O zv|P9g1{6^uq!C12e*9l|13lOTDxwKL#1b!%Yc2xCYW$y|KG^T}ykLO~xJT zPR<+Z3W~LlezfOopq|=(Ab>G0p?+iqc-dB+lJ+lU7$9pf>_MgVun`Vm^s6KNA?#tU z9QLiw8${R}ZGZ-Ujer%m2q=`eO9P&HZ6(c@Yud^Sc_^BtSIkhwc47;SIJUHaIDVws zOTc&6wVjbaP{bP8B=}o+eIAI5-mo#~Wq^^8)QWiZcjhgL=l7HCXTnatX*|wp9%KSI zB-1j8&nX|XCi+JN{wmcy&eR(9gqUFlnQcXhq4fsBI0XIR?@f%4+d<)<^BlM6Fr2gB zlNFp-<-~hkqcYpD<#EE#&)B6yx z%Q9g5unxMzvN+mcYOml&552WZlz?Fz&>Fioo?@@dl>kjPKjJ5Rh?9InLfR9(ijwq% z9Hb|HKp}0}+*M2X!H(7uztTeix7MG&vlBUaE8i4ulpYHKJub3VZgtm&NcBs9l0=jH zuRyd#Bz^G5kZ8>mV8#d`Pg-j`f0lG%mr+n~-_`dv?!@+@z@8|G+mR`7>$=r5vFfEb znAIX)Yy`{dW-9_k`QX5bc$#fG@JUJQMJY-sBSM{uV>*k%_l_may$5LlLY*@A6Rx_1% zG9<>REbPk9|G2F1;wAz`ljS;N80d#9e%`+nu1kd|0Uah7GW&xxaM=67utys&LUJh_ z=lcgqoCFjOuBTixGOwS`1vjGssraE^BtYpcGLfS6GYcDy_9Cc)jp*+jJ7vz`)?jQX ziWsBo7dWYOvzI~Z%bS|7^3>yZ<-=YBzyZ}UHCdhxF_;*3-ViJCNBcNRD~BCwxR{%R zp}>u`Nh%HA+uK8Xv#6$TybfQ)!_Xmcco6IZ9Rd4>fVV`62r*P70g1=H ztU3BMd$*=($_)zk!SJW%TuFp+H_YUiq}4XNx1z+9pvw%Eu%sf7l!Qbw%MoRMAqjP` z*&zp_A!XW8g8hcjpBHQ-&E%$42vMTllD>@>P91yJ^{wB$vK7QT8?TDLLE1O@JRhry zzg_zCfeSzl%o<&M=}2~OBn4XgDg}lw?RTrw1kfgIKcdkWLzZUTi}d3Ww0vydex7>D zroz4n&sYvgcM_M(uFNtozb`!cRVxKY=xGx^qMR56PE3%tdhw}iutW2@dp0QVvmZZ8 zjx%@>7*Y+-i)Ia!BF{ZU#Bcjy6VDuSX$XXLb#zRktKl05pBhGxYOB8jNqYt%YX~wM zeJ?t1L3~;A-Y`!Ct<%LmapvNka*9zRePYgep{F|;`$Iv-A0L`z0r>O5#1XW25iDN> zX;R16EV-kNGj(_FVb?j3%OC{3W7ND^#Q|CmOy>Z+6T9Z9FXA{75odAjJ2%D;;#R#> z4DzOtX^Dk2uLaEltP`#kpq_OAv$=QsII7tNj0B{BM%kVCA>uqmqZDP&#j_;y%95a5iszGf+_vjY&6WHaPf6biYglXRz znltI;oL>e=fC5{|MW_y;B|V;TFh87Vkby zjyh{Svt6?tsb<|n+V`*vx^G`wZURs0m)^0Y`}3#DJGILl@(UlLrTfQ?MeEopyqZ_? z3>@kg+)>g^E4@~$*l+OL+G3Z4XgyhV$G3 zv|KJv>s?AN&D+$o*j&9h?mgiSNxmZ$$LLcX%oC308T(U4Iz)clBa8tjBPkRJJ)78H zdkzSI9M}zOcxPhq;KT=8eP~{lu8%uD;*R^g#Uv?CK>X>m34}q|h~+#h(~X|!Yd}a~ z*9>-3!+o9OO`ZHC0Jj(W#lIjF}#gWhnkB z0W$&%!cSNcIu#e|{q7ztdovaDqR{TwM98`_qbmaW9|e#M^|}rU7Otu7voLdTOeysw-IfiDMcc07VIZ))w{8V!00Rq&u<$VuWakn}d_iDc7a&1X zr6+ZNbYc3ry&~HNXgkXlr^n3X#8_%zCuX@az*NC`;$eesGY1_PUKEO0*v$t13ui%}6YU_uP8Lx2Gh?%Me;>oV96EiS*<>htd+GdSb99K6S z2Yxo@?CUE;rJbk0<-@4+2az*pUNurp5CkhywL!q6y($~ZT=xY#f=KN+tQr>77my&P zVhBny(P*-k9JPvhO?6!PWNg`G1r8_)@}O9(7Y)sBObrVR&Pi*xZ?z&2gqs$}zQ*HN zjpMvGCtyblt0@GMe3vKk1Rq!*Oc(?O9@g6++H3#1LF3|N_v`i#is{8P?xky`;WigT zKocmDdq7i;TwuF39Wc;oAT$U9(52Y~MvLz4n*#btOIOwS>GWj0@Yis4_c*}^U=%!& z;lu%29A;t&0S-TI@I=aFLR&oOS0j>8G^iqhIOn+4U+OB34$zER>537y)Zj#tpi*@@ zYlDV6*IZ@cv3P~{9IbDO9u!!1vI%!%@1M)RWfoVADKh4b)dFH#Mw)9x&jojk zK{>Qks~GVQ;f8Nop0btAhI829vrxxD)X)!^!1i4alYQjpq`pwE^uKig2t3-pZJV&TAez(jFJ{5F>MB#4uT) zg4xH#MK4#j;H(20L5$?2jd+=J+5Pkj^GdJF&5T*)FKW0X93er%ok2UOb!J|ZHmMSo z($tuN)-Mn7Pe$(AuY2?VS7kG{n4bDiF*5+rKVCl%!O!?<)n;sA;^b;hZ(`_TNbh7~ zZRtX7uVs=imtp@bB{z7uoMVe?D*y1^|Hb-{zY*8M^<>^;Ma+&t^dBzE{^+ z1*JM@S+_+BXWOi@v`!apmR2Ps_d}o_7HgF}`Fi6uMwZBiEkt%A-1>jXY|k@a>@@h9~zDPs%Utt4LStxn+)BHzvl z>HEVfcV$yf&n%hgI2c1F4#|{q47JX~7y;*6kd>tB z2S;yN23!%MwoZEKJ3vYWLIZCPA_<1lZ*~JydgmjH)6KJU?Ap73NXWfc+~?9gZMk^x z0+$`iQQK~ftOf(>Lf)_HqU>R!GxJNsPZ+2Wy%&qDaGimtB6|=`{WlZ>UrVAP5b}HWC|oyIv22IOSxF9sb}@Vqu)c}m z0}yE$WgNwMQzG}(S;#B1=TRSB+2%ImGs2LYcyA zGTIS}VYAF4hy+9YBE)TNmtWT*Mn|rEalkv`3r`gq(Uo}*fE&uoG%Z+1n+8_o)Q*w! zrFLsmedX_^OJVDniV&$=PI#LcE!&hBIEv-jsnaTh;rGmAdSEH|wZ3w2e%(h{DjXJ5 zI$6^B&-40)7TN6XCl!zg3vgTq53fFS$!r%Hl1Mqn%h5F>B`Ix|2dN|-*F ztQbFP%qW3=h`n@MB}+58C_g1BGsj3hIWs-WP`l7j&Cbk7KP#^eKS@7DCow5S%ML#& zBgrB^MJYG4NIxGRGd(j&pH4l&Lt41(jgOSM92M>a!+gOdp#Px(|5(g1DxMP{C;-3= zH~;|4|I1?jsR#eQ5L?wrdu&mZ{8jt9Y85LY#7BlA zEw;Q{v)oNwcefml**764TJSF*Y)8R8`Ca-9>hcI;ByhSLGj_|hUM;`(qpnQ$>(8wb zv0rKNJFnF5IiI@(58NGh0Wh24{?`da-TJlSs1)x3x!vdMReA1!N|!V&7#>X9783dUG@s)zGc@J28S_mVwCBa0CFo-gUjJ>4E zT023Kwhn!&a=u!Grg3+_?R5o(>)2Zo@dH!DB860f3K@~wDD$+C;A7{ChNWS!nnZ-1 z&4vP|>#)mQ>2Ckqrj&K%GMpZ4{%| z$}5^%XCV1z*IIP|eE;mBQw9O#=#6m9Cq|itk~)G*>X3}o7(>q0F=b*M^AHr zSN;a56q#OEuG!ZXobC-q2ODw-cN7y`eFx<*b+M<^iD+f37~OVvACZ(=cDGdeYnOGf zKT4iFeHG$vSJ%X$m#*{hT!Ari&XP3SQSctAQ=Tw*bt1vaW|Y=6DzWhgFzsuB4%c6y zycj!7GVd?LgpscE=p3gcf5sz_kKcu-|K4d%gU3fN*u>ImJQG$S%$ z3hXg>VYWn?^b$(Z6m(!ZCb3ZI3R$VQ)ErNE{l$fl}sY)Ldxt5dTPk=Y2O4Q}qQ2S_3f zAR?aVjOQ|FSV$qb7lzPnw^0pIz&p4X*wil`yHHXJAVr0+r%zWJYbo9AFsb-qnC1H_ z_ktMR7~+<{5U+bWK4tksz(ugBU3@*nTCOg6&i>S;%AI$z=AHQVsFo^&Ab|}-e&I<| z6e9CHN`+(1P~c1MgUANb<5DSe&JY zAQQD#_Qftm>XGQ*!EE#?C)DtxMblhcK;iS34O~ly6C_JxpporQPL=o@V$G zf}o?G2*DHVT@7dR913Mh(iKi5b=DSwj+r)04hHkkmF!?@@|dugX)892oCxR53$3h0 zTsau^Bam*v`DYv?au97HxAMys+KlcQlX>skBp<6XM+j-8-pc014k!6`w2ZbFfI8wS zRM~PQ9;~_vZq%El87TN-bD4cYn~8eMK^m12?HNpE70 z9kRlWt@6i+=tRJ`Y|Rod3evzWp=_zY?C{$H+g;w2uj_YJTi@T(;Z8&`wP)xFeyu`Nn;Ia8jT z)hR#UIjipLlREB>(e3KFXdU){KNjAxolSL>o4YkYkT3u__#lEG-LYa!e}6##Yk&BM zS=Qv65Qz>90AK(C0D$-ZlT>F@7w3QN2o9dMDzeUN3R-CZ!&i_zblO~4%&vm!G-JD&nFLvPgjcN9U7uC4fhRw3%!Mow+ z9H)jCTkP)yd9&nsD?ph(M3WQvEYQboIF0^v5am1<62G#V!lwO3`V+trx-tvCoB8LE z9b8KB^o*c{BII_x_N_pgCex(FASKC#FtKAdwtVT7hqUO?oJ`)Otd{5Z7Q%~;9`Xxo z`_qmrfIZGi1Z^FpTzb=MFmZuZG9zL<21t=X?5QGSNSsaf*h%$0{~%v!_6X}>oF8gc z#=}Ye_`Anl7@hpzIYrf8c(p+=94$sGntolL~dcj&DPRUO9W`9vY`ux;d!2m939+|dw0itI9Ue1B5>tuC~`-#=fxOuq3e zs^e|y=!cKH$L7~rLmnh>^f`ULa-&aQgqF7&jWUpFVC+2{5;68r_Ga=-EjUglK(J}Y zGg36!KA1jOG5W7zV83iYh&j08c6QxPaInj#@*SnjVw~&sapY{CY!+%I*jI(kD^T3VW^vanp9RN!ZN#!+!z)JEioPG;I}O005H6 z0RRa9cS;%BI9M2(+1r?y82uPmlUmmH>k?_7SNeh#hyquR)Q^53e+^K?c^&1Euv?j< zWylE5M75DMQAD^-AB?`=^NP0O(0QZl0})}O$>^tjbG^^!hE6w&^jbwXab(rS*_+nz zaaG6PYAw!9f5(o$XB+v_b}Z$hJYTvj@g!h`dS$X1rJtIuHILVYT1Sl+7Z>;F#HDRk zHsioCi6yU@vEMC zy--Z(%%gZ?#BVx$TvYU$Ghn!Ef0#CC=+YZ(`C443SN2t+lo!f2+~~Up6ko-iuUjhD z(9#Kga?)m_iui_epI0H2Riv}q@!4KwC0|^pvt%D$Ke3^@U+F(Ot@%v`sq2@?-Yc`& zyDSLmx73PCloe`XuI5Tt{A zMnJ3Wq7A#bdRaaD{cG2HN|w#ya#XEDvxGrbmNRz9fy-V#%4=5cyghsOiYES^!Iw6* z(1)t=3q>44c1_Q*H-CHkHAKO#?;ad+lH-x7%ybtm8bs1y>YJ86n(#F;v8XD2NEdhh z0>BgbQI|^&N{o9~w<7+TCs%fT`w^K5zN-fMxqbK%Qz9~^>M()5mV(F=xskfzx$wQT}|5Ep(lrR=zecN&8B`-Ymx5h zuI2Z$eA5UXAN!vezR!ug?mq;t#U%`+%OR=z1RmN^41uw5Xs@>yC9RLFY=^l;i39ZRyE)iI^>oC_&}m<^BO_}J7Dft zP}9rp?%=p?nLvaZhxB?}eDtt+W69Q3bsBY6)YI?g=e&`P%-Hvc{;HOb=n zIA|xB9`$Y1bc_lWMIIl&rB9ykd5ZXzVx}?JLaVP+l>W4u(k!an2!l_vXYY5~K&?rb zNfk@fpXPRVb(ixLHrd>}qUaRm3Vr@^__KIH72cYIN5Jm6mS3*4Op!^tFzl<+dL9mP+AJnRc@@OD^G`q>GSIbpM%;W zc$K~GSl7HO<72;u-_Jcbf-2Ljz0yF^{}ZC8hnT{Dqq8@HNrJq|4fd;cTO2NLggH$0 zw+}bxyLCPy_@}~SiZPm4kC(R}*A-$eB%sR>4E6MO-dERjYObLeHK`U+)VGn(>t5pG zu6M?r_>{#)N(@G{owp+^<}(+ZWw{PeWy41gJ6E7L_!0^ken-gm>?b3w(CHy#~ot73C6?mGtx~ej7UHCZ&u&%y$Qk z;wCXRNUq7ne!iY=o5U=PNrj4mp%y_IZTdV+LO$YT-@h&M3|Y+DA&msS>fFo!h%Ey8 zU-)f{zV7f_5s7FT-bi#q@jzkPmUbd>fsx4nwsKH{>1^O5rHrg?uA~tos1jySU6_Mb zI;Gi9Nm!bV;@ZQg_8Bq}1x^gaG}hgF|6)X>zK*$16W70$nky+*-%>&=z9ZVFw68cG ztU$3%;zHalsi;*#P%1u%!3L2W5F|e6qQ=En=DZN>%@Xb|?L6J$(($t@o5{H&X z4$&nbkz6_rfz(POpezl0C7@1DDpNI@VixD-H+5n3Jk^;IK_Cl;&QaIe!yMatox3=1 zUSdv@5G9EOtAY(y+f}|%MM`vSh@EmmrcM_*^eIIuTbA<3G)g)Nsk~1Pya`;P_zj0j zWY?ZTv(xc&>mn-r$AjEj6gDcAj%!3M8J*$YQ-{<|%X}rSD^);riZ!KDk%Z1+JNkm? zu5KD*L|o+PP?Z$m7x$H`kQ)g&5?yc69;JX5*m2nZHrMysRir5s7bgo=ArsPI1 zY#ohi(BG3tRXrvohPpZ@yGlv42Ea@n(#oSEc}bGPF*2mSMU-0#erK!uU>0^<{^pnpk$T{L{UMl>(-avwMi=2c8FX#j*oO#dB$V+)RXI`V zlHg4Y310|suJ-ycMWh(XVf8$&$xtYwVJYWp%MnQx>;Vf=kt&*4sLGwNVkHIn;jj$T z0HGEZh%{D`)d(UYI*N@{5XL`=%wgUdh)Mu^OeaKRNa&>l{C6|&&CB!(LVS71=FWYD$76@@VFA|0?S!&X@J`CoND zad9-(B}Y&s6hovH>S}@vHAHzwFQIj%G*N;bODaL^tDH`icTEj$TC4habfRy6) zp#Y#f40R1^K}pGUt&Ex}fG!p3>V_HlC1Wf)%heKy4#D4FjY*E@$-QICCf@r)x$oO7r_F-cC6Fmt@bYvv*Qr zuH-h<2fzOpeF;9?7vBx_we8g0M_E^>`sUJ(6*zra6~*`|PWrfEve}|!8>LTU+wFT! zjt#r`{jFE<4X2BZ8)!Vf4Lv{onORD_*y(a;_Q*RKZTRc;rrUWl)sgETa(3G_GtwsD zaeRr5c6my<^hw|dn=6Z7^!~WMP1d~b?v~RTJQ;_|xy8kup09?-MAZ+ zubyy`-8c|7H##97dd^OLejm-YX~o4q1%D&}S~r8!oEWIlyUPreYp#u5zWn~$GCo8j zoXm2G2ygHRvxh-t19OUnPJ1(g`1O~Pi|N$Vk6B7+gQ4=< zQ8Zg4k#h&3`cs|U8Z(7k-ABV(^D`y0)A^pb@KMAAGmF2L#(U!6fm!)}18+ZRAowzG z7=37ytN^iGIlt**;a*N?oY0Z zPDg*HCyKqQR$k0U`D*tp&1$R9UN?D#Z*3;1))0yrs!h+|6nt-Wlr?$zqQmHynPFWk zM}jAQ9L?_p-s+eAB<*@Nr{Uu9C#?%7!s^(~$LnLZxMI$Caxx$wj^KXt{?_amy4+bk z+WO`^nOT)(Fxv|7cMngi0fZ9`d%chwWfJ`CMBdbgPq%E)sSEeMnk>6_d2z_&55~uG zZ_6k(KiO^9FXB*Rze+oehkq;_h5P2DpE>^K!i8=@X0M`HRj~E#moBlW=w#t2W>kKem@6-_2M(A-s?B`ja z5Hl_7j=eK@ZGEY>RA^M%VHE7=-F_*$e~pMjEg_@auky?2MHT_kZhAb2C!>D{;YSUNCIS9<&@ zOSlz~0QUZ{YQTc^$XOWH)I>++G0%j@3122>XxSz}mCi0Wf;E`iKg?(DvBXjlM-qg* z(wlcg2c$>ud$8EKl5-v_xwl-w?IeKhL#DVA1l}5;p485k9#v81WEH03UTB?WZ|>J2 zb@}KZs=)#CA4o!UjVU9>e!%N_EeWWzfWldW;vdzxC77$f9zC4Wp%kRnuFSgi*2u?X zt@ufhYnzD5uXxFUAgS?f%C@!%@UaZDL)7)tpP0Lp9`Yb>zQWkx8%Ye*y4`&4q`L=C zTcFiNN0%F0%zGe~V8`}ht_W{Q%a*@U(Ru~ieNmGIVr86|&Ep*N=bbFMHp zcj->^8|jWgfwFs^iEHbFPATbC|4PDEt&Y!UbILxJ(ld^A()QibQ%gsF`A1J!X1t+j zfBDzNiUJCka$iM~5HZtYfmNLYzUj2FIrpF|PXdv8kgroyb@;(;j+}YWa#WY4{GH#^ zEQVWu`;A1X^Xr%5wiH832CX~mMaQG}?DbqWZ2U6KN?S+hUU+Yz@)jkXkOYz#49&%R-8^bD7@LmO3;&c6Fb z{!h?l4%)SO$IhRWmfwF}ded#@B>^Dt*Yq_qzxWD38<&nrbD0)A$HKSB8dbFjj#0;o z4Pg#mbR~v!4_RWRiXjO?-0M%dAP4F@;yl00vCoy;m;{FPswrStFV;9Hu`5U%vv657 z2)ZS;*orLt`84q-ULu8cF`V2P$FK%|UftV$U3;J{DW%qZV%c%#v@_tW?~)?7e&Et= zXi0)k@Zg=FbTES+6tv?b&^gGNA$JKS4H03_3A7c4vFxnA{C(-sh|N=&*?DypcTDhA zBH@3M6G%G9TZ^vB7+|k;w&^!yyVZPqO~@OHdeCmi za_lK&QB|`{j%~d`*Hl^mkesLeJub=t`7u8x=6djL_PZQePJKqByZ@DKKH!xAdYstG zQ=}Bvw+KQqQu+s3$)$Jx?Djr&U8WcSrqi-7hrXo!()?=ssOwMmUkPGu8~Yk0$ogQ* z&JA5Mk@@l1wBY^OSCyGV`%JR zXlv;FPi0e)wclq$=sH(Nph8P%Wilp@b2skoEwZqut^W(wg%T(rO`NS8h4MGCX|(P- zp}D*9Q1syD7WSAo&SV`kdg3>UWsM~!mUgaZyb>qbz8kYh7tQdAcXb zw-s#ALeGe@4yIyy)vx$kgS!&SQ$p#)od8o}!9_aSJD$oEhd5fM4}9Hjd5l;V*@5R% zn3$bAqT5v6kh4C<`Fb&}aB5@g`kG5c3m8L^hk1PeUu+i=o@!PSgB=;c1Zs454Q zrq?s$7gS>Nh5J3k4CSB>3F-Ne^~I`WP7KRg z-~5_;eh5CoD?i33f`1ABR7eyq}3Hj>t8i2$ z`_(cHKb@)L??PZ!?N*vAHFtCm0rawEeBx_%Ls4*(k(f606d|$J!}SE~7q_s&`>D6g zWaoW2q;e(*n&dUqi3dH%LW@6`I{d#Kb^DMj9GBmp_z<*2x`c1<@-UOZ_?mBV1YItqoU+zg}leJ5;+Er^gP@%Vb zMC$&S?F-vyEne;^FVdZhb|KBwuty&nwY0xOFSVV!!6L?VCBZ>{+n;qpTlUS7)Bo{z zEOCBAa6n(g*tthWpeVqy(A1Qo)zvhEsG<$J7}D(6Y{YmR)7NY%&O7>w9hlZTF%vkW z`_7H$SY@)^fDvyAL1a#R6^xMM5hAATF1iWdEBE+HjG?A)EPp_m5xQ6%#%Z~pNPr+0 zo*qr;{lg$mkKEK&!Nd5&D#@fJI&NlpjqP(oDhbc2V}4>|`gBIQH}8RO1?WRmr|JC0 z>JvLZ!bujb?L0hzU%0N3LpKRJRjiwGt1ef2jYLIw=*r2b<;N3mm0Ci73vMQa=35ui zNhXcBMm5UeM|l8wT}Yw)+ha9llsz<28CN$idU{WRN+imaO0%uuHDUB};BO7lh^Dvi z2+@7vv#Jh$EtyAc#u$TWI0P?}Cw&9{`(`wM;ap1bW8#280RZ6tS7Mo1+L`||)bFdd z{tr6&KC2^Wp(JR9I_8+nV=ySVMEkBnN0ppNBS18>G`6Qn&`KVvJ#4#&Ei789(-VoC z!yP+uwANtT;>^1>P{h_|Qo_wKV%GFr7G7P*W&2EPlT)wz(}p0+tlUr*Z=z^txUq|t zO>pBAdep)`)MKwmo=-3*ZqcAc!?SOAAZKt8!9h>m#VesIUGn+HBn^R2N0LlBlTAzw zhwSCYx)ChqJCUp0Qoh_uMH5w@8CffnxkJTo4km{BYb$V?l!jDAD50%tsTquP32QkR z+82{(9;DW%!3utS44QNqyoe|sZ0kQUcs0;rKT&Mv*#>7uHl|2*n2WvZa5QqdBtuaX zIFYv)Y2YhxyWEv%JH!J-u?k_0yNqTbKnyTw92W0F$9KB^HP4-}g^12Wei}z7F41bL ze(-9~S?h_CLbHDQI{SoyUHY|Z+QFp{wlv)zfyK}PX-&+~fw3>M#OKxHjzwIqmRu_B zcjE!jw1}n=6Imw1o>EaUquW+%xp~tS1YQAF*JckNzi?kT<~N%aWvkKbUfXa!uY6HP z0g#o8IN1$kh=SHaophbUd;E(R&~S4!Dq5>^XEwg1;;k8wA%qimE$vg$0R?2cDyV7)A9is*~ZNySxZ88|f)4UD_= ze8Mo$^3Sqr;Ar?~mwP_sY}132V1PJ^LL&{aa@r7D71Lvj{QKKaT%yooRI!JR1CZkv z2M;U8&m~S%vwWBijV4lmAmI*8fXzsX!4X?H1Ok(IiV6xm-0`}?;OQItCa46wf6s>c zskj*X;^Abk9S4zadtlRv8CfYWA%X*WIJuba<#`Uy!Q7DP5Ao&tH>=zV1k+})@p>C` zwu@fKS{V0B+4dvZoBySLXgeQDxa4r#yWL5d1fMR$W?p$a{a6)YAu4uJ+dO5S7oixR zU}^34mIq<58V28jJOY?@yKhrtIHg>zSNRgvj30$V&`o2RWV68`D&DvTUsq_B*Zr6BPK4Nl^u&_GVtkS?Z_G(R1Qh-4r&=>pI(c9owcV->(3J zXNRPn^pP>|G|N(;P^^b^&pk71L&gK#8(Jd&e_9 z2j9jl!#wjc}p_l zTPPU#RhPXhtV>95Y4e0i1^pfTTxp1t(1seaab}0UzgM2wS%zD6cssam>e$xl53BPD z;lTz}X$bL(2D)akdAkn+`PF6m=zBD<4u(ni<)+aT9=E(553ILlSQfHw!|A!g@tW7E z1T4pCI$OurflXM$NkV4rL?g`f^&b}R;U8ZcnIDVS=tpQU|96owHvL~*DgP4LC@=_x z0_quDFpx_}3>eWe++U3*5-uGd?~-nNJ_a2MNci|e;)>0=Y#?i3g0?QuC9vD7W%dFw zc~OYc1>}U6utbMzJCILtvGpc!y)>QRf;S&|S-ViOC|+>UCiCgbvKZjgz}e8(aHPz! zv7P*%m85rid(VhDQj=9l>%Krmigfc_P`1=0YmI0W)eM0NIxKS@t%f+@I!xAmrmys- zolw2M7+}EvtXj@_(?&wVX)Fgpt9<;Vg*V642VDYgt>k4w{T3+$K+QS=$es01P{x8` z!5{p)NckK0^fRlkP5BCS;+|ysUOFFnyr4yh+5!GuN03p;Hp7sXYm}~nON=`rr}@@u zBN6ek*JUYa5HhduLOFL*Ogb+FVZ_jd0}(&INg4bWV-$|HiR{V zyJ)JmaiYGi8L|1itxI&Eg-GQfYsJi-pAA2=e~W>$I@D^$W%zJf>u5dymEG*VQ)A-p zkS2ec!>uXKm`$U&T^Xo)!PUz~TAS8q?Xoe89`F3EP=gOO{v}|X))<;5>Z7~cKZ`$h zry75!-!C*fefj2DLm-qjrBoqkjH!|0+(dzav$CEpsq*1P?6w6va^YI(W1Ug;HH+9k zjy$JA(6XbqUEe@_B6EU1++vknt$zg@>bv40V>;X5ZsDptee4tL7;~g_PJe8AP(ku6 zD>-KXxo*viqeB))hnz!Ji6yaPCR$MoAACG^AvKS9cTv?zb;UCmg?9~FH~2r&ceQj- zi|BqJX!Zj^(*FWM3sYMo8+|iN8y8b2QUU|>Wv98Y{TsOGkg4TQT@AT97J-(<(d5Q0Z&kKmi z%J*rEx>>z~`{tyK_N0DSpGK7!(@xGY0x7JZvcTIaLPeucfl2R(FKL~#PwxBSh3V2} zFdJYW^xnU31JbVFH@^m$q%EU29Gvo)DkqGC>4Z*n(6wpoB|0ss6In;$9=g zQ;gGthYv?DKhe-}w`d7L`RHniU6mmtuR&FBm^&09Zb_C$i(d6=mm>>Jc2Bx)Sd&z0 zS*HJU*2Ot|Seah42QAJ;9cA>UVK9~c`=g%9%zEQ8X%%YOrdx|9*%=B4`Y)3rbhc@r zpr%MJ*sOwhmWc7)Zmt<6tks1aV>jDRu~gx$)3d{1B#@P9ox_66yfK}L9b%CY_<>M1 zH&nWcPuww^eRGb;{-6NUL-6>b^krESH3^w(xRFG1vv=`8Xr{`a#}V~vO}pSgjt9G@ z-U%2jyF$d3J5-AtLl|()#xm=fTLhiPAKL( z9e_!t)ksrdJU;^-qA;}&+d2|V_~b8$bdgN*+KS#SUpPJYSMV=M9?U*-k^H>~YZ8QA zB#qD@efcfrk*sZs$^J$Bu35J%K@E%S`zJTWfG;l1-Oww#18V}41*cwUYjqYiaNp1k zB9*bJ0(w1`Rmz4ZN#cXebYj#B1(sgqIUt`XqqYW0G=2Q@Y5p6+-1*+UlXL!+sl6eq z!dIGJ9>as5`05w|F*M%cI-wc(;H(fIkq#}^tocJKama)QU2jVR>S{=J?SAWi!`2RF z_G}K{i4QQhMEnG;t$EY%3jf2*yEL3=xdi0Grp=ATl8P1Dh6q#-!OIOBhtJ&j-@+xV zN32JqrW&;SN3$j$9o3e+eX}_IN2oe_tC~WZSXP}hOhaXK-|!*XL%Tfx8$)z5xxxQK z*Ez6ff;H

e#l^amRK#wr$(CZQHhO+jcs3(lI(Y@60}DU;CSV=0DV`s`b=e^@#0R zQdeJ7O!0G{kjyOU;qC4Z5X}3fkNtuUOY{=3=Jw7DQy6;eZX+{1nr<1;S-97dC#kYJj-;LzBI-&K|H!eX zc_v)hwFopa6mwCN=SlqWh`~+EK(vEVEFo@H0AZVEaSM+iPB8u;QTu~H<@q}90DGGy z5>^4P$$*X4q4$EVh~bWz*CmL8bhXq0^=&K}zs866*?tQr=;!(VK$9CXwklGhx|(E8knmC}VZGnyu!j z7Ewv`E%AoV;aXr<;9y^~T+1QItE$p@>h=jNte91WkOgTLcrf5g4sq@pq*En!#1`_@ zWE11E#7K)4ic?A4O^iSF5KY+c{xGDYh)i{WD9T)|(J1b^8*|{HE@^1XskQ%c>%y5k zb*tiotmw|uo<3umeJ|{2x0V|xnYPWxQ{D6R_WN}6WS_(H^ONgilSk74Sbapfh$a&E zoY>r1(&KtkoDnf*_pIxXNTNIWSN`!2bKKURuUH5^Wq#w+so2RI&RjP7-nBwhI*MfH z8^Vvm1x4Q8Z-dj773pOnJ*Os;8Qw<_Wn>8s!XAt?`wcvX2XN`aJyD~e>hX$8pridq z)NlJyZ)0FHp^om@$||n~u-fO5g@*wjo9D`WSEd_Z|3Jh(gTtTi0Lg6+klg-dBx7jn zpbrSsWQG3`rr=sfhLjusH?cJk=useNLn@QX7A4m7`Xpqto7*f4Bfq{pya+j(dF$OK z8B5pm}dW%16+r_&o$jY&u?X z?&*}&;e^@|NyxojBdMrN(eeq=u6!X84#@&q?m5rzu5uyo-0X*m2(^1SgvN9BRKYEq z8%&`6)^+;EX;YfOq zT8|p;{6e}ilkq(b2xd9-JWf$b3}?Bf<9YZ@5S^z~0C8r+;?7vB&KN>S3UIv%?1cD} zc776_@uNg@$TS!Ll<^J^dv)}c%rj}tm`2`PV&jxq9>A_T3z%hA+|+bXXw6P=A*|R> z2ysGrSr#wi4X=wmI}D|RXPw|^eGp*Nt2Q(d|02|t&*XPS6^~%=O>ME7>dI`fi5gBj z9aT5;by$(yp2V2%k%XBKcP5AorEZK2yo(3gWfvPB4sH+NR_A=F=sI9eeN6^BfbG0i|{QA$7Rz+wqzywHXy8oWijEt@HZH(RjcS>tM6WsuZ zockGzL+>=2Pmc;1q)Y$?Dbo$Qd=oNRfI&*Z(5UF0e3SGEXkaO6d7!PIcUjB#2b{XX zQL~kA4_0{I0%a2r+ygsyhT((w%>9}Pq;$4au&S61%npc*<*H5{!`>O>bfATDPVWk# zaK=c5K5n7PH@D8Pax<2SDi7*@+f519$;C@*p-L<0+2Sx_>ILzmOvUawN-`+@M2o)W z_r@R%3(R;=H$F^-5?n#qDJLNAtF_gQT@boI9mB|yVNZ3d)F&FyqG{}>_cj@Zk&lNz zp3b(&7QjdwdcKK&5rxH{mBM!jjJu62nePaG7d)PvH$fPZH{Bt|b;_E{#azijWZZNB z?lBzC&klOa>C7ST9h7xaTv}cp{UN~{PLJtrR~O(kxkX!B3umBeT`#{v-H~}^C!J!y zl9)Es*uD_`Nj>gTA3Xh7-;c~T#(NP^TV%p4(ZM#cl@^+|SK`q#k8nTyYkX^$Ze`Z3 zbTu}%%}tBOX4OO|dM~m@V(q3$K-!xhbjEf@(`a*zI6#Jz90Pdqxt=f((B)gxrW%W! zo*T$Du~#%?U?ifxrovYl5h^vIex5m5dL-E5&b|gUvNYw)+Wn?98_F8{g)CIaH@C*G zOYy64iAZ-VVO(*N0ANpr_X`VR_(dD1RKH9}yfH%24XIfhPL$#IA!EONNJF@i;B1JQ zGbSZg3CyzSKxE~wg1SXcDvz~Ur+-dXJ}QRa`T+_tAu13M0ABsaj^5uexUr3gyS1^d zp{=#GxufHMX~flPn+}_-h~BHJdTHaZ>GXA0qCL}Pi>&s!OyZjus)PKbX89%j=s@0+ zhr69^$VEn@+2#18$XZ$2G&4EhhFi1&weBcty;5Q4ZStZ-d-fyRLbyGBxnO%ka*KLJ z>@Y_~2uY~OTj{h@-AFV1le1+iKApS1&zQQ5?Om!iUFnxVpij=U37_xC0IYocckG`E zWOrn~UTX^oS1yx9MzpdG>$Bk4bseDrVV3C@h9BZh5saVnGDFgm6$OClDd&g!BE>9Wths9%reof@4;B|Nfg!k5K1u{GPU8%@Isk{rVEl9Sba767Ib^G zXcsC9NsPQ97M{zGRNS_wwAKSvY_>Mn%ya`f8Id~7X5k6Z3fW!k>~2L})f!t77oYZq%4ch^(fo@39M9s2?a)anq zIU51Jnj?xZLO01k)?(eEG@|49+OYg=(FjIhCfS=0v1aLTk$yY3Q(HlivIM@~uCMuX zSbci9oz*MfDq$^E_2(c>Hsy0XjQEknON4vD=do|d$k5P$fLhjeiu95|r*T@031ufq zW4W;xl%DDJLrK%_B6dbQ((_wS?U$%0tH`V0=Ky zxLMZ)02xfYEVOMKiW$wcb z`|7@j18Mkg{F>44HVBuKvE&0u_bG6lQv{4m%)*af%)`A)Mbx~T8+&bzB)&#=Lsayy zC3JL%Oj?HR?gea_g2wU!sM2t1Pk)YfI#tl2my$9zzF2e4Dl?Vcjb5}6Vyg1kwGLG$ z&QsDk)Z7-1JK}P`HQe+@IGnPc-5SYSVyieBgX)^U1*Qn4435#^?Re%Dtweh# zf-JZwl|i`1&2waD@%~NHg`2&@AJr%;9(2x{yuGvB2Gk{5#AEDrw&~CjctEBLLB18o*M~H5FS>)n z^3rP2O7H-#_5kRD0@zK~P^+!ok0pxge5 z1KcvSKWZDY8^=_D=TRf=^1ia@nTl}(89P{fi8>vQ2z7OoET zgJ#^$i*5f;b?8*1M)lVFb38W5Ima6zaG5~f=p^G|NLMP%V!r|rl+a`LDSSR#y;*^@ zT7e2mr}s|5&5o8vKIsX*|-(G)1NiSTZEJK^-L!#M(F2>1i~J{42~dp7rn2&s9$ zmDj#L;ak{>2%#^R_XR$s_2Z%_zp1y$0~G1iw9iVxBJerHMGmuxIp4Yd(!CcbxtU4y z)+mK^g6rvQx~21yhur4$G2w%K(RcH!W4yk-pii{0rVT5bN8eoqy{Qc{_l>3@6MMtJ zt+piVCei|!NAhmyPh~#x1;{68A7+YfyZiY+t+2b4;o|B;Xdzuj08i*3QKTVr0q7i6 z@!>?{Bys;qR8e<9^Ylc<*@%E5XLK@}a5F4ZNh>5#<#bibXus90l%g5Slu;I0aS8h% z)swQVNMO6wjetlgVeyq`ZhiwhpC^PtB<{v)|^3UcCsJi zfvJ*rzD^FeGxeTuD2s&vbGGzgdfljCUzpY|i%&y3Pp`jT=_*!*h?td*8hr7bw18a8 zIUTjMnI>J0xYUYSP9!d`2-~rgbBWW2=C`p1+Ep~4+>?pB`aK?Uw}IXL83?}doo0ji zCDQ5#Gi=k(07`l)?_!$Zdrc~?vBipF=;qG%ij+=+siMbhn=m4eIQsfk6x+qZ*rh^e-=kBWEA{T7E?Z6_H5s5% z6hoXdtc>~-^@KFMA_%RRV>eRFQNg$mONOM6TT;4~f+>bXVLlF0|LI%Wx)SQ1<=(J|I1spa<+9a zb~H4$`7Z`iY13wl@UICip=$i)l5t~ZcM)}UQfS4jJoaO81kK8b4mK=$l;iswd|eOO zQU8eDF}>rA-h9&r&^&7dRUr<@1}gc6e_TpfohqYV(0W~RXDww5vo?>g$qElnDms0V@Y{1p$2Pk1J&3vNnaF`scLL(5*po;~)qhsL4#u7in1COcs_6Ly;% zpCDp#MsmB=MB#K;8QKUz0w&@NQ7u?%adabdH1v2C*&^uYXv#H707;DDmk+zW0+bx? z&)oFOHnI-lD8dD4i@|o{B>1ZrBCCf=N?mtBC=hCaTW;ucV z6yroUGisvWTtUXw0gG;0|FOmM`)QhOwjiTTXkJ327lJRt;b3g?%DJ6}O;TqIwX(9J zgQ|Cz=Cy-8Wpmr3(Gb{5ld_NaQx;a{jGg4JQE^2Ys5pv%$7Y2Z|A%w7tRsJ(Xi68c z`;R0)ZdsaC<>TRL4}bVcD><@1dSk#hIL=HHx|$^uGX^J}H%@)w5fpGJxKB}VY4KBV zLd=)psRL^Ws6Qw@cxSr{^iQ;#)CvyUkZhF8b(1=|dJrR89*6VBAbLX*<2f)<(?EfJ zh1FriJdTkrYzlRMJ3KvpEDMr>!gNgzVg(&UPAg7soEPP)=)hsvd2|2B<2$k6q*B9SUOB*0Pf^h zVy0ehy~IR@kqw0cVR_NaDu9|JTd#pfXYumNa<>(WtXUoLZxLU>-1c8I@uh$uFZzab!tMy0 z7OmL)m0{S9wZYNgSN8%ff8E^AbP1)YpUvU1P)aJ^!;}0yXwInor0&$}H8q8MI?>iY zX61P_BYnjLU(SbZBVW!}#Ez2Xp!xD;2Axnt*i%{k95SZH228?ck$5(-+h`?#{1Z>I zN7^q30L*O;@;BfmAV;(I`O)X$oE}iY;8GsQP#o5A1#l5IDcq!iQQ53@_Rr0o=}2zl zPm;!c+D*yl8`vJ0e7=J6elSaw(N^(dJXg-%hx?|XdckDAKYqilF5EjOO7Jlaapq0M zGN0W7W|Sb^4VfBfT};Yg8xWNdjHT9@zibj73v&2&x&u|6R&?ZH_h)a!J-n7;RGEOU zr^{VauKbiGH^mh*G@zV_u!zww~WbLc(vv18q;=ST1Dqr-jJSgIs?e@p6s`oLEvXRV_K z|J%9qBdDmt3Y@w$j<`&*jKB(%dl%GZzNjP1GwxISX=|PK9vrPuoZtQ$zcvh+mbNLn zu_BmhL}SNt1t!^a?N-%kQi_k#ui6|+UNug-Pc8!c0^s6pSkZ115)p`v zw?Lo^Z1LL@*AtObcMD^?Ks^qdY(@&2p~u_v@q%WEUk0KZKm}k zefu-7st;o3bx)63shl@rD|d?s4DO9{+iJVx%-DGB{iFNr1ze&I^A9rReuoLq%g>X; zk}Zw-VR=97j*W&Ia@%qr2a?Qq4Es_j!&(n(z8vVcO93=r!6 zWn5+AU~KGYYvuC4l{#bbR39+NIp9qhYPq6OeMr>Em|%cZHzB?Vkm_Qx0a9H;)u`xi z9!1q?XM7rA`F*QzI~`q0HQWBzx=8@ie#P=#nbXaqnP8icpFi1pm0-5dRw^9Q<9*11#5>5(>zy}QcW@j z=)bY&oWl8M*N8>tiD=RQqGezAMPsn8U+mXUxi@f}+WJ?;!0Oav#rjPTWqI6Gvr!k!!?_D5!q6D2oSFqFsv^;j_95{R&i@X|8XK z5qcbQ20w>hc3xg=bt?uySaGy1d)G;WO2#;=8}fITX>c;7_{=+h`6KR=rp5b)rM$4g zKRXSbfmmG7*;%nZrZK6jMU@@mP+gs(2vbO8{SKzZ)>T8WnIz#_vU`XOOrDA7dW3Bz0iW1b~$ zldZ1etncG}ATqA12KCA1=rlE8szD8GD&=MzHIp?vV^%87Y7(e{xQk;cOklaB;sAR) z$Pq+aIn!d&H>qX#a=d(y>~4WQXWeog#Bln``OarZuboK{?=2+pOBlu!b4Lt*SmtkZ zb1}&NM5Ijv)}EnY=JmuZ79J{;6IeFYjD3#v!%;hfMe<5q0+7F4$dbm$HttiDyd#4J zo*^mz99gFn!m&8$33JIKg$cc#Q!&Y?7FjprSFl?_kVxe}JYH0#Vdd$fsnnq~fxrnD zQB~^Pm8efgPC8=H{CP$Cb1Sbmk#hP#?CbMNoby6wW8N)f`ug! z`l*P1%v)3`jQ=Z58nY>&LiMyX!0XKKu`ZT)`9?ji5Y9kL*n!{E+!&nx4{$h74-pHR z14zF2k1U=)D27}b7AQ&T;slor+(k%ppa~`9U&sMJp+2Iw=|9um!(?R-$(QUHs7!J~ zp*(&aez)N`T4o0BYi5Tq`1*C_Sru#F;N_u^#k%Xl!pLyP=3;?1IURs2x0N`@8i>t3 zN46VR>UVhu7J#dk&fqqNZ!mI`)vyE-PbaY_QM?0^G-tHn3o<5sk&OwgKA3`3m^2>p zjsNRUh|R#za;7R@kEibWG6o@TW;GjGwX{n0V4k^57YWVdm>+S16x#}T#Jw8=R82S# zP#o>0B(xw$k-p?J>clP8I7ws(%_D{!JE5q6x^&ObAEKYLa|T5k0mOlAB`Zsqs)|L$ zQD*1sul2PtWg3UrUTTGCOWE!Y6sW-^eRx6zGSLfOc)@saCF<9#_6cVu`A@I{m6<7E z?fJ)TyJf$@z!oGJM;3F^6?k@734k}12*Fmv7p9d~w>7u99|PfS8hEwp<*D$JM=yCs z%E=d;z{Pk9(~Kef0uyKTD)+ra&XscEVg3>ktpFk-EH^C>;rRDHdD4C66mXnaXd|Gw zmlQ8oY7w;VU@beZu{pl^kFie>NIUI!G*XC)GEox>6FGL6N4W@(ZMY>KaMLVAzbblr z$wbD#RYad3OZ$k`k8MI3ZrGD*xr_>E37>XEBUAReA3)4a^|tG}j-ik53ctKhUaV;c zfV)lWcqLD#?nq%ZJqTcN8cgTw2{%Yx>Fubs@S)fqQuL`IFurzCRHPkm{F9hnv*yFZ z)2!C=V;4|@9vf&$P#W70P_gQ@!H933aw!b}|=M(1 zyE=Mr2R&!0lgYnk`hcK#{pe(pLHCBBWs1;mIA@6wW@&6$Yu+0eB+JbXfh8GV!$5ET z3*z=^H__Lz<&PNV!-7*9&w^WMo%SYVm9s<8e16)OA9kA`A%S6AtYH6I(-SW&ye13UX%RiraOz8+v*gzLnMPZ|CK#@{v|yi24Zn06)SC zj46LuV1M>xIqs(!a>eRj5hkQ{3IkB2v^~9nKYwY$76JT?cXO=(x}PiB+fCb?OsIvI zwN)t89m_nAzC%OV)^Onk~z z6eNVw#giAQd^h!<5;3?zVHY0BR^P5&#uqMpqEq#lAk~Qd-QUF#T7eAXm10Fi)TF%) zaZe&*HD^hkq#R@yUh`ZkYd08`P{XREoa;S-{*ooHQCv9HLnQ+)>*9*4*h4Rh%cWf=nekt18^%t6lAf$IUsDJe z%AHWtR3!5kgC!smDlG9fSrqpuxxTk_2!bPoJBLqi{7mT7)!hUekbce=mavMQ%}VDm z%*^#Hj}yCcuTC%xP+%!_v| zNqHE)@6y#VIFiZ(*>y1E$NK^vD+YS_S$kHtV#ElBj{HS=*bM3tw2O8n+Z&^^ze93- z@4XwH2w`4KY?}zmp@C4~XF=J62>2=(kJkgvS(tX_l`*ePX>nBEZNGvH9qyjk-AN?a#8(;G-d z3bt6^HxZ#HR?e%aO58dEyPcaoknO6VOxOwL2mYQZtxu@>)%WFdkM0qv@tzd6#o~L3 z+MQPS=;Duzqf+hE?rJ&t9|m3fvsGM0J`cL=W(%w5D!*FcxXxR&warG?zYfJK^RBR#|*85rM8Xj2#i*{(3#_n0CH8!j^ ziKi1g)-G9(GEAH&Sj|N=JB9@14>^iyQOP7T8h&J=ZgfbkxGSDqJkIo*9)W|?mQ(#; zS5eN(w}{yj()DmS;Mb1J8a}}o8VuBVdoq? z&b>~pe=D*^@&0XIBk+tT+NMvBW#M=k+)m@ak1$9#egUyTDL#0juI+F(81%z8$S zU=#Tsb8f({nvpXdXyELM#Vz$FZZoM*fsf$);a(oYrZRZ~-7{|xd7A@ed@BzMK|3XZgng7>MOx|*nAJ*r&7I7z% zCrfg>#u^(< zgI;>I*LwAWGHFmva|Y%_7qj74IN_7Gif&;Ue1T-_F+>!EiXMfMKZxVfL#8jS+V=ip z_Q0GY?ee5-+LcGXJnw8&dqU@notfa&MkB*xr0-N=v`$FFHjIzh$gBPZYmj1gcqe0@ zAyT|7M5z7=lU_rD7=GZ!-plQJDji5`X{nnhAl*F*{jj1o2rjPiZSi_~#jX!5Hk+l` zZg4(i0r9_O^D zSkQ(O&$$AsyY@l_@;#jI+Rsv;A65F!1 z-$z;HM}=1P`Lc7iYDd@Tm9@KPcXy{|GMnm~k5f-tP0*j1Z%Q>r1EKXOFKJ*otfpS1a=#wiefCm*zNm?-TVGPw%18g}AZ* z1SQ`+fD@w@%e)RCO{Zw^I?hk@4KvyZ9mQC`JpCk>c**TR+F>2cq%e01=eZJRJTSKF zp~zg^7#q-{=LFH=HpbxTo)9`d<1T#o$CsaTTz7H>Aft&x{p;$FnX|RNjjo-YIUpft zEC2Tjss;_=6;(tvyYq^lzwrD|Ps%8(c}YFM>Q9ThWRiq}eZuhPb2ibVIa}&EvHi=j z{qZy`*+hpzi1Nn$Qw3Fexspp14hi&h(B@?Oew1Zv@`6Rww6Y^635iKI9iqJo<*8n* z9pXlrDzWzi_sxZ2RTY%d9!e;9;lXZZ!sPTZ0^dWAhQwi+u3`;5C!t)Id@?W*n^xIw zmZFvtw`?Ti?pauP;1JWQf9?J*xDoi74uAYR(mh;)pS|T30Fg%1vRui2!S`MIk2ShwD&Ju6QDhxxnYX#0Lds$Xd|yQNJG4gc97+92fi zhLRLc1-!b(qi3wCT&Dym4E=4Gax+r$;kORe=yIIJ8;o06;hV>^#WN}A^P>iWXsWf0 zS5ZTY?v8F+;eJQIw>&p*8b9jrjb_1hkkih#dA7dhc5wrp-)!7(QrdDmE6s#s)yizc z${*h?RFfHdOBL~ZxVZsb&$WIk*}7K_U25c|O}tn7Y(gg%DHFtsGf|YtN20Bml|_uH z!m0}tw8V{+vPNk~h?Jj9wXg)!rsrUcpogW|si8%OgSfpCAOHdlVFWLhw65%(i150yNRy^Yr{ zJxC)lV=da59cXENj3`E?OAH$?kz%2eO1P47WF$P5Ibcv##`PvN5~EgyXH{SD1{Y`E;!(imj_^I`-~ zYgdb*tXumN$@Q_!=wW^!z(`P;pew#er1y7$rnZ`*82`#`1H;(MKUy@AOIccOK-sYX zl%0Q(UaZXRZ0*dv&IKvf zZ3tr9r&^_XlOjqBCxEBf%tg7=D(B8Df-DAWG;>41&*Zebr=opAg(c@(Zvs`17QJ3T zvp3kD1gC|Ot5PYM7^T>tIF!nm%UXvY?{l7qlZ5>vj&mAftf;_?>HN~4-C+_w2@4OFRbqaW2J7vdr`A&K?A%`7wo%SJ zpYVFMntH76X=kDC#>qDQkX*Y#)$MqgRWpeOpIB%~nPen!D#1Kf%JST+%;yiWTA0w+8JF3==L_>~SMa93JDN)7;mh zIcQk=TpNkT?Bhp`VnqyD%sv=6 zj5Z+ERj%XwEI4CYq6Jr}qHC(q{$}4jNu*sdM(pLx_i?A_S^U%wM(nr zRIBIwoTJgoK?RLFpt%|XlFkU?fn=rtVF>yJ~O3T#gk$Vx} zITeyKLEe%FQVm&g)X>D`QA=4<<_jEoiA&!m;=<3v3!BFba^xNZo)GI#?@Txofkk`B zn?%!Cbmt(NxDF7Bm*qi9o|U1dYfSQd@`h{f{5#A_-ZMHU8eP13Q5?tBU@)tFn;Wl<0KDy984G(!oKP>AtN{6jAv`QPj z+#!8aVA(G}vYu9yXy7NJdWV)eRcgGytL>sHtT;G(HV%TUQmAsd(;CYwzgWAvviZ;U zKzIIu54LSCh`qg0N*ltSP;iczV00+EFj8XWsA$wCizK}hCU4;uO6N0v*@=|#pe6Q= z#mK72XL1TS*xmm=bzG!(8>Z4#ptPbb_fpirk+T~xtZ=WDg!hHqA~i@ht$9LjRz-SH zLY8|So@&FT^NI*@0vzLrL0fd`!RWT>4(kpyE0hg6o0HHuz`H6x@6I>>_>U%OXvm~t z9uSnQfKThcz%e9Fkc?K^1-LdK`kd6(tqtZG7@4P9MF%OBZ~iQHsm!oIsH8Hw zjaOq~ZIIr$tlh;zA)LoQhq#Ts>FIo*G1Xy{&@7OWGgnSjfC4T)lE5DLgA^FiGQg;_ z(HB^?aKvg&i$M~mAyIZG+O8>GFV&h!$w-ua2SrSq90Ga?%(|u4?OKE&fT+b&)UgSI z7aTL_$8xq^`xxtt389KdfXw`!bsim#OWduPCP}^58CohRpOR{lir5o>N*yVv=m`A1 zmK_rPJ86>{+)Ax9=BNN=8AH+iz3ze=8X~SfrpuSJ=H7RCv{%Rb`wqz#e$4Wu@6NX3 ztb_uJ zp{0|jVoV-7xbNRRD=lKn4M6qeyGRlzaq7Ib!z|nQYt{M^1Yq}Z%>@rQ5&y6jR5~!o z2ccEA%v^y#0dXM&uWSU|XjDxWD7RU#5MV^MskWZ7V6F7G&#-CRZV|TR@B9$Zs4~Br zHR<+I>RdRO0P-pCL}J1?sX}1gomQl2s1=Tn?=C{jn4G<;>hA9u{L;fWviaknfp5uApIda8GE`m1?L)r~!f((@bc!v* zek7ts+K+*gO?L2P4fQiT=LZ(}(-AGAPYgV6Pt&#-Inb1lb8kq*IADk7`97}~+UPGe zf5|T4!5CooTc-{Rk^R8x@~7TEyo&&X=CnAf;gId(!A6X;zUn|O5U(<610iQQ<>7Wd zo~5+Lj-&ZS(!IRa)oyue^_!yP)BDtR)}QpU@6_;;iHhB`))^v4LzDh#y9SA?d09`B zcJwxpA;pLg{-0BKPegz0P{2#z1{fIp%a_#J`L8djv(o?AWkZNTnU(nk7!Fo{F~z+H(#tJKpVACu1DonoL9^vZZ#E;=k0KXbKlxgbX*)gh}F-B5Xp9c6ng~?C~ZWjQ|HKWLeZfyRfm48}ec?1g zK$I^%c=W3VG0aAM^0PBJ;5gcDtE8ddz7k88%x0Qa<)k}a=5p4o289$fwO*DmAh_KAU2wVqVDnMv0+=r7pl zW3@pSY7PC?&9S_y#Kwj3vX$?WT|#%E<7;!$GI$bq&4#o$aNB&(1fG2IKPxYj38Jg8 zyjIvs$znrzNH8|M^6Z3*Q@w1Ux{josNMnT5x-*qcvkfv8^{l_eF7;fbK2|*c6Ql}(yqNF+ zL~a7&zecaE-Cxn$t*RMY$cpMSTU%GA60pq=NrXWxyb;R#)R3M0#)wA*`rRq31bEoN#W;IgpFb^-NtNzL~gf+JZqT&V76#Ny;50krLufde~8R7!30HzhITfD zKb9_`+-*^a05FmH6R66PD`u>@5ke~A(d+ZF?SOuRW0|MZGt$N>sd?kc2h*p@^t%x0 zDXmYP24*7637v9Kfmp7W@&XqF(kI23Wp>wMN?AKEplCL25tRwdmoOI2JAgz!`w^Zh zHy9bCA2mcc!d;}FS3uZO*CTS|m*}?&g?S}x*|(Ddf)4r^3h30$KQ>(uK}tdrc434g zsU)13iUfASFd$7)Qps_~Mxfp^^Ig>bMGKb|rU4pH9%nG+$V5;Ll&X@X5^&H=a%jy| zmdiIx4n$R}9`8>_iQhX-E8OMLO1NvNLuAH0R4S52m#LD?2N`Q2?`M8B43KF%b7<{b zWqvac($0EcgKP8#RG~KeRnjf1hAW>7(@y2@y!P3B$-$qeKTmyB8X_0C2Q*VJ!*4=9 zS?v)*nf+U7_+CDFAwdlk-20vv0n?@N4mH2ZuUCn*=Nk zm4+$pa&S|Va>${7tGOZY>)v|arVxL+{w@_@jUPP!qi=& zVIADo6$&1~C+>1(+(XK(vZ0^7@9f9z>ZTb=(F@|W%S9HcAK`#{h$wCoHq;EEw*Zj* zRqLjmub(Mm@VjQO z5>YH>^2w^cbFjlRjDCS8o(%F`EO@?YQ!lyjHaRg%Tyl!zCIO!HMBABy)Gwj@=&%Gk zPspVT8qw#Itl#DOaM4P7NJc!3bpm7QkOEoOFQe2po}fz4o;)5__fT1%V9rvnSl#jH z9!v!Q$74M1!mOe4vi9>p=dAL3e5TNcrj}CV5Lay}SvIjnoI-nZrqg34gaSdQ@{3+@ zrX-SqivT6LZ`qxeYy9CesK>P}^PNP6zU6xnzcaQN>1*(_-!7VDkv!Uhs!UppIaC#} ze;Sqz=j(gr7hA7g^ld{S8!!lD$t334Na{i?VfMy|e?fLCA7WFU6R+gUkY0DP%*j{- zGiW>5xj=b+wqk08RWmkGUG#+3V|at!vmd(#Z-RJQ4ftf#&s!=BEu+~|UStH~c1YqX z$|&QuZVT^%gt*k}JRNMNZ)3~Y**-jEit?t~`IeL6@^`z8z=^1y5kfT6MNcJx#8KSB zjGK{}es_}7xsc@p*D@L6k7pTenU!Gc!)Dj(I2d1w209JIY%g>9|vx1v%N+y#BljE4)j~u+wbLsfkD2Zol(wtHk!pa>Z#eGobTi9RLfu11{|~Ro$4;x?&_Zq7}um1l83QT zO^#)uUATg}Px$|AH(ti}o1Fmd#uMN-_`m(q{@&%XGqks6w*IT*0DJ~F_z}C`Rim~d z@vu<(NYRiLl&BsT%81UYE2@lLtyHSIuYH30YHw<+VT-19TvqOnr$_H^E8-{omIUM| z)cxZlY|w7++>vBp_Bo4L!w1WWh);I zpD;)Ie@dQWX8e>#aVN;JGLRwET)a&YW%iA zzT<78$QKE+jlr~pq|pl1Y`M*^iv+OhAn0oC_WSt=H^*ZW{c0BHXB{~r90-=M#I^+Q z?Ndelximd(bJL79vW%?)r6$B%?kn5~P57N}ik$fvX+Uo!W-|{21ly z_0IVA*?`UVAe*fG8pB|bd3NQLfbYIIE??hXnk(A?%NDe?*y+hSjhP-tnU6E|efXoN zjRfyS!VBYxdP|}-xY|fO^_b#W%cn|8~ z){vzsi)XHPSMEJG;AUnFcJi)kdQ(PU+yY`QBds%6)Sj}Y*^}CS223078cBcnIa>I{ z_YGUoO}TSs@fn(Mf?o~ZoFt!VV7pPoOG4zKnx(!;Skw)+j{st_J`#~o5q(a($xF?UGQj+?mx8)^yBMd zB0!{m0krggS>3lYGB7Z=`HM>RRt6y2fA1S2LW78fOKo1PRbwC`7765T4AceoV21Q* zN4u;iQzRF8!Ti3-CMuu29$AhY+D{*B$Bi*sY~E;C5t1+73^{Wkr%l{>+eFXMYpvF? zb+v>kqoq{8oLurtqA}!Du-13e>+^9RlnEgJWLhL$t6-5y89ba3z(On8psP zHfY-efOeFzO6N^S!%(*+i5^BsgZ9}vnhBQ)97vR2mp$(~(2V8TjwXzxY*6tt$m{)m zJ>@JZsGyv&Oler7tNNuZBb)U8Yz&!WS6k}C!VqvTk6^4jBeKDW}w%|d(2pqrko z(vS}36m2syN;c~kR1_sV1^(ANEEfPgSewYs|~ zChtblVD{^u7US~oC&M)9aO&@Dwq~%iU{)8rE*vE}RkrjaOEVqWi204m($Na&vbnBT zZy_H~ANL2Z!##Lc*1aD(OgJK2S6ocoJtDSI$@p963pQ5>n+7sMu-kXiVRkZ65Jz%o z+RTQi@&5=#SjcbzNvAE=6oK0(f$Vm@`LG_5;W?^n*Zi0m?ifO_SFf(LY@-@}1c7l< z@kTbqx9ZT)2z+^8Q)m}gjaAYir>`>m*t7H0aJ&^jgtQAorcyyQqKX*e*EX){T9+&M z;KsQ~z;7ZQrJgy99CQrrIEB-p(kLa7QITqP3HjNN8Jj+KDj-DSB3EzP<+`1zoe}=^ zV^JbGidoHbcWrL>SNHxQM&omj;hE0FqGIy~=&jD1mvewJErtc?SD-84dRE=FU{Ucrrz?YrS?95x$Y7Y74N!AK4-XYd#mf0 z;+jJ7$$%w;PblP@BVyUPR{H*t9?-tqzZODlC zNI-{9SI^k^uYB}xP5yth>i*JV!}U4Ti5Y(Vg1%QoA@@JePwAPNTN*K@QJ|Dqwex@f zAFaA)_PfJ4BqME#e##5C)^bT>%BI!9D8wM+zDc7E+o7fmNi*glWQ1O~fL5JSr6t6Fx9Wz6`Mk#+2!c3X@}3s!31z$_Th~r~ZEp(7VIW>c zf?hYPA|k>~%oL0*a2V>6eqS(Nv%IhSZt$l=lQZ(^cL^ZTTUUP2-?M@(r$@1Vn1lZ{R|_{NY|Ab=Ix*}-F<9j|qd zBzJ&l3X@46sF_fUKEP5WqDL7F`cd3Vrm=1hbIs? z`Kw9}-&M>4GZy~lxmW>Iv*G7dss>$kjg-PQOzsw?&K1;-WPW}XeKYDSsr5Z7rFr!s z1KkUiwHL8e;<6JBgy2=wuzu9+p)xeh8>K3a&e+;`ghE5?s`nI zEZK45(?Q7T*ZKjW|L)hR7u>kcu%Fuzn$$BAVW*37P4J7t6H0c4NRxYs3P=oIc;DZ? zVkE*>P<LR>is5e&e}a}!nX9;i23;xz zdnZX`doi}uw+ho!c(Q3?6t7r4pP}Rnk3X@!%B*Kg3Lfky2f9gt3iA}fifiae+{$Z0 z<=n#wQMs$~?pGfwcxR|mBwKih2{LKsI!mT7i3pk)fOcKWyzi`uD9TG{Bm{Z?U=T{R z$oMQB+2>Lv!)CML-~k%&Pk{xM+cWZ(>$z{V{i(|=;`i4@Qk>}rp(Wtt^ilCNqch;A zCG_&mZo4vIbOrHcS{7uV?&+##Hm#si*k4BauV%$rf4g;Y-pzk1j#k65^^Q0-wGgJi z;O%Z17*H^IN4EFOY6!Z&rjCG9Vff<_2y6h&I&>O7T*{WNh>2}7i@jn|QHZTaXlGNm zDuXB2!AG%;EH0dRD4f8nT@jyaop{XUBok{VGZ_LPk$wjQ`D?QO{pQ$N)vFi*#05b> zT)_XAxL|MNXk=#nUlUb9s(_ZsUlcBYAq^$2EmDUAZUtC|0p>v$X%syF2-f>rtf+D8{PcR*3vWd6Z;5oH<++m6bXX?L&L z>IIFqBKb5-!l-w74feMvjpz(7<|mp%bK->ns(YmbcyAQU*yI0@_Axc$AG!L~$NqdO z9#+J4q=m;&UyFDiyAIyRl=hF`g>}N_=BE9=+*W8ftMeNw_6+ul_dbV@?WAVzJqdne43r>7VSPf zzeviY{fmcx)<|h?u35O&ZQtp)tfH;2PiNRSd~_VN=kK`4pI2nix!^`>6Tu*T{xr30 z?hg!-V{LcVBhT9n=&zz2>KDN3eQ@K9Yau4@#p&`-KWL5Z`{Nckvk)fb%t%VTPO6l= z2kpmb-oH?-=z8+I(!CJ3_Ua}OnI&P2+E$t8n1Lzn12O*~M%e+Aj=WOo#5TtZbbhMh zn0)5DX}^nFQFhS<5xTe}V|1^4Ig?4j;DqJiD7dlQH@d`)Ibou^$fm3lY1%RaZXXJQ zg0NsDZmCXrp0Cg{9=!S(oncqh*Y^gQ<8RX9cr7U(1ZpM**{HMUKkJvahT9n@^Wmn0 z8XZ{FI_PKM7WrA==%DMw6|O*hcxp%-KLl3QWeXQ%=dgFLa19}KQf^>-h1AdkqfhUAw;=ARO@kvH~cxD{(4 z9>FpCRFX2#f@*JecO1_(avHVY`edoIUbkPONU~hHG1aaQQv*InvyUJ+Bs}ix6;@dp z8L^^O^O-c<@N(>kh6ykzT@qjF@&g{iT8h(d}O^zFblv%z(~qi`pF1L#tJe}>K@PA1K# zeIehQ{|1g=u`&+9Eh4c2aW{=;#P$^UmEKr89C1`ji;!XAC>nPPrR)De#-__jThIsO z$%KI7=D*nbY@PH0Ze%M42KxUb%gVj78vq9;0BR`O2nnV7G&3$)K_~z(j*nnlK+ZU7 zxI9>=w65M(^?DV#Z^)KcMHfA6v&9{gLzJlp4f0N_ZB|rObsrWzV(d)c{tVVwQc`onG9=zMX8q_?^ z)sizGDuw4Sq4bt%VcET{P?EFyB2ovE5LE=~9bzqHP=8W5L@6JKYvh-!!A&T!zW#Qm z9*;kP6HC^!~q%QC!bHQT2Y z3bzGA<<1So(BDz7!sIS;#gOtTk1bE-W{p1{9INdO)gvj~o_6o6P})w>6G%&|xMUVH zLvpsnlOhv-)G&g~dtg*%n_S`e;qVWAiP+AfSQMG2FV=;!`xq-P2ZJXc4+o3O9`$Fu zS1L$pW(p<9-vu?3!QPe?r<>GKP&Ft8XbZ~<9mK5fXf69jiqC=|WapFzx za}R8y;sWM~?(J^w@x*n5Ba&a$Ve?5lqr0HFyT2xC8o%g-JvsHph7&Whk83thd!1cv z_vz)hU%vnEYl_JSOU@3E8cV|cdm+b3-|9cW%}G@&8vu{s6JU}wCC9f4*C)GV#GtRu zll24E{8{*M_yd?G%aX9MG(K_O>DXsG&b@9clX-<#T6ZF4-@yewhbtY&o`40>yl*Tn z&>f{>-!NX%4*%7`9)GbMV|iR~=uH@{-JLEk{k3o=vLagq0UEMt73Vy4?v_pvwKYSU zw0jF|j@Hi+Cm@f%Vn?X%0|aR}V<3}KWUS1hIpB%VkIgu#h`KmE%u*%$77f`yXP^D? zi4BR#>Ph1JtHKC4p<=%N_cT^92^~wfpxhCnd5_zZi^29qP5)*{3BOZ8e<)J4ivmBz z^uh9b{VwR+07zp2<2)axcC(soQZB8W>5sEB-L*5;Yp_;Y0X}&Nc;B=Zeur?s-y^Xt zWMX-ME@P&k>b-ex?P+$W_X^&weGK`7)3JS*^Gn2d_MAyN%T;#-LQhVo3Q;U1I z@eSt+~HXfGYT}x{{gk;+MaZN}nuxVoh21*2Ikk3{dbv#8_LM`+?}^=C4o(pahxi~eEmNalxhtPo z=oKz5EjGNH)xgv^4x>wxVMpgbRvn`Wi!~h|pIUU%jV5=d+~+rUk9||lCWC1>;)D)a zvGp?NZlo>5)t5TCAen)}5LVLs?f3HIV&eDCeRs!-9BMQxmB&g07s1ZHr8iWcSX#FR z3cN=@jo0J26=C0oH}+ATZ2Cpl>fncq#GNQTXD>V95x57tC;+*zDShWwkW)V|B)7+- zAToFv_%J`&@_8TCRFlN%?o*dz)A-fQJ?-39xNN+q&v=+^f)D>#S-36rK}FuF0talM|< zubX^BLw7uB3&D=wn{ug@0wLSGL15kBO5a}NEI*l9txzzG5)bAxCvd$02y7!hdW%Jk zNogk=ahbAMy+5j62UXNm4k-OSl}-{o602E?%F((+6H}vQgCS){C&BNov}p_)vL6Os zP#rQOqrV1hWI}ffpzh73DG#yYA|~xls!P!IYB`L!91RP+ROt@6D$>y8SkA=8pj~x% zsuIqQ5*y7lc-gEXZy{zPEO=n!&S*EN?wq8sgmxRbJop{Xm%}t=LU3g#yI7kNl4~yv z25*9R-!Pe{SHJF9OoP~7F`3`!++nl5DZ45V&&4X%KlRi)3fmr@_On;&ICbfwn4DHQ-aq@oDKi|{ydeL?jE1oLa-^dj|YBU*sS*3sF$JIGy zfOwafeyFOv@?4EyF7PcMx#JkDW_bKF(@um+3EBXJs&;_=_Fr1uc2?|w1Um}wl>ToW z%c;m3<;0pO(y*`JCh4k9I-!g|uK5og4b0U_3I!>^EUfN!9{FheLGGDQUksZK@3T1U zG*lT(+}gf1${9MH3L{Y+3b1~^QME*83jdg-9uh9rwBJMwv4!)+N>#bxuuOwzLl8A# zOpDLRA+0G9nDKOYSh^$&z52C50 zG1*66ZiVF#Vi7JWEA~rV%JA+-Va|>$=ait!@}s!BM{@r zz%>kPu?SYFK)@WOlUQ*Svlz(!hAc(JIwH4$(=PQyW|zTiOIAXR#r1Zxf$Ui0sZxwkHTAYpJb0phm8;XGfFW zEDpNcBkF4D7AH&>j2b%P$kFxsd4vl!1o^OWwzpzvvTQ|VD6CZ%J!sT)Tufu~y*oc) zBuEU)`S2}J4@;dOB;gi#_x0ZK3BgZlxC5ua+2V1vzPN8E_C(D&(>Pg3xrB;~s#0Y; zG-!Zf3S+9&N59Tx`4|WaEsPlOhHJ+fX(ULDhh5Z7c3a7#!(E?3X3Ef`_21 za!pjGAQ3V)2Lw`i3F{FRHSxVoTexhw`Pn1*VqL0B{o!qSsvL{XH_d=iFugN}1;;rg zzF6<4>JqMl#MGzWjj@zOJi@EI)_zx~3SU7^-j_Z2OyY*uiUp?vqOP&}Dv75#P~dpN zJ|lr1(FDDv;%lT6AG<5I|#tx5Q@!qXr7nD*$s!_-57zWLtAhV(M#+q&7xS z-#N^&L}#0cmxqSla8}fLyO{Vc`TqE**E5y}G2MQBAf~n4F#88o-Dy&`Ugf(GXNq=K z;RZOI7a>@or(Qm&6^C|yKU9vsqbd%pGLkj#)aLw|ch-^57`9ydlNRUAQ!*S|$LIEq zQrU1AS4u_sqB>+NWVG;-cWhmHGg!V{%kzyFWrUzD_tT-f$RG8ji|tdllV^JY^>Eq9 zwjBFKgxxTjw{h@!*=00{jvpaPJ;k84Vo0TrtQ)ZtM~jj&wLer%ZrobWJM`UvYgE$1 z53nF!EjyR1X^p$(!9CXbzdxYRZNfTdizco3A7;pMR2W~KJZc_Y)Kc!L@;BXto$0hV zSJuKBJT07e4)w}A9wQo9;8N#{1Vb9VPTFjiuOyHSr#nYIIOlP{%%jBQd^2;J_aMYm(k4RYyBd_SC?9yBaNy3KqUdnOn%*mRo$S!J5o(1qY!tD-> zDQ?)R@*%b9$OtG4%4Do6f~T>C=rV69K?047qA{<9fOo!nOc%4Q8VxsjZ>`Vf5K03% zc%RgIP%IImwG~gk`WdaY=1gozI>sgUqD>6{`6UP{{^zAW4q`Sm(GldtF}Jq}$l>gK z^4He^s}@k!u&{AIm-j2Y3ihZjXSmspmnP(9N63piyzlcf=B~%RT37@wtsdj4lot1m zvid(MV6A_W&oEA@ozG%=eq93GefBh&2FC|{6!UMPyL8d}*6(n|z&0w`45falZ4{{e z=^6*p3-K>JD`O+NO{KO)b;UqusO-j2kJr!kejcU-X%&G>m6+I^xK6a$o!6-#N$p!K zAG9kr23k*+b`A+NDJ^$06NO+$^6)SPy!eN0WN%Vxen0_PaV&jT>i%JJS8uIs6K>_u z-=~5*myH4F)UIGyTBiv>pD;Mn#yMR5fu+i7$l98eg4FC*ha55hpJYTp$MyrWfH7}zxcXUfR zSakEzfC3ZqoP~!koh`Sn^E7+8!pMX%k|b(f2X2LU#k$1&z@>e_kG5VGNL}sVp{uHURCpr% zr)g+$7X0EbKmseejbF&IL_B)wh;6}@jc`_Xxn#>|kSt;ff3+39K}N(t5-Sqt3EKed64T3i8N&DvglcGXCc&`>D1 z2_7TZ0_5Y}BYU^O8l|c>#=wW+QFn2Fe$Q~X2rh!s@I%{m@6wvz$fo}w;p7}xirM^6 zqSg8I3ja+&bppjkV%75I7=P_cX4d4QGgpEh&2A@GF{%@!#0c7mlelqeX#&q?(dc!! z(`Rr>Z41rTkQ0ZLiOUraANQ29(k}yLac27+DAFj|xqQ?>QxC@^R3I=sgq)g(N{KP5_-YNEyL)MXTbG&EdN7(_Y z_p2@`q@$2d)d!<|@N`v9Uta+Rg;OhrOz$kaeFn-zlzA80E8Nf|9d^t z!N|bI+VHRD%fZp!$-vRc{;wSGZ(;MlUt@nalgg#fd$0h{F`j!Z>iGN=5&W6C5j~Lw`{?$=yA;eU;%MH8hMc#1U+#qd;JifPa4Mk4D$Prn3OI@Al%tcBM4Eaa1 z{S(?`ZP7`zgW*ue9fm*pTFk!7YDH7>zhy8YRJYajR-^BhcOx3I(lnA|;YUw+YA<4`EW?8Ob2y%lQ=yFgg znTuhz>#bfR>3B5j2r0N(DpKIRY@Z+sFhN3K0$A|3%`5cB6BnYwwK}WE3ui9fFQJ9{ zjXJ01woaWLpo?fLRW`qe5c+&O#A!86y&N^cn_@1!Zl9KPf4ej%Dz8J)7<78@s2-#; z%OOXLBGr6Sm(A7YhJ9~XI{6rYb)LJsZ6ey;qkxHJz2SLu&Dq5%h)s)mFY8!Gn}+#k z>0;cy3!>J;tK0g==z0QOKNWU-a!k2HIh402yoA+Q6qkXvmu4?o^;P(Txsuj)W!@Tg z_{FZZleXpVC97{;Rgp;FS7a43*Oc1(-hz`TL9KRGmXTf4+H(;|85W=Wwg`ng)IdfY zz6~fZ@|=)Vsam!aiB&ckgj15+Zi7I_2PGD&)O37P3EI)r-t`icinBO?V>ypVMpfLH zwOg7@|BIASH)RCt2BwJFRdm;X@5Aj9F^cP|zKCmyA1lv7>Z4rC<~71r^28QH(few7 zBsEp&7T5vbmu;@CcC?3EPrK!fq~^#rhp$O_R9pyHm)uXvD9%Up@`u4A2QjA+G|T7N zk^A<(_Vg=s5TjdUvb_ulWg75wvJ)bxI<<`YRZhc(+`-=UoZx&4v=ea0WW59hJVWTy zJmat!kw(db=er%-kV9ZMr#x8T0IbdPyaQhw`TG#U7{B;F0xjO|?qz1SK4_<;WQ*91 z_a})-(hn4Z=<6b+R89F(8OC{NAu*n4pyWq@d(L%%nQAUZ;U;Va3p&tZ^oz%Ss}o(0 z*Hl}Vv(>~UhC(J$K;w<;G1e75_sdh9h$T?4yxq7=@v1A3*xCuI=i6f2?M#`wXYXUt z9SqsVS25~@;?7d&3ZGV!oCvR=qe>pS{p*1AyuIYZ3UzCKjLeX-SP*G?^7rpf@J+6a zMALl|$ls^O1XY2?|xskO{i&DnY(8sv!89w zHEn)ztHaLbne-lV$PVJa{l}yQZe=UDBB0)x0eF=B%Rs(^nc;t=8dgdGSs6XdUs>5@ zgf{zFyv`gz2duZ*kIM;j0{)|1noH1d9O0n&VmYSXfQ+ITU0Xc6UnsoIy6Wy1MYyDi z#r0B|_HG;0{V$5b6bwfltk*q)L?`w(tGc;Ao8aR9RsfBl=6{)4=>a<6lx?~0W;;xt zM^~5`?>}=YiJp|( zQ2*q|qi*_sM!CwL0~#Od9*s`NgDyyg`MW>8cQJJZ6K(av-pTqEW6!B931*`w@r@+` z#@44Of#v9YYDeS5CD!(1{=xRJa3tjM87EpoZmaTYvA!=bVY;W;PZ$%fDa(e7ZxyyH zFD<{i<|$;RqRjgv&*3{@S+>Jw`OeL6r5tBTP*Z@d0i-Mbk^L+*=8p+9fyK+HVaUvz zJMU)%#|d!Oj%viIgQ>Lk2H3`;q*wo~b1V5zNgncdZ=ZroT@kLIyD|SPXPE!R#~9H*PrynY0IzanaQb5mqyq?nKxA0Kz_r9gp#xBBIZ& z-E3L!w!ooRCO&H(SYEQ)+LeN259-DOIs^g=yFbvH%<8;OXL_| z-tmfKK1u>RlGhZl^qxZy1T|Q$)u^J!*oPH{`XphA2*+B(5jr-Y4p`a#H5426>7#W* zOUS;*{)gqX5iQnx9R7Pssl2u_D0Q{VF*msd+=Uq@4Ux|mOmQMNcqE4FsBT+SQ^ zZqmh#OxQa(NdXrQ8^UZodg*W09P*94hS&sWyYes+ zU9O&N85y{QZjt|9I4F&ce=nR(se4VGk-VJl@NvUJfd?`_6WJs5;I{WvEzqmEhNTh( zDx7c6a6;R?r$@(HQ77B6(nn)cA8;SpRx-ueT}&1w>pN2JU?yl~Z9_kUtG-fY8Mpe5 zOt*Z`*EedLg>-{yi)kD#-A$eO-mvCNx_Tr_DoWEV@gWBrb`iEsNapUTa`GzA`1fd@ z%OCjba_l0%!8R}73g7+%-Njfj9Xtg%5&VD?@h>(>2S>gCaUjM40UDv>j0z2aXDpK( zhD!_q0^zs^@h?0sf&g99;IIV187Yo#9<<|^`X$_A$?ct!xf&8pxva2FGl-*RY1plt zrz>3qH4yA-4x>R@>?&?`0ZQZ74{UXQh|j=ZTvoQeJUcpSCR;owLh-~d@DqU~%mAe^ zHRm`k&NdXqhDSP?i(i6x+f#T(=OlOdCf0>~X%2(G#N?S|^TQGv{$n_jb^QV&w)P@K zVv|e+x14jlCN$C8SLv-2F!LNU?3L~`gmX{7-#9MK@%OeLhIv0(Fy%KMf~EMK5JW4` zk_;s9a}A@%kh!qJKAwTLy)kGPFvrI8J9MVlyd5Y`St`TrTR9>5&z5SnP}vR`8Mht! zHHmkPCvaS*W8->WFtKrXJh@~@T;box6!sbRe2pt;1W6OA_+4a82T6j?wwyY#o=9-z zqZN*h=xVki6)NZf>NnWJ=_#kP!9E?vty}nfkB7%5=!!+1+bX`^y;9xOH?hUekYM#l zeWv=D3%-0_7ga`DECl)T9-zdbuJdHU@T#EG0ljVGpNB- z*IV(K8PkgJTVS|~SW8a45=}9lAZu1RdlR>+M?JH;yXSOdmODWq%VVg5_I$pRb&+JCtm0DV~_OG_ufPU}Cl#ZJoF zHtYB(UQadr*_5kUQfr>f>V@J-&BHv(7mX=p^`Tx_wfeQ+*sQ!iXc2r0wcQwk9i|Vm z9sHJ~{&QI*sj}2bqI;}q04@u?8pC8n<382P&!H8?mUae4B3^*)8%}t z41!#cz7g%Iy#-^R3(~wz{0bqqrH&m!QP^LgZ*L?)&YxF2yS8YEX!hujr}h|hOK4eo z^;=+~gJ|qWUoa-ZG%FV5LP%m^{7x`%5@+}UqoOzy_r@P))O6A#J42{1w^B^B%Z5o_ z8FWKu-8YE`>Cz1+o=(Bw2Aj9H&Zw?eX~rzM%|u(lt2`1j0ge|jyI)m=L!22KW23>m zdtmpf82FGWtVHE@xAcCyv}%wu z=gbz5z^TdPI}&s@zG<^dT0l&X=921@(W$RH?=@twzRsy(7}yhoBZA?{^P3E*Dk;z@ zuFcfVEo=>o&MH$jH6{@mC;HAjx|Pl2`h$SoYF`lo|$+8xGI7o|Fv1jfL}flk?quHWnHgRb)Thx)sek0N#4OKom|x$vG+NTJ4{8G zgtJ?lAl(CFXpNt5JS}f;wWaV|XjX~$DeN_i$flMX2!Qw1DTABaq|=2E;cC~H--*)g zAMH7Z8Izmv`=+BX*GCE%)N*25qI08YcmJfsr8U649mrYzFvI(U9?W?OxJFFonbd<7 zC~&@AhQDeE5^;+hNy1)9F=ldbT?OY3uFm~>KH;kOI!4KvtKh1aQ$gJlPdspEm)I_l zoBjQ5b*WX)DInWP1xD(ygGjJ0WA^ScTW7-2Txs$TTzo9|8QhIiBB2c5Eyh^-cVg!e zu_~_c$N3>I35ypC%=^Dh+gi+B~X*Vc)@&c;xe;%L5K^j)zLtOscV3qn+Ff+_=JEA+O#|^c= z(-kHLRKBmVf=v{&Gc6iW$->=iTOB37jN}5Ti(3 z=^pcbM{8}J0D)J**R9Xb=nq>jt)l4N!fO9n)G{*s&>3dofR-UfnkKm4_tvr)(DjR`d_i$q0lAw(wQZ z_yVsBpDA*_z&@th%f+o>8)vs}7tW=8k}?8pPs1fS>Hrgy*NQ?FN%M zN?@~d$D{jPoT#{m&mSB8G7P`$jIF+v=n2hP$~}es`~ebJS5KYDXP8@&++Y>I!nT%6 z=ZqSc=797)mJoU6%hYL8~F zy~tFaby3lF2H9aBT4haz2n*vQj?_|~gqPNz*1MVL3_EUl)A8H6Gnnu}mJ05VwAPY0 ztlZ1p$de}LD!!D<;Ic$HfnM1BgJ}YooF1?;Q6_3vF8p!x5)pA*5sW2zy?B3KbIDBa zA2wHhhp@KpZM=SZ+FKaWD;P`s>aey4PaQ(%@*z=Es`vf#P|X@hlTMTQd200fIK0gB zAHnMrC9~6`*(mUZKfd=7p)L-S`zX-@f1K(i9j#wj7ukEp9@yVpr}~U{)1g-kA1Eft z5j`8PVLy&HL)e06sd~f?WdeCub`0R41X;77itNpv*9){+n)@V}q-4+2DcZP_3D<&V zbFLD30Ry!4S)IKG2|HT(&xu{P&eJ_k_#&AWzuQQ4&LQ)SdGZVU!D=|^;7`qzmC!~>dMGYf!l#!=}&L202n=QvvFb14yuV=EwxLg`T7@TI5 zoEN`LGnILF0j6~Rk+j0<&MAL~{`Rex`d=x0P7bz?HZ1i25rkl_N3Z{W*wpRiuV z!SrBFn8dV=!xyN3n*$wvl&}Sh7GC#vvJ(a{V`sfRrU?ckh~0;f4dZwh;F*xzthrs{ z$Hs*=Ar$Wa9YQ&+dB2bbmrYJ#napXeEl_6Bl z_H0@x&b5buB(q#B6|oV;4}K$*JPS6fjj_ydm>oIr&Xgvl;}ea-)|a6d!OVoj{n(!m z;oH)keww$vRg906FN3sd=H|~mCMr;@u|W}4USO6|{4^51wE{a=?M+N^>vgRkRgaS~ zF{A`ks2`?E^w=e!$2evyI~@BD0()#Yv&Ozkx44VI%sA;~SF%iZ(u{;@H57@!Db>Kn zQ^hOg{Grr-W!sCu`k?;_Gj1YYzFYOYiLi+l$4D_`_*uw16Pyg=cn}M0%!TAD+h634 z#i=t{E5<8vK zLJ1K#p#zAm+&6}4Q{kc*wwtc9H7?K|)ZTTmioLOK0{tAC3TA1(t$I^k;|~hi*P;yVsIsQTtBr_QHyJ9q65=atl7Z-K!8cpA?gOpwt$tB+9o0E2S3jdxE7xCotI_1+U(9m+p|5o)Y!s2)G*+2yc9b z_2O?CvMz$y&$qYrc`dW7=IKp;g)LKrzmRc24-6!G!t8m{iWzC=vQINwoga?71OM4)%;e7%o1=yH7pZOFwF z*VxAq1DOmOlY%%Of*zdG(6DEm)T+@KlcMzrjMU`*5q?IgYX@P+t)}gHn&~;fQe5ow z3t%2Vov1G{^d&#ZHbQ6xK_WL^xas%#fF#SP%v6zvS@>>W3&WK9GmN{!hH7F-5eRWb zk_yPNHQwMFLH5OTUREdol=1)_RJ$p5b*+5{loc7t~GP^V_>mN+f+9q zB-rYf%Q190mRGNJQME*b7l&W+rzC4B8-=d_oY{jJ{r9eG`iLPE=-?YiT&e^R)OhWj zb7)TSRn%k1B7y3ow&kuY&Off3c+I7#$N^1p+V-B-w|93&m;WC zHVf>zz<)$2)U6wCyHKd~61hS>GS$P2u~$nC#`j>7gg?x9!yfw4n%9xaLAJ%kF=5w; z5y^1Sz{_jgS(cX`;GTE=lma7#Me$JU0sdj0rGvEJA-gwRWb|STB3h%kbnsP&lSN%4 zT3tA7KHUot* zSh|}CWK}#dAyztxRkG@8$$k@piPNf3&90r^LQ1$$Zz3mKVWdm}TUmf}ECdxml&ZkI zUE({EcfyzZ=mh;KHUn$_b|r=3CrYsymzfYnea@ey3h{G6(^S=H{;N7KM7!|YtdW~U zgn!};dLa!8iV)s{?JsqIe@_1$3;$MXNr9Y+xM9DT6sGzP4Hr{Mq8ryO<0Nczn8a4$ zViJCbUj@y3IhsRV^}lfA7srh8sKUY2)!dxrf6u%cL-LR!Qge>n+B?-j5NY5X+;zlU z^e5y?o#5qvGo7hpa6I}lHNP}e7xMgLzeWF60o%ECmUjyJlyKRAB} zwYVcFwZfXz@3KV3=3vPc`XHB|+)tj~EzD!1dNp`fd^JlKK8-=|Rjvg?fRZmx<32i!&s-p)yXC+JJ0Gqc$c-G- zD$JPbRJi54KZ!e;l%Rqr>x15WEs>eJ%H@i_ARf{ryxSq%5 ziPRA6?BbJosFogg+GxZ!?5EpiA|u~{NB>XS*H2aS8j(u^Bh9LpvRB3pHGGX<*+Y%U z%MH?|dpC_6d!)Cl#eGyo`1dSaVf+5+H!myN<6+UJ5Pmh)3!yxp-*P(iD6BX@x;JVy z^P{DIbJOO_*NrtJaNy=2&*zSYF2|gTJjjtUw3GVaVr3lcCNAOhfrDgChEC@tp=d0_ zL+JJ3k_FTi>IRYxO^=Wm(z^xb%t290uTg$&)bFj}gc<)i47JkPijChoAfZu?@FzoZ zeSd$;nD>g|ZnLM2!CCwvG^xd7z|tQ78he7j`|`6H^LXKGVAGxlJL(fV*!Y~8uYiw^ zi()dV^9>@Cge!zD*G>9Z_4n4Q47mdhvv%WZekm`YJ@K%W$1=bKE!PknWynNy%N-?< zZs017aUU!9oMDjL55(yyc4xOAMlSY(CIUb3zV(5BxXsK%bVT!tX3IJn8eO%&`ZnRf zmaclx-yr_+cGsNG=a}%)-R|{nZO&03aCzgYRj{$2PxPQeig|p)Ejn8c&b>?;fWK(A z^R<46*KEb>v;A(%${79z=V63*AvO?c0e}aX^Jcj!8O=n!@4w0J(LdB zd1!c(+vl-0JnzEjg54d19rJ07@Z~k=sI)w&%$#uDS9eupOuT)YtZM1B5K|D`rV!A{ zpaY*UDtpN{=jnj_InmB~z5rJ7^r}@ww^X>S(d~BZr!p|q6Wr;sW55d^y5FSbo}V18 zq5I^hk5-8shGf3c^aF=#F|3D9btT1XIvNt+GDzC8HV(9-4Xh3)UM}fZ-kACAD%pjv zmS|E&!YtHz>6=+G@292f}ft zJ|aqSPJm7na(GFB@RW|2!|d&hiX&{lkgfpTg02}8NkS|p`;H`wD7`Bo-EqwB_c>-h zmpYEWK!gUO-IhVFpD(A)#kqO3k^Rba94`huAHIKif@_eK9bIB_4)w{BT_*ZEe>7nt z^s+tq0;TH{=a}|%nYn!U%3z;0m`~$onP~IyHpzWRib-RObLflKGS09|mSK%T0{l;E z3Rp_pp~)7^##s_dCtkzuqdzG>tI%HO(~0wRi5|JH8Wn6@Bh$8V60(YR4!8v8 zxmb1`aKH7)gqbU}68g;ky%Dg~sX>?Gkq0kiHaA19OZaGT{V5z#<(m`DnH?D+rAVnk4==WKw{pC^4AxN|G^s_+WBrW-A-=}{rgx=UPX`WrrPQW2u z0JUl^oKym|f|5>%`bhLPutpWTqSik%nIbtAXuL0$RL{R6bh6G!e4c$2pDte|Des^V zJG`(b^p3uIBSK}rCpKYIwo&lP89IpNX?XpQuFU}HE$-#U5che{6!80s(D-+w>{M+J zWLeueXZK(x8=)))HpVv$VGz7n$TD2=N{U{Q9GpzEVNmB`kthS^Z8`ld2@e%7EK@>_ zTlM<_KEKZH&$Q{oonBxtG3*nV42y;qk7BJ`%lb{;+a>Oh-1N##x%IzOXQYkLO1$oDvVX)6AAr&eqeq2ti z*5{Ua6FSQrzQdf#PwjWh!{AW=hQ|X63QHV*03-hInS}x_s-zfyN%R ziu!Nwn=VIJ6TR!Ql*Ec2I#q^J^5y1uPa{||&$Ywkih>WdDl3a9Ijh{(a_Ic$6|GKEp8dI*W46pW}sCP|Qva zxIq3l?jd=YC>8#tA2t}~EVz6T^AY6lp3spg(UK^;Bpzp;=r>sGTnsS#1f4WWn~|%y z@oge!cb*K2SL`eH%eVUFTuKTA&~(D)1}@*Juus&|dd11DrM)g1KL!h%vZ~{WLoNr@ z-?9l9lw%^1bjM;>KOXq8rnYz}{f8uG#Gbb62ZIioO&nF|R2@nW-IA%3A^BAnM;RyY zsK-y3k0Li|9n#5KoK%Y&$LyOs^dcy`)m12rBzOml*^IL2e!3|dv-He;8;3%B;BGHM zmHOH0Gcg7WW3GszWlJ5-FQg=Pc`8zJ)*#Uz0o}$RL)6^xLx+99d)G&5$siAD0M5n{Wd& z%Q0b`*(%L;_~avtGhYqT>z_byzZGt~D;BH2MV&wnH0RInIU@wL>4EBc_O6R>I z=xRPcB49r&%5n*5FkTtSr0%N|KxDK0pA2yGMbmLiWY8jOb7QP5yt$?DG5XynC~J=W zAseH{bbaW}%aV~mjw5K{bT&-)736aO?N7K+P5{BvO|pr}FIsSq{+G-vx~%~oo)7f? zPDFt)oYUCvt&C9qlLBk%zf^(GMXn;1{)o!*h%AZJ6)A29hZnjwZ>Yo%3WUK7C-X2kw7)l9hsQYJ5MG* zNlm|uu+#v_W!O?$!&3{M>;w2sA8V`=Y5)c}=L2{Q`b_)Kw+Q;{K$fv^(Oam^jHU7= zxHr@eeim1+PfyPxPFVZa7}cMa{e1yVW0f{G7791O{1+@gL!f>qmuizGQu(SESG5v+ zSff$Yyl~-uNNUS(Q<6Z~pDj$org_$|r>-@SGH_Pb3J`Jm)K8WsWCyDY`0Yp;h%l<~eci2upY|_v+zc#9)j9 zxFnM?@(@w2fTNtmUuFv%y zt%w`6u%S{UXYUxxY@s5NC^ml96512=2-^%#+fR{U*WM{apx|_LRTBOt+T0=%mV(-)5*~4hMtiR#ujU@qxZF+2y z@Jt%_F@0lRQ5}yqtOQwz?alr#)Ie{yA0?RbL52SU93Ka9O&d#3HO zuHCV1qhqVn!5yPx+qP}nwrxAPW7~E*Nym25dGoyU!y04GwYE9_!nIvTRh?Bw?S<*F zZnt%FAm{$M-SF&ll-L4`L-OjP)tDNy;(U%WVuo$cr%OSOgf_HuQ2DwWO@{Eggtc`# zz!fTN6wQbi81)JI?-{cx#u-HCD`Q4{jVJyeH(ET*Z46odt2=D1C~5m;um&@(!(I<^}4L-3(ajk`VmVueHTsv@XR;&_#}MI-k7!TU!UXO#UlRYv}OoF+YNo# zO{n58xN8})H%NIFYr6m*ecCEkMt*t#x%ln1QpO&Pbc!fq3Vl~5;8L%73w@(==+IPdBClDH7WxL?wGO|Xusojta*CnN;}kIt!uoE@%>}nA za=sI+Uws|NTTt-~+5R8H#uLMH9!r|VmB-bQZ#ZRAdB4JW3)iZO@VcYUOjzV_|Q zit*Xw28_#HOWQf7YJ3_j*j44l$L;5h<(`NGYs;o9T9;lKCYrHugQdAuDCJU42~8mE zkeIDg>@ZA|GA!RQf54L(n*sXO=(nhB6PQFXjCMvL+9>j~XRcwD+SW*NNm2(~& z)hE}9DbOoUO?s?K1l`!(N=z6NK85m)kySuXd}+_H6(>7?m|QsPRqC%s+;XOHeG2;h3~7kym6C0v=MV;qLq}fn-x(d* ziYRdTeCPfd4pl9_N)CV!g>l*MBxz(DzOG=Q94$xLg_J2T2(6fnzW^_Rc3SaY{gtKr zG^M_ls9%?O#9p!f{m-OBO3|hM%2YF7wcP)M2lxN~ng6xozG1V-gzP<|swSYEn83AB zeAqBAk-Q55gG}RHP(f-7So`68uE)Irx4(lkBF;{&XO6Mq>1A>>DY6*N9%F_VUPpVu zTM<DMWk92&jC)}g?L&yF z?ZhFi+Pz-cPdz~Q@mOvU4V-Nn>i}E}#NqAmAJi&{oY02+RYY$#d>RFGK^Rr^a0qqd z?5s87u~#}gXR+L|o?*yBpI>|V0)f>-Tu;YNgI^bsFDN)BI}y^r(sjei)(GtM&sky7 zA%{}rsOUhOa56&9JP)}G@6rn%19zx)IywiWaii%{F7gX;aCSiyflWNB zt$fc#{8);^B;7o&v1u7u%5K*zfhAugQ?Ib(yL{0f-7kT z>LYr{&i4Qjv&67;w&-j=!A>R>mh(!~?6#JKub7YlGqpRRSuavDqOL6Z;~|tdF{7m; z56$L#vvwb@^Dc8l|3_lcYC5WuYm!g$UzQ8KuLTVD|GQ;LSJ%$nQ2&c2p{vWNtNRac zN>`V`(9Ye-%+`jU^`AX3!{lU5O*B>X5VVB2AmkWQVp332(I8|*SmjExAR%&OXft({ z5l)mN`)a8yFbH3ntJl=F3*}FKMvo<+id^|m?+n1pW2dRhV~+DPDo^G`SlNp1egEIM z2;skBUQZT^xv8fIw$u%zD(K(QgUyoK5jLnGnfI`VsX<`&I9e1@6Z&DKg1PHrU-NZ20)Lu)gAC%np+M-*v%?HE!ww1VyvB^~ z4YT{XT_TT-aoNYs25Hz2bW0u9*J?weG()8be!C%*?n}Bx=#pJvq6hdPQ9*I;Wj@E5 z=!v=^6V1_0!XoYAACfQvqVAOZ0{1`~WH~~W*F(Lz{J_%r25|}cNeKGlCrz(^0R4aV$6lLqg&6Ls zgL}Z)1|MHzc|ctS-96{9%@)La3}$@N!xB{q(kEy>vsQS}U;(4BRwRsZB8Mt)4U1Wj z#!$JUg`TqPw?u*Zx>QouZY|o5H&IwN);%ghE+gh0Q;JXo3ovfd4F!dloE`nb#21iRAt1kU;;7HB3H>ImCN{EqJGSZ%yq#o4vCSRy$32 z6f+CW{6Ce*P=AF+u)cFe+O~~)-eY8kTxy@UmBdV&^4M*Lba1J`AuNc(EC1fvI;~tQ z*{EA|weZKv5cqQ=US1t{FWTHO;sA%KWP2Bk#m9u+?tHp7_X4NygSEO~C+jzOoy}}XMqPAsXP_(}8U4AJs zG;T$nvXQe$%tk{qbVvB9 z=FXhLAsJAdO+J=jAl`T_o0F=4Vl>v^RPWSyUw7YdUw_}YsfVN2KE^W2GRQJ@>qkDq zGU*U$9CXM&K{Y{;!kp4ccR+_mmq_=dR-$&<2rx?5cOPV#NH9$|rLLo+TAMmS{^_)k z(u;vBs@NZzX8w~LDvm8V5%ftb0Ytpgm|_gJNG2)Q>yUB`X;3DcRUFmmrlXR~G_EM6 zp3FUtc%{{QjAW1skSHuTX`Lg^PVyM8LRKtQnV>569AoU6pd$u;&OXLMhLKqTMZOgW z`(d(6lPkVY@~~!}X2nen(ln7&gg(2?#y5v5E>66lMA3Gey9m|cZjtBWa40~H?SwNP zg6ngWuLRE}Tca+23T6HoiC3I7yXX6(DCvR4r(j(@0`4PZRbjyLC^2Fn?sF>Rvzv!P z_r7OU@vi4t5f^;E)Jnd3&8bM0*t?HC`6UQYPb%GWTfv4>6rG|?FZ2qNAU&}wIj=T5 zXO*tDq#w5NL#rT-4;Ccl0i#t7M*vs1ukxp#n6X$`XU>F{DM!c+e8=h z#ExwAtN^X8S`5)-`4Qrb>5M9&Wo+uL3or*sYX;EVRhQFx&%gBZ`YvNwe7>puXvp{! zr(GrNG4}oQphtBc=Y!~~<+E#L8SSE-{q0};8~+4p-z1sb$uE@3I_bA>od0`}*0-`V z(>JlTGBPswZ*dx^F=dMzeho)XKlG98s z(%`xW86fK2ESyf-zD4f~y-1$%O(0G>K+7RHK&!zQwU+ZGMG;Zp+wqr;!Rm^EojE#A z&$YedbmmHyFUV4^)^f3eE_ zm>_ast(tPI)4sHvT3Of;UyMJ6pOkG=e;$pi=~Akg^fEDEc`2YjVPM?My_)R$rtNs# z;)7*(fq$*7Wi{k4RWU4S!Ts%xQAc3}81e>x>AYz=CBrBqKnJq9G}n(OInLLIJB7*Hm%U7UmD;jk39{$UfaIW=H<1y;P;FkGS{><5dw>(` z!Yy(p6`OL&*XYiSGPg4_>9Y*$UYUC}s#ChkXwzae=V8;S?aJtCZK-?ta3}LJkFe>p zO&!7bli9VH6BDRCjv8|MXTS2MXT*EC#bv@l&dd2M#Yv1Mbg*JNVv!a~);9g`olYy` zlyHB^Fn^@Uhgi62#NWfr17a| zzTu($ll(zbozM2-Df*(D{AKer^|EcPzzFa>zc^uQwtkV+qbM8Yt~%i($$NI-u6o3M zUAA>~%-9#CV_(OYa)U|L>e1t>f1If&WU0#ANbfDzQnlELg$V}BF&rS*z^#t`Jo5e9 z?-v^=1UiLrnOZkX2=#tUk+p)wrw>PVELto>Vz~#nw=;`Jq;U}bEWRs)6UjiIo1ul{ zS=)w17EUcbS6LOrZM(@`{w;?JYARK&j>~0MkF%SSD_#^hcicfj=mm#n@IC%^Blm&<{LW?KObTBaWJp>$MxaB6A%YPD-fguC(nbi zi-+>Vdgv^ac%tGbLO!i*9YRVvF?ICBdx5vV9}g#-quwd=OnD&EL@h+#ja)!U>{UT8 z-RF~m=#h*=0hW92H_Tl&1xLXbyM7v$4mY3*X^!z(qkYPL2YXI&a#0 zL$3&2^P%;H1Pjp9EiEV){Nm8ZLSQp^&1-FZzlD=PS-XwGNVl$BTH8oj3r*)&L3{n~ zzxY*I>E#ioBy8Rbip3P$l2cVJP2g$orv{^rUy7u9MTs?N^O<{yQA1(3Va&y3VId-p zj!bs4iY3tTD(!i3R*n%}kY-RADdOP?r*8R5h6YyzE^yN)`gEQ7*n}!FYL;|6iX=j_ z9^1-3nuKbOZ-6HQ7BCqLw6T0}u=S9og-jAb3ED^Ml;YG;+cAa-nqq}UPRp4#E_}#Al zW?z`UNVg#wixY4-m6JgQyy&CSMZWq}XWna7O+x z&E!l!{4+LX1{@xoB>ExtgdoNpmAUaS@^kV~yd2J$!FRt=gRsSJTbv;pH5QX@lOSZ7 zWD}fLc8c_31$ps2IM#W!p`yilqSqwz@<8H999Uuh+cZjg67=Hb8LuO}m?4fKuKWfK zV|F%lOjZT(O{4jcbR~78dZ1~(!LnKia?5OR0Q))?r0pYDAcjaU_L3V-VDD?ZKZ68I zJOp4K=atL~^KHK1Shi1MNV28!YiB)*<98MKa9x_oySdSSQd z+&+L3x)rn|5Hdn;?1O1vLX)i*Y;^#4XMGYDS98euo2(&lRiZp;pQ4|J_qzaDm2EGr zrChcB6vh%tYrM+xo?KiqGg(!fFtaI{f$*;+9QyBaA^nWl_!H2Z@=TSGym&$RuwiyT ze0ujb(r^Yr0g+GB@K>DaU-(^?f>9X%!#Xu94#nAx5O8;SVHTEtQ&cK>2r7gb5dkU= z^6sNehh%Ef1L7zrGbv0ciM|r}_tI6~k6Dv|H0UD)w{L`jXIf^@n5bft98n}~w!t8M z-sRsX>+@#_R=^@I!Upkc8JH+F_vSrqdbhsudBSAP0#Cfe8DX z%Ojg=$W<|bVKMr_GW-I>3=lKn1R5skg$$z<1hb6t`=Q{X8r0cg6U!mzt$H|NYY^dp zZU4%HMit8!>?)+v&EU7pABZ9~U<(~06X4Hhx!J=Tv6z+cEA>~Zk7x#0;A11HvhIZ? zg9LFVp8_S16O1x|=ZK4pOAJG}<{c+Rm8eF+F0)4IN{`BmWXInV6M|!Bq2F~}-TCmB zvm^isGeph`;RvOy<3bh2w8)k0LN^K)Zgt_BJ_69O=IKPLTa#Vtp}~|RbE!r(2H0~eWgQl;{@?*Ie>5_mA#=O^ZvJ3) zX?57H$oPrziW%aVZhAW4F@iV!UitLIKgUgt^;DBp%a_ysTf^iiwYgBV-R*X+4us%n zqVmvHrrVLicY88NMHXmyRo1S^sX^sy8+CqQnXErG>D|g=PNW)(89KGMUz*IF+|%Xb zWZY)wU`=;5exmm2d+$>p6yL+A<%WgkQHyjO;=J%|yhQNJ=BtWa(fxQjTd76*xVSNw z8fmggQ>owJ`;&3g9!0;omT}&0;~L}YlH*Xwq17c{^mB52*WA_k*pAKBW&W$)w0H|4 zVDDDL!49T0Ol9zV3F!28Rl2|`?BJ%x`*9KJf1V!Le^jXcR-l+PR94TJtFbUP=kTB@ zd$}S1L41W-SbW#mxcz)@viP2UPPpol^K@rq9{2RaPb1MJo5AG#fg5PlmrY$97~`|v z+#Z=OfAC&psRT7>z-FqO)V_FV*7E1LSma5jwN{i>q_yzE%-$hnsToL+m+f3?&cm9K zEB2#83={TcGKapdi>(5yCG#+*R{ZWZkI_7fC^(v)DI+`Uoh%aTm4BoNgf^z05+SL; zl>RA|)wH~*-jU;yM)a=6c0TLmKFT|OGMneERpRgW(a+l4vOvTNZDYNeWSdgg>-`BV zH`B0wO&8N+m9?3NnlU67n`|OXU6s-6<=w-w_>yeG>k=?5yPw+79+A)Nz_nA;?F7}Q z6rCBB)UL`Uk*mbhr`b=KSKfgz%WdbY>vcS+KHB2~r-x|2nuC>I+o`e7&Iq_aB!UY{ zv6e5f61KG-`&6-Ve;4PRA^TJ=IJrD)j*T9h9F*u$DoR|mrl1B+#SfZpk#@kED?RTh zrxZ6AUUCE1oxNf$p$9696pVa^@O*Q3L*vR^y1uuL3;z8%Fh15_=W_a2TZm(_it?cb z;N|XmFK-hW!&yg7BjswBJ$e4yp{}!wBV(h!m~H~#YC-OpnJCm(6o2^PJreZ}#gOQ| zz(MC@EW=`((G}O z+D7gqPuW=}8JAB}0$7zXm<#tRr1OqT!siEN;6X#C&a#@0%bv0ofg3K8{`W*5{Zkof|v zd|*}JYDnW)jUl=>8NCA)E;`ICsNlB{OzKP>2?sF?T|1df%U3v$)o;Li#*=l$zx+tR zCLvF2E3D$a8+gtc+Yp0nnIOH7WM6up8#W!GV;{bBUF7sXrM5 z$u;|PyKW;^<*%-qNxofr#*KtaC6@1vVY#pdHFHep6CvVLjSi3eBzF23I{XAFWNm0( z^W!7h*Jh5&AKGoqII%9cRhJRV?UZ_dBM~c8(r#hTN^i3Jq9A~)vHsQ2VgHaGtklFf z15GDTbziKkdTFaObYvE*k&DBVtI>s-5WWpL(uv}>o9@k|)|HMzRAa6ZzHaz2#5<*t z)y~)I)jS=EJ(@^LjpntSQ(_;6dsGx>W5VrG&o?$YWFU$Fnqig7o2?^vTNam=jhDYw zPNK%C$DVVRuMNfxX0U*>`#R;B$0tw~VBht!Spc_Vk4=ArDsP2%rx$)CO*thLvlIW5 z*RHxaSN{?Oi=Icu=ey)B_g{=oC=kU1zCZyoPT#b+E+y>(ZMTd4l_|;I4(?{vjCEIn zvhVf{dJwfyv(Cgad7mYSjxJPfi=v%er*Wwx!8ACv;>F1^DyA|e-zLYMTjk$G%cNYj z>Ih1at2*UcS=^YL{N$g(PPpyvp8ARsB9JKX4IYx|DiXKH%yKXJu)|KAzAeN}x7C!a zc+_!J3rQH0&===&lG$=w+2i@3Aa-qRBbrYW~N~GecoRp0X;hw9d-2F)A>SwAFfloWb z6>ZnlWM}XO*&DS3TKT;)HMxPgJ)|B(2U4c<>=3fJ-_3wm+^JYs4O z^(HLZFf#6NV-c$Le)>3}IbtzCLQDwg%Y+0fM_)mQ52(Z6S__na`anERXm8dPb@D=W zG#re}ZRB9_r{Y+%Y`by7?>$iJ&Su{6*ag46gYatjZ|$sC`!ocA!a|5`wo>X{lIvVj z@;bFJ%56)4LaW&=mHgo``paUp-Ow0i772OPW$M>r{){<$bU)t{l*+W0e~t0SmA6f5 z<}F7c$;?2b`AF~~A4a!BKD4o-!3^gB(SA=#-o zEiR=rmYSo3VvAxrHr%tsI_*uIyeU1xuSwco<^ zcDEjE1g>n2onLz9sazSncTnuVmP9ktvql|K)+Cq> zWWP^_dwya(WkXk+aRa7*-peBi7~QZPf7G0FF>q}Z6dfDjSB_O*Wh?$Uj;}>nZVi z|Hp3v{dHXSKSWFqHJy=?7+5v%InJ#n#>L#87ty6ug9(IA>|`IY8d7&rlP=(NZU_uKA=cIO4iwzeTHyK$>@{$-bzVEFL*9cw_cB*B1<<)cB9L2al~_j-ba zq_X@DV%3_Eb$*ORstT9}ow0fqmWO~I6lymgepSEe@uD%yvVJ|Au*7SX-S90DpJe}t z#;Y_{aV(FC8h#Cf&2ShRD(8W#XnD8%=Ipuu=T!BC3}gxRQ&<#q%6 zU26;J3;x1caH2RI-a$vJ*Obc%Ms%(^XQV=$oP20nQ-#cYaqU2on5bD$$*!zk%Ckhn< zp5h~}5E;xF`KFR1_3^rWt|6(jBrkzob^2HUpa*83qo1g%aa@trY%@*5#P~95`MEfu zskTDAUbBNy{NU-25D5@2Ql3xTkEe^gD70lfra1e!LG|{=2FFgKhZRpRz@>jzh^AE1 z!M3=6ZfX5$byp`02iVFGu-1vCMU*J9b>YlZf;p^!BT^Y1!Zi_pH1R3GHO8*htfAty zo}trvE}-7bvT(!|Hltp_L4N5O@p*Jy`owWM&n=h&=%D_WMbcrMrV>5eECcwA2yI$c zkuj#FlB0uc9#_O!tyyU`mKe_|;#KBt@#__7%Ur8BJNbHc;Y?aJBGO|Es-xWqk!S1= zYxbk@6pc;a%)k!^91WxmTgzpqlMkjW`9Q>x;3rRDVmBmCnN!peI9u>#q3ML9r1=9W zL`87!1IqgMP$Qce=&}`Fm0D-Gshh~@C_kN1p?su2T>7lE3u5z4e&{qaa=7MP1M7(n z-?CI<^48K+e`ufs47Go0G0XifM460`)kF5UdPK%z`-X)T9n!y=;(SgJ7=ZAFyu^Vo zNu55j9ra5>PE9{vku^NZ(m#=;%*UYkkx~P}o#w?gum3I^}gdc#Io7TmT+5+dpjp- zC#rQD$}yR&`1czWLw?7{WZ6Y=azabL<)cSZx|1EqTdzz8^I% z6B^L7cAlN@Yva3O`}lSAIXa$hG1O>_{@6w@XXLX9;k#y&5vBgX5tBy_wwfH!N0ZWv1Ziw$#`)rv2k*^Bm{gaE5cdX-7Mcu2!K;1QQC4ot0XuhRl+UMGmQatBL&&LhZ`EG zG_N`CFK9xBMP{VYR(UnjzNXa564UN{G(!`tJ|868ne9+I1L~x}j&m^nN=U&AP)rAN z_$8Mf_}!VOVi8a(F~carR*1%7r6>|edX}6e*;raCbC4LudLy1fny1Q^F}Me-+0lJ1 z;@ifdhD|3wouZ0~iIt+VY;%2hHZfql4FPE$XnVoKY`0tkdB6Xt?mXj9VYb_q;6mud z8j_|tYsNPGW)y*Rjo9Kna=%oHd(l}EI`>6v4QT#pBQ@7%E^3&&S2`V23H(@It%}nTQ+CXq2#5|M`qLTDCs(=lirmc~QQ|MWX>L7KCxLqBx0Z6+<_~ zAnuw@yaf>EE}Sb#CEo!xTi_w$WUQ4mfe{K`zj8NL!*v$1eER zVlixScsj@4O_GSCG2G<*4o_jfr*YT&VogiI%|tFG9QjuwO>b!=(SImo`qiPxNI4xq zE~-J>UkGU9-*gB}Bpg?rjnQJp8gK+Dzo5YH?<$1?OyxLy=dl6jn_czZ%Yu9Tc)OCA zVPjCX-}*uz=6_|-w%}m{_9S-26`;fuFse{Xc4QJpFfe}6PLb&k5sUv0JrYJUwaknz zg^#V~FkCBlry$ZCIeLkCi(#G(Rf8btT+VLJiZrF;iU-PHT+r|_%QeZ&_bV{u@ZbnZ zCu!kct~~o(NP2=f;tx~c`nim~hf3Pk>)dR-(7ldHZfk(s`Jd6CF z1;EE7M?XRj@f|!LF^7)GZ0|c4-t9Nwj%TBM;|WUJU)I-PJAv1q?gtKgFXRB4;1Dz! zG}PTpa;HI1QTY~BOCzY5_=`b^HA3Zph!bvcXC*j*M3Afe@g+G%vcAyjz>!_Bs@sF* zBVNDdrl&|-=(^)sR?dQ6^1^YE@+T&}+j>Fq$C^L(Ugj?@3ubfwZl_@`8FaJC+(?0{ zCO~G@fh&2F1z(IJVQC;`tfoqP!Qh-)5f93vVf=MNzNkIvV%N%IJU%qf*`9+9K#Y~z z!&XqAKFex);aq&9~HlA{zvOW|QMN0#dnqoJR+$d>F6mB?6qV z*5A|8*xKB9u`tMuSBnubs7L9|(f2)3jp%tReLeQ|gCqJOJ@!MVNWN5GBg=xMFej#Q z5sE{Y%TL^7u4a}}u*ipSNa00&XU4chB<(HwRtPIQNfll%Rk(3Q&{ofdn?2Xc65&Yf zrA%?ku3Nhh02W9T{yl43>zgOeM7*n~)_j}YJ5ZyS51yHtnOhgKSHHM7=tnW4-BPB% zh)av)ySdSV2z3zAfpmMjvsJ3vgRh#qP$%lPMkWwBTnY_-qKPCxJqTctqJy-##H#2)m`o8|4!$0di1 zTj_-V=mnX~NU5u=D^U;u%ILjMep0MhjKsGCxc_PjHcyPWJqeZxl>g zQ#98l$h;dPyP_R8)oH+&#IuC@B!zeP+`iMa`yVhV-Hw7yvwnq7eFe=3I1*!GDbA8v^OK^Fb^`Z+U*q%?)Vcf{ zFKwMiDEE{$YPt@JigtkxZ*y$zFwL;GNM8llYKPD)&?!`MKFUZ(jOs}fA6gx8KZgPL zj&OS7hF)Qo6j)nqYKBY-0s8dP1_z)b7#;AZ+M=2f8P{jv(peAPmrAx-z8b)8)Y`=v z96-0w*wwD4SwZQHHV&l1)y4zr{QTyz81jZ$-G9)>qYez1uJQn5FN$U5^H}UbX7>~8 zo^=`x!5n>5{muT{GRgz0(SE$iQ@*cjm{AUXW*G{M52t3-7xTA4u^mIb0S7X;D<=3_ zuUOsukK)IL7tb@%{JNu<48a>Tv)RGavtAH87+4IU#J?sHgBZQ^l7FGU3nNK-yl12! z5>w06)`cpC+}Wq3_Xr+t*cP!6zSUzET9$WZ&1xW=lVxP3`$p&8TDh=*Pjv@L0H5=z zEaAk*knEt~b!OkaQ{Hhycz*Wa_;bH)L09Bq0-4FStm5aoG&>IP-KfULtK6vUz@rq5 z5pKDaKcr$bYW4~?2anJ;2Lje^WA-Q!b2zu!$G3tlk+A$wN7r3XaN}l-uj(*5K!1B8 zIq~;B5RuLoG?vYkR&!y37I|Q&=s>GD*5UjX#U_j{H2PbN8Ui>A&L5<)g-sI2Pz?J$ zgBecjYHKp8oZ%LkXoWxMH;hpDmD)$=^YtZ zOK;glo!d9wfHcyIKF?hB(p4pKcR*z%cV_&eZf0>X3|Q=8?GceRF%5b@=^yH}LDl!u-D{OGD%T+0LDb#ruKYGLkrE z#I8xhj}9J+qQ$P9DBjXZ-6`m&L=%C$R6+Z|1SLBCOrC!J-v4Oyv+}+Pn9}1npt9fJ z!=@_p0mWhGe{6(Cj}h~JwC3~pwtYOa*V#$f_o(`a5M?F!m+XoS>aBHk363oQIwN7$ zt2)U<#mtz_XfaCN!Zdm|A3W=m@JD)%bJaSg)?J7E37Im1M(2!v0u?=0s&!)?f93W8B_;N%ih4po#4t=z!S<4t z41et}lfp!)TS38hn;%w+Q-rw0Bp75(;0Wn;f|_-8B0Q3`Zgr?x=4}gp~H6?p@acCu9e>L3|p|vM*VZdn44>o1yr>jrLL-(gdnJ zw@=d)r+%oU4xYOGV6Q&&y-|!8)GD?+zj`9NfBV?591R68P9S}Xk7+dYt>ZlnlFadk zbU!OgI4kc7J$H^->1OaMj>piI?d#cd#N&bDq(Oi76t5wA7Aa?jlC`&#KWUiXctAgj zvvJ+(@pXw=tXvvAw5o6}j|t?zz1t?6Td+`~jKtS3BE$FhmYg@F?8#%&(Dws&0*xK?uM{>7i6H?l#nkQ`deu1@IheTwb?Z^ zq8`WoJ2GV8-+`Nf!jHnZY=F-#W^L5qc?u}*&y2rwWxJ+q8IymSn~QA!NOs(&-z*(x zXl)D^8i}Wp6?8B=rWh>`#vG*6{;_8c|aF<1Qik?A>&(oq@3q+Zc6nl zC4693U9x4MsE-&StixT%(zLV%R(azn#{!8#A_q=L`=S>@LU_q$c!r-$L0nPlB4QsP z3&&ugGN$BF$;lcMm$@{TEox0GHsY{Cw!sWC{aSOnjBPK>344S@dbKycGa#Q_M2ZbF zxg?p`)$vEii!&B{K)HQ zhfuYz)p@G57Y|UH>Xt+kGS9LF4_#i#Q$7g;R3z4iJHn^j&7*NXid243o^0o*vm4&g zZ_44#x7wFgY%J-8Ugmm+MptW#?^#P;rSuyi;ma*#=IJ~k3)j;wsL3<}>l6vRwc72k zXrMSP`vqFUAp_UIDcTPk>F{^G#J5lWrAyVb+wKxgqh;-N69%B{{w`A_*3i~zLMj>Fe}7(VP{;~ z60fjpCN>SxtAP^tmuO0E*nvD2Qo6l5borXf~i%21` z7t}7XELjO(asgAEk-xGo-nch1@jR!dDnsK^^b|^7dPA#Xo<5F-+11b~c7BnLV{h7# zZ!;UrIu#zf_F8N6yn#%clMLo$&Is;JV% zK(ZDJDMnZD#HgP6rKEIG?(!!t8vCfZ&WuPah{z;__4%buv*v}#cV=bVL7o(6j-;<& z5m|1ChemYEgHHBzOMKUsT)d$@u`aDe?Q8*PR5`_!eY8wy`D??ov-$`R9wDq6FN^g~ zb0G%?I{4L1rsVkt??A8(j`p^qnGGI7A$3jxGHvOVjC_xgig)b3>T-H@mb*Kw7r>D! zf0@sFRzVAe-*o`MBlLl1{$yjKM5Gm#t2eHD}=7T}YVW)y!LY!9r<7*|c4b3@1&AN%Ck)+aT* zlV(z1tqRK=vb0M!iER9PIbrvxAT2F5hUy9te|xDtSRnx$lbfO^s zX+Xxp&KRm-)EsJ(+Ap;#_q)8qU^%rBrKm(HkGq;{oik)!)W}0_#vZ@!Y8n<1%%#cq zeqc=K&eqFn3ixpq`-U`C%Ch9q+i@1>TSSxX5As0#8_>MsW@B%GwA?|R#vTl6Lea}U zy5+9xhl`23>KLEttuo1+th8P&Vt!QIu9<2F(y-kONXKSf38YFO^{qr=GWdlxOU;_? z?3X%+n=FRdIJytDZm`aLU_9AC2(=C7v&ctCNbvajagcavH;9z)3(e?;#jCL^e#A>< zSeL&_o#J2+Orq#4m;o!B-*LF-`1S@(X#Dp|H#9gW~{ z!AMg&n;cqPrcswx%E|bnjK(k6IIyN){S~rJPD6iRc{FlD>x;>-sUW_@uL*`JTAUs( zq$L*BZ3dNGDiDM2QVLrgHc*^K`JIHs<|su04}&h+;z70`N3GRY2T_v5o$dGIbxgHh zJBQkRhxn5S_<_BVdxCTu&B$EK&?Rf8uCjhYm{uCu+JFb3A9jx5t;uW`ATp)SyWJvh zdS>abq&DIL_H>+5C$7+(V5D-bP|%%7W;>x|qk=2mA4w;^sG5d*RGU-acI$id1GWg# z!%UdisY^T7L&n;=RS7NMa@)8Ff72g(M0XpH(nJ8vB=d^Feu?d3byL~Q4_iTbW$*oXJT9lE6c zoH$UiL3;(Oo$nT%pDI&%GwtEA?I4*eFEpW{FI=Hn1|Rz(XI98ylKCj$ShxXIo|ZLA z4gJ%ZLZN1i|2ir8ETn?uXJn!>;-DQVhOCY0Z+g~s(Ee;}W=a>F2%e*1-n)I=J9X#1*jYNJy7#y_Ua8)*Hr#=K9Px!xJhD7;AYw-Ue~i6T zV<=FQEE?OkZJRr`ZQHiBW9`_sZQHhOJGq&2&&z!CaOOv>?poD_?R#a|O=@gujh=wU zB^sSFsh#E0s8^OSGHMnzlire9!gd&D&+#;Q&9%buxUmNbDoX0EKSfmK)^}wJEQ}`R z_z(cV7_JuVaU<8cTWz(S+sXcrx5K8wM6!9Xu?e>Y(dzpnPRD9N3|6)f>(u;#$ zfKLGOY5Nyk)A;=8$(y_m5p~heQ8Bq8vvwiaISMI6b1i6{<*tP2MSdWO{P-NmE6fwieoPYu|Hq>Jh`e|N?qiTHx*pZ=G*uY-g!xVdlE0>Moh+ZWAE__NH|Crf8%T4U_QcV?t z@N6c@tBYg1J(AfT8QoA@h8HwHXE`y50>0EATQal5Ci{Io#elD?=4Pq7vVSNN??z;MpVV z4o`2eKnkDDUM=U1O7srB29_xNHV{AH32^;7; z>wcq=Yr?BLuo=};N~Y`eUx#j!zGBVR@NO@tvXv~BDf3Umti?5a*+$PDE&_X&M*EFW zl9DE!x>~Mhni${wt-b^FXt4S+G@Vq8-RDRd^708r^lA^*O+Kpx&;Q#}I{3yB$sB1m zBfSENEnWXz%MZpewj08M`)I&%3U9!KIJ4(`>-{2gJQ>4L2~(TI=?rUG7D zpSrCgrJLc4QuRzG<8G33k6;+)!)3^Ly?(EQ&vuavTan`TTOxu32%A!ZcG6B7dJ{#Q$z_8=F`g*qV6!&zBkVUjpji#oe@RJO?HdsT=%U4`;|J%eEb@ z(8vpNnr90H&xM7FvOrIyH{>+%VTDAJ?4|-!XBD z0U8$!mB0~5R&9?Y*D4|7PMrRlPw1`SCxa{;jWJN(9X*LFDUPxCT8+`Su-mCT-TrOk`(X z&AF;Wb>$bNUui@qpz0us%Gm7Jj26ZquOtf0vR_lfHw}+tEAHi@Rpab^pI2}0oYF6L zLtbLtV6x?BM2ZS0U7%epODwQa&0Wb&aYH%*+WI zO;Tk`qe2++rh=xUYEf1UvC7b4Hn#V1sZjO6I+Vv<*9Twj+gYr(gh2$)Fa-XRUDVlp z`*le(Q*r?Z)ETD9OiVl`GVNTPrR{kpU6QD@qZNlD(w2f01X{c5^Rd10(tQ)~JQ+pUd$TiT)6z)*;fGx8 zOOH(5PM@=29W)FW98qBfV3@wW^Khxm=NRV_We?9Oa$B_lMAJTT)1 zy_AWddO61-`D_3C(%)MwmuiX^*&NQxQ!(~2TqFN5LVm7WSjLr_B)JTC12sP4Hk0aV z^?~?wY1;)`7o{O_8mT*WlcSsuii=$4#bDLiQ{gZqfY~OMg~=KnOHIJ27Xe5#yjYr4 zDX+ea4W#@tG?mjcz*5;yR5}`q53mo zkYW7Rs{sb;-+*V^Q2**vVCm;#dFWF?c^^1m#1)435vRhN z=cQ=fQR6|a?$5I2)3)akAAVp@#!*erh&6qyUUyS>r{~4;VI=-qx7gm${qS%WGqM1V z>rPigdezgasp~?t;FD4xEw*(R9GmKO!TXvMPT&%ulgErb^awLqBaL3oM;yuLw>*Orsc@NOSjkI`+)|#Ee=nU2Jt>_ zR#g{=t;ma-Dwi$7d@WY}FqBhP++1>WbW@Yog`3)W_Khg@f`j~(J8gsahpW%ScGpt$ z)4NWF?Vk>fjo)9%&X#tETgS0=r5jzFclJ@HtTpcIl4waji|xZsP78L=H|qCy{njYa zd(B2P*Uy*F2maa=e+%aEO$vf%Ah8_C4=4xY&CW20JYj~RLC)h)FpPN0trz4?fmPjX z%3TZuqy$JLi6PM?wOBB3xC)e9yOwTbX%hERKuhq#&m#Fx=n0sXG?1k~d+7XNFbR9762cIYEy1V!6+n9< za=SR1RdAzb!8&0sx{`}rd2hn^;zU3HK5>jeK5}*9(e$gTu4yz`mwm|6bWp%@)moBJ z4u)P0fA(*6DAS6D0$2ceHiFl3;s;dXd?_hqrNXw0gk?y$J|ZCAwPhRe@`eLo-aqLO z-|5M*)){r{K(^BhoSeTgr#tI`x#yPjH>t;PqCg-4G!t)*6W_j7+8GEw-{)`JIS61O zU2m+E0e0J4H`YE4>=AZcc_rz44ay`|(trq;(x6ulvg~%e zA7}qis*rO@LVoq}EE+D^goS|#kXZyJ_V2`yN>xn>HmQzbAqV=BY4XjoWck^< zU9kY5US$V*eS|&s##SBMO?6Y$2vlHtt)OyC9TRbB92)71gtgf_72c-`d*fKPJT?KVl*$VRON?Tb1%4|5uOu|G zKYkHdt;~kcp!(?i=OA|IXO<-j5h_JMv0}!X^Z=g+fAH>D+X#Y)Y$jTODK0yZ>h4F< zxWNRhBBYQasAFMn&_3uQuj~=PabfvZAmHL;fqKOeCpd#d^dGbigh*Ka$|BF_zsp3- z_-kU<=1GS^#=xopyTdDGe1BsovW}eGlh(yK%Jze=2xK1wu2qfMwHQhr36qIeYRusL zP_d)#m8Vii76|}bIh25zFt!5-(+oJZCkqs)mb(0D4}`}GMy#{BLI2E|Tu?Y7VlC_n zTASqI#tN5qvZt@FDq{~}mZMzh3&aEAfGOQrGL)iTtM7Z-2q=}!N|A{ga%M91qR6eW@Ykd_1a#R6QUnlh+BFaR{bd0hN+yqho z&6gk%IL&$q@N2hZN2mU<Pg(A8{s@~ znYK0zgrFp4YGfLbut@1(4T2<2CP-9*bR}OReyP0zL$FV4n2ReT*~jixwJ#pN-uq&& z6Ku(zmS~D6XdXniQ>T$V*~B%k^^c}|(3#T*zis_Phm80fdIN`(l``}8&LWL#(Z4Y~ zd$5ZBWpHXE=^vTnQk3c+n>F;ms!di81=wxz|xQ0-X<7!%vdkGF4x*hs2_Xz2gBkAli< zp0rB3iN2r41n}19JdUBY==8f?qY3JqPBzJ;1NuQ?VoP!c92Sv@sWdV6-1DS*;f=sD zW)*QPG5Nz{F&3Ss3Y5ZietH(M7hneb%MRCIQ66Be5j@mUQ3bAj3erJr(>$>4&S7aR*~v%h?B}NuhWLhk|qaRMqF(L z9st`f&k;KQ;^ZBBbfW-d!8q#l^UR5#Xa_J~g)n31!z_dZEnv^i5;6$>DqmwJQd#89 z^{Egz3M2o>1^3H_M>!Xk?9zs%h; z%~otJQA8a>f)PWNK1fnxs!jU^eO7t>BG+&rFu=Q*d-)CS)85mNW(XQtEWg!oqW*iz zmlBsMgW-H)22tXbD}CCG6#ck;+1*?KFN19$@`dE}XdHjAA#!v9#llltfLk@++bV11 zOnE_HJPIQ#4%bHHAO7I-j%Gu9M`M1v0V0&I=0r;sY~%TEQQYBp^N&XKf6zaQXTgwk zmkTe^nj1hnb`)Q3WF@xDYrI0em~S+lS4Za@7SHRuTE*TV2yKSQec^y);*LZeG^crG z0ydQ`X{-vnPYHbS!E24c1M8pja`$7J+EQe9g()?0G*T3XW}M5ngCHtzOwkNJxgr2! zx8kPwz~`96A=PbApvO;SMryJ})`r7W(X_1^Da%gHpOUfJsAF$&uX{QJ#R@_(r54j&S0a0B#ZP8pp^Xy*4$Y@os7`ZuII5`ke{83?<4eJNuw>duqbFzfqc?VSV0X=-W!l9*1C z!eqKAd=Sc3p)>2um(P?^$1GN@wQ3K3;<2pqhA)j7_Tvw{-s(H^sf)v}wzsfj!UVqI zrWAe0U#M+*F1yNA=l-OMBRVXr`qt1C|Bqggf2o-Xp0`&%65$b{jz!_1NlCE({k-SD zvs=Q>>n_>9U+ClCmI&tmH_$dUWMsAak5BZH>TkCt8wMKb+CP&K^SWxCI(k~208??B zv3e42?B})Eflx#9mdItn0^xB5DlIw@a*N%}1gjsRdadt-U*a47vUWjt+~FMUtahN@ z07*FByX+;=8*eWeRVVP`We(lhMI^yDQMZHY)*DhT`;QPwpyC+19j6HKnp)f`bs3b8 zhw>fuk-AJpL3#~ggr%5^BB$sJsUm5UP{d+sXAwRH_^4eHQ&rMZ1RT?s^fJk5eB-h^ z;U&MiP>3YMh!s5M5E2Qty-(&?fxN_#(OyyW z2vOK_!)vmVV{uqV4AZOgi*b8n#eEdh4Gv6r%};G;F`UA2!f&FSXe%}c!&{7UuMMyR z=T-1HRvPzl#kV4CU~BDLPX9#sYmE~WyA3#ku02=kPtdwYU}7mstjGF69%K&CNNjD4 zwolUHAEFe3>=X}JlFcewD506dPgI$XFGSgXLoA_kOqKZ3?wLI#TP!qvn~E=aw-3D& z?3}pYeZrVC zqc*%#^unKQGRX=TzZXPaWu54fYACz+cDv1Ban7G3PGEU(GRT^&;l1j(PvQ2f?VNc_ z?6`|JUCVy(cFx~I&C-Ipxod?IhZS(19S%hYoAOtOT~AY|p;t>3 z3u$lxVY9J#cEXM9Az)LQXXANmc$$FU zVjdel)VI}MsExm~*py=DR4jVNFSOpJLsZOFvsA)AwYO@fk_v_^$r^dL03@7>Cyn!Y zQb479`xNmnEgT>)p=^)I9TjHo*kJcbib9x(rXi^;OExZyi{ctO<%fJ}o!hzljF_e< zsmq39>#ue4!Bn3#O4=`c?ks&Er60V{aU=s8Hk|T4G`RYUg zW!s&QYvvuZL~B5+)`PM5;*P7fgQN>mRzOFL7T3^{kRy4alYO6tEs&6A#rca}v0%!% z+1)&E^J!TUrRD z&Tfp&ZZ^FqJ`?us4Gu{ByMrMoCKw}z91q$BLxLdqy2J^Gh8j8|G+v!NvE~wgY>75P za9{C8BIAC2LGOZ+>{uhz z5`qU(5GAcNX9w1|Kq)In+C)I0fdX<#Yao31ud9cl<*;9hUzkiJ*-0=ey|UUIwW_>j z{H<%EMp0(vna4!1Iz5Q)?!Ea0n-1^MTpDMiPCk}cqcq7Zm?SBj~BuV zPT1^dVc`W#|7`S!ZHpe>_z(CQi{xPl3E&OG9wD+>7OTj^G-n(Ez`;mQ@bN?>@dte# z^M}CeQ=Yl%jDxzr)*~2=O;+1GRAzmK9nhd$?%N}d0Lp_EwY5l`L4k3I>zkeKcL}pl zt-x2*ljQxAmYLD&aTJpZ%^!H^=;WXKq&K^s_PLu$g?x~m`CSh@v~@G5+aDZS!{x(b zZ%9^DSe-hSNAmwZ?q6q3gm->TtRLV209^lzac}Kn=V;<&WMcb2vnPIiRvV%S+d6#0 z3JH6^GBb0fVv#up`@+?`3eh+e^V#jdTu4U(1OyZ}5v4uq4yh5e!bI3c-a>&J-c=F$ zH>u9&B>rC+)7j;^>LCG2Yr4DA8YL zlv2Nhy-W}=)#ms#{lrZunk{x_ZaYvo(Me8Qr3(;dt4k)P>!^;!;;NNHa$($czCVps zqVUl|-r+%bLvnF9-6|z~_YOw$;-Y+eAn(yC6D-IK=bw`a%HqBZZRN+HiTOW9swtTf zsi=%Wq`a7S!DIGG^-)y#+%iz=2!0qD4tN`EEHI#{`Tp`a7)c;xtU%NO>fikVGF2ep zwChE*=Qw)+wMs7#pf>A(gI&cP5CmBI!P@ZIB^{I4MfLiB+`SZ3nfH>3>F)s=n2@H` z_o9!h=PTSPH8kBlXbXV$9iQ0bj7bRhSmw z3sxh{PxlZ&5lIpmdOq2Q$-Ay9qmBzu>h8v%ncD+Dc0-=nTae*)Mzy7Ga_8FVYR1wo z)U%;$a&Z@DYg=V!Ey8!GMg@m$CC9j&iUa}muYm~?o!uMyOt|h&P(uCIHOcuoFWx*V zb_^wF7jwBe&-yM|c%-z`c?Lh)%nji0lmyBsGKbgn0LVRE%w}uBiCbeXi`37G7grLc5#Rt)_l)`dj7cL z8<-H|X;SYe_Tx^FL6)gALm|PY??1Gs@2jt?DSIcM-UQ>^22qbJm}#k3L#T?N;jWYb zYKq+UpDL&UH4#u0j?4cm`&>@QK%YnRvC%|{2o$bA7<7#ypq^+d!CYJ<>5O-Ro5=sk77=HKftovvAGjno`aa#8mj7xPyVwN=u zYgj#!y^JOZ*PZ3qwZXdwjZ5!@tfO0|!^^5x`qK}Amnp(@1zlEP zP?paU_?qvCp;FF5MD08nf=D$3)mQLsYuqf%l3>E0j9AEmnHm8!m!v{DF=xx(D9bKm zNpN7D%YKQIlQD!=>9!#L99&DDe5R` zfr?dYjuoP?!GO5IN$HO{K>iXAp|4>bt#Z#IQTspCV^L*QGU`a>Ko3sFrNPWfsXE%j zh^40sxg4RQMipuHmZ&l|Pu{Ni-$V>3xa^DT+)1x?8c~1J>^1KGnQ;!1B{~q+)pN@D z0m*um>Q_Ha#894r&lRO-b%vl^}@aZMJ>X z9CiSCreL5z<}t#6*Zn-IDdsk>{Lfyhr$VIjNlEi)nnQ3>eG> zAGQK;XW6RD+)93S;~kNR1k9}XU@W`KnbFpO28Z4=DYI)VyBRD9M<=6;Td2OlV*h-vZU zDY1q|J^oiwx@6#&ZqJjT^v<47Fpp+ZzdyGQrjxH2r3S?ny81HL5ffEs^{IBLrV{G3 zG__Uf=KR|4zn>k;ImQVu?>H1Y$r_AnZEX$R>6P2p5p$(xk<&}Yi`=%~c=_8^t{1o2 zAjkx=E~)t6)vs>Wmz?Jvfh;ziv%J{|aUn3XbH9Q#%!RkgC^A>;Cw z$`*a(nx*UL-1-F<1adi0*_2ha!!ErOCm}RSy4=X5D&{^BxVtO8i`_CxD}=V<2#7Xv z7q3kfAvo(wi=>Tr@E=5Q#TuY3sVENNA62DG9-D4(VZWBsgDAcM>$&V%w9h~14N?rD zi#`Y33(wqZ{5Z8rA|rv|x4uDmzJUg!)Feo0O0p-`!pAX!Sb(U**0H<MyeOn}YVhTo$?YfqN!hp0t6G^5Fh|rDq3R^3T{*%9}VzOSXm*Ew87y zF+TRI>gNXs{@?WTT&-@YUp_RYqEO(KL(_BrkY}A9|6}sTo;%Pt{GR!nf2Z&NLPKln zXky}IXYKl*(^vV|ohpKov!+wCf?d)G(L_K;94D`hn9(Ye4mKDzI0C4t5T*2i?+t+N)EFsNj$)m$+wPqCb)t3 z@%*9+I~x3#l-8$M@n5_4 z@620FSPO(c+`KU5nzXBM?qBXm;fjX|G4B;;6M5^NO9fNeBCjU+uj|ILU>e=+G6byP zV~5KB;7@kGtD0FE2yU!WT>dtjwoGrO?DD!Cxkny>M+1qQ&O96v0U|1iBS^INo^ZB( z!M|HFmU|Jg*ZltiP;6wF%Y9rdKjBD7Oxin>Qt}pHZF>oK+O@$Gg$bMf`U_5ZtrC%$ z(Q`3^aF&kKe;F4rQxZ%(s>fv)XPx0%5!Uk68 z5r{!GHv}N&#t=8O-aLj;X8^vsk4p|s$6XQTw&(t`gD!vx8k#~~f*nLZQnmW<%p&SmMe}5%1Uk2NPL>`ne7V%-hJO*t^-ed=`b$Iz?-+{h! zEqoP@f&t}97sov<7}j1t0Njn$Wtgxglx4#$ufCvLVAcsa*tfFp6Ek|>x;M7K58UmU zQ-sEjhz#)}t zCt+l*O6wtMV6)|!0TR?}N6)se8SGVUX}~sqtlDB{f8}CTGTUT^trDh=0HU!n_>J7S5YMfl9d8E_yx39Lf(` z;SM;cLHHmJI~+chhK{CWxMM`(2kSgH(9o+LRBkjJZ+Z@Oq<~0lGLn~Iwe2ynEZk^eVC`Z=S2Me^Y38(9Tjx=Q6JK>Zcwt!Gw67qRsvGsQ}dvwf6V zxL&PQwojZB)0{F~xBRz@|5Fd(v>Mxt{7X@qp#lJK|G)pOW+t{KdUn4`U28kD|J3{> zt55xx7GPvQ2t@F2zOhC<&WPaFASy2t>Dt{1g{vXAYl#dBxoZMiA`FaS3JM8AE?TZ( z!!GHg^ny^jv!|u3aS8elGVjamSy9P;QrdK5BHphO0G{)y3sgeEaXl?CXvmO%``YVc z`{qT!%yc+z_ucJ+tb$&0UayE)4eoknFXlNf7m2jn*hJ0{@h*v0g9lYApyaZGc4{0E zr{LA2)QWa%eyHOdT{BdL1c@3>QW+bm7~V9sS!p{BH^B>OYVK1h;<&D;=20R?9aR!f zT;&UUb4)e4kjlldgvtqXTd4}!%NL~T-K+9Ugwb!FH|7g5vS6JTt=27&<8j~^`K45G zT)hlFS09NAND@I_pjo+GT@#t@L(A}})buDXJE&bYRw)QA2dP3p%K5m=7_(8@Y)_*Q zl?!|ZDXU~;ms1E`e<9Ms!V`XaMt>$0as`{rdKL!TG$V}hA#n6_FtTOJJ;P(O(|rU) zgv)kwkA^ABKmBE!(P&spVamI8is)ZgYW0n9{E9mhB9X9HZED*Uo^9aq3gh%6)H_Hk62L9;=u$jX%JDRavKx3)OG6ocA!x0Vj; zMK%U_#V(mPn#l2Z)rU%*MamoBH1k&N5*#qv;PLp?#!@;V2yb{6#`J`ff#_uZsw=m{ zs(EL#Zij1`rw&ZtMd#aB*ydf}#c>FAMU8F;&(>YQf!AZZhl9)4{E*PEt{_UU%hiTh z>!N!g3k|qH1Uzs9Zq*C)QoAe0bY{B`Kmo^*OjFdBB~9T(cGuKNb*eUN&4C3Qj^ZLa zDtmrR+u}73nV%gpEVY0z3qlqk#qLA*Gi&08Sr>lqQf)UAE&__%p#xd&-KTlxbF9+o z#FgK{o!Ke+dg+S8R%~Tuxt#{WLOp0e?_d&^Q>VlGtv@7MN^J!zdnUihqNd8FtJy@i z)3I%u4eLU!rro)quUcE(413Z6>xudT`$@{StGw`j!;SWB`AfOmr=w#Q1k#lQZEpL? zYRXo{N*84%$BwP%9ah(`ZEZ6D?jmC4!Fm!dZh<+Fqx8Rd37AKw-= z`B7mbje?Qdu^xFypP^#$kO`#A#>cx5fEuc=Pl$NmXXqno1lkHIkuQIUmvQ1}oVUcQ zj=BZq7&`8{jJ$bT-1x1j{Ny6Hza3_yC-qRE* zDi?P!@5>l!>KEzS2GALK;#$Fc-ctxkPHE$P8_Wl1GRk`}nw!e%3_g;@t)ZfT3>o!w zK-V!dOGsMDO|Qly6vK6qF`j53NV|RMjk=??{``RuQFdg($$T8k-DkHLY3~8D*4ENX z&=$cb2}amMfm*(pDe>WP<3wywjh6$DCzmRImtx24>rJA6R1#X(;G9l}6JU?u$?}`m z%_>FSvFHco-cG`j840cYu@^18egt~l_$ZecyWB&8cxd>%;b6D&hFGDL3d-D67m|Un zYm-wGTa_AQ%`VqNqDv+L#DONxRfjQ^ZXAt+5IlqKw7?w5gpar5VGWTjn84Pqhq1;cHQ;#rMv_~)l~J=UcOZtGqR~QF+bAA;v%r3je5~yg z0?S%6x_h0?3fmWgI7Pbxcj`mt_gmffvHB0P(HA^|kvP*;2$D)Nz8H+=prHf~+!F`Y zOiJC^Vxc=?WO7Pv>VP3$q!GpWWI*Yne(Z)oJit58RNYAJ0mYKmG#&7n{DgL* zNEsl?ih-RYUVm#PE3FKpR1#XrHb*f_nQWh4fSq}{bL$KuiINLB2>W=$$gZ4i=07p* zsZx$QW!McGaa8AN95c8O9SdE7wF6~Xec5!Ubq0S;5frNyUN>~Iqx?7_+4yo9{>qY& z%E)En3JlHbVOgZBZLExch>mjm`w=3b2i1jS~ld@uC%r_CURH$*J&sCeedUdYLhM zLW$%A3^4mkt|k`_>cTV4qhm7N%44@~z)w~9|L_x&zG9MqyIE+DLmLMuA2KQIRY_9` zhv`LB3Qa(2guFvKhSL0zOT%D#PC0}+!~2mHb339e5w%p_>yDoAqauVP0~p{1VxSwS z>a7|U7ZLXqx3$y*wC{O{pI`9gBp|mTXCEc@fOUqdmOCTL7YG@(e0=5Ux76sJO$mb&gJIezleT&t$v=;!5jl~g-^1>oPHp%rKlNCb0 z2?s3zdXYmdq3tFbN&r#m$=&n%*x@Gnmnc?}bH&^w>WLrR;gP^bfHC1c!Te^G+lxX? zM?*)t{Iktkj!*2{#vp1EGkvu^qsrS7qL3L1-- z7y10t)dSh%z+%zVuP2I#jqF}&P!}5F&jqVqF!l;siH<=)?Trx_riU4ZeTX4G^zTj; zg9X1HK%O_G>z+*BQPVmsp4W41-;peGVk2?a8#r=hWWs^u97cmxnPdN#AG9NEJZ8da zjsnh0W8BVCKjhNHiS|+*wAR=)fi!FZiszy?R3|?Phn(xk*MB@O^g8!jyPCbTC?G(y zkI*V6E*;bdbJGnG7}gf=w-3#!CwVd%{iEXlhgCsr2LZ~s%@`gCfVr>==7go2@>4c- zemH7)ocDAQ@Z;4B`L{9sY#!&H&3RKW0|Q(+C13{;VW64LwuJ^J5Wo~bg}~e81fG%( z;~ateuz2Y!kz^H6x!6%}kAB2h3=cw7U}i{;NM0FkT%LH9X%x1P!C%1N$S19(59D3` zeIF%NV4D&qije23-^qP0br>2d^Z@`@&@|o;tjr6M-)7KDqLMM_=Lf(LC~z>@!3v*$ zuhHF>0lqRn;@QY&oxkywJZug2csGaa-}0fXmsTdM zAHGdb+;QJlCdYB0Q03=W6bsF7Y8zU=k0=9s@JYKbhQN01l`zM^c>E*VqY)3KGKskC+&b2>XAWpRG2cD6&4wH`J!#2nGiU;W<=)`F|tBB1Ea@| zipzy1JcJNl@u(8T^CD&I2lq3}>u)epnTU&JXCEGi$Q1i%#T*w$gHrlNg9I$G@!D)N z4!3mM7ng*bk!Z82S#?rA`AcQ@8`XTs|W;6M70X`C9L<6wb?xkDS zoXr?vWCYJo?=`ILgWs_N8Z+SKmn?jvwwuu|>7Ma4$UzH?vGC;O2twg;pDCRpH#((R zb1LHpmGw%890vS+=2~ol@a2XDSydv2@{%;6mRzXyZcOHOuR&Js z&000KYgU{z*k0*{YoLPPD*j72va?0cMO>Ua8+NpIN?cs@a3eD&_<=-9NMGxM6M4YK z1?&#spIPCq5PoD)*x?tXpdLWPQwTi@(C$Gi?I{(`8GiKBKZ(pyP}&6ea&wxfo&hm1 z7)?$`nD0*=dPz;q%V(l9mF8Wubb^so@N>Y8Y{4##O6Iu%&;_$)@2XlWP*3>^i-%() z-~?;5i+}RgwM4%E`P+XDod>O<=6=yTVlva!%qfq1%F3qVi!xF#ak}j8ROkriwW(2A z=vpFa6%GBvlsF|a>ttC)>dj6$&g?X0+4m@`&aYfV;|aa8hX}u?i2>32I}Za83hAFR z5tmFRBbUfQ+Q=gQuP)frrR`qCH-UXhaY6&<9(Q%@LZFk&U6T`>ZP%SnXv(CL*NOTK z_%7D}?j@y<=&uEL?yeSfOv2Fpm?O($SP)x=?8dF0v}qE3@s$m)g&pwx__XB0O92T| z_mBATZT2LUtw2j{p7|@_H_FZctci=87OLjP7xJg>6ibUh9BKp*0KspWB#5Bn3*iqRw%)J6cu)x*;b~)Icg2mRwz%>Av1x_*_SRV5Ntc>N=t6d zb2YtQ*`K@PP!`ki(=nJ2UyHYIo}x(gY3y#lPJ+AS!s8E?tXIAs;;YT%!-J|JE#1vl zq997fxCys$^SWzmipJQzc-=?->_SfNoP)BffW#s>?qCg>PMGgLCS&e^L z*8fGWk-5eHBv}9dCW`-Kq+&4#DirZTSfAhuzj9A}vPBnB%C$p*{R=WG2q7@LzgnD9 zkCSlEx0}hf@`(Oe`x{fQH{Vq98Gz?$5$5ZHodh-_Qj?Yt-3LVtG-de^JV5Z>S0E{1=)e;I4w+hYj^j0%SLzI+#z^zq0Kn zyeRVcH~i?T$WMaaqMi6uY2LEaB@M5olL}$;zFbwaOgd6^4jDtj=;=*lffu8;_~8qF zX13PCv8=Z?4}`Q_XW|Ls^864-h%+4xtKO~Rj(zDe4D zMVR8e#{6$MqMr6!YORazMP+u31ZgI;!SY?@7$<1p8egNq9r`y9sG*C2#}V+{Tg)!vfr1#o0r&o&Yg%h*OIGvFb8N{MJWjwJ07vPFe{+`~l zEPI4n45dw6jxlZOO(hB34z&k!(yOd6Ehivu(@0(PSJ;6|1r$A5&$8&?D2tn!#2m9- zr2+`pveZqd9@h+^I$eP^G(1SgfykHq9j^Ox2|r0O;#xqzIwoP^zS75a(d;Ws2P3+j z17%J9)bY`ddf0J0ElUm2$dQWH2%nSAj@#7&nV%81>$iL2{0n!t+q`|+MmipT%N~IE zg+`a_b!z4D-YT2o0`v_=#PS%eWuMJcn2UX z!t{Oj(xS|Wu#r~6b7t%TOIKajVBJD4u$e@Ta=h;Mgug7d1|zpw%)n#Ul-%6~D(U+& z*~?ErdH#&rk&j@@XlF*_nb;%Q*MAhSej8gB+WiI=wL|@{ay`vmYz%Dm?CmZ71IE~> z{>CYfAYNa4Twc<&#hVKT7>T8=GE_1S7PaOJrz0fwBIu;?R-%(p&b8?Ce_8i~5vq}7ZUi@2R$-{dUm$9xZj zAQyl8h@4dZmqeG*lvUB6xE3f7!B8P*cuV_-Z=w z^9RVrg*zfK$`VI5j2^2V!t~bo&5a&S`-{?UAJJZS6~>SF4ft#WmQAI+-b*39b;9~; zTXnW+jNwX#Pa zvLr|vR6ozVlliDTAX?O*Y?HyrSJC(3mn@-b3l4v6ZDXyy?3Z?kxdZo}kzrSfCK*)U z!^!JJ{`;BSZI&`yj@X8`1>W9s1wfM>X@^PzLx?s-3mJ+5CUm1F4cyRw&B`rzQB9VB z+o*`I7V~7xi3ExtGlW6 z;z`^@g;b>W(N!oeyIU``BvoNpRn4qjZ+aVLu*f}jPO^x$;+CMjY@Ca^YXmwJ_+dOl& zGwNm>>o{DMf;agdJ4TtsLEthBcWR?g9yB+f>hO}x+Wal^Bg;r05Kk*jRk8b`tqEJ9Y(y-B z<)v;ydPs7yWrL$~lI9z&0mK;L@Xh*mws%c2@wQF}PW5tMiGy2(XTuwgZ(SMDrw>c< z@7jqIt8$9@OOfW{VAwBpfDgju>r|+5TeO$*Zv;Uv&ZQNmc@ z;O@M3vLcv$S^U^>ER!^b#j(f%7Nz{oK`^S6(n;%-tr_VpyG>+!koTH}k_bK(nv@1T zKK3HIlq6KTTHkFzo6GGP9%8ryL%SV>Kd1c??2)g@&$S8_U{o}&`Uj|xoU%h0h9m_1 zir#&leKy)6I*Ay0{45xDbZ}l=K6fH6tA6BgZF$Ao5EwIH5?uJ&9NJu_k=gXt$yZ8t zjWeUw=wcGLBlI$Niv;{D*TR zbg(&2S`zSFtAtKu!hr5$S6xn|(NgQuHeMy;h)6deFI`@*$oEj$Jy-wBa=s8jv@L3v zE+Ynz?QMqyuX*^sgj+x+=OgT5riKt!DYGyvLPCxOm$4AE@rTzvTc_|&D9N<_bRS4o zE%n3Yc&AD?G*i}1R_zdksw|Db{QfevfS+|vTd{xuAp>Z>%W)Pm4HB3Gll6p}5fd$G zE0(=mNvjl%Qe0&$g`<YN+t$vzcI~S5KHsXfpWkrRoaem8d5kgo za;J~rc-&Wlq<)NRzni~O6j63p(viE0&~%GozQ#u*BQ-Cgzcjh# zFof#c$*6u^pG)OhOp%a)B&y_NixX!o-mmcoNZ5B;uEzZ?TrD$3;tUl>*1)$j!ob$u zX)QT$qn)+2-A2!I?2{iX1oDY>vA{TXgc0S>IP0<}FHjmkNvsYUiCmA`8;sq{+s(&0 zC}j6#ki1=yri$@M9<1?(pc~3FY_^FAd*91yx$VhJ>fB~Abpk~9ySt}si0FFB|9r39 zVyH7%nr|sKQmioRY=LdO^>J?KC?5VhF0wIzsoSh5zSjQ|Ihc3|kQpw{R()`=wp<>i z=H!wf#gjX0X=hSYpg+zFyv!3B(Z+O zYBKw?|AIpkirK2|+(wSE=*rx=%L^EeDGBX6i5|xV-gY-wX`)10xp~>xLTu^lX<4mB z+lDax=V<4l62>3C8Lz&e7tp_-P@qDvFsQ3dMD~ZlvZ8{47a5RjWg)nt>unWGPc(UCznE-J3U$co*F_ z{Qq>V{OPk7PeW;q3T8QsaX794zf=EUfd}Hkw^6;Qc)tHZG!Luq%|zEM$&>@21Rijq zh=Mmp9$uc-j`)nit^_u%lMsvhJszZfOAN%Ok8%#f;fpPgg1QA}*0CpB)pGwjD-S|y zQ64td@N;9k4zFCGB9|$y=@3iGBXx^ zc7$RSVbC?jPPYp+ul-XG@olZ$8$atr5p5?emTH+Ru#FmMc9RLHb&3R z_XormGj>u;>?j{dYBzsBa*mjTH=oRG#6O0z_h^8N93^6;<8|rM^E-M6gfEERJi;y; z%r{bRr%<-Ml8@zhu>o5Yrkx*&wV|Yme~wdHUCt+TD^88pJUS#(|ImL?n?34X6n)?A zovKj}!a3#*HY48nocLZ9ZjE5nP##@arHiPlPKiTNt+GON0d$+$tnje(_8I4uU(HvP zj$JDG+wnhY=9mH_p&=qkGC%1!RY|mMdeW*?rad8&=W0`((y?7ZsmOxdjdU=L?uY*X zDf{WmNU7BGO0@QuC;srDor{kzS~m9WyE8?|tRLm?=#Ae4qSga>B_&_PEH{h7efYt{ z9~11RZ41Mx6(`r4yI7bzPrJ4_E23@jl`Vy#rWop4^3n{2Bnj{hcu%SbUy71ut`ae% zLkvcyb*RSf8*J|gM3rcXTj6C4o*fOVM zBdC@(`{^k4X#C{0L!#Bu)#49W-t|8`cy(q9a4U_z@QO#j9FsTI+=IqF{I&Xr5dPVg z2Bu8YQTct`E5DEXzsTaUF|ampwD>=S?ZmD#qc$ZlML%8+huju&|e?i+gSA z>SObY2Vrd!9xA3QqH0?$_B(Tjt8eIqMfL*)T9!STxIs^BwpSv%S4PKjsq#KT^;8M? zQzp~Pj=Xv9N0x;d_AUC89@iGi=3x(2FGkzaB}>QO6Z9goZ`jA`Kd?{qP`ZIk8LQwa zu1(+(J^E_#SlLgn+@9ke6w-8L*yy%aL}X`H2Df3I3be(>8M79fY`w76TUV(FN3=p zApUG`U^T|~ekD;-P*;jQ<}u;B(_o!f=r5|d4H2P2k$J8218hE;{&%H4i;*ev1z}ak zUZHKNIA9-|K%m~x)5r(hQr+U0tB3`z@WQz10I_a`B~#hNp>{9U@I=MiliXAdzGsbt zifmN+$sW7vxi>w!sUiY{O^7s>v1Oc^$oq4c8JPoAgJCTn@&V?&v_XHfKK9HIy2?BK z3fD1N*vGztpNM+<>!VreD1+a2koNCF_2`e_JESeHbv!{}i0-G*ccdeUoW7&J{CsBp zM)h9p&H>AW^^OJn3YE1l^UQrPXraINgXwc@_ar*Ul?x9=q3iCd`NpzG#QA?&9*&Gx z2gA=Sx=*a03d1zbE~Clak0>JrG!SLH z2JGz094I&38}(%%F_=^x#|-xRz#b!P0|T>xF(j!nrBSX=+mq1tqP3_>dIxfJ%*3aA zU8)w`vG>Jo*7UU&yY$a5j!>qpECy?+D&yz@oo-OSwU|1(%uX`u9%%gCYl4-L#>O4fJDYqP zw`fZg+?Hy-5R_58YoxEFS_KZzrz-)|KVRwo8?z?CL%B=)R^ElamG^&PMzpbWGI9Fn z|Eh{!?3^g#)9P9OixULGeSuZsXkIBkBr<$6s;r6@lza#@YCKA5d1K1n1~I%9*Lh`Z zo6_Zpd*Sa~gs}Nk-$I`Y6un#opFd2Qd^~?D4<^Phqs$(kGP8*R02zqEt(T^DJ*TX$ ztXS}Jj;)?D=(M!HU-pFWE?^@Y!zAQhy<-;pTImtk!^~A;E@f|o!vKXu_I8g&!v?qD zr6L>IBEX!Cs#%ZLlUEpv`dxHiMziN>c7hVJj=u4>v*r~;P|;6A&8XM}N%NFKY~@kp zY-jD0p2i!hY$&j@9w*+(q!h8C%;u_Q)eSN}cwBhSN{cdX6zzfhC>T>#XTl+EI%ekz zlfAqo?vLmD&C`1}gI!tSG?bPoVO%Go(e`08XX!lbpv0P20CG>b`d%~&SUJ>7Q?%V4 zncA;CW+BWVOGt~51M(Yx{8+T9oW$ktNOxIYu;EIn>&O zvfT*yx!P$7)nEw+)Cl8YkuoG31yWHCRK6Jkx zdp|V@6SJ&nr&gwrd7!F*OS3ydqDoGo5Uvn(%M&yKc=jCBJM3z8f_eyJSceIa*VI%z zW%r(X*C4cux=WQE-f-UJZT9bT!e{BLXAh2(wFO+0_XXIh5mMX?bk1xvcLTb1;p&9( zmeZ(V918aSxTcF*e=+dRot0b=Lp}%qo5oMBb`My9ix^D2&5wwOMB}GPc)-SLi_Lpa z-B9e~7KoPYX*LxI-X>=|pFYJqbfW9u{qgKXxBX!C6(J3s#YrrYaCRp~H^aOS3!6*n zvtk(#(M?Y>)PljR7)U1pOGdj(##gRvFTc1gNL?&)96YPdu@zfo0Jq2e^NxO(5Xq)+ zxQ4JY@sQZxPT{&aM%xlt5m)I%yvc+>0^PrZ2mwAOf!rQY?h+&vo2mZERWJ&qAp2y5^w7-_Dj~+bvh-o+`RYH0^by#s zS!f`z;R%IC3_cNasl&v(wHEPk!{{x|-Z5G*(id)j7L8$S0K<@qfT6!wLmnf!68`Hk zdul3#DO?ZirY6`!$WV0)MpmM}jS(KSv0n)m-NEh@&XC-#0#INXnKW&4E#wRmbCOa( zYS?R`wV0wbk@8E8?rWC^Cd}65XQPYG^(~8kc*JRINMSu}fi1p}o1?HTIJhEeLi1tD zz@POM5^fV!Lcda5p*nT(Z{Rcnu;LomT0-|#VS8ALioYpRqc*orUN4u4^H8EqBNSk4|&oePa4{?R$zPW28)s{M&M z6-fcQXUueD!QfM`AAaYP6NjMXC zNf-L1gO)cNQw8haf_p%VRHr= zBi;Tdx2YNR=2olU*FDarpf%efA5FpdH}f~DjteZ+L4Fpl@RTJZLafn*_#@;T-iw&P zir$ab(;(&E&2B?3qE455((|t2N?Op3zVOnX8AqB_h&BIG|4?xW;Kjt4=e+o0zY)xK z+Pdce7NcDSyw{TpUa1w7UuC&1V@Y4)78B-0U)p1i5JR;MXBD(rtopdVTGCW^{?mht z-UG%YNbo~ct>mSybN~x7Jmpz)ZJX^G*{-It`dK^AN{Aqe)jbH98X)Bqlp@ohsfpUP zNC&slY-^LdM+>Mnv%_YRX5ohbM4xt@06q}jsZ@EOU97nS4yRE(_cK*MT%6%`Vw<7= zS})qITBK@{N(!M#Sky&k71Sd}rINP!6QUI+$0>;t(Kbt#)|n3pU`=&?jg`sQO@_dWgd#})6*Fl2a)B#gT!7&5(NRYYM6;-GD&fxDpykM+>s(J~kCjSX7r zZ%h6ywtZ3$uA|*Zb|vaGCio$|(1Ek?fyDXK5&mle*HQwzuLW43%rHUzeg%rPZq~PQ z$<1$_&%#hJ!b)HT&NLhB%+&!jK5bhTca4OF4RR4yr!l)LT@72otUFNvNfbURn$8bt z#>=K&YCSM5PQGOyF5hDD9XHp`FS_DcPxZnlmQAt08-q3*y-hcM|9xW=-jg-TeY?+8 z;s4c*VQ2r(8>0bZEM{%ECbNJ%BF}Wts0!{1J3P)9Z?&A+lMi+%Gb})xb#f3KnHni* z&9I5NoRT1wwkb;nu?m6 z+EU#BC0b_pm0n%!0G=D<3xvm>ncy2k{qxhbL$8JSx_1GsO8%iGz2zTXChefzEL?O` zu%=vnB4#s@B}IDzY9Q^bmC6cxCh94iCc*IHEZdu1E6VdZ8wKz7yXR4>SEpVYT~ASW zC0{>5))cp->3#pz=f<+e|ndQtC2^;MFD}Cdk1I@)Zz< z*!|(&p6A=%)CtWuV{(2MT^=SrP6u+iD4(EKA$1THB#kw}D#wf30rvv@!yV z{r*-?R5^yJxO%kFczzE48Y~alnJ-h%r?7z)vH?Q^^O@jR>h`)+CKIab(4d5JJkSc)ji; z)1&8zM%#Hd=aWFcx#-~Gdvy33)Q+fTh=zY!CR|=yc8I;fwR3v!HaFp z_LOqw`nd_X&uH%&%BMRt=zrd9=DQ^$S}cnUFkft&*lgy-c{TEXHeR-dU)^YYc9pe# z`F700iay9XO_#cHeVF=;hvseGzik+dg`wGet#Pzak=oBFv~60$?@T6|*70J;LOjU2 ztzXKBZYXq3tXq~LM2hVRG%X;PkA$}Od44dQ!Dn7Lbg|gBEWjJt96qg0sM^h2yjd?_ zJZYgYfNO|GIV~HFvlmxygffA5=(^Dd*YKRezw!d2)r*wsw0%a=D{Js32$vvJr?2{9 zcE}P!bU}5Ide7mj-FG3)BO!MM?4O`-y99a%QYF}Crtl-$ztTs?-O>4r*HaPw`suVG zUuewH>wg<83po;&OpYXsW`pLUw9cYrD9Xy!^S%41h}SFe(6s-hVq)3v=og1B8EHt; zB@6e^ls>VFSg|xARkiF@&q_#6PC^E3D=Lbv^4uP~buFkqmS(YAyaW&4Zr`ES9w!W& zmAGi`yjn?0)Fz`FsDfNVbYGNHmLyurF~6|f7NG5OxEB(W+~^s|@)6&n4Od4yb;G^= zc-lf9F7i)SJR;@LbGv@A!-oJ|XCEhxyJ-@Cx+Tg#_<++i%+3l26_~6~6>~T80g*u; z&YiY7h+4L#!_%f=%?OS&ZNwrlDM1g0j7R-o4DCmyROq=}R3_HN91l4X8{?o(&zE49 z9v6j7r=$vhaU>U|-w2Tiz_olFkcth+L7K{*okIXEu<}X>m7*xvxrX@oPZb+K96l%b1eULruyok&C8H;BS`xA%BdwQ2g0JB-I_Yb6uoo^ z#K7v<0Pdc{QbEe8SO)HuwHv(tr#Uur=B41(58FQT*}tym{5$5>tltSM)xJFeO-qHX zQEOcgb5I`AaxBh+Xe!k)_U|3RS=f*P0TzPk}l3kLOQ z4b^{B0xY|a$xG8wyGvl%i;D4KVWk8}`AN1x*bc!kn_6B9V{E??C`(#5H$K>oy0akQQG4sx3rx!`)1zRh3Ry)^UxLK)z! z%+vGGrAI)XvRa2C63@Qb8008x4+-l^wou5zQom!;!lBs)s*NI8mvI1%M>JcE;z8n$ ztBH6WUrov`Pl9Pm+5rdkF)h><6`2qy&^*-?A15e4QvnZ~z1|e9NXHeNr4U#gu1E>8 zOdVHLR?kenai*JsYOwJ@QM)p5lLGVm?6+@njK^OfH)_*rp*M3E8F2_*PKKS{v5$$q-Fg0#$Q|@55M+vG3L<+6cCVNwN(+0|Q|H>(1 zjjrd&>kWaycJLj;e{K&wlc?V>P~ur(5W`+np6L*jWlmqDlSY*Ul_HQU$ScvH{QDSD zL{nGM%G9(B_1NImX(DWlK{Y(k_^u?*?K+gN_mcJ&dzAEYmBN2Y#|t>H_oD`D!kYmFN|jX6ep)HCv_!Kl3aWPE$R7F52ICqf%!qreza zr*I3he1vN7oi99sjRZWJ98XH%Mm9gV%L6ni-*%*ruMLX2%l+22$kphooq_6@KS7o; zjY2wArs1~kbLRVh=J;E=W&Z!SXW1J$*f87tQ@K$d`%jD%**8M;vxp+p;J7ie zQD>JhKC@qlqVc9x|LGdw4SZ|cK4gb!-ll^kKF6(M z)Ij;W_x4n{n6|QA371TA>}(_hiM&$9-rL=Ao)35jgJPc<>81`t29y_3Z3=+Dc^FvH@6eMu6JLlFNv5I?KKi!{j$$B6@o zP3TgwPtNWO+;R8pH%XyCmiBkBDXSRT@Qwo?55#i-UtRNG0$^!}g|w0#Nie=W1GA?$ zdv{XDp`~=BMMM=aF4Jc<>ed-Q0#;WF6#Bu~8lcQ2$+jO9!4z^H4S{*oFi@L%)8&T`ZhjxaN*QMIZ&IV z@6yoi{+N*0UdgziJj$6O()xe*EH^EpZtbWwAKLVl(Xq6;!2YLa8L6k0!L`VIJs9q& zX6PF5mYff0swn9z=d$Vv`VBt3HaCdK1ZYM(l%`qyPnW9S_ExnA6TRxCQ<^fDNn0Y_ zXQH{>>{u&~Kml!_J92AXfZvRZF$lg?qVO>!XG>+qov1Tca&p-yLw3dLduc8f66rVB8;hO0ytW!HfkcYAATOH^<0j%|cU82`8OogQG>Ls=HMVIw|8}WutlmirzpyA)tvG!XYJ4ma=Jwl4=&oR=HI z$8R2~-OlvHCo*-oJgnKs>zUy5A3Ty=c{Tggx7;E2o$CBAmOJ*whK3fl|06}?yJdK7 z80|Nf@2@=KwPjKZB~TbwH?8tnb;qn_K%0Q3anNNUT%gP}$V^f$3sE|w$Sf0)ALRT9 zP%DphK;9D1um}R&bl0z?oJZ~4Fx}ZF(S$B}WSq(N7tgCF->ZrKiWIr+m#O2_U7_qa zzj#0_%vRO55*BKfeMSP}7j+>KI%9+jRfFhvN?B`mt9+AKL$&Fu>}mArAGz>rGq}qf zB?SO$2#+&~$*jnv~O&R=h62z%Lh{Oe1!BKP5yVUh9Xq+JQpLWd7Eljxv(SWlTzPrl$>{P1=NG{cSyg z;e$5jPR!pz6^YJ3{=`wdvdJ=<**GcS@MB9Hy-{zR9odmijqn-g+#7KpY!$1Bo(J#D zu$=By$$@w_Qse0g4<{%r8A-a=rvj#7?E)CgkXD!>&Y|Xagu1E!E->19b3U%ipruZ~ zWR;!kt^#+!M2t#NYHVu=BJz+kObqSGk08z<2~6vUrbpbH3EVKr_Jyklw|>@GH&&pq z=+8a(d^qA6NaF(>0_)@oprUE5*E_FVpc4(Yz$$P(5DzuMKO=FI>Jn2YNg1snE)U_P zOaQB-qI;{0uUGV?+*KKx}tKeQ&hYy`Hd1aCA<0 zJ{_uZy#I*P1m-;>r$YAghUb@ZO4+C=q4FcWTrF#vx>>%Xay;oP&me+7uECer?bb$z zL&EJPE<~g2EHU7B`ETx(m_|Ie0sUz(W-aw~hD=(T572<-F!(|lcc0T* zE&12^&uvYaQ{QT&+=k2_9p^Pv+Wd&}WpoZTeEbTtz#O7~ljbM@aV3TE@!fF*Tt;-m zYh+z!N`PgEa~{ImS- z)0i;S@PHL})Dm}P|Au6{Ux)-yf=>_b2x;;hjFaGbj(d5C_Wbk28M-SFyUHrIoByj^ z_!uyr59_FQtXD}Hf8vB=N9Vv?3s?V21VYdae)aRTCk$U!Q)+uWV~Jnrl|2$f^aDiz z#D5T{gB*l^?Oig1c5 z=H!X7-Db{UzVd?-M}LdKK8VRGZU2WvH*wfuxr;2l0Os|Gy~t-iab5B($57IaKg@ay zj4{kdH{}xXd|2eyVS}^*4J=Fg?vQ+LgdHC+xW7bP31;cNS|SPUj*S*FLB+9vNbKg^ zC=lYn2+1wtxIN?~(H)if7r?C*)|h)0g+^2j_{GrOi=}?f-OShpHMh)0^bl1bs7yGrtR)_%gDyquujHfBuQ3q>piXx$ZpHIm~}|y zj~iZatZBOoQd}F(CrqCeTYY5y1TlpJv0NsI=s%lLd3_F9w4Rm<{dc;k64E!M9O?KB z65_s%us|(NJgl@J{d%}YX~o=Qx&uFM_?7$y?9w(LGe%PX5WNWG9kH`Xzq^i$Of^e< z!rD~n?Ykv%_9aKM;!G=w578f;%sx1wWfoOsJbHBvs6Vr<=$gr*&qxYS7%1BW+q_bD1f#3+YuG z7&Z6n=)UEAgxJR}=^^S4&7hnG=SWN-dDC- zPUw7~Fb4)FCB`{mYi5P8HVK;jsQicwrF8>mF25nIa<~G6`E?hmjU|Zmce0jvMqv_5B%jeLAX(1294NV<$Wbl7l7|u4WlNPuTNS=uiX7nY-hoCJ4 zxo3iSsVOjTULt;o!kSLB73bvcMfp7P-g`+5kB7^@n1adveIRGCa8*NZDuMY>FbM=J z)vM%}2|VUxZgR9W4ZnoNH^@pN}8WG0k+1nuwm!;;NIpz-lYlanOM6_&5gyo>weGDbK~^ z_MW1E;8$#Hnb7;B=o74Lc_JmXC=dmM%K;96Un99q%%O@f;LIS5q;geL)W%!An+zSYlgqK^EpVF0H*b;8I>1b?9hOB{SB>QnXr;CB zfMg!(1e}C~1~y8uWQ#mKgA9Ir!Yn_L&nE}Bqyq1bv4E}%<`J7S}misaX*!;=|dx4NON{96+S}T$TK28zsF<$EyyurBi=#(0i zf_O^+1qs;S+C8QVIN#W=+pnQEO!HRICOMr(=nA+DveC3`&4t9U3c+$frDEHCQ#zZDtY2tRA-}+IzT51^5G+d%F5jHl&`WNkIQ>RK=eq zDsWMM_{+2TAcz2NUneB){3m4l$#Vh5VkJ;`{sg}T=iyNF;m4+Zo9E(AIE(DJhOszJD#vaK29fgW1Plkk$ai68+$WacU{nig>hv{F zo1ty^iBLgEHnF$!NbPG^H7umLSB~m$B9i)oHf1 ze6NUn&jd6_cb8-DHZ$kqRg>BPTiEg=6xY3S{?>Gk;PzR!)F&j8$S=OlC#QNQ7xAEo z$cf!`W>tzL)V0 zOhVG~oYQ8yAd_yMneepF(HbTuu@Tr4C5qjAMr3XvfvF%x_p;I~v{9H^j&T~jSZhBg z2z5U}3gN@)a8>E^+gm2F1yD?~Hpbw}N@v5f^X=O5>Z_lF`gWgWdsF((5%2TuHw=Yc zF+I;?enWi|67A203?X_cb>S#&sBc;8L9I+TMq7;=?F>-6q$GJB=#E!e(0=RRt~;Jf z``>K3wf|p);eF6@7BsmimamUpOKTTr}+ z*hkoyA6tgL6MX>Q8=f+I{$cG8f&DU_JzU;!o`Rd;-w8UsQfjj@-$h?+h3dIjn;Y+Hhu>G}&XYxs1O54B2ctH52i}DZ-J*BWs54=GoZ4c!qWv{# z^U_9>?n)zVj{*PeBXy77ggdEmmoi~%I@)V~aryKebJ)p&vYJvy?a^-fuv*=B^6V|n zv0|eUI-Z42$#>_LL`sqNFH7RNQ*w+F>RQ8kVFb3zlC_SKRn(H%%(f2agh~Cnqf$0< zGA;8h%@~^C%K#kDd<~q!kB*M|uC|W3trjOYuj&pbH?ob3r@6Pht|7avwk@zhmR<99 zvtJnwEZxSyKSa$+xEcOj$dYysKJn9Fu~&seLg>MOxxj{y8hH*{ddeQnFa9hqdt&Br zsu7itu}YA?i2lfk0xV-gWOX_pRz6N6 z#Q=@d>kYY&%AORjRF`+>qtZydBr39({<3*If|jYg$%b3yApJ8&(EbM!)M^*e*INPK zgk$Hz5&oub4%*z_#GV%(8Qzsm_>4J>Fbn&xBj;)>W_~g98%!6g}zMp9~ekQ z=V2>Vw0jk)#2WD@#3ww%V*(jvVI5-{aiVcQ=hR25*W#_FQ_hyLBK9b0o|U02yd7Yj zlAuUWP$2nBh-NJG3lcAkVMTDu z>Q;}1L#u4()W6Y8h32O7bar{~wE(%+#11SIzxAvpv#1WmOQ}Da1joUQd`u#*f3Aca zyqB5IQnJ%(NMLc|Ss8O`l+N}qWo3`S4a^B^}Wjx-o?V^_Cc^Le(w$V{1BkBG}Lp9mil9G+d_mkit-fA#`q0 zA~dLtAdF3*!q2zZA|FVbJs?dYgZKJU;U0s^kZ~VE*`%AX9mK)qgWYd!L9zP)H7vDk zluZ?~Qor5@;drs0k4JUM5%66KuUI%Cb+cLu=k^;F872SE?@azxKMBFX2?334V%C## z8Uc27VvUzEm@eOO0~Bs`{2N3H)nkor;8jyV{ROCV&?nx1qZGcJZLC)SK?77~6m3qMjTrimMN5cyex{{FwIY zw-Au({UWNKX)ykD&2UWw-LSy2{I9*mz!=sLrYWJgfMFob6q2lfk!Ewv+GWXggzULd z|Hqww3r1SoT-=<6+o}=nSv%nt;o*07ongR14u{z@?2u3B(+s`0O$8sWq0j>oRcOC_ z%ISP_!(<3><5!ZLW8uNcdnk{*cG*m#r}tMJ1{aqbKfz@QA%->y1P8|Wy$dCoHl5oe zFx~H@NSr_6Nu_1w|IoQH&?V?mPWC6i^2sErYC*shXC>8mzRjW!~9e5IgM zmOXB%igJqS=-N&mGL|W)eaEc)Ox|N$hmP75xEqsF9~#ON<$si6-SSHp>ooPUVSL92 zk{1sTBY*#3Szy#P>LzlkBv=U9>3g2cdmuxM{`;K8{0vNI-}ZfhZOk5Lt)hv-*~-^) zI|0V8!8GJASd!wIZpZFI%D9xe9B2lshI_4kQM=^!4I1Hh1UNsnFHOT(GnwqjOy|wH zdmRr&hipBMd*OZ4cTSsjz*Z;6&tAg<&>!PH#oAi}r%hatO&<`L9Gby!8SojhD7c7= z7La#-B+++VpIB?>A;;jcM>`)7URrOlxZLliTlz2H5OM54dxUh3KYVa`%N0{n6OU0y zKz?jv75qdyd7pQtMfzEZrAQ%UBQHHHXKFEGIZ$}>3>B<~)g`WHpCT2PuIgc7&azkN z!1#?`jVOWV&95eaUZ$dob60y%-zJc0sHCpCpTIh+ucK|t)Q-OzEXfZH1ZdY;`rr?0 zfiqp|E`)3katuqg7})95fHj-6?I~7lc8i z?IO^V@IKy<{&Dx+)69-m9lhqMuSVeUGJr~sBPNwj$TO5DtiB`}QOJ%MOO#Ehrj$aq z;A6qkaJ=iQMyZgzRTW|me;ix~gRo5@t2dajUJh^tP%^-&LPB+_-@LY0Z z@@C+G1);&hC9|qtUUBMS2c>-8#1MSkMEW(wx98X5y~U#yH`;2f@ZF2M?&RGb^9Ag8u0;R$BbNGmU-55Nnl6SmCjVSlM59aDtq*#HR{5CYd1}Y=T_cGP&%qV$%*c%GPO0|0*O_VY>ha&Nh^K^N+UP@gNwu7DK=A;PwRC|KHH z&`+&rnMJjF|87lemT8G4KQrcVx$39rIx_`1kWTYAXWb7X_&tl_DU3qHvbuTX9cNcn zLE_+OMju6=OVp?+Y>))gL>CRcMmCD=dF`^f z*9_h=FVFIzfuRyQ$YFl%KOqeCrKn)S#>(y zq18S#XU9QjUJgS7t=ujSOVKOj8EuBWrwx)gLw|_+dI{<^u_n-U#>tMmsDZg3XPJZU zaBF*=^IdmbuAb(aguyFtpj>@fz`rVRTyHSaP~n23GtVTmx>T=PKU~?fIZjJ>&%_^R zdixg@7bLq`k(XU;mE{YEgG=iZ-qv>C$H?WNyFoiJk~%t-nL0HUKy?~^7DuKA^i2c80+Mnr~AP1r@_Z3Jox?&=YEf>$MfUWmDx^okFDID zzTB<;S1kAVaq+L4yhqbdMP^&+8W@afwgI>u9D`*s={+ZqT@a>c7pe6u`L0YwJIhm< zTwnakpsJ>R2pyp}D;!?;DLtaEH4(o*f@=LP3dknYGsKZqHVa&T=yVh=rq2`QL;kJ7;d+5ga1prjE54-6pCXH5@q9kqmx4lz;4PQq(>nUlmRkkQk)MDj zL>Kf-2*T%b-V}H(1=rrrzcZy{wbr1>CDJ$>udX*B^-g=xqj+2#Q}rWyroNYQ0B%;$ ztZhC(*dp#Lm7xoMqqK$l8S>EV;R;NKWkJqn16LnAfz?l7xcQ(;CT?Ax&wGJueW&P0 zPpj#*JfGgsj)uG6fv5c2xopp(s&3*qH{@psxVHYKew1yZc<2?IFoEpR9*FK-66hfk zpVM#gnaQX}-kj%3=wfRjRcBM}4>M7Z&DWn5f0{F}KhGzxmekfZ?_#y`v9bdMk1L=- z-p8;VJW&g#FN27d%ZV~AD^$>aEwWe`x6~_7rKosvLn<+jQzXLkfOk1*T!zt+hignK z%bTPd)6Ib@5>60ErCG+;3deH55Ybjx^D9}1zQj9Y!a)_+C?luWF4^6aBjCp{|Ee{B zUZ)tA2vV?k62iTZDjKTY!B2JN6*r`%QVt{7SI&Sst{{D z!BZPcR+UYp)tV8N`6Tf5Kt%|&{r=#2d-DF0{6W&mzx1fY2d3t#PLpF2nA;pi=dZMP z`8hYzNI|LRQ(hYg<67+<8_Q8AN}gr!r3G!R2p*M0Dt{-|M>#{!jD&jbOlixXrjou} zt7_;6?Fm7q9;Q9V@u$4cesb{rHXnRLzQc=5pE%jiPTiDoVU1By*~M;GIme8IW~7F# zn(2mn*6lNKPxa?SDAUO0TJ~4zBfp00MpcJ7B!VMXmlWWyC5K$5Imjv%T+DfW{jJLc z@fYi$+VJ~C>9iErRB*PHvhym=$;}r)tEm1p%PdhUfZ4K>j@JcU!ZtliaHkxT-h!vN zQ=6}l+)A3~k=+iBYSPiz69g$u#G6-|m_# z2YwgdUwwZm@87(LQ4bR@rgm*plY7AGD#+O9XP;OUk~4uv0{q;vd&5uEi;1~bEl7>SHAhZ?G=n;_ z)W}GyKDGltBSUNv)eT_%9t6%*8PIA$wDq&EY9>%qrxG4E^O+iD$~sB+0KGQ@Vm&1w=Tw;eraI&^)_LijwV&ZmbCvM z>$T0t9>rWl+iuFxb{S^4rQR&~axh9A#ngo`2 zW3Robr9BGj!~@ZdhR?R9p^&H+20Olx7bNbca3KZI3i8eNYU<+9#s=B6M7ptQB5GG$ zb~n0SefxDDSy!z#v)9_JnmX3pmbk2_%B-x)+&ZFNX3G(xAj+hku9^&N&76*4uZ-Q{ z7V*B$d!WhZEw0{g84y?1AhXMGvZ-($A{ld5DGGg(XFY<7oRY~F9`?l2D;+PhcCu0Z zp0NXUZth`Lm>~3kI)9JBzGjw^Yp;kAu?Q5I|58*>r1wgtBGM5Qmypk6|8?{jExa-% zWxdsZT*x|pvtAsxU+q~6AI+o=!v1@df)w)1Kiy364|s>*IW8TEM;4bt*XLOEkLqwZ ze?Knj+uPyNg`;Gf1JLLi8jYda1wvXqb(tC( z5{lSU36h5V`U-D_pQ=idDvI!54^+j;ob6=tF8L=aVBbC{a&jL(xGk+kI~{EZJ?Q{A z#~fK^Z4W3k0Jp=1^2;i4F++v~taeC~Ybk=2UHsz$nnhioCx)q6jNZ{5+3a22JA}jq zXpeeo+xBZaBLX^Z@%7UdpGv3Tdl(jkyCvm}F2O60A6a^@5*g*TlK!1rpT+cvSnk}z zPD4S8^b}R!AfUCl+*2YIT=kW|5U*V@>}%WUjqTBnG#dUkS@;X(^(XcuF=ctDxTz?* zxGt!bAGarlT#?xfW`|owP9KG&Y1Y$L?b3F{hEx7;Vx|*{1%W+4pTMdSM+}e+F)~YnkKX0=u>=dF{hzO(AtLZqnbvfT>ZjD z$*g=aaICtO8=h(x)zfYfnKP&f|zId|z9Bd;HSWcMHG%G>@eve1HpdG;_ZIyl5zjYk`cy! zS&VH$#zhfmr6tOCcvr-S!rf+oypOe zjB`Qtq&lPVE~3^Bj%aeuT^m?%AWi4Yfo`nKszV%zk?e!n=c4f@JNUU6+LA3dpb5(a zOR3|GvNIN(2L=aFayL7Cx&~WwYPe)-W_vTS!aHH3>^YV(%~Zua>Q=+n zjU}i$5=n(*3-nOjP4+TsW)L1kQfZrq!2Yx0u9JV5;7xY3RwhMJv{BNo8CLz9Of#p+hqc+uYc64CcD%qGF>l z1lL_1we4a1JAWnHRZ6DqAr=HUUSY?!iE0co41>4(XA(Gm-u?(KT&pB#?T+y7>#iYu zz@BPiM^9Y}o~Y#PWa*TyXnb0C4L8kV)h1Y`OX{AFFv6ijD3~3WxvHiQV@kp4Q2PjNPuJx+l4}=)SchsIoZ8^#fP>kc>gZn1%<*wIYre6xw&B~{@^bV-*hP{W_Z@-Hbpm14 zU^3|;@c-K@rRk82z+!t1+Me~9R@q8~np+I&LVKsJI)YG{Vv9k3_4&ncvL_fq_7)Ym zOK=#7CNkY03L{&3-5=DQ{Tt*g6RcKSpzMAKu11Glh|};mko@m6yONaXP$-`*aaeq; zmYYZ4AVbPz8{Xi#2r;*kcsbeufk$8ekjih|%uN2OQ2~ZG*IdQ=p6-7blAh!f*1a9} z9#@e#f3T*GQPP#d=Sjys{#aNXATp-xc$< znR$A`J#bdxIvEG?l+qPyVVLN{t)3Ja_$s~m$-sKO4cTdn?pAug4t@q=GKj+C#-t=O zsB1tFOS2EegI*sGFd%FrL+r~5bZ`HQhxxXSx%z4EtZAwKXS-yMx@;qjr*Br}5xcQI zTzT$S&L6-IUICwO6C+m6t{n~2kk68aTGTo+=(ah;>3z+JQ|K|g(EW64+?tvfYE%YW zerr=$_aNXpiai~rC>Iqk+dG3L*e1ZSbbD_87rp$|-udlT<=O!7cxBBk-d$@FhVH%6 za{AXVV|O4{zN{~)pC-^-mM#xJc>H~s%%)BcKE~&r?cQ7-r+VeMD9Xy+Ygh4uc$zB0 zpD$FX5s2{#llgXgqY+N`WiCiZ^kS}$$WLfwGoLK_p{Y7b<^6`23!$yiMEkxM%&RbV zydlCJ5Rvgh9sHy!wsZFvou2EXOU0VbjU^Jjt<27 z9fV@xXGND2=9N=IirbYPq)uM&i5IlD15Bl%Dq3kZ1##5wtY?@K>T^U@m|~7 zHccaa1%SyV;~S$eCZuhAqD$n!MMxG2E)X6LK3V)hy^NBaQ3g3=4@}6V;{QU~^5_fk z2Yt6aD%Hb3yLXY`2BzZg?kSM#E4g$$y{|ZB!+{vImnuw@iS^m6J(HoGHWG1gfDE4S zb-fId*RmGJBo%KAYJ`%u#4p(liy4d^t8+)U`^%$b((z8kzbDCi$YVhkd`9OgzMYd9 zY^^MG3B-B~SB(ym^|fT%OL=DsvYYdFNhXb_>jn6J1}Mf2d9}18s&7)|v=XA7I)70H z6SJ7`bAXnI->ad(If^-W+a$VL74W%bRv_9de+tX?!8chnS(O_NEB~-;vW&OFws+*# z?V1U8{GK8&OwzZ+8@A*&*R1iI;T+DJ^<1rcl(OAtoSCq|%@roljK#`!Nsqs^FWh%a ze9tDkJ_AZQ!4kEk^Y6y!HWgTzkGqgI&RC8IyIT{Qn$t1(z@4*zFh54G8ST=(br8~-`} z`2XKVl7o?fjkTeky_=4MqrH=Xqm#YSe;kKi$}|6y+sjV->^q82L?M%%|KrpW77^?x z9d2(l;eUZvI=2Z+M2qA&XIQt1Aumbivce>&L99%MVG6TI<8J+1eom5>=V4~eLgw{< zx+2|d$mPR{9DgDYZZ_MK8P8rfa0fp($=eT?H<-H?Qi5*+8*W<9oT$MuvKxw4AXK{6ke4R=csKNmLm+D+S_|Le5WsuQegLmh?(Iq@(jL-AkZ#B%=n> zCjViOGmngUbN7Mb>`mw3I;Nws*{$+`_6NJ!#I#^m{P*08a=2{XzPmNr{U_PZgDM_( zuR5J$&LR0A1)aJ&SBDLQ6D1#K*XX!lr!5xO=_YUCG%q>}>0bhaQIa>LX6iuYIBc8m zGdp_(?=nJdc`JRu1IKfHzf6V1`igdQ3m5y+31{M3(f#C=vQP0piFUOMkS2L>HExtN zXptb;eIR&Ll!DyEAT+aT5ZcDr1!i>aKhvOIkP8vS)3lRHx@g_CP=AvF805LX!OLI) ze~d8;RAGG1ARP&k&GO+V|Kx1+h4jSPrQ`j2Z@J#y=%N0mo|gAUxZK9v+<2Y#%zNOk zWovEFd=#fXpm6szTVh-e=@Z?xdG39&8EywM0YW6=fN-$76ByOY6S|d4ztG^9J8v94 zfSrs;qcw4_ni+(NtE%GtdRde7)xzl8zZa~U2=La~IvZMW1%~NV>?%xsQi_Wq*l#uY z=GHHckyf1UD?6;MQKlEZV1M>i=(;0>bryAj(AT-#lyQde7@N-0Vpzu_eIIxa$THN~ z>{)RV5H@NO)^9JSO?<3~tbw=E_J(T#@m z0EsD0`jDvf5Q(d>&{A8&JA1e|j7x%AB_`CwWJkqlwrjd?_qNX2+~lxcdCBx93h-de z&$PQpf>8gTB;N@9gL)EE|Law_-TO^t{g?Q+6ho2UBK&b7%aI3E*C8IM321lA4-<4Y zQe3!umG?R76WEffU3z*|XUzdiIWMAO-#v-?E$rM#f%j6Kg-X$i$jID7zR)dYsj@|Z zt9(-a6E*08sn+j{3ecnT+r(`6T@Zfo+Q^KTtKF;7hpqj+q5DtFJGdIH$-!5-t0t5K zN6jY$MkSCT1)lSrC96OG8e7EIvqA^Duvzvw`8f}LSQ+jUtr}Ap&~lW+urpUZs6m^b zfDU$&-L#3s=sK#XZh^TCCLc0)k^~{5c?>$;ePyVd)s!LWhB1xZuS*HXtMosm>myKz z!IEiP?bcRQaZ!`B_E=V%M#h2Lgfw~N#)J=c-Di|xFJl&~od&F0S*Ihe&M1iM!7C-S z9uVp|>pQK>`)}W2!u{L1br3r>wrxIwpu|Lg;$mdhy4>H3pTM$=!fgSCT*hs`y}|(o z%5@6Qksn7;B<&3RtJUzy5r+| zXe^mz7Lv+u5<}hNES0l$hECXwy70zPC4!4#z!S)}iEM?r3rFRZ zo}6J*R8zh+2$($>+i>H>I39*hZe$qID{%jdf@N%5Qve_wTOfGwJib8kw43ZbqLkT;y!D1s^2&Qj$Ue*b4BW(PMQ*b)ER*mw`NlI+x$@ zv3@TgUv#0K`84GELR_f$+8j6W$j-yjTjQKgR4a+BvD=`$+`lPd5cFb5mh-IzzYt~& zfg1*tc>_X67LZi6-bt$wkKIpsv)~B!EFkh((VDPQibgqB(`VOa1~r$g88G{>8#GTd zHpA^(Ck4Lsm0p)Q<1cJ6*Jkb(SEPsucy_mfA+0kE)jC~-VW$9Elp4W`F MoSQV^ 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 z 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�xEIYo0QDXj|+w+A-W8VS5pUs-^_0 zLnTi0Q*-)39UvxP7}8HJ?pE>EhE?x=R1~#Zdo}9dZo2Xqkg>hwIQh5QAq#~4Q<>^} z=c)j)Hpk0v;Tp`%;e2vKR!{mvKZ6&2t78Gy=;i7gV{c}7Tu#j8aKb7jHixUnywk9P z8Q?+1vP%Nfty3_}Z!Z*iKTa}c6!@0L^9;%zmmvUv(+ra>907BA4d?R7691q58J?#8 zqmqt3!yUls!|WQB_z*Az-`W;?EXc{fSAp8xf9iC2Z31Wi!oCwJ-3{#Qb{}4zWv|tS zESe7xS}5%k?;FLD25X438)><+i=*8pk9nmJJa>XSclLL7RN8X?f!Cz9Ug8{>a3KdZwtXzE1RxaVZdh^MCMnxV-aOM;(Kg{uw z6P3SY?tY)s`AvSmAHatDC0Y%;T7zOx)vAzkzp;@Vt?)s)HrVFivz;=gJsMH4{mJBA zh=S#F0t$i@+fSFeTJiTo{dOoh62n(aT!_Y&VzQ7WAJ4lUO9xRLH;%U~@n2#@Ey}UL zkC6t~n1qQpRRz|N!@|HAi^i4O8d=HXU?CD}(o|w%^2&43|IMGkoq)J4XvnM;?qiTOpa}yd>H(YNPT+T5ab!u4_L;G2a~pI3m@7X#s>mze z;yy0)KE_r%YNmv9!U&9Ao#!>r=<)yqY}fT9U;VH>D4{sLq@Q5@s~Y^L>9}>*lkD$) zw=9tw65rLmRGB06Fl*!_Ij*3>^e~?29YoL0A1mFBQk@&{=r_ccq&N#*Cu})*S#;r~PPr|gZ;fA!Xzg3~PBZg~Ztfjq6aAzPmBa|g@Y&33yxl-k zT){41jCj1JGS?3oOBn@5lS~|~-k2;Gw3XKaQqCiiTy5SCU(gtN;ifUA$%4PM$pwCHL~4p4kEq1Cp3cLO{Q9$yOnjv1(>gc_Jkf@*NvM^j=vzvk13j z5a*6ff)qWe((G2Hh0)4X{+fNHzJz=6leW&} z^nfH#9TTbu+3oE&CAzy3fke4}fDHM8gJOr;kcVZXwGhd9jCLCN+WuxpB>_pnbx>x( z+zNUb%PV^^#*7Wq#tnMUF3z?Qpy3>EMr*3}rdmNDgNs9|pW!6!fg7)<2ql8vy22ZT zkvRfvMriq90AK`5B~~x67Qi)gK=RGxKx4@%AMil)g7X*%=_bV#{Eu7$l6&}2ibz9* z+exL0{`Q1SB!zo_@RQS_j7dxw+o16o7lrxemiTiqobD;#{`G?|C}#p$FnEyP;gvK4 z21=Mrur3u!180kB;xYS=DVNwKX*j_>g4h7(tp1ZwBC;%^F*V&F~Lr6s$PS_3L zM1)~R1UryBNTY++j+i9N+>H%Y@FvroDE5jY@ycfLMNP;n_DvqzS`h)gUrHJ#mfI)x z#Q1IpgZn3-SRPd_FiAdse%aEDCrr!d%#8~?$=}_7c$e=)CjKFd{u0>Kr@6yz@39w1 zXm-@8P!k#9_~26ose8zM;*a6pHy`xe0gTMCte6cEITK5fH`+^_cN9ucCYKoKg{n>T zGZ9GaR9!}34I1X}v-k9%zmyNsap?Fwtwgz*7ikQ1FKq!k*D64R&j{=Zvym9vLRV0? zRCh@sMXs$Ux)0t|z(|Y_G^PNCVgd679j**uMVZu^zTilSf!x#_qDV5>I1rXTq1Z-^a-E&=*mho;22~=q& zEIX-Gk*R(gp*#00n@KCg^&_0*d3n zd04F{ahh_K3f@Ax?&{`0KOp|k`xSdY{qHrC9KnK>o(B&VHJ|@-v#1J|>xl$?KhPRk zRtpeWBfB@Qdspy|Hu43;#1OWvsl`cFl=cgE!>`hramD5AXp%oPH-&^!;jmXs3toJh zP{RE_k?*c4kM6TQD4876FYqTVcquIrV>&tTPXdfc2$)I=y3lZn;K2%g3^30ZvUdd& z=z;^pn0%PL4{U!XMTv`1N#GwB+G%F##`#)CpOV8TM_VgGy*ou7${;4af~O zYzJY}7>;CM8Cd=xfdop?9R2j^T%oZlG!gwmLzc3qS6LB(RjTCfV9V)(p203S z)Lk36M=-M@?a&7c1wnvvTzl=%ZVe0RLk7igG-3eQ&XsKa6}V8|-T+UL3cKIbW^C0c z?p^Y{&wHTIQ?|Iu#;1E!Et#QFF3c0>F}?Qiqb>4Yr&m72TdMu&H=Lp(`KcS&4#-v3 z<~=`T4rs3;up?jnYVf68=oFkFqBgrbQrT5P6N8aWXuIU%&40F~5#Tagc)!+Na2-a- z`fdBHO=LFe+_Tt0LwL*vJ}^?Z$RNHe)LvZTgDa8>#_x;32x#Q?wnbBqr3Y{N#zx~X zvC6s;WV#JH0hziF7Eo&dvgeO#Sfj-@V_w6m2nG|KF_Hw%Aqyk2NGQ&C${CePxG3yO zJcm?NI2!!93f!AKFLqzJ>GMw4kEY&VTABTw&GKoBBXrw@t$%Z;fZf1dX0-a`f@o@& zXLsEmEVF%Jsu&$>5lwP~z|a3_OK{f5Kz8^50M63^09gK?w#3ZD*2K}k*}~5D|BMu_ zeIT>2*ERHXd~z4JnHHTYSUO6Y7sNAkZU`p5YX3}W>fS(YGIu_p+7-z0szryF1z zH5Z=*jJsXacaFQwD;qVhT~(c~k zCaan|sc@XSrEElV8C9`#Cc6Y@?^33J!xNl0n*R(BRBxaTUfE7Ny%mSC(o{GtGk0u{ zJd7NQZqi$gY2jtRwtZ}qkV}OIkC#NGQdQI_GwW0bJIlc9D4RRpy!kf~UQ+P*(5Oa0 z^r;lQr{xshq~)waKjN&8K0&_Ao+WuE^d!A^zc=wZ$d9SxZ8YbI%b?}Ke zOtSq9_Dwt#Ve^&LJ9$mU@{95<^+j7{zb@&L=*@JR^5$PCnxLi$`N%%dy{-CUxXyBq z_=Y_tug++Wi7Hm%GlG0*Ksl{CrDN?V_N-hfu3Mqip_k0m5u($`Ry6V{G^xU}seELg z;B#(iGH_+(bl)_0T0h-FE0uyznQ7sq!|s(I+)P;6U73$jjZlTE#Kr2m2s}t+_YSxE;QC*mb9rTZkkb9-ryv|c(3^TC^*=m-k^JCPg3f^ zUb?*l>jKtIot>ZjF0#F)t#h!jUCiUS^P@dJjj!L_q+HP<Ei7Z# z5`Aw0Sg&d{ZO%gL%GrS)sRz}!S&ahhGOMW0UM%vvWr(R6)EqnzD(N$BYTl*S)$zUQ}4+q2O+84t8M)_QY7 z2)@6nQ!|{Uh&i@RSl7#nt979t{nJ-F0R#xX>sYm!u$nFE5K&#aLkA2}>|>$t2WT%+ zw-p?hry^KZBdGQEpVB&bG~9YtHkjM_-$Z1(^XsBq&V`FB^L@~wMo$IHur*`)E?v}{ z)v3MYY^Heor*DfuZ;f;q+0+4`vUcj~6oUZZirNyn3(- zsk2{KrFS=Oxb7+9u;n>W@&xXx+j1{j6m`T>Eyb0Rdh4Wy3nix&mQ*N~s%3aB$2LX6 zuNwQOWz~x4jm0G!(ThrfIn2J28<-&!T*3w$aKF)(L@1`$frAGjbl2-j0Gg~+&3G<%G#IdBck^#b3NsPCY7&Fc zS0!QeN60P-$)2!hVD7p&aS-fK$l9JRxQ)0{lPm2P0|*}y)1m8BN_yprpVlBBU#r=i z9VZtml%qQ3G-P}r=og(BfQTVb6Ot40_f8c;{NuNW>34v#9h0rnG)XMfWFaH}4d_8* z#iIH8b=b77AU#<;+}};U?C5lV)F6*sTtMc&v-h9wMgZ!xG&u}s6+-Pqr-bo}TWZ2B z>Lq>;IA(nhaD5-#uY7lt50Ka~EH(E5#VwEt=8DZtbwz{j{IzM9h-xjJZ}V;FmI!bMxhq(bvy=LQ@oCspq%$;` ztH5cGj6pwC&zgvK;Px%IIez!xnJ7=T6G@M6F=^dpsGP$)%@HM~SjLm{HtVQa5S8kB z?&jU_6knB6e_^j!wZg(;7qjO?Fe*~I7&OZ*5t0E{y}EKle_!Ta&?v1A1~xS&dJT(d z#UlqCS`=3)9=VO+?yHn7%BL#~lLgs#6hbpUXih4SQLcMvLn|diW-Gu;j&a2@$8rKI zhJR(A(2@)b2jFLp&sKtj)t~jknwPk1>oWHk05Nq@l*0gN3oElb4WK&U{X-y%tV0Yo z81WWelH?mnAm#7FwRd4GeZm=G)?EiFIo^eZb(gc>UBTFKaN_Y1X5JLMy0j5eQy6%+ ze5SANR)CvB7~9+^S(<`O(6w+<|3K>^s1>??z7w8NS~emXU79C(TRQ}S!{Y24t=UKO z7~C^I2jtE`J(ul)CrJjhIOQ$~;+9`~2fLWpUbP733)Oi~J}HpcAnF&1{oQCzPE(o! z#M*`Qx9}0|uiS(MN2xTqh{t7L4urnEoeqWoAOSq6ckpamN!26@C3~~;amR)drlQ>N zI4Cp!rt2X_aq0XDiLAE_!)^>sP-C3pU^hf|m;sk^{J#Xx$m(aJU)#&|0?_da`O61| z+v9V4b(-vx9Kz@aZ~DYSC+e}qx#(JgJM6A}Ry-|0CDtt4MW_adz6#+~3u#YB_sYMn zIXHxjS)2=Awb)EOP=GL+!tLuh5T*o&(}uTYTv<0kb!Z(k%~EXGOUV?|B=SG}wUSf_ z;4#R5z!R8EF=JRsR$zZrKC|(qaG9oK&uNj#hDM{1Nlf!LE}T1M)gk1CoeTtARRuq5 zkjgvg#8iccZ2E>^WQ=Ca-&sh+lyXlV`o2^bCR8nE&)ujnGCl&iez;%w3b#G~og-(& zJO4r-AwA(1wI!y_`C6_E7EQC1kb+QRB+oB+5()R`%t@fg!Pn6;3_0lX?$z=-J zmp6RU;S!kVI8~Ra8ZcTLz8JDsgQ_2$^4jM3qT)Ho@h|kQIs_}_E&rIy?8FcW$0^2*E2VgW8ejT(Nwcrek3x6~nl!k9aT}0TVj35DqtY+mTyfba8zaS>G@<|cR zR$J7PpIBJQ&cZ9!Lz`bYDO>8wNjp@1HJ~FO>lWZ%9pVmMrELO7Gn_o*AHLw1ly2h= ziFzVDc*);-(esMqTnKDj3oKBcBfF|!&8r%328| z)hKRWZ&9417H@J&G)DB+Cb(bAub&WbUNm12MB@CLSJ>toU~XB`E6SX!3+_U{uzGeg&KvMjzLo2KtC|>jT#}6op z?HVwN&0*5cQ;1#y0mRXj7a-|Xexh2RkrgPZ^SZ4M#qcM!6r|pWHwGXW8n63wG7|Zw zs!ExSvs&~E%0Y;w(WQ8!nG>s)2ENW@{1{%+g)`p@3&FuzQl|h+GgQQGHH0|s45eAe zYB&B3!a$kqj*{xog(-?TgCwG-Kscg}%8z!upTc1?-p}$`zFSQs7O(Nz7>`jx zsekr_ilej8EhLgz+RaifDL4B<3*KabZUlRacSW;z)cQpjoE#Ac^?eBfNQ2Tz$neD2 zw{7HP7mO^Sg)Px7$PWr7<`uAKr()wWZ-Dt%*H=SXvUek7%LFs@EmR))=v>Vk!H$ z%uRcx1!BuPD#ZQLEYLPofTzr@v-v6AS2}rG<|14+n32ZhrsKt87429%PBM8y=Ob7< zR7mlrVG2Gjt4Bt_V5O^M!GwUfYWbdQmDG_>Flqwc`*0}H(vIkR;RI0oopx@gP;;|= z@B*VCR^&Mau0IAP3M?(NEPTlNQMy3qVUH1HJdV6EGYSKY+Y}MF-|Z;@`)-=?-9=1d zN4oJy9j9uG_eA0e@IVa+gZjoNINqfyMLbkvsT3q1&UE;c3xuIa(s95DKq%S8-WnwF zMUGKeDg#Y)i8nZ;iyI`(6gJ9gj$H>!376HW; zAtVsi>qv!#N_vU2U<+5MYt|lz*ycB4&Y^UrqE!Ut4>?+^P2B^6P&>U@L41dXv4v~y zI&t`+_ftXiK=!xdzh-_rVpf&c=I_Y?Y-{+*h?rDSy7_*UR&%{%4R&h;fbI|0!nC}j9S z&p|`x1SurK>m-bH#tC3!_^-`}^DKeWlhR6DecEk6s*ynzwL$_m!NAf0s~N=-k7q7? z^n@@^RPKKwpe*B~^bZ1iPC3ZFph&f#N?BB>p)yH+`h(#nvJaCJ=dm3*u?fl=XRD~` zknNm76%*WrU>>%I^@n9&rd^gg8=eK+*_H*0EUu(qqKSy9&AC98FpSZ|BcUJv3A&ee z(1DAVfQ&u2x0fEykv2;FVi@;-)O()}S4+XraTVo^K=z1VfGdH#;0sM{2bVv9jzbMurps+oiI8-+VjP zg26#wSJW_ktnVTNxn`bVYlVuTQt7&e&0J*Lz7-weX!@0;FWFTUh zt(sPThL}U$W1o*@w>lSOY>v^s?o=dmVMjsbBaTsjsjJTAaDpV2bG#^a7%Jel?3Srw zGKObnL*jHY4%rSt&Ei&9*%`r~eWX$$aFtijw!hDp(jUc))J@a6DG{BjIbYUvQe8J` z*(IzaWiK4|gwJa&l9yB>*SjU4F|SFwGZU9kcd$eCXuk~uogB^4^_5D9mb@n@*CJl& zGKcI}TAp`^ib%LuE!EI8G8m~h*SmH^Q3;n0(r3Nkt8gfqhf5jgHa$OQW}V_n8lzV5)_1%vuZ+Ms2vBaJiHTd`v^1pi(zT+^Fr)Ml0XGN+YyRrJ!vjJFaKEi@ z+)+bF;5pXWY}%GrAbgc-m^~xYxWk`9=oSbRdy+5XYFX_tFOCuWCg@*d4`g~XYXSxJ zfFIX{NCglDbd5toy-RilOIjWXaI3*mcq_o739d1WUa7lv<92tG1-h2<9TbCFAm0Z< zFPY((LTBdX0RRAzWe+NyVNPU&m2MJu3=o8K7JYDKjHTHkQshj>EQzkcKv}0pKzpg= zhS60;NzY2%#0O|Sq8NeNU3#$YXh^xi0a#Y~gZOz}$J{yQNiYAxS@bVuAu!i z-!FFu?xG%MJA(dn#as*oVP%Vv;#CgRVQ9nY zWT!1Bxw%K-shNWCB4{##;G#Y*`J#ph(Ielerk=NWekEqIaP$}&C2PRpjS*R9Z@D0H zgn$_bdFl%hkCcjSP%^-Mkp0die0Z4}r&z&5HT`c=aw|W!L4xDVqM0h(E=;9^eGrtR zNj`sZvH+X{Fq}!36w@fg0!vK+NL#lSr3%lwC=UvI0zvUD3*|20Mnu_PnQ`jCej?0N zbZ#Bet762j8ks;vsHcecQXcqn#(7a`HUU|*2BJ#&(NGuIG;7Is+Bb>=(hS6R;ioyV z)kd_At@d%YRx8zu0+3HB3|SxpA5a;#6%4+HSJ|Qwdh&&Xi`-OTxrJ=9v!( zlCU7_gY*P%8Fq}Dw!Xdwu(+1G)i>$YBZ=2I{umjrM(A27cUFVd_oxf7B?fvQU||?g zhfeBL1;J{1|D>|1Zo21FE>KzAw9_6i{NT`NcpiO}8R!n`5Qc1eu6{=Mrh-9Vh*7*E z{864S?ro3`A~_Z*8Cdvi2UWQ`$n3yO)0nD|n+&o+LIIj@j$>3KYtp1NO*PeK-G$uP zA#C}mkk0p3$w_eM6%uAbeuBZR$wuB_TKX+@$wh4sZ=6|3`q!1Twik%~ZAgdJXms|T zoLd{-7L$|r1~x2NL3}h(h2uH@U{voN{}^0A9QS)W;IqVkx*&CMNLsDUb!2VckZTBi z0|Nf%0{+=gfF*{%DG(rIly(5dAq4Rr$0~K>R2Oh{5uN#i`iIasyS`j?`NkYwRBO-4 z9Q^)wIs$7Z7_K3k18_00{j|8kL~BJu_>yg^!JWv$Yn8M`5TY=6f)uO}N-=8`V-Cz{ z3jV16SrBEU)*>GaW6|V1vS$H1$P9P}$EZ02n~qEpWyF@F?tql1=;6o7Z$^o3w{=J= zgEV1)V^esdw~M%7^nRfIYWS~eiC)qkKsaDWz0a0~+p=6<)AX!cPLF&C)3pQuhW73c zQIp_)UTEe&oS=B1P0+MWgZd39;duDK#4Rs-Ir8vVF$4s{)DSPwiTZ1RV!D-G0{!m` z@5%rl7W``eDqSI%j4Zwoh8X!bK=cBc>RUimLY;?HA$t@8U4}$PP=IEpuKpU$sG|a5 za+<4Q{snzU!8c?7S)<9vg63Zh%ST2!wbPyp%8N&@B88!G1tpgs9|f3W24)@&!{;5> zl5pZySe$#$P6Z+iE(?5`^vZqaK^zXVS&s<|FC$TpB#KA%rQQhGLauXO?F?qwj?>rC zQZO81CNHjwjKC>8WRBC2|9~__7JQVU*GtNf;E|@zj&|9V*06A^wa3^2UO=fFx`IH- zeyrX=ynww9FDy5x6Y3@4J8tQkxfHKvJA6hB%#QGA5wBf`YHtG zsQ=TDR7EN!6BsYIfQ2a{FvK(@o_7ocLZlz?bXEjH+RR5_%Z129%|nJ zX@~luRK=K-x!8071=5VcC3R`NLVL!*BO5%z&H%4FJ+z|fG$b#;B2D3`&MzXTz54#J zG(v2!?9(ABZP%nxfcUE9d4c|jmbA@~}Posfmb-mEw1z)afg;(#*1hVyEtc**q zYmRXcJEM56& zxUBgRiR?lLfS3?KX0}0c#$$-?)nwA7Rvo2N&z8>Qu_czUpRs3v&gTo&FGu()_Z@1Q z6|uc9T$!DcQX}vfZOw7vSx94RK?|*@d8te2s8fj*vtmoWLNW_lOj~2SP&mgCV2xb0 zK^D(MYs)1#KdQ~|Q_am2n35gNMcOay={8H5lp|=30UsY3^-!Pqq8A>x9O~Pi_?#nf zfovpyTmPA7yxN^gxfUQ-2+TK{eWcvObj9no+Fv2!o)$dqm}%2(fa!AJQem3`$XBBb=a5z2JQ0 z|At?osHNYoo2uB5tQ$WppqzK=QA~WAOkRAHyoo0%4FdvSJdV%!75xcHq!f}Ol0^nj zXvoisSPrU@k7}Aob%kqj&=%P?#?}GNNK7lFhJkUgBNdon03+^CXJr}uIrkT2SSi4L zLDn8VoR7dbP2V^z3nWo`E|Z>UkeFzcndpp}Xb|R3Bthb5g6t|ELSSM#D+)$MaBE!x z8}`jN08*fxV}=dv=sP%j9c%-8vCumTd_lO@bPP1g759li1U}*pd12{YX-O2Y)%cN~ zU=TyF)X^!nCm{F~QU?el7MRs_MdCCI3EN|^c74~a+czSY^jF~Inz9ff#) z+7D=dF2O4eNG;K=Lx2Zz05LEa1j@RVZc0$*MzBX2Mj}svY3moXzd~NXz2~Z$^c^;O_7iJ* zFREiDz5Bi%B+G}o3eOsnih{hRxoC$k-kNnxv7md4+$(mg+8Ftns-_y;&Ht!@2gf?v zJ$=C$dP5KyY5K74XAsjj@P%-j{Bq;InJdzoBy!_JN}@b`_NZVN<>S%)ezR;Y3Akgl zr!EdwjI3kCb$FUec*r9Z1#=!a{48~!?!ffYW1zX~Pd}rrea6)7K-zcto?7W#^++zY z9K)lgw&ytjz&wTT+#y+TX!+UED9Vvr729rPOy+?yZ`H5^olaj@==8!EOTYRL%Bged ztWNj}OB>B}c=p=+e>m1gnyfCttc@yE@;{1Cjhj6!8dn^5g)3CLm1T^Booj=&7L({qhz}rI=yp`j&8m3b`RZU zVfl@*UCuNrv?^1a!Cyvsrf*=b#$C9{PXzl)^U3Ze*`|xFv16G;z84NqcQPLLJVZB? zZol%pcMphf#_;`Gr*cmk8f_;spO~_YWPf!^zGlYRldX@lTfWPpuzanLlX$BkpYMaR z4w=v0680bW|lU&@JCCyPh7mL%)HGTL@4!^gH z9gE8@KtxBk^6j-V+T}|^&x0JVoAy)oxHos6wMPdBmVfSA%syEeygiX6JgIxH9ji@R z+~&$IREOs})Ony&25bh-F)bu%GX_j&0n?He^GwFYg%MDLtfh?uu6;vB&RF!6CSC+H zUnWh3-&B_ey$!Uu>S%>;y$$r=4^8x}PV5#B5U+3u)*dqvLFh+gl{YwqVi)6mZxD@a z+SP_Z2Y87u^yHxubt9pJ1guDKjUM*F(?NySxY$Mydu=q*kp{R~O^T`+ut7}L=vmDp z?;NQ)q!CY}CTYfvdmC&gE-8kG;r;F*B;ksUbGfFxKqV7Qn*-h+D;eeo8R1J=%O+Xd zt17IkdDxGxxhj_b!nzPb`90ItHp6j4()nHbCxharf#BLa;O%$R@oxlpsP9pW_`ij0 zzlFH&@!(EsaUC9T1bAijV2)_C#6H~cQ^cI6Vx}Fh+OV|t))KL}#_Ex6ujof*JL(xn zW$VXXwvGe5GY6M%UR^&w_Q5Bh^jfOQbfnA-v02ZqquTOR2W`w9D1tajOq^2H5Yg4- z6J^cyjd%?0u8Qbbowv;gPdYkwHrA%U)26egNkF{Ev+b^p#?$QtZg1uNhKI+}{E)zE zt@zzlBivYNR>wBSgVbrG{bO0&>)Zx3%XkNY!^1(>|!P~C`yL$GNKVA>E*i9uFS zRIik3bUtW<#5>=%XgSgaw4E)94LH;TQG+S^31tkCZt!y0@p#fiy0&d5X5Jn@{2c}q zUp?t%;epJ^&vm4`4X$uh^V4OhNP4gss`q$@Kz#5U{N05jb5{%;aZczBMI0P_hL*IPWV(&MUVo)3wj7B1v0tg`Aj8w^ zF5c=Q8y}8cA{S*hqAz>6&guf^L_K(-hy%C%u_)!-41=d{g&dpy33ri*9{4mT)H}(R zeJL`-&hT@(6QhBk|B8{!1CxrPQFch&%SFFi8{�=N246zh){d^fZ^ww0`bd0VGaB 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 j|E9`Z-A{$|hIkbvY> Date: Tue, 31 Oct 2023 15:27:12 +0000 Subject: [PATCH 4/8] changes_to_torchdrug_reasoning --- torchdrug/tasks/reasoning.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/torchdrug/tasks/reasoning.py b/torchdrug/tasks/reasoning.py index 1052a973..faca21be 100644 --- a/torchdrug/tasks/reasoning.py +++ b/torchdrug/tasks/reasoning.py @@ -126,6 +126,7 @@ def forward(self, batch, all_loss=None, metric=None): return all_loss, metric def predict(self, batch, all_loss=None, metric=None): + print('Working in Torchdrug itself...You need to change a lot in here...') pos_h_index, pos_t_index, pos_r_index = batch.t() batch_size = len(batch) @@ -166,6 +167,7 @@ def predict(self, batch, all_loss=None, metric=None): return pred def target(self, batch): + print('Working in Torchdrug itself...You need to change a lot in here...') # test target batch_size = len(batch) pos_h_index, pos_t_index, pos_r_index = batch.t() @@ -192,6 +194,7 @@ def target(self, batch): return mask.cpu(), target.cpu() def evaluate(self, pred, target): + print('Working in Torchdrug itself...You need to change a lot in here...') mask, target = target pos_pred = pred.gather(-1, target.unsqueeze(-1)) @@ -223,6 +226,7 @@ def visualize(self, batch): @torch.no_grad() def _strict_negative(self, pos_h_index, pos_t_index, pos_r_index): + print('Working in Torchdrug itself...You need to change a lot in here...') batch_size = len(pos_h_index) any = -torch.ones_like(pos_h_index) From 098e33232a697574ee8a0901f2880cddeb94831a Mon Sep 17 00:00:00 2001 From: akash Date: Tue, 31 Oct 2023 15:34:38 +0000 Subject: [PATCH 5/8] changes_to_torchdrug_reasoning --- build/lib/torchdrug/tasks/reasoning.py | 4 ++++ dist/torchdrug-0.2.1-py3.9.egg | Bin 610596 -> 610586 bytes 2 files changed, 4 insertions(+) diff --git a/build/lib/torchdrug/tasks/reasoning.py b/build/lib/torchdrug/tasks/reasoning.py index 1052a973..faca21be 100644 --- a/build/lib/torchdrug/tasks/reasoning.py +++ b/build/lib/torchdrug/tasks/reasoning.py @@ -126,6 +126,7 @@ def forward(self, batch, all_loss=None, metric=None): return all_loss, metric def predict(self, batch, all_loss=None, metric=None): + print('Working in Torchdrug itself...You need to change a lot in here...') pos_h_index, pos_t_index, pos_r_index = batch.t() batch_size = len(batch) @@ -166,6 +167,7 @@ def predict(self, batch, all_loss=None, metric=None): return pred def target(self, batch): + print('Working in Torchdrug itself...You need to change a lot in here...') # test target batch_size = len(batch) pos_h_index, pos_t_index, pos_r_index = batch.t() @@ -192,6 +194,7 @@ def target(self, batch): return mask.cpu(), target.cpu() def evaluate(self, pred, target): + print('Working in Torchdrug itself...You need to change a lot in here...') mask, target = target pos_pred = pred.gather(-1, target.unsqueeze(-1)) @@ -223,6 +226,7 @@ def visualize(self, batch): @torch.no_grad() def _strict_negative(self, pos_h_index, pos_t_index, pos_r_index): + print('Working in Torchdrug itself...You need to change a lot in here...') batch_size = len(pos_h_index) any = -torch.ones_like(pos_h_index) diff --git a/dist/torchdrug-0.2.1-py3.9.egg b/dist/torchdrug-0.2.1-py3.9.egg index 6e0560c3dcf1e2a7ddeccb66b373910a8b415b32..41f6fc09e24d7ee8aefee6f29b7a796f8f7f7628 100644 GIT binary patch delta 337653 zcmZ5{Q*za;Slk^4U+Lt_39wUA2wLoj4s z&^J%LL=oiYf3cAlaq@ zcw2!Vt2SKdo>Mxc`uY8EVgp!)7D1}*=4$qa{mPv3bevMFW!T~Ulp+HzID#=ES{Hf$9xb`LDpBp-g0xce$fqaFM@uj8WJ znV74Qm~G*Ltnpwa@GSPIjjqK{3Ll}Cm;wr_g4`&jZ=dcjC!}W} z)*Py{k4{1|yi3ULud`kVv#MC&3fb=VYva~Xe_9j~ZVk5#FA<6@Lv!l&L~J{gYIq5B zW2^nnSeqo(3a&;!x<6t^FJH|gWSEx&v*-n4rjzPh>{yMKuL33bTtK5h_&ZyFyO9@$ zr>YmR6sD)nC!v>Y+x@S-R#Rf$6BJEEz)=Q}Zy6`Dl%uX9EFf86MKGt77mIsvtkZ=F=Qb1zANTd)E--%SAKALH;dfh^avu0L9RZ^fa8QO*S-N- z0;Y?$-Mq#6RToY>dn$LaciF!wSmKaLSZ*$E5(pJ#x5%_v1JD<%}`pLkzbtr8;v!i;CDfr1GnE#QS z-%)<--G@CebMTe)I)XWw0bkd1u<;JP=GXSlM&5B{L6T$wj2?ayDDoNM zX8&Hnd3opYj2!?*FFQBteI?Z(hh?%}4$oJ@3|eJvpO`+yMMju7Y*jU44Zg7pe@d`a z3y^@@=O&bEwD!f6Jp5?IYQP7~!$K~c<-ZM4}~5)I*~93Az8cd($)t<1Vk zS8EJ55@D)s`pW>-*QlC=f)+_#lF%ChkUw{S41RGf>VjtE+4yu8T`gQj*xS!J3aDi7 zee+>>Sd1jRJS>Dia7+VC(nPiMz>4443Q|-#FmIER-wAP&-YM~urh&G8qY7d_dt7rf zWy&5_cchJ0!;d&&mF9!xQdj%$e%viO(v24|K)-8;oZ9wiMWYFOSP<4P;06(2rlu%2 z?Ny$_Gy$H3w31*g<$$In@#{De*yR_gCxjq$3g}!;aeYG8o#6o^Ykoa+NR`Zw=ER2ysN%odE@0cwQ0ly7OcLaM_61st3yN^I&05FNoIV@5*4K$LizrE^mE-C$KN@?V{Q%?=|}yJ#Ij^VP55NH zs3#L>v-`S;FPdo{#Alsfm~B#>{YJh?9}j~`{CKxeD2f2qJpqnDx2FeNx}3p8%SGX# zhX_!C`z;PUIFsAOZwKCSA$0BLdmWZjt_=0Y^8EH)Y&spk(PC_!klsIPr>Ad|HTQ{0 zbYxUl1-)GXA?k5O^7Xz#v1g;C-8M+&c+J#S6|CKwA3;UypkXsP^-@8wT3X~oz{VE~ z3J!f_BW3_6HPb*h;HrUgSM*l&1G)XMRu(iTL#L9!bmAdU_wESqa#Nwjq&6w%CU1?g zh`H@zQd4bd!<|7`9f0_d%`bs~#TRFB?bhP{Ce(Kdm>DTg@}P04-7$!nA^@Z`l@*0% z4~dOw%tb;>c7W_|?aI$cRRAARz&J!@d3rB;(i$L^^$yJR-11nt16z|%qWq)|wz{FcBz2O?{_KOBu`M@znL8hde(6|OyepJOY)9y9_x7_2<<2dIlf zSEwSXs0Lf7QWW!**6m~d^k_?b2voyj+6Zg5n z!YQDbQX07xX7ViK@7{;JZ#VU@apjSqp|q%5sd^er_a`9^Ih?C|eyBl`>&Etm!0p2U z)w`XJNX*Q>P6*Nh&Q)|m6dNE4XviHv7+V6?9UVPiEic;%db52p`qIUK%wsHu4}eiT zD&*Hj7tS}%#s{mVXk;#5x=f)ex#C63;|IK$7B@$?_v(=4NxN@oOz`$2hSvM}7B$nX zD4!{u_H0KIX=p2Zo?XK!nR~u!r4iR{8}UF0a=wgU?JP$i5GOx%7xp__`xkuV)7U^O zRkW<$+!b0@yCNM^wlpN!snFz}@cx(rrNGb7dZ}`Pn%C$3jd-B^B~KtcqA7|NISa@J zCk4B=-dLt#rB`ko9!}c6z_dVAM%K!2ITlb|@U7dmQuu(xaZC}u(+DAarkn!U;UFB= zaoRXvICALaZxnb{LsY;FL#S{H&Z&g~bqd;Zz$IG#VddVBq1vr52>^4BW4vQt)`S;< zXc!|&RvxOgui><*Ce9(P`_k?S)&M{Zv{)m93$M2vYq}~G&JgpkHltf$IL2^Jb5oso z%ha6&3Y9a44H(J%;Y7YrB)~xhF``;uFvf0?N`q!-ezr8iDa4knsS$k=%ANb1^}7JA zL1=sbrAELluMCZ@Vm=e)U?enDPHKd~n0JbOK>nOw4nK!06kG#S)7$mZKLZ$a3uyIi zeOYvuzc_K_to{Eto;ipM!zQ zlg90L9V!p4(f88=dlJ8RXqav_}F1#9HPNtOO zwpa1)6(k;Q_WFlr?U3K=k9ctEIWT74P9xwuFQ24>9)7}HmzrP0AHCAGwN+#7-tWG@ zCW6?q-D40FP@E&P9Wu~XhEvJHT2U3PJ-#&#|MW|Kb7y*R98YC|^U&Y6G zu1sLp1^>>gIzpRclB|qKph|01wmc1*KiJ!?kT2<=6*ulvROCP^FqCuQQ4t?-8B#>! zwNvN?PDgFj@n#vK}ZpudE^T0|6Ac&Mh zaT}5vLmo*K0QZkpfdHtAfLDyw&X&EyF7L~aNYp4cFwkErEKV$o$atV`r%t@ngu`09 zD~CLu%rJB7l7YKolWidrWdG@9N?!=k``MN5TL2Dz@#qZ%cP!D5qf&zgrzd%0S)y*nq-9X&jT+S3#%nH;8LauCA{ZiB1T@{}jPc|i6YX_dKHt$tk z`$%2gEVrtu&YD-n+kdPT1TCiTHmhAjkD)OyN!hEY2a}Ds%?Q9KsS9NI;{Tr~<-ckm zjcoNlHQ+=}g!msxW%Y&sk6;Qffd5CX#IM1S{}l>K7La9s{t*c~|1_q=d3*f-WP*ZD zT(|5X1JdY~H@gfK5hKGb2$ngzGA0rgA)5dc1Sx%r5{{7p#h6Udv&*VGS*>&z2x^bB zAn%1Q*H7_>u}M0K-Pv8Tx?xbyd=B__>h|B*L`PX#00lXjT#iEW_iIjB#AeiXWX_he z&8#wY)nrbP^2N5T&fc&Z8RR53?WVuMO+d}J1e)u(4Yf~7tfAhYRVwE<9g5<*zt*(c z(Djx_vW|-wEBB@^qtnzC;~8JK&U|4r}-J}=F1xOxkz4dB2lPOYou%pL+V3h zo|lbkiTHAm+Cr`n#Jew5SV_k&gJ1hj)$0aM4V-#&!xpqfRUb1o+iiHp@JdTb6{=53 zGyE-doeX#cO>IF&HTlcPbf4UC-$4Hp>wn`n>fi4|hyeuT#tZ~R_iy|XbL2>o8ZN9) zW07FsM_uC+q}+93WZz1E#x`~D2_9x&sb8M17JC5SIV&6= zQUPw2`EuxAc^B|ru-TCQ@RXnO-(D*X>Oe4lz;tL*4sV|wlNHfnr|TwHpO>9^flFy4Bua|e9z z7!vc8p&-n{5{mx@K}u4ueB7!GGKF zUaz;h2_3r^VCf|WwkU5id8S`L-O|8nf1;X2=P1c5cmH|8LELvP=&p1`(r$JWp5{?UE)eQz!m~@{L;b7JNJsqSIt}9 zWv`b?n#Hld1cD&@a^I>1?AV|)^o@l1X6ETbh_MjD$_V$7Q1C@{#IYT46SUEbts^qM z<}ihTi(rUB)+ywH^(5n{Fpo0PW!4mb*(QQCZ?F$Dm;;D5AKwrJ89`IZo>`J z->f=zf>jLPuKgGca3#uiHqSAcXQFy`$Uy<1sf<$}@~8l*eAgne8FfG&@6eXISKf!G zC9V}Byv_lIQPo5DU7vTE&Z2GhS04vcER82S+bDW>=R-wpzh9nVAKddHn;b<4*ecRhzbq?5j{8{FIC-jLQ@a^139+?^ho z%vr1zepG$o;=O^7i{IuUL*wW7{(N^Zef!j5E7{#+J{?_jvk$ylwlCss7D~H4|4Qcw z=W8e889Wpu%6S;{r$~<`Jx1cni*&{g3K`Y_m0f!Fg`x%O z{Z4R>K_q*f=6upSK9zY%T}4WVoXNpjr9H3KZ>EKhi(S}kx!EXXOk2TtyXfvW-S4oY zi%~$xtsu+S7;fe`JaKMbCA3Bt5a*Jh^hG}1X8l{9kXxJ>d-LcqW17PT3j0C@A_S#t zTH2)dE)OXiP1MsQ=>aRl93iLa@0J#IC_woE)BE^^u@w`F>j9CsCBdBvlyDrYlo%qx z)S-39jkAG7UTf8X1QeiW#`HaY@$1~me?Vs?PxAI?iXwu3spiXxqO=PYMKlc4eY-6 z%x=JBWVN)vR&{Hb5{5>l<*sA&&-rU3+yTGM;zH`<{4gqZ3Sw@hF)8x6l*u*!I1HeK zz`SknM!mP7SkyA6*+`L8W}V_Vo5%w)iq4c$mdf7P9|;Y-li=}iUovSp)#2@zKVu(} z*`g&{TZEbY8-BkLbBvh*_wjC`94FbdDON7p2*om%sqn;xm%3}EK}4wq8HijJ%B3lA ziv8LB<*%=FlbgjX=`K!m>G;;dR6oEx8X+9qIMC>ceB8&(Xr0>MJY4H=x^B8bSu_L0 zh*R~Eq(gUQdtO%lejyg(Jt?|flmL&`ls)-Jz&sPOsE z4s}Cv@hMn^N*!{2E(d`9^58@7f@I+nmbZ_bN80g`?xsJLjt%-Cc1O~K)Ei(Z^?nWG zKAwMS+#-gK$MXI6F_($b6Gg^76lq?_I~hHY!BxOC1LL8Hi)$@}dM&}8hdnK8Y_m_K zCvO?g65sq-UvxC=Yp_zwZS^g8=GHa#W{rb3J3r2-}ppi+27F zw+)Y)`Etl!cU9$QI3Ig}GbNy4GxX9Ox($2M{-TKDH>A#uC&-i>qa}%5qJvi{yNGzh zN}yCpTin2kx!YDW}!3HjbIofon}@K(umN_Q0$nLv$-SOD~c;!nrG5<39kr9gp`}s!6&qsNFX2 zEmU3V+H~at-Ib^pB~StMY!AV+5+;4+Xj4YLPGqGM#kjcvI*ZNjm>o=>Pwv3>IPa8dSk&`rXr|Pf3 ztvROWz@^)nqjm$<>eN4m*qOb_m+3eU2`7kgv`U=#NX6Aw|p!doO>lIJh9WE864;`J6!59!x@)x*_g>r~)9j3G!3ZjzjEF7yH zdO!5E*g&eFBUIFKw#{BRww+AiUR(LXgK1@Pum|X*X*d8*zla~;H6km(6=){cApc^- z%?%Vk=j?EL=R6qJE<&TQ4cyJ}HAHrexN<Tz|A}TaMMxv!d-P*VuCp zl16_ppj`uWad%46$1CBH+6g16WWLviX5veyS9~2 z8WLxzjT)KfM@bZnQhEqZ{0n?SOC<0Z%2{YGOSEt2QC9H@`83&A?h3f|zv9bSw^|1U z;@}QtDnzj1kYbA(x|VF&%k>jv`2Nr>RP&HOIpmAKi2taUqCk%7Yj^*|-*Kepy(8mf zjm`rO5dJur<0(zlCksvTt^77FZ5eGQZk%1GvvRL(j*A<6ykoClq30hpd&D&fy2ej- z@{$MrLArz@W=|9hA8eEu6dL%Gj+>AyNH0w>(;6r|)3@glRNxDHhQ*aZxL$-JVxF$9 z{F)3MMO1_QLsOuXp6do~0@$x*zBbP)p>+aexb_QJ+D555eVf{&#W!Ko6}l$=McT=q z>}=n(K8oaAd+nW&&NQXZ#?Izs{7C{rjzniF?~(8gTm{prT{SL&IJ(!Lr@lo&57?hr z<(M1JEI-3Jh>&~h4Tswy7UiRXp?8Ng#df2sgVH3SPfchIc>MYEo_1IGkcoe$!!82w z8^0_CA@FV8ji%H?w?nN)4={(4H6Xu3V7BE)AbCv)7*IAt`Foa)KVfYzswPt;52!RT zsg5|TEad;=ug_b`$t4rtSs^}i_zjk-gY^5TfdEY+Y`4MmN#0Ap-pLhhO~vC+o6&(k zEiCQ9M7+ZnE{}SiHKkcPyeMrH z-z4-q{)eB2ZoI_~JYt?$f>KlTz|44TV30TgIB=@C!MkHk%0ha%=C#iCfutR1$iP<9 zMi#E0eOHnuSIIeTXI;^FHcU_KC8BGN4BslUHj`)15THULH7VOtq+&uAA+87@#3LI6 zU`r<7@{m(<7^5p*cp_2vAigAU!rqz_Lq{|lW)Tsdl!RawQtXtrKsy=u5s$tAGrXoq zN~JZK@wk~!tbK7C*fQXemTazOZwGm{W@1{|616c5^Q-Xv0@lv_b^Z5rU_6fY1ie?3 zR&G8ROb1Cb+EQXhW2h1orc4B&3^To%xEe;Vd;gL_#b~ZlL7#n)kvOeV%EccmJDb6Y#RKQ!XiqR`Py)(T+)2{#|jQwbquJb3ZEkHlM;Ir{{1wMO+ zpR1@4t{&=amxdMQ!h5lmL%&iycukZ6(w6%cR6M$4HH-Xpicp6pv0@IAV|%0=F2LELBCFkfYz9ma1?lrFlUzb)7z5>ku7Bj{PtUL?o($?-1lya$Z|*BHitnLOK0BxKE?+rKMRP zGa4->&%{6*L^H@`+cpT`Q$Jc#rEIFa{`%1IrJPR#OO#l&;IBc1(_QJ%bM4-}T{~4b z^Kh!Eg?PR)MQNs51(yLBRBkGCsuMQnu$Gh$l^N3+?#AVUO~g=L4CaQiUl261QMDA6 z`B(5aG+OEv?L3(xGOXydp%cuZe0iz!+M)R&Lh`0<{s}6eL$JsYQeuA!;Xa)tn@ah& z4JOaQW>mhD&q$wZBYGwXW`d`Dxt(d5QAK+dcc{_|(8y9Pe+@fY5$On!C z%X{Wc`dxfIswSD6qQ6P6%}}4c#j)X;Dy2==V`vnm|xb74ixM z<|@FdXyTShol(>uvaWzAfwvW=$9YaoOyPqO1eSBRQ8tj{3Eya;8|Qc`%Y0Yqk31fB+*6jEcLUZJ!uT{H&unM)9FGk$OfQwkhu>RoPjh>(0H?4{yGE3Zd{_~PkXWa-s1 zG*l##)R}Wfzg`9=P$P?yhtp4dnyM7B--B`h;6b7?y?sX=WM5b__Nf}OVzV+*rBp^) zV~!^&ifa>Di-)epk_t&gs$)Qtgd*rl$*gZMs7G94aqJeQ`g#YFk<|ecYxjJLa4S;l zCv8P18&O>b-_1V|$M@>08qb1Z&TD8&0@PKTidBbm%R9wqPC)wkNun!?psTG{!u$C-xb^?r!ln(Ozf2AR&TI*;Je?LSY?Mh}e%=g*lwkAHbYKxTqCtJ*7W3tBIEW#Lf z2HvTT4jx4@W7Me$n-XnmBUvKoz`sP_1gk;*S~*ID*PW;AJtL5#_wdkFsPmg$-^1Ai z39j8Wr;`xnAHop`e&hn(fwS}iuuhU=e$OAFRu20QyYPK#X5~%saEnlLhhw`w`(fP- znU<PV2o!~@(g#{`SVyDE5UA!_7{n333 z->{&;l6JAKpW_WavBnhk6v2+WGN1Ec1CeVW{rwOq677!=v2It60yf43$Z9YQE+9GP zngY7dpU2zp)<*82+UKif)02=a@Kwqd0C|KI{Dop8G5-dKM?iKUnUZCnL9DZ0LMfFD zH(%TK=dQ8~Z!xQ2c8YBV10vY!UN>ef05MywFx_mm{L%i;tm~}v#pI??=!QpbW>{ah zoVDDs%PfH;z!rBh5p&WT&?PMgPsL7nEfSTkdHY~>xaVL;Sl^z4{TqbcbMdI|Vl1L+ zsUQ!r5LwE#+%@3v{A8qlyp;Z%e8ZqqHkADYODYwiT#^^|S`aFXQHclc82%m2TOy5I z?^NnI`&IyAujX#%17gU9LD`iJK<~D_#X5GqqyZ0uVY26(c3fBl7%v&D;;AUhUO3V6 zE=b>>aADP4e^C$WBqEOZAmNrH40Kh$SuwUu3=ymPRc{bjO-LXm`DPDY2vt6 zcjN(*GXIdl^AQKs zIYvy7-j_;T+8CA#7z%AFsVBP-nB4!+sH1q#pc#Ag1SUy>3iMYM1NYjC;ej<^Y-*UJ zl`C+taAp=(DiD<%v6@zz2zSyj^ir7xF%6A%TYBnHU{8%rnWY1my>%y-{=ok4q#Zt|n(YMCKY^vr7bGL-ELZ&N<)Z4)|;(MZv~8{9tzsqGt>x)&#@LoV#U``j(<3aaGB;J)I!38ZL=7 zaETmY`b-fRh1*NGCIef9Q32Iq?F~C71MnP9?Cca(jqUAR=lWYkr>pPp;0`+$K3F>UkIHIY z%=vZn;IM}RhU=@HHGut2?~g%rvnFf$t!U=GZY9KIohCZ8Zfh>~tta$XS)mzq;G2W9 z2gA}F#b=G)<%>Vh(IcCBgd40_XEdp8Nc9aeX!$chVuqB!x?@mmMK)It!C*^IuBvx$;+$^KO=Hhb1BS?(`1p&( z!mSTq?1m1$4No=5XpkTpc*O5M7#|P#6*z zGDv)d?IP2wF?n{TCdaE?e8y>h5e1-=_xEPEd<&6DTI3$dpt?WUltUw`kr40Iq$|ov zkJl39k~u`Tcuj=`VN9e5^1eiBC}u~E^b%&8GAZ)I=1Dk?Jhtf>`jbir8jPRyF56&O zb;XmQ?6eKJLegbEG16q5Q(pQ43KDBfJc5}BYvp% z>KVB?-(T}~N7SZi|eQL+Gw@v6ZxcW)c@=20>NDzSNeg}SCoY6`!O z*0;CK+nSB z+hInOhg=Rbbm4^{N-+iwy>x$`T10t31`YF)60PG4FC*Up?&u@vHdELp6Zc|al}!$6 zejmpYtm*hglmtBn4&L(ewCnd35hq=?dFWyN^HDV@b7H~q9BxAXn=qidoZgc1=U&45 z14QE@ibm{1`6_xz@itczW)6}W6-}Rk;8JL&IjxgsW%FpIZ>FbG_Pj0)W{TSvRYqkU zmP3?9%&y3!AL$yXRtc4azZo2iwy?Z?@V&s&WQEQskTh&|m$bnN+W{%oH*lr1Kw6Io z_BNdY!Fy)`V{G@ni5f5??Ad7#WC>j&zgKSq2Ygrlttlo<$&86JTUn%QNt$g7lx9<* zbVp!RC~IuiKSiGn8Won7D=jh>&1{)Ha+DCk=ZltUwW>XO+`T`AVRTE(GWloE(fOgl z2nfdLMqe=h7FImD8kV6AO19n?JCIt>N~R!96D!VL^sB)F+83a4zLkGOQfdo;ms*PN zoi1TU#Q}eLie&J30EgAGc@6H`Q-Cs&w0=K_6wxpe%O~0hJ;x;013Hz_%nA>90#4OO zjhcZcjz7G>i2IV=oK5u@@jJWB@4-K&qVxl61U(L*BJ@WKXMB7&L&HyfZb{OqSFIFm z{-xWZj}%iH(+YUySF+4vwZf|VE6<~~&%*=^v1TejIBU;KvxOyR96V>9fbBI3S4VL( zOyYoj-?*>^M4JipCBp2l=`RI}<$iroW!q6VR-&dvk&)-e4FpQ-2POW%YutZZ8JaWA z@s)(igeXTuUO)!HHsJqSD&zz$?psE1K>_p>s3ERN%LG8E!qD_yTq;`oi8Fttkf|U@ zs2$5~Qtz#VueOP_SB`e+k@4=$R6WbKcz8^~N-0)llBP&Q=wbuHp76_ON4WGZVrs(JD-bc$yYR~ugW))4<3P{v7fwbpPvMBSU)Po9eX$t2 zRYe^U0s)xV3#Xg?VZV&wVn#*y{_2|UTVUWH>zETmy2}D@iXF-ygGWne+yI4G@Dntq zvMg@{1_S-<u3z4WcSEH35YT|yqBZz<3Pe+(eM#%tdAL>H>UqF}5%Kl`W3Y3xSU zM)k;*4MdkKx~1r(D5WE=hjig?hy}7YKSU$<4;dOF0KZ2t#RCW0c%ve_h6=iKCP? zImSM8PUZ_H1EtiX{Tb;ifZ$xw9k3}B!w6XVDd}Y~;KEYhEjG!I0=moda(k0g>EH1Y zRzAz^I;lFyhMv3~^m+ZFwdHsnFCvTct^s8aF}$6_k?JLDw(AKjwS2&?c@|WVR-#U- zB6+Q?KftfBr~4{PRarF%b1d@m_BmwIHo-uw{5BA-iU0FQ2qIOs+$F>tGgvD{wjJK^RYmV+n%VPf`Gw9xm1eZch@|1s1A%7;qIG6oP}Z zIET@mPpGzr>)6l#XL#s$?~!Ot9JiO#WmAJaNt|bqfjx+0JJYEF_q3h+co29LSlmn& z2_;TGny3fIrrhnqpNl2reWt#v_nA;@1935PCDUk8%A+st)40C2cYDp;nTjb$MvLuJ z>HJCJ*Cjd3JzO{G|I$iycgO&yPegTe2UbXoa>ND>O)Pb^{pIWK%ps}R;x(p!Ae&)a zm?$Uf`<3|Hi3#L;E>Xvc72pLY21m|K40JK@v+Ky8QST-?^CK$X)l|@14Prk#Ix^eY z_q2$0Q)@mdu&9fWwMAFdCRqMveKNuA&dVE z1VTe$BajD%lI)6m$e+x9rq)UvR#mbotUyaZMAJETZN?jh)>j;f0Q?QVj6^FEcbZ9@ z2&y&L0`bx2#Kx)*ZanoICZb(Y=z`n_eI%)oI7euPLlpO4!u-ohq~E@(?%2yHWiat| zqvOKQS%4Z=^*g(L8FSK#?+Vn}kmIG0;6#J{>`&CtQjfD|GFv|CKHJ<35zM4tB6Eod+j z;9>d&BM&DbL2;bqE!wm37U=*nPh7o_^c?SG8-`KLSuPVEfzirxogmT8g1n*@n+D&< zCDrF!h*C@cvH91Wkouc{uh21fwa-}ut$bV21;R5U=!vtK3cwxjEw8MrNUA|pNOPQA z?WnZtJ>5u*ksORYpt2nnBCP)q)wGWvGoOma+jE>dF>f|yhaObjd`hLmsu?$|&1Gw; zW>K6**ACt4aBTa|OXegtmrlZBMc=3;z z(U95Bu}*4E*ap8^pv#ssXjaq8dnr^*CKWeT@njkO0jSp

-qfVe666s{qD)70ngt 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

a#OON2C5~d_?doAuvSM*%e6W71b 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�U6b=2i* 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 Qi&(z@GdahM{1>0B$O z{My87a7z_Ia0Vo7_amO+wb16CSn^X&p|B06`mki3+_LW$gj zM^TpC#*x~Sxh=^{`{11W3k|2RF{I#hbWaQ4#DnpOr#GxPt)41TFJlmvs0$0`rNvI>hfS(cNJS4(ApXtOBec79Eei!!EXjRX0OQPsmY5SMzIH1x_!#<@}zuHf;PW9Bk3!PLEcSCvXX$-OP1)Tc_x=BZ5 z{fEk_7jN2)C4?FG)KJYY38bUJLe^j5lCc)+R3zusfO#(DrO_Y2kQfUjRSdfDvF$=2 zM5N9$dh3}YH@+rXx?Rb0kn!Hl^lN9UZ<7F%hwO~=E{y5ZnjJZ?(C7;=%Oe;C! zk?V_7wVqe1E@0HHjRil88qKf$8}MGvshs;LjA?g_rA@8`HYj+ ziti>>>5bW^U$xY_A{dmvMxgKO))hjSf}s znfw4Dk$rpk+O-KM51<#?tMH+O9dHB&KJQP$J&3NMdu=wBLhcF<)||kHJ%-2xb5<{ucaQpx z`#w|#;(JeM0V_zxZ{C)?(xBIbFsFCx@H{oeX+D$9oz^T<(gl=vxj^}NjxPM#>2O>$ z@W9Ns2jCP67ZNjIN^G?V|D?x8=^{7484IPO@WmztwO`kO_)~z;AmNsey+LGt=m8j+ zMTC(EXhrYkqQW*+&Oa*RE+mNRMUhIihyyEBZWmNs{vH^d5}ns1+b>lb=NHeoRv*%Y z36!Cj;S!ZFUT%G+hBY?D^Yp_q4@cKxBD;wN1yJ6H1{@7CUJ+b*8Vx-o-UksE_-S@G zw(n(c+xfjC z3Q(ju^!30T`)AIv6F`aCcNdXhlF5(M_IaDRo+EsKZ}^fQy+4Dnn}YRPAtYamM9BNt zR3)r866+Rvsm|wY@lrkc=q;F4Sbg*12cJt5=0?xv#tBV6)$f~cvGWuKtUVZ3^o^Y+|f!gPl?3=9LLr*@q?j9LzCA12H>;h zW=DVfdv#w?@ns}AI4;2Za%E~iz9-}Np{RW&=}kV+Z0F#LY8-?N(Qxk2geXn{dVI>vCO5-K<{TQ#0!E;UOxh<0@U41O&~h9HI1{ zZ=`bKZ1$YAJNoKs|m9f`48iNEUnbmqgeo~K(wUzUa6omm?#;hHt_2RWTI zD`m1b=3d{O^i7pV4sQAJr^l{$JvpN68ApWwDzRyv+iuh_D#*hdRvBs#@y&24R)#VyU3uduwf ztDCbSEL}43J6Gy9t1( zJW7BP8IIR%lF=_%vEw|sl`T3{X;<61TjOuZhPiZBHqDc}*)CgY7R%yQDi^UMmFrt$ z@mSVqv#XGD=-IMgG&P%5b68cvcj_2au0O@XJGJF>EW27gTeTX^1KeUbwCTg<)GIA( zJLo6xz{HWd;>3vnqWAE@oQTHFl-ZcUkt0ktjUb66i71IIiQHrlQW*YxzL3zRY>JLs ziJ;pudwk_;X@I(N<4|N;L72Le#cT7;iLNn zW1BQBgW6<-ruF1708}hnGm3!(2>LV4_Z*jWZdD2x2j{+NMYQxvgl$G5%B_bd)6g2>yuUIE-+gXlpu%RsSsDYs5Z&_W^o|lL(dsMkvH# zK_P8W>R>O<8HB2NsKDQJK}8%5h6e=LzucfXJRH8G3@Nb$08k2_Un@@zmG=@=xA_xJ zEd|Ey3a6u*-yN`Gtq|>7vHuO;7U}C0P;yL6OIw+RxV92^m%K zMve^+;1pm^g)Fumo3YRhFu|f5ehiBZ(cWAA5!%y#&UfL@c3e+!qKnIz{X5F4+P01Y zBq3_zac3Mt_$ymjAsdl2N_-ELal=f*VMI+}utg+NOO0+28RreT2)VJ#AH_IAhb?UZ ztdsLs7Dqi-#o-zxH54Z;DYc+nw7exQEQawnKy?=^I?HupZ_pguXU0Wf;-6yygpyXO z=FSU#<{PAysi}gzu0*`9l-yB&Lg-@mz0%g|IF)B1T8p~T?1{UE_*v{R!~)E>d})sM zIVEgg^sLK)ihPUoN%K|p^&I4t4;xMzEH53nmQ4N-F{E}UuBiymL+nl|Q_A6SVf)|d za(`K3SYylc@AWcZ(KK6=vW$-U-Gq^)Um1JfeFPM%tm<9i2qL7LpxfRiaqMs4p>q7e zAJt?h4o-2#^MlSiz>ln%gS6ug-d$K|wUH;oo^w0>khLo-urn7mMN?GpMe(ULSCHX` zsP%{wz~T`ep!wwcdPMsOe?_P*eZz~20c2v2M>$i<$C`#ak`oCs4isEY1nOvQF{k?} zvLL~TCACI`TO7z{12<6~JGU(rs8C{G1NA=T{V>`M=gN+SMq`;&VSGc6lb5ygx&Q(R zhCXj(kCX6w&12t_J)sBxrx7y3X?(r(!&l_vSXPIs1()yPoB7@@m^~CCG%k=SKo*)x zG8*y36XOE`-Uo#;VbD!`_URe@b$6;4$#@_kwL+xWpy8T9;5Q19env8oG!GchvSjQ< z&<(T+4-jE;XLvR%PehG^45D~V3d*Vs^uWdD?y!u%dTuf$c_JXtOsmeWOq|`%4iOS5 ztDHbMfWKKBpA-e05m{>y2I>z1;PQsqy2-cHox4hIa#KSs@>SZ5K@px%ruGR~Z0)Jq zkhc09_@o_MpJ^cR%J28%#o`Vy*16VQZkE}bfX4!poVkF;jb{x(Z23Vu0Xe5j6jBai z$OQYw^X{}cA0(u=QEm|<>TJX}s4B{CS&<^J<4T3ywKCOn5Nl*VF;9mDfQt5)#;ywN z4+a-CXZyWbTV1K*%r2Sh^<+NEL z7d+^)FWn11?Oa$uZ|!1VKWb*K<(T_1_`7Q&45s?i2b_$xwUyI&ec*sDV<6!iP!|p8 zDv7Gt%5a(q71;*iye7E|VAYulOwknc0Y5xDWbu%CsQi8lA=e3wnt{Kp&*M5em$pM$ zPOA;!<&Ok1Ym@4!2LWH(xG8&o%nK2BaOcHxKK2lLg=+`STD*G11lFBej0fT1nLXi zXHdeUZBP1uC6JL~n~N!DXk{_Efn}65p}^ruWKQG>OWO++p1mC*J~nVHG}DAs0^$(Z z)luAHE$BBci_Jd28aQ zQo=IJezG?ng`KZ4%vlifnAilxZGrs$(6{P=p`1*v{C>Baqaitb7Ku(>G0WiC*x`-2 zz)Xe9WFF8!Z2!A~^|@Y;ZMt?eRq$#&lLDKkbo`tP`+?03fIsdn#guqYmU+T0JvQRQ z!yxbM92O`rjZMDA6>*b}Z5)F2jWO7eOg$(-=AqF0qcl1DHF6`kynsE^yR;9REh0f< zur#5aTC2jHW)klnpD)iMSF%O}lgUdBk5zirWwJMJnRq#s=c18how*fxPmS9sTY4vV ztY1}vu2f|w>EMbpygAtSOLnxv*a(Yw7aWi!WGIvngZ~ptGAFAUFqZlH z|4ID*bGjGTR?{?$X&ElnpC@94mn~- zWcJ0xV2qPEL=uFf=`xrXm&hgD$Gf;;sv>IPav!NYf=YG2E%*ig^|t5*s^v$6Jw!cB z?BPsqS}CW(c@augc>zyx0Zkw_uycN`=IJ`NWGVOcueJ$;rV;Zm! z(*<8UkBK`>1+&H3r>cfJ+GuPA`Fz}h&{H1R&}~w98Yuda_)5dzNkYIRHFOr!vgwP zxoUsedh*Oj;JF*F@a+;O&e7v^NIMskWCN%{IRQmP98S7BvI%xNs} zj~pYH4YGK>f%pBKr~IV{2Xqbju~W~_Iq{mb71wwx#WNa}g!EhwO!D3E#CA&>JCcTu zS3y+G&n1kNC*+a{_`It1@cnA+)9nj`H#h`FXTImPU`d=0#G^Gf6``WezX4Q)fK;oO z&z*-XaI%5$qxPs930Y%86vauue>09_vQ@@tP`vi!vcvSf%#Pc)NSXWR#;Crc=gY0dH0CQlhyBSlhJ9@K1;7LT!m# zdg^0^Wt^mRz!j*Z1*m8@<^!nIFc4&Tqr*Ipg;%S|Jvpw@E>5_$^BcFc(LD)``iR4l zJ8q4c%wGqI<1#wEejaa;tZX}%R0v#$X`rGoIMU`~V}MC!w{7W$BQ+%}*<5fRnEKee z^GmKgg%8UrPP&P9y1LWCkT*95$8N-ovI)1i+Pp_QA677Ko?3ub`vC%|p7xc6{q%4} zGq*}?{jV>#QuV}5((rHn-g*`DJbFd+8=uc(?f!E-ti2HDB6a19O%87N7 zAuJTAEGoAd2`6g{Co&rCFu+S?#v#IKSe~FdwU`6pEW-aTt?iPVm$3 z38p}V^RJ+ymy_)GcmN$=#DP4~*n$qP!hPJbIW~EWee@6jsp7r5;_MdXbK&HnE*?~B zr47$)fpKoZK%u*X!G>pR!HKsp5wgVx7_&lKHQfY9qL>sMh_qLM+(w(4z0TA$GruVx zWCFGMRSC)EBV^6nc7&bPv-yz_1;L^oR4mxP_ViwabqKkyx3 zo8<@=6;{_O>Ab|Ac}^p+T^^3zYGsQMfq9^GieI%TSezMd&4J{|z0*|!{vH0DA>iXW zd2_h~E@nO@(HggwCZpO$F*cS4!azY++RCCz<|}Q=OB6u&v?i(-3G*<~903qDG3Vm= zCYQ!XtnmcwkpOfcfGEgUTwM)@RZM0+ph7ca?i(i=c0>d1FjE}VrW&J?$!whY)OdbZ zr?D$)^~(fk?D&4HsMwtphVX%EOA&>l5g$R8z`<+xHe_r~YIBjyOBrXdazbZ$9r(o# z@zVz2&G|QHQ!}xKV&fG(Zc)siYnKzraM{T3*x0}H1MnR`TV*qpb+t|YMN^=5E}PA0 zAl3(Qg6(M6?9MCecKZ$vh2V+gCOX4`pEvD6%flxxtf0azmMLjJ4oB`@Z-cbdMJ2uH zjER|>GoDbW1=1qgCL2TUylaUJF#`b`bZLtBsf{HU^DhBn?Dl0Zw;1a1!*JQdkB%~MK?8@L4WX= zhl8i^FPOsJb5d2)7ag|8I&ed)C`vIiMPN%Meej3YO{c zG_y0%1>IxFI9c{-$g9*tf;&-e21M~ssnXtcOF**35zbwbRpc3mU!>ymXS}S}uC_m1 z+#MagYetxiGtchETEf|)?e7;f0dvopV4$}x%u9Kb!qtSVb9pOjSMWv{lpNt&+RTOG zi%1FUcvq&As(ueWZm%bj`>YMPNAL-2I+ec$W7+q~&eV#)C@MXop6|)`F69Pn`Fx;% z&;iAK_}5aN#~??-uAs^0xw4)ZO1a$CIyhR5`J-qNNVyu=A#rbbRUp&Vq{tu{>mlsI zg^iN5ir-3WU$Vb=KvBTX8$JaW!O!292;mBnb<86Ec;$gK?pOU_8+_&2e>?Xe3rdI) z?UT)sS%$}O>r~~8Vt~kk1f+8xLES-cWC7NQM8k2N5tvl4F-vfO4aQiO&_1d0*xlg` z9wEMkI~`@<6H&neRkku~FQ0up?TsEdINa+zB^8uxAL06jJEi2q+cl6vXiow<#aGX8 zq6xa4kn<~>Tbm&VM6xuyp+75tpFU?4me(}xW(OX!QWYfL;`vlP4ei!_^+rxhVyL=L zR;~74e%>i+EJS{50B`ovYd#eORzmrIW5)k^q;xzS9(AT!`$EV7H0>Ke=IPSrJD%nP#H^xBXXz{r8%0w|$BIH~HV;$Cgo@=7;tDxLe+~4vLy#wtIMP3YVz+ z?(J_&SZq7_|NMzvW&57Q3rd%RVHu^MjSYixkrOfN3Gv*Ke8`Jb8uzDdDJHr@Z?|_r zi~~^@FR8OWkQ7F*!MJs1`#N0@Da^!M2h*$aJI8u|_pep~L+(8+Hvh~<^xfwp#^cA0 zkTMaf;#wVyOOtW}#(+AwB5@-N4!wsn75^Dij#;OE%jAVS@8Ek!CL2rIL1Os7luc#i z4pYgQC*DQKNwtNTgK`Rz&H~umAD4fxZ~tB^x&hdNXE*-Zr<+75Ar;5CCC|X3-%=HP zQKnsN1>5BZ^RLIv1QF^mzdeQ+&3rg{zA6tTq{_|b07FUr(2oN zj8=-;uSz^TBBo8&FURymtWn1?l zAY3Lv6W7GUx9-KPwow=RaOg|mr(QsU-h|+EqW#{GNG~D&)z4yi!|)FvNTeCYYXF{K zUUA|{&=S$YTkP1NnzU4>lDggK2}U!)BGTMV-9tBSE+qE74HReQ4Ilo;50vB|IO>xf zFq={X!d}GcT=)pAAV2J(R4)ME_vUy%uWv;YBXVjOV_{d$!`oWl^mMm?{$e|*fgJ?WOrvyW<=))qUX?bxb5-)!g+3_f?C31ER;s zDVUK`VvKluzBeDWGP~tg`w0Pzgot)(3i?wa$?(aKAXM{G;KIw1_f*s9pe`vC4Vf2! zjb({1^&D$5RgOR*Q&J+;X;(ef?dk_|`s!!Tktoei9N~50&RCN(RaJGmg^7?wMwM%W z&5@-rt@iepr-{lDCs@CKJi+=uo*;2JU~`=1Bl%fcx|Hm>>RIfM>UE+z78^ zxRS8z{qAe`yNr}MCsvhW5Ib$yMb*6+nG1g=?hu{nnK^gwo|%hAGOCW zQ8D~urIBxe_?9#7Mt{RAv=T3Lrk$oQd;Jy=P7rI9i33~4hUpN92+vjUf(Z}c@-22z zoC<+tBe_ZYTcFhuMv=|s!MLph;gJ0cc7`f@Zb7GQ)|<$3a)nd~dI{d&WRfq*ljTIPbbeLBts5x$`!p?tl%TGYF zW$dMy9k1EUU=()OoYBatg;N1A$_{E{BfaWd`vd++$|X}N;IY2YvIGPZ#5MVla*VMr zj+!|ujwMgh?@o1)ZKa&jKSSbS^?xaXkfzxpr7yx?uGkDEoDjpfp_Nqbj1YYX6Dn@H2`J0fFo|)>u8?GwrFzm zZ1=Rvl-;bws>4OF!HE z7S(DUW2Z8wa$6(^XvkC9Op+aQjuPtWZ^_bv+V?`dQpm*-NO$E4F7)v+y}Urei`}Ei z04MN4p~SS`{)G-a0gp<{mO#3tg9Cx*zyD~PxJDTj0q#Vcx!NmQmT)N&a_3gawFE%P zKib~3ln(m7%A^n1m-D{H;|F(mOAWDY1N}M1`61g+P)OcU(m@UL2uQ1eSfNaze0tIw zo2dQ>-3c&biYN^k>I{7Lv`fgc@D{9o`DE=PJ$#4pFJP|~@!-D~{BM9@99YJN;$P~{ z!bo%Qg&<4I4TeAk7}#%)A)ly_i7Pi;esc3F)N1Ho*HAv;jh}({zh-u^Nf^B# zfX@dOw$nx+{EW#iNW;NUouj=htqMH#`#oZwLY^863K70)=L_|S5N6KMkxw{f>-t+O zH}T`(DYG^3M_x_>z}?uXNd4*!^Y(Y~9rgD@C9fz=VrK2~76b zjNfYA9p(R43s$&G5o%r%YGk|9d#VhuTMi$xqJ&sh8261(ulQCinp z1~{33A)EREw%U7}uk>34yY|_UAm|C>_97D3(i9Dq5$CT&R{cmkp`(#-oid zIMBbH`(8(f>L`0)y;<&y7aZ6(9x4wJ^4zGCjWg|`FdS#caXYd|^5KXx7nNdWcI#ny zw7M@MAA}K{xA;)TcK4j{a839ek`HQtM|r!ABC)ywcuK$2f@~wDJm8Z|(Cpnh5dfF? zZX^Pyu@=4F=Eh$KGw<$#`ak8M22q}XV+Tq@XfgoD2CSsz?_Z2eI{N8NoUkF#Fc>3D zM>aTdDj0?4HZ49Lwq{G5QN$sZ925+Y%shtApJ>)*Y&6dxq?5#0a5>Wg&WXv5THzj8 zcSCLfBl+rXs{51BGG^LKiVae`P-PW_EoT&Wi!fwF2JEwFiSML=VKL0nm)OWDgYf;f z2zO0QZ3or)Ek#jG^ao&bzhB0GP|vdiVq#I#0&yUVcfO6~ zxQh|fRPsb6ram)xI7Wen0nPzsp=Xgi$CP1!*b`oF0a{n2c-F?%sKxwM)|~hO=f3Q^ z)r)ZGmYX9ObH7ZDzQO7oS~+7UjXEx8q=@8rIi6I-!(S0n(&R~~N1Cxa6NkXqlh|uE z?3MRVVv~o)D1pT$Y9O}kq@anX<$C=$&2qq&CTj6d#f}XQksD?W>2#(Gepl&AZ=o&# zIe`?vW$aa84*#Xh3)V<~-GW$!~=HADQ8v{A|Ky z{@1hl-o}O2WRt4XkEZDdoIsqN3mGk6m)yFuP&P@%C{Ex>E-qh^9^U2$dlWNmmkyVhV2hJaN8hb);^rnYFpG5gbnBpP*NPT;T%wJB=xj8i!j z`pAO>Vr)`tb4aLxyLn3L76w?w4_%s0&! zc5bdqauqwh(cI?lx|w`^KJH#PE@L|NIIvuj!aGGL7KK|aP`3kc-6RxWNx(iR2n0~$ zinfyB3;TCiv<4JkTjW+ua@e4@?&qu1o&#qd!Q0Q<5A?!x0=!|(xj>lXN31B~*tzsk z@Va9h(GjS|n~XiHf?{uD}GOZDp9z^on|bJMDp~Z0#{2I;k6CR z?5`GHJjVT%+GgKD2=-V3CNlaC6eqCGm6Nz9?hd7}yHqrq=*n;Ms&ud+<$YZsZKO1> zRWrTdgsC(n$A3JwQw4l;Qq>Pv{$Lm)>$uK$!W7r3-VHBMK!rBN0{r*CRGJ)CtOWPt z@Dy%-1NVfGud9ZGnA*lyD*ej>4HBt!eY7kIKaP*jldwK071g$Yoz79$a2Lg0Tb;ju z1u98|!j!OsK-Cl19V6dK+)E^ zL}*Xc2H%?(_eX)G7e2-VnWi)bz1gf9VCL!xte|i4ml6#Q3uw_89?pe&hBFsJOvPW~ zhBHy9$2M~5jmj+MksRwl-XCy)%fnVX$H5Gq^PK*kyxar@ z3~+%gRXiB1{G`$YT{QRh^dBDg&^n3vN7Ts^ci3HN zOTzI)oQIlg(_WUQ{ZWSIt^Z=_lvawom$%m+n^X+wbC_GgLyc)bt-zk~ILhwuqw16u z-+Y!HsexC#yG#9>aVmuxNPAjkz288S+i5iW@{mUov$vKd*LoNcOdXVC;RS+vG?qfs zB4F&MH@#N(M_5@>aA=3`ckl%Sg_M3E+1cR;XwE0!^wJDsAkYD@+)KXpQohx# z;{GbT7RTM5gb!xNFS&;+R;3_{XUCw=wbqgM-A-rodtdlnjzI8gRM5%9_0au2IOQ!c zJ0U{&7?**?mH`}e8{+GX5bt#+X`!LEWAy~dVWoP+FqLwZO)kO&v`hI%wP@OAA;K{! z5Kqom*=yFSzBO#qs}_J>X_W(RUYy1`V_U3pBPd()XI)|}cU_q*t3RH|<`o2OWznNl zchOIunzxIM?@Wbs;W}{{lbdoLX=xf0y$Adj>Az9`^d*MtFPZ(UFC1WpI=MZChUuAmJ!?Pf%1 zs*GquX{k(13{~mQ;M`fD4M%JHQ4RAddXl9R2JVJ8riX|`>L?m|77#vH4K8Lt?=W6fMfDElf=zB;N^CdgV6aeh(fws1*m)`#`%`Nh@P=vC z<<_Po*w)0Tvmpa_b9p)?a*kW-+9h|xg>$d*hIz}QyZ;`np^7uB+1>!>BLnMVq_ zN991&0f@+!U_>F5c)S?5M%j6Y2%55#YC%rrT{S@LDj^~hXqKA7)Q{*1XMA3&>#F_C6Q;)FPkgeFVBSTSW5{f4$qa6OBeSpj`YLQ7 zkA6at+wX+|Sah~8^vl1=nSWvJLDiC$06mdwnpLN5kH$ij*9o3%TA4>)cL zd+FuB;5ol-9%lEVn0TO1M#~-^+7_D@e)9ncm}lU#ExG&+dmOTt9`~+C213v#)J#%N z<|tA&%-pmS;;q6fDneha(#R2hb5=8mT4?JCw>I%f`Zu*WC8;<&4tom!lcyFQ`1AKa zMmLLVALfUZgaDacIGkunU1dEKJ5yH*L=PBu-uZyBaeC~B$*C;Ha20U@$7kmjs}%!o z)Fn(!u`Lo+z@^5C|fgEkDMzV=@Em^6kezHm8H@^~B0n z(3Oz%L?pjk{oP%4*lek5kCkP|gc@p1co$HK_`#Q+j6DGNuaAAmxgVqqGZxJM2=i|$ z1ee9>{XCjfyykup_-o$%wwwK;2*^+jN2O`%=%s|NxG5b6H)tLw{3k39k* zkAA^lBhS~rL!7R#msvGO6*^YV=^;jW&U6PvK&A40eVb5kzsam@nwDX2)=U34e=<5* z_I@r4HN`ntyixw`W&{g4^j5MoH8uQ_<(^0emI$gp0q9ruF1)vRk1C}p9;GRut$=KP zb~yt20Of}4xKHXa;7(-Nuh5=05tOBi_=ZHL&le&>Mg-!xNn~Cf{ax*k%9C{pM#rBa z|BccHvE>ewSqgS#MH*>z5B9b+le*OD;`i2#;@qXO7;O3qI5_P!WsVeBbguT+#iwF~ zXN-dw9~%nSGi%e|KsWfeFQBi0zscVqzk$oRx>M7`i6Xe?;}HBi!5cSzdpqDOMb0g> zo}19K)%6z1^@W`w44J`KaVAPMNW}CSgX_5=E_GcGofxqN2aVGKH;Y0^o>a4iW`Jkh zgXryFk4$&jecGer31l4B@DapsT_ftv_wGRRVuQL=P0h%3ZO;}Y2X?XpXy0m_Y{lVF zs!_!p`I2`F5!NC>9X*Oy1cHkKvW(AeaT>u#4?zVRVEipwfMZZa$JfcaGUlymuSE+rwSPZI zga&Zdzl8*U*detC-Vp6UaJ<8j5_=ZteDYtKpZX4b>Km*bIbsbm3b~EkM+Z~OkT9$w zxxr6KSa2-I`nvtTNQcm!v7e1k+Zj04vuP0O>TTDl zWz|Z^zi-O)Eu{`G-@I*?S~mp+3|lwlkX;~mJy**!GrtD!q%iJiamXDzrTA&At3t2n zK@dd5D+~L*ZnNAF+24pftrlK1Rl731J@@;8hk1Q&i}D!HtLwe@1`-OLhu1}{Q7XIfd@tOrC%mK!cHTI;F?oLDJ?9o1g3YpN@GtgzGm=b7F@>74@p17! ztHyxs)ji80uivksg&Fl3nms9NJ=HzcZ3$dGQEbP#-b+0~aqJuUGu|;gQ(Sf|7j3R) zxx~HlPifk-UqrsoN=IELwXmt7Hc*6Kna__CaI7;lyc9QBvn6A&91%|aJ2_s`5?a|W zgo4|y0dNx+!G?Zaj8og=dG zz`BU-7>vSxiOhGF@-B7JmjJ@IVv1-9QEdfM#A{Qp`laN&+*pLa{&so#=s4zT9gCye26G`DCt` zciC6%5!8 zTc0Hr`ROjrUJ5O#D81UEohE3WiZO8>Dk*uudq9c@=P4y<4-%gyn-q&cjl$ef8Jh^V zg`*D$NWps0R!ZoV6HWxRd}-#<`AbAJlSxJ|-Q3HscZt%XCan*)YT@8xfZ>TXc|dBO zAHF;WMLynv%vHm$(-c&q_7Pxc6S?B~A)>;&AKIp6HF}L*_^x*a_oeXhu;?kPGJ&z| z-t4^rmQs3nW%0l<$9vK$cJf)IE#jpun<}x+P`$vAv(W9p02FBO&>$V7!Se%o`YGkP zCCxl1m;VK8(TdrW+9q1v;0a0c3JXN!pT+-q%dbml($RJaltP{4*#US^d#9OJSXfSs z78sZ8-kz9!8}sVgazT6HhrdbS38<0zggxLLZSIJAZ{viTE3;$ zta??gHws_!Ojjg6l`G@XTC5k9W|Z1<*PSMQUl`kMMMts6 znb*ISs(NFMf_eFpZ4SU=`a7k?cidXMdJNI_mSa12zo`SIitP{5(+L9GQ#7ET)^Jk| z8?%!t-9vd2K=PByf@Jghj-h6U6wEySK=i8qF^efFj<(p39CG$@Kt=!8@An_;rkN57x=k;Yc+2o$IitCas9S4$PO?;>9Z~Djx6!_C3Y_# zBTz?hSa5FleG(m^I_BJRz;@tE$%{M0sBpSkC2zA%mVIp<@&Q5>nC6Pr_ZkTPE@**! zMfO88>JpNBRVcgk7wKQ(<)Skt2|CP((E_Ty192*kw!8oQ#6uc6ao|EWF)xyhEy8`s}nNG*fN{XeBeNZB({p+)J z>nyftgVo2^^8*Ld^;rtvKU||AuK4m2v2`dqb^P?MjW%$v^g3f#sfuNMw*52DU7*8y zsRB?;2_`_gYH>0nBeZj!t z!D}~9OA$(JPo;jYAI$|-|HAU}yN~6lE&4o$PY&LbhHUZsa$T~MEtM(3qnrm3Dd)r8 zR1e^pW{`$wBR8v)nIR&IUVg z4ApKrsJnj*e4~0i)sVjFvOCZKuK?Wdc}b1AY=&z9b4(_krkplcpud*{ zf@wlQn423%rmCM%rIFb1Yciw|wU8i?n_WjwGW+G4tAG0965|^r5zgs%R(48qox8~n z+*WVqB$t+N7USo`-|IsF{3|y~QE#z=D}>ysew-1glSkDoaTlIC?$y4d&Is*>hRAV8coLhqxEP!61WzCwf1$4CM^t3P4c}b~)U~PC z<)2sy?U2NejnAWBe*4-ULa4L%iGTuML)_)&CZAkq60lCjNz4I1iu?~(=fIptE-IA)UP`}^DjLc-?kChgpfY4n+6k`bD)=Ds1>AJhw~K#@h-yHEPa4?lYaH72 zZo}cVm%2~nSnunk_eYZ7I=fyR9cZe|No)>e%ob&HkUcv2ROI?};J;ApUZK(Ik&;wA zNC=`RL6DU^*ozw>inGQQ`WHkqsBVgi*qTvS;+B#DS$V3Y%dwf%z}ab1lqkQox)T|e z8*PDsf-YQmG-KirD~;nTemDr!Of$9p`$X4@`(!rhDB^`cGK8enMtnqMM&41C%=vhM z>OUiVwUc$3!&2Rp(%Q_{a*)dpSvKWbbEh=vc#7_W>sSUIf3=xyyY1FcPBbAS<0O}v zrt+=vg^G?w`nOx$QAe6M+-wDRa?W4Iz8*g_IVN#yZByCvA$SEs?EE0bXz=zMBPsV3 z=~HYHk)EJsXbi7|#OYX>`bL;8n?1ySqtgkg$)A_oNZSX7Mc7Orny~*SkMH{@wp)@~ zpAUfnOp`jA4?zo{y)htH=mzC{P$g#EKLJZ*+=JU zfz$A-Tu2BNNWAyD4~WM+whY|Ng=uG>7we{vS~6c~h5rz&HY5qLjd;C5m>d71=^^a2 z-Oe5I9Cl?O5Qd*4x2ZX)i53{YJ315Bq3d^@`7(mY4me54>O%rc(F}jcx$%JtkZ!e8 z7^40`Z0&vOZ2<%Y0Hr{KKC*fj^a*cx(ImCCtZZaOy+m$BzT_Y&o%(eH2b1O|4Yt9I zpe!N)XUfL}Z@c8(Q)c0K)=A@QQm?nn(-B>}Rs@nzdvZ%Kx;?b4X%R&gh#QP6#ll20 z8TdkNtfCD0QTZpbA;GJY9;CmUPs@V7$zCTI2H!~qTU0~l6lyr zABlu_&MwL>AcU5T8K(NCfcga-h`^8<{n_hghR-o)s6sNNQ5Aa?E*&rpONFiRXs@0*^e=6xO@3%rA2xyaQh(0EQqrbPjd^+36!{f5Q_-7D0n|971n*2sYau z+2xr#&t5osK0gV+lD}?o@2lTZdwj1~7(ZWXd)}4-b$aU8zIRzoZo~2O7W^P;(0!0#VExO&OToVgN4Y_R63u%(G`&r^rOh-1@ zG303lcG-m%u~WWudP94jbanVo>u}6wc_aUv>&>fST9gL|7_-)fzFcueJ1Vz z5x4LFh$X@HqSzmM9Itb#5Dc zS^eqRTjR_sie>#I2&Wpyd>j48BB5Wy>v97DcpfFXpwm*Z>mSvsovwRFMJdg3|8~-g z@LMM+@icR#B&1JK8rM99IJF{EV^jBw$D}$lnsbpn+JQ2nn%~f@@acm#nH`pj$DBJU z+UW4~xshYl=2HS&q)uUu%PXn_@Z-QpW<8*1-0m^&=B(Ny^&P9=Pw_Ck8GiMF=A=Xe z_>e#X_erSn1-6?*y>&uI27Wy{;_d<83PO??K<0Sog-zc8gZy#D=!kSSLy!BSx9TKn z{a)Cgi6gLw_wQE|`_xg%FV&8+bouU?E-b~QD+-Z@%<8)VMpJq=P@}F4TCGQIAAlw( zUA_>b(;F6+(7_C#8iF*Oc1NuBVnJvG_-E|Dw$tKXj`!kZpFycDeJY>%J$p6>jtLHn zufj*~Pki7f)}&Iu9!(^V-U+AvVFr`Osx2gMv#o*)8oe#Y=E~XEnv6h*^Rb~{`$R85zd1y17 zMF3SaA7Btw3(tvIc47Szo7=huaHaF&O<7>da0WCh!n;ksBrtS_Ay;zk>n9G$1xa^Q z`ry}blq3z^>}TfR?Q6_DV=G}lx!P3ydcPZp|2l3gU_pIy088&r9sZOt{Q%`RO;22q zC@kO0`zC*@`#plpulM%~x5s4kr zW83>9dP213f3hHz^^Ou7VYLEd+LgdF>Nf|ZL|G0vNkH4;GAK9-k=tfAWM&2c3N-_A zHv{V&bRJ1kixYbuH&jLoC6bIJ@++D0I!by&{N~aJ;9dBuZnBM`E+)iO`D$e^sUUQ@ z9%B4!_~E*h{NjWX{D#K2bhP56pX{QiWt=M7F_8_zu%*73CeCo3b8fg{GOef2d<9wu z;x&Kkz3um9rRF2gHVDaYK`v+joE&IUNA0M;Q<64gSMOfV7FQ=Q&pUb=I709;oq%te z*^F^t*q&Wl6eKeq{)VDd5!Psq!VJqRU8gV)?3F}0 zyZ77gVCImO8H4Z?q54)o+~%s zCxQ2^rC3LNDz(Y*B(yM(vpo*e%fmt|V;)WP%h6t14Xw&u&m{{{5WRrAod1{8B zO(`svXa}?OlhjUpb;Oh4cFOd!T6u^c)LKo)yvEboYSX*pCg>M{e<59>F!#nFdI55> zQb&IeqnPCkoKEzPl`N0<6XNGXdZmA=Ct}cyO`R3r|GG9e7IVm#1}6j}`=Axib_=oK zR?cY{+DcI_cg|3|Sonez z;;=d9zGnnsxQUhTtTDNR@#X^wK)xK`lKNr->gATl2D1VI2o2q!J1s!3a`~aBXY6D4 z_Q(~0?SaC)%pc8bVc8XRheOFS>`85eI%{j2T**U7CC~?~dTt?)i&f8!!3s@hMUl9BJv9}#VtBCtdHRSNa9?Rx3aXknHHY*nMm=5r2 zA!TEL6wkUeZeFSpowkyu_Ra#&Y*kO_Lyf%oOyiirw$zsviS@LArM4p6un{I9)#+4B zn`~my_(Xo8#lde?VF*0|TznSMuAMs`ROH4h(^DdxSkqQQSp0=_*vSUn_LfQ?AIVz` z4ZYN6pku8@)AmNmZ;1c;RfkaL?vC~4NZqc6-~&wA{S!wzVxUeeAYXIb7?fN{wm?jQ zQI~p4DiK#;9hGN{MJ5wR6a|i4t|5a#E2mSJ`>Ef6gi;`~pACY0NOV6%y;)Dv&krkM zA$vTg0GA4wSX)b9TU)d5Nl~xXg5e!*>iF2Q3yRXF_$ zZZX8M6&Om3U>GTa?WkhbrPLmrlJ@oY!UA9ul3w+Z$XTquvv(3NL$0d{b+K6#X|#5O zCWYJd^jox$>Sz)|?7c4lGn(%-tSfyk=cd1PBBX184|#9YS^w#>t0RuEakC@^+=kuu z`Mb@|-0$U~7;orb^&d*T7s#pK4_c(lwwoVU!_`MI|MdM_3!yiC{*2_@gz7jU&vXGk z9a#S`+=sbsBAOcWsITVj7{a;c%I~ub52PRd!H zTAZ3l%beonTm7++#$0k=G~z>h!-N!5!MZKnYDUu);fjMOZN(KBtU0p6AULDq%69e& zjPHw<#WzsFJ!48KT|*?abOxWs3rYZVB=tHOo)0u`e14Tvbk%(;AOY!*X!w(lQ*_b@ z-y>QSkw_L~%|i33h9~-8R6vKQ8I$GX!u&244N;SaD$HEvDB_|HBIgt1p{0)Co2?Qg z?4r$|o~=kcAp!Dbn`7~7&0yCouj_Y>9bUvc3AU%YYw4^48YegF6DnD)aJCR4|9l~XNKG`6_N9Vv~>p|^S8w)#$VJ-S9cd(mS@$mK>j)}{cG3}IO;ViCaW z+MLkm9=Y~nmctPQVD;nKlnTA(v{nOSyV;gpof_)}y{1knF5IMGcjz&Jy2Ew>VHCum zrowV5#x$ouhSCr~1ws)CD>Q}bg1J1t}E>+Up zzy`*h%3e0Tt1$k^Bys>6C`tc3FDVMuPK{VutZH&I;%bb>#gMe+cr#i zV6KfnzIFqSk84;xq)47r4SX@Sj3#Ry@*ag>ZF625R4?zo7m@N;nv7O3RrNmyGe8G^ z^X-`+{-EaFsAf?&qzO(0HaY3)Olix(5qJRZ&x!LZV%YCoNa7Rc5nBx^NeA;rB;%r?oa~T0-Amcp!7ks+8ZAgyV{#9C(1?d zuGbjQWS~P1S)J5zc6P~vKvs9?1!BMl>BlGaV?X)`kE&GuYneP0W}!6BEGvyYjOQFl zEHT5ux^(~P`jA!sw{wVcRVSB?a9=Chjx5JJ&^IdD-wIG{mLO|2MIE-hcuu5EL;i4G z7!^gP{KBphP?V_u2fn=nwhFpM5bF3x>^k8Zurmxij=ti{{uF35=%95N-dy8G7 zO#jj_U?_Ga{CA}U+dLKSN+&vnwY(XozHZH8az>X#aEcHy3 z&DI$04Ic(oji53yIt*iZ8O1B)e~lJ(V|I0eMF=3EAo%~sQ^z*`#H(cE{taUv!TpRG z{!Yhcw}ld*gd-w!+%fifG7T^>Sj;DK44n~p5EAgA!)P+Qm&5e@Eo_ijq<-^S%z&{{avo60fZoXPxBaVCCd*#k8iR<%F-Od_su$Uty34aP1^!G@fn-e!MMpO!vo>IN*pO|ck)e4eEuQXThY z@xyV(&A$d?(1lZ~@J_6@^!2#PI_tFJkhjb^S+ljwIXnM3#4a6-QF31&eUdf9cK%iY zE2lzvz6zwU(p3f=lmW$IBD)uo#aRj~_vzN>F~}~&z2IN*!)t)K&9~uAYp}*Cg~vm3 znZ|rt9J~pT-vH|WCawsFXA#DY0P{rU#4@uJ9-FXtf1XyyNwnB)|6DM@YF(qlfMHQ+ zb}X8g6*DmVDHZn+3RK|Y&Vex@EXE7zHbWzz@=r~tybfSgrH&Q>1GnNcQ)W^_*>i$u z(RVS1T4de*v46Ro8g%^qkb>C4D*U#)vjYMp&D4>g17NbGLy;=F(Icd5Htb~l(t%Vj5YTl9DVBFf!!N~ zfliXY)uGA`(Eq?Y_`B6IW5q<(c}KW0-d>T$*DAcI z6N-@DSI~A-E*zY&TO&VF0M)F#5VrmU(WquAVhu>exA@nu>DmjaXY6qvxmAHk@PIO- zXo>RS3}5xHxWO*q0q2CkA1$@IDf&6~BwG)%2V<@$b@>_vzI8f{Nitbx+B2M2J0E)I z7jKnTClHNc;tlP;u#KqTYxPT61hvo2tcNVGN|o=7!JZ!cvh_^fs&(8n)voM)BPVOV z`zQcaF)-+`y1dzF-xmX^I{o4J0`WZ!zSCkuHyGW3u4Xg@7zm{Yig4kLa#cd#y zIeW_4M1jk1^CEEv{ zrALF8*uvK|E3>G1iXPqJG}wc*TdAk++B3<4_$$T>jrKoH5S0pooiPrg_)h&1GfCdQ zBeOcKCi;9|f$X^CKCBS8unJXZ$zbTFI15yH0^>aJ((>)K)SRvnCSR6Bf||Io_! z_@f5gfvPmQrX*D)eGdDF}Dh`aisSd! zFh_4D-_m$1&A6^y7g??BYHk2~Rl{E;;2C&_*x!}=0G-Ep= zl8C-ztSbS=?I)oZ#M;b=H?zRais~a!-_IW__Qu)6`?ED1T5J^uji%6DBL~|t-Xgr| zaP*pHO21jDSYoe1(J|^T+X=6BBD!EfTzrU~z69s4=%KoOm(Soo|`Q(|M zyIz}}(q#-lWDTl#_ONDO^8d?SseH#@pM-Y31-2=R`T9RYkOIHq90?K#DB@=bvi`X0 zUF=g|`+vF;pM{{2Q%5==PyiY>t-k{&fyPIFC5n-O31P@JVrpxwMj(oU$VF|kh@^|e zX37eHO_OUG$hRFO2f1trBog+CFmSzQ7$Z1VWZchcNXg~*=3G^romHGw)KV>Rze*+AhuCYS>-sv~T+Q>@`2bvQ7IFo6@pyTCezagf z6K@x_=_bngLo*OVqB*pi~O<-(*v^R5QtRxz0TmP>g(UX~s%@xyiMR7jZAJN-2i zX2nVROG+ZS7+HCjM1~`#{B?p!>KEuY_yIEvUE&||2z~X`nY*FQ>IdmQk5FI`P!2Rk zZ0RV7uhd%2thxo!DvLY?7y##F)TzTsL-K$RjRrR!0^p3ByN2%PF~%%Ja#y2j2dk&^ zL&Ya!g)*a2$H00?*8V`d4Xi1yLiaOL&N4?o&~BaL{CrAWvTg<@SqOKJHP90ESQ-_k z<+I}^9WIksF|4sPu!=5mQ%8nvx$Ue$78@fJWiA%x0mm?5?j&EH3*&X!)gi*2)OCR3 zx6>>Pz`3$f`nbXod=~nFKHf&(&t4=@Pw}9eW`d%WvHXMQq`gwUGxbf7CE!Uu?~=j7 z)-_k#)ESfR1$76*KxzMg53D~PD|Nh|GiUqL_lMn-M?6bi&G~=OAN7QL2Eo~;4#}Ha94(M3k;9p@PG~zT!7(W-v;F}Wair< zxh)7I-*yLbao-(G;cyd<&}FM%H01|;X#FqyUh7nsE2>G6vPc#$fDmzz{zt&{rYGv( zoaAZnrB|Er{dt}SspHAOjUdm{4UVH6tE@Hh1NtL@Qb5VQ+FGlNl>Bise8Zm{Pv_$$ z0t?4OeUnV#hULZ*FxWb+>W$maoWM z2>7RX1{`|+xCZJCK>p2=D3F(vBj_NKdOX)~=nHa7>NDolLk}C9&sjF#rXuiqY>A9) zZ0Kp7nSU(&Y5V!3ALJ(Zyu%u}J&Ua|Zm&(6iD&mlTR_R}=!`i@q(uGBJOBR1N&yY% zjM2*y5Bp*OA#>~pK^*C$fXWhjSG*qWpze7qFX}AjLR?@V3&~fehAdFyT${rjzxwZ* zAm-&E2 zqQNe-QvcK-FE96oz@CgY4uva)CCBzK(1{;f3-gDLQx5Bn4n_n%z{wxO4I>W+8cNb* z>TBkY+=*XEw!p}Oj@6}L<@fC7!oyd#74106OZU<%lR;^Moe@fQ^?Q6}t$BROyzqLQ zYm_!{qiEIQ3cic_An=!@GckV5#|(}78Gt^x>Y}|E+}1+jM*;>Mc#UH_!Zxrn=MK;u z*;P;T;CkCw_Sh=M!=Y!MYed&-Qou)`AU8ui0ErAh3gtXXO!*z6!>%ejUg&6(D=aj1 z^)t?Deg;~UP=n^ePJQiHpyheSll^5(Dad#3fB;WGs8#Y{MwmU{viKk=*t>XD9Ndfw zz?Y?29KE*SP0c0_Zw6bn%W6y=lwahL*3ozICPUPCN;7KR`OZ3qyYWr9P*psXb`rZe zH*+SUMQZF=tMm!x`R_JyTMpUmvR4urnqmgnujn&PEU3O#LWT7?XBHW*iRy^(Jvg)M zkt#ydz}%ebXr=MJs*V{7-f%+vV0#>Ez@O_2Ws9^U;iA5J=w3djra;pXZQNv-k^o^$S5j z8+|(-4fn-~W247(2uxrb)`}$D0L1to0>{qpS5me;eL*rge~dV+-N|1v5l1Adl1)jJ z2sq!*lY7csT@6}Pn~!GKerSpBHqKn#_;40rSqGRbs^|R7*a;8aWq;VV$jbPu@55Ta z_ejry0N^Q75G-_A$wupNyZ0qJA31|a$-8Fep-r6C@b_JoOaxely%eYxKw8DDnJn2x zu-(pDDfe8^)n6-x`(u*JX~{q*EMZR>557nt8{oE3OVuy2k2A+x4o-SARimr1+aij7JhOQK?pQ0s44ol!s#zn}kprdoVkSYLcGINCP z3^AAxb3p3$N~0~kzI8+!P*(2dSL6c@T^*(O9eSX;jkr%V;q#4qDe#O)sVL))NG&LY zi6$pkle_Wn{@L#OuOC3Yh!;!p%W!TI_xAl{0(WzbGFwJcvRt%)<2#9^fa}R)E8<5AO>&My;xd8#KK9n zGk-k1NF(8(!Bmk<3X14$VPh@WP)trce}(N}vdlk16;E8jim461XuCJ`NzzwpZ$ z^kRbE)YA?h5eO>ToCjgM*SHDN0LYZGjUEGE&xMzA+-H}v>Us&)?IJaLNRSRu3b;Ea zzc2$|r3=0QiC`uTkPBYuIO&t{MiRbfeS+?akIi7&XCIX1y1l#QUe>yEnLWQh{trN! z#>_$z!}a1*W^b{hdy~of7SAk_l!$LDl4O=^L;D@{OkX}lXE`<22+|cS$8Z)fxq)Vq-gaSgknz2UYdm`Bug{JnWj*bx?}Ph$aM z2|b@U5L?5^2idWEC5E18IRO42_~b^wj-@sgRaAL*kZ&o0n!B?2SS6&ms%g;qm}NMIbwy#G3wh z{H;I0-}@_vIgY$hM)KV7Y2Zz?5V%uEYgvOAh#L@ZrH=rIBF@ z6;(@t2`{o|@oIv3;U^#uiLOtM8#oiA4$;U3E0_*i{vKvBFN@De6T`o2MK7q2i-h$} z2FL}iisP5=wIRs4?OtLAf*=qd+rH7Z%-a3Eer>YqStZxE9MDO2D_EG{0rq;!xj+wTpGYZMV8OcRsxe8 z1|vwcYh#HRLm~^rga-uaY#|BBRp;kp3B+4AhXDd644c6A+u3+M9)4DPD9T_x7+ag& z907bMJxLRNThLaRX04*o(VrdauOZ%$V}s_B2o4RDo@eGbnLmtND7?*i~XvJ zlI9^#^b|awDja~hDpjU$q+(2kTpwu!?D|VXbnq{%(Vnjn)IWR7{cF_sZ4yMn)`btw zslOqUA?>thZEI;Eii}1;I5+h>G-?Tf+aw;e5wK^ys(4m+)~ql?-YV$Gs!qAIqU9@R zIWFPqVQhUR<~x260~qE;{Yl{DEnbc=W+=5|3zC7ViE)6#aF8as>MCys5E%JBs&D=h zIq(WKx?;4nKK$?K?V(1kk)tq}CMo~3Ml{iz^HnN;2mQj}h8tXAV4Pj9pds6BjfanD z=(3I%qaHoqI#xyfy*+m{@$%n3EK9cGll%S)+lD2!hF5IsMfvuEdd7UemyN7pnljf#+Pgz}BpK-`tY?>-*dty}B}G1eKRe z^?o8ef9aHK0-|C~wK!tXl^1C>8wMH0Lwo$G-Xuqt2FtVRP-QmBO9`u*h7!4ADqnn6 zOV=dPP4bVC-_|r4`hMLsCNq__){1uY&Bsmps2v(ZD}gKArBsan<atKq2;57=r%3 zvK&Iz-ZII0DH3Ku6M97ZwNz z2OS8A=RZLdtI40tUMD9Wzo=%UELWUdP!W=LCJFh-A8?NFy&^~d)n9m}LJ;twq+8OK zWuCL{q0MA)0VGZdVuq}nu9B{bMB55z7Ci+gKQdEYw5#S0x{MrWuEn4xP_#>=tasky z9Oo;~SncvO6yA_j_BBEVsrl`qbcwKU?VC6N3?q%=p7c`@fSf%*?Mag8A9EkqkUGec z8tByWpvL24o&hGv0DEA8E}YCiwEGNwm~l7F2iG1Hl}j#?`ZmWHjM!0c6gG?7deJDE ztC<3kN?we$W8_;REX2qwY#f|x9RvdeD3%>5T zx10;15yvCx0IAJEaE}HKxQ+H}$cBfMnI9GO8m02rhbE&H4SVVXe=fGD-Nwy}7YsE~hpqgc=Vww0KU z*1d(np84nvkRljv*m7_MX^IoD;D4uer^_h848{1)*axMBQKOPGzRlEaVhIeVy$mkY8nqAd;0+b)L| zY{Ym=z;Na!m4>6|o~v*3ydB%W>ZPWXsTj9P*J{_UO+8)x4nI@jE#1@(U{F`C5T_jq zo@Hh#VPoTYc@kPV!I)U`je8%rPCnqfp(klI*3lHpeb3Z|Ms~vXoNK$+kyWD!@Z@Yc zqyQD}Z0XreGluPJ7dnn2CKw?-MHE-=seKj^!1iYIpDrdYXS1Cv&pxKQ9Vb3w+tuC| z5l(zgpai(kv9WSWlm{x)e334q=0CnnK*^7EXJZtw?Db5cW6&>sl*+e|y{M)(byJ&t zv4{s@4#;hL`Soo3O-D@KlN+3Eo$D^3&p=25kwap0WjtVwlAV9sPUpJJ{-&;Coa@=v z0-kDSw^E*#AK6lymfNjuQ>%45)^&By|EdktO=Vv9IG?{+Rc?9>uy1!adD{EpzuBhs zG4}u%zom;E$(MkX!t_$c%l*I@*i{X_b(Dg9@59JcG03rUrTaGN4DE?E z@p^#1@9Pj6B%GWKbp#S)<1@%<0<;z9oN0i4Nm*u*nQ|@!J|S|3hh(C{n2yMQf?zB^ z3e&DZM`m<3-XzkSObdkcu_uVU^ntWn8FTNvUyf#AR}5HOah^gz3nz*v5)4zx#LusI z)2f`#frp1k~}#EPfUazivd+b7mc-`(b5g`5?IY*}z9JaY>#Z0|{T z7g1&&FNgk#2;A}u$^%kw8F0yX0WfXR{}#P3g5m-!0kc#lR+AqD0*LoM$oh=?vGdd{ zb+U-Qu|a0j)_ZRa1^X_(9I^Pvw5R7S&7nE+>djP4vtTnU8y%f3eoJj$rXjZWwf>bS zR|@B=)u^|9N}h{MG?lXOuh=+)HI&8d8r*e0e!I(fI%oubU)W zOBJAE72v0h(ciGf@MW3mh}~&~y~G zoKaF1`XUMwLfS1`7B9kTTWw7}PNl z^{KUzPo!;X7D`!G*h^dqW)nQdlcukzVAXt0|2fr;2#WCNckzcH06aJzY;z3_s&BZF zKtm7&I&#Ct)Ff`-S6;8SkS~p6cCA3$57oI6uonS&xt7Uq%sPeZ2bOf3Ifc4C~`FT-luj@>(xkne_iN_c9()p@j~wL z3B{A@oI}kW_1@bE2z=674M_va?)iRl2Yf8(&kKCl{YowGl}<&V%G7W59Dr>eX&Hp|2 z*Mep8i~A6XmP^S)C)2{uOb?4B&>x{?TXiAvCI@q!Y2APuF z7djfpj!o=-5d}Ls;sG6|eNDamLlpd;%okqfM>Rn$n$f6`+Itc02t4I#qYzH|xtGAp zjDos{@Q_ar0EJ7NL=CaREK)@NCG%7&W&td%d!|mE|AxvmwfH-#ZbF90GOQcA<2Wu^ z(bB7csd;U|fPtQboJHYq5HA-MArHibZih~|NDF{Wsx2R|hFP*0Q&H!ZgW-0_2>s2+ zo!AvxmWK;oPHi4VbjV(tkx?>g-hv@py3!IFp!1uJes2qUa}i0dFhj@xwPAj! z&A79%m1wGJWqv*40SGdhvNX<0KhZ&V)*j@O`I~nsN8-8Rv>MjycJg>$S10+)eZ5=_ zQzK_cbc=Q; z(|q+<<L-YkqBf8j9;6V7r1@W(`GT4rwVu@_>K?77>d{OOt$Wq-y( z!`h8DaEN*w4YGn6$3;s_!X!~R08dyf%H z4QdpF>WxHkMA<+~lA-W4d(Pa=8=(lZn9vz5*8yK!N+Pr)47bjPSkz zAkkLw&0g7;Q{x(t+ZXHbp`eK{2w)4;9XnPB7c{eLlXRC*uuhc+Z&+Qy9 z9huW$BP6SrJv+%S;x7?QmmnO>E8mU#H_LC(OJu--lNaOw)lje2oM{rBaIEEQ)JLg0s}$8AHWpq{dDiOH1BltnJ0)1o8mrM(2vzV4@rv{N?u z(QrFpi2Yg}3MX(Xay%-C#~b-2E{{+r{|WiOKt1C_>7;e;2j<)CLpnGR zGCO;bJA13i=8>d*{9qR^@Lk%yV*7%)#dzK#zKR&OROc-1nm8hVde7<Jd)sK7o_QnBmbf+?T;WBe;B<&Qn%o8`1v!7$^%Yr^dACTXKu;d+=H z5ur1fnQ>2_w?H10Ga#;IyXlkS`X1rBd!YLs)QV&q+!-Q8d%^@@O|+Old&U)Gk~43~ z$Mpl@G0nJSp?l`@$Lxv1TB=Ro70o*4)CZdt#JkPfJH1AVw-qg)aAwY}fKRw2%yWYB zW8fgL!4KnC+VhqORUdVHhvkS=4mP$e!@6>&GkFr^#yE3j0_Z$gUq2>h5QcMoA2Wl3 ze#uxTef5(`gO9H6#WslLgA$awK2#{pz1I!+|b=rDiAT7d}=L4O2{P&^=1d9-)4b386z?HXZ?Z z2fC6 zqA6v0J7D-=3+o2JO}dMpTwFBq>Yp(x{!6tu{53@_80M$EPtbWeCpao=jLbRTP{&IAR3_+8e!2eW*l8Ey&Z zp7rT?0Cmi*>kC1Zxma3j!0>Jd2fqTZAtX#2T*lQ-b-h=B(rRZ6u0?2XNn?R@aU?jd z^EVAZJ>zI3&|!&-g(}Bki8hS!!Bi>L97|Y1sgeid*Ux#&a3V%O@W6f4`em{Iv2JP%bMWjtpaHsBOO&GD4(+-G+IQtLY?p5RY z13JwqJaRG|NI>WN7(V=BpC_Rja(DHOpSxCCJroA6UY=-#kLB>#cfU8n+x_iA{~(!5 zqf$cc?HjBGW{wnlOa39KGW1mND*Y+09iuhsmVW*P66w4|W$Ti>HSf#kpDp{E?IyQ5 zzl&rGpqy|!O24MGfL8Q0HEFJe79|v=hOqw_K%1gSUD<%Z2Z*p~p%W~`=0lAr*|>qG zpJh$2tx2&jXbn?}Z@O4v1d7!dky>zXCOYd6F;zDkyu@Gwi6SVM9EUB~w5v5YbTCj4 z*aM$Aw=w*B#&-;ZccA?3RBXrP?m!z`rWMWmIzC=(>F< z5~1YWjMOqs@CQKuOid{Jd>s?!jm6yITP^E$83nJW>*3Es zs>;s}%RYvm*`x{@FXd-r;&zA{1Q(m4!S&Scd;P@i3ut+&-mXBFc-7U`wQ9Y^=egZP zKl+?6%P;Y6zVb6{Y|h*1F-!#5p{&src2U@YAh_I!TnJsGU|u65KI4ETee1xfmDL&H zHpLd12RGS1CYGpmVI>q6Do*%&Kp5H!@7y26l^_<2T8)DiP25dh>DIv6(oqW$ks7mLF(HQft?Pc??>~i}G zNZpy%go^-Lz7PHXULx&+{(~7z{fTv;{=_=i{;;Yp&`oaLtHi zaGdMHS=G~>YbIh-##tt?1@uVZe|Lo#z*uXSwD2iWnJ+6B#x6lr?KoZGRN&+lQKRlt3)9`@g3Tc3?Xq4cRz z-^I1Yj~n=%4G>vpJ`1Nu7VZxT^?Q(M$0-YdOJacmFk2qfZc`u?9Dl?yIx&js#}H*o zXQ@KyQQ9&c!W%FP>1w>I%sXtF6HttJ6x^O#NzIK)Cq7-sS_k&^u$&qCTaR5(cj3em z@0i>GWB~3x$6iGy88UM@tYfC^86RY4YRCRA6DB-j6O{Lad&@LY$!n^xHIF06@_VE_ z-(4Rsz8%E_8@K^hY$tPR2Mh?#^8Ka@yv8M`&TrByFN8=_M%gf@u1$VkUK=su?L!j$ zST}7UW{UTVWmzhHgCZplFHr9S5!xuxzRGDk@LCO9{P_E}#bp!xvF zFNj0iRB@4>%cX9wJ~0+^NAoQ>nL+;ynHL&TXC(t7JTVvkME#eSFAOc;VTbxW-c&+D=TUldND}rv#_rx;J$a`3uCHw0+ zV01qt?V}c{uY*E9j-hbnQ(s#9`r62h`rcJm_AJV=x+rf?KDf`utdAU=I%(mgvT)~9 zvWo02vWpRD{n3h+0F`&Z{)-HFo`nYq5>9C;napPhxj3rQCV+QK`kih#4ylv^J43~? z-JvZ-oP|2aI>;tCDqCg|-u2FlVViuogrg>_gU^vvipJEBqFcny=l8sbgh^_^!Zf2% zq!w&%myp|Q#=K5Ri335m;8$ok`*eyj7Vk^_)gvn>gXR1`0F6L$zqVh8eiP-X(SOIj z64RFnw82t+iy1HVlhU~v*e=lawUcsM$x2yyT%HibVTfQ)QCaDwabjiGxH^+fH2lx3 zehvAbSuZtKd7FHVfRyy>%-+|2N5zNGZj2Y0IiW>MpTHhi6~?DmSN3e zB<){9y%BFZ14i4hR%P11Ofq|Xd4ED?>&1=q3ajC&SIKkwYglQ#lvxlNRaVccAx1~T z|Jy9hV43nacTz|>MJT{`2u(P6Iju{_k6GT|6aH}TLhq_<7K!1%u`rhD%+(_9fF{=m ze!92bi953_1~}(tFy2ZTQj@pEvn7XgW46_eHffSPh!G5Qn`XPw$+n?q)aFBk@gIEP`n2k9m^ zl2>G)PR9Z4h^>F6)g`7Lx#vTED=fJhUvpTqGY8)k-@>C<$D^pZCd1RON{ko%dx&)z9su`IcKd$3Zu6k$NGznU578qO!Mh3Qyo_;a1NumomFi;-}&cj=_wk z>|H+%_HwP2aS-xDrOVMEr}~_l+{!4HkUBW@m%9;O8)LV21`;le@_(sFmHotzMtnnv zM2PR8QEEBAxn`~vkRe8$Yt5nx?y|Xyv4inv$~?g7${6@^-z^vWb+w&G@IDdWpR?ke z8bO;x9QuOck3_SQdP(~RU8e8S73u&@UIn^bp%(o%UC|nvts8HSFP+k6F&jLEbH#hP zA2&Cf3z%$EH#R-UGu!BBR?v7%AUuP02+D(q>ThCZesOatk5e{H{8PN zgBg*F2dH=x;|%pO#AjM4O*H}tHCyw=+c{#-l$pSyuZ1SJ9(O{>v?MN zifjGUvz2+O6_^t9dqA$K+nD#X@a8Yd*t3#fHD;FwReF?f+%v7+OX6@6aWAK2mtwdU$@uh24MmN`FdZsJLv|r z2od>uUstrWzr}Su z2T>0ZVS8U!Kq;zYPzwM6B`^R09G4MM2oskJMF$XnCl=2M}3PK2pYG)*&2{Fi>yluI7S0BJ;Nw7Z-2dW=uY!ESX6z*|%N)(9q3}e#6Rr z^>yFw8;XQy^NV#;a!w8bBntl>{GUp>v#kh@S7zv+eS=rqI{_SlxT80W%ucd0Jlu~X>q^6E; z3QX!V@>CBE!MEl{WK zr5LCW@E>z4< zDEv@Spv|O3`-kq81_TpeK0_hFdPzG0kpp1_q18Z4P_m&rMxAWi)(yl3-4rHJrcG*uUzCEtRmI6URdFVipe)T9x5lIR~Xu*=|&iBC0 z2*vk6kCS2V2u66l>*{U2E<4eGJf>td2uPJjvMy1_AAa}_3o^uJtLiZCTdIq!bP={R zaGrLODf)#{r)aS-L+i@PuQQu%vy{wKy_o%`>hy+gNl}3Oq9_u~fmE?b#}v(HP{jaK zA?C@fWs(k)U$VGd*{iR{XP2{i>X{=dJ^9t^zoxo6dln9;s5+c$llw0Z72y1kTYU7eCg!2bd~m1e<&GNznqJY#eP;&r z!orb9ZVnKFVvvXaAM;~>&nP6~nsTl)MAps%axcYcq28!VEEag>giO69HLp7^%5F^) z2W=cmv!8~Qk0jZu+y<#EQl_6-IH&{kBvu?LvIsu{jD~g|#=wj=s#N*l=CO}prrcsR zY_~Y<%9#!df~?x6xd`rfJu0l9%JY6Bwkh2n6% z^l%k`me|q|wBtP+v5iVTUq^M9%0kMs^wl4E=@<%Q)D2)sV1B~?lKW&3WLQC^V2KrR zKEH@u;bnXf>~eH}C@N-6@`18mrKl6rX&lUcP&IwGn@>>|AD=R|@d~m(B@CxwYfoP@ zPrC)cvn6?%ldD5Of-S@}(6n1DZS;z{o}Z5>97Mq!uQ3XJp*v9?$GQsEcqrLM7gbq# zVFrLA-1MBQhHi!qym3n8On%0*gT@JyL>(!?IjN`$nJB5e5$+8uOifUOqevV>Vw~7XAk`;Lj2M4j$l$x> zNzgkWcbthLCvtp?BTV1`F8mNLn);3=sNwto{Ng$#msmIAXw)9K$yRk&vd3Z#1Ucpk z>-UevLoF(QFw_o4L&+f31R-$gW{_)@eAa=RXO11r2WE(I3K(0(F>y@=IW*S%om|E? z!4C>*mQFoZuT5y+Y01zsSJz8v0p4##TfUc~nde^~l?Q^dZu3`Hu_AGsKgRpY@R^(f z16L*T`wNHAJmW)~Xi+Dn?4woQ(ZxqX7(Dp z;h|!G8#^H6DbvS&rkX|qdGQMq$w7CRO!9D5GR-5B^6442*R=5q4uEBs1a|Gp76VMJ zgbQ$TVLedbyToybi>DgZ0zsCVzQ67??ewL333}-xSJ>&p=I5Q6WS4w;Z{ITNv>j4`^sC zR`P*As9JN?oS-hgBVWkDC$g`9ASfBC5D%EADxfIP&KM*MKenqwFM?e`cq+6U5Ku}h6UPSl6ll7|yx;MT0%?!LOn-^+?dM(7qHfPj+FY^0)&*f98%Wp4|PJ$_}w8U}hiWVpW<< zEeKl_HPIYLTn+2j8fT@5Kb1SeEab;9M-olu2NsGipeRpf-~h!Z?fY{PEl zpXDe@al;M{`%dzBE~`A3T{-D@wA<_Ig{)PlHz$AH_iaVfzduu5)7(wT^OiPcozV)a z#Cd_?jw{fgfQFnVwIW_q8|m6JOYnQ2KRJxQ3u^PjAw01>|E8GE$)B`;m}Uj`(phxI zeQ~ZbYCwPov zf=iNs>`A&9?o4o8t|sd517;Ja3{f$d|NCa6e`M3hi$7m4<2l^QW4r(cw*=P zOPj{*xr%6Xz)!r5QDAC+6;n)|CW1wbR4AH9!p+Kk&4;pql6PPzIXDbW_J7S}oUSsT z{&{njHpQD@ZEj_b4ggN(g-I!_oYvSx4 ze-GL~tx${NBoHGF*-RZ~Kl+3i2jJm@+KFlMbO26{lqUo5x#r4`8h~d_mTrhtUOZK& z18@@IPyklv24EEiV0CT)#v2;kfGwQxPhC-#@gdw&_%BdP0|XQR000O8`FdZsK~M*+ zD+Bp@U$^ml2jKw;EPP*AknbrQXqVf42TFgf{r|C@Y#ISYf$GrsQUo~^Mci#+1Vt7` z-CTGPxFWMAN=jRja=Z&4`xrUpmY2wb=-N|Xq3xkV+V!s8q!RRLI2?-KH=Ge}w_6Te zjp;Fc6*$iC&bWMz;+i{%_#1IX|2#v%Tjjb=>6S0r>t=-@U;t(Bz z9g-$#kv$T<_0a>cL((Q4(j~pOb@Y(*$>28!P05gq;QeUnknuYgeMTl{PO|@p3nCJ? z@_)wam!w_|PGzy8Qm;=XB`njd$g6+p%aUuh;`BR~W4WGjtQ33AGHhoj^McTitQx<_ zHI>*7cHGgcT$K=e!4xG)P<4JFOS&`PJJwpVMXBjaV8rre)t?pcrAxgNH29t=jq_}G zVfQ#+a(XxDoDzxo)|YtI!EvbzNtcp>hzoi`b0BHsJ14W#`F5Pts?m%Z4KIHPytab- zXX{*_7x}CZkdy1BKT$0UW&Bhz1^GPqF)!Y53ffL2UY&1aVa^JI#B6zO27=-|R=<`Q zd@+@>kei|P;e{$VWaGv;TG%s)GuTeWzzY(;-n8!w6ThknMFB8HwM9mem(k6>ED9a} zcOMkuEGyxl)|*&h4GP|s+cc({; z?ZGoMeR2SBqaZbLC9nop|$2;|mpY;18+krkP}ra@aS`v7m{Inzx?! zjy!}<{rPNBGER;b1d8AZXL)(~)#bCN>C>-|=yG`kr<g{ml;upP>66vE z8m3FC?``qOPz)^T5N`PptWRqheMHNZ(c#X4ev}F*1eX2FJ-8lP+Sl*^pz2u~JE5Q7 z<6t-?16eaGd;@g@CO|d}ga(=h%&$uB8HfzD4Rj224fG834Gatn4HyOUu2tj{ZVwV3u4b)oR_R^LT>c~5-a*rZvN{UsHL*HArXpmj^$}Tgb zK$@bGQv>F}Y{sfanqtn=bSK~2q=(;#f|Q(oYtB=B2@rWxFZO!w$c@~{_gs7b9fUWQ z>-`lp!ypX)0Z>Z=1QY-O00;mqd|y`zH>)x_3;+O>761S}005U0Q3xHEynzQk0@)>( z{DB8DCr**j@?P2P>6uxH9?f&PTz*yc-uJ%u%5Jl168Pzl-tzzSC?WqKmsWxYq!EJf ziA@=?B}Q$TNw(65<^PJ83xfwV5J&RW3rlhTEfZo|@GJYQyO&Rc2RVNwagV=I%>2;0 z5=A?2$7~Y%otLaJk5eC1CH|d>A9=pT{W13wAEv@37O$KtaPK*xANA6{btQ<>t5!TN zUGow?3r22emCxgDrE|x+&B2Lo>WdXuQw3csNG<=K=ld*yM?qqR!6-;~s`rhZ|^GH0eZcgZw>eM#AeF-;qoe?$;cUnV@Ht4MPI<!pWs zz3(P&nsUAlqil0&MSo~PTYmekcXAot>ojsD@xv~^getdCY@@i0;t>?pT>McKkKyZW zvF4?H+Vy_Gm>*#~`IzQ4$MHfpNgU^6^2yitCqc-r?IRuRgh4d9_td=?pLd>r_L|@8 zT}xx`^%cgMXTmLEH4`@`dcQv#_=& zE#XNo@$?Gn{R@bUGP+HsQYH<^R7MO9=ukm)@joIW_|H;hpu$rP{&gnZ7b9`h78w{! zX3BlKL1wi%nJTF=GZB9SzzB|-OH;(7G^pd<7P$mtGWE>8nl@(5tmtjc<*61uo5`~k zCeLXmZ{c`(fPcuOOubKGeQ^Jog_H&`4D)FSduHKjeibdD#YhSq%ET8Idn625o!Qn5JGLb_P~%f;0i4ORf{5k zOj&vGFc2*iodJK`hdJc`5}6Co)qq3T^>HnW;clQYM4D03tI@ z^aD)|^naN#C$Ez49ef~7wJDGmlZO)jQCb@ym{g{0Lp{ng&}pRgK?8_PW%@RmHRnK2 z&^F+C?Y=ZMqDI_zCm69*xz{-*VL5& zF!j9P-;MPJb;ZCz9#&pcgB@(fO*m*Jml;NTwQ5K~MIT1H7uU$?FOAaePk ztSj}M)@LE3l1xEG`a*7D|o%L5k_IV0bVa#c)}o9|;y@EYea2h6|&jvlnv z9e;tc#2cr%p&|R0a zZ=F)v22~^zkY`G3fW8fC0g)NdW6+j#w0#kUrG{NkSwi9ZG73MS6_p_Y5kQVIph#or zUqGY+SW}t2jpQK@@F`+X1Ns8grGP<5mVe5iR>-*mSk$LRCNVN0KcRdh(;*?M+emzM zrmchiL1Tjq74hs$AK*+MG_x9DRtMc?W-Q&+dt?eI&CINRECJ@3=ek|NK^=+TtP=4`$yH9*ck$@LpIp>1e4}Jq$c-lt;MdtG zvh8aqUPf_Mzz0q_QP1bsut!9Kfbi-Pgp+=c2aJDF#6r?{AudJAeyZpghe4XlN5L3K zdq2r#AS?cvLiKnI3~B2L)aL$?-+x&@MfK?(3S!lYte&f4HMuS-njp%JMQI~K+isQp zj+iyEtIDVB;J0v;;grMdnzI;yaT7CJVL`WRui|m=Zje-VOKer7{&SJTUj(s_=)PJq z_!dOT8ptQ*Hbv%E=o)Z0a=A$xv@MnGhsIDzE@z0mz8pe7zgP`O0}5GP8h>C5!%D^c z4*{gjbdh_FLW*!f>Q*vs8$(Y=a1Cl$9YEd&YR2kwU=GQwKF0u&#W)$q-6RllIzX{8 z$KYxX)th9Bb*hP)nY>Pz_6r#Rs22b%Foy8rZwNf*bj)AJmdr8REfI1{wDa}?rHhlK zfFAz_inF-mZ=yh?*}(LCRDV>20CG zHQ>_P&N&&m^!sT4t#M6Sl@aGOvq9ptY z{$mnSV@hT;Qwmx{G87dWR8?XO6;}$0Tf;OC^z<+Asm>Hg#~~m?9e+agH3V;_nAVM% z3R={;G}AE6M!(MVnU0@__#X=0nAUNoX)OgxJf=(^D*TtJ2^w`qehBM1rV&ui)D&qQ zJkDy&gfw4Eo3j?IMh0{N6_@(IDfHLp6e!meS{e&2s9}cGX2O2VrMJ!M?MB*W%}g&! zgLD-LQwM^pXGr_?>wo0VjZ6cKwRX>8h_5af?MN#QYA0x4al{dsHRezbG6t?9EDJ8jq1eydc4IXstWJtQ`z}egpN2RNoe5~}2#p6FDHZT5 z;f(nmq@+;H?+v;M*EY4_e-k+id!z>BeqgPK)SnBL9fKpdZ}XQb2QPoe ztFXosFIGqiYJ%ObDPRLQu|H^S7@Ni=^D$#hj4A6vE{W73P8&N>RM62^ajsf*Smap! zh_kG4XaRv%^>_!}!|`)yPT#fLr~T#ER)dRgt3J1t+rU+J1FYQ*dJ~S{WW-vQHnQZ^ z>xBhxpn(&#JbJMqZK0G6`ae)h0|XBg0000804#i8SJnKv@ZFazjt9ek$m~PLPacq^ z|16FC3)AO8`gAo}l5|OzTT(@Q%N3cwm5M^&N=seWDwK(y)mCUdR0+uxD{T zeY`ThK2e$AchT15da*Kp#m}+UG}RyD=Qx#_sm#cdA@^sExox>JZ%p;~>4|OmaY;|= zscVv+G78O-k!$Y1s$G>U3;aIK?=yOq-e-s2AJFBerSjOTfXlhE>?Cw!rMB6!^hVvH zsAgT#*Xdhnx66u?=+K)T? zG`(ikoRC%Pu63Qrx?!1(de@0tX06>_>6q(XYBTzjvD)Zb<`sI5uWYvKR-@CdwI~*D z)vg$3cWa)@FFmwrQJt%%(d{;#Hy$_IhFL@2`sl>R-R~|zSu!L{Hchl#QFW!F>1rjU zYkKISLX&&X2c#8$Sx@QdYq3g10Im|%$MhV1$Mn2jpzpXou20Z+LZ8%&^qti2)u;8D zYjP!}&+2oOlGf+-ee|6%vi-4bNxx4&pdY*@6WDY5Y5kCXnDXY`cW>5@=!^WW;HI3> z%lc7H8Fy3e(2re{C_drFkLybupLF9V^phMfy75!`GRLQX-1uAcJN3J`#%VX@P5RxO zW99>rCRJu>DctWA_kw5bk7?(`OZ0CzM`_ipZCos^`WZ`@m!&voJ%6#$E!A7KE`_yr z>4H((>>7H>>XaJm8!cnqXj`SnQU0N`r46&Q(ZSnBo6A1uzBpZasC2f~dExkl8s3hy z{!ML=Q!S-+ zuBz77Imyshy`&c!*2R+bLWe6k&BHnE_HL*%=w;~)rPMF#=H}`Wm+mg@k@NoNN^S-L ztEHt<)gAIPU;3C&bDj8i(XuwWr%#-ynU@>SFLlg+)e{@~%8BKZCr>S%yzkC?mzO9i zdhle;tkG_y%{3?u$W#Rw7TfJ5YI?I}lurwYwHj+it8uZ@(Zx{wQUKm=r5LDtmcqg* zEz+hh(a>77`%9gb5=D=dIveixKh4X;Fs&<`w%*tpthvQ*d8zc!^R-5+cA;f(Qnyqy zjnZ>}&utK1+Ia3cp4{i2yJYCkJ-0L%;^umlhuN)RQI-}PZEL7W%5cFj(HS1K$kr`U zH^ky!Djh$?(@|@+ytl*EGdylzJ%i^9tez07sD86;b|}M+>M4WhcSA4fjg=L{G}?7z zPyzmZC5C1Jw$C?oLqCRX%DaHJiA57Z__?%yVs_R!jqr4%-Dt0tx`s8}4{m1n4h(_t z%ieh1Y|ygBLRjSWA{LKX!a+9F7r(e)f>+I1KQG!?Gp>k*<7evnXyN%w!U5~Ev~dWwc)a+@j}hSn&{R$n^c?-hvAnJFRPZZ zz5$G~N&VfWir{OkP*G~B^c6IAn(p9hT6CRFlRDZh5x!cbx9bKS38KWYA%MPcu|d!x z^mqFzYL^@91Q)kmzZRg)R-+9ZgfnJ;bA7kY`|r?mp4XB`X!sRyji3A2kN)zn{F?o% zZ+R6o1d&CAS)7VCaZ_>YWj!N_SYKXFY?q@%Zf4}pBPGJm3O`3}mBN@UHPvREo)Yw=@l(=&)+kKb zAqvxWn8J)5p)hMlDIBw@Of_dCXWph#)qt1Wf!uD&pp02S)v-o)W-=v|4t0(vZakH<{VY8ic%-`03vCv~2#;t@c>!GVkk7{~UdRFg+?2sOwl6qk~+)VaU+miVy zJn5>gzNqNhiZUey;t|A)Qa`;d^)vLzZcDw0l|id^sLfV$ye#fjrf1G<7nWR*IJn^0Bx=I@@@!I$LXzL+eFJaw(B; z^};47CG&1<#CwMKs>Of%yN z5!{8o#y3oZ=CV#3_$lnlqbvtW${PJCa`?}pp|qS<3fS;UT#nLTTs|qM<(x916y>c0 zdm?~Ay>(>-1%x~l@DV=anzAlasNmGnmFsFxX-GX4Cl}BFZQG4!l%7UgmpJh?#e6rm z49-4E4fi5{bRLH7P(iv!>M6F`kJu4xw@V9@Tch0Xr`*xo=eA-x)jvTT@B3sbOYc^c zr==TVN8&YnLvcd70IY62->4gA5r9>RFx#5=>h@Z@^Flj7Xg+tS`&>D0eiZ;5wv2YS zLlewI#+}RNS9>_!31KaCooStNG^{ICnoXiu0KF=Itw0uOFHV%0foiMM?K)v0KoQM_1=(2%@w-Z->b@LV5fQfm6Eif8Iiu;< zlpIZcn$H9GTS+Thr9G$Ltz>BK3-0{$-2aSr>$#^-XhPCun!_jPIZSgUHKYC5wu?@i zaZX8p3{o^IrK|TyiiAU>nY2=b{Iw~XQ$0j~VX9rDG>zg^YxiY3MAAU(SXHmcX57m5 z$8=r~w$jgm;zIu{Lgt`=sDH8R3avt^S)es}H;xcJPQCjq(NwCQI3w|Q@{DxpN9aw8 z-uwusq}?|eeuJm1n=(ed$Or-A6>;{w$3=x2C8|gvJ??J)u!T2C`s0V3( zw+Bh9q)*sku}5E#FCDbC{{C(0!}HvNR$ah+()WRPNjj|sO}a{Lw{xeYSCnq+B+VxN zzDDA;LuH$X=&0AKhbVTqM@M!42-Db7f025wZYzW@61}9IXfE(fl<5g25>x{5qZB_t zpEQvN`E4mri?OZ8<{gVHxxzDm}j^K>H~METws#J{5k|x1kZWHGgo|e_I(I0B3MJ|1hwxE zCyA=5ai;a11XJ)9L^qT}H06==X=siHlHp20@aV&-1OUI+g5VW@l{p&sewfHHzm|d* zL56%3goz9SCoAXZFRd2kSvjsmDb1sI{ZNS#DU@V(7=#e0;2h=4DuEQ0Q`D>qmU)qA z=P;GZDq(sz&F`jfYRasfr4ng{TNL#xxi^p}u52CMljPb#A`TH>@gVR0UAH2 z8GN_qAB7Xj=gl2}vTp3FHdXY3h#L+OE0P0j*lr&I!OkL}~slKrbYC4n|2n zbVVBPJ_d1Q0AfcY_D~2?=rPAR-BT>tRxG8dURBH}@dFxoNa7TukbvHh&)o<)k#$yGb)9&lE0l)B z7ix^>9tIzFu4AsB(utu5#=D^k7EN1cu3r=#T|w6=n8qN(JV;=aTMWuW#dSF_CM7tg z!@)5Xdoqnl_QxdmHBh`_MCRY2tT#gD-$gh22vCWCxy@Y$^lm6(_Wu4Z3;+ET>>KI! z-khO(iVX<{v7Wu}Z1NW)*V(lb2dX9yAF)PxH>WZ$?cZ>y}+I6iLM=Gt*K^k!!Rs?iAahpj|X6S9o zN;Xq=oOp-0PIL33qK8<7OPmfJRN?F4UfQoS?U%~1&^CKjChl5!_Orb#@xEhrn%WqD zqu%GhiP&S?Dy^>+wSSuyG~!QsIV-O##5WMfUX-pXy*#y$x3gCjZb9i4>`Z^0R_8eN zV}kM(Ruv)cy{-^9PZ*f+?SuzO%2OPM0`XCkRHK3(Kl_HhqmQa8i5`qK5UxD8mDng+f&;bjdrFt zEAsYdk#mm{GxqFI3BYHDdOByPs24LMP?~k;Va}dw&fA%X2?q9ff8VzBifnGk1f5G~ ziI?AS(;$@zy`q>e)9xJam$oHv__Vg>DV_<$_gM@519}XQwCC-8wz3j(#q3{y%J}2F z#%?$M(Gs^^fi%97oz;~!&HT8XCZ04y?{ngNP2q8?-6!5Ey^qGo@9Eu|@^*0L0#s@399O)@3{1F$TWm}lkzO0{a#6z?GnYx^f_9T zXuYKSci1Ib`RS2X()4_63cPoJnoj)qIlV{-2aKCoIH!pY1e$61Un*dkECmGqOfI&mHDI3I6Ou z{GNy*N9}H|ivs|RsQFgBhMjVBIT*YS+dL0+0hKU<+rp_a!!|Fn(YncB6NiPq>6j+|yGJgue zHUChG)jO!iGIS@xoLi$^5lkxxyNb{N3(hV?l#yvUQBIz0k#Frr!SF?1KM&(&$UQSZp0&#>z$~jM;Svh<&tj56& zD#(?E0+mt*IYbROl<_Xj93x2AxQY_s_HLn>P1UX&Ej;ul*8`d>ovMK4i`?b&ZNp$Gl3?dpjFDY`Cwiq(?Y0`k`eFs$NDA_a zZ)AkA7%q3Q4mN1<{afBxZR3TiNUx;5=emf;{CBiu>5=cFhItKli4<<@UGp>kS{f{< zAEn?!SWrcm{>m~9mXsHn3QP0n7F4l|Z|Z7bW-+TiEf2OyPzXfVKFVC3&}yleS(&xD3I0=DV7)6ys0}@v7c>^|j1a#oZzYU;Ex_c48I!J8Y*213P z@+DwH01F2JrUwCb)(4o1A=4%hAgjCqkQIhN=9O1}!6vV$JHRIHh7N;`FLZqS?ZAeT zbYVG&Tggco2Qw;To_Gk+MtPkR`^{1pUWf#6?B?lI*FbQqBT+N+IrJMHW>!`N`o(f^1y zzlH#a!Qss>E+72uU7-Ez6nqrWF1XMRgUM1Let-;+*xrMCLOrlIhJ+BYAlxrVf?)?7 zd9CsW1?x-eQvvL!0bRMT+9Ax0rS(G)%K&MA6MPBI#M%;68PXA3CHO`O))5yOQwTUS zvtN!mV^s)f=%8I`To&k4fSlp{W4DBEEC5{}hE7PFzi~kifCiO6}bTZa`Gi9aSy~1U9 z4@gt260;*vbketKN2oWn7n)g@d7vJ?s4xQ|H^)T%;;@B6ni-A+F*spjNT?mY$&{pc zJ`hjYN%W5npKNpEO>6a^8_5F>$>3lNNe1=gdJ5}4Hfgt+ZQ%&^>? zM6am_IXh>MQK`ID>`$@EOm0roiYpM*X6!7jvst^K$MiT68so$~cr_DSYt0cu1=TR6 z=wSgBJ#k&@&r=(dgjM(HDlxs$W{Gm_r|%5IEXizd5wNi*beUmNv?qy}7(@PlUYy#9 z+hYavE+dleh*wRiA6_^!CJPrOIBWL>PaOUv#(qlMYwase)V%B0l3n*&s$d5`jSl=Acal^2&anI3T?eZc;b9Us%Wbyx zhH2D^*QvT`CdB+srrt2?eEsw?k1=qV{7(<-IjN0Kw*jRTmvz#9G;qr7cCh~j1wReU zct2ytG!aFDu}IUA1LlK&s7h^t<$764$x?bj76(y*p68X4oKvEdl2dMfC^0b*Jd`Gb z$n-Pv7mQ35Ru*xdJcx(^*+irkWQA6kNv^Paq>1Ay;v(PZF36C$3|(bphKfJs|#skYR$6VR8~kGC^;`j0}^E9Mg<{pwo;DGsG7~CjBd) zu!kZ9DK~R2GE@n1XD4wqTH7oi~3QkN?d_S|vdw z{0@T8BlzzK{s)5J9Ht&vdhmNbKKgwhYyAO&KSc0H2>#edPrH$Hf8uYb5ghYX9-=Y- zm*f$Kuc3#N0VMOkr67f3{ucy)hTyjlypF)f1?Eizk_;GsAW&qlc~uT>Y7^$6W=Qsk zn%(vqt>mg$XzW1_6LinvV6X*ng5KQ&YpGkfaeDP=U^MtuB{uejj2|J?w6jE)#|0q zTFZSCsaEw)y;?Oth+4l7Yc^9ACP~$G19#@TY@=a5i2$4;-(ulw2PSl;tUhLCENcS= zSr}<|_+Af7JXuO5?m+O(hhIm);+)^`aF)P-;ee%+a*a#s1})5L0Nl$y%whNg&~!1& zQAL}_wQ;t5m!;R!lhIN%A2sQdjfbM4Xeulx-yKg=7!w~n#}o89PM@Qcwh)%N&aHwl z;C}p(C(qr&Y&+(Dcb9Hww*3H`ZNm;8X4`2!!)DuAeT>bvA7sOAc^AX&DSev0Q--*I zC_JOjvQc!_jnC=x93OMz`}7jWb8h@0->f^&M%_}Spg*iH>SbzcTtBMcK`9gZG5t7w zPr79uVdHF+De8|3v+T;0`_41Uo_6E+==TaEZ8!dyexH7t%g(wfZ`RLnjye4;`u)_( zJezaxqr?BKlOBd{?VCfc5%>9vqn6u$&wJ+1Y-=g(n@f*$+Rt}do5E(U^d#RQE1fee zNZy%$dc0F>9e>oNoo{18XFFW*ho0c=D`s*500{V zaE#4^8BVQ|(O>*rW{nk3dAmtm64f@|NH*Hwy*BL?FYmLN*a zLVue12$(9*Yzy<{S!<$+Ya&u}R+n*hUsu^&gL2T@eO9TtAM!#N0_kC5ZzFmXW&+g( zFAqXC3pn8BJ-~TmfxHLxu*g@C0{IWQ`48>Le>j-Gdc@6l1o=39F_5=^Y#r_2fm9yN zF*i2LvEy!Rfn!T<>>$TZxUs_=JL$&C96QA(*KwBz@@)=RzvJ8S?}r~KD}33qqINBv ziE-GVw=d#?S`D|M#ib19n3m01UPWMBK}kBHfsOTuy|I(N*wA&O4V&xgdTV1h`(rk9 zHkT0aC3n8Hk0ocm1;N9AL;V#OBV+za7`(0l;aMf#*|c0EZzm5m3?Fr%dv#riMPX1} zA$r!NJy)$H8|@A59gHc=EI?3r8x+A$zy;8ghFLc@EVI*gqSSrPR7rV7a1xwyVtB!i z!*7-cZMx2unSW{TBPq}vOy9^@j=5xD$J*Pe|X}2^k5e8cDE@z=hN>4#tBQ|>%llZ2%Mp$cQN&bv3FR7W;U&q_-@3s zg8L8?^nu6%;tlb)H91UGz5zpUh@W;d1b5BA70(R38P?@Zse3m)Met;PT8GJXn8Sz_ z#l`gzQ*X^R^^Wy_*}!m}3zt zljeBj(vw!EpJns_TcdEm)O$>izzm#w8uCrL;ZQ4TzKQWS?`Ft`1hdPW#+y8A(Jmy{0H!G6InzO~v zv%5eR-1{e#+uPSpj6l?F;_T37!rF;>@cbcYKGkkfXpx~u##z5j(BrEg>TsH+H6iy4 zyD~kTeadxzr5}UD4gz;Ju;q8yhW(@tv(J#F^-~aF<5Cae1ZN1AL%iAe8M@8xw@`Z- zq3v(Oz%uJ<{uN!KS@~W&`ZTU8L1!7`8gboqtRElrM_1A6io(}pT^(pI?&hWKM!iJ3 z`ik6zbxPijQ6CHFdoR(>Qp$KRg~mEzCm`bT#@PUeKzP4Pe}Xd6Au^kMQ8^<~%|&QW z*EBmp8(3>j4d*XN;)+vq8htEEG?M6)#Oj0;k3LQPO4E0S`B<8C*9guf7@H&agO7{D}7JUcVP;blQG^2d(s_mk;bd={Lk4%8rKxh|Gao6SWzu{ z{3B{_8W+UuF?-6MUJ1e9MNrbqC=tRXC&i3$b;S@4SCXuyb7Ml&`qGbo0>1w)7_C$8 z_i|Zv#`#DU8ow&h@$OwgPF~)ToHs682BqoZ;1zdwfA)!k_9z0IPkUJkN-|l*36qV0 z-j#J9cQa-4e8YIb{G{Zm8AYY$9P%GPFoWRZ$PaHQPQ<-DYT_opz{{+14ZT48j3IO# ztRjK6g?R`;3Bh3s$}M1&I-G?sZ1jZF+el>xyXDUu*ed|)Ry z*6OS_f2^)>vvJCQmluHaY7q2FQsfaO#PttI=Y)ZuI~lu`JSA#h9-ii9uW6VL^36Q% zqUgF1%bO=49!>-%)nOynk=l2rQD1{;uGOI1UR*2>wk{oYkbtYHl>UoA;5H+0O)e-o zqJp%WVOhDU$!Yq~w~|$oYLpJmqymdVO~LKbe~Ft4-l@VWFsEeI0wMgvT7i#K+zS^oAWTeA63qywFT?N-B_& z=9EkzCCe#efs|Y`-!Cx!8n5PexNn%SCIjvp!o*{##ASu(%$oFFIDFRDnnkEiT^9~d ze_7N089nB@aG3R7ILzsB*Revvb>T2iG{qUd0Gs5J2iYM*%5}_;J|nfK>0O53X`@aX zUXd?}wA_#bhkc@FemfD-j_<%hwDgBoslVTM;IP0h6H@HJVaj)xf<$q`K}Cf54+I>ZyPOhYUM#c%FJt_8mBg9%R{pgXqDS z--DQ*4LEQJ_8{i>VBGJ)#2|I32U*{N!%=-Q;J~3}YyCR{4jhhQHtGBLE)E?2`G^CD zC3e|x!gbkj5~F!01cwd1R4>h@{ioctY;O!s3!q%@FVkt0UGB< zX5svxe}-moYFi-~%=YGb^Syn&e-e%5Ed=qS3`2fTJ8R~;N_qD87J3JI2YZKhKws-F z2cd7>-+aKHg(F)U&tdC9d(JND^HVT;Izq8|Keos@_qjRC9NX{4j#ADA`;eRS4vHP{ zW5+n>K{w}d`>=Z*L|l6~LiO*Pl0bLai}YL)&or`!?6N*= zhbr!o0bkJfl6a!^esrjfJE$*S8^=c4IKD?4C;U2w+c@F1VLj4+lv+H&7v)ddC$aPJ z?c)#;FK(OMIRcwvlK+r@0 zyL{oEV4Z@k)K1S2W*b2Vf58TVOBCGD%wr%tj^kt(1lOGv@qL%L;on8CWb0-~$~z3kI% zzDEdi3&Gb*9+5Zf0>bPeV0&@atFkoZy^_aQe*=PDygUf!2UiiWf8o;mCC?<9C05_g z1Y)&bvzR~>f*Lk{@ZC2EP4E#0G@jUS<|`4+0q*iyClT;w}_iG ze;ol-!{t+7xXT7M2!gAPj&Err2tq+?2O`VC$eqE+U9J;Ix4fXT-139SaxijdFmjiZ z64^bE4kEfd9KCZme|neaOX5uc1RP43--zHeqHjU)5Q4`Md<6)|OsAz+1H^76i-aIC zJ4o@UQc);CHdfL|7?6%mjBDI5I~N28a4PV;ES^1cr_O~+%I^b5(}Nxi$Cm@y2c@I+ zO?I-rQHkOOp3HCdN!MZD7Y9|M1i?=PeP4*btddq|13oa~e=OvQ^M#fj9x#+09xy_# z2MopafT4wzsD`T;0~ujj4G;WWsO;xLouKlkgLzoiI4#GCT81}_Qt&zG52G|f|K8dQ z2CUkA!Q=1BZ`2D0QxYLak6d3CAvZ1V(Htz13gOb7OI<|lFzzE$EW@#go#a@SV^KTB zu`!Ot>@>%6f9!l{j5u?RsEa(ytu#B&XLzAE-ka!6_KH@l8K+OeF0fNGg>tk0p*N++ zsJ0|=)8OnCICb#jaS_LbN1|G$T&H1*J%tm;O5wJ&p2X=(-zl7S35jSGl%5{cM*RA; zOQ9J~4DgIa<5ZHp+4(MvT-Z>*H3% z+WGYd`0U+EVTYD3)S)Eob_ZwLme}DU^@N|W%n4gD*GUOI#;uN3Yw>eAyXz5n4t4T% zoVVlYf0I7qe-fxF+IIc>neULjlL?DjNFE_kE$`bK)jx$YPa`!oJE|Dh)Gc1BPR*J&IivK;Wk0#j{Ge~;jbfYf&A9wn5mzJ&UhBwV(8MiUp9 ziIc-_WITY~Pq-q<$_o`zN}Ki>q=AsH_EqAhk~+&3ZAcVV>=IT<;JR@Fa#G3-JB+v< z###@Qig2mWP^m1f@B}1|R0>YXc9x2r5sH*B_a(Nbu-(Sad~w=4Ng;2;y5EZOimuh` ze_}B+g~?PJcFI;vENi^xRUH$nn&MkgUexqd4*6CHtDr?}pJc+t#d2OO$H7GJwsLk` zW>`(Ub}QV+Dm67YNDaLr`Zh>j4kRxlxx!t<)9B*DKKUipch>_`Tn%?}*`G|&4RJ$v zhf2%yCbPqS&bK|hmroX3Y04}Qzy*1kf4Kw|5?S|dE#V{B%(28h%JN^0O2kkKvgKxc z3U_lg!jVdoRZn~q7sj_C)Ru7}IoAz0wiIflBDFz2OJ7{wC=Qi6r~w5f2ym4 z$n>)~PX}hG!}op5V}ev?qMbF$)4mjzsq}$iAd|f;B3;H4%V=5g1)(gwsKO{s+-hkV zwdV~d1y|W-;{xCJ>N<%>XkJ%4W}{wfxh8~_5U8uF5UdK`3i@hJ?V3M}%3%;(NwSS_ zRY;McHwF>t#u6NJ#lIus#7wnLe=S=koi$Z-=JWoVR3_wkLS+*~j6uV;K(P|;h11{G z{HU6BxRRlz3D&|F|NT4^L<;+65duFfJDNNei>d6zMPt!bs26P?WN$6V72#Y_&K2Wa zan6w~%OlSA z8~of$66#A{m3t}ncA8?PLYnHu)e-n*cA9lAVVD$Lo8qpofXnf)ZpuD~Zzm1(05A zM40Ij%70)uKdWK#)2Qe zxQ8XXBzo7|j~N}n)o*cuTiQ=8L5;NE#xzn)xF<^GA5*7u}g(q>-2HGWYH%9fn1!{pgAYt-3HAHp@OK zchoz+#A$X1#0^J;Kw-gGzZ~?12P`+3^yLO~zGz{eFHjihfClQH0phtRd${S7KK5Z^ zE#k4~4J0)Yyxl`ce*yIo3n}g#Qu~;9A^HhCL1k{XJls~kBXCWgJ$c-^=l3AslO5-h zd7n?ZJ%CXKK9zgJ*f5u<% z3oZ`|nyYyAFoH)AfWR;xMerDcvp#W9=dSw9t|J!Q?tZU3RO*1Xy8@6F9<~qyKjUG^t5~!2KKPvVRAD|j4Z2Zj8pmQ?}+tvGq_NhmiF`5Ltig{}p5n8{7VvOG)JTM9=dLfC9^#$HhCo0WiTg0D!__ z8C(pY@K6ASe}{%pc$&6uipnX_kF&l%!{sxCt_y>p2%)&oeKnvDQ4@+&7$GXw9t>=xL&}!Sm-H=|gN;vzJi%y;#aC_Ut- zNA^gM?vWnbBRwu`li73M_Y*n`XMoI9UExbhe-PKnY|*R@FOs_tG%g*T^>JZw`;^gIL;%?Yku=CM$U+xsbN(w@RqKBNkmL)gcjIn_0d zsNOiJUbt*HBe~C10zbe*@riyBty7P`h?Z|z^K?e?Aw1(j$d0e7u26D@AUw+u2DOg5 zX5iy+n|+EBqQ;v^elv?yg8U>=)~E+;fAH@0%fW7oq( ztoDKTKL75z^j;BvMeSPbJJ1rarc|Q;!T+%DL{1~rzOP@>f!I6g$XQGCxi|J=i;>CyDMqe>f#Q zPjAgXrMijBTb1oY%|p5}@FLbb%-+ZjQ~F_lryb#uAL2E71S=Qtu=m>sX*Z+-wSFhn zO1zIADM(*%%~MqK3`z!Tr*V9z2jLYt2xEIePk$tA@BeQ3Wx2O#FXC4rK0J*J3V^u1 zSY6yjJ^s<*%L)B5I2D4B-Cv{|MMXI9yCe%Kw{EcIdO18u9%;#mts7R2HCg4Oqwpk> zSHwp$l#rE(D+v)z@#zaweQ{g)<9_o4X94UT;3xb8`p3O~IT}NRofWb^f0VtPjJi~W z(>8H;tBb*^8=VclsB3-}!FlhPhv#ONQg0Z#Q}k?}Jg9mX!)WLugaPZ?p%!Bloe`J+nl9iYuM$a0q z-c8FBD(Zv6A$&8eq}?leAbqI*o8b@>Rzw74;kut4Jf_*vVddlmXqPz~niKDp9 zJv&Mi1&6W2S-<~FNxJO$UxDxI9((n;Mr`4u(p9)+lbgZ;7@ak+`WG(Rns9I@vpXs{ z5R;qmK?3iNS~E&Ce?~Om-w`QsE+1nLk0CdAf^#Q#s*Z&YguuWrIQtv@X3x}T|0yA0l!f9Cqj}02NlxRn@5+&9{6bKOsi9`wYv8&4QgRF z%n5g|tY7G~ZYY)Lnz6QtUoEL5dAGYo2kth@g-XKe_;m-gkc`qTnRlT{Mg1%T?uq#_ zAC-zJ#pd)!MYP>d3d*?Q4_+shVaZOl0_?ABUi@m zSN_C@<3N#fnchYTirr&8Nl@g_7FA~D_|2#riW>_B)*Z%KU=t>8X6wisg!q@~X9L92 z_)Y|WZgmhw^WXdj2>#(N-NAjOe_cJM+m-u z7Z~8a*Rjy8z3T5Dfypkv41|k%uk!Eb$dA+`0a$qkx(ut|l7z!jzPu^(F}?fgs*epe2cgzQ0Y|nTdAI(qncc! zA7K**V;o#LX5rC!@GO$~4NQyHH}#q@QI*A=MXc^}F5vK+eRoGauicddV2eZM~(88x))@Reuax|zFy&(e^j!UQ2!dG`Bf}&hVf#f*7Dlo-m#Nx z?}watf|-J2$^~``^-kMrv^RJBya%oy-iOt6kasO8lp<&oMPsdAQYo^(AV`hF3cS7T z*#3Xf9YCA^9&o^o3e(wTyTLupyF#~fqCAR(JlDxV91VE*!X!9cd}9vmT3mn_g-!; z1pDrKY>f`xrl0UVx9;Ms(1wo&xp|QK7n_uDe~^8*PO`qG$lpcEJ;|&@oWJ9Cf1bbd z_7s0p{-$J4O+rHg$mUt~9kbz|cE*OS;*4FSH-~Vmp7-S&a(u{JEa3gHeE84N@geWo zfl^|i-|*EFZ^SJkD=b(v!X6RX@4_{2=a*;yT-+j7rrh80+vz5?GFjg=O?WRD@s!Gv z1y4XBIETHQD^@aoJ}@#=Y1(z;f9l<>NqO-V{F35sei$zSf1MBDuRZ-RsyX87;|dss zq>^NrfbhvUFHfsbY!p~Q;{MSIol|zjg17d}_%qV~zn&TUFz^_1`e%#} z`)4%6G9N`>h&RScsNSlrZ3`+LL@5E<3s&Oa9Uz0Ey-!gp|sRX z5)R*H@`H+%`hc<`>nS~bEh^q$m0yv&58{`bthAdigQNMX+)E?JvlBGIY2tiTk&fS4 zdPTnUPIg9^(X-d0cABMlnFj8%(etwlAC%FH56F~bjCvCFN0NO>e`eFum#my<>nbix z%KS@Hsh1Qw<}!NjBVjuW-34EC-ytNxbhGdZE~Qv_6&K#_UC|XwtzWl3SpLQSIWnZ8hf8cfFi>>{A@-1rrL$7v08bCWE z2nWy%Uu=uNcdPOIf9aPv9@lP4xPaTUmDj&is9m|$7;b*4wg1$uY6lA6yY@RJmwU9K zy5zcFB8v8%5PB&Cq1O-iE&RYx3r_3|SnSIi=KYG-&eq{uFL1BGj{e}Bfh7T-VGZ=C zfF9B2CB#J(t2`xrGmo2wEQ^stEmC%O-j>Ws*W{rN#?P>Ie?K-<%2;#(n&luu4HZ`wZToK06m2^=N#Sy2vklZ8f|chlH17^F@?esQVY zUh*755?jMR$IC1r-zrXVo@%!apXR3644`c*lS40-unlMiAAg=AL+DL8mpToT#~YzXW@!)Fed{v7d<1qWaFZoQ0xevi?}i({Bwe9Q)Y!; zSH(~272hL?zqdx^{{v7<0|XQR000O8EPP*A>c$JA6dC{kqelP$GXMYpbZ>HFXk>DA zmvGJpE`N|C*I9u3rdI2&xnFj(?l`t%CEnScalCdM~l`v5PyV!6(;_v@c9CKyr)D#umxLe3kLrd z4UxVjLxOLqEp=o=7BNh2E1is?(zDXeb~Hny=S(}-$s74j!6)XYDx%pBoEbq40SMU$7S;d~qy%mBN=OeA!-s@RhOfGq!kD zsIA_`zTB*dq2#*Y=C}K9-EVeXs|{}juWtFi!^}?8t;wNM?=mOM_?EZpg=*W{cbEsU zw0hU|e9QIm`E{q!^nA8|Fi+9ezGyd`D}T(fo0MyPaunt0+j|upN5GMTQ4wOgX0@*X#`cEK*fw`P~@GJNO0DJX)GhjvxN@_5Ns0j5b_ zhkxj=_mTh|>k04OUe|MMz3J-LUUBU{gzY){>kdTp9M`uf>T8b0+@{;m@!4XK&wtCz z>g{;f%(Xn_y|$*C?>Y6;lobE%_z8;T zS1e|A92k~V%1+mI+WMoeyLP#2_uEeGY25`cosCz4qEVu{lo|yo8VUS(%i#EeF9yO* zX($~Eq7cBdDcizT;f}ajQ^Jhb?|(Urp?rp#X*S)aZ<=9-GOtOY;yLYYR))|!Vwf|{ zdfW0m)4U`6=Tlq#X4}57Wy2I%Yd78gjq^92x@2DZ%mt^>xZrnLeaB{fc*3c30c!3u ztLd)w_E`yXJA<`Tu)bnhJXjhZ-?g|NV-3RwVTu|A~*g_!|-hoNBEq|?~-z9wC z6$Vlu4#hw^6bE8}A|h`xm^#8;bf9%P2g)_u(1Pf(1C_1Gtb)CfY2b*43i`2G@ZruJ zhLy~Q3Fym)YSvN`F_GF?R@R0XEiDjQIa|4n z&w2P1R)l$BSUeO4xgZDcCG=kwc*qj?`s%P8WP_ZYSrHo8aar=wz(K1-)GKUiO(O^cJ`WehlYU7gMV{S*s>qfw`~3V zv-(!8O7o1ZQs-~CyOz&Z&|?8TL?4tDPO4C0mTQNa+wYh-X6$1aoWoZv(=+nuyAcgu zyX!W>5(d`e2%!v$FjSqU>-9UeLNwT0mJfMrR=aJsyB?@SkV@99^VX={zTfNnylPo$ zTGNFp-~$9f=}rTDY=7rQsGv5QoG#f&MLmS0yhsy8lNRBV7Z+j5EQ+(@EW95qPE4FA z*_aq8N5z0iWt9Zu86l8ilrnsj*jaRFG*BLE z8Kz@xm9Fb}>_POVzLndKTT`f?*rVw1KJiiQ`4dfLkAw3Wtbdxun+Z*u7Y`OD8phMs z5a?ZHR~ib3!cc^{tN79oS_gA612Q598Q!it3K#DN&+&(! z4`r)fzoW2o)U1wUxeSX5t0a+pgiRL|@Ew&m??T)J_9<`-4U+enRo@R4j5Rr|nzLuM z`Rj6ckN4$YQ4q^ANYdV;qViDiZZc)QgbQwuD_4@)>YP3NyC9 z-{bOR$Xj)%R^;D=A3dNT~eSfRzT5R8}GmsqhtaSY3JNECIvIzQjBR(> zb&J{5m8e_D^vL+fVD{-`%E2&@Z&` zBq?z@>a=?%QMdkR(;ZI>!CT-DsV~2FMdxTvY5(nU`uF#rCw0A9&!px+Mo3}br-bR) z2Y*s8n5ZxX6BVamstAG%A*7aNMVyqE(V?l0vog#jt>mj{Qtfb=R#=nl1=c5NGC4J7 zxD3-`{v~v-p!2iI%~wsI3& zEBaiYW^PLCB0jYMrd*AlGO&oC)`bOzy?=_}G*Dd?zBSOOInbW~T@C2HR>4-60iFW2 zAub7r*po%j9vu>=O1O4i7W5 z;;8|Sp$cf51w_zng;v4rFbA-p`G0v>0khzf^Yg7@fTLcrGq)v3lOr64G>EUTYGwe1 za|FV9Dp7?w@i$ObImko3U>$8$hE<4N1hgs!`DX;z2EUm&bU1q`eET6$AoQNYaC(}- zr>_8jDe!kw76rGuE_gq>2y%&kUqktXwth!sWoq+$g7$N~G+4tIKwgWH8Glfsx@Gq; z#j`=l1^^$F-PxctT(ooKYKI~aK{?>{hFphBK^gL_1eKtG>wYcI5wIq)t2A$Mu8zQ* zli^h!;m!D&^KS)IV$<#?bYEL0**2_41r`VP=E?z? z*vP^0lD1C7%CLj zv2M^y~gjum;;1m5K~-EezEWH2c}1mOwTv z2@{Y#fz)6s{ge>fRe#Uo*h+QhPJ!k%`vN-8#WR`V;>W%ix0gMS)2uWG(Y%`w?AS|F zx(QkHPZC{B#EZ5h5ij!Y@{#U}iC1QuLS*=D68`4dPou{x=->_>`xzldfuB$6ngA|) zZM-%ktVM#rWz0jK0IV&Rvsx+tFhDJa94v9DeW44IeZxOtJAYA)zK>GvEK#jy=ZI?a zc7dpNj<#lzYRh(osJ3d)j8W};ICG>}YhQ`5HVQgm{0ztipMuG4JnY<1aAw`(Jm*4up#GOFno>-Jrn zXW_JI6N_?Pqkkgb0PlL#b6^&dNp`#Ec@FE8g9Qckn)ThN#cqA4%aiee@KbFVXa2Ph$7rBZ z;{Ny6l02e9&B?sR?ST_>9qap4*7)!FeH;m^-v$Gt?|(UbETAFKAN3tD!ube5k6gP( z8D6`lqs)wvVP;n$V?;bT-m}NKn-gqmM_-y@Xf~M<2)~RIU%^0QKIGPr! zce=EWWn)v0>DD+nJ|)q+02xVM={YiHxVcWlq7#7=?6xFML<>5QiVjMonewDeH}9g| zb{C=eZhtme8Ii#1+Qe#>7VV(p^}6g3PYqz2r)w z@T%}Ota`T47ucJ)afI7R5IgUxWF!I%+akd4o?pP-V(=-sI`{zquy281Ir1y|6+m2d zQMf6-Es{B;Y_ea7TXHb}Wp~%@UU!quzV@(p4S#5hOwCrZz7UOxyP?F^;jvEo zY=Ip_2L+kvpa5XUFJh{j;)}x99|O24L0n};fawD{+Ujjc4OTSdImr6Lu#CV15G22~ zhm);U*%b#GJymyUSD}^L6~BOo2s6W3s(+^jvGZdwDios-h{HLuZ1{I6C=Tbrc3OnV zoDYiT!kD!*yAGC)w>oAom6G^{pkyviiT~45eP*$<(z-G6Vl z4J|&Y;8P6`Hy9oug&AhK4TqsF06V_vrY0rIeVDa8I-d%`Sn7iIM6)a`H$9WDf|Mt{ zbJfM)wOAe3DtykPO=A?JB+-!t9^tXaF!VeLViPLqTsP6%C_@H(v8KWyX)JtrEEZs* z0Vc{N@xp8rCCt#a!=$CNFv=0Fkbfxh4{`QiB&j+lRz+RZGs!^k`@ieDbKAO)X(;>tRMn*#~8D^4#rE1o6lW)Ic4If!d;TFgkMs&C1W)B2!!o zG~8$cUv&k~)Py101?pIwe2}L&kPmGW2w+WQg93;~(a*JTqXGO{MG#lXR)0X$O6Uus zsFDI8|6$qAfPOB4aFhQc81)dV0@J#Tn;m=tHy}L-E#w>Ixc{&k6lvolH=MDvK@Q&J zK?UAsg9`XpK{-^TBU5b~l|&_|(!|e2Cq!hgjzqvl$3e|r-g5Ei&gEx!F3Cl0j@`lt z--u_$=s=I#eLS%KCO)q0+f z+h=QnkUm73FxIwcdc%a%=>gUYGV06tp{Ga4u*V~ds(A3w(Ruy;tbh0Sa)ie4?2cU$ zPO!=s#iLgFl(p`DGt1dCI73fuhBK_I5?7+K$`scRaK>@RdgbI~nSR?|$dw;#D`=pkJ($?S~|(v;uTNYLA7?Q z`VOz~2RU`aEuYEh*JVkL$DM#3XL0flOvg{P_b#ps#~kd%iru>+oc3T3m7^^Jg6HND z{c{a50QHIoSbw&Z9AM?iVv{$iSgw2u+&25AMBUI5ehr<`F&>$!Uq$CD=+G8=`qXbC z`V=GT1u@b|DI-ccICE4nOh5T6r`M5x7bZ@QmSc#cGZZlb9BBAEbT14$j^mv#w=f2s z9U*3cm6IhnQ(Ay>t^A=pEZ~JjSYfh&epx6%>j~1x(k#G#a5Co(BQM4Hpmr(P|0u zV~9p$hlqCff8KrfT|%^)6pB5zEyVDJ#8zA6gOL~s69n&)x(x3!u>y8(y{AeZmZgI#u@mz%#%GYqRou$c!2Pt{!oH#44qV*sy%IBn2c&9(Z$C@OT2U_MUW*VBvXAO(E0>HGg=fTW6y)k=oP?N$k7mOu79+C}5?* ztjNJ^nnc}iWLAr=ZE*wpyTW_IwBHm?g=wt>)5If~wmPMcMyDjd9LpG;lHAE14`!!j zGSsaXs$pfK zFn{X>Ilk$G0Vf}bd?cBx2MkKQWZ5kX_ezcdFbn%4N5P?OV zb}9^`n{g*)ND-hfpsB!Lbr{{|fs^X;4+?cwdSd^$h>ldpT`kccbu}fx@!ciDIwqWm zb*U|Vj&-y_gj+}Q8N7Op*TD-mXw^drbboJgShDfVzD(d(2JlmCg>Ej%3HVhA{4!kc zhT0Y$&RJ~#F4l%~V6;d7y+pfB13OaENDz2S-rotOUK6i};IBp;W^VPjw;eVO7Vl&y zV3A)sqESy}|NTU7j>F?^RGw8*<|BAq#69=r2~{?o9?zuLy8oEGcXVoc1Ok)~1%JF} zbZjgQI8h67yU2bSqB|Ao4&DnvJ}5kod(K%{Pm4s4_sWUV0s+#!r9qkJIH>rU7BFcm z3$@pXVykp-tqOj$u?Q4fiYT@U^jM`l%Jf~v4ZkRlGPE|kE#i*`;H`qY{{!4KoC$Im z=NW;XHU123SAvnU+fCOoNi}dlPQ+vawArtqb2|~NUqxq~#A&PBZL@FVJ07Nm8M+g~zC+Izz{*CL z+v?YMNiT9aIgYh!XHJ3G>=1L#(gi8}Wdl9nsadJ%nfMbRz|(GTef$;b0Iz(hV!w{L z{08R2;e40<8v5W5kc{k}gMV6fJ$~2-#T%ixZ)8XfpO)gkk5d0UNqt1|k|v&m=PI4K zoul&sEg^eNS_WT$Jb50FuL_@{xCpGTJg20 zztQ`hF?!!Y2QP;nOXB}@0*Nn8Ha5m^g=6?{$I?nH&VFmWh!J7qs(*DbM%cytr-87^ zKiTu#acpL_e?pKwd$c_3t1)NCVgC2HRfP8Fd4`_L^gN5LiJs>O zp9j33r+jDVdj?Q?p7NWc@3~`uegPnU0c(P>BB;mr^4PmJdVeR-Ur0cIHiG&Yg8D^z zu8#RF(eqs7H%op9=Q9BFO9bQcU?qBAj^0;;m0%T&gW1RsI0J^j4Em*vgR^8DoDI%E z>pw=u!N(?ygLB6k2M>^O@Br2H0jwvubL2w(8cJj$=wu@3(AJL!9}mvaq46IIQwX1E z`F)~2`y+IS?0^4Qi141cp5Zla_NR$TIF{!hJT1?&KSSrw(fJE>?x6FR0{)T#EtCyz zq8J4G8zA0Bjz0nSk8s}LIPbH+LZ1=SXZFmx&kSjA9X=a|wE0EK& z{ePh@dXscfyhA_9_KT^vqR9Ue)`!1k2*tm=guFi=y?@2j{|Hk5!&CIyeF6R((oyiA zriAY|_Gf=B+za7|dY7YYVJmYzY4~Cf$>z1KIDzO-=Pd>gVXs@SiL{i(Em!0YxiV zn^KTg>gWeU0gjh0=?5MpvEs0S5KIW6hlIfLNRWvD36SywMf|W({sDy)ga9G)gCFn% zmvHF^B7e&tebhPKVC^(s^}0@V zdMDR4>Up}(b&FECRQ}yZSnHhM-P?$44oaOmFAd z$LFo454Wo8LTRlH+@{~^xpt?P3-xACIHA$8FFV2ubH43e^um1C@kOf%_XEGx@!%oz z8GmQJ<@w_B_7ZhjIU{;~NBEb|2nR=p;hOtT%8I_dk3iwDy24pqQ{57RyV z>-MI+vcr|K=cGjO5?xCPRHDfN3U z$6+ryt@RDxONVWW7OV{?d#f``p1|o%no`nf|GY-lbMPFik8atmj*SPE9S)v3f4=KE z=g;2*7Z;jvLGL(!9xv0CN%E&<;eUeU!q%#^%FMcCw;Q%PeRsr0@r&)~#Uh!4J?M*O zG6{Pidd=)S+(Ea|?erVOoz>$lcXVH&`2y6#%q06(fvBN-mYz2po2SF|MAz=Lwk3rf zztHP-M#j6e;lP%Ps^3ex%1!odvF`XI(~^vFz?7&%=Fo5*7i_<|(ZI3Cyno&9_dA!X z)MejHqh-NKxIKSlKn^V28~D}ZYn`4wI+M6bKAb#7%+_cEIrw5gd(_y^k|V=N=FIlr z$C_J?xX|;Q8@B>p-iPQ>@WW2@BSh9`*)w#Krn`dghE3d*)cRE*<5F# z28425g)iF)b)=eCLFch^tA9@j{BD*q!WOT!=;QfN_{>)VwyO@+J*Kb#t{YmQLa7HD zl(|5M(g<=;<^!X5nk#{}rNFm}-%xA%g&^-+yQ+95$ge4`8swq27?@C&f&!G~z=E<8 z6rr5r>@2&kt%hpT2{mA?+H{yB(I|?zO0&@b8Q?b>VUG4sRG?Orv45Dt_VNg=!)=xV zLaXJq-~?8yz(IG52`iKAHDhD8;N zH)C--7H`4g4k)fGVWA;s(rAcjsCn(N3xigN-*8@xzjtjAU6cv%+)>BJGNO0SX+boJ9Z3TA3|GTEVDhu zy90;@u7*Zjqp;08HcRVlCl4PJJ_Yz#`1CNp$6$n)pH+8^oqwWl4h!m`P13swqHCk*-SZGS@EZ;@g3Rz1kJ7MekmNyD8snPhV88DWU=+%)kh< zdu*p1;4`XtodcP-4{b5=IzG)ce9o=VNYG<39w%voYc`zYIT&>w$lq*R+;|ao1?GYE zd8#*Ws5hy;Fn?O#Ubv?8JH#XlaJSfAS_j5zFLP~)&9R+|f4F@_)&~{;DE8k~)|Ewk z@;3M!C9DYvBBTXZ@g*pxjl%3=L)3^rrzyb%|l(}L2PXGFpxRazaZCeBOEG&Q-(&BV!`i|$*l_71D(D3YTzvD;& zk}N^o7t4-NxfJH8Z{5OEiG){iqs6)7;-oy19gmQm56Dx}@M=MSq=x()`}`ZDS-x`ktnmks0MkW{^tx zBFT)l!WAf0_Am_888RYhqDYj#P`T?0T#ZDph7f=#B&aNrX9RvB1-!X$c&jC08CA1aA%RWd1 zRDWOX$`baTI>JzmrFY!md6-+losN3uk{VED+=P+73oX+lEe}CUf#iqc1d=A&px8%?BVvt{em3>0-7ut)U4q*kngd_P&!{q?5BFVwST)C*jnA}HBH-f^h z3R3Yftf~lduoP$b2*s=4gMY6re9*n<_Aa>@z;XUg@BDQ{lCAD*`8&PpNAL8W zs~r;$;)CzRQS&5A-hNV?p}R=8hML`xmInwOvT4QJ6NUedSl5Tj6QK#lR-@DNyo@-i zUTC?txZG$8sBZvLgVkPcAP|I}>whiZ3(F%-;$84mJ@0J}9B1397Y1&08CoAgLGV5y zKtSP%fXxCT!Ql;*y8?MGJk)^MHIfxKTtJd!aD>`+t1sosd!eY6Nlu9ml92_=ld~q9 zO2=gj8=Frg%e*g=qab{A8uS2&KzF|^Ex98P_gr$q`RL^EaqmH*pE*TWE9#PJsuq6; z7z^%AFhWkKv+#|g=XSNEOjFyOLgEI*&i3KSL@{Ea;Hr(-LP3u~0J3J8?I53nS^}xT z0)0=Rdj+^tZ>vLXkE9MrA{{IkkV3%EWE<=l&?_g-1^8{uAt&V*LCORM7^(Vdm?N_g zn5E4U15{dyYmV&?gi|x6iAS2FP@_SfrRoBDtPVPa+*xY!bCe-6Jk0 z5^N6sp70fI}gT-wx{lBV8|43Ye^uZfXS~;mL*HEEScT`NfJZAsSVj4 z%gB?OB6sa)5)w<7{~;)T2`@g3BIMpN%axouR)W;=!DkZ!|7m=eMPdNV2H$R8l=}F7 zqIr-rUZ`~(z*(0;^amADi@0W!4(pgw1!~`3o;d5Kmf5r!mNCL#(eR9hN}!Sg)LN3% z;gqgv&wU*Ya!?(rc)zc;!AK8Ou5u03i{ao#*iWn&v)*Y7F{550|I(2POd| zm(KJDKLV#s=y7|D!JMMya6zLtW?0d)L@#ha5KXZQWU%}`l7+n)5 zZh7>D14sXlmx%QTJOMYC#q|e32tyfnRGK<(PnQk$2Ur9#EIy8xY4!(60il<(_6Kw3P$=3E-V#20ftOqO2U&k*EJ*&R0g}^L zpaoL5p6a>l=cKE3OxPqeV{%C&CgKqmIbX%2SX^cio~{+88E|kQ=8G&Fei2V4dM1UG zINSfieZ~u>%Gk+l8bP5b%AB%&=RwkZd>jQ8O#{i- zM}*EP@{81Sp#Hjj@qBXFbhZyAg!CRfdsCkM`>=Qdizl&oKhl4Y&TZeWmry3gvO@a5 z_Bm3}J~3g!9-2c;2Ma@4P%5ec=GB4<=G0pcJnjijaEoQ!Qr~0;JHZiqOD8z;aG;=* z8y!$lFsx6(uzX-pXzE$=v7pOJB6$;Vh{b^%Bn}BoI9`S4fkaH?@OEjAP%B>H_Yt;Z z`jrU76rhI|6v%%)YzFzrJ^XOu9yX;!A_s|ducj#Fqwx{frc(#1_&F@dLy{VMshbqx zhTtr=?eC5$LY_J@h(Nb67^&l2Vi!k8qz5}#bjO@38l1~`swe`OLOw{vl0HYZ1ZTSh z<}!I2?>O*$Z|ZZzssDgJN8>CLeOz}g^&Sd8p>}c_4#t115w~~+*GLilj0^B4YZ~VW zjFSLpO^1^;MeYz-7db>!a_Xt8;@23t=a7SI+I|n%zG-6JgE&pvLtw7$w;VXVF)px? z9sdp#l6Bh19^Zm}*2(GhHeVU40P$(Bhx#7FE0Bvh_bN(K=<$rNv~$RA*h)@K4W%gb zSc4uIEAoF~jQrR!9)}+2F8czEVU8W+cIc6Z9={J`6tD+9hwKSTIC2x9n@gut&jITh zr`VcXr=rk($oSYd^r>0%kKfYoH6Gu)6}WY z_ECv0SHUp6g%n03`u5NRJc=v1wt?7kfiR`Ti-0L}l*Y&aTP{)}qmoHv#56{hrZEzx zEMkAMX1FkZF819qn#6X%g|^@8!WZD679Th_%U=B9!N#AY`Tajl^BY|xPzRV^PP|GC ziA9S8x=hvO-Gc)WS2ha$lA+oq> z5?!u$l7oKOQs7&~Z%V4uWl|l1HiT#egjs(AMH5&=gsS!!%c81u?u2m&?Vw~Oj1$|& z`+DxnO}irzh@(J=D{*Ks0z#NTM#*Du8ZUUp10RcJfY0l+HIZQf<^(FwUEC0WDi~Mf z#ubL3XjdWQNhkH2L)98xqnd?nY9oljbc`*iFF?Ho_4yzV%2)R~9If8smLj&X24jCS zE~w=Q1QiGb<)GBLl_X-7c#-Oj(fW3!|1up!#h-$^XO1%GZh5B4;|uu6iN7kC*HF1DYz<#enAv6i$6C`znvwVX?#jtn(6*m^cra1?B< zVB!X6%V0doP%D^mI1GH*q%XxYIP!n5kI~*3a~;4NWX$y)6X+mCL}O#GNxGP{I|vn0 zp2QS|%hPPD)!Jg12f+d+j1a%YBB&T@p#G&@oTf`*?uv{=oWkPW3B@NsQ3e3=8@5No z5l{R!7LO!6k-8QhV<`q1gDf*I#!>6jr1&y3m)?ajFtd+Lg}Gu(UjRr_ivE9Q!PwC$ zfy?Y+UnkXXownX;IKFo=TED2qV=hH6_(Jb+LVdK&I*kQ;&(Or?%4 zB+Q2ZK#EW?kAPIHAv?75lo??z64L8jCfiKf5{VkPk*C#bH!TKcReyW0QA#EL76ttwx%} zE#?Yr zq-CGDNnT&<(s)+g(J5mu7vtS2Ch6@FM%gy8ljD_skledTJop4mE`Kpv}dDS zy&~o69U9I>xq9RB>z;qYyLS>=jvOf^fw?sqXUZSMCnqCusaqvUV#_#K=Epf$>a!7T zHb8AOCa0xIr%Q8GZt;Zm94rXgrP1Hi5mUU0BW5%|>|k%qmy!JNPG*G7Dof;zi8H|v z`7K15V2A-tbs|&7KAEhCV8r2eT8TUas+570FryRgsmO#tdpUnJIZ)D}OeD%wW%d`) z;_GBg=s+9i$(^nQxn-20P-1`RX}aGAIf|6}G3a4tdr<4|Kr8wRz67m>8(Lo=Qw3?$ z7+Tp@khB`+wnLw_h<^VW`jjU0d2f5;ypEb3Mo6y zLY*1T5+x_Dz|DV$$sbW#&CuvKND7f-qJh~6#psgK5t18p6nquCe?@k;qwX@@id+~yG~^D%Ign)4eUlpG>&F4h ze@T}>0th(&mA9U0I8Q@2vRZH17Y=4DR#D@i!aRUe`DQ`^q+V16yt{qiiTIS;&V+VO# z$$$Dsj3TR~y8bjdDDV)u&~|iCwdmR{ls6*Q2Czt;p#(UZ>V3uF=F;EH6lc zO9HD4P||L}Or}yMPo8-C)JO7BGkxeE;hFvqc0`sKh_*g5$Chi2ZPzZxRWVK#ZDUj$*WHFJ1&vvgRp#ZV~F`6FCu%uoG}l55?V2f3d5$$o-v z^Ru9TA0{b3Ji0Erwmy#HN27rCgO9j>F!(SYAB+NG(mlOsyZlWekU(-}CbZfO{6(WEb&kvrFtU zeyc%kR-a4k3cLDL!ZI7bl{Cq1VyUm@m(J6F)Bg`0x;gk;j&S-k#OW@_IJDF)Ta4Nn zgo)D~`AOm&@c3cKg2dtRBn=}pdNFs>LE!ZKaX313;-0gAifJ(33m6NdzB7(lFiJ|U zKlQmk4$^=p?~7~t69b$#qiE}sm`z4O=lvJBt*9tQFXwi72xip(CLY!eXM|_wKsgqF zcGDY9d{92-_nnmcVMOXIXS|toww!y*v9z51;4pD~9vlzCWyHk2hyG|1Bul~cMc{u zQXY22(r8h|;(Cr)>B`!QVPZYUGKBak}Kz^T7+t3FEUCn_x~VtZ!-A3G~M^i^a^saA69< z_g-A)b{qx8N=YZ;^Jox{PI2=SXD?0%FJV|bYp<~RGZy@45P&xqI~qTVZk7YF1?0~F z5+0A8AWC65Fe8}O2sRNoEa>xpV8z>d;RtpSFmGWfXK(Fd7;WVwT3#(Ckx>NX$F!-( zCf1vbM&6#Eb_X8aefcVS0T`x1a{2*6`@KWK$`Pzcg)w%rxH|a+?j4Ux4!|#QCI>5u zIZ4=$!d}?*qjYq5!`YjpaFs)+>(d%P{qz$8WZ34oz~Lkw2PMdgM?~>|3=gk-NV&E2 zsoW?qAy)xE&-7dw^IQcW92o)$-Y$RNJ*pJfZ$1AtBG_{Z;#>yV*}m7Utpqx1tK~P@ z0ZFA)&ZH;GOqolvl%egZnF6Y1DyW`mphl*HRx$(B%qpN(W`f$81zOE)&{|dntuyJq z^i1CFG;%$ez_qyvA-U;)dDz#~^KxCRnp>nGMcur%3Sd~Sz?b~uIT(^RPdO|ygQd^q z^%JI@w@#a2-aKVDom#FDTJR0hXQ>pwKxC81MIx7oTqbgb$W>k(S9* zEz^dYc;?zr7f)T98BE4iWv<9lY7VW`&XApCXj zkXDu1TBgrs(gu9nU(5W*&}AKM=sncY-hf`})H<^lvhPa2eCHSHv^uR#>#*8tR_`gg zbQwA8_u&lC-Og&K`yTwKkZ)vGAs6jRW{b8AA5nWM(l>K|JJ&_Rg9KD(=^-qY9Iv!X zap$?{unK_m27K8}dFMiIhe;SEsULM=%)&-If& zO*R!xHt}i58?ud$A-CmC^wVcUG11->_e7s^^zCzho#>eV2{&59*IKyII|{kcP-ZeH zfO4n`6H`KI3c#Fcg=x&;TA4i4=Ms!gpBhtu=Fpf`=F(m1Yx$SI|AjI&rvOo=?kh0n zH&SV4W*S_str~^!Wnc=n5leYF?FI zoC!CoZAinG;4EjgMeC|Gtww*3)!AZoE_P}yZ3_UAgnJfyW<%SJ)wM-mVop`e`N!od zbfy)nfaAWfvS~x?M}u|_+%9DGtU=*uxXEgNUuoc2OE0o|W^MwA{*EB&($@;7r*;{D zQz`f63IdyGZ%ET7R@R>YGh{B*(-Cj((AKVGZWHV z7^h|}?1_SwwIO|9nko-|C}2VXOf>Q$AU{+1x5<_b7CeO6^D0?40snTcMex*)>{^I_ zSQAm~KL2n0J)<%-9J>nep;892jx3_n(dN%0D!ZbUnrip;WVhq+8^o6!#I1-#^xb#( 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≦̸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 MEMf9CSW9952LM+%sQ>@~ delta 337714 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�r`%c@b)o3f?T&8OUjGu4TrAs&uLrk1J&=3lcr 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%0APX;Z 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 From 7097b50076d92fb8e69f1f961842a968bcab3f30 Mon Sep 17 00:00:00 2001 From: akash Date: Tue, 31 Oct 2023 15:37:00 +0000 Subject: [PATCH 6/8] changes_to_torchdrug_reasoning --- dist/torchdrug-0.2.1-py3.9.egg | Bin 610586 -> 610585 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/torchdrug-0.2.1-py3.9.egg b/dist/torchdrug-0.2.1-py3.9.egg index 41f6fc09e24d7ee8aefee6f29b7a796f8f7f7628..00d7395b48af70c4295e533c8fd4f0063f0f6f48 100644 GIT binary patch delta 41797 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

b(>@Sh*BOkC2Y5_HdxQB0s^Wx315R=&gUHf3f zJ&IWt*CDj`ymDc+K6x6!W?&?2CVoim_n+->e*_E5QhPm(y`uWIvBQ$@YJ!g-F(>&5 z{;w1tad-(IA*3YDM+ma8_y{2-89qW7NtTZ?ZjNN~yfhrY@IxQcy4h}y7*Ljtgk#$U zsx#(|ZI63tFCWP4W7|c#e!{a*5|x#>EYnvuDKs{i8fb4;nF`CNsdR=|UA*qBmqe`~ ze>X?Wu$SB8nNcn$4VR=Nd_6{HUa!${k4Zjj(_Cx~S`RUQ`$B$i&MF%#EuzyZyU<3= z+y*u1Y}!YNHu;93NXFjvMzd+J)S3~C7%_F9hP&ocqk|S|^o1VVFV=0oL#%u9c?SB{ zGjjG8(`$+Hp?e>^RD6y4|tp>g-gK!3&Wnxzi@l~{qxvraz~2D3mAi5zUP7ushngm#_`#gL{V!wI(49q8rCs>VmGt-I`g z<=Orybai&VJq3UIEL>Ei+s)9NF1-@Il${NmBJ@-@g~8)m6Wv1Q+8BK7$J)Mk5mr&6iXu zNqZ`#SVVM=bwtjfK|(a7MvIjOv(t8BM-j#}o1)+Y?HVqmY4}zXE=NkjkHu{yu4=Tn z8OIb}6f--#FA^ptY70JDf7MIQB0MHVQ$VAolk>E2rny~ zO5p|NDdJ^>c~ukXH3RXOtNCyNq@`6|9rJWyUFBYP^FjT52|X&{c$ybnL`cvxBAT?& z9rp@eeoE;Ux!2=6@arbL3F^D@4Vrv{Wex2QmeF%Y_v@Bu38%hCfB8wb=#2;W*G1;4 zF4D7d9H;o%(nHTSC7-K1?UlACM4HBT#+&g2D;1&ucQeZ9swp2a&>sSg`cdkZ$KK#Jzh*)HWm5?e>S7}7W#8PM;}zobB$J= zq+FNpOU$cD%+E>ijq020oz3;YqP|}1tofM@-a;#bGry<=@e}iV9h1jZzTEj;1FZe+spmqK`?RG<_^62UpZ?1`7nu zVZ?dMBON@2V?6FAZlY})UVb$ZEZR6u^0C3kDLzi{vB}3tK2FQH4apHnF!)iLvt!+Y zm-WVGk^gq$K;vxm{ZX&5okfUgw{T&b$`Gda^KNcC?-hixro-DmO*~{r56&m({1^Mq zn|cBEIuM3rmM^S?p{WY0gp8}vPS$$55{_2+Gf0*mlc^;Q(h+ERoNg` z32)XJ3we@*{Wv{t!)$A4{{m#TGodWN`xi>VfBpqp>b4OD7T?7{+zY(L*XuQR*Ub#S zLidm!-Ec$j0_K0rksIwinNKl02pOBS81!Zs&nFpc#hk6^Xv~gSgZRGa+>e9|OY#=D zNM!gsc!89|ew^nT2{7x#P&Zp0;)FJ_K7N?QCDMd!XByo$k<6%kFKFhKB=d_-toi=l ze^s*a+1|_H*8bQ4gK#Xhj~6tem-YgZ4%_e6u#QL(WL!2!iz%rFO}j?Y6wfyn2F8Lwb}3ctHr-;k?M<0ixUW*ylJn?m;Em|DBY!clVUTQ|!&Ui_tCX*<~lqv-4b9>)c+lX!6W>aslt-G_}e@_H*7Hq;K zuSuy#4M}M}>yO7HOyp?}5l@}3b$D;YT$MK~R!22-2=7iql2qf=;p-$X$_VO%V7-=< z3*i#MZlItI7Eb*HqapZ7>W1TXe1in;PK71Mb$SEm`OOpEqHf2@sKdN8+?~W0o{Sd6 zHYr*@;ERR800O?)+och|f2eN_O~>Ced#i~vvQo$v4^n?L)~KOK>AZhHXKog~Q;t4J zdWjVcfwc4vQ*M&pS?Y>>n=%wVxp+F@D%CD_kx9<^b4Kl98GOj0REbEM#@%PP+q5<%Hsbi~z#Ci9{Diq&!*3M596 z$BcR6*1bVL%0!~lO>tkj_F|(W!_p54&H&VcyJSoK?X27?wN5LcJD>2aMyJsNSt)NvS=Z@o4!qu z@@occIz>$F6seHVeVzY{5h{htRD7F?lTw2P#!r(T*V(9%{_UG?yDID!9i?IBl7(4} zSv61?O^d#QgCpojNr!L9;q?lP_; zq6*s*3N$5(e_F^=AaZSuhp#wNj{A0N!2A?Bb3Ju<)xge-9n1k0-V^6;Hz8L9RdKad z$OTkq)nxfVzp7_oZ`D>UHxq1eN%Lk`YU7x~uPZx?%?}AkYTLX;b~Q)$F@m;o18pTd z&G~H5o)K%04O+6Sn{4Ho45f)H$Fg32dyG9o2`?oQe~6$0=u~7f8Ynw9R3iJhS^!Md zRTVNL^%eaZ-vN(={PifyMFy3sB7Ieta%8K(r6!C`vc#S6usI=x6_L$AB^*>t92;XZb{gn4ZGf0ZuCNPIx)Lw;4Vcl4s({kp9AJY zwARE`f7nbDLqm#ika&H*1*Z|HJPx7}^F8yqzS?0oM)`&1nYg6Tb`bb<6XSV6-~9&k zt=E>~Jo51T5+0e9!KNL6$=oABj-=x_7`O6S*qSdjnoUI6(ts z-mygx1_f)H++4R&>)<`r%9osWYb6*dx;bBqe~3wTe6i7wrJco|bjPEacQ$mwTakzR_-xgc8~3q?pW$%7v(1mVy&Ffqh_7_-2mC zjOdGfx1P_$79RM6oyUTIedu<*}M;GwKZQah@Sv6Y(h~ zf2~=TdRQ&1c`d0d|3Bu2|kXIyyc z$qSo}i?t?DwCGJAr5SVnXg?`385{}e{gJcIrafOi7O(Q?twg!qeBRyKw22DO*ob)O zwEL?CPcUkPdssSWod-YAqAp*dFCdOsRJ%p{uL-_@z=b;4M1uhs>+A^Sh@i&!f3d`-Jf3NAZ0_t937As{UJmc!Ce+KXW zRaTR%gC$*^g(1UBu8^e9Ib6@VU9L${Ez?VpUSQHu8Y|R}*7-?~ggDot9J@$x1>%zh z-MgE*@F{AA#4ErzUe!cT$4hVBbv$%SmLs<$Mjx1OfN=}=Cj=ahtpxv@c@QOMo!?=W zqVP@y<`=B8U5L1u8ZkG1QEWE@e{J{)V#&3pgF$BfBUI#asF8=FVfF0kl}vaHYrX*z zX1{4AyWVJ3TX2J%YdgMy_;}~HNARitO34+Fz-itpT z?XVrW?}h1PkrDwKSEdxUOOd`I@Fuh=WkqM-HoZ$2hMjl75y*SN^&sAyf9+hWDUqUg zOHv#5hI5qoRwmqB|HvUBGl)(?CLiY~LiDNcJXDFhGs@WS(wfZS7j3|Qmdfi}u zLmaz8R-4Z+_Wh$djhM<_f3kS$7K_wVq_N31=~x$$^Sw!h3*|d0@IgsFA}Ki&O0MHf>($qkh}-OJys|7K(~nci#g`JAE$Bw z7)sr4HbX!ZPF{*8e2%0w?e0Mg~erR6Xs3dG-e>GW2ig)pLXI&UCrz;`Jv0yc+<*mh5pr@bXAaWUkSE<|< zK=2-0CCsCF|NZCvXDGThF8n*Ir zTwDLm?Z71r zG6>IBPkem~rS>h9+CPOTwNdQKu3heJcarspYFRSn8PoShaBiWgsOsp}g7}@?8^U&E7T#sOT}WnV zpBPLbe<4WCk=`)J1}27PBVF$o16`Fydcj^e!ow;R+rF+3-RhQaQ#;pbH-UPz`)!z! z@lp`K*<#&_tx7d@vhNI|?5RxBJ=N?f$GeOPr(X08K^y5a$?@N07is?Yt|} ze*xb;f;4d1zrJNB#lTC8Toq@Bd=*i+?1LkG6>Jm2H`_X38-hQ=)0`zLOS-ARC&66Q zeGKWvp2b<3V9^2Lrb2^~+m z(87SyYvCPzGb-yhNcSQgdAS@kP51Y4*gnlx>EDa^TF*4iciuH(GR?vq=<(OIe*n`= zi7eB3wE)|6%sOolbr-ZLrf%)ahOT{ih$)5b4Z#gW*QiPJ8D66@JCh zXb%L-4A4eHdMkQ^-y7L$BUtK~e=2#VTtyhwArIp|eUBc#C=T~jAA88h$L~9CnLX^v z8kk|yWYzoJmFd7;iL>c}w&1S(OwgVYYcFt4#+XZzbEuI88gi>N?84*?ZE`!BN#{&q z2;&<#WFulV17*jCN@VX>$Ju17VmsV6V;Zj(c_Ba_kei?!(Z+U(7>Y&5e;IahKF6%Y zpc<+$*~OXd=9m>t(!!EvI;0YJiYd=T2prShG>*^`Gd19-&C)`X6BbchHlVgl?ZY>8 zbV_;bkKNxXBQzk$h7N>39WK!L^ysN_JvNUSHt1b+j)%-%&iT1PAL4F&JmxNBwg65p z#ls#m80AM~_Hq7(9>x4ke>{o9c$^b$XkSTA#OJKwT!POfLIGwME|uijU6ifL?QN)4qE@F7G?8K~ zK&%>Y@dS5(`-$sis9vJ4UV`f-M)194$kDLg@MhdRA6czqa8_{;e}}d`#z7#=on%dL zoajtG2(jfWiKj?$tiXGMGSo&U60VGhFAkI)8!8F-VlfcGvOI3tfD>kUe13zUyCiop z;S4=@w(q&K{M=dQhj^-7YcA;XB=tELmV3EC(3}ENAY;;NuV~H@=9C7tk|6$?x@yQB z2+UunNsu?0zfy@if5ZGWgPt&doy8HO4q{y9=(ESeUV$|6*RfuBZvX5b3@y-NF-bih zu$Os&Z=FMABkvx%2`exn(eFJG^SItG7eKcg$qx$A?7cBl7$0B?As%TMEye6%BH|GY zu(*%tevDlbiSj>3LeLNXa1e5S;L<}WW8CtX;!E$UlQ>CBV zYz^%vn^B{{R!N#nh6B-l-VF)Ogz|%+%O=R|Fq7GSB9Ejd(Nqa?o z;Uz%v3Vl;?UIZ;sF6n$D;t9RU0Ejjf?8`XXo${s_ym#80X7Jt_`Ua)V(su~nJLk=K zv)B$_4a$y46?iT74^bH46?hI+nJ6)cK3Pvybxsfqr#+o2(r5` z2C_Td2eLce2eLao0%SKGfb4$4n+VIWO_k#`IoB;+5HSE=YY2chGX%h!83N$V3<2yw)WO&J6Me;mk zf4sE4zTsX5@`ntu`D;jgB!3;rXOR3Lk{?3yH;{0g%>WW5N6q|gB*1oc{tlAAi-bdQ z{vMJaL-O~PP@)~cYwbN_BNQumL7zV$ag+>9?%gqzK8NJZ0Jb{+0Lf2AgSsDg-NsSx zX94~pl7EDR#pQp@A_$Uyg5;kLOBy`5e;$Mk$nbF})?NNIiRhGMu-5#ppsY6pV$~4E zyBip5R_=G@(LnY}r5Ge*Vy@hBG(xD-QVk2Bt5gyJlpd+6X*X=ch+ZktajFaNd&BAsvQ-NMwQ-!t3WF z@*S901Eh)wvtIKc~NYv_we|cs2fnq>hS^lvr?TxKF27HY-2Yv+=MVnvP;(k-$ z*A-X*Kv_pfcmnF7$(D;W*MEvZV9j8ISZdqw7-!(Z-TbR~!&rxN#+w&Dq5*yjAodRn z5Zeh+fx@vJjAwdFDhvO;C6)b2fyFvMqcAFW1P#m4#uCu+N5Zu|V82cWfBbk?VFYV~ ze>SH6Tkx=d8Ylj|At(C388yfKbVR&2nd!UX z)N$zkek0rsUX-((X86>Ie;GaqSvL_(ZjN!nj)@@**RL3EE2FU}t2yMRVROpkmlcVv zeEvgPH`mQmo+ER-te2am9tG&GfOSd$G^so8O1DwbD{dD_m>v&={o?inyLv2?L}im) zmgy^-;vG3~+lv1Kz(&ps<*Ezp_1@YKgr_BA2z}*q9p$hBZ(F? zXa=LuMDyC#Y(Hu5e}*Xv%8ooNuq=2ZFhv78)RCJG)J~TjtW1p;C7hXS1UvU&Q`e@I zfFd7<15ut?Gn|jol9yr>(o}>(`ccMQ(F3rur1ZX^R)9kKj4(*eOzuE!HRwFUon5%! zGZ>Zh1H&;DH_{wNh7-j2`);tL&TlI0{^$`SZ`@&D3S*J3f2$$y;+;y^2u5mX@8>6f zJF4D^NP$I@O?8-IVTaNC@%EwDN(9mZV~}FAU76u>V15|!mPaCz_94f65hD8gzAZpDBvh+;~C$TqiV_qNTmWDq^V+}oXm#Ncqv*OvcifX;AH}|PPuuN zeUcxKrU>tCWoWGbqudw)t7iwD7zLs!QFVASsYu{kub7?9bL^paj1kQaIMaKfdJK9c z5lSi&lv3_lcG7Hcl}=~;vM#$Wx%ZYj-2P3_CD(0d#oh$@+`+86q!qQjQjg#ro%qXY z1y~0|e-yZhe&XU5`e>^!vhRo09vEC8aP&dJ1;+;e2oGr#h=gHLBm|Ee?X2dl(em0E zWjh51{4l$$8&X6u;f7@AB(`mvz^J5UAiZjpAf%|CB_t$CnsF4<)RGm%v~ZjVv6Rno zNH_2ye?11rmSpg@LJ3H@X)m`u4p$q|b^5|*f2p$@NbS)t}g}@ngz`Eq77|A4^A?}i7I{P(e-KNh^LLug zWLfA}`8&gR&V*|M5Mbq%9?eleEqa+Xe}Eq5@Usg1BMu})b;n$A_%Zq;HDCppr?N!L z$WWGiP+FiG<{H$3yjOtePWf?;s!h-skdgqgP2LZ}8I>eG{RZvp++Yv>2k2AgXt;f|@|@Pa z&AW|xmF9fH+wT?W?)yEhd!Y5JRG#MY@2Bz!F4w92XQco9UKYF4fCXJ>9v}o8@}CQx58-x!$Zd zOZA?jdU>w5=*6Ty7E^K%QutkT? ze!EwWj`n+HdP4`8tmPO|S9_58wFcbYlwG;`b;j7!9CXE_EC{g@O5f8w`$!(SW@ zA^>M1R@+0}=<#4+syNs}FSV{7obM=Zyl0ezQc2+FGMX|(a6RIb2m4tz??RhL!r&do z&Dl7ZcV&k6hXf#=eSCBjyFMsoo0P2I8D!a$Q4n$|idyVn1S(bp2;QkoNElsis@gf< zSaxmUv{0YJz4(XXpV}?(e=AxZDp|P`Sav)3Vf8Q<0l$R>L1bh2ko`+bB^hj;xr{r! zI6_atp#LCNlOK?x7p)(2!HObvWHb0H80^&5AlpyzN>beQ*kWh!k(jf%#Hj>cOpZ(~ z4t*T;O)HvK;!sEkfR+>h4~$y1VxX- zglMZ$k48+RMiX13Nvo}9(B8nu_ROZ7^L0HRA# zXJkkLJ-sy~*~t6;@jSWX4Lr6C68)ojW;8Xo%QFusM*NcpeUEGekNh+q8OSeCj3CZ6 z6uGerN;Jwg6)bCKlwfw~axiW_5F8Jj1&a3fsLv{4t8!R)f46KfG)xReeN)t8ocYa+ z&Abs{#Nu}%?d=g589h(W-p)47WYqJO z*z>@CS;_G)C`HTlOZ`uVs~^FWnM`+C6=smZD3x1;e+P^FsW7JZ;K4WoC2+XxFi==f zl88!-pd=ZVtQb;rTV-7dI91)(zxSRyoMVa%aZT3{88VM0Lzz>dNiT^ey_yjvLa#>h zy2NgfXi`ZUga(BsG88FkLeZetP#S2^x6V0N<@+Jiu#!d>E z7G>|X+Pbbh_=G@BtY~G!i)E`q76}%hZi&J9%s@io^!{E4M z+Ryv$*-jrU!I#h zczv6e=_S5W|HIUv{8Ned7COmQ`P8TJKkVeEtYRK}H@fTWw9X*y9YJq1YWRMqV&=bY zO8uZU%P8-;L!+_F^<6~&vqx%ilFLkIT7Fgx^<89mYQ^?^dBLJ?)A7qIqNNA?m??91 zh1R-U{Kqt=;K!>Ydrk9d|5^ILEa8F6#pH_h^9QwC(~HvLwtSm=&-6yY;NIxVEk(8` zkHa@&_;}bXENJ&!G{Bz`P|_Wr_RjK_%c6DKGSef2?C#HNUvavxbj}B#Y$2iI<>snX zB=(QB+wGh0nx3R|GfWc~O*dFnX1;&b;g;ZNRCr)-a*M;Ev)vlEwMVPoQ|LGyZvJ@c z;*(=N=lR_eUyzp=Cwuex`?)_HP@5KqUlQlf3c;8m=yf2gh8a?FegP}%5=d`8c8DWI z{^eb_%+4D%QVhmpO_WfNjYTms1i!>VfIW}`GkIg|1+*?1FvDs{dBX~u#Q~{ghsBX{ zuM=j#1Mj)Aglx$pcdVT>y5xmfutD~EW4WX*oQ0{A`dL3LlhoYfIN_l^^tmt5NjaY2W4QDT##B>SP$rVqjNBl zmOX;KBIVcPm?VgiV{M5+S2O*Vgc8#_SCh3vc$Cq(LrHVb_qnu_n8N02ieyNkgY6EtpdnXN}Pw@ApZ&F zbdY|R#c{4ML5@w}sLMe5oy;Nq@WpUrl>yvT!1+Rwk%gSOia^%i<}`qsQ^i>v1(M^) z6(eJicIIZ2(_A=}t3t|JU+z|NHOvg;ij#dW2;sJpF*-zWZ;)wV$8ve3okSuxjMU?j zxz42BjSQ|KiNDX{-Xh0Rn#V0A=W}fVH<6sj&*!-sB(Hdx8%)aRO72XuU40Gr0omV? zX6{4MZsT(<{~*ZBSY9b6vlMp5kB?_kCrB_DyA>FWNl4lUS1;L=zzfAB&dM)78DLhd) zw1Hr>U~-24xMH6G*Z26&P@|!7J8$=WD)#GdwC|2~2&(<}%z+rM{(Udk=kC`|={Fth zc=s(`u(+_m_uRy`F2-t!*)~ z$6{4}4E^oAx#`g3L5CAg)2ee;Mn?=zj(j}N?@4-Q-x0Jvn)7LhdxBalxelbs3rOAt%hd+fQ(RPDt-b6550&Nl56JciKM_oPV6m#&bHC&Nc!4%s+hZ4J6*U^C;i8{!o%TH4IOK%50)2iHh;p`R?OBZe&J?V zE#Gv@VVjBki+;^U1)q;9my|B!mJAa-*J}R8Aa~_8TNL6?y2v;lJ7u?Cal69K`uHkC zgK5k|t>V5co=<9;K;i9Gy9`!bqU>HhB~A$=w|17mKrg*wK0~-y=WD_-?$_Eq>2s^U zNZF?zdo1UkR6S+K&v6Bk(q8&Ai*wbM@ZVT8e$8PzA2W;HU%M|nM|YWW-<8M(`}jUu zD^1PsTUDF>VAdtKh{ZR$KRG{}DS5=vHh(^E+2pCM0%OL1y;pWF@A72qi4L68x7uxU zwCN<3G4`(vD#cSv(f-#3M=_Dt}MI8wyfxBmOI1DdZb=tl|1cb+TfnEI=6PO z(?HH$(s{cMjMIPfCf{am!34vwQ=4wgn`2WH@0cHb<)5DR0b7f_-pAedhdxYLo?mgZ zWcI-)cUHFPUuHh+;g%7%SDP&yKUI0&hptbRo2~Da6Mw0dJxVS1zQg^Y{^uXKckJRB zJ2ID+$kp=}^KtTV`^vsksU-dl&wwpH;X}|e_rC~nqAU;<|Hs?K+nqbdE7+$3d3N)T zGSf=>x_KH*rX?EP%hQT87P?nDC7cU?dhIDMr9VcE?_2V)=~9N7vR`Og!<^-_a~lsI zH=H8b#CbnjV#zn<;M1KKip$_rJZ9TI{iGePl`N z+9M2)OhHf561U?4V&P3CtJ+UESLT;Cym-2Ht*@HLsCg=R#Fqx0|14GSe$!j*?>x!N zT7IUU-pPe}@~K$#M{Dt@^L-(473zT~$MD4cP>=b(eT9eWo&Mgm`dhK-Xsy^8GwZ67 z!?exakH!cWyZX0_?bZ*onY*AVvPt0ybDddJp_#YQ(DWxs9t8~+clH<(r#m*26^9T4w!@!ocZ6<8_!ezZM|;V0~9 z3qBpt6ztWbm8a|!JePA~z2cnNY+FCEIExg|qS9kV<#!78_V>Eod~84A_STZ__Ry3U zUu07Ay$d-H^`3T44yr#Jbxw8NdG+4E3r3rrBTnb1`AGDvxUg^f%<3%N?D1WRQxdat z{kB=#&3){{>ePSYYoE8OD`cK$V$k~I2CK#8)j7VKJA z4B`YkjaoJrW_5ks7oR)5@W`m0O4S{cnlDP>qq2o!`xdAACBAsjTXC&f!TwEP#76W~ zqRl2QFKTFlX7!ve7rq||{B$@f`tF029lZAyQ7?{fNE^G_L9hPa{3HHT>U!L3utcer zq8HseD&yQvy_?dx;~slae#6@hfvzgEjf(>O16IXZaGI2 zyf<2ZGW&}aFXeo9lQ?F5Nupp>u3-H^X+ch(bNN!Hu&s}KXMTd+7`4#y|M=BAm5l@* zW;T;oUVebWI?KG9?r7)T;8j;`?yR1dKJDnsb6a-R>834tKBn47+J1s$bY|vL;kJ!N zw(T(yVQ~YcUjz+zvkv9Uuk)~+EzVBne9=+V&~2JG;Mx#=`7hsNCst0^Sc@$T`PR4i zkm6bIH4j`@33rXQkaLoe z5^pkOU$eejy-H30kR({b!jfmjTGk5Z;kAuRcQEzG$KABN{h3#JVsGOOtva8uiiOGk zH>UXg^z$%sxvOP41z zqby7oi4U|E#t)_Kb~jXt1kNGH#lXqTE$7)X&S7hQsjy z8*e7%I(dBOL}o~_4<0ZI3bFY?cmi2Rwg%&=jv&_@!dH^T>GLD_HA#@!=Wu5kst`Ua zRLjaF7!08-YPgSUB8BNtj*h*7=a6;YtvdV%)PqP!g3b4F8M5em`y6+nitY~l2 z0uTmYaeolozT)$N?EH$qfQV7m4~iT&Lnkdkqih+r-DN6(mq5(;Dz=By)>G6tPw60+doDw9xUK0!~J zgqwhT+W72!mGBeZOz!a*3=4Qu82%|r$Xh^q(L%2muw;?62O*7iun0bDU@>~nBIMB} z7GcSpiuzc@bk>sy8k1bd;-LVH&}aEX(Z~UeFlFU$pp|DESTg7{(9Bk(!6xRgY~pDm zg-uwo4kXgb-9#1_Mf|{}(R()ZC)h^AnjFH8CEP(P>o|lZ>qZi-RB#9j)~Xa*$w`3_ zsMg0)S<+CO(?3NCD3vyt#RY3lI;|Y!680?deY7%Z9}7p{xe$Hx0TIF@Y+3*1(280v zc;3we+VKdDJm5hTHOFY>$1#>P-LVr6VIMwC!(lks+&xPxS8>9GWnM%p90CUIT1qSH zOQH2rFPP*o0$N|cM8k&(2-dHRR(c4+jJXhLh!L(V!F3wjBnBQEs%Yh=800&yhE_(2 zL(?aBX+`oLYZUrh9AfXkPa`MA32WA1Gp!grVo4#c1SDo3GL;}aST3zJA(R03ejT*( zh*Yk>LBW!Q0uo3P4$QYGNRn`8MfB2Gxg?Be>jzqql7fK?KhcW66yeOQLpf4lef%5B zl_C_;vu`k;#3+bKZ;0-|e~2ZHW&^@pj^alVZY+68lrRd`+VfE`7Her*(UT^um~JRY znwZLJS3tqi1Rvd&Cg4pOJ(4C=S7md45Y`+#DLy<5M~C;seGzLSxB%LI4pIkXX-g8tdj$ zLy%AgOi(~$fd#)iUrrKb7ic11nMz$9iM3y(G4)Ho$7`Yj1gnB3)~FD=(AypoyK|ey z9;pyx0UIK*W%V>>uS)1pDXlnoa^-a{gJB419r+YUYNSo88!`FeS-GtWK5|-U;(3cG zV#?87wrSUCaFij&V3>|b#Ip#hqJ zJ34Yd!tLCjTj}Nxnhg>V<{IQ7vTujQ2LgJqf>Df&NCRUdrVs3d1sIzSiE40fsqf(| z7((j*?6HkJQG<&-_OFHPr$MM$ zgQu&nD@s7pL;q)4Z7mWt_@GPeLH;<1?oFu(Tphusy+FFwlgx=S5mP*l$|2mh%1RDL zP?RwCj)<1iqs|m-J!rGCNd%r~f@MNgX8ZLBKGxnsO|Uvrd(0+Kn;zuj$`eSuEk_L* z=tH%(8U^bUb1>9L*{PyteX1mUrw>l8KU1I{+VuH%+WicG88s+k<_xkGsVSg#qV9zY zf>m(unF`x>%IYSaf<116;J*gpfgFW^(?lBk`HE&wot_ z4ti!xjAy0H{{yi#0jD3A{z6QcTvTpCOoD_DnZW516-rZALOEJ=?$(<^!MAuh3Cp4b zW`sC82%m;yB=&3nGaXp7t zbS(&Zh+>ijG!84Eu{9QiFpJUeE)uumDx+%?;V>*kT@wjI7}yv)*nWc!TrzmI5%uf_l3_cG z7)R&dr%E%)9G*%s7Q;uR%_IQJeJM~K{qW_|MJ08VwYPZ`T!gYULhb*Td~ShUv^IpR zj^+;jJ`x5#^m>b_-|?M<0$Y_DD(eMQ1b{b@`>P@Qnpk|FZFkHUWQ}60qQ~H z5estwHP{pOFmh=J=!KEUMZ#q0e+Fm(t|Yw0aUO%@A2iI#QPKNslbDcO=BH z&MeU!{q0CS%~QYtJC!E_YaOYo3_b{w&2$3mB?ThFz==AIr#gXk*Le}Rg9cBKpu}Yn z=zf{|>nSNd8JJa-BIab}Z)PRQRMv=?p&Cdh`DQ{TK%rHtY#U6+2AGbKZy|e{MGfSp zh#pk!*pnLwo;l<*Vq|^3`nkw9|2bEYUi(>7VC~O)#YMphJXusb1=fC9rZeHoj6gG; z2~W&?ED!mN<*A@6&hV&Ew4^jy^xYX!umVkVfuj2}+Tub?XC6aME`$!G;F}AKV`nUn zbgBA#MQZ%dhhZbqIwgT>U_ZPZZ@Yq*N4rE`*ltjmE=Bro0OIu`FvLw%sF1heRmu#; zVK)ZDeuUSRZ$!3LZtya-6n!Bb2-!FtTP+)>A6CH3a|h;cc@dN8PUyi<%1Q8}w+J-$ z!Kq6QeXM;Jj@}1D`2ss|4jO4B^rEVbi(U}K;zKxc>Hu$lz5(;60n>Oy#7G{6;fmgk zqev$0oQSDAH#~14sD)&juZtMCGgGG)?1JX6?dPFx6hh5Dend(x)ro9B)#1bMt>m?u zDx7JB)2W@^0~+hub94s0A;THe{+l)f`qAp3+M3c+cX|d)ol_r<7WCmdWCSrDiJEVBX;HwXbNvpN~d0Rb$t1sl^c0W7oGO_TuvEVFJ;YZn15v)X3k2>~p# zzHmdy4lI0MS0VrT+*<+w01yP1Auj_Im(Dx^4Yx2l0ek`hEVr#Z0b>RMEVmIu0k;VO zEVs!_0UoL+QNq!DOPJeNTp9XAalG(s~nE?X3E=WFKYP1A^s?ObF=_Kx+e zwPkLV=-G~}$lS5EEV|D}Ilj-)eIc^>p01J6C{iw?;m~`dQHrQs!=?8|qa5Xhv0?f@ zOC>5h#*bZZ8sUG)N;S$y#>%KLUqY#|j}RSd(|?zV%I%EZZUo!687BYtG5U)NT*Dtw z4dbaA3aJ_<25R`-ObtcU@UrROL3K=~>L{k_n99^Kal7%d8O)|@5e6Z1>+}^OLWOs} zMFj4FUOw1Zr~QCY?KutF-L0_E=pASTAwelZ)SF&IZ-{^1!GUDChkH}$7x8}W&Ge_n z`=jTkDy?K{a&&3F<5f~gm-R={)jWgJUa1*0La!5aeSZ?kmGpk|tDKbHEB+XgMl$Ps z&h6QO*Iw$Cl0KDFUGk4m8UH$5-j2)lxV!`P6jljKEeHO!^gx4JYBU%-H5ylpSMOTb zXtl+y3xa>Dn{T%|8y9c6c+c_1@w;yImX~kUWX-L>KDSC_v3|)vKsCJ=3;aebd28Al zGb>hw{tBl0&vH!Hyv>wXm;T$VN}?#9yG1j#X>gyTzXwq#b`UKeVzPF??pT}0^~QgY zC^_$9NVvb#TvqfPZ{P%zC%~0wfWEi5C`(;2{TqKUCO7NLJ8?m-kD*he!7AFmGjD@Z4aBvl-sv`5)Tj@jZJi@nF)U z3#orDA4si*RG)LHJ{Qy<_xYnH`n+O1M9AQ|$G39AjB@7SpK%+OlNt>*mM&=%HZ z^V9T3J!(l$6XDU^ox6gz{!3c7tKxLez+_Ztb=L(cNPr0Ahxl5G$)0Dfwxl04N ziPQ>Zx!~2J0E2z7$fmlrw!PWa_BmeSaN{N=HxkN(qHC{|qCd0Q@YmKtVF~ zwY3c*FNyYScZt=J_$pxd`0A;LFRp_@%>vunnWMoO;udOWo98`6w#^$>?D;_l^$Bkj2?rf7daB5|d_=&YAp^)B`D=TWF67{l& zY8w2qfBTL#7SDQ%s|`I7TiA$?FgU3Y;>Mq2R!!TiyyjTxy9q|?^2wzqS3jlSZB8qM z-`7kA2;kmUzX2dkNMJyimo0yqK$uBe)Y`F#hP1*QXy|P_PEj;suf$`_V$XkkuXwf@ zpdJ5x_{u3MkxaA_bm$79+>S2F<0 zoEVh-Ccv-Bl=KpPjd>Zr^d$ge^j*(H=88@Cc>t}=YG@ICPk?&M{D^T**hW~q^rWPO zX-k{f#2=&d+l+Hxr7{lJk{5s0OT;sDP7+`+HVoevxsE05tz4>=AE8!CTXx45`7N~O z61dBuY-Ee#OZFD!6a?6|%R7eu^{^rwv_$VmWRFo=l&FQZ{GA^6T%Ey z(C0lrOmm>vzEWs_bv!P}j>$+HIYuC-`kIrYalLkzah3fZ7};VxvP<#E8vX>xCxSDyD?^h;*Hq(+5u!aO zj2CdVUa*#|LsVupzirb#TA;B8Pd|`jyRf5Cay-Hq5dR4b^BremR+5FFzniu0CJ+j-7&d}xWVH7HANL?DzBjyd}=HbEN zjN2R-OHI!GXfl>H8asmMhiEibZF&M!=aE&b_(ec09${Op!6d)wKS^V1^Lo8Uk83jO zG_F)WFY>8Tmm^;68}Y*F@0#(5^Vo0xz?n3+&O^WMch7&fgr_C|t2z;xiPjp+rqX+Y zinP4|a_eTNcIW)&iNPwfv#DisgEQ**_hGUoQ`4#?34K%hUOm4b!LCwMd);nRdx$Ro zJtk#>r*@jA)}hI*((jB}GdHgrKEZM8i&koqac{?ye8K>_-ZsH!07WyZy93kOxBPQE z1~!Pu9VCCGE$pWy^3I>$ywtadXXh|xOqUWu5s)*lwK`tkR7e@B6thDKKqE`kSP-_> znxV|QNTVIrT1$BFiPZEVF7DFzctVwy3*n=GDr8A}j|qT_S^OR?GtRed54yYPRjh%y56|VU$B??eH+lAtd;*d3ne}+28PK z;qU7m!i`Sgd7V`GWDw_UzmEHl$AjiSi_3FE1`DE=-^TaaYOppB4GffCduaeuOamB) z1*?SoKq`KM$Q5gSLYP}Q;+f1gh#(Rt z%oBePm!ouuN{a-9h&<~2G^IMsAr@oQNFbK4cB1Ys*>%2%P(U#0tz$XWu@ z{d!mxb~p;ux@3l9c#|MrDm_kp>v9!CwB}&G*j3=+`{jOe8;8q1C(!?-W4L^ z^j7o4QQA~9xV}OLxD`)J{^p|^xZU$uhZ%nWn%rP@zNVNLJoGVIM}s~d>o|(PJ1)*N zmoCpwwP1}H5n4(N^|J7d*q(#_lh`x)pxs*Z=qGIYVb2c2?mDjCx@3O}O~2V$_9Q&3 z@h0mKgzc4Rjh)-@JR;2A!>J41Zd*b|_c64tn59-H?B!Vx)GHE^2s*A_j7x&-OSXS6 zuS6m}m{-d4C-m~Xx_wC2{4=;T=~6EdqHJ)6epYEb4IDYgzr-S(mn)b7s-v$EhPuo) zREQ{2>ZDh>=AP|2D$Qz(6 z?jfLz;gN5N2g*N9jEmf4b5?KM_tt5YXyORKwmsTRy~5(gTClOE7>8Z~KgV0L<`rsRp5ZZm5hoQ%U-;0IMdJoW|t4 z6j`)W!{Qhz()X(h^+YjLvp|1<@h>4Cf@pWqD$DURF_bS*nucYB*8xjIVk|+9T{a<& zifbUqWzvev6XCbQY57A2v#Ldc(>4)*FLSFoo{U_k4r2EiA{QbkymFTdAmW<;+Ej)e zEX9qicBq=&`K*fh=(hsV#rMPf4kjw9B2Y z?}_GD*RQjOx@Zpz#@q{79&-PE}IP~Pfp za;>|5L4T_WLL;hLk5QWGq-j650kR~Xry*?TX{Jz!woWMM`!tAZ;c^z6%nbcS&ezK= zwu4?tx0h0+G2O=;X`+8->)Wd?mR^Gwo{QZHaez^Fi94OP9NwWblCiQj$K*~;3S^}D zj*+5t{*ECf;}YtFraok_%GhGY$yl-JFV8eeP70H-UzTZ4@e`O=ezJ_AWo*h-jBJ28 zx^uAScC6s#$foBKXeGb_lpws3!~Wf}&n;0-m&+7b=3F>rtU!N)Jt7J(nY6c!?JC|z zMHU(hivz*!O5DR(Qu&@RM19ilIYY+dZGt#>=LC4bRs4 z--2EzEN99Q_UwPTENtR!)609bblZM`am7ZbMT85X2-=!=a2NbF6n%gRmH;D0E12<0 zQCYV1oY=CZmuEt%UZLJJI*@QI5Pf8~n?XoKR%h{S*RL}+T3qa3u2Xs(8p$}kLoeLo zv^im3Z%;5KV-v2$LXM>Y!-{4&8z_iN@e=+d6YE-5WoUm{6&4~bX)Huq(vrBz(=xXY zGU*OvKnv8+3)Emj#%4l>79$ZdgfdQId$^Ef!pu}{j{+@26AP2BMM7cLmLs3HN>PdH zbt5-&BKHu~Coa`o5zex%cdJY(Be2h)8p@D_3U}4s!Xl@o9aXs02)8>*b-~Jl2y;;& zevSJ8o{fJ>_NAQ!N*#lGh_=aSR6^_ec`O>;9v3cs=Xf+8jm{YIJ+(7I?MzUsZZrae z*_UkkzR9gAN}Y_V$g_lgPvI^ajmGHyKr|6eiRvqbXcE>YPyucJdfz5&rgz}lMmuc5 zs!FtiWP4;xB=950c`5*paJj^wd62umfn&XJ`{v zr7dYK>A)OX4(UJ z%jRnm^h4L_KZZJ{Q^+NubuSyS^q>gSi>@E~Kdd3cDUDDVWIT;*wrDLa`Oov7U!Mm3=JVN~ffEVcUZc`EC zhC5|Vutc1&qczQBy<=7=ZQ86_t~qN#dJcb_IZbaJ)B3(`S>KOM4H!6P;Lezl(!^l8 zmyIop{&MtZ(_dZ?(jun6NPiCfm0+E9*(7LSg4A81ogbMG8PEL@?R9HA7gbhlmd51x zKF{|y-xv5k&-X>XudF!Rr5%Gxw`qrt5L75fBZu((1nu@wR$9LjRkvLM?xT9{c}jn? zDedQI7Z(ZQ$rLE7zey>MPANcrO(`Xn;-Xe+w~AKJg;9Zp2LF!QFK-n(*AdA~cdI!l zpu>tN%4aPwD5CFo8w4L6^qlUTs3aWvEuA|aju7fb?<~G!!d#Su`@9jk^4oZWE=!m}~JoI-@fIz!VwnwV8$UttIa ziD}>qT~Q(vK=1vZko9hIWpdzBm1R3oucSdtPd@=z`9B#qDIpEd+YT<^X#Gb9p-<1o z5D0)DNNtU>ZD#+Ia-53#Z$f`-!d?BRKos)6RqH{_DJGdlFDqUJ}r$F_Xkt=d1jj$Y*XfM;1S_IWmipzgeeV-xdS7F%n zt+2v$5YatMZ&9zNK>3uSk?ql_yki~&-1u?I4Jh?T1G(*8a>K~x$FsSI)DwZODWVj|%>nEE)UH(6B@2CEu%58LKn z$!?qbxG$2ok$dRE;70QQDqa4fsnkG*TU9%zVA-^5s?0S=d1#fc60ytc7+7K2D+Re% zDsr#LPtWX@j2IN;oU%u&Jiq#Jqn6c2qu6+E`jKxy^6s ziF(wN>OOTEfF_=;#aXzqkHy0>kSyUVMdbtHkUNfLWgvIr{J`D|OR}{mQhkfhjbzu^ z=3PKgzOQYYva)-~L@s(k3MujPTrowB-WP-FUVaT`Mv@B7L9nSLwrs5m;}}U|%3OUA z)`9pDJ@}>>%WHq#DJcohRkay#oGCNoP*rNd#|>6I<4oTi3we&|$^r~wy_B;Jo>wc% zLC_EqY!tc6R&Wxiv{9g(#VC`XMVk)8H9_2EDOTbT&6V4-1xmP3=|IfEWr{CZlYqGd zbEd!{=7sYTgdTF$4EG(vY%7z-Nx@?|p~iLC?Cf$f>dp|=OZL(ybZq}h=3Lp&*!Jro^?iYlc_ zqfISsAKpPfrne482czj3aP>JkMp2HQX1K;2*NCyt;pBpDZ<5-Wj%H>InTK$~WHd!> zO!635@x0HCHa#mP7Jf>duWPq!ygoeVP7fS?(Ddu9>p{rD< z&Vux@GyL1-=-J0Ve%rCy?av*nef;)gwcFJ19r(RNrQe~_aUkuv=jH|~<=%1MB>bTI z)gga0Jjn)bxn0*hq=se?!2WDjj_bYgc{ORgHT!XSV(pIS=H}*U5zOvhKGlW(I{0IB z1$|;^NFREWid%*$95LjQZDxeed_-Dym=movNGnE^w1SC^00+2>>g3lI%l~;4_#`f{ z!<@S&h1h?<$jBBR$K`JtvCv^r(*p|{i2r}rxO~}&1raPoD1==;Gg9*CyFI^23zenc zhZ}qZq%q`sdN~5q{?8bSZfAAw;;JMsfSFl-F?UD_C)MJYB8R_@B%5Un`GD9BukN1P z@cc_Gxu}=rJvUNkRKf{y9%3$ndPUx|205rZs0!wn^)hN`u-G$D4}7FD=$Wm$%g=wR zUcTp(IaU2#T&|br5=3yxS_-OyJW2$;f^4&AqaQ~MLujh#cMQox zNL!J}l#r2a)(nOBV6~Qm!WT-lFdu&w2rK5cogL#c8$}SrF9G)M5Z+t0{SSwg*vNi+ zgt>=2y{$%hU^u$wMS&nYjM0G+M+G3Y#E4@GBaY*cKVd{yVZ;f^gTxq-YMUe+S6a4& zgz{yoOX0|^N;nl&2#dE6QYuH?9d$oUsCd^;D zof>3rIH}8LewC;b;>NB#M>#LI@^M4iB6fY=pwJ&tsm2-vUVn>TKI8ua^0AT20ZAtD zo_t#GHQtk$A%B^-L8Gy@(QY*SZ_rac-)eQ1y7bctkKZNj5kO$oi^RgN`&|LpaDLc! z^`ZCiAwrL7_+R23wd!4>g^7Q!l(qf0xUenrFQZ;QjD|e^uOjUq;PUtR1ro7;{J%G3 zJ;Ni$0s4jjx-NrO-~_MU30~DxskJ=8t9G-dG|jt0j?9wHSnm9xky!2oW3*&pWXZN; z^qW)UoI5Zzsd6bex*;zlN?J zjZNN{!2x?~jYdjvr1MK_5WSUn%gjy6)`4C8pEhD1mC?v2;vL}MkIUaMV&3D&arxW0 zz@|iUzr&13{tH7}^GHO)rN4>GKg5Ma-9I(B#Bl~df61I)>NbCXwgVxvG}C5T4gfS% zwbw&cJ3cTD11GP{cx{7Yg^Ly#i+of!KkV!jK?!288;u98_{@~KITE+TZ?4|Tob_t? z0VZFdmz>|bMOG(1qFc+wD(K`q$?k@pKsmrNkW=C80l4Spjph)VyB2ILNLZ`kFdK&x z3))(0Y3s{`_&k5N(K=7WK_>)cSI#w9w+VDVt4KwxwB}-X?=${}H&;8U-@~`YRY`J* z9EMmy@QbU^+ESjAXwE#3_==#L&7``WI#r0yCAJLD$TO(?4Mg*mbe7nrbY;i_apIAD zzn-&d%sa=g77M8v!z5`Sdxxov##o&%^`V0BG5wVU_|ks@%nA6g9p09=Dujc}Ec^Qo za4&P*&nOG+X9y>QdZ?T`PH!xF)8UgRCjC|*QBiN8-}ro#<2RotPLnV^_&og{nvGvl zb^cQ1uyy#)t8?%~sq8>U>p-`v@6Md|DKDLxe*Tg>e# z?)LuzT|SN#bQgn>F(u`mU^3KIe`Ac`t4g+ARq20KmTYg1$~C7|kdI`n>p-ArGqOK6 zw5g)80*SV%%uVnsO-@W{k{DV36O>j6i%O!$XPTs0qD3Gfwr7g)(Kg%>59pK z;fmdFX2x2$(W}r!eTD^0PTe0v00|lrbAeI{@8IBqq?(e$K|hs&M*T45f1=Apz!X$s zOo3Li=?}*qpbwihYtR8$W7bS8;~(wAjRSgT+bEWvhPVNtCG5Jb^L#hA^2xQh6Mw;W5ov>ies9f zQ{5TRZD_dp!~oocCJ@xtOGw=p|m@y zHvokCi@zQql;|v8-)#L0j6LKabB=%9BG+bD{Sd>=jQ#np%N(4>U$GSVYgDSl3>@iO z(AthBv!G%7)<=o$&wLYyR-m0aB(2d+bq{muB5OQtiM3KsMWWjZQ&Q4W!jTe4S+-r4 z(wDde2bOWV4bVTO8DonuoXSO%pDJ0@B?-f+w1Q5nQf-x}3{5X#&s;Qe5W0T}dY(3- z>OtrvZ0ISrz%GxmO9G29B|R-$ED^G{#=~j^f0yRv9NV9 zH`nU_&esP{Q)aZ%@{Y0Ie}~JrGWd_}tmkqm`We>Ob7Mn|Yp>OakHvpxYkGgP?2HA} zEL8h7Tp&v86_@4Fef9_t8_a2&IH}YuDoIw);TwYd{IgxgLf7ep}6O76< zQ}-3C%9{5nbBbLtO-X;@v*jou9;6{Z0GHKmw zDu~AKcXC@+rxL$~g-Zx;X4a0mT@=#F%-DuSuXQ=Ld2vCjGuDFvdYQ4FwEK|l+K@pL zrn42MD{P8EOt-YrmQDoHcC0lb7KW3``@u52d|AK(Y(S*i%Nl>}REF7nOVcH1%?r*h z`z@iC;8GhZl8&U^m{|L*7*EAM2NIdqjeB9Io{f+EJ=2Y5_Cl*fT_IC|GibhG$$6A#hoOP#PiKFwItQA=Ux-Zli{H~bJ_VP% zTb+Uv)|5O%m}kP=T4sLwC8AUW(GWt2uDP0#Z~9G z3gL*}+iX+MwCpJD^8$0!dCgH@NYeq2v|H<}*&n*JIylGNx4JU8b+yyI&}J+rjSi1V zU%OQ4dQ5-(GLh@GfF9*J*$fiZ2l#=gl?E#CbaIvi>3_@S2l_$j{C##4AiO1l!R(Dm zrAJRiwRhJ1{YW^QLc|8}LwNNIXFdKH8Yeg~?(dW|ipUH>KkELd#?Yq5`lG*++-;@Ib~vN zxUP9KFds|zk61UrtUR{aRJbrHHXwl4TGtsv9hZc?W=>kHutX9EYRzULy<+bla=ve< zW#VH?wG*IEhB%SX{MoVOu%k3o*z3R@Rr9Q_XYNc49}}F$Xb*=M`JBOHMmQm@(t!n7rN{0pM#Q^V$3sYc+oXT%!V9sH|H45rH$f29UKhoE6qf_?nzL z%xp@c+mz=Yi)@iyFUFqVb{p7%Q`#(>Q>AXt#f~tnDtiKpPiUtz?Y_6BjfBn&6B~vc ztGkYzmJ%HRGsVY=_^kRoi`Qs5BqlT5>qJC0Y5caEVP^OC+tYt* zuin#F=yLC1Pm}XIyZ5xFmb>h0g6A3MV&S9D_U2{1Z$HAerjV&=12TmirDHC*21s~a zD6==h^^G*ub-K%bM5Hu=Tb)~^6z%4l^?3=r>iU=FQz(bA4NRb}*wV%*aRYT^ zx3K|#_JAInVmvm90Pjz8Y+9YG4h?_xa9?9%#$)6Ehuwza+jMz*SNVQpshZV*5*W4BJG&RE})gwM}FGPQ41mL>G z&<0t9sWqa2K;ay`n)u5|AxbD%8&F!c*cDHu0p~qPr ztQ^S$m0L!i*#Q_EGifINlxk)y8bd$oKhdR|;8oX*ed%V)W^il9-QGj05B_zbxg8tT z;m=rtS)0|FNT)BcP(wLBI~jjjPXqIshjh>Fge>maPeYugj7UZ<^ zlY%*8!9I&ns~Sf(-`I5=t|pJ>^--@FeayozGc@On$MYA|yrZN<=-e&HsOD&VN3{nJ0Qm zPJB=vm(N7aNEuQjYb=7pWJ9vgNAmQ?Po#v)>z7#5D1{DZ&IJDAnKSZ`B0YHRr8Cn1 zp^DrRr)Bgco-QYWH@ni+45ajq=rKf11sx&mkW{9@{N_jRPqM7F0=5C2uRY^m0&amA zBnVo|opeR98>ht$--mxO&9XK#%Ve4>%Y#PwMf&8%uyaPe983h6tNL|3R-W4EgsnB{ zj+QMQVjnj-`dZFYcj!*q94591eXHsN;LJRkNyWV5>?@X`6-D3bd*x^orvy z4lHU-^xk7gye-cI!4(oq5^}gplkmcP#SV+SMV%c}NfoTk8}xs0KjeiRRAh)ALGrex zM301c1js#1L(80w9Jyip3jTWjg5JY67*PBBw&i|5K_#g9Pwa!=kt}zdF5lnxN;UH9 z|5z0J%FvIECl`Ild~2)_1!)|dF=F%;nJq)AHMgV@k8~+XTR60MEOK%b21kGiI=FN& zziK{Z#I?xr5Nv&jbRqG4*b zeXl7l#cJ00be1F<`iA{9jXN(fdvQZF`y?U52L6gvV)kqf?QoNxvc9RXX^?*=7khs! zOjyK{SyeS5GvALf2pZj;Uw+(3i5N{*Q)3=xQuAQ$HV=O+CebTVjr`WWNB+qVy@`SE zt6=DW`=@ca`gjj@W{9$1&&8f-3oef?;pW$D(|v8Tq{eoAV?g(B$4mV_W6<>$G440; zU|O_nb8_IM?w^*krIvFpGoTObYe3aPTyCBBI)lsbG>?j6ODFZHoQ{`KtTyLY5OT>? z*GKDFVfTMmv}glP8-Y06oO6q<|A_(UdZTqIwmn} zA{}fZ1Rm#iSar61C-{IIY_X*sI0ytb@Y^iMPCf2DD&zwg2YPsQG%a|e1pe|@%W|CV zz3FIh)2oG}!7QQCSFK|;T0VV8bbls0ZgYkVRnvbV+}~*Q?3He-qbxpqg{79)76abi zD7Wve`;EpwN~palHphcvCyAgUGf`z9K+z9yjlntslx0jpVX~+V5uSk|f=z@LBtrb_ zpJeexPFQS6AXPo{Av+so^Sk19ZrKpIuVQK1>iy}+mWOI%!c8d^?8MdamJ?#s9eM0y zyA*%IVMJNl@rRYLNb{5@a?SF$!;$1^%k5OyyJcRHa(NhZ27iZs9oi7T2EzqDY-w$k zI}V<3e4XGt9O;zli^?zMxKCp*oBoZdzS+886&Y_b9EX|dWs99zP=8h?xP}VXVY7pe zNx{xFqQc7{OA*WAeKZ*h zv)x+QhfqIkg>A1k8-#tjDNcsSKB+xZE+CS#vD6w?_RN{}&hi;Pa7ecTR4r#DiV~%2 z=T*=9R2lKV$KZK4OgTvo&UP zOVAL3%08Pp=qyWT^&J;$v#GJfG3NRE`MhJQK0Zo8Uxr+}Rn%@?>JrgBFi>*NPIuB&NQ+%jq~%h#?Xu>28Q`;7_J8=ZoRc5vtOKFrnR%NFyHFlD!Pjs z@IcQKbZfu|o^I8#C~g&g6A>fl&xU_%?RTto#YWq^Mb{F)R9_XhcKV80FVfIpb_l++ zfGP1M%NIVlQaTzmWYNtdAL>Al)~UsH$K!}N9{z;MjtpobyK73ujIdRnpkJ$bali)( z5FsCFfqaR5piC(9D0$f5N_#*t`AiA%%i92Xrq?su{TTT#DGVzQvAjb<%y@rgd&7L6 zJTf=k%dNLV0A(zZdTx2KS$Cjx!qTdjh$Cw7zLWIAHyF!xF4l_=wYd6v6?s`X+yDp3 z<{=U}@KH@x6Y#085zIm(9yi5sZMN3yhcYiz9DwG6*AD6xG`|EO(dc%1MeJ1SCygoX zzPSyYy}O!+YNg;$|6Zl^HG=+bQWnCx|3K8zZ0-n!JA+%qVJ896J7S$Cs>3}s# z*#0l;rSxRHo_Y?!;dRdsFDZKiKATHugoj}_KD<}qV@#a0(Wu(7aUyu5!kADJ`bD<%2kCM=r)0Ol-i^Yq;N{R-Be+h|C5M05~!0hSwz zDk{=Pb{89sdRYd`;RCoFUatQn#;v&AhRf}^aD*3xYT>9G91?^Q3O_>fpTh+{$^5^93nW?cSQ^gw^1(>|f5d;~AM+q$Rl!_FngO%Y z8s^Z_iW=r0{=dcLd$|1XxWN4qGZDSf#U@VYH{yw7)nxdh zfQw!m2UwG}GaG*|AU2*u+br=TCUVZPXp_EHJ?s=x|J5pa=YZonj#H+;ymOeYMa!(r zIMdEMX^q|G+~kZq4>?oxCP&YW z%f)|=?UwlWpo4#-P8EG{@1mA--19}F?_W$U2Pe&J9CLrquII(09Df`qOH1{FcpnZw zKTqfq=Q}xiIXgzHmqb}qIC}YrsB-l3Q89+-<>E1pV{Q`IM+|esE|)RPM^y~-F%`pn zT*WY-5RY>dbF)6FqL@#qDCP%L6!U5C;L41QWPaJKAL1v(GRM z{9bX2evgXxiu>sIMsdG*fFqZm<{0K?eU@Wy&k+^;!CpD#0;zc=uSnttcaOb2EXsBg zk6YV|rM<+lfHv(gF6EX9M>ZCeLy5j1+_SR5IbDCb@4@La(Y%?uVxzOPFQ-iPs^9m@ zcIG!aT>0FPV9;@?KI=9`)Ur5Ol7X<|UEY8@{LqsY^$U;`!6op93VW28CPST;5ZCYP zUZ79#k4aYG4FsJ2vtZ6w59S=~9t}AgkOUKzgd5L%=vy4&IkpSGTDN4r;obVrB~r9< zeZPNqM`^g@e7h`*?7|)3g!KX#63}cRwzZ2xn9&-T_vWSPp|o7hOwmA7`);PW5Omuc z;a<()L3)r)H+Filn8JxbltuL${Jx=&Cc%QJuwy@4AnpuyM$T3VmPV}We3rvHA&0Y* zgV%qSA(^RIK;{dvVQFDI2jlP9yp$sdxcz@QDWAKVhcjsZYhgj;q9HjlL7ob!px8DC z#dbI-HUeZg+fGS?*W&9BqLXSt(tRKU3Wc4G_lRYuN87h z$mfaJ>U=7NL6d;bY342ym1Et|(ZXgSl4O6C5c?v|VV-TP_{47HIY#kKnScIss9hg{vD}90y>4<1*MN+qwRyz1zS;?WW(P- z2RLCz=h7A4Awv`>S0OA#dAP%i__)_rk)O-@*VH$027G?kffDD!9D4lN=fF2>B(R$Q7-nTm=V2R<#GuAMNQR_$nUBJKlw~ zS8{bOGI2{D*Cm~e`#-7|3)?KpyPh?IYlbPTZSU6QW4xnn<>t(tfKu13@OHO#>$?ASX>amt#o zj!4h9EX+Ze_c1m;QI5FB(~Fo(5A|})s~5m!*psR*chaKtZry5Dy ztTjCYA7VONlDTQ@6)%pg>*uST?8!KePE3_;DYoM|`WYkkV+oHhv3-Be6YOkVAn|#9DoJfz3%(T0i4$gl-0oIVFP5_E?X0MDc`07m9Fxx7pA#*fdu(h32 z!5jd=oMrcO*AT44=dM=~cblIWCJ>y4HSyh4fVyTveO>ponx(-!GD;laUm%VNiu zv1FfAOLng~*{?fd_L0oO?~9w=vzr@XH?s|ZH?)z)cd&(}^}r|eR<`^jp``-E<&>`# zgHmr3IGZ`I(~y7jAz@S6ValJ6%gguiqFrXsExdug7P6TK1My=xt-dX{L{XjOa_~E2 z#3?vYD5Dj0?xPyuf%o@zsiCB5aCHr(ObuV>uyuu|n?7ZuFa&dRT@|d0E&7^^i(OwR zySYK`=cd&w>(M9Td%9Gl1QUt4G`Z*(^T)#j6JuNlM+9xlb_+GM-jDmR*l+Bffc zR9g-nO}o@Ms?LVVjmTf6@~HS}#B(I(5bxDHEQ?bm#mv+Qlg%JW;`5R$!Unxlm+?b5 z+`uqwTb6%=-$1UPw_`UXWw{Zng!`)OgnaBZT#<5&uQywp2M5tH*ODQ)0Y@~!-AVcA zXVcz{hko`%g%gl=Y|+Yo{PP4FEu69hL9W?eJGO4!0T)t$Z!F0IxA=&Tv~8um@Eg+W z5c4+9N@)rai_EAb@+Xaum|Bj%;ZQv#>H|((mJxs7h{}C_t4zc-d}jSt%CCNrz3`7x zEfp9&Y>&a$Kauy&xu2%o4kHg|ApiI-`GK&0dLZ}2(A*BZYMnIBb;3!>49F-&as>E5 z65!&%RAi8KGq-tF^Evfu%01jHz;wc1U;eF@w2jPw*F_lj~cf2NVz zV$grf56P3=afR_*gbG?I!<(8r-1)lDU;Oh(av4GNVrBMOb(rV!o6zeQ@H%yw6( z+lhI701jCKf)5$+Y!$9wT)6sU=ky4C3I`392>-cMMLLz*8y*II<2JvOR%%N25GDdEc%6Tv;Obbp6F4^%uGRv1qKX{;^Q`c- z>kz#=On=t^j72jHbbop4NOS~X@nwI@ccVk>0OwF-Z5{4>jnZ9Czn;>^I6X({KT7Fk zPCr5ELnUe=nL=`F@u3$z0RX^wu>mo9Dh4(Kl_F^!A@d*XX-L(KR%-hZ%pEAEKv& z(acF2iF3ahPBSo{WMF;}-=#qL43F%T7$s1CP=WHXX8WxMY&0^=oN?IoDs>cawkh80=wmJ$^l8YaZ5=ixZMExngK zprQ6T4Z2xW%3|zK;gY{P4q<=Had8N4xK`qZFpC@dq}3X;)Lk9$F7VF-MYzk#NoKGr z9R)m$3tVXXJzTU4&II2mr<)3&D5sn8lXAKlBbz?d6yWj@`t_hW$TMPq{urp}MMgz% z0e_g$Q5-qkF~@A6BFPO-Ga{PE+`ATXAG6{pRa1Pea`{5v)ny_${Y!u7j*wcF!|G|& zcI_Z)ORet=mdnJ7hSMhP2uQl1W9RbBs>LaM5E?doD_K`{alU*eAC+ekx(N3&AcJ=y zp#kBL!v*oIf^>rb=F{!K5-RW~T#e+FtIk}~Ly)Y5O$x8rn%FFE{-oYJaS))^EnzGT zR*Knvc(rc_cXF@CvdVwg?b>c2kfmI)d`f3DMQ|lt)ui4aU(#gMk7qX@imiHcN;6wTNgqM4rX%qh?uUM$F=2YSiG9%xMrK}nCkZYt|PaQV3 zdWdkoFqIsSPXf`i6mFQ(N8}cJbbzWydURlIhb>oBn1?W9HRpdXP$@fp)*8ed9NKV9 zW1H*Vq*Yn$oZ$LwT_4@C_M}KFDb`085+-lkf$JN!Hl?cS4-tYgEWx!6Y|fv%fgRvD zpzGNAEbB&SS2$9{!9tE-<5n%*sufwPcO@C$nXowZbEzQDG+Z}aAslOt>Akia81`NU zSa?rb<*D)xQ+a=Cvw~Ek65HsNI#)?W{Hy7O$*AF!#uSO_^9WWa3kYDiH|M6*mwk-E zwR(Z`dGw#v%fD|qzKgP~=3}2|3d%Z`^l)6kp$hg^I>uh!9rlQP9TWeX*9@rT65VY^ z_?Cf+=VPd-!jLK29zmyYW<|O&rj-cD#UYLJtia5rb4GtQ)4{fky1g|d$5w&$d3mO} zEv!L^!cI%H-iP{GrCA&rK!!*EQ@H&3zCAAyDfG%0gPwV@J{mu&kV5rp$Ggx-@<_$! z#^40>$~<%(&h^=Rd_qb^K);S1(^bu^L?%^YchBa>%zb(`H=g_BKF{XA`=&gbzo@T1?u2PjjdfzN6asj`C^#JDi`r+YR_MFAVi*KE@?D zqTN+}nimIrn)kUgFGweJOpgt5VDA6VL$()?$QSZgaVzfbk@IGr57*u4G0E==4nO40y)I z%S?Zyf^Z-X2xDjoeHk{l^#rr?Ob#Z)r2LmPx1W*PR~-^wS^I3}~L4#woj=uh!6(#L`@f!7j%%QCAPhFv-^%W5WXwq1 z#>vCJuygSL$Y3q{+w=zfVyYX@59x*s5+5u3a}{%QI^Bs~d{^zKEB|+YSH6_$$}2;< zg0ye%-jzL^Q|+=>sT046iXS(3*`|MhSii5gX)fDd63iwWr2?jmT1=}ci2X#VII~-n z3K?JuEUDE0Y`apI0sT*BDiyh+!mRBGM{cfek4mvE5paX?D+&YgD+Y3L{E9IZzoN)} z0J}TRbcW^s8xA>TMn$HKN?R^RvzUmA%I_wnC~ZsuS|h2E!5s`YSs#<2YH7gMt;G^M zU8Bx+jQw7!AU(0k)msobD4q4K4wbRHY;V`_5z-r{QsnG6R>Wgw%s(C1LIcK-cWbd- z5=r8otXWzBcR+~0A~Yxu4JX0%B-)&RpNiqh-hn0lt!CP)abO9YBy`xol!Hr{RUKZU z5}TnN=m&s<)MP#l1Hg6e9dRKOmk7u9q~n!>j=xY;A|;3SeTgj=kb+1Ig;XSlufM5{ z^Z!Xig`ul0Sx)8txC*>#cs2CdCw?(r61;w5&3>Pw)-Mg2d7PY^D8#n1Zk5k}jUJ(y zA2z>9)P*#RA5G8i_xBCscZKiB?GVJxt>ziNOAS6ldsSDdudY1D6UxQbFH&GRMde^l zi+BqxHnIU>xel~zr`nZa1|iS{PwI58k3$cJ)^>$)ORVw7I&&0$8QHGxz(ycX+@uXW zLD#&-DSc@t2U6r0u8b<2;_{b&!ePT0bCysbeUiUvT*m0c8~P?U^Gz;)lgqdUeJ{g` zi2FQ2eJ;o8QCVTmN$Nc?WrgeiCSxI+P5d1e;*M-p8FNhm6Y-9ul<)xW!4mqxJ8&9z zsEJikm8i;g1S8sx;O;kzwT6@5`wxdQQ2zDo-n7*C^`RP#`Q8d#!&oMNtvzB~^N5*2 zI5R13a&Lt5yhco4)&S#&H4sT~4Fj83G`Kjv8|oSDM?JrdOHU&q9T`0AWHbfq zg>XuR0y+>)hzfhF9%=pybC+O13XBhl2{d@jO+s*Q@Ni-_yiLG=XL7F+9Y~kU#@7k{ zEI!a16AHb)C_(-&8tjg&PdW5i%=PMG6s1ItWt;M$+I~?UIHem zH&VycWDJtgC@-m722RuyKF(U~vrXMF_Zy9*KNLyuXR%1$`dB2#HPC=QYtE88kYh8c z!*~f@iNNzi!;&Pn5&y>!c+p37>Ma?oP5+(VvdPifK90A4Z{NZt%$Ewv_k3SW5~46~ zFej|(M6{9FrF%pt(Yy3MV}FifS%v|k!hEF=me^sen{pWYPCfK#54pp!YAh#6!~yJg zX4uhV9_)Sk%l&JGlndF4=|~r{8JpZ)yym{ugK=|0d?em;_d6De6WupB7O3DChK@z% z_~me?x)=(7_B49dcr#9QvjfCtUGARFbzd4}Pcj}!`wnvcN&DEvtejTq9MnR|~DQYh9k4+{}N z_xao1$KdbgdG{YCgYTvXA3I|-Gx+NpyE`|A7qG;C@oenQA4X$4CZ*(5N*DX z2(_GF;gh`Jw3D`r)F`F}|FZpwdbS^JMIHE+u8;y*TfTrqf~Ze)o`jE@cO?oT%5frcg!&fmAV&#n0Fr1B-_|^+k4eOuQ%2@{gqrrNcR7Cf3-}1 z_Yd_V&Ta_--PnX=ddn0<`MpR`0|XC1tu!W?GdJ@`Vb)6A!Xq)MJy~(DsY?!4F%Jyt9T|Ilz zYqkADZ0QPdBnLqZHWsk;*>7XL5@OYVDzCi$wa9s$sjX-01-bS88eY6TZmwQbOHvNdL z&BWQ}omteHIM#$f=@1TypnzlAZ?mOi%^A1sT;o(6+bKFXxNmdjoR2xv&Jo9TuZ8nW zXVf;`JpSMe)4j==aF07<&YXLHm|b9wIirrtb!WB=)^{mJz`tP{YNHUEyIu*Z&B%gP zWdJkvTx2a1weq3??cF&iw72up#O*}`NEwF|DGjzN=`@?u>`WS>@f4MjeIazB++}ms zVAn#d6_r*gGF=qd$&jP+JFtOO=Jv^9K4;raj_`56O6m3@=b*7w;&eBE(+`)^%9*q> zr&Tg(l@|>-L|Q3-&I&7^wTL8vi%&dV zvSd1h>@S<=o?+4kE<&AXgo&DJ3u5&VjQ;0L^y0Hb>x*&fiKD+{^hJ{o;C&_>mu)F7 z&4oDrMT>}zs+f4C5REE-mUZ&fNgNw~@ z7|eU4%^umS*=yrw-)QaE?p6DBaqX%2dRpK4Mq6Y)X15k^e6!zk<6hr0`(|tZ;$F4S zz1iBov{&sn?^!$C%5d~us(Vb<{i3mIeV8ESIZMRu!3lw1r`z~{pqXx?S2_tpv5V{e zsbhL6PiL2MoMCq&18bFC)lZ=hv>yo;K|g!Q_>v+q;^?YiWMkT5M;E3O?SHF^&{%zc|?KnFWWUtsPG5r)SEH-7O z3G4G&H^Q=09&*-y-5Z*Pmm$Ph_Y`<+G$CW%kEMKRF|EbtFROf>U$efcXJ&ru6Z$!E ze8?x$_~a!EUi%~pXkYf^EAfXD0d^&x4cX^+#@}|Zs04-vA5@sIr0&FJ#{mdW=33XA zGdlH%jnkA<)`ST+BQ++6q|BCUn>*rv0R5`-vSXu>ZnqtO_?W$3nFz189Ff4s%I-Nj zD!?@+&aWn1o{zbflpv;|J|aES2eedZT;&WDxDkFK{EcNF+_en7T-Awu%EAZQua72) z8)1t&#X^H>K>Q`uya4L0BkI-02fVPU9XLy(i`T?Y=;d&8_9A_Ios`5p$S@;-2PPRI zpkl#^9B9TJF@AD$6F+2R|ErFrpUgt;{{>J>0|XQR000O8EVuda0h%odEPP*AU0nv~ zjkla00`CQXU(18v_42-fylA|6cY63^)wPl;;(0rWRc{M>8tPa)ziLu%2%KD)#rWn1Fx6R-$^7>NYL2pGe~BU%puu>WG|9^ zNcJOtIe?^$6g`2W)2LOUg9>t$2b>3~xr)AsCKl1eA~msyCKl1e;%OY=qQ#1@(m+3r ziceET{b^Ksnks2e(=DE+TWC+8rh^Zjt!QU|PSEEGUw{ANd+TaU;s;59B924q$Ivts zPkAB#A+4)+HBa-@Z__RqXO!0z=PVvp_qBz$`)b2i>s-LewTI4aHk#tzbAlG`g=V9* z`Qkkba4s8{G z10ijpck-HA{)2S7*TdIz=lx7RYrcB1SL}Qc$@7#vih~Lzf4KWNABv9p+ke+rxczs3 zh1-8DY=5yn7P|ph0oVo@M(11U)~@2Jo^nN7rN-$7`m#>99Q(BT300+AZ|fdujC6aW zTkr~=QZ=Y7;U#wHnrf1cQy!(O=8o2XmAO=q!*|L{Bj=`9Eumi3yJ;@7g0hUzgnrfN zT3nimN>MYzZDpy$IGd;Z6y>Q8)v*sKf=1L( zuIQ@LD%_`Ze)sK)%74$(2R*D7(5LD+`cN(Q)i2(syrOpQ?7KpNw)n{tbVOr+Q7w6< zP&U<9ROds~`$^BFeoYDEsz&Fg@dVWw^t?KY9#`i^wEl9ub)k?RlvsRC^%DXjq63aM zuQ^MY3#mZlqq9k2Uu@Lv`8|H3vq{w)aD3mak^tRst5tux+Hpy%sX2`;Uc0NoV&iAx znL@l4oNGNGUEm#zGCB7PI~%n9N8Zx+_zS_&`CsTJGB(8`Gs(yt_} z5&iVDtQ!Z_(CH2&LPaa6No}hXb~;|EuEqMR1)tvNf{k;}UQ-u;=T+w$@kTX%jeg={ zt+{Crj?_0%aw!@qZD=^uu=ymvyj5!2`54nlh1mz5bL1<)@PDM&aF3=#rgN)L!nbq2 z8OfjDhC@;8O-P46i@Ay5g;b~W>)@ou+ zcRubW1?p1H(^gY|%ledZMg4m9!VJ~csrHPg31f}UaeWd3x`t$K}&UnU{GOKhG z)JB3^NQmUDvaE$|Fa@O+c}8tLcJjpyyY3Fp(DKru&Jy%#w)#lD=I|kLq=e{H5L!$p`!J5i{eA>a(ma9*pT0d{s*Ln*^ zC0|`9`mP52q2udKyTz=~x1IxWophYGLn|2i=vF38af^i(DZgCrcS%fz!xEMVSP+`4TkzLqV~ z3uhMR>Ds(N0A(u7ps*K z#J^0*w}ewhq46-a5-l)W2cq#9EjIMcl2AtFS+XF1hXpfXFVVJkQFZpx@aSGZwXW)F zJcD#OgLn{_2a;3+E-0z_(SQJ#Ab&9R(ty|v_dM}-X~ALxR%pM9lOo7{-jE~IBgRa% z+L64qS`CKEk!M;S#@iox28r7?aqSAJ?hvCu15o6I5UF8_7>4V zSM^kX`QVr|y~k!QH81(CTo(r3*Lh05JN~|C+1Cs;M!y3B9CL6#%W_L74Q1Bb%`ii1 z6*zb$%koZ8Sjn+%B3gcGRO3`V6?;~w*JI%;FX&*5tLn!T=nKT8RF9b6)g)woVw9vW z5K~J!3$DIxd`#IPJz_=an)FH2$D&V$K3V#I^$n_W8{PvhgdNWhpSCOJ?%&>-s7u-3|yrPQS43}JZ$=$QP*E4rip^N-C zXtb1>T#}BJq`Ab3l~`PoiIrryBpWNqa!D>$lH-zmtR&ARW3iGkE-A!H&|`yoJho=M zqB%aFACH|M=h-^$k?y#^j(I3rc85t zy!Pu_;Id-*)SXr{X0?w|5 z_qAcQTo0VaebwU9BYO(KEkmcwpyPmT)R85eSS_v14k=rGEyg*>OWcj4b6QG;~Uv|G)~<=XNx(Sh^`I(C!Ykr26-mLh$0X=%8XQ|!!% zl+z_z4+r{Fqv5DEFV!x0XcXFxE$BHnnvHtHZC)O3@A1o_H)&);vW4D%Wv5q!p2#OnFW!fCJAE#C}BaIsH8&;o%9R%o_vt*~{gOH0W%EuTB;xAd%A^QxbJ z!ge1cV*LQM{iJx27D|`|o#zx*J9T=UG1bUAhS6f<YXVEG9CXwkyrc^+wBf-iCG`I8|#j@zU#Zp2s}8 z3+1q(ez!&0R~NSKxs~fezeM@kMC98JI<-Jj`x!hP%tFq`k+2w^Wwl1ieQ(M>k!As% zLtAch;8XB(eM99J;}V9P2M(kF-+XWIiv5IBYpvLo485(z&2_wgu#Rtu&Gq%m(yTL1 zC!RU+__Oj6o@_0*{Q?yQ`9*1>LCKThfE|aCCLgNXNp6ARH_+To{eEi)%cQO7+>0&969&< zM0oHbGZf)pVSd!r=%YiUAyJdWb`rHtLq~^DPr~AZuDVTHj%NhIB1B#2HgwiA0uf5z z)?I_NcfN*yL<{383wjqy9zxy{ENEzMay#Wwc~nAe2)h4@LZT>%)gpB@Nn(Y$$X>K- z_Y88U&gJ!UBpZxoQfFUND>+i9+n1`F^12wWNJ={GBKc@Uv6~@5&YL~Mt-J}%3+Hd) z^baHX5hP3*$#%;=-*$TwU_Rme1ha-PsHNAcRCfk{tXWe%(#0zZucEOERCp#Mlhqzc zCUaU=Ez(E3zO_G6fkrmcr@ol+_l*0~n@~wrI|v&Ne;aJCJLm=L&>02q8Aqhlq`1zz zU7fUARcf_V&+t;L{uo}uOYY!Z8MQa`n~Q+4h@YtH!a})4b>h)P`1hn+c57=Srf^Ua zP1G8HBn!8(Zu1gCg|4$nO7livj8v`MtT`*8D;{zXa{vx<8X=WDxm>>7-jw1<%O*h~ z3d2CG(K?GHN4N?ii8>povbn)4SJVTnap&ly?YhK``WCn0ZITH& zN0HVZ$qqX+#0J%n4Z6m5B4UynG0BJAWFM1EjbM_$bPIZNndHUta-(VA0yiL;ri!Y6 zAvfS-2rX~1fw$PepAZ|^8egQx-K?LN)QHKyxOG6-giR=roPVDcHK%Un1E@K42fz0%{C#58n*u#hYUxCbI>)_Q8mI6tgU@ zLul`L<-%%x@-%|Yz)09k{E*u3KilDd2o{#5_Iet7MfGiChb7VpXUrSh z9{18-K9JeRwu^NAglC~7Dl2hWrmt*LXlyVw(B7;v6_!s^=?t;Dc->hqiCRH_ZjP8? zFSo}tqg+lJE=foDdW_7xUZdk4lYG{ux!4-C9%BCXh5X)}RW?>yM5k4Dp^cci4QkNY zw2u&N@(n|gjJ@lPX477&H6s==V(LB(cg>|n2QAd-3q7`9tlNBtSoh@f4D_vM>;1{S7{oK!^| z51J~@44NveGm$~T&ospSp|OFh_S-O0XF@9j>P3+;`7`~d4U5i(K`~=z1}zY0`YaG< z;uZ*h{LG+jWxgO?sM+|-mQ#JeJaofRVk;Y44SZDw;S4&>evXp&fl1tdkEx$25Q8u@ zOC9_xu>zN8oqi?^W`Q6QIoM(^w9i@y?K~NZAx%Yw6KtzH(94xojgMGcciH{Qv;9%% z>g;@b3jXw2xTr|Co1r<$W%_nP=z*3F9+UJ`)ROb?!a-q3tsFsETh9$mz@9j_``jBz z+(ezdP!#q7vH|aVF}&b^*!*UGo^@hcK3g=qZBd0?lICB_t&#%%ni9Hnp@942J&Fmm zbl+HQH(DfOMjl{4QLp3D&quFwfY)Oxg-_(-O@et9$8tO6_}3k+`_4n|!Y# zV|MUv*gdYnmIBwfbac%dTdim)KHxOM#Xgk(NKB|fr2C_j{v5=A0l%hJlFQB7#kR9J zuQTb&8J{J7bG98UqM@Jo-|n_J5~snM_cF%H;IT5*t$b{J1{Xw(MkXAZFR4fJRFv=V{?gbGsHTd8TJ!3Un=MIV(~tQMz|!H{+FN6xlL8-z;5GqNlaIqL;&N#;XZ>g1Ig{sgvFW zYAvfQ63~%X@+Liq0@L0s^<BXKnpF$!-Pc~Z(;s?Ht zU9Ty`Ikp|wx3*~I>hN|8KUrhnfHahQyqLIbD)bG1Y)11f^yhw#KB$=I8m&4>xh~(A zm{*gSpOfGl)i>8Wo9lr^eZAIM^D`T~g;oYxIol0ooKCES7VTC!Jas{@sT6zf~CvO;< z_QqB&WOUqqAD_eC5-a3$KdJT%>GUz^lb}z3QmEY&eN6hK>0?1TxT1D5SRiN)BhFhM z>EJ0G<8e1}6K&h@@~eqp(Z+F-j}1Of@o|EWO+HTYaazW0NRCK?!H?3M9qSgntT#4` z{I?Sa8fT;Lk9vjeEJ94Xg$vtMhA_RKcXQi$uON&y9p3(F;vqYFa6Uojzu0%)>^q-- zT+?1row>dm>Ao5%YGJ$YycIj2K@aH}3M`VmLP`TY<-<^aOg!VmP=C^R!iT}dErAm2 z!U<|`%+sJ`@ev6zU0v>X_cC$}c&x#ZHR4x#FxKPJHsj^ItjN5Y@-hLh$_BAYaMe0v zAy0B3A@sNnv#p{13y|5)gt7qdUnm8C`xj`b+eQ>vd=~?8FYp#$uh-mNH#7VS-9vhG z!wta;nEx?HZnX1cKE>=HWNgx6(3@dApJc2RbGD+RF*{-n;`^d=KN2!5$y?wek>T&) z1yT{8}GNbanpqW>a%r82z=KFhpSINd_ zdoRbE%f<#6gk!0Fyr2=iv=@+k7|FMdU=jw#@5jI+kX1%F?94!b&qjZei{LZEA1nAS zgu*_H|3wXfmYU=l+4$?~V;N&{mH}oZrF)R&4nihb!e^@iq+;WJD#;|K?|UAm9Do|Gt>gHArb}jV~U&g zESf5m()}~26o$D?yo(f9>l!#G3COu98xA(fSmfuYLU0?q(z#47=Rft0BcbS zB}_|d#0Aa`bAe#SjhthkdpXf29RoAcS6eE3wCb zW(>#K3iXQCffrLp;9-?#3#$}5^e|dhNI>V!TnVTQGnhBY?W7=%>?J9ea#O1&m83ar z(c<7`ljz3qQZveS#!E6anM66JR3TWO+xx!SMr`von|gz7-JJ!0eJO-em# zNJ{fre>@&xB2ROOcVcy}6-q#CCVUnhA{Mo=FF>$Rj@2$u+U z0|jlcaOx)*4Z%-RHypR)8zgXdDl9p!(;GO?Z=UEDbvsT*9p7cBIoU+6UFXlk<(a2?5)mH03t9*20k z1FD=)%b8}7q}y@cMpY^%4k7i*Z6AE%9$b3_$pVtQhlkRCIZS11XL;FE_ zi4ZF5yeX31G3`@eFSHnbl*%kxIN5$cc|nV2mSyS<(!P~VmA*5phO0Cr z6lh9+6t$40K;+sQ4_|Sl9QW$+!epS!F-m0xyZYJ2`lIG2>)W$J|UsrY(n;#O8)V6tx>}rngV+3vG2HHw^n)BJ9 zJtNj08?MQy+z5^Z!`Rh@Ziwr7NMf$2P<;YfnOHCM?WQjZBVRJ$XDQ^sqvMPvm%SL;x&-IB0D8+N_1+~|eobYgbVz+H-99Of*6KL^Z*XswBV ztFW0ShK3a3Ao2Qq3r-_Yc^pI|=6mLIeYL}GjPeW1GjU0w?I7^!CdTuCzWWX6Tdys} zdF0{wB|I`IgH1aCletHN97)G|Y z3<}mXxw&qm*1>zKl`lE%)=Dr^baTFc77>%|_+q0UOFN4_>z?y=6{{>W4*CKUnNP%| z;sNP-+PO0llUc~oS;(oiF84z7e52hW2_>@6Nimrhl?ze3ECnZU0{g(E@XZ{N8PON} zZatrgEj;iCJC7rI3`th)YjM0^3msV1AEvX%wa`_R%VRayX4Dzp<2*yUCgM|nOj@%n z^{`r2^IB4!(h5|=x^5uWZ%}5ETyEEuJ|DlNUA{ z7i&$RXwjQKN;BsC(SA~7GB^^_`y*$aO?$q4EMDc&TZwYJ`MkTeX%iKmu@UjmY4=wP zo?z4n_po%%IuC#zRDP4rJ4Oh9A{LEgaBWKqch}~7&>+3jLtBO;-_ev3I7mqMr*FBb zQoRbVk#_CCvpsky8hH8EdQeevmeCZFvMJl3<#g%IhfzDKLvyUO^?o$!y50+v>Z{S$ zdk9;Rhw=+b&qE2i3tTX&v}Hj1;%_R|6qegb|6bE+1=PL7ELO@yc*fO#R}J3(tE?tj z2TQs-3qyvNTp>xHbGV*!yIhl^TBesGy}+cSG*+k`t@D!}330APId+lY3dAQ1x_38q z;ZxKKiC2JcysC+wj+frL>v-svEJtohj6N{m0OJZ)_emb%zo2K zcD>Q6w%`Ui*LHjZ@$t@YkKj}Pm69tUf&EMZQ>3MvL4bMwdQva4K5wv%ycd5w+F?6# z-wV^pA|(Peu1qOxmm+;b;7w>#%8JguZF-k53_I_DBaruk>p{GKIor8bQzAw0mZUc9 z4d*EFtxUMN{*gmMW)Pi(Og`q}p}eoxH#VIJpvUgqt* zbT=D_v+~_x8$9py=6%h)huF_B>xTx zd&>VilK+Kd3f((^1g07?7jw*cKThQWFqFF8 zY=(d+oV*l&O-QWdump4vv}UTtUO1{Onuw$ay^+*QYUz4XE3z4_pjux_ChiFLglG(@ z^G5zQGifF@)k+$49ewNg&gM-sn=nm{CN|Z&o`0Usj7PZx(b07NF0)`-<`Fu7k9oV9 zr{gT2DOqnb3sh=QdqwW&5HxQ(`0i||{m{I&QAyZ;#%i*X6z}5g&blyOPFGU43H^k@ zQPVa+lTu+$yqoKpB2D!&;xPs;Rx1px`?6BWiN^u2OC@=693Z=NGzOquI#;mA?c(Z$ zg!2`%#OqH0csBrqE!pFM;N`na4%IvfXx^aa)X>>e0PPLVPKzhFhqsG67&!NkxRZf% z?-GZ90h|jsU;5qyNMHKiDe zv&Fgg0z*vcZ*S54275Q(gJnXE@?(px6s_Sr11R2kT? zYBF+@u{duI#QR9EVs9&E4`q%uC=UC73T)Rx4W+G1+?2%zdW=UlQixnhqw}uCt zpWK133$GruMB{!x0kIvDr=kIF&R|Dn(tzVKscud6EwZ}<(BZQSE?7ELT{M`6{At*#}4XD%d83Z?<*7HUxi!r#VYhmUL5rPlD%S;FD0G zDZ{S-F9hW*_DN(YmuQtdHLSIo<=B!ON0mtL0(_>)DEL&5ybA+m$A(JaF=X!oN%L1# zhD9U9+2s5*vVTT!JnU1knTk~@^U$7n(pu8uzi}X(!Uq+wVr93@4RcoWSWIJ(BrRvX#u905?QA6 zY5}(Cn04A9>Mm$gOx@a-4PE>45K{`<8-g2%$Xjk`h?BQ86B1FYLCA)}plK54)^HP^ zM8QhJl*lBJ3XF;-lQgzMAyf%5epx=F3ysJ^3&=uWF;((Rxr#8VLmtL``W`)eQ5^26KK780kKcFPGJDvSH88`Z z$*T9cE7O6y5@*u`ZNXjnnV>x*)?VP8j4_ua=TIXHG~`xk*oDa(+T?aLlg^pK5XLuf z$VS9!2Fi{NmB`+&jCsc=dTbsuY|y*t91oejobz*oKE&Plc+6eMYyq5HiibUB zFv^d}?Bo0mJ&O5%n|KrlZqVc1Hw<}aqoV~5a}<0c2i6^TE)KD9-hn2aj8hDx9PpvJ zem>OaZj5uH@i-^i(7uwKh|gKUxdfj}gaXViTq?=4yC_?g+uKm9M6FIEXd=Z}fLJx) z;tB2m_Y>F4P`yN7y#&`wjNp68kfUL};mx>tKC)WJ;H=_*AP#MNjDtX!JIR{hIMJDW z5Ms+$5>JuhSb_HhWvGozBwQI0UmPeqHdGSu#bO|WWqI7P0VmAz`1}SxcS-JI!Wnw* zY~OQd`MI;q5AjsF)?Co%N$PVhEcbGOpg9GkK*prkUeTN*%qb0OB|-c(b=8nN5SYJC zlOS(0f29(CcZT_E20dZ^I*TJl9mKfI(Pxi`y#i_CuVcON-2T}=7+RpkVv>41U@!9k z-#UlLM&3Pi6INhEqThQW=5f7WE`V+~k{=YJ*?VKAFh0N(LOjwiT8i1jM8qQ)#`SG~ zaBksSVe_4}cYtYpIFk1y(~yiK$0x5dDsSDBpat2PY>$#1jn#ms;{2m zsjLU3SqrsT7wYLa8YWmGU=~~>3ya4)NW=@6L1-s2nCMd+lb`pJOx$C*B77E1bP{P2 zuNq!|Dj@9S;=n#QrwJM{VzDv3u$b|f`*<><2qxjxh!{$$GPGzxg5}t9rb<7z*&5nU zHls#?t&%jE3@^^rc-M6Izq+sL`)zXODD3EAuj`V zm9U`!+(qX*k<=*Zvs2(VaEc)veNhXyo$d~Q*ZXDwdg*&Y7~K*tclt_%llF@G!b^bS z75b*)ya-yNT+;bQ#1ndx0T68}*q3p%JLOF=c<;0~&EUN=^bJazrSA~Dcg~yfX1%#( zoq=m5c<(uHPq*lSDFVFrw-{76;mw8qak?f1@12W*_s#^U3ldOwdIZSsbRWp>-T-8O zcOQf7ro4R&vb*2g>+ScZ8Dw|wE9!-Z7-V-Zw=*4q?C$gSc_GN|M}3}kn@ z4`g?`4`g?G1jueW0NMS7HxZU$n<~d?a;{stAYuT#)(`-1W(a^cGX%h!83N$V3<21K>3nfcG;o0A8zq4}fa{j{tQjbP&a1Hf}{fSZ_Bw<-_6CBjI{GeoctrpI;t`#4 zUS$Q51;y`S`3cFVk@VxqzW)2yuV0@ZlMaIcr{5>Q; zhUD)np+q}?*V=o=MkrSBf^t0g|7L26aE~x{agW&jS2I zB>xBri_8C*MGz$a1j#=gmNa;Oa6Jeakm2J{th@Ya645EiV6FLGL0NAI#Ht~RcQ-KB ztlZVcf9CHS3FG&-_VkN1yTh_tN^EN=cHGBzlfy#V6FOd4!nP*{X-#s_JwRF?4?tRz z5lCwipsXAcoD7y=BLHdTYhoa+2Lb2mCcVTJmGg6OwS*9@F2e4N7-*}1;igv8u)Wc@ z1shs7C6X(u{QVCs*(F+nhf30MAXqGKfPKZLI(9J{!n$h0f+nF~oqwhvg7Tk-6I9M& z{QRL)4QFoXR~+#74NPA~cg@H^wGnu(&QFh+B2R{T;k+fMLplrvk;nuwgxAkUwhuPd+s zfU=H|@C4LDlPwo%uKyH+z?#7ZvDCKVG0wn+yZKk~hOrLkj5jZQL<9U5KLJtcoM*_S!UAJy9L z+zJ+KNQNO;=B;RCAuQMs2Z->&{%lPBx8Py_G*0|^Lr(O6Gir|e>4llUwhrJ4edHSd`mC?5&sEOTzqEWMSNY=M|X^z8d1Y2AVjwjLq+l z#bW(jBvJzm@|LkW+4PNVCsKiC+WHSj{v(qAgoHPd{34QHLh{Q3_uXJgo!?a0{m~;v-nhfQ6viTdT~|Zi#XFU-5scK(-p^0|c2vC+ zkphb*o9Zyb!VaVN#Rm4&u#!2s{IG>5~Cg-zJ z9#Ky@x!si(m&9rw+osspo}ndWjD78i)xt7=(s9(2@lv!nWQ7$&z{><^opSRk`y@Xe zO%dMP%FtNwWnFe%a_=p5xc!@;ORn3_ioFT)xr14CNh@l5r5?dMI`Nm)3a}1; zhA40o{lvvB^wCydWZw^~JutXH;OK*b3yux`5gyVg5DCMgNC+M`+F8w8qvf?T%61A2 z_+fTgH>8MS!VSsJNo?CTfl*1zKzh|GK}b_*g%Xf*(_U_S9IiH^>-2?x&r)p(_BJ(Czqm_%lk1-vsz0$y{q!0DRt9UA zM%Ly{;>VN=TkfO`K9;z)a?AqV4Z;y({xF(Zj`&OU<_k}ap5vZZl-*F{WIW2OB)+mb zOyNw|JwJU97w)zwIECr69}!MQ2po)pTUVm#b%SuU+jpAq6QLwtUUNx ztO`*)^9YEzZ^mSKoF_{N5SLdM7$WY*@Nj&rF$Ak>$Uu_PV1(KbOx(fvT>64OnooNS z_QST%qkN8MN4!o+ibTOibDo9i;F#mZf@A#rStfuV(}N?3E%Jyo{vei0=kGL~$+FO| z@^^;soC((iAi&BiJ({C{TJ$o1YXCjW;b#^2M;u6q>W;bK@MH8xYQPFGPi2Xgk)bU4 zptL|W%r&S5d9MJ`o$})xRhytOASD4}o4g-{Gb%}X`VHFGx&3rs`{@zwr@8$JZ(^YR z3BWGgpnZeexBA+*Mzn8n`z5b5(0<8Pg118R7ih4|8>cwPW@45@E&8#4w3#nXarnao z0)e)RA{BB)p>${HGfSU2`s`^SD1!LRb}8VJPZ5{g*WFL&4$!B}(Qx}_N1_dx4csXWc)-%sTeT&`33&rrF=<)5SS5|H`6V*T&kC&db)F`H_P>OrySHvbG=z_mg+r4 z_3~VA(VGkEoet_*TyM^sqk4Bxy)nM;hPNlE*W!9vuC>S8(=ETEUD)srV2ci&{dTV$ z9qsqZ^o9;F$KCHCoMhiI>iLDU?lg1UY38^y7?+6O&TshQBx*L;%i2 zthR@`(c{6e^*IPvm0DL1&UX|y-ZM%3y zyE4Q3Ljn-bK0Z2%T_2RPO-k1946^LWCrC$qz`;i`I|1U`3HSvKjmp40h^jknN{ zMQv!CU6Ff&^5iwcQvB676+oXgB4+@B}-9)NO4?MiA>bLI_@@PDN0r0#nzk5@NA&o9QrK>d6p>pUhEyamjoQoErFx}A0MVtWGcu%r zp57XgY~+3ac%Izx1|C}miT=?%Gn$&)<(UT*BmT*QzDG8KM}8WQ4CEImMiA#3irm-* zB^qU$3YN7qN-#TgIT$w|2#yEN0!90K)Mu5jRXHqwyjwOH8YTv#zA0)k&irP^X5I)e zV(~i>a>ubZVzfR=SC$jeUNLMV#V`AYV>a{Ut>VC#QJ03mmLe*tD19bAH5jUy*ifmr zI#k|x0`0*uv8Ea1=_Y~aWuDOT?sr@&li91-nU&l&mMX9vSlY! zh)|M{HicGMTeK)bX_rtMNoA{)C?Tncv{F(jl@LiPMM*{5|J-}E`2Br8KBx0NXU?2C zGjrz5;8kQKQTVCdyP#B`b<_Vzz`~#E+pLUljMwkD-kvDqCAjr#nFdtxiepVu{rtwB znsv3w`{bo9Zgsnl^c)eWFTXB-W|w|#-2utCXtu-&e)%;owGx@j!SeCC<}6o}zQF)EB+OEe9 zga$|N;S{HyP~0G5cEU*3+x+T7p~S+^sryU(#_=LgF`V)ynRRA8tCFvHv~kt_+o_(N zc13{)D&J)JT=% z(eaeRmIG5u?{yoN*EZIyxj?Tv7Ql=kyot0O zxdJz%UEKE6TttV>V0iNoT;4TNpd6@uS%aIBYI>14o9xm!245xuG(8^gCHdV+_&w6L zZwh{e15_;?e-Hd|$qbwnOXc95Bpt}bjYz7SkEip1-Ymh@Nxr)b7myo_ut2*NqOEAT$pTE+J=88<;7iiIZ0Rc;GfCvm-XS6^e99!5>Gv0F&Iy{ zNTAKqM1v}Xd};Sr`~_*Q{s%sn8V$~xP4Zj0EYjQ3)xxZ932L4i8&g6eAqc4=bP&F& zLJ*ECv9^-U4AfX1WHY`ttBUegpGA;-s}ZZ#4rtygRwrpLc`d7e^wuth^-vn9TnZ~f z1!z(+%b!Jc^L#=2(^cSQF@dVeS?VY>oWn0QFJncK=8DT%8^{_uyVvTQj*WcT6@oWo?y3#M?CNLuT`*$T_1)MGwJnCy1` zQcf%B-uQ6NRdSSg6o*Ud3CD3(lKjSajsvMzox;&0@!oXKb#fS`$2sT8C@#svUAM}Ve8anIwD zVdv4Pr~Ml%Q&s$}2U0uDZhWw}a8Y`-@Z+tlPSkf2mu{kZ-uIW?P$1UB( zMQ6@w>$ka#`S3~T%@5)2@x~XX9`n!=z3DYcM6}D@F8sp;HMOsIJr-wN@f7{JTB})3 zeMN(;g1qaJny3qQOG?Hb&^cjjA{mWW@)FXfcwWsm&3(}59e40nk&M>eWm;iv>mp)q=D3zm^N(8o>rAQfvPX3prU&dh@8&RsB||J`Zg{5r zrOHgPPaL}|*T$Z)Rph{IpJy8mJ-igV9Lr?~w`*f!W!;muVSM+jjJ#m>y#oiog}&)O zq+$7SKu&_MV;N~$mtvT({`<~oTSBLAzf28#otD3%r3)`_`6Oql{-d))L|dG-)SFzj zzAg53dbNL6OzPeVu_5fG=ggc9ZKeia+cPU!H+Ofmn7_`|SB^RQSzTkpP1Z;TGW;a$ zLoR%-Of-Kkq|cbKOD)EAc0{kCgue74X3}i$G|b_$Tn=Z;ZsFF9Wc^9o!p}wDVSO^I#G7-HmP6J=Zp}fdL0X%IIhOD zepybx9lqUl@u2wuvsbp$>dl`=ysI!Z%bN6b!IEPk$qNVZG=(A=#?hp6OY<;A=h&6r z7scx1_E*@=XFP6=kZEj4VHoyb@_yc$!0KPH-qIlQ_RKgr!3w7T=;=xW%DMb1TfV>G zr)k2#*~*mjk!J@E1;}4pn|;*h!WW0Ljk90OlqBZ7adNpGGS5qJ*JhsUM-jIy)OIB3 z`SXz-5}u{owsSRD(N(Jg@~x{*DT_pH#QS%8waT8TuskRmQ8C?i;1RaGXkPL>nm<-}Lk_27qhJ2E zh9kl$%A3{ChxKW>HL5N4zuqJqw(n@u`_SV%xKp30D49;>&NC(oqnnqfTk|dSj&vnd zFA!HeJAtFMcIV~^-7=R)YP5H2o;3dXX44K~e%bj4OClQjA`Od*7Hzwccjh{OjJGop zxT*Q{Xg}Pta6&+c{K4y*eMSqX#*cn$Z?L05)oq0Jbg%k*GglPMSv{*`){pH)rZ z()ws0@HOFWzeB3Js=@o~%TCo7Wi(tAIGP7%eAw`^YusApmu-ES2@56Q19CUTdpemK zh&*~^yIwl@v?@0xa#!>zeSK=E&M^-UuWKGU0`8}-FxmG@+U`bgnsCX$Znnqq zhshUmp8Gl;+I;_e%jb}V8j}VOA4^M8cDm4a7AnF<}B_l-WcFlLZ> z!1$UQe3+)Ylucd1=)21JKvJtw^k$p8Op9Nd#WL4w$2+sUeBaebeLie;#eMhDwa=bM zq|U86l(4=tSv|Vmr38LrflTO_R--1Nn zn3O2{4{}d;Wr+E+FU6@3OsRg!IHPu}s@kV4w>tHilbgk+D+NLx9}G{O@0~2PY?}js(z?+tw&ujGjqQ1DbMq@TPo8R_AIh~vt&ZcgE^Xu z7V&*%YG%tndlG1N=veaDX*P2kh;6)a6AQ({))f?Ivub9XI~wWM+;I2oK3-L?`^*+u zo$*50f&smd!}jByY{J*$?|<=cw2s7uW=7je&pXTZ9sBUL8FS*H`7SEbCds!p6s%H~ z7-^#}V|q(a$h(%;x;gr^eq?=l*Jpz=g~}B_-Fm*Sc1X^DA2eWH{>G{2)8Ra2zIglQ zo~zUQG^Vs{^hnRV=v=xrtvP8wm#2Jo*|jGAmR||88n@N(Gl}co*$?_I#ao`7A5eDg z{Ilo)q1-Tr$L5FgLj@9Xhu`YA3fHPnZJ*ccHLfQ_OlfJ;2{}$^xWXJ2d%NE8sM-!D$+`m&PP#3nIf6Kk4b0sf&N{S$Sokt0TI1MUP$9k+F_5b>Acho|NUu3%{Rg zXz!L=)Vn+D)tZtVSI?$&`*zONy3cL59E=uZK0mqpvAx|MJI2{12i^&eY@UOisKTPA zWo}@f_YBLM7_uiv%vnuYPd?GU^6sJ$-SYLi+I8%&A-7evU&`6lusHH31_M*oizHHy z-jTw+=0xudN_Zz8=V@|uhf`X1$EIuYrQ5fi`B|7cD<{=St?cl$X==(dgQZGbn$-=o zq{jPe-ivA1F;L8t4>_?#YD5KGJeuUD_iaCOJ>PVpe|b&L87(`JNy@|m8Me{RmvRr4 z`*lVH`gNQ!-~QIN*)cPe6=*Gfeb>3;?*sg9N-qy`5qMwT>2}+LUxF?@bLKs+RJxU&|tq;{wKQPHX7= zeS=>&WAeLa`G2%K6OCsICZ%=MS_^Y)Js`H`2PJ=m6SRnoVge!F$sAzmr0m0 zkCOk^g{I|9LK%NHA49QoF?l56i>V^NuRIYI^0=9PpfmOtTm$O442CJ=?^khbF0#W2 ze{5h8Qe_b`s0<^_FxLQ@i44HR(A977T>3g3lYlyy{wj`r7EUV2q8T`0h}Bm&ykga~6Srj};Jg`w%QyEG$O4|5hE48!~MfJROV6Xwi8)Fw>0 zF%QD;CK4{#q*mHyq6lHgoQ6dB6-i7L738z!s3i{qYe^7v zsn7y=1JRfdDnl_+#1wGhwiLJ^W<$E5hD7;u{$r!F2r3SnEi^Rxes0CPS!!GQ7|zW5;IE7(CMO ze+LF0YLu~YKC~dh2bZM;0y0T>+8_BYEX-h(^BIf@!^SkikJg{*hYNlig2x?YY;zE5 zlZD|`1`YKKUfM9*aj7w}I<4qE4~p<4&ZQG?z|Vrr2z<{LTW z8YsUf1*2kU9}MJ)QGm^q2P`?B#_Hn#M&lwW*qlTQE+^qqza3Uo0KtqDS};d}&;TpZ zBqpCeq^v+$h8HD1`ldh#VcZN_FiMe%=@dm!=H<}XE=58B22PP!PcDshD^lYS9s!tY zK8?-G|LZ{@DX1u+1t&)ks$k$YiM5x}*vJci2R%j!1b7uK2vZ`oK^c))?F|}hR3bD1 z`$1yM>S%17GNDDyWz~_BA=MlPLl5S2c*2jrPpjU%kIVd>d&c|GUga=dUZMPdTw`l&M)PRG)Zvu(Qpu`C*E?TVtxyKr1Xh4Ejm`^JYYQTA!?T7qz2x;V^ z3CB|SLRylb3Fnp}s?;Q$v9-%-Oj(PNrDkj0lSauDaMKW?I($iHuA)`%u7VdzvSy+5 z_tB;hcq$Q&W z70L&;iT$K6P^31?|95d|)%>IHS2Hy4RHODWPtU2t^eTcY!&hWz!#|C38|X$7C~Y*% zZu=8*jz*#pPg%mKbu=8g$DlzbnG((rrpf-edNr@m79!e8oe-Gc{4Hz3qE@dktFsDg{h-wgBe*IY|MB=0Y zgJJzU#6XKYWDl(=Rmg{eHH&cdYj7fhL#}b~Df*yJ{hS10N%p2k?4Z*AaB^0NR_8G#K;-brj#5f4| z4@20Q>jG)R=wcw7+5r-1tq}}vaS$8D2C=nJ$QRhLH6#=iOhF?MW=xpj`D=!_8O8*> z$fH1Gur@E60+mse2_b|sqKB#?D&{k;SYp>C7>qhSc+vjtIMCu)#n^vaiRlqMv^bV6 z{(D8+nt)}i)b<3yng@5@WDHQIg@K zR8fuysu&CX)JW6FkFkU?b3QV(0-N1RG`7{4-2@XRki!x*{ z5hr#Vj0nMs9-d@!rqKE=Q#gMPG>dUysLF#DeDmPYbrxl)?YT>S8D#G8k^em!o#)f~ zGX_}lzgN~5(va6uT9B~xUqgG&XFgpEhE7ZVH(#5E)B1msF12JX^mV+v2qU-$C&8Fu zt9t;|k0;1`z4!#^jTuL_79clZ01GCu@OTc*zk*;=P+dz4e$;YCQZc3GK(e!!0zxtTs&k-`*5^+gIu+aSrmF}_ zC_c>l@JeQR3$1#xg&w8^Iyez>(40;VlAO-tquPmt39|zInn-xyt3Pm168zQ%(sqE{ zyvYIdOf|X4U6ZSXE;>MJP(YmygeNluSvkTL;0ua#gbV3$^uUqOf=~}SLVnp5#U%|Z z|6Q?E(i-+-xM9=k5IfWWej-OdcTf!;elP27hAYhL1OFY-lifoNa3`vI9_<9(5_Lo1 z5+_3a&+|M=aw25$(5@lb4JX2YGCp#eS;1CFp&qLLtz(i|kO)ZkYgxQM%VL%@^bjaB zBuQ~5M#E??lVHC)1sal*CV^C3AY$!aJk;wCjlEn56TEH)#mS-!7lQmbYMBeP^6;ZT zHI(Sb`?Eq+CWEBGpORS7_I6ArXJ8c%#b&`wl}(13I)UCzCLC~^C?1*>1#VI=6$9IN z68{u9-6(Pj;lNZwRZ|FirVnDd0yh%5xDu0?k|@!Yx`&*1h3*z-QMOHg?_-6j06xf} zKxHIy6nZ6VIVxtFVHK=Ch?$MxzcJf;cBsMavwvgum^AgcdPoA#cq)_?-^RhVBB+9r z;1Z!fY#m&@Go<_J4o~v8Ly2x+rR>3wH+~G0Ed%;Og!J7@h i9fI%SC+sb>+?@!-j(kK(u5du~xDy(jlzvEWjQ;_|e}rHF From 737ff236c16d3a5c607d55c6be61a08fe5b02a27 Mon Sep 17 00:00:00 2001 From: akash Date: Tue, 31 Oct 2023 15:59:13 +0000 Subject: [PATCH 7/8] back_to_pop_graph --- build/lib/torchdrug/core/engine.py | 5 +++-- dist/torchdrug-0.2.1-py3.9.egg | Bin 610585 -> 615535 bytes torchdrug/core/engine.py | 3 ++- torchdrug/tasks/reasoning.py | 6 +----- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/build/lib/torchdrug/core/engine.py b/build/lib/torchdrug/core/engine.py index e0321689..701fec02 100644 --- a/build/lib/torchdrug/core/engine.py +++ b/build/lib/torchdrug/core/engine.py @@ -237,9 +237,10 @@ def load(self, checkpoint, load_optimizer=True, strict=True): if comm.get_rank() == 0: logger.warning("Load checkpoint from %s" % checkpoint) checkpoint = os.path.expanduser(checkpoint) + print('I am working here...') state = torch.load(checkpoint, map_location=self.device) - state["model"].pop("graph") # Made changes as per Issue #89 - state["model"].pop("fact_graph") # Made changes as per Issue #89 + state["model"].pop("graph") # Made changes as per Issue #89 + state["model"].pop("fact_graph") # Made changes as per Issue #89 self.model.load_state_dict(state["model"], strict=False) if load_optimizer: diff --git a/dist/torchdrug-0.2.1-py3.9.egg b/dist/torchdrug-0.2.1-py3.9.egg index 00d7395b48af70c4295e533c8fd4f0063f0f6f48..761d8a35d67befa9bb5ff88ce9c994bc801dc323 100644 GIT binary patch delta 335689 zcmY(qQ;;TH6RlacZQHhO+qUhuY}@RzZQHhOblH8re_|re%+=}t&!GQl${8Zx|AY*Q?SGY_D>N- ze)~_F`A~i!pilh`H93G(se)2Ou!RBjdH9xcAl%-MEC*0?RbbF4A}+`wQQS4{QrScBE$zg1pn^G%@}pUpq`^Hju$C-UGJ`*doS zxJZS;EiJ_>&Wc``V17`ch9B41YQPZFNJHqgB(dqFaCOIN?z--9$gvs*XjzXBYGES8BMzN+6K z{@uHa{7Tn-%Xt|@Q2xUt4@H(hJ<>G1QhizVllONwjHpk)@E_)+I=TSL>8ms%ZTw{4 z*J#LE`HH`%+K|EVU-v}U1N|-&EH~oKx@UX`!2XB>l;f@^RsLo7%S~>Fa@RP^XocYR zUQ>4U59zJ(k^j=F2Yk(yX9JcE zBeHb;{6$9Fzc~!gIThFfF?{A9-P8{bD~Ku2+VO!}NF096$2n`^wLN7tl{b zn$Mi*-wZ$FZ@M`}>w3Mzolc=I*}AxUr(VzYcCMmA>n>TH>VFc`j_p>JrPMvMc0|Vl zKn^6qd^`tsnNGmRII!lKuFyuTIB+0RY17Wi1Hc36m4P&41zPFGP{aO!FZJxR3o`dB(X7U-)Vwyiv=C%a{dypE3_q z({JAGzJ?YgJVquPy@Eo0TOp*(kY@G7u-PUyEiO^VubbXU&Ot9cd>DL)&im9oT_+n< zQVFq_p@A6jUx0jn!%(RVu^W%8fSlyq2W9E z4Sn7=*qkI{^m|MXVOl>4O=)Fa^7^FVH^iXg_hKfPJnMR3`GvMV{Ur};4{{)_Jo zKTDqSQA2;`cn#vXGj>@ics^}S=;7zxnmfZxITOsELDY?NzjiFTsD~|4%Njuh`Bhey zX6r%S4ScKLr-*(EypSCG$-D{ux)GgHpzd` zN8am(_1YhvQ3Cb{8l3^qg?Ev%Cxjc|Y!{+_o&0QtSo=8C2&&OA2!o?Fs7*c&-|)wP z4J*rP+(DTTH!KE&e+SS0kfFiTUnK3;t|hA_(_oMmi80kr4uQD(sJ|i(-U2NS{S>)i z;2YE{Resjq8Nam&u6|KRAeJQm{A-wu`*Gm-*kLNmlalb~#yAtOmtv3_S$=@?`R{ysKD<%z+Z}u$i7@fZHQE1kJXL_;1qNN2?L?G2*!}6vi8+5L-FiuU z^Ow?jL^nH{yODc&P!1Vz1l(gF-lxV|WG%Bp&ZE;u zXC`iSuY$tLK+$-A5LPEhcEkZgGkTw*pNHjoI zc*oJmbM6Ijl{{$|RjR!saw&q&ogIw8eNZ$zSFyZtezho$c}<)TFx3{&keGr5n&dHP*Dz^#i_)(S1|Hr9Bn9r zyse*A(8?lp!%p31uOIxW`uEaInpPi)m?=uSRp|h7VFm$-@Td^HJqyE3GTrv~_C)U= z&gehw3?!14e;GufF5_M$q$P3$#ehtD1QR7ygZIY9E;OjhcY{3dpN@SEGNA~XND~CX zD<2o{8Dff*niLR&*HbpL)NDLt(U)KIVHOH}nwPf5cJ}K~lqh;`=}z+xB8Ihu1ebI$ zY^wmzRBnd%qlt73G`((~;nZyW-}G|GTKCKZA%(fV$FcV|;*d#GpL>f&JZ(aYKT7Fs zq15WSH*fFCts1;gu4ua2Q|&bA^H2EzR-kE!^K|~|T;LY11=~??G?_t+N5s>oU;T~`1Rt@Xa{Lue=|I! z%SJ9ompgZE{et~suLh`km`O-gF3|<8Sl})Z7hbq@YjHNdvn0CHDvK}(&qU^Xlua!J z38?l-k_^oeCf9myn+CEX%0>Xg{tz9gv2I&rFtNR^D}8sRvL$kUwoXh7EcbZs89pG* zwU1=uNw{bQOYE?*tT;E)y)q#VI*1wF-kJq|n|uZ=Q^&WpF-{qtTvM~er%2K2mvZ0* zSQApuKe{>rpQ;KhhK9{@tb>{ONG-WB2205;&KdPy3KmCTFB<34F|7<-V^YnocmxH&LaB*@%%1~RoOs$8}Ob9it3bl03DGdY7O`nh&7*9 zi`QGrcUqiux!WHQopVI>W;*W4t?$T`f46`{?7DiI26hPme^X_93wQCu)Z1BubMkib z_mA(I8az)u=FP5+LR_?bh7~Z?d(Og4omWE#w~JV(!808WYnZy+dX5{~7(!E8dxWvVE>#zoMhDF3(y+S?UHo-&Qm0bg#UNubqNc`!Qf@5g$)_PZ3Z0NcpAh0nl6Th`gRTeao^EGD*Df#UAycxp(YIWT%P!RdR;gOTj!z5hh0eb@;!DH>@9nxXaqr(Z&D9`Z{Lv(dnSMy>+1 zE%|-dlSw02R8u|ow313?fRd*79vWr-`8q5bPR7HQ6yxsG9eC|1h846{pKprH5zrdx z39bJc5LZHajJ-b9=(DL@eSWls=B=-`olTz}JpjwEn5wv6@Nf8Zv4xMSCl!weRW^#3 z$#?j)t0xeFRwFWhg%pOmXoCDCPo2;$uSP?i(zu)O#vVS6xsrWMc&pxBDBqxT&aH5? z#52u;r7qBA_Bui{Q1;Ery8dc#Y<}ObI5Y94;sfU@7+7^SuJg%qFLZSb!9~M%6))4G z6X2wd*QpKFo!$YN*9OE(Gklwp+81`3z28o3l6`YpBbuJ_7oF3|8irRkptExHwL_;- zz6jwHK0qfi$!epNUEn^j^6=uZNw|f3f>csv^Q%nI{y_NV(SN%d@#aVSnMG4qyH$TH z|5k+f?I(&ePiFZ!gyLg9wUMi*FLHNi&W+l6z~nH z2xT#gM*#T{6a~%IOWg&-cIw!`r?6Ne`*ibqV72V5$-H)p$Q&(GC*Jxv1dKx=PzH z0E`j7dNlSeo#yC8z3;$n{(pIPLUxTmV2hJl|T z@D26a#Wq*gFv{aLIzUNf8#M@KK^%JR$()v42FObXxD9!!^hQeLI1s32=Lk2DS`1y z@!)0wB!ivjx6=eZs-^KO#6C1lNRi0|mslzi2pV(|g+WR&bBR(1c_Us!!EF9z2?hRk zucV(0ajQ1%{*5@u7aN(^_3$2=Z`wizSnOTK8V5n4xE=17+ zoK^+Buo)?NUi3&!6Uv)b#J#I_>1(s|B1_IONXzaE!`UmX7{&J`4xKqiUnhdt7smQ9 zNN{v%vhZTEZ`%;W6&$3JCJN`F{q2xMfa2vE#1{+?O9TqvVOUn*4;Uz^p4YMoS- zUATg~=t|L<99_HwvR2qhh`a~)`o0VUs?mv(yo~x7iGW0H)m+)Ur{qb!b^{w8;cgXL zOJxi*j4l|Lo4^G@YJv`!*o;4f&lPspyv(AKX)DMUpr9SNr2PO5hVkN-4}l_!zh#Gz zf^Q{Y1Z>GhhQp46w?Y&eo&IQzPLq=s+^6zT&X1@B&}I$Z?*=x2!ao_{_VlPPYNfieZo0Y8>{X> z!KH{EQ>WOfgHtqb!_QV?l$tK&x8Rx`iV+T+EGE_>QTGthkokvPEw|j&VshE+k=W zjMHlq%#bnj=L!(7$ck&_DC^7swo)2cJ+7@+bL3f=e5&K?jqM9@1RZd|c`Go&e#ah# zs|9{=M*xNEnZVGI+{PQu4WAn>t21!t=9Ep< zfiWE`S~rm88B39aH~!HdpO+FWfH+kMqR8UE_qOSlv=cVP$)}Y#fQSp=xC&e_#Si~y z2@ltKTdV0Bwl$tD~s&%4G)skvnpOf84 zXW2}+)lc`92H_GTUOgJ13a?*H=g`P`!)euLF>pdDxbBTYv0mB(BIT`X>>KLqfLKg$ z3zod`tH1{py^bwZswY6t5z}BB&fX3 zT6;ki=!QYj-!IHNuS=iYo6Hv^tNDp?<%=xVh(usBU?Ec^^vGgl$adR(uCot z*dNESK^6i=(6$Gxwm1Ztfuk#h{R|x|OUDv}E(vjFQRYRnhFVvY1Py0jBL}du7PBDW z73N)!DiQ@XCK)2+l6$iKEkP~bVMEy|med>|gzR*N)*Ju48+Xl-W-^@9v@9@reqU^1 z_0KE0CeUem&70K}epQ7nMJZuIL&%PjXvjTAu$A0NmdOR|2&)&A{5j)Z#{QJw7jids zeTLnbmKjukG9QOSSW3P=ed)l(*<)31LItBk?~5ywLzXN1$Jb@Ka5P-LVJ?!QIi~72 z=3#GMO=tz>Fi0zKpw1A!-kL+nXne<=W zpaPg_5NW{#md5|uB2B=#)IL==!|rQakv2TLd~G302E^&;xs|Sz#k#uw#LAUc&mlgw zp0GAsx8?R!ODs zuhMu76}#T_9_lmZAUkR~*WaXXl7_rXvYuo~FIw^aNm&%c063(qvw~ofFrd}V z+j(1YUr~G%=tssY`3FFM9?&HJGDt8k_Vpw}(@;z1BRD`E;n5>};4a7T-dm;>79>R_ z-HtffG&9BDEI3%Z6dTTxTktf_YP>V$4=-HO2L?P>93zaoE+WIU;z=_GGEoWI(^y<2 zCTO#`=6*7z12%<^h0~G|ie@tm2GBbWX4EGaau7ctBLDU#p2P9oB9A)GuS0+(lf)bj zvEN&9k0}$gIVRK=QlMr$5gV(vlwQJFJ@+ld7(m>%506|#aCTRnAw~}FwPCgEt*s(E z-ut^X@I|W%lr%45Xt@9-uJbqyI}qvd?7#(YgN`o(rJM?(0j7&R#7GEWwIt2juWlwn zW-^r)(%mCc|Lq0qicFIqckgwTF#3E|@HU57$&9}m>Q^@U6TA?ZgjLk#z&ciDUX9N|u* z#ZvouxWxM=KzA3_g6X<{v%%UR9K~5W60jM1ZgCkL+i~BH;EUQd`FxeI`iJp@k*V)I zNDFn5?(~3b?GFu#|0`2^+H~L@zB0USA?&1R+4~GA2Jo1!(C&Zpm*^=#%H)UDS==t% zz;OgX<+pHK>mSDpZ4z>(-dmm3-D`%ZrGJTD+1Eat7k4;C0P~|89W_OCAfEQJd*Z85 zcWm#QFFE!gS^8v%Z)9g!Np!OH3(O{b;{l^8`N6G&dfk^Z8;ZNdU+}D~KD!)j-qY`U zSY-Ur11bu`Pef`_?=xUu_lRDlDNKE26~{vEVsA1}6~% zSW+&6i}jc4!Qdhy4=r#k9BxV@{>5y%6~E_9u3jUDIXEdUc0FY-xR*QC-IUS>dvBBA zJs5rdy#rW|po6_dg{Qvr?W;D@d@c$XAOR0M>sQ;}>3@(E)Qx4=6gqti1wUvy8Dgrlv zh_MoTv=r=P!}5qY|646I5E)F;qSgU}y`Ns9Z zb-&W+9+U30{^ZHm4dc%am)67GIStu&`T5NWdsUFcUzi zKzbK-*_~Fa+Ko9#zKLS7sIi-5984oxBji3e&8oUHrKv2n)ITB~5F`h0f3Q=}+=qXT zTx+)ue=dI9gfYik6PxaMyL}El64~XHRjYJXRe1p09XB&>ehWu<@txrskR1<>g72XJ zH);P%()UxQCvl30q6|Rh%Fb$%7!4=>cEp`K*(T!Gj%F+^?N3oHknByc9?VAA9s?CJ zI4`~`K5yO%t36{D+j0_1-sSt5wPNqqmO!h0{)=YWuJ?%S%;PB|WUoW8Ce%jDq_uSBQd!T-i z^=qxIbeXqV^KyHeV_&z|roT&nwUv{-|7aVLZ66`m)YTVwUVVSC8CA=x?$CR%{;+fG z9`kR{#rj`8#49g>uyfU4l>Cff)!$1&w)Tu~%5T=+DNz5fmiqo`_PO8SgI$}86mh`| zpJ9Wmh&;3e**pN3Ovsn@eoW7{YVZHmH`Hrl>M z`!7rX>3XAGn}hc@L;phj>uuP+V@AG(Hd{g){oVSH7{uIL@xJ=6awkK`71>|wyY3Uf zpyBI0(+TY_Dpu=vk%jfPW#DM%q{_8KqEAlXCTxk27b749oE?+U#)DV8JLk^3a(kSg zpVFaVuPh>j$hkMqD^gP!K#3&XJQm`33oeeydDj)RzNzZJ!{n@b=za&*=j+HAsaO9z zB%AES3G+>%`1CV?PZ30W2qdpBuErUsuY?~6TvrGu$BA*##~Ry!m!7u#5<-;+iIt8T zloQAdGzu6_k>zt6p0IBZGP@GbE0pflUD+#v{^#IJ$%j>H?4uK@PDh0O$E&Af#!WGtX z!QkAfzj*cD2J5dRkX0N!_HupNT-||XWzGO!_mDk->eRmXaEVkNJM{sK)N}Ja0mVC1uwv_&BJ0%1g#p$ zKwi03MU%Geuf!_cW#6Kju=`dXP_DPg-LfkD5hJ}lK?)Bb@A4`AinT0$v+q2O)3o|{ ziR7>(QLZ@Kc*bH`OYYkz2lhwI;hqFmMpP>BFOyi;2yGIaIM)cS`totcw@5|T-vN_Y z*M5$CY=qYJ*6s6sj(Ay;7`?bTrZIcF{+sJY1GDs6PGe%oyjgT7E_)3W8k7Wh3b`0& z!GDZRjx1E5mkSHnXi#aPee{*Vtx&(__!Vy`P=Dsc1mDF_r>(vdFg?SK=K&7mh$$`q z_50zE<$eFR%5|wDALh-SfFy$bJOFce_xxZFq>s(J5rd7~zBQk+CnFN2t7JRel<{#SMi@l)?J&VVjWUo&pOwF;azVK>=en>BcD7_BCYyD%q?_J1eh)_^y z_YttqH#QO)otm1k368ETRzKIV_6AsEQVE$q-`OV|ZU7{=A%_j>=SHNBTEL>FVSmC~ z*g^AKNQ1t@+F^={CniRvKeu(ra}4=1bESX6$cH=j=9=WW#YIh*#|%mqZS+hIo4_bJc%$FX29iKz8DW+w zYp3)HsvA3T3?@+oPoy>f5+ID1gHYoF;qjvEb%PIr^-k-^Lg!@=XcPg}H48CMawI&g zF(A#X2Lb|zY@BX%4FmR&(M?Z6Fd)rNUSi0BFI4fCv=7D@s>$N=;xHsDSN`pmfe!jP z-JK8maDIJLPH^qL7uXlKp&Md5!l2%>Ld$oeP08K9D{fTUeO^||6F_E}pUGO{6}-1% zRAAICtwhnri3OG<$m}ajHiy!V*M*d90-PZs{T3>Cm?JD=QOd|q61!cgu<{- z>SZ_fm(Fe+&+n1C{Ld!car4moAD&@5DQ{oQX$N+>zihQ)2T|(5yL1C64EhX;iv`-R z1hbPPIi`bX-n>50So*+21Bq}>ehA>+2Yz6_FF2_o^owbl=75b#k{e-U{OQbOyabrK z@-s@UNC`5(NpL+8ru$bGyy$!z!XWYSu>vg5T2FG43DK%lT5K`g>}`<({n=UZv9OSraYM43_}%f_E8#FA;&q2yX7##jtUC z!BM?(yQ*I;RRBQ{*ospB2{=)Wegif|cy7hq-73)a3n?F>f$XfQ{eH0lB5guT0y~S7 z=`l#aVJf{J?f0BTdpAV8Eus4OYQ$?mW6qtFag3 z6%C+xewGM7n(B?1*8rq$jAe)CQhG{woi`uoNi}wB0G3bLVWcNc@QF z{-zev{MoB%r+8!jJv5lx4T*T%>=YA-8>+5_mPyi9E|YXP?}A{Xgvy;%w~o4&Vik-~(ozDzDVaoY zI!`hCwOtzC_o~}?p!UxrG%JVv3xr*1W9zC`5ou<8ta3GbWvkB52I1>P-=58G*u9!# zRl}4sWLqwgSq4>~RLX*uI9uQIW2{E10Ss!d{bw6ZkCq-orBH7*>UBC)@I2>J*u1p) zKqdN&X}>Fd`BWNSL9qVwkz|UrHZN4SrqLSQrb}8%tTr*A+UW>gFCceO!5pT>bQ)LodhF)@|kANPp}E{WZf^iC6DRPz0$GtCpf zr=T`_NOcT^s(S8@`D>Ss^C`SL+W>el-CQot5dBPT=Zhb{CwT3cDsW}G=}pLW%*2JE z(%1Z5Zol*tIvsrA^As5!JU-jISql`eiHkLj{hb{h`x^d#L(|uHz8!lG6LpMi=m%IyA({Z@~yPs?D@V0koG9y+qo&yMDi0 zXB7Vg`@8Oz{5FTyQ*L$GF%7C;tfenAnzeJTPE#qFWepKr1y=;bQn+;qfQM4FbV*gE z%26Q4jr4l|`5#NO2)~eWa48m#>qj3g@RX&R(uSq`|52S#uvfGZwX~ zJgzsbHS`Ogzrdb?+U2J?e=UUgCEh?5bD#)8iI`5A)1?I%kp60mm9q%mLr?vV7+UTu za>?tSvE2p-t?Xdco_)_A(2!WO>q*>F)D!oKW_Y^%H|N51ZTbsH%i@?d;9=)+HTk6m zCc&ULQ}K`ahG>LtGiaQYgP%GbEY3I}rvn>JYjiG*;Z#}X978X71fXK~iO2e>p&2|N z%&^@V7$E~%Bn%kH9U(6N#XK_~OP+J`FLgUa0;Oy!f(v{*4B{&H(e07w(1R@^VPwAjfYDxm4K?Z#kT-~xsJk^tOCx4h3 zx`|Y#%mrzZkp|6YuaaIDOwMm;nyMe8oyNyRbuj=sV`-#cbvYX25SY4fjd?ucjpD7k zo^*d9T_El3l**!B@cN?z2fRCkHkIaBaAS3_{IgM?^hMrIL=u25uTX%eS#?$s7;KI7C+qt=c4!x*b-Q-qvJ&dJOc+vd`H}CKD z6!rl7$a*Y3Z6kmx>5SAo8?mY>1%$*uB7D;E0FE?@U2jcQ=Lv?=r592yZ;~5AXPn&y zNeo2GQ8qErX&DGs5tVKkYxMJ>e^PPRU?z8zsTuUy*H75&wxn_+Tjj6~THi(E^^_&RK@OEMW-^@+MC7`Td@r;#9Hu~h;`DaQsZmQe!Q z*b*cX#p}k=u7Ar%Uh5AZ9Xn}y`A0J>tfh+7D9dv+t9XpTpb9XdGhA`FN4I4qc{G>2 zFc0gJ%3aKHnHKM3wwE!C4zC=Lz~3N`KKsv=`dn(fb)XYQ9LGXB%Um9&SPV3`e)+DRM?wpq;c+|MOM<}|s-2L9x8%ttxfoqIaQQa%W!XK|J_4#mDeoH0hP>z>}nH;`&16Bz|e}O&K?`fO!lb;m9<%zhP z;e~sW-|xs9*M{dmsrU(G?ISA^(Mu+lX4_>zCqh8df3IXOU?K=FG%R% z&ilf&tMm7;;*D<%)1&?4cG#<1kp9|u!0pL#OWVB>fu){&K=c>*&arG*+hyK!HcCH6 z(7z10U(rCs+lH|<0WkPTEEwbzWZ^N9d}T>kpdtfwnk&#+nt>`1={T1RXY>8Zy98va zeS>fT9!XeJtDTJ?iJ#XEi2=RMdgY5e1{HDom3V7Hx66tDE_*f(cjpn8R84WA09Uo- zGAfpbhf~<&c_}`$J8>q+EmqyV&e<}nE$E2~7*^9+u*j&kkV!XY(B4M(4W;oJ zTSWWViN?9yFp#J*Z+Ewc1LZeoXi+OT{dgmw)Xm*w&8<=5=3>_7s9m{723p=GNi9uW zPdy14>N2AJ6_&t7%FB#Soet9dfD!CFmg&ojEbB`(^H@~vyB!r8-7MGaop?FwXqFKe zY$NQ@36rWO3Pa=Kodc*xj9auDTRrPWbtP`yJ;~@nAL%bV&1b)yB+i-s*Zl!Kf@zv* z0jMN~ZW9=*ur%H1G`y})TpPGyPv&J$f*B8}#)k%rlZ6@NEv%Zq|zX)5LxOdJJ%& z&{;v`w}}I;@Fy@JuK8NZVi%KF+Lbhk4A@$MjCzU}7OOqp&Bl@09upae`_2(ws8mVO z`6H^i?W+}J`{lR)?gi-s06gSmewzRJlO-1$57w=DB&Vmt1ym|zClo` z-r2;Si$X}9s|_Uxlc#1`Jk{=xcE)Jzjt>U2UDFY+Q)u=THh(p80T6c(3ENf~ye+$2 zAd?diVJ?V?h!SvNMA?&JLVx+aIoOVRe9xdZqh<;$E=UAo@0A%C5>}ACPgRn6q2H!5 zQzl3Pho}TA)DJ$h^;Ae|y39Lzq@<|0hb0$&DTVwH zW*tYpOHF0mK1OVu0Y=Vwi2WFpRIKv|i&F~4;d%TaDnO>pHkT16L;od~Rf06#0Y2rov>(7Nc3`RZBC z`yMTLki@r+d`x6z|=qh@}GD@kg>T7DC2l z)sQLpNM2-9KpDpOH;%X04z84)fovRF5N_|K%Z9s|xQ31LLd0SudAAy`u*(bU@y5wA zCLrauVYhHN=P9;SHbSj5AN-9NY$TJK0OASa2c?fpE@l3O{7J!!D8y;q>)apohzE;? zH>W>?_x=vY%=4-SA}prKiAU~9dC6?qSc5=)Md9)ZKrgT;=X~0QLx1Z_H?)hCVj+8) zovx@mqZ(}rtdfXNmK9vn&?<&PkeC(OIdV9e1o6t!X}9sn2Rwb@EuZf%70#=2!WBb` z?VzT%Dm2vFs|DiVdniFs^60^exvpa76+ZXXHr3;Jtxa#1lpuE?o3yMwqId+Vv%Hb) zUTFT;@`r8%)n6XN%%?XHStfK)sJbM$*GV!ztN}|$`y!okv4gEEtB6{el>E5$jQVt> zlcuq^&JwtJc%1jjXSX6}T5{Slqrdt4Zff}-`2T>L`;8StAQw;9gEN;V zBiD`+qa`y}S4wZ(u)bliU>;~#9A2$s;`TbFF}!#jq|88UR_7LbQ>$|MODsvK!d>Df z%h2^lh5O9t)ORkqsCOsLEhcbRlnWw^U~T7QW1&R(pt?`2E7p6qX4Z?h`jx(& z_#$Ig;_#B=(7f-W+f<7~|BSgyu3axa{e$jV+J9AdrBnDe2WESn?aRS5b`A(`CEe9W zOdmVf{*eMGnqt`c6*WpM+~{-B;a}aU%JtW`-qu^=dv5y}Krd6>Kvb}6Wx^0RAczk< zSdB2tqOq?Z3`h={b9C}^^~=XQwM0@!tSzfYHL_x*qj!!)Dc+U;5BPM!QwxzZ}8YQfJ75{7Uo1g#!}yo^IZuyOx-9nEZVj$XucaL zH2??gmba8D_ESE^5dAZFPhX#Mc<+CVr$a_h!JI{KIv|5SwbJkQAL zEOl<422Xk=GI|`)^EGy^rb37yLjxIGruQqD@$;MRT0$6^2f)Q;sy6AxMNq(nZF4Hj zYVKs@%t1I-r$pldS3a?Wh!?~XBmNXWva_3LJ}M2`*yxBJmkdB-d7+wTgE&yD4i`xv zJj@Jo99YI(c1K1$m%;NCklSE_+2S;tuJIij=@daIafJlWx7s+#Ja*>sqZvURHcwy_ zxmo!Rjfz!F22iHt5@x}PZ6G2Vsc4$DK9xv=N+|M{4=>*-2*D0LM0%8ZU3n4ibPIZS z(43Pu5(bU9O{9X^(^^DKafUW>aS(Xigfa=9uL<1dBnnhf^yYq~iSa=Aa=Q zCg8tUBOr(Y^^0#CIt9+UQa(7xS}(;OlreVk8bqt}0yGt1D8KMFDR*^f^g*M}^(ecV z*XO$!epHpUOk>4uQJSsmiZLqIDAq469uV@M40#!v4V#Ac!uMUyhe< zZ)ECD!YayyKFQ%wwP_I)VN+riwP!r&Z=I(E(}I#?v^cQSl%C=(3#HmQF57XzyUe2; z2qfCK15Uzckmj;8@%NrV!=6sZcsMZg3`rEK83%56xn32Yl;GO}6MX;U`a% zqINC=lQdHOb(pAt`Krc2o09YepK0wFkht;ix~Mcc%Q(?vO&-hT4?yCRW|sWZXqFry zpdMd1dlAIOl9iO!{7l)pC6hk5DLzZHd9)x^VyuFVe#g= zi@uVh>}N-7T|{3-y9T1szBfk)wG302VK#!x_Ivk zK|1f3M3+D?r4}j9@DdR~oNI@jz4qVV1>waj{&Ah|mNo!r+`S6y;*1nv-V{IE6WMmL zM>Z?!(M3bTo4mTvE<{qa2M7V8KZ|{1h+$P@H0HQka;pN_Pzy&4EjiB`YD?q3tMtwY;Po&? z37wGX0_=o}3G5v?*_KRP1A>S~I#~AyGxvb9-B}0mx9NBXIt$c{AA{KbdtZ29EN6)h zfuWZ$f&>f)AIS?p<^V>rXEx<FuinxY^BLug6TFoI5qy)A@^n!wV=tFdDkk##diC~i>V+E#Jy9#(;sA|!flZbG=&wMhMuL2K`_I#NpUPk0Qp^$nqCpH zVii~Y-Fqb?*nG9G0A<)IMG^fo54_qt2({gyj{dfjpJD1XwU578V1yvMy3Lvhk-ZJ2(^Z?uo3zQ9i#E^jwSyXM6~XeaR~)0 zf0Eashg?>&v_Kx?;?rpI5{`}%p=rn~zL=4|pB*D;Y>3Cf;Lz5s|;?l!qEh+ob$V>y8oF2~xQuvnzAUuaZFi}1qN26`slPnDc z4n{0UxH>{ZRN@g|cr{bRTouFaj4@!0hZB+ca;XVKX}gk{aws_3x#vTntA*c#lUU|l zVVWBUG;o&(>8E`J(hNlfgz^HrH8E!g!W(@1cUfCiq(od#`?4l|Rruwt@Gb8ztBl18 zURBU?Gtegvz&213RdJrUhAN-p6BzC{@7>|v`+1{A`=}O8P|nLnioIiRI7fe3$|qy=bjsTtc+{s8|JY?&sZ}Df z*P)$y8Ibr6_j9e9@r6%QC!-~ubO}q%0Z4*T75OuOMBrs^F;5D3?@k z7!r7>wnKObeI-t&B}IynhvGGzWw!vJ#7~@{IjX!;U{sbP{hsw7x8l^fJaoH!gG18+ z4t}b%^jGYr%I$EfoN?l&aR;D4O0)tPFGXY%4diB-R{9W5cpKnC6Cqy*SbS{fhlkYu z$==NP4)@7SW8}uKQ!JFi_;ZAtiGCn@4JiDB+G%3$dMORc8Gi*%$>Q?qb+ggV-*jfc za*>$m24=6dM|EdtV8AAzk94P}oG#h{5@N=k?If5&E6M5+|r! zxg-9b`(m=>tXhSEksTNhf9OE|V}C)sC#u3(Djl|-drRDXZ?3&hC~Bx(@qR(YAa%_ed?~(dI~_@F!(sQl^xRMP){LG9rl*6ePwCHRGmG zFB7Ddw3JngE4VWASLppWm^pD&tV!z^4V#Iy!CbyxV!1f#i{aje-gguvr%x=%f^eBv zHI~LqggB8nXnCYj0f!m*K&*TN{80X&{j0V%@-jZkc{h~3rlg*r%V_uGuaeSSlehFd4l(p+MyYw-MO!->s25{0F(B?4j7_SVPcjE;$$RBi1LYM30T zgilIfK@Ir_i~XIsRqI}h6#?bcL&b<@K%8y%Ss{oh%8)=~!d)GBKUFjc05#Q9&-kyE zPII<~_xZlbHJrlrz-<=*Uu6GAKi(sdV4Y!^db)X~0-xqE6hG%MP?iM;@y^Tii>TL& zoiZG9&nJsMLR&v(a=O3xM<0lm?0|%X!BAoO&R{1NMySDFJwT!>Cs-?(Bj^8!Ev?Q> zt}zB@R6@E~9F9SQ3ecjvtH?K;tiIv*Gv1R>>w#_;E?*MWHGKU724a%ydiLlL_=MaW zj&*be?4;NBOV@p5B%lX9w{6R_xQ~+2(hp2jGx#iPiC(q=pKTJw$a<)^ai+ zCWV;w61&o2QYTA-Kbq_&Xx%m*prNL#2xQ_1fBlx2QbI~z z&zq54b>wk}9geoxQvqt@WvI+k z6OCo+aZz&;?MC;MV7t6X#J2Fkvh0+N$6!9}IW!bxoZik0pXbddN=KVqosfHyfM&)} zn`CUF)9_d8e+i(+v>3wQspJ_Y3W|d3XFurEFih71(sbpg=5M!AFF8tx3{%H=Ju62T zk$Yht_(c3_d3HuC-7!V=y>b6s@ey-`s47e%jk3%+$#5#^c*`4t0;L2o%BK7uuD&Ta z6DHa=wr$(CZQGgHHon-&#I|i~V%xSov2*9Y59ijoUDdU!y85xJd-vLVt=%>@7aQE< zA|b#CeSESg*z-E!qAD7=82AwAH;<^(7M{I0iIM_4$YL6$mh^iJJD$GRKgyM`s9kJf z{6QO#De+9RQ@PXgFLSCrhRKMw>(U7d0;!vs6X*NXAN(Ao=42)76ZaHr!kIU=YHEK2M{FU3qWTWX?e3;l^qi)5h zKKiOHjgyeqNu|Cz&2Gl)iIzm3R~p^zt~&n?Y^NthZ(e<85wm8U~NSqBrC1#OJej zmnuE0%JS}W@hhSMT>hiY{i0#-0rxe6flaN5Y~f;^vjX*Xg|x?HNj}I=!qn}mQ~qBn z-&*BTstAJ?AIB{`W7Nz#59y3i8S)+fby&lj1cgS8@rgGH}3bQIV)GsTxR|>~j;v;dJi`tOX*)Am4>dDsl zj&Ih95rhH5{j4|`2(Ggyg$Z%Yg7zR~XXuW?`J}q(ip`CerX+L}=RFr++Wy60#4V-mQc7VjG@RMFzf7&B}D?fh?D7D{n zUXkLOUhY4&>I+6l%0JvFN6eF((=RX<)mYX0bWSS8?SmG|4v(d_BGz6-6y}Rj=82)+ zlyq`K;HpGP&zy%Mvmx)ktqoAs*e<3WBtsxck2x4F=VX`6aO4C)6&ca~s=e~aa0H#% znx2Nfw6(8|tpUfDlby^yiRoU!9d5 zJUX)?XPtunxJ)5OWSbKw4;-`mYgmIZ#?mfYWXMYy>*e|OO0fNQ_oseDrzTU*vq;{n zPCeL6i#{5xZc`Be@7WXLzck;J(*McT$%kcqhU&k{`1~Q1>+Fq7H{2Ckv@LoiX{N%9t9~+;$$eGZ$NXt~)-x|G8+^G4IZaMv$2}mqtbo7! z+gNv3k+yeN+LCeLMSB;p4qND3eDuL)^(v4zdd={gBUb|uXflu=1+wfGVWnxVzPktG zJt!(a(4Io=$}F-a5R1ga4umNuL@Wjs1QjTy-e!gE%aSxBPmlN6CMEx&lrM=xgin(4PdtN5elXvnD`fK+z_Kr^=jwr%a8CT~L~q zzdMHgm?5p~Vu>(5_u0F$gvp)^cq8le3#@jNNGj^&Dw{3CLyuUuLe5B@rZ3fb#$4r}V@wSj(0+@sG0)B>hjez(RE z7VxSDs3{^&#*T?SRaaqTPgLLpn&Mclctvbbrfh67I!T)WmJplzO-XVzg59EU=qwEo zC;SsN&2C$3@?hX}63y(1oOxX6$ld9+&I}aV;8CBi^a@@)u>y{z2Ueyf7~7vx*G!=- zR|6--SLDCm4EBfa>1OUeLAC8q5c$Q}uK8j{WNgsKyLfu{TTo~X$EV279aRVmIfvg9 zXkm3j(Omqss2f}YBhVuS{ft=udw?vU9$MlQB0=i@33kk%^5%4s&!o@wS;-L51szQ& zXdT!^7(Ko(Y6#2ws|n_}tdH(Qtya}?z77ndE)&$K>ZtB#9yR++W((Y!4OK3^6F~-0 zuq`W5yhS@f>P-w~qlhJ&bZn0a#9GqJK>`>2oA$YVK&pIze_@7DO5kPPQrI_V<(NcLWme&yC$)Mm3#=l9*|f&hcEC^7Y;uzdYN z*4+skd!GpY-127^Guw~wchD06WTdU;nq>j0n5YguAdJQ6EEbfPumbK{yq#)(eU)eL zGyx>813pgN@=l2yER$S;EV~s`b=D7uxqCUJAzlc3OX);=9=@w+W-25Y!0*6X&o+hF z$nc0P#%BS1P3lDDEGlk3^&Ak$W`vXxr9)#6)DQGyuV8v&E@91e3C#g;?mqR;loYO| zGb1^QsU0{54soGm@0Ts?QQ3B#cS5yMh_P*;kdSQcfdh@K;B5J$$-baMkXI2&oQ{L! z5Zn>zBYDm7CltwMM0%>yo2SSga$O&~7N$pmGGMYyxos(XNd+@;X^3|$zmcv{20Xg^ z_n6G9;@_%7okGa^0YNH20DH?)$3j&ewIz_HSCD`TX7UnHQ?Y`|juTp<->#e9*1KRc8NM7D9JqVU4QQ}N5vOv1rzAo==%JVo+~ZzA z_d=Y!93o6JPz14gLfpM5b8iOBgRiPVLWJ#bsbS#yb0XX zp9@C$bOi_uPb+OIQX#&x9sO?;^*fJUB=vX7TkcCwivgBTM?(J}NKU*@%LNoEfz?1< zQD)Dx*pl7E4bEM_fNF~uyyizfRcQsf%nI^n+L{xhI#-(i(j?6llNk2`f3JWuc5P#H zxcW~$@#67f?cW%fZSG1On_XzO6V=(+iWbbxJAfQo%q)A5^ zE*l-#r*X^7(oiRh1$V(iaY%Vf|8rz2)K5tcCCnrux zB6&kdE&6GY=p`I@+C5vZeK|MhqbgE%zEfborBS0>3jiLT&ONK68bOicLF*76m^8~4 zd;>?<%x12$de~lA*8(HGQF-0aaeVl7Hy1I@`?;&*4jfWfEAi;CCWmBbgl@JulC{+S-FD)=BN ziXm-42iT!YOt!c`;T@KOb5a$QQ57T{-za zW(85g{RkT1u~XdZOi7^#t+vKFEwpABRA+x>0{s3!L?p$2p_QcoHR!OWlG8e_H1>67 zQ%NcM(`l!!(Z5(*J_zv(9egh5GdMzb&iCcaF}c|GCBAE$?`b6t&;{Si{T-X<5qMd~x??yW7g*YZ$JM1TZv}gAcV=Vx1#2bn7X1{iX@ zkrbS1vS0Wh)T>6vWbi*_N#kmrp6sjOgOjP5=P++SyK!T?34Z1FPYov25oH^x0f%W~ zuMIGswg;E+fPfgNhX(3q8~VV4Bp(7}{liW*rNuN`Z3q%YOnp9-ov1i&=>Bb+E!-?s z#a7~Xl#P2JZlz$YT6i!_AKPWB0$`L6d0Hkl2d$q$soyOhx||evVaFMZ`cZr>-=gGT z!dDirY*Wh#%%w2)Q>d6wAR|OeNkfy?7^8~zGOOA`<1&1x9uqe!2y;x~EZj$0<0GwU z4>x%<6aQWJR_6SO{cs6xY(w8EqZx}~%A6LLwV|#sKV@tn zTL-=V-T^M{x#lRI6??B2V-89}9?5qf|57d(-}+GmrJq0+Rjjk0M!wvJy=< zBCc)Opxmsty9(k~B?TtGNF;HMwq-YdkSf0OqNAhR91X92XW5dG@NqnULJq$wFdt?2 zo17Z2YC>=AKEV?Fw#oDRQnRv!FGT%$z}yYM1|8cke{ZV&5x=hvzxuq)npt!*Ip0FM zHHmDfNaE4xIgq4M1H`bad7@jPJe1&R`rt#;or6&nRRR-J7Jn~PA{3Mm4u>;gYyFK7 z7iOg%u=LLd$2Br6w}b5`#MN!yQ?WIRo(ucuR6f+6%^X*4#2_e`#+cj)5j z*^nN2g+{AjO$N~=R?EP<8o0wiRQh~92?Q%a^!%2ETa4pL01$OsMcXgHcZxF;ItaBp zDBTVO;QGj8y}(7+2G6W5LIb6>CzecW4+oWaG8>qlBL%0YJ|YOVjS7SHER-9f-Gzi*7=uey#>65cc+;i zo)rGpo?Eov1qlCb5K$G=b{JnjD5FX)x&$8;MPjM)jCjq0`N{9y>sa%J98rQB**j*! zBOxdku18{90p6$ByPn#ZOjN2GyiXU)8w3!zK{WI0(FC)S!_hLrL2~1kyl%k_Y9g&R zW$0iv@*#*i`S|md2WxzSfoIbDJ1vh*f@0^i^2|On09y2BA6B+YH=PBQT&`2&!f{e( zgnlZKMOF5g6Kj>wy^TOI22}%XRX*!3qH(l|7=v2G|F9-X>rBO8J5~I6MvO*Nx!ezu zYU$a1G5FBFpvLy2^7*P|T+^5ewtX#s-+0VSk0Y=EGrenKHM-2q_#uY~g}#2)Xzy>XS}wt0A9COU-wWQ=9uT?qOhKtM=fX~c}6XlXNi!0>5IJisIX zdBfEf{jOL$JQt&${02}FB8tGFbP9JLh6K#63U=NKJj~X*L2#$T2d#sl$htmgL94Df zXvy#KpHToJBv3$*8YP~qtYJ0mA=j9 zseYv#Yi{OBqYe3B>3Owe4zj#+sr)G_>2TPkkPo|OjSsD#bi2;zd(|4ZqLj?){9kd2 zbzR~6Y{d@tH>3IfaJCN;EO{-bu#cYF^drq^Zq+=mnR2UBjZ<9xKgJ%)0+?F}(C9Ko3dy(G2GR!%c9Ml@K-%3rJn zl~9QLq!&=W0WiB6G^98Y6ot`iB9BP)Vz~3dwxsV7z`r8agkzApA{vIpUzflh1@^OI z^L4NQdsSh|hP91t4bVHj8PTzZcW3whglm3Bw+SCVYoS1x$iwXR)mbI>w+CP&(Ig~d zXnr0`z!1m)13kv}{3M$R7e6}B&UQa{A8(W#zPx&}j5E1m)=G?VFwHzMWW|oS!o#e@G;Q_1kXUuRV0mJLTK7-~T_ZP}ncH4g&%Rh#BU8P9H6xHOKbKl=Dl7 zKVYap1jGu_RXiF7GQ=_47G>F8;@=5NQTmDq&IVfgRfwz2pvh@sBJTR_tQ3?Ke)E9ohCSQ*;0gSy}KK|Hh*PpYhzVE3^N=&-y6@v&`*almK(-A z=tz6853O1#Tk}#QP2Wi=tZQ8*i}a3|{+6!=@EGf~Dnx6x6wh!2>YNkIV_Zck=vTd} znLs)xwFiC3r<+n8|alDfIbI?7?%)jm5>hW?_|7R2c_1S^ey)6IYFNp$iFW`FbU= zi@u~8!toE@s7-SB$eR?{stRA~>J)bA>I?2pk{RGa`5^N%W-L4^t($D>vp_h#C}!1NZ#&qoub-S?&DP| z;b&bwkJ_T%-oKBuyXH@Cu~>5rPDL^Z6c^xzTkB7;WJ=(*Fifx<)H#fM=W{{xdeP)g zdDKkE0*X{xN0%jx;Z|boof{TSvMCGgngk4k14_&QD+vARQT*P>RXJP+$8@wFo%^F) zY;e#QMOdZMx~tq4B!8Aq85mnL`JYwct_)tFlXCajFdF}Sh4N&G=jQaHVc3_9WFy;* zL>!k5;WUikv6rr<8=ElTJY;JTr;5l_8%ffoq1xndoHR184&4)V6f)-phW2~QRzpS4 z62q+hvlZY8uS**woHG!o1KCC^RXy7VVaO+46BumT5Q5kspCSrF0&SNN((iXmL9)Rf zgtzi^GMNT$NkzOOG3BRRfyIU|Cl$N<>lvSh0%JePFZWjth&>dq-%jtJa5ue=V&I)S$`AShfDEGxGBCU$gFy!?Y^nJyVh)%7kBb9> z)x=ch<14~d63YO3$8!#d5$Stfz<+PJ0w0J0Vh)xEdSyP7!T8NY{CFxwEQIxgQBdEy zmLt%oK5<#oNva<=2vpi;excLmq|vUzR~GeLB(_&XtUX$_+|J69j>&D25_YF+zJ~z` zpgBYMoE05TJAWqLE@ig2&1S5$Kh8D8oG4Up!N9WL(&JG8q+*y=)(-EZtV&H=Wt9Z~ zR;cVKPi;$u!>zFS4$!@S6gE-7T|~b}3_P1$jl|iO8WRLQs73LeS9RS=-;FXER={CJ z!nZo0@*)pYX%AmLADw7x;KP*1-^We@#BqMh^%96?24qNC-D~yc3bBK;rc_p_O&6mB zix!LJmY)@)%0wuMgakm5i%}5|WE>T%N`=(OVJ^4=FV2W$(i@r6Bbf#gt^9&G5f2f@ zI?Tx3ao`cxXL}a-O*<1c($P6_maDJN&R;VCk4Ya?H3v^|q}6aaY1Di-K5pFz$oQBw2PTVbNqLmV&qwH;7+|x!0+jJv8pUDuVMS9dTN*>QoMyX z+Ddx%ZhYh`E#)_Y+o5lX?8injE8sz3XtDtU|FoCYu`@1o)V12D)I{gRC;#XFvtXE% zeD$}01_Gi(OZ#I8f}S?Z2Mm`cC<=@RaM&6_Ke=n1>=|#gopk>NMz>MAF`!-Ie!x*# z#q*cm4wbYeh7Sq89gVw7Hd3}WY*31}`hAYws6+?^@(WZ&DgRFJ4DlS*@FV%O_o;;6 z!gF(Z*iv&%+u7W6=56MfS9HBbLqBMCHwN*%4L0#n@q9=!^p^is0ua)lqIVz*5dDP` zwA#psh^~rVSxR$*Zph01s{S=mZ>?dh;6gh~t_q;*P}c-7bnq;Yf zo3rM)Oq(I=VgKgI)J|%ZtV? zQwVYJUL0R^u|^2m@PMOESAbAE+rRq2an%gF&ig>P)rnN^Vtmlf^!l>y1De`*yl27q zQd1d(WN7Y60$Is-F>VS-nyqCD8om7_w`86K{cD?g4JrG8E$C`CL~<-#`(qn!U90{H zS%o;G<8)IO*iR8e`nMaU3G<~I@%A5H%MPw42k4XUzakgN`|5robAVRc>jgD`>9x(z zd*Ug4%TE}?TuaM0%@9LB;XUlf4uN?UK1ONR3_}-O)qBbV4rJ;-{#1UXW+=Okx}Vd~ zSGuV~2=%=^M!Ud}EAX#dh{251hhg|J@Vn9N$j>oj1S+KY$Yr(rA;4`t0W5>Co|bE@ zsP##UL@?S*6|maBMF3mqPPjo>`}diLo65~A!$$4|tUhc^H}~<}plQQj3fx^gJyv(X z__!QJ`F$^TO7vp(aj`AL$HCgzISJRcdGu0rH6E-!0!`RN`^n-q2L@2h9jr_mNY*}f z7=Ongvpo0(gk)#j1Ca)psPm>uO0&_|Axclou-+HM-V42ihyZ5`4UaY5MfOs4Vk?k; zEuX*l<|%ecwC{%A zn})RT+vpByAr?@VAJtBFk8yF-;V-p-_Zc0qmOAS?S+Z!)om^{SPpvn)?PM5e zw&|M9K-|^<0cQzrL(-acYV5*KIm`iy8q#v|+!i?(JdZTq$8cobmlPVJve}VK_na#d zi|2-`{0A7+$UsKh8m7JNc(%WTw-I*zK8k3WS^(bpiU#m>j&x%EY9qcQK%W!8bn|Q_ z^de#FSHd*IHQVlc`Tc=tC*_$e35sy6edMbHJx>(lx4Kr$1rBEW0a5w2d(R8bjyo1@ zMl@}$p>7s2Y4qLfdh5sg3O!r3)3-D;f#ke!_RV$C>OkhkI1x!cFUFjnViDwnLVuD= z$ZQLL5(*GFUa=o*rEcoZ$E1)!Lrk&;Q(W`2=BN(1(U}L*8j(k9S73`jx24oUtc=V` zNuEIgFGnCaCh~QevNE*}(nCRC4>fkopeZ~CZmTzQg5C+Uu-#S6R6Gpu5q*zmPHwr4 zP26DZOWdh~s?s;sLW7%3X>sh+F>xp$TR-&TjsWnl!u+A{R~kgx8pvOATOgy+CX+P{ zT-xXSTG>|!Meo)LGTd^5A0gM~yOp98NV(#?=o2DGh1pEj|3y<9V~6_9R{2a*ctmUe z+R1}cwkZnH zjl(lfV>(!>2;Sok;d}OT$9^#5z}(JUxTWP4Zy=O6Ugk}Qhtma$2!ohO-6`RUtCxGL zRQMc=E;W=T!F6DOwI(oz9nv*|r0cd*F9Be4v0^UE`* zt-y4)Gn$q@`zdqW#PSY&QMiCGVh-Hb!=DRejfyZh-Su=C65$#V+cR}k!c$Ig7YE3I z=8Kq)=xZ=CX$1KD$rW-ph)%qtUGaHsjm4>zyoHWk>t{U`v4d_9VZk~XePKcKp=fmX z3WUVpCiD^VBbT8|=23f^B6Uk*#MLJ_a;+*9S9Fsr?j7+eQ(TB;sZlH&pnLazYu?9t zssaW5392pzvKWbXgL@;Hr{B~5tqaiTN-alz@{wkL@K9lVz{291F6$;|YGTK zFyN$z^)YBwX`$N#o~uuWRn*DQ34iym)qxXaj1f|-E<`@l$SId~V-lUp{RPmyDt>Xi z^l`DhoVbfBDXya~&FpcuI)_cumNsmds@w#cv7=xgdih8nDO0qi`WA?Ch-z0Tkk>7a z$(eE#Exg_vtb^)O56E~qb5IVU3%OxL-+-~;xrY{$sdZN#IGjm!1(WPP>}XE-C&P3D z-+9XC?7Ob%4n$DYxg&=A=LV%!ucZ?&;3seuD)Q6d8uola6=Hko{hT)%~Cp49nmC(eo>f9C$I%-aDOKV zrFcHpHVPMgpHVbpInN?*5l^U@uNUy`4KtUUxj=waXj)_|Q}&miEZa8;)kxhAZmU=g3~F-3)cIAa91DAG}6irvuy?a+?9)1PmZ?J1PA7 zK@dNmd)ZeOFwfiDsyk^(ss1f(bTa1VCA>__g4}c+S{z6p!{Z4Qp|a4!#JbqPnRCw` z)DwBxa)55wJyDE*7M9$C*_4?>Ew5;s3q3QSLCV!3s>2^-Di$D#*JSD7C zs+lZ?zZC91?<7+KU*`7BcFy*C#`Z-n|90_cfM%q>#7zo8Fr9+J9rz@TUv#U3vUa3ijjQ z{s`go(UkZ|SR4qTe(l2i&i0s0G?h->il_P1tQ~u-QbT)Jr=|I_MvwJZO+ov*K*#q_ zk?{F^QiOX!q zElTbqF&!l^CK~fvu8wuO_H~}fG3{fUo;5b@8P*+ZI&@bczIWQJ4;}UkICOO!a`Y?d z8QX9$1RAXEYpUNjRHE1E;MLzNT6G<`WP_9Hz>|J1IRAV!$+2#|v#R(D0Mve6eZLjtTZEzbnp7ge;6|PT=YG@l2 z|Iw>Lb~Ai$m7tfAeeVq(xm8q0ev|2iCo(<4hT4Kl>UIHZec9D;TRXcA9&>$3kMMH@ zNW@!nBg@~SUrj5}mt>y=4QN<1s^4p(HDNtV_G>SL5nO=Q&2=W(JH|13Z9bo!;w#SO zR1H}LI}_Agx|U4)njKe}mIVnV@6crqO~o{8dDw4;@vIb`$r5?sYS)e3`5-I6<<{i^&GnfGi`Zi?Y-JtV@` zN|{dboUrUt%h_qa6g#~XTbuDqXuH5|L4D6b@5r07o{HIX{O~SPSMuFyTWaeWJ4|{C z)3#H(xEW7B6M1*C>RlOm>5XOEc5cmAC{|0mw;BO@X?$N^Z=g!G71~x*@NSO?UfdT6 z&E|b>sV@k<9?dpF1~aVYNg+EHM z7uxom6$4u0u{x(BR`w0c)vJa?SUYW3UXDTWB$Kw#o<&8Di zb_n`x+Ro!pDSRG})%+e~+s52P(#kRJ4Xh6Gt*dDTl6j}^tRMU5lw*-e6-*YJq4%T= z>KXJSm{5?(_*>|Ga~;Q3sYBlyrxT#$702MMqSMBKtM^T+X1;ZINGtj+1F6*yK74BR zE#z%|jD^g47>!IDXXnGJAsH)?M$lxCYONYV7W)lD5HbA|*z!!fvVRq~CIvm~je63+ zw(eCT;Pi{{xfJJddetT?%YBjN)Ni^0ck+tK-xVW?S`NW@*$UX&7Ux#()gF-Iv7t!6 zdL4Fb;Wb&l-mCZGwgYb%I;)qcg&qDfGwj}DyxnLiobe{nv+jRzLV45KlAMhr1eMLd0Q~?!8)0c;gRBjc3qS$iOIu#{^phl!tNejBJ z=eMZG!tklsu$DlmLeDb!i83&W{7;LT>H&-xZ8_*o}hS)wHcK9Fnr@ zc4)>Qe{{)7G!G3%Skus9rL6UzRixGe=*7+D>%IcJ8MP}@QnRlYSYjT5$B@x#e$6l7 zl?l6UhZIVSMF+&o07mY}Fepty=#i^DDwZuB*g(mSNcOQM9wU|r0KNsw&4d6vX=pSv zF^S9?PyPq!=6KGL$oaV=4JWiw8|P=Mg|BSz5ec9kI74gW#l0RKm-eJOEN1OHGxv30 zrMa4AY4zRfGnT%fw4-Ad*a`|CQ0XtfeENW@EAP-`{RS@DIQWD$XHp zaX_{6rorE|fQX7CXepO~6uH;sW8IV)ITDH>n6xEe3~c5(zt8BCkyW!;;5JTf=S!YufG-8I_Vd;zjuvg!6<|bIw zCKA88#*&Iff}{`T4$dp9KV9omiZh36_`?Xe;2rry z`wR<()IvIB&iu?#dJj0iE{Bi+>8GETzB#@?fK_NADiy=ne4Z9sH&w9|cE*-!pe0(M zRf%>H0$0|0k>oX)j(=tB)K=Q9YO+2H`8slFQjvuw@(Vi8g>2EZ;w8I}jT4vK-kz4? zk0=^LB}h9ng9jV+alG6@Sg>)bf6W6}38nOis4U?bV}rWs!!ag=$Vb}9>v>5U|MtAk1T=CR1DizI?sX0+cvhBmYXtdt$#3&r183Z^ zc{?Kp2nYbP)R)=`7*W>~sVL!K4E^gSm9?l=)my{`uUX$vuKqWEdl5tGmp5?I%n)zp zr94^~G9_?HtyvCf9@_Fz86bk& z2mneb7&UGJO=Z>{Mc80nz0*+jxPy35Z0KU2PR_E!^;`ke z!uI9~x(RFhXX1n&33w%$9UU12g!9}tK#RmhFRe?a$!MPy#JBq;Iak3_tVtzAVu3%n z2wB*i)pj~5V2P$n4M%wpMA{hf6+o@hIh?99$Dv~_NhTZ_Pj|T4ShnX8PL)W5vBmRY z{u-+OQoEMl$SHiUy6?=(&!sn}P#~8j7Bf+r7k0|NYUZ1OU!*R?QWoDBfq)EK+Qvzr zY$&}Y#v{W*$@W`gv&*tzKiqRMbwHXk2;)=q%02Ler)(=9?Z|}cXMC_*9dIXN`zz&a zXa`$gN)@vtHwa}@8@d+gRX<%XodioGlP}#joe#SVog*dx>lzXx?_A=xlDGYsnFmsEUXGVx;VOam?#u{ zx9(W{_Odd-JR?#01@}Az1xQ7M+8!LEQQ_ghYQ)<82+AN4uiR2~e_I>R83-0pBANL` zV4jBr(m&KuFaOs}QR;=zB!w-{`gG37r@XNsl}cC^X)PbWKE|Se-6pDJ3WU=`y2p3= z>j}Q=JbwT=b4l!Lzfs?1bISdMd%*|!TVJJvnm8Q1vJi-vgl(`;vh&rW(Mo8rLSMjSR7Y**UQoU14TZ@VUB@J zPSQ7etE*r-Pse6Rf3oZ=PJ;CI4Aw#jfc8i}-ziSisTmvkz0}l0&HPChHf+L2_;l_| zINTaSaTYvPnH~O=h5^j{ef|NtiM)6#5jxv)N$HK0exDU_zc*G1pDg;2glMpgrjx48 zyUvCx*k6`0Q(!H`vG`8&=f&4@i`{woWcj8D7*r7k2@z#gz%^s|`FrC&; zU~x)jtp=`plg`(oW9&rE;NWBY1Q`p&k6?(@O=82L$JKGs|w5J`58D!aF42BQ)+r z(@_l+qwsi&^9)?QTdl#VgP{g8J+5A*d;PEM4FO`^nqD}kcxjBTg@aK|85TRR>XJzq zoyZ3iKmnWHtqSvsd*I4Zj+#{sZo1ynC(bSw4cCHrmz<6CzM(0R7YeP0JCa7WCrx4V8sZJ<-4VNw>k-x z7AUx(Lk<}MU29m`V*-GkUQIasN3S6QjJb!v%FF-I?G7r9Xj3UVAIY-NPXr=oVr6o- zM~G&Yl7G;he-iwCD%s4WDp38V#lBYj|)27VXgX>L7VHw2OcS|hv$ zaH_^tiK<*|u9T6;AnRq92zWCsO&~!VC>h?F)aL5xtwOdU#(r9y#VoNuKl{b&_&4T8 z6zzUngD&K<`n2p@gHt|(X#k9uJQB8gi0`*;{;{9zBuJtt!<|I}QAbaKUjjTj>Co$k zyu|_hBZ#0EykQ#+N@&Uf1?oP4Oru|At;mW>wb$o+$$66g5R1mhE370fn}1yuq?X2$B|pT@1lbMH4L;tRoP?$ ziGGX}0NA8IvCz~Xf@lasKy9xc#ik7Leq8B$P^W1_kA8$R#I22Fp>n%=Akh|kg#T(9 z_lUD_%SRC=|ol6~AreP=;M)l=ry?%k1 zf3Ab~IlL55DH%fC&`+!YdeWM-%Kz#_p<@|c%>b`D`nN1cyhS-Z*Dk~1i_Rv^hQ!Jd zQO|4GC{!Rk62OBi*WfVY3XNVvSp4M*FB1=g37we(`DVse-_nQwR_U`kzYDj|tC#rq zWfDZtBOo%K7214Z?aT3^>DpEAfopT?>f?1`#PduHRBsL2%1X%uq;zWkem#8|z_~ox z!+9;Y-&vj~IJ2@`eZDua)-}f@W(4=5W&}taEFK(>L1^{ydD={g>JpuL{U!r^As9R6i7aQk6+3lpbnOg99ZG1Ue z@DwkyNznuS_i_IYa1O?w6HumVfV{zbE>E8{cnujy7}w%`z%l01>(@s)b{Ca4UIXK0r3}k^*Qez z>XwY-=~(CtHyzf8scOXm=Ed|i4g4zypW)-^U2a&KMKUW~3g#7u++1Mk?fPK6oXZNP zQ&C=l!+v}kq7!G199L3`92aM{%@-DhWsiv*38yHX^zQLD z%z<_)XR4qaAbi8i03Ah4uxBFg-AYq$tg82l;^VbXsfMIg61O3F-t-+2kM6#4(NudX z6ae1Hnyd2aqR+>9POaz=PB{^sgZrG97fMbF!eovHk1>yqTq9k7<&J*yDf&{6c5VRK zOyvUuT@Rzz|LgSS66b>$lZ#w7?qo*l6Jc4d{gu810DEQ;noFYCMXD$r5y59-w%0=) zSv?t*ChaRSA*0Cm7pb6vOa->&x&{SB~V4LpLsVVz2?&bK->Y9Ew5{C!=RU7^<=EsL3L<=5P$}r zW6B6(67jQ&emc_@L>5|^UUp=bfwvap4^7sjIEe`?u+hhtcp>Zj6y1*+nLBosr1WP= zR`Mck;9U^x=~7FuMJA|mMEqtcsWpZ&Fk7&w4|5N9vizL|lVO%Ws7YA_Ga<2Q!i2HoyrpXQ8P4JoyBjiRs zDF1-to-S)|`j?^&tFW*f>%d=J@qV7NIRG~LO9af{pLnW7TIi>ZFey|rLag`{tfROP z^@5p5FjGY2(xx^aRdkRBatJCM9i7-_E7$M}R}6Z#5Inhf3P2Pa|9;m$EA9#g@R=I{ z(lnH}LDCMb*|#KYLdkkmB!2ts&l2-=EQZp9%4#mnFFm7kcA}TA4<+hbyhF+)H1nqP zdP*aO=V_4)hEUfE7GNw8gz!Qf>$W1OXvh^EDg(l#!lJtm`z1(+d?-ClCbA@DNxY%s z53ei5`-v7G_|xs;j0m(jXiSz3kkgOJ)~Ykh_*yFm7P0!`B&iI(e0hHqXytwcZ?x2# zV+rqseTDavDl0*6q18Q-?o4e|;phKVu!zZ%ameL5AP^oeoOa@rSot^850e86zW12T z5FN_iw;$CQ0D-Dvn?FhPVI<-)Px7Q&5GO&*@HpGNWDtOZa~1-xpc?=H9E%h}9N)?Y z84~FYs8f8UcJ}+;n&5wQ#V^$-lm`lnM|$B-T}PiZD@Rnyz-=p4Tv@V1GsLB5no_7G zO@&z}lKK+bi=SF2%4~3u$egm) z<_>YA?v&>~uc|CT-LDdXx|+|iMOw8$pdIV!a#Rbyu~M|M)B0ntnzqb|TM)@`_9|hQ z)E$gz_tI?#d#bdh5YbAGvgpVd-DJfGoV}q%Z_}cwA?u#g+Ke;~u;L8(-g_3?BE>QW z75fHWf)L)6abX{^?jv7awTnL;v~5-^nAJG9-%@jaIdqv`Ecv71&sQsK36j~_7iqMs z$KGBA`F3HC%(}hvib-aAG1DIyG@0$9DWd?E&2)5Cq+JCW%r>zjP%i`j$(&g{-cM9*XM6 zpr(2Mq*3N-$5@HK5gQ&@03GNq6AwyTeY{Bi(bSMABOo96nMG{Q;ZT2AebuUDUeQIf zE#oe)V(AIw)&exzDT`k4_uD?W6cQzpODVgj*eSl_j2Rps-pLi@|j9Z`R~ ze%)u3J23pg6rLku5M3Sf%|;=JI-y(X=L1A@6rJWMN3b^lw2Sd62`z>GtnC;;9e3%t z{PpMH0AGlEEC3;;Afe;DC6Nye(0-0vZ!*}45xrQBvLi9{BmEX;2qPH6w~3qf-6q9} z-}v96)ux<;8^`1}al?E7c24R^yzC(r7vftZ%6+x8gZjYTDjQ|0`v#^2dqiR`)oZ+z zZ$05If%3;7eD(z=)qz{yyO7{x4JnQUB25xRoRMZp?0e!rDmClB!x-K!0H`Km)JYp= z8F4jr5}s`2L|3F$B{#V@A8dB=(o(Hhzn3lLf?Y}a&=pH9`q20-K33V7+0X2)s=R{ed&~$ zLql_IBYx7z#M?v%@Y^3X0U=d;lDto}iC+#Yap7*FtpD8q#esehuPRkNB?dr+jrls; zENohq7CaS&X4)^KF(jC@hncq|0y07VO`Y)Kr{)y}db7MMNzTlvO!EC<)RLr9%9m5# zrQ##-R&m8wIW%5#x%N4;Zc)%npXAfpX_Hres~)K@BP|L4urgbk1Xz9~_0O|S#`}ir zgI1x)WDhFf8gI14THf_aZLr6w$xy3Mm%T#ulv9T5e~Kfkns8lh&G%qGr2Pw8T{@x7 za|||vW~s3`w|}zBdU)u&*FWF%w(5atn{{Ko0fU0UW_T|~i}~}Nj#%3-aIkHHAXT5W zN0tyTTC_zWzQGZe3qWK=tA@7;^&_v;ew*F-FW!@t;k}qyTcAynzYi$Y< z6U`~7O|`#;D=xy1Q!RhjdftfskciVi*wXogX6TyeO)f7kJ(2L{62gJt4iQ`iKS#Z3 zDJA~MbC?4c08Gsk$;tkZDUVF^Mpo!Qw&3BAaNqA*HxMx|t zD%s}2nmMJ@(Mve$Z)9XOYR{-wDi(>bS zt1fG&(Kz_c>YX882@nG^x&0cW)`vTw8EpH5jm~uz#~={(Iywzzcm3@!(&X^;HJq0W zAJTc2fHUiui^=Bkemu#iNGnEp=Zx$CJ#Ki*T(|T9n?(cQFBxZm$_D3zCh(0Pz6F~8 z=K}bICVtR!(z@}kr0C9i+2DWtOfXJDA zDWW0F#mNa7>e^Y2hwHZHE@gIZcp~MRjFkKh03V~ZkUMg%3F6dSe6neY3!-LOEU}xq zD{#B{1Y0H8WRC6JTY=i?x0r&K@j}LuBT7rDt_eSDlS-NkeK)BJQ5Lgvf9W{fDizZU zj5kk(nB5CU{5Y9DtrSdE3VLA9(;dXeP@EQv=#H==FP-SNNVE4*V9Pq|0S-C!J+~$W zaFrN!)xyTV{En8k{P~wkspUN0x7-{k=nYlq2bD+>PyDHmV>4$fZ2#gUvFHF1vd*AS z)TDr-yPE)}l?ieNX7UzRNlQVfak5&H1ShhZ26A&w-G$>27Y5OI3RXYVb><2 z-|6p22#JUu(*eRxmeZ6I9$qwPD|3eml5#p>|8E>(A#ulm zpmAlS%(%UJ-Ykx*T`_eU-5#VRwpka@z2%4*9SNfoHL(@Ze$uBeG?XCf+%u*q0GU{k zL_~~fA36x4D*xRLk8XQwzCutMeDe+p%~(gf17!@IWTDe+KWo)V zV#u&$L_1Six;YWBjQ)!n8Qe)R;I7MGA1&P$!6+4!hg#`S^N&0+c2**FDqP2Y0`z#L z{y~w?7(#w$7Y684(?_|ZO0EDT>AjP@E47i!0YA%D_V=Ec(33my{=;tWW;Lh%%dO-C zsoF#VjmR%;7Wb9{suLNX5J|X~uvPAV3NR&n<{Q$;4B5apYibP0C($M>yImM(d>cbe z?7uu9`s4{K@O+b`L>4&4VoD>dQl)>up82bbC*ZB=mj}blL~ROSyMWMSr9(Q^ffLnC ziQezE_>|B&TUPqJ1u5^Q!NC2~egM~JzqldfJxX(uCh5hQ!+Xg>&HZR7@G9odrWsAn zzyv%s5VjnMHEK~xsX=djd8ARTrd-9=8qr)s-)?@30bDq}8DC*+$n_b$0h6cC1f17p z!(&;)h3g4@_!-bHz_b9aR?chGCUaV4Dyi`M!OamA?S&84jaU29Ezf(9dz=Sgd-vc+kgkka{9m5$XIad?9IUEKnMG>XE92I07hhSA%{gy`?>BheX8p zKvl*{Th=bo*x6%NdRs}p1QHMwd>F8DR9L0_Ca5U4Y&>L#CqRId2wVaJB~p!>pm9nx z$;*mJt+JMegDum61Z$)*n$EH+3^bc5~`Y zyN?E9YZ?{0kHOv`r8kp$x?x59|4hyn!bw$6RxQ*w95~h-__9nn7^D`sbbH1$L3d zXN(yH{kYqfA=#Qap9vH`q49qYOXyzPbHEHy+xX4;C;-WaD1>V0utsB1csvGiW*zf2 z>@Dy;Q%R};5CTn{Ae=$8Qz~lU8yPb7*BOG8lc?y?Y=y}nRVguc+(`)%N*HNUIBc_* z%r$`S2DJ;`EVk!umpNAUxV-yB2>}(7J<5f{MbVV%_3Fb@Wl$#`9*Zvp?XKiFkr<%O z41ysz46y$9*9a_8Azxf1fYbOY1dFTUEV}1*4?UAh_A?GY$*=g0d4>W(m7);&^_4yc zHORcBO7)C_4@AZ}4Sy`_F%`Y5CKN+)byXzhG^2+*I+V%oUJf?ql(HLq{mdN5F(-d~ zq$zofm69&MRu?WGbXF*)g6gsL#M~zg%3NvK3h=OV!;QcOH8LP4BujaBSAieqznP zo85N#Gkld#y0Q)ZqOfD!o}s@Km4%Y0318T-RHV59GyOwKQihpqHILr84T~eXfob(; z8o(6iEl|qb5jUJ-b|_22Waa}-O&|X>6VbVfPG2q;mx2bj_lG^|nE7QW#}MImF`lTk zi;JK^Tq;e~eqA}_Y=%dHXgCy@QnQe% zm3RRj8u!-Q60OabLaL#BuUZtTMR=(#(Zavdo*!{3wQ>}Ffhrk*rjMU^7dia^*{{eZ88#!p%>+6rP(z(L#EU)kRv7yY zqVw^q!jgauzm^LR&K-AUV-PIq0l5D7LkifJb(`i7^uhk=A^Bu5_KwinYKbZ!;J-W3W^60Oo0PBU-ew=L9}X}9}FiGe}_wX zS9wFPbUdeXK+lJwKR9YHjM^@tIZ(2R{h!G^l%&Y%exWr8YyVJhGF@!T81|5 zG)b4+8Xgt4VZHezG)esTl=-S)*F*{s^9YI@#)~K!#JmE+NCw=}CoUQVqtRgoO2SVye8?=|lKw5)t7Iku9;p?*9vlgydi`7~5t{mPd?`S=uH z=7)@wegluC(C;G-fFQpCSZ4XjOiqlC0D#Jy2d3}Y81jdEPdTSTcA|nO$^U#LM@8Pg zl6l)GhWGDlcdL%&jjv74pD+-43uRiA-4Ju$;-lmr44nVZ=_HN>!O*5Gyh zbfYs1{iug2;bkY4L1e$dCF$$tZqh8->z#J!vrrs}N#fsDZE#gAMRkqJ+t6)Eu|U=O zF6FD-liu?UP`1F3ef7_1Ix14!b1zC@w#Z2xoq#l)<9cGFN)+K9wq)50V-Cn0w&Dx_W{PljpggL ziM2uJd{?VMBo16OM#3_>cJjOW7osAX(clA&4Uo|ZePW>fhKR!Wu-Ww?DdtF!Y<{z# zhw_k-l=X~cfFLQK%{!O}QPayp;NJ1;_1C5i#pGL)XN(nv49$4*X% zBq;S5peVK*d|-l`l~TSrYw8a%3L>=XtZ$;${MQr%0&skq_if-Bg*YDet(;bc;`9$1 z1YBJQa_Zp5!6Fy@;xGwD(UyeHIS<-7bC{O(+k@tqb87CaX4uc(T||xu*~1Tr-Z1>g zG}@f?&FLeC{{_>!7kNRIZHM=xXm2-E51lZiy7XI=|2$*M!kPU?~ zJau=f7zi3u9VEWwY(|kQF$;XFkej*E0eByTqNnaGo6z8&xa242Cl{!ss|U=vYl?dQ ziJ7kdYCV#%ofZ!Z<$&YP9?s3bI4ZiQ3OvsbKrVl?rdpQ0mf`o;^wD`ygAsdX*78u% zb-~!D>4UTxNmScyO}oIM?POEu`KCIiCVC1g1p8%;AP2!jy78e9e1&o~q;-$01K7i0 zSk_M})|`a9mFA3{g&Djs@rY+(s#k_V+I%_(xV(z5F3sNsR4p*VIR3RL+Lb|)fo*!c zkT{arov3ASJ0&^sdWdC%{r&VzpVZde)b)-BnfbNTI&!N0 zI<$JX&L5d^l$RXnVQ4}uh7LT<1(44#%U*z3Hg_fzZwz!QJEEuo%M|sIK4b?HA#k4_ zC9=*bWvIIAu8Q|oHo;y(@re(!NS>e$+U67O2A8`j)NW&TW|uhP;Q4&(Y1gA=!lw>s zqa*8m){ZS`7_CZLy;m(tRy?FAhCI%JKWLD_+eHa0dm~dM9|k$ z8w%_hNzSWe54(#DKF`-4nnR3*j>{KrgZo`n&)T5@GCyiW+jh+gwPfQyBLyGV=s#Sp2%s6sw3ChLazz(NYiYy^rW;P zMhfzc$>t?xL;TDgtr4|V93a4I&3HkeKscv*Iz@!4uemz#*T)!PRLr#s5y}zo2 z4uFL1ejz9#PEy55tAebSgsp+2hT^ZnbSPrkr;*SH0SCypB%cqcA@m<~WP+#&8#_PO zhscccLu`QjO8S;4eCkuu7jhP=Mepv&WExe(w#_A<%i79EIzfnxM#`)@CyVzfrS9)g zTTXfpP?P0j7W_F}lQkI&>cFz-u0J-i>KUsS^3Hwmh_y1|r`weVv<{rDzCe^wKCF>BpfC6-xcgi%R-w%=hGILP=8^GL;gU>O@3d_=5AWo)gEMNPwIYb zmT8n2r!Z_6o!?E6a6h(5y#H|k3RCvWu%0pg9*&|22UqNdWQyYnYZr%pqtU9Cu> z^hJ4~Y7hOk>o~=BD0ArrMK{e(M2MyFI1z(CLl#7GoPlvxq0(A~oYQvv>;Ad;m(41f zDxP*MV;8sugNIR<%5$EOh;@@D??_#cRLiO*LeNM*y~MHN(%0-Z-VTk4P>!mgP22(g zTgu)-qNF-arCwF57?8J7P%rPf;}v+eS8=a~w)XJZ!eUj#Vf`iiKgFj1-D|qv?;+4b z0s=~)_`hoB*ulWK09{8sNss!AZ9Ok^aplw#EPKoKL%Yf%D%#*Wsb;gOjAtCZiDb^4 zrnb6&YVez8im#PDk|>mdtBPTPoZyRrPDDx;&PI%tg@O)TrHTFRL2h`S8j?r!f4Q-~%H#tC&)N zlA+_OMtjL5xZ3(}EQ05NlTPE$jl3@~oGGX0bP_LFbQxJx8`w1-pby?v(SFsGEtZrm z?zQR|R}su{fa+d03c9lYw9axd#f4Mee}inC`j#VhW>O2|(cDbb#|2hKg-Gzu{6tt@ z$}#Dtx76#$wPHSUg(&iFLzId!mRK(OxyTkLeGHu3v-P8@d9#J2>oZf{o%Ua8^IC^t z%4@ccqV=n%K97?(gBFF`8;6`G1roHVPU# z@^47U0h>kGQqJ>kBFm4YEtr!^KFSjGgkDA70eyqa+q=Q&CD#lnjbXbn zf%O(E4r5>Xf>5N7>F^B>?b|GHvptO+pBgg# zn{0KCQpYgJgYzC}&-Jx+ZFx|08p+huyS@y7{7-Qx8!GExf~gC6p1ju4_ZguVnn#0 z5plOy4bN_MDT=>ET{vEAZDSdZZe4z%IiOSR?;oGGakqTLj}g^e2ppfZIY z14b|+`|1=xG0}Vc(4V>Y`KGEruG>$z>zB~SU$!kUeh%fVc! zS5fO32;wB7c)R(pfO24f{)G)F7Q>+#5*V1h*#!bu33W-v$BKwe71cNEq4O$efkalS zEG$f@cskHkR!3?hck%@MLDk`9cPpFcqDJ1XBDGf`?=8Sc6OH$riB*dR;Qt}HCKgl^ zQfDs~NV{=GNOQ5wU#k&N75@tt3e!{Aya=tws>8(vy*?(|KY2$We~EW>90g3tcIGD- z_;?Okfv{T?>twL0nqC?_tqUhR%Qm2srq3MeW>H@;%&{4BceJQMCHr3B>#;nWBg zS-t^k&DqDGkPzK9K;xLr31WNw5&**8DXmB5Bj9`Dhm5`H8%6W39ga4uX!Jpc8-d9S z%55~me(7IKo=?-lJj;4#>~^;K>R#b^Kpz}ZcC!4&h->QiWp z1aRgzFI-c4;3@(TP=Uw=pg;tz&h6K4UXHlgd`3e???%?_x=PGjKlRDf?|Jcw(8tyN zq;-YICzgxA{E#qt5xB0j#F>^Be#dA+CBZ{iL05o^_12+*nSvdOC+7ama@(aBz1z3m)P&+K z`(gZ~cS1xm&z_>k*&56p4;hQidI#+;xr zRruGjC~DHGaJEp$KbWEp8oYPMJP=C1(uiTYK3WknTnU;70HhEOMZ$Dh2xA}#+#)(z z1#irTQ>f&rekXa*bg&tS>?B?(H&)3C{gF1ZLqand80RK&aKfS2ghR+MYlt(U~r&eyG^A} z`sGzHBPqSC-ln7RBLdE*8sxl1S@k;bD(XT+My;a2+4fClb5TRE-f&y3FO^%Xq6OW9 z`GdytNmKQg`$CiRe5xFcH%0F{>$5ibGq;d?P$}Fh;1o#|f&6+I#vkYC#MPWMh?f6w z(+!7qAqh2sKcnmVl<#mbbGH{fF2UBeHAh^4OMmMTN>4_o0j=X&8BfxAWz5jy^FO=p zBr&Azu-46s{d?(fzi4FS-^PCyEg=7YB(nKQ@FLz4kX*Bat!br%3C*Da3i!2q zp?vPQQeuKKmMLb;(yCJm!Ja8C%f`~<`*UV;^~FUPYTvWaBoqDn6LqRa^((^akdI?6 z%R#Hmu``HYB@aQ!*JwheVjeKY=y(}7Zpm56fTOhR7IDSRVqjGoEKXEaA~_tK3e@&5 z*LW0YKr{j8sl1lS98@NSxz~i5w=_r`qYUZP+eA3UoQujwnxhq%J*hBuRH1}0Yk0db zY09>;(KP7w+6t8pVhVQ3Xw=)QBvqz1iu!+X=J8v~r3*4ZsaA(#i&OieUt&&HI8UGu zK$V`G0&=7b;Rw)4oei1fHCMzo0tOkjui z_EoNemBuE{Vg!gYv3&!VGIi0rUS0;9lW0eF$E{~QfgL8063(|Ct=1&=oKW}?us$gi z3!1463ACJQF7W$oR6iL|Xn4d=!##cZ$;CbiE^vZ?O9Pny%>@mvs)G9y3`ccM8!xII z%YSJ)FLB>RR#MR49NXXN|ENhsCKxreg(Po`%)U4)LiJ*-%%Ri6cy(}$f`x8YQr5qU z&_2Ae;UBsll`I1PD{1!1Cv8Kll!Es2-FxNYG#1_tTmZ3el{*AA0}9ts+v%XKZ}_C& zThLAiH?hQtK7$gl-HZ}gRtnTqR>m8@et&o*p1~-rU?~a`WUXp&3uRzxJ&x2nkzpSP z%nq2n5K*tutdVdxICd93bg$!)Jx)-&c4p;FoJ8EzTKyrD_)_$iE&1Tf)u&Sl%kPM7 z6)}{ieNxvhf#KKKyR?oAps8C_O!3H%zU+8Rj{RmOr|(Vppqf)Wr96xzD`4qnDir~eU zUoi5IJg<#o38(bh=K(WWXML}Wxf#xSgQ4P!$84#ODl2iz!`}={jak@NjakNZ%~|(e z13h-ey`FWdSvmi;(yq(%otX2Tj)_y4%iGXu&I~R*Po5GRlhByi4lhiUyLs_tv#hhIC>tx&!a~$c23S6Z~n=3xPsg z!QkS|YRoc25#j3&asm=d#xr+GN525HGbE_hY6uGPXr^lAYU3VRmgsWEwIoHh zP5jYGEri)iq5Vn&_%r9s(Hbo7Ex+FScn}q zjiut;?_M|p=GwX}E+m_6wE$CXu|oQC>^D9_x-_nQLLyfz6# z#oHR6QeC1NOLK`m1<#(R!2dcUB@vhr*db#i5!j2n=|QL`g$d}_ljK5FX;I0v%$xXM z4>N#kuHZvmujks+cO8H*{~H$rzem$Z`9P1i*n9C|f7iC2li`*GOiuO}W$%DP>qolQ#Jy-L~-eqCxy ze?+W2RSZ88^WC6pCwGo&OD{2J$kx(bvW$3^m8PoemwC3OQc*smr9`7Be&wHA=buzj zCU07lYi=~Qf}pXE9O^qFKGL1o^RNv3v0HA7PQz6%uN5l;sc;vG05{iRYy0Qrlw9_bQG z6%q760f?cRhpqSbs)&-MVaAzy#9YIA1WS)!oP((@9 z;wpv zXLZG+ST}6Gnl4#RU@)9E>~w?Pd{RE~Z5#?I_y)Lq?&x0l!Dl z`0@d!wu6_on%3k@r4T249CUs;c)-AvnU{}4Pt^oYegyl0Po`cqO(1pD3E4HFVdh*o zUA+V_IB$B`tfKLy(JWJc(P~mhuvW)#)ni~$tO{;&E>qm1=GUl!v3xbZZ>kWGcWQ&V z)HOc{Or=@TOS}5^}>4ZZNYZHMWU#i(d6?*;njeo%Ty?kD(`Z zHh4kf%^klJTJq(WWkh&mU5~|Qb-zbe&&0<_r1(j4zZWS*B-Mcts`k0c=Eq!9fj{Un_7eP+I zX`IZIZKIr@qC~V_I2algzj;kErR(_LeJVAL!rJ;te_?wNnW;jK($c`>`qd6$YE{}c zQEFXUccCg&*}J{AXzSN%wNREyS?0NrIC#jG6{l$(upv2#kby-fZq3S2z`DGnMHSy^ zYW!)v6;aVL5y>pwd{%DASDUw_)m|__y08v+Hcy)Cpa>h)2df8%n129y@-mTFo#RR4f0o)e&F-+(s&f z9y83woz|d*=BW}!7WqzB_7Dw-w7~({*zU0jYc7pVW!%Qjwwrf!6MK8<@m*UYy^^x| z$2Wma(@KUy;fR=WXY?lB9_*yG`y2i{_#G9-E3-bqOK|c+pcl-au~DR0&^}PF0lM%Q z0T8|?pq?pl+g*DP7pC9cR~T^nYMNffuK1&F$H<7e%};=*ScgPfKST_OeSSTaK23zIHr>Z{I1&m3 z%k;U*^!dv4x8ji%))p|}fd@xZLjH;T)=@|dw-~=O@*1rS7{fdRewZU04w)6MhB)~~ zqXa_zw_OMG8*43(S?!{(1VmmWlz1Ws{N)?>;49GM%-77*-!*?E+M2S zNu*xe1KA)Z%vpiPXyXHmj@7csH)PnZi>w+S8=P)f>M6(t2F(ks^gKdqzKWeN0hx^bU!*WY_fsT0k#h+`w1-@XKx0&YykO)Hq0HiP>5V>79$=pFcQRrUjhnE zrt^stI0{UTmZuT3bKT85%r>h1)!A-SWr6QFEFnHThtUz(p+JBo7Ms$U2x&XMRYK4) zhmqGsn@Mrn+yJGW9Zn@6a(3v~IjZvy2V^>;EpQh>sUcL3FH{aa;OV2e+|OrfJ*w3OqAOqimvf8Y#)m)fdPyOcS_05tQa0=c@|m z0NF9RX1b4zkJ@WVJofbAp+K4rl&Z#Rg`#Ujq2^$t6sPvO0%4g#ZhdVIal&Wlg|2&_ zzl^&wA|l<^=Jd!OpeL`Sm=bZ9=f<~Tsn_LtaMy)qsOJ(Hm;5F$C<{2WJTbUnkLX}kI zwB>^WA18?7SW>>3JfH4b?S%;o^JmbJcBPx9am8Z!3`&j^VD>^@%@_kCU!k2|b{?<2 zV`mOdL}RRl%kN^JQEq>pq&W;5_g4^pbcaHk(F7jl!+8&6Vkp}R;u2a;!6AH9Y3C5; zH`rwuiK6WgLi@nL;a#Yt@Nn!1ops+tm2Lv`APnn_kMBS52p>5b@1PPM_(oMtGQI1V ztXL7eS|P(Pz@7(-G&RMdGpXwnG}d9n5V+zxO4HWEzH6PKGiP>rUP5Fe>-9Uk6=VU4c+2?B@o%g3K4 zYR%Et*-QKQ=?{Ut1*+w(PDhJW1yz7%@=6%!risUnr7yr;A88>3ViInRMZ zc~KX4EE*!f?f+Kj)pJ9Xk*29q|7%@cT_2pLlKY!G8X>Y6yx0-*&_Kge0nVTdXUY;h zMMberyr_H=VzJoFY#`jbdM`Q}Ia^}lvjNi&KoFIB<9_K5no^{uVto6v?Zhhd0iE7s zpsH9+;6Z%%uPj^@x$4wgL7ZK`Z}W;5%}aAp5G)&7kd}#bN~gd&04U+!pQtJ5)S@E@ zxn+ENP>&@Njy3a-$pbTmXW5y9t|Ri=Ya)woWqFJ^azFo!&-z$}%7_Nd${B@jRW=SH zzz!QkDQLzJVVv!mWV@0up&{W##eHgj{AA8T*Ep)%z!MI3%OfPpAbHqv!uqJ|*7ss2BQX8oc!b4S8-hRJ5P6-+3wGooOVB#6Wpq0&+ zkMw9S*AHS7kmMF1K}_c|gq|@(G62pdr7=ZLnHE9X9zYt`eQ^Rbg}0Z;zMp2%Pn-04 zU_g9aEc_lmMkDj_`rUnz9yibLsVA2~mpdE~{=_3DnXai8)li<+S~j8q>~zN@lPX}^ zhpmMNVA#iKliE5HOiLfUOVp-MO)-=>L!MTfM}}bPi{iRs5=+e^5nVLomle&3RFkBu!a|J;I@>!`M=53+sU>#8=;XVCJ)uI=UG zR@3b95#eN3ZgLM5ZFHtLgs8 zdhUO80q}iP+!%u0w6Knq9jl1qHmswukFsYE&fFHCzeY{i;raVkFiCv1Z9GqN23H>j zj04E+TfpcpgvG;k4i)EyM>KwnaEz<2vw#1N{Q!#Ss`n4XXPEdvM>IP^wdeE7jK63t zb}cnaL6O zZdW8nTe+mH)tN~V7H=!L=<191nVrS-WCxCqcw7NhHHPx+)#5(+Es#r|d!Jf>QGhDH zw8wOhp7!x5VpLV{vu-Bb>!Zfvo8vzA4JoZN&*$6t9y#DYVBk^7k*Obma(8`f;{AuA z{!sfKPp~hhK!6zM%PsfeKLbnuK+X;3D9Qf5=&OjA-><`e+3}1YAoylJ8e@MT0&t@_ zO0!>pX5S?7-KF^zdKSs>{E615k9qob?Hk4j;^SKYH3sp$$2b=Q`}7&uNyV^u8)BmR z#q=#eM$#lcfEc3~O<1%qIXd$njeuqKh06aFa}@T7mCy4QwE&%Q>2pFrmbd4J%RZLz z2oo(pIP`{=St`E4cz2i(j z{WQqqVP(|i+7@ZM_K0g=4d1U~w^dxSRdia@@iZROg){Ft)K1{pa`0qq1@O$Yg?VJ) zAl3b2x&Gr(N3D?^V_%o7w?9Ko34}iWX8|S%;@X}%7)u6aZ&jB24!RAP%qDw+m{9x9R-Y(Q& z(Dj-f(_NSwHlN`*%FQ7^8{7s!dZkiRH)he}U)6r&iP=X~SZgveVP_y3XgOR~CGbo&7A-no4^|2*1^$v7Or2;f*>+cxN~R;^H& zx>>)eBZsw3*WB*izlzkL%7VTDE?Hx)vD{6n=Iw`EFNdH z7I?RHM$NUazdSF90}#Y7ytA^gZMO2BuG~cZ^2ffzaayG|8d!AA*UdHI?7MLebE`3D z`o&W8?TUH+``5DDf6$gbf3xR&QZ>cb^W=LITi@8yG+v^WQ>HzoChCa6bSk@3Li8z* zs8>yW;$OQ4^DJWLp3X-Y<2H3$f3IWB>5tRjxQ6o7>>+{Z3uuSD&$wBQ;ZjUY9hIW@ zmIsmFt1lTMtYCr1jYnKgot>Yr2oL@AYP0c9e64&r46^ZFG-xyEaz4^iWAq?gpGD6j zAv1omYyGiF6P$gunuLBqk{>lU#7|Q{d(y1gStl!qbE&}0L$e0ML7O*El$?+sfr?v* zjh$JGZZm6*1x&tYzk4sUk(lygW+nBR^4r>H>5}`jlhU$y*3!q^JSxZEy1E%g+Vxl1 znz2Qv&RB6h?OCOg(5yS1_bpOMdK=qi{>&>!O~>D(uK&jtZ&rzWNNQrC`IDh!b44l^ zvGufXUhKka+JQUtVjn*B>mU1546=R~p*G@G9WGKG4u}fE31CzeMP~1{`|wo4PpRUG zuHq?YahKb1=(U4rIoAmlp4{Q_4~tYf%yUEz@-56jZ1-SVGP^QwJ0v>5|Q}<{C(4|SU+yzcwt_E!xpJk*ArmGmFrv#j@H11S7$qP^WtJU^m1cc_8R2MX!E

4?nQyhfh2v&TNif>Noup3G!B`_>G!KJgt6!BeOQ)2u@Kx_YT) z^_f5LSSdNrfAczt)+ZL~$K;O6KPx3N9kmIu?clCS|LqBe&wM5JAKIHXI#%AeKV9GO z13oE?cNXTza9PhsnukX+D`O`O;&lkhgG7wAGM5^bz)CyoP5A#0ego~_cGz;67!^K8mT`Gkv zb1Dv7LVK>@(|Hv;^Orm1)8E$9`Ug8@K|A8p-`A5Ub2bE(={B4ax`Ou*AI;EYE74lp)WtN`^31I@4MG05leN zwfp`71c|be3g5EO@GL+$vNBLWx>g}k*2mTsL{f&BZ+p+^g_IvUlb_%7$_VEAP@zST z{q>*412|{cwwBq)e3EU8glN;YoYVMKD$u%yxcEwZc&x;8ndSwj-!!8Mz%Bd7>qXu9 z4cRwk^V@O9PC%`Pnpq4CA#NxqppYSZx55`~jKb@gL%rIu<;uXWeyN5dQq_h7?FHJ$ z8`*#a=b!xsFGqN%rcXEu!OM63{!CjRg6UoU=b?qKXxTq+E-dF)m(ipbJq%SgqNGk0 zBe%7gI-maqO+d20mwNg0DAcpjLeFUh4SH^gdf7uY4Sw0bea9M$XT8PMhMtHmY{Y*@ z7@SlHapTW1tEO#MUURJU-2|g``Q*}*tDn;EHm4QB?`tLl1aNPw-vE#%BrqV%%a%V) zAk3sKYVBA=Lt0@DH1xI|rzje+SK={dv1h(lJlhP=j{iP<Mq@4~ zsep%Yc^H@3ELwX%U491LDezFZG!TEA<1y``s~G@gP7KO^3*gseN_vUD#=MMQ`VxRK z`mSdpbH%3nJb>0_HMEGnCqTVre#AH@Y$GgQdQwutw53gK;*U}KZN|B;QW=M9$qVZx z;u$(82{0HNhVP49#}f8dF4fA9Q7fe_yJL&|7Fu%&+~rU>qb+LPPWw_Uu%qqWxuxSR6Fq$%TTOTuy}+NK zqH|UM6z`Q*(CUDAUzGc*UXXvlO*V28Dee>0Bb9nDQfqPhz5J%@!Q^-*9o~SZ^?dwXqqlx#S*CT${90fOpCTn#T>IHKp~rsWt&sH zv8K$;Yt)(=#=#8ik$k+mK9Q`hM?zx-Gj6O{gv1DCzLeWCLmOz0t~7s(w8H8kt(J6J zj2b#qRIVW3aOoV@R0M*-KJ9-H)AM+GdZ>?T!X>w%CydYqgcCt?&0|4n77TJZ0-`)= zMV=#`fL?y7-EFF|#8k=&u)7^Eh34<}l~Au6+)-?nKVEznql zryt0%UD(kmIUZpQi2nqJ`HnL&E6GAoV7_Do8NnUx7x>H-d!voD=B0&%iA{!9j_Ff+ zOml0^i}8>i*=CJQ>RxjU7SsLo^zz zHa!8V^T?`I{30M0kFc%QV3ObTpQJIhdA;7F$2A#s8doZx7x~nv%Mma3jdNsyXRZNQxkwyorugtYmH@7={-S3+Fk&;b+c2ubAI#0V3pa~)Uvt3 z8Fl>oFj7RuJw%uP9+NV`Q#(yl>(Jy@>37DgnVZ)Q zpWwLlMJqMQxVPg;K4Ab|Z=2vVfT9`I-GOQCTmHEn0~RZIK za~LzGO9`O}$eGt#9j|XHqzqMx*`WlWktJ#@2wQ8-Q09MKq|pv*ttCA8L~8mF7kBA< zJfTXlC(AQeABPQ94AWMFK)Z9(8_}QXS?H zi!o{>lE@@}?9-9C?Fv(Zu$409t5E8%(fvqdEdhV&ej}_3I~)aST{6Qlyh#u*l^&nknobZsB)DzT;B*0m?T`?+OuddaHTjC~c}4Twfsr+={0qfAdid z-0pd-!wdjTZm>FEQ_Kq<`WUUFK_8EG9L3)q7iXGFm*=NiuttmsEhUC}S@=e5&q4o5 z?3sUj&~8DFPC&&Edv*|Z*KzgMCHqro`pwR=C*fI*H(7@uY_CLX?A(Uu5n=WoPF?7B z+Y&OmkD+zNEVVjeFVA|QUXh4I&~f!*ToPnovVD0a66wLbQl3Adm*>^(L$cKr|QI4T7FPqI-McexxAi!F4eI4pf$cF?Cb88W)a%?^rud+GUZ)0?vg;sw@ z4yYzNB+B}bp@?uf&kOOq5VT-ex`GQNbG@Q!uz%nyjb$%vsF(lV(DVtB)HK$I34v`+ zs1Z$N9N^6~%EIcV0hF{Ifd~n0BWnf#fj~gs0A+Cx0c8x2d`mn~{%K-dGX^4B_}iBRJbyBCOOa zc9)ijw+#9RV1~a-H3;Q%LuJgFO45e~ST(WaG$!Ar$fBJZ7RN}DzF$?SCyJq(1pX|~Yu)t=`ddv98d24HjM7XeP5ZeG zkR|av4PiS^GlfF5bwWYkr$JN;m$TSpX6P?+zFuyz9rQ}Ny_6!2=|1L26E$1kUUjkb z8ocma>`sUSjIvAI>9pnW4xN#Vm9;r0cWP1~Bh7b=6s7Zb3@I6xP#=FZ^&x{*#uhV9 z#)?gUd8ScvQkaDOvP^r5pTNBGlVuDoV^gkTWCP66or68MV+AiqHa(X>D*+Cm1mTSw z_V1Q`Zi#ZbT&BP>=fWXl1rqELQFzIuy=`n)@ir>5;HbFyi+Wn0CR75>ipWm6TM34C zA@1oAeL-aFVs~x5+o69g8KkzFr7iHwJqDaJC1T4;6JUS~NxJ2xs<$0d#U7W6t{Ia7|XXU}C}6K|Vd-lL`4 z_SpcTu+eD|;X){aw&oq&1%C}iA7Fwdz=+WbX1r2VmMuLewrqdt<(ZJGSEx6Q4kR24 zL?7AhW)KpQ)mc2-_3Mm{78m=M>y#dcMlufX&Q@D#p zqcOTa5KTl=qWVf9nuN6pR6v`*(YFbk=^ePX(GFX%suHar*&Z1a$-R(UvUK~f!($I& z!vU|#w``BcIB3Cxq&OgU{m^y#kD-p~6mm&u-OENS zJt)HTqU(qLk7~$pN+T2o8BZgdEm})U{`0)&7inlb2?TuZ2aGQo;NE)WbsmleYm#n^ zG11%sNlT)u>=Mi{ol!^Fd)x(k&Ik5In=;03z8+f>B3;Z9i-EDMSK zYtCAbo&#r2(_6>1eqdYH4`NdT296oHGiIbTF_`XUW6Pqy9R1n!mluSzi0LoVpF@8o zSZ9A-HVGP-Aaz%0=SSv4#&ds6d)?a3MU@qsr7=0a&-1;__XWPs^L>%;D=W@+X~&?_ zZQ7wD1Qp8B$RRvGLA!mFmDaCB)ooXR`>39Kp3-be`+3^MMS^%T1vTEis<{@2Ej)MJ*PV- zDhY>vOXrS{5BpdV`UVg4ka`x5QHqhl8;;kYbu++;HGyk zftuI=RGC*Z%o%0?y$@KUs+f(d2eph^9-0WG+rz&$L0?}DzpfVJvSvOJ0MCaCjXLk&VE|% zo;gcGnor?A*R$qt>zS)P^ZWoAdJjt;MV%pvU~lc6YJa4o=M{8L#9e zFwq-ZLOBL-V?L|!Yz#1`5Mi;-(6oP#CT5k`R~UjpVjB2DSCq&E(0l)zD`(G(|*l1t=D2REi{#ZPSrGYdY>5+_7UU^Z1=fhDJFj$M0$?s z5pxRcHPK1x9wN&8R-uLcYpfKY=OFm<9a=WdR!N`+CvpxM=M8^}=$w+k4lW6kN|#pL zDNsFTTH+RJpM7D08C;<8lVX9)UL7&d)7tS}u!bPv;8)T=2_KBZ`6do(KV zmoRh}6M>tS2}MkFs+i9NVpEBKF;Y)R+WUosz%+zw)t1G+vYy*i{x$O9=d-pxRLz7PM5!I zDm9SdR@IIvST^mNDsv4|9$KZVMC|f923DB%Niq#m5-D*mR3w|^V@o&9`&TUPn`y!iDzqZ7H;fg@vsae zOZZAr`G7d&j$>IF$en*UKd|@0l5FjXRNvxrBiVJfc^43r?`zwptn3~#k&9lCLQ4ER zS4>f(_r;*PmtTXKk)(oi5Ns-mEnBO?I7X6~GFKmjbs&C3558r_@>+LFO2TthZ3Y}? z%FH-am0Iv|gB8y>(>KRLo@2VQ07F~y2*A@F{51uuU~l%pAq9x?>cST9(S4bGByML@v9d05)t1xtGtx4;y!z}#>FoG#To zPQ2qdafV~U6cvK7lTl^+Ks3qJ>ImIUFa`OY(A=JmD%9^ux;q$+(A^Zqf=0i5*^EbG z>p*m1dnR(|?Sb%6G#M3XHst&ePfBGEMF*myN~zLlQ%ir_hj-AA>8*p&!DxC0TzyWC zQIw;n8LlzMHDc^@IJuzPo1`|TqnQ~)<{_Lg8BI|elRO4iJnwU(P0vb+g`ZOA>)P!a zuTM|JrbEe*uysBL+nKLDy|KPd%vqeEPX3)abIa{#&cHU3p+c)I7MuQlq`az{{Q-m1 z1BaeY^O1k2t4Y2RVOO8vtM7BuGB5c`in$ne=qlBzvmkx!4F7gHdiL>;-*&8a`*X)? zAHV%r?Kbs$2Y&BR>367f97ucaxw(N#xp&+*2|uWQbqEblvVmJ}*EJ8Rp&10QKbw`~ zdT)GQO&V{_eq5edyW_dJxp`Uyv%8m1b)mlw{uqBaeX1kwmsN#&&8`th%f! z0?B2es+*f4=ApvIwstk!Z+_(G`` z=EDME#oV^DV_asV2!i+}z}_9gd#kqp;jj`L*>8_9_mHQz)hG`PN7uY45M+ljIxv6Y zr~ssv7;#Kt#Bm(*CyeMSj5r~AkQgIUZIguKO3RjzP`*rcDIB>~38$h8;T-S+BT9Wx zmbP-6AAF?QYQuVgS1YKqcup034Vw#XueQ*H`AfG`gUk&lb@|M%5_Lk{*p=rf=jB#D zZYW#CuFo43`XegUScAapzoeJX_`iRMd~D=$K$1zkC!f}PjrSyG$Y17d&}gh}v>Ofo zoAgxAw_2U0F8y@E<9A7W1Q1yDBC)XRepdiCoFBGbedv9Bh|psi{+D@2t$LSeVd5)g zZT~ecY|H#BsFx3;A&>uSNc(Sb`EU3I60v{$zc*w(!z0E4`i20yE`wI!1h0SI30~Dx zskJ=8t9G-dG|jt0j?9wHSnm9hky!2oW3*&pWXZN;^qW)UoI5Zzsd6-^R*uQTcH57WX9E977OvoSN~!hOQosP2QKm0efqWMoNEhr1MK_5WSUn z%gjy6)`4C8pEY70mC?v2;vL}MkIR2y#JtB(;_|m~flZ0zeuo*6{3nLC=8=eoOMeTO zzmE%xx_@SHiQ^1_{*pPp)NKH52SR3Prp>Y(0BERcuZOC3d|(^~PF|Vu+6Ko87cDRr z`KWGw*x4z962xFP8V`S3@tG-eb0ltw-(0yw3M7NfURnWB^7=;>08Qem!T^n0Jm}Ef!KUhDp*u_6}1S zjj=jk>O%$LWBMxz@TCQq6Yya>ye)542nUy0_V-=jUgo%;Q5M?I5Kad5P&s#;-dOae z!zWKn`mI2sqTYW%zw!Af$8SDQoF-v-@Ok<@G#kIH>ip%%Ve9Z;Q0L%@QrUry)`4zS z<%dM^`>LhyMeR4Z3vYRXRDy-pJxWos%q*RUx@UDLbUDw82?ux|TQoXOhFN3F_ zU@*|?u*T7U8A)1@U9YG$!scxCiqhBdQ+z5swwT*f-0lA*x_lff=q?5$V@k?B!DOhb z{>B)=SCwqLs?w`0+1?zLYfh^mAIVtPfk4q_WPf64Q$=G15^YnNo8VWPoS4!iF|zz8 zD6J3{l|+A!&ooK1M47f_cd9U5VM9f#fu-QAU)zFjgghbq+zS@azSg$)rJWo|Ib_fp z%;PMSqFOEgSE#>bSO)MeDQ-EPF=^5Q6fRT3N<>5jq|QpyKEiedHroOat^10trOiVuG_6vs3{r@Aws+t6_Hi2=9?O(3YPmz3^; zProvj1SV!El*b**dJS;&!Xh|iDL9nd{O%hALTPtYZvY7O7k@oKDA8HGzS;U`7<e7`}19wIXI2KW-0R5s8op=IMTPEwH-}nLBsZ~j}qIT`6dpnKs$eR zNLr(t>K^9QMb>!Q5^JTNibS^+rlh2$gd-)8vTVC7r7v*{4lLtz8=!wmGsYHSIF*Yi zKUK1*OA>}tX$75DrP?Y{8Jb?gp1Ek`AaoP-JZ(hPgV0IX&{J%IT^?hX1QuaRdRn$v zB4lliht&xFF3rn1wrR7sCS~uorow;GXgq>+e?pXBvSCBg{MC%9cefLS{>Ea+wj`Zc zpu@_rM9Z73S}$Yh94pOIC7H=S>-nuP?O`iz%p4c$`mN;_Jn!|Zk{|2zReCIC-o~1^ zV7=QBkU7P=#MsEZzs|Ty7^OFB>&=#*cuSjY9;+?PF=7U~nA0|K zQmI)~lB}M?Hw5|p@8ISCf|q|bTmP~|?L|D7SsJ1Q zEDR@=_k(44`LcioydjZlFKe_@8D{e>O_!WCFF3pGw}e`POKqq~I+Au{V(qtMJQe#K zNMu?!?uDItHa_zAG3$Rgx@{CEXhyGNIaZY@uPH)OX-gzz&d?u_Bx<4yeCiM!1&l;A z2yxT5;ZOnFQWH173f|0t_H~uHG9u3G9Z7Zkp&qag@KM8y}CoI~VO4bu+84##z>hZTzvj?p> z&7k>$CFfC|9fk&`Kb^Vi9B2-IAu{PNeoycC6kP6ZbqY>cQ}PgDo(Xennfd9Lh*A+m zQ}C{~B}D>JyC{Fq8&?!*kCz2@xh1XmBODR26<3|#Dug3?Z?jE3)3T$q&kM{^=QT%t zAx#H7(r&G@W`F3?>fju6-|EWX*40k;LYuLiG&(#ceeF`E>oM`mM6TBYdX(p6Ge}e) z;0K~s8mPe2$ypMl|1Fyz=m(|q_t{N=@RkS$vo|J{9zA~*)!te2_aotK3K1K?58>4> zob~u)Xq@1{xW7}mk3y5`Nmd@S8RV%-3<^4Mlm;liZY zfB;@=U1xs`bzBnmnmK8)!V*aws5P5~^oqTI$oamZmWhuo)lPsu8RA4j^JmAB!;aEW zVXp&sRL!%xp1CtId`xf}qdgp6j8i^{g>s=4c(0?Kq~akJ5>f*JQ6HC;H5R+w*bQa^ zGp0qbG^o&){A-=yQ#$d*AH8!VLT$iEjjHJVaAM?WAb`;1c0xJ z%xCjktknc?jS6s~vTFH91kT_ZK-SW5R#-3LYjWx^vnh#gQ=We;vPE{i7<+!(ZD0pZ zX|sQ9PL;Yn7dyhRs_Y3YKB1k?wENzgHWE5BOl%l(tnNB;T1s>P%oHCd;&FT|rm+kWeAr9}>BBp=l znbg8e%f{GFV1F%+Je=~ijs~yUtwAh^kEI$MPc^8VeC^t#qncbXxzXZ7>|c7GK=jc) zcOPDSBGqOk9#$0JUvpQ?)6@)`RFC+?y%3oZfa?}R8+?^6i@HH;b22uQPZiu>yZ--U zFb?9D?Ohv$ca7y#gRb`Ax<@-Ux1)dB*xlN}h8|~iuyQ01RBjo4W(Qzw%%qw4Q>vM< zXbk&KL_NALGo58IacY6=1KKR##=5}mUhd*NpW^GnyBAvd(LJj5k>||s; z4a{pE(ml5mvbbkI4RI3FxypkVTY&!lkgq^mkkigj3g(Oj`z%7OY8=^oW7mIil#5~8 z*wOtkWi!J@>^@{p%~X8S62xC-m_U%%i7E= zlWDFj4;tkc>6077&KdP`FcD;~>NoIMd1|8*w$`LOTDEkEeca^eYdL>U-Jv^abC}p7 z^sTDb=<+G7s_S^^RL!cgfvqYrrEL~oE6}Q*&?}C+IIyTS(R+^}@wPk<1XoBbNyyjvo?P@H^R2N$6r^!* z#)#2ZWVQ^c*4&atJkq5kZQ;=3vB=3$7#sm6=-|@9{Hpns5!WKeL$C?k=4S>)$5?e) z79I51gCBb6{@R+i#^hL5Im#Lo_^Iu#D{py;hN;>1y{5Pnt66{J(^-;e=o|LaH152_ z?8Oby?308H8~7_yiP^I`w8Kq$%KE0lra}ICF82Odn6QW?v#M%BW_}Q35Hz|wzx=q7 z5;2;rrp7$Xq~^igZ5~)mqF16C`K^7A{F5Jg69eB@!O#KsPvdg+@gC~T5M{rSi#^d6 zTpnG*&9B*}``UkINsaCL#(?hMj+gp<#-QshV%%@w!L(@E=H$Rh-9Ig7OD*SIWpxZFDLbq1H=X&x2DmQLzXIUO&fSZ&U)Amoy(u8-EU!tSqX5rFMVe@9L%%@}IZ z{9wH21+T1WLmugzHkOqs1e^5DN9H!XkkRvWOk&tXI@o_i2t3a3u!x9_d{jmAGnsJ$sR$Ae-giJ&4g zQDq-M(GP!cjlntslx0jpVYjFa5uSk|f=z@LBtrb_pJeexPFQS6AXPo{Av+so^Sk19 zZrKpIuVQK1>iy}+mWOI%!c8d^?8MdamJ?#s9eM0yyA;AqL1?Nr#iWnPhTc^GsCe}{e@+7Q1E!v#KUX>EU%I}V<3e4XGt9O;zli^?zMxKCp* zoBoZdzS+886&Y_b9EX|dWs99zP=8h?xP}VXVY7peNx{xFqQc7{OA*WAeKZPIuB&NQ+%jq~%h z#?Xu>28Q`;7_J8=ZoRc5vtOKFrnR%NFyHFlD!Pjs@IcQKbZfu|o^I8#C~g&g6A>fl z&xUL5cdT{AM%%kZ*Al-}Ulq4@`ifaE($HXb2)?s`De)!C7e2UBIvO-&(aj?t>Og;w z)~UsH$K!}N9{z;MjtpobyK73ujIdRnpkJ$bali)(5FsCFfqaR5piC(9D0$f5N_#*t z`AiA%%i92Xrq?su{TTVLC=4qPvAjb<%y?yc!+f7SGB@4Jt+zt}Wh{|;Zh5g;cc65_ z(yEt;BWm!zlk~zj8OwDp){76dxcYy36?s`X+yDp3<{=U}@KH@x6Y#085zIm(9yi5s zZMN3yhcYiz9DwG6*AD6xG`|EO(dc%1MeJ1SCygoXzPS3}s#*#58TrSxRHo_Y?!;dRdsFDZKi zKATHugoj}_KD<}qV@#a0(Wu(7aUyu39ZnKR=n zCHdnfESmuU<}7aW^xXUX3f7+6Xh?WObP#m`mK%yHD$+-G7aNUwSq6X0;RCoFUatQn z#;v&AhRf}^aD*3xYT>9G91?^Q3O_>fU%&-E z$^5^D3nW?cSQ^gw^1(>|f5hb<@*rYW!CXd~0khH?=FrlL8s;DVzsBYJxcu+9!2J?4 z5xvpHCQj!!;)!F`W_^D|sl=E}4E%qK?Ee=o&`hz?hqW8h4lPm0F_{S&G0SazoV;LR zrxfhnhYMsbEOwAwJSccc%NKDs#`^=8Ib3eRG>xdhfQw!m2UwG}GaD};Hl9P=aV})hc=Cfa5xjQ>MSXbC|A0%dE^e)6P3-jop9c+~kZq4>?oxCP&Y< zGv;3F&QXa8dNbvYxiiE-xsK)7^tON;_@gujfAO>W%f)|=?UwlWpo4#-P8EG{@1mA- z-19}F?_W$U2Pe&J9COdE=f$HOe;g-EOZ9?y9}Yi1Pv{coJ2`qeJ4UOQL|IfgdijW` za`f_1F^1^n;xT`YV{Q`IM+|esE|)RPM^y~-F%`pnT*WY-5RY>dbF)6FqL@#qDCP%L z6!U5C;L41QWPaJKAL1v(GRMsIMsdG*fFqZm z<{0K?eU@Wy&k+^;!CpD#0;zc=uSnttcaOb2EXsBgk6YV|rM<+lfHv(gF6EX9M>ZCe zLy5j1+_SR5IbFH$!Ra&6yqUUUqqDRxr%d&#-}lOP<~KTA`P`6T&~d3g>o!HyvN%|h zfw1CT-hh8Q{LqsY^$U;`!6op93VW28CPST;5ZCYPUZ79#k4aYG4FsJ2^I*LwTnZT(HfZd=B4SOv|PU=7NL6d;bY342ym1Et| z(ZXgSl4O6C5c?v|VV-TP_{47%l8*?(FaOm3;pa&$ie%(9=Bxh5c~aUTgTmU*ezmwB{pj&Gf1g5kx_pZ zfC18u)c*%#|Blol0i8nbg3`yZ(e^>ypmK{U6thg>9d; znVRHI{}7iiV3kbl?hl+9M>c}~vY}i&Fd-@J+>&*Ll{54NBZHI*FT;8{^^N{tMoLLK z23YkjNmt$6v7gRX%{zZrqv`w_=HL@{>>Z^zWldN|q~}`}<{-@b7#p7`N8Eqo=|#+? zhk7~Y)eGRVY_P)`TEpy#XA0Ib&{e~!!;bXyQ;no;)|#Gy4>6rB$=o#diWf)L_4CzE z_GBDKC#K4_6x;C}ecg!tSi<8=Y@c%lmv0Rjwt{2?F4?i#t7y|EpD;Hk(xW3Y?QW)n z^B+)vHKeH%fa09lE29g(Iun03%(lvD$Q+FqY;EUMFb6;|XW9MSH3Td1x$9NL-R38T z2?VEMO?)>MpstzF_~z8&=)26gd+hMfn5o#|7yry-hyN{|+ojxplXA;Aa_&Ix5?p^KM+hy^A8EY2 zV+8*;6WzNU$w=ds!3g0moBpX(Ev0lVFPp)q2BL(QhSW2vB8|tjxS76WBaM&o*YwrF zG}QQM{|?OYow%?74}M3a6z^RzOxk>JCYbgc3 zV8CzF0GXoz^XWULd6<9Nx(^rav_*POcyMstve@xuEZHa3lHDs#_Un$AeI&E+`{HKz z?B+(;&1?hU4Q-_HU2I`#J@5&=l`a2BXsG~kIpu4`pw!z0&SuW*G~|3p*pzmd^5^67 z@_oE$m)Ua*Z=kP*Z05m0{1{HFZ_6!FR42I{{LUD03QiQtXa#?r`=|zZ;QjqwYAC51 zTwOycQ^PknY+a%0rcc=@48h!7R|V^0i@xUKV%HbSZf=nKxhf&SmCR}ntNe(QRNP)x zVS8zPh|X0OpjY#?2b&#mX=l!08qb_LMt2%8e$X_RV`9)s}-t(=IiRsf?F*7y7WHU&T_`D>GutD$CW&98hH!uv_mgV3#kn0!h*bPZpZp13# zzA8H*AA1c~q#Wbx&DQ3@L3GTuWC(7+7EN$>Qa<|Gv^Rg_p`Sfb;RK`|TePwt|2%<4 z3#TkWkZZQrj;&jFz=agx8%wglEk2?nZChzC{HF9e#Jr8OQkp`8B(rw?WvJqV zSOdT8b=aM*xOGTXtd0M(j6aZ)YV00`fH{|Gxif!R1D5b1%zfOAJC;%;aR`#=1CMF^ znuH)=U~n#rRr|aUjih1|^l>OhbyJBdlTq~F00hXhny^<%2e%v+p5PzZ%5K&ek--V7 z=DcOApdRVa1a2xofoo0CT|u%p83KMth=Oa=z@m~H&YjCBnd~_41ixeJ$aJ15sXbP< zY7Bp7O6ndiVO(~h3lu5uh(cqxDMYvNZ;@Ikv)vWyc4A&1fJ2sm;6nyHTZQWv7q0%; zIXwcO!a+kN!hh}|V;LtHWQtXm=)0^^N8m7z%2z`;=Y^B{3SSHGl*$2)tb>MZPoUn> zD9=vbcdI{FmdHI_e{o3tMXrA=8tbcnEL49!Ubn_M;-Cb@a4a**4rnH$$!z#F2E%wi zhW7-7$AuFEVNuwcqQ3+5H%$QfAix^pGBZ!%5=freIz;ad)891!W6=x)-Cx-{5*-0p zeA)8d=ny-=ITTr2hdW=RbeGewr}QyS&r$l1Q+k=xPf+?erFGSRn4TFE~ zAXPoUa{#n56-{kj(|LmOjc~pniw>xK&#QbT&UYX>K>2Q-pY=DF`j^i3Nkz5U10HTv#QbPbK|VFu=h=;>fIbCO2l+;4@`49q7Pm>h z9D*CJmAE0y;)XtHwZ<%UR|mWc{PRE&?y_={8LUc20T1H>7utRg7wv*G!8d=(>88Rb z%IRkOq?~TX$fgf91-Lwfem!Uo@{AauKLILwkx>y`z#nFG6h{ts%rP6NNOFVIjEE*O z_pXK9$E-L?)f8W=T)xnEb(siG{}Q?*q*mpydK$G|JBZp+>pO$xGO?oJv`ISxk}l}j zxjeIKaS9)Vh7I3J)>U1cFQ0$ON9CD>F2cPG$lzT_Xh1mRa6vq)Al)E<`E)z5gbMr# zS0j1lsxz1L5F{&Mlfo;uCN_(kKdtvp90aI!OBhRom14FZUhUh#o!slOtnzicwi^g! zDOW6?(iu$=TnSe-sW-@%G#T}i+06&Ja&JU(KZAiJos<`%zKxR5WW#^F<-La*_)tDR z;pJXu+Qfg!D;DakIhDAB%*gj*DQiYOj%eoQT6^;~fu#n@|xm8QI zYDJdnT}j4wCM-_Uf_Hl{pWx5^6y)Y@1iWL`Pe6# zg0hY!JsekXsDizfj5EoRQ6Ruq~r*Zw<+@RbYKyo@s6iYY?Ka(-N)sp?+3r7Ka9q;nDvT zE`PCa&r3uKz4Cv>pl4pJkH(KGq)@%u@h&uyJW}zwF*pIeG7nvcbA2`+pO8`!(63|1 zbX7Aekx7-<-Lv^IbDy5gjpzQP&$IdOy(!P;FDlRCFVdUDr#U2<-&D1IQ~5OidFikg zlQ!Vf9O{Jcsy4o>e476*=V$MB13t|QLw%Z$aS4uScU6C%=EVV@=6&wW3(^T4(_=#% znEU_pknIH|@`e0W+={z&ARgE2WW z`cr(2^s%tTK{Dc4G;C7=n$=VjY;V3ccvO>>7le9;I<6e>$4vik1Rmw(*~b}{4MaL( zY5jjKa2|ULe0XU)xvWzA#?cW`*I$)H6-hs!hb-Qe@as*&;Hzyo>T_*Hdu@PHoXDAnCiy! zL%Jb@#K+41T*cg+PIqD#-&OnR%KzQpl`o~b^2(5|AniN5cV!RfRJ-g|>cnrM;>XQh zwkaUiALwnG%eI#Uv&lxOfGMLE(`pK0KT#^q>=va$2ABd%D)m3xuGD2f|I?XDMXrCS zFl#%)k(;aAqf%^31l(Z!io!trih*1lzhX?quPAaK!0wJSoniU^ibGDBQIRR5(w587 zEGD9&^1DeXN*hyv)<|k(a0kOp*2m=e$rYtn3Q;QUc@kEj+Ii=2H1w@^N?JngDq zs!RdeI4)LmeZAe1=I}bk1eg#Yzu14BS{kr*Yq7*m*Qm1{W51UwNKb5X^%g`9N@snm zLuKqP+uJpKg!IO#6gm5i74euE^H0aM(10=I-CAsyM3T5CYnGM>4a!5qNpL-hHs@zz zc(Qk3iGQt`wrU($0w)O_HZbMj5@uD0m#D;MXb1WM;2<@bPs0FkoqI=I$i#mo!m&N+ zc%`7@FBFwX$>DupVv7Z&AQD3%6^Y>+Z))TGe-cq)=xR%rQ@KB`0U)srm6#0cKqY9_E{H1W%FvgrE z6iA=sZyJ{|I`M|S$<2I|%irWOu0h|+up;6n$VpUWnsvW)RLyiksXU;XJPq)0Z{C_)!f+5?sT;<`oSt zj_-zgM*C6E@8HtYNJxK2MwLzVVWK^)p?%n)+yI~iqd#K==xBy{Rf(1y_9Kmm3KarY z3N^twAHS(s71p>E%xOkd+G09GuqIln*BO0r_}Y%Co2xD8xZu$6i%Fk$iNBa+c*6l0 z_pcHedKPofIE=%`Hx-W2|3?P1lbGM3k(?mos27s3iy3`IJjQ<+js|DYlWKHbidhn zLDFjr*PYjh>j8g_i*VMC_^cs8gnUS<{eOYWcW`0v4eXUchYs@pB`!Ex>Hn{|z;fIF z9xne%BdND*oRxfEADDuti4}k;nB4C_?hl?^s9`ghC=~;!U-hr4>OV35tRsy`BRNsn zF$q`|lIS8-hMkN--U6%CA$js_4v?3CN$QQ%F*O;3WHf)uOX`+^6ZM3TvljboQ#Z{0 zMkDDDMH2jZERwfA7Rhl9G$7HOv*Zrs*i7m$UP4zQ@chuQB#CXr|1kt!^iiF9OU7!` zf1|f-aNE9N=$eM|p^=TK3fDkKj@rve@A-?058dGch?q%Ut`W?K`t8J=C&G zIQ9sa@i5}5;fMHE5|t+VqrDlzNB9Q$oS{8$IU$RG<}b(E^aAI6Hp=tw6Cq6$-i!Ps z%svX8u{b5lU&ARXXQXnFABJ}cfSHRs8LM`W4_#`hl?WFDJ?qZJz2KeI7 z8N@#qVTBbr@RhKW+bX>Xp)Yab5V>-gJHlV*z6w5@V^>)IAJM&=@*i8){$oqcn{vDO zkIf!`R}9{$8(Cr!<70!n`;$$1pdpOU-iqP?HPUCoZZ2y6Bk(x8FGsQI0_y5QeeaLMXlZ?dT@8)oT)vOOD2SI=JbT5bOjTe?CV$w3f)CoiZhgOo7jKW7s~6SMlsB}5{CAk@!)2%VvmwHi-;SpK0B|3F z$l92MNI?p?C)jwFwXhuMZNi+k9Lt7p*8@XGXs)1Kh}zP7C?8o)`x52<3(AowV-0$7 zv&2jDxZH}%ZH(~HwMTKsu0mNPa{?E(<2i-PeYmif&=VQ*abHs7oYvDZ88MRF}k3TrWbZ>Gd+~dxeGv^*= z7noztsN-_onJoimxfCPd-!u)iQ3%aluLRX*WWlO3fSGzOvX+TjdC`FO?wk{U+S_?) z;`X8eq>Mv~lm=Usbehd+b|wwcc#6u%z7RT5?y|XRuxlaKib|^#nJx;Hp3B>kL`PZh)fwl4gx_|G_pMwSu!0$_Lt3b&oF5N7okox!bDBA z1+n@FM*njrdhuDJ^~E^##L-_e`l87P@IDic%eEAk=0Y6*qD4eURZP56h(;C5I(d4i z@fVxfO~f$LWdqkfBRi(i-#>%`1Qa|{jG^Gc#b!7R=DpEokL=a#wQ;k5Z?yJn_p1H6 zxb{?hJ+1G2qb)KYvs;TdzS-}&aj);0eY3THaj)9v-fZn(+N<`P_pBXmWjOjS)jcNb ze$iO9K1`7EoF!uS;Do@h(`|gvOt;Z1orIy-#dZJGF};+hvr9S7use}~waTvQr_cx5 zj|7XLpFL!JNs$|2FQ~cAOmwvR7=Dn0^Wu7Mrrtg!TEX8)4Zg4>{}Z4b8&K5Mr!* z3OqKNkg@K^Qogj9*5dP*RX)$JS>Mz%Gr#o-{hT;H;hV1h@<8M1yR02bT4=PMpQg`CA;{b#wbFJ&m8J&8>#%anaYr=$^ks6ajQfAAw z%^mSSfPU3^*|E_`x7!YU%wDfdgjZXRNZ?~-_Z%G+;2IO>R}(JJ$6QNF5Ytc}k)G)T zS}HWIas~?A2)_`2{>HKo?plUkuIfZSW#I$u*GH4Yjj%1QY-O00;o(eP36EouIZ%EdT)Oc>n-10001&4DkU>0m+wH@c}CVI+um< z0UrVNm!1lWu!_e_>R@nE16PeWuP=b>3Ti8GFTd< zaJ-&d87d8}DmZirf zmSF?eB{pE@uc@V75YMtfh!2{>=B{g6X}7uC+*K|xc~&asUcwg76lGVdG*_>}w?1pG zt(%RC3E}AK)zx~_#-}G2%@z30JiX2<%gxz}v9Qprv!dcAt%_mWCNCR|bs{UZ2IP*c z+qJq?RDWH)(rj3^(XidfsYbP0 z=^dkt_iY_lB*~O;TuKU)ODa>C$}|>X(HCJ{ARJ*a_+Ti;bQXtil_gm6#Z)O$h5q}P zT#B+Z%UqXCtsUExPD$6~l5WP^2{y1Pmy#69LVqa5${&;#WR_z?*W;x$%d_F@QYm8& zEM=Lpps*1(dR;CJnmIPc#;;>3Lu`WWfIN9N$#%l`u$ePQmPXkwwwo2$o)=U$$M&-W z*X3*QR~p;$)L{3pgWl6|HqVOeUZ`P$RoH!O3PL;B{cIY_on(w1W=9}pCo>7h2iQ@- zaeo(uU&kK2u9tSR1&Y0%Jp@k*>|yo>cykYXBRdA)d)b@VaroZH9$}Bd_kQ+f_7?a) zz)rBo;QJo)AUnxUQL7G_hn9-$bPzkp&alTRe6M*gJb5CB-M2JVx*y&YN?kUhnortkyi1Mp-fh#h3luzzzDK58C?C*K#uMwVX3&a+vHJxH+&>}?c# zJ;k17&r$3l_ICCT!2e-ZW$$F~f*yJUyU5-RDR2Csq)DY?umToc{pn`itgP2f~>X3YOi3(hG)FurD_YL0*$pp@3SWU@t}IA;?x>P19-|v2#j9oAyukiofe6~fEVrhn$DU28Usdhu9+9yS*|3?X1G8mngE*ot8<9-BMl zoOY%PuPe??2SwsPYO=k)S~s!HhZ;?0mTQfv0tK4u_7wF;*}l4J7CUbmc5{W&wnYYW z6fj3WOrCY7igQ6>K?U0uMnke)VW+zagPvV6>gCF!!K>RBC~_4^g67tWtO_ta@uKXLw< zr%zlsd-5d>b0Z(~QWQZ9-%Ig9_~Ii7MiGqRBOO5;0dA=;4Is!Oz|1f0L-2a4RlJ=; zFa)3~_TR6+xgv+QWke9`K8ag1)>M-m>0;(xN=t4jj^fBasH|zT(tk~f@4-S?FsBS9IT%`rM+EFJ4 z@5VNjR*Yi07t<*g_hNC1CA?UIVo5KSq*w}KI>b^GOJj_w3ksy9oeY!KW&TTcd@12% z0OFe|roEuHGLSpHDShebk(}qaAQaxj@FnPvDQ~j&T;m*dKvaK zAm3$oxQyH`Gk9&oB$`mh{JqIGug$O9rmG_+xD$#HV&X<87Y;j}d{a{%+}}yS67c8QNIfL}wFl2e*)KSAX|ut(&I3d9`WPsDm_WL5gT+ zP-U>Ey2%hxbyHz#=&GD2?$G z2p&W5ID#h-Af0ie%fJs+t(&qNFPDi0DwhR0Ie_4G03O6e{TNXwUCzi8a#qR6oxhx{ z%XuXMFn=dULw^bR9!O1isUo~F7!VYHxGQQ835@t8@EiaKWRrD?XKkP;*W~xhjzaMQ z#1)L&@)FPyfUq8xKu&>`E7Fv%G|1zCoB?xJo7vbk7Yz0sY#+__IxEbZz^67Z)tJfP zc`!2lp7SZ3$`Lp5tWjS#PjlYn{0-PwZ=}gpZ+|wbVz#UN$?hQvsI=%??AMFfP?E=> z|L9N2%XxWYSErx)Erv=Y)M*%w`knT6ztdzsX#?qnhGRE?c!yoncmoh%1=6)^3P0i~ z?Z~FoQYbBYO|jnMC{@^N;CT#4n-;vOwV)j6JY_~SUhgzmEU84zs*#LZF=0a$OD<|R ziGL!f)GZ6^^?ETvJ%WqPU%i?I?c(=iY7C?VW4&(ocGK&<4b#ec-IP~S0245&Zqrd- z1r;UKQHnRisH66FW>=;vLD#?>!q=Q<(ZI|_w8=tzsfdK^;X?3-J6&O2f*+SuErCTiX_$ZuBAXSkBv|?PvSxDVUKOLfG?>u&~@JQjv94sKnY6_fy&lG4)1Ak}q zIQ1=vS+4F$W|pgA2sVu;x2_sD3xwIMECb2+s@TBJ(WtvJ^2T_lZ+r4>nF;}~h5QZ< z{xz8&!YRR|4=AW^`T&rOaS8jnt!x6p8HHYE>a6H(ZAS2O#M#MWy&s{rtQc2Zt!A4m zFmtE{_w{MU0BjRi=gqRed%YJCiGO-Cyr681b=uLLv4_y#RADd1y~f{GQnVNQu{4Rz zew058Z=9*bLLIRmJ~?liStHOT&qKp;P2g1fkYvlxOV{KN0WZS$<8*so+Qe9tABC8P zF`swaL?#tODuh%DX%Nz2ZN=cD!zT`(1bmY4Nx>&=%TP=7n%s`zG;U=`%YULW?YeI3 z&r9w2Ce)2OB_~srN2S&Pq$O}5mNothcCwv%o_Mr&W)tveWg8j;=nR~aE`GQ*=)~Fs z&R{#cDR9&&Ht5CT6w7(B1jUBDSdwCSFP5U%u!sT9IY)u=3#}o0q&>usFnmVfGYX$E_>2c*F-~JKL1PgM#$qBE ziwPQw9nKEuhp)9J?H$f!dlH|vc0y<;Y$&^&T{jf|Zl=TA5~S@Cnt#F8?uO13rc{;I zZf7Udw)>I{`7Yg1)}}D#>;w$4jKU_qwPzDnX{*rM;|x0mXOFY9ssb$FcU6IY9)>)7 zHzg?H7x8Ttr?*F-NC?XeecrQpQ3lV=z9dH$EzVA3YxrJs+p>83zpaI$8+B zRDj`LCyy%GGj>_8$`Swyddz~nxeg*PC|3I$vnAFhySZkjnLC?mZ z$8?Zd5+JPr_RvpRkSE5Sy<+`2`&j0MEReeaV?_1zd-(4p2Y-qJcV?+C)a6 zA{Yv64RD0jx_Ov2*XIEb!Dnp2W2OnSh_tlL1~4ne!U9Yii<;m|m)NAaxj@34o7-B- z8R+S`5Z698)r$|d%&1>Bt_C_|U#zQNy?yWWDM*yid4EmtU0s};;_>A}lBdh5k}jtO z+i4p(jZOInNS7ltIkKC1+_X=?tbGnf`z*V1Q{l*-x^fMeptIeKL*h900%>A?8WRs9 z%Xe?UE#NXN2YQ|3^(L@o)}zy%mu_VPyhF-+_PME%uK=?|9hr8sfFw&BfON z{3{>dEq|3E_c1GZJU&&XBmW($M%3l^i_t42VDbOPFP`TCgxZNChwc0}wDVRzNDg}G zfJIzfF@3jEbFZ-d5Q2NLh<$F{Tv@fR;t+6b8OMHfBPSSp!gBQ|y@kZziK%h6zOo{+ zE>bRTG*IIJ-8r+qa)RXltcaX!5~~g5lSD5Nu78A(m4e5?Gm4$_bPgb-0JCkP+QFM# zwF(sE4nXV-X*f;_1&3F|X>UCMnp7w$IxZMhcSJltFSH$}17%0rEB0w)70Z>+yK2?6 zi3jFQ#L;U9&J2sc-A}>j1yp*(Au=me9+@CWjph#!hm4ucYOR53Fs-P<(+w7mp0!SR z%YU=DpT7fZKD%{z+;kTab#R5QX8VFqM4WdMOU`nR5`TM(6kc^VL6}? z=`Jep0bE%B7?;`*h@h%2YaoWghcq$?MSqjSe_6R8r$EHkWL*wxc|<%5&vK!^4CYk2 z-_~Um&p|j>Fr<+NXpHJg(Vt&Zr!2n|k)DxL5Zfgqo_+dJfgmoQM{F*_aerHf zUG6T}9BZY9k~gviuxWO^{TiQx|6b#Bz6bc6TSI3(wU9T1=MGqNMNRB+X;`9XppaRb z>iij`Mt@BrZQ(m;%Mxp#cklcNf{zBIyGKouq~$K&RDf%+bfROZZB8j0`EIHpvR$ZX zJwzc;^dOf2%U%K*RdW<;ze9?&Q-8?XM4U)lVKPbVd0So5fGB`m^@7rhIx1hZBiBG~ zccM=0lFS#KSUU;?1M=ExJBFc_*8R@faYvAo8978w&YQ3X8olHL*9}dLfFZdvJ*inu z*zjSrw$9XL(_HO552@&Ioi>{GR(eB+!~M$%pAGkWzhX3+4LXqCT0jk&#edh$DVX8Z zY@FA&3>vgVPapM?Pn&m6&5?P$DVH*S8^wex>Tc3*20MeRd+Z4?DzjlmMNHNt z%$y5N@usU123DJZyl+rtW}0gl=|b|O~?gU+~)|Kl=c*+_)ngb zn9_Cnt5}QS)8FT$MpndN?3H&&4dsZ`*n8)49Xxr98cIJ}*nh1tdPTIb+JJqkY~o4W zU67%neQ!jC<8xLece#IA1T@8t#J22ZT z|IKcZ|7OGTUw^_2qChe-yNxV}>CLk%q6q%iNq+Olt}l?fF%W_Yg%kuj2$GcaFtq{F zQ9N|@KuC~g(X zb%)-z%7Do~2mBx~cvnvvFk4Suq@vbt`Y3}3N|BVxNq zg{Ps|A|81e1L%!gCFqu=V3VN^`Vj9@@J^UyM02+8zOAirsooN8p^ zEv;KNvO*zQ0wkuu0whEZh~t0f%zYO@w5ivTaeqQ10#A$xbJd~ALGuEc1hNt<#@r-{ z1DDNOb&3GrT>p}S}{M7*3N z@185~*njpFAgvnO5qC0qGHg)4$6wz)D_oRI*;=DgUuWh?ztp12KZQMy3$2vz_Bil3 zWsSzM6b~>VKDMO$h-?wUkRkP+{gCXRQ-3E=UDLhd{Y+bIdNl7lG(NyD$hLykfNd46 zb2foT;Lk~9Ejfo(qXtKqhQ;ZC8!ZNI3Y!`?Qfn~tN-2gKZ3C9x)7@n7HvoK04$K1d zFmoN0)z>tHkR00v$xV5C6ltLnir%6B7ZLQ}g&OKlY=c)&!1j2N1&GX3zA;oUZhtqG znTvmxdWSw#iDUoH)ksbZ2S*b15Oa?7`rn_Z{PBC87O3Bdc zy-oaW0G|rx2r2tQR-~P>w%EBS{u0)M-iHM%Z#)zx&9-^P2641uRAC_@|3>m@VC@s) z-q06@%q7YJejOxnTm2bClDb;kNPhuz2Zg?xgUZbX;Jsk0>h8G=t>55bKOEf*X*Gg8 zp9!Hm+BMRhJg?@MZ-+Up@H=2my1gLJulB{fJI{AFC8|d6l-LIQ0bxjVdw=xPs2UEk z{CWuck?=IR4f3*&d{h#wp+|9V%EG)CN3HL?L{{ZDg9??9p{Z{;wS}$*9fkZTY(Y|) zEW4;a{(D%d;_Wt<(9*MCjlb2Y@ntuKIdejn_K{cz<~f_|Mxl04w{0SJr^j+cjVTz}NaVAZ%Fo@*42f?HYiU z{qZYnz+1O#0NTp_X{Z66rPpN(`0`rtU$$!j)^=-~7Iay2&q%1TTtazF$Z^P(%eIC! zEk!(|OES15&6%H~VhZXo$twf+dGs@F>qOHcGyE{(Kz5j(R#<1Xm47lC6&K^eNclYy ziYMf8;LAQ}vdr=1P>4FD9EtEIFefAy`G(u*-OE4Ur_Gr5?SRKoa`KU|-D$6=)zu|k z#}S{Dgc8?Qke}O>+p4WCMK;m&7#e&^x|sExVTeIKF0DXa>n-c%wAeP>gSQOrk+8GujF&Se1+33=Mqb zTvKlU-RZ*H8q1C5Cj1Ja~r!QBH>y@? zX!gX+*$Zb&r_1NgKXdN%`3q-H&(g4$v}VJ!(0!&^7k|Tv<5h}~%EDi#XZ_yZ!cF;I zDztrLitj|A2nE&=c}z~p6LN^R>VBiIQ4|dYYV{Z{6Id_|7o9vJRTWye3eYxnS>;C@ zxveqMU5(Hw1;eu#9HMADh639Hq@(s}W+UmdHjf-&B7*b^BCc9lUB8tSUQ~}9JYXHX z6+K`bI)7jlZz)rSqRzj9jr~u-WGDU2_am5*gijUfPs?RjTWZ!CK0gx$Nw3bV-tL0j zu(Wu&yif5DTID=+P`2A`N92LBP)9|e5)E}zB23{>6X9rRd(n!DZ+@IM0Tt*M+GWU) zCi7`q%w(;Rabj(?DlzqAGAaJV^BG5LYmV$2n}5^6Rm9?s-i~_5w{a)ljxjnKTAR0Z zn6*087s0gv?);dxC2}j{S4s|5OK}AD{a0=yoy3iqJd?S2B@oddnH^?5KOA#de zCsqs_uXm`|=I=r=WY_GvFqY`j35jH6zq=~v*7q2ffa|FBdwp(hwNag$E09&dDqFxa z4S&ptMhWm%;gW~HAx~TBudgxTDs9rZ!mfa`(I9DQ&Wa zL&7Z`c7R&L?n3TzjX^J=c65={mqMTBm)(5`eWh?H)Sbo^kUdTS=r(q_QX_>d=GwNP z?N75W1!H-;BkdXBAYxE3F%X(Kqv;&fbbnkuWLGh+oGGSVb+vBedO}o6YPDjNbX1OD z6H0N*w97Qaf((8P0UnKTboeUibOinMxu;4g%(#Fvr;NuWICfB?tKoPQ6P^r01-bEH zI=IQuIB=lz;zXeo0}{rYP1{xBdFZIR_hdTgkRq;j+~)9PS{QF7U}r+uIjI(AVt*+m zq_7GK*rJUMsN^BZcUgiz#rMSPimRxTUlv=+nF~PDe^T;V!aqqpP1;OPW$8wmco-+t zl_?5)C*{4(ipRDeloH&P|fLCXk!OCL@DVp_IhyUc@<9mI0|YD~4^tjI7rT zi|lduPaybIusf4g?!QKWYE#ltk`_-)n^VCK`@0DK9fB{@Zn5eemXI>cPC_hYmxzIMDFh>Fr$rSED1rOp_IjDv>aoXnpHv*K6cnU#A zCc8@Ey;?Erb>D-Pz|;PmAay1(p%$7P!PFkbgD>=2#e)Z8dcK`0>WOR;xPzD;(W44X zd`SIH<~>1ZG%=odQXfuaGJjf1%RrvaAH1b%@bSN+a#ZO}^S|K}fzJ?p5_&YTk8s;^ zPmgchXyxVZdwNW*6fvVqv62ojUP`e00?(;0!E}8xT4^DWpknHTEPc$!^mrU5s?Yq2s#xLi! z>u0{}>t}q0;N4ueBJ#mFn%D_MsJi+lY(ZJG#Zm7(4*UYpLYNa|E{tPWr(107LXDA~ zXUEL53oS7&cX54Ih2cMtw_FcU_G!Z#C=d_U)>{$STo@aAh-FEXQ%jr0YviR{)}2tn2!c zSnu^Ejx4Okk$qvxi%};gE;8{wvB?`GN(v@79?Uoqq|tL@-T-vWM1b8O?+IcM=mc)3 z>@fhIQDX0<4}ZJx`ECRS1WyGUUPldqZ`T$7mH|bm9-`mTWaT>>qus=_b0%6#qKAdJmGQpz&0og#eZ2p$3rNa?2S|qNctXJAOb(8bPg_d z-nNQfKLUne>-`3(#2xZ`?Fmhshz7S6NWpCd(w%QBfDhgjG60_}d}qon$JKT^fkC~P95*JMbI@E@_Yb_9LKAr|GIfLIh`vgC~7 z5`U$e4nFG)LQLNze{8(};9;m6Qj)ZUKinEa6_zuGi_g310ArcprUQ%(1UDUEEF0W( zfU&{grUQ)Sf}0M;y_*gu?4fp^sm=s>pzmOqV z@3$uH5ofYJ8r%yo=G_Y*^BeX!#OXePEq^xx?6`#YQhgH2Wf%)?1el~70e1Q~0uXj; z2s^C{yU75%&pYY9cL$`!tpqm|K7sY1l{VCq3GNQaI0M1m0Rv7pxH};03_%U!6dpn> z2@@@ZNwf=-Q4bSk?O7-9_meY>_XMy>CEKezG4SP>}uXkgF?%f!HDSxR@ zN{UkSP>N0|@lZ;fQWBw*1f?WHDM@=D-do|_AaE}|9|Zgd=>~y8c&Y?X&(YId={ z4FNJT+#;3?0otwehR@#>Gq2Pmznd#B?icz|(x;MUHE_-6>j*9(z>B1~gMXlffZQ)g zXHN%ectI0?AA&!J08Q8VH3ZiYppP}j^VyQ_`M3+0cm6zr4@q=09QqKT03`&xzlh+& z2wp&N6~PB3U(_J>6{W%AKH)y8AtBh_dGfZd?EO5^MYr8R@IwfGw7c6n2M0fZ;4dNg zK?I}_CK>355&RVd9p{9OH-CDEuS2EtCh~R2N2Bj%kJq`lGtG?78PI0YLw`l-WKj;EN!DBeqc>bfT@#o8)v>%bV`)u&n?pMUk&zmkop%i8^J zb|TNsQ79ONBYXd{UfYiF-)q~^_riAcqC|SP&cWL=0mUch^@O0l$ZIBqFNQ^w+b|g#D?swLna3XD80)x;)4jLTT)o+6 zuHy0VS=HB3lFNF3xAl~~G1fD8`@65B3M}qV+zYBuBZnN=Wq;3sU8RsluI#esz#gGc zlr)#J=fEDLkWQ}bvgg1ar%=L9cy8;fZT;B|(m?+>w9;7mW>E<*e71tEPX zV zc1ZT+P1`Q$R!UvzZEkdt?e=Gkjfz&hINRhGHzwLt*KKK>2+ZT1b2d&$9q;BtgBaZRK z9f18#vQUlkYij2tYs=vHwBzMD;oOU@?SJQlgY|u(Q{T&OiMV*MUrSII^c#0*36Z^* z*OIC2T7va`X`7Z{Qp_)PUJ4uF+j5&s4bZ?~Q-&1PONsa?RaKmPFU6R)tn#NExvi5y ze$+G0NA5DdlwfEZ-Z9SCXExHElU_8>PX$B&$N@{lsQVzszm84#KL~Ci_=ZHk9DhXg z9)B&Tl)xW{D3e_dzfblzp!+e@$9$g*O8K`Ce7jFq;i$TSI7x<#xo>MK+3RmL>=0J_ zWURVHF@j(1d-O5L7Z-OC@jrxcBIE#&3>*OBMnl=g0l@6l zr&+Jm4EoKl2UmH_N{AX2C||U0y|%>qxr-=YwLZ zq*qP5j27)3Uf0#ou+Y^iW`C{DHDZ2c{}u^reI8d28FH6WHV%2YZd`4y+dPUnV{)L+ zC`HBU;cd>uU5;*_$tq*O zo`wDUxDL5)b|>gIaAyt25SHj%_1125VkkH-hU7zhg72+ZSctU zh>sx{M=;^r2MQ~GV(#&#!H}K&5Ju5}ysz~Rx(BsdA`7}`$;y-A>BS&wYk zc|74kSpazNVLBsGGBF)OiM+6U_blk&D(MR3W&};jZZ#67<9ilEs!H$pn=XK z`qf{-E@Uj&VF0IjoCOU=vx0i1lnhUd&WHpH-PMl^FO)}-tS`_H+~}UFSsaAnJQoLQ zn3hnp@0G;giJbU;)BgofO9KQH000080OfsOSA9el0+*W}0!#tBm*^e>CoSCR);&hy z1USKG3;4w$AjmElh=?HxI0+%(kT*Dx{PIg;NGIVHAczq1fF#bBJRbrdf97(QLjQiC z^qBpHHx%VRDFgo!^m#XZ+MlIFC_-&0W%;d^RsPn>8hvXGeZwdlD$ePR#7455RAs$X zIYr+_!`w)h(;HUV+Q^hMd@j+*Zsf{2K2A3B8)N0MjY7GwF!5`HaX?K5G~3*(*kQ&YrVpEAv7yP5dt*WOGwoW{b#13o6{45fsJ)SGlcqT|*Z?FGX(-`8r` zwNAtK^UqXk>$ZsU)(L96-fC8z%YJIbuDTt^rYp^7?bUkQbuQC!e{$2YUH5WraHQ`F zzT2PE6vb9Bx-_zCSwBys`@L$}uoK%!q3@{Wl%3i(g+WJYVTgoCij*)hA{Ygc6L~Qv z3SwMLh)GctQ({`oh}l<*W$Tt}&r$8nE!UnGd&FL`PwW>5L`mEx4vO2w9paFYe4Rf4E01zO2|eaj%_U8=FxmEpR$Mqg+u>(5E~h-p+Nb?a3X5ON!z? zF3ChCQ{sLu$wnp9;sGw1h)QNe=bMxjReY6r=;d^IRy-`;@v>5$6Yms9>3iPZBfeT3 zdl@zN+I!dbiASQ`9`UGn7a#Ap_tTkohdFNVG4c4zX8C|Pe=bf?J0&hVDNa$@ZQ==W zn#vB^x7&BD9THE9_lWn3r>^SaqIg<7^Rjw{{>pdSw~Mb4&vJ`*4b{9P&WN)?&BH@y zUli{b&jn`}#AUws2gC>I`R*3ai!$B&ZQ^Uihv@r=ctL!azVD&CRm3viZBbOkIV!tX z)P$h#w+maWf6(`RVpW`{@B76Tw^$cz)Zzo;BVt`NURKKwiVe}E^It_H(-NE9)y=8>MPfl&WrPBgnQkZKsM^ z*XA>JvrVm(YLurrXE$q?OXqC&l5ICj?xj}gV%@$(x8Qp$E|xA;oo2ncdi1C)!N0TT z?NZATwo_`Ygm-S2HaczUj9qf+Y`eN)m#S?(-jvT(YTFk&bTfM~YUgz867|nHLe=W+ zQms*Kf457bWw)Dmxzx#(mQ$lfnwP_SHA~Hwpc}QEk}X!lVZgs7F5jqLE}gGlq-#o| zzOrIFcGC^6>+^c;wY6$IC8Z;`U!&S$rUZ&%9`v?sn^Q^|g(Gs7e z$L1d3pnbl&X_t;}RNeDOmk)a7`>0=il(9j`V)cgxEdj^$<0$MSM;_vPh* zfAMUBGH*DZsL?JF!B(S3xY^+1y8FY*H*CC4L)?nmrQAk!bCagmO>YqndB6j1I_e>> zxY5AV^j?hJqTa5Y$9!m2xU0L}LDmT#r%AE`9XU5Az*eo+*{p)u?ACCv#!ZR2vQn+l zU3YEDwKtgOVWec$n|ClA;bv#!oV|O~f8hYjYPU+*#Mf;HZB%MB=XY&9s#dB=R(DH{ z*Une#%?c6IZq0H9qPAOU@KKXwtZU=pV>&i7(wglXV0qW_;90TK#Hv%>JnyH1`q#!d z->YyfkIUlCpaEZf!cplyuXCay(UBNPAX2}cM3O>+{=A+>0!jS!43aF89Fjbee=#Hl zB;!aXkW5mtQ1taDo_fBlKlapPW&O;_XUqCC&put&pL^`7vVQh7Wsg69rmR2t)XB2` z)XDc#y)#Qlo+;C1bo3O?KJgTtc;CshW&QM%lzrwjRetQ*C#Zqvse!Z4KC@7CX6R#N6o^+{iSf67;veD#E{evPlb*H=&a>ic~4w6C7>)n|S6d0+j& z>qYc;3duAQH1_%|k~t*vNcJGvi)0^?{YVZVDIvKH$w4HyBe?^~Aw2(`&VA^acKorj zcKmVroS;WOaUYWVDMwFo{3LQG??>_g7147Ye*#5Mpy)JemFb|2T=@a#e?e-ltS_O7 zB{Z=_O)Q~_B{Z>g8b`QjsqCvX&`+b{(^OG^8kL@=O4`$Oi>K)p+S8}$;Dcw&+L;sd zdBWG~JoVeO3&t7cHN`oLht+*;@$J4^ z_thE~aB}UTbDera+b=AnYUhR1S-n?O-RiyJ znzDJ>w~j##sP>4uiz;agUS+KVu!A&BT%W*Cr7L=EMNt}4yKeMj!%6{ts*Ix#m5ILk z6Za{vsO>xZu27&Ye)0qz(O6W9o+*@$`ikm&h}QKty!F@fI{^8FL{Oh*`@nQc_r)>13_v~orLdiBCA)z+!@tfvWM zoz8K65(2u0XKb50N}JAj#+WjvbQ9D@f?G(45herIvU`Z9R7K#Z9~B4$sii zfAXRBGW2P-`bfRz@F8)eboauM5>=qN(rJp)p*GKn*RRvRt@{TWi^v@s|JUAg-;vTG z(SNmIO=ThNU~0?Nr%+n1fcfFpw$u}Lchkz-wye=|0&sYu#29v%z-ZV5gEuJ5fa(EnaF6ZSDb=NlN_(aRUtJ|szVwP8c8n5(F^oc zCJBQi9Iea5vqCIj!C2b5Z8^S{Ez=8Xbs7Su8WOWF)`cxzlgmA?ZO%E2a?1H6IgZzn zT;x${w3@4O@k<6P;U}1*NDj=4)#?c1U!mk%!YQNBc$iv|7MQIA(Rhp&8~SERD5LT$ zS(KN3D*`8C%aA{qdTBuHx_h2@yR=}j0V}j$#Yqw5zF^1^>Jek6QfW)xTB(G?f*H+J zHApz$PRU;mnU? zxLvFE*}eC^eY=@77I7PbU>z48$X=n496a&L^jw(o;*`*@$ikPBxy!N8a798;j|H9}41y z-LjJO*5ZOeZD_S^(~f$wDTs>%`@FH^DS_>n`E?OB(Gpf$td^iOKb~3=*Tv&+9`m+0 zJGVNTmowY)1?1TEl^Ht@V&)g`gmX&*XIJ(w0{r?uUaaDad@`<>FD_s%t(5(&z0D<$ zSh6w^oVBMWAzC-wdb6J#n*}B>Uy3_+>3T}qcVVT?SESR)7`w1cy;QSn=!zSlLv>E$%FE=YMPC1qPgr{Hq zS3^zaDN!Po62U&pbpZa<#nU1BerI6~RM~@FcALU-jIDY2clR#{2HF&$B0+}ib!)I+ z4n|3%ayf_WbdHC^CVk^nB}%jIAMT$Lt$No#i|tQq$aend_!z)xjK}m?ZD`Un@Yj`q zY_PbF!Sf)lNDyfEMJ&#({fVnvTsF=M+Gr4WOW3FwB+=z>uG38v#eCD#iMeUYbYsPD z%j9UYuXe{BP>~J$weyGvjM1HpDwIhnzZdvz-#Iirh0u6DxftqOZTVwrmcFHBdpiUu zD~2$qJa5gxkXlYl`^9BKcCv!tCMj~DqaS-edw963p-{{EO+_KqiXZ<(F*&qgtwpVK zqgdIJyD9H@!*;>uN3)Y>OXo1-m!x4l!YHO!YPJ`B?|F0(`}_+cu;Lr{Gb-&dBV0+N zHK#8tes7TggfJX9O@*)RrjFUUMruleosNL}g2SnHGp3s0-{1=YiGf#8>o@5eQu-t& z7@leB3b(U+9+UF;AMgc(L&MXw0jD-LB;UU=f6(l{8SpJxE|$kU7DRR0RBgU|9(mRO zD8o@EJct~e)0Q*k0@`WfrP@3cUvwZ`2soDOIP4THAMpM3bj6Z268*4`N~mVA-*ll} z4)KeaYaAVECUCWmFMMS6;7JR~`blQQ%r|Zwlk~QgD0DKxfPr?TERrSRZ+7};&3X2-;g&sDH00KesM-#pjfqU6|CHM|2b zAYLe}@`Xnecl`;%;wg!KgSn^#7Q6V)HwXS|>1Oa@b?k5U1(WovYiqUQ49P9y;F#8& zUS*)sUYK%%KTYi84$V0)bbX_~$DA}L3&NoJ`3vu2-ZrT(@mZV3gNH@-kji~&YlV-( zPBpHzNbNH<4(K71XTY;PYy!96iofpLrEk-aZI^XEnI*e>@6-kNpbAPcpugWU-p;g# zfJqayRBcxmv zqQW&J;O|bg*xc!pYM|m9hTJ7gf_(Ki_NW6@ABhhFQ(z1{P@5-^!MxT_BkwAZr;;)V zohPEV4R6Zy6zRtbyo3d1=x3=KYXcu%e?s{UML$zl13SC(F-&| zFbUCo%7_bc>+H~2#9ukVgHU=uG8^!xp@YT4+h*)eDlEWBle#L~A+4@_5F#*#)G_ZF z(D{QqD1cfsGaCnPV+FUR!E4B_f7L_8lu>_+pIIjiz`8_qS}tGW94K6j;~h(JU{4lK zbrq+$6e=_`sPo*mVOLAZ@LZ6-Sc=tV#}Q*qJ z*6)+O+|k2XvE@CzJD?TF?GRA=g}kv{HB<6S7T1FX<>sRiIS< zBW1ZOhv#9Wmp}U@es+UiYKxP>9m^;Af&BRRMvRc#DaPDB9U~(OzwlaXnG$|1F`N&1 zBEpbLCk5_ZceB{Opx>-VM9jD4;vCzrwah@ta@!&quD|#bKMzZoRgM*ugDgb!Uq&6J z^_bFQcyhbr8;H#!KtnUmO#%{k3c_KO%`L2?hvqUDAyWo3>&Ks{=GMqojl5G<@^I^f zmsb?T`|CLZwUG6deTw9gB#PBMK{leD7s}>EM@Qq^aX$Qcdbgr9Elnn zY?#alB9*rf3ts%*zPbf{MU(2%F1tU#nuGR~9Wtp2X@S7Mw1blP`hAkn)Y5k-fpl~N zB2v5qCHL4_x0Dtp;+El9>Mhl zPqnEc#v;F`oYH2Z;^N66G;o&4g&nf0@yJ#%=(|tJ=4-@deluSgzqpy8N=*y}%Fdy5 z5t7yCX`Z$Wljk;CF>pXthNX4;l5}%gBtI-t&RT`&S(2ICXXCo^Jfh^wcNtM7)VgH z(2POtQep5c-3-Bj%<2t~4f&SvuaWJ^nWZr!)GK=d{q-tC+~L0?1$nz;*e zD+TBDu54tlyrQ6Ca(;})1HKMNC2SR1N#vy^7g4mDZ&McnPZFq{$`*|1A-?{$J#YH( zj9eVu=>~?`X(`i`llDMeHN(`xmt|MlLjUgKUz4bw*>n7zhcua8v{sMAooyKz9rN2W{ns3gw=Gq2hRZX`?cXD51RZ#8KW%D?de|8V z^x%dxSaBnfxE>s9kq!k>(aMoeKTiq;p`3cE%MK4@3cP9$>F9wca&68-77^Q7b`VjP zC*M9f+v#HmtZI%rqib0_D&&6965-|cLZB4H!-O5lmM0bRC#%qr@(lBkTFelW;Hnf1 z$^@-i@zxeVn}o_MUkA7$V9l}l{Dw&-qu3qZ<3QD9*V%|Rfn|(LC)mP*Nknag$gMb| zI7TK+%%{$qof`#u>Tu0(REf*xoNA{5^rCd8A{VR|80d?x18>o9So%83BktP*JSG}_ zT0rLJ%Bx~L+iI$utJ`1l{JO#kF&z2&;TTBCPjFD=bxvZvAs7WKUB9&~@AF=tQ+7z7 zwcjFS_yl4gTp*>)x=1{oV_LzKbVj}N#M?&^!ea=xY+n(jli z_KJ~gF;^9w=NJ|kt1SH6_LqTQ8*JFEy~!|d^KiYAq?ij5Sb9Q^ZL;bB-k` z^LP*D{r14Bwqq0pinGG*c=)co(UYcp(*7IEQ9IXQ`90H6vjbT---nL#l76A`CccAC z9X}4t!`UNjaKS|#ZL4*A-6~WjGscNWW5p~*lK5ZWvdy!f1FB7yZD5^Z>4zUG>2+Gy zIyUqm7h%^Z)gl8OC{jjFSHLnC$74}!)zu_L@xR~9A>ZQ^rbA2VOfTej(- z0f$HQ_+zo7`>+O=?>PVq%}#l~VXJl)Y!0%5Z!IF+vL?zfk{M(QV`V?ySd66(T)ueR z=<$H2x_|zPJ0n=YwKQM?DY~bzLI&SIvlxGUDh4}P#K}^u6%M!Lf+X@FP!?h~!X#`O ziDxesF9x#psIE3-EE_qNpz5?B*=TEN87Y)}52&n2(f|6Z7%#NAvo;wHhoE_T__(Hd z0QO}=v5a4o#~1#U{3H?Gnp2!8QNZd|O9>HJRk{g}37yd&ewQN2;{iMDu_3=9w$9P< zu0yKT;FNV>67*BmCu_$f@n@n>R*Dl|0$GCLwF#TWa2o{UdCVlq-;05Oq1BT&6MZAz zDCBwj-9CS|*}Q=^$G|nbJ2on9A2AU* z&D6Ke&S-ovLK{cZnCE1|=!ceuNe^yDT9)eK4!NG+b;1>>TNSK?x8zW7PF@?Kt4lMV z5F@r0BHI2>jOalha19G~WUzEyQ2{MLERU$_FO`~GZW*|M_3nHcORX!7W?&`sr{87wV;r|T`g-O z#!^YfFMeAhiCa6ewBUf7H>Yc8(_|DxURLCt`q|tA(&vfWVc0IXUp3Qve}hAXWaV$8 zZQp-9)JE5Gjf2!D%<+#nLy;uX?ba`X%ylZjHR~i{0?4?Iuvd4mH2|n?XLB5JB3jt2 zaWMHEuFJ;R*{wePeDfUAx^jB*$to?)d9<~&ssA@NgoFMuTqjy%)@+m6%fY!di zS;m=rSg<$e@Ov3of_0 zv5o(fP1Mw(P06^Y2CoNFYMI=1#z1*gb>Rf9qF!(aL3iG382<#F#Ez}UIK!w!U@VU9 z>4%-h)Sz}fF>0uY^PkFWMODHvXLd+fmlnofl~rLlEMAhMk#HnGEcsU zPBpb=iEx%H6R8nse)3(MTsgAicz|4QTaWrQCAR3Ll)KGH@>&4KC1KWmdhqp$T1Xd+KzKnb#y9yeYMn@T&sa^(E|^p7@FXzO-WW;nA>Oz`skO$Xuuc+7H(zwb zlqbpKi<~8|3p@|-w>&~8h?Bb`Ar-l#jU6@2p#P%ujO_tFMjL)s2E|VUH6yWMXJaK$ z@g(#hc3;^fVRPE@Z?i~Hk}kw0zw24D5Vcin(J%iJGDi2DNc(2LiFaQhMozPd{*+wK zxU|kf_Yt=PFGSxW+qAGfHCCyD*MQmv2eVz?d@ipf&=kcA8*1v98?A~?OV%5j6uTb*chq3RXIAz=IE0rit5>!G}}2m50=q5x$-J;a`f*{OHzjvddCMbtH&N7N}h#d?>1}d7)hzhaum-KNp zmr87^ksyE&$UXw0W-)2{BGg@OVd${9M8}C{>m+?=u4%oW)>lo-8#ajqBW1nbA?`*m z`NSO9_2if_Au0-_JXmUj&Ac0yR7jaH3|)f=k8A zp+@@Fq5&eesE)xx_JHw$yAAp?`2B%uTpTjFoYYrcE!EkyzNd&XTE1=|`@V*oBm^UV zQb-)XR*jt^Mx;=KqQkXRL!F4=aFu$uah0?#Fz0s@^|H0hN}hbXhC$hrh|3ytyX6jp zI1{2vN>47>k!ZtGPpXO#fE?(I{OpRh?!En4Z)dO5i`bK_(nq zxX*>%Jg2>q!MKQrAhtReD1aLUBdlzjT>STX5w>lsRvZ};!X{(md$YFPKEJwbYLi10xaRh$MSlaR+iDe8_p) zVG>MiJSzpc%+cuRZr25cFvrW^V8(SzAWs_*6zmFoP06HL{C$mUwT#HO4h#y*4@h;W zguz1R&a6YwQApkL!EP+zVH=jwy^<`bI`0%J>%#Tz46DKLr0UMQ=S#|K?|~?g z(S>Ya{47?HH)_qkzxt7_A+#wwVN@g+Z1LT9a_6IaOef(-P2ul)CR2}5^@MxwuygL_ zadzr*GcW2nI5{2}laRI9HK5>OJo2$lk_i?}m5@(ep0~RymVkI=oCn17(C>_sQ;*Zi z_Si7{QI&&~ffKMh1Sb34&tU)l+ThgNMGk*w7R*nhNlu}@Kb-UyoM)3VXh8co7y4mNWTLD0 zDQJNQ1FBX4>dG`Zle|tF4tUye^|uF@rDKGq_@}*}lDxK(m)=G^+WBJsL&;Vl7b=Ag z&>b*#I@*h?&GJ{Mp+?69j^MZYj{M=A7QD+kGKD9b2@9c}yZ97c$uOMDg3eMS@cD^x zqr-fBNly=J=Eph`d%!S0=jC6Iddmr6Yhg%@SXEY%GUU`q*k;cm*Lyu2vw|g3Stu=9 zv>3U=2Gw|f9KuaBN37vqin@SoB`B(^vMCCi z#_?W}Y#ghQ1b&TobW~&IY8*QG^Lbl|{sy3)qZT)+$&r?eG{9tM342|OZ~-?oUcuoC zkxMHWcPm4Ks=FYmPsoH^iCYt?PXZ)Jw=cfKk6PyG)%C-yr+ zW5NC!GQ$V@U7*nR9bBNqdX>6x%c4Z*+R+I!PTnhH+`BIMAL_pjQlH-vtX!`^P}91y zyyJz;+_!K>Q94BU0uK1GFKcmYq1wb33?`V5Ke&?NdX%i)3Qz#~j<+goB((|ss525X z8D+TMyQOuOqzQ!g5-N=4gXhwAfs>XHi?1pyPLeI(#DFGJ*_^k{>C&uaWg2sN=O?yotHD;*Y_(-e5AS!b=6quW;j!ko?&%QoEI(&nyeHNt`3NjtyL4h3;qPnv$j~FjNE*H4BM!T zlH7!QB%N)J8rHd^DEiDzOD7#7t8k!+i~)FyBP)IImzTOd_ly_IG{rkL0!=;?@l_s8 zp-XUo4a?L*k(B%#=W^x@m9og}uB=DT`J>mjD0j}g7-sDTUkrwA^#hQ^j0a}R#Z zGwN1_SQmq2d=)CS7w4}tmG&V(j(M1q0#9NYH7~Zqxc4zv?_HrIu+6}^`9$N<*MnMreEJd=AcKni@#Cs^KLuSJxmjB~|8og>U= zRr_^pv}5TEePfTRfj2#u(w1IdLB2lk03#XK$w2{hj4WPv_xb4)D zd>}^}Gk9;VyTp+G5r0V>fsy$m>mR26XrI~(IpN_%h6bj*dmRtS?dY*rgt<;BNqq(= z`S}lD{3gYE_1C`=K9v?3N4!_K%<1Mvi1*LuI{sG0VkxH`I{tP%=Gh$KZE$OBs?CpP zqRU-;14(_4p*xVIw<&nId%y$w$zZVsYvj6LOqLk~t?V1Y-;`?-m?&7J3jqcBqvSD_ zO3>;e(FQ5gCn98ZGl068)aOB7TI|*=pA!DNzck%@mJLvWW{{Qz44oLAy;m`R8d2ze z$R+csR*^=Z#f3TLc1a=`poe*v|KvZ|-+v-#o*;BHLzrN)syp+&90R)UR1K`&3+Xy) z`cYa=hc{wzeKVP$80B6V0U)$$uu;MbwlW(3rkh*H!&+3efa zsn-(NXEMhuQ+kjH5yfQ|;?EAb#bZZ`597Ew2@F>ZvDWi_dcXPO9QAuUs6eB0Q^8JNEO8A86QES zGZ)Sw?pcp4G&^epX@!B~ikEGTRa8oGKP05_J|SfyrYAJ(s)NRcDQEKeUOdE zHBlAg_p}0@z|Bfy)A5 zPu;p$q!aCxIZwXiO{*>(f7iM^1PHs}N(DqqS9j)fOQxyfF31Ev+nkk?xDzu0vq^-v zOh08PF6r);;l29ae;`Um^MpI4mrN5Pc|*(%7z}&uwtmzDnSc#KQG?_U9zFU;pj|%@ z<6}C!Pbe#T!o|9u#3uH=y1#>L+LH@XiPb+1$r<_hQwMt#8a1HThmD3yGDV-Sf9`Db zHTNB@pI?E@KRc3NNf(pgNG24lPf|68n-RYfD0jVt#|Jmo>2Mg*P+Ey-`})^TJhG%jOC(_gb4#xI z1-c=A%p0#peOj-&!|6yV!t0{qj9(s$H2<$2wK?#dI?{WetT{Y?jV8Ux$DG9VFv9>==V3g^S$o zzeP(>Bs(2W^!<3MHt6nRq9lL>8|vi@qQk2v+PV~~ir=LW^gr+%@v!nXneT)@K*BM; z(~N(X`ov9`CVn9y7mPlrCfnu81cH*w#AdwcO8H-$z1xukp zFRytIc~NOx2X;9M?NQ;RZM2(E`67;Hg4+K06iCR8g#00R*%niMZrBVdaaSu(kvAKsiaIJ15gp1#n|=2zYdb z2ebdw{CFS5*4|&IBV%hr<+d^Gp4cz4hQ_0>HPrMC(n{WWhF?gB2uVmM5k<-dHLn66 zH48q)kPO7?(8id!5(@PAjIwh8Bl+&mu`w9AlA-T18r$;sZt>DwP3LSg1fC8jMZ)j$ z_YWkxRdJobFqt_gVl6rcf1vMRF^?NFZeN>qUm)c#gKS_qao}xk2%6fI(fj)^RTzt} z4L|tTPY7}b67G{DLX9XMRa4W^X{3swUb}%5C89j=5b-16%)!gkk_Ws@)sRvcDCXVZ zD*S=&1aYN{NOxn`U}&IDW-r544V+Dv*w^e^_|F(>=yrZaQE&1A20%?CP!KZ$l3ke6 zFiKs9x$l3eAp_Wh5RA+0`c1L|;N0)3_Yh17rtlo}pTi-a>HSv(>4a=~#UNmZ-I#Jt z>C5QepHkEwzd>N0zgP5?ZlJKyN#e;04HF?OKl*?0*j?}Ig`iX*Bp^BbH0%gJ>x3MF zoA)0GPNqWAdZ}Lul~eSaWn6_Cy0mgPeuMoh3M4)>P%w5(%vi4!be-0sAnTZw}g zt(nlB9TCy0Awfjm4f+LPZk@Gn? z>yWL#L~`OG}qQ@pL2_! zzHipKf&V}y$Q8SF+C(GZ(;YKo@+^K;Pn!-rf2 z4E{EymS^=o#t!&RCBS^`^-1azEa7i>FlYQbYJ!2pEv=Lv28;v83p;st>;Y%oyG017 z?#lf~CQ553^|R9DoC`_7>sf}HgMp?9#cq*b!eFAHZLqGG^e2%7D!t_lyu`1FqsGcs zzqu_0RrDkRPc1|3YYD?hNY_#_PPEc&241anTt*o#)@2~H+huQY)g%?DxBwzlK3}~( z7f}%f;~-UG8Fa{fL3C?Al%bjQsjqM)NXR{oQCvp)M!=f&jAtlsyJNQn6U`}9s0odI zA$K(VxA2>%O+)GIZIzXeSu%;Omi{jEA<|7H(XBz=Kg#ICcUANEa(Bx%AU$#9om1X%(ADr|ecLQK&Js||5N zD?-`Jh*XIBV?Zit&TkSS3e!zk4G+ciG!tFH*kNx-1hycJ=Wlibg$_THu8;5UF6!gg zze->H;~>t-cNl1jRVZKu2-ABRD4!cBrfgtKyc?!30RedRH@malMvfdHw11cm#(pSY?xe>RN$MwpD%8J~r zo5`4|13HB3#VgA>zbMS2eJ>&!`(Wps77}k%8n{eDFhqOC!7a0$?`Yo01qtO*w${gH zwEhBhTbThG(}+CWuwttDXV<1G@jcD@9P8OGe}1_~qf8=l&3pgyg7>08kr_ixQn}Q2 zo3nLHR`Za;Iy?^y!7|EG}O>rpls+=`ME=o{XA|Bp#>$1-ZJX9 zw}<&^`J1usN^*e^`#Z7Yy>KtYFyvooBrEjPaa8~kp|%+>1mrtYd&Rkm81rtZ=`nee zU1m>dp&4GiL`}TeAFq8DWliATnS|wnwX(j6 z=efA$f~~S2_dFmPkTzc;$4Bye!%1+umr3vfDJ@OT6M#*GJ{03mrVQ=aXW54%IK`Np z{T$7tO{INPzOgLwt^^*rUAbj`L0=@S%O)zWkkfi16a@)r{OCa4|5TWN1UWXWyJtf1 zKlur=Ww}7*L!wsjJ!@CMD)ZezhqpKknR;e@lZ8f3)x^Rfy&SrB^r>J5|7|@Yl(1*` zwOB=NqxbpyYoI`eqBs0wf75he1=e!T;9)^uP-=Ov8*R^Je1_!4%@oKIapx>-|V6(^_mSxQZUJ3Vz zxpS;2{cCMQI-`Qib3ZvCpy`_!%|WEd>C~J>tiav@d+roL zo?=A7?&IXBi_R0r6~~c!#vP19H>a@s_LbEp*rY+hEn6y3Fj>*LRpC%j_7F1_7&{jA z-CpU%qKvN}cxaG!OU*E?^730P=kS)ZL)$j+R{^6lJYm%Q{YL$kZS#U_nSSiq=~VU> z{_=dbiW1}G*Q|-V{0V(=+@+JkL7>!~r_{o!)6*g6Y*YAQ=(#I%D<@As@!YI+iO@l@ z`99LkXr9-fp2ziZy;H@tVViaqkEaLUy*tb?!FRY6c#JjG#ya6-k+wf&{GHT~cbM7# zWH^ZmxqB1ubI%bOlnbwRjqpt3Clr|KU@xXu*^h@EA4#Wu{sQtOXMkYpY#d1-9!d${ z%5sgV|f9sj=*yy7gY9-(juL&-8TAqIE^E^CQ?Np zQ`GVpbL$#$a{w{f@FvO!%K^5p$4cxO4Qo0Q_Ws)A61s+8s{mCoNc%RCIQof&dYgIV zmEEz&%nm5il-mm-jUfYx;#NdXB_%oplg!XiI?VKGrG(6M)?sS#C~3V3%SscMrmC%k`hOq zFYV0IE7z0*N7jqvp%sNaIjtlamDqavc|1zsuv2RmcS1DDT2S_)m*XkKyqC*&;%!Ri zaZqwIBIFlf4DM7_H4>wzl&`#`TvL&)3=CZTHQw9uBIL;Dh)K1!T_Er~xN^*BceAc{ zhKU)wF}8Gw>n;-~6N0QKeDF$agkX3peD;+}Pg_RJd$1-3z55Sd?CPJ?W=hDR=r%U+ zCUj+K?Nip9vRa+*gxJVzZ%teNT3}!zVn8+l zCgRL&5~)vU+^alPIGWUiuJ=wHKerb&JAYjlg@V-RnXG6lExh=QA58G&h@OOa5ZkPQ z$G`sk60@|M10@wavECpsqJOs|d6eKQ9dQ5duFknacnYCw5KL*Z!d)R@rXD~jzqU@s z#Nw5c)0u6TFDFFvW{kgI7peM85#-mMb${| zsyE09TxQ2{)hMqfj~pc#TUeTfPMf{(s7bDhEf3e-;#K~paYwO3B$mE!x~!@2VG$0H6{-? zr{6DNU~~_TNe@F49j}E1GNw?W!ab&H!~(~SS-;`;S`x!R5Iwq0FwCf)-YEc)T&KF$ zm#UD-!idr8?s1$C$S71i(}^RTB>co6G9ppzz=@3Mgsx;@WgV(W6ofLdB=@-W2yHo6 z8$?=_Z0RsZa!@>ZV38(+jUll1_D8m==-5xC)-0XBQr+kXoRkypCf;m$gK~>2CZ*Cb zwKa7lRT}=$jl&HU;^)FUCJgCKthloShjgOhC=0jN=NEsO8;2KzmERg#@4ikM8 z=VU%9E)67xk(-Y!tScq@k4p17{`yFA?}k6L(Z=ka^Eqv%fXP&;<6v3GEXIp*tp?o4 zS$ys0Idq~wF5n|W<4TKWvBZFMh>eX}E^EYJ2Q`Ks&Po~fvf#1*5~%V@tzhmabm$8o(j#VWyeG|Nsqw}clB8|5XCX11F^b0+HHo08ju@i3EW4NpWG6 z)6j^k&j)Li8j_+sFy-rTWpT~E2D;EgeFC6JNXS3YKLcBxBe|US0S<17 z#RwIL%??|co_AYUzP1b2FVHy#OB}1Yh$6r|8>EpL(Pyk}&|l$u=w@lyT6YrG=9slK zTXGi@BnpGNWtpA>=<;shN>5RgNSu`<%vmDa1x+A8vbn-mN1#X55Eu@cMpM{R`vAYbP`_#+^z0vVZCg;=)PR?2p|NZVZKDMf? zP5JyHOpVcW5NmL}t#Z^_NohmVEc|ps6FrvDcGa_ZBr!muBdOC&sja;Y65pnVP(omq#Ne zChgFc1r^CYps2e+_8ZZ{=}D+j!Z#N9c0B4UNvoT@H*27ah4iWsp&2|&ip-u+k4bM5 z-V*!`sZ76RAFT0mby3u9?L7Y7KIE9rA%Hg1YRJ3xPkfgL$4?SJQz?kf_hUS!j?4GZ5Ab?Ihu@L&jFwd5out-iD*WS#0Hdu=!?Tm}q_*4jIR!lp&Acj23 zxXGK(cn`=SCSB3VFVG55rUO;pGMnH@3<(7{g7RMJv+FRf*aPu^dK-cj&~6DuMGvsF z6m9F|P2niILJ&O+Ga5SOTJ%8F`*kUeqeS?0(jf(ujmC292-52Y&!Z6*!XbA9 z2mlUJl8#0;TE;AiTErk3#@{48fKIdLoU4;R9LOYgHu_~JBra}o$yYbUfD6h|6?ERw zaE3ac#T3eKXPG%r|J6>4T|E|YR1RRc2O+)G?-*2NNJ>9I9itmP$JNREj>#)$d*nm{ zF+H+}Qoy_(8|f=Sbd!bIwO$(*H|Y{_Ie(#! zk{C~@)aIAus74o?Wb3#QMpp-_)MYNJ;~gqgClY}LFUg<*@LDb{)n}pI{=W?fEsenO z?zNX&J-sL*&BX1#oL%*cJ)yS>5QLpdyiurD2fBVQ96w{dx3haUckiFx*-f|Ax74l= zQJHHn?YO$^aejmD56xu~XW6vEn!xNf&D`I(e`zA%mfc{U>gH*%KC6+Eo0Z)!!T9T= z#EAn?{P&}{m{J{jJU)*N{?`*xK|r8EoW7c3y>DCu78nSKA#|$nCjh6J+6+Jk_Fo6r zv;@S${|Am;0j_}mfSx-*>mO+L1hD+`Irjl*{sUtE02A>4e9D3W0snmH!T=8cKz0Ox z`5%~x0+jv(Ua^300EGXNR}dTbu>wFq3{tz_0JzN~aRAAG9w>xfrnY&$+q^K=W^Cy%u2nZ%D8Kfby>_l@@^aKg)C*AQ6E0 zU+#ec^Saru+#Happcep~)C(9G=;rv&FM`tl65ICxI{pE=en2(Ef0oS=K*c{x)Hp!r zU(n-e0OmjNcOC%#4?wH{a{u`huK~*bS(LW{DF5DWdH}HcXPG_$kpBY@fBx?Y_+J5# z!T#06@_RaT>Z>Lp$W$f&ubSWyVc?tlZviX+f@VJec>bN=>N8;VpQYgq0Q?8oKLJ8; z|5fP@16KOahXetP_5g5vUznK*pN*gK=UtbTHuTLtKBoB-&aZbbqm99oh|hB+KY zvNn4U8Hg2Y6qpc)Za<7DBP_!eo1GNe;0S0h#cK;mToLV@q1_1ZT|oNiqwWv~Vt~|d2ywRrmk4gZVTkD~bwt`KV8%wf9CXU?huIa#Dx^+By&QgHLzwSt zz6PD_iM|FAD1jKWbV^<_lz%4t6q?>izs43Q!MYalzy}tlUaNQj3}$&M;1rE>V3m+_`VeSD zl%ECc=P+$y6!$qUdSb7^-Xrw;ZFX@sicph+iS`ID`nwz<$6Z07T%p5QfWa6%fn+?P zK$G<8Jv=WshY+IuX;;9vJ{RbF#4VWVea3sjEjWuCFsr-}(Z#sNYh7#somLsD`e#k8 z2Q^9`oXKjeNS32JGj<7Bal$)P0VjMPp0qWXK@=kq*E2i8Pnib5Fg&IGv zvjyD}%0;Ub)oS|#Zu-L*zUi0Mu^hY=1>fl-@(1*D1BMZX7O~i?=Gcpky7Nare#hC$ zTZOV8whOL^A{UEpIO`L~8Ukfrx4@c~do{htuFdgE{ib?CXYRdk=elpQtq`6%nFaCv z`4G$dYm~4GhMKnPiMVVr2{Jc^_2gO!bnl7BMOr-Cb97%f9d!J3 zopio*A9T%HkXrWj@OALD6E%FMqc!mL8%8)rt>Y|X&Ognf&9ck_%@WKa4}k*XY~x@l zl63WSKedmv>geF;xKqR_ym1KfL+#g4TSWRTrJj+QFG3GM_KKZVc5-A{i0vCE$h89o z%5D>@-^pJBq$ar&$%Szp+GLy|ovd+W6QG!#eb-a*MS?Rd5~RXgVpvBh#RTTd3zMwm zZ(*6YYi$+h;A;IhDYZjejDe~Td4+hW^4%ycV-^V>Qa(;+lo(z>;k2#g>D1wXzrvv zjm0zk4%MwlrEuxnbwcma2JljPQwwYJ3T9abf)Rv2;nF;!=@dkVOBy^49)Wi|d@ zwB7MCpS;ajtSEvi?+VCWWK&2ep5$a;K${+I%&`1B@>lQ^iXwaW?~VQ2w6`7qZVp~O z@c+AMxnF~c7)JyFStA7j;r^10{Zd;tu{2GMo&v*3^+tig1$OF8JK#yXnI|TRDc22U zI(4unBFw$@ug;oET$W#+RpEk1IhuO?(biQV_r|g(wp^%Ap;9GpZa=Jrctut8Cmx~f z)pt$~1nE6e+++W??TiSJ>msFCWo?g=mm?!z(W|QRdgy%WdOB+yyB$k*L&yc*@jhw_ zRxN%OJXTJV0{wsi2I+go)+=2NV4 zJexe*Z1KV_`jc6&?lQEQq6`)%^3OeIJ$5^<=hXKv7MD`>+ZLOa&J&B{le6gXH9P%U zFXeUG-MTe32I~`TE`_arI~U9o5sa+&ceOsGe{$>$0U>tQTUIi_(wAaVIUYeD4LTYk zyuqFzHZofnGeTTPJ4|%UUuYTa(wnqj%2OCJ)mFxY!cZu)P zE0j7rjbNvzDi3+9sIj_(=vmDEFz4j;xG<1vQm!wS?jXL>|1>!`z5?+b>DT6KNxd6; za8-Yw0%*34Gj|)l_GZ1=66O?(~GVUgogfOvM6k&*50`0R)=xhdkOrp_x7WbRDQbXW+Gjjib~!YGyo@G$nL zuS{`}LAuumyZl?{+0$7B^Y)VS$@n)>zN>L#BEm+={ym&DCaRx5i&?rr$0`NzzpuTR z0Bd>$;}k2Zf6{Kt_&QoK=lPq^K~ucdhXeq5076}SC%*#3X;$%)wzY&cYQ(i)k|2d0 zdyky=o#DaDjjVvGlejPbc(q0gt*)Jdt^`8Rk8M=f~y*MaPPHxA$A5-tQKrSPr zp}kqRYuElRgi&2WDh}HJ@uo z{Q$WEz7Y|Uor8-_NpFLRpG?Nc*kNj>yiYvMiEsf=+gz8VD7~S<12`~=xdhH;YvzYz$FLGY#gB+R?Ot-EtCGr-+V*Qp0pnh3moMD( zFXSC82jl9vB);^#%r`5cni)@<--@kh;o}UX&}W&BSSwF;rIwU9Nl++OvlX5e{ceu{ zWc~+IwQTKQ#H4p8B0C0MPBS;*rolZKMsXka`tHY59i(Wn8RHj9^U?M5@>f&iIj0=B z7Hq#5&}*eP&!^xLAeqCqfNJ4)zE`{JrJSP8%c{0es~S(2$ENx+kk>F&3L@xo&;ykh zlZfe@FEdnu6KT#Fb`Ex*w%(tBvb1fBtNEUt4~%#Is_@U(Z}jIgkX+gV&<&5rXYzw>Li?9dho10+T3y5eL@TI#_sL z(SwuhJ4v7dZ1O`_He-(2O-8;W4^g>gbzEL{_(}XgV?~ctcz|kmC;Bt>f4KU_#!8@N z+1R#i+qN;m#J25Z$95*RZQHhO+nDgqxnJ%(?>}^{Rb5@(Rn20K1`K6RTBLmBBXO#l zUJ#kb@TnyG`MG~$T33~{6xU?P&C;pXjvzl2J!Xt988OeKLiV`yTZhUT8#a+|zrC+V z1f|;34h2wBK&1Ffe*_sd@kk6JaY5(!&#@S!oXSi{li|hU*pZA=xtN72!AbPmP?-j_ zNKAy7}y6YNP&@vlL3kW6mjm61}Snrg|96v zklqF|3>r#LBQPXQxC9<3xI&R2GGxhIeMQ&Kk6Fve??|uRf0ta*Vh38fNQISn@8AxtB!7sXlaIt3aih=*O8!5 zW+kK{zj|3)gqR>2?9pwBbFHMGVXx z!Nn>EVrLA6V@wc%0!vtkh4&9AhYJb&8(q#Tn}C|Yc@PGWNKu7E-o+MxSc+7K#5zTW z&*NbvfdPk1konu=RSMGr=Y;+ur#{yeQW5ua1QWt`Yxo9Jc~dX z?tkSWGiJ2mfz99)22+eh^o=5?fTc6dXC12tjE~7IB@zWcCWn`{hsjTVEMMmz#^;DDJi6Mi8}4MBaD+SpkHkF}3LjtS-}gg{#9`|YYt&nyPo5% zj_YQbR^zqpNcoNHeW=CZ-NICZ&k%cgyE^kvkA3B|;Md3Foa;RDB4k8^ zRGVDVe~!j{9C_Y=y{!fCFJc*+==JIaH652XwIunp`KSYWTzVcB(tm&QzN?SOwwq@h zn$6-eepbFB3Ndq4t0UIxR0(FcpJ+5Fp4D%y04Mw z?jJWr0(6w}?!N#WmYb!d+)Sgz^b}DqmbFzA(w9;KEhWG6jxSmR_!^Q<9OoG+tuf8b zgU-*Vi@sRb1zWZYurSUy%CM|}nkgo|eW$qaULejRc~vGP_`llhVKG^gR)(cli=e}g zO~wVPVahAVjkxJ(qHeyvmEbaKCo;-p(l%?`M!CIj_IJr>!*3 zKvnQ=ce?;wbbe~YgW84WN$M%j5Pg|3I(@!ZB6Hfqt=IG`f_E!jC9N;dM!wUXTKdmB zl>o%A+x%P5=(ZExSB08xH>55{VwqKa*fR=0`cIDR&)(X0e*#iA`7iOpH|1me6-E4G zbOsbn%SfC{>W2j^-_AsIj#YfNMOW+M6q+5dv zkt~3dRF?-+>vK)sR&8)B&45Wn!^3B zSuodh+%^q*S6vl(-itimY zHC|a*#C~YFHe{Iga;1D>hmQYBNzV@rcHho=-7@W<{;u!*EbsI=V0c1V*}QF6Ayaz=x1)yJ>uXM^D-Uwu zv*f47=K<*xW=9Li+U@{{An1O$aR|!mEp?W6L~2s70VV43X$)B(Kne^~{szz&I3>D2 zt^F9z>2bH?9qN%3c8jE+os;D36Ptt|t6yMuSs3-yb-65Hp0XS>A!FLnhM*r_&ZeH5 zriZtX;0ADP<7sJrOSk!=3p|(D#T4IhO zo^G2m(wsUH+xUe`IbD&3e$Qp@#^Lv6MMCGj%}TO7kc^J#p8c~^w;8AYt*>R4?~tBx zFXL8;33xUx7t^9! zXmn#HfNMjFa-n$Wq5Ckab*H0{(3-D=s~dR<^-XDHbpY7BTc#sP79(7cy( z%N#)Sj!9qxHYYt^3;=O4p@Y%*Pz-BSzHA-2JBm28Yyu*!N-{Mry^h>-f^EA-I%3h^qbS?pJ{m-v$Wu;>#_lGy3OH03=NjGsW76|0_>sy! z@P4CrLISHC3Wf=jaRbugyHs@xbUm&QR;OkAI(VA_zcV)6@ykdZ8w|i}qvu?S6!Lyb z5S-np+Lk0bc`o8pM?+|^Yo&{mW7W+SN`R&&Tw9etB+BI6b?Wd-k*YeCT3I}poBWmE zP|tZC9$)*55+e~Q@Qj|5=_-+AVUx$MNmu=-Y_AbB(+fLM>Gdst^miWpUsd#2MZyd$;G$jo78GjyF zid6vzG!YzY=d<|jkNOYkq{Q(hlcVRML$_~hVLs}o+bwpybXuDQO{X?^72`42#Bx~} z8}1oz;`kTKr;=wy$th7P7fNz=b_DzG)=E#*rI~9#sjB#X-3+(5UDH#YA)91Ft#`fu zjagshK7rJ47Eob;9WEylMQY`;6+O8yE)lhtW)miDI2mt*sW?^S3VpojJduT7M)~XZj_x)j zAok_%6{4?w#cW?t(o*Fq`49PegPiCc98(F;txLUm(n14>4EohF-*1UUC*wUQXIKj8 zak?IJfHz9^wS_VlWnG{d4I4!FY3FWz9MW@M`43eJA}p6PV3)%ve8x|7EIs|^oiQUV z+4*>QybSp}X-)&F`3~ij78k{4()F|%SoR(Z{?L82;Wbg4ufjl}NC_V(rx9I{3y4cc zy*sCYHHiX1H~e5xVb?*Tqi+`yH_r(S^c!81qV2yXcOydE!jh5sC|=CIEWr34*X zcJ=yQgC~%gXN=?4s);ck=*nsWI#yhHTPp92BIt7LZFifMAP!w0&0XJL+-?Ra8q za}6tM)vd3A*-Z5@UUz$MOAFN*K~d(g)s^QKV%U`p;FDopcom~TDk(HI>v`(xYF>4M zWZdm_v$++9>L-Qrf|9Xoh9wG#9(;am*yiUd915?wa=*Mhgebk&j~wD=5GcGG+3sm| zR0#n#h(e)uPff1;C4y}|-!>r-vL46Pd){vl96U}P?;=68yOu~*doTuN+LH$0DYoYH zqAk#y^WeWEyb>gwkO`JWwUR@|u8A zk7Aad%YcYAO>r14S_=8TnJX|V)RUt$Wd=a9OL1C!N@)lcG<#W!h{SYyV|{UnXU8r} zkC73DH^X|YGt`PNQ+E1r04y&Y0LXK8=hHQ9MQ2V~#M53Z9IJXl#~~7 zJ#fP7+y37voa)f!c4+1k@Kr3p%~;pvS%~gOgu&kSvz_p*{q9Ya-ePl1t*MwB-Vk7J zm=_N#6Y8+5$gQG!XZX!ke&|^q_n%UUHL0jWJ|D{aHy!o$oA!nmS!>?SBg;PgGY8Q( zs+9ZI-E`G)ejS6HAM;Q{-p&^BdPV`%>krWv)>u77Wi2lGr*FGGklIncRzY=m7BI-kobPy5Zfw?ZUD2dkWzcAnZX=*q@H0Vrrsn699*SRNy%s<7QsKHvhCA?Cpyk5!l2-)9 z&IZEvX9%2Ud-}j_{qXg=wEMBct9|Ia3~F9xZ|T|S9k#2fK|J%qEc=Z!JFyN}xl?Na z=^BWQww%x$3KJ!$Y;F}|jjVPaKIq$A%Gd~y$Y&NHV)Y3>U3;S6PSvM&F}NgkuIVrs^Tvg?FbE2J1`wPlMMMm-Z;K5?IRgM`zIsyGdZ z4vFL&oXky66$CG8U*9a2Ks|@G<^B}z6!gt5YFw%BbfaYjTpoO{@?ZnB3**K+&tq7N zvBZ=U$!Q`3y)6-r#y|SKCEK*wG}XQ|QnyUopeWVVrcD@V6&b_Xq!zMPs?}PK&gZg71Xcu^Nx#Bw z*r@krWIWH#pG#Ei z`(FyTMYX~ZH2C@4!1DQFXMZ2Iera_}1z7Ey`v$&@5vOmmf?PDmEn9C({EOycCC$Tp zkU9hHP*|IqkS04X@<*eYRl>348QfTO0?Ja4&07!ucg+ip&sY~Asl%*vG)O!ZIctFA zb^D5h$p(a}hyx!|Pk*__3jvPnN1(@oCC8XOy&DfqPW&`lb7_gj+ICk^_E2Dv*vPW{ zrH(4MkAU*Fyrzsljf9jmOh z#?}XRvT4@id?3paBXU>-7CkpGGmd4)*&l-89g?eB!?Y{HFd&hI*_oiMe0o2R|M#xU zW9T%>UjWVWc!zi5yC?OV7Ze-nKMn?oeM-JmLOxJ^;Kft`A1DJrC_!*3=pW^0d`d(( zHz$YzQ}&s5ILWjRZCZpz;sb=}Klb86eFf=x8X)+B=U#~Zd(c3JPZYssq^=AW-GgC$ z6FuwAM{6uhrq@QpKR)PB@C|NaKov$<4>_#sPE;QFjRdT(iC0(}J7*Ynh8@H9An9y7a0HvU?a`H&sC|?o^KzOE1I@)bT}>}tOl1)=y@w;RZ+o_S*WpkYh8erZc8? z2bn$k0{PKe*WlK+%V&G-Af}l_grR1G*l591_fZ+p>4E{nOiQ?YK1$D!I^i-(*g5EM zoGRVOFVzD|a{`z&a?U9T2JD2IF`2k{Y-91E#dK_nk4$QYBaJ;p+_|@yYBK{Op%qAK z`gc@ZY@$IR#ft%2t;Ua2VYy#KmKn8Sw9ZkLQRb%ru%I=sHm=r|rk4f3nxnvZfnm*J%dOwF^t;@l|Lm4kV3B#UsuM77XzIPY(CI^!GdYA z;tDumU^rr_**cDccxggG?g749wt45$v^+2R(TU8motP_`o5&q3nVaj^YN5=ubH&r= zFELi0fPZU;Y*Y<;qTOKAjU?gLsa&l^s-2^J^<1M!Q_KS3HYAh#6YT(|%6l@OJPR3F9usk~g4R zgH3liecy`t9&0Zw`Fk{S4e!Gdw3tjYwij%_i>tPcO?&xm&`;QRXn1DQsr5%g_O=+e z`&a;EcX~M|+sCHLz}D{g(qGh{NO>C2dj6y+g%Nd#w`gAq>dZS`rWf4+v*41m{bJJ1 zu~{PC;nX?czcGAn!mv3$e}6Q3z)y~x(IcXtI~C+%)H*}Ont2%(x@4_T=$CS6#4Bz0dE; zwrYYhLD+!EC$xXZl-5AQQ!r9=uO{)!B(f>GCW>)Z$2SitVMGG9zCClJwEeX(aI4diu^CqJ?ja(dP3snWw;9`KPL7D+X zjrM-MG}#rpp<{}ANBYc;u^~8d0&U-S-I44( z^1o_R0U>jble($O$N%(jlkrzSs$l~_x^#O`)HaAItC#{q;qDKKaoP#RgdnXFEDa;q z;x^HF&UEB-8QoKbifSYi_7fo}xQ;nPggjEl^bgKV<8GSMqcL;=_m~8v`P@Mu*=P{? z7PT972K1xWfaQ?6#*=CG(-^*AlX>bWJ2oxIp{T2l*Jw^&p*KwD3Y93HQ#V^U|>5dQ9lbDyp#*6p;Vs2M^ znmCzK9j%rAY(^X}UUd&nczrPCAB~PebdN7=^m?9s(WCO2Mn6brW)0eoj-KBAKgR6; zyn~BCoCK>7KtQR5!l25yP=U4!5Qauck#yP(L|D~_EnzL8$hiD;7d9!Wh$5gE0B|kP zuc(&{m6`76#2(Ji_#+og-j9=OpRQN$-dD3ivqe&euf?BY2jTaWF30w}PY{A+kwNHE zXz06X6dohsLMrVD_6E?=F}H(2n>ZTb;iv2(o(gaR@`27W=hwu@i8|sdL+7>u+OBu@ z5BPodn{JXV(d%|sg;~qGiF4-#Km{NSgU@z;;rmJ``fi#Ozd5Z*NT0_TpAx2Nd3Kmc zT`Na^<-QX|tC?_=I&QH)X_UTFNBO{lZXpNiqh88mU8#@@*=oo7LJA=`=h=aqlb|Ra zt(!By4nv7AR3hHr357`kG^(-hM12pg@2hvQ?|8-^0^JVJM?8o||Cpc_5TtqtzvCkg z61Upd-Q3X9#B!l5!bezx2|1u&@zpN)EnS89c_Vi%`Q?{2@;)`{$GA|o$V9Ku9Ivc6 zs(As5M}pr+)@bqj43+qoV4P9;XVvW~%OZ)w7uB&J3gX`K%hcE@&WZ}pO*#MK=w;1M zKP>j}c}}nM>Hf)y>la}Gfb7Kk`)1}QW?tl+|K~fq+B>sREmxcc2fFTNqrwwx#TU%2 zuuvIfv9W$;)ax%l@+gVs%=_EnAZmCW zOXPSeq}Hib?IJLYm`=D4QQ;>Ma)KQ22sd4uqxQCS+_Ek*wXb_606(Sx+QzM5quXX_ zJS3j0q!CW_O?wA|pcyi$Z}-a1_U5Srka6DeGE>LfQn!O>U z!An007MENGMk_uZU}b)WVWQE$^RF6KSC&?0#H;HV&vVCfrE;A{s(-7!UGNj1x?K3H zGUCl`;vGx$w|&IuYW(B@^3#rmPGCyP*$-Y5#wMetZGB*EeGoH%smCU@oj=xoGqvWm zj*)-R@-`Tv^Q^ZaSiU(gD@b&~a!;|SZAc|75STe`7?E28>{DVVk~DfprUD&;-~M$e zw|?$;lwFI*LPu^WrH6~1rJaZakem3-ST6p0-JlGkK{Ev!E+-Mgo!6gLPcNuxkcKma z&3y+yd4x%bsb?fX>9R+9j{Agm>@G&*UOnKR*@^Pn|Yt(AgP}3 z`y<`|GHXrI-jE^lZH(%Qao*CT0b7>N67822+uQdbrD+d1WKw+?HCqfRy)}N?5yrCs zwTtU;0o{OK$-8;wFx^#L0YJ?z5_C#{1q0c>!==6hKr#YPq?lNWvlQ0-<>+Hvz`Wqr zxxGd7ZoU)bZSx3}Uem_R|LvloUZcU;o!UChFsv`pSHZSAz&8tbik4iBG13vCc+(_= zRYyL}qr-l}Uz~fORapE9sx3CRKq3JLdHok3%SVMjHW)y)O*Jb%VaULvw-I(Amu$Ck zJBZZ?(AmQt8bq_w+S9G3Sw-%QF%6=^(Z%i7;{@_r3jM&S9ysjh*X$0QsqzBlD2ihh z^jhjg=J1#5nR6Kn#Ta|}eZ+BO9qk3#=s3~jt=!)=!l(pYHSp^rOYXW5&ulqV&u|;d zzVtRw&XKLO6}ZndPIwkVW8dN;G-U+(7L=UYfcOPiYy~59T1cEVB^LD z0GsX!mg#=Wr?Q5X9!GS5gwvb*^iBE13FYVP#SY;8*oLae!{}xv+qOxV@6zr##Pgt< zn5gogasZ3|WeWemtM(-qt5vgKur+jox-}TM{t&xQiIBs+-9E7$VvUIDk21F5evT7A zYkFIU-T`vtjp!oO|4c}-P|#R5Us}xrzyK-o!b;JDQg^PyK9ay9h$%GrE=CFEy9~)6 zqOphhBaN;Sel&{_LF8_4Hl~*05tU>EPa9%dYm}kduU@;qJiWS-QJx+^`q!|^TxwMw zqjfqi5Bkq1Qgdd-t%CswY?v&jSp*Lo%pF#6&r8uQbfGdYJ=)E+@(-w-^gX-v|tWH&nDZ3r_(!h&`giBQqa7T7_!< zHUEP&JL<+l@50RZYdUEy?4BzEb?h(%QHBzGmFRPR05EZ?10$#qa4K*_LSL6N;r58sj*>}D-l-{N z3Ulea{QhcmF4C)}U@%vymUYDgOU!+xh{#bdlnIEA(h;rkc1!?Q1aNV~JC%_sb{>-D z`qPn{!LigJ`5GvJe|+^DwhCUoymm7G*=7kfcup3NZVm#R4Of1Iis~;U&qmh@ ztR8J}5Rl7ukRdO}q&Jc^Qn=yG>ImyMrgC^y7xR}4h|Fqh1%8dBT)Dr~ve$w%8w-kZ zH^||I&S(J|@G0OSEQOY)akY4Po7KuTI9^q~9h4t*ur9118I(vW+*th}ND^c+jI4g6 zoqB3HC^yQKEND-sI|gr6#on-4X$$kDbW*IxLOZOutF?}VlTIiz0Z=>-w|*ci+UN8UGu>yLw*@ zTdDnWpsIj%=wF4F0R`J7sZ@?+lZcw^aE0=VkaHANMtNc2k;7Kw$?7Lo=!s4yY69b{ zXlLD!;8aRajQ1P=A*%}rzgw(uslj7IkEZT2)8lZfYt)gVcfV#ejYyv;JD7FSa{K=X z`salk#ezI4a?MByvC!7lX=-oHWc3Y)w?CpZ>jR92>-&i~aV&lBD_N&m42?SI=>n@H4)c)#x#_-qYLI-Cn=C)#U|c2~A;| zf#@@K;jwFPXA>lD_~1)c5Zw>|`v9JF`SDhi*y;mT_qazjKDpLws+Ved;XOD)fgv3r zh+hUTNJ!I0d9arex8zWia+;OR)bsRD`3Jm_|53oeO|tirfj{;uWHt=SI(gP{!Bra4 znH#yeQSV%~<3Le)me?}>=XPqx6o&>@+bT3#svdnP+Q|m{R!=0$7Vmo>*(iZ?Pb4C_g5;5J2i>aKV;Q8OPN3B4>@U>XUaIBh5^(& zz2Bfc%bG2}Qu&!?uTT8T66zae4MVZYCRNLSffE#FJ*)?DTP{yBxbSabAz%7h&d}=J z&#gCPZ|Z)6<1#UI;T-vmgp!6ZMH+Oci=@jYE?AQd9C0#6^d8bx*N>|>f$8&kKIOnX zE{;J>L|<-imGvDkgv0go)y68rZ3}RrLMoqG?6>%|*s=?$&W5;j!<|gzU?A+Du2>B# z?QrVr=bdTX-ycPKWCV47xZ^RsG)zPIg&z70nlp-=8ut9twSY)m*r(f7l0h!#H_#-U z%7CS!y-b$6!GX4f&Osmn%9AK(ks3oBxul1I&zb>4Eyvp|`IritBdMxQ+7A#f4j&$o z5vyN_4TsQeY3pN^AVw-VvC?MA33qk=i|>5GV1ezC^hu;@M8 zGz=A7c~@zWT6GAcNok$-X*`&<^_4py)GChsX+@4|3&h9_=SmLOm^EMw(Tx+zD1qF| zMIAyseaM7%i;F}dd_Rw}=xXOO0IJN=7k!}l5*cIr>uROq06(a=>#B(fj5ZRhO4n2Q z?jXdL?%w%2;$U-3Oeywp-%qa?d5B^=e-#{5Go@9t5-q7T;XbJ zYps~eoz?zi6qp=oD|n!@xEFOlY7Z0{m}~K@`y*!rUU*iT_A}UVR!iYHVu&nRA1D1B zqq=~TDP^Oq^4M5s&cNkE6^9E_>HPH7srA*%3_Ly!28B0pq{hKWv8|pFQ1I@914+_U z%28o~OZztmWx>R)%cz_!B0+q{i77S2Ycdjfu{?NdEJ1F)3(t(DnxC!nkJ&&di{cV` zV^3fV5pyxfw%yA74D%ljmgOL?*hBv>2X!c{y27u*Tm^y*0IIR|&GnDR7QjMa8l@Vt zsuSU_WI-Y}mJ*`K461hw;1r{D#h^Mf&{BoUzzoDDXe;{_yv#5^fIqc;-Fz5NMVh6v znQFR=&HWNvM@aovD@QIm{ZhCzY5X%=pfB83SEy6Ybpt}#ZKcem!EmGgEubZ>W!eL~ zv58XXNeJ&bE=)44+wbSCh!-zH^o(!-c0NQA!y~Z+aRSSR$}O^3GfTs8?9UDtt(R=A zWp!uSrFrO!_xEY#1`ubJ$K!{Z%}h!2|u63!IR$=g&T6;M-vlg5OcOXvW>P7696CS;Ues=L06 z0pE>AP7!MUgroVU(QEp2ZAG|qy6oUzf|WyL_3)duQfbgrYO9%t`<9puZGG6H0iG6- ztz7K^Cp~uVT=aq|rQQ8c-E@=8!*WUEMdS6e)&jY1MML>tfNS%QMgM*}m4K3LA$4|Xf z1;qh4QK^uZ4>4z{xLphMBTzFLtWmDH&%2iTh3K|Oa&vUpu)Tds_4M|>=A6BIg&TZH zAiNP0hyV(BC&RwjZN6ZjMB!l3)&Y`xQxREHF*-K0HFphKN5=pBMLdr?MmMpbH_^C< z@ylsHBYzRrRJ@{bv{qn}V73QL9R|Y6IWC-9 zED6~-JAA1Y#>=w;9aPNA_jm}3bn2Y8|3&PWIW|oA@nlJ*_Nsxh0AOf-iOPG;M8w38 z0UK6eS&2OAj62Ur{UoL#Q|=PrBk>sa$xa9S5|uz}fu(83@>0fYuVf12SBDZttf_3W2a-hkZZ2R^11^o7M>F!ztv~v1I zA=AtS;)KzKH$l^U9Sa|pxNlkE$)e40Wk1)5(<9S;7h%jfQl+n)zvRFLA+Z^QTd*@{eC|uas=Wyy?+b4u}r@8BU zDGztn32XWuZ+LBK81JU*r{2DnVoPZ7o& z#7g7(9!dq*0Hp@7jvEm8+mGB^W36nadf~CA57ocVm0&O^s}X8H?ClH8&=qN=so|rIP@E7_%jKvkkRW-SYzur2ItC)7 z?^AwF>G@$SV|jB**!k^&p57RdY3I**|9{>w1fc&&p<)LFArk+fNb(=^7)9!V1}F*j zd4v=rvVk?ac!X^}6%LoUy+p#+OM?czBnrCKZ{qeAy0Oxy4EH)k@l<+EP<+5!c6X?t zuE;luKHP4P;QH_0`ao0#a_PHEsSXDe^L+}2;da{YkX*1oLJp`-w<+HuZL>kUP>6l$ zl7!oFY?hAiu`YwNSg&1|O9ZoW>L1C-zuYbHyF<$7By_8J+w%I)b~MWyJ|}tG-QB&c zz~h6R61lP{7~E0fIwNKaPiz1gV0=xKEmnw!CcDZa8&k2XbeI&Z1#}v~Ck?8%n%ssw zm`Yg8$lTiM#?%iZqK&eKW;S$@a=Ofylj~qCD%5k`Zm8Gzp$ig6UQ1Jsc=fllvIwLc zTzogVSDAnl6>C3FF1)Op%vqC?=Wu*`(eI3M8(@efy)jd>+WV=4MSOs*s|t&)4EWTP z|20zQYYz}R1ACo$0aI9&juB0IllJ5U9j$XO!#;>fqxF~3zs@-BKqK-XNMInGUst4d z!gU8!Z&+K^htLOA(RBbKsY~!G4p_m-qhAry7YpHCG)?Z!nG2tf(61#gX=|HS zzpii@JH^2)gxJ~Z&<1cu-(3=OQ&5wO<8+uWF&=6sB@-iv$YDZoU_;>eKHlvX16bTx z8`$Mp-BEC_zR`|*8QFZp4fD>$iPR!_J54dW3GCGY1VP(0j!h1%b<`4Gr3V9>n6!zO zf2dvm>3BhU>42{^Rlk!7ssPnkpSa}FGPwu%lI-fDGXbREZ&d$LCEgIxz@9Ws z5^Iac@tudaQVhzXx)MUyOc1lKm!lLBS)ifwb)(UkV7nj`<8QD75XR9Gd-9#U+~riO zH}hy^cgg6(8>cB4Pe%BRsIkY~Zdhb4KUBmnsGEkY;`sZ%V?kRgj5qUmV4bImt(+D(ZmB0d`F0A>^aE?mLYAJ;}^}+c%VQ_$2U!pCUa{eAu~j^b1k>2^K*TCYQeICAGXEQ@EjEXtw_C zS|2LY0jEJ z-MXt#&yc&os17`3nrKpvI!@UBNAf<=$Z`ijvNL&R$t*aggd#8I9N0k`HP;9II5IF` z7G7DM+_CWsffAL3Q6%Sv&=n4#Im@B##ZdLxf*CJrEd$Gt0md53tqJX-(9ooKyXb{2 z3hlubGw@|nm<@O)EUZywSQ4JZ#PrApcs1SnSawY5bjx4Q8?kOre_yp*{g%3SeLdWq zVH>*jh3G4J$#q-JJOI6g$OT7JQx*tU!_j>Hp<}9ri)Wd zFXg6BvBzl~_n5zS|BkhbXZP}FO%`5nM!2UY>w}U2>i!1vLM&6NZ+*4CtwjQfZ;Lea z1YF{KEs085dsmicq$G?8uph6nrfeRq?1XPu2zjm~3H(!!zR?0?a4ea%nI=u0yk9+X z?aGu1Z;XBj%V^$=l6F#E;-*spZ-75^DvSU3l0_ts2ddsNbuiekJA8D<)51> z%HZEeYs+(8%%6}wblGoTRd=9gim7o{AC#Ubp7^v9tNw za~m)-6;0fC>wco0(@q2hz%22j$+927CKMJ0mjUUYs2w8tq|qYjl}Q2n%^aT@S&V{5 z3J%`(J0qj`-kf_bGgOT%@b^_}84FR)O78t1z}Lg~mA{W{9t}Moss*sO*RQyzaJBrS z2&Ls7A$hk7vZV4PF13V+yDaMKAw;9I<()?yzpT2X8I+#5Zn7GF7+y;GTf-%rcgHKq zd|ul$HWnL597Q4HJ|qx{@Dw?6+5CoL4zP;PPz`Xe04r611YHbH)0nY>Q=bMTKjh&psB3P zYuTK1|Ix?$5O`m8xr&&>Q-%B(JF}vf*mU4cON-AKZJ`>aVI1OVH*_{JGP1ET{me`2 zDtLF0e9l$o`k7+7)1kK863GvqhNy% z)+|w4!De^At53k@_eJ~p^(;&Zh&$`$w^;gnONjWLzWaFzJoxzqBBJPU9I@96M0xVX zn+8Nr00Ru@T&1@3@QU?UxrexIHf}&2w%Tkn6Fe7_-m|M4Pg7}d2XH`ICH)A(CjlSrki9J z1c^W}pz3k=$8(<_8eJ?TKVM4^UA*{Eu+CR>8XyPVt#cbcK|ZKLK%wSWcOnM^GlgR`!h&)AMc*#(5awX7$M0Q|ySQOib$ZY6@M(tQG`an)1e4yi8p${){rc9=*@!%zFEWL+XojW1-yso@xu$~+0^<#yscA#AHkD8H zsH$q_F-o7uA!LJZF1-Pf##+i=9% zu)O#Uz$-ioKu7eu*uPj8M1yXCx}TbIjABgQ-}J*t5hQr$8|baH(hWAEq4otf{K_{* zBv{1}nhX#6YI~6LSA8uhEAYFFL+JxA_6(1U3MM-%4FB(x==d3?&ZQ9OhOf1kW z+(`!REc`DBn|e^dsl2%G=`tiez&7CKR#yx=002I&%jJ2N94@qxEZ=?T@PW(Bb|?hw z+8fI*I=mZD9PJScvZ4LkP2ard->h22!KGx1E?YSMSl@fXu$>aHwl~e+GEi?=FeWs> zn3K>RU@yYhdTKN($LaB7icht289SvdUV3>Lv=pF8}C8Z`4~FDK-| zHZqx;UG8QuwNhH&{r!_OSFD$j*f1<90FTiX`pt04097kels@V74mrrH=C2D({pC-p zmvM$67Sl3GXRJ|AC_D*b<$gm4d$w#Hm7N@;sdZ#Y}%cLq2e&yzh-f+x=FaL4wd(Xxv z7lPZ&%n~dqgY37H*^<~{2S=suoQpsKPiiBpWKHIp10<&B%JLhb9CsKX4s@f4ng1W80ylS%ct8AF)q{}I$Ll(7F zy0!GQU*<^(+mSjFZk$lp(;-7)#)ehV(_BTOeTrmSP<|qdgWO2tC*iW`u>Oo|@kdD3 zgHnugvqadh6!=7fh&}1foV{D<>WU*|oo+1mqmu}dce+kT)vagPY@U!%iEl*-^czkQ zVs+I7)9OlSFTk6U9re-LbTx5SePQJJn3F=MC_ITmDXTE#QbkW`eg%ZMO$t*j%5s!n zCNF6fl2gW(mDfs3z?M+hWP_MR6SBUR5*g2g1BPa&s(2w6uBGi!@V3HuUdgA_B(zrf`-r_Qvv&fx^VZ=#)O zs#XW1y^XW44sk-~wedL?>h^xhZb#busB>*Uq>1!17$GV0>2vtLeqUueN$V4fg{LUD zoDc$YkO3T|l~`LD?3iRGKEx{czF9bENj0fvuZ(VnG+AjfwisU4VPw$-9A~@3 z(c#vjwbAEOj9H)>`63BTE(mNMR*$ZqLt9ALbhdfKo}n?*d{nOyM~CG)TuP#dlFTfL z5G=r?2QySniof; z2+ck7BHp!*T-*bPOwyIrRF3H~b33NQo+yE&F#q68>C;e8l8S0@ll&zzhZu1IWXMVu zB&%4(SY)DT@?6Jew2p4MO9V*!AcYCh!(-TuGHKFf2hzY8c4zvijN*awHFY zGH=s}#gbB7gy69&mQ2|f8yn~C0jsA|+cf}kniUcot}~jcGUd>XY##as0*OHw#6TcU zK99Ocj{=I_FI7`CT~W{!+Fa73*1nw;J-YZ2eC7f=B)WlkZjAyD)(oBC^g>=#{uXkW zP+z4^BEp_A#hy%PV0kg5I*%njul4xe(9G|*I2ZsqS~p{MOdxJ784;WpmIOiIRk<@R z4b_j>uq0h-Q2i;<_&iOF;GX)eWIFI_ZBhT2f@)tUt-2fjSE4CGOtvVcJ&*L%Wd> zb-!?#h_759Cab3IG?kXBee$h0NWVC}>RcCW)dFt)=_SzN0<&foOqJqicm@yv4ca4K zpe0yc0{;u4!p0%pgp!HZm}NJcm4Vhui|!&li0=BO=@5qw@6JL7cePM%tv*2QrE`g~ zZ|_ zDtf!Y8AkxNJJcO~@Gp}1l|GO8RpRNs)BN}H|U=rf?Y_IoG%q(0Z@E&z9b#t$6ZoG65#iU9j6bl=j{3&#k^nBUXHGMgu znE!2aX3G-~eFek$>JypPXkqV<4-6|BylySa9r=Hs~0boIK#PH)2%Y zyX+8IS4i>kp-L0&w zs;IW7ljDi5OS}6qq~l;9G<;teT{&4eoso(K1jaEB^@e0hy~^J9YHY4ZeC z%|xrB+Yed0ixqI+Wt^)v;UOL$EW8Y=?Fsu8?bOshpc+S02ILxWQYSh%_OZvwq2gQu zlY=4c#U;)0v40OfrOI5xWEMsB;;pXTXS*5H>r|rr@v0KeBHNstHL+))r>om+ztB~o(>th{L43lH`=L90K3L&}Z zk1Lr#_fY%PAusDu-8&VP1udq%O%oztzT?diX8|RKj%mB2#dF>8XgHhLIP=D|cdhS~ z3=NKU7%jFsEi{_2P|m?>G^GaHOz~Cu=nx;8*Otr->_uS|WR+I6Y!7{@D}L!g9p4>K z{-o-hx(b&gh96zi2%3eiO;;l@dSo84&Os0oHX3k=XhrP$Pf@`<(Ck}7FkY@XHM20) zJQ0jlNX|7Q7YVtEnH)^X0*`WKZHU>^z)X_A-0-B%uPtrC;*whh5l_gUELC#mB}!OJ zv8RN4^|c-=*yqz$8iRN@w63zOCS~)vNs(c zS!IS+7eb#b*phEmT_#=S95h>caD9XDeI13af6nYMyGjbqZ2q8yHbnKs0rMx6TIWk# z5L(^+J|OSm`m^q~fMp3BORv04NT86{a3 zxE0&#EcPB0K{k z>DZH4LsQ+$gj*i`7s?tji%&{5-I%60Q>}D4qDqh;3mzveD+5^wfK+(^eT@=noA*+L zKHXTsz@A^nq^VhmJofK*DcOOEZiFqNd_|Q$@CBEusM4sd)l{Z&`t&&2F1=XU;Y!CH z%5-Da6tv|5phQBWJ}ocrYi#6}Zhk(QS+ifpwvpqlNHR>gsg4KKe0j5o&X$R zE8#1hRMOZ{6v>>2F;Hv}KJzPor_bfQ=(16E}dCx0cdGt)u)o&Z#pUb8y1kbCvL&BhOs#E!*7f#<5Rh>?l$ ztowPBdpG$gFBMDD%;f%K2D*g7%=--7v+jd9qg{Y8_lQj~HVR-u zI+(%u-P8HV{G}+ysL=8VsSW=H_{9tE|gbgxK&QrHyDc}&a6X0=0>F06OwWv zuM))R4Zr|SE%;Koxt@di2+wLScBUY*P#vlVwzaEIc!SU0M*O!l*Wt%r0teu00yj;u z|3(hW3P+~9F6EW|7Mu;sLJ}1JlvE0nOaS>1DcX^a)Jsyus$om^{u4|nLA)j*35uRX z*Y$Ptc_|Iw2n~Vk>ANFR8+62AtN??>ZaUX8pGF2vdIR9}(7qLU&fukhu6IUo=~PHj zn?z*s7X#`x74mitax2_Wq}v9>!`#n;`UaKo@uBX3@e4hjeP@@(f~-m$2DEN5O_~1L z1^?^J5xbJYuKThBH2ps(nw}4UQj?B2PC@r)MvH9v_u!KLA#g3#=zc@`^6QEE&WST9 z=K9~poW*xqc556Y$jCeTE7Zjwa5`J#Tx_I96`p>#2fiO08T+fNggy7%-mu*s!Ecgw zH29C|E%&jYEgt|ixH#yCFMtW03dHXV5QhpzMrP9490NuB0t6vqb3jwR06uVK5TYNz znu2X@)%z_~9B)ke_WP;`^5Y=O>U*c{=a1in%wESd$7sC8@RwS8Kod~DAAlZPf4%5y zdzQBH7yy{_ieWxBGqRuN^m;iPKm?uo0c^m1KpH@R0Z@5h|6Z0mMl`;^)@udH&0Nv08vTAFG`i^%r zHir3iDQDj_xEGat$#B^l?Rn=~o907R$?peMoJrCUW!I5L78_AsCHXcMX>tY{qw*uV zRu*Zud8oe&{i}%(F&Ys3Z6(}$*Yji6Z4}5|FYF|r&zTOSn&xS`OXfR9DHj?6l$HU5 zxR=WkREp%zR7~mmyvtmTCS!9|fw8Qe6bJHcL$&-yjw9ZK$JLdQ?Z>hZ4P<>`b;b3|{Zw)Hu=5z3g)nlixs?u-suz&~;x(1dnR@s_Z zue-O*8W}Vk2{^2Rdsq8sl`l@8EpuZML4Dk0vE7X9c7FC9JSEJ0hs~TNR5T>FbKjBdo_t8-PjkIk zyC6rfH>;ZNZ2L8Ie)O`U1p-16!dp8$S!cEq7F&bp^;>Ejk59DvZZ#X&&Kn!67MsQ* z)#(d7j8uT`X*Z8@XO_U;(z1U(2tL@Vun zmCKb@Zr|Hcp0yL(Qn*)ud*{Cw+|krp@YKZwiUPRYdAwz*I@k$@CBwp3miTVhi$ zjAB>+kko1$gugopg%*m7==ONIkfnU5S_n^y6RDFVBA#eRvqDmr%nX%p$cEOv;sNx)B_ zhv|l+rX_v;o>wGtFOmNq^M+jbjk~5>lM7I8`#@E)X!5vUSO=tlH?6tQVZzA?2SNQS z=xQw#G7qac{Axw1?bz$=!)AzNmkNw)+Z4sfPrxTOF9N##>+>d-`Vj_2Rnf*d-Jj6n}?54 zdHaiB4Nh>*w_Tuv-<{OmuubqMNvh@;Kgoo?&# za*Ydk`3r}1Zq0(9^i8|&C8`i|)TeqMoaP!r2}|?v=)lqsbp%OKD{2X3^&0L{8bQ?7 zs!kL&T;*1^@aLXt8%@XDuPz4Vo1so*fiFmA04{;l?g$7z_z#OB-JmsAKIToee;n+K z6c9@z-JS5LQj?O2tZh?T_Qwgch|0*MY*BCo?22Xnn+9*9a%)reNevcG&u&`3d{3sm zeziMKPSreRuFv>m;Kc52Y_(n!eRtbn`Z%kArhCSXoU`rNg0(o(uB4UC3j@aT?jX9v z8~e$0B_1%4Z1n+xzUh4B4?YBpD7zJubM`Dh|H3BjDbT3m6Wr*B~`9C0X+1#*fxA28i;i@g3V zn-cu8O0%w`VD;bOI+L9c#soF~DWWv{J+m{1Gn51*o2PuDzJixcMtI~5G%33X-V*bC zzHQsDtV> zOsUj(9CqIj=Q{0Wf<|nf6D>~3C&6Zb=HPrL2WQOxdq$H{{HZ+1CdJBb31+7O(?!c| zuVDqqP|_Ax_VX5J`Df;U5hR?;3k%3Gqez$sIxPi3gt;t$EzQkSXSzVKjHScBdRJti zAoe-1=7$H_?xMmT3>pNKIiTIIu;Wz%Ey)C+EY0m(f zxCk9Gs*YsIkfST=cvlNf!g2+E!HGE0BT5vY@Zd*+4&nOl=J8P#&;Fc5G}T(OR{ED5LL{kWeL+`D>U;W3u(Z6RQ$5C__$=(~8(s_d#3% z+sD>QhU1Tr#sAXp$Ygbg-e+jMAw`a4s^G)z(1(ZPns$o^T~nbVPBV}Xw0=<$-?E6v zfB!g4$dZq70U<0u|5esC9i3q&wx)*Q6JW0?VnIrQlu|MBN09QL`TX{v=FUREiKX6mLTI~WXo)C5h^^hr>^%} zL3u}$DsJdvx`lc*9L^Y-@*Y~lOejNn zHA#FmD(5G4EKcXvG_lL{NB1K;aGO1btWxdiABB-IL@X=KLJg8aF}O7gR=58>1i&N& zQTXbLdeYgoL*CB!o<{TCOXEowgmo#Q{3Z^@WrTNC9-!>MqRm=jmZDTQ4>G)rI=O2|%*aD)PA zKxcwr2B8hf+nIyxA)7GDE2+~Otx#E92KYdG2+MQ^-E`rN&=_tDlwJQ5rYmj;qosv` z^OO)lq`yCMVS}qL-UtUEfx^Fx!qytvfGOX&{YO?0g~{%Gmpl`F68<1Sm1WwmLLS?sBwQ8zkS*`){6B1_nRjoKzxY$1 zDT;T_(B6alHrqdwzGi73S-*W*aE>v<(~^NQq~j2t+?^92TEy*5&0`q@s9&JwkR-(B9bMT!D zo5!dLC-jQdKYozEA2_~Wmx@dnB`H$YD=tVqE)07BuKTCecMKwDl23pbNBp4(=3g>F z0R`M62UKmqvpA$v?5ueG@9QyIfteBUCa?o5ta|J*2U~7dn|8FBnArOS+e=qm;9O#} zEp}Ve_~f?87$Y+#S1hEN@SCh|={AiIn9@JW`qTIHUF-uF zS`>9?I8mQ;(0M?)HnY6;yR&JPw^!qWk+I&bOjN3;V(|;9UnsCd(7O6(CFA}um-=LF zv+%X_9LuH@PMEBYRTA`!N(;oPl72YFM1Xad!7K&Fn~kgbs59BkLadC4WpDqUuKIjs zIWNHv&##{Iyd~x0t&7X0*{$+k^(Pd*|)f~W%w0pPYXx_KvIgg$xA}LKXu*mXJ_X53L5gX!BgecCdv}cG5ClE6Bf$JNub&=vg@IYNkl{{rWXN{W#EjzRbw_UL z+_<78_$E82{lsiIXW&E6_=JNL5OWoxv?bj!IIoj@`=%T~$HLiH@)z>v8nse2594Uq zUy)lqJ72&1RaDd3I?L{EEMfuf9J!(728ma|S{SGy&K>d{yM+NZtIWQ^wNil|TU0jN z#|JE7U5FO7tW$B%9tL_5QT=kf3hW%1@-NlVGy0Fxg0oZa8$*O<=|m~uQ|}xWcDz$b z@>VHviHf#qOhO2QbGN7`1?-`N7rx8z{w_t2-m1_nN9aJE z&A_ge_AZ|y*nte3nN-RGa^|zwqW#y~BswEb`=^iVz<%|F^vhY7o!7UR250pI#AbAR zPsiPeAAkA<=r$>pr`=@NSt>dsHfawHMer?7?fz1U)T?&ZX?H8yL;L3*pj$g^3tFF$9e1PJ7gL3 zB^jB3rX;=+B;D}<5+E=1x#_Qdw~i67=E!`+yXbtucrZ?AaA+;u)jOpWVWro=|1gL3 zznH`SNh=?(D1QjipHEfW1wLKXZyh9Kz%7j8(M@H^bQ%t6yJWT z#LxM9M;z##?E9T4yFaMLEzZOtLsy>=dC2zUh;7N@%xcU5MV>}qW5V0Q^^j{jI=@~( zD(n8uS7;@goo=?ENgXm!TW?;9I@xlT%Ik-*Wd&ciMH>`g!KM3in-ZH%mJSV*Eg@HA zzD_5$r%LWCkhrUvN9f&-{Z-IH2TMSSMsoj6)_1!o;A%DQBjHat=Jh~w ztmboAQXB`c=YD({w_(iCtX1hy5@9U~TckHkNs_vUq)B4WhA3=?>?qA5l{(FlI#QEe zFVw^6+N5G^Z2IO*jr{qkSV&NfibD$T;qv|wp{m=rsD;s~AtsUF*O0g*5beUe$`b+o zuF=8Sj(mi!Zjn#x78LPke6m8wR*l zv?xPLK?cR!1pnZyFCO}88ZU{$F7g)U`=Rv$0HChqSs z!2Tg!Dq>H;psqfm>AAqkja$>xhZi-(iyL7>t&^HeHO|9NxD!Z3~-@- zLW&8C0aj3MsE4I_U=pl(q13bcQ@h8%})r@JI(HCNK!C+oU=$BZ<(i^~jtyXii1G*j6zP z-5Kx^N)dNuISXr(@_8sE`I#b7z}ev)nz~jrPQcaaCW})mbFN~fyJw^~z2)BZrbCXq zfYmK&*IR-JpM4PiBDTGqno}6^4%C%TI@)g@gc}p}J*r{Y?4sWj5rPga^mkox0emz; zzH8_zb#p}24$0_DlCBD)xfHIG?Bu-jHHybHs;g#ElU7$f`X&izt35&7Ky4fx(7isX z=U{Wt$H4(kdB{xenZ4ZPnxqL6vcqZ-bGgVRR5SRc12-64v9a!VDL}Xwb7Zg4P(WOJ z5ps_$!<(Ff8W(jWN!af}JcFh)Dy$I~;Rh!obq$l|M(x|O%BZPGprMn3j% z;mV{a5uAYacX+)u%@P>5NRt z(h=9~l7A$>K$N7F?g*~UFOzxwyjc^8Ne$V_<6!J%Aqw_-5x$}$r4SSt9=k9_uqS^bph1QCqN~p8l>ZJN z)fpLcxwo)R?9ES#Ui0_zeBcARmM2^rcb3OW) zdZJm!HSbiAWkR`lXC$v;d%`mG4WnK+(rX^+FAi~|z4V1BV8wQwj+iM%au-KgLSSri zTr_pe7RS6t!CvcDnhG-3lt%{-%?;CbG;2z$4wLzB;%FU99YBbcj}8*C)#w^}TXdyJ zm$_X$yJIZ3Y{W3&KnUia=-#duG1YIvMCzq=2GB&7FJg}eMvydU>rff=wPz@Pn5=4q z09%Hhx!3mx-jSGs!UGDga^JD!U(wsr)g(BX@-pR?{AFmOzd^SBSf=!r$+q?FBV&vE zIqV~_7t`dwAi~WWlyj@?G&-@|Us=iA>;}Iq*e*$SCaRzZbdQ&?RA%LY#_0DU+0J^2;lI%X0FoJv?(&=D|UBTH5-ZFOriB&+tuj)7s zo;L3Ma(ML$*%v2)qmL5`#ih4ute*N-?V4`brOUk+omhjj7ECfyyBh3$h0j?wz+cD! zR^)UH$W5+6@?*zjDW%$qiI%hl+rhoKMVdxAuA+*v@wEQ)1E;Y!ozvWE;4)VjC8ttg zsRyz|?T73Os1yYwRY*v;FL&w?p4USb2a2khqs<>@22(F+HmM)uD%NAR2z9X8{m;OW z5-j~fn4ihv$Vlz8ShyDVEQWAH2f1|k)tPiI&~lQL6p*O83oAjAzHqlH5FqK$WwjEQ z6S6|RPvP<-o}^A-V~~!eqt{jW-=$9B`r2Pwk^RuTC~3e8-{}n9)INHYKg%L;TS1~Y zb(Y)^DiNa(nAnEiafv^0u1HUE%Ll);4Iiec=rEk$UH za!8LOpKi}WSm36mHdI?`NL_z)Mv~^kQ+ar^uvVd8-+YZH7vK?$t8!F5l(NLyX5x8= z{r>-FBL8nBGE`f!ECm1tqR9kE0Cz=@E}DJ~jga(7RfxgqXgQ=svBer@i$K%P5XJe= zTdD7C0n~=px_jMXp5r%M+ib+-oMN#V>=Dw4a_h;YlfV8{avIQz>L}aMua>fgODu5ZiZ)% zYWnq>f*|T*5kvZL@bJ=XVJ#lrqMOTzIlolTuF@4Dr{CMNfx{;>X3){f3sf&%=$^y=F{diauK#v+ zabP;kGL%TxwiJ7U1;FMf^Y&iM_4v7Tm6(!qUCzM)V|>VX04zgt5v5c;C&pVsWb}Mb z&%h65m}pC2&CQLi5*`(9~zR(u@`|9I}ou2gXTkM~jmR_FIe=JiO^1$~U} zZc#t_1rQ-8e;&XOGj>8;{ICFAdZ%D7a+ZXXuYlZq#6N}#G#TlxK!)1>c%t8adVXn( z`1YeWm$J(h{fX8u1k`5j`d%v7oITH=wFMbbQ!4uonZ97y>jlJSc>Bsd1}tcJz?dOe zjED5CZLWp9ezi=jRs*<(yuXhhnVpf`sl%^2{=eL#pSYfRu~Xq!?lHOy=C9?1)VS*Y zE$3Z8RbZ5!Lkd-;4U_8MJsOOJx>4F>1@3>m?J@otMW=F=H!K*xR~mb?9s;||B<3Z+ z#FK=z-+s>li8-EMM@nQMPh)K|9z@bXw-;}3EL^-7x7RI*Szop`s-e$$VVn7ama;$! zsoOb`Y4ViCuoTO+z~bM&=99|<6a08%r=90QRnh*$ra3AISU^A+4T+cBpLn>slgcs<)v|CvT4<$nG6}eGP`HJ)rWtu3j9I z3BZ~Y;0^2(?!V_k=9|Gt5N0kw7&sog#)8_MC_|Q*MN1t)A%RQOa;B0c*|e@pOC2oW zPa#xUR@F}!CYJp)9%Y_oQj_&Q^B)`>oH~Lw49qqC{%GkZ1cpa8JuMpE^Zv4*-{qs< zrRUOv+gC*Sr!RcBSMZzY1{U8$wZln{f-&}r_iS8q%je2-_7xkV-p{V3FZRYUt86m|FJb3|HqNo-q$SV94{NQ)pGuDw zC_G`cUpN50^CbYh7-BZVNRolY+I&b{Zhbu1NQQ0S9OjslDgCRFjvDNZJG0Xw)_Fcy zf|8t4*zDZC+=(N*t)smRP&voFWpcIJBBJD{@lu0&{IWkXvKR**Gv^7$*;hNF7z4JT zT|btHr|N+M_CQq0sKsNuJwk$B|Da6LiU>_Q<3IxgQW^}i;)E4E7gb6Z)OPRn@1FLR za2BhayFc=sbnW? zWJ8dj^Nc+9g}QeKIN!{#tQzwSz~6hJ8L&Dd&y0QA*#1C5<^bzr-;3ptzrp3h$NNxOY+c-Li7!LwuElUICM-hyjNPR~2X+s~ASwZur+L*ie~boN ztWf)TYey>|57t9k3$>)yCTJtz;M3KpyP%++p|&V!Et{nKs~;9sVA`)~Nutp`oN);U zqE~rW4$cyYTdjUyt^58_XCZ4I%u$ETeJG!Qu|2Xm)TbqZhsZgIEupx8@g7;wcjmw! zdd)F-FhZ^aoZt0$ms;VXZdkf>Rb6D7SuXs8>pkR@v9WApbV?cZH~T27If&7Nl6SlK4;hs%TOqBE=JN!Ah}j)gI1b0iYes%LSe^>0v=((?s)ecU;JY~S0T70y8J zg!P-}KrG2Ke)1?)g!MbQ@jW|9AWH2Z4mqp_%8fnF=Ae8P(vW2+!}ocl8Q6b{n7m$I z{QWFpaTXj@rm3L7;^eLER1BT3z*%IK>q?FZl}T5I#!v5bm65ikCFb|(p2+OJHGGQg3_tztkU&<#(q+8 z+kPtky};bKc)FiyD(RkiEXi7d3i2@0JF?R{i0s@zt`#8y&gW7hIOlJH@s3qA%h2;J z9sfBYfPEEa>lnE>-#B4rTlvMv*YS#WN+H%}+Ja)n_o$A0ISPqr&R;(d z0_RLN)=cl*fn1Lt1l>P7m=rkp7CJ!n>m_U+H%HffJ$_+Q9lw$5!%HM$Vr6`Pn-!a` zDPcvNrIPVyl0pi1$VB5qypDeJyg|N7kW%WP2dCD@$d^gIrlK@it;)j#NU#YEv8y;T zCSWk^eaD_dM@<`qu2R$yNPF8Kwq1HYyr>!db_$Qx4?KyeC_%8t-8dh5=jP?Zdvu|k zg-M+E5FJb?zBn8H=9r0=7PC9~b3q!K#jZS#JX-9j!fv$iT0p;LG?pYky2pUtUId*0zJf28$T zaZ&AR1-xI$oOt)N-P4R9VVf9UM6SxaMnsNh6lPU#QwGr)i9re&VRw``bxf|!Vc3eN zX)$G72d4cAAs4gow_L^f>j{^2s@d~Is2*xEsLmXJTw*9ZV1UYM!$JKW6PZ+c$mj*N zm_A;z-*lD;Cyv(1@fo)nJ$2<$sB#2-4^=5;1tAqDRI_nQ}t#pLs;Sz)l%fhbhR_v^3l<+4x1)_?j3Eq@3N(()& z%J#Zx{og-}C5^@8%3}-XN@4Ff9V1!Ho3(Ey6vIwpGXUM~2F%6fYo`b4p+y$jxFz z3_0oh5dO$E58p&MF5U|CV9o^bLruWc=24Jg?;H9b512rr2$a2YAZ<_SfpzJ{sYc~} zzXVR#@1M-}>2n@IXvJfPj5)86BezGb?!m<+{@f?XlZFi{d3kOv zO9djyWeStba0I%_LmPCs5%tq1E+m-NKqKu!$6gVn0h+x1JQANllSU5lH*gV3V_ARp6f-{D>By9Id1YkUd(xe1}Jj0tI$S4dlhPLyYsnK&4-xI zU#T4-b%J>xg6gHuiDh4mM-e!m0^2JbpO9t^bqycN>F7KpF`N!T@RaC~R>8i-Z zMs1DPMgLa2KIwb6(Z4_KOEqXs34-`w17{EdS&FA3{8t69qy-aR3bDSiAO`sZ^Ofq{ zZEk>*$t|y4PckrYBFd13F0|_$EHweNzU`Zqw@pMvjq(xJCowzA-Hn^UY}-*dQYifN zv|aBqOc%|)KCQ4#E`ANKZa(_)y_aV`pZW?#_cc;q^>(o`?a`}kA@;lfYiw1@KlPJ` z{<8iffPpcBfq}W$JAqat0JtFCN`NeoZt5ezRWVn>PY5U`5Ba4uuSriUZ{kS3Za-lE zWWL?VU}v`9I1E>%Vhh;RFUODMzd*W?zZskien7FfzRcSVo{ejHme4H|8=p6r6Y@1{ z`98qOOEU&*C)guqF%eN!v?Zhg(ZW%$tG#WekvQ)g9|Kx#pc%8g> zcNnbQaTj%ktR#1b;w7}MD~F$u{thqY)(sM?0uVqU_OpbeJl}zAs{ky>`v}!M1$Jrr zyQ@A>1Y!Ey?USJTDu5Ia5k&)=JOF=FjpO5F{_@jk-0iF4&~Fasj(#FQtuWk}qXt&W z)2W?ntobELk`3i|97dB?jY;mv$gFIiE z7+eP`oS|id4En!48$Q%9A|CDg?J)T+11D_i-s@?<1e%>yZ*RY5pK1UsI3C&_Feo^Z zKG7~eM-bKXlQ}u!ak{GyvYP9B`P z=-Y&>Qx{047JvuQk^{1-1;~6=5Vh6`{5^c8*l zx0H82t`X)G5bH!3?ES59W_QyMQjFXvoVsVsJ3zPo#NT|zojWSkV6Fl)x6qS5fjtGg zws-IDQv!E^0S%1-Ra5{$jJPD8mkHRLQ8)|s5jgl)oIS{qA%07!!M?Rq74=!B%IUGA z#A=tto}kXg$u>07H_o!XwcO|Lm-&gS?pJAh;`IaTlVG115w1F--8UTucqG}2Ehu7f zT)XYj&T5`;h(PMud=BQC1M?;hpw?f236^k6#tt+Q;Y0#y0oH_8aC?PW4&w? ztJNE_s*S#j6xffq-`jTkM1p0CgKo`Eh7(s23A;ZUogZ)~G|_aFY+zlSfGKYViz8_Z z8k)8H;iKF)?Kr2S_}OVAD;m2SgR0Pl5HhHL+_HAecimy!j_zF}mT0>6e4Y^K>_%68 z1DCf^^T~U{gOu*I`fwfPG}(8*b50w`wKJ$wpwI*fg!m*_mGVs!Ml^I3E{u(-QBL*U z9i}6Kj4O~KM-G$;FSp=iT-`Am zarFB@)r|nm|J$#HFVV6Fnrs9J0ss9chEGnamGY~YGSu*>DY8j-hbTUyU$V^rv&mEd zQM-*N;@5wso|Jus*aQ{4P;aT~b^RJ)h#!~_^v7+=p8>zzj`>CrU6w7bZpHnoHy?A4 zPONZxUe;ezK1GpUP}a2(&g>1!a{~S&cm_N-f0L{HD|P;N@W2Kxfeiu(MSQWwhSl1) zhS$D^-8^W!U@(Dmie)5w&?Q#U)mdwQ1&^SH$tS$NppA0uxmX5WkggW3L@wm&xSxH) zp{S)NzYrzhSoyZwmss%e^T(kOTAC$@BV%qZ4wq18`L4(uNw}|Pke+@$UUp0o&LDV-J+fSt>~R?>X<7@cZQoN$ zA-i>GfAIqd7264~t{Sd>4z|u2;-K3*IM>&RFXpu@<9V$n=_8G9u=FBv-ge~~wE(67 zdtlK5=I*BASA?E^HalEB@9H^vW;}5fUNPe3s5(}$0}5--7~SBV)tXS-&F11jP1j|A zNCEiRmXau9Q+9jWNLl*j*Cg4iom1|p*~3J&ztlm$a{SB3Y8ngUs&z=Ah~4nZE>uMwm=h}~p2O#yO>Gc#%%ORC`zn(2 z3?Kk1FOcyuf+shOkR~J=cD+QMjPaG7>zy9$nAcC9ywRRaZgZhyEP9W+Q@GcdD@nM) zQpu-GpNr08ZX&IqJ?wugV2fRUO$0lJBl=K-)p+0*GW%FT zx>17}WoVA$O|j~EVMN~i#;Urgsy_!~CH?^@2yyqPPb9E)S12mLPzBX?TzTq^$``aK zDCv!iUE(BOYhjEr7gk>BfPU2CEI_)9}-5iRh~t{B^d95-wX1pJmi~=Wv(Z z+V8-Xwtvy~gheIG)O`Vj{C zjl5~qhCL`+F8W<=-@IdPBjxMTc(S6)m~%wP)HUgrnT5jiTJ-o6d4Smm42ENh0lJiY z04kIf^q>tOGmazCnLeO`hZrhh(K!F`ZIvW~*R(!fi=xCHK%v{c~U?E;CGR=Gi5bGDCC>D6u z1X)<@7ngW5;9TN*Vt_2m#WjpKnJ5OD1BqHJqQCI57MUiJ8Lwml@n?HC_M6s#hcu;k zlhOKXC3sGEoJ0H-7-9+yUs zxN&a;%fEjk?~ALP6o151@j+LZtO!AyQ%O+#kUWH7?tXuVsR6PxlnLyuEv?OoKeCt-yh4AE5YMC<0y3&m!ef7!l+I3lj&INN0zP@ zpaf8iHQKw1Bc9K8oZ;;uCeb{52U&VBq6jA?wY{x*3K;43Ya{OxnO@Uh^@FdNJ-gzv zg?-J>DYxZ5?m#M|`<)aeT6(FJZH%v8ckOXhN+S2@8A%Al*Z=);*u&G2Kz7uni(q|K zEXB^H$Kz9vZo_vSwpR;Dc7Ef)h5eii4eZLgO(Re9&jO~QH)*KhqqHeXQRUg-eT{^q zLn)9T43K}l@atxz%wxGLQ@QOS5m*Tk*V#HuFCNP8k%@i@L-exo5C-PA(rLs2NWOJ` zV5N=&oK@L4?#PF~h^Vw`?!B8&Vv+kKtrdyN8oO1PQ53Om8w8lz8z+%)XX0AbfqFB_ zS??vu%|4#1{OfE61$beTY9N0!hZ?!vL94dLCV)AEf&L53uQddrNY2gsyk1-Jeeru& zOYYpK7CCn*1E}k=fmTNlNwI>_p-w^`a4cSMwjJYeOGn9JnE`Z#$xO}jmKi|EULa#cuCtC##)nFO7O4Lg?^Lj#Y! z9x%qKeAfzOMZ1GUEQ}I(eKE$sl;>!i2`_duEJnQRTPpRdtNvvutbEgp$(Px*ZI&Zd z0{gIfwns;eWZ{H!TW{ao_`>{20z%jqew$}808uEjIk`8Dt;R3-(E$T8@*UG30%(jQ zJ$iN2zx@lo4Hh^fceBqvllkiB(pOst2~hS^(>kZ7Wc|qX)qIN6*IF6gSmP^I!J9hM z^}Wd-$~6HkwfFTN>4l%x93X>~1fk&iHKTO`h8hT*6S;n$L(XNDGR;*C2dT3=txKeR z3aQ>kk;kv|$x&?rV`We}h9(dUqUQC1%mgIsFFT}I)RRu<0BtuC4`m_tLhJFG4Nyn$ zrHW>Z3;7c)Vo#8!FZ3bMx?nJ7dIlx1kmo>bA>XZRxRdc*1U=44K(5p+C|@D4L6xhHq|1MmA4`)t^yZcmqwrR0&m`Q)E)a>#!EwVV>0X_fkh zv#HTPbWPwMcoxG&FsCjw!g_Eyl5%23W2t<3*e7FgzgzB~>tTM$#(a1X`Zg{*{I}43 zpFM5h9_*!V-ZhebTRmTV1bp~^6HvQgQ_TJ+0cT9fxm6jW|x3gkRBKz407gexn0nP3(1PP!C>h{sdTJzavNhC+JPU$>IyI!Ts! z-;PbB>g!lt#GGNgP>-WHw-kD$M^2c~Pt0-a4gJ*4EN`yAp9Xvc#!$T%4b@b_ zPDtZkL>CoA$163I7|*DU3IfD8Xp}36)8nSbRmZohtua9fWE;AbXwJyK~w9 zMIgl?{st_gg*)Q~W8@!l33SNa^l{OW@LAUG^YT^M^p?hO+N?0cDP3RwE=BLoI`pqr zgZFl*LL&HxZZ+lq~=I4w}Pr*%`F>3t*4OTi{jv1Yww zXof!5UlLv3nTZCyJXuvAxG(QsP6e(v)6d7jtLN5suJ0Q!9NhcetCm8iY$TdoA5c0b zR)RFvz7oR2e2=G;q4Z~(zwaS(AW+VCX3bd&ORQyQPXAx;3{Wyw7KK7?#7*&&YP0wW z2JoIDF$;E8VO3cR@2mU;JFzwYbthsHOuomALT7Oju?-_cZV1XkbQLilT>s!yycPb5 zFq8U4vdL1@9=Liq_eoDy;qcn!CvoIr$1=Nnc$*S`;5Ce@)vBQ$<-*bnoOGT_8D5Vv8@+VQC-C6W>;?1{PK0X9z{&F_E`wOR5rG z=O`JyXdTHq7C8kr%8M@|d35MPP8z%&L$_9+%5yT?5#rq*7F-~2{RuWTb8pLk=UTMB zaZv!ys&0gm5x(YL)WcB7nUT`loY_c=FgP;Q@v}hq(ZTuA-+yLevuY&{&z>=@4M92l zHas-#GbqBn$x+Ewr-I@-+}B4X zGz<4D!D4=bjZ|1U@H#;WGgXO;Wg0Ty@c>Yd#ud_a>SH2+DpBqj;X}BL<&tM-ALB@6 zmj}pG>-K}{cHbsSHnoQD(qm=f5Nyu*#y#qLV+buvYa7s?{B2a5kxT_DEQ zBHGYTXxS}z$0&61cS0z>4Af0C`+Z#XX%l`|*P`usW0a1ejR={Kzwmty`d$a9KX>G;nhc`NIN>pcIZ{)2`|5aZe`jePR}+ydDB=!tyO?#`sEk zPz9cCHl}bBh-{Tf(#?oprps` z0=o)aDj(ddmgrJoH%4(RX;$ZQysAdB6djFS;;bjlmcK|QYZ(va%`)W{sBochW1Etk za1P9fi%}2lKA{4*F)4X{g^_sGCOM<NxxpJ`;xdUs?qW9Rg~!Yb@|?V_WoM zTgN!uLTZE*MmKgpa49;S$+rpv1Ce=iM0ZV85eh5~ROcRK3B_6vNjOKGb4!#<%{9g) z3B$}4F}U%~v1r}cXEilN?Z+v*W*MF|N^s_7Q$wQ^)wr#`}#6=^;~y6Og7rVLV%?<8o&T-2Whci z%3-Ib>ZgbW^};g?c*Q9yx^hqB*%4+W`cv&L7h_JjGHcPAUWG12&n?Xqn%R!T<#DnV z1v-WGqv3!#6u!;Y65E$zOO--tyX)t9Dei!&?27H&OzS*vE3Rgwc1Xw5C{u^T=a=XC z@9SrIz{&L1Rp0aUR+e+ij>1jEH$jj0jSnW)N@&4dHnHXK5>Ns(5LQ;v{a|1-PZ|)e z08o?hZYKr2-+(Gn2J zo*Bo+uM|Q;M_xi3lh`|{7bX`FJ0SX}#lsC1ahGI2@r(20%B1rto{W|yi>wRMolDZ` zsn(SXb{?wU2uB9{FOMVqx+6Z1h=WcMI3S0HIEpdaAeyC*%o_xlDoHe1u6N=@Os{y8 zQzdO8T2}@yKo4U5^?7tWkdsKrIdQA%0{3^Am$_@4-5wr*_=Pjo1l_n)XOK9$MUA}X zfYVs=d(zg!As=ccQe1fBHh9r&B@eFbqu^$;`U?yK^f{d!^!3|!;u8`^5h3oz3czh@ z1bLo2qVGG+a`~bt<)j{{Sh6Z$#>Vq7GbTWwl#gq)XpkTxu%3(W_#8i#wO*zlt)BU9)&zxUW^&3*j-8Gp5rf`@m8cl&|T%{ zzG*oMJ&c<4f`$(9xSL3>YDU!2Y$1(WaM)DqSN&vEL|gAKA@CsoPrkEvmU>&EWR#J6 zK4X+88asoU3=3vWd#|r}qt5c#+OWgVO~=axSFHLE_Qmbun*|^rk$0FGOh5yIK5@H4 z(y0LPT%)k?4-<*VMf5m&xY19vLFKPtclQf=EGSX{ST^#TBu{K+=(8nJ*Yh?>$z|r$ z*E-jO)lM#=mN{zV`6__-O2ix& zaTW*qpyWTLZzp==YgC7PK%_oG2-7eFW(a#_JP1PxXQz%@cbl+1c)^vYZ;8(W2~-^L z4ZPrWa8$zDF#6?Xy)Mm$xt4pj0~xi8%vo7RuQ*il0TnN;q{M zIRp7GXkvs!2I`4zY5p6r4$tJqYVS)vt{RITLBdOAsxOu=pnN;;@!z8=5}y1c@JX|h zI8)~0J!wkoHz82#gmWvO$q};xr&-5+uQ0*sAO@iZe)~s}MsTdig+$DK$tO@Hxy4Xx~-FfP3FnK88;WZ`v~8Os~RoF_N3^WuH1B4kp>Xl zp`>=9SyeL)E^xdrZRPYZq~M!wiCx3I8^^U0d)|L*;AJ-V4jU@2;w6vc<%ij-%k#I& z*1}o-3Z?*pgGw{I4c_$CpRV*7XM7a(0dwrOV7uqG z)hT#$TKz4B`J6>3-{Zk>zn#}{R}26{Xo2g7!>`HN`IGOED9Gpdk81S|(bEQg;Kny- zBp!V~gdC(?2{agzD526Hk>{Jwolnsr>P5bk1pJ0Igib(xJ z#-FRqsBA^&ug3JddCoL$_UuDyP$f$nDUcT#7&3xYUJUoKgvxRmn@(p4Zn|rjTMA9n zuUf0p{e8h|%_e@N1Ns1L*P3%-`vbhgqRrZt>Q#_UmTdjp6W3T6D-(M@=-Zt?r9ff zZ}w^yP%pV5tE8aw1E8{Zkf|tyA8rYXygd$8)8e!yuLN4FA=zEEfzpyFs1#C4%v8u4 zFY$+^@5+78Z~FIf6Qg_raiCwI_NvnuY}i{uLq8 zCpOO2sReM~m}gp2pNp^cU$w1~0hQ@l6gG6r>Q9|5U^LGgSi+Cm3I9%V?s{~(Z?fqn zO?2z2o<_N^x%l-){(=1O&q+SLX3oKs?0HZHz=Q#Q;VlUUxpsIGI$D9>5gN2IM=dCt ziA}A}^kq0piVnP)i3zi3*=7MUXx9=9)n=1HbEhb4`$y!*8`>*Z&7{AvBsaobVLpL|J8*kr>UvS2&p zg%+u_)j{_l?^^KZYRQsWwC!FfHC;D;fNMc&2=BBqN71LruwJX?%2YvWG4J(o91qst zc+Ppewhxx$kLwowO7FIpAlS~qtNB<&?5VEu^z?9t>>(( zjt$Ja7)iuiZEaU}4uP&vKx&|S_kk^jbPu%VYDs22tTZGsmLqQd;yU%8>^80$0G7)e zzYC>9h9jZU@|ffKcC?Dm$P~nQ8WZrG^(dqWe-Y(lD20|~W5diF(T=9R!u}(Zz6wqk zZ^1UxIB87$o(FP@OQ=~+d{Y}*Qa^AQrWQmz zKLlw@7e$KKCNB0iZ!Kg+P_yCH^j?bIzmdc8h*2_3>yukuc|-Q=w-Lb+<4^d@`y+FV`> zQgh6;cV!Hp!6G#4Y9oO3!P5j{Fo*KjoxH>**bUTr{`8@gJ=znugbq&tapm?Q|Ne_? zKP~^Vjjg|Q@3epJd?V1=2MGB{*owOAcLOJ>rBk1-)lg@z%+)RAN;ial?xBz_`8`xW zErp$H1q0IlfqM#v(MdVWI{((;J8=Zj|Ncb}H#*=l8c=nA`?a$((~ldlm44ipec1O+ z=$<;KgnS@&HT79!zL{!>$?)g*5d0pV!K#GpffMLHDC?_>N~L_M06?~^BE21E5pmGv z_Nn+a*UB6aHSlrsW_1YYIAv5l4R2+T&WGbpH@<7C@}PVyqAkZy_r4!9f0%dI`VD#0 zCGz~b;u+H^#F;yJU|`nx1%Up61|QB1*b!d2&)zNy!SkRrxVD05|Avy==g(a$eRsi# z=e%koJSw1Q?3%F^0C>JTSWyC#L#vED<9DO($?&cE->GJ8lBXKpKDdLPL&U%XQ@$z; z=RKi)q1SOEX&3+Mgby>ac(??YV^dbRSyCptBBC-oD2_)$jAV#R)0KkPZhk2nox5y&;$pE`w zgHzJsPW<@K)DZ<){VP#s+r#GKo;q&-mKAm6-~oR>Tyd>zZr(UFfr%_eC02m-0Gj}xUr2m*H6=w1de69?(cXiDp4 z>r*U1sN;@f0pzkxlA8G=nL)@Y>g>5?zY0Djxg&$Y7By(XWY;b@JQ5+1BydF6n82^m z4h#EA8$XC+o{JWY*6d?tcnHauQ_#x?kQ`~Iz#f-TifCm)JkTiSp&@Ir?`X$Uefwi7 zj-+Wzq*AKP3n=~}_3(y63USDn>d!e)36kdu6-y7+0MHBfPtJZnNlQqjZ*iKOyD~Ts zW!cK2f?!z6d}$#|>T>=_9>b4Sy(m2>h+CSFKH5lDW~8*lxr0uPMY?Xy7^t3PP<_}d z=xY1!hy!JuWW6MbWPB|CW#%aSI`9sAQy7{&cD|pMu~W;6GEz%wg|I{C8P4~IgB`H? zWe?iD0C|_IO?{^}=c}MgZD$^wsuHUugy=He0pS1KuiGe}*}H#$ zGpg_@bCN%N-mNuIv>$=Q=5UgTW83CUQe%82d(#>je5Y_@ym~VotUvNfJ!qlBu9kQN z3KUj2Ye)WI%+h2fIb&Ih7*VY1zti;!f-Wo`<sP_fh>k^Ua4*^FM-Ktu}yy_ER4Y%Loj(q;(Sytp8BOU%t?TyM#F_9@zWd{ zy8<%xl|sV)_oNRfru|*gdzrsX>!)&`i4@2724lKpBGXyxm#@*z z518o_DMU`~6oB|FNi|urku$QzkQeW-dmXNm^8pMx>=n}5sQ~SJtTO+EUBU=qGByBZ zR+S^L?F$&Edj##zj8*`lquDId?Prx8XZo~7Q`y&j%4dJxCxH`<%WhDMw1%%}j%MRo z0gw4YUV~uR=VjL?;faC$qb6luTl0ZgNF@fF9RhsE35X)yY0yycuRaoAB^k+{fo{ff z<*JhuHGc_0ccsH<7y1*#{J8{Kr9GrNieT^O(mleiqQft<3>h=C%3k$+KH|#0%vkLw zKxHr)Lkhd;P-{`u%&MuNa~>Rs>LH{)bL6=!XRq(X8sH9>?x#)HEm6rDBHvnog<68i znj>?@0dPIw{1NtfqBw!ZA`LRgr&U6$$olnaqaxqCH=nRxj6yo;Mpo4@NPUevrX86I z>r9vRY(R4OsSiFq(;WwQ`DV&^%AeX!hPo`oypsR?j@~@I8S@d%NHM)xIo$0+`TG?G z_L+HRzObjHFcb43?pGg;&^I?bi~bcNtzR?)0g--d&5s z`d2LBuP$HX&;Q-n7WbU$aPoA$YIgm&_As+Caj~&^s&1*1Pk-{evv)b`3t*qTvcAsT z%Yv)vdr!#W*8vXVzRJ?)1s48*$#Y67a0)8$Q5t6DDQc`y=C-?YuD&m9-v(r!(VR?U z1Gc5^BRAln%|yXSAykx{&vFK^`973o8v55Fq`Fg}Th3YyUf(IlkF=paW%MAx z0%fcMy>bkYFvieG0XI?stICA~CArg61F~`r$fu0R%SOkatXzcF)a7TfHsW3AwCVTn zgO<=Xl;iJ9vsIOOq&LP>mJHa6RLPHScX|S~$_6|^)Hu@h)C32H!~N%9e&2Q(eJu~U z+zz3w5}llh4kZ0ntm{K%Eg9#)5R96$Hr%D@Y*O*o@C<3JsgcaUUG8AwdHBT92XMw^ z=Nt$~T2ev{w{L>4U?zgs-UC-*CcXBuKc;{O&-ZcET)hY+?0$5%Ll=C zKNXf1M4@64`)e%y>rX7?t%-XmkuR~nPYJ!Q+?un>xCsmDu6DDL|}bFUR@y z=G}G&@%Ek}IC~c6vlP(j+*x;BxuZp~bOku&kZb*PZR4By zPqGODqp>3S;5BXrzoZF$FdMhlv&w0igX@ncX~WyU`Vyux(ll^ZBi4EYd4zhM&7@wo zHZ}0zV(}yTkmNr|Zw(;dmjL7>95`FvP*QVs@0bszmrhMBe4LQw>F0u$$H}OtOxz32 zBop&MpNKTcSwIiy(RQ$e1@cRr)Djk2D_oizXZk|90!44ZHkP7a{ zC6^Y(-7ke<|IFaIkhcCEi-_erYU6WX;Knr1IM@i$jq`CG9s#lxTES@h1!ohG5IVHT z{sR%^Z;c5XFA`^jYXLw)>>qc|VncI32CE(=<83FrV`;`TPx4D{jr2V zA6C>h#}}x7LU8t3PgKTGp;4I^iif_wHc90kvLohIn&uYLD?CMDva05lSan z9pL5X=*V|G041+ctffwJs4Q4Y45>YT(dmnjg-`N*+Xv z^A=dew=tCoYjW6+*|$`n8pd#k@N(ba+~HIRaTPh@p`-(BwaHVn zk+Lg4W@y^R{CMr~aoeAjA+0TVcF}Bfxh-3HTa&Op!iCa+4VojlwK%;iG->lM85IfCNgNuSR~S8d z7wLlNIPIUoV&cXOg3rK*H$`JGirBq!xxb>n0ib9kR2m#~&S&`DPj&yOG|z@irT(Ks z;bk`?IMP2>ss^(*_E=6#G^cDW<5>yeof&fyfXe3-y$yPb<;W~nEmUWvJkV5nmi+F! zx>KiJ%%+w1Obe%>W}x=88R$ON!z|1OSzQt-Asf~UIIT@RYlCGr?ndE7@Cq4RR05?S z0m$nQlYz*Qxb+9Zq&mCJaB+HdLm1tHyBLf1&xUb&W%Z}GHyMVLilJ5V-5&YeRoAec zd?_$aJ!ef_U4?XX#8e}K==e)v->w2T%J-UD9bdMHB0;5wSxuwlLri-MwloMNpt}}= zEIRK_lW)UbVEI3xFn|_y?Fbz6dY#^i0(#<*cmp$M`$sjg9Dre#bX#Xv9)5fU4M58> zR4(0}drvYUk|C3sNZ_XgCE;hKSa*=oWJ)OYw04ZCoX7E8F98}`p@AhdQcH%s#*7-R zujhRM39O~)npEP1h>6nAD=XASVTdMc@NU0tYqIK$LPM*HP(;g?**nNcNbLa>fDZnc z<&&n??UE5s-O?^wz#(_cUv>{3ZReD$S5HrE{zlzsHv;%?c-+(v^eA<_prb* z-_~VciOr^dG>--alocfHYBp&-rWHvJ9ont+4e)~e8xg=O{vyGBmDSK@Fa(+({~UPM zK&`L{FB^-O-$-k$9R0)#TDq1Npr2|0`@WV2egYdu{c&Tq_~)NFL)m;|dQz!_LF7bA zJ+vb@oh3FB1n)(fRMiTGIMa5kAiz=3QeIm#EqRwgU&H9bDHjp;8ah^Cb6fPj1{VtR z&24$M;^ zlI~v3iH;Xkr+-)QaO*0R04wyh(teoh=#*a!Yx6W9-f99*G>@;pUmx{Lc2o+XC0Wa{ z=OjowsJNv(3x;*h-|xjn(B5~ETu$%DP3{B)(Aq7mWMkF(oQ7@Z3njI{13;z?v7g=SxWDnb)0~lh0a^Y@8ZO%(O zXonPb5dMu`AS%2VLF25#g>dlb{@dMgaOG7y{r=^Wiw_VKTkl!dE}7Hga8Fwy2)PBn zY(E?WetpY{wm$^IcI9IX1wC@#8XqRMfuk>$BLhDd2Ea;LAUdjNaoOp-k``HR5L z(n9LkZ%$NLYTj!-4wx~NGiXZ-SER!vs&^s}t#Q;wbn|rpuHFc3qdbL{#lP?VF^NVa z_@>0nlR<-~7P9a}7tV$>&AJ^YBhYh*V4RQ(8FIcpDjhO>kjZ*;?dJ%78oDV)Mu8v_7j8^Mf6lYEbpd&0wvb5ua`0k<+ zU?2R9@k-}Qk!_Nkj!v(`n zIIopPcra5T0DSEkFiM7p&dy_CEwp~{wmtU}YG_6Ynrw--8~6Qe1bg>xhrwr((~P|c z3TJx!wr%5P3wlkY92>OvX>CI_#=7eV#ecv+oAsmbbR$J1En<04T{WT-xW6&U1u9T< zgKe$yF3-K0HuP2!`7@`5ReYjzj+&`_qEqcF_!aa#c*VYxkCz;oHYE19+#dy+DmQ(2 zK~KXdfZFm`Akxftn+D6SVW+oT)3mjguhi| z>D)FPDFTl3oN?VIwz3SP>k6xgHkmplwmHZmy@xHLvQqA7QOGx!=N0uoVa790kvL_% zypGkqNzVtX&lQ*~CFJS({J4JxyIQu4!)%OY)_+D(~cc;<-Xx9Wsu zzL|3GV0846#;JK?cw|9QM)ZSl_~BH7Rz(88zc>;vKzEcAo_<<5LpzT(81*abr$pAu zV`>m!hjU|b>X6f-7gsyh;ud1(J9uKlIiUU2bkl*RKuzoeG^2%Cn#3}?pEs(?L}QEu zXeA^ASw&&%@e_O$CUY!RY=S6|jq zxq>0K!rXyOMRFZK96t!419BL^x(v<<8j3Z>m1-4%DU1M1?jJM%-#%H17=hUzy-8=T z1uJg~y-;hLr@N6EJ&?a4$II5x$QTWL9tM zd`AR%@(}MPe`>9fHptBLD9jY03s5ltC>n9tlQ<6dZBuNn#7`|OucR{H>@hXHJIMQ~ zo1%pMnX1fOjHEm(Ogl~rR01_-VP(1Qrxj*uk~3E`N;n$&({=t$VE!d>7)Zb~Yo#^~ zb<#pReAQDo{to$tI+O^Z%#)h1oOnb27!OFzgn#`3rP&IyQlP(ieQa_(ldl5Qoij4) zdTLMDD}^zC4?WRnKB_ED6nm{US*n+=i;pip7fL=bRA}0j{8ddWdbff(Gy4PjwQ|_g zLohub`4WN`x-~KH_1F2s{GYA!ixy7kHA7jwt)X=YF2lv%2xGOrn$te?b_G~&U=~e78 zLmcWmFN%B7#VIv~vEE6Zn)xOpH*9tzbc?tO;pM2KEAY;lT=k`EM~#hv{839>E3qvw zm_r!bNQ;#u0rqY|Y*dMR@4!0|>)5uYEK6p9F39IIc&{5#SsBp)JQak{=&`z@x=y0;%RoMooST0Hv3{>0-;AMN z`SetVqCDtCdRziTKkYR9jwF|J^=fJxqAo};Hv&}*qJ9FIO0lirPvq<|5Yvz8n zObK~y`?H)5>EzR_H#e?u{|bVr4V@(igG`)LEn8kgPFP#{mfg)w{ifW2GN;s5Zlu5x8ony0mJeE%~6y!SYYk z?nLLGG;s2){K^l-ltLT3Xk}CfJ*WbVd4#Re*wx^*A07skgd(H-wjtI??h4EHSTyn( z+4!}7eOxcNHAvJb3+8#elS15bY1Ep2A#540+FD02@I@0eXsNlNV5yJ}uo4cQDx^Az zD-*;$IlD90^goJ9(*Mn+rRr+=I!*B$K+t`%xvVICw0=SS8)@EVvQv#wRq_q^=axz)Uv@RLv1@rMHbGFz1I#E zXPXH+DIxI!Fl9X#G*lzSiX?tZ$^%UXBA?Wlw&@dAG(q8UDRXr_UKd1%_{Yq@yTcz1qaD?xOMtd1|pwS!W0(TM4$(I-k^;QBuFpE~LLw8y{MggNiq z-j5yI8iyu+C-G_HU0;5bHAViD6GN#}ot!4h{&1T(2eQmTW0ZAx%T|2t+a-(-X!|Td zc`YrTtpaYY7uw$Z*yPL$s|3P&aL52-m#rAtS~w$&8=c=wYy_uLW_+PB5N~CAyg%;4c#>KT><@{S8LnP9_>yD` zVvxBLA-4avXFvttQqHGQb7lO4t-bs7nkr0rv=a(z-X_8ISH+JghuLW9gena&Hkk^QsK3lpHEY zGmEHra^3jQ^5I3jcng)9VuX^KDO?%0Yb}|>cR5g->w4z=O+gzg3;PESCyQ@+K;F9x zQAi~!Sy9@ZSzZ@OwOu$wKP)~#cB!)_Yo|I=M?KkA{HVWE&@>4})MNm!jfj@g2(uTJ zI7q(S(ancV#%Y+g0jHW)`ds<ohW-WP&Ew&2-GW(!W~B0|&%16op@VgzTk&*6K_uY16Rq z{1}%af!U@Kn@=4}+?X;eYn1~+*b~DJAML*Nt&;qr0hdR3)a`kOudt}08 z3}95$y<6S$88TSm5ic_}ge(*D4;p0b;V<58<5Vbcw>DxgHHwh=Ih>(!Bg2?(neoae zCPN;Olm6DJ_(O>*#)uro?+b1tXEN#XOS1KkctP@@1%>-RN8@F8L0n=7F`d_<1@L)*pq<=Rnv6Jvild5 zu8WuW#BoslSpv*)1?A+&GWq${l@8vx?sOX@x1{H2h`M)!(8A1L_5&JESrOwGYzxu zd0#CyCx}Pc1N4+GS%-gr+jeVOQ!TdI9t;tc3(CXpW;(P^ zEIT&v$^BWTA2jB@e%sTi08t18&0rxce&s6CX3})kD zs>-Ue4u%K$`+D;9XMtGzD@id6w~d@bOAsE@QO*7=w@?HE)&TKgPaNO)86cqRT*bnb z$eyz!PTy(DWdkk7pB=z*krbzIO{_bkHMu-}E3?pV0iBHon7rLS$k%wGb8_gR$QLe^ z@y6wi@Z{2-spJ+RiDa$X+%zFBc1&o%y@c3rxQ{z4T_nhr8%Dibf@BtTJ@q|p1XVRI z?s%?#@?W|DiilQEz19bd2}J3eJRq@AtMAif=w9|vqkCJgi~Rl{MBu!rgwm~|u{X_P z!LBeY0&GH7y^naWyms>+x((C$gAXn_&Ae7RD=$K4)wAeR*lCoq!ZF9QdTT~>Y?C52 zN#cwpJugCy`4y8Y7|oP{?7R>=iU{^}3l(6ZrKS&;!o}*%@UrCxq_NB+k zQ8%#YVC7Eq_*q_Rr3;Csw`R0jr!l^#A;d&UVnNsIUgY`e| zD1|8Ugq86U8o<0j3;)Snkalq<&WUYXa@QXKo)a;LUPrtO22FI(6iiZXdvQ6fjE@14 z`J{%v5}i(J)E-cR4o-B+tLEAGxz+)T^<%>)QTc0w{oe>){whrOugyF}cdd3rg#v(a zd~u`-gGHR!X1z{l=>L_MRzOjouKyT0)_xA89RD-!O`)R%!%lf8gvJ8cs7?Kh{Lv`O z5GU%hOf6P`KTaFrH_l0t5}f51h^V+Ld*x}vn^%PdiDxOUMw7^s3g-uF6`*UcW`R3y zV&Oo8zh&C5e}o+=*KuK4jTvxrpB^_~+aF(&bLtZkx1Z=<6E|&8Us2oce-O3;en00L zgzlkhea-hFw+TV7_;-XCDAcff^EAib7r|@7@`+skw!(iB!u`!&5Z)X{#8jQBOkNhKd4o(yp&S-47Ot0~Gj>~- z-$f?32wd5MhAvXQFVwG648LiddgTAIBR82&*$fUZfow`e0tb-5AdQ=<9K{wU0ql;N zOe0CKEgQ2PjTqf|5*-th7gO~LVkNKi>PisUnN^*u5GaV1)vQQQ zyMlI2@F8iJ@o1xNn)9o2#HO|!VexO=;=x+(BU68XZ z4SCZe0KC2S4HaC1qA~FkSd_1fyxdl5D+pTg{Ig(y~6HZBh%sfigUv{ z-l2W*iBMvN>&kBDy3t!U4_=wcr&~R)u9$T?->*XV5qo1rg#1+H8tn^eCsJWTh!Z6K z{|lWLTAcNLs%Pt}Jh9~N(1tX)NL|Cl+4ykW;d&ZPn;oMsR6fA|`TGciPC_+A^J+ZZ z6aYkcopM)Fxk0;nxX35Jvt+9T?rJm$X%#aHW`fvExA?n#6$oQ-I#bxXt!Clo(D=GM zf}=j+npM2evtoBfop3vM$0Q;$XD+Y+)C10w9yS#uZI#ya{^JBkQp*(R&?__&7_~R( z5J$Kqf4I9(7A!`= zle>=~^Xe2`Ri+(id@V1N*O*2z$pYM3fwbPy`Rw20bmDY)!`M5}8TV>OnIUFJXNV28 zu>g*_b$c_JTqIeHo1PXYg-}ATZ8QEr>t5GdhZ>dj&|FiY4%suGGB3(h^*_o z2ASHQXC`m4Hgf8pIzg?LD~bZ1y$kyHa>GC4L^;Swh+K&U^>VbNCopIesNbuRXGwWU z*?pvcmOf_4)@)dYW}^BbHYroy_M zt(2}~n!lgeDWt>*hHAbD!J|K(NYmVI>7ylp{gXA;=Q5>WT<^ZVONT$&U2{80L0y^e zJt{BGPR$&H|2Q3u-0)bKRlZH}`0LN#+m>LBFkFo^JS#%aSK~>B38GF08-TdRNdt(B zUkOqz)@1O2(38)Mjm!FMaM5_BGzBjV844-SvKsk4ie0FhO-(rAug<92yO{o}UIV_v zZ4sv*T|5!7-f2X++wM;aGf~f`NXK6Z>f6&+j~<*B%E7mi$qWajM|)=P%>Q=^RBZGX zdim~%4&S*>5+Fdbd~i~r0SPQMAXH5*dP4#y7gwrT#)Yz>UP!qX#O)KuD+uOj!?MQSMU!2Liuog8Z0(y%VW

I7)Vk9WC%4njHa1TxP_P!@bm=4!3#zvFUi4}Q)OjTEVdPaDG^X54sI3E z?mwdF0&up)Wq9gzIY^6Pc3Bpr@9#cR3%2CvQ#*P9Ey0a1@BkzHz4`Zf>8tJ+U8{xe zo@M@+w{&T~znK&4PVkkj13G;^7J~!zb~)kF;8`vIBx92?ncL6*MTNJ{%g%&*8EK)^ z3oyHV^E93M4V;~RpFUpv+aSsKO^Du5;#R=bvE@WZbI^q&t!)b{Zw8e@$ZEwnPtuOy*tUwEP^i1>Zg4?aubOFOA$03beH~H|-8INP2rrQy2ckS?eE`Aow!CWQN z3iYwup2byE&2X%H$RYlRdJkdapqf>vwABQV5E`t@$*Ai77+w_Y`%y$ZM`a$u>mw8c zg*?ZU>!oNT-z~@9%Sk!;5i6VX$E*#NTYR!q3}xAhnM2A`jSq!p;1HW5B&1t&T8$$LaF@Y3)P}@XpHK)bYg(Y z9YaZq1Ul9OhuI%Hj}xl(_IZI**qeY#H2s@F9X?C!;o362G)9q%m4fw45M3 z%L}us(=k=y?F4dG-j3Y!T2!dcrxyWkwR&9x!eVdfiWNn%W(>p2->`-hR$nk@~sa;{ook)4NH)%e4>->lER5-^zEN+!eV;5zNZtU4JIDy5@b)2Ao*}2@*2+ zDR(`dMz5y%GWW1uRKSqPd16^Zw= zFW(%>$w>FK!xr6|SPu1DA$W}`I=vLL6tDJp1^Z3k?hP>atuWvx<72ZLK?b=d{XJWQ zMQFs;&6HAxlwzCKqLuAV1yC?c)5S@gN)6l!CymBWwn#X^&(hHkn$TG6<`{FltnmyV z^Iv8Qp9EVAZ^XI%t$y1tEur~MEc3RPl7}aRM_pk&g*}tgv=^45o2goUojeYFJQz3I z#5w#^HN1qCE7{ub8hgG1l|$T?9Au6k`-tauC1p^+u&J=;~~oaO55v`O=4;fjmYtQ4r5 znCUGpDCD~V_1$)OB?{du2k6(cqLLAHO?3iW8oQ9gSyX&vbY zGIL9Gde<-1pqjmrYx}N{Oh-WyGqoA}rFt z03l~tX_`>dZ_a((7-J!dWkNJ5JRTcR!paOI6E3Vhlx>U(qMBJHJ37uKF9qVHLMu#i z$B@b~+JL9GXS4Q5pXzdZy_a0PpymSOJ4 zPGKPhgd$bmOS-4tA|%h#L16ovMa!r3HP8t%M(q025zDnUQ67OeRCd=|%6aG`7I2&K zabK(Avym67HKjPG>&_w$_G!+JWnq+um57q_Bc2wctXq0s#tA}5R5`(6js$uLK0 zj;mt$RkD91P77N1{UcxTjq!Cs%=lWpR#>S7s5>w(k}4F|-gvKz!TF(ymk^6fN#rjC zIEc;7T;pxZSSyMB=7|~#=VJgQD&0g4Y)0>jCGEGY8-I!uJpz@~t)&=6vP_>KR0KYn9A0jGum0S!;Fs2VHko@K`+0;5_? zM5k^U>$5CxCA8yM=l(#-mZ`u?e&F7M91Bl43~XHdUqfJE8yJT}cbaMt{4@3jny1 z8~yBwH~b*-9rSnqPi&kP(|Mgy6>*@Vm{Sc8uyFpACCm4XVFlAt0-Bk^gjxjU^8rJ33|Kw!|qmT*9&A>3lcwgr!;u6 znR$(hm&bJgZL8bNx0FGvTw95gvKjh6O5o5FpIQ(vtr{djj#ps@#PmW=*x=-m6kb1W zJe`y7*GLNn`}dRpU(uh*d%K60JhI0(Cpwn!(&zliHjnTNXRs)-=FiL8d)&`>D_wS; z4;2!vaeFM(2k1 z4F{f%`41y(X8MH0c?EpE!3=yrCRuiA^XICSMw()(i8ny`#g>&Ck`XgGbpne8z4F%C zd71_&omog1A2mUS9-{6}%YL%bvnnE!bUe|$q{)@|Ms=Dy=emLz)kT>% z2tTHI80bFr5qJo$_+rDsTeKwo$WJwPj97;w;RzQX@4BZlAZ&ox^!HBUZ|IzK&~9{M{K{ zJ<;;Z2FW~JkBJ0n38vwBAaGDRUoc=OaUolgXtxg(H!vim2@HbWmzk}qqhpKxoJ`ow z!t}i>!t;h~`)NDcb;3-h|0?`JXWJlGEu~i@?j1qEU>Nk)ejMeFdX;T(nsO0U&Hip}F`S$D()AEl zyeS|3s_!F_2aC*M0d{EBPTSX|k3p}qQB?s|N&UiO_pFwKkC4K6BE7bLN?LjAoIRx8 z9%uacH~xf2WS^EoL+5C6xozFJWm>JaIU~nLI112b8~l$%4=~8}!p7`)hS~_MSJH1fT z?Ol@PqV#Mf^dDD|J2%YPwme0`lc%4aE5F-X*|rNga{vj$+L`~M1d388?skINYfe?K zFEjpu#K(AOBLJI8pTD+d`+ke1OR3kBl<-tfqm2;Rhm{k9YNI@_AB)4j_@!J2nOw4& z==&+!WX_Q|;FIx#r#ai@jZ_Q?Yc_NDCDOiqQrKD&{eyoy;7rGHN!ivapRGMnDE!DsUBy&slp!g=UU zSfu2oNm)mf9W;Z1J5;o;TQF=MA2oVAsr%00`X1uycwL@Vyjvs!81+h;k_+&n%mjnaU zs_jDfi<=~P! z|N3#=gD5XbPNSObve#jO)Ku-&MJ~2JMTb$ROV2@A`c=McxG>eUCX{b8u2B6MkXhHh z$NhoqA9kH?cTdmo3e#P*M%HEO*@{8$?RxV>9bm@`3R5xjH6?0#kM+hkcJZDyliVyh zb}{{;ku=#W_I6Juk!_xKBqjY%)Sxk@6%!lRUBhoH~ySh~ky7aU`mTho%KJ(9g+obpCQtE7In`&Vuk4 zr3Wkz<%!)jVB-6n&h8J_}PO$@?u@8A9fBT;`*?1n{&qlYfx zAqF0d=faJjI#Sh!mk+dyas|`TFaK)s=(8_^0va zyoawEwakgJjDg;XG*>*T-OFFfiuGE1%LH&Y&bhlIcSPROE!ni0(o|A(vGHU7r7gYo zs`$4Uy}@6&{HmX;wQkRt8)*E2$z+bA=#b|rBpYdm>@~q)KW9LXgl(#O_Y9Bn= zi-Pgt_#g|T4u8NEY@7&-u6H#gm2a`k!TO+0d|$5|yHbU(Je8q65gV=RFHFmCa7uYzDu)@FX=myoR;0h=6*Qy~XXI z3UyMm%+k_JuV>`P_C(I9DT`|RIsdh<-FtC&XG0LJ`>-Jl__sOzP&K_Y@vmF`OrWo~ zykOwH`wnJrRPWi4iX&A;=H_iT_A_`c@n3h%h z6)XH;$yhL4sC`IRU8ruV57`}gtL3guI2mX6_tZ14lq(b$Q-C6g+sc?QoK~GXwE(L@ zj&oUJU5KCn9Zs6%T4Aw(s6mOzJZo4e`un!<+J$uoa0`xe6dv`N%Zw2~^OgXwTUX+1lFAm3J*N!g4l>~6{2$i*j6f^%# zig-Y#E=6;tw7|~|J^%-wr8iSf^}?+rzHQ`EdPPR%pXqvWt{MH*k+xy$Q^S+pd?KRV zS+5#1F8SOQViO%>Gck49EsdR(uysY^zlUpT+?-z4xbiiLONUgPFQXBA0WNMb*nrfd zW=6GlNSa#$b*7@lsPS2`?U?3O+X@~%-g~Cq>VuFAc1=Qf3qTdm?|kZGV*f9~BYqrO zE@SwAc(n~pMkPkL-l7)uVrk+%6BE)hp?bBxLqTvnvnohJ#`_v3ANj zwkE&U%}3XV+W}@~GWb*ZW>}Ie(GOGd%TEp29`4rLT1<&X0^Ha6Eyxq{C$Nj-`d{

GI!2g|GrYxN~v!77U? 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≥M?ixrI?O^{8YZvBR}#K(WnR3uT%H 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 delta 330472 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 Date: Tue, 31 Oct 2023 16:04:56 +0000 Subject: [PATCH 8/8] back_to_pop_graph --- build/lib/torchdrug/tasks/reasoning.py | 6 +----- dist/torchdrug-0.2.1-py3.9.egg | Bin 615535 -> 615414 bytes torchdrug/core/engine.py | 1 - 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/build/lib/torchdrug/tasks/reasoning.py b/build/lib/torchdrug/tasks/reasoning.py index faca21be..802c44c0 100644 --- a/build/lib/torchdrug/tasks/reasoning.py +++ b/build/lib/torchdrug/tasks/reasoning.py @@ -126,7 +126,6 @@ def forward(self, batch, all_loss=None, metric=None): return all_loss, metric def predict(self, batch, all_loss=None, metric=None): - print('Working in Torchdrug itself...You need to change a lot in here...') pos_h_index, pos_t_index, pos_r_index = batch.t() batch_size = len(batch) @@ -167,7 +166,6 @@ def predict(self, batch, all_loss=None, metric=None): return pred def target(self, batch): - print('Working in Torchdrug itself...You need to change a lot in here...') # test target batch_size = len(batch) pos_h_index, pos_t_index, pos_r_index = batch.t() @@ -194,7 +192,6 @@ def target(self, batch): return mask.cpu(), target.cpu() def evaluate(self, pred, target): - print('Working in Torchdrug itself...You need to change a lot in here...') mask, target = target pos_pred = pred.gather(-1, target.unsqueeze(-1)) @@ -226,7 +223,6 @@ def visualize(self, batch): @torch.no_grad() def _strict_negative(self, pos_h_index, pos_t_index, pos_r_index): - print('Working in Torchdrug itself...You need to change a lot in here...') batch_size = len(pos_h_index) any = -torch.ones_like(pos_h_index) @@ -254,4 +250,4 @@ def _strict_negative(self, pos_h_index, pos_t_index, pos_r_index): neg_index = torch.cat([neg_t_index, neg_h_index]) - return neg_index \ No newline at end of file + return neg_index diff --git a/dist/torchdrug-0.2.1-py3.9.egg b/dist/torchdrug-0.2.1-py3.9.egg index 761d8a35d67befa9bb5ff88ce9c994bc801dc323..351ae75152c7b49b46445270aa73f0ff8213fa46 100644 GIT binary patch delta 54253 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�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 z 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