diff --git a/pom.xml b/pom.xml index 2b404e14..0e77b0c1 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,13 @@ pom import + + org.testcontainers + testcontainers-bom + 2.0.5 + pom + import + @@ -134,6 +141,16 @@ org.slf4j slf4j-simple + + org.testcontainers + testcontainers + test + + + org.testcontainers + testcontainers-junit-jupiter + test + redis.clients jedis diff --git a/src/main/java/edu/kit/kastel/sdq/lissa/ratlr/utils/Environment.java b/src/main/java/edu/kit/kastel/sdq/lissa/ratlr/utils/Environment.java index b50efe50..05ac8c46 100644 --- a/src/main/java/edu/kit/kastel/sdq/lissa/ratlr/utils/Environment.java +++ b/src/main/java/edu/kit/kastel/sdq/lissa/ratlr/utils/Environment.java @@ -120,7 +120,17 @@ public static String getenvNonNull(String key) { */ public static synchronized void overwrite(Path path) { if (Files.exists(path)) { - dotenv = Dotenv.configure().filename(path.toString()).load(); + String directory; + if (path.getParent() != null) { + directory = path.getParent().toAbsolutePath().toString(); + } else { + directory = Path.of("").toAbsolutePath().toString(); + } + + dotenv = Dotenv.configure() + .directory(directory) + .filename(path.getFileName().toString()) + .load(); } else { logger.warn("No .env file found at '{}', using system environment variables", path); } diff --git a/src/test/java/edu/kit/kastel/sdq/lissa/ratlr/cache/CacheRecoveryIntegrationTest.java b/src/test/java/edu/kit/kastel/sdq/lissa/ratlr/cache/CacheRecoveryIntegrationTest.java new file mode 100644 index 00000000..bbd5a3e5 --- /dev/null +++ b/src/test/java/edu/kit/kastel/sdq/lissa/ratlr/cache/CacheRecoveryIntegrationTest.java @@ -0,0 +1,304 @@ +/* Licensed under MIT 2025-2026. */ +package edu.kit.kastel.sdq.lissa.ratlr.cache; + +import static org.junit.jupiter.api.Assertions.*; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.stream.Stream; + +import org.jspecify.annotations.NullMarked; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import edu.kit.kastel.sdq.lissa.ratlr.Evaluation; +import edu.kit.kastel.sdq.lissa.ratlr.utils.Environment; + +/** + * Integration tests for cache recovery scenarios across different cache layers. + * These tests verify that data can be fully recovered when transferring between + * local files and remote cache systems like Redis. + */ +@NullMarked +@Testcontainers +class CacheRecoveryIntegrationTest { + + @Container + static final GenericContainer redisContainer = + new GenericContainer<>("redis:latest").withExposedPorts(6379).withReuse(true); + + @TempDir + static Path tempDir; + + private static Path toRedisEnv; + private static Path toLocalEnv; + + @BeforeAll + static void setUpRedis() throws IOException { + String redisUrl = "redis://" + redisContainer.getHost() + ":" + redisContainer.getMappedPort(6379); + + String baseEnv = """ + OLLAMA_EMBEDDING_HOST=http://localhost:11434 + OLLAMA_HOST=http://localhost:11434 + OPENAI_ORGANIZATION_ID=DUMMY + OPENAI_API_KEY=DUMMY + CACHE_REPLACEMENT_STRATEGY=ERROR + REDIS_URL=%s + """.formatted(redisUrl); + + toRedisEnv = tempDir.resolve(".env-to-redis"); + Files.writeString(toRedisEnv, baseEnv + "CACHE_HIERARCHY=LOCAL,REDIS\n"); + + toLocalEnv = tempDir.resolve(".env-to-local"); + Files.writeString(toLocalEnv, baseEnv + "CACHE_HIERARCHY=REDIS,LOCAL\n"); + } + + @BeforeEach + void setUp() throws IOException { + deleteDir("src/test/resources/warc/temp/"); + try (var jedis = new redis.clients.jedis.Jedis(redisContainer.getHost(), redisContainer.getMappedPort(6379))) { + jedis.flushAll(); + assertEquals(0, jedis.dbSize(), "Redis should be empty before test"); + } + } + + @AfterAll + static void tearDown() throws IOException { + deleteDir("src/test/resources/warc/temp/"); + } + + // ==================== Cache Recovery Integration Tests ==================== + + /** + * Test the full cache recovery process from a local cache to a remote cache. + * This test simulates a scenario where the local cache is initially used to backfill an empty Redis cache, + * and then the local cache is recovered from Redis. + * It verifies that the initial local caches contents are fully recovered to the new local cache. + */ + @Test + @DisplayName("Cache recovery: Local → Redis → Local file recovery") + void testCacheRecoveryIntegration() throws Exception { + // ===== PHASE 1: Redis backfill from legacy cache ===== + // Setup: Local (legacy) as primary, empty Redis as secondary + runEvaluation("src/test/resources/warc/config.json", toRedisEnv); + System.out.println("Legacy cache backfilled to Redis"); + // ===== PHASE 2: Local cache recovery from Redis ===== + // Setup: Redis as primary, new local cache as secondary + runEvaluation("src/test/resources/warc/config-without-cache.json", toLocalEnv); + System.out.println("Local cache recovered from Redis"); + + assertCacheFilesIdentical( + Path.of("src/test/resources/warc/cache/SimpleClassifier_gpt-4o-mini-2024-07-18_133742243.json"), + Path.of("src/test/resources/warc/temp/cache/SimpleClassifier_gpt-4o-mini-2024-07-18_133742243.json")); + assertCacheFilesIdentical( + Path.of("src/test/resources/warc/cache/OpenAiEmbeddingCreator_text-embedding-3-large.json"), + Path.of("src/test/resources/warc/temp/cache/OpenAiEmbeddingCreator_text-embedding-3-large.json")); + } + + /** + * This test fills the missing entries in a partial local cache from Redis. + * This test simulates a scenario where the local cache already holds some values while others get backfilled + * from the remote redis cache. + */ + @Test + @DisplayName("Cache completion: Partial local cache completed from Redis") + void testPartialCacheCompletionIntegration() throws Exception { + // ===== PHASE 1: Fill Redis from complete local cache ===== + runEvaluation("src/test/resources/warc/config.json", toRedisEnv); + + // ===== SETUP: Copy complete cache to temp dir and remove some entries ===== + Path sourceCacheFile = + Path.of("src/test/resources/warc/cache/SimpleClassifier_gpt-4o-mini-2024-07-18_133742243.json"); + Path tempCacheDir = Path.of("src/test/resources/warc/temp/cache"); + Files.createDirectories(tempCacheDir); + Path tempCacheFile = tempCacheDir.resolve("SimpleClassifier_gpt-4o-mini-2024-07-18_133742243.json"); + Files.copy(sourceCacheFile, tempCacheFile); + + // Remove some entries to simulate a partial cache + ObjectMapper mapper = new ObjectMapper(); + TypeReference> typeRef = new TypeReference<>() {}; + Map cacheData = new LinkedHashMap<>(mapper.readValue(tempCacheFile.toFile(), typeRef)); + List keys = new ArrayList<>(cacheData.keySet()); + // Remove the last third of entries + for (String key : keys.subList(keys.size() - keys.size() / 3, keys.size())) { + cacheData.remove(key); + } + assertTrue(keys.size() > cacheData.size(), "Partial cache should not contain all cache keys"); + mapper.writeValue(tempCacheFile.toFile(), cacheData); + + // ===== PHASE 2: Complete partial local cache from Redis ===== + runEvaluation("src/test/resources/warc/config-without-cache.json", toLocalEnv); + + // ===== ASSERT: Partial local cache is now complete ===== + assertCacheFilesIdentical(sourceCacheFile, tempCacheFile); + } + + /** + * This test ensures that no cache values are removed when the local cache is already complete and the Redis cache + * is used as secondary. + */ + @Test + @DisplayName("Cache preservation: Existing entries are not removed") + void testCacheStabilityIntegration() throws Exception { + // ===== SETUP: Copy complete cache to temp dir and add extra entries ===== + Path sourceCacheFile = + Path.of("src/test/resources/warc/cache/SimpleClassifier_gpt-4o-mini-2024-07-18_133742243.json"); + Path tempCacheDir = Path.of("src/test/resources/warc/temp/cache"); + Files.createDirectories(tempCacheDir); + Path tempCacheFile = tempCacheDir.resolve("SimpleClassifier_gpt-4o-mini-2024-07-18_133742243.json"); + Files.copy(sourceCacheFile, tempCacheFile); + + // Add extra entries to simulate a cache with additional values + ObjectMapper mapper = new ObjectMapper(); + TypeReference> typeRef = new TypeReference<>() {}; + Map cacheData = new LinkedHashMap<>(mapper.readValue(tempCacheFile.toFile(), typeRef)); + int keys = cacheData.size(); + cacheData.put("extra-key-1", "\"extra-value-1\""); + cacheData.put("extra-key-2", "\"extra-value-2\""); + assertTrue(keys < cacheData.size(), "Larger cache should contain additional keys"); + mapper.writeValue(tempCacheFile.toFile(), cacheData); + + // ===== PHASE 1: Fill Redis from complete local cache ===== + runEvaluation("src/test/resources/warc/config.json", toRedisEnv); + + // ===== PHASE 2: Run evaluation against fully populated local cache ===== + runEvaluation("src/test/resources/warc/config-without-cache.json", toLocalEnv); + + // ===== ASSERT: All original entries still present including extra ones ===== + Map resultData = mapper.readValue(tempCacheFile.toFile(), typeRef); + assertEquals(cacheData.size(), resultData.size(), "Cache should have same number of entries"); + LocalCache cache = new LocalCache<>(tempCacheFile.toString(), new RecoveryCacheParameter()); + for (String rawKey : cacheData.keySet()) { + RecoveryCacheKey key = RecoveryCacheKey.of(new RecoveryCacheParameter(), rawKey); + String value = cache.getViaInternalKey(key, String.class); + assertNotNull(value, "Value should not be null for key: " + rawKey); + } + // Extra keys should still be present + LocalCache resultCache = + new LocalCache<>(tempCacheFile.toString(), new RecoveryCacheParameter()); + assertEquals( + "extra-value-1", + resultCache.getViaInternalKey( + RecoveryCacheKey.of(new RecoveryCacheParameter(), "extra-key-1"), String.class)); + assertEquals( + "extra-value-2", + resultCache.getViaInternalKey( + RecoveryCacheKey.of(new RecoveryCacheParameter(), "extra-key-2"), String.class)); + } + + /** + * Runs an actual evaluation with the given configuration and environment. + * + * @param configPath The path to the configuration file. + * @param envPath The path to the environment file. + * @throws IOException If any of the files cannot be read + */ + private void runEvaluation(String configPath, Path envPath) throws IOException { + Environment.overwrite(envPath); + + // Run evaluation that triggers cache reads + File config = new File(configPath); + Assertions.assertTrue(config.exists()); + + Evaluation evaluation = new Evaluation(config.toPath()); + evaluation.run(); + } + + /** + * Compares two cache files to ensure they have identical contents. Asserts that both files exist, have the same + * number of entries, and that all key-value pairs match when retrieved from the local cache. + * The cache files may mix serialized JSON and raw key-value pairs and be out of order from each other. + */ + private void assertCacheFilesIdentical(Path cacheFile1, Path cacheFile2) throws Exception { + assertTrue(Files.exists(cacheFile1), "First cache file should exist"); + assertTrue(Files.exists(cacheFile2), "Second cache file should exist"); + + LocalCache cache1 = new LocalCache<>(cacheFile1.toString(), new RecoveryCacheParameter()); + LocalCache cache2 = new LocalCache<>(cacheFile2.toString(), new RecoveryCacheParameter()); + + ObjectMapper mapper = new ObjectMapper(); + TypeReference> typeRef = new TypeReference<>() {}; + Map rawKeys = mapper.readValue(cacheFile1.toFile(), typeRef); + + assertEquals( + rawKeys.size(), + mapper.readValue(cacheFile2.toFile(), typeRef).size(), + "Cache files should have same number of entries"); + + for (String rawKey : rawKeys.keySet()) { + + RecoveryCacheKey key = RecoveryCacheKey.of(new RecoveryCacheParameter(), rawKey); + String value1 = cache1.getViaInternalKey(key, String.class); + String value2 = cache2.getViaInternalKey(key, String.class); + assertNotNull(value1, "Cached value should not be null for key: " + rawKey); + assertEquals(value1, value2, "Values should match for key: " + rawKey); + } + } + + /** + * Delete a directory recursively. + */ + private static void deleteDir(String path) throws IOException { + Path dir = Path.of(path); + if (Files.exists(dir)) { + try (Stream stream = Files.walk(dir)) { + List files = stream.sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .toList(); + for (File file : files) { + Files.deleteIfExists(file.toPath()); + } + } + } + } + + /** + * Mock CacheKey implementation for testing. The local key is the raw key from the cache file. + */ + private static class RecoveryCacheKey implements CacheKey { + private final String localKeyValue; + + private RecoveryCacheKey(String content) { + this.localKeyValue = content; + } + + @SuppressWarnings("unused") + static RecoveryCacheKey of(RecoveryCacheParameter cacheParameter, String content) { + return new RecoveryCacheKey(content); + } + + @Override + public String localKey() { + return localKeyValue; + } + } + + /** + * Mock CacheParameter implementation for testing + */ + private static class RecoveryCacheParameter implements CacheParameter { + @Override + public String parameters() { + return "test-cache"; + } + + @Override + public RecoveryCacheKey createCacheKey(String content) { + return RecoveryCacheKey.of(this, content); + } + } +} diff --git a/src/test/resources/warc/cache/SimpleClassifier_gpt-4o-mini-2024-07-18_133742243.json b/src/test/resources/warc/cache/SimpleClassifier_gpt-4o-mini-2024-07-18_133742243.json index 8acbdd2f..27830639 100644 --- a/src/test/resources/warc/cache/SimpleClassifier_gpt-4o-mini-2024-07-18_133742243.json +++ b/src/test/resources/warc/cache/SimpleClassifier_gpt-4o-mini-2024-07-18_133742243.json @@ -1 +1 @@ -{"d30f0e4c-da65-362d-9a6a-8e1913ab2c6e":"Yes.","057b87e3-2dfd-33d7-b34b-2dbdeff6c8ee":"Yes.","3f7e2703-fb75-3de5-b3fc-fa81b538480a":"Yes.","45f7ace3-7399-3e67-bc4d-b82d0ffb562c":"Yes.","9c0cbd23-c3e1-3c80-b562-8bed12ea49cd":"Yes.","b6973524-aed1-3050-92c8-7540cda55d27":"Yes.","8a082a86-78e8-3742-87a6-18677254c2ac":"Yes.","2ee2db38-12c9-35d7-a587-bcac56ff9307":"Yes.","9978c3d8-a20e-3180-b859-99d69b083f04":"Yes.","7fc911f1-2085-388e-a88c-04f8e2cc3d38":"Yes.","17e87483-9c5a-34f6-9fdf-77e19bd377f8":"Yes.","6a7bff04-67ae-3bd2-b9b6-e562a2a9c495":"Yes.","89a63841-dcf0-3aac-8e28-9d08cdd7be61":"Yes.","94272a3e-634a-324d-b261-182708fb8daa":"Yes.","77183c53-24d1-3fd3-8d8a-c5a4a6c47d94":"Yes.","363a6dce-bca9-35dd-aba1-058db4bb56f3":"Yes.","0b16e72b-5f07-3e39-9a72-b84e0d7ced31":"Yes.","188ca50f-d4e0-375b-9b05-3d0db4ebebfd":"Yes.","0ef7e687-8fb1-3746-a7b6-3613539ac315":"Yes.","ab1881de-ab0f-3c63-ad91-b5e8f77b2c8a":"Yes.","6c2799de-7ab3-3a4b-8c3f-a28fabd86099":"Yes.","0b5d86aa-3f9d-3161-9ded-6239dcfe8b9a":"Yes.","dffbbc1a-542d-3033-8e42-c51d38f0b71a":"Yes.","cdf52527-2e07-36f2-8ce1-b38f7324bdd6":"Yes.","8dd00d20-a0fa-33ba-ac3a-3c6fc0277aa0":"Yes.","920b60ce-33a0-3e7c-9d2b-4a83c0295470":"Yes.","bc2a0c49-7524-3e82-8e00-74e758166b61":"Yes.","119fed24-467c-3928-92f8-1672f8a07501":"Yes.","6c294e0a-cdce-395c-9224-465bb2f296f0":"Yes.","9a70ba8b-9f62-3bcf-b022-89ac5e42b94f":"Yes.","603d4b24-5382-337e-94b9-01e15fe1a9ee":"Yes.","c1bd39d2-05a9-3271-9e50-b51482719c60":"Yes.","570f595f-5c78-3023-b42d-bd16113cd426":"Yes.","6e0dff6d-4798-362a-bfa8-3c2d5bbb35e9":"Yes.","0ed86171-5920-3cb1-bfa7-0a595beba2b7":"Yes.","328b9b3b-6ebf-3cea-b730-6b190a47e7ab":"Yes.","a78bb9f5-f6f6-371f-96e8-7abe61722d0a":"Yes.","dcc81fd6-9d44-32c5-945e-f7eb73deac0a":"Yes.","f4d9d4a1-dff5-3745-95cc-bab3c60571eb":"Yes.","2d5e4d53-cc78-3777-b12a-3eccecbfff29":"Yes.","13202793-29ee-325c-b6a8-81f3d26aee9e":"Yes.","4aae1a51-ef7f-3567-81dc-848de967d917":"Yes.","98289868-a976-3a82-a312-72408f5b1bff":"Yes.","630361da-1ed8-345a-abb6-485dc8b9988f":"Yes.","42c9ae45-4947-3e77-b1fc-0616cc53057e":"Yes.","c4bf4ae1-4ca1-3911-9cda-28428421bd23":"Yes.","c31316c5-2fec-31d8-92f0-707d942adda1":"Yes.","29f65109-a53c-3a39-864b-98bf889ecb1f":"Yes.","faa771c9-e236-3ab9-b2c7-98b9c24a35cf":"Yes.","1bd7559f-2e0e-35f1-bbb2-8e539dbd87d5":"Yes.","a9e6770c-d1a2-30de-acd1-a9c02da69bd1":"Yes.","c1d231d8-bee6-3944-9882-19cfaba5b257":"Yes.","0a612f44-41ea-3bf5-9847-e1d8ba1eb8c1":"Yes.","5cd6beb9-adfb-3574-ac88-e74b3f82378d":"Yes.","a881c500-083d-35d5-ab77-09a22f4b6d39":"Yes.","5ddb1dd5-895a-3990-8b42-512392342212":"Yes.","0f9dedf0-9352-3695-a32e-3b9ac448fcdf":"Yes.","dafad65b-b06a-3a29-96e6-e0cf0523aa17":"Yes.","39cf72cb-0f11-383d-8eb9-e22f9b5cdf72":"Yes.","63c71e3a-f869-371e-bf70-8094777893d0":"Yes.","1a88522d-8a36-3442-8adf-08cb469ea741":"Yes.","1fab88e7-df73-33e6-84c4-d331172f1927":"Yes.","88134678-88a6-3a32-95b2-9609d7a37abb":"Yes.","75beddc5-1a3c-3170-857f-f8ecbb4fb4f9":"Yes.","1a7c7e73-52bc-3205-b2c7-ec63b90d3b22":"Yes.","07895e7e-739a-357c-959c-f836f7b2d2fe":"Yes.","abbc7694-589a-3780-9efc-2826b07efec1":"Yes.","da8bcc9d-053d-31b2-be3d-d4d07962e2da":"Yes.","4cbd8bf6-3947-38ca-aa99-8d0691ea6714":"Yes.","4d5908a3-9168-3219-8496-901801933d6f":"Yes.","0b54d18b-ea98-347c-9120-c70bf2f00df7":"Yes.","d967bb7b-109e-31ee-9c2d-2602264d4ee1":"Yes.","6da8316f-90d2-30aa-ae41-d381549ada97":"Yes.","796dcd44-81ee-3209-90c0-03ebcb9ac106":"Yes.","d1fc7da0-57e0-398b-8c7f-8697c84fa206":"Yes.","fdd0ec1c-e7a5-3960-b9dd-a5b3829fda54":"Yes.","c859ee63-6cb8-332b-9532-901b64a07357":"Yes.","af6860d2-c692-3b88-a331-9787f38ec142":"Yes.","56b6f57a-2800-366e-bdb3-26e9ea25d966":"Yes.","c385ab60-456e-3d6d-aa3c-b367472aaf05":"Yes.","24337394-1df4-3984-9529-9d0a2edfb8c0":"Yes.","340095d2-340c-3ddf-ae5c-b565f6968ee4":"Yes.","c0c8b4cf-f699-3eeb-acf3-f7f7ff1b259a":"Yes.","e4e658b9-297a-36c9-b6d8-ae1020810f13":"Yes.","aa76e989-083f-32f8-bcae-8caf6a45e2cf":"Yes.","cea656d4-3b54-3978-b89c-3b5bf83fafbc":"Yes.","769f23e3-57f8-3345-b2c5-5a98b93254c4":"Yes.","2a4c93f8-307e-37a1-849c-ebecb4dc885f":"Yes.","625353c2-c010-353d-8cc2-50870c086b6c":"Yes.","12d24f16-eae7-33c6-838f-260ec14ff9c4":"Yes.","7d1d090d-f0d5-3cbf-b613-a30ce189784a":"No.","8ff967ec-47e4-387a-bb3c-09d301f4f040":"Yes.","f2e9077d-a3e9-30d7-9de6-51fca9cf09c0":"Yes.","44a876b0-2933-35c2-a633-a435a4641785":"Yes.","95889c55-2f43-335e-a50e-5702c11f4037":"Yes.","2c78de2f-2f6f-35dd-b2ff-8ca406717ee2":"Yes.","6c68b99a-e7dd-3e6a-8430-94fd502f8a23":"Yes.","8135df7a-1297-394f-8f39-251bd4e60590":"Yes.","b1e26544-150a-3404-b163-933cabd480c6":"Yes.","d82f37ad-4398-32fa-811b-111fcbdfbf18":"Yes.","245b4a3f-3223-39b3-9c8d-c6e5e22927ea":"Yes.","dbcaa19d-2339-388f-b9d4-7a1b0337bfb4":"Yes.","d1da50e0-6d49-3c54-825d-c13d78792dfe":"Yes.","768d5418-f34d-37c1-a075-d9ec5068fe9f":"Yes.","eb2a043b-da47-3078-96a0-b1a8b11ca503":"Yes.","810ea343-ae09-3143-b644-72bb8a19dd5b":"Yes.","a5a48034-cf3d-3d75-9862-895acde3d8eb":"Yes.","3900c065-4d0d-3e56-b834-52024c84223e":"Yes.","0f46c26d-26c1-333a-90c0-a044458a80d8":"Yes.","944a0abf-db75-385d-bde0-012d57c6299b":"Yes.","7dfac8e2-9eff-335c-b97e-ff30ce198a1e":"Yes.","c29e2926-4e3b-3afb-861a-9d8c0e524ad0":"Yes.","b89e22b4-9c34-3075-9c8f-ab2f0f994fe7":"Yes.","60aa1270-a508-3a8a-858f-bbaa3d6dd437":"Yes.","76e3bff2-ccc1-34ea-b766-6a49e9da6711":"Yes.","b05048cb-21bb-3710-b43a-1684b4aed0dd":"Yes.","6d02ed01-cf3d-3025-af19-a09a36ea6436":"Yes.","4de9fad0-483f-31db-bd65-76ec836bd5d9":"Yes.","29d155bb-0ba5-3854-a836-0f016ff24616":"Yes.","a8397b0c-d96a-3ff1-98f3-7d26b0bc7ad6":"Yes.","c150ad2e-e597-3bc9-b323-a9a94068f0fd":"Yes.","f3c7abb8-6809-3aab-b7b8-c579d87396b2":"Yes.","18825747-cdb2-35be-880d-43ceba14ee45":"Yes.","1518f195-1130-30eb-9238-113e20debe2b":"Yes.","243d9b4e-792c-371a-92d7-677a2037bf13":"Yes.","be15a93c-1529-3708-a177-241f6c51eee2":"Yes.","5aa43645-d56d-3930-a189-e82649fd59d5":"Yes.","fd29cd66-ee88-31ce-b48f-2c706c692236":"Yes.","f409db4a-0095-36d0-985f-1b71833f660e":"Yes.","36a5afdd-3982-373c-ac56-5015f9e2d07c":"Yes.","cd7fe568-e263-3bee-b53d-7d1fcfd8782b":"Yes.","1e71ea6c-4e04-3d50-beed-b3fad8af4726":"Yes.","8ce87139-bd6c-380b-8a94-847e257fba0f":"Yes.","5a77cab7-c620-333c-8823-e5f71eafd791":"Yes.","68d94bd2-40fe-3fea-9ecf-eb5dded9bcdd":"Yes.","dcb9e726-5451-39e8-9002-2f2ed5bf2043":"Yes.","d58f0b82-941f-3247-8d8e-8303a3119fb3":"Yes.","5bbb872c-805d-3eca-b757-781a9530ec23":"Yes.","84033baf-9306-30d2-92a5-2eb61a4d475f":"Yes.","cea03ab9-c46c-3630-bee6-dbd47d6db0eb":"Yes.","0541557d-033d-3eb9-83da-d91236100c22":"Yes.","1964e748-b9a1-3112-ba05-2a62ff45fe72":"Yes.","196693ed-a572-3ca6-94b1-0fe291a6ac51":"Yes.","dfe1f600-62ab-34ad-b7c0-000c5be73e7e":"Yes.","50ffb190-fa27-3bc0-86c8-fd46a2844e82":"Yes.","fae5d0e6-2e4d-34da-8d29-392f3cddee1f":"Yes.","3d03dbf5-4af4-3e2a-ba2f-716b44668ed6":"Yes.","cf0dcf91-3261-3571-b191-4757aaad9d84":"Yes.","19e929f2-7199-3daf-aa57-7646dc00e872":"Yes.","3bbb66df-015d-3b25-a1b5-aac94a3a02fe":"Yes.","962fc777-2797-3951-b846-f9a7d01653b3":"Yes.","84adaf7a-2ead-36ed-b865-7cc9a39eb9b5":"Yes.","f421f048-4406-3211-ad13-60b7aa33b094":"Yes.","cac23632-d838-3bd7-aaf6-65cbe8723124":"Yes.","0b10b709-7174-30bc-9c2d-c5a8626e79cf":"Yes.","9793644c-e225-3e27-87ab-f5056b757a0e":"Yes.","d473de2d-b09a-37f9-b5fc-9dcf9d41c450":"Yes.","033f2aec-d3be-3927-bc0e-d4eabfceee75":"Yes.","6775bd8b-1cf7-330d-b976-f5233430c863":"Yes.","2d33d7f6-a359-3a01-a980-e4de9a0d3e69":"Yes.","4a6b5bec-0db4-34db-9b3c-6ab6c1e2179d":"Yes.","0c389d20-f17f-30a1-ac99-88f1985c0e7f":"Yes.","1e030bde-f8c0-374c-9348-381808f83be5":"Yes.","d34ad55f-d478-3a7f-956a-b6f9fb332397":"Yes.","ff487a44-5cb0-3ea6-a3b6-3a46991820e8":"Yes.","380e5760-e4da-3c33-b2bd-8acc5c2ce4d9":"Yes.","fece23dd-15ec-339a-9711-a08b78a67464":"Yes.","cc018e29-e686-35d0-b10b-f30e2e8893ad":"Yes.","b432d9a6-3102-3ac1-bd3a-64fd5d26956d":"Yes.","9ee82943-6856-3607-a8ae-9e9169015b6c":"Yes.","36735736-317c-322c-84ce-71a725bbcc16":"Yes.","0d3b6442-2089-340c-9955-2c64eea456a6":"Yes.","0d340c5e-79c1-3a0e-924e-25ca6c2829db":"Yes.","91fbadcc-9db7-3550-b11e-e21572eafc26":"Yes.","03e17f0b-d3a7-32e5-9fb4-7a2342fc8183":"Yes.","4895326d-8c80-3da2-b100-ee33bbcd6183":"Yes.","524879e0-cf54-320e-be8b-073ec94eadcc":"Yes.","db005846-854b-37e8-820f-8eb3cf654fa5":"Yes.","9aaa654d-fd87-3fc3-bb17-da225bc2191f":"Yes.","baeab3d0-9d5d-3d07-bf99-047891ad1e75":"Yes.","c5efaea7-eb08-33b4-9548-016ac9247c81":"Yes.","1fc70418-431c-383f-8a09-4a8dbd1ab997":"Yes.","d2726db8-e37f-3ea0-8bbb-a41c784d0233":"Yes.","bc070073-4584-3e65-815b-0c97659e1ce7":"Yes.","13f20bbd-9d1b-3d83-999c-424e18b88ae4":"Yes.","ff5a47eb-6067-34d3-ba52-f05f8fa9c5e5":"Yes.","28e1c0ce-eba4-3afe-9638-448822db7c58":"Yes.","b8eeb568-e8be-3f14-bbe2-b576b8b5daef":"Yes.","13a073e0-c2f9-31e7-b6a4-361151baf47c":"Yes.","defd7a0d-1e74-3007-9a21-d69b945d3f79":"Yes.","1e58af03-d0e1-38af-b881-f1940851333d":"Yes.","0afe4685-b4fb-31b0-93d4-0850164ddbbc":"Yes.","a687ab21-be47-3e8f-9674-530a7582a8f5":"Yes.","054954f1-5cc4-31db-afd8-c015055e0d22":"Yes.","d21732a3-bb05-33db-8969-538ef901b3f3":"Yes.","1e86eea2-feed-3878-9da8-020a351b4221":"Yes.","421419df-15c7-32a4-a7fc-2ddc08bb1a89":"Yes.","14073059-d95b-33a9-b7e2-2dc819f892cf":"Yes.","e777f4a4-33f0-3e15-ab02-92f545a5ff95":"Yes.","540ea5df-74b2-326e-86b6-e02307f5a8aa":"Yes.","89d48a2e-872a-30c9-8ef0-b7b77f22e46f":"Yes.","e07e188e-1ee1-3929-bcc0-1186aace32d2":"Yes.","911f7e24-646e-3f74-8b6c-430bd55dd960":"Yes.","5b4565e5-9518-31ca-a498-29ea001eff0f":"Yes.","8dd2bc14-5716-3d20-97dc-d3df9c4f9a13":"Yes.","d22616e4-0de7-3ab8-bab2-b513d4c35dd1":"Yes.","431d9961-000c-3544-964d-a8f48625e3ed":"Yes.","f41dbcd1-5521-37bc-b21f-2fd2b94aa6b9":"Yes.","2fa38f0f-446b-3cdd-ae50-514e2cca3c48":"Yes.","e1dc1faf-00d0-399e-820c-bfb0000337c7":"Yes.","5097130f-bf9a-3ef2-8544-ccaa594a4303":"Yes.","566748ea-a3dc-3363-9ac6-12b8fc6e9f9f":"Yes.","1168d2ad-84a3-3293-95c5-2235dba4a42d":"Yes.","04f1f3ff-6acc-3d31-b2b5-920cdef5a775":"Yes.","0120db82-6d43-3148-bb4f-24753ea8f179":"Yes.","a1de18ac-1fa9-3c1b-8ea0-142b6e022b94":"Yes.","3eaee6f8-cca8-32af-a9b0-2b9378ec2150":"Yes.","da0a84f7-13c5-33e3-a2a6-cb0e01b69073":"Yes.","bd9eb264-aae9-35f2-9f5b-affd0dec95ff":"Yes.","eb5b7e64-e4c0-335a-a70a-9aaafe265390":"Yes.","38f9d753-553d-350e-bcfe-3df5a7612d1c":"Yes.","a66f4746-a848-391b-936e-e6f5b2b1c207":"Yes.","4560872d-dce3-3919-bda5-7062c4bb6401":"Yes.","380de211-b543-37b6-ae3e-90f22d037b6d":"Yes.","353d54e2-c9b1-3f8c-934e-a5cd53f4bb9d":"Yes.","0f4135b3-3dd6-3eeb-89b9-92b5347bb033":"Yes.","c8c24500-965f-37be-bd85-6b6e8ec150e1":"Yes.","df7741c5-a2e7-374c-83bf-f2219504cad5":"Yes.","b2222c16-97db-3102-add1-1fdd563ce527":"Yes.","6b7eb34d-2a42-32ef-8ba0-c845021e5aa7":"Yes.","6e8f531e-1d18-342c-9243-271f1bf51490":"Yes.","8675090b-bc86-342d-974e-47ef74c001de":"Yes.","d4df2301-a5de-3b4c-bb84-d5dd64e7e92e":"Yes.","b7b60d6e-ac3a-3228-aa82-3f64851844ca":"Yes.","1e7b1f35-e24c-3b57-a342-36529e314281":"Yes.","af1a73ea-eacf-3ffc-b450-be0b0d2cb00e":"Yes.","0ff1f03d-6ed4-3c90-ad80-66c1d87022a6":"Yes.","2107de23-790a-3f37-83ab-a759f4ccdc0c":"Yes.","4d8131f0-3de1-3c2a-9d36-4fc62f271c85":"Yes.","3eac0f61-317d-31b7-a1ad-71bca3046ca8":"Yes.","aed286cb-ea87-335b-9090-c72dfacef576":"Yes.","4c8c9428-efd5-31cf-a82e-41456fa47ee0":"No.","1a35af25-de7d-3787-af9d-726eb3dc4697":"Yes.","3ac6b2f9-93d7-3ad1-931a-0f7d78e1daf0":"Yes.","62a0c493-7f13-3e3f-ac8a-09b132c1cae0":"Yes.","e3631dc5-1fca-3202-adc9-ba5d88566556":"Yes.","efefbf2c-6a21-3077-9363-04401e52dd0e":"Yes.","e9bdacbe-aead-3d18-ab64-36e276f9503e":"Yes.","fb8b2863-73df-3f50-b4bb-1482692ea045":"Yes.","ce2aee36-498c-3320-84cd-75645e2fa1eb":"Yes.","e78b2a4b-9a18-39fc-b8b2-8fc83d52564d":"Yes.","f411eda7-a06d-351d-90ca-1cfcd8685b13":"Yes.","1ac3f047-18cd-39ed-93c6-3bfe8c5a4d90":"Yes.","0ead4ad4-c5a7-3364-a54d-4b572023876e":"Yes."} \ No newline at end of file +{"d30f0e4c-da65-362d-9a6a-8e1913ab2c6e":"Yes.","057b87e3-2dfd-33d7-b34b-2dbdeff6c8ee":"Yes.","3f7e2703-fb75-3de5-b3fc-fa81b538480a":"Yes.","45f7ace3-7399-3e67-bc4d-b82d0ffb562c":"Yes.","9c0cbd23-c3e1-3c80-b562-8bed12ea49cd":"Yes.","b6973524-aed1-3050-92c8-7540cda55d27":"Yes.","8a082a86-78e8-3742-87a6-18677254c2ac":"Yes.","2ee2db38-12c9-35d7-a587-bcac56ff9307":"Yes.","9978c3d8-a20e-3180-b859-99d69b083f04":"Yes.","7fc911f1-2085-388e-a88c-04f8e2cc3d38":"Yes.","17e87483-9c5a-34f6-9fdf-77e19bd377f8":"Yes.","6a7bff04-67ae-3bd2-b9b6-e562a2a9c495":"Yes.","89a63841-dcf0-3aac-8e28-9d08cdd7be61":"Yes.","94272a3e-634a-324d-b261-182708fb8daa":"Yes.","77183c53-24d1-3fd3-8d8a-c5a4a6c47d94":"Yes.","363a6dce-bca9-35dd-aba1-058db4bb56f3":"Yes.","0b16e72b-5f07-3e39-9a72-b84e0d7ced31":"Yes.","188ca50f-d4e0-375b-9b05-3d0db4ebebfd":"Yes.","0ef7e687-8fb1-3746-a7b6-3613539ac315":"Yes.","ab1881de-ab0f-3c63-ad91-b5e8f77b2c8a":"Yes.","6c2799de-7ab3-3a4b-8c3f-a28fabd86099":"Yes.","0b5d86aa-3f9d-3161-9ded-6239dcfe8b9a":"Yes.","dffbbc1a-542d-3033-8e42-c51d38f0b71a":"Yes.","cdf52527-2e07-36f2-8ce1-b38f7324bdd6":"Yes.","8dd00d20-a0fa-33ba-ac3a-3c6fc0277aa0":"Yes.","920b60ce-33a0-3e7c-9d2b-4a83c0295470":"Yes.","bc2a0c49-7524-3e82-8e00-74e758166b61":"Yes.","119fed24-467c-3928-92f8-1672f8a07501":"Yes.","6c294e0a-cdce-395c-9224-465bb2f296f0":"Yes.","9a70ba8b-9f62-3bcf-b022-89ac5e42b94f":"Yes.","603d4b24-5382-337e-94b9-01e15fe1a9ee":"Yes.","c1bd39d2-05a9-3271-9e50-b51482719c60":"Yes.","570f595f-5c78-3023-b42d-bd16113cd426":"Yes.","6e0dff6d-4798-362a-bfa8-3c2d5bbb35e9":"Yes.","0ed86171-5920-3cb1-bfa7-0a595beba2b7":"Yes.","328b9b3b-6ebf-3cea-b730-6b190a47e7ab":"Yes.","a78bb9f5-f6f6-371f-96e8-7abe61722d0a":"Yes.","dcc81fd6-9d44-32c5-945e-f7eb73deac0a":"Yes.","f4d9d4a1-dff5-3745-95cc-bab3c60571eb":"Yes.","2d5e4d53-cc78-3777-b12a-3eccecbfff29":"Yes.","13202793-29ee-325c-b6a8-81f3d26aee9e":"Yes.","4aae1a51-ef7f-3567-81dc-848de967d917":"Yes.","98289868-a976-3a82-a312-72408f5b1bff":"Yes.","630361da-1ed8-345a-abb6-485dc8b9988f":"Yes.","42c9ae45-4947-3e77-b1fc-0616cc53057e":"Yes.","c4bf4ae1-4ca1-3911-9cda-28428421bd23":"Yes.","c31316c5-2fec-31d8-92f0-707d942adda1":"Yes.","29f65109-a53c-3a39-864b-98bf889ecb1f":"Yes.","faa771c9-e236-3ab9-b2c7-98b9c24a35cf":"Yes.","1bd7559f-2e0e-35f1-bbb2-8e539dbd87d5":"Yes.","a9e6770c-d1a2-30de-acd1-a9c02da69bd1":"Yes.","c1d231d8-bee6-3944-9882-19cfaba5b257":"Yes.","0a612f44-41ea-3bf5-9847-e1d8ba1eb8c1":"Yes.","5cd6beb9-adfb-3574-ac88-e74b3f82378d":"Yes.","a881c500-083d-35d5-ab77-09a22f4b6d39":"Yes.","5ddb1dd5-895a-3990-8b42-512392342212":"Yes.","0f9dedf0-9352-3695-a32e-3b9ac448fcdf":"Yes.","dafad65b-b06a-3a29-96e6-e0cf0523aa17":"Yes.","39cf72cb-0f11-383d-8eb9-e22f9b5cdf72":"Yes.","63c71e3a-f869-371e-bf70-8094777893d0":"Yes.","1a88522d-8a36-3442-8adf-08cb469ea741":"Yes.","1fab88e7-df73-33e6-84c4-d331172f1927":"Yes.","88134678-88a6-3a32-95b2-9609d7a37abb":"Yes.","75beddc5-1a3c-3170-857f-f8ecbb4fb4f9":"Yes.","1a7c7e73-52bc-3205-b2c7-ec63b90d3b22":"Yes.","07895e7e-739a-357c-959c-f836f7b2d2fe":"Yes.","abbc7694-589a-3780-9efc-2826b07efec1":"Yes.","da8bcc9d-053d-31b2-be3d-d4d07962e2da":"Yes.","4cbd8bf6-3947-38ca-aa99-8d0691ea6714":"Yes.","4d5908a3-9168-3219-8496-901801933d6f":"Yes.","0b54d18b-ea98-347c-9120-c70bf2f00df7":"Yes.","d967bb7b-109e-31ee-9c2d-2602264d4ee1":"Yes.","6da8316f-90d2-30aa-ae41-d381549ada97":"Yes.","796dcd44-81ee-3209-90c0-03ebcb9ac106":"Yes.","d1fc7da0-57e0-398b-8c7f-8697c84fa206":"Yes.","fdd0ec1c-e7a5-3960-b9dd-a5b3829fda54":"Yes.","c859ee63-6cb8-332b-9532-901b64a07357":"Yes.","af6860d2-c692-3b88-a331-9787f38ec142":"Yes.","56b6f57a-2800-366e-bdb3-26e9ea25d966":"Yes.","c385ab60-456e-3d6d-aa3c-b367472aaf05":"Yes.","24337394-1df4-3984-9529-9d0a2edfb8c0":"Yes.","340095d2-340c-3ddf-ae5c-b565f6968ee4":"Yes.","c0c8b4cf-f699-3eeb-acf3-f7f7ff1b259a":"Yes.","e4e658b9-297a-36c9-b6d8-ae1020810f13":"Yes.","aa76e989-083f-32f8-bcae-8caf6a45e2cf":"Yes.","cea656d4-3b54-3978-b89c-3b5bf83fafbc":"Yes.","769f23e3-57f8-3345-b2c5-5a98b93254c4":"Yes.","2a4c93f8-307e-37a1-849c-ebecb4dc885f":"Yes.","625353c2-c010-353d-8cc2-50870c086b6c":"Yes.","12d24f16-eae7-33c6-838f-260ec14ff9c4":"Yes.","7d1d090d-f0d5-3cbf-b613-a30ce189784a":"No.","8ff967ec-47e4-387a-bb3c-09d301f4f040":"Yes.","f2e9077d-a3e9-30d7-9de6-51fca9cf09c0":"Yes.","44a876b0-2933-35c2-a633-a435a4641785":"Yes.","95889c55-2f43-335e-a50e-5702c11f4037":"Yes.","2c78de2f-2f6f-35dd-b2ff-8ca406717ee2":"Yes.","6c68b99a-e7dd-3e6a-8430-94fd502f8a23":"Yes.","8135df7a-1297-394f-8f39-251bd4e60590":"Yes.","b1e26544-150a-3404-b163-933cabd480c6":"Yes.","d82f37ad-4398-32fa-811b-111fcbdfbf18":"Yes.","245b4a3f-3223-39b3-9c8d-c6e5e22927ea":"Yes.","dbcaa19d-2339-388f-b9d4-7a1b0337bfb4":"Yes.","d1da50e0-6d49-3c54-825d-c13d78792dfe":"Yes.","768d5418-f34d-37c1-a075-d9ec5068fe9f":"Yes.","eb2a043b-da47-3078-96a0-b1a8b11ca503":"Yes.","810ea343-ae09-3143-b644-72bb8a19dd5b":"Yes.","a5a48034-cf3d-3d75-9862-895acde3d8eb":"Yes.","3900c065-4d0d-3e56-b834-52024c84223e":"Yes.","0f46c26d-26c1-333a-90c0-a044458a80d8":"Yes.","944a0abf-db75-385d-bde0-012d57c6299b":"Yes.","7dfac8e2-9eff-335c-b97e-ff30ce198a1e":"Yes.","c29e2926-4e3b-3afb-861a-9d8c0e524ad0":"Yes.","b89e22b4-9c34-3075-9c8f-ab2f0f994fe7":"Yes.","60aa1270-a508-3a8a-858f-bbaa3d6dd437":"Yes.","76e3bff2-ccc1-34ea-b766-6a49e9da6711":"Yes.","b05048cb-21bb-3710-b43a-1684b4aed0dd":"Yes.","6d02ed01-cf3d-3025-af19-a09a36ea6436":"Yes.","4de9fad0-483f-31db-bd65-76ec836bd5d9":"Yes.","29d155bb-0ba5-3854-a836-0f016ff24616":"Yes.","a8397b0c-d96a-3ff1-98f3-7d26b0bc7ad6":"Yes.","c150ad2e-e597-3bc9-b323-a9a94068f0fd":"Yes.","f3c7abb8-6809-3aab-b7b8-c579d87396b2":"Yes.","18825747-cdb2-35be-880d-43ceba14ee45":"Yes.","1518f195-1130-30eb-9238-113e20debe2b":"Yes.","243d9b4e-792c-371a-92d7-677a2037bf13":"Yes.","be15a93c-1529-3708-a177-241f6c51eee2":"Yes.","5aa43645-d56d-3930-a189-e82649fd59d5":"Yes.","fd29cd66-ee88-31ce-b48f-2c706c692236":"Yes.","f409db4a-0095-36d0-985f-1b71833f660e":"Yes.","36a5afdd-3982-373c-ac56-5015f9e2d07c":"Yes.","cd7fe568-e263-3bee-b53d-7d1fcfd8782b":"Yes.","1e71ea6c-4e04-3d50-beed-b3fad8af4726":"Yes.","8ce87139-bd6c-380b-8a94-847e257fba0f":"Yes.","5a77cab7-c620-333c-8823-e5f71eafd791":"Yes.","68d94bd2-40fe-3fea-9ecf-eb5dded9bcdd":"Yes.","dcb9e726-5451-39e8-9002-2f2ed5bf2043":"Yes.","d58f0b82-941f-3247-8d8e-8303a3119fb3":"Yes.","5bbb872c-805d-3eca-b757-781a9530ec23":"Yes.","84033baf-9306-30d2-92a5-2eb61a4d475f":"Yes.","cea03ab9-c46c-3630-bee6-dbd47d6db0eb":"Yes.","0541557d-033d-3eb9-83da-d91236100c22":"Yes.","1964e748-b9a1-3112-ba05-2a62ff45fe72":"Yes.","196693ed-a572-3ca6-94b1-0fe291a6ac51":"Yes.","dfe1f600-62ab-34ad-b7c0-000c5be73e7e":"Yes.","50ffb190-fa27-3bc0-86c8-fd46a2844e82":"Yes.","fae5d0e6-2e4d-34da-8d29-392f3cddee1f":"Yes.","3d03dbf5-4af4-3e2a-ba2f-716b44668ed6":"Yes.","cf0dcf91-3261-3571-b191-4757aaad9d84":"Yes.","19e929f2-7199-3daf-aa57-7646dc00e872":"Yes.","3bbb66df-015d-3b25-a1b5-aac94a3a02fe":"Yes.","962fc777-2797-3951-b846-f9a7d01653b3":"Yes.","84adaf7a-2ead-36ed-b865-7cc9a39eb9b5":"Yes.","f421f048-4406-3211-ad13-60b7aa33b094":"Yes.","cac23632-d838-3bd7-aaf6-65cbe8723124":"Yes.","0b10b709-7174-30bc-9c2d-c5a8626e79cf":"Yes.","9793644c-e225-3e27-87ab-f5056b757a0e":"Yes.","d473de2d-b09a-37f9-b5fc-9dcf9d41c450":"Yes.","033f2aec-d3be-3927-bc0e-d4eabfceee75":"Yes.","6775bd8b-1cf7-330d-b976-f5233430c863":"Yes.","2d33d7f6-a359-3a01-a980-e4de9a0d3e69":"Yes.","4a6b5bec-0db4-34db-9b3c-6ab6c1e2179d":"Yes.","0c389d20-f17f-30a1-ac99-88f1985c0e7f":"Yes.","1e030bde-f8c0-374c-9348-381808f83be5":"Yes.","d34ad55f-d478-3a7f-956a-b6f9fb332397":"Yes.","ff487a44-5cb0-3ea6-a3b6-3a46991820e8":"Yes.","380e5760-e4da-3c33-b2bd-8acc5c2ce4d9":"Yes.","fece23dd-15ec-339a-9711-a08b78a67464":"Yes.","cc018e29-e686-35d0-b10b-f30e2e8893ad":"Yes.","b432d9a6-3102-3ac1-bd3a-64fd5d26956d":"Yes.","9ee82943-6856-3607-a8ae-9e9169015b6c":"Yes.","36735736-317c-322c-84ce-71a725bbcc16":"Yes.","0d3b6442-2089-340c-9955-2c64eea456a6":"Yes.","0d340c5e-79c1-3a0e-924e-25ca6c2829db":"Yes.","91fbadcc-9db7-3550-b11e-e21572eafc26":"Yes.","03e17f0b-d3a7-32e5-9fb4-7a2342fc8183":"Yes.","4895326d-8c80-3da2-b100-ee33bbcd6183":"Yes.","524879e0-cf54-320e-be8b-073ec94eadcc":"Yes.","db005846-854b-37e8-820f-8eb3cf654fa5":"Yes.","9aaa654d-fd87-3fc3-bb17-da225bc2191f":"Yes.","baeab3d0-9d5d-3d07-bf99-047891ad1e75":"Yes.","c5efaea7-eb08-33b4-9548-016ac9247c81":"Yes.","1fc70418-431c-383f-8a09-4a8dbd1ab997":"Yes.","d2726db8-e37f-3ea0-8bbb-a41c784d0233":"Yes.","bc070073-4584-3e65-815b-0c97659e1ce7":"Yes.","13f20bbd-9d1b-3d83-999c-424e18b88ae4":"Yes.","ff5a47eb-6067-34d3-ba52-f05f8fa9c5e5":"Yes.","28e1c0ce-eba4-3afe-9638-448822db7c58":"Yes.","b8eeb568-e8be-3f14-bbe2-b576b8b5daef":"Yes.","13a073e0-c2f9-31e7-b6a4-361151baf47c":"Yes.","defd7a0d-1e74-3007-9a21-d69b945d3f79":"Yes.","1e58af03-d0e1-38af-b881-f1940851333d":"Yes.","0afe4685-b4fb-31b0-93d4-0850164ddbbc":"Yes.","a687ab21-be47-3e8f-9674-530a7582a8f5":"Yes.","054954f1-5cc4-31db-afd8-c015055e0d22":"Yes.","d21732a3-bb05-33db-8969-538ef901b3f3":"Yes.","1e86eea2-feed-3878-9da8-020a351b4221":"Yes.","421419df-15c7-32a4-a7fc-2ddc08bb1a89":"Yes.","14073059-d95b-33a9-b7e2-2dc819f892cf":"Yes.","e777f4a4-33f0-3e15-ab02-92f545a5ff95":"Yes.","540ea5df-74b2-326e-86b6-e02307f5a8aa":"Yes.","89d48a2e-872a-30c9-8ef0-b7b77f22e46f":"Yes.","e07e188e-1ee1-3929-bcc0-1186aace32d2":"Yes.","911f7e24-646e-3f74-8b6c-430bd55dd960":"Yes.","5b4565e5-9518-31ca-a498-29ea001eff0f":"Yes.","8dd2bc14-5716-3d20-97dc-d3df9c4f9a13":"Yes.","d22616e4-0de7-3ab8-bab2-b513d4c35dd1":"Yes.","431d9961-000c-3544-964d-a8f48625e3ed":"Yes.","f41dbcd1-5521-37bc-b21f-2fd2b94aa6b9":"Yes.","2fa38f0f-446b-3cdd-ae50-514e2cca3c48":"Yes.","e1dc1faf-00d0-399e-820c-bfb0000337c7":"Yes.","5097130f-bf9a-3ef2-8544-ccaa594a4303":"Yes.","566748ea-a3dc-3363-9ac6-12b8fc6e9f9f":"Yes.","1168d2ad-84a3-3293-95c5-2235dba4a42d":"Yes.","04f1f3ff-6acc-3d31-b2b5-920cdef5a775":"Yes.","0120db82-6d43-3148-bb4f-24753ea8f179":"Yes.","a1de18ac-1fa9-3c1b-8ea0-142b6e022b94":"Yes.","3eaee6f8-cca8-32af-a9b0-2b9378ec2150":"Yes.","da0a84f7-13c5-33e3-a2a6-cb0e01b69073":"Yes.","bd9eb264-aae9-35f2-9f5b-affd0dec95ff":"Yes.","eb5b7e64-e4c0-335a-a70a-9aaafe265390":"Yes.","38f9d753-553d-350e-bcfe-3df5a7612d1c":"Yes.","a66f4746-a848-391b-936e-e6f5b2b1c207":"Yes.","4560872d-dce3-3919-bda5-7062c4bb6401":"Yes.","380de211-b543-37b6-ae3e-90f22d037b6d":"Yes.","353d54e2-c9b1-3f8c-934e-a5cd53f4bb9d":"Yes.","0f4135b3-3dd6-3eeb-89b9-92b5347bb033":"Yes.","c8c24500-965f-37be-bd85-6b6e8ec150e1":"Yes.","df7741c5-a2e7-374c-83bf-f2219504cad5":"Yes.","b2222c16-97db-3102-add1-1fdd563ce527":"Yes.","6b7eb34d-2a42-32ef-8ba0-c845021e5aa7":"Yes.","6e8f531e-1d18-342c-9243-271f1bf51490":"Yes.","8675090b-bc86-342d-974e-47ef74c001de":"Yes.","d4df2301-a5de-3b4c-bb84-d5dd64e7e92e":"Yes.","b7b60d6e-ac3a-3228-aa82-3f64851844ca":"Yes.","1e7b1f35-e24c-3b57-a342-36529e314281":"Yes.","af1a73ea-eacf-3ffc-b450-be0b0d2cb00e":"Yes.","0ff1f03d-6ed4-3c90-ad80-66c1d87022a6":"Yes.","2107de23-790a-3f37-83ab-a759f4ccdc0c":"Yes.","4d8131f0-3de1-3c2a-9d36-4fc62f271c85":"Yes.","3eac0f61-317d-31b7-a1ad-71bca3046ca8":"Yes.","aed286cb-ea87-335b-9090-c72dfacef576":"Yes.","4c8c9428-efd5-31cf-a82e-41456fa47ee0":"No.","1a35af25-de7d-3787-af9d-726eb3dc4697":"Yes.","3ac6b2f9-93d7-3ad1-931a-0f7d78e1daf0":"Yes.","62a0c493-7f13-3e3f-ac8a-09b132c1cae0":"Yes.","e3631dc5-1fca-3202-adc9-ba5d88566556":"Yes.","efefbf2c-6a21-3077-9363-04401e52dd0e":"Yes.","e9bdacbe-aead-3d18-ab64-36e276f9503e":"Yes.","fb8b2863-73df-3f50-b4bb-1482692ea045":"Yes.","ce2aee36-498c-3320-84cd-75645e2fa1eb":"Yes.","e78b2a4b-9a18-39fc-b8b2-8fc83d52564d":"Yes.","f411eda7-a06d-351d-90ca-1cfcd8685b13":"Yes."} \ No newline at end of file diff --git a/src/test/resources/warc/config-without-cache.json b/src/test/resources/warc/config-without-cache.json new file mode 100644 index 00000000..f3dfee2f --- /dev/null +++ b/src/test/resources/warc/config-without-cache.json @@ -0,0 +1,62 @@ + +{ + "cache_dir": "./src/test/resources/warc/temp/cache", + + "gold_standard_configuration": { + "path": "./src/test/resources/warc/answer.csv", + "hasHeader": "true" + }, + + "source_artifact_provider" : { + "name" : "text", + "args" : { + "artifact_type" : "requirement", + "path" : "./src/test/resources/warc/high" + } + }, + "target_artifact_provider" : { + "name" : "text", + "args" : { + "artifact_type" : "requirement", + "path" : "./src/test/resources/warc/low" + } + }, + "source_preprocessor" : { + "name" : "artifact", + "args" : {} + }, + "target_preprocessor" : { + "name" : "artifact", + "args" : {} + }, + "embedding_creator" : { + "name" : "openai", + "args" : { + "model": "text-embedding-3-large" + } + }, + "source_store" : { + "name" : "custom", + "args" : { } + }, + "target_store" : { + "name" : "custom", + "args" : { + "max_results" : "4" + } + }, + "classifier" : { + "name" : "simple_openai", + "args" : { + "model": "gpt-4o-mini-2024-07-18" + } + }, + "result_aggregator" : { + "name" : "any_connection", + "args" : {} + }, + "tracelinkid_postprocessor" : { + "name" : "identity", + "args" : {} + } +}