[automerger skipped] RESTRICT AUTOMERGE: Ignore profile name from DICE chain entries am: d90bee7ea4 -s ours am skip reason: contains skip directive Original change: https://android-review.googlesource.com/c/platform/tools/security/+/3475030 Change-Id: Iac5bd69661c9feabf4dfe17b777579143f8a8671 Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/fuzzing/OWNERS b/fuzzing/OWNERS new file mode 100644 index 0000000..7540546 --- /dev/null +++ b/fuzzing/OWNERS
@@ -0,0 +1 @@ +# Bug component: 330367 \ No newline at end of file
diff --git a/fuzzing/example_afl_fuzzer/Android.bp b/fuzzing/example_afl_fuzzer/Android.bp new file mode 100644 index 0000000..8d3a6d0 --- /dev/null +++ b/fuzzing/example_afl_fuzzer/Android.bp
@@ -0,0 +1,18 @@ + + +cc_fuzz { + name: "example_afl_fuzzer", + srcs: [ + "example_afl_fuzzer.cpp", + ], + fuzz_config: { + triage_assignee: "[email protected]", + }, + fuzzing_frameworks: { + afl: true, + libfuzzer: false, + }, + cflags: [ + "-Wno-array-bounds", + ], +} \ No newline at end of file
diff --git a/fuzzing/example_afl_fuzzer/example_afl_fuzzer.cpp b/fuzzing/example_afl_fuzzer/example_afl_fuzzer.cpp new file mode 100644 index 0000000..96b536f --- /dev/null +++ b/fuzzing/example_afl_fuzzer/example_afl_fuzzer.cpp
@@ -0,0 +1,25 @@ + +#include <stddef.h> +#include <stdint.h> +#include <string.h> +#include <iostream> + +#include <string> + +void CrashFunc(const char *data) { + + if (strcmp(data, "c") == 0) { + volatile int* arr = new int[10]; + for (int i = 0; i < 15; i++){ + arr[i] = 54; + } + } +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + std::string null_terminated_string(reinterpret_cast<const char *>(data), + size); + + CrashFunc(null_terminated_string.c_str()); + return 0; +}
diff --git a/fuzzing/example_fuzzer/Android.bp b/fuzzing/example_fuzzer/Android.bp index 97e792c..0b3dda5 100644 --- a/fuzzing/example_fuzzer/Android.bp +++ b/fuzzing/example_fuzzer/Android.bp
@@ -22,7 +22,8 @@ description: "Test Fuzzer", production_date: "6/8/2019", critical: false, - fuzz_on_haiku_device: true, - fuzz_on_haiku_host: true, + fuzz_on_haiku_device: false, + fuzz_on_haiku_host: false, + triage_assignee: "[email protected]" }, }
diff --git a/fuzzing/example_rust_fuzzer/fuzzer.rs b/fuzzing/example_rust_fuzzer/fuzzer.rs index 14c0a51..f7a7f19 100644 --- a/fuzzing/example_rust_fuzzer/fuzzer.rs +++ b/fuzzing/example_rust_fuzzer/fuzzer.rs
@@ -18,7 +18,8 @@ use libfuzzer_sys::fuzz_target; fn heap_oob() { - let xs = vec![0, 1, 2, 3]; + let xs = [0, 1, 2, 3]; + // SAFETY: This is in fact intentionally unsound, but we hope the fuzzer will catch it. let val = unsafe { *xs.as_ptr().offset(4) }; println!("Out-of-bounds heap value: {}", val); }
diff --git a/fuzzing/llm/frameDecoder_fuzzer2/Android.bp b/fuzzing/llm/frameDecoder_fuzzer2/Android.bp new file mode 100644 index 0000000..5c4350b --- /dev/null +++ b/fuzzing/llm/frameDecoder_fuzzer2/Android.bp
@@ -0,0 +1,21 @@ +// Copyright 2024 The Android Open Source Project +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_fuzz { + name: "frameDecoder2_fuzzer", + srcs: [ + "FrameDecoderFuzzer2.cpp", + ], + corpus: ["corpus/*"], + defaults: ["libstagefright_fuzzer_defaults"], + include_dirs: [ + "frameworks/av/media/libstagefright/include/media/stagefright/", + "frameworks/av/media/libstagefright/tests/fuzzers/", + ], + fuzz_config: { + cc: ["[email protected]"], + componentid: 330367, + }, +} \ No newline at end of file
diff --git a/fuzzing/llm/frameDecoder_fuzzer2/FrameDecoderFuzzer2.cpp b/fuzzing/llm/frameDecoder_fuzzer2/FrameDecoderFuzzer2.cpp new file mode 100644 index 0000000..1ccae30 --- /dev/null +++ b/fuzzing/llm/frameDecoder_fuzzer2/FrameDecoderFuzzer2.cpp
@@ -0,0 +1,73 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed 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. + */ + +#include <FrameDecoder.h> +#include <fuzzer/FuzzedDataProvider.h> +#include <media/IMediaSource.h> +#include <media/stagefright/MetaData.h> +#include <media/stagefright/foundation/AString.h> +#include "FrameDecoderHelpers.h" +#include "IMediaSourceFuzzImpl.h" + +namespace android { + +#define MAX_MEDIA_BUFFER_SIZE 2048 + +// Fuzzer entry point. +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + // Init our wrapper + FuzzedDataProvider fdp(data, size); + + std::string name = fdp.ConsumeRandomLengthString(fdp.remaining_bytes()); + AString componentName(name.c_str()); + sp<MetaData> trackMeta = generateMetaData(&fdp); + sp<IMediaSource> source = new IMediaSourceFuzzImpl(&fdp, MAX_MEDIA_BUFFER_SIZE); + + // Image or video Decoder? + sp<FrameDecoder> decoder; + bool isVideoDecoder = fdp.ConsumeBool(); + if (isVideoDecoder) { + decoder = new VideoFrameDecoder(componentName, trackMeta, source); + } else { + decoder = new MediaImageDecoder(componentName, trackMeta, source); + } + + while (fdp.remaining_bytes()) { + if (fdp.ConsumeBool()) { + int64_t frameTimeUs = fdp.ConsumeIntegral<int64_t>(); + int option = fdp.ConsumeIntegral<int>(); + int colorFormat = fdp.ConsumeIntegral<int>(); + decoder->init(frameTimeUs, option, colorFormat); + decoder->extractFrame(); + } else { + FrameRect rect; + rect.left = fdp.ConsumeIntegral<int32_t>(); + rect.top = fdp.ConsumeIntegral<int32_t>(); + rect.right = fdp.ConsumeIntegral<int32_t>(); + rect.bottom = fdp.ConsumeIntegral<int32_t>(); + int64_t frameTimeUs = fdp.ConsumeIntegral<int64_t>(); + int option = fdp.ConsumeIntegral<int>(); + int colorFormat = fdp.ConsumeIntegral<int>(); + decoder->init(frameTimeUs, option, colorFormat); + decoder->extractFrame(&rect); + } + } + + generated_mime_types.clear(); + + return 0; +} +} // namespace android \ No newline at end of file
diff --git a/fuzzing/llm/libufdt_fuzzer2/Android.bp b/fuzzing/llm/libufdt_fuzzer2/Android.bp new file mode 100644 index 0000000..973d43e --- /dev/null +++ b/fuzzing/llm/libufdt_fuzzer2/Android.bp
@@ -0,0 +1,26 @@ +// Copyright 2024 The Android Open Source Project +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_fuzz { + name: "libufdt_fuzzer2", + srcs: [ + "libufdt_fuzzer2.cpp", + ], + static_libs: [ + "libfdt", + "libufdt_silent", + "libufdt_sysdeps", + ], + + include_dirs: [ + "system/libufdt/include/", + ], + + fuzz_config: { + cc: [ "[email protected]" ], + componentid: 330367, + }, + host_supported: true, +} \ No newline at end of file
diff --git a/fuzzing/llm/libufdt_fuzzer2/libufdt_fuzzer2.cpp b/fuzzing/llm/libufdt_fuzzer2/libufdt_fuzzer2.cpp new file mode 100644 index 0000000..c8c182e --- /dev/null +++ b/fuzzing/llm/libufdt_fuzzer2/libufdt_fuzzer2.cpp
@@ -0,0 +1,46 @@ +#include <cstdint> +#include <fuzzer/FuzzedDataProvider.h> + +extern "C" { +#include "libufdt_sysdeps.h" +#include "libufdt.h" +#include "ufdt_node_pool.h" +} + +constexpr uint32_t kMaxData = 1024 * 512; +constexpr size_t kMinDataSize = 10; + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < kMinDataSize || size > kMaxData) { + return 0; + } + + FuzzedDataProvider stream(data, size); + + // Initialize node pool + struct ufdt_node_pool pool; // Allocate the structure. + ufdt_node_pool_construct(&pool); // Initialize it. + + // Consume bytes and ensure they persist for the required lifetime + auto bytes = stream.ConsumeBytes<uint8_t>(stream.remaining_bytes() / 2); + void *fdtp = bytes.data(); + + int isValidBuffer = fdt_check_full(bytes.data(), bytes.size()); + // Return if memory bytes are invalid + if (isValidBuffer != 0) { + return 0; + } + + fdt32_t *fdt_tag_ptr = (fdt32_t *)fdt_offset_ptr(fdtp, 0, sizeof(fdt32_t)); + struct ufdt_node *node = ufdt_node_construct(fdtp, fdt_tag_ptr, &pool); + + int depth = stream.ConsumeIntegral<int>(); + + if (node) { + ufdt_node_print(node, depth); + } + + ufdt_node_destruct(node, &pool); + + return 0; +}
diff --git a/fuzzing/llm/tinyxml2_fuzzer/Android.bp b/fuzzing/llm/tinyxml2_fuzzer/Android.bp new file mode 100644 index 0000000..103d6a6 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/Android.bp
@@ -0,0 +1,20 @@ +cc_fuzz { + name: "tinyxml_parse_fuzzer", + srcs: [ + "tinyxml_parse_fuzzer.cpp", + ], + + static_libs: [ + "libtinyxml2", + ], + + fuzz_config: { + cc: [ + "[email protected]", + ], + componentid: 330367, + }, + + corpus: ["xml_corpus/*"], + dictionary: "tinyxml.dict", +}
diff --git a/fuzzing/llm/tinyxml2_fuzzer/gen_corpus.py b/fuzzing/llm/tinyxml2_fuzzer/gen_corpus.py new file mode 100644 index 0000000..72b8a83 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/gen_corpus.py
@@ -0,0 +1,42 @@ +import os +import random +import string + +def generate_random_string(length): + return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) + +def generate_random_xml(depth=0): + if depth > 3: # Limit the depth to prevent overly complex XML + return "" + + tag = generate_random_string(random.randint(1, 10)) + attributes = " ".join( + f'{generate_random_string(random.randint(1, 5))}="{generate_random_string(random.randint(1, 10))}"' + for _ in range(random.randint(0, 3)) + ) + content = generate_random_string(random.randint(0, 20)) + + children = "".join(generate_random_xml(depth + 1) for _ in range(random.randint(0, 2))) + + return f"<{tag} {attributes}>{content}{children}</{tag}>" + +def create_corpus_file(filename, content): + with open(filename, "w") as file: + file.write(content) + +def main(): + corpus_dir = "xml_corpus" + os.makedirs(corpus_dir, exist_ok=True) + + # Generate a range of XML files + for i in range(100): + xml_content = generate_random_xml() + filename = os.path.join(corpus_dir, f"xml_{i}.xml") + create_corpus_file(filename, xml_content) + + # Generate some specific edge cases + create_corpus_file(os.path.join(corpus_dir, "empty.xml"), "") + create_corpus_file(os.path.join(corpus_dir, "large.xml"), generate_random_xml() * 1000) + +if __name__ == "__main__": + main()
diff --git a/fuzzing/llm/tinyxml2_fuzzer/gen_corpus2.py b/fuzzing/llm/tinyxml2_fuzzer/gen_corpus2.py new file mode 100644 index 0000000..90c0650 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/gen_corpus2.py
@@ -0,0 +1,59 @@ +import xml.etree.ElementTree as ET +import random +import os + +def generate_random_xml(depth=0, max_depth=3, num_attributes=2, max_text_length=20): + """ + Recursively generates a random XML structure. + + Args: + depth: Current nesting depth. + max_depth: Maximum allowed nesting depth. + num_attributes: Number of attributes to generate for each element. + max_text_length: Maximum length for text content in elements. + + Returns: + ET.Element: The generated XML element. + """ + + tag_name = f"element_{random.randint(1, 100)}" + element = ET.Element(tag_name) + + # Add attributes + for _ in range(random.randint(0, num_attributes)): + attr_name = f"attr_{random.randint(1, 10)}" + attr_value = "".join(random.choices("abcdefghijklmnopqrstuvwxyz ", k=random.randint(0, 15))) + element.set(attr_name, attr_value) + + # Add text content + text_content = "".join(random.choices("abcdefghijklmnopqrstuvwxyz <>&\"'", k=random.randint(0, max_text_length))) + element.text = text_content + + # Recursively add child elements + if depth < max_depth: + num_children = random.randint(0, 3) + for _ in range(num_children): + child = generate_random_xml(depth + 1, max_depth, num_attributes, max_text_length) + element.append(child) + + return element + + +if __name__ == "__main__": + num_files = 100 # Number of XML files to generate + corpus_dir = "xml_corpus" # Directory to store the generated files + + os.makedirs(corpus_dir, exist_ok=True) + + for i in range(num_files): + root_element = generate_random_xml() + tree = ET.ElementTree(root_element) + + # Add corruptions (optional) + if random.random() < 0.2: # 20% chance of introducing corruption + corruption_type = random.choice(["missing_end_tag", "invalid_attribute", "unescaped_chars"]) + # ... add logic to introduce the specific corruption type ... + + # Save to file + filename = os.path.join(corpus_dir, f"sample_{i}.xml") + tree.write(filename, encoding="utf-8", xml_declaration=True)
diff --git a/fuzzing/llm/tinyxml2_fuzzer/tinyxml.dict b/fuzzing/llm/tinyxml2_fuzzer/tinyxml.dict new file mode 100644 index 0000000..8e2f330 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/tinyxml.dict
@@ -0,0 +1,12 @@ +root> +<item> +</item> +name=" +value=" +id=" +type="text" +& +< +> +' +" \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/tinyxml_parse_fuzzer.cpp b/fuzzing/llm/tinyxml2_fuzzer/tinyxml_parse_fuzzer.cpp new file mode 100644 index 0000000..bacc7a7 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/tinyxml_parse_fuzzer.cpp
@@ -0,0 +1,75 @@ +#include <fuzzer/FuzzedDataProvider.h> +#include <tinyxml2.h> +#include <string> +#include <vector> + +struct XMLElement { + std::string name; + std::vector<std::pair<std::string, std::string>> attributes; + std::vector<XMLElement> children; + std::string textContent; +}; + +std::string serializeXML(const XMLElement& element) { + std::string xml = "<" + element.name; + + // Add attributes + for (const auto& attr : element.attributes) { + xml += " " + attr.first + "=\"" + attr.second + "\""; + } + + xml += ">"; + + // Add text content + xml += element.textContent; + + // Add child elements (recursively) + for (const auto& child : element.children) { + xml += serializeXML(child); + } + + xml += "</" + element.name + ">"; + return xml; +} + +void GenerateXML(FuzzedDataProvider* stream, XMLElement* element, int maxDepth = 3) { + element->name = stream->ConsumeRandomLengthString(20); + + int numAttributes = stream->ConsumeIntegralInRange<int>(0, 5); + for (int i = 0; i < numAttributes; ++i) { + element->attributes.push_back({ + stream->ConsumeRandomLengthString(15), // Attribute name + stream->ConsumeRandomLengthString(30) // Attribute value + }); + } + + int numChildren = stream->ConsumeIntegralInRange<int>(0, 3); + for (int i = 0; i < numChildren; ++i) { + XMLElement child; + + // Recursive generation for nested elements + if (maxDepth > 0) { + GenerateXML(stream, &child, maxDepth - 1); + } else { + // Populate text content at the leaves + child.textContent = stream->ConsumeRandomLengthString(30); + } + + element->children.push_back(child); + } +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + FuzzedDataProvider stream(data, size); + + XMLElement rootElement; + GenerateXML(&stream, &rootElement); + + // Convert the generated XMLElement structure into an XML string + std::string xmlString = serializeXML(rootElement); + + tinyxml2::XMLDocument doc; + doc.Parse(xmlString.c_str(), xmlString.length()); + + return 0; +}
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/empty.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/empty.xml new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/empty.xml
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/large.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/large.xml new file mode 100644 index 0000000..2c59ca9 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/large.xml
@@ -0,0 +1 @@ +<xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm><xjbAVm GP="HG" P="M1O" Z="PMp9wk">6cIKlaju<i SF="GMSO7IR">Bwr7va9KyxeOxGFYy4<yGeu pHv="cBtvti3e">Z5uMTtc<u4YJDX MH="fe3uYI4h">NiRzK</u4YJDX></yGeu></i></xjbAVm> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_0.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_0.xml new file mode 100644 index 0000000..500ee71 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_0.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_23 attr_4="" attr_1="bilt">b'<element_1 attr_8="mzjmxxav"> b ut''b cu&yp'nuifj<element_87 attr_2="tadn">wg"""m fnhal<xyz<element_51 attr_9="xvpbbzi">esf&zxj &</element_51></element_87></element_1><element_55 attr_5="">h&chpeh z<d mdky<<element_62>qnvio cqgi"nvyx<element_67>q"w&xcdhy'btqdm</element_67><element_45 attr_8="nk"> ln </element_45></element_62><element_45 attr_6="kzrmydbopmgnsmg">dnn&axo jp'<element_94> ktsrqo</element_94><element_54 attr_2="tstdukkqqypf" attr_5="dsndvzt">bxzxjhodclrgbfmt</element_54><element_80>wc vksdrwhvuavhqx</element_80></element_45><element_92>sxym<dywrf</element_92></element_55></element_23> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_1.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_1.xml new file mode 100644 index 0000000..6a53beb --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_1.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_19 attr_7="h" attr_6="hgpzgm l">&yfhj&r'jy llfci r"d</element_19> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_10.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_10.xml new file mode 100644 index 0000000..10c4f9b --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_10.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_6 attr_7="a">ysgf>kqsvqh >bevzq<element_26 /><element_96>tf<mqhc&e>emkh"<element_20 attr_10="nuoxwtr">wkavjmprlha>hu<element_91 attr_2="fy">>gu</element_91><element_6 attr_5="pul qjbpf">ebtrcpl</element_6></element_20><element_28 attr_10="">>nr"uplpsvby</element_28><element_3 attr_6="">cz'e>"y&p&td"sw<element_54 attr_2="oyh k">hix f<l </element_54></element_3></element_96></element_6> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_11.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_11.xml new file mode 100644 index 0000000..ee1fcee --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_11.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_66 attr_6="r qj" attr_4="wqjkgdug jpfv" /> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_12.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_12.xml new file mode 100644 index 0000000..d175ec6 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_12.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_40>rk"lzgcclvbcur&c g><element_91 attr_5="wbupacdven" attr_8="hgkcweswt"><&sxemdjv<element_41>jqc<element_67>yw anv "mgunfsyx& </element_67><element_12 attr_5="vxfrblaqjmbc">tpyrx' '>wxqey'oc</element_12><element_8 attr_2="i">vpwiaj'"tfl<""></element_8></element_41><element_93 attr_5="">em&ow'sfre'nyedr<element_4 attr_5="dvkjduiwxvuypw" attr_1="lcwnbpfpykuhl">&w<cyy<kcfvdasu'cl</element_4><element_33 attr_6="vp">b<h""bagyzkgfpu</element_33><element_41 attr_1="hlydpdgnfdggt">gip sujtq wvxso</element_41></element_93></element_91></element_40> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_13.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_13.xml new file mode 100644 index 0000000..9271739 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_13.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_70 attr_7="nw" attr_8="rdgz">&bspsxuxu<wwqumb<element_14>kx"uo>nwopuacf<element_97 attr_3="irgsuflsrmjzst" attr_10="tvuhj">ygguvn < <element_65 attr_8="koojcjmw qm">ndsb&"k</element_65><element_45>qicpnui"i>skc'k</element_45></element_97><element_56 attr_7="gepum" attr_3="">adimrna'k"y'cfwsy<element_26 attr_9="ohiclvfmhisfa" attr_7="cdrxzzztoug">y&gbejiulvktbe ge</element_26><element_63>ftl"lj &nj mf</element_63><element_44 attr_2="arfyffkiauku">"ynex<&iauh</element_44></element_56><element_11 attr_9="wbpudarnfzthcjq" attr_10="dvmgwprajxffd">midoya&lci <<element_61>bqnlv<d</element_61></element_11></element_14><element_37><element_14 attr_3="sephlsdcnt">d&fz>tife<<element_39 attr_4="ufd" attr_8="cjhvn olgvs">de&q" okg j r</element_39></element_14><element_49 attr_4="qmwyygcpwrtpxtm">&h<r'rjyy<<"<element_72 attr_5="vitokvwyhwsa k" /></element_49><element_19>ccaxax"'<element_6 attr_4="uocoayq"> u'</element_6><element_60 attr_2="" attr_5="dum">" i'&pye</element_60><element_34>'<pd</element_34></element_19></element_37></element_70> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_14.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_14.xml new file mode 100644 index 0000000..1bceac3 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_14.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_72 attr_4="eghznlcizjw">>rue'rvyiy><element_98 attr_10="iugofcmwcs"> </element_98><element_45>v fsbnf<element_30>'p'lo<<z'jnu<< <lzg<element_63 attr_10="qxcc">wym</element_63><element_4>t</element_4><element_62>iev nzcdbn<qhwpbs></element_62></element_30><element_93 attr_5="qacqego" attr_9="fojvz">yogo n<element_64 attr_10="bvjd" attr_6=" mp">qgaf'dwblzg</element_64></element_93><element_55>pup""oziq coo nkd'w</element_55></element_45></element_72> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_15.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_15.xml new file mode 100644 index 0000000..f863f54 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_15.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_17>wnfp&k<element_94>e</element_94></element_17> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_16.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_16.xml new file mode 100644 index 0000000..bac41ff --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_16.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_100>rs&m&y"f>hu<element_91 attr_2="z devejom" attr_1="ft">&<element_100 attr_5="xunwxmxryzsspio">z<element_45>ftjbasy</element_45></element_100><element_40 attr_6="fonjbzecbc zp">oiflf>tazbwul</element_40><element_46 attr_4="flcfrejtb">n'>jqfmmlw<g'<element_82>bqrzcqomo'ir</element_82><element_62 attr_6="iscjhfzfmdghfj" attr_2="swmzbbrijwq">tf&>e</element_62></element_46></element_91><element_73>&mywln i<sb&www</element_73></element_100> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_17.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_17.xml new file mode 100644 index 0000000..bce1d52 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_17.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_61 attr_5="ugp" attr_4="">r gxmus>&rmn<element_53 attr_3="cwwktjcduvpop" attr_2="fk">p>yrtodvhkjr>ap <element_35 attr_5="cuz ne">kd<element_71 attr_9="vcdk"> sw> j&oqtqee</element_71><element_43 attr_1="a xdhxfmd" attr_8="yhkzugmh hkoulq">ibnjn"<n>s" </element_43><element_66 attr_6="akooizedcfy">vilvu</element_66></element_35><element_49 attr_2="cxxlimtt" attr_9="">bvec&lf"qo</element_49></element_53></element_61> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_18.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_18.xml new file mode 100644 index 0000000..96e53cc --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_18.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_60 attr_10="xtsd fszef" attr_8="wsjtnqsisyv" /> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_19.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_19.xml new file mode 100644 index 0000000..f253df0 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_19.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_34 attr_4="mdrab" attr_9="nteprhixn"> dgcj"ynw>fk b&<<element_58>ykygv&&zn'tr><element_77 attr_8="uxqdza">hi jrv f m m'yusb<element_24 attr_3="">akt </element_24><element_73 attr_8="ibhyo">ljxa&yj'<>g</element_73><element_85>&d>jbig></element_85></element_77><element_37 attr_3="">wpz'uknggg'r<jt</element_37><element_35 attr_2="lrwglnfnzocbq">sket"</element_35></element_58></element_34> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_2.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_2.xml new file mode 100644 index 0000000..834cec4 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_2.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_3 attr_6="" attr_3="b">gg'>gx</element_3> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_20.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_20.xml new file mode 100644 index 0000000..e930ea9 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_20.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_2 attr_7="tzbhxyvlrs">lfbgh'xvuf<bpbf<element_26 attr_3="kfynndhzyjbqaxd">kl>fjt&smgqo qsxlo<element_17><element_52>ka iyxt<z<b</element_52><element_35 attr_8="le">y<xskzlnkv&o</element_35><element_18 attr_10="eghbw jkisoq" attr_4="bylgxzeunpk">v'xcuiwo&noedev>bh</element_18></element_17></element_26><element_39>q &hzqc uityzor<element_6>bgq&dxaewhc</element_6><element_68 attr_9="xrjptjqucgkxnxq">vxjhzrqbtqxe<element_92 attr_1="" attr_6=" hmxnpd">lpuij</element_92><element_53>wspb ovr>xls</element_53><element_9 attr_6="lswznd" attr_10="qgo">ih'<g hfgse</element_9></element_68><element_11 attr_2="pper fmjpao">"ccbw<zd<lekr'q<element_14 attr_10="bgpboqros" attr_1="mdftxxa" /><element_45 attr_9="kzyapmbfnmdt">vaaprcrla"njewa"<kz</element_45><element_5 attr_10="vbuzb" attr_6="eerren tfyhvzt">or ft">nmelkfe</element_5></element_11></element_39><element_85>kkawwdam"wajj&qsk<element_4 attr_8="yp" attr_4="vt w">dkkqgjz<element_4 attr_3="yizrtuwlgsiu" attr_4="udcjqqerl">rayvokvxz</element_4><element_71 attr_6="a afmsqdoaf">beh"sk<</element_71><element_98 attr_2="xxbgn">jmmyennrp<ftukhqv&we</element_98></element_4></element_85></element_2> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_21.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_21.xml new file mode 100644 index 0000000..52abc98 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_21.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_78 attr_2=" curbd">'&siehwtzvh<sntciz<element_19 attr_10="eeoiwsvv" /><element_48>'s<mvox<'</element_48></element_78> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_22.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_22.xml new file mode 100644 index 0000000..86b8469 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_22.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_8>>qk<nf<<emsyo<element_47 attr_4="zjpiysuxzjarer" attr_2="wg e">xousimrf</element_47></element_8> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_23.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_23.xml new file mode 100644 index 0000000..a2b3066 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_23.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_4 attr_4="srfku">jgrjy e"bczo"in<element_67 attr_10="sp">isji&xkwmrwtnymf<element_70 attr_2="muqojfhpdcsknut">mln<element_82 /><element_70 attr_5="vqh" attr_9="we">>b&jtjo<buw</element_70><element_90 attr_10="f dmblryae" attr_3="icuvrefvvfhzwh">&vjqcu</element_90></element_70><element_41 attr_6="lhkss" attr_8="s ko m">if<y<element_42 attr_6="pdgbu" attr_7="gfvl">&cmu</element_42><element_35>fo&ywfla>xbwqvarougx</element_35></element_41><element_89>omzx jrdls<ssk<element_16>uvqe</element_16><element_50 attr_8=""><'eldgrjfczd'n</element_50><element_77>ls</element_77></element_89></element_67><element_64 attr_5="mdpszo">tw>f</element_64><element_9>edwwr<element_98>ibxnvy<element_46 attr_8="p">rqlzqvxyd</element_46><element_88>au>hl&gy&c"v</element_88><element_68>tuem'b c</element_68></element_98><element_9 attr_5="znhitymijwlc"><element_32 attr_1="ycqk">tzbhdhjm</element_32></element_9><element_97 attr_6="lktdpnb"><cvyp& xwu<element_94>k<j >dr f'</element_94><element_63 attr_5="ozmnokgmqlzdfes">ijjjcj</element_63></element_97></element_9></element_4> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_24.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_24.xml new file mode 100644 index 0000000..872adf6 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_24.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_91 attr_3="erbh" attr_9="zxxhuovxcs">mraveifq</element_91> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_25.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_25.xml new file mode 100644 index 0000000..14c0f39 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_25.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_11 attr_7="isokxlnku" attr_8="crntbyarsekfxfx">i<element_78 attr_3="alvkke ate">vxqdugf>jmjngo<element_24 attr_7=" uqbnqozeqch">b<tlnrmfwx"whiy</element_24></element_78><element_36 attr_2="" attr_5="eh hgdti">w>gjtrbj&'<element_64 attr_3="eslapzol">x 'md'kyjhxcm></element_64><element_63 attr_2="daq">pdz<element_89>lxdeojnrgc</element_89><element_60 attr_1="svljp">gqhmm w sbl</element_60></element_63><element_45>tiplwiam</element_45></element_36></element_11> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_26.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_26.xml new file mode 100644 index 0000000..4a2ca75 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_26.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_30 attr_6="vbo fkhij" attr_9="xxrrhsfofgd">joh<cb<uyh<"</element_30> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_27.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_27.xml new file mode 100644 index 0000000..d9e0019 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_27.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_44 attr_2=" vuxvk" attr_3="anu dvivzhgkvfs">vrpwmi&fpz"<l>raw<element_39 attr_6="cna" attr_10="ikdgtfqxrcc">tnrdwa</element_39><element_29>cjl qlp<element_78 attr_3="wfcyqnokvd ">gvzfno"xs</element_78><element_35 attr_5="yquccbhn">aredcnjre&mv' el<ka<element_75 attr_1="crsuecyygaqxrjs" attr_3="te">oh</element_75><element_48 attr_2="xm ya" /></element_35><element_22>j>duwguxerdml<element_9 attr_9=""><hn'bjiyc'xf mjqy</element_9></element_22></element_29><element_74 attr_3="dsnwepxgt" attr_1="">&x<element_74>"vln'<element_93 attr_5="otlstw ">w>f</element_93></element_74></element_74></element_44> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_28.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_28.xml new file mode 100644 index 0000000..9f95d02 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_28.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_41 attr_10="kvopy">do<element_100>"nwfow<element_42 attr_6="elbiiaoiro" attr_5="rbpg">bhgyely<element_79 attr_6="muqmrlb">x""'"smysyn m</element_79><element_93 attr_6="bglbmdddnjm ">uggv"&gif</element_93><element_87 attr_9="e wducdpu">quiqlzauck</element_87></element_42></element_100><element_16 attr_6="slllfo"><element_42 attr_5="abzrthozk xc">masndfzmb&ljwnt<element_64> prllj></element_64><element_26 attr_2="kkrcnjdzcblk">kgp</element_26><element_30 attr_9="gyfdkaihpw" attr_5="vqu mxor">mzy<bzyrh<e</element_30></element_42></element_16><element_37 attr_8="wrojllmvps">'dzxi oi'mcfc>hakj<element_48 attr_8="gl" attr_2="">nj'<element_88 attr_8="xqswggco">pumxt</element_88><element_82>m &ze qo"</element_82><element_72>u dm rp "ki'g>a<gxc</element_72></element_48><element_36 attr_4="rcgbssiuql y">lex cyx&gr <element_41 attr_9="fy">"bw</element_41></element_36></element_37></element_41> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_29.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_29.xml new file mode 100644 index 0000000..157aba7 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_29.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_50 attr_3="iagvtkefidji" attr_9="">> o<io" zf</element_50> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_3.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_3.xml new file mode 100644 index 0000000..0c2698c --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_3.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_54 attr_9="ihhzleerrjy" attr_4="akkfifecs">fchxp<element_84>rl a onrmop>pexxh'q></element_84><element_100>td "jpwphx'b<element_52 attr_4="i" attr_10="xb o"> kv<dm"fz<element_14 attr_1="exwrlis" attr_8="bykeqd"> dk</element_14></element_52></element_100><element_48 attr_10=" dlwc" attr_7="elvrpsntlk"> t&ffy>rem>cdjhar&g<element_76 attr_4="wtt" attr_1="xvvomzqnlfadcv"><>>qz<rsxfau<element_70 attr_2="frllnjfwp "><wend'bu</element_70><element_52 attr_8="boe" attr_4="k">femwqhiecnkkpxugnw</element_52><element_16 /></element_76></element_48></element_54> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_30.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_30.xml new file mode 100644 index 0000000..d1798bc --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_30.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_71>&kvp'siy</element_71> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_31.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_31.xml new file mode 100644 index 0000000..2dbcc95 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_31.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_34 attr_6="gnfr qudfh bs">b'b'uaidftg&y</element_34> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_32.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_32.xml new file mode 100644 index 0000000..5f49b50 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_32.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_39 attr_4="oukarupcjvpiroh">oj'v fue</element_39> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_33.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_33.xml new file mode 100644 index 0000000..a6c94d5 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_33.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_96 attr_2="mgko"><element_91 attr_7="">&fmsyqjuko>imobmuluc<element_46 attr_7="">nghuenvwian<element_85>a"<>drm<lqlxgveiy"h</element_85><element_30 attr_7="xdadh">r&z>jgig</element_30></element_46><element_85 attr_5="e" attr_1="bggrypmiocnxwiw">dn<element_75 attr_5="yscxqsg">xv&pdd &n</element_75></element_85><element_90 attr_4="xbjmh">ei&&<element_30>dzrulihqclo fg<ey</element_30></element_90></element_91><element_88 attr_6="icfegyd ">ew pl"of</element_88><element_17 attr_4="a">e<uz c&cwv'yz<element_79>'hwfkoises"zhxe<element_28 attr_4="wavbvykvim pcn" attr_6="okdvrf ssrrfkmv">albz</element_28><element_86 attr_5="rpc"> </element_86></element_79><element_44 attr_2="fklyz" attr_10="hhusbyheld">qmmvjy&</element_44><element_95>'"z"cc>fpsx pdf"m<element_8 attr_6="" attr_5=""> j>&"<d"uf </element_8></element_95></element_17></element_96> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_34.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_34.xml new file mode 100644 index 0000000..2254524 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_34.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_96 attr_7="">uswy jb v'c"<element_36 attr_5="a wkgrq" attr_3="ud"><eb'vdyof'lfe">gxcbv<element_95>lkv"milj<element_82>r yz>o<yc <o</element_82><element_85>lqy</element_85></element_95></element_36><element_18>qg<d<element_29>ylulgo<element_4>llmuygtb>s"</element_4><element_23 attr_7="sq">whb>aitumo</element_23><element_66>ozse"rkj</element_66></element_29></element_18><element_39>ehf<element_46>mdibb</element_46><element_75>'wiccxfz v&uxe<element_34>vvd </element_34><element_25 attr_3="pky" attr_8="m">>></element_25><element_12 attr_8="bivk lmaorxy" attr_5="ebwmyu">ynnw ezyo"r<<uubg</element_12></element_75></element_39></element_96> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_35.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_35.xml new file mode 100644 index 0000000..79a4e08 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_35.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_35>aa kvd<element_97 attr_4="jxbtwiwvh"><k i>zeeb<element_65>>jqrsquxw>hz</element_65></element_97><element_41 attr_5="cwayel ">sb hucutpon</element_41></element_35> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_36.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_36.xml new file mode 100644 index 0000000..e8ef847 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_36.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_73 attr_1="flgtwws" attr_4="es"><element_38>h<hurnl<element_23 attr_7="yexngxtfiqh" attr_8="ln"> d'fczepj "wuc&a</element_23><element_16 attr_9="ud">kiwervqw</element_16><element_77> eu<element_80 attr_2="hzixcx hmj rzph" attr_9="xzib">zqfmw</element_80><element_57>thcx</element_57><element_78 attr_5="leojt"> qq</element_78></element_77></element_38><element_2 attr_10="pz" attr_1="und">neealnjod>lq<tbjhzs<element_94 attr_10="tjupexzn">wkq v<element_100>&r ueh nhygzdmlbm</element_100><element_20> u'&'giu&xkt</element_20></element_94></element_2></element_73> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_37.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_37.xml new file mode 100644 index 0000000..165856a --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_37.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_65 attr_6="dk">hdna<></element_65> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_38.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_38.xml new file mode 100644 index 0000000..e6e12d6 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_38.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_21>x'hq sczhgbo <element_74 attr_1="jflkiblzzcwgr">qnblmkxkrsb"</element_74></element_21> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_39.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_39.xml new file mode 100644 index 0000000..dd6e459 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_39.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_15 attr_8="vomjpacgdot" attr_4="lsixyoeqdcvqudd">osej >qvhg<element_24>i"'p' pnzk ffedq&b< <element_64 attr_2="sutyypenav">mwztnocm&fv<element_92>ervacrpv''cmzdda</element_92></element_64><element_86> gxwvn<a<element_1 attr_3="y xi">lju</element_1><element_53 attr_6="p">whwpfnk</element_53></element_86></element_24><element_3 attr_9="xeqxpvh " attr_1=" thycth">yuvl lza w>ac<element_9 attr_2="oumyctge" attr_10="innlrxajxftphd">hlmznq&p<element_58 attr_8="xvyhhwl">bmzt'tif</element_58><element_92 attr_7="qto ist" attr_10="sovif b">"qdrf</element_92><element_91 attr_6="gft" attr_7="hweayrlgpw">c<'</element_91></element_9><element_93>p>jxomm<rcz"</element_93><element_76 attr_9="dkzeehkfo">npu</element_76></element_3></element_15> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_4.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_4.xml new file mode 100644 index 0000000..738a770 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_4.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_91 attr_8="bzgpprwizzt">e'ymrwqhszdji<element_49 attr_5="cv">m'ofwl</element_49></element_91> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_40.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_40.xml new file mode 100644 index 0000000..c121ce5 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_40.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_99 attr_1="aqlobuvb">py'ytk<rb>gzcf">"b<o<element_35 attr_4="zyf">woyzy<element_92 attr_2="xcjpvl" attr_10="sgdzw">ogzs<element_68>mbexcugp</element_68><element_53 attr_10="hsjiaszlovma">pav</element_53><element_100>kdjk</element_100></element_92><element_97>"<rrny>cefl"ru<<element_34 attr_10="ls rryxuc">ipuu<u&q&&z qs</element_34><element_39 attr_5="zebleiizrzx">q<okq"ocajxyltdk"k></element_39></element_97><element_67 attr_7="utkjji" attr_9="xwxw">iqm<vbyjyxk'"yh<element_21 attr_10="brgmtvniuwa">fo"osohykaj</element_21></element_67></element_35></element_99> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_41.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_41.xml new file mode 100644 index 0000000..0f1a05d --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_41.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_75 attr_9="ovbgw" attr_10="fywqhacwcqmimgn">f>ixu<element_50>p<aok">i xpjece<element_36 attr_6="gcswmp" attr_2="">ara<slrsf c<s</element_36><element_57>fp<dmu>f</element_57><element_9 attr_9="qhezpytutp">jpj<'"<element_73 attr_3="bmehed">bjqi c</element_73><element_5 attr_8="bwlq ugngycughz">h myodju ql"sb<x </element_5></element_9></element_50><element_66>qv&plpe'msr's ah&st<element_99>i'mm<qu<pit"vkndi<element_61 attr_6="gbgsykpkylzrcpr" attr_7="cgid">p&>fxkec ftnrqcqfxs</element_61><element_15 attr_10="fuliyzc">ncmnihr&<zdn</element_15><element_55 attr_5="lib d" attr_7="qdzat">dv"bqprxwwhdr>imx></element_55></element_99><element_64>wfbex<element_52>'ovzis qjpu w</element_52><element_80 attr_2="luxkuqvglhysr" attr_3="nppmx icexxawp">&uhjiwqlipsel</element_80></element_64></element_66></element_75> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_42.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_42.xml new file mode 100644 index 0000000..e4e4b03 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_42.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_25 attr_9="oyrk mwwab" attr_3="ujucgcxeufo">a&uory"qghks<tgk<element_83 attr_4="mh" attr_1="cjoaw"> b"tlj'bsgfct rhf<element_56> va"&ztvd"i<rd<</element_56></element_83></element_25> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_43.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_43.xml new file mode 100644 index 0000000..52d4099 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_43.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_34 attr_4="mypwxde">ythm<element_34 attr_1="jp" attr_2="rautopc">vhyaax"ytvxaqkce&qu<element_75 attr_5="hqcsvmdlgd">obwxteb&dv<element_47>dzlql>advuikugc</element_47><element_36 attr_5="qjooykeekrx"> </element_36></element_75></element_34><element_97>pfftqqtaoy</element_97><element_3 attr_9="rolylyjqsafq" attr_8="joneg jxwgsqy">rtd tvqyw a gf c</element_3></element_34> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_44.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_44.xml new file mode 100644 index 0000000..223b0b5 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_44.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_66 attr_1=" " attr_10="g">pjgc<element_32 attr_3="ckpwqosahrycpc" attr_4="nvrgwdkamlhyfy">h"adloluaeqt qq<element_39 attr_4="mwbzaoqda" attr_6="u ce wumd"> yg&wj<rn'qror xm<"<element_56>map<mrjbyzjotk"c</element_56><element_50 attr_4="nqshdryugxsb">z deuh< fxo&lrpgm</element_50><element_56>v q</element_56></element_39><element_20>z<element_54 attr_8="rgeflrxublhcimp" attr_9="autlegaavt">>gm'f</element_54><element_73>&' nh</element_73></element_20><element_85 attr_2="njep basykauhcv"><msabowvu&gr ozvwn><element_83>lx<f</element_83><element_38>"ptgziceh"</element_38></element_85></element_32><element_10 attr_10="bffh">&yl&qx<element_54 attr_3="e" attr_9=""> u jn&'pknpiyqlchsa<<element_6>bimaxrwppemgec></element_6><element_97 attr_7="aytvovjobhgk">p</element_97><element_74 attr_5="yubtatxq">vbszfsjj</element_74></element_54><element_90 attr_8="xozwszb dw" attr_2="">qnurps<element_36>eqrvuvvw &mrumephd</element_36></element_90><element_51 attr_5="dbyupn g" attr_6="aratbb i"><element_37 attr_9="egrb" attr_5="vfwhibq ">igthz"sdm i"wgi"a&</element_37><element_55 attr_5="" attr_6="yjifsfypsgg">a</element_55></element_51></element_10><element_59 attr_4="nhkhqw">'ng"bhknhjzcn b<element_29>ocukgftg o&&<element_16 attr_5="grob twq" attr_10="jxudjzo">pjnwqufm</element_16><element_27 attr_5="taox iaoq" /></element_29></element_59></element_66> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_45.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_45.xml new file mode 100644 index 0000000..aa17205 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_45.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_34 attr_3="" attr_7="qvsxzeuw">f<ahj<element_17 attr_8="tscnq" attr_7="vapzkhiepr">n<pll&pmkf<element_92 attr_6="ajtcmo">wciyb<aco<l<element_6 attr_2="uqmbqizbrbl ">&b'"prcdhwf<albunv&i</element_6><element_64>id'ayx</element_64></element_92><element_18 attr_3="esygevurer" attr_4="au h q u"> q<element_89>gl"pjif &>y d</element_89></element_18></element_17></element_34> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_46.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_46.xml new file mode 100644 index 0000000..a3d5995 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_46.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_24>uk'pjoz"xvdipl&"</element_24> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_47.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_47.xml new file mode 100644 index 0000000..2fd8806 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_47.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_82 attr_7="ayl" attr_6="hfba osdswo">"zdomak'&"kmb</element_82> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_49.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_49.xml new file mode 100644 index 0000000..d768bae --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_49.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_27 attr_8="ehuuvuo">jh</element_27> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_5.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_5.xml new file mode 100644 index 0000000..b28f7ae --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_5.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_83>hwstg h<element_30>nklki c>axtyo<element_87 attr_9="rmdygxlzqrrkimx" attr_1="geij">nocxypbtm<element_32>vza</element_32><element_10 attr_4="gntpt fi thfdl" attr_5="ecstebclo">"as>'ua</element_10><element_63 attr_10="iv" attr_9=" bjhaoycggyhrd"> jffku&u</element_63></element_87><element_5> see<element_21>ji</element_21></element_5><element_43>p>'bh&svwg</element_43></element_30><element_10 attr_9="uifkmjxxdtgdnx">yp'z'u&vna&f"diy</element_10><element_30 attr_7="aplzcee" attr_10="rtnwskpcdjdl">g"hswq&kegkn&l&u&sxq<element_26 attr_5="sc ypv" attr_7="pwwsiodohabwpkq"> zdt>ripwsc bxka<element_9 attr_4="sskc">sd"hfzzpr</element_9><element_8>rce&hj</element_8><element_72 attr_7="ent">bfzbraga<&aqmd</element_72></element_26><element_58><element_75>v bhge vvdgd" e</element_75></element_58><element_76 attr_4="wn" attr_8=" vzntppidedxub">hlum<element_11>jis "n</element_11></element_76></element_30></element_83> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_50.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_50.xml new file mode 100644 index 0000000..7d9168f --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_50.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_7 attr_7="i"> qe"r">v<lbf sjd<element_64 attr_3="lmjmkqvetrvdowr" attr_6="ndhtpugtmt">cmsmk"c<element_11 attr_5="w" attr_9="paroznz">"eunk</element_11><element_70 attr_4="" attr_3="g ttnyrdaaj">"eur<element_67 attr_10="ksuzvbwdjq zkw">yr"oqkz"i</element_67></element_70></element_64><element_56 attr_6="naykroquozuw" attr_5="e">uj"xhwanojdcrglekm<element_98 attr_8="elzfoqyvtu">qte>qlb<element_17 attr_6="cigfamt">th bbp</element_17></element_98><element_5 attr_5="xiulxxrahv">ceue'e>pjhemeyrbxin<element_96 attr_2="ncaoiazsfjtxs">jiut"d & p<v</element_96><element_45>vlkz</element_45></element_5><element_99>xe<element_55> "xvysm</element_55><element_52 attr_1="nssdhvux" attr_7=" aidhs">rncwtg</element_52><element_35> >"etu</element_35></element_99></element_56></element_7> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_51.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_51.xml new file mode 100644 index 0000000..c3e3e8e --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_51.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_96 attr_4="medkjfdaw" attr_6="glyj">>ahiwpu&"hzkqre >arm</element_96> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_52.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_52.xml new file mode 100644 index 0000000..2070667 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_52.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_95 attr_9="wkcbjjsme ab xx">it"p'xbikxj</element_95> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_53.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_53.xml new file mode 100644 index 0000000..958628c --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_53.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_8 attr_4="keyhhqr">wd"wfcn</element_8> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_54.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_54.xml new file mode 100644 index 0000000..266e140 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_54.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_82 attr_1="mwbgdyxbjw">>hvuro az cnosjp"</element_82> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_55.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_55.xml new file mode 100644 index 0000000..5f7c820 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_55.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_61>vr>nqzmb"<element_62 attr_9="mgnhxykkyar hf" attr_1="ktwipn">nuungi></element_62><element_45>de 'p pjrw&sm<element_59> iake&i"enh<ep>aiug<<element_41 attr_1="" attr_7="ac">pqbfl>sl"xfxq<czo>rp</element_41></element_59><element_28 attr_9="mjxoztwawjjyuxn">kyx'e&ndw<element_75 attr_6=" lvnkodxcnpfs"> dubdr </element_75><element_73 attr_6="pniramgsy">fzlh </element_73></element_28></element_45></element_61> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_56.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_56.xml new file mode 100644 index 0000000..d231693 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_56.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_40 attr_6="bbpp" attr_1="rdkadsjxupgqoe">>d&lhhmqqks<element_92 attr_10="hyednas" attr_1="njr eokxd">gv j'zau<element_49 attr_4="ctnuu">ukvz"hpu>x<x&at"<element_50 attr_10="afggsfdopetcax">ej&" 'kfqs l"&c</element_50><element_43 attr_4="tyhwpdrmhajjqz" attr_2="gzzclxa">ca"wfakftmb'gvzrun</element_43><element_85 attr_10="r">ql >v'</element_85></element_49></element_92></element_40> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_57.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_57.xml new file mode 100644 index 0000000..47f2484 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_57.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_84 attr_5="r" attr_6="frm kgozhlbmlxw">o&vsfhnwbkm<k"<element_88 attr_5="efzyd">sw<element_55 attr_10="bjqepuo" attr_4="bcichrbfveacro">p ff> 'oz"x<element_27 attr_3="tsbhzknw"> rwahlmuv&vm</element_27><element_74>p<qimkq&eru& ix<e</element_74></element_55><element_46 attr_1="iewzq" attr_6=" xf"> v&<p &pygtd<element_6 attr_7="voin" attr_5="laajkh" /><element_28 attr_9="ypnodd" attr_1="gfyvdjfgzful">giun&p<&'"jz x</element_28></element_46></element_88><element_95 attr_7="f">k<element_63 attr_8="ygnyt">wtsyja<element_63 attr_1="xkbghkuhrfjtzud" attr_2="t"><uv<hrvlsc zuya>qjsv</element_63><element_94>jdl'oq</element_94></element_63><element_50 attr_10="gxdczxqmushp d ">h<element_54 attr_4="rf" attr_7="nr">efm"ha fbsmlpqlag</element_54></element_50><element_22 attr_5="avscajr" attr_9=" i ateohbf"><h <gkz'<i"nmfxj<element_96 attr_6="vd">nxoqb ye>sykco>n</element_96></element_22></element_95><element_41 attr_10="tnfl" attr_1=" diqjax">&v gpix"edj<element_48>z&<element_27 attr_6="adjz" attr_4="hxegouiv">usox</element_27></element_48><element_91 attr_5="">ytctwnwr<element_29>bro u></element_29><element_1 /><element_32 attr_4="iqhtzdsmxtoc">scn<'a</element_32></element_91><element_72 attr_10="phgtpliho iwr" attr_5="fajrnfrak">qhy<id<element_19>cyfl</element_19><element_19>qz</element_19><element_19>tmfqxns'vdu</element_19></element_72></element_41></element_84> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_58.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_58.xml new file mode 100644 index 0000000..ce214e2 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_58.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_74 attr_1="hghdnf ph w x">y'<emujnfrxhfhm o<element_2>jkyoud ""tdj<element_44 attr_6="" attr_8="wid jonubxf">dsizoej lz<element_84 attr_4="aolaeiboh" attr_5="hyjq ">o&e'rpvshrwjk&bjkw</element_84><element_91 attr_9="vrlwtjsruncaynt" attr_4="tkubi">l</element_91><element_31 attr_5="ipctxp">"&mbigsm n t</element_31></element_44></element_2><element_40>orhnx>ja>r</element_40></element_74> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_59.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_59.xml new file mode 100644 index 0000000..f49f0a5 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_59.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_89 attr_8="">irg<element_85 attr_8="wvy" attr_2="yhc wxl x">pu"zn'f">tpv dz<element_38>ykdzwp&nk& fhuixvk</element_38></element_85><element_47 attr_8="imqyezr xdupeh">btixw azh tk</element_47></element_89> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_6.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_6.xml new file mode 100644 index 0000000..73624da --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_6.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_3 attr_6="" attr_7="kmqyn">lpd</element_3> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_60.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_60.xml new file mode 100644 index 0000000..cec419e --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_60.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_90 attr_10="ptdfft">ujzzkpbdlwuiucf<element_34>imrnea"xc&hep</element_34><element_87 attr_4="ixplupfa" attr_5="rweutpc">pi>xyu<element_62 attr_4="kbbdlhafbgqsdh">qaux"g&qehshtybs<element_72 attr_10="fcadckpiql">vjmy'skfz"</element_72><element_83 attr_10="" attr_3="npmszcmikxlzzv">rvfuid"tf </element_83><element_84>eftuaw<bt v>wpy&zw>f</element_84></element_62><element_28 attr_1="r"> hse"<element_50 attr_3="tlmhqkypsg">wkdz&&pg&qv>uab</element_50><element_14>ogglaxseq&</element_14><element_52 attr_3="oplxgxo">>lcluhgalxdcfinmwvb</element_52></element_28></element_87><element_32>i<x >bk<nlwmrtmlwbd><element_99 attr_1="ele">m<element_77 attr_9="lrmhk hyybsk" attr_5="susufh">>>sgrllwi</element_77></element_99><element_72 attr_4="hyoe"> hbhaosrbrzq'wnb>jwi<element_22 attr_6="yplt">hn>v&</element_22></element_72></element_32></element_90> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_61.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_61.xml new file mode 100644 index 0000000..9f1a676 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_61.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_71>'h<element_69 attr_2="klv">ddwb<element_21 attr_7="prmnlk" attr_1="xyzgo"><element_84 attr_1="qzbo" attr_2="uqqpwvi">tn u<zzpusm lut</element_84></element_21><element_17 attr_4="gducbf">uqt'm>'<element_65 attr_1="zeemwkxjrirz">z"py ag</element_65><element_35><i</element_35><element_25 attr_5="qgyljpfrnowgr w">ieiu</element_25></element_17><element_13 attr_6="zmkrwhzejosxzx" attr_9="izifbygde"><element_68 attr_5="ypwk mcqxo vn" attr_6="aamxvqnzok">c pgmzsnc</element_68></element_13></element_69></element_71> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_62.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_62.xml new file mode 100644 index 0000000..54b8366 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_62.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_73 attr_8=" lpbcuyazj">e &zh</element_73> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_63.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_63.xml new file mode 100644 index 0000000..4388b5c --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_63.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_18 attr_7="yigionb" attr_2="sptla">>qaxqwuotayxdagm>jpk<element_65 attr_8="cssx">frpcwbql wghe<<element_17>d&qq"s bou m'k>ny<element_48 attr_2="vvxr" attr_10="d zaxzsoguetsih">yoq oh"anz>aoquls</element_48><element_34 attr_5="w vglypijp">rbkoxosspvmg</element_34><element_58 attr_7="tpew qymdq">x v<>zvqgbqwb&h</element_58></element_17><element_81>y uipv'fgm"<element_34 attr_8="m qvkbgdodke" attr_6="uwgmm ">xawhwn"uvg"w</element_34><element_67 attr_4="mgofnd">xjzvbaz</element_67><element_13 attr_5="vzkbmlmhvcqxur">hrrl si>akyc</element_13></element_81></element_65></element_18> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_64.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_64.xml new file mode 100644 index 0000000..6c2dac5 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_64.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_98 attr_1="ri mkdmhafi"> qhv>rr"npy</element_98> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_65.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_65.xml new file mode 100644 index 0000000..2b02bd8 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_65.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_75>sityis&r></element_75> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_66.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_66.xml new file mode 100644 index 0000000..7ce3102 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_66.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_74 attr_9="mzxesyzpuflld">srkawr'<element_67 attr_4="bbwtn" attr_1="hz g">d xhs>v umy<element_40 /><element_3 attr_2="cvza" attr_7="zi ubuvuj">vewm <h <element_77 attr_4="q">prv& vhya"&kfebdrjo<</element_77><element_60 attr_6="" attr_4="puxauepctlco">a qpprt&czyzxsj</element_60></element_3></element_67></element_74> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_67.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_67.xml new file mode 100644 index 0000000..ae4cd9c --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_67.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_85 attr_2="mwr" attr_6="dyw">hzm''"me"y>xxk<element_5 attr_4="qdy">vc'vagptfwp h<element_13>cv<ng</element_13><element_14>n&</element_14></element_5></element_85> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_68.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_68.xml new file mode 100644 index 0000000..d96e190 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_68.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_39>fxlnw>'te 'dwi<element_97 attr_5="mqjliouibeam">rwhi'd&l<d<element_25 attr_3="m pe" attr_7="wkhtg jowania">x c<element_36 attr_2="zswphpkoqk" attr_7="zbopccrwyhmnoh">klf&r vbzittdwk "</element_36><element_85>gw> ovg"khnf</element_85><element_94 attr_8="wkof">hmhx ls<y'</element_94></element_25></element_97></element_39> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_69.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_69.xml new file mode 100644 index 0000000..4d825cf --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_69.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_60 attr_1="inlz" attr_7="zrlnl"> 't<element_85 attr_5="btnquf opzai">idexzju'efe</element_85><element_14 attr_3="sggxhmolgyljyp">o gl</element_14></element_60> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_7.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_7.xml new file mode 100644 index 0000000..9188568 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_7.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_39> tj'mvfm>&xs>ntqy ><element_14>" ogf<element_87 attr_8="sxfx cmiwl" attr_7="wipdtqsc">wypcrqo'x ufetmnq<element_45> cqz</element_45></element_87></element_14><element_37>"&<zq"h'wb>xrslxdv o</element_37><element_18><element_13 attr_4="httvftf" attr_5="pxlayar wv">jpbe n&ttqkadm dxtps<element_75> tp'bg</element_75><element_57 attr_10="vaulrxjydr vh">vgt'd&m</element_57><element_51 attr_4="guczpzifcxl">tzvsl>h"b qmfduywoh</element_51></element_13></element_18></element_39> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_70.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_70.xml new file mode 100644 index 0000000..d2bbb85 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_70.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_43>r</element_43> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_71.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_71.xml new file mode 100644 index 0000000..fd57b20 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_71.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_62 attr_8="zauatd dee ">rgdbaohbup'"acje"wb</element_62> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_72.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_72.xml new file mode 100644 index 0000000..a9e2c81 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_72.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_9 attr_1="foapwgo" attr_7="smt yy"> ykzoxgz s'rzn<element_67 attr_6="trfsrpdie" attr_10="yusmqelewpf">yb<</element_67><element_30>ci u ppvii<element_30>wq' n"aaqblty siyy<element_67>cv&& sunsfet"itwi</element_67><element_99>u</element_99><element_92>"fg anqc</element_92></element_30><element_22 attr_7="">>j s&sghu </element_22></element_30><element_68 attr_9="kchjahavl">k"kd"xmv>es" <element_40 attr_9="jcxbqj szqhbmh" attr_6="gfz">e>srbu<' &wo>kk</element_40></element_68></element_9> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_73.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_73.xml new file mode 100644 index 0000000..c6c70f8 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_73.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_8 attr_6="yyj yyqw">"ve">zzq'u<element_47 attr_2="izjpd">rdt</element_47></element_8> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_74.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_74.xml new file mode 100644 index 0000000..6cd2ce0 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_74.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_90 attr_7="icyyx"><zqoyscmzpwlip vdluc</element_90> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_75.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_75.xml new file mode 100644 index 0000000..6c1c9b2 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_75.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_83>wgsxdg&><element_22> c uwyam uo</element_22><element_26>hgfkqinbptvx<element_83 attr_6=" ktbcqmsgon izk" attr_9="zxqsa" /></element_26><element_1 attr_8="nqiuolnsuu">qar'<element_11> ovatvqg"ibnoucoe<element_78 /><element_99>caf'ejyhgpwxgmrct</element_99><element_79 attr_1="xmewvpufbx hmn">bgfs'mol zx '&a</element_79></element_11><element_55 attr_8="zmoghy" attr_10="srlgccdoktnxdzi">cqnmy<x </element_55><element_30>qaihhsd<y>j><element_77>f>m g</element_77><element_87 attr_6="jg">vx</element_87><element_57 attr_8="nnko" attr_9="">&toj<><"v ngiz"ai</element_57></element_30></element_1></element_83> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_76.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_76.xml new file mode 100644 index 0000000..391e26b --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_76.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_20>o<element_73>zhdx i<element_23 attr_7="ztiggg" attr_10="xmoxutw zck"> vyjg odz<element_52 attr_1="bmhdqwri" attr_4="w">inlts>zzo>ypubbb&h>b</element_52><element_29>zszx</element_29><element_69 attr_6="w">zolum>j</element_69></element_23></element_73></element_20> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_77.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_77.xml new file mode 100644 index 0000000..f9db24b --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_77.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_22 attr_7="pgbcw kn" attr_9="easg uykdxddk">uc<element_98>"mmvso bislh "jyimq<element_71 attr_7="ut hzebps"> eh<element_54>uq<b"dayqgjmb& hs"ac</element_54></element_71><element_21 attr_10="zunoxei" attr_2="qzlzxiidcu">vae <element_36>usdtlnwz iuru"s</element_36><element_80 attr_6="yyyepawc">iaqiemwpopoeky mwgz</element_80></element_21><element_12>udrnwedpqaiftdxmyllz<element_70 attr_6="ok" attr_7="ratuwmvdcapqxm">cr"</element_70><element_10 attr_4="xlqocrtifntik">qk "jm</element_10></element_12></element_98></element_22> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_78.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_78.xml new file mode 100644 index 0000000..eacf2c8 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_78.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_1 attr_2="tjgsf ji" attr_1="gsmddpecmym">rqaznkp m sm '&dkur</element_1> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_79.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_79.xml new file mode 100644 index 0000000..d5028fa --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_79.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_68 attr_9="mxgmuqcfmsymvb">hdmyqgs<element_45>roitnwq" gehzyo</element_45><element_66>v mmsxbpnu>beyzq<element_32 attr_9="qpnyelugral" attr_7="pwubtfnpd qmx">bmlstoo>azawuq</element_32></element_66></element_68> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_8.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_8.xml new file mode 100644 index 0000000..3ad22b2 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_8.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_98>hxsbx&grrobr xh my<element_81 attr_2=" gzysappqogek">y</element_81><element_53 attr_6="gpcswwkqso" attr_9="rtw">pqgnswj<oorh'qi llyj</element_53><element_60 attr_4="oswehnrtessu">wc<</element_60></element_98> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_80.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_80.xml new file mode 100644 index 0000000..54078a6 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_80.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_3 attr_10="ifx ikrlkxlbcc" attr_8="ahucbduon">neoc mwd"</element_3> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_81.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_81.xml new file mode 100644 index 0000000..522443c --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_81.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_50 attr_6="iba">hjhw>rj<element_83>yqnnwavkr</element_83><element_18 attr_8="i r" attr_7="vqfgcw">whq<element_22 attr_4="" attr_10="jreszogsfxajxd">me &'hwb<element_14 attr_2="bubqijuzjbe" attr_5="jisrlkwut">okuy</element_14></element_22></element_18><element_70 attr_6="babshwiworem">kk>z<element_38 attr_6="fcvhmjah">qf<element_43 attr_7="ihfwcqoebbcz" attr_3="tq">umsi 'jlgows"j</element_43><element_64 attr_6="ok" attr_10="tfrovraufpcn">ay</element_64></element_38><element_98 attr_9="rxtgb tzkercg">uj onezfvdyzi'b<element_83 attr_7="fkudrnyg">zq"z&vwtued euo</element_83></element_98></element_70></element_50> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_82.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_82.xml new file mode 100644 index 0000000..1a1cf38 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_82.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_22>thsue</element_22> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_83.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_83.xml new file mode 100644 index 0000000..5b83f28 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_83.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_4 attr_4="psmsvifvcbzmnik" attr_7="">'v"og i sa"bsu<element_36 attr_5="szebafutwbyna " attr_9="omk">bg'ag&tvtjafe<zuu</element_36><element_88 attr_4="g" attr_1="pfssvmshkbukjes">fn<>'joy<element_10>vw <element_49 attr_10="fxhbcsk">ijstol"</element_49><element_44>i<ynk"k"</element_44><element_83 attr_8="ahaw" attr_4="yxdnrcg nus">k uy dk>l </element_83></element_10><element_66 attr_8="uvo" attr_3="i vjow">zwvuvi'fuxzl"<element_42 attr_8="pizo"><h>>xjy</element_42><element_24>kzrrhh"g<</element_24></element_66></element_88><element_11 attr_3="ugvf" attr_4="yerfhtk">hfbu<element_18>"g'aald"fbz<&g"ceob<element_26 attr_3="nbpjwcmt" attr_7="ecbrwsnupnz">ml'o'mq</element_26><element_71 attr_2="lefwtjcgthq">zbw></element_71><element_2>famxoblnsf s'</element_2></element_18><element_50 attr_8="xlurp egt z g">w<element_92 attr_6="bldt" attr_9="flgrodnxccz">fmr</element_92></element_50></element_11></element_4> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_84.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_84.xml new file mode 100644 index 0000000..6651324 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_84.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_87>c<element_99>wq& qa'hps aked <element_23 attr_9="szuvzgyurlan" attr_4="">j>a<element_67 attr_5="wbl" attr_1="cdgk uzhzct">cctjaq</element_67></element_23><element_67>t&c<element_67 attr_10="vheiwknjpjn" attr_3="nwvoczwol b pwu" /></element_67><element_71>eftwujqic>k'rbmi<element_23 attr_3="hiscfsp" attr_7="h ffzpihvezpisz">gqnlfxaqsvrtvwp</element_23></element_71></element_99></element_87> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_85.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_85.xml new file mode 100644 index 0000000..c72fa4c --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_85.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_38>t<tv"kt'rgni</element_38> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_86.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_86.xml new file mode 100644 index 0000000..c30b9da --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_86.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_67 attr_10="cvtkpplhhjm" attr_1="">oxl > 'a<z&ozbct<ht</element_67> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_87.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_87.xml new file mode 100644 index 0000000..2bb4433 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_87.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_92 attr_9="">q<mtrccxwrpi<element_87>jbidr lyiosws pktf</element_87><element_14>fmurop"sisp<element_4 attr_5="asqliccjzud">wom<k engbwll&e <element_39 attr_3="nawzitjtooqofm" attr_10="bsnxk">zzstx r x"r'ku"too</element_39></element_4><element_79 attr_10="" attr_5="kklxathlxsijmu">y k>h<p>x" u<element_52 attr_8="jcbgzhkbu" /><element_97 attr_9="qweligunszu" attr_4="krsmabhiyvwpine">s'fpgnjot>gfe </element_97></element_79></element_14><element_99 attr_2="omdrrwc yyw" attr_9="kfpoilkmn">dv&"ahlvst<>xaiu<element_53 attr_1="jqkuozeiueveo" attr_4="yduc nj">"vd"xbi&h<element_28> <qcoi pheg</element_28><element_50 attr_3="rkqa" attr_5="yhhtisfbyq">h</element_50><element_30>"w<</element_30></element_53><element_91 attr_1="kmyyq">lodxlzy&"w vn<element_94 attr_4="qztbml ">s g xr<rdjwqlwey&fgr</element_94></element_91><element_57>bq<element_55 attr_5="diobjuqiyilog" attr_3="yebjdk pcpfldk">tu'l<</element_55><element_84 attr_5="rz" attr_6="r">e</element_84></element_57></element_99></element_92> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_88.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_88.xml new file mode 100644 index 0000000..98d7cec --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_88.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_45 attr_4="elcemdhxugckki" attr_6=" vfynaul">>u>g<element_57>t<element_5 attr_5="xvdftfoc">gw'xlwu aib xrjqd</element_5></element_57><element_52 attr_9="iqpjeqg"> vlhuk lui"nayg><element_84 attr_5="myzvnqlcsrj">'f<element_27 attr_1="dbdwlgersancbdr" attr_7="ornkgkkycici"> lohlzw&ix az</element_27><element_72 attr_5="">nlbpqsruz'ku</element_72></element_84><element_53>xjnzmi<rdw"vsvl&<element_20>srk>r<ocwvroz&fx</element_20><element_80 attr_4="emceljpsym" attr_8="">ohur"i' </element_80><element_77 attr_1="pzxocmc asglgi">hgz vnqtu</element_77></element_53></element_52><element_39 attr_8="umbh">hy nlrjocyxdj<element_22 attr_1="lfjsbleqptdzmoo">glr'gm'>uwibxh"xcz<element_77 attr_3="hgnhjltcyvxkxs">q</element_77><element_56>fyefeglo<d'eeberv</element_56><element_52 attr_3="nkwltekiqnc" attr_4="e">pb rmn p</element_52></element_22><element_73>fhdg mo<element_73 attr_2="zyjzwemtnvcbxia">"buuyk>j'>m</element_73><element_22 attr_3="bs">k uyu</element_22><element_6 attr_7="qux">>'nhywb nt"</element_6></element_73><element_48 attr_1="gzq" attr_2="ivdbcquwdsqq">gfqa&jx"<element_49><m&a<m</element_49><element_38 attr_8="j nla">& you</element_38></element_48></element_39></element_45> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_89.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_89.xml new file mode 100644 index 0000000..456a04e --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_89.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_39>g"bo&lokh<n&g&y</element_39> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_9.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_9.xml new file mode 100644 index 0000000..ae6335b --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_9.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_13 attr_1="hs">ulazdmu f<element_5>uh< jinkcmshd<element_80 attr_3="drlwlblsj tqkvc" attr_10="jq hzf gkl ap">keqor j<element_30 attr_7="mojoutyu" attr_8=" eraek">mc' </element_30><element_46>nz qcul</element_46></element_80><element_65>zf<mwcyvofyo&h<element_52>mgdoiy"</element_52><element_65 attr_1="skzu">h"dksiikige">onqfoox</element_65><element_13 attr_9="moj" attr_5="x"><'pg<pug< </element_13></element_65><element_20>uyzxauoy<fhnjvez'dl<element_91 attr_2="wwnb">tdqm<agapavurs</element_91></element_20></element_5><element_9 attr_9="gatxn">"z gujx<okpyssgw'j"<element_88>>zh&<element_27>'l></element_27></element_88><element_99>pdjbvod><element_11 attr_7="p">k&tdwdjpkt </element_11><element_79>dwzwaszi&ncn"bhyys'w</element_79><element_97>fdae</element_97></element_99><element_93>m&>je</element_93></element_9><element_53 attr_6="fas">qifms"nbbwndgjvzxg<element_62 attr_1="ltf">ma<element_66 attr_10="lqozrwgpbtt">b qhc</element_66><element_92 attr_7="sdecuo">t</element_92></element_62></element_53></element_13> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_90.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_90.xml new file mode 100644 index 0000000..38c7cdb --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_90.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_8 attr_10="lkmnjhjwowrc">wqt zy><element_79 attr_7="kpn">zxlsguuknz'e<fzted&<element_39 attr_5="wiigecljixdc" attr_4="dh">hlk&gmie<element_44>&korivvslvg </element_44><element_8>p</element_8></element_39></element_79></element_8> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_91.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_91.xml new file mode 100644 index 0000000..a373736 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_91.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_91 attr_3="xn">qone'ijnfgu euyzlwj"<element_21 attr_7="yjoztcsmuuu" attr_8="dfu">omuatrtje<vyeic "</element_21><element_89 attr_8="xc"><o'jijqwjaksg</element_89></element_91> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_92.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_92.xml new file mode 100644 index 0000000..b86eb74 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_92.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_84 attr_8="g">cfy"fbaabmx<w"mtf<element_51><<<element_72 attr_4="dkgitd">t d<element_62>v"s"d& &u<bz>g&<a</element_62></element_72></element_51><element_91>xfvee>buoqvufs>bi<element_42>ow&gnuo<<element_59 attr_7="kntq" attr_1="in">i&g</element_59><element_91 attr_2="piuuyjgwppift">xjccr&agj mz</element_91></element_42><element_33 attr_7="d wlfdrkaeyo" attr_1="ytpczye l">"aglzr pnv<element_42 attr_8="dwlysngwe vb" attr_6="gaew"> </element_42><element_92>chtinmvbe>e></element_92><element_1 attr_8=" lwe" attr_9="lgeyvyali">etvisekodq df vql&t</element_1></element_33></element_91></element_84> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_93.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_93.xml new file mode 100644 index 0000000..b01299c --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_93.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_69 attr_9="bcvcf">huhuc&ubotqq az</element_69> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_94.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_94.xml new file mode 100644 index 0000000..e389b71 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_94.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_91>gtmlzjufp"rc<element_16>gsbioxp tw<element_13 attr_3="oqqlodzlqylpynr"> okrqjvvzgfi&<p<element_75>&bbvrszaf p<uz f'</element_75></element_13></element_16></element_91> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_95.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_95.xml new file mode 100644 index 0000000..33eaae3 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_95.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_96>k'dp"bg</element_96> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_96.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_96.xml new file mode 100644 index 0000000..f2f79f4 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_96.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_92 attr_9="ubzmcdrgbzwi" attr_2="o">yparf jt<element_38 attr_9="lkw">&ldyudr<kezbk>w<element_63 attr_6="fo" attr_2="gjh">cnug& > j<injsbvdz</element_63></element_38><element_47 attr_2="fam" attr_7="ij dy">sdl'"r<><element_65 attr_5="xsqkihbmk" attr_10="wvcdokrpqlycshi">syze'nikpswlngwpfx'<element_70 attr_1="w">u'mnn </element_70></element_65><element_41 attr_6="iocxwmnyulsbgfy">mqbradf<element_58 attr_3=""> ubk'jypb>aue<ixdl</element_58></element_41></element_47><element_83>ie&>q"&tspn><element_22 attr_7="igwhlbetixjyva" attr_5="ha">pr'phbkrmyezo<vb<element_39>"if"w>ueb'wgigbqt&</element_39><element_27 attr_2="oyicnmi" attr_9="kzyn ">jpsjr&vx</element_27></element_22><element_51>mxvi><hce&szt&<element_45 attr_1="hx" attr_10="okk ulzbq">pyeb<u"m&</element_45><element_1 attr_1="df">wv</element_1></element_51><element_56 attr_1="wbvlfpf">ggmjby</element_56></element_83></element_92> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_97.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_97.xml new file mode 100644 index 0000000..ea5fd4b --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_97.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_8> 'veimdt</element_8> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_98.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_98.xml new file mode 100644 index 0000000..56a9a31 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_98.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_19 attr_1="uixqpljycytodde">yhxxx<element_15>f w&vy&janx wp'x<element_49 attr_5="aeyati ea pan">cdzvlcvvamjbqjvey<element_40 attr_3="lqxnze" attr_2="vjzbzpgxxhlxq">'ab</element_40></element_49></element_15><element_86 attr_9="wgonptwabletcuz">"<element_81 /><element_64 attr_4="earfalzv">yc><element_32 attr_8="udsigwviyotmp" attr_5="siwru"> x bl<i<'taz"</element_32></element_64><element_21>cvrvzv<element_7 attr_6=" jwgbygr">qoo arprv</element_7><element_27 attr_8="pa jgulzqrite ">t</element_27></element_21></element_86><element_48 attr_9="pas">pv>so<element_12><element_41 attr_6="wnknkvkpgxcsy">cgdtm t>wdbfil<</element_41><element_15>dm></element_15></element_12><element_33 attr_3="x ms ejuxxmkrcp">v>xppkzzjnwpd d</element_33><element_99 attr_2="">fksb<element_27 attr_7="" attr_1="tgrviuaksxlin">kuo<xdet >> rnmxva'</element_27><element_50>zh</element_50><element_71 attr_3="yqgidjx dxjou"> &jaflqjslmqh&tnr</element_71></element_99></element_48></element_19> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_99.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_99.xml new file mode 100644 index 0000000..37b8e7a --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/sample_99.xml
@@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='utf-8'?> +<element_84 attr_10="spshwhoadt">gjnuk&d<element_43>gh>b<>wexwcp<element_52 attr_3="sap nw">gynhqav<element_8>rzygddwur&kd n</element_8><element_1>iwmlyryknr></element_1><element_72>wxrry</element_72></element_52><element_84 attr_8="">i"ocpjzz&nyrs>x't<element_92>co poz l"dqxyv</element_92><element_5>i"r<hcpf<j qo >y'</element_5><element_19>gab</element_19></element_84></element_43><element_76 attr_4="prfkfvev" attr_6=" wd">imvq<tclvf</element_76><element_68 attr_8=" s">eyi>jib<zxnieo s'<<element_17 attr_1="jalxuxwpgfw" attr_2="hpgsernpx">p</element_17></element_68></element_84> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_0.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_0.xml new file mode 100644 index 0000000..b49fb3f --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_0.xml
@@ -0,0 +1 @@ +<Sc7 7b="Fizi">NSOHZiNp<rC Ge8="404EPFfR21" j3c="Og4k0pa7g" JXPi="2">JdyMuQly0M7op0ws<LwmUg4 h="Ri">O4uj3tj2dg6Cw<C dOpT="M7gjok3d9a" pHd0T="LtxzWQ">B</C></LwmUg4><gOmxWpMk qgag="GFdO">Nrf3htt7BPr<8pwpkM >D</8pwpkM></gOmxWpMk></rC></Sc7> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_1.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_1.xml new file mode 100644 index 0000000..89ae0ed --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_1.xml
@@ -0,0 +1 @@ +<lo6r xz4Q="FFQCl" fT="j9wAG9stC" JWp="52ofd0UN3">OOIqHIRsVYy</lo6r> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_10.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_10.xml new file mode 100644 index 0000000..562a8fd --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_10.xml
@@ -0,0 +1 @@ +<X u7RP4="X" kH="zy">Q6QgrewmnjmSShkD<E zcgyY="vLG">W5gj4BPhkbNyIis4<sdrR2mcRxL >HbgNQzSjvVusKJBpr<7yVFvHFt ogz0B="141R" UtF7L="3Fz3LC9o">Yx6lg</7yVFvHFt><ha rA="I3y2Q8c0y" p="NpS1e">xcyhKT31</ha></sdrR2mcRxL></E><sgfH8EIPEw 7="BTW" q0SoD="fcuRJ1Bew">3um3eUjQ7k1t</sgfH8EIPEw></X> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_11.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_11.xml new file mode 100644 index 0000000..75b29a2 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_11.xml
@@ -0,0 +1 @@ +<yJl4t >jO<5cdAcT LZW="Gm73eABG" q="OzHhvV" I8r7="hZdqpHt9">0OCBdKO6DZ<MIdnlcoJx >Wb9</MIdnlcoJx><PBys >H0N0C14bE<kmrAm8ZT >2cuekkyyUQSokF3p6ANk</kmrAm8ZT><l6JtZ6J feGG5="wb1B" RzWjZ="kIWR">8zq2nLZRgKN9dgNHzsvP</l6JtZ6J></PBys></5cdAcT></yJl4t> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_12.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_12.xml new file mode 100644 index 0000000..20a7feb --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_12.xml
@@ -0,0 +1 @@ +<mdovaQ wv="J4m0w" MyYq="5iGugh7p5">y5</mdovaQ> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_13.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_13.xml new file mode 100644 index 0000000..fbfed9f --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_13.xml
@@ -0,0 +1 @@ +<Gq >MCazu9kD1PFmY</Gq> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_14.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_14.xml new file mode 100644 index 0000000..05a6bbc --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_14.xml
@@ -0,0 +1 @@ +<Fhh87V4UU6 DMY1="Bl6Z2A" 24="fmFY8lm">wqXGjMnPi9<U8lwgMHN5X lvo="3" t="sxYUPQdGao" pT="7TguOb">jSX<Inx7tK2HU SeeZj="T0O" GQ6="ZF8kIUDDTa" C4D="al">vqHE24Pb1rwqG7x0ki</Inx7tK2HU></U8lwgMHN5X><lX7kVNuodd >f2d18mmQWLxdJHMpuATz</lX7kVNuodd></Fhh87V4UU6> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_15.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_15.xml new file mode 100644 index 0000000..8e6ce26 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_15.xml
@@ -0,0 +1 @@ +<EUFh7bxo5M ><MMXOy Rx2g="iOVwBub" Nx93="IAl" fF="ilDYyE65">6QnO4l1vmFi<jksY GsNt="zx">gJO60Ei3otMuOwgArpk<KRlW VX="c">MiE5BZQpBoVdRxGE4o</KRlW></jksY></MMXOy><RoCe q="mPk9v0Y" elzr="DX" BzOG5="4PFnhJqz6R">7YyUE<1q >11OdCrzUhVU3f<efz E="CD" S="K" z="cE">lcTSAzfxDt7myvCSL</efz></1q></RoCe></EUFh7bxo5M> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_16.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_16.xml new file mode 100644 index 0000000..1f2b503 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_16.xml
@@ -0,0 +1 @@ +<iwBI xU="9FF88Z">fpioM3<vSB5j >t<HGkFk7QC6C E4tmd="tixV">GAdv</HGkFk7QC6C></vSB5j><UEye3Ps hi9="ifOptya" K="AoOZ">Vm4VGWO5cMq<zTji5V GG0="6PLRk4kbC" Nv4M="pchO" Nwiut="z6gjZ2v7B">oAJvUSmcq</zTji5V></UEye3Ps></iwBI> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_17.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_17.xml new file mode 100644 index 0000000..e456f50 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_17.xml
@@ -0,0 +1 @@ +<SBYI7 a0TT="KVwv" 6="Ql1makozF">jIM<VN3d6Tt Rm="tPNqMRWm9M">aGnfa</VN3d6Tt><FmReCjQg dW="gWNd" R1="sLF1" sz0Z="nqeyv"></FmReCjQg></SBYI7> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_18.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_18.xml new file mode 100644 index 0000000..9d09795 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_18.xml
@@ -0,0 +1 @@ +<a gpCpN="ieU" GP0T="HX">iUTZ0E</a> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_19.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_19.xml new file mode 100644 index 0000000..78ccd01 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_19.xml
@@ -0,0 +1 @@ +<rAssDfCm UVPpD="jz9YJ1GA" Gx="rI" 2zOk="dsdgdu">97C9bGNTKgFg</rAssDfCm> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_2.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_2.xml new file mode 100644 index 0000000..cd4840a --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_2.xml
@@ -0,0 +1 @@ +<vPAVqnC7 >bLXPpOc</vPAVqnC7> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_20.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_20.xml new file mode 100644 index 0000000..d798373 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_20.xml
@@ -0,0 +1 @@ +<gdZ xQ="mSJfZ">vydoV7bwJ</gdZ> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_21.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_21.xml new file mode 100644 index 0000000..0382219 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_21.xml
@@ -0,0 +1 @@ +<yNW5c >XD8ndawKBf9R</yNW5c> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_22.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_22.xml new file mode 100644 index 0000000..ac5056c --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_22.xml
@@ -0,0 +1 @@ +<rPsC k90="QaqoBT">UdzpOKfaURgj6pHsAu</rPsC> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_23.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_23.xml new file mode 100644 index 0000000..7ec723d --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_23.xml
@@ -0,0 +1 @@ +<wDgJxkGE Qf5="ghdFCw" G7="IXkbc8">rkk8ug</wDgJxkGE> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_24.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_24.xml new file mode 100644 index 0000000..118030d --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_24.xml
@@ -0,0 +1 @@ +<8RqYt3Ele4 n="2xZX1wUmAg" I="94iv">wyCwimtFiTGOmkA42I<U XA3GK="q8yl" TNnr="JrowHw">vpoIulvHutCl4O3FPpRr<p >YOmCFSM</p><dYvx6RIA TSaly="92X">HWlP<WPzQ3v9x rVGEI="mk" vU="PiqJOLj" LW="Vpxlx9ANCk">MIpH</WPzQ3v9x></dYvx6RIA></U><NaavpHn3q jdUU="7gX0Qxz">tGIIiqsYN1OGWHb</NaavpHn3q></8RqYt3Ele4> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_25.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_25.xml new file mode 100644 index 0000000..c595339 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_25.xml
@@ -0,0 +1 @@ +<Yj xhyW5="TIY5lH" G="iiD"><ToxOJpr j="1hPsNpv0UB" zm="DkNuEbAG" Sz="F5p1">IGC29rnLI<hpY2 2MYXP="SDDiY" 3="Cs">jVn</hpY2></ToxOJpr></Yj> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_26.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_26.xml new file mode 100644 index 0000000..9e97ac2 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_26.xml
@@ -0,0 +1 @@ +<67J a2pGs="ECQpmzg" iJQl="ovVVS" cR="lRQicNKhG">n6Agxe50MaYTNgoD38r</67J> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_27.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_27.xml new file mode 100644 index 0000000..68d4e84 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_27.xml
@@ -0,0 +1 @@ +<Kr 7Pu="6" eSYF="aRSa" ov="512lm">ClHnpvI2GnMEUR<IRttSP oFK1P="2Rmf4" XS="LKl">5NpRzpUQhr9zaCq</IRttSP></Kr> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_28.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_28.xml new file mode 100644 index 0000000..fbb51e4 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_28.xml
@@ -0,0 +1 @@ +<u nMjiu="HEJTmR" dRaWp="1">OKdztHyd3AqnoFFQEx<TGLIq XLAW="pfjph" Re8k="v7BqPUE" 1b3="eoxi">R4zFzNZvZO</TGLIq><fEn0452NU zHk="hrmjMO">9WSY9WQHSscNskRNdy<6Eur 5m="FK" wphM="Fr" gYq="vNye3rZDf">aa0W<52Iwgd8fKv o="1">nFgjRS6zPEO</52Iwgd8fKv><VYV >stSjkeQ2K</VYV></6Eur></fEn0452NU></u> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_29.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_29.xml new file mode 100644 index 0000000..11c4794 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_29.xml
@@ -0,0 +1 @@ +<r zzM6R="L">0bV<4 T6="8BtkY7" dsK="Qq1It" lra="aOdpdQQ3">paKrJVIL8oArw6P2<m27tk FUyeE="da">dT8OnYGyQvPO<Lb FugD="fimAO" cz="maB" oU="l6H">V1hoOPoE</Lb></m27tk></4></r> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_3.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_3.xml new file mode 100644 index 0000000..0b9f4a1 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_3.xml
@@ -0,0 +1 @@ +<ZgJMmZ v6="DY8L0C">4ig3KCvSKEj6t04zY0y<2 G="pa4yzIKH" v3v7="SZNMQv" yCrU="rZXmfm0Zj">GtHe4lajYsZO7o<OyH 4yZ="WKht8HdP" Y="uZ15nzquA" XW0I="kmxYNzR">61VMrJHfeWSVvMgiO<SFsw2BSlm YHZ="bUlWVSi">pKfBZM2MXQKHDGIia35</SFsw2BSlm><B >J</B></OyH><CJYGq4 t="gUZqi5d6G3" R="1ht3S">SudapwdxWCpX</CJYGq4></2><5 Ho="8mgAb" Qk="CnBQ6gSwW" V="BtU1qU">uAdMp98<HB >w0EN95Y0fc1</HB><CadrzDi >lLIzwyC0NYhb4kgY5</CadrzDi></5></ZgJMmZ> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_30.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_30.xml new file mode 100644 index 0000000..55cff4b --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_30.xml
@@ -0,0 +1 @@ +<v2dC23fSLt rYT="8U4" 5="NeRe" ip="b">xsOAkqS<nUjGb mk51="fyYpTH" 6="R" Tx49F="0i">3B6QUFi306fS<Vl >vSRQehBUMtndUM<F 0z="gMwvAVI" tp="99HMUL2E">G0bA0xF09L</F><pm0cFm0np3 vD="B" hGdO="eUCuUqA" NdXk="xbvt">J4K</pm0cFm0np3></Vl><9 >bFSt6Y69dKfb9eoG3y<E K="mrhjXmQo3">rYNYj0</E></9></nUjGb></v2dC23fSLt> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_31.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_31.xml new file mode 100644 index 0000000..38c7a7f --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_31.xml
@@ -0,0 +1 @@ +<sJ9VD3 EIauW="Y6h8M4nd" rgPl3="J4z8pzcpfn"><0LPIZez xEO="zz21wvgPz">9eD62WgZJJCcAWV</0LPIZez></sJ9VD3> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_32.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_32.xml new file mode 100644 index 0000000..4f8c6e1 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_32.xml
@@ -0,0 +1 @@ +<ZEBX Utyn="7umDyVnQBt" 8="DV" WV="6D6">mNGtYY7k5g2</ZEBX> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_33.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_33.xml new file mode 100644 index 0000000..82faf9c --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_33.xml
@@ -0,0 +1 @@ +<M mwk2F="qxd" DTL="v">TGi4Ietrmge<jSJ6hBwQqw 3Dtbe="ngI" f="qFBzcUC">55zVR<vYIdi JETd="Oy" G="dujHjE"><TcLSIU9E7b vqM="fSU">OMAzg</TcLSIU9E7b></vYIdi></jSJ6hBwQqw></M> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_34.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_34.xml new file mode 100644 index 0000000..81e3bd1 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_34.xml
@@ -0,0 +1 @@ +<ya >I<UgWt5p1TwX Y="h4O3NGnbGP" 7="V0">JUbw8DWgucWObPZVINli<FrjaSIYl >uJ7F0np1lOBHM1fLM4R<AnX0tqtwdo TsP="eYsZde94" WF="qI5EOc59vj">WVbUZpWJ34s</AnX0tqtwdo></FrjaSIYl><Cwo >NidKqdKXBHkdfBKIk<srjLCEA >p</srjLCEA><20 B5="av" P0MX="H3HyUckPw">SR1QhdJnSwaoJhsxX</20></Cwo></UgWt5p1TwX><cJDguMT Ytb="ChyglXL" 9hU="b">ras5jypXcWdG8NeLF8</cJDguMT></ya> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_35.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_35.xml new file mode 100644 index 0000000..612d751 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_35.xml
@@ -0,0 +1 @@ +<Jj0yK40 okSa="ck75zXM9B">iKz107rJ5</Jj0yK40> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_36.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_36.xml new file mode 100644 index 0000000..2a9e27f --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_36.xml
@@ -0,0 +1 @@ +<TK1ZY >LkNsaW</TK1ZY> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_37.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_37.xml new file mode 100644 index 0000000..3d95dc9 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_37.xml
@@ -0,0 +1 @@ +<GHpYEg n="8JMqPutB0" JTPf="zhe">g4J9CqKttfMLVqQJ<PyCf6 XF="B">o<zhQWlPLS KD="Izo" YQky="Znf9RCn1">7XkYnsEVnd3lBX<ys09N VOE="p" cMhfU="g">KYKaMRWKnd</ys09N></zhQWlPLS></PyCf6></GHpYEg> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_38.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_38.xml new file mode 100644 index 0000000..ba352d5 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_38.xml
@@ -0,0 +1 @@ +<491Vel p="m2YJ5npb" JML="Ox9QX">VCg8qFkwcR7lWj<POenJQ30r >TUxUcyl</POenJQ30r></491Vel> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_39.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_39.xml new file mode 100644 index 0000000..e9e856a --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_39.xml
@@ -0,0 +1 @@ +<AwpaIWoSK nb="DHJK" g="bMdAUKZsX">nrTj7juv</AwpaIWoSK> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_4.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_4.xml new file mode 100644 index 0000000..378dbd0 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_4.xml
@@ -0,0 +1 @@ +<uw78EFL >srA1lNbs<B8RH9ex4 2o="ID" hX="79SYc6Gv" t="kfhmko">Itwa1xQzM4Eqp</B8RH9ex4></uw78EFL> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_40.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_40.xml new file mode 100644 index 0000000..b8352a7 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_40.xml
@@ -0,0 +1 @@ +<JFzb jND="f">6JVA3897IW8ij<Jhi5oxss >AhkSfrcI0u77s1JIchlY</Jhi5oxss></JFzb> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_41.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_41.xml new file mode 100644 index 0000000..42355f5 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_41.xml
@@ -0,0 +1 @@ +<k6ck ><tgBz J="5Rny" X="YJ0M1roQ0O">h</tgBz><JRL2xJF >IqdX8AYttwV<5jLvNGxk U0Ymo="afMpFJ" d="i">MCGn3j1<sFIEJS UD="AF6XMkN">Bo0T5cjy</sFIEJS></5jLvNGxk><krT3VBJ xg9y="VeprwiXtnh" IfK="ZsK" S="xWkV">OhdIDQTvbM</krT3VBJ></JRL2xJF></k6ck> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_42.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_42.xml new file mode 100644 index 0000000..9aaa9b3 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_42.xml
@@ -0,0 +1 @@ +<dSe zO="dQL3nzicy">JyX<qMkVzpO >zyd3G<Dw >Md3MSRsON5ROKpF4<TbGy T="Uvalwr8H" 1="JpR">lInTFw</TbGy></Dw></qMkVzpO><gNjjL9S1 9Al4k="wEoa6s" Q="Gf9s8C">4Bh39<d Nu="oi9uY"><t HTeQ="0">07mwKbeUiV</t><w5pB Pj="Fpr8my6lY" BC="PKnh5IS">Zq0g1sNo4SyTK3GKU</w5pB></d></gNjjL9S1></dSe> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_43.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_43.xml new file mode 100644 index 0000000..193bf9b --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_43.xml
@@ -0,0 +1 @@ +<MkjcHm >uYhZXyzMTeNnzzXIMzwV<9 b="Kr" zr9xr="PDUaruxi">F72V<VROpE a1="hf" xoQ="PzNR2uG">QuueNFMo5VZ</VROpE><Y uzP="g76">mfwjx9<1FXde kYHq="yyE">4xQhHcXvUscYn</1FXde><iUiPm >4dnZn08Uf</iUiPm></Y></9></MkjcHm> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_44.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_44.xml new file mode 100644 index 0000000..43ebfdd --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_44.xml
@@ -0,0 +1 @@ +<0VP3VvE3 pqHDw="11AJH3A">3mBh401IgpHBsgQEvi<YNqo26xH bdXN="8YwdsYI89">So8</YNqo26xH><pIvuT4uUR >Hz<aucl1v jn7i="8" Bn="wgrK44F" L6n="w8OQp">Pb</aucl1v></pIvuT4uUR></0VP3VvE3> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_45.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_45.xml new file mode 100644 index 0000000..cfcd7ac --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_45.xml
@@ -0,0 +1 @@ +<fi7rO >0B<3eiM yx="BA" k="b9t83e">57rQbQO8SbyBJBO8Tk<4QbvT >QlT2s7ErH8NgdTmbmE<5UQCns1Nu >K7GL</5UQCns1Nu></4QbvT></3eiM><L D7Po="W" Jr2="LwkV">yO5isVyRRfkqQp</L></fi7rO> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_46.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_46.xml new file mode 100644 index 0000000..dc1f1d6 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_46.xml
@@ -0,0 +1 @@ +<Hyg QYB="Cc6" 1="B">rNmQPw<P8 e7vNR="zjTr" n9WS="6cpQ2qM3">3lr7sQzMFSuIENTDZpzj</P8></Hyg> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_47.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_47.xml new file mode 100644 index 0000000..6d1951c --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_47.xml
@@ -0,0 +1 @@ +<lJ OAkg8="l56IXFG">XT1n1QK<Ft6 m1Ih="NgsSsywJ24" b5T="6dBA" yD="j6qocUl0NT">vaqBbj5cCG<auAjKmT wKk1I="jC6" Ti="h" K="l9Ct2C5">qaZY5DCz</auAjKmT></Ft6></lJ> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_48.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_48.xml new file mode 100644 index 0000000..ab61765 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_48.xml
@@ -0,0 +1 @@ +<ZkZz2irI O0J="zAHcp">8NUWMx1Mp0SJMcaD4i3<QrT >ioMWtOgTbhYgbpD<r5cL NpIX="zlHF9w" 3="avQZuSbg" RQ="Dcl">bB4HBqKTDRVtZ5iN<6IIF61j irti="39ol70L" 1jZxe="aOzfvzO6eB">Zg0</6IIF61j></r5cL><Xqa >fm4HXWXkERxWi</Xqa></QrT></ZkZz2irI> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_49.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_49.xml new file mode 100644 index 0000000..7befa96 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_49.xml
@@ -0,0 +1 @@ +<mh 1YdxN="qL47Iefm3"><R3gpk o4j="AV" b="PnYCc9h2h" zA="A9Is">nZ</R3gpk><92Bl uJu="xSd">8Op</92Bl></mh> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_5.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_5.xml new file mode 100644 index 0000000..4ba297b --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_5.xml
@@ -0,0 +1 @@ +<P >JdlwcqfkHmVzWYBGIm<IwTd gW="EbNXlx" s="ZFJxhYR73">nfuDwL1U01gNj</IwTd></P> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_50.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_50.xml new file mode 100644 index 0000000..319e0a5 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_50.xml
@@ -0,0 +1 @@ +<Sv3Fzz TZII="nhOXSH" xuI="IHPhMoazj">jQjP1<6MeYDN Y="Vj5WvnsH" dW0n="N">9k<rEJjNcu nBiau="0" X="RgmZD" eUg="CWV3">2FbCGaBTkRP87i1fOH<T8Z UCT="TrZt">Y</T8Z></rEJjNcu><w02wGFV rBB7="z" T="CSXEPO">Ssgxx8R<L zsT="8GG8AULwGm">ypZYuVFkcmswTIqeKB</L></w02wGFV></6MeYDN><NRf yo="B3OgyR">awr</NRf></Sv3Fzz> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_51.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_51.xml new file mode 100644 index 0000000..3cf8d8f --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_51.xml
@@ -0,0 +1 @@ +<0VtgTJQ OWEU="RvzY" WHhbW="U0b4">yNtGdFg9JNim</0VtgTJQ> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_52.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_52.xml new file mode 100644 index 0000000..dd62675 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_52.xml
@@ -0,0 +1 @@ +<m4 >jooB9ffISKCg<d1mRs ><9H7xbbn MjlW="Qlo0dZOG4" ro="OZGs8" W="SlTMa">Tzgeq9v</9H7xbbn><qKtDEO 6PKl="GovjJ">wkSMXK68oVvRIWh<5 >mZxfW5i</5></qKtDEO></d1mRs><7 >pmTkFHhhF6P9nLuO</7></m4> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_53.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_53.xml new file mode 100644 index 0000000..9384351 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_53.xml
@@ -0,0 +1 @@ +<dkFB >M4r<kAic6c >QnCCnTp<OWR3y9G8 >OdJRkf5qP7lbkLnU4</OWR3y9G8><H PAE="W6NuYu62mn" o543z="LyAlyL0uX">J4OTF8ySW</H></kAic6c><5 NmGU="JRI">zlCm6r7yfE5Jvz<6Uf1I7Csdh KZv="4XzI" SgEl="gC" u0="Vmhy5gBl04">4TF</6Uf1I7Csdh><86x0 b3G="Mus" ed="nIu9" u1S="t80zB">ojhf7</86x0></5></dkFB> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_54.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_54.xml new file mode 100644 index 0000000..087d710 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_54.xml
@@ -0,0 +1 @@ +<47PX vTC="oM">osmPBnKIYv<Ax0RBd UWZe9="jofTq">MCqy<ECkccIwrik pTlOk="CFAF8SW6Wa">8JDFcFKZ</ECkccIwrik></Ax0RBd></47PX> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_55.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_55.xml new file mode 100644 index 0000000..b9edfe0 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_55.xml
@@ -0,0 +1 @@ +<rQdz5YB e8="i2t" Bi="AwKYlESHx">5vIdw19r2RJ8uSU</rQdz5YB> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_56.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_56.xml new file mode 100644 index 0000000..fb50e30 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_56.xml
@@ -0,0 +1 @@ +<nA3I3 Yzf="Y0w" J="9Je2">E0A2Kz</nA3I3> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_57.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_57.xml new file mode 100644 index 0000000..5c01a4d --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_57.xml
@@ -0,0 +1 @@ +<v1A 5="zE" x="Ja2B" dMW6R="Zp">r</v1A> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_58.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_58.xml new file mode 100644 index 0000000..876a7a9 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_58.xml
@@ -0,0 +1 @@ +<u9M vLMx="bxV" DDV="3SL" cHP="eFL6">dxXOcAiw09Ha9yQ15GAp</u9M> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_59.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_59.xml new file mode 100644 index 0000000..12d7fcb --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_59.xml
@@ -0,0 +1 @@ +<uNuw rpG="pcE3yxSOlU" xh6L="DUQSdv34B" 4="jJsHZgJehv">30x<YVQv3TSI >K<dFRzkUqwPe 2G="aJ" F="VB">issc0i</dFRzkUqwPe></YVQv3TSI></uNuw> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_6.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_6.xml new file mode 100644 index 0000000..aa25d19 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_6.xml
@@ -0,0 +1 @@ +<CSSowM tTxf5="djjuT3KZY" n="cj">BNJW0zCafKt4GM659oF<A1nIhD4 X605="GtKkMDbo" 2Tw="2" SAXt="F2l5TRHnJw">J3xycN8U<SEf2j7 >xhH8hSSZbf5CSvoNkCL</SEf2j7></A1nIhD4></CSSowM> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_60.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_60.xml new file mode 100644 index 0000000..96ce246 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_60.xml
@@ -0,0 +1 @@ +<UU i="lXg" Hdgbe="nIIYxxZjh" QJ="5L9OUXJVJ">2uQioSsXYz7MKINtu<b 5="xzz4B3yac" wc="y5n4Q7ViV">Yil<uVV FIHtd="GjM">FVBRmqb<TKKuvQ0gu EW="JjTR" Gn="wn9RZbw" 6k6="v3Rrxk">cU6VjE7Hr</TKKuvQ0gu></uVV><QpuaUZ y="sAxoMDy9">LgLiWOm1Vlpd<lNqort hV="9KFAE09LY">TwBOuL6V7HC</lNqort><0kGb KV3Bq="CXvE" t="4" N="ceMswqT3">623T</0kGb></QpuaUZ></b><AjrvI29 gY="JDn" c6="tJ5BNRoy" DaZcr="JDqYjB5gic">3UMMIUvwc4Xv</AjrvI29></UU> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_61.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_61.xml new file mode 100644 index 0000000..e179cf3 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_61.xml
@@ -0,0 +1 @@ +<i Q="fgyLn9gMm">xgVUl8m<h qiPW="su1pm">3n6OqnQ<LNyudMF >hdNbFEeIsKnNRHH<r5nsTKSF4 j="lFql7rosic" J="FhuGE55" JL="A5P">whkvtgVMqFAnas</r5nsTKSF4><Yv8tN0m7P J="aNeQXuuY6D">2iheqiGn</Yv8tN0m7P></LNyudMF><6LLTwGKc2 Ocz3="yvvxTe" yX="e8Tmz">aGop</6LLTwGKc2></h></i> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_62.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_62.xml new file mode 100644 index 0000000..942bc70 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_62.xml
@@ -0,0 +1 @@ +<vhk >ub8aou6E<gkRmPf >W4DJ6RHqV5uRW<fl I="QnL">XRs8sMsNnNW0WAKH</fl><jX3J0nPGa g="qIr2">cuRc3rZ36ptllC<HLYuOhLiX OrP="mD">kXavXthx</HLYuOhLiX><9Cz4BmOy ph5r="QKIuklW" Iix="mVue" 9rR8="If5t">IuSQ3UVOHCKsHxWtiZ</9Cz4BmOy></jX3J0nPGa></gkRmPf></vhk> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_63.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_63.xml new file mode 100644 index 0000000..3f6f05e --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_63.xml
@@ -0,0 +1 @@ +<qrII4BDTFr 8c6="e4KRSZtWN" ZjQRy="1hbLqmR">fggsOvkLCC2J<5SxSUHiVGS >1yuhDObQhIsFn9<IjAfOmKMEe ><eT Y="sIyp" OxNky="OGt2Sd" gdP="V9u">j0t4tLmRAmG2T9</eT></IjAfOmKMEe><rRx3Ov1U >aDLiJp<9 dyy="A3DTVNGTAf" 7SKUI="Pu1p55MgTm">dAvXcGeUM7Aon</9></rRx3Ov1U></5SxSUHiVGS></qrII4BDTFr> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_64.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_64.xml new file mode 100644 index 0000000..63f3c7c --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_64.xml
@@ -0,0 +1 @@ +<ozRv aN="EyX" s9RO="Q">EIT52HPVmWDRvNVuAl</ozRv> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_65.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_65.xml new file mode 100644 index 0000000..88c3b32 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_65.xml
@@ -0,0 +1 @@ +<mMFNOt9 lH="GwgZ" JVSst="7bRUf">yqiubwvQbUoeV8<Zz9sDqg d5gw2="d5J24pdXS8" dmL="HPuv">cog<7 KH="9R">KxBmQDF4wMjpFA8<Db37zg JLeT="pmBl" Ly4="pGn" VZqp3="noMfwQ">kFxN0rioRir</Db37zg></7><F >q</F></Zz9sDqg></mMFNOt9> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_66.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_66.xml new file mode 100644 index 0000000..09b43d1 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_66.xml
@@ -0,0 +1 @@ +<WPDix W="bSuSx8">f0Xwjj<6AaP2ny4R g7XE="AX1Dv" wD="D">UPHke3CM</6AaP2ny4R></WPDix> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_67.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_67.xml new file mode 100644 index 0000000..02b0a9b --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_67.xml
@@ -0,0 +1 @@ +<WWPP Hn="pJymq" mNlf="G">NZYhzpu4NItKnaH<Tpu98E >s</Tpu98E><N8Ktbv 51ZdT="R" e6irC="mE25HiMmv7">NB</N8Ktbv></WWPP> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_68.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_68.xml new file mode 100644 index 0000000..e4f9fec --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_68.xml
@@ -0,0 +1 @@ +<N3hTR4GY e0MK="VuAtp" escAk="G">VOo</N3hTR4GY> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_69.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_69.xml new file mode 100644 index 0000000..e967213 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_69.xml
@@ -0,0 +1 @@ +<09IO2 v="X3DBJfxz" Jb="RGGY" kv="pbnPE">U4rZ7Ooss6nF4</09IO2> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_7.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_7.xml new file mode 100644 index 0000000..1468035 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_7.xml
@@ -0,0 +1 @@ +<7U pGNyk="7CdtjCB" 6y="cRpi91w">cz6<w >hJHw</w></7U> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_70.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_70.xml new file mode 100644 index 0000000..31b4366 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_70.xml
@@ -0,0 +1 @@ +<qjN5 >8dj5Ern51a08TLzIM5</qjN5> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_71.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_71.xml new file mode 100644 index 0000000..701a1f0 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_71.xml
@@ -0,0 +1 @@ +<8G7DnfK >gYpMNRlwKVel0f9Z<khjA7OLUI O6="Ztyef6p5Z" iWs6i="Q1El6JW" 6NCv="0V0jS">E05H<v4 IDZ="zJTo3">DOuaUFUtzHQ6Ccb<43Z3l DKx="x2HKd2qMvx" HC7="AKEfBJHTw">JwQgTp4Epb2BJ1wmjj8</43Z3l></v4></khjA7OLUI><X9d 66PU="U">NMxn7xCVU3rU2Wud<hbz1KuLXY8 YJzy="yJDNBWRp" M6ZE="0qL">tCiVxAhfBtV2H59A8U<2K mz="29CWxD0">75weCjVt2r</2K></hbz1KuLXY8></X9d></8G7DnfK> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_72.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_72.xml new file mode 100644 index 0000000..0231234 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_72.xml
@@ -0,0 +1 @@ +<n0IFo t="BXaSnNHX" BC8="jkR" y="9GyBNVq">z15vNU19E<nw4w qpe="uij">tSYa5L8O9rpMPCVTF6</nw4w><tSL2I1mrH W="iEuGvbxW" VnL="M">SEdx</tSL2I1mrH></n0IFo> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_73.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_73.xml new file mode 100644 index 0000000..78eb3ec --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_73.xml
@@ -0,0 +1 @@ +<d1u3Xn5oVb 5d61="clKEP" 43="oq">WtHT<satdALbA 9U="Y6K" Lqv="xGki">54ZAx6w8d3<a qIO="Bg9q" Mt2o="PD4yDs" 3A="c5ig6OQKL">pXDRywZ73hdnihBp0e</a></satdALbA></d1u3Xn5oVb> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_74.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_74.xml new file mode 100644 index 0000000..29085a6 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_74.xml
@@ -0,0 +1 @@ +<g4Kj3X sN="D">jbaZfmWmhrd5<rartNL8As >u<NJwBuk >BZWtsKzovMvl<apjqkU4 >mmCjardpUn5AZ</apjqkU4><t Yyb="k">bizaYtOVbSYtMERaLtSh</t></NJwBuk></rartNL8As></g4Kj3X> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_75.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_75.xml new file mode 100644 index 0000000..463a417 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_75.xml
@@ -0,0 +1 @@ +<oo3j e3rQM="luQU1" KQqU="cxQnY6NP" Q0="NI">58Ub3uasaLl1X<boWku4055p tc4="ePA0eZGc">BmZa2nNCYzP0<s1 LcfE="urZgkEAmzG" R="CY12lZjV" c="bQP8gqIA">fCvQPjYBT253xTK</s1></boWku4055p><kvz3VM 1fuP="o" lGjbo="N510zheUBk" xi="wcMEUIjwY">9FrEkCpIv7</kvz3VM></oo3j> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_76.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_76.xml new file mode 100644 index 0000000..ae74113 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_76.xml
@@ -0,0 +1 @@ +<OWJhiT 72fJM="Fj">rwlGLaF4ctvWVo<J01Z wiqp6="bxQRRU" 8Cb8="X5QIK8M">dSmsYLM6XrrSLk5G</J01Z><E5XOwWG1G JdS="JRcn2dA" WXnG="fRAdt">ySbw27kjEqlJOH2gC8u1</E5XOwWG1G></OWJhiT> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_77.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_77.xml new file mode 100644 index 0000000..33a9340 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_77.xml
@@ -0,0 +1 @@ +<q1F X="u5" Yt="Ff6SX6A">MVEDEM</q1F> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_78.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_78.xml new file mode 100644 index 0000000..1abb07a --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_78.xml
@@ -0,0 +1 @@ +<3KaR3 X6Y="8N" b="5kjhao" JZ="jQAXGKTm">3<ngKosqu9qz 5F4q="M05p" dS="3zI5MzOs5" K="dnWSnu0"><8XvhIk nBqVd="Y9mOFT" CKcD="DJS" kB="4asCkiFg5Z">e1Fl<CkKjwoSss9 >KsP1VnQM5cWh8nsG5bo</CkKjwoSss9><SHz fcfSN="jgX2">qMDvhOqry</SHz></8XvhIk></ngKosqu9qz></3KaR3> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_79.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_79.xml new file mode 100644 index 0000000..624720d --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_79.xml
@@ -0,0 +1 @@ +<dhDTe3 uCs6u="7qv">FtBZfd6UjE2RX<A R1nHd="yKJYN24rR" vgh8t="ab2W" bMd1F="3">FJ8SosKAdemw39wHqe<OBkraP SEnl="tvOeDCA">30l5</OBkraP><3SSZxGH9it BS="4j" rVnWK="hlH" sa="wO">skqPMkxGJ<DoxLpv19B UK8="HHzHrWKANi">l</DoxLpv19B><FQgGbtRcxC NcdO="A" tv8="opJY4I">raUZenpQvlqte67bX</FQgGbtRcxC></3SSZxGH9it></A></dhDTe3> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_8.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_8.xml new file mode 100644 index 0000000..df7ca2f --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_8.xml
@@ -0,0 +1 @@ +<6DYmrb MlJPH="z0Wj4Frt" Cz="Df0r">g8<M14VN7RKe K8S7G="4ipjxM" fWFxx="Ob70a" reE44="hb6yX">OYlG5YSfqKtzUoyu3</M14VN7RKe><Q79i x="s2j3" U0hP="YH7fdY">iaJSi<T0vTf5 m="nHcnQIuT">ESxEYCamkR0<n8GrrEtP qBM="nFEw" 7TT="1ck1ZA">12iY69t6AY3VJzhj</n8GrrEtP></T0vTf5></Q79i></6DYmrb> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_80.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_80.xml new file mode 100644 index 0000000..e7d6f6b --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_80.xml
@@ -0,0 +1 @@ +<LTO3 >bNrnuIrMrqRk6WrK<ygXQx 18v="hagB">2M4QhHsNG1kaYnk<SX >mDNdmKYwqllExhctJw</SX><BxAACTX jHs0="epR" i="NLqRg" AJZf="O2gdH">v5J1<lwMf2JeM >H8vgxKj</lwMf2JeM></BxAACTX></ygXQx><C ui="zqABHB8">OlZOIYj</C></LTO3> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_81.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_81.xml new file mode 100644 index 0000000..8b1b346 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_81.xml
@@ -0,0 +1 @@ +<J2MDJTMyif m="EIfk" ueqSd="1L6">VkeZ1dF9uKhvoI</J2MDJTMyif> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_82.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_82.xml new file mode 100644 index 0000000..9af6642 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_82.xml
@@ -0,0 +1 @@ +<Uei 5e="K" H="GLtylN" qXbT="QP">AqJoZm45ws1T</Uei> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_83.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_83.xml new file mode 100644 index 0000000..137fdea --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_83.xml
@@ -0,0 +1 @@ +<1AA1vx1DA 8aI="nyacK" 6ayA="2fax8QLKh" ZK="YKdY">MbJtD9YWQR5hV2qC</1AA1vx1DA> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_84.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_84.xml new file mode 100644 index 0000000..a7b60eb --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_84.xml
@@ -0,0 +1 @@ +<RMtV 272fW="rBY" gj8="dnl" 1="ajF">mgc20ou3U6AK3rMD8VBO<7j32X G="PW4aR4I">Ie</7j32X><DzcF3n j="vu7dYRPa2d" Em="7">ojCZmN</DzcF3n></RMtV> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_85.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_85.xml new file mode 100644 index 0000000..f1592b4 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_85.xml
@@ -0,0 +1 @@ +<Q4hYfSX xOqe="KN">SL64MbYGdFsj<wKgfi4Nfk >OG9pocitbKj9OvEspfV</wKgfi4Nfk><afCq0QnC >3e5<texeyAltiI >lFix8zIKv<c Dlk="8ZMgH2l" d9="MQlNI">mPshdAE</c><H4tPs cYB="Wiblg08CiU" LQzUX="GMi4aNOPfx" 6Eh="JmK237Tjr">PmK9eMpvS</H4tPs></texeyAltiI><nX f70="3pLg" ovY1C="F" ar97Z="ZA0Fv1Wp"><Xg5e2Wivj Ne="gZyPhd" VplP6="qX" j="j3OYIA">RW785dc8VR6r8</Xg5e2Wivj><F >CbdT5ZgO</F></nX></afCq0QnC></Q4hYfSX> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_86.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_86.xml new file mode 100644 index 0000000..b48825a --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_86.xml
@@ -0,0 +1 @@ +<P MnAK="xXERAKcJ4" u="EL" 0T="V">WeAPDvhIMcXMRSpIqCG1<QFukAqH9H u="UkiVVG" BLA5="U9Pfa0" JZZ="gsr">dEnLy2wpU7</QFukAqH9H><qvEV8MjSc0 TG6="Qn">eus4sl5KNp3KLO81744X<3vz2Pk X="ZrD5czMz" D="PKD">pc<Rn b9q="XTM">OnKhmJKjoyQQa6WG2gVe</Rn><VANll5sYE sYD68="77jHKQK">Hm7kzNHx5P</VANll5sYE></3vz2Pk></qvEV8MjSc0></P> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_87.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_87.xml new file mode 100644 index 0000000..d1cf0f1 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_87.xml
@@ -0,0 +1 @@ +<eBcl1xb 8X="exqCejzr">tXHbywek<cjtBNm m="tC4" awAy="CuKx">kSpzAz58eVEObhqaH</cjtBNm><m7b4xOgPYa VqwP="TyP" VyLm="IrKS0G70my" hK="N20u">GIndeqC9d6UqTxeO<nEgufv LO="YbdjHZ1k">zakJ4GwNEokm<S3FG lOKA="gWklUVEf" r6E="Y9x53iKtvW">GcY4NG</S3FG><1AELe ISzNU="QY75Jv" aj="7MC"></1AELe></nEgufv></m7b4xOgPYa></eBcl1xb> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_88.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_88.xml new file mode 100644 index 0000000..9f95bcf --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_88.xml
@@ -0,0 +1 @@ +<wi dC6="0Jj1wVW1b">0Xp29PQ6D1f<zNlnHQx tV="4wpZRxgk3" fM="k58wTUc3G">1sTrjUJonR<lzqEb lBj="DSv5O">flN2z5siADZVWFH59R<ST9x6xrJrk qS="dNo7WcU8ge" ZC="d6edL">X1ybibZiwwEpBNYXyF</ST9x6xrJrk><bb jqKfD="0jes" We36="OjHSQ7" 0mHQg="vCIeOYEfoY">UfhFbgnC0</bb></lzqEb><Yq g="TcMQCxV" r="3lwa" wu9="i6Kb">m74pLDXaZq9z9uZUorG<XwkUv0n kZ="1TPDMWpBFC" WQp="wPO">EVIK1vubtmLU</XwkUv0n><4mr m="sU">ffxbYNlX78URWg</4mr></Yq></zNlnHQx></wi> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_89.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_89.xml new file mode 100644 index 0000000..74ac326 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_89.xml
@@ -0,0 +1 @@ +<7Zctg ></7Zctg> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_9.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_9.xml new file mode 100644 index 0000000..20a4c5b --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_9.xml
@@ -0,0 +1 @@ +<VEKWA17UO 5NoT0="h" Oncsx="1">Xf2UsHIBsNEkOTbO<lKhp 0ih="gfJpWkgTBU" Up4="UF">AovTvZb2</lKhp></VEKWA17UO> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_90.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_90.xml new file mode 100644 index 0000000..c0883f1 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_90.xml
@@ -0,0 +1 @@ +<Zds45s4akA c="QGoBN" ljFgZ="v" 6="C">NFFZPhGXBw<HtYrfL >VoW8NTNXRA4BAkK</HtYrfL><H XIfab="Brnie8O2fq">Pji8egBgQmp4fRUj0S<tF G="YzIDr">i<ajEOz 1Cjr="F4OCsU" GLQFK="7Ll2yR5V2" 5J="ZdR">mfm0Cc5DzK</ajEOz><I2e K="TaoVm5KBf" 9zY="nPww0" EBV="brVtWJ">kQOURR</I2e></tF><yH >Cu59<RCKxu 2Fea="q1">6oO</RCKxu></yH></H></Zds45s4akA> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_91.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_91.xml new file mode 100644 index 0000000..ddc04be --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_91.xml
@@ -0,0 +1 @@ +<gv7XQ Piw="bULZ">gvgM5<fE2dcTALgZ XK2="2Yni3PhWL">FzWU1R1bxPWygrTOSvsV<0o Xna="4t7drNdj" dgma="km" h="S">GTgznJ9manEnAMoGOt</0o></fE2dcTALgZ></gv7XQ> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_92.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_92.xml new file mode 100644 index 0000000..e64f364 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_92.xml
@@ -0,0 +1 @@ +<thBx5t GeWO="ke3F65jKc" wkIUM="k">qx3o428zs4VtZRQaBa<bUp3z A="Z3F7IaXc" m52c="2od7uKa">Q8gR</bUp3z><J O="R0F">sCTMQrMwrixPvcSK</J></thBx5t> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_93.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_93.xml new file mode 100644 index 0000000..c206c4d --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_93.xml
@@ -0,0 +1 @@ +<pFkpc AUQ2S="A24iYb" m="RXbO7WFc" s="9mXUyY">mPqu4Ba</pFkpc> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_94.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_94.xml new file mode 100644 index 0000000..cbd118a --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_94.xml
@@ -0,0 +1 @@ +<4n9yd t="kMUbNr" 76="XOOfG">393VlP<Cjd0m3ecf e="hTbq3jjvg9">vAVX3<Zpy6MkzB7T hof="yYoK8TaMe" M="1d31C8RL">p<xD7nL23uNA xm0dR="VB4hLBn" HXX="z">GJYvl9A</xD7nL23uNA><fchDSJPJP >i0sg</fchDSJPJP></Zpy6MkzB7T></Cjd0m3ecf><XatWo4uR6 gAu4="EXSMF5cv" b="15XT3rXtre">yDpIrzcA5FmYcgaCxfBq<LjFy ScssC="l2" z="ZXLLyCvA">mpn<Ab NCKIq="Sr" Yt="5m" 6DFrl="uR5xaIn"></Ab></LjFy></XatWo4uR6></4n9yd> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_95.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_95.xml new file mode 100644 index 0000000..3ab0d11 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_95.xml
@@ -0,0 +1 @@ +<2I3 kn39U="0UZqngTya" A5vMm="VN7x5Ra9f">DmT34z<dp >vX<4kRSfl >wwTXN4cF5KuP<ET 3FSU4="631gK4M1">ExpJPYwCcLZVJWC2ol</ET></4kRSfl></dp></2I3> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_96.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_96.xml new file mode 100644 index 0000000..e3483f1 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_96.xml
@@ -0,0 +1 @@ +<zjOU01r7HL 2dG="ylCp" uT="3HP" uFjt="Y3x">B<4GfObQH tO9="Yv" 8Csn="W">c1B86lPGo7nW<J7GybA JQv="jw0lynKtgQ" 5FwM="EHG">NDVs1LtXsVRwB</J7GybA><FO1 BOXy1="cpfZofJQ1">z3UVwpLtUxHWijfgUsI</FO1></4GfObQH><YHfev tdnB="v7tBOyc">Va<mpR56rFIeC vfK="nr5R82q6" u="lDxWo" 3S="k">YwryMAuWN4Hje5fYcJ<5d19iVu31T BJem="rr6mNGDMSD">NHch6WXzeqdd1wCLXWci</5d19iVu31T><WTfr B2="im2DCPHpB" VME="aLT" qasdt="heAHelA">zNNMBA</WTfr></mpR56rFIeC><uoE6 TLS="N6"><ov ZO6="Sna" esT="UbalNrXNe" m="ZrSggJnD">Lt3ViDYfZw355Ca</ov><dSYCJRCxGs l="zjz" cm="AhbWFw4V1w" JoF="9gz3YAZJzd">QWiCSarw</dSYCJRCxGs></uoE6></YHfev></zjOU01r7HL> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_97.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_97.xml new file mode 100644 index 0000000..7e4db56 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_97.xml
@@ -0,0 +1 @@ +<AhAELq9wFh >ch14W5NflCsI<Oe8A >dpBhoWgb4v<5 >4wHnCc43GmvqCjgL7wgN<5woLd KgV="wyvSZd">jIBKHHBXE</5woLd></5><d7 bX="2">qO2zkcvVNDI4<q4zZZG3jA E="oJHnWFE">DJ44ld0J4W</q4zZZG3jA></d7></Oe8A></AhAELq9wFh> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_98.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_98.xml new file mode 100644 index 0000000..959b5b5 --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_98.xml
@@ -0,0 +1 @@ +<JOgAtST T7z="JMv4V" n="I">m3qw3589L2MM</JOgAtST> \ No newline at end of file
diff --git a/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_99.xml b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_99.xml new file mode 100644 index 0000000..1a0d0ee --- /dev/null +++ b/fuzzing/llm/tinyxml2_fuzzer/xml_corpus/xml_99.xml
@@ -0,0 +1 @@ +<xrQ4CU O3d="6DOXEGPO1">idy1bWtJhRy4eh<es0s X4Odu="dJV" AvF="FxkCPjzm" OAkm="tBb12xBa">FnYkbt<k9hmPi 8Ss="QKKqB9OqiW">A27RNXS3</k9hmPi></es0s></xrQ4CU> \ No newline at end of file
diff --git a/fuzzing/llm/xmlreader_fuzzer/Android.bp b/fuzzing/llm/xmlreader_fuzzer/Android.bp new file mode 100644 index 0000000..066354c --- /dev/null +++ b/fuzzing/llm/xmlreader_fuzzer/Android.bp
@@ -0,0 +1,38 @@ +// Copyright 2024 The Android Open Source Project +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_fuzz { + name: "xmlread_memory_fuzzer", + shared_libs: [ + "libxml2", + ], + srcs: [ + "XmlRead_Memory_Fuzzer.cpp", + ], + fuzz_config: { + cc: ["[email protected]"], + componentid: 330367, + }, + host_supported: true, + corpus: ["testdata/*"], + dictionary: "xml_fuzzer.dict", +} + +cc_fuzz { + name: "xmlread_fd_fuzzer", + shared_libs: [ + "libxml2", + ], + srcs: [ + "XmlRead_Fd_Fuzzer.cpp", + ], + fuzz_config: { + cc: ["[email protected]"], + componentid: 330367, + }, + host_supported: true, + corpus: ["testdata/*"], + dictionary: "xml_fuzzer.dict", +}
diff --git a/fuzzing/llm/xmlreader_fuzzer/XmlRead_Fd_Fuzzer.cpp b/fuzzing/llm/xmlreader_fuzzer/XmlRead_Fd_Fuzzer.cpp new file mode 100644 index 0000000..364043c --- /dev/null +++ b/fuzzing/llm/xmlreader_fuzzer/XmlRead_Fd_Fuzzer.cpp
@@ -0,0 +1,50 @@ +#include <fuzzer/FuzzedDataProvider.h> +#include <libxml/parser.h> +#include <cstdio> +#include <unistd.h> +#include <fcntl.h> + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + FuzzedDataProvider stream(data, size); + + // Initialize the XML parser + xmlInitParser(); + + // Create and initialize parser context + xmlParserCtxtPtr ctxt = xmlNewParserCtxt(); + if (ctxt == nullptr) { + return 0; + } + + // Create a temporary file + std::unique_ptr<std::FILE, decltype(&fclose)> fp(tmpfile(), &fclose); + if (!fp) { + xmlFreeParserCtxt(ctxt); + return 0; + } + + // Write fuzzed data to the temporary file + fwrite(data, 1, size, fp.get()); + fflush(fp.get()); + rewind(fp.get()); + + // Get the file descriptor from the FILE object + int fd = fileno(fp.get()); + + // Generate other fuzzed inputs + std::string URL = stream.ConsumeRandomLengthString(); + std::string encoding = stream.ConsumeRandomLengthString(); + int options = stream.ConsumeIntegral<int>(); + + // Call the function under test + xmlDocPtr doc = xmlCtxtReadFd(ctxt, fd, URL.c_str(), encoding.c_str(), options); + + // Cleanup + if (doc != nullptr) { + xmlFreeDoc(doc); + } + xmlFreeParserCtxt(ctxt); + xmlCleanupParser(); + + return 0; +}
diff --git a/fuzzing/llm/xmlreader_fuzzer/XmlRead_Memory_Fuzzer.cpp b/fuzzing/llm/xmlreader_fuzzer/XmlRead_Memory_Fuzzer.cpp new file mode 100644 index 0000000..12a5c9c --- /dev/null +++ b/fuzzing/llm/xmlreader_fuzzer/XmlRead_Memory_Fuzzer.cpp
@@ -0,0 +1,64 @@ +#include <fuzzer/FuzzedDataProvider.h> +#include <string> +#include <libxml/parser.h> + + +std::string GenerateRandomXML(FuzzedDataProvider& stream) { + std::string xml = "<root>"; + int numberOfElements = stream.ConsumeIntegralInRange<int>(1, 10); + + for (int i = 0; i < numberOfElements; ++i) { + std::string elementName = stream.ConsumeRandomLengthString(10); // Limiting name length to 10 + xml += "<" + elementName + ">"; + + if (stream.ConsumeBool()) { + std::string textContent = stream.ConsumeRandomLengthString(20); // Limiting text content length + xml += textContent; + } + + int numberOfAttributes = stream.ConsumeIntegralInRange<int>(0, 5); + for (int j = 0; j < numberOfAttributes; ++j) { + std::string attributeName = stream.ConsumeRandomLengthString(10); // Limiting attribute name length + std::string attributeValue = stream.ConsumeRandomLengthString(20); // Limiting attribute value length + xml += " " + attributeName + "=\"" + attributeValue + "\""; + } + + xml += "</" + elementName + ">"; + } + + xml += "</root>"; + return xml; +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + FuzzedDataProvider stream(data, size); + + // Initialize the XML parser + xmlInitParser(); + + // Create and initialize parser context + xmlParserCtxtPtr ctxt = xmlNewParserCtxt(); + if (ctxt == nullptr) { + // If cannot allocate context, early return + return 0; + } + + // Generate fuzzed inputs + std::string buffer = GenerateRandomXML(stream); + int bufferSize = buffer.length(); + std::string URL = stream.ConsumeRandomLengthString(); + std::string encoding = stream.ConsumeRandomLengthString(); + int options = stream.ConsumeIntegral<int>(); + + // Call the function under test + xmlDocPtr doc = xmlCtxtReadMemory(ctxt, buffer.data(), bufferSize, URL.c_str(), encoding.c_str(), options); + + // Cleanup + if (doc != nullptr) { + xmlFreeDoc(doc); + } + xmlFreeParserCtxt(ctxt); + xmlCleanupParser(); + + return 0; +}
diff --git a/fuzzing/llm/xmlreader_fuzzer/testdata/attributes.xml b/fuzzing/llm/xmlreader_fuzzer/testdata/attributes.xml new file mode 100644 index 0000000..417fec7 --- /dev/null +++ b/fuzzing/llm/xmlreader_fuzzer/testdata/attributes.xml
@@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<root> + <child id="1"> + <subchild type="A">Content A</subchild> + <subchild type="B">Content B</subchild> + </child> + <child id="2" extra="data"> + <subchild type="C">Content C</subchild> + </child> +</root>
diff --git a/fuzzing/llm/xmlreader_fuzzer/testdata/basic.xml b/fuzzing/llm/xmlreader_fuzzer/testdata/basic.xml new file mode 100644 index 0000000..7e13db5 --- /dev/null +++ b/fuzzing/llm/xmlreader_fuzzer/testdata/basic.xml
@@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<root> + <child1>Value 1</child1> + <child2>Value 2</child2> +</root>
diff --git a/fuzzing/llm/xmlreader_fuzzer/testdata/cdata.xml b/fuzzing/llm/xmlreader_fuzzer/testdata/cdata.xml new file mode 100644 index 0000000..90cdf35 --- /dev/null +++ b/fuzzing/llm/xmlreader_fuzzer/testdata/cdata.xml
@@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<root> + <!-- Example with special characters and CDATA --> + <data><![CDATA[Some <encoded> data & other "special" characters]]></data> + <message>Hello & Welcome!</message> +</root>
diff --git a/fuzzing/llm/xmlreader_fuzzer/xml_fuzzer.dict b/fuzzing/llm/xmlreader_fuzzer/xml_fuzzer.dict new file mode 100644 index 0000000..745ded4 --- /dev/null +++ b/fuzzing/llm/xmlreader_fuzzer/xml_fuzzer.dict
@@ -0,0 +1,11 @@ +root_tag=<root> +child_tag=<child> +end_child_tag=</child> +id_attr=id=" +type_attr=type=" +cdata_start=<![CDATA[ +cdata_end=]]> +ampersand_entity=& +xml_header=<?xml version="1.0" encoding="UTF-8"?> +comment_start=<!-- +comment_end= -->
diff --git a/fuzzing/llm/xz_fuzzer/Android.bp b/fuzzing/llm/xz_fuzzer/Android.bp new file mode 100644 index 0000000..d9d5bbb --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/Android.bp
@@ -0,0 +1,41 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed 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. + */ + +cc_fuzz { + name: "xz_decoder_fuzzer", + srcs: [ + "xz_decoder_fuzzer.cpp", + ], + + static_libs: [ + "libxz", + ], + + fuzz_config: { + cc: [ + "[email protected]", + ], + componentid: 330367, + }, + + include_dirs: [ + "external/xz-embedded/linux/include/linux/", + "external/xz-embedded/linux/lib/xz/", + ], + + corpus: ["xz_corpus/*"], + dictionary: "xz_fuzzer.dict", +}
diff --git a/fuzzing/llm/xz_fuzzer/make_corpus.py b/fuzzing/llm/xz_fuzzer/make_corpus.py new file mode 100644 index 0000000..cdda54c --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/make_corpus.py
@@ -0,0 +1,41 @@ +import lzma +import os +import random + +def create_valid_xz_files(directory, num_files=10): + for i in range(num_files): + file_content = os.urandom(random.randint(100, 10000)) # Random binary content + file_path = os.path.join(directory, f'valid_file_{i}.xz') + + with lzma.open(file_path, 'wb', preset=random.choice([0, 9])) as f: + f.write(file_content) + +def create_malformed_xz_files(directory, num_files=10): + for i in range(num_files): + valid_file_path = random.choice(os.listdir(directory)) + with open(os.path.join(directory, valid_file_path), 'rb') as f: + content = f.read() + + malformed_content = corrupt_data(content) + + with open(os.path.join(directory, f'malformed_file_{i}.xz'), 'wb') as f: + f.write(malformed_content) + +def corrupt_data(data): + # Introduce random corruption in data + index = random.randint(0, len(data) - 1) + corrupted_data = data[:index] + random.randint(0, 255).to_bytes(1, 'little') + data[index + 1:] + return corrupted_data + +def main(): + corpus_directory = 'xz_corpus' + os.makedirs(corpus_directory, exist_ok=True) + + # Create valid .xz files + create_valid_xz_files(corpus_directory, num_files=50) + + # Create malformed .xz files + create_malformed_xz_files(corpus_directory, num_files=50) + +if __name__ == '__main__': + main()
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_0.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_0.xz new file mode 100644 index 0000000..a9d733f --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_0.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_1.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_1.xz new file mode 100644 index 0000000..4ad546f --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_1.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_10.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_10.xz new file mode 100644 index 0000000..613a0a2 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_10.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_11.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_11.xz new file mode 100644 index 0000000..ee52ec1 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_11.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_12.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_12.xz new file mode 100644 index 0000000..01d4629 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_12.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_13.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_13.xz new file mode 100644 index 0000000..69d6a7a --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_13.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_14.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_14.xz new file mode 100644 index 0000000..cac37b0 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_14.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_15.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_15.xz new file mode 100644 index 0000000..80a1782 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_15.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_16.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_16.xz new file mode 100644 index 0000000..6e04373 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_16.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_17.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_17.xz new file mode 100644 index 0000000..9efdeba --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_17.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_18.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_18.xz new file mode 100644 index 0000000..96a98e6 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_18.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_19.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_19.xz new file mode 100644 index 0000000..6fd4590 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_19.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_2.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_2.xz new file mode 100644 index 0000000..286412f --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_2.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_20.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_20.xz new file mode 100644 index 0000000..9c268bd --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_20.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_21.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_21.xz new file mode 100644 index 0000000..2b5b39f --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_21.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_22.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_22.xz new file mode 100644 index 0000000..dffbfb1 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_22.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_23.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_23.xz new file mode 100644 index 0000000..789292f --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_23.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_24.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_24.xz new file mode 100644 index 0000000..5d1bce6 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_24.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_25.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_25.xz new file mode 100644 index 0000000..c6ffb54 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_25.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_26.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_26.xz new file mode 100644 index 0000000..01e5aa2 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_26.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_27.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_27.xz new file mode 100644 index 0000000..e59456d --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_27.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_28.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_28.xz new file mode 100644 index 0000000..92d2d23 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_28.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_29.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_29.xz new file mode 100644 index 0000000..f08353b --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_29.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_3.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_3.xz new file mode 100644 index 0000000..4ec99f5 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_3.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_30.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_30.xz new file mode 100644 index 0000000..0cd1f58 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_30.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_31.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_31.xz new file mode 100644 index 0000000..e80afc2 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_31.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_32.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_32.xz new file mode 100644 index 0000000..7a1b990 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_32.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_33.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_33.xz new file mode 100644 index 0000000..33ec324 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_33.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_34.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_34.xz new file mode 100644 index 0000000..909cb75 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_34.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_35.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_35.xz new file mode 100644 index 0000000..c48d80d --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_35.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_36.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_36.xz new file mode 100644 index 0000000..a30c5a4 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_36.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_37.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_37.xz new file mode 100644 index 0000000..aea2dac --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_37.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_38.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_38.xz new file mode 100644 index 0000000..ff17aa1 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_38.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_39.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_39.xz new file mode 100644 index 0000000..66c78bb --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_39.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_4.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_4.xz new file mode 100644 index 0000000..2efa4f8 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_4.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_40.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_40.xz new file mode 100644 index 0000000..c5fda88 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_40.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_41.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_41.xz new file mode 100644 index 0000000..55903d4 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_41.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_42.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_42.xz new file mode 100644 index 0000000..a217920 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_42.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_43.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_43.xz new file mode 100644 index 0000000..48de5db --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_43.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_44.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_44.xz new file mode 100644 index 0000000..2fc22bb --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_44.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_45.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_45.xz new file mode 100644 index 0000000..3d89783 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_45.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_46.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_46.xz new file mode 100644 index 0000000..5a2bcef --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_46.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_47.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_47.xz new file mode 100644 index 0000000..dbcf120 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_47.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_48.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_48.xz new file mode 100644 index 0000000..d6c796d --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_48.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_49.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_49.xz new file mode 100644 index 0000000..8cc5bfc --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_49.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_5.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_5.xz new file mode 100644 index 0000000..4932440 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_5.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_6.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_6.xz new file mode 100644 index 0000000..f46c96a --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_6.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_7.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_7.xz new file mode 100644 index 0000000..b69773b --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_7.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_8.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_8.xz new file mode 100644 index 0000000..f58dd1f --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_8.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_9.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_9.xz new file mode 100644 index 0000000..bf0855d --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/malformed_file_9.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_0.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_0.xz new file mode 100644 index 0000000..d98f97d --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_0.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_1.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_1.xz new file mode 100644 index 0000000..8f3ae7c --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_1.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_10.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_10.xz new file mode 100644 index 0000000..e988570 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_10.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_11.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_11.xz new file mode 100644 index 0000000..f72ced3 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_11.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_12.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_12.xz new file mode 100644 index 0000000..bbf10ed --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_12.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_13.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_13.xz new file mode 100644 index 0000000..cc10249 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_13.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_14.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_14.xz new file mode 100644 index 0000000..d7213e8 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_14.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_15.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_15.xz new file mode 100644 index 0000000..85c2aca --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_15.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_16.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_16.xz new file mode 100644 index 0000000..8497a7f --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_16.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_17.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_17.xz new file mode 100644 index 0000000..bd317cf --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_17.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_18.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_18.xz new file mode 100644 index 0000000..ce70c15 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_18.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_19.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_19.xz new file mode 100644 index 0000000..e293111 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_19.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_2.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_2.xz new file mode 100644 index 0000000..4e7f29b --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_2.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_20.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_20.xz new file mode 100644 index 0000000..78d85c3 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_20.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_21.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_21.xz new file mode 100644 index 0000000..edeacb8 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_21.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_22.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_22.xz new file mode 100644 index 0000000..9daaf2b --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_22.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_23.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_23.xz new file mode 100644 index 0000000..257114a --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_23.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_24.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_24.xz new file mode 100644 index 0000000..c5bd012 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_24.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_25.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_25.xz new file mode 100644 index 0000000..2ad0b40 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_25.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_26.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_26.xz new file mode 100644 index 0000000..f6adb26 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_26.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_27.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_27.xz new file mode 100644 index 0000000..9cf5c3e --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_27.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_28.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_28.xz new file mode 100644 index 0000000..dcc695f --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_28.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_29.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_29.xz new file mode 100644 index 0000000..9cc51a6 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_29.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_3.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_3.xz new file mode 100644 index 0000000..38b3ec0 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_3.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_30.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_30.xz new file mode 100644 index 0000000..8a2478f --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_30.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_31.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_31.xz new file mode 100644 index 0000000..f3c90dc --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_31.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_32.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_32.xz new file mode 100644 index 0000000..6f51eee --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_32.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_33.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_33.xz new file mode 100644 index 0000000..b7eef75 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_33.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_34.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_34.xz new file mode 100644 index 0000000..9346468 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_34.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_35.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_35.xz new file mode 100644 index 0000000..3769bb0 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_35.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_36.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_36.xz new file mode 100644 index 0000000..b6a7ebd --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_36.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_37.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_37.xz new file mode 100644 index 0000000..44dfb0b --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_37.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_38.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_38.xz new file mode 100644 index 0000000..ea9da12 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_38.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_39.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_39.xz new file mode 100644 index 0000000..515aa56 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_39.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_4.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_4.xz new file mode 100644 index 0000000..3d91dec --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_4.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_40.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_40.xz new file mode 100644 index 0000000..f5f53cf --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_40.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_41.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_41.xz new file mode 100644 index 0000000..5dbda34 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_41.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_42.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_42.xz new file mode 100644 index 0000000..61b0def --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_42.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_43.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_43.xz new file mode 100644 index 0000000..f0f46d9 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_43.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_44.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_44.xz new file mode 100644 index 0000000..3cee216 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_44.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_45.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_45.xz new file mode 100644 index 0000000..2c70224 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_45.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_46.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_46.xz new file mode 100644 index 0000000..ad55ab4 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_46.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_47.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_47.xz new file mode 100644 index 0000000..1ca131c --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_47.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_48.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_48.xz new file mode 100644 index 0000000..9b23ed0 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_48.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_49.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_49.xz new file mode 100644 index 0000000..2456be1 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_49.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_5.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_5.xz new file mode 100644 index 0000000..6e788b5 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_5.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_6.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_6.xz new file mode 100644 index 0000000..991bc19 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_6.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_7.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_7.xz new file mode 100644 index 0000000..9e4a0e6 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_7.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_8.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_8.xz new file mode 100644 index 0000000..259aa93 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_8.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_9.xz b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_9.xz new file mode 100644 index 0000000..29b2384 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_corpus/valid_file_9.xz Binary files differ
diff --git a/fuzzing/llm/xz_fuzzer/xz_decoder_fuzzer.cpp b/fuzzing/llm/xz_fuzzer/xz_decoder_fuzzer.cpp new file mode 100644 index 0000000..61c4d03 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_decoder_fuzzer.cpp
@@ -0,0 +1,50 @@ +#include <fuzzer/FuzzedDataProvider.h> +#include "xz.h" + +constexpr size_t kMinSize = 0; +constexpr size_t kMaxSize = 1000; + +// Function to initialize xz_dec structure using xz_dec_init +struct xz_dec *init_xz_dec(FuzzedDataProvider& stream) { + // Randomly select a mode from the xz_mode enum + const std::array<enum xz_mode, 3> modes = {XZ_SINGLE, XZ_PREALLOC, XZ_DYNALLOC}; + enum xz_mode mode = stream.PickValueInArray(modes); + + // Generate a random dict_max value + uint32_t dict_max = + stream.ConsumeIntegralInRange<uint32_t>(kMinSize, kMaxSize); + + // Initialize the xz_dec structure + struct xz_dec *s = xz_dec_init(mode, dict_max); + + return s; +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + FuzzedDataProvider stream(data, size); + + // Initialize xz_dec structure + struct xz_dec *s = init_xz_dec(stream); + + // Initialize xz_buf structure + struct xz_buf b; + size_t in_buffer_size = stream.ConsumeIntegralInRange<size_t>(0, size); + std::vector<uint8_t> in_buffer(in_buffer_size); + for (size_t i = 0; i < in_buffer_size; ++i) { + in_buffer[i] = stream.ConsumeIntegral<uint8_t>(); + } + b.in = in_buffer.data(); + b.in_pos = 0; + b.in_size = in_buffer_size; + + size_t out_buffer_size = stream.ConsumeIntegralInRange<size_t>(0, size); + std::vector<uint8_t> out_buffer(out_buffer_size); + b.out = out_buffer.data(); + b.out_pos = 0; + b.out_size = out_buffer_size; + + // Call the function under test + xz_ret result = xz_dec_run(s, &b); + + return 0; // Non-zero return values are usually reserved for fatal errors +}
diff --git a/fuzzing/llm/xz_fuzzer/xz_fuzzer.dict b/fuzzing/llm/xz_fuzzer/xz_fuzzer.dict new file mode 100644 index 0000000..4272941 --- /dev/null +++ b/fuzzing/llm/xz_fuzzer/xz_fuzzer.dict
@@ -0,0 +1,10 @@ +fd377a585a00 +00 +01 +02 +05 +10 +00000000 +ffffffff +00 +ff
diff --git a/fuzzing/measure_sandbox/Android.bp b/fuzzing/measure_sandbox/Android.bp new file mode 100644 index 0000000..22bac0b --- /dev/null +++ b/fuzzing/measure_sandbox/Android.bp
@@ -0,0 +1,20 @@ +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_binary { + name: "measure_sandbox", + srcs: [ + "measure_sandbox.cpp", + ], + include_dirs: [ + "system/core/libcutils/include/private/", + ], + static_libs: [ + "libselinux", + ], + shared_libs: [ + "libseccomp_policy", + ], + host_supported: false, +}
diff --git a/fuzzing/measure_sandbox/measure_sandbox.cpp b/fuzzing/measure_sandbox/measure_sandbox.cpp new file mode 100644 index 0000000..79684fc --- /dev/null +++ b/fuzzing/measure_sandbox/measure_sandbox.cpp
@@ -0,0 +1,124 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed 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. + */ + +#include <fcntl.h> +#include <grp.h> +#include <selinux/selinux.h> +#include <signal.h> +#include <stdio.h> +#include <string.h> +#include <sys/prctl.h> +#include <unistd.h> + +#include "android_filesystem_config.h" +#include "seccomp_policy.h" + +static bool set_groups(const gid_t gid) { + const gid_t groups[] = {gid, AID_EVERYBODY, AID_MISC}; + const size_t num_groups = sizeof(groups) / sizeof(gid_t); + + if (setgroups(num_groups, groups) != 0) { + fprintf(stderr, "setgroups failed\n"); + return false; + } + + if (setresgid(gid, gid, gid) != 0) { + fprintf(stderr, "setresgid failed\n"); + return false; + } + + return true; +} + +static bool set_user(const uid_t uid) { + if (setresuid(uid, uid, uid) != 0) { + fprintf(stderr, "setresuid failed\n"); + return false; + } + + if (prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0)) { + fprintf(stderr, "prctl failed\n"); + return false; + } + + return true; +} + +static bool enter_app_sandbox() { + if (!set_groups(AID_APP_START)) { + return false; + } + + if (!set_app_seccomp_filter()) { + return false; + } + + if (!set_user(AID_APP_START)) { + return false; + }; + + // TODO: figure out the correct value or make this configurable. + setcon("u:r:untrusted_app:s0:c512,c768"); + + return true; +} + +static bool enter_system_sandbox() { + if (!set_groups(AID_SYSTEM)) { + return false; + } + + if (!set_system_seccomp_filter()) { + return false; + } + + if (!set_user(AID_SYSTEM)) { + return false; + }; + + return true; +} + +void print_usage(char** argv) { + fprintf(stderr, "usage: %s <app|system> <file>\n", argv[0]); +} + +int main(int argc, char** argv) { + if (argc != 3) { + print_usage(argv); + return 1; + } + + if (!strcmp(argv[1], "app")) { + if (!enter_app_sandbox()) { + return 1; + } + } else if (!strcmp(argv[1], "system")) { + if (!enter_system_sandbox()) { + return 1; + } + } else { + print_usage(argv); + return 1; + } + + if (open(argv[2], O_RDONLY) == -1) { + fprintf(stderr, "failed to open %s\n", argv[2]); + return 1; + } + + return 0; +}
diff --git a/fuzzing/orphans/android_logger/android_logger_fuzzer.rs b/fuzzing/orphans/android_logger/android_logger_fuzzer.rs index 94dcee6..2509ba9 100644 --- a/fuzzing/orphans/android_logger/android_logger_fuzzer.rs +++ b/fuzzing/orphans/android_logger/android_logger_fuzzer.rs
@@ -30,6 +30,18 @@ } } +impl From<LevelInput> for LevelFilter { + fn from(l: LevelInput) -> LevelFilter { + match l { + LevelInput::Error => LevelFilter::Error, + LevelInput::Warn => LevelFilter::Warn, + LevelInput::Info => LevelFilter::Info, + LevelInput::Debug => LevelFilter::Debug, + LevelInput::Trace => LevelFilter::Trace, + } + } +} + #[derive(Arbitrary, Debug)] pub enum LevelFilterInput { Off, @@ -96,9 +108,9 @@ fn from(config_input: ConfigInput) -> Config { Config::default() .with_filter(config_input.get_filter()) - .with_min_level(config_input.log_level.into()) + .with_max_level(config_input.log_level.into()) .with_tag(config_input.tag) - .with_log_id(config_input.log_id.into()) + .with_log_buffer(config_input.log_id.into()) } }
diff --git a/fuzzing/orphans/libcppbor/Android.bp b/fuzzing/orphans/libcppbor/Android.bp index 3bb20f9..39f4b91 100644 --- a/fuzzing/orphans/libcppbor/Android.bp +++ b/fuzzing/orphans/libcppbor/Android.bp
@@ -22,7 +22,7 @@ "cppbor_fuzzer.cpp", ], shared_libs: [ - "libcppbor_external", + "libcppbor", ], host_supported: true, } @@ -33,7 +33,7 @@ "cppbor_parse_fuzzer.cpp", ], shared_libs: [ - "libcppbor_external", + "libcppbor", ], corpus: ["corpus/*.cbor"], host_supported: true,
diff --git a/fuzzing/orphans/libskia/Android.bp b/fuzzing/orphans/libskia/Android.bp index cce7ba3..128d0fc 100644 --- a/fuzzing/orphans/libskia/Android.bp +++ b/fuzzing/orphans/libskia/Android.bp
@@ -24,7 +24,6 @@ static_libs: [ "libskia", "libarect", - "libsfntly", "libwebp-decode", "libwebp-encode", "libwuffs_mirror_release_c",
diff --git a/fuzzing/orphans/pppd/Android.bp b/fuzzing/orphans/pppd/Android.bp deleted file mode 100644 index e2b4dc0..0000000 --- a/fuzzing/orphans/pppd/Android.bp +++ /dev/null
@@ -1,35 +0,0 @@ -package { - default_applicable_licenses: ["Android-Apache-2.0"], -} - -cc_fuzz { - name: "eap_pppd_fuzz", - - srcs: [ - "eap_fuzz.proto", - "eap_fuzz.cc", - "eap_fuzz_Cproxy.c", - ], - - static_libs: [ - "libprotobuf-mutator", - "libpppd", - ], - shared_libs: [ - "libprotobuf-cpp-full", - "libdl", - "liblog", - "libcutils", - "libcrypto", - ], - - cflags: [ - "-Wno-unused-parameter", - ], - - ldflags: ["-rdynamic"], - required: [ - "pppol2tp-android", - "pppopptp-android", - ], -}
diff --git a/fuzzing/orphans/pppd/eap_fuzz.cc b/fuzzing/orphans/pppd/eap_fuzz.cc deleted file mode 100644 index 5372e15..0000000 --- a/fuzzing/orphans/pppd/eap_fuzz.cc +++ /dev/null
@@ -1,215 +0,0 @@ -#include <stdint.h> -extern "C" { -#include "eap_fuzz_Cproxy.h" -} - -#include <src/libfuzzer/libfuzzer_macro.h> -#include "eap_fuzz.pb.h" - -#define S_MALLOC(var, size) \ -do { \ - if ((var = (uint8_t *)malloc(size)) == NULL) { \ - return; \ - } \ -} while(0) - -void write_header(uint8_t *packet, uint16_t data_size, uint8_t type) -{ - data_size += EAP_HEADERLEN; - //the packet type - *(packet)++ = type&0xff; - //id - *(packet)++ = 0x0; - //the length as big endian short - *(packet)++ = ((data_size >> 8)&0xff); - *(packet)++ = data_size&0xff; -} - -DEFINE_BINARY_PROTO_FUZZER(const eap_fuzz::proto::PacketSet &packets){ - init(); - - for(const eap_fuzz::proto::Packet& packet: packets.packets()){ - uint8_t *fuzz_packet = NULL; - size_t packet_len = 0; - std::string data = ""; - uint8_t packet_type = -1; - switch(packet.PacketType_case()){ - case eap_fuzz::proto::Packet::kEapRequest: { - packet_type = EAP_REQUEST; - uint8_t eap_request_type = -1; - auto eap_request = packet.eap_request(); - switch(eap_request.EapRequestType_case()){ - case eap_fuzz::proto::EapRequest::kIdentity: { - eap_request_type = EAPT_IDENTITY; - data = eap_request.identity().data(); - S_MALLOC(fuzz_packet, data.size()+EAP_HEADERLEN+1); - break; - } - case eap_fuzz::proto::EapRequest::kNotification: { - eap_request_type = EAPT_NOTIFICATION; - data = eap_request.notification().data(); - S_MALLOC(fuzz_packet, data.size()+EAP_HEADERLEN+1); - break; - } - case eap_fuzz::proto::EapRequest::kMd5Chap: { - eap_request_type = EAPT_MD5CHAP; - data = eap_request.md5chap().data(); - S_MALLOC(fuzz_packet, data.size()+EAP_HEADERLEN+1); - break; - } - case eap_fuzz::proto::EapRequest::kSrp: { - auto request_srp = eap_request.srp(); - eap_request_type = EAPT_SRP; - uint8_t srp_type = -1; - switch(request_srp.EspMessage_case()){ - case eap_fuzz::proto::EaptRequestSRP::kSrpChallenge:{ - data = request_srp.srp_challenge().data(); - srp_type = EAPSRP_CHALLENGE; - break; - } - case eap_fuzz::proto::EaptRequestSRP::kSrpValidator:{ - data = request_srp.srp_validator().data(); - srp_type = EAPSRP_SVALIDATOR; - break; - } - case eap_fuzz::proto::EaptRequestSRP::kSrpKey:{ - data = request_srp.srp_key().data(); - srp_type = EAPSRP_SKEY; - break; - } - case eap_fuzz::proto::EaptRequestSRP::kSrpLwreChallenge:{ - data = request_srp.srp_lwre_challenge().data(); - srp_type = EAPSRP_LWRECHALLENGE; - break; - } - case eap_fuzz::proto::EaptRequestSRP::ESPMESSAGE_NOT_SET:{ - return; - } - - } - S_MALLOC(fuzz_packet, data.size()+EAP_HEADERLEN+2); - *(fuzz_packet+EAP_HEADERLEN+1) = srp_type; - packet_len++; - break; - } - case eap_fuzz::proto::EapRequest::EAPREQUESTTYPE_NOT_SET: { - return; - } - } - *(fuzz_packet+EAP_HEADERLEN) = eap_request_type; - ++packet_len; - break; - } - - case eap_fuzz::proto::Packet::kEapResponse: { - packet_type = EAP_RESPONSE; - auto eap_response = packet.eap_response(); - uint8_t eap_response_type = -1; - switch(eap_response.EapResponseType_case()){ - case eap_fuzz::proto::EapResponse::kIdentity: { - eap_response_type = EAPT_IDENTITY; - data = eap_response.identity().data(); - S_MALLOC(fuzz_packet, data.size()+EAP_HEADERLEN+1); - break; - } - case eap_fuzz::proto::EapResponse::kNotification: { - eap_response_type = EAPT_NOTIFICATION; - data = eap_response.notification().data(); - S_MALLOC(fuzz_packet, data.size()+EAP_HEADERLEN+1); - break; - } - case eap_fuzz::proto::EapResponse::kMd5Chap: { - eap_response_type = EAPT_MD5CHAP; - data = eap_response.md5chap().data(); - S_MALLOC(fuzz_packet, data.size()+EAP_HEADERLEN+1); - break; - } - case eap_fuzz::proto::EapResponse::kNak: { - eap_response_type = EAPT_NAK; - auto response_nak = eap_response.nak(); - uint8_t nak_type = -1; - switch(response_nak.EaptResponseNAKType_case()){ - case eap_fuzz::proto::EaptResponseNAK::kSrp:{ - nak_type = EAPT_SRP; - break; - - } - case eap_fuzz::proto::EaptResponseNAK::kMd5Chap:{ - nak_type = EAPT_MD5CHAP; - break; - - } - case eap_fuzz::proto::EaptResponseNAK::EAPTRESPONSENAKTYPE_NOT_SET:{ - return; - } - } - S_MALLOC(fuzz_packet, data.size()+EAP_HEADERLEN+2); - *(fuzz_packet+EAP_HEADERLEN+1) = nak_type; - packet_len++; - break; - } - case eap_fuzz::proto::EapResponse::kSrp: { - auto response_srp = eap_response.srp(); - eap_response_type = EAPT_SRP; - uint8_t srp_type = -1; - switch(response_srp.EspMessage_case()){ - case eap_fuzz::proto::EaptResponseSRP::kSrpChallenge:{ - data = response_srp.srp_challenge().data(); - srp_type = EAPSRP_LWRECHALLENGE; - break; - } - case eap_fuzz::proto::EaptResponseSRP::kSrpCvalidator:{ - data = response_srp.srp_cvalidator().data(); - srp_type = EAPSRP_CVALIDATOR; - break; - } - case eap_fuzz::proto::EaptResponseSRP::kSrpCkey:{ - data = response_srp.srp_ckey().data(); - srp_type = EAPSRP_CKEY; - break; - } - case eap_fuzz::proto::EaptResponseSRP::kSrpAck:{ - data = response_srp.srp_ack().data(); - srp_type = EAPSRP_ACK; - break; - } - case eap_fuzz::proto::EaptResponseSRP::ESPMESSAGE_NOT_SET:{ - return; - } - - } - S_MALLOC(fuzz_packet, data.size()+EAP_HEADERLEN+2); - *(fuzz_packet+EAP_HEADERLEN+1) = srp_type; - packet_len++; - break; - } - case eap_fuzz::proto::EapResponse::EAPRESPONSETYPE_NOT_SET: { - return; - } - } - *(fuzz_packet+EAP_HEADERLEN) = eap_response_type; - ++packet_len; - break; - } - case eap_fuzz::proto::Packet::kEapSuccess: { - packet_type = EAP_SUCCESS; - data = packet.eap_success().data(); - S_MALLOC(fuzz_packet, data.size()+EAP_HEADERLEN); - break; - } - case eap_fuzz::proto::Packet::kEapFailure: { - packet_type = EAP_FAILURE; - data = packet.eap_failure().data(); - S_MALLOC(fuzz_packet, data.size()+EAP_HEADERLEN); - break; - } - case eap_fuzz::proto::Packet::PACKETTYPE_NOT_SET: { - return; - } - } - write_header(fuzz_packet, data.size()+packet_len, packet_type); - memcpy(fuzz_packet+EAP_HEADERLEN+packet_len, data.data(), data.size()); - proxy_packet(fuzz_packet, data.size()+EAP_HEADERLEN+packet_len); - free(fuzz_packet); - } -}
diff --git a/fuzzing/orphans/pppd/eap_fuzz.proto b/fuzzing/orphans/pppd/eap_fuzz.proto deleted file mode 100644 index 6d41214..0000000 --- a/fuzzing/orphans/pppd/eap_fuzz.proto +++ /dev/null
@@ -1,133 +0,0 @@ -syntax = "proto2"; -package eap_fuzz.proto; - -message PacketSet{ - repeated Packet packets = 1; -} - -message Packet{ - oneof PacketType { - EapRequest eap_request = 1; - EapResponse eap_response = 2; - EapSuccess eap_success = 3; - EapFailure eap_failure = 4; - } -} - -message EapRequest{ - oneof EapRequestType{ - EaptRequestIdentity identity = 1; - EsptRequestNotification notification = 2; - EaptRequestMD5Chap md5chap = 3; - EaptRequestSRP srp = 4; - } - -} - -message EaptRequestIdentity{ - required bytes data = 1; -} - -message EsptRequestNotification{ - required bytes data = 1; -} - -message EaptRequestMD5Chap{ - required bytes data = 2; -} -message EaptRequestSRP{ - oneof EspMessage { - EapRequestSRPChallenge srp_challenge = 1; - EapRequestSRPKey srp_key = 2; - EapRequestSRPValidator srp_validator = 3; - EapRequestSRPLWREChallenge srp_lwre_challenge = 4; - } -} - -message EapRequestSRPChallenge{ - required bytes data = 1; -} - -message EapRequestSRPKey{ - required bytes data = 1; -} - -message EapRequestSRPValidator { - required bytes data = 1; -} - -message EapRequestSRPLWREChallenge{ - required bytes data = 1; -} - -message EapResponse{ - oneof EapResponseType{ - EaptResponseIdentity identity = 1; - EsptResponseNotification notification = 2; - EaptResponseNAK nak = 3; - EaptResponseMD5Chap md5chap = 4; - EaptResponseSRP srp = 5; - } -} - -message EaptResponseIdentity{ - required bytes data = 1; -} - -message EsptResponseNotification{ - required bytes data = 1; -} - -message EaptResponseNAK{ - oneof EaptResponseNAKType{ - EaptResponseNAKSRP srp = 1; - EaptResponseNAKMD5Chap md5_chap = 2; - } -} - - -message EaptResponseNAKSRP{ - required bytes data = 1; -} - -message EaptResponseNAKMD5Chap { - required bytes data = 1; -} - -message EaptResponseMD5Chap { - required bytes data = 1; -} - -message EaptResponseSRP{ - oneof EspMessage { - EapResponseSRPCKey srp_ckey = 1; - EapResponseSRPCValidator srp_cvalidator = 2; - EapResponseSRPACK srp_ack = 3; - EapResponseSRPLWEChallenge srp_challenge = 4; - } -} - -message EapResponseSRPCKey { - required bytes data = 1; -} - -message EapResponseSRPCValidator{ - required bytes data = 1; -} - -message EapResponseSRPACK{ - required bytes data = 1; -} - -message EapResponseSRPLWEChallenge{ - required bytes data = 1; -} - -message EapSuccess{ - required bytes data = 1; -} - -message EapFailure{ - required bytes data = 1; -} -
diff --git a/fuzzing/orphans/pppd/eap_fuzz_Cproxy.c b/fuzzing/orphans/pppd/eap_fuzz_Cproxy.c deleted file mode 100644 index e2b7d98..0000000 --- a/fuzzing/orphans/pppd/eap_fuzz_Cproxy.c +++ /dev/null
@@ -1,28 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <stdint.h> -#include <pwd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <assert.h> -#include <errno.h> - -#include "pppd.h" -#include "pathnames.h" -#include "md5.h" -#include "eap.h" -#include "magic.h" - -void init() -{ - eap_protent.init(0); -} - - -void proxy_packet(uint8_t *data, int len) -{ - eap_protent.input(0, data, len); -}
diff --git a/fuzzing/orphans/pppd/eap_fuzz_Cproxy.h b/fuzzing/orphans/pppd/eap_fuzz_Cproxy.h deleted file mode 100644 index 6846f5e..0000000 --- a/fuzzing/orphans/pppd/eap_fuzz_Cproxy.h +++ /dev/null
@@ -1,56 +0,0 @@ -//from pppd.h, can't include it directly in the fuzzer because C -> C++ issues -#define EAP_HEADERLEN 4 - -/* EAP message codes. */ -#define EAP_REQUEST 1 -#define EAP_RESPONSE 2 -#define EAP_SUCCESS 3 -#define EAP_FAILURE 4 - -/* EAP types */ -#define EAPT_IDENTITY 1 -#define EAPT_NOTIFICATION 2 -#define EAPT_NAK 3 /* (response only) */ -#define EAPT_MD5CHAP 4 -#define EAPT_OTP 5 /* One-Time Password; RFC 1938 */ -#define EAPT_TOKEN 6 /* Generic Token Card */ -/* 7 and 8 are unassigned. */ -#define EAPT_RSA 9 /* RSA Public Key Authentication */ -#define EAPT_DSS 10 /* DSS Unilateral */ -#define EAPT_KEA 11 /* KEA */ -#define EAPT_KEA_VALIDATE 12 /* KEA-VALIDATE */ -#define EAPT_TLS 13 /* EAP-TLS */ -#define EAPT_DEFENDER 14 /* Defender Token (AXENT) */ -#define EAPT_W2K 15 /* Windows 2000 EAP */ -#define EAPT_ARCOT 16 /* Arcot Systems */ -#define EAPT_CISCOWIRELESS 17 /* Cisco Wireless */ -#define EAPT_NOKIACARD 18 /* Nokia IP smart card */ -#define EAPT_SRP 19 /* Secure Remote Password */ -/* 20 is deprecated */ - -/* EAP SRP-SHA1 Subtypes */ -#define EAPSRP_CHALLENGE 1 /* Request 1 - Challenge */ -#define EAPSRP_CKEY 1 /* Response 1 - Client Key */ -#define EAPSRP_SKEY 2 /* Request 2 - Server Key */ -#define EAPSRP_CVALIDATOR 2 /* Response 2 - Client Validator */ -#define EAPSRP_SVALIDATOR 3 /* Request 3 - Server Validator */ -#define EAPSRP_ACK 3 /* Response 3 - final ack */ -#define EAPSRP_LWRECHALLENGE 4 /* Req/resp 4 - Lightweight rechal */ - -#define SRPVAL_EBIT 0x00000001 /* Use shared key for ECP */ - -#define SRP_PSEUDO_ID "pseudo_" -#define SRP_PSEUDO_LEN 7 - -#define MD5_SIGNATURE_SIZE 16 -#define MIN_CHALLENGE_LENGTH 16 -#define MAX_CHALLENGE_LENGTH 24 - -void init(); -void proxy_packet(uint8_t *data, int len); - -//override output so we don't write to a broken fd -void output (int unit, unsigned char *p, int len) -{ - -}
diff --git a/fuzzing/presubmit_test_fuzzers/Android.bp b/fuzzing/presubmit_test_fuzzers/Android.bp new file mode 100644 index 0000000..b7f923a --- /dev/null +++ b/fuzzing/presubmit_test_fuzzers/Android.bp
@@ -0,0 +1,36 @@ +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_fuzz { + name: "test_fuzzer_1", + srcs: [ + "test_fuzzer_1.cpp", + "test_code.cpp" + ], + host_supported: true, + fuzz_config: { + description: "Test Fuzzer 1", + critical: false, + fuzz_on_haiku_device: true, + fuzz_on_haiku_host: true, + triage_assignee: "[email protected]", + use_for_presubmit: true, + }, +} +cc_fuzz { + name: "test_fuzzer_2", + srcs: [ + "test_fuzzer_2.cpp", + "test_code.cpp" + ], + host_supported: true, + fuzz_config: { + description: "Test Fuzzer 2", + critical: false, + fuzz_on_haiku_device: true, + fuzz_on_haiku_host: true, + triage_assignee: "[email protected]", + use_for_presubmit: true, + }, +} \ No newline at end of file
diff --git a/fuzzing/presubmit_test_fuzzers/test_code.cpp b/fuzzing/presubmit_test_fuzzers/test_code.cpp new file mode 100644 index 0000000..0548d6f --- /dev/null +++ b/fuzzing/presubmit_test_fuzzers/test_code.cpp
@@ -0,0 +1,14 @@ +#include <string.h> +#include <stdlib.h> + +void BuggyCode1(const char *data) { + if (strcmp(data, "Hi!") == 0) { + abort(); // Boom! + } +} + +void BuggyCode2(const char *data) { + if (strcmp(data, "Hey") == 0) { + abort(); // Boom! + } +} \ No newline at end of file
diff --git a/fuzzing/presubmit_test_fuzzers/test_fuzzer_1.cpp b/fuzzing/presubmit_test_fuzzers/test_fuzzer_1.cpp new file mode 100644 index 0000000..19692f6 --- /dev/null +++ b/fuzzing/presubmit_test_fuzzers/test_fuzzer_1.cpp
@@ -0,0 +1,30 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed 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. + */ + +#include <stddef.h> +#include <stdint.h> +#include <string.h> +#include <string> + +void BuggyCode1(const char *data); + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + std::string null_terminated_string(reinterpret_cast<const char *>(data), + size); + + BuggyCode1(null_terminated_string.c_str()); + return 0; +}
diff --git a/fuzzing/presubmit_test_fuzzers/test_fuzzer_2.cpp b/fuzzing/presubmit_test_fuzzers/test_fuzzer_2.cpp new file mode 100644 index 0000000..2eb41e5 --- /dev/null +++ b/fuzzing/presubmit_test_fuzzers/test_fuzzer_2.cpp
@@ -0,0 +1,30 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed 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. + */ + +#include <stddef.h> +#include <stdint.h> +#include <string.h> +#include <string> + +void BuggyCode2(const char *data); + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + std::string null_terminated_string(reinterpret_cast<const char *>(data), + size); + + BuggyCode2(null_terminated_string.c_str()); + return 0; +}
diff --git a/fuzzing/system_fuzzers/libcrypto_utils/libcrypto_utils_fuzzer.cpp b/fuzzing/system_fuzzers/libcrypto_utils/libcrypto_utils_fuzzer.cpp index cc40a3b..ef1727b 100644 --- a/fuzzing/system_fuzzers/libcrypto_utils/libcrypto_utils_fuzzer.cpp +++ b/fuzzing/system_fuzzers/libcrypto_utils/libcrypto_utils_fuzzer.cpp
@@ -20,6 +20,7 @@ #include <memory> #include <openssl/obj_mac.h> #include <openssl/rsa.h> +#include <cassert> #include <cstdio> #include <limits>
diff --git a/remote_provisioning/OWNERS b/remote_provisioning/OWNERS index 8f4b43f..ef855cb 100644 --- a/remote_provisioning/OWNERS +++ b/remote_provisioning/OWNERS
@@ -1,3 +1,5 @@ +# Bug component: 1084908 + [email protected] [email protected] [email protected]
diff --git a/remote_provisioning/hwtrust/Android.bp b/remote_provisioning/hwtrust/Android.bp index 64b10e9..a42bc27 100644 --- a/remote_provisioning/hwtrust/Android.bp +++ b/remote_provisioning/hwtrust/Android.bp
@@ -8,12 +8,22 @@ srcs: ["src/lib.rs"], rustlibs: [ "libanyhow", - "libthiserror", + "libbase64_rust", "libciborium", "libcoset", "libhex", - "libopenssl", + "libitertools", + "libserde_json", + "libthiserror", ], + target: { + host: { + rlibs: ["libopenssl_static"], + }, + android: { + rustlibs: ["libopenssl"], + } + }, } rust_library { @@ -51,6 +61,16 @@ rust_binary { name: "hwtrust", defaults: ["hwtrust_defaults"], + target: { + host: { + compile_multilib: "first", + dist: { + dir: "rkp/host", + targets: ["dist_files"], + }, + static_executable: true, + }, + } } rust_test {
diff --git a/remote_provisioning/hwtrust/Cargo.lock b/remote_provisioning/hwtrust/Cargo.lock index 12d91ba..8a5769a 100644 --- a/remote_provisioning/hwtrust/Cargo.lock +++ b/remote_provisioning/hwtrust/Cargo.lock
@@ -3,10 +3,28 @@ version = 3 [[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] name = "anyhow" version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" +dependencies = [ + "backtrace", +] [[package]] name = "autocfg" @@ -15,6 +33,27 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] +name = "backtrace" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + +[[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -34,9 +73,9 @@ [[package]] name = "ciborium" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" dependencies = [ "ciborium-io", "ciborium-ll", @@ -45,15 +84,15 @@ [[package]] name = "ciborium-io" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" [[package]] name = "ciborium-ll" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" dependencies = [ "ciborium-io", "half", @@ -98,15 +137,21 @@ [[package]] name = "coset" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604cb30f7b6f4fee05b9ddf88cf6d3c0af0f98d9099e6f6a050e81e7a7cb938b" +checksum = "99c214bbc5c8b4518856d79cae4d323feaa881ecf3e31b5af6572bb5313c11d5" dependencies = [ "ciborium", "ciborium-io", ] [[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] name = "errno" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -143,6 +188,12 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] +name = "gimli" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" + +[[package]] name = "half" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -174,11 +225,14 @@ version = "0.1.0" dependencies = [ "anyhow", + "base64", "ciborium", "clap", "coset", "hex", + "itertools", "openssl", + "serde_json", "thiserror", ] @@ -205,6 +259,21 @@ ] [[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] name = "libc" version = "0.2.139" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -217,6 +286,30 @@ checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" [[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + +[[package]] +name = "object" +version = "0.30.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +dependencies = [ + "memchr", +] + +[[package]] name = "once_cell" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -316,6 +409,12 @@ ] [[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] name = "rustix" version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -330,6 +429,12 @@ ] [[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] name = "serde" version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -350,6 +455,17 @@ ] [[package]] +name = "serde_json" +version = "1.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/remote_provisioning/hwtrust/Cargo.toml b/remote_provisioning/hwtrust/Cargo.toml index 7d01144..b304462 100644 --- a/remote_provisioning/hwtrust/Cargo.toml +++ b/remote_provisioning/hwtrust/Cargo.toml
@@ -8,11 +8,14 @@ edition = "2021" [dependencies] -anyhow = "1.0" +anyhow = { version = "1.0", features = ["backtrace"] } thiserror = "1.0" ciborium = "0.2.0" clap = { version = "4.1", features = ["derive"] } -coset = "0.3.3" +coset = { version = "0.3.5", features = ["std"] } hex = "0.4.3" openssl = "0.10.45" +serde_json = "1.0.96" +itertools = "0.10.5" +base64 = "0.21.0"
diff --git a/remote_provisioning/hwtrust/README.md b/remote_provisioning/hwtrust/README.md index 0ed2dcf..ed9fd47 100644 --- a/remote_provisioning/hwtrust/README.md +++ b/remote_provisioning/hwtrust/README.md
@@ -28,7 +28,18 @@ chain in a file, e.g. `chain.bin`, then call the tool. ```shell -hwtrust verify-dice-chain chain.bin +hwtrust dice-chain chain.bin ``` The exit code is zero if the chain passed verification and non-zero otherwise. + +### Verifying Factory Certificate Signing Requests + +The `rkp_factory_extraction_tool` is used in the manufacturing process to capture +a "CSR" that contains a full DICE chain and other device properties. The `factory-csr` +subcommand parses and validates the output of `rkp_factory_extraction_tool`. + + +```shell +hwtrust factory-csr csr.json +```
diff --git a/remote_provisioning/hwtrust/TEST_MAPPING b/remote_provisioning/hwtrust/TEST_MAPPING index 608acb5..875094c 100644 --- a/remote_provisioning/hwtrust/TEST_MAPPING +++ b/remote_provisioning/hwtrust/TEST_MAPPING
@@ -5,6 +5,27 @@ }, { "name": "ComposHostTestCases" + }, + { + "name": "libdiced_sample_inputs.integration_test" + }, + { + "name": "libdiced_sample_inputs_nostd.integration_test" + } + ], + "postsubmit": [ + { + "name": "libclient_vm_csr.test" + } + ], + "avf-presubmit": [ + { + "name": "rialto_test" + } + ], + "avf-postsubmit": [ + { + "name": "VtsHalRemotelyProvisionedComponentTargetTest" } ] }
diff --git a/remote_provisioning/hwtrust/cxxbridge/hwtrust.cpp b/remote_provisioning/hwtrust/cxxbridge/hwtrust.cpp index 9fd4e75..804b929 100644 --- a/remote_provisioning/hwtrust/cxxbridge/hwtrust.cpp +++ b/remote_provisioning/hwtrust/cxxbridge/hwtrust.cpp
@@ -25,6 +25,12 @@ case DiceChain::Kind::kVsr14: chainKind = rust::DiceChainKind::Vsr14; break; + case DiceChain::Kind::kVsr15: + chainKind = rust::DiceChainKind::Vsr15; + break; + case DiceChain::Kind::kVsr16: + chainKind = rust::DiceChainKind::Vsr16; + break; } auto res = rust::VerifyDiceChain({chain.data(), chain.size()}, chainKind); if (!res.error.empty()) { @@ -47,4 +53,8 @@ return result; } +bool DiceChain::IsProper() const noexcept { + return rust::IsDiceChainProper(*chain_->chain); +} + } // namespace hwtrust
diff --git a/remote_provisioning/hwtrust/cxxbridge/include/hwtrust/hwtrust.h b/remote_provisioning/hwtrust/cxxbridge/include/hwtrust/hwtrust.h index 548f10e..35c62b0 100644 --- a/remote_provisioning/hwtrust/cxxbridge/include/hwtrust/hwtrust.h +++ b/remote_provisioning/hwtrust/cxxbridge/include/hwtrust/hwtrust.h
@@ -15,6 +15,8 @@ enum class Kind { kVsr13, kVsr14, + kVsr15, + kVsr16, }; static android::base::Result<DiceChain> Verify(const std::vector<uint8_t>& chain, DiceChain::Kind kind) noexcept; @@ -24,6 +26,8 @@ android::base::Result<std::vector<std::vector<uint8_t>>> CosePublicKeys() const noexcept; + bool IsProper() const noexcept; + private: DiceChain(std::unique_ptr<BoxedDiceChain> chain, size_t size) noexcept;
diff --git a/remote_provisioning/hwtrust/cxxbridge/lib.rs b/remote_provisioning/hwtrust/cxxbridge/lib.rs index 1f3827a..203f1d2 100644 --- a/remote_provisioning/hwtrust/cxxbridge/lib.rs +++ b/remote_provisioning/hwtrust/cxxbridge/lib.rs
@@ -5,6 +5,7 @@ use hwtrust::dice::ChainForm; use hwtrust::session::{Options, Session}; +#[allow(unsafe_op_in_unsafe_fn)] #[cxx::bridge(namespace = "hwtrust::rust")] mod ffi { /// The set of validation rules to apply. @@ -13,6 +14,10 @@ Vsr13, /// The DICE chain specified by VSR 14. Vsr14, + /// The DICE chain specified by VSR 15. + Vsr15, + /// The DICE chain specified by VSR 16. + Vsr16, } /// The result type used by [`verify_dice_chain()`]. The standard [`Result`] is currently only @@ -35,6 +40,9 @@ #[cxx_name = GetDiceChainPublicKey] fn get_dice_chain_public_key(chain: &DiceChain, n: usize) -> Vec<u8>; + + #[cxx_name = IsDiceChainProper] + fn is_dice_chain_proper(chain: &DiceChain) -> bool; } } @@ -46,6 +54,8 @@ options: match kind { ffi::DiceChainKind::Vsr13 => Options::vsr13(), ffi::DiceChainKind::Vsr14 => Options::vsr14(), + ffi::DiceChainKind::Vsr15 => Options::vsr15(), + ffi::DiceChainKind::Vsr16 => Options::vsr16(), _ => { return ffi::VerifyDiceChainResult { error: "invalid chain kind".to_string(), @@ -85,3 +95,14 @@ } Vec::new() } + +fn is_dice_chain_proper(chain: &DiceChain) -> bool { + if let DiceChain(Some(chain)) = chain { + match chain { + ChainForm::Proper(_) => true, + ChainForm::Degenerate(_) => false, + } + } else { + false + } +}
diff --git a/remote_provisioning/hwtrust/src/cbor.rs b/remote_provisioning/hwtrust/src/cbor.rs index 987d62c..fe3fa88 100644 --- a/remote_provisioning/hwtrust/src/cbor.rs +++ b/remote_provisioning/hwtrust/src/cbor.rs
@@ -1,15 +1,13 @@ //! Handling for data represented as CBOR. Cryptographic objects are encoded following COSE. mod dice; +mod field_value; mod publickey; +pub(crate) mod rkp; use ciborium::{de::from_reader, value::Value}; use std::io::Read; -fn cose_error(ce: coset::CoseError) -> anyhow::Error { - anyhow::anyhow!("CoseError: {:?}", ce) -} - type CiboriumError = ciborium::de::Error<std::io::Error>; /// Decodes the provided binary CBOR-encoded value and returns a
diff --git a/remote_provisioning/hwtrust/src/cbor/dice.rs b/remote_provisioning/hwtrust/src/cbor/dice.rs index e35f7af..59c82ce 100644 --- a/remote_provisioning/hwtrust/src/cbor/dice.rs +++ b/remote_provisioning/hwtrust/src/cbor/dice.rs
@@ -1,7 +1,5 @@ //! Parsing and encoding DICE chain from and to CBOR. -use crate::cbor::cose_error; -use crate::session::{KeyOpsType, Session}; use anyhow::Result; use ciborium::value::Value; use coset::iana::{self, EnumI64}; @@ -9,22 +7,32 @@ mod chain; mod entry; -mod field_value; +mod profile; + +/// Type allowed for the COSE_Key object key_ops field in the DICE chain. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub(super) enum KeyOpsType { + /// The key_ops field must be an array as specified in the RFC 9052. + #[default] + Array, + /// The key_ops field can be either a single int or an array. + IntOrArray, +} /// Convert a `Value` into a `CoseKey`, respecting the `Session` options that might alter the /// validation rules for `CoseKey`s in the DICE chain. -fn cose_key_from_cbor_value(session: &Session, mut value: Value) -> Result<CoseKey> { - if session.options.dice_chain_key_ops_type == KeyOpsType::IntOrArray { +fn cose_key_from_cbor_value(mut value: Value, key_ops_type: KeyOpsType) -> Result<CoseKey> { + if key_ops_type == KeyOpsType::IntOrArray { // Convert any integer key_ops into an array of the same integer so that the coset library // can handle it. if let Value::Map(ref mut entries) = value { for (label, value) in entries.iter_mut() { - let label = Label::from_cbor_value(label.clone()).map_err(cose_error)?; + let label = Label::from_cbor_value(label.clone())?; if label == Label::Int(iana::KeyParameter::KeyOps.to_i64()) && value.is_integer() { *value = Value::Array(vec![value.clone()]); } } } } - CoseKey::from_cbor_value(value).map_err(cose_error) + Ok(CoseKey::from_cbor_value(value)?) }
diff --git a/remote_provisioning/hwtrust/src/cbor/dice/chain.rs b/remote_provisioning/hwtrust/src/cbor/dice/chain.rs index 1436f65..73ca7d3 100644 --- a/remote_provisioning/hwtrust/src/cbor/dice/chain.rs +++ b/remote_provisioning/hwtrust/src/cbor/dice/chain.rs
@@ -1,10 +1,10 @@ -use super::cose_key_from_cbor_value; -use super::entry::Entry; +use super::entry::{ConfigFormat, Entry}; +use super::{cose_key_from_cbor_value, KeyOpsType}; use crate::cbor::dice::entry::PayloadFields; use crate::cbor::value_from_bytes; -use crate::dice::{Chain, ChainForm, DegenerateChain, Payload}; +use crate::dice::{Chain, ChainForm, DegenerateChain, Payload, ProfileVersion}; use crate::publickey::PublicKey; -use crate::session::{ConfigFormat, Session}; +use crate::session::Session; use anyhow::{bail, Context, Result}; use ciborium::value::Value; @@ -12,7 +12,15 @@ /// Decode and validate a CBOR-encoded DICE chain. The form of chain is inferred from the /// structure of the data. pub fn from_cbor(session: &Session, bytes: &[u8]) -> Result<Self> { - let (root_public_key, it) = root_and_entries_from_cbor(session, bytes)?; + Self::from_value( + session, + value_from_bytes(bytes).context("Unable to decode top-level CBOR")?, + ) + } + + /// Similar to `from_cbor`, except it accepts an already-parsed Value instead of raw CBOR. + pub fn from_value(session: &Session, value: Value) -> Result<Self> { + let (root_public_key, it) = root_and_entries_from_value(session, value)?; if it.len() == 1 { // The chain could be degenerate so interpret it as such until it's seen to be more @@ -42,7 +50,16 @@ /// extracted. This does not perform any semantic validation of the data in the /// certificates such as the Authority, Config and Code hashes. pub fn from_cbor(session: &Session, bytes: &[u8]) -> Result<Self> { - let (root_public_key, it) = root_and_entries_from_cbor(session, bytes)?; + Self::from_value( + session, + value_from_bytes(bytes).context("Unable to decode top-level CBOR")?, + ) + } + + /// Decode and validate a Chain from a parsed CBOR Value. This is functionally similar + /// to `Self::from_cbor`, except that it accepts an already-parsed CBOR Value. + pub fn from_value(session: &Session, value: Value) -> Result<Self> { + let (root_public_key, it) = root_and_entries_from_value(session, value)?; Self::from_root_and_entries(session, root_public_key, it) } @@ -56,10 +73,13 @@ for (n, value) in values.enumerate() { let entry = Entry::verify_cbor_value(value, previous_public_key) .with_context(|| format!("Invalid entry at index {}", n))?; - let config_format = if n == 0 { - session.options.first_dice_chain_cert_config_format + let config_format = if n == 0 + && session.options.dice_profile_range.contains(ProfileVersion::Android14) + { + // Context: b/261647022 + ConfigFormat::AndroidOrIgnored } else { - ConfigFormat::Android + ConfigFormat::default() }; let payload = Payload::from_cbor(session, entry.payload(), config_format) .with_context(|| format!("Invalid payload at index {}", n))?; @@ -71,17 +91,22 @@ } } -fn root_and_entries_from_cbor( +fn root_and_entries_from_value( session: &Session, - bytes: &[u8], + value: Value, ) -> Result<(PublicKey, std::vec::IntoIter<Value>)> { - let value = value_from_bytes(bytes).context("Unable to decode top-level CBOR")?; let array = match value { Value::Array(array) if array.len() >= 2 => array, _ => bail!("Expected an array of at least length 2, found: {:?}", value), }; let mut it = array.into_iter(); - let root_public_key = cose_key_from_cbor_value(session, it.next().unwrap()) + let key_ops_type = if session.options.dice_profile_range.contains(ProfileVersion::Android13) { + // Context: b/262599829#comment65 + KeyOpsType::IntOrArray + } else { + KeyOpsType::default() + }; + let root_public_key = cose_key_from_cbor_value(it.next().unwrap(), key_ops_type) .context("Error parsing root public key CBOR")?; let root_public_key = PublicKey::from_cose_key(&root_public_key).context("Invalid root key")?; Ok((root_public_key, it)) @@ -91,12 +116,13 @@ mod tests { use super::*; use crate::cbor::serialize; - use crate::dice::{DiceMode, PayloadBuilder}; + use crate::dice::{ConfigDesc, DiceMode, PayloadBuilder}; use crate::publickey::testkeys::{PrivateKey, ED25519_KEY_PEM, P256_KEY_PEM, P384_KEY_PEM}; - use crate::session::{KeyOpsType, Options}; + use crate::session::Options; use ciborium::cbor; use coset::iana::{self, EnumI64}; use coset::AsCborValue; + use openssl::sha::sha512; use std::fs; #[test] @@ -124,6 +150,15 @@ } #[test] + fn check_chain_valid_ed25519_value() { + let chain = fs::read("testdata/dice/valid_ed25519.chain").unwrap(); + let chain = value_from_bytes(&chain).unwrap(); + let session = Session { options: Options::default() }; + let chain = Chain::from_value(&session, chain).unwrap(); + assert_eq!(chain.payloads().len(), 8); + } + + #[test] fn check_chain_valid_p256() { let chain = fs::read("testdata/dice/valid_p256.chain").unwrap(); let session = Session { options: Options::default() }; @@ -132,6 +167,21 @@ } #[test] + fn check_chain_valid_p256_value() { + let chain = fs::read("testdata/dice/valid_p256.chain").unwrap(); + let chain = value_from_bytes(&chain).unwrap(); + let session = Session { options: Options::default() }; + let chain = Chain::from_value(&session, chain).unwrap(); + assert_eq!(chain.payloads().len(), 3); + } + + #[test] + fn check_chain_wrong_value_type() { + let session = Session { options: Options::default() }; + Chain::from_value(&session, Value::Float(1.234)).unwrap_err(); + } + + #[test] fn check_chain_bad_p256() { let chain = fs::read("testdata/dice/bad_p256.chain").unwrap(); let session = Session { options: Options::default() }; @@ -199,12 +249,7 @@ let cbor = serialize(Value::Array(chain)); let session = Session { options: Options::default() }; Chain::from_cbor(&session, &cbor).unwrap_err(); - let session = Session { - options: Options { - dice_chain_key_ops_type: KeyOpsType::IntOrArray, - ..Options::default() - }, - }; + let session = Session { options: Options::vsr13() }; Chain::from_cbor(&session, &cbor).unwrap(); } @@ -239,11 +284,15 @@ } fn valid_payload(index: usize, key: PublicKey) -> Payload { + let config_desc = ConfigDesc::default(); + let config_hash = sha512(&serialize(config_desc.to_cbor_value())).to_vec(); PayloadBuilder::with_subject_public_key(key) .issuer(format!("item {}", index)) .subject(format!("item {}", index + 1)) .mode(DiceMode::Normal) .code_hash(vec![6; 64]) + .config_desc(config_desc) + .config_hash(Some(config_hash)) .authority_hash(vec![7; 64]) .build() .unwrap()
diff --git a/remote_provisioning/hwtrust/src/cbor/dice/entry.rs b/remote_provisioning/hwtrust/src/cbor/dice/entry.rs index 4170de5..1091728 100644 --- a/remote_provisioning/hwtrust/src/cbor/dice/entry.rs +++ b/remote_provisioning/hwtrust/src/cbor/dice/entry.rs
@@ -1,16 +1,19 @@ use super::cose_key_from_cbor_value; -use super::field_value::FieldValue; -use crate::cbor::{cose_error, value_from_bytes}; +use super::profile::{ComponentVersionType, ModeType, Profile}; +use crate::cbor::{field_value::FieldValue, value_from_bytes}; use crate::dice::{ ComponentVersion, ConfigDesc, ConfigDescBuilder, DiceMode, Payload, PayloadBuilder, + ProfileVersion, }; use crate::publickey::PublicKey; -use crate::session::{ComponentVersionType, ConfigFormat, ModeType, Session}; -use anyhow::{anyhow, bail, Context, Result}; +use crate::session::Session; +use anyhow::{anyhow, bail, ensure, Context, Result}; use ciborium::value::Value; use coset::{AsCborValue, CoseSign1}; +use openssl::sha::{sha256, sha384, sha512}; use std::collections::hash_map::Entry::{Occupied, Vacant}; use std::collections::HashMap; +use std::str::FromStr; const ISS: i64 = 1; const SUB: i64 = 2; @@ -31,6 +34,7 @@ const COMPONENT_VERSION: i64 = -70003; const RESETTABLE: i64 = -70004; const SECURITY_VERSION: i64 = -70005; +const RKP_VM_MARKER: i64 = -70006; pub(super) struct Entry { payload: Vec<u8>, @@ -39,9 +43,8 @@ impl Entry { pub(super) fn verify_cbor_value(cbor: Value, key: &PublicKey) -> Result<Self> { let sign1 = CoseSign1::from_cbor_value(cbor) - .map_err(cose_error) .context("Given CBOR does not appear to be a COSE_sign1")?; - key.verify_cose_sign1(&sign1).context("cannot verify COSE_sign1")?; + key.verify_cose_sign1(&sign1, b"").context("cannot verify COSE_sign1")?; match sign1.payload { None => bail!("Missing payload"), Some(payload) => Ok(Self { payload }), @@ -53,13 +56,32 @@ } } +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub(super) enum ConfigFormat { + /// The configuration descriptor format specified by Android. + #[default] + Android, + /// The configuration descriptor format is either that specified by Android or is ignored. + AndroidOrIgnored, +} + impl Payload { pub(super) fn from_cbor( session: &Session, bytes: &[u8], config_format: ConfigFormat, ) -> Result<Self> { - let f = PayloadFields::from_cbor(session, bytes, config_format)?; + let entries = cbor_map_from_slice(bytes)?; + let profile_version = PayloadFields::extract_profile_version(session, &entries)?; + Self::from_entries(&profile_version.into(), entries, config_format) + } + + fn from_entries( + profile: &Profile, + entries: Vec<(Value, Value)>, + config_format: ConfigFormat, + ) -> Result<Self> { + let f = PayloadFields::from_entries(profile, entries, config_format)?; PayloadBuilder::with_subject_public_key(f.subject_public_key) .issuer(f.issuer) .subject(f.subject) @@ -94,6 +116,47 @@ bytes: &[u8], config_format: ConfigFormat, ) -> Result<Self> { + let entries = cbor_map_from_slice(bytes)?; + let profile_version = Self::extract_profile_version(session, &entries)?; + Self::from_entries(&profile_version.into(), entries, config_format) + } + + fn extract_profile_version( + session: &Session, + entries: &[(Value, Value)], + ) -> Result<ProfileVersion> { + let mut profile_name = FieldValue::new("profile name"); + for (key, value) in entries.iter() { + if key == &Value::from(PROFILE_NAME) { + profile_name.set_once(value.clone())?; + } + } + + let profile_version = match profile_name.into_optional_string()? { + None => { + let version = session.options.dice_profile_range.start(); + ensure!(version <= ProfileVersion::Android14, "profile name is required"); + version + } + Some(profile_name) => { + ProfileVersion::from_str(&profile_name).with_context(|| profile_name.clone())? + } + }; + ensure!( + session.options.dice_profile_range.contains(profile_version), + "profile version \"{profile_version}\" is less than \"{}\" or greater than \"{}\"", + session.options.dice_profile_range.start(), + session.options.dice_profile_range.end(), + ); + + Ok(profile_version) + } + + fn from_entries( + profile: &Profile, + entries: Vec<(Value, Value)>, + config_format: ConfigFormat, + ) -> Result<Self> { let mut issuer = FieldValue::new("issuer"); let mut subject = FieldValue::new("subject"); let mut subject_public_key = FieldValue::new("subject public key"); @@ -107,7 +170,6 @@ let mut key_usage = FieldValue::new("key usage"); let mut profile_name = FieldValue::new("profile name"); - let entries = cbor_map_from_slice(bytes)?; for (key, value) in entries.into_iter() { if let Some(Ok(key)) = key.as_integer().map(TryInto::try_into) { let field = match key { @@ -125,43 +187,36 @@ PROFILE_NAME => &mut profile_name, _ => bail!("Unknown key {}", key), }; - match field.get() { - Some(existing) => bail!( - "duplicate values for {}: {:?} and {:?}", - field.name(), - existing, - value - ), - None => field.set(value), - } + field.set_once(value)? } else { bail!("Invalid key: {:?}", key); } } - validate_key_usage(session, key_usage)?; + validate_key_usage(profile, key_usage)?; + let (config_desc, config_hash) = + validate_config(profile, config_desc, config_hash, config_format).context("config")?; Ok(Self { - issuer: issuer.into_string().context("issuer")?, - subject: subject.into_string().context("subject")?, - subject_public_key: validate_subject_public_key(session, subject_public_key)?, - mode: validate_mode(session, mode).context("mode")?, - code_desc: code_desc.into_optional_bytes().context("code descriptor")?, - code_hash: code_hash.into_optional_bytes().context("code hash")?, - config_desc: validate_config_desc(session, config_desc, config_format) - .context("config descriptor")?, - config_hash: config_hash.into_optional_bytes().context("config hash")?, - authority_desc: authority_desc.into_optional_bytes().context("authority descriptor")?, - authority_hash: authority_hash.into_optional_bytes().context("authority hash")?, + issuer: issuer.into_string()?, + subject: subject.into_string()?, + subject_public_key: validate_subject_public_key(profile, subject_public_key)?, + mode: validate_mode(profile, mode)?, + code_desc: code_desc.into_optional_bytes()?, + code_hash: code_hash.into_optional_bytes()?, + config_desc, + config_hash, + authority_desc: authority_desc.into_optional_bytes()?, + authority_hash: authority_hash.into_optional_bytes()?, }) } } -fn validate_key_usage(session: &Session, key_usage: FieldValue) -> Result<()> { +fn validate_key_usage(profile: &Profile, key_usage: FieldValue) -> Result<()> { let key_usage = key_usage.into_bytes().context("key usage")?; let key_cert_sign = 1 << 5; if key_usage.len() > 1 - && session.options.dice_chain_allow_big_endian_key_usage + && profile.allow_big_endian_key_usage && key_usage[key_usage.len() - 1] == key_cert_sign && key_usage.iter().take(key_usage.len() - 1).all(|&x| x == 0) { @@ -177,19 +232,19 @@ } fn validate_subject_public_key( - session: &Session, + profile: &Profile, subject_public_key: FieldValue, ) -> Result<PublicKey> { - let subject_public_key = subject_public_key.into_bytes().context("Subject public")?; + let subject_public_key = subject_public_key.into_bytes()?; let subject_public_key = value_from_bytes(&subject_public_key).context("decode CBOR")?; - let subject_public_key = cose_key_from_cbor_value(session, subject_public_key) + let subject_public_key = cose_key_from_cbor_value(subject_public_key, profile.key_ops_type) .context("parsing subject public key")?; PublicKey::from_cose_key(&subject_public_key) .context("parsing subject public key from COSE_key") } -fn validate_mode(session: &Session, mode: FieldValue) -> Result<Option<DiceMode>> { - Ok(if !mode.is_bytes() && session.options.dice_chain_mode_type == ModeType::IntOrBytes { +fn validate_mode(profile: &Profile, mode: FieldValue) -> Result<Option<DiceMode>> { + Ok(if !mode.is_bytes() && profile.mode_type == ModeType::IntOrBytes { mode.into_optional_i64()? } else { mode.into_optional_bytes()? @@ -209,23 +264,32 @@ })) } -fn validate_config_desc( - session: &Session, +fn validate_config( + profile: &Profile, config_desc: FieldValue, + config_hash: FieldValue, config_format: ConfigFormat, -) -> Result<Option<ConfigDesc>> { +) -> Result<(Option<ConfigDesc>, Option<Vec<u8>>)> { let config_desc = config_desc.into_optional_bytes()?; - config_desc - .map(|config_desc| { - let config = - config_desc_from_slice(session, &config_desc).context("parsing config descriptor"); - if config.is_err() && config_format == ConfigFormat::Permissive { - Ok(ConfigDesc::default()) - } else { - config - } - }) - .transpose() + let config_hash = config_hash.into_optional_bytes()?; + if let Some(config_desc) = config_desc { + let config = config_desc_from_slice(profile, &config_desc).context("parsing descriptor"); + if config.is_err() && config_format == ConfigFormat::AndroidOrIgnored { + return Ok((Some(ConfigDesc::default()), config_hash)); + } + if !profile.config_hash_unverified { + let Some(ref hash) = config_hash else { bail!("hash required") }; + match hash.len() { + 32 => ensure!(hash == &sha256(&config_desc)), + 48 => ensure!(hash == &sha384(&config_desc)), + 64 => ensure!(hash == &sha512(&config_desc)), + _ => bail!("unsupported hash size"), + }; + } + Ok((Some(config?), config_hash)) + } else { + Ok((None, config_hash)) + } } fn cbor_map_from_slice(bytes: &[u8]) -> Result<Vec<(Value, Value)>> { @@ -237,13 +301,14 @@ Ok(entries) } -fn config_desc_from_slice(session: &Session, bytes: &[u8]) -> Result<ConfigDesc> { +fn config_desc_from_slice(profile: &Profile, bytes: &[u8]) -> Result<ConfigDesc> { let entries = cbor_map_from_slice(bytes)?; let mut component_name = FieldValue::new("component name"); let mut component_version = FieldValue::new("component version"); let mut resettable = FieldValue::new("resettable"); let mut security_version = FieldValue::new("security version"); + let mut rkp_vm_marker = FieldValue::new("rkp vm marker"); let mut extensions = HashMap::new(); for (key, value) in entries.into_iter() { @@ -253,6 +318,7 @@ COMPONENT_VERSION => &mut component_version, RESETTABLE => &mut resettable, SECURITY_VERSION => &mut security_version, + RKP_VM_MARKER => &mut rkp_vm_marker, key if (CONFIG_DESC_RESERVED_MIN..=CONFIG_DESC_RESERVED_MAX).contains(&key) => { bail!("Reserved key {}", key); } @@ -266,32 +332,38 @@ } }, }; - match field.get() { - Some(existing) => { - bail!("duplicate values for {}: {:?} and {:?}", field.name(), existing, value) - } - None => field.set(value), - } + field.set_once(value)? } else { bail!("Invalid key: {:?}", key); } } + let extensions = + extensions.into_iter().map(|(k, v)| (k.to_string(), format!("{v:?}"))).collect(); + + let security_version = if profile.security_version_optional { + security_version.into_optional_u64() + } else { + security_version.into_u64().map(Some) + } + .context("Security version")?; + Ok(ConfigDescBuilder::new() .component_name(component_name.into_optional_string().context("Component name")?) .component_version( - validate_version(session, component_version).context("Component version")?, + validate_version(profile, component_version).context("Component version")?, ) .resettable(resettable.is_null().context("Resettable")?) - .security_version(security_version.into_optional_u64().context("Security version")?) + .security_version(security_version) + .rkp_vm_marker(rkp_vm_marker.is_null().context("RKP VM marker")?) + .extensions(extensions) .build()) } -fn validate_version(session: &Session, field: FieldValue) -> Result<Option<ComponentVersion>> { +fn validate_version(profile: &Profile, field: FieldValue) -> Result<Option<ComponentVersion>> { Ok( if !field.is_integer() - && session.options.dice_chain_component_version_type - == ComponentVersionType::IntOrString + && profile.component_version_type == ComponentVersionType::IntOrString { field.into_optional_string()?.map(ComponentVersion::String) } else { @@ -303,9 +375,10 @@ #[cfg(test)] mod tests { use super::*; + use crate::cbor::dice::KeyOpsType; use crate::cbor::serialize; use crate::publickey::testkeys::{PrivateKey, ED25519_KEY_PEM}; - use crate::session::{KeyOpsType, Options}; + use crate::session::{DiceProfileRange, Options}; use ciborium::cbor; use coset::iana::{self, EnumI64}; use coset::CborSerializable; @@ -323,9 +396,8 @@ impl Payload { pub(in super::super) fn to_cbor_value(&self) -> Result<Value> { - let subject_public_key = - self.subject_public_key().to_cose_key()?.to_vec().map_err(cose_error)?; - let config_desc = serialize(encode_config_desc(self.config_desc())); + let subject_public_key = self.subject_public_key().to_cose_key()?.to_vec()?; + let config_desc = serialize(self.config_desc().to_cbor_value()); let mut map = vec![ (Value::from(ISS), Value::from(self.issuer())), (Value::from(SUB), Value::from(self.subject())), @@ -349,6 +421,34 @@ } } + impl ConfigDesc { + pub(in super::super) fn to_cbor_value(&self) -> Value { + let mut map = Vec::new(); + if let Some(component_name) = self.component_name() { + map.push((Value::from(COMPONENT_NAME), Value::from(component_name))); + } + if let Some(component_version) = self.component_version() { + map.push(( + Value::from(COMPONENT_VERSION), + match component_version { + ComponentVersion::Integer(n) => Value::from(*n), + ComponentVersion::String(s) => Value::from(s.as_str()), + }, + )) + } + if self.resettable() { + map.push((Value::from(RESETTABLE), Value::Null)); + } + if let Some(security_version) = self.security_version() { + map.push((Value::from(SECURITY_VERSION), Value::from(security_version))); + } + if self.rkp_vm_marker() { + map.push((Value::from(RKP_VM_MARKER), Value::Null)); + } + Value::Map(map) + } + } + fn encode_mode(mode: DiceMode) -> Value { let mode = match mode { DiceMode::NotConfigured => 0, @@ -359,31 +459,34 @@ Value::Bytes(vec![mode]) } - fn encode_config_desc(config_desc: &ConfigDesc) -> Value { - let mut map = Vec::new(); - if let Some(component_name) = config_desc.component_name() { - map.push((Value::from(COMPONENT_NAME), Value::from(component_name))); - } - if let Some(component_version) = config_desc.component_version() { - map.push(( - Value::from(COMPONENT_VERSION), - match component_version { - ComponentVersion::Integer(n) => Value::from(*n), - ComponentVersion::String(s) => Value::from(s.as_str()), - }, - )) - } - if config_desc.resettable() { - map.push((Value::from(RESETTABLE), Value::Null)); - } - if let Some(security_version) = config_desc.security_version() { - map.push((Value::from(SECURITY_VERSION), Value::from(security_version))); - } - Value::Map(map) + #[test] + fn valid_payload_sha256() { + let config_desc = serialize(cbor!({COMPONENT_NAME => "sha256 test"}).unwrap()); + let config_hash = sha256(&config_desc).to_vec(); + let mut fields = valid_payload_fields(); + fields.insert(CODE_HASH, Value::Bytes(vec![1; 32])); + fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); + fields.insert(AUTHORITY_HASH, Value::Bytes(vec![2; 32])); + let session = Session { options: Options::default() }; + Payload::from_cbor(&session, &serialize_fields(fields), ConfigFormat::Android).unwrap(); } #[test] - fn valid_payload() { + fn valid_payload_sha384() { + let config_desc = serialize(cbor!({COMPONENT_NAME => "sha384 test"}).unwrap()); + let config_hash = sha384(&config_desc).to_vec(); + let mut fields = valid_payload_fields(); + fields.insert(CODE_HASH, Value::Bytes(vec![1; 48])); + fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); + fields.insert(AUTHORITY_HASH, Value::Bytes(vec![2; 48])); + let session = Session { options: Options::default() }; + Payload::from_cbor(&session, &serialize_fields(fields), ConfigFormat::Android).unwrap(); + } + + #[test] + fn valid_payload_sha512() { let fields = valid_payload_fields(); let session = Session { options: Options::default() }; Payload::from_cbor(&session, &serialize_fields(fields), ConfigFormat::Android).unwrap(); @@ -483,13 +586,11 @@ fn mode_int_debug() { let mut fields = valid_payload_fields(); fields.insert(MODE, Value::from(2)); - let cbor = serialize_fields(fields); - let session = Session { options: Options::default() }; - Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap_err(); - let session = Session { - options: Options { dice_chain_mode_type: ModeType::IntOrBytes, ..Options::default() }, - }; - let payload = Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap(); + let entries = encode_fields(fields); + Payload::from_entries(&Profile::default(), entries.clone(), ConfigFormat::Android) + .unwrap_err(); + let profile = Profile { mode_type: ModeType::IntOrBytes, ..Profile::default() }; + let payload = Payload::from_entries(&profile, entries, ConfigFormat::Android).unwrap(); assert_eq!(payload.mode(), DiceMode::Debug); } @@ -523,59 +624,53 @@ fn key_usage_big_endian() { let mut fields = valid_payload_fields(); fields.insert(KEY_USAGE, Value::Bytes(vec![0x00, 0x20])); - let cbor = serialize_fields(fields); - let session = Session { options: Options::default() }; - Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap_err(); - let session = Session { - options: Options { dice_chain_allow_big_endian_key_usage: true, ..Options::default() }, - }; - Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap(); + let entries = encode_fields(fields); + Payload::from_entries(&Profile::default(), entries.clone(), ConfigFormat::Android) + .unwrap_err(); + let profile = Profile { allow_big_endian_key_usage: true, ..Profile::default() }; + Payload::from_entries(&profile, entries, ConfigFormat::Android).unwrap(); } #[test] fn key_usage_big_endian_invalid() { let mut fields = valid_payload_fields(); fields.insert(KEY_USAGE, Value::Bytes(vec![0x00, 0xfe, 0x20])); - let cbor = serialize_fields(fields); - let session = Session { options: Options::default() }; - Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap_err(); - let session = Session { - options: Options { dice_chain_allow_big_endian_key_usage: true, ..Options::default() }, - }; - Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap_err(); + let entries = encode_fields(fields); + Payload::from_entries(&Profile::default(), entries.clone(), ConfigFormat::Android) + .unwrap_err(); + let profile = Profile { allow_big_endian_key_usage: true, ..Profile::default() }; + Payload::from_entries(&profile, entries, ConfigFormat::Android).unwrap_err(); } #[test] fn key_usage_invalid() { let mut fields = valid_payload_fields(); fields.insert(KEY_USAGE, Value::Bytes(vec![0x00, 0x10])); - let cbor = serialize_fields(fields); - let session = Session { options: Options::default() }; - Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap_err(); - let session = Session { - options: Options { dice_chain_allow_big_endian_key_usage: true, ..Options::default() }, - }; - Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap_err(); + let entries = encode_fields(fields); + Payload::from_entries(&Profile::default(), entries.clone(), ConfigFormat::Android) + .unwrap_err(); + let profile = Profile { allow_big_endian_key_usage: true, ..Profile::default() }; + Payload::from_entries(&profile, entries, ConfigFormat::Android).unwrap_err(); } #[test] fn key_usage_empty() { let mut fields = valid_payload_fields(); fields.insert(KEY_USAGE, Value::Bytes(vec![])); - let cbor = serialize_fields(fields); - let session = Session { options: Options::default() }; - Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap_err(); - let session = Session { - options: Options { dice_chain_allow_big_endian_key_usage: true, ..Options::default() }, - }; - Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap_err(); + let entries = encode_fields(fields); + Payload::from_entries(&Profile::default(), entries.clone(), ConfigFormat::Android) + .unwrap_err(); + let profile = Profile { allow_big_endian_key_usage: true, ..Profile::default() }; + Payload::from_entries(&profile, entries, ConfigFormat::Android).unwrap_err(); } #[test] fn config_desc_custom_field_above() { let mut fields = valid_payload_fields(); let config_desc = serialize(cbor!({-69999 => "custom"}).unwrap()); + let config_hash = sha512(&config_desc).to_vec(); fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); let session = Session { options: Options::default() }; Payload::from_cbor(&session, &serialize_fields(fields), ConfigFormat::Android).unwrap(); } @@ -584,7 +679,9 @@ fn config_desc_reserved_field_max() { let mut fields = valid_payload_fields(); let config_desc = serialize(cbor!({-70000 => "reserved"}).unwrap()); + let config_hash = sha512(&config_desc).to_vec(); fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); let session = Session { options: Options::default() }; Payload::from_cbor(&session, &serialize_fields(fields), ConfigFormat::Android).unwrap_err(); } @@ -593,7 +690,9 @@ fn config_desc_reserved_field_min() { let mut fields = valid_payload_fields(); let config_desc = serialize(cbor!({-70999 => "reserved"}).unwrap()); + let config_hash = sha512(&config_desc).to_vec(); fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); let session = Session { options: Options::default() }; Payload::from_cbor(&session, &serialize_fields(fields), ConfigFormat::Android).unwrap_err(); } @@ -602,37 +701,56 @@ fn config_desc_custom_field_below() { let mut fields = valid_payload_fields(); let config_desc = serialize(cbor!({-71000 => "custom"}).unwrap()); + let config_hash = sha512(&config_desc).to_vec(); fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); let session = Session { options: Options::default() }; Payload::from_cbor(&session, &serialize_fields(fields), ConfigFormat::Android).unwrap(); } #[test] + fn config_desc_custom_fields() { + let mut fields = valid_payload_fields(); + let config_desc = serialize(cbor!({-71000 => "custom hi", -69999 => "custom lo"}).unwrap()); + let config_hash = sha512(&config_desc).to_vec(); + fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); + let session = Session { options: Options::default() }; + let payload = + Payload::from_cbor(&session, &serialize_fields(fields), ConfigFormat::Android).unwrap(); + let extensions = payload.config_desc().extensions(); + let extensions = HashMap::<_, _>::from_iter(extensions.to_owned()); + assert_eq!(extensions.get("-71000").unwrap(), "Text(\"custom hi\")"); + assert_eq!(extensions.get("-69999").unwrap(), "Text(\"custom lo\")"); + assert_eq!(extensions.len(), 2); + } + + #[test] fn config_desc_not_android_spec() { let mut fields = valid_payload_fields(); fields.insert(CONFIG_DESC, Value::Bytes(vec![0xcd; 64])); let cbor = serialize_fields(fields); let session = Session { options: Options::default() }; Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap_err(); - let payload = Payload::from_cbor(&session, &cbor, ConfigFormat::Permissive).unwrap(); + let payload = Payload::from_cbor(&session, &cbor, ConfigFormat::AndroidOrIgnored).unwrap(); assert_eq!(payload.config_desc(), &ConfigDesc::default()); } #[test] fn config_desc_component_version_string() { let mut fields = valid_payload_fields(); - let config_desc = serialize(cbor!({COMPONENT_VERSION => "It's version 4"}).unwrap()); + let config_desc = serialize( + cbor!({COMPONENT_VERSION => "It's version 4", SECURITY_VERSION => 99999999}).unwrap(), + ); + let config_hash = sha512(&config_desc).to_vec(); fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); - let cbor = serialize_fields(fields); - let session = Session { - options: Options { - dice_chain_component_version_type: ComponentVersionType::Int, - ..Options::default() - }, - }; - Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap_err(); - let session = Session { options: Options::default() }; - let payload = Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap(); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); + let entries = encode_fields(fields); + let profile = + Profile { component_version_type: ComponentVersionType::Int, ..Profile::default() }; + Payload::from_entries(&profile, entries.clone(), ConfigFormat::Android).unwrap_err(); + let payload = + Payload::from_entries(&Profile::default(), entries, ConfigFormat::Android).unwrap(); assert_eq!( payload.config_desc().component_version(), Some(&ComponentVersion::String("It's version 4".to_string())) @@ -642,8 +760,10 @@ #[test] fn config_desc_security_version() { let mut fields = valid_payload_fields(); - let config_desc = serialize(cbor!({SECURITY_VERSION => Value::from(0x12345678)}).unwrap()); + let config_desc = serialize(cbor!({SECURITY_VERSION => 0x12345678}).unwrap()); + let config_hash = sha512(&config_desc).to_vec(); fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); let cbor = serialize_fields(fields); let session = Session { options: Options::default() }; let payload = Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap(); @@ -651,6 +771,21 @@ } #[test] + fn config_desc_security_version_omitted() { + let mut fields = valid_payload_fields(); + let config_desc = serialize(cbor!({}).unwrap()); + let config_hash = sha512(&config_desc).to_vec(); + fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); + let entries = encode_fields(fields); + Payload::from_entries(&Profile::default(), entries.clone(), ConfigFormat::Android) + .unwrap_err(); + let profile = Profile { security_version_optional: true, ..Profile::default() }; + let payload = Payload::from_entries(&profile, entries, ConfigFormat::Android).unwrap(); + assert_eq!(payload.config_desc().security_version(), None); + } + + #[test] fn config_desc_security_version_fixed_size_encoding() { let mut fields = valid_payload_fields(); let config_desc = vec![ @@ -658,7 +793,9 @@ 0x3a, 0x00, 0x01, 0x11, 0x74, // SECURITY_VERSION. 0x1a, 0x00, 0x00, 0xca, 0xfe, // Non-deterministic encoding of 0xcafe. ]; + let config_hash = sha512(&config_desc).to_vec(); fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); let cbor = serialize_fields(fields); let session = Session { options: Options::default() }; let payload = Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap(); @@ -676,6 +813,54 @@ } #[test] + fn config_desc_resettable() { + let mut fields = valid_payload_fields(); + let config_desc = serialize(cbor!({RESETTABLE => null}).unwrap()); + let config_hash = sha512(&config_desc).to_vec(); + fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); + let cbor = serialize_fields(fields); + let session = Session { options: Options::default() }; + let payload = Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap(); + assert!(payload.config_desc().resettable()); + } + + #[test] + fn config_desc_rkp_vm_marker() { + let mut fields = valid_payload_fields(); + let config_desc = serialize(cbor!({RKP_VM_MARKER => null}).unwrap()); + let config_hash = sha512(&config_desc).to_vec(); + fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); + let cbor = serialize_fields(fields); + let session = Session { options: Options::default() }; + let payload = Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap(); + assert!(payload.config_desc().rkp_vm_marker()); + } + + #[test] + fn config_desc_nulls_omitted() { + let mut fields = valid_payload_fields(); + let config_desc = serialize(cbor!({}).unwrap()); + let config_hash = sha512(&config_desc).to_vec(); + fields.insert(CONFIG_DESC, Value::Bytes(config_desc)); + fields.insert(CONFIG_HASH, Value::Bytes(config_hash)); + let cbor = serialize_fields(fields); + let session = Session { options: Options::default() }; + let payload = Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap(); + assert!(!payload.config_desc().resettable()); + assert!(!payload.config_desc().rkp_vm_marker()); + } + + #[test] + fn config_hash_missing() { + let mut fields = valid_payload_fields(); + fields.remove(&CONFIG_HASH); + let entries = encode_fields(fields); + Payload::from_entries(&Profile::default(), entries, ConfigFormat::Android).unwrap_err(); + } + + #[test] fn integer_key_ops() { let mut fields = valid_payload_fields(); let subject_public_key = cbor!({ @@ -687,22 +872,128 @@ }) .unwrap(); fields.insert(SUBJECT_PUBLIC_KEY, Value::Bytes(serialize(subject_public_key))); - let cbor = serialize_fields(fields); - let session = Session { options: Options::default() }; - Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap_err(); + let entries = encode_fields(fields); + Payload::from_entries(&Profile::default(), entries.clone(), ConfigFormat::Android) + .unwrap_err(); + let profile = Profile { key_ops_type: KeyOpsType::IntOrArray, ..Profile::default() }; + Payload::from_entries(&profile, entries, ConfigFormat::Android).unwrap(); + } + + #[test] + fn extract_profile_version_named_profiles() { + let test_cases = [ + ("android.14", ProfileVersion::Android14), + ("android.15", ProfileVersion::Android15), + ("android.16", ProfileVersion::Android16), + ]; + for (profile_name, expected_version) in test_cases { + let mut fields = valid_payload_fields(); + fields.insert(PROFILE_NAME, Value::from(profile_name)); + let entries = encode_fields(fields); + let session = Session { + options: Options { + dice_profile_range: DiceProfileRange::new(expected_version, expected_version), + }, + }; + let profile_version = + PayloadFields::extract_profile_version(&session, &entries).unwrap(); + assert_eq!(profile_version, expected_version); + } + } + + #[test] + fn extract_profile_version_named_android_13_fails() { let session = Session { options: Options { - dice_chain_key_ops_type: KeyOpsType::IntOrArray, - ..Options::default() + dice_profile_range: DiceProfileRange::new( + ProfileVersion::Android13, + ProfileVersion::Android16, + ), }, }; - Payload::from_cbor(&session, &cbor, ConfigFormat::Android).unwrap(); + let mut fields = valid_payload_fields(); + fields.insert(PROFILE_NAME, Value::from("android.13")); + let entries = encode_fields(fields); + PayloadFields::extract_profile_version(&session, &entries).unwrap_err(); + } + + #[test] + fn extract_profile_version_multiple_profile_name_entries_fails() { + let session = Session { + options: Options { + dice_profile_range: DiceProfileRange::new( + ProfileVersion::Android13, + ProfileVersion::Android16, + ), + }, + }; + let mut fields = valid_payload_fields(); + fields.insert(PROFILE_NAME, Value::from("android.15")); + let mut entries = encode_fields(fields); + entries.push((Value::from(PROFILE_NAME), Value::from("android.15"))); + PayloadFields::extract_profile_version(&session, &entries).unwrap_err(); + } + + #[test] + fn extract_profile_version_out_of_range_fails() { + let session = Session { + options: Options { + dice_profile_range: DiceProfileRange::new( + ProfileVersion::Android15, + ProfileVersion::Android15, + ), + }, + }; + let mut fields = valid_payload_fields(); + fields.insert(PROFILE_NAME, Value::from("android.14")); + let entries = encode_fields(fields.clone()); + PayloadFields::extract_profile_version(&session, &entries).unwrap_err(); + fields.insert(PROFILE_NAME, Value::from("android.16")); + let entries = encode_fields(fields); + PayloadFields::extract_profile_version(&session, &entries).unwrap_err(); + } + + #[test] + fn extract_profile_version_default_when_not_named_up_to_android_14() { + let entries = encode_fields(valid_payload_fields()); + for expected_version in [ProfileVersion::Android13, ProfileVersion::Android14] { + let session = Session { + options: Options { + dice_profile_range: DiceProfileRange::new( + expected_version, + ProfileVersion::Android16, + ), + }, + }; + let profile_version = + PayloadFields::extract_profile_version(&session, &entries).unwrap(); + assert_eq!(profile_version, expected_version); + } + } + + #[test] + fn extract_profile_version_named_profile_required_from_android_15() { + let entries = encode_fields(valid_payload_fields()); + for min_version in [ProfileVersion::Android15, ProfileVersion::Android16] { + let session = Session { + options: Options { + dice_profile_range: DiceProfileRange::new( + min_version, + ProfileVersion::Android16, + ), + }, + }; + PayloadFields::extract_profile_version(&session, &entries).unwrap_err(); + } } fn valid_payload_fields() -> HashMap<i64, Value> { let key = PrivateKey::from_pem(ED25519_KEY_PEM[0]).public_key(); let subject_public_key = key.to_cose_key().unwrap().to_vec().unwrap(); - let config_desc = serialize(cbor!({COMPONENT_NAME => "component name"}).unwrap()); + let config_desc = serialize( + cbor!({COMPONENT_NAME => "component name", SECURITY_VERSION => 1234}).unwrap(), + ); + let config_hash = sha512(&config_desc).to_vec(); HashMap::from([ (ISS, Value::from("issuer")), (SUB, Value::from("subject")), @@ -710,13 +1001,17 @@ (KEY_USAGE, Value::Bytes(vec![0x20])), (CODE_HASH, Value::Bytes(vec![1; 64])), (CONFIG_DESC, Value::Bytes(config_desc)), + (CONFIG_HASH, Value::Bytes(config_hash)), (AUTHORITY_HASH, Value::Bytes(vec![2; 64])), (MODE, Value::Bytes(vec![0])), ]) } - fn serialize_fields(mut fields: HashMap<i64, Value>) -> Vec<u8> { - let value = Value::Map(fields.drain().map(|(k, v)| (Value::from(k), v)).collect()); - serialize(value) + fn encode_fields(mut fields: HashMap<i64, Value>) -> Vec<(Value, Value)> { + fields.drain().map(|(k, v)| (Value::from(k), v)).collect() + } + + fn serialize_fields(fields: HashMap<i64, Value>) -> Vec<u8> { + serialize(Value::Map(encode_fields(fields))) } }
diff --git a/remote_provisioning/hwtrust/src/cbor/dice/field_value.rs b/remote_provisioning/hwtrust/src/cbor/dice/field_value.rs deleted file mode 100644 index 037e681..0000000 --- a/remote_provisioning/hwtrust/src/cbor/dice/field_value.rs +++ /dev/null
@@ -1,113 +0,0 @@ -//! This module defines a helper for parsing fields in a CBOR map. - -use coset::cbor::value::Value; -use thiserror::Error; - -#[derive(Error, Debug)] -pub enum FieldValueError { - #[error("expected a value but none was found")] - Missing, - #[error("expected bytes but found `{0:?}`")] - NotBytes(Value), - #[error("expected string but found `{0:?}`")] - NotString(Value), - #[error("expected null but found `{0:?}`")] - NotNull(Value), - #[error("expected i64 but found `{0:?}`")] - NotI64(Value), - #[error("expected u64 but found `{0:?}`")] - NotU64(Value), -} - -pub(super) struct FieldValue { - name: &'static str, - value: Option<Value>, -} - -impl FieldValue { - pub fn new(name: &'static str) -> Self { - Self { name, value: None } - } - - pub fn name(&self) -> &str { - self.name - } - - pub fn get(&self) -> &Option<Value> { - &self.value - } - - pub fn set(&mut self, value: Value) { - self.value = Some(value) - } - - pub fn is_bytes(&self) -> bool { - self.value.as_ref().map_or(false, |v| v.is_bytes()) - } - - pub fn into_optional_bytes(self) -> Result<Option<Vec<u8>>, FieldValueError> { - self.value - .map(|v| match v { - Value::Bytes(b) => Ok(b), - _ => Err(FieldValueError::NotBytes(v)), - }) - .transpose() - } - - pub fn into_bytes(self) -> Result<Vec<u8>, FieldValueError> { - require_present(self.into_optional_bytes()) - } - - pub fn into_optional_string(self) -> Result<Option<String>, FieldValueError> { - self.value - .map(|v| match v { - Value::Text(s) => Ok(s), - _ => Err(FieldValueError::NotString(v)), - }) - .transpose() - } - - pub fn into_string(self) -> Result<String, FieldValueError> { - require_present(self.into_optional_string()) - } - - pub fn is_null(&self) -> Result<bool, FieldValueError> { - // If there's no value, return false; if there is a null value, return true; anything else - // is an error. - self.value - .as_ref() - .map(|v| match *v { - Value::Null => Ok(true), - _ => Err(FieldValueError::NotNull(v.clone())), - }) - .unwrap_or(Ok(false)) - } - - pub fn is_integer(&self) -> bool { - self.value.as_ref().map_or(false, |v| v.is_integer()) - } - - pub fn into_optional_i64(self) -> Result<Option<i64>, FieldValueError> { - self.value - .map(|v| { - let value = - if let Value::Integer(i) = v { i128::from(i).try_into().ok() } else { None }; - value.ok_or_else(|| FieldValueError::NotI64(v)) - }) - .transpose() - } - - pub fn into_optional_u64(self) -> Result<Option<u64>, FieldValueError> { - self.value - .map(|v| { - let value = - if let Value::Integer(i) = v { i128::from(i).try_into().ok() } else { None }; - value.ok_or_else(|| FieldValueError::NotU64(v)) - }) - .transpose() - } -} - -fn require_present<T>(value: Result<Option<T>, FieldValueError>) -> Result<T, FieldValueError> { - value.and_then(|opt| opt.ok_or(FieldValueError::Missing)) -}
diff --git a/remote_provisioning/hwtrust/src/cbor/dice/profile.rs b/remote_provisioning/hwtrust/src/cbor/dice/profile.rs new file mode 100644 index 0000000..de28d3f --- /dev/null +++ b/remote_provisioning/hwtrust/src/cbor/dice/profile.rs
@@ -0,0 +1,106 @@ +//! Defines the set of validation rules to apply for a DICE profile. + +use super::KeyOpsType; +use crate::dice::ProfileVersion; + +/// Options that describe an Android Profile for DICE. +#[derive(Default)] +pub(super) struct Profile { + /// The types that are permitted for the key_ops field of COSE_Key objects in the DICE chain. + /// This option can be used for compatibility with the RKP HAL before v3 which diverged from + /// the COSE spec and allowed a single int instead of always requiring an array. + pub(super) key_ops_type: KeyOpsType, + + /// The types that are permitted for the mode field of the DICE certificates. This option can + /// be used for compatibility with the RKP HAL v3 which allowed some deviations from the Open + /// Profile for DICE specification. + pub(super) mode_type: ModeType, + + /// Whether to allow the key_usage field of the DICE certificates to be encoded in big-endian + /// byte order. This introduces ambiguity of the exact key usage being expressed but the keys + /// in the DICE chain are only used for verification so it may be preferable to allow for + /// compatibility with implementations that use the wrong endianness. + pub(super) allow_big_endian_key_usage: bool, + + /// The types that are permitted for the component version field in the configuration + /// descriptor. The specification has changed the allowed types over time and this option + /// can be used to select which rules to apply. + pub(super) component_version_type: ComponentVersionType, + + /// Whether the configuration hash is verified to be present and derived from the configuration + /// descriptor. This allows for compatibility with early versions of the RKP HAL which did not + /// enforce the requirements on the configuration hash as defined by the Open Profile for DICE. + pub(super) config_hash_unverified: bool, + + /// Whether the security version is a required field in the configuration descriptor. + pub(super) security_version_optional: bool, +} + +/// Type allowed for the DICE certificate mode field. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub(super) enum ModeType { + /// The mode field must be a byte string holding a single byte as specified by the Open Profile + /// for DICE. + #[default] + Bytes, + /// The mode field can be either an int or a byte string holding a single byte. + IntOrBytes, +} + +/// Type allowed for the DICE certificate configuration descriptor's component version field. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub(super) enum ComponentVersionType { + /// The component version can be either an int or a free-form string. + #[default] + IntOrString, + /// The component version must be an int. + Int, +} + +impl Profile { + /// The rules for the profile used in Android 13. + pub(super) fn android13() -> Self { + Self { + // Context: b/262599829#comment65 + key_ops_type: KeyOpsType::IntOrArray, + // Context: b/273552826 + component_version_type: ComponentVersionType::Int, + config_hash_unverified: true, + security_version_optional: true, + ..Self::default() + } + } + + /// The rules for the "android.14" profile. + pub(super) fn android14() -> Self { + Self { + // Context: b/273552826 + mode_type: ModeType::IntOrBytes, + allow_big_endian_key_usage: true, + config_hash_unverified: true, + security_version_optional: true, + ..Self::default() + } + } + + /// The rules for the "android.15" profile. + pub(super) fn android15() -> Self { + Self { config_hash_unverified: true, security_version_optional: true, ..Self::default() } + } + + /// The rules for the "android.16" profile.. + pub(super) fn android16() -> Self { + Self::default() + } +} + +impl From<ProfileVersion> for Profile { + fn from(version: ProfileVersion) -> Self { + match version { + ProfileVersion::Android13 => Profile::android13(), + ProfileVersion::Android14 => Profile::android14(), + ProfileVersion::Android15 => Profile::android15(), + ProfileVersion::Android16 => Profile::android16(), + } + } +}
diff --git a/remote_provisioning/hwtrust/src/cbor/field_value.rs b/remote_provisioning/hwtrust/src/cbor/field_value.rs new file mode 100644 index 0000000..fb25f86 --- /dev/null +++ b/remote_provisioning/hwtrust/src/cbor/field_value.rs
@@ -0,0 +1,237 @@ +//! This module defines a helper for parsing fields in a CBOR map. + +use coset::{cbor::value::Value, AsCborValue, CoseEncrypt, CoseError, CoseMac0, CoseSign1}; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum FieldValueError { + #[error("expected a value for field {0}, but none was found")] + Missing(&'static str), + #[error("expected bytes for field {0}, but found `{1:?}`")] + NotBytes(&'static str, Value), + #[error("expected string for field {0}, but found `{1:?}`")] + NotString(&'static str, Value), + #[error("expected null for field {0}, but found `{1:?}`")] + NotNull(&'static str, Value), + #[error("expected u32 for field {0}, but found `{1:?}`")] + NotU32(&'static str, Value), + #[error("expected i64 for field {0}, but found `{1:?}`")] + NotI64(&'static str, Value), + #[error("expected u64 for field {0}, but found `{1:?}`")] + NotU64(&'static str, Value), + #[error("expected boolean for field {0}, but found `{1:?}`")] + NotBool(&'static str, Value), + #[error("expected map for field {0}, but found `{1:?}`")] + NotMap(&'static str, Value), + #[error("expected array for field {0}, but found `{1:?}`")] + NotArray(&'static str, Value), + #[error("unable to parse field {0} as COSE_Sign1: `{1:?}`")] + CoseSign1ParseError(&'static str, CoseError), + #[error("unable to parse field {0} as COSE_Encrypt: `{1:?}`")] + CoseEncryptParseError(&'static str, CoseError), + #[error("unable to parse field {0} as COSE_Mac0: `{1:?}`")] + CoseMac0ParseError(&'static str, CoseError), + #[error("field {0} may be set only once; encountered multiple values: `{1:?}`, `{2:?}`")] + DuplicateField(&'static str, Value, Value), +} + +pub(super) struct FieldValue { + name: &'static str, + value: Option<Value>, +} + +impl FieldValue { + pub fn new(name: &'static str) -> Self { + Self { name, value: None } + } + + pub fn from_optional_value(name: &'static str, value: Option<Value>) -> Self { + Self { name, value } + } + + pub fn set_once(&mut self, value: Value) -> Result<(), FieldValueError> { + match &self.value { + None => { + self.value = Some(value); + Ok(()) + } + Some(previous) => { + Err(FieldValueError::DuplicateField(self.name, previous.clone(), value)) + } + } + } + + pub fn is_bytes(&self) -> bool { + self.value.as_ref().map_or(false, |v| v.is_bytes()) + } + + pub fn into_optional_bytes(self) -> Result<Option<Vec<u8>>, FieldValueError> { + self.value + .map(|v| match v { + Value::Bytes(b) => Ok(b), + _ => Err(FieldValueError::NotBytes(self.name, v)), + }) + .transpose() + } + + pub fn into_bytes(self) -> Result<Vec<u8>, FieldValueError> { + require_present(self.name, self.into_optional_bytes()) + } + + pub fn into_optional_string(self) -> Result<Option<String>, FieldValueError> { + self.value + .map(|v| match v { + Value::Text(s) => Ok(s), + _ => Err(FieldValueError::NotString(self.name, v)), + }) + .transpose() + } + + pub fn into_string(self) -> Result<String, FieldValueError> { + require_present(self.name, self.into_optional_string()) + } + + pub fn into_cose_encrypt(self) -> Result<CoseEncrypt, FieldValueError> { + require_present(self.name, self.into_optional_cose_encrypt()) + } + + pub fn into_optional_cose_encrypt(self) -> Result<Option<CoseEncrypt>, FieldValueError> { + self.value + .map(|v| match v { + Value::Array(_) => CoseEncrypt::from_cbor_value(v) + .map_err(|e| FieldValueError::CoseEncryptParseError(self.name, e)), + _ => Err(FieldValueError::NotArray(self.name, v)), + }) + .transpose() + } + + pub fn into_cose_mac0(self) -> Result<CoseMac0, FieldValueError> { + require_present(self.name, self.into_optional_cose_mac0()) + } + + pub fn into_optional_cose_mac0(self) -> Result<Option<CoseMac0>, FieldValueError> { + self.value + .map(|v| match v { + Value::Array(_) => CoseMac0::from_cbor_value(v) + .map_err(|e| FieldValueError::CoseMac0ParseError(self.name, e)), + _ => Err(FieldValueError::NotArray(self.name, v)), + }) + .transpose() + } + + pub fn into_cose_sign1(self) -> Result<CoseSign1, FieldValueError> { + require_present(self.name, self.into_optional_cose_sign1()) + } + + pub fn into_optional_cose_sign1(self) -> Result<Option<CoseSign1>, FieldValueError> { + self.value + .map(|v| match v { + Value::Array(_) => CoseSign1::from_cbor_value(v) + .map_err(|e| FieldValueError::CoseSign1ParseError(self.name, e)), + _ => Err(FieldValueError::NotArray(self.name, v)), + }) + .transpose() + } + + pub fn into_array(self) -> Result<Vec<Value>, FieldValueError> { + require_present(self.name, self.into_optional_array()) + } + + pub fn into_optional_array(self) -> Result<Option<Vec<Value>>, FieldValueError> { + self.value + .map(|v| match v { + Value::Array(v) => Ok(v), + _ => Err(FieldValueError::NotArray(self.name, v)), + }) + .transpose() + } + + pub fn into_map(self) -> Result<Vec<(Value, Value)>, FieldValueError> { + require_present(self.name, self.into_optional_map()) + } + + pub fn into_optional_map(self) -> Result<Option<Vec<(Value, Value)>>, FieldValueError> { + self.value + .map(|v| match v { + Value::Map(v) => Ok(v), + _ => Err(FieldValueError::NotMap(self.name, v)), + }) + .transpose() + } + + pub fn into_bool(self) -> Result<bool, FieldValueError> { + require_present(self.name, self.into_optional_bool()) + } + + pub fn into_optional_bool(self) -> Result<Option<bool>, FieldValueError> { + self.value + .map(|v| match v { + Value::Bool(b) => Ok(b), + Value::Integer(i) if i == 0.into() => Ok(false), + Value::Integer(i) if i == 1.into() => Ok(true), + _ => Err(FieldValueError::NotBool(self.name, v)), + }) + .transpose() + } + + pub fn is_null(&self) -> Result<bool, FieldValueError> { + // If there's no value, return false; if there is a null value, return true; anything else + // is an error. + self.value + .as_ref() + .map(|v| match *v { + Value::Null => Ok(true), + _ => Err(FieldValueError::NotNull(self.name, v.clone())), + }) + .unwrap_or(Ok(false)) + } + + pub fn is_integer(&self) -> bool { + self.value.as_ref().map_or(false, |v| v.is_integer()) + } + + pub fn into_u32(self) -> Result<u32, FieldValueError> { + require_present(self.name, self.into_optional_u32()) + } + + pub fn into_optional_u32(self) -> Result<Option<u32>, FieldValueError> { + self.value + .map(|v| { + let value = + if let Value::Integer(i) = v { i128::from(i).try_into().ok() } else { None }; + value.ok_or_else(|| FieldValueError::NotU32(self.name, v)) + }) + .transpose() + } + + pub fn into_optional_i64(self) -> Result<Option<i64>, FieldValueError> { + self.value + .map(|v| { + let value = + if let Value::Integer(i) = v { i128::from(i).try_into().ok() } else { None }; + value.ok_or_else(|| FieldValueError::NotI64(self.name, v)) + }) + .transpose() + } + + pub fn into_u64(self) -> Result<u64, FieldValueError> { + require_present(self.name, self.into_optional_u64()) + } + + pub fn into_optional_u64(self) -> Result<Option<u64>, FieldValueError> { + self.value + .map(|v| { + let value = + if let Value::Integer(i) = v { i128::from(i).try_into().ok() } else { None }; + value.ok_or_else(|| FieldValueError::NotU64(self.name, v)) + }) + .transpose() + } +} + +fn require_present<T>( + name: &'static str, + value: Result<Option<T>, FieldValueError>, +) -> Result<T, FieldValueError> { + value.and_then(|opt| opt.ok_or(FieldValueError::Missing(name))) +}
diff --git a/remote_provisioning/hwtrust/src/cbor/publickey.rs b/remote_provisioning/hwtrust/src/cbor/publickey.rs index 709daff..11743e6 100644 --- a/remote_provisioning/hwtrust/src/cbor/publickey.rs +++ b/remote_provisioning/hwtrust/src/cbor/publickey.rs
@@ -1,6 +1,6 @@ //! CBOR encoding and decoding of a [`PublicKey`]. -use crate::publickey::{EcKind, Kind, PublicKey}; +use crate::publickey::{EcKind, KeyAgreementPublicKey, PublicKey, SignatureKind}; use anyhow::{anyhow, bail, ensure, Context, Result}; use coset::cbor::value::Value; use coset::iana::{self, EnumI64}; @@ -16,24 +16,20 @@ if !cose_key.key_ops.is_empty() { ensure!(cose_key.key_ops.contains(&KeyOperation::Assigned(iana::KeyOperation::Verify))); } - let pkey = match cose_key.kty { - KeyType::Assigned(iana::KeyType::OKP) => pkey_from_okp_key(cose_key)?, - KeyType::Assigned(iana::KeyType::EC2) => pkey_from_ec2_key(cose_key)?, - _ => bail!("Unexpected KeyType value: {:?}", cose_key.kty), - }; + let pkey = to_pkey(cose_key)?; pkey.try_into().context("Making PublicKey from PKey") } /// Verifies a COSE_Sign1 signature over its message. This function handles the conversion of /// the signature format that is needed for some algorithms. - pub(in crate::cbor) fn verify_cose_sign1(&self, sign1: &CoseSign1) -> Result<()> { + pub(in crate::cbor) fn verify_cose_sign1(&self, sign1: &CoseSign1, aad: &[u8]) -> Result<()> { ensure!(sign1.protected.header.crit.is_empty(), "No critical headers allowed"); ensure!( sign1.protected.header.alg == Some(Algorithm::Assigned(iana_algorithm(self.kind()))), "Algorithm mistmatch in protected header" ); - sign1.verify_signature(b"", |signature, message| match self.kind() { - Kind::Ec(k) => { + sign1.verify_signature(aad, |signature, message| match self.kind() { + SignatureKind::Ec(k) => { let der = ec_cose_signature_to_der(k, signature).context("Signature to DER")?; self.verify(&der, message) } @@ -44,7 +40,7 @@ /// Convert the public key into a [`CoseKey`]. pub fn to_cose_key(&self) -> Result<CoseKey> { let builder = match self.kind() { - Kind::Ed25519 => { + SignatureKind::Ed25519 => { let label_crv = iana::OkpKeyParameter::Crv.to_i64(); let label_x = iana::OkpKeyParameter::X.to_i64(); let x = self.pkey().raw_public_key().context("Get ed25519 raw public key")?; @@ -52,7 +48,7 @@ .param(label_crv, Value::from(iana::EllipticCurve::Ed25519.to_i64())) .param(label_x, Value::from(x)) } - Kind::Ec(ec) => { + SignatureKind::Ec(ec) => { let key = self.pkey().ec_key().unwrap(); let group = key.group(); let mut ctx = BigNumContext::new().context("Failed to create bignum context")?; @@ -66,8 +62,8 @@ EcKind::P384 => (iana::EllipticCurve::P_384, 48), }; - let x = adjust_coord(x.to_vec(), coord_len); - let y = adjust_coord(y.to_vec(), coord_len); + let x = adjust_coord(x.to_vec(), coord_len)?; + let y = adjust_coord(y.to_vec(), coord_len)?; CoseKeyBuilder::new_ec2_pub_key(crv, x, y) } }; @@ -78,11 +74,30 @@ } } -fn adjust_coord(mut coordinate: Vec<u8>, length: usize) -> Vec<u8> { +impl KeyAgreementPublicKey { + pub(super) fn from_cose_key(cose_key: &CoseKey) -> Result<Self> { + // RFC 9052 says the key_op for derive key is only for private keys. The public key + // has no key_ops (see Appendix B for an example). + ensure!(cose_key.key_ops.is_empty()); + let pkey = to_pkey(cose_key)?; + pkey.try_into().context("Making KeyAgreementPublicKey from PKey") + } +} + +fn to_pkey(cose_key: &CoseKey) -> Result<PKey<Public>> { + match cose_key.kty { + KeyType::Assigned(iana::KeyType::OKP) => Ok(pkey_from_okp_key(cose_key)?), + KeyType::Assigned(iana::KeyType::EC2) => Ok(pkey_from_ec2_key(cose_key)?), + _ => bail!("Unexpected KeyType value: {:?}", cose_key.kty), + } +} + +fn adjust_coord(mut coordinate: Vec<u8>, length: usize) -> Result<Vec<u8>> { // Use loops "just in case". However we should never see a coordinate with more than one // extra leading byte. The chances of more than one trailing byte is also quite small -- // roughly 1/65000. - while coordinate.len() > length && coordinate[0] == 00 { + while coordinate.len() > length { + ensure!(coordinate[0] == 0, "unexpected non-zero leading byte on public key"); coordinate.remove(0); } @@ -90,16 +105,26 @@ coordinate.insert(0, 0); } - coordinate + Ok(coordinate) } fn pkey_from_okp_key(cose_key: &CoseKey) -> Result<PKey<Public>> { ensure!(cose_key.kty == KeyType::Assigned(iana::KeyType::OKP)); - ensure!(cose_key.alg == Some(Algorithm::Assigned(iana::Algorithm::EdDSA))); + ensure!( + cose_key.alg == Some(Algorithm::Assigned(iana::Algorithm::EdDSA)) + || cose_key.alg == Some(Algorithm::Assigned(iana::Algorithm::ECDH_ES_HKDF_256)) + ); + //ensure!(cose_key.alg == Some(Algorithm::Assigned(iana::Algorithm::EdDSA))); let crv = get_label_value(cose_key, Label::Int(iana::OkpKeyParameter::Crv.to_i64()))?; let x = get_label_value_as_bytes(cose_key, Label::Int(iana::OkpKeyParameter::X.to_i64()))?; - ensure!(crv == &Value::from(iana::EllipticCurve::Ed25519.to_i64())); - PKey::public_key_from_raw_bytes(x, Id::ED25519).context("Failed to instantiate key") + let curve_id = if crv == &Value::from(iana::EllipticCurve::Ed25519.to_i64()) { + Id::ED25519 + } else if crv == &Value::from(iana::EllipticCurve::X25519.to_i64()) { + Id::X25519 + } else { + bail!("Given crv is invalid: '{crv:?}'"); + }; + PKey::public_key_from_raw_bytes(x, curve_id).context("Failed to instantiate key") } fn pkey_from_ec2_key(cose_key: &CoseKey) -> Result<PKey<Public>> { @@ -108,7 +133,8 @@ let x = get_label_value_as_bytes(cose_key, Label::Int(iana::Ec2KeyParameter::X.to_i64()))?; let y = get_label_value_as_bytes(cose_key, Label::Int(iana::Ec2KeyParameter::Y.to_i64()))?; match cose_key.alg { - Some(Algorithm::Assigned(iana::Algorithm::ES256)) => { + Some(Algorithm::Assigned(iana::Algorithm::ES256)) + | Some(Algorithm::Assigned(iana::Algorithm::ECDH_ES_HKDF_256)) => { ensure!(crv == &Value::from(iana::EllipticCurve::P_256.to_i64())); pkey_from_ec_coords(Nid::X9_62_PRIME256V1, x, y).context("Failed to instantiate key") } @@ -116,7 +142,7 @@ ensure!(crv == &Value::from(iana::EllipticCurve::P_384.to_i64())); pkey_from_ec_coords(Nid::SECP384R1, x, y).context("Failed to instantiate key") } - _ => bail!("Need to specify ES256 or ES384 in the key. Got {:?}", cose_key.alg), + _ => bail!("Need to specify ES256 or ES384 key algorithm. Got {:?}", cose_key.alg), } } @@ -165,11 +191,11 @@ } } -fn iana_algorithm(kind: Kind) -> iana::Algorithm { +fn iana_algorithm(kind: SignatureKind) -> iana::Algorithm { match kind { - Kind::Ed25519 => iana::Algorithm::EdDSA, - Kind::Ec(EcKind::P256) => iana::Algorithm::ES256, - Kind::Ec(EcKind::P384) => iana::Algorithm::ES384, + SignatureKind::Ed25519 => iana::Algorithm::EdDSA, + SignatureKind::Ec(EcKind::P256) => iana::Algorithm::ES256, + SignatureKind::Ec(EcKind::P384) => iana::Algorithm::ES384, } } @@ -190,7 +216,7 @@ .create_signature(b"", |m| { let signature = self.sign(m).unwrap(); match self.kind() { - Kind::Ec(ec) => ec_der_signature_to_cose(ec, &signature), + SignatureKind::Ec(ec) => ec_der_signature_to_cose(ec, &signature), _ => signature, } }) @@ -211,14 +237,14 @@ fn sign_and_verify_okp() { let key = PrivateKey::from_pem(ED25519_KEY_PEM[0]); let sign1 = key.sign_cose_sign1(b"signed payload".to_vec()); - key.public_key().verify_cose_sign1(&sign1).unwrap(); + key.public_key().verify_cose_sign1(&sign1, b"").unwrap(); } #[test] fn sign_and_verify_ec2() { let key = PrivateKey::from_pem(P256_KEY_PEM[0]); let sign1 = key.sign_cose_sign1(b"signed payload".to_vec()); - key.public_key().verify_cose_sign1(&sign1).unwrap(); + key.public_key().verify_cose_sign1(&sign1, b"").unwrap(); } #[test] @@ -227,9 +253,20 @@ let sign1 = CoseSign1Builder::new() .protected(HeaderBuilder::new().algorithm(iana::Algorithm::EdDSA).build()) .payload(b"the message".to_vec()) - .create_signature(b"", |m| key.sign(m).unwrap()) + .create_signature(b"the aad", |m| key.sign(m).unwrap()) .build(); - key.public_key().verify_cose_sign1(&sign1).unwrap(); + key.public_key().verify_cose_sign1(&sign1, b"the aad").unwrap(); + } + + #[test] + fn verify_cose_sign1_fails_with_wrong_aad() { + let key = PrivateKey::from_pem(ED25519_KEY_PEM[0]); + let sign1 = CoseSign1Builder::new() + .protected(HeaderBuilder::new().algorithm(iana::Algorithm::ES256).build()) + .payload(b"the message".to_vec()) + .create_signature(b"correct aad", |m| key.sign(m).unwrap()) + .build(); + key.public_key().verify_cose_sign1(&sign1, b"bad").unwrap_err(); } #[test] @@ -240,7 +277,7 @@ .payload(b"the message".to_vec()) .create_signature(b"", |m| key.sign(m).unwrap()) .build(); - key.public_key().verify_cose_sign1(&sign1).unwrap_err(); + key.public_key().verify_cose_sign1(&sign1, b"").unwrap_err(); } #[test] @@ -256,7 +293,7 @@ .payload(b"the message".to_vec()) .create_signature(b"", |m| key.sign(m).unwrap()) .build(); - key.public_key().verify_cose_sign1(&sign1).unwrap() + key.public_key().verify_cose_sign1(&sign1, b"").unwrap() } #[test] @@ -272,7 +309,7 @@ .payload(b"the message".to_vec()) .create_signature(b"", |m| key.sign(m).unwrap()) .build(); - key.public_key().verify_cose_sign1(&sign1).unwrap_err(); + key.public_key().verify_cose_sign1(&sign1, b"").unwrap_err(); } #[test]
diff --git a/remote_provisioning/hwtrust/src/cbor/rkp.rs b/remote_provisioning/hwtrust/src/cbor/rkp.rs new file mode 100644 index 0000000..b4d3043 --- /dev/null +++ b/remote_provisioning/hwtrust/src/cbor/rkp.rs
@@ -0,0 +1,5 @@ +//! This module provides functions for dealing with RKP-specific data structures. + +pub(crate) mod csr; +mod device_info; +mod protected_data;
diff --git a/remote_provisioning/hwtrust/src/cbor/rkp/csr.rs b/remote_provisioning/hwtrust/src/cbor/rkp/csr.rs new file mode 100644 index 0000000..e621756 --- /dev/null +++ b/remote_provisioning/hwtrust/src/cbor/rkp/csr.rs
@@ -0,0 +1,240 @@ +use crate::cbor::field_value::FieldValue; +use crate::cbor::value_from_bytes; +use crate::dice::Chain; +use crate::rkp::{Csr, DeviceInfo, ProtectedData}; +use crate::session::Session; +use anyhow::{anyhow, bail, ensure, Context, Result}; +use base64::{prelude::BASE64_STANDARD, Engine}; +use ciborium::value::Value; + +const VERSION_OR_DEVICE_INFO_INDEX: usize = 0; + +impl Csr { + /// Parse base64-encoded CBOR data as a Certificate Signing Request. + pub fn from_base64_cbor<S: AsRef<[u8]>>(session: &Session, base64: &S) -> Result<Self> { + let cbor: Vec<u8> = BASE64_STANDARD.decode(base64).context("invalid base64 CSR")?; + Self::from_cbor(session, cbor.as_slice()) + } + + /// Read and parse CBOR data as a Certificate Signing Request. + pub fn from_cbor<S: std::io::Read>(session: &Session, cbor: S) -> Result<Self> { + let value: Value = ciborium::de::from_reader(cbor).context("invalid CBOR")?; + let mut array = match value { + Value::Array(a) if a.is_empty() => bail!("CSR CBOR is an empty array"), + Value::Array(a) => a, + other => bail!("expected array, found {other:?}"), + }; + let version_or_device_info = + std::mem::replace(&mut array[VERSION_OR_DEVICE_INFO_INDEX], Value::Null); + match version_or_device_info { + Value::Array(device_info) => Self::v2_from_cbor_values(session, array, device_info), + Value::Integer(i) => Self::v3_from_authenticated_request(session, array, i.into()), + other => Err(anyhow!( + "Expected integer or array at index {VERSION_OR_DEVICE_INFO_INDEX}, \ + found {other:?}" + )), + } + } + + fn v2_from_cbor_values( + session: &Session, + mut csr: Vec<Value>, + mut device_info: Vec<Value>, + ) -> Result<Self> { + let maced_keys_to_sign = + FieldValue::from_optional_value("MacedKeysToSign", csr.pop()).into_cose_mac0()?; + let encrypted_protected_data = + FieldValue::from_optional_value("ProtectedData", csr.pop()).into_cose_encrypt()?; + let challenge = FieldValue::from_optional_value("Challenge", csr.pop()).into_bytes()?; + + ensure!(device_info.len() == 2, "Device info should contain exactly 2 entries"); + device_info.pop(); // ignore unverified info + let verified_device_info = match device_info.pop() { + Some(Value::Map(d)) => Value::Map(d), + other => bail!("Expected a map for verified device info, found '{:?}'", other), + }; + + let protected_data = ProtectedData::from_cose_encrypt( + session, + encrypted_protected_data, + &challenge, + &verified_device_info, + &maced_keys_to_sign.tag, + )?; + + let verified_device_info = match verified_device_info { + Value::Map(m) => m, + _ => unreachable!("verified device info is always a map"), + }; + + Ok(Self::V2 { + device_info: DeviceInfo::from_cbor_values(verified_device_info, None)?, + challenge, + protected_data, + }) + } + + fn v3_from_authenticated_request( + session: &Session, + mut csr: Vec<Value>, + version: i128, + ) -> Result<Self> { + if version != 1 { + bail!("Invalid CSR version. Only '1' is supported, found '{}", version); + } + + // CSRs that are uploaded to the backend have an additional unverified info field tacked + // onto them. We just ignore that, so if it's there pop it and move on. + if csr.len() == 5 { + FieldValue::from_optional_value("UnverifiedDeviceInfo", csr.pop()); + } + + let signed_data = + FieldValue::from_optional_value("SignedData", csr.pop()).into_cose_sign1()?; + let dice_chain = + Chain::from_value(session, csr.pop().ok_or(anyhow!("Missing DiceCertChain"))?)?; + + let signed_data_payload = signed_data.payload.context("missing payload in SignedData")?; + let csr_payload_value = value_from_bytes(&signed_data_payload) + .context("SignedData payload is not valid CBOR")? + .as_array_mut() + .context("SignedData payload is not a CBOR array")? + .pop() + .context("Missing CsrPayload in SignedData")?; + let csr_payload_bytes = csr_payload_value + .as_bytes() + .context("CsrPayload (in SignedData) is expected to be encoded CBOR")? + .as_slice(); + let mut csr_payload = match value_from_bytes(csr_payload_bytes)? { + Value::Array(a) => a, + other => bail!("CsrPayload is expected to be an array, found {other:?}"), + }; + + let _keys_to_sign = FieldValue::from_optional_value("KeysToSign", csr_payload.pop()); + let device_info = FieldValue::from_optional_value("DeviceInfo", csr_payload.pop()); + let _certificate_type = + FieldValue::from_optional_value("CertificateType", csr_payload.pop()); + + let device_info = DeviceInfo::from_cbor_values(device_info.into_map()?, Some(3))?; + Ok(Self::V3 { device_info, dice_chain }) + } +} + +#[cfg(test)] +mod tests { + // More complete testing happens in the factorycsr module, as the test data + // generation spits out full JSON files, not just a CSR. Therefore, only a + // minimal number of smoke tests are here. + use super::*; + use crate::cbor::rkp::csr::testutil::{parse_pem_public_key_or_panic, test_device_info}; + use crate::dice::{ChainForm, DegenerateChain, DiceMode}; + use crate::rkp::DeviceInfoVersion; + use std::fs; + + #[test] + fn from_base64_valid_v2() { + let input = fs::read_to_string("testdata/csr/v2_csr.base64").unwrap().trim().to_owned(); + let csr = Csr::from_base64_cbor(&Session::default(), &input).unwrap(); + + let device_info = testutil::test_device_info(DeviceInfoVersion::V2); + let challenge = + b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10".to_vec(); + let pem = "-----BEGIN PUBLIC KEY-----\n\ + MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERd9pHZbUJ/b4IleUGDN8fs8+LDxE\n\ + vG6VX1dkw0sClFs4imbzfXGbocEq74S7TQiyZkd1LhY6HRZnTC51KoGDIA==\n\ + -----END PUBLIC KEY-----\n"; + let subject_public_key = testutil::parse_pem_public_key_or_panic(pem); + let degenerate = ChainForm::Degenerate( + DegenerateChain::new("self-signed", "self-signed", subject_public_key).unwrap(), + ); + let protected_data = ProtectedData::new(vec![0; 32], degenerate, None); + assert_eq!(csr, Csr::V2 { device_info, challenge, protected_data }); + } + + #[test] + fn from_base64_valid_v3() { + let input = fs::read_to_string("testdata/csr/v3_csr.base64").unwrap().trim().to_owned(); + let csr = Csr::from_base64_cbor(&Session::default(), &input).unwrap(); + if let Csr::V3 { device_info, dice_chain } = csr { + assert_eq!(device_info, test_device_info(DeviceInfoVersion::V3)); + let root_public_key = parse_pem_public_key_or_panic( + "-----BEGIN PUBLIC KEY-----\n\ + MCowBQYDK2VwAyEA3FEn/nhqoGOKNok1AJaLfTKI+aFXHf4TfC42vUyPU6s=\n\ + -----END PUBLIC KEY-----\n", + ); + assert_eq!(dice_chain.root_public_key(), &root_public_key); + let payloads = dice_chain.payloads(); + assert_eq!(payloads.len(), 1); + assert_eq!(payloads[0].issuer(), "issuer"); + assert_eq!(payloads[0].subject(), "subject"); + assert_eq!(payloads[0].mode(), DiceMode::Normal); + assert_eq!(payloads[0].code_hash(), &[0x55; 32]); + let expected_config_hash: &[u8] = + b"\xb8\x96\x54\xe2\x2c\xa4\xd2\x4a\x9c\x0e\x45\x11\xc8\xf2\x63\xf0\ + \x66\x0d\x2e\x20\x48\x96\x90\x14\xf4\x54\x63\xc4\xf4\x39\x30\x38"; + assert_eq!(payloads[0].config_hash(), Some(expected_config_hash)); + assert_eq!(payloads[0].authority_hash(), &[0x55; 32]); + assert_eq!(payloads[0].config_desc().component_name(), Some("component_name")); + assert_eq!(payloads[0].config_desc().component_version(), None); + assert!(!payloads[0].config_desc().resettable()); + assert_eq!(payloads[0].config_desc().security_version(), None); + assert_eq!(payloads[0].config_desc().extensions(), []); + } else { + panic!("Parsed CSR was not V3: {:?}", csr); + } + } + + #[test] + fn from_empty_string() { + let err = Csr::from_base64_cbor(&Session::default(), &"").unwrap_err(); + assert!(err.to_string().contains("invalid CBOR")); + } + + #[test] + fn from_garbage() { + let err = Csr::from_base64_cbor(&Session::default(), &"cnViYmlzaAo=").unwrap_err(); + assert!(err.to_string().contains("invalid CBOR")); + } + + #[test] + fn from_invalid_base64() { + let err = Csr::from_base64_cbor(&Session::default(), &"not base64").unwrap_err(); + assert!(err.to_string().contains("invalid base64")); + } +} + +#[cfg(test)] +pub(crate) mod testutil { + use crate::publickey::PublicKey; + use crate::rkp::{ + DeviceInfo, DeviceInfoBootloaderState, DeviceInfoSecurityLevel, DeviceInfoVbState, + DeviceInfoVersion, + }; + use openssl::pkey::PKey; + + // Parse the given PEM-encoded public key into a PublicKey object, panicking on failure. + pub fn parse_pem_public_key_or_panic(pem: &str) -> PublicKey { + PKey::public_key_from_pem(pem.as_bytes()).unwrap().try_into().unwrap() + } + + // The test data uses mostly common DeviceInfo fields + pub fn test_device_info(version: DeviceInfoVersion) -> DeviceInfo { + DeviceInfo { + version, + brand: "Google".to_string(), + manufacturer: "Google".to_string(), + product: "pixel".to_string(), + model: "model".to_string(), + device: "device".to_string(), + vb_state: DeviceInfoVbState::Green, + bootloader_state: DeviceInfoBootloaderState::Locked, + vbmeta_digest: b"\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff".to_vec(), + os_version: Some("12".to_string()), + system_patch_level: 20221025, + boot_patch_level: 20221026, + vendor_patch_level: 20221027, + security_level: Some(DeviceInfoSecurityLevel::Tee), + fused: true, + } + } +}
diff --git a/remote_provisioning/hwtrust/src/cbor/rkp/device_info.rs b/remote_provisioning/hwtrust/src/cbor/rkp/device_info.rs new file mode 100644 index 0000000..ec1fc74 --- /dev/null +++ b/remote_provisioning/hwtrust/src/cbor/rkp/device_info.rs
@@ -0,0 +1,349 @@ +use crate::cbor::field_value::FieldValue; +use crate::rkp::{ + DeviceInfo, DeviceInfoBootloaderState, DeviceInfoSecurityLevel, DeviceInfoVbState, +}; +use anyhow::{bail, ensure, Context, Result}; +use ciborium::value::Value; + +impl DeviceInfo { + /// Create a new DeviceInfo struct from Values parsed by ciborium + pub fn from_cbor_values( + values: Vec<(Value, Value)>, + explicit_version: Option<u32>, + ) -> Result<Self> { + let mut brand = FieldValue::new("brand"); + let mut manufacturer = FieldValue::new("manufacturer"); + let mut product = FieldValue::new("product"); + let mut model = FieldValue::new("model"); + let mut device = FieldValue::new("device"); + let mut vb_state = FieldValue::new("vb_state"); + let mut bootloader_state = FieldValue::new("bootloader_state"); + let mut vbmeta_digest = FieldValue::new("vbmeta_digest"); + let mut os_version = FieldValue::new("os_version"); + let mut system_patch_level = FieldValue::new("system_patch_level"); + let mut boot_patch_level = FieldValue::new("boot_patch_level"); + let mut vendor_patch_level = FieldValue::new("vendor_patch_level"); + let mut security_level = FieldValue::new("security_level"); + let mut version = FieldValue::new("version"); + let mut fused = FieldValue::new("fused"); + + for (key, value) in values { + let field_value = match key.as_text() { + Some("brand") => &mut brand, + Some("manufacturer") => &mut manufacturer, + Some("product") => &mut product, + Some("model") => &mut model, + Some("device") => &mut device, + Some("vb_state") => &mut vb_state, + Some("bootloader_state") => &mut bootloader_state, + Some("vbmeta_digest") => &mut vbmeta_digest, + Some("os_version") => &mut os_version, + Some("system_patch_level") => &mut system_patch_level, + Some("boot_patch_level") => &mut boot_patch_level, + Some("vendor_patch_level") => &mut vendor_patch_level, + Some("security_level") => &mut security_level, + Some("fused") => &mut fused, + Some("version") => &mut version, + _ => bail!("Unexpected DeviceInfo kv-pair: ({key:?},{value:?})"), + }; + field_value.set_once(value)?; + } + + let version = match version.into_optional_u32() { + Ok(Some(v)) if v == explicit_version.unwrap_or(v) => v, + Ok(Some(v)) => bail!( + "Parsed DeviceInfo version '{v}' does not match expected version \ + '{explicit_version:?}'" + ), + Ok(None) => explicit_version.context("missing required version")?, + Err(e) => return Err(e.into()), + }; + + let security_level = match security_level.into_optional_string()? { + Some(s) => Some(s.as_str().try_into()?), + None => None, + }; + + let info = DeviceInfo { + brand: brand.into_string()?, + manufacturer: manufacturer.into_string()?, + product: product.into_string()?, + model: model.into_string()?, + device: device.into_string()?, + vb_state: vb_state.into_string()?.as_str().try_into()?, + bootloader_state: bootloader_state.into_string()?.as_str().try_into()?, + vbmeta_digest: vbmeta_digest.into_bytes()?, + os_version: os_version.into_optional_string()?, + system_patch_level: system_patch_level.into_u32()?, + boot_patch_level: boot_patch_level.into_u32()?, + vendor_patch_level: vendor_patch_level.into_u32()?, + security_level, + fused: fused.into_bool()?, + version: version.try_into()?, + }; + info.validate()?; + Ok(info) + } + + fn validate(&self) -> Result<()> { + ensure!(!self.vbmeta_digest.is_empty(), "vbmeta_digest must not be empty"); + ensure!( + !self.vbmeta_digest.iter().all(|b| *b == 0u8), + "vbmeta_digest must not be all zeros. Got {:?}", + self.vbmeta_digest + ); + + if Some(DeviceInfoSecurityLevel::Avf) == self.security_level { + ensure!( + self.bootloader_state == DeviceInfoBootloaderState::Avf + && self.vb_state == DeviceInfoVbState::Avf + && self.brand == "aosp-avf" + && self.device == "avf" + && self.model == "avf" + && self.manufacturer == "aosp-avf" + && self.product == "avf", + "AVF security level requires AVF fields. Got: {:?}", + self + ); + } else { + ensure!( + self.bootloader_state != DeviceInfoBootloaderState::Avf + && self.vb_state != DeviceInfoVbState::Avf + && self.brand != "aosp-avf" + && self.device != "avf" + && self.model != "avf" + && self.manufacturer != "aosp-avf" + && self.product != "avf", + "Non-AVF security level requires non-AVF fields. Got: {:?}", + self + ); + } + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::rkp::DeviceInfoVersion; + + #[test] + fn device_info_from_cbor_values_optional_os_version() { + let values: Vec<(Value, Value)> = get_valid_values_filtered(|x| x != "os_version"); + let info = DeviceInfo::from_cbor_values(values, None).unwrap(); + assert!(info.os_version.is_none()); + } + + #[test] + fn device_info_from_cbor_values_missing_required_field() { + let values: Vec<(Value, Value)> = get_valid_values_filtered(|x| x != "brand"); + let err = DeviceInfo::from_cbor_values(values, None).unwrap_err(); + println!("{err:?}"); + assert!(err.to_string().contains("brand")); + } + + #[test] + fn from_cbor_values_valid_v2() { + let actual = DeviceInfo::from_cbor_values(get_valid_values(), None).unwrap(); + let expected = DeviceInfo { + brand: "generic".to_string(), + manufacturer: "acme".to_string(), + product: "phone".to_string(), + model: "the best one".to_string(), + device: "really the best".to_string(), + vb_state: DeviceInfoVbState::Green, + bootloader_state: DeviceInfoBootloaderState::Locked, + vbmeta_digest: b"abcdefg".to_vec(), + os_version: Some("dessert".to_string()), + system_patch_level: 303010, + boot_patch_level: 30300102, + vendor_patch_level: 30300304, + security_level: Some(DeviceInfoSecurityLevel::Tee), + fused: true, + version: DeviceInfoVersion::V2, + }; + assert_eq!(actual, expected); + } + + #[test] + fn device_info_from_cbor_values_valid_v3() { + let values: Vec<(Value, Value)> = get_valid_values_filtered(|x| x != "version"); + let actual = DeviceInfo::from_cbor_values(values, Some(3)).unwrap(); + let expected = DeviceInfo { + brand: "generic".to_string(), + manufacturer: "acme".to_string(), + product: "phone".to_string(), + model: "the best one".to_string(), + device: "really the best".to_string(), + vb_state: DeviceInfoVbState::Green, + bootloader_state: DeviceInfoBootloaderState::Locked, + vbmeta_digest: b"abcdefg".to_vec(), + os_version: Some("dessert".to_string()), + system_patch_level: 303010, + boot_patch_level: 30300102, + vendor_patch_level: 30300304, + security_level: Some(DeviceInfoSecurityLevel::Tee), + fused: true, + version: DeviceInfoVersion::V3, + }; + assert_eq!(actual, expected); + } + + #[test] + fn device_info_from_cbor_values_mismatched_version() { + let values: Vec<(Value, Value)> = get_valid_values(); + let err = DeviceInfo::from_cbor_values(values, Some(3)).unwrap_err(); + println!("{err:?}"); + assert!(err.to_string().contains("version")); + } + + #[test] + fn device_info_from_cbor_values_invalid_version_value() { + let values: Vec<(Value, Value)> = get_valid_values_filtered(|x| x != "version"); + let err = DeviceInfo::from_cbor_values(values, None).unwrap_err(); + println!("{err:?}"); + assert!(err.to_string().contains("version")); + } + + #[test] + fn device_info_from_cbor_values_invalid_explicit_version() { + let values: Vec<(Value, Value)> = get_valid_values_filtered(|x| x != "version"); + let err = DeviceInfo::from_cbor_values(values, Some(0)).unwrap_err(); + println!("{err:?}"); + assert!(err.to_string().contains("version")); + } + + #[test] + fn device_info_from_cbor_values_missing_version() { + let values: Vec<(Value, Value)> = get_valid_values_filtered(|x| x != "version"); + let err = DeviceInfo::from_cbor_values(values, None).unwrap_err(); + println!("{err:?}"); + assert!(err.to_string().contains("version")); + } + + #[test] + fn device_info_from_cbor_duplicate_values() { + let mut values: Vec<(Value, Value)> = get_valid_values(); + values.push(("brand".into(), "generic".into())); + + let err = DeviceInfo::from_cbor_values(values, None).unwrap_err(); + println!("{err:?}"); + assert!(err.to_string().contains("may be set only once")); + } + + #[test] + fn device_info_from_cbor_empty_vbmeta_digest() { + let mut values: Vec<(Value, Value)> = get_valid_values_filtered(|v| v != "vbmeta_digest"); + values.push(("vbmeta_digest".into(), vec![0u8; 0].into())); + + let err = DeviceInfo::from_cbor_values(values, None).unwrap_err(); + println!("{err:?}"); + assert!(err.to_string().contains("vbmeta_digest must not be empty"), "{err:?}"); + } + + #[test] + fn device_info_from_cbor_all_zero_vbmeta_digest() { + let mut values: Vec<(Value, Value)> = get_valid_values_filtered(|v| v != "vbmeta_digest"); + values.push(("vbmeta_digest".into(), vec![0u8; 16].into())); + + let err = DeviceInfo::from_cbor_values(values, None).unwrap_err(); + println!("{err:?}"); + assert!(err.to_string().contains("vbmeta_digest must not be all zeros"), "{err:?}"); + } + + #[test] + fn device_info_from_cbor_values_non_avf_security_level_has_avf_vb_state() { + let mut values = get_valid_values_filtered(|x| x != "vb_state"); + values.push(("vb_state".into(), "avf".into())); + + let err = DeviceInfo::from_cbor_values(values, None).unwrap_err(); + assert!(err.to_string().contains("Non-AVF security level"), "{err:?}"); + } + + #[test] + fn device_info_from_cbor_values_non_avf_security_level_has_avf_bootloader_state() { + let mut values = get_valid_values_filtered(|x| x != "bootloader_state"); + values.push(("bootloader_state".into(), "avf".into())); + + let err = DeviceInfo::from_cbor_values(values, None).unwrap_err(); + assert!(err.to_string().contains("Non-AVF security level"), "{err:?}"); + } + + #[test] + fn device_info_from_cbor_values_avf_security_level_has_non_avf_vb_state() { + let values: Vec<(Value, Value)> = get_valid_avf_values() + .into_iter() + .filter(|(k, _v)| k.as_text().unwrap() != "vb_state") + .chain(vec![("vb_state".into(), "green".into())]) + .collect(); + let err = DeviceInfo::from_cbor_values(values, Some(3)).unwrap_err(); + assert!(err.to_string().contains("AVF security level requires AVF fields"), "{err:?}"); + } + + #[test] + fn device_info_from_cbor_values_avf_security_level_has_avf_fields() { + let values = get_valid_avf_values(); + let actual = DeviceInfo::from_cbor_values(values, Some(3)).unwrap(); + let expected = DeviceInfo { + brand: "aosp-avf".to_string(), + manufacturer: "aosp-avf".to_string(), + product: "avf".to_string(), + model: "avf".to_string(), + device: "avf".to_string(), + vb_state: DeviceInfoVbState::Avf, + bootloader_state: DeviceInfoBootloaderState::Avf, + vbmeta_digest: b"abcdefg".to_vec(), + os_version: Some("dessert".to_string()), + system_patch_level: 303010, + boot_patch_level: 30300102, + vendor_patch_level: 30300304, + security_level: Some(DeviceInfoSecurityLevel::Avf), + fused: true, + version: DeviceInfoVersion::V3, + }; + assert_eq!(expected, actual); + } + + fn get_valid_values() -> Vec<(Value, Value)> { + vec![ + ("brand".into(), "generic".into()), + ("manufacturer".into(), "acme".into()), + ("product".into(), "phone".into()), + ("model".into(), "the best one".into()), + ("device".into(), "really the best".into()), + ("vb_state".into(), "green".into()), + ("bootloader_state".into(), "locked".into()), + ("vbmeta_digest".into(), b"abcdefg".as_ref().into()), + ("os_version".into(), "dessert".into()), + ("system_patch_level".into(), 303010.into()), + ("boot_patch_level".into(), 30300102.into()), + ("vendor_patch_level".into(), 30300304.into()), + ("security_level".into(), "tee".into()), + ("fused".into(), 1.into()), + ("version".into(), 2.into()), + ] + } + + fn get_valid_avf_values() -> Vec<(Value, Value)> { + vec![ + ("brand".into(), "aosp-avf".into()), + ("manufacturer".into(), "aosp-avf".into()), + ("product".into(), "avf".into()), + ("model".into(), "avf".into()), + ("device".into(), "avf".into()), + ("vb_state".into(), "avf".into()), + ("bootloader_state".into(), "avf".into()), + ("vbmeta_digest".into(), b"abcdefg".as_ref().into()), + ("os_version".into(), "dessert".into()), + ("system_patch_level".into(), 303010.into()), + ("boot_patch_level".into(), 30300102.into()), + ("vendor_patch_level".into(), 30300304.into()), + ("security_level".into(), "avf".into()), + ("fused".into(), 1.into()), + ] + } + + fn get_valid_values_filtered<F: Fn(&str) -> bool>(filter: F) -> Vec<(Value, Value)> { + get_valid_values().into_iter().filter(|x| filter(x.0.as_text().unwrap())).collect() + } +}
diff --git a/remote_provisioning/hwtrust/src/cbor/rkp/protected_data.rs b/remote_provisioning/hwtrust/src/cbor/rkp/protected_data.rs new file mode 100644 index 0000000..637fc82 --- /dev/null +++ b/remote_provisioning/hwtrust/src/cbor/rkp/protected_data.rs
@@ -0,0 +1,214 @@ +use crate::cbor::field_value::FieldValue; +use crate::cbor::value_from_bytes; +use crate::dice::ChainForm; +use crate::eek; +use crate::publickey::{KeyAgreementPublicKey, PublicKey}; +use crate::rkp::{ProtectedData, UdsCerts, UdsCertsEntry}; +use crate::session::Session; +use anyhow::{anyhow, bail, Context, Result}; +use ciborium::value::Value; +use coset::{iana, Algorithm, AsCborValue, CoseEncrypt, CoseKey, CoseRecipient, CoseSign1, Label}; +use openssl::cipher::Cipher; +use openssl::cipher_ctx::CipherCtx; +use openssl::pkey::{Id, PKey, Private}; + +const COSE_RECIPIENT_PUBKEY_LABEL: i64 = -1; + +impl ProtectedData { + pub(crate) fn from_cose_encrypt( + session: &Session, + protected_data: CoseEncrypt, + challenge: &[u8], + verified_device_info: &Value, + tag: &[u8], + ) -> Result<ProtectedData> { + let (recipient, eek) = Self::match_recipient(&protected_data.recipients)?; + + let mut headers = recipient.unprotected.rest; + let pubkey_index = headers + .iter() + .position(|p| p.0 == Label::Int(COSE_RECIPIENT_PUBKEY_LABEL)) + .context("Unable to locate public key in COSE_encrypt recipients.")?; + let mut pubkey_cose = match CoseKey::from_cbor_value(headers.remove(pubkey_index).1) { + Ok(key) => key, + Err(e) => bail!("Error converting CBOR into COSE_key: {:?}", e), + }; + + Self::work_around_recipient_key_missing_alg(&mut pubkey_cose, &eek)?; + + let pubkey = KeyAgreementPublicKey::from_cose_key(&pubkey_cose)?; + let encryption_key = eek::derive_ephemeral_symmetric_key(&eek, pubkey.pkey()) + .with_context(|| format!("for pubkey {:?}", pubkey_cose))?; + + let protected_data_plaintext = protected_data + .decrypt(&[], |ciphertext, aad| { + let (ciphertext, tag) = ciphertext.split_at(ciphertext.len() - 16); + let mut plaintext = Vec::new(); + let mut ctx = CipherCtx::new().context("Unable to load cipher context")?; + // decrypt_init must be called twice because our IV is not 12 bytes, which is what + // AES-GCM wants by default. The first init tells openssl the cipher+mode, then we + // can tell openssl the IV len, and only after that can we set the non-standard IV. + ctx.decrypt_init(Some(Cipher::aes_256_gcm()), Some(&encryption_key), None)?; + ctx.set_iv_length(protected_data.unprotected.iv.len())?; + ctx.decrypt_init(None, None, Some(&protected_data.unprotected.iv))?; + ctx.set_tag(tag)?; + ctx.cipher_update(aad, None).context("Error setting AAD on cipher")?; + ctx.cipher_update_vec(ciphertext, &mut plaintext) + .context("Error decrypting ciphertext")?; + ctx.cipher_final_vec(&mut plaintext).context("Error finalizing decryption")?; + Ok::<Vec<u8>, anyhow::Error>(plaintext) + }) + .context("while decrypting ProtectedData")?; + + Self::from_cbor_bytes( + session, + &protected_data_plaintext, + challenge, + verified_device_info, + tag, + ) + } + + fn from_cbor_bytes( + session: &Session, + plaintext_cbor: &[u8], + challenge: &[u8], + verified_device_info: &Value, + tag: &[u8], + ) -> Result<Self> { + let mut array = match value_from_bytes(plaintext_cbor) { + Ok(Value::Array(a)) => a, + Ok(other) => bail!("Expected array for ProtectedDataPayload, found {other:?}"), + Err(e) => bail!( + "Error '{e:?}' parsing ProtectedDataPayload '{}'", + hex::encode(plaintext_cbor) + ), + }; + + if array.len() != 2 && array.len() != 3 { + bail!("ProtectedDataPayload size must be 2 or 3, found {array:?}"); + } + + // pull items out in reverse order to avoid shifting the vector + let uds_certs = if array.len() != 3 { + None + } else { + let uds_certs_field = FieldValue::from_optional_value("UdsCerts", array.pop()); + Self::to_uds_certs(uds_certs_field.into_map()?)? + }; + + let dice_chain = + Value::Array(FieldValue::from_optional_value("DiceChain", array.pop()).into_array()?); + let dice_chain = ChainForm::from_value(session, dice_chain)?; + + let mac_key = Self::validate_mac_key( + challenge, + verified_device_info, + tag, + FieldValue::from_optional_value("SignedMac", array.pop()).into_cose_sign1()?, + dice_chain.leaf_public_key(), + )?; + + Ok(ProtectedData::new(mac_key, dice_chain, uds_certs)) + } + + fn validate_mac_key( + challenge: &[u8], + verified_device_info: &Value, + tag: &[u8], + signed_mac: CoseSign1, + signer: &PublicKey, + ) -> Result<Vec<u8>> { + let mut aad: Vec<u8> = vec![]; + ciborium::ser::into_writer( + // This can be optimized if/when ciborium exposes lower-level serialization routines + &Value::Array(vec![ + Value::Bytes(challenge.to_vec()), + verified_device_info.clone(), + Value::Bytes(tag.to_vec()), + ]), + &mut aad, + )?; + signer.verify_cose_sign1(&signed_mac, &aad).context("verifying signed MAC")?; + signed_mac.payload.ok_or(anyhow!("SignedMac is missing the payload")) + } + + fn to_uds_certs(kv_pairs: Vec<(Value, Value)>) -> Result<Option<UdsCerts>> { + if kv_pairs.is_empty() { + return Ok(None); + } + + let mut uds_certs = UdsCerts::new(); + for pair in kv_pairs { + match pair { + (Value::Text(signer), value) => uds_certs.add_signer(signer, value)?, + (k, v) => bail!("Expected (string, value), but found ({k:?}, {v:?}"), + } + } + Ok(Some(uds_certs)) + } + + fn work_around_recipient_key_missing_alg( + cose_key: &mut CoseKey, + eek: &PKey<Private>, + ) -> Result<()> { + let cose_alg = match eek.id() { + Id::X25519 => iana::Algorithm::ECDH_ES_HKDF_256, + Id::EC if eek.bits() == 256 => iana::Algorithm::ES256, + other => bail!("Unsupported EEK: {:?}, key size: {}", other, eek.bits()), + }; + + match &cose_key.alg { + None => cose_key.alg = Some(Algorithm::Assigned(cose_alg)), + Some(Algorithm::Assigned(alg)) if *alg == cose_alg => (), + Some(Algorithm::Assigned(alg)) => { + bail!("Algorithm mismatch between EEK ({cose_alg:?}) and recipient ({alg:?})") + } + other => bail!("COSE_Encrypt recipient pubkey has unexpected algorithm: {other:?}"), + } + Ok(()) + } + + /// Look through a set of COSE_recipients to see if any of them match a known EEK. If so,V + /// return the matching recipieint and EEK to the caller so they can perform key agreement. + fn match_recipient(recipients: &Vec<CoseRecipient>) -> Result<(CoseRecipient, PKey<Private>)> { + for r in recipients { + if r.unprotected.key_id == eek::X25519_EEK_ID { + return Ok((r.clone(), eek::x25519_geek())); + } else if r.unprotected.key_id == eek::P256_EEK_ID { + return Ok((r.clone(), eek::p256_geek())); + } + } + Err(anyhow!("Unable to locate a COSE_recipient matching any known EEK")) + } +} + +impl UdsCerts { + pub fn add_signer(&mut self, signer: String, data: Value) -> Result<()> { + // For now, assume all signers are using x.509 certs. This may change in the future for + // platforms that need custom certification mechanisms for UDS_pub. + match self.0.get_mut(&signer) { + Some(_) => bail!("Signer '{signer}' entry found twice in the UdsCerts"), + None => self.0.insert(signer, UdsCertsEntry::from_cbor_value(data)?), + }; + Ok(()) + } +} + +impl UdsCertsEntry { + fn from_cbor_value(data: Value) -> Result<Self> { + match data { + Value::Array(certs) => { + let mut cert_buffers = vec![]; + for cert in certs { + match cert { + Value::Bytes(b) => cert_buffers.push(b), + other => bail!("Expected UDS cert byte array found '{other:?}'"), + } + } + UdsCertsEntry::new_x509_chain(cert_buffers) + } + other => Err(anyhow!("Expected CBOR array of certificates, found {other:?}")), + } + } +}
diff --git a/remote_provisioning/hwtrust/src/dice.rs b/remote_provisioning/hwtrust/src/dice.rs index feaf984..7373abc 100644 --- a/remote_provisioning/hwtrust/src/dice.rs +++ b/remote_provisioning/hwtrust/src/dice.rs
@@ -2,7 +2,9 @@ mod chain; mod entry; +mod profile; pub use chain::{Chain, ChainForm, DegenerateChain}; pub use entry::{ComponentVersion, ConfigDesc, DiceMode, Payload}; pub(crate) use entry::{ConfigDescBuilder, PayloadBuilder}; +pub use profile::ProfileVersion;
diff --git a/remote_provisioning/hwtrust/src/dice/chain.rs b/remote_provisioning/hwtrust/src/dice/chain.rs index 0d36aee..9a606cf 100644 --- a/remote_provisioning/hwtrust/src/dice/chain.rs +++ b/remote_provisioning/hwtrust/src/dice/chain.rs
@@ -6,6 +6,7 @@ use thiserror::Error; /// Enumeration of the different forms that a DICE chain can take. +#[derive(Clone, Debug, Eq, PartialEq)] pub enum ChainForm { /// A proper DICE chain with multiple layers of trust. Proper(Chain), @@ -15,7 +16,7 @@ /// Represents a DICE chain. This consists of the root public key (which signs the first /// certificate), followed by a chain of certificates. -#[derive(Debug)] +#[derive(Clone, Eq, PartialEq)] pub struct Chain { root_public_key: PublicKey, payloads: Vec<Payload>, @@ -33,6 +34,15 @@ RepeatedKey(usize), } +impl ChainForm { + pub(crate) fn leaf_public_key(&self) -> &PublicKey { + match self { + Self::Proper(chain) => chain.leaf().subject_public_key(), + Self::Degenerate(degenerate) => degenerate.public_key(), + } + } +} + impl Chain { /// Builds a [`Chain`] after checking that it is well-formed. The issuer of each entry must be /// equal to the subject of the previous entry. The chain is not allowed to contain any @@ -102,6 +112,17 @@ } } +impl fmt::Debug for Chain { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + let mut debug = fmt.debug_struct("Chain"); + debug.field("Root public key", &self.root_public_key.to_pem()); + for (i, payload) in self.payloads.iter().enumerate() { + debug.field(&format!("DICE Certificate[{i}]"), payload); + } + debug.finish() + } +} + #[derive(Error, Debug, PartialEq, Eq)] pub(crate) enum DegenerateChainError { #[error("issuer empty")] @@ -113,7 +134,7 @@ /// A degenerate DICE chain. These chains consist of a single, self-signed certificate and the /// entries contain less information than usual. They are expected from devices that haven't /// implemented everything necessary to produce a proper DICE Chain. -#[derive(Debug)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct DegenerateChain { issuer: String, subject: String, @@ -253,7 +274,7 @@ #[test] fn degenerate_chain_valid() { let key = PrivateKey::from_pem(ED25519_KEY_PEM[0]).public_key(); - DegenerateChain::new("issuer", "subject", key).unwrap(); + DegenerateChain::new("issuer", "issuer", key).unwrap(); } #[test]
diff --git a/remote_provisioning/hwtrust/src/dice/entry.rs b/remote_provisioning/hwtrust/src/dice/entry.rs index 6c5abf4..2f6cbfd 100644 --- a/remote_provisioning/hwtrust/src/dice/entry.rs +++ b/remote_provisioning/hwtrust/src/dice/entry.rs
@@ -18,7 +18,7 @@ } /// The payload of a DICE chain entry. -#[derive(Debug)] +#[derive(Clone, Eq, PartialEq)] pub struct Payload { issuer: String, subject: String, @@ -100,24 +100,47 @@ writeln!(f, "Authority Desc: {}", hex::encode(authority_desc))?; } writeln!(f, "Authority Hash: {}", hex::encode(&self.authority_hash))?; - writeln!(f, "Config Desc:")?; + writeln!(f, "Config Desc {{")?; write!(f, "{}", &self.config_desc)?; + writeln!(f, "}}")?; Ok(()) } } +impl fmt::Debug for Payload { + fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> { + let mut debug = f.debug_struct("Payload"); + debug.field("Issuer", &self.issuer); + debug.field("Subject", &self.subject); + debug.field("Mode", &self.mode); + if let Some(code_desc) = &self.code_desc { + debug.field("Code Desc", &hex::encode(code_desc)); + } + debug.field("Code Hash", &hex::encode(&self.code_hash)); + if let Some(config_hash) = &self.config_hash { + debug.field("Config Hash", &hex::encode(config_hash)); + } + if let Some(authority_desc) = &self.authority_desc { + debug.field("Authority Desc", &hex::encode(authority_desc)); + } + debug.field("Authority Hash", &hex::encode(&self.authority_hash)); + debug.field("Config Desc", &self.config_desc); + debug.finish() + } +} + #[derive(Error, Debug, PartialEq, Eq)] pub(crate) enum PayloadBuilderError { #[error("issuer empty")] IssuerEmpty, #[error("subject empty")] SubjectEmpty, - #[error("bad code hash size")] - CodeHashSize, - #[error("bad config hash size")] - ConfigHashSize, - #[error("bad authority hash size")] - AuthorityHashSize, + #[error("bad code hash size, actual: {0}, expected: 32, 48, or 64")] + CodeHashSize(usize), + #[error("bad config hash size, actual: {0}, expected: {1}")] + ConfigHashSize(usize, usize), + #[error("bad authority hash size, actual: {0}, expected: {1}")] + AuthorityHashSize(usize, usize), } pub(crate) struct PayloadBuilder(Payload); @@ -149,15 +172,18 @@ } let used_hash_size = self.0.code_hash.len(); if ![32, 48, 64].contains(&used_hash_size) { - return Err(PayloadBuilderError::CodeHashSize); + return Err(PayloadBuilderError::CodeHashSize(used_hash_size)); } if let Some(ref config_hash) = self.0.config_hash { if config_hash.len() != used_hash_size { - return Err(PayloadBuilderError::ConfigHashSize); + return Err(PayloadBuilderError::ConfigHashSize(config_hash.len(), used_hash_size)); } } if self.0.authority_hash.len() != used_hash_size { - return Err(PayloadBuilderError::AuthorityHashSize); + return Err(PayloadBuilderError::AuthorityHashSize( + self.0.authority_hash.len(), + used_hash_size, + )); } Ok(self.0) } @@ -252,6 +278,8 @@ component_version: Option<ComponentVersion>, resettable: bool, security_version: Option<u64>, + rkp_vm_marker: bool, + extensions: Vec<(String, String)>, } impl ConfigDesc { @@ -274,6 +302,16 @@ pub fn security_version(&self) -> Option<u64> { self.security_version } + + /// Returns whether the component may be part of an RPK VM. + pub fn rkp_vm_marker(&self) -> bool { + self.rkp_vm_marker + } + + /// Return any extensions present in the descriptor. + pub fn extensions(&self) -> &[(String, String)] { + &self.extensions + } } impl Display for ConfigDesc { @@ -290,6 +328,12 @@ if let Some(security_version) = &self.security_version { writeln!(f, "Security Version: {}", security_version)?; } + if self.rkp_vm_marker { + writeln!(f, "RKP VM Marker")?; + } + for (key, value) in &self.extensions { + writeln!(f, "{key}: {value}")?; + } Ok(()) } } @@ -334,6 +378,20 @@ self.0.security_version = version; self } + + /// Sets whether the component may be part of an RKP VM. + #[must_use] + pub fn rkp_vm_marker(mut self, rkp_vm_marker: bool) -> Self { + self.0.rkp_vm_marker = rkp_vm_marker; + self + } + + /// Sets the extension key/value pairs. + #[must_use] + pub fn extensions(mut self, extensions: Vec<(String, String)>) -> Self { + self.0.extensions = extensions; + self + } } #[cfg(test)] @@ -391,26 +449,26 @@ #[test] fn payload_builder_bad_code_hash_size() { let err = valid_payload().code_hash(vec![1; 16]).build().unwrap_err(); - assert_eq!(err, PayloadBuilderError::CodeHashSize); + assert_eq!(err, PayloadBuilderError::CodeHashSize(16)); } #[test] fn payload_builder_bad_authority_hash_size() { let err = valid_payload().authority_hash(vec![1; 16]).build().unwrap_err(); - assert_eq!(err, PayloadBuilderError::AuthorityHashSize); + assert_eq!(err, PayloadBuilderError::AuthorityHashSize(16, 64)); } #[test] fn payload_builder_inconsistent_authority_hash_size() { let err = valid_payload().code_hash(vec![1; 32]).authority_hash(vec![1; 64]).build().unwrap_err(); - assert_eq!(err, PayloadBuilderError::AuthorityHashSize); + assert_eq!(err, PayloadBuilderError::AuthorityHashSize(64, 32)); } #[test] fn payload_builder_bad_config_hash_size() { let err = valid_payload().config_hash(Some(vec![1; 16])).build().unwrap_err(); - assert_eq!(err, PayloadBuilderError::ConfigHashSize); + assert_eq!(err, PayloadBuilderError::ConfigHashSize(16, 64)); } #[test] @@ -420,7 +478,7 @@ .config_hash(Some(vec![1; 32])) .build() .unwrap_err(); - assert_eq!(err, PayloadBuilderError::ConfigHashSize); + assert_eq!(err, PayloadBuilderError::ConfigHashSize(32, 64)); } fn valid_payload() -> PayloadBuilder {
diff --git a/remote_provisioning/hwtrust/src/dice/profile.rs b/remote_provisioning/hwtrust/src/dice/profile.rs new file mode 100644 index 0000000..ae8d52f --- /dev/null +++ b/remote_provisioning/hwtrust/src/dice/profile.rs
@@ -0,0 +1,54 @@ +use std::error::Error; +use std::fmt::{self, Display, Formatter}; +use std::str::FromStr; + +/// Versions of the Android Profile for DICE. +#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Ord, PartialOrd)] +pub enum ProfileVersion { + /// The version of the Android Profile for DICE that aligns with Android 13. + Android13, + /// The version of the Android Profile for DICE that aligns with Android 14. + #[default] + Android14, + /// The version of the Android Profile for DICE that aligns with Android 15. + Android15, + /// The version of the Android Profile for DICE that aligns with Android 16. + Android16, +} + +impl Display for ProfileVersion { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + let profile_name = match self { + Self::Android13 => "android.13", + Self::Android14 => "android.14", + Self::Android15 => "android.15", + Self::Android16 => "android.16", + }; + write!(f, "{profile_name}",) + } +} + +/// An error which can be returned when parsing an Android Profile for DICE version. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct ParseProfileVersionError(()); + +impl fmt::Display for ParseProfileVersionError { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + write!(fmt, "unknown profile version") + } +} + +impl Error for ParseProfileVersionError {} + +impl FromStr for ProfileVersion { + type Err = ParseProfileVersionError; + + fn from_str(s: &str) -> Result<Self, Self::Err> { + Ok(match s { + "android.14" => Self::Android14, + "android.15" => Self::Android15, + "android.16" => Self::Android16, + _ => return Err(ParseProfileVersionError(())), + }) + } +}
diff --git a/remote_provisioning/hwtrust/src/eek.rs b/remote_provisioning/hwtrust/src/eek.rs new file mode 100644 index 0000000..55127a5 --- /dev/null +++ b/remote_provisioning/hwtrust/src/eek.rs
@@ -0,0 +1,109 @@ +//! This module contains the Endpoint Encryption Keys (EEK) utilities for encrypting +//! factory payloads for CSR versions 1 & 2. EEK usage was dropped for CSR v3. +//! +//! NOTE: Since CSR version 3 drops the encryption requirement, Google is publishing +//! the private Google EEKs so that testing on platforms that support CSR versions +//! 1 & 2 have diagnostic parity with CSR v3 systems. + +use anyhow::{bail, Context, Result}; +use coset::{CborSerializable, CoseKdfContextBuilder, Nonce, PartyInfo, SuppPubInfoBuilder}; +use openssl::{ + bn::{BigNum, BigNumContext}, + derive::Deriver, + ec::{EcGroup, EcKey, EcPoint, PointConversionForm}, + md::Md, + nid::Nid, + pkey::{HasPublic, Id, PKey, PKeyRef, Private, Public}, + pkey_ctx::PkeyCtx, +}; + +pub const X25519_EEK_ID: &[u8] = b"\xd0\xae\xc1\x15\xca\x2a\xcf\x73\xae\x6b\xcc\xcb\xd1\x96\x1d\x65\xe8\xb1\xdd\xd7\x4a\x1a\x37\xb9\x43\x3a\x97\xd5\x99\xdf\x98\x08"; +// X25519_EEK_PUBLIC_X: b"\xbe\x85\xe7\x46\xc4\xa3\x42\x5a\x40\xd9\x36\x3a\xa6\x15\xd0\x2c\x58\x7e\x3d\xdc\x33\x02\x32\xd2\xfc\x5e\x1e\x87\x25\x5f\x72\x60"; +pub const X25519_EEK_PRIVATE: &[u8] = b"\x47\x66\x65\xdb\xaa\xe1\x1d\xdb\xd3\x03\xf7\xad\x68\xbb\xff\x8d\x90\xaf\x8a\x4f\xb8\xbf\x7c\xf3\x39\xc7\xe9\x73\xec\x70\x75\x8c"; + +pub const P256_EEK_ID: &[u8] = b"\x35\x73\xb7\x3f\xa0\x8a\x80\x89\xb1\x26\x67\xe9\xcb\x7c\x75\xa1\xaf\x02\x61\xfc\x6e\x65\x03\x91\x3b\xd3\x4b\x7d\x14\x94\x3e\x46"; +pub const P256_EEK_PUBLIC_X: &[u8] = b"\xe0\x41\xcf\x2f\x0f\x34\x0f\x1c\x33\x2c\x41\xb0\xcf\xd7\x0c\x30\x55\x35\xd2\x1e\x6a\x47\x13\x4b\x2e\xd1\x48\x96\x7e\x24\x9c\x68"; +pub const P256_EEK_PUBLIC_Y: &[u8] = b"\x1f\xce\x45\xc5\xfb\x61\xba\x81\x21\xf9\xe5\x05\x9b\x9b\x39\x0e\x76\x86\x86\x47\xb8\x1e\x2f\x45\xf1\xce\xaf\xda\x3f\x80\x68\xdb"; +pub const P256_EEK_PRIVATE: &[u8] = b"\x00\xd1\x0a\x51\x59\xb2\xa0\x39\x43\xc8\x58\xf1\xdc\x3f\xc4\x0a\x03\x39\x31\x9d\x34\x01\x8f\x30\xa9\xc4\x46\x7e\x64\x61\x35\x6d\xdf"; + +/// Get the well-known P256 GEEK private key. +pub fn p256_geek() -> PKey<Private> { + let p256 = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); + let private = BigNum::from_slice(P256_EEK_PRIVATE).unwrap(); + let mut public_key = EcPoint::new(&p256).unwrap(); + public_key + .set_affine_coordinates_gfp( + &p256, + &BigNum::from_slice(P256_EEK_PUBLIC_X).unwrap(), + &BigNum::from_slice(P256_EEK_PUBLIC_Y).unwrap(), + &mut BigNumContext::new().unwrap(), + ) + .unwrap(); + + let ec_key = EcKey::from_private_components(&p256, &private, &public_key).unwrap(); + PKey::from_ec_key(ec_key).unwrap() +} + +/// Get the well-known X25519 GEEK private key. +pub fn x25519_geek() -> PKey<Private> { + PKey::private_key_from_raw_bytes(X25519_EEK_PRIVATE, Id::X25519).unwrap() +} + +pub fn derive_ephemeral_symmetric_key( + private: &PKeyRef<Private>, + public: &PKeyRef<Public>, +) -> Result<[u8; 32]> { + let mut deriver = Deriver::new(private)?; + deriver.set_peer(public)?; + let shared_secret = deriver.derive_to_vec()?; + + let supp_pub_info = SuppPubInfoBuilder::new().key_data_length(256).build(); + + let context = CoseKdfContextBuilder::new() + .algorithm(coset::iana::Algorithm::A256GCM) + .party_u_info(kdf_party_info(b"client", public)?) + .party_v_info(kdf_party_info(b"server", private)?) + .supp_pub_info(supp_pub_info) + .build(); + let hkdf_info = match context.to_vec() { + Ok(v) => v, + Err(e) => bail!("Error serializing COSE_KDF_Context: {e}"), + }; + + let mut kdf = PkeyCtx::new_id(Id::HKDF)?; + kdf.derive_init()?; + kdf.set_hkdf_key(&shared_secret)?; + kdf.set_hkdf_md(Md::sha256())?; + kdf.add_hkdf_info(&hkdf_info)?; + + let mut derived_key = [0; 32]; + kdf.derive(Some(&mut derived_key))?; + Ok(derived_key) +} + +fn kdf_party_info<T: HasPublic>(identity: &[u8], key: &PKeyRef<T>) -> Result<PartyInfo> { + Ok(PartyInfo { + identity: Some(identity.to_vec()), + nonce: Some(Nonce::Bytes(vec![])), + other: Some(raw_key_bytes(key)?), + }) +} + +fn raw_key_bytes<T: HasPublic>(key: &PKeyRef<T>) -> Result<Vec<u8>> { + match key.id() { + Id::X25519 => key.raw_public_key().context("Unable to fetch raw public key"), + Id::EC => { + let ec = key.ec_key()?; + let mut ctx = BigNumContext::new()?; + let mut uncompressed = ec.public_key().to_bytes( + ec.group(), + PointConversionForm::UNCOMPRESSED, + &mut ctx, + )?; + // uncompressed format is '04 | X | Y'. For KDF purposes, we just want 'X | Y' + uncompressed.remove(0); + Ok(uncompressed) + } + other => bail!("Unsupported public key type {other:?}"), + } +}
diff --git a/remote_provisioning/hwtrust/src/lib.rs b/remote_provisioning/hwtrust/src/lib.rs index 282ecb5..2b14dba 100644 --- a/remote_provisioning/hwtrust/src/lib.rs +++ b/remote_provisioning/hwtrust/src/lib.rs
@@ -3,6 +3,8 @@ pub mod dice; pub mod publickey; +pub mod rkp; pub mod session; mod cbor; +mod eek;
diff --git a/remote_provisioning/hwtrust/src/main.rs b/remote_provisioning/hwtrust/src/main.rs index 1f50f52..9cfcc97 100644 --- a/remote_provisioning/hwtrust/src/main.rs +++ b/remote_provisioning/hwtrust/src/main.rs
@@ -1,10 +1,13 @@ //! A tool for handling data related to the hardware root-of-trust. -use anyhow::Result; +use anyhow::{bail, Result}; use clap::{Parser, Subcommand, ValueEnum}; use hwtrust::dice; +use hwtrust::dice::ChainForm; +use hwtrust::rkp; use hwtrust::session::{Options, Session}; -use std::fs; +use std::io::BufRead; +use std::{fs, io}; #[derive(Parser)] /// A tool for handling data related to the hardware root-of-trust @@ -12,11 +15,25 @@ struct Args { #[clap(subcommand)] action: Action, + + /// Verbose output, including parsed data structures. + #[clap(long)] + verbose: bool, + + /// The VSR version to validate against. If omitted, the set of rules that are used have no + /// compromises or workarounds and new implementations should validate against them as it will + /// be the basis for future VSR versions. + #[clap(long, value_enum)] + vsr: Option<VsrVersion>, } #[derive(Subcommand)] enum Action { - VerifyDiceChain(VerifyDiceChainArgs), + /// Deprecated alias of dice-chain + VerifyDiceChain(DiceChainArgs), + DiceChain(DiceChainArgs), + FactoryCsr(FactoryCsrArgs), + Csr(CsrArgs), } #[derive(Parser)] @@ -27,19 +44,30 @@ /// /// [1] -- https://cs.android.com/android/platform/superproject/+/master:hardware/interfaces/security/rkp/aidl/android/hardware/security/keymint/IRemotelyProvisionedComponent.aidl /// [2] -- https://pigweed.googlesource.com/open-dice/+/refs/heads/main/docs/specification.md -struct VerifyDiceChainArgs { - /// Dump the DICE chain on the standard output - #[clap(long)] - dump: bool, - +struct DiceChainArgs { /// Path to a file containing a DICE chain chain: String, +} - /// The VSR version to validate against. If omitted, the set of rules that are used have no - /// compromises or workarounds and new implementations should validate against them as it will - /// be the basis for future VSR versions. - #[clap(long, value_enum)] - vsr: Option<VsrVersion>, +#[derive(Parser)] +/// Verify a CSR generated by the rkp_factory_extraction_tool +/// +/// "v1" CSRs are also decrypted using the factory EEK. +struct FactoryCsrArgs { + /// Path to a file containing one or more CSRs, in the "csr+json" format as defined by + /// rkp_factory_extraction_tool. Each line is interpreted as a separate JSON blob containing + /// a base64-encoded CSR. + csr_file: String, +} + +#[derive(Parser)] +/// Parse and verify a request payload that is suitable for the RKP server's SignCertificates API. +/// In HALv3, this is the output of generateCertificateRequestV2. For previous HAL versions, +/// the CSR is constructed by the remote provisioning service client, but is constructed from the +/// outputs of generateCertificateRequest. +struct CsrArgs { + /// Path to a file containing a single CSR, encoded as CBOR. + csr_file: String, } #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] @@ -48,26 +76,101 @@ Vsr13, /// VSR 14 / Android U / 2023 Vsr14, + /// VSR 15 / Android V / 2024 + Vsr15, + /// VSR 16 / Android W / 2025 + Vsr16, +} + +fn session_from_vsr(vsr: Option<VsrVersion>) -> Session { + Session { + options: match vsr { + Some(VsrVersion::Vsr13) => Options::vsr13(), + Some(VsrVersion::Vsr14) => Options::vsr14(), + Some(VsrVersion::Vsr15) => Options::vsr15(), + Some(VsrVersion::Vsr16) => { + println!(); + println!(); + println!(" ********************************************************************"); + println!(" ! The selected VSR is not finalized and is subject to change. !"); + println!(" ! Please contact your TAM if you intend to depend on the !"); + println!(" ! validation rules use for the selected VSR. !"); + println!(" ********************************************************************"); + println!(); + println!(); + Options::vsr16() + } + None => Options::default(), + }, + } } fn main() -> Result<()> { let args = Args::parse(); - let Action::VerifyDiceChain(sub_args) = args.action; - let session = Session { - options: match sub_args.vsr { - Some(VsrVersion::Vsr13) => Options::vsr13(), - Some(VsrVersion::Vsr14) => Options::vsr14(), - None => Options::default(), - }, + let message = match &args.action { + Action::VerifyDiceChain(sub_args) => { + println!(); + println!(" ********************************************************************"); + println!(" ! 'verify-dice-chain' has been deprecated in favor of 'dice-chain'.!"); + println!(" ********************************************************************"); + println!(); + verify_dice_chain(&args, sub_args)? + } + Action::DiceChain(sub_args) => verify_dice_chain(&args, sub_args)?, + Action::FactoryCsr(sub_args) => parse_factory_csr(&args, sub_args)?, + Action::Csr(sub_args) => parse_csr(&args, sub_args)?, }; - let chain = dice::Chain::from_cbor(&session, &fs::read(sub_args.chain)?)?; - println!("Success!"); - if sub_args.dump { - print!("{}", chain); - } + println!("{}", message.unwrap_or(String::from("Success"))); Ok(()) } +fn verify_dice_chain(args: &Args, sub_args: &DiceChainArgs) -> Result<Option<String>> { + let session = session_from_vsr(args.vsr); + let chain = dice::ChainForm::from_cbor(&session, &fs::read(&sub_args.chain)?)?; + if args.verbose { + println!("{chain:#?}"); + } + if let ChainForm::Degenerate(_) = chain { + return Ok(Some(String::from( + "WARNING! +The given 'degenerate' DICE chain is valid. However, the degenerate chain form is deprecated in +favor of full DICE chains, rooted in ROM, that measure the system's boot components.", + ))); + } + Ok(None) +} + +fn parse_factory_csr(args: &Args, sub_args: &FactoryCsrArgs) -> Result<Option<String>> { + let session = session_from_vsr(args.vsr); + let input = &fs::File::open(&sub_args.csr_file)?; + let mut csr_count = 0; + for line in io::BufReader::new(input).lines() { + let line = line?; + if line.is_empty() { + continue; + } + let csr = rkp::FactoryCsr::from_json(&session, &line)?; + csr_count += 1; + if args.verbose { + println!("{csr_count}: {csr:#?}"); + } + } + if csr_count == 0 { + bail!("No CSRs found in the input file '{}'", sub_args.csr_file); + } + Ok(None) +} + +fn parse_csr(args: &Args, sub_args: &CsrArgs) -> Result<Option<String>> { + let session = session_from_vsr(args.vsr); + let input = &fs::File::open(&sub_args.csr_file)?; + let csr = rkp::Csr::from_cbor(&session, input)?; + if args.verbose { + print!("{csr:#?}"); + } + Ok(None) +} + #[cfg(test)] mod tests { use super::*;
diff --git a/remote_provisioning/hwtrust/src/publickey.rs b/remote_provisioning/hwtrust/src/publickey.rs index 562ec37..298c675 100644 --- a/remote_provisioning/hwtrust/src/publickey.rs +++ b/remote_provisioning/hwtrust/src/publickey.rs
@@ -8,13 +8,20 @@ use std::error::Error; use std::fmt; -/// Enumeration of the kinds of key that are supported. +/// The kinds of digital signature keys that are supported. #[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub(crate) enum Kind { +pub(crate) enum SignatureKind { Ed25519, Ec(EcKind), } +/// The kinds of key agreement keys that are supported. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) enum KeyAgreementKind { + X25519, + Ec(EcKind), +} + /// Enumeration of the kinds of elliptic curve keys that are supported. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub(crate) enum EcKind { @@ -22,28 +29,40 @@ P384, } -/// Struct wrapping the public key and relevant validation methods. -#[derive(Clone, Debug)] +// Wraps PKey<Public> so we can implement some traits around it, allowing for derived traits on +// types that include a PKey<Public>. +#[derive(Clone)] +struct PKeyPublicWrapper(PKey<Public>); + +/// Public key used for signature validation. +#[derive(Clone, Debug, Eq, PartialEq)] pub struct PublicKey { - kind: Kind, - pkey: PKey<Public>, + kind: SignatureKind, + pkey: PKeyPublicWrapper, +} + +/// Public key used for key agreement. +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct KeyAgreementPublicKey { + kind: KeyAgreementKind, + pkey: PKeyPublicWrapper, } impl PublicKey { - pub(crate) fn kind(&self) -> Kind { + pub(crate) fn kind(&self) -> SignatureKind { self.kind } pub(crate) fn pkey(&self) -> &PKeyRef<Public> { - &self.pkey + &self.pkey.0 } /// Verify that the signature obtained from signing the given message /// with the PublicKey matches the signature provided. pub fn verify(&self, signature: &[u8], message: &[u8]) -> Result<()> { let mut verifier = match self.kind { - Kind::Ed25519 => Verifier::new_without_digest(&self.pkey), - Kind::Ec(ec) => Verifier::new(digest_for_ec(ec), &self.pkey), + SignatureKind::Ed25519 => Verifier::new_without_digest(&self.pkey.0), + SignatureKind::Ec(ec) => Verifier::new(digest_for_ec(ec), &self.pkey.0), } .with_context(|| format!("Failed to create verifier {:?}", self.kind))?; let verified = @@ -54,7 +73,54 @@ /// Serializes the public key into a PEM-encoded SubjectPublicKeyInfo structure. pub fn to_pem(&self) -> String { - String::from_utf8(self.pkey.public_key_to_pem().unwrap()).unwrap() + self.pkey.to_pem() + } + + fn pkey_kind<T: HasParams>(pkey: &PKeyRef<T>) -> Option<SignatureKind> { + match pkey.id() { + Id::ED25519 => Some(SignatureKind::Ed25519), + Id::EC => pkey_ec_kind(pkey).map(SignatureKind::Ec), + _ => None, + } + } +} + +impl KeyAgreementPublicKey { + pub(crate) fn pkey(&self) -> &PKeyRef<Public> { + &self.pkey.0 + } + + /// Serializes the public key into a PEM-encoded SubjectPublicKeyInfo structure. + pub fn to_pem(&self) -> String { + self.pkey.to_pem() + } + + fn pkey_kind(pkey: &PKeyRef<Public>) -> Option<KeyAgreementKind> { + match pkey.id() { + Id::X25519 => Some(KeyAgreementKind::X25519), + Id::EC => pkey_ec_kind(pkey).map(KeyAgreementKind::Ec), + _ => None, + } + } +} + +impl Eq for PKeyPublicWrapper {} + +impl PartialEq for PKeyPublicWrapper { + fn eq(&self, rhs: &PKeyPublicWrapper) -> bool { + self.0.public_eq(&rhs.0) + } +} + +impl PKeyPublicWrapper { + fn to_pem(&self) -> String { + String::from_utf8(self.0.public_key_to_pem().unwrap()).unwrap() + } +} + +impl fmt::Debug for PKeyPublicWrapper { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + fmt.write_str(&self.to_pem()) } } @@ -74,17 +140,25 @@ type Error = TryFromPKeyError; fn try_from(pkey: PKey<Public>) -> Result<Self, Self::Error> { - let kind = pkey_kind(&pkey).ok_or(TryFromPKeyError(()))?; - Ok(Self { kind, pkey }) + let kind = PublicKey::pkey_kind(&pkey).ok_or(TryFromPKeyError(()))?; + Ok(Self { kind, pkey: PKeyPublicWrapper(pkey) }) } } -fn pkey_kind<T: HasParams>(pkey: &PKeyRef<T>) -> Option<Kind> { +impl TryFrom<PKey<Public>> for KeyAgreementPublicKey { + type Error = TryFromPKeyError; + + fn try_from(pkey: PKey<Public>) -> Result<Self, Self::Error> { + let kind = KeyAgreementPublicKey::pkey_kind(&pkey).ok_or(TryFromPKeyError(()))?; + Ok(Self { kind, pkey: PKeyPublicWrapper(pkey) }) + } +} + +fn pkey_ec_kind<T: HasParams>(pkey: &PKeyRef<T>) -> Option<EcKind> { match pkey.id() { - Id::ED25519 => Some(Kind::Ed25519), Id::EC => match pkey.ec_key().unwrap().group().curve_name() { - Some(Nid::X9_62_PRIME256V1) => Some(Kind::Ec(EcKind::P256)), - Some(Nid::SECP384R1) => Some(Kind::Ec(EcKind::P384)), + Some(Nid::X9_62_PRIME256V1) => Some(EcKind::P256), + Some(Nid::SECP384R1) => Some(EcKind::P384), _ => None, }, _ => None, @@ -106,6 +180,7 @@ fn from_ed25519_pkey() { let pkey = load_public_pkey(testkeys::ED25519_KEY_PEM[0]); let key: PublicKey = pkey.clone().try_into().unwrap(); + assert_eq!(key.kind, SignatureKind::Ed25519); assert_eq!(key.to_pem().as_bytes(), pkey.public_key_to_pem().unwrap()); } @@ -113,6 +188,7 @@ fn from_p256_pkey() { let pkey = load_public_pkey(testkeys::P256_KEY_PEM[0]); let key: PublicKey = pkey.clone().try_into().unwrap(); + assert_eq!(key.kind, SignatureKind::Ec(EcKind::P256)); assert_eq!(key.to_pem().as_bytes(), pkey.public_key_to_pem().unwrap()); } @@ -120,6 +196,7 @@ fn from_p384_pkey() { let pkey = load_public_pkey(testkeys::P384_KEY_PEM[0]); let key: PublicKey = pkey.clone().try_into().unwrap(); + assert_eq!(key.kind, SignatureKind::Ec(EcKind::P384)); assert_eq!(key.to_pem().as_bytes(), pkey.public_key_to_pem().unwrap()); } @@ -135,9 +212,70 @@ assert!(PublicKey::try_from(pkey).is_err()); } + #[test] + fn from_x25519_pkey_not_supported() { + let pkey = load_public_pkey(testkeys::X25519_KEY_PEM[0]); + assert!(PublicKey::try_from(pkey).is_err()); + } + + #[test] + fn key_agreement_key_from_x25519_pkey() { + let pkey = load_public_pkey(testkeys::X25519_KEY_PEM[0]); + let key: KeyAgreementPublicKey = pkey.clone().try_into().unwrap(); + assert_eq!(key.kind, KeyAgreementKind::X25519); + assert_eq!(key.to_pem().as_bytes(), pkey.public_key_to_pem().unwrap()); + } + + #[test] + fn key_agreement_key_from_p256_pkey() { + let pkey = load_public_pkey(testkeys::P256_KEY_PEM[0]); + let key: KeyAgreementPublicKey = pkey.clone().try_into().unwrap(); + assert_eq!(key.kind, KeyAgreementKind::Ec(EcKind::P256)); + assert_eq!(key.to_pem().as_bytes(), pkey.public_key_to_pem().unwrap()); + } + + #[test] + fn key_agreement_key_from_p384_pkey() { + let pkey = load_public_pkey(testkeys::P384_KEY_PEM[0]); + let key: KeyAgreementPublicKey = pkey.clone().try_into().unwrap(); + assert_eq!(key.kind, KeyAgreementKind::Ec(EcKind::P384)); + assert_eq!(key.to_pem().as_bytes(), pkey.public_key_to_pem().unwrap()); + } + + #[test] + fn key_agreement_key_from_ed25519_pkey_not_supported() { + let pkey = load_public_pkey(testkeys::ED25519_KEY_PEM[0]); + assert!(KeyAgreementPublicKey::try_from(pkey).is_err()); + } + pub fn load_public_pkey(pem: &str) -> PKey<Public> { testkeys::public_from_private(&PKey::private_key_from_pem(pem.as_bytes()).unwrap()) } + + #[test] + fn verify_pkey_equality() { + let first = PKeyPublicWrapper(load_public_pkey(testkeys::ED25519_KEY_PEM[0])); + let second = PKeyPublicWrapper(load_public_pkey(testkeys::ED25519_KEY_PEM[0])); + assert_eq!(&first, &first); + assert_eq!(&first, &second); + assert_eq!(&second, &first); + } + + #[test] + fn verify_key_kind_inequality() { + let ed25519 = PKeyPublicWrapper(load_public_pkey(testkeys::ED25519_KEY_PEM[0])); + let p256 = PKeyPublicWrapper(load_public_pkey(testkeys::P256_KEY_PEM[0])); + assert_ne!(&ed25519, &p256); + assert_ne!(&p256, &ed25519); + } + + #[test] + fn verify_key_bits_inequality() { + let first = PKeyPublicWrapper(load_public_pkey(testkeys::P256_KEY_PEM[0])); + let second = PKeyPublicWrapper(load_public_pkey(testkeys::P256_KEY_PEM[1])); + assert_ne!(&first, &second); + assert_ne!(&second, &first); + } } /// Keys and key handling utilities for use in tests. @@ -148,18 +286,18 @@ use openssl::sign::Signer; pub struct PrivateKey { - kind: Kind, + kind: SignatureKind, pkey: PKey<Private>, } impl PrivateKey { pub fn from_pem(pem: &str) -> Self { let pkey = PKey::private_key_from_pem(pem.as_bytes()).unwrap(); - let kind = pkey_kind(&pkey).expect("unsupported private key"); + let kind = PublicKey::pkey_kind(&pkey).expect("unsupported private key"); Self { kind, pkey } } - pub(crate) fn kind(&self) -> Kind { + pub(crate) fn kind(&self) -> SignatureKind { self.kind } @@ -169,8 +307,8 @@ pub fn sign(&self, message: &[u8]) -> Result<Vec<u8>> { let mut signer = match self.kind { - Kind::Ed25519 => Signer::new_without_digest(&self.pkey)?, - Kind::Ec(ec) => Signer::new(digest_for_ec(ec), &self.pkey)?, + SignatureKind::Ed25519 => Signer::new_without_digest(&self.pkey)?, + SignatureKind::Ec(ec) => Signer::new(digest_for_ec(ec), &self.pkey)?, }; signer.sign_oneshot_to_vec(message).context("signing message") } @@ -182,6 +320,11 @@ PKey::public_key_from_der(&pkey.public_key_to_der().unwrap()).unwrap() } + /// A selection of X25519 private keys. + pub const X25519_KEY_PEM: &[&str] = &["-----BEGIN PRIVATE KEY-----\n\ + MC4CAQAwBQYDK2VuBCIEIMDLdDFad6CwwacwNtW/kQujlrAkxIjQ/Co3DleSd9xV\n\ + -----END PRIVATE KEY-----\n"]; + /// A selection of Ed25519 private keys. pub const ED25519_KEY_PEM: &[&str] = &["-----BEGIN PRIVATE KEY-----\n\ MC4CAQAwBQYDK2VwBCIEILKW0KEeuieFxhDAzigQPE4XRTiQx+0/AlAjJqHmUWE6\n\
diff --git a/remote_provisioning/hwtrust/src/rkp.rs b/remote_provisioning/hwtrust/src/rkp.rs new file mode 100644 index 0000000..14929f1 --- /dev/null +++ b/remote_provisioning/hwtrust/src/rkp.rs
@@ -0,0 +1,17 @@ +//! This module contains data types used in Remote Key Provisioning. + +mod csr; +mod device_info; +mod factory_csr; +mod protected_data; + +pub use csr::Csr; + +pub use device_info::{ + DeviceInfo, DeviceInfoBootloaderState, DeviceInfoSecurityLevel, DeviceInfoVbState, + DeviceInfoVersion, +}; + +pub(crate) use protected_data::{ProtectedData, UdsCerts, UdsCertsEntry}; + +pub use factory_csr::FactoryCsr;
diff --git a/remote_provisioning/hwtrust/src/rkp/csr.rs b/remote_provisioning/hwtrust/src/rkp/csr.rs new file mode 100644 index 0000000..23c3081 --- /dev/null +++ b/remote_provisioning/hwtrust/src/rkp/csr.rs
@@ -0,0 +1,48 @@ +use std::fmt; + +use crate::{dice::Chain, rkp::DeviceInfo}; + +use super::ProtectedData; + +/// Represents a Certificate Signing Request that is sent to an RKP backend to request +/// certificates to be signed for a set of public keys. The CSR is partially generated by an +/// IRemotelyProvisionedComponent HAL. The set of public keys to be signed is authenticated +/// (signed) with a device-unique key. +#[derive(Clone, Eq, PartialEq)] +pub enum Csr { + /// CSR V2 was introduced in Android T. In this version, the payload is encrypted using + /// an Endpoint Encryption Key (EEK). + V2 { + /// Describes the device that is requesting certificates. + device_info: DeviceInfo, + /// This is the challenge that is authenticated inside the protected data. + challenge: Vec<u8>, + /// Contains the plaintext of the payload that was encrypted to an EEK. + protected_data: ProtectedData, + }, + /// CSR V3 was introduced in Android T. This version drops encryption of the payload. + V3 { + /// Describes the device that is requesting certificates. + device_info: DeviceInfo, + /// The DICE chain for the device + dice_chain: Chain, + }, +} + +impl fmt::Debug for Csr { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + match self { + Csr::V2 { device_info, challenge, protected_data } => fmt + .debug_struct("CSR V2") + .field("DeviceInfo", &device_info) + .field("Challenge", &hex::encode(challenge)) + .field("ProtectedData", &protected_data) + .finish(), + Csr::V3 { device_info, dice_chain } => fmt + .debug_struct("CSR V3") + .field("DeviceInfo", &device_info) + .field("DiceChain", &dice_chain) + .finish(), + } + } +}
diff --git a/remote_provisioning/hwtrust/src/rkp/device_info.rs b/remote_provisioning/hwtrust/src/rkp/device_info.rs new file mode 100644 index 0000000..c99f74d --- /dev/null +++ b/remote_provisioning/hwtrust/src/rkp/device_info.rs
@@ -0,0 +1,207 @@ +use anyhow::anyhow; +use hex; +use std::fmt; + +#[non_exhaustive] +#[derive(Clone, Eq, PartialEq)] +/// Describes a device that is registered with the RKP backend. This implementation contains fields +/// common to all versions defined in DeviceInfo.aidl. +pub struct DeviceInfo { + /// Version of this data structure. + pub version: DeviceInfoVersion, + /// The device's marketed brand. + pub brand: String, + /// The device maker. + pub manufacturer: String, + /// A variant of a device. Multiple products may be built off the same device. + pub product: String, + /// End-user-visible name of the product. + pub model: String, + /// The high-level industrial design. What makes up a "device" is generally hardware + /// characteristics like form factor, cpu, etc. Multiple products/models may be shipped on + /// the same underlying device. + pub device: String, + /// Verified boot state. + pub vb_state: DeviceInfoVbState, + /// Whether the bootloader is locked or not. + pub bootloader_state: DeviceInfoBootloaderState, + /// Digest of the verified boot metadata structures. + pub vbmeta_digest: Vec<u8>, + /// Partner-defined operating system version. + pub os_version: Option<String>, + /// Patch level of the system partition. + pub system_patch_level: u32, + /// Patch level of the kernel. + pub boot_patch_level: u32, + /// Patch level of the vendor partition. + pub vendor_patch_level: u32, + /// If backed by KeyMint, this is the security level of the HAL. + pub security_level: Option<DeviceInfoSecurityLevel>, + /// Whether or not secure boot is enforced/required by the SoC. + pub fused: bool, +} + +impl fmt::Debug for DeviceInfo { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + let security_level: &dyn fmt::Debug = self.security_level.as_ref().map_or(&"<none>", |s| s); + let os_version: &dyn fmt::Debug = self.os_version.as_ref().map_or(&"<none>", |v| v); + + fmt.debug_struct("DeviceInfo") + .field("version", &self.version) + .field("brand", &self.brand) + .field("manufacturer", &self.manufacturer) + .field("product", &self.product) + .field("model", &self.model) + .field("device", &self.device) + .field("vb_state", &self.vb_state) + .field("bootloader_state", &self.bootloader_state) + .field("vbmeta_digest", &hex::encode(&self.vbmeta_digest)) + .field("os_version", os_version) + .field("system_patch_level", &self.system_patch_level) + .field("boot_patch_level", &self.boot_patch_level) + .field("vendor_patch_level", &self.vendor_patch_level) + .field("security_level", security_level) + .field("fused", &self.fused) + .finish() + } +} + +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +/// Whether the bootloader allows unsigned or third-party-signed images. +pub enum DeviceInfoBootloaderState { + /// The bootloader is locked, and will only allow signed images. + Locked, + /// The bootloader will load arbitrary images. + Unlocked, + /// This field is a placeholder for the AVF backend. + Avf, +} + +impl TryFrom<&str> for DeviceInfoBootloaderState { + type Error = anyhow::Error; + + fn try_from(s: &str) -> Result<Self, Self::Error> { + match s.to_ascii_lowercase().as_str() { + "locked" => Ok(Self::Locked), + "unlocked" => Ok(Self::Unlocked), + "avf" => Ok(Self::Avf), + _ => Err(anyhow!("Invalid bootloader state: `{s}`")), + } + } +} + +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +/// State of the verified boot validation. +pub enum DeviceInfoVbState { + /// The device booted an OEM-signed image. + Green, + /// The device booted an image signed by a key set by the end user. + Yellow, + /// The bootloader is unlocked, and no guarantees of image integrity are available. + Orange, + /// This field is a placeholder for the AVF backend. + Avf, +} + +impl TryFrom<&str> for DeviceInfoVbState { + type Error = anyhow::Error; + + fn try_from(s: &str) -> Result<Self, Self::Error> { + match s.to_ascii_lowercase().as_str() { + "green" => Ok(Self::Green), + "yellow" => Ok(Self::Yellow), + "orange" => Ok(Self::Orange), + "avf" => Ok(Self::Avf), + _ => Err(anyhow!("Invalid VB state: `{s}`")), + } + } +} + +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +/// The version of the DeviceInfo structure, which may updated with HAL changes. +pub enum DeviceInfoVersion { + /// First supported version. Prior to this (V1), almost all fields were optional. + V2, + /// Explicit version removed from the CBOR. Otherwise identical to V2. + V3, +} + +impl TryFrom<u32> for DeviceInfoVersion { + type Error = anyhow::Error; + + fn try_from(i: u32) -> Result<Self, Self::Error> { + match i { + 2 => Ok(Self::V2), + 3 => Ok(Self::V3), + _ => Err(anyhow!("Invalid version: `{i}`")), + } + } +} + +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +/// This corresponds with where KeyMint's backing service lives: a TEE or in a separate SE. +pub enum DeviceInfoSecurityLevel { + /// KeyMint's backend runs in a Trusted Execution Environment. + Tee, + /// KeyMint's backend runs in a Secure Element. + StrongBox, + /// AVF's backend. + Avf, +} + +impl TryFrom<&str> for DeviceInfoSecurityLevel { + type Error = anyhow::Error; + + fn try_from(s: &str) -> Result<Self, Self::Error> { + match s.to_ascii_lowercase().as_str() { + "strongbox" => Ok(Self::StrongBox), + "tee" => Ok(Self::Tee), + "avf" => Ok(Self::Avf), + _ => Err(anyhow!("Invalid security level: `{s}`")), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn bootloader_state_from_string() { + assert_eq!( + DeviceInfoBootloaderState::try_from("LoCkEd").unwrap(), + DeviceInfoBootloaderState::Locked + ); + assert_eq!( + DeviceInfoBootloaderState::try_from("UNLocked").unwrap(), + DeviceInfoBootloaderState::Unlocked + ); + DeviceInfoBootloaderState::try_from("nope").unwrap_err(); + } + + #[test] + fn vb_state_from_string() { + assert_eq!(DeviceInfoVbState::try_from("greEN").unwrap(), DeviceInfoVbState::Green); + assert_eq!(DeviceInfoVbState::try_from("YeLLoW").unwrap(), DeviceInfoVbState::Yellow); + assert_eq!(DeviceInfoVbState::try_from("ORange").unwrap(), DeviceInfoVbState::Orange); + DeviceInfoVbState::try_from("bad").unwrap_err(); + } + + #[test] + fn version_from_int() { + DeviceInfoVersion::try_from(1).unwrap_err(); + assert_eq!(DeviceInfoVersion::try_from(2).unwrap(), DeviceInfoVersion::V2); + assert_eq!(DeviceInfoVersion::try_from(3).unwrap(), DeviceInfoVersion::V3); + DeviceInfoVersion::try_from(4).unwrap_err(); + } + + #[test] + fn security_level_from_string() { + assert_eq!( + DeviceInfoSecurityLevel::try_from("StrongBOX").unwrap(), + DeviceInfoSecurityLevel::StrongBox + ); + assert_eq!(DeviceInfoSecurityLevel::try_from("TeE").unwrap(), DeviceInfoSecurityLevel::Tee); + DeviceInfoSecurityLevel::try_from("insecure").unwrap_err(); + } +}
diff --git a/remote_provisioning/hwtrust/src/rkp/factory_csr.rs b/remote_provisioning/hwtrust/src/rkp/factory_csr.rs new file mode 100644 index 0000000..47fbb95 --- /dev/null +++ b/remote_provisioning/hwtrust/src/rkp/factory_csr.rs
@@ -0,0 +1,229 @@ +use crate::rkp::Csr; +use crate::session::Session; +use anyhow::{bail, Result}; +use serde_json::{Map, Value}; + +/// Represents a "Factory CSR", which is a JSON value captured for each device on the factory +/// line. This JSON is uploaded to the RKP backend to register the device. We reuse the CSR +/// (Certificate Signing Request) format for this as an implementation convenience. The CSR +/// actually contains an empty set of keys for which certificates are needed. +#[non_exhaustive] +#[derive(Debug, Eq, PartialEq)] +pub struct FactoryCsr { + /// The CSR, as created by an IRemotelyProvisionedComponent HAL. + pub csr: Csr, + /// The name of the HAL that generated the CSR. + pub name: String, +} + +fn get_string_from_map(fields: &Map<String, Value>, key: &str) -> Result<String> { + match fields.get(key) { + Some(Value::String(s)) => Ok(s.to_string()), + Some(v) => bail!("Unexpected type for '{key}'. Expected String, found '{v:?}'"), + None => bail!("Unable to locate '{key}' in input"), + } +} + +impl FactoryCsr { + /// Parse the input JSON string into a CSR that was captured on the factory line. The + /// format of the JSON data is defined by rkp_factory_extraction_tool. + pub fn from_json(session: &Session, json: &str) -> Result<Self> { + match serde_json::from_str(json) { + Ok(Value::Object(map)) => Self::from_map(session, map), + Ok(unexpected) => bail!("Expected a map, got some other type: {unexpected}"), + Err(e) => bail!("Error parsing input json: {e}"), + } + } + + fn from_map(session: &Session, fields: Map<String, Value>) -> Result<Self> { + let base64 = get_string_from_map(&fields, "csr")?; + let name = get_string_from_map(&fields, "name")?; + let csr = Csr::from_base64_cbor(session, &base64)?; + Ok(Self { csr, name }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::cbor::rkp::csr::testutil::{parse_pem_public_key_or_panic, test_device_info}; + use crate::dice::{ChainForm, DegenerateChain}; + use crate::rkp::device_info::DeviceInfoVersion; + use crate::rkp::factory_csr::FactoryCsr; + use crate::rkp::{ProtectedData, UdsCerts, UdsCertsEntry}; + use anyhow::anyhow; + use itertools::Itertools; + use openssl::{pkey::PKey, x509::X509}; + use std::fs; + use std::fs::File; + + fn json_map_from_file(path: &str) -> Result<Map<String, Value>> { + let input = File::open(path)?; + match serde_json::from_reader(input)? { + Value::Object(map) => Ok(map), + other => Err(anyhow!("Unexpected JSON. Wanted a map, found {other:?}")), + } + } + + #[test] + fn from_json_valid_v2_ed25519() { + let json = fs::read_to_string("testdata/factory_csr/v2_ed25519_valid.json").unwrap(); + let csr = FactoryCsr::from_json(&Session::default(), &json).unwrap(); + let subject_public_key = parse_pem_public_key_or_panic( + "-----BEGIN PUBLIC KEY-----\n\ + MCowBQYDK2VwAyEAOhWsfxcBLgUfLLdqpb8cLUWutkkPtfIqDRfJC3LUihI=\n\ + -----END PUBLIC KEY-----\n", + ); + let degenerate = ChainForm::Degenerate( + DegenerateChain::new("self-signed", "self-signed", subject_public_key).unwrap(), + ); + let chain = [ + "-----BEGIN CERTIFICATE-----\n\ + MIIBaDCCARqgAwIBAgIBezAFBgMrZXAwKzEVMBMGA1UEChMMRmFrZSBDb21wYW55\n\ + MRIwEAYDVQQDEwlGYWtlIFJvb3QwHhcNMjMwODAxMjI1MTM0WhcNMjMwODMxMjI1\n\ + MTM0WjArMRUwEwYDVQQKEwxGYWtlIENvbXBhbnkxEjAQBgNVBAMTCUZha2UgUm9v\n\ + dDAqMAUGAytlcAMhAJYhPNIeQXe6+GPFiQAg4WtK+D8HuWaF6Es4X3HgDzq7o2Mw\n\ + YTAdBgNVHQ4EFgQUDR0DF3abDeR3WXSlIhpN07R049owHwYDVR0jBBgwFoAUDR0D\n\ + F3abDeR3WXSlIhpN07R049owDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n\ + AgQwBQYDK2VwA0EAWNEhXrATWj4MXT/n38OwbngUm/n/5+vGFqV0aXuJPX/8d6Yx\n\ + BbX/LFv6m8/VuPuItSqK4AudgwZJoupR/lknDg==\n\ + -----END CERTIFICATE-----\n", + "-----BEGIN CERTIFICATE-----\n\ + MIIBbDCCAR6gAwIBAgICAcgwBQYDK2VwMCsxFTATBgNVBAoTDEZha2UgQ29tcGFu\n\ + eTESMBAGA1UEAxMJRmFrZSBSb290MB4XDTIzMDgwMTIyNTEzNFoXDTIzMDgzMTIy\n\ + NTEzNFowLjEVMBMGA1UEChMMRmFrZSBDb21wYW55MRUwEwYDVQQDEwxGYWtlIENo\n\ + aXBzZXQwKjAFBgMrZXADIQA6Fax/FwEuBR8st2qlvxwtRa62SQ+18ioNF8kLctSK\n\ + EqNjMGEwHQYDVR0OBBYEFEbOrkgBL2SUCLJayyvpc+oR7m6/MB8GA1UdIwQYMBaA\n\ + FA0dAxd2mw3kd1l0pSIaTdO0dOPaMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/\n\ + BAQDAgIEMAUGAytlcANBANJmKGgiZP3tqtjnHpbmR3ypkXtvuqmo6KTBIHKsGKAO\n\ + mH8qlMQPLmNSdxTs3OnVrlxQwZqXxHjVHS/6OpkkFgo=\n\ + -----END CERTIFICATE-----\n", + ]; + let chain = chain + .iter() + .map(|pem| X509::from_pem(pem.as_bytes()).unwrap().to_der().unwrap()) + .collect_vec(); + + let mut uds_certs = UdsCerts::new(); + uds_certs + .0 + .insert("google-test".to_string(), UdsCertsEntry::new_x509_chain(chain).unwrap()); + assert_eq!( + csr, + FactoryCsr { + csr: Csr::V2 { + device_info: test_device_info(DeviceInfoVersion::V2), + challenge: b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10" + .to_vec(), + protected_data: ProtectedData::new(vec![0; 32], degenerate, Some(uds_certs)), + }, + name: "default".to_string(), + } + ); + } + + #[test] + fn from_json_valid_v3_ed25519() { + let json = fs::read_to_string("testdata/factory_csr/v3_ed25519_valid.json").unwrap(); + let csr = FactoryCsr::from_json(&Session::default(), &json).unwrap(); + if let Csr::V3 { device_info, dice_chain } = csr.csr { + assert_eq!(device_info, test_device_info(DeviceInfoVersion::V3)); + let root_public_key = parse_pem_public_key_or_panic( + "-----BEGIN PUBLIC KEY-----\n\ + MCowBQYDK2VwAyEA3FEn/nhqoGOKNok1AJaLfTKI+aFXHf4TfC42vUyPU6s=\n\ + -----END PUBLIC KEY-----\n", + ); + assert_eq!(dice_chain.root_public_key(), &root_public_key); + assert_eq!(dice_chain.payloads().len(), 1); + } else { + panic!("Parsed CSR was not V3: {:?}", csr); + } + } + + #[test] + fn from_json_valid_v2_p256() { + let json = fs::read_to_string("testdata/factory_csr/v2_p256_valid.json").unwrap(); + let csr = FactoryCsr::from_json(&Session::default(), &json).unwrap(); + let pem = "-----BEGIN PUBLIC KEY-----\n\ + MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERd9pHZbUJ/b4IleUGDN8fs8+LDxE\n\ + vG6VX1dkw0sClFs4imbzfXGbocEq74S7TQiyZkd1LhY6HRZnTC51KoGDIA==\n\ + -----END PUBLIC KEY-----\n"; + let subject_public_key = + PKey::public_key_from_pem(pem.as_bytes()).unwrap().try_into().unwrap(); + let degenerate = ChainForm::Degenerate( + DegenerateChain::new("self-signed", "self-signed", subject_public_key).unwrap(), + ); + assert_eq!( + csr, + FactoryCsr { + csr: Csr::V2 { + device_info: test_device_info(DeviceInfoVersion::V2), + challenge: b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10" + .to_vec(), + protected_data: ProtectedData::new(vec![0; 32], degenerate, None), + }, + name: "default".to_string(), + } + ); + } + + #[test] + fn from_json_valid_v3_p256() { + let json = fs::read_to_string("testdata/factory_csr/v3_p256_valid.json").unwrap(); + let csr = FactoryCsr::from_json(&Session::default(), &json).unwrap(); + if let Csr::V3 { device_info, dice_chain } = csr.csr { + assert_eq!(device_info, test_device_info(DeviceInfoVersion::V3)); + let root_public_key = parse_pem_public_key_or_panic( + "-----BEGIN PUBLIC KEY-----\n\ + MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqT6ujVegwBbVWtsZeZmvN4WO3THx\n\ + zpPPnt2rAOdqL9DSDZcIBbLas5xh9psaEaD0o/0KxlUVZplO/BPmRf3Ycg==\n\ + -----END PUBLIC KEY-----\n", + ); + assert_eq!(dice_chain.root_public_key(), &root_public_key); + assert_eq!(dice_chain.payloads().len(), 1); + } else { + panic!("Parsed CSR was not V3: {:?}", csr); + } + } + + #[test] + fn from_json_name_is_missing() { + let mut value = json_map_from_file("testdata/factory_csr/v2_ed25519_valid.json").unwrap(); + value.remove_entry("name"); + let json = serde_json::to_string(&value).unwrap(); + let err = FactoryCsr::from_json(&Session::default(), &json).unwrap_err(); + assert!(err.to_string().contains("Unable to locate 'name'")); + } + + #[test] + fn from_json_name_is_wrong_type() { + let mut value = json_map_from_file("testdata/factory_csr/v2_ed25519_valid.json").unwrap(); + value.insert("name".to_string(), Value::Object(Map::default())); + let json = serde_json::to_string(&value).unwrap(); + let err = FactoryCsr::from_json(&Session::default(), &json).unwrap_err(); + assert!(err.to_string().contains("Unexpected type for 'name'")); + } + + #[test] + fn from_json_csr_is_missing() { + let json = r#"{ "name": "default" }"#; + let err = FactoryCsr::from_json(&Session::default(), json).unwrap_err(); + assert!(err.to_string().contains("Unable to locate 'csr'")); + } + + #[test] + fn from_json_csr_is_wrong_type() { + let json = r#"{ "csr": 3.1415, "name": "default" }"#; + let err = FactoryCsr::from_json(&Session::default(), json).unwrap_err(); + assert!(err.to_string().contains("Unexpected type for 'csr'")); + } + + #[test] + fn from_json_extra_tag_is_ignored() { + let mut value = json_map_from_file("testdata/factory_csr/v2_ed25519_valid.json").unwrap(); + value.insert("extra".to_string(), Value::Bool(true)); + let json = serde_json::to_string(&value).unwrap(); + let csr = FactoryCsr::from_json(&Session::default(), &json).unwrap(); + assert_eq!(csr.name, "default"); + } +}
diff --git a/remote_provisioning/hwtrust/src/rkp/protected_data.rs b/remote_provisioning/hwtrust/src/rkp/protected_data.rs new file mode 100644 index 0000000..a4fa5bd --- /dev/null +++ b/remote_provisioning/hwtrust/src/rkp/protected_data.rs
@@ -0,0 +1,71 @@ +use anyhow::Result; +use openssl::x509::X509; +use std::{collections::HashMap, fmt}; + +use crate::dice::ChainForm; + +#[derive(Clone, Eq, PartialEq)] +pub struct ProtectedData { + mac_key: Vec<u8>, + dice_chain: ChainForm, + uds_certs: Option<UdsCerts>, +} + +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct UdsCerts(pub(crate) HashMap<String, UdsCertsEntry>); + +/// Represent entries in the UDS certs mapping as an enum to support special cases in the future +/// where the input is not actually x.509 certs. +#[derive(Clone, Eq, PartialEq)] +pub enum UdsCertsEntry { + /// A chain of X.509 certificates that certify the UDS + X509Chain(Vec<Vec<u8>>), +} + +impl ProtectedData { + pub fn new(mac_key: Vec<u8>, dice_chain: ChainForm, uds_certs: Option<UdsCerts>) -> Self { + Self { mac_key, dice_chain, uds_certs } + } +} + +impl UdsCerts { + pub fn new() -> Self { + Self(HashMap::new()) + } +} + +impl UdsCertsEntry { + pub(crate) fn new_x509_chain(der_encoded_chain: Vec<Vec<u8>>) -> Result<Self> { + Ok(Self::X509Chain(der_encoded_chain)) + } +} + +impl fmt::Debug for ProtectedData { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + fmt.debug_struct("ProtectedData") + .field("mac_key", &hex::encode(&self.mac_key)) + .field("dice_chain", &self.dice_chain) + .field("uds_certs", &self.uds_certs) + .finish() + } +} + +impl fmt::Debug for UdsCertsEntry { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + match self { + Self::X509Chain(v) => format_x509_chain(fmt, v), + } + } +} + +fn format_x509_chain(fmt: &mut fmt::Formatter, chain: &Vec<Vec<u8>>) -> fmt::Result { + for c in chain { + fmt.write_str(&x509_der_to_pem(c).unwrap_or("[INVALID CERTIFICATE]".to_string()))?; + } + Ok(()) +} + +fn x509_der_to_pem(der: &[u8]) -> Result<String> { + let utf8 = X509::from_der(der)?.to_pem()?; + Ok(std::str::from_utf8(&utf8)?.to_string()) +}
diff --git a/remote_provisioning/hwtrust/src/session.rs b/remote_provisioning/hwtrust/src/session.rs index 53f2371..0b90ed6 100644 --- a/remote_provisioning/hwtrust/src/session.rs +++ b/remote_provisioning/hwtrust/src/session.rs
@@ -1,103 +1,92 @@ //! Defines the context type for a session handling hwtrust data structures. +use crate::dice::ProfileVersion; +use std::ops::RangeInclusive; + /// The context for a session handling hwtrust data structures. +#[derive(Default, Debug)] pub struct Session { /// Options that control the behaviour during this session. pub options: Options, } /// Options that control the behaviour of a session. -#[derive(Default)] +#[derive(Default, Debug)] pub struct Options { - /// The expected format for the configuration descriptor in the first certificate of the DICE - /// chain. When the chain is ROM-rooted, the first certificate is generated by ROM so this - /// option can be used for compatibility with ROMs. - pub first_dice_chain_cert_config_format: ConfigFormat, - - /// The types that are permitted for the key_ops field of COSE_Key objects in the DICE chain. - /// This option can be used for compatibility with the RKP HAL before v3 which diverged from - /// the COSE spec and allowed a single int instead of always requiring an array. - pub dice_chain_key_ops_type: KeyOpsType, - - /// The types that are permitted for the mode field of the DICE certificates. This option can - /// be used for compatibility with the RKP HAL v3 which allowed some deviations from the Open - /// Profile for DICE specification. - pub dice_chain_mode_type: ModeType, - - /// Whether to allow the key_usage field of the DICE certificates to be encoded in big-endian - /// byte order. This introduces ambiguity of the exact key usage being expressed but the keys - /// in the DICE chain are only used for verification so it may be preferable to allow for - /// compatibility with implementations that use the wrong endianness. - pub dice_chain_allow_big_endian_key_usage: bool, - - /// The types that are permitted for the component version field in the configuration - /// descriptor. The specification has changed the allowed types over time and this option - /// can be used to select which rules to apply. - pub dice_chain_component_version_type: ComponentVersionType, + /// The range of supported Android Profile for DICE versions. + pub dice_profile_range: DiceProfileRange, } -/// Format of the DICE configuration descriptor. -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -pub enum ConfigFormat { - /// The configuration descriptor format specified by Android. - #[default] - Android, - /// Any configuration descriptor format is allowed. - Permissive, +/// An inclusive range of Android Profile for DICE versions. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct DiceProfileRange(RangeInclusive<ProfileVersion>); + +impl DiceProfileRange { + /// Creates a new inclusive range of Android Profile for DICE versions. + pub fn new(start: ProfileVersion, end: ProfileVersion) -> Self { + Self(RangeInclusive::new(start, end)) + } + + /// Returns `true` if `version` is contained in the range. + pub fn contains(&self, version: ProfileVersion) -> bool { + self.0.contains(&version) + } + + /// Returns the lower bound of the range. + pub fn start(&self) -> ProfileVersion { + *self.0.start() + } + + /// Returns the upper bound of the range. + pub fn end(&self) -> ProfileVersion { + *self.0.end() + } } -/// Type allowed for the COSE_Key object key_ops field in the DICE chain. -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -pub enum KeyOpsType { - /// The key_ops field must be an array as specified in the COSE RFC. - #[default] - Array, - /// The key_ops field can be either a single int or an array as specified in the COSE RFC. - IntOrArray, -} - -/// Type allowed for the DICE certificate mode field. -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -pub enum ModeType { - /// The mode field must be a byte string holding a single byte as specified by the Open Profile - /// for DICE. - #[default] - Bytes, - /// The mode field can be either an int or a byte string holding a single byte. - IntOrBytes, -} - -/// Type allowed for the DICE certificate configuration descriptor's component version field. -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -pub enum ComponentVersionType { - /// The component version can be either an int or a free-form string. - #[default] - IntOrString, - /// The component version must be an int. - Int, +impl Default for DiceProfileRange { + fn default() -> Self { + Self::new(ProfileVersion::Android14, ProfileVersion::Android16) + } } impl Options { /// The options use by VSR 13. pub fn vsr13() -> Self { Self { - // Context: b/262599829#comment65 - dice_chain_key_ops_type: KeyOpsType::IntOrArray, - // Context: b/273552826 - dice_chain_component_version_type: ComponentVersionType::Int, - ..Options::default() + dice_profile_range: DiceProfileRange::new( + ProfileVersion::Android13, + ProfileVersion::Android13, + ), } } /// The options use by VSR 14. pub fn vsr14() -> Self { Self { - // Context: b/261647022 - first_dice_chain_cert_config_format: ConfigFormat::Permissive, - // Context: b/273552826 - dice_chain_mode_type: ModeType::IntOrBytes, - dice_chain_allow_big_endian_key_usage: true, - ..Options::default() + dice_profile_range: DiceProfileRange::new( + ProfileVersion::Android14, + ProfileVersion::Android14, + ), + } + } + + /// The options use by VSR 15. + pub fn vsr15() -> Self { + Self { + dice_profile_range: DiceProfileRange::new( + ProfileVersion::Android14, + ProfileVersion::Android15, + ), + } + } + + /// The options use by VSR 16. + pub fn vsr16() -> Self { + Self { + dice_profile_range: DiceProfileRange::new( + ProfileVersion::Android14, + ProfileVersion::Android16, + ), } } }
diff --git a/remote_provisioning/hwtrust/testdata/csr/bad_csr.cbor b/remote_provisioning/hwtrust/testdata/csr/bad_csr.cbor new file mode 100644 index 0000000..7a58924 --- /dev/null +++ b/remote_provisioning/hwtrust/testdata/csr/bad_csr.cbor Binary files differ
diff --git a/remote_provisioning/hwtrust/testdata/csr/v2_csr.base64 b/remote_provisioning/hwtrust/testdata/csr/v2_csr.base64 new file mode 100644 index 0000000..fc7830f --- /dev/null +++ b/remote_provisioning/hwtrust/testdata/csr/v2_csr.base64
@@ -0,0 +1 @@ +hIKvZWJyYW5kZkdvb2dsZWVmdXNlZAFlbW9kZWxlbW9kZWxmZGV2aWNlZmRldmljZWdwcm9kdWN0ZXBpeGVsZ3ZlcnNpb24CaHZiX3N0YXRlZWdyZWVuam9zX3ZlcnNpb25iMTJsbWFudWZhY3R1cmVyZkdvb2dsZW12Ym1ldGFfZGlnZXN0TxEiM0RVZneImaq7zN3u/25zZWN1cml0eV9sZXZlbGN0ZWVwYm9vdF9wYXRjaF9sZXZlbBoBNIxicGJvb3Rsb2FkZXJfc3RhdGVmbG9ja2VkcnN5c3RlbV9wYXRjaF9sZXZlbBoBNIxhcnZlbmRvcl9wYXRjaF9sZXZlbBoBNIxjoFABAgMEBQYHCAkKCwwNDg8QhEOhAQOhBVCr/oKcDPOg6uOCb5pCL1cvWQIrjq+3muSG/VeaKg6KRk7VZfEcBFEhWDyp7xNbctANbysjGel9+AZPX4T2rKxNqHY8wIcL60o54u+uWP3FBufg5LHUHbiRYytailRapw/QPa0wo8oFR4KiCJHdhz0V6bzYaIzoxu+Lbyu94Z5lt1wThlrcXEJv0fzCY7BMpiRpZ3V/ZC6BuJOldieZ3UPNDiVVdSdRieFcUeUVJFfYp6SiuMrous+RU/or7/rd8Rfyya/ZWpME9bkHpv8bRPnCY2IKzrYntnvXqiolgOV2kqXTMvM9mvJeR0nLcnpje/94fXoLYMBxiRAVdZRkb9/uQ0U139Luwl1aq0AxfldfYoyuqhP20Ej1bO6Vd4FSMntLKDzSKjHxMlc32fIm9t8bJvWy9tcE3TnMM6+Bqig0CRTbuJYSCkBwU+97CZDMSlvnXshii4d+dXzmyA6vWc7FDWQoigtUDwctWay00Pl0PReDodQk1YnxUJJWnZVduoOi4mvrh2C8lJQONK2BIV6mopVTFMmX3HM0LzgkP+2QTQEr5NlVIvanwmutHfj+RNbw/l7IyX2uQJae7OhlzWc9cG8D+/zaY+Ed6ICFle2To+I/mzoFNCOhSjfia0gXhflM3F0YYtSx6IVUQapdZFFL/pV+jfi8GY/MYMyKr/CMLUFRuDwWSHCtCea7ILyR9Th74zUMESm/OpTQQ1UjzPqPCQaV+YvlfjDEjDveWzdRryi+uJwO7c/r3lQS3A38gYNEoQE4GKIEWCA1c7c/oIqAibEmZ+nLfHWhrwJh/G5lA5E700t9FJQ+RiCkAQIgASFYIOBBzy8PNA8cMyxBsM/XDDBVNdIeakcTSy7RSJZ+JJxoIlggH85FxfthuoEh+eUFm5s5DnaGhke4Hi9F8c6v2j+AaNv2hEOhAQWgWJeCpAECIAEhWCDlxY4/5ECfw38CmLED7+l3xwW0gqLt0HImANA8QwXX6SJYIHIXmIeEbh3NawrdbggFepiixARj4NIk7DM74BIKO9pFpAECIAEhWCAAtHlcE6CgbK+xS2Zf0Jh2Eidcsc8LWABZoAyoIjY5byJYIGDaSmMQVinh9Tq13CdS0Xv4CkM1KQ/cvMec9oSoAGbpWCDheJgWSwLkuT6HOiu3DKbxXvW7/TBBfzz3UH7ybxpOgA==
diff --git a/remote_provisioning/hwtrust/testdata/csr/v3_csr.base64 b/remote_provisioning/hwtrust/testdata/csr/v3_csr.base64 new file mode 100644 index 0000000..340325c --- /dev/null +++ b/remote_provisioning/hwtrust/testdata/csr/v3_csr.base64
@@ -0,0 +1 @@ +hQGggqUBAQMnIAYhWCDcUSf+eGqgY4o2iTUAlot9Moj5oVcd/hN8Lja9TI9TqyNYINbpTLuXQGzX+WCPNsTTPjzF15o8yYWFptEThYpij2ZQhEOhASegWQEoqQFmaXNzdWVyAmdzdWJqZWN0OgBHRFBYIFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVOgBHRFJYILiWVOIspNJKnA5FEcjyY/BmDS4gSJaQFPRUY8T0OTA4OgBHRFNVoToAARFxbmNvbXBvbmVudF9uYW1lOgBHRFRYIFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVOgBHRFZBAToAR0RXWHGmAQIDJiABIVgghPaHz8YJlc4ztK06hmbiC1wmZtM1Air1zQVt8YQq97oiWCBUYQIjz9WbS1XWQQ93CQesOdJYr5XCxekLVTdTsBVusSNYIQCI+fLc8cPFJ7Gfq54OgKRtm7R81ddA8pWjbU3eOQMezzoAR0RYQSBYQDXNmA9jnnpPYldM3QATMpMr4IyqGAzXy3AkziLi397fnNalisoGl9tSk2XJEA2f2S2ALw+Bphu2zeO3P6oyRwaEQ6EBJqBZAg+CWCABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fIFkB6YQDZ0tFWU1JTlSuZWJyYW5kZkdvb2dsZWVmdXNlZAFlbW9kZWxlbW9kZWxmZGV2aWNlZmRldmljZWdwcm9kdWN0ZXBpeGVsaHZiX3N0YXRlZWdyZWVuam9zX3ZlcnNpb25iMTJsbWFudWZhY3R1cmVyZkdvb2dsZW12Ym1ldGFfZGlnZXN0TxEiM0RVZneImaq7zN3u/25zZWN1cml0eV9sZXZlbGN0ZWVwYm9vdF9wYXRjaF9sZXZlbBoBNIxicGJvb3Rsb2FkZXJfc3RhdGVmbG9ja2VkcnN5c3RlbV9wYXRjaF9sZXZlbBoBNIxhcnZlbmRvcl9wYXRjaF9sZXZlbBoBNIxjgqYBAgMmIAEhWCAyw/UU6r9gQ0l5AcBLebbEa+U/dSIRsO5CKLqAtYatfiJYIDdXT+o28hydMserzyH5A6LG1sUcPJP5a+Wevgefd4d8I1ggW69SlC4b1bAb9tYsmxBrQlLJh+qvv2aDw2BX2QvzUpymAQIDJiABIVggRwQMKiwiURobXaQ7N7MR1Ck5t1Kh5JfvgWk4s2GRpdQiWCCK1PDZ+ZNRe8rTAGzxz7CBPM8FXqOSTumV2B001eFmGyNYIQDal8DBe1tGEKNgBPtTgYFt1gFoVPwOzvhqWluxLo6QPlhA+x5DwVtGqPBFKIwEYW+rKzo/4rdHJzmUnU/2OYXpJURsG7sQnMlf+TxUmjJkaJ2zZ2Zy/ZVoxWyAP+wEVcJjc6FrZmluZ2VycHJpbnR4O2JyYW5kMS9wcm9kdWN0MS9kZXZpY2UxOjExL2lkLzIwMjEwODA1LjQyOnVzZXIvcmVsZWFzZS1rZXlz
diff --git a/remote_provisioning/hwtrust/testdata/csr/valid_csr.cbor b/remote_provisioning/hwtrust/testdata/csr/valid_csr.cbor new file mode 100644 index 0000000..bc3bbb9 --- /dev/null +++ b/remote_provisioning/hwtrust/testdata/csr/valid_csr.cbor Binary files differ
diff --git a/remote_provisioning/hwtrust/testdata/factory_csr/all_versions_invalid.json b/remote_provisioning/hwtrust/testdata/factory_csr/all_versions_invalid.json new file mode 100644 index 0000000..fc6b42a --- /dev/null +++ b/remote_provisioning/hwtrust/testdata/factory_csr/all_versions_invalid.json
@@ -0,0 +1,5 @@ +{"csr":"hIKvZWJyYW5kZkdvb2dsZWVmdXNlZAFlbW9kZWxlbW9kZWxmZGV2aWNlZmRldmljZWdwcm9kdWN0ZXBpeGVsZ3ZlcnNpb24CaHZiX3N0YXRlZWdyZWVuam9zX3ZlcnNpb25iMTJsbWFudWZhY3R1cmVyZkdvb2dsZW12Ym1ldGFfZGlnZXN0TxEiM0RVZneImaq7zN3u/25zZWN1cml0eV9sZXZlbGN0ZWVwYm9vdF9wYXRjaF9sZXZlbBoBNIxicGJvb3Rsb2FkZXJfc3RhdGVmbG9ja2VkcnN5c3RlbV9wYXRjaF9sZXZlbBoBNIxhcnZlbmRvcl9wYXRjaF9sZXZlbBoBNIxjoFABAgMEBQYHCAkKCwwNDg8QhEOhAQOhBVBAOUVcs02usDObs1JivY+VWQSjAFjRDKnS8PpyaYRHO1zzkBhsEBO8vPDf+QwmoOyJO0kEDCO/TY3VeL+prsU+dJWPmAFEiZP0CeoisHKSbuuuUIdDWezv+lQ7Nu1S0EGdL6QJnFzqtzLZjk3XHYvY1oHMv9R/6YzYTuMGwXTv/S4cp2ok88Rxew72Q16LdRKMP6E5EN6Hz5W/ffO9FOj/AIhoNXPDbehqNDod5+MRBS82pMZ7VFcd8VJ9z5l1+xlFdHSnaN9279d4Rk+RgfVszgQscjnkFZInQvUX5bNI+/jFdKd6ZPv5BpByo2m7co1SLcQ5X/9u33xgaxwTOGk9wn81PztqGirop1yAMB+FFtj1af5cIPv/TnS3zpw8GSAJWOLYSE1UNBdpoNWLj3pBhcZ6Sc50EXlkNXra4crOroEsSDVDQHLnuYPY3/pQ6xJ3xiFjVtjUfJ2RmCVGyH1nsyq5qLbtJu/JeoIbBYvjjXrcJG0CZrXG1YZUkbA3YDjDCpYAXy0hPuEpDvkcDKCTc651I7OoNr1h2Z8X0OFqcA6CSu9ihzqvoRJxuRpC5kJIDkkUbxJrtJUaDb1XGy4IuQ2WKNWsPEZpFKidS3cswjlnpBMByVRI1ghYGW5fcUXEFEVVcmZUZRVCDqlgYGp3JAdBBetVy+NqjPd1IkSxGrwS8KVeo7FwMChUfOl9SVE0Q0ORnbeU2U8uwU9iAn7YS7gzPnlPrVgLA9MNb1dCHVaepGxp4zWCFzaxXXAOqAtfbEG5r2yH6uHQqBzXe5hMc5/LQBFKdTsCYY0aCfpFGW7sYlPz5SasxremY/6Y31Fmt3v6gq4TIYp/Qw/OofomCUMLhZTMJYMVUH05O4JGhTeXEflXpQ2uOy+Z54aeg1bKNVeliN3mXNDAlGXFNtl3T74c/bjcS6H+51kUlO8ixwVS7371+o+4i6zQeJVKmcLIBCIVrk1iLBgX3HqtF50bOMy+jtzOl5e8Q+p7lkU8diEdNPtkwT2GhUs3p3peSY37IBZwzizn0J0qetVtFmpkdpxFjfKaTmjnxxeJG/zOduViwisW5xdyAK1+Xnlu/Xx8flQdfERkZfQd8n1Ln0/SJwE30zI4nI5vaKzaCDS1v40o03hL22ZuPQ0iKCcVVZcVFq3jtqjNp4AI7wLlzMoU9bhKOSryjuwfQ0RP8i+QJz+s+yFUGGimm55UodyJiTK4H4WVI8uw/n0hrplCm8/bIbFeSfWyoyaCmKQbVtK7QN+x4FVYPIttlt2rhepIF68YH3va39rY0CtiF9cVHqWhCzl9LX638tldFBfyUtDePTRkK3/0HrgUg642hYqTl2VrswdxwV4HN64WAZM8SU2jx+SD1B3iMq6ZkMV5wdMdCy48RdPIcuxdbpjiWw3ZROHaNT/nsnQsOtp/hH7jkTlAdTuLRo52AXiRbB53Jx3hOGpmL21JqO/HVWt/O8nXyr8ZOxr+y/JyP5zC9euik/jeSk7DMu/ycuEnPSvu0a9GFC0R8z8QrOutax4h/r3xEe6Cw8VPGb9VTCZrUvha/ykECRclz0p2AaiKVohtF2kaXCuYQ1ZVCLB4YhBCvPvDdiYHa81oSlyBg0ShATgYogRYINCuwRXKKs9zrmvMy9GWHWXosd3XSho3uUM6l9WZ35gIIKUBAQJYIKV70WngNHGDeSu3E8bEkUZLWDUT9RtmGu5lOF1C7OAvAzgYIAQhWCB/iM/iQDN7dqc5EM38CbRFbQbXV15ldrxaVkYTDtQIGPaEQ6EBBaBYl4KkAQIgASFYICVYth7UESkuuM5TamtxmcjRAo7HPtcHuToYgLpkhNVyIlggdurc2may95o+KP3C8Hhuzgdf105VQne97sXcuhzEgSWkAQIgASFYIIwEl++rFFoIs8QPYQecqeduye0OjWsw7oFHh84i/jk5IlggVnAPeEhdC9j440gbnWBVy54Z34p1n1tHm47Ib7ADePxYIAFqZLdzfrgvgdq0B7ffEp+Jn0GmaMlMoMwJtSjDBW/C","name":"default","serialno":"fake-device-0"} +{"csr":"hIKvZWJyYW5kZkdvb2dsZWVmdXNlZAFlbW9kZWxlbW9kZWxmZGV2aWNlZmRldmljZWdwcm9kdWN0ZXBpeGVsZ3ZlcnNpb24CaHZiX3N0YXRlZWdyZWVuam9zX3ZlcnNpb25iMTJsbWFudWZhY3R1cmVyZkdvb2dsZW12Ym1ldGFfZGlnZXN0TxEiM0RVZneImaq7zN3u/25zZWN1cml0eV9sZXZlbGN0ZWVwYm9vdF9wYXRjaF9sZXZlbBoBNIxicGJvb3Rsb2FkZXJfc3RhdGVmbG9ja2VkcnN5c3RlbV9wYXRjaF9sZXZlbBoBNIxhcnZlbmRvcl9wYXRjaF9sZXZlbBoBNIxjoFABAgMEBQYHCAkKCwwNDg8QhEOhAQOhBVB8SGVJT/kGHh6S+uozCl07WQH657MN4GJCirkP+lHYcuPS538uvOXlh3fiUVchQmcYlYndP+/va2BI3vboQj/dHBmop/UILHuX0q3syjBmm0eMbOleFh7KFQVZRib7mbG8wgoDIE+jghkVYGDm2iszr438seyE+MDZRwxI4gkPzrBXEkkyN0X+LvLz6ANlpuNAdeyaGO/3reoB+cPNWNrBB28Ldx+3kd3Jp4V08tGp2m+KOJgNqHy2Y5dCRvLX87CpXphe2H+DNXou93E5JTePnGrSzZdBHHPhE/q+or6uLZdS7v7xMbUvClQv2ZmkIPMxWJAyWgHdjONT63f9EWfrk8v5eE/thfDGPrfQPdvQvOlrh8oUmr1FoNe8WaBrZqVpm81Dr939nQxGl+Wk0X6uXRXl0fhzQoxZr4bYXW/6tvz3NrEme/v7CUhOtb4N7r1pOQZ31n0umaBSoC5GTiRixVYUpL4KB2JyFLqfxwhHPB4wrCzgxpEslfsopE0VHb+iPR7ibBWN6Wc7EJ4n9e85YkGrrjKXviEUlqWwsL1MXSkXCh8gKMFg3CVlennDdAhw/DbAKF8vQwP32A9rxRZ2KiM521mejSNyQBfwuleA0BraBg8p4OuXOvRBcf2ZTkd8/AKcnj7aHGaNseA+noJFAofyGkAMLwbZc7ttCGaJ/gyH0pUD/Lap1XEt1/GBg0ShATgYogRYIDVztz+gioCJsSZn6ct8daGvAmH8bmUDkTvTS30UlD5GIKQBAiABIVggrXoMDRADqmefBvftkTG9uXoV+oX+ZJvdZGIrhUPPdXciWCCrnXSWOkVVJTCjex9u622rADn2AjMAXY9sihTeH2Iji/aEQ6EBBaBYl4KkAQIgASFYIH31wzJNpqIWZPeoBUxlz7LJRSco5bUo4D7FRbHYcaZfIlggpAmS/zsYSSfXNkrxj7AKexd41VcPTTM/YtcGnedm1jakAQIgASFYIMy0g5IMFEJOihApibR1Lk8Adb8uT2YyApbMNhqMlxqiIlggUM9q/Lp6/ylLzNbFnYQMaa1ygdZTTpb1wmb1xV9LDcBYIPQrdGZIzk8dengNOxVFAngM6/TuNidXJZY2M6c2+LGm","name":"default","serialno":"fake-device-0"} +{"csr":"TOTALLY BOGUS","name":"default","serialno":"fake-device-0"} +{"csr":"hQGggqUBAQMnIAYhWCAsuQh3dEqvFh388CNmcs/EF27rN3EbYEOvu/puokB6WiNYIC6HHSDrS0Qvur+/sw1Wv4c3wmODHnqsoQZm7lBpv4w7hEOhASegWMWoAWZpc3N1ZXICZ3N1YmplY3Q6AEdEUEMAAQI6AEdEU1WhOgABEXFuY29tcG9uZW50X25hbWU6AEdEVEMAAQI6AEdEVkEBOgBHRFdYcaYBAgMmIAEhWCBi/AYDJ9hQnqfcGCyY46kV2IKa7zZGt3vV2utH2Y7VByJYIFKXej1PFrBMc0zJTYgmU5+fWba6eOPQWqpqYE+iQmswI1ghAPxi72oVN9U2BFPI4ezP38FrdSurJsxY5O0/Wvr6sdk/OgBHRFhBIFhAcNXSblkgb1tI3KkLV2hv8jF7HDBTrmbk2Zgtbf+GjrlIDzwIKIYvdssmzwkFT5kq7+X1vtMqzdBsVHgQBkNYBIRDoQEmoFkCD4JYIAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gWQHphANnS0VZTUlOVK5lYnJhbmRmR29vZ2xlZWZ1c2VkAWVtb2RlbGVtb2RlbGZkZXZpY2VmZGV2aWNlZ3Byb2R1Y3RlcGl4ZWxodmJfc3RhdGVlZ3JlZW5qb3NfdmVyc2lvbmIxMmxtYW51ZmFjdHVyZXJmR29vZ2xlbXZibWV0YV9kaWdlc3RPESIzRFVmd4iZqrvM3e7/bnNlY3VyaXR5X2xldmVsY3RlZXBib290X3BhdGNoX2xldmVsGgE0jGJwYm9vdGxvYWRlcl9zdGF0ZWZsb2NrZWRyc3lzdGVtX3BhdGNoX2xldmVsGgE0jGFydmVuZG9yX3BhdGNoX2xldmVsGgE0jGOCpgECAyYgASFYICibs6BzzvTC2P6fFbOs4hIEF2E5YyOgJL06ogIGO2VhIlggikGxp7d8r2mMqG2GCy4zu82QmdxTbxzEj7oZrnRtuIkjWCEAowwtl6x4fDYXXKxPGUVFsM5h/fshUTlFs5zls2+sYS6mAQIDJiABIVggrG7CFpYoMKNmtqK1F5ERG4jB9rcvS1KxuZe7V/TDgvUiWCAQtNZDZd78RioZLQvqTKYT2ib7qh4u/2CQbfWVIhz9uSNYIDWD6q2AC+F1oDQjkIpKiXD9ZqyenMEXhbr+5DV7szBEWECW3sFhmIg9YKmw/nVersPrkikWN80U2JDUK4+ZpVg8wljyxj5tgslvkRJJutE6N9dGUzWX8wGBGmNUNxr4XlQUoWtmaW5nZXJwcmludHg7YnJhbmQxL3Byb2R1Y3QxL2RldmljZTE6MTEvaWQvMjAyMTA4MDUuNDI6dXNlci9yZWxlYXNlLWtleXM=","name":"default","serialno":"fake-device-0"} +{"csr":"hQGggqYBAgMmIAEhWCCQbWgM4qcVbKaD/OV+shAQv3yZVEua9250IFP/ua8tkSJYIJvbeqNvlUh6taXlPmAnqamH2oSIt642HwEoXgddAluII1ggHtpjixl6qMLpEH9AWTb/3oefocW+EmA8qPxVLiI2xdiEQ6EBJqBYxagBZmlzc3VlcgJnc3ViamVjdDoAR0RQQwABAjoAR0RTVaE6AAERcW5jb21wb25lbnRfbmFtZToAR0RUQwABAjoAR0RWQQE6AEdEV1hxpgECAyYgASFYIKrrkKhyQly2CYBqrIAxLehLwW8RZUI7EyRYFb/o40rCIlggcQmkixd5yLkzQ/kI/jjet9Kzc9YhcC2gVbZiI9+1YQ8jWCEAiBXy6pC0zpGzFKUQLOjZ0rSNfQtUvXimMwa7JMFwkbk6AEdEWEEgWEDwei8KDsy64HBKZS9BUpzsHO9+pBG0XVEjeuGi/gXccZnGW5FrHuLHrZ1CP3cEtvR2KjjHJtZk9BL8l+sNYAfbhEOhASagWQIPglggAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyBZAemEA2dLRVlNSU5UrmVicmFuZGZHb29nbGVlZnVzZWQBZW1vZGVsZW1vZGVsZmRldmljZWZkZXZpY2VncHJvZHVjdGVwaXhlbGh2Yl9zdGF0ZWVncmVlbmpvc192ZXJzaW9uYjEybG1hbnVmYWN0dXJlcmZHb29nbGVtdmJtZXRhX2RpZ2VzdE8RIjNEVWZ3iJmqu8zd7v9uc2VjdXJpdHlfbGV2ZWxjdGVlcGJvb3RfcGF0Y2hfbGV2ZWwaATSMYnBib290bG9hZGVyX3N0YXRlZmxvY2tlZHJzeXN0ZW1fcGF0Y2hfbGV2ZWwaATSMYXJ2ZW5kb3JfcGF0Y2hfbGV2ZWwaATSMY4KmAQIDJiABIVggQAfcLLxViAxXadWDUn0IJN2QmF8qrRKo26sQNMATmKgiWCCXL67UZ0V+d0jJoKyBOXbaScvu1A02TEZlLZXf5uSr7SNYIAqXQk/RpXA7Gt3QOSdZqz7AlXGCXN4BvQe16jEd7l3fpgECAyYgASFYIBZ/iS7yreG89/IaVWW5SQPvGK6ijryCyltOOw8rUfR+IlggqN0J7ivOB3dKitFcF6GeJgD5snOwBKnoYwwwYWBGDl8jWCEAh3YQNQDm4iK4oT3EwnYkOAjK5iwDzCve9YVUTJfUIyhYQHunfdCq9s8TvyTZ6j1iHNz/pux98QIZpJlnDkrehpazteRjeicPJXdiSyNXhsThYhVIm4rcI5XgkBNi5mz3PXqha2ZpbmdlcnByaW50eDticmFuZDEvcHJvZHVjdDEvZGV2aWNlMToxMS9pZC8yMDIxMDgwNS40Mjp1c2VyL3JlbGVhc2Uta2V5cw==","name":"default","serialno":"fake-device-0"}
diff --git a/remote_provisioning/hwtrust/testdata/factory_csr/all_versions_valid.json b/remote_provisioning/hwtrust/testdata/factory_csr/all_versions_valid.json new file mode 100644 index 0000000..3ca11c1 --- /dev/null +++ b/remote_provisioning/hwtrust/testdata/factory_csr/all_versions_valid.json
@@ -0,0 +1,10 @@ +{"csr":"hIKvZWJyYW5kZkdvb2dsZWVmdXNlZAFlbW9kZWxlbW9kZWxmZGV2aWNlZmRldmljZWdwcm9kdWN0ZXBpeGVsZ3ZlcnNpb24CaHZiX3N0YXRlZWdyZWVuam9zX3ZlcnNpb25iMTJsbWFudWZhY3R1cmVyZkdvb2dsZW12Ym1ldGFfZGlnZXN0TxEiM0RVZneImaq7zN3u/25zZWN1cml0eV9sZXZlbGN0ZWVwYm9vdF9wYXRjaF9sZXZlbBoBNIxicGJvb3Rsb2FkZXJfc3RhdGVmbG9ja2VkcnN5c3RlbV9wYXRjaF9sZXZlbBoBNIxhcnZlbmRvcl9wYXRjaF9sZXZlbBoBNIxjoFABAgMEBQYHCAkKCwwNDg8QhEOhAQOhBVB9PPrcMMlZnUZvylZS/xNOWQTKoyyUVWVlYqUxxZixMuO8aEXJNTAfi+xMgRnCfQlkt/6+Kbi4xD6I60WLoHEzmT4BNKf0d1cNBOPkn2KUUswSJwasTSnu6h6tChJjo/5TzP1YLaM49myIPYwxMnerPoPaXAxSU7YBpPtD33RQevN59Ls5LizgiZgx9xyqOjffYz6fqzm/9gwda//Nnxd/sAdTJQvAsRyvQiI3VTWzwITwv7nEHUpSI2rqmnhrEOt2g70UFo5e4CakrGY6uAhc9TUaMNh6YUPIKFBfMsgMCWs9mjXwmguGycmdQ1WWGOJpoYXaK59avPpWfmLLSYOgeDSC5t0QnmkkHYbc8Aw3mLsqC5D77HyN4NWwggTgsxt75Xic3T7Gr+EuHVEGTREaJ9UZ+armS5edrPsYs3CctNb/WucA5qm5/BYlJRO+YBN7lF8lzqAGM1sgXnzRms96V0KWvYYQzDTU+aIKHVXRi/l0lH6zIwe+qobcvIwg1qP2ANjK/ylEYUZQSpp6U0i7PIbZN4UN5dP3NIqwbIFQdtTbOfyr6XFja0plMdcAR6XNWdZwyrKXdGJJMz+vSHDaht4UUUHSO5idlQE3jAj/l94uIUlo34K4ZSKqFQ1oevavKOYI7ss2s/JZldjScUNHYEyvIQ/jSY4/GiW5iYHoqL2M5ZfksjBLhmmKp0l45dWuR6tmScNpiLSROeybuq33eYL/Woh3vU+EoK8xTad0OoV/O/HU5HSmD7WzMXfAaHIr3X7VIPySQtHMSHhTqXiZerB+A+9HO61vuOTuKDBSiojyYTt2dt1MPtqwy3SKkcgWqK0VdlSw9xnwhGpgHeyjhm0qcgJi27Q6Bk51NXvBaYHCB0bL/vUt5l53kZ1Lh6hwaWKwiTuaMkXQ43Dagqp58gPikdvuBWmkR0+p0xoBUiUttbRwU8I+uxpfGzZb1iJxFDss/hr6OTAbVZT5oWOur5OC/WyT1lIzeRDdSDWaEHahQFLoixzt4/MY2YEa8jWXrcIKH2OfYbDPDG1kzCDFUziIUmIEPbTD7o7oL8N4ZqjlwRViA9O8EyXIdg0CxEeGSoH1G0P19NPETklrw2xzSzEo2CTBzkS5nzFOu9XvBbpVbMMciRHLnmNmJjFfhBnrFyfI2ZXOURJcVHyYMZjWL4QuAms4XvguvVl172G0aE5QPn7LEdz0NfXqFbijfx6zj96rof4npS4SNxU18ZTfuvpY+FNzYiOQGxd6svxqAutu/EDjIjft7W5n7FxZ8NokE6Yt0z0GFBzsVmqfbYz5kojKPgBKF13X/hgUoSG6LUjXllBQynqCNG9Mk2LPetOWpw2eoAs2TysYYRe+K/iyq0RuCTb5C5+eTVvELxFInZMphv/EVobodwtmiQ+BPrcg2SN3DNIEt7gLuggSJIP6Xws0Pz7teDgCNtLL/6KSvoxeLwfzrC5zPoTXr8EfJmRbn0x5oAy6Rv6O5FTOjpSBsQsn26ugvWkskjOXX+EgosubxiQMYqShznp4k5YfzZmg7JIei2IopN45N17c+OjRlRE+sgnQ8eU90lM9ny3/vJYzLr436EcG4PGlmz9EPlTENjVqB8IEEP+GjL+sEGRsMlS9+VYbOGuTGbbufK/ZvGojGPfAUCMbzdqcBOKBg0ShATgYogRYINCuwRXKKs9zrmvMy9GWHWXosd3XSho3uUM6l9WZ35gIIKUBAQJYID8iqQxfFauUvQMkVdYOg3t2TUIMuI9ADMG5dSJ7GGxVAzgYIAQhWCCWRoVQCzhvMtwfOvJYe5iSa5HN5NWGdZxZ5E3mQpIESvaEQ6EBBaBYl4KkAQIgASFYIEpSwkxIyWRp4l/sgPmiTshCaf0KKW7DSn4+NUJJzjyzIlggYVAcgzadjrsnsM/ZAeidDQHf7pWphH4BG0vjd57Tx1SkAQIgASFYIAW7cxMJlF4VfWkl1+O2+rycQ/aBWs06vVzCaKbMGTDnIlggSzOqBGodNoxdY3EybUzhu1CKT9gExFuEfSPc0bsxYo1YIF9JxbLFGLG7B4G9q6CixhVh9ePliTU3I9aiGqEUG8S0","name":"default","serialno":"fake-device-0"} + +{"csr":"hIKvZWJyYW5kZkdvb2dsZWVmdXNlZAFlbW9kZWxlbW9kZWxmZGV2aWNlZmRldmljZWdwcm9kdWN0ZXBpeGVsZ3ZlcnNpb24CaHZiX3N0YXRlZWdyZWVuam9zX3ZlcnNpb25iMTJsbWFudWZhY3R1cmVyZkdvb2dsZW12Ym1ldGFfZGlnZXN0TxEiM0RVZneImaq7zN3u/25zZWN1cml0eV9sZXZlbGN0ZWVwYm9vdF9wYXRjaF9sZXZlbBoBNIxicGJvb3Rsb2FkZXJfc3RhdGVmbG9ja2VkcnN5c3RlbV9wYXRjaF9sZXZlbBoBNIxhcnZlbmRvcl9wYXRjaF9sZXZlbBoBNIxjoFABAgMEBQYHCAkKCwwNDg8QhEOhAQOhBVABapIU83y82Kdu6BJ8kkVPWQIiqO6n/WEbgqyajycwMpzCyK8+Iw+tCHozqTfWRfnuiYW0tN5FyqWNs1qkWMRhhirxgxnp+fjKTRiOK7fz4lL3PYqSH2o3h2viWWL1PfjtJyrSFQjspQqINX74kU9bNwBTun6FuZEHxNQYzXI9fLXayehu4NJsgzmiL+O/SFkA618XQKCOHBPRLA30iY6gkzUhsSj1+ytBtyIkA6EbXUcPdKnDMuwgpyRP3OBcZHDK3XzrYixd897zPHtvN00ZdQHRbe2Dntf5hyzrMm9cbko9hiPsUM7f1DuIANFwj1iKBIC+kv7wx5RfuS5SClm5qa5CHbA1IZ3xMDIDLCjN74/3O2yRfIBb1+9aEP3Z33MhG4olEZ2q+uC3dbtYit9elkGNuBDyNb5D76OwGCFux5UTFyynoGxVtAznp6JVaI3ZEiYhyrT+MkNUCtuGZ0DjJkFHcLLrXMyTJSjq1+demfiYyr+Ir7T/1TQi1Y+GJGQIdFHA9fW6QYIZ9xE0sfTd1Zq/wn2YQT8pdzid0VClzi/x2LDbk3mtaCrQhBYZ3VrHveQlQVVHHPriKcsQJYBFnMNS6+JNuEZ4++TEwWbF3hiUmXphgo0GecXQ7bl4q/1RuPzZPsBLkUsExhoh65Ewn9kMc+iHupOQCNDILJDik3V07iuwQ5SlrVUsiby7egZaDVDFy5GbiOczgi2BmZmz2jcsePHJe0s7TAwhYFzWqTwMl8tAgYNEoQE4GKIEWCA1c7c/oIqAibEmZ+nLfHWhrwJh/G5lA5E700t9FJQ+RiCkAQIgASFYIGt72uKbTr5Rccjh4/GcgZqjcoBpA3xUIxdz6XsES2dlIlggSS0rPAjiluqGWPBsSbLBuP6hkH4AL9p7zYdpamznZ1H2hEOhAQWgWJeCpAECIAEhWCCwux4tKxu7COAyzC6QYz2Vc7Tbnydp0JAiC/fT2qeQuiJYIMjS4s2/AKyORPK4QAha/b0EckaA6sVTTpazGH8MDFfmpAECIAEhWCBMvwVxq9o8qwDx058dQJibhQxeuYOHnG6VxGYP+vJBryJYIOr3B/2Ll0vM5Yzc2E9PJ8iPbkc2Ts43waji3Fc7WOl+WCDC8jMqc3vVO7A7vRzY8bSTNRX5prg73a1LIhPmLHpdxQ==","name":"default","serialno":"fake-device-0"} +{"csr":"hQGggqUBAQMnIAYhWCDcUSf+eGqgY4o2iTUAlot9Moj5oVcd/hN8Lja9TI9TqyNYINbpTLuXQGzX+WCPNsTTPjzF15o8yYWFptEThYpij2ZQhEOhASegWQEoqQFmaXNzdWVyAmdzdWJqZWN0OgBHRFBYIFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVOgBHRFJYILiWVOIspNJKnA5FEcjyY/BmDS4gSJaQFPRUY8T0OTA4OgBHRFNVoToAARFxbmNvbXBvbmVudF9uYW1lOgBHRFRYIFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVOgBHRFZBAToAR0RXWHGmAQIDJiABIVgghPaHz8YJlc4ztK06hmbiC1wmZtM1Air1zQVt8YQq97oiWCBUYQIjz9WbS1XWQQ93CQesOdJYr5XCxekLVTdTsBVusSNYIQCI+fLc8cPFJ7Gfq54OgKRtm7R81ddA8pWjbU3eOQMezzoAR0RYQSBYQDXNmA9jnnpPYldM3QATMpMr4IyqGAzXy3AkziLi397fnNalisoGl9tSk2XJEA2f2S2ALw+Bphu2zeO3P6oyRwaEQ6EBJqBZAg+CWCABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fIFkB6YQDZ0tFWU1JTlSuZWJyYW5kZkdvb2dsZWVmdXNlZAFlbW9kZWxlbW9kZWxmZGV2aWNlZmRldmljZWdwcm9kdWN0ZXBpeGVsaHZiX3N0YXRlZWdyZWVuam9zX3ZlcnNpb25iMTJsbWFudWZhY3R1cmVyZkdvb2dsZW12Ym1ldGFfZGlnZXN0TxEiM0RVZneImaq7zN3u/25zZWN1cml0eV9sZXZlbGN0ZWVwYm9vdF9wYXRjaF9sZXZlbBoBNIxicGJvb3Rsb2FkZXJfc3RhdGVmbG9ja2VkcnN5c3RlbV9wYXRjaF9sZXZlbBoBNIxhcnZlbmRvcl9wYXRjaF9sZXZlbBoBNIxjgqYBAgMmIAEhWCAyw/UU6r9gQ0l5AcBLebbEa+U/dSIRsO5CKLqAtYatfiJYIDdXT+o28hydMserzyH5A6LG1sUcPJP5a+Wevgefd4d8I1ggW69SlC4b1bAb9tYsmxBrQlLJh+qvv2aDw2BX2QvzUpymAQIDJiABIVggRwQMKiwiURobXaQ7N7MR1Ck5t1Kh5JfvgWk4s2GRpdQiWCCK1PDZ+ZNRe8rTAGzxz7CBPM8FXqOSTumV2B001eFmGyNYIQDal8DBe1tGEKNgBPtTgYFt1gFoVPwOzvhqWluxLo6QPlhA+x5DwVtGqPBFKIwEYW+rKzo/4rdHJzmUnU/2OYXpJURsG7sQnMlf+TxUmjJkaJ2zZ2Zy/ZVoxWyAP+wEVcJjc6FrZmluZ2VycHJpbnR4O2JyYW5kMS9wcm9kdWN0MS9kZXZpY2UxOjExL2lkLzIwMjEwODA1LjQyOnVzZXIvcmVsZWFzZS1rZXlz","name":"default","serialno":"fake-device-0"} + + + +{"csr":"hQGggqYBAgMmIAEhWCCpPq6NV6DAFtVa2xl5ma83hY7dMfHOk8+e3asA52ov0CJYININlwgFstqznGH2mxoRoPSj/QrGVRVmmU78E+ZF/dhyI1ggEpU/d/ByZJGgnFstE0omqKZX28FwxANv/egeiB4KzQOEQ6EBJqBZASepAWZpc3N1ZXICZ3N1YmplY3Q6AEdEUFggVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU6AEdEUlgguJZU4iyk0kqcDkURyPJj8GYNLiBIlpAU9FRjxPQ5MDg6AEdEU1WhOgABEXFuY29tcG9uZW50X25hbWU6AEdEVFggVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU6AEdEVkEBOgBHRFdYcKYBAgMmIAEhWCCFTXTgD0Ij31zMNwkMHEHeyJ4R0PVQToYItbHWSBX9CiJYIDFaX3N0+wapfXrb4+8DKNU5VHnDnvb1rsC3cjAlb50lI1ggFFtuT3XEL9kjvKY93UOGxCkqIT8XK4czC8ezX6ykBfk6AEdEWEEgWEBtIzOvyF6PIVIYljj7CfahW+MgOpd4it7iAxvkssZYYXh78NlKJFR0E1G1DdLMfRwSajaXO3wDqG5AbfiUeVy5hEOhASagWQIQglggAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyBZAeqEA2dLRVlNSU5UrmVicmFuZGZHb29nbGVlZnVzZWQBZW1vZGVsZW1vZGVsZmRldmljZWZkZXZpY2VncHJvZHVjdGVwaXhlbGh2Yl9zdGF0ZWVncmVlbmpvc192ZXJzaW9uYjEybG1hbnVmYWN0dXJlcmZHb29nbGVtdmJtZXRhX2RpZ2VzdE8RIjNEVWZ3iJmqu8zd7v9uc2VjdXJpdHlfbGV2ZWxjdGVlcGJvb3RfcGF0Y2hfbGV2ZWwaATSMYnBib290bG9hZGVyX3N0YXRlZmxvY2tlZHJzeXN0ZW1fcGF0Y2hfbGV2ZWwaATSMYXJ2ZW5kb3JfcGF0Y2hfbGV2ZWwaATSMY4KmAQIDJiABIVggN9Y9nAF4lYrevH81hTwirMeHF9lyAXF7MCqiyuY5xXQiWCAMhrBKF2SHHYuLVGMWR/mAYErcLT0JyEG5J690NeM6MSNYIQD/zJBROsd66g7qA9O/HQXpdefN9GgMOhnDQRvUFpUya6YBAgMmIAEhWCCQpbufcGMc+xy60H0wPzbecB81xipX2TDC2LF41FrYeiJYIC4eKnTSeL7astnASAPMGEhgXhUtKJ2vAy86DTvTvZcLI1ghAOMuH5yRYDLMJzAceHafd4Abe1QORt5vqCO/eHun6BnpWED2SzeNFno+SzaMHQ/A6G9JnZqu+teAXGT9eD6MW5ilZ+pFew8+xCnv4Kyk2bABjp2XCsPxkkBjhllDbJakWUz1oWtmaW5nZXJwcmludHg7YnJhbmQxL3Byb2R1Y3QxL2RldmljZTE6MTEvaWQvMjAyMTA4MDUuNDI6dXNlci9yZWxlYXNlLWtleXM=","name":"default","serialno":"fake-device-0"} + +
diff --git a/remote_provisioning/hwtrust/testdata/factory_csr/v2_ed25519_valid.json b/remote_provisioning/hwtrust/testdata/factory_csr/v2_ed25519_valid.json new file mode 100644 index 0000000..23ecece --- /dev/null +++ b/remote_provisioning/hwtrust/testdata/factory_csr/v2_ed25519_valid.json
@@ -0,0 +1 @@ +{"csr":"hIKvZWJyYW5kZkdvb2dsZWVmdXNlZAFlbW9kZWxlbW9kZWxmZGV2aWNlZmRldmljZWdwcm9kdWN0ZXBpeGVsZ3ZlcnNpb24CaHZiX3N0YXRlZWdyZWVuam9zX3ZlcnNpb25iMTJsbWFudWZhY3R1cmVyZkdvb2dsZW12Ym1ldGFfZGlnZXN0TxEiM0RVZneImaq7zN3u/25zZWN1cml0eV9sZXZlbGN0ZWVwYm9vdF9wYXRjaF9sZXZlbBoBNIxicGJvb3Rsb2FkZXJfc3RhdGVmbG9ja2VkcnN5c3RlbV9wYXRjaF9sZXZlbBoBNIxhcnZlbmRvcl9wYXRjaF9sZXZlbBoBNIxjoFABAgMEBQYHCAkKCwwNDg8QhEOhAQOhBVALzvc1n0LPYc+vgHPsJjfDWQTT4gGYIH1cgYd+RkD0Fk8Om6/gWbJLVnc0iW94JhUChOo3PkPRqAwVG1h75aC8fuz37QiInSwG7QdZGIfQPnoDzhDGpmjtwbjTndjws8sb1lO3R9mByU4WLa0L78WUGreN4mBXIfsoXfA8ep0oJyRUc3XtfAnXAW3e2iUDWC75jd4+Qm0uF2DDfL0+jcahFRUPHSiRMmulXn0ofWjs0+2zQpDMzjASHHjqYBOND/OyP3GERH78MvNwMYrNksiNKqc6CSgqJpvD+SDVmJCKa5aK72NjJChCmn2IZZrAEdO8qW9zJO5bECEo3VSjEs3TWBLcPMmiorYhaGXod7Ze1fxBmbx0y1/QYen/3K1KKlHPSt1U/VgPfQHwTO4RiYusLf5rctN6tMd0Pvr0wm15z4UWgJ8w5EzbP1/B/JWR0Nm7rlxOPwHuTUbOfgMxXlxKLMWsTIbtRXFeniTL5GK06gVMZwd2uOBOVh6Lef39wlAmbM5bsrlfwrGD7Hm1Tpr7b7FCayUx2eoXUF1i67etebpDJgFmOA92prG4bdll78oaF+cB7BEgPpwZsxNnqS/vQ0CxNWD3vGn2I7lQv6VZt1lTOZLDXvGPr6v5iui/IcGlBLTH+UaHptDlDTFyhMa6OIGHsMjfVye/1eluWwLPV5lJpad68AC+R2N7NZqNY4agfm8ChCYsNsuXhOIEWXq21f3bCbWcCq4qMvm+EH2BS45pOlLvTb/5mpI8p0xtoXxrz9w485iGI4hUqP9pmweVC9yucrraE79fYrBRz/3g+HDqj1pMLjdIOtaE0FiW94P/e4nBnGZDsxn3awx2g8b73xFytYiB+0FTQELo8qaTFMfrn3QnPT1aRw+34vj6E6TZwbuE/akutbcSGyqPkdRgdKmyTs/YE9FFpZrEeh0anfDX19yuWRsrTE7X3+XRAOb28K8Yl8x/gF//71dPvMpgLxTjwvLMPc0SHREjQsEddmzMjxc/p6ngsGTHn4rjn7E7TWq55i+ASeTi5rI2Xqq3G4slsqRaAXg/KGAsZJZiemds72XQpXYYa8XKsRHdVYa7irXweRIlUIRAsxvFO1TvY8wl9ah/LqZvYbl53xRPVCWboe+rOkfvGup1q4VjWR9m5FPdxwU5NSti1Z/YL8GR8YNtdVvrKExZfunjhW3BtYQLpuqOZ+n0s8ybPxnqGk5GFU7gHIGa/rMx2M/LEu4l9X4jt5Nh+Q92YdXHjlqsb8kWFNAwXDUNDDY0/VtmEXSDkxzLilmtmEvRBtyFw09PHd1kQsen4a0MD+fvVrbqRESj4Zh8OXyTLlaugHq+/qqU105HWES4f3FUKnsJXkDxAc6o2D5Cg5rzAH27TcJONRI2YBjA0OM6AoEjb4SXe54qNbXuR92023A2awDm2azDguD9xwJ/ZH2XOAlKB2vCwp8pDkBAC7ky4FEHeDYE+LiGtF7GI3wIO74BpmdueHkO0nM5AKPwArukUTc4IPzXXZhDOiywbYDPt4pKjXm9J8PlSJlK5p23jg7GTf9iFIE1KD3eH5AiIwGsI3jGYAkjBJMiKOq0H73E9bUaHU8oaF30j2F76yp6a150sZh9tD1Tzk967jvJMBrs0A/tkX+wcwcq3Z8PCjSffhGOk4fPc4u8N4ong76Bg0ShATgYogRYINCuwRXKKs9zrmvMy9GWHWXosd3XSho3uUM6l9WZ35gIIKUBAQJYINCuwRXKKs9zrmvMy9GWHWXosd3XSho3uUM6l9WZ35gIAzgYIAQhWCC+hedGxKNCWkDZNjqmFdAsWH493DMCMtL8Xh6HJV9yYPaEQ6EBBaBYl4KkAQIgASFYIKGibwkABzWwjPuGtLSNsBNKU+Rq9DgpHfnefrD0qlsXIlggxQpOLAqfW6sgriJdKg/OpkdTJqm9OqV/nOEWBU1qYOSkAQIgASFYIP3aYG6PKZYw0EzoK+juMNmb45WbP3exBELt8ZbOV8jAIlggBEvRLhhN9ooLfZM4tlh5403ucowcKtbdgBWTXdySaZpYIMlmkjJke2knfNeaI9/cfju3OaxSoQg9x9rQgqlRlIrw","name":"default","serialno":"fake-device-0"}
diff --git a/remote_provisioning/hwtrust/testdata/factory_csr/v2_p256_valid.json b/remote_provisioning/hwtrust/testdata/factory_csr/v2_p256_valid.json new file mode 100644 index 0000000..4fc097a --- /dev/null +++ b/remote_provisioning/hwtrust/testdata/factory_csr/v2_p256_valid.json
@@ -0,0 +1 @@ +{"csr":"hIKvZWJyYW5kZkdvb2dsZWVmdXNlZAFlbW9kZWxlbW9kZWxmZGV2aWNlZmRldmljZWdwcm9kdWN0ZXBpeGVsZ3ZlcnNpb24CaHZiX3N0YXRlZWdyZWVuam9zX3ZlcnNpb25iMTJsbWFudWZhY3R1cmVyZkdvb2dsZW12Ym1ldGFfZGlnZXN0TxEiM0RVZneImaq7zN3u/25zZWN1cml0eV9sZXZlbGN0ZWVwYm9vdF9wYXRjaF9sZXZlbBoBNIxicGJvb3Rsb2FkZXJfc3RhdGVmbG9ja2VkcnN5c3RlbV9wYXRjaF9sZXZlbBoBNIxhcnZlbmRvcl9wYXRjaF9sZXZlbBoBNIxjoFABAgMEBQYHCAkKCwwNDg8QhEOhAQOhBVCr/oKcDPOg6uOCb5pCL1cvWQIrjq+3muSG/VeaKg6KRk7VZfEcBFEhWDyp7xNbctANbysjGel9+AZPX4T2rKxNqHY8wIcL60o54u+uWP3FBufg5LHUHbiRYytailRapw/QPa0wo8oFR4KiCJHdhz0V6bzYaIzoxu+Lbyu94Z5lt1wThlrcXEJv0fzCY7BMpiRpZ3V/ZC6BuJOldieZ3UPNDiVVdSdRieFcUeUVJFfYp6SiuMrous+RU/or7/rd8Rfyya/ZWpME9bkHpv8bRPnCY2IKzrYntnvXqiolgOV2kqXTMvM9mvJeR0nLcnpje/94fXoLYMBxiRAVdZRkb9/uQ0U139Luwl1aq0AxfldfYoyuqhP20Ej1bO6Vd4FSMntLKDzSKjHxMlc32fIm9t8bJvWy9tcE3TnMM6+Bqig0CRTbuJYSCkBwU+97CZDMSlvnXshii4d+dXzmyA6vWc7FDWQoigtUDwctWay00Pl0PReDodQk1YnxUJJWnZVduoOi4mvrh2C8lJQONK2BIV6mopVTFMmX3HM0LzgkP+2QTQEr5NlVIvanwmutHfj+RNbw/l7IyX2uQJae7OhlzWc9cG8D+/zaY+Ed6ICFle2To+I/mzoFNCOhSjfia0gXhflM3F0YYtSx6IVUQapdZFFL/pV+jfi8GY/MYMyKr/CMLUFRuDwWSHCtCea7ILyR9Th74zUMESm/OpTQQ1UjzPqPCQaV+YvlfjDEjDveWzdRryi+uJwO7c/r3lQS3A38gYNEoQE4GKIEWCA1c7c/oIqAibEmZ+nLfHWhrwJh/G5lA5E700t9FJQ+RiCkAQIgASFYIOBBzy8PNA8cMyxBsM/XDDBVNdIeakcTSy7RSJZ+JJxoIlggH85FxfthuoEh+eUFm5s5DnaGhke4Hi9F8c6v2j+AaNv2hEOhAQWgWJeCpAECIAEhWCDlxY4/5ECfw38CmLED7+l3xwW0gqLt0HImANA8QwXX6SJYIHIXmIeEbh3NawrdbggFepiixARj4NIk7DM74BIKO9pFpAECIAEhWCAAtHlcE6CgbK+xS2Zf0Jh2Eidcsc8LWABZoAyoIjY5byJYIGDaSmMQVinh9Tq13CdS0Xv4CkM1KQ/cvMec9oSoAGbpWCDheJgWSwLkuT6HOiu3DKbxXvW7/TBBfzz3UH7ybxpOgA==","name":"default","serialno":"fake-device-0"}
diff --git a/remote_provisioning/hwtrust/testdata/factory_csr/v3_ed25519_valid.json b/remote_provisioning/hwtrust/testdata/factory_csr/v3_ed25519_valid.json new file mode 100644 index 0000000..4767dc1 --- /dev/null +++ b/remote_provisioning/hwtrust/testdata/factory_csr/v3_ed25519_valid.json
@@ -0,0 +1 @@ +{"csr":"hQGggqUBAQMnIAYhWCDcUSf+eGqgY4o2iTUAlot9Moj5oVcd/hN8Lja9TI9TqyNYINbpTLuXQGzX+WCPNsTTPjzF15o8yYWFptEThYpij2ZQhEOhASegWQEoqQFmaXNzdWVyAmdzdWJqZWN0OgBHRFBYIFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVOgBHRFJYILiWVOIspNJKnA5FEcjyY/BmDS4gSJaQFPRUY8T0OTA4OgBHRFNVoToAARFxbmNvbXBvbmVudF9uYW1lOgBHRFRYIFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVOgBHRFZBAToAR0RXWHGmAQIDJiABIVgghPaHz8YJlc4ztK06hmbiC1wmZtM1Air1zQVt8YQq97oiWCBUYQIjz9WbS1XWQQ93CQesOdJYr5XCxekLVTdTsBVusSNYIQCI+fLc8cPFJ7Gfq54OgKRtm7R81ddA8pWjbU3eOQMezzoAR0RYQSBYQDXNmA9jnnpPYldM3QATMpMr4IyqGAzXy3AkziLi397fnNalisoGl9tSk2XJEA2f2S2ALw+Bphu2zeO3P6oyRwaEQ6EBJqBZAg+CWCABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fIFkB6YQDZ0tFWU1JTlSuZWJyYW5kZkdvb2dsZWVmdXNlZAFlbW9kZWxlbW9kZWxmZGV2aWNlZmRldmljZWdwcm9kdWN0ZXBpeGVsaHZiX3N0YXRlZWdyZWVuam9zX3ZlcnNpb25iMTJsbWFudWZhY3R1cmVyZkdvb2dsZW12Ym1ldGFfZGlnZXN0TxEiM0RVZneImaq7zN3u/25zZWN1cml0eV9sZXZlbGN0ZWVwYm9vdF9wYXRjaF9sZXZlbBoBNIxicGJvb3Rsb2FkZXJfc3RhdGVmbG9ja2VkcnN5c3RlbV9wYXRjaF9sZXZlbBoBNIxhcnZlbmRvcl9wYXRjaF9sZXZlbBoBNIxjgqYBAgMmIAEhWCAyw/UU6r9gQ0l5AcBLebbEa+U/dSIRsO5CKLqAtYatfiJYIDdXT+o28hydMserzyH5A6LG1sUcPJP5a+Wevgefd4d8I1ggW69SlC4b1bAb9tYsmxBrQlLJh+qvv2aDw2BX2QvzUpymAQIDJiABIVggRwQMKiwiURobXaQ7N7MR1Ck5t1Kh5JfvgWk4s2GRpdQiWCCK1PDZ+ZNRe8rTAGzxz7CBPM8FXqOSTumV2B001eFmGyNYIQDal8DBe1tGEKNgBPtTgYFt1gFoVPwOzvhqWluxLo6QPlhA+x5DwVtGqPBFKIwEYW+rKzo/4rdHJzmUnU/2OYXpJURsG7sQnMlf+TxUmjJkaJ2zZ2Zy/ZVoxWyAP+wEVcJjc6FrZmluZ2VycHJpbnR4O2JyYW5kMS9wcm9kdWN0MS9kZXZpY2UxOjExL2lkLzIwMjEwODA1LjQyOnVzZXIvcmVsZWFzZS1rZXlz","name":"default","serialno":"fake-device-0"}
diff --git a/remote_provisioning/hwtrust/testdata/factory_csr/v3_p256_valid.json b/remote_provisioning/hwtrust/testdata/factory_csr/v3_p256_valid.json new file mode 100644 index 0000000..4b31d7f --- /dev/null +++ b/remote_provisioning/hwtrust/testdata/factory_csr/v3_p256_valid.json
@@ -0,0 +1 @@ +{"csr":"hQGggqYBAgMmIAEhWCCpPq6NV6DAFtVa2xl5ma83hY7dMfHOk8+e3asA52ov0CJYININlwgFstqznGH2mxoRoPSj/QrGVRVmmU78E+ZF/dhyI1ggEpU/d/ByZJGgnFstE0omqKZX28FwxANv/egeiB4KzQOEQ6EBJqBZASepAWZpc3N1ZXICZ3N1YmplY3Q6AEdEUFggVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU6AEdEUlgguJZU4iyk0kqcDkURyPJj8GYNLiBIlpAU9FRjxPQ5MDg6AEdEU1WhOgABEXFuY29tcG9uZW50X25hbWU6AEdEVFggVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU6AEdEVkEBOgBHRFdYcKYBAgMmIAEhWCCFTXTgD0Ij31zMNwkMHEHeyJ4R0PVQToYItbHWSBX9CiJYIDFaX3N0+wapfXrb4+8DKNU5VHnDnvb1rsC3cjAlb50lI1ggFFtuT3XEL9kjvKY93UOGxCkqIT8XK4czC8ezX6ykBfk6AEdEWEEgWEBtIzOvyF6PIVIYljj7CfahW+MgOpd4it7iAxvkssZYYXh78NlKJFR0E1G1DdLMfRwSajaXO3wDqG5AbfiUeVy5hEOhASagWQIQglggAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyBZAeqEA2dLRVlNSU5UrmVicmFuZGZHb29nbGVlZnVzZWQBZW1vZGVsZW1vZGVsZmRldmljZWZkZXZpY2VncHJvZHVjdGVwaXhlbGh2Yl9zdGF0ZWVncmVlbmpvc192ZXJzaW9uYjEybG1hbnVmYWN0dXJlcmZHb29nbGVtdmJtZXRhX2RpZ2VzdE8RIjNEVWZ3iJmqu8zd7v9uc2VjdXJpdHlfbGV2ZWxjdGVlcGJvb3RfcGF0Y2hfbGV2ZWwaATSMYnBib290bG9hZGVyX3N0YXRlZmxvY2tlZHJzeXN0ZW1fcGF0Y2hfbGV2ZWwaATSMYXJ2ZW5kb3JfcGF0Y2hfbGV2ZWwaATSMY4KmAQIDJiABIVggN9Y9nAF4lYrevH81hTwirMeHF9lyAXF7MCqiyuY5xXQiWCAMhrBKF2SHHYuLVGMWR/mAYErcLT0JyEG5J690NeM6MSNYIQD/zJBROsd66g7qA9O/HQXpdefN9GgMOhnDQRvUFpUya6YBAgMmIAEhWCCQpbufcGMc+xy60H0wPzbecB81xipX2TDC2LF41FrYeiJYIC4eKnTSeL7astnASAPMGEhgXhUtKJ2vAy86DTvTvZcLI1ghAOMuH5yRYDLMJzAceHafd4Abe1QORt5vqCO/eHun6BnpWED2SzeNFno+SzaMHQ/A6G9JnZqu+teAXGT9eD6MW5ilZ+pFew8+xCnv4Kyk2bABjp2XCsPxkkBjhllDbJakWUz1oWtmaW5nZXJwcmludHg7YnJhbmQxL3Byb2R1Y3QxL2RldmljZTE6MTEvaWQvMjAyMTA4MDUuNDI6dXNlci9yZWxlYXNlLWtleXM=","name":"default","serialno":"fake-device-0"}
diff --git a/remote_provisioning/hwtrust/tests/hwtrust_cli.rs b/remote_provisioning/hwtrust/tests/hwtrust_cli.rs index eca870b..8136a7d 100644 --- a/remote_provisioning/hwtrust/tests/hwtrust_cli.rs +++ b/remote_provisioning/hwtrust/tests/hwtrust_cli.rs
@@ -8,7 +8,7 @@ #[test] fn exit_code_for_good_chain() { let output = Command::new(hwtrust_bin()) - .args(["verify-dice-chain", "testdata/dice/valid_ed25519.chain"]) + .args(["dice-chain", "testdata/dice/valid_ed25519.chain"]) .output() .unwrap(); assert!(output.status.success()); @@ -17,8 +17,50 @@ #[test] fn exit_code_for_bad_chain() { let output = Command::new(hwtrust_bin()) - .args(["verify-dice-chain", "testdata/dice/bad_p256.chain"]) + .args(["dice-chain", "testdata/dice/bad_p256.chain"]) .output() .unwrap(); assert!(!output.status.success()); } + +#[test] +fn factory_csr_empty_input_fails() { + let output = Command::new(hwtrust_bin()) + .args(["dice-chain", "testdata/dice/bad_p256.chain"]) + .output() + .unwrap(); + assert!(!output.status.success()); +} + +#[test] +fn factory_csr_multiple_valid_csrs_succeeds() { + // Input file intentionally has some blank lines, ensuring we skip over them expectedly + let output = Command::new(hwtrust_bin()) + .args(["factory-csr", "testdata/factory_csr/all_versions_valid.json"]) + .output() + .unwrap(); + assert!(output.status.success()); +} + +#[test] +fn factory_csr_one_invalid_csr_of_multiple_fails() { + let output = Command::new(hwtrust_bin()) + .args(["factory-csr", "testdata/factory_csr/all_versions_invalid.json"]) + .output() + .unwrap(); + assert!(!output.status.success()); +} + +#[test] +fn exit_code_for_good_csr() { + let output = + Command::new(hwtrust_bin()).args(["csr", "testdata/csr/valid_csr.cbor"]).output().unwrap(); + assert!(output.status.success()); +} + +#[test] +fn exit_code_for_bad_csr() { + let output = + Command::new(hwtrust_bin()).args(["csr", "testdata/csr/bad_csr.cbor"]).output().unwrap(); + assert!(!output.status.success()); +}