From bb45107bdc57b72eec5a64527f941da5d4e8edb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=85=95=E7=99=BD?= Date: Wed, 29 Apr 2026 19:12:53 +0800 Subject: [PATCH 1/8] refactor(cpp): embed nested field codec specs --- README.md | 6 + benchmarks/cpp/benchmark.cc | 58 +- compiler/fory_compiler/cli.py | 5 +- compiler/fory_compiler/generators/cpp.py | 212 +- compiler/fory_compiler/ir/validator.py | 6 +- .../tests/test_collection_nesting.py | 11 + .../tests/test_generated_code.py | 28 +- cpp/README.md | 22 +- cpp/fory/meta/BUILD | 1 + cpp/fory/meta/field.h | 1770 +---------------- cpp/fory/meta/field_info.h | 318 ++- cpp/fory/meta/field_test.cc | 418 +--- cpp/fory/serialization/BUILD | 9 - .../serialization/field_serializer_test.cc | 1211 ----------- .../serialization/namespace_macro_test.cc | 81 +- cpp/fory/serialization/serializer_traits.h | 15 +- .../smart_ptr_serializer_test.cc | 32 +- cpp/fory/serialization/struct_serializer.h | 572 +++++- cpp/fory/serialization/struct_test.cc | 170 +- cpp/fory/serialization/type_resolver.cc | 1 - cpp/fory/serialization/type_resolver.h | 404 +++- cpp/fory/serialization/union_serializer.h | 471 ++++- cpp/fory/serialization/xlang_test_main.cc | 146 +- docs/compiler/generated-code.md | 4 +- docs/compiler/schema-idl.md | 7 +- docs/guide/cpp/field-configuration.md | 576 +----- docs/guide/cpp/polymorphism.md | 46 +- docs/guide/xlang/field-nullability.md | 27 +- docs/guide/xlang/field-reference-tracking.md | 12 +- docs/guide/xlang/field-type-meta.md | 28 +- .../org/apache/fory/xlang/CPPXlangTest.java | 12 + 31 files changed, 2393 insertions(+), 4286 deletions(-) delete mode 100644 cpp/fory/serialization/field_serializer_test.cc diff --git a/README.md b/README.md index f22583a902..6f0eb39d64 100644 --- a/README.md +++ b/README.md @@ -358,6 +358,12 @@ struct Person { }; FORY_STRUCT(Person, name, age); +struct Event { + uint32_t id; + uint64_t timestamp; +}; +FORY_STRUCT(Event, (id, fory::F(0).varint()), (timestamp, fory::F(1).tagged())); + int main() { // Create Fory instance - should be reused across serializations auto fory = Fory::builder().build(); diff --git a/benchmarks/cpp/benchmark.cc b/benchmarks/cpp/benchmark.cc index f1d65bff40..b9ed84e5c6 100644 --- a/benchmarks/cpp/benchmark.cc +++ b/benchmarks/cpp/benchmark.cc @@ -49,9 +49,9 @@ struct NumericStruct { } MSGPACK_DEFINE_MAP(f1, f2, f3, f4, f5, f6, f7, f8); }; -FORY_STRUCT(NumericStruct, f1, f2, f3, f4, f5, f6, f7, f8); -FORY_FIELD_TAGS(NumericStruct, (f1, 1), (f2, 2), (f3, 3), (f4, 4), (f5, 5), - (f6, 6), (f7, 7), (f8, 8)); +FORY_STRUCT(NumericStruct, (f1, fory::F(1)), (f2, fory::F(2)), (f3, fory::F(3)), + (f4, fory::F(4)), (f5, fory::F(5)), (f6, fory::F(6)), + (f7, fory::F(7)), (f8, fory::F(8))); struct Sample { int32_t int_value; @@ -103,20 +103,17 @@ struct Sample { int_array, long_array, float_array, double_array, short_array, char_array, boolean_array, string); }; -FORY_STRUCT(Sample, int_value, long_value, float_value, double_value, - short_value, char_value, boolean_value, int_value_boxed, - long_value_boxed, float_value_boxed, double_value_boxed, - short_value_boxed, char_value_boxed, boolean_value_boxed, int_array, - long_array, float_array, double_array, short_array, char_array, - boolean_array, string); -FORY_FIELD_TAGS(Sample, (int_value, 1), (long_value, 2), (float_value, 3), - (double_value, 4), (short_value, 5), (char_value, 6), - (boolean_value, 7), (int_value_boxed, 8), (long_value_boxed, 9), - (float_value_boxed, 10), (double_value_boxed, 11), - (short_value_boxed, 12), (char_value_boxed, 13), - (boolean_value_boxed, 14), (int_array, 15), (long_array, 16), - (float_array, 17), (double_array, 18), (short_array, 19), - (char_array, 20), (boolean_array, 21), (string, 22)); +FORY_STRUCT(Sample, (int_value, fory::F(1)), (long_value, fory::F(2)), + (float_value, fory::F(3)), (double_value, fory::F(4)), + (short_value, fory::F(5)), (char_value, fory::F(6)), + (boolean_value, fory::F(7)), (int_value_boxed, fory::F(8)), + (long_value_boxed, fory::F(9)), (float_value_boxed, fory::F(10)), + (double_value_boxed, fory::F(11)), (short_value_boxed, fory::F(12)), + (char_value_boxed, fory::F(13)), (boolean_value_boxed, fory::F(14)), + (int_array, fory::F(15)), (long_array, fory::F(16)), + (float_array, fory::F(17)), (double_array, fory::F(18)), + (short_array, fory::F(19)), (char_array, fory::F(20)), + (boolean_array, fory::F(21)), (string, fory::F(22))); // Enums for MediaContent benchmark enum class Player : int32_t { JAVA = 0, FLASH = 1 }; @@ -150,11 +147,11 @@ struct Media { MSGPACK_DEFINE_MAP(uri, title, width, height, format, duration, size, bitrate, has_bitrate, persons, player, copyright); }; -FORY_STRUCT(Media, uri, title, width, height, format, duration, size, bitrate, - has_bitrate, persons, player, copyright); -FORY_FIELD_TAGS(Media, (uri, 1), (title, 2), (width, 3), (height, 4), - (format, 5), (duration, 6), (size, 7), (bitrate, 8), - (has_bitrate, 9), (persons, 10), (player, 11), (copyright, 12)); +FORY_STRUCT(Media, (uri, fory::F(1)), (title, fory::F(2)), (width, fory::F(3)), + (height, fory::F(4)), (format, fory::F(5)), (duration, fory::F(6)), + (size, fory::F(7)), (bitrate, fory::F(8)), + (has_bitrate, fory::F(9)), (persons, fory::F(10)), + (player, fory::F(11)), (copyright, fory::F(12))); struct Image { std::string uri; @@ -169,9 +166,8 @@ struct Image { } MSGPACK_DEFINE_MAP(uri, title, width, height, size); }; -FORY_STRUCT(Image, uri, title, width, height, size); -FORY_FIELD_TAGS(Image, (uri, 1), (title, 2), (width, 3), (height, 4), - (size, 5)); +FORY_STRUCT(Image, (uri, fory::F(1)), (title, fory::F(2)), (width, fory::F(3)), + (height, fory::F(4)), (size, fory::F(5))); struct MediaContent { Media media; @@ -182,8 +178,7 @@ struct MediaContent { } MSGPACK_DEFINE_MAP(media, images); }; -FORY_STRUCT(MediaContent, media, images); -FORY_FIELD_TAGS(MediaContent, (media, 1), (images, 2)); +FORY_STRUCT(MediaContent, (media, fory::F(1)), (images, fory::F(2))); struct StructList { std::vector struct_list; @@ -193,8 +188,7 @@ struct StructList { } MSGPACK_DEFINE_MAP(struct_list); }; -FORY_STRUCT(StructList, struct_list); -FORY_FIELD_TAGS(StructList, (struct_list, 1)); +FORY_STRUCT(StructList, (struct_list, fory::F(1))); struct SampleList { std::vector sample_list; @@ -204,8 +198,7 @@ struct SampleList { } MSGPACK_DEFINE_MAP(sample_list); }; -FORY_STRUCT(SampleList, sample_list); -FORY_FIELD_TAGS(SampleList, (sample_list, 1)); +FORY_STRUCT(SampleList, (sample_list, fory::F(1))); struct MediaContentList { std::vector media_content_list; @@ -215,8 +208,7 @@ struct MediaContentList { } MSGPACK_DEFINE_MAP(media_content_list); }; -FORY_STRUCT(MediaContentList, media_content_list); -FORY_FIELD_TAGS(MediaContentList, (media_content_list, 1)); +FORY_STRUCT(MediaContentList, (media_content_list, fory::F(1))); // ============================================================================ // Test data creation diff --git a/compiler/fory_compiler/cli.py b/compiler/fory_compiler/cli.py index 541e100a12..c0620b8547 100644 --- a/compiler/fory_compiler/cli.py +++ b/compiler/fory_compiler/cli.py @@ -520,7 +520,10 @@ def compile_file( print("======================") # Validate merged schema - validator = SchemaValidator(schema) + allow_nested_collections = set(lang_output_dirs) == {"cpp"} + validator = SchemaValidator( + schema, allow_nested_collections=allow_nested_collections + ) if not validator.validate(): for error in validator.errors: print(f"Error: {error}", file=sys.stderr) diff --git a/compiler/fory_compiler/generators/cpp.py b/compiler/fory_compiler/generators/cpp.py index f1b6f4de6b..bb278f23d2 100644 --- a/compiler/fory_compiler/generators/cpp.py +++ b/compiler/fory_compiler/generators/cpp.py @@ -125,14 +125,6 @@ def get_namespaced_type_name( return f"{namespace}::{qualified_name}" return qualified_name - def get_field_config_type( - self, - type_name: str, - parent_stack: List[Message], - ) -> str: - """Get type name for FORY_FIELD_CONFIG.""" - return self.get_namespaced_type_name(type_name, parent_stack) - def is_imported_type(self, type_def: object) -> bool: """Return True if a type definition comes from an imported IDL file.""" if not self.schema.source_file: @@ -252,7 +244,6 @@ def generate_header(self) -> GeneratedFile: includes: Set[str] = set() enum_macros: List[str] = [] union_macros: List[str] = [] - field_config_macros: List[str] = [] evolving_macros: List[str] = [] definition_items = self.get_definition_order() @@ -342,7 +333,6 @@ def generate_header(self) -> GeneratedFile: [], enum_macros, union_macros, - field_config_macros, evolving_macros, "", ) @@ -353,10 +343,6 @@ def generate_header(self) -> GeneratedFile: lines.extend(union_macros) lines.append("") - if field_config_macros: - lines.extend(field_config_macros) - lines.append("") - if enum_macros: lines.extend(enum_macros) lines.append("") @@ -658,12 +644,14 @@ def get_field_storage_type( return f"std::unique_ptr<{type_name}>" return self.generate_type( field.field_type, - False - if ( - self.is_message_type(field.field_type, parent_stack) - and (field.ref or weak_ref) - ) - else field.optional, + ( + False + if ( + self.is_message_type(field.field_type, parent_stack) + and (field.ref or weak_ref) + ) + else field.optional + ), field.ref, field.element_optional, field.element_ref, @@ -878,7 +866,6 @@ def generate_message_definition( parent_stack: List[Message], enum_macros: List[str], union_macros: List[str], - field_config_macros: List[str], evolving_macros: List[str], indent: str, ) -> List[str]: @@ -908,7 +895,6 @@ def generate_message_definition( lineage, enum_macros, union_macros, - field_config_macros, evolving_macros, body_indent, ) @@ -959,13 +945,7 @@ def generate_message_definition( lines.append("") lines.append(f"{body_indent}public:") field_members = ", ".join( - self.get_field_member_name(f) for f in message.fields - ) - field_config_type_name = self.get_field_config_type( - message.name, parent_stack - ) - field_config_macros.append( - self.generate_field_config_macro(message, field_config_type_name) + self.get_field_macro_entry(f) for f in message.fields ) lines.append( f"{body_indent}FORY_STRUCT({struct_type_name}, {field_members});" @@ -1144,7 +1124,7 @@ def generate_union_macros( case_ctor = self.to_snake_case(field.name) meta = self.get_union_field_meta(field) suffix = "," if index + 1 < len(union.fields) else "" - lines.append(f" ({case_type}, {case_ctor}, {meta}){suffix}") + lines.append(f" ({case_ctor}, {case_type}, {meta}){suffix}") lines.append(");") return lines @@ -1539,39 +1519,40 @@ def generate_namespaced_type( return "void*" - def generate_field_config_macro( - self, - message: Message, - qualified_name: str, - ) -> str: - """Generate FORY_FIELD_CONFIG macro for a message.""" - entries = [] - for field in message.fields: - field_name = self.get_field_member_name(field) - meta = self.get_field_meta(field) - entries.append(f"({field_name}, {meta})") - joined = ", ".join(entries) - return f"FORY_FIELD_CONFIG({qualified_name}, {joined});" + def get_field_macro_entry(self, field: Field) -> str: + """Build one FORY_STRUCT field entry.""" + return f"({self.get_field_member_name(field)}, {self.get_field_meta(field)})" def get_field_meta(self, field: Field) -> str: """Build FieldMeta expression for a field.""" - meta = "fory::F()" + if field.tag_id is not None: + meta = f"fory::F({field.tag_id})" + else: + meta = "fory::F()" is_any = ( isinstance(field.field_type, PrimitiveType) and field.field_type.kind == PrimitiveKind.ANY ) - if field.tag_id is not None: - meta += f".id({field.tag_id})" if field.optional or is_any: meta += ".nullable()" if field.ref: meta += ".ref()" - encoding = self.get_encoding_config(field.field_type) - if encoding: - meta += encoding - array_type = self.get_array_type_config(field) - if array_type: - meta += array_type + spec = self.get_field_type_spec(field) + if spec: + if field.optional or field.ref: + meta += f".inner({spec})" + elif spec.startswith("fory::T::list("): + meta += f".list({spec[len('fory::T::list('):-1]})" + elif spec.startswith("fory::T::set("): + meta += f".set({spec[len('fory::T::set('):-1]})" + elif spec.startswith("fory::T::map("): + meta += f".map({spec[len('fory::T::map('):-1]})" + elif spec.endswith(".fixed()"): + meta += ".fixed()" + elif spec.endswith(".varint()"): + meta += ".varint()" + elif spec.endswith(".tagged()"): + meta += ".tagged()" return meta def get_union_field_meta(self, field: Field) -> str: @@ -1585,52 +1566,93 @@ def get_union_field_meta(self, field: Field) -> str: meta += ".nullable()" if field.ref: meta += ".ref()" - encoding = self.get_encoding_config(field.field_type) - if encoding: - meta += encoding - array_type = self.get_array_type_config(field) - if array_type: - meta += array_type + spec = self.get_field_type_spec(field) + if spec: + if field.optional or field.ref: + meta += f".inner({spec})" + elif spec.startswith("fory::T::list("): + meta += f".list({spec[len('fory::T::list('):-1]})" + elif spec.startswith("fory::T::set("): + meta += f".set({spec[len('fory::T::set('):-1]})" + elif spec.startswith("fory::T::map("): + meta += f".map({spec[len('fory::T::map('):-1]})" + elif spec.endswith(".fixed()"): + meta += ".fixed()" + elif spec.endswith(".varint()"): + meta += ".varint()" + elif spec.endswith(".tagged()"): + meta += ".tagged()" return meta - def get_encoding_config(self, field_type: FieldType) -> str: - """Return encoding config for primitive types.""" - kind = None - if isinstance(field_type, PrimitiveType): - kind = field_type.kind - elif isinstance(field_type, ListType) and isinstance( - field_type.element_type, PrimitiveType - ): - kind = field_type.element_type.kind - if kind is None: - return "" - if kind in ( - PrimitiveKind.INT32, - PrimitiveKind.INT64, - PrimitiveKind.UINT32, - PrimitiveKind.UINT64, - ): - return ".fixed()" - if kind in (PrimitiveKind.VAR_UINT32, PrimitiveKind.VAR_UINT64): - return ".varint()" - if kind in (PrimitiveKind.TAGGED_INT64, PrimitiveKind.TAGGED_UINT64): - return ".tagged()" - return "" + def get_field_type_spec(self, field: Field) -> str: + """Return the T-node spec for a field when generated metadata needs it.""" + return self.get_type_spec( + field.field_type, + field.element_optional, + field.element_ref, + ) - def get_array_type_config(self, field: Field) -> str: - """Return array type override for int8/uint8 arrays.""" - if not isinstance(field.field_type, ListType): - return "" - if field.element_optional or field.element_ref: - return "" - element_type = field.field_type.element_type - if not isinstance(element_type, PrimitiveType): - return "" - if element_type.kind == PrimitiveKind.INT8: - return ".int8_array()" - if element_type.kind == PrimitiveKind.UINT8: - return ".uint8_array()" - return "" + def get_type_spec( + self, + field_type: FieldType, + optional: bool = False, + ref: bool = False, + ) -> str: + """Return a recursive fory::T spec for generated C++ metadata.""" + if isinstance(field_type, PrimitiveType): + spec = self.get_primitive_type_spec(field_type.kind) + elif isinstance(field_type, ListType): + element = self.get_type_spec( + field_type.element_type, + field_type.element_optional, + field_type.element_ref, + ) + if not element: + element = "fory::FieldNodeSpec{}" + spec = f"fory::T::list({element})" + elif isinstance(field_type, MapType): + key = self.get_type_spec(field_type.key_type) + value = self.get_type_spec( + field_type.value_type, + field_type.value_optional, + field_type.value_ref, + ) + if not key: + key = "fory::FieldNodeSpec{}" + if not value: + value = "fory::FieldNodeSpec{}" + spec = f"fory::T::map({key}, {value})" + else: + spec = "" + + if (optional or ref) and spec: + return f"fory::T::inner({spec})" + return spec + + def get_primitive_type_spec(self, kind: PrimitiveKind) -> str: + """Return a scalar T-node spec for primitive encoding metadata.""" + typed = { + PrimitiveKind.BOOL: "fory::T::boolean()", + PrimitiveKind.INT8: "fory::T::int8()", + PrimitiveKind.INT16: "fory::T::int16()", + PrimitiveKind.INT32: "fory::T::int32().fixed()", + PrimitiveKind.VARINT32: "fory::T::int32().varint()", + PrimitiveKind.INT64: "fory::T::int64().fixed()", + PrimitiveKind.VARINT64: "fory::T::int64().varint()", + PrimitiveKind.TAGGED_INT64: "fory::T::int64().tagged()", + PrimitiveKind.UINT8: "fory::T::uint8()", + PrimitiveKind.UINT16: "fory::T::uint16()", + PrimitiveKind.UINT32: "fory::T::uint32().fixed()", + PrimitiveKind.VAR_UINT32: "fory::T::uint32().varint()", + PrimitiveKind.UINT64: "fory::T::uint64().fixed()", + PrimitiveKind.VAR_UINT64: "fory::T::uint64().varint()", + PrimitiveKind.TAGGED_UINT64: "fory::T::uint64().tagged()", + PrimitiveKind.FLOAT16: "fory::T::float16()", + PrimitiveKind.FLOAT32: "fory::T::float32()", + PrimitiveKind.FLOAT64: "fory::T::float64()", + PrimitiveKind.STRING: "fory::T::string()", + } + return typed.get(kind, "") def generate_type( self, diff --git a/compiler/fory_compiler/ir/validator.py b/compiler/fory_compiler/ir/validator.py index acd7741778..0553c7524c 100644 --- a/compiler/fory_compiler/ir/validator.py +++ b/compiler/fory_compiler/ir/validator.py @@ -54,8 +54,9 @@ def __str__(self) -> str: class SchemaValidator: """Validates a Fory IR schema.""" - def __init__(self, schema: Schema): + def __init__(self, schema: Schema, allow_nested_collections: bool = False): self.schema = schema + self.allow_nested_collections = allow_nested_collections self.errors: List[ValidationIssue] = [] self.warnings: List[ValidationIssue] = [] @@ -67,7 +68,8 @@ def validate(self) -> bool: self._check_messages() self._check_type_references() self._check_services() - self._check_collection_nesting() + if not self.allow_nested_collections: + self._check_collection_nesting() self._check_ref_rules() self._check_weak_refs() return not self.errors diff --git a/compiler/fory_compiler/tests/test_collection_nesting.py b/compiler/fory_compiler/tests/test_collection_nesting.py index 881451aeb5..efb1ee6223 100644 --- a/compiler/fory_compiler/tests/test_collection_nesting.py +++ b/compiler/fory_compiler/tests/test_collection_nesting.py @@ -79,3 +79,14 @@ def test_map_with_list_key_rejected(): } """ assert_nested_collections_rejected(source) + + +def test_nested_collections_allowed_for_capable_targets(): + source = """ + message Foo { + map> values = 1; + } + """ + schema = parse_schema(source) + validator = SchemaValidator(schema, allow_nested_collections=True) + assert validator.validate(), validator.errors diff --git a/compiler/fory_compiler/tests/test_generated_code.py b/compiler/fory_compiler/tests/test_generated_code.py index f35d24742e..7539c9acf9 100644 --- a/compiler/fory_compiler/tests/test_generated_code.py +++ b/compiler/fory_compiler/tests/test_generated_code.py @@ -86,9 +86,9 @@ def assert_language_outputs_equal( baseline_label = label baseline_files = files continue - assert files == baseline_files, ( - f"{generator_cls.language_name} output mismatch for {label} vs {baseline_label}" - ) + assert ( + files == baseline_files + ), f"{generator_cls.language_name} output mismatch for {label} vs {baseline_label}" def assert_all_languages_equal(schemas: Dict[str, Schema]) -> None: @@ -596,6 +596,26 @@ def test_java_nested_integer_annotations_in_generic_containers(): ) +def test_cpp_nested_integer_specs_in_generic_containers(): + schema = parse_fdl( + dedent( + """ + package gen; + + message NestedIntegerSpecs { + map> values = 1; + } + """ + ) + ) + cpp_output = render_files(generate_files(schema, CppGenerator)) + assert ( + "FORY_STRUCT(NestedIntegerSpecs, " + "(values_, fory::F(1).map(fory::T::uint32().fixed(), " + "fory::T::list(fory::T::inner(fory::T::uint64().tagged())))));" in cpp_output + ) + + def test_cpp_generator_supports_decimal_fields_and_unions(): schema = parse_fdl( dedent( @@ -618,7 +638,7 @@ def test_cpp_generator_supports_decimal_fields_and_unions(): assert '#include "fory/serialization/decimal_serializers.h"' in cpp_output assert "const fory::serialization::Decimal& amount() const" in cpp_output assert "std::variant value_" in cpp_output - assert "(fory::serialization::Decimal, amount, fory::F(1))" in cpp_output + assert "(amount, fory::serialization::Decimal, fory::F(1))" in cpp_output def test_java_enum_generation_uses_fory_enum_ids(): diff --git a/cpp/README.md b/cpp/README.md index a26dd27d09..e6c6bfc512 100644 --- a/cpp/README.md +++ b/cpp/README.md @@ -150,7 +150,27 @@ auto fory = apache::fory::ForyBuilder().build(); fory->register_struct(1); ``` -### 1.2 Inherited Fields +### 1.2 Field Configuration + +`FORY_STRUCT` accepts bare fields or configured `(field, fory::F(...))` entries. +Use `fory::F()` for name-mode fields and `fory::F(id)` when stable field ids are +required. A struct must use one identity mode consistently. + +```cpp +namespace T = fory::T; + +struct Event { + uint32_t id; + uint64_t timestamp; + std::map> values; +}; + +FORY_STRUCT(Event, (id, fory::F(0).varint()), + (timestamp, fory::F(1).tagged()), + (values, fory::F(2).map(T::fixed(), T::list(T::tagged())))); +``` + +### 1.3 Inherited Fields To include base-class fields in a derived type, use `FORY_BASE(Base)` inside `FORY_STRUCT`. The base must define its own `FORY_STRUCT` so its fields can be diff --git a/cpp/fory/meta/BUILD b/cpp/fory/meta/BUILD index d5f02247f6..0b2b64a61d 100644 --- a/cpp/fory/meta/BUILD +++ b/cpp/fory/meta/BUILD @@ -64,5 +64,6 @@ cc_test( deps = [ ":fory_meta", "@googletest//:gtest", + "@googletest//:gtest_main", ], ) diff --git a/cpp/fory/meta/field.h b/cpp/fory/meta/field.h index a7e23d9b21..4c80b5a08c 100644 --- a/cpp/fory/meta/field.h +++ b/cpp/fory/meta/field.h @@ -20,16 +20,13 @@ #pragma once #include "fory/meta/field_info.h" -#include "fory/meta/preprocessor.h" #include "fory/type/type.h" -#include #include #include #include #include #include #include -#include namespace fory { @@ -37,377 +34,47 @@ namespace serialization { template class SharedWeak; } // namespace serialization -// ============================================================================ -// Field Option Tags -// ============================================================================ - -/// Tag to mark a shared_ptr/SharedWeak/unique_ptr field as nullable. -/// Only valid for std::shared_ptr, SharedWeak, and std::unique_ptr types. -/// For nullable primitives/strings, use std::optional instead. -struct nullable {}; - -/// Tag to explicitly mark a pointer field as non-nullable. -/// Useful for future pointer types (e.g., weak_ptr) that might be nullable by -/// default. For shared_ptr/SharedWeak/unique_ptr, non-nullable is already the -/// default. -struct not_null {}; - -/// Tag to enable reference tracking for shared_ptr/SharedWeak fields. -/// Only valid for std::shared_ptr or SharedWeak types (requires shared -/// ownership for ref tracking). -struct ref {}; - -/// Template tag to control dynamic type dispatch for smart pointer fields. -/// - `dynamic`: Force type info to be written (enable runtime subtype -/// support) -/// - `dynamic`: skip type info (use declared type directly) -/// -/// By default, Fory auto-detects polymorphism via `std::is_polymorphic`. -/// Use this tag to override the default behavior. -/// -/// Example: -/// fory::field, 0, fory::dynamic> ptr; -template struct dynamic : std::bool_constant {}; - namespace detail { -// ============================================================================ -// Type Traits for Smart Pointers and Optional -// ============================================================================ - template using FieldInfo = decltype(::fory::meta::fory_field_info(std::declval())); -inline constexpr size_t k_invalid_field_index = static_cast(-1); - -template constexpr size_t field_index(std::string_view name) { - constexpr auto names = FieldInfo::Names; - for (size_t i = 0; i < names.size(); ++i) { - if (names[i] == name) { - return i; - } - } - return k_invalid_field_index; -} - -template struct FieldTypeAt; - -template -struct FieldTypeAt> { - using PtrsType = typename FieldInfo::PtrsType; - using PtrT = std::tuple_element_t; - using type = ::fory::meta::RemoveMemberPointerCVRefT; -}; - -template -struct FieldTypeAt> { - static_assert(Index != k_invalid_field_index, - "Unknown field name in FORY_FIELD_TAGS"); -}; - template struct is_shared_ptr : std::false_type {}; - template struct is_shared_ptr> : std::true_type {}; - template inline constexpr bool is_shared_ptr_v = is_shared_ptr::value; template struct is_shared_weak : std::false_type {}; - template struct is_shared_weak> : std::true_type {}; - template inline constexpr bool is_shared_weak_v = is_shared_weak::value; template struct is_unique_ptr : std::false_type {}; - template struct is_unique_ptr> : std::true_type {}; - template inline constexpr bool is_unique_ptr_v = is_unique_ptr::value; template struct is_optional : std::false_type {}; - template struct is_optional> : std::true_type {}; - template inline constexpr bool is_optional_v = is_optional::value; -/// Helper to check if type is shared_ptr/SharedWeak or unique_ptr template inline constexpr bool is_smart_ptr_v = is_shared_ptr_v || is_shared_weak_v || is_unique_ptr_v; -// ============================================================================ -// Option Tag Detection -// ============================================================================ - -/// Check if a specific tag type is present in the Options pack -template -inline constexpr bool has_option_v = (std::is_same_v || ...); - -/// Check if a type is a dynamic tag -template struct is_dynamic_tag : std::false_type {}; -template struct is_dynamic_tag> : std::true_type {}; -template -inline constexpr bool is_dynamic_tag_v = is_dynamic_tag::value; - -/// Check if any dynamic tag is present in Options pack -template -inline constexpr bool has_dynamic_option_v = (is_dynamic_tag_v || ...); - -/// Extract the dynamic value from Options pack (default = -1 for AUTO) -/// Returns: 1 for dynamic, 0 for dynamic, -1 for AUTO (not -/// specified) -template struct get_dynamic_value { - static constexpr int value = -1; // AUTO -}; -template -struct get_dynamic_value, Rest...> { - static constexpr int value = V ? 1 : 0; -}; -template -struct get_dynamic_value { - static constexpr int value = get_dynamic_value::value; -}; -template -inline constexpr int get_dynamic_value_v = get_dynamic_value::value; - -// ============================================================================ -// Field Tag Entry for FORY_FIELD_TAGS Macro -// ============================================================================ - -/// Compile-time field tag metadata entry -/// Dynamic: -1 = AUTO (use std::is_polymorphic), 0 = FALSE (not dynamic), 1 = -/// TRUE (dynamic) -template -struct FieldTagEntry { - static constexpr int16_t id = Id; - static constexpr bool is_nullable = Nullable; - static constexpr bool track_ref = Ref; - static constexpr int dynamic_value = Dynamic; -}; - -struct FieldTagEntryWithName { - const char *name; - int16_t id; - bool is_nullable; - bool track_ref; - int dynamic_value; -}; - -template -constexpr FieldTagEntryWithName make_field_tag_entry(const char *name) { - return FieldTagEntryWithName{name, Entry::id, Entry::is_nullable, - Entry::track_ref, Entry::dynamic_value}; -} - -/// Default: no field tags defined for type T (legacy specialization path) -template struct ForyFieldTagsImpl { - static constexpr bool has_tags = false; -}; - template -using AdlFieldTagsDescriptor = - decltype(fory_field_tags(std::declval>())); +using MemberFieldConfigDescriptor = + decltype(T::fory_field_config(std::declval>())); template -struct HasAdlFieldTags : std::false_type {}; +struct HasMemberFieldConfig : std::false_type {}; template -struct HasAdlFieldTags>> - : std::true_type {}; - -template struct FieldTagsInfo { - static constexpr bool has_tags = false; - static constexpr size_t field_count = 0; - static inline constexpr auto entries = std::tuple<>{}; - using Entries = std::decay_t; - static constexpr bool use_index = true; -}; - -template -struct FieldTagsInfo::value>> { - using Descriptor = AdlFieldTagsDescriptor; - static constexpr bool has_tags = Descriptor::has_tags; - static inline constexpr auto entries = Descriptor::entries; - using Entries = std::decay_t; - static constexpr size_t field_count = std::tuple_size_v; - static constexpr bool use_index = false; -}; - -template -struct FieldTagsInfo::value && - ForyFieldTagsImpl::has_tags>> { - static constexpr bool has_tags = true; - static constexpr size_t field_count = ForyFieldTagsImpl::field_count; - using Entries = typename ForyFieldTagsImpl::Entries; - static inline constexpr auto entries = Entries{}; - static constexpr bool use_index = true; -}; - -template -inline constexpr bool has_field_tags_v = FieldTagsInfo::has_tags; - -} // namespace detail - -// ============================================================================ -// Field Encoding Types for Unsigned Integers -// ============================================================================ - -/// Encoding strategies for integer fields -enum class Encoding { - Default = 0, // Use type's default encoding - Varint = 1, // Variable-length encoding (smaller values use fewer bytes) - Fixed = 2, // Fixed-size encoding (always uses full type width) - Tagged = 3 // Tagged encoding (uses tag byte + value) -}; - -// ============================================================================ -// FieldMeta - Compile-time Field Configuration with Builder Pattern -// ============================================================================ - -/// Compile-time field metadata with fluent builder API. -/// Supports both: -/// - Simple: F(0) - just field ID -/// - Full: F(0).nullable().varint().compress(false).dynamic(false) -struct FieldMeta { - int16_t id_ = -1; - bool nullable_ = false; - bool ref_ = false; - int dynamic_ = -1; // -1 = AUTO, 0 = FALSE, 1 = TRUE - Encoding encoding_ = Encoding::Default; - bool compress_ = true; - int16_t type_id_override_ = -1; // -1 = unset - - // Builder methods - each returns a modified copy - constexpr FieldMeta id(int16_t v) const { - auto c = *this; - c.id_ = v; - return c; - } - constexpr FieldMeta nullable(bool v = true) const { - auto c = *this; - c.nullable_ = v; - return c; - } - constexpr FieldMeta ref(bool v = true) const { - auto c = *this; - c.ref_ = v; - return c; - } - /// Set dynamic type dispatch: true = write type info, false = skip type info - constexpr FieldMeta dynamic(bool v) const { - auto c = *this; - c.dynamic_ = v ? 1 : 0; - return c; - } - constexpr FieldMeta encoding(Encoding v) const { - auto c = *this; - c.encoding_ = v; - return c; - } - constexpr FieldMeta compress(bool v) const { - auto c = *this; - c.compress_ = v; - return c; - } - constexpr FieldMeta type_id(TypeId v) const { - auto c = *this; - c.type_id_override_ = static_cast(v); - return c; - } - constexpr FieldMeta int8_array() const { return type_id(TypeId::INT8_ARRAY); } - constexpr FieldMeta uint8_array() const { - return type_id(TypeId::UINT8_ARRAY); - } - - // Convenience shortcuts for common encodings - constexpr FieldMeta varint() const { return encoding(Encoding::Varint); } - constexpr FieldMeta fixed() const { return encoding(Encoding::Fixed); } - constexpr FieldMeta tagged() const { return encoding(Encoding::Tagged); } -}; - -/// Short factory functions for FieldMeta - use F() as a builder or F(id) for -/// tag -constexpr FieldMeta F() { return FieldMeta{}; } -constexpr FieldMeta F(int16_t id) { return FieldMeta{}.id(id); } - -namespace detail { - -// ============================================================================ -// Config Normalization - Handle both integer IDs and FieldMeta -// ============================================================================ - -/// Normalize configuration: convert integer to FieldMeta, pass FieldMeta -/// through -template constexpr auto normalize_config(T &&v) { - if constexpr (std::is_integral_v>) { - // Old syntax: just an integer ID - return FieldMeta{}.id(static_cast(v)); - } else if constexpr (std::is_same_v, FieldMeta>) { - // New syntax: already a FieldMeta - return v; - } else { - static_assert( - std::is_integral_v> || - std::is_same_v, FieldMeta>, - "Field config must be an integer ID or FieldMeta (use F(id)...)"); - return FieldMeta{}; - } -} - -/// Apply tag to FieldMeta -constexpr FieldMeta apply_tag(FieldMeta m, nullable) { return m.nullable(); } -constexpr FieldMeta apply_tag(FieldMeta m, not_null) { - return m.nullable(false); -} -constexpr FieldMeta apply_tag(FieldMeta m, ref) { return m.ref(); } -template constexpr FieldMeta apply_tag(FieldMeta m, dynamic) { - return m.dynamic(V); -} - -/// Fold multiple tags onto a base config -template -constexpr FieldMeta apply_tags(FieldMeta base, Tags... tags) { - ((base = apply_tag(base, tags)), ...); - return base; -} - -// ============================================================================ -// FieldEntry - Stores Field Configuration Metadata -// ============================================================================ - -/// Field entry that stores name and configuration metadata -struct FieldEntry { - const char *name; // Field name for debugging - FieldMeta meta; // Field configuration - - constexpr FieldEntry(const char *n, FieldMeta m) : name(n), meta(m) {} -}; - -/// Create a FieldEntry -constexpr auto make_field_entry(const char *name, FieldMeta meta) { - return FieldEntry{name, meta}; -} - -/// Default: no field config defined for type T -template struct ForyFieldConfigImpl { - static constexpr bool has_config = false; -}; - -template -using AdlFieldConfigDescriptor = - decltype(fory_field_config(std::declval>())); - -template -struct HasAdlFieldConfig : std::false_type {}; - -template -struct HasAdlFieldConfig>> +struct HasMemberFieldConfig>> : std::true_type {}; template struct FieldConfigInfo { @@ -417,35 +84,27 @@ template struct FieldConfigInfo { }; template -struct FieldConfigInfo::value>> { - using Descriptor = AdlFieldConfigDescriptor; +struct FieldConfigInfo::value>> { + using Descriptor = MemberFieldConfigDescriptor; static constexpr bool has_config = Descriptor::has_config; static constexpr size_t field_count = Descriptor::field_count; static inline constexpr auto entries = Descriptor::entries; }; -template -struct FieldConfigInfo::value && - ForyFieldConfigImpl::has_config>> { - static constexpr bool has_config = true; - static constexpr size_t field_count = ForyFieldConfigImpl::field_count; - static inline constexpr auto entries = ForyFieldConfigImpl::entries; -}; - template inline constexpr bool has_field_config_v = FieldConfigInfo::has_config; -/// Helper to get field encoding from FieldConfigInfo template struct GetFieldConfigEntry { static constexpr Encoding encoding = Encoding::Default; static constexpr int16_t id = -1; static constexpr bool nullable = false; static constexpr bool ref = false; - static constexpr int dynamic_value = -1; // AUTO + static constexpr int dynamic_value = -1; static constexpr bool compress = true; static constexpr int16_t type_id_override = -1; + static constexpr bool has_id = false; + static constexpr FieldNodeSpec spec = FieldNodeSpec{}; static constexpr bool has_entry = false; }; @@ -478,1450 +137,45 @@ struct GetFieldConfigEntry Template -// ============================================================================ - -/// Field wrapper template that provides compile-time field metadata. -/// -/// Usage: -/// struct Person { -/// fory::field name; // non-nullable -/// fory::field age; // non-nullable -/// fory::field, 2> nickname; // inherently -/// nullable fory::field, 3> parent; // -/// non-nullable fory::field, 4, fory::nullable> -/// guardian; fory::field, 5, fory::ref> node; -/// fory::field, 6, fory::nullable, fory::ref> link; -/// }; -/// -/// Template Parameters: -/// T - The underlying field type -/// Id - The field tag ID (int16_t) for compact serialization -/// Options - Optional tags: fory::nullable, fory::ref -/// -/// Type Rules: -/// - Primitives/strings: No options allowed (use std::optional for nullable) -/// - std::optional: Inherently nullable, no options needed -/// - std::shared_ptr: Can use nullable and/or ref -/// - SharedWeak: Can use nullable and/or ref -/// - std::unique_ptr: Can use nullable only (no ref - exclusive -/// ownership) -template class field { - // Validate: nullable and not_null are mutually exclusive - static_assert(!(detail::has_option_v && - detail::has_option_v), - "fory::nullable and fory::not_null are mutually exclusive."); - - // Validate: nullable only for smart pointers - static_assert(!detail::has_option_v || - detail::is_smart_ptr_v, - "fory::nullable is only valid for shared_ptr/SharedWeak/" - "unique_ptr. " - "Use std::optional for nullable primitives/strings."); - - // Validate: not_null only for smart pointers (for now) - static_assert(!detail::has_option_v || - detail::is_smart_ptr_v, - "fory::not_null is only valid for pointer types."); - - // Validate: ref only for shared_ptr/SharedWeak - static_assert(!detail::has_option_v || - detail::is_shared_ptr_v || detail::is_shared_weak_v, - "fory::ref is only valid for shared_ptr/SharedWeak " - "(reference tracking requires shared ownership)."); - - // Validate: dynamic only for smart pointers - static_assert(!detail::has_dynamic_option_v || - detail::is_smart_ptr_v, - "fory::dynamic is only valid for shared_ptr/SharedWeak/" - "unique_ptr."); - - // Validate: no options for optional (inherently nullable) - static_assert(!detail::is_optional_v || sizeof...(Options) == 0, - "std::optional is inherently nullable. No options allowed."); - - // Validate: no options for non-smart-pointer types - static_assert(detail::is_smart_ptr_v || detail::is_optional_v || - sizeof...(Options) == 0, - "Options are only valid for shared_ptr/SharedWeak/unique_ptr " - "fields. " - "Use std::optional for nullable primitives/strings."); - -public: - using value_type = T; - static constexpr int16_t tag_id = Id; - - /// Field is nullable if: - /// - It's std::optional (inherently nullable), OR - /// - It's a smart pointer with fory::nullable option - static constexpr bool is_nullable = - detail::is_optional_v || - (detail::is_smart_ptr_v && detail::has_option_v); - - /// Reference tracking is enabled if: - /// - It's std::shared_ptr or SharedWeak (default) - /// - Or explicitly marked with fory::ref - static constexpr bool track_ref = detail::is_shared_ptr_v || - detail::is_shared_weak_v || - detail::has_option_v; - - /// Dynamic type dispatch control: - /// - -1 (AUTO): Use std::is_polymorphic to decide - /// - 0 (FALSE): skip type info, use declared type directly - /// - 1 (TRUE): write type info, enable runtime subtype support - static constexpr int dynamic_value = detail::get_dynamic_value_v; - - T value{}; - - // Default constructor - field() = default; - - // Value constructors - field(const T &v) : value(v) {} - field(T &&v) : value(std::move(v)) {} - - // copy and move constructors - field(const field &) = default; - field(field &&) = default; - - // copy and move assignment - field &operator=(const field &) = default; - field &operator=(field &&) = default; - - // Value assignment - field &operator=(const T &v) { - value = v; - return *this; - } - field &operator=(T &&v) { - value = std::move(v); - return *this; - } - - // Implicit conversions to underlying type - operator T &() { return value; } - operator const T &() const { return value; } - - // Pointer-like access for smart pointers - T *operator->() { return &value; } - const T *operator->() const { return &value; } - - // Dereference operators - T &operator*() { return value; } - const T &operator*() const { return value; } - - // get underlying value - T &get() { return value; } - const T &get() const { return value; } -}; - -// ============================================================================ -// Type Traits for fory::field Detection -// ============================================================================ - -/// Check if a type is a fory::field wrapper template struct is_fory_field : std::false_type {}; - -template -struct is_fory_field> : std::true_type {}; - template inline constexpr bool is_fory_field_v = is_fory_field::value; -/// unwrap fory::field to get the underlying type template struct unwrap_field { using type = T; }; - -template -struct unwrap_field> { - using type = T; -}; - template using unwrap_field_t = typename unwrap_field::type; -/// get tag ID from field type (returns -1 if not a fory::field) template struct field_tag_id { static constexpr int16_t value = -1; }; - -template -struct field_tag_id> { - static constexpr int16_t value = Id; -}; - template inline constexpr int16_t field_tag_id_v = field_tag_id::value; -/// Determines whether a field is nullable and requires a RefFlag byte. -/// -/// This mirrors Rust's `field_need_write_ref_into(type_id, nullable)` in -/// rust/fory-core/src/serializer/util.rs and determines whether the writer -/// emits a `RefFlag` byte before the field's value payload. -/// -/// Per the xlang protocol: -/// - Non-nullable types (nullable=false) skip the ref flag entirely -/// - Nullable types (nullable=true) write a ref flag to indicate null vs -/// non-null -/// -/// For non-field types, std::optional is considered nullable. -/// For fory::field types, uses the explicit nullable option if provided. template struct field_is_nullable { static constexpr bool value = detail::is_optional_v; }; - -template -struct field_is_nullable> { - static constexpr bool value = field::is_nullable; -}; - template inline constexpr bool field_is_nullable_v = field_is_nullable::value; -/// get track_ref from field type template struct field_track_ref { static constexpr bool value = detail::is_shared_ptr_v || detail::is_shared_weak_v; }; - -template -struct field_track_ref> { - static constexpr bool value = field::track_ref; -}; - template inline constexpr bool field_track_ref_v = field_track_ref::value; -/// get dynamic_value from field type (-1 = AUTO, 0 = FALSE, 1 = TRUE) template struct field_dynamic_value { - static constexpr int value = -1; // AUTO + static constexpr int value = -1; }; - -template -struct field_dynamic_value> { - static constexpr int value = field::dynamic_value; -}; - template inline constexpr int field_dynamic_value_v = field_dynamic_value::value; -// ============================================================================ -// FORY_FIELD_TAGS Macro Support -// ============================================================================ - -namespace detail { - -// Helper to parse field tag entry from macro arguments -// Supports: (field, id), (field, id, nullable), (field, id, ref), -// (field, id, nullable, ref), (field, id, dynamic), etc. -template -struct ParseFieldTagEntry { - static constexpr bool is_nullable = - is_optional_v || - (is_smart_ptr_v && has_option_v); - - static constexpr bool track_ref = is_shared_ptr_v || - is_shared_weak_v || - has_option_v; - - static constexpr int dynamic_value = get_dynamic_value_v; - - // Compile-time validation - static_assert(!has_option_v || - is_smart_ptr_v, - "fory::nullable is only valid for shared_ptr/SharedWeak/" - "unique_ptr"); - - static_assert(!has_option_v || is_shared_ptr_v || - is_shared_weak_v, - "fory::ref is only valid for shared_ptr/SharedWeak"); - - static_assert(!has_dynamic_option_v || is_smart_ptr_v, - "fory::dynamic is only valid for shared_ptr/SharedWeak/" - "unique_ptr"); - - using type = FieldTagEntry; -}; - -/// get field tag entry by index from FieldTagsInfo -template struct GetFieldTagEntry { - static constexpr int16_t id = -1; - static constexpr bool is_nullable = false; - static constexpr bool track_ref = false; - static constexpr int dynamic_value = -1; // AUTO - static constexpr bool has_entry = false; -}; - -template -struct GetFieldTagEntry< - T, Index, - std::enable_if_t::has_tags && - (Index < FieldTagsInfo::field_count) && - FieldTagsInfo::use_index>> { - using Entry = std::tuple_element_t::Entries>; - static constexpr int16_t id = Entry::id; - static constexpr bool is_nullable = Entry::is_nullable; - static constexpr bool track_ref = Entry::track_ref; - static constexpr int dynamic_value = Entry::dynamic_value; - static constexpr bool has_entry = true; -}; - -template -struct GetFieldTagEntry::has_tags && - !FieldTagsInfo::use_index>> { -private: - static constexpr std::string_view field_name = FieldInfo::Names[Index]; - - template static constexpr FieldTagEntryWithName find_entry() { - if constexpr (I >= std::tuple_size_v::Entries>) { - return FieldTagEntryWithName{"", -1, false, false, -1}; - } else { - constexpr auto entry = std::get(FieldTagsInfo::entries); - if (std::string_view{entry.name} == field_name) { - return entry; - } - return find_entry(); - } - } - - static constexpr FieldTagEntryWithName entry = find_entry<>(); - -public: - static constexpr int16_t id = entry.id; - static constexpr bool is_nullable = entry.is_nullable; - static constexpr bool track_ref = entry.track_ref; - static constexpr int dynamic_value = entry.dynamic_value; - static constexpr bool has_entry = entry.name[0] != '\0'; -}; - -} // namespace detail - } // namespace fory - -// ============================================================================ -// FORY_FIELD_TAGS Macro Implementation -// ============================================================================ - -// Helper macros to extract parts from (field, id, ...) tuples -#define FORY_FT_FIELD(tuple) FORY_FT_FIELD_IMPL tuple -#define FORY_FT_FIELD_IMPL(field, ...) field - -// Stringify field name -#define FORY_FT_STRINGIFY(x) FORY_FT_STRINGIFY_I(x) -#define FORY_FT_STRINGIFY_I(x) #x - -#define FORY_FT_ID(tuple) FORY_FT_ID_IMPL tuple -#define FORY_FT_ID_IMPL(field, id, ...) id - -// get options from tuple -#define FORY_FT_GET_OPT1(tuple) FORY_FT_GET_OPT1_IMPL tuple -#define FORY_FT_GET_OPT1_IMPL(f, i, o1, ...) o1 -#define FORY_FT_GET_OPT2(tuple) FORY_FT_GET_OPT2_IMPL tuple -#define FORY_FT_GET_OPT2_IMPL(f, i, o1, o2, ...) o2 -#define FORY_FT_GET_OPT3(tuple) FORY_FT_GET_OPT3_IMPL tuple -#define FORY_FT_GET_OPT3_IMPL(f, i, o1, o2, o3, ...) o3 - -// Detect number of elements in tuple: 2, 3, 4, or 5 -#define FORY_FT_TUPLE_SIZE(tuple) FORY_FT_TUPLE_SIZE_IMPL tuple -#define FORY_FT_TUPLE_SIZE_IMPL(...) \ - FORY_FT_TUPLE_SIZE_SELECT(__VA_ARGS__, 5, 4, 3, 2, 1, 0) -#define FORY_FT_TUPLE_SIZE_SELECT(_1, _2, _3, _4, _5, N, ...) N - -// Create FieldTagEntry based on tuple size using indirect call pattern -// This pattern ensures the concatenated macro name is properly rescanned -#define FORY_FT_MAKE_ENTRY(Type, tuple) \ - FORY_FT_MAKE_ENTRY_I(Type, tuple, FORY_FT_TUPLE_SIZE(tuple)) -#define FORY_FT_MAKE_ENTRY_I(Type, tuple, size) \ - FORY_FT_MAKE_ENTRY_II(Type, tuple, size) -#define FORY_FT_MAKE_ENTRY_II(Type, tuple, size) \ - FORY_FT_MAKE_ENTRY_##size(Type, tuple) - -#define FORY_FT_FIELD_INDEX(Type, tuple) \ - ::fory::detail::field_index( \ - std::string_view{FORY_FT_STRINGIFY(FORY_FT_FIELD(tuple))}) - -#define FORY_FT_FIELD_TYPE(Type, tuple) \ - typename ::fory::detail::FieldTypeAt::type - -#define FORY_FT_MAKE_ENTRY_2(Type, tuple) \ - ::fory::detail::make_field_tag_entry< \ - typename ::fory::detail::ParseFieldTagEntry< \ - FORY_FT_FIELD_TYPE(Type, tuple), FORY_FT_ID(tuple)>::type>( \ - FORY_FT_STRINGIFY(FORY_FT_FIELD(tuple))) - -#define FORY_FT_MAKE_ENTRY_3(Type, tuple) \ - ::fory::detail::make_field_tag_entry< \ - typename ::fory::detail::ParseFieldTagEntry< \ - FORY_FT_FIELD_TYPE(Type, tuple), FORY_FT_ID(tuple), \ - ::fory::FORY_FT_GET_OPT1(tuple)>::type>( \ - FORY_FT_STRINGIFY(FORY_FT_FIELD(tuple))) - -#define FORY_FT_MAKE_ENTRY_4(Type, tuple) \ - ::fory::detail::make_field_tag_entry< \ - typename ::fory::detail::ParseFieldTagEntry< \ - FORY_FT_FIELD_TYPE(Type, tuple), FORY_FT_ID(tuple), \ - ::fory::FORY_FT_GET_OPT1(tuple), \ - ::fory::FORY_FT_GET_OPT2(tuple)>::type>( \ - FORY_FT_STRINGIFY(FORY_FT_FIELD(tuple))) - -#define FORY_FT_MAKE_ENTRY_5(Type, tuple) \ - ::fory::detail::make_field_tag_entry< \ - typename ::fory::detail::ParseFieldTagEntry< \ - FORY_FT_FIELD_TYPE(Type, tuple), FORY_FT_ID(tuple), \ - ::fory::FORY_FT_GET_OPT1(tuple), ::fory::FORY_FT_GET_OPT2(tuple), \ - ::fory::FORY_FT_GET_OPT3(tuple)>::type>( \ - FORY_FT_STRINGIFY(FORY_FT_FIELD(tuple))) - -// Main macro: FORY_FIELD_TAGS(Type, (field1, id1), (field2, id2, nullable),...) -#define FORY_FT_DESCRIPTOR_NAME(line) \ - FORY_PP_CONCAT(ForyFieldTagsDescriptor_, line) -#define FORY_FIELD_TAGS(Type, ...) \ - FORY_FIELD_TAGS_IMPL(__LINE__, Type, __VA_ARGS__) -#define FORY_FIELD_TAGS_IMPL(line, Type, ...) \ - struct FORY_FT_DESCRIPTOR_NAME(line) { \ - static constexpr bool has_tags = true; \ - static inline constexpr auto entries = \ - std::make_tuple(FORY_FT_ENTRIES(Type, __VA_ARGS__)); \ - using Entries = std::decay_t; \ - static constexpr size_t field_count = std::tuple_size_v; \ - }; \ - constexpr auto fory_field_tags(::fory::meta::Identity) { \ - return FORY_FT_DESCRIPTOR_NAME(line){}; \ - } \ - static_assert(true) - -// Helper to generate entries tuple content using indirect expansion pattern -// This ensures FORY_PP_NARG is fully expanded before concatenation -#define FORY_FT_ENTRIES(Type, ...) \ - FORY_FT_ENTRIES_I(Type, FORY_PP_NARG(__VA_ARGS__), __VA_ARGS__) -#define FORY_FT_ENTRIES_I(Type, N, ...) FORY_FT_ENTRIES_II(Type, N, __VA_ARGS__) -#define FORY_FT_ENTRIES_II(Type, N, ...) FORY_FT_ENTRIES_##N(Type, __VA_ARGS__) - -// Generate entries for 1-64 fields -#define FORY_FT_ENTRIES_1(T, _1) FORY_FT_MAKE_ENTRY(T, _1) -#define FORY_FT_ENTRIES_2(T, _1, _2) \ - FORY_FT_MAKE_ENTRY(T, _1), FORY_FT_MAKE_ENTRY(T, _2) -#define FORY_FT_ENTRIES_3(T, _1, _2, _3) \ - FORY_FT_ENTRIES_2(T, _1, _2), FORY_FT_MAKE_ENTRY(T, _3) -#define FORY_FT_ENTRIES_4(T, _1, _2, _3, _4) \ - FORY_FT_ENTRIES_3(T, _1, _2, _3), FORY_FT_MAKE_ENTRY(T, _4) -#define FORY_FT_ENTRIES_5(T, _1, _2, _3, _4, _5) \ - FORY_FT_ENTRIES_4(T, _1, _2, _3, _4), FORY_FT_MAKE_ENTRY(T, _5) -#define FORY_FT_ENTRIES_6(T, _1, _2, _3, _4, _5, _6) \ - FORY_FT_ENTRIES_5(T, _1, _2, _3, _4, _5), FORY_FT_MAKE_ENTRY(T, _6) -#define FORY_FT_ENTRIES_7(T, _1, _2, _3, _4, _5, _6, _7) \ - FORY_FT_ENTRIES_6(T, _1, _2, _3, _4, _5, _6), FORY_FT_MAKE_ENTRY(T, _7) -#define FORY_FT_ENTRIES_8(T, _1, _2, _3, _4, _5, _6, _7, _8) \ - FORY_FT_ENTRIES_7(T, _1, _2, _3, _4, _5, _6, _7), FORY_FT_MAKE_ENTRY(T, _8) -#define FORY_FT_ENTRIES_9(T, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ - FORY_FT_ENTRIES_8(T, _1, _2, _3, _4, _5, _6, _7, _8), \ - FORY_FT_MAKE_ENTRY(T, _9) -#define FORY_FT_ENTRIES_10(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ - FORY_FT_ENTRIES_9(T, _1, _2, _3, _4, _5, _6, _7, _8, _9), \ - FORY_FT_MAKE_ENTRY(T, _10) -#define FORY_FT_ENTRIES_11(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ - FORY_FT_ENTRIES_10(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10), \ - FORY_FT_MAKE_ENTRY(T, _11) -#define FORY_FT_ENTRIES_12(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12) \ - FORY_FT_ENTRIES_11(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11), \ - FORY_FT_MAKE_ENTRY(T, _12) -#define FORY_FT_ENTRIES_13(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13) \ - FORY_FT_ENTRIES_12(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12), \ - FORY_FT_MAKE_ENTRY(T, _13) -#define FORY_FT_ENTRIES_14(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14) \ - FORY_FT_ENTRIES_13(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13), \ - FORY_FT_MAKE_ENTRY(T, _14) -#define FORY_FT_ENTRIES_15(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15) \ - FORY_FT_ENTRIES_14(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14), \ - FORY_FT_MAKE_ENTRY(T, _15) -#define FORY_FT_ENTRIES_16(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16) \ - FORY_FT_ENTRIES_15(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15), \ - FORY_FT_MAKE_ENTRY(T, _16) -#define FORY_FT_ENTRIES_17(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17) \ - FORY_FT_ENTRIES_16(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16), \ - FORY_FT_MAKE_ENTRY(T, _17) -#define FORY_FT_ENTRIES_18(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18) \ - FORY_FT_ENTRIES_17(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17), \ - FORY_FT_MAKE_ENTRY(T, _18) -#define FORY_FT_ENTRIES_19(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19) \ - FORY_FT_ENTRIES_18(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18), \ - FORY_FT_MAKE_ENTRY(T, _19) -#define FORY_FT_ENTRIES_20(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20) \ - FORY_FT_ENTRIES_19(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19), \ - FORY_FT_MAKE_ENTRY(T, _20) -#define FORY_FT_ENTRIES_21(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ - FORY_FT_ENTRIES_20(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20), \ - FORY_FT_MAKE_ENTRY(T, _21) -#define FORY_FT_ENTRIES_22(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22) \ - FORY_FT_ENTRIES_21(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21), \ - FORY_FT_MAKE_ENTRY(T, _22) -#define FORY_FT_ENTRIES_23(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23) \ - FORY_FT_ENTRIES_22(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22), \ - FORY_FT_MAKE_ENTRY(T, _23) -#define FORY_FT_ENTRIES_24(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24) \ - FORY_FT_ENTRIES_23(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23), \ - FORY_FT_MAKE_ENTRY(T, _24) -#define FORY_FT_ENTRIES_25(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25) \ - FORY_FT_ENTRIES_24(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24), \ - FORY_FT_MAKE_ENTRY(T, _25) -#define FORY_FT_ENTRIES_26(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26) \ - FORY_FT_ENTRIES_25(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25), \ - FORY_FT_MAKE_ENTRY(T, _26) -#define FORY_FT_ENTRIES_27(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27) \ - FORY_FT_ENTRIES_26(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26), \ - FORY_FT_MAKE_ENTRY(T, _27) -#define FORY_FT_ENTRIES_28(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28) \ - FORY_FT_ENTRIES_27(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27), \ - FORY_FT_MAKE_ENTRY(T, _28) -#define FORY_FT_ENTRIES_29(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29) \ - FORY_FT_ENTRIES_28(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28), \ - FORY_FT_MAKE_ENTRY(T, _29) -#define FORY_FT_ENTRIES_30(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30) \ - FORY_FT_ENTRIES_29(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29), \ - FORY_FT_MAKE_ENTRY(T, _30) -#define FORY_FT_ENTRIES_31(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \ - FORY_FT_ENTRIES_30(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30), \ - FORY_FT_MAKE_ENTRY(T, _31) -#define FORY_FT_ENTRIES_32(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32) \ - FORY_FT_ENTRIES_31(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31), \ - FORY_FT_MAKE_ENTRY(T, _32) -#define FORY_FT_ENTRIES_33(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33) \ - FORY_FT_ENTRIES_32(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32), \ - FORY_FT_MAKE_ENTRY(T, _33) -#define FORY_FT_ENTRIES_34(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34) \ - FORY_FT_ENTRIES_33(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33), \ - FORY_FT_MAKE_ENTRY(T, _34) -#define FORY_FT_ENTRIES_35(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35) \ - FORY_FT_ENTRIES_34(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34), \ - FORY_FT_MAKE_ENTRY(T, _35) -#define FORY_FT_ENTRIES_36(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36) \ - FORY_FT_ENTRIES_35(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35), \ - FORY_FT_MAKE_ENTRY(T, _36) -#define FORY_FT_ENTRIES_37(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37) \ - FORY_FT_ENTRIES_36(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36), \ - FORY_FT_MAKE_ENTRY(T, _37) -#define FORY_FT_ENTRIES_38(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38) \ - FORY_FT_ENTRIES_37(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37), \ - FORY_FT_MAKE_ENTRY(T, _38) -#define FORY_FT_ENTRIES_39(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39) \ - FORY_FT_ENTRIES_38(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38), \ - FORY_FT_MAKE_ENTRY(T, _39) -#define FORY_FT_ENTRIES_40(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40) \ - FORY_FT_ENTRIES_39(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39), \ - FORY_FT_MAKE_ENTRY(T, _40) -#define FORY_FT_ENTRIES_41(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \ - FORY_FT_ENTRIES_40(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40), \ - FORY_FT_MAKE_ENTRY(T, _41) -#define FORY_FT_ENTRIES_42( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \ - FORY_FT_ENTRIES_41(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41), \ - FORY_FT_MAKE_ENTRY(T, _42) -#define FORY_FT_ENTRIES_43( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \ - FORY_FT_ENTRIES_42(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42), \ - FORY_FT_MAKE_ENTRY(T, _43) -#define FORY_FT_ENTRIES_44( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \ - FORY_FT_ENTRIES_43(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43), \ - FORY_FT_MAKE_ENTRY(T, _44) -#define FORY_FT_ENTRIES_45( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \ - FORY_FT_ENTRIES_44(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44), \ - FORY_FT_MAKE_ENTRY(T, _45) -#define FORY_FT_ENTRIES_46( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \ - FORY_FT_ENTRIES_45(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45), \ - FORY_FT_MAKE_ENTRY(T, _46) -#define FORY_FT_ENTRIES_47(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, \ - _42, _43, _44, _45, _46, _47) \ - FORY_FT_ENTRIES_46(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46), \ - FORY_FT_MAKE_ENTRY(T, _47) -#define FORY_FT_ENTRIES_48(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, \ - _42, _43, _44, _45, _46, _47, _48) \ - FORY_FT_ENTRIES_47(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47), \ - FORY_FT_MAKE_ENTRY(T, _48) -#define FORY_FT_ENTRIES_49(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, \ - _42, _43, _44, _45, _46, _47, _48, _49) \ - FORY_FT_ENTRIES_48(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48), \ - FORY_FT_MAKE_ENTRY(T, _49) -#define FORY_FT_ENTRIES_50(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, \ - _42, _43, _44, _45, _46, _47, _48, _49, _50) \ - FORY_FT_ENTRIES_49(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49), \ - FORY_FT_MAKE_ENTRY(T, _50) -#define FORY_FT_ENTRIES_51(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, \ - _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \ - FORY_FT_ENTRIES_50(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50), \ - FORY_FT_MAKE_ENTRY(T, _51) -#define FORY_FT_ENTRIES_52( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52) \ - FORY_FT_ENTRIES_51(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51), \ - FORY_FT_MAKE_ENTRY(T, _52) -#define FORY_FT_ENTRIES_53( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53) \ - FORY_FT_ENTRIES_52(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52), \ - FORY_FT_MAKE_ENTRY(T, _53) -#define FORY_FT_ENTRIES_54( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54) \ - FORY_FT_ENTRIES_53(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53), \ - FORY_FT_MAKE_ENTRY(T, _54) -#define FORY_FT_ENTRIES_55( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55) \ - FORY_FT_ENTRIES_54(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54), \ - FORY_FT_MAKE_ENTRY(T, _55) -#define FORY_FT_ENTRIES_56( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \ - FORY_FT_ENTRIES_55(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55), \ - FORY_FT_MAKE_ENTRY(T, _56) -#define FORY_FT_ENTRIES_57( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \ - FORY_FT_ENTRIES_56(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56), \ - FORY_FT_MAKE_ENTRY(T, _57) -#define FORY_FT_ENTRIES_58( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \ - FORY_FT_ENTRIES_57( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, \ - _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \ - _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, \ - _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57), \ - FORY_FT_MAKE_ENTRY(T, _58) -#define FORY_FT_ENTRIES_59( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \ - FORY_FT_ENTRIES_58(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \ - _57, _58), \ - FORY_FT_MAKE_ENTRY(T, _59) -#define FORY_FT_ENTRIES_60( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \ - FORY_FT_ENTRIES_59(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \ - _57, _58, _59), \ - FORY_FT_MAKE_ENTRY(T, _60) -#define FORY_FT_ENTRIES_61( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \ - FORY_FT_ENTRIES_60(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \ - _57, _58, _59, _60), \ - FORY_FT_MAKE_ENTRY(T, _61) -#define FORY_FT_ENTRIES_62( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, \ - _62) \ - FORY_FT_ENTRIES_61(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \ - _57, _58, _59, _60, _61), \ - FORY_FT_MAKE_ENTRY(T, _62) -#define FORY_FT_ENTRIES_63( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, \ - _62, _63) \ - FORY_FT_ENTRIES_62(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \ - _57, _58, _59, _60, _61, _62), \ - FORY_FT_MAKE_ENTRY(T, _63) -#define FORY_FT_ENTRIES_64( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, \ - _62, _63, _64) \ - FORY_FT_ENTRIES_63(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \ - _57, _58, _59, _60, _61, _62, _63), \ - FORY_FT_MAKE_ENTRY(T, _64) - -// ============================================================================ -// FORY_FIELD_CONFIG Macro - New Syntax with Member Pointer Verification -// ============================================================================ -// -// Usage: -// FORY_FIELD_CONFIG(MyStruct, -// (field1, fory::F(0)), // Simple: just ID -// (field2, fory::F(1).nullable()), // With nullable -// (field3, fory::F(2).varint()), // With encoding -// (field4, fory::F(3).nullable().ref()), // Multiple options -// (field5, 4) // Backward compatible: integer -// ID -// ); -// -// This macro: -// 1. Verifies field names exist at compile time via member pointers -// 2. Supports both integer IDs (old) and F(id).xxx() builder (new) -// 3. Stores configuration in a constexpr tuple for efficient access - -// Helper to stringify field name -#define FORY_FC_STRINGIFY(x) FORY_FC_STRINGIFY_I(x) -#define FORY_FC_STRINGIFY_I(x) #x - -// Extract field name (first element of tuple) -#define FORY_FC_NAME(tuple) FORY_FC_NAME_IMPL tuple -#define FORY_FC_NAME_IMPL(name, ...) name - -// Extract config (second element of tuple) -#define FORY_FC_CONFIG(tuple) FORY_FC_CONFIG_IMPL tuple -#define FORY_FC_CONFIG_IMPL(name, config, ...) config - -// Create a FieldEntry with member pointer verification -#define FORY_FC_MAKE_ENTRY(Type, tuple) \ - ::fory::detail::make_field_entry( \ - FORY_FC_STRINGIFY(FORY_FC_NAME(tuple)), \ - ::fory::detail::normalize_config(FORY_FC_CONFIG(tuple))) - -// Generate entries using indirect expansion -#define FORY_FC_ENTRIES(Type, ...) \ - FORY_FC_ENTRIES_I(Type, FORY_PP_NARG(__VA_ARGS__), __VA_ARGS__) -#define FORY_FC_ENTRIES_I(Type, N, ...) FORY_FC_ENTRIES_II(Type, N, __VA_ARGS__) -#define FORY_FC_ENTRIES_II(Type, N, ...) FORY_FC_ENTRIES_##N(Type, __VA_ARGS__) - -// Generate entries for 1-64 fields -#define FORY_FC_ENTRIES_1(T, _1) FORY_FC_MAKE_ENTRY(T, _1) -#define FORY_FC_ENTRIES_2(T, _1, _2) \ - FORY_FC_MAKE_ENTRY(T, _1), FORY_FC_MAKE_ENTRY(T, _2) -#define FORY_FC_ENTRIES_3(T, _1, _2, _3) \ - FORY_FC_ENTRIES_2(T, _1, _2), FORY_FC_MAKE_ENTRY(T, _3) -#define FORY_FC_ENTRIES_4(T, _1, _2, _3, _4) \ - FORY_FC_ENTRIES_3(T, _1, _2, _3), FORY_FC_MAKE_ENTRY(T, _4) -#define FORY_FC_ENTRIES_5(T, _1, _2, _3, _4, _5) \ - FORY_FC_ENTRIES_4(T, _1, _2, _3, _4), FORY_FC_MAKE_ENTRY(T, _5) -#define FORY_FC_ENTRIES_6(T, _1, _2, _3, _4, _5, _6) \ - FORY_FC_ENTRIES_5(T, _1, _2, _3, _4, _5), FORY_FC_MAKE_ENTRY(T, _6) -#define FORY_FC_ENTRIES_7(T, _1, _2, _3, _4, _5, _6, _7) \ - FORY_FC_ENTRIES_6(T, _1, _2, _3, _4, _5, _6), FORY_FC_MAKE_ENTRY(T, _7) -#define FORY_FC_ENTRIES_8(T, _1, _2, _3, _4, _5, _6, _7, _8) \ - FORY_FC_ENTRIES_7(T, _1, _2, _3, _4, _5, _6, _7), FORY_FC_MAKE_ENTRY(T, _8) -#define FORY_FC_ENTRIES_9(T, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ - FORY_FC_ENTRIES_8(T, _1, _2, _3, _4, _5, _6, _7, _8), \ - FORY_FC_MAKE_ENTRY(T, _9) -#define FORY_FC_ENTRIES_10(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ - FORY_FC_ENTRIES_9(T, _1, _2, _3, _4, _5, _6, _7, _8, _9), \ - FORY_FC_MAKE_ENTRY(T, _10) -#define FORY_FC_ENTRIES_11(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ - FORY_FC_ENTRIES_10(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10), \ - FORY_FC_MAKE_ENTRY(T, _11) -#define FORY_FC_ENTRIES_12(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12) \ - FORY_FC_ENTRIES_11(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11), \ - FORY_FC_MAKE_ENTRY(T, _12) -#define FORY_FC_ENTRIES_13(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13) \ - FORY_FC_ENTRIES_12(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12), \ - FORY_FC_MAKE_ENTRY(T, _13) -#define FORY_FC_ENTRIES_14(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14) \ - FORY_FC_ENTRIES_13(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13), \ - FORY_FC_MAKE_ENTRY(T, _14) -#define FORY_FC_ENTRIES_15(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15) \ - FORY_FC_ENTRIES_14(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14), \ - FORY_FC_MAKE_ENTRY(T, _15) -#define FORY_FC_ENTRIES_16(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16) \ - FORY_FC_ENTRIES_15(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15), \ - FORY_FC_MAKE_ENTRY(T, _16) -#define FORY_FC_ENTRIES_17(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17) \ - FORY_FC_ENTRIES_16(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16), \ - FORY_FC_MAKE_ENTRY(T, _17) -#define FORY_FC_ENTRIES_18(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18) \ - FORY_FC_ENTRIES_17(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17), \ - FORY_FC_MAKE_ENTRY(T, _18) -#define FORY_FC_ENTRIES_19(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19) \ - FORY_FC_ENTRIES_18(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18), \ - FORY_FC_MAKE_ENTRY(T, _19) -#define FORY_FC_ENTRIES_20(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20) \ - FORY_FC_ENTRIES_19(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19), \ - FORY_FC_MAKE_ENTRY(T, _20) -#define FORY_FC_ENTRIES_21(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ - FORY_FC_ENTRIES_20(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20), \ - FORY_FC_MAKE_ENTRY(T, _21) -#define FORY_FC_ENTRIES_22(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22) \ - FORY_FC_ENTRIES_21(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21), \ - FORY_FC_MAKE_ENTRY(T, _22) -#define FORY_FC_ENTRIES_23(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23) \ - FORY_FC_ENTRIES_22(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22), \ - FORY_FC_MAKE_ENTRY(T, _23) -#define FORY_FC_ENTRIES_24(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24) \ - FORY_FC_ENTRIES_23(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23), \ - FORY_FC_MAKE_ENTRY(T, _24) -#define FORY_FC_ENTRIES_25(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25) \ - FORY_FC_ENTRIES_24(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24), \ - FORY_FC_MAKE_ENTRY(T, _25) -#define FORY_FC_ENTRIES_26(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26) \ - FORY_FC_ENTRIES_25(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25), \ - FORY_FC_MAKE_ENTRY(T, _26) -#define FORY_FC_ENTRIES_27(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27) \ - FORY_FC_ENTRIES_26(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26), \ - FORY_FC_MAKE_ENTRY(T, _27) -#define FORY_FC_ENTRIES_28(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28) \ - FORY_FC_ENTRIES_27(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27), \ - FORY_FC_MAKE_ENTRY(T, _28) -#define FORY_FC_ENTRIES_29(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29) \ - FORY_FC_ENTRIES_28(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28), \ - FORY_FC_MAKE_ENTRY(T, _29) -#define FORY_FC_ENTRIES_30(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30) \ - FORY_FC_ENTRIES_29(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29), \ - FORY_FC_MAKE_ENTRY(T, _30) -#define FORY_FC_ENTRIES_31(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \ - FORY_FC_ENTRIES_30(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30), \ - FORY_FC_MAKE_ENTRY(T, _31) -#define FORY_FC_ENTRIES_32(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32) \ - FORY_FC_ENTRIES_31(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31), \ - FORY_FC_MAKE_ENTRY(T, _32) -#define FORY_FC_ENTRIES_33(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33) \ - FORY_FC_ENTRIES_32(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32), \ - FORY_FC_MAKE_ENTRY(T, _33) -#define FORY_FC_ENTRIES_34(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34) \ - FORY_FC_ENTRIES_33(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33), \ - FORY_FC_MAKE_ENTRY(T, _34) -#define FORY_FC_ENTRIES_35(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35) \ - FORY_FC_ENTRIES_34(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34), \ - FORY_FC_MAKE_ENTRY(T, _35) -#define FORY_FC_ENTRIES_36(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36) \ - FORY_FC_ENTRIES_35(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35), \ - FORY_FC_MAKE_ENTRY(T, _36) -#define FORY_FC_ENTRIES_37(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37) \ - FORY_FC_ENTRIES_36(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36), \ - FORY_FC_MAKE_ENTRY(T, _37) -#define FORY_FC_ENTRIES_38(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38) \ - FORY_FC_ENTRIES_37(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37), \ - FORY_FC_MAKE_ENTRY(T, _38) -#define FORY_FC_ENTRIES_39(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39) \ - FORY_FC_ENTRIES_38(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38), \ - FORY_FC_MAKE_ENTRY(T, _39) -#define FORY_FC_ENTRIES_40(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40) \ - FORY_FC_ENTRIES_39(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39), \ - FORY_FC_MAKE_ENTRY(T, _40) -#define FORY_FC_ENTRIES_41(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \ - FORY_FC_ENTRIES_40(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40), \ - FORY_FC_MAKE_ENTRY(T, _41) -#define FORY_FC_ENTRIES_42( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \ - FORY_FC_ENTRIES_41(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41), \ - FORY_FC_MAKE_ENTRY(T, _42) -#define FORY_FC_ENTRIES_43( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \ - FORY_FC_ENTRIES_42(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42), \ - FORY_FC_MAKE_ENTRY(T, _43) -#define FORY_FC_ENTRIES_44( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \ - FORY_FC_ENTRIES_43(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43), \ - FORY_FC_MAKE_ENTRY(T, _44) -#define FORY_FC_ENTRIES_45( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \ - FORY_FC_ENTRIES_44(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44), \ - FORY_FC_MAKE_ENTRY(T, _45) -#define FORY_FC_ENTRIES_46( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \ - FORY_FC_ENTRIES_45(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45), \ - FORY_FC_MAKE_ENTRY(T, _46) -#define FORY_FC_ENTRIES_47(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, \ - _42, _43, _44, _45, _46, _47) \ - FORY_FC_ENTRIES_46(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46), \ - FORY_FC_MAKE_ENTRY(T, _47) -#define FORY_FC_ENTRIES_48(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, \ - _42, _43, _44, _45, _46, _47, _48) \ - FORY_FC_ENTRIES_47(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47), \ - FORY_FC_MAKE_ENTRY(T, _48) -#define FORY_FC_ENTRIES_49(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, \ - _42, _43, _44, _45, _46, _47, _48, _49) \ - FORY_FC_ENTRIES_48(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48), \ - FORY_FC_MAKE_ENTRY(T, _49) -#define FORY_FC_ENTRIES_50(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, \ - _42, _43, _44, _45, _46, _47, _48, _49, _50) \ - FORY_FC_ENTRIES_49(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49), \ - FORY_FC_MAKE_ENTRY(T, _50) -#define FORY_FC_ENTRIES_51(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, \ - _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, \ - _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, \ - _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \ - FORY_FC_ENTRIES_50(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50), \ - FORY_FC_MAKE_ENTRY(T, _51) -#define FORY_FC_ENTRIES_52( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52) \ - FORY_FC_ENTRIES_51(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51), \ - FORY_FC_MAKE_ENTRY(T, _52) -#define FORY_FC_ENTRIES_53( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53) \ - FORY_FC_ENTRIES_52(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52), \ - FORY_FC_MAKE_ENTRY(T, _53) -#define FORY_FC_ENTRIES_54( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54) \ - FORY_FC_ENTRIES_53(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53), \ - FORY_FC_MAKE_ENTRY(T, _54) -#define FORY_FC_ENTRIES_55( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55) \ - FORY_FC_ENTRIES_54(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54), \ - FORY_FC_MAKE_ENTRY(T, _55) -#define FORY_FC_ENTRIES_56( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \ - FORY_FC_ENTRIES_55(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55), \ - FORY_FC_MAKE_ENTRY(T, _56) -#define FORY_FC_ENTRIES_57( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \ - FORY_FC_ENTRIES_56(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56), \ - FORY_FC_MAKE_ENTRY(T, _57) -#define FORY_FC_ENTRIES_58( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \ - FORY_FC_ENTRIES_57( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, \ - _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \ - _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, \ - _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57), \ - FORY_FC_MAKE_ENTRY(T, _58) -#define FORY_FC_ENTRIES_59( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \ - FORY_FC_ENTRIES_58(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \ - _57, _58), \ - FORY_FC_MAKE_ENTRY(T, _59) -#define FORY_FC_ENTRIES_60( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \ - FORY_FC_ENTRIES_59(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \ - _57, _58, _59), \ - FORY_FC_MAKE_ENTRY(T, _60) -#define FORY_FC_ENTRIES_61( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \ - FORY_FC_ENTRIES_60(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \ - _57, _58, _59, _60), \ - FORY_FC_MAKE_ENTRY(T, _61) -#define FORY_FC_ENTRIES_62( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, \ - _62) \ - FORY_FC_ENTRIES_61(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \ - _57, _58, _59, _60, _61), \ - FORY_FC_MAKE_ENTRY(T, _62) -#define FORY_FC_ENTRIES_63( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, \ - _62, _63) \ - FORY_FC_ENTRIES_62(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \ - _57, _58, _59, _60, _61, _62), \ - FORY_FC_MAKE_ENTRY(T, _63) -#define FORY_FC_ENTRIES_64( \ - T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ - _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \ - _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, \ - _62, _63, _64) \ - FORY_FC_ENTRIES_63(T, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ - _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \ - _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \ - _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \ - _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \ - _57, _58, _59, _60, _61, _62, _63), \ - FORY_FC_MAKE_ENTRY(T, _64) - -// Main FORY_FIELD_CONFIG macro -// Creates a constexpr tuple of FieldEntry objects with member pointer -// verification. Descriptor name uses a unique line-based token. -#define FORY_FC_DESCRIPTOR_NAME(line) \ - FORY_PP_CONCAT(ForyFieldConfigDescriptor_, line) -#define FORY_FIELD_CONFIG(Type, ...) \ - FORY_FIELD_CONFIG_IMPL(__LINE__, Type, __VA_ARGS__) -#define FORY_FIELD_CONFIG_IMPL(line, Type, ...) \ - struct FORY_FC_DESCRIPTOR_NAME(line) { \ - static constexpr bool has_config = true; \ - static inline constexpr auto entries = \ - std::make_tuple(FORY_FC_ENTRIES(Type, __VA_ARGS__)); \ - static constexpr size_t field_count = \ - std::tuple_size_v>; \ - }; \ - constexpr auto fory_field_config(::fory::meta::Identity) { \ - return FORY_FC_DESCRIPTOR_NAME(line){}; \ - } \ - static_assert(true) diff --git a/cpp/fory/meta/field_info.h b/cpp/fory/meta/field_info.h index f49cfddfee..290e252ee4 100644 --- a/cpp/fory/meta/field_info.h +++ b/cpp/fory/meta/field_info.h @@ -29,6 +29,277 @@ namespace fory { +/// Encoding strategies for integer field nodes. +enum class Encoding { Default = 0, Varint = 1, Fixed = 2, Tagged = 3 }; + +enum class FieldNodeKind { + Default = 0, + Scalar = 1, + List = 2, + Set = 3, + Map = 4, + Inner = 5 +}; + +enum class FieldScalarKind { + Inferred = 0, + Bool, + Int8, + Int16, + Int32, + Int64, + UInt8, + UInt16, + UInt32, + UInt64, + Float16, + BFloat16, + Float32, + Float64, + String +}; + +struct FieldNodeSpec { + static constexpr uint8_t kMaxNodes = 16; + + FieldNodeKind kind_[kMaxNodes]{}; + Encoding encoding_[kMaxNodes]{}; + FieldScalarKind scalar_[kMaxNodes]{}; + int8_t child0_[kMaxNodes]{}; + int8_t child1_[kMaxNodes]{}; + uint8_t size_ = 1; + + constexpr FieldNodeSpec() { + for (uint8_t i = 0; i < kMaxNodes; ++i) { + kind_[i] = FieldNodeKind::Default; + encoding_[i] = Encoding::Default; + scalar_[i] = FieldScalarKind::Inferred; + child0_[i] = -1; + child1_[i] = -1; + } + } + + static constexpr FieldNodeSpec + scalar(FieldScalarKind scalar_kind = FieldScalarKind::Inferred) { + FieldNodeSpec spec; + spec.kind_[0] = FieldNodeKind::Scalar; + spec.scalar_[0] = scalar_kind; + return spec; + } + + constexpr int8_t append_tree(const FieldNodeSpec &child, + int8_t child_index = 0) { + const int8_t dest = static_cast(size_++); + kind_[dest] = child.kind_[child_index]; + encoding_[dest] = child.encoding_[child_index]; + scalar_[dest] = child.scalar_[child_index]; + if (child.child0_[child_index] >= 0) { + child0_[dest] = append_tree(child, child.child0_[child_index]); + } + if (child.child1_[child_index] >= 0) { + child1_[dest] = append_tree(child, child.child1_[child_index]); + } + return dest; + } + + constexpr FieldNodeSpec with_encoding(Encoding encoding) const { + auto copy = *this; + copy.encoding_[0] = encoding; + if (copy.kind_[0] == FieldNodeKind::Default) { + copy.kind_[0] = FieldNodeKind::Scalar; + } + return copy; + } + + constexpr FieldNodeSpec fixed() const { + return with_encoding(Encoding::Fixed); + } + constexpr FieldNodeSpec varint() const { + return with_encoding(Encoding::Varint); + } + constexpr FieldNodeSpec tagged() const { + return with_encoding(Encoding::Tagged); + } + + constexpr FieldNodeSpec list(FieldNodeSpec elem) const { + auto copy = *this; + copy.size_ = 1; + copy.kind_[0] = FieldNodeKind::List; + copy.child0_[0] = copy.append_tree(elem); + copy.child1_[0] = -1; + copy.encoding_[0] = Encoding::Default; + return copy; + } + + constexpr FieldNodeSpec set(FieldNodeSpec elem) const { + auto copy = *this; + copy.size_ = 1; + copy.kind_[0] = FieldNodeKind::Set; + copy.child0_[0] = copy.append_tree(elem); + copy.child1_[0] = -1; + copy.encoding_[0] = Encoding::Default; + return copy; + } + + constexpr FieldNodeSpec map() const { + auto copy = *this; + copy.size_ = 1; + copy.kind_[0] = FieldNodeKind::Map; + copy.child0_[0] = -1; + copy.child1_[0] = -1; + copy.encoding_[0] = Encoding::Default; + return copy; + } + + constexpr FieldNodeSpec map(FieldNodeSpec key, FieldNodeSpec value) const { + return map().key(key).value(value); + } + + constexpr FieldNodeSpec key(FieldNodeSpec key_spec) const { + auto copy = *this; + copy.kind_[0] = FieldNodeKind::Map; + copy.child0_[0] = copy.append_tree(key_spec); + return copy; + } + + constexpr FieldNodeSpec value(FieldNodeSpec value_spec) const { + auto copy = *this; + copy.kind_[0] = FieldNodeKind::Map; + copy.child1_[0] = copy.append_tree(value_spec); + return copy; + } + + constexpr FieldNodeSpec inner(FieldNodeSpec child) const { + auto copy = *this; + copy.size_ = 1; + copy.kind_[0] = FieldNodeKind::Inner; + copy.child0_[0] = copy.append_tree(child); + copy.child1_[0] = -1; + copy.encoding_[0] = Encoding::Default; + return copy; + } +}; + +struct FieldMeta { + int16_t id_ = -1; + bool has_id_ = false; + bool nullable_ = false; + bool ref_ = false; + int dynamic_ = -1; + FieldNodeSpec spec_{}; + Encoding encoding_ = Encoding::Default; + bool compress_ = true; + int16_t type_id_override_ = -1; + + constexpr FieldMeta id(int16_t v) const { + auto copy = *this; + copy.id_ = v; + copy.has_id_ = true; + return copy; + } + constexpr FieldMeta nullable(bool v = true) const { + auto copy = *this; + copy.nullable_ = v; + return copy; + } + constexpr FieldMeta ref(bool v = true) const { + auto copy = *this; + copy.ref_ = v; + return copy; + } + constexpr FieldMeta dynamic(bool v) const { + auto copy = *this; + copy.dynamic_ = v ? 1 : 0; + return copy; + } + constexpr FieldMeta with_spec(FieldNodeSpec spec) const { + auto copy = *this; + copy.spec_ = spec; + copy.encoding_ = spec.encoding_[0]; + return copy; + } + constexpr FieldMeta fixed() const { return with_spec(spec_.fixed()); } + constexpr FieldMeta varint() const { return with_spec(spec_.varint()); } + constexpr FieldMeta tagged() const { return with_spec(spec_.tagged()); } + constexpr FieldMeta list(FieldNodeSpec elem) const { + return with_spec(spec_.list(elem)); + } + constexpr FieldMeta set(FieldNodeSpec elem) const { + return with_spec(spec_.set(elem)); + } + constexpr FieldMeta map() const { return with_spec(spec_.map()); } + constexpr FieldMeta map(FieldNodeSpec key, FieldNodeSpec value) const { + return with_spec(spec_.map(key, value)); + } + constexpr FieldMeta key(FieldNodeSpec key_spec) const { + return with_spec(spec_.key(key_spec)); + } + constexpr FieldMeta value(FieldNodeSpec value_spec) const { + return with_spec(spec_.value(value_spec)); + } + constexpr FieldMeta inner(FieldNodeSpec child) const { + return with_spec(spec_.inner(child)); + } +}; + +constexpr FieldMeta F() { return FieldMeta{}; } +constexpr FieldMeta F(int16_t id) { return FieldMeta{}.id(id); } + +namespace T { + +constexpr FieldNodeSpec +scalar(FieldScalarKind kind = FieldScalarKind::Inferred) { + return FieldNodeSpec::scalar(kind); +} +constexpr FieldNodeSpec fixed() { return scalar().fixed(); } +constexpr FieldNodeSpec varint() { return scalar().varint(); } +constexpr FieldNodeSpec tagged() { return scalar().tagged(); } +constexpr FieldNodeSpec list(FieldNodeSpec elem) { + return FieldNodeSpec{}.list(elem); +} +constexpr FieldNodeSpec set(FieldNodeSpec elem) { + return FieldNodeSpec{}.set(elem); +} +constexpr FieldNodeSpec map() { return FieldNodeSpec{}.map(); } +constexpr FieldNodeSpec map(FieldNodeSpec key, FieldNodeSpec value) { + return FieldNodeSpec{}.map(key, value); +} +constexpr FieldNodeSpec inner(FieldNodeSpec child) { + return FieldNodeSpec{}.inner(child); +} + +constexpr FieldNodeSpec boolean() { return scalar(FieldScalarKind::Bool); } +constexpr FieldNodeSpec int8() { return scalar(FieldScalarKind::Int8); } +constexpr FieldNodeSpec int16() { return scalar(FieldScalarKind::Int16); } +constexpr FieldNodeSpec int32() { return scalar(FieldScalarKind::Int32); } +constexpr FieldNodeSpec int64() { return scalar(FieldScalarKind::Int64); } +constexpr FieldNodeSpec uint8() { return scalar(FieldScalarKind::UInt8); } +constexpr FieldNodeSpec uint16() { return scalar(FieldScalarKind::UInt16); } +constexpr FieldNodeSpec uint32() { return scalar(FieldScalarKind::UInt32); } +constexpr FieldNodeSpec uint64() { return scalar(FieldScalarKind::UInt64); } +constexpr FieldNodeSpec float16() { return scalar(FieldScalarKind::Float16); } +constexpr FieldNodeSpec bfloat16() { return scalar(FieldScalarKind::BFloat16); } +constexpr FieldNodeSpec float32() { return scalar(FieldScalarKind::Float32); } +constexpr FieldNodeSpec float64() { return scalar(FieldScalarKind::Float64); } +constexpr FieldNodeSpec string() { return scalar(FieldScalarKind::String); } + +} // namespace T + +namespace detail { + +struct FieldEntry { + const char *name; + FieldMeta meta; + + constexpr FieldEntry(const char *n, FieldMeta m) : name(n), meta(m) {} +}; + +constexpr auto make_field_entry(const char *name, FieldMeta meta) { + return FieldEntry{name, meta}; +} + +} // namespace detail + namespace meta { template struct Identity { @@ -214,15 +485,40 @@ constexpr auto concat_tuples_from_tuple(const Tuple &tuple) { #define FORY_BASE_TYPE(arg) FORY_PP_TUPLE_SECOND(arg) +#define FORY_PP_IS_CONFIG(arg) \ + FORY_PP_IS_CONFIG_IMPL(FORY_PP_IS_PAREN(arg), arg) +#define FORY_PP_IS_CONFIG_IMPL(is_paren, arg) \ + FORY_PP_CONCAT(FORY_PP_IS_CONFIG_IMPL_, is_paren)(arg) +#define FORY_PP_IS_CONFIG_IMPL_0(arg) 0 +#define FORY_PP_IS_CONFIG_IMPL_1(arg) FORY_PP_NOT(FORY_PP_IS_BASE(arg)) + +#define FORY_FIELD_ARG_NAME(arg) \ + FORY_PP_IF(FORY_PP_IS_CONFIG(arg)) \ + (FORY_PP_TUPLE_FIRST(arg), arg) + +#define FORY_FIELD_ARG_META(arg) \ + FORY_PP_IF(FORY_PP_IS_CONFIG(arg)) \ + (FORY_PP_TUPLE_SECOND(arg), ::fory::F()) + #define FORY_FIELD_INFO_NAMES_FIELD(field) #field, +#define FORY_FIELD_INFO_NAMES_ARG(arg) FORY_FIELD_INFO_NAMES_FIELD(arg) #define FORY_FIELD_INFO_NAMES_FUNC(arg) \ FORY_PP_IF(FORY_PP_IS_BASE(arg)) \ - (FORY_PP_EMPTY(), FORY_FIELD_INFO_NAMES_FIELD(arg)) + (FORY_PP_EMPTY(), FORY_FIELD_INFO_NAMES_ARG(FORY_FIELD_ARG_NAME(arg))) #define FORY_FIELD_INFO_PTRS_FIELD(type, field) &type::field, +#define FORY_FIELD_INFO_PTRS_ARG(type, field) \ + FORY_FIELD_INFO_PTRS_FIELD(type, field) #define FORY_FIELD_INFO_PTRS_FUNC(type, arg) \ FORY_PP_IF(FORY_PP_IS_BASE(arg)) \ - (FORY_PP_EMPTY(), FORY_FIELD_INFO_PTRS_FIELD(type, arg)) + (FORY_PP_EMPTY(), FORY_FIELD_INFO_PTRS_ARG(type, FORY_FIELD_ARG_NAME(arg))) + +#define FORY_FIELD_INFO_CONFIG_ENTRY(arg) \ + ::fory::detail::make_field_entry( \ + FORY_PP_STRINGIFY(FORY_FIELD_ARG_NAME(arg)), FORY_FIELD_ARG_META(arg)), +#define FORY_FIELD_INFO_CONFIG_FUNC(arg) \ + FORY_PP_IF(FORY_PP_IS_BASE(arg)) \ + (FORY_PP_EMPTY(), FORY_FIELD_INFO_CONFIG_ENTRY(arg)) #define FORY_BASE_NAMES_ARG(arg) \ FORY_PP_IF(FORY_PP_IS_BASE(arg)) \ @@ -268,6 +564,13 @@ constexpr auto concat_tuples_from_tuple(const Tuple &tuple) { static inline constexpr std::array \ FieldNames = { \ FORY_PP_FOREACH(FORY_FIELD_INFO_NAMES_FUNC, __VA_ARGS__)}; \ + static inline constexpr auto FieldConfigEntries = \ + std::tuple{FORY_PP_FOREACH(FORY_FIELD_INFO_CONFIG_FUNC, __VA_ARGS__)}; \ + static constexpr bool has_config = true; \ + static inline constexpr auto entries = FieldConfigEntries; \ + using FieldConfigEntriesType = std::decay_t; \ + [[maybe_unused]] static constexpr size_t field_count = \ + std::tuple_size_v; \ static inline constexpr auto Names = \ fory::meta::concat_arrays(BaseNames, FieldNames); \ using BasePtrsType = decltype(fory::meta::concat_tuples_from_tuple( \ @@ -303,6 +606,10 @@ constexpr auto concat_tuples_from_tuple(const Tuple &tuple) { const ::fory::meta::Identity &) noexcept { \ return FORY_PP_CONCAT(ForyFieldInfoDescriptor_, unique_id){}; \ } \ + [[maybe_unused]] inline static constexpr auto fory_field_config( \ + const ::fory::meta::Identity &) noexcept { \ + return FORY_PP_CONCAT(ForyFieldInfoDescriptor_, unique_id){}; \ + } \ [[maybe_unused]] inline static constexpr std::true_type fory_struct_marker( \ const ::fory::meta::Identity &) noexcept { \ return {}; \ @@ -314,6 +621,9 @@ constexpr auto concat_tuples_from_tuple(const Tuple &tuple) { static inline constexpr size_t Size = 0; \ static inline constexpr std::string_view Name = #type; \ static inline constexpr std::array Names = {}; \ + static constexpr bool has_config = false; \ + static inline constexpr auto entries = std::tuple{}; \ + [[maybe_unused]] static constexpr size_t field_count = 0; \ using PtrsType = decltype(std::tuple{}); \ static constexpr PtrsType ptrs() { return {}; } \ static const PtrsType &ptrs_ref() { \ @@ -332,6 +642,10 @@ constexpr auto concat_tuples_from_tuple(const Tuple &tuple) { const ::fory::meta::Identity &) noexcept { \ return FORY_PP_CONCAT(ForyFieldInfoDescriptor_, unique_id){}; \ } \ + [[maybe_unused]] inline static constexpr auto fory_field_config( \ + const ::fory::meta::Identity &) noexcept { \ + return FORY_PP_CONCAT(ForyFieldInfoDescriptor_, unique_id){}; \ + } \ [[maybe_unused]] inline static constexpr std::true_type fory_struct_marker( \ const ::fory::meta::Identity &) noexcept { \ return {}; \ diff --git a/cpp/fory/meta/field_test.cc b/cpp/fory/meta/field_test.cc index f8c92af562..2e756e192d 100644 --- a/cpp/fory/meta/field_test.cc +++ b/cpp/fory/meta/field_test.cc @@ -21,396 +21,98 @@ #include "fory/meta/field.h" #include "fory/meta/field_info.h" +#include #include #include #include +#include -namespace fory { +namespace fory::test { -namespace test { +namespace T = fory::T; -// ============================================================================ -// Type Traits Tests -// ============================================================================ - -TEST(FieldTraits, IsSharedPtr) { +TEST(FieldTraits, CarrierTraits) { static_assert(!detail::is_shared_ptr_v); - static_assert(!detail::is_shared_ptr_v); - static_assert(!detail::is_shared_ptr_v>); static_assert(detail::is_shared_ptr_v>); - static_assert(detail::is_shared_ptr_v>); -} - -TEST(FieldTraits, IsUniquePtr) { static_assert(!detail::is_unique_ptr_v); - static_assert(!detail::is_unique_ptr_v); - static_assert(!detail::is_unique_ptr_v>); static_assert(detail::is_unique_ptr_v>); - static_assert(detail::is_unique_ptr_v>); -} - -TEST(FieldTraits, IsOptional) { static_assert(!detail::is_optional_v); - static_assert(!detail::is_optional_v); - static_assert(!detail::is_optional_v>); static_assert(detail::is_optional_v>); - static_assert(detail::is_optional_v>); -} - -TEST(FieldTraits, IsSmartPtr) { - static_assert(!detail::is_smart_ptr_v); - static_assert(!detail::is_smart_ptr_v); static_assert(!detail::is_smart_ptr_v>); static_assert(detail::is_smart_ptr_v>); static_assert(detail::is_smart_ptr_v>); } -// ============================================================================ -// fory::field<> Basic Tests -// ============================================================================ - -TEST(Field, BasicPrimitive) { - using FieldType = field; - static_assert(FieldType::tag_id == 0); - static_assert(FieldType::is_nullable == false); - static_assert(FieldType::track_ref == false); +TEST(FieldBuilder, ScalarEncodingSpec) { + constexpr auto fixed = fory::F(7).fixed(); + static_assert(fixed.has_id_); + static_assert(fixed.id_ == 7); + static_assert(fixed.encoding_ == Encoding::Fixed); + static_assert(fixed.spec_.encoding_[0] == Encoding::Fixed); - FieldType f; - f = 42; - EXPECT_EQ(f.value, 42); - - // Implicit conversion - int32_t val = f; - EXPECT_EQ(val, 42); + constexpr auto tagged = T::uint64().tagged(); + static_assert(tagged.scalar_[0] == FieldScalarKind::UInt64); + static_assert(tagged.encoding_[0] == Encoding::Tagged); } -TEST(Field, BasicString) { - using FieldType = field; - static_assert(FieldType::tag_id == 1); - static_assert(FieldType::is_nullable == false); - static_assert(FieldType::track_ref == false); - - FieldType f; - f = "hello"; - EXPECT_EQ(f.value, "hello"); +TEST(FieldBuilder, NestedSpecComposition) { + constexpr auto spec = fory::F().map(T::varint(), T::list(T::tagged())); + static_assert(!spec.has_id_); + static_assert(spec.spec_.kind_[0] == FieldNodeKind::Map); + static_assert(spec.spec_.kind_[1] == FieldNodeKind::Scalar); + static_assert(spec.spec_.encoding_[1] == Encoding::Varint); + static_assert(spec.spec_.kind_[2] == FieldNodeKind::List); + static_assert(spec.spec_.encoding_[3] == Encoding::Tagged); } -TEST(Field, OptionalField) { - // std::optional is inherently nullable - using FieldType = field, 2>; - static_assert(FieldType::tag_id == 2); - static_assert(FieldType::is_nullable == true); - static_assert(FieldType::track_ref == false); +TEST(FieldBuilder, ChainMapPartialOverrides) { + constexpr auto key_only = fory::F().map().key(T::varint()); + static_assert(key_only.spec_.kind_[0] == FieldNodeKind::Map); + static_assert(key_only.spec_.child0_[0] == 1); + static_assert(key_only.spec_.child1_[0] == -1); + static_assert(key_only.spec_.encoding_[1] == Encoding::Varint); - FieldType f; - f = std::optional(123); - EXPECT_TRUE(f.value.has_value()); - EXPECT_EQ(*f.value, 123); + constexpr auto value_only = fory::F().map().value(T::list(T::tagged())); + static_assert(value_only.spec_.child0_[0] == -1); + static_assert(value_only.spec_.child1_[0] == 1); + static_assert(value_only.spec_.kind_[1] == FieldNodeKind::List); + static_assert(value_only.spec_.encoding_[2] == Encoding::Tagged); } -TEST(Field, SharedPtrNonNullable) { - // shared_ptr is non-nullable by default - using FieldType = field, 3>; - static_assert(FieldType::tag_id == 3); - static_assert(FieldType::is_nullable == false); - static_assert(FieldType::track_ref == true); - - FieldType f; - f = std::make_shared(99); - EXPECT_NE(f.value, nullptr); - EXPECT_EQ(*f.value, 99); -} - -TEST(Field, SharedPtrNullable) { - // shared_ptr with nullable option - using FieldType = field, 4, nullable>; - static_assert(FieldType::tag_id == 4); - static_assert(FieldType::is_nullable == true); - static_assert(FieldType::track_ref == true); - - FieldType f; - EXPECT_EQ(f.value, nullptr); // Default is null -} - -TEST(Field, SharedPtrWithRef) { - // shared_ptr with ref tracking - using FieldType = field, 5, ref>; - static_assert(FieldType::tag_id == 5); - static_assert(FieldType::is_nullable == false); - static_assert(FieldType::track_ref == true); -} - -TEST(Field, SharedPtrNullableWithRef) { - // shared_ptr with both nullable and ref - using FieldType = field, 6, nullable, ref>; - static_assert(FieldType::tag_id == 6); - static_assert(FieldType::is_nullable == true); - static_assert(FieldType::track_ref == true); -} +struct NameModeStruct { + uint32_t id; + std::optional> values; -TEST(Field, UniquePtrNonNullable) { - // unique_ptr is non-nullable by default - using FieldType = field, 7>; - static_assert(FieldType::tag_id == 7); - static_assert(FieldType::is_nullable == false); - static_assert(FieldType::track_ref == false); // ref not valid for unique_ptr -} - -TEST(Field, UniquePtrNullable) { - // unique_ptr with nullable option - using FieldType = field, 8, nullable>; - static_assert(FieldType::tag_id == 8); - static_assert(FieldType::is_nullable == true); - static_assert(FieldType::track_ref == false); -} - -TEST(Field, SharedPtrNotNull) { - // shared_ptr with not_null option (explicit non-nullable) - using FieldType = field, 9, not_null>; - static_assert(FieldType::tag_id == 9); - static_assert(FieldType::is_nullable == false); - static_assert(FieldType::track_ref == true); -} - -TEST(Field, SharedPtrNotNullWithRef) { - // shared_ptr with not_null and ref options - using FieldType = field, 10, not_null, ref>; - static_assert(FieldType::tag_id == 10); - static_assert(FieldType::is_nullable == false); - static_assert(FieldType::track_ref == true); -} - -// ============================================================================ -// fory::field<> Type Traits Tests -// ============================================================================ - -TEST(FieldTraits, IsForyField) { - static_assert(!is_fory_field_v); - static_assert(!is_fory_field_v); - static_assert(!is_fory_field_v>); - static_assert(is_fory_field_v>); - static_assert(is_fory_field_v>); - static_assert(is_fory_field_v, 2, nullable>>); -} - -TEST(FieldTraits, UnwrapField) { - static_assert(std::is_same_v, int>); - static_assert(std::is_same_v, std::string>); - static_assert(std::is_same_v>, int>); - static_assert( - std::is_same_v>, std::string>); - static_assert( - std::is_same_v, 2, nullable>>, - std::shared_ptr>); -} - -TEST(FieldTraits, FieldTagId) { - static_assert(field_tag_id_v == -1); - static_assert(field_tag_id_v> == 0); - static_assert(field_tag_id_v> == 42); -} - -TEST(FieldTraits, FieldIsNullable) { - static_assert(field_is_nullable_v == false); - static_assert(field_is_nullable_v> == true); - static_assert(field_is_nullable_v> == false); - static_assert(field_is_nullable_v, 1>> == true); - static_assert(field_is_nullable_v, 2>> == false); - static_assert(field_is_nullable_v, 3, nullable>> == - true); -} - -TEST(FieldTraits, FieldTrackRef) { - static_assert(field_track_ref_v == false); - static_assert(field_track_ref_v> == true); - static_assert(field_track_ref_v> == false); - static_assert(field_track_ref_v, 1>> == true); - static_assert(field_track_ref_v, 2, ref>> == true); - static_assert( - field_track_ref_v, 3, nullable, ref>> == true); -} - -// ============================================================================ -// Struct with fory::field<> members -// ============================================================================ - -struct Person { - field name; - field age; - field, 2> nickname; - field, 3, ref> parent; - field, 4, nullable> guardian; - FORY_STRUCT(Person, name, age, nickname, parent, guardian); -}; - -TEST(FieldStruct, BasicUsage) { - Person p; - p.name = "Alice"; - p.age = 30; - p.nickname = std::optional("Ali"); - p.parent = nullptr; - p.guardian = nullptr; - - EXPECT_EQ(p.name.value, "Alice"); - EXPECT_EQ(p.age.value, 30); - EXPECT_TRUE(p.nickname.value.has_value()); - EXPECT_EQ(*p.nickname.value, "Ali"); - EXPECT_EQ(p.parent.value, nullptr); - EXPECT_EQ(p.guardian.value, nullptr); -} - -TEST(FieldStruct, FieldInfo) { - Person p; - constexpr auto info = meta::fory_field_info(p); - - static_assert(info.Size == 5); - static_assert(info.Name == "Person"); - static_assert(info.Names[0] == "name"); - static_assert(info.Names[1] == "age"); - static_assert(info.Names[2] == "nickname"); - static_assert(info.Names[3] == "parent"); - static_assert(info.Names[4] == "guardian"); -} - -} // namespace test - -} // namespace fory - -// ============================================================================ -// FORY_FIELD_TAGS Macro Tests -// ============================================================================ - -namespace field_tags_test { - -// Test struct with pure C++ types (no fory::field wrappers) -struct Document { - std::string title; - int32_t version; - std::optional description; - std::shared_ptr author; - std::shared_ptr reviewer; - std::shared_ptr parent; - std::unique_ptr metadata; - FORY_STRUCT(Document, title, version, description, author, reviewer, parent, - metadata); + FORY_STRUCT(NameModeStruct, id, + (values, fory::F().inner(T::list(T::tagged())))); }; -// Test struct with nullable + ref combined -struct Node { - std::string name; - std::shared_ptr left; - std::shared_ptr right; - FORY_STRUCT(Node, name, left, right); -}; +struct IdModeStruct { + uint32_t id; + std::map> values; -// Test with single field -struct SingleField { - int32_t value; - FORY_STRUCT(SingleField, value); + FORY_STRUCT(IdModeStruct, (id, fory::F(0).varint()), + (values, fory::F(1).map(T::varint(), T::list(T::tagged())))); }; -// Define field tags in the same namespace as the types. -FORY_FIELD_TAGS(Document, (title, 0), // string: non-nullable - (version, 1), // int: non-nullable - (description, 2), // optional: inherently nullable - (author, 3), // shared_ptr: non-nullable (default) - (reviewer, 4, nullable), // shared_ptr: nullable - (parent, 5, ref), // shared_ptr: non-nullable, ref - (metadata, 6, nullable)); // unique_ptr: nullable - -FORY_FIELD_TAGS(Node, (name, 0), (left, 1, nullable, ref), - (right, 2, nullable, ref)); - -FORY_FIELD_TAGS(SingleField, (value, 0)); - -} // namespace field_tags_test - -namespace fory { -namespace test { - -using field_tags_test::Document; -using field_tags_test::Node; -using field_tags_test::SingleField; - -TEST(FieldTags, HasTags) { - static_assert(detail::has_field_tags_v == true); - static_assert(detail::has_field_tags_v == false); // Uses fory::field - static_assert(detail::has_field_tags_v == false); -} - -TEST(FieldTags, FieldCount) { - static_assert(detail::FieldTagsInfo::field_count == 7); -} - -TEST(FieldTags, TagIds) { - // Check tag IDs - static_assert(detail::GetFieldTagEntry::id == 0); - static_assert(detail::GetFieldTagEntry::id == 1); - static_assert(detail::GetFieldTagEntry::id == 2); - static_assert(detail::GetFieldTagEntry::id == 3); - static_assert(detail::GetFieldTagEntry::id == 4); - static_assert(detail::GetFieldTagEntry::id == 5); - static_assert(detail::GetFieldTagEntry::id == 6); -} - -TEST(FieldTags, Nullability) { - // title (string): non-nullable - static_assert(detail::GetFieldTagEntry::is_nullable == false); - // version (int): non-nullable - static_assert(detail::GetFieldTagEntry::is_nullable == false); - // description (optional): inherently nullable - static_assert(detail::GetFieldTagEntry::is_nullable == true); - // author (shared_ptr): non-nullable (default) - static_assert(detail::GetFieldTagEntry::is_nullable == false); - // reviewer (shared_ptr, nullable): nullable - static_assert(detail::GetFieldTagEntry::is_nullable == true); - // parent (shared_ptr, ref): non-nullable - static_assert(detail::GetFieldTagEntry::is_nullable == false); - // metadata (unique_ptr, nullable): nullable - static_assert(detail::GetFieldTagEntry::is_nullable == true); +TEST(FieldConfig, NameModeEntries) { + static_assert(detail::has_field_config_v); + static_assert(!detail::GetFieldConfigEntry::has_id); + static_assert(!detail::GetFieldConfigEntry::has_id); + static_assert(detail::GetFieldConfigEntry::spec.kind_[0] == + FieldNodeKind::Inner); } -TEST(FieldTags, RefTracking) { - // shared_ptr fields track refs by default - static_assert(detail::GetFieldTagEntry::track_ref == false); - static_assert(detail::GetFieldTagEntry::track_ref == false); - static_assert(detail::GetFieldTagEntry::track_ref == false); - static_assert(detail::GetFieldTagEntry::track_ref == true); - static_assert(detail::GetFieldTagEntry::track_ref == true); - static_assert(detail::GetFieldTagEntry::track_ref == true); - static_assert(detail::GetFieldTagEntry::track_ref == false); +TEST(FieldConfig, IdModeEntries) { + static_assert(detail::has_field_config_v); + static_assert(detail::GetFieldConfigEntry::has_id); + static_assert(detail::GetFieldConfigEntry::id == 0); + static_assert(detail::GetFieldConfigEntry::encoding == + Encoding::Varint); + static_assert(detail::GetFieldConfigEntry::has_id); + static_assert(detail::GetFieldConfigEntry::id == 1); + static_assert(detail::GetFieldConfigEntry::spec.kind_[0] == + FieldNodeKind::Map); } -TEST(FieldTags, NullableWithRef) { - // name: non-nullable, no ref - static_assert(detail::GetFieldTagEntry::id == 0); - static_assert(detail::GetFieldTagEntry::is_nullable == false); - static_assert(detail::GetFieldTagEntry::track_ref == false); - - // left: nullable + ref - static_assert(detail::GetFieldTagEntry::id == 1); - static_assert(detail::GetFieldTagEntry::is_nullable == true); - static_assert(detail::GetFieldTagEntry::track_ref == true); - - // right: nullable + ref - static_assert(detail::GetFieldTagEntry::id == 2); - static_assert(detail::GetFieldTagEntry::is_nullable == true); - static_assert(detail::GetFieldTagEntry::track_ref == true); -} - -TEST(FieldTags, SingleField) { - static_assert(detail::has_field_tags_v == true); - static_assert(detail::FieldTagsInfo::field_count == 1); - static_assert(detail::GetFieldTagEntry::id == 0); - static_assert(detail::GetFieldTagEntry::is_nullable == false); - static_assert(detail::GetFieldTagEntry::track_ref == false); -} - -} // namespace test - -} // namespace fory - -int main(int argc, char **argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} +} // namespace fory::test diff --git a/cpp/fory/serialization/BUILD b/cpp/fory/serialization/BUILD index 2308a59bf9..87b3ede02c 100644 --- a/cpp/fory/serialization/BUILD +++ b/cpp/fory/serialization/BUILD @@ -146,15 +146,6 @@ cc_test( ], ) -cc_test( - name = "field_serializer_test", - srcs = ["field_serializer_test.cc"], - deps = [ - ":fory_serialization", - "@googletest//:gtest", - ], -) - cc_test( name = "namespace_macro_test", srcs = ["namespace_macro_test.cc"], diff --git a/cpp/fory/serialization/field_serializer_test.cc b/cpp/fory/serialization/field_serializer_test.cc deleted file mode 100644 index 72ca3ff685..0000000000 --- a/cpp/fory/serialization/field_serializer_test.cc +++ /dev/null @@ -1,1211 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** - * Serialization tests for fory::field<> template. - * - * Tests struct serialization with fory::field<> members including: - * - Primitive fields with tag IDs - * - String fields with tag IDs - * - Optional fields (inherently nullable) - * - Smart pointer fields with nullable/ref options - * - Nested structs with field metadata - * - Reference tracking with fory::ref - */ - -#include "fory/meta/field.h" -#include "fory/serialization/fory.h" -#include "gtest/gtest.h" -#include -#include -#include -#include -#include - -// ============================================================================ -// Struct definitions with fory::field<> members -// ============================================================================ - -// Basic struct with primitive fields -struct FieldPerson { - fory::field name; - fory::field age; - fory::field score; - fory::field active; - - bool operator==(const FieldPerson &other) const { - return name.value == other.name.value && age.value == other.age.value && - score.value == other.score.value && - active.value == other.active.value; - } - FORY_STRUCT(FieldPerson, name, age, score, active); -}; - -// Struct with optional fields -struct FieldOptionalData { - fory::field required_name; - fory::field, 1> optional_age; - fory::field, 2> optional_email; - - bool operator==(const FieldOptionalData &other) const { - return required_name.value == other.required_name.value && - optional_age.value == other.optional_age.value && - optional_email.value == other.optional_email.value; - } - FORY_STRUCT(FieldOptionalData, required_name, optional_age, optional_email); -}; - -// Struct with shared_ptr fields (non-nullable by default) -struct FieldSharedPtrHolder { - fory::field, 0> value; - fory::field, 1> text; - - bool operator==(const FieldSharedPtrHolder &other) const { - if (static_cast(value.value) != static_cast(other.value.value)) - return false; - if (static_cast(text.value) != static_cast(other.text.value)) - return false; - if (value.value && *value.value != *other.value.value) - return false; - if (text.value && *text.value != *other.text.value) - return false; - return true; - } - FORY_STRUCT(FieldSharedPtrHolder, value, text); -}; - -// Struct with nullable shared_ptr fields -struct FieldNullableSharedPtr { - fory::field, 0, fory::nullable> nullable_value; - fory::field, 1, fory::nullable> nullable_text; - - bool operator==(const FieldNullableSharedPtr &other) const { - if (static_cast(nullable_value.value) != - static_cast(other.nullable_value.value)) - return false; - if (static_cast(nullable_text.value) != - static_cast(other.nullable_text.value)) - return false; - if (nullable_value.value && - *nullable_value.value != *other.nullable_value.value) - return false; - if (nullable_text.value && - *nullable_text.value != *other.nullable_text.value) - return false; - return true; - } - FORY_STRUCT(FieldNullableSharedPtr, nullable_value, nullable_text); -}; - -// Struct with unique_ptr fields -struct FieldUniquePtrHolder { - fory::field, 0> value; - fory::field, 1, fory::nullable> nullable_value; - FORY_STRUCT(FieldUniquePtrHolder, value, nullable_value); -}; - -// Nested struct for reference tracking tests -struct FieldNode { - fory::field id; - fory::field name; - - bool operator==(const FieldNode &other) const { - return id.value == other.id.value && name.value == other.name.value; - } - FORY_STRUCT(FieldNode, id, name); -}; - -// Struct with ref tracking for shared_ptr -struct FieldRefTrackingHolder { - fory::field, 0, fory::ref> first; - fory::field, 1, fory::ref> second; - FORY_STRUCT(FieldRefTrackingHolder, first, second); -}; - -// Struct with nullable + ref -struct FieldNullableRefHolder { - fory::field, 0, fory::nullable, fory::ref> node; - FORY_STRUCT(FieldNullableRefHolder, node); -}; - -// Struct with not_null + ref -struct FieldNotNullRefHolder { - fory::field, 0, fory::not_null, fory::ref> node; - FORY_STRUCT(FieldNotNullRefHolder, node); -}; - -// Struct with vector of field-wrapped structs -struct FieldVectorHolder { - fory::field, 0> nodes; - - bool operator==(const FieldVectorHolder &other) const { - return nodes.value == other.nodes.value; - } - FORY_STRUCT(FieldVectorHolder, nodes); -}; - -// Mixed struct: some fields with fory::field, some without -struct MixedFieldStruct { - fory::field field_name; - int32_t plain_age; // Not wrapped - fory::field field_score; - - bool operator==(const MixedFieldStruct &other) const { - return field_name.value == other.field_name.value && - plain_age == other.plain_age && - field_score.value == other.field_score.value; - } - FORY_STRUCT(MixedFieldStruct, field_name, plain_age, field_score); -}; - -// ============================================================================ -// Test Implementation -// ============================================================================ - -namespace fory { -namespace serialization { -namespace test { - -inline void register_field_test_types(Fory &fory) { - uint32_t type_id = 500; // Start from 500 to avoid conflicts - - fory.register_struct(type_id++); - fory.register_struct(type_id++); - fory.register_struct(type_id++); - fory.register_struct(type_id++); - fory.register_struct(type_id++); - fory.register_struct(type_id++); - fory.register_struct(type_id++); - fory.register_struct(type_id++); - fory.register_struct(type_id++); - fory.register_struct(type_id++); - fory.register_struct(type_id++); -} - -Fory create_fory(bool track_ref = true) { - return Fory::builder().xlang(true).track_ref(track_ref).build(); -} - -// ============================================================================ -// Primitive Field Tests -// ============================================================================ - -TEST(FieldSerializerTest, PrimitiveFieldsRoundTrip) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldPerson original; - original.name = "Alice"; - original.age = 30; - original.score = 95.5; - original.active = true; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = - fory.deserialize(bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -TEST(FieldSerializerTest, PrimitiveFieldsEdgeCases) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldPerson original; - original.name = ""; - original.age = -1; - original.score = 0.0; - original.active = false; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = - fory.deserialize(bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -// ============================================================================ -// Optional Field Tests -// ============================================================================ - -TEST(FieldSerializerTest, OptionalFieldsAllSet) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldOptionalData original; - original.required_name = "Bob"; - original.optional_age = 25; - original.optional_email = "bob@example.com"; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize(bytes_result->data(), - bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -TEST(FieldSerializerTest, OptionalFieldsAllEmpty) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldOptionalData original; - original.required_name = "Charlie"; - original.optional_age = std::nullopt; - original.optional_email = std::nullopt; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize(bytes_result->data(), - bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -TEST(FieldSerializerTest, OptionalFieldsMixed) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldOptionalData original; - original.required_name = "Diana"; - original.optional_age = 35; - original.optional_email = std::nullopt; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize(bytes_result->data(), - bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -// ============================================================================ -// Shared Pointer Field Tests -// ============================================================================ - -TEST(FieldSerializerTest, SharedPtrFieldsNonNullable) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldSharedPtrHolder original; - original.value = std::make_shared(42); - original.text = std::make_shared("hello"); - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -TEST(FieldSerializerTest, NullableSharedPtrWithValues) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldNullableSharedPtr original; - original.nullable_value = std::make_shared(99); - original.nullable_text = std::make_shared("world"); - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -TEST(FieldSerializerTest, NullableSharedPtrWithNulls) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldNullableSharedPtr original; - original.nullable_value = nullptr; - original.nullable_text = nullptr; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -TEST(FieldSerializerTest, NullableSharedPtrMixed) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldNullableSharedPtr original; - original.nullable_value = std::make_shared(123); - original.nullable_text = nullptr; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -// ============================================================================ -// Unique Pointer Field Tests -// ============================================================================ - -TEST(FieldSerializerTest, UniquePtrFieldWithValue) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldUniquePtrHolder original; - original.value = std::make_unique(2025); - original.nullable_value = std::make_unique(1234); - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - ASSERT_TRUE(deser_result.value().value.value); - EXPECT_EQ(*deser_result.value().value.value, 2025); - ASSERT_TRUE(deser_result.value().nullable_value.value); - EXPECT_EQ(*deser_result.value().nullable_value.value, 1234); -} - -TEST(FieldSerializerTest, UniquePtrNullableFieldNull) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldUniquePtrHolder original; - original.value = std::make_unique(999); - original.nullable_value = nullptr; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - ASSERT_TRUE(deser_result.value().value.value); - EXPECT_EQ(*deser_result.value().value.value, 999); - EXPECT_EQ(deser_result.value().nullable_value.value, nullptr); -} - -// ============================================================================ -// Reference Tracking Tests -// ============================================================================ - -TEST(FieldSerializerTest, RefTrackingSameObject) { - auto fory = create_fory(true); - register_field_test_types(fory); - - auto shared_node = std::make_shared(); - shared_node->id = 42; - shared_node->name = "shared"; - - FieldRefTrackingHolder original; - original.first = shared_node; - original.second = shared_node; // Same object - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - auto &result = deser_result.value(); - ASSERT_TRUE(result.first.value); - ASSERT_TRUE(result.second.value); - EXPECT_EQ(result.first.value->id.value, 42); - EXPECT_EQ(result.first.value->name.value, "shared"); - EXPECT_EQ(result.second.value->id.value, 42); - EXPECT_EQ(result.second.value->name.value, "shared"); - - // Reference tracking should preserve shared_ptr aliasing - EXPECT_EQ(result.first.value, result.second.value) - << "Reference tracking should preserve shared_ptr aliasing"; -} - -TEST(FieldSerializerTest, RefTrackingDifferentObjects) { - auto fory = create_fory(true); - register_field_test_types(fory); - - FieldRefTrackingHolder original; - original.first = std::make_shared(); - original.first.value->id = 1; - original.first.value->name = "first"; - original.second = std::make_shared(); - original.second.value->id = 2; - original.second.value->name = "second"; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - auto &result = deser_result.value(); - ASSERT_TRUE(result.first.value); - ASSERT_TRUE(result.second.value); - EXPECT_EQ(result.first.value->id.value, 1); - EXPECT_EQ(result.first.value->name.value, "first"); - EXPECT_EQ(result.second.value->id.value, 2); - EXPECT_EQ(result.second.value->name.value, "second"); - - // Different objects should not share - EXPECT_NE(result.first.value, result.second.value); -} - -TEST(FieldSerializerTest, NullableRefWithValue) { - auto fory = create_fory(true); - register_field_test_types(fory); - - FieldNullableRefHolder original; - original.node = std::make_shared(); - original.node.value->id = 100; - original.node.value->name = "nullable_ref"; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - auto &result = deser_result.value(); - ASSERT_TRUE(result.node.value); - EXPECT_EQ(result.node.value->id.value, 100); - EXPECT_EQ(result.node.value->name.value, "nullable_ref"); -} - -TEST(FieldSerializerTest, NullableRefWithNull) { - auto fory = create_fory(true); - register_field_test_types(fory); - - FieldNullableRefHolder original; - original.node = nullptr; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(deser_result.value().node.value, nullptr); -} - -TEST(FieldSerializerTest, NotNullRefWithValue) { - auto fory = create_fory(true); - register_field_test_types(fory); - - FieldNotNullRefHolder original; - original.node = std::make_shared(); - original.node.value->id = 200; - original.node.value->name = "not_null_ref"; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - auto &result = deser_result.value(); - ASSERT_TRUE(result.node.value); - EXPECT_EQ(result.node.value->id.value, 200); - EXPECT_EQ(result.node.value->name.value, "not_null_ref"); -} - -// ============================================================================ -// Container Field Tests -// ============================================================================ - -TEST(FieldSerializerTest, VectorOfFieldStructs) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldVectorHolder original; - for (int i = 0; i < 5; ++i) { - FieldNode node; - node.id = i; - node.name = "node_" + std::to_string(i); - original.nodes.value.push_back(node); - } - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize(bytes_result->data(), - bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -TEST(FieldSerializerTest, EmptyVectorField) { - auto fory = create_fory(); - register_field_test_types(fory); - - FieldVectorHolder original; - // Empty vector - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize(bytes_result->data(), - bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -// ============================================================================ -// Mixed Field Tests -// ============================================================================ - -TEST(FieldSerializerTest, MixedFieldStruct) { - auto fory = create_fory(); - register_field_test_types(fory); - - MixedFieldStruct original; - original.field_name = "mixed"; - original.plain_age = 42; - original.field_score = 88.5; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize(bytes_result->data(), - bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -// ============================================================================ -// Field Metadata Compile-time Tests -// ============================================================================ - -TEST(FieldSerializerTest, FieldMetadataCompileTime) { - // Verify compile-time field metadata extraction - using PersonType = FieldPerson; - - // Check that field types are correctly detected - static_assert(is_fory_field_v); - static_assert(is_fory_field_v); - static_assert(is_fory_field_v); - static_assert(is_fory_field_v); - - // Check tag IDs - static_assert(decltype(PersonType::name)::tag_id == 0); - static_assert(decltype(PersonType::age)::tag_id == 1); - static_assert(decltype(PersonType::score)::tag_id == 2); - static_assert(decltype(PersonType::active)::tag_id == 3); - - // Check nullability - static_assert(!decltype(PersonType::name)::is_nullable); - static_assert(!decltype(PersonType::age)::is_nullable); - - // Optional fields are inherently nullable - static_assert(decltype(FieldOptionalData::optional_age)::is_nullable); - static_assert(decltype(FieldOptionalData::optional_email)::is_nullable); - - // Nullable shared_ptr - static_assert(decltype(FieldNullableSharedPtr::nullable_value)::is_nullable); - static_assert(!decltype(FieldSharedPtrHolder::value)::is_nullable); - - // Ref tracking - static_assert(decltype(FieldRefTrackingHolder::first)::track_ref); - static_assert(decltype(FieldSharedPtrHolder::value)::track_ref); - - // not_null doesn't change is_nullable for already non-nullable - static_assert(!decltype(FieldNotNullRefHolder::node)::is_nullable); - static_assert(decltype(FieldNotNullRefHolder::node)::track_ref); -} - -} // namespace test -} // namespace serialization -} // namespace fory - -// ============================================================================ -// FORY_FIELD_TAGS Serialization Tests -// FORY_FIELD_TAGS remains namespace-scope, FORY_STRUCT is declared in-class -// ============================================================================ - -// Simple helper struct for testing FORY_FIELD_TAGS -struct TagsTestData { - std::string content; - int32_t value; - - bool operator==(const TagsTestData &other) const { - return content == other.content && value == other.value; - } - FORY_STRUCT(TagsTestData, content, value); -}; - -FORY_FIELD_TAGS(TagsTestData, (content, 0), (value, 1)); - -// Pure C++ struct with FORY_FIELD_TAGS metadata (non-invasive) -struct TagsTestDocument { - std::string title; - int32_t version; - std::optional description; - std::shared_ptr data; - std::shared_ptr optional_data; - - bool operator==(const TagsTestDocument &other) const { - bool data_eq = static_cast(data) == static_cast(other.data); - if (data_eq && data && other.data) { - data_eq = (*data == *other.data); - } - bool opt_data_eq = static_cast(optional_data) == - static_cast(other.optional_data); - if (opt_data_eq && optional_data && other.optional_data) { - opt_data_eq = (*optional_data == *other.optional_data); - } - return title == other.title && version == other.version && - description == other.description && data_eq && opt_data_eq; - } - FORY_STRUCT(TagsTestDocument, title, version, description, data, - optional_data); -}; - -FORY_FIELD_TAGS(TagsTestDocument, (title, 0), // string: non-nullable - (version, 1), // int: non-nullable - (description, 2), // optional: inherently nullable - (data, 3), // shared_ptr: non-nullable (default) - (optional_data, 4, nullable)); // shared_ptr: nullable - -// Struct for testing FORY_FIELD_TAGS with ref tracking -struct TagsRefNode { - std::string name; - int32_t id; - - bool operator==(const TagsRefNode &other) const { - return name == other.name && id == other.id; - } - FORY_STRUCT(TagsRefNode, name, id); -}; - -FORY_FIELD_TAGS(TagsRefNode, (name, 0), (id, 1)); - -// Struct with ref tracking via FORY_FIELD_TAGS -struct TagsRefHolder { - std::shared_ptr first; - std::shared_ptr second; - FORY_STRUCT(TagsRefHolder, first, second); -}; - -FORY_FIELD_TAGS(TagsRefHolder, (first, 0, ref), (second, 1, ref)); - -// Struct with nullable + ref via FORY_FIELD_TAGS -struct TagsNullableRefHolder { - std::shared_ptr required_node; - std::shared_ptr optional_node; - FORY_STRUCT(TagsNullableRefHolder, required_node, optional_node); -}; - -FORY_FIELD_TAGS(TagsNullableRefHolder, (required_node, 0, ref), - (optional_node, 1, nullable, ref)); - -// Tree-like struct with self-referential nullable ref pointers -struct TagsTreeNode { - std::string value; - std::shared_ptr left; - std::shared_ptr right; - FORY_STRUCT(TagsTreeNode, value, left, right); -}; - -FORY_FIELD_TAGS(TagsTreeNode, (value, 0), (left, 1, nullable, ref), - (right, 2, nullable, ref)); - -namespace fory { -namespace serialization { -namespace test { - -TEST(FieldTagsSerializerTest, BasicTagsDocument) { - auto fory = - Fory::builder().xlang(true).track_ref(false).compatible(false).build(); - fory.register_struct(200); - fory.register_struct(201); - - TagsTestDocument original; - original.title = "My Document"; - original.version = 1; - original.description = "A test document"; - original.data = std::make_shared(); - original.data->content = "data content"; - original.data->value = 42; - original.optional_data = nullptr; // nullable - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize(bytes_result->data(), - bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -TEST(FieldTagsSerializerTest, TagsDocumentWithNullableSet) { - auto fory = - Fory::builder().xlang(true).track_ref(false).compatible(false).build(); - fory.register_struct(200); - fory.register_struct(201); - - TagsTestDocument original; - original.title = "Doc with optional"; - original.version = 2; - original.description = std::nullopt; - original.data = std::make_shared(); - original.data->content = "main data"; - original.data->value = 100; - original.optional_data = std::make_shared(); - original.optional_data->content = "optional data"; - original.optional_data->value = 999; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize(bytes_result->data(), - bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - EXPECT_EQ(original, deser_result.value()); -} - -TEST(FieldTagsSerializerTest, TagsMetadataCompileTime) { - // Verify that FORY_FIELD_TAGS metadata is correctly accessed - using DocHelpers = detail::CompileTimeFieldHelpers; - using DataHelpers = detail::CompileTimeFieldHelpers; - - // Check tag IDs via GetFieldTagEntry for TagsTestData - static_assert(::fory::detail::GetFieldTagEntry::id == 0); - static_assert(::fory::detail::GetFieldTagEntry::id == 1); - - // Check tag IDs via GetFieldTagEntry for TagsTestDocument - static_assert(::fory::detail::GetFieldTagEntry::id == 0); - static_assert(::fory::detail::GetFieldTagEntry::id == 1); - static_assert(::fory::detail::GetFieldTagEntry::id == 2); - static_assert(::fory::detail::GetFieldTagEntry::id == 3); - static_assert(::fory::detail::GetFieldTagEntry::id == 4); - - // Check nullability via GetFieldTagEntry - // title (string): non-nullable - static_assert( - ::fory::detail::GetFieldTagEntry::is_nullable == - false); - // version (int): non-nullable - static_assert( - ::fory::detail::GetFieldTagEntry::is_nullable == - false); - // description (optional): inherently nullable - static_assert( - ::fory::detail::GetFieldTagEntry::is_nullable == - true); - // data (shared_ptr): non-nullable (default) - static_assert( - ::fory::detail::GetFieldTagEntry::is_nullable == - false); - // optional_data (shared_ptr, nullable): nullable - static_assert( - ::fory::detail::GetFieldTagEntry::is_nullable == - true); - - // Verify CompileTimeFieldHelpers uses the tags correctly - static_assert(DocHelpers::template field_nullable<0>() == false); - static_assert(DocHelpers::template field_nullable<1>() == false); - static_assert(DocHelpers::template field_nullable<2>() == true); - static_assert(DocHelpers::template field_nullable<3>() == false); - static_assert(DocHelpers::template field_nullable<4>() == true); - - // Check tag IDs via CompileTimeFieldHelpers - static_assert(DocHelpers::template field_tag_id<0>() == 0); - static_assert(DocHelpers::template field_tag_id<1>() == 1); - static_assert(DocHelpers::template field_tag_id<2>() == 2); - static_assert(DocHelpers::template field_tag_id<3>() == 3); - static_assert(DocHelpers::template field_tag_id<4>() == 4); - - // Verify TagsTestData helpers - static_assert(DataHelpers::template field_nullable<0>() == false); - static_assert(DataHelpers::template field_nullable<1>() == false); - static_assert(DataHelpers::template field_tag_id<0>() == 0); - static_assert(DataHelpers::template field_tag_id<1>() == 1); -} - -// ============================================================================ -// FORY_FIELD_TAGS Reference Tracking Tests -// ============================================================================ - -TEST(FieldTagsSerializerTest, TagsRefTrackingSameObject) { - auto fory = - Fory::builder().xlang(true).track_ref(true).compatible(false).build(); - fory.register_struct(300); - fory.register_struct(301); - - // Create a shared node that will be referenced by both fields - auto shared_node = std::make_shared(); - shared_node->name = "shared"; - shared_node->id = 42; - - TagsRefHolder original; - original.first = shared_node; - original.second = shared_node; // Same object - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize(bytes_result->data(), - bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - auto &result = deser_result.value(); - ASSERT_TRUE(result.first); - ASSERT_TRUE(result.second); - EXPECT_EQ(result.first->name, "shared"); - EXPECT_EQ(result.first->id, 42); - EXPECT_EQ(result.second->name, "shared"); - EXPECT_EQ(result.second->id, 42); - - // Reference tracking should preserve shared_ptr aliasing - EXPECT_EQ(result.first, result.second) - << "FORY_FIELD_TAGS with ref should preserve shared_ptr aliasing"; -} - -TEST(FieldTagsSerializerTest, TagsRefTrackingDifferentObjects) { - auto fory = - Fory::builder().xlang(true).track_ref(true).compatible(false).build(); - fory.register_struct(300); - fory.register_struct(301); - - TagsRefHolder original; - original.first = std::make_shared(); - original.first->name = "first"; - original.first->id = 1; - original.second = std::make_shared(); - original.second->name = "second"; - original.second->id = 2; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize(bytes_result->data(), - bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - auto &result = deser_result.value(); - ASSERT_TRUE(result.first); - ASSERT_TRUE(result.second); - EXPECT_EQ(result.first->name, "first"); - EXPECT_EQ(result.first->id, 1); - EXPECT_EQ(result.second->name, "second"); - EXPECT_EQ(result.second->id, 2); - - // Different objects should not share - EXPECT_NE(result.first, result.second); -} - -TEST(FieldTagsSerializerTest, TagsNullableRefWithValue) { - auto fory = - Fory::builder().xlang(true).track_ref(true).compatible(false).build(); - fory.register_struct(300); - fory.register_struct(302); - - TagsNullableRefHolder original; - original.required_node = std::make_shared(); - original.required_node->name = "required"; - original.required_node->id = 100; - original.optional_node = std::make_shared(); - original.optional_node->name = "optional"; - original.optional_node->id = 200; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - auto &result = deser_result.value(); - ASSERT_TRUE(result.required_node); - ASSERT_TRUE(result.optional_node); - EXPECT_EQ(result.required_node->name, "required"); - EXPECT_EQ(result.required_node->id, 100); - EXPECT_EQ(result.optional_node->name, "optional"); - EXPECT_EQ(result.optional_node->id, 200); -} - -TEST(FieldTagsSerializerTest, TagsNullableRefWithNull) { - auto fory = - Fory::builder().xlang(true).track_ref(true).compatible(false).build(); - fory.register_struct(300); - fory.register_struct(302); - - TagsNullableRefHolder original; - original.required_node = std::make_shared(); - original.required_node->name = "required"; - original.required_node->id = 100; - original.optional_node = nullptr; // nullable field set to null - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - auto &result = deser_result.value(); - ASSERT_TRUE(result.required_node); - EXPECT_EQ(result.required_node->name, "required"); - EXPECT_EQ(result.required_node->id, 100); - EXPECT_EQ(result.optional_node, nullptr); -} - -TEST(FieldTagsSerializerTest, TagsNullableRefSharedObject) { - auto fory = - Fory::builder().xlang(true).track_ref(true).compatible(false).build(); - fory.register_struct(300); - fory.register_struct(302); - - // Both fields point to the same object - auto shared_node = std::make_shared(); - shared_node->name = "shared_nullable"; - shared_node->id = 999; - - TagsNullableRefHolder original; - original.required_node = shared_node; - original.optional_node = shared_node; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize( - bytes_result->data(), bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - auto &result = deser_result.value(); - ASSERT_TRUE(result.required_node); - ASSERT_TRUE(result.optional_node); - EXPECT_EQ(result.required_node->name, "shared_nullable"); - EXPECT_EQ(result.required_node->id, 999); - - // Both should point to the same deserialized object - EXPECT_EQ(result.required_node, result.optional_node) - << "Nullable ref fields should also preserve shared_ptr aliasing"; -} - -TEST(FieldTagsSerializerTest, TagsTreeNodeSerialization) { - auto fory = - Fory::builder().xlang(true).track_ref(true).compatible(false).build(); - fory.register_struct(303); - - // Build a simple tree: - // root - // / \ - // left right - // / \ - // ll lr - TagsTreeNode original; - original.value = "root"; - original.left = std::make_shared(); - original.left->value = "left"; - original.left->left = std::make_shared(); - original.left->left->value = "ll"; - original.left->left->left = nullptr; - original.left->left->right = nullptr; - original.left->right = std::make_shared(); - original.left->right->value = "lr"; - original.left->right->left = nullptr; - original.left->right->right = nullptr; - original.right = std::make_shared(); - original.right->value = "right"; - original.right->left = nullptr; - original.right->right = nullptr; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize(bytes_result->data(), - bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - auto &result = deser_result.value(); - EXPECT_EQ(result.value, "root"); - ASSERT_TRUE(result.left); - EXPECT_EQ(result.left->value, "left"); - ASSERT_TRUE(result.left->left); - EXPECT_EQ(result.left->left->value, "ll"); - EXPECT_EQ(result.left->left->left, nullptr); - EXPECT_EQ(result.left->left->right, nullptr); - ASSERT_TRUE(result.left->right); - EXPECT_EQ(result.left->right->value, "lr"); - EXPECT_EQ(result.left->right->left, nullptr); - EXPECT_EQ(result.left->right->right, nullptr); - ASSERT_TRUE(result.right); - EXPECT_EQ(result.right->value, "right"); - EXPECT_EQ(result.right->left, nullptr); - EXPECT_EQ(result.right->right, nullptr); -} - -TEST(FieldTagsSerializerTest, TagsTreeNodeWithSharedSubtree) { - auto fory = - Fory::builder().xlang(true).track_ref(true).compatible(false).build(); - fory.register_struct(303); - - // Build a DAG (tree with shared subtree): - // root - // / \ - // left right - // \ / - // shared - auto shared = std::make_shared(); - shared->value = "shared_subtree"; - shared->left = nullptr; - shared->right = nullptr; - - TagsTreeNode original; - original.value = "root"; - original.left = std::make_shared(); - original.left->value = "left"; - original.left->left = nullptr; - original.left->right = shared; // left's right points to shared - original.right = std::make_shared(); - original.right->value = "right"; - original.right->left = shared; // right's left points to same shared - original.right->right = nullptr; - - auto bytes_result = fory.serialize(original); - ASSERT_TRUE(bytes_result.ok()) << bytes_result.error().to_string(); - - auto deser_result = fory.deserialize(bytes_result->data(), - bytes_result->size()); - ASSERT_TRUE(deser_result.ok()) << deser_result.error().to_string(); - - auto &result = deser_result.value(); - EXPECT_EQ(result.value, "root"); - ASSERT_TRUE(result.left); - ASSERT_TRUE(result.right); - ASSERT_TRUE(result.left->right); - ASSERT_TRUE(result.right->left); - - // The shared subtree should still be the same object after deserialization - EXPECT_EQ(result.left->right, result.right->left) - << "Tree nodes with shared subtrees should preserve sharing"; - EXPECT_EQ(result.left->right->value, "shared_subtree"); -} - -TEST(FieldTagsSerializerTest, TagsRefMetadataCompileTime) { - // Verify that FORY_FIELD_TAGS with ref option is correctly parsed - using RefHolderHelpers = detail::CompileTimeFieldHelpers; - using NullableRefHelpers = - detail::CompileTimeFieldHelpers; - using TreeHelpers = detail::CompileTimeFieldHelpers; - - // TagsRefHolder: (first, 0, ref), (second, 1, ref) - static_assert(::fory::detail::GetFieldTagEntry::id == 0); - static_assert(::fory::detail::GetFieldTagEntry::id == 1); - static_assert( - ::fory::detail::GetFieldTagEntry::is_nullable == false); - static_assert( - ::fory::detail::GetFieldTagEntry::is_nullable == false); - static_assert(::fory::detail::GetFieldTagEntry::track_ref == - true); - static_assert(::fory::detail::GetFieldTagEntry::track_ref == - true); - - // TagsNullableRefHolder: (required_node, 0, ref), (optional_node, 1, - // nullable, ref) - static_assert( - ::fory::detail::GetFieldTagEntry::id == 0); - static_assert( - ::fory::detail::GetFieldTagEntry::id == 1); - static_assert( - ::fory::detail::GetFieldTagEntry::is_nullable == - false); - static_assert( - ::fory::detail::GetFieldTagEntry::is_nullable == - true); - static_assert( - ::fory::detail::GetFieldTagEntry::track_ref == - true); - static_assert( - ::fory::detail::GetFieldTagEntry::track_ref == - true); - - // TagsTreeNode: (value, 0), (left, 1, nullable, ref), (right, 2, nullable, - // ref) - static_assert(::fory::detail::GetFieldTagEntry::id == 0); - static_assert(::fory::detail::GetFieldTagEntry::id == 1); - static_assert(::fory::detail::GetFieldTagEntry::id == 2); - static_assert( - ::fory::detail::GetFieldTagEntry::is_nullable == false); - static_assert( - ::fory::detail::GetFieldTagEntry::is_nullable == true); - static_assert( - ::fory::detail::GetFieldTagEntry::is_nullable == true); - static_assert(::fory::detail::GetFieldTagEntry::track_ref == - false); - static_assert(::fory::detail::GetFieldTagEntry::track_ref == - true); - static_assert(::fory::detail::GetFieldTagEntry::track_ref == - true); - - // Verify CompileTimeFieldHelpers uses the tags correctly - static_assert(RefHolderHelpers::template field_track_ref<0>() == true); - static_assert(RefHolderHelpers::template field_track_ref<1>() == true); - static_assert(NullableRefHelpers::template field_track_ref<0>() == true); - static_assert(NullableRefHelpers::template field_track_ref<1>() == true); - static_assert(TreeHelpers::template field_track_ref<0>() == false); - static_assert(TreeHelpers::template field_track_ref<1>() == true); - static_assert(TreeHelpers::template field_track_ref<2>() == true); -} - -} // namespace test -} // namespace serialization -} // namespace fory - -int main(int argc, char **argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/cpp/fory/serialization/namespace_macro_test.cc b/cpp/fory/serialization/namespace_macro_test.cc index a508f57c61..155e951a61 100644 --- a/cpp/fory/serialization/namespace_macro_test.cc +++ b/cpp/fory/serialization/namespace_macro_test.cc @@ -25,10 +25,12 @@ #include "gtest/gtest.h" #include +#include #include #include #include #include +#include namespace macro_test { @@ -47,7 +49,7 @@ class Configured final { int32_t id_ = 0; public: - FORY_STRUCT(Configured, id_); + FORY_STRUCT(Configured, (id_, fory::F(1).varint())); }; class OptionalHolder final { @@ -64,7 +66,7 @@ class OptionalHolder final { std::optional name_; public: - FORY_STRUCT(OptionalHolder, name_); + FORY_STRUCT(OptionalHolder, (name_, fory::F(1))); }; class Choice final { @@ -103,6 +105,32 @@ class Choice final { : value_(tag, std::forward(args)...) {} }; +class NestedChoice final { +public: + using Values = std::map>; + + NestedChoice() = default; + + static NestedChoice values(Values value) { + return NestedChoice(std::move(value)); + } + + uint32_t fory_case_id() const noexcept { return 1; } + + template decltype(auto) visit(Visitor &&vis) const { + return std::forward(vis)(values_); + } + + bool operator==(const NestedChoice &other) const { + return values_ == other.values_; + } + +private: + Values values_; + + explicit NestedChoice(Values value) : values_(std::move(value)) {} +}; + class Partial final { public: Partial() = default; @@ -115,7 +143,8 @@ class Partial final { int64_t count_ = 0; public: - FORY_STRUCT(Partial, id_, name_, count_); + FORY_STRUCT(Partial, (id_, fory::F(5)), (name_, fory::F(6)), + (count_, fory::F(7).varint())); }; class EnumContainer final { @@ -125,13 +154,12 @@ class EnumContainer final { FORY_ENUM(EnumContainer::Kind, Alpha, Beta); -FORY_FIELD_CONFIG(Configured, (id_, fory::F().id(1).varint())); -FORY_FIELD_TAGS(OptionalHolder, (name_, 1)); -FORY_FIELD_CONFIG(Partial, (count_, fory::F().id(7).varint())); -FORY_FIELD_TAGS(Partial, (id_, 5)); - -FORY_UNION(Choice, (std::string, text, fory::F(1)), - (int32_t, number, fory::F(2).varint())); +FORY_UNION(Choice, (text, std::string, fory::F(1)), + (number, int32_t, fory::F(2).varint())); +FORY_UNION(NestedChoice, + (values, NestedChoice::Values, + fory::F(1).map(fory::T::uint32().fixed(), + fory::T::list(fory::T::uint64().tagged())))); } // namespace macro_test @@ -139,7 +167,7 @@ namespace fory { namespace serialization { namespace test { -TEST(NamespaceMacros, FieldConfigAndTagsInNamespace) { +TEST(NamespaceMacros, FieldConfigInNamespace) { static_assert(::fory::detail::has_field_config_v); static_assert( ::fory::detail::GetFieldConfigEntry::id == 1); @@ -147,20 +175,20 @@ TEST(NamespaceMacros, FieldConfigAndTagsInNamespace) { 0>::encoding == ::fory::Encoding::Varint); - static_assert(::fory::detail::has_field_tags_v); - static_assert(::fory::detail::GetFieldTagEntry::is_nullable); + static_assert( + ::fory::detail::GetFieldConfigEntry::id == + 1); + static_assert(::fory::serialization::detail::CompileTimeFieldHelpers< + macro_test::OptionalHolder>::field_nullable<0>()); - static_assert(::fory::detail::GetFieldTagEntry::id == - 5); static_assert( - !::fory::detail::GetFieldTagEntry::has_entry); + ::fory::detail::GetFieldConfigEntry::id == 5); + static_assert( + ::fory::detail::GetFieldConfigEntry::id == 6); static_assert(::fory::serialization::detail::CompileTimeFieldHelpers< macro_test::Partial>::field_nullable<1>()); static_assert( ::fory::detail::GetFieldConfigEntry::id == 7); - static_assert( - ::fory::detail::GetFieldConfigEntry::id == -1); } TEST(NamespaceMacros, UnionInNamespace) { @@ -176,6 +204,21 @@ TEST(NamespaceMacros, UnionInNamespace) { EXPECT_EQ(macro_test::Choice::text("hello"), decoded.value()); } +TEST(NamespaceMacros, NestedUnionPayloadSpec) { + auto fory = Fory::builder().xlang(true).track_ref(false).build(); + ASSERT_TRUE(fory.register_union(1002).ok()); + + macro_test::NestedChoice::Values values = {{4000000000u, {7u, 1000000000u}}, + {3u, {42u}}}; + auto bytes = fory.serialize(macro_test::NestedChoice::values(values)); + ASSERT_TRUE(bytes.ok()) << bytes.error().to_string(); + + auto decoded = + fory.deserialize(bytes->data(), bytes->size()); + ASSERT_TRUE(decoded.ok()) << decoded.error().to_string(); + EXPECT_EQ(macro_test::NestedChoice::values(values), decoded.value()); +} + TEST(NamespaceMacros, EnumInAndOutOfClass) { static_assert(::fory::meta::EnumInfo::defined); static_assert(::fory::meta::EnumInfo::size == 2); diff --git a/cpp/fory/serialization/serializer_traits.h b/cpp/fory/serialization/serializer_traits.h index 98c476f7ad..ad07c4aa6d 100644 --- a/cpp/fory/serialization/serializer_traits.h +++ b/cpp/fory/serialization/serializer_traits.h @@ -373,8 +373,19 @@ inline constexpr bool is_shared_ref_v = is_shared_ref::value; // Element Type Extraction // ============================================================================ -/// get element type for containers (reuse meta::GetValueType) -template using element_type_t = typename meta::GetValueType; +/// get element type for containers. +template struct element_type_impl { + using type = typename meta::GetValueType; +}; + +template +struct element_type_impl> { + using type = typename T::value_type; +}; + +template +using element_type_t = typename element_type_impl< + std::remove_cv_t>>::type; /// get key type for map-like containers template struct key_type_impl {}; diff --git a/cpp/fory/serialization/smart_ptr_serializer_test.cc b/cpp/fory/serialization/smart_ptr_serializer_test.cc index 1c8b105f62..971ea2966a 100644 --- a/cpp/fory/serialization/smart_ptr_serializer_test.cc +++ b/cpp/fory/serialization/smart_ptr_serializer_test.cc @@ -437,7 +437,7 @@ TEST(SmartPtrSerializerTest, MaxDynDepthDefault) { } // namespace // ============================================================================ -// Monomorphic field tests (fory::field<> style) +// Monomorphic field tests // ============================================================================ namespace { @@ -450,21 +450,17 @@ struct PolymorphicBaseForMono { FORY_STRUCT(PolymorphicBaseForMono, value, data); }; -// Holder with non-dynamic field using fory::field<> struct NonDynamicFieldHolder { - // Field marked as dynamic - no dynamic type dispatch, always - // PolymorphicBaseForMono - fory::field, 0, fory::nullable, - fory::dynamic> - ptr; - FORY_STRUCT(NonDynamicFieldHolder, ptr); + std::shared_ptr ptr; + FORY_STRUCT(NonDynamicFieldHolder, + (ptr, fory::F().nullable().dynamic(false))); }; -TEST(SmartPtrSerializerTest, NonDynamicFieldWithForyField) { +TEST(SmartPtrSerializerTest, NonDynamicFieldConfig) { NonDynamicFieldHolder original; - original.ptr.value = std::make_shared(); - original.ptr.value->value = 42; - original.ptr.value->data = "test data"; + original.ptr = std::make_shared(); + original.ptr->value = 42; + original.ptr->data = "test data"; auto fory = Fory::builder().track_ref(false).build(); fory.register_struct(400); @@ -479,15 +475,15 @@ TEST(SmartPtrSerializerTest, NonDynamicFieldWithForyField) { << deserialize_result.error().to_string(); auto deserialized = std::move(deserialize_result).value(); - ASSERT_TRUE(deserialized.ptr.value); - EXPECT_EQ(deserialized.ptr.value->value, 42); - EXPECT_EQ(deserialized.ptr.value->data, "test data"); - EXPECT_EQ(deserialized.ptr.value->name(), "PolymorphicBaseForMono"); + ASSERT_TRUE(deserialized.ptr); + EXPECT_EQ(deserialized.ptr->value, 42); + EXPECT_EQ(deserialized.ptr->data, "test data"); + EXPECT_EQ(deserialized.ptr->name(), "PolymorphicBaseForMono"); } TEST(SmartPtrSerializerTest, NonDynamicFieldNullValue) { NonDynamicFieldHolder original; - original.ptr.value = nullptr; + original.ptr = nullptr; auto fory = Fory::builder().track_ref(false).build(); fory.register_struct(404); @@ -502,7 +498,7 @@ TEST(SmartPtrSerializerTest, NonDynamicFieldNullValue) { << deserialize_result.error().to_string(); auto deserialized = std::move(deserialize_result).value(); - EXPECT_FALSE(deserialized.ptr.value); + EXPECT_FALSE(deserialized.ptr); } } // namespace diff --git a/cpp/fory/serialization/struct_serializer.h b/cpp/fory/serialization/struct_serializer.h index cdd4a5f40d..6349ce116d 100644 --- a/cpp/fory/serialization/struct_serializer.h +++ b/cpp/fory/serialization/struct_serializer.h @@ -24,6 +24,8 @@ #include "fory/meta/field_info.h" #include "fory/meta/preprocessor.h" #include "fory/meta/type_traits.h" +#include "fory/serialization/collection_serializer.h" +#include "fory/serialization/map_serializer.h" #include "fory/serialization/serializer.h" #include "fory/serialization/serializer_traits.h" #include "fory/serialization/skip.h" @@ -34,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -476,6 +479,440 @@ void for_each_index(std::index_sequence, Func &&func) { (func(std::integral_constant{}), ...); } +template +constexpr FieldNodeKind configured_node_kind() { + constexpr auto spec = + ::fory::detail::GetFieldConfigEntry::spec; + return NodeIndex >= 0 ? spec.kind_[NodeIndex] : FieldNodeKind::Default; +} + +template +constexpr Encoding configured_node_encoding() { + constexpr auto spec = + ::fory::detail::GetFieldConfigEntry::spec; + return NodeIndex >= 0 ? spec.encoding_[NodeIndex] : Encoding::Default; +} + +template +constexpr bool configured_node_has_override() { + constexpr auto spec = + ::fory::detail::GetFieldConfigEntry::spec; + return NodeIndex >= 0 && + (spec.kind_[NodeIndex] != FieldNodeKind::Default || + spec.encoding_[NodeIndex] != Encoding::Default || + spec.scalar_[NodeIndex] != FieldScalarKind::Inferred); +} + +template +constexpr FieldScalarKind configured_node_scalar() { + constexpr auto spec = + ::fory::detail::GetFieldConfigEntry::spec; + return NodeIndex >= 0 ? spec.scalar_[NodeIndex] : FieldScalarKind::Inferred; +} + +template +constexpr bool configured_scalar_kind_matches() { + using Decayed = decay_t; + if constexpr (ScalarKind == FieldScalarKind::Inferred) { + return true; + } else if constexpr (ScalarKind == FieldScalarKind::Bool) { + return std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::Int8) { + return std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::Int16) { + return std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::Int32) { + return std::is_same_v || std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::Int64) { + return std::is_same_v || + std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::UInt8) { + return std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::UInt16) { + return std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::UInt32) { + return std::is_same_v || + std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::UInt64) { + return std::is_same_v || + std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::Float16) { + return std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::BFloat16) { + return std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::Float32) { + return std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::Float64) { + return std::is_same_v; + } else if constexpr (ScalarKind == FieldScalarKind::String) { + return std::is_same_v; + } else { + return false; + } +} + +template +constexpr int8_t configured_node_child() { + constexpr auto spec = + ::fory::detail::GetFieldConfigEntry::spec; + if constexpr (ChildSlot == 0) { + return NodeIndex >= 0 ? spec.child0_[NodeIndex] : -1; + } else { + return NodeIndex >= 0 ? spec.child1_[NodeIndex] : -1; + } +} + +template +FORY_ALWAYS_INLINE void write_configured_scalar(const FieldType &value, + WriteContext &ctx) { + constexpr Encoding enc = + configured_node_encoding(); + if constexpr (is_configurable_int_v) { + if constexpr (std::is_same_v) { + if constexpr (enc == Encoding::Varint) { + ctx.write_var_uint32(value); + } else { + ctx.buffer().write_int32(static_cast(value)); + } + } else if constexpr (std::is_same_v) { + if constexpr (enc == Encoding::Varint) { + ctx.write_var_uint64(value); + } else if constexpr (enc == Encoding::Tagged) { + ctx.write_tagged_uint64(value); + } else { + ctx.buffer().write_int64(static_cast(value)); + } + } else if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (enc == Encoding::Fixed) { + ctx.buffer().write_int32(static_cast(value)); + } else { + ctx.write_var_int32(static_cast(value)); + } + } else if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (enc == Encoding::Fixed) { + ctx.buffer().write_int64(static_cast(value)); + } else if constexpr (enc == Encoding::Tagged) { + ctx.write_tagged_int64(static_cast(value)); + } else { + ctx.write_var_int64(static_cast(value)); + } + } else { + Serializer::write_data(value, ctx); + } + } else { + Serializer::write_data(value, ctx); + } +} + +template +FORY_ALWAYS_INLINE FieldType read_configured_scalar(ReadContext &ctx) { + if constexpr (is_configurable_int_v) { + constexpr Encoding enc = + configured_node_encoding(); + if constexpr (std::is_same_v) { + if constexpr (enc == Encoding::Varint) { + return static_cast(ctx.read_var_uint32(ctx.error())); + } + return static_cast(ctx.read_int32(ctx.error())); + } else if constexpr (std::is_same_v) { + if constexpr (enc == Encoding::Varint) { + return static_cast(ctx.read_var_uint64(ctx.error())); + } else if constexpr (enc == Encoding::Tagged) { + return static_cast(ctx.read_tagged_uint64(ctx.error())); + } + return static_cast(ctx.read_uint64(ctx.error())); + } else if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (enc == Encoding::Fixed) { + return static_cast(ctx.read_int32(ctx.error())); + } + return static_cast(ctx.read_var_int32(ctx.error())); + } else if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (enc == Encoding::Fixed) { + return static_cast(ctx.read_int64(ctx.error())); + } else if constexpr (enc == Encoding::Tagged) { + return static_cast(ctx.read_tagged_int64(ctx.error())); + } + return static_cast(ctx.read_var_int64(ctx.error())); + } else { + return Serializer::read_data(ctx); + } + } else { + return Serializer::read_data(ctx); + } +} + +template +void write_configured_value(const ValueType &value, WriteContext &ctx, + RefMode ref_mode, bool write_type, + bool has_generics); + +template +ValueType read_configured_value(ReadContext &ctx, RefMode ref_mode, + bool read_type); + +template +void write_configured_list_data(const Container &coll, WriteContext &ctx) { + using Elem = element_type_t; + ctx.write_var_uint32(static_cast(coll.size())); + if (coll.empty()) { + return; + } + ctx.write_uint8(COLL_DECL_ELEMENT_TYPE | COLL_IS_SAME_TYPE); + for (const auto &elem : coll) { + if constexpr (ElemNode >= 0) { + write_configured_value( + elem, ctx, RefMode::None, false, true); + } else { + Serializer::write_data(elem, ctx); + } + } +} + +template +Container read_configured_list_data(ReadContext &ctx) { + using Elem = element_type_t; + uint32_t length = ctx.read_var_uint32(ctx.error()); + Container result; + if constexpr (has_reserve_v) { + result.reserve(length); + } + if (FORY_PREDICT_FALSE(ctx.has_error()) || length == 0) { + return result; + } + uint8_t bitmap = ctx.read_uint8(ctx.error()); + if (FORY_PREDICT_FALSE(ctx.has_error())) { + return result; + } + const bool is_decl_type = (bitmap & COLL_DECL_ELEMENT_TYPE) != 0; + const bool is_same_type = (bitmap & COLL_IS_SAME_TYPE) != 0; + if (is_same_type && !is_decl_type) { + (void)ctx.read_any_type_info(ctx.error()); + if (FORY_PREDICT_FALSE(ctx.has_error())) { + return result; + } + } + for (uint32_t i = 0; i < length; ++i) { + if constexpr (ElemNode >= 0) { + auto elem = read_configured_value( + ctx, RefMode::None, false); + collection_insert(result, std::move(elem)); + } else { + auto elem = Serializer::read_data(ctx); + collection_insert(result, std::move(elem)); + } + } + return result; +} + +template +void write_configured_map_data(const MapType &map, WriteContext &ctx) { + using Key = key_type_t; + using Value = mapped_type_t; + ctx.write_var_uint32(static_cast(map.size())); + if (map.empty()) { + return; + } + size_t header_offset = 0; + uint8_t pair_counter = 0; + bool need_write_header = true; + for (const auto &[key, value] : map) { + if (need_write_header) { + ctx.enter_flush_barrier(); + header_offset = ctx.buffer().writer_index(); + ctx.write_uint16(0); + ctx.buffer().unsafe_put_byte( + header_offset, static_cast(DECL_KEY_TYPE | DECL_VALUE_TYPE)); + need_write_header = false; + } + if constexpr (KeyNode >= 0) { + write_configured_value( + key, ctx, RefMode::None, false, true); + } else { + Serializer::write_data(key, ctx); + } + if constexpr (ValueNode >= 0) { + write_configured_value( + value, ctx, RefMode::None, false, true); + } else { + Serializer::write_data(value, ctx); + } + ++pair_counter; + if (pair_counter == MAX_CHUNK_SIZE) { + write_chunk_size(ctx, header_offset, pair_counter); + ctx.exit_flush_barrier(); + ctx.try_flush(); + pair_counter = 0; + need_write_header = true; + } + } + if (pair_counter > 0) { + write_chunk_size(ctx, header_offset, pair_counter); + ctx.exit_flush_barrier(); + ctx.try_flush(); + } +} + +template +MapType read_configured_map_data(ReadContext &ctx) { + using Key = key_type_t; + using Value = mapped_type_t; + uint32_t length = ctx.read_var_uint32(ctx.error()); + MapType result; + MapReserver::reserve(result, length); + uint32_t read_count = 0; + while (read_count < length && !ctx.has_error()) { + uint8_t header = ctx.read_uint8(ctx.error()); + uint8_t chunk_size = ctx.read_uint8(ctx.error()); + if (FORY_PREDICT_FALSE(ctx.has_error())) { + return result; + } + const bool key_decl = (header & DECL_KEY_TYPE) != 0; + const bool value_decl = (header & DECL_VALUE_TYPE) != 0; + if (!key_decl) { + (void)ctx.read_any_type_info(ctx.error()); + } + if (!value_decl) { + (void)ctx.read_any_type_info(ctx.error()); + } + for (uint8_t i = 0; i < chunk_size && read_count < length; ++i) { + Key key = [&]() { + if constexpr (KeyNode >= 0) { + return read_configured_value( + ctx, RefMode::None, false); + } else { + return Serializer::read_data(ctx); + } + }(); + Value value = [&]() { + if constexpr (ValueNode >= 0) { + return read_configured_value( + ctx, RefMode::None, false); + } else { + return Serializer::read_data(ctx); + } + }(); + result.emplace(std::move(key), std::move(value)); + ++read_count; + } + } + return result; +} + +template +void write_configured_value(const ValueType &value, WriteContext &ctx, + RefMode ref_mode, bool write_type, + bool has_generics) { + constexpr FieldNodeKind kind = + configured_node_kind(); + constexpr FieldScalarKind scalar_kind = + configured_node_scalar(); + static_assert(configured_scalar_kind_matches(), + "fory::T typed scalar spec does not match the C++ field type"); + if constexpr (is_optional_v) { + using Inner = typename ValueType::value_type; + if (!value.has_value()) { + if (ref_mode != RefMode::None) { + ctx.write_int8(NULL_FLAG); + } + return; + } + write_not_null_ref_flag(ctx, ref_mode); + constexpr int8_t child = + kind == FieldNodeKind::Inner + ? configured_node_child() + : NodeIndex; + write_configured_value( + *value, ctx, RefMode::None, false, has_generics); + } else if constexpr ((is_vector_v || is_list_v || + is_deque_v || is_set_like_v) && + (kind == FieldNodeKind::List || + kind == FieldNodeKind::Set)) { + write_not_null_ref_flag(ctx, ref_mode); + constexpr int8_t child = + configured_node_child(); + write_configured_list_data( + value, ctx); + } else if constexpr (is_map_like_v && kind == FieldNodeKind::Map) { + write_not_null_ref_flag(ctx, ref_mode); + constexpr int8_t key_child = + configured_node_child(); + constexpr int8_t value_child = + configured_node_child(); + write_configured_map_data(value, ctx); + } else if constexpr (kind == FieldNodeKind::Scalar || + configured_node_encoding() != + Encoding::Default) { + write_not_null_ref_flag(ctx, ref_mode); + write_configured_scalar(value, ctx); + } else { + Serializer::write(value, ctx, ref_mode, write_type, + has_generics); + } +} + +template +ValueType read_configured_value(ReadContext &ctx, RefMode ref_mode, + bool read_type) { + constexpr FieldNodeKind kind = + configured_node_kind(); + constexpr FieldScalarKind scalar_kind = + configured_node_scalar(); + static_assert(configured_scalar_kind_matches(), + "fory::T typed scalar spec does not match the C++ field type"); + if constexpr (is_optional_v) { + using Inner = typename ValueType::value_type; + if (!read_null_only_flag(ctx, ref_mode)) { + return std::nullopt; + } + constexpr int8_t child = + kind == FieldNodeKind::Inner + ? configured_node_child() + : NodeIndex; + Inner inner = read_configured_value( + ctx, RefMode::None, false); + return ValueType{std::move(inner)}; + } else if constexpr ((is_vector_v || is_list_v || + is_deque_v || is_set_like_v) && + (kind == FieldNodeKind::List || + kind == FieldNodeKind::Set)) { + if (!read_null_only_flag(ctx, ref_mode)) { + return ValueType{}; + } + constexpr int8_t child = + configured_node_child(); + return read_configured_list_data(ctx); + } else if constexpr (is_map_like_v && kind == FieldNodeKind::Map) { + if (!read_null_only_flag(ctx, ref_mode)) { + return ValueType{}; + } + constexpr int8_t key_child = + configured_node_child(); + constexpr int8_t value_child = + configured_node_child(); + return read_configured_map_data(ctx); + } else if constexpr (kind == FieldNodeKind::Scalar || + configured_node_encoding() != + Encoding::Default) { + if (!read_null_only_flag(ctx, ref_mode)) { + return ValueType{}; + } + return read_configured_scalar(ctx); + } else { + return Serializer::read(ctx, ref_mode, read_type); + } +} + template void dispatch_field_index_impl(size_t target_index, Func &&func, std::index_sequence, bool &handled) { @@ -509,16 +946,41 @@ template struct CompileTimeFieldHelpers { static inline constexpr auto ptrs = FieldDescriptor::ptrs(); using FieldPtrs = decltype(ptrs); + template + static constexpr bool any_field_has_id(std::index_sequence) { + if constexpr (sizeof...(Indices) == 0) { + return false; + } else { + return ((::fory::detail::GetFieldConfigEntry::has_id) || ...); + } + } + + template + static constexpr bool all_fields_have_id(std::index_sequence) { + if constexpr (sizeof...(Indices) == 0) { + return true; + } else { + return ((::fory::detail::GetFieldConfigEntry::has_id) && ...); + } + } + + static constexpr bool any_id_mode_field = + any_field_has_id(std::make_index_sequence{}); + static constexpr bool all_id_mode_fields = + all_fields_have_id(std::make_index_sequence{}); + + static_assert(!any_id_mode_field || all_id_mode_fields, + "FORY_STRUCT must use exactly one identity mode: either all " + "fields use fory::F(id), or no fields use ids."); + template static constexpr uint32_t field_type_id() { if constexpr (FieldCount == 0) { return 0; } else { using PtrT = std::tuple_element_t; using RawFieldType = meta::RemoveMemberPointerCVRefT; - // unwrap fory::field<> to get the actual type for serialization using FieldType = unwrap_field_t; - // Check for encoding override from FORY_FIELD_CONFIG if constexpr (::fory::detail::has_field_config_v) { constexpr uint32_t unsigned_tid = compute_unsigned_type_id(); @@ -541,11 +1003,8 @@ template struct CompileTimeFieldHelpers { } /// Returns true if the field at Index is nullable for fingerprint - /// computation. This checks: - /// 1. If the field is a fory::field<>, use its is_nullable metadata - /// 2. Else if FORY_FIELD_TAGS is defined, use that metadata - /// 3. Otherwise, use xlang defaults: only std::optional is nullable - /// (For xlang: nullable=false by default, except for Optional types) + /// computation. Configured fields may opt in to nullable behavior; otherwise + /// xlang defaults make only std::optional nullable. template static constexpr bool field_nullable() { if constexpr (FieldCount == 0) { return false; @@ -553,19 +1012,9 @@ template struct CompileTimeFieldHelpers { using PtrT = std::tuple_element_t; using RawFieldType = meta::RemoveMemberPointerCVRefT; - // If it's a fory::field<> wrapper, use its metadata if constexpr (is_fory_field_v) { return RawFieldType::is_nullable; - } - // Else if FORY_FIELD_TAGS is defined, use that metadata - else if constexpr (::fory::detail::has_field_tags_v) { - if constexpr (::fory::detail::GetFieldTagEntry::has_entry) { - return ::fory::detail::GetFieldTagEntry::is_nullable; - } - return field_is_nullable_v; - } - // Else if FORY_FIELD_CONFIG is defined, use nullable from config - else if constexpr (::fory::detail::has_field_config_v) { + } else if constexpr (::fory::detail::has_field_config_v) { if constexpr (::fory::detail::GetFieldConfigEntry::has_entry && ::fory::detail::GetFieldConfigEntry::nullable) { @@ -599,14 +1048,9 @@ template struct CompileTimeFieldHelpers { return config_id; } } - // If it's a fory::field<> wrapper, use its tag_id if constexpr (is_fory_field_v) { return RawFieldType::tag_id; } - // Else if FORY_FIELD_TAGS is defined, use that metadata - else if constexpr (::fory::detail::has_field_tags_v) { - return ::fory::detail::GetFieldTagEntry::id; - } // No tag ID defined else { return -1; @@ -633,16 +1077,9 @@ template struct CompileTimeFieldHelpers { using PtrT = std::tuple_element_t; using RawFieldType = meta::RemoveMemberPointerCVRefT; - // If it's a fory::field<> wrapper, use its track_ref metadata if constexpr (is_fory_field_v) { return RawFieldType::track_ref; - } - // Else if FORY_FIELD_TAGS is defined, use that metadata - else if constexpr (::fory::detail::has_field_tags_v) { - return ::fory::detail::GetFieldTagEntry::track_ref; - } - // Else if FORY_FIELD_CONFIG is defined, use ref from config - else if constexpr (::fory::detail::has_field_config_v) { + } else if constexpr (::fory::detail::has_field_config_v) { if constexpr (::fory::detail::GetFieldConfigEntry::has_entry && ::fory::detail::GetFieldConfigEntry::ref) { @@ -668,16 +1105,9 @@ template struct CompileTimeFieldHelpers { using PtrT = std::tuple_element_t; using RawFieldType = meta::RemoveMemberPointerCVRefT; - // If it's a fory::field<> wrapper, use its dynamic_value metadata if constexpr (is_fory_field_v) { return RawFieldType::dynamic_value; - } - // Else if FORY_FIELD_TAGS is defined, use that metadata - else if constexpr (::fory::detail::has_field_tags_v) { - return ::fory::detail::GetFieldTagEntry::dynamic_value; - } - // Else if FORY_FIELD_CONFIG is defined, use dynamic_value from config - else if constexpr (::fory::detail::has_field_config_v) { + } else if constexpr (::fory::detail::has_field_config_v) { constexpr int dynamic_value = ::fory::detail::GetFieldConfigEntry::dynamic_value; if constexpr (dynamic_value != -1) { @@ -733,7 +1163,7 @@ template struct CompileTimeFieldHelpers { !any_field_needs_type_info_in_compatible( std::make_index_sequence{}); - /// get the underlying field type (unwraps fory::field<> if present) + /// get the underlying field type. template struct UnwrappedFieldTypeHelper { using PtrT = std::tuple_element_t; using RawFieldType = meta::RemoveMemberPointerCVRefT; @@ -1635,7 +2065,7 @@ FORY_ALWAYS_INLINE void write_single_fixed_field(const T &obj, Buffer &buffer, using RawFieldType = typename meta::RemoveMemberPointerCVRefT; using FieldType = unwrap_field_t; - // get the actual value (unwrap fory::field<> if needed) + // get the actual field value. const FieldType &field_value = [&]() -> const FieldType & { if constexpr (is_fory_field_v) { return (obj.*field_ptr).value; @@ -1677,7 +2107,7 @@ FORY_ALWAYS_INLINE void write_single_varint_field(const T &obj, Buffer &buffer, using RawFieldType = typename meta::RemoveMemberPointerCVRefT; using FieldType = unwrap_field_t; - // get the actual value (unwrap fory::field<> if needed) + // get the actual field value. const FieldType &field_value = [&]() -> const FieldType & { if constexpr (is_fory_field_v) { return (obj.*field_ptr).value; @@ -1720,7 +2150,7 @@ write_single_remaining_field(const T &obj, Buffer &buffer, uint32_t &offset) { using RawFieldType = typename meta::RemoveMemberPointerCVRefT; using FieldType = unwrap_field_t; - // get the actual value (unwrap fory::field<> if needed) + // get the actual field value. const FieldType &field_value = [&]() -> const FieldType & { if constexpr (is_fory_field_v) { return (obj.*field_ptr).value; @@ -1803,10 +2233,9 @@ void write_single_field(const T &obj, WriteContext &ctx, const auto field_ptr = std::get(field_ptrs); using RawFieldType = typename meta::RemoveMemberPointerCVRefT; - // unwrap fory::field<> to get the actual type for serialization using FieldType = unwrap_field_t; - // get the actual value (unwrap fory::field<> if needed) + // get the actual field value. const auto &raw_field_ref = obj.*field_ptr; const FieldType &field_value = [&]() -> const FieldType & { if constexpr (is_fory_field_v) { @@ -1819,12 +2248,28 @@ void write_single_field(const T &obj, WriteContext &ctx, constexpr TypeId field_type_id = Serializer::type_id; constexpr bool is_primitive_field = is_primitive_type_id(field_type_id); - // get field metadata from fory::field<> or FORY_FIELD_TAGS or defaults + // get field metadata from the effective field spec or defaults. constexpr bool is_nullable = Helpers::template field_nullable(); constexpr bool track_ref = Helpers::template field_track_ref(); // Some wrapper types always require ref/null flags in the wire format. constexpr bool field_type_is_nullable = is_nullable_v; + if constexpr (configured_node_has_override()) { + constexpr RefMode field_ref_mode = + make_ref_mode(is_nullable || field_type_is_nullable, track_ref); + constexpr bool is_struct = is_struct_type(field_type_id); + constexpr bool is_ext = is_ext_type(field_type_id); + constexpr bool is_polymorphic = field_type_id == TypeId::UNKNOWN; + constexpr int dynamic_val = Helpers::template field_dynamic_value(); + constexpr bool polymorphic_write_type = + (dynamic_val == 1) || (dynamic_val == -1 && is_polymorphic); + bool write_type = polymorphic_write_type || + ((is_struct || is_ext) && ctx.is_compatible()); + write_configured_value( + field_value, ctx, field_ref_mode, write_type, has_generics); + return; + } + // Special handling for std::optional with encoding config // This must come BEFORE the general primitive check because optional requires // ref metadata but we want to use encoding-specific serialization. @@ -2229,7 +2674,6 @@ void read_single_field_by_index(T &obj, ReadContext &ctx) { const auto field_ptr = std::get(field_ptrs); using RawFieldType = typename meta::RemoveMemberPointerCVRefT; - // unwrap fory::field<> to get the actual type for deserialization using FieldType = unwrap_field_t; // In non-compatible mode, no type info for fields except for polymorphic @@ -2257,7 +2701,7 @@ void read_single_field_by_index(T &obj, ReadContext &ctx) { (dynamic_val == -1 && is_polymorphic_field) || ((is_struct_field || is_ext_field) && ctx.is_compatible()); - // get field metadata from fory::field<> or FORY_FIELD_TAGS or defaults + // get field metadata from the effective field spec or defaults. constexpr bool is_nullable = Helpers::template field_nullable(); constexpr bool track_ref = Helpers::template field_track_ref(); @@ -2271,6 +2715,18 @@ void read_single_field_by_index(T &obj, ReadContext &ctx) { // Per xlang protocol: non-nullable fields skip ref flag entirely constexpr RefMode field_ref_mode = make_ref_mode(is_nullable || field_type_is_nullable, track_ref); + + if constexpr (configured_node_has_override()) { + FieldType result = read_configured_value( + ctx, field_ref_mode, read_type); + if constexpr (is_fory_field_v) { + (obj.*field_ptr).value = std::move(result); + } else { + obj.*field_ptr = std::move(result); + } + return; + } + // OPTIMIZATION: For raw primitive fields (not wrappers like optional, // shared_ptr) that don't need ref metadata, bypass Serializer::read // and use direct buffer reads with Error&. @@ -2283,7 +2739,7 @@ void read_single_field_by_index(T &obj, ReadContext &ctx) { } return read_primitive_field_direct(ctx, ctx.error()); }; - // Assign to field (handle fory::field<> wrapper if needed) + // Assign to field. if constexpr (is_fory_field_v) { (obj.*field_ptr).value = read_value(); } else { @@ -2382,7 +2838,7 @@ void read_single_field_by_index(T &obj, ReadContext &ctx) { obj.*field_ptr = std::optional(value); } } else { - // Assign to field (handle fory::field<> wrapper if needed) + // Assign to field. FieldType result = Serializer::read(ctx, field_ref_mode, read_type); if constexpr (is_fory_field_v) { @@ -2407,7 +2863,6 @@ void read_single_field_by_index_compatible(T &obj, ReadContext &ctx, const auto field_ptr = std::get(field_ptrs); using RawFieldType = typename meta::RemoveMemberPointerCVRefT; - // unwrap fory::field<> to get the actual type for deserialization using FieldType = unwrap_field_t; constexpr TypeId field_type_id = Serializer::type_id; @@ -2527,6 +2982,17 @@ void read_single_field_by_index_compatible(T &obj, ReadContext &ctx, } } + if constexpr (configured_node_has_override()) { + FieldType result = read_configured_value( + ctx, remote_ref_mode, read_type); + if constexpr (is_fory_field_v) { + (obj.*field_ptr).value = std::move(result); + } else { + obj.*field_ptr = std::move(result); + } + return; + } + // For non-primitive types, use the standard serializer path FieldType result = Serializer::read(ctx, remote_ref_mode, read_type); @@ -2667,7 +3133,7 @@ FORY_ALWAYS_INLINE void read_single_fixed_field(T &obj, Buffer &buffer, using FieldType = unwrap_field_t; FieldType result = read_fixed_primitive_at(buffer, base_offset + field_offset); - // Assign to field (handle fory::field<> wrapper if needed) + // Assign to field. if constexpr (is_fory_field_v) { (obj.*field_ptr).value = result; } else { @@ -2753,7 +3219,7 @@ FORY_ALWAYS_INLINE void read_single_varint_field(T &obj, Buffer &buffer, result = read_varint_at(buffer, offset); } - // Assign to field (handle fory::field<> wrapper if needed) + // Assign to field. if constexpr (is_fory_field_v) { (obj.*field_ptr).value = result; } else { diff --git a/cpp/fory/serialization/struct_test.cc b/cpp/fory/serialization/struct_test.cc index 7330ee6bc2..cbe4d74470 100644 --- a/cpp/fory/serialization/struct_test.cc +++ b/cpp/fory/serialization/struct_test.cc @@ -88,24 +88,10 @@ struct FieldConfigTaggedStruct { bool operator==(const FieldConfigTaggedStruct &other) const { return a == other.a && b == other.b && c == other.c; } - FORY_STRUCT(FieldConfigTaggedStruct, a, b, c); + FORY_STRUCT(FieldConfigTaggedStruct, (a, fory::F(1)), (b, fory::F(2)), + (c, fory::F(3))); }; -struct FieldTagsTaggedStruct { - int32_t a; - int64_t b; - std::string c; - - bool operator==(const FieldTagsTaggedStruct &other) const { - return a == other.a && b == other.b && c == other.c; - } - FORY_STRUCT(FieldTagsTaggedStruct, a, b, c); -}; - -FORY_FIELD_CONFIG(FieldConfigTaggedStruct, (a, fory::F().id(1)), - (b, fory::F().id(2)), (c, fory::F().id(3))); -FORY_FIELD_TAGS(FieldTagsTaggedStruct, (a, 1), (b, 2), (c, 3)); - class PrivateFieldsStruct { public: PrivateFieldsStruct() = default; @@ -242,6 +228,15 @@ struct VectorStruct { FORY_STRUCT(VectorStruct, numbers, strings, points); }; +struct VectorBoolStruct { + std::vector flags; + + bool operator==(const VectorBoolStruct &other) const { + return flags == other.flags; + } + FORY_STRUCT(VectorBoolStruct, flags); +}; + struct NamedItem { int32_t id; std::string name; @@ -274,6 +269,41 @@ struct NestedContainerStruct { FORY_STRUCT(NestedContainerStruct, matrix, grouped_numbers); }; +namespace T = fory::T; + +struct NestedAnnotatedStruct { + std::map> map; + + bool operator==(const NestedAnnotatedStruct &other) const { + return map == other.map; + } + FORY_STRUCT(NestedAnnotatedStruct, + (map, + fory::F().map().key(T::varint()).value(T::list(T::tagged())))); +}; + +struct PartialMapAnnotatedStruct { + std::map> key_only; + std::map> value_only; + + bool operator==(const PartialMapAnnotatedStruct &other) const { + return key_only == other.key_only && value_only == other.value_only; + } + FORY_STRUCT(PartialMapAnnotatedStruct, + (key_only, fory::F().map().key(T::varint())), + (value_only, fory::F().map().value(T::list(T::tagged())))); +}; + +struct OptionalNestedAnnotatedStruct { + std::optional> values; + + bool operator==(const OptionalNestedAnnotatedStruct &other) const { + return values == other.values; + } + FORY_STRUCT(OptionalNestedAnnotatedStruct, + (values, fory::F().inner(T::list(T::varint())))); +}; + // Optional fields struct OptionalFieldsStruct { std::string name; @@ -439,8 +469,12 @@ inline void register_all_test_types(Fory &fory) { fory.register_struct(type_id++); fory.register_struct(type_id++); fory.register_struct(type_id++); + fory.register_struct(type_id++); fory.register_struct(type_id++); fory.register_struct(type_id++); + fory.register_struct(type_id++); + fory.register_struct(type_id++); + fory.register_struct(type_id++); fory.register_struct(type_id++); fory.register_struct(type_id++); fory.register_struct(type_id++); @@ -500,28 +534,6 @@ TEST(StructComprehensiveTest, ManyFieldsStruct) { -9223372036854775807LL - 1, -1.0f, -1.0, ""}); } -TEST(StructComprehensiveTest, FieldTagsMatchFieldConfigSize) { - FieldConfigTaggedStruct config_obj{1, 2, "config"}; - FieldTagsTaggedStruct tags_obj{1, 2, "config"}; - - auto fory_config = - Fory::builder().xlang(true).compatible(true).track_ref(false).build(); - auto fory_tags = - Fory::builder().xlang(true).compatible(true).track_ref(false).build(); - - ASSERT_TRUE(fory_config.register_struct(101).ok()); - ASSERT_TRUE(fory_tags.register_struct(101).ok()); - - auto config_bytes = fory_config.serialize(config_obj); - ASSERT_TRUE(config_bytes.ok()) - << "Serialization failed: " << config_bytes.error().to_string(); - auto tags_bytes = fory_tags.serialize(tags_obj); - ASSERT_TRUE(tags_bytes.ok()) - << "Serialization failed: " << tags_bytes.error().to_string(); - - EXPECT_EQ(config_bytes->size(), tags_bytes->size()); -} - TEST(StructComprehensiveTest, PrivateFieldsStruct) { test_roundtrip(PrivateFieldsStruct{42, "secret", {1, 2, 3}}); } @@ -582,6 +594,10 @@ TEST(StructComprehensiveTest, VectorStructMultiple) { test_roundtrip(VectorStruct{{1, 2, 3}, {"foo", "bar"}, {{0, 0}, {10, 10}}}); } +TEST(StructComprehensiveTest, VectorBoolStruct) { + test_roundtrip(VectorBoolStruct{{true, false, false, true}}); +} + TEST(StructComprehensiveTest, NamedStructElementTypeInfo) { std::vector items{{1, "alpha"}, {2, "beta"}}; @@ -615,6 +631,84 @@ TEST(StructComprehensiveTest, NestedContainers) { test_roundtrip(NestedContainerStruct{{{1, 2}, {3, 4}}, {{"a", {10, 20}}}}); } +TEST(StructComprehensiveTest, NestedAnnotatedContainers) { + NestedAnnotatedStruct obj{{{1, {10, -20, 30}}, {2, {40, 50}}}}; + test_roundtrip(obj); + + auto fory = + Fory::builder().xlang(true).compatible(true).track_ref(false).build(); + ASSERT_TRUE(fory.register_struct(601).ok()); + ASSERT_TRUE(fory.serialize(obj).ok()); + TypeMeta meta = + fory.type_resolver().clone_struct_meta(); + const auto &fields = meta.get_field_infos(); + ASSERT_EQ(fields.size(), 1); + const auto &field_type = fields[0].field_type; + ASSERT_EQ(field_type.type_id, static_cast(TypeId::MAP)); + ASSERT_EQ(field_type.generics.size(), 2); + EXPECT_EQ(field_type.generics[0].type_id, + static_cast(TypeId::VAR_UINT32)); + ASSERT_EQ(field_type.generics[1].type_id, + static_cast(TypeId::LIST)); + ASSERT_EQ(field_type.generics[1].generics.size(), 1); + EXPECT_EQ(field_type.generics[1].generics[0].type_id, + static_cast(TypeId::TAGGED_INT64)); +} + +TEST(StructComprehensiveTest, PartialMapAnnotations) { + PartialMapAnnotatedStruct obj{ + {{1, {10, 20}}, {2, {30}}}, + {{3, {40, -50}}, {4, {60}}}, + }; + test_roundtrip(obj); + + auto fory = + Fory::builder().xlang(true).compatible(true).track_ref(false).build(); + ASSERT_TRUE(fory.register_struct(602).ok()); + ASSERT_TRUE(fory.serialize(obj).ok()); + TypeMeta meta = + fory.type_resolver().clone_struct_meta(); + const auto &fields = meta.get_field_infos(); + ASSERT_EQ(fields.size(), 2); + const FieldInfo *key_only = nullptr; + const FieldInfo *value_only = nullptr; + for (const auto &field : fields) { + if (field.field_name == "key_only") { + key_only = &field; + } else if (field.field_name == "value_only") { + value_only = &field; + } + } + ASSERT_NE(key_only, nullptr); + ASSERT_NE(value_only, nullptr); + EXPECT_EQ(key_only->field_type.generics[0].type_id, + static_cast(TypeId::VAR_UINT32)); + EXPECT_EQ(value_only->field_type.generics[1].generics[0].type_id, + static_cast(TypeId::TAGGED_INT64)); +} + +TEST(StructComprehensiveTest, OptionalNestedAnnotation) { + test_roundtrip( + OptionalNestedAnnotatedStruct{{std::vector{1, 2, 3}}}); + test_roundtrip(OptionalNestedAnnotatedStruct{std::nullopt}); + + auto fory = + Fory::builder().xlang(true).compatible(true).track_ref(false).build(); + ASSERT_TRUE(fory.register_struct(603).ok()); + ASSERT_TRUE( + fory.serialize(OptionalNestedAnnotatedStruct{{std::vector{1}}}) + .ok()); + TypeMeta meta = + fory.type_resolver().clone_struct_meta(); + const auto &fields = meta.get_field_infos(); + ASSERT_EQ(fields.size(), 1); + EXPECT_TRUE(fields[0].field_type.nullable); + ASSERT_EQ(fields[0].field_type.type_id, static_cast(TypeId::LIST)); + ASSERT_EQ(fields[0].field_type.generics.size(), 1); + EXPECT_EQ(fields[0].field_type.generics[0].type_id, + static_cast(TypeId::VAR_UINT32)); +} + TEST(StructComprehensiveTest, OptionalFieldsAllEmpty) { test_roundtrip( OptionalFieldsStruct{"John", std::nullopt, std::nullopt, std::nullopt}); diff --git a/cpp/fory/serialization/type_resolver.cc b/cpp/fory/serialization/type_resolver.cc index b17f959fb2..fe5bda6db9 100644 --- a/cpp/fory/serialization/type_resolver.cc +++ b/cpp/fory/serialization/type_resolver.cc @@ -1208,7 +1208,6 @@ std::string TypeMeta::compute_struct_fingerprint( } fingerprint.append(std::to_string(effective_type_id)); fingerprint.push_back(','); - // Use field-level ref tracking flag from FORY_FIELD_TAGS or fory::field<> fingerprint.push_back(fi.field_type.track_ref ? '1' : '0'); fingerprint.push_back(','); fingerprint.append(fi.field_type.nullable ? "1;" : "0;"); diff --git a/cpp/fory/serialization/type_resolver.h b/cpp/fory/serialization/type_resolver.h index e5c7467813..11676f2633 100644 --- a/cpp/fory/serialization/type_resolver.h +++ b/cpp/fory/serialization/type_resolver.h @@ -516,6 +516,165 @@ template Result build_field_type_with_resolver(TypeResolver &resolver, bool nullable); +inline bool field_node_has_override(const FieldNodeSpec &spec, + int8_t node_index) { + return node_index >= 0 && + (spec.kind_[node_index] != FieldNodeKind::Default || + spec.encoding_[node_index] != Encoding::Default || + spec.scalar_[node_index] != FieldScalarKind::Inferred); +} + +template +void apply_integer_encoding(FieldType &ft, const FieldNodeSpec &spec, + int8_t node_index) { + using Decayed = decay_t; + const Encoding enc = + node_index >= 0 ? spec.encoding_[node_index] : Encoding::Default; + if (enc == Encoding::Default) { + return; + } + if constexpr (std::is_same_v) { + ft.type_id = static_cast(TypeId::UINT8); + } else if constexpr (std::is_same_v) { + ft.type_id = static_cast(TypeId::UINT16); + } else if constexpr (std::is_same_v) { + ft.type_id = static_cast( + enc == Encoding::Varint ? TypeId::VAR_UINT32 : TypeId::UINT32); + } else if constexpr (std::is_same_v) { + ft.type_id = static_cast(enc == Encoding::Varint + ? TypeId::VAR_UINT64 + : (enc == Encoding::Tagged + ? TypeId::TAGGED_UINT64 + : TypeId::UINT64)); + } else if constexpr (std::is_same_v || + std::is_same_v) { + ft.type_id = static_cast( + enc == Encoding::Fixed ? TypeId::INT32 : TypeId::VARINT32); + } else if constexpr (std::is_same_v || + std::is_same_v) { + ft.type_id = static_cast( + enc == Encoding::Fixed ? TypeId::INT64 + : (enc == Encoding::Tagged ? TypeId::TAGGED_INT64 + : TypeId::VARINT64)); + } +} + +template +FieldType build_field_type_with_spec(bool nullable, const FieldNodeSpec &spec, + int8_t node_index = 0) { + using Decayed = decay_t; + const FieldNodeKind node_kind = + node_index >= 0 ? spec.kind_[node_index] : FieldNodeKind::Default; + + if constexpr (is_optional_v) { + using Inner = typename Decayed::value_type; + const int8_t child = node_kind == FieldNodeKind::Inner + ? spec.child0_[node_index] + : node_index; + FieldType inner = build_field_type_with_spec(true, spec, child); + inner.nullable = true; + return inner; + } else if constexpr (is_shared_ptr_v) { + using Inner = typename Decayed::element_type; + if constexpr (std::is_polymorphic_v) { + return FieldType(to_type_id(TypeId::UNKNOWN), true); + } else { + const int8_t child = node_kind == FieldNodeKind::Inner + ? spec.child0_[node_index] + : node_index; + FieldType inner = build_field_type_with_spec(true, spec, child); + inner.nullable = true; + return inner; + } + } else if constexpr (::fory::detail::is_shared_weak_v) { + using Inner = nullable_element_t; + if constexpr (std::is_polymorphic_v) { + return FieldType(to_type_id(TypeId::UNKNOWN), true); + } else { + const int8_t child = node_kind == FieldNodeKind::Inner + ? spec.child0_[node_index] + : node_index; + FieldType inner = build_field_type_with_spec(true, spec, child); + inner.nullable = true; + return inner; + } + } else if constexpr (is_unique_ptr_v) { + using Inner = typename Decayed::element_type; + if constexpr (std::is_polymorphic_v) { + return FieldType(to_type_id(TypeId::UNKNOWN), true); + } else { + const int8_t child = node_kind == FieldNodeKind::Inner + ? spec.child0_[node_index] + : node_index; + FieldType inner = build_field_type_with_spec(true, spec, child); + inner.nullable = true; + return inner; + } + } else if constexpr (is_vector_v) { + using Element = element_type_t; + constexpr TypeId default_type_id = Serializer::type_id; + const bool force_list = node_kind == FieldNodeKind::List; + const TypeId type_id = force_list ? TypeId::LIST : default_type_id; + if (type_id == TypeId::LIST) { + const int8_t child = force_list ? spec.child0_[node_index] : -1; + FieldType elem = + field_node_has_override(spec, child) + ? build_field_type_with_spec(false, spec, child) + : FieldTypeBuilder::build(false); + FieldType ft(to_type_id(TypeId::LIST), nullable); + ft.generics.push_back(std::move(elem)); + return ft; + } + return FieldType(to_type_id(type_id), nullable); + } else if constexpr (is_list_v || is_deque_v || + is_forward_list_v) { + using Element = typename Decayed::value_type; + const int8_t child = + node_kind == FieldNodeKind::List ? spec.child0_[node_index] : -1; + FieldType elem = + field_node_has_override(spec, child) + ? build_field_type_with_spec(false, spec, child) + : FieldTypeBuilder::build(false); + FieldType ft(to_type_id(TypeId::LIST), nullable); + ft.generics.push_back(std::move(elem)); + return ft; + } else if constexpr (is_set_like_v) { + using Element = element_type_t; + const int8_t child = + node_kind == FieldNodeKind::Set ? spec.child0_[node_index] : -1; + FieldType elem = + field_node_has_override(spec, child) + ? build_field_type_with_spec(false, spec, child) + : FieldTypeBuilder::build(false); + FieldType ft(to_type_id(Serializer::type_id), nullable); + ft.generics.push_back(std::move(elem)); + return ft; + } else if constexpr (is_map_like_v) { + using Key = key_type_t; + using Value = mapped_type_t; + const int8_t key_child = + node_kind == FieldNodeKind::Map ? spec.child0_[node_index] : -1; + const int8_t value_child = + node_kind == FieldNodeKind::Map ? spec.child1_[node_index] : -1; + FieldType key_ft = + field_node_has_override(spec, key_child) + ? build_field_type_with_spec(false, spec, key_child) + : FieldTypeBuilder::build(false); + FieldType value_ft = + field_node_has_override(spec, value_child) + ? build_field_type_with_spec(false, spec, value_child) + : FieldTypeBuilder::build(false); + FieldType ft(to_type_id(Serializer::type_id), nullable); + ft.generics.push_back(std::move(key_ft)); + ft.generics.push_back(std::move(value_ft)); + return ft; + } else { + FieldType ft = FieldTypeBuilder::build(nullable); + apply_integer_encoding(ft, spec, node_index); + return ft; + } +} + template Result add_tuple_element_types(TypeResolver &resolver, FieldType &ft) { @@ -659,20 +818,141 @@ Result build_field_type_with_resolver(TypeResolver &resolver, } } +template +Result +build_field_type_with_resolver_and_spec(TypeResolver &resolver, bool nullable, + const FieldNodeSpec &spec, + int8_t node_index = 0) { + using Decayed = decay_t; + const FieldNodeKind node_kind = + node_index >= 0 ? spec.kind_[node_index] : FieldNodeKind::Default; + + if constexpr (is_optional_v) { + using Inner = typename Decayed::value_type; + const int8_t child = node_kind == FieldNodeKind::Inner + ? spec.child0_[node_index] + : node_index; + FORY_TRY(inner, (build_field_type_with_resolver_and_spec( + resolver, true, spec, child))); + inner.nullable = true; + return inner; + } else if constexpr (is_shared_ptr_v) { + using Inner = typename Decayed::element_type; + if constexpr (std::is_polymorphic_v) { + return FieldType(to_type_id(TypeId::UNKNOWN), true); + } else { + const int8_t child = node_kind == FieldNodeKind::Inner + ? spec.child0_[node_index] + : node_index; + FORY_TRY(inner, (build_field_type_with_resolver_and_spec( + resolver, true, spec, child))); + inner.nullable = true; + return inner; + } + } else if constexpr (::fory::detail::is_shared_weak_v) { + using Inner = nullable_element_t; + if constexpr (std::is_polymorphic_v) { + return FieldType(to_type_id(TypeId::UNKNOWN), true); + } else { + const int8_t child = node_kind == FieldNodeKind::Inner + ? spec.child0_[node_index] + : node_index; + FORY_TRY(inner, (build_field_type_with_resolver_and_spec( + resolver, true, spec, child))); + inner.nullable = true; + return inner; + } + } else if constexpr (is_unique_ptr_v) { + using Inner = typename Decayed::element_type; + if constexpr (std::is_polymorphic_v) { + return FieldType(to_type_id(TypeId::UNKNOWN), true); + } else { + const int8_t child = node_kind == FieldNodeKind::Inner + ? spec.child0_[node_index] + : node_index; + FORY_TRY(inner, (build_field_type_with_resolver_and_spec( + resolver, true, spec, child))); + inner.nullable = true; + return inner; + } + } else if constexpr (is_vector_v) { + using Element = element_type_t; + constexpr TypeId default_type_id = Serializer::type_id; + const bool force_list = node_kind == FieldNodeKind::List; + const TypeId type_id = force_list ? TypeId::LIST : default_type_id; + if (type_id == TypeId::LIST) { + const int8_t child = force_list ? spec.child0_[node_index] : -1; + FORY_TRY(elem, (field_node_has_override(spec, child) + ? build_field_type_with_resolver_and_spec( + resolver, false, spec, child) + : build_field_type_with_resolver(resolver, + false))); + FieldType ft(to_type_id(TypeId::LIST), nullable); + ft.generics.push_back(std::move(elem)); + return ft; + } + return FieldType(to_type_id(type_id), nullable); + } else if constexpr (is_list_v || is_deque_v || + is_forward_list_v) { + using Element = typename Decayed::value_type; + const int8_t child = + node_kind == FieldNodeKind::List ? spec.child0_[node_index] : -1; + FORY_TRY(elem, + (field_node_has_override(spec, child) + ? build_field_type_with_resolver_and_spec( + resolver, false, spec, child) + : build_field_type_with_resolver(resolver, false))); + FieldType ft(to_type_id(TypeId::LIST), nullable); + ft.generics.push_back(std::move(elem)); + return ft; + } else if constexpr (is_set_like_v) { + using Element = element_type_t; + const int8_t child = + node_kind == FieldNodeKind::Set ? spec.child0_[node_index] : -1; + FORY_TRY(elem, + (field_node_has_override(spec, child) + ? build_field_type_with_resolver_and_spec( + resolver, false, spec, child) + : build_field_type_with_resolver(resolver, false))); + FieldType ft(to_type_id(Serializer::type_id), nullable); + ft.generics.push_back(std::move(elem)); + return ft; + } else if constexpr (is_map_like_v) { + using Key = key_type_t; + using Value = mapped_type_t; + const int8_t key_child = + node_kind == FieldNodeKind::Map ? spec.child0_[node_index] : -1; + const int8_t value_child = + node_kind == FieldNodeKind::Map ? spec.child1_[node_index] : -1; + FORY_TRY(key_ft, + (field_node_has_override(spec, key_child) + ? build_field_type_with_resolver_and_spec( + resolver, false, spec, key_child) + : build_field_type_with_resolver(resolver, false))); + FORY_TRY(value_ft, + (field_node_has_override(spec, value_child) + ? build_field_type_with_resolver_and_spec( + resolver, false, spec, value_child) + : build_field_type_with_resolver(resolver, false))); + FieldType ft(to_type_id(Serializer::type_id), nullable); + ft.generics.push_back(std::move(key_ft)); + ft.generics.push_back(std::move(value_ft)); + return ft; + } else { + FORY_TRY(ft, (build_field_type_with_resolver(resolver, nullable))); + apply_integer_encoding(ft, spec, node_index); + return ft; + } +} + // Helper template functions to compute is_nullable and track_ref at compile // time. These replace constexpr lambdas which have issues on MSVC. template constexpr bool compute_is_nullable() { - if constexpr (is_fory_field_v) { - return ActualFieldType::is_nullable; - } else if constexpr (::fory::detail::has_field_tags_v) { - return ::fory::detail::GetFieldTagEntry::is_nullable; - } else if constexpr (::fory::detail::has_field_config_v && - ::fory::detail::GetFieldConfigEntry::has_entry && - ::fory::detail::GetFieldConfigEntry::nullable) { + if constexpr (::fory::detail::has_field_config_v && + ::fory::detail::GetFieldConfigEntry::has_entry && + ::fory::detail::GetFieldConfigEntry::nullable) { return true; } else { // Default: nullable if std::optional or smart pointers. @@ -684,14 +964,9 @@ constexpr bool compute_is_nullable() { template constexpr bool compute_track_ref() { - if constexpr (is_fory_field_v) { - return ActualFieldType::track_ref; - } else if constexpr (::fory::detail::has_field_tags_v) { - return ::fory::detail::GetFieldTagEntry::track_ref; - } else if constexpr (::fory::detail::has_field_config_v && - ::fory::detail::GetFieldConfigEntry::has_entry && - ::fory::detail::GetFieldConfigEntry::ref) { + if constexpr (::fory::detail::has_field_config_v && + ::fory::detail::GetFieldConfigEntry::has_entry && + ::fory::detail::GetFieldConfigEntry::ref) { return true; } else { using UnwrappedFieldType = fory::unwrap_field_t; @@ -709,15 +984,6 @@ constexpr int16_t compute_field_id() { return config_id; } } - if constexpr (is_fory_field_v) { - return field_tag_id_v; - } - if constexpr (::fory::detail::has_field_tags_v) { - constexpr int16_t tag_id = ::fory::detail::GetFieldTagEntry::id; - if constexpr (tag_id >= 0) { - return tag_id; - } - } return -1; } @@ -741,10 +1007,10 @@ struct unwrap_optional_inner>>> { template using unwrap_optional_inner_t = typename unwrap_optional_inner::type; -// Helper to compute the correct type_id for unsigned types based on encoding +// Helper to compute the correct type_id for unsigned types based on the +// effective field spec. template constexpr uint32_t compute_unsigned_type_id() { - // For unsigned types, check if FORY_FIELD_CONFIG specifies an encoding if constexpr (::fory::detail::has_field_config_v) { constexpr auto enc = ::fory::detail::GetFieldConfigEntry::encoding; @@ -770,7 +1036,7 @@ constexpr uint32_t compute_unsigned_type_id() { } } } - // Not an unsigned type with field config, use default + // Not an unsigned type with configured encoding; use the type default. return 0; } @@ -817,42 +1083,17 @@ template struct FieldInfoBuilder { typename meta::RemoveMemberPointerCVRefT; using ActualFieldType = std::remove_cv_t>; - // unwrap fory::field<> to get the underlying type for FieldTypeBuilder using UnwrappedFieldType = fory::unwrap_field_t; - // get nullable and track_ref from field tags (FORY_FIELD_TAGS or - // fory::field<>) constexpr bool is_nullable = compute_is_nullable(); constexpr bool track_ref = compute_track_ref(); constexpr int16_t field_id = compute_field_id(); - FieldType field_type = FieldTypeBuilder::build(false); - - // Override type_id for unsigned types based on encoding from - // FORY_FIELD_CONFIG - using InnerType = unwrap_optional_inner_t; - constexpr uint32_t unsigned_tid = - compute_unsigned_type_id(); - if constexpr (unsigned_tid != 0 && is_unsigned_integer_v) { - field_type.type_id = unsigned_tid; - } - - // Override type_id for signed types based on encoding from - // FORY_FIELD_CONFIG - constexpr uint32_t signed_tid = - compute_signed_type_id(); - if constexpr (signed_tid != 0) { - field_type.type_id = signed_tid; - } - - if constexpr (::fory::detail::has_field_config_v) { - constexpr int16_t override_id = - ::fory::detail::GetFieldConfigEntry::type_id_override; - if constexpr (override_id >= 0) { - field_type.type_id = static_cast(override_id); - } - } + constexpr FieldNodeSpec spec = + ::fory::detail::GetFieldConfigEntry::spec; + FieldType field_type = + build_field_type_with_spec(false, spec); // Override nullable and track_ref from field-level metadata field_type.nullable = is_nullable; @@ -862,9 +1103,9 @@ template struct FieldInfoBuilder { // DEBUG: Print field info for debugging fingerprint mismatch std::cerr << "[xlang][debug] FieldInfoBuilder T=" << typeid(T).name() << " Index=" << Index << " field=" << field_name - << " type_id=" << field_type.type_id << " has_tags=" - << ::fory::detail::has_field_tags_v << " is_nullable=" - << is_nullable << " track_ref=" << track_ref << std::endl; + << " type_id=" << field_type.type_id + << " is_nullable=" << is_nullable << " track_ref=" << track_ref + << std::endl; #endif FieldInfo info(std::move(field_name), std::move(field_type)); info.field_id = field_id; @@ -889,43 +1130,18 @@ template struct FieldInfoBuilder { typename meta::RemoveMemberPointerCVRefT; using ActualFieldType = std::remove_cv_t>; - // unwrap fory::field<> to get the underlying type for FieldTypeBuilder using UnwrappedFieldType = fory::unwrap_field_t; - // get nullable and track_ref from field tags (FORY_FIELD_TAGS or - // fory::field<>) constexpr bool is_nullable = compute_is_nullable(); constexpr bool track_ref = compute_track_ref(); constexpr int16_t field_id = compute_field_id(); - FORY_TRY(field_type, build_field_type_with_resolver( - resolver, false)); - - // Override type_id for unsigned types based on encoding from - // FORY_FIELD_CONFIG - using InnerType = unwrap_optional_inner_t; - constexpr uint32_t unsigned_tid = - compute_unsigned_type_id(); - if constexpr (unsigned_tid != 0 && is_unsigned_integer_v) { - field_type.type_id = unsigned_tid; - } - - // Override type_id for signed types based on encoding from - // FORY_FIELD_CONFIG - constexpr uint32_t signed_tid = - compute_signed_type_id(); - if constexpr (signed_tid != 0) { - field_type.type_id = signed_tid; - } - - if constexpr (::fory::detail::has_field_config_v) { - constexpr int16_t override_id = - ::fory::detail::GetFieldConfigEntry::type_id_override; - if constexpr (override_id >= 0) { - field_type.type_id = static_cast(override_id); - } - } + constexpr FieldNodeSpec spec = + ::fory::detail::GetFieldConfigEntry::spec; + FORY_TRY(field_type, + (build_field_type_with_resolver_and_spec( + resolver, false, spec))); // Override nullable and track_ref from field-level metadata field_type.nullable = is_nullable; @@ -935,9 +1151,9 @@ template struct FieldInfoBuilder { // DEBUG: Print field info for debugging fingerprint mismatch std::cerr << "[xlang][debug] FieldInfoBuilder T=" << typeid(T).name() << " Index=" << Index << " field=" << field_name - << " type_id=" << field_type.type_id << " has_tags=" - << ::fory::detail::has_field_tags_v << " is_nullable=" - << is_nullable << " track_ref=" << track_ref << std::endl; + << " type_id=" << field_type.type_id + << " is_nullable=" << is_nullable << " track_ref=" << track_ref + << std::endl; #endif FieldInfo info(std::move(field_name), std::move(field_type)); info.field_id = field_id; diff --git a/cpp/fory/serialization/union_serializer.h b/cpp/fory/serialization/union_serializer.h index c90d3d0d27..7099568d48 100644 --- a/cpp/fory/serialization/union_serializer.h +++ b/cpp/fory/serialization/union_serializer.h @@ -25,6 +25,7 @@ #include "fory/serialization/serializer.h" #include "fory/serialization/serializer_traits.h" #include "fory/serialization/skip.h" +#include "fory/serialization/struct_serializer.h" #include "fory/type/type.h" #include "fory/util/error.h" @@ -175,6 +176,48 @@ template using union_unwrap_optional_inner_t = typename union_unwrap_optional_inner::type; +template struct UnionCaseSpecProvider { + static inline constexpr FieldNodeSpec spec = + UnionInfo::template Meta::value.spec_; +}; + +template +constexpr FieldNodeKind union_node_kind() { + constexpr auto spec = SpecProvider::spec; + return NodeIndex >= 0 ? spec.kind_[NodeIndex] : FieldNodeKind::Default; +} + +template +constexpr Encoding union_node_encoding() { + constexpr auto spec = SpecProvider::spec; + return NodeIndex >= 0 ? spec.encoding_[NodeIndex] : Encoding::Default; +} + +template +constexpr bool union_node_has_override() { + constexpr auto spec = SpecProvider::spec; + return NodeIndex >= 0 && + (spec.kind_[NodeIndex] != FieldNodeKind::Default || + spec.encoding_[NodeIndex] != Encoding::Default || + spec.scalar_[NodeIndex] != FieldScalarKind::Inferred); +} + +template +constexpr FieldScalarKind union_node_scalar() { + constexpr auto spec = SpecProvider::spec; + return NodeIndex >= 0 ? spec.scalar_[NodeIndex] : FieldScalarKind::Inferred; +} + +template +constexpr int8_t union_node_child() { + constexpr auto spec = SpecProvider::spec; + if constexpr (ChildSlot == 0) { + return NodeIndex >= 0 ? spec.child0_[NodeIndex] : -1; + } else { + return NodeIndex >= 0 ? spec.child1_[NodeIndex] : -1; + } +} + template constexpr uint32_t resolve_union_type_id(const ::fory::FieldMeta &meta) { if (meta.type_id_override_ >= 0) { @@ -229,6 +272,351 @@ constexpr bool needs_manual_encoding(const ::fory::FieldMeta &meta) { resolve_union_type_id(meta); } +template +FORY_ALWAYS_INLINE void write_union_configured_scalar(const FieldType &value, + WriteContext &ctx) { + constexpr Encoding enc = union_node_encoding(); + if constexpr (is_configurable_int_v) { + if constexpr (std::is_same_v) { + if constexpr (enc == Encoding::Varint) { + ctx.write_var_uint32(value); + } else { + ctx.buffer().write_int32(static_cast(value)); + } + } else if constexpr (std::is_same_v) { + if constexpr (enc == Encoding::Varint) { + ctx.write_var_uint64(value); + } else if constexpr (enc == Encoding::Tagged) { + ctx.write_tagged_uint64(value); + } else { + ctx.buffer().write_int64(static_cast(value)); + } + } else if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (enc == Encoding::Fixed) { + ctx.buffer().write_int32(static_cast(value)); + } else { + ctx.write_var_int32(static_cast(value)); + } + } else if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (enc == Encoding::Fixed) { + ctx.buffer().write_int64(static_cast(value)); + } else if constexpr (enc == Encoding::Tagged) { + ctx.write_tagged_int64(static_cast(value)); + } else { + ctx.write_var_int64(static_cast(value)); + } + } else { + Serializer::write_data(value, ctx); + } + } else { + Serializer::write_data(value, ctx); + } +} + +template +FORY_ALWAYS_INLINE FieldType read_union_configured_scalar(ReadContext &ctx) { + if constexpr (is_configurable_int_v) { + constexpr Encoding enc = union_node_encoding(); + if constexpr (std::is_same_v) { + if constexpr (enc == Encoding::Varint) { + return static_cast(ctx.read_var_uint32(ctx.error())); + } + return static_cast(ctx.read_int32(ctx.error())); + } else if constexpr (std::is_same_v) { + if constexpr (enc == Encoding::Varint) { + return static_cast(ctx.read_var_uint64(ctx.error())); + } else if constexpr (enc == Encoding::Tagged) { + return static_cast(ctx.read_tagged_uint64(ctx.error())); + } + return static_cast(ctx.read_uint64(ctx.error())); + } else if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (enc == Encoding::Fixed) { + return static_cast(ctx.read_int32(ctx.error())); + } + return static_cast(ctx.read_var_int32(ctx.error())); + } else if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (enc == Encoding::Fixed) { + return static_cast(ctx.read_int64(ctx.error())); + } else if constexpr (enc == Encoding::Tagged) { + return static_cast(ctx.read_tagged_int64(ctx.error())); + } + return static_cast(ctx.read_var_int64(ctx.error())); + } else { + return Serializer::read_data(ctx); + } + } else { + return Serializer::read_data(ctx); + } +} + +template +void write_union_configured_value(const ValueType &value, WriteContext &ctx, + RefMode ref_mode, bool write_type, + bool has_generics); + +template +ValueType read_union_configured_value(ReadContext &ctx, RefMode ref_mode, + bool read_type); + +template +void write_union_configured_list_data(const Container &coll, + WriteContext &ctx) { + using Elem = element_type_t; + ctx.write_var_uint32(static_cast(coll.size())); + if (coll.empty()) { + return; + } + ctx.write_uint8(COLL_DECL_ELEMENT_TYPE | COLL_IS_SAME_TYPE); + for (const auto &elem : coll) { + if constexpr (ElemNode >= 0) { + write_union_configured_value( + elem, ctx, RefMode::None, false, true); + } else { + Serializer::write_data(elem, ctx); + } + } +} + +template +Container read_union_configured_list_data(ReadContext &ctx) { + using Elem = element_type_t; + uint32_t length = ctx.read_var_uint32(ctx.error()); + Container result; + if constexpr (has_reserve_v) { + result.reserve(length); + } + if (FORY_PREDICT_FALSE(ctx.has_error()) || length == 0) { + return result; + } + uint8_t bitmap = ctx.read_uint8(ctx.error()); + if (FORY_PREDICT_FALSE(ctx.has_error())) { + return result; + } + const bool is_decl_type = (bitmap & COLL_DECL_ELEMENT_TYPE) != 0; + const bool is_same_type = (bitmap & COLL_IS_SAME_TYPE) != 0; + if (is_same_type && !is_decl_type) { + (void)ctx.read_any_type_info(ctx.error()); + if (FORY_PREDICT_FALSE(ctx.has_error())) { + return result; + } + } + for (uint32_t i = 0; i < length; ++i) { + if constexpr (ElemNode >= 0) { + auto elem = read_union_configured_value( + ctx, RefMode::None, false); + collection_insert(result, std::move(elem)); + } else { + auto elem = Serializer::read_data(ctx); + collection_insert(result, std::move(elem)); + } + } + return result; +} + +template +void write_union_configured_map_data(const MapType &map, WriteContext &ctx) { + using Key = key_type_t; + using Value = mapped_type_t; + ctx.write_var_uint32(static_cast(map.size())); + if (map.empty()) { + return; + } + size_t header_offset = 0; + uint8_t pair_counter = 0; + bool need_write_header = true; + for (const auto &[key, value] : map) { + if (need_write_header) { + ctx.enter_flush_barrier(); + header_offset = ctx.buffer().writer_index(); + ctx.write_uint16(0); + ctx.buffer().unsafe_put_byte( + header_offset, static_cast(DECL_KEY_TYPE | DECL_VALUE_TYPE)); + need_write_header = false; + } + if constexpr (KeyNode >= 0) { + write_union_configured_value( + key, ctx, RefMode::None, false, true); + } else { + Serializer::write_data(key, ctx); + } + if constexpr (ValueNode >= 0) { + write_union_configured_value( + value, ctx, RefMode::None, false, true); + } else { + Serializer::write_data(value, ctx); + } + ++pair_counter; + if (pair_counter == MAX_CHUNK_SIZE) { + write_chunk_size(ctx, header_offset, pair_counter); + ctx.exit_flush_barrier(); + ctx.try_flush(); + pair_counter = 0; + need_write_header = true; + } + } + if (pair_counter > 0) { + write_chunk_size(ctx, header_offset, pair_counter); + ctx.exit_flush_barrier(); + ctx.try_flush(); + } +} + +template +MapType read_union_configured_map_data(ReadContext &ctx) { + using Key = key_type_t; + using Value = mapped_type_t; + uint32_t length = ctx.read_var_uint32(ctx.error()); + MapType result; + MapReserver::reserve(result, length); + uint32_t read_count = 0; + while (read_count < length && !ctx.has_error()) { + uint8_t header = ctx.read_uint8(ctx.error()); + uint8_t chunk_size = ctx.read_uint8(ctx.error()); + if (FORY_PREDICT_FALSE(ctx.has_error())) { + return result; + } + const bool key_decl = (header & DECL_KEY_TYPE) != 0; + const bool value_decl = (header & DECL_VALUE_TYPE) != 0; + if (!key_decl) { + (void)ctx.read_any_type_info(ctx.error()); + } + if (!value_decl) { + (void)ctx.read_any_type_info(ctx.error()); + } + for (uint8_t i = 0; i < chunk_size && read_count < length; ++i) { + Key key = [&]() { + if constexpr (KeyNode >= 0) { + return read_union_configured_value( + ctx, RefMode::None, false); + } else { + return Serializer::read_data(ctx); + } + }(); + Value value = [&]() { + if constexpr (ValueNode >= 0) { + return read_union_configured_value( + ctx, RefMode::None, false); + } else { + return Serializer::read_data(ctx); + } + }(); + result.emplace(std::move(key), std::move(value)); + ++read_count; + } + } + return result; +} + +template +void write_union_configured_value(const ValueType &value, WriteContext &ctx, + RefMode ref_mode, bool write_type, + bool has_generics) { + constexpr FieldNodeKind kind = union_node_kind(); + constexpr FieldScalarKind scalar_kind = + union_node_scalar(); + static_assert(configured_scalar_kind_matches(), + "fory::T typed scalar spec does not match the C++ union case " + "type"); + if constexpr (is_optional_v) { + using Inner = typename ValueType::value_type; + if (!value.has_value()) { + if (ref_mode != RefMode::None) { + ctx.write_int8(NULL_FLAG); + } + return; + } + write_not_null_ref_flag(ctx, ref_mode); + constexpr int8_t child = + kind == FieldNodeKind::Inner + ? union_node_child() + : NodeIndex; + write_union_configured_value( + *value, ctx, RefMode::None, false, has_generics); + } else if constexpr ((is_vector_v || is_list_v || + is_deque_v || is_set_like_v) && + (kind == FieldNodeKind::List || + kind == FieldNodeKind::Set)) { + write_not_null_ref_flag(ctx, ref_mode); + constexpr int8_t child = union_node_child(); + write_union_configured_list_data(value, + ctx); + } else if constexpr (is_map_like_v && kind == FieldNodeKind::Map) { + write_not_null_ref_flag(ctx, ref_mode); + constexpr int8_t key_child = union_node_child(); + constexpr int8_t value_child = + union_node_child(); + write_union_configured_map_data(value, ctx); + } else if constexpr (kind == FieldNodeKind::Scalar || + union_node_encoding() != + Encoding::Default) { + write_not_null_ref_flag(ctx, ref_mode); + write_union_configured_scalar(value, + ctx); + } else { + Serializer::write(value, ctx, ref_mode, write_type, + has_generics); + } +} + +template +ValueType read_union_configured_value(ReadContext &ctx, RefMode ref_mode, + bool read_type) { + constexpr FieldNodeKind kind = union_node_kind(); + constexpr FieldScalarKind scalar_kind = + union_node_scalar(); + static_assert(configured_scalar_kind_matches(), + "fory::T typed scalar spec does not match the C++ union case " + "type"); + if constexpr (is_optional_v) { + using Inner = typename ValueType::value_type; + if (!read_null_only_flag(ctx, ref_mode)) { + return std::nullopt; + } + constexpr int8_t child = + kind == FieldNodeKind::Inner + ? union_node_child() + : NodeIndex; + Inner inner = read_union_configured_value( + ctx, RefMode::None, false); + return ValueType{std::move(inner)}; + } else if constexpr ((is_vector_v || is_list_v || + is_deque_v || is_set_like_v) && + (kind == FieldNodeKind::List || + kind == FieldNodeKind::Set)) { + if (!read_null_only_flag(ctx, ref_mode)) { + return ValueType{}; + } + constexpr int8_t child = union_node_child(); + return read_union_configured_list_data(ctx); + } else if constexpr (is_map_like_v && kind == FieldNodeKind::Map) { + if (!read_null_only_flag(ctx, ref_mode)) { + return ValueType{}; + } + constexpr int8_t key_child = union_node_child(); + constexpr int8_t value_child = + union_node_child(); + return read_union_configured_map_data(ctx); + } else if constexpr (kind == FieldNodeKind::Scalar || + union_node_encoding() != + Encoding::Default) { + if (!read_null_only_flag(ctx, ref_mode)) { + return ValueType{}; + } + return read_union_configured_scalar( + ctx); + } else { + return Serializer::read(ctx, ref_mode, read_type); + } +} + template inline bool write_union_ref_flag(const T &value, WriteContext &ctx, RefMode ref_mode, bool nullable) { @@ -410,6 +798,12 @@ inline bool dispatch_union_case(uint32_t case_id, F &&fn) { return false; } +template struct UnionFactoryArg; + +template struct UnionFactoryArg { + using type = Arg; +}; + } // namespace detail // ============================================================================// @@ -476,9 +870,13 @@ struct Serializer>> { using CaseT = typename detail::UnionInfo::template CaseT; constexpr ::fory::FieldMeta meta = detail::UnionInfo::template Meta::value; + using SpecProvider = detail::UnionCaseSpecProvider; constexpr uint32_t field_type_id = detail::resolve_union_type_id(meta); - const bool manual = detail::needs_manual_encoding(meta); + constexpr bool configured = + detail::union_node_has_override(); + const bool manual = + configured || detail::needs_manual_encoding(meta); constexpr bool nullable = meta.nullable_ || is_nullable_v>; const RefMode value_ref_mode = @@ -493,7 +891,12 @@ struct Serializer>> { return; } ctx.write_uint8(static_cast(field_type_id)); - detail::write_union_value_data(value, ctx, field_type_id); + if constexpr (configured) { + detail::write_union_configured_value( + value, ctx, RefMode::None, false, true); + } else { + detail::write_union_value_data(value, ctx, field_type_id); + } return; } Serializer::write(value, ctx, value_ref_mode, true); @@ -557,9 +960,13 @@ struct Serializer>> { using CaseT = typename detail::UnionInfo::template CaseT; constexpr ::fory::FieldMeta meta = detail::UnionInfo::template Meta::value; + using SpecProvider = detail::UnionCaseSpecProvider; constexpr uint32_t field_type_id = detail::resolve_union_type_id(meta); - const bool manual = detail::needs_manual_encoding(meta); + constexpr bool configured = + detail::union_node_has_override(); + const bool manual = + configured || detail::needs_manual_encoding(meta); constexpr bool nullable = meta.nullable_ || is_nullable_v>; const RefMode value_ref_mode = @@ -587,7 +994,14 @@ struct Serializer>> { result = default_value(); return; } - CaseT value = detail::read_union_value_data(ctx, field_type_id); + CaseT value = [&]() { + if constexpr (configured) { + return detail::read_union_configured_value( + ctx, RefMode::None, false); + } else { + return detail::read_union_value_data(ctx, field_type_id); + } + }(); if (FORY_PREDICT_FALSE(ctx.has_error())) { result = default_value(); return; @@ -659,14 +1073,35 @@ struct Serializer>> { // Union registration macros for generated code // ============================================================================// -#define FORY_UNION_CASE_TYPE(tuple) FORY_UNION_CASE_TYPE_IMPL tuple -#define FORY_UNION_CASE_TYPE_IMPL(type, name, meta) type - -#define FORY_UNION_CASE_NAME(tuple) FORY_UNION_CASE_NAME_IMPL tuple -#define FORY_UNION_CASE_NAME_IMPL(type, name, meta) name - -#define FORY_UNION_CASE_META(tuple) FORY_UNION_CASE_META_IMPL tuple -#define FORY_UNION_CASE_META_IMPL(type, name, meta) meta +#define FORY_UNION_TUPLE_SIZE(tuple) FORY_UNION_TUPLE_SIZE_IMPL tuple +#define FORY_UNION_TUPLE_SIZE_IMPL(...) \ + FORY_UNION_TUPLE_SIZE_SELECT(__VA_ARGS__, 3, 2, 1, 0) +#define FORY_UNION_TUPLE_SIZE_SELECT(_1, _2, _3, N, ...) N + +#define FORY_UNION_CASE_NAME(tuple) \ + FORY_PP_CONCAT(FORY_UNION_CASE_NAME_, FORY_UNION_TUPLE_SIZE(tuple))(tuple) +#define FORY_UNION_CASE_NAME_2(tuple) FORY_UNION_CASE_NAME_2_IMPL tuple +#define FORY_UNION_CASE_NAME_2_IMPL(name, meta) name +#define FORY_UNION_CASE_NAME_3(tuple) FORY_UNION_CASE_NAME_3_IMPL tuple +#define FORY_UNION_CASE_NAME_3_IMPL(name, type, meta) name + +#define FORY_UNION_CASE_TYPE(Type, tuple) \ + FORY_PP_CONCAT(FORY_UNION_CASE_TYPE_, FORY_UNION_TUPLE_SIZE(tuple)) \ + (Type, tuple) +#define FORY_UNION_CASE_TYPE_2(Type, tuple) \ + FORY_UNION_CASE_TYPE_2_IMPL(Type, tuple) +#define FORY_UNION_CASE_TYPE_2_IMPL(Type, tuple) \ + typename ::fory::serialization::detail::UnionFactoryArg< \ + decltype(&Type::FORY_UNION_CASE_NAME(tuple))>::type +#define FORY_UNION_CASE_TYPE_3(Type, tuple) FORY_UNION_CASE_TYPE_3_IMPL tuple +#define FORY_UNION_CASE_TYPE_3_IMPL(name, type, meta) type + +#define FORY_UNION_CASE_META(tuple) \ + FORY_PP_CONCAT(FORY_UNION_CASE_META_, FORY_UNION_TUPLE_SIZE(tuple))(tuple) +#define FORY_UNION_CASE_META_2(tuple) FORY_UNION_CASE_META_2_IMPL tuple +#define FORY_UNION_CASE_META_2_IMPL(name, meta) meta +#define FORY_UNION_CASE_META_3(tuple) FORY_UNION_CASE_META_3_IMPL tuple +#define FORY_UNION_CASE_META_3_IMPL(name, type, meta) meta #define FORY_UNION_PP_FOREACH_2(M, A, ...) \ FORY_PP_INVOKE(FORY_PP_CONCAT(FORY_UNION_PP_FOREACH_2_IMPL_, \ @@ -808,13 +1243,18 @@ struct Serializer>> { #define FORY_UNION_CASE_ID(Type, tuple) \ static_cast(FORY_UNION_CASE_META(tuple).id_) +#define FORY_UNION_CASE_REQUIRE_ID(Type, tuple) \ + static_assert(FORY_UNION_CASE_META(tuple).has_id_, \ + "FORY_UNION cases must use fory::F(id)"); + #define FORY_UNION_CASE_ID_ENTRY(Type, tuple) FORY_UNION_CASE_ID(Type, tuple), -#define FORY_UNION_CASE_TYPE_VALUE(Type, tuple) FORY_UNION_CASE_TYPE(tuple) +#define FORY_UNION_CASE_TYPE_VALUE(Type, tuple) \ + FORY_UNION_CASE_TYPE(Type, tuple) #define FORY_UNION_CASE_META_VALUE(Type, tuple) FORY_UNION_CASE_META(tuple) #define FORY_UNION_CASE_ID_VALUE(Type, tuple) FORY_UNION_CASE_ID(Type, tuple) #define FORY_UNION_CASE_FACTORY_VALUE(Type, tuple) \ - static_cast( \ + static_cast( \ &Type::FORY_UNION_CASE_NAME(tuple)) #define FORY_UNION_IDS_DESCRIPTOR_NAME(line) \ @@ -838,6 +1278,8 @@ struct Serializer>> { static_assert(true) #define FORY_UNION_CASE(Type, CaseId, CaseType, Factory, MetaExpr) \ + static_assert((MetaExpr).has_id_, \ + "FORY_UNION_CASE metadata must use fory::F(id)"); \ struct FORY_UNION_CASE_DESCRIPTOR_NAME(__LINE__) { \ using CaseT = CaseType; \ static constexpr ::fory::FieldMeta meta = MetaExpr; \ @@ -855,6 +1297,7 @@ struct Serializer>> { "FORY_UNION supports up to 16 cases; use " \ "FORY_UNION_IDS/FORY_UNION_CASE " \ "for larger unions"); \ + FORY_UNION_PP_FOREACH_2(FORY_UNION_CASE_REQUIRE_ID, Type, __VA_ARGS__) \ struct FORY_UNION_DESCRIPTOR_NAME(__LINE__) { \ using UnionType = Type; \ static constexpr size_t case_count = FORY_PP_NARG(__VA_ARGS__); \ diff --git a/cpp/fory/serialization/xlang_test_main.cc b/cpp/fory/serialization/xlang_test_main.cc index db6d02a827..29e84488b3 100644 --- a/cpp/fory/serialization/xlang_test_main.cc +++ b/cpp/fory/serialization/xlang_test_main.cc @@ -616,6 +616,32 @@ struct CircularRefStruct { FORY_STRUCT(CircularRefStruct, name, self_ref); }; +struct NestedAnnotatedContainerSchemaConsistent { + std::map> values; + + bool operator==(const NestedAnnotatedContainerSchemaConsistent &other) const { + return values == other.values; + } + + FORY_STRUCT(NestedAnnotatedContainerSchemaConsistent, + (values, + fory::F().map(fory::T::uint32().fixed(), + fory::T::list(fory::T::uint64().tagged())))); +}; + +struct NestedAnnotatedContainerCompatible { + std::map> values; + + bool operator==(const NestedAnnotatedContainerCompatible &other) const { + return values == other.values; + } + + FORY_STRUCT(NestedAnnotatedContainerCompatible, + (values, + fory::F().map(fory::T::uint32().fixed(), + fory::T::list(fory::T::uint64().tagged())))); +}; + // ============================================================================ // Unsigned Number Test Types // ============================================================================ @@ -630,11 +656,9 @@ struct UnsignedSchemaConsistentSimple { return u64_tagged == other.u64_tagged && u64_tagged_nullable == other.u64_tagged_nullable; } - FORY_STRUCT(UnsignedSchemaConsistentSimple, u64_tagged, u64_tagged_nullable); + FORY_STRUCT(UnsignedSchemaConsistentSimple, (u64_tagged, fory::F().tagged()), + (u64_tagged_nullable, fory::F().nullable().tagged())); }; -FORY_FIELD_CONFIG(UnsignedSchemaConsistentSimple, - (u64_tagged, fory::F().tagged()), - (u64_tagged_nullable, fory::F().nullable().tagged())); // UnsignedSchemaConsistent (type id 501) // Test struct for unsigned numbers in SCHEMA_CONSISTENT mode. @@ -674,26 +698,20 @@ struct UnsignedSchemaConsistent { u64_fixed_nullable_field == other.u64_fixed_nullable_field && u64_tagged_nullable_field == other.u64_tagged_nullable_field; } - FORY_STRUCT(UnsignedSchemaConsistent, u8_field, u16_field, u32_var_field, - u32_fixed_field, u64_var_field, u64_fixed_field, u64_tagged_field, - u8_nullable_field, u16_nullable_field, u32_var_nullable_field, - u32_fixed_nullable_field, u64_var_nullable_field, - u64_fixed_nullable_field, u64_tagged_nullable_field); + FORY_STRUCT(UnsignedSchemaConsistent, (u8_field, fory::F()), + (u16_field, fory::F()), (u32_var_field, fory::F().varint()), + (u32_fixed_field, fory::F().fixed()), + (u64_var_field, fory::F().varint()), + (u64_fixed_field, fory::F().fixed()), + (u64_tagged_field, fory::F().tagged()), + (u8_nullable_field, fory::F().nullable()), + (u16_nullable_field, fory::F().nullable()), + (u32_var_nullable_field, fory::F().nullable().varint()), + (u32_fixed_nullable_field, fory::F().nullable().fixed()), + (u64_var_nullable_field, fory::F().nullable().varint()), + (u64_fixed_nullable_field, fory::F().nullable().fixed()), + (u64_tagged_nullable_field, fory::F().nullable().tagged())); }; -// Use new FORY_FIELD_CONFIG with builder pattern for encoding specification -FORY_FIELD_CONFIG(UnsignedSchemaConsistent, (u8_field, fory::F()), - (u16_field, fory::F()), (u32_var_field, fory::F().varint()), - (u32_fixed_field, fory::F().fixed()), - (u64_var_field, fory::F().varint()), - (u64_fixed_field, fory::F().fixed()), - (u64_tagged_field, fory::F().tagged()), - (u8_nullable_field, fory::F().nullable()), - (u16_nullable_field, fory::F().nullable()), - (u32_var_nullable_field, fory::F().nullable().varint()), - (u32_fixed_nullable_field, fory::F().nullable().fixed()), - (u64_var_nullable_field, fory::F().nullable().varint()), - (u64_fixed_nullable_field, fory::F().nullable().fixed()), - (u64_tagged_nullable_field, fory::F().nullable().tagged())); // UnsignedSchemaCompatible (type id 502) // Test struct for unsigned numbers in COMPATIBLE mode. @@ -733,28 +751,20 @@ struct UnsignedSchemaCompatible { u64_fixed_field2 == other.u64_fixed_field2 && u64_tagged_field2 == other.u64_tagged_field2; } - FORY_STRUCT(UnsignedSchemaCompatible, u8_field1, u16_field1, u32_var_field1, - u32_fixed_field1, u64_var_field1, u64_fixed_field1, - u64_tagged_field1, u8_field2, u16_field2, u32_var_field2, - u32_fixed_field2, u64_var_field2, u64_fixed_field2, - u64_tagged_field2); + FORY_STRUCT(UnsignedSchemaCompatible, (u8_field1, fory::F().nullable()), + (u16_field1, fory::F().nullable()), + (u32_var_field1, fory::F().nullable().varint()), + (u32_fixed_field1, fory::F().nullable().fixed()), + (u64_var_field1, fory::F().nullable().varint()), + (u64_fixed_field1, fory::F().nullable().fixed()), + (u64_tagged_field1, fory::F().nullable().tagged()), + (u8_field2, fory::F()), (u16_field2, fory::F()), + (u32_var_field2, fory::F().varint()), + (u32_fixed_field2, fory::F().fixed()), + (u64_var_field2, fory::F().varint()), + (u64_fixed_field2, fory::F().fixed()), + (u64_tagged_field2, fory::F().tagged())); }; -// Use new FORY_FIELD_CONFIG with builder pattern for encoding specification -// Group 1: nullable in C++ (std::optional), non-nullable in Java -// Group 2: non-nullable in C++, nullable in Java -FORY_FIELD_CONFIG(UnsignedSchemaCompatible, (u8_field1, fory::F().nullable()), - (u16_field1, fory::F().nullable()), - (u32_var_field1, fory::F().nullable().varint()), - (u32_fixed_field1, fory::F().nullable().fixed()), - (u64_var_field1, fory::F().nullable().varint()), - (u64_fixed_field1, fory::F().nullable().fixed()), - (u64_tagged_field1, fory::F().nullable().tagged()), - (u8_field2, fory::F()), (u16_field2, fory::F()), - (u32_var_field2, fory::F().varint()), - (u32_fixed_field2, fory::F().fixed()), - (u64_var_field2, fory::F().varint()), - (u64_fixed_field2, fory::F().fixed()), - (u64_tagged_field2, fory::F().tagged())); namespace fory { namespace serialization { @@ -955,6 +965,10 @@ void run_test_ref_compatible(const std::string &data_file); void run_test_collection_element_ref_override(const std::string &data_file); void run_test_circular_ref_schema_consistent(const std::string &data_file); void run_test_circular_ref_compatible(const std::string &data_file); +void run_test_nested_annotated_container_schema_consistent( + const std::string &data_file); +void run_test_nested_annotated_container_compatible( + const std::string &data_file); void run_test_decimal(const std::string &data_file); void run_test_unsigned_schema_consistent_simple(const std::string &data_file); void run_test_unsigned_schema_consistent(const std::string &data_file); @@ -1069,6 +1083,11 @@ int main(int argc, char **argv) { run_test_circular_ref_schema_consistent(data_file); } else if (case_name == "test_circular_ref_compatible") { run_test_circular_ref_compatible(data_file); + } else if (case_name == + "test_nested_annotated_container_schema_consistent") { + run_test_nested_annotated_container_schema_consistent(data_file); + } else if (case_name == "test_nested_annotated_container_compatible") { + run_test_nested_annotated_container_compatible(data_file); } else if (case_name == "test_unsigned_schema_consistent_simple") { run_test_unsigned_schema_consistent_simple(data_file); } else if (case_name == "test_unsigned_schema_consistent") { @@ -2790,6 +2809,45 @@ void run_test_circular_ref_compatible(const std::string &data_file) { write_file(data_file, out); } +std::map> +build_nested_annotated_container_values() { + return {{4000000000u, {7u, 1000000000u}}, {3u, {42u}}}; +} + +template +void run_nested_annotated_container_test(Fory &fory, + const std::string &data_file) { + auto bytes = read_file(data_file); + Buffer buffer = make_buffer(bytes); + auto value = read_next(fory, buffer); + const auto expected = build_nested_annotated_container_values(); + if (value.values != expected) { + fail("Nested annotated container values mismatch"); + } + + std::vector out; + append_serialized(fory, value, out); + write_file(data_file, out); +} + +void run_test_nested_annotated_container_schema_consistent( + const std::string &data_file) { + auto fory = build_fory(false, true, true); + ensure_ok(fory.register_struct(801), + "register NestedAnnotatedContainerSchemaConsistent"); + run_nested_annotated_container_test( + fory, data_file); +} + +void run_test_nested_annotated_container_compatible( + const std::string &data_file) { + auto fory = build_fory(true, true); + ensure_ok(fory.register_struct(802), + "register NestedAnnotatedContainerCompatible"); + run_nested_annotated_container_test( + fory, data_file); +} + // ============================================================================ // Unsigned Number Tests // ============================================================================ diff --git a/docs/compiler/generated-code.md b/docs/compiler/generated-code.md index 583cd79b6e..5098fb2af6 100644 --- a/docs/compiler/generated-code.md +++ b/docs/compiler/generated-code.md @@ -515,7 +515,9 @@ class Animal final { }; ``` -Generated headers also include `FORY_UNION`, `FORY_FIELD_CONFIG`, `FORY_ENUM`, and `FORY_STRUCT` macros for serialization metadata. +Generated headers include `FORY_UNION`, `FORY_ENUM`, and `FORY_STRUCT` macros +for serialization metadata. Field and payload configuration is embedded in the +generated `FORY_STRUCT`/`FORY_UNION` entries. ### Registration diff --git a/docs/compiler/schema-idl.md b/docs/compiler/schema-idl.md index bffa4eb465..9f514fd0de 100644 --- a/docs/compiler/schema-idl.md +++ b/docs/compiler/schema-idl.md @@ -1237,8 +1237,11 @@ message Order { Use the `list<...>` type for list fields. `repeated` is accepted as an alias. See [Field Modifiers](#field-modifiers) for modifier combinations and language mapping. -Nested collection types are not supported. Use a message wrapper if you need -`list>`, `list>`, or `map<..., list<...>>`. +Nested collection support is target-capability based. The C++ generator accepts +nested collection specs such as `list>`, `list>`, and +`map<..., list<...>>`; targets that have not implemented nested field specs +continue to reject them. Use a message wrapper when you need portable schemas +across all targets. #### Map diff --git a/docs/guide/cpp/field-configuration.md b/docs/guide/cpp/field-configuration.md index 94f5170dd5..02029453ac 100644 --- a/docs/guide/cpp/field-configuration.md +++ b/docs/guide/cpp/field-configuration.md @@ -19,550 +19,188 @@ license: | limitations under the License. --- -This page explains how to configure field-level metadata for serialization. - -## Overview - -Apache Foryâ„¢ provides three ways to configure field-level metadata at compile time: - -1. **`fory::field<>` template** - Inline metadata in struct definition with wrapper types -2. **`FORY_FIELD_TAGS` macro** - Non-invasive metadata for basic field configuration -3. **`FORY_FIELD_CONFIG` macro** - Advanced configuration with builder pattern and encoding control - -These enable: - -- **Tag IDs**: Assign compact numeric IDs for schema evolution -- **Nullability**: Mark pointer fields as nullable -- **Reference Tracking**: Enable reference tracking for shared pointers -- **Encoding Control**: Specify wire format for integers (varint, fixed, tagged) -- **Dynamic Dispatch**: Control polymorphic type info for smart pointers - -**Comparison:** - -| Feature | `fory::field<>` | `FORY_FIELD_TAGS` | `FORY_FIELD_CONFIG` | -| ----------------------- | --------------------- | ----------------- | ------------------------- | -| **Struct modification** | Required (wrap types) | None | None | -| **Encoding control** | No | No | Yes (varint/fixed/tagged) | -| **Builder pattern** | No | No | Yes | -| **Dynamic control** | Yes | No | Yes | -| **Compile-time verify** | Yes | Limited | Yes (member pointers) | -| **Cross-lang compat** | Limited | Limited | Full | -| **Recommended for** | Simple structs | Third-party types | Complex/xlang structs | - -## The fory::field Template - -```cpp -template -class field; -``` - -### Template Parameters - -| Parameter | Description | -| --------- | ------------------------------------------------ | -| `T` | The underlying field type | -| `Id` | Field tag ID (int16_t) for compact serialization | -| `Options` | Optional tags: `fory::nullable`, `fory::ref` | - -### Basic Usage +Field configuration is embedded directly in `FORY_STRUCT`. A field entry may be +bare, or it may be a tuple containing the member name and a `fory::F(...)` +builder: ```cpp #include "fory/serialization/fory.h" -using namespace fory::serialization; - -struct Person { - fory::field name; - fory::field age; - fory::field, 2> nickname; +struct DataV2 { + uint32_t id; + uint64_t timestamp; + std::optional version; }; -FORY_STRUCT(Person, name, age, nickname); -``` -The `fory::field<>` wrapper is transparent - you can use it like the underlying type: - -```cpp -Person person; -person.name = "Alice"; // Direct assignment -person.age = 30; -std::string n = person.name; // Implicit conversion -int a = person.age.get(); // Explicit get() +FORY_STRUCT(DataV2, id, (timestamp, fory::F().tagged()), version); ``` -## Tag Types +The configuration is compile-time metadata. It does not allocate codec objects +or add virtual dispatch on the serialization path. -### fory::nullable +## Field Identity -Marks a smart pointer field as nullable (can be `nullptr`): +`fory::F()` uses name-mode field identity. Bare fields are also name-mode: ```cpp -struct Node { - fory::field name; - fory::field, 1, fory::nullable> next; // Can be nullptr -}; -FORY_STRUCT(Node, name, next); +FORY_STRUCT(DataV2, id, (timestamp, fory::F().tagged()), version); ``` -**Valid for:** `std::shared_ptr`, `fory::serialization::SharedWeak`, `std::unique_ptr` - -**Note:** For nullable primitives or strings, use `std::optional` instead: +`fory::F(id)` uses id-mode field identity: ```cpp -// Correct: use std::optional for nullable primitives -fory::field, 0> optional_value; - -// Wrong: nullable is not allowed for primitives -// fory::field value; // Compile error! +FORY_STRUCT(DataV2, (id, fory::F(0)), (timestamp, fory::F(1).tagged()), + (version, fory::F(2))); ``` -### fory::not_null - -Explicitly marks a pointer field as non-nullable. This is the default for smart pointers, but can be used for documentation: - -```cpp -fory::field, 0, fory::not_null> data; // Must not be nullptr -``` +A struct must use exactly one identity mode. If any field uses `fory::F(id)`, +every field in that `FORY_STRUCT` must use `fory::F(id)`. Mixed name/id mode is a +compile-time error. -**Valid for:** `std::shared_ptr`, `fory::serialization::SharedWeak`, `std::unique_ptr` +## Scalar Encoding -### fory::ref - -Enables reference tracking for shared pointer fields. When multiple fields reference the same object, it will be serialized once and shared: - -```cpp -struct Graph { - fory::field name; - fory::field, 1, fory::ref> left; // Ref tracked - fory::field, 2, fory::ref> right; // Ref tracked -}; -FORY_STRUCT(Graph, name, left, right); -``` - -**Valid for:** `std::shared_ptr`, `fory::serialization::SharedWeak` (requires shared ownership) - -### fory::dynamic\ - -Controls whether type info is written for polymorphic smart pointer fields: - -- `fory::dynamic`: Force type info to be written (enable runtime subtype support) -- `fory::dynamic`: skip type info (use declared type directly, no dynamic dispatch) - -By default, Fory auto-detects polymorphism via `std::is_polymorphic`. Use this tag to override: +Integer encoding is configured on the field or on a nested value-node spec: ```cpp -// Base class with virtual methods (detected as polymorphic by default) -struct Animal { - virtual ~Animal() = default; - virtual std::string speak() const = 0; +struct Counters { + uint32_t fixed_id; + uint64_t tagged_time; + int64_t signed_score; }; -struct Zoo { - // Auto: type info written because Animal has virtual methods - fory::field, 0, fory::nullable> animal; - - // Force non-dynamic: skip type info even though Animal has virtual methods - // Use when you know the runtime type will always be exactly as declared - fory::field, 1, fory::nullable, fory::dynamic> fixed_animal; -}; -FORY_STRUCT(Zoo, animal, fixed_animal); +FORY_STRUCT(Counters, (fixed_id, fory::F().fixed()), + (tagged_time, fory::F().tagged()), + (signed_score, fory::F().varint())); ``` -**Valid for:** `std::shared_ptr`, `std::unique_ptr` - -### Combining Tags +Supported scalar encoding methods are: -Multiple tags can be combined for shared pointers and SharedWeak: +| Method | Meaning | +| ---------- | -------------------------------------------- | +| `fixed()` | Fixed-width integer encoding where valid | +| `varint()` | Variable-length integer encoding where valid | +| `tagged()` | Tagged integer encoding where valid | -```cpp -// Nullable + ref tracking -fory::field, 0, fory::nullable, fory::ref> link; -``` +Invalid scalar/type combinations fail at compile time. -## Type Rules +## Nested Specs -| Type | Allowed Options | Nullability | -| ------------------------------------ | ------------------------------- | ---------------------------------- | -| Primitives, strings | None | Use `std::optional` if nullable | -| `std::optional` | None | Inherently nullable | -| `std::shared_ptr` | `nullable`, `ref`, `dynamic` | Non-null by default | -| `fory::serialization::SharedWeak` | `nullable`, `ref`, `dynamic` | Non-null by default | -| `std::unique_ptr` | `nullable`, `dynamic` | Non-null by default | - -## Complete Example +Use the `fory::T` namespace for value-node specs inside containers and wrapper +carriers. Untyped specs infer the actual C++ type at that node: ```cpp -#include "fory/serialization/fory.h" - -using namespace fory::serialization; - -// Define a struct with various field configurations -struct Document { - // Required fields (non-nullable) - fory::field title; - fory::field version; - - // Optional primitive using std::optional - fory::field, 2> description; +namespace T = fory::T; - // Nullable pointer - fory::field, 3, fory::nullable> metadata; - - // Reference-tracked shared pointer - fory::field, 4, fory::ref> parent; - - // Nullable + reference-tracked - fory::field, 5, fory::nullable, fory::ref> related; +struct Foo { + std::vector values; + std::map> nested; }; -FORY_STRUCT(Document, title, version, description, metadata, parent, related); - -int main() { - auto fory = Fory::builder().xlang(true).build(); - fory.register_struct(100); - - Document doc; - doc.title = "My Document"; - doc.version = 1; - doc.description = "A sample document"; - doc.metadata = nullptr; // Allowed because nullable - doc.parent = std::make_shared(); - doc.parent.get()->title = "Parent Doc"; - doc.related = nullptr; // Allowed because nullable - - auto bytes = fory.serialize(doc).value(); - auto decoded = fory.deserialize(bytes).value(); -} -``` - -## Compile-Time Validation - -Invalid configurations are caught at compile time: - -```cpp -// Error: nullable and not_null are mutually exclusive -fory::field, 0, fory::nullable, fory::not_null> bad1; -// Error: nullable only valid for smart pointers -fory::field bad2; - -// Error: ref only valid for shared_ptr -fory::field, 0, fory::ref> bad3; - -// Error: options not allowed for std::optional (inherently nullable) -fory::field, 0, fory::nullable> bad4; -``` - -## Backwards Compatibility - -Existing structs without `fory::field<>` wrappers continue to work: - -```cpp -// Old style - still works -struct LegacyPerson { - std::string name; - int32_t age; -}; -FORY_STRUCT(LegacyPerson, name, age); - -// New style with field metadata -struct ModernPerson { - fory::field name; - fory::field age; -}; -FORY_STRUCT(ModernPerson, name, age); +FORY_STRUCT(Foo, + (values, fory::F().list(T::fixed())), + (nested, fory::F().map(T::varint(), + T::list(T::tagged())))); ``` -## FORY_FIELD_TAGS Macro - -The `FORY_FIELD_TAGS` macro provides a non-invasive way to add field metadata without modifying struct definitions. This is useful for: - -- **Third-party types**: Add metadata to types you don't own -- **Clean structs**: Keep struct definitions as pure C++ -- **Isolated dependencies**: Confine Fory headers to serialization config files - -### Usage +Typed specs are optional validators and make the intended node type explicit: ```cpp -// user_types.h - NO fory headers needed! -struct Document { - std::string title; - int32_t version; - std::optional description; - std::shared_ptr author; - std::shared_ptr reviewer; - std::shared_ptr parent; - std::unique_ptr data; -}; - -// serialization_config.cpp - fory config isolated here -#include "fory/serialization/fory.h" -#include "user_types.h" - -FORY_STRUCT(Document, title, version, description, author, reviewer, parent, data) - -FORY_FIELD_TAGS(Document, - (title, 0), // string: non-nullable - (version, 1), // int: non-nullable - (description, 2), // optional: inherently nullable - (author, 3), // shared_ptr: non-nullable (default) - (reviewer, 4, nullable), // shared_ptr: nullable - (parent, 5, ref), // shared_ptr: non-nullable, with ref tracking - (data, 6, nullable) // unique_ptr: nullable -) +FORY_STRUCT(Foo, (nested, fory::F().map(T::uint32().varint(), + T::list(T::int64().tagged())))); ``` -### FORY_FIELD_TAGS Options - -| Field Type | Valid Combinations | -| -------------------- | ---------------------------------------------------------------------------------------- | -| Primitives, strings | `(field, id)` only | -| `std::optional` | `(field, id)` only | -| `std::shared_ptr` | `(field, id)`, `(field, id, nullable)`, `(field, id, ref)`, `(field, id, nullable, ref)` | -| `std::unique_ptr` | `(field, id)`, `(field, id, nullable)` | +Supported recursive composition methods are: -## FORY_FIELD_CONFIG Macro +| Method | Applies to | +| ------------------- | ------------------------------------- | +| `list(elem)` | `std::vector` and list-like fields | +| `set(elem)` | `std::set` and set-like fields | +| `map(key, value)` | `std::map` and map-like fields | +| `map().key(spec)` | Override only the map key | +| `map().value(spec)` | Override only the map value | +| `inner(child)` | Transparent single-child carriers | -The `FORY_FIELD_CONFIG` macro is the most powerful and flexible way to configure field-level serialization. It provides: - -- **Builder pattern API**: Fluent, chainable configuration with `F(id).option1().option2()` -- **Encoding control**: Specify how unsigned integers are encoded (varint, fixed, tagged) -- **Compile-time verification**: Field names are verified against member pointers -- **Cross-language compatibility**: Configure encoding to match other languages (Java, Rust, etc.) - -### Basic Syntax +Partial map overrides are useful when only one side needs a non-default +encoding: ```cpp -FORY_FIELD_CONFIG(StructType, - (field1, fory::F(0)), // Simple: just ID - (field2, fory::F(1).nullable()), // With nullable - (field3, fory::F(2).varint()), // With encoding - (field4, fory::F(3).nullable().ref()), // Multiple options - (field5, 4) // Backward compatible: integer ID -); +FORY_STRUCT(Foo, + (nested, fory::F().map().key(T::varint())), + (other, fory::F().map().value(T::list(T::tagged())))); ``` -### The F() Builder - -The `fory::F(id)` factory creates a `FieldMeta` object that supports method chaining: +## Carrier Inner Specs -```cpp -fory::F(0) // Create with field ID 0 - .nullable() // Mark as nullable - .ref() // Enable reference tracking - .varint() // Use variable-length encoding - .fixed() // Use fixed-size encoding - .tagged() // Use tagged encoding - .dynamic(false) // skip type info (no dynamic dispatch) - .dynamic(true) // Force type info (enable dynamic dispatch) - .compress(false) // Disable compression -``` - -**Tip:** To use `F()` without the `fory::` prefix, add a using declaration: +Use `.inner(...)` for wrapper-like carriers. The carrier kind still comes from +the actual C++ type, and controls nullable/reference behavior: ```cpp -using fory::F; +struct WrapperFields { + std::optional> maybe_values; + std::shared_ptr> shared_values; +}; -FORY_FIELD_CONFIG(MyStruct, - (field1, F(0).varint()), // No prefix needed - (field2, F(1).nullable()) -); +FORY_STRUCT(WrapperFields, + (maybe_values, fory::F().inner(T::list(T::varint()))), + (shared_values, + fory::F().nullable().ref().inner(T::list(T::tagged())))); ``` -### Encoding Options for Unsigned Integers +`.inner(...)` is the only public combinator for `std::optional`, +`std::shared_ptr`, `std::unique_ptr`, and +`fory::serialization::SharedWeak`. -For `uint32_t` and `uint64_t` fields, you can specify the wire encoding: +## Nullability, Reference Tracking, And Dynamic Fields -| Method | Type ID | Description | Use Case | -| ----------- | ------------- | ---------------------------------------------- | ------------------------------------- | -| `.varint()` | VAR_UINT32/64 | Variable-length encoding (1-5 or 1-10 bytes) | Values typically small | -| `.fixed()` | UINT32/64 | Fixed-size encoding (always 4 or 8 bytes) | Values uniformly distributed | -| `.tagged()` | TAGGED_UINT64 | Tagged hybrid encoding with size hint (uint64) | Mixed small and large values (uint64) | - -**Note:** `uint8_t` and `uint16_t` always use fixed encoding (UINT8, UINT16). - -### Complete Example +`std::optional` is nullable by default. Smart pointers may be marked nullable +or reference-tracked in the field spec: ```cpp -#include "fory/serialization/fory.h" - -using namespace fory::serialization; - -// Define struct with unsigned integer fields -struct MetricsData { - // Counters - often small values, use varint for space efficiency - uint32_t request_count; - uint64_t bytes_sent; - - // IDs - uniformly distributed, use fixed for consistent performance - uint32_t user_id; - uint64_t session_id; - - // Timestamps - use tagged encoding for mixed value ranges - uint64_t created_at; - - // Nullable fields - std::optional error_count; - std::optional last_access_time; +struct Node { + std::string name; + std::shared_ptr next; }; -FORY_STRUCT(MetricsData, request_count, bytes_sent, user_id, session_id, - created_at, error_count, last_access_time); - -// Configure field encoding -FORY_FIELD_CONFIG(MetricsData, - // Small counters - varint saves space - (request_count, fory::F(0).varint()), - (bytes_sent, fory::F(1).varint()), - - // IDs - fixed for consistent performance - (user_id, fory::F(2).fixed()), - (session_id, fory::F(3).fixed()), - - // Timestamp - tagged encoding - (created_at, fory::F(4).tagged()), - - // Nullable fields - (error_count, fory::F(5).nullable().varint()), - (last_access_time, fory::F(6).nullable().tagged()) -); - -int main() { - auto fory = Fory::builder().xlang(true).build(); - fory.register_struct(100); - - MetricsData data; - data.request_count = 42; - data.bytes_sent = 1024; - data.user_id = 12345678; - data.session_id = 9876543210; - data.created_at = 1704067200000000000ULL; // 2024-01-01 in nanoseconds - data.error_count = 3; - data.last_access_time = std::nullopt; - - auto bytes = fory.serialize(data).value(); - auto decoded = fory.deserialize(bytes).value(); -} +FORY_STRUCT(Node, name, (next, fory::F().nullable().ref())); ``` -### Cross-Language Compatibility - -When serializing data to be read by other languages, use `FORY_FIELD_CONFIG` to match their encoding expectations: - -**Java Compatibility:** +For polymorphic pointer fields, use `.dynamic(true)` to always write runtime +type information, `.dynamic(false)` to use the declared type directly, or omit +it to let Fory infer the behavior from the C++ type: ```cpp -// Java uses these type IDs for unsigned integers: -// - Byte (u8): UINT8 (fixed) -// - Short (u16): UINT16 (fixed) -// - Integer (u32): VAR_UINT32 (varint) or UINT32 (fixed) -// - Long (u64): VAR_UINT64 (varint), UINT64 (fixed), or TAGGED_UINT64 - -struct JavaCompatible { - uint8_t byte_field; // Maps to Java Byte - uint16_t short_field; // Maps to Java Short - uint32_t int_var_field; // Maps to Java Integer with varint - uint32_t int_fixed_field; // Maps to Java Integer with fixed - uint64_t long_var_field; // Maps to Java Long with varint - uint64_t long_tagged; // Maps to Java Long with tagged +struct Zoo { + std::shared_ptr star; + std::shared_ptr mascot; }; -FORY_STRUCT(JavaCompatible, byte_field, short_field, int_var_field, - int_fixed_field, long_var_field, long_tagged); - -FORY_FIELD_CONFIG(JavaCompatible, - (byte_field, fory::F(0)), // UINT8 (auto) - (short_field, fory::F(1)), // UINT16 (auto) - (int_var_field, fory::F(2).varint()), // VAR_UINT32 - (int_fixed_field, fory::F(3).fixed()), // UINT32 - (long_var_field, fory::F(4).varint()), // VAR_UINT64 - (long_tagged, fory::F(5).tagged()) // TAGGED_UINT64 -); +FORY_STRUCT(Zoo, (star, fory::F().nullable().dynamic(true)), + (mascot, fory::F().nullable().dynamic(false))); ``` -### Schema Evolution with FORY_FIELD_CONFIG +## Unions -In compatible mode, fields can have different nullability between sender and receiver: +`FORY_UNION` cases must use explicit ids. Name-mode `fory::F()` is invalid for +union metadata: ```cpp -// Version 1: All fields non-nullable -struct DataV1 { - uint32_t id; - uint64_t timestamp; -}; -FORY_STRUCT(DataV1, id, timestamp); -FORY_FIELD_CONFIG(DataV1, - (id, fory::F(0).varint()), - (timestamp, fory::F(1).tagged()) -); +struct Choice { + std::variant value; -// Version 2: Added nullable fields -struct DataV2 { - uint32_t id; - uint64_t timestamp; - std::optional version; // New nullable field + static Choice text(std::string value); + static Choice code(uint32_t value); }; -FORY_STRUCT(DataV2, id, timestamp, version); -FORY_FIELD_CONFIG(DataV2, - (id, fory::F(0).varint()), - (timestamp, fory::F(1).tagged()), - (version, fory::F(2).nullable().varint()) // New field with nullable -); -``` - -### FORY_FIELD_CONFIG Options Reference - -| Method | Description | Valid For | -| ----------------- | ------------------------------------------------ | ---------------------------------------------------- | -| `.nullable()` | Mark field as nullable | Smart pointers, primitives | -| `.ref()` | Enable reference tracking | `std::shared_ptr`, `fory::serialization::SharedWeak` | -| `.dynamic(true)` | Force type info to be written (dynamic dispatch) | Smart pointers | -| `.dynamic(false)` | skip type info (use declared type directly) | Smart pointers | -| `.varint()` | Use variable-length encoding | `uint32_t`, `uint64_t` | -| `.fixed()` | Use fixed-size encoding | `uint32_t`, `uint64_t` | -| `.tagged()` | Use tagged hybrid encoding | `uint64_t` only | -| `.compress(v)` | Enable/disable field compression | All types | - -## Default Values - -- **Nullable**: Only `std::optional` is nullable by default; all other types (including `std::shared_ptr`) are non-nullable -- **Ref tracking**: Enabled by default for `std::shared_ptr` and `fory::serialization::SharedWeak`, disabled for other types unless configured -You **need to configure fields** when: +FORY_UNION(Choice, (text, std::string, fory::F(1)), + (code, uint32_t, fory::F(2).fixed())); +``` -- A field can be null (use `std::optional` or mark with `nullable()`) -- A field needs reference tracking for shared/circular objects (use `ref()`) -- Integer types need specific encoding for cross-language compatibility -- You want to reduce metadata size (use field IDs) +Generated C++ may omit the explicit case type when it can infer the payload type +from a non-overloaded one-argument factory: ```cpp -// Xlang mode: explicit configuration required -struct User { - std::string name; // Non-nullable by default - std::optional email; // Nullable (std::optional) - std::shared_ptr friend_ptr; // Ref tracking by default -}; - -FORY_STRUCT(User, name, email, friend_ptr); - -FORY_FIELD_CONFIG(User, - (name, fory::F(0)), - (email, fory::F(1)), // nullable implicit for optional - (friend_ptr, fory::F(2).nullable().ref()) // explicit nullable + ref -); +FORY_UNION(GeneratedChoice, (text, fory::F(1)), + (code, fory::F(2).fixed())); ``` -### Default Values Summary - -| Type | Default Nullable | Default Ref Tracking | -| ------------------------------------ | ---------------- | -------------------- | -| Primitives, `string` | `false` | `false` | -| `std::optional` | `true` | `false` | -| `std::shared_ptr` | `false` | `true` | -| `fory::serialization::SharedWeak` | `false` | `true` | -| `std::unique_ptr` | `false` | `false` | - -## Related Topics - -- [Type Registration](type-registration.md) - Registering types with FORY_STRUCT -- [Schema Evolution](schema-evolution.md) - Using tag IDs for schema evolution -- [Configuration](configuration.md) - Enabling reference tracking globally -- [Cross-Language](cross-language.md) - Interoperability with Java, Rust, Python +The three-element form is the stable public form for handwritten code. diff --git a/docs/guide/cpp/polymorphism.md b/docs/guide/cpp/polymorphism.md index 97f5bad11d..4465553eff 100644 --- a/docs/guide/cpp/polymorphism.md +++ b/docs/guide/cpp/polymorphism.md @@ -137,7 +137,8 @@ struct Container2 { ## Controlling Dynamic Dispatch -Use `fory::dynamic` to override automatic polymorphism detection: +Use `fory::F().dynamic(V)` in `FORY_STRUCT` to override automatic +polymorphism detection: ```cpp struct Animal { @@ -150,23 +151,24 @@ struct Pet { std::shared_ptr animal1; // Force dynamic: type info written explicitly - fory::field, 0, fory::dynamic> animal2; + std::shared_ptr animal2; // Force non-dynamic: skip type info (faster but no runtime subtyping) - fory::field, 1, fory::dynamic> animal3; + std::shared_ptr animal3; }; -FORY_STRUCT(Pet, animal1, animal2, animal3); +FORY_STRUCT(Pet, animal1, (animal2, fory::F().dynamic(true)), + (animal3, fory::F().dynamic(false))); ``` -**When to use `fory::dynamic`:** +**When to use `dynamic(false)`:** - You know the runtime type will always match the declared type - Performance is critical and you don't need subtype support - Working with monomorphic data despite having a polymorphic base class -### Field Configuration Without Wrapper Types +### Field Configuration -Use `FORY_FIELD_CONFIG` to configure fields without `fory::field<>` wrapper: +Configure field metadata directly in `FORY_STRUCT`: ```cpp struct Zoo { @@ -174,17 +176,13 @@ struct Zoo { std::shared_ptr backup; // Nullable polymorphic field std::shared_ptr mascot; // Non-dynamic (no subtype dispatch) }; -FORY_STRUCT(Zoo, star, backup, mascot); - -// Configure fields with tag IDs and options -FORY_FIELD_CONFIG(Zoo, - (star, fory::F(0)), // Tag ID 0, default options - (backup, fory::F(1).nullable()), // Tag ID 1, allow nullptr - (mascot, fory::F(2).dynamic(false)) // Tag ID 2, disable polymorphism -); +FORY_STRUCT(Zoo, (star, fory::F(0)), + (backup, fory::F(1).nullable()), + (mascot, fory::F(2).dynamic(false))); ``` -See [Field Configuration](field-configuration.md) for complete details on `fory::nullable`, `fory::ref`, and other field-level options +See [Field Configuration](field-configuration.md) for complete details on +`nullable()`, `ref()`, and other field-level options. ## std::unique_ptr Polymorphism @@ -307,8 +305,8 @@ assert(!result.ok()); // Fails with depth exceeded error ## Nullability for Polymorphic Fields By default, `std::shared_ptr` and `std::unique_ptr` fields are treated as -non-nullable in the schema. To allow `nullptr`, wrap the field with -`fory::field<>` (or `FORY_FIELD_TAGS`) and opt in with `fory::nullable`. +non-nullable in the schema. To allow `nullptr`, mark the field nullable in +`FORY_STRUCT`. ```cpp struct Pet { @@ -316,9 +314,9 @@ struct Pet { std::shared_ptr primary; // Nullable via explicit field metadata - fory::field, 0, fory::nullable> optional; + std::shared_ptr optional; }; -FORY_STRUCT(Pet, primary, optional); +FORY_STRUCT(Pet, primary, (optional, fory::F().nullable())); ``` See [Field Configuration](field-configuration.md) for more details. @@ -415,10 +413,10 @@ auto fory = Fory::builder() auto fory = Fory::builder().max_dyn_depth(10).build(); ``` -7. **Use `fory::nullable`** for optional polymorphic fields: +7. **Use `nullable()`** for optional polymorphic fields: ```cpp - fory::field, 0, fory::nullable> optional_ptr; + FORY_STRUCT(Holder, (optional_ptr, fory::F().nullable())); ``` ## Error Handling @@ -455,10 +453,10 @@ if (!decoded_result.ok()) { **Optimization tips:** -1. **Use `fory::dynamic`** when runtime type matches declared type: +1. **Use `dynamic(false)`** when runtime type matches declared type: ```cpp - fory::field, 0, fory::dynamic> fixed_type; + FORY_STRUCT(Holder, (fixed_type, fory::F().dynamic(false))); ``` 2. **Minimize nesting depth** to reduce metadata overhead diff --git a/docs/guide/xlang/field-nullability.md b/docs/guide/xlang/field-nullability.md index ab888a5630..de7f9dc2b4 100644 --- a/docs/guide/xlang/field-nullability.md +++ b/docs/guide/xlang/field-nullability.md @@ -200,17 +200,32 @@ public class Config { } ``` -### C++: fory::field Wrapper +### C++: FORY_STRUCT Field Config ```cpp struct Config { - // Explicitly mark as nullable - fory::field> optional_setting; + std::optional optional_setting; + std::string required_setting; +}; + +FORY_STRUCT(Config, + (optional_setting, fory::F(1)), + (required_setting, fory::F(2)) +); +``` - // Explicitly mark as non-nullable (default) - fory::field> required_setting; +For nullable pointer carriers, opt in with `.nullable()`: + +```cpp +struct ConfigRef { + std::shared_ptr optional_setting; + std::shared_ptr required_setting; }; -FORY_STRUCT(Config, optional_setting, required_setting); + +FORY_STRUCT(ConfigRef, + (optional_setting, fory::F(1).nullable()), + (required_setting, fory::F(2)) +); ``` ## Null Value Handling diff --git a/docs/guide/xlang/field-reference-tracking.md b/docs/guide/xlang/field-reference-tracking.md index 1ed94bd3d5..2aafbf2ee0 100644 --- a/docs/guide/xlang/field-reference-tracking.md +++ b/docs/guide/xlang/field-reference-tracking.md @@ -141,7 +141,7 @@ public class Document { } ``` -#### C++: fory::field Wrapper +#### C++: FORY_STRUCT Field Config ```cpp struct Document { @@ -151,10 +151,14 @@ struct Document { std::shared_ptr author; fory::serialization::SharedWeak data; - // Explicitly mark ref tracking when using field wrappers (optional) - fory::field, 1, fory::ref> tag_owner; + std::shared_ptr tag_owner; }; -FORY_STRUCT(Document, title, author, data, tag_owner); +FORY_STRUCT(Document, + title, + author, + data, + (tag_owner, fory::F().ref()) +); ``` To disable reference tracking for C++ entirely, set diff --git a/docs/guide/xlang/field-type-meta.md b/docs/guide/xlang/field-type-meta.md index 1c6880c857..58870fd36d 100644 --- a/docs/guide/xlang/field-type-meta.md +++ b/docs/guide/xlang/field-type-meta.md @@ -85,9 +85,7 @@ public class Container { ### C++ -C++ uses the `fory::dynamic` template tag or `.dynamic(bool)` builder method: - -**Using `fory::field<>` template**: +C++ uses the `.dynamic(bool)` builder method inside `FORY_STRUCT`: ```cpp #include "fory/serialization/fory.h" @@ -100,29 +98,15 @@ struct Animal { struct Zoo { // Auto: type info written because Animal is polymorphic (std::is_polymorphic) - fory::field, 0, fory::nullable> animal; + std::shared_ptr animal; // Force non-dynamic: skip type info even though Animal is polymorphic - fory::field, 1, fory::nullable, fory::dynamic> fixed_animal; + std::shared_ptr fixed_animal; // Force dynamic: write type info even for non-polymorphic types - fory::field, 2, fory::dynamic> polymorphic_data; -}; -FORY_STRUCT(Zoo, animal, fixed_animal, polymorphic_data); -``` - -**Using `FORY_FIELD_CONFIG` macro**: - -```cpp -struct Zoo { - std::shared_ptr animal; - std::shared_ptr fixed_animal; std::shared_ptr polymorphic_data; }; - -FORY_STRUCT(Zoo, animal, fixed_animal, polymorphic_data); - -FORY_FIELD_CONFIG(Zoo, +FORY_STRUCT(Zoo, (animal, fory::F(0).nullable()), // Auto-detect polymorphism (fixed_animal, fory::F(1).nullable().dynamic(false)), // Skip type info (polymorphic_data, fory::F(2).dynamic(true)) // Force type info @@ -286,9 +270,7 @@ struct Zoo { std::shared_ptr maybe_mixed_breed; }; -FORY_STRUCT(Zoo, animal, maybe_mixed_breed); - -FORY_FIELD_CONFIG(Zoo, +FORY_STRUCT(Zoo, (animal, fory::F(0).nullable()), // Auto-detect (Animal is polymorphic) (maybe_mixed_breed, fory::F(1).dynamic(true)) // Force dynamic for concrete type ); diff --git a/java/fory-core/src/test/java/org/apache/fory/xlang/CPPXlangTest.java b/java/fory-core/src/test/java/org/apache/fory/xlang/CPPXlangTest.java index 8a02157aec..c1f320d8a9 100644 --- a/java/fory-core/src/test/java/org/apache/fory/xlang/CPPXlangTest.java +++ b/java/fory-core/src/test/java/org/apache/fory/xlang/CPPXlangTest.java @@ -210,6 +210,18 @@ public void testStructWithMap(boolean enableCodegen) throws java.io.IOException super.testStructWithMap(enableCodegen); } + @Test(groups = "xlang", dataProvider = "enableCodegenParallel") + public void testNestedAnnotatedContainerSchemaConsistent(boolean enableCodegen) + throws java.io.IOException { + super.testNestedAnnotatedContainerSchemaConsistent(enableCodegen); + } + + @Test(groups = "xlang", dataProvider = "enableCodegenParallel") + public void testNestedAnnotatedContainerCompatible(boolean enableCodegen) + throws java.io.IOException { + super.testNestedAnnotatedContainerCompatible(enableCodegen); + } + @Test(groups = "xlang", dataProvider = "enableCodegenParallel") public void testCollectionElementRefOverride(boolean enableCodegen) throws java.io.IOException { super.testCollectionElementRefOverride(enableCodegen); From ba018641e726833c9f575df33b1e17432cf827cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=85=95=E7=99=BD?= Date: Wed, 29 Apr 2026 19:26:58 +0800 Subject: [PATCH 2/8] ci: run python jobs for cpp changes --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index adfd5b080f..3a5b8db11a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -999,7 +999,7 @@ jobs: python: name: Python CI needs: changes - if: needs.changes.outputs.python == 'true' + if: needs.changes.outputs.python == 'true' || needs.changes.outputs.cpp == 'true' runs-on: ${{ matrix.os }} strategy: matrix: @@ -1039,7 +1039,7 @@ jobs: python_windows: name: Python CI (${{ matrix.python-version }}, windows-2022) needs: changes - if: needs.changes.outputs.python == 'true' + if: needs.changes.outputs.python == 'true' || needs.changes.outputs.cpp == 'true' runs-on: windows-2022 strategy: matrix: From cd85d0279e1962394dd702cb7f8d909bb7831b43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=85=95=E7=99=BD?= Date: Wed, 29 Apr 2026 19:38:08 +0800 Subject: [PATCH 3/8] docs(cpp): keep advanced field specs out of readmes --- README.md | 6 ------ cpp/README.md | 22 +--------------------- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/README.md b/README.md index 6f0eb39d64..f22583a902 100644 --- a/README.md +++ b/README.md @@ -358,12 +358,6 @@ struct Person { }; FORY_STRUCT(Person, name, age); -struct Event { - uint32_t id; - uint64_t timestamp; -}; -FORY_STRUCT(Event, (id, fory::F(0).varint()), (timestamp, fory::F(1).tagged())); - int main() { // Create Fory instance - should be reused across serializations auto fory = Fory::builder().build(); diff --git a/cpp/README.md b/cpp/README.md index e6c6bfc512..a26dd27d09 100644 --- a/cpp/README.md +++ b/cpp/README.md @@ -150,27 +150,7 @@ auto fory = apache::fory::ForyBuilder().build(); fory->register_struct(1); ``` -### 1.2 Field Configuration - -`FORY_STRUCT` accepts bare fields or configured `(field, fory::F(...))` entries. -Use `fory::F()` for name-mode fields and `fory::F(id)` when stable field ids are -required. A struct must use one identity mode consistently. - -```cpp -namespace T = fory::T; - -struct Event { - uint32_t id; - uint64_t timestamp; - std::map> values; -}; - -FORY_STRUCT(Event, (id, fory::F(0).varint()), - (timestamp, fory::F(1).tagged()), - (values, fory::F(2).map(T::fixed(), T::list(T::tagged())))); -``` - -### 1.3 Inherited Fields +### 1.2 Inherited Fields To include base-class fields in a derived type, use `FORY_BASE(Base)` inside `FORY_STRUCT`. The base must define its own `FORY_STRUCT` so its fields can be From 4a1cf0723457105ce46f60f9bc8ab876648bfc6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=85=95=E7=99=BD?= Date: Wed, 29 Apr 2026 20:07:49 +0800 Subject: [PATCH 4/8] fix(cpp): align generated field metadata --- .../frontend/proto/translator.py | 1 + compiler/fory_compiler/generators/cpp.py | 52 ++++-- .../tests/test_generated_code.py | 6 +- cpp/fory/meta/field_info.h | 1 + .../serialization/collection_serializer.h | 3 +- cpp/fory/serialization/struct_serializer.h | 174 ++++++++++++++++-- cpp/fory/serialization/type_resolver.h | 29 ++- cpp/fory/serialization/union_serializer.h | 76 +++++++- 8 files changed, 295 insertions(+), 47 deletions(-) diff --git a/compiler/fory_compiler/frontend/proto/translator.py b/compiler/fory_compiler/frontend/proto/translator.py index 0bbebe8a0e..f3f4537211 100644 --- a/compiler/fory_compiler/frontend/proto/translator.py +++ b/compiler/fory_compiler/frontend/proto/translator.py @@ -297,6 +297,7 @@ def _translate_oneof_field_reference( oneof_type_name, location=self._location(oneof.line, oneof.column) ), number=first_case.number, + tag_id=first_case.number, optional=True, ref=False, options={}, diff --git a/compiler/fory_compiler/generators/cpp.py b/compiler/fory_compiler/generators/cpp.py index bb278f23d2..66605d9731 100644 --- a/compiler/fory_compiler/generators/cpp.py +++ b/compiler/fory_compiler/generators/cpp.py @@ -1542,11 +1542,11 @@ def get_field_meta(self, field: Field) -> str: if field.optional or field.ref: meta += f".inner({spec})" elif spec.startswith("fory::T::list("): - meta += f".list({spec[len('fory::T::list('):-1]})" + meta += f".list({spec[len('fory::T::list(') : -1]})" elif spec.startswith("fory::T::set("): - meta += f".set({spec[len('fory::T::set('):-1]})" + meta += f".set({spec[len('fory::T::set(') : -1]})" elif spec.startswith("fory::T::map("): - meta += f".map({spec[len('fory::T::map('):-1]})" + meta += f".map({spec[len('fory::T::map(') : -1]})" elif spec.endswith(".fixed()"): meta += ".fixed()" elif spec.endswith(".varint()"): @@ -1571,11 +1571,11 @@ def get_union_field_meta(self, field: Field) -> str: if field.optional or field.ref: meta += f".inner({spec})" elif spec.startswith("fory::T::list("): - meta += f".list({spec[len('fory::T::list('):-1]})" + meta += f".list({spec[len('fory::T::list(') : -1]})" elif spec.startswith("fory::T::set("): - meta += f".set({spec[len('fory::T::set('):-1]})" + meta += f".set({spec[len('fory::T::set(') : -1]})" elif spec.startswith("fory::T::map("): - meta += f".map({spec[len('fory::T::map('):-1]})" + meta += f".map({spec[len('fory::T::map(') : -1]})" elif spec.endswith(".fixed()"): meta += ".fixed()" elif spec.endswith(".varint()"): @@ -1602,26 +1602,38 @@ def get_type_spec( if isinstance(field_type, PrimitiveType): spec = self.get_primitive_type_spec(field_type.kind) elif isinstance(field_type, ListType): - element = self.get_type_spec( - field_type.element_type, - field_type.element_optional, - field_type.element_ref, - ) - if not element: - element = "fory::FieldNodeSpec{}" - spec = f"fory::T::list({element})" + if ( + isinstance(field_type.element_type, PrimitiveType) + and not field_type.element_optional + and not field_type.element_ref + and field_type.element_type.kind + not in (PrimitiveKind.INT8, PrimitiveKind.UINT8) + ): + spec = "" + else: + element = self.get_type_spec( + field_type.element_type, + field_type.element_optional, + field_type.element_ref, + ) + if not element: + element = "fory::FieldNodeSpec{}" + spec = f"fory::T::list({element})" elif isinstance(field_type, MapType): key = self.get_type_spec(field_type.key_type) - value = self.get_type_spec( + element = self.get_type_spec( field_type.value_type, field_type.value_optional, field_type.value_ref, ) - if not key: - key = "fory::FieldNodeSpec{}" - if not value: - value = "fory::FieldNodeSpec{}" - spec = f"fory::T::map({key}, {value})" + if key or element: + if not key: + key = "fory::FieldNodeSpec{}" + if not element: + element = "fory::FieldNodeSpec{}" + spec = f"fory::T::map({key}, {element})" + else: + spec = "" else: spec = "" diff --git a/compiler/fory_compiler/tests/test_generated_code.py b/compiler/fory_compiler/tests/test_generated_code.py index 7539c9acf9..7b1510e886 100644 --- a/compiler/fory_compiler/tests/test_generated_code.py +++ b/compiler/fory_compiler/tests/test_generated_code.py @@ -86,9 +86,9 @@ def assert_language_outputs_equal( baseline_label = label baseline_files = files continue - assert ( - files == baseline_files - ), f"{generator_cls.language_name} output mismatch for {label} vs {baseline_label}" + assert files == baseline_files, ( + f"{generator_cls.language_name} output mismatch for {label} vs {baseline_label}" + ) def assert_all_languages_equal(schemas: Dict[str, Schema]) -> None: diff --git a/cpp/fory/meta/field_info.h b/cpp/fory/meta/field_info.h index 290e252ee4..b5476b5593 100644 --- a/cpp/fory/meta/field_info.h +++ b/cpp/fory/meta/field_info.h @@ -22,6 +22,7 @@ #include "fory/meta/preprocessor.h" #include "fory/meta/type_traits.h" #include +#include #include #include #include diff --git a/cpp/fory/serialization/collection_serializer.h b/cpp/fory/serialization/collection_serializer.h index 0dadca10f3..dfbd74478a 100644 --- a/cpp/fory/serialization/collection_serializer.h +++ b/cpp/fory/serialization/collection_serializer.h @@ -631,7 +631,8 @@ struct Serializer< if (total_bytes_u32 % sizeof(T) != 0) { ctx.set_error(Error::invalid_data( - "Vector byte size not aligned with element size")); + "Vector byte size " + std::to_string(total_bytes_u32) + + " not aligned with element size " + std::to_string(sizeof(T)))); return std::vector(); } std::vector result(elem_count); diff --git a/cpp/fory/serialization/struct_serializer.h b/cpp/fory/serialization/struct_serializer.h index 6349ce116d..34cc5af752 100644 --- a/cpp/fory/serialization/struct_serializer.h +++ b/cpp/fory/serialization/struct_serializer.h @@ -562,6 +562,143 @@ constexpr int8_t configured_node_child() { } } +template +constexpr bool configured_vector_primitive_array_spec() { + if constexpr (!is_vector_v) { + return false; + } else { + using Element = element_type_t; + if constexpr (!std::is_same_v, int8_t> && + !std::is_same_v, uint8_t>) { + return false; + } else { + constexpr FieldNodeKind kind = + configured_node_kind(); + constexpr int8_t child = + configured_node_child(); + if constexpr (kind != FieldNodeKind::List || child < 0) { + return false; + } else if constexpr (configured_node_kind() != + FieldNodeKind::Scalar || + configured_node_encoding() != + Encoding::Default) { + return false; + } else if constexpr (std::is_same_v, int8_t>) { + return configured_node_scalar() == + FieldScalarKind::Int8; + } else { + return configured_node_scalar() == + FieldScalarKind::UInt8; + } + } + } +} + +template +constexpr uint32_t configured_vector_primitive_array_type_id() { + if constexpr (!configured_vector_primitive_array_spec()) { + return 0; + } else { + using Element = element_type_t; + if constexpr (std::is_same_v, int8_t>) { + return static_cast(TypeId::INT8_ARRAY); + } else { + return static_cast(TypeId::UINT8_ARRAY); + } + } +} + +template +constexpr uint32_t configured_scalar_type_id() { + constexpr Encoding enc = + configured_node_encoding(); + using Decayed = decay_t; + if constexpr (std::is_same_v) { + return static_cast(TypeId::BOOL); + } else if constexpr (std::is_same_v) { + return static_cast(TypeId::INT8); + } else if constexpr (std::is_same_v) { + return static_cast(TypeId::UINT8); + } else if constexpr (std::is_same_v) { + return static_cast(TypeId::INT16); + } else if constexpr (std::is_same_v) { + return static_cast(TypeId::UINT16); + } else if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (enc == Encoding::Fixed) { + return static_cast(TypeId::INT32); + } + return static_cast(TypeId::VARINT32); + } else if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (enc == Encoding::Varint) { + return static_cast(TypeId::VAR_UINT32); + } + return static_cast(TypeId::UINT32); + } else if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (enc == Encoding::Fixed) { + return static_cast(TypeId::INT64); + } else if constexpr (enc == Encoding::Tagged) { + return static_cast(TypeId::TAGGED_INT64); + } + return static_cast(TypeId::VARINT64); + } else if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (enc == Encoding::Varint) { + return static_cast(TypeId::VAR_UINT64); + } else if constexpr (enc == Encoding::Tagged) { + return static_cast(TypeId::TAGGED_UINT64); + } + return static_cast(TypeId::UINT64); + } else if constexpr (std::is_same_v) { + return static_cast(TypeId::FLOAT16); + } else if constexpr (std::is_same_v) { + return static_cast(TypeId::BFLOAT16); + } else if constexpr (std::is_same_v) { + return static_cast(TypeId::FLOAT32); + } else if constexpr (std::is_same_v) { + return static_cast(TypeId::FLOAT64); + } else if constexpr (std::is_same_v) { + return static_cast(TypeId::STRING); + } + return 0; +} + +template +constexpr uint32_t configured_effective_type_id() { + constexpr FieldNodeKind kind = + configured_node_kind(); + if constexpr (is_optional_v) { + using Inner = typename decay_t::value_type; + constexpr int8_t child = + kind == FieldNodeKind::Inner + ? configured_node_child() + : NodeIndex; + return configured_effective_type_id(); + } else { + constexpr uint32_t vector_array_tid = + configured_vector_primitive_array_type_id(); + if constexpr (vector_array_tid != 0) { + return vector_array_tid; + } else if constexpr (kind == FieldNodeKind::List) { + return static_cast(TypeId::LIST); + } else if constexpr (kind == FieldNodeKind::Set) { + return static_cast(TypeId::SET); + } else if constexpr (kind == FieldNodeKind::Map) { + return static_cast(TypeId::MAP); + } else if constexpr (kind == FieldNodeKind::Scalar || + configured_node_encoding() != + Encoding::Default) { + return configured_scalar_type_id(); + } + return 0; + } +} + template FORY_ALWAYS_INLINE void write_configured_scalar(const FieldType &value, WriteContext &ctx) { @@ -835,11 +972,16 @@ void write_configured_value(const ValueType &value, WriteContext &ctx, is_deque_v || is_set_like_v) && (kind == FieldNodeKind::List || kind == FieldNodeKind::Set)) { - write_not_null_ref_flag(ctx, ref_mode); - constexpr int8_t child = - configured_node_child(); - write_configured_list_data( - value, ctx); + if constexpr (configured_vector_primitive_array_spec()) { + Serializer::write(value, ctx, ref_mode, false, has_generics); + } else { + write_not_null_ref_flag(ctx, ref_mode); + constexpr int8_t child = + configured_node_child(); + write_configured_list_data( + value, ctx); + } } else if constexpr (is_map_like_v && kind == FieldNodeKind::Map) { write_not_null_ref_flag(ctx, ref_mode); constexpr int8_t key_child = @@ -884,13 +1026,18 @@ ValueType read_configured_value(ReadContext &ctx, RefMode ref_mode, is_deque_v || is_set_like_v) && (kind == FieldNodeKind::List || kind == FieldNodeKind::Set)) { - if (!read_null_only_flag(ctx, ref_mode)) { - return ValueType{}; + if constexpr (configured_vector_primitive_array_spec()) { + return Serializer::read(ctx, ref_mode, false); + } else { + if (!read_null_only_flag(ctx, ref_mode)) { + return ValueType{}; + } + constexpr int8_t child = + configured_node_child(); + return read_configured_list_data(ctx); } - constexpr int8_t child = - configured_node_child(); - return read_configured_list_data(ctx); } else if constexpr (is_map_like_v && kind == FieldNodeKind::Map) { if (!read_null_only_flag(ctx, ref_mode)) { return ValueType{}; @@ -982,6 +1129,11 @@ template struct CompileTimeFieldHelpers { using FieldType = unwrap_field_t; if constexpr (::fory::detail::has_field_config_v) { + constexpr uint32_t effective_tid = + configured_effective_type_id(); + if constexpr (effective_tid != 0) { + return effective_tid; + } constexpr uint32_t unsigned_tid = compute_unsigned_type_id(); if constexpr (unsigned_tid != 0) { diff --git a/cpp/fory/serialization/type_resolver.h b/cpp/fory/serialization/type_resolver.h index 11676f2633..58a1e1469c 100644 --- a/cpp/fory/serialization/type_resolver.h +++ b/cpp/fory/serialization/type_resolver.h @@ -524,6 +524,29 @@ inline bool field_node_has_override(const FieldNodeSpec &spec, spec.scalar_[node_index] != FieldScalarKind::Inferred); } +template +TypeId vector_type_id_for_spec(const FieldNodeSpec &spec, int8_t node_index, + TypeId default_type_id) { + if (node_index < 0 || spec.kind_[node_index] != FieldNodeKind::List) { + return default_type_id; + } + const int8_t child = spec.child0_[node_index]; + if (child < 0 || spec.kind_[child] != FieldNodeKind::Scalar || + spec.encoding_[child] != Encoding::Default) { + return TypeId::LIST; + } + if constexpr (std::is_same_v, int8_t>) { + if (spec.scalar_[child] == FieldScalarKind::Int8) { + return TypeId::INT8_ARRAY; + } + } else if constexpr (std::is_same_v, uint8_t>) { + if (spec.scalar_[child] == FieldScalarKind::UInt8) { + return TypeId::UINT8_ARRAY; + } + } + return TypeId::LIST; +} + template void apply_integer_encoding(FieldType &ft, const FieldNodeSpec &spec, int8_t node_index) { @@ -614,7 +637,8 @@ FieldType build_field_type_with_spec(bool nullable, const FieldNodeSpec &spec, using Element = element_type_t; constexpr TypeId default_type_id = Serializer::type_id; const bool force_list = node_kind == FieldNodeKind::List; - const TypeId type_id = force_list ? TypeId::LIST : default_type_id; + const TypeId type_id = + vector_type_id_for_spec(spec, node_index, default_type_id); if (type_id == TypeId::LIST) { const int8_t child = force_list ? spec.child0_[node_index] : -1; FieldType elem = @@ -879,7 +903,8 @@ build_field_type_with_resolver_and_spec(TypeResolver &resolver, bool nullable, using Element = element_type_t; constexpr TypeId default_type_id = Serializer::type_id; const bool force_list = node_kind == FieldNodeKind::List; - const TypeId type_id = force_list ? TypeId::LIST : default_type_id; + const TypeId type_id = + vector_type_id_for_spec(spec, node_index, default_type_id); if (type_id == TypeId::LIST) { const int8_t child = force_list ? spec.child0_[node_index] : -1; FORY_TRY(elem, (field_node_has_override(spec, child) diff --git a/cpp/fory/serialization/union_serializer.h b/cpp/fory/serialization/union_serializer.h index 7099568d48..763b87eead 100644 --- a/cpp/fory/serialization/union_serializer.h +++ b/cpp/fory/serialization/union_serializer.h @@ -218,6 +218,36 @@ constexpr int8_t union_node_child() { } } +template +constexpr bool union_vector_primitive_array_spec() { + if constexpr (!is_vector_v) { + return false; + } else { + using Element = element_type_t; + if constexpr (!std::is_same_v, int8_t> && + !std::is_same_v, uint8_t>) { + return false; + } else { + constexpr FieldNodeKind kind = union_node_kind(); + constexpr int8_t child = union_node_child(); + if constexpr (kind != FieldNodeKind::List || child < 0) { + return false; + } else if constexpr (union_node_kind() != + FieldNodeKind::Scalar || + union_node_encoding() != + Encoding::Default) { + return false; + } else if constexpr (std::is_same_v, int8_t>) { + return union_node_scalar() == + FieldScalarKind::Int8; + } else { + return union_node_scalar() == + FieldScalarKind::UInt8; + } + } + } +} + template constexpr uint32_t resolve_union_type_id(const ::fory::FieldMeta &meta) { if (meta.type_id_override_ >= 0) { @@ -261,6 +291,21 @@ constexpr uint32_t resolve_union_type_id(const ::fory::FieldMeta &meta) { return static_cast(Serializer::type_id); } +template +constexpr uint32_t +resolve_union_type_id_for_spec(const ::fory::FieldMeta &meta) { + using Inner = union_unwrap_optional_inner_t; + if constexpr (union_vector_primitive_array_spec()) { + using Element = element_type_t; + if constexpr (std::is_same_v, int8_t>) { + return static_cast(TypeId::INT8_ARRAY); + } else { + return static_cast(TypeId::UINT8_ARRAY); + } + } + return resolve_union_type_id(meta); +} + template constexpr bool needs_manual_encoding(const ::fory::FieldMeta &meta) { if (meta.type_id_override_ >= 0 || @@ -542,10 +587,15 @@ void write_union_configured_value(const ValueType &value, WriteContext &ctx, is_deque_v || is_set_like_v) && (kind == FieldNodeKind::List || kind == FieldNodeKind::Set)) { - write_not_null_ref_flag(ctx, ref_mode); - constexpr int8_t child = union_node_child(); - write_union_configured_list_data(value, - ctx); + if constexpr (union_vector_primitive_array_spec()) { + Serializer::write(value, ctx, ref_mode, false, has_generics); + } else { + write_not_null_ref_flag(ctx, ref_mode); + constexpr int8_t child = union_node_child(); + write_union_configured_list_data(value, + ctx); + } } else if constexpr (is_map_like_v && kind == FieldNodeKind::Map) { write_not_null_ref_flag(ctx, ref_mode); constexpr int8_t key_child = union_node_child(); @@ -590,11 +640,17 @@ ValueType read_union_configured_value(ReadContext &ctx, RefMode ref_mode, is_deque_v || is_set_like_v) && (kind == FieldNodeKind::List || kind == FieldNodeKind::Set)) { - if (!read_null_only_flag(ctx, ref_mode)) { - return ValueType{}; + if constexpr (union_vector_primitive_array_spec()) { + return Serializer::read(ctx, ref_mode, false); + } else { + if (!read_null_only_flag(ctx, ref_mode)) { + return ValueType{}; + } + constexpr int8_t child = union_node_child(); + return read_union_configured_list_data( + ctx); } - constexpr int8_t child = union_node_child(); - return read_union_configured_list_data(ctx); } else if constexpr (is_map_like_v && kind == FieldNodeKind::Map) { if (!read_null_only_flag(ctx, ref_mode)) { return ValueType{}; @@ -872,7 +928,7 @@ struct Serializer>> { detail::UnionInfo::template Meta::value; using SpecProvider = detail::UnionCaseSpecProvider; constexpr uint32_t field_type_id = - detail::resolve_union_type_id(meta); + detail::resolve_union_type_id_for_spec(meta); constexpr bool configured = detail::union_node_has_override(); const bool manual = @@ -962,7 +1018,7 @@ struct Serializer>> { detail::UnionInfo::template Meta::value; using SpecProvider = detail::UnionCaseSpecProvider; constexpr uint32_t field_type_id = - detail::resolve_union_type_id(meta); + detail::resolve_union_type_id_for_spec(meta); constexpr bool configured = detail::union_node_has_override(); const bool manual = From 73512196fdad80b9c9d6e35719839738d1166970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=85=95=E7=99=BD?= Date: Wed, 29 Apr 2026 20:16:47 +0800 Subject: [PATCH 5/8] fix(cpp): avoid msvc constexpr capture in unions --- cpp/fory/serialization/union_serializer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/fory/serialization/union_serializer.h b/cpp/fory/serialization/union_serializer.h index 763b87eead..f1460b4a84 100644 --- a/cpp/fory/serialization/union_serializer.h +++ b/cpp/fory/serialization/union_serializer.h @@ -947,7 +947,7 @@ struct Serializer>> { return; } ctx.write_uint8(static_cast(field_type_id)); - if constexpr (configured) { + if constexpr (detail::union_node_has_override()) { detail::write_union_configured_value( value, ctx, RefMode::None, false, true); } else { @@ -1051,7 +1051,7 @@ struct Serializer>> { return; } CaseT value = [&]() { - if constexpr (configured) { + if constexpr (detail::union_node_has_override()) { return detail::read_union_configured_value( ctx, RefMode::None, false); } else { From 2b8c591e41e5e05e73567f81c60762d99200dad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=85=95=E7=99=BD?= Date: Wed, 29 Apr 2026 20:52:39 +0800 Subject: [PATCH 6/8] fix(cpp): detect namespace field configs --- cpp/fory/meta/field.h | 20 ++++++++++++++++++++ cpp/fory/meta/field_test.cc | 23 +++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/cpp/fory/meta/field.h b/cpp/fory/meta/field.h index 4c80b5a08c..faad1c2e77 100644 --- a/cpp/fory/meta/field.h +++ b/cpp/fory/meta/field.h @@ -70,6 +70,10 @@ template using MemberFieldConfigDescriptor = decltype(T::fory_field_config(std::declval>())); +template +using AdlFieldConfigDescriptor = + decltype(fory_field_config(std::declval>())); + template struct HasMemberFieldConfig : std::false_type {}; @@ -77,6 +81,13 @@ template struct HasMemberFieldConfig>> : std::true_type {}; +template +struct HasAdlFieldConfig : std::false_type {}; + +template +struct HasAdlFieldConfig>> + : std::true_type {}; + template struct FieldConfigInfo { static constexpr bool has_config = false; static constexpr size_t field_count = 0; @@ -91,6 +102,15 @@ struct FieldConfigInfo::value>> { static inline constexpr auto entries = Descriptor::entries; }; +template +struct FieldConfigInfo::value && + HasAdlFieldConfig::value>> { + using Descriptor = AdlFieldConfigDescriptor; + static constexpr bool has_config = Descriptor::has_config; + static constexpr size_t field_count = Descriptor::field_count; + static inline constexpr auto entries = Descriptor::entries; +}; + template inline constexpr bool has_field_config_v = FieldConfigInfo::has_config; diff --git a/cpp/fory/meta/field_test.cc b/cpp/fory/meta/field_test.cc index 2e756e192d..24285a133b 100644 --- a/cpp/fory/meta/field_test.cc +++ b/cpp/fory/meta/field_test.cc @@ -95,6 +95,14 @@ struct IdModeStruct { (values, fory::F(1).map(T::varint(), T::list(T::tagged())))); }; +struct NamespaceConfigStruct { + uint32_t id; + uint64_t timestamp; +}; + +FORY_STRUCT(NamespaceConfigStruct, (id, fory::F(3).varint()), + (timestamp, fory::F(4).tagged())); + TEST(FieldConfig, NameModeEntries) { static_assert(detail::has_field_config_v); static_assert(!detail::GetFieldConfigEntry::has_id); @@ -115,4 +123,19 @@ TEST(FieldConfig, IdModeEntries) { FieldNodeKind::Map); } +TEST(FieldConfig, NamespaceScopeEntries) { + static_assert(detail::has_field_config_v); + static_assert( + detail::GetFieldConfigEntry::has_entry); + static_assert(detail::GetFieldConfigEntry::has_id); + static_assert(detail::GetFieldConfigEntry::id == 3); + static_assert( + detail::GetFieldConfigEntry::encoding == + Encoding::Varint); + static_assert(detail::GetFieldConfigEntry::has_id); + static_assert(detail::GetFieldConfigEntry::id == 4); + static_assert(detail::GetFieldConfigEntry::spec + .encoding_[0] == Encoding::Tagged); +} + } // namespace fory::test From ed60f2f5df7c60f206ce9cbe5ca5b901d1271f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=85=95=E7=99=BD?= Date: Wed, 29 Apr 2026 21:11:03 +0800 Subject: [PATCH 7/8] fix(cpp): cache field type compatibility fingerprints --- cpp/fory/serialization/skip.cc | 10 +- cpp/fory/serialization/struct_serializer.h | 29 ++-- cpp/fory/serialization/struct_test.cc | 78 +++++++++ cpp/fory/serialization/type_resolver.cc | 104 ++++-------- cpp/fory/serialization/type_resolver.h | 182 +++++++++++++++------ cpp/fory/serialization/union_serializer.h | 2 +- 6 files changed, 265 insertions(+), 140 deletions(-) diff --git a/cpp/fory/serialization/skip.cc b/cpp/fory/serialization/skip.cc index 9835e0b453..d146c93953 100644 --- a/cpp/fory/serialization/skip.cc +++ b/cpp/fory/serialization/skip.cc @@ -82,7 +82,7 @@ void skip_list(ReadContext &ctx, const FieldType &field_type) { elem_type = field_type.generics[0]; } else { // Unknown element type, need to read type info for each element - elem_type.type_id = 0; // Unknown + elem_type.set_type_id(0); // Unknown elem_type.nullable = false; } @@ -135,8 +135,8 @@ void skip_map(ReadContext &ctx, const FieldType &field_type) { value_type = field_type.generics[1]; } else { // Unknown types - key_type.type_id = 0; - value_type.type_id = 0; + key_type.set_type_id(0); + value_type.set_type_id(0); } uint64_t read_count = 0; @@ -423,7 +423,7 @@ void skip_unknown(ReadContext &ctx) { // For non-struct types (primitives, arrays, maps, etc.), // recursively call skip_field_value with the actual type FieldType actual_field_type; - actual_field_type.type_id = type_info->type_id; + actual_field_type.set_type_id(type_info->type_id); actual_field_type.nullable = false; skip_field_value(ctx, actual_field_type, RefMode::None); return; @@ -469,7 +469,7 @@ void skip_union(ReadContext &ctx) { // skip the alternative's value FieldType alt_field_type; - alt_field_type.type_id = type_info->type_id; + alt_field_type.set_type_id(type_info->type_id); alt_field_type.nullable = false; skip_field_value(ctx, alt_field_type, RefMode::None); } diff --git a/cpp/fory/serialization/struct_serializer.h b/cpp/fory/serialization/struct_serializer.h index 34cc5af752..88a6de6d23 100644 --- a/cpp/fory/serialization/struct_serializer.h +++ b/cpp/fory/serialization/struct_serializer.h @@ -3004,11 +3004,10 @@ void read_single_field_by_index(T &obj, ReadContext &ctx) { /// Helper to read a single field by index in compatible mode using /// remote field metadata to decide reference flag presence. -/// @param remote_type_id The type_id from the remote schema (for encoding) +/// @param remote_field_type The field type tree from the remote schema. template void read_single_field_by_index_compatible(T &obj, ReadContext &ctx, - RefMode remote_ref_mode, - uint32_t remote_type_id) { + const FieldType &remote_field_type) { using Helpers = CompileTimeFieldHelpers; const auto field_info = fory_field_info(obj); const auto &field_ptrs = decltype(field_info)::ptrs_ref(); @@ -3016,6 +3015,8 @@ void read_single_field_by_index_compatible(T &obj, ReadContext &ctx, using RawFieldType = typename meta::RemoveMemberPointerCVRefT; using FieldType = unwrap_field_t; + const RefMode remote_ref_mode = remote_field_type.ref_mode; + const uint32_t remote_type_id = remote_field_type.type_id; constexpr TypeId field_type_id = Serializer::type_id; // Check if field is a struct type - use type_id to handle shared_ptr @@ -3158,11 +3159,13 @@ void read_single_field_by_index_compatible(T &obj, ReadContext &ctx, /// Helper to dispatch field reading by field_id in compatible mode. /// Uses fold expression with short-circuit to avoid lambda overhead. /// Sets handled=true if field was matched. -/// @param remote_type_id The type_id from the remote schema (for encoding) +/// @param remote_field_type The field type tree from the remote schema. template -FORY_ALWAYS_INLINE void dispatch_compatible_field_read_impl( - T &obj, ReadContext &ctx, int16_t field_id, RefMode remote_ref_mode, - uint32_t remote_type_id, bool &handled, std::index_sequence) { +FORY_ALWAYS_INLINE void +dispatch_compatible_field_read_impl(T &obj, ReadContext &ctx, int16_t field_id, + const FieldType &remote_field_type, + bool &handled, + std::index_sequence) { using Helpers = CompileTimeFieldHelpers; // Short-circuit fold: stops at first match @@ -3170,8 +3173,8 @@ FORY_ALWAYS_INLINE void dispatch_compatible_field_read_impl( (void)((static_cast(Indices) == field_id ? (handled = true, read_single_field_by_index_compatible< - Helpers::sorted_indices[Indices]>( - obj, ctx, remote_ref_mode, remote_type_id), + Helpers::sorted_indices[Indices]>(obj, ctx, + remote_field_type), true) : false) || ...); @@ -3544,11 +3547,11 @@ void read_struct_fields_compatible(T &obj, ReadContext &ctx, // Dispatch to the correct local field by field_id // Uses fold expression with short-circuit - no lambda overhead - // Pass remote type_id for correct encoding in compatible mode + // Pass remote field type for correct encoding and ref metadata. bool handled = false; - dispatch_compatible_field_read_impl( - obj, ctx, field_id, remote_ref_mode, remote_field.field_type.type_id, - handled, std::index_sequence{}); + dispatch_compatible_field_read_impl(obj, ctx, field_id, + remote_field.field_type, handled, + std::index_sequence{}); if (!handled) { // Shouldn't happen if TypeMeta::assign_field_ids worked correctly diff --git a/cpp/fory/serialization/struct_test.cc b/cpp/fory/serialization/struct_test.cc index cbe4d74470..83ab3e0c06 100644 --- a/cpp/fory/serialization/struct_test.cc +++ b/cpp/fory/serialization/struct_test.cc @@ -489,6 +489,19 @@ inline void register_all_test_types(Fory &fory) { fory.register_enum(type_id++); } +inline FieldType make_test_field_type(TypeId type_id, + std::vector generics = {}) { + return FieldType(static_cast(type_id), false, false, + std::move(generics)); +} + +inline FieldInfo make_test_field_info(std::string name, int16_t field_id, + FieldType field_type) { + FieldInfo info(std::move(name), std::move(field_type)); + info.field_id = field_id; + return info; +} + template void test_roundtrip(const T &original) { auto fory = Fory::builder().xlang(true).track_ref(false).build(); register_all_test_types(fory); @@ -709,6 +722,71 @@ TEST(StructComprehensiveTest, OptionalNestedAnnotation) { static_cast(TypeId::VAR_UINT32)); } +TEST(StructComprehensiveTest, + FieldTypeCompatibleFingerprintNormalizesEncoding) { + FieldType fixed_i32 = make_test_field_type(TypeId::INT32); + FieldType var_i32 = make_test_field_type(TypeId::VARINT32); + EXPECT_TRUE(field_types_compatible(fixed_i32, var_i32)); + EXPECT_EQ(fixed_i32.compatible_fingerprint, var_i32.compatible_fingerprint); + + FieldType fixed_list = + make_test_field_type(TypeId::LIST, {make_test_field_type(TypeId::INT32)}); + FieldType var_list = make_test_field_type( + TypeId::LIST, {make_test_field_type(TypeId::VARINT32)}); + EXPECT_TRUE(field_types_compatible(fixed_list, var_list)); + + FieldType int64_list = make_test_field_type( + TypeId::LIST, {make_test_field_type(TypeId::VARINT64)}); + EXPECT_FALSE(field_types_compatible(fixed_list, int64_list)); + + EXPECT_TRUE( + field_types_compatible(make_test_field_type(TypeId::BINARY), + make_test_field_type(TypeId::UINT8_ARRAY))); +} + +TEST(StructComprehensiveTest, + AssignFieldIdsRejectsIncompatibleTaggedNestedTypes) { + TypeMeta local_type; + local_type.field_infos = {make_test_field_info( + "items", 7, + make_test_field_type(TypeId::LIST, + {make_test_field_type(TypeId::VAR_UINT32)}))}; + + std::vector incompatible_remote = {make_test_field_info( + "items", 7, + make_test_field_type(TypeId::MAP, + {make_test_field_type(TypeId::VAR_UINT32), + make_test_field_type(TypeId::VAR_UINT32)}))}; + TypeMeta::assign_field_ids(&local_type, incompatible_remote); + EXPECT_EQ(incompatible_remote[0].field_id, -1); + + std::vector compatible_remote = {make_test_field_info( + "items", 7, + make_test_field_type(TypeId::LIST, + {make_test_field_type(TypeId::UINT32)}))}; + TypeMeta::assign_field_ids(&local_type, compatible_remote); + EXPECT_EQ(compatible_remote[0].field_id, 0); + + TypeMeta name_mode_local; + name_mode_local.field_infos = {make_test_field_info( + "items", -1, + make_test_field_type(TypeId::LIST, + {make_test_field_type(TypeId::VAR_UINT32)}))}; + std::vector mixed_mode_remote = {make_test_field_info( + "items", 7, + make_test_field_type(TypeId::LIST, + {make_test_field_type(TypeId::UINT32)}))}; + TypeMeta::assign_field_ids(&name_mode_local, mixed_mode_remote); + EXPECT_EQ(mixed_mode_remote[0].field_id, -1); + + std::vector name_remote = {make_test_field_info( + "items", -1, + make_test_field_type(TypeId::LIST, + {make_test_field_type(TypeId::UINT32)}))}; + TypeMeta::assign_field_ids(&local_type, name_remote); + EXPECT_EQ(name_remote[0].field_id, -1); +} + TEST(StructComprehensiveTest, OptionalFieldsAllEmpty) { test_roundtrip( OptionalFieldsStruct{"John", std::nullopt, std::nullopt, std::nullopt}); diff --git a/cpp/fory/serialization/type_resolver.cc b/cpp/fory/serialization/type_resolver.cc index fe5bda6db9..563afb6b64 100644 --- a/cpp/fory/serialization/type_resolver.cc +++ b/cpp/fory/serialization/type_resolver.cc @@ -112,12 +112,12 @@ Result FieldType::read_from(Buffer &buffer, bool read_flag, if (tid == static_cast(TypeId::LIST) || tid == static_cast(TypeId::SET)) { FORY_TRY(generic, FieldType::read_from(buffer, true, false)); - ft.generics.push_back(std::move(generic)); + ft.add_generic(std::move(generic)); } else if (tid == static_cast(TypeId::MAP)) { FORY_TRY(key, FieldType::read_from(buffer, true, false)); FORY_TRY(val, FieldType::read_from(buffer, true, false)); - ft.generics.push_back(std::move(key)); - ft.generics.push_back(std::move(val)); + ft.add_generic(std::move(key)); + ft.add_generic(std::move(val)); } return ft; @@ -778,8 +778,6 @@ bool is_compress(uint32_t type_id) { type_id == static_cast(TypeId::TAGGED_UINT64); } -bool field_type_needs_user_type_id(uint32_t) { return false; } - std::string field_sort_key(const FieldInfo &field) { if (field.field_id >= 0) { return std::to_string(field.field_id); @@ -949,80 +947,42 @@ void TypeMeta::assign_field_ids(const TypeMeta *local_type, local_field_id_map.emplace(local_fields[i].field_id, i); } } + const bool local_uses_field_ids = !local_field_id_map.empty(); + bool remote_uses_field_ids = false; + for (const auto &remote_field : remote_fields) { + if (remote_field.field_id >= 0) { + remote_uses_field_ids = true; + break; + } + } + + if (local_uses_field_ids || remote_uses_field_ids) { + for (auto &remote_field : remote_fields) { + size_t local_index = static_cast(-1); + if (local_uses_field_ids && remote_field.field_id >= 0) { + auto id_it = local_field_id_map.find(remote_field.field_id); + if (id_it != local_field_id_map.end() && + field_types_compatible(local_fields[id_it->second].field_type, + remote_field.field_type)) { + local_index = id_it->second; + } + } + remote_field.field_id = local_index == static_cast(-1) + ? -1 + : static_cast(local_index); + } + return; + } // Track which local fields have already been matched so that each // local field is bound to at most one remote field when we fall // back to type-based matching. std::vector used(local_fields.size(), false); - // Normalize user-defined type IDs so that different encodings of the - // same logical category (STRUCT vs COMPATIBLE_STRUCT, ENUM vs - // NAMED_ENUM, EXT vs NAMED_EXT, and their ID-based variants) are - // treated as equal for schema-evolution matching. - auto normalize_type_id = [](uint32_t tid) { - switch (static_cast(tid)) { - case TypeId::STRUCT: - case TypeId::COMPATIBLE_STRUCT: - case TypeId::NAMED_STRUCT: - case TypeId::NAMED_COMPATIBLE_STRUCT: - case TypeId::UNKNOWN: - // UNKNOWN is used for polymorphic types (e.g., Java interfaces) and - // should match STRUCT for cross-language schema evolution. - return static_cast(TypeId::STRUCT); - case TypeId::ENUM: - case TypeId::NAMED_ENUM: - return static_cast(TypeId::ENUM); - case TypeId::EXT: - case TypeId::NAMED_EXT: - return static_cast(TypeId::EXT); - case TypeId::BINARY: - case TypeId::INT8_ARRAY: - case TypeId::UINT8_ARRAY: - return static_cast(TypeId::BINARY); - default: - return tid; - } - }; - - // Recursive logical type comparison that ignores language-specific - // encoding details (such as embedded user IDs or named vs unnamed - // variants) while still matching full generic structure. - std::function types_match; - types_match = [&](const FieldType &a, const FieldType &b) -> bool { - if (normalize_type_id(a.type_id) != normalize_type_id(b.type_id)) { - return false; - } - if (field_type_needs_user_type_id(a.type_id) || - field_type_needs_user_type_id(b.type_id)) { - if ((a.user_type_id != kInvalidUserTypeId || - b.user_type_id != kInvalidUserTypeId) && - a.user_type_id != b.user_type_id) { - return false; - } - } - if (a.generics.size() != b.generics.size()) { - return false; - } - for (size_t i = 0; i < a.generics.size(); ++i) { - if (!types_match(a.generics[i], b.generics[i])) { - return false; - } - } - return true; - }; - // For each remote field, assign field ID (sorted index in local schema) for (auto &remote_field : remote_fields) { size_t local_index = static_cast(-1); - // 0) If remote field carries a tag ID, map directly by ID. - if (remote_field.field_id >= 0) { - auto id_it = local_field_id_map.find(remote_field.field_id); - if (id_it != local_field_id_map.end()) { - local_index = id_it->second; - } - } - // 1) Try exact name + type match first (fast path for same-language // schemas and most C++-only cases). if (local_index == static_cast(-1)) { @@ -1030,7 +990,8 @@ void TypeMeta::assign_field_ids(const TypeMeta *local_type, if (it != local_field_index_map.end()) { size_t idx = it->second; const FieldInfo &local_field = local_fields[idx]; - if (types_match(remote_field.field_type, local_field.field_type)) { + if (field_types_compatible(local_field.field_type, + remote_field.field_type)) { local_index = idx; } } @@ -1043,7 +1004,8 @@ void TypeMeta::assign_field_ids(const TypeMeta *local_type, if (used[i]) { continue; } - if (types_match(remote_field.field_type, local_fields[i].field_type)) { + if (field_types_compatible(local_fields[i].field_type, + remote_field.field_type)) { local_index = i; break; } diff --git a/cpp/fory/serialization/type_resolver.h b/cpp/fory/serialization/type_resolver.h index 58a1e1469c..c03970f98c 100644 --- a/cpp/fory/serialization/type_resolver.h +++ b/cpp/fory/serialization/type_resolver.h @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -110,17 +109,40 @@ class FieldType { bool track_ref; RefMode ref_mode; // Precomputed from nullable and track_ref std::vector generics; + uint64_t compatible_fingerprint; + + static uint64_t + compute_compatible_fingerprint(uint32_t tid, + const std::vector &generic_types); FieldType() : type_id(0), user_type_id(kInvalidUserTypeId), nullable(false), - track_ref(false), ref_mode(RefMode::None) {} + track_ref(false), ref_mode(RefMode::None), generics(), + compatible_fingerprint( + compute_compatible_fingerprint(type_id, generics)) {} FieldType(uint32_t tid, bool null, bool ref_track = false, std::vector gens = {}, uint32_t user_tid = kInvalidUserTypeId) : type_id(tid), user_type_id(user_tid), nullable(null), track_ref(ref_track), ref_mode(make_ref_mode(null, ref_track)), - generics(std::move(gens)) {} + generics(std::move(gens)), + compatible_fingerprint( + compute_compatible_fingerprint(type_id, generics)) {} + + void refresh_compatible_fingerprint() { + compatible_fingerprint = compute_compatible_fingerprint(type_id, generics); + } + + void set_type_id(uint32_t tid) { + type_id = tid; + refresh_compatible_fingerprint(); + } + + void add_generic(FieldType generic) { + generics.push_back(std::move(generic)); + refresh_compatible_fingerprint(); + } /// write field type to buffer /// @param buffer Target buffer @@ -147,6 +169,70 @@ class FieldType { bool operator!=(const FieldType &other) const { return !(*this == other); } }; +inline uint32_t compatible_fingerprint_type_id(uint32_t type_id) { + switch (static_cast(type_id)) { + case TypeId::STRUCT: + case TypeId::COMPATIBLE_STRUCT: + case TypeId::NAMED_STRUCT: + case TypeId::NAMED_COMPATIBLE_STRUCT: + case TypeId::UNKNOWN: + return static_cast(TypeId::STRUCT); + case TypeId::ENUM: + case TypeId::NAMED_ENUM: + return static_cast(TypeId::ENUM); + case TypeId::EXT: + case TypeId::NAMED_EXT: + return static_cast(TypeId::EXT); + case TypeId::BINARY: + case TypeId::INT8_ARRAY: + case TypeId::UINT8_ARRAY: + return static_cast(TypeId::BINARY); + case TypeId::INT32: + case TypeId::VARINT32: + return static_cast(TypeId::VARINT32); + case TypeId::INT64: + case TypeId::VARINT64: + case TypeId::TAGGED_INT64: + return static_cast(TypeId::VARINT64); + case TypeId::UINT32: + case TypeId::VAR_UINT32: + return static_cast(TypeId::VAR_UINT32); + case TypeId::UINT64: + case TypeId::VAR_UINT64: + case TypeId::TAGGED_UINT64: + return static_cast(TypeId::VAR_UINT64); + default: + return type_id; + } +} + +inline uint64_t FieldType::compute_compatible_fingerprint( + uint32_t tid, const std::vector &generic_types) { + uint64_t hash = 14695981039346656037ULL; + hash = fnv1a_64_combine(hash, compatible_fingerprint_type_id(tid)); + hash = fnv1a_64_combine(hash, static_cast(generic_types.size())); + for (const auto &generic : generic_types) { + hash = fnv1a_64_combine(hash, generic.compatible_fingerprint); + } + return hash; +} + +inline bool collection_type_allows_empty_generic_fallback(uint32_t type_id) { + return type_id == static_cast(TypeId::LIST) || + type_id == static_cast(TypeId::SET) || + type_id == static_cast(TypeId::MAP); +} + +inline bool field_types_compatible(const FieldType &local, + const FieldType &remote) { + if (local.compatible_fingerprint == remote.compatible_fingerprint) { + return true; + } + return local.type_id == remote.type_id && + collection_type_allows_empty_generic_fallback(local.type_id) && + (local.generics.empty() || remote.generics.empty()); +} + // ============================================================================ // FieldInfo - Field metadata (name, type, id) // ============================================================================ @@ -377,7 +463,7 @@ struct FieldTypeBuilder>>> { if constexpr (vec_type_id == TypeId::LIST) { FieldType elem = FieldTypeBuilder::build(false); FieldType ft(to_type_id(vec_type_id), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } else { return FieldType(to_type_id(vec_type_id), nullable); @@ -392,7 +478,7 @@ struct FieldTypeBuilder>>> { static FieldType build(bool nullable) { FieldType elem = FieldTypeBuilder::build(false); FieldType ft(to_type_id(TypeId::LIST), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } }; @@ -404,7 +490,7 @@ struct FieldTypeBuilder>>> { static FieldType build(bool nullable) { FieldType elem = FieldTypeBuilder::build(false); FieldType ft(to_type_id(TypeId::LIST), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } }; @@ -416,7 +502,7 @@ struct FieldTypeBuilder>>> { static FieldType build(bool nullable) { FieldType elem = FieldTypeBuilder::build(false); FieldType ft(to_type_id(TypeId::LIST), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } }; @@ -428,7 +514,7 @@ struct FieldTypeBuilder>>> { static FieldType build(bool nullable) { FieldType elem = FieldTypeBuilder::build(false); FieldType ft(to_type_id(Serializer::type_id), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } }; @@ -442,8 +528,8 @@ struct FieldTypeBuilder>>> { FieldType key_ft = FieldTypeBuilder::build(false); FieldType value_ft = FieldTypeBuilder::build(false); FieldType ft(to_type_id(Serializer::type_id), nullable); - ft.generics.push_back(std::move(key_ft)); - ft.generics.push_back(std::move(value_ft)); + ft.add_generic(std::move(key_ft)); + ft.add_generic(std::move(value_ft)); return ft; } }; @@ -463,7 +549,7 @@ struct FieldTypeBuilder>>> { template static void add_element_types(FieldType &ft, std::index_sequence) { - (ft.generics.push_back( + (ft.add_generic( FieldTypeBuilder>::build(false)), ...); } @@ -475,8 +561,7 @@ struct FieldTypeBuilder>>> { add_element_types(ft, std::make_index_sequence{}); } else { // Empty tuple: use UNKNOWN as stub element type for schema encoding - ft.generics.push_back( - FieldType(static_cast(TypeId::UNKNOWN), false)); + ft.add_generic(FieldType(static_cast(TypeId::UNKNOWN), false)); } return ft; } @@ -510,8 +595,6 @@ struct FieldTypeBuilder< } }; -inline bool field_type_needs_user_type_id(uint32_t) { return false; } - template Result build_field_type_with_resolver(TypeResolver &resolver, bool nullable); @@ -557,28 +640,28 @@ void apply_integer_encoding(FieldType &ft, const FieldNodeSpec &spec, return; } if constexpr (std::is_same_v) { - ft.type_id = static_cast(TypeId::UINT8); + ft.set_type_id(static_cast(TypeId::UINT8)); } else if constexpr (std::is_same_v) { - ft.type_id = static_cast(TypeId::UINT16); + ft.set_type_id(static_cast(TypeId::UINT16)); } else if constexpr (std::is_same_v) { - ft.type_id = static_cast( - enc == Encoding::Varint ? TypeId::VAR_UINT32 : TypeId::UINT32); + ft.set_type_id(static_cast( + enc == Encoding::Varint ? TypeId::VAR_UINT32 : TypeId::UINT32)); } else if constexpr (std::is_same_v) { - ft.type_id = static_cast(enc == Encoding::Varint - ? TypeId::VAR_UINT64 - : (enc == Encoding::Tagged - ? TypeId::TAGGED_UINT64 - : TypeId::UINT64)); + ft.set_type_id(static_cast(enc == Encoding::Varint + ? TypeId::VAR_UINT64 + : (enc == Encoding::Tagged + ? TypeId::TAGGED_UINT64 + : TypeId::UINT64))); } else if constexpr (std::is_same_v || std::is_same_v) { - ft.type_id = static_cast( - enc == Encoding::Fixed ? TypeId::INT32 : TypeId::VARINT32); + ft.set_type_id(static_cast( + enc == Encoding::Fixed ? TypeId::INT32 : TypeId::VARINT32)); } else if constexpr (std::is_same_v || std::is_same_v) { - ft.type_id = static_cast( + ft.set_type_id(static_cast( enc == Encoding::Fixed ? TypeId::INT64 : (enc == Encoding::Tagged ? TypeId::TAGGED_INT64 - : TypeId::VARINT64)); + : TypeId::VARINT64))); } } @@ -646,7 +729,7 @@ FieldType build_field_type_with_spec(bool nullable, const FieldNodeSpec &spec, ? build_field_type_with_spec(false, spec, child) : FieldTypeBuilder::build(false); FieldType ft(to_type_id(TypeId::LIST), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } return FieldType(to_type_id(type_id), nullable); @@ -660,7 +743,7 @@ FieldType build_field_type_with_spec(bool nullable, const FieldNodeSpec &spec, ? build_field_type_with_spec(false, spec, child) : FieldTypeBuilder::build(false); FieldType ft(to_type_id(TypeId::LIST), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } else if constexpr (is_set_like_v) { using Element = element_type_t; @@ -671,7 +754,7 @@ FieldType build_field_type_with_spec(bool nullable, const FieldNodeSpec &spec, ? build_field_type_with_spec(false, spec, child) : FieldTypeBuilder::build(false); FieldType ft(to_type_id(Serializer::type_id), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } else if constexpr (is_map_like_v) { using Key = key_type_t; @@ -689,8 +772,8 @@ FieldType build_field_type_with_spec(bool nullable, const FieldNodeSpec &spec, ? build_field_type_with_spec(false, spec, value_child) : FieldTypeBuilder::build(false); FieldType ft(to_type_id(Serializer::type_id), nullable); - ft.generics.push_back(std::move(key_ft)); - ft.generics.push_back(std::move(value_ft)); + ft.add_generic(std::move(key_ft)); + ft.add_generic(std::move(value_ft)); return ft; } else { FieldType ft = FieldTypeBuilder::build(nullable); @@ -705,7 +788,7 @@ Result add_tuple_element_types(TypeResolver &resolver, if constexpr (Index < std::tuple_size_v) { using Elem = std::tuple_element_t; FORY_TRY(elem_ft, build_field_type_with_resolver(resolver, false)); - ft.generics.push_back(std::move(elem_ft)); + ft.add_generic(std::move(elem_ft)); return add_tuple_element_types(resolver, ft); } else { return Result(); @@ -755,7 +838,7 @@ Result build_field_type_with_resolver(TypeResolver &resolver, if constexpr (vec_type_id == TypeId::LIST) { FORY_TRY(elem, build_field_type_with_resolver(resolver, false)); FieldType ft(to_type_id(vec_type_id), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } else { return FieldType(to_type_id(vec_type_id), nullable); @@ -764,26 +847,26 @@ Result build_field_type_with_resolver(TypeResolver &resolver, using Element = typename Decayed::value_type; FORY_TRY(elem, build_field_type_with_resolver(resolver, false)); FieldType ft(to_type_id(TypeId::LIST), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } else if constexpr (is_deque_v) { using Element = typename Decayed::value_type; FORY_TRY(elem, build_field_type_with_resolver(resolver, false)); FieldType ft(to_type_id(TypeId::LIST), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } else if constexpr (is_forward_list_v) { using Element = typename Decayed::value_type; FORY_TRY(elem, build_field_type_with_resolver(resolver, false)); FieldType ft(to_type_id(TypeId::LIST), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } else if constexpr (is_set_like_v) { using Set = Decayed; using Element = element_type_t; FORY_TRY(elem, build_field_type_with_resolver(resolver, false)); FieldType ft(to_type_id(Serializer::type_id), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } else if constexpr (is_map_like_v) { using Map = Decayed; @@ -792,8 +875,8 @@ Result build_field_type_with_resolver(TypeResolver &resolver, FORY_TRY(key_ft, build_field_type_with_resolver(resolver, false)); FORY_TRY(val_ft, build_field_type_with_resolver(resolver, false)); FieldType ft(to_type_id(Serializer::type_id), nullable); - ft.generics.push_back(std::move(key_ft)); - ft.generics.push_back(std::move(val_ft)); + ft.add_generic(std::move(key_ft)); + ft.add_generic(std::move(val_ft)); return ft; } else if constexpr (is_string_view_v) { using StringT = std::basic_string build_field_type_with_resolver(TypeResolver &resolver, if constexpr (tuple_size > 0) { FORY_RETURN_IF_ERROR((add_tuple_element_types(resolver, ft))); } else { - ft.generics.push_back( - FieldType(static_cast(TypeId::UNKNOWN), false)); + ft.add_generic(FieldType(static_cast(TypeId::UNKNOWN), false)); } return ft; } else { @@ -819,7 +901,7 @@ Result build_field_type_with_resolver(TypeResolver &resolver, if (resolved_type_id == static_cast(TypeId::NAMED_ENUM)) { resolved_type_id = static_cast(TypeId::ENUM); } - ft.type_id = resolved_type_id; + ft.set_type_id(resolved_type_id); } } else { FORY_TRY(info, get_type_info_with_resolver(resolver)); @@ -835,7 +917,7 @@ Result build_field_type_with_resolver(TypeResolver &resolver, default: break; } - ft.type_id = resolved_type_id; + ft.set_type_id(resolved_type_id); } } return ft; @@ -913,7 +995,7 @@ build_field_type_with_resolver_and_spec(TypeResolver &resolver, bool nullable, : build_field_type_with_resolver(resolver, false))); FieldType ft(to_type_id(TypeId::LIST), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } return FieldType(to_type_id(type_id), nullable); @@ -928,7 +1010,7 @@ build_field_type_with_resolver_and_spec(TypeResolver &resolver, bool nullable, resolver, false, spec, child) : build_field_type_with_resolver(resolver, false))); FieldType ft(to_type_id(TypeId::LIST), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } else if constexpr (is_set_like_v) { using Element = element_type_t; @@ -940,7 +1022,7 @@ build_field_type_with_resolver_and_spec(TypeResolver &resolver, bool nullable, resolver, false, spec, child) : build_field_type_with_resolver(resolver, false))); FieldType ft(to_type_id(Serializer::type_id), nullable); - ft.generics.push_back(std::move(elem)); + ft.add_generic(std::move(elem)); return ft; } else if constexpr (is_map_like_v) { using Key = key_type_t; @@ -960,8 +1042,8 @@ build_field_type_with_resolver_and_spec(TypeResolver &resolver, bool nullable, resolver, false, spec, value_child) : build_field_type_with_resolver(resolver, false))); FieldType ft(to_type_id(Serializer::type_id), nullable); - ft.generics.push_back(std::move(key_ft)); - ft.generics.push_back(std::move(value_ft)); + ft.add_generic(std::move(key_ft)); + ft.add_generic(std::move(value_ft)); return ft; } else { FORY_TRY(ft, (build_field_type_with_resolver(resolver, nullable))); diff --git a/cpp/fory/serialization/union_serializer.h b/cpp/fory/serialization/union_serializer.h index f1460b4a84..7d5820f4f4 100644 --- a/cpp/fory/serialization/union_serializer.h +++ b/cpp/fory/serialization/union_serializer.h @@ -1103,7 +1103,7 @@ struct Serializer>> { return default_value(); } FieldType field_type; - field_type.type_id = type_info->type_id; + field_type.set_type_id(type_info->type_id); field_type.nullable = false; skip_field_value(ctx, field_type, RefMode::None); ctx.set_error(Error::invalid_data("Unknown union case id")); From 86719b6c1e0f7d51c623cfde3b887d64919706d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=85=95=E7=99=BD?= Date: Wed, 29 Apr 2026 21:17:24 +0800 Subject: [PATCH 8/8] docs(cpp): refresh benchmark report ordering --- benchmarks/cpp/benchmark_report.py | 30 ++++++++- docs/benchmarks/cpp/README.md | 76 +++++++++++------------ docs/benchmarks/cpp/mediacontent.png | Bin 52226 -> 52441 bytes docs/benchmarks/cpp/mediacontentlist.png | Bin 57111 -> 57760 bytes docs/benchmarks/cpp/sample.png | Bin 55251 -> 54468 bytes docs/benchmarks/cpp/samplelist.png | Bin 53909 -> 53635 bytes docs/benchmarks/cpp/struct.png | Bin 51352 -> 51954 bytes docs/benchmarks/cpp/structlist.png | Bin 53820 -> 52960 bytes docs/benchmarks/cpp/throughput.png | Bin 78902 -> 80164 bytes 9 files changed, 66 insertions(+), 40 deletions(-) diff --git a/benchmarks/cpp/benchmark_report.py b/benchmarks/cpp/benchmark_report.py index 1480818cff..fd3944d8e7 100644 --- a/benchmarks/cpp/benchmark_report.py +++ b/benchmarks/cpp/benchmark_report.py @@ -45,6 +45,17 @@ "protobuf": "protobuf", "msgpack": "msgpack", } +DATATYPE_ORDER = [ + "struct", + "sample", + "mediacontent", + "structlist", + "samplelist", + "mediacontentlist", +] +DATATYPE_ORDER_INDEX = { + datatype: index for index, datatype in enumerate(DATATYPE_ORDER) +} # === Parse arguments === parser = argparse.ArgumentParser( @@ -135,6 +146,16 @@ def format_datatype_table_label(datatype): return datatype.capitalize() +def ordered_datatypes(datatypes): + return sorted( + datatypes, + key=lambda datatype: ( + DATATYPE_ORDER_INDEX.get(datatype, len(DATATYPE_ORDER)), + datatype, + ), + ) + + # === Read and parse benchmark JSON === def load_benchmark_data(json_file): with open(json_file, "r", encoding="utf-8") as f: @@ -243,7 +264,7 @@ def plot_datatype(ax, datatype, operation): # === Create plots === plot_images = [] -datatypes = sorted(data.keys()) +datatypes = ordered_datatypes(data.keys()) operations = ["serialize", "deserialize"] for datatype in datatypes: @@ -343,7 +364,12 @@ def plot_combined_tps_subplot(ax, grouped_datatypes, operation, title): md_report.append("\n## Benchmark Plots\n") md_report.append("\nAll class-level plots below show throughput (ops/sec).\n") plot_images_sorted = sorted( - plot_images, key=lambda item: (0 if item[0] == "throughput" else 1, item[0]) + plot_images, + key=lambda item: ( + 0 if item[0] == "throughput" else 1, + DATATYPE_ORDER_INDEX.get(item[0], len(DATATYPE_ORDER)), + item[0], + ), ) for datatype, img in plot_images_sorted: img_filename = os.path.basename(img) diff --git a/docs/benchmarks/cpp/README.md b/docs/benchmarks/cpp/README.md index 9811c8a54a..0d7c25a602 100644 --- a/docs/benchmarks/cpp/README.md +++ b/docs/benchmarks/cpp/README.md @@ -1,6 +1,6 @@ # C++ Benchmark Performance Report -_Generated on 2026-02-19 10:20:08_ +_Generated on 2026-04-29 21:16:35_ ## How to Generate This Report @@ -21,7 +21,7 @@ python benchmark_report.py --json-file build/benchmark_results.json --output-dir | CPU Cores (Physical) | 12 | | CPU Cores (Logical) | 12 | | Total RAM (GB) | 48.0 | -| Benchmark Date | 2026-02-19T10:19:31+08:00 | +| Benchmark Date | 2026-04-29T21:15:49+08:00 | | CPU Cores (from benchmark) | 12 | ## Benchmark Plots @@ -32,65 +32,65 @@ All class-level plots below show throughput (ops/sec). ![Throughput](throughput.png) -### Mediacontent - -![Mediacontent](mediacontent.png) - -### Mediacontentlist +### Struct -![Mediacontentlist](mediacontentlist.png) +![Struct](struct.png) ### Sample ![Sample](sample.png) -### Samplelist - -![Samplelist](samplelist.png) - -### Struct +### Mediacontent -![Struct](struct.png) +![Mediacontent](mediacontent.png) ### Structlist ![Structlist](structlist.png) +### Samplelist + +![Samplelist](samplelist.png) + +### Mediacontentlist + +![Mediacontentlist](mediacontentlist.png) + ## Benchmark Results ### Timing Results (nanoseconds) | Datatype | Operation | fory (ns) | protobuf (ns) | msgpack (ns) | Fastest | | ---------------- | ----------- | --------- | ------------- | ------------ | ------- | -| MediaContent | Serialize | 120.4 | 863.8 | 281.1 | fory | -| MediaContent | Deserialize | 397.9 | 1197.9 | 2768.6 | fory | -| MediaContentList | Serialize | 480.9 | 4744.3 | 1407.5 | fory | -| MediaContentList | Deserialize | 2022.1 | 6426.0 | 13595.9 | fory | -| Sample | Serialize | 72.8 | 92.0 | 296.1 | fory | -| Sample | Deserialize | 328.2 | 641.2 | 2642.9 | fory | -| SampleList | Serialize | 287.3 | 4761.2 | 1506.7 | fory | -| SampleList | Deserialize | 1711.8 | 4875.2 | 13232.0 | fory | -| Struct | Serialize | 27.3 | 32.4 | 55.2 | fory | -| Struct | Deserialize | 21.4 | 25.0 | 747.3 | fory | -| StructList | Serialize | 69.4 | 419.8 | 285.9 | fory | -| StructList | Deserialize | 129.4 | 334.4 | 3385.8 | fory | +| Struct | Serialize | 25.6 | 34.3 | 54.3 | fory | +| Struct | Deserialize | 23.1 | 25.5 | 769.9 | fory | +| Sample | Serialize | 68.4 | 96.6 | 317.8 | fory | +| Sample | Deserialize | 326.2 | 662.5 | 2633.8 | fory | +| MediaContent | Serialize | 119.5 | 854.1 | 292.7 | fory | +| MediaContent | Deserialize | 391.2 | 1207.2 | 2809.7 | fory | +| StructList | Serialize | 72.6 | 421.4 | 286.4 | fory | +| StructList | Deserialize | 122.7 | 364.1 | 3400.5 | fory | +| SampleList | Serialize | 284.0 | 4898.1 | 1549.8 | fory | +| SampleList | Deserialize | 1824.8 | 5047.4 | 13206.2 | fory | +| MediaContentList | Serialize | 477.8 | 4788.9 | 1461.9 | fory | +| MediaContentList | Deserialize | 2053.4 | 6561.8 | 13702.4 | fory | ### Throughput Results (ops/sec) | Datatype | Operation | fory TPS | protobuf TPS | msgpack TPS | Fastest | | ---------------- | ----------- | ---------- | ------------ | ----------- | ------- | -| MediaContent | Serialize | 8,306,128 | 1,157,712 | 3,557,700 | fory | -| MediaContent | Deserialize | 2,513,488 | 834,808 | 361,190 | fory | -| MediaContentList | Serialize | 2,079,229 | 210,777 | 710,492 | fory | -| MediaContentList | Deserialize | 494,523 | 155,617 | 73,551 | fory | -| Sample | Serialize | 13,745,041 | 10,871,787 | 3,377,292 | fory | -| Sample | Deserialize | 3,047,224 | 1,559,633 | 378,369 | fory | -| SampleList | Serialize | 3,481,110 | 210,029 | 663,693 | fory | -| SampleList | Deserialize | 584,168 | 205,121 | 75,574 | fory | -| Struct | Serialize | 36,672,581 | 30,900,039 | 18,114,682 | fory | -| Struct | Deserialize | 46,637,124 | 39,947,557 | 1,338,225 | fory | -| StructList | Serialize | 14,419,548 | 2,381,886 | 3,497,903 | fory | -| StructList | Deserialize | 7,729,173 | 2,990,652 | 295,353 | fory | +| Struct | Serialize | 39,028,134 | 29,190,083 | 18,400,879 | fory | +| Struct | Deserialize | 43,236,159 | 39,162,796 | 1,298,861 | fory | +| Sample | Serialize | 14,612,190 | 10,356,947 | 3,146,384 | fory | +| Sample | Deserialize | 3,065,887 | 1,509,472 | 379,673 | fory | +| MediaContent | Serialize | 8,364,768 | 1,170,804 | 3,416,327 | fory | +| MediaContent | Deserialize | 2,556,154 | 828,370 | 355,913 | fory | +| StructList | Serialize | 13,768,856 | 2,373,115 | 3,491,609 | fory | +| StructList | Deserialize | 8,149,855 | 2,746,704 | 294,075 | fory | +| SampleList | Serialize | 3,521,702 | 204,162 | 645,233 | fory | +| SampleList | Deserialize | 547,995 | 198,123 | 75,722 | fory | +| MediaContentList | Serialize | 2,092,938 | 208,817 | 684,050 | fory | +| MediaContentList | Deserialize | 486,993 | 152,398 | 72,980 | fory | ### Serialized Data Sizes (bytes) diff --git a/docs/benchmarks/cpp/mediacontent.png b/docs/benchmarks/cpp/mediacontent.png index 7fd07e4619d9f4a94a5631289426936634a6db5a..6cb966085558f45e4c3b2fb107a154129ac60dcb 100644 GIT binary patch literal 52441 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 literal 57111 zcmeGEXH-*b*FOrgbt^VRKtQQmK~U)udfO^h35fKrpp=B(L5hkf9YJZKX;69*As}6; zN-v>EF-q?(AU&M9+|T=ezno8}jB`F5#<<$>LrwYfs>XsFPfU^ziWMMa~g zs(6=*iuxE8)uE+hN8xWON^jJ_f27@%4BWIGt=v5CyF8>q-*o)`)U95%Fi@0>)U5-1c8oE+ZG1DXe`^!452R`dZ zpqk=!9k1ktQR)PpzHP~$H+BDJyz}KL&2^=P>P<7tsOn~xOZ_%6X<{KEMXcxrfuc<_ zts>UjItx#aov^t6H-E{#0%=tt>7l2GVch8Vhtqy()~P8e!yWmer2QqSOtcdG9D)yr zpOzcLQ-c4!q`D(b|Lnh)ca*u0{q^VNn{d@L|NZK}=cE7m`_JD!zIO3CEC=%QQ1R)R z|6a8O|9#=VSFh=g-}vv5&Z)o&}Mq)&mVB5F~m0+ zT)2Ps+oYkCVSi8it%pGsuPxEWR8&T_zuQgWGi>-%q}^{R?5*7NS@}ZU%WUo&?elxV zaQ@RP9`vn)oq^hnL*?Vgb_Lu47 z&Sn(`F&SO14V~?Ie|vJbBSj|jVZ3SobGW1|YIOJ^sxFM;$9n^&p85Ks>H6k=?v%~9*W_x*1L++57eIIXjRl4JAG*@put%7X(*2YG=1nHf^ z{;Z}{(K&R2$HJgUyUcQx?Wp?zI$*oiyvLK|Co$@+o_OujJ~{26jXcwzZ(OilG7)n- z!!lAT;|E$^+1#L;S8qK+R~@#U&+qTny;m}mW13B!z8vYbD{haQO0bM9nZbu;q zUo{)T&F_UJi_eT$WbQR{>sIQuA0u?do33M-pVP3$MaumiEFs>#J?TC-M8Fzh^9en0 zoj4xNR1?b`Y+<#yX28yDroMma)>xQ+N7>F^n3x)?+BEDKc?n%9_y(Ef)2T87wR>x` z61CgtlzEQb65)fH!y>0RWF`0K^lNWbKicdd&;6)=G~_iN;fn4b>?drbc)=p|4f5!k z2W?AOkuY%gT%;#n-n@H2*(duicfGwi*PX61H&AH)g9G-CGmE^h*Q+0R zn4L+F>KMLS5L@IpHsrlM89$A+)pp3Nn|7`~uBou^)@^C{s*{SUEfghk0*=&2%Fg`s z-~B3_ey9E6WvTH~7K$TUCY5Nt@Jg%7?vox-v-^RlTq?JHan9-0g11k z=|*tKNoz6}x^~J*j6Pbfwhdy`OIWH<;(YaJsoa`H#=~yXIy%97wUL?3N1wP!3JB16 zAojfMhYugGj^%;QMz5yA zIwVYPzKcL&)_q-Fb=G}$rkKE1{$h3MrBCBMF0BIbjy?)&U%6(Vo)rA5)|wS7DT-$@ zC6;{m7`Eq2(n`S=l)GFbLxt^-ST=_vnVdWf)xk9;Ga>7I=@bq-#eL7f_I+&6b!zt4 z19GLN+}n6@BCLX`VOUO%!GLP8vbTj7@nz_Q3h_=T_rrxS)l*HoS@{ePLvcEUkOw37 zWutKnhj`O`T{Ie+D1PL2iQYu()I{u>(v7vkfPL)F=(4}Qlqqq{$h}Y3m8QN`u#!K3 zX;=m$rmHKb#Uhq#aellhqV*e26=V0|%hB=-E$&Bn4^!@=mgUikA@9gP9xa<%*Kx%p zXlV;z!V5mOT+Q~|{XHARZ1(kdscJ=|cnB^QE=zyX&ACbm&mB3h`k1Ly$z2PZU!*87 zoV9U&OfqU>8dfk4`&c7cQiQkRqOHmPpl#$wah;o+Dk9F|e$XejrRk1ON|ui81?yiY zJ`1xHZtw^vD|B>vEDlYQFLUSxbKjQ@Ux8JeBIjID5~$5$XBo&)&1x25Biu+=cHnME z&x`H~n=tcB@tMoE?Rs;4`&Zy6J;nA~)t@Ro@)-Rl!as2gw66R`4fKSLX>zAR=Rl~c zNmF?Z(s6Kc&iswO_FWzx2hxaV!N%vrgp*tN z3U%C;M#^2Pl$cFRW%agAM9%W>=-rpD~WSia^k19-%cE{wC z!yf91d9O``%KPo;Xqfw%pH23jN{k&pJM8dQSk?^ofL-HEcRDs))Mesp=+bEAv@muFhtrF|j+2d~#-lE}_RE6n6j{w9hBJ37Z}v zo|7Pa|3<`i)keQDBfE@8+jt)A5v6zn$$wY3BUApwc#~UW!>YCqz6x~h{_o+? zSUscc4p%GX$X^u&3;-u`47`2?kyl`k=*sTQq>D9$kgMmUo91!Yf@~2pUp@EaR~pjU zHr|5JqgtGy#(t8H`sUS05H1MmYb4}`vQEdMN`b(2X*wAD55PRlbd_`8Qfla9}#-(O=snXV}K|I9h)&-ouDO__{Bs1Y? zy5_eVoU!g=bgX_wN(?bt3^^5mbHt$@cx?L--{olr#G$kAU{RRI0wrBH+#_W=Wy$Xh zwP1}Un>>eXGmT!T*iSvp`eJOCq})Ep>hS69nrv8xXVNX=h`>7gdBU-i18q5YHZ9SL z!EL>ynRrp$djXyusc@FTxAObHl{j;p(RqRe_Rj3VSlhR152>i`H6f_D>nbC?Qun$E zD(DqFYU@juV^RCihWVhDm|6 z@{(euHU+{le?_AnK_4XZ?c54`fVuG3UDLiP8coSx&(1s43E_75vvM745*+*FJ90Gi zO#wK#ioPUd4^2Nny_Xg}q1J2T|IxraPFG2^D2UszZ{KV*Bgw%i-LN<3L~BS(Kp#Wf zdp${Ud}3ckzpY+>!mcH3u3UEmlnU$qc94x;vB9;1IT4Qb!RG_!0df+qLuYeRt=%`M z4Q6r)HTd(tO6|i)nBWYZlhclV9i2A#5^-l50lQ|etT!*afCVfWi~p*8i-8woOq{vjhHk`cx@JiodVfa9PMHyNNLe7QPv5+{!+F5$ z(IS30r($kjx?lH|y%qMS(!taFP;z=lmsdk6>^DvK39%pdMEU6ZoC_2K0*emPIZLyS zuCI2)Hcw=G=FLZH#z*bA>wn!i>}F1s-7 z<})n1v%yCc&qMcNZA}MgpfK_vv+b6oo`-vY%|hzk zn%@QQvl*Vfm0c!NZNVAW(`~=n%n4y=lxZ?{;s|f`JgS7TNhRP9WW-!eU4}{z5syv+c&(;2~k{1 zM22qq_NbvQ?DatnLbi|k!1PGL^0u%jUTWkF?OnH-uD2b|^RDftL5nyeDIkh7y}LFfj4$6(32Z_+2x*r%83@A^=s)Y0IW? zHGrh92!txwXKsI_9MLkvC9*>w_Q3RQc~{nXrr}HUS!YR`-4o-$8b)l6#~6O&c(f2* zI_fbzGJ@egmY&_6rOPUIjQTWNf_e0_NGq>-%npIAp&WLTaPG@L+{XyMMekaxP+C%t z43s)odVb8d9qikUR26RG34BxQ$5z4NHy?HEb5_EHY7&;VM0?Zvp%myDCQXfn38iKP z)DB_j`bw9yc2|ZSYugD8(y(f8+#_eX-su zMR}V~?t3(edqWTF(bYHAO%xuv|AM{e1*gAceY0wL)_+So@0*1SPBs&$n(=h^5#tzt z@>J~=PoH7f2l;`#Ch_!vZ_wk))Jhqss7my3=Z;Xl(d8pD?X5O*l1bIShp-jxrh3cN zxlUaB->uW^ozRtxdIoRT_HPSSqefZB(|p&|Fj;^^bJzUx9PRP69{`=!_Wwd?;=|t1 z?gz8sp%Zp*dCcA_)DFo4i&QGpwd5lv=SAI!_@w%nhE<%O@VDq)N=8qvexcjvzo;j0 znZtI)Xv#uyr+lt+c*(PmrDvVlLlm(amem)gZ{C;hy}i=xz59illQ_S}zpiAIG~@Y^ zh@aYAk9nqB_#RD2d1`r{>T$p7pMx$y|G+t2GUn-OXhTzYFy$lOyF>WF*Owzii<^qB z>3jvBEc_1|7&M8ARN+&1td;w$wB~cpy8@-u5Or{emSj1(3nb3^`Kxqehw_J$yU?5S zI-CzyqXKklNETrNceS&P>IE=j{g-gI`4tp_FX69ivz2TDPYZjPUWt5f>#>KqE1+eum1&lN)RwS7MA+;SyTr(b%n zuh2i%3_6i?bJUbvx^3qiKC$l-NdoZtvF`u^tcVaMsD1udD& zJB7La<5CVb<^lT~vw(bB#Gc`gcaBHO2=X?JO}TR$3x4|f6a}n%nzg4p)A;5Bpn_S? z+FjGsY4~lNM5=p^y6aagRm{7PtV}CC@&wd*&Sjc8z`3 zzVY@VY$J(0KT_^mAO3~I!W7x$OSr#ptPG*|=3wKf7;;HnU+ z!se`~fot?pOnX*DiS~`0I-aif6-Xy9Cv_3YVjowxGhb-FO@VvXwks7Q8${{9c)_f? z$?&F<#U2nnw6Q%w_s5IigJB#kn8b~g`FR0{x~pMf2RX2da%gCuB$6BfS~P$Psay@6YeBWj1^e9V+p|E4}~P*(T@>`&Z|# zIsN?H;#>&AAAX$8>*o_fT>9Xi!q(3~pZtI-D^MpwK>{i1w?st}Dijk>jyF~4NI*LY zMT>ub*FUMBcCcP*ys$a++w}h6x*1ZZ8v*%?_dc`_&KWK(9WN}fwekpP@DMmv81?NH zuRfbQQLA?}qjIs-xRF+2@6NpMnDobG6XJU7b<`SMJ-MXD{DtYz@L>2qM)` zZJZUe!;^AtFfQr96)PJob{t8tm8@fS=SjR!>=hX7TQ>dVHlMKlEwNB(#^<5zN?Mo zDhK!s6W42)R>efiRIOeS+z~lA!oBeB23T`zt*})PMOwt7@l)vgNlFYE%w}Hq3w|*W z=x_fD-mkvFGCGAAy%i;pWn0V+)~&fgyWow6w(ihw`4KI2o|xNkKdaz z&WOcvz@1tjsHKQGwhm?nv3N%aU?LlfI0%D!X5N!P0ZvX1=@l(A8`~9)s31@z84Brp zTO5OZpz{fxWHO*zsnuTpc{A3Bl6l z`so>tY>$fevfR%PbXli*^EifO{Lmmc0RqyGhWd2mfkB+{c*RFzS4_-9|5`j zvEdNVPqXjVvo9~)T)TM~eTn{k{d1aDbeOVh8x_^Ry?21JQBhsSw7kAjzTAFBOeyJ_ z6sX3pBmYS6ud`|8x8C&M@BZ24=ub{+aXu}(@|iyF6zqpv?w+NHo?l|r{dzj)wqT;i z;QbdR0E082ZDt;4;F+Lo7u4*`jcl3);{th;oo=`?GsC~*{-fXD$-u|`{KM!7hM4U4 zJ)oz@gPcF+_(ll22B5s`9jQ@y9u`0`8c4k605 z{O-alX^@del%OK8XeEVunf#A~aQUQtQYE5F!_U97|4-Ns$S40_>SO$WZ}@-S3;KWi z8rt*?mDs*A*Oc4PN$>E4Uf4#KTP*3dvN6CG4_bsxx+Azhsq(Tw4=9&+y-zhgy1TQ# z9FSJlY))B=S5`1jn)8j?W}K4a3&Y;cyJ?bcG`?o#4%Ac=1Wxlguv2ybHY8O_QgvMn zS;oa}6*!Dl;u<{LReT3NhAb!O!bzdg)6$AYDsTzFs0`505Tba+eYWS40LXxU%$jD7 zM|Kr}NfE=wny;*jGls@nsY}&6xWRypFCvzTL&QQ+dbx`1LO+p}9*KGFeZyYDacnT< zM<7dtUwCKu7DX0Ofy+q#Nga~o;ZuUAsRVv*dV@95YvS4->$5Qz+Yi*-Z6aDF16r#b zI$5%ta=)TEYAbTC!Lu!=!L!Sa``DACA*>0k_9a?Fz}R}A|D?$8ulJ%rze530ncPHt z0%;&NVCyZuUaBH@SPi$_79i;Ow~I8hT{51!7{(tHF9lySBkrn$;^xBl;+fnxuG1Y# zFH~G!tR4Rcn)SN!?bN*`&)VCFF((bso4ne`(y?i%X7b8nw?Qn2?a)_Ak8#}=OJ6Ic zG1=d}pd`h~1JOjTsQukaWu;0KhtxOn_Hb-|84^M8&#e$1ACkDo^0;KVW;Y`<&0m^;9S}sY5<6Hf$kGW2Qg-`xDIVn+O=WX5T{!|bb#O&HV`6KrsF|acM04}S zX*3X6FBX)|or={aR_kr6F6(Do1(K`m?|Evl{$rJKn!e3>|I*yJ_uLP3*ja$ut;?O# z^LguKwfh1ai^CGU)Hip3Fa9Cq*yGjk9=4mKo@KFb+f1Ds8MmkU`;8q_Dm<5ej5I!B z!UEFl2pE69478Or()ib#Bf&4O#RJ(J395%Zk>U@A;Z*1N{WhSZmE~d7uP>~!6JdkI zX*@lXa6fvT54sY2hK&C@+92teQ@}>9`Q+c0sFUY32NYdIa2NOHatr7B=*aAzBhlg{ zU-HP`n%q}%`+ahA8Fmdk!Ykp+O%FwBbTN``9@0SF?>h#_LRr?)-hU5i_?cpws)?A_VE?LVxbDLBV%t?I(W$SlpO*4h- zIk^Qb%LwZCL5n(!eDbXls$TE$PU?i7Z98mVhKB!pH*nKExfkJwYu*gQLZz0d-VGo_ zeb}9+HajAi>w;A)b>)VWGt4tDZ=U|9*{!k67LxG=?>%L6ng^rZ0S?`^^bT+ou@>*U z@w4o-QL<~Q4ouShye&)v^@DoOei78y0RSYSL>;O(`b)kXWu5rj*@R2a@L{aU$&2*O z?up%4^W>oW7|s4MWx$>qi~$Loe_(ph(gxp2>-mMMgO zBff*BB`_|QtnMW~j8g-3)jYBm!&SpT3R!OOYz$tesQB{M1TwupbnoaW5LHI!?cjm* zDEXnEi<|Mad++h~!=Bh8)%JP`U?HKFQF7w7j=dRZ zr80-nt6(d~zhFK)B?feYg=`28G~bI(fI5t@yE@5Nd`kh7>Q=#-S8C;Gjdact#QM}n zLe&WczS+MMx*^10SpgL~4-dLvY`qLX|L$_v>6Qb_N>d=Xj1g~zJ1yq*hQ$$v!`E+M z8PW0)s{4Bv`66^7DErd!?v0H46ZUronL%NhMh)Kw*MSlAl?Bwi0&EO@3TJaSv<02% zYoY9iH@>GKJFxLuE5B&_$CJAk`xk*x=Z>5nfJ%<)MT~Wq3UC%{@lXn5n|DB*(37%5 z7zdc!5*U7&7L#++OO?w7vI-V^In%fJ72WhN_(Q|6@-l~P$1WpMVkaew_AOEsCCRkTFdkVi*iY!G7P6mX)t+Qri0tIa~cjVs^Q${{{RC`fzvakFEUpXMA>w>0>aVbdX7Foz!b19@fR z4Gr-;Q%G)PiL%f|vZv$w&>gUEZI)-LKdM=Sz3FB?O&uXEyd29ws%549V?Of)OnnaiD?Mfj2O z?KAzCT7;p?PS2J?9)#svY#n;$=4q*SW01i3Hk>UyN~gjW{X(gWf_QQ$m8ZfEO)59U zVhk8~HQMSgmRA7y*IUYk#VGB6*tqgO&L{`UTWVIqwTHJj^dt)`OizAm{*+B8F>9$1 z6s17_FV-sZ*;!SzEmYXG44Zjf-6Lr$C~5q;cmgy@C6sW0tJ>#U0YI zyEZ-V)V7-Q+;yQBtyw# zfKGC&Qk4#6Uzk?&BbF+R;|x^?8*ehhKQWyAaGCVxdf=KnPeHpV{zFw=`&S^`Icr98 zKz%}?E*Gy=P9Ry5h*|5YA^ibo(=_|Lrn09PhA+o4e(R7d8~+rpZ!(WaXtHUl()#-v z*|>kg-#N%Oe1wBCJ+BhHu??{e4F57H2A#bPn}?_-?<+GrqvLAaycN#rjJDkW9lSif zCCiao1(5J+W*CWMmGu_@$xc#hU&wOCrT;01W0kf@RV-1bfA(*n;vIvH>>iLmuaNR0 z{%!$BE7lR$&y#vffOyOs;6YdU)YNRaNfNd- zuna8ZEF;(a9q}yOgaJe=!ZbM5n(8FAD$6eM9OJTOB8NP1Fg-Du0N#vCdwT`uBGlvJ zjUNL=%O?hMfRbl4xgij75?wM28!v$QwuUlI|BZ`Mk>7FFiZ)Gr4d?6z>5_cctkneDQOUO%^62{p>QDgc@|A(A;{ z{M4QSD6Y7;V7T%_Wtq{+rbRF}I6n7%*^XTK$X_6%4zljoiDfmDUrP_O0x|bXJ-s zfhb)9{YU3_n6CP|gjbIm@B551&F<^5jH!OVzY}#JDwT{>yb*nsbrsKp{mo23Nv=3b zL8|ZCw<k^D9Si=W0mJ?K)@#hV$#N{F*fmjM_7S zd{Yd5Z*`f6d3LBz6|s}xh!YJE`m!gna~c7+p&WtT5=MS(o+HjmyW=BBC?!DnZNWzs z^T5Uol3Op@wKn`0C^8xX-4Jy$^Ohy5tlwtYm(^n)h?}W(_G#9(-*twdfF@{~W)Z)- zGfnMCJCc*Hwb%R$3%WS5>)*)`I?xc!>pHM7VMwP*T!GuN}H&=i_H`0Es^v;$-(n#oC&;KAg`)$;0U@mG>sTMsEnd*jfr`@KpF;{h+~f zOvb1Hi50SRBAFIIr>Q)ocL;t@viqn;8LsqP_I2Hb=5`DGMSqPmjqQc11zi=5=wZKg085Egb00pKB4Xb1Z^g@2*Hi`gQic>s(I)U z8(NT<_@t{e)8v(29TUAs@1oUo`4P7$(vVrk!_SFa6pKYXf^938k$-9d!Sn(LyVkx^ zSBiu9g^^X_LrjY1uO_dNkprkM);^VOS%@sye;;Y)-K@;INI@r@-UW|DJMma+uCesduCS_kH|IO~Blc9$~ThMo(=5WJR4aTJ$74ZuWg_^cOIxANwm*QUj~)^_izh zs5H5v<5eQvz_hArW5j2JC14nFon=VR(sFnp1gLl0$5eeJ!Q^4A?pokE-6&F=+allV zhYN#6y$jQGW0i#k%XyzV3ai#yHjJ$LT;DrUsESkXHdDSi-B36TuV zdLt#l_B!WkMb0|34aA;JfXv9+N0kVczIVe}1sg)Aux;*+>Oo}LQeD5cg;LB{|2*t& zf2LiKi>{Dy-;lYpTwYYhr>VY6m=g^ICm{Lifz-4e5~U{wHdP~41g1Yp85q+%n@#*t zD&VnK`VMRUmcPh+UOTR?UZAfXx}_2}jY*qO>f~3$`(!Pm^MwEIFsXm{KC@9&-A%Ps z_FjWpxv|a9;9VsPf)YL=t@Ji1)N7E}h%5=*nOrZY8?x-rgWQIct%9rY2U1XZ=ZF?!zx4_ZR z%Hu#cKgeh!Lr55VMafrrJ9H@E=JQkEmg5a9LX`IxoxdDmp7?ZtbQ}MFB{_IN{D^W1 zyN<9d7U6rJQR88N2mmA)N&MNi8whUgc2PSMSMGIp1@Ss-R+-zMHeuVv2HFUTq2-_> zuaRyn9!fBiAs?Z;$8^@=C9(gM@s+cw&mt)A@Cxl-7fXHGBWL@LVY6(Ogm;R=a3ap* z`-r8NKh9LDE4x3eBX-`nqOLd7U2KB|ObhQXIpg}Y8uK|p3?VNqPWVmr^-&ve$Ib7$ z{cg+RlhQt?=QnziFvRk4DI)s=yY)N6t_%Zz)7_%%7;|06V-nM1h4OgK@1J-~!Iztb zu+7)$5kzd;`>E203lhcn43`eB4#yPuwXde=ZkS{{l2ZQlZnAz|=tWiRR8PPxb~o)T z(yeN_ajpSmog#gQI&ovE?8C}WC)qPbeu;2~P5pwAErpd_HQf(h4rL&HDd9fWYJi$# zZ2yt$(sD(Lj^0mHN!tQgjG6z_4?7W`5mzzu=p)d{b{Rr{r;le3&g5Qp_@_xYD+go# zS~rP_e_dq->hqL*A?_wy=LLrv;%~(zNCpsRS|eDOR?m8mtVGtx7C} zNeq{1MOo5xkwP`~3-L##0XM9nO3b>K?TJf#sN-g;BVv7yQCl_PiW?BP2KU3Kk8}i9 zcr^SBX)y=0vcDEz+ZHgMJqZ!%lBN~a4kfZ_kX7WkZr=&Myq5<*zy(p7 zJ^+0!zn}8>M0;D4*cyC_XT&e(1ty0M6ydUU5$-Xa0h9Dzq}8La{6}oAjr32Pxjx?Z4t<^IO?-@x+(ZYgz8No*WbjD)+ zj!_l<%!;jSL0j+VmJdOdbx{6aXJiy<*7fGICK+DxSy4Mw@Ml@*X@%(#5K!& z-Dc!xuq9s}I9F0{P0svfw~p1anG>C2khsZp{@j=&aVC_td4G3P6A5{z7uJKnmw2G; z!X3F;M?>;5l5wC?S*tAC^$VRqbE{hHkIN=Pdz=?D9a#w(N{D_P!RwiRP?r;ex4}&S z2T?_kSV7GQynZYNT zDwND$6L3qQqxw@^Lq)TAsB2aix4vDc>WGBytGWxApWv9gY*$4*&>s0LfC@2I)ld>B z2l^|)>H40D^sBq}j)_W+_#|udPJY=B92WmflESj{ud=K#y+qZ?_SL4t=b}x7xHrdn zJY*je4F+m1#hZLwJ8DHF7A#(Wy~8%{ywJ3qx`lwZsb`)<8$pv7CkU37$y=t3`=Vlc zPlYkGe@(u4~ zM9I+-9WdveCX4QPxdRZyKiXVkv>z%-oFd2So0X4&Y|JN}27HTOQ~#Vq z_qL5ADvebI6k@S}8qh%1%kqM}Pq9fl;W}YZMZ0Ld=eGW7NAOIP5Ps1bF!T0>-U3|h zw%=a9U>tiro_~W~&!8Wc&#b%Hx>MS`4>8fVefitcA>86^46cqX&fXnTQ@3u}C9we$?RiOe`{tqFn(kc6;aM}J+5=Rx@j_wF?lPbne(6Od()TBk>TJpB zIo~gE5HSEGPJ5cdCgn1LYQDvm7WA;$1;moIP$ecq?t_3{v;l!zPBMSeTtcKL&Yk-)Yt9J%!a$$iNI z&NO^&kKh9GLAKxw?Xa{e@S|pT>q0gACG$EjZ~(ESk#0hOSm+-ji@pB({apFELf|S` z(Cn%rJ1tW;L_n))ab1Ukl{MXev_(Wdw-s?Q0)!yZR5J!+BKA&+S5k6F&AQ`Hx2n(7 zO6B?wv_U|U@nEZ2VJ_MHX27Gf{_%P#8DLQLs*{sQdl@s=8W9FCS~4B|2Za7%`YNsI zNAD+IC2oaURf3nOz0TNvfhl#p@JE^n@pNv%ilOX=S>AbBqbL}LyNK8{<*qw68ax<= zChd+@ZVd5VXvQymhCcDM?_{h#hIryiFoiGuw+2x*BIC?Sa6_`g#o(#ZFctf{JpGwCQY;o8gH{EoEj5FxikK4cBY;`)lHD6REsz$3#MLg z&uyU;EMudX19a=oW_`AR-uchck>d(`zi4f<-^aDIUui6&*F-CTmRoLh|Lu1D5ay!z zbC8KHa2BsNEW#m3#VQH_p5H#cn&p0G87pI+9%o6636npbK4oH8X2T*~YWy~E$-+V| zJ%b1t#^h;E&1e`I;IAE%u~23MbhPbAq)PcNPs4igw;yVlsaY+Vto3{_(mCG;u9R>0 zf=$l;xq&ZPeoO=LfIZ|9%Vqmqq*1I^>P!-NYW32(z%78e$f+!4m?ruG1kFr|*K^ zzP%_{v)B6aSppB9$AuUkwVZSLwy$TSr$HMRE;9A|kaRbji?604P2>&HFaORDyxhtY z)N19gal|)1sn~JOczCtp?`}5Vh5D`2k)+Rvt>R-) z93EF5rN7OuHSLR6t3HF~YHF`K^P~mTd;N5wXE#J2(S0DsojqiOzG%qNex8Z`OtdeS zzq>>mb&}C)qj27ag|D<14zX*Zq1Y4MLP7?_AflsXwoWEYGRm^n2*JgJuxB*{0!J@o-$wED zphuQ=#XIbI#k0LDSL8bt%@&SR=x)ApN1lZ~4Xyc>b{its5-odFEl;)z{2M%l{l;Xh zj^NG-XhZhPkiv?--=~jy%ZTn{#1M3t#ctd{pdXZ>KAVR}VCoLgy#pk{%~=3yqtaA* zTfjm=QxtFu?;L9PCWTyk!)fK#@A!ajal4}Y;w(M-go-vnYrOj9xo|7J^pJcTK|Y+L z44BlnjRdo<;uL8D_UFxAMRWe$wo&!fi_gkFht7L}G##y}<6SJl%Pdh_r{{QTEcM<% z#R&Dczj!Qyr!P`=?d#q%osD;9s4LPif}TH+YHTAtm!*q5!>9x9jx;`8$DVo?6G>L?tN2&JXHCr+RfHMq~ohyw|!qIF`q&5wFT^) zwdVNmJzGEcWQoTgZxs;Ekp4oQK3=ECEu9-RwKPYM{)Nme_sU8k?%X>NL8WM5V00j3 z=6kWV1CJZ%sqO7Y&hFG_%^@?6Pi8^wigtW0L?GU^1)-r;!eF>eUxX17Uyf+@G^J}R zFj=W4RI_EV19D>zC;=&0dgU9!xX#E27TmOu?+X3@PiXg)mY+nDGw}02@i64o|85#* zNW$~41S!Cf0XP_MGI|iLWOoZjTrzwiT%8TA%a)j>Rr=s?FwB5HZVKk6X91PVqLHAC2>jK~U^$?6pC5*=hr{u6I`1|fGItC=|tk1q0Pd>+M zQ4-CiqTyMiouRIln_p^_x(QIkaCuD@#@%9_^@|3;-I8qI3Oq`4>+sQ2sz?MLnJ`AY zV+eKTzwVIR9Kmb8U>>VL;vP*OfDxiJN%_WQ00f2lDk0Q&=grXzZEq0oY9FRo)sXBj zYztEyq=tJD8^H}kmUop)6@1iwh@I;;&F}@=W(|=K^;&4hu49NVjYg()ks9OrMt=o% z(!{?T&>d7|7Czh@f^h`$7N8xK3J9n4fZvs+?OEvy5c0AEjXxQ zyya3Q47ZVA^&-)Ti2Ja5enSws?EwxFhnxjAR;8-5MO{G2Qpa;G)Eb|vb|GRjji53A zBZxlbt$J@5U_o1Kr^PgVLMmwF@)8^YH;^qeRXDu4kpxV({qU>;BmozY7&o}p>c|MM zhU6it&*3rWAD=I2V!^(HaIqkQ#e04I!D-4w%yw!|y1~9lXww>?AZQplluz~`^B-w@ zr;uraA#fvm{!D{jVcG+nf<`7iuRH%8dnDQ*yx|wpV(`c7ppwW^cf-zV4{6J}XkZ4S zuggyeNOs-z1Ghlxx71u#dJo()?R2XjV3)ss6^P7xM!KF*D}~J_tibP$I3pnJ7R*#3 zAz`<YHwybnTJPXB%UXM;i2i(U6M0DNk+_jR}NE_u1n&Y!thnsr%s;!mU(qu3H+I`Z8&L zRW8OK=}xxw0)mrqULwXfhzApDct42Ih4V$UQ{GhyGX3tq2IB*7-iONfafx_WhFpDp)3ND6xIJHQgPE*-D42FtCxsSb#R@9cDJLXWe+SJRw2|9O?|sBc~y{`JuC@4R< zGau@vyB+U+K~ivOb`kQ2$3uv4P-S?x@!q)oO_G9yC`|CY;7WZi@OR2#>eK3wg~*;# z`itr@lK^fa8LIn|XC^eU_)SYzg&F+3Z2O){UpKFJx z{?(;_Cj9E+y-{R#3YIZW5XKBf0+cKtfhFSl`P}vUC_a|fa4S1t?$sk9eyE4qNi%5{ zP?K*XCe`UUF0DbRk4Ax-&@QHaL$jaEQ0N4Xmi#rh6^S*EOjtF@c5Cj!G(g(;yI^nF z>*cZlb!m6=PbA50t-##f1`~KU$qXe(4R*lu zVr1ZHDkZ2_yqX@bke5JQzMGsBJO- zJUbd1xdb2HJo3PrduHrP-%eQDF`VUkXXYB2vh4oRz_Lp59vmDwj@ znUwL@FlYOxm}|F`G;S%sWYb5IHPcja6YY&p%&ZgUT9g|Iiybs%iE@K*E9N9tw?Aw8g6DvrBxp?wb-ycQDvuI%711yab|?-p(1^eW&*NyRs3u79;)mN35Ca>@ z;YnR#_A^x+%de<|y7Al4LC^}G4xozUswY>Fac>DVSPY7oggXPeq2bdi%8vW+!O9B- zb2bN{MVKide+@lJ~QOX0wagM6sP z^WW+$LNC$e%7C0l?#+%jaZy`x^G8O=#7-h3gwqX{x^#O=|3FX}2_4IU(z!i5XmjyT z4FepNxR1>im$bQgpYy1|Uz zbjID>PzvqMqKSLKUQRy8>&}p?kq|gMrzMG#B|^^%>53z#u24}C^^-#3$0rIM)(ekA zXz_=`PSwENyBz2Q6%2hh@QyDG>9$>64Prqa67@QE1}lj1CBWk#kU_HYe!ae$N%(ss znLiJIYH2aFP7!NA=vMGrKWtVlNdIWU!Fi-{ zjzT)vH(#3Gh1g8Cr?x_$9{|U4o-ssZJT>2!tG|@)faDq=-Kdlajl6zqb-WjOy2Gic zSxfo*Z3!aVx~9_|DcYT>a^zj0N*B=y!f%@-yQjV1lE{~Dzs|1Ukn?#5Kx1OFvA%YH(_4%0)Lghwv4>|-TjOVQ#mPeo;O9Z3Y00EnMfG(pG* z8K0T#a;pNMFL?!yufRU^iFQ+UxICVL3_SeIGS}w~sa=9iAm1WYV*tCU2Z8e_$cL8v zdd@0t!!cR455L~jNBsY-Xf-k!YA*}~{v(MAMquW7k*93^`<-u{mEJE1zD0@0pK+Ym z1kh-&(XgN{*P6quG%^`LMTLe4HN2hPGUV1Z|LCdL9=5QO zP{PjUa$3QsvC#gqs0Qm2#W7K;$5#J+&D=5sw<8aYf}Gs#SuuNwf?iPTkV%DkgGd3^z{F>=Zp1V7@i?y2DxK@CPL$kFxkkA zX(q@&nUK`HkmB5Q-WJBVL}fcgESuf|gX0mXn8Dk^!!cR|s85}HSp(1IFv?7XjN_jH z1>|u!Fj)Q?Qb;u=$mA%p=sW}eGs|RUl8Zh=fvBqnGWT2o%}2Y^W3dO|Y8nE3P$0(q z;SK=b1>kW-6+g(k(2J0GPO2b$DiOBAdYJj%#dbhGvmoEABM(~IfzQIIi-HMI0%te_ zAw?08&#?#al#SpW1Pmi4K0*aqz4KwE;pdI||Hj^1hgG?@(Sz8Ht%!w%35bNEq)CI6 zf`p>PCJaJC1PoLJrE7ztNDIgzRN4ZiMA(EVh(U;jgmlchH+sJFotfWUbIr^(an0;M zzV93k?EUWdeV#kkTK9V9UR=7}MmDd%>RtuFX+HyyQ09&(huG;Eqs~!XsPvlNxcr*` z$r&Mo5p&~oQRhR{-4$%jJ^-m043_b%9dp;Cu@S6iK!5l5(4d9xkD-LzfXRN#j7y&| z`4Iq(SltVAPWGpAq?@bn$4p9534nZW8VspZ{ERykM2hN`UK-q`c|?&((5JF0L3I=z zA*HGgW{|CCJfZ2aUo;E)8WLr{&^gyuAF14yV1{a27F+OyGB-_z%+L>t_2HU0b6J>< z=a@v%wvvQz=i^HC#-iB0x2IrXs`rA7p}*Itmq5`Lzqv!R7Wkf_v16O(Ud+qox~9VW zbwtFtRu(?Q*J#R}xEzA6qOv>dS+bma^DdO9ncAY9Q5Zgh4nyP#_vrnU9`ZLjPf$@n zsW;lLvzebpP(zlwKzG#?@pM`^4Qh%+Yonp*wE7~10XcdJr>7{+q5Y@C%kn5rdo@1e5(As%kvN%=dw_KT~%&?Vyvj+I@VUf&){6|k|jdMiq7*7 z1?^XYwS39=M;YKc( z|90hN;k@_TeD`+g-s|0dw)<7t*Gk5)aOQx#NDZUnVWoLjs?%k&w8@qzJ%NjP+0@swH9YS{>9yYTM!p6!s z_i4}H6uIZPRQn=6pWf*lw`xCmq`YWEy|a};oJZl~ah%(DV5Q?iwds^H)kCT0-O4b3 zUmn6FBT2lNI(JoO?KL<|`cFp)7p!LFAz-eA^P%yj=KZEuyHJ}#ocFU2GGBwEOd>{m zKJ5=@jQ;hlxb!dMKLGvlr+LmU{7wuN(C8AB;sBruiHC#k-9kB^9Eh48rKC^i?dtW4tJaZDf%?dJb4k2#WZWfJmw}KWz8O#u^J?59~NwZlr z7*~%u23UJ(W&MUoP0#6Ao;E}E5YRTw{fQxH_q3w%NAwKCOyh+Mi1F+cKLgJw8rZM_ zC>oQbmsK6i%UqKK-57fgi)LqSNEJ)jglr5|0PGZ(JmW^)iPs}fb~G$^Z8cp%8FXZ? zWx;}@(swO00<~)=sE20ZyYuOLcnTP=;IkTVFEe$2hN`1sTWy3nqV7Di7Lk(xThbd6e`*$awiGpa1rCHqaG3zOYs4SiyE4XjnVVCJMiMV+Mxm+*TLDTXY$d#sbT1?a(LScif`9wUTYYu``m)*pi{(vRIob^kEQ}EUgfah zy`EhAZTfLHTJmTv7a=T3P(0eJ?;>1z%6mFEwP2e>u7iYa-w_RGsmK@N9ox?euComjmsGN7Saa=jhJL$k|F_%W zHF2y#hD}d^SrRMqR9wwx6Bqp$v4Lno>tAsh%2J;45_t|oEw*2B)tIjs&R;9JyOHes zoMMwOs1>IW#4mME-N!mky9^`!W=ZN${)z-8{wuczvvaFIxl43CpkgiYvgBlwi0;E( z5?ou4T?K}9wBq*VWlSpasJ;zdDDm;istOur5vH~kE~ULC-zC^Log-Mrasys!i-IvF z08D7e-}tocTFeR%w4l4=Gq^bgPzT-9%Z}0rE%kUbJX8Vu87cLq^_82Jz(B-IaN>&{ ztg(8V(=!y%gM3VX(QCM%V&#MIUe7>TG@Y-$wYw?4obHI))Y@t@bB=|q)#lxaPpDCv zs5JWYIcBVpdHtw)530kqi6^>t<{d5Hhu(=^{=VZsOy>fzlL=12c!LaAX_zEL!F@xR zZK}KFF#1cGybAwh) z3mTDYs}7Lu3JlG%-Y*4*La!O+lId#u722T8OBi%PRn~W6b zP(&5)(5uV;}VFH|3qaGDjwgyx}E2n3ah z3LAEUlC9YN>GAr^()YiM+(#v&32Soa?U1gv2C0#ycuvK&lg6d#DonF^T-nS&hC|w; zX5}XjZCQ^x=Z``t)QZ3frB+&*Xo1|JHyan{q#+ z-YxQB+g2DgVRlRw%R`UMahX}`@XMv69b!s5`pHPbrumRhTjBY5f^F_B?9pACdJw<2 zE(eQFV#cB^t0mA!#3AII#v7{!R`MXD-rAInTD%owu}UNw)d8nF8iPv7Ar-yy2@Hp| zLg1^6T1knB_t93mRDSLqymy)-nesY9Qd0qOm0vTFOUwh{FFl-x$vBBLQd^Jc=;4v5 zJ-@z`^nB#>in=l$Q->D_eIf9c})iZhgaVcI~gZGHDe$2`iwbYv`b9qs*AFuBy{udT^}6i2fu8KqahHn^6Xf%wt#( zo%oQrulm0_HnxY2^xe~_t6Fj=%>OQ?o68Q28l?+g{(NF{|5E(wx~*paH+ZAd75=}fKJ(EE<)Px86gk9@##F+c zj!nv&U4bWUf>poaJp}H1pKXX{2L<9x3*Pc>>#)wW3!uJ6)ba}=K%Y$wn~O#kgOHi+rJZ-&?*|aW*{{diA(NMBTx@KttkODWEur!(Dge6x{6xolgrf1aezg^lpc zcXZ{g=)U9;UbUEzf^ha^L&3x{`R7I zAKhQE4H$CS!rqp-Dj}i|aBtQUTFeIQLf*n7LJ+~hNu*!^Q<|Y81({@pS@09Mq}a%{ z!!S3xrJHu23qa^$t*Xc=PbR-x`Pux+%-vx zyPf=O+4%+)e3`J(rmg^JnylyDFaToR*>LJpLFvgusa1Qf6;NskiaWS61xkes#!VPi z&byHdkBtB$pw~9nJ_w#&aa)X1%7*)r|IaKu`;2aUTl@TGXQ9ZG^tv9uwz`7hrL#+& z7MM?n`YSDP^tRV*Idl5N5rR9p3p24uw(_AKZ#|ILuL-LYK>8u1d1+_q6X=v;(3j&xj4_oqk2Ma#zSAv# zVdvgczlhm*uE<$WTJ?buRhfbVU`U>W2$4*Yv!;i5eN(VhH#3)Mky~| zsa=+(vld7iK*Fz}ri}Cw7@M9?`6~6QFYjccE6IsVi}%%4_egEePAtGEZJFCM|Js>% z9(AQwtW$+Z|IgSTK!S>00HgHz2EbkPRuto!;7W>Ex3GFKTU2vbE;u&ez@hJ1fve+f zX*`+%$neF`>;;=3p^YP`okT%o6MwChXt+T;)O{Nn4z%BVs~4<7jx5RkV6hcG5d8lzCUP~ERd!CVVIb$x$p7acfX zq=zDT(a2gfUL(Z+280iNnCT)*VkPGhj6gTNan&4{Go7aTx1;K_P8BV;G4($KNH!zn z6%eNwIy>YB0-;Et3o-PKA1UF`q^ohf%tOem zA~7<~Tk|j!f{F4+ZDfct)Sv%Q=o1DE70FAbX`@-c8`asYR5DdR)_?{f;3lBOI`PjG z>8kO8HYE8Y1>)MlcylQJGYKm~KNPw^_vB+XRsB4SeaWP zSLphScw`RFa+fZY#$U4kJgO?;Mm`>x3Iik18S0Msc~L0c_FMDUPNuPgG|~t-vq$7; zpuFe^;jyR}ZdBl=Rxa5CvEHp`?6*qXHi}4++ZCH~0`x&kJT4-_ka-He8*Vm`o5VmG z66ODoKQr>?$;NUfg_j=*Mujb2CwGC5sp2wmUlS;Mw!ce`z=8E1Kxd`h-G6@zd$`|6 z!>6VB&AIjmqU?OigRl9@@y{>xqMePw(DSMuiGx90B&i8Z(8ag&zsde~)90`W7<{8o zHqQs}{aFYX+P+(Gk6wwhzYebJTSK19pDxdAsR<2kWA1>hDE!yuJVf;yc`t8xJGRyl zn(`L8q=M5|mO3>0w4$R_A<@V`|Ae`3K#l(!g;n+vRN7kaPxI9518B-dKvB^-Exh&c zM`9pD5^$|TqPKs(MG@4-L|;+(<%DNK7a)@ua*A~Um3uD+Ql)J@680}vT#f{|yaV8M z^ncxT)eD&DgUFPNqX6h8|9kyxhRahFHdA`W0yO&4 z(^l@KvirjLBeqa8vfW3CF=BC>CzQi(3d>^=`;iw~(d(dxc^wmNZ8%}VtFhqyZG(*aOa8v>1>Io7f zXck4_Q&kNOQ8T)3k)1^xAp>=w3PNJS;5Ql?!`zS@F>cCJ$<>oUnpPkWn~ciwsp|yU z5pmJ#$!L~u5N5)VT)ge%VLBJ)4Qk)c5!eT*piy_G5nXw0Vf>A}B9)1%6Q?`@pBjbR zkkl~(k!mzibR^7XdDg&wOc>RH+5)gou5;#6WcQajpNs;6N>HkrOGozkMU-co-tIp9 z80V;1CGNyK>j?b08dA;bUO0*3h3)sv?)nB6*Fn;?;duy3JknP91?pNA{_`V*y}F}x zUt{{vcVG#5j#Qw`Q%7aPLU=0^hB!{+x-~)M5a2{(X+Qk0C4vorUuQ2+;1<55O-cie zJnAxWY5^E48z2NxXv9$FF4MDhFbWH(|%v9^}n{zdUMXf`dNSV6|N@@ zvdt)}F?$ZZ2F<6o&^&N8hnwRZ*RdRFuX`iXpI!MV6uXuX83*3Ucl*H$v7nI*G5~{b zPa1D$t26{lv00vy8zQvTuFiGcDKSNQ42Q9Muc6lU*@vEV-<6pr@SEL7&7Z^f0zirY zwHU1s@yJvEbX>m~c~K4psuI*Xr!$cOm|2u0{I9TgQfs;j-wVv&1(L*ca4H%d9VV!A z>xH0PT#b2XADcE!c|t159NILb^adcV{sqf`9NaB6nn? zJM$0d?*FfSY-&idM->zT7G`g|T^tHYxlf0Yt(~$;j7ww^F?coz5z*v}5w&Rm}XkG6lbdA(Uq>@|zuj}f8u-t}9T;M+I$wP*5+iih7iCDkT zVPo4Urjd;}i#OCl?VnfKT+ZGSmD8?`|3Hkt`An^?PQ5?7P&7ua2|Q@Xe6}JV70Mq> zarZcRrro9fjKlGK6F6S&{N$mQe+5LSKKr0BNF@UHA~YU)=>CI`a3`B5Q`Sa8ns7Y2 zS>Qjrq+C+u0_K7fP2VqEfO3Sr_r?7;>>Xr<5BuXTdS~UVTRm>o>s;F4xQ;N=4=^$x z;a-_0GS|p(5qUh=*i7=v5d%7x3}CJwEG?^a*#*t~=T}Hzr31Nm1;)}OOIv6$(u6sS z#?El(ecn7cabI;2V$N#$WxsYO+g0x07X|(7R?QRjX@~+0)Y=L_{n`~Lox7LYZ{|p+ z43J-i!EB35i!As5A}9kP{4iUlPr7z=wGT)h&H#*|NQ3jVGp@CgI?ViMyhA+3D4)EG{#(M?xN&*pjMuY*TFyw^193W8&*63Q zk*CCrGs8c7HtMhb^wGWi5)n+D*~Zl*m+OMzrQoD!0z9Zftsokg3f(aKYywbd)VU@m zm`LXy#{POtdy24N_stO;5U^!04!5`vjznmYVuTwF)x=MKb>+fy4M@HLZ1M&q4das6 zA|YP#%Iq2Wnbk1FuZIcG8Twk|L)t6ZCn*`sKDPIHk5D|I(^j|~l$4fkN_nv|fPGpR z1M{7wO7FukU7aD|VMwMR(bzr7kH1oBrGraIP$)slX;8tyL#Y7Wh$N+a&-)o-bLj}6 zOq*6;HdzEZH{uhWU`I+e2JF=cxV?7&+vlSz=Ulv&kx7gGxUsOW7j54+&pyMRFjQFP zb)L(}pxw{+kK^*WUfldrN(;vb9%$}TaF|Mqap?7u7uA}`s4LtW}ZPCxy zdF=ko9PE@p#YMOK@q)?^+9c)c3(f{NczyosIP>+9m)xJadYgY$HeKG|H{`vt^TpS$ z{9Bc$I(miwIvXS$(c+k2)0%o2sIhWqOnLo*_zY#gf++nv;X@8Ln!kk>lvKquZy(yc z;n!gEFK}1`@{FA^%zFESG1@1ku5tO4UH;HJmXOp#$5B0CvPq)>)-`3%w5JUvpV9#uKz@$67} z1Vbm4$9Ag5x{dg}t$fOm)*;J)fxy>zQip8j-l4e_&P}Vv*uye$zNKMWCb}ZFvaRP{ zdG1ijf%lacXH@#}TA&Khbt(@NH2k&J`p)tJ;C+N(C}b=jxHKzVM#8-e4bENna*VS{ z)kMCIuwH^W>Y54;PwZ!5Ud+bpq8Dnf!_3cW&p^_&YciGl!_uHhQ^te z;>Zcg>ikCvu^V-+2hLkXb#z}FLP)J?C*}V*JP=dy_C+$fyKt&ra&0IVsir&CliHsh zhdip(<7F&re-SzoGQ&O0^s0@q>63|H($@`hUuSITbP zB;7<))w9pkVHg_`1&!S8pv-v_xbqBo&Pyb*%!7c$qLCI%$#(fgt4PaFn_es$Z94oG z;`c6`L!$^Fht!Xo(TGa=M#lM*S_=xZOGV#q8oAcI3!3E0iDh?R8OV0c#@k4<1|Xne z(IJ|lbMz=lVD0&l;+&exrfmW`H!|P>Z95J(!r#qUX%?8YbUEti1nQeMC`Y@#044Ru#^4WWM2fE274l1@v&+22Y zcq6IKh0>jA;b*E9Q1vRTe*P!QWfejmoVRq*z$LVume(TRkv+tPr(8Yoz_t9D67gSb z>vw^ZXbjlS&WWEim1fb*3*(XNm{tg^Nh-)4)LU+s6UxKotDH z0P7fAVV>ef8r+a;xO?45$V*yx2SOx%w|JfF95nCscP+YY00!B$RIaiJT;IX(rCXq|@VC(e^6Hp zmb^3&ur61i^t{O~Kat9sQR~i7plX@c0SZ0aWdP+}s})AuTan3cVG>7TH5;^Rk@`7~ zQD}K!Duyo4osC^MY4XplaU8{*pySHIJJVrK<(W~zfijCPxDR49@X8X zmX*iv+tCDNPP9imOwzBXfsu(MQ89(J^&Ys%(o;q;v0F2rtk`ua5;hYX$tkWCwUiu~ z3lklzY!;myNxI}p3_uOmg6^*Xf#LTK$V?X?gGlV$^)8}-L8GW0y#bRcC2c6qIpn43 zqF!xb6Gx_B+&sBOHegg!v+oxk=3w@FQA;z=1M7;A{BLri-mw8DN^q8_ZM!i8?9V-m ztLgb%x6BoEZcU38wZp~gWUJ*bOcdEW?{^YoO60DSJD(hnO|h1QgcN$HL}I`jg#n$V zvV>#Ti&FO_v;+jgMQy6sq{K1x*J_Rl9Hu_)d(5xS&i@C4l;&P;7^rO=LRI?jyU&;g z@j1QzkMWvn72`i3*@hFm)q1@LU%2@c;*)94p9a4Uw~|E+P<=c5$W;j4{UhlX3eRLO zgHBT)B~Oy66NHuFfxnfW#@-x&oIXGiR6&FPb@}*%TN7r{rVvi*j&mpFIBReO)-RR4 z35SW7q>>YWhvFMFz|2fj{QiINC9D^n-m5&>~CQG;--TW7%pktv-biASiKY!))=l%_X1(466 z!c=E7`-UwN79>Gs#62>df5eWQ(>5hbZ~t&{Zbu7#Elq#)lVfEL99qKF= zi8V2apNMo7ZUfj**zO-_*v5F7gUi_s2PRrsh@f?Km|z5|{0DC3YKFoRVxZ-iCctNy zj$vP3qPR>iwV3Fq`N8a@XL#WGNDHyiuab{vXVJuJI_F}V@CIj50Uj}sP$nDjp#lGb z0Lf*q?Yj_CYt(wV$4RDlAG+EJ@?*^m4=z1ppx!Y)T z(xY^j;AecJ@S;PSWpooQd%O~JCLYnGIVX0b`#5*WOCSV+Ub`0O>bRz$eBB8)1N@{MNv=@6Dq6C_H$ z?WO+f)hlSsndGZ6ea6p}l`nL0XV@VYEhQZVIfHq?f4%Po0-eZJ zUTvUT>coAt!rP?^sXLD*+bt#|qWbXaNu(*Js+YP(sXW3qso;9>7}@EN81ZAP8 z2t&R6mFU*RJif=uOPVnJ%mCj&yQge@dY;jKlNq35XY^ExRqBU)%h z#H#?Bp!OB**jZ1kuIG_~Jk0qs%1cZI-O6Zzsk88@{-N4}Z0vBxn;@$rgp6+|bt28x zoJP_fB%id6entdN(L=59*|#i2wC?27qTPqsQ`5{lg`t~?bYJ=o{`#;Rei|IY`0}>e z!j=$|cl@x)T+h5h+nVzEf7)s7X2T(eXI*X=n=!xIarbrqJf^|W|E2A8U!uDCYZV+> z*?Bwjvy^auZsAvrMqRV&&Nx|h9mr^l1->4W66+3ANt&J1lpF5UBHG<{1!q&vx110a zS8|mduFX}EA!)a!PR%yC~U zxvIQI6(i*qKhpq!oq=9B+-j`V-fxgFvoT@p;v?G;0nDf8Ap%#>=?&uV=%5a%EEIcI zom<&+P*7BwD+(cpRf3}+k!~0Abxg?qSnX~0Ki^jxPG83;PX8xk`9E96GoH}YQK{Kf zrRvJ+$ip8xcM5HraRUqTR^6X3c`LrgCIKBvUmLctmW};~PB3!01;Qj4`0@0PB&{R7 zq}R*NQhrY3IB)J-vbQ&oMv2m7)08de zhqC}ei@elFCySSB;Ol3mRmR6~)>Viwl&N9IHuCo0euzVt<+Y-zAI^(tctlJ{K)3*0 zrWoV_!S+)it9?2;t1@?}Ec82&9!08&N!6`}%ZUzY0N)$RiD7l|mq29o#Kiko(>W6A z;gV-7ICp$gP5FiGWE!Vq$Swkz0m3rdaDT(*dAzYl{<6KkBlWRCW!(;Bzl|f|SkuE< zecV)_0hz(D^_(|9}ce zvco{A)^lKzVT-^gtOpcMw(>-u8AZ&-^H>7>4fp1~i#+o-2|7B|Z|^_zBl#((0tG`R zs@~9J+WS-65HaH09jeLJ?Z^u4AJ@Qkib4rUNr8cA>9!%L7B0g3vb;BF|$9+QX8L>5)NX$RGU zs*ZoY3*A~Gv3@O+Dxj$%D#ya041XI*DDSPbzYD`WOyJk8KP$fGO_V}V8u|maJa*<{ zh@(lj&7x)oAiE!(sMrO+%9b)3gY2S72oN%{{`u5s{%+xTWVqb(@L(m_gcHekY2;q` zDGlO~$|joZa0qCNL$TU=ajvo~X$H3g!nao1Nq2kFpU{N~#QpJZD3gx2LOr8^@je+d zNHNM!QKdorWg4MXxDXKnE68e&G&8cxoqLbOUEN*`3q_aV9lrxp?upyl0C-V46Tl12 z*FSn1d1m1v(6)q-o6Q)sI``&&Y5H_Ljlw|}QU;UlD=`dn0)ZyEM)R^0*fOL|XW$p) zt_05*1Q}T<1dcY1U{M?}YsigEyp8PoYEA)0`X;fjb{gpi&Hs zy@9(tHJR)G2rr;1S{qIB9YW^m6slH45d~;+^qunuNG>?j*w0{;SEXk# zs(N7VlY9HUj+7UG55kEGWy@J0h_qsU@Zs{5oOCpd6m~A%6u(J>O%OxWrVY6LN`D#) zjon&F&q!!Xy%s(67^-&4792c$jt2E2X*iCK?XBFyB+1GsA%tN7|1`r5m1PsuE!U$< z;WmI=?4R2a5YjX@A6%_%BJ!N*cT*g8gU^kMiU)u|FMl83YMw!qcqXQUkkUmK7U51x zcm54y5Q7g|KCb4W;5*t_+3Xh33kVR%m9y;iN^~imd_W43O7H{JsZe}jI}y>zJC8dN z41jzI%RB_Svv9^REh)C}aoM#VIyjZaUVg(N2!w-BJ>Q@xKA4LRnSr8~Y-{u!VQ$2t zLv4?PKxNzaL*Q3ZX@xIgJOK+t5}dOw=Lj_{L^M&#h8kWYWptN9CxnxNyvd<3iVPjc zA9)PP8H?&>easMvZ<^zdH%iodTX}vH5UEyz%@M(sozDZyaP6oH7W@ckHHZ$mRrXsl zojSLEfXX);o~K~yWt)02Zf@}WwAk@S*nt@;3wEYz<_C1eVKi%15N}A~@ zA2hwo{mEwF$DK;cy32h-SC)N^c3;|@AgJthLSID>GW&*^>$iAiD;rFgU%J*yW$s%$ zxmAuy2b^w5p81S19bp&l`m<5Yufh!7FCzW5;Wdnxxr`FsvzYFgc}K16g#L)bjm&%g zyf(~+?dg|>ghAd&N}T~53~H*QbNhU;Am%S8=H}bY+i}X6L3N?C)i<$l-Br59XQldH zT7GMoO*RFmKCB(Gj%TK`yHZ1paWI2m2rUZE|nzCW#SK;EK3I>WGQilf^(DCSyz02#aWr zU~gTcRsE~p0t91^sgqEgf=;8cGFD8HoSgZr1-tiokc|$VW_P@L4V_KEz$l9X37L<} zqXu;CP>ttm2RbfK-e)uh&w{+)hc*{&;=LhTNiZ4NIOPeU1m7Vgp!6%UJz|6$!ij5X z=CK4%&u?3fg=-om_>nqfI>DZfIRWR12p|!L)$gB(^iKw0b^Z#%ttmwt?naV`jwsa( zu^=3Jv$`GwbFDKDri%p*I{_t!@!O0>XsKyB@b%A{V*W%+I$IFHO&|s zAEIxUl5-6deTiz}e(FWDr{JU58~qfT-8X6^iRyLvUO&lZo>9%C_Rv{lr<|MRI3;KD z#IaY-PnJ#XRP#5Cx^iX0yz$>OWcJ8hJv^W)y+LeiuI`HzQ|~YnJO)GpoY8(>| zJ$Sk4O#8<@>MQ?3U8EKzKVRq`=-RmByUygeUB0X!E$ymJ@@OlF;ik8xPIMX^94zUk zvwez1~n!M8c8#LorgE=kz zDY>eJ-D7faEcWN()6aegU#zuCXV+bwzcKL7rOmjmU4FP0&(>(H1-Gs`cjXyGa;42m z1L^ZO9o$^?D-Y#~v4n_uwLhX!!7&D7{d3f=Ma`w5YgVsbtv9fE@#2k`N8IxE`t|Gg zb&YYA6^VzorYd4IC(^V$q5}?`A&l9xXLnGA#5lzL+6hi`k!Dr#DP~n0=C0oT?lBd8 z92^$2cr2>o0|;Sh=KKihRE1SYoO%p1>lz&n5LPFG-+6SD;reQWY%fxEs7dJpn~7r; z{MW76cp%9iZf51xA+{}P)-B45AX@|ad_eSg-MVw<&KdWEe_MmP(0l)#y@lkp zlAd?8z|#k)aWM*(bwKc~L+@!{=e|;zAXOiI{7|d2+1}g6ieCg7uAMp<;XmfcVoaDb zgEMgB0e-y!_qyk!S8cWLdLY-*Eyu28oGgEE!hrEEI|Jc+Qi?_Gmd;nVj(9BKQ+%%~ zARqbb`VqSRq_ni?FSV&L<~pjX-f0Y0!T3q6%kkRG?I0V;caEr-^Iv4=cM;oChDjgv5*!g;PY5hcimXr?4)XO z1X6|9_(`4X*hCP=;S1BB0K6%V*yGWN#!qzN1W}9E-p6vEe%L(Y3kE%>rEa1JV2%RM zucgAGlb_$~GOXj0Ob{NM z+Xhj|OUl)%Ze+H{MyW33*Ifq^+&4LSv(Qjcz{Y5s&*}H$9?S5BXWF+Lp1+{a6Z4!Z zKMq&j$+MJ0w(Oz9%~!q6bn3%t0rfhxh>eN^Mc!6r`J@LGqGvacK9Hy*QuRyYp1wqW zR?4pkH~mUg$4RLH$RO%q@IHwSK_95lBS;UdqjF*6-VR5z91`=P>fP;)w-0yR<==>H}#!=6GiilyY3szHu(=CyWSB zQyq5^*3!cHyR{<+sVjQObz(orUD3{-Ok*CM0C7#IY64(cP@L`1sn{JEs8bpwV8FaT zrOeNdJq3mLkF4Wbz1Zg4>;2U*tZyj`FRT9k?Af#69s8@mzO_u{+^+E2bYx!r%l ziyQ@a8r@GIp3Gb8ufP7+p%!$ubdl?kL%E&gf^hA*7M=w&Ef8ykQ*OxHldFs(9cA(}kdV9M1p1}$J%^G*LN;{sMe|IV&?S$Ok zrQ1$E(k=Pf(-VYZz}U-!F?YM9q<*|c+)7|lemd!9M)q_}dh%8ihjQ?E#)bW9igAIz zoFEU0gwQGJ)}4v(P>%~ZfSU8|>SHZ#hu&br8hQWCGi}juhF;ceEeG1Uf0;w$YzL74 zekCkV!P4`JiW{9w@46-@Cu^K|!rHI`i_8!AQV&Ayxz?ZFAwGr2^^6r0h#3t~uDa7_ z@&4$GvFlwXX7x-w;q!ZeJ2*MC@r%ikd@+fYD_6cP_CPWhE6juH4F}=iP$@Y%eu5S` z;>0k2u}M4SSy$d^<6-SZ;`YgfTQvF;w%%RCxz6nUOS#m3n?7vUw;BzvTuU)!pu`&< zxBw!{o=jn|yz+J<>{eXOxkc^%I255^MQ2K~v{%ICfL$O^ab?b7}L~OZwTb zrtjS7cxsOVUu*u<8M4cEoGz*RAb#w{ENhcg{p?_9XqgYs)-QtdlUA5qeb`gE-ljF!U-E4Fv+{Ps8LPM7n*O|TMqbPd z*-i)9B#k(=B>gC@@F?9O@jd&pmaEHN*=QYd^kdJn5eZ3^uvOn|`D+p+^|bD)eQu~; zztpe0nZ*;X*?gNDN+sW;+(O2lVy9=kY276R5T;FX?zYOKmA`g)$q7xq@jSdY=l*uy zmNT(3@_M4}f|^OXwc~q*xnkS)7y7PgLf`6-O;o?+K*v#v%nsF`u>0&^X%Ir#3XaAg}Pl-&geFmg&SmB5}wJy@gkq&NR)iQv&Gv|C#8SeFK;K>1E`=d zFFpG+U9VC{PH|yxj4+GIy&393FRj%e;t@Zrj6{powaPGJI@YzzPNc8!O z?_{H*9;Vx!K$)kz^%tnJttlrz?6g+IxvO3o%5gPIiTrDQ{nwqhj=v`I<+RGrUF6H! z(xxM}vnJ0le`=}{hpS!Zsm~8?2bDhxHEv<#&HEl>SapYnFPo>S4}?YT)71_07ch9I zt6MI)NNb^p8Y@a+p><4GS1U`Xen&xwcC5=bd(Zzaz#UFG`CPVd9C+S4{pOYSMONoh zHPYXOMa-Z5@}@+nnXBprBdv4y@d+7@f@?WvnHfqW3e*SITs34^ibRf)`u;s3U_n=O z0=(sd2&BIMiY%if?3~6G`;i+s&yZRJUC&!8& z?6?cAI{S>1kGay%G?iP<4807iHTgz#V)XRHLkh>^{pI(G#h5f6ucC_T{Vfy^KJRbE z@4s^is|I)r2gk8CR41<3M@)|3iQU3i9-RLEMx$Y#(q>teG9$ec#*V_~8*fAP{Q6sr z*1pM{oTn9ZPgeN;1fq8vf`wIb-s-6wzkV?-W8J5`O!>MVNSe1?vT1cfNNw~)-Z32A z-k-)i0rwxW_Zz?bYpYgdICg@)zKqB`MG zk`-a^k5ICIZ$EK9aDLTvsqZ^(h;NIXW3s}`O^9!HxNf>xm11o#dN^4WCBcRnc6=LR zLcAeO&qX=A7fEe3s%>qj-5eY$fp^C2P@pknV zZ||4ZefJBFesediTlrK)E}zcZ9YSMv<}9wRUA{*l3{V$`t6ozj-6zj&PQA%ELbz6U zZsk=YGJzF2)5$oo%ks>;xpR+>was+W5$X^=ywzpc36mk`;&h{jCZ#_(d~WOn#nT2T z?pfIleVr{^%hm^oD9OrtL-SHs7s;)<_Kmy9OiD6P?2jS~Qj53O zMH{Pj98NoZ8ugr#wyMefn?If+sVOS`d}fe<`EEfkl54^fRH^vam!PhEkA+Q81f33; zk{%)Q=+`vew(4?$Q!%lz>)>tU#o$grbMb+ z?l6V_nQOn#j5U%@k2!26TrM-P(oF6Z3EPv#k6WAbGB(7`{ho+U`S1lqccEf!y)%{X z5BL12Z$b~_4b~!L$adm9Jp7NLev1c?=akB>gmLvUtm_M|EiMMUp}1Kk?}|urjBWZa z<>fiMc>jWXZxJ$YQtiT5+WKiIX>024i}qIuyh$-CX6|rHJN-~}L-mf!Y30ez<=`*g zRxN=toP*=ry0uiVMg|1FsnkCYJ|(ELr7ZNT8@KATDN}q1l8~FF+L~T~N#KykF-rWe zQfhTF)mv>JlLWuY@=LlLosh=tmhB(J(qW!8Mc(%w$GTo?GIdQp_?Kby?32o`((IM;YYMXaqms^LT)8rt6?P!+n24s7M3)Cy zqBbiCrDr*(ZMyEf$N>7h4%~_2Ffr>!L~oIEMM%S;)A#BT^~>>X)94q`j8ls$5y}4f z^W>DNQ+*K>UI3jub{;0FNjcVYr%jtCBsay8Pc?P=MvYh=P$K?vqOXQCn6|;(rQg&u zvyGRUwW{!CB@W!uEbTIxvE6JS!r#=p1Huzg_o>?(-=BvH7)YiX6y_~V zm#;;?--s&253O5Pj{b$K{WCii7lOUe4{WPNX zH32JO-#d22rUH*JxTx_mOw7+Olzrpuxlla0W*3Cu1`StW`vq3{hUezyM$chZDG5D( z{J2^B!sSAxa7jJbS1@Q#ZaQ?oWXrZ-@e2lLHWH}21(3aP0RIFI`{jAxbRA$mQWss7 z1cZqLW6 zCK2gvFfQ`jcDrWZ4H;=Zff^7?tIs_}87Geot<-(nczpDOd-uAvD!-<3udcl5Heu>K zZz44HzM>A-tL5g=O*K|JokTM`9Nw2Vqd;#Agp1P)w`dHE7d5X|YSFV3Z**}9|BM})0Rcw! z>dr72WSZ9A+blR^o0+$2&Fz6WnJ2*ZkG)?yk)u%r*I${XLf6i57&+&K5=ev_Q##g& zS~n}!lyS#ePn?`()4EbnP_P4!jj#(v-f-hq#=TqwhphfFy!^MxG9`HN5#epIP20_@ z;@6;K2!Oz;dVGDwPN4^~{2HK9z<@#2ak?OfbtRjJhO692Wa!q+lW?CA< zY|PFm8C4VB4`{ed9C^Ovj^oG<^?Lf@KBRyScfA^hg&^MbG^I2xHN~4^_3El8!?i(l<~?(ek%NU;vEU~L9? zEzkG4>*2@K&#`liQYj{Pby;E8Dv@d-`ZsnJnX)j9#k(3HsZ+>GZ}tGwGh= zB|3Q)JwzNU5?CKfB>+d`81~3E2TxC5b2kv}Kd+w=(|7*BZutIODHb3 zvwVhCQzR%PtKOdW@u zh?^kYPA**C)!F&RfW6S!pCImiAdu^tySon<=HT##Gi?$FPO3tmr~2gSQzKv$sDc75 z-cFjaJD!^O`Aakq9(^GiD29Vx6Xr1r?|;We|NXi@Wmb|wo<2~hwN>$&egJzOmex#{ zOt)|UXi+jkw)^kz;abvB#PI=&v=VDm)7U1bmaZ#T zuGl2@xGmI|?Px4Y}DZJ;ag3EJKd&+w4jQMVVr#$aNz3mP#-lS9RS%BJtc{XM0?*4&+(3_q z?&+k*n}@4}ZTlcX=%haV8iR~}Rd6wYv&0&f} zJFDvG2HjmR=f(YSRt&l>*UHM%lZgJ`f)_ZPR2;n7oA^xn=BQ8MWltfd=8f%7dCd7T#^?eKcoQF;j&tOj^U?m(c;5rDn?Ro zcG&H~&$yX3;9ViCXfKhjL0vNV-8u)v~OFKFkxh7)_qS@hVbz)%W4c61APla;$Oxk9e7(9OV zwjskhruBo*jkoL^$NsZtKgK*kj*>rlGWpxv2P*e1-!_Z7z#^nM1EDG8&Gl&8AGN9b z#*Q1OB(*aJ?3XOIE)~fj1AHysLS_5=<*l#3h^GsvDR6<1aBRAb<>lo`4sZNUg8Qh5 z*fWjsI{CJFKd4eg?>4|C$|*@`(2L+SUw{Ah*UuGE9;VZtW9x@n^0r-w1;;;ub?24b znK}GAX|mwt`2p;`cyfnbAG1GEt!1sg8Qfe_(CO7CAGrX5%r55E6a1jVQZR(QUOOdH zF;tYVumeVu!nLmMXQsrLhHfo}^g$_4nr~@*?fHS8wyj1xKYjcdiO0IdxPWL3e+<2v5r<$nDt-Fh=fLU#g8D-{S1D}<9j)7Z>7XOSd7zHL}i|rSUxfd&44Xp4a zspi8dj$Nc~hE)ezw<5G{{1glUDr02g`~7DR(&R{>O>@%7LEI;``9QbEOa+pNKRn`h5BEoQO^d%vz#e8eH7mcg4Ut<9(<=VOk?+b59W0a)Wle z)v`?odwTW^H5t4TpS0$gLdL^`5Bd%`IjvslGN#kIy?0xu?2qhw_m=$X+$t4x&BN!( zlqtuH!-`r=mc^@mo4@}3$%lMT1)J&{)H}*F_4~vfK8c-Y!?`&LL*i)ffKT?V$?~Qn zB!0hMU-5c+g}DKez^IC*nX@b=M_DDP5-FB8;!UXQzIUyLk_NR z{=$VOkpEj)-QQ|g0SEG<(1`z!QoX&Cck?!IRekWXF~Zk1*4Ke=>f`Z?=T4hCRsK{T zBw4cfv7h3!88ehRyCK9_B)FOCFc9bS!t5Ww7oz|4~6NJ@; z7!|7*Z9eRZG*|rXC<@UnY0DZV|Ln{wSFie#_D4xYTq%g2Ldw;^j~edd?1zVk1B=aG z@vmOJ8~LowCy%4_q7ziTtHs6Zj)|dm-15L~N{IAm=WuwM<9=QVJ1r{BLQX*#s-5eU z(JEk%_BS$f5dKUnOocot?}Qq6(_n6r#h#52WdvMXyp<^(HE}@LT+krb zsiv-g!tu;qe182Hh6c>Hq^cQ&tg2WN#M)ZuNzUBD+o%*hB%zaZoky38G9}VNlG5UxFT&hUh{4dKx5PM z9?)NGDZ@mTsP+{i+W>d)YUd*FbwG)uuzUAKZD*AG(c!oF?I`}&XqUe~jP$w*l+gQI z3;)qSdAp^3gZIr2r3D6nPWXaa(MNAv!kGb{17Bv(m+D0GlrCYv&3wSVwH!cBDBe<4 zxca3N6V)34KKOn9Y`O@eO1@1yPJdhHCEjtRcDdd#xM@E$881-FD2ZV@IY#Gr44%8y zk2unhsuao`%@>gB6hpaX%>rW5_zkd%6%x!bOokK12Al>FlWx3E!i$Vr~e}w zq+IEqUC9$3IIHTgp5qb;$IAJeN@CG7vHbZGL0B;ZN1$0L?Mx4>`P7RM5Ayx+f%}yr zBF538J1g7%>zg+1Nw16vfK2_6@%zMse?1xhp(sc|;K-39Nv+)9Se`pge!ilOc>L?O zGu;WT3bD{OJJ)mt2XoEcruYK~)kaS`($SPSe!_%8^e>Uv#GppQWdUQ~%MceoRIuyS z@8HJ4aq@5ea*hQc*rpvqPQB!@VgT;~UNvBY>b^F3_$iLR%%~BWlH1omERbi8U_%?6 zRd%w#b5T<3cBRx|G)z&b4R~E+$7B=cjbg)>BWmIzkOU+}uH z@-GLb(Errlmq$~%|Nm|()j5qQDN|)gg~Bc~bt(xFmB^Ga5oO3coaQ1#$*h4b5hr8j z24jX@5s{E#ODb*K5E<_4qt18u-QWGKyY3(NudlUE>$FyE``OR)9$wR@&I5shU0XSH z^H&NSU#IQDMp;KD<-Gr!Nm(YFB9!ra4TCxFIZd| zO^p~tsrVLb28lkm6#)m95pQm{11WT3w;_EO00XUH8b0IdG_yIbaIgj~+=~wU2ho1S zYraBX?9AtOP^o3(0nWqY761q&--jBa931cJicaNc&=8lZFO~2m}_ErC>g& z!Z6Ycqpj?pyB24fl=#S(yA8JG>*K_hO>P5CvrR}#1+El#4WK7hSR6#Xw^G;d3HmE` z8kHn4BO}9gph=>77)$>?q6P#$p~<Ph^E?$l3u=U_tnIL zgkM)SbEU{0HcAx-L}VF9Pw7Il-Z6I=SgBZZ_U+q3`t|zf&e<_xgxR-q=UI~7o8Ec* z^=Fm34MZv{EGa4Z$B&0Cmmq@P_T!%Qt~gikOH25}uuSAzFKh>n${0tp6HjmcaEcTi z6KeyiOK7Li&zBBWBv@bQb0Tb9e=l1pCG*qr`wgJ3MEob2>KB_HK2=YOx_rfM&j-AD z+q0LD=c^^{gf_~^#|9KJ(Aar*RNV*S5AB&}a29RTFefSg#Le|o=8i2g<=&9s}HL}NraQ?xW z5h3GZuN?8135+pEIp$Ndm>}1-`2LPqN6qR4RsVuf1b@xGV$;y4Mb8j}SB>Z)t^Az- zf~?7AbVF`Qq(h!4YheC2;(>CKd~w1l1;teZ7(nj;Y?$JBio{j2b+{-`OmSkTB)M0) zH|VMn%k82J^*KS}H~U=otGa(RE@&=fNWX&#Ia-vi39K?V>r-*>Iz8v23{|#)X&v_E9h?X6-AK=Z22Lt3W zCsYXIt}T|ry4||PZ}a`8yc&}2uy)fz^!6paM)K5tz-B@3TqPPfD1U{Z(X&hvx2I^u zDICHBxjw$a(Da~_^CM|+vPg7P*V>}{L-5ns05(U*v+>w-Z-IQN!E+tmLnU>$BM;od zO`!WV$e(xVA#Nk`^>&Mz9PB(?a~-g?<(u?P;P`Ji-lKNE;59F#E79t^n z{{xLGpyBT5a7NNWH3a=uxg&VWj+9IjGUJgLuCjpay<)%yWC154(f-O?ywM`}XEkT% z&Yf$>sYmyzLgUn;nPEz3VZd$C>kp1yq0Ap{&o;$ZwaA!>LXudJPQ;rx zbT#?-4w9+``X(|VCjk)xhtrMoEhZMH8)of6XpmjzN9k0AcsWl`dWOG>Zv#JVT$6Yy zq9HgiFdReuk@^mx3oSI81)@?S4@8RGyfGeR`J8-YQEr6->x@|77)n2}{pUFSysDJU z2m_7%#cJ>( zf_o%tkgaYHePeWQ-@t(Vi=$>m9m!xLy_~hiY!ER%x=vRXYH_m!b_<{g5 z;w*&9I-*AQL}QhMzW1Q$jN}hEyj11=CLd=Xf7KQJ<6*}wpH9%k0ruAq9X*{IKB-V&IxK|(e227^xtDx0w(=7^8T zBiCE_o#9{Re=5OnC%VBlM=)CXzTQTu2ic8hKok?ykFh5PwNj%c(^~t~0U2S;Q4U^1 zG#a|K=-&HD`*L(LMmO+nF;{z#@%K&WRwTXC?ZdNqEWTB%j?0%~M`Rd!i(5C6Enz}@ zg@jR~ai`XPskhtgUhl#Zcal8}`&u|^ZB&USk#&ear|}pzY=jWrxnMNxM`cH@IFG^ZDRYv0@vEfq7DmwMr3dX*UaPJIlFm;uP4PE6>Rt)^*FIGIPSLzbl;% zu1aUc57iBdU8uR4ZOkw(JHU!n{pv`?>e)5V@15Q`?|nqR&uEdcy!(h#)9p+Vk%ZD83B5e`>i2#wuVM6c?z5H{8=Jho zLF4kZ?#Q91-pp`?)0V-T`tCwzTBXCoiy|- zTJ3$)MQ>^YQRT^|mV`np|F{qE*ATLls?!X!(s^I*{S2a6i~2Dt(r><oE()zqi z)~TOkxrepAW{(>em$Ua$_%k}=#5np!B`J;^zOwa}?JGj~%zD-ej8AV>IVWb}6JhIS zk|POt@03j8HMfzC9x4^K-*%mIkX2#5*c%+tc2L|}L@wFj!9j780p(Mj0T3MVi^|LI2Q$KW&k_0_|jv1nNnDVD8Zccexgq{F_@c2u}PHa79 zVte1~ZR-6eL~KRH_aT+-AW$7`r+eUe^Xr<2;vb+x*)93_9+<0*Z>zgT%`KZoAeF$g zMHsdcr-^Ot=U0y~z8~BRk>uCXNee_DZdUrD@z}C*2@y2F_xFhD*isO=x( zlA=OEYMAew1XtnH;YoWekGpp5ssa*~h~H5fxU_H$8mAu0VRsYHH`s>|bU1AYuuII( z&u<9H@P>{~v$ZgUUr`iB=Iu#)0cY&VDkd5VOxZo4xHwm@-iVodKlSB5p+8)&#miQ1 zKB7zPFzCg!+GwigO33Spu7jX$2m#g#l~kT$@9yrd^U@2GQ#%5bg+NXYZI54B3B<$N z{TufNbDF)O{$jq1=g(U`J@8NRxxYJyZRd(*%Y@)diuO#j0mjETw&J@c-=tsy$$e*&XID=W%O!y-m=9uS3bLiKQb^?N4@w zClcJ8@hEbeaR~}aAuJ`dz-?e3%x2K8>*0XVjfk1D6%CoyhJ?QB-bG%xDz#{vn#cH% zH34Q2#I;Y-_^}WOu24vmt02rx0^E{`)E3!{0c?A(p+zHI69kkFbUz!wD@Twm2MAy< z{;^|*#xLd{eMCfBS`R@Ln*eA@W39=DkH8v;lA%u-dEJ26)neqSQ8Q)austK*C!#LE z&l-YyuNwbJ0GnglN}A3SbF16O+Y;LUw#ej^V0M?ckU2&cKy0_nbszT z`LjP)jj?qo7etGDpK%>oiY!<#lt@jDbf=w702){%121%KA2aEGZ41nJ+<>pk_R;0; z(t!ixK*9?QH2M!zOu6%_UV1*{xW+fHYo;*hYt5U4u&&6VuY)NzY%@yZoDX$#&F3c;W88D!-8gJ%xYVv>ZYe_7tZ*q`nZ+)zMrv` z@8T+Bc8onY$m_Ozq-9(*a76!|S+Ka%OuULwR+XiSju+RxQM0iKTAxxl+CDwj<-f7!J8kXm!y$}T z^&7cUb-|X%j85=u5)f~9);jDw969a1vm~NXWt050=e`U4!6^qf{GHO~~~2KO=Cmj<}}M$viRAzl@j=^R_p@p1II=Tb@^HzodRseb4I)0T68S(K;p zIuHR1Zu(8I^v(X1*)>W!B#1I^Z)dt(h!Da&PMXk<)1|l5GlW>%K?~4_NMIMh*q`a{xJf<0> z= zsFcT3fzGsAJ-C82XgEdgffxVLUe^z19R;742Y2=z!A znv|Qh3>V!bLe0y!UUMe=Jqg0QEGQ1&lsK=#iN*~;oV7DQ;}CHxoYR7M!lhALEib++ z*q@+sGQ#ljsXKfyFhL|HL10i%?N@hqOXR`ECj}3q^f@gFOMTGrcJL&7)&X)&I9WNX zaH#sniyO?Jb&!+a2r$*{e;ozw|6d20Dp7I{1_WOkur8EUR;nB2I#hcv7Se&P&OA82 z6rE=sF@Xb~ZgemZELchjT?ql)IeDky&n@BG7X_@Tu%!$skUuz40nV90x6pYFHY6!H zoo|JPF0<<>DdygIa4$fdo9_zeJ*nxxz{IN8TYb9~&7f|42%nOukl~%3^IVi51IRD7 zM-vIL^x+WNz6GLI4~Qt#wjIH>^Nd$?Plq`*dTbR%j|t}jXj1h=KzKuNFEjnneDF(z zYQh{JpsZ`bUB!VXi;<6)Eh?ov@dV7$vkw1&{9k7!1^ zBX>iPn){G}>6rpW9~pB1?}SbgdFTHK@&K-e^( zg#!=Kk)vfq=Yi~d%YYulI_a$7Lo-h>B&o-HbS>1sdXO%H(JBlh2fb~rmxP^idRd>u zrh4BuEbFc@a)K?R18a=y7e(JP^JdmwSJ&)Cd~z>++JV{jK;;(-QlT&+4#cmlW82#s zTj0jZRzj+dGhlAvfk1HJATBi0OQ*f`A8ZE3oC+C<(4!1|O}DdrC}5dt8e0a9^Y z`IzXoZHHALp0tB$sQMc;9tu^$xEsW#x)!317_(NjPj6^{?e6N&3LZhS$!rs`4B)_kzx zI%d2t^)G#1Sy>5AbFp8I+BOBO=HqGb;M4^}->PtRrNk$a>&J(5GJihQ4V(D*`JAZ- zQ^KO!kteMVAqhVMw_@bQ+Th)>@$;(ZLHU&#XzurlKNasj%*0q$5b^Gj<)wSzer@sx z(hKXEPv$I@Lt@cNmJ?{=N;O3kq&{yzN4ba5E*Q(L0zB+>w*FXI8Ce+#%~<~Ulk&I)=x&a$=!NlXo;`b3+p%h5Y)=zR3NIVJTfkb^4yYo`xNYg8MY247kXGa+3hFIq-8U^RShz|!dEoW9!guYj zzyzo)9I5hfv$6`M$zSf%dT2T37RL@-xIz}vrjlGwxx?`p#`XTu2%BM_>w4yrYu7$K zkmqQURSUS^eEN$lnyCv@X~TvpgbG~O;y3V`b3R3T{^xbfK5ZwCmwy@z(JxI)EaT+t z`VLClm<6cS;p`O!e{@S5mO?c@csV3QCo>K$SPmgp?#-q2IK{pVXd#BvB*`k1 zoaSTlmPk>2&AMA@8iNSFmESp??f@*?QyJd*7 zO;gg2o$trW;2L9q1@ETLIgjj8>4xFSTi+)+o|vLGjz0SygiCp|Z+V67%=7QHKcH}T zK2CYS^TjpVG(Z(t`a64^>v^03v4&#*rQuSuJuZyeM{P|AhB(f!w>f5U`t<2wz$!6? z10jN{@z#|bovr?IlBka-r;%)D&akV{8KQiE<>7q@(E(vvpG8BJO)d$Fm?*DY!s zheV{l@pMwIAX=7vJw1kFU<{qaDxPCJwxtvylBd1D5NiaZzfZIO+K!3AD_ml5qU8;*C7Mq6K6~SX&eRs6fuh{b|l%VgFP!9SVQyQpaV}H&UI2A+lo#&=H;>XrE zUJFjIefYqe67$xjhrF+Sdfu{W98mfhiPWhWH&10Ag%DMVuC6XEK@eSH(SDa&J9K|+ zWLL8YqEiN8XH~P=s)9-W%Pe7EDCgXBc_6U-s!IXKNLT~K40C~=ah|C;NnW+aT`Y|P zBy$qW9Ag|5AU$kqerUlBNpr~UH8IfiqFy;OYI$9lZ7C4_8hVxN)v#%by57wmx)tp}UZne6qS*?R?jOzjGLNvg|1qxz-w zE>~G?_tvdn--{&35M&@Imyd`nu~BgHd4R-@#7gYxC(oWoLkUN(JK7FU;?FlnZgxZR zQF|&%FJN1G$MCGU_>sRlsb=rM_AErbVB1;O_3CN5&9YDB@~LTpl=$^IbayX05ARL> zf$W{MwWm%-OGHME@5g3+3tYWE3Wx-m(J+GR!&T;%aws*THfFn&f#2d;hu4m}eZT<1 z^YhhY=29EJA=N{=#`vLLtUL-__{*2NSr0M%N&P;`7r_6sz3~Q=txDLc!a6f|!JmA3 z>BjObzU9l0$u|2V?gZ5oMh?1?zpm6%`dPaLhxm z5eM?q=ZhKz8Ypbc!{-tvB+rXB&AH5`#dK!f+tlfc4 z!tg<#OkE>5=DemJ)Sopr<_2alhu{*OgMzQgR3pmo}4_Di?CNz~wCwbZ7wE-abMPK#gBmx%(j zb^EeJH}dE#miuTwe7z0bMq+HK+GxjORm`cZ@gU4FsHlV_~ z-lGnAc0`r4L!(%uI)54+F=~;;d%q#pZ4L>Dnmcpj(W?-n$4DM-H`awkjZ3%@nWV=s zz>PJGcv0}qcsr+7C76_dU-V6B_E!20{b$K5KUIL|)M7XEFDJ>1@>2k=hhW){3^WHS zUiWgssi0r9!E9C@0Ed0#N%_I6^Fm#Q*?qd6MEVJsd4Hj@T#QsZc$LjQ+D>DWirBHc z_@yb@O}MxmP;O!C$>C>39BkPkQKMotpHJr;fAvfW+6;y2VHBF9#Aqg4Jf9-%h{-JT zboZXTevlVi`xZ>4DQ5W*D;v7KOp9;*?b2|+iz8Wn648tAvnh!cYwXAxm9^CUu~@-- z)d^MWx>b#O$v}a0IL{*wo2M5d6X&CO@eSEQ6L?<9QS^@6`HzR{Yu=bkX7s>WGS4c(P?Xn17|=1 zZsDoI5exhz?EYeNhT(bmN4KgfCb0FyLPlX|VPT=g*oV%hZLT9TC}~qLPoHx#4#o=d5l&(oD0u}*LfqvLrYiJEW_G;*rGTgA)#93OvIYn z+SC2z(+H+}f!bF$eK_?nPC}h>4`(Bhf#KD2tYoIzw4-IKZ@hJYWfa=5vSBfN265G0 zYvi31fwaX~Q;%;4U(w&1ld6Q+vLS>xL<>|*M7_BkH?7R{pBeK{?+tGl$M2ZehT(!S zd52AL@x~LUoIru3_YU*j>)lUIg>d2eGhS16OG=IXOFbvqzdrHYuY6=n7vTEX@cK>x zzp{YDF+ik;^(Av)VHPjpA#wD^?}wXk+Xkj=N_heJ3fp>^$w&fq=owZlXz*giyUaaaF^ zF-#cILU%Y8WOhBqSZK`CLw#~PN&~jh&+2t&I6{k|GqJ1ZU!C|4dUd{`J=he&fjn6O)b_abQ`c?_pfhOASd?? z5n&LJQ2D-(+XmjG+SYF(YkcnnA*0WpTfL#tCGcwl44bu!xn@mQTeP$x%d3@70W&m& zSm4O1c@*;SItJ0xEqpk7Br9w+P;fV^1eZ}OC_Q$o`CbM(0m!}u0=;MSD<$`iwIXJC zi%g5*`Yn`iE4`jyZ|A6-EyvD68N(ZiCy05Gozg7>3vC^~O^nPP-87v9 z$FH3;Xs5l{hNaD)Q1n*<8yAwuc1RxOdgFJYwQmp=FB3qs%a|`VMnVD8LJ;zag9<5C zra|=3@G7CXLvo9koKO|~BG!atFhojeISxYEQS}FcNRE4r$0>Usj*v2Q%;W%3r7gAN z%Y{~C7qzwTrc}w`rlJJYn)_Ug-L-V*PkaG?KG}mG`j5Z;pOxwVVNU*OQ(X4ryMOXt WZmnTXnfME8c?C=un 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%0A-e;UzRV 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 literal 55251 zcmeFZWmuH^*EWnT777+Bpig*ch}6j zF803v_j`YN-Vg7W=Q)lCkG)|SX6CwnvDUfH^ISilr?L{~&)hgeL_~BRCHX{wi0IU5 zBBG;v z=G!KAb}wxC+1M=p^B1gEHpXl+xztMVF2pY+)oqE0u8|`D9Wjn;htKK}K|K*wa*CcG zJmsV~vGsjL(WK#|x?xB;%WLzepBWx2y*p$1R8-9H^oOrs@1@@R@UrCLkrTa-@1L$! zd3R1e`RTpOXHWFz2Tu~B!-ktGE!w$REF!swTh_)=k*>B&t`dQ<(XKmwkeiXbMCt|K9@3HCyvf96+#D=H>HLIIIi1FNZ8GHh z_lI>s^!`ejYVsO|rnFXNEAN=KN}jT6l?1dkiIJW>f5Sjdc(4&2b_{u|hkA!Y@=`_* zK1>1UVBx$y;%(ShfLU!3A=K`yO-<}>%+ZmTcoIBzCc<>b$NWV?_ZD$-I_?`?zLuOs zY)M`Dkp|tS8pxYP$UPJ1MSl3+Bw#cCp4)OjO*U2#gYSMaq9`Xs%VXLZ;I^|`_xs~D z+Pilj-M8qY`FNFuv+l7|&NW>(c}kb*c$$=9hklF63a6FPJiD28nyItI#Hg^%!})Z( zN&E=j`!?Bi_Gd4J`2OVRijdzo4^PAUEHw)(1=moz%82`3e@^;V!k@C~OZQ#A$UnC9 zrPnTBrs+yo*7rV&T$qB_@jLMC?^wavwm46GuOJM|w{sNyop<=c)yiEq1UvbWKO_2U zas3UlZkDa-Wuw`(->2J5)T5sLZPGq<{pL-xYR38g;+!;oW`)G}$4{M-UK}V*di3_p z>h_p_!|FsskhUKk!$xtM@z6qQ5B5Wn=bu4$fxcgWJJI zk4+7QW4KpJbB4C5$9kKDk%j^?L%LJ(kG;qH3e8r3U(*erxXh>|X)|7XCxl5gR8_}W z?CaOBG%SD2??>?2Cfh9z^!j!sTXY>LB}rXz#_voS*7#A3W)(E33sqy~3I>Y@Y(8?E z|9M)mJIiEyp#&GlBP!%DuZ9^aE9Fa8&o>I`x2hZ*vESQV2!gAP`XI5edEa$&ULnr_ z)e$l~-`0HuzsS$!g6f9O1JIP*e-=bm#ooTFw$`pz%wH3+d zXN3Z;?$x;rx#-S1>or{?B+ntU^%s|V8`(R6p2`HQ~LRTs?Fb-HYHsTz*ge!kE$ zXG3!9!86Msdbv>8097=^qd6iB`9@8g`ge7(c6IoHiH5Kyr}rPPv4vVy9;jd)mskn- zy_^EG9$7q0)$ts{-clv{=aZ?f@g%x1Ek4)HOw4fgr<)XkN-j5fEu&FV7zL(6?jP%a z-;mT#Hbqe+V>p$pA|JTUWfhMfYz@oZe?Ec24)c6Y+GD`4{Q36$O=(k%fa+CdwSakN zyU9j!XPD3?Gp)At?pMc7@zYRJQ&TsgTS(A>Gw!dBo}ek8ab92kMbb|;Cq-t}hhBn< zq!T$<4?+beSN;9*27Q-soQ(s!2=}3aLY^2^7>Mw$S&}%QeHDF7}m+EsBecZA)PwXnImPtBQ zSE=pPIDT&_OdIErWJ*OL;LxblkFj~mG-+1~p)PP^t|!W(!z-moz1X5Q;Es`I`EOm% z1H(Xl>=KW4%3i0GUqZI2Ms92E!xg4Re6dMal;7vH zsSp)a)1OKi{dU7M{8{=LErq6CQhIuN?bdU@qjmdq&=*YGRmgfGzjqY1L~uz^I{iIj zduwCgG0f7Nj!bGW}Urk#>=J1mFG0fF3Ee zLgN-nOmE%HtBHj@e_;idN)gZ+nyvHHS_5vuLFO%a)yeL%jdgd<^m4$FZktTWPG#q zYy6BVzI^#Yv!!UNw$S5{yw2m2p^_EJ!q4CLJT^7;o+d2T`Togf4@zOTk_KB;@gP4v zVRw$r+c{gO+|+CkTj=im_}w|{aO3^$mCYF@)oi=c7;UUwZp)m^o0I3~J8C}NoU)5` z9CD`raewwcee%M4krsV_p-DSW7Hw>&aLXGK;b}W}mss^R2o%4Ip8YtQvV=pnwD9ov zSI0W+Mbs^%>i7@@^WE{ODBu|)gQFU+QpW1kW#fb`82bv&q=~*cX>^V&>vX#%W#PxC zs`X)POE$NDF{|g*PQ`gzGEUj;mqNVf>)rfBB{HPMPnSH_^7h@kz8Y;;NNY)AAFp0m zn+dn?R(r>QrZ|bf5M=xA30aG z?{Mm1zG+BAaclik3M#hTuVNn~(;wRJZ(H}4yB0T0OozMkC+jQNos%4NND7JL$3N4< zdU|Y+oN`SXOqEa2@_XgPRdBa!_ClfkT=%90dVbJx*uJkj(aXy#e9>S-=ySNrURSnu zzo4w8*29hY{FX@TvoYmM1)PP?e!QNvqF~}E&tO5aqk+!9d3-d#MVPD3zd1%AYLR-Z z<4LSTe5y93O173dY*kv-936YJ(!MMDPo8+8>Sxqmx^%3xWj=XJr>#YN_AHk+8-Ief zV0B!w_Gh{zl`M_Tnvsza)}FMwC&qO*KKePDO`5y!v>0e z8{79r4hSDCRT4;j_oiivEe8XmlYQ{AG5ozXyfTaBr{KPbPVp~dNu?v_^DHB4b4jn% zDX*21R_1+^3SqQtO3^=!{i+<4T_yK=Cftr87t=v!n?tOU<-CAV2Gzdgn;&RC%6iVGr3_@V zm)Xq(Hq2-UO@2@@E9J7<-{G#Ck%DciCEJtD%~D7EfGnRhfgxnTV>LMVmjC#sEo?~` ztib^d;_2-@0fyfnuH=h!OX1eP_^fR!f8@2jkW?ewbug3eIvgeBh%Aur{{Z1-GL0Bs zi#~3}Uc*l}9~jmLA1D5Ku(#D8^rp}7tIDNWHH#~ZO6@$iY;zNcGJ*0IP{_@T8+4U-`LiPY-; z^Pk7V7N`UqG7qdF!YUNZpQ3VW#cy}WiJ%S79=vgoGgHn$M?c`G+p%L7%2F$=#^Vk) z`^jY3RI{TseQ+Z9?O%qY8HNp^#Lb@*O*RH0M%^YK!7Wut+w?)2o!5VFy74Saqp;mj zBn_r6+|{w>E;3JlH6{N+28;C}Ov&jMu=;Ek`gp?D@M|q1tCLYyeFTr`cyCgfV(bL6 z6v^XSBTzwfb>STPRZ$B=<(fk-b1W$x6+4qR)hpaeod;6osnY;DehAIV!L)sS>s$sg zJ6}Zm)34MzInFn>$Oaz{+J&q?RZWpWDGN5iZxdToNY6$$HmOtNOK{} z@9w+nr_d=l_V7{HxBG|mX1Op*?}uV0Lg73`&XkadOueKq;rqQqbgR!(?# znmVY}d3PoSeUuT9Zt`B&^74xgigBm}Xc!r#LRmEFiicb>w#l+g_5ffedJ^zPjZ%Zg zIc2LKP~RpSBRXi#i4gW}cVLQ|_U&goKlkXkHa+L#FN&qRdFsL~ll1dTC1V$y_ZEuL zVeu})Il7fPQ2*R9Zi(fo`L4_xO-XWKhy1VqYj|*3$L01wA{qPfmUmY>z z!Lf=XVU{X|IHa~#l4~+tr3usZnXaM$D?z3hDcNco2bDz>pc9R`lsFG5&gV%!*z@FDQpSI9lUyl@04ra8$4x)W!&TCN` z-gLx;j4zQin3#v1u5X%f+brcV}r zs%?pmo<%q)qU~&=sEi++$dBJ8&fVaaL<*U;ZJ02HWSIzGOH#K#5X7G41nfb;PQr8~ z&lIs{#ddlXIlRpnJc3XZ4_(GqMUdAMk>+A&x@I3y+`NQ5;v_o^wM0af2vt!Mjh{)0 zi%b_y8muzqjY0k(AmX@@-66?Aw46vE=cbUYjiVzG-u{wy0Yb?)t#X$xU+L5_+ibPm zpN)>!1vh4|EKU)hZp_7HM91AuMio5|8tno|Lx|>sr={0hE7=d*Pgi>4m0+ldxZfZb*F`-^9>j=Ed)z=Z>ww5^13J7u1XGIm-|0 zF|w`c*kAAWmyT>*r2eUiEY@JU17_f}q#ZmcqSzU3L?5z(KT-#e&W3PAYISCxmWvgf z>AqbLOl=^b;K)T=ZWMXtY*QD}I@U6#7|M#|UHSgBG26~e^^S9aF`c_X2@CD^blDYi zeT5nQWBYuzqgBKmtQNWzZaXvxQ=P5F=e*f#YzU|WptWVC86p8p%yET>-$4q$ztgli_a{uF=>{R%uFx--lB)p(iU}ZM zLO^$kTzk^OgSN{8j3CovO}?>FXRqi4^v=v6t~eNY$pT%RdpnhJAohcL|1Cl^(8?m? z@!phyz>G)qsHQ#@)p1?m>6oxGJ#|a2>_UdC_(A_{tbE2>vbY3>nLzm(rUO`(O=BQl zG-mZgi+B!2FDa)haqK}s_1b3GeX9;oqoRA}hR{JhQ%?BSr$v!L|GwYd-C3H0F6Cl4 zk50x~ScH+5A@(wHi-Wi*re{H}{wBpbeM0#T6JNW6f!X4TO8^R7HfYO-sV;^@I*gTP z@X_3+N&ouV)2$GXirKffQ)FWTqd0(@zzme+qAt!EKY{r}pLj#(r;VC1j;o-ur_v;i z!|kd^_t|RcrYNsHfBt-OPs;yQY{G6u_hMm8+e8&rr9Hs%_6m1bTl|cFVPEX_Y-gH& z1zAh15K~7o+SYdIDA8Zx1N<(4=tjqk_T$eLhS$;#2x7R99s<>k`{pKiN0KvVI3Hgb zaGA>j#_}53FWR@)KOg>UBiE}UNcc+no_0EMlcOs^^NK-HMIpGdFgKlJF64U@xN45Y20)6PV*)>F;r{p}Mz|HHCTh z?2CIOt8R<3@dXNggR^JPN-tNu_q;H-@b;QcN!k|5Mk|H{V!6)iqG@4&g0SqOQ1HO+ z?$%P=-+X?&u_rJh=CCcTvA&&dn_X#&HJQI6=~qfK;(n*`)zG6Oga5i`_}h-xJ|}4U zd*|CKid@Uwnt6YTdVZM8W#7IW2xn`jCSX6!CTBX+6hCb85q+;zA1+_Sd$Q|SpWEAS z#_P&05ZE9{b=h;YEtT-u22C$D7%|U^}q_Z zaDVNWtCaiJpyTAm?y+@XZJx>9sH(2+109J(69QS|dTZ;`eu%j-Co8)BdvYrAScE>8 z>7a_>2`DVteZH5L5}St(Xa8~a(xvB~i;z=_AeZ&ScVit@xN~mli`cIg_cRJpod?Ue zhUNmaay`5jhstplpvxMGsOPw@{Jz%2eZGX(YRJ6d{qcDG^&DblwBGNks&GuCmPPBA zR|je_e71CT_A~2{Tl-Zq)t=)#4zLkMF{;=sl~sAqfL5xRjR$GRPF?u3h+7igBOw9x zRch_{bEuS?xP?yc{_+W_Z9V=N1_=H7r_{4jsf)A1Sg4K{YNkPnoTSo3d(Ewjf4ae! zDd3?eRa_28XmVRKC+@yQq|hZq$=h?b&L{pETsB0JAmM+%fk8blv0-O)i3weA$|>98 zT~hL(KN%g>$ftMk#UO@$@s^no{YJi23NVhfpg5ZERrCRAzEkEC_tYljcIOVF(5&$% zO?{<2#iYIk!U%uC+|RdXi-4F6pK&>-nx$bV;=k_B;kNx^Zz_T=Kw(YTT0)^lQG_eY zD@Mo8dVN}ckK1AxuDxl>*W-SQSE2BncNN5pUc9>d=Dd18RG|yQv`q%H#6E=5ku+=*~lBYBmw1kW}C7s70<4aQ#Q z(0ha|w}1W-A1*o^vgpE3+O6cA&Qi}$-pN%VyXSeZ5w_FD&EO)IrhF;SppGmRI?xt|u-#zR4B_7$b8?|Oz2R+>!7m$h9qT!oADDFP=yFkM2_QUKIt3LJs{xV@gfq13`U(**bm5W6#1h zkj+DH)ktKool`Wm1_xQ!r~=UU{kk1)>&!Jo4#2#AY6Y5OLFr?%*lx3*zkUt609nO= zzQ{NyAj@VTok7qAw}XBx0hHK5%TxcE6yA#v1*#8o&eG58UOJ`?p)5w{j+ouLqpBa7 z^p3|;&W4vFjyNLB?=i=VzYn?mg7Gay7XA0vqWy^N`z?witQqX0nJH{pI4GVj3I2UGziq^8ZXyl77Gj|tKx$FcBx=-W&wD%7k% zAPGexf=my`f*k=n*2Fu^T_eO{Ca6MT1;QI1#olzoQ(lD3exJhFPKKXiO|AyjxwH~o zA!k|5QaqqX)$zEdUxs9O+)1Dn7`OKI?f&7Hb;$8jrJ_yoIDHEtbp|S>+IjN z>}Rp0m7YY~#p`}6qqr9%ugMdXYfkhKeC+poOuN$Sph7W7zGK^#`$`$OMypA}wK>m^ zAYc~vi~4R8-e0o1Elwlu>;EsPxHLr1o^X?B>LdvzGjKcT;=u&buNN3&FCTCaAcD$z zdWlWOi}Y2%-P6r*AOugjOQHEtnYzQ$kj2S7e?Pxa*nnDeveEZIUI+$xtydQ!u8VEX zn(18*hTX@w5AWZ<;4cSfh-}blhInE=i-aQWpolP5ZJTgqIYrT(z>CT;p) zmlzGJ4oz11kP&;l#P+TsBr5BcvO-Op)UH5BA}T1#G|E0UW80!*%+&qe%!$h`v2?$8 z+mxpqizro>f}-N%S|S75saEXD*~*q*J69?L3P*dmu|m+_DRU6_RLa!G6_sA3#_!C* zjH+lh#|lOLeL$Z)?4DhbziwLr@}gxH7vA-^3xR0aYKCG=eO;gk3`~<1TBSCVkCHP~ zbLzp5()9bKOZ=PaH?;$nn}jgLdIUxHT_nE@>q7|>id)1o{W!r6NgFSsS9SCKC7(-U z)G*D+Kd-GjqSHwQ_2N03nVQAfrI?A2C+#s}gtR#J=dU|3k;^*>81;V!q~Np2EV3c# zoO>RlKJ<-fjE$P-GzE`oFzVK9SE386$;MlinW~(3tvw~SE&_FN*z=lq-djLvI~ z(VMPLwOHj$wo|<+be~a{=Yn*!1CmN3$?|T6Pu!D2wLPi+xy&0}w0lfKzjIt)D2Qo)ioltRVp`KYbWJf0fgJi;AAF4u;#M5%9qT-I(+RodrarlDc! zs*yJ|h0PhT&fjC?scGxN+oxEl;7E&EJT}5SD6!N+!fRS>8T%Xg%egg_K`=IvR7sgF zj%Yu#kbL~NFr|%$Hi7-c&CR-2yYu;dUu(Kziqx(Z)2MuVCYsWf(p;5u)nUq&^x#|pg5o>n5AO*dP6UApK-E8x3dwQH!gd_9Nd*mJS@T%fQrarUN#1}UdT|;Z=|tO9 z=uVRfAC+I~A;}uAiXqE+e;_&dvEw-wfi1)E9&Ikc2J-Or8T#RGXE(HFFLA$06Zv5B zGSi2$98(-ID_*>Xk&3m_GDk>;k9KJx>Jr_UcJ^$ zBAX%?w}~6OUfC~Q{=Pb9>jfYzA-r%~i$&Jeos}A@CSymCQ^6|d67TJ>l&Jm4jOSH~ zQ-^U}*VS^<-oc`Q`IV2lZ*LGzX%gWZ$T)^-KU1TVzBn*MJm5<$h-w3UC%FOpnWJEr zO;B(^kQJ)bNIZd4uj;g|usfLR=vFeX(IBP|rLWy-iW0l)GeOTh^q%NdRlUE&#d|n% zga4$R$FJGR+ASU@8G^&?EHTnkQ{ftvWICgcM!M79`-P5P)GGXbW%;_R9S1+%s zU2gjJlLOmzPkhy@qzuMeXs-wQpCYDA&#|MKaju3NO)o;CbCYR@95T{bc=}^QGY`T8 zEk!%@53>FAU1%#u3Gbsm$2l*yau{xKpL-wt^TnstS}1Ky>> zSXbQ5__t?HiGTw=(SW%xFIdoQ6BtSkU-1!8I7dNeY#t2rTFsR|ARqp}qBvW$e&0eG)dgyz4;Nffb zASaM65hr0g&e1C9uV%@M_|l(pOcm>KtQ2a39$Nu*_H4Vg)c!QrKN3gy<6oq8(boBR z+UISwgtaen7k(tCXhGrFZ8m;os`Nr#BHkW(^2aRXOFMpT+(9Q*c1Iu`#S)Yuioca0 zaYS$#`?;6>N}MM7)!kL5feF_tR25e?NuocHk$3sM!dAII%B~$`+cy!~wGlEjnjxR? zt~8FvEVN_76D||wH==LPl@a$z<*l8Y%c6!zW+JaeO1{*?^JlVtU<>V!wI$c&2J2n;`|QS1Ys`y%^AY^l^WKH-j<5(!Dt-6=OAAVP@krZw>z0~%Je**qEVU( zzg#M3w`E+qScwuHeT&U{SofUD*~-@gO9K`Fp?!w@t1{#?c0Ns`Fny;{eDce1dE~t! zJX;&1$fuU}S;93{f~Lt5rOLU>1kbZbcnH2NUiRub$Hx0h+DLvoJ|GI=;ZKD-j`(un zsQ9U0e!3G$V|ajf)q?olxtySbQBd#SIm>K)jfivLNf99}u;}mhRlVZr`w+d0AxaaG zn&wMF>Q4`YZzjuW`U+~=?z1-QHBZqe8OwVDPgTe0?LwmEf|gj%ww z+&0db9UM{fyoj2!j^lPtASNC3IQX3WH2#rg`Qk^m3iht>$l$IFOZ)ww+dg*}R18L| zeA>&LZEcerjS^7DDE6d5%dVrDT^Gy`?BdrB@|N<~)bkhKO)b?0S78}sc$>umKG&YN zF3JZ1cOKvJxR}dr+9|nMIz_qXPt&*Yb;CbT<&CLoE>vI}wN8Q>78y%dGH^O*-`OjF zRGuZEwgCpyIW*a0zFwW_U^rAa;Dz&r5(ie(Phz-F~@x* zaf$0-XocH-X~x*c61Pb0PNF`DnZb8fxx3giWELDjc1+xOOSY{)c~XJY zMbqCTL{4|B^Q(!wvzIs4%v-;RCZ|6o5L%arH^5C8Nq9aIweDE~0kc1vY}fO%UybGO zr9S+tPh>Q_4WvV0vyaidx(lDAkgVZ@t?nB zd4>(il^^(GHX#{CVW`}eMFVqMKyJta(Vw-4!>pS*A2A0F*tw1z0PUvd=eVy4)OOax zS4WFpzI=JSr6*mv!2zo8l!hHxiA{5v&Kp`RYTv%F+`D)02PgO~g8$ktRqSOuS6Gi# z*A;bXR0G~76ZG6&$JkbAbmSY<>ER|qHRl&Rfp50}Vu!?G_cA?nm#ShhnvBe$aYg=LQ%gf6&!#OL%ihQ<{ z+*4nKL1q4m$>(7~mTfPiYPNY?_8z)Fy%=PjKMG$#OfVt`Z?qAhLR;YyewA#UO4qH$ z<4bo2J+V|-HEUBX#d3S#ISvxMkX@ot>2cw{N$c$&&Z$%KLuJlnW!_9msR8K+qkf6P z0$Ed8Q6AYec)=V9EzWF-4(^axoLTRfk9$(YZ?s5g9H6U`)G|C zC&aIOV4De*#f7!X%|0`uKG=7k#Wi29UnB?!d6>r&Y^MoXE0sCGCmQSlEY@OWDR4lCA;dwD^I8J+qg^ki9LJ z?JA#s>fkZ3X5%pG9LE~WRM|Dqsj75y%844NB<)|Aq%f6JmP2K|@r+ep^&?F-{B%BL zYTwalX#H?$VOKJTwac0z^USw`MAcN&LdiH`_r~it`?@}ur$-*UGxV;8Mn(w-17;ghIxCqWPx>ZCAlx)w z=i4n!&<~$cu5X?eZqFDT2ERj^Lehsc#`c!`6imu3Y(j*)X5t3UM z%CTrYNR3lQJjnic0(5HRMNSp&%82M9gd2lOW;maBVY)(pf_~8Ko+?gsqhKo5wOJ`> z+Bi$4b7rbUrEhlU>y;yYtXcQ0?Xyd4Po#U$oA8t_y1G*VC9^Q;`UF?fp+C~tt{KHvFHFJ~BzYZd;9!`OF4eCn~1wR@RBaDdGdl9zufa`t);`_*N;m zIYNE`o*-7aw&7`&wc4|!8l%g!RA_uQtFLWIC!;t5(6!H{K{3EPPWkUI1&JeKLJ9T5 zd@su;pL0nfSPbv;<_lr?wX89zX%YwEW*tj!EoiimA6U!0Ie(C%i`&b`<{u;S{8DGL z(A+BZ&}5Y*%cNMQFDYnsBS&kYTWYHVCe#2_f=z4U^0#y!c`%v75s|mfo;g!LP4`2N z$E>^2mnD5L&$QTr=&#RpIoyw)v%JA{!Dp_q&a)fEbR}WwLIbfx7l|JFPP2jp2>^Fl zpy% zKBwLE(;Ogg{WH3^rFQ*!>qHGMXEnBsfAKq?q#u3sWs06)*4Ng=1eH^>PF_A_ULgP2 zXjq&kdhx_}no{q{ZD&MCwBv{*9Jf0#A+}R{jK$+;68o?K}r*%Z+CN;VOg-q}K+b8Xr5+K1iE=cf^ltQHy)= zCVXs@X+7}Gs~&MdxNv1zpJT!cmUQ5y1LkaDSp!Jtn#-*(SHWZ&$fjFi*MEVi_B4Nm zF8FpAJm;pO{o=ol<*3SdLe8B|9r;R@@_AwOvcHanDV{@3V ztv4i4L2vk*wZYLZ)J=C=n1TfC*TP(5%wSrLiaGXuj3d_1K2yKa^u$*kfRypsza$Gx z+8zPJ*mU9?uRu2=(Kf$cRl#sv)%%wa)SLuJfkYhn`8N3`??)Ak$zQcf5BEJ=VB-r2 z>>2tpCeKO`_AnvXPbgkrDq6@@#bN%>9q=1-h$zkc9rHm-$3qGH7m0{D_Qr{qjp7+6 zYkbM68^YMa%3Zf2TN)vW5fc-Ces}(6zQ(7a$^$906Lw)OfFqIn|Rt1oYA-J>icol1}L9nVylP{iKE7=2`0 zNUy5#)%8n6mKTU0u_YaAGAnk>HVJcr>{Up}x^fwGtq_ot>cNMARu%*MvdlG3_~1B( zo#N`e_i{D0y@h6BjnEY*`&$b&}upDwe19=@FV*Q<5-aR2mSlh{8`efR$#Pe~%(X@nd=F*Yls zVhqaZmvM+W_TdK#VK+5cbhJ?I=r0+vj|w0!AG$RrFFGy8&F2JSsIMi`eLzH&wBl8L zrPis+5qVU`SDo;>^`lzI8v)0~#_43_cgv!njgk)@-zQn2KptE9t)$-e(!CB`lHksG z5Lg|qfNS6*^!e3-@)+Ihy8Ktv8L;j6X1`S!Foh_H_enrww?p?>FVxcgbIi~ds4k~a z42@;<;huo}P|f{cM2~q-@M7AlgoV-)^MtLM64nl_az+5H89>KO>C8}-d-UiL4XBg~ zMds?xVD2>l0-Hgj8$6aw;5!UM?7@qAIQu!ewzjqlYamVCse2%+8x~$2(!CD$6uMH1 zK8F~IF)6r-+d|NFQP~QGpe+8$ippEdfeFZ4s<(8HsK`Dv&C^Oaogjk-n78G^R#wDPyr`IS5pYYISq!PXT z7A^|~ND?jfMWr3{EG*clDY6cD_olAM6>w8aMS`sbp{O(0<-o(rh*T>7IiZA?;% z3JX1XhSEFWJsd~Eao6Y2xt^S;Deww~jEAHlHxZz&1U3L@R9Og6LwE_q)j)#}l)i`u zILB%JhrM*6sK4@>uf*YNR zHUP>Md#}ggk*15tnZwKL#pt!Fcg0-bkq3VhpWSo-^c99RwCbphj*gB4r&2(FDx_NZ zMh#|_mBq!RZDQuzwLWR|D5VA1{3UNekH$+oiPsljbU=e#Q&%c4*S%@rj%5tvG7@7{ zctHs6)Cx&Q3C9eFAVmj_2+z|`as;I7vRv=b#tA;&llFg3qe=O3*SRYS&3YpD;GG0y zI;OxFA%X;qUj>KeykX_Vw=w#_j! zrBks%K;kFQaE`b`Z|@!36Df2<+@&dRI*09hw37qbdAQk?QRlUC-t>vARFNs9D>2l? z3gLhbQWpl_J7Q|PCEy@a?MD$co(GDC8MYz!sC0SdMz>}X^a!PyG9h=f&G_jJcW6h6 zHru}2-&dy^ThB(;N}C~WbwR@Z8l8Nqb@UMOl2zEE^sG zUo5A)ipM6#}CDQASHHFrEi zN+=%HcgbE3iu{K4mpha{sT3wxf!WJqk=OjsUz-X5Iqkl>sl|Z*!YdKK?{{4cILIV- zAlXI?c@}twjTPX;oNfBNMq7)PdzfN?=NJuxM771=1WP4<}zXO}#5j?2zc5H~x+rO@W_~$y3Ar$#GVc8qnDF%oZ+~|_J znw;#~#;T1?bc*rZU-2$wgL=GS$4=`PumIsJ_wCHjQ@D~LAN|*Zxd&Vswv~Fn&v;{Y zwSK%l(e&a%9nwZeo_)9Ufo#xw{<62#){#zSV}1e;wBRMnr%AmmH402V%S7Er54o+O zi?gqKE$u?T1T8eqj_d%DS_i#WiQwfSy?WKiQ|FCv*1dwG%~b`^eR{gkRe|Y`3^N^F z_3;27%oZ>I$@tlUQrkR>p7BCI9MbGgC%}eWnE@T7ckWzeJ!qK>0Ky_7U6?|3=*G!M zVx#!pkZ*snm804)aGQ-KUW?V%U>fDL9)PY{ z#ggCfz7J=UGSAh^VZv@huffwg@S7oY z9vR(g;54ic|Gok<9|~=NmkXhr-_L?DN1&?$eW#&(tR!HZ|F z?M<0em0u$`WAyjOsIwA4p_^mxb@j}udDXQIJzGc6loKiOBi=ITZz8>P=?*lFa=(cl z&fM-Y_Nn2z2d!sb-rkS}7Vp{*y6_l)ffdXJZzJ2i6zuE@e%ZN~cP)(1bfh$~_bjS_>3Y(b(sU8cP%?*pb$Hd6lYYDW#{G%<&rOb6 z1AyRkT-4%oT#P37{)*Tz27V$!m|BWukeGi5bO&iu(t{Q5insoVMGXU2tgAU$jgPJW z7FpaSx6rkND#vVkf`2PP|IO>y(Rj~e1`d77DHU-ZgagM8iqr~v?$9}q|6!3x05?0e zc_R4+i7%y)28ismU=QP3`71%?9(=o60nBOK*Mjh?4Qw`m`4p2^*)h z3<(lLUdQ8aj#XkFeyO`jF?_zF4tuw=%bzLqDvL%f1fK=YmCL$Fd+wVqfdt~paTCK) zfN^7+B;t$aL9}42gaZdIrPOi5I}z0~7udAUKH}!nc%G{Kwt4zQY@b+a7dn;cFaVWG zyT({|ulaHTeztWjg};9&b>dIpuK$CeHX0ulOp<}EzP^5vUHOlRm&@X_dA&CTRO=wETC+ z#gO0e5dt!_FzI)}B2)W^8X2{Jz7i8;`hQPDcr#r7`(v{bfs5|QShbwL_26k=k%bv$ zoS?G;(!MA!FHhcjc>2ZRE5CDbTD)F{A}h~&Ox$~FOeAIPzuuFG2v769`meJNHFUlW zEDe-$B}5^g`2Ex+MJEzJq!fX2f$5)vC;oZSGId1JNBP9h!s7uWhT>I*c4y)D0Y~1E zP#v~6A&!o(2?;|CGjP$N&=y?>n1vZ;hO1!~I{2Lz!L#^T z#%KG&(EIBo0PP_Hq5=-b%H$V)bk8{s($}Q!L5PK^Dc2R>CBdTT z1@{K~kl`mH|8&^qM)ciy=DJrO+5{1cS@?jePASa+RM0Wgy#|>=ax4^?+?QM1gbL)i z97tC-ednj4G@gKvnCH4>xmE(FoFw9-%ss$@DIHl;)OYW;mrNk9`788K z<0g??HIz?=@KKwUfazEeqj@Lvg=h8Xmb~~eFa_O$GwTouBlaLx;|j~ZePd5)p?dJ* zAv8SGLJzlWP(UArDRlck5f|rocQ3V>m|w8JPx-ZCNXjTy*u8Hc+Tvr^r*ywIr`#tu zy`5L%`q_3`2>O%~?*?c&M4fL<67vXGPL&Yr)aB= zw%@!(3=;A_tWP_vqq1YdTBq&d7jj~JF~zUP?rRIviOE{va?vMD>wn)8>rHNa5q+1s zY41*MK)^+4WZ3#-VY8}J-@4WD`=eifF!1lW=v(y7LPK(H;>+sITV%tfm<`V=C=TWy zGbZw2uOIG}ZC_yNJ~kO~iTuq`&#$&)>MOC<-+@+2PAukd?6{7a-%$U-q^25cdW}yf zfrQV%DdLhf`5-bcITIlqV*DLUra*$;1GFCk$0JBV38>vXoU1Q^$dSIc_!Pj?Gr{f- z$GafDX0BnFDbAkU+ZAtk?^Z*-T^msHdLH%=Y++-JqW~0`_m$tm_{%wXENm*$c3p|z zD09$0Y=euq^6#>hLx}oP5!h3CYu%~xzXr^H$8&YBL3WbsxPQ1{c>ig5CtAh;c)q^{ z_bBHu1U@KfkXj6YiXf$+h15}6{1%fW#L|*#eTh0_Rei*HEsHB!w^sjBC zUU@4M{XiZf`g81!!v9y$lU$AjvY`%2S4L=ATOIw#CS`7(>8?S*AE2*{!f6$E;EVFl zVgFw3^;hHtI>_x34IG{hgrHn3X%@r=XcByiw7nr-#V2B72#H|`N5&vW$n2Tf?IJdw z^(v$}6-GM%4E_-`deA0f08Z0Y;G3jjSsQLIkK7_h-aF#P6))sFQBF6^r}J79ZxR$E zd0k`-RqnPDOb6YXMixyp%o;+R!K@j^_DmcOiP6<( z`Mu`kgQo{B0t8&#s8`Nu^S;Gd*7)9QPznOU_XhnlA`>Asum3wBj-JW;r{55{h?i9V zP6zUUX#1aomkxjazfb+&(fA*01Im!w19^rY;W#NJeuw#c&^JYT@!~T}275RPC_>OV zPjGiS0b%2i!~{fxBs4`K2N~JGrnbZU_mT^sJW3mM1Gs!(O1F~3){w##ahwN!1nv%p zIv4xE`cZd|E*m%w0wGYzX-YrbK7-Y#&;k`C z-DQLDoS+AWJ@&p(2T{ckh_yT@xpttOL>!2DmV^A{p!r1>BZt`h^Cd|VQS^El`g7%i zCeA^9KeKj)NrhWGTo}q}l7^7>3I5xEDbI;m^rKhF@gD<@ODVJ~-wSb(sKrJxOu zf8rgIY%}}y^JlcM=il!~fXxjq=j5n>42leIc=&Z6Uthc3UAWzdJ+Nm={#!P%O2i=P zj<|(DO^CMY{pn)*|h?)`E(C0-n z+Zx1v<+nLrmD1)(Qcv~U*{yuCsFzpzdbZPUAlYn+mfK|zexWEYJC*gf1Rds&`mES* zX|DJx(uTuZ|2KXA_~V)xPyY?~FH7E42ssNZ&SY->mcqM=I945a3+P1pWHI`{dU3^L zla)q{tEu`2#q~ z+F0QA%Njc5irWl1f>)~?m&L1`;8*0NssRV6SHMO{A&iL43*ezKk++Wj`*B1>g0GIp zM*-nD9_zZuvDH^T4Q)436%vQ6`QaZ)o&uQu<;ol2Qv*TtsDq>ft6+defly^I|0frARRI2fy!ER<6bqbj2Topd zf&f(X1H2}!-|+*m_|dC!2xJAMZic=1X(_9CC=kw)(9SbzVnm$SAnEXH4|@@lwPU3J zb1yFof`A7CRxJQP0ly#>fiI>eW>KsQ0Ingl#-N&k@BGgnSKLO9Bjm(hD!KD7tnYAj zKvB8Gzy1Fl&;PDP{#UBS|3c9C|MAoScxvuBL-`KJv@rs~bd~t@=>RCgOWc|O5&U0UBV7FS6$p)pccoeV2IB zsy)%iy$^tHOtx-Z@nqZ1zxTOa^xYQ;Q59bumxd-QkUmy6U16ZTeH(TV_sa~N=Mj8Q z{t<=dTf~6GIk2SA;hKSDKtUBY4pK;awzhyX98gBf$=Oar3DhlHzH!U_ z7R@2|E$x&B1j?Hal*j`)G-BrheM$RZcV7iNi-61?V)J|{ zlqh5sG?D(6>pZ44B|ff;I!dC?<5CQxHS;lmXWiG^>r0kR}Y&>r*&*{TA*w*>;)4iIY; zmVQC*+T)8E=G5P088_E}afvDKbCn{?_I?n$G^yUpg2gbsp`mwp2=&M)=%?M2ug=l9 zE9X(T2HVj{X`ys8;z8C|Yb3K~^PbE84;WrtXaa*lpwmtC^t~2gF=2M6m~7iO5>puI zt;*v=FlJFA;4Q2foY&I8da+#MXDGmo0@jt>D9b9}7^-}EV;B+?eedJLKwizmV#!;{ zN6KKv|lLAuOV?aE4>oaGZ*=eeO4f)VANAypPEel3PaJ z!T}gEgH?3k^y{$Kou*e2YNE}CAe-KQ{+?K^kKl5mpqJeinb5sH3MH){YT9->AR4`Ud_T=QOCI3%2Z2eki2wl>I73wH#GS_HHhDj)I#Ryfr?yaKjk=fi z@p%^!!S|byqKt@J#V5br;y3R+Ju`+V=Z`QSY;;^L=%7p{_Bk z9UHHbFNVC2to}}0T(k2wHmPZK?w5RK)K6cB`=A+)!9vK!iM=8kb5C~=f{W^kl?C5w zD(7vD08*QPyOX_M^&-~GAl0}x}xvB!Z^s}d(umLbrgq;Gk;tF z;w(pRh<+J8VRf$-6#<)Y^@P;|yyyi_g&}|w+tRpbQk*-Nc&$E+4yZrQv&H(k z+>k3QC#Vj)-m77##h>RGGH}A`~+kC+@{4C-<^3U zP{SH=Ak2PLnrM}Ym;!;Cp5zzJcA!(~G%KDS8wD^B();1VtrhR)(pNCqND+1prJ>N4 zTgtAn_YTPl>DM(ZTeI~cvWT>ly)VQqj&sqZ?528_^JjJ-r1pnFU2EAxE~T<2Qa;xhNDUWkeoYGa?B$J_!72%_%J#!#@i%*iOb{opTeTLwC_fR9T%OaphfR|^$7 zOa{ za#i;V^$+Qz7XQp4JP5kac|i8_)$*`r%|v^k>7xj;#lS9EVF-2nrXJi2AL13y6Rjrb zh*M_Xa0IPX6zsOSg|%xI_%+S^T9BkeI&qvlmuY8trw0UzKovEUxUPTepcSy|reygc zcn=wc5hvBDMJYh$lk{si%NA1&pF{o&e0oKwW}P-9QFFBGUIhWifhE*n2pPw9&-6VhMXY)Jj035`@1=CBS{Kl(_4h{_V z!wU8x_`e{RCsuUv&5pgP$M1150(-uaf4Fi`3N93vozw$H0Du$`w_Szk(+|)T6%>CD zCr=^pf({%Ce($9U63rPS&O}AtI4c9-uoRoyIHK)NieA-mY#27eNTTZ`nCDfMkKjb0 zdN(DfT!1f{lF^r;u!yz=1aH4LAyOZ6zC>(dKRXE;;1i(>(}%A&zIh=nfWH3P7nZOY z_-fG;cQ1#eTyUP)Rv03j7`L{+E-{>(A=HT#rYoS|-c7tL#K%7$VbGwGihjH;pNQX7 z6|3UUbD6h#SU!+bt}wbmuvX*>4`5Xi#rqJV?szX7M|VS>#$u4QN1!#J`sI5x z{__i4>m7UIWgO_=7+ENLn|nFcm4`q?iUD)z=YOgh`Uo6S26TCG9iWhgCNYcd%lS*+ z0OI>(pGb6CPi_nn_euK}=;^q>bdXEnyzfsqQ$M)7YQ)sT>R8SAWx2VzS8}2o~gdoV3ZcjCF9Z zk!~Pt9Lm)s+cBL>klX;msI_Qus8h2pgqr{l{2MHStruXVuk7!SJ84n?WXVC-x^7># z2o)+;ft_9w06V_P@VSPM7HJ={UtxUI16%a|4%1~{{#C~PLk;skOCBj28o2FQD!&qn z2%!=Q{F<@x1_h3zqH?@P!vF7||10nIKl_aTA9~i6hNZ38OINx-KdA&RxoX`yKWA9c z$h^Q=B{KvcHj+idVa2=!?j+bAr-R>Y|MLz|os>siw2n#qA`X=h_F^&Qbi@am!0g!h zz9e-=mQEmuB%2YfDV(cOkZ|iI@%;4)6dd8OY&T&&Knd(d3K!kGFD3ch8Q)vVo~hPD z>Oubns+WcG?$4jdfYU06CZPh4DKryEgW=?#u>7gTOMW>8fNVcalsv=;7|v=(Q5IKT zdGzO#5e=TRczAjWHe2^*zEwt2|8Mxb-udtN%=_vRH3A^uxq5Lsi3%(cQ-|%z`9$@} zd38={h;T7saY!ZsR|LY^IVb}U=^%0|u$hG9AjH)7b@Q`h^5z=PF2LsS#}tvJ<75(V zS^z#pvS?c{n8w>LhFh&{S3wkK7#u1rREJRQG?c^X=#^1(EO zhuL>$%$w%==*5B^T3%1D`|e|o`6W^N^N%d%O;xX?z!*7bhlFMX@Q=?~j67`<>L@oh z3UUbH%u|)-EzkbrklBu6&mrfJReSH;yvfGS;=Z);dt`}V!Q9h{W!Hp%rnM!=jMN)Y zS0yfAdh+NQp|R9&KQ5Zf^xOOI-L!@FI@30H&j;eBrqpAz0fL{K6nhMm*iw|V=QO-gemP7S%3cJmtx*u{VM4}}1k(lvh zUiqlv*~w?;pXs2pt_Q-HE3h^q1!qV{w_iM2jm{p3%j7RXC!Dz*!+G^iCvK|w_*i)F z3145h^2&Z*=5+w5q3$L>=!_n!XWEGxsz69kY7a$5dYq85pDR=dn-eQ`%N&18byC+w zyJka%M$8t2{pqWmZ}pTuQaZN8d7n&qU{1*Q0~%8HD^l+*(0kwAEK27i&wmbh@FBu# zD$b|ZtJsdz-b{wu$fvP6r?bGfQVE}7@?Sf!^SohmdQFc--xOi_-ckfZ zI0xvc9reDP8PlWaF;MjG!n*K(hHdjPVoU@n;i_o8fGCh4Bzq}Bkrtw9NI{9@$MPmA zVd4IwRXH1X9Y2}vI7b9W(q-^(XCh*sRXZj0;BZ7Fl61V6rEYe)ql6=kK_5SU{Dj7$ zJ#dqn&?DF-+z3AX$xRsUBcJXHtFhO@R!UgrwgPTFhmEr5tY%Uj%epT*ij@OCFw$2e zUD_xc8h_O;4c8}z8EHg-3J6!J)i-C9(crPbZwNM1F@NHK{{Yxs<=|o zwKWignw!@>K6I;unwUKEzJ!L(KZ~yBl#Lk@nxM>zW=X}Px1sTUd$jt!+{M!*NmH#|0{8p`SzqT^_La(mB96JCKt7 zu<#|1r;5WeCx2!Ywyiqs&c0ZBIiY-8XDe0cVecyMieQ=E+6Bub%|2A7s&L zNEulq?8fgSO_zapPoBLZ{ zxQJoTKP*PYoePU`sI!7^WsGbHJH%4HfR)*8<{^{wLxCoZ;<>}? zz~FsoWj_I8mRQ(G&H?$>aEjp9t~of<|N2~-+108PJv2;3l2rz2Y%%l<=Q2wE7kOZb zYzoC`)c%hXG%h5$8fbhgLmDB*TheZKd0pg>dcEN^~E(pB>v#3meZ^ZX9ZSU~U zAxGN)b+JP0Ir@Id`jez#02UFW=!+&qIUDSa20H$W97J!7G{k!g0jy7tqwvzsZ^v|R z4r8JC<4hrS*IXKE=To>nr^6+imwIB8`vbHrhG?^^Fq)ERWe8-UamELYM{=l2uNtM# zg3bPf2rYZl45k^;)8%SnL-TVpQD`~Pp@T_oW7WU3B0r-Sgc@JVB32#FeEJ&tzg1x> zaAyS+dlK|TX$z6KfS_nxYCvuh)lhrkWC9BOQ7p$(*v>TK8bArAfLN50yiVry>C;KY zZiphlx&l9TqO`xtxsn?oi!XA^kls%Z6uX$VL<*H$FEqio~ggq0Gja2gFsArEYgkch&jz? zs1(CO%zSzlhcsa(Csr4Hls?J0?FZj#jE4Uz5cgV}CZlz8RHTH)Oh2SO%f3XM+B#|NYuSRjQzre(?yV}} zesGLlv?V&i-T1nK*V9dEkE0=3Ik4|ZMIYF^FgG(X<7EYg>Gr4HLL02KLsnNmbQg6? zk_~DVId)u(@rdFx?;kl!UdzgTm7$wLIuGMDgY{^O&Fg(UMF9u3Jxjy(==|v%WW3 z%ka4HA`{-sw6SNMi{1xBT|3<>JJJlAtpo1a0?p1S1eGLb`uD%p0496FH@P}N`o_Nr zU&1e(h~7HF_>El)kh1gIdt8-*GX##70UXaO;YX5d|skWXP4 zjNvpMs4#B#ry|C_r!uPQaSB;C-yT&89uk2RX8*-Z9U&Ztmc%cauuJg0+)W}gK%1DZ zUP?p=+LKi^l8e5QT@ZQkZ*e5OMrbzP%$?ioW&xN*E=Hvsn@VDx@>=rRj)5%pP^uGp zTSwdtBAQ}I&h`TTqu7u_Nn3ikN=)Y?j%vb}^n9UgBj@!6)?{NM1cAQrI+gY0J-_DdT2iuX`Es((OK8`l|KL7R=-pmR zw-bCO|DsMPttm1zqQFEV%?f`Ino`P1Jt<`$Q*)0byR)d3D_e#!}J1&;F{*!|OzBRSly5 zRiFz{4Rr9fz+&$TVjVv=w(rsB3Ncyb?^BRzgm<>F%= zX?oT?u*$d(Hn5Ns-vBRsByL!d@kRXULF7X^uXP(Dqg$M=v#owaC!l*@;!w9+S%jKj z?<^95*Ozo4=#9jk7zLhI2%jjQ?+eT!;Rt<{|-(`MYs9!<^9^wVv8)!X4mgEJi?!G^E0tit9m4Z+e!|SP2j6A zGpMLrhqB_%-Cf8NGeS-j=aS)B9GJrJTq7H;kHq5^W?w}>!;O|F*B$CgR89N-d&{14 z{+(V1;OG@g$Rz|e3`tid>_v-DG$A-Cwhu~)VZ=)cqU*l@eBwJ=B$kPa&o0O&U77lo z(GEXDHZ(x9t`ZcD^}9vLB0vMuI0z-aP)Hu z@~1&IPY&?^mTd_0x~A7SdP z#8Mw~rHHA7f<)j&(%>-q60}s9(Z5$6B*%+Iq1Y)P8hgrrubvTEs8mBIe%BbgvA}z= z6-j+Hg>$R41-xVcX?#0;vKnn!GWmsZJ#OLC+6?g3J*A{FCIwzdNApI64n`%)SGPD)$+@_e~e zGHhNwi*A_N#laKE%%W*pTzC=4LuQ4lc=G=qn`0! zABy-X*rv$38!fsJS$}^Zw6L$d{=Px7z9G6^!J!~sHii%#Xp1Uf;GgfS^mwTPzR?6(dzL0H)an&ky4fGSq3sFFh`%C{UaTW=M zly=7XT?Jl&`*Bn$?q?aRplrB1c(Ibbzx5jm83-m@gBBNV-&mkNdg#%G=cV23RMgSJ z#vj!e-S4sCk7mgl3)5~D`dc*N5?4PIsHjEJ27Ej4*JczrlnP2pK0%Hwab}0{2d5v2 z)mSJgKbBgghm>k9utJQhdGPcq=rA(8a0h`1;IVxY5M>ljA;OLJAWcX&T!5Z-$rn&M zPl-Zh#ybPVmjLJr)+PH?Q(2JG`J(tJLQi%S`WH7bF%3>63GmfJ^>qoiSTSBvnh91O zB-_}lk)=u$YJ}oVH~N?U=9}*pmwU%foG3?@3M-nj z?ZTKb3Jk`9@?o}}bZ--ED58gv{Ot&#SK?O!`?wzd2F$ImNHu33$ioXLJOgwFDCvQQ zPuN0SV4+dm;D}*r>C_DT2A$#-HqN)URXIp= zWw1y}>zzo0b?!J$qu`^VR;$E}no<=LyNGq0Bqn|kAn)$oyH^6Dls=%vPsSF8w>_hL9A^5Bo`#%f6nHxK6bVg@nohT9J1}=I zsMBXsBg+0Qv42~VCF`e^z#7=q@}4E_KHD?fP@CY6GiP3YTzcifWtGr}X`QJW)mh*A zJ0-1~EIF7kvS+%+nd;uk^osKqANpQ(`qxkGy~N5noPUfdPfMFs9tv&oUsu-&2%n#B zIA7Qq86xne@TZq=VpceR+qI>QA5FhE$-Mhn1%(6ao;@e|6&B8;;gQvcw?GHSK4w!% z*m?N6P%2srnfQaDJq|eK+QEJEtvX7!!Lab31jfneM)Y{%Y6`|SJ{#o zt@-0zSnJ4`nd6k@L1TAdi3X5Sqd+|eEj)4v2IO%p^=k3ffa1zQvt)y_kF1eJM?X7T z49ucb$gm|#4QVZ_VFNDuDZQ($V3zU>#z$(kc43|mv%BTP9>RX& z6q;p^+#Du7rf@V0bjyXW#7U$q9mqH*;&VuA8cdHuc^WAxKo*Nc8>LT6s-Y-3zzp^e zYDDP=UFbukKSh)-YZp)}g4!GWq0)KLLHrU(tp;o)0Kkn3;V_B1LMgZRBE8tx{1D@; zputAUAxRcIm5syAmsm1T>Jhf4TTB{Ifs8PcgP#JL%>!X+4Y++cLg^f+uFNMl5`OXK&V(DemPMjUY?N z8_r408*Q?CR3?mKNv|&9Q8ijT6cLU8^s@ZK2M4wUA}7jIDgBmmS;#U97gw z+Jl)r^$t3DixyFjU6SPho`BN0)S~YahH8v#gEPg1k#)xL@Y4rQv)R|&P4zHZbnZ!& zTS~vM&7+>u?N=>msNV0^UX4CL(XAZE|0W|imVRM_GKu`i82rNQAgal~-D>sQPw(favsMOrpV;q^Ob*;qtFCD)zx5 z#3L6iS!UN4QBl)grqB}j@bdtQh1f;Ar6FPRhvaAqm@Ombcf@hNCyGm;z&im{%M8x~ z5WU)#?@6o*%KoxCakhA@O$+D$F2X++15oM!!XeiMzuSk^Jkpl^xnu$xX(2?QG)=Q- z41WpTYP2%1r_p7$LrUn$lj+r4gwk z*;%-Nqmc6yVgWLyb36iW(Ow>o5xmK#hyj8hHuXu69H2-FL1;&Uzc~j(a4#;Z_Z*xH zP!@ppb$VKZP=upSo%n?EmSpgwcyf>)yg^do-OKY~@)jW%-~>^GJWsiq~NKsti@jsx@!Z{b1N zIX6YcI zj$HV}h@!#Hkp|V%=oA0;k`%8)_c< z*^THrplhb!Z0}_$8(fEg$7EiH$NE$eD$9Q-eV?kpxx9PB}SbByCfkd`;X1M zwYj-jB(g9Zbj(Pr`}kO0)ST$eU~tuEp`Pgz4GydlCPOhw6_gP0*V#qg6UNeC8Rb4V zf_TgV1-bMv19`-I;RV`Ps`LKfs+`H>azpale^Ie{ROaLtlpkm25#42)kl8kc3A38p5u!i#c%2j_MNmhLH+qQL$TR{jJSIOOD;pU+!AC1nQog)|U5g2Iu(icrhnI4=C}RO_6$@}X`o1bsCkdm#QU z$Au|HmkG`97d&8lY?-DOq^drsey&;Ur+gI(mCPS5$5pF?vvUP5w^kygf=V00FnXQz zXrZ!%S=B#ZDfy-eR*%w0a?Sw-*2H@V#tEmCdvTkqy2b#VNB2?gLblunISerIeMUI| zulP(RkPC`akBG+8^tOCMzHF=?^f8va)T|%SPx2S4$b6urWnPpgX~1~FW+TvgU&NKV zSqwloO+y}Ci4BldOKPQR8qWseqdu|JtA*0%j(J0E{ATSZInF$m zy4ge8>?IwhKOsx(Anip+DQ_g%l4npIygNhycT#YZW^Ki_x9{931|?Wxg|tj|_13+6 zkV=^wTvE2}_PD_A4{y=E2l!sZuKj;&U^^caH=}HP4^@$j+hz_eCgy{VsyzO>ZM^dH z<}+-+rkqOJKHY!E%D%@tSA0jz8|lH~f|53q-Nn3(7WOZe7J#UK-?ZscYtRCQ$41UD)o=eZl`74mUP9^Ml$Qjp%0sA?jO5pXnL+QxXtnG%+1#! zGfk#-Q8xX8cY2hTEN0!gC&X5D*zS26o0X)@)_beh3VFNd<(~{o6}e+OUreuS6hEHw z%!m8zGV#XtcLjydvdrgZ_ur(n$wf8K^gsnqVEdjO?lzxsK1N{(5K{ z(ODR{GotMsR6fPn7mWFm8FatZ=jKs!$N>h_qNA5DaBATwe~Dt3W&diK0^0J3FX2d_ zgH1VoXwbEZX<#EKDGQK_BY>{$9gYH$P7Mq!$i|C6aWgt;A)F*Z)WzCW@khU97y{gl zBuWpw^X5;_M;-|-_r7qF6d_VNmfDd@>q#462lkP`k{lc#|2rTxvF!+1%vAj9IvzvG zjbWtPLpJRY-Agg>%8)!1+a`-X?PBy z*fBI>6tlPwp6k>6EVAd4NmqPw8QxzITf#w-iO+Blq9o8>F$Oc_E#D_{t`yur+3b@- zz&`&{aCzOk$Mb>zA# zUhT!OksID`DQD9+$-ilidh4kPzKd$qtyITcbl*a1JFNaUr4U)jvK^OkLQ(WMU<{?v zQX&3@a`mL>|70dQZ~~wnh=RjK5_E2eVa~giC~tW3$e*v4WRt!o7}SPuI}7ELi~I?n zL;XaQa1^}%Jf*6wT=dt`%)SzCAsmFZg+}j&8RfP+3!sc7uaQ+8u_}ig#EI&ek>D5j z9cOLOp*!Bb!0zg~{N@CdF5B^l!Nj#JxEBWgce5* z8NPSA%9dD>RXKE#W+!A=zF4NInPLBsfcvNcL3vk_slM@n=fLueI*HfD-%iyPj2oQX#8=p6Z{(x&TI!@Kpo zaq+Jgy}uR^b!#Q(%BPqA&^`I`veNaB^;)a^>o-*d>Q=ARs;0d$BdhiCHurJfd-=Cd z3HaCFzr1MO)~EL_p4o78(V=CV{gZx~QwOapF3I8PFY~u;=?dzi{)vXLvXZaGp)-%n zv&QZ93)GJ2RlT`1V-Y&1tULB&ch6KLL%~VQX^YdkZ*0`}aO=@TTlI##ldEFVxDeyt zcZZHKDaPIKjjmC*SliT9OZ~=OC6^3d_lr5qNp}m(q+GS^eQ6okV&-6}|EZL$vye{YYXY_B%8Cf6RyXOX_{4a_DqS%Y>g>!>)g8SP7hmY za559lm$X@#m+nQvn})e7L;I$0sA7zc{bwScFJsH*!*XFR|X( z>XkzXd6Q$|zZfvh;N8Qa;ph;fc;8X%-)h&}_2dOF2R%(nVrcF&D1;s{(5K=c`WH0c zHd_^^m1CAf4hrR<#l}FJ&ndqx=6M%+`x=9$(iXn*V>_!^P(5}gP6^AH*eW;zTOd?4R;jeMA`gCrn&+=?<=bXJ#aM@(8}c7lgM}FVv51* z6YI|YVjL+6Oy^mAB`r~7@N5Oux=WIco2T?!1Qi>s&m3#8S?43f^y7gL(`VWr@p(e( z>JbOA*{v?3Qm@Bfa-?@Z+Kj0Tal?SiVoumQBGSYd^6Ak1^!(nPQQz(1Ssw3JWpUh3 z_KDx679dIInYdodi+8$x_z+8s9fJ%wd2qz!b7~A6Kxo!iSMRdyX~}k?_p~k(?Q+32 zyOqJCW@KXkKccwpT=j8Q7jVGB^*1i6w@$IpAB+)p756zrNPA&xhRqZa{3?hRK? z5I<0XG_Z=_cLqn{;|=Z49Pp=9Y4MHkcc5*%eT!ObPZI$4R%B#rfq}^PK}Q-I9W076 zBbPno`nfD8d#3H7H5_*E<2#(Q~;RUC=j*ukxH1)T~7Y1oP4Mbf&-1lo%bloo_=L1gu@JexIM8 zsTRAS&oQoce!F3Eg?_dYj8o5@+2^%p`|zB}A- z^}xI7F*U`Y2}Z14^;?miCmbR@R|p)>)PJS+pl+kfyMZ?IpWWm9t^)(f z3iMCNDw&HUi{-OPhoICXK-L!)Gsw$mFgh^( zABNG5e?Zlu;+UlxIW8~wk|iKDcRq2kOGSEL!gi~A%{wN*=&CKx;-7Jr5KildLgtzc z$4%WTQ1&Dzxa01`WjA=ar^&3QPbPJIpTA2q0uXMIoc_?OF*fqzl;#`xH0eTfQC zSMDJ*++2}l?H0$U(?lB78tE%nbd3N>vCGL7b-vA&xF`oo4iQ9#C=MM?G#m88Aa#IW~)Y5FzQ{eFOr8Xd?m`mkop9a6Kwvm zzb;vH0;;$xcntY@{J@K)WDhs@I!H&PX!q-!hQXY&^4kx~x4XdO;WknY0a;=2`BHN+ zl*>5WE+I9EWY7f-qhgS32tM@lJ6~^wmh{^i^P>T+kU&%8HkfC*qX?4{TzJ3Jw(B-z z0nE@uYO@B^=o*M`R-tUX-i=_ehm&(PnM+0qzep6BCxFQgW2CbSj{Nr5#9~G9!N0!q z7A4gOH*eLcn#e*4&sa`EXCzT@H}kEMBoy%hT4 zL&q%_({OYdi-jK}kD~wmsEp++(U3tW1Qg@^;I^N{UR1pZ<$=@>y@e}=Z;7N}dUypXCwO}puQ~MI$<-p;BG2MD7?2T-gxM&liODp=j*8_!J4T@A< z^6%GE6`#iFRo>QCaEjCg4Cbe8T3xr1Wph#U#-&S_x{-aZX3BTKTgHa}>kCEz<#mM! z$Q32-K8S4Di6~0X0ZRJA;GS|fo?v)z9F`1JXR;T*Gr4PMDi=wH8-l9Ihh>_`=X&s( zQn|l()RwNX(%aOG^pHp0FMo@x^?2*=^@V35@fX~ymM#!(jLRg&{rRuUB;J1iNDkCu zxyV7sridY8HSfRHz6?(q>-FS{y_ zxfs4}7J}kQblF-JxZS20qYcxhGw9mrC2_oP{K*;cMvq&I44j8yxyXOW{I<>+5edkO!$DSOJ9cW+@0o>#4-V3v3seb36A4%r}nHfZ%F zfTp~xbg+WIWQPCW7RJRlah|lZwwRF*^^ZI-dZ3vKSl|7K4KN5*H-E>)|?} zWjFuA*ntZUZu`NN2!$WRdputLuS-fz$Itrk;X@a+3b~MzG29r%snj}34AM0hmjoTf-PeP4dGk<7Q6cKqPIh2pE}Ow&LJ?#0k69*4x{2z)UGAYmoSyaAAoH7~A;LTx|RMyDgiu z4s?Z@>$i)L>?DFIM9^TXQF>4G=(o!jHRqLF(b2QJ3CTd~+w3{RZsg3K8N2cM4lP>= z`srtbI9a8(l@}YV<;6#iUc>-_ZZKA4|GFCTZEO8w1rsemlC4ZP`d{%v<1EHSo@`ho zM}78|7SEmF-VU<2n)UV$yn{vWF7CHqbV5QK_xHi?;C`JM7MVaW6+(m~txj3!r4VDX zcbNqICz{cnS(yZnQPH>8YBAABG?5qr>Ix`$;14MWezYDYUq=mHHh@e}j@X}H=&{MP z`%#oeeEHWSpEw&Rpm(l}&+5hTgo_UX&*FjsMvFq^iHp zza}oXR@1TgM@<}`y}Uw9^qA%`zV*6*{rzh=3epr~x~gWUzF6wFNJ^}JLJE|JLu01W zRlJF*(zVka4)w{G_Hc7jmlpZo9&}GS7|{Jlhr2SVw36*f@%Lkw8no9rhD_u0H%g4fZKwJnbN13Dufc7Ck(mC?X6e1^Yn)wq6^7P4o3~fJ z_3?h(wS>~a^T+3`KknD=O<#GxBg--EM(GlPD=A;1V~q#iK~v-cPV;uJklxJCA!hi< zKQU>xtaBwNqQQ*Dujx9IPdn~J&XI{CH9X-HjEeuvu{@Rf6g#!|m&Vw_=hwF6~VxTQIQYk6P8awAJy(=N*?&j7jy9C`}&iNHtjcDYl zBD{2In#AiY@TCjSh*-UWYzNH%HLJLRw^)FW{RMANG-u5WhD6ISl5~Sl`#9MbQ*T7B z_U!T&-vqvO6UhL?xXD_-MZE#LJK+cW2@-T&E3&qWS?Jo?|C(u84+YlMscEq6cOtyR zIEiYn^`U~?D#-EV_i$XQ6+qj@>s%0*xk!JMc9@WmSYK`DOvsGdY7%!y-aG0P;O`$z zddx0n4c=VCvvLK4iIklrVhyk9_m8~DQ=V(90UgnVhJ*8#x`>I=_~HS`pcN`)NiC9LyZQPb{)G-DqFl4s4_b;4`Ok%dcO zi9k@P&pZ=za83_VRMXR+q}=!!eNwS}C9v*MUd-yD#BGxIl9mw7rc~2bl;+eB^Pb+d zN~r*-9~0{5v|-=y*~t823U`h}_{G`fD`jM4a-r#}8ryE1!H3-wZBGW%9|3ijOEL&# zSI;b)NPr2oti7Z;l=+kT1f!**X8;9N#!06Vv35fi@`P68Mk_;%()EJnERNk_w7RG) z35jQo*dXXJ1@&C~OI&^tMYT#rHC4T5i3@S!Q8s#ADntp9fxJ(O3het|6;ujDWlz^6 z=IDeNUO2+GkOw%=>OWkRgZ8(`t6=)gjmn?H|JuyYOBlGANfAeki?My%_SR7IvbYaE zh_CpOa`baKt_uO2-WR0zp^eyIkNm-gzo;B3LyyPi(+q<8in_JWzt9IHqSHgP4jS1R z%?MAS)lhI3(N%j4F^+LTrzqIfC;a7#@8~ojh+PIZ>>b!e#E`{~fBNwSPCaqrUEgQd zO%yl8%moa&PMEjImd98%2|g4u3`vnM_>$;~wj!S}`65#f#TfYl7ajL5*GeBDP5qdx zv_64>5dcAHj)4_BZlu@ixOd)8*dGS8=#4~9XiCxv>o@b$zMu6b42pZJHT!t8JEnW9 z?`OySlJxF6B+h)H8U^WSMnqa!l$b<#XL)&o!puZZMSWlOYl}m!4w5{2^qpITrOTC? z{6{pabe<%~iU@G2(5LS!npb^l9h`EqSV$(og~xr{RYQ%7iksPm4a33`Utck`d#-C_ zY8t4X)Zg&c)>KdTorPYlWVj%Qw0CUdQ`aZ9moC*x_EryP#oV@&6wF8Hog2F07Vb1V zKo?Wu9WFm>J?oYIR?!i*5ifsaO$8wjQ*!_Pud2htcg@ zY2YO>QBN!(Et*t6WRPubKXjvI&3cLPGxb{T+&RvRmgJzPjbVQNXZ9U6>t;c2a}ExU zRZi1Y;bunef8^3Wcbg%L^M^d;RQj>52|F!UuuhexOr*^N5$=Ad=<2r(`p+J^n_y<7 zAJa9|ubQ|HG7A1#NZK?pmz}F+0!5Ik#LuSv5Ww#vx*EZAgC(DGaHw%rZ~uL!F$o_1 zw=?a;u_J13*#{%GEHM~)tGjk{zLZ9&rPft6S2V zP3TYAMVpQNKW=mhDuBsAr6k|`z)OH040bMGZtj`hh*O}dJBwCV<@~QK)ej%KXIg$a zDkq3w25pA>uB`#vmfQlfw-UPJBHIj++7R$_ zc`^0=EsQai%JUmf?9dr~cBOU^^1r)>G6D!~7ImxIm$%W`RIH-I zla_BMH$Z^*eoQfd{QM?9CwOukhwIlgdIoZVm(09`mBlcsR96_$M!)~IPPpkz$NFx9 z%)y@K3Vp{OS$R5YO)%R*MO4n|)Em^z3fTydCqFg+eW(!@!Mv7dp2<1$ zGPMb3Ps!Rq*H)#QE#k)8$){>+H;=x2jyWMO#vW4A#IR_9ky6O|AX2J()l0N9@H4b| zqi0Fhe`@NTEM=z44|1>^2T9^s6tcRmciMkI>Z+3s9Pqy)6Q#U zJ%p8I-K8L0$p+*NRk|4@XT#-eX?=W)`jqHmW1t0`PEw{DlXJJ=B(Q70ugg$OECmN4$}h+2kP@4xSLjM zGPq76!?|ELE22CMrRqvj&jkCA-`(Z45~biz(#k0%QLDSe7#gj$r9@xXGXuF{Zeb_B@NrJ}ba2_U_D ziQ*)HS_69z5g%SoZf@>yqk{n@(;_~mS09a1BbYoCHpOCH10-uqKLBYL)u;6&FN@v% zy*umlXCqr0_R}XtliS9_O%*jrYEN+WJIDbP>wf|VEVk_zQ6So$uu-#ujZOqo47q7% z$~hl+!X)n}nTAs(*)rQHtfV|Bvb_Kp+h)LKS^9N!v z5U4Z;_Qa8`5&BiKbLVv+HVwj^J3SO`4I-ItCFsV%e3a?o(bFDP_lyXFf{v3`Y{_fE z!2($m7%!VJ9HyjZd0qq_CsoytaY9&6*1pa1^I{xZmCqrIO1k#EmvWOy?z$?ndUR=* z0wH-Ec2~hNf7Y2W8w6LW)XhOcd62>M<3<9wY0eD1)#%^@*~@?yt&M2B&EthG;EbZ; zW+Ak4@|t{mZ&G{dn(I2DdKRubm)G*_<{BwQcm`Gb9R?TtfuA!{ z;$AzmHk3|B;YP4Fd!{7;O zM1PY>_@w3nF3)Y5pLm<>=qoD}SG&R%qJR$77C1a;km~Ty;*Hoba;!`xSQA;PC_C6+ zFvIs<1e9OZ$s8DOBq$eg0w$T3M3TX*Vj#mXyj5n9-tiHr|6AApgfm(E&JD496 zpOeM+_Gf(2WE=CZ)Eon#*G%Lia3$Lq}NY59-{oYt$p&sWO5M@1e<_u7(MKxvl53gBmhTW;7habH$pHZR8^_?dOPr=we%daqE#97>jg2zLf+1b1R8X1XUoJcFec- zcw#Tyio%l`7=X-bUPt^|6Qc}UNg~3j5gHW%@sVB&LOF#c67{C}`AEc6YqHEbOCjpu zT_`0Es+#6)A?fcLa+E7v_L-I@amCq=G&bqMcC)LJkcFX8rucbnGfwJ9gnoj)W0EGX zK^eCi%E~o3*wsYfUy%z+kA}e7oQ&uk_*=nus-SGkXAfa*Eu%cNS#;Vv^!Gf9yOFUd z<>}<~>C2>LvgbjcIhqL-raYskw)Y35$j|I+Su@a;6%r;tkZQ2UutCTm-0QW*8pEu4 zR*CS3ZM1Q6;a;msx0bJoVl&LCmUA$#(`!g#8X8khVAiqt6vp}H%l{5#>sRmVt)|M3 ziBqVWdihjj=PqA!fx5qeY+1AHy4r~f<(11iX6#if1xmP#d{P{3|3@l-Vk0YSbyfNX z9<|_<@@ulEDtGn1(bd#dzu=$ZEhbnp6sJBHuJWz!?%~)f)a3qOcU3*$ZbQPl9`47N zMS#qnbLP#G>@4>3R^2uG6!=n7&NUh*U$m|iw4y4L*)_s%Io-P6i57b$+oUHd;Pw(~ zk;{IT>DZlBpYpf#2_PFnzPdir%hc3GGg^+MD0W%)mq>Mzkk%Re8QrCuLp}Igsvwxk zMGq-wKl7L?`hr>eldI%faqN~&^UMyo>i-(}v-qoCP61laoY6|`v)RwOd>AsKpquul z@liH35zn9RZT^fLwg^CfWPzJjSwF3~N5rbOp(4L2>@r$6clTUm)M}az>?hMfp($Qu zK0%i+rB_m#8LxeUPb9F|I(w!$S=CgzN;M4L=tLzP{q6E>vue=AFpcLnpOV?Rk6%K*1rca^?B4oKN20^hgx)F9{b<=(?h)6wQ_6p4x?@mKe$MKL zbapKH|NX{uYME1ty;nn?E=QZT$PZO71?T(_>NK;>`Lpb%oY7m%vlI&uMUJ4qK_PJ* z4Q?!5if7hMzx$jOAz7Jka6fq@)*Jt=*W$@GcIZ>-v2F*fcB#h^4Em`e4ceFiQq^)^ zpD8tVq;Z@o*0@cgcI)%kWt%~_Pyxi12>e< z7j3|%S1CpnyIZQlVTXQT60j0$>8Fi9y%nCk(S3D2na?0W2$i0lTZKr>pr4X@Q0FJl zBMt{J-nFwo6EscE^6l5pL}}aOb$XWCAkoeNKADSS;9UD$NXx8_TYtD&5l4zp28t=? z`^Tq``N@hds3rubQ?=F)*7qG)zEZm^K#+iepC|La)syN;phkz`!L}1+TR`mg98eOp z9ukH}0-JdAMJN=< zI(_t}C{3pa?&9m*&<}0e1rw7gYO90O72fA;QSg5@LF2P~fB*~ff7)GjfG?G%Z+S~d zY0uxK%|v&)&17TCynpSrPHy#}mbpP|jwd?eaoXP1j8^qKNMChEd7mOP zO`Jq8b>5&fO(tQV;9KQ>jZx|RqUZQ+*Da#De05O{NV~|{7QSrDwf=ebb$<8KIG>mM==pNOdHEwO-p>_LWBgvxYyjNN1s!DE0nFUGX$5_Tv>Nihntj@D;cKO%$~B zQVF`~O*`qa=zY=0i_%T|tdiW9q?pORJ2h9M+vV+1ctCptFZEl`iV+-8!lcWx!|$$B z^6pTR!+u^g+g*v~Wi?O!@oTfYoRF>NWY7OdwAh*dBqiwR6MT>AjC$=f^iH-C8Y3}# z-mZ3{-gLj4#FM(Cp>M7sy^dSbjUAhHykIfa*`YYOw3e=pZolYBQ7GgdeqWYq!oK@rFWWG~Fh%vcx?PS;(J2zB71z^&k7vtA;8ZP;cQ*Q!&O)zFk6DwgofGrLU z=0+F3Pum(TirqO_$t1+*KkpXY71sM+>I=I_zD$7aia&n#ZdJLyaenyD!N`o8=(#-A zQ*=QnvzzD#%x`#Tev~tPMWY(Z#+NUwWxun`iq?EKufmCNjw#uJBI$gc3?8@Qw5W#w zwx(7(Xkgt5oaFR!QT=i^FVKs-^Na^y0Elj$b#I=w>H;zqnd?F{eQ-Mk-hH)~8u#B5 z)>i)z9N5WDy^FAn6QP(J$I+3CR|^!oKL2gS!Ifb2v?*CwsTV~Rb8zCWSHvRi_5B@r ziW}ieATza0o70WZ0gS@SxBY^iEAneYP}yT-@oIdr+fHoGZ+XP!_Ii6h#}V!Rr!Y+r z)nHZ#&g(gEZ6&4hD8q5&t$u&<)@vzuAGPs+|9{#$^JuKsevPYk z!B&Oc|ZbNp2;d7kIz_q*@!_qsmU_l`(`7oa^>vN+bkF&?b?is++C z5~{UwTZV#?Sa7z@y8W~}es~JxhzZ#c`BAcd@mSrb_$)!*?V)?@j#gqfSk5=jX_S_d3%a4$=UpCi z>xSS4>Ao90+N0k}q|~}|*?vdmN=b=y;m;E32`Q1hmSML9{=G^Px!>pUZ{d>lO0iyd z?7~H}bScwSAl*5;*&$A1b(>r9E;se!b*jZCGmS#CP8K$4)mRQJc8(=(22@HC11Df7Z0b zO2A^%?Uovg4^uHio|A44`-2Og_)&%KRs8HNZEtkayp7zJ|;hp{ak95+*+8Rxuyh zu|)P?R+r$o>E2DHyTjyuSzrAW;(Xid5q9&v@DMKaM;ZiTsZN`{E@?+PpjAr}1M@!# zP}ui!*ZNxsnJ^jGGFWo!6wVLazqY#hW9)#o?p%&7j+y8o7Q$PPzEItpj;__JIx)Ad z*u**=7=Gb_g6MI3UiwLOEAiO(FG<;D>f9(j6z+)mP4dpHwRiXjenDcw%{1$jrw$!uk1W%PUb+*q-%9?>oFWxMH{>Ph~buJJGROCzcA+cB>Ut>%!pf(cwKKiS^R zR-N|$@)o&Pf7b&4ZwYYt@c$h>RU?U+g(xXxp=Ltjoe3T9Cd{mXaCc!p;Ytg`rQuH# zRk#^s5n=cWxTS1$=Dn&SYEGH`jaD%5%!V6u4PyUZOeYh1=R(!A`_7_P&)_6mJNlmsAUy+Nue2U_!24vp zFS8ROb|b+H*v&k4L0o6IK)b6+z47=n*^VgKSk6S&d12qIB<(h|IW2mab>$`A>)# zS|WxAUkm8?zO(HsKMqU(0+9Cz1;MTUcOU+ey3E2O-$22N9l@sfC894EWvEeC?^nQq zIv_7`f_CiWG$M$a6uDo|#?H8?)2Cy&gPbnCbF^Bhp5F5$L* zVm9C2*YD1}x~x;?VkFNly=2b(lF`+8QIAi+GudcH`3U>9+rMs(iYz)5tfL>hWRs({qq@cgqZ~Df zLJ^Wciu45GCJ+Ekn0zA>K>I#7#@8 zU^TLmshj3$?p=}{8@y}~-kVzD*J3?$qhCPa75%QB{!dXNX8N>;y}dfE|EM!>Z^_S{ zsz^BKB;@WiW3JzEJ0)?H{M9?*A@_oi*>N+PUZg=B=Z9IBk@RaLjq|K~MQRs^LN$HP z_t|x~QQZP$?5pPEoGmoeKyzc1v+sb-R%*M5jA$GSMawY*nBA>r(kP#P*Zhfbjp z{@FGIidVrSTR35MI9so)Y^Pu!GC!FUJ?Q1x_pG%1{|&nPCU8Gz0^32g#B1_s2jVCNN>W?dE|q4ZMpt>VD=vR<;vS zIAG!bdf1A=PF(>Fo#N>ZZG1ZW%kBdq8kBWg6)!~Ab;5r8WwjK=a1oJiH{cQ1a6E1xhVII^jJ_2Yb;axONqt)#v;HA< zoH*MaB(s9%n*&jq9}s%v;?<7l#vl=PvQmj5e95@bbWd6khi8iu{&~a@oR|Y)Fn}9w zJkH_-5?b@dX8`q$E~6YSgbtsv?ZYbE8hb$gve;P+>fiw8RQ&PsW@2|&Vluj}{{<94 z{Ei<wMCey#KxaVaOm=d_hW%X&w1|XT`j?oU5_}x-N)P4ZD1O=SW|eIYpZQ~!I*#G zZ(KRcf*B)gReWYhJcy*65T(CHcy2Vs3gz;uf`Z?e%eutX0dh8o% z{-3b_MGs>t#r;wdP6m~Sp&LJuoX2zw!>;UVTtVu^>gzuc^J~IrO?I_lPT7xyb|0_e zSr%Iy()Po@GE9fb>{Mw3R4(P4%5gO^8ttI*dEnH_d;Ik-G=9f0ytl%D!BljO;Q@b^ zi^X%j!Bi<0fo zw3^|&jVJLe@s(jLtn49lj@!Bxz@BF9Ljoh50&j#cke~KIsW^&7dr6lVSY3C0V{&E)B{Y-$wxzz?5Y;X^h&|nv;sVQ6r3|( zE0k~|U2q2}%!othgQ_bzhm3#~a1T)vEOZpS>4@o01WqEMc}Grvep6MnzVH*^5RJhh z0^GJ^!OF)2^DNtMW!b8G;lpe_aYCNf*uR)SK@ruyf()9lJvh}4!lk$<%>i9Ycxo_c zEN~p;os1m>YEas4uX1hPnZISV0Eu=A;P* zjaV*S+zti2)Ax-!dx~G3y`f?)A)(p{h0||Ufy_?(`2F7lcR4=>aHM5LxH2Q$N)!Tx z<5QeL`WZucR}_yu#&?p-r4?%SafGnwqfmfk+kI zJfKvxRC7W+)Jkz+gwdcauL{RHH^=gM>vnO2S>t0yr_N(8r4{jVsLDjC|LR^#a++JF za8P4}4?d#(iJajLn+ytfGX60!Xgs=!g-cT~o{KK4g43QTW}f|#6Aom!+aJ}%OQgCO zK{g_4*{4}`W2CTAesbjkjE1C9fbRzL6%|;y@-guyd1(wc1>=Gl0!;l@nL;WY0g;%o zVLSh|rKKg`GEAP=VJ{ksCkjH((NY_^`oZJS9SlHfGwU2inXo-wnycHVRTrdMX*kpG zgV?MUu!56z{^MxVkBsydI?mg3y%=t(4XAwJgM^&4=Z-hE3p@^Gwd(#XnH?S>vSYoa z9^01TbyK_=K~z#_Ah+lBzMAP?(IH!W?AUa;-{NkE@ZFp57GbnhK0#%s^T{kqAM=~Y zZjdFleFj^)yhCu3uRaqCvHpz~a$Xfa%zr^VbQ5Jx@ekGJ$GEq16cIuS7f~-#&7URT z>UAMUI*z8`o$d-qr03PED8M<6`U+h5Ghp94MI zS9k7T(ejN7M6NrfS3rLtX4`Got*UwQU;!N~kEHyj#CtdqcfKHG-tDwV9@`Q;hNBdm zPIJZ~cv7DSC4+o81eWe*bPwaz+q9DxPj4q?Ui~^3=zM8qDk@)s2B*pGU$~5V<}d}$ zfw-Vex9Y|nCz5DE^=D?3dav)^kGmtwwV^G8UB^e<-KK%9xU9FgH{yxt9bFIg`{(ix z8Dp}(lCY)ni_e)^j}Mp3!m2SDS|BKfohPU)8wWwsKtfGCOu2*w#QIUN=Xy(dOY`3w z3WY2&$Bh5l*@k{L=fqmYB>Jsaw-$kIMU8Py%G53Oxr*toWEx^>Q+y#{khG)L9SGQ{a6rH6j z`rxa~+fxCtBV7e{xo^5pX$*eEjh5Fmn{UOx!Koa@wLEs~O%7d~|QgTPU3|17K9b`3O{E=)(q*#5` zv1{!EUMwtqDdZ8bKg^}gl_M^BndPh@_pgRA*aotv3W+&M>OA=IVV`bnX#*YmA(S1b>yP_p-^k7we}6);l_l}dpinXb{U+2zFMnn_V|NRq^RCPzqdoK6Ppv><7DYu6FBgQFxQF=!u^uwi?;Qukb~Y$ev^ zxYVgdgzG^yE^XAVeX`prUOsnSwkL<-&br-R2opd@PZQc`jKcHN6YW_Gl0?eysMm<~lP zcpztnZ-6mGw#~o=l0wuVtLYA)Oc#x7^t5?aHndf*}-ND~8cRITcvjs5IrRjMOafd3{%=>qKd9@sDzW7Vr zeFQm}(7tGlxOZ6HEohL=6f@gHQr3|>XTc^?j0um-8W9qAN1|>85@pNhp1EZ~vvrou z6Bwgdukaf2wp%lyaq*d5d8bzQm`V?-vQ~vJv<|(IX@<7M(2b#YXWmO-(!q*tpIu+u z#;G{wi7)@dw@HaJ+Bor1Ap5)p3 zDckiEyFXkpR~GxJspg32b19{q;gaX2v>=ai9JZS#9}q;hUO-gui_~$f38L9zk>+Lc zJnPno-!*DD_B3_66R}(>nJk=>yG#;&gf+;T+Rl(=0|l34gp5XTGsP$yiB0?C zonOoMU_|vR1-G*JnjtE?kRb~Srs8bojp8r2rwKed3gG|vO|cKn3Mf)4aR^9$ODRLP zh=Zc-yMnQTu?LUs`h=504OSvrUDrI=6_m8lyD4tp(vY?Vh928}(j0AE0j8hAWrdLp zu5Zs~J3*VlzlI?2)^rZlE0RGKWmcbgP&@gN#N^2Qt2673z9dL-!6<==% zt$A>o>7QG6C=_^Cc=+6)#>K;Z%2=mb7FPY@%)5OXge~_3n9i@YRKkpi=(Rph!_9Nb zdCE?VR5G?g^KL1+fD>PhNQg=ixw4Fa-^ymH!`SxCztTSY$$5ieyv$B1txk7}ZMW+C zmem5_Yt5$phFj=??@1R%pm3Kep|H*y&%c7dx$D)lb*G|7s4~riDm;wk=`C~spMy6K zlGLm$@+MzDOI_X*PZbYuAM>4kb^*VS)~|)V$iyGrZPm*cFPFb(!y=hRJMqQoJBzZ6 zosKu_xPKSF&hA*wbMfUaehrR*@1&1moRn8&cSN{qpqv8#hVT16*U7bDRYF6mK?~(b zzC;+0sYG$xB0S@1{JsWdZq*EaraVow@3-+L+aK_DVB)hrz(7*(ku&K$*plw;mzp^n z>UoHu;;App2MV{ZhM{;?=IWZEe7HQnF@`O{B-OqimdgFfIgI$%{NoP}z7SfZVJb=) zIoBw;foRK?O;vgwBr`E>OJFz>v=IQ z+0DEr{bZ-dP4iB770Z;+gPIbTS%zcYI`7jGDqh0GqSU<-_{)pa)(d6Z>Cx7$5Or-H_W(UOyb>{t0h497q p^Iuug{~_u8zunznVXRwOm(BXUU2cu88u{dh)U|$ly#LhY{{UR(G#~%~ diff --git a/docs/benchmarks/cpp/samplelist.png b/docs/benchmarks/cpp/samplelist.png index 2ebde46ef282607539de2881bdb0dcd6069d079e..bdaa4f05d19f8a40c4e81ca0c56d40caf899ef67 100644 GIT binary patch literal 53635 zcmeFZ2T)XN)Fp~JfFdA4q9B5jTglNtRzOg45)jF;$z@=&ytXkoKsSi z)gU1`b()0a=+fzv@J?mvom%*xn2Vf_%R`5!F777I<|Ha6E{?ViF1A*tm)*>r(N+%j zH~GZ)1bHr7y0|!^#rgT|{^JMu9GorqnO~1t!bQ$FD(a$1NN6dM|BhIsbiqgc`l}>+ z`;kZD!sw~^N4-SR-*=a$n_Bc;VbVQ%sFq1TURFk9u0u#e0IKmbRS@W8UBG z7ldN3$;&mqNWB(%f>eiO@PNQ{P*k_b^VNL7a~${1!VNc8v6(30{&Y!X{CaLPJm5o- z#{)_|5%(kizJB)k%5C_j$m6Q)iwpn0QVu@O`tPgg3uo^9`|27i<*R>RJ-EYu`rqIF z@JjK*(Ze@yoq2Ql_~EN(lx+X^F8Iu|@7wcZ53{v$yDIT{!#O)4SToNYZRONdP)~ZO8Vc!3?yg&{dJeTt>(P<=2Fs7 znL|pY+hW2=a^^(0LG!q^Z^y`6oh1T@iyH%GnB9Yc0yBbRbU{RWl0-(W@6P8o;b9)B z?b)=LBqUY0Q)_ z#d4cRitJvReZZn@5`IeNfT*^lK2qm@(DU(bP<5M!%$WCbO_8grYJ%W(Cf~JAtAVd3 znfhh+nK15F(=poZHSu__I^hNo;-Or=9=)1bus&Fe6I_O$)KK{B7FFfx9zN*}~1 zu!|yfM3oZuL5mdMSO+KRhLup+X-#dzm>D^zNLe;+qwY{#d$*cQl0%w>GgXCyu9s z$X~m~wl_&z_oE~8-rBdl?v(vUi}9-Q0<7bc29fN#Bby6@H-$0{Bn*drPQ3p=SXBe4%4=-3D z&K;@obpl?W1MqoOe4JDkSKmIYTB@{J>ZJ+6&Q@GhN}y7cL~Wi7Gx9ja=y*$Y#I9z& zZ_fW<$9Tx0Zm-LCb2M(#`};YOPv&uk!VcWc5P~vVom1-e*YnZN0&i*GoJKys+t7V9 z##<&3LK)ZIE>1=bUd%HxrD3GEuWddK`}271PS~RS(Iwd6t*&7WhS6g4ZuMt4|5OSW zD<(8Kh4ph&YAP_fK2qh7Gv%1~!{?TLmf2syST#~>=R_xtSZC*UweZ&^Vw`R>;yrRE zb5YHbRjG_`7{dtclE-$6_=49`scgF8Uv1}EzxCYpE@f|TQX4h#5 zo=vETlnwuFa@B4yF)QB|~rX&75t`2=ryw1gZ&+X4OPUc z)P8%9z4iX?Kn8nJ?Gy#q5VTjx|;`kEb6<&9$G5dPlWAR+niGtqmg!rbYS zQTh68XPRxlp*yd{ay6kj*>8KUF!NzXpSQk4&AQg$+FZAd;XW+;=)Kjry4D@5?$0WN zRm-*dQ(n|9MX=!Gd|?uL`zj^^8Jhd&db724hfD2Rmg)}nt?|AqjkM;Z{MC*`ubWR> zzm&G4u#69_QWO}SWFw|S%`|i@7EAi`oRW?lJNak&ihTGNCn6G<;x?B?s}|DZjIx}P z;PYba;G25ZxGfI#dL%wAN%4@3#d>M(&8hiwPt0V|!4vAB7s`B6mi!6xv2Px>u@SE*l2-TSW%)k4d#Ob)~TmmGYIJ@eV zrs-jciC0uvx#+p{xLAJwt%)Ff4sNMx*{IfDMN8kVWOW+Z)e-nzVuyd;BkUKnrg~&3 zexaJsF2tM<`7qxn2~tXFJNkw_WMjT62$?p!;R6t0n)}1hB`C~8!(}QMeXBVHH>h0m zdfUiocOr^YtzBv;)uICyTP*HGn2|8b#gvRfFAnCty4{lu;$71I{$?F68I8(-NHQwi zvTEoxmtK)!riseXuk+h$#@z^;xZ%IuouZ}BKl7ZsHG~%5mW3PFxW^l_zujNgSI*1WUdZ{vcjWts;6pOJ6VOF#F z+fmX_o|5yX|O`R)w0C2Bh9{jDiUS~Ek__S$&=LSdA#d9^C5S7y`hOU*_bWH{qC zizRjzitvfYoa|+n2kRZbFgR2@c^YPm&%~Qq^VryVtLVqV;)9;#T%+_v@tBZZ zDgX2K-shL+#jp7u>}{?O*^@bl`t5EdMu(a3PSKzvsr_~_vhs$3=NPnXj&cX8D>!7wVO42;Ig4Qg!v9bZh#eTu;+K<3TiaAXq zUXb0)tV1S8uCwP@7tUv8#~w&!H*6vc1Gh?-CFnBOmEKMeptOB6z{j3##$4O<;F{VO zfD?*MZCUoz)Pc51y{HH=9`5!Xov1fg6#6Q8=&vq({eFI$z|cOA23To%3Bj2kE;V3w zP$G|8<+d8A)IQy87rnws&URe~rAt?n&h~R<$}+OI2G-Qv@0aB5HD{_^@v$e*GsZ^= zy;C4xrZ3 z`M6u&_gMftmY68BPK|b_$ti5+a?O*-o{n(3KQ)pcU+gfud5MHXz#+?5k_}dRr`&QW zod(MO#2b>3iPH|{6M?%2N$z9sypyTDh!-1HN8N^V$E3*Wh%@iS;}kGCm9petwsZ8I zY80LO(%qNGT=_5)*GZqo{LaaGO_yX?B(7Ry^XtRyIamijYOZqLkALlbjmGPG(}e=m zrv(6-@4Y=61wIi{2gTfNj7qu3o-b&Xa=zNn1X`nDWICc8zjzTKtv=522y zj?rNSBP|T?QgkftkdctYiyWftHz8x5{l@;jOT3!#B7Xry_EVtHx0E{Yry{AP6lA!x;~>|UQLtsirLOBfPK9?o=yw&Lnj$*UmF(z){q)ScSu!i z{sxHgu7&PaLi=7%nzPWnKk9J!cz?7Zj)$=h2^3=WU<+S;ds_{Q{A| z%dGGYYpQm3B2DpGRq~qs7}Q0rZSZEPc4ujXir0%$o~=N-W=dI|-TTT4)6b<)oV*=Z z-a{wF_N3}G&MFErn~ zm%ur*kYg49YiLZNL>KUO%Yolg1#W(%JttNqa5iMOo|M0JWhdujckV(S`J94|jfbVc)tbU(Kwce*BID1iXAC?ogBX} z!4i*Y#|_CYR{?I26bcICtNhYuZtT0RN%YC+^mYVbVH-X5XvM&d8Sah{br{`Np%9oh zvP0rbg0!z!6258IMS;cFg?Iq*-Y|VSz(fq$B9byDDtVRjSuX#ap#5Zei0)-}C&-2P zc5pHW@0dM)Ki}Pi)taQGV-hep_e%`W? zw^5p|A)aS!?w#bX{#!rokA0n)zJvf#qGJJqi0E%VyjW&=DzWP{QfX(ubLIhvw8AC1=M^Vyp`^V|$=BQb`SE6sh)d~^$~GNn zUYWw;KAEsrnGU0P9;?XA)4l{KEre9CVorsdW8N7E+#vqStC&eh{LQl_9{OY=F?fm& zD;oJzi8CoWiXD)Vh3dS^@|YBPojBwP$%e_?vatjX)x>xN*A%aH-4oGansN>8=YJc+ zVEgs9YPqah?yQ`qN3MO{-bS^3kAE0%>6f+Ll0Lm`pRtpvvfP@b#7YBIH-!S@8(e>Q|0Yt{N!KPxxVNAAj#RjZP}s;nJw{8pZfA5k%Z_uV zFYL)w%KlnL;x|LH2%#>PgDtG&6U*w&WGGTyV1s?;uiL$m!tZ*n`x4F~v1KKp$(t|{ z#M1s9D{qR_FD+7}X40L#+Qw3QuwbmZCWNPMeuV1SDm%AS8IptA5ET3boJy;W7gV0n z1#S9v}LAA*-59HiVeV01Cvr zRu30jJ>2MdsMfaOH@Tw2jPEVA)hhev<*B%cOE*6^EiRYz8&EdJ zT95W6*yQO7d#%l`9;itZ{|rj27NJ|YlA~6n@xx^fx#s%LKd-hRWvjf5>bMU%X zck9vioOwtuf{b^=fyAK-F`+6Imic{iI*B{iLTsx6q}%IdF>&SUfQ z+4-u5l`ff1-kmn{oeC@}!?r~#OPLp?no}+G*1jOjM;E|fv|5oVjVnf6mcQzn`&!Nd zWPU#PHNH?*#kBs>kzi)!PVT>N6qtY3T;ygZ*pF7Gr^o7X*}*!U+a+|UvH1MGy)@nX z8rf7XFzz$SVG!Y*^;|mT9%3Vz&{8|=_&8zsWXb+X_y-M}jz*n*q#TAF;Z>oa(>rnF zp8A?w*w_n{kL6l(cz>be{V6FYpn7o0K2EB=>&f907E>jdeyLK5e3e9hn7_wfFsB6k zLzegUl~&TmX=R3FR1D_2kDs4###H(5PO%Vo!;;Y_R0bbHvWRVQ4e5vx#ilBljHF_X zeP|jBMfn+aL>ny()9&Rj4%6g_jq6pwtduma^}5x2Y^N;aiCthov=)C2Y#>? zyMS$bU#0kqoey}B)rxIqNQH@i?RZdvPVD1m14DF`bg+=wRMsH_e>h{{)JRQ~_M&YX z35LJ7$sJOKGhL9mb#be8dy5Vg{f~oL?abm;Nl2c}m`);0YW%&r-D&=AD3`hqQOKz# zgE!;;2foR10yC7pfB!i}@B*I4e;d}?&`9G6pqCO4c}Kx#KyEg4EhoDRuQHVJqBdaDq3KlBOT#xh#rZM z?9c7{+2w3{+va~=^wjm?kYk#>nRRu^!AQisIl34D%FI$;pE{&>-~z`;2#f{BQgramG%yg8ShUu(UTs?pLooH)WJ@JUeC@gh$7?%rtulloUKO_wbGkWP&6&WM~VRQaN` zdyNXWl;f9UGmG}IZ`j0{1Tn?d0vvMLUBQaDJCR&lwb|^;)z1JXB*SlSJ6)(x=L(bK zwX?_FAW%LMhsfX(>ngCD6tM=cilAMAUkkn)v3=F)OPbyc}9(>t6v zOh29mzaP?19^EdVinRGkI*R~K1dXd8G>&wgUj2@*5oL;!lMjsV#TN~t?o)lyxUG>; z7PU!N@q=ALHxNm^BaKHsoTkqE=?%3%l_-b{CfgnU`%wT)tBdzGhBFZAaF393a6esf zLHlL_%R1|Zjc$WqZ^+)`rQ)O(+%eu(`>MrQW}tw3KC8TU`N10W$#-LrbCWSVHs{T? z!%_qA&3gpYJ>|vW^Xta`>{L&Na%&VwK-eVYas+%7H1)hr7IU{7qyh3Sz(9w*J%XWW z2!1JXvLvbN_D*3ee-Q@XrBBx)9Z?dJ01LJmvXg|i0vdlbcYw$uSR<(R{P)K^ki-JQ zNgT8P?utvVrgj_Q`=7S+1;%X+eu6>;#ssPzYMBBS0=?Af=gtnb#HW=&vagPFCOY2P z9vR1&)8_s3Hz@`rTm#=GV+{`DehL4n8v1koB^(LWTf$!^6LTed4&aR zHHcl;XqD<-0O)s)#bZZam4sa0=&##%RTXIZb)oYG$J;OzV`D~&pI-h?4BY8VF|c_v zCT?s>x&_l_hE&?vTC-75g=9AU!kwEWnYnYm-bub+Rl3)qY)93*T!3X>PsV@bKx#}r z?P%lz_n0Ky?!P>FPPuNoH@^!sD-CoQQ57Vs;^GnKmT6Ym)Nm);G)^l!u3G6R4wYsZ zTb_ajN}|CRFGd9Fk7RMp=!AqMrtPCP&DWmhdZ_l5UlLxgGtT1Lw>#>9J4A#q4gMl0#^9$;#RAy`Ekzyc5m zr=WiK+pHR&X7$Ipr2b9dFu|~jPaf1?VCvK_pBEFC`0m``lMY0<)4n%SZ1kgR_qXvr zwd73Vf-Hm+G&+}&3T5t{Me@6;e(|wx1Q!r?I3kT1v2>w$SkGVj38bc57|SzNkkV&N zV$7COV1-JQMJM%ovj-l8PP{X__Qq0u7!v=km=}lxfY+)*-VoX z5Tbu^$h6y!IDS88)euZURCuu!P6xW3{nbk{%su9AGCPxdblCC_^A!v!jcBh( zEFraj7jWn5re^g?r^u!q@xcB(CEJWiMrm@HUB@9H8dr(5GV}7DTzXdNF{|#AamIe{ z^6K`ty_gM26p7w*t1bK;@Er$cBY0QDn02Wmd=pNZ- zePx4cCuFa|Pl#ft*MPquWq>?X`O>!ocOdVh8?kpr_MtTHSaDMon~pAopcdzljmEW` zFAkUSAJjRF*P289d8Y)&glhE;`phLzC=EZ9Z(mi#uS1MK=9l?_EsfY$b~6k+$`a-k-g9u6@>kZONL zK2X>KEHCSAI)T(x#zHhdW8T73bU%H&1FD(n1FWYD)C~Ozl6)|gW4QWv&=!yF)i^`ct?sK zaT~UqUdHIuO?qG5VA;vS*J!*C-MQug;d~XZ4p_Kdv!fq0mAsr#eyyP+6K|PrVpnrDNio7_JBxa z!dW4leO%+lltJ!Km{WaW+kvmj%VD87$B_-VMuk^OtFj^PJK$;UOdh9J?pln+I&(tr zex&GRuyRT-wakvlkY!roa_vrDlU?gii*aS{+~`epos54Mq;sUPYp-U^SlNnuhH6st z0j59gGy0}9?b+pS2(m@H-W)~;1Iq}Vx+sPOj8$<7U`K74&?I`F>)ow=>oy&LoL^nH zsXU+3jeiRYPnIo|2H9)XTgiDIQWwYFVdWtU(6lZTdCGz(nb7x;68ZS#NsXOlh(Fa< z8~Yb3VJEHlf>s(v zG_>?iD6I$mjcpJ-w2<@=6Tu==yIZhacTl_V{1o#wee)R2Re~1O4JSz{@s#GXfad+i zK$_KCJX+<*ijWR*H6Wo9MX8g^fa1cLI~8n?pgUrO6kgNOKB0J|aQP>@1eG2tzVh4eNketNQ0< zLxjkfD1TW02z&b!Xs6e{Z4KWAke^hI%&) zQKBK0`B486*ZCz6w(}xN zNS*ka@DEN8_<{bY#oZ4KVRPVlri3`G%@&M#bc(`Cttdho$aJs;$46}{`SxshHCa4m zwG3k!lZNEIYOY?3W$~BvZ*Q<5EL>a2zd&{{BT{$$AZH);bIU&HRMGx%yBlS7xf{C` z#D#2pbzTQ5lZ*a)11i*4?i<7MqA33qO^PdQ179M!D0SUKu9G1Y16cBR-U|f^`@5&r zQvgO~5AE}TF0z}rWkm99Q00RB?!|Gj0>1{ybFPMzEk0Wb z3&h5NlkZs&IZJXs5kQ)e%`-+?LDx*RXAh!I-zUv2nLL__df8B}!&Uq`oODoBnwt9P z48kjw*k93;YZON`XN!;Z7~1WGl4c|1bd#^_y}Wuap^{&r z==2M+O-{ByE~AWg>IooWH(Pgvk*=@z>4SU)({!2=zSeu|;V%PT1@ovc9v`b3DDU-b z?Vc7S#mg>_nUYanaSUCQy=5GCM~p_#^5ckCSzg~4HOUp(8e_c2;@K2UjMRos3C)@-_MS%-cY_5p1u#n>UGRj z=6(TC!rL*8<-ZSO%)mTK%PYLfShJOZVrm8(KgnQMtR6A!0O57Jk>5{UTG&g)v^@l@ zJvW2`MX_epYkv`;r|E`SQ+VFjBBaP9gd= zeKUlH_+_)*Ekn1#^d_`G6E+_MpP17`6cvHtk(}}WlD&W$msROF0A)1+H**>^VM8u? z1gjH?4_HtlDy{44nm(lsjLb#iDc0Uh{otf12K=n8&rG0iSjokJ<}O~hq)9zv7UAiM zIEj>7&Y~R~EKFOwA4bK;U7qm`uDCH-83QXa#B_j{%%3XyI+-Zf zxHh;6^2v0+;LQ0;V$OefS~P~;wYC6380Y&o)n?WDKl3zx*kE6ju(^}$kQBX!>TT@4r%O>unhn%y1!hKV=iy*jU6kS{q`0rZ<45gKgBnou%Tgv+8CELS(Tr+oU@f^ z3@jVIq$6}WrheyC{HBoR0u39*!){kMpVEhwGaHpp5W5)+wVn9p2%50jjc7!OK&dQa zuXS}}N5-^{1xfkT$P+9Y&W)EtN*8D{Ej6j7wzVLC`Gm!)zA3j+ET~aDT?+xWqH#`o zXW^lhXYo+hGOY}++8R6JkR$N=08Apb>@O5`w1<4Rq$pV|9iE{P?bOIN4U5+iu`kki z_?u>C#`H3uWNItLZ>?&bW#HXB!)nVf2d@fgWoIEWZC%DB+X7^t{AgL;YmC{~98_vh z7B~-~&!N1=*`ZVP;N>#Hi@VmuzOg+Y##5-6i*Kl)rmb)aKZ_T6Ro|#M$6zfRYyc~D;%nB#qytGZ)Krx!cIoGs?bgcq+}zpnq$K(j@w;KXAe<~{{8pP9BS zYAYWagr&A>jYko&+4VT@-CLBrqf@884e5PrZ_bIdQ^7f)d^f0@Df4Z7n>Dtc7iB^H z@}Y_5hfwB#X|?ot)VJ!7*Gal=Us`MaZn!_+^xmIPnT4Z-($B%8 zAAa35A1QYtE+amT+xhp}B?+y&JKu~Cw);n3i~89jW}?*}cerzlHN^kCzRQ)%k3^%Z z8#aRtelkEd8N;N6?0s;fe8sC+TqrvCDQfkU9~miq8KS0@nP&flDl&eVG*|gUttk)j z#c4LuvogUwebjZ=FX~k_#ZRKjo)&xM4pmxc6t0DNnI9r@njtkwM*jfUY5L!K7(9M}Q~QJpCzYKZ7q0_-_^J{U^Lk zbbBjl^@Q7%Mj13FMBCec2}BeeR2pHM&OYPXCmBgh@m!}sH#b>yfhj9?%wsBIH(6pj z`l0i8Ola;si~j#uY(iLft;S7dU!21cz0ZRYqnBl;TI(^1)ZTA}dt8+oR8einq$lP7 za{#Q*AF-0N=fcwpEPH)JVK)Q$v-4)aVQG_pBm4b8{!?U49XBDRFf2E-d>?Nq!uQPV z{?hCnsQB`6THKm-BxC*udn5D$98D2UpUik>EQ$1HkFc}~JTHeHCB_v_{-q2k=rOx7 zGx+XzEo);1(CJ^T_2+P05Fn$|+-l-ykpFbr8#u)~j_cYp?cw(=wK|4cnt@w$9bwEF=J!+_@#MWN6rKw(ktCJ0FL^&-z8GL2cplD)$ zXE`Npv4Oa`G3?O4y&tyxA`7=X;+nJw7D3iu{eB^N&?RkW*kqsNGCzt9>rM;$7 z#89P)Pot8&yQ& zZ~?Z76^tiR>}c|Z4UlI=UAAT2fb0h1CjX&jlzh|)5WuvSe`gi9bfQ_|O6c9&V6DrZ zHgjhIB9fSjC~hjS*6UWQY3}isJQCkq>waG#FBr778cHKyq)}jwZv5$KrWivP%F(nI z`OyZy?Hm~!3$&@6wIu~l5RyHG_%I)hCnwWc<$hNH=)}d^BBT+ZZyRDFZAnPj%RAZQ zmUiOVH2!V9%K0exf~rJmJr1bZ4)RJRj~3JAWefaq8sX9dsc3Z%e47SS8wY^=d&Ljb zOul^Fs;-_%u*u@Zpv(RqyKffe+}A@dc(kEjb_nJ2P{kF4&injWz|VtcjWXYkaz&tQ z`JXLR(O*BCoQl|a4G$(3s0UWfG}WW8M>?1df~40HR7Nl5<mfu{paYli~27q}Cvip2f#=*WCTBg?qGwdmllFU{)f+j4{R>~eoR_PXBY z(R3>}v$9ar$Z{P&fI>Ky-N{qK!MKFUAiD%LpA7lca>p8qnq9Uf>o54Xm3fy^aaydU znI3JIA%p9{zlfCn?1r9B61K_9UVz$fBEhA_jaYa%th6ck`xqMjdBlmKTzOw zgU<|HsW7;3#I)5=oo?xBDV1?B#f89fjFzv{iU9BfF2ITjdoT$@5b$B4{o%AkTf3GP z^T6P^EL-(Q?0zKaR=Hy2HrAViLnI%w^_C-IiQ!9q%G?mfz|GcdFd}8P3E9 zi$PH@puCjWTd29nfq3pXz zp)eKb*LS~B$>=GV zeS+nq4+iaK|5sss+a-H+x+!SM_R;c_p*x((9&87*6uCpBDR%>Cx(ZYc%o-W*pQC1% zcVPV>*rv3gHOop3#q;2$?@>*-ZbS(2$)!qB3-J79DK@FM6r*kQ6Q^Xb++g6%8Wxi_EBlsi-E*n$o1jM?g*BCPWEG#I~2A&qZ zfhJhI26HPvqd4QvF^L!ZctWw%G6O#K)zxLN^_U~HgFa77i4 z)p+-NX3vLkCjVG&s}}~tLKH?52q`Y6Y%t}uug3Rm#`iud%R*G1{u&5`Hij8_Q#!-= zhrNK+n-Le`oKIMP_9WgN^nu>3kxMt9Mk9*LG``7Z1PVbPmNKB=bKCpTP=my@$B4?1 z?nLexIsS9Pd~av7QH4;?i>PmB=q^`(Yhl>q`-nX)IFO3)!35OYb1I zO-=FTDPKz55@=Y$3b-v85j|je%al`2sK2;x$B*4h1)38c2TT5un zlrB7!icdT7E}z#cO-&CTJ&7J6iW|Hwi0K%qS0#`5l3k*zIg_S|E`Al-=Yo>FRlE^K zlX~dfkG*{Y6=z=jJJje4ic#K#!D+1Vt5WA#p(ZK*;-j{Toz?<+WK7OKSUnTB=qNe$ zPRnIiTDmgiKBvD|t&Nyw#T|r7>ce6mp)Sf7KMq~R7KA!uSH__N=>{#za7?@`J!Iu? z+KDH{;gNk$Pz!R!p_mHwG*_2!GnU+UHk8( z@sb+jv~-)|=y1>Lsq0S|%jh`7BlR0Yda^^kw)O=*Eh) zfgf?2u&GFfq0N_5nVBi#_iAnUajNr$NHvsn#F1Q&q?-~rkJgEcQdd%iyw<`o%URd% z`M5W_>)2iiB!53VCWd0y@==q;6YC$S-~w)%?ZKspG0eF-Fh)UVHFPPCu#Z~D*W08udyS~SB}&mw!?}fI%U>|*K{ka%xomO z&~e0-OKYY;8>k(8>r<)hg!Wckk(Gc;xtC0(>$A?(hej1>E!drY zz%?0E`W11xSw0)+lEn|l=lDRfR|RUrS^Y!^#WUKO-Uw2cBW!I~<(~wTpuDylBt>q` zB}5I_X`LmsxWm4@U3%()H6Zyb8!vUKc2N1K220Wh@wQ@>xB9hRk|J5pp3Qxi6&icX z1iZXRFV8tGt!Jhy2%w+10-{;GLDl3Gs&y5Jt%L)NiT;;iq}weB7pyc0-A#iWqwWSC z*smHW1NAjO{^LQY9#ygx%DWK_fA1oqbW|)USEz|oeP%{-LQvNc<^IG5d)JWUP}G8v z4wQKePu`R8MhxUn1n+&YH=m zuvO0}Wc|o~kIHO~Ht-=L{H~TS1h6`i=%voyM!Fnu`tcxpt{QNof^OYzwYxwtc~Ew` z-n6_Jf;+D-bdaf3F2{4T&qxOA2aD0L>F~6sFqnr`oR<%$>-;qR;zj%>+st5y&DVI` z$!m6K%Bn{40hGH|Yr(~HQlyg-A~TF$;BP1F3RB~Zj{XK>i#`&_EKZovC+F+gsB>>! zanin!>pYnr`mFHsTMq=z5hY)&Oxy(hOmfhsm7k7qvMJ8u{%?lcQ~#V|F|e!ekB?s8 zn!6xWazD07k<*^Ija^9HeLPhP0v^ z?7*FMFL-qAG7lTY6V(*ynu;*^*kVTtciG*47O2YLFTAX7-7mieU)1{$3I4^3Fz62` ze*8V~oXrwjYtjFCflr^1)|L+{NznE&)_3mUsXL5xfG-zR$6O@a4M zDOax~YaLPYH1!U^IIb4N=&Yy*k+mBvfGOhcONoeK*abQ)`UfaIfxW*r-UnU-O&h7y zg@ShQ&f)$d{k(!Tm6MqWitEGe!R#IO-{EshhpdJ22uRN;SQq&A{&31D0dQ+`8V9Z} z2JvG&0xR0`jrMrdl_ZxgC99CDv5MdhXbqVJ`k6=N-Hr67^|Y8x#0Gl^yjUbX9L2#x zY#mNSZi3zn>j)<64De^pELMX^vChX&Led(_{3^OwDT*TR+_aw5;l#vcoq`QsB7r&uJpYB76010@}SaFewu=zPIEa^Y-P(hZ(A3Tcn66714pT zOs&4YNfECl=(aF0LN62x{k_F56loERVmEk;T5rTqqBZ3tX;Vdv zxZ{kxtZFeIl}Ug8bH}zH0*(s=7j1o+K(dJArgAI(l18q3Sx6zo$bxjy&Vdmoit#wf z2X(~@cX*#aDOQYNH#zROPJu_Lj*fo}$Sx58>$UYs50}`)E!!|~xF81CBc^LKIoI|v zxTdc{u*(Rkbc0vDCgm{S6u;KM$d=@JLu1?YN2#<7qsCW;niL%YU`op9nnF!~M|wgP zqII9Vk$b9JI(v?e0G`!#O$IMy+krpBhzoOoXnB$@Rtr_uru-Y!5$a~%B_Zrj!khtiaq_10!oo$Uk(>pKJ4g^7Y}4hk$~9 zRt4L<4^Iqe7>9Iij2G{`Cose10|h}hFc8W5?M5K=d-9!oeg(RK@7! zNK%B?pM=_|S)6n|fKcrU<<5(5ieQMFDz2Xr%4H#N$iKbebwg_nC?V-2=rXa&E$LH6 z?Am;A2ZA(GrzZ|LPp73nZIyF^)r~td;{by$$^Sb?)^rK!^hhof&GLzfdll4Jvg#{xNQ0Bi(?5_F+`BWHs7E*;3F8pY-WmYkLx(PB zmucQcl$vx!S0!SmpC7GqubJTvAGq#Cz64A~MZb~lGDO^t@1gQ!nzJT4ad$et4ZU@R zg6nQf`_eYGoU_2pd(8H|^G8X34X~ePO)u_J=APC{MvTN>a8HC+D=0O&HIl>_Xu?QG z!sj944}J$*N3hH%BH6d|3M%kN=Dp)t5T@Ok{eb++%Pcx!lOpZg)#0~Mr4* zs{)4Em4g~WTIe8xlFSMfBYD4mJ9^mSPcHfQ7IVy1%2z1u$H7gBNK}mMX4^=JncXXc zh?owS7TKf^KmO#S(=1Y!LjuTtbYFPj@ykTfa3VF}gif&gk$eb>DR!HDXedY&oSn2%)A1mFM!g&Xg-mP_8sswX z2AxMgf*|+Iv?t%VZbbBk*B|P@KjEwjSC~U}a-~%zR~i^C8eJ&gkiiXsu?vl9goq=u z$rnEDdVTFrwp}E#eyU(mOt&sIzD4@&D+=6UAL}_)xWNKso0{f@&Z=)A;?IgOje+Ao zf{?)J<06=)#O>fD1eJxDtw3HSG_CaYg{4hw|Sp;CuRNihigca3GGM>oCx+^L9$cI)0)?CxI^D7lG# z0DmhO1F$xFGV;$e#Sb3O!dU^yUTn>7fODols@n`fhn3)~(sPB>md}y?ljY&kq@pq< zGGi*LUUEj!uS10ZhCZDW84)07pyJhv10R5wgGgZ4AXrtpuErU>efbNVqh^uKu*Dy= z?!z9L*+JT0#$1q)Yi+O$d$v8Ttl<#_5ET6WKER0(rDue~WsT)lbWAS3)71sa0=-;o zDOm}#93!(2P4S-*iIW%N-L%vx3BV44U|K-1hGe4E{j2I1(z+W))?HO7C_3t(RS|90 zr5IRh)6ZuJ1|(NiIaqS&J1<^C^sZ#R8~BLytT8y45}$?rwuNomjA^Wtb*litGQjvq{sS~vK*SOI zoi<_C8^5sDt=94IhODHPVqxQ>3nf=ir{Roxrx6QVB+>LsC*9NH*H6Msq`?8aU|mCc zMLsM!G~lBmDZ+s#UJmyp1=4Xz^6Y&iVXl^DaqyY#DcbKJ_Wgd|l9_p%&)cbc;b$w| zzF?qEL}g=v7<5lRbz(n4@_0k>f<{;B)fuFL|7H8^9PRTlm{s&7-_f$uGp1W{cWgT7 zP6{6Vp}_3<$%g^4oSbI|5qVlttqJLo@;(vCA|ss(U0!ov(jv2pI~33Rt#vAR+J_)p zXPhhai5b}yy}0=7uhIl+fQA=~6h{nw*Lx3Jbk3pDGJYd^dg9|Sqvr)as>q=Ub6{O= zb240;)rYW1a7;&qTQodDy|QTRG)N8ljQ|b=DZ3!XCYf3Q8Z#B+NTVj>l-zw<0$Y<#QM(hvKA-q8(|YLvHlyYiZ1IID))d>C?^1?L&q39Vw% za4yJ$nB%Nhc?0LeJ$cwjB4iE8ZX+<6aTlRV*5^lQZ%=AZ>v&tP+sL=OCa!;h4EunrdRjP6el9bggaH9Z0Ru_j2!nT%ZDe zBA=2mOabOg3(_=#qYO7uOhZ}a=$9O^GDMg~gC#}EWKc0ZWq=x*v@o?dCaa1+RbUU|6Z#ol_pzY3rp6#&Gx z+sF|rEDX@VSGn5EeTagQUYcUqJRN<)u%|ZZSun@h|NZrgRq*jheT$p~GY?BO9oqp> z*yY=iQ=fnU`h13p<5Q^}-k%P^IP%x7|NC2l5j0W_vq&!#uNd71WT;|@a~X*J7IC_@ zX$b%OW0vQ6#c%7xLG%9f&c@=fh`ai~?|=ANJj*I?LxsK&33iKfVC)%xiiJM;*fHQ> z4!=4`48;K9GXiMzu9fHnMcbZ#=lRdOoA0ZjE9L=XgZ)KrCkB#R>RchmP1x6)!Y@T3 z-e4mLSG$|g0h)-cRKzMiIMfHFh5FpV`2I%OTq3$%34TQTSRDPo_d#!@#D01i2;((a zMzIGnFyJo0NPn969@Ov606dwT9-M=)icZD;hSK&hq_&IWa|E6L{5b562TOIK(Qs&T zkWff+2tx7>=Vck!`FV==z{v&aFmzy?y8ZIx^v?B%pFcspqN&f^fmwV7)HP0D6YTX$ zNEz#oWsG=8JNRixT&mWKdwpxWZFlpPkxjbQVx^{jMn5j?VZVb+vp*)=grP!}MJ9Qu zBmV8@lEnm$HKVE-abL#{3?wa1mHCQ0>*6X0;_L6%8sHsac9kXRa<8P?y=&|HK5Ot! z#hrwqOpJI*w0Q4dBjl`x`Joa##x={tv#2)ZvudtU2D8*EZ@*RjD+3N!4bK1kC!;A3 zX>4lAK+53{YtapK>cq@kG+Obmlv_0`1(j=*W z63HP}zrQ_4SLfd8sHZzxVi}KpVfvJhl;l|~m3Qlv(2aqR(Q8_h!m!E0Wt4Bc2>$5e zHsXXGAuJme7?b3{TA`#78yv!mQm0nYYr;AJ1#u^{L3Acrmy9;9DUh`bM0Xom*+ ze{b#Eh|PPwFJLUbxd=zkcwXy-rI>;E&5`qz=AgT}9eo1I7!>%p%#m|;c>Ps*Fk{a& zag;tl&mQ)?A$4>tK!Fi`NAM@iL5-yd=Wi%NC2B8D{1f&5Bb=*%JOsS;Y+pD+VLS)6 zllHqIQ1&S9%aPYTKX&RfxM27Y7qu1Ol=Y#$Ly8<^_BBY4)5#$SiH|4;P~(?$L0ouC z^#cWJNNE6KAmQLb%Z27$PD8t+sQ0Zz|g2X za+2gh^h(faNM*?5|C95$kPrUQnUH*-!xoogczhIM@G$4j(kKNW{Uk3x^6p&C;o_s00E5YXx2T*Le$-(p|lL*0ttW*54DC&(!oOcMrK{mnIpdU{nq3 z_O2aB(A25?Ebl7jK*?@!hudkGWVyZ$OUdfX1kta>H9>$iPARG9KmKIi zqw2BRUYpBAPGCSCo{#X1W(q1zmoZpgw7P25(Rns1=k8cDh*A z1^EI>U=Ujin!;sdkpu3cUjfSgvx9`b!_1oiXbf2k9|ar~TM_j5p!u*H)N%z{nWNU= z7IAgj;AK8Ma_&~qVGHU9IS)9ep$oZF1n?L89;K`E|^zzrlt&V!y%6hi^ag09$Z z3E9ZE?t(Q)qzgF^3C1DH`wWr-tai6nkT!iaz#oS6fSM|S(Rp7L4?o|giZt0iqcH)s zR|U8PV=w4t??MV}9Ah}~B*GOSePTHCBsf3r-%*l4PH`jAdxf+!!-*oEZH9pVpQT!y zN8X0V|MWxrkPrDE4;qSLsuz--nl4!ZIj?m0Ke6{F&{*&7`>0**-DoJ0BpM|p6opKs z$(TZhP)He*q%xGYL{X^>nVSq5%anxL5kkliLWGc^$WUhIx*xkeyuaW2pR>+dzjOX; zo%5`{*1KPuXZSv!?>$`CbzispJVnAP39ls~LM<+CIoU$M4;N)OQn58G#fPNtuUmMuId48>%qT6?8z?)Q`qf z2tbVlSStu+u@I*Dbd2m>Y}LUaHF?jH`c503El=bgE`LFq?lA72+dXvJxo0?Z*nHmG2zK# z&O^P9GA^)W9Da@gDDe$FAh4g)#6?$X*5A=_4f+uQ9q(}8#wa}4pMH%gfhEW}dqR#t- z4JE35a1Sr|FjM^ zgFTm)VGoVMx18i~2R2)Z(_dmeKYUSnrp_Zk56Y3 zC>(mQYUO1vrDOR^&%DW+(*uY>H-RtbynC%Xo1iqW!flFWh-RYe3T7DTK*!NPPT)t8 zJpnDwd@?MS`_DR~Z?=BB@z38>SoeNL6Ud&R9^ALzbQ3Z#Ivhpml_plmjI2C~H0D3H zTVaT|_Ed%HKh7tLv0jXBssM|$36iusnmRnQ6fZV7ICu~VPl659E^ z+>UBw23bHE6xIN8#Q~xZoZl0d;`LN{ysBS$!JjBl|A1b4f#&ZKI>$yErYIrsZy$tm8 zVEc{fFz4YOIg4FA{j)c@A+@B(KS+Dm1MKA<#} zFzR^xYcoFH!e6I~fjGj%sZaW|82Ga$rrti1(kpr36dNq0I^k!zOn@d$k_!P7A{NkQ z>IwaxOp(84W(W=X+yJ~B0m5l8L>Cfx#hp7@sm{>z1-i606sC#h5DBS(5j>5-Y+Ucp zVwSEafJ!(d4Lzm*-)h+{aRS&cqgDoOyO$J(54w>s4jWd7D_oVukV6MdSPB&~GXbQK zmw@1*Du4qixFMool@m^`vGEwzQq>is7nbLlqSS#zzK~(Od3CtWjp?S9$nt7{p=W4~<9_KoP1jPo%^6>SmMuU|I~^Uv4?V%ytr) z*&Fd(LqqR~k5bpbP-lE)OV^hEMs~+|zsS_C1J+x!Wcfm$ogdvd;iT`^e)~U?iujK_ zo`IJ#a#hh9cf_LG=e+9@8}F*LDQCw|>TZaokACd5ANl^Eau4-SD zLyDSsrZx!-V6HG?5^AB-(A^UiW8Yb}vhidnzshUVzX6Fg_MPQ37-{8!YT(<_UnYmPOnDSbhp(^>wxHf%fnkfoYIh@Y8_Svei#3sDk>h8yt$v& z0YwlLs%U-J9@^r5+kxCSaX^E4Q7Ds}OGx@sVzZ&_FDF+Ry=U9!z9Yc?zU^gm!L`Q6 zO02%Zr}~W#_onY=B@(^xWO5h*E*T25$H~@n9GO&T1JP85lh)Y{+Fo9DuK&nf``F!} zvMUji_m=8>n9}NhFcKwT)o40Z*9`J|ZB)oDL$Lhy(^4bW70PSeP!wf1o5r-zpt~%@ z_Ath)`|2+yPR7)oL$P;K_ke-@yRjM~%tr>IWu=>?7pMLDXMZk|&%J5FtTJ)y%Ew+8 zPN?np_}%N!*owyc939<5NGB&_%NYJNz<;R3PxrG(*?x`lp$D&{+3?wfK~bQVnb&GF zQKI?jMIlf6#WtV78KKsR@QW*MOY+Ah*WNtS5si2&iCyC zF$>qn=~OU|L#nPu$_F(zPE1UTqK-If4r@6F-Bk;YWBHU-;4&`FP zvZ%C8O<*rF4z+E`EBJ?DoP-VE{VYDB$GbLR;xZ9mx(`QPPg zhHztMm6ROPviw?$a$YxT&AG+Q-mb6qy3zvwskZ{A5?yi0edBN$3}HW)+ya^BYlYjp zVyh@1&I}~4(+9rfSGrojo$-;5c5kZzrYfD%9`{O$D(s6rllTJE$R^>d%+T!@V-XFd zb;e#o<-{rwG2}FFm+-4S^L8cK5=ekJwFkGLX;#{zELO_}S?mwAtX2Du4|G)vr`j~i zmImt_e5*g}S(HlPEq>J?O=|~fxhL$H+6l4IvhOHgJ^1y**2!@QSfZl6toB=n@*c|a zb95d*I^neaQEGY0=?^jS6_TOq zw&%mb#fN`T|DI!Lq)X_Cs$(;Lvg8*389x0iwZ`+ljxMqz`BH=W%T>Qr?he&c3bi=< zXaG!s{g>Loe5rREJyesk{tcIMx9`&W3ocz_Z}C}5^^UAe{>})tnKx z$P2RjqA~D_p>HkyuYTODx15DBZWRDG#qq9WP9Xj1bG^X8dY&oRLClsYMT@BBM70J_`l!y@YV@%NdG?$f|!e6RzSb80V!a)tY(*)KJT)0BCL71^Ry zEcf6kUp6`h4xCJiA^ae#J%$+yw-V$ccEbPz()QhX0bRnb`7!ZI?K|EKCl>GrheLxdPL{#xsTM{q%n>4o_9*zm z5&Uk1dFRx9sm$gsdv4^@$6ny8ML+1SIPVM~Rh8W2DlnE%zijl%?62@jDH;GT9C>YX ztw5TRHFBuMp0WtL?wUl&j~Lc7yLfyFJ*!#F&%2#-2UCsCwvTYwxZx3hr7D`LfoF)z z`@wv4IhWwof^CpN>?t1<@)3$c7HbtGqc9(*I->O6d?CZ#*Lft1zEC`TmUngfF93XI zE^xbKcwTh(VGow2`%A-QmRM!n{G0)9q`#45(bQC1>I=86yxQ6XK}d1dFD4sadfuPe zOib4Q2^72}t{YcaNY^Cycl_@{2iIQLxf}Mt^8LIc#1eL_nIs!Bz*py>JMcXN-WcU1 z7l8Mvw08eA_wDx|^Fy6y<>2~wv#2x%dD#`3q=6%KAbhDHZ)`z{#?56!LA6^&F@#il0i0&C*A@Iol>D)K6``W^zkfW zEOZp*udJD6^85-4h~xfUxV@aBAr@2J&yQc=_NG&C_Z7PvgnG)Qa+A&@_+Bjyj+KWi zc0lXSi0B%eXmBs=TE+r6SK!->CSh2xGw@fEEC5u9ukE8shT-#sK1-4282dQ@X%xKK zx}2u(XiQ@OH)|x0(K0z%h(%A4bW3s#naQ1kY$^gH8ses9_@Lx4C2$Kp5VZ>aV!kX2w&` zx0mg}AcS+I=?o_o3-R9ADuF-c4rE->8EwllG3iHl$sJ0kO5V6cP3D27{)#9%O!UYH zldQQ2n*7gi9OKf0B)>3+bFqL+H;%3n3GX`5kCW*?xdK+8{tqKZ{Qvx0F!HNO8C{%dKQ9ge!i?djNkqQ@8mkmDesx)?tC&#JzE1^HH9z<7KhGG+|Hx&Zd_wvr zMSWG~tqU3wN=CZ# zJ?r`y*iZ+m3KhClMsOFE1L)L1K`t1dTx0ANfhZ_W!qIwOR3|-MpKd&g+T1d|xhx1f9 z1h9erx<>!Dp_s><+~g^-6M?BZB~kzTtp? z=lI^usbvecN>Utw0wk;l?r333WbD~@Zbms^rd`F$bLxTEOuyNXH$}PsE<`J~u*SX@JcdCBDORPte2>`!#%jk6h+s%>Q-< zQ@}A}Z~p}|IZf+1{{%Mv;IXuYN}r(mQ)o*+)sZ@zXzzo58&WIxOYXTkyv|r6XutYD zo@5QEHc1w%uO`~-{$|^DC+}v1^iLgkURF85F0z>2lpc6PB{u_sfnq%h|LsY-7u6Zl z7f{3&d-NpwGO(xRv>9TUObC8uuR&l*IovEyp+Suef1cHWQ65FYj%tqvThovN3HEC0 zbMXXsZ!#iK5TjrqO`~Evv8PJjJt&dQk+GFY#!-tZq<_^Qbus@slHX<+y%GL~IzJp5 z%B=lfWx>avfdqQJf@CsEq=0tB$tVZeS@W-W=X|-0EU``fb@@||kGnV&fCk+FZcT8e z$NYu6yviVl3a3CpsFbR%G)@Hf)QNcI#C9InfsUFVuM@ieerNXi3*8B4CpSJaV*mH~ zWp^V?e*`F5(WLiB8?-{i%fzP`!Z)@Y9d+=3-1THZ#*1!q0N1T`l3~Ih_Xc;3zIhge z1DcjbsP+Cj_p`Hca)e8T61$U%B8d`)e}g#H`=r?uKGcp-u1Ydf@{RcLuL~f(?I}`U zI0G6%A3-gT`OTf2iUhht0AM*RwWa=q!U%5jauW6b^KU)(#wOtr*i|f6E z9`24TeEmr8p*@F7`6b;3bffJD%d2SjTEyuuqDp*sciH~tKki@sSKn%F@f*sghoS=W z=$Jf5GI)EEaWFi0C$E~71C`T_u(QoqC^5B70{d-BK{pr)u25Y2CcYiB9aG0mm2KCu zq2R_beui^K=jTX5glIyn0+{Jad8AmgaOPB^)=0}@{AcMJVn>*y3P zu&1kS!!MOz-vkyLOanHtUn7rKNQh;9;Zvc@f9o8A#9Ra5uB->X)`EGC!uo^I+!AK< zuM_soynIFzZGdRM6W~X)ED#iJRt%&|C_Qxv_p;?>E+Dg>XNc1l25a~qdfT(WV(DKg z&AE1SYYFBZL&=;yiguHHAy=u*P|9Rl5u=BcxQER0$sLE*Sp`!VP%7;~`>Mf-!uvw{ zD#o>xW$fh&vN#6RLXEzx#G*IAx{nZU0AZ6+UG*_UABpKb>Gid$gH?dQgTF7T|1HXcY{A_b{ zy;^jM$$@vc2Wfc~Bww+TaQsBJV*I+V8EZD~WMNX$Mnj5Ea|DHHLr##KlR>i0^%ZnL zFHfDM+KUVfk72Nh8Fgd~Wpec;3NP$27EgTZKwY-y#c;7rIjw&=4#7P8d%V`0mZ`sQ zxX7rl(OM|$(HbTyKImQ&L+LdD)e`xUuK$3#J$B0Rt^v( zwDyU0FbRn(aX1+6o8;NfdXv7V{;A%?+*QP}KliQZ%@eVz>%HuaKS;jAeKi0>WvMjT zYjx1T-e9nSRKsV_Sr?8YDf43@_L0sHBseAV&Thy@fEz+&u$^9vZM zRz1z^9YW7kdAF59>uk^EbW`75?8N3iYlsDYea=pJ^A)hF3gDx43U-HUYDg*P`~nPE zJMV?$KFV^VvyOl=lh%7q9iTIvY^LInWpM)2UPjLQ&4lYMV`TvE7_i#?kJ?oNH?D3x z^R+%buN6wUf**%m#_h9;L?I01=5v8aKx1-ZyvRxNfa;Ds>C2)v%^1?QaGtok?P6h( zenrUTZ)4lH+o5@KjzaW#hH&J6C!$onrT*dHL}|Dhvq2Pj^F4jIuvs1#CT3mW zw}XagR#Q;1w51Cf4+UlGQ}n|_T}jVxXI|V*5=D2wE=v^#9F;saCMaGz@FQhp^c)_W z7Tmgf$RvvQHv|b*Rirn^tUDQq8sSudv#L6RY129=OTOdqoM|1TX*#hjb7bZ|C?WE+ zVEHEDzsS?dfW+O2uYSK4@gG6Ca#k}Dy5xU$vX54<#M-_N4tnKy)2a>wd3JkWkbBwn zqFx9;qDZK|W+teP(gE6b@Fa{+fw)#yL1|f}6G@ubkXPO}Z|Yn~;Jn(}LVFaBc5BOz z6aYjADdUwR>4x~jxmfzpE@{sGA3Imr0F&vUnws?Y=i>m$J1iIl3F~>SQo;qmQd<0Aoxr@EBM7*abgIF2ZryE4r&=*+D+@!2i_K&=2|Aaa`H2+hq+!9R z=1qoS?5EXum(iA$%XiI{1t~x?LG5*D)koovyr+`GGl@DJ63!CI0KmcN`uAaQvr(#B zK8V5CRKfhgwarQl%%k!7xRuQ@B3&UFjmGqQ2Yzoa*sYipZ)%2TrlQw1iZB&A`j9)P zQvJ<5t?5kaDT%x7Uj1%_4InDe-xObyScLhXKF8;{%}8(50ggiv;DJMt=fA2h#RYC0 zJ8c-oiO3_$>Ei8ZwgOS~JrB|MLM{VJr(di!pHZBk(rizkZsJ5lbSI#<(9$ba@wRp7 zTr034L(}{{h^ioJnp2<>jHG&c&DJ|Csfa4fiNM*+EH`zSR`Inw1?0jXt?VlPZZu`q+LF@5;hpPfsltClD zy{inD=tbTj29|Yr8C^??>Ht?<=bKHXDm2#_#%e-45GjcZ=l!IoJsu+~-W_iK!&SUm zKRGXd<%X*@UyyrCW-C|hz}*xPSHSM3YJ^zP>au9TC2>i#e?{zW_E+q~fP`mGkn|~S zal9I<)aSdWATEu-S$^@dkOk+Uqz~4@iSI2wYeQ0%YrnDIiU0< z@*CEi&0Ng23Ku0sf@H{^i^W&ma6wKkzp-4Q9QMKGF!-pcC&9~BAK{*rI&vije*dL!gBb}`jC{)-~Ok108RFrA%z+ELgl>{<@8a6P1kN(dZwN+ z)x>0WKs9LD)nQ&t0YvL2{6MqUZjav$NaN7pft+}5+bE3I!}tBb%d2+>p_l+b8cvOl zf0qGflZhs_y0sC1q0Vjl@h_pst`FGGAfLFdaQUud&^{wZ!7?2m@i4FF^uH9w)>@%1 zy`*3#%RyR9#A|_*bJsUjb*CA0zBEVA;JumJ?n(5bKzx&h6=wfMKCDKS3E6XFL{*pe zd@PBp$1C;U-?f*GoXq_uXy;0-%mERYQqsWW0P;%&RX^7Z7|gRej|9M}Q)r0W@9kiW z@9gSu>frHGAw$R*WKiXY4D&cP!t+z(#<1^#TR8F8n}&;LTM1 zE&J*-j2ta932Txx%f#Uz>+y;nWRWq_5d19de=Li$y8Pl}S$|SPV)Q8-u6$99@o;(epU4|S)82uK7b;1-#M>QHZzW_IgLEOOJ594N zrqh{J8PND!*Y;)3xP2@PHe>j50Qf^Vjqs3Z0qyp*{*RVIpJs@54A`$l@52yo!4$&B z58|#1d5nsXaBcEQwme(|=Z{L1#ykrX;E|)M3rR5(_m!UzCY`>2U+VZNc{6@Xe(slT zI%WU2fB=UTBc8^Fp3nib)3C?{s2(zQh!Q@J7e<^Ydz8-}%&DHPIh?X|8~JRC$~``jjm#(fRr<}aJkL^TrmE0Hof3P_k#H3t_? z)SJc)4F3L%!pc_9=I|&rgx~ox%(uqZ+8ehRpT{t?$ z1j)t+JDLTeG|^Bes%pj0=jOqZWYV5$kVxdh(J2%Kw-?Io0A7brHwVCbh_@a`#4+Qa zI^lcSKpt*njBU_V2ZE$3WItww9}ubDzG6IYZj`mj@l23S;omlj3g&Oi5CBY(E_H3Z9geAYAHpxP^!8)pMkZ!;18wkfAlaj{CjCS)on2(d3B7h zMigL(3<+5v@TIH>_?mpnUoQjvDImU})8xY)EH+~dXhEK9UYSIJwD;$w7=ue>$eK8B z&Ty2ts&FnaB6Wn}ceo}-k%M~&XmmBQ_0<4JS`KK`kMAJC4v1uTI8h%*uHS&SXs7t| zgUlKtU33Z{&mQ%Q93=4(=t4{yb{M^oE4(N2F z$QQMd{K&`7>gv9?y6pr=k>oF_8(hFg5aDsmDFZJmWT27vJN~y4h@fOaK=Hk$r)!o| zdB?zt0CyzVhGN%ZB+XyM9?fdfns;w8Aj+G&s z5s@YxqGG+x=(1_qGckAHwJMr?K9zDf(#ffh&@ssn0miWTNZZp#8&>VKCQ#X1C4}J! zs9OYWWIzD3*xhI$30fiVqv;LMxrWdRkG@GFNot>jX5FW=${6BiYAdE2;=+h|x#*tr zSX>g0;%I%NML*qLus9NXbdZg`S{R_Vs-_Yy8Mo&YH6vzj_h#jFi4~~BPcynFu*L@` zoM`xob%J_U8rl2gFwNvcFA-9puVtE z#22oZW4WDSGBL4pYPR3YwJslZp;;q5tC6Buv z;K*Vhg>al8u&MI@V%w~T5c#OL^v}(=2AXFMCK{9H{U%$f(HTCV1y*8zPeWEwJ5!+J z&cRQ|ydO0v$vi*5X;S81wVt_N#_@Mm9fQN4D+lZN+7~ZQd(AKIpN8!-QQtR3hMQYw zM9$8tPQW-~eZNVl)S#k|V}g2?TEz>saekR^CZW%m6@4;T6AYtlB-_amMmD z{1AQ8)L)Qk-VZp9ttX#3b38l%Xk!4yXE@DC2XBf@9xhah#s2BVrBN%X{&^90bSu1}(V84B&_LU<|-{mGiiSlMX z&YgUbH!<;T_UI(^ari9e%`PP*;X{sgTE}9hIpfp*N}d>ts2*-W1Zjp+}YjK2JFntwc%^_RUzhMO+L~sL{w` zcKT|#>ietJ8JJPOnXAaFw;Rc2M&BC5_xIOnBeV&yKRza4=E~!^h6~S73iv}>;*}W} zoLouNTXEr+=|LF+_>W@0(6h+T{krWez{2WhR=8~(PL2flo`;gx90TP4z}Lk*NF2C# z@xrvBgezg4P~BS7?DVy+y`USsH=HJ%mG=uF?wH@UK5vC66>B^0qb9ZX1LzS-6bw$8 z)FLF5tVKK0sg;KsM3nW>QqwU^j0Te;;MAv^yCZQ0(rce#ZhkM-5wzONP%d%@4b14l z&y1XOdcHl2&lITpi4m|`5 zQ+VigY6r3mLqPUI1>Y1y4`arH^83Vd?}m<>A4j1wurS!Nz*Th7@l_-AwbGWVNMcoK zM;1c@f}VR1Z3{~|zp9O585tp^;HI2nG%)924qMUUf&wtsC;UyX9y#e$bF`6jF>Zt*$pLoqpGp zm@Y7IdR<9o-^$T)jOA*6n@iM_!)*z+3vDOhVbb1n8^$&wYsQTQx@vi_YDiL&>zWoV zNB5UI4>CFe8<&@bqNykRbe#*eOM3}@J3n^j#i+q>3xnm`ShU{9$7WEGZCAGNEvK@6 zky|$?G{<+r>_~{Qzl<8p2*Vp?b45BAx7OhZ?#Fue&U(gvH=2@Q9AIdN*V*?pobzv; zao5zMe1?(p@3`*jQmA&sJVsdh7aQx80qoT7`W=1dXzRTsP%h1Vyx*G8V#eF@QDMN1 z?$(hcTBXC;BdJ$j9X>}?xHwBL>0P3z#K4f)q!QJe)RbE|pZ9I2-M(s$$Fc3817Lrt z%+N0a27fhO#jD%cuZFp6u^+wp(QCPq910t%FX0G5E})|U3TgLgR|4%>BBzN!)02;v zBOGsNOtU^{cjyMCBXqBApFV>2_lGt_tza8d(36=)FH_7b%28j15VkP(>p`<$lOY6d zFK{slz@Bg>JrY*sT97c5)`t-bEx5Ymel^`B*xiZJrvk7}p%bSe#>6|oe5p{6u7}y@ z3JOK-)2|x-Ue@wBS|wCU+~vh-s1xGBK#B9uBnMvohN0&GVJ(Z;J(+x;@b6_K8iiH| ztC1Lfv*Ni^m*hGhKImKYj@vS>tnx3Fl)zD{Fv&Whf9xXdYa4DMGi9o9`Wk8UdALQ? z=8)Lg_fSjQ*<^0to4rSjIGbpU&Z-{xuD~L>N)-a*QkSRLGl+@*EAa5hQxB(w8u3~4 zei4vS9l6$vg!U;housa$lYOycCN{Ze)aTcH__mV{-xOR7sJu1)B(77y7SPH9r$tK- zuNtO%fOKE2J+Zh4+dehYu>^+YC%xNf+p15^PF*;K%4845px00ig)x9x;%^z_3NUNA zX84shmUZ0s+Mq;7n0&n~^pBCug~UbVuOWrO(u%-iVedb;PCMN27F6rdt!sCC5t$eh zy|F@apYLAmTV$T%e8pZEg<|A-Y8IGPcxK5bdbzIym1%`(;R#>b{?#7VBU<{AL~FFd z4~$RE)*h;~iAy{$?Y@v1WqtANjDU+Gj`{gg*YJ|0dNnGW%staoS9GZJSZC1^=My_@S*2l30(DH7g{xQ9XI?8c-2PHS{!=dH%MTU3`a}G zCP&#_CzCdiM_6Mb=?BSiy_~i%?^?HnssB2^DqCJaHRy-XR>wp&m2RLSe`Koi%=#m< z6OP4i?3ii8nqt*HD#=K>=btoNInCNwB-9mSxZf3m5p5Hy-{X% z40-vr%y$zVEheRds3;zos$Ok0xFabjc)kOmxjH6TZ}X$WkIJ{vbnlOkhP0Uj*w@Dc!C|Njc0cvGPM6K8j!cU{K;Td>-MJe zfUnf>Sqoh9oqxYHqmFt5QeveLB{)3m!I{Hvx)#lTK?^kC{-fvjWT{LqL;8V12+7i( zG?HR67;$oTT+Ef#FId9x0Bbv9vZ_^(f5`*=ORHLt>U?{8@TU4+n7k-E`1tWxGJat9 zC#~ItVLS?$Coy6REmWxu3|V#6n#aC!pTqU+fSFtu%1J-K)hMO+jE7chVjgwE<;#be zPqlK>MLtRn2$t`hzwnjU%L_G2=8J#7d%5sk%{9@)9rH)8F&EefAO69;GwZ;@C8u*2 zxX$^FdB>v#^Iu-rGe7)F<+$9Y`g7Al&V5u@`_MBgJ*qnzx6!igM3phz#y0u5z8Jc5 zTnvY>a;NM>yWS(iEXJmz^|91_uSHv|&Py&Py`W3ulQxuy25_+3zn@`*%)i~6SEl^L z{cn?TLoVgW^1Ku6E)#2HJ|{gxN*2G0I*`D*4jvMDKZG(>sU$c37cxg$@J^I}8g+YG zRSXjeKR+DQb1iQp%Sb?$oH;bvRlC4#AIiM_w?s;ApG6e#2okr9oQ(SAweYWj5|+mo zdzu(fRb`&tDDkqV&{#|FiB+I$p2U+g&kNM7c-F`zh>ZAl2&6nd{@Z%t9$*`qN~TMl ze6@JEJT7|mi^4WTZ1qx;X&b*U#Hg}$_P*UqIWW7p1k(uWgUwI&bnn_p^Oz5BeA^xP zec4sAlcA-lBE*?!s)clKAyJ?L^n=^cuvBQ!Ft8@GDaTA=EzF0WnxWa7OEe=l|5swr za-QWjcqT^e_Tm)UJVf$cKixq7SuGVo*OqKy!NBiM37qM2!YpHA*SGv3v7>hJv5=c> z`#oo8$Dt^3C#e*g{WazXRaW6H`;@$K>BUb_)y|_$dPN%ek^1$*jVvT}&OyvbQ#vUE zuLiBBV8Y5rfeSo2!LkNV?yMC#I~#f2qqXRo3_9i;!h%XXHQ3RdqMu^6ZwS~$Q3idK zVV`B)z=VQ&j2bc>Oda&_qe8`JFukG=QUw;u$Z3xFx#kSy{Bay*TedOS!Jr*TgCP(B9azXxo+nCF>w*$#&_;+Hlps{+X+EPgU7}y`rs3#9lVS zEH3qI3RD?FZB()DHW%T1>gj%Gc!nU~b|Xir&{5i=5#q(h#I)=V#}Q*+&0UyMNl_b3 zv##6x$)}q=1}%c_!~c3GEOzoe#zWSIj|p&+8h{THFhwD)O~<`n9oN((^O`w}U3|@1 zvz?WP@J)Zp=<}R@tT>2+MY{J7Umj_sxf}#{{SAXm58pVlE-`G-x?s%QAot@&A(QXb z-ShA#5BE1qub||?ycA0aYhn$>47rC_V60K>-M7L@LW%3-Ldo1r_IEpnm7cO+0$$R#$ zSS*BUf9ztAORsTZ$qlIciKJbd8!<{XU#2P0g=I*cZ?w~!acLSqA4qG!TABJ0oT`PPF z++1C!{k|M8xtf7b<0XwS?vjHPrd1n-w{q8&f%M|~oH646hyul5sjM0XS|u_Vg)ysZFg&g60?U)AKbC z2k}<%xKOUSQga{ty;xBhXYX2T3B8pOQtK@EKCt31=AtH?M|VFLI`Ff=P)Nqg2C_YA zUkTuDdPGDQBDKxV0_VAcMtqIH;6_(Bj(E!aYI0KK`z{{L7?aUTHu@UwiCzymH}dhj z2T9_R)UQ)dp{^HW#hOhM^%%?Z@gjHIhY+WeUQOW|_vC~h)M2Vkun?FBM{cvHsIn9& z1r|!;d%)vvispM>wh+mwd4j+Z9fL9Pm{BBuvDs&@N@UOZtE zDCcrsuPRnsxcxg+2~n+?4*g2{N3nL}WWppWE=D?oa_c1jiWce1UW_g>97;3;Tg=lb+jPWLxaM^Sild zm(Sb7O=mjB-FQsHH>)n;wGayBg99%T z%rtUXjK1^NEwrx4?%7_Xdne9J!zaOL+lS(m=$MqX`Kb%qr&+(f`_glBYmH$-b%pD% zJL@W++B!yTRt*d3{6|Kq)vUGFOFE+XP&fH#$q0g&`e4UT=Rb$=Wj+N*w(~wj6xKoh z*Qsv%j#DU&7S9L?ya}Qxp`>vrlxESS$S5rFj$G^v_@X-mdE})z54?Fca@1UCZ8ezA zbU`V4dmgXfj!WYou6%g-@RhZnUXM{uQN|qgxR;~tyd87y3U+9E!cxmvsQJd7eYQC> zO{ z%!!=yv$lO*4h^U~C>#%jt(5vs0BQ7Cy?Wb_3r&N(MK^i^ZW!@NG&0cy9Az$jp9HV# zJUeCH^n}!XG+q$`p!OcpbgR1M)Klne5#P=+h`{Xu7JShJ54&?2>RZF7Uokr{3u;>( zM>&|hh(OvR0%Nrmrpy?Mb%u=E2>aUBUU>@rZq)4M0DLRJx_F#GKkKg;JoU_n6|_)1 zcfa2P!@d<=+J=jMti5uyIOr0_#x6kwA|(y=Z4+Aexk3k@%xe#GI{q16Mm4yNwpb9A zkH_7Vg-139szm#hNOhog(#vbO!m*3*!Q1`6GwT>Oz_IzEui%mHeTtejjqnxmRH{D^ zJ;=K`Gc%ScmpjuXtuJAke8lxBHzqvWe;=CuVke~;wgmLD4m;9*okmD7G zfpSoG<{*Rfpp0jO<@!R5L~-LD*X|ZA@)w#5NI+RYKwuU@VmH4K)mrE2M9UIZ$J7BM zR=}akhH#XPG_C4rgEZ4H8oYYFZc_N`3Bs);z(Xk@4D3G$`vo2{^-Gz=(38%Q$*&(W zqDICbz1jJM+^?uWxQFv?1WL~h@k0b;aDIvej{357dSr23wv5+Mih z?UDpcn}y`(y43+Ad0y3*ajIhhJe72hoJ&4htfcvZM$O*@iLYDTN3NugPc&td?&K1! z1E-m^CWuewzKaN>g{IeFp6_1j*|H(iFV~ZMH&YuH7(t;J^hQG^8PQUe&nt1xc2&y3RoN z=Z2@2Off6Ff8ql)g$v2ozZb9T4iXy1dNNN=)Pc9$4yP`OpJbfyc} zc2kNLIA$wRg6!>qEt7&21&~PR8c`lahdzfe@ETy?o;-E{YdugVEOQ1ne-DNbmNNO+ z5uFVM*8H~8JAAMiWT(3LEfNWHf>UvjxR8VW0IHj%KG&IGWRNio@qsG6R!2%tQjWWF9K9XQ9#fAF$uJ55%RI_ zeaTaf8 zG54Po;g@fbjMXYy>iO!^VPFQ?h={9aB9h(prAi3zBgbnO`HtGn$N1T1;1H`qFjcws z$|9#m8SJ7pzk{+zf;qzh#ag7{1xxmJ=1dy<)j!Y7EjEi5iwwbNb}6}zh^;q+0J}Q2 zB*%l5mB7S``U|47b=1{w*u6L#CUK}4j$sUk`ZjjDHRkx-kM)vS-To%fr%hWQ*~jr6 z**)oOqPkPy7&P?*v4_TE_S_e$+a%1QAZ1w<=PM$OQR!?NlVz4Vh6!Oz_m|2YGTl>g z>vBJD-m^S66P_ou|4_e6)b@D})O1qJx4E4*aaNChL&Kn`n7v%V-3?k^(e($PScP^{ zEf>ci0)3N-OZMB*RG8Goxj~-`>`btT)Aw$%oq=lX(I`15M!C)^!`9RbsN@ z5#PLD5;vP8`5`_s-tZT)vC*?(f?k*lzvG3(u33h#MnS7++R;7Tgs6pgR{~9$)OllDB+cwHA-;0MIm*oM6s1Rcl#Px!G@uF4jZT5*x6v%?Y4m z-?fVpNa1@lwo9Z=eP*LcGjgoRHgurQohEi1T`KqOj<|;$*eTficG$=Sq16Tcv7-0J`BNZv~?TxUQ$an75rJ;NdsRjuCoABkLE#LBK)&kdRFkyhTUGC z{m4?hAEsEr*QirqrK6UlAd;JIAb3@FlGk&NV8|~;MHx8xe)}(7l@Yu$XEcL7W8c0j zb%Lo4IqtX5aNO0o_@n1QgBFv3eZ*py%ggAw0C4=HaT1+L*-9%9Y+FU9A5oBx$jx~0 zXf=L3w1v?(##}|^=7DLwdzrC_HtP2n{-Eln2wS}OppGy?cvNI)Sk~*MJj{$mC8~ap z(VMB8Ldw6o)c`-aFz1n;gEqZ99s*ncYl%}uyV91w6Fg1bX2vV!^&+lAXuupOP2VA2;fdMx4= zm9tPmFr%GoyxX|6HJ=9uQgdsFCTq6#c$z)LI~xGI>=g= zBE@rX3LEl}Q%V02I`N3svElw4#6K@9@BI9e_kr$3Rd>QBlaFxIhP~9m=saHLCd8s^ zdMD2=-y^U8xk}HPw3@B!6W%}GBPn$B+yd_PV;i#WJg)tA$vSAWbfun@-1>yFWh%$t z3!Mp$%zSoV)qcy|ir`a1wUMj)w|8~8ps#UXn%%AXWNmHarN&GC$+Eg-k^BZZuFrxw z-tP_;G!H(hzfMRmWzQj%Na|z0R#$XdThvQr?GNVPt7cz#d$Xx^#?#NYbIM)?rDiv~ zTHHHu)S<>gv25dgm#P>ae`bH-xxvB)`;Uy?2Y48L^vl5Wj--f=)MpOwVlG9CTSWYb z_us(6d|OyJsr1J?%W&<=(*^g{x8~pe&{*|wahrB*f~r=y>ORwFVKL1z+k+=QMAAHZ z2u6@DwR<+pB6iK8RTD~i;+9qG{g!lbk>d-++nozed^nJSTO^f^^ zeh^=%w2R?#7grOBcH$D@wiqDW(v5=Nh`5J*+#XAsi1(z8H#sPjvXp|82FaQs2UwK0 zP8z0v-AJHM5{4#>dNKpYRnFIPcZn(-N=riwR>vDt=l+Q&R8^oa2{Vjc6K33#`56or zbE@T|JxRxCS49)iM1f}ouMjDIths|EL`8;KjvQYP0!<@1-K7?9IoZ|gl1Za{0@aNN zAfaU;h*d^J>7qDW@C^;mo-FoB0Q*rQlDk?pZxp;c<9qVl_Cb`ZbAR?70wb%qnTAza zw+qI2R$Y9IW-uZgxu@ew$2E?T1OMzpo)}9=KfL@~&z+2XG0jz?qC@Do-N{WX%<28| zT|}?@-f+SupUs`aG)M0EJ$FU}N+hLIZ!jvySZZ?utx$wpQ=!6DinT^f*_S#t4brgP zf*>@FEL16(HDnI&ir;F==koc_X7}-Yz~X1jXO+U7Xd(YhZBiDW0E7@8=59M{lr#Vr zeU96{E|sYKOamp&CP_Kkd6K_+Rba=5SZOmnD;Ch;Q+Ak_=JB6VV9CDCx{I9Vv@LLI z%GEv)!qsXZN=iE9bb%LNOAp-GCtvKEgr=r5Y*niTH|^ zE%I0_bcN>UROHlW^@5jzjI4|Bb$I14RBbs#Qs1(-9eV4R zYF4&FpXkR8FCgu5qtVSVs1I1k3Y@zw8PsuC=#8tiO=!UvIS?Nw$o5h4E1hrSA9WCK z403ALl|-DS3aldVbqO-f2Ep6MP`N<%ymk`S2cll-*59;!b(u< zq9mU!3dK+{e9}aczzsmYY zafsxm5Ge4>XH|%kHChgIMeLiQ6(s86E%q3Qe?0^oh&C6y15ps8qUjzSM`$Ua`H-gI zmPuD!NX^Bzdm>c$lk>C{J!mA_eh`s8{KyB~tXWk@K6GBml@K$uSS0;dmsjdj?;yJ2fQ@XA@^OQo8^mxGT(=a_wXd4&VKrqgX zVm2AZuWACl|5VLB()b1nBYM=xw};rNImQ>@jNCC?&Ea#}GN`A=2CJa-ifX{iRymaX zA#upawwcG>_W2IMG(nk}2rqLr&U~QE0IX#Vsivrmo(so9-Kdkzx$K*IbF-RcD{ zw=SS4-c453+o5_WA0a^{b^!evy{0MX+3U7jmebUyUg@Dq%qO-7wyv}oV^h`(gn&6d z7xzJcr2usveQ%3)dGi`vPo4VU7m~DBv%3+M0Mu$W3>aB)djZ^oenhPZ2$jFWm#L?{ zJEmE%d>3Kq{$yrDNF2&xVF8hbuK~j=z-9F33|VcVm1xVD=WFC{vzZ*UYp@!+_w*XgD>4{Pe=H#@p-E;H5VFE}0W&*cg-?%?G zl9@Htzl7DxQf!vb!P7+_BG*0wK>MLMdw_qZhgW>+5koVX@ki@wD<3NaWEE`QS(nnA z@%CiZ8vKO81a7j95wtF}jb{KP4Q2Y(`_m2g&gEQata5BbcvpM6Rc$Z-A zRBNrF^CjWY=DNv-q3Vx@J?#>#-Zw`WO;j%KIQL~2^Y&0xuZctHM_%r2$`4#utM^E^ zMLqd^=!(&?ft<|8W+k4bcbN6WS>IW5j9(sax%%Fyz*~+Zx}~t~+}4%r4<(6d#_FyV ztC#*Ez)`E|P?yrzcyi~{F#q+s3oNSQ0+T23Won+&+PLj$BH38%T;NP1Oxgkkt=Oh) zNPUyke)2K`pyE~d*<%7A4t0m9P>A^#@)Bwbd2oUZ3GC)y=aq5HDou7C?xWy3;5&{U zZz%}_nPbj8Io5X}nbfu_hmD_jrH@c%2g@@~KGZCoB5S3Q?(UzhP5 zRr8WlVW@yFk(2+7Cfv4LB>pS|v_d_$MnBx}@G$Ec|46~%%SL2`(uX3b1XKc9U@vh_ z=yqQI-hmnU1&_NcVsFjPrm zJ2s)O-Ei`{P9CME=7raht{tU_7R5vJl-5a>?9adoS*gmQ3KG(urP~qtv$4u08)oPV zC>U~pls_$;ApfhZUt08C*DXN{N+@#BBM}w@Zl}3w=wF#N0C<$Yg@W}265(yzuBn$e zJg!;5>$VS2T{Z#>J55aZRyyI{)o|_g)lgF`$U-yW_b`N_J7rQMENGogQ&%}Y*Wq{8 z4J~pLWCVK^Un2(iJ39UOtR@eWWM(}Gc$z^rnwHiysXL(e0RX^F!>Qj;=b*qj_3!fg zepXojGuZUur7CbssmD<@!WCpCM+hRVYCwSJAmDI52a+0+KMxy#Xn6b{3T6s8_s;Y* zpud`JDN_xck3r0B+qO*tm6@`BKFJdFK}t5=P+*x20C3&6Z^XSxKn;=uAe0woa!aW% z1D3lO%H8C`^JGS6IzfnW;aTtoV9Uh!XXShI9cq>WO9SRHYS-ehxlDpt6yGsB&um1J z5*f#VS@_L4w7f8z5(>5VQ0wv1O400bbQlfPn@1jL#xWfg!Q^HyP*yk6NnVAGz7@s| za>Kgd%P|{*mT{?S(W-kW^VT|~qxkcEc$MZ9#!%@WBj9s?20)BtQih3Oy0VvSMR8(G z<4x;<97o3!$4FXXMSx|vQJMkpU$AF$nwA&-o?ILXM<^hWus|Q)3j|CnccEOndH#CA z6WYmyV7MY)4!|J;%OI6kFRTsQq)QJ?^xgK=&m@<^^e$su#o4rvMllP;PJ-y{z%RC3 zPAp$BAm4<+3N^)2KOta;@$EcdIX^@DL4it%CC~6Oy(#(JBPelnW>Wce^V8u|fL0=w z@4%|i7n})8V1tXga9gdvD$7xi&luEkSxlKq1POA5sgV9tMy4@8TYC1nJqNoh0ZH8a zDXYlgPE7wZiQQL8a^)^ps9yE`;njkdC81lRUPXRdMlY*rh4cIP=BpjGg#{@RmB$vg zuhTbBVcT%<$@)wv9(O*;9iHCO8)hp}QSM)GWWR78RmAtUwY-gjdfudSz69#GRNh8( z9wz|%L^gOpG=Cf|jYD)b2~?SCMBKT4y>RU#F>?r61`+v<we3y0=kp0SJ5pA1SG#yXAu5|x)Je6=E zc!f#*8&QQz1ipVC&EcE4am%b)-%hn@BtYcq$<-xET>#28o*pl_wVKh+)}X)2p+mPZ z+UfM=3Q~0z`*7V(Y@jaY!!vv3oN%%)ko3M*@KRz`$4?NL>FxqLILvJAT+&o10aq`- zaTm4jxZ`b(_Gv^x5A{q=^r)+=vlV9dwH8%uWI5xAbIy=NF%XnBTpqmFdT6lVF&Kyy z`FZy=Ok6jW++=+K;hd86Maw#aaRU)$J@s110AUFU8E)iIf497O)^ngrFr` zTfm6?n$Gmq^BQ|UlW6=%0Tk%jB5JNzj9S4?>{9<&{DzDT8GBX!5Hie^VBW{=#Cr4) zYCQYe2{h*scL4aN@2i{NzC8|I$3wh2@wSPxUj@uFFrb(WT!{s-iauH=}pu?>1G0=;xi>+p(xj$deEp`)Fq zxQgYTJ{#_DkJ^ahZV|CJZz0>dR_h<|$t!CHMG7&MPFNl%7Jj!XeTiD@le8>9XG`WK znn$7@X8)~k2>Qaw%lA{-ykNfu=ca2J%L51U$_TR~rFu3xboK7%qF2sho30zaV41-L z%d-1B^(G-Ji~u3Z%;oXz>S?&)^@3+g-?NzLx!KtPhxN}n@r?A7`DE4@rqELxtff$h z?04-YCYHwSjZXHUYo0~%wgzRo=PDNMDul*f0v1R@zw{7rVKJMjBQ1(9>kp~R3Kv*- zr6pE>CmxTI(TdR{)#5e{(#5K0A^EukW=C}Oyq5ZlWNAo^+f#(2%?~#a(wH>|u=}T8 z>V6XLz+tcHMpWWVtBugzHCEKEOmgMHK--$8gf}D_{e|ik4!h`I!h~B*i!mSA( z+rZMG+1V>`ck935+}~1J={przN@t0MY=;Bfyb7}Q52$gI-{jhT)E-3cILK4p50Gar z;pR$F>sB8-A`&Zodkc@b!zGuZ35gdk7jsCxKRTgDx+$NR0&KfF)a?0 z*&2d$PwewOlxpVhvD*^ul$@^;sRslmbwI(~6^w!M2yRzvyCL$T3czS$Y?wN#S>%OH zhxRifK>)VATq&ZxA7sLwgTj;-zC81(hQY2RuHRUAxBywEi6AuYw;To?b{m-pKe6fFf~PTR8tkKh|I*M$fn zq^_&_(H(!(_3J7y?hRj7yKxL<-E5Pn$JO_;^6Hv9XU=whpV`W{HxxTKqxeLMyu$4v zV_+aHyVb+Ep7+PW3fXVcfs*TL(~>NTI6XRx7Cowo+Ld)ej=ajvJzf zdmQ8rU^a$NVcSs$DOrD?WL4z@V-vTvW9R#8J<>>d9@rWkQWiIR<+5BN* zcNE89yy2Q7F&yK`)safIk=mYy>)NKV z(aP6HPRdHMyBsW=>G`-r_ zBBz&|Ub2oqu<6I{UaND;N#2{ao^Sr}qr{7&)6sKwl0>PaRyOX+w%>GeUd za8NTS@gTax0|&l&uboghW;2lcB{}lTzA=Tu2~mzU6E96C1-yJF9tS_s?UyzBQl(!v zIeH?=|6GjU-3&{s;-G_?NhAIT7^8S8R*e(Kv?5hwV^3J?6{YTPtFF-VJ#r_eJhHfY z|8AwPjX(Uqw;K2fMkVS0d3h}A<2v+;!jIG+D%|B@uvhf!YyP5#(`*l>xYr2TwERA3 zRpB{$=*y|eSV3z&-Ak4}rNSJ~RO7qa)g+R?IzJIy>et~IgHfa<1P~1isYYTvwMe^OYYFov&qo?{4I)`9GSw zvT&;Rw#{xXQDGCcX*Up+Z75WR#=TR>TO=7W?rh_VCYefuVT)ZT6q-N0qG^ z!2kAoLQHY~;97lWPY>H|`zy3(H|HGWbar-DTpUy$QjDEtEmF(BRwznA`zBD@(^I z=-Mt|@56cYLqD!|c@Zewf#@y*hk{+ZN&zNl8;*aY?eE$4NtpBNcZJQsm-f|U%PJ6K zmHwdY0T_55)ipdgCrg45ihW4~ur4^#`W(}261Cj~WxfLirYJev|CJ5GLG;)uKma8W z&TT~iEFu5mOHC*sUT2x&L%60>T^U7idjx)sP#x&q(`je%cTF z58G)bDJ^&^937qe;A^T$n`B_+M-}D? z&?5ru`Q3nv_8rbcy_YkXqi#FU_D(oe zgKXFSW+Z^xK@J>UR!fDFLdElh(>F0>_5IaK6{B9@MAu~lckQy03^ZU)hzlw1);%qh zzKLrTC|I#&whKAJrYw_0mwIDl7)nPgEz#3Uc59ELv@U`9ngnqsK+zS)J6lBLgYSa9 zHR?a*!71|u?G?o4 zFwz;V*N`*X_0LS`CLkjU1S>brOx;-O9$8fCmbU2W%L@yihBSXQn5ozRXy&Rm21x1v zoZpnb?jloYy>gm-CB#Crl8lq!d=C!Z6-b+hy^;A?8foW$_D2ud6YcplX1^u34G~o^CXG)K;O}JX;2!J z^fDs2Vf_;dh49#WUOZ8DX=%JOn&A&adXsEDHQKh|1i{1}y~b3NN!JZnkhAmd>HhsUEGAE5$k(EJiBtJ?ZR$#2h6u$1|PitO|JLJ)nmhfDy7ofuzQ z#_t0TqseQZo9g>N4@AiHWl{QLJ7uSW%nu6o#uRW=EOL%Si(SMe+pRf*j?w`aaFX+w zoG`_%r-eB(2UK5JwUUxEX8?Z2?^6e+H3)A0Qn>NN;Pta9>AWpYIIJp13!J9CmF7{| zyra^xoxhVI+=fzB{k!Y5F8K$IYxfcHOfDak*vN07^=YPB^~oH`aMS6$9i3Ugo3T$M z%dE(Z)e{7l)!!+O6}!Beh>48ebffC3V zncbN+anX@0rtf2%aT4)?Cb_G46lCkFB_z^orj6&F^Eh}|(r?XrfJH~{Hmr(wy&S9Q z(WcbwKOEnFC)+M-abICJfSh&1nCxY!*7PGSSx60?S8ne^gghQ3Sne+V^kvx!{Ol5+ zv(>y>UcK!T`#Dc|5C=--=pOPi8$%TFiym!?|AxQZ7`6mc&!%>a=l!`7L+ZFD+5{xN z7-lxjN8F|vjNSZ#5usxC1Q5$z&8#}Rv{`YqTI;U~&CWs-%Rnx^FDc!3GJ1e*bZupx zPW2iGd`LR};K5Hn7@FtxKb9&I0)o(@)NGe^&F>b*lqxDm`!S_Ye8O~53boNHPsFCp ztcKyTlp-&yI+Om<%LN{iQb#fb(_I^2#8!9Jp3_@P`**evRQn&C#Mn7w(e`qc_bl;; zfIlo<7Awz+eZ&5l-+pabbWy#e(Xk2Qq{hRc7GTUSnH*sY2 z;FcYlt~Z#=uKkMprlQ6z!D}cq8IomI3^oHQB;v_2B`?1ZGhB1E6!u*AvU4PEikF^4 zPr3!7*+A`4q$lUaJ<-ALm=r96w-q*4#QwOj*}Yc4Kmt@-l1 zzkjy>zUf&$3%0HfF^>BYFLI;H=CM0hjOJ1V+2Z6ocTL+1_P$ikg@nF)s!6Pa&BqEe zxZ$IwGLGG>5L3lxy!ze?uGO@Kt%SH2?y#KC!d1HfluAQTG{v3Tih`&F6pO8=v>;p9 z7r8jmeW~_Qhw)-1U1ym@^8)FjpNgI;deYfZwlj(Vx*>@KskwWujO=GnaRnV z2?%SnTSujd+%4=viBD)*6TvUL5cMo$Ak^6BEoQ_$s>)(%Goo%x@gk;XQ(Tjg=_bDN zwnoaNBLhi%v&;f=i?GTK>#DovwJ{2I_?Ya>-@;A1u61X(f>A(`)x^bcwG&59Zj{{qgU?Q=7*KNlt&Cnhuu zk)vd6UvK@%_LIn7jplN?9E7@jcEdMx(VMk0i)t`gl67Q=HHpMcZ_xMY4o)8lUCMPsG;^%Jr{zfmRtv`o z1Y>iDY?mZ&9TLHyuUV7r55T_He_=Jm^5E`t)TPr?qbS_KRcH54=qU;!c5iRN@M2a z4l|J$cBCegrV(>D*n6JFuAy^uy2IUszg~Gi|LetE!AgqxAT>u+xFe6 zq1!qN-;Z;EbX9a7OC}0Vf?8H*I0~QRIi&6Ixhj{qT?Zg_Ex&(};%TB|n}dPu^Vzv* zVr;jto$uLUFr`Jv#^VzzzI$z&qS#!gA+k-tA~V)K#_`OK)wIZGL;^;qIx%Gri-@1? zxi})Cq^4BNhw(!{Z^h~3siE_6dXjiVj;eTU@5k<}N420=TW1e_Q%uT>BoU?y79E~( zPL08U=>n~!dV6|3lER3_5mIf#YNxhPm6wNha~nkLB{2Dya>s9|p=p-yZ~sL~&tAX{ zm^#rhnHJV821?HtTCv!=+wP-OP@VJ&>Qc`0nS8?~8+r%}9=B6!J75F&BAbNfnEqjXX2`cgJ0;CAQJPATjos!xPtNAfR}y737vXTO(wS{Ltu&qwX9Wow6?%Jx8~ZX9^huUKQo0j)Uo%y3 zGUyV^Ap^-q0;2LYtAXKeKPsr6S^{T!gG6wSGvJoKJiZ+9o6uXNR3( zLmgq6tD_qtqxUCM%#4u{A}vxT=0>u&mrerDXR06Gq1`SP^Wu~^``%wWGoG{h1Fv)Q z-s41$^Og&F*#^2@?JpXtyiMqn>S|2V+IO?0er5RO`y;Bx4=&@pm%iqdxB|0O=ZD7W zWPIVQ7{{CLdVQ!H^VvPZ4rA}rsa2axUNWCh+diKv^&&1`t346IuXkyJD?B4s_2Zx1 zSo0L}Wb&JH0yMA`1=Gf45OjJc>yc}}T3F4<@>4|{eg=-Tg?rCAxKLosiZKJ zq;!M8ki)=vw%^}5=l*s7IQQOl)?Mq&TH@#$X7=p;em~Evo*j5!P4OH#JvkW}**Rq; zIZZOMlc&hYj;@?K0sm83DpLc0i95?baMrSa>g;Oj_=F5)>iqnfz4J3GvwvNlI67I` z+X?XS^YMsq{cGv${M<>Lm)G`xyn@Hx(SldCkX0Mr<@9rUOa0+S)(dhoS&gNED_Mcn4R$>PX@#!lDj_45Ax$(M{R3CF zMul8LgMyCBX6r~!Gt%jaikn# zC>wDZ%F9mZ=91W*ii{!>7H|c23p4O>?Xk$G3cgg1y#8^>?hE(wr~30&g^e^SNw;0q z@(jwi8E&{^{;F@ku(w%8m1U zS&E1@a``3L%;5B4ZL&FYyxu=E#u#&R#OIJC=KejGU+{7EkbNzwTX^W1)*|6!jIsD( zl6}o?x9kN;?M2U#O0>PvzgIFl)%9hil5;Et-k^Iv zGet_r@l$1#o^gdz-al}DT72n|PhvCi+SFl^5#*}+Q5By&7-U4p+jYZp)dhG+!s!u0=!9dG?q9Jg8f1|UrHO^zD zLW{VyjGqYRO+GJ4_$lZ(^}XjJ2M0&DZP`e4>6kas@Q`beo|tVvR%5kVy{!hP?rD0z zuE+L>EB@O_=EP_Ny9$ZKXM~>MWus?>jol}%JbQbvhV_~9GI_q)t2g^3*=-^)3d>#m zQznX-zqhDMZss;D$~3td>?JXq=#~j9ZfZ4$b1Oj-3dE!oaVv5?XVKurK+kR7=vF?MTAkK!Qa2>Z5u$+cB}exnX*}Vb5hiV-WUC*pG1Y5pu$tZwp`M0JipN?t#0tFP#!ZKrI+D$082J0@*=-I8!xM= zRt&#+)6`b=&P1@*HSY-*c*TsII$O|FZ8qD|QOqJ?y_Hv8h?~;UA^35R$-#PzbGI@( zO5n60t644M^RGv=uKlRlok{Qvp1iuH$Hq}md$1?S8D!2z`EV^>SJK58&c5drLCgD< z+oK+t?rlDBY3H|V552tAjM7f7z?l~5m15*KldEYgWKb^J87i^q?-`hg9djA7<>Wnj zD%>sjs&9(V!7d@?aG#z1US{(T_LM}bz({uWd{3@uTB5jJxWvKG*nx2Sbk$nZ6|2cm zkz|f>rq!|XMj}^Otx`VJ#p$~jpm^Sh;4!M4N`5^KUmrzW`mC<@zAZ~Bqz$TvyI44x z=S-YMw@pEHv@}L{|grulU!~gpaPH?iPMqU9={i;U1sl9r-Y+jgG8G;F@<%+Xgon6^oTF zztd9tF*Nv-#fqNDZCs$F&FDqw5{tVO7&owWd$me{v{~ST;>`V2cj?EEG17|bJS_AU zV)?&YXbIiTK04cEUz%Op3Gl7|Nn{+HksH@pBpTMzn7N8i+!-s>-CkmUH zTAT0PC18Rv$%X3a?3Qe<>8=J<9fcir4s=-g)wa`A*99l~GWU%GwiF!sjO&$(6p!)_ zG8L@OB-kfoE8GhD^qwiQ9j47rQR^9oW24;En;hte7+Both?P9yOJml!JjV+&bC>tO zvtpiu*U+JH-^bHVM>=ehrda|hY1B}oyP)+P zr(P4NdcN5GQKhlt_Nt-7xG$|Pl({q1lg-$I?INlDKlMR@RP24?q!<(L?45e%gSY+o z935N`R{Eg4X*Z|TqGCE4x3e{5pBX<36(&0|)1b_b8v0Pa+f=w>M*QlR)f!wZ)FO`A z1VO8A?F|N>{WY!J4LIQ3LZd=;@{Qb*K7FAM{1?|%39qj&jtHrZJ$ij^ovGZmq*z~*XnTmxR97m?~S_2i@ZZ`kRioTdVO4kV8+cK|b?EWNlV}IG+ zC&BEBc>*rjMLWr&nb9@Z!3PSnY}Cdxct4FX#*z3uUIMQn%UV46i|4lX}_@s&Jp0-ZR&->JM-mS8ST3r zZi5UT(xOSltYMGym&N=q8NX_9`IQ{o&bd6+m77byJ{LtlJR7r{Ft-0RXE*J!R{|Gi*msWN@+O51rL3_rX8vP^xB1yl zddV_+O@i534QxS%I7X*ksNc{^m%92vx|A_m5<~c2eY75yLYxhM-!{p4tXyM3@TY4gm+wi3M7p*=r*ZMQMJ*gr+nG^2qv(F4#Y86AD8KWJ;yvyR3a_{+ zhkPHSd&X_f`fj}$jCk$)c(}MUFQ@Kp9)2)WqrS*`q&a@6Vm7%%EjXC66re%No*#ZM z5mrO|N#sjf9(8b(w*E(fyAH66a1tz1G53qg-*SG`&2dvJhnXlkB@TWvt?x$qxd)ZY zLeEX^^53t-9#Z|tuj7tj^^H8lFSP5$PXsM%o5m++!nxa-ST_PhW9w#8dB zV*xQ+I>T@JX@?lxWxHc0S_cs1+My4ilbK`-Ut_7`{9Z9eF4?XZ>H%V=cFcFN;&{6L z$&uR7P2!D6M9+^_dnDn_-CAB*T@%G|vMFTt7jNMS`p^dPlH0?P9x7pU{4Cq|xd@se zfGw1M!BrC9UJo)=vXI9+EvYWX&JC8>rUUa_xo2s$?I&+Ppmjv>VK zR64C`kFss>!o*+MC3E%-I! zI+n!b_WR|q$Dh|1q`upRj6a>+g4QiL^1S|>)$4P@O4GUdS1kbETGIW6w`p5rK8G#G z#)+%7(v8J%mWzsJez6CXV9FnmA<_B#GP}^fZJ}ZGVlBZe2AEb;rOy7v84&MoT z?AmLdF03<~EzV}KDK|CsBXZGD%}Dl}?(!O4wXS*WSY_C@S@0wWWfyvrC3n%Q?>-T> z=M8Raghd3#1F*1RP~)rG>@$cu9a$Oi8ft(Vy@;J5hfbGMJ`Zorj@dNn30&~X=#g5V z!+ntm)=ud|PY$8*ufyKN<-a@y8cA)-vDWu@UuVP?{G@tk;^9iOU{Z6iw>S?>BiE@+ z+iL{JEUoeRbB3vmjR$k@)3_(m*;R)Ctokbwtx)!7yQp>nr6r7SKa^e0{Qckr*^BP0 z2zR@dV|~jsT%IP|VW(|Q{(&B;5LgdyR1vPArm|zp#O2o$*we0a?Q@}ee>!~*1fq&^ zhG-eYPMPCb`+YWLUmGrbN;+fkcp>D#}_IdgyBAZ9NVE{VdyWw0X$C%=wY zm!3AZ1vqUJFX~{Hw4vZtX^xdFT|cxf{q;0x-q%#j2N;-P%BSl9@H9&W(^m=BZ;88QQ8eE7flo8aHz=LY zNSJAmVI!Jl{hXuTS!-sV{qTSg!f`f56o_&$G=8{IxdY)_1VAkxuEiJ@eJkZR z&U7QOJgfjzKmA69&=X{=?c2Yw@@2JSqiGA^&Wx6X546JE+%K+e{LNDzI?{r9^yB`- zn}>;Y!@DK4$P+AYZ}w>6!xfq07HygqJ?2vVXGpgJOV7R;uRYi-Ak-d`cspz1EM`a_ z?sjT%vs*997p;{~hP9p^2G}c!fYf$bzb21W=qM^c(bVV#o~lY2FVJTQgmsEWPYQ)@ z&rqpLg!^Md8wS}^JR>}46ePP49!G-G!@cl4VJ+@wp?Ndm%NU7g8E}eKD|cC2iik!( z0l-iJgP)L}UFal^e;W@qBPlY<;cTJdfl6BaaZY&PeaGbLsK;tvf1wYs z5glg$41G`X3Y+Mu5d<}Tn3>|e=e(LZ|I0!L`@=1z9WYNxsqI=LZNbh|q&mHqGzqi` zYSP{&4lRZsdX|flb%J&Vm<)MrjzFh`KsD6Gip+;MgKe?40md#} zD{~LUhMs+%c2QhSqkAQY8EFrhOTAQmG{tlM$FNG_g4AkHwwAtG;I(eR9tnu(K=@^m zGHq;p4z`=!Jv}3|&Pqjj_dU*!#?_dQF3W?{%K$7b1|LVF9P=8>#=O7uB?t49B2;*k z7jr+Wtx)KCmA5%wsvb!zdvunWzWUZ=3D*+dO&uxc73?MqTIgza^POLA%adsAlLi~A z=CPM2nPNxXCPVl4dYYTA*e7E9=WJ=~8x#y?;%)MWCs$w#x=J0S%^Ke2_h{k%vQ*@5 zFyVA9tZ+_)u550NHbtJFJFK;7RDJC-t>pQ15wo*p48-?OR5Gu@*}YjDz-1bldl_1i z3VY&n8F5%n8zdkEACJ=-e#%ZbChvfN)4m0d{k3MNy0XHCpAF%jSW_GGIWt(pIfgk< ziOA%i1IwSO?fSxJ&3Y7sHtN69UaT^+=byVtc-V+OGsds4`W1(oibJ=K52^zyMaCC- z@W)^J12CnGzZm3vh<>>A;l5M83SEgDv&T}Q#8{$JN1WR2WkKQ<=<%9=Wyhan#vaQh zo;VbiNwOPSo@Rk@^^!e&6J(gL&gr-RAM2UO=ls7akp7=H z{C_So|NrqE@~K#NrODSwg7|%|a`@#xCugRULA%Ba z>9s@3yMw*{+8L5V(`5_69b!r0=xSkAU6I9;wYW<|7gIFa9lSnQI!rcwL=ZBvdk{c^ z8et%doem(;#|#wMnbl?olH$V#3W@_svDB~wwX(Caln_KV=-A4wwK`gj=&xGMVT^d- z=N5#K; znqXV%d5EBcLpV9zx(2pUD}W!a4|xRh*0|NQLvxllm_2%i>utXnB8h5Jv!{U$V?3Gn zUe^D-kQ#RC{4^CCQhd%uOYF9q97K3S>2wBRXJ!&7RyAgE4bCo+T`Ilhs#1u#h+U&Z zlZ7r@$0Qm$OK>;vrGcLIBkzwH+U&L+8b z1Ez>Y;M{fFSwOma1T<1rvwIjF8Yp&kBkTBr_^TQGls}5XxBdKA`9#$EWzgo@XGl_< zfm4ym2_L!DeuGA$HV+yh3PDmx<&CdYCVLl)(3YS>pWW#g1`o;g@2tBX<^!Kh|LT*S z5*wlKUAK8NZnr+jc4-53hLs(!=2Upn9 z2m#2jJ5P3vhiAYL!uVk5}Spy8p(+hlH*U;s#Y^*$O1I&iW;}h$8EP zvP$ya=1Ox!;t<*P4slUn!~*-5qQ&RilJJzvL1^7oFT~sE{nBBAssZa_INx%N!Kp1A z7z_AOcJ6(C0VYHpa*BbR};R#eAza{>x!hZjn?MoWf1hG3JV9!f~U<> z_q=zY!8u~%vkF0tjHx1N5N}~V>q=f<)Ndx#JUtGAq&iSQPXxZKJ5V<3vsD7HE0mC2 zxYe|gDWp1%s8Z*pc7B6@ab|j}`Okd^%FI$+QhK`%HV_oMYqp=;g%R(iz0(A!J02wP zS&6CD5Sr@+HDPssLe_jt-J0gO4M}uK$yYC@8_y$(>*^|OmrYCucwrlBqhG$6|+8E0!q4j z@0V4zqS;OXU9y;;XW-~NL`_Rczaa7F&g&}mgs!lkBG!e!9`ty~!GObB{?8$B{AZ6FKHk%~&gl=h<0JE4`Z2-sOLxO!xMY0Di zndX6UB>=H?*QWu;Ol`-;1opnL`2}Ogjw2BK05uBotKq9hKd!~7f^B9K)^5$ZMMVrG zHFyhA5J}91DFYYo=^p=j=n6DKyP;WTn8|x*{PHNTMWTa(d}}l}XN(YRLA_$zA>g%$ z6f=P^^#yn2vL;JC`uZZM{`_sOF?*=|@-aL{9Qq~JQJJ)tqBk3;)KyCoK@HMVv+vJ0 zl7~MVj^x;Os3+7QCK-p?V$sbKI{iXQ*0;{SS?UueHj}k49hMFvLO}<*$N6l}>?W{oUe0Jk#~(NQjNG`* zh7f?=LV6D57_~Nx2-8x3`NUjbp22jX6aaM{wZ-8Ir$*TS{JoXw?Y{0SP`+EX728ZU zt0@<;=-y4^Y*a7$62N!%-OU>e=7sIO*!~2&%Ivh7QD9pw=nw|6qP|`7jbV_Hs1eRH zy>@@Inqr9bQ}zOC+eY&7_qRcyV-+|i4;&UUpJ}Zku6(ia^6vE_>`Y?yn8q9uOYKG~ z9rd}S!+PUAp|~S_C1Ju#W0Njy2nwcv)@r0x_M)38VChUtm8FfG)k&*r|BR9vII)gF zoeMcBB*bWL1pP~U^48O-&-QTU+7@rLX^{p(J0~uSH34MZyE$6sQ0qn9iaKmw)W8>B zPC4VdJufz!sI@CeRp68B+Hd5Vv>@iQKgqly0bOjwdD)39KC{l%+N*XOk>^`>ZT1+Y z(rZ-^k0%Jxkb-6#x1D>(WY@g(s9@o#FR^do?jb+a;758fwC^Yu3JuY36`+*NQmx__ z;o5X|VyS*+CS$ChbUy+Im%5;8{az!S@r2B6pgCqs1BF5-zWYY@D>9=0ng;8|qCXgp z*iZZGF|wDs{(2GA+EDn7@Xf!p_^|mGo&Z=Euhd z*)oehf81JtgMp*>`rH zao}oNysy+p8o%HZn`1QD6pEW0Dzi^!Dj1JcmwM>V&`6wE`rMhnFA;pKI|K@2dTGCa zl)#zOU&`ku088N#X_h^povhEQdJ3y!>-Nam87=_0YUx~nQl^~syVDy#29@3;8tLu_E8B?{ybSg& zV1!Ri?ku}qpo&U#BHEAsKU1P{Mzj9?XSX~9-&g+BVpj_jdHRY^?Hw(qS)P)0OI^qJ z@jQPsgVy4$G)2|6&mgX73(CLZ!*pMwysjgE>tD5?W{L0toUM_ACJD5~JO{?E;7mRf zRJGH@gPUv@&83AOzv43{)@>9(DbG%(WtZ)HXpz+7jx3eHSS0b0^F({OLf4B~8|BDV zI$$OwB^?ps>z?LnfAjh&Rx6s;z{hq*QcBe-K>6lxfoL>yCib$Z_U`| zgue-Ig)jlWdnFmz5Y53zRvlJ;emFu8;KU~~61OZ~I^HcmK>*tM*X*BxiLi;qS zM**arJ_GxYevXTIWiz!Jx1T{cC1;H;WYBWc0pMi+1FTbesBnvriHwmgR{yn-tpOO=?z`1l{&U zATZ^3`xWPd;%iee=j!5ijWl=K`9PyZF7LKagLf?@Ad?*A2eKQVp36(9JkqlS!kpUc z6X&c6BLblQ6(j0x?HS&x=TfO8$aQ31mGztYa6j=+&>Qk;R<*%o$Y+SnJAk+H0on#f zH8l8naB|v@uPTPpN5MYz`3Q822mZ^;3bG#go-0nBk}-!(RpCmxs6@*P_5K$M9QF|9 z*PPN6BPYW%NN01ZS0Yg$955ih~~kgmp3zLw|c>P!NVed zxadgE-ZVLN00O-Lp7;cl2i9YW8eH&QYY8z8B=4lLSPbCy<1Gr^1a#j+_7dw}j#d9y zX-egD<8X;^s$9J;NTOiX|J07fW9CLDR);NEa=jJUJ|ou=@k~j$z){4U9#2^LT8UZl zzb0?i1TPHgl~jlMe(*t^IL{!eWy{Ghn`%8Yf#&w~Ydn6*A+ayxc_FIJ1djnDyDenL zGwh9a;!^PD3RLG^QYo-Gk?(KDh==#j57KkC!V9pG+|cM~FYgmt>K^tT=G{Bp*l@S!53u{>aP z?vsj1TSJ*(N;?IeG034pVCPr?T;bZB|0=rJhp&&B1_m(+b*0;XjM8l>o12D|hTo;u z;5WY!UR)qL0xU5zmPyiO!J|87h8+{J0)qT54J^D&&$MlL-Wph6zTgZyrlXoSEk><( z6yiO@86Pt~7{$g>eRJp*8)P_Q*DHrYFsg@B_CW{gd&l&>*2NZpGugHuycp53c zgaiwB0TI@>WsjG3{}yeA&{V0&hdQFfmX253QcZk#e_=k!Af=RgP^a2f$HS*_*3?U| z$->wuP2`Rz4Z`oO{`~&7JEb$eAsI2*)heb&*4NkiNI#>*-bUP8W&U%)&uBNJMSOH! zBX=+0U_+rTsXXQ0(YnpuTK3&v&sa&Az+)F9=|2QW6;{%383mYtZlMNDxtSjA1VeB?kmw}+EawuA&bwHO z$YJMDWTh)0Q1FCbuYrUyfw+Xlq3Ad-QqGo49>$C|wgk%2Ynjzr#3v#K za}_DQKHvdd>$JZ660dff+eC?hmfi~rt^4Ct;FJ7}j^D3pwebRL(qZ4S8U0(OdJ**6 zoO}1xr^|tyWY8sQXCuA%xh#i~u*vZ2?CXGbA08OYX^?GFoByDdyZG?F=vB=jzGsd1 z%Lj!Pl;v&P%NI&8oncm+rxG;yhfRAv2PgA8Opthec2)8=Xts0=$A=zBURE(0C&yR% zVM3XN`KuoF?&40qM{m{z$|<49g*Fy)j?e^7?-{?86j->|aVbM*Y)ht~^zyGQKkWf5 zUVzKeJhwK#zpyaEL`R)WWZJ^mOAhsGN3{}&KOQXVlrblSXU6ZODF%ADt|J zP`oGJ2pf9uB9U}&No2CY8`KP3+`t8E_PYbB4S$UIi`zlGNr+_Dz~1z`0GoMxJ?dqz z`hgd0;9cvl$&wy3^fLTB&W5}6n}HJ_OjTbGYUimuL|cB7X@7acO!L$l-=yo+j=OT(F(+ItC<{gQ4kqw8>Z<|-i4 z`8I*hw$4-uIn?mnh#nnJ)!TBLT!5@b^va7M*yI%@V|vHV0x}&V{Ess%ps)m3h`C4Y z)u*@tkR$QXV*ZLL63-^#pD_h{!J|fNvRpx-dW_`jNv@;WxkHF5Is2vwN$og;BrsJ; z^EYY)#!&q8U`uj`iCdT$Rh3@Ogfr6JGG{X{%XZ00X3|xb=2Ly{Y6Xf@qjHY>)$|{5 zISZQR`Ijsb%k7lHorj^?JMm`t(i)47fJ6|rdESPK-S3PZNkP5dYIDmvhez3W5KytgD6KKrfEmrc?{;bJMdfP{*tuW?gIcW-psAe~hfDD6j|LcfQ@9HCtVUFN3p8Xg`VM3)*q=c71tx&xeQhhj!K}6tfjNBX zY^M@lij2Cko_yE!%tM9L5s#oG{QIgW%SeN6K_Hrn zU6%DS-Gn`1E{Lib^a2%#quRf=ulKuR7kjAS$QDMbJ3Uq|ep`)9k)JtRF@N&M&~^REL;T|uJOwF(6C(hzt%p!%cVm+>qzS~A9@*jO}kW$&-5E$MnC+DTSvnCb1nr0TfZR{D{P}(dNw0+-n zAa5Wgyxczbs;?~Js{tsp8${s!~3PJ;Q%sRnM&UGH5Ib(6LSmI7KrmPTc zC9iW8)KYn{G&v3rAxIOMLRE$s967s)_&sX{5(?%Y+asS}A*^@3{KoKLsjWd5B$bhv zfa=-~#AEKSArQ4Z5%jDZ(gl3>47Gr$^yCwSZ8IJ;ZT6c;H*SPMK45uyqFKjt0eg+xl!oKkvRQ+kVSdpB1`Zg+ZsI@2qzZbU3B?a!

l6|Y^`A-<^Haizck(Bb-6c@p?d=$d3!#jwPQ2Z58H zKdn4ih0zB6LI{mb9omCTbTj!jP?46|M$-HUw$OyUvlb4QW9$mB9>wWduVFJ1crkgK zB>hcEL_VE0=UdsH$FrAJ@a0tkoYdv2*_nvKo7c)4OuE1p(pANBmkzM-B7`gtoxI0z z0bQ+&mOMoG#f0P~M5P`-0CJ@z24t3GpI0Djw4m?fc|N~#AxDeB-+=+WGVC6-{Rdc! zxGeFblr?dQOTxIkarWM3=f<_@2Q0O;Po2FKncSx?t=8_G<>VqFjIj~&zz;zGoB6zo z1sU&Bvsab+#DFBoC>C>cwIGsmB8;}t;%@QB1rL5Z$OyGu>I~jSOE9(OViDb@MsW;c z0hkrrN4h;f3k{4$!H?J{!nj2rHIiO9TNan0vH7Lay6s}^wTW%Z-qln%4JemJ8!2ifH?}R0xLdx(K(BT^fsj6ku z6m<;ISM-cUqTLES!B9evS}(k$)_c`_pS8>5+8{IV1xBI|SXydG%z(q=sjvt?lQ+RT zm@_?{UE{1fonE7&ZBMzlxOHq}Z<|n{*Ck0|bqLM$fH5(QyCJpO2WF0^XXBbk9!swS z12aezRuD(&l)c_qNU5iQL~1H5Oig#{2Qe(dZ;(~O{MkXr_KVB1BR0#IM*oJ%ai;3C z6W+F~{d3cF)l+HLO$mv?B$|4;W^c|*$|v#Hl}*C?dGFZNv0B_#<+HoNsa4@#!!q7uV2HM{B* zUjrrRHdi!-tYYW0)kM1UVm0h(F$$)!kKXUMDJ|*7%sr$Tljc8q*9e_-)63WGs$USc zU!W#sa(k_YxRRh46Tr0PJ7#o_^o6aaby5UP7{#u($4X;*nggi2Y}mu{>TcZXMOND8 zHCT7;T!kjf2qBHt;AT+~t?$gRoH%B1_Ovd(m0J3Hy33=)M1#lS@(YG)XVYoTL>ok3 z(z1}nfs~e!<8Yr&pZ93^Amv@Mb{)1>bJ2R4qbw2j=dStL2c@Re7Un5T5<5R$g-VG z&s6UbJ>JqE(qMOViBlnHhg|KiN1~bkwjQ&zYw$j&xO5UtMdZhIz5aALKwp@`vWd?cn2t})dNxLr z*Y6UenB(I?P~170gCjqJq|_oQohD^qdZQYQp6Pf)->c8b;?w8udVw7>We^LoKgYbN zEWGAL^l};v3p)6i;n^4$usuFPE;lFZ3+IBILiLw&->d@Kz&aVyu%$sy#TD@TG=`2J z*HGcIR%*2Wl;uGFuIzH)$V7un4=QZ0(jnF2uIH>mdn$M@g8jmI`mVGu4q3NsM9rkL zlHjt2)4#dKk$*I_!RRjGdjJy!#eEt%O8ZEZaCR;$-H|C65lNnbRFa_y-@=KeKs=%` zoeV_;RURedUWiqssEN;iFtq18+ESiFf@<4ZZH0u7ok0#O?`E`&o^V>}R^devn&*~@~DW6IBU^MxIJIF+XYci3Dr4>w#EA& zxzSUVwGeiD<@>i;#BWy*gF~9If-BI@u47Qv_XC1?@3YOylujf=$DW79r^M{D@304h zIF9OdN~fBh4~DCTOu@v)SHk~HQFRw(L!9gH;}Z7&ei~F?1pUvBG(h%7 zBwiM;F15>sp8I*#3o7;2x-(@Nq{`Z_y5L`bdL!rf9OnN}BWK~z;)2UrCoW{9ltaeL z@_bF9QtLLa4^vlF^#@v2cwJevP&5!uRd8urn62mxjoVc2(MLU zH_{DwEt*E(GPM|H>pnnc7VQ@;20N+;QXj|^YB3nFJ))g3Fw+fQbbRy!vp_+>9GPGX z@shU6YEi(5ziMwFQ5^S&4n#)}7>7ru?Ovns6J!OZnJUm-_vAx(oeHcC2XXi^j@?C- zr^q2MJc#gIb)jX%n>WAMED;I8n*1%~(v>K^0Fq*-C0PT+O?UJVwv5x#7Fc|lpo?=h zYw-_jHrRpTpjGpIBlmMh{P=@BVI(pl4oymHsMOZUBcmi_5-VNP)Xe&87m!TG*#3;j zrv54aQ2HjSjpPSMj(z)uA9$Sgy$yhS7pNWVvJRc&^p#<8U`X1=#nvjCRzdFMc>tT<8 zThxd|PGJ9a1@-LKc9F5f$k#AGId&->2MF(Gg(70Dr^F!k`Q@NqYXR{169)`{4sG}* z^Dn3xSr3I-`am)O&kXrVtNaZle&f&JsI&l%pxXJSECD!zw`ck9Jq&Jmv^n)C;9oAk z!+mhBGsRRWF{=|rRb9D;=Mpq=cNZ6W4ch8>eYR_TKr$lvU4CP5lM z4Et127l&%F)`(`gr`eW;Of8!P(4Sr?|MZzBd?0M<_pMg0NUDU0*RU#1{5qC(?T;ro zvKz|2dwqo9_)Gkrb6{=8U0030zvx-mc5(AWdh?@iFvsKg6|oKb%R92r6fge(vq>p< z8_KC(kBmIp=qy1sn}_qajX6s8wxxRZ(OJpM%BkgVdHe_k$yup{hVMLG^}G?~8YYr{ z<4DvbudoMdo&K(y#4OaW@2m}NKwJeFa6%b%zR5^pBWXk4t8wlnlJK3@q%^8@zNvZU z2-yu0$~SK{nbtRuY7WB+DtpN6HrNAEkbD6cB8J$CO+#Y*R|a2fv6kIcHdmICvm z{k6cl*w=MZkpxlx-GKs=T4y9Ru{W%AbQBohuDfsD7PQUh;t&T(?58AqQAE2rHnEL9 zd-tKF7+o4W-N#v2F>QsKcSFJ)k@Wkhv+tQ3WuSi-Lk=PXY#BbV{tYVnf0sK^ZyxyJaZedm*ba=pk`5$e|G}w4j6DxVF6IHSwQl@FcE>#Y-#3RT z|Auf1odLr*IkCaOA_<*Q;bTUZfOLN`(Gi%k$`JE8=B_d2jlgb1$Eev8YC~q;fU+W0 z`c7Ww2o%kA>JJ)De3Wm1ilLzYCDKFc{m-F)LT{S72I30CtlU0T;OCz(HOU|?&$0%2fi?%7fW3&54A1X8xln&Ow3l9`=Ua$zSXZ>A zjV+6qC``6b?Or>1gv|1p^+lO`R!E`(edrCFnE*qYQ=FmZqMdXTPxT>AT#Rhp;eQIH z>cbT@h>(-aK+GlD1ZEH>>7_i~2B9%_1C@%gFR_A>GYC)dh*H>uWlo{;rC?iy(3`O$ zjJl7)h*5-(2~@^)F$$_5ACM%@VN=+YiXolS{4Qjaz%BY)kjb54w2=!C^}U7MwGdDa=6is3POp-bt;W^DIh@Sb1! zqD;v#LqjwMD%fm1tp?oz;_RcDQK9Np1~zmMnqJ zyd(sZ>+ibfy3#ki11d-OyA^t_4nsZx57+lC;)Ho>jKb(dJTG~o?zz=??*f0oVK+>E z)7F#v-}M9qpJ!E|gBgR+P7{b)Zj6=B@kS{2Hg1@U`7YmlrlrIG#u`FW8ziI?VtF); z&bD7JyJ#CItV0{vQ~rp*r&tnIjasYvb3k03bs6y3 zESm(DtBlo0ATYZ~zwIzCM6Pigspsvo;R@|_bmP}CdRy>qKA2?A zxGnvbVS z?!q6EMkkNoRxK2g4N{hvnw1A=B932wmza+g1C=s1d1!-$z*a0SHWXn)pFQ*G9#Ary9ixl&8A0_tquy{V(ld42MN z-9pB@(1HH0D+L&t6)0?~kgw5|D!llR^!<;b3~xRSA~bDK*Q0l#f#GG&aKBqT-V~Lh z)5s^rzl1Vu#K4U!bflPM;}lr*mymn_*5trx?!^NIO4{e44I zO>oVRp$zJZgY3KhDUpKs1~3jMduy74NpIyV{_$Hw4qWUCP2p(T1bJ>6at`_3>X*DvD0b@<4ZTC5)uz@As1_KXmbB5Vxccb~qA@ao3ri`5G(Y92_+!;Bkqtm$nLWUS-|VbE?t z^}L!2+ayaIZT(LqS{{W}#5OAF(kKLNW)HA(!$EG!z%LhK5gU6l4d`MctPUl>W$3Y=GidIocX@=ayf3HmXPD zMvug!zCwWDQ>m6LWL{t{t-lp=2x+)4h=3mitY7g=Dr`G-{jVE{lQSRT4^i#86L|IS zeJW0vu)|RF>$;x@T~wS4WyoDJv{VnFB5jPxcwLA$4vCQN$-7A6 z!D}m33RAy4>9;=ez)b@HU#tXojF8FK&@=c2!#6J+HKR}0A@LAo9(NNI+p&yh*wS&} zt*09?+ghb(e4i7es zn~+;dAQ`Xy#5sOZ7-n;xhWnR*m?yFf+};XiRqr8pHK~rKmb_p?DM>{OS(K`!1!M-n zUp5H>iuC`Nc7hC2XrwEkgd~%hTTdhRE+|_-a8RY|YBFSFnv`;M`ys^bc?KYj7J8%- zt-^TQrES}0kZEWN?YQJFy&Ll9;R^AGYyKF8_m$mqL(a9W>}rV*9=gC6d9jYa74;H$ zji8RU_S9D*Fu;!bp!0Nm|0Y4Lfo}r7V2nRi=rLnpB2E#jz^(4l8aZniZ)qqp_GZCO z{QEeUDlh-ItVPw3`wQ4SAE732BR6KTf>22O_!CsJgcvfhSJ6C*4AcXk5v_0KAaI3T zy$^>#A3RWBgMf+KE}X$kZ+aW=ivyMRTG@34@YmK;qz@AsG!Gw#d-?!_Jl7-hpHH-8 zc%t$8({(tft_MV*r0s+vav|9?HKor^N)Kn=#_1#qRAd{#Yd_vyQpiS_{<{xF?FSMt z2D)pXx;+*WWS1oCcUBpRMIf#ApAy&!$b(+-GwPxgu$_4r{BILFitA^V080uFafz70 zGW!&NdgL|$XB;C|L1>Db5JSehF^EN`-;5Z!$SRi5o=^5zi377`D8S%9H?;!E@7H<$ zJ$TCxKsF^WTpNV^p&%q{J|a_Qf1$VTBM^tX;j1KJHWzeu6JwdGkKp<#J&`B~Vsc}) zSCWvMIt?28iK?cAQofa?mKSonCh%IjMptwx7P8mXC%1{-ehMn zfRNMN(0~69IC=RHtg`YP$RAIP>LXHrN`6!=^neXY<oDZ4o zM&vbQPauXb0Yog+_Bx{1AY&<2A$3LP#irg8V6O??BmP&xP8C`_HV!Q?8o4<{54fO6 zB=I9k_!k>I=K&6mMymHb;IX{zBIGs*#p^AcnF!7+f%ze1oI?e<-y7JKcKT1Ebh;t` zF_bj~jS+dAOMS?G>f|~4cOE39^35aaXBk8sKOjDU6-bL#P|Z|f!{+oCrDgtxG)1fj zThlE&m|iC!G8QQ6e8^3`=0Q=iAuRvrkYB|0=2E?}$t_e^;eRlKP)no`5@0we0}fdbrZNSs;%}oxzKv=&=RFVmMY#hqtuiyV^ zza-GeRDo{1Hv$>+e*Wn?x)aVIuUhTzto;prZqLGtC7xO0bn`NH_Yv9la2bZ9L-A*@ z7nr50UK;#Yu|9|6qI`qgx(Wlhj^l6@^t4J)d9+|^XK`~M$rRTj1wIsi8ye;zu-a1N zRz$oF#ri^0ZvCP=VddQNz}e=V*snWrni{e z*Yv+}_a@*}wr$(6rn^})LYfB&5fu>)G?)^ZQi{kBMO0+En=_=zkc14&OhlqkGGq*E z8B$V&kYvh`^6$seJ-*NOZr}fZ|F^yW_OESwp8LLwwXStt=XspRvG4n_ADW?xjRS)l z{LKSJ>RtTOJ$@{zUs!HgB5_|OBC5IdTSt3TqnE+Q@7pYN6yGsKgLYZ2^i-OocUpOA zdcwY*^-kZOCA?u}?%=Jo8;nXdYp7wJWIfEX(umk>X4|3=@s6=DYiC`S(~oM)wsc3{ z`pnCg<{}9i(>uMSZvG!VVDsbFuONpb-<`6`|RjhmGYK*Zqwp}l@dg1885{pZ&*lkyuh5mSUGv+<0 zOj?7_bNZVPp{cr})4BhNOg%u!%`ZAe4|t`##l|mU;dr(tYMGJOZ{k>s zy(|qimA*5*elpNecE{;{*_6l^zWeQO9D8nd?a-Yjrl)b}G3igqZK4k6JX3jQ-h-g~ zkM0Lf@yag?$0bVKBV{x@r9zpZhMjtx4X2TH3;9a*re^&R2CXGUby`V`#P(@h_QxG@ zt(f`HbpFL=o$PI9S4Pg>yZvNOc4*u8UAnWwwW3{ozI%L~|6$!$DTajI>)5 z=RDa4uyF_xf(g&1&AG`YVw#?Z%~u&;iUwr0IdR9VoKIrZTjN0Z;GVD&^FI&a`Bi>h zJ05my82~U44ytJ_(lGnzFMfC*=X8L6-IZZtEK_6!`qziPb=(D-?7G)Y^4Ub)cc2QjUsVqEaRfj? zAt&hc**0#^|IBI5j?ByHMLcBjtO*2o$R>TLr9*W|Jh%iYqwn~NEsJ^(d)bD1H1+#e>EM#Gc??-uMc8HE*V@VI>CNjxrvDW(GsA z-@ZaH9D%GmoB|+npy=){s4h18UcBP22wtN{!n7>7Ikhv#>h@}DJ`VX^c?(NUT~Wtp z6c&+0Q%MD~*QNclQOZd%zkYbZq_sn$XMTNhzajpO!*vDQjz<3B19ZcM0mR+FJ~$BE zOC=|UzI%^~#h0B;#-W+(U%!zvTPX~fEsPd$Q0(c}TW?1p9xvC1|I;?A^eO*?slfk) zbL{`$zOui>mW^f=VZFcvTC%3MA{W_-2j{DCKAhms6dgmFt%TF{ek zgH^guD#{)P`O7$v4wyIj2kuMBKBL^<@lTdPyXJPPBGQ3LlUBl;oJV?p^w(>%`!4mY z(wZvBqISjIV>h+*%);j%d`0Xe4(kL*m#fQtcH+RdKUj^%kRZ~V*}@L9dA)6Wm1VjQ zIq+2t3{Y#z3rZhMOWo#8M2OhqA`EhK_1>jJ*fSOQU!VxWLoaG?Ms!R&D@ucNQohIh zbqWcYpS-ytRE5xuD)_LfxCl`%^3MBs-nsd^L&0pr-P4bO2ZEKc3;eLN&l|TsFxF47NzaZIOSY;>@(}OQs7Ub9NLR+w@a;hl+0W zaE3vH)O8P`J$%ud53`m|BZ^;@R~1F}o)G=3Q#kfGXy5la#9wp0chQB`W#F<`6%2%` z=O4TJOk`~K{8?L$OdH3W3SdZ5=WfH4sxovWQ`X$-@Z}F^MS=`)xQ&6qE8`ebJD&nT z<&c)PoAn}GoPzSqQqw&(Iz^KyWB&Q%!zI4v?e)DIah^mBj8M-koka0oh+y(&dGvLZ zqaQnoxf z{nNe2(D`Y8vx$v{x+V&Z&uNPJ=pr_E{FyyfG+^W!-v$v+CSlYL;__*CMp`U)Vk0(CO{0u^x{J z^Xg_L`3bq7>j9Z|&;bdY#l4k`T$z-6H9_jsr(KIwPUE(|$NjCLD-@j+&Khnk-}w%T z%grkXpqh+DTRwMF(*iq|`t(|4C9cgOf{pTc2If^EOT_gRY+z0nhP4=$6rrzj2{vC; zc*u03-GaHO{Rd9z3i5yUb%GqI>Epp|elqqp{y1?@c82`n0W>)8iCkEu)DgeUZgt~0 zZaaQ1*R(!lBv|lR_{v`>ft&vidt~kvIP0`6_V7?S*8*|=4&Ed8s2897-A+DB11c9m z7EMw2laIX?pO|=(dnui=&E0fclls_BB4dWQ!R4*6m)q_;cu9M+&s8^o+zfP)nkchvZi(lH-)B#pZXpOv8@$C0;Bs1Im&sZBW zIh#sUs*+m~VO61p-2SDB+ipcR2}>@IS%5-Q4^7leL{xF6-I#5Q)pc&oQQdf7e2dOq zo3xf01aGBOIi*wV|LTVrX?l9h7}$uzj%E2eLtaUBz7M z_n=99D7Ga7N|pR%gIi)^r=T+PC*l-Qp32w~$JuP^TG5Lky%VS?fvo>Y1#)BkVg`P^ z%%kBML{(yJt2r>Z0ZZni;+MZM=K{C>i7mV^wuZdSvx0I{oJx|FGU{^-5fVsr*zxL!q+wjPsh69s;t`_2#=7 zTnM|a(8qwO=;1#V*0)c zdvq%=d~)0-#;iJvFP>>%k7jXB-xTlUB@x};t#O>0lNi+!dDNwjq3TresnlIHLq*Q{ zM!L)QA%FsQgA$oeUQx}7Di1%kYrZ%e4qs=IaSb}FbcU~Rk=s|#fWTe&IP=P^G?hmM z?H_A;oV(|Lc=)#eR_9wzg@FZVLCaATy0eERaADS=3@lPJ7%U+E$bF(TEcvZX(Y%Ld zxM9T&)`ynOCxape%a!I zF!qQ7Qh?eb4++EeT|oxpQ2}$~_bh-2aP|Dlb0sfNW3~hoeB*&hX}&yMK{uH?jOf_`ACX|45(|78v%bxeRHfgGXjJqXxq5lvLs$^Ov64 zgnmUPb!}go&gVlKY=|m0{q^P62$|2I-dGKpgFFqr_!lMMqA)XPgYMQl?da@22PEKAsKH*a-#v3Dc~$HVQP)nhk4KnUs! z+;HEs-khuP+)ENbzr!VriHEPac2bfi{o%r#3X&jQcDRF6QG_=GTOkZNOhSzc zK0J7S&hIG)MryBb^PqS)Q9*4c7fMnYa%i%Qu0$EP=SYJ**1fpeOs#%I#%7V5u!Go5 z#+vMk)m3o?9RsGk!tQBF*lAL6P#d+vnK_`L3(f0G*iLnbLu%CgL2g>~)b@_Xgh@HS zV-Xk!E_w=dlS$G{AJ|EW-XHtTH+y2}G)V{4q2or{h{b|Mds5b7m zX?}*8$VAq83dpAWso<6c&$>dVMxo4>$0Xx}wtEG&!3>V@?3K90E!-=x29T_%O~O`O ziizbPm+}RI!nBEpffX_VAKznpnmL>&Vy;PM&Pr8ff>rd81-QMI!0++?z7b4paBs3m zb0JkN`X|}Kloyw#D=m<=-RY}uvkPuTX{%e(plo770at;5y#HVK{TO_4*vlGb0|DgZ zMC}BqR3ZeMbxrSItU$Nl9co1#z3GaJ=t-}7IQ|1kGHDoypu?m~0BqLQnwNS^ayhi8_q*e|9F_;AP{jmq>v6Db48Kw_x zv}B|MK0B+AqF1fRW$ArAaZWQ9zj$%L$rW#~c9!#=m8jnMU|Hj%MW;eFuYy0^E&g-W z?sE^)Yp$bBaZ^2o^0_MH5egVOrGkjmb}rI4M7_OzBv|le*zL&@V>nFi)P$zx{JwmC z>V#jQ;o2Ae2hKf+Cg)`W3kSa;`ZF;4q$OszFO;?X%M^dO@%SY3|NTu0YK*k5jl1hm zU%C4aj_}BE`Nzf`rL-ZvWWVjCG-?RS&7QJ#)QQN(lVG<&QK^QdLfP1utF-d`wc0he zk^>yIaJB3|L%9^TT?MOzw)~CJ)wyvCV%H1?P_IpWZIwb~qY(wyXfrhBo3@$YUCMT{ z_oqr|GF=z!yS8p1+q967XoZsqy?JdQ7&ykochJC-ehQ62s zek+``H#Bd7EE81O^*L(#e=O+Y%RCE^(z2I9kZ*eadSp@=ZtK+-F=_Rjok9dHC6vKe&arT|IG-F#m*4=*9DfsMWq#0 zcKop1O;?f*BRB^bX2Q{(rqpn=k0^<;qw9I)B=F4Ty*TwTx&-*Y3v%)14+a&j2E7FMKuP+l}G5Fd+PK}+b$Xo&Y;kTxgwdhFabDTKRXW#dTsmcU*Y*HIgu1Rr~5}t0NLniC{u4B+dPm?1*o92!Z17` z+OLGZ%kS*%vRlpFt*y~}$U%aYlUNRy|UW0$$t3E8R%YJ3*p2>xi~)y(x@ zs+-O&I{W2Oy2$q|9eqc9Lu$~<)raziLq(ar(jESW6PwhYe~?c1msV6g3YbCaS@2Ji z!jDUg#{E0r7SVVT_7tRMoJ`4NVz>WoC)5&165ahncG1r+8QrccCQ<$l|Ma^A$TNr( zD8X(w14XinsuO=g!U-BDb50pG1%=#c2`&FX9_QSkybEXP%XTR^bXGu!%s6`odKXpd zlW7CB=MR7O?)q(+I1SZxI{Tu{@^&dYDcA)~2QDJGwLu>L*e$W;3{@i#QAf}dCxw=VN<9T|M4>>$ z6u(<%*F_`tW4O+ch6CQTyMxvW?%E-0@6p39U;O-S!t7qrxGYN(F_7Pd(mfX4N_fN&O^G4bx@34SNbcsNXES`7jM`*5BASqs7r31L z_F1>FH@gwR?f5_5a&7pCP^9*Fq_qYDNj;h(df9ENhgp!vp2Mt>CFJvURe60^B!BT!v^9unwjBEWyFqHy|9as$;|)vyU(YRs2p6GAJ~8E)uf=N%pk{>^}U@}$l~sCBtLuk z`9Gd`7>qsJMVs8k^}=JbbZsH6=Lxn^P~5Vei%J_x4WuN-gMMPBNZ@(59@Z~j>Lv%d3$eK z@1OZZJvzq{A!NSGT)QjfZA)ez`+VptG-xF+YS0#jK%z!U_=xsFv5!Y1EqSuD8!s-V znSQ3VbcDL5OSXSG47)Fwd+kOylj@fb?na)*0S#@ka1sJ|&asGqE{s7VH$TuSU=CGeOqigyyrSdYv{e_|stnu0#D z=!B)_W;r(ayT;ao>k;=)GH;K@LDXho{Fy+S?w#$d!>%XHqtD@BF?ZkalIPsA1JuCZ zs@I8R@FtNR5#)PD?qVca*$GH8u1AU>A`-<(H~Yaq%8`s*i`>?O)^`SNw9A`Gy`8-P zfWmPqNTF@qGQAdOPZ_`DK00UQud)^qqA1;TTf?T?vMhKD3LI54L_`%bJ0z44825p0 zBb10GDPw6~A7%Z$q;=1yfd8C#&Q&oMSA1*@AO8oV~fr$;)Uw5hE~mJ zkjMI~2sz7x|HA8kPu~?5IXN3J@_OnIdTxqoCzxcUW?`ZD%JWGI4xoC%~Yv zV(th{pU{xiT8jlnZ8q$@pZw}P>;6`J7tgssQVIc)WDFY}@f?5nZCeF|61G5*B~Sem zXE=z-7K6u^P3lL6%GNVd7m{QtbW(35kO_pt{!^0F+@tUBugiai@DGCSNsMWRE)+x{ z=iSsp3cz6}AtAJhk8)FL`Jp*_ zg-6~a_^`F3Wb((x%~UqjC9gtT9LK6R;}7qnb4yH{s;W6cr}#HQR=|QXlo(h+fh@|t zAiN4cS6JzG>MsuCw%+`s8Fsoc(tp3zQao7nS;;S#xQAh1i_?(NQyT##Rk=A7 zd<6TY-)X-ebvntR6)mwNIGW~6d}PLCBz;+oPnHrgKlc@xiO4UkAbj>j#p&53Uc)x} z2#^6k(Ka)bMi+K{13K_AxQl>ne8_QXb_`gE%LnocyqGo?FvZkl1TzNP#1VaU_OcYh zklpV)A4fl_r8#@wYis}-JIU>CV4XXUiP?HSTqyV0aJL;jNxun=&%kD^f`;bb@@fZX zm@b<;%3PB7JT(KyZL}H6pW+w3e+alr7i<3qTsOL%Fn8FHWGfe_>^Yy)^IHzD5zxZ&_$!QAH zILh=5z4ES&Yb<>8DSY7Xg0B*jdgEU;)}c$1Cd2ABuY)MJMt*hD41w=h8v~E5Ou6A1 zkIzx0P_Htk(3~8_{a9+xVuK?kCmHGZ*5;h)f{lbH!_kB9}U*Rr+@?hCg=tLzUn9nCTd3cRWQZ+ zS-(fwas3oHe3{#(gc0hWEb%5)C}~Z@Z!FzGO*l>8dZEuUrP6U{Q{W;1LauqUWoH38 zs*$<|1G_4!zXeS9=x@Dk{q&{Uew*}TxUd%B9mm5&Qh8&_}Kux=Ab_k z8=sM12sC*do(HphONoIPng8Szq;)3UX9pTYsR|F*bii@fPP6yaaEE#m@>14iw& zaXPQWDq;&rjrCId76to1OZ&CvTaf(Fd|jgN+iFwV=Q4MYz81P#TjUktS;I}Dt!T_x zZPJ5pV|u7T9@kdE3<(+97~~m=!;=jG6Jm?fD%v^_=f-j*Hikq^P<)LFKz=Mb@{2i0 zKGw!1-+`mA6UW$@&*g6$p565L6JaM|LgecpYK0)*=BnVeIm!F9beDTBl*{}(0=!#I zea;2q>Eh+Ygdyrs27D|$N)^eluMeoYqSJFkc4?X(nNr#V`k}?1G{gS{2;u;)v&Ds! z^T114jam{i$(%@y53Qc*n4L;oTL4XtqjA!`)RxjUjF1-WSAwT|XvLpEhnt(5VO%U0 zUKHp9L9O{N7JJ_$pE-s^DoRSIz_5Qxokro@ClfhV4FV6!{X3>fcu@J-nN?ggp{8t@ z4Nb7WApo%>zYdMjvpLX5r4A2)UcqPnl1NcH8@;Vq2K$HF@7ZG;tpg+Xok5rD+zh0= z91=2=7|GvRK~kApcslOAU?akC&C)I2i?E*k`q*Ct(E1sc`i`c+^JIKpi*vGqB#x+n zHH*=*gAvgU@_78Xy_{H6s6J&gaCi|Ol&dd^zgHQ>+8p$_&YIrA3g2df%sE*3545Ew zLM@1m(!_&>bzL!viu8>CKqHLUm^6YG*U1#Tk;JUg3tl-1vF8%l6coI zhGN3YU+IXQk;qd}`;wavs;l2PpOc;p{$IskBI<@7(f>w&k__4j2c^pKi}Ln={1F|8 zR>iqUVfGk~zF7jI7!GZ`Tp7#%98eynewiok3u0wlwIgz86*AA#gTjx%6yA&jbitf| zT<~cej3mHzc(t(SXY+=vU8H}3oc)z;Tsx9!73#l(r;2ZP2X<VQ}%AXg8#vf%WTlEh8KA}6AG)CkKMH{Yl zhReV#WurvC}u%Ujx zA3AU*JkoCvw;MIv0!!aX8W;qdwK#~Zp6#JPR)DPrBSYHKSam(~!unFEBgoiCmrb(| za%FJf@M^hZ4rIeXR^t`!`l=1!32|#9gSh6c6K`&wR%`X7gFVrhnqgT<#znj>M5PfI zQvutU>%=liKsrU!C&F=v$U31Ndfn466p+V%D4r%(Tk|CP@2G2Y_2k{zQn&7=V`n}L zGt3iEnLp7-<)5S@dV?T|F!SE06(zZMd?BAVRrEf6h>SI{{iyxrAH!!VAsG3g;IP?Op zI>sgpZpZ4%vdO?}dfc0yKf)0ZhFNNhI*@b?I%B}q>hoEMTe8%cmR4m@%$J8fPKR7F zQrrke(%*$u6CuRCi1}L<<5|lIGSPe=6k%JAr;w zu;=~?yz*+gfP$%Iza4R6fb0^Uo;y8^L`(8lqV-d6;*ssClFSS1?=k!%-lQf(K<($? z{k4qO=SFI4(b2tcb~RR9s9M0h^2MU^sY;OS*Y@=(oi`Ni4mh`2`fps{$KUrEgn5)2 zZ=HR4RBCI!=-&S01|xQN(?x>vQacad^)LE6fsQn7I`eMt55yMM8&yL0!wH#J#HNtaifYxNViK7a_9nRe5F(*eD>>d! z`7@WfbdkrcFJfxb>gUr8aa(Aw8MvjQlHQ-hbY!2O1~w6%>GYi;_oG$K{_N=3$vq+_ zm7|Xw2uHcjjp=;r*Bn6ZORf`Yq(Ahc)P;@ag9tlo{OaB%ssehkUt8WkyswNNy3|b$ z+_~#>uZOM+Eqh3IG(g1vp?py=^kQ5Y$G2@)p5>oiZ(y{R&8z2z4~=c1U__Yi0kQz0 z#!LYJ?@N!-1lHg*a}josIvISnMtL=BfjckC0($LfbE`f7mDud~K|-xH3qzDzt}otJ zK~zEeEIO8+Hp(L;HV314sBM_A@Vx4mqPuy7xaa+IT|Jb(W{7Tq|r{S(%Beuqw` zR(a)H)Sj8P=#ZINoa1L0GAofkLgol*Ti>~=D?NxN2a$WgJfc8knE{w7 z$(Vr2B>vR2%l{aj+iULu=U-RJ7QsdT8B~Gmt!xkYiR!E6-I;QsPCALA?67yV*<5>D zSF~5I3^R#T3Bi5X{ixE6BMf#YubDUmPXn--L*eMLF0lD|2@Ky=Qy_ zJ&K0aY2y!HQT4<^HU38tZhekyPt<6>6QSuE8xV+Gm#|N~x!Uc9@t-jkE84CWyV=Hi zXw_~xl;X+Yvj0uXscrmlfsQd5TV+d=Ag6D(Vw5l7kyJ{@;Z&qaKy2uT zWKUug|Kykci3^~L7XCX&UBUdz=Sc!7z=g?kD#($XUEq?!b^lwhd_&^zO58WjbTy<_ zS!ra^OmrmqHiO8}e;0}KoK4??f{f{sLJD`5-LOTA76PI8WawVPfj6s4*3;4kj;-F_ zf%O%w%}2(Fw!qI?))QAbnAYW@LV*DX(j)5bh=9&QCe<1xk22I&RwTJHcPu4?9zgBt zjma9SQp*#L<9JdcX;Vh+RQaC0ti_5i5LJDNw;f)7KwVudHyO&xWiFEyLr!2liT;IL zxOL#Ic9Od@dvGMMFrPUmNQMyac@`uAgH8w1cX;C!%oDXjvE$oVs*4h7mpIZv?wi))bzNL<|cv{GWLZh)7^ z2dSltwNF5vM{IVB*~O2C7LVb{=pzc2wDud$@GTX44F0_;CjW5nv9~zQBX)9LQsB~E zHshi+3G#u|u!e?t3M}z_68KL^I&kjh9D6$z2NAiy)1=`R(Kof*L)JFiV~zgBMY`^t zGdV4KR~nC%#P){R^qp*-ARR0TiN21u7p@%MY83e@{n8{$WsGYraIsL5P{naV$9yY3 zQkf!VI(GWWn{!>ewXj}8pE!Gz$O=>631lK7e-%)>3n2ZlSt9Dd!{rE&);pssT1ZCA zFCsb;Gegfs&ft0BN}zU>PDo25;Nn2GBm$s4%a5O?tyK_=M#)FZH?G-k9QbD676m{w zQ-LFeA!VTN#032lk_@q+YaV#aU`=xFY^AXc1(Q!Qm{0V6 zFAb0;hc0#>13WEueYwYd3W%WKB~i;`_^|^a8fBlOh4h zsY%Mwfy0PcvR5x|1mdHkc$Vz4$CbBq)}oBa%(D;CZlt`G;J1M7<6T$GH>9M(g2IQ* zmbZ^>jG?EacF044>yhfe&6SORa8>NV2&nV9e`z9AI)KzG10L6PfGU}UglsE(0n zx&rqB2`^KwjL*?4Cp9K!%k+t%I@8`9k*E(C)(k5`iBzu+V1^0&Y7dZmL<6){NSimg zV&`nK$?&XIgpO-Lt0Be2cyZMb=b6jo$$S3z|XIVCN0K`6C3_w{tv_XA(% z>wE>F7>3fo%FUPru53P7bvNxH4P`!L6SQ^@DpocrC#&$(xN-gpxdAVV0mDt3)baeC+@Ab{pdVyU!ESt25TT4W)MV`N=}M#-)_>EV{C_< z)9R_sFTX?b>9*!xf z5|K?D;o-3%c!@mmNkc)=hggob|iOp2va6fg2j}v-Chq}#|F^ihZIj3pd`f<_Q+dG#`ZhZ;$I5a_H2GE~XU9Mj#QZ@Ck9=77y-(Hv- z=1N;HPeqmrhn#WQ63zHIj__@N{5M9jv6{Z%k0Ot@{f>W3S9>@_&@H{nw(p-Q@(BZr zt^mo)ExxmkJFS#+)8{=A#;7EMyQ;=PNYHZz^58}oWq6=05J5-(f|9!%ybz`32y5ek z7zr~CPu)ocv|OgivX>`&6&|RM<9S31kb1X=DdU4AemcCT>6-)PUe33JXniL_=aK{1 ziVLK&V*uKTtbxYl0%+lbHJ@&?6aCTzJKmY^U^8n?NLLG=WwLrN06$0)w0#xu_rX`I z#(_ndh5KMT4RyoB3lpL$8&F5gquYGY=iGMOn7vvNV?KbOo88pZWKGS#o1_43nAWx> z37ny3nf&Z39V5@jZP77?xByRxrdFDi_|FsG|0uRH370T&vt(?hJBPdN(Gll&3tXGZ z*0hyT43`PKaDwi*gv4!!_oPCIFdKdW95C!)5$@fdy<-j|u!e$XwM$dNwYI5mi<$_n zZFCY}g(d*H(d)tyzz5}n7xr~^6S}cEB3Dii7dS&lRVxZA0Rn2Plkn@eSv(iA21|}N z;FP&aDOvo}?m{ql+YWpYz?(@|&20Off~7thbkh2WqE&YeIPn!^?SE9teALsN=YKM~evSCU*fol&elCr9<|kV|=4Ue`Ew~yB zTf7!L$qUdew|e)~yxpEpPKKMFg93x@$-M#a$ADY6D4?XDgUik z1@-R=Q=B)4^9gInGRh}hz?pp{#h!f0$e6ARhg~j7V?}jJ{P!JysiURkBXok6u)y>< zfdQ0C`DnwL4N}M&d4Se61={+Bg{$`pNBPW+`C6$N%>$Tf!|q)lI4j|3RZ5PizUP z0?VFBTyQwV>w6Tu$rYC$?FLl2JVuMUO*^&}M{`W&&!x=ZC^E0I{DRf)`de6L`|sJb9IizNwPwaSk$LGL%ES#0ElrH4%!`{ z5E~F7uR?KGrKF3W*!{?z`nMy6;0kmVsrd%EP6)I4k#{RpD>cqyG~qA9ce6Eix7HdL z-Y#sp82rEw0feo)yPd4pVF-uf*M*URe7Oby)(05X zLAcVh6 zK9WtSpOGhTgnaBsi?bW>=MvbE_{a49e+An;r^jEwAK|rU>wo&ULW`4)J)(Qp|X8xJPNGL-Mk#?)Iw>U(F;l0|Ok z0R-Ciq7MjUdYNn3OQ@rqxCR)=<>E05qy=QlmV?}x59H**QO>%HU0jy z-uXzD9f#q4b`1@zab-zZW_Zb4nk5NOqRE8wlJ3nFd567J4t)7BIIz&C!!E~Pg9zgx zyZ{BTaMzRiA0p|ttw~$IVa?JjCA{F#B7Jr0A@kdC{2=jH>8CpMjCIYuAEN@v$NAF; zrXoI7{MSuXnLNq&JyjS?eAC!Z-PyyS!b9_pOOL)Ei+jw6+3=>AXit6*Aw^Srz_4Y6 z$o;xwIv@N$^IQ-r>}_TCBttEz;0r9E&|Vrv9PjamYC)S7TD(xNqYFzQRMB%a?{G7!y>C8U*g-1!TjWk zHnIDSj7l%FZ^@t5e@Gk5XT@tP>l*)P%kRz2FSqNq=<$kbWQZAsS1!=d7z}U=5Hed+ zhUi)<$5>L--sk8q7CIzm_v!jVe1J!Rv5oTPl`dyXS5{A|wi%HdluLb-wWBytb`wD} zy=QUmai|1w{kfV8vB6e{j3=iIlhT0sN@pKKqH%@xtO(R*fT!j}3uhrmGeR0&)J~$a zqJ4Q=i?T;U-JVOz<4(PPIwUfNLq3$Xs9nHw`+29%{}j{$<2n3qZcfn|x&Cv_mbUJ7 zx|$o*E)GHxqEj9;ee?;&o*0|Gyau3A59y(V)1R)*0!1S<^bm(DUas?0kjiA$bo?JoT2<+!Z`YnMZS{uo0D+CKV?Ufm&k$=9xH zQ$C+Xo*z?UaN?j|#0oHgb7?ef0AMI<08+U~UHQ-g;ECSP#gvKapaRr3eLZ?Vf*;+6 z&zvT!wn}$3&3$9Cq!XX>L~`r#J}7FgJdJI}8~&Sazv(jG&u1gPC~gaXR~5Nnfc0QV zWbB%Xdq2M0pLSi5pe9@;7bZ7)N&h*t{iksEKlx{6^2l{p(&7ZcDjWhxv>fz64aRRZ z0#1s0^ab%$fN1t(=%Oh{pXDcv^*M$*xC;R+v(SO^OMW!om4hawEbJhOT0Q6v=UrRy zgk{VR4Ac=?J}>kMtwZ#khnmG5=Y!}$oGa$-9*l~8DJBF+73wXRa z)FxJLOuFXVC;(v3FdMy3`fcJAF!xOcVIo?ro8CV_T_g2*6Dm5JN&Q&hTDtv!Njzv8`udtf=lSOfU`z`5Auk>*@!pO% z8<5zJupWD0C{gPThU@4Hzt&Lq2*NzA z^A*l6qEltf9g1svUQwZga^V2yPcF`hx4OGW>Z&(jR1posYrs~IRvYoou*T{w66OX8 z(Zs)*QRPI^`V^5pw^-h-*%e~TQH>qr$1z&z6Vd-+huo0*v<1=&f|X%v-dBy2cAzRX)BDMH{XOP=etKM7dO{3wZaqbj z&-l`>n1)6R87J1JgwWjRlN{7V1yW1cM`trG>rm?_%JSND&4v8}fb?0zCgJ1E4zLJU zv5%w~YC!^Y6v2%nvM`0KESS*5D#?VA?-R zq-MgWn}xo5Lev^)@4vNJBJ&U>s_0knz|zjJ`EeW%T^-r}{xOWCd12N1xV?je$WvoF zR;C0he>j9>u@QTQn-e!tUYJriJXqnDo2+h8PX#}{v6w$0=G=WN=%d*8y$?>It3g|L z!-U_Fm6eXE2Q(%?+=Cq9YOmyFrJCVK~0dKgFXjl4I0ivpo6i$XHpWa ztx&;pk-$u=M886)zBpK%l=re8e(QMCV%CJ%WcXaX z_%#Xo)5>qRFslJXiA|)R9xsFICO-O^+sZ}ovUZ@xoz+|3o}1D$rS6hQNxJ((>Qv{t zfa$?k1T`3IPSvrRj+%G*>Mh{nn{z__yDaeBMnFSFjRFi24GrH=OdEMsM17he-**cm zhIJPVv}tGYavwZ%*gIYcN1*GxZR~YTqoE6#6ZXHKH@6vL8KE# zpR^1qLwBZL2<_i2z{OvInp5*P#{#fvQ0~URJa8KxufaCX=Fhc@!LIR8ePZ*~S8ooN z@;zxu8VKeGI4q^gbr)~@T2Eu0>*<^-aWjby*MW3obxVZx9Byi{%p3VpKaxx4=ue~$ z1W3d;V42?AFB(Vy3si4wP7$yY++65u2rW!7*KJ?ld>TK&9}pfaeDQa1GewQ#sU?_H zWi$-4Cml*2bA9lv)<}!<={Ta6j4wZXfL*wg1=s0U{By9fB;#U#Ng;@N zG4t+AK>GPb}>noN86YfldtT)X+jiB3|+eV&{eHOp34QSa_{&w;lLg_i1g1 z+~A;}$ea9Fu8wHSh@y|xAsyTcTUtW79GsfOJQs2awP@M8gpbb4Ia%0PQPdH=kivkyO5OWLj+O|mCYv{p+AS2-vf`q z_d5}o*S@LmD_ZVW=~lF8`lV81ah4~Hk+noD(7^w$`dpC4eaET9u~EQrJMP%Xx9{iX zsZ9=uCx%GPW7oU^+sOsG-Xs=||JI;{x1)ONuD_a<(UoGexn#7oot3iX*9Lmv@d&NO z!#W#ZB37F^XChfpjM3`Z_U#fz+aZk7L%|lq`rnyD#zo|`?#@cr;bwPe;^YS!e zrKq(5&6o;6l~?}o=&J#kx#`R|tk~$iPjhaX%6W&3ZFcB7o8B_#SGg5kfAu$cvnK<7 z8rWfbSOwJwS;6n_p!kYhjzxCu&bp&{ZqY;QYx-5|JTL9eh*RJ6HEOW#!*s!1)i}s(eb?ogfQun+A%t;MpASJi4LBN%Lb85w>!` ziXMz}FQ;w`($5Xw8$urR@^=%66B;3;^#C|2dh)dyPu~m*u=LUjrr3Yk3RW1=(O!yWLqJfm0`SZ z2ou?bjr~mr{=bILT*tWUcXDS9CCMSZ&gaElF|1c?Z2Lh-D(@%9nNsSTjlTN)uvEFG$}Ac1@deGWOb+x4hzZcXu<( z!p3E@V!u&og^k-X-U+QX9z^lZ_?ad_?)r{fh1;k?tgfZ#zUL$!z6Wya#BQ|Y-)Irt zC>n=@D&_FE&#${8K9aKEycI z1f|y%(wBJY`icA4_cRNi95mfn7hPqlbt`a7Z#6fRsHs@_ z=7p&GuttdN>JzOK%LubVavA(c27(nas5{uRpLJ3to*VM|uFYT|7cF`^!W!EJG8CpA z4r?A=G%_Ey#cZZ3)4Ng1g4(aKs~Q0EUqd5d4z`wW>XydJBOu&(j!qdvlbeVrJ86)) ztL=0@Mun9M_Cs}B9bVgvd`?FxoN8Vic~6#mcJzZU%7Gc$+!FsE3Fq@!mMyQGzdam4 z`qprL8)t#hEUvHzonYl&PWRqx6nTy^ltj#?)_nbqM0feil{3HBb&A-Gw5FIj=Hy~Id8OZ|IwSD<_VXGNOSTv9r(aKZM1F}|+Y^FGbl%cqBKK3+T@3oe*`5+w6I!&=!H-XhH`&VKm8l+SNX)X2~f}|bv10R_(rE6^iUE&Uuz12NwIQ01Hpnc3Y%h0~)$}DDaV3)DuX0xC5NA9XF z2+1vsi;3%LieMTxvj*$s-o%$n`KQMIocF!ws)pgW76UDz#&ZlO39;sqz&Ry)w|6{| zbnoB$!H>7ICHZ~5&9(snG4!jGLZG}Gk*us2&+mi+wO&R~a73W9CY0D3O0aym=snV8 zC%1TVEZ-zI!+X{1Z7|Zs4au>@=`jvaw`lGU9LlSM2|>5c1>zCJJCDA5YM)3g)l~{O zWe#Gthjh`tFMk5%4~FC!Wry_FCqQ%{Kkj6gSOn|ztl-F72^o=FGS*E``cl4A;veb3 z;l2aob;34%=k9Es5-ixN;oj%9;?B=7E9qMbb_;a;>H+*U)v6&83IR$rIQZDQ=Lt!O z@p8Qsi+xD|P9Q-a3clRU{T**kr}gjS5e-`#Pgy%&5=XF2-a>a1f{iZ*q8UZ&Pj$;d z8lM+IwVX}IO37A7#OM$lw)QexM}N)qlm8L<8qhogkk|MJ(Wquj!S*OLHdD?99kY~# znG}|UT4rE+%w@-{fn3q(W9=Yvt|9)V*KV#@Po@<+w`~-F3fw+u^j*u!ym!p8gBwyl z(4YCFDnKik5JbG(_?p+qDqZ^Y7k+GxxTK%3RkX2qb}^ql%%g#wjLc)iD`{9fM^@it zwY#PG&Kz)38UesK?Hp}KKj6VJ|6}qsVA#$;1JwX4bIV~|zZ<$hMByO8L!jg|0hx{X z0jQCY@87q(ma!rl5_wZ_&)ZcE@mKVe3Z-`90641HhIp9 zHI*$Acvg?19-d5thcx&qRB`Lb*0BFI^8FeRCyhX|yntzG z?svHdRO6#{m{VBeTWllp*;m?ULboQ^YSN@JhXki#`A{;sP>W{e zb(WAktG}x+!9|wXXMPFxuA8oA?*wj~_ZA6%;qfX!2e0=a^zvpz_mhJ@4G-vf3Sc{z z7CC7llOcIbefk}_5O-R~ToJ~eP78zYdc+?QZz1CXDBp|b8U8jyAYi|!NC6TTZpg6R z={)R$g7?0S^H4u1j7CbcaFj&Y{3Owl@Y8@zr>$re+t($>LCPz9Do9X5#rO?Mo<_`H zaznSD@ztjBbhq0s12TUwHxo)f?Wq%QvARVjI1r20^b`bRvzEOef9%z}R_TJxC3m?A z_XQOG5nMq@++0Wqn?nvbi>yg8QLb|Y{hzk4Il?7kFsi+5!aR%DHBaq(3TIlQH_`pA zHV#vML<;Y^_{|^~vbWGDo4&`ge{c>cR!cru=f0bBlZDrmDAhUt1SY5Vd40v>%cRym zMtUO%&9!uW@|52mIzN4N|HF-f182#izlW;&11m4yiQ=mu$e66;27uh`U0%cfa=a@J zc#M5El;cnn;84jG=cmp*jy=`%r2^2h zzK}TcWHf5)r3NZ3o!|jlQ7}DrErT5Dd>?yGs5W?e%54I{p^@V8WV~r$yNL>}4~M4k zQ&rStF2yFwS;F)kY^Z?v4DM45#TpSlL~eP0`+>AUqx}US@>N(8ayeKFM(`DIN8fr< zEgStKCWxZ@M)*gxg_G`-<5?0aoM+-gu!u0Ef{4N^nZn5k)OYWU`#wdOgImiF)#LZ& zRz}bJe2q7etZf)???H`$rzQQ*y}B4)b<@lvn^o6}ZVds{#>-C4^QiM{w zJe^O=*1k56c8S4{Htm!0L0#{9b?Av#0nWTj&B^)#P&$;6U>f`x)Q+ z+I=IaB_qYy>>ahizj&MrYDMK3mTDI|jho`Pa^FthLe8>6{STKl=6Mz|b3H|C5S{cN z5uQO9Ruk{}S@cPfeDqbOptSHLmn52VLljgas%xFYo%M$=FW@Timvkoxp$m^syEKc$ zhU8kw4>oIGb~EMT2nEmKK!V z?S@4p@NbFViA-faBrjD{oYd%2T<0AxR~gIUYQA@B8v2^nfhWHGq)i5m8ZmJX-#=yb znJ#{&#GJd9{5QOdjstcnWGn6tj*v3;7+|qPf?c#+2mt@0*Ndshkx4;_{2MO+E_i$Y zi6FV5axW^J-KhkDhwHrkR%ynBg{Ey{p(8X0=a)v>7o3tj6t<3G&8N*fWIoGJkCSBB zVz30O0Y(!&-pxG;2TarT6A<^lL~Rxdbock4=jb~GkC{ymj`UB)HK~zbB)F%wQ`9c3 zp8FQut-`qMj~Em2s&Nu00zZwhFvSwI(j5Rpw|?SHN#t$r{9nTpXVKo^LDw+yZeicl zvegfQasG7C8F2Y5jSq9gS|Jo_ptd^G$G`>ZLj_PA7RmLnM{DVzrY1T`nrtW@NjeDA zrR_NlHJ5>r#3VM0{!7>(nk;e1wHWXF*j>UpV$5yp{v=BAl)2Vzu_N>J0>EALm z*jiBw7N?`RjuZD7uGZ3@Kb~&#^h@WPURkhQ^YpEs^!8Y^|55+*2hQ;S*9t z{+}OAA0=V--;0j^cRuw0OTTMYG3EmT*DQhsNmz;*>kG&On;(wn6eA&afE=;`kT#5n z9kxTQ-ffGu*o8n|wVMPKkt6Ag@MJVtKmo|+gA9~N`l<~0mu8sj0L^6Q8X&DDuqF02 zTB6%okeFyJP9cJsftF;MqTV9nkU0BXwANYl5%3-Pee}%S?ga7J{0GN$90fO@F47hQunMNZ6 z-v}8r9RtqJsDc&HR4e2gzBU1BnJ%&sC>hQAg49gx^q05P#-aV50_UC}JDl&X3@Sp%{xQ%BM-UYu?mNTbqR9FAu=Py}geDJNbN|)dN)!mhcQ=R{NCDm2ZROo6^ z%{1AfW{@OWekv)UkiD1|#K|@~vNX{&!$>8E(L#2zq;Tv?p@igE8p|;ybP!oioGjvXsOXSWnG5FPfVR=Pi@DT)Pa!WXUzVZ za#0HjmREgrup)pRu9lVZn;wG6+_=u)frn(Jc~KV$gijm)SngP&JvQ{|Y( z@7J0AV&OhkO|MgpypL8H%eWli=ZW>ZN_5K_-}Yi->1mkp!W8`KuLz5!bL-x-Ht{4= zKUd|*^CUAr?=O%SNM6hx46)n9Iyam+Jro(fF`bh>zt)EHMtSBpCo^uVRuW=FdK_Qh zvvc{OD(B&R??VQf=6zGXmY1W`ImfO!)^5CYBYLtkH!+#*BId08&)>-FV@~Tbwtj7X zX=CVDtr(M%_@%5j^ZHy~+V{C`w30hs=@1Rcengp_dW3_eQQ(g6JMCo0ydSwL$w=O@ z@F}%wx@MBnrPkzN;%&9n+Ny8gsE>Ax)8oNrz&&{`y`9G6g5J>~U#qv6oidUG28mWK zZkWakHqqD0*SydPc#oN~_ zf_$itN3NYA8WYGp6jJTNL5gj1 zdNqVwSGxnZe`J0J&CeX~)rL5RbmS4INCyn?Zp--2B4A&cPrk)AjMeF<8~m_E_~M0} z*id3$M@KPaCDZ-R?@+X<{Qf`teiA65@%J}AWkto~Y6yk5;>6NK@$XP~XM4menwdsk zqt)&&*1v&TTx&aW*F?;$ZAg~C;{OB&(0Tbg7y#3@X5xu3Z*C8TH*fz}JLF*_m-y&Y zPIG@wJBv20exi?_Br%2jAseDoR7)o|_)oTVR>qLM0n(#*FrNjl>YoNK*pJMKwDgNW z+N+?uTTW)Bb|@2@^3*Y-ySNS?AOnFy7z&L_pb4L*qA5ycNf-usU6L}TV_IJCu-3ZS zE(CJu6N~rYbMY@$^B-X8*3$p&r^b3@uzf>lrCElho`r?Q0BBV1j#y(K^fUcqT3>)L zJ_lVRODsQ^;gj%#h%$0{_*nv3cbvu-M=$A_07IS2*NDwFVK{47_ZNxOuY_)TryH85 zeeiAD!*TpOWgyY}`l=#rw4ovF9VD4&Z{5cs%NgaP|Vf+N3w@Sb-_qzBHGX0Jb@PtJ6q&ROp7gD?&;>_W4*|> zELh=|y3IBj-y!1iriPGgm;7j;a!LHL%@+>;iJp$YftZVgt;}lnNavS1*{dtuPU5Wg z3?}Z`uAt?HzhSAyReynfdL=3Ny1*+r4d$@{-MxX%MiTSgR!Jae+9p6-1O1S9$GG-!$RbPdB0$5tJZwE2DlJkp_#gI+^CsxJLLQxcW)RZ{{TJHzd_TnFVt34ZB3u6QDI|S znh7IN%KNY};{n*t|40*&o}C1$3Av;qiM($ZMgmOH74F!HHINYu1o0TPgG>vIepVvH z#cTjbk`!*w*P}G*+o|o)C?rUqf{_IkZ{HnZp7|EbSc#CtU^&Qbq)xg@lBK=$ie4Li#jRyI|Tt$7Z9g)`NuKgtI zJ5C#>%$ytmOe^Z+O24eAtGEp8plC!Zyl&d_?nfBMXSg>?1C=k#NK;3|oIyz%Sr$NQ zR)H7oqI;d-t%FIoR_(kNC3UfK#;iuh*;S%YokGXXzOtxf9hr_XMWk*c3aDca35p*104R->+0lA*}YOVZ!9P~B+a z7v<>%*|B2|KJOM3fi5=_7!$`UxSEgGp3$c-b3=|0geBtAth@+TviM-RKmUPU_bDX$ z{PJ3&@3X;4ACkacwH4zn_z2fEh8!*L31PGCg$lG* zsFDxQ@Q7p&4z>&;@L2u%ERA*64ZiYvi|$?IRbD#w)N;aFzf%$u!i|Q3(wVEQ+VS(b zCCfP@RBJGatPygt;}m=9?pmGFB{}*8_O69s2&=)&6Y{{U08)`zj8n(0%!!*@zQRlg zn>At-)&kREO!3fFZNmZjprd9s)}uAM3;=-ObPy1_M0=dUrmSfIFEwok*Pm3JysQKK zA(&9h>^YRfI$G?x+4{5Pf?MBvZIj>G=hEk5WYw~QpC>eCI7j0g{Uf4gOw=Yi(*J@G zoMu|dX{3iT1&F;jEXo-{v%@I3=B(enbZPlb zsk)LC?Pd5cQ&!^jtomgW@Cs#pX(bh{szI;iO;_oI!ctiHS^1rfPVBea?4bH%4{C_0S|%eZ=y=Q%AXhFAGp$9rKcs{`?`6pID7(#?P^sxT@}ikG-5SC5?Yu(-D9xIe9=Hv()fn-3%9 zkFcqG9Fb|!gfX&c!kVjDLUcfCO7|FlJ+t;?!2FZ_0^lW z8J@FC`56~LTgw!bh&`(*uQft%`bQ#plRjLh>h~H7)`uS@mWhbr?vX__QQHYU6UI@7 zl9=VvJ)8A2=E)?&JQ?Em3DCDJWj4$?=~NP~n3F1Y^6UD{c-$BWGyXDVLhvAXGfV#(H1`*Q^(!nNi`Rzv4co&|j>^UKE+$64an3zKSG>8%19S0Fb-BW5Wi}Go*GUm=867noE3rnj4gn z**Tl%nM5Y?T3MDRq(Ly?`^4tpTz52L+(vyTOWQ8*S9tqgx%K+otQ0?_o1i)XPk!p^ zqvtKAKr+^GJlS}gc5>7kgGejy72~g){y2m0XnH%Qa{3_U-uqr_Zua`t^s|Y%PsNI6 zns9xG@m&f}BeFZ+82+O zU8&d&=@`TnY~jKMI^!Y#r>nK%xq!aL)B<(4R$+O|^A(n~_nYz_gY@tA;z$@9T#SE8 zg6qBIW6uKmqNk~%NNW*I+}j~>Fwm#Xx6h^iVJbV7t^VEIJ;(Pso{NDfO(`ti12uJz zT&egBGz3+onVkx3!5U>BYNH8J_o|i^LO)Di^jDLL?E>+}lCk*7%TJGMse)~3pDIr3 z72uL;DA2{p8+YIStJ^ePRIUodSDNt(Ri{_R_)i>hh)mr2k~N-BEUWfTL?NWr2oaty zLyS!*SM)?hK5*XmI9F0MgrxRw3Gw90Sc=G*6f9-`?=S6qz){5aU%QREfPl$gO zZ;)7&+GOjrHL7xz@*gLoDvuk2Q7}&i>zTD|59MzR<5`MY^Emv?UKuk$`zrx_n|+!e zw8A|p^Po&3rTu+(NH=I23W`ty;Igac&fZ6B=sv2yp2Dt8<~E;?Xz`vCyVW3L(&WJ% zRA1XkecRspeMh#irEErBxbkOg9ug=&s%bltu@HR5$Eo5iVtrg}zBS;ut20bz1I`B$ zS>6cDU{c#iwVP#$EATFzg2`e}&J*C*w}&(gI*wA0@G8T5R%SNymQ?<$#gkf+2fZ33 z$KWI{kaE8t^0a$<=9s7uY_}A7wp17-_Ky)xopI%RKnCbkBI+f7H;{xSgZ3Vr!`nhB zAv4T^I_37@A+XM5cJ1*xdX^5y3h-|$=~A#p1{u@3%X22FUd69!qD(khR?U}Tv4&vu z$p(}6!C7B?z$7KAyo4m=nUR^>Qj0jmaR`3B>}jL_^e0Q*D=c18pnaEEQr87=@9y=H z5Q|UhSA`dD0fcAn;hl<<_NEP;Aw*Y@KAaJCpe4>TzGC)x9?=m!e6?_unqQyGXexX6 zv-{jHx_vGZ;nG15S2u*Y1Lt(V10lU&e|DqErj7#mR)oIE(} zXTn*#jKQ2Ti7`1M8bJi-fybO<5QH@TUazE(*(z#c1=dl9q z+;xX^XYDR6l z{U!&-k+jr3xcBH;Hm>L%l>nJiR>BkA+9SO~_`Dlg>v_2fM#?!N)_8Pj=B63YTpluU zyd`hd40)3Np95D=ELL>*lc_>8>Txzd$OE@F`E*4ep8$BXgAxbVx+&@bd(XZL#l+W?Ptd3J;DyRQ(}# zxBmTIU+;f{x+56tuBbFbbmJzkwgM0tJ*+LfOw~(C@*P39T$dhL&%L~vZxR({sg?Zq z)?CebC*I)DpTPy3xT_?zHCAlBnh|essxk3I-=M*GoXC@rm8dKSdpvfhDpBf`+SS0+ zqDYL&X}G=k;o`;)pbEQ7LJLnX-gEW@spNdwGZg4e7lO3$dTXZWwoJtr>z7mp*B0{{R3 diff --git a/docs/benchmarks/cpp/struct.png b/docs/benchmarks/cpp/struct.png index 88e586ff643317e17c500c6f03f572c4b08a4628..398ab52f803dd836eb63474934580c3327509c2c 100644 GIT binary patch literal 51954 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 WU}NN3d!j3o+OxxId&ah77yk`A+jP?a literal 51352 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 C#OEmh diff --git a/docs/benchmarks/cpp/structlist.png b/docs/benchmarks/cpp/structlist.png index c676e84df016bfb8d94fc7982251d7eb30b21e62..47c5f680f0252ebb9fe8ae64e065ae40be08b5f2 100644 GIT binary patch literal 52960 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 literal 53820 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

#z`H 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 diff --git a/docs/benchmarks/cpp/throughput.png b/docs/benchmarks/cpp/throughput.png index 9ffa742b6572b8b6ff27b7c472bd234e80b0addf..525f58ff72cafc2e0cfd861cb6eb13312c6a5cdd 100644 GIT binary patch literal 80164 zcmeFZby$?^+BZDtLKF~GN?Jt$NkzI9V~G+HxV=$PbH~+qR7lS!w ziNPFvcK8td2LG&p3jQbId`;U~&F;Rlo3W!gM#c8jFq}aDkys>m-Nle#FgLGWR(DUB z9U*&7JF!c)7#seG^p5If)ngY=ctxD)4>Opp-q@KF2@1My8p`CQqOLwGqnUFr$iVdU z@oQKAI?ne&UVU&kdE=Z@MUk7A`NDcQ(L2c^d1UBKqK}2^eOKH<+fKU1O}N1a_+Pga z#oTPRzy8;+Fc|q%`Gf!cD>icB|N0eX{O$k$u>W;T{=YdOs)D(?C5mM)IBw88S1JTh z-t3l{$@yp{Vtx7Juw!eQ2dk*Hc42(i*)VoFtTSt9#F5dmnq3=RHov`O!DL#}0!_Db46_B=|FXJ;cxR%I#t8m*{&#v0V6K9d^Q+ltPMc7g`ZZbO`tJ}Hf zt1wAQp_p7*xUt4h_>^|c&|@OHxJvY=JKjW$6r(NQ%)k`m{nm5Y|LZu#GU?Wp75AD+ zWh}-&L;j#Vjpp6EC*~`rk_uMZr2=Jrwx9Xa>vB62y3Vc6^a)xQf4@FjPoqLfExjne zxkp?G8Bx#reX4hYUV%|Jp#NsXjN;n^t^CChqn$G>PTww$ z{`6Wn`tg1nkE_!I6En)5XQ7WL6&o=a;d6U(IB$YfcMq|B>E6;oYUzSO2a`{6wMTeF z43u@`=EtK{s8%N1vNwo7-Ecmm4Gczl-dy5x{@r<6#+Q&5TYD~6|3m;4E7N?<{@%M1r_YZ_2tP8_GOl}d{H*rM z*w8l#I(J2lj=G2N{r!!0y>zFkc8S2Ib`gGsS+hi+^#M`}OW&1v+%tCH&C>~<)0q!; zb&r*9OrD*O8e0w`ejqiVoE@uVwhOBW@6)0bz)v~1iS#`yG;N~)B!Q8qh+f;RbX!Q; zW8B`FN)C)Q@|Do{S?e_}8*!y*<@fXzwBAMfaYRInZ8MLY*_a(Ryp1Dn^BzpL$;szi|uf-EZ&P>D88-#OsGG&VxUp{ zAY^n)mN-iz@M*Tl9?nYuZ+=x#ztRDWZi*mw^W88G4!n}jPDYX^&#vqiES1_jH&~;2 zG@AUR@B1{z$TvpDhdyrPH073MROse1#XKU7*zeF%!ZBL)x$Q01QP=J7;`aSR1S+|6 zioWtl7_sM%pX_V;G+)WI1gMhSl7 zGSape4)pQ4#bxxU*2>@)fkYLBp=V}$cT1jb!rI42 z!$mgZl{0y~u4rlnk}Wx>Fj(*ET`u85Dm6KO2)goH*I0bP>y_ZQz3i%DtG&2 zQwXZulimyB^Xc)nad`qKhANuRgrq8u+4&KNcyMyb{dt>7blECw?!O+V&9%6-PP7Wv z+@1@b({uiQO`$2ARRM?fsXHCW@>0^PLG*=Zv4Rl(!XRb6%EaD^N(zB~~#~5l38+>wATES(gB&+)u%u4Evc=fDbYWRi5NYBYTy0><6eRH=hf1m;lrf__-b~RGk0Y?SN|rl z(ugKEjc?7Pv8!6To`oq}?YfoGmtRmzKKe>c`3US?o3PU8xT+h%zB`+%8v_=}iF@H% z_{{R~$@sn^MMcHhqhiC6Yzx&JKSey-RteqR+t@Be-ZXQz?EAJ*FGhQ{jB-~jSjz}B z%HpSO#2mI7Cdy&2`Ir6l%)XxA5y~nhszGAlI$*A5*#qU;zTY@7jpyxF=?iE(Oid9m$O~qPon7z@QZXb?x60Fx!@$P`HF&WWvR3^!99g@r5QQebRxc7z8fQMnI?P~d9@RM z`@`NVZGy}FKdDmWcn1Srjh|ef=bi6f z3)QjYi}ibcrEY~zLc#1qRC8_b!?wx)Z`leG&C>}qyh(T3|< zeqLecGNfp;&g?Y#?Pjta3)kdXhrx^cj2G_7>)sz&S54lv`BsbHFdxP>`i#-*S>Lfa zq!zm{5|@Y9kv$f8!(k^F-|#?#wrs}ziNbJfQ-`2$_|kM1LNDDnH7d+-X-l&6dVA|- zHU43ugWUW${UQC*j-Z)=atFLs;VY6y!8>+_*iLPL6#iMw40|`Qs&BmCt|NrO9ee^4 zm+)x;`|0fbJN#S=S8~pZ^WM&sTx_xJNTsuGqNEGY1K3>z+%3Us=N5o98U&Y`{oRG` z#V=3EViVlQf(Q=Tnz@RVu5-Fw&^3gmqm*U1OjcFHR>#jz@1X2wnH4tB^RoT~;PtXSQ7U$i zHFl^?45xqh@PM#Wo1RANVlZzWw+?^>#i1W*w_>{p_2!;+N5#~MhJL#O&-hA$khx;ZSKfU6`Rb1yXWEBE z`t;Q*S!^o_>5lok(0LS%HkvsiUO6xPtadh7fO<(NxJIv&I*v+r+D5odd!xtV7qVMr z5#qiBHs`Q@-ucs|(OIv2BECI4Len+%BG=R*i8n9b?Wc#uO{Ho;CTR;7J(kCLnpztx zcGrh)X=)q$cdfmhEj>QvRsZ~W$zD!VD5F}@H=)*7;WV*+`r!k@`%rkmTLJJw{GIrQ@FlaO1*<3nzkc^72%;1$lAbt)$Y)+r+OBI)yI(W1}9>2qz*pcuR z8-=Z(3q5Ko{AKw9pB8Xd*}00ouI+Lr+3l8t&54O2mTKXA&}X&o)$W8wa2?JS_P}f|=$a&S`ez zVmF4JR0x|D+g>iayF}(Ti8J}=!{MfQ)51m?^*R<8ZfyG3+%Io`LnxlMBL zkh+Aj50O~$BcuocJK>rEaX2l9^oSG&8We76Z1F98!)nvJ;hDdp=qwTV#B zcdB!h8fT`(DCQ5{kGJ7*vHf_^nObVL;3e8qX^AnLmG2{DD^~-zXYy+d?}k3&+`AC| zSd;Sj{kFL1fCl@AyK8-dyE#}`);u^~stCEpWRJ-=t93G8e`Jg2>ul0UNi1O|HzlsI z`|UWixDMH9F~vx)_nVSZTbBOxoDt^pJ#^9XE7fv%VwlW&KZlELk$rCEBTj+$&*+R+i#zU zd*G+GevdeIEpOXbYkmIfp~Q{2?))s=cPtXtH2%R(PaDn)LP=D z?e^_<|5+)yy-oas_z)d^>0gq0Mh*jwyI%mXcm3j0?J1$w8JbuH%okHCHS@HuG4Ip7 zuDM*b>hA9JkC5^a^BM1*s-lVG#1{^U;mLXfeDB^_do&!}$1jI-{pGzi5u4^SjoY1f zOUrL_S=M;F-Q!S0vr%R)_jGfhM_q#$Hv89`eywnv%Yd7@$^Zl#-%3pojWXkw`-u15CSbVOnTdL#`*xEzi>+E-_n1W zThb*StM7O-dQ^S(szwH9;)?!QL{-i^)7e)dX7V(C+V^`;<4Hsuwq8Z=TIS`wyr&st z-Nfp~cmBFOjTA+NWZXsZ)~xAjM@NI1bJGt&OcN6XoT3W+ck`;r^7C zV;0HPvaXdp!K{JW6N1bcuyF!X_P09xc$D7HYS8ftJS|FWq0`d8I5lG$D9+4fD3fvi zknly!^X?#HU6&$PzKZdenH+is=h|T*7d9rl{4fqDW=$pgVY_BbxWp(jovN|3Lcz&y zc{E~0Suq#IpU;@-_-)p)E5@4A-_xX(nj2_gr86>$`e*T*YDeXo`m4Jd8ECwI<X_chs$!`05yWQ@6K(V6n4afMxoq$1TFrEeAS)9sgQt+z!{&2a2i04s^ zyeZpXC(LVJjLE&DSR-!4*6f&j?p3X{XFEulQBI(~Ar!EM?urlq#AqMeL_H*RA!kAV zIo7GF(n9+2*`#s04UVOI)0;_4@`Tx|(dEfOK2b$ninQB*1y`=0o+(NwqWNrFwbb}> zFqrFIeP83jrtG`8JztlZ2Iy{gJr})Pe|hOFjb|2VIputqm95I!y*+E%I2vz<^++@J zpH^$4naHYqa$iZk1SdZI;eFRiAiJ-7Vury8QNzXL=1!;>C_BQ^hJ}@|v5pqBK@tAZFJ_947eiuODK(b6{mPWQS@2e$zQ>^mG%Aqf0?D_>8&tk@aeoWk5ffY_u0ga_Id7lEJHFYz)RuHuB zzxVWL7amlhvafv$WjJ4g*Qr><-A9@T)=;vd1DecNh`4=Onef&nU`Q1HjzEJ`iHMTT z!n;WHeZc_`7K!_DlPi&yUf1%iV#oe+Yz^hyP?<_Z_Cw+Ga1V)oK~}MEkP$x=Lk6 zG|=nuji@Bc${=2sqmwnvabws8(1ui!2`6sx9jB66?X0rNoR;F1#D`w8 zT1{H2=CPH-fZl}>mO~Oj<^E*69r-#@jA$bXn3AbXp>a{}KXybwdhtTkMNCg;) zq}oomBo$nR`9`8CPNaPZfIJ;4k6j6Zy1*2>y~CJ9c#v9P6Mr=A;&$X4K>xj&MzkAc zI+{A&eD4IHrvH?i!Lzya+?kNg{`QFEV3#j{GVEIQ3ZvFRO^2F0%|0f>>4U`&Xqc>I zwgK^9QFuO7f0>L`eQwWk_4oIQbuRzypZw2^>jKg`%w}@SsF1MI?l87-?^{&X!&`lM z26e}8u-wV!dnYO(CtoP^q-e}88BVEG4t!36Sm(PC0VZFdJb|X+5}Ze$nk?6B#YGAB zgnOTs+j`>tmJi+KjZ>_&Fr+M%@Yi~EJ#UwoN?7bvpcd(0#YdDMq!Lg0I=XaYKSFNr z^@_Y=isw?`FcLX?2;R_1)TRh)eMZy>Z`bAMe5?fxqYf#Cw$*Dt7Jt8w2yp2$C|fNN ztX{oa8G&y+crELM)Y0#NqT-x3$$4`kS1>b!&maG7ZEEc$tvw;PzonAqz^R;YlIbhb zqte)u3!Sz%YW8JT=SMybFIwxg#fu5%R4sqiQ0AI>RIfbIXXIzFFmYE8j*MY+U5w8C zHwjZb_?Uw~|<{YrovyQbd<|Zx3p>1X(Q$tiVh+SF-orxuUFTr*BvK^aDVV z$uBjZ@lY?dS#oMyH(tV2OdohW%P!%tqradw;(C|eVV^~+pm2o=hse-fjiAZhJ!a^-YokcS=I{f=FsSILc(*yCHR7f@+>u`~87Jb|Q8c7jx{Kla zJ$|s@-iL(+++69902F@KQD9%UYn}oSj41eiojF>nqWBDB-G1}Q$tWNRUthvqTo+cQ z5d+HBf#$aTDGCLghpf+3%!pgKPq8sR8o}F?6xlhRb?OjcBQ#bo?mU zzJFX}Z6o`V?QnTdK%Cie2b^x=+(Yko|vE!_g`qG zO8z79`&YjFM^(#^uR9>1sSpy)iKi0%Y2sgW(vntj=LKE%>iCJ86kF`pWY76Q^H>A& z^`y?OdY(dnj&_yTmL8?KADf+sHA7@&oDN^JA%g?+k8)IrB!wavE8O!1F`w5!&oKV#+C!4IiBIl50AV&Q@U(S<3_s{e?GSL zL*-US0G;Dcit|J5_@b9==-f!gjX;s_$B0$a_3c)}4D(RJ zGnY*$!$0nNQF57zd^?HN(lC}t_HGsJ+a7wg?xUkOHl-U?YIgcYURGuW&zs4+rMk9C zSS}L!zm`cXeT)3k&3i{FmWX0|oIb#0YXRiE;2~IO9eGY>SQPh@(Dq&I#qY< z_WZ^v{LdLh3abCnXMhfBE&FecQ*>@xxjG+j`+-z`o*fXC)_XNO9~=gruCgIDUv64i zbVBvyQj_rx2@`LixmI!z9rs7}59Yk_4dKdQZ~h$GT*5nHwOo2-S1LvWnD5@;Q^vd1 z5Dg^d&mGFWSRc$f=RO3rt-HMNs6T!7c9P@Q^JyBsZbLR@33&6?Ea>DSx|&P$3cn}Q zWs}WKxt-VQV>l`NGnC?gjL9}xGq+RC=Cp`<1C9~hc0I8%RCr*MzijyB`p7PEL*=xK zbR_!76c2L>uV*a}YQt_8e0VG8s&02_&&CR`o<#AioCb#849=#ZNy&`1fy{JYzR_jB zeWW)Ktb{>$H; z7R05=(|&9h^fGEt%B&(c0^$~HwwA{!ltR3Xzi=9TxQ$g6TlTMf0T?dj7_H?g3%W$P zU4jaM>@J|EE*l`tD!o%yJoB^YAgzk;^&enr1VUxFEq+M+4Iekqbrpp|vuIgrfCKgb z|1*M<>GCCG^3RwUKwr``PWD;9N%w0^_BT@6K`3eE(G;`!pqQj&pm~np)i&z{?>irO zlZnRsO%7~j)`P->Nv$t$3Fu^YSzo)@pZ#EMVEcmrZF7J|!bT3cvB6|@WYL6nX;jZ^ zt7Qq%o*)wQ{fp|~d<>PG=Z7WcqD-DI!iP(@5zu@RO12)I%dM-o6=RdPRt6g?cqviC zRj=iT5r!vFVrG+^Ux{st%S*1Di#*K<~f2C2c zvez~(rP1ysgIDz5(x<$=^rQxCEdusfjYP`nO`NyKvj3z4_Cm7v+ofiPEI5G@TUTtC zNiDIomMIBfAOsv0?LV~xW{omy1_+>mVPZeU!QLXvd}pNOccFT7EF@D%b!TkQv6Y{> zYNYdS!@W!0V6${Jp+;Wmx6&q7H{KEz(pB0aOXM4AI#!w${5~JMZS@5w=DKPkg6l8r zw|pN~i!iKJQ%8&jWgna0&Qj-z2A-VnmpY`?Cd3PC2NNWmy6~t84Htk$8bkcX8z<}I znZ*|08uu{o&HRlpCXETN8n7MG7DghG=w4M4`gly?hHmTY@buEG(}VXedosZm`x6`3{l#B`dz8o*8EU*`mU8PxUt zWkhHT|igC|lq4kI5q069Z*-IA=P%iTUw1kL2>NJlUxDv*uO+u35T_OL4XbNGq>J}`*qD8Q-DCU( z;aR&lWpK;>ByW_UF#Dex+`wV9$-Z@Eq=n&Y*)=StE#kn@S5BRm$3ZAjtqgqr6_B{!AebeAhD(&YC?5Ps6KoC>38va=ej+#U=I=I;6k# zixk7wMh@ZSB#P#8v&=^#i#nEorwAHonm33xObn?~flBD?2Lk*v;A@{+Z0fdTqfjzo zL@P%~pV=WfuGMI7ITm~zxm27fn7+5Ztosa9#@p@Ywn$=IIO9`!TE8FRN{HMe+=(yk zxmH@82NqN2J6=q53t5Wzm|dCs;@$O6qJ}p)h-8MRefKpthJ+1SPtPdC?%MF6>Jjj# zdW^K3%;JK7VrZX+K8pFgKQ(h5S7E!FIMwZDTj|q0D3GCjN^pK?Y{Sd-f`>uO6m$}L zCOz;jYC+iV#v>ebJ6<%mOB`9Z<$$l4$9LoFWDDPZe13$6bG&NIQ$M3<_l|T6XHvnP z4}X@G2;;)9r_{+nLYFx87$^2|i>w&G-eCmoDCO>=2hAq|Q(X zl%LXf8*v$hx~{_Yv|*Mp_{;vJ)Bmiqqbk_Q{bc!du;;jfE_8YXX>eu+BPM)WV7*(Q`D+@+`w6h!- z@;!`5G4I9|IvwLZmkf0)`bz7!l*>ehH~N+g%FK} zvC3LZi!);4PCSLj* zIK=Na$?e^lDs4J;#UGd&-?+qba zZt5t`(o>>J&40*VRN8uehM}Q@&vvLJI#K?ZTnFDl%iBv=tK3g~esx~0Hb&1@$8*d; zzbpx&F$KMvdLq9?zxQkeE%9_MoqhZ|@RiJqQ+ZDv{GtqU%Vc%xQG^3qQ?wPXRTxIB zoV6-j^7)#zuwkpzw`5(l=_T$RxiR5L(9YJ zdA+U|9Zr!j`)i;j2+TjtujU<+Gdab{5jCWEyXfEG*D3EFv83D+ONREn6^VG&hopZR zITyg{&j+%f(WfZ{QY|%?Ce$I1GsD<#2hX1E?E_d$F$UalD;yp|7q_}~9;8K2j~H5J zCV{_M%o<%?Vu!<;0b3G$(3_=EG1aH<)bQak#)dI(kc?Ei@IC+)qv8P+ z{;J^_U+@w#rpTz-63TK1gi#xI>`;jp<)0%f8qL)!6VS0PY)~BXt3Q6@6^s365`sfj zJ~!5lg?{L6xAA}%g1f1Jy?cN1c)}ZZ@A1c9j~BJ+DgsH%|0{nsDBi*gLYV}iRuMb8 zH9|L6m=`d94GCqJ*21igjCT<9ilJl?FBsmYm&-3o#v#PIQUd<-c?d}>AJHTh{ z_Ng*}wc6{O6vd??P?lG}cFAjD6AM~|&rL8ryK!#A4mT?Le4(|Z<%dK({KSHHY%$!2 zq8DS!3=tbkg4_M7h7EQxTm9&vhXXcQY8lE8AYey?w98<^(QHfL$L9_nqU2^}i`BD! zSTzFG>Rd@7lFc3<6qV!aCQy@%W1bE~l77N{v_`Pf7)w_{HzfS6Rp*N(T6 zz14oh)X3hL_)%BR#$VKYW}a%&oA)}Y({4vVsKqs(%-{eceOm{R{rEG{!6 zN!OMbLM*UGLa9d!ykMjg)7roWt7G%&i66xB#Cn&F)F|bwZpppR2dQ82RV~&|tdkb< zo0m1XOM!{mS}kDPx3neR7PmS7X+g2W?Ul+i6Gr7}@R_=@p7@Y=CaPzgK2}Eof?l5zL_rG`{+SkQsGG61N61K4jL~;&5e@_SMrcZW zZEj)8%O@cp)Y+JD8saO5k>Ch`6FS=i^=rlN;%4hss{IT$f#p(FYeQVg1s zKdU@e6x*d&zBvwQ?#!C#eVyc4qL-VA^UW9+g6b{o3&QCwumd$h&QYl*g#Ln51n&qL zQVgRTl!0CZgl?-z(QF^bGUorO`@Chqe0-<_bY&%VhbZOketG%?KixdF|aiw_Xb13$Lx_YI1974_z{yfLU^8Y2f$ zt11M?Sh#GYUo*C?m6#Tz%ahwwI5q^@>J?DgyDLv**EU)`E-adat{K~yn{~qC^lUjk z{6S(Eor09>?CUH#0hBsAV4HJ+fnBSlx{)V&i98&InR>^^9HoFfb~}cwXhn-B7Y^be z{SueXo;{AtUjluN(?k4oj_|)X3J+LmXfav;z4Xx!P-3^|iL$N!fN~Z*b~;+i@aB+q z`f1swa`sTI>!HM0R@eU1eATO64_L!Bu97{xa!pG(`St2$&uaZYY zB!ceUdjMLgE@iWJ4TCxOLZSOP5M)&7MSjwwMox~DG}xcp-`(**d>{b;i&a?2Y3Yu*-18tsuG~K+z&2b}~5~Vt$@iZ0B3tn3 zq~9+Rk1?r~6Nbv{3giFcdqkdi9IQmCOpHCPN@N6AYBZh7*AU$P9qBvREE9LISeE_c z{*`y+K%q{(Uxe?WYml;7{d%QPSNl&Q?)>W@IdWEQ68Y0R1QkEU4Y0)>FW0>xRm!11 z$xECA{b3YrCA+&MN|ZGw4Rzdy$dwaPv`tFZ+{fxaKR#FoAy~E9NsO@0G6{xWT__;# z#YK5vp+hNYk;gH`(%bEAH4DS9$()+9*&DOT8>6_VIoJ;SHlGem<#jZ4>D3s8;&oK1 z0eU1OihiXvq0D(QO995qRcE~Two%|Q;6Zn~22bZA9OGBA z;ac2>?tS@_qlU7}6z@$!p6&8Dpr)j>cb}B?cCW;NIz|3N07Gxh?!99Lg9U*Bg+Y1;T3#RO2X|XLondWSQ2g@g#&Mc0X@8 zRbqF|XJ%7_#Bko1tU>Y0{AvmWEKa@ia;wu19g8#~B1pyXAt7vUSu}nSBdjG9Pz%Rp z&5Tn1)@crm_Tq0T!IQ8V9WQKvtwt9PVUZ`a#=%;xp*kfyVF%@#U4-ga$RcuFl>erJgE4dbQzsWu$89MIZaA#Pi&>e6y}EGPyVga)Cv zoi|vEJYp=!IE1h0?=OSo@^w*ywBab269)9(zps=e{pO_-$gQL;jswylZ(?z}ou#dL zaTW!IYhe*OX+GQrj#me)?KO|VJhZ~Fen(8)M{U-v0A}02%PhZNV>k+NI4b1QD>enO z+LFyrFsLY(&sWaW!bg0a#V48$^-Vw@+&Kch%iN$y;??7FxE!0pOJeSezpmRbygEwz z1IWm#lq;l$&$~Kd;)J&#`xqVi)*gbuB8&$+Up61c(8EHa03v)I*}pu73?Y2a`oPq9QhhN zbah7t3pt8Z8`2aB^S=uFmjQ^r%A=AsYmO`!3+7Fql7q;$J;Y?wn{Kdqm~nI*#jKq( z;$}geohbyCSiZ*1s@Y={IXBpSgh`p+Xe;shj$b_6Qg3exinCILsYv?C;3`NF8AAw= z0wp)K@4qqcB6$G^!*&xa-db>t7zCgTDK5A`vGm97Oo|ac2X8(l!C0NqY^#FgW?i?6 z9BX4JV-z;Tgsa$VW8V1bQPIQ5nMZt-X}sE0V^T?U;H=Dg)CXTIXm*P*4#IEHAQV7x z@ly7}?nD&G)7IVdynyB1VJJ<%46(|2Wk63rffYoa4Y)4y-1=E!vc_*jyYX ze9cFU7g58?v5n$e6&IAce9E>%na~feRJ!mbpKObclTy`-tR((RQf?%J(-S zl(o`>H5|6r=a^x6eJYqr@(M7l_SA?|&f$Ti{w}XZ#jtT8E0dWoOyoQojG{(^IWI!d zz2$7^FJRg#{>)>&Irt-0fY1+sZndFYKCdd%Pdm+_|WlDNa@1^)BKpLpQt zfBqZ&?7`jn-@l3s{J%V`xJ~RpTgTm7{B-x*6Bs==<_%`k;feB3<1ZLrK`Rzcj$rV} zE6!`O=-0Q-uz!d{-{4Wq)$5V*-hY0&f92r)zj7&LuLTPn;({$D;CcyupK_;O)_#^k zE$N>JU6q9$0YhaN{-DrPVsI|ur?%Nc-wqFoHmje{%E_7l=))tKp}($46fuFSac>|KCGle5Yv9MBD$mH7h(u6LbH0dnEn; z?!yKrnc;Iiig}xwdUhm5Terk2+7{lAHp2T+y8LzcN!45EK(G=zh^pSpBymqPl`e3o zroeMjNaLm4Y&Rj*R|ipZjPnn#nAKp$TI!VJg?< z)o3m~R!)@kheYhziNBQQz)^!)j2G~ZAAD$}0#aNGnLCH;6BU6KsFi=LCFkvVzyvQv zfdo?|&HM)0trDfn>OeNsTU>`jtj>^t#&*`6{^Am*b1(>=b#6#(wzyl_7(xl7ApBDNX;jcM>R_!Ic8bC`9X}zJ0iVn?i>)8_StsOF zIx9;geQ8ysBTb;A7=L|r{=vw%;Ir_NJMG603SUF(<543QM@r`T^XHEsB2 zWf;DZR5D#2Zy5!p>CcjYj_dNkA>el{g&-vg>mYDI9)V8EHqSvA1XGMK)wpG;SmYv< z_uj#P6jqlpESc$lmW%={nKCrjK}`1DzKIrPr#yT@m&Ewai+_;|_jE#JnYA&DnIW%w zeXtXZ4M`cd4aC=R^PQ#Mv2d%RXDnlLUU79JH=xk}0USi5Vaz*W~Ya*Yk zJ)DYyQ&H5NJ^w71Kv*t$O7Ws;5$0&+9#xQ)SL>@h!m4nOBJ(lyHnE)vLBAsi#`EN< zYAsZ)C|4RmAl8YhBPn8m44(0yH(^$C;qi;G-t2$B4GchG9(|Z1T8sOE^4>n+Bsjv; zP_}7i4ed2_lOL_#nv6$CkQz>^(mvh}_-rLzE%d)X`6S_L0Ap3By8k_KN}g@=IHT-y z1vJxI;IC{bjot}*k*Cr_XlVp2C@d0zZeYiu7*X~0Ze|#_XrDs+s1tHy7odqN){T*z zK|2`E2ssUx^0%#RtPe4!)D2bun?fN=Nw|9 zXA;jd4I^>CyV7oXCOq{07UdzNGT9>ihHJ$v>CZo0;xk^pe7Oj1HjQ9r;x)EHS7I|H z3b>6^COp3-4H)QKmzf`#%_GnNox+g;<}3#v`GQ4z0>ow?Pw9A#Es7gnTap>`y0+vq zM%17kVj8keid&FwSiJ#R1guZhr?-i)Me>FEQ1wN(xPTuGw(@GC zFkZ4agxeFPWRn(W0cO}>i>8vp#R!|_33>vko0<+aT(IO?E>YDN;^ja9|}v;lcp zd7WHEM+4U=Ge`tetH^Gd{Xu<-yt(Sz5Xi^Z0RUj%UYlV+v0OaiD2&udFMdAwr`Dix zhqTcp9%d8{V**SwpY8Mse~2xNO{TKF8$KbuHCpd5dwMg1jPm3$-7?J@L8txQjX*S) z0(C^h8bsZo$EVyT69{7%-Sq>|64^;|JU9Sot;O$|0;a3b34f zO=8sqO4g`_98pKxYp$dY#n%du^RhM%x{|=(%xG)K%L+ZoYB?MiFd2DV*d>MngNclQ z*0=mP-Pn*uvLnUjOGY^c?6DiQCL#Rv;V?w!*s;Hfk0AJ>kTad~JP;}rC)ALtM)QA;r3P3f|4kaEd+U-F?+}sqQe2<@gg#AqrO+)%d1$K(fKnBclx7ArM+)AcLX%>D!5tCBp?! z)6OFt_ZCWxF#z%h1s+g{PL;txA#br&FOM`xii8D7>d5Z0+5s!R-GO}hKNDe)lb~jm za-~G6zUdhmcr%F%Mk8io2&$-L1Np^Wim-#Ij588l$r%is?=bDn80}Yn6}5ppnKDZDG@OI4QKSY9w5k0pgXAZR*Xa+D2wO7F5Oo%_Sa)?2qt*Wm@&^MIUi)zqDWHgty=&zXmQ|bPr>}3r}H-z*y zgtSG^#n-RbPqj`TiwhJNeB-`Ul~a@WFzKDRbhy@fNnu0@Z0i6tzRI5u=Pdw6k;JQI zlPr(RbwH(;UK@#pV+Ml-QmHgTMWMf*PzW4GRiT9O3$nV9Z7W>u9_rB$dJl!mc8VCk zpm?ESY-XFZMh~<_=cO;3Y)jRSL0r$TLLE2?ntrCRbkebxxnd6PEcx%yAKw+NsB2<7 z&SN=c8E}HQb+kzQ$4(x|dMB@N5DjG3zP@ORcq;GFPhbYtfpl>KRBo(#uNg3QDgZrH z3pM+`gQvzC0lLcLLr88^9fg4lf3Cu9vz*&+2A~P6*%v|TJ>xTn)aPGlf*UdCEKf#- z@RPN#)}WWC9i%srE41iHnh0okGzsQ5H4NVV?YU57TRs}#Z2tuW$-$HrL>+bjrZz6a zx_JicO?nolcpmsbUr%`uM9MH`6T)BmH{%yLim%Dd%^E08z67}6tp`4T{Ljp6=&AMH zkD7 z+|z1!{)H8ejlj~Q$Ng_24pE+r%+rkQUeb`p_2}zvO_RIO)kWQTe?9Hs`J%{CguPfR_hn@jKC|=!i zzZL|8bg8__^}MO|*;&PBMGWQkZ^?;^wL&dxz5%>uOMa#GaBwg6Jfs;aPdu=ps(!9T zYhaP+QVXc07E0|gWE^xEqpCyp8}$#uS1$ik9B?F-UmRCgy51=)92lCC`B5K0>=U-S z5f-5XTb~bD{Hgkk)+9-Y9t(xjc_}h1)XiQ|CK`i5ZFlSV(UNj zRGtk%-pY<1%)O*X&7rsK)*0beauF&y&urUWM)|8KD0a(>#Nvri5P@U0Jc zY6Ko$b2|k1nARck9wQ5Xl!J0Sx^n^b@7 z+#!*|N^?rH(teYWLzevTl+I)02Yb|a^lzb#f!sdfcF2}${`u5x|Nhi`{eO7hBWaZH zbw)*Ol0_EAfSqwbTy<5vkSYXEwRjEm_vA&BtK}fA)grJ9n?=`#8#V<-SYQj|;(#PR z2+f~Ia!rFRx6sqag1Fn!$jr$b1ES z#aa~9&PUt_wps)dB%%8)bzy8IyoeKLwXyOQW{Q`B>j2>yjB1HS8wSo zf=e*K%>!{OYiK0KFpD+{Rs{v(V!qpMF^dP_Z=grZnr`P|lcN00rtAgO%D0tCFP!k1cqty>| zO6^+fn@bh}NK4FtZsn5Xt2rtp3C)?J#|mC3C35^A!it&P3NB^h%9Akkuh;={OV0If zb|JIBnb2vm{ak?_iTy)e9(kus+(l#=W0eB+Y!v0h5w)}&DzzyGnXC?$C!;7_!Q#(V z1t8G#`;N;sND*HyaA z&g0kMOVj(;L&$j~ZRzN&aXa5iC=&90(I;Ua0%CI>9tw1i2sp z;I-s1Ofxpva>6r@U9mKnMaTbtZpBxjJs*Ke?hHB6kPB6a3c{EiImG|0-NA4}ngg3H zDB+9H1L!_w!V@3;Z=I}R2_|`-q39vZx;_I_;S+$(-B}A`_-INIAUUp`DLDpDRrik zc;+ViA8ZUi{c{UW0gyWi<0n+mo3+u1d#&!nT)K7m3I$NG0yMM?L{_JJdBG~aWQ#uXFtG*GWkm1TD1g!=3lFAZfCIoSy3(0+5a!Rn<r6@(5J{3qMl?eK z@(6Y14tSoUA*83qh~MHwcyA|&!$jN1jpU1_*Iz^Y7KqiFgXDMMpOPi<2*Le6t!l zcYF3C_lC5Rr}v&Tf3f=O%1x%|sR!$;oe!r&R;C_|?imlB;Z;w{V8~8t+N{@P<%)hBL0+<=} zk}BuUokLtrvAYFfOI|A|Ej*$O4SnNX0QowhDj=2X0yz8$cyvXZkq%gpK-x397BzEq zqf5EqVlNuBI1a29EshIobgeMAux&EaqoW%<`!1)YU8^FQXx6e$U9o0$bSgMafvBF> zJ_+USeH9LsuTr>BlCyc>CU%K_2%R6=*nc%zVI`CS(FUqi2VxmBs>{x`y&$HaqykpE z2*Iaw)=)7tl5V3d(v?Ub`i&5YNMC4*#?8E!CxsvC^tPhwjNBh}cez47 z-St(&6pF+CIY=p($D9#Py8zzD z1(>?+j7(QaX4BMtkahuvpJ;pP50Z`T=!5@*u5H2ndwal|_$4e=M}UFx@@O-Zkq;zW z^4(kmW6OFg0)4U zIDxRU1mWQF|07MPp8Z!BQ@w;P3-B7|no)<~rL%aBDwKN4C_E?M>CaZ>PVZwV2$jEi z8D22u9t;z`o`-6#_eUbfT>Ez$DbZ6#Nu2i4ffXP(4|`nU1k1m@t^Zl*z@KgVs|JBw zkc8=A*5?GWb?jmC#vcMfqRyaA?#x=qQJ@*s*FefD`uKq05=78ygo`X3Mk89kK{wQf zvwo{-3#r5~Kz9ON%qG1Aq}PmWHfi9i6X_z>{RP6gzd;dFiukB!t)>IPbR8rmUP+eq zxe`dldIeu7Y%bkbecvP5(kS=XHq*;-l0GUs{Ma1Y7+W9KL}~b=qg-DKSMeix=e|`V9kz@ zG^8ku;o1zNP^hW666~)qx%ty+{{5v6xEu?jk*?r%b`cOsPm4f`Mo%6j_IM~yUN}X{ z31c3I(dD?%g@Eb+gt0-VD0}ivOUVTobBPZ`yhb73qeya>p3Me=I4(&7@C9h2LQ~fN z;0`{^@q;B?>>m;VCSQb5uixPgxqa_)2!5hVB56p@qKF1p{Z;cnvKUh`Jg<^3h4Jw} z$o2Bh)H=vuOeiH&P=Df9>Xb?Uv4fE(t?Cy!etxY)xCNFs>me!@?enTZZ(HDEUWrel z*XM>Zri{Fo8c?P$EjSjL_vDNwpO4vrT1T8D7cwDjgZv7YKj)u>ID|iLWgDZbco{=C zqXx2JAJ^V>OVD6pD=RandWrsNlz3v!^f~xmVC6m;j6$2EAms&hPm*_v>kr7$*+aH0 z5M8Z_1un!gigY{Vqi+KEr~@{bkf-Sh2QLt5r2R_J#w@>^{Z&#{e<1F7v4AV8I4S3Y z_gC9%{Xc*{Gy3iSVed`AvD(|V@%C;WG^;436h*R)Nr?tZG8IBag@{x#lp!>!3@Ji{ zR5B$~rIIK@C}gH&BMGUHknlgR#a*ZZ!w(fh~>t5?OT-SM? z*LjKNZT5&kRo$lAtElJjUh6gMGJqbY-V3A)7w=s>hs|{U%v;`{rYUlNB+{U-q^bD7ExR^tfE{7RJ zvHSelF*F<+dXeIWo4<}X*B_aK7^T?6-^x!27hs$<5QI8q#FO#c6dw7ITYYG}rD9jiWUuRoWhRAG#*7 zBO-q?;r#Q_OiVpFYmC7Nwbz`-3h?P! zitZC?M>QC>FR%7~4f_IDM1HajBCdTvh$r2D*E`v|wLh9G29wL(<(Lu9!{CSdA@$yzMrxje9w@y@%f(obgd@mxL_ z?8beUADrP5Yo5hX5B6*z zr*j77M`4@Ji+Qx)DQ`bHTj36cB}@jUI=uBb0r^!@75^gEIRHR^oxG~!%fk9BX(v6#LS5%Eq7m^FVGGk>@}r>Lqm zZOR+^0f?l|4^4XL-~X#0`(KnA{GYx|_Nm*P6(R)X_w!7Ixu{}=#1C19>sxx3W6eN9 zAKE0eAz+UGNw4Tf;blsAh0{nMd;A!7mRZVWEwaXd`3xyxld__}4mzAh4y1o_-)Lz= zt@s(5R-|<%|IuH^VTQdQ)@zDDzF|by{B_Q!2=gE-2O9XhubrMT4v@=U3Oy7vnY9jK z=F9=$dkX2Ms3PammA917Duc3)1v9`bI1spsMFBh5jTLB8%;Rr5H#_EmW+_9wlm_N^ z4kd?FS@4ArTguk015u1tm*LUumX~Qg2~|%~DB!sUqOxIqAFA%TH~Wi46xi8=En|X8 z0*YAz0K)w#{!QDeBCSyu?}u=hyj{|OT}{W%8FzQ{p83a5PLx_qnX|Y~GOhB)@FUYA z+5&*}_8X;lr?Y5&m&ysaLA{Fd47NF}%Za(?3pkFu1uq!b7`5;0Jq>JiDdp_DsrvFh z&dB!>t5r2npNSL)mtkSr`ee%Rv!MM$|Eht1fM8$-v=LilTdC-mOcIDt+>KGb`S`{O zlSx{3__GaeR#=BU7H9^-pKd@xhLP-4+jp<|F^p!m%$kPo0j9= z4W>QhLOq_u1kg4c+opepkTOe5h;YlB4VjboVUe1&fy+vr3Xc6kXIGKZd}GcBV5~16 zZKmS-SU?FO+>M056OqEU`kYU-pHa|QNbD?V#d2XpE&LazTpHL)Jttin*h+yOEx$9; zXoMMS9o2Q{s#D*67zQj$PMzIjm8F#~>^z!OO`Jw#6P89=-&m->P9boV1~0IyYZG<0Ulb~ccieFACLsxkcO>vs=V8*i~QR~^rD3!kKfnB5)*^*2s!k z=}z;th??R*`hLrnEuJSX z&+>ImVE7G&tP8SF))CJm&6kGZO&1$9_p2UvHlRE6^pCpP?)Bb|z~7 zBT|3LfTH6c6Fhyh9)N^T1;;HNii3A!jo{~+Az-{351@KpU*`ss&nhxKmxB7hMrK!T zAl{+&Ae<|0h6luhq?|TU@^7a@@VRilolwF5#<8zw$@6N*w=j}p&;*V7T!_@(j=P30 zAhsHl7e4{WGy4bDPmvRD1Nlu}khI0>DxfO-XN=O~Coj;9aMR#|tgc|X&a+_#aNnJP z1w>8~+>PQ%pZMK5ROH!q406DoW_Gv6iR~G7Nh9n9VMwRBi3RX3yn-s)hT16py(tbo zYt5JlV3oGnz2a0%&wxm?RvDt^&&;(o*1`gi3S&7{22@oY`5#GIHisnZ`|4}u{?!+^SN}XsQZ{i zh4Brdr@rcL+i9gi_3z^gdPm~H?wG>FG(?#4hqMbH`uj;h9twstmsrk*Q2pla$F}X` z2BaXHcIzzDen7U?e_1saL5I;)Yk3_~+nd|v$SBo&C*x&`O+=G3jNwC-J|?SOE{;At zvg}h;5?A7nFLJi4qU(h$67H8?nz^=ng=lJ2!p_uZb59=5D-6l3&nsN3csjy0M$IN@ zugavyp~;etK{Gzh3l)rCTW9mV+BLuS%6+`3#`KimctH)DpyYY86P5eIAGCd~%6q(K zb=bLSg^64D1tlI4V!LQ@`-qZlrRZSQiOIFL>D`Vk!<-}oH}6-O|NV6O1+Ev9??H3I z^-Q&LReH5~l1q$W_Yt2zo~^ZGXotCd=d)MOjF~WH(t_tft{%0Pz(6$or;rw73C~do zz7$1IP?cnRVa{C3$zf`7O4{4+bnvfSWvXJoy0rCqkcXK|ZAO>Wy9?{Kq#Ps49OlP+ z60Od-)$#A8E1Z4y^BcZ8PPPP;19o$R-t*jk$Jy`TGfV=}I8-EV5YY+0K9>uEHW zr)N%fI}-QSJ1QhN2=|(``I%DdlU;cn?O=H_|C% z+|@YlKiZVA7yW=noQ>#q=(>0HO9OcJj-ZwCD1zKVjm3z5Wk8dHnlt+XR#h%XS!VBu z7H*HrQ>c)coRMurPehGbt06ZvGH1-5Wm82@Y*k*dh-|Fy*-GQ9EZsO~-QTk)Ai^}2 zzG5Z+SKk&ARLY)g!a6E7g-0_f0OFd&@B5M>8=-=p<;*sF2E#gQ$44Cda8<(n)6&j7-WvIy0|j35QBJ~S76wj ztENv^hjH%klc=&Sepe#hcFD^o(x3j94Vs?$U)|oIaVu5gJS34UY--*YjU?qlTbKWf zt?8wjKUU7QRQ>kwBloHJymW_yNf2Hw>#2nHc2nWGJi|QX$PLxlBvd$_Qrd1ff_w?n zVjS9U@r$15T>Y?O+MUyZ))f&uUhk2g>?-^WkLy+K14Gdh&|_-&O}P~K88(&+9v@t_ zSRcBdn;dH-RM@?beIotOK6$D*58bEvV$9)V%5m;-m45cGDV7!EJ3s%>1PU?Ni=2>n zxs2zs<0YapR8?tLJ_^E-Uz#kZLcM0yoD(Nl!Is>J$CGMB>M3cGmoD#x_J201WlX9B zuo^#=hpKl)gug+Q!9#2?KNO_4J zV)z!T-1t46ZBQ#{mM2h67ie_xmS>)8*%uk-&V>@mvNZ?Q%6@BaeoVmrA6gA8ga6nk zT+m``3w)7qzJHy-p8)Bd>_*s*Dk*U$K#!sQ0oDgv`tIVX3tX2@r7#EcP$;C)ld1z6 zyyxp*ZYfRa6{k3acDqg6@^&0}SeJ@O(Kpo%7r$x;GD{8J7SV})P!nY9Yi!f-cL?w}Dpx$q39%;M zW0iob*h9sVpfsuuzj1yXV+)nD2TT40;*R(wCkt%P80U+OT+29%TsMib3rO3u(VNZH z17F_wt-*-Ces1ul=OidB@O7PhHUpzE7%`AHYfa_?3tEjL$W7JhR1Hsaar$0JO5gFLEJ@o%%|0;2m`G3%~@_mW2l0NNfC0CEUb9nMs$pi%S#!Co4qA-;cJ z{CLk#ukU*)!xB+k8hL=D%7V-YG$gV0H3t;xfkNAAJazab6d#02^z?jooCJK|kl3Ux zbvgC~?N1LPW5Q~xQ)@PhV5C^_<3fQJ2pn5BiVzsFgCZwdnUw18`qtyE4E%9dUF5__ z9v)+jsUF{qj!)fIL*`@Gv?X-|FPuoU)Q#JY1xa+WfI!Bk)35p~?HqiU8&d5I5$@xb zXKP+?o1X(tY76%r?!f1IubKS%)?Wi@ci5k7kk#Gp`08JG_~I1Qgy6PvUYH~%BXXi- zJT!L~#U2^*%p(trVZ+3^d5m>+bXEhAX^a`lMYI(bh@7xd`mk#FcEXy({-F8+FjW!L zxuMlqv_woBM&)U+Hr;;r8_h}gbwiN0e6f3i4EpIbnXE-)NpVD$eKd4_Kz>>cL@l&^^d#-PXH4=R7Ece(l;_>#E?7~%SUL0SsYQg!%pR=IQG#1DQOhPRNEiR@T=+b z3DiSOhyMc`ZtSl!^AUZ?A&1g`y{tg|5J<)|q_x5-afZ@YqR8l8kd~+#oGI`hx@fXU zFXP;SMJr#^dRl<0hkdF)($U^fp$1QA^h{( z%>l?Acat6*)0d6ZrnU!2Q;yt>jq+4R8h|`=+pT?bQQ*Des>eufd__*3k8TNQi$Dx! z`;o75#+z!SIMS`|mOULSw(XHj+uFD*v9b^C?yN~a@F(`p3q!8v6E;bej+V8q1Uxu7 z&xhXqO8Ket^Hqbdjhbuw;aY5oj_K+1Tq}VRV%?lbcqCJjZJV0DxhpPCj^Z z(HqL;$>{tq0FhshP}LmBV%N&0I!EPlX89XHe7}Jf5-rpVFnR&mT9^hDUAlDX6p0-- z!^Dsvw1$TuC}%v<#y1;}0wkqZNxVlVfPxT@g|y_oeJ^dqWRFW^Od6H1#5P9WlCUL` zu`v>c5)oeCsW1)9MpD_!fxE-ycpwBgLR%$N^dJwo~P9gp#RFn%E^my)>1 zNa(|Wl-~p?_Il={B{<_fvLGk^M!i}@*K8MHPsj~Idaa_2Io5goIBnvePSs7Y)my5oU|m!nm-?7yonk4>GbgS6^{@FO=qI5 zPUQ$Rn5wA`-ZqJp3aB5wQBo|SEZtso*zqa~$r<>BIF{qvk^1G^ucXhEttBp!RoZi5 zlI#J9=~GE?Nrpk+kAQ$nMb0-BBjYxwiaueuOhx8P_&{-xP?P*mnKEkf6hMy*K`Jta zgC-&+i`9M98iO|OecPy+Kt7b@f1$&|U*0%ATxL6G>LvhNCVg8YpY_e>Mzrad}1 zeeb>P4+Vm=)Jo2uFo%R{G zb*A2p)>SWq=GrP9GY8TBMrQMNgVWh;JHAe<3@68M1qT>E9SSe0JRV7ZrwN+3FxcXG$A)=MPBOf>gPt)k!LKnGt z*9Vj4Ht7dw9NjRn?)h83V5zUGTktOHDhKt!s|E@nz7Zt6U841P>R}4%@>9hgIUM5I z=aVBRuPRBobnr;dGN)s^rAus$p^KnKBx|G0TYw3cn(Cn3U?R3zMGrnmy@F>@NI&>E z9W1*}S}^X})P`Pg8c`j0shr@`$|Ik4eBOsM4>?ZXz-!4|w6X(b!@7kW(zcc)IAK_2 z*ldg|k{a@QTo`=Pp4TEc97pU8!%Ejfb;T78NRpY2L?@vlX70_jXfS>12GtOMF7EJ$ zh<52JfFs^-YvBOKMixr|p~q6bPKe>~TtY+!AFA8UOnY2ryoay(II929f}IVs2a*O0 z48*N3K(JiZZR3NO_Lp^CfPxmoKBBZ8sv{ z-AGWV@Ixqd$M3hWSS@(I2N{S_khHrfT&X<1?q;$inixfx?;o847of~NUrCCnjx#wQUG zqa|k)wOA<#Oge*`Aw*TIyCG+0D{vS%b+AK4Nn1PXa|BaS=RS=#Fk6*+;%vy6Wvlra zvI=0|+li@`MkEq*$H5diBk4PZT!%e`A%Jie+1+=SO%5-|L!N@IrO+~HM)#H}lLAbjyXGzH)r;LqM*2@=&Vv7IzguB)>t;8z)hV$a z6MsLDPp=6+H;dc_^q{2gM{Suu_NzGP*J1u=VQIg#@-x=we$glWQFYC07Zv)2j{Hul zp8A3i@C<3(071(#u30ymBlCkVs0Gn{s~QxuZ!5PhS=mpy9fh=&0jhvMtS3!ol-Gnf_Ra! z`pf8fZ#MP^{x3eg_TaakHe>OTgFfAjAsB&$YEce{GS73RA#a=BX!juzmqryapvfEb0nzP3Uc4CNAtN)*Wq7-mkb(Z zV<6z2LlQenM-l?j3}J~f89^1KJOOEBJE$JK8}2G>XsEaEYXW_S_r2VfIjrkoGlnFU z>CHx!7m^=>Pf~}qEgyO5l}ekJ=1y+L7oz2%U-{He+0(ma(=|KJHpht{JD5uIy!gOZ3D0~LH zbF&+~S<2UknA4){dS_`F{|f*NEdhrMk$pQ%Ba(yqo8<#;IRra}clIe*+r{$(=yXbz z$egaah*8t5-M~DSp{^byX+Y6IuLvHM4EFU4p%VSNXnSV&L-;(Kbe#N|TN$OWPBb~y zbYn$~DP!h(_Mj&)illRvw<4%GsPZtouBtuVv+!&bWH5^nZtOI2MdM64@Gta_O;8on zj&>Q+Z0c~6TiOBHb!8riDXK*(_|o|unw!52H3Q3HfZGizszuqypms!5^}SpRd6$N>5xTRnaI^NW*xhEJ{{MlP`+glV@uA+Z zvqO4*`&zO+i}O{7Q}BBf>?2dvKm{?33XZZT;H%=K3L$&Zh?cvwEyogdMS;;>BACgL z0qfaB0^_LS%RhZ&Q4o+N>gjMA%q5dM6Mx(wfi0du^wWUx&k&43(s+4T z`@vm;IDAC^g<|-;=r2I1&-8Vt^o=KjJ4twu&9-NyB&@IGRG|hmP2$a=G?KS%%A*c} z*Pt#X+lOl8Yuny7Yz|trg4!2cgVTRC0c~cl69l=e@dca_1Bnn}MqBaUZLD*$eii}M zY-g%C=eaI>*G5&ekawM4b8^&a6f0bsU4k?v7C{5k8wD9{)YA$SVh=g!7W@WFtsY`q zKt^uk-=JOhkRy0?MM+b!;0vfsXUTiaRQ1{;!**ii|! zBlZQxY+}f%ROkH%2-9PS|DsJnfE+hvyD$u7Cuw_IJMN{R*=MND;bI(<=b`{NUct)4 zFBM@|R8WgrT&D2=3Sy@EBq)>EILf59^AfK16=UsVYK1Ce6y4bWl!bC+ebOU+< z8YP6~Ieu<$wd3dC)N392Rb6#*S63IRUi^wXinRK^eGTE0ZctFME$|AWU&XtE20sqY zwbmzpToQanS!{$le^+Z3oLeSCTk8gVArl#NU;`;Z2Omzhm%KOeO^j9G=jY!86)0TH zkMi(tzC0OKbX6aIARJBysWpcjNeJWC$Us^%n~Io3KBE}v&AUX~_D1h0G7?cr9eH?d zW094&Uo<`-c#ZhOroTrOEUcQ@F{bgwmut16J5y)WC7&E^mxn>52ZJ(1(Eg+(n;V-L%WbYL_(wLgF~ z^EO?-e%&Oq^y6nJ$GEl;b2<3fKk*N?D-jU2X4yVHF;YCY8BXKz4j>>Rx%BQh!hk-! zkdtDUL5I^zp5Wc0Xbrwv8`CIPJXad3sRb)nuGEEmd-1Ymx<>ocUD#WYWyqr-zlMA$ z?%V!;4j~oUb!?Pbpxl!0dVKuhz#evXc4{1yfu_Oig4+|^fEqhAmnki;oKDcx53ub! z>n|fd&xH5&)B=XXNf7Psr^3G!dR9vmF}ht!Zb4A*WV5LP03e+$)U zQ=LAQyiz6CeuS!VhpJPLfZ}IB7oGY+`m3tsF*TP~hkmdysE4eH!n27N4%%jRHgGqH-# zfy%@KxXJRdCgcipJI{BbExEsW>gVL-)IxxMKHYU@CYmkzepIo@s7hHJ7x9n zqv#?X1GeYpc@A)K@%uMQodSt)VB?IzFUIe|EjhX588P&54|F2Jdhp@IIfi(`AxHS} z|NWP}D-!#|SjV}qEq$|ZZ2E)Gf3NXd_SSLm(t*}=D=6)$$m ztBWdUy@`GX?-taGGnh^4k?(Fb%qZ$I}Mr#P*~nN zB^pA;g&YyI>xA<^@;^prWgSI#40C+a39>YX+cAwizh#t=hp$mqB8kh-Bis&rrVFH5 z8DN8F(&z{1lnxCGSB|fc2YE(Nl_9QjU1$y=@4tWj;ix?fG}x)CI+<1-d=2Zs7J|O0 z850~NrirM}$Gg7B{YerU<}jhET$P|*T^P)Za?l~cvnN8`#4C3jcuF)bJ4<3i^naWQ zLezyyQOiq_{!2yA#hZ=Y3OYs?kUVb#O>k%&&XZ`L;8v=?-UD>j9GFWcArnx))ywB0 z0go~1poE*WuvAlWoSa|FJdWi_26lUW=NFf3m+VV_ zzFnKMZbg?`k-2KS^h=KWiD5p0*B>0a8Y!)@)IGJvSF@ui6jr`%-jULRS7vg}RMM^7 z+Pzw>Bz`NloXsBAidA|0Rj&5EZK~@~SHJY5S-l}5n7g&DO{T9!^w#HyxZdVLy9@nV zvA}lI%`F$bz1iE>{2VQ^f)GH*XK!7)yg2prczxP7P~X5e&safbz6Gp>%%NAyM1f`v zg-96T$;u8iZ}X38Xln8{c?)dIz|`gfz5lHuj?DIH<3~xoV|-5v0y2&$k_v6i*<{wJ zKgalPNr-N!%!5}8cU%Z;7?-d(?acW+%dy+tx+g}j*2W8sclf`tIy8Kr=Vw>D5mp&J z#}n)3VjhY)uvu~axKj0l*T!=L=o+t^Q2WL0Nq2ddHCwL)9pNt7N9=)rmN`;gdF9+j zqy4nK(JIZWl97amo{(%e;?ty}+fAB|RBEux^wqoQlRPz8gU%AlTdpi~&Jt^@p3y3< zcciS|0OxRtPO(D4mSg4~!4n_K;5+O;ZChM>?@MFfBNht$M84-8pG<^T8&wfw00lkI z$${BuZ-;3bM?rx~+7CDw&7e}ETKEu}O`kr!C@YU<1!ow#uq|o=GpRAwXrtoj_0eMw z;?KiGR6@AvCl1-+w*4E92*~;Am?t}oq7YCDg8 zvI}UcbLibQR*TQg%RBg`0;h3`93jS>5C10?4Cj6UZD30GD_X?6!#4XB1Y6M}#})%w z;45I{8*gqAh8%*w*7V!$v4`n>BEJ?D+2Q^WamO!Px-`n#{$(#9IdNlJ4`ugKu}9YT zOqpJD+=nC0y~HFS5)ItnhuWDJTC~zU>C5U$m7p`y(H?d8u9)_Hlj6vV7VP$XO;}J$ zz6U_l7-`*yLJUtnbFeITD!9)kB_%Bu67rzXz~l3)8<`dUuCA`P+`>HcrY%+jgSWJ} zy%4dyfnD#9E;UU}O+#fUb3GT`4&RlsIL~aWq4Lw~Sr=3G>&8pp$+=+CBpA@Q=iTk4 z?yUho7B>zJ>lzC;wEe#q*ZD`1fS=TToiK)+ss~lH{u8G^;`W!vlL8APnZ4!YydT_@ zkZtyb<=wEM``hyv0DnH0&F_0z#-QB*UHbSipp@Wc4)%Ynmhe_pvK>DvV_!KbnFlK zx!F67vV=li&f3~K38H1S9Xpb8%Usw6sB?=u)}nO8C_!J9Y|tTb_1A6Fk%V`< z=gowI>hTSR>nLSg{^roS`2H8tK(G$|Jw=7V=&$vJ^}-_ApIZs*PqJ+Pr!SKog>`_J zgrsyo%2>H3>;Z4E(e=vZt`{n}& z4#ejoe6}QM3+s4N-+#}<7La=x<;Y|@zm)aQ_$ga^!K;A*P7?M)Yi9-|LOeS=yM`F% zgd>;(51^L3j)mE88Ec24cX#$r6{iWd2zF{=U0+{ON;i`F#K6sN+pSu=_C}57UX;hK zhhjh<#EeG9xbfq8goK2$b8>Ekhlf|x+M#kGN>Neq#)AhBvX6f6{AyDG-JYl6F-Qt% zyz#zntItzeySM~rcx0d;z+WbmZSh*&Z)>da;deq;eD~*l6bY%Y9bca^%SJ%)#wtD; z7paMn$zdyM5#+>goqqrG)_Y+tH`TO$6f_1^e0B3QOWtxX%&_fx?e#1q+EsknI@XaD zg`N$s4m5OgH1G3mt;@2N)6{&CZ5Fiu;C&Or_^5;XtgTi}g5WlYT{O#A zo8)^WJ|zP~Dtp}QJ2;22U!%$2!!|5ov1w4i3e0@tsmm@*+v4jyiR)^^)Pz|bTswLS z75;$r=*_I1qf3LYUtjPIPnmqS_W;Iu1@YbOdWuYPAIPZQf5U^Jn-Qa+J9_yA-j28Q zr|4TRENQ7^i^Ti!*RJFT8&r?HAyOq_?c>H4oicU-x?mnpq#%U;g@}q19Jbkaa7Jpc z%*mEFkc8;dX#&3+Km`LbD10JuvfkZlP9Qi_bj$p9&3Pn zn|)b35`8kh%Q|TVnU+@A6r812ehQLlP!*P(zquvCAkZ5OsW752H`>P0Dr56*n#!>w z6-SHfLIOci(`6CEO;d9(`1;NSG~q!K53B%5o!Q%xJsU(Q%o;eHgeK>!X43aS<&O($ zXXlf!`rhsdD^{$C!yQ4yx*sIq-TmbvGX!-mEhSYWeRE23sLIN-4u)qg6hY81*nFP? z%Az=^#+URDvq2v<%zo^joQ?TpP=I1U8++Vmg}rL|EHP?bc;#+#_Ny9X+z zlCcnHb|iN^Cf(%?go3#y^qmJE$*brhCOLMl3k(tx5D-8TsvB1Sk5?sqRFWJ#3+WWQ zZY>y+q0`@jN8z@WlNActGLi&bJeLdlCXo)nRVEiGupWFkRZPiO%_9_gVZeOvO~sNO zxNVB>A&GP}`!_F!JkK}E0}c+H^$s16s+3O5K|fzdFfokHB z&$_j5fG01sFnZ}<%zbb0v!-|6;|abNgy*>!o27137maqr3q__%zn%7pFTIcoz*eIy zUMtaZpSwk&MS;bARDX_&7(#2}o#9-6u(e0Qt>xmTn>E1MW6VDRN|^2K?cH)O=Gg5u zCWF@u`XrMLm`mNLO9>nyM#+INgs5z}c96Q)@X2&37#JF+f2mHJeRuGbr}you9U)e9 z2ex4=fJ3so&Jc7VM+)kNPQ_KV_)tZkuiq%LAvP0&)o0l3izV?DM0XC}Y3W>FMy}Aa zUsIX$@})cNqVV}$yoS#cD4(YP3eg6 zFEbDiT_o#pa-W=k;SXx?LYej8BY5BQe~pMakJ_THKApxVIWi&X=i%cs3T%OWFXL~I zPF6}$J06PYTmAmsG;Uv+D*Kpjs6HI-;|#JqX~RkeVqx_j4Mmnw0mf0J{9cpKkekZ7 z;@?luloK6)<{qIa3&p74od=>>ahD`=66Mh-)c4hm^nZ1$KRu~z7a%2Z3mWW z$1g;SOK);OtAQEcIdnPLux8EEQF)~6p@B>k4S5-nh=SHoT4*UHFZElARt5_@ch@{S z*Zy{JAV(jrYWF9n#De9^ms1<02k`FnbaED_4P(O`^YuguaVU;nvHv-SCWp4RwlEA7 zI^Qo(@%#81*@HfkH&8}L)cvX;^h8zSq{ayB$U}}@TMZ5tsBJ$-V;cn~K30epsbm|e zvPFCkXfHV%n=X6__&^bkNDT%wWkh9UWDws;++kAjLFWrzHrBXoJw~5$iGXI*Srs@H zpKOc2bLU2Ue7t7;j)#X0={`{@x700Gl)`#@nLWPgE6`|ORtQ4@=Qx~fqoU7Kk}$Kd zYfi=~FdodIi_Ik81g+RzYvTLBEuBROOjBmKCF@MApG7`S&Pr6&$kzlj#-&(#lAqdC zb!II0Y$rwSy>6dnJN-w9fp%jvhbxdAbkttK&SZ5)IV_2goPH|l2F~eJksZ;#xx^M5 zRxPx&?r+|_nYH5ZJNbHws?1TK{S0yteS`q6RXv}MC@fAxQNvVJS)7B~NRUu)13jq# za_c>ZmH3gS6{g6oiXPFuFU}%5&A^wx<;Ff^hP?j>K}4Qgs?_cA*^yyDUJ_3@E6 zH#hfg`P$OZ7UF&B(!!kYD0=3?&c8XKKJV&03|l|IY#07ow#q`z|AiQro{Q|d$@yOv^+42h&P!Qp$(9K99RQyRH*(J<(&k5A-w%}l zRJpf68kPqbh@rGeV#z20k+;yQk zd3?A)Azk{t3}P55>X>vHg}nD_%gf8-fF03HyAB-iiiQzF8qanRj5ib>aIY+6->>#7 zkY2U8a1kzkd(FRu6_r}09vl~Y*g;66)lS1u3W|+Yl|Ip5vpUkHPbAj%;!m;cjT#=M zsVl4;G6ajjz0_P-H&G##g9Q9AsxI=C>IF8rmvS~5pj3id3sy+^PYx)7E}dFUb>3%5 z4~`Y(QF(tBh_kW|*~+Q;s^hU@3S)&L%W(#DAx{EK#$;q#nUq9mmmC4a$VXGv>lX#o!ShJ`rNuRvrZWo^`Z>AZM^w!caE8Ye$|xL#FfT zq&p{_K_3??dCyt zT5=#}tVwt-Dke%siA4!jYk5Jw1vmt3`z4 zLFNREE!;mk1(b=EUpe|lb3Rwng-th2b`(^PYno?))qi0O1XM2#j$vQTq#iu98l4_L zGXt8=IoLAH(K#oBgrg9VTJFFO)->n$86Y+hQKz<)+cn_4MEqHOlR-GGAe)AO=e~6n zhQC)7pOSyk-~ZUsXY*3nhb14oa9nOO{4M0MrU7qWkBL$8=^%1)D*hwtaf15bq=yE; z{8`+1|doo7fR01UEh3dUQgI1Q;9wl(+fBg8t-~Gt4!SkXm{*e&A zqC23Zq{(gRDDHcWisSdKAzLCAK5eCTu2A#u3w%fng@^>qm)wd6KM1iTSUb}eCAyO` zh1ebNLs%Izp&y!7f7Q{!y}ki_+r4h17ni3X^mQkP0uF(tOWl40 z{Wruf6BKl>sj124r`z=0lDu!K1$oVr;~K3|RTy9nT&aAC%j=GaimmAdiN4!w|Qm$>Rqw)z0cDO1y^b`@5}mXeE)0Di*H}MK0nrVP?3|%s#5k2 z8aHl%j7(qKJefP+gE*V2f*2jgPtq++@Oqd!KRc$s+PwItx~T1OH_l7(lbVFhdq{$;C3GdaBw>NeACU^dErM$M0D7~08Veh`wBwtMa%}$pip5bRaQ-Q z(OZ@*FZD0Vq1D#w(D8r^iDLF2ItN(rMlU%Q2*m=CjNZ%(-~I`(w`^_c!kCk@H+tC} zq(7Bv>`g?b;54cj%$n&n$G+aIBa_K4n<~B&g8s3WMr+M}PTAYSr-y-PsUeqf>`a@- zY^-ZJsexGr3}NO`Hx2ThR!E_eMA4lhgYLwIHCPZfm!R_FB?F{7IXS)zMZ z*Jo1W3X+!19zSF0S!(S=p~zwkRP>(x>n(`z&Awzi!#c!bzaE)D8WV#@AWQp+^s{FJ zHqU(0w-1Gj)cY&zFuJNgBYReeN&J=#UVy?!!{%_)^qDg=f$V#Io*s44;qO{7oYN6{ zngihHophXV4H4*4oNpt+qtAbyn@he=JXnKE&NqXH=<|$i`I`&ZOa`y2ID=E;7+@{1 zbyg_BYS$*!P2wopy5TtU42qgLFmgI81G`RwL9ne4-HUL7VX{`V^#E~Mj|~FwIkrY* zO%!Xqd-v`co@ePNl`~=?9ZD#%9eT^?-Nl3=Q5F{!wLkC}`Zk|$ZEgJkFcBb_ZD1U6 zAPDbXJ<<3*A)ifP4&^ftC?sJ=HtpzvC}m>_%2;<89pLwN!B<{Sy7VMv`kX<>t~9z} z$jSJgj;C5)8g?`)sY;6nkX?9zf!+$;EfBLfZweA^|i&dA!OMBWmOymAnO74c#amP5-hTD6gn17 zAwMx^)E0^di8-~xlZ0anP1|VSih*b6q{N5s-VEri1>Bi5-X4bR6?vui2vMj@60+YA zZ>l{HkpM?H3z`nkYOTwuB^31{&j$H@`}Wb+NWH6h`|?r%a|vS%=v-~WNflFP5mI+b znu#;0bpZkVv(O-w+;wl2vUYkWA-;OWT%&0r!#T*lnAQp4KMPgzwDj;yDD%y-hHODp zl~NHpRK4_iTYVV{5MlFd73p^MclGsr-I=iArw2hdg3_qcqd{Md#`I$GSxKTfSec#2 z(~9Au5&_S@oymKjEZ&d}Z+Of!1EG@_DO(HHtBs~Mz9u9@nD=0#BV0oe_(wi9Wkqum z(Md_G$P(V58^Rdf*|`_2VJn(W{WnlU=K+b};|vS(m!XsbRh0Qs)f4t1fOVXMVm{1( zJ!lTpo=;3Q9kEM(5q?Ff6nVJL6grP-y@Fh`41a)gQz`-8Y3yEaf{}9D;XS1wW4&2J z8FG|$!xdzTYcS8;NTfqglC((iA@>Wr3-s|o{g$zyj54R+g$!G2AAUnvPjMMliV_@e zmBFN9puBFN$W)lxBSdiZU+l0l`xRD)CYq4zHfh>m6=iOwmBvYJc{1kV>(Kxv`SB|t zS`#!`tFt;^PhUqNh_PFstz~+&o&2dIf;mvl3$bN^`!WGHk;fpCsoP`EnZxFj* z^!44ANlFRkxUvb@==P+e=9JTQU67Z$Jiq6-3pwGTmf6!S4;GcQYf=uWk6WB|W*Mrw z0_-QVo}2NiO^S+MRqnK8!T*x>Qtj^Y6BQr+ z8D=StUK=u;8|#2lPxaV?(i6EBG|N^<~j|9@tm-El}v~yL6x2$Zk2C z16TMh#?4SV|HH7&v)ON_v-^bWhMkUxbcNtCnLEz;e;@8hFA!}f&891?~SN2%A(G{}W=ZBTlE zZbxpvRJ|_KDDjkF#<9`c`raXM3N|0CjpgVV-RNV7?~&grUS#zJCKuC*<*9**1IYl? zIUF&-_T))-xS{Sg0}T(7Us*^)|6z`g<+b2b4wzM5-gjhY5+-*U)K@hyRCc4>9G>9u z?QeJvLD#W!n_mNEeVpoEk4UH6O3dM>2fs8;u>vKwnux%la}&lm;;f%*@k00&z|6~{ zM#?9PSd>YTE+XtwhZ(_Arr(YrOv)g)zn!Ks0$f|*x1MCPt^W1>WQ zpA4V0unEa^$Q~ z38}mfsShP99_HZmMY_`Y%ERH({;SAdAwo*9-VZNH;yh-pI(q19Q|ZCx-l0O1hv&ik z7%=iUQX||Jm4NKv0d{U4B#Go3Wc!JgrH9`R(8)9KB87-KlzHg{Ct!InVg@dTfINh1 zo-HdZ-amszcP254*noLe3MtA9&0#&c$dgUuxoRh>z#JTB1WRg`so|a_7+-T*`3ZVH$ve!|~EUiJ=UqlljSvI}zyHtBB z62J`k`WTzF8Q%#TsLS@Y(q(aes&=5JHqL!^h(aq6+g#K^io~V@65i zs)oEjD1bLd=#ftQB~h&87y1ekPf4_WsRatuNsSCZf zi3kKT2IZ<7)Aof0`mj_Lvb7XG+`Q_~dYS|08YX5&k00E!=uXxa#rmgMzxd_My2JVd z^K*M50{mEUa-v%b{;m7~C|ohqlBI=i;v^hH0A;{n*qzdb0{?5fW`bev|3r7 zZwZ^KrNHC;kh9}I+*Oo`k|K=J8KE3u+3NiFaIb^-iWumRuby79KyFi8tQI8knW)d@B)3k) zCPsbgQ!Q#JVH+>1- zWMT-Sn~@D>wIT$1)(0?sp?<>(tjLVOywH%fqOz`9??PMp%%aC2gP+mV=zQCeJd-IK zz$7ou#WaAp{K^ZZdB49;Y;L*VvR$TBMa~E-V59M&0_oB+;fT8*dQJZyT_wH_*qgv);*BOxZl^b20=@$hvN@@(tt1%i?$gO4^DleT3LWq z`$JWVBW)_eD5z&@NbIV*gAV=vbc`3GpyP?pQZSRbsPQ*Y=*EWNneR-hL?l)E2#8&A zb61bGq~JZ2TG-<(;LGP2*A6h;^eT#5={Zcu;%R+O^u9ahB}YC1aKZ{}&^c@l6*R!U$wgQA4M6nBCF zZ@T&WP2bf9hW0EF3T8W}&6RX{gx_SK8DtHj)3em~8U0q~A@07nx{7EJpfu-64|MqO z;TlvWohJza$!@7GLmvxUdj)H&Wqq;OePC?XQ-Fe5Pm05ZIVdfeNlGi)C@@;5q3fPw z4H^rCw|5m-pk?b^7=SKXD(0HE*NU);Z0h)^INlEr6>nZ%Qs=LTiv+=>;XRV2L@W3}k_ z2&1`Fe;ey74E%iJyC`_~wDwPxE45>^;ua9R&6Z2Of%T!EKsBezdf;Ew*$bHOgWLd! zp$H$-N8btr$!`C0eU3ecQb@lj3k!=IShvJ;DUkNG!oE!Tn`2jN-NnG>e=0xDEp!@6 zX6x4e0PW4!l$x4Kkeo>fNiFkFN(}pU?0S@87>ZH+ z<~I8zUwsv1y+ki4YMX&!deocZ>iMs4>-a5g+U_67Wnt0k*_uG{cy80KcKc&O%Ixj*n~O7bL&w(F||R<>^Oe)afzQpJkTb@w)wba~&}bHbi^e+;5_!Aguja zPFe03y~|bP7q;GCVOBPk!O-pX-tdHrqC!Qm15k2si>W77Pi8${&J?Zu=h}K5McQcA zOL*uHYS@W9g6Pb9Qs00HI}nac?SPY*O3c9fd;5SNsh#=9 zeY66+!}f2v>Gl?~|A-HQG~U3-C=))fv#=E%WKO7 z-~Pvp^-z63Up+sjA=dkqn$bHRT7Lvl=1!Xz5ca#uhkm;W!}2BH86-MoEagi0f~AP> zHGDEQo?wp@#ket8Wj09C-};?K*2 z*z)HO8n5)L>TD=-u7`veG=K9Cc5XzAlRaj#>#X!~o0~o=rYK*vd)ZYOgPp06kzt|~ z*hcUl+a2emKiFnpoVabH&=rdp2;KD-1y{S0?21UcD6FV-Sty~%+*>?h(C3RO(L^Bo zTOx-U?K(CMzh#8$b^eKb?ju;37;|NSq$Kt*M{r2%ZY`u4Lv@f&8MUyHKM%%xZz6rb zuHo^^#bnd6^71^;_DN(J+}jNzl)?w!;Mh9qeZWEPdNreEI@g3M((XeM0*_+iW@wNw zb@vX@69*q(x;n`O3XOjsmM=?| za+g~%vuFrZY{`^xEkf;$t%NC*j;>QGI->~Kms-R4S5F;WlM*Y|U=5^Hghp2^od zfrFwWclHn=zpV7Fs3=(1N%Bx{9Pk(i`#((eWPm?!tPR1E?&pQTx=;hJqo|>&MN;pE zlz|E$Iim)Lu-u}glO_V;4Pfv%0MKS74?))ax2X01r^0&sTt6&9cwF^5W)h`%e~g}^ zdP`6DyKjIs@Qw`FFcb{)9vr9mi6F!5M3^%dF6igUy1cNCp835C-a1|rWFLbad;8%i zz+F!<50WRMEc?P6^@xVc6`{JofW-YzjhBegD-r*-H2-hWo<-3oiDMxspL_!2z*pR^ z>;qeoK?w`;3=24`9=m0yH}$uQ_}qv#(fIS(n`Ztjy}`vlNu>581Ze+25#0`>K1A1E z?I?e(ArVDFA5sT7)ai?Cq22F`<1h4`zPZ5@at{KGA7j0gt0;EwekEg?co($GIeNS3 z1*~IxpgO-sGi96$Yl-u!IEH{Xk0C{6*VEE>`z5vw!l6-C6_B)S@#3@8@Qhpn{^>oy zHaS0Emadv%qn(@^LxyuYU~*?5w=e(uA6n(vzB|(-t^UTk=|ZeHSypTSR|ObR4jJVD z?oU3q)bpvZ?)OBxiP*9ru#pQb=X0gT0;bADlLdA~-(~KEfGJ|dif05T@2R~{5M*ha zeFu}G2C}3>{5+HFZVPYH4Pnj*j|;CT4**|BA-1ZSUDYWscJQrz^HE3z<3E!mUWD)1 zG{cv|tUEaHQ?`~HdA$;V7+_tV`KQ0yt}D<-rLb}W5ZW>)_TR5woUWdVYfzo_3flx{ z{S5GTs9l7-{rWHblJzN!pt=ds-z6U(-ZgCE+Hrg2M3x_;g*LYCJ0j8=!cR!^!c?Lo zS0Ld$@o&^t;_wiCt?>?m%c+h5fJhB;hA8t-Q1E&WU~o6I^XRRmLL#1OcwOJs_uP9z?IV{;}&z*H+p5ir)a9nDFWPU~!yzvs+q z(06(<`&bE8%>shN*FO+0Mj;wIJ|F8Jr3FnDTk0KRJ=6>uK0UgPBS?ev1N$#&uFp z;u0rkQq3Q=d?a!gSjb{L6e@h;8G_t2L7(o?&xNkzn@kU|v+1Z!UTG@Zl?9`~N7t zSto4=6>dKOnSY9^5VF1lW^+aEW0d&Qtq&*vS!Q#NfPX5be-70rQ0Ym7*ARCNDNB-56{@8cK=kKRuc7837N)Y!5ntnrv~w$`om1k1vyx1Kq=%*kPy zqC$6yd>cGjPZvL(grK;QY0sNs_|i-Cmy1flfL}^&Q-}LYs&;oh$l={E6{kEwwkjsn zmX1n$u|>I1!%RRukF6Nv6e5R8j*Xs_ZHa*FiO*50*L`DG+bdg{7%fsr0Iyj1peo)< zbDHU8WO#~gF@kD=$)1DF&ND!xSY7s?gsW>OFVGI7jNxlX(AufPlCCfh{wk58oICnN0qlpZbr5gl6=um=NXh1r%{#cds z945-W*QO^pBSrT-8#6@Mo4?V(DA7rsA;Cm93{m1l;88`Tz^%AMhVI2fe#Mf557T9-G89Y=b;ww*ld9qH1G8 zK@_b@UQEkpz0|!BP-cz4Y4kaYa@3gw_5Gk7RkEm6=!xMb{vfh>s+Y zUXz^xoh_#leQ?ey-#k!$ybN8iB%ALR)=&~u{15`EzGtz!(+K`)0qmEFHWMZ1;er8- zHc9Ou`5Z9E6<)h(9;_X!%mgI{nQ#ZXw4VgR!GDBhcj87|iK6mN&b)T;I_XrV z0$AfLu;nD(pNvbRuCjChOGB~CwH1XGi<+?UXs%4&+lQWRCaX%}g)t9O3t@Er)It>r zF)s?k7)5wWZ&OMQc{Wi8+aVXGnpdFms8fUrfDp{MW5Y>@QfLPGyMO?TdfUjl6DAUf z(+zfNX=zb8KNh>lmK`KbB)19=7^Tr8PR#A3S}VwPM%RFvYjrSRe#z_lCij6E5H2mBRJDNcypaGLiI1B_vfhX0eeMmLS?F_jx zpN-J;*2!lm`v*){8{^nxItRQrarYRzinkjTWyV~W8eBBO=KX8qtoU$pNkPxdnKQR> zsLV^@4OmcF>i@RH@!DLI-=$UJJU#Q>NQQ$P_ez8H zz{q!cd8v1YYz54&7`zxxxqLB&dh!oZ*1Cs8{@~d=5$DfCErgZxE!NUjf?ab<#J!ks zi-uEqBob4Y@EGwt#Cwg5Mi!_=2Aq#30|rl_df^tZr0Hu$b4`czQ|ZsS7%x|kp*A4o zYREr)Wn!w9OB62JFT5<-P(4%;d&u|_$WtL&{Rz0;hV@KuLkPCl5-Toyl0bb%MJBcD z(g%wVho4EhWuVq?U}@{0t2-L_9G5}hPGU=rKB8Pf2(fOG2DhQRJm)NWPJ)r4~XowZn-G( zUGVbv-9Bm@S4>gk|X9VB~5b6jc5irRuP(duJe~lgno_RAv>Qi9BN##)w@RKN|15Z8; z+yN(lgHp+pFFku@e|^$;#l=BcoHI5moXhHY>P_MPzdhXs?4Zj|{_P4F_c?4k6V@vcLK z2pR5W;9@mn9uHjCFg@K|-Z^Q$OcD?FZ6=W;#B+A3%3C4w1jwF_N9D=4KMF9!9I9`c z0~hmOlR-5Q;v!}dTPogfFt;>he$V7HLaU#%rhsu0sAwnhv7?fAs)lb}=x#YHZRX9B z922EJ1e0;OKE`5`+szKvdsvs}hZy!aN&84ZLrP|}j>tSQa=d2`g3)8tj)=5z4O4%6 zpA!KhPYTvdpdJ*VIjpm>ekPy#C?v|k`mceXyG$4U1KJH9wL)BJR~t6dkBalWP%hk)H-gxwPk%=FbYZBHE6G#;8JOw;Dw)Co zY1CcgR|}{{XQ-(JosWuG5;tslf;T@C%D54uR; zsr_fWDp$-{Qe+M-rlFT5bJx2Hh1-$FRX)=f<-&-h)QBgC%9SB95%(=;T&(ETtV8zY z|I^-kfJJ$4TjOJFiN+8WL;=AU8;2H ziPF0uy(QGp1*Erc@4-U=AHNbmA%(qYi)#4pd6gnU| zkO7zFGJ43NAOY&zAshgRc!4$9+xc059LVV%Fa)%+$*UdkyjWXd6C1DKtwviT9Z+YJ zStx+ugB&|UYyOK#ML??u{@GG_$7I#wl|QMR?qg<)k|J2$v4(*?Gw0-*1pYudre$!K;Ex^_Mv|0aL+SINpC+-Pl-?KJyj?~r+7aim+i=d#aA9cvI zGwPZ=jda+H*$5C<4eViQwU4+aU*0EPEKXFJd7CHilQw)YEsCWsti5)Ix228~VQ;s% zIRD43Cz?A<>&x_1J8OrB{R4@9#y7Q88BLC`$5zaRtI8#ZTgP77UU}j95lfM(Qjgl< zD?^KmQx5)tw7sg$kNjdDjMDVhSJ`kSiYHekYS0{yi;L#zs5u!Ax{9j$hV1v<8x>WP zc#gTY^-87D+m-gZRSRH5pK31zPpwtD)clBd9Nk*5eMS-bJfoTp25kJ!7e7I8 z*aR6+7fhfBP&qxehY42JvqoPIn})}bF-`t;OCTDkEl6dJ9%-Eh;{RFj$Z5F8zX(yN zJR*^$s8}Im-|C(7%E|4(4D#o@dVUy0MS&W+!n6BLz!CDl7G^X0Am-(Kbo@UfxlXt= zq$+HPjg%xwuhIV)kt(1gqCulKOYTYZbO_o%A|X2e=86k1WqMJbtzl1GkFh*C78?f0 zR#M@N@Pl6fT?VqH+!z2v(tS?>*b3nMa%sIJUp0R`nhB|8-o3D3c|z(V4&DIC`M^TJ z!d@rPx55B+!a|S!XD|-wHhPy~Hqf)MX<&>F6;>dJrN;7=$VXK`Z+0RG`7NHIipdP*J{Y5V#4u?+#>WiXPb4cHJu z?#!)dm;@nrAw;LdM)Z(FBCF#BF{I#dRFL-uelYhrj;j`+*ALKO8rPT24A;dLVR)Lp zTc%umcy_MXbNq%eP@uWU%4DEPF3*^QdXAauE(e6bK@8gKV10L%v9#8@i+MQg03VF) zwhcf^5~r4S1SLq=Vo(=$hH>Z@RSeuiU37K;1c(a-wMDQYJ=q|%=35EsUeJ3~IUA`u zo-J8X%w92j5NHAPsHknT9g3g2$U^XF*odr+ za`O+)03W`?Pyr{3FjNUvV~*{As)tPtL$5bCaO+@BTZ^TU1h7tklxnc_;6*IbxuU$( zYMpu(Y%Hzjm~H~@Fa#EB_n{9KAGQ)6NM7?(oX_?E&CmnInNWJjSy*Y#racy0X7S4( z)!)DV={M3H3z~J~j4t2I9X@FRlf=$U9tT}#tqrut=>{W1PYm_YR146!V&R?4Kx7?< zo0f51e$D>vtTP9?w5A@j?~wO~pdg}v^rU2BY6|;MCt!!G-L#mrQ^HQF=4c-%1)K;RmJ}J?|Soc6e+2grxqJO)|xoLl2 zt_OK3AzJ*AoW~0nkKU+Ytn;1;?a!fA@p#_)@KRfn%Cx^o&<;)7Jk>VtrOD1*)#c#9 z!P?H?IPR&xwx^|~t=P|9%`ASa<}~x5)c>>po^urWl5r(0vJ7ACg(r6P2>C!H=r$xEkc*x3J$m(r)`1YF;=3XX40cadI zz&e7pH?s*N0p;8vSh9Wok#fYn{cf^F#V_4%?JmhljZK@~;n}>(Lq$B0rHG~~jorO{ zJ%RN2Nan&HyUu&}7fxCJUP49P(6rvtX#ql>8e5+phwEDpXIdTaar}9Uvf-KmKrjqMS4Oh? zDF{Qy!S}|*g53Oublrz~?Ve}og6=g|BA^A-xrt!GrzT5ynMl@j0Qd@b0?_Ezj%AR2 z2V&gXZ>L`wsEt5%>ZLsUIosALXiQi*zxHEOb5Op!i&JAa=42O@mxqoYBjyXu7IHam z#}>|^VBkDnpXitty@YR5hJFzn?Excd z`@`X>qejpepmp@MKsqhDDk@&MuoH=a=;mHHdIWz5%p-Mh*s-6l3n6bXti)!LgFx!X zWE+lA$bt%IKA2)S{@7jQ;STFD%h4(Ym>ZZtAR3ND+$KP@-P>j1@IOMR4GpiL5CkCP zqj9+g@blJloa627Sw9)p3&Wg$ z`+#tA-EQs6VvI_26wG|}^@x7|;*cXZXv@l))=N-l1GFdhNNHF0+M!N9F#c}r6ro@>G8FD3S;r4@s>0DP16hTA@Xos} zEiEs>?AM(qzUcu!Ix$`T7PYA(Ejl2N!LGhA#EZce`oy<$M&7|pd%XqVj_;xZ>-|!fW8Mk zlx0PxGxDb5u@S`?fa=68~q;;D0%@lBZA!s%yP!hwgJqIs$eoG3Jz0P#y6=o zcLG)jxmvceJhr0sPJ}YZUBW&N1TjX4LAc>ZSk0kZJPf@0*0Y`rdoY+sDGY?H0)sEH zbiXp|wQ|4OVbszb3KqL^IzRkAu|GfcHG5c$&0NsY69rQUbi|DyoGI)C5juPf>`qtE zJO@h}G;xWPPni5PF7|n0`7fAiuP|T#bkP)eMU-t~nnbG>6dO3cyUSDn@bo3pQ_A{M zDgLp$obw43j#zbMm~{rV(l>(A-Qlih#;x%#GGiD_R9&Iulka?z0?t2?R!Z4RK`2Qw zsA~(p39WGZr-3vRH3?i#)0%NkDAA<)zXm?h_WJtz!1jEoN&X;Hirj1v%X2V_KqzgbvL3UpbL{O=hoM;jrnMWZLf)bb00`7r+10=dY}Hm0g|#AuFSm6Jr-u z{FX=cJf2H2_3|XA6JmDP*jXl&v5zO}B6vpQ|#* zV+>OYUcSn_p`T<&Af%pWxyjUaT52Nar6cF=x!bSk>@JU*vB9lrX>fRl^-3%rA&(iI z_S2Sn{j|vzAgB!lozbO!b2>UYvTPU{A+Vu3@UM>Cg+UXjitE|;@rJlUHRvZK>!k-A ze8_Z&W5o-$e?wiVQIVG}K0P*%4j$TF{Uf!n0fd1hKED3k>q@_SQBW|2D}bT^|9jBCH)_&# zCtF`z$4f^j4bWTVfR>jl*g|p({{#B|z-=G)UsBq0jvJI>I6*BNT|v{^EXuLDP0ssT zY1P&-z$dI6K_?nNa}47m8CIetHc+S)0MPo6L2JrP8v3-ti!s7@H3z${sB+*)sBviJ z+?q-Uid`}Am3LsU4bn*Csd>yF!BLQoR^$39#d!*Mnp#=uwio4$6nt?K+=5x(1@0pr zXvK?MF)T;{2~7f3XMnVr);a?0fbuG&VZHhEQF8k0yeLynA^qC5YhA3-EJJmwWKi;|)g9IW*g74c83@pP{Sf z_t3HlDU;DLYS#1E_!h;kx`3{rs&m(^4Fm;7Pn*T(IyavgKR9{)=cH`PX|{X`sqmHr*PkZ{)5)z(_m+l49cUU-9?dVgLQX!NKUnM6ax@te^!dhGW;QL*Ued(@r+$Cy@%En@-)~##?^Z5@dX%M0a+;bqtTZDKyiq$4^(vOkSo<>!!ly{fJ1wlW^+ z!=1+soM`iovng|$-7lL~dJ`c(6J#RdFTxv~F?Mlha8}~HgLa+U{Jl$jmU3Bbzm&H` zHy>HJd1bCEV*E{;(pZXItCh!euu5-*nEZL`9_hu2GjJ6mo(ZjD9u|WT_y{M)#+Jieasb;O z^;Al%OZaVGb7{m9VVF0O`8{w+EDV9KW4uG5j@Hx|;v#@%)d1%En`VQ3iCc?2 zeEek^mW}EqP;z=&1(b4sOS|rQa01FO%qQP~)&FtsItG1#uzF;CK4?EWv%Z8jYqhkZv))Z<5~3ifWygJ>Jq?*cJe`Q&H^6j1W9(rIYHF z)oD`4RxdvJf5irDfTGroJxH)qR;iy{LiImIH-jAm^ffg#tClwZz~Em6KKxkDt7>^V z9Kygx4vW>)0bZ@k4>?x>aq<7Pg)i~Q`=lwidsb?#ugc2&Rh5D{XH28LIN4RMq}k+a zDhad9b7}9|%M$?WpmLg*_~Vf$Im;~_rrLX_XdWvDtL|Cvn>f!?pO&krNvtwbNw_bv ztvn^2)<`C^Lppwb>7q);{8ppJw;+~);G3Vk-mI=VxbT#7>+=L46x9dF2_sw3_0z&8 z(c!bFdE%wP8kQV&3$Gbdgt!3^Onaf{&yub;3eRppDO%?yS;JllCVQ*CZekMEE_m(^qEB=akbc0vdp!Pn5u<;$1rNa|#ygwJbU%xY zmWC+pgQ5Oc7TX|Nj@Op#*qrgu`?%o5dKYVxX~EOUR}+?}GjU0J_x-w!`}5WjdM%iO zUPJjo2N|ir)hx!y9S~j9Kr-6;`Qp)@w06s-ZU%>lE^sN6a_2?YJtz#By!;K*vDEWQ zg=9{Tm^vSrrIIz7TsiMf3$t`OKPu7VDIBFB3pKBxg#?wx%_tKqT0hv37_@^OopI6`6Ln5chV%ssW+C;@j zcBK(Us*uAUl%HXE95tWN?ba9wwob0w51uVRc{;@1g`>OR+h2Uh2B?1rdWrTYyhGhW8T!mWHZkOrY#J^G= zq@z+>xF8nJsRP!oTe}jxF823ub}>ePgg7W6{_Q`Vw*Nv=q5)m-U|G#N0sO5?VD_aP z_DLm zeq8Q91jr}{-i&Q24lTPOtL0>3mXYW=?^YIF7589W`H*G0O;{FdaAShTb_Y6N0~4+W ze~Vl{wW)>Y37jK!El_;Mvd0%`vc4du$@p;gRcJntNEr^RufYv`1xYc3_BIJsd&|CX zNn$8-P=wsM{d+B&USgCy%s>4*J_lKLE4{hmYQFJc9!(XwCh=h=YW@1;$rB78sE;UJ zSS?#XlFZQv9O;_*$7@O!jR_n#sLG1!J4G^@G!M}~-A~$AAV?r-jNVm0C;61Nv3g_o zo;$B5uwkvwy}lgU8^xbRHE_QFPM>iI8m+(9(-YSY*YUZQa|K}s}414_@%C0;?y>;0*7vYKu&m$ZOxlWd>8*!oc0qW zMS1^238g$tq*SZU55-?j&{Q4%oZ3VGo3_&0)4=!rt9a?Bq?__>VvL{9;s5@$|DRqE zgvu#5UBQ-;2oEa_QxLNF)A~tYR+k7hEr&k}9w_hrcc$W3hWoFd;9|-**!=H0?8R+g zFhoP^SY1f(Jz@3w3&5cut6E7kFWDwi1Y}Y&s~ET&0_esTosi%OLdF7gk^mBiCNM~H zREsI+Y5XKcwvFn;zeuvGXz6wRw{_?jDuIO|to32TD{M4^bo-D5CLlg`bfc3EnE;L5 z!J%dLxvjh?JtNz~fuAV3p9*T~-$3ze*B(mo>cuZd1Yb}Jl45~3z#lP6eD~LY^}27i zg6T%>roB;+@S6kH98tIzI>7J7esu+e4RCFEn!kAb%-;BO?Si ze0NjqwKYy@W+ykDBwwtCGiRwkT(x~(SO^CDuDgI4?#04_YO9y*vhbK#A8Ss+&(L9gMl*>F$ww?lLqq-?{R*0;bY-v zpBEyr!O(tH5RrQr0G)A-nSemm&OwHmr&>(823rzi_IOeXW(vyK1gz>f^pUW%!)#y< zoPq@B_>q2H0K;XMx=EUnJy`8@MmucYM(1O>gl#aO%^?;_g2Y*3VgZ2269I_DVpJ6D z>g&5hpo?q6wBAZl7d5u*i_++i1h{2j0+?Pp<6VWSCfJ=*&NYj1;jF^~r>con2>@+?=k9EqbdT z<)2^Z*{rKJq4hp!rV9?C-{F3Ix{R^z*9)OTuLRwNBZG(hA}94}Xt;A7ezme0qS-c( zn(hMXqm&q7&CzxRCQappiffaO*)dj9@3r$dg!On-O*-PQF}WXU<+oW%%WcmS9%Mff zCY-{vi6gPPxzA(piIrBih4}lcm!78OMijp_EMLyGoWA*Iwxv$*#Jy-^Z5qvaD>(4( z0B@bmf*k*w=L<2NGyL(44AuY+_=P6~x|` z=Jqn9Xd#Ec;J&w~-AYi#U;P&juZ->?a`VslXKlNx$sPK(Tg%f)KHm-^D0-2v6c=nE z^u2(+BhcHq4fJDgfQz%5&)^WdBrVQL3>!Yq5=W5!v^+1>`6%n6;L^lf$h-C z8gW{B>tSRWh(No%s7^j0F)Z^zpSH2Ic81%FVy8;CQ+pbGyQP?S1NA>viZ{i(&njQi zVMvYtz&7cZMz+bP62pt*%9Lqy;>!YqhwvzLJ)l9>hFZ{{5ak~>G^fD6q!*u{>JoCZ zgMM(|sX!nT`0IkRU}9SJ0PAuCiyugmFU4{xfculXpY{P8w6IEoLSqrkq3#Gjt+EzJ zFkTIx1hJ~|T~9%%R2_pAqpmv`(=o8Fq|T}SaK>W49Ikn>?mt@PJ%p~0=b70c2c!k zf{KFRpg;D2tePqnG@*P#d>s-^VVAgsj><{EMlJ+USqBa903v~6k{u35*_Jh6jB)ZZ z^gbI|< zCtNqS>Ui7G0C}`Kl>gb}ga^WJfsh`~kdgG^{m!))puCJ8XN$mNM3d5kNLcv`{N;nL zzxs|F%z425bZpaJ18BoKU|;A)Ghp6OI7zwVHCY%X$E!LxI6z{~s+k86nKG@xIkbtu zJQhhdASyK5MA*U?R}4-DK~=y0u=fcff#K&~7m*b#NX`X!+uh()11)W|T|r_@OZpf% zz?;Pm?*Yea^q!suO1u@_PnX5OQzx#e9g{Q*1=24k|5hUo^R$E4_~+)3P6CmUkV$;&rvu?u})K zI~-zij$^cm-A;x{&NX3cC&!@wjRfr{Renkr3*Jxft?i9h;R~;8*#*krikLyG%$sK% ztW-03Vk;L$Vrmb+ahgm1>tU&0noUNG14oQ;W6xCM^o<3mfkZzTtSH<4B1gm^P%y@* z)@G!P=1tTuHVxChj2FU=F3eOlce;#KxjrtZ4^4JZvKpv6X%I*iSuN8)a=iZMsL@!* z&c@Wxy#2c>gNU3ro00{trI#%StLELhYR`AGej%<-Kr_stU#b79tTZjh1AV4AH`TP< zY>Di_;dje#g65JI!y?4@)U}KohUxySsY#d7(69>1$@*Cq<|uEUX}A@Vac{R`nR%k3 zk?Zydh8c@oZKBF>*BQla?K9lrJcgYswrDI zG@wBrc`-vCN9tg2(We!hGNjbb!q(Pp^i0wN=4C==-;-mo4C%tMsM?A)T4en+fVbE! zNY*hJYF_B_R%gcQfOgr?x+t)IEd1RW^eR@|Q5AzYKpFS19_+wtD$>$r;=pGiK`j~+ z-`y%db*cZkTAC9R`mu9Me+%$>*7@X6FhBb|>aSvc8(Dzw_;mjvhUy;`egt-8DrcAa zFRtb_>7#cWpG8Kpf+lU3%e}b?2{3S!vE*Q7lfiT&lIoiwivvnKAZ|(=0c1e{e(ki)5ZF z%1Tk?x%7i!UKPOT}Rd7eJ-&tT-ne&flr*0REhnwbaY`8cXuwBopXZMo70XD(=J zwnU{(K?}cYMn)c=Q*X;GWCCPZA>|1bI&}CYBPzv(LqHUUf%|4E#+>HF`q^^d#XFSn zn=%07A+|caA|@xP?-A}@1cl@uQ49?w4o20D4CwEV-N$yp-rU;L7yx`*`>vfK_d%Bv z30%S$2A62t0EUcz4cJnVyXSELFs`)b`j@wP@>h}Oe`D17I<^`Fp8WfuYfnm$IDZIR zcFOz7LuVZTCdUU&(51+ocNh{zSvOwX5z#^jTVOt67(!kVnj@$tK4L(=q1;Y3Sf$IZ z&>B##66Kkkw5Tfo=ZO%+DTJ=Enu5)#ngAaT11oIIUQoHm$H!LyB_}3K@wR$VFaye$ zHvRaR{%y>**yqoo0mH2W=&O(#{R)^ZFn`cYt+s0m%!xKqHv?>*Nck$p_=wX_|dz_scU7z9_hp467Oi0a zIaWqpiVkLS@E5Tm71fVG3jBNZk$U6v2A9}?yn{gtM8MN`gcx$we})5DbzO} zh2ocF6}V7hs#*VRVqYdIna(Fr&Y1FSvIZQWy!JJa_-{X%5MRpeC8{*c>El7+qv(D0 z27Zl0{}mK^%@^<`>M}aTU^z>dib3&X&Ga|c$?s1A8O6Czp_xPC%UOBo;8(VUwa`34 z%*ec=TYj|=4u#W_14T5RyEns+7PE{t_6_^8gy*yUtL*h()|1)Gv#*(oz*vxhpPwJ` zDr{DWeq;0wai}H_FnGFWX<^3ehrPn#lgN76#c`>I!vVjnUBf+3_v7_`au@lh zKtLrY&i^Wy@z*7QpFL2X1g1u{4tWs26hoD<3rHVilXtK~%S5ms#S1~!Ly1A_3BN^t zx#Sz}Uvmo1I;$6#phi0$|Dxcf5|Bl@fnqLC+*5jHyA$AEWIB~7ltYh!wMea-572CT zHtl7f^L6j}-R(bQ2nr0{g0pa*C`Se3J1)kALmX5pe7$?{ij#zH-Ge8BlmyI$nkV&* zjm6-DQQHe9@xNGmAAEG;TeL30woll`Wh@E&&i4SwY;aLUh1{~fo=TY+eQ(KV4IoL_ zisK3$Ii~Ow!s|`aU;P5ZAIQJfxi(bnwJmf&=N-o;6zI7F?YT=^9N#KRL`zhM_3 zXo?Ug6JUJ=Z17hfI!U?oCvY(M?Al1z&<*lU$$p>;k@<;WxuO3468ufhV^2(A;L%N#!sy1#tz$@e%+~p;|$;)q4sg zU5`rjLZ3a`-@iQ4njzm0CL0gn7wG{@UEY&;E}dx_PyG1BwS}2M7Wh7QMcgEcF3O$g*(=I9`R|RxK>tz*X}Ul~{=>I?@yLFS^i5K<+M3=n@k0^fMNTm|oT{fM0rnjtj#g?kqh?v86B*x;!E zzTuScQn{kjE86M)xYRC^C%ZU+hW+4V^^A`GgfNXz3t!x&B`xCt?)KS&mDcyWlb#Bc zPKRsifJK|og8KWHGr#mJ(;So%8m+Ybqf<@k!J*!lGw*97;*Xs5v29xzV`DlpoTm7^ zAa~>5)jtaMhcueSFSSHp?9$rNt#*O@hVuO7XZoYxZT)cugrMod>5tt`_kCB!D*7-r zp!H3^`0XNQQH3V%rK#60B3xVeBKa*h=-UKyh}Im?jj^MAYsL*vQWJm@-CBW_RLmxQ zS608T@z%D+mP8M!{iCH+)Hh^|R-B#|O_^|u!qBY#F?HIgS3}qP;Jfcn87(rr|Nhhv z8R9r`=8rvh8t7(Pj6Hwj-C(gHo^P~tJJ5D6-n#dP_K7q5L>0D#+y)S!&Hu!i8eyHE zpBJA5-n^*{`K1UMLmbKksQ5zce2o-lcx}0ekeWOg0X&HtBSJkq2Vm^>6kTX#KvVH8S2& z%SYXj)FYxT+`r6pj9RW)gDvrtBWbSaZHwgw7Me~CQ9<_xi{LgL^TfvD)oZOH)p*@O z-R{B8&KA8kBGaKThT8_;wp_%E=rffzAzHdUF3{jxweK3M^_}8_;G$nG%sv0|9=q$T z?~mPE%6K|Bf4blB!rX1|1^e;uPo=O24)yStP?6uay|KD7G);qz?Zg=cHSC)0*$*u>a^nZRq&#>={7|F1todyErME5aq7wH2W!?AwlBGkNb^xTvpV_8^wo zkG8SSzJGqcySRU|Z3xBIU>a?kWe?q1u)mLr89nsJLsU8m3et#5D`ytNiAK_nw%HMhM zgcQ_Jwc9X?z3!l@#PJk_9ZgUJfet&{v6&vW1h)b&Gt<1eKGqSae$r!CRA{GjW$zHm z;<2hR3T&G9>mID7eb(x-mEt}?GHGgp%^fpn%8s%cPgq?9BA86l@i#5lG~E&WVc=}r zwxcaVD5yZq;d&NCD~5#vgHyIe3oN$Gp;1%Ocrg?WZ2CK1as^v-33K@Y0=&JAm1)RJ3u%$nMM|- zC)lewJIi6>ckqSFxMKPfX{4!X_of%zjv&-Zuxtf055`_rVkug?p(lsj&T6D~S3_Zf zY&ngJXzZefzCLK~k#?)o`yYxH4t~rJ-Qpv>^$CS=#y&hk-;jh#x0h`1IRO7+pIb-r zDWxJ*%EGDdqlLd|lx`RoHrqrKOz41dDeUD zDkaI+JKo%3n-357_lBH!#xEja(_LpGb$;sT^UGGyj$W_*Iy3f(2Ca-KE&}2MOux^B^V%C*dBNKNjW zXu6rS_%d&kRKV^{d~8DB2z}$6UXb?TMDYR>QdtrbKb)wem?MD>a1WCv;K$Y4KnZCw z-2r>Nh62JYAM$iLh(k~g1YnoiP2p0>H=*ylG3z}axGW|ozzrfS0YG2{_fHA*(H zwGwX_NynU9>UUZ;Amg{_1`ZhEBhCFUc^;ja`Bu_D>{{c4hY*eL1?uRK*94Kf63Z@8s@(`xlwrv}^ha>QA zo)#5`n}KpqLd}D#d6V%IRE!VU@jri9?5&m=KGt+uo@06%&!M0CV@xs0aq@}9p=^0SC-DtdnjpT(rH;9g-GsD zUb(WjALu)BGtyl((3UK{!+Zpa<*Gx=FzcgABcU8D0gDP<-SSB1@=@$qTYsZ+=yzy> zR(KQInOf!dFgU<6D<69;;qY@EtUyPVL!s5k!XaatU*95UE9c979`TYVK-71XT(Cx` zm?4jG$sGIwCP)|M7qCNfq-%Ij5FfVouA6r4d2*}Lk-3;~$l79q*kR(qOX8k{C%-cM zo<$xty%LUuL;4fzV@s&SCLbNVB#1+cvGTsC)N+KitZDwX~6taY@C^? z$Q2-3!6j#Cv{WqI%1YDaDY`t14XtVef7Q!;12$vC`sHHLW%I=ezkC_dOXQ^ohkfOs zk;R|rQ!EaI{uV!^OKYxx4x`|)iq@Wx`L|KEWj9dhdjf1d(8VSyG1&gEc%e-slcE=A z5!`M;{bLd|Ye|rcWOn@(REzt-xF=s6Bv#4Ov7nAZy=DhE8_d3s5)D?)UI1@5I_cbVFLB1e;v^q5H02wZFFEKHUaWoL{NYKEP)d0P zYRp_zQYu8lUIgJmA>nv;;c3nl@7ZSfWpx`)d;cZd^#-*zsK`_+J&@O(Y*kHjKfV9soS{E6ccEPNjoYhaNy4 zk4)v~1K2%HlL~hQpbvO#BbUa@pBy~&S^?>4)(f#NOar%3e$5pyR^i9xtbPbQonBYa zLS$;y3PzNZ+fIau9kA)dJx^0kM`~gcMo7Bt0tm-^6BfWS$UguSvspnoiH)9n!2`Ss z2qIUO!LdxRc^dAj9+;ejG{d6wM5C?^hy(*k$Q~N)G=$(R02N%Zx^JGe(k*0953x1M z&2&0BMdsz@mCmCEU1Y9QK62p!*oRNe3wGM`YBmCU!n&y1TCz(AU4@pQA$y%(E5xyN zQ;0qwyftL|Qvlh*%NHn`w(7NGMUxNN8QB`2WHK);7qE#uN{0`1^e&p_FV4V)ZY3cx zZ~j^XH@(*a#8`11z6I~Y9e^59I~z0>wBBbutV%w(Vu@Kkgkf?H7AO;sMFI?|%{`k} zw`%5|Z=KW6dctyM0V!w=1O8>l#QHc%jD}Fe{r+zD_?a+s2q5BlaC_l}g=CbKMGn}J zsX?uREanzqaTqlOl#0|-Onp1pYHk=Cf3F?_msubM)>1*$##@TegDxQ8gpCE!q*Qzk zS31*tFiuPHyb0{D{s-b7=I^mdQ-cVRRkjQ%ErRMs9eO=(Mx~V(yDJ;PjL^qAuIF9? zl%sh8l-ee;S*)(06xEx0uOK)}wY8fNwZx7ITEsYZb8lu*A}Dp79I6^Y^2b{{0_WE` zXdSZrKB~?dZiJ=s0&{aRw<~c~`WD=yr-5dGc#_g>(OD0p_KBZBK)S^z1A~VNSz$o-_*K0{WzC zW5jo^J4r#SaT)}iTVy>icf-~9p;`^*VBdf{(sayX1EKc}<>D(CPOPVwaCA;5@i+^N zfa381`cI;&rE{+8rVcO?(4hvbAMc~;hRl_N7AAu8FEI?>(ol?PPH>1t+2J=Zk?!oJ zH4Nk)1}7OWh?iNw7%hn0YY~b4QPAErsueShDPdH!0|1s;ngw1v*nK6-9=00&5ndp4 zT8TiE66CPb(wOI)Hmb|CaEaW_3s&k|UX8#ct$4o|H`lf;^T^zj#!mM%(1%a zRkS_O(|G2Rm?@G-$!s$4>?(#WkQQiME5st7o~7(OBX1;a3@iehsU*_@GP8k2V1}LR zFSVP)8{(HgU!Qm-O}?WagoEvWE$2gIM7B%9v4_4ub(j1KiVC1%q{RKWr{%e)s$?wQ~0j;As~jIfaiqi4(H}@Gyd95^|?LV|5@U19fz)aB->R61jaPm_Io*^leuGk zRl$K(#BdWR3uA&y-bDRT^S5o#(jtyo(z_sMsxa%UN2z0K-fGHH8pwOKu z;z6i5t_DpH4?6cTi@tE2Sf9EPvQwehV=OdX*fdzC%PaJ4?d{ev(sF;dFiT zD7SR6-Pqf|ReSa{or)unwxcBPKzw{OJ~Vs(STz`DJLZl|LvC;Q1M(7xtRb@nY_(;+ zl1{`jf5@4<&~Grl>*bX==_BK~gsZ^FOXrKvGCmO z%7da}Lg2n~DGE(#g4t+1y`{|QiN{p6H)a)N#gy?YCu!7yO}SqcEa+LyiBzfWyQhJF zA64H`1qt&pfYMW14*0r8_W)p9taOU5$p%HccckTSS0I|@w^`jUyn5~qEaJC2R zSNkN7J=l9(U=%iK52+x&qL`wlwC749f-1T)CwhG@biqz(+|c-qVJvJW=UF8P)OQ$u zpNC(Yx@}@TM9)lwE#jV+mwLV>v}{_PbOe`uAI62$EiroESliYoV4&b#MWmW2IwI!b z>IKeDvbL2F`bSNM$JDmKT1AV*TeX$uYDac1A(idtrQoFofajk+#aDTni<%_3{3dty^pA8Que5Khny%! zGBFd@2MLrw;OYyUqU%%h=*W#L%`6O?lxZQ5!|R|(1QNufP(#a!qyGme-}#@{re->9 zDC51yVjezzK*UwZD1E8wX5P-DN1vaagU*Wy%X48~B5q?2V|G_h{{=x@g=({@tmNaD zL^yH``g$g+n5_wCG{)A zd9I(|cFP1!j#~1W&0GKS*Y$J-R%Q__x_eiaI#=4m9lZZB2jnT=qS(rKfdJ-s?|+Ez zm?XLt8cBPuBzZY-AW#E+h{9?ub0V43MPL#Qq-J^>RWkRnDiPO}xvsreaR($`xWNma zJ)2=zLpDb^Dv9ac9VHm&A7(uyeujt1nP42;wCUAs5ABQ~E6I8}7!zAd)ztGE?CDsS zeuOpy_D@LYr`HY3kY=vD#d;powwK4={kFc2suGQlnDiiFE8LWCI&s?$pob`?>*TOy zizyPBjA2be0;`~8G;>T$OzqZ{aGf`BvjJZ;mq4lP5&-}j!McA)oi8*5)ZpsE-5-Px z?JeeS)F7Hli?n%5$(D*2fuQ$inbWw8uiKQ~ZIs=kg9Q zl4!n50e*42&n92PNg$T%Tdf=c`@J zuCal3ufH)4VlHBS%!o#uQDgZ%{kRV2no4=6NwSRfI6PsNr;n9q{jR3RwhwZ6O}c7t zqxc@WzrZ3v+SVflH2KA77j-Hzgjvkn{~hRzL{Dn%I7l>#WL{<|4PrL!n}ALAm_wx= z_KA*^4Bda`UbrNws7Xy*n+alrxGa;@Jb%A}Oug1ZTJ1JHhaJ4cDTp;nP$m|DMi(Q} zfbjETD&A6@#!`H4TGBH!9Txox$Qyix(Ec@vEh!Uh!~&q$Zh$RbD=^j_%sH*@m(vK$ z>x@$-#38S=M3)9W;M!Gy*Tj=%2t8|!z`Qw257FleY>!m|^m<+po0n%*%_pwRC%#u> z%RDR9QC_+Xar7mF9M#4lQGgq+YWxMCIiH1a3J(lFvyPX(=<-l|D-}@Mhy{V7$2gWO z!Mn)-7_pY4mgq;(Xf3(G9LX|12kA!jwLlFbi^I8u1q;>2smm5eXA!}ugNXQj=b=V! zZ%b^Lrkl0Z!S?+-Nf$pM zN{2Wg`M+}(wg~kDq5u)k-ByAW?j2$SbgjfA@L0fhSgJ zBl0QMK1fGn{|g`5ga*F@sr#{cSn3G2WF21m=FkT2AFy@?)t&yW3JC>*q##%G7gs;B zt$@ey3b>phB8xKsWYB`i=SDVi@ohaxXx4sR+2h$wKD^wX7K)$5p+F-TW7nRO8U}o791mKxSA38HivMDW$x&7wqPy#J^x}t62--f zP{V=0fb71^nHgRRg{=8m2wrwUam@gw2&jbI4fDqy)OHWBRf@?ZoO;xPC%qu&k_`+r zc_-5#f}8Av^?3GTmha}i!9w97109A%>3X{Ik5~HWAhr@k)+t(yLWk#{aic)>=Phs` z(}jke<7tTwM}fWE4JnuxWYc`m|Bgn2(MB)p2U6P3Zf6UYymd7U_IU)TR<4JNq=fn! zGfxF-Y$HEkqXm08>aqp|+4AzU;CFg!CyS0GjBu96IXM*CF8ULWfeAXcilEN6 zBLs?n<*J)J{v_uTdxIU}kV*W0T^{U#!myb92>FBVFrf74LjKP`<!ro|yECbYBLaO;|xR7g-ox5BncEI&KF;UWl*gF^<>%9kv1+NtbcDi8O zWeytILb&rP87sAZdDLKxq)wLGV&u}!HD0d0oV@4k#usj@RdOhHeyX829a~fJ42&38 ze`p~D_-n($Z=C?AGGg!VS~F=tqoYE>(hJ#4WB>$m7^B){KpgI)uQ+0%XicQkoUA`! zOEn4wtFPR8;~-q&noArgKa=v@;`6_XvirwMhUI2hlz;m19~~jKn~vZ9=IZK~h@Sd_ saY_*T@uSZn4UZHWLI9B-;o`mLNGPEh-twNN7NkB$1pkkdq==q6$dPIkixLWF%)A zP>>9gidb)L`ggx~`+IkMq8p{y2U5a>R|&q3g*_dPZM{+!U7>OEuqleQ26sV=Wjo zTl(#a5tnknmzSUEPa2;3!+c+CZf(3Hs_JlMf@5`GbSJjTX|^+-#mRBjsq;YLjxs#p z@BizOd^d-c_P2li3WJfnap%e!2sVn5%tlP|r>IM9~TyMeyqRsm)$R#nG8OuS1JYue_}-x3G=2_9~X3 zxliSU>(u?!(Sv;*vAoReWn<4%ECzE82C}twIbp?X`E&Piar?Fga7QpVy^%1y6!M

h>)5FMrJ}A`%ftphBE=2&ACVf*N79nTM{n>& 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 lUEiYh;%Qv>-?`D;#&@~*h