diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/DictionaryModel.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/DictionaryModel.java index d637fab8..1ac97fd7 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/DictionaryModel.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/DictionaryModel.java @@ -2,9 +2,9 @@ package com.iqser.red.service.redaction.v1.server.redaction.model; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.type.DictionaryEntry; +import com.iqser.red.service.redaction.v1.server.redaction.utils.SearchImplementation; import lombok.AllArgsConstructor; import lombok.Data; -import org.ahocorasick.trie.Trie; import java.io.Serializable; import java.util.HashSet; @@ -26,11 +26,10 @@ public class DictionaryModel implements Serializable { private final Set falsePositives; private final Set falseRecommendations; - private transient Trie entriesTrie; - private transient Trie falsePositivesTrie; - private transient Trie falseRecommendationsTrie; - - private transient Trie localEntriesTrie; + private transient SearchImplementation entriesSearch; + private transient SearchImplementation falsePositiveSearch; + private transient SearchImplementation falseRecommendationsSearch; + private transient SearchImplementation localSearch; private final Set localEntries = new HashSet<>(); @@ -54,62 +53,38 @@ public class DictionaryModel implements Serializable { this.falsePositives = falsePositives; this.falseRecommendations = falseRecommendations; - this.entriesTrie = buildTrie(entries); - this.falsePositivesTrie = buildTrie(falsePositives); - this.falseRecommendationsTrie = buildTrie(falseRecommendations); + this.entriesSearch = new SearchImplementation(this.entries.stream().filter(e -> !e.isDeleted()).map(DictionaryEntry::getValue).collect(Collectors.toList()), caseInsensitive); + this.falsePositiveSearch = new SearchImplementation(this.falsePositives.stream().filter(e -> !e.isDeleted()).map(DictionaryEntry::getValue).collect(Collectors.toList()), caseInsensitive); + this.falseRecommendationsSearch = new SearchImplementation(this.falseRecommendations.stream().filter(e -> !e.isDeleted()).map(DictionaryEntry::getValue).collect(Collectors.toList()), caseInsensitive); } - - public Trie getLocalEntriesTrie() { - if (localEntriesTrie == null) { - this.localEntriesTrie = buildTrieFromStrings(this.localEntries); + public SearchImplementation getLocalSearch() { + if (this.localSearch == null) { + this.localSearch = new SearchImplementation(this.localEntries, caseInsensitive); } - return localEntriesTrie; + return this.localSearch; } - - public Trie getEntriesTrie() { - if (entriesTrie == null) { - this.entriesTrie = buildTrie(this.entries); + public SearchImplementation getEntriesSearch() { + if (entriesSearch == null) { + this.entriesSearch = new SearchImplementation(this.entries.stream().filter(e -> !e.isDeleted()).map(DictionaryEntry::getValue).collect(Collectors.toList()), caseInsensitive); } - return entriesTrie; + return entriesSearch; } - public Trie getFalsePositivesTrie() { - if (falsePositivesTrie == null) { - this.falsePositivesTrie = buildTrie(this.falsePositives); + public SearchImplementation getFalsePositiveSearch() { + if (falsePositiveSearch == null) { + this.falsePositiveSearch = new SearchImplementation(this.falsePositives.stream().filter(e -> !e.isDeleted()).map(DictionaryEntry::getValue).collect(Collectors.toList()), caseInsensitive); } - return falsePositivesTrie; + return falsePositiveSearch; } - public Trie getFalseRecommendationsTrie() { - if (falsePositivesTrie == null) { - this.falsePositivesTrie = buildTrie(this.falseRecommendations); + public SearchImplementation getFalseRecommendationsSearch() { + if (falseRecommendationsSearch == null) { + this.falseRecommendationsSearch = new SearchImplementation(this.falseRecommendations.stream().filter(e -> !e.isDeleted()).map(DictionaryEntry::getValue).collect(Collectors.toList()), caseInsensitive); } - return falsePositivesTrie; - } - - private Trie buildTrieFromStrings(Set entries) { - var builder = Trie.builder() - .addKeywords(entries); - - if (this.isCaseInsensitive()) { - builder.ignoreCase(); - } - - return builder.build(); - } - - private Trie buildTrie(Set values) { - var builder = Trie.builder() - .addKeywords(values.stream().filter(e -> !e.isDeleted()).map(DictionaryEntry::getValue).collect(Collectors.toList())); - - if (this.isCaseInsensitive()) { - builder.ignoreCase(); - } - - return builder.build(); + return falseRecommendationsSearch; } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/Section.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/Section.java index becfe049..1042de35 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/Section.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/Section.java @@ -8,6 +8,7 @@ import com.iqser.red.service.redaction.v1.server.classification.model.TextBlock; import com.iqser.red.service.redaction.v1.server.redaction.utils.EntitySearchUtils; import com.iqser.red.service.redaction.v1.server.redaction.utils.FindEntityDetails; import com.iqser.red.service.redaction.v1.server.redaction.utils.Patterns; +import com.iqser.red.service.redaction.v1.server.redaction.utils.SearchImplementation; import lombok.Builder; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -63,11 +64,11 @@ public class Section { @SuppressWarnings("unused") @WhenCondition - public void addAiEntities(String type, String asType) { + public void addAiEntities(@Argument(ArgumentType.TYPE) String type, @Argument(ArgumentType.TYPE) String asType) { Set entitiesOfType = nerEntities.stream().filter(nerEntity -> nerEntity.getType().equals(type)).collect(Collectors.toSet()); List values = entitiesOfType.stream().map(Entity::getWord).collect(Collectors.toList()); - Set found = EntitySearchUtils.findEntities(searchText, values, dictionary.getType(asType), new FindEntityDetails(asType, headline, sectionNumber, false, false, Engine.NER, EntityType.RECOMMENDATION)); + Set found = EntitySearchUtils.findEntities(searchText, new SearchImplementation(values, dictionary.isCaseInsensitiveDictionary(asType)), dictionary.getType(asType), new FindEntityDetails(asType, headline, sectionNumber, false, false, Engine.NER, EntityType.RECOMMENDATION)); EntitySearchUtils.clearAndFindPositions(found, searchableText, dictionary); Set finalResult = new HashSet<>(); @@ -94,7 +95,9 @@ public class Section { @SuppressWarnings("unused") @WhenCondition - public void combineAiTypes(String startType, String combineTypes, int maxDistanceBetween, String asType, int minPartMatches, boolean allowDuplicateTypes) { + public void combineAiTypes(@Argument(ArgumentType.TYPE) String startType, @Argument(ArgumentType.TYPE) String combineTypes, + @Argument(ArgumentType.INTEGER) int maxDistanceBetween, @Argument(ArgumentType.TYPE) String asType, + @Argument(ArgumentType.INTEGER) int minPartMatches, @Argument(ArgumentType.BOOLEAN) boolean allowDuplicateTypes) { Set combineSet = Set.of(combineTypes.split(",")); @@ -276,6 +279,7 @@ public class Section { Set expanded = new HashSet<>(); for (var entity : entities) { + System.out.println(entity.getWord()); if (!entity.getType().equals(type) || entity.getTextBefore() == null) { continue; @@ -585,14 +589,14 @@ public class Section { @ThenAction @SuppressWarnings("unused") - public void ignore(String type) { + public void ignore(@Argument(ArgumentType.TYPE) String type) { entities.removeIf(entity -> entity.getType().equals(type) && entity.getEntityType().equals(EntityType.ENTITY)); } @ThenAction @SuppressWarnings("unused") - public void ignoreRecommendations(String type) { + public void ignoreRecommendations(@Argument(ArgumentType.TYPE) String type) { entities.removeIf(entity -> entity.getType().equals(type) && entity.getEntityType().equals(EntityType.RECOMMENDATION)); } @@ -708,9 +712,7 @@ public class Section { private Set findEntities(String value, String asType, boolean caseInsensitive, boolean redacted, int ruleNumber, String reason, String legalBasis, Engine engine, boolean asRecommendation) { String text = caseInsensitive ? searchText.toLowerCase() : searchText; - String searchValue = caseInsensitive ? value.toLowerCase() : value; - - Set found = EntitySearchUtils.findEntities(text, List.of(searchValue), dictionary.getType(asType), + Set found = EntitySearchUtils.findEntities(text, new SearchImplementation(value, caseInsensitive), dictionary.getType(asType), new FindEntityDetails(asType, headline, sectionNumber, false, false, engine, asRecommendation ? EntityType.RECOMMENDATION : EntityType.ENTITY)); found.forEach(entity -> { if (redacted) { diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java index 70059b16..f8a9b443 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java @@ -1,33 +1,12 @@ package com.iqser.red.service.redaction.v1.server.redaction.service; -import static com.iqser.red.service.redaction.v1.server.redaction.service.ImportedRedactionService.IMPORTED_REDACTION_TYPE; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.kie.api.runtime.KieContainer; -import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.RequestBody; - import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactions; import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.IdRemoval; import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualLegalBasisChange; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.redaction.v1.model.AnalyzeRequest; -import com.iqser.red.service.redaction.v1.model.AnalyzeResult; -import com.iqser.red.service.redaction.v1.model.Rectangle; -import com.iqser.red.service.redaction.v1.model.RedactionLog; -import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.model.SectionArea; -import com.iqser.red.service.redaction.v1.model.SectionGrid; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; +import com.iqser.red.service.redaction.v1.model.*; import com.iqser.red.service.redaction.v1.server.classification.model.Document; import com.iqser.red.service.redaction.v1.server.classification.model.SectionText; import com.iqser.red.service.redaction.v1.server.classification.model.Text; @@ -35,21 +14,25 @@ import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient; import com.iqser.red.service.redaction.v1.server.client.model.NerEntities; import com.iqser.red.service.redaction.v1.server.exception.RedactionException; import com.iqser.red.service.redaction.v1.server.redaction.model.Dictionary; -import com.iqser.red.service.redaction.v1.server.redaction.model.DictionaryIncrement; -import com.iqser.red.service.redaction.v1.server.redaction.model.DictionaryVersion; -import com.iqser.red.service.redaction.v1.server.redaction.model.Image; -import com.iqser.red.service.redaction.v1.server.redaction.model.PageEntities; -import com.iqser.red.service.redaction.v1.server.redaction.model.PdfImage; -import com.iqser.red.service.redaction.v1.server.redaction.model.RedRectangle2D; +import com.iqser.red.service.redaction.v1.server.redaction.model.*; import com.iqser.red.service.redaction.v1.server.redaction.utils.EntitySearchUtils; +import com.iqser.red.service.redaction.v1.server.redaction.utils.SearchImplementation; import com.iqser.red.service.redaction.v1.server.segmentation.ImageService; import com.iqser.red.service.redaction.v1.server.segmentation.PdfSegmentationService; import com.iqser.red.service.redaction.v1.server.settings.RedactionServiceSettings; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; - import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.kie.api.runtime.KieContainer; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static com.iqser.red.service.redaction.v1.server.redaction.service.ImportedRedactionService.IMPORTED_REDACTION_TYPE; @Slf4j @Service @@ -131,10 +114,14 @@ public class AnalyzeService { return analyze(analyzeRequest); } + var dis = System.currentTimeMillis(); DictionaryIncrement dictionaryIncrement = dictionaryService.getDictionaryIncrements(analyzeRequest.getDossierTemplateId(), new DictionaryVersion(redactionLog.getDictionaryVersion(), redactionLog.getDossierDictionaryVersion()), analyzeRequest.getDossierId()); + log.info("Dictionary Increment time time: {} ms", (System.currentTimeMillis() - dis)); + var fis = System.currentTimeMillis(); Set sectionsToReanalyse = !analyzeRequest.getSectionsToReanalyse() .isEmpty() ? analyzeRequest.getSectionsToReanalyse() : findSectionsToReanalyse(dictionaryIncrement, redactionLog, text, analyzeRequest); + log.info("Find sections time: {} ms", (System.currentTimeMillis() - fis)); if (sectionsToReanalyse.isEmpty()) { return finalizeAnalysis(analyzeRequest, startTime, redactionLog, text, dictionaryIncrement.getDictionaryVersion(), true); @@ -152,21 +139,33 @@ public class AnalyzeService { .filter(sectionText -> sectionsToReanalyse.contains(sectionText.getSectionNumber())) .collect(Collectors.toList()); + long kis = System.currentTimeMillis(); KieContainer kieContainer = droolsExecutionService.updateRules(analyzeRequest.getDossierTemplateId()); + log.info("Kie time: {} ms", (System.currentTimeMillis() - kis)); + long dds = System.currentTimeMillis(); Dictionary dictionary = dictionaryService.getDeepCopyDictionary(analyzeRequest.getDossierTemplateId(), analyzeRequest.getDossierId()); + log.info("Dict Time time: {} ms", (System.currentTimeMillis() - dds)); + long pis = System.currentTimeMillis(); PageEntities pageEntities = entityRedactionService.findEntities(dictionary, reanalysisSections, kieContainer, analyzeRequest, nerEntities); + log.info("Find Entities time: {}", (System.currentTimeMillis() - pis)); + + long crs = System.currentTimeMillis(); var newRedactionLogEntries = redactionLogCreatorService.createRedactionLog(pageEntities, text.getNumberOfPages(), analyzeRequest.getDossierTemplateId()); - + log.info("Create Redaction-log time: {} ms", (System.currentTimeMillis() - crs)); + long prs = System.currentTimeMillis(); var importedRedactionFilteredEntries = importedRedactionService.processImportedRedactions(analyzeRequest.getDossierTemplateId(), analyzeRequest.getDossierId(), analyzeRequest.getFileId(), newRedactionLogEntries, false); - + log.info("Process imports time: {} ms", (System.currentTimeMillis() - prs)); redactionLog.getRedactionLogEntry() .removeIf(entry -> sectionsToReanalyse.contains(entry.getSectionNumber()) && !entry.getType() .equals(IMPORTED_REDACTION_TYPE)); redactionLog.getRedactionLogEntry().addAll(importedRedactionFilteredEntries); - return finalizeAnalysis(analyzeRequest, startTime, redactionLog, text, dictionaryIncrement.getDictionaryVersion(), true); + var fls = System.currentTimeMillis(); + var x = finalizeAnalysis(analyzeRequest, startTime, redactionLog, text, dictionaryIncrement.getDictionaryVersion(), true); + log.info("Finalize time: {} ms", (System.currentTimeMillis() - fls)); + return x; } @@ -219,13 +218,19 @@ public class AnalyzeService { } } + long ss = System.currentTimeMillis(); + + var dictionaryIncrementsSearch = new SearchImplementation(dictionaryIncrement.getValues().stream() + .map(DictionaryIncrementValue::getValue).collect(Collectors.toList()), true); + for (SectionText sectionText : text.getSectionTexts()) { - if (EntitySearchUtils.sectionContainsAny(sectionText.getText(), dictionaryIncrement.getValues())) { + if (EntitySearchUtils.sectionContainsAny(sectionText.getText(), dictionaryIncrementsSearch)) { sectionsToReanalyse.add(sectionText.getSectionNumber()); } } + log.info("Section Find time: {}", (System.currentTimeMillis() - ss)); log.info("Should reanalyze {} sections for request: {}, took: {}", sectionsToReanalyse.size(), analyzeRequest, System.currentTimeMillis() - start); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java index 199e0a15..070b6837 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/EntityRedactionService.java @@ -218,9 +218,9 @@ public class EntityRedactionService { String lowercaseInputString = searchableString.toLowerCase(); for (DictionaryModel model : dictionary.getDictionaryModels()) { - var trie = local ? model.getLocalEntriesTrie() : model.getEntriesTrie(); + var searchImplementation = local ? model.getLocalSearch() : model.getEntriesSearch(); var entities = EntitySearchUtils.findEntities(model.isCaseInsensitive() ? lowercaseInputString : searchableString, - trie, model, new FindEntityDetails(model.getType(),headline, sectionNumber, !local, model.isDossierDictionary(), local ? Engine.RULE : Engine.DICTIONARY, local? EntityType.RECOMMENDATION: EntityType.ENTITY)); + searchImplementation, model, new FindEntityDetails(model.getType(),headline, sectionNumber, !local, model.isDossierDictionary(), local ? Engine.RULE : Engine.DICTIONARY, local? EntityType.RECOMMENDATION: EntityType.ENTITY)); EntitySearchUtils.addOrAddEngine(found, entities); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/ManualRedactionSurroundingTextService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/ManualRedactionSurroundingTextService.java index c82aaa1b..16b360d6 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/ManualRedactionSurroundingTextService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/ManualRedactionSurroundingTextService.java @@ -1,14 +1,5 @@ package com.iqser.red.service.redaction.v1.server.redaction.service; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.regex.Pattern; - -import com.iqser.red.service.redaction.v1.server.redaction.utils.FindEntityDetails; -import org.apache.commons.lang3.tuple.Pair; -import org.springframework.stereotype.Service; - import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactions; import com.iqser.red.service.persistence.service.v1.api.model.annotations.Rectangle; import com.iqser.red.service.persistence.service.v1.api.model.annotations.entitymapped.ManualRedactionEntry; @@ -23,10 +14,17 @@ import com.iqser.red.service.redaction.v1.server.redaction.model.Entity; import com.iqser.red.service.redaction.v1.server.redaction.model.EntityPositionSequence; import com.iqser.red.service.redaction.v1.server.redaction.model.EntityType; import com.iqser.red.service.redaction.v1.server.redaction.utils.EntitySearchUtils; +import com.iqser.red.service.redaction.v1.server.redaction.utils.FindEntityDetails; +import com.iqser.red.service.redaction.v1.server.redaction.utils.SearchImplementation; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; - import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; @Slf4j @Service @@ -90,10 +88,10 @@ public class ManualRedactionSurroundingTextService { } - private Pair findSurroundingText(SectionText sectionText, String value, - List toFindPositions) { + private Pair findSurroundingText(SectionText sectionText, String value, List toFindPositions) { - Set entities = EntitySearchUtils.find(sectionText.getText(), value,new FindEntityDetails( "dummy", sectionText.getHeadline(), sectionText.getSectionNumber(), false, false, Engine.DICTIONARY, EntityType.ENTITY)); + Set entities = EntitySearchUtils.find(sectionText.getText(), new SearchImplementation(value, false), + new FindEntityDetails("dummy", sectionText.getHeadline(), sectionText.getSectionNumber(), false, false, Engine.DICTIONARY, EntityType.ENTITY)); Set entitiesWithPositions = EntitySearchUtils.clearAndFindPositions(entities, sectionText.getSearchableText(), null); Entity correctEntity = getEntityOnCorrectPosition(entitiesWithPositions, toFindPositions); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogMergeService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogMergeService.java index 636d8888..1ba4c7f0 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogMergeService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/RedactionLogMergeService.java @@ -43,8 +43,6 @@ public class RedactionLogMergeService { throw new NotFoundException("RedactionLog not present"); } - log.info("Loaded redaction log with computationalVersion: {}", redactionLog.getAnalysisVersion()); - SectionGrid sectionGrid = redactionStorageService.getSectionGrid(redactionRequest.getDossierId(), redactionRequest.getFileId()); if (sectionGrid.getSections().isEmpty()) { @@ -62,7 +60,7 @@ public class RedactionLogMergeService { redactionStorageService.storeObject(redactionRequest.getDossierId(), redactionRequest.getFileId(), FileType.SECTION_GRID, sectionGrid); } - log.info("Loaded redaction log with computationalVersion: {}", redactionLog.getAnalysisVersion()); + log.debug("Loaded redaction log with computationalVersion: {}", redactionLog.getAnalysisVersion()); var merged = mergeRedactionLogData(redactionLog, sectionGrid, redactionRequest.getManualRedactions(), redactionRequest.getExcludedPages(), redactionRequest.getTypes(), redactionRequest.getColors()); merged.getRedactionLogEntry().removeIf(e -> e.isFalsePositive() && !redactionRequest.isIncludeFalsePositives()); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/EntitySearchUtils.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/EntitySearchUtils.java index c05f16cc..0fc10144 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/EntitySearchUtils.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/EntitySearchUtils.java @@ -16,34 +16,20 @@ import java.util.stream.Collectors; public class EntitySearchUtils { - public boolean sectionContainsAny(String sectionText, Set values) { - var trie = Trie.builder().ignoreCase().addKeywords(values.stream().map(DictionaryIncrementValue::getValue).collect(Collectors.toList())).build(); - return trie.containsMatch(sectionText.toLowerCase(Locale.ROOT)); + public boolean sectionContainsAny(String sectionText, SearchImplementation searchImplementation) { + return searchImplementation.atLeastOneMatches(sectionText); } - public Set findEntities(String inputString, List values, DictionaryModel type, FindEntityDetails details) { + public Set findEntities(String inputString, SearchImplementation searchImplementation, DictionaryModel type, FindEntityDetails details) { - var builder = Trie.builder() - .addKeywords(values); - - if (type.isCaseInsensitive()) { - builder.ignoreCase(); - } - - return findEntities(inputString, builder.build(), type, details); - } - - - public Set findEntities(String inputString, Trie trie, DictionaryModel type, FindEntityDetails details) { - - Set found = find(inputString, trie, details); + Set found = find(inputString, searchImplementation, details); if (details.getEntityType() == EntityType.RECOMMENDATION) { - Set falseRecommendations = find(inputString, type.getFalseRecommendationsTrie(), details.withEntityType(EntityType.FALSE_RECOMMENDATION)); + Set falseRecommendations = find(inputString, type.getFalseRecommendationsSearch(), details.withEntityType(EntityType.FALSE_RECOMMENDATION)); removeFalsePositives(found, falseRecommendations); found.addAll(falseRecommendations); } else { - Set falsePositives = find(inputString, type.getFalsePositivesTrie(), details.withEntityType(EntityType.FALSE_POSITIVE)); + Set falsePositives = find(inputString, type.getFalsePositiveSearch(), details.withEntityType(EntityType.FALSE_POSITIVE)); removeFalsePositives(found, falsePositives); found.addAll(falsePositives); } @@ -51,33 +37,10 @@ public class EntitySearchUtils { return found; } - public Set find(String inputString, String value, FindEntityDetails findEntityDetails) { - - var trie = Trie.builder() - .addKeywords(value).build(); - + public Set find(String inputString, SearchImplementation searchImplementation, FindEntityDetails findEntityDetails) { Set entities = new HashSet<>(); - trie.parseText(inputString).forEach(found -> { - var startIndex = found.getStart(); - var stopIndex = found.getEnd() + 1; - validateAndAddEntity(entities, findEntityDetails, inputString, startIndex, stopIndex); - - }); - return entities; - } - - - public Set find(String inputString, Trie trie, FindEntityDetails findEntityDetails) { - Set entities = new HashSet<>(); - - var matches = trie.parseText(inputString); - - matches.forEach(match -> { - var startIndex = match.getStart(); - var stopIndex = match.getEnd() + 1; - validateAndAddEntity(entities, findEntityDetails, inputString, startIndex, stopIndex); - }); + searchImplementation.getMatches(inputString).forEach(match -> validateAndAddEntity(entities, findEntityDetails, inputString, match.getStartIndex(), match.getEndIndex())); return entities; } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/SearchImplementation.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/SearchImplementation.java new file mode 100644 index 00000000..6de3b9c0 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/utils/SearchImplementation.java @@ -0,0 +1,92 @@ +package com.iqser.red.service.redaction.v1.server.redaction.utils; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.ahocorasick.trie.Trie; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +@Data +public class SearchImplementation { + + private boolean ignoreCase; + private List values; + + private Pattern pattern; + private Trie trie; + + public SearchImplementation(String value, boolean ignoreCase) { + this.values = List.of(value); + this.ignoreCase = ignoreCase; + this.createSearchImplementation(); + } + + public SearchImplementation(Collection values, boolean ignoreCase) { + this.values = new ArrayList<>(values); + this.ignoreCase = ignoreCase; + this.createSearchImplementation(); + } + + private void createSearchImplementation() { + if (this.values.isEmpty()) { + return; + } + + if (this.values.size() == 1) { + var text = this.values.iterator().next(); + this.pattern = Pattern.compile(Pattern.quote(ignoreCase ? text.toLowerCase(Locale.ROOT) : text)); + } else { + var builder = Trie.builder(); + if (this.ignoreCase) { + builder.ignoreCase(); + } + + builder.addKeywords(this.values); + + this.trie = builder.build(); + } + } + + public boolean atLeastOneMatches(String text) { + String textToCheck = text; + if (this.values.isEmpty()) { + return false; + } + if (this.pattern != null) { + if (ignoreCase) { + textToCheck = textToCheck.toLowerCase(Locale.ROOT); + } + return this.pattern.matcher(textToCheck).results().findAny().isPresent(); + } else { + return this.trie.containsMatch(textToCheck); + } + + } + + public List getMatches(String text) { + String textToCheck = text; + if (this.values.isEmpty()) { + return new ArrayList<>(); + } + if (this.pattern != null) { + if (ignoreCase) { + textToCheck = textToCheck.toLowerCase(Locale.ROOT); + } + return this.pattern.matcher(textToCheck).results().map(r -> new MatchPosition(r.start(), r.end())).collect(Collectors.toList()); + } else { + return this.trie.parseText(textToCheck).stream().map(r -> new MatchPosition(r.getStart(), r.getEnd() + 1)).collect(Collectors.toList()); + } + } + + @Data + @AllArgsConstructor + public static class MatchPosition { + private int startIndex; + private int endIndex; + } +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/AnalyseFileRealDataIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/AnalyseFileRealDataIntegrationTest.java index 7da19847..760c1993 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/AnalyseFileRealDataIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/AnalyseFileRealDataIntegrationTest.java @@ -5,21 +5,21 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.redaction.v1.model.AnalyzeRequest; import com.iqser.red.service.redaction.v1.model.MessageType; -import com.iqser.red.service.redaction.v1.server.classification.model.SectionText; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.junit.Ignore; import org.junit.Test; import org.springframework.core.io.ClassPathResource; -import java.io.FileOutputStream; import java.time.OffsetDateTime; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; @Slf4j public class AnalyseFileRealDataIntegrationTest extends LiveDataIntegrationTest { + + @Test @SneakyThrows public void testFile() { @@ -28,16 +28,17 @@ public class AnalyseFileRealDataIntegrationTest extends LiveDataIntegrationTest om.registerModule(new JavaTimeModule()); var file = new ClassPathResource(BASE_DIR + "data/test-file.pdf").getInputStream(); - var nerData = new ClassPathResource(BASE_DIR + "data/test-file.ner.json").getInputStream(); - var text = new ClassPathResource(BASE_DIR + "data/test-file.text.json").getInputStream(); - var sectionText = new ClassPathResource(BASE_DIR + "data/test-file.section-grid.json").getInputStream(); - var redactionLog = new ClassPathResource(BASE_DIR + "data/test-file.redaction-log.json").getInputStream(); - redactionStorageService.storeObject("dossierId", "fileId", FileType.ORIGIN, file); - redactionStorageService.storeObject("dossierId", "fileId", FileType.NER_ENTITIES, nerData); - redactionStorageService.storeObject("dossierId", "fileId", FileType.TEXT, text); - redactionStorageService.storeObject("dossierId", "fileId", FileType.SECTION_GRID, sectionText); - redactionStorageService.storeObject("dossierId", "fileId", FileType.REDACTION_LOG, redactionLog); + + + try { + var nerData = new ClassPathResource(BASE_DIR + "data/test-file.ner.json").getInputStream(); + redactionStorageService.storeObject("dossierId", "fileId", FileType.NER_ENTITIES, nerData); + } catch (Exception e) { + log.warn("No NER File Provided"); + redactionServiceSettings.setNerServiceEnabled(false); + } + AnalyzeRequest ar = AnalyzeRequest.builder() .fileId("fileId") @@ -47,49 +48,38 @@ public class AnalyseFileRealDataIntegrationTest extends LiveDataIntegrationTest .lastProcessed(OffsetDateTime.now()) .excludedPages(Set.of()) .fileAttributes(List.of()) - .messageType(MessageType.STRUCTURE_ANALYSE) .build(); - String in = om.writeValueAsString(ar); -// redactionMessageReceiver.receiveAnalyzeRequest(in, false); -// log.warn("done structure"); - var txt = redactionStorageService.getText("dossierId", "fileId"); + try { + var text = new ClassPathResource(BASE_DIR + "data/test-file.text.json").getInputStream(); + var sectionText = new ClassPathResource(BASE_DIR + "data/test-file.section-grid.json").getInputStream(); + redactionStorageService.storeObject("dossierId", "fileId", FileType.TEXT, text); + redactionStorageService.storeObject("dossierId", "fileId", FileType.SECTION_GRID, sectionText); + } catch (Exception e) { + log.info("No text file provided, Performing Structure analysis"); - var totalText = txt.getSectionTexts().stream().map(SectionText::getText).collect(Collectors.joining("\n")); - System.out.println(totalText.length()); + ar.setMessageType(MessageType.STRUCTURE_ANALYSE); + String in = om.writeValueAsString(ar); + redactionMessageReceiver.receiveAnalyzeRequest(in, false); + } + try { + var redactionLog = new ClassPathResource(BASE_DIR + "data/test-file.redaction-log.json").getInputStream(); + } catch (Exception e) { + log.info("No redaction log provided, Performing full analysis"); + + ar.setMessageType(MessageType.ANALYSE); + String in = om.writeValueAsString(ar); + redactionMessageReceiver.receiveAnalyzeRequest(in, false); + } -// ar.setMessageType(MessageType.ANALYSE); -// in = om.writeValueAsString(ar); -// redactionMessageReceiver.receiveAnalyzeRequest(in, false); -// log.warn("done analyze"); - - - simulateIncrement(List.of("study"),"PII",3L); - + simulateIncrement(List.of("type"), "PII", 3L); ar.setMessageType(MessageType.REANALYSE); - in = om.writeValueAsString(ar); + String in = om.writeValueAsString(ar); redactionMessageReceiver.receiveAnalyzeRequest(in, false); - log.warn("done analyze"); - - var log = redactionStorageService.getRedactionLog("dossierId", "fileId"); - om.writeValue(new FileOutputStream("/tmp/test-file.redaction-log.json"), log); - - System.out.println(log.getRedactionLogEntry().size()); } - -// public static long hash(char[]){ -// return ((value % prime) + prime) % prime; -// } -// public static long getBiggerPrime() { -// BigInteger prime = BigInteger.probablePrime(getNumberOfBits(10) + 1, new Random()); -// return prime.longValue(); -// } -// private static int getNumberOfBits(int number) { -// return Integer.SIZE - Integer.numberOfLeadingZeros(number); -// } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/LiveDataIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/LiveDataIntegrationTest.java index e3eba3c0..2ddc3ec3 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/LiveDataIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/LiveDataIntegrationTest.java @@ -12,6 +12,7 @@ import com.iqser.red.service.redaction.v1.server.FileSystemBackedStorageService; import com.iqser.red.service.redaction.v1.server.client.*; import com.iqser.red.service.redaction.v1.server.queue.RedactionMessageReceiver; import com.iqser.red.service.redaction.v1.server.redaction.service.DictionaryService; +import com.iqser.red.service.redaction.v1.server.settings.RedactionServiceSettings; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; @@ -81,6 +82,9 @@ public class LiveDataIntegrationTest { @Autowired protected FileSystemBackedStorageService fileSystemBackedStorageService; + @Autowired + protected RedactionServiceSettings redactionServiceSettings; + private List types; @Configuration diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/data/test-file.ner.json b/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/data/test-file.ner.json deleted file mode 100644 index 1118a0f5..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/data/test-file.ner.json +++ /dev/null @@ -1 +0,0 @@ -{"dossierId": "7b23a82e-afed-43fe-aeb9-76dea5e12b7b", "fileId": "cda93f52bf2b50c7746650de26ee589d", "targetFileExtension": "TEXT.json.gz", "responseFileExtension": "NER_ENTITIES.json.gz", "data": {"3": [{"endOffset": 349, "startOffset": 330, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 385, "startOffset": 372, "type": "STREET", "value": "W\u00f6lferstrasse"}, {"endOffset": 392, "startOffset": 386, "type": "CARDINAL", "value": "4 4414"}, {"endOffset": 404, "startOffset": 393, "type": "CITY", "value": "F\u00fcllinsdorf"}, {"endOffset": 418, "startOffset": 407, "type": "COUNTRY", "value": "Switzerland"}, {"endOffset": 491, "startOffset": 447, "type": "ORG", "value": "Jealott's Hill International Research Centre"}, {"endOffset": 501, "startOffset": 492, "type": "CITY", "value": "Bracknell"}, {"endOffset": 512, "startOffset": 503, "type": "STATE", "value": "Berkshire"}, {"endOffset": 521, "startOffset": 513, "type": "POSTAL", "value": "RG42 6EY"}, {"endOffset": 526, "startOffset": 524, "type": "COUNTRY", "value": "UK"}], "4": [{"endOffset": 4755, "startOffset": 4751, "type": "CBI_author", "value": "Ryan"}, {"endOffset": 4800, "startOffset": 4782, "type": "CBI_author", "value": "Dr. Richard Peffer"}, {"endOffset": 245, "startOffset": 230, "type": "ORG", "value": "Swiss Ordinance"}, {"endOffset": 926, "startOffset": 902, "type": "ORG", "value": "Toxstat Consultancy Ltd."}, {"endOffset": 989, "startOffset": 980, "type": "ORG", "value": "Ordinance"}, {"endOffset": 1314, "startOffset": 1301, "type": "COUNTRY", "value": "United States"}, {"endOffset": 1339, "startOffset": 1334, "type": "COUNTRY", "value": "Japan"}, {"endOffset": 1584, "startOffset": 1560, "type": "ORG", "value": "Harlan Laboratories Ltd."}, {"endOffset": 1598, "startOffset": 1585, "type": "STREET", "value": "Wolferstrasse"}, {"endOffset": 1605, "startOffset": 1599, "type": "CARDINAL", "value": "4 4414"}, {"endOffset": 1618, "startOffset": 1606, "type": "CITY", "value": "Fiillinsdorf"}, {"endOffset": 1632, "startOffset": 1621, "type": "COUNTRY", "value": "Switzerland"}, {"endOffset": 2109, "startOffset": 2085, "type": "ORG", "value": "Harlan Laboratories Ltd."}, {"endOffset": 2120, "startOffset": 2111, "type": "STREET", "value": "Zelgliweg"}, {"endOffset": 2122, "startOffset": 2121, "type": "CARDINAL", "value": "1"}, {"endOffset": 2128, "startOffset": 2124, "type": "POSTAL", "value": "4452"}, {"endOffset": 2149, "startOffset": 2138, "type": "COUNTRY", "value": "Switzerland"}, {"endOffset": 2169, "startOffset": 2150, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 2715, "startOffset": 2713, "type": "COUNTRY", "value": "QA"}, {"endOffset": 3517, "startOffset": 3483, "type": "ORG", "value": "Dr. Philipp H\u00e9rdegen Date: A4- Auy"}, {"endOffset": 3974, "startOffset": 3924, "type": "ORG", "value": "Bus ~2273 Dr. G. Heinemann Pathology: W. Henderson"}, {"endOffset": 4495, "startOffset": 4467, "type": "ORG", "value": "Jealott's Hill International"}, {"endOffset": 4521, "startOffset": 4512, "type": "CITY", "value": "Bracknell"}, {"endOffset": 4532, "startOffset": 4523, "type": "STATE", "value": "Berkshire"}, {"endOffset": 4541, "startOffset": 4533, "type": "POSTAL", "value": "RG42 6EY"}, {"endOffset": 4614, "startOffset": 4593, "type": "ORG", "value": "Milburn Syngenta Ltd."}, {"endOffset": 4633, "startOffset": 4615, "type": "ORG", "value": "Central Toxicology"}, {"endOffset": 4680, "startOffset": 4672, "type": "STATE", "value": "Cheshire"}, {"endOffset": 4689, "startOffset": 4681, "type": "POSTAL", "value": "SK10 4TJ"}, {"endOffset": 4704, "startOffset": 4690, "type": "COUNTRY", "value": "United Kingdom"}, {"endOffset": 4800, "startOffset": 4782, "type": "ORG", "value": "Dr. Richard Peffer"}, {"endOffset": 4873, "startOffset": 4860, "type": "STREET", "value": "W\u00f6lferstrasse"}, {"endOffset": 4880, "startOffset": 4874, "type": "CARDINAL", "value": "4 4414"}, {"endOffset": 4892, "startOffset": 4881, "type": "CITY", "value": "F\u00fcllinsdorf"}, {"endOffset": 4931, "startOffset": 4907, "type": "ORG", "value": "Harlan Laboratories Ltd."}, {"endOffset": 4967, "startOffset": 4958, "type": "STREET", "value": "Zelgliweg"}, {"endOffset": 4974, "startOffset": 4968, "type": "CARDINAL", "value": "1 4452"}, {"endOffset": 4982, "startOffset": 4975, "type": "CITY", "value": "Itingen"}, {"endOffset": 5016, "startOffset": 4997, "type": "ORG", "value": "Harlan Laboratories"}], "5": [{"endOffset": 194, "startOffset": 179, "type": "CBI_author", "value": "Dr. R. Gerspach"}, {"endOffset": 257, "startOffset": 239, "type": "CBI_author", "value": "Dr. C. Senn Deputy"}, {"endOffset": 359, "startOffset": 347, "type": "CBI_author", "value": "W. Henderson"}, {"endOffset": 508, "startOffset": 498, "type": "CBI_author", "value": "Pfluger G."}, {"endOffset": 521, "startOffset": 509, "type": "CBI_author", "value": "Milburn Ryan"}, {"endOffset": 566, "startOffset": 548, "type": "CBI_author", "value": "Dr. Richard Peffer"}, {"endOffset": 877, "startOffset": 865, "type": "CBI_author", "value": "W. Henderson"}, {"endOffset": 980, "startOffset": 972, "type": "CBI_author", "value": "J. Riley"}, {"endOffset": 326, "startOffset": 230, "type": "ORG", "value": "Director Dr. C. Senn Deputy Study Director D. Frei Laboratory Technical Coordinator Dr. K. Weber"}, {"endOffset": 424, "startOffset": 386, "type": "ORG", "value": "Necropsy/Histopathology M. Gisin Sperm"}, {"endOffset": 527, "startOffset": 491, "type": "ORG", "value": "Dr. D. Pfluger G. Milburn Ryan Doran"}, {"endOffset": 566, "startOffset": 548, "type": "ORG", "value": "Dr. Richard Peffer"}, {"endOffset": 844, "startOffset": 811, "type": "ORG", "value": "Analytical Chemistry Dr. K. Weber"}, {"endOffset": 1065, "startOffset": 1063, "type": "COUNTRY", "value": "QA"}, {"endOffset": 1598, "startOffset": 1571, "type": "ORG", "value": "Swiss Animal Protection Law"}], "11": [{"endOffset": 262, "startOffset": 237, "type": "ORG", "value": "Other Harlan Laboratories"}, {"endOffset": 273, "startOffset": 269, "type": "POSTAL", "value": "4452"}, {"endOffset": 281, "startOffset": 274, "type": "CITY", "value": "Itingen"}], "18": [{"endOffset": 2535, "startOffset": 2516, "type": "ORG", "value": "Harlan Laboratories"}], "20": [{"endOffset": 586, "startOffset": 556, "type": "ORG", "value": "Agricultural Production Bureau"}, {"endOffset": 642, "startOffset": 637, "type": "COUNTRY", "value": "Japan"}], "24": [{"endOffset": 731, "startOffset": 693, "type": "ORG", "value": "Dr. D. Flade (Harlan Laboratories Ltd."}, {"endOffset": 754, "startOffset": 732, "type": "ORG", "value": "Itingen / Switzerland)"}], "25": [{"endOffset": 199, "startOffset": 186, "type": "STREET", "value": "W\u00f6lferstrasse"}, {"endOffset": 206, "startOffset": 200, "type": "CARDINAL", "value": "4 4414"}, {"endOffset": 218, "startOffset": 207, "type": "CITY", "value": "F\u00fcllinsdorf"}, {"endOffset": 252, "startOffset": 233, "type": "ORG", "value": "Harlan Laboratories"}], "34": [{"endOffset": 30, "startOffset": 8, "type": "STREET", "value": "Husbandry Room number,"}, {"endOffset": 42, "startOffset": 31, "type": "CITY", "value": "F\u00fcllinsdorf"}, {"endOffset": 425, "startOffset": 406, "type": "ORG", "value": "Lignocel\u2019 Schill AG"}, {"endOffset": 431, "startOffset": 427, "type": "POSTAL", "value": "4132"}, {"endOffset": 439, "startOffset": 432, "type": "CITY", "value": "Muttenz"}, {"endOffset": 453, "startOffset": 442, "type": "COUNTRY", "value": "Switzerland"}, {"endOffset": 899, "startOffset": 883, "type": "ORG", "value": "Provimi Kliba AG"}, {"endOffset": 905, "startOffset": 901, "type": "POSTAL", "value": "4303"}, {"endOffset": 917, "startOffset": 906, "type": "CITY", "value": "Kaiseraugst"}, {"endOffset": 1389, "startOffset": 1378, "type": "CITY", "value": "F\u00fcllinsdorf"}], "36": [{"endOffset": 408, "startOffset": 374, "type": "STREET", "value": "Weaning - Treatment of F1 ends : :"}], "45": [{"endOffset": 403, "startOffset": 397, "type": "ORG", "value": "Uterus"}], "46": [{"endOffset": 21, "startOffset": 7, "type": "STREET", "value": "Histotechnique"}], "48": [{"endOffset": 121, "startOffset": 113, "type": "CBI_author", "value": "Pederson"}, {"endOffset": 132, "startOffset": 126, "type": "CBI_author", "value": "Peters"}], "107": [{"endOffset": 1509, "startOffset": 1500, "type": "ORG", "value": "Christian"}], "174": [{"endOffset": 10789, "startOffset": 10770, "type": "CBI_author", "value": "Pedersen, H. Peters"}, {"endOffset": 10937, "startOffset": 10916, "type": "CBI_author", "value": "Plowchalk, B.J. Smith"}, {"endOffset": 10952, "startOffset": 10939, "type": "CBI_author", "value": "D.R. Mattison"}, {"endOffset": 11065, "startOffset": 11046, "type": "CBI_author", "value": "Heindl, R.E. Chapin"}, {"endOffset": 11860, "startOffset": 11845, "type": "CBI_author", "value": "Tyl, C.B. Myers"}, {"endOffset": 12369, "startOffset": 12357, "type": "CBI_author", "value": "W.H. Kruskal"}, {"endOffset": 12385, "startOffset": 12374, "type": "CBI_author", "value": "W.A. Wallis"}, {"endOffset": 10892, "startOffset": 10866, "type": "ORG", "value": "J. Reprod. Fertil. 17, pp."}, {"endOffset": 11135, "startOffset": 11121, "type": "ORG", "value": "Academic Press"}, {"endOffset": 11146, "startOffset": 11137, "type": "CITY", "value": "San Diego"}, {"endOffset": 11381, "startOffset": 11366, "type": "ORG", "value": "Springer Verlag"}, {"endOffset": 11391, "startOffset": 11383, "type": "CITY", "value": "New York"}, {"endOffset": 11584, "startOffset": 11458, "type": "CITY", "value": "Oliver and Boyd, Edinburgh (1950). 7. E.S. Richmond: SYN524464- Oral (Dietary) Multigeneration Range Finding Study in the Rat."}, {"endOffset": 11978, "startOffset": 11976, "type": "CARDINAL", "value": "30"}, {"endOffset": 12399, "startOffset": 12379, "type": "COUNTRY", "value": "Wallis. Use of Ranks"}], "285": [{"endOffset": 20, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous"}], "287": [{"endOffset": 105, "startOffset": 91, "type": "CBI_author", "value": "Kruskal-Wallis"}], "289": [{"endOffset": 42, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles Regular Cycles"}], "291": [{"endOffset": 438, "startOffset": 430, "type": "CBI_author", "value": "Fisher's"}], "314": [{"endOffset": 102, "startOffset": 85, "type": "STREET", "value": "Female pup # Pups"}], "343": [{"endOffset": 75, "startOffset": 58, "type": "ORG", "value": "Cannibalized Eyes"}], "393": [{"endOffset": 844, "startOffset": 841, "type": "POSTAL", "value": "29-"}], "396": [{"endOffset": 907, "startOffset": 904, "type": "POSTAL", "value": "29-"}], "399": [{"endOffset": 785, "startOffset": 782, "type": "POSTAL", "value": "16-"}, {"endOffset": 907, "startOffset": 904, "type": "POSTAL", "value": "29-"}], "402": [{"endOffset": 908, "startOffset": 905, "type": "POSTAL", "value": "29-"}], "406": [{"endOffset": 137, "startOffset": 134, "type": "CARDINAL", "value": "325"}, {"endOffset": 872, "startOffset": 869, "type": "POSTAL", "value": "16-"}, {"endOffset": 1158, "startOffset": 1155, "type": "CARDINAL", "value": "325"}, {"endOffset": 1162, "startOffset": 1159, "type": "POSTAL", "value": "29-"}], "414": [{"endOffset": 875, "startOffset": 872, "type": "POSTAL", "value": "29-"}], "418": [{"endOffset": 875, "startOffset": 872, "type": "POSTAL", "value": "29-"}], "422": [{"endOffset": 754, "startOffset": 751, "type": "POSTAL", "value": "16-"}, {"endOffset": 815, "startOffset": 812, "type": "POSTAL", "value": "22-"}, {"endOffset": 876, "startOffset": 873, "type": "POSTAL", "value": "29-"}], "458": [{"endOffset": 105, "startOffset": 91, "type": "CBI_author", "value": "Kruskal-Wallis"}], "462": [{"endOffset": 438, "startOffset": 430, "type": "CBI_author", "value": "Fisher's"}], "485": [{"endOffset": 102, "startOffset": 85, "type": "STREET", "value": "Female pup # Pups"}], "551": [{"endOffset": 1413, "startOffset": 1412, "type": "CARDINAL", "value": "5"}, {"endOffset": 1421, "startOffset": 1414, "type": "POSTAL", "value": "CH-4333"}, {"endOffset": 1432, "startOffset": 1422, "type": "CITY", "value": "Munchwilen"}, {"endOffset": 2340, "startOffset": 2301, "type": "ORG", "value": "Syngenta Crop Protection Muenchwilen AG"}, {"endOffset": 2961, "startOffset": 2947, "type": "ORG", "value": "Muenchwilen AG"}, {"endOffset": 3082, "startOffset": 3004, "type": "ORG", "value": "Cy Vie Zeo + Authorization: Dr. J. Giovannoni Analytical Development & Product"}], "552": [{"endOffset": 270, "startOffset": 257, "type": "STREET", "value": "W\u00f6lferstrasse"}, {"endOffset": 277, "startOffset": 271, "type": "CARDINAL", "value": "4 4414"}, {"endOffset": 289, "startOffset": 278, "type": "CITY", "value": "F\u00fcllinsdorf"}, {"endOffset": 326, "startOffset": 302, "type": "ORG", "value": "Harlan Laboratories Ltd."}, {"endOffset": 352, "startOffset": 336, "type": "ORG", "value": "Syngenta Jealott"}, {"endOffset": 409, "startOffset": 390, "type": "CITY", "value": "Bracknell Berkshire"}, {"endOffset": 419, "startOffset": 411, "type": "POSTAL", "value": "RG42 6EY"}, {"endOffset": 433, "startOffset": 420, "type": "CITY", "value": "Great Britain"}, {"endOffset": 475, "startOffset": 440, "type": "ORG", "value": "Identification: Harlan Laboratories"}], "556": [{"endOffset": 99, "startOffset": 83, "type": "ORG", "value": "Syngenta Jealott"}, {"endOffset": 156, "startOffset": 137, "type": "CITY", "value": "Bracknell Berkshire"}, {"endOffset": 166, "startOffset": 158, "type": "POSTAL", "value": "RG42 6EY"}, {"endOffset": 172, "startOffset": 167, "type": "CITY", "value": "Great"}, {"endOffset": 215, "startOffset": 196, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 251, "startOffset": 238, "type": "STREET", "value": "W\u00f6lferstrasse"}, {"endOffset": 258, "startOffset": 252, "type": "CARDINAL", "value": "4 4414"}, {"endOffset": 270, "startOffset": 259, "type": "CITY", "value": "F\u00fcllinsdorf"}, {"endOffset": 282, "startOffset": 271, "type": "COUNTRY", "value": "Switzerland"}], "557": [{"endOffset": 111, "startOffset": 78, "type": "ORG", "value": "Dr. D. Flade J. Ambrosini T. Fink"}], "559": [{"endOffset": 72, "startOffset": 48, "type": "ORG", "value": "Harlan Laboratories Ltd."}, {"endOffset": 81, "startOffset": 74, "type": "CITY", "value": "Itingen"}, {"endOffset": 94, "startOffset": 83, "type": "COUNTRY", "value": "Switzerland"}], "562": [{"endOffset": 388, "startOffset": 364, "type": "ORG", "value": "Harlan Laboratories Ltd."}], "567": [{"endOffset": 120, "startOffset": 114, "type": "POSTAL", "value": "L-7200"}, {"endOffset": 147, "startOffset": 134, "type": "ORG", "value": "Merck-Hitachi"}, {"endOffset": 154, "startOffset": 148, "type": "POSTAL", "value": "L-7400"}, {"endOffset": 164, "startOffset": 155, "type": "STREET", "value": "Interface"}, {"endOffset": 179, "startOffset": 166, "type": "STREET", "value": "Merck-Hitachi"}, {"endOffset": 186, "startOffset": 180, "type": "POSTAL", "value": "D-7000"}, {"endOffset": 193, "startOffset": 187, "type": "CITY", "value": "Column"}, {"endOffset": 199, "startOffset": 195, "type": "STATE", "value": "Luna"}, {"endOffset": 572, "startOffset": 559, "type": "STREET", "value": "Merck-Hitachi"}, {"endOffset": 579, "startOffset": 573, "type": "POSTAL", "value": "L-7100"}], "568": [{"endOffset": 719, "startOffset": 704, "type": "ORG", "value": "W R V x cActual"}], "572": [{"endOffset": 34, "startOffset": 25, "type": "CARDINAL", "value": "11-Nov-08"}], "574": [{"endOffset": 34, "startOffset": 25, "type": "CARDINAL", "value": "11-Nov-08"}], "575": [{"endOffset": 65, "startOffset": 56, "type": "CARDINAL", "value": "11-Nov-08"}], "622": [{"endOffset": 1681, "startOffset": 1661, "type": "CBI_author", "value": "SCHWEIZ SCHWEIZ Date"}, {"endOffset": 2156, "startOffset": 2147, "type": "CBI_author", "value": "VDLUFA VI"}, {"endOffset": 2211, "startOffset": 2201, "type": "CBI_author", "value": "VDLUFA Vil"}, {"endOffset": 2367, "startOffset": 2357, "type": "CBI_author", "value": "VDLUFA Vil"}, {"endOffset": 6429, "startOffset": 6419, "type": "CBI_author", "value": "VDLUFA Vil"}, {"endOffset": 6569, "startOffset": 6559, "type": "CBI_author", "value": "VDLUFA VII"}, {"endOffset": 10325, "startOffset": 10305, "type": "CBI_author", "value": "SCHWEIZ SCHWEIZ Date"}, {"endOffset": 13600, "startOffset": 13590, "type": "CBI_author", "value": "VDLUFA VII"}, {"endOffset": 13656, "startOffset": 13646, "type": "CBI_author", "value": "VDLUFA VII"}, {"endOffset": 13712, "startOffset": 13702, "type": "CBI_author", "value": "VDLUFA VII"}, {"endOffset": 17692, "startOffset": 17672, "type": "CBI_author", "value": "SCHWEIZ SCHWEIZ Date"}, {"endOffset": 18157, "startOffset": 18148, "type": "CBI_author", "value": "VDLUFA VF"}, {"endOffset": 18180, "startOffset": 18167, "type": "CBI_author", "value": "HRHPLC-VDLUFA"}, {"endOffset": 1444, "startOffset": 1439, "type": "POSTAL", "value": "24107"}, {"endOffset": 1449, "startOffset": 1445, "type": "CITY", "value": "Kiel"}, {"endOffset": 1458, "startOffset": 1451, "type": "COUNTRY", "value": "Germany"}, {"endOffset": 1572, "startOffset": 1568, "type": "CITY", "value": "Kiel"}, {"endOffset": 2421, "startOffset": 2324, "type": "ORG", "value": "|\u00a764 LFGB L00.00-19 OM_ |ace. to VDLUFA Vil 2.2.2.5; HR| mg/kg 0,17 1 ICPMS Mycotoxins Aflatoxine"}, {"endOffset": 3312, "startOffset": 3296, "type": "ORG", "value": "de LUFA-ITL GmbH"}, {"endOffset": 3335, "startOffset": 3330, "type": "POSTAL", "value": "24107"}, {"endOffset": 3340, "startOffset": 3336, "type": "CITY", "value": "Kiel"}, {"endOffset": 3349, "startOffset": 3342, "type": "COUNTRY", "value": "Germany"}, {"endOffset": 3995, "startOffset": 3963, "type": "ORG", "value": "Organo-Phosphorous Pesticides GC"}, {"endOffset": 4248, "startOffset": 4220, "type": "ORG", "value": "Nitrosodiisopropylamin Lo/kg"}, {"endOffset": 4632, "startOffset": 4611, "type": "ORG", "value": "|GC-Inhousemethod Sum"}, {"endOffset": 5008, "startOffset": 4993, "type": "ORG", "value": "Dr. Wehage, Tel"}, {"endOffset": 5234, "startOffset": 5211, "type": "ORG", "value": "Goptes PROVIMI KLIBA AG"}, {"endOffset": 5315, "startOffset": 5255, "type": "ORG", "value": "Parameter Sum Nitrosamines Sum Estrogenes Externallaboratory"}, {"endOffset": 5353, "startOffset": 5316, "type": "ORG", "value": "Zentrale Analytik - Organische Henkel"}, {"endOffset": 5648, "startOffset": 5623, "type": "ORG", "value": "Laborgruppe LUFA-ITL GmbH"}, {"endOffset": 5678, "startOffset": 5666, "type": "ORG", "value": "Dr.-Hell-Str"}, {"endOffset": 5688, "startOffset": 5683, "type": "POSTAL", "value": "24107"}, {"endOffset": 5693, "startOffset": 5689, "type": "CITY", "value": "Kiel"}, {"endOffset": 5702, "startOffset": 5695, "type": "COUNTRY", "value": "Germany"}, {"endOffset": 5831, "startOffset": 5810, "type": "ORG", "value": "Kiel PROVIM! KLIBA AG"}, {"endOffset": 6550, "startOffset": 6529, "type": "ORG", "value": "|\u00a764LFGB L00.00-19 OM"}, {"endOffset": 6631, "startOffset": 6604, "type": "ORG", "value": "Lo Mycotoxins Aflatoxine Bt"}, {"endOffset": 7519, "startOffset": 7517, "type": "COUNTRY", "value": "TT"}, {"endOffset": 7546, "startOffset": 7520, "type": "ORG", "value": "LUFA-ITL GmbH Dr.-Hell-Str"}, {"endOffset": 7556, "startOffset": 7551, "type": "POSTAL", "value": "24107"}, {"endOffset": 7561, "startOffset": 7557, "type": "CITY", "value": "Kiel"}, {"endOffset": 7570, "startOffset": 7563, "type": "COUNTRY", "value": "Germany"}, {"endOffset": 7613, "startOffset": 7582, "type": "ORG", "value": "Lakorgruppe www.agrolab.de Tel."}, {"endOffset": 8337, "startOffset": 8314, "type": "ORG", "value": "Nitrosodibutylamin g/kg"}, {"endOffset": 8839, "startOffset": 8818, "type": "ORG", "value": "|GC-Inhousemethod Sum"}, {"endOffset": 9042, "startOffset": 9002, "type": "ORG", "value": "|noobject Sum Estrogenes g/kg nd, L...OM"}, {"endOffset": 9337, "startOffset": 9320, "type": "ORG", "value": "Frau Stieler, Tel"}, {"endOffset": 9659, "startOffset": 9613, "type": "ORG", "value": "Nitrosamines Sum Estrogenes Externallaboratory"}, {"endOffset": 9697, "startOffset": 9660, "type": "ORG", "value": "Zentrale Analytik - Organische Henkel"}, {"endOffset": 9717, "startOffset": 9704, "type": "STREET", "value": "Henkelstrasse"}, {"endOffset": 9722, "startOffset": 9718, "type": "CARDINAL", "value": "67 \u00a2"}, {"endOffset": 9734, "startOffset": 9731, "type": "CARDINAL", "value": "243"}, {"endOffset": 9741, "startOffset": 9736, "type": "POSTAL", "value": "40589"}, {"endOffset": 9752, "startOffset": 9742, "type": "CITY", "value": "Disseldorf"}, {"endOffset": 10046, "startOffset": 10041, "type": "ORG", "value": "bedSS"}, {"endOffset": 10125, "startOffset": 10074, "type": "ORG", "value": "Laborgruppe ww.agrolabde LUFA-ITL GmbH Dr.-Heil-Str"}, {"endOffset": 10135, "startOffset": 10130, "type": "POSTAL", "value": "24107"}, {"endOffset": 10140, "startOffset": 10136, "type": "CITY", "value": "Kiel"}, {"endOffset": 10149, "startOffset": 10142, "type": "COUNTRY", "value": "Germany"}, {"endOffset": 10255, "startOffset": 10251, "type": "CITY", "value": "Kiel"}, {"endOffset": 10847, "startOffset": 10809, "type": "ORG", "value": "Affatoxine Bf Aflatoxine Gt Aflatoxine"}, {"endOffset": 11229, "startOffset": 11224, "type": "POSTAL", "value": "24107"}, {"endOffset": 11234, "startOffset": 11230, "type": "CITY", "value": "Kiel"}, {"endOffset": 11243, "startOffset": 11236, "type": "COUNTRY", "value": "Germany"}, {"endOffset": 11447, "startOffset": 11428, "type": "ORG", "value": "Substance Mathod OM"}, {"endOffset": 11746, "startOffset": 11744, "type": "COUNTRY", "value": "GU"}, {"endOffset": 12130, "startOffset": 12115, "type": "ORG", "value": "Dr. Wehage, Tel"}, {"endOffset": 12423, "startOffset": 12377, "type": "ORG", "value": "Parameter Sum Nitrosamines External laboratory"}, {"endOffset": 12461, "startOffset": 12424, "type": "ORG", "value": "Zentrale Analytik - Organische Henkel"}, {"endOffset": 12481, "startOffset": 12468, "type": "STREET", "value": "Henkelstrasse"}, {"endOffset": 12493, "startOffset": 12482, "type": "CARDINAL", "value": "674 Gebaude"}, {"endOffset": 12497, "startOffset": 12494, "type": "CARDINAL", "value": "243"}, {"endOffset": 12504, "startOffset": 12499, "type": "POSTAL", "value": "40589"}, {"endOffset": 12515, "startOffset": 12505, "type": "CITY", "value": "Dusseldorf"}, {"endOffset": 12589, "startOffset": 12575, "type": "ORG", "value": "Sum Estrogenes"}, {"endOffset": 12845, "startOffset": 12819, "type": "ORG", "value": "LUFA-ITL GmbH Dr.-Hell-Str"}, {"endOffset": 12855, "startOffset": 12850, "type": "POSTAL", "value": "24107"}, {"endOffset": 12860, "startOffset": 12856, "type": "CITY", "value": "Kiel"}, {"endOffset": 12869, "startOffset": 12862, "type": "COUNTRY", "value": "Germany"}, {"endOffset": 12982, "startOffset": 12978, "type": "CITY", "value": "Kiel"}, {"endOffset": 13902, "startOffset": 13887, "type": "ORG", "value": "HPLC-VDLUFA Ba."}, {"endOffset": 14769, "startOffset": 14764, "type": "POSTAL", "value": "24107"}, {"endOffset": 14774, "startOffset": 14770, "type": "CITY", "value": "Kiel"}, {"endOffset": 14783, "startOffset": 14776, "type": "COUNTRY", "value": "Germany"}, {"endOffset": 15582, "startOffset": 15490, "type": "ORG", "value": "Organo-Phosphorous Pesticides GC-Multiresidueanalysis |Malathion [mg/kg 0,010, 4 [OM [ace.to"}, {"endOffset": 16132, "startOffset": 16111, "type": "ORG", "value": "|GC-Inhousemethod Sum"}, {"endOffset": 16508, "startOffset": 16493, "type": "ORG", "value": "Dr. Wehage, Tel"}, {"endOffset": 16780, "startOffset": 16756, "type": "ORG", "value": "Parameter Sum Estrogenes"}, {"endOffset": 16924, "startOffset": 16911, "type": "STREET", "value": "Henkelstrasse"}, {"endOffset": 16937, "startOffset": 16925, "type": "CARDINAL", "value": "67 4 Gebaude"}, {"endOffset": 16948, "startOffset": 16943, "type": "POSTAL", "value": "40589"}, {"endOffset": 17023, "startOffset": 16949, "type": "CITY", "value": "Diisseldorf across ly Laborgruppe ww.agrolab.de LUFA-ITL GmbH Dr.-Hell-Str"}, {"endOffset": 17033, "startOffset": 17028, "type": "POSTAL", "value": "24107"}, {"endOffset": 17038, "startOffset": 17034, "type": "CITY", "value": "Kiel"}, {"endOffset": 17047, "startOffset": 17040, "type": "COUNTRY", "value": "Germany"}, {"endOffset": 17487, "startOffset": 17482, "type": "POSTAL", "value": "24107"}, {"endOffset": 17492, "startOffset": 17488, "type": "CITY", "value": "Kiel"}, {"endOffset": 17501, "startOffset": 17494, "type": "COUNTRY", "value": "Germany"}, {"endOffset": 17607, "startOffset": 17603, "type": "ORG", "value": "Kis!"}, {"endOffset": 17985, "startOffset": 17974, "type": "ORG", "value": "Hergestellt"}, {"endOffset": 18471, "startOffset": 18449, "type": "ORG", "value": "Saneusia LUFA-ITL GmbH"}, {"endOffset": 18502, "startOffset": 18486, "type": "ORG", "value": "de Or.-Heil-Sir."}, {"endOffset": 18516, "startOffset": 18512, "type": "ORG", "value": "Kie!"}, {"endOffset": 18728, "startOffset": 18724, "type": "ORG", "value": "Boo."}, {"endOffset": 18941, "startOffset": 18903, "type": "ORG", "value": "Multiresidueanalysis Malathion Imgtg |"}, {"endOffset": 19089, "startOffset": 19072, "type": "ORG", "value": "|GC-Inhousemethod"}, {"endOffset": 19134, "startOffset": 19095, "type": "ORG", "value": "|GC-Inhousemethed OM | GC-Inhousemethod"}, {"endOffset": 19482, "startOffset": 19467, "type": "ORG", "value": "Dr. Wehage, Tel"}, {"endOffset": 19709, "startOffset": 19693, "type": "ORG", "value": "PROVIMI KLIBA AG"}, {"endOffset": 19870, "startOffset": 19857, "type": "STREET", "value": "Henkelstrasse"}, {"endOffset": 19883, "startOffset": 19876, "type": "ORG", "value": "Gebiude"}, {"endOffset": 19887, "startOffset": 19884, "type": "CARDINAL", "value": "243"}, {"endOffset": 19894, "startOffset": 19889, "type": "POSTAL", "value": "40589"}, {"endOffset": 19959, "startOffset": 19895, "type": "CITY", "value": "Dusseldorf Parameter Sum Nitrosamines LUFA-ITL GmbH Dr.-Heit Sir"}, {"endOffset": 19962, "startOffset": 19961, "type": "CARDINAL", "value": "6"}, {"endOffset": 19969, "startOffset": 19964, "type": "POSTAL", "value": "24107"}, {"endOffset": 19974, "startOffset": 19970, "type": "CITY", "value": "Kiel"}, {"endOffset": 19983, "startOffset": 19976, "type": "COUNTRY", "value": "Germany"}, {"endOffset": 20595, "startOffset": 20579, "type": "STREET", "value": "Basel-Landschaft"}, {"endOffset": 20873, "startOffset": 20862, "type": "ORG", "value": "Harlan Ltd."}, {"endOffset": 20886, "startOffset": 20875, "type": "CITY", "value": "Fullinsdorf"}, {"endOffset": 20916, "startOffset": 20913, "type": "ORG", "value": "H,0"}, {"endOffset": 20937, "startOffset": 20918, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 21111, "startOffset": 21089, "type": "ORG", "value": "Verordnung Uber Trink-"}, {"endOffset": 21138, "startOffset": 21125, "type": "CITY", "value": "Mineralwasser"}, {"endOffset": 21142, "startOffset": 21140, "type": "STATE", "value": "SR"}, {"endOffset": 21308, "startOffset": 21292, "type": "ORG", "value": "Basel-Landschaft"}, {"endOffset": 21768, "startOffset": 21757, "type": "CITY", "value": "Fullinsdorf"}, {"endOffset": 22257, "startOffset": 22246, "type": "CITY", "value": "Fillinsdorf"}, {"endOffset": 22263, "startOffset": 22259, "type": "STATE", "value": "Bldg"}, {"endOffset": 22656, "startOffset": 22623, "type": "ORG", "value": "Schweizer Lebensmittelbuch Issued"}, {"endOffset": 22840, "startOffset": 22824, "type": "STREET", "value": "Basel-Landschaft"}, {"endOffset": 23131, "startOffset": 23120, "type": "CITY", "value": "Fillinsdorf"}, {"endOffset": 23137, "startOffset": 23133, "type": "STATE", "value": "Bldg"}, {"endOffset": 23178, "startOffset": 23159, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 23348, "startOffset": 23326, "type": "ORG", "value": "Verordnung Uber Trink-"}, {"endOffset": 23375, "startOffset": 23362, "type": "CITY", "value": "Mineralwasser"}, {"endOffset": 23379, "startOffset": 23377, "type": "STATE", "value": "SR"}, {"endOffset": 23453, "startOffset": 23442, "type": "ORG", "value": "Dr. P. Wenk"}, {"endOffset": 23579, "startOffset": 23563, "type": "ORG", "value": "Basel-Landschaft"}, {"endOffset": 23897, "startOffset": 23883, "type": "ORG", "value": "Catt Magnesium"}, {"endOffset": 24007, "startOffset": 23996, "type": "CITY", "value": "Fallinsdorf"}, {"endOffset": 24238, "startOffset": 24216, "type": "ORG", "value": "Verordnung Uber Trink-"}, {"endOffset": 24265, "startOffset": 24252, "type": "CITY", "value": "Mineralwasser"}, {"endOffset": 24269, "startOffset": 24267, "type": "STATE", "value": "SR"}, {"endOffset": 24342, "startOffset": 24332, "type": "ORG", "value": "Dr. P.Wenk"}, {"endOffset": 24551, "startOffset": 24540, "type": "CITY", "value": "Fullinsdorf"}, {"endOffset": 24557, "startOffset": 24553, "type": "STATE", "value": "Bldg"}, {"endOffset": 24940, "startOffset": 24914, "type": "ORG", "value": "Schweizer Lebensmittelbuch"}, {"endOffset": 24966, "startOffset": 24955, "type": "ORG", "value": "Dr. D.Flade"}], "624": [{"endOffset": 24, "startOffset": 15, "type": "STREET", "value": "Zelgliweg"}, {"endOffset": 31, "startOffset": 25, "type": "CARDINAL", "value": "1 4452"}, {"endOffset": 39, "startOffset": 32, "type": "CITY", "value": "Itingen"}, {"endOffset": 77, "startOffset": 54, "type": "ORG", "value": "Harlan Laboratories Ltd"}, {"endOffset": 103, "startOffset": 87, "type": "ORG", "value": "Syngenta Jealott"}, {"endOffset": 160, "startOffset": 141, "type": "CITY", "value": "Bracknell Berkshire"}, {"endOffset": 170, "startOffset": 162, "type": "POSTAL", "value": "RG42 6EY"}, {"endOffset": 184, "startOffset": 171, "type": "CITY", "value": "Great Britain"}, {"endOffset": 226, "startOffset": 191, "type": "ORG", "value": "Identification: Harlan Laboratories"}], "625": [{"endOffset": 2716, "startOffset": 2530, "type": "ORG", "value": "Estrus Cycle Stage at End of Lactation................................ 13 4 DISCUSSION AND CONCLUSION ................................................................................. 14"}], "626": [{"endOffset": 533, "startOffset": 63, "type": "ORG", "value": "Organ/Group/Sex: K0 ................................................ 64 Summary Incidence of Gradings by Organ/Group/Sex: K2 ................................................ 65 Number of Animals with Microscopic Findings by Organ/Group/Sex: K0 ....................... 66 Number of Animals with Microscopic Findings by Organ/Group/Sex: K1 ....................... 69 Number of Animals with Microscopic Findings by Organ/Group/Sex: K2 ....................... 70 Correlation"}], "628": [{"endOffset": 186, "startOffset": 170, "type": "ORG", "value": "Syngenta Jealott"}, {"endOffset": 243, "startOffset": 224, "type": "STREET", "value": "Bracknell Berkshire"}, {"endOffset": 252, "startOffset": 244, "type": "POSTAL", "value": "RG42 6EY"}, {"endOffset": 258, "startOffset": 253, "type": "CITY", "value": "Great"}, {"endOffset": 305, "startOffset": 282, "type": "ORG", "value": "Harlan Laboratories Ltd"}, {"endOffset": 315, "startOffset": 306, "type": "STREET", "value": "Zelgliweg"}, {"endOffset": 322, "startOffset": 316, "type": "CARDINAL", "value": "1 4452"}, {"endOffset": 330, "startOffset": 323, "type": "CITY", "value": "Itingen"}], "629": [{"endOffset": 103, "startOffset": 91, "type": "CBI_author", "value": "W. Henderson"}, {"endOffset": 186, "startOffset": 178, "type": "CBI_author", "value": "J. Riley"}], "633": [{"endOffset": 128, "startOffset": 105, "type": "ORG", "value": "Harlan Laboratories Ltd"}, {"endOffset": 137, "startOffset": 130, "type": "CITY", "value": "Itingen"}, {"endOffset": 151, "startOffset": 140, "type": "COUNTRY", "value": "Switzerland"}, {"endOffset": 560, "startOffset": 554, "type": "ORG", "value": "Uterus"}, {"endOffset": 2299, "startOffset": 2275, "type": "ORG", "value": "Toxstat Consultancy Ltd."}], "635": [{"endOffset": 347, "startOffset": 338, "type": "CBI_author", "value": "Dr. Georg"}, {"endOffset": 73, "startOffset": 57, "type": "ORG", "value": "Dr. Jayne Wright"}, {"endOffset": 94, "startOffset": 85, "type": "STATE", "value": "Berkshire"}, {"endOffset": 381, "startOffset": 338, "type": "ORG", "value": "Dr. Georg Krinke (AnaPath GmbH, Switzerland"}], "652": [{"endOffset": 11, "startOffset": 6, "type": "ORG", "value": "Sperm"}], "677": [{"endOffset": 70, "startOffset": 17, "type": "ORG", "value": "Estrus Cycle Stage at End of Lactation Micropathology"}], "1279": [{"endOffset": 13, "startOffset": 8, "type": "CARDINAL", "value": "109 X"}], "1374": [{"endOffset": 28457, "startOffset": 28442, "type": "CBI_author", "value": "YELLOWISH, FIRM"}, {"endOffset": 414393, "startOffset": 414384, "type": "CBI_author", "value": "D=12X5 MM"}, {"endOffset": 4257, "startOffset": 4237, "type": "ORG", "value": "Lactational Diestrus"}, {"endOffset": 5491, "startOffset": 5472, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 6804, "startOffset": 6785, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 12984, "startOffset": 12965, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 16453, "startOffset": 16434, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 18729, "startOffset": 18710, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 19744, "startOffset": 19725, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 21461, "startOffset": 21442, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 21588, "startOffset": 21586, "type": "COUNTRY", "value": "MM"}, {"endOffset": 22952, "startOffset": 22933, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 24082, "startOffset": 24063, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 24435, "startOffset": 24433, "type": "COUNTRY", "value": "MM"}, {"endOffset": 27988, "startOffset": 27969, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 29081, "startOffset": 29062, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 31300, "startOffset": 31298, "type": "COUNTRY", "value": "MM"}, {"endOffset": 31492, "startOffset": 31490, "type": "COUNTRY", "value": "MM"}, {"endOffset": 32299, "startOffset": 32276, "type": "ORG", "value": "397 Harlan Laboratories"}, {"endOffset": 33245, "startOffset": 33226, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 33430, "startOffset": 33424, "type": "CITY", "value": "D=12X5"}, {"endOffset": 34565, "startOffset": 34546, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 37650, "startOffset": 37631, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 39750, "startOffset": 39748, "type": "COUNTRY", "value": "MM"}, {"endOffset": 40782, "startOffset": 40763, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 41092, "startOffset": 41073, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 44929, "startOffset": 44910, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 47374, "startOffset": 47355, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 49860, "startOffset": 49841, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 50788, "startOffset": 50766, "type": "ORG", "value": "' ' ' ' ' ( +G ' ' ' '"}, {"endOffset": 52490, "startOffset": 52471, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 53345, "startOffset": 53326, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 56041, "startOffset": 56022, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 58074, "startOffset": 58055, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 59000, "startOffset": 58978, "type": "ORG", "value": "' ' ' ' ' ' ' ' ( +G '"}, {"endOffset": 60703, "startOffset": 60684, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 61616, "startOffset": 61601, "type": "ORG", "value": "' ' ' ' ' ' ' '"}, {"endOffset": 61827, "startOffset": 61799, "type": "ORG", "value": "BLADDER ' ' ' +G ' ' ' ' ' '"}, {"endOffset": 63149, "startOffset": 63130, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 64204, "startOffset": 64185, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 66487, "startOffset": 66468, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 68773, "startOffset": 68754, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 69935, "startOffset": 69916, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 70893, "startOffset": 70871, "type": "ORG", "value": "' ' ' ' ' ' ( +G ' ' '"}, {"endOffset": 71207, "startOffset": 71188, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 72615, "startOffset": 72596, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 73589, "startOffset": 73567, "type": "ORG", "value": "' ' ' ' ' ' ' ( +G ' '"}, {"endOffset": 74192, "startOffset": 74173, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 75325, "startOffset": 75306, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 76199, "startOffset": 76180, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 78072, "startOffset": 78053, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 79336, "startOffset": 79317, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 80284, "startOffset": 80233, "type": "ORG", "value": "' ' ' ' ' + + + + + \u2014 Proestrus . . P. . . \u2014 Estrus"}, {"endOffset": 80608, "startOffset": 80589, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 81493, "startOffset": 81473, "type": "ORG", "value": "' ' ' ' ' ' +G ' ' '"}, {"endOffset": 81930, "startOffset": 81911, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 83313, "startOffset": 83294, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 84469, "startOffset": 84450, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 85759, "startOffset": 85740, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 86761, "startOffset": 86739, "type": "ORG", "value": "' ' ' ' ' ' ' ( +G ' '"}, {"endOffset": 87048, "startOffset": 87029, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 88215, "startOffset": 88196, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 89749, "startOffset": 89730, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 90616, "startOffset": 90597, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 91795, "startOffset": 91776, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 92849, "startOffset": 92830, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 93930, "startOffset": 93876, "type": "ORG", "value": "' ' ' ' ' + + + + + \u2014 Lactational diestrus . . . P. P."}, {"endOffset": 95393, "startOffset": 95374, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 97414, "startOffset": 97386, "type": "ORG", "value": "BLADDER ' ' ' ' ' +G ' ' ' '"}, {"endOffset": 97538, "startOffset": 97519, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 99892, "startOffset": 99873, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 102336, "startOffset": 102317, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 103314, "startOffset": 103286, "type": "ORG", "value": "BLADDER ' ' ' +G ' ' ' ' ' '"}, {"endOffset": 104841, "startOffset": 104822, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 109804, "startOffset": 109785, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 112103, "startOffset": 112084, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 114454, "startOffset": 114435, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 115436, "startOffset": 115414, "type": "ORG", "value": "' ' ' ' ' ' ( +G ' ' '"}, {"endOffset": 116985, "startOffset": 116966, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 119665, "startOffset": 119646, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 125442, "startOffset": 125423, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 128064, "startOffset": 128045, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 135458, "startOffset": 135439, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 136887, "startOffset": 136841, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 138474, "startOffset": 138428, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 141541, "startOffset": 141495, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 144447, "startOffset": 144401, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 146004, "startOffset": 145957, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 147535, "startOffset": 147516, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 149023, "startOffset": 148977, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 151916, "startOffset": 151869, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 153442, "startOffset": 153396, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 157792, "startOffset": 157745, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 159401, "startOffset": 159354, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 162344, "startOffset": 162297, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 163950, "startOffset": 163904, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 165411, "startOffset": 165392, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 166870, "startOffset": 166824, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 169761, "startOffset": 169715, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 172710, "startOffset": 172664, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 175984, "startOffset": 175938, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 178999, "startOffset": 178953, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 182089, "startOffset": 182043, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 183661, "startOffset": 183615, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 185275, "startOffset": 185229, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 189714, "startOffset": 189668, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 196763, "startOffset": 196717, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 199664, "startOffset": 199618, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 202499, "startOffset": 202453, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 205314, "startOffset": 205268, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 206181, "startOffset": 206175, "type": "ORG", "value": "Estrus"}, {"endOffset": 206774, "startOffset": 206728, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 209798, "startOffset": 209752, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 211218, "startOffset": 211199, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 212779, "startOffset": 212733, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 214225, "startOffset": 214179, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 217038, "startOffset": 216992, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 218621, "startOffset": 218575, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 221318, "startOffset": 221272, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 225440, "startOffset": 225394, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 228245, "startOffset": 228199, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 231071, "startOffset": 231025, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 232491, "startOffset": 232445, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 233921, "startOffset": 233902, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 235355, "startOffset": 235309, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 236829, "startOffset": 236783, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 239522, "startOffset": 239476, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 240719, "startOffset": 240700, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 245942, "startOffset": 245923, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 248594, "startOffset": 248575, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 260643, "startOffset": 260624, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 263442, "startOffset": 263423, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 264876, "startOffset": 264830, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 266177, "startOffset": 266158, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 267607, "startOffset": 267588, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 269125, "startOffset": 269078, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 271968, "startOffset": 271922, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 273235, "startOffset": 273216, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 274618, "startOffset": 274599, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 279062, "startOffset": 279016, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 280628, "startOffset": 280609, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 282017, "startOffset": 281998, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 286314, "startOffset": 286295, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 287774, "startOffset": 287755, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 292775, "startOffset": 292773, "type": "COUNTRY", "value": "MM"}, {"endOffset": 298202, "startOffset": 298156, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 303381, "startOffset": 303362, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 307278, "startOffset": 307232, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 309793, "startOffset": 309774, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 312442, "startOffset": 312423, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 313739, "startOffset": 313720, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 330570, "startOffset": 330551, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 333469, "startOffset": 333450, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 342069, "startOffset": 342050, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 344948, "startOffset": 344929, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 347739, "startOffset": 347693, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 350440, "startOffset": 350421, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 356213, "startOffset": 356167, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 357685, "startOffset": 357639, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 364095, "startOffset": 364076, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 367942, "startOffset": 367923, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 370457, "startOffset": 370438, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 374748, "startOffset": 374746, "type": "COUNTRY", "value": "MM"}, {"endOffset": 400879, "startOffset": 400860, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 414393, "startOffset": 414384, "type": "ORG", "value": "D=12X5 MM"}, {"endOffset": 415308, "startOffset": 415261, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 418193, "startOffset": 418146, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 419741, "startOffset": 419694, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 422760, "startOffset": 422713, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 425966, "startOffset": 425919, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 427569, "startOffset": 427522, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 429197, "startOffset": 429150, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 432051, "startOffset": 432004, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO."}, {"endOffset": 436405, "startOffset": 436359, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 441000, "startOffset": 440954, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 444094, "startOffset": 444048, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 445654, "startOffset": 445608, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 454788, "startOffset": 454742, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 456352, "startOffset": 456306, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 459195, "startOffset": 459149, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 460712, "startOffset": 460666, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 463161, "startOffset": 463142, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 464562, "startOffset": 464516, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 466118, "startOffset": 466072, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 467620, "startOffset": 467574, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 473242, "startOffset": 473196, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 481615, "startOffset": 481569, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 484556, "startOffset": 484510, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 490293, "startOffset": 490247, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 491827, "startOffset": 491781, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 499206, "startOffset": 499160, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 503657, "startOffset": 503611, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 506613, "startOffset": 506567, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 509743, "startOffset": 509697, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 512686, "startOffset": 512640, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 515681, "startOffset": 515635, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 517159, "startOffset": 517113, "type": "ORG", "value": "Harlan Laboratories C18904 CONT./FF. ANIMAL NO"}, {"endOffset": 519649, "startOffset": 519638, "type": "CITY", "value": "F\u00fcllinsdorf"}, {"endOffset": 519662, "startOffset": 519651, "type": "COUNTRY", "value": "Switzerland"}, {"endOffset": 519810, "startOffset": 519803, "type": "ORG", "value": "Itingen"}, {"endOffset": 519823, "startOffset": 519812, "type": "STATE", "value": "Switzlerand"}, {"endOffset": 519959, "startOffset": 519939, "type": "ORG", "value": "Corpora Lutea Counts"}], "1456": [{"endOffset": 1707, "startOffset": 1436, "type": "ORG", "value": "Swiss GLP Monitoring Authorities | Schweizerische Eidgenossenschaft Federal Department af Home Affairs DHA yj Conf\u00e9d\u00e9ration suisse Federal Office of Public Health FOPH Confederazione Svizzera . Confederaziun svizra Federal Department of the Environment, Transport, Energy"}, {"endOffset": 1805, "startOffset": 1750, "type": "ORG", "value": "Therapeutie Praduets Swiss Confederation Federal Office"}, {"endOffset": 1962, "startOffset": 1960, "type": "COUNTRY", "value": "SR"}, {"endOffset": 3052, "startOffset": 3032, "type": "ORG", "value": "Therapeutic Products"}, {"endOffset": 3188, "startOffset": 3164, "type": "ORG", "value": "Harlan Laboratories Ltd."}, {"endOffset": 3198, "startOffset": 3189, "type": "STREET", "value": "Zelgliweg"}, {"endOffset": 3205, "startOffset": 3199, "type": "CARDINAL", "value": "1 4452"}, {"endOffset": 3213, "startOffset": 3206, "type": "CITY", "value": "Itingen"}, {"endOffset": 3226, "startOffset": 3215, "type": "COUNTRY", "value": "Switzerland"}, {"endOffset": 3674, "startOffset": 3628, "type": "ORG", "value": "Swiss Federal Office of Public Health Consumer"}, {"endOffset": 3742, "startOffset": 3735, "type": "POSTAL", "value": "CH-3003"}, {"endOffset": 3805, "startOffset": 3781, "type": "ORG", "value": "The Head, Dr. Dag Kappes"}, {"endOffset": 4012, "startOffset": 3953, "type": "ORG", "value": "Swissmedic. Swiss Federal Office of Pubiic Health, Consumer"}, {"endOffset": 4082, "startOffset": 4075, "type": "POSTAL", "value": "CH-3003"}], "1458": [{"endOffset": 24, "startOffset": 15, "type": "STREET", "value": "Zelgliweg"}, {"endOffset": 31, "startOffset": 25, "type": "CARDINAL", "value": "1 4452"}, {"endOffset": 39, "startOffset": 32, "type": "CITY", "value": "Itingen"}, {"endOffset": 77, "startOffset": 54, "type": "ORG", "value": "Harlan Laboratories Ltd"}, {"endOffset": 103, "startOffset": 87, "type": "ORG", "value": "Syngenta Jealott"}, {"endOffset": 160, "startOffset": 141, "type": "CITY", "value": "Bracknell Berkshire"}, {"endOffset": 170, "startOffset": 162, "type": "POSTAL", "value": "RG42 6EY"}, {"endOffset": 184, "startOffset": 171, "type": "CITY", "value": "Great Britain"}, {"endOffset": 226, "startOffset": 191, "type": "ORG", "value": "Identification: Harlan Laboratories"}], "1463": [{"endOffset": 51, "startOffset": 39, "type": "CBI_author", "value": "W. Henderson"}, {"endOffset": 115, "startOffset": 107, "type": "CBI_author", "value": "J. Riley"}], "1466": [{"endOffset": 276, "startOffset": 96, "type": "ORG", "value": "Organ/Group/Sex: K0 ................................................ 35 Summary Incidence of Gradings by Organ/Group/Sex: K0 ................................................ 36 [\u2026]"}], "1467": [{"endOffset": 244, "startOffset": 57, "type": "ORG", "value": "Organ/Group/Sex: K0 ................................................ 64 Summary Incidence of Gradings by Organ/Group/Sex: K2 ................................................ 65 [\u2026] Report"}], "1471": [{"endOffset": 1238, "startOffset": 1214, "type": "ORG", "value": "Toxstat Consultancy Ltd."}], "2417": [{"endOffset": 13, "startOffset": 8, "type": "CARDINAL", "value": "109 X"}], "2504": [{"endOffset": 539, "startOffset": 519, "type": "ORG", "value": "Lactational Diestrus"}], "2506": [{"endOffset": 200, "startOffset": 185, "type": "ORG", "value": "Swiss Ordinance"}, {"endOffset": 882, "startOffset": 859, "type": "ORG", "value": "Toxstat Consultancy Ltd"}, {"endOffset": 947, "startOffset": 938, "type": "ORG", "value": "Ordinance"}, {"endOffset": 1273, "startOffset": 1260, "type": "COUNTRY", "value": "United States"}, {"endOffset": 1298, "startOffset": 1293, "type": "COUNTRY", "value": "Japan"}, {"endOffset": 1454, "startOffset": 1427, "type": "ORG", "value": "Reproduction Toxicology Dr."}, {"endOffset": 1538, "startOffset": 1514, "type": "ORG", "value": "Harlan Laboratories Ltd."}, {"endOffset": 1552, "startOffset": 1539, "type": "STREET", "value": "Wolferstrasse"}, {"endOffset": 1559, "startOffset": 1553, "type": "CARDINAL", "value": "4 4414"}, {"endOffset": 1571, "startOffset": 1560, "type": "CITY", "value": "Fillinsdorf"}, {"endOffset": 1585, "startOffset": 1574, "type": "COUNTRY", "value": "Switzerland"}, {"endOffset": 1939, "startOffset": 1915, "type": "ORG", "value": "Harlan Laboratories Ltd."}, {"endOffset": 1950, "startOffset": 1941, "type": "STREET", "value": "Zelgliweg"}, {"endOffset": 1952, "startOffset": 1951, "type": "CARDINAL", "value": "1"}, {"endOffset": 1958, "startOffset": 1954, "type": "POSTAL", "value": "4452"}, {"endOffset": 1966, "startOffset": 1959, "type": "CITY", "value": "Itingen"}, {"endOffset": 1999, "startOffset": 1980, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 2239, "startOffset": 2132, "type": "ORG", "value": "Dr. Sonia Whitlow Study title: Toxicity Study in the Han Wistar Rat SYN524464 - Two-Generation Reproduction"}, {"endOffset": 2611, "startOffset": 2587, "type": "ORG", "value": "Inspection Test Facility"}, {"endOffset": 2818, "startOffset": 2798, "type": "ORG", "value": "Dr. Philipp H\u00e9rdegen"}], "2510": [{"endOffset": 120, "startOffset": 101, "type": "ORG", "value": "Regulatory Agencies"}], "2515": [{"endOffset": 123, "startOffset": 108, "type": "ORG", "value": "Swiss Ordinance"}], "2516": [{"endOffset": 118, "startOffset": 103, "type": "ORG", "value": "Swiss Ordinance"}, {"endOffset": 802, "startOffset": 778, "type": "ORG", "value": "Toxstat Consultancy Ltd."}], "2517": [{"endOffset": 21, "startOffset": 19, "type": "COUNTRY", "value": "QA"}], "2518": [{"endOffset": 124, "startOffset": 108, "type": "CBI_author", "value": "Bratoljic-Melkay"}], "2519": [{"endOffset": 21, "startOffset": 19, "type": "COUNTRY", "value": "QA"}], "2521": [{"endOffset": 107, "startOffset": 82, "type": "ORG", "value": "Weber Dr. D. Flade Dr. K."}], "2523": [{"endOffset": 86, "startOffset": 65, "type": "ORG", "value": "Milburn Syngenta Ltd."}, {"endOffset": 105, "startOffset": 87, "type": "ORG", "value": "Central Toxicology"}, {"endOffset": 152, "startOffset": 144, "type": "STATE", "value": "Cheshire"}, {"endOffset": 161, "startOffset": 153, "type": "POSTAL", "value": "SK10 4TJ"}, {"endOffset": 176, "startOffset": 162, "type": "COUNTRY", "value": "United Kingdom"}], "2524": [{"endOffset": 222, "startOffset": 218, "type": "CBI_author", "value": "Ryan"}, {"endOffset": 267, "startOffset": 249, "type": "CBI_author", "value": "Dr. Richard Peffer"}, {"endOffset": 81, "startOffset": 60, "type": "ORG", "value": "Milburn Syngenta Ltd."}, {"endOffset": 100, "startOffset": 82, "type": "ORG", "value": "Central Toxicology"}, {"endOffset": 147, "startOffset": 139, "type": "STATE", "value": "Cheshire"}, {"endOffset": 156, "startOffset": 148, "type": "POSTAL", "value": "SK10 4TJ"}, {"endOffset": 171, "startOffset": 157, "type": "COUNTRY", "value": "United Kingdom"}, {"endOffset": 267, "startOffset": 249, "type": "ORG", "value": "Dr. Richard Peffer"}], "2525": [{"endOffset": 116, "startOffset": 101, "type": "CBI_author", "value": "G. Milburn Ryan"}], "2526": [{"endOffset": 111, "startOffset": 96, "type": "CBI_author", "value": "G. Milburn Ryan"}, {"endOffset": 156, "startOffset": 138, "type": "CBI_author", "value": "Dr. Richard Peffer"}, {"endOffset": 156, "startOffset": 138, "type": "ORG", "value": "Dr. Richard Peffer"}], "2527": [{"endOffset": 206, "startOffset": 169, "type": "ORG", "value": "Analytical Chemistry Dr. G. Heinemann"}, {"endOffset": 328, "startOffset": 242, "type": "ORG", "value": "Analytical Chemistry Dr. K. Weber Study Part: Pathology Quality Assurance T. Fink Head"}, {"endOffset": 334, "startOffset": 332, "type": "COUNTRY", "value": "QA"}], "2528": [{"endOffset": 278, "startOffset": 266, "type": "CBI_author", "value": "W. Henderson"}, {"endOffset": 381, "startOffset": 373, "type": "CBI_author", "value": "J. Riley"}, {"endOffset": 245, "startOffset": 212, "type": "ORG", "value": "Analytical Chemistry Dr. K. Weber"}, {"endOffset": 466, "startOffset": 464, "type": "COUNTRY", "value": "QA"}], "2535": [{"endOffset": 128, "startOffset": 109, "type": "ORG", "value": "Harlan Laboratories"}], "2539": [{"endOffset": 121, "startOffset": 113, "type": "CBI_author", "value": "Pederson"}, {"endOffset": 132, "startOffset": 126, "type": "CBI_author", "value": "Peters"}], "2541": [{"endOffset": 495, "startOffset": 486, "type": "ORG", "value": "Christian"}], "2542": [{"endOffset": 888, "startOffset": 879, "type": "ORG", "value": "Christian"}], "2549": [{"endOffset": 785, "startOffset": 770, "type": "CBI_author", "value": "Tyl, C.B. Myers"}, {"endOffset": 1292, "startOffset": 1280, "type": "CBI_author", "value": "W.H. Kruskal"}, {"endOffset": 1308, "startOffset": 1297, "type": "CBI_author", "value": "W.A. Wallis"}, {"endOffset": 1564, "startOffset": 1545, "type": "CBI_author", "value": "Pedersen, H. Peters"}, {"endOffset": 1712, "startOffset": 1691, "type": "CBI_author", "value": "Plowchalk, B.J. Smith"}, {"endOffset": 1727, "startOffset": 1714, "type": "CBI_author", "value": "D.R. Mattison"}, {"endOffset": 1840, "startOffset": 1821, "type": "CBI_author", "value": "Heindl, R.E. Chapin"}, {"endOffset": 2635, "startOffset": 2620, "type": "CBI_author", "value": "Tyl, C.B. Myers"}, {"endOffset": 3145, "startOffset": 3133, "type": "CBI_author", "value": "W.H. Kruskal"}, {"endOffset": 3161, "startOffset": 3150, "type": "CBI_author", "value": "W.A. Wallis"}, {"endOffset": 306, "startOffset": 291, "type": "ORG", "value": "Springer Verlag"}, {"endOffset": 316, "startOffset": 308, "type": "CITY", "value": "New York"}, {"endOffset": 509, "startOffset": 383, "type": "CITY", "value": "Oliver and Boyd, Edinburgh (1950). 5. E.S. Richmond: SYN524464- Oral (Dietary) Multigeneration Range Finding Study in the Rat."}, {"endOffset": 903, "startOffset": 901, "type": "CARDINAL", "value": "30"}, {"endOffset": 1322, "startOffset": 1302, "type": "COUNTRY", "value": "Wallis. Use of Ranks"}, {"endOffset": 1667, "startOffset": 1641, "type": "ORG", "value": "J. Reprod. Fertil. 17, pp."}, {"endOffset": 1910, "startOffset": 1896, "type": "ORG", "value": "Academic Press"}, {"endOffset": 1921, "startOffset": 1912, "type": "CITY", "value": "San Diego"}, {"endOffset": 2156, "startOffset": 2141, "type": "ORG", "value": "Springer Verlag"}, {"endOffset": 2166, "startOffset": 2158, "type": "CITY", "value": "New York"}, {"endOffset": 2359, "startOffset": 2233, "type": "CITY", "value": "Oliver and Boyd, Edinburgh (1950). 7. E.S. Richmond: SYN524464- Oral (Dietary) Multigeneration Range Finding Study in the Rat."}, {"endOffset": 2753, "startOffset": 2751, "type": "CARDINAL", "value": "30"}, {"endOffset": 3175, "startOffset": 3155, "type": "COUNTRY", "value": "Wallis. Use of Ranks"}], "2562": [{"endOffset": 13, "startOffset": 8, "type": "CARDINAL", "value": "109 X"}], "2663": [{"endOffset": 532, "startOffset": 512, "type": "ORG", "value": "Lactational Diestrus"}], "2707": [{"endOffset": 2, "startOffset": 0, "type": "COUNTRY", "value": "SD"}], "2711": [{"endOffset": 3181, "startOffset": 3174, "type": "CBI_author", "value": "Welsh Z"}, {"endOffset": 698, "startOffset": 674, "type": "ORG", "value": "Toxstat Consultancy Ltd."}, {"endOffset": 718, "startOffset": 699, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 929, "startOffset": 905, "type": "ORG", "value": "Harlan Laboratories Ltd."}, {"endOffset": 942, "startOffset": 931, "type": "CITY", "value": "Fullinsdorf"}, {"endOffset": 955, "startOffset": 944, "type": "COUNTRY", "value": "Switzerland"}, {"endOffset": 1232, "startOffset": 1208, "type": "ORG", "value": "Toxstat Consultancy Ltd."}, {"endOffset": 1246, "startOffset": 1234, "type": "CITY", "value": "Macclesfield"}, {"endOffset": 1250, "startOffset": 1248, "type": "COUNTRY", "value": "UK"}, {"endOffset": 1478, "startOffset": 1454, "type": "ORG", "value": "Toxstat Consultancy Ltd."}, {"endOffset": 3044, "startOffset": 3025, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 3115, "startOffset": 3082, "type": "ORG", "value": "References SAS Institute Inc. SAS"}, {"endOffset": 3143, "startOffset": 3139, "type": "CITY", "value": "Cary"}, {"endOffset": 3166, "startOffset": 3149, "type": "ORG", "value": "SAS Institute Inc"}], "2713": [{"endOffset": 145, "startOffset": 117, "type": "ORG", "value": "Dr. Sonia Whitlow Management"}, {"endOffset": 234, "startOffset": 210, "type": "ORG", "value": "Harlan Laboratories Ltd."}, {"endOffset": 245, "startOffset": 236, "type": "STREET", "value": "Zelgliweg"}, {"endOffset": 247, "startOffset": 246, "type": "CARDINAL", "value": "1"}, {"endOffset": 253, "startOffset": 249, "type": "POSTAL", "value": "4452"}, {"endOffset": 261, "startOffset": 254, "type": "CITY", "value": "Itingen"}, {"endOffset": 294, "startOffset": 275, "type": "ORG", "value": "Harlan Laboratories"}, {"endOffset": 486, "startOffset": 379, "type": "ORG", "value": "Dr. Sonia Whitlow Study title: Toxicity Study in the Han Wistar Rat SYN524464 - Two-Generation Reproduction"}, {"endOffset": 999, "startOffset": 997, "type": "CARDINAL", "value": "2A"}], "2714": [{"endOffset": 102, "startOffset": 83, "type": "ORG", "value": "Regulatory Agencies"}], "2719": [{"endOffset": 85, "startOffset": 64, "type": "ORG", "value": "Milburn Syngenta Ltd."}, {"endOffset": 104, "startOffset": 86, "type": "ORG", "value": "Central Toxicology"}, {"endOffset": 151, "startOffset": 143, "type": "STATE", "value": "Cheshire"}, {"endOffset": 160, "startOffset": 152, "type": "POSTAL", "value": "SK10 4TJ"}, {"endOffset": 175, "startOffset": 161, "type": "COUNTRY", "value": "United Kingdom"}], "2720": [{"endOffset": 81, "startOffset": 60, "type": "ORG", "value": "Milburn Syngenta Ltd."}, {"endOffset": 100, "startOffset": 82, "type": "ORG", "value": "Central Toxicology"}, {"endOffset": 147, "startOffset": 139, "type": "STATE", "value": "Cheshire"}, {"endOffset": 156, "startOffset": 148, "type": "POSTAL", "value": "SK10 4TJ"}, {"endOffset": 171, "startOffset": 157, "type": "COUNTRY", "value": "United Kingdom"}], "2724": [{"endOffset": 111, "startOffset": 96, "type": "CBI_author", "value": "G. Milburn Ryan"}], "2727": [{"endOffset": 108, "startOffset": 71, "type": "ORG", "value": "Analytical Chemistry Dr. G. Heinemann"}], "2738": [{"endOffset": 24, "startOffset": 0, "type": "ORG", "value": "Harlan Laboratories Ltd."}], "2859": [{"endOffset": 27, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles"}], "2862": [{"endOffset": 27, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles"}], "2865": [{"endOffset": 51, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles Day of Evaluation Group"}], "2868": [{"endOffset": 27, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles"}], "2871": [{"endOffset": 51, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles Day of Evaluation Group"}], "2874": [{"endOffset": 27, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles"}], "2877": [{"endOffset": 51, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles Day of Evaluation Group"}], "2880": [{"endOffset": 27, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles"}], "2883": [{"endOffset": 51, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles Day of Evaluation Group"}], "2885": [{"endOffset": 27, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles"}], "2888": [{"endOffset": 51, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles Day of Evaluation Group"}], "2891": [{"endOffset": 51, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles Day of Evaluation Group"}], "2894": [{"endOffset": 51, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles Day of Evaluation Group"}], "2897": [{"endOffset": 51, "startOffset": 0, "type": "ORG", "value": "P Generation Estrous Cycles Day of Evaluation Group"}], "2899": [{"endOffset": 53, "startOffset": 0, "type": "ORG", "value": "Estrous Cycles Incomplete Recordings --- Comments ---"}], "2903": [{"endOffset": 17, "startOffset": 0, "type": "ORG", "value": "Estrous Cycles AT"}], "2906": [{"endOffset": 17, "startOffset": 0, "type": "ORG", "value": "Estrous Cycles AT"}], "2909": [{"endOffset": 17, "startOffset": 0, "type": "ORG", "value": "Estrous Cycles AT"}], "2912": [{"endOffset": 17, "startOffset": 0, "type": "ORG", "value": "Estrous Cycles AT"}], "2913": [{"endOffset": 205, "startOffset": 153, "type": "ORG", "value": "Female Male Mating Pregnant Schedule Delivery Reared"}], "2914": [{"endOffset": 207, "startOffset": 155, "type": "ORG", "value": "Female Male Mating Pregnant Schedule Delivery Reared"}], "2915": [{"endOffset": 207, "startOffset": 155, "type": "ORG", "value": "Female Male Mating Pregnant Schedule Delivery Reared"}], "2916": [{"endOffset": 208, "startOffset": 156, "type": "ORG", "value": "Female Male Mating Pregnant Schedule Delivery Reared"}], "2926": [{"endOffset": 14, "startOffset": 0, "type": "CBI_author", "value": "SPERM ANALYSES"}], "2927": [{"endOffset": 14, "startOffset": 0, "type": "CBI_author", "value": "SPERM ANALYSES"}], "2928": [{"endOffset": 14, "startOffset": 0, "type": "CBI_author", "value": "SPERM ANALYSES"}], "2929": [{"endOffset": 14, "startOffset": 0, "type": "CBI_author", "value": "SPERM ANALYSES"}], "2930": [{"endOffset": 14, "startOffset": 0, "type": "CBI_author", "value": "SPERM ANALYSES"}], "2931": [{"endOffset": 14, "startOffset": 0, "type": "CBI_author", "value": "SPERM ANALYSES"}], "2932": [{"endOffset": 14, "startOffset": 0, "type": "CBI_author", "value": "SPERM ANALYSES"}], "2933": [{"endOffset": 14, "startOffset": 0, "type": "CBI_author", "value": "SPERM ANALYSES"}], "2969": [{"endOffset": 29522, "startOffset": 29513, "type": "CBI_author", "value": "D=12X5 MM"}, {"endOffset": 17073, "startOffset": 17071, "type": "COUNTRY", "value": "NO"}, {"endOffset": 18404, "startOffset": 18402, "type": "COUNTRY", "value": "NO"}, {"endOffset": 21754, "startOffset": 21752, "type": "COUNTRY", "value": "NO"}, {"endOffset": 23123, "startOffset": 23121, "type": "COUNTRY", "value": "NO"}, {"endOffset": 26471, "startOffset": 26469, "type": "COUNTRY", "value": "NO"}, {"endOffset": 27804, "startOffset": 27802, "type": "COUNTRY", "value": "NO"}, {"endOffset": 29522, "startOffset": 29520, "type": "COUNTRY", "value": "MM"}, {"endOffset": 31169, "startOffset": 31167, "type": "COUNTRY", "value": "NO"}, {"endOffset": 32539, "startOffset": 32537, "type": "COUNTRY", "value": "NO"}, {"endOffset": 39676, "startOffset": 39674, "type": "COUNTRY", "value": "MM"}, {"endOffset": 47212, "startOffset": 47210, "type": "COUNTRY", "value": "MM"}], "2998": [{"endOffset": 509, "startOffset": 498, "type": "STREET", "value": "-- -- -- --"}], "3008": [{"endOffset": 578, "startOffset": 574, "type": "CARDINAL", "value": "14 F"}], "3009": [{"endOffset": 334, "startOffset": 330, "type": "CARDINAL", "value": "14 F"}], "3011": [{"endOffset": 720, "startOffset": 716, "type": "CARDINAL", "value": "13 F"}, {"endOffset": 728, "startOffset": 724, "type": "CARDINAL", "value": "14 F"}], "3012": [{"endOffset": 441, "startOffset": 437, "type": "CARDINAL", "value": "14 F"}, {"endOffset": 617, "startOffset": 613, "type": "CARDINAL", "value": "13 F"}, {"endOffset": 790, "startOffset": 786, "type": "CARDINAL", "value": "13 F"}], "3013": [{"endOffset": 725, "startOffset": 721, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 733, "startOffset": 729, "type": "CARDINAL", "value": "13 F"}], "3014": [{"endOffset": 333, "startOffset": 329, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 341, "startOffset": 337, "type": "CARDINAL", "value": "13 F"}, {"endOffset": 349, "startOffset": 345, "type": "CARDINAL", "value": "14 F"}, {"endOffset": 478, "startOffset": 474, "type": "CARDINAL", "value": "13 F"}, {"endOffset": 643, "startOffset": 639, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 651, "startOffset": 647, "type": "CARDINAL", "value": "13 F"}, {"endOffset": 975, "startOffset": 971, "type": "CARDINAL", "value": "13 F"}], "3016": [{"endOffset": 492, "startOffset": 488, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 500, "startOffset": 496, "type": "CARDINAL", "value": "13 F"}], "3019": [{"endOffset": 579, "startOffset": 575, "type": "CARDINAL", "value": "14 F"}], "3020": [{"endOffset": 344, "startOffset": 340, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 352, "startOffset": 348, "type": "CARDINAL", "value": "13 F"}, {"endOffset": 360, "startOffset": 356, "type": "CARDINAL", "value": "14 F"}], "3022": [{"endOffset": 376, "startOffset": 372, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 713, "startOffset": 709, "type": "CARDINAL", "value": "13 F"}], "3023": [{"endOffset": 780, "startOffset": 776, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 940, "startOffset": 936, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 948, "startOffset": 944, "type": "CARDINAL", "value": "13 F"}], "3026": [{"endOffset": 368, "startOffset": 364, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 376, "startOffset": 372, "type": "CARDINAL", "value": "13 F"}, {"endOffset": 384, "startOffset": 380, "type": "CARDINAL", "value": "14 F"}, {"endOffset": 822, "startOffset": 818, "type": "CARDINAL", "value": "13 F"}, {"endOffset": 830, "startOffset": 826, "type": "CARDINAL", "value": "14 F"}], "3027": [{"endOffset": 655, "startOffset": 651, "type": "CARDINAL", "value": "14 F"}], "3037": [{"endOffset": 1830, "startOffset": 1809, "type": "ORG", "value": "FLC FLC AUTOLYTIC LLC"}], "3060": [{"endOffset": 479, "startOffset": 466, "type": "CBI_author", "value": "ABNORMAL GAIT"}], "3323": [{"endOffset": 486, "startOffset": 217, "type": "ORG", "value": "E D D P E D D P E M D P PL PL D P SP D P PL D D PL D P E M D P PL P E M D D P SP D PL P SP D P E M D D D P E M D D D D PL P E M D P PL D P E M D P PL SP P PL P PL D P PL D D D D D E SP D D D D D D PL D D P PL E D D P PL D P E D D D D D D D D D D D P SP PL N D D E D D D"}], "3446": [{"endOffset": 206, "startOffset": 154, "type": "ORG", "value": "Female Male Mating Pregnant Schedule Delivery Reared"}, {"endOffset": 454, "startOffset": 442, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 515, "startOffset": 503, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 567, "startOffset": 564, "type": "ORG", "value": "Yes"}, {"endOffset": 820, "startOffset": 808, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 881, "startOffset": 869, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 1117, "startOffset": 1105, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 1158, "startOffset": 1146, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 1210, "startOffset": 1207, "type": "ORG", "value": "Yes"}, {"endOffset": 1576, "startOffset": 1573, "type": "ORG", "value": "Yes"}, {"endOffset": 1720, "startOffset": 1708, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 1781, "startOffset": 1769, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 1842, "startOffset": 1830, "type": "ORG", "value": "Yes Breeding"}], "3447": [{"endOffset": 208, "startOffset": 156, "type": "ORG", "value": "Female Male Mating Pregnant Schedule Delivery Reared"}, {"endOffset": 386, "startOffset": 383, "type": "ORG", "value": "Yes"}, {"endOffset": 578, "startOffset": 566, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 822, "startOffset": 810, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 874, "startOffset": 871, "type": "ORG", "value": "Yes"}, {"endOffset": 1097, "startOffset": 1094, "type": "ORG", "value": "Yes"}, {"endOffset": 1211, "startOffset": 1208, "type": "ORG", "value": "Yes"}, {"endOffset": 1333, "startOffset": 1330, "type": "ORG", "value": "Yes"}, {"endOffset": 1516, "startOffset": 1513, "type": "ORG", "value": "Yes"}, {"endOffset": 1647, "startOffset": 1635, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 1721, "startOffset": 1709, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 1869, "startOffset": 1857, "type": "ORG", "value": "Yes Breeding"}], "3448": [{"endOffset": 208, "startOffset": 156, "type": "ORG", "value": "Female Male Mating Pregnant Schedule Delivery Reared"}, {"endOffset": 447, "startOffset": 444, "type": "ORG", "value": "Yes"}, {"endOffset": 944, "startOffset": 932, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 996, "startOffset": 993, "type": "ORG", "value": "Yes"}, {"endOffset": 1249, "startOffset": 1237, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 1432, "startOffset": 1420, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 1585, "startOffset": 1582, "type": "ORG", "value": "Yes"}, {"endOffset": 1646, "startOffset": 1643, "type": "ORG", "value": "Yes"}], "3449": [{"endOffset": 209, "startOffset": 157, "type": "ORG", "value": "Female Male Mating Pregnant Schedule Delivery Reared"}, {"endOffset": 579, "startOffset": 567, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 640, "startOffset": 628, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 945, "startOffset": 933, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 1507, "startOffset": 1495, "type": "ORG", "value": "Yes Breeding"}, {"endOffset": 1873, "startOffset": 1861, "type": "ORG", "value": "Yes Breeding"}], "3459": [{"endOffset": 272, "startOffset": 250, "type": "ORG", "value": "Progressive Stationary"}], "3460": [{"endOffset": 272, "startOffset": 250, "type": "ORG", "value": "Progressive Stationary"}], "3461": [{"endOffset": 272, "startOffset": 250, "type": "ORG", "value": "Progressive Stationary"}], "3462": [{"endOffset": 272, "startOffset": 250, "type": "ORG", "value": "Progressive Stationary"}], "3465": [{"endOffset": 580, "startOffset": 575, "type": "ORG", "value": "Sperm"}], "3502": [{"endOffset": 42574, "startOffset": 42559, "type": "CBI_author", "value": "YELLOWISH, FIRM"}, {"endOffset": 8866, "startOffset": 8863, "type": "CARDINAL", "value": "301"}, {"endOffset": 17302, "startOffset": 17300, "type": "COUNTRY", "value": "MM"}, {"endOffset": 44287, "startOffset": 44285, "type": "COUNTRY", "value": "MM"}], "3539": [{"endOffset": 604, "startOffset": 601, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1650, "startOffset": 1647, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1988, "startOffset": 1985, "type": "CARDINAL", "value": "9 F"}], "3540": [{"endOffset": 607, "startOffset": 604, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 928, "startOffset": 925, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1258, "startOffset": 1255, "type": "CARDINAL", "value": "9 F"}], "3541": [{"endOffset": 1704, "startOffset": 1701, "type": "CARDINAL", "value": "8 F"}, {"endOffset": 1711, "startOffset": 1708, "type": "CARDINAL", "value": "9 F"}], "3542": [{"endOffset": 664, "startOffset": 661, "type": "CARDINAL", "value": "8 F"}, {"endOffset": 671, "startOffset": 668, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1033, "startOffset": 1030, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1737, "startOffset": 1733, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 1745, "startOffset": 1741, "type": "CARDINAL", "value": "13 F"}], "3543": [{"endOffset": 771, "startOffset": 768, "type": "CARDINAL", "value": "9 F"}], "3544": [{"endOffset": 599, "startOffset": 596, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 878, "startOffset": 875, "type": "CARDINAL", "value": "7 F"}, {"endOffset": 892, "startOffset": 889, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1256, "startOffset": 1254, "type": "STREET", "value": "--"}, {"endOffset": 1269, "startOffset": 1265, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 1277, "startOffset": 1273, "type": "CARDINAL", "value": "13 F"}, {"endOffset": 1650, "startOffset": 1647, "type": "CARDINAL", "value": "9 F"}], "3546": [{"endOffset": 313, "startOffset": 310, "type": "CARDINAL", "value": "336"}, {"endOffset": 696, "startOffset": 693, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1333, "startOffset": 1330, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1954, "startOffset": 1951, "type": "CARDINAL", "value": "9 F"}], "3547": [{"endOffset": 617, "startOffset": 614, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1152, "startOffset": 1149, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1537, "startOffset": 1534, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1996, "startOffset": 1992, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 2004, "startOffset": 2000, "type": "CARDINAL", "value": "13 F"}, {"endOffset": 2012, "startOffset": 2008, "type": "CARDINAL", "value": "14 F"}], "3549": [{"endOffset": 586, "startOffset": 583, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1147, "startOffset": 1144, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1510, "startOffset": 1507, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1858, "startOffset": 1855, "type": "CARDINAL", "value": "8 F"}, {"endOffset": 1865, "startOffset": 1862, "type": "CARDINAL", "value": "9 F"}], "3551": [{"endOffset": 910, "startOffset": 907, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1553, "startOffset": 1549, "type": "CARDINAL", "value": "11 F"}, {"endOffset": 1561, "startOffset": 1557, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 1569, "startOffset": 1565, "type": "CARDINAL", "value": "13 F"}, {"endOffset": 1846, "startOffset": 1843, "type": "CARDINAL", "value": "9 F"}], "3552": [{"endOffset": 790, "startOffset": 786, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 1103, "startOffset": 1100, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1132, "startOffset": 1128, "type": "CARDINAL", "value": "11 F"}, {"endOffset": 1491, "startOffset": 1489, "type": "STREET", "value": "--"}, {"endOffset": 1504, "startOffset": 1500, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 1512, "startOffset": 1508, "type": "CARDINAL", "value": "13 F"}, {"endOffset": 1908, "startOffset": 1905, "type": "CARDINAL", "value": "9 F"}], "3553": [{"endOffset": 877, "startOffset": 874, "type": "CARDINAL", "value": "9 F"}], "3554": [{"endOffset": 615, "startOffset": 612, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 626, "startOffset": 624, "type": "STREET", "value": "--"}, {"endOffset": 631, "startOffset": 627, "type": "CARDINAL", "value": "11 F"}], "3555": [{"endOffset": 542, "startOffset": 538, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 907, "startOffset": 904, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1327, "startOffset": 1323, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 1701, "startOffset": 1698, "type": "CARDINAL", "value": "9 F"}], "3556": [{"endOffset": 341, "startOffset": 337, "type": "CARDINAL", "value": "12 F"}, {"endOffset": 1098, "startOffset": 1094, "type": "CARDINAL", "value": "14 F"}, {"endOffset": 1437, "startOffset": 1434, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1461, "startOffset": 1457, "type": "CARDINAL", "value": "12 F"}], "3557": [{"endOffset": 485, "startOffset": 482, "type": "CARDINAL", "value": "8 F"}, {"endOffset": 492, "startOffset": 489, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 828, "startOffset": 825, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1153, "startOffset": 1150, "type": "CARDINAL", "value": "6 F"}, {"endOffset": 1174, "startOffset": 1171, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 2017, "startOffset": 2014, "type": "CARDINAL", "value": "8 F"}, {"endOffset": 2024, "startOffset": 2021, "type": "CARDINAL", "value": "9 F"}], "3558": [{"endOffset": 642, "startOffset": 639, "type": "CARDINAL", "value": "8 F"}, {"endOffset": 649, "startOffset": 646, "type": "CARDINAL", "value": "9 F"}, {"endOffset": 1747, "startOffset": 1744, "type": "CARDINAL", "value": "9 F"}]}} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/data/test-file.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/data/test-file.pdf index 4382bd92..276095f8 100644 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/data/test-file.pdf and b/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/data/test-file.pdf differ