From e3fafa29b3c7acda2fb824f47a0a81a466883dca Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Fri, 30 Apr 2021 16:18:36 +0100 Subject: [PATCH 01/21] WIP --- .../inference/tokenisation/NlpPipeline.java | 27 ++++++ .../ml/inference/tokenisation/TaskType.java | 12 +++ .../ml/inference/tokenisation/Vocabulary.java | 82 +++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/NlpPipeline.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/TaskType.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/Vocabulary.java diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/NlpPipeline.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/NlpPipeline.java new file mode 100644 index 0000000000000..dc7ce23b9e6e6 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/NlpPipeline.java @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.tokenisation; + +public class NlpPipeline { + + private TaskType taskType; + + // tokenser + // request builder + + /** + * Return the request + * @param inputs + * @return + */ + public String process(String inputs) { + // tokenise + return ""; + } + +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/TaskType.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/TaskType.java new file mode 100644 index 0000000000000..630a58065fdac --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/TaskType.java @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.tokenisation; + +public enum TaskType { + TOKEN_CLASSIFICATION +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/Vocabulary.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/Vocabulary.java new file mode 100644 index 0000000000000..95b7501db90a6 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/Vocabulary.java @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.tokenisation; + +import org.elasticsearch.common.ParseField; +import org.elasticsearch.common.xcontent.ConstructingObjectParser; +import org.elasticsearch.common.xcontent.ToXContentObject; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentParser; + +import java.io.IOException; +import java.util.List; +import java.util.Objects; +import java.util.SortedMap; +import java.util.TreeMap; + +public class Vocabulary implements ToXContentObject { + + public static final String NAME = "vocab"; + public static final ParseField VOCAB = new ParseField(NAME); + public static final ParseField UNKNOWN_TOKEN = new ParseField("unknown"); + + private static final ConstructingObjectParser<Vocabulary, Void> STRICT_PARSER = createParser(false); + private static final ConstructingObjectParser<Vocabulary, Void> LENIENT_PARSER = createParser(true); + + private static ConstructingObjectParser<Vocabulary, Void> createParser(boolean ignoreUnknownFields) { + ConstructingObjectParser<Vocabulary, Void> parser = new ConstructingObjectParser<>(NAME, + ignoreUnknownFields, + a -> new Vocabulary((List<String>) a[0], (Integer) a[1])); + + parser.declareStringArray(ConstructingObjectParser.constructorArg(), VOCAB); + parser.declareInt(ConstructingObjectParser.constructorArg(), UNKNOWN_TOKEN); + + return parser; + } + + public static Vocabulary fromXContent(XContentParser parser, boolean lenient) { + return lenient ? LENIENT_PARSER.apply(parser, null) : STRICT_PARSER.apply(parser, null); + } + + private final SortedMap<String, Integer> vocab; + private final int unknownToken; + + public Vocabulary(List<String> words, int unknownToken) { + this.unknownToken = unknownToken; + vocab = new TreeMap<>(); + for (int i = 0; i < words.size(); i++) { + vocab.put(words.get(i), i); + } + } + + public int token(String word) { + Integer token = vocab.get(word); + if (token == null) { + token = unknownToken; + } + return token; + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + return builder.field(VOCAB.getPreferredName(), vocab.keySet()); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Vocabulary that = (Vocabulary) o; + return unknownToken == that.unknownToken && Objects.equals(vocab, that.vocab); + } + + @Override + public int hashCode() { + return Objects.hash(vocab, unknownToken); + } +} From 7b74033f7130c5c86f68d131f15641c44e5b0f5e Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Tue, 4 May 2021 17:51:34 +0100 Subject: [PATCH 02/21] Add the tokenization pipeline --- .../xpack/core/ml/job/messages/Messages.java | 1 + .../deployment/DeploymentManager.java | 76 ++++- .../inference/pipelines/nlp/NlpPipeline.java | 33 +++ .../pipelines/nlp/PipelineConfig.java | 123 ++++++++ .../ml/inference/pipelines/nlp/TaskType.java | 62 ++++ .../nlp/tokenizers/BasicTokenizer.java | 279 ++++++++++++++++++ .../nlp/tokenizers/BertTokenizer.java | 186 ++++++++++++ .../nlp/tokenizers/WordPieceTokenizer.java | 120 ++++++++ .../nlp/tokenizers/WordPieceVocabulary.java} | 25 +- .../pytorch/process/NativePyTorchProcess.java | 5 +- .../inference/tokenisation/NlpPipeline.java | 27 -- .../ml/inference/tokenisation/TaskType.java | 12 - .../pipelines/nlp/TaskTypeTests.java | 27 ++ .../nlp/tokenizers/BasicTokenizerTests.java | 164 ++++++++++ .../nlp/tokenizers/BertTokenizerTests.java | 69 +++++ .../tokenizers/WordPieceTokenizerTests.java | 57 ++++ 16 files changed, 1205 insertions(+), 61 deletions(-) create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizer.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizer.java rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{tokenisation/Vocabulary.java => pipelines/nlp/tokenizers/WordPieceVocabulary.java} (65%) delete mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/NlpPipeline.java delete mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/TaskType.java create mode 100644 x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskTypeTests.java create mode 100644 x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizerTests.java create mode 100644 x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java create mode 100644 x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizerTests.java diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/job/messages/Messages.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/job/messages/Messages.java index 4292b0a89cc09..0ae5788be7a6c 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/job/messages/Messages.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/job/messages/Messages.java @@ -115,6 +115,7 @@ public final class Messages { "Configuration [{0}] requires minimum node version [{1}] (current minimum node version [{2}]"; public static final String MODEL_DEFINITION_NOT_FOUND = "Could not find trained model definition [{0}]"; public static final String MODEL_METADATA_NOT_FOUND = "Could not find trained model metadata {0}"; + public static final String PIPELINE_CONFIG_NOT_FOUND = "Could not find pipeline config for model [{0}]"; public static final String INFERENCE_CANNOT_DELETE_ML_MANAGED_MODEL = "Unable to delete model [{0}] as it is required by machine learning"; public static final String MODEL_DEFINITION_TRUNCATED = diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java index f4e923b5f5944..21afae47269ef 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java @@ -12,24 +12,39 @@ import org.apache.logging.log4j.message.ParameterizedMessage; import org.apache.lucene.util.SetOnce; import org.elasticsearch.ElasticsearchStatusException; +import org.elasticsearch.ResourceNotFoundException; import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.search.SearchAction; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; +import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.concurrent.AbstractRunnable; +import org.elasticsearch.common.xcontent.LoggingDeprecationHandler; import org.elasticsearch.common.xcontent.NamedXContentRegistry; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.query.IdsQueryBuilder; import org.elasticsearch.rest.RestStatus; +import org.elasticsearch.search.SearchHit; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; import org.elasticsearch.xpack.core.ml.inference.deployment.TrainedModelDeploymentState; import org.elasticsearch.xpack.core.ml.inference.deployment.TrainedModelDeploymentTaskState; +import org.elasticsearch.xpack.core.ml.job.messages.Messages; import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper; import org.elasticsearch.xpack.ml.MachineLearning; +import org.elasticsearch.xpack.ml.inference.pipelines.nlp.NlpPipeline; +import org.elasticsearch.xpack.ml.inference.pipelines.nlp.PipelineConfig; import org.elasticsearch.xpack.ml.inference.pytorch.process.NativePyTorchProcess; import org.elasticsearch.xpack.ml.inference.pytorch.process.PyTorchProcessFactory; import org.elasticsearch.xpack.ml.inference.pytorch.process.PyTorchResultProcessor; import org.elasticsearch.xpack.ml.inference.pytorch.process.PyTorchStateStreamer; import java.io.IOException; +import java.io.InputStream; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -37,6 +52,9 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; +import static org.elasticsearch.xpack.core.ClientHelper.ML_ORIGIN; +import static org.elasticsearch.xpack.core.ClientHelper.executeAsyncWithOrigin; + public class DeploymentManager { private static final Logger logger = LogManager.getLogger(DeploymentManager.class); @@ -85,8 +103,47 @@ private void doStartDeployment(TrainedModelDeploymentTask task) { e -> failTask(task, e) ); - processContext.startProcess(); - processContext.loadModel(modelLoadedListener); + ActionListener<SearchResponse> configListener = ActionListener.wrap( + searchResponse -> { + if (searchResponse.getHits().getHits().length == 0) { + failTask(task, new ResourceNotFoundException( + Messages.getMessage(Messages.PIPELINE_CONFIG_NOT_FOUND, task.getModelId()))); + return; + } + + PipelineConfig config = parseModelDefinitionDocLeniently(searchResponse.getHits().getAt(0)); + NlpPipeline pipeline = NlpPipeline.fromConfig(config); + processContext.pipeline.set(pipeline); + processContext.startProcess(); + processContext.loadModel(modelLoadedListener); + + }, + e -> failTask(task, e) + ); + + SearchRequest searchRequest = pipelineConfigSearchRequest(task.getModelId(), task.getIndex()); + executeAsyncWithOrigin(client, ML_ORIGIN, SearchAction.INSTANCE, searchRequest, configListener); + } + + private SearchRequest pipelineConfigSearchRequest(String modelId, String index) { + return client.prepareSearch(index) + .setQuery(new IdsQueryBuilder().addIds(PipelineConfig.documentId(modelId))) + .setSize(1) + .setTrackTotalHits(false) + .request(); + } + + + public PipelineConfig parseModelDefinitionDocLeniently(SearchHit hit) throws IOException { + + try (InputStream stream = hit.getSourceRef().streamInput(); + XContentParser parser = XContentFactory.xContent(XContentType.JSON) + .createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, stream)) { + return PipelineConfig.fromXContent(parser, true); + } catch (IOException e) { + logger.error(new ParameterizedMessage("failed to parse pipeline config [{}]", hit.getId()), e); + throw e; + } } public void stopDeployment(TrainedModelDeploymentTask task) { @@ -102,7 +159,7 @@ public void stopDeployment(TrainedModelDeploymentTask task) { } } - public void infer(TrainedModelDeploymentTask task, String requestId, String jsonDoc, ActionListener<PyTorchResult> listener) { + public void infer(TrainedModelDeploymentTask task, String requestId, String inputs, ActionListener<PyTorchResult> listener) { ProcessContext processContext = processContextByAllocation.get(task.getAllocationId()); final String resolvedId = requestId == null ? String.valueOf(requestIdCounter.getAndIncrement()) : requestId; @@ -116,7 +173,7 @@ public void onFailure(Exception e) { @Override protected void doRun() { try { - processContext.process.get().writeInferenceRequest(jsonDoc); + processContext.infer(inputs, resolvedId); waitForResult(processContext, resolvedId, listener); } catch (IOException e) { logger.error(new ParameterizedMessage("[{}] error writing to process", processContext.modelId), e); @@ -152,6 +209,7 @@ class ProcessContext { private final String modelId; private final String index; private final SetOnce<NativePyTorchProcess> process = new SetOnce<>(); + private final SetOnce<NlpPipeline> pipeline = new SetOnce<>(); private final PyTorchResultProcessor resultProcessor; private final PyTorchStateStreamer stateStreamer; @@ -162,6 +220,11 @@ class ProcessContext { this.stateStreamer = new PyTorchStateStreamer(client, executorService, xContentRegistry); } + void infer(String inputs, String requestId) throws IOException { + BytesReference request = pipeline.get().createRequest(inputs, requestId); + process.get().writeInferenceRequest(request); + } + synchronized void startProcess() { process.set(pyTorchProcessFactory.createProcess(modelId, executorServiceForProcess, onProcessCrash())); } @@ -180,14 +243,11 @@ synchronized void stopProcess() { } private Consumer<String> onProcessCrash() { - return reason -> { - logger.error("[{}] process crashed due to reason [{}]", modelId, reason); - }; + return reason -> logger.error("[{}] process crashed due to reason [{}]", modelId, reason); } void loadModel(ActionListener<Boolean> listener) { process.get().loadModel(modelId, index, stateStreamer, listener); } } - } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java new file mode 100644 index 0000000000000..b5abdcafa87c0 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; + +import java.io.IOException; + +public class NlpPipeline { + + private final TaskType taskType; + private final BertTokenizer tokenizer; + + private NlpPipeline(TaskType taskType, BertTokenizer tokenizer) { + this.taskType = taskType; + this.tokenizer = tokenizer; + } + + public BytesReference createRequest(String inputs, String requestId) throws IOException { + BertTokenizer.TokenizationResult tokens = tokenizer.tokenize(inputs); + return taskType.jsonRequest(tokens.getTokenIds(), requestId); + } + + public static NlpPipeline fromConfig(PipelineConfig config) { + return new NlpPipeline(config.getTaskType(), config.buildTokenizer()); + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java new file mode 100644 index 0000000000000..7c376a3545df5 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java @@ -0,0 +1,123 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.common.ParseField; +import org.elasticsearch.common.xcontent.ObjectParser; +import org.elasticsearch.common.xcontent.ToXContentObject; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; + +import java.io.IOException; +import java.util.List; +import java.util.Objects; +import java.util.SortedMap; +import java.util.TreeMap; + +public class PipelineConfig implements ToXContentObject { + + public static final ParseField VOCAB = new ParseField("vocab"); + public static final ParseField TASK_TYPE = new ParseField("task_type"); + + private static final ObjectParser<PipelineConfig.Builder, Void> STRICT_PARSER = createParser(false); + private static final ObjectParser<PipelineConfig.Builder, Void> LENIENT_PARSER = createParser(true); + + private static ObjectParser<PipelineConfig.Builder, Void> createParser(boolean ignoreUnknownFields) { + ObjectParser<PipelineConfig.Builder, Void> parser = new ObjectParser<>("pipeline_config", + ignoreUnknownFields, + Builder::new); + + parser.declareStringArray(Builder::setVocabulary, VOCAB); + parser.declareString(Builder::setTaskType, TASK_TYPE); + return parser; + } + + public static PipelineConfig fromXContent(XContentParser parser, boolean lenient) { + return lenient ? LENIENT_PARSER.apply(parser, null).build() : STRICT_PARSER.apply(parser, null).build(); + } + + public static String documentId(String model) { + return model + "_pipeline_config"; + } + + private final TaskType taskType; + private final List<String> vocabulary; + + PipelineConfig(TaskType taskType, List<String> vocabulary) { + this.taskType = taskType; + this.vocabulary = vocabulary; + } + + public TaskType getTaskType() { + return taskType; + } + + public BertTokenizer buildTokenizer() { + return BertTokenizer.builder(vocabMap()).build(); + } + + SortedMap<String, Integer> vocabMap() { + SortedMap<String, Integer> vocab = new TreeMap<>(); + for (int i = 0; i < vocabulary.size(); i++) { + vocab.put(vocabulary.get(i), i); + } + return vocab; + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject(); + builder.field(TASK_TYPE.getPreferredName(), taskType.toString()); + builder.field(VOCAB.getPreferredName(), vocabulary); + builder.endObject(); + return builder; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PipelineConfig that = (PipelineConfig) o; + return taskType == that.taskType && Objects.equals(vocabulary, that.vocabulary); + } + + @Override + public int hashCode() { + return Objects.hash(taskType, vocabulary); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + private TaskType taskType; + private List<String> vocabulary; + + public Builder setTaskType(TaskType taskType) { + this.taskType = taskType; + return this; + } + + public Builder setTaskType(String taskType) { + this.taskType = TaskType.fromString(taskType); + return this; + } + + public Builder setVocabulary(List<String> vocab) { + this.vocabulary = vocab; + return this; + } + + public PipelineConfig build() { + return new PipelineConfig(taskType, vocabulary); + } + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java new file mode 100644 index 0000000000000..0ebd3260677d4 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.xpack.core.ml.inference.TrainedModelType; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Locale; + +public enum TaskType { + + TOKEN_CLASSIFICATION { + public BytesReference jsonRequest(int[] tokens, String requestId) throws IOException { + XContentBuilder builder = XContentFactory.jsonBuilder(); + builder.startObject(); + builder.field(REQUEST_ID, requestId); + builder.array(TOKENS, tokens); + + int[] inputMask = new int[tokens.length]; + Arrays.fill(inputMask, 1); + int[] segmentMask = new int[tokens.length]; + Arrays.fill(segmentMask, 0); + int[] positionalIds = new int[tokens.length]; + Arrays.setAll(positionalIds, i -> i); + builder.array(ARG1, inputMask); + builder.array(ARG2, segmentMask); + builder.array(ARG3, positionalIds); + builder.endObject(); + + // BytesReference.bytes closes the builder + return BytesReference.bytes(builder); + } + }; + + public BytesReference jsonRequest(int[] tokens, String requestId) throws IOException { + throw new UnsupportedOperationException("json request must be specialised for task type [" + this.name() + "]"); + } + + @Override + public String toString() { + return name().toLowerCase(Locale.ROOT); + } + + public static TaskType fromString(String name) { + return valueOf(name.trim().toUpperCase(Locale.ROOT)); + } + + private static final String REQUEST_ID = "request_id"; + private static final String TOKENS = "tokens"; + private static final String ARG1 = "arg_1"; + private static final String ARG2 = "arg_2"; + private static final String ARG3 = "arg_3"; +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizer.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizer.java new file mode 100644 index 0000000000000..78d607758cd49 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizer.java @@ -0,0 +1,279 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; + +import joptsimple.internal.Strings; + +import java.text.Normalizer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Basic tokenization of text by whitespace with optional extras: + * 1. Lower case the input + * 2. Convert to Unicode NFD + * 3. Stip accents + * 4. Surround CJK characters with ' ' + * + * Derived from + * https://github.com/huggingface/transformers/blob/ba8c4d0ac04acfcdbdeaed954f698d6d5ec3e532/src/transformers/tokenization_bert.py + */ +public class BasicTokenizer { + + private final boolean isLowerCase; + private final boolean isTokenizeCjkChars; + private final boolean isStripAccents; + private final Set<String> neverSplit; + + /** + * Tokenizer behaviour is controlled by the options passed here. + * + * @param isLowerCase If true convert the input to lowercase + * @param isTokenizeCjkChars Should CJK ideographs be tokenized + * @param isStripAccents Strip all accents + * @param neverSplit The set of tokens that should not be split + */ + public BasicTokenizer(boolean isLowerCase, boolean isTokenizeCjkChars, boolean isStripAccents, + Set<String> neverSplit) { + this.isLowerCase = isLowerCase; + this.isTokenizeCjkChars = isTokenizeCjkChars; + this.isStripAccents = isStripAccents; + this.neverSplit = neverSplit; + } + + public BasicTokenizer(boolean isLowerCase, boolean isTokenizeCjkChars, boolean isStripAccents) { + this.isLowerCase = isLowerCase; + this.isTokenizeCjkChars = isTokenizeCjkChars; + this.isStripAccents = isStripAccents; + this.neverSplit = Collections.emptySet(); + } + + /** + * Tokenize CJK chars defaults to the value of {@code isLowerCase} + * when not explicitly set + * @param isLowerCase If true convert the input to lowercase + * @param isTokenizeCjkChars Should CJK ideographs be tokenized + */ + public BasicTokenizer(boolean isLowerCase, boolean isTokenizeCjkChars) { + this(isLowerCase, isTokenizeCjkChars, isLowerCase); + } + + BasicTokenizer() { + this(true, true, true); + } + + /** + * Clean the text and whitespace tokenize then process depending + * on the values of {@code lowerCase}, {@code tokenizeCjkChars}, + * {@code stripAccents} and the contents of {@code neverSplit} + * + * @param text The input text to tokenize + * @return List of tokens + */ + public List<String> tokenize(String text) { + text = cleanText(text); + if (isTokenizeCjkChars) { + text = tokenizeCjkChars(text); + } + + String [] tokens = whiteSpaceTokenize(text); + + List<String> processedTokens = new ArrayList<>(tokens.length); + for (String token : tokens) { + if (neverSplit.contains(token)) { + processedTokens.add(token); + continue; + } + + if (Strings.EMPTY.equals(token)) { + continue; + } + + if (isLowerCase) { + token = token.toLowerCase(Locale.ROOT); + } + if (isStripAccents) { + token = stripAccents(token); + } + processedTokens.addAll(splitOnPunctuation(token)); + } + + return processedTokens; + } + + public boolean isLowerCase() { + return isLowerCase; + } + + public boolean isStripAccents() { + return isStripAccents; + } + + public boolean isTokenizeCjkChars() { + return isTokenizeCjkChars; + } + + static String [] whiteSpaceTokenize(String text) { + text = text.trim(); + return text.split(" "); + } + + /** + * Normalize unicode text to NFD form + * "Characters are decomposed by canonical equivalence, and multiple + * combining characters are arranged in a specific order" + * from https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms + * + * And remove non-spacing marks https://www.compart.com/en/unicode/category/Mn + * + * @param word Word to strip + * @return {@code word} normalized and stripped. + */ + static String stripAccents(String word) { + String normalizedString = Normalizer.normalize(word, Normalizer.Form.NFD); + + int [] codePoints = normalizedString.codePoints() + .filter(codePoint -> Character.getType(codePoint) != Character.NON_SPACING_MARK) + .toArray(); + + return new String(codePoints, 0, codePoints.length); + } + + static List<String> splitOnPunctuation(String word) { + List<String> split = new ArrayList<>(); + int [] codePoints = word.codePoints().toArray(); + + int lastSplit = 0; + for (int i=0; i<codePoints.length; i++) { + if (isPunctuation(codePoints[i])) { + int charCount = i - lastSplit; + if (charCount > 0) { + // add a new string for what has gone before + split.add(new String(codePoints, lastSplit, i - lastSplit)); + } + split.add(new String(codePoints, i, 1)); + lastSplit = i+1; + } + } + + if (lastSplit < codePoints.length) { + split.add(new String(codePoints, lastSplit, codePoints.length - lastSplit)); + } + + return split; + } + + /** + * Surrounds any CJK character with whitespace + * @param text To tokenize + * @return tokenized text + */ + static String tokenizeCjkChars(String text) { + StringBuilder sb = new StringBuilder(text.length()); + AtomicBoolean cjkCharFound = new AtomicBoolean(false); + + text.codePoints().forEach(cp -> { + if (isCjkChar(cp)) { + sb.append(' '); + sb.appendCodePoint(cp); + sb.append(' '); + cjkCharFound.set(true); + } else { + sb.appendCodePoint(cp); + } + }); + + // no change + if (cjkCharFound.get() == false) { + return text; + } + + return sb.toString(); + } + + /** + * Remove control chars and normalize white space to ' ' + * @param text Text to clean + * @return Cleaned text + */ + static String cleanText(String text) { + int [] codePoints = text.codePoints() + .filter(codePoint -> (codePoint == 0x00 || codePoint == 0xFFFD || isControlChar(codePoint)) == false) + .map(codePoint -> isWhiteSpace(codePoint) ? ' ' : codePoint) + .toArray(); + + return new String(codePoints, 0, codePoints.length); + } + + static boolean isCjkChar(int codePoint) { + // https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block) + Character.UnicodeBlock block = Character.UnicodeBlock.of(codePoint); + return Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS.equals(block) || + Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS.equals(block) || + Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A.equals(block) || + Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B.equals(block) || + Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C.equals(block) || + Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D.equals(block) || + Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E.equals(block) || + Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT.equals(block); + } + + /** + * newline, carriage return and tab are control chars but for + * tokenization purposes they are treated as whitespace. + * + * @param codePoint code point + * @return is control char + */ + static boolean isControlChar(int codePoint) { + if (codePoint == '\n' || codePoint == '\r' || codePoint == '\t' ) { + return false; + } + int category = Character.getType(codePoint); + + return category >= Character.CONTROL && category <= Character.SURROGATE; + } + + /** + * newline, carriage return and tab are technically control chars + * but are not part of the Unicode Space Separator (Zs) group. + * For tokenization purposes they are treated as whitespace + * + * @param codePoint code point + * @return is white space + */ + static boolean isWhiteSpace(int codePoint) { + if (codePoint == '\n' || codePoint == '\r' || codePoint == '\t' ) { + return true; + } + return Character.getType(codePoint) == Character.SPACE_SEPARATOR; + } + + /** + * We treat all non-letter/number ASCII as punctuation. + * Characters such as "^", "$", and "`" are not in the Unicode + * Punctuation class but are treated as punctuation for consistency. + * + * @param codePoint code point + * @return true if is punctuation + */ + static boolean isPunctuation(int codePoint) { + if ((codePoint >= 33 && codePoint <= 47) || + (codePoint >= 58 && codePoint <= 64) || + (codePoint >= 91 && codePoint <= 96) || + (codePoint >= 123 && codePoint <= 126)) { + return true; + } + + int category = Character.getType(codePoint); + return category >= Character.DASH_PUNCTUATION && category <= Character.OTHER_PUNCTUATION; + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java new file mode 100644 index 0000000000000..50a77f0453b84 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java @@ -0,0 +1,186 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Performs basic tokenization and normalization of input text + * then tokenizes with the WordPiece algorithm using the given + * vocabulary. + * <p> + * Derived from + * https://github.com/huggingface/transformers/blob/ba8c4d0ac04acfcdbdeaed954f698d6d5ec3e532/src/transformers/tokenization_bert.py + */ +public class BertTokenizer { + + public static final String UNKNOWN_TOKEN = "[UNK]"; + public static final String SEPARATOR_TOKEN = "[SEP]"; + public static final String PAD_TOKEN = "[PAD]"; + public static final String CLASS_TOKEN = "[CLS]"; + public static final String MASK_TOKEN = "[MASK]"; + + public static final int DEFAULT_MAX_INPUT_CHARS_PER_WORD = 100; + + private final WordPieceTokenizer wordPieceTokenizer; + private final Map<String, Integer> vocab; + private final boolean doLowerCase; + private final boolean doTokenizeCjKChars; + private final boolean doStripAccents; + private final Set<String> neverSplit; + + private BertTokenizer(Map<String, Integer> vocab, + boolean doLowerCase, + boolean doTokenizeCjKChars, + boolean doStripAccents, + Set<String> neverSplit) { + wordPieceTokenizer = new WordPieceTokenizer(vocab, UNKNOWN_TOKEN, DEFAULT_MAX_INPUT_CHARS_PER_WORD); + this.vocab = vocab; + this.doLowerCase = doLowerCase; + this.doTokenizeCjKChars = doTokenizeCjKChars; + this.doStripAccents = doStripAccents; + this.neverSplit = neverSplit; + } + + /** + * Tokenize the input according to the basic tokenization options + * then perform Word Piece tokenization with the given vocabulary. + * + * The result is the Word Piece tokens, a map of the Word Piece + * token position to the position of the token in the source + * @param text Text to tokenize + * @return Tokenized text, token Ids and map + */ + public TokenizationResult tokenize(String text) { + BasicTokenizer basicTokenizer = new BasicTokenizer(doLowerCase, doTokenizeCjKChars, doStripAccents, neverSplit); + + List<String> delineatedTokens = basicTokenizer.tokenize(text); + List<WordPieceTokenizer.TokenAndId> wordPieceTokens = new ArrayList<>(); + List<Integer> tokenPositionMap = new ArrayList<>(); + + for (int sourceIndex = 0; sourceIndex < delineatedTokens.size(); sourceIndex++) { + String token = delineatedTokens.get(sourceIndex); + if (neverSplit.contains(token)) { + wordPieceTokens.add(new WordPieceTokenizer.TokenAndId(token, vocab.getOrDefault(token, vocab.get(UNKNOWN_TOKEN)))); + tokenPositionMap.add(sourceIndex); + } else { + List<WordPieceTokenizer.TokenAndId> tokens = wordPieceTokenizer.tokenize(token); + for (int tokenCount = 0; tokenCount < tokens.size(); tokenCount++) { + tokenPositionMap.add(sourceIndex); + } + wordPieceTokens.addAll(tokens); + } + } + + assert tokenPositionMap.size() == wordPieceTokens.size(); + + List<String> tokens = new ArrayList<>(wordPieceTokens.size()); + int [] tokenIds = new int[wordPieceTokens.size()]; + int [] tokenMap = new int[wordPieceTokens.size()]; + for (int i = 0; i < wordPieceTokens.size(); i++) { + tokens.add(wordPieceTokens.get(i).getToken()); + tokenIds[i] = wordPieceTokens.get(i).getId(); + tokenMap[i] = tokenPositionMap.get(i); + } + + return new TokenizationResult(tokens, tokenIds, tokenMap); + } + + public class TokenizationResult { + private final List<String> tokens; + private final int [] tokenIds; + private final int [] tokenMap; + + TokenizationResult(List<String> tokens, int [] tokenIds, int [] tokenMap) { + assert tokens.size() == tokenIds.length; + assert tokenIds.length == tokenMap.length; + this.tokens = tokens; + this.tokenIds = tokenIds; + this.tokenMap = tokenMap; + } + + /** + * The token strings from the tokenization process + * @return A list of tokens + */ + public List<String> getTokens() { + return tokens; + } + + /** + * The integer values of the tokens in {@link #getTokens()} + * @return A list of token Ids + */ + public int[] getTokenIds() { + return tokenIds; + } + + /** + * Maps the token position to the position in the source text. + * Source words may be divided into more than one token so more + * than one token can map back to the source token + * @return Map of source token to + */ + public int[] getTokenMap() { + return tokenMap; + } + } + + public static Builder builder(Map<String, Integer> vocab) { + return new Builder(vocab); + } + + public static class Builder { + + private final Map<String, Integer> vocab; + private boolean doLowerCase = true; + private boolean doTokenizeCjKChars = true; + private Boolean doStripAccents = null; + private Set<String> neverSplit; + + public Builder(Map<String, Integer> vocab) { + this.vocab = vocab; + } + + public Builder setDoLowerCase(boolean doLowerCase) { + this.doLowerCase = doLowerCase; + return this; + } + + public Builder setDoTokenizeCjKChars(boolean doTokenizeCjKChars) { + this.doTokenizeCjKChars = doTokenizeCjKChars; + return this; + } + + public Builder setDoStripAccents(Boolean doStripAccents) { + this.doStripAccents = doStripAccents; + return this; + } + + public Builder setNeverSplit(Set<String> neverSplit) { + this.neverSplit = neverSplit; + return this; + } + + public BertTokenizer build() { + // if not set strip accents defaults to the value of doLowerCase + if (doStripAccents == null) { + doStripAccents = doLowerCase; + } + + if (neverSplit == null) { + neverSplit = Collections.emptySet(); + } + + return new BertTokenizer(vocab, doLowerCase, doTokenizeCjKChars, doStripAccents, neverSplit); + } + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizer.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizer.java new file mode 100644 index 0000000000000..431b70968e770 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizer.java @@ -0,0 +1,120 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * SubWord tokenization via the Word Piece algorithm using the + * provided vocabulary. + * + * The input is split by white space and should be pre-processed + * by {@link BasicTokenizer} + */ +public class WordPieceTokenizer { + + private static final String CONTINUATION = "##"; + + private final Map<String, Integer> vocab; + private final String unknownToken; + private final int maxInputCharsPerWord; + + public static class TokenAndId { + private final String token; + private final int id; + + TokenAndId(String token, int id) { + this.token = token; + this.id = id; + } + + public int getId() { + return id; + } + + public String getToken() { + return token; + } + } + + /** + * + * @param vocab The token vocabulary + * @param unknownToken If not found in the vocabulary + * @param maxInputCharsPerWord Inputs tokens longer than this are 'unknown' + */ + public WordPieceTokenizer(Map<String, Integer> vocab, String unknownToken, int maxInputCharsPerWord) { + this.vocab = vocab; + this.unknownToken = unknownToken; + this.maxInputCharsPerWord = maxInputCharsPerWord; + } + + /** + * Wordpiece tokenize the input text. + * + * @param text A single token or whitespace separated tokens. + * Input should have been normalized by the {@link BasicTokenizer}. + * @return List of tokens + */ + public List<TokenAndId> tokenize(String text) { + String[] tokens = BasicTokenizer.whiteSpaceTokenize(text); + + List<TokenAndId> output = new ArrayList<>(); + for (String token : tokens) { + if (token.length() > maxInputCharsPerWord) { + assert vocab.containsKey(unknownToken); + output.add(new TokenAndId(unknownToken, vocab.get(unknownToken))); + continue; + } + + boolean isBad = false; + int start = 0; + List<TokenAndId> subTokens = new ArrayList<>(); + int length = token.length(); + while (start < length) { + int end = length; + + String currentValidSubStr = null; + + while (start < end) { + String subStr; + if (start > 0) { + subStr = CONTINUATION + token.substring(start, end); + } else { + subStr = token.substring(start, end); + } + + if (vocab.containsKey(subStr)) { + currentValidSubStr = subStr; + break; + } + + end--; + } + + if (currentValidSubStr == null) { + isBad = true; + break; + } + + subTokens.add(new TokenAndId(currentValidSubStr, vocab.get(currentValidSubStr))); + + start = end; + } + + if (isBad) { + output.add(new TokenAndId(unknownToken, vocab.get(unknownToken))); + } else { + output.addAll(subTokens); + } + } + + return output; + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/Vocabulary.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceVocabulary.java similarity index 65% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/Vocabulary.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceVocabulary.java index 95b7501db90a6..09d567ea80998 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/Vocabulary.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceVocabulary.java @@ -5,7 +5,7 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.tokenisation; +package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; import org.elasticsearch.common.ParseField; import org.elasticsearch.common.xcontent.ConstructingObjectParser; @@ -19,35 +19,36 @@ import java.util.SortedMap; import java.util.TreeMap; -public class Vocabulary implements ToXContentObject { +public class WordPieceVocabulary implements ToXContentObject { public static final String NAME = "vocab"; public static final ParseField VOCAB = new ParseField(NAME); public static final ParseField UNKNOWN_TOKEN = new ParseField("unknown"); - private static final ConstructingObjectParser<Vocabulary, Void> STRICT_PARSER = createParser(false); - private static final ConstructingObjectParser<Vocabulary, Void> LENIENT_PARSER = createParser(true); + private static final ConstructingObjectParser<WordPieceVocabulary, Void> STRICT_PARSER = createParser(false); + private static final ConstructingObjectParser<WordPieceVocabulary, Void> LENIENT_PARSER = createParser(true); - private static ConstructingObjectParser<Vocabulary, Void> createParser(boolean ignoreUnknownFields) { - ConstructingObjectParser<Vocabulary, Void> parser = new ConstructingObjectParser<>(NAME, + @SuppressWarnings("unchecked") + private static ConstructingObjectParser<WordPieceVocabulary, Void> createParser(boolean ignoreUnknownFields) { + ConstructingObjectParser<WordPieceVocabulary, Void> parser = new ConstructingObjectParser<>(NAME, ignoreUnknownFields, - a -> new Vocabulary((List<String>) a[0], (Integer) a[1])); + a -> new WordPieceVocabulary((List<String>) a[0], (Integer) a[1])); parser.declareStringArray(ConstructingObjectParser.constructorArg(), VOCAB); - parser.declareInt(ConstructingObjectParser.constructorArg(), UNKNOWN_TOKEN); + parser.declareInt(ConstructingObjectParser.optionalConstructorArg(), UNKNOWN_TOKEN); return parser; } - public static Vocabulary fromXContent(XContentParser parser, boolean lenient) { + public static WordPieceVocabulary fromXContent(XContentParser parser, boolean lenient) { return lenient ? LENIENT_PARSER.apply(parser, null) : STRICT_PARSER.apply(parser, null); } private final SortedMap<String, Integer> vocab; private final int unknownToken; - public Vocabulary(List<String> words, int unknownToken) { - this.unknownToken = unknownToken; + public WordPieceVocabulary(List<String> words, Integer unknownToken) { + this.unknownToken = unknownToken == null ? -1 : unknownToken; vocab = new TreeMap<>(); for (int i = 0; i < words.size(); i++) { vocab.put(words.get(i), i); @@ -71,7 +72,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - Vocabulary that = (Vocabulary) o; + WordPieceVocabulary that = (WordPieceVocabulary) o; return unknownToken == that.unknownToken && Objects.equals(vocab, that.vocab); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pytorch/process/NativePyTorchProcess.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pytorch/process/NativePyTorchProcess.java index 38424baad3129..67710e6845dc1 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pytorch/process/NativePyTorchProcess.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pytorch/process/NativePyTorchProcess.java @@ -8,6 +8,7 @@ package org.elasticsearch.xpack.ml.inference.pytorch.process; import org.elasticsearch.action.ActionListener; +import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.xcontent.NamedXContentRegistry; import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; import org.elasticsearch.xpack.ml.process.AbstractNativeProcess; @@ -57,8 +58,8 @@ public Iterator<PyTorchResult> readResults() { return resultsParser.parseResults(processOutStream()); } - public void writeInferenceRequest(String jsonDoc) throws IOException { - processInStream().write(jsonDoc.getBytes(StandardCharsets.UTF_8)); + public void writeInferenceRequest(BytesReference jsonRequest) throws IOException { + processInStream().write(jsonRequest.array(), jsonRequest.arrayOffset(), jsonRequest.length()); processInStream().flush(); } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/NlpPipeline.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/NlpPipeline.java deleted file mode 100644 index dc7ce23b9e6e6..0000000000000 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/NlpPipeline.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -package org.elasticsearch.xpack.ml.inference.tokenisation; - -public class NlpPipeline { - - private TaskType taskType; - - // tokenser - // request builder - - /** - * Return the request - * @param inputs - * @return - */ - public String process(String inputs) { - // tokenise - return ""; - } - -} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/TaskType.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/TaskType.java deleted file mode 100644 index 630a58065fdac..0000000000000 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/tokenisation/TaskType.java +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -package org.elasticsearch.xpack.ml.inference.tokenisation; - -public enum TaskType { - TOKEN_CLASSIFICATION -} diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskTypeTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskTypeTests.java new file mode 100644 index 0000000000000..7daaff2307071 --- /dev/null +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskTypeTests.java @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.test.ESTestCase; + +import java.io.IOException; + +public class TaskTypeTests extends ESTestCase { + + public void testTokenClassificationJsonRequest() throws IOException { + String requestId = "foo"; + int [] tokens = new int[] {100, 101, 102, 103, 104}; + BytesReference bytesReference = TaskType.TOKEN_CLASSIFICATION.jsonRequest(tokens, requestId); + + String jsonDoc = bytesReference.utf8ToString(); + assertEquals( + "{\"request_id\":\"foo\",\"tokens\":[100,101,102,103,104],\"arg_1\":[1,1,1,1,1],\"arg_2\":[0,0,0,0,0],\"arg_3\":[0,1,2,3,4]}", + jsonDoc); + } +} diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizerTests.java new file mode 100644 index 0000000000000..309430d082807 --- /dev/null +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizerTests.java @@ -0,0 +1,164 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; + +import org.elasticsearch.test.ESTestCase; + +import java.util.Collections; +import java.util.List; + +import static org.hamcrest.Matchers.arrayContaining; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.sameInstance; + +/** + * Some test cases taken from + * https://github.com/huggingface/transformers/blob/ba8c4d0ac04acfcdbdeaed954f698d6d5ec3e532/tests/test_tokenization_bert.py + */ +public class BasicTokenizerTests extends ESTestCase { + + public void testLowerCase() { + BasicTokenizer tokenizer = new BasicTokenizer(); + List<String> tokens = tokenizer.tokenize(" \tHeLLo!how \n Are yoU? "); + assertThat(tokens, contains("hello", "!", "how", "are", "you", "?")); + + tokens = tokenizer.tokenize("H\u00E9llo"); + assertThat(tokens, contains("hello")); + } + + public void testLowerCaseWithoutStripAccents() { + BasicTokenizer tokenizer = new BasicTokenizer(true, true, false); + List<String> tokens = tokenizer.tokenize(" \tHäLLo!how \n Are yoU? "); + assertThat(tokens, contains("hällo", "!", "how", "are", "you", "?")); + + tokens = tokenizer.tokenize("H\u00E9llo"); + assertThat(tokens, contains("h\u00E9llo")); + } + + public void testLowerCaseStripAccentsDefault() { + BasicTokenizer tokenizer = new BasicTokenizer(true, true); + List<String> tokens = tokenizer.tokenize(" \tHäLLo!how \n Are yoU? "); + assertThat(tokens, contains("hallo", "!", "how", "are", "you", "?")); + + tokens = tokenizer.tokenize("H\u00E9llo"); + assertThat(tokens, contains("hello")); + } + + public void testNoLower() { + List<String> tokens = new BasicTokenizer(false, true, false).tokenize(" \tHäLLo!how \n Are yoU? "); + assertThat(tokens, contains("HäLLo", "!", "how", "Are", "yoU", "?")); + } + + public void testNoLowerStripAccents() { + List<String> tokens = new BasicTokenizer(false, true, true).tokenize(" \tHäLLo!how \n Are yoU? "); + assertThat(tokens, contains("HaLLo", "!", "how", "Are", "yoU", "?")); + } + + public void testNeverSplit() { + BasicTokenizer tokenizer = new BasicTokenizer(false, false, false, Collections.singleton("[UNK]")); + List<String> tokens = tokenizer.tokenize(" \tHeLLo!how \n Are yoU? [UNK]"); + assertThat(tokens, contains("HeLLo", "!", "how", "Are", "yoU", "?", "[UNK]")); + + } + + public void testSplitOnPunctuation() { + List<String> tokens = BasicTokenizer.splitOnPunctuation("hi!"); + assertThat(tokens, contains("hi", "!")); + + tokens = BasicTokenizer.splitOnPunctuation("!hi"); + assertThat(tokens, contains("!", "hi")); + + tokens = BasicTokenizer.splitOnPunctuation("don't"); + assertThat(tokens, contains("don", "'", "t")); + + tokens = BasicTokenizer.splitOnPunctuation("!!hi"); + assertThat(tokens, contains("!", "!", "hi")); + + tokens = BasicTokenizer.splitOnPunctuation("[hi]"); + assertThat(tokens, contains("[", "hi", "]")); + } + + public void testStripAccents() { + assertEquals("Hallo", BasicTokenizer.stripAccents("Hällo")); + } + + public void testTokenizeCjkChars() { + assertEquals(" \u535A \u63A8 ", BasicTokenizer.tokenizeCjkChars("\u535A\u63A8")); + + String noCjkChars = "hello"; + assertThat(BasicTokenizer.tokenizeCjkChars(noCjkChars), sameInstance(noCjkChars)); + } + + public void testTokenizeChinese() { + List<String> tokens = new BasicTokenizer().tokenize("ah\u535A\u63A8zz"); + assertThat(tokens, contains("ah", "\u535A", "\u63A8", "zz")); + } + + public void testCleanText() { + assertEquals("change these chars to spaces", + BasicTokenizer.cleanText("change\tthese chars\rto\nspaces")); + assertEquals("filter control chars", + BasicTokenizer.cleanText("\u0000filter \uFFFDcontrol chars\u0005")); + } + + public void testWhiteSpaceTokenize() { + assertThat(BasicTokenizer.whiteSpaceTokenize("nochange"), arrayContaining("nochange")); + assertThat(BasicTokenizer.whiteSpaceTokenize(" some change "), arrayContaining("some", "", "change")); + } + + public void testIsWhitespace() { + assertTrue(BasicTokenizer.isWhiteSpace(' ')); + assertTrue(BasicTokenizer.isWhiteSpace('\t')); + assertTrue(BasicTokenizer.isWhiteSpace('\r')); + assertTrue(BasicTokenizer.isWhiteSpace('\n')); + assertTrue(BasicTokenizer.isWhiteSpace('\u00A0')); + + assertFalse(BasicTokenizer.isWhiteSpace('_')); + assertFalse(BasicTokenizer.isWhiteSpace('A')); + } + + public void testIsControl() { + assertTrue(BasicTokenizer.isControlChar('\u0005')); + assertTrue(BasicTokenizer.isControlChar('\u001C')); + + assertFalse(BasicTokenizer.isControlChar('A')); + assertFalse(BasicTokenizer.isControlChar(' ')); + assertFalse(BasicTokenizer.isControlChar('\t')); + assertFalse(BasicTokenizer.isControlChar('\r')); + } + + public void testIsPunctuation() { + assertTrue(BasicTokenizer.isPunctuation('-')); + assertTrue(BasicTokenizer.isPunctuation('$')); + assertTrue(BasicTokenizer.isPunctuation('`')); + assertTrue(BasicTokenizer.isPunctuation('.')); + + assertFalse(BasicTokenizer.isPunctuation(' ')); + assertFalse(BasicTokenizer.isPunctuation('A')); + } + + public void testIsCjkChar() { + assertTrue(BasicTokenizer.isCjkChar(0x3400)); + assertFalse(BasicTokenizer.isCjkChar(0x4DC0)); + + assertTrue(BasicTokenizer.isCjkChar(0xF900)); + assertFalse(BasicTokenizer.isCjkChar(0xFB00)); + + assertTrue(BasicTokenizer.isCjkChar(0x20000)); + assertFalse(BasicTokenizer.isCjkChar(0x2A6E0)); + + assertTrue(BasicTokenizer.isCjkChar(0x20000)); + assertFalse(BasicTokenizer.isCjkChar(0x2A6E0)); + + assertTrue(BasicTokenizer.isCjkChar(0x2A700)); + assertFalse(BasicTokenizer.isCjkChar(0x2CEB0)); + + assertTrue(BasicTokenizer.isCjkChar(0x2F800)); + assertFalse(BasicTokenizer.isCjkChar(0x2FA20)); + } +} diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java new file mode 100644 index 0000000000000..b9d39c901be89 --- /dev/null +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; + +import org.elasticsearch.test.ESTestCase; + +import java.util.Collections; + +import static org.hamcrest.Matchers.contains; + +public class BertTokenizerTests extends ESTestCase { + + public void testTokenize() { + BertTokenizer tokenizer = BertTokenizer.builder( + WordPieceTokenizerTests.createVocabMap("elastic", "##search", "fun")) + .build(); + + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun"); + assertThat(tokenization.getTokens(), contains("elastic", "##search", "fun")); + assertArrayEquals(new int[] {0, 1, 2}, tokenization.getTokenIds()); + assertArrayEquals(new int[] {0, 0, 1}, tokenization.getTokenMap()); + } + + public void testNeverSplitTokens() { + final String specialToken = "SP001"; + + BertTokenizer tokenizer = BertTokenizer.builder( + WordPieceTokenizerTests.createVocabMap("elastic", "##search", "fun", specialToken, BertTokenizer.UNKNOWN_TOKEN)) + .setNeverSplit(Collections.singleton(specialToken)) + .build(); + + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch " + specialToken + " fun"); + assertThat(tokenization.getTokens(), contains("elastic", "##search", specialToken, "fun")); + assertArrayEquals(new int[] {0, 1, 3, 2}, tokenization.getTokenIds()); + assertArrayEquals(new int[] {0, 0, 1, 2}, tokenization.getTokenMap()); + } + + public void testDoLowerCase() { + { + BertTokenizer tokenizer = BertTokenizer.builder( + WordPieceTokenizerTests.createVocabMap("elastic", "##search", "fun", BertTokenizer.UNKNOWN_TOKEN)) + .setDoLowerCase(false) + .build(); + + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun"); + assertThat(tokenization.getTokens(), contains(BertTokenizer.UNKNOWN_TOKEN, "fun")); + assertArrayEquals(new int[] {3, 2}, tokenization.getTokenIds()); + assertArrayEquals(new int[] {0, 1}, tokenization.getTokenMap()); + + tokenization = tokenizer.tokenize("elasticsearch fun"); + assertThat(tokenization.getTokens(), contains("elastic", "##search", "fun")); + } + + { + BertTokenizer tokenizer = BertTokenizer.builder( + WordPieceTokenizerTests.createVocabMap("elastic", "##search", "fun")) + .setDoLowerCase(true) + .build(); + + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun"); + assertThat(tokenization.getTokens(), contains("elastic", "##search", "fun")); + } + } +} diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizerTests.java new file mode 100644 index 0000000000000..f16e32961ec9c --- /dev/null +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizerTests.java @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; + +import org.elasticsearch.test.ESTestCase; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.empty; + +public class WordPieceTokenizerTests extends ESTestCase { + + public static final String UNKNOWN_TOKEN = "[UNK]"; + + public void testTokenize() { + Map<String, Integer> vocabMap = + createVocabMap(UNKNOWN_TOKEN, "[CLS]", "[SEP]", "want", "##want", "##ed", "wa", "un", "runn", "##ing"); + WordPieceTokenizer tokenizer = new WordPieceTokenizer(vocabMap, UNKNOWN_TOKEN, 100); + + List<WordPieceTokenizer.TokenAndId> tokenAndIds = tokenizer.tokenize(""); + assertThat(tokenAndIds, empty()); + + tokenAndIds = tokenizer.tokenize("unwanted running"); + List<String> tokens = tokenAndIds.stream().map(WordPieceTokenizer.TokenAndId::getToken).collect(Collectors.toList()); + assertThat(tokens, contains("un", "##want", "##ed", "runn", "##ing")); + + tokenAndIds = tokenizer.tokenize("unwantedX running"); + tokens = tokenAndIds.stream().map(WordPieceTokenizer.TokenAndId::getToken).collect(Collectors.toList()); + assertThat(tokens, contains(UNKNOWN_TOKEN, "runn", "##ing")); + } + + public void testMaxCharLength() { + Map<String, Integer> vocabMap = createVocabMap("Some", "words", "will", "become", "UNK"); + + WordPieceTokenizer tokenizer = new WordPieceTokenizer(vocabMap, "UNK", 4); + List<WordPieceTokenizer.TokenAndId> tokenAndIds = tokenizer.tokenize("Some words will become UNK"); + List<String> tokens = tokenAndIds.stream().map(WordPieceTokenizer.TokenAndId::getToken).collect(Collectors.toList()); + assertThat(tokens, contains("Some", "UNK", "will", "UNK", "UNK")); + } + + static Map<String, Integer> createVocabMap(String ... words) { + Map<String, Integer> vocabMap = new HashMap<>(); + for (int i=0; i<words.length; i++) { + vocabMap.put(words[i], i); + } + return vocabMap; + } +} From ea665e4bbd0aad696812966e34b220206d8fe508 Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Wed, 5 May 2021 09:27:12 +0100 Subject: [PATCH 03/21] Pass 'inputs' to infer request instead of the big whole doc --- .../InferTrainedModelDeploymentAction.java | 50 +- ...portInferTrainedModelDeploymentAction.java | 2 +- .../deployment/DeploymentManager.java | 12 +- .../TrainedModelDeploymentTask.java | 4 +- .../ml/inference/pipelines/nlp/TaskType.java | 1 - ...RestInferTrainedModelDeploymentAction.java | 9 +- .../nlp/tokenizers/BertTokenizerTests.java | 5292 +++++++++++++++++ 7 files changed, 5334 insertions(+), 36 deletions(-) diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferTrainedModelDeploymentAction.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferTrainedModelDeploymentAction.java index 1e4770baefc28..78ff743dd13b3 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferTrainedModelDeploymentAction.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferTrainedModelDeploymentAction.java @@ -10,12 +10,15 @@ import org.elasticsearch.action.ActionType; import org.elasticsearch.action.support.tasks.BaseTasksRequest; import org.elasticsearch.action.support.tasks.BaseTasksResponse; +import org.elasticsearch.common.ParseField; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.common.xcontent.ObjectParser; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.tasks.Task; import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; @@ -36,53 +39,57 @@ public InferTrainedModelDeploymentAction() { public static class Request extends BaseTasksRequest<Request> implements ToXContentObject { - public static final String REQUEST_ID = "request_id"; public static final String DEPLOYMENT_ID = "deployment_id"; - public static final String JSON_REQUEST = "json_request"; + public static final ParseField INPUTS = new ParseField("inputs"); + + private static final ObjectParser<Request, Void> PARSER = new ObjectParser<>(NAME, Request::new); + static { + PARSER.declareString((request, inputs) -> request.inputs = inputs, INPUTS); + } + + public static Request parseRequest(String deploymentId, XContentParser parser) { + Request r = PARSER.apply(parser, null); + r.deploymentId = deploymentId; + return r; + } private String deploymentId; - private String requestId; - private String jsonDoc; + private String inputs; - public Request(String deploymentId, String requestId, String jsonDoc) { + private Request() { + } + + public Request(String deploymentId, String inputs) { this.deploymentId = Objects.requireNonNull(deploymentId); - this.requestId = requestId; - this.jsonDoc = Objects.requireNonNull(jsonDoc); + this.inputs = Objects.requireNonNull(inputs); } public Request(StreamInput in) throws IOException { super(in); deploymentId = in.readString(); - requestId = in.readOptionalString(); - jsonDoc = in.readString(); + inputs = in.readString(); } public String getDeploymentId() { return deploymentId; } - public String getRequestId() { - return requestId; - } - - public String getJsonDoc() { - return jsonDoc; + public String getInputs() { + return inputs; } @Override public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); out.writeString(deploymentId); - out.writeOptionalString(requestId); - out.writeString(jsonDoc); + out.writeString(inputs); } @Override public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params params) throws IOException { builder.startObject(); builder.field(DEPLOYMENT_ID, deploymentId); - builder.field(REQUEST_ID, requestId); - builder.field(JSON_REQUEST, jsonDoc); + builder.field(INPUTS.getPreferredName(), inputs); builder.endObject(); return builder; } @@ -98,13 +105,12 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; InferTrainedModelDeploymentAction.Request that = (InferTrainedModelDeploymentAction.Request) o; return Objects.equals(deploymentId, that.deploymentId) - && Objects.equals(requestId, that.requestId) - && Objects.equals(jsonDoc, that.jsonDoc); + && Objects.equals(inputs, that.inputs); } @Override public int hashCode() { - return Objects.hash(deploymentId, requestId, jsonDoc); + return Objects.hash(deploymentId, inputs); } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java index 454f35c1069d4..c3b31f8e62ebe 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java @@ -70,7 +70,7 @@ protected InferTrainedModelDeploymentAction.Response newResponse(InferTrainedMod @Override protected void taskOperation(InferTrainedModelDeploymentAction.Request request, TrainedModelDeploymentTask task, ActionListener<InferTrainedModelDeploymentAction.Response> listener) { - task.infer(request.getRequestId(), request.getJsonDoc(), + task.infer(request.getInputs(), ActionListener.wrap( pyTorchResult -> listener.onResponse(new InferTrainedModelDeploymentAction.Response(pyTorchResult)), listener::onFailure) diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java index 21afae47269ef..7c69587492881 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java @@ -105,6 +105,7 @@ private void doStartDeployment(TrainedModelDeploymentTask task) { ActionListener<SearchResponse> configListener = ActionListener.wrap( searchResponse -> { + logger.info("search response"); if (searchResponse.getHits().getHits().length == 0) { failTask(task, new ResourceNotFoundException( Messages.getMessage(Messages.PIPELINE_CONFIG_NOT_FOUND, task.getModelId()))); @@ -113,6 +114,7 @@ private void doStartDeployment(TrainedModelDeploymentTask task) { PipelineConfig config = parseModelDefinitionDocLeniently(searchResponse.getHits().getAt(0)); NlpPipeline pipeline = NlpPipeline.fromConfig(config); + logger.info("loaded pipeline"); processContext.pipeline.set(pipeline); processContext.startProcess(); processContext.loadModel(modelLoadedListener); @@ -121,6 +123,7 @@ private void doStartDeployment(TrainedModelDeploymentTask task) { e -> failTask(task, e) ); + logger.info("looking for config " + PipelineConfig.documentId(task.getModelId())); SearchRequest searchRequest = pipelineConfigSearchRequest(task.getModelId(), task.getIndex()); executeAsyncWithOrigin(client, ML_ORIGIN, SearchAction.INSTANCE, searchRequest, configListener); } @@ -159,10 +162,10 @@ public void stopDeployment(TrainedModelDeploymentTask task) { } } - public void infer(TrainedModelDeploymentTask task, String requestId, String inputs, ActionListener<PyTorchResult> listener) { + public void infer(TrainedModelDeploymentTask task, String inputs, ActionListener<PyTorchResult> listener) { ProcessContext processContext = processContextByAllocation.get(task.getAllocationId()); - final String resolvedId = requestId == null ? String.valueOf(requestIdCounter.getAndIncrement()) : requestId; + final String requestId = String.valueOf(requestIdCounter.getAndIncrement()); executorServiceForProcess.execute(new AbstractRunnable() { @Override @@ -173,8 +176,8 @@ public void onFailure(Exception e) { @Override protected void doRun() { try { - processContext.infer(inputs, resolvedId); - waitForResult(processContext, resolvedId, listener); + processContext.infer(inputs, requestId); + waitForResult(processContext, requestId, listener); } catch (IOException e) { logger.error(new ParameterizedMessage("[{}] error writing to process", processContext.modelId), e); onFailure(ExceptionsHelper.serverError("error writing to process", e)); @@ -222,6 +225,7 @@ class ProcessContext { void infer(String inputs, String requestId) throws IOException { BytesReference request = pipeline.get().createRequest(inputs, requestId); + logger.info("I Request "+ request.utf8ToString()); process.get().writeInferenceRequest(request); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java index 090ef248b6fea..3b88befdc94ec 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java @@ -60,7 +60,7 @@ protected void onCancelled() { stop(reason); } - public void infer(String requestId, String jsonDoc, ActionListener<PyTorchResult> listener) { - manager.infer(this, requestId, jsonDoc, listener); + public void infer(String inputs, ActionListener<PyTorchResult> listener) { + manager.infer(this, inputs, listener); } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java index 0ebd3260677d4..b6fd37dd96326 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java @@ -10,7 +10,6 @@ import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.xpack.core.ml.inference.TrainedModelType; import java.io.IOException; import java.util.Arrays; diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/rest/inference/RestInferTrainedModelDeploymentAction.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/rest/inference/RestInferTrainedModelDeploymentAction.java index d5f8a1b3ab817..d1730aaef0043 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/rest/inference/RestInferTrainedModelDeploymentAction.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/rest/inference/RestInferTrainedModelDeploymentAction.java @@ -41,14 +41,11 @@ public List<Route> routes() { @Override protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException { String deploymentId = restRequest.param(TrainedModelConfig.MODEL_ID.getPreferredName()); - String requestID = restRequest.param(InferTrainedModelDeploymentAction.Request.REQUEST_ID); - InferTrainedModelDeploymentAction.Request request; - if (restRequest.hasContent()) { - String content = restRequest.content().utf8ToString(); - request = new InferTrainedModelDeploymentAction.Request(deploymentId, requestID, content); - } else { + if (restRequest.hasContent() == false) { throw ExceptionsHelper.badRequestException("requires body"); } + InferTrainedModelDeploymentAction.Request request = + InferTrainedModelDeploymentAction.Request.parseRequest(deploymentId, restRequest.contentParser()); return channel -> client.execute(InferTrainedModelDeploymentAction.INSTANCE, request, new RestToXContentListener<>(channel)); } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java index b9d39c901be89..9021f18e8a60a 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java @@ -10,6 +10,9 @@ import org.elasticsearch.test.ESTestCase; import java.util.Collections; +import java.util.List; +import java.util.SortedMap; +import java.util.TreeMap; import static org.hamcrest.Matchers.contains; @@ -26,6 +29,22 @@ public void testTokenize() { assertArrayEquals(new int[] {0, 0, 1}, tokenization.getTokenMap()); } + public void testBertVocab() { + BertTokenizer tokenizer = BertTokenizer.builder(vocabMap(bertVocab())).build(); + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Jim bought 300 shares of Acme Corp. in 2006"); + + assertArrayEquals(new int[] {101, 3104, 3306, 3127, 6117, 1104, 138, 1665, 3263, 13619, 119, 1107, 1386, 102}, + tokenization.getTokenIds()); + } + + private SortedMap<String, Integer> vocabMap(String[] vocabulary) { + SortedMap<String, Integer> vocab = new TreeMap<>(); + for (int i = 0; i < vocabulary.length; i++) { + vocab.put(vocabulary[i], i); + } + return vocab; + } + public void testNeverSplitTokens() { final String specialToken = "SP001"; @@ -66,4 +85,5277 @@ public void testDoLowerCase() { assertThat(tokenization.getTokens(), contains("elastic", "##search", "fun")); } } + + private String [] bertVocab() { + return new String [] + { + "[PAD]", + "[unused0]", + "[unused1]", + "[unused2]", + "[unused3]", + "[unused4]", + "[unused5]", + "[unused6]", + "[unused7]", + "[unused8]", + "[unused9]", + "[unused10]", + "[unused11]", + "[unused12]", + "[unused13]", + "[unused14]", + "[unused15]", + "[unused16]", + "[unused17]", + "[unused18]", + "[unused19]", + "[unused20]", + "[unused21]", + "[unused22]", + "[unused23]", + "[unused24]", + "[unused25]", + "[unused26]", + "[unused27]", + "[unused28]", + "[unused29]", + "[unused30]", + "[unused31]", + "[unused32]", + "[unused33]", + "[unused34]", + "[unused35]", + "[unused36]", + "[unused37]", + "[unused38]", + "[unused39]", + "[unused40]", + "[unused41]", + "[unused42]", + "[unused43]", + "[unused44]", + "[unused45]", + "[unused46]", + "[unused47]", + "[unused48]", + "[unused49]", + "[unused50]", + "[unused51]", + "[unused52]", + "[unused53]", + "[unused54]", + "[unused55]", + "[unused56]", + "[unused57]", + "[unused58]", + "[unused59]", + "[unused60]", + "[unused61]", + "[unused62]", + "[unused63]", + "[unused64]", + "[unused65]", + "[unused66]", + "[unused67]", + "[unused68]", + "[unused69]", + "[unused70]", + "[unused71]", + "[unused72]", + "[unused73]", + "[unused74]", + "[unused75]", + "[unused76]", + "[unused77]", + "[unused78]", + "[unused79]", + "[unused80]", + "[unused81]", + "[unused82]", + "[unused83]", + "[unused84]", + "[unused85]", + "[unused86]", + "[unused87]", + "[unused88]", + "[unused89]", + "[unused90]", + "[unused91]", + "[unused92]", + "[unused93]", + "[unused94]", + "[unused95]", + "[unused96]", + "[unused97]", + "[unused98]", + "[UNK]", + "[CLS]", + "[SEP]", + "[MASK]", + "[unused99]", + "[unused100]", + "[unused101]", + "[unused102]", + "[unused103]", + "[unused104]", + "[unused105]", + "[unused106]", + "[unused107]", + "[unused108]", + "[unused109]", + "[unused110]", + "[unused111]", + "[unused112]", + "[unused113]", + "[unused114]", + "[unused115]", + "[unused116]", + "[unused117]", + "[unused118]", + "[unused119]", + "[unused120]", + "[unused121]", + "[unused122]", + "[unused123]", + "[unused124]", + "[unused125]", + "[unused126]", + "[unused127]", + "[unused128]", + "[unused129]", + "[unused130]", + "[unused131]", + "[unused132]", + "[unused133]", + "[unused134]", + "[unused135]", + "[unused136]", + "[unused137]", + "[unused138]", + "[unused139]", + "[unused140]", + "[unused141]", + "[unused142]", + "[unused143]", + "[unused144]", + "[unused145]", + "[unused146]", + "[unused147]", + "[unused148]", + "[unused149]", + "[unused150]", + "[unused151]", + "[unused152]", + "[unused153]", + "[unused154]", + "[unused155]", + "[unused156]", + "[unused157]", + "[unused158]", + "[unused159]", + "[unused160]", + "[unused161]", + "[unused162]", + "[unused163]", + "[unused164]", + "[unused165]", + "[unused166]", + "[unused167]", + "[unused168]", + "[unused169]", + "[unused170]", + "[unused171]", + "[unused172]", + "[unused173]", + "[unused174]", + "[unused175]", + "[unused176]", + "[unused177]", + "[unused178]", + "[unused179]", + "[unused180]", + "[unused181]", + "[unused182]", + "[unused183]", + "[unused184]", + "[unused185]", + "[unused186]", + "[unused187]", + "[unused188]", + "[unused189]", + "[unused190]", + "[unused191]", + "[unused192]", + "[unused193]", + "[unused194]", + "[unused195]", + "[unused196]", + "[unused197]", + "[unused198]", + "[unused199]", + "[unused200]", + "[unused201]", + "[unused202]", + "[unused203]", + "[unused204]", + "[unused205]", + "[unused206]", + "[unused207]", + "[unused208]", + "[unused209]", + "[unused210]", + "[unused211]", + "[unused212]", + "[unused213]", + "[unused214]", + "[unused215]", + "[unused216]", + "[unused217]", + "[unused218]", + "[unused219]", + "[unused220]", + "[unused221]", + "[unused222]", + "[unused223]", + "[unused224]", + "[unused225]", + "[unused226]", + "[unused227]", + "[unused228]", + "[unused229]", + "[unused230]", + "[unused231]", + "[unused232]", + "[unused233]", + "[unused234]", + "[unused235]", + "[unused236]", + "[unused237]", + "[unused238]", + "[unused239]", + "[unused240]", + "[unused241]", + "[unused242]", + "[unused243]", + "[unused244]", + "[unused245]", + "[unused246]", + "[unused247]", + "[unused248]", + "[unused249]", + "[unused250]", + "[unused251]", + "[unused252]", + "[unused253]", + "[unused254]", + "[unused255]", + "[unused256]", + "[unused257]", + "[unused258]", + "[unused259]", + "[unused260]", + "[unused261]", + "[unused262]", + "[unused263]", + "[unused264]", + "[unused265]", + "[unused266]", + "[unused267]", + "[unused268]", + "[unused269]", + "[unused270]", + "[unused271]", + "[unused272]", + "[unused273]", + "[unused274]", + "[unused275]", + "[unused276]", + "[unused277]", + "[unused278]", + "[unused279]", + "[unused280]", + "[unused281]", + "[unused282]", + "[unused283]", + "[unused284]", + "[unused285]", + "[unused286]", + "[unused287]", + "[unused288]", + "[unused289]", + "[unused290]", + "[unused291]", + "[unused292]", + "[unused293]", + "[unused294]", + "[unused295]", + "[unused296]", + "[unused297]", + "[unused298]", + "[unused299]", + "[unused300]", + "[unused301]", + "[unused302]", + "[unused303]", + "[unused304]", + "[unused305]", + "[unused306]", + "[unused307]", + "[unused308]", + "[unused309]", + "[unused310]", + "[unused311]", + "[unused312]", + "[unused313]", + "[unused314]", + "[unused315]", + "[unused316]", + "[unused317]", + "[unused318]", + "[unused319]", + "[unused320]", + "[unused321]", + "[unused322]", + "[unused323]", + "[unused324]", + "[unused325]", + "[unused326]", + "[unused327]", + "[unused328]", + "[unused329]", + "[unused330]", + "[unused331]", + "[unused332]", + "[unused333]", + "[unused334]", + "[unused335]", + "[unused336]", + "[unused337]", + "[unused338]", + "[unused339]", + "[unused340]", + "[unused341]", + "[unused342]", + "[unused343]", + "[unused344]", + "[unused345]", + "[unused346]", + "[unused347]", + "[unused348]", + "[unused349]", + "[unused350]", + "[unused351]", + "[unused352]", + "[unused353]", + "[unused354]", + "[unused355]", + "[unused356]", + "[unused357]", + "[unused358]", + "[unused359]", + "[unused360]", + "[unused361]", + "[unused362]", + "[unused363]", + "[unused364]", + "[unused365]", + "[unused366]", + "[unused367]", + "[unused368]", + "[unused369]", + "[unused370]", + "[unused371]", + "[unused372]", + "[unused373]", + "[unused374]", + "[unused375]", + "[unused376]", + "[unused377]", + "[unused378]", + "[unused379]", + "[unused380]", + "[unused381]", + "[unused382]", + "[unused383]", + "[unused384]", + "[unused385]", + "[unused386]", + "[unused387]", + "[unused388]", + "[unused389]", + "[unused390]", + "[unused391]", + "[unused392]", + "[unused393]", + "[unused394]", + "[unused395]", + "[unused396]", + "[unused397]", + "[unused398]", + "[unused399]", + "[unused400]", + "[unused401]", + "[unused402]", + "[unused403]", + "[unused404]", + "[unused405]", + "[unused406]", + "[unused407]", + "[unused408]", + "[unused409]", + "[unused410]", + "[unused411]", + "[unused412]", + "[unused413]", + "[unused414]", + "[unused415]", + "[unused416]", + "[unused417]", + "[unused418]", + "[unused419]", + "[unused420]", + "[unused421]", + "[unused422]", + "[unused423]", + "[unused424]", + "[unused425]", + "[unused426]", + "[unused427]", + "[unused428]", + "[unused429]", + "[unused430]", + "[unused431]", + "[unused432]", + "[unused433]", + "[unused434]", + "[unused435]", + "[unused436]", + "[unused437]", + "[unused438]", + "[unused439]", + "[unused440]", + "[unused441]", + "[unused442]", + "[unused443]", + "[unused444]", + "[unused445]", + "[unused446]", + "[unused447]", + "[unused448]", + "[unused449]", + "[unused450]", + "[unused451]", + "[unused452]", + "[unused453]", + "[unused454]", + "[unused455]", + "[unused456]", + "[unused457]", + "[unused458]", + "[unused459]", + "[unused460]", + "[unused461]", + "[unused462]", + "[unused463]", + "[unused464]", + "[unused465]", + "[unused466]", + "[unused467]", + "[unused468]", + "[unused469]", + "[unused470]", + "[unused471]", + "[unused472]", + "[unused473]", + "[unused474]", + "[unused475]", + "[unused476]", + "[unused477]", + "[unused478]", + "[unused479]", + "[unused480]", + "[unused481]", + "[unused482]", + "[unused483]", + "[unused484]", + "[unused485]", + "[unused486]", + "[unused487]", + "[unused488]", + "[unused489]", + "[unused490]", + "[unused491]", + "[unused492]", + "[unused493]", + "[unused494]", + "[unused495]", + "[unused496]", + "[unused497]", + "[unused498]", + "[unused499]", + "[unused500]", + "[unused501]", + "[unused502]", + "[unused503]", + "[unused504]", + "[unused505]", + "[unused506]", + "[unused507]", + "[unused508]", + "[unused509]", + "[unused510]", + "[unused511]", + "[unused512]", + "[unused513]", + "[unused514]", + "[unused515]", + "[unused516]", + "[unused517]", + "[unused518]", + "[unused519]", + "[unused520]", + "[unused521]", + "[unused522]", + "[unused523]", + "[unused524]", + "[unused525]", + "[unused526]", + "[unused527]", + "[unused528]", + "[unused529]", + "[unused530]", + "[unused531]", + "[unused532]", + "[unused533]", + "[unused534]", + "[unused535]", + "[unused536]", + "[unused537]", + "[unused538]", + "[unused539]", + "[unused540]", + "[unused541]", + "[unused542]", + "[unused543]", + "[unused544]", + "[unused545]", + "[unused546]", + "[unused547]", + "[unused548]", + "[unused549]", + "[unused550]", + "[unused551]", + "[unused552]", + "[unused553]", + "[unused554]", + "[unused555]", + "[unused556]", + "[unused557]", + "[unused558]", + "[unused559]", + "[unused560]", + "[unused561]", + "[unused562]", + "[unused563]", + "[unused564]", + "[unused565]", + "[unused566]", + "[unused567]", + "[unused568]", + "[unused569]", + "[unused570]", + "[unused571]", + "[unused572]", + "[unused573]", + "[unused574]", + "[unused575]", + "[unused576]", + "[unused577]", + "[unused578]", + "[unused579]", + "[unused580]", + "[unused581]", + "[unused582]", + "[unused583]", + "[unused584]", + "[unused585]", + "[unused586]", + "[unused587]", + "[unused588]", + "[unused589]", + "[unused590]", + "[unused591]", + "[unused592]", + "[unused593]", + "[unused594]", + "[unused595]", + "[unused596]", + "[unused597]", + "[unused598]", + "[unused599]", + "[unused600]", + "[unused601]", + "[unused602]", + "[unused603]", + "[unused604]", + "[unused605]", + "[unused606]", + "[unused607]", + "[unused608]", + "[unused609]", + "[unused610]", + "[unused611]", + "[unused612]", + "[unused613]", + "[unused614]", + "[unused615]", + "[unused616]", + "[unused617]", + "[unused618]", + "[unused619]", + "[unused620]", + "[unused621]", + "[unused622]", + "[unused623]", + "[unused624]", + "[unused625]", + "[unused626]", + "[unused627]", + "[unused628]", + "[unused629]", + "[unused630]", + "[unused631]", + "[unused632]", + "[unused633]", + "[unused634]", + "[unused635]", + "[unused636]", + "[unused637]", + "[unused638]", + "[unused639]", + "[unused640]", + "[unused641]", + "[unused642]", + "[unused643]", + "[unused644]", + "[unused645]", + "[unused646]", + "[unused647]", + "[unused648]", + "[unused649]", + "[unused650]", + "[unused651]", + "[unused652]", + "[unused653]", + "[unused654]", + "[unused655]", + "[unused656]", + "[unused657]", + "[unused658]", + "[unused659]", + "[unused660]", + "[unused661]", + "[unused662]", + "[unused663]", + "[unused664]", + "[unused665]", + "[unused666]", + "[unused667]", + "[unused668]", + "[unused669]", + "[unused670]", + "[unused671]", + "[unused672]", + "[unused673]", + "[unused674]", + "[unused675]", + "[unused676]", + "[unused677]", + "[unused678]", + "[unused679]", + "[unused680]", + "[unused681]", + "[unused682]", + "[unused683]", + "[unused684]", + "[unused685]", + "[unused686]", + "[unused687]", + "[unused688]", + "[unused689]", + "[unused690]", + "[unused691]", + "[unused692]", + "[unused693]", + "[unused694]", + "[unused695]", + "[unused696]", + "[unused697]", + "[unused698]", + "[unused699]", + "[unused700]", + "[unused701]", + "[unused702]", + "[unused703]", + "[unused704]", + "[unused705]", + "[unused706]", + "[unused707]", + "[unused708]", + "[unused709]", + "[unused710]", + "[unused711]", + "[unused712]", + "[unused713]", + "[unused714]", + "[unused715]", + "[unused716]", + "[unused717]", + "[unused718]", + "[unused719]", + "[unused720]", + "[unused721]", + "[unused722]", + "[unused723]", + "[unused724]", + "[unused725]", + "[unused726]", + "[unused727]", + "[unused728]", + "[unused729]", + "[unused730]", + "[unused731]", + "[unused732]", + "[unused733]", + "[unused734]", + "[unused735]", + "[unused736]", + "[unused737]", + "[unused738]", + "[unused739]", + "[unused740]", + "[unused741]", + "[unused742]", + "[unused743]", + "[unused744]", + "[unused745]", + "[unused746]", + "[unused747]", + "[unused748]", + "[unused749]", + "[unused750]", + "[unused751]", + "[unused752]", + "[unused753]", + "[unused754]", + "[unused755]", + "[unused756]", + "[unused757]", + "[unused758]", + "[unused759]", + "[unused760]", + "[unused761]", + "[unused762]", + "[unused763]", + "[unused764]", + "[unused765]", + "[unused766]", + "[unused767]", + "[unused768]", + "[unused769]", + "[unused770]", + "[unused771]", + "[unused772]", + "[unused773]", + "[unused774]", + "[unused775]", + "[unused776]", + "[unused777]", + "[unused778]", + "[unused779]", + "[unused780]", + "[unused781]", + "[unused782]", + "[unused783]", + "[unused784]", + "[unused785]", + "[unused786]", + "[unused787]", + "[unused788]", + "[unused789]", + "[unused790]", + "[unused791]", + "[unused792]", + "[unused793]", + "[unused794]", + "[unused795]", + "[unused796]", + "[unused797]", + "[unused798]", + "[unused799]", + "[unused800]", + "[unused801]", + "[unused802]", + "[unused803]", + "[unused804]", + "[unused805]", + "[unused806]", + "[unused807]", + "[unused808]", + "[unused809]", + "[unused810]", + "[unused811]", + "[unused812]", + "[unused813]", + "[unused814]", + "[unused815]", + "[unused816]", + "[unused817]", + "[unused818]", + "[unused819]", + "[unused820]", + "[unused821]", + "[unused822]", + "[unused823]", + "[unused824]", + "[unused825]", + "[unused826]", + "[unused827]", + "[unused828]", + "[unused829]", + "[unused830]", + "[unused831]", + "[unused832]", + "[unused833]", + "[unused834]", + "[unused835]", + "[unused836]", + "[unused837]", + "[unused838]", + "[unused839]", + "[unused840]", + "[unused841]", + "[unused842]", + "[unused843]", + "[unused844]", + "[unused845]", + "[unused846]", + "[unused847]", + "[unused848]", + "[unused849]", + "[unused850]", + "[unused851]", + "[unused852]", + "[unused853]", + "[unused854]", + "[unused855]", + "[unused856]", + "[unused857]", + "[unused858]", + "[unused859]", + "[unused860]", + "[unused861]", + "[unused862]", + "[unused863]", + "[unused864]", + "[unused865]", + "[unused866]", + "[unused867]", + "[unused868]", + "[unused869]", + "[unused870]", + "[unused871]", + "[unused872]", + "[unused873]", + "[unused874]", + "[unused875]", + "[unused876]", + "[unused877]", + "[unused878]", + "[unused879]", + "[unused880]", + "[unused881]", + "[unused882]", + "[unused883]", + "[unused884]", + "[unused885]", + "[unused886]", + "[unused887]", + "[unused888]", + "[unused889]", + "[unused890]", + "[unused891]", + "[unused892]", + "[unused893]", + "[unused894]", + "[unused895]", + "[unused896]", + "[unused897]", + "[unused898]", + "[unused899]", + "[unused900]", + "[unused901]", + "[unused902]", + "[unused903]", + "[unused904]", + "[unused905]", + "[unused906]", + "[unused907]", + "[unused908]", + "[unused909]", + "[unused910]", + "[unused911]", + "[unused912]", + "[unused913]", + "[unused914]", + "[unused915]", + "[unused916]", + "[unused917]", + "[unused918]", + "[unused919]", + "[unused920]", + "[unused921]", + "[unused922]", + "[unused923]", + "[unused924]", + "[unused925]", + "[unused926]", + "[unused927]", + "[unused928]", + "[unused929]", + "[unused930]", + "[unused931]", + "[unused932]", + "[unused933]", + "[unused934]", + "[unused935]", + "[unused936]", + "[unused937]", + "[unused938]", + "[unused939]", + "[unused940]", + "[unused941]", + "[unused942]", + "[unused943]", + "[unused944]", + "[unused945]", + "[unused946]", + "[unused947]", + "[unused948]", + "[unused949]", + "[unused950]", + "[unused951]", + "[unused952]", + "[unused953]", + "[unused954]", + "[unused955]", + "[unused956]", + "[unused957]", + "[unused958]", + "[unused959]", + "[unused960]", + "[unused961]", + "[unused962]", + "[unused963]", + "[unused964]", + "[unused965]", + "[unused966]", + "[unused967]", + "[unused968]", + "[unused969]", + "[unused970]", + "[unused971]", + "[unused972]", + "[unused973]", + "[unused974]", + "[unused975]", + "[unused976]", + "[unused977]", + "[unused978]", + "[unused979]", + "[unused980]", + "[unused981]", + "[unused982]", + "[unused983]", + "[unused984]", + "[unused985]", + "[unused986]", + "[unused987]", + "[unused988]", + "[unused989]", + "[unused990]", + "[unused991]", + "[unused992]", + "[unused993]", + "!", + "\"", + "#", + "$", + "%", + "&", + "'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "/", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + ":", + ";", + "<", + "=", + ">", + "?", + "@", + "[", + "\\", + "]", + "^", + "_", + "`", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "{", + "|", + "}", + "~", + "¡", + "¢", + "£", + "¤", + "¥", + "¦", + "§", + "¨", + "©", + "ª", + "«", + "¬", + "®", + "°", + "±", + "²", + "³", + "´", + "µ", + "¶", + "·", + "¹", + "º", + "»", + "¼", + "½", + "¾", + "¿", + "×", + "ß", + "æ", + "ð", + "÷", + "ø", + "þ", + "đ", + "ħ", + "ı", + "ł", + "ŋ", + "œ", + "ƒ", + "ɐ", + "ɑ", + "ɒ", + "ɔ", + "ɕ", + "ə", + "ɛ", + "ɡ", + "ɣ", + "ɨ", + "ɪ", + "ɫ", + "ɬ", + "ɯ", + "ɲ", + "ɴ", + "ɹ", + "ɾ", + "ʀ", + "ʁ", + "ʂ", + "ʃ", + "ʉ", + "ʊ", + "ʋ", + "ʌ", + "ʎ", + "ʐ", + "ʑ", + "ʒ", + "ʔ", + "ʰ", + "ʲ", + "ʳ", + "ʷ", + "ʸ", + "ʻ", + "ʼ", + "ʾ", + "ʿ", + "ˈ", + "ː", + "ˡ", + "ˢ", + "ˣ", + "ˤ", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "ς", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "а", + "б", + "в", + "г", + "д", + "е", + "ж", + "з", + "и", + "к", + "л", + "м", + "н", + "о", + "п", + "р", + "с", + "т", + "у", + "ф", + "х", + "ц", + "ч", + "ш", + "щ", + "ъ", + "ы", + "ь", + "э", + "ю", + "я", + "ђ", + "є", + "і", + "ј", + "љ", + "њ", + "ћ", + "ӏ", + "ա", + "բ", + "գ", + "դ", + "ե", + "թ", + "ի", + "լ", + "կ", + "հ", + "մ", + "յ", + "ն", + "ո", + "պ", + "ս", + "վ", + "տ", + "ր", + "ւ", + "ք", + "־", + "א", + "ב", + "ג", + "ד", + "ה", + "ו", + "ז", + "ח", + "ט", + "י", + "ך", + "כ", + "ל", + "ם", + "מ", + "ן", + "נ", + "ס", + "ע", + "ף", + "פ", + "ץ", + "צ", + "ק", + "ר", + "ש", + "ת", + "،", + "ء", + "ا", + "ب", + "ة", + "ت", + "ث", + "ج", + "ح", + "خ", + "د", + "ذ", + "ر", + "ز", + "س", + "ش", + "ص", + "ض", + "ط", + "ظ", + "ع", + "غ", + "ـ", + "ف", + "ق", + "ك", + "ل", + "م", + "ن", + "ه", + "و", + "ى", + "ي", + "ٹ", + "پ", + "چ", + "ک", + "گ", + "ں", + "ھ", + "ہ", + "ی", + "ے", + "अ", + "आ", + "उ", + "ए", + "क", + "ख", + "ग", + "च", + "ज", + "ट", + "ड", + "ण", + "त", + "थ", + "द", + "ध", + "न", + "प", + "ब", + "भ", + "म", + "य", + "र", + "ल", + "व", + "श", + "ष", + "स", + "ह", + "ा", + "ि", + "ी", + "ो", + "।", + "॥", + "ং", + "অ", + "আ", + "ই", + "উ", + "এ", + "ও", + "ক", + "খ", + "গ", + "চ", + "ছ", + "জ", + "ট", + "ড", + "ণ", + "ত", + "থ", + "দ", + "ধ", + "ন", + "প", + "ব", + "ভ", + "ম", + "য", + "র", + "ল", + "শ", + "ষ", + "স", + "হ", + "া", + "ি", + "ী", + "ে", + "க", + "ச", + "ட", + "த", + "ந", + "ன", + "ப", + "ம", + "ய", + "ர", + "ல", + "ள", + "வ", + "ா", + "ி", + "ு", + "ே", + "ை", + "ನ", + "ರ", + "ಾ", + "ක", + "ය", + "ර", + "ල", + "ව", + "ා", + "ก", + "ง", + "ต", + "ท", + "น", + "พ", + "ม", + "ย", + "ร", + "ล", + "ว", + "ส", + "อ", + "า", + "เ", + "་", + "།", + "ག", + "ང", + "ད", + "ན", + "པ", + "བ", + "མ", + "འ", + "ར", + "ལ", + "ས", + "မ", + "ა", + "ბ", + "გ", + "დ", + "ე", + "ვ", + "თ", + "ი", + "კ", + "ლ", + "მ", + "ნ", + "ო", + "რ", + "ს", + "ტ", + "უ", + "ᄀ", + "ᄂ", + "ᄃ", + "ᄅ", + "ᄆ", + "ᄇ", + "ᄉ", + "ᄊ", + "ᄋ", + "ᄌ", + "ᄎ", + "ᄏ", + "ᄐ", + "ᄑ", + "ᄒ", + "ᅡ", + "ᅢ", + "ᅥ", + "ᅦ", + "ᅧ", + "ᅩ", + "ᅪ", + "ᅭ", + "ᅮ", + "ᅯ", + "ᅲ", + "ᅳ", + "ᅴ", + "ᅵ", + "ᆨ", + "ᆫ", + "ᆯ", + "ᆷ", + "ᆸ", + "ᆼ", + "ᴬ", + "ᴮ", + "ᴰ", + "ᴵ", + "ᴺ", + "ᵀ", + "ᵃ", + "ᵇ", + "ᵈ", + "ᵉ", + "ᵍ", + "ᵏ", + "ᵐ", + "ᵒ", + "ᵖ", + "ᵗ", + "ᵘ", + "ᵢ", + "ᵣ", + "ᵤ", + "ᵥ", + "ᶜ", + "ᶠ", + "‐", + "‑", + "‒", + "–", + "—", + "―", + "‖", + "‘", + "’", + "‚", + "“", + "”", + "„", + "†", + "‡", + "•", + "…", + "‰", + "′", + "″", + "›", + "‿", + "⁄", + "⁰", + "ⁱ", + "⁴", + "⁵", + "⁶", + "⁷", + "⁸", + "⁹", + "⁺", + "⁻", + "ⁿ", + "₀", + "₁", + "₂", + "₃", + "₄", + "₅", + "₆", + "₇", + "₈", + "₉", + "₊", + "₍", + "₎", + "ₐ", + "ₑ", + "ₒ", + "ₓ", + "ₕ", + "ₖ", + "ₗ", + "ₘ", + "ₙ", + "ₚ", + "ₛ", + "ₜ", + "₤", + "₩", + "€", + "₱", + "₹", + "ℓ", + "№", + "ℝ", + "™", + "⅓", + "⅔", + "←", + "↑", + "→", + "↓", + "↔", + "↦", + "⇄", + "⇌", + "⇒", + "∂", + "∅", + "∆", + "∇", + "∈", + "−", + "∗", + "∘", + "√", + "∞", + "∧", + "∨", + "∩", + "∪", + "≈", + "≡", + "≤", + "≥", + "⊂", + "⊆", + "⊕", + "⊗", + "⋅", + "─", + "│", + "■", + "▪", + "●", + "★", + "☆", + "☉", + "♠", + "♣", + "♥", + "♦", + "♭", + "♯", + "⟨", + "⟩", + "ⱼ", + "⺩", + "⺼", + "⽥", + "、", + "。", + "〈", + "〉", + "《", + "》", + "「", + "」", + "『", + "』", + "〜", + "あ", + "い", + "う", + "え", + "お", + "か", + "き", + "く", + "け", + "こ", + "さ", + "し", + "す", + "せ", + "そ", + "た", + "ち", + "っ", + "つ", + "て", + "と", + "な", + "に", + "ぬ", + "ね", + "の", + "は", + "ひ", + "ふ", + "へ", + "ほ", + "ま", + "み", + "む", + "め", + "も", + "や", + "ゆ", + "よ", + "ら", + "り", + "る", + "れ", + "ろ", + "を", + "ん", + "ァ", + "ア", + "ィ", + "イ", + "ウ", + "ェ", + "エ", + "オ", + "カ", + "キ", + "ク", + "ケ", + "コ", + "サ", + "シ", + "ス", + "セ", + "タ", + "チ", + "ッ", + "ツ", + "テ", + "ト", + "ナ", + "ニ", + "ノ", + "ハ", + "ヒ", + "フ", + "ヘ", + "ホ", + "マ", + "ミ", + "ム", + "メ", + "モ", + "ャ", + "ュ", + "ョ", + "ラ", + "リ", + "ル", + "レ", + "ロ", + "ワ", + "ン", + "・", + "ー", + "一", + "三", + "上", + "下", + "不", + "世", + "中", + "主", + "久", + "之", + "也", + "事", + "二", + "五", + "井", + "京", + "人", + "亻", + "仁", + "介", + "代", + "仮", + "伊", + "会", + "佐", + "侍", + "保", + "信", + "健", + "元", + "光", + "八", + "公", + "内", + "出", + "分", + "前", + "劉", + "力", + "加", + "勝", + "北", + "区", + "十", + "千", + "南", + "博", + "原", + "口", + "古", + "史", + "司", + "合", + "吉", + "同", + "名", + "和", + "囗", + "四", + "国", + "國", + "土", + "地", + "坂", + "城", + "堂", + "場", + "士", + "夏", + "外", + "大", + "天", + "太", + "夫", + "奈", + "女", + "子", + "学", + "宀", + "宇", + "安", + "宗", + "定", + "宣", + "宮", + "家", + "宿", + "寺", + "將", + "小", + "尚", + "山", + "岡", + "島", + "崎", + "川", + "州", + "巿", + "帝", + "平", + "年", + "幸", + "广", + "弘", + "張", + "彳", + "後", + "御", + "德", + "心", + "忄", + "志", + "忠", + "愛", + "成", + "我", + "戦", + "戸", + "手", + "扌", + "政", + "文", + "新", + "方", + "日", + "明", + "星", + "春", + "昭", + "智", + "曲", + "書", + "月", + "有", + "朝", + "木", + "本", + "李", + "村", + "東", + "松", + "林", + "森", + "楊", + "樹", + "橋", + "歌", + "止", + "正", + "武", + "比", + "氏", + "民", + "水", + "氵", + "氷", + "永", + "江", + "沢", + "河", + "治", + "法", + "海", + "清", + "漢", + "瀬", + "火", + "版", + "犬", + "王", + "生", + "田", + "男", + "疒", + "発", + "白", + "的", + "皇", + "目", + "相", + "省", + "真", + "石", + "示", + "社", + "神", + "福", + "禾", + "秀", + "秋", + "空", + "立", + "章", + "竹", + "糹", + "美", + "義", + "耳", + "良", + "艹", + "花", + "英", + "華", + "葉", + "藤", + "行", + "街", + "西", + "見", + "訁", + "語", + "谷", + "貝", + "貴", + "車", + "軍", + "辶", + "道", + "郎", + "郡", + "部", + "都", + "里", + "野", + "金", + "鈴", + "镇", + "長", + "門", + "間", + "阝", + "阿", + "陳", + "陽", + "雄", + "青", + "面", + "風", + "食", + "香", + "馬", + "高", + "龍", + "龸", + "fi", + "fl", + "!", + "(", + ")", + ",", + "-", + ".", + "/", + ":", + "?", + "~", + "the", + "of", + "and", + "in", + "to", + "was", + "he", + "is", + "as", + "for", + "on", + "with", + "that", + "it", + "his", + "by", + "at", + "from", + "her", + "##s", + "she", + "you", + "had", + "an", + "were", + "but", + "be", + "this", + "are", + "not", + "my", + "they", + "one", + "which", + "or", + "have", + "him", + "me", + "first", + "all", + "also", + "their", + "has", + "up", + "who", + "out", + "been", + "when", + "after", + "there", + "into", + "new", + "two", + "its", + "##a", + "time", + "would", + "no", + "what", + "about", + "said", + "we", + "over", + "then", + "other", + "so", + "more", + "##e", + "can", + "if", + "like", + "back", + "them", + "only", + "some", + "could", + "##i", + "where", + "just", + "##ing", + "during", + "before", + "##n", + "do", + "##o", + "made", + "school", + "through", + "than", + "now", + "years", + "most", + "world", + "may", + "between", + "down", + "well", + "three", + "##d", + "year", + "while", + "will", + "##ed", + "##r", + "##y", + "later", + "##t", + "city", + "under", + "around", + "did", + "such", + "being", + "used", + "state", + "people", + "part", + "know", + "against", + "your", + "many", + "second", + "university", + "both", + "national", + "##er", + "these", + "don", + "known", + "off", + "way", + "until", + "re", + "how", + "even", + "get", + "head", + "...", + "didn", + "##ly", + "team", + "american", + "because", + "de", + "##l", + "born", + "united", + "film", + "since", + "still", + "long", + "work", + "south", + "us", + "became", + "any", + "high", + "again", + "day", + "family", + "see", + "right", + "man", + "eyes", + "house", + "season", + "war", + "states", + "including", + "took", + "life", + "north", + "same", + "each", + "called", + "name", + "much", + "place", + "however", + "go", + "four", + "group", + "another", + "found", + "won", + "area", + "here", + "going", + "10", + "away", + "series", + "left", + "home", + "music", + "best", + "make", + "hand", + "number", + "company", + "several", + "never", + "last", + "john", + "000", + "very", + "album", + "take", + "end", + "good", + "too", + "following", + "released", + "game", + "played", + "little", + "began", + "district", + "##m", + "old", + "want", + "those", + "side", + "held", + "own", + "early", + "county", + "ll", + "league", + "use", + "west", + "##u", + "face", + "think", + "##es", + "2010", + "government", + "##h", + "march", + "came", + "small", + "general", + "town", + "june", + "##on", + "line", + "based", + "something", + "##k", + "september", + "thought", + "looked", + "along", + "international", + "2011", + "air", + "july", + "club", + "went", + "january", + "october", + "our", + "august", + "april", + "york", + "12", + "few", + "2012", + "2008", + "east", + "show", + "member", + "college", + "2009", + "father", + "public", + "##us", + "come", + "men", + "five", + "set", + "station", + "church", + "##c", + "next", + "former", + "november", + "room", + "party", + "located", + "december", + "2013", + "age", + "got", + "2007", + "##g", + "system", + "let", + "love", + "2006", + "though", + "every", + "2014", + "look", + "song", + "water", + "century", + "without", + "body", + "black", + "night", + "within", + "great", + "women", + "single", + "ve", + "building", + "large", + "population", + "river", + "named", + "band", + "white", + "started", + "##an", + "once", + "15", + "20", + "should", + "18", + "2015", + "service", + "top", + "built", + "british", + "open", + "death", + "king", + "moved", + "local", + "times", + "children", + "february", + "book", + "why", + "11", + "door", + "need", + "president", + "order", + "final", + "road", + "wasn", + "although", + "due", + "major", + "died", + "village", + "third", + "knew", + "2016", + "asked", + "turned", + "st", + "wanted", + "say", + "##p", + "together", + "received", + "main", + "son", + "served", + "different", + "##en", + "behind", + "himself", + "felt", + "members", + "power", + "football", + "law", + "voice", + "play", + "##in", + "near", + "park", + "history", + "30", + "having", + "2005", + "16", + "##man", + "saw", + "mother", + "##al", + "army", + "point", + "front", + "help", + "english", + "street", + "art", + "late", + "hands", + "games", + "award", + "##ia", + "young", + "14", + "put", + "published", + "country", + "division", + "across", + "told", + "13", + "often", + "ever", + "french", + "london", + "center", + "six", + "red", + "2017", + "led", + "days", + "include", + "light", + "25", + "find", + "tell", + "among", + "species", + "really", + "according", + "central", + "half", + "2004", + "form", + "original", + "gave", + "office", + "making", + "enough", + "lost", + "full", + "opened", + "must", + "included", + "live", + "given", + "german", + "player", + "run", + "business", + "woman", + "community", + "cup", + "might", + "million", + "land", + "2000", + "court", + "development", + "17", + "short", + "round", + "ii", + "km", + "seen", + "class", + "story", + "always", + "become", + "sure", + "research", + "almost", + "director", + "council", + "la", + "##2", + "career", + "things", + "using", + "island", + "##z", + "couldn", + "car", + "##is", + "24", + "close", + "force", + "##1", + "better", + "free", + "support", + "control", + "field", + "students", + "2003", + "education", + "married", + "##b", + "nothing", + "worked", + "others", + "record", + "big", + "inside", + "level", + "anything", + "continued", + "give", + "james", + "##3", + "military", + "established", + "non", + "returned", + "feel", + "does", + "title", + "written", + "thing", + "feet", + "william", + "far", + "co", + "association", + "hard", + "already", + "2002", + "##ra", + "championship", + "human", + "western", + "100", + "##na", + "department", + "hall", + "role", + "various", + "production", + "21", + "19", + "heart", + "2001", + "living", + "fire", + "version", + "##ers", + "##f", + "television", + "royal", + "##4", + "produced", + "working", + "act", + "case", + "society", + "region", + "present", + "radio", + "period", + "looking", + "least", + "total", + "keep", + "england", + "wife", + "program", + "per", + "brother", + "mind", + "special", + "22", + "##le", + "am", + "works", + "soon", + "##6", + "political", + "george", + "services", + "taken", + "created", + "##7", + "further", + "able", + "reached", + "david", + "union", + "joined", + "upon", + "done", + "important", + "social", + "information", + "either", + "##ic", + "##x", + "appeared", + "position", + "ground", + "lead", + "rock", + "dark", + "election", + "23", + "board", + "france", + "hair", + "course", + "arms", + "site", + "police", + "girl", + "instead", + "real", + "sound", + "##v", + "words", + "moment", + "##te", + "someone", + "##8", + "summer", + "project", + "announced", + "san", + "less", + "wrote", + "past", + "followed", + "##5", + "blue", + "founded", + "al", + "finally", + "india", + "taking", + "records", + "america", + "##ne", + "1999", + "design", + "considered", + "northern", + "god", + "stop", + "battle", + "toward", + "european", + "outside", + "described", + "track", + "today", + "playing", + "language", + "28", + "call", + "26", + "heard", + "professional", + "low", + "australia", + "miles", + "california", + "win", + "yet", + "green", + "##ie", + "trying", + "blood", + "##ton", + "southern", + "science", + "maybe", + "everything", + "match", + "square", + "27", + "mouth", + "video", + "race", + "recorded", + "leave", + "above", + "##9", + "daughter", + "points", + "space", + "1998", + "museum", + "change", + "middle", + "common", + "##0", + "move", + "tv", + "post", + "##ta", + "lake", + "seven", + "tried", + "elected", + "closed", + "ten", + "paul", + "minister", + "##th", + "months", + "start", + "chief", + "return", + "canada", + "person", + "sea", + "release", + "similar", + "modern", + "brought", + "rest", + "hit", + "formed", + "mr", + "##la", + "1997", + "floor", + "event", + "doing", + "thomas", + "1996", + "robert", + "care", + "killed", + "training", + "star", + "week", + "needed", + "turn", + "finished", + "railway", + "rather", + "news", + "health", + "sent", + "example", + "ran", + "term", + "michael", + "coming", + "currently", + "yes", + "forces", + "despite", + "gold", + "areas", + "50", + "stage", + "fact", + "29", + "dead", + "says", + "popular", + "2018", + "originally", + "germany", + "probably", + "developed", + "result", + "pulled", + "friend", + "stood", + "money", + "running", + "mi", + "signed", + "word", + "songs", + "child", + "eventually", + "met", + "tour", + "average", + "teams", + "minutes", + "festival", + "current", + "deep", + "kind", + "1995", + "decided", + "usually", + "eastern", + "seemed", + "##ness", + "episode", + "bed", + "added", + "table", + "indian", + "private", + "charles", + "route", + "available", + "idea", + "throughout", + "centre", + "addition", + "appointed", + "style", + "1994", + "books", + "eight", + "construction", + "press", + "mean", + "wall", + "friends", + "remained", + "schools", + "study", + "##ch", + "##um", + "institute", + "oh", + "chinese", + "sometimes", + "events", + "possible", + "1992", + "australian", + "type", + "brown", + "forward", + "talk", + "process", + "food", + "debut", + "seat", + "performance", + "committee", + "features", + "character", + "arts", + "herself", + "else", + "lot", + "strong", + "russian", + "range", + "hours", + "peter", + "arm", + "##da", + "morning", + "dr", + "sold", + "##ry", + "quickly", + "directed", + "1993", + "guitar", + "china", + "##w", + "31", + "list", + "##ma", + "performed", + "media", + "uk", + "players", + "smile", + "##rs", + "myself", + "40", + "placed", + "coach", + "province", + "towards", + "wouldn", + "leading", + "whole", + "boy", + "official", + "designed", + "grand", + "census", + "##el", + "europe", + "attack", + "japanese", + "henry", + "1991", + "##re", + "##os", + "cross", + "getting", + "alone", + "action", + "lower", + "network", + "wide", + "washington", + "japan", + "1990", + "hospital", + "believe", + "changed", + "sister", + "##ar", + "hold", + "gone", + "sir", + "hadn", + "ship", + "##ka", + "studies", + "academy", + "shot", + "rights", + "below", + "base", + "bad", + "involved", + "kept", + "largest", + "##ist", + "bank", + "future", + "especially", + "beginning", + "mark", + "movement", + "section", + "female", + "magazine", + "plan", + "professor", + "lord", + "longer", + "##ian", + "sat", + "walked", + "hill", + "actually", + "civil", + "energy", + "model", + "families", + "size", + "thus", + "aircraft", + "completed", + "includes", + "data", + "captain", + "##or", + "fight", + "vocals", + "featured", + "richard", + "bridge", + "fourth", + "1989", + "officer", + "stone", + "hear", + "##ism", + "means", + "medical", + "groups", + "management", + "self", + "lips", + "competition", + "entire", + "lived", + "technology", + "leaving", + "federal", + "tournament", + "bit", + "passed", + "hot", + "independent", + "awards", + "kingdom", + "mary", + "spent", + "fine", + "doesn", + "reported", + "##ling", + "jack", + "fall", + "raised", + "itself", + "stay", + "true", + "studio", + "1988", + "sports", + "replaced", + "paris", + "systems", + "saint", + "leader", + "theatre", + "whose", + "market", + "capital", + "parents", + "spanish", + "canadian", + "earth", + "##ity", + "cut", + "degree", + "writing", + "bay", + "christian", + "awarded", + "natural", + "higher", + "bill", + "##as", + "coast", + "provided", + "previous", + "senior", + "ft", + "valley", + "organization", + "stopped", + "onto", + "countries", + "parts", + "conference", + "queen", + "security", + "interest", + "saying", + "allowed", + "master", + "earlier", + "phone", + "matter", + "smith", + "winning", + "try", + "happened", + "moving", + "campaign", + "los", + "##ley", + "breath", + "nearly", + "mid", + "1987", + "certain", + "girls", + "date", + "italian", + "african", + "standing", + "fell", + "artist", + "##ted", + "shows", + "deal", + "mine", + "industry", + "1986", + "##ng", + "everyone", + "republic", + "provide", + "collection", + "library", + "student", + "##ville", + "primary", + "owned", + "older", + "via", + "heavy", + "1st", + "makes", + "##able", + "attention", + "anyone", + "africa", + "##ri", + "stated", + "length", + "ended", + "fingers", + "command", + "staff", + "skin", + "foreign", + "opening", + "governor", + "okay", + "medal", + "kill", + "sun", + "cover", + "job", + "1985", + "introduced", + "chest", + "hell", + "feeling", + "##ies", + "success", + "meet", + "reason", + "standard", + "meeting", + "novel", + "1984", + "trade", + "source", + "buildings", + "##land", + "rose", + "guy", + "goal", + "##ur", + "chapter", + "native", + "husband", + "previously", + "unit", + "limited", + "entered", + "weeks", + "producer", + "operations", + "mountain", + "takes", + "covered", + "forced", + "related", + "roman", + "complete", + "successful", + "key", + "texas", + "cold", + "##ya", + "channel", + "1980", + "traditional", + "films", + "dance", + "clear", + "approximately", + "500", + "nine", + "van", + "prince", + "question", + "active", + "tracks", + "ireland", + "regional", + "silver", + "author", + "personal", + "sense", + "operation", + "##ine", + "economic", + "1983", + "holding", + "twenty", + "isbn", + "additional", + "speed", + "hour", + "edition", + "regular", + "historic", + "places", + "whom", + "shook", + "movie", + "km²", + "secretary", + "prior", + "report", + "chicago", + "read", + "foundation", + "view", + "engine", + "scored", + "1982", + "units", + "ask", + "airport", + "property", + "ready", + "immediately", + "lady", + "month", + "listed", + "contract", + "##de", + "manager", + "themselves", + "lines", + "##ki", + "navy", + "writer", + "meant", + "##ts", + "runs", + "##ro", + "practice", + "championships", + "singer", + "glass", + "commission", + "required", + "forest", + "starting", + "culture", + "generally", + "giving", + "access", + "attended", + "test", + "couple", + "stand", + "catholic", + "martin", + "caught", + "executive", + "##less", + "eye", + "##ey", + "thinking", + "chair", + "quite", + "shoulder", + "1979", + "hope", + "decision", + "plays", + "defeated", + "municipality", + "whether", + "structure", + "offered", + "slowly", + "pain", + "ice", + "direction", + "##ion", + "paper", + "mission", + "1981", + "mostly", + "200", + "noted", + "individual", + "managed", + "nature", + "lives", + "plant", + "##ha", + "helped", + "except", + "studied", + "computer", + "figure", + "relationship", + "issue", + "significant", + "loss", + "die", + "smiled", + "gun", + "ago", + "highest", + "1972", + "##am", + "male", + "bring", + "goals", + "mexico", + "problem", + "distance", + "commercial", + "completely", + "location", + "annual", + "famous", + "drive", + "1976", + "neck", + "1978", + "surface", + "caused", + "italy", + "understand", + "greek", + "highway", + "wrong", + "hotel", + "comes", + "appearance", + "joseph", + "double", + "issues", + "musical", + "companies", + "castle", + "income", + "review", + "assembly", + "bass", + "initially", + "parliament", + "artists", + "experience", + "1974", + "particular", + "walk", + "foot", + "engineering", + "talking", + "window", + "dropped", + "##ter", + "miss", + "baby", + "boys", + "break", + "1975", + "stars", + "edge", + "remember", + "policy", + "carried", + "train", + "stadium", + "bar", + "sex", + "angeles", + "evidence", + "##ge", + "becoming", + "assistant", + "soviet", + "1977", + "upper", + "step", + "wing", + "1970", + "youth", + "financial", + "reach", + "##ll", + "actor", + "numerous", + "##se", + "##st", + "nodded", + "arrived", + "##ation", + "minute", + "##nt", + "believed", + "sorry", + "complex", + "beautiful", + "victory", + "associated", + "temple", + "1968", + "1973", + "chance", + "perhaps", + "metal", + "##son", + "1945", + "bishop", + "##et", + "lee", + "launched", + "particularly", + "tree", + "le", + "retired", + "subject", + "prize", + "contains", + "yeah", + "theory", + "empire", + "##ce", + "suddenly", + "waiting", + "trust", + "recording", + "##to", + "happy", + "terms", + "camp", + "champion", + "1971", + "religious", + "pass", + "zealand", + "names", + "2nd", + "port", + "ancient", + "tom", + "corner", + "represented", + "watch", + "legal", + "anti", + "justice", + "cause", + "watched", + "brothers", + "45", + "material", + "changes", + "simply", + "response", + "louis", + "fast", + "##ting", + "answer", + "60", + "historical", + "1969", + "stories", + "straight", + "create", + "feature", + "increased", + "rate", + "administration", + "virginia", + "el", + "activities", + "cultural", + "overall", + "winner", + "programs", + "basketball", + "legs", + "guard", + "beyond", + "cast", + "doctor", + "mm", + "flight", + "results", + "remains", + "cost", + "effect", + "winter", + "##ble", + "larger", + "islands", + "problems", + "chairman", + "grew", + "commander", + "isn", + "1967", + "pay", + "failed", + "selected", + "hurt", + "fort", + "box", + "regiment", + "majority", + "journal", + "35", + "edward", + "plans", + "##ke", + "##ni", + "shown", + "pretty", + "irish", + "characters", + "directly", + "scene", + "likely", + "operated", + "allow", + "spring", + "##j", + "junior", + "matches", + "looks", + "mike", + "houses", + "fellow", + "##tion", + "beach", + "marriage", + "##ham", + "##ive", + "rules", + "oil", + "65", + "florida", + "expected", + "nearby", + "congress", + "sam", + "peace", + "recent", + "iii", + "wait", + "subsequently", + "cell", + "##do", + "variety", + "serving", + "agreed", + "please", + "poor", + "joe", + "pacific", + "attempt", + "wood", + "democratic", + "piece", + "prime", + "##ca", + "rural", + "mile", + "touch", + "appears", + "township", + "1964", + "1966", + "soldiers", + "##men", + "##ized", + "1965", + "pennsylvania", + "closer", + "fighting", + "claimed", + "score", + "jones", + "physical", + "editor", + "##ous", + "filled", + "genus", + "specific", + "sitting", + "super", + "mom", + "##va", + "therefore", + "supported", + "status", + "fear", + "cases", + "store", + "meaning", + "wales", + "minor", + "spain", + "tower", + "focus", + "vice", + "frank", + "follow", + "parish", + "separate", + "golden", + "horse", + "fifth", + "remaining", + "branch", + "32", + "presented", + "stared", + "##id", + "uses", + "secret", + "forms", + "##co", + "baseball", + "exactly", + "##ck", + "choice", + "note", + "discovered", + "travel", + "composed", + "truth", + "russia", + "ball", + "color", + "kiss", + "dad", + "wind", + "continue", + "ring", + "referred", + "numbers", + "digital", + "greater", + "##ns", + "metres", + "slightly", + "direct", + "increase", + "1960", + "responsible", + "crew", + "rule", + "trees", + "troops", + "##no", + "broke", + "goes", + "individuals", + "hundred", + "weight", + "creek", + "sleep", + "memory", + "defense", + "provides", + "ordered", + "code", + "value", + "jewish", + "windows", + "1944", + "safe", + "judge", + "whatever", + "corps", + "realized", + "growing", + "pre", + "##ga", + "cities", + "alexander", + "gaze", + "lies", + "spread", + "scott", + "letter", + "showed", + "situation", + "mayor", + "transport", + "watching", + "workers", + "extended", + "##li", + "expression", + "normal", + "##ment", + "chart", + "multiple", + "border", + "##ba", + "host", + "##ner", + "daily", + "mrs", + "walls", + "piano", + "##ko", + "heat", + "cannot", + "##ate", + "earned", + "products", + "drama", + "era", + "authority", + "seasons", + "join", + "grade", + "##io", + "sign", + "difficult", + "machine", + "1963", + "territory", + "mainly", + "##wood", + "stations", + "squadron", + "1962", + "stepped", + "iron", + "19th", + "##led", + "serve", + "appear", + "sky", + "speak", + "broken", + "charge", + "knowledge", + "kilometres", + "removed", + "ships", + "article", + "campus", + "simple", + "##ty", + "pushed", + "britain", + "##ve", + "leaves", + "recently", + "cd", + "soft", + "boston", + "latter", + "easy", + "acquired", + "poland", + "##sa", + "quality", + "officers", + "presence", + "planned", + "nations", + "mass", + "broadcast", + "jean", + "share", + "image", + "influence", + "wild", + "offer", + "emperor", + "electric", + "reading", + "headed", + "ability", + "promoted", + "yellow", + "ministry", + "1942", + "throat", + "smaller", + "politician", + "##by", + "latin", + "spoke", + "cars", + "williams", + "males", + "lack", + "pop", + "80", + "##ier", + "acting", + "seeing", + "consists", + "##ti", + "estate", + "1961", + "pressure", + "johnson", + "newspaper", + "jr", + "chris", + "olympics", + "online", + "conditions", + "beat", + "elements", + "walking", + "vote", + "##field", + "needs", + "carolina", + "text", + "featuring", + "global", + "block", + "shirt", + "levels", + "francisco", + "purpose", + "females", + "et", + "dutch", + "duke", + "ahead", + "gas", + "twice", + "safety", + "serious", + "turning", + "highly", + "lieutenant", + "firm", + "maria", + "amount", + "mixed", + "daniel", + "proposed", + "perfect", + "agreement", + "affairs", + "3rd", + "seconds", + "contemporary", + "paid", + "1943", + "prison", + "save", + "kitchen", + "label", + "administrative", + "intended", + "constructed", + "academic", + "nice", + "teacher", + "races", + "1956", + "formerly", + "corporation", + "ben", + "nation", + "issued", + "shut", + "1958", + "drums", + "housing", + "victoria", + "seems", + "opera", + "1959", + "graduated", + "function", + "von", + "mentioned", + "picked", + "build", + "recognized", + "shortly", + "protection", + "picture", + "notable", + "exchange", + "elections", + "1980s", + "loved", + "percent", + "racing", + "fish", + "elizabeth", + "garden", + "volume", + "hockey", + "1941", + "beside", + "settled", + "##ford", + "1940", + "competed", + "replied", + "drew", + "1948", + "actress", + "marine", + "scotland", + "steel", + "glanced", + "farm", + "steve", + "1957", + "risk", + "tonight", + "positive", + "magic", + "singles", + "effects", + "gray", + "screen", + "dog", + "##ja", + "residents", + "bus", + "sides", + "none", + "secondary", + "literature", + "polish", + "destroyed", + "flying", + "founder", + "households", + "1939", + "lay", + "reserve", + "usa", + "gallery", + "##ler", + "1946", + "industrial", + "younger", + "approach", + "appearances", + "urban", + "ones", + "1950", + "finish", + "avenue", + "powerful", + "fully", + "growth", + "page", + "honor", + "jersey", + "projects", + "advanced", + "revealed", + "basic", + "90", + "infantry", + "pair", + "equipment", + "visit", + "33", + "evening", + "search", + "grant", + "effort", + "solo", + "treatment", + "buried", + "republican", + "primarily", + "bottom", + "owner", + "1970s", + "israel", + "gives", + "jim", + "dream", + "bob", + "remain", + "spot", + "70", + "notes", + "produce", + "champions", + "contact", + "ed", + "soul", + "accepted", + "ways", + "del", + "##ally", + "losing", + "split", + "price", + "capacity", + "basis", + "trial", + "questions", + "##ina", + "1955", + "20th", + "guess", + "officially", + "memorial", + "naval", + "initial", + "##ization", + "whispered", + "median", + "engineer", + "##ful", + "sydney", + "##go", + "columbia", + "strength", + "300", + "1952", + "tears", + "senate", + "00", + "card", + "asian", + "agent", + "1947", + "software", + "44", + "draw", + "warm", + "supposed", + "com", + "pro", + "##il", + "transferred", + "leaned", + "##at", + "candidate", + "escape", + "mountains", + "asia", + "potential", + "activity", + "entertainment", + "seem", + "traffic", + "jackson", + "murder", + "36", + "slow", + "product", + "orchestra", + "haven", + "agency", + "bbc", + "taught", + "website", + "comedy", + "unable", + "storm", + "planning", + "albums", + "rugby", + "environment", + "scientific", + "grabbed", + "protect", + "##hi", + "boat", + "typically", + "1954", + "1953", + "damage", + "principal", + "divided", + "dedicated", + "mount", + "ohio", + "##berg", + "pick", + "fought", + "driver", + "##der", + "empty", + "shoulders", + "sort", + "thank", + "berlin", + "prominent", + "account", + "freedom", + "necessary", + "efforts", + "alex", + "headquarters", + "follows", + "alongside", + "des", + "simon", + "andrew", + "suggested", + "operating", + "learning", + "steps", + "1949", + "sweet", + "technical", + "begin", + "easily", + "34", + "teeth", + "speaking", + "settlement", + "scale", + "##sh", + "renamed", + "ray", + "max", + "enemy", + "semi", + "joint", + "compared", + "##rd", + "scottish", + "leadership", + "analysis", + "offers", + "georgia", + "pieces", + "captured", + "animal", + "deputy", + "guest", + "organized", + "##lin", + "tony", + "combined", + "method", + "challenge", + "1960s", + "huge", + "wants", + "battalion", + "sons", + "rise", + "crime", + "types", + "facilities", + "telling", + "path", + "1951", + "platform", + "sit", + "1990s", + "##lo", + "tells", + "assigned", + "rich", + "pull", + "##ot", + "commonly", + "alive", + "##za", + "letters", + "concept", + "conducted", + "wearing", + "happen", + "bought", + "becomes", + "holy", + "gets", + "ocean", + "defeat", + "languages", + "purchased", + "coffee", + "occurred", + "titled", + "##q", + "declared", + "applied", + "sciences", + "concert", + "sounds", + "jazz", + "brain", + "##me", + "painting", + "fleet", + "tax", + "nick", + "##ius", + "michigan", + "count", + "animals", + "leaders", + "episodes", + "##line", + "content", + "##den", + "birth", + "##it", + "clubs", + "64", + "palace", + "critical", + "refused", + "fair", + "leg", + "laughed", + "returning", + "surrounding", + "participated", + "formation", + "lifted", + "pointed", + "connected", + "rome", + "medicine", + "laid", + "taylor", + "santa", + "powers", + "adam", + "tall", + "shared", + "focused", + "knowing", + "yards", + "entrance", + "falls", + "##wa", + "calling", + "##ad", + "sources", + "chosen", + "beneath", + "resources", + "yard", + "##ite", + "nominated", + "silence", + "zone", + "defined", + "##que", + "gained", + "thirty", + "38", + "bodies", + "moon", + "##ard", + "adopted", + "christmas", + "widely", + "register", + "apart", + "iran", + "premier", + "serves", + "du", + "unknown", + "parties", + "##les", + "generation", + "##ff", + "continues", + "quick", + "fields", + "brigade", + "quiet", + "teaching", + "clothes", + "impact", + "weapons", + "partner", + "flat", + "theater", + "supreme", + "1938", + "37", + "relations", + "##tor", + "plants", + "suffered", + "1936", + "wilson", + "kids", + "begins", + "##age", + "1918", + "seats", + "armed", + "internet", + "models", + "worth", + "laws", + "400", + "communities", + "classes", + "background", + "knows", + "thanks", + "quarter", + "reaching", + "humans", + "carry", + "killing", + "format", + "kong", + "hong", + "setting", + "75", + "architecture", + "disease", + "railroad", + "inc", + "possibly", + "wish", + "arthur", + "thoughts", + "harry", + "doors", + "density", + "##di", + "crowd", + "illinois", + "stomach", + "tone", + "unique", + "reports", + "anyway", + "##ir", + "liberal", + "der", + "vehicle", + "thick", + "dry", + "drug", + "faced", + "largely", + "facility", + "theme", + "holds", + "creation", + "strange", + "colonel", + "##mi", + "revolution", + "bell", + "politics", + "turns", + "silent", + "rail", + "relief", + "independence", + "combat", + "shape", + "write", + "determined", + "sales", + "learned", + "4th", + "finger", + "oxford", + "providing", + "1937", + "heritage", + "fiction", + "situated", + "designated", + "allowing", + "distribution", + "hosted", + "##est", + "sight", + "interview", + "estimated", + "reduced", + "##ria", + "toronto", + "footballer", + "keeping", + "guys", + "damn", + "claim", + "motion", + "sport", + "sixth", + "stayed", + "##ze", + "en", + "rear", + "receive", + "handed", + "twelve", + "dress", + "audience", + "granted", + "brazil", + "##well", + "spirit", + "##ated", + "noticed", + "etc", + "olympic", + "representative", + "eric", + "tight", + "trouble", + "reviews", + "drink", + "vampire", + "missing", + "roles", + "ranked", + "newly", + "household", + "finals", + "wave", + "critics", + "##ee", + "phase", + "massachusetts", + "pilot", + "unlike", + "philadelphia", + "bright", + "guns", + "crown", + "organizations", + "roof", + "42", + "respectively", + "clearly", + "tongue", + "marked", + "circle", + "fox", + "korea", + "bronze", + "brian", + "expanded", + "sexual", + "supply", + "yourself", + "inspired", + "labour", + "fc", + "##ah", + "reference", + "vision", + "draft", + "connection", + "brand", + "reasons", + "1935", + "classic", + "driving", + "trip", + "jesus", + "cells", + "entry", + "1920", + "neither", + "trail", + "claims", + "atlantic", + "orders", + "labor", + "nose", + "afraid", + "identified", + "intelligence", + "calls", + "cancer", + "attacked", + "passing", + "stephen", + "positions", + "imperial", + "grey", + "jason", + "39", + "sunday", + "48", + "swedish", + "avoid", + "extra", + "uncle", + "message", + "covers", + "allows", + "surprise", + "materials", + "fame", + "hunter", + "##ji", + "1930", + "citizens", + "figures", + "davis", + "environmental", + "confirmed", + "shit", + "titles", + "di", + "performing", + "difference", + "acts", + "attacks", + "##ov", + "existing", + "votes", + "opportunity", + "nor", + "shop", + "entirely", + "trains", + "opposite", + "pakistan", + "##pa", + "develop", + "resulted", + "representatives", + "actions", + "reality", + "pressed", + "##ish", + "barely", + "wine", + "conversation", + "faculty", + "northwest", + "ends", + "documentary", + "nuclear", + "stock", + "grace", + "sets", + "eat", + "alternative", + "##ps", + "bag", + "resulting", + "creating", + "surprised", + "cemetery", + "1919", + "drop", + "finding", + "sarah", + "cricket", + "streets", + "tradition", + "ride", + "1933", + "exhibition", + "target", + "ear", + "explained", + "rain", + "composer", + "injury", + "apartment", + "municipal", + "educational", + "occupied", + "netherlands", + "clean", + "billion", + "constitution", + "learn", + "1914", + "maximum", + "classical", + "francis", + "lose", + "opposition", + "jose", + "ontario", + "bear", + "core", + "hills", + "rolled", + "ending", + "drawn", + "permanent", + "fun", + "##tes", + "##lla", + "lewis", + "sites", + "chamber", + "ryan", + "##way", + "scoring", + "height", + "1934", + "##house", + "lyrics", + "staring", + "55", + "officials", + "1917", + "snow", + "oldest", + "##tic", + "orange", + "##ger", + "qualified", + "interior", + "apparently", + "succeeded", + "thousand", + "dinner", + "lights", + "existence", + "fans", + "heavily", + "41", + "greatest", + "conservative", + "send", + "bowl", + "plus", + "enter", + "catch", + "##un", + "economy", + "duty", + "1929", + "speech", + "authorities", + "princess", + "performances", + "versions", + "shall", + "graduate", + "pictures", + "effective", + "remembered", + "poetry", + "desk", + "crossed", + "starring", + "starts", + "passenger", + "sharp", + "##ant", + "acres", + "ass", + "weather", + "falling", + "rank", + "fund", + "supporting", + "check", + "adult", + "publishing", + "heads", + "cm", + "southeast", + "lane", + "##burg", + "application", + "bc", + "##ura", + "les", + "condition", + "transfer", + "prevent", + "display", + "ex", + "regions", + "earl", + "federation", + "cool", + "relatively", + "answered", + "besides", + "1928", + "obtained", + "portion", + "##town", + "mix", + "##ding", + "reaction", + "liked", + "dean", + "express", + "peak", + "1932", + "##tte", + "counter", + "religion", + "chain", + "rare", + "miller", + "convention", + "aid", + "lie", + "vehicles", + "mobile", + "perform", + "squad", + "wonder", + "lying", + "crazy", + "sword", + "##ping", + "attempted", + "centuries", + "weren", + "philosophy", + "category", + "##ize", + "anna", + "interested", + "47", + "sweden", + "wolf", + "frequently", + "abandoned", + "kg", + "literary", + "alliance", + "task", + "entitled", + "##ay", + "threw", + "promotion", + "factory", + "tiny", + "soccer", + "visited", + "matt", + "fm", + "achieved", + "52", + "defence", + "internal", + "persian", + "43", + "methods", + "##ging", + "arrested", + "otherwise", + "cambridge", + "programming", + "villages", + "elementary", + "districts", + "rooms", + "criminal", + "conflict", + "worry", + "trained", + "1931", + "attempts", + "waited", + "signal", + "bird", + "truck", + "subsequent", + "programme", + "##ol", + "ad", + "49", + "communist", + "details", + "faith", + "sector", + "patrick", + "carrying", + "laugh", + "##ss", + "controlled", + "korean", + "showing", + "origin", + "fuel", + "evil", + "1927", + "##ent", + "brief", + "identity", + "darkness", + "address", + "pool", + "missed", + "publication", + "web", + "planet", + "ian", + "anne", + "wings", + "invited", + "##tt", + "briefly", + "standards", + "kissed", + "##be", + "ideas", + "climate", + "causing", + "walter", + "worse", + "albert", + "articles", + "winners", + "desire", + "aged", + "northeast", + "dangerous", + "gate", + "doubt", + "1922", + "wooden", + "multi", + "##ky", + "poet", + "rising", + "funding", + "46", + "communications", + "communication", + "violence", + "copies", + "prepared", + "ford", + "investigation", + "skills", + "1924", + "pulling", + "electronic", + "##ak", + "##ial", + "##han", + "containing", + "ultimately", + "offices", + "singing", + "understanding", + "restaurant", + "tomorrow", + "fashion", + "christ", + "ward", + "da", + "pope", + "stands", + "5th", + "flow", + "studios", + "aired", + "commissioned", + "contained", + "exist", + "fresh", + "americans", + "##per", + "wrestling", + "approved", + "kid", + "employed", + "respect", + "suit", + "1925", + "angel", + "asking", + "increasing", + "frame", + "angry", + "selling", + "1950s", + "thin", + "finds", + "##nd", + "temperature", + "statement", + "ali", + "explain", + "inhabitants", + "towns", + "extensive", + "narrow", + "51", + "jane", + "flowers", + "images", + "promise", + "somewhere", + "object", + "fly", + "closely", + "##ls", + "1912", + "bureau", + "cape", + "1926", + "weekly", + "presidential", + "legislative", + "1921", + "##ai", + "##au", + "launch", + "founding", + "##ny", + "978", + "##ring", + "artillery", + "strike", + "un", + "institutions", + "roll", + "writers", + "landing", + "chose", + "kevin", + "anymore", + "pp", + "##ut", + "attorney", + "fit", + "dan", + "billboard", + "receiving", + "agricultural", + "breaking", + "sought", + "dave", + "admitted", + "lands", + "mexican", + "##bury", + "charlie", + "specifically", + "hole", + "iv", + "howard", + "credit", + "moscow", + "roads", + "accident", + "1923", + "proved", + "wear", + "struck", + "hey", + "guards", + "stuff", + "slid", + "expansion", + "1915", + "cat", + "anthony", + "##kin", + "melbourne", + "opposed", + "sub", + "southwest", + "architect", + "failure", + "plane", + "1916", + "##ron", + "map", + "camera", + "tank", + "listen", + "regarding", + "wet", + "introduction", + "metropolitan", + "link", + "ep", + "fighter", + "inch", + "grown", + "gene", + "anger", + "fixed", + "buy", + "dvd", + "khan", + "domestic", + "worldwide", + "chapel", + "mill", + "functions", + "examples", + "##head", + "developing", + "1910", + "turkey", + "hits", + "pocket", + "antonio", + "papers", + "grow", + "unless", + "circuit", + "18th", + "concerned", + "attached", + "journalist", + "selection", + "journey", + "converted", + "provincial", + "painted", + "hearing", + "aren", + "bands", + "negative", + "aside", + "wondered", + "knight", + "lap", + "survey", + "ma", + "##ow", + "noise", + "billy", + "##ium", + "shooting", + "guide", + "bedroom", + "priest", + "resistance", + "motor", + "homes", + "sounded", + "giant", + "##mer", + "150", + "scenes", + "equal", + "comic", + "patients", + "hidden", + "solid", + "actual", + "bringing", + "afternoon", + "touched", + "funds", + "wedding", + "consisted", + "marie", + "canal", + "sr", + "kim", + "treaty", + "turkish", + "recognition", + "residence", + "cathedral", + "broad", + "knees", + "incident", + "shaped", + "fired", + "norwegian", + "handle", + "cheek", + "contest", + "represent", + "##pe", + "representing", + "beauty", + "##sen", + "birds", + "advantage", + "emergency", + "wrapped", + "drawing", + "notice", + "pink", + "broadcasting", + "##ong", + "somehow", + "bachelor", + "seventh", + "collected", + "registered", + "establishment", + "alan", + "assumed", + "chemical", + "personnel", + "roger", + "retirement", + "jeff", + "portuguese", + "wore", + "tied", + "device", + "threat", + "progress", + "advance", + "##ised", + "banks", + "hired", + "manchester", + "nfl", + "teachers", + "structures", + "forever", + "##bo", + "tennis", + "helping", + "saturday", + "sale", + "applications", + "junction", + "hip", + "incorporated", + "neighborhood", + "dressed", + "ceremony", + "##ds", + "influenced", + "hers", + "visual", + "stairs", + "decades", + "inner", + "kansas", + "hung", + "hoped", + "gain", + "scheduled", + "downtown", + "engaged", + "austria", + "clock", + "norway", + "certainly", + "pale", + "protected", + "1913", + "victor", + "employees", + "plate", + "putting", + "surrounded", + "##ists", + "finishing", + "blues", + "tropical", + "##ries", + "minnesota", + "consider", + "philippines", + "accept", + "54", + "retrieved", + "1900", + "concern", + "anderson", + "properties", + "institution", + "gordon", + "successfully", + "vietnam", + "##dy", + "backing", + "outstanding", + "muslim", + "crossing", + "folk", + "producing", + "usual", + "demand", + "occurs", + "observed", + "lawyer", + "educated", + "##ana", + "kelly", + "string", + "pleasure", + "budget", + "items", + "quietly", + "colorado", + "philip", + "typical", + "##worth", + "derived", + "600", + "survived", + "asks", + "mental", + "##ide", + "56", + "jake", + "jews", + "distinguished", + "ltd", + "1911", + "sri", + "extremely", + "53", + "athletic", + "loud", + "thousands", + "worried", + "shadow", + "transportation", + "horses", + "weapon", + "arena", + "importance", + "users", + "tim", + "objects", + "contributed", + "dragon", + "douglas", + "aware", + "senator", + "johnny", + "jordan", + "sisters", + "engines", + "flag", + "investment", + "samuel", + "shock", + "capable", + "clark", + "row", + "wheel", + "refers", + "session", + "familiar", + "biggest", + "wins", + "hate", + "maintained", + "drove", + "hamilton", + "request", + "expressed", + "injured", + "underground", + "churches", + "walker", + "wars", + "tunnel", + "passes", + "stupid", + "agriculture", + "softly", + "cabinet", + "regarded", + "joining", + "indiana", + "##ea", + "##ms", + "push", + "dates", + "spend", + "behavior", + "woods", + "protein", + "gently", + "chase", + "morgan", + "mention", + "burning", + "wake", + "combination", + "occur", + "mirror", + "leads", + "jimmy", + "indeed", + "impossible", + "singapore", + "paintings", + "covering" + }; + } } From d38a054429292bdbafd45c79a6367e0144e12601 Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Thu, 6 May 2021 12:06:48 +0100 Subject: [PATCH 04/21] Add special tokens and do_lower_case setting --- .../core/ml/inference/pipeline_config.json | 29001 ++++++++++++++++ .../deployment/DeploymentManager.java | 1 + .../inference/pipelines/nlp/NlpPipeline.java | 2 +- .../pipelines/nlp/PipelineConfig.java | 22 +- .../nlp/tokenizers/BertTokenizer.java | 43 +- .../pytorch/process/NativePyTorchProcess.java | 1 - .../nlp/tokenizers/BertTokenizerTests.java | 5334 +-- 7 files changed, 29106 insertions(+), 5298 deletions(-) create mode 100644 x-pack/plugin/core/src/test/resources/org/elasticsearch/xpack/core/ml/inference/pipeline_config.json diff --git a/x-pack/plugin/core/src/test/resources/org/elasticsearch/xpack/core/ml/inference/pipeline_config.json b/x-pack/plugin/core/src/test/resources/org/elasticsearch/xpack/core/ml/inference/pipeline_config.json new file mode 100644 index 0000000000000..af998c799bf8a --- /dev/null +++ b/x-pack/plugin/core/src/test/resources/org/elasticsearch/xpack/core/ml/inference/pipeline_config.json @@ -0,0 +1,29001 @@ +{ + "task_type": "token_classification", + "vocab": [ + "[PAD]", + "[unused1]", + "[unused2]", + "[unused3]", + "[unused4]", + "[unused5]", + "[unused6]", + "[unused7]", + "[unused8]", + "[unused9]", + "[unused10]", + "[unused11]", + "[unused12]", + "[unused13]", + "[unused14]", + "[unused15]", + "[unused16]", + "[unused17]", + "[unused18]", + "[unused19]", + "[unused20]", + "[unused21]", + "[unused22]", + "[unused23]", + "[unused24]", + "[unused25]", + "[unused26]", + "[unused27]", + "[unused28]", + "[unused29]", + "[unused30]", + "[unused31]", + "[unused32]", + "[unused33]", + "[unused34]", + "[unused35]", + "[unused36]", + "[unused37]", + "[unused38]", + "[unused39]", + "[unused40]", + "[unused41]", + "[unused42]", + "[unused43]", + "[unused44]", + "[unused45]", + "[unused46]", + "[unused47]", + "[unused48]", + "[unused49]", + "[unused50]", + "[unused51]", + "[unused52]", + "[unused53]", + "[unused54]", + "[unused55]", + "[unused56]", + "[unused57]", + "[unused58]", + "[unused59]", + "[unused60]", + "[unused61]", + "[unused62]", + "[unused63]", + "[unused64]", + "[unused65]", + "[unused66]", + "[unused67]", + "[unused68]", + "[unused69]", + "[unused70]", + "[unused71]", + "[unused72]", + "[unused73]", + "[unused74]", + "[unused75]", + "[unused76]", + "[unused77]", + "[unused78]", + "[unused79]", + "[unused80]", + "[unused81]", + "[unused82]", + "[unused83]", + "[unused84]", + "[unused85]", + "[unused86]", + "[unused87]", + "[unused88]", + "[unused89]", + "[unused90]", + "[unused91]", + "[unused92]", + "[unused93]", + "[unused94]", + "[unused95]", + "[unused96]", + "[unused97]", + "[unused98]", + "[unused99]", + "[UNK]", + "[CLS]", + "[SEP]", + "[MASK]", + "[unused100]", + "[unused101]", + "!", + "\"", + "#", + "$", + "%", + "&", + "'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "/", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + ":", + ";", + "<", + "=", + ">", + "?", + "@", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "[", + "\\", + "]", + "^", + "_", + "`", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "{", + "|", + "}", + "~", + "¡", + "¢", + "£", + "¥", + "§", + "¨", + "©", + "ª", + "«", + "¬", + "®", + "°", + "±", + "²", + "³", + "´", + "µ", + "¶", + "·", + "¹", + "º", + "»", + "¼", + "½", + "¾", + "¿", + "À", + "Á", + "Â", + "Ä", + "Å", + "Æ", + "Ç", + "È", + "É", + "Í", + "Î", + "Ñ", + "Ó", + "Ö", + "×", + "Ø", + "Ú", + "Ü", + "Þ", + "ß", + "à", + "á", + "â", + "ã", + "ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "ö", + "÷", + "ø", + "ù", + "ú", + "û", + "ü", + "ý", + "þ", + "ÿ", + "Ā", + "ā", + "ă", + "ą", + "Ć", + "ć", + "Č", + "č", + "ď", + "Đ", + "đ", + "ē", + "ė", + "ę", + "ě", + "ğ", + "ġ", + "Ħ", + "ħ", + "ĩ", + "Ī", + "ī", + "İ", + "ı", + "ļ", + "Ľ", + "ľ", + "Ł", + "ł", + "ń", + "ņ", + "ň", + "ŋ", + "Ō", + "ō", + "ŏ", + "ő", + "Œ", + "œ", + "ř", + "Ś", + "ś", + "Ş", + "ş", + "Š", + "š", + "Ţ", + "ţ", + "ť", + "ũ", + "ū", + "ŭ", + "ů", + "ű", + "ų", + "ŵ", + "ŷ", + "ź", + "Ż", + "ż", + "Ž", + "ž", + "Ə", + "ƒ", + "ơ", + "ư", + "ǎ", + "ǐ", + "ǒ", + "ǔ", + "ǫ", + "Ș", + "ș", + "Ț", + "ț", + "ɐ", + "ɑ", + "ɔ", + "ɕ", + "ə", + "ɛ", + "ɡ", + "ɣ", + "ɨ", + "ɪ", + "ɲ", + "ɾ", + "ʀ", + "ʁ", + "ʂ", + "ʃ", + "ʊ", + "ʋ", + "ʌ", + "ʐ", + "ʑ", + "ʒ", + "ʔ", + "ʰ", + "ʲ", + "ʳ", + "ʷ", + "ʻ", + "ʼ", + "ʾ", + "ʿ", + "ˈ", + "ː", + "ˡ", + "ˢ", + "ˣ", + "́", + "̃", + "̍", + "̯", + "͡", + "Α", + "Β", + "Γ", + "Δ", + "Ε", + "Η", + "Θ", + "Ι", + "Κ", + "Λ", + "Μ", + "Ν", + "Ο", + "Π", + "Σ", + "Τ", + "Φ", + "Χ", + "Ψ", + "Ω", + "ά", + "έ", + "ή", + "ί", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "ς", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "ό", + "ύ", + "ώ", + "І", + "Ј", + "А", + "Б", + "В", + "Г", + "Д", + "Е", + "Ж", + "З", + "И", + "К", + "Л", + "М", + "Н", + "О", + "П", + "Р", + "С", + "Т", + "У", + "Ф", + "Х", + "Ц", + "Ч", + "Ш", + "Э", + "Ю", + "Я", + "а", + "б", + "в", + "г", + "д", + "е", + "ж", + "з", + "и", + "й", + "к", + "л", + "м", + "н", + "о", + "п", + "р", + "с", + "т", + "у", + "ф", + "х", + "ц", + "ч", + "ш", + "щ", + "ъ", + "ы", + "ь", + "э", + "ю", + "я", + "ё", + "і", + "ї", + "ј", + "њ", + "ћ", + "Ա", + "Հ", + "ա", + "ե", + "ի", + "կ", + "մ", + "յ", + "ն", + "ո", + "ս", + "տ", + "ր", + "ւ", + "ְ", + "ִ", + "ֵ", + "ֶ", + "ַ", + "ָ", + "ֹ", + "ּ", + "א", + "ב", + "ג", + "ד", + "ה", + "ו", + "ז", + "ח", + "ט", + "י", + "כ", + "ל", + "ם", + "מ", + "ן", + "נ", + "ס", + "ע", + "פ", + "צ", + "ק", + "ר", + "ש", + "ת", + "،", + "ء", + "آ", + "أ", + "إ", + "ئ", + "ا", + "ب", + "ة", + "ت", + "ث", + "ج", + "ح", + "خ", + "د", + "ذ", + "ر", + "ز", + "س", + "ش", + "ص", + "ض", + "ط", + "ظ", + "ع", + "غ", + "ف", + "ق", + "ك", + "ل", + "م", + "ن", + "ه", + "و", + "ى", + "ي", + "َ", + "ِ", + "ٹ", + "پ", + "چ", + "ک", + "گ", + "ہ", + "ی", + "ے", + "ं", + "आ", + "क", + "ग", + "च", + "ज", + "ण", + "त", + "द", + "ध", + "न", + "प", + "ब", + "भ", + "म", + "य", + "र", + "ल", + "व", + "श", + "ष", + "स", + "ह", + "ा", + "ि", + "ी", + "ु", + "े", + "ो", + "्", + "।", + "॥", + "আ", + "ই", + "এ", + "ও", + "ক", + "খ", + "গ", + "চ", + "ছ", + "জ", + "ট", + "ত", + "থ", + "দ", + "ধ", + "ন", + "প", + "ব", + "ম", + "য", + "র", + "ল", + "শ", + "স", + "হ", + "়", + "া", + "ি", + "ী", + "ু", + "ে", + "ো", + "্", + "য়", + "க", + "த", + "ப", + "ம", + "ய", + "ர", + "ல", + "வ", + "ா", + "ி", + "ு", + "்", + "ร", + "་", + "ག", + "ང", + "ད", + "ན", + "བ", + "མ", + "ར", + "ལ", + "ས", + "ི", + "ུ", + "ེ", + "ོ", + "ა", + "ე", + "ი", + "ლ", + "ნ", + "ო", + "რ", + "ს", + "ᴬ", + "ᴵ", + "ᵀ", + "ᵃ", + "ᵇ", + "ᵈ", + "ᵉ", + "ᵍ", + "ᵏ", + "ᵐ", + "ᵒ", + "ᵖ", + "ᵗ", + "ᵘ", + "ᵢ", + "ᵣ", + "ᵤ", + "ᵥ", + "ᶜ", + "ᶠ", + "ḍ", + "Ḥ", + "ḥ", + "Ḩ", + "ḩ", + "ḳ", + "ṃ", + "ṅ", + "ṇ", + "ṛ", + "ṣ", + "ṭ", + "ạ", + "ả", + "ấ", + "ầ", + "ẩ", + "ậ", + "ắ", + "ế", + "ề", + "ể", + "ễ", + "ệ", + "ị", + "ọ", + "ố", + "ồ", + "ổ", + "ộ", + "ớ", + "ờ", + "ợ", + "ụ", + "ủ", + "ứ", + "ừ", + "ử", + "ữ", + "ự", + "ỳ", + "ỹ", + "ἀ", + "ἐ", + "ὁ", + "ὐ", + "ὰ", + "ὶ", + "ὸ", + "ῆ", + "ῖ", + "ῦ", + "ῶ", + "‐", + "‑", + "‒", + "–", + "—", + "―", + "‖", + "‘", + "’", + "‚", + "“", + "”", + "„", + "†", + "‡", + "•", + "…", + "‰", + "′", + "″", + "⁄", + "⁰", + "ⁱ", + "⁴", + "⁵", + "⁶", + "⁷", + "⁸", + "⁹", + "⁺", + "⁻", + "ⁿ", + "₀", + "₁", + "₂", + "₃", + "₄", + "₅", + "₆", + "₇", + "₈", + "₉", + "₊", + "₍", + "₎", + "ₐ", + "ₑ", + "ₒ", + "ₓ", + "ₕ", + "ₖ", + "ₘ", + "ₙ", + "ₚ", + "ₛ", + "ₜ", + "₤", + "€", + "₱", + "₹", + "ℓ", + "№", + "ℝ", + "⅓", + "←", + "↑", + "→", + "↔", + "⇌", + "⇒", + "∂", + "∈", + "−", + "∗", + "∘", + "√", + "∞", + "∧", + "∨", + "∩", + "∪", + "≈", + "≠", + "≡", + "≤", + "≥", + "⊂", + "⊆", + "⊕", + "⋅", + "─", + "│", + "■", + "●", + "★", + "☆", + "☉", + "♠", + "♣", + "♥", + "♦", + "♭", + "♯", + "⟨", + "⟩", + "ⱼ", + "、", + "。", + "《", + "》", + "「", + "」", + "『", + "』", + "〜", + "い", + "う", + "え", + "お", + "か", + "き", + "く", + "け", + "こ", + "さ", + "し", + "す", + "せ", + "そ", + "た", + "ち", + "つ", + "て", + "と", + "な", + "に", + "の", + "は", + "ひ", + "ま", + "み", + "む", + "め", + "も", + "や", + "ゆ", + "よ", + "ら", + "り", + "る", + "れ", + "ん", + "ア", + "ィ", + "イ", + "ウ", + "エ", + "オ", + "カ", + "ガ", + "キ", + "ク", + "グ", + "コ", + "サ", + "シ", + "ジ", + "ス", + "ズ", + "タ", + "ダ", + "ッ", + "テ", + "デ", + "ト", + "ド", + "ナ", + "ニ", + "ハ", + "バ", + "パ", + "フ", + "ブ", + "プ", + "マ", + "ミ", + "ム", + "ャ", + "ュ", + "ラ", + "リ", + "ル", + "レ", + "ロ", + "ン", + "・", + "ー", + "一", + "三", + "上", + "下", + "中", + "事", + "二", + "井", + "京", + "人", + "亻", + "仁", + "佐", + "侍", + "光", + "公", + "力", + "北", + "十", + "南", + "原", + "口", + "史", + "司", + "吉", + "同", + "和", + "囗", + "国", + "國", + "土", + "城", + "士", + "大", + "天", + "太", + "夫", + "女", + "子", + "宀", + "安", + "宮", + "宿", + "小", + "尚", + "山", + "島", + "川", + "州", + "平", + "年", + "心", + "愛", + "戸", + "文", + "新", + "方", + "日", + "明", + "星", + "書", + "月", + "木", + "本", + "李", + "村", + "東", + "松", + "林", + "正", + "武", + "氏", + "水", + "氵", + "江", + "河", + "海", + "版", + "犬", + "王", + "生", + "田", + "白", + "皇", + "省", + "真", + "石", + "社", + "神", + "竹", + "美", + "義", + "花", + "藤", + "西", + "谷", + "車", + "辶", + "道", + "郎", + "郡", + "部", + "野", + "金", + "長", + "門", + "陽", + "青", + "食", + "馬", + "高", + "龍", + "龸", + "사", + "씨", + "의", + "이", + "한", + "fi", + "fl", + "!", + "(", + ")", + ",", + "-", + "/", + ":", + "the", + "of", + "and", + "to", + "in", + "was", + "The", + "is", + "for", + "as", + "on", + "with", + "that", + "##s", + "his", + "by", + "he", + "at", + "from", + "it", + "her", + "He", + "had", + "an", + "were", + "you", + "be", + "In", + "she", + "are", + "but", + "which", + "It", + "not", + "or", + "have", + "my", + "him", + "one", + "this", + "me", + "has", + "also", + "up", + "their", + "first", + "out", + "who", + "been", + "they", + "She", + "into", + "all", + "would", + "its", + "##ing", + "time", + "two", + "##a", + "##e", + "said", + "about", + "when", + "over", + "more", + "other", + "can", + "after", + "back", + "them", + "then", + "##ed", + "there", + "like", + "so", + "only", + "##n", + "could", + "##d", + "##i", + "##y", + "what", + "no", + "##o", + "where", + "This", + "made", + "than", + "if", + "You", + "##ly", + "through", + "we", + "before", + "##r", + "just", + "some", + "##er", + "years", + "do", + "New", + "##t", + "down", + "between", + "new", + "now", + "will", + "three", + "most", + "On", + "around", + "year", + "used", + "such", + "being", + "well", + "during", + "They", + "know", + "against", + "under", + "later", + "did", + "part", + "known", + "off", + "while", + "His", + "re", + "...", + "##l", + "people", + "until", + "way", + "American", + "didn", + "University", + "your", + "both", + "many", + "get", + "United", + "became", + "head", + "There", + "second", + "As", + "work", + "any", + "But", + "still", + "again", + "born", + "even", + "eyes", + "After", + "including", + "de", + "took", + "And", + "long", + "team", + "season", + "family", + "see", + "right", + "same", + "called", + "name", + "because", + "film", + "don", + "10", + "found", + "much", + "school", + "##es", + "going", + "won", + "place", + "away", + "We", + "day", + "left", + "John", + "000", + "hand", + "since", + "World", + "these", + "how", + "make", + "number", + "each", + "life", + "area", + "man", + "four", + "go", + "No", + "here", + "very", + "National", + "##m", + "played", + "released", + "never", + "began", + "States", + "album", + "home", + "last", + "too", + "held", + "several", + "May", + "own", + "##on", + "take", + "end", + "School", + "##h", + "ll", + "series", + "What", + "want", + "use", + "another", + "city", + "When", + "2010", + "side", + "At", + "may", + "That", + "came", + "face", + "June", + "think", + "game", + "those", + "high", + "March", + "early", + "September", + "##al", + "2011", + "looked", + "July", + "state", + "small", + "thought", + "went", + "January", + "October", + "##u", + "based", + "August", + "##us", + "world", + "good", + "April", + "York", + "us", + "12", + "2012", + "2008", + "For", + "2009", + "group", + "along", + "few", + "South", + "little", + "##k", + "following", + "November", + "something", + "2013", + "December", + "set", + "2007", + "old", + "2006", + "2014", + "located", + "##an", + "music", + "County", + "City", + "former", + "##in", + "room", + "ve", + "next", + "All", + "##man", + "got", + "father", + "house", + "##g", + "body", + "15", + "20", + "18", + "started", + "If", + "2015", + "town", + "our", + "line", + "War", + "large", + "population", + "named", + "British", + "company", + "member", + "five", + "My", + "single", + "##en", + "age", + "State", + "moved", + "February", + "11", + "Her", + "should", + "century", + "government", + "built", + "come", + "best", + "show", + "However", + "within", + "look", + "men", + "door", + "without", + "need", + "wasn", + "2016", + "water", + "One", + "system", + "knew", + "every", + "died", + "League", + "turned", + "asked", + "North", + "St", + "wanted", + "building", + "received", + "song", + "served", + "though", + "felt", + "##ia", + "station", + "band", + "##ers", + "local", + "public", + "himself", + "different", + "death", + "say", + "##1", + "30", + "##2", + "2005", + "16", + "night", + "behind", + "children", + "English", + "members", + "near", + "saw", + "together", + "son", + "14", + "voice", + "village", + "13", + "hands", + "help", + "##3", + "due", + "French", + "London", + "top", + "told", + "open", + "published", + "third", + "2017", + "play", + "across", + "During", + "put", + "final", + "often", + "include", + "25", + "##le", + "main", + "having", + "2004", + "once", + "ever", + "let", + "book", + "led", + "gave", + "late", + "front", + "find", + "club", + "##4", + "German", + "included", + "species", + "College", + "form", + "opened", + "mother", + "women", + "enough", + "West", + "must", + "2000", + "power", + "really", + "17", + "making", + "half", + "##6", + "order", + "might", + "##is", + "given", + "million", + "times", + "days", + "point", + "full", + "service", + "With", + "km", + "major", + "##7", + "original", + "become", + "seen", + "II", + "north", + "six", + "##te", + "love", + "##0", + "national", + "International", + "##5", + "24", + "So", + "District", + "lost", + "run", + "couldn", + "career", + "always", + "##9", + "2003", + "##th", + "country", + "##z", + "House", + "air", + "tell", + "south", + "worked", + "woman", + "player", + "##A", + "almost", + "war", + "River", + "##ic", + "married", + "continued", + "Then", + "James", + "close", + "black", + "short", + "##8", + "##na", + "using", + "history", + "returned", + "light", + "car", + "##ra", + "sure", + "William", + "things", + "General", + "##ry", + "2002", + "better", + "support", + "100", + "among", + "From", + "feet", + "King", + "anything", + "21", + "19", + "established", + "district", + "2001", + "feel", + "great", + "##ton", + "level", + "Cup", + "These", + "written", + "games", + "others", + "already", + "title", + "story", + "##p", + "law", + "thing", + "US", + "record", + "role", + "however", + "By", + "students", + "England", + "white", + "control", + "least", + "inside", + "land", + "##C", + "22", + "give", + "community", + "hard", + "##ie", + "non", + "##c", + "produced", + "George", + "round", + "period", + "Park", + "business", + "various", + "##ne", + "does", + "present", + "wife", + "far", + "taken", + "per", + "reached", + "David", + "able", + "version", + "working", + "young", + "live", + "created", + "joined", + "East", + "living", + "appeared", + "case", + "High", + "done", + "23", + "important", + "President", + "Award", + "France", + "position", + "office", + "looking", + "total", + "general", + "class", + "To", + "production", + "##S", + "football", + "party", + "brother", + "keep", + "mind", + "free", + "Street", + "hair", + "announced", + "development", + "either", + "nothing", + "moment", + "Church", + "followed", + "wrote", + "why", + "India", + "San", + "election", + "1999", + "lead", + "How", + "##ch", + "##rs", + "words", + "European", + "course", + "considered", + "America", + "arms", + "Army", + "political", + "##la", + "28", + "26", + "west", + "east", + "ground", + "further", + "church", + "less", + "site", + "First", + "Not", + "Australia", + "toward", + "California", + "##ness", + "described", + "works", + "An", + "Council", + "heart", + "past", + "military", + "27", + "##or", + "heard", + "field", + "human", + "soon", + "founded", + "1998", + "playing", + "trying", + "##x", + "##ist", + "##ta", + "television", + "mouth", + "although", + "taking", + "win", + "fire", + "Division", + "##ity", + "Party", + "Royal", + "program", + "Some", + "Don", + "Association", + "According", + "tried", + "TV", + "Paul", + "outside", + "daughter", + "Best", + "While", + "someone", + "match", + "recorded", + "Canada", + "closed", + "region", + "Air", + "above", + "months", + "elected", + "##da", + "##ian", + "road", + "##ar", + "brought", + "move", + "1997", + "leave", + "##um", + "Thomas", + "1996", + "am", + "low", + "Robert", + "formed", + "person", + "services", + "points", + "Mr", + "miles", + "##b", + "stop", + "rest", + "doing", + "needed", + "international", + "release", + "floor", + "start", + "sound", + "call", + "killed", + "real", + "dark", + "research", + "finished", + "language", + "Michael", + "professional", + "change", + "sent", + "50", + "upon", + "29", + "track", + "hit", + "event", + "2018", + "term", + "example", + "Germany", + "similar", + "return", + "##ism", + "fact", + "pulled", + "stood", + "says", + "ran", + "information", + "yet", + "result", + "developed", + "girl", + "##re", + "God", + "1995", + "areas", + "signed", + "decided", + "##ment", + "Company", + "seemed", + "##el", + "co", + "turn", + "race", + "common", + "video", + "Charles", + "Indian", + "##ation", + "blood", + "art", + "red", + "##able", + "added", + "rather", + "1994", + "met", + "director", + "addition", + "design", + "average", + "minutes", + "##ies", + "##ted", + "available", + "bed", + "coming", + "friend", + "idea", + "kind", + "Union", + "Road", + "remained", + "##ting", + "everything", + "##ma", + "running", + "care", + "finally", + "Chinese", + "appointed", + "1992", + "Australian", + "##ley", + "popular", + "mean", + "teams", + "probably", + "##land", + "usually", + "project", + "social", + "Championship", + "possible", + "word", + "Russian", + "instead", + "mi", + "herself", + "##T", + "Peter", + "Hall", + "Center", + "seat", + "style", + "money", + "1993", + "else", + "Department", + "table", + "Music", + "current", + "31", + "features", + "special", + "events", + "character", + "Two", + "square", + "sold", + "debut", + "##v", + "process", + "Although", + "Since", + "##ka", + "40", + "Central", + "currently", + "education", + "placed", + "lot", + "China", + "quickly", + "forward", + "seven", + "##ling", + "Europe", + "arm", + "performed", + "Japanese", + "1991", + "Henry", + "Now", + "Dr", + "##ion", + "week", + "Group", + "myself", + "big", + "UK", + "Washington", + "ten", + "deep", + "1990", + "Club", + "Japan", + "space", + "La", + "directed", + "smile", + "episode", + "hours", + "whole", + "##de", + "##less", + "Why", + "wouldn", + "designed", + "strong", + "training", + "changed", + "Society", + "stage", + "involved", + "hadn", + "towards", + "leading", + "police", + "eight", + "kept", + "Institute", + "study", + "largest", + "child", + "eventually", + "private", + "modern", + "Court", + "throughout", + "getting", + "originally", + "attack", + "##E", + "talk", + "Great", + "longer", + "songs", + "alone", + "##ine", + "wide", + "dead", + "walked", + "shot", + "##ri", + "Oh", + "force", + "##st", + "Art", + "today", + "friends", + "Island", + "Richard", + "1989", + "center", + "construction", + "believe", + "size", + "White", + "ship", + "completed", + "##B", + "gone", + "Just", + "rock", + "sat", + "##R", + "radio", + "below", + "entire", + "families", + "league", + "includes", + "type", + "lived", + "official", + "range", + "hold", + "featured", + "Most", + "##ter", + "president", + "passed", + "means", + "##f", + "forces", + "lips", + "Mary", + "Do", + "guitar", + "##ce", + "food", + "wall", + "Of", + "spent", + "Its", + "performance", + "hear", + "##P", + "Western", + "reported", + "sister", + "##et", + "morning", + "##M", + "especially", + "##ive", + "Minister", + "itself", + "post", + "bit", + "groups", + "1988", + "##tion", + "Black", + "##ng", + "Well", + "raised", + "sometimes", + "Canadian", + "Paris", + "Spanish", + "replaced", + "schools", + "Academy", + "leaving", + "central", + "female", + "Christian", + "Jack", + "whose", + "college", + "onto", + "provided", + "##D", + "##ville", + "players", + "actually", + "stopped", + "##son", + "Museum", + "doesn", + "##ts", + "books", + "fight", + "allowed", + "##ur", + "beginning", + "Records", + "awarded", + "parents", + "coach", + "##os", + "Red", + "saying", + "##ck", + "Smith", + "Yes", + "Lake", + "##L", + "aircraft", + "1987", + "##ble", + "previous", + "ft", + "action", + "Italian", + "African", + "happened", + "vocals", + "Act", + "future", + "court", + "##ge", + "1986", + "degree", + "phone", + "##ro", + "Is", + "countries", + "winning", + "breath", + "Love", + "river", + "matter", + "Lord", + "Other", + "list", + "self", + "parts", + "##ate", + "provide", + "cut", + "shows", + "plan", + "1st", + "interest", + "##ized", + "Africa", + "stated", + "Sir", + "fell", + "owned", + "earlier", + "ended", + "competition", + "attention", + "1985", + "lower", + "nearly", + "bad", + "older", + "stay", + "Saint", + "##se", + "certain", + "1984", + "fingers", + "blue", + "try", + "fourth", + "Grand", + "##as", + "king", + "##nt", + "makes", + "chest", + "movement", + "states", + "moving", + "data", + "introduced", + "model", + "date", + "section", + "Los", + "deal", + "##I", + "skin", + "entered", + "middle", + "success", + "Texas", + "##w", + "summer", + "island", + "##N", + "Republic", + "length", + "husband", + "1980", + "##ey", + "reason", + "anyone", + "forced", + "via", + "base", + "500", + "job", + "covered", + "Festival", + "Roman", + "successful", + "rights", + "cover", + "Man", + "writing", + "Ireland", + "##F", + "related", + "goal", + "takes", + "buildings", + "true", + "weeks", + "1983", + "Because", + "opening", + "novel", + "ISBN", + "meet", + "gold", + "##ous", + "mid", + "km²", + "standing", + "Football", + "Chicago", + "shook", + "whom", + "##ki", + "1982", + "Day", + "feeling", + "scored", + "boy", + "higher", + "Force", + "leader", + "heavy", + "fall", + "question", + "sense", + "army", + "Second", + "energy", + "meeting", + "themselves", + "kill", + "##am", + "board", + "census", + "##ya", + "##ns", + "mine", + "meant", + "market", + "required", + "battle", + "campaign", + "attended", + "approximately", + "Kingdom", + "runs", + "active", + "##ha", + "contract", + "clear", + "previously", + "health", + "1979", + "Arts", + "complete", + "Catholic", + "couple", + "units", + "##ll", + "##ty", + "Committee", + "shoulder", + "sea", + "systems", + "listed", + "##O", + "caught", + "tournament", + "##G", + "northern", + "author", + "Film", + "Your", + "##men", + "holding", + "offered", + "personal", + "1981", + "southern", + "artist", + "traditional", + "studio", + "200", + "capital", + "##ful", + "regular", + "ask", + "giving", + "organization", + "month", + "news", + "Are", + "read", + "managed", + "helped", + "studied", + "student", + "defeated", + "natural", + "industry", + "Year", + "noted", + "decision", + "Government", + "quite", + "##id", + "smiled", + "1972", + "Maybe", + "tracks", + "##ke", + "Mark", + "al", + "media", + "engine", + "hour", + "Their", + "relationship", + "plays", + "property", + "structure", + "1976", + "ago", + "Hill", + "Martin", + "1978", + "ready", + "Many", + "Like", + "Bay", + "immediately", + "generally", + "Italy", + "Greek", + "practice", + "caused", + "division", + "significant", + "Joseph", + "speed", + "Let", + "thinking", + "completely", + "1974", + "primary", + "mostly", + "##field", + "##K", + "1975", + "##to", + "Even", + "writer", + "##led", + "dropped", + "magazine", + "collection", + "understand", + "route", + "highest", + "particular", + "films", + "lines", + "network", + "Science", + "loss", + "carried", + "direction", + "green", + "1977", + "location", + "producer", + "according", + "Women", + "Queen", + "neck", + "thus", + "independent", + "view", + "1970", + "Angeles", + "Soviet", + "distance", + "problem", + "Board", + "tour", + "western", + "income", + "appearance", + "access", + "Mexico", + "nodded", + "street", + "surface", + "arrived", + "believed", + "Old", + "1968", + "1973", + "becoming", + "whether", + "1945", + "figure", + "singer", + "stand", + "Following", + "issue", + "window", + "wrong", + "pain", + "everyone", + "lives", + "issues", + "park", + "slowly", + "la", + "act", + "##va", + "bring", + "Lee", + "operations", + "key", + "comes", + "fine", + "cold", + "famous", + "Navy", + "1971", + "Me", + "additional", + "individual", + "##ner", + "Zealand", + "goals", + "county", + "contains", + "Service", + "minute", + "2nd", + "reach", + "talking", + "particularly", + "##ham", + "movie", + "Director", + "glass", + "paper", + "studies", + "##co", + "railway", + "standard", + "Education", + "45", + "represented", + "Chief", + "Louis", + "launched", + "Star", + "terms", + "60", + "1969", + "experience", + "watched", + "Another", + "Press", + "Tom", + "staff", + "starting", + "subject", + "break", + "Virginia", + "nine", + "eye", + "##age", + "evidence", + "foot", + "##est", + "companies", + "Prince", + "##V", + "gun", + "create", + "Big", + "People", + "guy", + "Green", + "simply", + "numerous", + "##line", + "increased", + "twenty", + "##ga", + "##do", + "1967", + "award", + "officer", + "stone", + "Before", + "material", + "Northern", + "grew", + "male", + "plant", + "Life", + "legs", + "step", + "Al", + "unit", + "35", + "except", + "answer", + "##U", + "report", + "response", + "Edward", + "commercial", + "edition", + "trade", + "science", + "##ca", + "Irish", + "Law", + "shown", + "rate", + "failed", + "##ni", + "remains", + "changes", + "mm", + "limited", + "larger", + "Later", + "cause", + "waiting", + "Time", + "##wood", + "cost", + "Bill", + "manager", + "activities", + "likely", + "allow", + "operated", + "retired", + "##ping", + "65", + "directly", + "Who", + "associated", + "effect", + "hell", + "Florida", + "straight", + "hot", + "Valley", + "management", + "girls", + "expected", + "eastern", + "Mike", + "chance", + "cast", + "centre", + "chair", + "hurt", + "problems", + "##li", + "walk", + "programs", + "Team", + "characters", + "Battle", + "edge", + "pay", + "maybe", + "corner", + "majority", + "medical", + "Joe", + "Summer", + "##io", + "attempt", + "Pacific", + "command", + "Radio", + "##by", + "names", + "municipality", + "1964", + "train", + "economic", + "Brown", + "feature", + "sex", + "source", + "agreed", + "remember", + "Three", + "1966", + "1965", + "Pennsylvania", + "victory", + "senior", + "annual", + "III", + "Southern", + "results", + "Sam", + "serving", + "religious", + "Jones", + "appears", + "##der", + "despite", + "claimed", + "Both", + "musical", + "matches", + "fast", + "security", + "selected", + "Young", + "double", + "complex", + "hospital", + "chief", + "Times", + "##ve", + "Championships", + "filled", + "Public", + "Despite", + "beautiful", + "Research", + "plans", + "Province", + "##ally", + "Wales", + "##ko", + "artists", + "metal", + "nearby", + "Spain", + "##il", + "32", + "houses", + "supported", + "piece", + "##no", + "stared", + "recording", + "nature", + "legal", + "Russia", + "##ization", + "remaining", + "looks", + "##sh", + "bridge", + "closer", + "cases", + "scene", + "marriage", + "Little", + "##é", + "uses", + "Earth", + "specific", + "Frank", + "theory", + "Good", + "discovered", + "referred", + "bass", + "culture", + "university", + "presented", + "Congress", + "##go", + "metres", + "continue", + "1960", + "isn", + "Awards", + "meaning", + "cell", + "composed", + "separate", + "Series", + "forms", + "Blue", + "cross", + "##tor", + "increase", + "test", + "computer", + "slightly", + "Where", + "Jewish", + "Town", + "tree", + "status", + "1944", + "variety", + "responsible", + "pretty", + "initially", + "##way", + "realized", + "pass", + "provides", + "Captain", + "Alexander", + "recent", + "score", + "broke", + "Scott", + "drive", + "financial", + "showed", + "Line", + "stories", + "ordered", + "soldiers", + "genus", + "operation", + "gaze", + "sitting", + "society", + "Only", + "hope", + "actor", + "follow", + "Empire", + "Yeah", + "technology", + "happy", + "focus", + "policy", + "spread", + "situation", + "##ford", + "##ba", + "Mrs", + "watch", + "Can", + "1963", + "Commission", + "touch", + "earned", + "troops", + "Under", + "1962", + "individuals", + "cannot", + "19th", + "##lin", + "mile", + "expression", + "exactly", + "suddenly", + "weight", + "dance", + "stepped", + "places", + "appear", + "difficult", + "Railway", + "anti", + "numbers", + "kilometres", + "star", + "##ier", + "department", + "ice", + "Britain", + "removed", + "Once", + "##lo", + "Boston", + "value", + "##ant", + "mission", + "trees", + "Order", + "sports", + "join", + "serve", + "Major", + "poor", + "Poland", + "mainly", + "Theatre", + "pushed", + "Station", + "##it", + "Lady", + "federal", + "silver", + "##ler", + "foreign", + "##ard", + "Eastern", + "##den", + "box", + "hall", + "subsequently", + "lies", + "acquired", + "1942", + "ancient", + "CD", + "History", + "Jean", + "beyond", + "##ger", + "El", + "##les", + "growing", + "championship", + "native", + "Parliament", + "Williams", + "watching", + "direct", + "overall", + "offer", + "Also", + "80", + "Secretary", + "spoke", + "Latin", + "ability", + "##ated", + "safe", + "presence", + "##ial", + "headed", + "regional", + "planned", + "1961", + "Johnson", + "throat", + "consists", + "##W", + "extended", + "Or", + "bar", + "walls", + "Chris", + "stations", + "politician", + "Olympics", + "influence", + "share", + "fighting", + "speak", + "hundred", + "Carolina", + "die", + "stars", + "##tic", + "color", + "Chapter", + "##ish", + "fear", + "sleep", + "goes", + "Francisco", + "oil", + "Bank", + "sign", + "physical", + "##berg", + "Dutch", + "seasons", + "##rd", + "Games", + "Governor", + "sorry", + "lack", + "Centre", + "memory", + "baby", + "smaller", + "charge", + "Did", + "multiple", + "ships", + "shirt", + "Assembly", + "amount", + "leaves", + "3rd", + "Foundation", + "conditions", + "1943", + "Rock", + "Democratic", + "Daniel", + "##at", + "winner", + "products", + "##ina", + "store", + "latter", + "Professor", + "civil", + "prior", + "host", + "1956", + "soft", + "vote", + "needs", + "Each", + "rules", + "1958", + "pressure", + "letter", + "normal", + "proposed", + "levels", + "records", + "1959", + "paid", + "intended", + "Victoria", + "purpose", + "okay", + "historical", + "issued", + "1980s", + "broadcast", + "rule", + "simple", + "picked", + "firm", + "Sea", + "1941", + "Elizabeth", + "1940", + "serious", + "featuring", + "highly", + "graduated", + "mentioned", + "choice", + "1948", + "replied", + "percent", + "Scotland", + "##hi", + "females", + "constructed", + "1957", + "settled", + "Steve", + "recognized", + "cities", + "crew", + "glanced", + "kiss", + "competed", + "flight", + "knowledge", + "editor", + "More", + "Conference", + "##H", + "fifth", + "elements", + "##ee", + "##tes", + "function", + "newspaper", + "recently", + "Miss", + "cultural", + "brown", + "twice", + "Office", + "1939", + "truth", + "Creek", + "1946", + "households", + "USA", + "1950", + "quality", + "##tt", + "border", + "seconds", + "destroyed", + "pre", + "wait", + "ahead", + "build", + "image", + "90", + "cars", + "##mi", + "33", + "promoted", + "professor", + "et", + "bank", + "medal", + "text", + "broken", + "Middle", + "revealed", + "sides", + "wing", + "seems", + "channel", + "1970s", + "Ben", + "loved", + "effort", + "officers", + "Will", + "##ff", + "70", + "Israel", + "Jim", + "upper", + "fully", + "label", + "Jr", + "assistant", + "powerful", + "pair", + "positive", + "##ary", + "gives", + "1955", + "20th", + "races", + "remain", + "kitchen", + "primarily", + "##ti", + "Sydney", + "easy", + "Tour", + "whispered", + "buried", + "300", + "News", + "Polish", + "1952", + "Duke", + "Columbia", + "produce", + "accepted", + "00", + "approach", + "minor", + "1947", + "Special", + "44", + "Asian", + "basis", + "visit", + "Fort", + "Civil", + "finish", + "formerly", + "beside", + "leaned", + "##ite", + "median", + "rose", + "coast", + "effects", + "supposed", + "Cross", + "##hip", + "Corps", + "residents", + "Jackson", + "##ir", + "Bob", + "basketball", + "36", + "Asia", + "seem", + "Bishop", + "Book", + "##ber", + "ring", + "##ze", + "owner", + "BBC", + "##ja", + "transferred", + "acting", + "De", + "appearances", + "walking", + "Le", + "press", + "grabbed", + "1954", + "officially", + "1953", + "##pe", + "risk", + "taught", + "review", + "##X", + "lay", + "##well", + "council", + "Avenue", + "seeing", + "losing", + "Ohio", + "Super", + "province", + "ones", + "travel", + "##sa", + "projects", + "equipment", + "spot", + "Berlin", + "administrative", + "heat", + "potential", + "shut", + "capacity", + "elections", + "growth", + "fought", + "Republican", + "mixed", + "Andrew", + "teacher", + "turning", + "strength", + "shoulders", + "beat", + "wind", + "1949", + "Health", + "follows", + "camp", + "suggested", + "perhaps", + "Alex", + "mountain", + "contact", + "divided", + "candidate", + "fellow", + "34", + "Show", + "necessary", + "workers", + "ball", + "horse", + "ways", + "questions", + "protect", + "gas", + "activity", + "younger", + "bottom", + "founder", + "Scottish", + "screen", + "treatment", + "easily", + "com", + "##house", + "dedicated", + "Master", + "warm", + "Night", + "Georgia", + "Long", + "von", + "##me", + "perfect", + "website", + "1960s", + "piano", + "efforts", + "##ide", + "Tony", + "sort", + "offers", + "Development", + "Simon", + "executive", + "##nd", + "save", + "Over", + "Senate", + "1951", + "1990s", + "draw", + "master", + "Police", + "##ius", + "renamed", + "boys", + "initial", + "prominent", + "damage", + "Co", + "##ov", + "##za", + "online", + "begin", + "occurred", + "captured", + "youth", + "Top", + "account", + "tells", + "Justice", + "conducted", + "forest", + "##town", + "bought", + "teeth", + "Jersey", + "##di", + "purchased", + "agreement", + "Michigan", + "##ure", + "campus", + "prison", + "becomes", + "product", + "secret", + "guess", + "Route", + "huge", + "types", + "drums", + "64", + "split", + "defeat", + "estate", + "housing", + "##ot", + "brothers", + "Coast", + "declared", + "happen", + "titled", + "therefore", + "sun", + "commonly", + "alongside", + "Stadium", + "library", + "Home", + "article", + "steps", + "telling", + "slow", + "assigned", + "refused", + "laughed", + "wants", + "Nick", + "wearing", + "Rome", + "Open", + "##ah", + "Hospital", + "pointed", + "Taylor", + "lifted", + "escape", + "participated", + "##j", + "drama", + "parish", + "Santa", + "##per", + "organized", + "mass", + "pick", + "Airport", + "gets", + "Library", + "unable", + "pull", + "Live", + "##ging", + "surrounding", + "##ries", + "focused", + "Adam", + "facilities", + "##ning", + "##ny", + "38", + "##ring", + "notable", + "era", + "connected", + "gained", + "operating", + "laid", + "Regiment", + "branch", + "defined", + "Christmas", + "machine", + "Four", + "academic", + "Iran", + "adopted", + "concept", + "Men", + "compared", + "search", + "traffic", + "Max", + "Maria", + "greater", + "##ding", + "widely", + "##burg", + "serves", + "1938", + "37", + "Go", + "hotel", + "shared", + "typically", + "scale", + "1936", + "leg", + "suffered", + "yards", + "pieces", + "Ministry", + "Wilson", + "episodes", + "empty", + "1918", + "safety", + "continues", + "yellow", + "historic", + "settlement", + "400", + "Come", + "Corporation", + "enemy", + "content", + "picture", + "evening", + "territory", + "method", + "trial", + "solo", + "driver", + "Here", + "##ls", + "entrance", + "Prize", + "spring", + "whatever", + "##ent", + "75", + "##ji", + "reading", + "Arthur", + "##cy", + "Our", + "clothes", + "Prime", + "Illinois", + "Kong", + "code", + "##ria", + "sit", + "Harry", + "Federal", + "chosen", + "administration", + "bodies", + "begins", + "stomach", + "Though", + "seats", + "Hong", + "density", + "Sun", + "leaders", + "Field", + "museum", + "chart", + "platform", + "languages", + "##ron", + "birth", + "holds", + "Gold", + "##un", + "fish", + "combined", + "##ps", + "4th", + "1937", + "largely", + "captain", + "trust", + "Game", + "van", + "boat", + "Oxford", + "basic", + "beneath", + "Islands", + "painting", + "nice", + "Toronto", + "path", + "males", + "sources", + "block", + "conference", + "parties", + "murder", + "clubs", + "crowd", + "calling", + "About", + "Business", + "peace", + "knows", + "lake", + "speaking", + "stayed", + "Brazil", + "allowing", + "Born", + "unique", + "thick", + "Technology", + "##que", + "receive", + "des", + "semi", + "alive", + "noticed", + "format", + "##ped", + "coffee", + "digital", + "##ned", + "handed", + "guard", + "tall", + "faced", + "setting", + "plants", + "partner", + "claim", + "reduced", + "temple", + "animals", + "determined", + "classes", + "##out", + "estimated", + "##ad", + "Olympic", + "providing", + "Massachusetts", + "learned", + "Inc", + "Philadelphia", + "Social", + "carry", + "42", + "possibly", + "hosted", + "tonight", + "respectively", + "Today", + "shape", + "Mount", + "roles", + "designated", + "brain", + "etc", + "Korea", + "thoughts", + "Brian", + "Highway", + "doors", + "background", + "drew", + "models", + "footballer", + "tone", + "turns", + "1935", + "quiet", + "tower", + "wood", + "bus", + "write", + "software", + "weapons", + "flat", + "marked", + "1920", + "newly", + "tight", + "Eric", + "finger", + "Journal", + "FC", + "Van", + "rise", + "critical", + "Atlantic", + "granted", + "returning", + "communities", + "humans", + "quick", + "39", + "48", + "ranked", + "sight", + "pop", + "Swedish", + "Stephen", + "card", + "analysis", + "attacked", + "##wa", + "Sunday", + "identified", + "Jason", + "champion", + "situated", + "1930", + "expanded", + "tears", + "##nce", + "reaching", + "Davis", + "protection", + "Emperor", + "positions", + "nominated", + "Bridge", + "tax", + "dress", + "allows", + "avoid", + "leadership", + "killing", + "actress", + "guest", + "steel", + "knowing", + "electric", + "cells", + "disease", + "grade", + "unknown", + "##ium", + "resulted", + "Pakistan", + "confirmed", + "##ged", + "tongue", + "covers", + "##Y", + "roof", + "entirely", + "applied", + "votes", + "drink", + "interview", + "exchange", + "Township", + "reasons", + "##ised", + "page", + "calls", + "dog", + "agent", + "nose", + "teaching", + "##ds", + "##ists", + "advanced", + "wish", + "Golden", + "existing", + "vehicle", + "del", + "1919", + "develop", + "attacks", + "pressed", + "Sports", + "planning", + "resulting", + "facility", + "Sarah", + "notes", + "1933", + "Class", + "Historic", + "winter", + "##mo", + "audience", + "Community", + "household", + "Netherlands", + "creation", + "##ize", + "keeping", + "1914", + "claims", + "dry", + "guys", + "opposite", + "##ak", + "explained", + "Ontario", + "secondary", + "difference", + "Francis", + "actions", + "organizations", + "yard", + "animal", + "Up", + "Lewis", + "titles", + "Several", + "1934", + "Ryan", + "55", + "Supreme", + "rolled", + "1917", + "distribution", + "figures", + "afraid", + "rural", + "yourself", + "##rt", + "sets", + "barely", + "Instead", + "passing", + "awards", + "41", + "silence", + "authority", + "occupied", + "environment", + "windows", + "engineering", + "surprised", + "flying", + "crime", + "reports", + "Mountain", + "powers", + "driving", + "succeeded", + "reviews", + "1929", + "Head", + "missing", + "Song", + "Jesus", + "opportunity", + "inspired", + "ends", + "albums", + "conversation", + "impact", + "injury", + "surprise", + "billion", + "learning", + "heavily", + "oldest", + "union", + "creating", + "##ky", + "festival", + "literature", + "letters", + "sexual", + "##tte", + "apartment", + "Final", + "comedy", + "nation", + "orders", + "##sen", + "contemporary", + "Power", + "drawn", + "existence", + "connection", + "##ating", + "Post", + "Junior", + "remembered", + "message", + "Medal", + "castle", + "note", + "engineer", + "sounds", + "Beach", + "crossed", + "##dy", + "ear", + "scientific", + "sales", + "##ai", + "theme", + "starts", + "clearly", + "##ut", + "trouble", + "##gan", + "bag", + "##han", + "BC", + "sons", + "1928", + "silent", + "versions", + "daily", + "Studies", + "ending", + "Rose", + "guns", + "1932", + "headquarters", + "reference", + "obtained", + "Squadron", + "concert", + "none", + "du", + "Among", + "##don", + "prevent", + "Member", + "answered", + "staring", + "Between", + "##lla", + "portion", + "drug", + "liked", + "association", + "performances", + "Nations", + "formation", + "Castle", + "lose", + "learn", + "scoring", + "relatively", + "quarter", + "47", + "Premier", + "##ors", + "Sweden", + "baseball", + "attempted", + "trip", + "worth", + "perform", + "airport", + "fields", + "enter", + "honor", + "Medical", + "rear", + "commander", + "officials", + "condition", + "supply", + "materials", + "52", + "Anna", + "volume", + "threw", + "Persian", + "43", + "interested", + "Gallery", + "achieved", + "visited", + "laws", + "relief", + "Area", + "Matt", + "singles", + "Lieutenant", + "Country", + "fans", + "Cambridge", + "sky", + "Miller", + "effective", + "tradition", + "Port", + "##ana", + "minister", + "extra", + "entitled", + "System", + "sites", + "authorities", + "acres", + "committee", + "racing", + "1931", + "desk", + "trains", + "ass", + "weren", + "Family", + "farm", + "##ance", + "industrial", + "##head", + "iron", + "49", + "abandoned", + "Out", + "Holy", + "chairman", + "waited", + "frequently", + "display", + "Light", + "transport", + "starring", + "Patrick", + "Engineering", + "eat", + "FM", + "judge", + "reaction", + "centuries", + "price", + "##tive", + "Korean", + "defense", + "Get", + "arrested", + "1927", + "send", + "urban", + "##ss", + "pilot", + "Okay", + "Media", + "reality", + "arts", + "soul", + "thirty", + "##be", + "catch", + "generation", + "##nes", + "apart", + "Anne", + "drop", + "See", + "##ving", + "sixth", + "trained", + "Management", + "magic", + "cm", + "height", + "Fox", + "Ian", + "resources", + "vampire", + "principal", + "Was", + "haven", + "##au", + "Walter", + "Albert", + "rich", + "1922", + "causing", + "entry", + "##ell", + "shortly", + "46", + "worry", + "doctor", + "composer", + "rank", + "Network", + "bright", + "showing", + "regions", + "1924", + "wave", + "carrying", + "kissed", + "finding", + "missed", + "Earl", + "lying", + "target", + "vehicles", + "Military", + "controlled", + "dinner", + "##board", + "briefly", + "lyrics", + "motion", + "duty", + "strange", + "attempts", + "invited", + "kg", + "villages", + "5th", + "Land", + "##mer", + "Christ", + "prepared", + "twelve", + "check", + "thousand", + "earth", + "copies", + "en", + "transfer", + "citizens", + "Americans", + "politics", + "nor", + "theatre", + "Project", + "##bo", + "clean", + "rooms", + "laugh", + "##ran", + "application", + "contained", + "anyway", + "containing", + "Sciences", + "1925", + "rare", + "speech", + "exist", + "1950s", + "falling", + "passenger", + "##im", + "stands", + "51", + "##ol", + "##ow", + "phase", + "governor", + "kids", + "details", + "methods", + "Vice", + "employed", + "performing", + "counter", + "Jane", + "heads", + "Channel", + "wine", + "opposition", + "aged", + "1912", + "Every", + "1926", + "highway", + "##ura", + "1921", + "aired", + "978", + "permanent", + "Forest", + "finds", + "joint", + "approved", + "##pur", + "brief", + "doubt", + "acts", + "brand", + "wild", + "closely", + "Ford", + "Kevin", + "chose", + "shall", + "port", + "sweet", + "fun", + "asking", + "Be", + "##bury", + "sought", + "Dave", + "Mexican", + "mom", + "Right", + "Howard", + "Moscow", + "Charlie", + "Stone", + "##mann", + "admitted", + "##ver", + "wooden", + "1923", + "Officer", + "relations", + "Hot", + "combat", + "publication", + "chain", + "shop", + "inhabitants", + "proved", + "ideas", + "address", + "1915", + "Memorial", + "explain", + "increasing", + "conflict", + "Anthony", + "Melbourne", + "narrow", + "temperature", + "slid", + "1916", + "worse", + "selling", + "documentary", + "Ali", + "Ray", + "opposed", + "vision", + "dad", + "extensive", + "Infantry", + "commissioned", + "Doctor", + "offices", + "programming", + "core", + "respect", + "storm", + "##pa", + "##ay", + "##om", + "promotion", + "der", + "struck", + "anymore", + "shit", + "Region", + "receiving", + "DVD", + "alternative", + "##ue", + "ride", + "maximum", + "1910", + "##ious", + "Third", + "Affairs", + "cancer", + "Executive", + "##op", + "dream", + "18th", + "Due", + "##ker", + "##worth", + "economy", + "IV", + "Billboard", + "identity", + "subsequent", + "statement", + "skills", + "##back", + "funding", + "##ons", + "Round", + "Foreign", + "truck", + "Please", + "lights", + "wondered", + "##ms", + "frame", + "yes", + "Still", + "districts", + "fiction", + "Colonel", + "converted", + "150", + "grown", + "accident", + "critics", + "fit", + "Information", + "architecture", + "Point", + "Five", + "armed", + "Billy", + "poet", + "functions", + "consisted", + "suit", + "Turkish", + "Band", + "object", + "desire", + "##ities", + "sounded", + "flow", + "Norwegian", + "articles", + "Marie", + "pulling", + "thin", + "singing", + "Hunter", + "Human", + "Battalion", + "Federation", + "Kim", + "origin", + "represent", + "dangerous", + "weather", + "fuel", + "ex", + "##sing", + "Last", + "bedroom", + "aid", + "knees", + "Alan", + "angry", + "assumed", + "plane", + "Something", + "founding", + "concerned", + "global", + "Fire", + "di", + "please", + "Portuguese", + "touched", + "Roger", + "nuclear", + "Register", + "Jeff", + "fixed", + "royal", + "lie", + "finals", + "NFL", + "Manchester", + "towns", + "handle", + "shaped", + "Chairman", + "Dean", + "launch", + "understanding", + "Children", + "violence", + "failure", + "sector", + "Brigade", + "wrapped", + "fired", + "sharp", + "tiny", + "developing", + "expansion", + "Free", + "institutions", + "technical", + "Nothing", + "otherwise", + "Main", + "inch", + "Saturday", + "wore", + "Senior", + "attached", + "cheek", + "representing", + "Kansas", + "##chi", + "##kin", + "actual", + "advantage", + "Dan", + "Austria", + "##dale", + "hoped", + "multi", + "squad", + "Norway", + "streets", + "1913", + "Services", + "hired", + "grow", + "pp", + "wear", + "painted", + "Minnesota", + "stuff", + "Building", + "54", + "Philippines", + "1900", + "##ties", + "educational", + "Khan", + "Magazine", + "##port", + "Cape", + "signal", + "Gordon", + "sword", + "Anderson", + "cool", + "engaged", + "Commander", + "images", + "Upon", + "tied", + "Security", + "cup", + "rail", + "Vietnam", + "successfully", + "##red", + "Muslim", + "gain", + "bringing", + "Native", + "hers", + "occurs", + "negative", + "Philip", + "Kelly", + "Colorado", + "category", + "##lan", + "600", + "Have", + "supporting", + "wet", + "56", + "stairs", + "Grace", + "observed", + "##ung", + "funds", + "restaurant", + "1911", + "Jews", + "##ments", + "##che", + "Jake", + "Back", + "53", + "asks", + "journalist", + "accept", + "bands", + "bronze", + "helping", + "##ice", + "decades", + "mayor", + "survived", + "usual", + "influenced", + "Douglas", + "Hey", + "##izing", + "surrounded", + "retirement", + "Temple", + "derived", + "Pope", + "registered", + "producing", + "##ral", + "structures", + "Johnny", + "contributed", + "finishing", + "buy", + "specifically", + "##king", + "patients", + "Jordan", + "internal", + "regarding", + "Samuel", + "Clark", + "##q", + "afternoon", + "Finally", + "scenes", + "notice", + "refers", + "quietly", + "threat", + "Water", + "Those", + "Hamilton", + "promise", + "freedom", + "Turkey", + "breaking", + "maintained", + "device", + "lap", + "ultimately", + "Champion", + "Tim", + "Bureau", + "expressed", + "investigation", + "extremely", + "capable", + "qualified", + "recognition", + "items", + "##up", + "Indiana", + "adult", + "rain", + "greatest", + "architect", + "Morgan", + "dressed", + "equal", + "Antonio", + "collected", + "drove", + "occur", + "Grant", + "graduate", + "anger", + "Sri", + "worried", + "standards", + "##ore", + "injured", + "somewhere", + "damn", + "Singapore", + "Jimmy", + "pocket", + "homes", + "stock", + "religion", + "aware", + "regarded", + "Wisconsin", + "##tra", + "passes", + "fresh", + "##ea", + "argued", + "Ltd", + "EP", + "Diego", + "importance", + "Census", + "incident", + "Egypt", + "Missouri", + "domestic", + "leads", + "ceremony", + "Early", + "camera", + "Father", + "challenge", + "Switzerland", + "lands", + "familiar", + "hearing", + "spend", + "educated", + "Tennessee", + "Thank", + "##ram", + "Thus", + "concern", + "putting", + "inches", + "map", + "classical", + "Allen", + "crazy", + "valley", + "Space", + "softly", + "##my", + "pool", + "worldwide", + "climate", + "experienced", + "neighborhood", + "scheduled", + "neither", + "fleet", + "1908", + "Girl", + "##J", + "Part", + "engines", + "locations", + "darkness", + "Revolution", + "establishment", + "lawyer", + "objects", + "apparently", + "Queensland", + "Entertainment", + "bill", + "mark", + "Television", + "##ong", + "pale", + "demand", + "Hotel", + "selection", + "##rn", + "##ino", + "Labour", + "Liberal", + "burned", + "Mom", + "merged", + "Arizona", + "request", + "##lia", + "##light", + "hole", + "employees", + "##ical", + "incorporated", + "95", + "independence", + "Walker", + "covering", + "joining", + "##ica", + "task", + "papers", + "backing", + "sell", + "biggest", + "6th", + "strike", + "establish", + "##ō", + "gently", + "59", + "Orchestra", + "Winter", + "protein", + "Juan", + "locked", + "dates", + "Boy", + "aren", + "shooting", + "Luke", + "solid", + "charged", + "Prior", + "resigned", + "interior", + "garden", + "spoken", + "improve", + "wonder", + "promote", + "hidden", + "##med", + "combination", + "Hollywood", + "Swiss", + "consider", + "##ks", + "Lincoln", + "literary", + "drawing", + "Marine", + "weapon", + "Victor", + "Trust", + "Maryland", + "properties", + "##ara", + "exhibition", + "understood", + "hung", + "Tell", + "installed", + "loud", + "fashion", + "affected", + "junior", + "landing", + "flowers", + "##he", + "Internet", + "beach", + "Heart", + "tries", + "Mayor", + "programme", + "800", + "wins", + "noise", + "##ster", + "##ory", + "58", + "contain", + "fair", + "delivered", + "##ul", + "wedding", + "Square", + "advance", + "behavior", + "Program", + "Oregon", + "##rk", + "residence", + "realize", + "certainly", + "hill", + "Houston", + "57", + "indicated", + "##water", + "wounded", + "Village", + "massive", + "Moore", + "thousands", + "personnel", + "dating", + "opera", + "poetry", + "##her", + "causes", + "feelings", + "Frederick", + "applications", + "push", + "approached", + "foundation", + "pleasure", + "sale", + "fly", + "gotten", + "northeast", + "costs", + "raise", + "paintings", + "##ney", + "views", + "horses", + "formal", + "Arab", + "hockey", + "typical", + "representative", + "rising", + "##des", + "clock", + "stadium", + "shifted", + "Dad", + "peak", + "Fame", + "vice", + "disappeared", + "users", + "Way", + "Naval", + "prize", + "hoping", + "values", + "evil", + "Bell", + "consisting", + "##ón", + "Regional", + "##ics", + "improved", + "circle", + "carefully", + "broad", + "##ini", + "Fine", + "maintain", + "operate", + "offering", + "mention", + "Death", + "stupid", + "Through", + "Princess", + "attend", + "interests", + "ruled", + "somewhat", + "wings", + "roads", + "grounds", + "##ual", + "Greece", + "Champions", + "facing", + "hide", + "voted", + "require", + "Dark", + "Matthew", + "credit", + "sighed", + "separated", + "manner", + "##ile", + "Boys", + "1905", + "committed", + "impossible", + "lip", + "candidates", + "7th", + "Bruce", + "arranged", + "Islamic", + "courses", + "criminal", + "##ened", + "smell", + "##bed", + "08", + "consecutive", + "##ening", + "proper", + "purchase", + "weak", + "Prix", + "1906", + "aside", + "introduction", + "Look", + "##ku", + "changing", + "budget", + "resistance", + "factory", + "Forces", + "agency", + "##tone", + "northwest", + "user", + "1907", + "stating", + "##one", + "sport", + "Design", + "environmental", + "cards", + "concluded", + "Carl", + "250", + "accused", + "##ology", + "Girls", + "sick", + "intelligence", + "Margaret", + "responsibility", + "Guard", + "##tus", + "17th", + "sq", + "goods", + "1909", + "hate", + "##ek", + "capture", + "stores", + "Gray", + "comic", + "Modern", + "Silver", + "Andy", + "electronic", + "wheel", + "##ied", + "Deputy", + "##bs", + "Czech", + "zone", + "choose", + "constant", + "reserve", + "##lle", + "Tokyo", + "spirit", + "sub", + "degrees", + "flew", + "pattern", + "compete", + "Dance", + "##ik", + "secretary", + "Imperial", + "99", + "reduce", + "Hungarian", + "confused", + "##rin", + "Pierre", + "describes", + "regularly", + "Rachel", + "85", + "landed", + "passengers", + "##ise", + "##sis", + "historian", + "meters", + "Youth", + "##ud", + "participate", + "##cing", + "arrival", + "tired", + "Mother", + "##gy", + "jumped", + "Kentucky", + "faces", + "feed", + "Israeli", + "Ocean", + "##Q", + "##án", + "plus", + "snow", + "techniques", + "plate", + "sections", + "falls", + "jazz", + "##ris", + "tank", + "loan", + "repeated", + "opinion", + "##res", + "unless", + "rugby", + "journal", + "Lawrence", + "moments", + "shock", + "distributed", + "##ded", + "adjacent", + "Argentina", + "crossing", + "uncle", + "##ric", + "Detroit", + "communication", + "mental", + "tomorrow", + "session", + "Emma", + "Without", + "##gen", + "Miami", + "charges", + "Administration", + "hits", + "coat", + "protected", + "Cole", + "invasion", + "priest", + "09", + "Gary", + "enjoyed", + "plot", + "measure", + "bound", + "friendly", + "throw", + "musician", + "##lon", + "##ins", + "Age", + "knife", + "damaged", + "birds", + "driven", + "lit", + "ears", + "breathing", + "Arabic", + "Jan", + "faster", + "Jonathan", + "##gate", + "Independent", + "starred", + "Harris", + "teachers", + "Alice", + "sequence", + "mph", + "file", + "translated", + "decide", + "determine", + "Review", + "documents", + "sudden", + "threatened", + "##ft", + "bear", + "distinct", + "decade", + "burning", + "##sky", + "1930s", + "replace", + "begun", + "extension", + "##time", + "1904", + "equivalent", + "accompanied", + "Christopher", + "Danish", + "##ye", + "Besides", + "##more", + "persons", + "fallen", + "Rural", + "roughly", + "saved", + "willing", + "ensure", + "Belgium", + "05", + "musicians", + "##ang", + "giant", + "Six", + "Retrieved", + "worst", + "purposes", + "##bly", + "mountains", + "seventh", + "slipped", + "brick", + "07", + "##py", + "somehow", + "Carter", + "Iraq", + "cousin", + "favor", + "islands", + "journey", + "FIFA", + "contrast", + "planet", + "vs", + "calm", + "##ings", + "concrete", + "branches", + "gray", + "profit", + "Russell", + "##ae", + "##ux", + "##ens", + "philosophy", + "businesses", + "talked", + "parking", + "##ming", + "owners", + "Place", + "##tle", + "agricultural", + "Kate", + "06", + "southeast", + "draft", + "Eddie", + "earliest", + "forget", + "Dallas", + "Commonwealth", + "edited", + "66", + "inner", + "ed", + "operates", + "16th", + "Harvard", + "assistance", + "##si", + "designs", + "Take", + "bathroom", + "indicate", + "CEO", + "Command", + "Louisiana", + "1902", + "Dublin", + "Books", + "1901", + "tropical", + "1903", + "##tors", + "Places", + "tie", + "progress", + "forming", + "solution", + "62", + "letting", + "##ery", + "studying", + "##jo", + "duties", + "Baseball", + "taste", + "Reserve", + "##ru", + "Ann", + "##gh", + "visible", + "##vi", + "notably", + "link", + "NCAA", + "southwest", + "Never", + "storage", + "mobile", + "writers", + "favorite", + "Pro", + "pages", + "truly", + "count", + "##tta", + "string", + "kid", + "98", + "Ross", + "row", + "##idae", + "Kennedy", + "##tan", + "Hockey", + "hip", + "waist", + "grandfather", + "listen", + "##ho", + "feels", + "busy", + "72", + "stream", + "obvious", + "cycle", + "shaking", + "Knight", + "##ren", + "Carlos", + "painter", + "trail", + "web", + "linked", + "04", + "Palace", + "existed", + "##ira", + "responded", + "closing", + "End", + "examples", + "Marshall", + "weekend", + "jaw", + "Denmark", + "lady", + "township", + "medium", + "chin", + "Story", + "option", + "fifteen", + "Moon", + "represents", + "makeup", + "investment", + "jump", + "childhood", + "Oklahoma", + "roll", + "normally", + "Ten", + "Operation", + "Graham", + "Seattle", + "Atlanta", + "paused", + "promised", + "rejected", + "treated", + "returns", + "flag", + "##ita", + "Hungary", + "danger", + "glad", + "movements", + "visual", + "subjects", + "credited", + "soldier", + "Norman", + "ill", + "translation", + "José", + "Quebec", + "medicine", + "warning", + "theater", + "praised", + "municipal", + "01", + "commune", + "churches", + "acid", + "folk", + "8th", + "testing", + "add", + "survive", + "Sound", + "devices", + "residential", + "severe", + "presidential", + "Mississippi", + "Austin", + "Perhaps", + "Charlotte", + "hanging", + "Montreal", + "grin", + "##ten", + "racial", + "partnership", + "shoot", + "shift", + "##nie", + "Les", + "downtown", + "Brothers", + "Garden", + "matters", + "restored", + "mirror", + "forever", + "winners", + "rapidly", + "poverty", + "##ible", + "Until", + "DC", + "faith", + "hundreds", + "Real", + "Ukraine", + "Nelson", + "balance", + "Adams", + "contest", + "relative", + "ethnic", + "Edinburgh", + "composition", + "##nts", + "emergency", + "##van", + "marine", + "reputation", + "Down", + "pack", + "12th", + "Communist", + "Mountains", + "pro", + "stages", + "measures", + "##ld", + "ABC", + "Li", + "victims", + "benefit", + "Iowa", + "Broadway", + "gathered", + "rating", + "Defense", + "classic", + "##ily", + "ceiling", + "##ions", + "snapped", + "Everything", + "constituency", + "Franklin", + "Thompson", + "Stewart", + "entering", + "Judge", + "forth", + "##sk", + "wanting", + "smiling", + "moves", + "tunnel", + "premiered", + "grass", + "unusual", + "Ukrainian", + "bird", + "Friday", + "tail", + "Portugal", + "coal", + "element", + "Fred", + "guards", + "Senator", + "collaboration", + "beauty", + "Wood", + "chemical", + "beer", + "justice", + "signs", + "##Z", + "sees", + "##zi", + "Puerto", + "##zed", + "96", + "smooth", + "Bowl", + "gift", + "limit", + "97", + "heading", + "Source", + "wake", + "requires", + "Ed", + "Constitution", + "factor", + "Lane", + "factors", + "adding", + "Note", + "cleared", + "pictures", + "pink", + "##ola", + "Kent", + "Local", + "Singh", + "moth", + "Ty", + "##ture", + "courts", + "Seven", + "temporary", + "involving", + "Vienna", + "emerged", + "fishing", + "agree", + "defensive", + "stuck", + "secure", + "Tamil", + "##ick", + "bottle", + "03", + "Player", + "instruments", + "Spring", + "patient", + "flesh", + "contributions", + "cry", + "Malaysia", + "120", + "Global", + "da", + "Alabama", + "Within", + "##work", + "debuted", + "expect", + "Cleveland", + "concerns", + "retained", + "horror", + "10th", + "spending", + "Peace", + "Transport", + "grand", + "Crown", + "instance", + "institution", + "acted", + "Hills", + "mounted", + "Campbell", + "shouldn", + "1898", + "##ably", + "chamber", + "soil", + "88", + "Ethan", + "sand", + "cheeks", + "##gi", + "marry", + "61", + "weekly", + "classification", + "DNA", + "Elementary", + "Roy", + "definitely", + "Soon", + "Rights", + "gate", + "suggests", + "aspects", + "imagine", + "golden", + "beating", + "Studios", + "Warren", + "differences", + "significantly", + "glance", + "occasionally", + "##od", + "clothing", + "Assistant", + "depth", + "sending", + "possibility", + "mode", + "prisoners", + "requirements", + "daughters", + "dated", + "Representatives", + "prove", + "guilty", + "interesting", + "smoke", + "cricket", + "93", + "##ates", + "rescue", + "Connecticut", + "underground", + "Opera", + "13th", + "reign", + "##ski", + "thanks", + "leather", + "equipped", + "routes", + "fan", + "##ans", + "script", + "Wright", + "bishop", + "Welsh", + "jobs", + "faculty", + "eleven", + "Railroad", + "appearing", + "anniversary", + "Upper", + "##down", + "anywhere", + "Rugby", + "Metropolitan", + "Meanwhile", + "Nicholas", + "champions", + "forehead", + "mining", + "drinking", + "76", + "Jerry", + "membership", + "Brazilian", + "Wild", + "Rio", + "scheme", + "Unlike", + "strongly", + "##bility", + "fill", + "##rian", + "easier", + "MP", + "Hell", + "##sha", + "Stanley", + "banks", + "Baron", + "##ique", + "Robinson", + "67", + "Gabriel", + "Austrian", + "Wayne", + "exposed", + "##wan", + "Alfred", + "1899", + "manage", + "mix", + "visitors", + "eating", + "##rate", + "Sean", + "commission", + "Cemetery", + "policies", + "Camp", + "parallel", + "traveled", + "guitarist", + "02", + "supplies", + "couples", + "poem", + "blocks", + "Rick", + "Training", + "Energy", + "achieve", + "appointment", + "Wing", + "Jamie", + "63", + "novels", + "##em", + "1890", + "songwriter", + "Base", + "Jay", + "##gar", + "naval", + "scared", + "miss", + "labor", + "technique", + "crisis", + "Additionally", + "backed", + "destroy", + "seriously", + "tools", + "tennis", + "91", + "god", + "##ington", + "continuing", + "steam", + "obviously", + "Bobby", + "adapted", + "fifty", + "enjoy", + "Jacob", + "publishing", + "column", + "##ular", + "Baltimore", + "Donald", + "Liverpool", + "92", + "drugs", + "movies", + "##ock", + "Heritage", + "##je", + "##istic", + "vocal", + "strategy", + "gene", + "advice", + "##bi", + "Ottoman", + "riding", + "##side", + "Agency", + "Indonesia", + "11th", + "laughing", + "sleeping", + "und", + "muttered", + "listening", + "deck", + "tip", + "77", + "ownership", + "grey", + "Claire", + "deeply", + "provincial", + "popularity", + "Cooper", + "##á", + "Emily", + "##sed", + "designer", + "Murray", + "describe", + "Danny", + "Around", + "Parker", + "##dae", + "68", + "rates", + "suffering", + "considerable", + "78", + "nervous", + "powered", + "tons", + "circumstances", + "wished", + "belonged", + "Pittsburgh", + "flows", + "9th", + "##use", + "belt", + "81", + "useful", + "15th", + "context", + "List", + "Dead", + "Iron", + "seek", + "Season", + "worn", + "frequency", + "legislation", + "replacement", + "memories", + "Tournament", + "Again", + "Barry", + "organisation", + "copy", + "Gulf", + "waters", + "meets", + "struggle", + "Oliver", + "1895", + "Susan", + "protest", + "kick", + "Alliance", + "components", + "1896", + "Tower", + "Windows", + "demanded", + "regiment", + "sentence", + "Woman", + "Logan", + "Referee", + "hosts", + "debate", + "knee", + "Blood", + "##oo", + "universities", + "practices", + "Ward", + "ranking", + "correct", + "happening", + "Vincent", + "attracted", + "classified", + "##stic", + "processes", + "immediate", + "waste", + "increasingly", + "Helen", + "##po", + "Lucas", + "Phil", + "organ", + "1897", + "tea", + "suicide", + "actors", + "lb", + "crash", + "approval", + "waves", + "##ered", + "hated", + "grip", + "700", + "amongst", + "69", + "74", + "hunting", + "dying", + "lasted", + "illegal", + "##rum", + "stare", + "defeating", + "##gs", + "shrugged", + "°C", + "Jon", + "Count", + "Orleans", + "94", + "affairs", + "formally", + "##and", + "##ves", + "criticized", + "Disney", + "Vol", + "successor", + "tests", + "scholars", + "palace", + "Would", + "celebrated", + "rounds", + "grant", + "Schools", + "Such", + "commanded", + "demon", + "Romania", + "##all", + "Karl", + "71", + "##yn", + "84", + "Daily", + "totally", + "Medicine", + "fruit", + "Die", + "upset", + "Lower", + "Conservative", + "14th", + "Mitchell", + "escaped", + "shoes", + "Morris", + "##tz", + "queen", + "harder", + "prime", + "Thanks", + "indeed", + "Sky", + "authors", + "rocks", + "definition", + "Nazi", + "accounts", + "printed", + "experiences", + "##ters", + "divisions", + "Cathedral", + "denied", + "depending", + "Express", + "##let", + "73", + "appeal", + "loose", + "colors", + "filed", + "##isation", + "gender", + "##ew", + "throne", + "forests", + "Finland", + "domain", + "boats", + "Baker", + "squadron", + "shore", + "remove", + "##ification", + "careful", + "wound", + "railroad", + "82", + "seeking", + "agents", + "##ved", + "Blues", + "##off", + "customers", + "ignored", + "net", + "##ction", + "hiding", + "Originally", + "declined", + "##ess", + "franchise", + "eliminated", + "NBA", + "merely", + "pure", + "appropriate", + "visiting", + "forty", + "markets", + "offensive", + "coverage", + "cave", + "##nia", + "spell", + "##lar", + "Benjamin", + "##ire", + "Convention", + "filmed", + "Trade", + "##sy", + "##ct", + "Having", + "palm", + "1889", + "Evans", + "intense", + "plastic", + "Julia", + "document", + "jeans", + "vessel", + "SR", + "##fully", + "proposal", + "Birmingham", + "le", + "##ative", + "assembly", + "89", + "fund", + "lock", + "1893", + "AD", + "meetings", + "occupation", + "modified", + "Years", + "odd", + "aimed", + "reform", + "Mission", + "Works", + "shake", + "cat", + "exception", + "convinced", + "executed", + "pushing", + "dollars", + "replacing", + "soccer", + "manufacturing", + "##ros", + "expensive", + "kicked", + "minimum", + "Josh", + "coastal", + "Chase", + "ha", + "Thailand", + "publications", + "deputy", + "Sometimes", + "Angel", + "effectively", + "##illa", + "criticism", + "conduct", + "Serbian", + "landscape", + "NY", + "absence", + "passage", + "##ula", + "Blake", + "Indians", + "1892", + "admit", + "Trophy", + "##ball", + "Next", + "##rated", + "##ians", + "charts", + "kW", + "orchestra", + "79", + "heritage", + "1894", + "rough", + "exists", + "boundary", + "Bible", + "Legislative", + "moon", + "medieval", + "##over", + "cutting", + "print", + "##ett", + "birthday", + "##hood", + "destruction", + "Julian", + "injuries", + "influential", + "sisters", + "raising", + "statue", + "colour", + "dancing", + "characteristics", + "orange", + "##ok", + "##aries", + "Ken", + "colonial", + "twin", + "Larry", + "surviving", + "##shi", + "Barbara", + "personality", + "entertainment", + "assault", + "##ering", + "talent", + "happens", + "license", + "86", + "couch", + "Century", + "soundtrack", + "shower", + "swimming", + "cash", + "Staff", + "bent", + "1885", + "bay", + "lunch", + "##lus", + "dozen", + "vessels", + "CBS", + "greatly", + "critic", + "Test", + "symbol", + "panel", + "shell", + "output", + "reaches", + "87", + "Front", + "motor", + "ocean", + "##era", + "##ala", + "maintenance", + "violent", + "scent", + "Limited", + "Las", + "Hope", + "Theater", + "Which", + "survey", + "Robin", + "recordings", + "compilation", + "##ward", + "bomb", + "insurance", + "Authority", + "sponsored", + "satellite", + "Jazz", + "refer", + "stronger", + "blow", + "whilst", + "Wrestling", + "suggest", + "##rie", + "climbed", + "##els", + "voices", + "shopping", + "1891", + "Neil", + "discovery", + "##vo", + "##ations", + "burst", + "Baby", + "peaked", + "Brooklyn", + "knocked", + "lift", + "##try", + "false", + "nations", + "Hugh", + "Catherine", + "preserved", + "distinguished", + "terminal", + "resolution", + "ratio", + "pants", + "cited", + "competitions", + "completion", + "DJ", + "bone", + "uniform", + "schedule", + "shouted", + "83", + "1920s", + "rarely", + "Basketball", + "Taiwan", + "artistic", + "bare", + "vampires", + "arrest", + "Utah", + "Marcus", + "assist", + "gradually", + "qualifying", + "Victorian", + "vast", + "rival", + "Warner", + "Terry", + "Economic", + "##cia", + "losses", + "boss", + "versus", + "audio", + "runner", + "apply", + "surgery", + "Play", + "twisted", + "comfortable", + "##cs", + "Everyone", + "guests", + "##lt", + "Harrison", + "UEFA", + "lowered", + "occasions", + "##lly", + "##cher", + "chapter", + "youngest", + "eighth", + "Culture", + "##room", + "##stone", + "1888", + "Songs", + "Seth", + "Digital", + "involvement", + "expedition", + "relationships", + "signing", + "1000", + "fault", + "annually", + "circuit", + "afterwards", + "meat", + "creature", + "##ou", + "cable", + "Bush", + "##net", + "Hispanic", + "rapid", + "gonna", + "figured", + "extent", + "considering", + "cried", + "##tin", + "sigh", + "dynasty", + "##ration", + "cabinet", + "Richmond", + "stable", + "##zo", + "1864", + "Admiral", + "Unit", + "occasion", + "shares", + "badly", + "longest", + "##ify", + "Connor", + "extreme", + "wondering", + "girlfriend", + "Studio", + "##tions", + "1865", + "tribe", + "exact", + "muscles", + "hat", + "Luis", + "Orthodox", + "decisions", + "amateur", + "description", + "##lis", + "hips", + "kingdom", + "##ute", + "Portland", + "whereas", + "Bachelor", + "outer", + "discussion", + "partly", + "Arkansas", + "1880", + "dreams", + "perfectly", + "Lloyd", + "##bridge", + "asleep", + "##tti", + "Greg", + "permission", + "trading", + "pitch", + "mill", + "Stage", + "liquid", + "Keith", + "##tal", + "wolf", + "processing", + "stick", + "Jerusalem", + "profile", + "rushed", + "spiritual", + "argument", + "Ice", + "Guy", + "till", + "Delhi", + "roots", + "Section", + "missions", + "Glasgow", + "penalty", + "NBC", + "encouraged", + "identify", + "keyboards", + "##zing", + "##ston", + "disc", + "plain", + "informed", + "Bernard", + "thinks", + "fled", + "Justin", + "##day", + "newspapers", + "##wick", + "Ralph", + "##zer", + "unlike", + "Stars", + "artillery", + "##ified", + "recovered", + "arrangement", + "searching", + "##pers", + "##tory", + "##rus", + "deaths", + "Egyptian", + "diameter", + "##í", + "marketing", + "corporate", + "teach", + "marks", + "Turner", + "staying", + "hallway", + "Sebastian", + "chapel", + "naked", + "mistake", + "possession", + "1887", + "dominated", + "jacket", + "creative", + "Fellow", + "Falls", + "Defence", + "suspended", + "employment", + "##rry", + "Hebrew", + "Hudson", + "Week", + "Wars", + "recognize", + "Natural", + "controversial", + "Tommy", + "thank", + "Athletic", + "benefits", + "decline", + "intention", + "##ets", + "Lost", + "Wall", + "participation", + "elevation", + "supports", + "parliament", + "1861", + "concentration", + "Movement", + "##IS", + "competing", + "stops", + "behalf", + "##mm", + "limits", + "funded", + "discuss", + "Collins", + "departure", + "obtain", + "woods", + "latest", + "universe", + "alcohol", + "Laura", + "rush", + "blade", + "funny", + "Dennis", + "forgotten", + "Amy", + "Symphony", + "apparent", + "graduating", + "1862", + "Rob", + "Grey", + "collections", + "Mason", + "emotions", + "##ugh", + "literally", + "Any", + "counties", + "1863", + "nomination", + "fighter", + "habitat", + "respond", + "external", + "Capital", + "exit", + "Video", + "carbon", + "sharing", + "Bad", + "opportunities", + "Perry", + "photo", + "##mus", + "Orange", + "posted", + "remainder", + "transportation", + "portrayed", + "Labor", + "recommended", + "percussion", + "rated", + "Grade", + "rivers", + "partially", + "suspected", + "strip", + "adults", + "button", + "struggled", + "intersection", + "Canal", + "##ability", + "poems", + "claiming", + "Madrid", + "1886", + "Together", + "##our", + "Much", + "Vancouver", + "instrument", + "instrumental", + "1870", + "mad", + "angle", + "Control", + "Phoenix", + "Leo", + "Communications", + "mail", + "##ette", + "##ev", + "preferred", + "adaptation", + "alleged", + "discussed", + "deeper", + "##ane", + "Yet", + "Monday", + "volumes", + "thrown", + "Zane", + "##logy", + "displayed", + "rolling", + "dogs", + "Along", + "Todd", + "##ivity", + "withdrew", + "representation", + "belief", + "##sia", + "crown", + "Late", + "Short", + "hardly", + "grinned", + "romantic", + "Pete", + "##ken", + "networks", + "enemies", + "Colin", + "Eventually", + "Side", + "donated", + "##su", + "steady", + "grab", + "guide", + "Finnish", + "Milan", + "pregnant", + "controversy", + "reminded", + "1884", + "Stuart", + "##bach", + "##ade", + "Race", + "Belgian", + "LP", + "Production", + "Zone", + "lieutenant", + "infantry", + "Child", + "confusion", + "sang", + "resident", + "##ez", + "victim", + "1881", + "channels", + "Ron", + "businessman", + "##gle", + "Dick", + "colony", + "pace", + "producers", + "##ese", + "agencies", + "Craig", + "Lucy", + "Very", + "centers", + "Yorkshire", + "photography", + "##ched", + "Album", + "championships", + "Metro", + "substantial", + "Standard", + "terrible", + "directors", + "contribution", + "advertising", + "emotional", + "##its", + "layer", + "segment", + "sir", + "folded", + "Roberts", + "ceased", + "Hampshire", + "##ray", + "detailed", + "partners", + "m²", + "##pt", + "Beth", + "genre", + "commented", + "generated", + "remote", + "aim", + "Hans", + "credits", + "concerts", + "periods", + "breakfast", + "gay", + "shadow", + "defence", + "Too", + "Had", + "transition", + "Afghanistan", + "##book", + "eggs", + "defend", + "##lli", + "writes", + "Systems", + "bones", + "mess", + "seed", + "scientists", + "Shortly", + "Romanian", + "##zy", + "Freedom", + "muscle", + "hero", + "parent", + "agriculture", + "checked", + "Islam", + "Bristol", + "Freyja", + "Arena", + "cabin", + "Germans", + "electricity", + "ranks", + "viewed", + "medals", + "Wolf", + "associate", + "Madison", + "Sorry", + "fort", + "Chile", + "detail", + "widespread", + "attorney", + "boyfriend", + "##nan", + "Students", + "Spencer", + "##ig", + "bite", + "Maine", + "demolished", + "Lisa", + "erected", + "Someone", + "operational", + "Commissioner", + "NHL", + "Coach", + "Bar", + "forcing", + "Dream", + "Rico", + "cargo", + "Murphy", + "##fish", + "##ase", + "distant", + "##master", + "##ora", + "Organization", + "doorway", + "Steven", + "traded", + "electrical", + "frequent", + "##wn", + "Branch", + "Sure", + "1882", + "placing", + "Manhattan", + "attending", + "attributed", + "excellent", + "pounds", + "ruling", + "principles", + "component", + "Mediterranean", + "Vegas", + "machines", + "percentage", + "infrastructure", + "throwing", + "affiliated", + "Kings", + "secured", + "Caribbean", + "Track", + "Ted", + "honour", + "opponent", + "Virgin", + "Construction", + "grave", + "produces", + "Challenge", + "stretched", + "paying", + "murmured", + "##ata", + "integrated", + "waved", + "Nathan", + "##ator", + "transmission", + "videos", + "##yan", + "##hu", + "Nova", + "descent", + "AM", + "Harold", + "conservative", + "Therefore", + "venue", + "competitive", + "##ui", + "conclusion", + "funeral", + "confidence", + "releases", + "scholar", + "##sson", + "Treaty", + "stress", + "mood", + "##sm", + "Mac", + "residing", + "Action", + "Fund", + "##ship", + "animated", + "fitted", + "##kar", + "defending", + "voting", + "tend", + "##berry", + "answers", + "believes", + "##ci", + "helps", + "Aaron", + "##tis", + "themes", + "##lay", + "populations", + "Players", + "stroke", + "Trinity", + "electoral", + "paint", + "abroad", + "charity", + "keys", + "Fair", + "##pes", + "interrupted", + "participants", + "murdered", + "Days", + "supporters", + "##ab", + "expert", + "borders", + "mate", + "##llo", + "solar", + "architectural", + "tension", + "##bling", + "Parish", + "tape", + "operator", + "Cultural", + "Clinton", + "indicates", + "publisher", + "ordinary", + "sugar", + "arrive", + "rifle", + "acoustic", + "##uring", + "assets", + "##shire", + "SS", + "sufficient", + "options", + "HMS", + "Classic", + "bars", + "rebuilt", + "governments", + "Beijing", + "reporter", + "screamed", + "Abbey", + "crying", + "mechanical", + "instantly", + "communications", + "Political", + "cemetery", + "Cameron", + "Stop", + "representatives", + "USS", + "texts", + "mathematics", + "innings", + "civilian", + "Serbia", + "##hill", + "practical", + "patterns", + "dust", + "Faculty", + "debt", + "##end", + "##cus", + "junction", + "suppose", + "experimental", + "Computer", + "Food", + "wrist", + "abuse", + "dealing", + "bigger", + "cap", + "principle", + "##pin", + "Muhammad", + "Fleet", + "Collection", + "attempting", + "dismissed", + "##burn", + "regime", + "Herbert", + "##ua", + "shadows", + "1883", + "Eve", + "Lanka", + "1878", + "Performance", + "fictional", + "##lock", + "Noah", + "Run", + "Voivodeship", + "exercise", + "broadcasting", + "##fer", + "RAF", + "Magic", + "Bangladesh", + "suitable", + "##low", + "##del", + "styles", + "toured", + "Code", + "identical", + "links", + "insisted", + "110", + "flash", + "Model", + "slave", + "Derek", + "Rev", + "fairly", + "Greater", + "sole", + "##lands", + "connecting", + "zero", + "bench", + "##ome", + "switched", + "Fall", + "Owen", + "yours", + "Electric", + "shocked", + "convention", + "##bra", + "climb", + "memorial", + "swept", + "Racing", + "decides", + "belong", + "##nk", + "parliamentary", + "##und", + "ages", + "proof", + "##dan", + "delivery", + "1860", + "##ów", + "sad", + "publicly", + "leaning", + "Archbishop", + "dirt", + "##ose", + "categories", + "1876", + "burn", + "##bing", + "requested", + "Guinea", + "Historical", + "rhythm", + "relation", + "##heim", + "ye", + "pursue", + "merchant", + "##mes", + "lists", + "continuous", + "frowned", + "colored", + "tool", + "gods", + "involves", + "Duncan", + "photographs", + "Cricket", + "slight", + "Gregory", + "atmosphere", + "wider", + "Cook", + "##tar", + "essential", + "Being", + "FA", + "emperor", + "wealthy", + "nights", + "##bar", + "licensed", + "Hawaii", + "viewers", + "Language", + "load", + "nearest", + "milk", + "kilometers", + "platforms", + "##ys", + "territories", + "Rogers", + "sheet", + "Rangers", + "contested", + "##lation", + "isolated", + "assisted", + "swallowed", + "Small", + "Contemporary", + "Technical", + "Edwards", + "express", + "Volume", + "endemic", + "##ei", + "tightly", + "Whatever", + "indigenous", + "Colombia", + "##ulation", + "hp", + "characterized", + "##ida", + "Nigeria", + "Professional", + "duo", + "Soccer", + "slaves", + "Farm", + "smart", + "Attorney", + "Attendance", + "Common", + "salt", + "##vin", + "tribes", + "nod", + "sentenced", + "bid", + "sample", + "Drive", + "switch", + "instant", + "21st", + "Cuba", + "drunk", + "Alaska", + "proud", + "awareness", + "hitting", + "sessions", + "Thai", + "locally", + "elsewhere", + "Dragon", + "gentle", + "touching", + "##lee", + "Springs", + "Universal", + "Latino", + "spin", + "1871", + "Chart", + "recalled", + "Type", + "pointing", + "##ii", + "lowest", + "##ser", + "grandmother", + "Adelaide", + "Jacques", + "spotted", + "Buffalo", + "restoration", + "Son", + "Joan", + "farmers", + "Lily", + "1879", + "lucky", + "##dal", + "luck", + "eldest", + "##rant", + "Market", + "drummer", + "deployed", + "warned", + "prince", + "sing", + "amazing", + "sailed", + "##oon", + "1875", + "Primary", + "traveling", + "Masters", + "Sara", + "cattle", + "Trail", + "gang", + "Further", + "desert", + "relocated", + "##tch", + "##ord", + "Flight", + "illness", + "Munich", + "ninth", + "repair", + "Singles", + "##lated", + "Tyler", + "tossed", + "boots", + "Work", + "sized", + "earning", + "shoved", + "magazines", + "housed", + "dam", + "researchers", + "Former", + "spun", + "premiere", + "spaces", + "organised", + "wealth", + "crimes", + "devoted", + "stones", + "Urban", + "automatic", + "hop", + "affect", + "outstanding", + "tanks", + "mechanism", + "Muslims", + "Ms", + "shots", + "argue", + "Jeremy", + "connections", + "Armenian", + "increases", + "rubbed", + "1867", + "retail", + "gear", + "Pan", + "bonus", + "jurisdiction", + "weird", + "concerning", + "whisper", + "##gal", + "Microsoft", + "tenure", + "hills", + "www", + "Gmina", + "porch", + "files", + "reportedly", + "venture", + "Storm", + "##ence", + "Nature", + "killer", + "panic", + "fate", + "Secret", + "Wang", + "scream", + "drivers", + "belongs", + "Chamber", + "clan", + "monument", + "mixing", + "Peru", + "bet", + "Riley", + "Friends", + "Isaac", + "submarine", + "1877", + "130", + "judges", + "harm", + "ranging", + "affair", + "prepare", + "pupils", + "householder", + "Policy", + "decorated", + "Nation", + "slammed", + "activist", + "implemented", + "Room", + "qualify", + "Publishing", + "establishing", + "Baptist", + "touring", + "subsidiary", + "##nal", + "legend", + "1872", + "laughter", + "PC", + "Athens", + "settlers", + "ties", + "dual", + "dear", + "Draft", + "strategic", + "Ivan", + "reveal", + "closest", + "dominant", + "Ah", + "##ult", + "Denver", + "bond", + "boundaries", + "drafted", + "tables", + "##TV", + "eyed", + "Edition", + "##ena", + "1868", + "belonging", + "1874", + "Industrial", + "cream", + "Ridge", + "Hindu", + "scholarship", + "Ma", + "opens", + "initiated", + "##ith", + "yelled", + "compound", + "random", + "Throughout", + "grades", + "physics", + "sank", + "grows", + "exclusively", + "settle", + "Saints", + "brings", + "Amsterdam", + "Make", + "Hart", + "walks", + "battery", + "violin", + "##born", + "explanation", + "##ware", + "1873", + "##har", + "provinces", + "thrust", + "exclusive", + "sculpture", + "shops", + "##fire", + "VI", + "constitution", + "Barcelona", + "monster", + "Devon", + "Jefferson", + "Sullivan", + "bow", + "##din", + "desperate", + "##ć", + "Julie", + "##mon", + "##ising", + "terminus", + "Jesse", + "abilities", + "golf", + "##ple", + "##via", + "##away", + "Raymond", + "measured", + "jury", + "firing", + "revenue", + "suburb", + "Bulgarian", + "1866", + "##cha", + "timber", + "Things", + "##weight", + "Morning", + "spots", + "Alberta", + "Data", + "explains", + "Kyle", + "friendship", + "raw", + "tube", + "demonstrated", + "aboard", + "immigrants", + "reply", + "breathe", + "Manager", + "ease", + "##ban", + "##dia", + "Diocese", + "##vy", + "##ía", + "pit", + "ongoing", + "##lie", + "Gilbert", + "Costa", + "1940s", + "Report", + "voters", + "cloud", + "traditions", + "##MS", + "gallery", + "Jennifer", + "swung", + "Broadcasting", + "Does", + "diverse", + "reveals", + "arriving", + "initiative", + "##ani", + "Give", + "Allied", + "Pat", + "Outstanding", + "monastery", + "blind", + "Currently", + "##war", + "bloody", + "stopping", + "focuses", + "managing", + "Florence", + "Harvey", + "creatures", + "900", + "breast", + "internet", + "Artillery", + "purple", + "##mate", + "alliance", + "excited", + "fee", + "Brisbane", + "lifetime", + "Private", + "##aw", + "##nis", + "##gue", + "##ika", + "phrase", + "regulations", + "reflected", + "manufactured", + "conventional", + "pleased", + "client", + "##ix", + "##ncy", + "Pedro", + "reduction", + "##con", + "welcome", + "jail", + "comfort", + "Iranian", + "Norfolk", + "Dakota", + "##tein", + "evolution", + "everywhere", + "Initially", + "sensitive", + "Olivia", + "Oscar", + "implementation", + "sits", + "stolen", + "demands", + "slide", + "grandson", + "##ich", + "merger", + "##mic", + "Spirit", + "##°", + "ticket", + "root", + "difficulty", + "Nevada", + "##als", + "lined", + "Dylan", + "Original", + "Call", + "biological", + "EU", + "dramatic", + "##hn", + "Operations", + "treaty", + "gap", + "##list", + "Am", + "Romanized", + "moral", + "Butler", + "perspective", + "Furthermore", + "Manuel", + "absolutely", + "unsuccessful", + "disaster", + "dispute", + "preparation", + "tested", + "discover", + "##ach", + "shield", + "squeezed", + "brushed", + "battalion", + "Arnold", + "##ras", + "superior", + "treat", + "clinical", + "##so", + "Apple", + "Syria", + "Cincinnati", + "package", + "flights", + "editions", + "Leader", + "minority", + "wonderful", + "hang", + "Pop", + "Philippine", + "telephone", + "bell", + "honorary", + "##mar", + "balls", + "Democrat", + "dirty", + "thereafter", + "collapsed", + "Inside", + "slip", + "wrestling", + "##ín", + "listened", + "regard", + "bowl", + "None", + "Sport", + "completing", + "trapped", + "##view", + "copper", + "Wallace", + "Honor", + "blame", + "Peninsula", + "##ert", + "##oy", + "Anglo", + "bearing", + "simultaneously", + "honest", + "##ias", + "Mix", + "Got", + "speaker", + "voiced", + "impressed", + "prices", + "error", + "1869", + "##feld", + "trials", + "Nine", + "Industry", + "substitute", + "Municipal", + "departed", + "slept", + "##ama", + "Junction", + "Socialist", + "flower", + "dropping", + "comment", + "fantasy", + "##ress", + "arrangements", + "travelled", + "furniture", + "fist", + "relieved", + "##tics", + "Leonard", + "linear", + "earn", + "expand", + "Soul", + "Plan", + "Leeds", + "Sierra", + "accessible", + "innocent", + "Winner", + "Fighter", + "Range", + "winds", + "vertical", + "Pictures", + "101", + "charter", + "cooperation", + "prisoner", + "interviews", + "recognised", + "sung", + "manufacturer", + "exposure", + "submitted", + "Mars", + "leaf", + "gauge", + "screaming", + "likes", + "eligible", + "##ac", + "gathering", + "columns", + "##dra", + "belly", + "UN", + "maps", + "messages", + "speakers", + "##ants", + "garage", + "unincorporated", + "Number", + "Watson", + "sixteen", + "lots", + "beaten", + "Could", + "Municipality", + "##ano", + "Horse", + "talks", + "Drake", + "scores", + "Venice", + "genetic", + "##mal", + "##ère", + "Cold", + "Jose", + "nurse", + "traditionally", + "##bus", + "Territory", + "Key", + "Nancy", + "##win", + "thumb", + "São", + "index", + "dependent", + "carries", + "controls", + "Comics", + "coalition", + "physician", + "referring", + "Ruth", + "Based", + "restricted", + "inherited", + "internationally", + "stretch", + "THE", + "plates", + "margin", + "Holland", + "knock", + "significance", + "valuable", + "Kenya", + "carved", + "emotion", + "conservation", + "municipalities", + "overseas", + "resumed", + "Finance", + "graduation", + "blinked", + "temperatures", + "constantly", + "productions", + "scientist", + "ghost", + "cuts", + "permitted", + "##ches", + "firmly", + "##bert", + "patrol", + "##yo", + "Croatian", + "attacking", + "1850", + "portrait", + "promoting", + "sink", + "conversion", + "##kov", + "locomotives", + "Guide", + "##val", + "nephew", + "relevant", + "Marc", + "drum", + "originated", + "Chair", + "visits", + "dragged", + "Price", + "favour", + "corridor", + "properly", + "respective", + "Caroline", + "reporting", + "inaugural", + "1848", + "industries", + "##ching", + "edges", + "Christianity", + "Maurice", + "Trent", + "Economics", + "carrier", + "Reed", + "##gon", + "tribute", + "Pradesh", + "##ale", + "extend", + "attitude", + "Yale", + "##lu", + "settlements", + "glasses", + "taxes", + "targets", + "##ids", + "quarters", + "##ological", + "connect", + "hence", + "metre", + "collapse", + "underneath", + "banned", + "Future", + "clients", + "alternate", + "explosion", + "kinds", + "Commons", + "hungry", + "dragon", + "Chapel", + "Buddhist", + "lover", + "depression", + "pulls", + "##ges", + "##uk", + "origins", + "computers", + "crosses", + "kissing", + "assume", + "emphasis", + "lighting", + "##ites", + "personally", + "crashed", + "beam", + "touchdown", + "lane", + "comparison", + "##mont", + "Hitler", + "##las", + "execution", + "##ene", + "acre", + "sum", + "Pearl", + "ray", + "##point", + "essentially", + "worker", + "convicted", + "tear", + "Clay", + "recovery", + "Literature", + "Unfortunately", + "##row", + "partial", + "Petersburg", + "Bulgaria", + "coaching", + "evolved", + "reception", + "enters", + "narrowed", + "elevator", + "therapy", + "defended", + "pairs", + "##lam", + "breaks", + "Bennett", + "Uncle", + "cylinder", + "##ison", + "passion", + "bases", + "Actor", + "cancelled", + "battles", + "extensively", + "oxygen", + "Ancient", + "specialized", + "negotiations", + "##rat", + "acquisition", + "convince", + "interpretation", + "##00", + "photos", + "aspect", + "colleges", + "Artist", + "keeps", + "##wing", + "Croatia", + "##ona", + "Hughes", + "Otto", + "comments", + "##du", + "Ph", + "Sweet", + "adventure", + "describing", + "Student", + "Shakespeare", + "scattered", + "objective", + "Aviation", + "Phillips", + "Fourth", + "athletes", + "##hal", + "##tered", + "Guitar", + "intensity", + "née", + "dining", + "curve", + "Obama", + "topics", + "legislative", + "Mill", + "Cruz", + "##ars", + "Members", + "recipient", + "Derby", + "inspiration", + "corresponding", + "fed", + "YouTube", + "coins", + "pressing", + "intent", + "Karen", + "cinema", + "Delta", + "destination", + "shorter", + "Christians", + "imagined", + "canal", + "Newcastle", + "Shah", + "Adrian", + "super", + "Males", + "160", + "liberal", + "lord", + "bat", + "supplied", + "Claude", + "meal", + "worship", + "##atic", + "Han", + "wire", + "°F", + "##tha", + "punishment", + "thirteen", + "fighters", + "##ibility", + "1859", + "Ball", + "gardens", + "##ari", + "Ottawa", + "pole", + "indicating", + "Twenty", + "Higher", + "Bass", + "Ivy", + "farming", + "##urs", + "certified", + "Saudi", + "plenty", + "##ces", + "restaurants", + "Representative", + "Miles", + "payment", + "##inger", + "##rit", + "Confederate", + "festivals", + "references", + "##ić", + "Mario", + "PhD", + "playoffs", + "witness", + "rice", + "mask", + "saving", + "opponents", + "enforcement", + "automatically", + "relegated", + "##oe", + "radar", + "whenever", + "Financial", + "imperial", + "uncredited", + "influences", + "Abraham", + "skull", + "Guardian", + "Haven", + "Bengal", + "impressive", + "input", + "mixture", + "Warsaw", + "altitude", + "distinction", + "1857", + "collective", + "Annie", + "##ean", + "##bal", + "directions", + "Flying", + "##nic", + "faded", + "##ella", + "contributing", + "##ó", + "employee", + "##lum", + "##yl", + "ruler", + "oriented", + "conductor", + "focusing", + "##die", + "Giants", + "Mills", + "mines", + "Deep", + "curled", + "Jessica", + "guitars", + "Louise", + "procedure", + "Machine", + "failing", + "attendance", + "Nepal", + "Brad", + "Liam", + "tourist", + "exhibited", + "Sophie", + "depicted", + "Shaw", + "Chuck", + "##can", + "expecting", + "challenges", + "##nda", + "equally", + "resignation", + "##logical", + "Tigers", + "loop", + "pitched", + "outdoor", + "reviewed", + "hopes", + "True", + "temporarily", + "Borough", + "torn", + "jerked", + "collect", + "Berkeley", + "Independence", + "cotton", + "retreat", + "campaigns", + "participating", + "Intelligence", + "Heaven", + "##ked", + "situations", + "borough", + "Democrats", + "Harbor", + "##len", + "Liga", + "serial", + "circles", + "fourteen", + "##lot", + "seized", + "filling", + "departments", + "finance", + "absolute", + "Roland", + "Nate", + "floors", + "raced", + "struggling", + "deliver", + "protests", + "##tel", + "Exchange", + "efficient", + "experiments", + "##dar", + "faint", + "3D", + "binding", + "Lions", + "lightly", + "skill", + "proteins", + "difficulties", + "##cal", + "monthly", + "camps", + "flood", + "loves", + "Amanda", + "Commerce", + "##oid", + "##lies", + "elementary", + "##tre", + "organic", + "##stein", + "##ph", + "receives", + "Tech", + "enormous", + "distinctive", + "Joint", + "experiment", + "Circuit", + "citizen", + "##hy", + "shelter", + "ideal", + "practically", + "formula", + "addressed", + "Foster", + "Productions", + "##ax", + "variable", + "punk", + "Voice", + "fastest", + "concentrated", + "##oma", + "##yer", + "stored", + "surrender", + "vary", + "Sergeant", + "Wells", + "ward", + "Wait", + "##ven", + "playoff", + "reducing", + "cavalry", + "##dle", + "Venezuela", + "tissue", + "amounts", + "sweat", + "##we", + "Non", + "##nik", + "beetle", + "##bu", + "##tu", + "Jared", + "Hunt", + "##₂", + "fat", + "Sultan", + "Living", + "Circle", + "Secondary", + "Suddenly", + "reverse", + "##min", + "Travel", + "##bin", + "Lebanon", + "##mas", + "virus", + "Wind", + "dissolved", + "enrolled", + "holiday", + "Keep", + "helicopter", + "Clarke", + "constitutional", + "technologies", + "doubles", + "instructions", + "##ace", + "Azerbaijan", + "##ill", + "occasional", + "frozen", + "trick", + "wiped", + "writings", + "Shanghai", + "preparing", + "challenged", + "mainstream", + "summit", + "180", + "##arian", + "##rating", + "designation", + "##ada", + "revenge", + "filming", + "tightened", + "Miguel", + "Montana", + "reflect", + "celebration", + "bitch", + "flashed", + "signals", + "rounded", + "peoples", + "##tation", + "renowned", + "Google", + "characteristic", + "Campaign", + "sliding", + "##rman", + "usage", + "Record", + "Using", + "woke", + "solutions", + "holes", + "theories", + "logo", + "Protestant", + "relaxed", + "brow", + "nickname", + "Reading", + "marble", + "##tro", + "symptoms", + "Overall", + "capita", + "##ila", + "outbreak", + "revolution", + "deemed", + "Principal", + "Hannah", + "approaches", + "inducted", + "Wellington", + "vulnerable", + "Environmental", + "Drama", + "incumbent", + "Dame", + "1854", + "travels", + "samples", + "accurate", + "physically", + "Sony", + "Nashville", + "##sville", + "##lic", + "##og", + "Producer", + "Lucky", + "tough", + "Stanford", + "resort", + "repeatedly", + "eyebrows", + "Far", + "choir", + "commenced", + "##ep", + "##ridge", + "rage", + "swing", + "sequel", + "heir", + "buses", + "ad", + "Grove", + "##late", + "##rick", + "updated", + "##SA", + "Delaware", + "##fa", + "Athletics", + "warmth", + "Off", + "excitement", + "verse", + "Protection", + "Villa", + "corruption", + "intellectual", + "Jenny", + "##lyn", + "mystery", + "prayer", + "healthy", + "##ologist", + "Bear", + "lab", + "Ernest", + "Remix", + "register", + "basement", + "Montgomery", + "consistent", + "tier", + "1855", + "Preston", + "Brooks", + "##maker", + "vocalist", + "laboratory", + "delayed", + "wheels", + "rope", + "bachelor", + "pitcher", + "Block", + "Nevertheless", + "suspect", + "efficiency", + "Nebraska", + "siege", + "FBI", + "planted", + "##AC", + "Newton", + "breeding", + "##ain", + "eighteen", + "Argentine", + "encounter", + "servant", + "1858", + "elder", + "Shadow", + "Episode", + "fabric", + "doctors", + "survival", + "removal", + "chemistry", + "volunteers", + "Kane", + "variant", + "arrives", + "Eagle", + "Left", + "##fe", + "Jo", + "divorce", + "##ret", + "yesterday", + "Bryan", + "handling", + "diseases", + "customer", + "Sheriff", + "Tiger", + "Harper", + "##oi", + "resting", + "Linda", + "Sheffield", + "gasped", + "sexy", + "economics", + "alien", + "tale", + "footage", + "Liberty", + "yeah", + "fundamental", + "Ground", + "flames", + "Actress", + "photographer", + "Maggie", + "Additional", + "joke", + "custom", + "Survey", + "Abu", + "silk", + "consumption", + "Ellis", + "bread", + "##uous", + "engagement", + "puts", + "Dog", + "##hr", + "poured", + "guilt", + "CDP", + "boxes", + "hardware", + "clenched", + "##cio", + "stem", + "arena", + "extending", + "##com", + "examination", + "Steel", + "encountered", + "revised", + "140", + "picking", + "Car", + "hasn", + "Minor", + "pride", + "Roosevelt", + "boards", + "##mia", + "blocked", + "curious", + "drag", + "narrative", + "brigade", + "Prefecture", + "mysterious", + "namely", + "connects", + "Devil", + "historians", + "CHAPTER", + "quit", + "installation", + "Golf", + "empire", + "elevated", + "##eo", + "releasing", + "Bond", + "##uri", + "harsh", + "ban", + "##BA", + "contracts", + "cloth", + "presents", + "stake", + "chorus", + "##eau", + "swear", + "##mp", + "allies", + "generations", + "Motor", + "meter", + "pen", + "warrior", + "veteran", + "##EC", + "comprehensive", + "missile", + "interaction", + "instruction", + "Renaissance", + "rested", + "Dale", + "fix", + "fluid", + "les", + "investigate", + "loaded", + "widow", + "exhibit", + "artificial", + "select", + "rushing", + "tasks", + "signature", + "nowhere", + "Engineer", + "feared", + "Prague", + "bother", + "extinct", + "gates", + "Bird", + "climbing", + "heels", + "striking", + "artwork", + "hunt", + "awake", + "##hin", + "Formula", + "thereby", + "commitment", + "imprisoned", + "Beyond", + "##MA", + "transformed", + "Agriculture", + "Low", + "Movie", + "radical", + "complicated", + "Yellow", + "Auckland", + "mansion", + "tenth", + "Trevor", + "predecessor", + "##eer", + "disbanded", + "sucked", + "circular", + "witch", + "gaining", + "lean", + "Behind", + "illustrated", + "rang", + "celebrate", + "bike", + "consist", + "framework", + "##cent", + "Shane", + "owns", + "350", + "comprises", + "collaborated", + "colleagues", + "##cast", + "engage", + "fewer", + "##ave", + "1856", + "observation", + "diplomatic", + "legislature", + "improvements", + "Interstate", + "craft", + "MTV", + "martial", + "administered", + "jet", + "approaching", + "permanently", + "attraction", + "manuscript", + "numbered", + "Happy", + "Andrea", + "shallow", + "Gothic", + "Anti", + "##bad", + "improvement", + "trace", + "preserve", + "regardless", + "rode", + "dies", + "achievement", + "maintaining", + "Hamburg", + "spine", + "##air", + "flowing", + "encourage", + "widened", + "posts", + "##bound", + "125", + "Southeast", + "Santiago", + "##bles", + "impression", + "receiver", + "Single", + "closure", + "##unt", + "communist", + "honors", + "Northwest", + "105", + "##ulated", + "cared", + "un", + "hug", + "magnetic", + "seeds", + "topic", + "perceived", + "prey", + "prevented", + "Marvel", + "Eight", + "Michel", + "Transportation", + "rings", + "Gate", + "##gne", + "Byzantine", + "accommodate", + "floating", + "##dor", + "equation", + "ministry", + "##ito", + "##gled", + "Rules", + "earthquake", + "revealing", + "Brother", + "Celtic", + "blew", + "chairs", + "Panama", + "Leon", + "attractive", + "descendants", + "Care", + "Ambassador", + "tours", + "breathed", + "threatening", + "##cho", + "smiles", + "Lt", + "Beginning", + "##iness", + "fake", + "assists", + "fame", + "strings", + "Mobile", + "Liu", + "parks", + "http", + "1852", + "brush", + "Aunt", + "bullet", + "consciousness", + "##sta", + "##ther", + "consequences", + "gather", + "dug", + "1851", + "bridges", + "Doug", + "##sion", + "Artists", + "ignore", + "Carol", + "brilliant", + "radiation", + "temples", + "basin", + "clouds", + "##cted", + "Stevens", + "spite", + "soap", + "consumer", + "Damn", + "Snow", + "recruited", + "##craft", + "Advanced", + "tournaments", + "Quinn", + "undergraduate", + "questioned", + "Palmer", + "Annual", + "Others", + "feeding", + "Spider", + "printing", + "##orn", + "cameras", + "functional", + "Chester", + "readers", + "Alpha", + "universal", + "Faith", + "Brandon", + "François", + "authored", + "Ring", + "el", + "aims", + "athletic", + "possessed", + "Vermont", + "programmes", + "##uck", + "bore", + "Fisher", + "statements", + "shed", + "saxophone", + "neighboring", + "pronounced", + "barrel", + "bags", + "##dge", + "organisations", + "pilots", + "casualties", + "Kenneth", + "##brook", + "silently", + "Malcolm", + "span", + "Essex", + "anchor", + "##hl", + "virtual", + "lessons", + "Henri", + "Trump", + "Page", + "pile", + "locomotive", + "wounds", + "uncomfortable", + "sustained", + "Diana", + "Eagles", + "##pi", + "2000s", + "documented", + "##bel", + "Cassie", + "delay", + "kisses", + "##ines", + "variation", + "##ag", + "growled", + "##mark", + "##ways", + "Leslie", + "studios", + "Friedrich", + "aunt", + "actively", + "armor", + "eaten", + "historically", + "Better", + "purse", + "honey", + "ratings", + "##ée", + "naturally", + "1840", + "peer", + "Kenny", + "Cardinal", + "database", + "Looking", + "runners", + "handsome", + "Double", + "PA", + "##boat", + "##sted", + "protecting", + "##jan", + "Diamond", + "concepts", + "interface", + "##aki", + "Watch", + "Article", + "Columbus", + "dialogue", + "pause", + "##rio", + "extends", + "blanket", + "pulse", + "1853", + "affiliate", + "ladies", + "Ronald", + "counted", + "kills", + "demons", + "##zation", + "Airlines", + "Marco", + "Cat", + "companion", + "mere", + "Yugoslavia", + "Forum", + "Allan", + "pioneer", + "Competition", + "Methodist", + "patent", + "nobody", + "Stockholm", + "##ien", + "regulation", + "##ois", + "accomplished", + "##itive", + "washed", + "sake", + "Vladimir", + "crops", + "prestigious", + "humor", + "Sally", + "labour", + "tributary", + "trap", + "altered", + "examined", + "Mumbai", + "bombing", + "Ash", + "noble", + "suspension", + "ruins", + "##bank", + "spare", + "displays", + "guided", + "dimensional", + "Iraqi", + "##hon", + "sciences", + "Franz", + "relating", + "fence", + "followers", + "Palestine", + "invented", + "proceeded", + "Batman", + "Bradley", + "##yard", + "##ova", + "crystal", + "Kerala", + "##ima", + "shipping", + "handled", + "Want", + "abolished", + "Drew", + "##tter", + "Powell", + "Half", + "##table", + "##cker", + "exhibitions", + "Were", + "assignment", + "assured", + "##rine", + "Indonesian", + "Grammy", + "acknowledged", + "Kylie", + "coaches", + "structural", + "clearing", + "stationed", + "Say", + "Total", + "Rail", + "besides", + "glow", + "threats", + "afford", + "Tree", + "Musical", + "##pp", + "elite", + "centered", + "explore", + "Engineers", + "Stakes", + "Hello", + "tourism", + "severely", + "assessment", + "##tly", + "crack", + "politicians", + "##rrow", + "sheets", + "volunteer", + "##borough", + "##hold", + "announcement", + "recover", + "contribute", + "lungs", + "##ille", + "mainland", + "presentation", + "Johann", + "Writing", + "1849", + "##bird", + "Study", + "Boulevard", + "coached", + "fail", + "airline", + "Congo", + "Plus", + "Syrian", + "introduce", + "ridge", + "Casey", + "manages", + "##fi", + "searched", + "Support", + "succession", + "progressive", + "coup", + "cultures", + "##lessly", + "sensation", + "Cork", + "Elena", + "Sofia", + "Philosophy", + "mini", + "trunk", + "academy", + "Mass", + "Liz", + "practiced", + "Reid", + "##ule", + "satisfied", + "experts", + "Wilhelm", + "Woods", + "invitation", + "Angels", + "calendar", + "joy", + "Sr", + "Dam", + "packed", + "##uan", + "bastard", + "Workers", + "broadcasts", + "logic", + "cooking", + "backward", + "##ack", + "Chen", + "creates", + "enzyme", + "##xi", + "Davies", + "aviation", + "VII", + "Conservation", + "fucking", + "Knights", + "##kan", + "requiring", + "hectares", + "wars", + "ate", + "##box", + "Mind", + "desired", + "oak", + "absorbed", + "Really", + "Vietnamese", + "Paulo", + "athlete", + "##car", + "##eth", + "Talk", + "Wu", + "##cks", + "survivors", + "Yang", + "Joel", + "Almost", + "Holmes", + "Armed", + "Joshua", + "priests", + "discontinued", + "##sey", + "blond", + "Rolling", + "suggesting", + "CA", + "clay", + "exterior", + "Scientific", + "##sive", + "Giovanni", + "Hi", + "farther", + "contents", + "Winners", + "animation", + "neutral", + "mall", + "Notes", + "layers", + "professionals", + "Armstrong", + "Against", + "Piano", + "involve", + "monitor", + "angel", + "parked", + "bears", + "seated", + "feat", + "beliefs", + "##kers", + "Version", + "suffer", + "##ceae", + "guidance", + "##eur", + "honored", + "raid", + "alarm", + "Glen", + "Ellen", + "Jamaica", + "trio", + "enabled", + "##ils", + "procedures", + "##hus", + "moderate", + "upstairs", + "##ses", + "torture", + "Georgian", + "rebellion", + "Fernando", + "Nice", + "##are", + "Aires", + "Campus", + "beast", + "##hing", + "1847", + "##FA", + "Isle", + "##logist", + "Princeton", + "cathedral", + "Oakland", + "Solomon", + "##tto", + "Milwaukee", + "upcoming", + "midfielder", + "Neither", + "sacred", + "Eyes", + "appreciate", + "Brunswick", + "secrets", + "Rice", + "Somerset", + "Chancellor", + "Curtis", + "##gel", + "Rich", + "separation", + "grid", + "##los", + "##bon", + "urge", + "##ees", + "##ree", + "freight", + "towers", + "psychology", + "requirement", + "dollar", + "##fall", + "##sman", + "exile", + "tomb", + "Salt", + "Stefan", + "Buenos", + "Revival", + "Porter", + "tender", + "diesel", + "chocolate", + "Eugene", + "Legion", + "Laboratory", + "sheep", + "arched", + "hospitals", + "orbit", + "Full", + "##hall", + "drinks", + "ripped", + "##RS", + "tense", + "Hank", + "leagues", + "##nberg", + "PlayStation", + "fool", + "Punjab", + "relatives", + "Comedy", + "sur", + "1846", + "Tonight", + "Sox", + "##if", + "Rabbi", + "org", + "speaks", + "institute", + "defender", + "painful", + "wishes", + "Weekly", + "literacy", + "portions", + "snake", + "item", + "deals", + "##tum", + "autumn", + "sharply", + "reforms", + "thighs", + "prototype", + "##ition", + "argues", + "disorder", + "Physics", + "terror", + "provisions", + "refugees", + "predominantly", + "independently", + "march", + "##graphy", + "Arabia", + "Andrews", + "Bus", + "Money", + "drops", + "##zar", + "pistol", + "matrix", + "revolutionary", + "##ust", + "Starting", + "##ptic", + "Oak", + "Monica", + "##ides", + "servants", + "##hed", + "archaeological", + "divorced", + "rocket", + "enjoying", + "fires", + "##nel", + "assembled", + "qualification", + "retiring", + "##fied", + "Distinguished", + "handful", + "infection", + "Durham", + "##itz", + "fortune", + "renewed", + "Chelsea", + "##sley", + "curved", + "gesture", + "retain", + "exhausted", + "##ifying", + "Perth", + "jumping", + "Palestinian", + "Simpson", + "colonies", + "steal", + "##chy", + "corners", + "Finn", + "arguing", + "Martha", + "##var", + "Betty", + "emerging", + "Heights", + "Hindi", + "Manila", + "pianist", + "founders", + "regret", + "Napoleon", + "elbow", + "overhead", + "bold", + "praise", + "humanity", + "##ori", + "Revolutionary", + "##ere", + "fur", + "##ole", + "Ashley", + "Official", + "##rm", + "lovely", + "Architecture", + "##sch", + "Baronet", + "virtually", + "##OS", + "descended", + "immigration", + "##das", + "##kes", + "Holly", + "Wednesday", + "maintains", + "theatrical", + "Evan", + "Gardens", + "citing", + "##gia", + "segments", + "Bailey", + "Ghost", + "##city", + "governing", + "graphics", + "##ined", + "privately", + "potentially", + "transformation", + "Crystal", + "Cabinet", + "sacrifice", + "hesitated", + "mud", + "Apollo", + "Desert", + "bin", + "victories", + "Editor", + "Railways", + "Web", + "Case", + "tourists", + "Brussels", + "Franco", + "compiled", + "topped", + "Gene", + "engineers", + "commentary", + "egg", + "escort", + "nerve", + "arch", + "necessarily", + "frustration", + "Michelle", + "democracy", + "genes", + "Facebook", + "halfway", + "##ient", + "102", + "flipped", + "Won", + "##mit", + "NASA", + "Lynn", + "Provincial", + "ambassador", + "Inspector", + "glared", + "Change", + "McDonald", + "developments", + "tucked", + "noting", + "Gibson", + "circulation", + "dubbed", + "armies", + "resource", + "Headquarters", + "##iest", + "Mia", + "Albanian", + "Oil", + "Albums", + "excuse", + "intervention", + "Grande", + "Hugo", + "integration", + "civilians", + "depends", + "reserves", + "Dee", + "compositions", + "identification", + "restrictions", + "quarterback", + "Miranda", + "Universe", + "favourite", + "ranges", + "hint", + "loyal", + "Op", + "entity", + "Manual", + "quoted", + "dealt", + "specialist", + "Zhang", + "download", + "Westminster", + "Rebecca", + "streams", + "Anglican", + "variations", + "Mine", + "detective", + "Films", + "reserved", + "##oke", + "##key", + "sailing", + "##gger", + "expanding", + "recall", + "discovers", + "particles", + "behaviour", + "Gavin", + "blank", + "permit", + "Java", + "Fraser", + "Pass", + "##non", + "##TA", + "panels", + "statistics", + "notion", + "courage", + "dare", + "venues", + "##roy", + "Box", + "Newport", + "travelling", + "Thursday", + "warriors", + "Glenn", + "criteria", + "360", + "mutual", + "restore", + "varied", + "bitter", + "Katherine", + "##lant", + "ritual", + "bits", + "##à", + "Henderson", + "trips", + "Richardson", + "Detective", + "curse", + "psychological", + "Il", + "midnight", + "streak", + "facts", + "Dawn", + "Indies", + "Edmund", + "roster", + "Gen", + "##nation", + "1830", + "congregation", + "shaft", + "##ically", + "##mination", + "Indianapolis", + "Sussex", + "loving", + "##bit", + "sounding", + "horrible", + "Continental", + "Griffin", + "advised", + "magical", + "millions", + "##date", + "1845", + "Safety", + "lifting", + "determination", + "valid", + "dialect", + "Penn", + "Know", + "triple", + "avoided", + "dancer", + "judgment", + "sixty", + "farmer", + "lakes", + "blast", + "aggressive", + "Abby", + "tag", + "chains", + "inscription", + "##nn", + "conducting", + "Scout", + "buying", + "##wich", + "spreading", + "##OC", + "array", + "hurried", + "Environment", + "improving", + "prompted", + "fierce", + "Taking", + "Away", + "tune", + "pissed", + "Bull", + "catching", + "##ying", + "eyebrow", + "metropolitan", + "terrain", + "##rel", + "Lodge", + "manufacturers", + "creator", + "##etic", + "happiness", + "ports", + "##ners", + "Relations", + "fortress", + "targeted", + "##ST", + "allegedly", + "blues", + "##osa", + "Bosnia", + "##dom", + "burial", + "similarly", + "stranger", + "pursued", + "symbols", + "rebels", + "reflection", + "routine", + "traced", + "indoor", + "eventual", + "##ska", + "##ão", + "##una", + "MD", + "##phone", + "oh", + "grants", + "Reynolds", + "rid", + "operators", + "##nus", + "Joey", + "vital", + "siblings", + "keyboard", + "br", + "removing", + "societies", + "drives", + "solely", + "princess", + "lighter", + "Various", + "Cavalry", + "believing", + "SC", + "underwent", + "relay", + "smelled", + "syndrome", + "welfare", + "authorized", + "seemingly", + "Hard", + "chicken", + "##rina", + "Ages", + "Bo", + "democratic", + "barn", + "Eye", + "shorts", + "##coming", + "##hand", + "disappointed", + "unexpected", + "centres", + "Exhibition", + "Stories", + "Site", + "banking", + "accidentally", + "Agent", + "conjunction", + "André", + "Chloe", + "resist", + "width", + "Queens", + "provision", + "##art", + "Melissa", + "Honorary", + "Del", + "prefer", + "abruptly", + "duration", + "##vis", + "Glass", + "enlisted", + "##ado", + "discipline", + "Sisters", + "carriage", + "##ctor", + "##sburg", + "Lancashire", + "log", + "fuck", + "##iz", + "closet", + "collecting", + "holy", + "rape", + "trusted", + "cleaning", + "inhabited", + "Rocky", + "104", + "editorial", + "##yu", + "##ju", + "succeed", + "strict", + "Cuban", + "##iya", + "Bronze", + "outcome", + "##ifies", + "##set", + "corps", + "Hero", + "barrier", + "Kumar", + "groaned", + "Nina", + "Burton", + "enable", + "stability", + "Milton", + "knots", + "##ination", + "slavery", + "##borg", + "curriculum", + "trailer", + "warfare", + "Dante", + "Edgar", + "revival", + "Copenhagen", + "define", + "advocate", + "Garrett", + "Luther", + "overcome", + "pipe", + "750", + "construct", + "Scotia", + "kings", + "flooding", + "##hard", + "Ferdinand", + "Felix", + "forgot", + "Fish", + "Kurt", + "elaborate", + "##BC", + "graphic", + "gripped", + "colonel", + "Sophia", + "Advisory", + "Self", + "##uff", + "##lio", + "monitoring", + "seal", + "senses", + "rises", + "peaceful", + "journals", + "1837", + "checking", + "legendary", + "Ghana", + "##power", + "ammunition", + "Rosa", + "Richards", + "nineteenth", + "ferry", + "aggregate", + "Troy", + "inter", + "##wall", + "Triple", + "steep", + "tent", + "Cyprus", + "1844", + "##woman", + "commanding", + "farms", + "doi", + "navy", + "specified", + "na", + "cricketer", + "transported", + "Think", + "comprising", + "grateful", + "solve", + "##core", + "beings", + "clerk", + "grain", + "vector", + "discrimination", + "##TC", + "Katie", + "reasonable", + "drawings", + "veins", + "consideration", + "Monroe", + "repeat", + "breed", + "dried", + "witnessed", + "ordained", + "Current", + "spirits", + "remarkable", + "consultant", + "urged", + "Remember", + "anime", + "singers", + "phenomenon", + "Rhode", + "Carlo", + "demanding", + "findings", + "manual", + "varying", + "Fellowship", + "generate", + "safely", + "heated", + "withdrawn", + "##ao", + "headquartered", + "##zon", + "##lav", + "##ency", + "Col", + "Memphis", + "imposed", + "rivals", + "Planet", + "healing", + "##hs", + "ensemble", + "Warriors", + "##bone", + "cult", + "Frankfurt", + "##HL", + "diversity", + "Gerald", + "intermediate", + "##izes", + "reactions", + "Sister", + "##ously", + "##lica", + "quantum", + "awkward", + "mentions", + "pursuit", + "##ography", + "varies", + "profession", + "molecular", + "consequence", + "lectures", + "cracked", + "103", + "slowed", + "##tsu", + "cheese", + "upgraded", + "suite", + "substance", + "Kingston", + "1800", + "Idaho", + "Theory", + "##een", + "ain", + "Carson", + "Molly", + "##OR", + "configuration", + "Whitney", + "reads", + "audiences", + "##tie", + "Geneva", + "Outside", + "##nen", + "##had", + "transit", + "volleyball", + "Randy", + "Chad", + "rubber", + "motorcycle", + "respected", + "eager", + "Level", + "coin", + "##lets", + "neighbouring", + "##wski", + "confident", + "##cious", + "poll", + "uncertain", + "punch", + "thesis", + "Tucker", + "IATA", + "Alec", + "##ographic", + "##law", + "1841", + "desperately", + "1812", + "Lithuania", + "accent", + "Cox", + "lightning", + "skirt", + "##load", + "Burns", + "Dynasty", + "##ug", + "chapters", + "Working", + "dense", + "Morocco", + "##kins", + "casting", + "Set", + "activated", + "oral", + "Brien", + "horn", + "HIV", + "dawn", + "stumbled", + "altar", + "tore", + "considerably", + "Nicole", + "interchange", + "registration", + "biography", + "Hull", + "Stan", + "bulk", + "consent", + "Pierce", + "##ER", + "Fifth", + "marched", + "terrorist", + "##piece", + "##itt", + "Presidential", + "Heather", + "staged", + "Plant", + "relegation", + "sporting", + "joins", + "##ced", + "Pakistani", + "dynamic", + "Heat", + "##lf", + "ourselves", + "Except", + "Elliott", + "nationally", + "goddess", + "investors", + "Burke", + "Jackie", + "##ā", + "##RA", + "Tristan", + "Associate", + "Tuesday", + "scope", + "Near", + "bunch", + "##abad", + "##ben", + "sunlight", + "##aire", + "manga", + "Willie", + "trucks", + "boarding", + "Lion", + "lawsuit", + "Learning", + "Der", + "pounding", + "awful", + "##mine", + "IT", + "Legend", + "romance", + "Serie", + "AC", + "gut", + "precious", + "Robertson", + "hometown", + "realm", + "Guards", + "Tag", + "batting", + "##vre", + "halt", + "conscious", + "1838", + "acquire", + "collar", + "##gg", + "##ops", + "Herald", + "nationwide", + "citizenship", + "Aircraft", + "decrease", + "em", + "Fiction", + "Female", + "corporation", + "Located", + "##ip", + "fights", + "unconscious", + "Tampa", + "Poetry", + "lobby", + "Malta", + "##sar", + "##bie", + "layout", + "Tate", + "reader", + "stained", + "##bre", + "##rst", + "##ulate", + "loudly", + "Eva", + "Cohen", + "exploded", + "Merit", + "Maya", + "##rable", + "Rovers", + "##IC", + "Morrison", + "Should", + "vinyl", + "##mie", + "onwards", + "##gie", + "vicinity", + "Wildlife", + "probability", + "Mar", + "Barnes", + "##ook", + "spinning", + "Moses", + "##vie", + "Surrey", + "Planning", + "conferences", + "protective", + "Plaza", + "deny", + "Canterbury", + "manor", + "Estate", + "tilted", + "comics", + "IBM", + "destroying", + "server", + "Dorothy", + "##horn", + "Oslo", + "lesser", + "heaven", + "Marshal", + "scales", + "strikes", + "##ath", + "firms", + "attract", + "##BS", + "controlling", + "Bradford", + "southeastern", + "Amazon", + "Travis", + "Janet", + "governed", + "1842", + "Train", + "Holden", + "bleeding", + "gifts", + "rent", + "1839", + "palms", + "##ū", + "judicial", + "Ho", + "Finals", + "conflicts", + "unlikely", + "draws", + "##cies", + "compensation", + "adds", + "elderly", + "Anton", + "lasting", + "Nintendo", + "codes", + "ministers", + "pot", + "associations", + "capabilities", + "##cht", + "libraries", + "##sie", + "chances", + "performers", + "runway", + "##af", + "##nder", + "Mid", + "Vocals", + "##uch", + "##eon", + "interpreted", + "priority", + "Uganda", + "ruined", + "Mathematics", + "cook", + "AFL", + "Lutheran", + "AIDS", + "Capitol", + "chase", + "axis", + "Moreover", + "María", + "Saxon", + "storyline", + "##ffed", + "Tears", + "Kid", + "cent", + "colours", + "Sex", + "##long", + "pm", + "blonde", + "Edwin", + "CE", + "diocese", + "##ents", + "##boy", + "Inn", + "##ller", + "Saskatchewan", + "##kh", + "stepping", + "Windsor", + "##oka", + "##eri", + "Xavier", + "Resources", + "1843", + "##top", + "##rad", + "##lls", + "Testament", + "poorly", + "1836", + "drifted", + "slope", + "CIA", + "remix", + "Lords", + "mature", + "hosting", + "diamond", + "beds", + "##ncies", + "luxury", + "trigger", + "##lier", + "preliminary", + "hybrid", + "journalists", + "Enterprise", + "proven", + "expelled", + "insects", + "Beautiful", + "lifestyle", + "vanished", + "##ake", + "##ander", + "matching", + "surfaces", + "Dominican", + "Kids", + "referendum", + "Orlando", + "Truth", + "Sandy", + "privacy", + "Calgary", + "Speaker", + "sts", + "Nobody", + "shifting", + "##gers", + "Roll", + "Armenia", + "Hand", + "##ES", + "106", + "##ont", + "Guild", + "larvae", + "Stock", + "flame", + "gravity", + "enhanced", + "Marion", + "surely", + "##tering", + "Tales", + "algorithm", + "Emmy", + "darker", + "VIII", + "##lash", + "hamlet", + "deliberately", + "occurring", + "choices", + "Gage", + "fees", + "settling", + "ridiculous", + "##ela", + "Sons", + "cop", + "custody", + "##ID", + "proclaimed", + "Cardinals", + "##pm", + "Metal", + "Ana", + "1835", + "clue", + "Cardiff", + "riders", + "observations", + "MA", + "sometime", + "##och", + "performer", + "intact", + "Points", + "allegations", + "rotation", + "Tennis", + "tenor", + "Directors", + "##ats", + "Transit", + "thigh", + "Complex", + "##works", + "twentieth", + "Factory", + "doctrine", + "Daddy", + "##ished", + "pretend", + "Winston", + "cigarette", + "##IA", + "specimens", + "hydrogen", + "smoking", + "mathematical", + "arguments", + "openly", + "developer", + "##iro", + "fists", + "somebody", + "##san", + "Standing", + "Caleb", + "intelligent", + "Stay", + "Interior", + "echoed", + "Valentine", + "varieties", + "Brady", + "cluster", + "Ever", + "voyage", + "##of", + "deposits", + "ultimate", + "Hayes", + "horizontal", + "proximity", + "##ás", + "estates", + "exploration", + "NATO", + "Classical", + "##most", + "bills", + "condemned", + "1832", + "hunger", + "##ato", + "planes", + "deserve", + "offense", + "sequences", + "rendered", + "acceptance", + "##ony", + "manufacture", + "Plymouth", + "innovative", + "predicted", + "##RC", + "Fantasy", + "##une", + "supporter", + "absent", + "Picture", + "bassist", + "rescued", + "##MC", + "Ahmed", + "Monte", + "##sts", + "##rius", + "insane", + "novelist", + "##és", + "agrees", + "Antarctic", + "Lancaster", + "Hopkins", + "calculated", + "startled", + "##star", + "tribal", + "Amendment", + "##hoe", + "invisible", + "patron", + "deer", + "Walk", + "tracking", + "Lyon", + "tickets", + "##ED", + "philosopher", + "compounds", + "chuckled", + "##wi", + "pound", + "loyalty", + "Academic", + "petition", + "refuses", + "marking", + "Mercury", + "northeastern", + "dimensions", + "scandal", + "Canyon", + "patch", + "publish", + "##oning", + "Peak", + "minds", + "##boro", + "Presbyterian", + "Hardy", + "theoretical", + "magnitude", + "bombs", + "cage", + "##ders", + "##kai", + "measuring", + "explaining", + "avoiding", + "touchdowns", + "Card", + "theology", + "##ured", + "Popular", + "export", + "suspicious", + "Probably", + "photograph", + "Lou", + "Parks", + "Arms", + "compact", + "Apparently", + "excess", + "Banks", + "lied", + "stunned", + "territorial", + "Filipino", + "spectrum", + "learns", + "wash", + "imprisonment", + "ugly", + "##rose", + "Albany", + "Erik", + "sends", + "##hara", + "##rid", + "consumed", + "##gling", + "Belgrade", + "Da", + "opposing", + "Magnus", + "footsteps", + "glowing", + "delicate", + "Alexandria", + "Ludwig", + "gorgeous", + "Bros", + "Index", + "##PA", + "customs", + "preservation", + "bonds", + "##mond", + "environments", + "##nto", + "instructed", + "parted", + "adoption", + "locality", + "workshops", + "goalkeeper", + "##rik", + "##uma", + "Brighton", + "Slovenia", + "##ulating", + "##tical", + "towel", + "hugged", + "stripped", + "Bears", + "upright", + "Wagner", + "##aux", + "secretly", + "Adventures", + "nest", + "Course", + "Lauren", + "Boeing", + "Abdul", + "Lakes", + "450", + "##cu", + "USSR", + "caps", + "Chan", + "##nna", + "conceived", + "Actually", + "Belfast", + "Lithuanian", + "concentrate", + "possess", + "militia", + "pine", + "protagonist", + "Helena", + "##PS", + "##band", + "Belle", + "Clara", + "Reform", + "currency", + "pregnancy", + "1500", + "##rim", + "Isabella", + "hull", + "Name", + "trend", + "journalism", + "diet", + "##mel", + "Recording", + "acclaimed", + "Tang", + "Jace", + "steering", + "vacant", + "suggestion", + "costume", + "laser", + "##š", + "##ink", + "##pan", + "##vić", + "integral", + "achievements", + "wise", + "classroom", + "unions", + "southwestern", + "##uer", + "Garcia", + "toss", + "Tara", + "Large", + "##tate", + "evident", + "responsibilities", + "populated", + "satisfaction", + "##bia", + "casual", + "Ecuador", + "##ght", + "arose", + "##ović", + "Cornwall", + "embrace", + "refuse", + "Heavyweight", + "XI", + "Eden", + "activists", + "##uation", + "biology", + "##shan", + "fraud", + "Fuck", + "matched", + "legacy", + "Rivers", + "missionary", + "extraordinary", + "Didn", + "holder", + "wickets", + "crucial", + "Writers", + "Hurricane", + "Iceland", + "gross", + "trumpet", + "accordance", + "hurry", + "flooded", + "doctorate", + "Albania", + "##yi", + "united", + "deceased", + "jealous", + "grief", + "flute", + "portraits", + "##а", + "pleasant", + "Founded", + "Face", + "crowned", + "Raja", + "advisor", + "Salem", + "##ec", + "Achievement", + "admission", + "freely", + "minimal", + "Sudan", + "developers", + "estimate", + "disabled", + "##lane", + "downstairs", + "Bruno", + "##pus", + "pinyin", + "##ude", + "lecture", + "deadly", + "underlying", + "optical", + "witnesses", + "Combat", + "Julius", + "tapped", + "variants", + "##like", + "Colonial", + "Critics", + "Similarly", + "mouse", + "voltage", + "sculptor", + "Concert", + "salary", + "Frances", + "##ground", + "hook", + "premises", + "Software", + "instructor", + "nominee", + "##ited", + "fog", + "slopes", + "##zu", + "vegetation", + "sail", + "##rch", + "Body", + "Apart", + "atop", + "View", + "utility", + "ribs", + "cab", + "migration", + "##wyn", + "bounded", + "2019", + "pillow", + "trails", + "##ub", + "Halifax", + "shade", + "Rush", + "##lah", + "##dian", + "Notre", + "interviewed", + "Alexandra", + "Springfield", + "Indeed", + "rubbing", + "dozens", + "amusement", + "legally", + "##lers", + "Jill", + "Cinema", + "ignoring", + "Choice", + "##ures", + "pockets", + "##nell", + "laying", + "Blair", + "tackles", + "separately", + "##teen", + "Criminal", + "performs", + "theorem", + "Communication", + "suburbs", + "##iel", + "competitors", + "rows", + "##hai", + "Manitoba", + "Eleanor", + "interactions", + "nominations", + "assassination", + "##dis", + "Edmonton", + "diving", + "##dine", + "essay", + "##tas", + "AFC", + "Edge", + "directing", + "imagination", + "sunk", + "implement", + "Theodore", + "trembling", + "sealed", + "##rock", + "Nobel", + "##ancy", + "##dorf", + "##chen", + "genuine", + "apartments", + "Nicolas", + "AA", + "Bach", + "Globe", + "Store", + "220", + "##10", + "Rochester", + "##ño", + "alert", + "107", + "Beck", + "##nin", + "Naples", + "Basin", + "Crawford", + "fears", + "Tracy", + "##hen", + "disk", + "##pped", + "seventeen", + "Lead", + "backup", + "reconstruction", + "##lines", + "terrified", + "sleeve", + "nicknamed", + "popped", + "##making", + "##ern", + "Holiday", + "Gospel", + "ibn", + "##ime", + "convert", + "divine", + "resolved", + "##quet", + "ski", + "realizing", + "##RT", + "Legislature", + "reservoir", + "Rain", + "sinking", + "rainfall", + "elimination", + "challenging", + "tobacco", + "##outs", + "Given", + "smallest", + "Commercial", + "pin", + "rebel", + "comedian", + "exchanged", + "airing", + "dish", + "Salvador", + "promising", + "##wl", + "relax", + "presenter", + "toll", + "aerial", + "##eh", + "Fletcher", + "brass", + "disappear", + "zones", + "adjusted", + "contacts", + "##lk", + "sensed", + "Walt", + "mild", + "toes", + "flies", + "shame", + "considers", + "wildlife", + "Hanna", + "Arsenal", + "Ladies", + "naming", + "##ishing", + "anxiety", + "discussions", + "cute", + "undertaken", + "Cash", + "strain", + "Wyoming", + "dishes", + "precise", + "Angela", + "##ided", + "hostile", + "twins", + "115", + "Built", + "##pel", + "Online", + "tactics", + "Newman", + "##bourne", + "unclear", + "repairs", + "embarrassed", + "listing", + "tugged", + "Vale", + "##gin", + "Meredith", + "bout", + "##cle", + "velocity", + "tips", + "froze", + "evaluation", + "demonstrate", + "##card", + "criticised", + "Nash", + "lineup", + "Rao", + "monks", + "bacteria", + "lease", + "##lish", + "frightened", + "den", + "revived", + "finale", + "##rance", + "flee", + "Letters", + "decreased", + "##oh", + "Sounds", + "wrap", + "Sharon", + "incidents", + "renovated", + "everybody", + "stole", + "Bath", + "boxing", + "1815", + "withdraw", + "backs", + "interim", + "react", + "murders", + "Rhodes", + "Copa", + "framed", + "flown", + "Estonia", + "Heavy", + "explored", + "##rra", + "##GA", + "##ali", + "Istanbul", + "1834", + "##rite", + "##aging", + "##ues", + "Episcopal", + "arc", + "orientation", + "Maxwell", + "infected", + "##rot", + "BCE", + "Brook", + "grasp", + "Roberto", + "Excellence", + "108", + "withdrawal", + "Marines", + "rider", + "Lo", + "##sin", + "##run", + "Subsequently", + "garrison", + "hurricane", + "facade", + "Prussia", + "crushed", + "enterprise", + "##mber", + "Twitter", + "Generation", + "Physical", + "Sugar", + "editing", + "communicate", + "Ellie", + "##hurst", + "Ernst", + "wagon", + "promotional", + "conquest", + "Parliamentary", + "courtyard", + "lawyers", + "Superman", + "email", + "Prussian", + "lately", + "lecturer", + "Singer", + "Majesty", + "Paradise", + "sooner", + "Heath", + "slot", + "curves", + "convoy", + "##vian", + "induced", + "synonym", + "breeze", + "##plane", + "##ox", + "peered", + "Coalition", + "##hia", + "odds", + "##esh", + "##lina", + "Tomorrow", + "Nadu", + "##ico", + "##rah", + "damp", + "autonomous", + "console", + "Victory", + "counts", + "Luxembourg", + "intimate", + "Archived", + "Carroll", + "spy", + "Zero", + "habit", + "Always", + "faction", + "teenager", + "Johnston", + "chaos", + "ruin", + "commerce", + "blog", + "##shed", + "##the", + "reliable", + "Word", + "Yu", + "Norton", + "parade", + "Catholics", + "damned", + "##iling", + "surgeon", + "##tia", + "Allison", + "Jonas", + "remarked", + "##ès", + "idiot", + "Making", + "proposals", + "Industries", + "strategies", + "artifacts", + "batteries", + "reward", + "##vers", + "Agricultural", + "distinguish", + "lengths", + "Jeffrey", + "Progressive", + "kicking", + "Patricia", + "##gio", + "ballot", + "##ios", + "skilled", + "##gation", + "Colt", + "limestone", + "##AS", + "peninsula", + "##itis", + "LA", + "hotels", + "shapes", + "Crime", + "depicting", + "northwestern", + "HD", + "silly", + "Das", + "##²", + "##ws", + "##ash", + "##matic", + "thermal", + "Has", + "forgive", + "surrendered", + "Palm", + "Nacional", + "drank", + "haired", + "Mercedes", + "##foot", + "loading", + "Timothy", + "##roll", + "mechanisms", + "traces", + "digging", + "discussing", + "Natalie", + "##zhou", + "Forbes", + "landmark", + "Anyway", + "Manor", + "conspiracy", + "gym", + "knocking", + "viewing", + "Formation", + "Pink", + "Beauty", + "limbs", + "Phillip", + "sponsor", + "Joy", + "granite", + "Harbour", + "##ero", + "payments", + "Ballet", + "conviction", + "##dam", + "Hood", + "estimates", + "lacked", + "Mad", + "Jorge", + "##wen", + "refuge", + "##LA", + "invaded", + "Kat", + "suburban", + "##fold", + "investigated", + "Ari", + "complained", + "creek", + "Georges", + "##uts", + "powder", + "accepting", + "deserved", + "carpet", + "Thunder", + "molecules", + "Legal", + "cliff", + "strictly", + "enrollment", + "ranch", + "##rg", + "##mba", + "proportion", + "renovation", + "crop", + "grabbing", + "##liga", + "finest", + "entries", + "receptor", + "helmet", + "blown", + "Listen", + "flagship", + "workshop", + "resolve", + "nails", + "Shannon", + "portal", + "jointly", + "shining", + "Violet", + "overwhelming", + "upward", + "Mick", + "proceedings", + "##dies", + "##aring", + "Laurence", + "Churchill", + "##rice", + "commit", + "170", + "inclusion", + "Examples", + "##verse", + "##rma", + "fury", + "paths", + "##SC", + "ankle", + "nerves", + "Chemistry", + "rectangular", + "sworn", + "screenplay", + "cake", + "Mann", + "Seoul", + "Animal", + "sizes", + "Speed", + "vol", + "Population", + "Southwest", + "Hold", + "continuously", + "Qualified", + "wishing", + "Fighting", + "Made", + "disappointment", + "Portsmouth", + "Thirty", + "##beck", + "Ahmad", + "teammate", + "MLB", + "graph", + "Charleston", + "realizes", + "##dium", + "exhibits", + "preventing", + "##int", + "fever", + "rivalry", + "Male", + "mentally", + "dull", + "##lor", + "##rich", + "consistently", + "##igan", + "Madame", + "certificate", + "suited", + "Krishna", + "accuracy", + "Webb", + "Budapest", + "Rex", + "1831", + "Cornell", + "OK", + "surveillance", + "##gated", + "habitats", + "Adventure", + "Conrad", + "Superior", + "Gay", + "sofa", + "aka", + "boot", + "Statistics", + "Jessie", + "Liberation", + "##lip", + "##rier", + "brands", + "saint", + "Heinrich", + "Christine", + "bath", + "Rhine", + "ballet", + "Jin", + "consensus", + "chess", + "Arctic", + "stack", + "furious", + "cheap", + "toy", + "##yre", + "##face", + "##gging", + "gastropod", + "##nne", + "Romans", + "membrane", + "answering", + "25th", + "architects", + "sustainable", + "##yne", + "Hon", + "1814", + "Baldwin", + "dome", + "##awa", + "##zen", + "celebrity", + "enclosed", + "##uit", + "##mmer", + "Electronic", + "locals", + "##CE", + "supervision", + "mineral", + "Chemical", + "Slovakia", + "alley", + "hub", + "##az", + "heroes", + "Creative", + "##AM", + "incredible", + "politically", + "ESPN", + "yanked", + "halls", + "Aboriginal", + "Greatest", + "yield", + "##20", + "congressional", + "robot", + "Kiss", + "welcomed", + "MS", + "speeds", + "proceed", + "Sherman", + "eased", + "Greene", + "Walsh", + "Geoffrey", + "variables", + "rocky", + "##print", + "acclaim", + "Reverend", + "Wonder", + "tonnes", + "recurring", + "Dawson", + "continent", + "finite", + "AP", + "continental", + "ID", + "facilitate", + "essays", + "Rafael", + "Neal", + "1833", + "ancestors", + "##met", + "##gic", + "Especially", + "teenage", + "frustrated", + "Jules", + "cock", + "expense", + "##oli", + "##old", + "blocking", + "Notable", + "prohibited", + "ca", + "dock", + "organize", + "##wald", + "Burma", + "Gloria", + "dimension", + "aftermath", + "choosing", + "Mickey", + "torpedo", + "pub", + "##used", + "manuscripts", + "laps", + "Ulster", + "staircase", + "sphere", + "Insurance", + "Contest", + "lens", + "risks", + "investigations", + "ERA", + "glare", + "##play", + "Graduate", + "auction", + "Chronicle", + "##tric", + "##50", + "Coming", + "seating", + "Wade", + "seeks", + "inland", + "Thames", + "Rather", + "butterfly", + "contracted", + "positioned", + "consumers", + "contestants", + "fragments", + "Yankees", + "Santos", + "administrator", + "hypothesis", + "retire", + "Denis", + "agreements", + "Winnipeg", + "##rill", + "1820", + "trophy", + "crap", + "shakes", + "Jenkins", + "##rium", + "ya", + "twist", + "labels", + "Maritime", + "##lings", + "##iv", + "111", + "##ensis", + "Cairo", + "Anything", + "##fort", + "opinions", + "crowded", + "##nian", + "abandon", + "##iff", + "drained", + "imported", + "##rr", + "tended", + "##rain", + "Going", + "introducing", + "sculptures", + "bankruptcy", + "danced", + "demonstration", + "stance", + "settings", + "gazed", + "abstract", + "pet", + "Calvin", + "stiff", + "strongest", + "wrestler", + "##dre", + "Republicans", + "grace", + "allocated", + "cursed", + "snail", + "advancing", + "Return", + "errors", + "Mall", + "presenting", + "eliminate", + "Amateur", + "Institution", + "counting", + "##wind", + "warehouse", + "##nde", + "Ethiopia", + "trailed", + "hollow", + "##press", + "Literary", + "capability", + "nursing", + "preceding", + "lamp", + "Thomson", + "Morton", + "##ctic", + "Crew", + "Close", + "composers", + "boom", + "Clare", + "missiles", + "112", + "hunter", + "snap", + "##oni", + "##tail", + "Us", + "declaration", + "##cock", + "rally", + "huh", + "lion", + "straightened", + "Philippe", + "Sutton", + "alpha", + "valued", + "maker", + "navigation", + "detected", + "favorable", + "perception", + "Charter", + "##ña", + "Ricky", + "rebounds", + "tunnels", + "slapped", + "Emergency", + "supposedly", + "##act", + "deployment", + "socialist", + "tubes", + "anybody", + "corn", + "##NA", + "Seminary", + "heating", + "pump", + "##AA", + "achieving", + "souls", + "##ass", + "Link", + "##ele", + "##smith", + "greeted", + "Bates", + "Americas", + "Elder", + "cure", + "contestant", + "240", + "fold", + "Runner", + "Uh", + "licked", + "Politics", + "committees", + "neighbors", + "fairy", + "Silva", + "Leipzig", + "tipped", + "correctly", + "exciting", + "electronics", + "foundations", + "cottage", + "governmental", + "##hat", + "allied", + "claws", + "presidency", + "cruel", + "Agreement", + "slender", + "accompanying", + "precisely", + "##pass", + "driveway", + "swim", + "Stand", + "crews", + "##mission", + "rely", + "everyday", + "Wings", + "demo", + "##hic", + "recreational", + "min", + "nationality", + "##duction", + "Easter", + "##hole", + "canvas", + "Kay", + "Leicester", + "talented", + "Discovery", + "shells", + "##ech", + "Kerry", + "Ferguson", + "Leave", + "##place", + "altogether", + "adopt", + "butt", + "wolves", + "##nsis", + "##ania", + "modest", + "soprano", + "Boris", + "##ught", + "electron", + "depicts", + "hid", + "cruise", + "differ", + "treasure", + "##nch", + "Gun", + "Mama", + "Bengali", + "trainer", + "merchants", + "innovation", + "presumably", + "Shirley", + "bottles", + "proceeds", + "Fear", + "invested", + "Pirates", + "particle", + "Dominic", + "blamed", + "Fight", + "Daisy", + "##pper", + "##graphic", + "nods", + "knight", + "Doyle", + "tales", + "Carnegie", + "Evil", + "Inter", + "Shore", + "Nixon", + "transform", + "Savannah", + "##gas", + "Baltic", + "stretching", + "worlds", + "protocol", + "Percy", + "Toby", + "Heroes", + "brave", + "dancers", + "##aria", + "backwards", + "responses", + "Chi", + "Gaelic", + "Berry", + "crush", + "embarked", + "promises", + "Madonna", + "researcher", + "realised", + "inaugurated", + "Cherry", + "Mikhail", + "Nottingham", + "reinforced", + "subspecies", + "rapper", + "##kie", + "Dreams", + "Re", + "Damon", + "Minneapolis", + "monsters", + "suspicion", + "Tel", + "surroundings", + "afterward", + "complaints", + "OF", + "sectors", + "Algeria", + "lanes", + "Sabha", + "objectives", + "Donna", + "bothered", + "distracted", + "deciding", + "##ives", + "##CA", + "##onia", + "bishops", + "Strange", + "machinery", + "Voiced", + "synthesis", + "reflects", + "interference", + "##TS", + "##ury", + "keen", + "##ign", + "frown", + "freestyle", + "ton", + "Dixon", + "Sacred", + "Ruby", + "Prison", + "##ión", + "1825", + "outfit", + "##tain", + "curiosity", + "##ight", + "frames", + "steadily", + "emigrated", + "horizon", + "##erly", + "Doc", + "philosophical", + "Table", + "UTC", + "Marina", + "##DA", + "secular", + "##eed", + "Zimbabwe", + "cops", + "Mack", + "sheriff", + "Sanskrit", + "Francesco", + "catches", + "questioning", + "streaming", + "Kill", + "testimony", + "hissed", + "tackle", + "countryside", + "copyright", + "##IP", + "Buddhism", + "##rator", + "ladder", + "##ON", + "Past", + "rookie", + "depths", + "##yama", + "##ister", + "##HS", + "Samantha", + "Dana", + "Educational", + "brows", + "Hammond", + "raids", + "envelope", + "##sco", + "##hart", + "##ulus", + "epic", + "detection", + "Streets", + "Potter", + "statistical", + "für", + "ni", + "accounting", + "##pot", + "employer", + "Sidney", + "Depression", + "commands", + "Tracks", + "averaged", + "lets", + "Ram", + "longtime", + "suits", + "branded", + "chip", + "Shield", + "loans", + "ought", + "Said", + "sip", + "##rome", + "requests", + "Vernon", + "bordered", + "veterans", + "##ament", + "Marsh", + "Herzegovina", + "Pine", + "##igo", + "mills", + "anticipation", + "reconnaissance", + "##ef", + "expectations", + "protested", + "arrow", + "guessed", + "depot", + "maternal", + "weakness", + "##ap", + "projected", + "pour", + "Carmen", + "provider", + "newer", + "remind", + "freed", + "##rily", + "##wal", + "##tones", + "intentions", + "Fiji", + "timing", + "Match", + "managers", + "Kosovo", + "Herman", + "Wesley", + "Chang", + "135", + "semifinals", + "shouting", + "Indo", + "Janeiro", + "Chess", + "Macedonia", + "Buck", + "##onies", + "rulers", + "Mail", + "##vas", + "##sel", + "MHz", + "Programme", + "Task", + "commercially", + "subtle", + "propaganda", + "spelled", + "bowling", + "basically", + "Raven", + "1828", + "Colony", + "109", + "##ingham", + "##wara", + "anticipated", + "1829", + "##iers", + "graduates", + "##rton", + "##fication", + "endangered", + "ISO", + "diagnosed", + "##tage", + "exercises", + "Battery", + "bolt", + "poison", + "cartoon", + "##ción", + "hood", + "bowed", + "heal", + "Meyer", + "Reagan", + "##wed", + "subfamily", + "##gent", + "momentum", + "infant", + "detect", + "##sse", + "Chapman", + "Darwin", + "mechanics", + "NSW", + "Cancer", + "Brooke", + "Nuclear", + "comprised", + "hire", + "sanctuary", + "wingspan", + "contrary", + "remembering", + "surprising", + "Basic", + "stealing", + "OS", + "hatred", + "##lled", + "masters", + "violation", + "Rule", + "##nger", + "assuming", + "conquered", + "louder", + "robe", + "Beatles", + "legitimate", + "##vation", + "massacre", + "Rica", + "unsuccessfully", + "poets", + "##enberg", + "careers", + "doubled", + "premier", + "battalions", + "Dubai", + "Paper", + "Louisville", + "gestured", + "dressing", + "successive", + "mumbled", + "Vic", + "referee", + "pupil", + "##cated", + "##rre", + "ceremonies", + "picks", + "##IN", + "diplomat", + "alike", + "geographical", + "rays", + "##HA", + "##read", + "harbour", + "factories", + "pastor", + "playwright", + "Ultimate", + "nationalist", + "uniforms", + "obtaining", + "kit", + "Amber", + "##pling", + "screenwriter", + "ancestry", + "##cott", + "Fields", + "PR", + "Coleman", + "rat", + "Bavaria", + "squeeze", + "highlighted", + "Adult", + "reflecting", + "Mel", + "1824", + "bicycle", + "organizing", + "sided", + "Previously", + "Underground", + "Prof", + "athletics", + "coupled", + "mortal", + "Hampton", + "worthy", + "immune", + "Ava", + "##gun", + "encouraging", + "simplified", + "##ssa", + "##nte", + "##ann", + "Providence", + "entities", + "Pablo", + "Strong", + "Housing", + "##ista", + "##ators", + "kidnapped", + "mosque", + "Kirk", + "whispers", + "fruits", + "shattered", + "fossil", + "Empress", + "Johns", + "Webster", + "Thing", + "refusing", + "differently", + "specimen", + "Ha", + "##EN", + "##tina", + "##elle", + "##night", + "Horn", + "neighbourhood", + "Bolivia", + "##rth", + "genres", + "Pre", + "##vich", + "Amelia", + "swallow", + "Tribune", + "Forever", + "Psychology", + "Use", + "##bers", + "Gazette", + "ash", + "##usa", + "Monster", + "##cular", + "delegation", + "blowing", + "Oblast", + "retreated", + "automobile", + "##ex", + "profits", + "shirts", + "devil", + "Treasury", + "##backs", + "Drums", + "Ronnie", + "gameplay", + "expertise", + "Evening", + "resides", + "Caesar", + "unity", + "Crazy", + "linking", + "Vision", + "donations", + "Isabel", + "valve", + "Sue", + "WWE", + "logical", + "availability", + "fitting", + "revolt", + "##mill", + "Linux", + "taxi", + "Access", + "pollution", + "statues", + "Augustus", + "##pen", + "cello", + "##some", + "lacking", + "##ati", + "Gwen", + "##aka", + "##ovich", + "1821", + "Wow", + "initiatives", + "Uruguay", + "Cain", + "stroked", + "examine", + "##ī", + "mentor", + "moist", + "disorders", + "buttons", + "##tica", + "##anna", + "Species", + "Lynch", + "museums", + "scorer", + "Poor", + "eligibility", + "op", + "unveiled", + "cats", + "Title", + "wheat", + "critically", + "Syracuse", + "##osis", + "marketed", + "enhance", + "Ryder", + "##NG", + "##ull", + "##rna", + "embedded", + "throws", + "foods", + "happily", + "##ami", + "lesson", + "formats", + "punched", + "##rno", + "expressions", + "qualities", + "##sal", + "Gods", + "##lity", + "elect", + "wives", + "##lling", + "jungle", + "Toyota", + "reversed", + "Grammar", + "Cloud", + "Agnes", + "##ules", + "disputed", + "verses", + "Lucien", + "threshold", + "##rea", + "scanned", + "##bled", + "##dley", + "##lice", + "Kazakhstan", + "Gardner", + "Freeman", + "##rz", + "inspection", + "Rita", + "accommodation", + "advances", + "chill", + "Elliot", + "thriller", + "Constantinople", + "##mos", + "debris", + "whoever", + "1810", + "Santo", + "Carey", + "remnants", + "Guatemala", + "##irs", + "carriers", + "equations", + "mandatory", + "##WA", + "anxious", + "measurement", + "Summit", + "Terminal", + "Erin", + "##zes", + "LLC", + "##uo", + "glancing", + "sin", + "##₃", + "Downtown", + "flowering", + "Euro", + "Leigh", + "Lance", + "warn", + "decent", + "recommendations", + "##ote", + "Quartet", + "##rrell", + "Clarence", + "colleague", + "guarantee", + "230", + "Clayton", + "Beast", + "addresses", + "prospect", + "destroyer", + "vegetables", + "Leadership", + "fatal", + "prints", + "190", + "##makers", + "Hyde", + "persuaded", + "illustrations", + "Southampton", + "Joyce", + "beats", + "editors", + "mount", + "##grave", + "Malaysian", + "Bombay", + "endorsed", + "##sian", + "##bee", + "applying", + "Religion", + "nautical", + "bomber", + "Na", + "airfield", + "gravel", + "##rew", + "Cave", + "bye", + "dig", + "decree", + "burden", + "Election", + "Hawk", + "Fe", + "##iled", + "reunited", + "##tland", + "liver", + "Teams", + "Put", + "delegates", + "Ella", + "##fect", + "Cal", + "invention", + "Castro", + "bored", + "##kawa", + "##ail", + "Trinidad", + "NASCAR", + "pond", + "develops", + "##pton", + "expenses", + "Zoe", + "Released", + "##rf", + "organs", + "beta", + "parameters", + "Neill", + "##lene", + "lateral", + "Beat", + "blades", + "Either", + "##hale", + "Mitch", + "##ET", + "##vous", + "Rod", + "burnt", + "phones", + "Rising", + "##front", + "investigating", + "##dent", + "Stephanie", + "##keeper", + "screening", + "##uro", + "Swan", + "Sinclair", + "modes", + "bullets", + "Nigerian", + "melody", + "##ques", + "Rifle", + "##12", + "128", + "##jin", + "charm", + "Venus", + "##tian", + "fusion", + "advocated", + "visitor", + "pinned", + "genera", + "3000", + "Ferry", + "Solo", + "quantity", + "regained", + "platinum", + "shoots", + "narrowly", + "preceded", + "update", + "##ichi", + "equality", + "unaware", + "regiments", + "ally", + "##tos", + "transmitter", + "locks", + "Seeing", + "outlets", + "feast", + "reopened", + "##ows", + "struggles", + "Buddy", + "1826", + "bark", + "elegant", + "amused", + "Pretty", + "themed", + "schemes", + "Lisbon", + "Te", + "patted", + "terrorism", + "Mystery", + "##croft", + "##imo", + "Madagascar", + "Journey", + "dealer", + "contacted", + "##quez", + "ITV", + "vacation", + "Wong", + "Sacramento", + "organisms", + "##pts", + "balcony", + "coloured", + "sheer", + "defines", + "MC", + "abortion", + "forbidden", + "accredited", + "Newfoundland", + "tendency", + "entrepreneur", + "Benny", + "Tanzania", + "needing", + "finalist", + "mythology", + "weakened", + "gown", + "sentences", + "Guest", + "websites", + "Tibetan", + "UFC", + "voluntary", + "annoyed", + "Welcome", + "honestly", + "correspondence", + "geometry", + "Deutsche", + "Biology", + "Help", + "##aya", + "Lines", + "Hector", + "##ael", + "reluctant", + "##ages", + "wears", + "inquiry", + "##dell", + "Holocaust", + "Tourism", + "Wei", + "volcanic", + "##mates", + "Visual", + "sorts", + "neighborhoods", + "Running", + "apple", + "shy", + "Laws", + "bend", + "Northeast", + "feminist", + "Speedway", + "Murder", + "visa", + "stuffed", + "fangs", + "transmitted", + "fiscal", + "Ain", + "enlarged", + "##ndi", + "Cecil", + "Peterson", + "Benson", + "Bedford", + "acceptable", + "##CC", + "##wer", + "purely", + "triangle", + "foster", + "Alberto", + "educator", + "Highland", + "acute", + "LGBT", + "Tina", + "Mi", + "adventures", + "Davidson", + "Honda", + "translator", + "monk", + "enacted", + "summoned", + "##ional", + "collector", + "Genesis", + "Un", + "liner", + "Di", + "Statistical", + "##CS", + "filter", + "Knox", + "Religious", + "Stella", + "Estonian", + "Turn", + "##ots", + "primitive", + "parishes", + "##lles", + "complexity", + "autobiography", + "rigid", + "cannon", + "pursuing", + "exploring", + "##gram", + "##mme", + "freshman", + "caves", + "Expedition", + "Traditional", + "iTunes", + "certification", + "cooling", + "##ort", + "##gna", + "##IT", + "##lman", + "##VA", + "Motion", + "explosive", + "licence", + "boxer", + "shrine", + "loosely", + "Brigadier", + "Savage", + "Brett", + "MVP", + "heavier", + "##elli", + "##gged", + "Buddha", + "Easy", + "spells", + "fails", + "incredibly", + "Georg", + "stern", + "compatible", + "Perfect", + "applies", + "cognitive", + "excessive", + "nightmare", + "neighbor", + "Sicily", + "appealed", + "static", + "##₁", + "Aberdeen", + "##leigh", + "slipping", + "bride", + "##guard", + "Um", + "Clyde", + "1818", + "##gible", + "Hal", + "Frost", + "Sanders", + "interactive", + "Hour", + "##vor", + "hurting", + "bull", + "termed", + "shelf", + "capturing", + "##pace", + "rolls", + "113", + "##bor", + "Chilean", + "teaches", + "##rey", + "exam", + "shipped", + "Twin", + "borrowed", + "##lift", + "Shit", + "##hot", + "Lindsay", + "Below", + "Kiev", + "Lin", + "leased", + "##sto", + "Eli", + "Diane", + "Val", + "subtropical", + "shoe", + "Bolton", + "Dragons", + "##rification", + "Vatican", + "##pathy", + "Crisis", + "dramatically", + "talents", + "babies", + "##ores", + "surname", + "##AP", + "##cology", + "cubic", + "opted", + "Archer", + "sweep", + "tends", + "Karnataka", + "Judy", + "stint", + "Similar", + "##nut", + "explicitly", + "##nga", + "interact", + "Mae", + "portfolio", + "clinic", + "abbreviated", + "Counties", + "##iko", + "hearts", + "##ı", + "providers", + "screams", + "Individual", + "##etti", + "Monument", + "##iana", + "accessed", + "encounters", + "gasp", + "##rge", + "defunct", + "Avery", + "##rne", + "nobility", + "useless", + "Phase", + "Vince", + "senator", + "##FL", + "1813", + "surprisingly", + "##illo", + "##chin", + "Boyd", + "rumors", + "equity", + "Gone", + "Hearts", + "chassis", + "overnight", + "Trek", + "wrists", + "submit", + "civic", + "designers", + "##rity", + "prominence", + "decorative", + "derives", + "starter", + "##AF", + "wisdom", + "Powers", + "reluctantly", + "measurements", + "doctoral", + "Noel", + "Gideon", + "Baden", + "Cologne", + "lawn", + "Hawaiian", + "anthology", + "##rov", + "Raiders", + "embassy", + "Sterling", + "##pal", + "Telugu", + "troubled", + "##FC", + "##bian", + "fountain", + "observe", + "ore", + "##uru", + "##gence", + "spelling", + "Border", + "grinning", + "sketch", + "Benedict", + "Xbox", + "dialects", + "readily", + "immigrant", + "Constitutional", + "aided", + "nevertheless", + "SE", + "tragedy", + "##ager", + "##rden", + "Flash", + "##MP", + "Europa", + "emissions", + "##ield", + "panties", + "Beverly", + "Homer", + "curtain", + "##oto", + "toilet", + "Isn", + "Jerome", + "Chiefs", + "Hermann", + "supernatural", + "juice", + "integrity", + "Scots", + "auto", + "Patriots", + "Strategic", + "engaging", + "prosecution", + "cleaned", + "Byron", + "investments", + "adequate", + "vacuum", + "laughs", + "##inus", + "##nge", + "Usually", + "Roth", + "Cities", + "Brand", + "corpse", + "##ffy", + "Gas", + "rifles", + "Plains", + "sponsorship", + "Levi", + "tray", + "owed", + "della", + "commanders", + "##ead", + "tactical", + "##rion", + "García", + "harbor", + "discharge", + "##hausen", + "gentleman", + "endless", + "highways", + "##itarian", + "pleaded", + "##eta", + "archive", + "Midnight", + "exceptions", + "instances", + "Gibraltar", + "cart", + "##NS", + "Darren", + "Bonnie", + "##yle", + "##iva", + "OCLC", + "bra", + "Jess", + "##EA", + "consulting", + "Archives", + "Chance", + "distances", + "commissioner", + "##AR", + "LL", + "sailors", + "##sters", + "enthusiasm", + "Lang", + "##zia", + "Yugoslav", + "confirm", + "possibilities", + "Suffolk", + "##eman", + "banner", + "1822", + "Supporting", + "fingertips", + "civilization", + "##gos", + "technically", + "1827", + "Hastings", + "sidewalk", + "strained", + "monuments", + "Floyd", + "Chennai", + "Elvis", + "villagers", + "Cumberland", + "strode", + "albeit", + "Believe", + "planets", + "combining", + "Mohammad", + "container", + "##mouth", + "##tures", + "verb", + "BA", + "Tank", + "Midland", + "screened", + "Gang", + "Democracy", + "Helsinki", + "screens", + "thread", + "charitable", + "##version", + "swiftly", + "ma", + "rational", + "combine", + "##SS", + "##antly", + "dragging", + "Cliff", + "Tasmania", + "quest", + "professionally", + "##aj", + "rap", + "##lion", + "livestock", + "##hua", + "informal", + "specially", + "lonely", + "Matthews", + "Dictionary", + "1816", + "Observatory", + "correspondent", + "constitute", + "homeless", + "waving", + "appreciated", + "Analysis", + "Meeting", + "dagger", + "##AL", + "Gandhi", + "flank", + "Giant", + "Choir", + "##not", + "glimpse", + "toe", + "Writer", + "teasing", + "springs", + "##dt", + "Glory", + "healthcare", + "regulated", + "complaint", + "math", + "Publications", + "makers", + "##hips", + "cement", + "Need", + "apologize", + "disputes", + "finishes", + "Partners", + "boring", + "ups", + "gains", + "1793", + "Congressional", + "clergy", + "Folk", + "##made", + "##nza", + "Waters", + "stays", + "encoded", + "spider", + "betrayed", + "Applied", + "inception", + "##urt", + "##zzo", + "wards", + "bells", + "UCLA", + "Worth", + "bombers", + "Mo", + "trademark", + "Piper", + "##vel", + "incorporates", + "1801", + "##cial", + "dim", + "Twelve", + "##word", + "Appeals", + "tighter", + "spacecraft", + "##tine", + "coordinates", + "##iac", + "mistakes", + "Zach", + "laptop", + "Teresa", + "##llar", + "##yr", + "favored", + "Nora", + "sophisticated", + "Irving", + "hammer", + "División", + "corporations", + "niece", + "##rley", + "Patterson", + "UNESCO", + "trafficking", + "Ming", + "balanced", + "plaque", + "Latvia", + "broader", + "##owed", + "Save", + "confined", + "##vable", + "Dalton", + "tide", + "##right", + "##ural", + "##num", + "swords", + "caring", + "##eg", + "IX", + "Acting", + "paved", + "##moto", + "launching", + "Antoine", + "substantially", + "Pride", + "Philharmonic", + "grammar", + "Indoor", + "Ensemble", + "enabling", + "114", + "resided", + "Angelo", + "publicity", + "chaired", + "crawled", + "Maharashtra", + "Telegraph", + "lengthy", + "preference", + "differential", + "anonymous", + "Honey", + "##itation", + "wage", + "##iki", + "consecrated", + "Bryant", + "regulatory", + "Carr", + "##én", + "functioning", + "watches", + "##ú", + "shifts", + "diagnosis", + "Search", + "app", + "Peters", + "##SE", + "##cat", + "Andreas", + "honours", + "temper", + "counsel", + "Urdu", + "Anniversary", + "maritime", + "##uka", + "harmony", + "##unk", + "essence", + "Lorenzo", + "choked", + "Quarter", + "indie", + "##oll", + "loses", + "##prints", + "amendment", + "Adolf", + "scenario", + "similarities", + "##rade", + "##LC", + "technological", + "metric", + "Russians", + "thoroughly", + "##tead", + "cruiser", + "1806", + "##nier", + "1823", + "Teddy", + "##psy", + "au", + "progressed", + "exceptional", + "broadcaster", + "partnered", + "fitness", + "irregular", + "placement", + "mothers", + "unofficial", + "Garion", + "Johannes", + "1817", + "regain", + "Solar", + "publishes", + "Gates", + "Broken", + "thirds", + "conversations", + "dive", + "Raj", + "contributor", + "quantities", + "Worcester", + "governance", + "##flow", + "generating", + "pretending", + "Belarus", + "##voy", + "radius", + "skating", + "Marathon", + "1819", + "affection", + "undertook", + "##wright", + "los", + "##bro", + "locate", + "PS", + "excluded", + "recreation", + "tortured", + "jewelry", + "moaned", + "##logue", + "##cut", + "Complete", + "##rop", + "117", + "##II", + "plantation", + "whipped", + "slower", + "crater", + "##drome", + "Volunteer", + "attributes", + "celebrations", + "regards", + "Publishers", + "oath", + "utilized", + "Robbie", + "Giuseppe", + "fiber", + "indication", + "melted", + "archives", + "Damien", + "storey", + "affecting", + "identifying", + "dances", + "alumni", + "comparable", + "upgrade", + "rented", + "sprint", + "##kle", + "Marty", + "##lous", + "treating", + "railways", + "Lebanese", + "erupted", + "occupy", + "sympathy", + "Jude", + "Darling", + "Qatar", + "drainage", + "McCarthy", + "heel", + "Klein", + "computing", + "wireless", + "flip", + "Du", + "Bella", + "##ast", + "##ssen", + "narrator", + "mist", + "sings", + "alignment", + "121", + "2020", + "securing", + "##rail", + "Progress", + "missionaries", + "brutal", + "mercy", + "##shing", + "Hip", + "##ache", + "##olo", + "switching", + "##here", + "Malay", + "##ob", + "constituted", + "Mohammed", + "Often", + "standings", + "surge", + "teachings", + "ink", + "detached", + "systematic", + "Trial", + "Myanmar", + "##wo", + "offs", + "Reyes", + "decoration", + "translations", + "wherever", + "reviewer", + "speculation", + "Bangkok", + "terminated", + "##ester", + "beard", + "RCA", + "Aidan", + "Associated", + "Emerson", + "Charity", + "1803", + "generous", + "Dudley", + "ATP", + "##haven", + "prizes", + "toxic", + "gloves", + "##iles", + "##dos", + "Turning", + "myth", + "Parade", + "##building", + "Hits", + "##eva", + "teamed", + "Above", + "Duchess", + "Holt", + "##oth", + "Sub", + "Ace", + "atomic", + "inform", + "Ship", + "depend", + "Jun", + "##bes", + "Norwich", + "globe", + "Baroque", + "Christina", + "Cotton", + "Tunnel", + "kidding", + "Concerto", + "Brittany", + "tasted", + "phases", + "stems", + "angles", + "##TE", + "##nam", + "##40", + "charted", + "Alison", + "intensive", + "Willis", + "glory", + "##lit", + "Bergen", + "est", + "taller", + "##dicate", + "labeled", + "##ido", + "commentator", + "Warrior", + "Viscount", + "shortened", + "aisle", + "Aria", + "Spike", + "spectators", + "goodbye", + "overlooking", + "mammals", + "##lude", + "wholly", + "Barrett", + "##gus", + "accompany", + "seventy", + "employ", + "##mb", + "ambitious", + "beloved", + "basket", + "##mma", + "##lding", + "halted", + "descendant", + "pad", + "exclaimed", + "cloak", + "##pet", + "Strait", + "Bang", + "Aviv", + "sadness", + "##ffer", + "Donovan", + "1880s", + "agenda", + "swinging", + "##quin", + "jerk", + "Boat", + "##rist", + "nervously", + "Silence", + "Echo", + "shout", + "implies", + "##iser", + "##cking", + "Shiva", + "Weston", + "damages", + "##tist", + "effectiveness", + "Horace", + "cycling", + "Rey", + "ache", + "Photography", + "PDF", + "Dear", + "leans", + "Lea", + "##vision", + "booth", + "attained", + "disbelief", + "##eus", + "##ution", + "Hop", + "pension", + "toys", + "Eurovision", + "faithful", + "##heads", + "Andre", + "owe", + "default", + "Atlas", + "Megan", + "highlights", + "lovers", + "Constantine", + "Sixth", + "masses", + "##garh", + "emerge", + "Auto", + "Slovak", + "##oa", + "##vert", + "Superintendent", + "flicked", + "inventor", + "Chambers", + "Frankie", + "Romeo", + "pottery", + "companions", + "Rudolf", + "##liers", + "diary", + "Unless", + "tap", + "alter", + "Randall", + "##ddle", + "##eal", + "limitations", + "##boards", + "utterly", + "knelt", + "guaranteed", + "Cowboys", + "Islander", + "horns", + "##ike", + "Wendy", + "sexually", + "Smart", + "breasts", + "##cian", + "compromise", + "Duchy", + "AT", + "Galaxy", + "analog", + "Style", + "##aking", + "weighed", + "Nigel", + "optional", + "Czechoslovakia", + "practicing", + "Ham", + "##0s", + "feedback", + "batted", + "uprising", + "operative", + "applicable", + "criminals", + "classrooms", + "Somehow", + "##ode", + "##OM", + "Naomi", + "Winchester", + "##pping", + "Bart", + "Regina", + "competitor", + "Recorded", + "Yuan", + "Vera", + "lust", + "Confederation", + "##test", + "suck", + "1809", + "Lambert", + "175", + "Friend", + "##ppa", + "Slowly", + "##⁺", + "Wake", + "Dec", + "##aneous", + "chambers", + "Color", + "Gus", + "##site", + "Alternative", + "##world", + "Exeter", + "Omaha", + "celebrities", + "striker", + "210", + "dwarf", + "meals", + "Oriental", + "Pearson", + "financing", + "revenues", + "underwater", + "Steele", + "screw", + "Feeling", + "Mt", + "acids", + "badge", + "swore", + "theaters", + "Moving", + "admired", + "lung", + "knot", + "penalties", + "116", + "fork", + "##cribed", + "Afghan", + "outskirts", + "Cambodia", + "oval", + "wool", + "fossils", + "Ned", + "Countess", + "Darkness", + "delicious", + "##nica", + "Evelyn", + "Recordings", + "guidelines", + "##CP", + "Sandra", + "meantime", + "Antarctica", + "modeling", + "granddaughter", + "##rial", + "Roma", + "Seventh", + "Sunshine", + "Gabe", + "##nton", + "Shop", + "Turks", + "prolific", + "soup", + "parody", + "##nta", + "Judith", + "disciplines", + "resign", + "Companies", + "Libya", + "Jets", + "inserted", + "Mile", + "retrieve", + "filmmaker", + "##rand", + "realistic", + "unhappy", + "##30", + "sandstone", + "##nas", + "##lent", + "##ush", + "##rous", + "Brent", + "trash", + "Rescue", + "##unted", + "Autumn", + "disgust", + "flexible", + "infinite", + "sideways", + "##oss", + "##vik", + "trailing", + "disturbed", + "50th", + "Newark", + "posthumously", + "##rol", + "Schmidt", + "Josef", + "##eous", + "determining", + "menu", + "Pole", + "Anita", + "Luc", + "peaks", + "118", + "Yard", + "warrant", + "generic", + "deserted", + "Walking", + "stamp", + "tracked", + "##berger", + "paired", + "surveyed", + "sued", + "Rainbow", + "##isk", + "Carpenter", + "submarines", + "realization", + "touches", + "sweeping", + "Fritz", + "module", + "Whether", + "resembles", + "##form", + "##lop", + "unsure", + "hunters", + "Zagreb", + "unemployment", + "Senators", + "Georgetown", + "##onic", + "Barker", + "foul", + "commercials", + "Dresden", + "Words", + "collision", + "Carlton", + "Fashion", + "doubted", + "##ril", + "precision", + "MIT", + "Jacobs", + "mob", + "Monk", + "retaining", + "gotta", + "##rod", + "remake", + "Fast", + "chips", + "##pled", + "sufficiently", + "##lights", + "delivering", + "##enburg", + "Dancing", + "Barton", + "Officers", + "metals", + "##lake", + "religions", + "##ré", + "motivated", + "differs", + "dorsal", + "##birds", + "##rts", + "Priest", + "polished", + "##aling", + "Saxony", + "Wyatt", + "knockout", + "##hor", + "Lopez", + "RNA", + "##link", + "metallic", + "##kas", + "daylight", + "Montenegro", + "##lining", + "wrapping", + "resemble", + "Jam", + "Viking", + "uncertainty", + "angels", + "enables", + "##fy", + "Stuttgart", + "tricks", + "tattoo", + "127", + "wicked", + "asset", + "breach", + "##yman", + "MW", + "breaths", + "Jung", + "im", + "1798", + "noon", + "vowel", + "##qua", + "calmly", + "seasonal", + "chat", + "ingredients", + "cooled", + "Randolph", + "ensuring", + "##ib", + "##idal", + "flashing", + "1808", + "Macedonian", + "Cool", + "councils", + "##lick", + "advantages", + "Immediately", + "Madras", + "##cked", + "Pain", + "fancy", + "chronic", + "Malayalam", + "begged", + "##nese", + "Inner", + "feathers", + "##vey", + "Names", + "dedication", + "Sing", + "pan", + "Fischer", + "nurses", + "Sharp", + "inning", + "stamps", + "Meg", + "##ello", + "edged", + "motioned", + "Jacksonville", + "##ffle", + "##dic", + "##US", + "divide", + "garnered", + "Ranking", + "chasing", + "modifications", + "##oc", + "clever", + "midst", + "flushed", + "##DP", + "void", + "##sby", + "ambulance", + "beaches", + "groan", + "isolation", + "strengthen", + "prevention", + "##ffs", + "Scouts", + "reformed", + "geographic", + "squadrons", + "Fiona", + "Kai", + "Consequently", + "##uss", + "overtime", + "##yas", + "Fr", + "##BL", + "Papua", + "Mixed", + "glances", + "Haiti", + "Sporting", + "sandy", + "confronted", + "René", + "Tanner", + "1811", + "##IM", + "advisory", + "trim", + "##ibe", + "González", + "gambling", + "Jupiter", + "##ility", + "##owski", + "##nar", + "122", + "apology", + "teased", + "Pool", + "feminine", + "wicket", + "eagle", + "shiny", + "##lator", + "blend", + "peaking", + "nasty", + "nodding", + "fraction", + "tech", + "Noble", + "Kuwait", + "brushing", + "Italia", + "Canberra", + "duet", + "Johan", + "1805", + "Written", + "cameo", + "Stalin", + "pig", + "cord", + "##zio", + "Surely", + "SA", + "owing", + "holidays", + "123", + "Ranger", + "lighthouse", + "##ige", + "miners", + "1804", + "##ë", + "##gren", + "##ried", + "crashing", + "##atory", + "wartime", + "highlight", + "inclined", + "Torres", + "Tax", + "##zel", + "##oud", + "Own", + "##corn", + "Divine", + "EMI", + "Relief", + "Northwestern", + "ethics", + "BMW", + "click", + "plasma", + "Christie", + "coordinator", + "Shepherd", + "washing", + "cooked", + "##dio", + "##eat", + "Cerambycidae", + "algebra", + "Engine", + "costumes", + "Vampire", + "vault", + "submission", + "virtue", + "assumption", + "##rell", + "Toledo", + "##oting", + "##rva", + "crept", + "emphasized", + "##lton", + "##ood", + "Greeks", + "surgical", + "crest", + "Patrol", + "Beta", + "Tessa", + "##GS", + "pizza", + "traits", + "rats", + "Iris", + "spray", + "##GC", + "Lightning", + "binary", + "escapes", + "##take", + "Clary", + "crowds", + "##zong", + "hauled", + "maid", + "##fen", + "Manning", + "##yang", + "Nielsen", + "aesthetic", + "sympathetic", + "affiliation", + "soaked", + "Mozart", + "personalities", + "begging", + "##iga", + "clip", + "Raphael", + "yearly", + "Lima", + "abundant", + "##lm", + "1794", + "strips", + "Initiative", + "reporters", + "##vsky", + "consolidated", + "##itated", + "Civic", + "rankings", + "mandate", + "symbolic", + "##ively", + "1807", + "rental", + "duck", + "nave", + "complications", + "##nor", + "Irene", + "Nazis", + "haunted", + "scholarly", + "Pratt", + "Gran", + "Embassy", + "Wave", + "pity", + "genius", + "bats", + "canton", + "Tropical", + "marker", + "##cos", + "escorted", + "Climate", + "##posed", + "appreciation", + "freezing", + "puzzle", + "Internal", + "pools", + "Shawn", + "pathway", + "Daniels", + "Fitzgerald", + "extant", + "olive", + "Vanessa", + "marriages", + "cocked", + "##dging", + "prone", + "chemicals", + "doll", + "drawer", + "##HF", + "Stark", + "Property", + "##tai", + "flowed", + "Sheridan", + "##uated", + "Less", + "Omar", + "remarks", + "catalogue", + "Seymour", + "wreck", + "Carrie", + "##bby", + "Mercer", + "displaced", + "sovereignty", + "rip", + "Flynn", + "Archie", + "Quarterfinals", + "Hassan", + "##ards", + "vein", + "Osaka", + "pouring", + "wages", + "Romance", + "##cript", + "##phere", + "550", + "##eil", + "##stown", + "Documentary", + "ancestor", + "CNN", + "Panthers", + "publishers", + "Rise", + "##mu", + "biting", + "Bright", + "String", + "succeeding", + "119", + "loaned", + "Warwick", + "Sheikh", + "Von", + "Afterwards", + "Jax", + "Camden", + "helicopters", + "Hence", + "Laurel", + "##ddy", + "transaction", + "Corp", + "clause", + "##owing", + "##kel", + "Investment", + "cups", + "Lucia", + "Moss", + "Giles", + "chef", + "López", + "decisive", + "30th", + "distress", + "linguistic", + "surveys", + "Ready", + "maiden", + "Touch", + "frontier", + "incorporate", + "exotic", + "mollusk", + "Leopold", + "Ride", + "##wain", + "##ndo", + "teammates", + "tones", + "drift", + "ordering", + "Feb", + "Penny", + "Normandy", + "Present", + "Flag", + "pipes", + "##rro", + "delight", + "motto", + "Tibet", + "leap", + "Eliza", + "Produced", + "teenagers", + "sitcom", + "Try", + "Hansen", + "Cody", + "wandered", + "terrestrial", + "frog", + "scare", + "resisted", + "employers", + "coined", + "##DS", + "resistant", + "Fly", + "captive", + "dissolution", + "judged", + "associates", + "defining", + "##court", + "Hale", + "##mbo", + "raises", + "clusters", + "twelfth", + "##metric", + "Roads", + "##itude", + "satisfy", + "Android", + "Reds", + "Gloucester", + "Category", + "Valencia", + "Daemon", + "stabbed", + "Luna", + "Churches", + "Canton", + "##eller", + "Attack", + "Kashmir", + "annexed", + "grabs", + "asteroid", + "Hartford", + "recommendation", + "Rodriguez", + "handing", + "stressed", + "frequencies", + "delegate", + "Bones", + "Erie", + "Weber", + "Hands", + "Acts", + "millimetres", + "24th", + "Fat", + "Howe", + "casually", + "##SL", + "convent", + "1790", + "IF", + "##sity", + "1795", + "yelling", + "##ises", + "drain", + "addressing", + "amino", + "Marcel", + "Sylvia", + "Paramount", + "Gerard", + "Volleyball", + "butter", + "124", + "Albion", + "##GB", + "triggered", + "1792", + "folding", + "accepts", + "##ße", + "preparations", + "Wimbledon", + "dose", + "##grass", + "escaping", + "##tling", + "import", + "charging", + "##dation", + "280", + "Nolan", + "##fried", + "Calcutta", + "##pool", + "Cove", + "examining", + "minded", + "heartbeat", + "twisting", + "domains", + "bush", + "Tunisia", + "Purple", + "Leone", + "##code", + "evacuated", + "battlefield", + "tiger", + "Electrical", + "##ared", + "chased", + "##cre", + "cultivated", + "Jet", + "solved", + "shrug", + "ringing", + "Impact", + "##iant", + "kilometre", + "##log", + "commemorate", + "migrated", + "singular", + "designing", + "promptly", + "Higgins", + "##own", + "##aves", + "freshwater", + "Marketing", + "Payne", + "beg", + "locker", + "pray", + "implied", + "AAA", + "corrected", + "Trans", + "Europeans", + "Ashe", + "acknowledge", + "Introduction", + "##writer", + "##llen", + "Munster", + "auxiliary", + "growl", + "Hours", + "Poems", + "##AT", + "reduces", + "Plain", + "plague", + "canceled", + "detention", + "polite", + "necklace", + "Gustav", + "##gu", + "##lance", + "En", + "Angola", + "##bb", + "dwelling", + "##hea", + "5000", + "Qing", + "Dodgers", + "rim", + "##ored", + "##haus", + "spilled", + "Elisabeth", + "Viktor", + "backpack", + "1802", + "amended", + "##worthy", + "Phantom", + "##ctive", + "keeper", + "##loom", + "Vikings", + "##gua", + "employs", + "Tehran", + "specialty", + "##bate", + "Marx", + "Mirror", + "Jenna", + "rides", + "needle", + "prayers", + "clarinet", + "forewings", + "##walk", + "Midlands", + "convincing", + "advocacy", + "Cao", + "Birds", + "cycles", + "Clement", + "Gil", + "bubble", + "Maximum", + "humanitarian", + "Tan", + "cries", + "##SI", + "Parsons", + "Trio", + "offshore", + "Innovation", + "clutched", + "260", + "##mund", + "##duct", + "Prairie", + "relied", + "Falcon", + "##ste", + "Kolkata", + "Gill", + "Swift", + "Negro", + "Zoo", + "valleys", + "##OL", + "Opening", + "beams", + "MPs", + "outline", + "Bermuda", + "Personal", + "exceed", + "productive", + "##MT", + "republic", + "forum", + "##sty", + "tornado", + "Known", + "dipped", + "Edith", + "folks", + "mathematician", + "watershed", + "Ricardo", + "synthetic", + "##dication", + "deity", + "##₄", + "gaming", + "subjected", + "suspects", + "Foot", + "swollen", + "Motors", + "##tty", + "##ý", + "aloud", + "ceremonial", + "es", + "nuts", + "intend", + "Carlisle", + "tasked", + "hesitation", + "sponsors", + "unified", + "inmates", + "##ctions", + "##stan", + "tiles", + "jokes", + "whereby", + "outcomes", + "Lights", + "scary", + "Stoke", + "Portrait", + "Blind", + "sergeant", + "violations", + "cultivation", + "fuselage", + "Mister", + "Alfonso", + "candy", + "sticks", + "teen", + "agony", + "Enough", + "invite", + "Perkins", + "Appeal", + "mapping", + "undergo", + "Glacier", + "Melanie", + "affects", + "incomplete", + "##dd", + "Colombian", + "##nate", + "CBC", + "purchasing", + "bypass", + "Drug", + "Electronics", + "Frontier", + "Coventry", + "##aan", + "autonomy", + "scrambled", + "Recent", + "bounced", + "cow", + "experiencing", + "Rouge", + "cuisine", + "Elite", + "disability", + "Ji", + "inheritance", + "wildly", + "Into", + "##wig", + "confrontation", + "Wheeler", + "shiver", + "Performing", + "aligned", + "consequently", + "Alexis", + "Sin", + "woodland", + "executives", + "Stevenson", + "Ferrari", + "inevitable", + "##cist", + "##dha", + "##base", + "Corner", + "comeback", + "León", + "##eck", + "##urus", + "MacDonald", + "pioneering", + "breakdown", + "landscapes", + "Veterans", + "Rican", + "Theological", + "stirred", + "participant", + "Credit", + "Hyderabad", + "snails", + "Claudia", + "##ocene", + "compliance", + "##MI", + "Flags", + "Middlesex", + "storms", + "winding", + "asserted", + "er", + "##ault", + "##kal", + "waking", + "##rates", + "abbey", + "Augusta", + "tooth", + "trustees", + "Commodore", + "##uded", + "Cunningham", + "NC", + "Witch", + "marching", + "Sword", + "Same", + "spiral", + "Harley", + "##ahan", + "Zack", + "Audio", + "1890s", + "##fit", + "Simmons", + "Kara", + "Veronica", + "negotiated", + "Speaking", + "FIBA", + "Conservatory", + "formations", + "constituencies", + "explicit", + "facial", + "eleventh", + "##ilt", + "villain", + "##dog", + "##case", + "##hol", + "armored", + "tin", + "hairs", + "##umi", + "##rai", + "mattress", + "Angus", + "cease", + "verbal", + "Recreation", + "savings", + "Aurora", + "peers", + "Monastery", + "Airways", + "drowned", + "additions", + "downstream", + "sticking", + "Shi", + "mice", + "skiing", + "##CD", + "Raw", + "Riverside", + "warming", + "hooked", + "boost", + "memorable", + "posed", + "treatments", + "320", + "##dai", + "celebrating", + "blink", + "helpless", + "circa", + "Flowers", + "PM", + "uncommon", + "Oct", + "Hawks", + "overwhelmed", + "Sparhawk", + "repaired", + "Mercy", + "pose", + "counterpart", + "compare", + "survives", + "##½", + "##eum", + "coordinate", + "Lil", + "grandchildren", + "notorious", + "Yi", + "Judaism", + "Juliet", + "accusations", + "1789", + "floated", + "marathon", + "roar", + "fortified", + "reunion", + "145", + "Nov", + "Paula", + "##fare", + "##toria", + "tearing", + "Cedar", + "disappearance", + "Si", + "gifted", + "scar", + "270", + "PBS", + "Technologies", + "Marvin", + "650", + "roller", + "cupped", + "negotiate", + "##erman", + "passport", + "tram", + "miracle", + "styled", + "##tier", + "necessity", + "Des", + "rehabilitation", + "Lara", + "USD", + "psychic", + "wipe", + "##lem", + "mistaken", + "##lov", + "charming", + "Rider", + "pageant", + "dynamics", + "Cassidy", + "##icus", + "defenses", + "##tadt", + "##vant", + "aging", + "##inal", + "declare", + "mistress", + "supervised", + "##alis", + "##rest", + "Ashton", + "submerged", + "sack", + "Dodge", + "grocery", + "ramp", + "Teacher", + "lineage", + "imagery", + "arrange", + "inscriptions", + "Organisation", + "Siege", + "combines", + "pounded", + "Fleming", + "legends", + "columnist", + "Apostolic", + "prose", + "insight", + "Arabian", + "expired", + "##uses", + "##nos", + "Alone", + "elbows", + "##asis", + "##adi", + "##combe", + "Step", + "Waterloo", + "Alternate", + "interval", + "Sonny", + "plains", + "Goals", + "incorporating", + "recruit", + "adjoining", + "Cheshire", + "excluding", + "marrying", + "ducked", + "Cherokee", + "par", + "##inate", + "hiking", + "Coal", + "##bow", + "natives", + "ribbon", + "Allies", + "con", + "descriptions", + "positively", + "##lal", + "defendant", + "22nd", + "Vivian", + "##beat", + "Weather", + "possessions", + "Date", + "sweetheart", + "inability", + "Salisbury", + "adviser", + "ideology", + "Nordic", + "##eu", + "Cubs", + "IP", + "Administrative", + "##nick", + "facto", + "liberation", + "Burnett", + "Javier", + "fashioned", + "Electoral", + "Turin", + "theft", + "unanimous", + "Per", + "1799", + "Clan", + "Hawkins", + "Teachers", + "##wes", + "Cameroon", + "Parkway", + "##gment", + "demolition", + "atoms", + "nucleus", + "##thi", + "recovering", + "##yte", + "##vice", + "lifts", + "Must", + "deposit", + "Hancock", + "Semi", + "darkened", + "Declaration", + "moan", + "muscular", + "Myers", + "attractions", + "sauce", + "simulation", + "##weed", + "Alps", + "barriers", + "##baum", + "Barack", + "galleries", + "Min", + "holders", + "Greenwich", + "donation", + "Everybody", + "Wolfgang", + "sandwich", + "Kendra", + "Collegiate", + "casino", + "Slavic", + "ensuing", + "Porto", + "##grapher", + "Jesuit", + "suppressed", + "tires", + "Ibrahim", + "protesters", + "Ibn", + "Amos", + "1796", + "phenomena", + "Hayden", + "Paraguay", + "Squad", + "Reilly", + "complement", + "aluminum", + "##eers", + "doubts", + "decay", + "demise", + "Practice", + "patience", + "fireplace", + "transparent", + "monarchy", + "##person", + "Rodney", + "mattered", + "rotating", + "Clifford", + "disposal", + "Standards", + "paced", + "##llie", + "arise", + "tallest", + "tug", + "documentation", + "node", + "freeway", + "Nikolai", + "##cite", + "clicked", + "imaging", + "Lorraine", + "Tactical", + "Different", + "Regular", + "Holding", + "165", + "Pilot", + "guarded", + "##polis", + "Classics", + "Mongolia", + "Brock", + "monarch", + "cellular", + "receptors", + "Mini", + "Chandler", + "financed", + "financially", + "Lives", + "erection", + "Fuller", + "unnamed", + "Kannada", + "cc", + "passive", + "plateau", + "##arity", + "freak", + "##rde", + "retrieved", + "transactions", + "##sus", + "23rd", + "swimmer", + "beef", + "fulfill", + "Arlington", + "offspring", + "reasoning", + "Rhys", + "saves", + "pseudonym", + "centimetres", + "shivered", + "shuddered", + "##ME", + "Feel", + "##otic", + "professors", + "Blackburn", + "##eng", + "##life", + "##haw", + "interred", + "lodge", + "fragile", + "Della", + "guardian", + "##bbled", + "catalog", + "clad", + "observer", + "tract", + "declaring", + "##headed", + "Lok", + "dean", + "Isabelle", + "1776", + "irrigation", + "spectacular", + "shuttle", + "mastering", + "##aro", + "Nathaniel", + "Retired", + "##lves", + "Brennan", + "##kha", + "dick", + "##dated", + "##hler", + "Rookie", + "leapt", + "televised", + "weekends", + "Baghdad", + "Yemen", + "##fo", + "factions", + "ion", + "Lab", + "mortality", + "passionate", + "Hammer", + "encompasses", + "confluence", + "demonstrations", + "Ki", + "derivative", + "soils", + "##unch", + "Ranch", + "Universities", + "conventions", + "outright", + "aiming", + "hierarchy", + "reside", + "illusion", + "graves", + "rituals", + "126", + "Antwerp", + "Dover", + "##ema", + "campuses", + "Hobart", + "lifelong", + "aliens", + "##vity", + "Memory", + "coordination", + "alphabet", + "##mina", + "Titans", + "pushes", + "Flanders", + "##holder", + "Normal", + "excellence", + "capped", + "profound", + "Taipei", + "portrayal", + "sparked", + "scratch", + "se", + "##eas", + "##hir", + "Mackenzie", + "##cation", + "Neo", + "Shin", + "##lined", + "magnificent", + "poster", + "batsman", + "##rgent", + "persuade", + "##ement", + "Icelandic", + "miserable", + "collegiate", + "Feature", + "geography", + "##mura", + "Comic", + "Circus", + "processor", + "barracks", + "Tale", + "##11", + "Bulls", + "##rap", + "strengthened", + "##bell", + "injection", + "miniature", + "broadly", + "Letter", + "fare", + "hostage", + "traders", + "##nium", + "##mere", + "Fortune", + "Rivera", + "Lu", + "triumph", + "Browns", + "Bangalore", + "cooperative", + "Basel", + "announcing", + "Sawyer", + "##him", + "##cco", + "##kara", + "darted", + "##AD", + "##nova", + "sucking", + "##position", + "perimeter", + "flung", + "Holdings", + "##NP", + "Basque", + "sketches", + "Augustine", + "Silk", + "Elijah", + "analyst", + "armour", + "riots", + "acquiring", + "ghosts", + "##ems", + "132", + "Pioneer", + "Colleges", + "Simone", + "Economy", + "Author", + "semester", + "Soldier", + "il", + "##unting", + "##bid", + "freaking", + "Vista", + "tumor", + "##bat", + "murderer", + "##eda", + "unreleased", + "##grove", + "##sser", + "##té", + "edit", + "statute", + "sovereign", + "##gawa", + "Killer", + "stares", + "Fury", + "comply", + "##lord", + "##nant", + "barrels", + "Andhra", + "Maple", + "generator", + "mascot", + "unusually", + "eds", + "##ante", + "##runner", + "rod", + "##tles", + "Historically", + "Jennings", + "dumped", + "Established", + "resemblance", + "##lium", + "##cise", + "##body", + "##voke", + "Lydia", + "##hou", + "##iring", + "nonetheless", + "1797", + "corrupt", + "patrons", + "physicist", + "sneak", + "Livingston", + "Citizens", + "Architects", + "Werner", + "trends", + "Melody", + "eighty", + "markings", + "brakes", + "##titled", + "oversaw", + "processed", + "mock", + "Midwest", + "intervals", + "##EF", + "stretches", + "werewolf", + "##MG", + "Pack", + "controller", + "##dition", + "Honours", + "cane", + "Griffith", + "vague", + "repertoire", + "Courtney", + "orgasm", + "Abdullah", + "dominance", + "occupies", + "Ya", + "introduces", + "Lester", + "instinct", + "collaborative", + "Indigenous", + "refusal", + "##rank", + "outlet", + "debts", + "spear", + "155", + "##keeping", + "##ulu", + "Catalan", + "##osh", + "tensions", + "##OT", + "bred", + "crude", + "Dunn", + "abdomen", + "accurately", + "##fu", + "##lough", + "accidents", + "Row", + "Audrey", + "rude", + "Getting", + "promotes", + "replies", + "Paolo", + "merge", + "##nock", + "trans", + "Evangelical", + "automated", + "Canon", + "##wear", + "##ggy", + "##gma", + "Broncos", + "foolish", + "icy", + "Voices", + "knives", + "Aside", + "dreamed", + "generals", + "molecule", + "AG", + "rejection", + "insufficient", + "##nagar", + "deposited", + "sacked", + "Landing", + "arches", + "helpful", + "devotion", + "intake", + "Flower", + "PGA", + "dragons", + "evolutionary", + "##mail", + "330", + "GM", + "tissues", + "##tree", + "arcade", + "composite", + "lid", + "Across", + "implications", + "lacks", + "theological", + "assessed", + "concentrations", + "Den", + "##mans", + "##ulous", + "Fu", + "homeland", + "##stream", + "Harriet", + "ecclesiastical", + "troop", + "ecological", + "winked", + "##xed", + "eighteenth", + "Casino", + "specializing", + "##sworth", + "unlocked", + "supreme", + "devastated", + "snatched", + "trauma", + "GDP", + "Nord", + "saddle", + "Wes", + "convenient", + "competes", + "##nu", + "##iss", + "Marian", + "subway", + "##rri", + "successes", + "umbrella", + "##far", + "##ually", + "Dundee", + "##cence", + "spark", + "##rix", + "##я", + "Quality", + "Geological", + "cockpit", + "rpm", + "Cam", + "Bucharest", + "riot", + "##PM", + "Leah", + "##dad", + "##pose", + "Ka", + "m³", + "Bundesliga", + "Wolfe", + "grim", + "textile", + "quartet", + "expressing", + "fantastic", + "destroyers", + "eternal", + "picnic", + "##oro", + "contractor", + "1775", + "spanning", + "declining", + "##cating", + "Lowe", + "Sutherland", + "Emirates", + "downward", + "nineteen", + "violently", + "scout", + "viral", + "melting", + "enterprises", + "##cer", + "Crosby", + "Jubilee", + "antenna", + "urgent", + "Rory", + "##uin", + "##sure", + "wandering", + "##gler", + "##vent", + "Suzuki", + "Lifetime", + "Dirty", + "occupying", + "##quent", + "Disc", + "Guru", + "mound", + "Lennon", + "Humanities", + "listeners", + "Walton", + "uh", + "Braves", + "Bologna", + "##bis", + "##gra", + "Dwight", + "crawl", + "flags", + "memoir", + "Thorne", + "Archdiocese", + "dairy", + "##uz", + "##tery", + "roared", + "adjust", + "patches", + "inn", + "Knowing", + "##bbed", + "##zan", + "scan", + "Papa", + "precipitation", + "angrily", + "passages", + "postal", + "Phi", + "embraced", + "blacks", + "economist", + "triangular", + "Sen", + "shooter", + "punished", + "Millennium", + "Swimming", + "confessed", + "Aston", + "defeats", + "Era", + "cousins", + "Williamson", + "##rer", + "daytime", + "dumb", + "##rek", + "underway", + "specification", + "Buchanan", + "prayed", + "concealed", + "activation", + "##issa", + "canon", + "awesome", + "Starr", + "plural", + "summers", + "##fields", + "Slam", + "unnecessary", + "1791", + "resume", + "trilogy", + "compression", + "##rough", + "selective", + "dignity", + "Yan", + "##xton", + "immense", + "##yun", + "lone", + "seeded", + "hiatus", + "lightweight", + "summary", + "Yo", + "approve", + "Galway", + "rejoined", + "Elise", + "garbage", + "burns", + "speeches", + "129", + "Honduras", + "##liness", + "inventory", + "jersey", + "FK", + "assure", + "slumped", + "Lionel", + "Suite", + "##sbury", + "Lena", + "continuation", + "##AN", + "brightly", + "##nti", + "GT", + "Knowledge", + "##park", + "##lius", + "lethal", + "##tribution", + "##sions", + "Certificate", + "Mara", + "##lby", + "algorithms", + "Jade", + "blows", + "pirates", + "fleeing", + "wheelchair", + "Stein", + "sophomore", + "Alt", + "Territorial", + "diploma", + "snakes", + "##olic", + "##tham", + "Tiffany", + "Pius", + "flush", + "urging", + "Hanover", + "Reich", + "##olate", + "Unity", + "Pike", + "collectively", + "Theme", + "ballad", + "kindergarten", + "rocked", + "zoo", + "##page", + "whip", + "Rodríguez", + "strokes", + "checks", + "Becky", + "Stern", + "upstream", + "##uta", + "Silent", + "volunteered", + "Sigma", + "##ingen", + "##tract", + "##ede", + "Gujarat", + "screwed", + "entertaining", + "##action", + "##ryn", + "defenders", + "innocence", + "lesbian", + "que", + "Richie", + "nodes", + "Lie", + "juvenile", + "Jakarta", + "safer", + "confront", + "Bert", + "breakthrough", + "gospel", + "Cable", + "##zie", + "institutional", + "Archive", + "brake", + "liquor", + "feeds", + "##iate", + "chancellor", + "Encyclopedia", + "Animation", + "scanning", + "teens", + "##mother", + "Core", + "Rear", + "Wine", + "##flower", + "reactor", + "Ave", + "cardinal", + "sodium", + "strands", + "Olivier", + "crouched", + "Vaughan", + "Sammy", + "Image", + "scars", + "Emmanuel", + "flour", + "bias", + "nipple", + "revelation", + "##ucci", + "Denny", + "##ssy", + "Form", + "Runners", + "admits", + "Rama", + "violated", + "Burmese", + "feud", + "underwear", + "Mohamed", + "Named", + "swift", + "statewide", + "Door", + "Recently", + "comparing", + "Hundred", + "##idge", + "##nity", + "##rds", + "Rally", + "Reginald", + "Auburn", + "solving", + "waitress", + "Treasurer", + "##ilization", + "Halloween", + "Ministers", + "Boss", + "Shut", + "##listic", + "Rahman", + "demonstrating", + "##pies", + "Gaza", + "Yuri", + "installations", + "Math", + "schooling", + "##bble", + "Bronx", + "exiled", + "gasoline", + "133", + "bundle", + "humid", + "FCC", + "proportional", + "relate", + "VFL", + "##dez", + "continuity", + "##cene", + "syndicated", + "atmospheric", + "arrows", + "Wanderers", + "reinforcements", + "Willow", + "Lexington", + "Rotten", + "##yon", + "discovering", + "Serena", + "portable", + "##lysis", + "targeting", + "£1", + "Goodman", + "Steam", + "sensors", + "detachment", + "Malik", + "##erie", + "attitudes", + "Goes", + "Kendall", + "Read", + "Sleep", + "beans", + "Nikki", + "modification", + "Jeanne", + "knuckles", + "Eleven", + "##iously", + "Gross", + "Jaime", + "dioxide", + "moisture", + "Stones", + "UCI", + "displacement", + "Metacritic", + "Jury", + "lace", + "rendering", + "elephant", + "Sergei", + "##quire", + "GP", + "Abbott", + "##type", + "projection", + "Mouse", + "Bishops", + "whispering", + "Kathleen", + "Rams", + "##jar", + "whites", + "##oran", + "assess", + "dispatched", + "##hire", + "kin", + "##mir", + "Nursing", + "advocates", + "tremendous", + "sweater", + "assisting", + "##bil", + "Farmer", + "prominently", + "reddish", + "Hague", + "cyclone", + "##SD", + "Sage", + "Lawson", + "Sanctuary", + "discharged", + "retains", + "##ube", + "shotgun", + "wilderness", + "Reformed", + "similarity", + "Entry", + "Watts", + "Bahá", + "Quest", + "Looks", + "visions", + "Reservoir", + "Arabs", + "curls", + "Blu", + "dripping", + "accomplish", + "Verlag", + "drill", + "sensor", + "Dillon", + "physicians", + "smashed", + "##dir", + "painters", + "Renault", + "straw", + "fading", + "Directorate", + "lounge", + "commissions", + "Brain", + "##graph", + "neo", + "##urg", + "plug", + "coordinated", + "##houses", + "Critical", + "lamps", + "illustrator", + "Returning", + "erosion", + "Crow", + "##ciation", + "blessing", + "Thought", + "Wife", + "medalist", + "synthesizer", + "Pam", + "Thornton", + "Esther", + "HBO", + "fond", + "Associates", + "##raz", + "pirate", + "permits", + "Wide", + "tire", + "##PC", + "Ernie", + "Nassau", + "transferring", + "RFC", + "##ntly", + "um", + "spit", + "AS", + "##mps", + "Mining", + "polar", + "villa", + "anchored", + "##zzi", + "embarrassment", + "relates", + "##ă", + "Rupert", + "counterparts", + "131", + "Baxter", + "##18", + "Igor", + "recognizes", + "Clive", + "##hane", + "##eries", + "##ibly", + "occurrence", + "##scope", + "fin", + "colorful", + "Rapids", + "banker", + "tile", + "##rative", + "##dus", + "delays", + "destinations", + "##llis", + "Pond", + "Dane", + "grandparents", + "rewarded", + "socially", + "motorway", + "##hof", + "##lying", + "##human", + "modeled", + "Dayton", + "Forward", + "conscience", + "Sharma", + "whistle", + "Mayer", + "Sasha", + "##pical", + "circuits", + "Zhou", + "##ça", + "Latvian", + "finalists", + "predators", + "Lafayette", + "closes", + "obligations", + "Resolution", + "##vier", + "Trustees", + "reminiscent", + "##hos", + "Highlands", + "Protected", + "asylum", + "evacuation", + "##acy", + "Chevrolet", + "confession", + "Somalia", + "emergence", + "separating", + "##rica", + "alright", + "calcium", + "Laurent", + "Welfare", + "Leonardo", + "ashes", + "dental", + "Deal", + "minerals", + "##lump", + "##mount", + "accounted", + "staggered", + "slogan", + "photographic", + "builder", + "##imes", + "##raft", + "tragic", + "144", + "SEC", + "Hit", + "tailed", + "##ples", + "##rring", + "##rson", + "ethical", + "wrestlers", + "concludes", + "lunar", + "##ept", + "nitrogen", + "Aid", + "cyclist", + "quarterfinals", + "##ه", + "harvest", + "##hem", + "Pasha", + "IL", + "##mis", + "continually", + "##forth", + "Intel", + "bucket", + "##ended", + "witches", + "pretended", + "dresses", + "viewer", + "peculiar", + "lowering", + "volcano", + "Marilyn", + "Qualifier", + "clung", + "##sher", + "Cut", + "modules", + "Bowie", + "##lded", + "onset", + "transcription", + "residences", + "##pie", + "##itor", + "scrapped", + "##bic", + "Monaco", + "Mayo", + "eternity", + "Strike", + "uncovered", + "skeleton", + "##wicz", + "Isles", + "bug", + "Promoted", + "##rush", + "Mechanical", + "XII", + "##ivo", + "gripping", + "stubborn", + "velvet", + "TD", + "decommissioned", + "operas", + "spatial", + "unstable", + "Congressman", + "wasted", + "##aga", + "##ume", + "advertisements", + "##nya", + "obliged", + "Cannes", + "Conway", + "bricks", + "##gnant", + "##mity", + "##uise", + "jumps", + "Clear", + "##cine", + "##sche", + "chord", + "utter", + "Su", + "podium", + "spokesman", + "Royce", + "assassin", + "confirmation", + "licensing", + "liberty", + "##rata", + "Geographic", + "individually", + "detained", + "##ffe", + "Saturn", + "crushing", + "airplane", + "bushes", + "knights", + "##PD", + "Lilly", + "hurts", + "unexpectedly", + "Conservatives", + "pumping", + "Forty", + "candle", + "Pérez", + "peasants", + "supplement", + "Sundays", + "##ggs", + "##rries", + "risen", + "enthusiastic", + "corresponds", + "pending", + "##IF", + "Owens", + "floods", + "Painter", + "inflation", + "presumed", + "inscribed", + "Chamberlain", + "bizarre", + "1200", + "liability", + "reacted", + "tub", + "Legacy", + "##eds", + "##pted", + "shone", + "##litz", + "##NC", + "Tiny", + "genome", + "bays", + "Eduardo", + "robbery", + "stall", + "hatch", + "Depot", + "Variety", + "Flora", + "reprinted", + "trembled", + "outlined", + "CR", + "Theresa", + "spans", + "##plication", + "Jensen", + "##eering", + "posting", + "##rky", + "pays", + "##ost", + "Marcos", + "fortifications", + "inferior", + "##ential", + "Devi", + "despair", + "Talbot", + "##chus", + "updates", + "ego", + "Booth", + "Darius", + "tops", + "##lau", + "Scene", + "##DC", + "Harlem", + "Trey", + "Generally", + "candles", + "##α", + "Neville", + "Admiralty", + "##hong", + "iconic", + "victorious", + "1600", + "Rowan", + "abundance", + "miniseries", + "clutching", + "sanctioned", + "##words", + "obscure", + "##ision", + "##rle", + "##EM", + "disappearing", + "Resort", + "Obviously", + "##eb", + "exceeded", + "1870s", + "Adults", + "##cts", + "Cry", + "Kerr", + "ragged", + "selfish", + "##lson", + "circled", + "pillars", + "galaxy", + "##asco", + "##mental", + "rebuild", + "caution", + "Resistance", + "Start", + "bind", + "splitting", + "Baba", + "Hogan", + "ps", + "partnerships", + "slam", + "Peggy", + "courthouse", + "##OD", + "organizational", + "packages", + "Angie", + "##nds", + "possesses", + "##rp", + "Expressway", + "Gould", + "Terror", + "Him", + "Geoff", + "nobles", + "##ope", + "shark", + "##nh", + "identifies", + "##oor", + "testified", + "Playing", + "##ump", + "##isa", + "stool", + "Idol", + "##pice", + "##tana", + "Byrne", + "Gerry", + "grunted", + "26th", + "observing", + "habits", + "privilege", + "immortal", + "wagons", + "##thy", + "dot", + "Bring", + "##lian", + "##witz", + "newest", + "##uga", + "constraints", + "Screen", + "Issue", + "##RNA", + "##vil", + "reminder", + "##gles", + "addiction", + "piercing", + "stunning", + "var", + "##rita", + "Signal", + "accumulated", + "##wide", + "float", + "devastating", + "viable", + "cartoons", + "Uttar", + "flared", + "##encies", + "Theology", + "patents", + "##bahn", + "privileges", + "##ava", + "##CO", + "137", + "##oped", + "##NT", + "orchestral", + "medication", + "225", + "erect", + "Nadia", + "École", + "fried", + "Sales", + "scripts", + "##rease", + "airs", + "Cage", + "inadequate", + "structured", + "countless", + "Avengers", + "Kathy", + "disguise", + "mirrors", + "Investigation", + "reservation", + "##nson", + "Legends", + "humorous", + "Mona", + "decorations", + "attachment", + "Via", + "motivation", + "Browne", + "strangers", + "##ński", + "Shadows", + "Twins", + "##pressed", + "Alma", + "Nominated", + "##ott", + "Sergio", + "canopy", + "152", + "Semifinals", + "devised", + "##irk", + "upwards", + "Traffic", + "Goddess", + "Move", + "beetles", + "138", + "spat", + "##anne", + "holdings", + "##SP", + "tangled", + "Whilst", + "Fowler", + "anthem", + "##ING", + "##ogy", + "snarled", + "moonlight", + "songwriting", + "tolerance", + "Worlds", + "exams", + "##pia", + "notices", + "sensitivity", + "poetic", + "Stephens", + "Boone", + "insect", + "reconstructed", + "Fresh", + "27th", + "balloon", + "##ables", + "Brendan", + "mug", + "##gee", + "1780", + "apex", + "exports", + "slides", + "Lahore", + "hiring", + "Shell", + "electorate", + "sexuality", + "poker", + "nonprofit", + "##imate", + "cone", + "##uce", + "Okinawa", + "superintendent", + "##HC", + "referenced", + "turret", + "Sprint", + "Citizen", + "equilibrium", + "Stafford", + "curb", + "Driver", + "Valerie", + "##rona", + "aching", + "impacts", + "##bol", + "observers", + "Downs", + "Shri", + "##uth", + "airports", + "##uda", + "assignments", + "curtains", + "solitary", + "icon", + "patrols", + "substances", + "Jasper", + "mountainous", + "Published", + "ached", + "##ingly", + "announce", + "dove", + "damaging", + "##tism", + "Primera", + "Dexter", + "limiting", + "batch", + "##uli", + "undergoing", + "refugee", + "Ye", + "admiral", + "pavement", + "##WR", + "##reed", + "pipeline", + "desires", + "Ramsey", + "Sheila", + "thickness", + "Brotherhood", + "Tea", + "instituted", + "Belt", + "Break", + "plots", + "##ais", + "masculine", + "##where", + "Theo", + "##aged", + "##mined", + "Experience", + "scratched", + "Ethiopian", + "Teaching", + "##nov", + "Aiden", + "Abe", + "Samoa", + "conditioning", + "##mous", + "Otherwise", + "fade", + "Jenks", + "##encing", + "Nat", + "##lain", + "Anyone", + "##kis", + "smirk", + "Riding", + "##nny", + "Bavarian", + "blessed", + "potatoes", + "Hook", + "##wise", + "likewise", + "hardened", + "Merry", + "amid", + "persecution", + "##sten", + "Elections", + "Hoffman", + "Pitt", + "##vering", + "distraction", + "exploitation", + "infamous", + "quote", + "averaging", + "healed", + "Rhythm", + "Germanic", + "Mormon", + "illuminated", + "guides", + "##ische", + "interfere", + "##ilized", + "rector", + "perennial", + "##ival", + "Everett", + "courtesy", + "##nham", + "Kirby", + "Mk", + "##vic", + "Medieval", + "##tale", + "Luigi", + "limp", + "##diction", + "Alive", + "greeting", + "shove", + "##force", + "##fly", + "Jasmine", + "Bend", + "Capt", + "Suzanne", + "ditch", + "134", + "##nning", + "Host", + "fathers", + "rebuilding", + "Vocal", + "wires", + "##manship", + "tan", + "Factor", + "fixture", + "##LS", + "Māori", + "Plate", + "pyramid", + "##umble", + "slap", + "Schneider", + "yell", + "##ulture", + "##tional", + "Goodbye", + "sore", + "##pher", + "depressed", + "##dox", + "pitching", + "Find", + "Lotus", + "##wang", + "strand", + "Teen", + "debates", + "prevalent", + "##bilities", + "exposing", + "hears", + "billed", + "##rse", + "reorganized", + "compelled", + "disturbing", + "displaying", + "##tock", + "Clinical", + "emotionally", + "##iah", + "Derbyshire", + "grouped", + "##quel", + "Bahrain", + "Journalism", + "IN", + "persistent", + "blankets", + "Crane", + "camping", + "Direct", + "proving", + "Lola", + "##dding", + "Corporate", + "birthplace", + "##boats", + "##ender", + "Figure", + "dared", + "Assam", + "precursor", + "##nched", + "Tribe", + "Restoration", + "slate", + "Meyrick", + "hunted", + "stroking", + "Earlier", + "Kind", + "polls", + "appeals", + "monetary", + "##reate", + "Kira", + "Langdon", + "explores", + "GPS", + "extensions", + "squares", + "Results", + "draped", + "announcer", + "merit", + "##ennial", + "##tral", + "##roved", + "##cion", + "robots", + "supervisor", + "snorted", + "##group", + "Cannon", + "procession", + "monkey", + "freeze", + "sleeves", + "Nile", + "verdict", + "ropes", + "firearms", + "extraction", + "tensed", + "EC", + "Saunders", + "##tches", + "diamonds", + "Marriage", + "##amble", + "curling", + "Amazing", + "##haling", + "unrelated", + "##roads", + "Daughter", + "cum", + "discarded", + "kidney", + "cliffs", + "forested", + "Candy", + "##lap", + "authentic", + "tablet", + "notation", + "##nburg", + "Bulldogs", + "Callum", + "Meet", + "mouths", + "coated", + "##xe", + "Truman", + "combinations", + "##mation", + "Steelers", + "Fan", + "Than", + "paternal", + "##father", + "##uti", + "Rebellion", + "inviting", + "Fun", + "theatres", + "##ي", + "##rom", + "curator", + "##cision", + "networking", + "Oz", + "drought", + "##ssel", + "granting", + "MBA", + "Shelby", + "Elaine", + "jealousy", + "Kyoto", + "shores", + "signaling", + "tenants", + "debated", + "Intermediate", + "Wise", + "##hes", + "##pu", + "Havana", + "duke", + "vicious", + "exited", + "servers", + "Nonetheless", + "Reports", + "explode", + "##beth", + "Nationals", + "offerings", + "Oval", + "conferred", + "eponymous", + "folklore", + "##NR", + "Shire", + "planting", + "1783", + "Zeus", + "accelerated", + "Constable", + "consuming", + "troubles", + "McCartney", + "texture", + "bust", + "Immigration", + "excavated", + "hopefully", + "##cession", + "##coe", + "##name", + "##ully", + "lining", + "Einstein", + "Venezuelan", + "reissued", + "minorities", + "Beatrice", + "crystals", + "##nies", + "circus", + "lava", + "Beirut", + "extinction", + "##shu", + "Becker", + "##uke", + "issuing", + "Zurich", + "extract", + "##esta", + "##rred", + "regulate", + "progression", + "hut", + "alcoholic", + "plea", + "AB", + "Norse", + "Hubert", + "Mansfield", + "ashamed", + "##put", + "Bombardment", + "stripes", + "electrons", + "Denise", + "horrified", + "Nor", + "arranger", + "Hay", + "Koch", + "##ddling", + "##iner", + "Birthday", + "Josie", + "deliberate", + "explorer", + "##jiang", + "##signed", + "Arrow", + "wiping", + "satellites", + "baritone", + "mobility", + "##rals", + "Dorset", + "turbine", + "Coffee", + "185", + "##lder", + "Cara", + "Colts", + "pits", + "Crossing", + "coral", + "##birth", + "Tai", + "zombie", + "smoothly", + "##hp", + "mates", + "##ady", + "Marguerite", + "##tary", + "puzzled", + "tapes", + "overly", + "Sonic", + "Prayer", + "Thinking", + "##uf", + "IEEE", + "obligation", + "##cliffe", + "Basil", + "redesignated", + "##mmy", + "nostrils", + "Barney", + "XIII", + "##phones", + "vacated", + "unused", + "Berg", + "##roid", + "Towards", + "viola", + "136", + "Event", + "subdivided", + "rabbit", + "recruiting", + "##nery", + "Namibia", + "##16", + "##ilation", + "recruits", + "Famous", + "Francesca", + "##hari", + "Goa", + "##lat", + "Karachi", + "haul", + "biblical", + "##cible", + "MGM", + "##rta", + "horsepower", + "profitable", + "Grandma", + "importantly", + "Martinez", + "incoming", + "##kill", + "beneficial", + "nominal", + "praying", + "##isch", + "gable", + "nail", + "noises", + "##ttle", + "Polytechnic", + "rub", + "##cope", + "Thor", + "audition", + "erotic", + "##ending", + "##iano", + "Ultimately", + "armoured", + "##mum", + "presently", + "pedestrian", + "##tled", + "Ipswich", + "offence", + "##ffin", + "##borne", + "Flemish", + "##hman", + "echo", + "##cting", + "auditorium", + "gentlemen", + "winged", + "##tched", + "Nicaragua", + "Unknown", + "prosperity", + "exhaust", + "pie", + "Peruvian", + "compartment", + "heights", + "disabilities", + "##pole", + "Harding", + "Humphrey", + "postponed", + "moths", + "Mathematical", + "Mets", + "posters", + "axe", + "##nett", + "Nights", + "Typically", + "chuckle", + "councillors", + "alternating", + "141", + "Norris", + "##ately", + "##etus", + "deficit", + "dreaming", + "cooler", + "oppose", + "Beethoven", + "##esis", + "Marquis", + "flashlight", + "headache", + "investor", + "responding", + "appointments", + "##shore", + "Elias", + "ideals", + "shades", + "torch", + "lingering", + "##real", + "pier", + "fertile", + "Diploma", + "currents", + "Snake", + "##horse", + "##15", + "Briggs", + "##ota", + "##hima", + "##romatic", + "Coastal", + "Kuala", + "ankles", + "Rae", + "slice", + "Hilton", + "locking", + "Approximately", + "Workshop", + "Niagara", + "strangely", + "##scence", + "functionality", + "advertisement", + "Rapid", + "Anders", + "ho", + "Soviets", + "packing", + "basal", + "Sunderland", + "Permanent", + "##fting", + "rack", + "tying", + "Lowell", + "##ncing", + "Wizard", + "mighty", + "tertiary", + "pencil", + "dismissal", + "torso", + "grasped", + "##yev", + "Sand", + "gossip", + "##nae", + "Beer", + "implementing", + "##19", + "##riya", + "Fork", + "Bee", + "##eria", + "Win", + "##cid", + "sailor", + "pressures", + "##oping", + "speculated", + "Freddie", + "originating", + "##DF", + "##SR", + "##outh", + "28th", + "melt", + "Brenda", + "lump", + "Burlington", + "USC", + "marginal", + "##bine", + "Dogs", + "swamp", + "cu", + "Ex", + "uranium", + "metro", + "spill", + "Pietro", + "seize", + "Chorus", + "partition", + "##dock", + "##media", + "engineered", + "##oria", + "conclusions", + "subdivision", + "##uid", + "Illustrated", + "Leading", + "##hora", + "Berkshire", + "definite", + "##books", + "##cin", + "##suke", + "noun", + "winced", + "Doris", + "dissertation", + "Wilderness", + "##quest", + "braced", + "arbitrary", + "kidnapping", + "Kurdish", + "##but", + "clearance", + "excavations", + "wanna", + "Allmusic", + "insult", + "presided", + "yacht", + "##SM", + "Honour", + "Tin", + "attracting", + "explosives", + "Gore", + "Bride", + "##ience", + "Packers", + "Devils", + "Observer", + "##course", + "Loser", + "##erry", + "##hardt", + "##mble", + "Cyrillic", + "undefeated", + "##stra", + "subordinate", + "##ame", + "Wigan", + "compulsory", + "Pauline", + "Cruise", + "Opposition", + "##ods", + "Period", + "dispersed", + "expose", + "##60", + "##has", + "Certain", + "Clerk", + "Wolves", + "##hibition", + "apparatus", + "allegiance", + "orbital", + "justified", + "thanked", + "##ević", + "Biblical", + "Carolyn", + "Graves", + "##tton", + "Hercules", + "backgrounds", + "replica", + "1788", + "aquatic", + "Mega", + "Stirling", + "obstacles", + "filing", + "Founder", + "vowels", + "Deborah", + "Rotterdam", + "surpassed", + "Belarusian", + "##ologists", + "Zambia", + "Ren", + "Olga", + "Alpine", + "bi", + "councillor", + "Oaks", + "Animals", + "eliminating", + "digit", + "Managing", + "##GE", + "laundry", + "##rdo", + "presses", + "slamming", + "Tudor", + "thief", + "posterior", + "##bas", + "Rodgers", + "smells", + "##ining", + "Hole", + "SUV", + "trombone", + "numbering", + "representations", + "Domingo", + "Paralympics", + "cartridge", + "##rash", + "Combined", + "shelves", + "Kraków", + "revision", + "##frame", + "Sánchez", + "##tracted", + "##bler", + "Alain", + "townships", + "sic", + "trousers", + "Gibbs", + "anterior", + "symmetry", + "vaguely", + "Castile", + "IRA", + "resembling", + "Penguin", + "##ulent", + "infections", + "##stant", + "raped", + "##pressive", + "worrying", + "brains", + "bending", + "JR", + "Evidence", + "Venetian", + "complexes", + "Jonah", + "850", + "exported", + "Ambrose", + "Gap", + "philanthropist", + "##atus", + "Marxist", + "weighing", + "##KO", + "##nath", + "Soldiers", + "chiefs", + "reject", + "repeating", + "shaky", + "Zürich", + "preserving", + "##xin", + "cigarettes", + "##break", + "mortar", + "##fin", + "Already", + "reproduction", + "socks", + "Waiting", + "amazed", + "##aca", + "dash", + "##path", + "Airborne", + "##harf", + "##get", + "descending", + "OBE", + "Sant", + "Tess", + "Lucius", + "enjoys", + "##ttered", + "##ivation", + "##ete", + "Leinster", + "Phillies", + "execute", + "geological", + "unfinished", + "Courts", + "SP", + "Beaver", + "Duck", + "motions", + "Platinum", + "friction", + "##aud", + "##bet", + "Parts", + "Stade", + "entirety", + "sprang", + "Smithsonian", + "coffin", + "prolonged", + "Borneo", + "##vise", + "unanimously", + "##uchi", + "Cars", + "Cassandra", + "Australians", + "##CT", + "##rgen", + "Louisa", + "spur", + "Constance", + "##lities", + "Patent", + "racism", + "tempo", + "##ssion", + "##chard", + "##nology", + "##claim", + "Million", + "Nichols", + "##dah", + "Numerous", + "ing", + "Pure", + "plantations", + "donor", + "##EP", + "##rip", + "convenience", + "##plate", + "dots", + "indirect", + "##written", + "Dong", + "failures", + "adapt", + "wizard", + "unfortunately", + "##gion", + "practitioners", + "economically", + "Enrique", + "unchanged", + "kingdoms", + "refined", + "definitions", + "lazy", + "worries", + "railing", + "##nay", + "Kaiser", + "##lug", + "cracks", + "sells", + "ninety", + "##WC", + "Directed", + "denotes", + "developmental", + "papal", + "unfortunate", + "disappointing", + "sixteenth", + "Jen", + "##urier", + "NWA", + "drifting", + "Horror", + "##chemical", + "behaviors", + "bury", + "surfaced", + "foreigners", + "slick", + "AND", + "##rene", + "##ditions", + "##teral", + "scrap", + "kicks", + "comprise", + "buddy", + "##anda", + "Mental", + "##ype", + "Dom", + "wines", + "Limerick", + "Luca", + "Rand", + "##won", + "Tomatoes", + "homage", + "geometric", + "##nted", + "telescope", + "Shelley", + "poles", + "##fan", + "shareholders", + "Autonomous", + "cope", + "intensified", + "Genoa", + "Reformation", + "grazing", + "##tern", + "Zhao", + "provisional", + "##bies", + "Con", + "##riel", + "Cynthia", + "Raleigh", + "vivid", + "threaten", + "Length", + "subscription", + "roses", + "Müller", + "##isms", + "robin", + "##tial", + "Laos", + "Stanton", + "nationalism", + "##clave", + "##ND", + "##17", + "##zz", + "staging", + "Busch", + "Cindy", + "relieve", + "##spective", + "packs", + "neglected", + "CBE", + "alpine", + "Evolution", + "uneasy", + "coastline", + "Destiny", + "Barber", + "Julio", + "##tted", + "informs", + "unprecedented", + "Pavilion", + "##bei", + "##ference", + "betrayal", + "awaiting", + "leaked", + "V8", + "puppet", + "adverse", + "Bourne", + "Sunset", + "collectors", + "##glass", + "##sque", + "copied", + "Demon", + "conceded", + "resembled", + "Rafe", + "Levy", + "prosecutor", + "##ject", + "flora", + "manned", + "deaf", + "Mosque", + "reminds", + "Lizzie", + "Products", + "Funny", + "cassette", + "congress", + "##rong", + "Rover", + "tossing", + "prompting", + "chooses", + "Satellite", + "cautiously", + "Reese", + "##UT", + "Huang", + "Gloucestershire", + "giggled", + "Kitty", + "##å", + "Pleasant", + "Aye", + "##ond", + "judging", + "1860s", + "intentionally", + "Hurling", + "aggression", + "##xy", + "transfers", + "employing", + "##fies", + "##oda", + "Archibald", + "Blessed", + "Ski", + "flavor", + "Rosie", + "##burgh", + "sunset", + "Scholarship", + "WC", + "surround", + "ranged", + "##jay", + "Degree", + "Houses", + "squeezing", + "limb", + "premium", + "Leningrad", + "steals", + "##inated", + "##ssie", + "madness", + "vacancy", + "hydraulic", + "Northampton", + "##prise", + "Marks", + "Boxing", + "##fying", + "academics", + "##lich", + "##TY", + "CDs", + "##lma", + "hardcore", + "monitors", + "paperback", + "cables", + "Dimitri", + "upside", + "advent", + "Ra", + "##clusive", + "Aug", + "Christchurch", + "objected", + "stalked", + "Simple", + "colonists", + "##laid", + "CT", + "discusses", + "fellowship", + "Carnival", + "cares", + "Miracle", + "pastoral", + "rooted", + "shortage", + "borne", + "Quentin", + "meditation", + "tapping", + "Novel", + "##ades", + "Alicia", + "Burn", + "famed", + "residency", + "Fernández", + "Johannesburg", + "Zhu", + "offended", + "Mao", + "outward", + "##inas", + "XV", + "denial", + "noticing", + "##ís", + "quarry", + "##hound", + "##amo", + "Bernie", + "Bentley", + "Joanna", + "mortgage", + "##rdi", + "##sumption", + "lenses", + "extracted", + "depiction", + "##RE", + "Networks", + "Broad", + "Revenue", + "flickered", + "virgin", + "flanked", + "##о", + "Enterprises", + "probable", + "Liberals", + "Falcons", + "drowning", + "phrases", + "loads", + "assumes", + "inhaled", + "awe", + "logs", + "slightest", + "spiders", + "waterfall", + "##pate", + "rocking", + "shrub", + "##uil", + "roofs", + "##gard", + "prehistoric", + "wary", + "##rak", + "TO", + "clips", + "sustain", + "treason", + "microphone", + "voter", + "Lamb", + "psychologist", + "wrinkled", + "##ères", + "mating", + "Carrier", + "340", + "##lbert", + "sensing", + "##rino", + "destiny", + "distract", + "weaker", + "UC", + "Nearly", + "neurons", + "spends", + "Apache", + "##rem", + "genuinely", + "wells", + "##lanted", + "stereo", + "##girl", + "Lois", + "Leaving", + "consul", + "fungi", + "Pier", + "Cyril", + "80s", + "Jungle", + "##tani", + "illustration", + "Split", + "##hana", + "Abigail", + "##patrick", + "1787", + "diminished", + "Selected", + "packaging", + "##EG", + "Martínez", + "communal", + "Manufacturing", + "sentiment", + "143", + "unwilling", + "praising", + "Citation", + "pills", + "##iti", + "##rax", + "muffled", + "neatly", + "workforce", + "Yep", + "leisure", + "Tu", + "##nding", + "Wakefield", + "ancestral", + "##uki", + "destructive", + "seas", + "Passion", + "showcase", + "##ceptive", + "heroic", + "142", + "exhaustion", + "Customs", + "##aker", + "Scholar", + "sliced", + "##inian", + "Direction", + "##OW", + "Swansea", + "aluminium", + "##eep", + "ceramic", + "McCoy", + "Career", + "Sector", + "chartered", + "Damascus", + "pictured", + "Interest", + "stiffened", + "Plateau", + "obsolete", + "##tant", + "irritated", + "inappropriate", + "overs", + "##nko", + "bail", + "Talent", + "Sur", + "ours", + "##nah", + "barred", + "legged", + "sociology", + "Bud", + "dictionary", + "##luk", + "Cover", + "obey", + "##oring", + "annoying", + "##dong", + "apprentice", + "Cyrus", + "Role", + "##GP", + "##uns", + "##bag", + "Greenland", + "Porsche", + "Rocket", + "##32", + "organism", + "##ntary", + "reliability", + "##vocation", + "##й", + "Found", + "##hine", + "motors", + "promoter", + "unfair", + "##oms", + "##note", + "distribute", + "eminent", + "rails", + "appealing", + "chiefly", + "meaningful", + "Stephan", + "##rehension", + "Consumer", + "psychiatric", + "bowler", + "saints", + "##iful", + "##н", + "1777", + "Pol", + "Dorian", + "Townsend", + "hastily", + "##jima", + "Quincy", + "Sol", + "fascinated", + "Scarlet", + "alto", + "Avon", + "certainty", + "##eding", + "Keys", + "##chu", + "Chu", + "##VE", + "ions", + "tributaries", + "Thanksgiving", + "##fusion", + "astronomer", + "oxide", + "pavilion", + "Supply", + "Casa", + "Bollywood", + "sadly", + "mutations", + "Keller", + "##wave", + "nationals", + "##rgo", + "##ym", + "predict", + "Catholicism", + "Vega", + "##eration", + "##ums", + "Mali", + "tuned", + "Lankan", + "Plans", + "radial", + "Bosnian", + "Lexi", + "##14", + "##ü", + "sacks", + "unpleasant", + "Empty", + "handles", + "##taking", + "Bon", + "switches", + "intently", + "tuition", + "antique", + "##jk", + "fraternity", + "notebook", + "Desmond", + "##sei", + "prostitution", + "##how", + "deed", + "##OP", + "501", + "Somewhere", + "Rocks", + "##mons", + "campaigned", + "frigate", + "gases", + "suppress", + "##hang", + "Merlin", + "Northumberland", + "dominate", + "expeditions", + "thunder", + "##ups", + "##rical", + "Cap", + "thorough", + "Ariel", + "##kind", + "renewable", + "constructing", + "pacing", + "terrorists", + "Bowen", + "documentaries", + "westward", + "##lass", + "##nage", + "Merchant", + "##ued", + "Beaumont", + "Din", + "##hian", + "Danube", + "peasant", + "Garrison", + "encourages", + "gratitude", + "reminding", + "stormed", + "##ouse", + "pronunciation", + "##ailed", + "Weekend", + "suggestions", + "##ffing", + "##DI", + "Active", + "Colombo", + "##logists", + "Merrill", + "##cens", + "Archaeological", + "Medina", + "captained", + "##yk", + "duel", + "cracking", + "Wilkinson", + "Guam", + "pickup", + "renovations", + "##ël", + "##izer", + "delighted", + "##iri", + "Weaver", + "##ctional", + "tens", + "##hab", + "Clint", + "##usion", + "##each", + "petals", + "Farrell", + "##sable", + "caste", + "##will", + "Ezra", + "##qi", + "##standing", + "thrilled", + "ambush", + "exhaled", + "##SU", + "Resource", + "blur", + "forearm", + "specifications", + "contingent", + "cafe", + "##iology", + "Antony", + "fundraising", + "grape", + "##rgy", + "turnout", + "##udi", + "Clifton", + "laboratories", + "Irvine", + "##opus", + "##lid", + "Monthly", + "Bihar", + "statutory", + "Roses", + "Emil", + "##rig", + "lumber", + "optimal", + "##DR", + "pumps", + "plaster", + "Mozambique", + "##aco", + "nightclub", + "propelled", + "##hun", + "ked", + "surplus", + "wax", + "##urai", + "pioneered", + "Sunny", + "imprint", + "Forget", + "Eliot", + "approximate", + "patronage", + "##bek", + "##ely", + "##mbe", + "Partnership", + "curl", + "snapping", + "29th", + "Patriarch", + "##jord", + "seldom", + "##ature", + "astronomy", + "Bremen", + "XIV", + "airborne", + "205", + "1778", + "recognizing", + "stranded", + "arrogant", + "bombardment", + "destined", + "ensured", + "146", + "robust", + "Davenport", + "Interactive", + "Offensive", + "Fi", + "prevents", + "probe", + "propeller", + "sorrow", + "Blade", + "mounting", + "automotive", + "##dged", + "wallet", + "201", + "lashes", + "Forrest", + "##ift", + "Cell", + "Younger", + "shouts", + "##cki", + "folds", + "##chet", + "Epic", + "yields", + "homosexual", + "tunes", + "##minate", + "##text", + "Manny", + "chemist", + "hindwings", + "##urn", + "pilgrimage", + "##sfield", + "##riff", + "MLS", + "##rive", + "Huntington", + "translates", + "Path", + "slim", + "##ndra", + "##oz", + "climax", + "commuter", + "desperation", + "##reet", + "denying", + "##rious", + "daring", + "seminary", + "polo", + "##clamation", + "Teatro", + "Torah", + "Cats", + "identities", + "Poles", + "photographed", + "fiery", + "popularly", + "##cross", + "winters", + "Hesse", + "##vio", + "Nurse", + "Senegal", + "Salon", + "prescribed", + "justify", + "##gues", + "##и", + "##orted", + "HQ", + "##hiro", + "evaluated", + "momentarily", + "##unts", + "Debbie", + "##licity", + "##TP", + "Mighty", + "Rabbit", + "##chal", + "Events", + "Savoy", + "##ht", + "Brandenburg", + "Bordeaux", + "##laus", + "Release", + "##IE", + "##kowski", + "1900s", + "SK", + "Strauss", + "##aly", + "Sonia", + "Updated", + "synagogue", + "McKay", + "flattened", + "370", + "clutch", + "contests", + "toast", + "evaluate", + "pope", + "heirs", + "jam", + "tutor", + "reverted", + "##ading", + "nonsense", + "hesitate", + "Lars", + "Ceylon", + "Laurie", + "##guchi", + "accordingly", + "customary", + "148", + "Ethics", + "Multiple", + "instincts", + "IGN", + "##ä", + "bullshit", + "##hit", + "##par", + "desirable", + "##ducing", + "##yam", + "alias", + "ashore", + "licenses", + "##lification", + "misery", + "147", + "Cola", + "assassinated", + "fiercely", + "##aft", + "las", + "goat", + "substrate", + "lords", + "Cass", + "Bridges", + "ICC", + "lasts", + "sights", + "reproductive", + "##asi", + "Ivory", + "Clean", + "fixing", + "##lace", + "seeming", + "aide", + "1850s", + "harassment", + "##FF", + "##LE", + "reasonably", + "##coat", + "##cano", + "NYC", + "1784", + "Fifty", + "immunity", + "Canadians", + "Cheng", + "comforting", + "meanwhile", + "##tera", + "##blin", + "breeds", + "glowed", + "##vour", + "Aden", + "##verted", + "##aded", + "##oral", + "neat", + "enforced", + "poisoning", + "##ews", + "##hone", + "enforce", + "predecessors", + "survivor", + "Month", + "unfamiliar", + "pierced", + "waived", + "dump", + "responds", + "Mai", + "Declan", + "angular", + "Doesn", + "interpretations", + "##yar", + "invest", + "Dhaka", + "policeman", + "Congregation", + "Eighth", + "painfully", + "##este", + "##vior", + "Württemberg", + "##cles", + "blockade", + "encouragement", + "##fie", + "Caucasus", + "Malone", + "Universidad", + "utilize", + "Nissan", + "inherent", + "151", + "agreeing", + "syllable", + "determines", + "Protocol", + "conclude", + "##gara", + "40th", + "Xu", + "Taiwanese", + "##ather", + "boiler", + "printer", + "Lacey", + "titular", + "Klaus", + "Fallon", + "Wembley", + "fox", + "Chandra", + "Governorate", + "obsessed", + "##Ps", + "micro", + "##25", + "Cooke", + "gymnasium", + "weaving", + "Shall", + "Hussein", + "glaring", + "softball", + "Reader", + "Dominion", + "Trouble", + "varsity", + "Cooperation", + "Chaos", + "Kang", + "Kramer", + "Eisenhower", + "proves", + "Connie", + "consortium", + "governors", + "Bethany", + "opener", + "Normally", + "Willy", + "linebacker", + "Regent", + "Used", + "AllMusic", + "Twilight", + "##shaw", + "Companion", + "Tribunal", + "simpler", + "##gam", + "Experimental", + "Slovenian", + "cellar", + "deadline", + "trout", + "Hubbard", + "ads", + "idol", + "##hetto", + "Granada", + "clues", + "salmon", + "1700", + "Omega", + "Caldwell", + "softened", + "Bills", + "Honolulu", + "##gn", + "Terrace", + "suitcase", + "##IL", + "frantic", + "##oons", + "Abbot", + "Sitting", + "Fortress", + "Riders", + "sickness", + "enzymes", + "trustee", + "Bern", + "forged", + "##13", + "##ruff", + "##rl", + "##versity", + "inspector", + "champagne", + "##held", + "##FI", + "hereditary", + "Taliban", + "handball", + "##wine", + "Sioux", + "##dicated", + "honoured", + "139", + "##tude", + "Skye", + "meanings", + "##rkin", + "cardiac", + "analyzed", + "vegetable", + "##FS", + "Royals", + "dial", + "freelance", + "##fest", + "partisan", + "petroleum", + "ridden", + "Lincolnshire", + "panting", + "##comb", + "presidents", + "Haley", + "##chs", + "contributes", + "Jew", + "discoveries", + "panicked", + "Woody", + "eyelids", + "Fate", + "Tulsa", + "mg", + "whiskey", + "zombies", + "Wii", + "##udge", + "investigators", + "##bull", + "centred", + "##screen", + "Bone", + "Lana", + "##oise", + "forts", + "##ske", + "Conan", + "Lyons", + "##writing", + "SH", + "##ride", + "rhythmic", + "154", + "##llah", + "pioneers", + "##bright", + "captivity", + "Sanchez", + "Oman", + "##mith", + "Flint", + "Platform", + "##ioned", + "emission", + "packet", + "Persia", + "##formed", + "takeover", + "tempted", + "Vance", + "Few", + "Toni", + "receptions", + "##ن", + "exchanges", + "Camille", + "whale", + "Chronicles", + "##rent", + "##ushing", + "##rift", + "Alto", + "Genus", + "##asing", + "onward", + "foremost", + "longing", + "Rockefeller", + "containers", + "##cribe", + "intercepted", + "##olt", + "pleading", + "Bye", + "bee", + "##umbling", + "153", + "undertake", + "Izzy", + "cheaper", + "Ultra", + "validity", + "##pse", + "Sa", + "hovering", + "##pert", + "vintage", + "engraved", + "##rise", + "farmland", + "##ever", + "##ifier", + "Atlantis", + "propose", + "Catalonia", + "plunged", + "##edly", + "demonstrates", + "gig", + "##cover", + "156", + "Osborne", + "cowboy", + "herd", + "investigator", + "loops", + "Burning", + "rests", + "Instrumental", + "embarrassing", + "focal", + "install", + "readings", + "swirling", + "Chatham", + "parameter", + "##zin", + "##holders", + "Mandarin", + "Moody", + "converting", + "Escape", + "warnings", + "##chester", + "incarnation", + "##ophone", + "adopting", + "##lins", + "Cromwell", + "##laws", + "Axis", + "Verde", + "Kappa", + "Schwartz", + "Serbs", + "caliber", + "Wanna", + "Chung", + "##ality", + "nursery", + "principally", + "Bulletin", + "likelihood", + "logging", + "##erty", + "Boyle", + "supportive", + "twitched", + "##usive", + "builds", + "Marseille", + "omitted", + "motif", + "Lands", + "##lusion", + "##ssed", + "Barrow", + "Airfield", + "Harmony", + "WWF", + "endured", + "merging", + "convey", + "branding", + "examinations", + "167", + "Italians", + "##dh", + "dude", + "1781", + "##teau", + "crawling", + "thoughtful", + "clasped", + "concluding", + "brewery", + "Moldova", + "Wan", + "Towers", + "Heidelberg", + "202", + "##ict", + "Lagos", + "imposing", + "##eval", + "##serve", + "Bacon", + "frowning", + "thirteenth", + "conception", + "calculations", + "##ович", + "##mile", + "##ivated", + "mutation", + "strap", + "##lund", + "demographic", + "nude", + "perfection", + "stocks", + "##renched", + "##dit", + "Alejandro", + "bites", + "fragment", + "##hack", + "##rchy", + "GB", + "Surgery", + "Berger", + "punish", + "boiling", + "consume", + "Elle", + "Sid", + "Dome", + "relies", + "Crescent", + "treasurer", + "Bloody", + "1758", + "upheld", + "Guess", + "Restaurant", + "signatures", + "font", + "millennium", + "mural", + "stakes", + "Abel", + "hailed", + "insists", + "Alumni", + "Breton", + "##jun", + "digits", + "##FM", + "##thal", + "Talking", + "motive", + "reigning", + "babe", + "masks", + "##ø", + "Shaun", + "potato", + "sour", + "whitish", + "Somali", + "##derman", + "##rab", + "##wy", + "chancel", + "telecommunications", + "Noise", + "messenger", + "tidal", + "grinding", + "##ogenic", + "Rebel", + "constituent", + "peripheral", + "recruitment", + "##ograph", + "##tler", + "pumped", + "Ravi", + "poked", + "##gley", + "Olive", + "diabetes", + "discs", + "liking", + "sting", + "fits", + "stir", + "Mari", + "Sega", + "creativity", + "weights", + "Macau", + "mandated", + "Bohemia", + "disastrous", + "Katrina", + "Baku", + "Rajasthan", + "waiter", + "##psis", + "Siberia", + "verbs", + "##truction", + "patented", + "1782", + "##ndon", + "Relegated", + "Hunters", + "Greenwood", + "Shock", + "accusing", + "skipped", + "Sessions", + "markers", + "subset", + "monumental", + "Viola", + "comparative", + "Alright", + "Barbados", + "setup", + "Session", + "standardized", + "##ík", + "##sket", + "appoint", + "AFB", + "Nationalist", + "##WS", + "Troop", + "leaped", + "Treasure", + "goodness", + "weary", + "originates", + "100th", + "compassion", + "expresses", + "recommend", + "168", + "composing", + "seventeenth", + "Tex", + "Atlético", + "bald", + "Finding", + "Presidency", + "Sharks", + "favoured", + "inactive", + "##lter", + "suffix", + "princes", + "brighter", + "##ctus", + "classics", + "defendants", + "culminated", + "terribly", + "Strategy", + "evenings", + "##ção", + "##iver", + "##urance", + "absorb", + "##rner", + "Territories", + "RBI", + "soothing", + "Martín", + "concurrently", + "##tr", + "Nicholson", + "fibers", + "swam", + "##oney", + "Allie", + "Algerian", + "Dartmouth", + "Mafia", + "##bos", + "##tts", + "Councillor", + "vocabulary", + "##bla", + "##lé", + "intending", + "##dler", + "Guerrero", + "sunshine", + "pedal", + "##TO", + "administrators", + "periodic", + "scholarships", + "Loop", + "Madeline", + "exaggerated", + "##ressed", + "Regan", + "##cellular", + "Explorer", + "##oids", + "Alexandre", + "vows", + "Reporter", + "Unable", + "Average", + "absorption", + "##bedience", + "Fortunately", + "Auxiliary", + "Grandpa", + "##HP", + "##ovo", + "potent", + "temporal", + "adrenaline", + "##udo", + "confusing", + "guiding", + "Dry", + "qualifications", + "joking", + "wherein", + "heavyweight", + "##ices", + "nightmares", + "pharmaceutical", + "Commanding", + "##aled", + "##ove", + "Gregor", + "##UP", + "censorship", + "degradation", + "glorious", + "Austro", + "##rench", + "380", + "Miriam", + "sped", + "##orous", + "offset", + "##KA", + "fined", + "specialists", + "Pune", + "João", + "##dina", + "propped", + "fungus", + "##ς", + "frantically", + "Gabrielle", + "Hare", + "committing", + "##plied", + "Ask", + "Wilmington", + "stunt", + "numb", + "warmer", + "preacher", + "earnings", + "##lating", + "integer", + "##ija", + "federation", + "homosexuality", + "##cademia", + "epidemic", + "grumbled", + "shoving", + "Milk", + "Satan", + "Tobias", + "innovations", + "##dington", + "geology", + "memoirs", + "##IR", + "spared", + "culminating", + "Daphne", + "Focus", + "severed", + "stricken", + "Paige", + "Mans", + "flats", + "Russo", + "communes", + "litigation", + "strengthening", + "##powered", + "Staffordshire", + "Wiltshire", + "Painting", + "Watkins", + "##د", + "specializes", + "Select", + "##rane", + "##aver", + "Fulton", + "playable", + "##VN", + "openings", + "sampling", + "##coon", + "##21", + "Allah", + "travelers", + "allocation", + "##arily", + "Loch", + "##hm", + "commentators", + "fulfilled", + "##troke", + "Emeritus", + "Vanderbilt", + "Vijay", + "pledged", + "##tative", + "diagram", + "drilling", + "##MD", + "##plain", + "Edison", + "productivity", + "31st", + "##rying", + "##ption", + "##gano", + "##oration", + "##bara", + "posture", + "bothering", + "platoon", + "politely", + "##inating", + "redevelopment", + "Job", + "##vale", + "stark", + "incorrect", + "Mansion", + "renewal", + "threatens", + "Bahamas", + "fridge", + "##tata", + "Uzbekistan", + "##edia", + "Sainte", + "##mio", + "gaps", + "neural", + "##storm", + "overturned", + "Preservation", + "shields", + "##ngo", + "##physics", + "ah", + "gradual", + "killings", + "##anza", + "consultation", + "premiership", + "Felipe", + "coincidence", + "##ène", + "##any", + "Handbook", + "##loaded", + "Edit", + "Guns", + "arguably", + "##ş", + "compressed", + "depict", + "seller", + "##qui", + "Kilkenny", + "##kling", + "Olympia", + "librarian", + "##acles", + "dramas", + "JP", + "Kit", + "Maj", + "##lists", + "proprietary", + "##nged", + "##ettes", + "##tok", + "exceeding", + "Lock", + "induction", + "numerical", + "##vist", + "Straight", + "foyer", + "imaginary", + "##pop", + "violinist", + "Carla", + "bouncing", + "##ashi", + "abolition", + "##uction", + "restoring", + "scenic", + "##č", + "Doom", + "overthrow", + "para", + "##vid", + "##ughty", + "Concord", + "HC", + "cocaine", + "deputies", + "##aul", + "visibility", + "##wart", + "Kapoor", + "Hutchinson", + "##agan", + "flashes", + "kn", + "decreasing", + "##ronology", + "quotes", + "vain", + "satisfying", + "##iam", + "##linger", + "310", + "Hanson", + "fauna", + "##zawa", + "##rrel", + "Trenton", + "##VB", + "Employment", + "vocational", + "Exactly", + "bartender", + "butterflies", + "tow", + "##chers", + "##ocks", + "pigs", + "merchandise", + "##game", + "##pine", + "Shea", + "##gration", + "Connell", + "Josephine", + "monopoly", + "##dled", + "Cobb", + "warships", + "cancellation", + "someday", + "stove", + "##Cs", + "candidacy", + "superhero", + "unrest", + "Toulouse", + "admiration", + "undergone", + "whirled", + "Reconnaissance", + "costly", + "##ships", + "290", + "Cafe", + "amber", + "Tory", + "##mpt", + "definitive", + "##dress", + "proposes", + "redesigned", + "acceleration", + "##asa", + "##raphy", + "Presley", + "exits", + "Languages", + "##cel", + "Mode", + "spokesperson", + "##tius", + "Ban", + "forthcoming", + "grounded", + "ACC", + "compelling", + "logistics", + "retailers", + "abused", + "##gating", + "soda", + "##yland", + "##lution", + "Landmark", + "XVI", + "blush", + "##tem", + "hurling", + "dread", + "Tobago", + "Foley", + "##uad", + "scenarios", + "##mentation", + "##rks", + "Score", + "fatigue", + "hairy", + "correspond", + "##iard", + "defences", + "confiscated", + "##rudence", + "1785", + "Formerly", + "Shot", + "advertised", + "460", + "Text", + "ridges", + "Promise", + "Dev", + "exclusion", + "NHS", + "tuberculosis", + "rockets", + "##offs", + "sparkling", + "256", + "disappears", + "mankind", + "##hore", + "HP", + "##omo", + "taxation", + "Multi", + "DS", + "Virgil", + "##ams", + "Dell", + "stacked", + "guessing", + "Jump", + "Nope", + "cheer", + "hates", + "ballots", + "overlooked", + "analyses", + "Prevention", + "maturity", + "dos", + "##cards", + "##lect", + "Mare", + "##yssa", + "Petty", + "##wning", + "differing", + "iOS", + "##ior", + "Joachim", + "Sentinel", + "##nstein", + "90s", + "Pamela", + "480", + "Asher", + "##lary", + "Vicente", + "landings", + "portray", + "##rda", + "##xley", + "Virtual", + "##uary", + "finances", + "Jain", + "Somebody", + "Tri", + "behave", + "Michele", + "##ider", + "dwellings", + "FAA", + "Gallagher", + "##lide", + "Monkey", + "195", + "aforementioned", + "##rism", + "##bey", + "##kim", + "##puted", + "Mesa", + "hopped", + "unopposed", + "recipients", + "Reality", + "Been", + "gritted", + "149", + "playground", + "pillar", + "##rone", + "Guinness", + "##tad", + "Théâtre", + "depended", + "Tipperary", + "Reuben", + "frightening", + "wooded", + "Target", + "globally", + "##uted", + "Morales", + "Baptiste", + "drunken", + "Institut", + "characterised", + "##chemistry", + "Strip", + "discrete", + "Premiership", + "##zzling", + "gazing", + "Outer", + "##quisition", + "Sikh", + "Booker", + "##yal", + "contemporaries", + "Jericho", + "##chan", + "##physical", + "##witch", + "Militia", + "##rez", + "##zard", + "dangers", + "##utter", + "##₀", + "Programs", + "darling", + "participates", + "railroads", + "##ienne", + "behavioral", + "bureau", + "##rook", + "161", + "Hicks", + "##rises", + "Comes", + "inflicted", + "bees", + "kindness", + "norm", + "##ković", + "generators", + "##pard", + "##omy", + "##ili", + "methodology", + "Alvin", + "façade", + "latitude", + "##plified", + "DE", + "Morse", + "##mered", + "educate", + "intersects", + "##MF", + "##cz", + "##vated", + "AL", + "##graded", + "##fill", + "constitutes", + "artery", + "feudal", + "avant", + "cautious", + "##ogue", + "immigrated", + "##chenko", + "Saul", + "Clinic", + "Fang", + "choke", + "Cornelius", + "flexibility", + "temperate", + "pins", + "##erson", + "oddly", + "inequality", + "157", + "Natasha", + "Sal", + "##uter", + "215", + "aft", + "blinking", + "##ntino", + "northward", + "Exposition", + "cookies", + "Wedding", + "impulse", + "Overseas", + "terrifying", + "##ough", + "Mortimer", + "##see", + "440", + "https", + "og", + "imagining", + "##cars", + "Nicola", + "exceptionally", + "threads", + "##cup", + "Oswald", + "Provisional", + "dismantled", + "deserves", + "1786", + "Fairy", + "discourse", + "Counsel", + "departing", + "Arc", + "guarding", + "##orse", + "420", + "alterations", + "vibrant", + "Em", + "squinted", + "terrace", + "rowing", + "Led", + "accessories", + "SF", + "Sgt", + "cheating", + "Atomic", + "##raj", + "Blackpool", + "##iary", + "boarded", + "substituted", + "bestowed", + "lime", + "kernel", + "##jah", + "Belmont", + "shaken", + "sticky", + "retrospective", + "Louie", + "migrants", + "weigh", + "sunglasses", + "thumbs", + "##hoff", + "excavation", + "##nks", + "Extra", + "Polo", + "motives", + "Drum", + "infrared", + "tastes", + "berth", + "verge", + "##stand", + "programmed", + "warmed", + "Shankar", + "Titan", + "chromosome", + "cafeteria", + "dividing", + "pepper", + "CPU", + "Stevie", + "satirical", + "Nagar", + "scowled", + "Died", + "backyard", + "##gata", + "##reath", + "##bir", + "Governors", + "portraying", + "##yah", + "Revenge", + "##acing", + "1772", + "margins", + "Bahn", + "OH", + "lowland", + "##razed", + "catcher", + "replay", + "##yoshi", + "Seriously", + "##licit", + "Aristotle", + "##ald", + "Habsburg", + "weekday", + "Secretariat", + "CO", + "##dly", + "##joy", + "##stad", + "litre", + "ultra", + "##cke", + "Mongol", + "Tucson", + "correlation", + "compose", + "traps", + "Groups", + "Hai", + "Salvatore", + "##dea", + "cents", + "##eese", + "concession", + "clash", + "Trip", + "Panzer", + "Moroccan", + "cruisers", + "torque", + "Ba", + "grossed", + "##arate", + "restriction", + "concentrating", + "FDA", + "##Leod", + "##ones", + "Scholars", + "##esi", + "throbbing", + "specialised", + "##heses", + "Chicken", + "##fia", + "##ificant", + "Erich", + "Residence", + "##trate", + "manipulation", + "namesake", + "##tom", + "Hoover", + "cue", + "Lindsey", + "Lonely", + "275", + "##HT", + "combustion", + "subscribers", + "Punjabi", + "respects", + "Jeremiah", + "penned", + "##gor", + "##rilla", + "suppression", + "##tration", + "Crimson", + "piston", + "Derry", + "crimson", + "lyrical", + "oversee", + "portrays", + "CF", + "Districts", + "Lenin", + "Cora", + "searches", + "clans", + "VHS", + "##hel", + "Jacqueline", + "Redskins", + "Clubs", + "desktop", + "indirectly", + "alternatives", + "marijuana", + "suffrage", + "##smos", + "Irwin", + "##liff", + "Process", + "##hawks", + "Sloane", + "##bson", + "Sonata", + "yielded", + "Flores", + "##ares", + "armament", + "adaptations", + "integrate", + "neighbours", + "shelters", + "##tour", + "Skinner", + "##jet", + "##tations", + "1774", + "Peterborough", + "##elles", + "ripping", + "Liang", + "Dickinson", + "charities", + "Rwanda", + "monasteries", + "crossover", + "racist", + "barked", + "guerrilla", + "##ivate", + "Grayson", + "##iques", + "##vious", + "##got", + "Rolls", + "denominations", + "atom", + "affinity", + "##delity", + "Wish", + "##inted", + "##inae", + "interrogation", + "##cey", + "##erina", + "##lifting", + "192", + "Sands", + "1779", + "mast", + "Likewise", + "##hyl", + "##oft", + "contempt", + "##por", + "assaulted", + "fills", + "establishments", + "Mal", + "consulted", + "##omi", + "##sight", + "greet", + "##roma", + "##egan", + "Pulitzer", + "##rried", + "##dius", + "##ractical", + "##voked", + "Hasan", + "CB", + "##zzy", + "Romanesque", + "Panic", + "wheeled", + "recorder", + "##tters", + "##warm", + "##gly", + "botanist", + "Balkan", + "Lockheed", + "Polly", + "farewell", + "suffers", + "purchases", + "Eaton", + "##80", + "Quick", + "commenting", + "Saga", + "beasts", + "hides", + "motifs", + "##icks", + "Alonso", + "Springer", + "Wikipedia", + "circulated", + "encoding", + "jurisdictions", + "snout", + "UAE", + "Integrated", + "unmarried", + "Heinz", + "##lein", + "##figured", + "deleted", + "##tley", + "Zen", + "Cycling", + "Fuel", + "Scandinavian", + "##rants", + "Conner", + "reef", + "Marino", + "curiously", + "lingered", + "Gina", + "manners", + "activism", + "Mines", + "Expo", + "Micah", + "promotions", + "Server", + "booked", + "derivatives", + "eastward", + "detailing", + "reelection", + "##chase", + "182", + "Campeonato", + "Po", + "158", + "Peel", + "winger", + "##itch", + "canyon", + "##pit", + "LDS", + "A1", + "##shin", + "Giorgio", + "pathetic", + "##rga", + "##mist", + "Aren", + "##lag", + "confronts", + "motel", + "textbook", + "shine", + "turbines", + "1770", + "Darcy", + "##cot", + "Southeastern", + "##lessness", + "Banner", + "recognise", + "stray", + "Kitchen", + "paperwork", + "realism", + "Chrysler", + "filmmakers", + "fishermen", + "##hetic", + "variously", + "Vishnu", + "fiddle", + "Eddy", + "Origin", + "##tec", + "##ulin", + "Flames", + "Rs", + "bankrupt", + "Extreme", + "Pomeranian", + "##emption", + "ratified", + "##iu", + "jockey", + "Stratford", + "##ivating", + "##oire", + "Babylon", + "pardon", + "AI", + "affordable", + "deities", + "disturbance", + "Trying", + "##sai", + "Ida", + "Papers", + "advancement", + "70s", + "archbishop", + "Luftwaffe", + "announces", + "tugging", + "##lphin", + "##sistence", + "##eel", + "##ishes", + "ambition", + "aura", + "##fled", + "##lected", + "##vue", + "Prasad", + "boiled", + "clarity", + "Violin", + "investigative", + "routing", + "Yankee", + "##uckle", + "McMahon", + "bugs", + "eruption", + "##rooms", + "Minutes", + "relics", + "##ckle", + "##nse", + "sipped", + "valves", + "weakly", + "##ital", + "Middleton", + "collided", + "##quer", + "bamboo", + "insignia", + "Tyne", + "exercised", + "Ninth", + "echoing", + "polynomial", + "considerations", + "lunged", + "##bius", + "objections", + "complain", + "disguised", + "plaza", + "##VC", + "institutes", + "Judicial", + "ascent", + "imminent", + "Waterford", + "hello", + "Lumpur", + "Niger", + "Goldman", + "vendors", + "Kensington", + "Wren", + "browser", + "##bner", + "##tri", + "##mize", + "##pis", + "##lea", + "Cheyenne", + "Bold", + "Settlement", + "Hollow", + "Paralympic", + "axle", + "##toire", + "##actic", + "impose", + "perched", + "utilizing", + "slips", + "Benz", + "Michaels", + "manipulate", + "Chiang", + "##mian", + "Dolphins", + "prohibition", + "attacker", + "ecology", + "Estadio", + "##SB", + "##uild", + "attracts", + "recalls", + "glacier", + "lad", + "##rima", + "Barlow", + "kHz", + "melodic", + "##aby", + "##iracy", + "assumptions", + "Cornish", + "##aru", + "DOS", + "Maddie", + "##mers", + "lyric", + "Luton", + "nm", + "##tron", + "Reno", + "Fin", + "YOU", + "Broadcast", + "Finch", + "sensory", + "##bent", + "Jeep", + "##uman", + "additionally", + "Buildings", + "businessmen", + "treaties", + "235", + "Stranger", + "gateway", + "Charlton", + "accomplishments", + "Diary", + "apologized", + "zinc", + "histories", + "supplier", + "##tting", + "162", + "asphalt", + "Treatment", + "Abbas", + "##pating", + "##yres", + "Bloom", + "sedan", + "soloist", + "##cum", + "antagonist", + "denounced", + "Fairfax", + "##aving", + "##enko", + "noticeable", + "Budget", + "Buckingham", + "Snyder", + "retreating", + "Jai", + "spoon", + "invading", + "giggle", + "woven", + "gunfire", + "arrests", + "##vered", + "##come", + "respiratory", + "violet", + "##aws", + "Byrd", + "shocking", + "tenant", + "Jamaican", + "Ottomans", + "Seal", + "theirs", + "##isse", + "##48", + "cooperate", + "peering", + "##nius", + "163", + "Composer", + "organist", + "Mongolian", + "Bauer", + "Spy", + "collects", + "prophecy", + "congregations", + "##moor", + "Brick", + "calculation", + "fixtures", + "exempt", + "##dden", + "Ada", + "Thousand", + "##lue", + "tracing", + "##achi", + "bodyguard", + "vicar", + "supplying", + "Łódź", + "interception", + "monitored", + "##heart", + "Paso", + "overlap", + "annoyance", + "##dice", + "yellowish", + "stables", + "elders", + "illegally", + "honesty", + "##oar", + "skinny", + "spinal", + "##puram", + "Bourbon", + "##cor", + "flourished", + "Medium", + "##stics", + "##aba", + "Follow", + "##ckey", + "stationary", + "##scription", + "dresser", + "scrutiny", + "Buckley", + "Clearly", + "##SF", + "Lyrics", + "##heimer", + "drying", + "Oracle", + "internally", + "rains", + "##last", + "Enemy", + "##oes", + "McLean", + "Ole", + "phosphate", + "Rosario", + "Rifles", + "##mium", + "battered", + "Pepper", + "Presidents", + "conquer", + "Château", + "castles", + "##aldo", + "##ulf", + "Depending", + "Lesser", + "Boom", + "trades", + "Peyton", + "164", + "emphasize", + "accustomed", + "SM", + "Ai", + "Classification", + "##mins", + "##35", + "##rons", + "leak", + "piled", + "deeds", + "lush", + "##self", + "beginnings", + "breathless", + "1660", + "McGill", + "##ago", + "##chaft", + "##gies", + "humour", + "Bomb", + "securities", + "Might", + "##zone", + "##eves", + "Matthias", + "Movies", + "Levine", + "vengeance", + "##ads", + "Challenger", + "Misty", + "Traditionally", + "constellation", + "##rass", + "deepest", + "workplace", + "##oof", + "##vina", + "impatient", + "##ML", + "Mughal", + "Alessandro", + "scenery", + "Slater", + "postseason", + "troupe", + "##ń", + "Volunteers", + "Facility", + "militants", + "Reggie", + "sanctions", + "Expeditionary", + "Nam", + "countered", + "interpret", + "Basilica", + "coding", + "expectation", + "Duffy", + "def", + "Tong", + "wakes", + "Bowling", + "Vehicle", + "Adler", + "salad", + "intricate", + "stronghold", + "medley", + "##uries", + "##bur", + "joints", + "##rac", + "##yx", + "##IO", + "Ordnance", + "Welch", + "distributor", + "Ark", + "cavern", + "trench", + "Weiss", + "Mauritius", + "decreases", + "docks", + "eagerly", + "irritation", + "Matilda", + "biographer", + "Visiting", + "##marked", + "##iter", + "##ear", + "##gong", + "Moreno", + "attendant", + "Bury", + "instrumentation", + "theologian", + "clit", + "nuns", + "symphony", + "translate", + "375", + "loser", + "##user", + "##VR", + "##meter", + "##orious", + "harmful", + "##yuki", + "Commissioners", + "Mendoza", + "sniffed", + "Hulk", + "##dded", + "##ulator", + "##nz", + "Donnell", + "##eka", + "deported", + "Met", + "SD", + "Aerospace", + "##cultural", + "##odes", + "Fantastic", + "cavity", + "remark", + "emblem", + "fearing", + "##iance", + "ICAO", + "Liberia", + "stab", + "##yd", + "Pac", + "Gymnasium", + "IS", + "Everton", + "##vanna", + "mantle", + "##ief", + "Ramon", + "##genic", + "Shooting", + "Smoke", + "Random", + "Africans", + "MB", + "tavern", + "bargain", + "voluntarily", + "Ion", + "Peoples", + "Rusty", + "attackers", + "Patton", + "sins", + "##cake", + "Hat", + "moderately", + "##hala", + "##alia", + "requesting", + "mechanic", + "##eae", + "Seine", + "Robbins", + "##ulum", + "susceptible", + "Bravo", + "Slade", + "Strasbourg", + "rubble", + "entrusted", + "Creation", + "##amp", + "smoothed", + "##uintet", + "evenly", + "reviewers", + "skip", + "Sculpture", + "177", + "Rough", + "##rrie", + "Reeves", + "##cede", + "Administrator", + "garde", + "minus", + "carriages", + "grenade", + "Ninja", + "fuscous", + "##kley", + "Punk", + "contributors", + "Aragon", + "Tottenham", + "##cca", + "##sir", + "VA", + "laced", + "dealers", + "##sonic", + "crisp", + "harmonica", + "Artistic", + "Butch", + "Andes", + "Farmers", + "corridors", + "unseen", + "##tium", + "Countries", + "Lone", + "envisioned", + "Katy", + "##lang", + "##cc", + "Quarterly", + "##neck", + "consort", + "##aceae", + "bidding", + "Corey", + "concurrent", + "##acts", + "##gum", + "Highness", + "##lient", + "##rators", + "arising", + "##unta", + "pathways", + "49ers", + "bolted", + "complaining", + "ecosystem", + "libretto", + "Ser", + "narrated", + "212", + "Soft", + "influx", + "##dder", + "incorporation", + "plagued", + "tents", + "##ddled", + "1750", + "Risk", + "citation", + "Tomas", + "hostilities", + "seals", + "Bruins", + "Dominique", + "attic", + "competent", + "##UR", + "##cci", + "hugging", + "Breuning", + "bacterial", + "Shrewsbury", + "vowed", + "eh", + "elongated", + "hangs", + "render", + "centimeters", + "##ficient", + "Mu", + "turtle", + "besieged", + "##gaard", + "grapes", + "bravery", + "collaborations", + "deprived", + "##amine", + "##using", + "##gins", + "arid", + "##uve", + "coats", + "hanged", + "##sting", + "Pa", + "prefix", + "##ranged", + "Exit", + "Chain", + "Flood", + "Materials", + "suspicions", + "##ö", + "hovered", + "Hidden", + "##state", + "Malawi", + "##24", + "Mandy", + "norms", + "fascinating", + "airlines", + "delivers", + "##rust", + "Cretaceous", + "spanned", + "pillows", + "##onomy", + "jar", + "##kka", + "regent", + "fireworks", + "morality", + "discomfort", + "lure", + "uneven", + "##jack", + "Lucian", + "171", + "archaeology", + "##til", + "mornings", + "Billie", + "Marquess", + "impending", + "spilling", + "tombs", + "##volved", + "Celia", + "Coke", + "underside", + "##bation", + "Vaughn", + "Daytona", + "Godfrey", + "Pascal", + "Alien", + "##sign", + "172", + "##lage", + "iPhone", + "Gonna", + "genocide", + "##rber", + "oven", + "endure", + "dashed", + "simultaneous", + "##phism", + "Wally", + "##rō", + "ants", + "predator", + "reissue", + "##aper", + "Speech", + "funk", + "Rudy", + "claw", + "Hindus", + "Numbers", + "Bing", + "lantern", + "##aurus", + "scattering", + "poisoned", + "##active", + "Andrei", + "algebraic", + "baseman", + "##ritz", + "Gregg", + "##cola", + "selections", + "##putation", + "lick", + "Laguna", + "##IX", + "Sumatra", + "Warning", + "turf", + "buyers", + "Burgess", + "Oldham", + "exploit", + "worm", + "initiate", + "strapped", + "tuning", + "filters", + "haze", + "##е", + "##ledge", + "##ydro", + "##culture", + "amendments", + "Promotion", + "##union", + "Clair", + "##uria", + "petty", + "shutting", + "##eveloped", + "Phoebe", + "Zeke", + "conducts", + "grains", + "clashes", + "##latter", + "illegitimate", + "willingly", + "Deer", + "Lakers", + "Reference", + "chaplain", + "commitments", + "interrupt", + "salvation", + "Panther", + "Qualifying", + "Assessment", + "cancel", + "efficiently", + "attorneys", + "Dynamo", + "impress", + "accession", + "clinging", + "randomly", + "reviewing", + "Romero", + "Cathy", + "charting", + "clapped", + "rebranded", + "Azerbaijani", + "coma", + "indicator", + "punches", + "##tons", + "Sami", + "monastic", + "prospects", + "Pastor", + "##rville", + "electrified", + "##CI", + "##utical", + "tumbled", + "Chef", + "muzzle", + "selecting", + "UP", + "Wheel", + "protocols", + "##tat", + "Extended", + "beautifully", + "nests", + "##stal", + "Andersen", + "##anu", + "##³", + "##rini", + "kneeling", + "##reis", + "##xia", + "anatomy", + "dusty", + "Safe", + "turmoil", + "Bianca", + "##elo", + "analyze", + "##ر", + "##eran", + "podcast", + "Slovene", + "Locke", + "Rue", + "##retta", + "##uni", + "Person", + "Prophet", + "crooked", + "disagreed", + "Versailles", + "Sarajevo", + "Utrecht", + "##ogen", + "chewing", + "##ception", + "##iidae", + "Missile", + "attribute", + "majors", + "Arch", + "intellectuals", + "##andra", + "ideological", + "Cory", + "Salzburg", + "##fair", + "Lot", + "electromagnetic", + "Distribution", + "##oper", + "##pered", + "Russ", + "Terra", + "repeats", + "fluttered", + "Riga", + "##ific", + "##gt", + "cows", + "Hair", + "labelled", + "protects", + "Gale", + "Personnel", + "Düsseldorf", + "Moran", + "rematch", + "##OE", + "Slow", + "forgiveness", + "##ssi", + "proudly", + "Macmillan", + "insist", + "undoubtedly", + "Québec", + "Violence", + "##yuan", + "##aine", + "mourning", + "linen", + "accidental", + "##iol", + "##arium", + "grossing", + "lattice", + "maneuver", + "##marine", + "prestige", + "petrol", + "gradient", + "invasive", + "militant", + "Galerie", + "widening", + "##aman", + "##quist", + "disagreement", + "##ales", + "creepy", + "remembers", + "buzz", + "##erial", + "Exempt", + "Dirk", + "mon", + "Addison", + "##inen", + "deposed", + "##agon", + "fifteenth", + "Hang", + "ornate", + "slab", + "##lades", + "Fountain", + "contractors", + "das", + "Warwickshire", + "1763", + "##rc", + "Carly", + "Essays", + "Indy", + "Ligue", + "greenhouse", + "slit", + "##sea", + "chewed", + "wink", + "##azi", + "Playhouse", + "##kon", + "Gram", + "Ko", + "Samson", + "creators", + "revive", + "##rians", + "spawned", + "seminars", + "Craft", + "Tall", + "diverted", + "assistants", + "computational", + "enclosure", + "##acity", + "Coca", + "##eve", + "databases", + "Drop", + "##loading", + "##hage", + "Greco", + "Privy", + "entrances", + "pork", + "prospective", + "Memories", + "robes", + "##market", + "transporting", + "##lik", + "Rudolph", + "Horton", + "visually", + "##uay", + "##nja", + "Centro", + "Tor", + "Howell", + "##rsey", + "admitting", + "postgraduate", + "herbs", + "##att", + "Chin", + "Rutherford", + "##bot", + "##etta", + "Seasons", + "explanations", + "##bery", + "Friedman", + "heap", + "##ryl", + "##sberg", + "jaws", + "##agh", + "Choi", + "Killing", + "Fanny", + "##suming", + "##hawk", + "hopeful", + "##aid", + "Monty", + "gum", + "remarkably", + "Secrets", + "disco", + "harp", + "advise", + "##avia", + "Marathi", + "##cycle", + "Truck", + "abbot", + "sincere", + "urine", + "##mology", + "masked", + "bathing", + "##tun", + "Fellows", + "##TM", + "##gnetic", + "owl", + "##jon", + "hymn", + "##leton", + "208", + "hostility", + "##cée", + "baked", + "Bottom", + "##AB", + "shudder", + "##ater", + "##von", + "##hee", + "reorganization", + "Cycle", + "##phs", + "Lex", + "##style", + "##rms", + "Translation", + "##erick", + "##imeter", + "##ière", + "attested", + "Hillary", + "##DM", + "gal", + "wander", + "Salle", + "##laming", + "Perez", + "Pit", + "##LP", + "USAF", + "contexts", + "Disease", + "blazing", + "aroused", + "razor", + "walled", + "Danielle", + "Mont", + "Funk", + "royalty", + "thee", + "203", + "donors", + "##erton", + "famously", + "processors", + "reassigned", + "welcoming", + "Goldberg", + "##quities", + "undisclosed", + "Orient", + "Patty", + "vaccine", + "refrigerator", + "Cypriot", + "consonant", + "##waters", + "176", + "sober", + "##lement", + "Racecourse", + "##uate", + "Luckily", + "Selection", + "conceptual", + "vines", + "Breaking", + "wa", + "lions", + "oversight", + "sheltered", + "Dancer", + "ponds", + "borrow", + "##BB", + "##pulsion", + "Daly", + "##eek", + "fertility", + "spontaneous", + "Worldwide", + "gasping", + "##tino", + "169", + "ABS", + "Vickers", + "ambient", + "energetic", + "prisons", + "##eson", + "Stacy", + "##roach", + "GmbH", + "Afro", + "Marin", + "farmhouse", + "pinched", + "##cursion", + "##sp", + "Sabine", + "##pire", + "181", + "nak", + "swelling", + "humble", + "perfume", + "##balls", + "Rai", + "cannons", + "##taker", + "Married", + "Maltese", + "canals", + "interceptions", + "hats", + "lever", + "slowing", + "##ppy", + "Nike", + "Silas", + "Scarborough", + "skirts", + "166", + "inauguration", + "Shuttle", + "alloy", + "beads", + "belts", + "Compton", + "Cause", + "battling", + "critique", + "surf", + "Dock", + "roommate", + "##ulet", + "invade", + "Garland", + "##slow", + "nutrition", + "persona", + "##zam", + "Wichita", + "acquaintance", + "coincided", + "##cate", + "Dracula", + "clamped", + "##gau", + "overhaul", + "##broken", + "##rrier", + "melodies", + "ventures", + "Paz", + "convex", + "Roots", + "##holding", + "Tribute", + "transgender", + "##ò", + "chimney", + "##riad", + "Ajax", + "Thereafter", + "messed", + "nowadays", + "pH", + "##100", + "##alog", + "Pomerania", + "##yra", + "Rossi", + "glove", + "##TL", + "Races", + "##asily", + "tablets", + "Jase", + "##ttes", + "diner", + "##rns", + "Hu", + "Mohan", + "anytime", + "weighted", + "remixes", + "Dove", + "cherry", + "imports", + "##urity", + "GA", + "##TT", + "##iated", + "##sford", + "Clarkson", + "evidently", + "rugged", + "Dust", + "siding", + "##ometer", + "acquitted", + "choral", + "##mite", + "infants", + "Domenico", + "gallons", + "Atkinson", + "gestures", + "slated", + "##xa", + "Archaeology", + "unwanted", + "##ibes", + "##duced", + "premise", + "Colby", + "Geelong", + "disqualified", + "##pf", + "##voking", + "simplicity", + "Walkover", + "Qaeda", + "Warden", + "##bourg", + "##ān", + "Invasion", + "Babe", + "harness", + "183", + "##tated", + "maze", + "Burt", + "bedrooms", + "##nsley", + "Horizon", + "##oast", + "minimize", + "peeked", + "MLA", + "Trains", + "tractor", + "nudged", + "##iform", + "Growth", + "Benton", + "separates", + "##about", + "##kari", + "buffer", + "anthropology", + "brigades", + "foil", + "##wu", + "Domain", + "licking", + "whore", + "##rage", + "##sham", + "Initial", + "Courthouse", + "Rutgers", + "dams", + "villains", + "supermarket", + "##brush", + "Brunei", + "Palermo", + "arises", + "Passenger", + "outreach", + "##gill", + "Labrador", + "McLaren", + "##uy", + "Lori", + "##fires", + "Heads", + "magistrate", + "¹⁄₂", + "Weapons", + "##wai", + "##roke", + "projecting", + "##ulates", + "bordering", + "McKenzie", + "Pavel", + "midway", + "Guangzhou", + "streamed", + "racer", + "##lished", + "eccentric", + "spectral", + "206", + "##mism", + "Wilde", + "Grange", + "preparatory", + "lent", + "##tam", + "starving", + "Gertrude", + "##cea", + "##ricted", + "Breakfast", + "Mira", + "blurted", + "derive", + "##lair", + "blunt", + "sob", + "Cheltenham", + "Henrik", + "reinstated", + "intends", + "##istan", + "unite", + "##ector", + "playful", + "sparks", + "mapped", + "Cadet", + "luggage", + "prosperous", + "##ein", + "salon", + "##utes", + "Biological", + "##rland", + "Tyrone", + "buyer", + "##lose", + "amounted", + "Saw", + "smirked", + "Ronan", + "Reviews", + "Adele", + "trait", + "##proof", + "Bhutan", + "Ginger", + "##junct", + "digitally", + "stirring", + "##isted", + "coconut", + "Hamlet", + "Dinner", + "Scale", + "pledge", + "##RP", + "Wrong", + "Goal", + "Panel", + "therapeutic", + "elevations", + "infectious", + "priesthood", + "##inda", + "Guyana", + "diagnostic", + "##mbre", + "Blackwell", + "sails", + "##arm", + "literal", + "periodically", + "gleaming", + "Robot", + "Rector", + "##abulous", + "##tres", + "Reaching", + "Romantic", + "CP", + "Wonderful", + "##tur", + "ornamental", + "##nges", + "traitor", + "##zilla", + "genetics", + "mentioning", + "##eim", + "resonance", + "Areas", + "Shopping", + "##nard", + "Gail", + "Solid", + "##rito", + "##mara", + "Willem", + "Chip", + "Matches", + "Volkswagen", + "obstacle", + "Organ", + "invites", + "Coral", + "attain", + "##anus", + "##dates", + "Midway", + "shuffled", + "Cecilia", + "dessert", + "Gateway", + "Ch", + "Napoleonic", + "Petroleum", + "jets", + "goose", + "striped", + "bowls", + "vibration", + "Sims", + "nickel", + "Thirteen", + "problematic", + "intervene", + "##grading", + "##unds", + "Mum", + "semifinal", + "Radical", + "##izations", + "refurbished", + "##sation", + "##harine", + "Maximilian", + "cites", + "Advocate", + "Potomac", + "surged", + "preserves", + "Curry", + "angled", + "ordination", + "##pad", + "Cade", + "##DE", + "##sko", + "researched", + "torpedoes", + "Resident", + "wetlands", + "hay", + "applicants", + "depart", + "Bernstein", + "##pic", + "##ario", + "##rae", + "favourable", + "##wari", + "##р", + "metabolism", + "nobleman", + "Defaulted", + "calculate", + "ignition", + "Celebrity", + "Belize", + "sulfur", + "Flat", + "Sc", + "USB", + "flicker", + "Hertfordshire", + "Sept", + "CFL", + "Pasadena", + "Saturdays", + "Titus", + "##nir", + "Canary", + "Computing", + "Isaiah", + "##mler", + "formidable", + "pulp", + "orchid", + "Called", + "Solutions", + "kilograms", + "steamer", + "##hil", + "Doncaster", + "successors", + "Stokes", + "Holstein", + "##sius", + "sperm", + "API", + "Rogue", + "instability", + "Acoustic", + "##rag", + "159", + "undercover", + "Wouldn", + "##pra", + "##medical", + "Eliminated", + "honorable", + "##chel", + "denomination", + "abrupt", + "Buffy", + "blouse", + "fi", + "Regardless", + "Subsequent", + "##rdes", + "Lover", + "##tford", + "bacon", + "##emia", + "carving", + "##cripts", + "Massacre", + "Ramos", + "Latter", + "##ulp", + "ballroom", + "##gement", + "richest", + "bruises", + "Rest", + "Wiley", + "##aster", + "explosions", + "##lastic", + "Edo", + "##LD", + "Mir", + "choking", + "disgusted", + "faintly", + "Barracks", + "blasted", + "headlights", + "Tours", + "ensued", + "presentations", + "##cale", + "wrought", + "##oat", + "##coa", + "Quaker", + "##sdale", + "recipe", + "##gny", + "corpses", + "##liance", + "comfortably", + "##wat", + "Landscape", + "niche", + "catalyst", + "##leader", + "Securities", + "messy", + "##RL", + "Rodrigo", + "backdrop", + "##opping", + "treats", + "Emilio", + "Anand", + "bilateral", + "meadow", + "VC", + "socialism", + "##grad", + "clinics", + "##itating", + "##ppe", + "##ymphonic", + "seniors", + "Advisor", + "Armoured", + "Method", + "Alley", + "##orio", + "Sad", + "fueled", + "raided", + "Axel", + "NH", + "rushes", + "Dixie", + "Otis", + "wrecked", + "##22", + "capitalism", + "café", + "##bbe", + "##pion", + "##forcing", + "Aubrey", + "Lublin", + "Whenever", + "Sears", + "Scheme", + "##lana", + "Meadows", + "treatise", + "##RI", + "##ustic", + "sacrifices", + "sustainability", + "Biography", + "mystical", + "Wanted", + "multiplayer", + "Applications", + "disliked", + "##tisfied", + "impaired", + "empirical", + "forgetting", + "Fairfield", + "Sunni", + "blurred", + "Growing", + "Avalon", + "coil", + "Camera", + "Skin", + "bruised", + "terminals", + "##fted", + "##roving", + "Commando", + "##hya", + "##sper", + "reservations", + "needles", + "dangling", + "##rsch", + "##rsten", + "##spect", + "##mbs", + "yoga", + "regretted", + "Bliss", + "Orion", + "Rufus", + "glucose", + "Olsen", + "autobiographical", + "##dened", + "222", + "humidity", + "Shan", + "##ifiable", + "supper", + "##rou", + "flare", + "##MO", + "campaigning", + "descend", + "socio", + "declares", + "Mounted", + "Gracie", + "Arte", + "endurance", + "##ety", + "Copper", + "costa", + "airplay", + "##MB", + "Proceedings", + "dislike", + "grimaced", + "occupants", + "births", + "glacial", + "oblivious", + "cans", + "installment", + "muddy", + "##ł", + "captains", + "pneumonia", + "Quiet", + "Sloan", + "Excuse", + "##nine", + "Geography", + "gymnastics", + "multimedia", + "drains", + "Anthology", + "Gear", + "cylindrical", + "Fry", + "undertaking", + "##pler", + "##tility", + "Nan", + "##recht", + "Dub", + "philosophers", + "piss", + "Atari", + "##pha", + "Galicia", + "México", + "##nking", + "Continuing", + "bump", + "graveyard", + "persisted", + "Shrine", + "##erapy", + "defects", + "Advance", + "Bomber", + "##oil", + "##ffling", + "cheerful", + "##lix", + "scrub", + "##eto", + "awkwardly", + "collaborator", + "fencing", + "##alo", + "prophet", + "Croix", + "coughed", + "##lication", + "roadway", + "slaughter", + "elephants", + "##erated", + "Simpsons", + "vulnerability", + "ivory", + "Birth", + "lizard", + "scarce", + "cylinders", + "fortunes", + "##NL", + "Hate", + "Priory", + "##lai", + "McBride", + "##copy", + "Lenny", + "liaison", + "Triangle", + "coronation", + "sampled", + "savage", + "amidst", + "Grady", + "whatsoever", + "instinctively", + "Reconstruction", + "insides", + "seizure", + "Drawing", + "##rlin", + "Antioch", + "Gao", + "Díaz", + "1760", + "Sparks", + "##tien", + "##bidae", + "rehearsal", + "##bbs", + "botanical", + "##hers", + "compensate", + "wholesale", + "Seville", + "shareholder", + "prediction", + "astronomical", + "Reddy", + "hardest", + "circling", + "whereabouts", + "termination", + "Rep", + "Assistance", + "Dramatic", + "Herb", + "##ghter", + "climbs", + "188", + "Poole", + "301", + "##pable", + "wit", + "##istice", + "Walters", + "relying", + "Jakob", + "##redo", + "proceeding", + "Langley", + "affiliates", + "ou", + "##allo", + "##holm", + "Samsung", + "##ishi", + "Missing", + "Xi", + "vertices", + "Claus", + "foam", + "restless", + "##uating", + "##sso", + "##ttering", + "Philips", + "delta", + "bombed", + "Catalogue", + "coaster", + "Ling", + "Willard", + "satire", + "410", + "Composition", + "Net", + "Orioles", + "##ldon", + "fins", + "Palatinate", + "Woodward", + "tease", + "tilt", + "brightness", + "##70", + "##bbling", + "##loss", + "##dhi", + "##uilt", + "Whoever", + "##yers", + "hitter", + "Elton", + "Extension", + "ace", + "Affair", + "restructuring", + "##loping", + "Paterson", + "hi", + "##rya", + "spouse", + "Shay", + "Himself", + "piles", + "preaching", + "##gical", + "bikes", + "Brave", + "expulsion", + "Mirza", + "stride", + "Trees", + "commemorated", + "famine", + "masonry", + "Selena", + "Watt", + "Banking", + "Rancho", + "Stockton", + "dip", + "tattoos", + "Vlad", + "acquainted", + "Flyers", + "ruthless", + "fourteenth", + "illustrate", + "##akes", + "EPA", + "##rows", + "##uiz", + "bumped", + "Designed", + "Leaders", + "mastered", + "Manfred", + "swirled", + "McCain", + "##rout", + "Artemis", + "rabbi", + "flinched", + "upgrades", + "penetrate", + "shipyard", + "transforming", + "caretaker", + "##eiro", + "Maureen", + "tightening", + "##founded", + "RAM", + "##icular", + "##mper", + "##rung", + "Fifteen", + "exploited", + "consistency", + "interstate", + "##ynn", + "Bridget", + "contamination", + "Mistress", + "##rup", + "coating", + "##FP", + "##jective", + "Libyan", + "211", + "Gemma", + "dependence", + "shrubs", + "##ggled", + "Germain", + "retaliation", + "traction", + "##PP", + "Dangerous", + "terminology", + "psychiatrist", + "##garten", + "hurdles", + "Natal", + "wasting", + "Weir", + "revolves", + "stripe", + "##reased", + "preferences", + "##entation", + "##lde", + "##áil", + "##otherapy", + "Flame", + "##ologies", + "viruses", + "Label", + "Pandora", + "veil", + "##ogical", + "Coliseum", + "Cottage", + "creeping", + "Jong", + "lectured", + "##çaise", + "shoreline", + "##fference", + "##hra", + "Shade", + "Clock", + "Faye", + "bilingual", + "Humboldt", + "Operating", + "##fter", + "##was", + "algae", + "towed", + "amphibious", + "Parma", + "impacted", + "smacked", + "Piedmont", + "Monsters", + "##omb", + "Moor", + "##lberg", + "sinister", + "Postal", + "178", + "Drummond", + "Sign", + "textbooks", + "hazardous", + "Brass", + "Rosemary", + "Pick", + "Sit", + "Architect", + "transverse", + "Centennial", + "confess", + "polling", + "##aia", + "Julien", + "##mand", + "consolidation", + "Ethel", + "##ulse", + "severity", + "Yorker", + "choreographer", + "1840s", + "##ltry", + "softer", + "versa", + "##geny", + "##quila", + "##jō", + "Caledonia", + "Friendship", + "Visa", + "rogue", + "##zzle", + "bait", + "feather", + "incidence", + "Foods", + "Ships", + "##uto", + "##stead", + "arousal", + "##rote", + "Hazel", + "##bolic", + "Swing", + "##ej", + "##cule", + "##jana", + "##metry", + "##uity", + "Valuable", + "##ₙ", + "Shropshire", + "##nect", + "365", + "Ones", + "realise", + "Café", + "Albuquerque", + "##grown", + "##stadt", + "209", + "##ᵢ", + "prefers", + "withstand", + "Lillian", + "MacArthur", + "Hara", + "##fulness", + "domination", + "##VO", + "##school", + "Freddy", + "ethnicity", + "##while", + "adorned", + "hormone", + "Calder", + "Domestic", + "Freud", + "Shields", + "##phus", + "##rgan", + "BP", + "Segunda", + "Mustang", + "##GI", + "Bonn", + "patiently", + "remarried", + "##umbria", + "Crete", + "Elephant", + "Nuremberg", + "tolerate", + "Tyson", + "##evich", + "Programming", + "##lander", + "Bethlehem", + "segregation", + "Constituency", + "quarterly", + "blushed", + "photographers", + "Sheldon", + "porcelain", + "Blanche", + "goddamn", + "lively", + "##fused", + "bumps", + "##eli", + "curated", + "coherent", + "provoked", + "##vet", + "Madeleine", + "##isco", + "rainy", + "Bethel", + "accusation", + "ponytail", + "gag", + "##lington", + "quicker", + "scroll", + "##vate", + "Bow", + "Gender", + "Ira", + "crashes", + "ACT", + "Maintenance", + "##aton", + "##ieu", + "bitterly", + "strains", + "rattled", + "vectors", + "##arina", + "##ishly", + "173", + "parole", + "##nx", + "amusing", + "Gonzalez", + "##erative", + "Caucus", + "sensual", + "Penelope", + "coefficient", + "Mateo", + "##mani", + "proposition", + "Duty", + "lacrosse", + "proportions", + "Plato", + "profiles", + "Botswana", + "Brandt", + "reins", + "mandolin", + "encompassing", + "##gens", + "Kahn", + "prop", + "summon", + "##MR", + "##yrian", + "##zaki", + "Falling", + "conditional", + "thy", + "##bao", + "##ych", + "radioactive", + "##nics", + "Newspaper", + "##people", + "##nded", + "Gaming", + "sunny", + "##look", + "Sherwood", + "crafted", + "NJ", + "awoke", + "187", + "timeline", + "giants", + "possessing", + "##ycle", + "Cheryl", + "ng", + "Ruiz", + "polymer", + "potassium", + "Ramsay", + "relocation", + "##leen", + "Sociology", + "##bana", + "Franciscan", + "propulsion", + "denote", + "##erjee", + "registers", + "headline", + "Tests", + "emerges", + "Articles", + "Mint", + "livery", + "breakup", + "kits", + "Rap", + "Browning", + "Bunny", + "##mington", + "##watch", + "Anastasia", + "Zachary", + "arranging", + "biographical", + "Erica", + "Nippon", + "##membrance", + "Carmel", + "##sport", + "##xes", + "Paddy", + "##holes", + "Issues", + "Spears", + "compliment", + "##stro", + "##graphs", + "Castillo", + "##MU", + "##space", + "Corporal", + "##nent", + "174", + "Gentlemen", + "##ilize", + "##vage", + "convinces", + "Carmine", + "Crash", + "##hashi", + "Files", + "Doctors", + "brownish", + "sweating", + "goats", + "##conductor", + "rendition", + "##bt", + "NL", + "##spiration", + "generates", + "##cans", + "obsession", + "##noy", + "Danger", + "Diaz", + "heats", + "Realm", + "priorities", + "##phon", + "1300", + "initiation", + "pagan", + "bursts", + "archipelago", + "chloride", + "Screenplay", + "Hewitt", + "Khmer", + "bang", + "judgement", + "negotiating", + "##ait", + "Mabel", + "densely", + "Boulder", + "knob", + "430", + "Alfredo", + "##kt", + "pitches", + "##ées", + "##ان", + "Macdonald", + "##llum", + "imply", + "##mot", + "Smile", + "spherical", + "##tura", + "Derrick", + "Kelley", + "Nico", + "cortex", + "launches", + "differed", + "parallels", + "Navigation", + "##child", + "##rming", + "canoe", + "forestry", + "reinforce", + "##mote", + "confirming", + "tasting", + "scaled", + "##resh", + "##eting", + "Understanding", + "prevailing", + "Pearce", + "CW", + "earnest", + "Gaius", + "asserts", + "denoted", + "landmarks", + "Chargers", + "warns", + "##flies", + "Judges", + "jagged", + "##dain", + "tails", + "Historian", + "Millie", + "##sler", + "221", + "##uard", + "absurd", + "Dion", + "##ially", + "makeshift", + "Specifically", + "ignorance", + "Eat", + "##ieri", + "comparisons", + "forensic", + "186", + "Giro", + "skeptical", + "disciplinary", + "battleship", + "##45", + "Libby", + "520", + "Odyssey", + "ledge", + "##post", + "Eternal", + "Missionary", + "deficiency", + "settler", + "wonders", + "##gai", + "raging", + "##cis", + "Romney", + "Ulrich", + "annexation", + "boxers", + "sect", + "204", + "ARIA", + "dei", + "Hitchcock", + "te", + "Varsity", + "##fic", + "CC", + "lending", + "##nial", + "##tag", + "##rdy", + "##obe", + "Defensive", + "##dson", + "##pore", + "stellar", + "Lam", + "Trials", + "contention", + "Sung", + "##uminous", + "Poe", + "superiority", + "##plicate", + "325", + "bitten", + "conspicuous", + "##olly", + "Lila", + "Pub", + "Petit", + "distorted", + "ISIL", + "distinctly", + "##family", + "Cowboy", + "mutant", + "##cats", + "##week", + "Changes", + "Sinatra", + "epithet", + "neglect", + "Innocent", + "gamma", + "thrill", + "reggae", + "##adia", + "##ational", + "##due", + "landlord", + "##leaf", + "visibly", + "##ì", + "Darlington", + "Gomez", + "##iting", + "scarf", + "##lade", + "Hinduism", + "Fever", + "scouts", + "##roi", + "convened", + "##oki", + "184", + "Lao", + "boycott", + "unemployed", + "##lore", + "##ß", + "##hammer", + "Curran", + "disciples", + "odor", + "##ygiene", + "Lighthouse", + "Played", + "whales", + "discretion", + "Yves", + "##ceived", + "pauses", + "coincide", + "##nji", + "dizzy", + "##scopic", + "routed", + "Guardians", + "Kellan", + "carnival", + "nasal", + "224", + "##awed", + "Mitsubishi", + "640", + "Cast", + "silky", + "Projects", + "joked", + "Huddersfield", + "Rothschild", + "zu", + "##olar", + "Divisions", + "mildly", + "##eni", + "##lge", + "Appalachian", + "Sahara", + "pinch", + "##roon", + "wardrobe", + "##dham", + "##etal", + "Bubba", + "##lini", + "##rumbling", + "Communities", + "Poznań", + "unification", + "Beau", + "Kris", + "SV", + "Rowing", + "Minh", + "reconciliation", + "##saki", + "##sor", + "taped", + "##reck", + "certificates", + "gubernatorial", + "rainbow", + "##uing", + "litter", + "##lique", + "##oted", + "Butterfly", + "benefited", + "Images", + "induce", + "Balkans", + "Velvet", + "##90", + "##xon", + "Bowman", + "##breaker", + "penis", + "##nitz", + "##oint", + "##otive", + "crust", + "##pps", + "organizers", + "Outdoor", + "nominees", + "##rika", + "TX", + "##ucks", + "Protestants", + "##imation", + "appetite", + "Baja", + "awaited", + "##points", + "windshield", + "##igh", + "##zled", + "Brody", + "Buster", + "stylized", + "Bryce", + "##sz", + "Dollar", + "vest", + "mold", + "ounce", + "ok", + "receivers", + "##uza", + "Purdue", + "Harrington", + "Hodges", + "captures", + "##ggio", + "Reservation", + "##ssin", + "##tman", + "cosmic", + "straightforward", + "flipping", + "remixed", + "##athed", + "Gómez", + "Lim", + "motorcycles", + "economies", + "owning", + "Dani", + "##rosis", + "myths", + "sire", + "kindly", + "1768", + "Bean", + "graphs", + "##mee", + "##RO", + "##geon", + "puppy", + "Stephenson", + "notified", + "##jer", + "Watching", + "##rama", + "Sino", + "urgency", + "Islanders", + "##mash", + "Plata", + "fumble", + "##chev", + "##stance", + "##rack", + "##she", + "facilitated", + "swings", + "akin", + "enduring", + "payload", + "##phine", + "Deputies", + "murals", + "##tooth", + "610", + "Jays", + "eyeing", + "##quito", + "transparency", + "##cote", + "Timor", + "negatively", + "##isan", + "battled", + "##fected", + "thankful", + "Rage", + "hospitality", + "incorrectly", + "207", + "entrepreneurs", + "##cula", + "##wley", + "hedge", + "##cratic", + "Corpus", + "Odessa", + "Whereas", + "##ln", + "fetch", + "happier", + "Amherst", + "bullying", + "graceful", + "Height", + "Bartholomew", + "willingness", + "qualifier", + "191", + "Syed", + "Wesleyan", + "Layla", + "##rrence", + "Webber", + "##hum", + "Rat", + "##cket", + "##herence", + "Monterey", + "contaminated", + "Beside", + "Mustafa", + "Nana", + "213", + "##pruce", + "Reason", + "##spense", + "spike", + "##gé", + "AU", + "disciple", + "charcoal", + "##lean", + "formulated", + "Diesel", + "Mariners", + "accreditation", + "glossy", + "1800s", + "##ih", + "Mainz", + "unison", + "Marianne", + "shear", + "overseeing", + "vernacular", + "bowled", + "##lett", + "unpopular", + "##ckoned", + "##monia", + "Gaston", + "##TI", + "##oters", + "Cups", + "##bones", + "##ports", + "Museo", + "minors", + "1773", + "Dickens", + "##EL", + "##NBC", + "Presents", + "ambitions", + "axes", + "Río", + "Yukon", + "bedside", + "Ribbon", + "Units", + "faults", + "conceal", + "##lani", + "prevailed", + "214", + "Goodwin", + "Jaguar", + "crumpled", + "Cullen", + "Wireless", + "ceded", + "remotely", + "Bin", + "mocking", + "straps", + "ceramics", + "##avi", + "##uding", + "##ader", + "Taft", + "twenties", + "##aked", + "Problem", + "quasi", + "Lamar", + "##ntes", + "##avan", + "Barr", + "##eral", + "hooks", + "sa", + "##ône", + "194", + "##ross", + "Nero", + "Caine", + "trance", + "Homeland", + "benches", + "Guthrie", + "dismiss", + "##lex", + "César", + "foliage", + "##oot", + "##alty", + "Assyrian", + "Ahead", + "Murdoch", + "dictatorship", + "wraps", + "##ntal", + "Corridor", + "Mackay", + "respectable", + "jewels", + "understands", + "##pathic", + "Bryn", + "##tep", + "ON", + "capsule", + "intrigued", + "Sleeping", + "communists", + "##chayat", + "##current", + "##vez", + "doubling", + "booklet", + "##uche", + "Creed", + "##NU", + "spies", + "##sef", + "adjusting", + "197", + "Imam", + "heaved", + "Tanya", + "canonical", + "restraint", + "senators", + "stainless", + "##gnate", + "Matter", + "cache", + "restrained", + "conflicting", + "stung", + "##ool", + "Sustainable", + "antiquity", + "193", + "heavens", + "inclusive", + "##ador", + "fluent", + "303", + "911", + "archaeologist", + "superseded", + "##plex", + "Tammy", + "inspire", + "##passing", + "##lub", + "Lama", + "Mixing", + "##activated", + "##yote", + "parlor", + "tactic", + "198", + "Stefano", + "prostitute", + "recycling", + "sorted", + "banana", + "Stacey", + "Musée", + "aristocratic", + "cough", + "##rting", + "authorised", + "gangs", + "runoff", + "thoughtfully", + "##nish", + "Fisheries", + "Provence", + "detector", + "hum", + "##zhen", + "pill", + "##árez", + "Map", + "Leaves", + "Peabody", + "skater", + "vent", + "##color", + "390", + "cerebral", + "hostages", + "mare", + "Jurassic", + "swell", + "##isans", + "Knoxville", + "Naked", + "Malaya", + "scowl", + "Cobra", + "##anga", + "Sexual", + "##dron", + "##iae", + "196", + "##drick", + "Ravens", + "Blaine", + "##throp", + "Ismail", + "symmetric", + "##lossom", + "Leicestershire", + "Sylvester", + "glazed", + "##tended", + "Radar", + "fused", + "Families", + "Blacks", + "Sale", + "Zion", + "foothills", + "microwave", + "slain", + "Collingwood", + "##pants", + "##dling", + "killers", + "routinely", + "Janice", + "hearings", + "##chanted", + "##ltration", + "continents", + "##iving", + "##yster", + "##shot", + "##yna", + "injected", + "Guillaume", + "##ibi", + "kinda", + "Confederacy", + "Barnett", + "disasters", + "incapable", + "##grating", + "rhythms", + "betting", + "draining", + "##hak", + "Callie", + "Glover", + "##iliated", + "Sherlock", + "hearted", + "punching", + "Wolverhampton", + "Leaf", + "Pi", + "builders", + "furnished", + "knighted", + "Photo", + "##zle", + "Touring", + "fumbled", + "pads", + "##ий", + "Bartlett", + "Gunner", + "eerie", + "Marius", + "Bonus", + "pots", + "##hino", + "##pta", + "Bray", + "Frey", + "Ortiz", + "stalls", + "belongings", + "Subway", + "fascination", + "metaphor", + "Bat", + "Boer", + "Colchester", + "sway", + "##gro", + "rhetoric", + "##dheim", + "Fool", + "PMID", + "admire", + "##hsil", + "Strand", + "TNA", + "##roth", + "Nottinghamshire", + "##mat", + "##yler", + "Oxfordshire", + "##nacle", + "##roner", + "BS", + "##nces", + "stimulus", + "transports", + "Sabbath", + "##postle", + "Richter", + "4000", + "##grim", + "##shima", + "##lette", + "deteriorated", + "analogous", + "##ratic", + "UHF", + "energies", + "inspiring", + "Yiddish", + "Activities", + "##quential", + "##boe", + "Melville", + "##ilton", + "Judd", + "consonants", + "labs", + "smuggling", + "##fari", + "avid", + "##uc", + "truce", + "undead", + "##raith", + "Mostly", + "bracelet", + "Connection", + "Hussain", + "awhile", + "##UC", + "##vention", + "liable", + "genetically", + "##phic", + "Important", + "Wildcats", + "daddy", + "transmit", + "##cas", + "conserved", + "Yesterday", + "##lite", + "Nicky", + "Guys", + "Wilder", + "Lay", + "skinned", + "Communists", + "Garfield", + "Nearby", + "organizer", + "Loss", + "crafts", + "walkway", + "Chocolate", + "Sundance", + "Synod", + "##enham", + "modify", + "swayed", + "Surface", + "analysts", + "brackets", + "drone", + "parachute", + "smelling", + "Andrés", + "filthy", + "frogs", + "vertically", + "##OK", + "localities", + "marries", + "AHL", + "35th", + "##pian", + "Palazzo", + "cube", + "dismay", + "relocate", + "##на", + "Hear", + "##digo", + "##oxide", + "prefecture", + "converts", + "hangar", + "##oya", + "##ucking", + "Spectrum", + "deepened", + "spoiled", + "Keeping", + "##phobic", + "Verona", + "outrage", + "Improvement", + "##UI", + "masterpiece", + "slung", + "Calling", + "chant", + "Haute", + "mediated", + "manipulated", + "affirmed", + "##hesis", + "Hangul", + "skies", + "##llan", + "Worcestershire", + "##kos", + "mosaic", + "##bage", + "##wned", + "Putnam", + "folder", + "##LM", + "guts", + "noteworthy", + "##rada", + "AJ", + "sculpted", + "##iselle", + "##rang", + "recognizable", + "##pent", + "dolls", + "lobbying", + "impatiently", + "Se", + "staple", + "Serb", + "tandem", + "Hiroshima", + "thieves", + "##ynx", + "faculties", + "Norte", + "##alle", + "##trusion", + "chords", + "##ylon", + "Gareth", + "##lops", + "##escu", + "FIA", + "Levin", + "auspices", + "groin", + "Hui", + "nun", + "Listed", + "Honourable", + "Larsen", + "rigorous", + "##erer", + "Tonga", + "##pment", + "##rave", + "##track", + "##aa", + "##enary", + "540", + "clone", + "sediment", + "esteem", + "sighted", + "cruelty", + "##boa", + "inverse", + "violating", + "Amtrak", + "Status", + "amalgamated", + "vertex", + "AR", + "harmless", + "Amir", + "mounts", + "Coronation", + "counseling", + "Audi", + "CO₂", + "splits", + "##eyer", + "Humans", + "Salmon", + "##have", + "##rado", + "##čić", + "216", + "takeoff", + "classmates", + "psychedelic", + "##gni", + "Gypsy", + "231", + "Anger", + "GAA", + "ME", + "##nist", + "##tals", + "Lissa", + "Odd", + "baptized", + "Fiat", + "fringe", + "##hren", + "179", + "elevators", + "perspectives", + "##TF", + "##ngle", + "Question", + "frontal", + "950", + "thicker", + "Molecular", + "##nological", + "Sixteen", + "Baton", + "Hearing", + "commemorative", + "dorm", + "Architectural", + "purity", + "##erse", + "risky", + "Georgie", + "relaxing", + "##ugs", + "downed", + "##rar", + "Slim", + "##phy", + "IUCN", + "##thorpe", + "Parkinson", + "217", + "Marley", + "Shipping", + "sweaty", + "Jesuits", + "Sindh", + "Janata", + "implying", + "Armenians", + "intercept", + "Ankara", + "commissioners", + "ascended", + "sniper", + "Grass", + "Walls", + "salvage", + "Dewey", + "generalized", + "learnt", + "PT", + "##fighter", + "##tech", + "DR", + "##itrus", + "##zza", + "mercenaries", + "slots", + "##burst", + "##finger", + "##nsky", + "Princes", + "Rhodesia", + "##munication", + "##strom", + "Fremantle", + "homework", + "ins", + "##Os", + "##hao", + "##uffed", + "Thorpe", + "Xiao", + "exquisite", + "firstly", + "liberated", + "technician", + "Oilers", + "Phyllis", + "herb", + "sharks", + "MBE", + "##stock", + "Product", + "banjo", + "##morandum", + "##than", + "Visitors", + "unavailable", + "unpublished", + "oxidation", + "Vogue", + "##copic", + "##etics", + "Yates", + "##ppard", + "Leiden", + "Trading", + "cottages", + "Principles", + "##Millan", + "##wife", + "##hiva", + "Vicar", + "nouns", + "strolled", + "##eorological", + "##eton", + "##science", + "precedent", + "Armand", + "Guido", + "rewards", + "##ilis", + "##tise", + "clipped", + "chick", + "##endra", + "averages", + "tentatively", + "1830s", + "##vos", + "Certainly", + "305", + "Société", + "Commandant", + "##crats", + "##dified", + "##nka", + "marsh", + "angered", + "ventilation", + "Hutton", + "Ritchie", + "##having", + "Eclipse", + "flick", + "motionless", + "Amor", + "Fest", + "Loire", + "lays", + "##icit", + "##sband", + "Guggenheim", + "Luck", + "disrupted", + "##ncia", + "Disco", + "##vigator", + "criticisms", + "grins", + "##lons", + "##vial", + "##ody", + "salute", + "Coaches", + "junk", + "saxophonist", + "##eology", + "Uprising", + "Diet", + "##marks", + "chronicles", + "robbed", + "##iet", + "##ahi", + "Bohemian", + "magician", + "wavelength", + "Kenyan", + "augmented", + "fashionable", + "##ogies", + "Luce", + "F1", + "Monmouth", + "##jos", + "##loop", + "enjoyment", + "exemption", + "Centers", + "##visor", + "Soundtrack", + "blinding", + "practitioner", + "solidarity", + "sacrificed", + "##oso", + "##cture", + "##riated", + "blended", + "Abd", + "Copyright", + "##nob", + "34th", + "##reak", + "Claudio", + "hectare", + "rotor", + "testify", + "##ends", + "##iably", + "##sume", + "landowner", + "##cess", + "##ckman", + "Eduard", + "Silesian", + "backseat", + "mutually", + "##abe", + "Mallory", + "bounds", + "Collective", + "Poet", + "Winkler", + "pertaining", + "scraped", + "Phelps", + "crane", + "flickering", + "Proto", + "bubbles", + "popularized", + "removes", + "##86", + "Cadillac", + "Warfare", + "audible", + "rites", + "shivering", + "##sist", + "##nst", + "##biotic", + "Mon", + "fascist", + "Bali", + "Kathryn", + "ambiguous", + "furiously", + "morale", + "patio", + "Sang", + "inconsistent", + "topology", + "Greens", + "monkeys", + "Köppen", + "189", + "Toy", + "vow", + "##ías", + "bombings", + "##culus", + "improvised", + "lodged", + "subsidiaries", + "garment", + "startling", + "practised", + "Hume", + "Thorn", + "categorized", + "Till", + "Eileen", + "wedge", + "##64", + "Federico", + "patriotic", + "unlock", + "##oshi", + "badminton", + "Compared", + "Vilnius", + "##KE", + "Crimean", + "Kemp", + "decks", + "spaced", + "resolutions", + "sighs", + "##mind", + "Imagine", + "Cartoon", + "huddled", + "policemen", + "forwards", + "##rouch", + "equals", + "##nter", + "inspected", + "Charley", + "MG", + "##rte", + "pamphlet", + "Arturo", + "dans", + "scarcely", + "##ulton", + "##rvin", + "parental", + "unconstitutional", + "watts", + "Susannah", + "Dare", + "##sitive", + "Rowland", + "Valle", + "invalid", + "##ué", + "Detachment", + "acronym", + "Yokohama", + "verified", + "##lsson", + "groove", + "Liza", + "clarified", + "compromised", + "265", + "##rgon", + "##orf", + "hesitant", + "Fruit", + "Application", + "Mathias", + "icons", + "##cell", + "Qin", + "interventions", + "##uron", + "punt", + "remnant", + "##rien", + "Ames", + "manifold", + "spines", + "floral", + "##zable", + "comrades", + "Fallen", + "orbits", + "Annals", + "hobby", + "Auditorium", + "implicated", + "researching", + "Pueblo", + "Ta", + "terminate", + "##pella", + "Rings", + "approximation", + "fuzzy", + "##ús", + "thriving", + "##ket", + "Conor", + "alarmed", + "etched", + "Cary", + "##rdon", + "Ally", + "##rington", + "Pay", + "mint", + "##hasa", + "##unity", + "##dman", + "##itate", + "Oceania", + "furrowed", + "trams", + "##aq", + "Wentworth", + "ventured", + "choreography", + "prototypes", + "Patel", + "mouthed", + "trenches", + "##licing", + "##yya", + "Lies", + "deception", + "##erve", + "##vations", + "Bertrand", + "earthquakes", + "##tography", + "Southwestern", + "##aja", + "token", + "Gupta", + "##yō", + "Beckett", + "initials", + "ironic", + "Tsar", + "subdued", + "shootout", + "sobbing", + "liar", + "Scandinavia", + "Souls", + "ch", + "therapist", + "trader", + "Regulation", + "Kali", + "busiest", + "##pation", + "32nd", + "Telephone", + "Vargas", + "##moky", + "##nose", + "##uge", + "Favorite", + "abducted", + "bonding", + "219", + "255", + "correction", + "mat", + "drown", + "fl", + "unbeaten", + "Pocket", + "Summers", + "Quite", + "rods", + "Percussion", + "##ndy", + "buzzing", + "cadet", + "Wilkes", + "attire", + "directory", + "utilities", + "naive", + "populous", + "Hendrix", + "##actor", + "disadvantage", + "1400", + "Landon", + "Underworld", + "##ense", + "Occasionally", + "mercury", + "Davey", + "Morley", + "spa", + "wrestled", + "##vender", + "eclipse", + "Sienna", + "supplemented", + "thou", + "Stream", + "liturgical", + "##gall", + "##berries", + "##piration", + "1769", + "Bucks", + "abandoning", + "##jutant", + "##nac", + "232", + "venom", + "##31", + "Roche", + "dotted", + "Currie", + "Córdoba", + "Milo", + "Sharif", + "divides", + "justification", + "prejudice", + "fortunate", + "##vide", + "##ābād", + "Rowe", + "inflammatory", + "##eld", + "avenue", + "Sources", + "##rimal", + "Messenger", + "Blanco", + "advocating", + "formulation", + "##pute", + "emphasizes", + "nut", + "Armored", + "##ented", + "nutrients", + "##tment", + "insistence", + "Martins", + "landowners", + "##RB", + "comparatively", + "headlines", + "snaps", + "##qing", + "Celebration", + "##mad", + "republican", + "##NE", + "Trace", + "##500", + "1771", + "proclamation", + "NRL", + "Rubin", + "Buzz", + "Weimar", + "##AG", + "199", + "posthumous", + "##ental", + "##deacon", + "Distance", + "intensely", + "overheard", + "Arcade", + "diagonal", + "hazard", + "Giving", + "weekdays", + "##ù", + "Verdi", + "actresses", + "##hare", + "Pulling", + "##erries", + "##pores", + "catering", + "shortest", + "##ctors", + "##cure", + "##restle", + "##reta", + "##runch", + "##brecht", + "##uddin", + "Moments", + "senate", + "Feng", + "Prescott", + "##thest", + "218", + "divisional", + "Bertie", + "sparse", + "surrounds", + "coupling", + "gravitational", + "werewolves", + "##lax", + "Rankings", + "##mated", + "##tries", + "Shia", + "##mart", + "##23", + "##vocative", + "interfaces", + "morphology", + "newscast", + "##bide", + "inputs", + "solicitor", + "Olaf", + "cabinets", + "puzzles", + "##tains", + "Unified", + "##firmed", + "WA", + "solemn", + "##opy", + "Tito", + "Jaenelle", + "Neolithic", + "horseback", + "##ires", + "pharmacy", + "prevalence", + "##lint", + "Swami", + "##bush", + "##tudes", + "Philipp", + "mythical", + "divers", + "Scouting", + "aperture", + "progressively", + "##bay", + "##nio", + "bounce", + "Floor", + "##elf", + "Lucan", + "adulthood", + "helm", + "Bluff", + "Passage", + "Salvation", + "lemon", + "napkin", + "scheduling", + "##gets", + "Elements", + "Mina", + "Novak", + "stalled", + "##llister", + "Infrastructure", + "##nky", + "##tania", + "##uished", + "Katz", + "Norma", + "sucks", + "trusting", + "1765", + "boilers", + "Accordingly", + "##hered", + "223", + "Crowley", + "##fight", + "##ulo", + "Henrietta", + "##hani", + "pounder", + "surprises", + "##chor", + "##glia", + "Dukes", + "##cracy", + "##zier", + "##fs", + "Patriot", + "silicon", + "##VP", + "simulcast", + "telegraph", + "Mysore", + "cardboard", + "Len", + "##QL", + "Auguste", + "accordion", + "analytical", + "specify", + "ineffective", + "hunched", + "abnormal", + "Transylvania", + "##dn", + "##tending", + "Emilia", + "glittering", + "Maddy", + "##wana", + "1762", + "External", + "Lecture", + "endorsement", + "Hernández", + "Anaheim", + "Ware", + "offences", + "##phorus", + "Plantation", + "popping", + "Bonaparte", + "disgusting", + "neared", + "##notes", + "Identity", + "heroin", + "nicely", + "##raverse", + "apron", + "congestion", + "##PR", + "padded", + "##fts", + "invaders", + "##came", + "freshly", + "Halle", + "endowed", + "fracture", + "ROM", + "##max", + "sediments", + "diffusion", + "dryly", + "##tara", + "Tam", + "Draw", + "Spin", + "Talon", + "Anthropology", + "##lify", + "nausea", + "##shirt", + "insert", + "Fresno", + "capitalist", + "indefinitely", + "apples", + "Gift", + "scooped", + "60s", + "Cooperative", + "mistakenly", + "##lover", + "murmur", + "##iger", + "Equipment", + "abusive", + "orphanage", + "##9th", + "##lterweight", + "##unda", + "Baird", + "ant", + "saloon", + "33rd", + "Chesapeake", + "##chair", + "##sound", + "##tend", + "chaotic", + "pornography", + "brace", + "##aret", + "heiress", + "SSR", + "resentment", + "Arbor", + "headmaster", + "##uren", + "unlimited", + "##with", + "##jn", + "Bram", + "Ely", + "Pokémon", + "pivotal", + "##guous", + "Database", + "Marta", + "Shine", + "stumbling", + "##ovsky", + "##skin", + "Henley", + "Polk", + "functioned", + "##layer", + "##pas", + "##udd", + "##MX", + "blackness", + "cadets", + "feral", + "Damian", + "##actions", + "2D", + "##yla", + "Apocalypse", + "##aic", + "inactivated", + "##china", + "##kovic", + "##bres", + "destroys", + "nap", + "Macy", + "sums", + "Madhya", + "Wisdom", + "rejects", + "##amel", + "60th", + "Cho", + "bandwidth", + "##sons", + "##obbing", + "##orama", + "Mutual", + "shafts", + "##estone", + "##rsen", + "accord", + "replaces", + "waterfront", + "##gonal", + "##rida", + "convictions", + "##ays", + "calmed", + "suppliers", + "Cummings", + "GMA", + "fearful", + "Scientist", + "Sinai", + "examines", + "experimented", + "Netflix", + "Enforcement", + "Scarlett", + "##lasia", + "Healthcare", + "##onte", + "Dude", + "inverted", + "##36", + "##regation", + "##lidae", + "Munro", + "##angay", + "Airbus", + "overlapping", + "Drivers", + "lawsuits", + "bodily", + "##udder", + "Wanda", + "Effects", + "Fathers", + "##finery", + "##islav", + "Ridley", + "observatory", + "pod", + "##utrition", + "Electricity", + "landslide", + "##mable", + "##zoic", + "##imator", + "##uration", + "Estates", + "sleepy", + "Nickelodeon", + "steaming", + "irony", + "schedules", + "snack", + "spikes", + "Hmm", + "##nesia", + "##bella", + "##hibit", + "Greenville", + "plucked", + "Harald", + "##ono", + "Gamma", + "infringement", + "roaring", + "deposition", + "##pol", + "##orum", + "660", + "seminal", + "passports", + "engagements", + "Akbar", + "rotated", + "##bina", + "##gart", + "Hartley", + "##lown", + "##truct", + "uttered", + "traumatic", + "Dex", + "##ôme", + "Holloway", + "MV", + "apartheid", + "##nee", + "Counter", + "Colton", + "OR", + "245", + "Spaniards", + "Regency", + "Schedule", + "scratching", + "squads", + "verify", + "##alk", + "keyboardist", + "rotten", + "Forestry", + "aids", + "commemorating", + "##yed", + "##érie", + "Sting", + "##elly", + "Dai", + "##fers", + "##berley", + "##ducted", + "Melvin", + "cannabis", + "glider", + "##enbach", + "##rban", + "Costello", + "Skating", + "cartoonist", + "AN", + "audit", + "##pectator", + "distributing", + "226", + "312", + "interpreter", + "header", + "Alternatively", + "##ases", + "smug", + "##kumar", + "cabins", + "remastered", + "Connolly", + "Kelsey", + "LED", + "tentative", + "Check", + "Sichuan", + "shaved", + "##42", + "Gerhard", + "Harvest", + "inward", + "##rque", + "Hopefully", + "hem", + "##34", + "Typical", + "binds", + "wrath", + "Woodstock", + "forcibly", + "Fergus", + "##charged", + "##tured", + "prepares", + "amenities", + "penetration", + "##ghan", + "coarse", + "##oned", + "enthusiasts", + "##av", + "##twined", + "fielded", + "##cky", + "Kiel", + "##obia", + "470", + "beers", + "tremble", + "youths", + "attendees", + "##cademies", + "##sex", + "Macon", + "communism", + "dir", + "##abi", + "Lennox", + "Wen", + "differentiate", + "jewel", + "##SO", + "activate", + "assert", + "laden", + "unto", + "Gillespie", + "Guillermo", + "accumulation", + "##GM", + "NGO", + "Rosenberg", + "calculating", + "drastically", + "##omorphic", + "peeled", + "Liège", + "insurgents", + "outdoors", + "##enia", + "Aspen", + "Sep", + "awakened", + "##eye", + "Consul", + "Maiden", + "insanity", + "##brian", + "furnace", + "Colours", + "distributions", + "longitudinal", + "syllables", + "##scent", + "Martian", + "accountant", + "Atkins", + "husbands", + "sewage", + "zur", + "collaborate", + "highlighting", + "##rites", + "##PI", + "colonization", + "nearer", + "##XT", + "dunes", + "positioning", + "Ku", + "multitude", + "luxurious", + "Volvo", + "linguistics", + "plotting", + "squared", + "##inder", + "outstretched", + "##uds", + "Fuji", + "ji", + "##feit", + "##ahu", + "##loat", + "##gado", + "##luster", + "##oku", + "América", + "##iza", + "Residents", + "vine", + "Pieces", + "DD", + "Vampires", + "##ová", + "smoked", + "harshly", + "spreads", + "##turn", + "##zhi", + "betray", + "electors", + "##settled", + "Considering", + "exploits", + "stamped", + "Dusty", + "enraged", + "Nairobi", + "##38", + "intervened", + "##luck", + "orchestras", + "##lda", + "Hereford", + "Jarvis", + "calf", + "##itzer", + "##CH", + "salesman", + "Lovers", + "cigar", + "Angelica", + "doomed", + "heroine", + "##tible", + "Sanford", + "offenders", + "##ulously", + "articulated", + "##oam", + "Emanuel", + "Gardiner", + "Edna", + "Shu", + "gigantic", + "##stable", + "Tallinn", + "coasts", + "Maker", + "ale", + "stalking", + "##oga", + "##smus", + "lucrative", + "southbound", + "##changing", + "Reg", + "##lants", + "Schleswig", + "discount", + "grouping", + "physiological", + "##OH", + "##sun", + "Galen", + "assurance", + "reconcile", + "rib", + "scarlet", + "Thatcher", + "anarchist", + "##oom", + "Turnpike", + "##ceding", + "cocktail", + "Sweeney", + "Allegheny", + "concessions", + "oppression", + "reassuring", + "##poli", + "##ticus", + "##TR", + "##VI", + "##uca", + "##zione", + "directional", + "strikeouts", + "Beneath", + "Couldn", + "Kabul", + "##national", + "hydroelectric", + "##jit", + "Desire", + "##riot", + "enhancing", + "northbound", + "##PO", + "Ok", + "Routledge", + "volatile", + "Bernardo", + "Python", + "333", + "ample", + "chestnut", + "automobiles", + "##innamon", + "##care", + "##hering", + "BWF", + "salaries", + "Turbo", + "acquisitions", + "##stituting", + "strengths", + "pilgrims", + "Ponce", + "Pig", + "Actors", + "Beard", + "sanitation", + "##RD", + "##mett", + "Telecommunications", + "worms", + "##idas", + "Juno", + "Larson", + "Ventura", + "Northeastern", + "weighs", + "Houghton", + "collaborating", + "lottery", + "##rano", + "Wonderland", + "gigs", + "##lmer", + "##zano", + "##edd", + "##nife", + "mixtape", + "predominant", + "tripped", + "##ruly", + "Alexei", + "investing", + "Belgarath", + "Brasil", + "hiss", + "##crat", + "##xham", + "Côte", + "560", + "kilometer", + "##cological", + "analyzing", + "##As", + "engined", + "listener", + "##cakes", + "negotiation", + "##hisky", + "Santana", + "##lemma", + "IAAF", + "Seneca", + "skeletal", + "Covenant", + "Steiner", + "##lev", + "##uen", + "Neptune", + "retention", + "##upon", + "Closing", + "Czechoslovak", + "chalk", + "Navarre", + "NZ", + "##IG", + "##hop", + "##oly", + "##quatorial", + "##sad", + "Brewery", + "Conflict", + "Them", + "renew", + "turrets", + "disagree", + "Petra", + "Slave", + "##reole", + "adjustment", + "##dela", + "##regard", + "##sner", + "framing", + "stature", + "##rca", + "##sies", + "##46", + "##mata", + "Logic", + "inadvertently", + "naturalist", + "spheres", + "towering", + "heightened", + "Dodd", + "rink", + "##fle", + "Keyboards", + "bulb", + "diver", + "ul", + "##tsk", + "Exodus", + "Deacon", + "España", + "Canadiens", + "oblique", + "thud", + "reigned", + "rug", + "Whitman", + "Dash", + "##iens", + "Haifa", + "pets", + "##arland", + "manually", + "dart", + "##bial", + "Sven", + "textiles", + "subgroup", + "Napier", + "graffiti", + "revolver", + "humming", + "Babu", + "protector", + "typed", + "Provinces", + "Sparta", + "Wills", + "subjective", + "##rella", + "temptation", + "##liest", + "FL", + "Sadie", + "manifest", + "Guangdong", + "Transfer", + "entertain", + "eve", + "recipes", + "##33", + "Benedictine", + "retailer", + "##dence", + "establishes", + "##cluded", + "##rked", + "Ursula", + "##ltz", + "##lars", + "##rena", + "qualifiers", + "##curement", + "colt", + "depictions", + "##oit", + "Spiritual", + "differentiation", + "staffed", + "transitional", + "##lew", + "1761", + "fatalities", + "##oan", + "Bayern", + "Northamptonshire", + "Weeks", + "##CU", + "Fife", + "capacities", + "hoarse", + "##latt", + "##ة", + "evidenced", + "##HD", + "##ographer", + "assessing", + "evolve", + "hints", + "42nd", + "streaked", + "##lve", + "Yahoo", + "##estive", + "##rned", + "##zas", + "baggage", + "Elected", + "secrecy", + "##champ", + "Character", + "Pen", + "Decca", + "cape", + "Bernardino", + "vapor", + "Dolly", + "counselor", + "##isers", + "Benin", + "##khar", + "##CR", + "notch", + "##thus", + "##racy", + "bounty", + "lend", + "grassland", + "##chtenstein", + "##dating", + "pseudo", + "golfer", + "simplest", + "##ceive", + "Lucivar", + "Triumph", + "dinosaur", + "dinosaurs", + "##šić", + "Seahawks", + "##nco", + "resorts", + "reelected", + "1766", + "reproduce", + "universally", + "##OA", + "ER", + "tendencies", + "Consolidated", + "Massey", + "Tasmanian", + "reckless", + "##icz", + "##ricks", + "1755", + "questionable", + "Audience", + "##lates", + "preseason", + "Quran", + "trivial", + "Haitian", + "Freeway", + "dialed", + "Appointed", + "Heard", + "ecosystems", + "##bula", + "hormones", + "Carbon", + "Rd", + "##arney", + "##working", + "Christoph", + "presiding", + "pu", + "##athy", + "Morrow", + "Dar", + "ensures", + "posing", + "remedy", + "EA", + "disclosed", + "##hui", + "##rten", + "rumours", + "surveying", + "##ficiency", + "Aziz", + "Jewel", + "Plays", + "##smatic", + "Bernhard", + "Christi", + "##eanut", + "##friend", + "jailed", + "##dr", + "govern", + "neighbour", + "butler", + "Acheron", + "murdering", + "oils", + "mac", + "Editorial", + "detectives", + "bolts", + "##ulon", + "Guitars", + "malaria", + "36th", + "Pembroke", + "Opened", + "##hium", + "harmonic", + "serum", + "##sio", + "Franks", + "fingernails", + "##gli", + "culturally", + "evolving", + "scalp", + "VP", + "deploy", + "uploaded", + "mater", + "##evo", + "Jammu", + "Spa", + "##icker", + "flirting", + "##cursions", + "Heidi", + "Majority", + "sprawled", + "##alytic", + "Zheng", + "bunker", + "##lena", + "ST", + "##tile", + "Jiang", + "ceilings", + "##ently", + "##ols", + "Recovery", + "dire", + "##good", + "Manson", + "Honestly", + "Montréal", + "1764", + "227", + "quota", + "Lakshmi", + "incentive", + "Accounting", + "##cilla", + "Eureka", + "Reaper", + "buzzed", + "##uh", + "courtroom", + "dub", + "##mberg", + "KC", + "Gong", + "Theodor", + "Académie", + "NPR", + "criticizing", + "protesting", + "##pired", + "##yric", + "abuses", + "fisheries", + "##minated", + "1767", + "yd", + "Gemini", + "Subcommittee", + "##fuse", + "Duff", + "Wasn", + "Wight", + "cleaner", + "##tite", + "planetary", + "Survivor", + "Zionist", + "mounds", + "##rary", + "landfall", + "disruption", + "yielding", + "##yana", + "bids", + "unidentified", + "Garry", + "Ellison", + "Elmer", + "Fishing", + "Hayward", + "demos", + "modelling", + "##anche", + "##stick", + "caressed", + "entertained", + "##hesion", + "piers", + "Crimea", + "##mass", + "WHO", + "boulder", + "trunks", + "1640", + "Biennale", + "Palestinians", + "Pursuit", + "##udes", + "Dora", + "contender", + "##dridge", + "Nanjing", + "##ezer", + "##former", + "##ibel", + "Whole", + "proliferation", + "##tide", + "##weiler", + "fuels", + "predictions", + "##ente", + "##onium", + "Filming", + "absorbing", + "Ramón", + "strangled", + "conveyed", + "inhabit", + "prostitutes", + "recession", + "bonded", + "clinched", + "##eak", + "##iji", + "##edar", + "Pleasure", + "Rite", + "Christy", + "Therapy", + "sarcasm", + "##collegiate", + "hilt", + "probation", + "Sarawak", + "coefficients", + "underworld", + "biodiversity", + "SBS", + "groom", + "brewing", + "dungeon", + "##claiming", + "Hari", + "turnover", + "##ntina", + "##omer", + "##opped", + "orthodox", + "styling", + "##tars", + "##ulata", + "priced", + "Marjorie", + "##eley", + "##abar", + "Yong", + "##tically", + "Crambidae", + "Hernandez", + "##ego", + "##rricular", + "##ark", + "##lamour", + "##llin", + "##augh", + "##tens", + "Advancement", + "Loyola", + "##4th", + "##hh", + "goin", + "marshes", + "Sardinia", + "##ša", + "Ljubljana", + "Singing", + "suspiciously", + "##hesive", + "Félix", + "Regarding", + "flap", + "stimulation", + "##raught", + "Apr", + "Yin", + "gaping", + "tighten", + "skier", + "##itas", + "##lad", + "##rani", + "264", + "Ashes", + "Olson", + "Problems", + "Tabitha", + "##rading", + "balancing", + "sunrise", + "##ease", + "##iture", + "##ritic", + "Fringe", + "##iciency", + "Inspired", + "Linnaeus", + "PBA", + "disapproval", + "##kles", + "##rka", + "##tails", + "##urger", + "Disaster", + "Laboratories", + "apps", + "paradise", + "Aero", + "Came", + "sneaking", + "Gee", + "Beacon", + "ODI", + "commodity", + "Ellington", + "graphical", + "Gretchen", + "spire", + "##skaya", + "##trine", + "RTÉ", + "efficacy", + "plc", + "tribunal", + "##ytic", + "downhill", + "flu", + "medications", + "##kaya", + "widen", + "Sunrise", + "##nous", + "distinguishing", + "pawn", + "##BO", + "##irn", + "##ssing", + "##ν", + "Easton", + "##vila", + "Rhineland", + "##aque", + "defect", + "##saurus", + "Goose", + "Ju", + "##classified", + "Middlesbrough", + "shaping", + "preached", + "1759", + "##erland", + "Ein", + "Hailey", + "musicals", + "##altered", + "Galileo", + "Hilda", + "Fighters", + "Lac", + "##ometric", + "295", + "Leafs", + "Milano", + "##lta", + "##VD", + "##ivist", + "penetrated", + "Mask", + "Orchard", + "plaintiff", + "##icorn", + "Yvonne", + "##fred", + "outfielder", + "peek", + "Collier", + "Caracas", + "repealed", + "Bois", + "dell", + "restrict", + "Dolores", + "Hadley", + "peacefully", + "##LL", + "condom", + "Granny", + "Orders", + "sabotage", + "##toon", + "##rings", + "compass", + "marshal", + "gears", + "brigadier", + "dye", + "Yunnan", + "communicating", + "donate", + "emerald", + "vitamin", + "administer", + "Fulham", + "##classical", + "##llas", + "Buckinghamshire", + "Held", + "layered", + "disclosure", + "Akira", + "programmer", + "shrimp", + "Crusade", + "##ximal", + "Luzon", + "bakery", + "##cute", + "Garth", + "Citadel", + "uniquely", + "Curling", + "info", + "mum", + "Para", + "##ști", + "sleek", + "##ione", + "hey", + "Lantern", + "mesh", + "##lacing", + "##lizzard", + "##gade", + "prosecuted", + "Alba", + "Gilles", + "greedy", + "twists", + "##ogged", + "Viper", + "##kata", + "Appearances", + "Skyla", + "hymns", + "##pelled", + "curving", + "predictable", + "Grave", + "Watford", + "##dford", + "##liptic", + "##vary", + "Westwood", + "fluids", + "Models", + "statutes", + "##ynamite", + "1740", + "##culate", + "Framework", + "Johanna", + "##gression", + "Vuelta", + "imp", + "##otion", + "##raga", + "##thouse", + "Ciudad", + "festivities", + "##love", + "Beyoncé", + "italics", + "##vance", + "DB", + "##haman", + "outs", + "Singers", + "##ueva", + "##urning", + "##51", + "##ntiary", + "##mobile", + "285", + "Mimi", + "emeritus", + "nesting", + "Keeper", + "Ways", + "##onal", + "##oux", + "Edmond", + "MMA", + "##bark", + "##oop", + "Hampson", + "##ñez", + "##rets", + "Gladstone", + "wreckage", + "Pont", + "Playboy", + "reluctance", + "##ná", + "apprenticeship", + "preferring", + "Value", + "originate", + "##wei", + "##olio", + "Alexia", + "##rog", + "Parachute", + "jammed", + "stud", + "Eton", + "vols", + "##ganized", + "1745", + "straining", + "creep", + "indicators", + "##mán", + "humiliation", + "hinted", + "alma", + "tanker", + "##egation", + "Haynes", + "Penang", + "amazement", + "branched", + "rumble", + "##ddington", + "archaeologists", + "paranoid", + "expenditure", + "Absolutely", + "Musicians", + "banished", + "##fining", + "baptism", + "Joker", + "Persons", + "hemisphere", + "##tieth", + "##ück", + "flock", + "##xing", + "lbs", + "Kung", + "crab", + "##dak", + "##tinent", + "Regulations", + "barrage", + "parcel", + "##ós", + "Tanaka", + "##rsa", + "Natalia", + "Voyage", + "flaws", + "stepfather", + "##aven", + "##eological", + "Botanical", + "Minsk", + "##ckers", + "Cinderella", + "Feast", + "Loving", + "Previous", + "Shark", + "##took", + "barrister", + "collaborators", + "##nnes", + "Croydon", + "Graeme", + "Juniors", + "##7th", + "##formation", + "##ulos", + "##ák", + "£2", + "##hwa", + "##rove", + "##ș", + "Whig", + "demeanor", + "Otago", + "##TH", + "##ooster", + "Faber", + "instructors", + "##ahl", + "##bha", + "emptied", + "##schen", + "saga", + "##lora", + "exploding", + "##rges", + "Crusaders", + "##caster", + "##uations", + "streaks", + "CBN", + "bows", + "insights", + "ka", + "1650", + "diversion", + "LSU", + "Wingspan", + "##liva", + "Response", + "sanity", + "Producers", + "imitation", + "##fine", + "Lange", + "Spokane", + "splash", + "weed", + "Siberian", + "magnet", + "##rocodile", + "capitals", + "##rgus", + "swelled", + "Rani", + "Bells", + "Silesia", + "arithmetic", + "rumor", + "##hampton", + "favors", + "Weird", + "marketplace", + "##orm", + "tsunami", + "unpredictable", + "##citation", + "##ferno", + "Tradition", + "postwar", + "stench", + "succeeds", + "##roup", + "Anya", + "Users", + "oversized", + "totaling", + "pouch", + "##nat", + "Tripoli", + "leverage", + "satin", + "##cline", + "Bathurst", + "Lund", + "Niall", + "thereof", + "##quid", + "Bangor", + "barge", + "Animated", + "##53", + "##alan", + "Ballard", + "utilizes", + "Done", + "ballistic", + "NDP", + "gatherings", + "##elin", + "##vening", + "Rockets", + "Sabrina", + "Tamara", + "Tribal", + "WTA", + "##citing", + "blinded", + "flux", + "Khalid", + "Una", + "prescription", + "##jee", + "Parents", + "##otics", + "##food", + "Silicon", + "cured", + "electro", + "perpendicular", + "intimacy", + "##rified", + "Lots", + "##ceiving", + "##powder", + "incentives", + "McKenna", + "##arma", + "##ounced", + "##rinkled", + "Alzheimer", + "##tarian", + "262", + "Seas", + "##cam", + "Novi", + "##hout", + "##morphic", + "##hazar", + "##hul", + "##nington", + "Huron", + "Bahadur", + "Pirate", + "pursed", + "Griffiths", + "indicted", + "swap", + "refrain", + "##mulating", + "Lal", + "stomped", + "##Pad", + "##mamoto", + "Reef", + "disposed", + "plastered", + "weeping", + "##rato", + "Minas", + "hourly", + "tumors", + "##ruising", + "Lyle", + "##yper", + "##sol", + "Odisha", + "credibility", + "##Dowell", + "Braun", + "Graphic", + "lurched", + "muster", + "##nex", + "##ührer", + "##connected", + "##iek", + "##ruba", + "Carthage", + "Peck", + "maple", + "bursting", + "##lava", + "Enrico", + "rite", + "##jak", + "Moment", + "##skar", + "Styx", + "poking", + "Spartan", + "##urney", + "Hepburn", + "Mart", + "Titanic", + "newsletter", + "waits", + "Mecklenburg", + "agitated", + "eats", + "##dious", + "Chow", + "matrices", + "Maud", + "##sexual", + "sermon", + "234", + "##sible", + "##lung", + "Qi", + "cemeteries", + "mined", + "sprinter", + "##ckett", + "coward", + "##gable", + "##hell", + "##thin", + "##FB", + "Contact", + "##hay", + "rainforest", + "238", + "Hemisphere", + "boasts", + "##nders", + "##verance", + "##kat", + "Convent", + "Dunedin", + "Lecturer", + "lyricist", + "##bject", + "Iberian", + "comune", + "##pphire", + "chunk", + "##boo", + "thrusting", + "fore", + "informing", + "pistols", + "echoes", + "Tier", + "battleships", + "substitution", + "##belt", + "moniker", + "##charya", + "##lland", + "Thoroughbred", + "38th", + "##01", + "##tah", + "parting", + "tongues", + "Cale", + "##seau", + "Unionist", + "modular", + "celebrates", + "preview", + "steamed", + "Bismarck", + "302", + "737", + "vamp", + "##finity", + "##nbridge", + "weaknesses", + "husky", + "##berman", + "absently", + "##icide", + "Craven", + "tailored", + "Tokugawa", + "VIP", + "syntax", + "Kazan", + "captives", + "doses", + "filtered", + "overview", + "Cleopatra", + "Conversely", + "stallion", + "Burger", + "Suez", + "Raoul", + "th", + "##reaves", + "Dickson", + "Nell", + "Rate", + "anal", + "colder", + "##sław", + "Arm", + "Semitic", + "##green", + "reflective", + "1100", + "episcopal", + "journeys", + "##ours", + "##pository", + "##dering", + "residue", + "Gunn", + "##27", + "##ntial", + "##crates", + "##zig", + "Astros", + "Renee", + "Emerald", + "##vili", + "connectivity", + "undrafted", + "Sampson", + "treasures", + "##kura", + "##theon", + "##vern", + "Destroyer", + "##iable", + "##ener", + "Frederic", + "briefcase", + "confinement", + "Bree", + "##WD", + "Athena", + "233", + "Padres", + "Thom", + "speeding", + "##hali", + "Dental", + "ducks", + "Putin", + "##rcle", + "##lou", + "Asylum", + "##usk", + "dusk", + "pasture", + "Institutes", + "ONE", + "jack", + "##named", + "diplomacy", + "Intercontinental", + "Leagues", + "Towns", + "comedic", + "premature", + "##edic", + "##mona", + "##ories", + "trimmed", + "Charge", + "Cream", + "guarantees", + "Dmitry", + "splashed", + "Philosophical", + "tramway", + "##cape", + "Maynard", + "predatory", + "redundant", + "##gratory", + "##wry", + "sobs", + "Burgundy", + "edible", + "outfits", + "Handel", + "dazed", + "dangerously", + "idle", + "Operational", + "organizes", + "##sional", + "blackish", + "broker", + "weddings", + "##halt", + "Becca", + "McGee", + "##gman", + "protagonists", + "##pelling", + "Keynes", + "aux", + "stumble", + "##ordination", + "Nokia", + "reel", + "sexes", + "##woods", + "##pheric", + "##quished", + "##voc", + "##oir", + "##pathian", + "##ptus", + "##sma", + "##tating", + "##ê", + "fulfilling", + "sheath", + "##ayne", + "Mei", + "Ordinary", + "Collin", + "Sharpe", + "grasses", + "interdisciplinary", + "##OX", + "Background", + "##ignment", + "Assault", + "transforms", + "Hamas", + "Serge", + "ratios", + "##sik", + "swaying", + "##rcia", + "Rosen", + "##gant", + "##versible", + "cinematographer", + "curly", + "penny", + "Kamal", + "Mellon", + "Sailor", + "Spence", + "phased", + "Brewers", + "amassed", + "Societies", + "##ropriations", + "##buted", + "mythological", + "##SN", + "##byss", + "##ired", + "Sovereign", + "preface", + "Parry", + "##ife", + "altitudes", + "crossings", + "##28", + "Crewe", + "southernmost", + "taut", + "McKinley", + "##owa", + "##tore", + "254", + "##ckney", + "compiling", + "Shelton", + "##hiko", + "228", + "Poll", + "Shepard", + "Labs", + "Pace", + "Carlson", + "grasping", + "##ов", + "Delaney", + "Winning", + "robotic", + "intentional", + "shattering", + "##boarding", + "##git", + "##grade", + "Editions", + "Reserves", + "ignorant", + "proposing", + "##hanna", + "cutter", + "Mongols", + "NW", + "##eux", + "Codex", + "Cristina", + "Daughters", + "Rees", + "forecast", + "##hita", + "NGOs", + "Stations", + "Beaux", + "Erwin", + "##jected", + "##EX", + "##trom", + "Schumacher", + "##hrill", + "##rophe", + "Maharaja", + "Oricon", + "##sul", + "##dynamic", + "##fighting", + "Ce", + "Ingrid", + "rumbled", + "Prospect", + "stairwell", + "Barnard", + "applause", + "complementary", + "##uba", + "grunt", + "##mented", + "Bloc", + "Carleton", + "loft", + "noisy", + "##hey", + "490", + "contrasted", + "##inator", + "##rief", + "##centric", + "##fica", + "Cantonese", + "Blanc", + "Lausanne", + "License", + "artifact", + "##ddin", + "rot", + "Amongst", + "Prakash", + "RF", + "##topia", + "milestone", + "##vard", + "Winters", + "Mead", + "churchyard", + "Lulu", + "estuary", + "##ind", + "Cha", + "Infinity", + "Meadow", + "subsidies", + "##valent", + "CONCACAF", + "Ching", + "medicinal", + "navigate", + "Carver", + "Twice", + "abdominal", + "regulating", + "RB", + "toilets", + "Brewer", + "weakening", + "ambushed", + "##aut", + "##vignon", + "Lansing", + "unacceptable", + "reliance", + "stabbing", + "##mpo", + "##naire", + "Interview", + "##ested", + "##imed", + "bearings", + "##lts", + "Rashid", + "##iation", + "authenticity", + "vigorous", + "##frey", + "##uel", + "biologist", + "NFC", + "##rmaid", + "##wash", + "Makes", + "##aunt", + "##steries", + "withdrawing", + "##qa", + "Buccaneers", + "bleed", + "inclination", + "stain", + "##ilo", + "##ppel", + "Torre", + "privileged", + "cereal", + "trailers", + "alumnus", + "neon", + "Cochrane", + "Mariana", + "caress", + "##47", + "##ients", + "experimentation", + "Window", + "convict", + "signaled", + "##YP", + "rower", + "Pharmacy", + "interacting", + "241", + "Strings", + "dominating", + "kinase", + "Dinamo", + "Wire", + "pains", + "sensations", + "##suse", + "Twenty20", + "##39", + "spotlight", + "##hend", + "elemental", + "##pura", + "Jameson", + "Swindon", + "honoring", + "pained", + "##ediatric", + "##lux", + "Psychological", + "assemblies", + "ingredient", + "Martial", + "Penguins", + "beverage", + "Monitor", + "mysteries", + "##ION", + "emigration", + "mused", + "##sique", + "crore", + "AMC", + "Funding", + "Chinatown", + "Establishment", + "Finalist", + "enjoyable", + "1756", + "##mada", + "##rams", + "NO", + "newborn", + "CS", + "comprehend", + "Invisible", + "Siemens", + "##acon", + "246", + "contraction", + "##volving", + "##moration", + "##rok", + "montane", + "##ntation", + "Galloway", + "##llow", + "Verity", + "directorial", + "pearl", + "Leaning", + "##rase", + "Fernandez", + "swallowing", + "Automatic", + "Madness", + "haunting", + "paddle", + "##UE", + "##rrows", + "##vies", + "##zuki", + "##bolt", + "##iber", + "Fender", + "emails", + "paste", + "##lancing", + "hind", + "homestead", + "hopeless", + "##dles", + "Rockies", + "garlic", + "fatty", + "shrieked", + "##ismic", + "Gillian", + "Inquiry", + "Schultz", + "XML", + "##cius", + "##uld", + "Domesday", + "grenades", + "northernmost", + "##igi", + "Tbilisi", + "optimistic", + "##poon", + "Refuge", + "stacks", + "Bose", + "smash", + "surreal", + "Nah", + "Straits", + "Conquest", + "##roo", + "##weet", + "##kell", + "Gladys", + "CH", + "##lim", + "##vitation", + "Doctorate", + "NRHP", + "knocks", + "Bey", + "Romano", + "##pile", + "242", + "Diamonds", + "strides", + "eclectic", + "Betsy", + "clade", + "##hady", + "##leashed", + "dissolve", + "moss", + "Suburban", + "silvery", + "##bria", + "tally", + "turtles", + "##uctive", + "finely", + "industrialist", + "##nary", + "Ernesto", + "oz", + "pact", + "loneliness", + "##hov", + "Tomb", + "multinational", + "risked", + "Layne", + "USL", + "ne", + "##quiries", + "Ad", + "Message", + "Kamen", + "Kristen", + "reefs", + "implements", + "##itative", + "educators", + "garments", + "gunshot", + "##essed", + "##rve", + "Montevideo", + "vigorously", + "Stamford", + "assemble", + "packaged", + "##same", + "état", + "Viva", + "paragraph", + "##eter", + "##wire", + "Stick", + "Navajo", + "MCA", + "##pressing", + "ensembles", + "ABA", + "##zor", + "##llus", + "Partner", + "raked", + "##BI", + "Iona", + "thump", + "Celeste", + "Kiran", + "##iscovered", + "##rith", + "inflammation", + "##arel", + "Features", + "loosened", + "##yclic", + "Deluxe", + "Speak", + "economical", + "Frankenstein", + "Picasso", + "showcased", + "##zad", + "##eira", + "##planes", + "##linear", + "##overs", + "monsoon", + "prosecutors", + "slack", + "Horses", + "##urers", + "Angry", + "coughing", + "##truder", + "Questions", + "##tō", + "##zak", + "challenger", + "clocks", + "##ieving", + "Newmarket", + "##acle", + "cursing", + "stimuli", + "##mming", + "##qualified", + "slapping", + "##vasive", + "narration", + "##kini", + "Advertising", + "CSI", + "alliances", + "mixes", + "##yes", + "covert", + "amalgamation", + "reproduced", + "##ardt", + "##gis", + "1648", + "id", + "Annette", + "Boots", + "Champagne", + "Brest", + "Daryl", + "##emon", + "##jou", + "##llers", + "Mean", + "adaptive", + "technicians", + "##pair", + "##usal", + "Yoga", + "fronts", + "leaping", + "Jul", + "harvesting", + "keel", + "##44", + "petitioned", + "##lved", + "yells", + "Endowment", + "proponent", + "##spur", + "##tised", + "##zal", + "Homes", + "Includes", + "##ifer", + "##oodoo", + "##rvette", + "awarding", + "mirrored", + "ransom", + "Flute", + "outlook", + "##ganj", + "DVDs", + "Sufi", + "frontman", + "Goddard", + "barren", + "##astic", + "Suicide", + "hillside", + "Harlow", + "Lau", + "notions", + "Amnesty", + "Homestead", + "##irt", + "GE", + "hooded", + "umpire", + "mustered", + "Catch", + "Masonic", + "##erd", + "Dynamics", + "Equity", + "Oro", + "Charts", + "Mussolini", + "populace", + "muted", + "accompaniment", + "##lour", + "##ndes", + "ignited", + "##iferous", + "##laced", + "##atch", + "anguish", + "registry", + "##tub", + "##hards", + "##neer", + "251", + "Hooker", + "uncomfortably", + "##6th", + "##ivers", + "Catalina", + "MiG", + "giggling", + "1754", + "Dietrich", + "Kaladin", + "pricing", + "##quence", + "Sabah", + "##lving", + "##nical", + "Gettysburg", + "Vita", + "Telecom", + "Worst", + "Palais", + "Pentagon", + "##brand", + "##chichte", + "Graf", + "unnatural", + "1715", + "bio", + "##26", + "Radcliffe", + "##utt", + "chatting", + "spices", + "##aus", + "untouched", + "##eper", + "Doll", + "turkey", + "Syndicate", + "##rlene", + "##JP", + "##roots", + "Como", + "clashed", + "modernization", + "1757", + "fantasies", + "##iating", + "dissipated", + "Sicilian", + "inspect", + "sensible", + "reputed", + "##final", + "Milford", + "poised", + "RC", + "metabolic", + "Tobacco", + "Mecca", + "optimization", + "##heat", + "lobe", + "rabbits", + "NAS", + "geologist", + "##liner", + "Kilda", + "carpenter", + "nationalists", + "##brae", + "summarized", + "##venge", + "Designer", + "misleading", + "beamed", + "##meyer", + "Matrix", + "excuses", + "##aines", + "##biology", + "401", + "Moose", + "drafting", + "Sai", + "##ggle", + "Comprehensive", + "dripped", + "skate", + "##WI", + "##enan", + "##ruk", + "narrower", + "outgoing", + "##enter", + "##nounce", + "overseen", + "##structure", + "travellers", + "banging", + "scarred", + "##thing", + "##arra", + "Ebert", + "Sometime", + "##nated", + "BAFTA", + "Hurricanes", + "configurations", + "##MLL", + "immortality", + "##heus", + "gothic", + "##mpest", + "clergyman", + "viewpoint", + "Maxim", + "Instituto", + "emitted", + "quantitative", + "1689", + "Consortium", + "##rsk", + "Meat", + "Tao", + "swimmers", + "Shaking", + "Terence", + "mainline", + "##linity", + "Quantum", + "##rogate", + "Nair", + "banquet", + "39th", + "reprised", + "lagoon", + "subdivisions", + "synonymous", + "incurred", + "password", + "sprung", + "##vere", + "Credits", + "Petersen", + "Faces", + "##vu", + "statesman", + "Zombie", + "gesturing", + "##going", + "Sergey", + "dormant", + "possessive", + "totals", + "southward", + "Ángel", + "##odies", + "HM", + "Mariano", + "Ramirez", + "Wicked", + "impressions", + "##Net", + "##cap", + "##ème", + "Transformers", + "Poker", + "RIAA", + "Redesignated", + "##chuk", + "Harcourt", + "Peña", + "spacious", + "tinged", + "alternatively", + "narrowing", + "Brigham", + "authorization", + "Membership", + "Zeppelin", + "##amed", + "Handball", + "steer", + "##orium", + "##rnal", + "##rops", + "Committees", + "endings", + "##MM", + "##yung", + "ejected", + "grams", + "##relli", + "Birch", + "Hilary", + "Stadion", + "orphan", + "clawed", + "##kner", + "Motown", + "Wilkins", + "ballads", + "outspoken", + "##ancipation", + "##bankment", + "##cheng", + "Advances", + "harvested", + "novelty", + "ineligible", + "oversees", + "##´s", + "obeyed", + "inevitably", + "Kingdoms", + "burying", + "Fabian", + "relevance", + "Tatiana", + "##MCA", + "sarcastic", + "##onda", + "Akron", + "229", + "sandwiches", + "Adobe", + "Maddox", + "##azar", + "Hunting", + "##onized", + "Smiling", + "##tology", + "Juventus", + "Leroy", + "Poets", + "attach", + "lo", + "##rly", + "##film", + "Structure", + "##igate", + "olds", + "projections", + "SMS", + "outnumbered", + "##tase", + "judiciary", + "paramilitary", + "playfully", + "##rsing", + "##tras", + "Chico", + "Vin", + "informally", + "abandonment", + "##russ", + "Baroness", + "injuring", + "octagonal", + "deciduous", + "##nea", + "##olm", + "Hz", + "Norwood", + "poses", + "Marissa", + "alerted", + "willed", + "##KS", + "Dino", + "##ddler", + "##vani", + "Barbie", + "Thankfully", + "625", + "bicycles", + "shimmering", + "##tinuum", + "##wolf", + "Chesterfield", + "##idy", + "##urgency", + "Knowles", + "sweetly", + "Ventures", + "##ponents", + "##valence", + "Darryl", + "Powerplant", + "RAAF", + "##pec", + "Kingsley", + "Parramatta", + "penetrating", + "spectacle", + "##inia", + "Marlborough", + "residual", + "compatibility", + "hike", + "Underwood", + "depleted", + "ministries", + "##odus", + "##ropriation", + "rotting", + "Faso", + "##inn", + "Happiness", + "Lille", + "Suns", + "cookie", + "rift", + "warmly", + "##lvin", + "Bugs", + "Gotham", + "Gothenburg", + "Properties", + "##seller", + "##ubi", + "Created", + "MAC", + "Noelle", + "Requiem", + "Ulysses", + "##ails", + "franchises", + "##icious", + "##rwick", + "celestial", + "kinetic", + "720", + "STS", + "transmissions", + "amplitude", + "forums", + "freeing", + "reptiles", + "tumbling", + "##continent", + "##rising", + "##tropy", + "physiology", + "##uster", + "Loves", + "bodied", + "neutrality", + "Neumann", + "assessments", + "Vicky", + "##hom", + "hampered", + "##uku", + "Custom", + "timed", + "##eville", + "##xious", + "elastic", + "##section", + "rig", + "stilled", + "shipment", + "243", + "artworks", + "boulders", + "Bournemouth", + "##hly", + "##LF", + "##linary", + "rumored", + "##bino", + "##drum", + "Chun", + "Freiburg", + "##dges", + "Equality", + "252", + "Guadalajara", + "##sors", + "##taire", + "Roach", + "cramped", + "##ultural", + "Logistics", + "Punch", + "fines", + "Lai", + "caravan", + "##55", + "lame", + "Collector", + "pausing", + "315", + "migrant", + "hawk", + "signalling", + "##erham", + "##oughs", + "Demons", + "surfing", + "Rana", + "insisting", + "Wien", + "adolescent", + "##jong", + "##rera", + "##umba", + "Regis", + "brushes", + "##iman", + "residues", + "storytelling", + "Consider", + "contrasting", + "regeneration", + "##elling", + "##hlete", + "afforded", + "reactors", + "costing", + "##biotics", + "##gat", + "##евич", + "chanting", + "secondly", + "confesses", + "##ikos", + "##uang", + "##ronological", + "##−", + "Giacomo", + "##eca", + "vaudeville", + "weeds", + "rejecting", + "revoked", + "affluent", + "fullback", + "progresses", + "geologic", + "proprietor", + "replication", + "gliding", + "recounted", + "##bah", + "##igma", + "Flow", + "ii", + "newcomer", + "##lasp", + "##miya", + "Candace", + "fractured", + "interiors", + "confidential", + "Inverness", + "footing", + "##robe", + "Coordinator", + "Westphalia", + "jumper", + "##chism", + "dormitory", + "##gno", + "281", + "acknowledging", + "leveled", + "##éra", + "Algiers", + "migrate", + "Frog", + "Rare", + "##iovascular", + "##urous", + "DSO", + "nomadic", + "##iera", + "woken", + "lifeless", + "##graphical", + "##ifications", + "Dot", + "Sachs", + "crow", + "nmi", + "Tacoma", + "Weight", + "mushroom", + "RS", + "conditioned", + "##zine", + "Tunisian", + "altering", + "##mizing", + "Handicap", + "Patti", + "Monsieur", + "clicking", + "gorge", + "interrupting", + "##powerment", + "drawers", + "Serra", + "##icides", + "Specialist", + "##itte", + "connector", + "worshipped", + "##ask", + "consoles", + "tags", + "##iler", + "glued", + "##zac", + "fences", + "Bratislava", + "honeymoon", + "313", + "A2", + "disposition", + "Gentleman", + "Gilmore", + "glaciers", + "##scribed", + "Calhoun", + "convergence", + "Aleppo", + "shortages", + "##43", + "##orax", + "##worm", + "##codes", + "##rmal", + "neutron", + "##ossa", + "Bloomberg", + "Salford", + "periodicals", + "##ryan", + "Slayer", + "##ynasties", + "credentials", + "##tista", + "surveyor", + "File", + "stinging", + "unnoticed", + "Medici", + "ecstasy", + "espionage", + "Jett", + "Leary", + "circulating", + "bargaining", + "concerto", + "serviced", + "37th", + "HK", + "##fueling", + "Delilah", + "Marcia", + "graded", + "##join", + "Kaplan", + "feasible", + "##nale", + "##yt", + "Burnley", + "dreadful", + "ministerial", + "Brewster", + "Judah", + "##ngled", + "##rrey", + "recycled", + "Iroquois", + "backstage", + "parchment", + "##numbered", + "Kern", + "Motorsports", + "Organizations", + "##mini", + "Seems", + "Warrington", + "Dunbar", + "Ezio", + "##eor", + "paralyzed", + "Ara", + "yeast", + "##olis", + "cheated", + "reappeared", + "banged", + "##ymph", + "##dick", + "Lyndon", + "glide", + "Mat", + "##natch", + "Hotels", + "Household", + "parasite", + "irrelevant", + "youthful", + "##smic", + "##tero", + "##anti", + "2d", + "Ignacio", + "squash", + "##nets", + "shale", + "##اد", + "Abrams", + "##oese", + "assaults", + "##dier", + "##otte", + "Swamp", + "287", + "Spurs", + "##economic", + "Fargo", + "auditioned", + "##mé", + "Haas", + "une", + "abbreviation", + "Turkic", + "##tisfaction", + "favorites", + "specials", + "##lial", + "Enlightenment", + "Burkina", + "##vir", + "Comparative", + "Lacrosse", + "elves", + "##lerical", + "##pear", + "Borders", + "controllers", + "##villa", + "excelled", + "##acher", + "##varo", + "camouflage", + "perpetual", + "##ffles", + "devoid", + "schooner", + "##bered", + "##oris", + "Gibbons", + "Lia", + "discouraged", + "sue", + "##gnition", + "Excellent", + "Layton", + "noir", + "smack", + "##ivable", + "##evity", + "##lone", + "Myra", + "weaken", + "weaponry", + "##azza", + "Shake", + "backbone", + "Certified", + "clown", + "occupational", + "caller", + "enslaved", + "soaking", + "Wexford", + "perceive", + "shortlisted", + "##pid", + "feminism", + "Bari", + "Indie", + "##avelin", + "##ldo", + "Hellenic", + "Hundreds", + "Savings", + "comedies", + "Honors", + "Mohawk", + "Told", + "coded", + "Incorporated", + "hideous", + "trusts", + "hose", + "Calais", + "Forster", + "Gabon", + "Internationale", + "AK", + "Colour", + "##UM", + "##heist", + "McGregor", + "localized", + "##tronomy", + "Darrell", + "##iara", + "squirrel", + "freaked", + "##eking", + "##manned", + "##ungen", + "radiated", + "##dua", + "commence", + "Donaldson", + "##iddle", + "MR", + "SAS", + "Tavern", + "Teenage", + "admissions", + "Instruments", + "##ilizer", + "Konrad", + "contemplated", + "##ductor", + "Jing", + "Reacher", + "recalling", + "Dhabi", + "emphasizing", + "illumination", + "##tony", + "legitimacy", + "Goethe", + "Ritter", + "McDonnell", + "Polar", + "Seconds", + "aspiring", + "derby", + "tunic", + "##rmed", + "outlines", + "Changing", + "distortion", + "##cter", + "Mechanics", + "##urly", + "##vana", + "Egg", + "Wolverine", + "Stupid", + "centralized", + "knit", + "##Ms", + "Saratoga", + "Ogden", + "storylines", + "##vres", + "lavish", + "beverages", + "##grarian", + "Kyrgyzstan", + "forcefully", + "superb", + "Elm", + "Thessaloniki", + "follower", + "Plants", + "slang", + "trajectory", + "Nowadays", + "Bengals", + "Ingram", + "perch", + "coloring", + "carvings", + "doubtful", + "##aph", + "##gratulations", + "##41", + "Curse", + "253", + "nightstand", + "Campo", + "Meiji", + "decomposition", + "##giri", + "McCormick", + "Yours", + "##amon", + "##bang", + "Texans", + "injunction", + "organise", + "periodical", + "##peculative", + "oceans", + "##aley", + "Success", + "Lehigh", + "##guin", + "1730", + "Davy", + "allowance", + "obituary", + "##tov", + "treasury", + "##wayne", + "euros", + "readiness", + "systematically", + "##stered", + "##igor", + "##xen", + "##cliff", + "##lya", + "Send", + "##umatic", + "Celtics", + "Judiciary", + "425", + "propagation", + "rebellious", + "##ims", + "##lut", + "Dal", + "##ayman", + "##cloth", + "Boise", + "pairing", + "Waltz", + "torment", + "Hatch", + "aspirations", + "diaspora", + "##hame", + "Rank", + "237", + "Including", + "Muir", + "chained", + "toxicity", + "Université", + "##aroo", + "Mathews", + "meadows", + "##bio", + "Editing", + "Khorasan", + "##them", + "##ahn", + "##bari", + "##umes", + "evacuate", + "##sium", + "gram", + "kidnap", + "pinning", + "##diation", + "##orms", + "beacon", + "organising", + "McGrath", + "##ogist", + "Qur", + "Tango", + "##ceptor", + "##rud", + "##cend", + "##cie", + "##jas", + "##sided", + "Tuscany", + "Venture", + "creations", + "exhibiting", + "##rcerer", + "##tten", + "Butcher", + "Divinity", + "Pet", + "Whitehead", + "falsely", + "perished", + "handy", + "Moines", + "cyclists", + "synthesizers", + "Mortal", + "notoriety", + "##ronic", + "Dialogue", + "expressive", + "uk", + "Nightingale", + "grimly", + "vineyards", + "Driving", + "relentless", + "compiler", + "##district", + "##tuated", + "Hades", + "medicines", + "objection", + "Answer", + "Soap", + "Chattanooga", + "##gogue", + "Haryana", + "Parties", + "Turtle", + "##ferred", + "explorers", + "stakeholders", + "##aar", + "##rbonne", + "tempered", + "conjecture", + "##tee", + "##hur", + "Reeve", + "bumper", + "stew", + "##church", + "##generate", + "##ilitating", + "##chanized", + "##elier", + "##enne", + "translucent", + "##lows", + "Publisher", + "evangelical", + "inherit", + "##rted", + "247", + "SmackDown", + "bitterness", + "lesions", + "##worked", + "mosques", + "wed", + "##lashes", + "Ng", + "Rebels", + "booking", + "##nail", + "Incident", + "Sailing", + "yo", + "confirms", + "Chaplin", + "baths", + "##kled", + "modernist", + "pulsing", + "Cicero", + "slaughtered", + "boasted", + "##losure", + "zipper", + "##hales", + "aristocracy", + "halftime", + "jolt", + "unlawful", + "Marching", + "sustaining", + "Yerevan", + "bracket", + "ram", + "Markus", + "##zef", + "butcher", + "massage", + "##quisite", + "Leisure", + "Pizza", + "collapsing", + "##lante", + "commentaries", + "scripted", + "##disciplinary", + "##sused", + "eroded", + "alleging", + "vase", + "Chichester", + "Peacock", + "commencement", + "dice", + "hotter", + "poisonous", + "executions", + "##occo", + "frost", + "fielding", + "vendor", + "Counts", + "Troops", + "maize", + "Divisional", + "analogue", + "shadowy", + "Nuevo", + "Ville", + "radiating", + "worthless", + "Adriatic", + "Buy", + "blaze", + "brutally", + "horizontally", + "longed", + "##matical", + "federally", + "Rolf", + "Root", + "exclude", + "rag", + "agitation", + "Lounge", + "astonished", + "##wirl", + "Impossible", + "transformations", + "##IVE", + "##ceded", + "##slav", + "downloaded", + "fucked", + "Egyptians", + "Welles", + "##ffington", + "U2", + "befriended", + "radios", + "##jid", + "archaic", + "compares", + "##ccelerator", + "##imated", + "##tosis", + "Hung", + "Scientists", + "Thousands", + "geographically", + "##LR", + "Macintosh", + "fluorescent", + "##ipur", + "Wehrmacht", + "##BR", + "##firmary", + "Chao", + "##ague", + "Boyer", + "##grounds", + "##hism", + "##mento", + "##taining", + "infancy", + "##cton", + "510", + "Boca", + "##loy", + "1644", + "ben", + "dong", + "stresses", + "Sweat", + "expressway", + "graders", + "ochreous", + "nets", + "Lawn", + "thirst", + "Uruguayan", + "satisfactory", + "##tracts", + "baroque", + "rusty", + "##ław", + "Shen", + "Gdańsk", + "chickens", + "##graving", + "Hodge", + "Papal", + "SAT", + "bearer", + "##ogo", + "##rger", + "merits", + "Calendar", + "Highest", + "Skills", + "##ortex", + "Roberta", + "paradigm", + "recounts", + "frigates", + "swamps", + "unitary", + "##oker", + "balloons", + "Hawthorne", + "Muse", + "spurred", + "advisors", + "reclaimed", + "stimulate", + "fibre", + "pat", + "repeal", + "##dgson", + "##iar", + "##rana", + "anthropologist", + "descends", + "flinch", + "reared", + "##chang", + "##eric", + "##lithic", + "commissioning", + "##cumenical", + "##lume", + "##rchen", + "Wolff", + "##tsky", + "Eurasian", + "Nepali", + "Nightmare", + "ZIP", + "playback", + "##latz", + "##vington", + "Warm", + "##75", + "Martina", + "Rollins", + "Saetan", + "Variations", + "sorting", + "##م", + "530", + "Joaquin", + "Ptolemy", + "thinner", + "##iator", + "##pticism", + "Cebu", + "Highlanders", + "Linden", + "Vanguard", + "##SV", + "##mor", + "##ulge", + "ISSN", + "cartridges", + "repression", + "Étienne", + "311", + "Lauderdale", + "commodities", + "null", + "##rb", + "1720", + "gearbox", + "##reator", + "Ang", + "Forgotten", + "dubious", + "##rls", + "##dicative", + "##phate", + "Groove", + "Herrera", + "##çais", + "Collections", + "Maximus", + "##published", + "Fell", + "Qualification", + "filtering", + "##tized", + "Roe", + "hazards", + "##37", + "##lative", + "##tröm", + "Guadalupe", + "Tajikistan", + "Preliminary", + "fronted", + "glands", + "##paper", + "##iche", + "##iding", + "Cairns", + "rallies", + "Location", + "seduce", + "##mple", + "BYU", + "##itic", + "##FT", + "Carmichael", + "Prentice", + "songwriters", + "forefront", + "Physicians", + "##rille", + "##zee", + "Preparatory", + "##cherous", + "UV", + "##dized", + "Navarro", + "misses", + "##nney", + "Inland", + "resisting", + "##sect", + "Hurt", + "##lino", + "galaxies", + "##raze", + "Institutions", + "devote", + "##lamp", + "##ciating", + "baron", + "##bracing", + "Hess", + "operatic", + "##CL", + "##ος", + "Chevalier", + "Guiana", + "##lattered", + "Fed", + "##cuted", + "##smo", + "Skull", + "denies", + "236", + "Waller", + "##mah", + "Sakura", + "mole", + "nominate", + "sermons", + "##bering", + "widowed", + "##röm", + "Cavendish", + "##struction", + "Nehru", + "Revelation", + "doom", + "Gala", + "baking", + "Nr", + "Yourself", + "banning", + "Individuals", + "Sykes", + "orchestrated", + "630", + "Phone", + "steered", + "620", + "specialising", + "starvation", + "##AV", + "##alet", + "##upation", + "seductive", + "##jects", + "##zure", + "Tolkien", + "Benito", + "Wizards", + "Submarine", + "dictator", + "Duo", + "Caden", + "approx", + "basins", + "##nc", + "shrink", + "##icles", + "##sponsible", + "249", + "mit", + "outpost", + "##bayashi", + "##rouse", + "##tl", + "Jana", + "Lombard", + "RBIs", + "finalized", + "humanities", + "##function", + "Honorable", + "tomato", + "##iot", + "Pie", + "tee", + "##pect", + "Beaufort", + "Ferris", + "bucks", + "##graduate", + "##ocytes", + "Directory", + "anxiously", + "##nating", + "flanks", + "##Ds", + "virtues", + "##believable", + "Grades", + "criterion", + "manufactures", + "sourced", + "##balt", + "##dance", + "##tano", + "Ying", + "##BF", + "##sett", + "adequately", + "blacksmith", + "totaled", + "trapping", + "expanse", + "Historia", + "Worker", + "Sense", + "ascending", + "housekeeper", + "##oos", + "Crafts", + "Resurrection", + "##verty", + "encryption", + "##aris", + "##vat", + "##pox", + "##runk", + "##iability", + "gazes", + "spying", + "##ths", + "helmets", + "wired", + "##zophrenia", + "Cheung", + "WR", + "downloads", + "stereotypes", + "239", + "Lucknow", + "bleak", + "Bragg", + "hauling", + "##haft", + "prohibit", + "##ermined", + "##castle", + "barony", + "##hta", + "Typhoon", + "antibodies", + "##ascism", + "Hawthorn", + "Kurdistan", + "Minority", + "Gorge", + "Herr", + "appliances", + "disrupt", + "Drugs", + "Lazarus", + "##ilia", + "##ryo", + "##tany", + "Gotta", + "Masovian", + "Roxy", + "choreographed", + "##rissa", + "turbulent", + "##listed", + "Anatomy", + "exiting", + "##det", + "##isław", + "580", + "Kaufman", + "sage", + "##apa", + "Symposium", + "##rolls", + "Kaye", + "##ptera", + "##rocław", + "jerking", + "##menclature", + "Guo", + "M1", + "resurrected", + "trophies", + "##lard", + "Gathering", + "nestled", + "serpent", + "Dow", + "reservoirs", + "Claremont", + "arbitration", + "chronicle", + "eki", + "##arded", + "##zers", + "##mmoth", + "Congregational", + "Astronomical", + "NE", + "RA", + "Robson", + "Scotch", + "modelled", + "slashed", + "##imus", + "exceeds", + "##roper", + "##utile", + "Laughing", + "vascular", + "superficial", + "##arians", + "Barclay", + "Caucasian", + "classmate", + "sibling", + "Kimberly", + "Shreveport", + "##ilde", + "##liche", + "Cheney", + "Deportivo", + "Veracruz", + "berries", + "##lase", + "Bed", + "MI", + "Anatolia", + "Mindanao", + "broadband", + "##olia", + "##arte", + "##wab", + "darts", + "##immer", + "##uze", + "believers", + "ordinance", + "violate", + "##wheel", + "##ynth", + "Alongside", + "Coupe", + "Hobbs", + "arrondissement", + "earl", + "townland", + "##dote", + "##lihood", + "##sla", + "Ghosts", + "midfield", + "pulmonary", + "##eno", + "cues", + "##gol", + "##zda", + "322", + "Siena", + "Sultanate", + "Bradshaw", + "Pieter", + "##thical", + "Raceway", + "bared", + "competence", + "##ssent", + "Bet", + "##urer", + "##ła", + "Alistair", + "Göttingen", + "appropriately", + "forge", + "##osterone", + "##ugen", + "DL", + "345", + "convoys", + "inventions", + "##resses", + "##cturnal", + "Fay", + "Integration", + "slash", + "##roats", + "Widow", + "barking", + "##fant", + "1A", + "Hooper", + "##cona", + "##runched", + "unreliable", + "##emont", + "##esign", + "##stabulary", + "##stop", + "Journalists", + "bony", + "##iba", + "##trata", + "##ège", + "horrific", + "##bish", + "Jocelyn", + "##rmon", + "##apon", + "##cier", + "trainers", + "##ulatory", + "1753", + "BR", + "corpus", + "synthesized", + "##bidden", + "##rafford", + "Elgin", + "##entry", + "Doherty", + "clockwise", + "##played", + "spins", + "##ample", + "##bley", + "Cope", + "constructions", + "seater", + "warlord", + "Voyager", + "documenting", + "fairies", + "##viator", + "Lviv", + "jewellery", + "suites", + "##gold", + "Maia", + "NME", + "##eavor", + "##kus", + "Eugène", + "furnishings", + "##risto", + "MCC", + "Metropolis", + "Older", + "Telangana", + "##mpus", + "amplifier", + "supervising", + "1710", + "buffalo", + "cushion", + "terminating", + "##powering", + "steak", + "Quickly", + "contracting", + "dem", + "sarcastically", + "Elsa", + "##hein", + "bastards", + "narratives", + "Takes", + "304", + "composure", + "typing", + "variance", + "##ifice", + "Softball", + "##rations", + "McLaughlin", + "gaped", + "shrines", + "##hogany", + "Glamorgan", + "##icle", + "##nai", + "##ntin", + "Fleetwood", + "Woodland", + "##uxe", + "fictitious", + "shrugs", + "##iper", + "BWV", + "conform", + "##uckled", + "Launch", + "##ductory", + "##mized", + "Tad", + "##stituted", + "##free", + "Bel", + "Chávez", + "messing", + "quartz", + "##iculate", + "##folia", + "##lynn", + "ushered", + "##29", + "##ailing", + "dictated", + "Pony", + "##opsis", + "precinct", + "802", + "Plastic", + "##ughter", + "##uno", + "##porated", + "Denton", + "Matters", + "SPD", + "hating", + "##rogen", + "Essential", + "Deck", + "Dortmund", + "obscured", + "##maging", + "Earle", + "##bred", + "##ittle", + "##ropolis", + "saturated", + "##fiction", + "##ression", + "Pereira", + "Vinci", + "mute", + "warehouses", + "##ún", + "biographies", + "##icking", + "sealing", + "##dered", + "executing", + "pendant", + "##wives", + "murmurs", + "##oko", + "substrates", + "symmetrical", + "Susie", + "##mare", + "Yusuf", + "analogy", + "##urage", + "Lesley", + "limitation", + "##rby", + "##ío", + "disagreements", + "##mise", + "embroidered", + "nape", + "unarmed", + "Sumner", + "Stores", + "dwell", + "Wilcox", + "creditors", + "##rivatization", + "##shes", + "##amia", + "directs", + "recaptured", + "scouting", + "McGuire", + "cradle", + "##onnell", + "Sato", + "insulin", + "mercenary", + "tolerant", + "Macquarie", + "transitions", + "cradled", + "##berto", + "##ivism", + "##yotes", + "FF", + "Ke", + "Reach", + "##dbury", + "680", + "##bill", + "##oja", + "##sui", + "prairie", + "##ogan", + "reactive", + "##icient", + "##rits", + "Cyclone", + "Sirius", + "Survival", + "Pak", + "##coach", + "##trar", + "halves", + "Agatha", + "Opus", + "contrasts", + "##jection", + "ominous", + "##iden", + "Baylor", + "Woodrow", + "duct", + "fortification", + "intercourse", + "##rois", + "Colbert", + "envy", + "##isi", + "Afterward", + "geared", + "##flections", + "accelerate", + "##lenching", + "Witness", + "##rrer", + "Angelina", + "Material", + "assertion", + "misconduct", + "Nix", + "cringed", + "tingling", + "##eti", + "##gned", + "Everest", + "disturb", + "sturdy", + "##keepers", + "##vied", + "Profile", + "heavenly", + "##kova", + "##victed", + "translating", + "##sses", + "316", + "Invitational", + "Mention", + "martyr", + "##uristic", + "Barron", + "hardness", + "Nakamura", + "405", + "Genevieve", + "reflections", + "##falls", + "jurist", + "##LT", + "Pyramid", + "##yme", + "Shoot", + "heck", + "linguist", + "##tower", + "Ives", + "superiors", + "##leo", + "Achilles", + "##phological", + "Christophe", + "Padma", + "precedence", + "grassy", + "Oral", + "resurrection", + "##itting", + "clumsy", + "##lten", + "##rue", + "huts", + "##stars", + "Equal", + "##queduct", + "Devin", + "Gaga", + "diocesan", + "##plating", + "##upe", + "##graphers", + "Patch", + "Scream", + "hail", + "moaning", + "tracts", + "##hdi", + "Examination", + "outsider", + "##ergic", + "##oter", + "Archipelago", + "Havilland", + "greenish", + "tilting", + "Aleksandr", + "Konstantin", + "warship", + "##emann", + "##gelist", + "##ought", + "billionaire", + "##blivion", + "321", + "Hungarians", + "transplant", + "##jured", + "##fters", + "Corbin", + "autism", + "pitchers", + "Garner", + "thence", + "Scientology", + "transitioned", + "integrating", + "repetitive", + "##dant", + "Rene", + "vomit", + "##burne", + "1661", + "Researchers", + "Wallis", + "insulted", + "wavy", + "##wati", + "Ewing", + "excitedly", + "##kor", + "frescoes", + "injustice", + "##achal", + "##lumber", + "##úl", + "novella", + "##sca", + "Liv", + "##enstein", + "##river", + "monstrous", + "topping", + "downfall", + "looming", + "sinks", + "trillion", + "##pont", + "Effect", + "##phi", + "##urley", + "Sites", + "catchment", + "##H1", + "Hopper", + "##raiser", + "1642", + "Maccabi", + "lance", + "##chia", + "##sboro", + "NSA", + "branching", + "retorted", + "tensor", + "Immaculate", + "drumming", + "feeder", + "##mony", + "Dyer", + "homicide", + "Temeraire", + "fishes", + "protruding", + "skins", + "orchards", + "##nso", + "inlet", + "ventral", + "##finder", + "Asiatic", + "Sul", + "1688", + "Melinda", + "assigns", + "paranormal", + "gardening", + "Tau", + "calming", + "##inge", + "##crow", + "regimental", + "Nik", + "fastened", + "correlated", + "##gene", + "##rieve", + "Sick", + "##minster", + "##politan", + "hardwood", + "hurled", + "##ssler", + "Cinematography", + "rhyme", + "Montenegrin", + "Packard", + "debating", + "##itution", + "Helens", + "Trick", + "Museums", + "defiance", + "encompassed", + "##EE", + "##TU", + "##nees", + "##uben", + "##ünster", + "##nosis", + "435", + "Hagen", + "cinemas", + "Corbett", + "commended", + "##fines", + "##oman", + "bosses", + "ripe", + "scraping", + "##loc", + "filly", + "Saddam", + "pointless", + "Faust", + "Orléans", + "Syriac", + "##♭", + "longitude", + "##ropic", + "Alfa", + "bliss", + "gangster", + "##ckling", + "SL", + "blending", + "##eptide", + "##nner", + "bends", + "escorting", + "##bloid", + "##quis", + "burials", + "##sle", + "##è", + "Ambulance", + "insults", + "##gth", + "Antrim", + "unfolded", + "##missible", + "splendid", + "Cure", + "warily", + "Saigon", + "Waste", + "astonishment", + "boroughs", + "##VS", + "##dalgo", + "##reshing", + "##usage", + "rue", + "marital", + "versatile", + "unpaid", + "allotted", + "bacterium", + "##coil", + "##cue", + "Dorothea", + "IDF", + "##location", + "##yke", + "RPG", + "##tropical", + "devotees", + "liter", + "##pree", + "Johnstone", + "astronaut", + "attends", + "pollen", + "periphery", + "doctrines", + "meta", + "showered", + "##tyn", + "GO", + "Huh", + "laude", + "244", + "Amar", + "Christensen", + "Ping", + "Pontifical", + "Austen", + "raiding", + "realities", + "##dric", + "urges", + "##dek", + "Cambridgeshire", + "##otype", + "Cascade", + "Greenberg", + "Pact", + "##cognition", + "##aran", + "##urion", + "Riot", + "mimic", + "Eastwood", + "##imating", + "reversal", + "##blast", + "##henian", + "Pitchfork", + "##sunderstanding", + "Staten", + "WCW", + "lieu", + "##bard", + "##sang", + "experimenting", + "Aquino", + "##lums", + "TNT", + "Hannibal", + "catastrophic", + "##lsive", + "272", + "308", + "##otypic", + "41st", + "Highways", + "aggregator", + "##fluenza", + "Featured", + "Reece", + "dispatch", + "simulated", + "##BE", + "Communion", + "Vinnie", + "hardcover", + "inexpensive", + "til", + "##adores", + "groundwater", + "kicker", + "blogs", + "frenzy", + "##wala", + "dealings", + "erase", + "Anglia", + "##umour", + "Hapoel", + "Marquette", + "##raphic", + "##tives", + "consult", + "atrocities", + "concussion", + "##érard", + "Decree", + "ethanol", + "##aen", + "Rooney", + "##chemist", + "##hoot", + "1620", + "menacing", + "Schuster", + "##bearable", + "laborers", + "sultan", + "Juliana", + "erased", + "onstage", + "##ync", + "Eastman", + "##tick", + "hushed", + "##yrinth", + "Lexie", + "Wharton", + "Lev", + "##PL", + "Testing", + "Bangladeshi", + "##bba", + "##usions", + "communicated", + "integers", + "internship", + "societal", + "##odles", + "Loki", + "ET", + "Ghent", + "broadcasters", + "Unix", + "##auer", + "Kildare", + "Yamaha", + "##quencing", + "##zman", + "chilled", + "##rapped", + "##uant", + "Duval", + "sentiments", + "Oliveira", + "packets", + "Horne", + "##rient", + "Harlan", + "Mirage", + "invariant", + "##anger", + "##tensive", + "flexed", + "sweetness", + "##wson", + "alleviate", + "insulting", + "limo", + "Hahn", + "##llars", + "##hesia", + "##lapping", + "buys", + "##oaming", + "mocked", + "pursuits", + "scooted", + "##conscious", + "##ilian", + "Ballad", + "jackets", + "##kra", + "hilly", + "##cane", + "Scenic", + "McGraw", + "silhouette", + "whipping", + "##roduced", + "##wark", + "##chess", + "##rump", + "Lemon", + "calculus", + "demonic", + "##latine", + "Bharatiya", + "Govt", + "Que", + "Trilogy", + "Ducks", + "Suit", + "stairway", + "##ceipt", + "Isa", + "regulator", + "Automobile", + "flatly", + "##buster", + "##lank", + "Spartans", + "topography", + "Tavi", + "usable", + "Chartered", + "Fairchild", + "##sance", + "##vyn", + "Digest", + "nuclei", + "typhoon", + "##llon", + "Alvarez", + "DJs", + "Grimm", + "authoritative", + "firearm", + "##chschule", + "Origins", + "lair", + "unmistakable", + "##xial", + "##cribing", + "Mouth", + "##genesis", + "##shū", + "##gaon", + "##ulter", + "Jaya", + "Neck", + "##UN", + "##oing", + "##static", + "relativity", + "##mott", + "##utive", + "##esan", + "##uveau", + "BT", + "salts", + "##roa", + "Dustin", + "preoccupied", + "Novgorod", + "##asus", + "Magnum", + "tempting", + "##histling", + "##ilated", + "Musa", + "##ghty", + "Ashland", + "pubs", + "routines", + "##etto", + "Soto", + "257", + "Featuring", + "Augsburg", + "##alaya", + "Bit", + "loomed", + "expects", + "##abby", + "##ooby", + "Auschwitz", + "Pendleton", + "vodka", + "##sent", + "rescuing", + "systemic", + "##inet", + "##leg", + "Yun", + "applicant", + "revered", + "##nacht", + "##ndas", + "Muller", + "characterization", + "##patient", + "##roft", + "Carole", + "##asperated", + "Amiga", + "disconnected", + "gel", + "##cologist", + "Patriotic", + "rallied", + "assign", + "veterinary", + "installing", + "##cedural", + "258", + "Jang", + "Parisian", + "incarcerated", + "stalk", + "##iment", + "Jamal", + "McPherson", + "Palma", + "##oken", + "##viation", + "512", + "Rourke", + "irrational", + "##rippled", + "Devlin", + "erratic", + "##NI", + "##payers", + "Ni", + "engages", + "Portal", + "aesthetics", + "##rrogance", + "Milne", + "assassins", + "##rots", + "335", + "385", + "Cambodian", + "Females", + "fellows", + "si", + "##block", + "##otes", + "Jayne", + "Toro", + "flutter", + "##eera", + "Burr", + "##lanche", + "relaxation", + "##fra", + "Fitzroy", + "##undy", + "1751", + "261", + "comb", + "conglomerate", + "ribbons", + "veto", + "##Es", + "casts", + "##ege", + "1748", + "Ares", + "spears", + "spirituality", + "comet", + "##nado", + "##yeh", + "Veterinary", + "aquarium", + "yer", + "Councils", + "##oked", + "##ynamic", + "Malmö", + "remorse", + "auditions", + "drilled", + "Hoffmann", + "Moe", + "Nagoya", + "Yacht", + "##hakti", + "##race", + "##rrick", + "Talmud", + "coordinating", + "##EI", + "##bul", + "##his", + "##itors", + "##ligent", + "##uerra", + "Narayan", + "goaltender", + "taxa", + "##asures", + "Det", + "##mage", + "Infinite", + "Maid", + "bean", + "intriguing", + "##cription", + "gasps", + "socket", + "##mentary", + "##reus", + "sewing", + "transmitting", + "##different", + "##furbishment", + "##traction", + "Grimsby", + "sprawling", + "Shipyard", + "##destine", + "##hropic", + "##icked", + "trolley", + "##agi", + "##lesh", + "Josiah", + "invasions", + "Content", + "firefighters", + "intro", + "Lucifer", + "subunit", + "Sahib", + "Myrtle", + "inhibitor", + "maneuvers", + "##teca", + "Wrath", + "slippery", + "##versing", + "Shoes", + "##dial", + "##illiers", + "##luded", + "##mmal", + "##pack", + "handkerchief", + "##edestal", + "##stones", + "Fusion", + "cumulative", + "##mell", + "##cacia", + "##rudge", + "##utz", + "foe", + "storing", + "swiped", + "##meister", + "##orra", + "batter", + "strung", + "##venting", + "##kker", + "Doo", + "Taste", + "immensely", + "Fairbanks", + "Jarrett", + "Boogie", + "1746", + "mage", + "Kick", + "legislators", + "medial", + "##ilon", + "##logies", + "##ranton", + "Hybrid", + "##uters", + "Tide", + "deportation", + "Metz", + "##secration", + "##virus", + "UFO", + "##fell", + "##orage", + "##raction", + "##rrigan", + "1747", + "fabricated", + "##BM", + "##GR", + "##rter", + "muttering", + "theorist", + "##tamine", + "BMG", + "Kincaid", + "solvent", + "##azed", + "Thin", + "adorable", + "Wendell", + "ta", + "##viour", + "pulses", + "##pologies", + "counters", + "exposition", + "sewer", + "Luciano", + "Clancy", + "##angelo", + "##riars", + "Showtime", + "observes", + "frankly", + "##oppy", + "Bergman", + "lobes", + "timetable", + "##bri", + "##uest", + "FX", + "##dust", + "##genus", + "Glad", + "Helmut", + "Meridian", + "##besity", + "##ontaine", + "Revue", + "miracles", + "##titis", + "PP", + "bluff", + "syrup", + "307", + "Messiah", + "##erne", + "interfering", + "picturesque", + "unconventional", + "dipping", + "hurriedly", + "Kerman", + "248", + "Ethnic", + "Toward", + "acidic", + "Harrisburg", + "##65", + "intimidating", + "##aal", + "Jed", + "Pontiac", + "munitions", + "##nchen", + "growling", + "mausoleum", + "##ération", + "##wami", + "Cy", + "aerospace", + "caucus", + "Doing", + "##around", + "##miring", + "Cuthbert", + "##poradic", + "##rovisation", + "##wth", + "evaluating", + "##scraper", + "Belinda", + "owes", + "##sitic", + "##thermal", + "##fast", + "economists", + "##lishing", + "##uerre", + "##ân", + "credible", + "##koto", + "Fourteen", + "cones", + "##ebrates", + "bookstore", + "towels", + "##phony", + "Appearance", + "newscasts", + "##olin", + "Karin", + "Bingham", + "##elves", + "1680", + "306", + "disks", + "##lston", + "##secutor", + "Levant", + "##vout", + "Micro", + "snuck", + "##ogel", + "##racker", + "Exploration", + "drastic", + "##kening", + "Elsie", + "endowment", + "##utnant", + "Blaze", + "##rrosion", + "leaking", + "45th", + "##rug", + "##uernsey", + "760", + "Shapiro", + "cakes", + "##ehan", + "##mei", + "##ité", + "##kla", + "repetition", + "successively", + "Friendly", + "Île", + "Koreans", + "Au", + "Tirana", + "flourish", + "Spirits", + "Yao", + "reasoned", + "##leam", + "Consort", + "cater", + "marred", + "ordeal", + "supremacy", + "##ritable", + "Paisley", + "euro", + "healer", + "portico", + "wetland", + "##kman", + "restart", + "##habilitation", + "##zuka", + "##Script", + "emptiness", + "communion", + "##CF", + "##inhabited", + "##wamy", + "Casablanca", + "pulsed", + "##rrible", + "##safe", + "395", + "Dual", + "Terrorism", + "##urge", + "##found", + "##gnolia", + "Courage", + "patriarch", + "segregated", + "intrinsic", + "##liography", + "##phe", + "PD", + "convection", + "##icidal", + "Dharma", + "Jimmie", + "texted", + "constituents", + "twitch", + "##calated", + "##mitage", + "##ringing", + "415", + "milling", + "##geons", + "Armagh", + "Geometridae", + "evergreen", + "needy", + "reflex", + "template", + "##pina", + "Schubert", + "##bruck", + "##icted", + "##scher", + "##wildered", + "1749", + "Joanne", + "clearer", + "##narl", + "278", + "Print", + "automation", + "consciously", + "flashback", + "occupations", + "##ests", + "Casimir", + "differentiated", + "policing", + "repay", + "##aks", + "##gnesium", + "Evaluation", + "commotion", + "##CM", + "##smopolitan", + "Clapton", + "mitochondrial", + "Kobe", + "1752", + "Ignoring", + "Vincenzo", + "Wet", + "bandage", + "##rassed", + "##unate", + "Maris", + "##eted", + "##hetical", + "figuring", + "##eit", + "##nap", + "leopard", + "strategically", + "##reer", + "Fen", + "Iain", + "##ggins", + "##pipe", + "Matteo", + "McIntyre", + "##chord", + "##feng", + "Romani", + "asshole", + "flopped", + "reassure", + "Founding", + "Styles", + "Torino", + "patrolling", + "##erging", + "##ibrating", + "##ructural", + "sincerity", + "##ät", + "##teacher", + "Juliette", + "##cé", + "##hog", + "##idated", + "##span", + "Winfield", + "##fender", + "##nast", + "##pliant", + "1690", + "Bai", + "Je", + "Saharan", + "expands", + "Bolshevik", + "rotate", + "##root", + "Britannia", + "Severn", + "##cini", + "##gering", + "##say", + "sly", + "Steps", + "insertion", + "rooftop", + "Piece", + "cuffs", + "plausible", + "##zai", + "Provost", + "semantic", + "##data", + "##vade", + "##cimal", + "IPA", + "indictment", + "Libraries", + "flaming", + "highlands", + "liberties", + "##pio", + "Elders", + "aggressively", + "##pecific", + "Decision", + "pigeon", + "nominally", + "descriptive", + "adjustments", + "equestrian", + "heaving", + "##mour", + "##dives", + "##fty", + "##yton", + "intermittent", + "##naming", + "##sets", + "Calvert", + "Casper", + "Tarzan", + "##kot", + "Ramírez", + "##IB", + "##erus", + "Gustavo", + "Roller", + "vaulted", + "##solation", + "##formatics", + "##tip", + "Hunger", + "colloquially", + "handwriting", + "hearth", + "launcher", + "##idian", + "##ilities", + "##lind", + "##locating", + "Magdalena", + "Soo", + "clubhouse", + "##kushima", + "##ruit", + "Bogotá", + "Organic", + "Worship", + "##Vs", + "##wold", + "upbringing", + "##kick", + "groundbreaking", + "##urable", + "##ván", + "repulsed", + "##dira", + "##ditional", + "##ici", + "melancholy", + "##bodied", + "##cchi", + "404", + "concurrency", + "H₂O", + "bouts", + "##gami", + "288", + "Leto", + "troll", + "##lak", + "advising", + "bundled", + "##nden", + "lipstick", + "littered", + "##leading", + "##mogeneous", + "Experiment", + "Nikola", + "grove", + "##ogram", + "Mace", + "##jure", + "cheat", + "Annabelle", + "Tori", + "lurking", + "Emery", + "Walden", + "##riz", + "paints", + "Markets", + "brutality", + "overrun", + "##agu", + "##sat", + "din", + "ostensibly", + "Fielding", + "flees", + "##eron", + "Pound", + "ornaments", + "tornadoes", + "##nikov", + "##organisation", + "##reen", + "##Works", + "##ldred", + "##olten", + "##stillery", + "soluble", + "Mata", + "Grimes", + "Léon", + "##NF", + "coldly", + "permitting", + "##inga", + "##reaked", + "Agents", + "hostess", + "##dl", + "Dyke", + "Kota", + "avail", + "orderly", + "##saur", + "##sities", + "Arroyo", + "##ceps", + "##egro", + "Hawke", + "Noctuidae", + "html", + "seminar", + "##ggles", + "##wasaki", + "Clube", + "recited", + "##sace", + "Ascension", + "Fitness", + "dough", + "##ixel", + "Nationale", + "##solidate", + "pulpit", + "vassal", + "570", + "Annapolis", + "bladder", + "phylogenetic", + "##iname", + "convertible", + "##ppan", + "Comet", + "paler", + "##definite", + "Spot", + "##dices", + "frequented", + "Apostles", + "slalom", + "##ivision", + "##mana", + "##runcated", + "Trojan", + "##agger", + "##iq", + "##league", + "Concept", + "Controller", + "##barian", + "##curate", + "##spersed", + "##tring", + "engulfed", + "inquired", + "##hmann", + "286", + "##dict", + "##osy", + "##raw", + "MacKenzie", + "su", + "##ienced", + "##iggs", + "##quitaine", + "bisexual", + "##noon", + "runways", + "subsp", + "##!", + "##\"", + "###", + "##$", + "##%", + "##&", + "##'", + "##(", + "##)", + "##*", + "##+", + "##,", + "##-", + "##.", + "##/", + "##:", + "##;", + "##<", + "##=", + "##>", + "##?", + "##@", + "##[", + "##\\", + "##]", + "##^", + "##_", + "##`", + "##{", + "##|", + "##}", + "##~", + "##¡", + "##¢", + "##£", + "##¥", + "##§", + "##¨", + "##©", + "##ª", + "##«", + "##¬", + "##®", + "##±", + "##´", + "##µ", + "##¶", + "##·", + "##¹", + "##º", + "##»", + "##¼", + "##¾", + "##¿", + "##À", + "##Á", + "##Â", + "##Ä", + "##Å", + "##Æ", + "##Ç", + "##È", + "##É", + "##Í", + "##Î", + "##Ñ", + "##Ó", + "##Ö", + "##×", + "##Ø", + "##Ú", + "##Ü", + "##Þ", + "##â", + "##ã", + "##æ", + "##ç", + "##î", + "##ï", + "##ð", + "##ñ", + "##ô", + "##õ", + "##÷", + "##û", + "##þ", + "##ÿ", + "##Ā", + "##ą", + "##Ć", + "##Č", + "##ď", + "##Đ", + "##đ", + "##ē", + "##ė", + "##ę", + "##ě", + "##ğ", + "##ġ", + "##Ħ", + "##ħ", + "##ĩ", + "##Ī", + "##İ", + "##ļ", + "##Ľ", + "##ľ", + "##Ł", + "##ņ", + "##ň", + "##ŋ", + "##Ō", + "##ŏ", + "##ő", + "##Œ", + "##œ", + "##ř", + "##Ś", + "##ś", + "##Ş", + "##Š", + "##Ţ", + "##ţ", + "##ť", + "##ũ", + "##ŭ", + "##ů", + "##ű", + "##ų", + "##ŵ", + "##ŷ", + "##ź", + "##Ż", + "##ż", + "##Ž", + "##ž", + "##Ə", + "##ƒ", + "##ơ", + "##ư", + "##ǎ", + "##ǐ", + "##ǒ", + "##ǔ", + "##ǫ", + "##Ș", + "##Ț", + "##ț", + "##ɐ", + "##ɑ", + "##ɔ", + "##ɕ", + "##ə", + "##ɛ", + "##ɡ", + "##ɣ", + "##ɨ", + "##ɪ", + "##ɲ", + "##ɾ", + "##ʀ", + "##ʁ", + "##ʂ", + "##ʃ", + "##ʊ", + "##ʋ", + "##ʌ", + "##ʐ", + "##ʑ", + "##ʒ", + "##ʔ", + "##ʰ", + "##ʲ", + "##ʳ", + "##ʷ", + "##ʻ", + "##ʼ", + "##ʾ", + "##ʿ", + "##ˈ", + "##ː", + "##ˡ", + "##ˢ", + "##ˣ", + "##́", + "##̃", + "##̍", + "##̯", + "##͡", + "##Α", + "##Β", + "##Γ", + "##Δ", + "##Ε", + "##Η", + "##Θ", + "##Ι", + "##Κ", + "##Λ", + "##Μ", + "##Ν", + "##Ο", + "##Π", + "##Σ", + "##Τ", + "##Φ", + "##Χ", + "##Ψ", + "##Ω", + "##ά", + "##έ", + "##ή", + "##ί", + "##β", + "##γ", + "##δ", + "##ε", + "##ζ", + "##η", + "##θ", + "##ι", + "##κ", + "##λ", + "##μ", + "##ξ", + "##ο", + "##π", + "##ρ", + "##σ", + "##τ", + "##υ", + "##φ", + "##χ", + "##ψ", + "##ω", + "##ό", + "##ύ", + "##ώ", + "##І", + "##Ј", + "##А", + "##Б", + "##В", + "##Г", + "##Д", + "##Е", + "##Ж", + "##З", + "##И", + "##К", + "##Л", + "##М", + "##Н", + "##О", + "##П", + "##Р", + "##С", + "##Т", + "##У", + "##Ф", + "##Х", + "##Ц", + "##Ч", + "##Ш", + "##Э", + "##Ю", + "##Я", + "##б", + "##в", + "##г", + "##д", + "##ж", + "##з", + "##к", + "##л", + "##м", + "##п", + "##с", + "##т", + "##у", + "##ф", + "##х", + "##ц", + "##ч", + "##ш", + "##щ", + "##ъ", + "##ы", + "##ь", + "##э", + "##ю", + "##ё", + "##і", + "##ї", + "##ј", + "##њ", + "##ћ", + "##Ա", + "##Հ", + "##ա", + "##ե", + "##ի", + "##կ", + "##մ", + "##յ", + "##ն", + "##ո", + "##ս", + "##տ", + "##ր", + "##ւ", + "##ְ", + "##ִ", + "##ֵ", + "##ֶ", + "##ַ", + "##ָ", + "##ֹ", + "##ּ", + "##א", + "##ב", + "##ג", + "##ד", + "##ה", + "##ו", + "##ז", + "##ח", + "##ט", + "##י", + "##כ", + "##ל", + "##ם", + "##מ", + "##ן", + "##נ", + "##ס", + "##ע", + "##פ", + "##צ", + "##ק", + "##ר", + "##ש", + "##ת", + "##،", + "##ء", + "##آ", + "##أ", + "##إ", + "##ئ", + "##ا", + "##ب", + "##ت", + "##ث", + "##ج", + "##ح", + "##خ", + "##ذ", + "##ز", + "##س", + "##ش", + "##ص", + "##ض", + "##ط", + "##ظ", + "##ع", + "##غ", + "##ف", + "##ق", + "##ك", + "##ل", + "##و", + "##ى", + "##َ", + "##ِ", + "##ٹ", + "##پ", + "##چ", + "##ک", + "##گ", + "##ہ", + "##ی", + "##ے", + "##ं", + "##आ", + "##क", + "##ग", + "##च", + "##ज", + "##ण", + "##त", + "##द", + "##ध", + "##न", + "##प", + "##ब", + "##भ", + "##म", + "##य", + "##र", + "##ल", + "##व", + "##श", + "##ष", + "##स", + "##ह", + "##ा", + "##ि", + "##ी", + "##ु", + "##े", + "##ो", + "##्", + "##।", + "##॥", + "##আ", + "##ই", + "##এ", + "##ও", + "##ক", + "##খ", + "##গ", + "##চ", + "##ছ", + "##জ", + "##ট", + "##ত", + "##থ", + "##দ", + "##ধ", + "##ন", + "##প", + "##ব", + "##ম", + "##য", + "##র", + "##ল", + "##শ", + "##স", + "##হ", + "##়", + "##া", + "##ি", + "##ী", + "##ু", + "##ে", + "##ো", + "##্", + "##য়", + "##க", + "##த", + "##ப", + "##ம", + "##ய", + "##ர", + "##ல", + "##வ", + "##ா", + "##ி", + "##ு", + "##்", + "##ร", + "##་", + "##ག", + "##ང", + "##ད", + "##ན", + "##བ", + "##མ", + "##ར", + "##ལ", + "##ས", + "##ི", + "##ུ", + "##ེ", + "##ོ", + "##ა", + "##ე", + "##ი", + "##ლ", + "##ნ", + "##ო", + "##რ", + "##ს", + "##ᴬ", + "##ᴵ", + "##ᵀ", + "##ᵃ", + "##ᵇ", + "##ᵈ", + "##ᵉ", + "##ᵍ", + "##ᵏ", + "##ᵐ", + "##ᵒ", + "##ᵖ", + "##ᵗ", + "##ᵘ", + "##ᵣ", + "##ᵤ", + "##ᵥ", + "##ᶜ", + "##ᶠ", + "##ḍ", + "##Ḥ", + "##ḥ", + "##Ḩ", + "##ḩ", + "##ḳ", + "##ṃ", + "##ṅ", + "##ṇ", + "##ṛ", + "##ṣ", + "##ṭ", + "##ạ", + "##ả", + "##ấ", + "##ầ", + "##ẩ", + "##ậ", + "##ắ", + "##ế", + "##ề", + "##ể", + "##ễ", + "##ệ", + "##ị", + "##ọ", + "##ố", + "##ồ", + "##ổ", + "##ộ", + "##ớ", + "##ờ", + "##ợ", + "##ụ", + "##ủ", + "##ứ", + "##ừ", + "##ử", + "##ữ", + "##ự", + "##ỳ", + "##ỹ", + "##ἀ", + "##ἐ", + "##ὁ", + "##ὐ", + "##ὰ", + "##ὶ", + "##ὸ", + "##ῆ", + "##ῖ", + "##ῦ", + "##ῶ", + "##‐", + "##‑", + "##‒", + "##–", + "##—", + "##―", + "##‖", + "##‘", + "##’", + "##‚", + "##“", + "##”", + "##„", + "##†", + "##‡", + "##•", + "##…", + "##‰", + "##′", + "##″", + "##⁄", + "##⁰", + "##ⁱ", + "##⁴", + "##⁵", + "##⁶", + "##⁷", + "##⁸", + "##⁹", + "##⁻", + "##ⁿ", + "##₅", + "##₆", + "##₇", + "##₈", + "##₉", + "##₊", + "##₍", + "##₎", + "##ₐ", + "##ₑ", + "##ₒ", + "##ₓ", + "##ₕ", + "##ₖ", + "##ₘ", + "##ₚ", + "##ₛ", + "##ₜ", + "##₤", + "##€", + "##₱", + "##₹", + "##ℓ", + "##№", + "##ℝ", + "##⅓", + "##←", + "##↑", + "##→", + "##↔", + "##⇌", + "##⇒", + "##∂", + "##∈", + "##∗", + "##∘", + "##√", + "##∞", + "##∧", + "##∨", + "##∩", + "##∪", + "##≈", + "##≠", + "##≡", + "##≤", + "##≥", + "##⊂", + "##⊆", + "##⊕", + "##⋅", + "##─", + "##│", + "##■", + "##●", + "##★", + "##☆", + "##☉", + "##♠", + "##♣", + "##♥", + "##♦", + "##♯", + "##⟨", + "##⟩", + "##ⱼ", + "##、", + "##。", + "##《", + "##》", + "##「", + "##」", + "##『", + "##』", + "##〜", + "##い", + "##う", + "##え", + "##お", + "##か", + "##き", + "##く", + "##け", + "##こ", + "##さ", + "##し", + "##す", + "##せ", + "##そ", + "##た", + "##ち", + "##つ", + "##て", + "##と", + "##な", + "##に", + "##の", + "##は", + "##ひ", + "##ま", + "##み", + "##む", + "##め", + "##も", + "##や", + "##ゆ", + "##よ", + "##ら", + "##り", + "##る", + "##れ", + "##ん", + "##ア", + "##ィ", + "##イ", + "##ウ", + "##エ", + "##オ", + "##カ", + "##ガ", + "##キ", + "##ク", + "##グ", + "##コ", + "##サ", + "##シ", + "##ジ", + "##ス", + "##ズ", + "##タ", + "##ダ", + "##ッ", + "##テ", + "##デ", + "##ト", + "##ド", + "##ナ", + "##ニ", + "##ハ", + "##バ", + "##パ", + "##フ", + "##ブ", + "##プ", + "##マ", + "##ミ", + "##ム", + "##ャ", + "##ュ", + "##ラ", + "##リ", + "##ル", + "##レ", + "##ロ", + "##ン", + "##・", + "##ー", + "##一", + "##三", + "##上", + "##下", + "##中", + "##事", + "##二", + "##井", + "##京", + "##人", + "##亻", + "##仁", + "##佐", + "##侍", + "##光", + "##公", + "##力", + "##北", + "##十", + "##南", + "##原", + "##口", + "##史", + "##司", + "##吉", + "##同", + "##和", + "##囗", + "##国", + "##國", + "##土", + "##城", + "##士", + "##大", + "##天", + "##太", + "##夫", + "##女", + "##子", + "##宀", + "##安", + "##宮", + "##宿", + "##小", + "##尚", + "##山", + "##島", + "##川", + "##州", + "##平", + "##年", + "##心", + "##愛", + "##戸", + "##文", + "##新", + "##方", + "##日", + "##明", + "##星", + "##書", + "##月", + "##木", + "##本", + "##李", + "##村", + "##東", + "##松", + "##林", + "##正", + "##武", + "##氏", + "##水", + "##氵", + "##江", + "##河", + "##海", + "##版", + "##犬", + "##王", + "##生", + "##田", + "##白", + "##皇", + "##省", + "##真", + "##石", + "##社", + "##神", + "##竹", + "##美", + "##義", + "##花", + "##藤", + "##西", + "##谷", + "##車", + "##辶", + "##道", + "##郎", + "##郡", + "##部", + "##野", + "##金", + "##長", + "##門", + "##陽", + "##青", + "##食", + "##馬", + "##高", + "##龍", + "##龸", + "##사", + "##씨", + "##의", + "##이", + "##한", + "##fi", + "##fl", + "##!", + "##(", + "##)", + "##,", + "##-", + "##/", + "##:" + ] +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java index 7c69587492881..34c60e4d429b4 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java @@ -224,6 +224,7 @@ class ProcessContext { } void infer(String inputs, String requestId) throws IOException { + logger.info("tokenizing input [{}]", inputs); BytesReference request = pipeline.get().createRequest(inputs, requestId); logger.info("I Request "+ request.utf8ToString()); process.get().writeInferenceRequest(request); diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java index b5abdcafa87c0..a81a275cdbab7 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java @@ -23,7 +23,7 @@ private NlpPipeline(TaskType taskType, BertTokenizer tokenizer) { } public BytesReference createRequest(String inputs, String requestId) throws IOException { - BertTokenizer.TokenizationResult tokens = tokenizer.tokenize(inputs); + BertTokenizer.TokenizationResult tokens = tokenizer.tokenize(inputs, true); return taskType.jsonRequest(tokens.getTokenIds(), requestId); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java index 7c376a3545df5..63969df35bac6 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java @@ -24,6 +24,7 @@ public class PipelineConfig implements ToXContentObject { public static final ParseField VOCAB = new ParseField("vocab"); public static final ParseField TASK_TYPE = new ParseField("task_type"); + public static final ParseField LOWER_CASE = new ParseField("do_lower_case"); private static final ObjectParser<PipelineConfig.Builder, Void> STRICT_PARSER = createParser(false); private static final ObjectParser<PipelineConfig.Builder, Void> LENIENT_PARSER = createParser(true); @@ -35,6 +36,7 @@ private static ObjectParser<PipelineConfig.Builder, Void> createParser(boolean i parser.declareStringArray(Builder::setVocabulary, VOCAB); parser.declareString(Builder::setTaskType, TASK_TYPE); + parser.declareBoolean(Builder::setDoLowerCase, LOWER_CASE); return parser; } @@ -48,10 +50,12 @@ public static String documentId(String model) { private final TaskType taskType; private final List<String> vocabulary; + private final boolean doLowerCase; - PipelineConfig(TaskType taskType, List<String> vocabulary) { + PipelineConfig(TaskType taskType, List<String> vocabulary, boolean doLowerCase) { this.taskType = taskType; this.vocabulary = vocabulary; + this.doLowerCase = doLowerCase; } public TaskType getTaskType() { @@ -59,7 +63,7 @@ public TaskType getTaskType() { } public BertTokenizer buildTokenizer() { - return BertTokenizer.builder(vocabMap()).build(); + return BertTokenizer.builder(vocabMap()).setDoLowerCase(doLowerCase).build(); } SortedMap<String, Integer> vocabMap() { @@ -84,12 +88,14 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PipelineConfig that = (PipelineConfig) o; - return taskType == that.taskType && Objects.equals(vocabulary, that.vocabulary); + return taskType == that.taskType && + doLowerCase == that.doLowerCase && + Objects.equals(vocabulary, that.vocabulary); } @Override public int hashCode() { - return Objects.hash(taskType, vocabulary); + return Objects.hash(taskType, vocabulary, doLowerCase); } public static Builder builder() { @@ -100,6 +106,7 @@ public static class Builder { private TaskType taskType; private List<String> vocabulary; + private boolean doLowerCase = false; public Builder setTaskType(TaskType taskType) { this.taskType = taskType; @@ -116,8 +123,13 @@ public Builder setVocabulary(List<String> vocab) { return this; } + public Builder setDoLowerCase(boolean doLowerCase) { + this.doLowerCase = doLowerCase; + return this; + } + public PipelineConfig build() { - return new PipelineConfig(taskType, vocabulary); + return new PipelineConfig(taskType, vocabulary, doLowerCase); } } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java index 50a77f0453b84..12e540d97ce25 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java @@ -28,6 +28,8 @@ public class BertTokenizer { public static final String CLASS_TOKEN = "[CLS]"; public static final String MASK_TOKEN = "[MASK]"; + public static final int SPECIAL_TOKEN_POSITION = -1; + public static final int DEFAULT_MAX_INPUT_CHARS_PER_WORD = 100; private final WordPieceTokenizer wordPieceTokenizer; @@ -50,6 +52,10 @@ private BertTokenizer(Map<String, Integer> vocab, this.neverSplit = neverSplit; } + public TokenizationResult tokenize(String text) { + return tokenize(text, true); + } + /** * Tokenize the input according to the basic tokenization options * then perform Word Piece tokenization with the given vocabulary. @@ -57,14 +63,19 @@ private BertTokenizer(Map<String, Integer> vocab, * The result is the Word Piece tokens, a map of the Word Piece * token position to the position of the token in the source * @param text Text to tokenize + * @param withSpecialTokens Include CLS and SEP tokens * @return Tokenized text, token Ids and map */ - public TokenizationResult tokenize(String text) { + public TokenizationResult tokenize(String text, boolean withSpecialTokens) { BasicTokenizer basicTokenizer = new BasicTokenizer(doLowerCase, doTokenizeCjKChars, doStripAccents, neverSplit); List<String> delineatedTokens = basicTokenizer.tokenize(text); List<WordPieceTokenizer.TokenAndId> wordPieceTokens = new ArrayList<>(); List<Integer> tokenPositionMap = new ArrayList<>(); + if (withSpecialTokens) { + // insert the first token to simplify the loop counter logic later + tokenPositionMap.add(SPECIAL_TOKEN_POSITION); + } for (int sourceIndex = 0; sourceIndex < delineatedTokens.size(); sourceIndex++) { String token = delineatedTokens.get(sourceIndex); @@ -80,15 +91,29 @@ public TokenizationResult tokenize(String text) { } } - assert tokenPositionMap.size() == wordPieceTokens.size(); + int numTokens = withSpecialTokens ? wordPieceTokens.size() + 2 : wordPieceTokens.size(); + List<String> tokens = new ArrayList<>(numTokens); + int [] tokenIds = new int[numTokens]; + int [] tokenMap = new int[numTokens]; + + if (withSpecialTokens) { + tokens.add(CLASS_TOKEN); + tokenIds[0] = vocab.get(CLASS_TOKEN); + tokenMap[0] = SPECIAL_TOKEN_POSITION; + } - List<String> tokens = new ArrayList<>(wordPieceTokens.size()); - int [] tokenIds = new int[wordPieceTokens.size()]; - int [] tokenMap = new int[wordPieceTokens.size()]; - for (int i = 0; i < wordPieceTokens.size(); i++) { - tokens.add(wordPieceTokens.get(i).getToken()); - tokenIds[i] = wordPieceTokens.get(i).getId(); + int i = withSpecialTokens ? 1 : 0; + for (WordPieceTokenizer.TokenAndId tokenAndId : wordPieceTokens) { + tokens.add(tokenAndId.getToken()); + tokenIds[i] = tokenAndId.getId(); tokenMap[i] = tokenPositionMap.get(i); + i++; + } + + if (withSpecialTokens) { + tokens.add(SEPARATOR_TOKEN); + tokenIds[i] = vocab.get(SEPARATOR_TOKEN); + tokenMap[i] = SPECIAL_TOKEN_POSITION; } return new TokenizationResult(tokens, tokenIds, tokenMap); @@ -141,7 +166,7 @@ public static Builder builder(Map<String, Integer> vocab) { public static class Builder { private final Map<String, Integer> vocab; - private boolean doLowerCase = true; + private boolean doLowerCase = false; private boolean doTokenizeCjKChars = true; private Boolean doStripAccents = null; private Set<String> neverSplit; diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pytorch/process/NativePyTorchProcess.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pytorch/process/NativePyTorchProcess.java index 67710e6845dc1..11eed2b5a2950 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pytorch/process/NativePyTorchProcess.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pytorch/process/NativePyTorchProcess.java @@ -17,7 +17,6 @@ import org.elasticsearch.xpack.ml.process.ProcessResultsParser; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.Iterator; import java.util.List; diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java index 9021f18e8a60a..f85cc57fd35b1 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java @@ -7,10 +7,18 @@ package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; +import org.elasticsearch.ElasticsearchException; +import org.elasticsearch.common.xcontent.DeprecationHandler; +import org.elasticsearch.common.xcontent.NamedXContentRegistry; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.test.ESTestCase; +import java.io.IOException; +import java.net.URL; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; @@ -23,24 +31,37 @@ public void testTokenize() { WordPieceTokenizerTests.createVocabMap("elastic", "##search", "fun")) .build(); - BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun"); + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun", false); assertThat(tokenization.getTokens(), contains("elastic", "##search", "fun")); assertArrayEquals(new int[] {0, 1, 2}, tokenization.getTokenIds()); assertArrayEquals(new int[] {0, 0, 1}, tokenization.getTokenMap()); } - public void testBertVocab() { - BertTokenizer tokenizer = BertTokenizer.builder(vocabMap(bertVocab())).build(); - BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Jim bought 300 shares of Acme Corp. in 2006"); + public void testTokenizeAppendSpecialTokens() { + BertTokenizer tokenizer = BertTokenizer.builder( + WordPieceTokenizerTests.createVocabMap("elastic", "##search", "fun", + BertTokenizer.CLASS_TOKEN, BertTokenizer.SEPARATOR_TOKEN)) + .build(); + + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun", true); + assertThat(tokenization.getTokens(), contains("[CLS]", "elastic", "##search", "fun", "[SEP]")); + assertArrayEquals(new int[] {3, 0, 1, 2, 4}, tokenization.getTokenIds()); + assertArrayEquals(new int[] {-1, 0, 0, 1, -1}, tokenization.getTokenMap()); + } + + public void testBertVocab() throws IOException { + BertTokenizer tokenizer = BertTokenizer.builder(vocabMap(loadVocab())).setDoLowerCase(false).build(); + + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Jim bought 300 shares of Acme Corp. in 2006", true); assertArrayEquals(new int[] {101, 3104, 3306, 3127, 6117, 1104, 138, 1665, 3263, 13619, 119, 1107, 1386, 102}, tokenization.getTokenIds()); } - private SortedMap<String, Integer> vocabMap(String[] vocabulary) { + private SortedMap<String, Integer> vocabMap(List<String> vocabulary) { SortedMap<String, Integer> vocab = new TreeMap<>(); - for (int i = 0; i < vocabulary.length; i++) { - vocab.put(vocabulary[i], i); + for (int i = 0; i < vocabulary.size(); i++) { + vocab.put(vocabulary.get(i), i); } return vocab; } @@ -53,7 +74,7 @@ public void testNeverSplitTokens() { .setNeverSplit(Collections.singleton(specialToken)) .build(); - BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch " + specialToken + " fun"); + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch " + specialToken + " fun", false); assertThat(tokenization.getTokens(), contains("elastic", "##search", specialToken, "fun")); assertArrayEquals(new int[] {0, 1, 3, 2}, tokenization.getTokenIds()); assertArrayEquals(new int[] {0, 0, 1, 2}, tokenization.getTokenMap()); @@ -66,12 +87,12 @@ public void testDoLowerCase() { .setDoLowerCase(false) .build(); - BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun"); + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun", false); assertThat(tokenization.getTokens(), contains(BertTokenizer.UNKNOWN_TOKEN, "fun")); assertArrayEquals(new int[] {3, 2}, tokenization.getTokenIds()); assertArrayEquals(new int[] {0, 1}, tokenization.getTokenMap()); - tokenization = tokenizer.tokenize("elasticsearch fun"); + tokenization = tokenizer.tokenize("elasticsearch fun", false); assertThat(tokenization.getTokens(), contains("elastic", "##search", "fun")); } @@ -81,5281 +102,30 @@ public void testDoLowerCase() { .setDoLowerCase(true) .build(); - BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun"); + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun", false); assertThat(tokenization.getTokens(), contains("elastic", "##search", "fun")); } } - private String [] bertVocab() { - return new String [] - { - "[PAD]", - "[unused0]", - "[unused1]", - "[unused2]", - "[unused3]", - "[unused4]", - "[unused5]", - "[unused6]", - "[unused7]", - "[unused8]", - "[unused9]", - "[unused10]", - "[unused11]", - "[unused12]", - "[unused13]", - "[unused14]", - "[unused15]", - "[unused16]", - "[unused17]", - "[unused18]", - "[unused19]", - "[unused20]", - "[unused21]", - "[unused22]", - "[unused23]", - "[unused24]", - "[unused25]", - "[unused26]", - "[unused27]", - "[unused28]", - "[unused29]", - "[unused30]", - "[unused31]", - "[unused32]", - "[unused33]", - "[unused34]", - "[unused35]", - "[unused36]", - "[unused37]", - "[unused38]", - "[unused39]", - "[unused40]", - "[unused41]", - "[unused42]", - "[unused43]", - "[unused44]", - "[unused45]", - "[unused46]", - "[unused47]", - "[unused48]", - "[unused49]", - "[unused50]", - "[unused51]", - "[unused52]", - "[unused53]", - "[unused54]", - "[unused55]", - "[unused56]", - "[unused57]", - "[unused58]", - "[unused59]", - "[unused60]", - "[unused61]", - "[unused62]", - "[unused63]", - "[unused64]", - "[unused65]", - "[unused66]", - "[unused67]", - "[unused68]", - "[unused69]", - "[unused70]", - "[unused71]", - "[unused72]", - "[unused73]", - "[unused74]", - "[unused75]", - "[unused76]", - "[unused77]", - "[unused78]", - "[unused79]", - "[unused80]", - "[unused81]", - "[unused82]", - "[unused83]", - "[unused84]", - "[unused85]", - "[unused86]", - "[unused87]", - "[unused88]", - "[unused89]", - "[unused90]", - "[unused91]", - "[unused92]", - "[unused93]", - "[unused94]", - "[unused95]", - "[unused96]", - "[unused97]", - "[unused98]", - "[UNK]", - "[CLS]", - "[SEP]", - "[MASK]", - "[unused99]", - "[unused100]", - "[unused101]", - "[unused102]", - "[unused103]", - "[unused104]", - "[unused105]", - "[unused106]", - "[unused107]", - "[unused108]", - "[unused109]", - "[unused110]", - "[unused111]", - "[unused112]", - "[unused113]", - "[unused114]", - "[unused115]", - "[unused116]", - "[unused117]", - "[unused118]", - "[unused119]", - "[unused120]", - "[unused121]", - "[unused122]", - "[unused123]", - "[unused124]", - "[unused125]", - "[unused126]", - "[unused127]", - "[unused128]", - "[unused129]", - "[unused130]", - "[unused131]", - "[unused132]", - "[unused133]", - "[unused134]", - "[unused135]", - "[unused136]", - "[unused137]", - "[unused138]", - "[unused139]", - "[unused140]", - "[unused141]", - "[unused142]", - "[unused143]", - "[unused144]", - "[unused145]", - "[unused146]", - "[unused147]", - "[unused148]", - "[unused149]", - "[unused150]", - "[unused151]", - "[unused152]", - "[unused153]", - "[unused154]", - "[unused155]", - "[unused156]", - "[unused157]", - "[unused158]", - "[unused159]", - "[unused160]", - "[unused161]", - "[unused162]", - "[unused163]", - "[unused164]", - "[unused165]", - "[unused166]", - "[unused167]", - "[unused168]", - "[unused169]", - "[unused170]", - "[unused171]", - "[unused172]", - "[unused173]", - "[unused174]", - "[unused175]", - "[unused176]", - "[unused177]", - "[unused178]", - "[unused179]", - "[unused180]", - "[unused181]", - "[unused182]", - "[unused183]", - "[unused184]", - "[unused185]", - "[unused186]", - "[unused187]", - "[unused188]", - "[unused189]", - "[unused190]", - "[unused191]", - "[unused192]", - "[unused193]", - "[unused194]", - "[unused195]", - "[unused196]", - "[unused197]", - "[unused198]", - "[unused199]", - "[unused200]", - "[unused201]", - "[unused202]", - "[unused203]", - "[unused204]", - "[unused205]", - "[unused206]", - "[unused207]", - "[unused208]", - "[unused209]", - "[unused210]", - "[unused211]", - "[unused212]", - "[unused213]", - "[unused214]", - "[unused215]", - "[unused216]", - "[unused217]", - "[unused218]", - "[unused219]", - "[unused220]", - "[unused221]", - "[unused222]", - "[unused223]", - "[unused224]", - "[unused225]", - "[unused226]", - "[unused227]", - "[unused228]", - "[unused229]", - "[unused230]", - "[unused231]", - "[unused232]", - "[unused233]", - "[unused234]", - "[unused235]", - "[unused236]", - "[unused237]", - "[unused238]", - "[unused239]", - "[unused240]", - "[unused241]", - "[unused242]", - "[unused243]", - "[unused244]", - "[unused245]", - "[unused246]", - "[unused247]", - "[unused248]", - "[unused249]", - "[unused250]", - "[unused251]", - "[unused252]", - "[unused253]", - "[unused254]", - "[unused255]", - "[unused256]", - "[unused257]", - "[unused258]", - "[unused259]", - "[unused260]", - "[unused261]", - "[unused262]", - "[unused263]", - "[unused264]", - "[unused265]", - "[unused266]", - "[unused267]", - "[unused268]", - "[unused269]", - "[unused270]", - "[unused271]", - "[unused272]", - "[unused273]", - "[unused274]", - "[unused275]", - "[unused276]", - "[unused277]", - "[unused278]", - "[unused279]", - "[unused280]", - "[unused281]", - "[unused282]", - "[unused283]", - "[unused284]", - "[unused285]", - "[unused286]", - "[unused287]", - "[unused288]", - "[unused289]", - "[unused290]", - "[unused291]", - "[unused292]", - "[unused293]", - "[unused294]", - "[unused295]", - "[unused296]", - "[unused297]", - "[unused298]", - "[unused299]", - "[unused300]", - "[unused301]", - "[unused302]", - "[unused303]", - "[unused304]", - "[unused305]", - "[unused306]", - "[unused307]", - "[unused308]", - "[unused309]", - "[unused310]", - "[unused311]", - "[unused312]", - "[unused313]", - "[unused314]", - "[unused315]", - "[unused316]", - "[unused317]", - "[unused318]", - "[unused319]", - "[unused320]", - "[unused321]", - "[unused322]", - "[unused323]", - "[unused324]", - "[unused325]", - "[unused326]", - "[unused327]", - "[unused328]", - "[unused329]", - "[unused330]", - "[unused331]", - "[unused332]", - "[unused333]", - "[unused334]", - "[unused335]", - "[unused336]", - "[unused337]", - "[unused338]", - "[unused339]", - "[unused340]", - "[unused341]", - "[unused342]", - "[unused343]", - "[unused344]", - "[unused345]", - "[unused346]", - "[unused347]", - "[unused348]", - "[unused349]", - "[unused350]", - "[unused351]", - "[unused352]", - "[unused353]", - "[unused354]", - "[unused355]", - "[unused356]", - "[unused357]", - "[unused358]", - "[unused359]", - "[unused360]", - "[unused361]", - "[unused362]", - "[unused363]", - "[unused364]", - "[unused365]", - "[unused366]", - "[unused367]", - "[unused368]", - "[unused369]", - "[unused370]", - "[unused371]", - "[unused372]", - "[unused373]", - "[unused374]", - "[unused375]", - "[unused376]", - "[unused377]", - "[unused378]", - "[unused379]", - "[unused380]", - "[unused381]", - "[unused382]", - "[unused383]", - "[unused384]", - "[unused385]", - "[unused386]", - "[unused387]", - "[unused388]", - "[unused389]", - "[unused390]", - "[unused391]", - "[unused392]", - "[unused393]", - "[unused394]", - "[unused395]", - "[unused396]", - "[unused397]", - "[unused398]", - "[unused399]", - "[unused400]", - "[unused401]", - "[unused402]", - "[unused403]", - "[unused404]", - "[unused405]", - "[unused406]", - "[unused407]", - "[unused408]", - "[unused409]", - "[unused410]", - "[unused411]", - "[unused412]", - "[unused413]", - "[unused414]", - "[unused415]", - "[unused416]", - "[unused417]", - "[unused418]", - "[unused419]", - "[unused420]", - "[unused421]", - "[unused422]", - "[unused423]", - "[unused424]", - "[unused425]", - "[unused426]", - "[unused427]", - "[unused428]", - "[unused429]", - "[unused430]", - "[unused431]", - "[unused432]", - "[unused433]", - "[unused434]", - "[unused435]", - "[unused436]", - "[unused437]", - "[unused438]", - "[unused439]", - "[unused440]", - "[unused441]", - "[unused442]", - "[unused443]", - "[unused444]", - "[unused445]", - "[unused446]", - "[unused447]", - "[unused448]", - "[unused449]", - "[unused450]", - "[unused451]", - "[unused452]", - "[unused453]", - "[unused454]", - "[unused455]", - "[unused456]", - "[unused457]", - "[unused458]", - "[unused459]", - "[unused460]", - "[unused461]", - "[unused462]", - "[unused463]", - "[unused464]", - "[unused465]", - "[unused466]", - "[unused467]", - "[unused468]", - "[unused469]", - "[unused470]", - "[unused471]", - "[unused472]", - "[unused473]", - "[unused474]", - "[unused475]", - "[unused476]", - "[unused477]", - "[unused478]", - "[unused479]", - "[unused480]", - "[unused481]", - "[unused482]", - "[unused483]", - "[unused484]", - "[unused485]", - "[unused486]", - "[unused487]", - "[unused488]", - "[unused489]", - "[unused490]", - "[unused491]", - "[unused492]", - "[unused493]", - "[unused494]", - "[unused495]", - "[unused496]", - "[unused497]", - "[unused498]", - "[unused499]", - "[unused500]", - "[unused501]", - "[unused502]", - "[unused503]", - "[unused504]", - "[unused505]", - "[unused506]", - "[unused507]", - "[unused508]", - "[unused509]", - "[unused510]", - "[unused511]", - "[unused512]", - "[unused513]", - "[unused514]", - "[unused515]", - "[unused516]", - "[unused517]", - "[unused518]", - "[unused519]", - "[unused520]", - "[unused521]", - "[unused522]", - "[unused523]", - "[unused524]", - "[unused525]", - "[unused526]", - "[unused527]", - "[unused528]", - "[unused529]", - "[unused530]", - "[unused531]", - "[unused532]", - "[unused533]", - "[unused534]", - "[unused535]", - "[unused536]", - "[unused537]", - "[unused538]", - "[unused539]", - "[unused540]", - "[unused541]", - "[unused542]", - "[unused543]", - "[unused544]", - "[unused545]", - "[unused546]", - "[unused547]", - "[unused548]", - "[unused549]", - "[unused550]", - "[unused551]", - "[unused552]", - "[unused553]", - "[unused554]", - "[unused555]", - "[unused556]", - "[unused557]", - "[unused558]", - "[unused559]", - "[unused560]", - "[unused561]", - "[unused562]", - "[unused563]", - "[unused564]", - "[unused565]", - "[unused566]", - "[unused567]", - "[unused568]", - "[unused569]", - "[unused570]", - "[unused571]", - "[unused572]", - "[unused573]", - "[unused574]", - "[unused575]", - "[unused576]", - "[unused577]", - "[unused578]", - "[unused579]", - "[unused580]", - "[unused581]", - "[unused582]", - "[unused583]", - "[unused584]", - "[unused585]", - "[unused586]", - "[unused587]", - "[unused588]", - "[unused589]", - "[unused590]", - "[unused591]", - "[unused592]", - "[unused593]", - "[unused594]", - "[unused595]", - "[unused596]", - "[unused597]", - "[unused598]", - "[unused599]", - "[unused600]", - "[unused601]", - "[unused602]", - "[unused603]", - "[unused604]", - "[unused605]", - "[unused606]", - "[unused607]", - "[unused608]", - "[unused609]", - "[unused610]", - "[unused611]", - "[unused612]", - "[unused613]", - "[unused614]", - "[unused615]", - "[unused616]", - "[unused617]", - "[unused618]", - "[unused619]", - "[unused620]", - "[unused621]", - "[unused622]", - "[unused623]", - "[unused624]", - "[unused625]", - "[unused626]", - "[unused627]", - "[unused628]", - "[unused629]", - "[unused630]", - "[unused631]", - "[unused632]", - "[unused633]", - "[unused634]", - "[unused635]", - "[unused636]", - "[unused637]", - "[unused638]", - "[unused639]", - "[unused640]", - "[unused641]", - "[unused642]", - "[unused643]", - "[unused644]", - "[unused645]", - "[unused646]", - "[unused647]", - "[unused648]", - "[unused649]", - "[unused650]", - "[unused651]", - "[unused652]", - "[unused653]", - "[unused654]", - "[unused655]", - "[unused656]", - "[unused657]", - "[unused658]", - "[unused659]", - "[unused660]", - "[unused661]", - "[unused662]", - "[unused663]", - "[unused664]", - "[unused665]", - "[unused666]", - "[unused667]", - "[unused668]", - "[unused669]", - "[unused670]", - "[unused671]", - "[unused672]", - "[unused673]", - "[unused674]", - "[unused675]", - "[unused676]", - "[unused677]", - "[unused678]", - "[unused679]", - "[unused680]", - "[unused681]", - "[unused682]", - "[unused683]", - "[unused684]", - "[unused685]", - "[unused686]", - "[unused687]", - "[unused688]", - "[unused689]", - "[unused690]", - "[unused691]", - "[unused692]", - "[unused693]", - "[unused694]", - "[unused695]", - "[unused696]", - "[unused697]", - "[unused698]", - "[unused699]", - "[unused700]", - "[unused701]", - "[unused702]", - "[unused703]", - "[unused704]", - "[unused705]", - "[unused706]", - "[unused707]", - "[unused708]", - "[unused709]", - "[unused710]", - "[unused711]", - "[unused712]", - "[unused713]", - "[unused714]", - "[unused715]", - "[unused716]", - "[unused717]", - "[unused718]", - "[unused719]", - "[unused720]", - "[unused721]", - "[unused722]", - "[unused723]", - "[unused724]", - "[unused725]", - "[unused726]", - "[unused727]", - "[unused728]", - "[unused729]", - "[unused730]", - "[unused731]", - "[unused732]", - "[unused733]", - "[unused734]", - "[unused735]", - "[unused736]", - "[unused737]", - "[unused738]", - "[unused739]", - "[unused740]", - "[unused741]", - "[unused742]", - "[unused743]", - "[unused744]", - "[unused745]", - "[unused746]", - "[unused747]", - "[unused748]", - "[unused749]", - "[unused750]", - "[unused751]", - "[unused752]", - "[unused753]", - "[unused754]", - "[unused755]", - "[unused756]", - "[unused757]", - "[unused758]", - "[unused759]", - "[unused760]", - "[unused761]", - "[unused762]", - "[unused763]", - "[unused764]", - "[unused765]", - "[unused766]", - "[unused767]", - "[unused768]", - "[unused769]", - "[unused770]", - "[unused771]", - "[unused772]", - "[unused773]", - "[unused774]", - "[unused775]", - "[unused776]", - "[unused777]", - "[unused778]", - "[unused779]", - "[unused780]", - "[unused781]", - "[unused782]", - "[unused783]", - "[unused784]", - "[unused785]", - "[unused786]", - "[unused787]", - "[unused788]", - "[unused789]", - "[unused790]", - "[unused791]", - "[unused792]", - "[unused793]", - "[unused794]", - "[unused795]", - "[unused796]", - "[unused797]", - "[unused798]", - "[unused799]", - "[unused800]", - "[unused801]", - "[unused802]", - "[unused803]", - "[unused804]", - "[unused805]", - "[unused806]", - "[unused807]", - "[unused808]", - "[unused809]", - "[unused810]", - "[unused811]", - "[unused812]", - "[unused813]", - "[unused814]", - "[unused815]", - "[unused816]", - "[unused817]", - "[unused818]", - "[unused819]", - "[unused820]", - "[unused821]", - "[unused822]", - "[unused823]", - "[unused824]", - "[unused825]", - "[unused826]", - "[unused827]", - "[unused828]", - "[unused829]", - "[unused830]", - "[unused831]", - "[unused832]", - "[unused833]", - "[unused834]", - "[unused835]", - "[unused836]", - "[unused837]", - "[unused838]", - "[unused839]", - "[unused840]", - "[unused841]", - "[unused842]", - "[unused843]", - "[unused844]", - "[unused845]", - "[unused846]", - "[unused847]", - "[unused848]", - "[unused849]", - "[unused850]", - "[unused851]", - "[unused852]", - "[unused853]", - "[unused854]", - "[unused855]", - "[unused856]", - "[unused857]", - "[unused858]", - "[unused859]", - "[unused860]", - "[unused861]", - "[unused862]", - "[unused863]", - "[unused864]", - "[unused865]", - "[unused866]", - "[unused867]", - "[unused868]", - "[unused869]", - "[unused870]", - "[unused871]", - "[unused872]", - "[unused873]", - "[unused874]", - "[unused875]", - "[unused876]", - "[unused877]", - "[unused878]", - "[unused879]", - "[unused880]", - "[unused881]", - "[unused882]", - "[unused883]", - "[unused884]", - "[unused885]", - "[unused886]", - "[unused887]", - "[unused888]", - "[unused889]", - "[unused890]", - "[unused891]", - "[unused892]", - "[unused893]", - "[unused894]", - "[unused895]", - "[unused896]", - "[unused897]", - "[unused898]", - "[unused899]", - "[unused900]", - "[unused901]", - "[unused902]", - "[unused903]", - "[unused904]", - "[unused905]", - "[unused906]", - "[unused907]", - "[unused908]", - "[unused909]", - "[unused910]", - "[unused911]", - "[unused912]", - "[unused913]", - "[unused914]", - "[unused915]", - "[unused916]", - "[unused917]", - "[unused918]", - "[unused919]", - "[unused920]", - "[unused921]", - "[unused922]", - "[unused923]", - "[unused924]", - "[unused925]", - "[unused926]", - "[unused927]", - "[unused928]", - "[unused929]", - "[unused930]", - "[unused931]", - "[unused932]", - "[unused933]", - "[unused934]", - "[unused935]", - "[unused936]", - "[unused937]", - "[unused938]", - "[unused939]", - "[unused940]", - "[unused941]", - "[unused942]", - "[unused943]", - "[unused944]", - "[unused945]", - "[unused946]", - "[unused947]", - "[unused948]", - "[unused949]", - "[unused950]", - "[unused951]", - "[unused952]", - "[unused953]", - "[unused954]", - "[unused955]", - "[unused956]", - "[unused957]", - "[unused958]", - "[unused959]", - "[unused960]", - "[unused961]", - "[unused962]", - "[unused963]", - "[unused964]", - "[unused965]", - "[unused966]", - "[unused967]", - "[unused968]", - "[unused969]", - "[unused970]", - "[unused971]", - "[unused972]", - "[unused973]", - "[unused974]", - "[unused975]", - "[unused976]", - "[unused977]", - "[unused978]", - "[unused979]", - "[unused980]", - "[unused981]", - "[unused982]", - "[unused983]", - "[unused984]", - "[unused985]", - "[unused986]", - "[unused987]", - "[unused988]", - "[unused989]", - "[unused990]", - "[unused991]", - "[unused992]", - "[unused993]", - "!", - "\"", - "#", - "$", - "%", - "&", - "'", - "(", - ")", - "*", - "+", - ",", - "-", - ".", - "/", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - ":", - ";", - "<", - "=", - ">", - "?", - "@", - "[", - "\\", - "]", - "^", - "_", - "`", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "{", - "|", - "}", - "~", - "¡", - "¢", - "£", - "¤", - "¥", - "¦", - "§", - "¨", - "©", - "ª", - "«", - "¬", - "®", - "°", - "±", - "²", - "³", - "´", - "µ", - "¶", - "·", - "¹", - "º", - "»", - "¼", - "½", - "¾", - "¿", - "×", - "ß", - "æ", - "ð", - "÷", - "ø", - "þ", - "đ", - "ħ", - "ı", - "ł", - "ŋ", - "œ", - "ƒ", - "ɐ", - "ɑ", - "ɒ", - "ɔ", - "ɕ", - "ə", - "ɛ", - "ɡ", - "ɣ", - "ɨ", - "ɪ", - "ɫ", - "ɬ", - "ɯ", - "ɲ", - "ɴ", - "ɹ", - "ɾ", - "ʀ", - "ʁ", - "ʂ", - "ʃ", - "ʉ", - "ʊ", - "ʋ", - "ʌ", - "ʎ", - "ʐ", - "ʑ", - "ʒ", - "ʔ", - "ʰ", - "ʲ", - "ʳ", - "ʷ", - "ʸ", - "ʻ", - "ʼ", - "ʾ", - "ʿ", - "ˈ", - "ː", - "ˡ", - "ˢ", - "ˣ", - "ˤ", - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - "ς", - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "а", - "б", - "в", - "г", - "д", - "е", - "ж", - "з", - "и", - "к", - "л", - "м", - "н", - "о", - "п", - "р", - "с", - "т", - "у", - "ф", - "х", - "ц", - "ч", - "ш", - "щ", - "ъ", - "ы", - "ь", - "э", - "ю", - "я", - "ђ", - "є", - "і", - "ј", - "љ", - "њ", - "ћ", - "ӏ", - "ա", - "բ", - "գ", - "դ", - "ե", - "թ", - "ի", - "լ", - "կ", - "հ", - "մ", - "յ", - "ն", - "ո", - "պ", - "ս", - "վ", - "տ", - "ր", - "ւ", - "ք", - "־", - "א", - "ב", - "ג", - "ד", - "ה", - "ו", - "ז", - "ח", - "ט", - "י", - "ך", - "כ", - "ל", - "ם", - "מ", - "ן", - "נ", - "ס", - "ע", - "ף", - "פ", - "ץ", - "צ", - "ק", - "ר", - "ש", - "ת", - "،", - "ء", - "ا", - "ب", - "ة", - "ت", - "ث", - "ج", - "ح", - "خ", - "د", - "ذ", - "ر", - "ز", - "س", - "ش", - "ص", - "ض", - "ط", - "ظ", - "ع", - "غ", - "ـ", - "ف", - "ق", - "ك", - "ل", - "م", - "ن", - "ه", - "و", - "ى", - "ي", - "ٹ", - "پ", - "چ", - "ک", - "گ", - "ں", - "ھ", - "ہ", - "ی", - "ے", - "अ", - "आ", - "उ", - "ए", - "क", - "ख", - "ग", - "च", - "ज", - "ट", - "ड", - "ण", - "त", - "थ", - "द", - "ध", - "न", - "प", - "ब", - "भ", - "म", - "य", - "र", - "ल", - "व", - "श", - "ष", - "स", - "ह", - "ा", - "ि", - "ी", - "ो", - "।", - "॥", - "ং", - "অ", - "আ", - "ই", - "উ", - "এ", - "ও", - "ক", - "খ", - "গ", - "চ", - "ছ", - "জ", - "ট", - "ড", - "ণ", - "ত", - "থ", - "দ", - "ধ", - "ন", - "প", - "ব", - "ভ", - "ম", - "য", - "র", - "ল", - "শ", - "ষ", - "স", - "হ", - "া", - "ি", - "ী", - "ে", - "க", - "ச", - "ட", - "த", - "ந", - "ன", - "ப", - "ம", - "ய", - "ர", - "ல", - "ள", - "வ", - "ா", - "ி", - "ு", - "ே", - "ை", - "ನ", - "ರ", - "ಾ", - "ක", - "ය", - "ර", - "ල", - "ව", - "ා", - "ก", - "ง", - "ต", - "ท", - "น", - "พ", - "ม", - "ย", - "ร", - "ล", - "ว", - "ส", - "อ", - "า", - "เ", - "་", - "།", - "ག", - "ང", - "ད", - "ན", - "པ", - "བ", - "མ", - "འ", - "ར", - "ལ", - "ས", - "မ", - "ა", - "ბ", - "გ", - "დ", - "ე", - "ვ", - "თ", - "ი", - "კ", - "ლ", - "მ", - "ნ", - "ო", - "რ", - "ს", - "ტ", - "უ", - "ᄀ", - "ᄂ", - "ᄃ", - "ᄅ", - "ᄆ", - "ᄇ", - "ᄉ", - "ᄊ", - "ᄋ", - "ᄌ", - "ᄎ", - "ᄏ", - "ᄐ", - "ᄑ", - "ᄒ", - "ᅡ", - "ᅢ", - "ᅥ", - "ᅦ", - "ᅧ", - "ᅩ", - "ᅪ", - "ᅭ", - "ᅮ", - "ᅯ", - "ᅲ", - "ᅳ", - "ᅴ", - "ᅵ", - "ᆨ", - "ᆫ", - "ᆯ", - "ᆷ", - "ᆸ", - "ᆼ", - "ᴬ", - "ᴮ", - "ᴰ", - "ᴵ", - "ᴺ", - "ᵀ", - "ᵃ", - "ᵇ", - "ᵈ", - "ᵉ", - "ᵍ", - "ᵏ", - "ᵐ", - "ᵒ", - "ᵖ", - "ᵗ", - "ᵘ", - "ᵢ", - "ᵣ", - "ᵤ", - "ᵥ", - "ᶜ", - "ᶠ", - "‐", - "‑", - "‒", - "–", - "—", - "―", - "‖", - "‘", - "’", - "‚", - "“", - "”", - "„", - "†", - "‡", - "•", - "…", - "‰", - "′", - "″", - "›", - "‿", - "⁄", - "⁰", - "ⁱ", - "⁴", - "⁵", - "⁶", - "⁷", - "⁸", - "⁹", - "⁺", - "⁻", - "ⁿ", - "₀", - "₁", - "₂", - "₃", - "₄", - "₅", - "₆", - "₇", - "₈", - "₉", - "₊", - "₍", - "₎", - "ₐ", - "ₑ", - "ₒ", - "ₓ", - "ₕ", - "ₖ", - "ₗ", - "ₘ", - "ₙ", - "ₚ", - "ₛ", - "ₜ", - "₤", - "₩", - "€", - "₱", - "₹", - "ℓ", - "№", - "ℝ", - "™", - "⅓", - "⅔", - "←", - "↑", - "→", - "↓", - "↔", - "↦", - "⇄", - "⇌", - "⇒", - "∂", - "∅", - "∆", - "∇", - "∈", - "−", - "∗", - "∘", - "√", - "∞", - "∧", - "∨", - "∩", - "∪", - "≈", - "≡", - "≤", - "≥", - "⊂", - "⊆", - "⊕", - "⊗", - "⋅", - "─", - "│", - "■", - "▪", - "●", - "★", - "☆", - "☉", - "♠", - "♣", - "♥", - "♦", - "♭", - "♯", - "⟨", - "⟩", - "ⱼ", - "⺩", - "⺼", - "⽥", - "、", - "。", - "〈", - "〉", - "《", - "》", - "「", - "」", - "『", - "』", - "〜", - "あ", - "い", - "う", - "え", - "お", - "か", - "き", - "く", - "け", - "こ", - "さ", - "し", - "す", - "せ", - "そ", - "た", - "ち", - "っ", - "つ", - "て", - "と", - "な", - "に", - "ぬ", - "ね", - "の", - "は", - "ひ", - "ふ", - "へ", - "ほ", - "ま", - "み", - "む", - "め", - "も", - "や", - "ゆ", - "よ", - "ら", - "り", - "る", - "れ", - "ろ", - "を", - "ん", - "ァ", - "ア", - "ィ", - "イ", - "ウ", - "ェ", - "エ", - "オ", - "カ", - "キ", - "ク", - "ケ", - "コ", - "サ", - "シ", - "ス", - "セ", - "タ", - "チ", - "ッ", - "ツ", - "テ", - "ト", - "ナ", - "ニ", - "ノ", - "ハ", - "ヒ", - "フ", - "ヘ", - "ホ", - "マ", - "ミ", - "ム", - "メ", - "モ", - "ャ", - "ュ", - "ョ", - "ラ", - "リ", - "ル", - "レ", - "ロ", - "ワ", - "ン", - "・", - "ー", - "一", - "三", - "上", - "下", - "不", - "世", - "中", - "主", - "久", - "之", - "也", - "事", - "二", - "五", - "井", - "京", - "人", - "亻", - "仁", - "介", - "代", - "仮", - "伊", - "会", - "佐", - "侍", - "保", - "信", - "健", - "元", - "光", - "八", - "公", - "内", - "出", - "分", - "前", - "劉", - "力", - "加", - "勝", - "北", - "区", - "十", - "千", - "南", - "博", - "原", - "口", - "古", - "史", - "司", - "合", - "吉", - "同", - "名", - "和", - "囗", - "四", - "国", - "國", - "土", - "地", - "坂", - "城", - "堂", - "場", - "士", - "夏", - "外", - "大", - "天", - "太", - "夫", - "奈", - "女", - "子", - "学", - "宀", - "宇", - "安", - "宗", - "定", - "宣", - "宮", - "家", - "宿", - "寺", - "將", - "小", - "尚", - "山", - "岡", - "島", - "崎", - "川", - "州", - "巿", - "帝", - "平", - "年", - "幸", - "广", - "弘", - "張", - "彳", - "後", - "御", - "德", - "心", - "忄", - "志", - "忠", - "愛", - "成", - "我", - "戦", - "戸", - "手", - "扌", - "政", - "文", - "新", - "方", - "日", - "明", - "星", - "春", - "昭", - "智", - "曲", - "書", - "月", - "有", - "朝", - "木", - "本", - "李", - "村", - "東", - "松", - "林", - "森", - "楊", - "樹", - "橋", - "歌", - "止", - "正", - "武", - "比", - "氏", - "民", - "水", - "氵", - "氷", - "永", - "江", - "沢", - "河", - "治", - "法", - "海", - "清", - "漢", - "瀬", - "火", - "版", - "犬", - "王", - "生", - "田", - "男", - "疒", - "発", - "白", - "的", - "皇", - "目", - "相", - "省", - "真", - "石", - "示", - "社", - "神", - "福", - "禾", - "秀", - "秋", - "空", - "立", - "章", - "竹", - "糹", - "美", - "義", - "耳", - "良", - "艹", - "花", - "英", - "華", - "葉", - "藤", - "行", - "街", - "西", - "見", - "訁", - "語", - "谷", - "貝", - "貴", - "車", - "軍", - "辶", - "道", - "郎", - "郡", - "部", - "都", - "里", - "野", - "金", - "鈴", - "镇", - "長", - "門", - "間", - "阝", - "阿", - "陳", - "陽", - "雄", - "青", - "面", - "風", - "食", - "香", - "馬", - "高", - "龍", - "龸", - "fi", - "fl", - "!", - "(", - ")", - ",", - "-", - ".", - "/", - ":", - "?", - "~", - "the", - "of", - "and", - "in", - "to", - "was", - "he", - "is", - "as", - "for", - "on", - "with", - "that", - "it", - "his", - "by", - "at", - "from", - "her", - "##s", - "she", - "you", - "had", - "an", - "were", - "but", - "be", - "this", - "are", - "not", - "my", - "they", - "one", - "which", - "or", - "have", - "him", - "me", - "first", - "all", - "also", - "their", - "has", - "up", - "who", - "out", - "been", - "when", - "after", - "there", - "into", - "new", - "two", - "its", - "##a", - "time", - "would", - "no", - "what", - "about", - "said", - "we", - "over", - "then", - "other", - "so", - "more", - "##e", - "can", - "if", - "like", - "back", - "them", - "only", - "some", - "could", - "##i", - "where", - "just", - "##ing", - "during", - "before", - "##n", - "do", - "##o", - "made", - "school", - "through", - "than", - "now", - "years", - "most", - "world", - "may", - "between", - "down", - "well", - "three", - "##d", - "year", - "while", - "will", - "##ed", - "##r", - "##y", - "later", - "##t", - "city", - "under", - "around", - "did", - "such", - "being", - "used", - "state", - "people", - "part", - "know", - "against", - "your", - "many", - "second", - "university", - "both", - "national", - "##er", - "these", - "don", - "known", - "off", - "way", - "until", - "re", - "how", - "even", - "get", - "head", - "...", - "didn", - "##ly", - "team", - "american", - "because", - "de", - "##l", - "born", - "united", - "film", - "since", - "still", - "long", - "work", - "south", - "us", - "became", - "any", - "high", - "again", - "day", - "family", - "see", - "right", - "man", - "eyes", - "house", - "season", - "war", - "states", - "including", - "took", - "life", - "north", - "same", - "each", - "called", - "name", - "much", - "place", - "however", - "go", - "four", - "group", - "another", - "found", - "won", - "area", - "here", - "going", - "10", - "away", - "series", - "left", - "home", - "music", - "best", - "make", - "hand", - "number", - "company", - "several", - "never", - "last", - "john", - "000", - "very", - "album", - "take", - "end", - "good", - "too", - "following", - "released", - "game", - "played", - "little", - "began", - "district", - "##m", - "old", - "want", - "those", - "side", - "held", - "own", - "early", - "county", - "ll", - "league", - "use", - "west", - "##u", - "face", - "think", - "##es", - "2010", - "government", - "##h", - "march", - "came", - "small", - "general", - "town", - "june", - "##on", - "line", - "based", - "something", - "##k", - "september", - "thought", - "looked", - "along", - "international", - "2011", - "air", - "july", - "club", - "went", - "january", - "october", - "our", - "august", - "april", - "york", - "12", - "few", - "2012", - "2008", - "east", - "show", - "member", - "college", - "2009", - "father", - "public", - "##us", - "come", - "men", - "five", - "set", - "station", - "church", - "##c", - "next", - "former", - "november", - "room", - "party", - "located", - "december", - "2013", - "age", - "got", - "2007", - "##g", - "system", - "let", - "love", - "2006", - "though", - "every", - "2014", - "look", - "song", - "water", - "century", - "without", - "body", - "black", - "night", - "within", - "great", - "women", - "single", - "ve", - "building", - "large", - "population", - "river", - "named", - "band", - "white", - "started", - "##an", - "once", - "15", - "20", - "should", - "18", - "2015", - "service", - "top", - "built", - "british", - "open", - "death", - "king", - "moved", - "local", - "times", - "children", - "february", - "book", - "why", - "11", - "door", - "need", - "president", - "order", - "final", - "road", - "wasn", - "although", - "due", - "major", - "died", - "village", - "third", - "knew", - "2016", - "asked", - "turned", - "st", - "wanted", - "say", - "##p", - "together", - "received", - "main", - "son", - "served", - "different", - "##en", - "behind", - "himself", - "felt", - "members", - "power", - "football", - "law", - "voice", - "play", - "##in", - "near", - "park", - "history", - "30", - "having", - "2005", - "16", - "##man", - "saw", - "mother", - "##al", - "army", - "point", - "front", - "help", - "english", - "street", - "art", - "late", - "hands", - "games", - "award", - "##ia", - "young", - "14", - "put", - "published", - "country", - "division", - "across", - "told", - "13", - "often", - "ever", - "french", - "london", - "center", - "six", - "red", - "2017", - "led", - "days", - "include", - "light", - "25", - "find", - "tell", - "among", - "species", - "really", - "according", - "central", - "half", - "2004", - "form", - "original", - "gave", - "office", - "making", - "enough", - "lost", - "full", - "opened", - "must", - "included", - "live", - "given", - "german", - "player", - "run", - "business", - "woman", - "community", - "cup", - "might", - "million", - "land", - "2000", - "court", - "development", - "17", - "short", - "round", - "ii", - "km", - "seen", - "class", - "story", - "always", - "become", - "sure", - "research", - "almost", - "director", - "council", - "la", - "##2", - "career", - "things", - "using", - "island", - "##z", - "couldn", - "car", - "##is", - "24", - "close", - "force", - "##1", - "better", - "free", - "support", - "control", - "field", - "students", - "2003", - "education", - "married", - "##b", - "nothing", - "worked", - "others", - "record", - "big", - "inside", - "level", - "anything", - "continued", - "give", - "james", - "##3", - "military", - "established", - "non", - "returned", - "feel", - "does", - "title", - "written", - "thing", - "feet", - "william", - "far", - "co", - "association", - "hard", - "already", - "2002", - "##ra", - "championship", - "human", - "western", - "100", - "##na", - "department", - "hall", - "role", - "various", - "production", - "21", - "19", - "heart", - "2001", - "living", - "fire", - "version", - "##ers", - "##f", - "television", - "royal", - "##4", - "produced", - "working", - "act", - "case", - "society", - "region", - "present", - "radio", - "period", - "looking", - "least", - "total", - "keep", - "england", - "wife", - "program", - "per", - "brother", - "mind", - "special", - "22", - "##le", - "am", - "works", - "soon", - "##6", - "political", - "george", - "services", - "taken", - "created", - "##7", - "further", - "able", - "reached", - "david", - "union", - "joined", - "upon", - "done", - "important", - "social", - "information", - "either", - "##ic", - "##x", - "appeared", - "position", - "ground", - "lead", - "rock", - "dark", - "election", - "23", - "board", - "france", - "hair", - "course", - "arms", - "site", - "police", - "girl", - "instead", - "real", - "sound", - "##v", - "words", - "moment", - "##te", - "someone", - "##8", - "summer", - "project", - "announced", - "san", - "less", - "wrote", - "past", - "followed", - "##5", - "blue", - "founded", - "al", - "finally", - "india", - "taking", - "records", - "america", - "##ne", - "1999", - "design", - "considered", - "northern", - "god", - "stop", - "battle", - "toward", - "european", - "outside", - "described", - "track", - "today", - "playing", - "language", - "28", - "call", - "26", - "heard", - "professional", - "low", - "australia", - "miles", - "california", - "win", - "yet", - "green", - "##ie", - "trying", - "blood", - "##ton", - "southern", - "science", - "maybe", - "everything", - "match", - "square", - "27", - "mouth", - "video", - "race", - "recorded", - "leave", - "above", - "##9", - "daughter", - "points", - "space", - "1998", - "museum", - "change", - "middle", - "common", - "##0", - "move", - "tv", - "post", - "##ta", - "lake", - "seven", - "tried", - "elected", - "closed", - "ten", - "paul", - "minister", - "##th", - "months", - "start", - "chief", - "return", - "canada", - "person", - "sea", - "release", - "similar", - "modern", - "brought", - "rest", - "hit", - "formed", - "mr", - "##la", - "1997", - "floor", - "event", - "doing", - "thomas", - "1996", - "robert", - "care", - "killed", - "training", - "star", - "week", - "needed", - "turn", - "finished", - "railway", - "rather", - "news", - "health", - "sent", - "example", - "ran", - "term", - "michael", - "coming", - "currently", - "yes", - "forces", - "despite", - "gold", - "areas", - "50", - "stage", - "fact", - "29", - "dead", - "says", - "popular", - "2018", - "originally", - "germany", - "probably", - "developed", - "result", - "pulled", - "friend", - "stood", - "money", - "running", - "mi", - "signed", - "word", - "songs", - "child", - "eventually", - "met", - "tour", - "average", - "teams", - "minutes", - "festival", - "current", - "deep", - "kind", - "1995", - "decided", - "usually", - "eastern", - "seemed", - "##ness", - "episode", - "bed", - "added", - "table", - "indian", - "private", - "charles", - "route", - "available", - "idea", - "throughout", - "centre", - "addition", - "appointed", - "style", - "1994", - "books", - "eight", - "construction", - "press", - "mean", - "wall", - "friends", - "remained", - "schools", - "study", - "##ch", - "##um", - "institute", - "oh", - "chinese", - "sometimes", - "events", - "possible", - "1992", - "australian", - "type", - "brown", - "forward", - "talk", - "process", - "food", - "debut", - "seat", - "performance", - "committee", - "features", - "character", - "arts", - "herself", - "else", - "lot", - "strong", - "russian", - "range", - "hours", - "peter", - "arm", - "##da", - "morning", - "dr", - "sold", - "##ry", - "quickly", - "directed", - "1993", - "guitar", - "china", - "##w", - "31", - "list", - "##ma", - "performed", - "media", - "uk", - "players", - "smile", - "##rs", - "myself", - "40", - "placed", - "coach", - "province", - "towards", - "wouldn", - "leading", - "whole", - "boy", - "official", - "designed", - "grand", - "census", - "##el", - "europe", - "attack", - "japanese", - "henry", - "1991", - "##re", - "##os", - "cross", - "getting", - "alone", - "action", - "lower", - "network", - "wide", - "washington", - "japan", - "1990", - "hospital", - "believe", - "changed", - "sister", - "##ar", - "hold", - "gone", - "sir", - "hadn", - "ship", - "##ka", - "studies", - "academy", - "shot", - "rights", - "below", - "base", - "bad", - "involved", - "kept", - "largest", - "##ist", - "bank", - "future", - "especially", - "beginning", - "mark", - "movement", - "section", - "female", - "magazine", - "plan", - "professor", - "lord", - "longer", - "##ian", - "sat", - "walked", - "hill", - "actually", - "civil", - "energy", - "model", - "families", - "size", - "thus", - "aircraft", - "completed", - "includes", - "data", - "captain", - "##or", - "fight", - "vocals", - "featured", - "richard", - "bridge", - "fourth", - "1989", - "officer", - "stone", - "hear", - "##ism", - "means", - "medical", - "groups", - "management", - "self", - "lips", - "competition", - "entire", - "lived", - "technology", - "leaving", - "federal", - "tournament", - "bit", - "passed", - "hot", - "independent", - "awards", - "kingdom", - "mary", - "spent", - "fine", - "doesn", - "reported", - "##ling", - "jack", - "fall", - "raised", - "itself", - "stay", - "true", - "studio", - "1988", - "sports", - "replaced", - "paris", - "systems", - "saint", - "leader", - "theatre", - "whose", - "market", - "capital", - "parents", - "spanish", - "canadian", - "earth", - "##ity", - "cut", - "degree", - "writing", - "bay", - "christian", - "awarded", - "natural", - "higher", - "bill", - "##as", - "coast", - "provided", - "previous", - "senior", - "ft", - "valley", - "organization", - "stopped", - "onto", - "countries", - "parts", - "conference", - "queen", - "security", - "interest", - "saying", - "allowed", - "master", - "earlier", - "phone", - "matter", - "smith", - "winning", - "try", - "happened", - "moving", - "campaign", - "los", - "##ley", - "breath", - "nearly", - "mid", - "1987", - "certain", - "girls", - "date", - "italian", - "african", - "standing", - "fell", - "artist", - "##ted", - "shows", - "deal", - "mine", - "industry", - "1986", - "##ng", - "everyone", - "republic", - "provide", - "collection", - "library", - "student", - "##ville", - "primary", - "owned", - "older", - "via", - "heavy", - "1st", - "makes", - "##able", - "attention", - "anyone", - "africa", - "##ri", - "stated", - "length", - "ended", - "fingers", - "command", - "staff", - "skin", - "foreign", - "opening", - "governor", - "okay", - "medal", - "kill", - "sun", - "cover", - "job", - "1985", - "introduced", - "chest", - "hell", - "feeling", - "##ies", - "success", - "meet", - "reason", - "standard", - "meeting", - "novel", - "1984", - "trade", - "source", - "buildings", - "##land", - "rose", - "guy", - "goal", - "##ur", - "chapter", - "native", - "husband", - "previously", - "unit", - "limited", - "entered", - "weeks", - "producer", - "operations", - "mountain", - "takes", - "covered", - "forced", - "related", - "roman", - "complete", - "successful", - "key", - "texas", - "cold", - "##ya", - "channel", - "1980", - "traditional", - "films", - "dance", - "clear", - "approximately", - "500", - "nine", - "van", - "prince", - "question", - "active", - "tracks", - "ireland", - "regional", - "silver", - "author", - "personal", - "sense", - "operation", - "##ine", - "economic", - "1983", - "holding", - "twenty", - "isbn", - "additional", - "speed", - "hour", - "edition", - "regular", - "historic", - "places", - "whom", - "shook", - "movie", - "km²", - "secretary", - "prior", - "report", - "chicago", - "read", - "foundation", - "view", - "engine", - "scored", - "1982", - "units", - "ask", - "airport", - "property", - "ready", - "immediately", - "lady", - "month", - "listed", - "contract", - "##de", - "manager", - "themselves", - "lines", - "##ki", - "navy", - "writer", - "meant", - "##ts", - "runs", - "##ro", - "practice", - "championships", - "singer", - "glass", - "commission", - "required", - "forest", - "starting", - "culture", - "generally", - "giving", - "access", - "attended", - "test", - "couple", - "stand", - "catholic", - "martin", - "caught", - "executive", - "##less", - "eye", - "##ey", - "thinking", - "chair", - "quite", - "shoulder", - "1979", - "hope", - "decision", - "plays", - "defeated", - "municipality", - "whether", - "structure", - "offered", - "slowly", - "pain", - "ice", - "direction", - "##ion", - "paper", - "mission", - "1981", - "mostly", - "200", - "noted", - "individual", - "managed", - "nature", - "lives", - "plant", - "##ha", - "helped", - "except", - "studied", - "computer", - "figure", - "relationship", - "issue", - "significant", - "loss", - "die", - "smiled", - "gun", - "ago", - "highest", - "1972", - "##am", - "male", - "bring", - "goals", - "mexico", - "problem", - "distance", - "commercial", - "completely", - "location", - "annual", - "famous", - "drive", - "1976", - "neck", - "1978", - "surface", - "caused", - "italy", - "understand", - "greek", - "highway", - "wrong", - "hotel", - "comes", - "appearance", - "joseph", - "double", - "issues", - "musical", - "companies", - "castle", - "income", - "review", - "assembly", - "bass", - "initially", - "parliament", - "artists", - "experience", - "1974", - "particular", - "walk", - "foot", - "engineering", - "talking", - "window", - "dropped", - "##ter", - "miss", - "baby", - "boys", - "break", - "1975", - "stars", - "edge", - "remember", - "policy", - "carried", - "train", - "stadium", - "bar", - "sex", - "angeles", - "evidence", - "##ge", - "becoming", - "assistant", - "soviet", - "1977", - "upper", - "step", - "wing", - "1970", - "youth", - "financial", - "reach", - "##ll", - "actor", - "numerous", - "##se", - "##st", - "nodded", - "arrived", - "##ation", - "minute", - "##nt", - "believed", - "sorry", - "complex", - "beautiful", - "victory", - "associated", - "temple", - "1968", - "1973", - "chance", - "perhaps", - "metal", - "##son", - "1945", - "bishop", - "##et", - "lee", - "launched", - "particularly", - "tree", - "le", - "retired", - "subject", - "prize", - "contains", - "yeah", - "theory", - "empire", - "##ce", - "suddenly", - "waiting", - "trust", - "recording", - "##to", - "happy", - "terms", - "camp", - "champion", - "1971", - "religious", - "pass", - "zealand", - "names", - "2nd", - "port", - "ancient", - "tom", - "corner", - "represented", - "watch", - "legal", - "anti", - "justice", - "cause", - "watched", - "brothers", - "45", - "material", - "changes", - "simply", - "response", - "louis", - "fast", - "##ting", - "answer", - "60", - "historical", - "1969", - "stories", - "straight", - "create", - "feature", - "increased", - "rate", - "administration", - "virginia", - "el", - "activities", - "cultural", - "overall", - "winner", - "programs", - "basketball", - "legs", - "guard", - "beyond", - "cast", - "doctor", - "mm", - "flight", - "results", - "remains", - "cost", - "effect", - "winter", - "##ble", - "larger", - "islands", - "problems", - "chairman", - "grew", - "commander", - "isn", - "1967", - "pay", - "failed", - "selected", - "hurt", - "fort", - "box", - "regiment", - "majority", - "journal", - "35", - "edward", - "plans", - "##ke", - "##ni", - "shown", - "pretty", - "irish", - "characters", - "directly", - "scene", - "likely", - "operated", - "allow", - "spring", - "##j", - "junior", - "matches", - "looks", - "mike", - "houses", - "fellow", - "##tion", - "beach", - "marriage", - "##ham", - "##ive", - "rules", - "oil", - "65", - "florida", - "expected", - "nearby", - "congress", - "sam", - "peace", - "recent", - "iii", - "wait", - "subsequently", - "cell", - "##do", - "variety", - "serving", - "agreed", - "please", - "poor", - "joe", - "pacific", - "attempt", - "wood", - "democratic", - "piece", - "prime", - "##ca", - "rural", - "mile", - "touch", - "appears", - "township", - "1964", - "1966", - "soldiers", - "##men", - "##ized", - "1965", - "pennsylvania", - "closer", - "fighting", - "claimed", - "score", - "jones", - "physical", - "editor", - "##ous", - "filled", - "genus", - "specific", - "sitting", - "super", - "mom", - "##va", - "therefore", - "supported", - "status", - "fear", - "cases", - "store", - "meaning", - "wales", - "minor", - "spain", - "tower", - "focus", - "vice", - "frank", - "follow", - "parish", - "separate", - "golden", - "horse", - "fifth", - "remaining", - "branch", - "32", - "presented", - "stared", - "##id", - "uses", - "secret", - "forms", - "##co", - "baseball", - "exactly", - "##ck", - "choice", - "note", - "discovered", - "travel", - "composed", - "truth", - "russia", - "ball", - "color", - "kiss", - "dad", - "wind", - "continue", - "ring", - "referred", - "numbers", - "digital", - "greater", - "##ns", - "metres", - "slightly", - "direct", - "increase", - "1960", - "responsible", - "crew", - "rule", - "trees", - "troops", - "##no", - "broke", - "goes", - "individuals", - "hundred", - "weight", - "creek", - "sleep", - "memory", - "defense", - "provides", - "ordered", - "code", - "value", - "jewish", - "windows", - "1944", - "safe", - "judge", - "whatever", - "corps", - "realized", - "growing", - "pre", - "##ga", - "cities", - "alexander", - "gaze", - "lies", - "spread", - "scott", - "letter", - "showed", - "situation", - "mayor", - "transport", - "watching", - "workers", - "extended", - "##li", - "expression", - "normal", - "##ment", - "chart", - "multiple", - "border", - "##ba", - "host", - "##ner", - "daily", - "mrs", - "walls", - "piano", - "##ko", - "heat", - "cannot", - "##ate", - "earned", - "products", - "drama", - "era", - "authority", - "seasons", - "join", - "grade", - "##io", - "sign", - "difficult", - "machine", - "1963", - "territory", - "mainly", - "##wood", - "stations", - "squadron", - "1962", - "stepped", - "iron", - "19th", - "##led", - "serve", - "appear", - "sky", - "speak", - "broken", - "charge", - "knowledge", - "kilometres", - "removed", - "ships", - "article", - "campus", - "simple", - "##ty", - "pushed", - "britain", - "##ve", - "leaves", - "recently", - "cd", - "soft", - "boston", - "latter", - "easy", - "acquired", - "poland", - "##sa", - "quality", - "officers", - "presence", - "planned", - "nations", - "mass", - "broadcast", - "jean", - "share", - "image", - "influence", - "wild", - "offer", - "emperor", - "electric", - "reading", - "headed", - "ability", - "promoted", - "yellow", - "ministry", - "1942", - "throat", - "smaller", - "politician", - "##by", - "latin", - "spoke", - "cars", - "williams", - "males", - "lack", - "pop", - "80", - "##ier", - "acting", - "seeing", - "consists", - "##ti", - "estate", - "1961", - "pressure", - "johnson", - "newspaper", - "jr", - "chris", - "olympics", - "online", - "conditions", - "beat", - "elements", - "walking", - "vote", - "##field", - "needs", - "carolina", - "text", - "featuring", - "global", - "block", - "shirt", - "levels", - "francisco", - "purpose", - "females", - "et", - "dutch", - "duke", - "ahead", - "gas", - "twice", - "safety", - "serious", - "turning", - "highly", - "lieutenant", - "firm", - "maria", - "amount", - "mixed", - "daniel", - "proposed", - "perfect", - "agreement", - "affairs", - "3rd", - "seconds", - "contemporary", - "paid", - "1943", - "prison", - "save", - "kitchen", - "label", - "administrative", - "intended", - "constructed", - "academic", - "nice", - "teacher", - "races", - "1956", - "formerly", - "corporation", - "ben", - "nation", - "issued", - "shut", - "1958", - "drums", - "housing", - "victoria", - "seems", - "opera", - "1959", - "graduated", - "function", - "von", - "mentioned", - "picked", - "build", - "recognized", - "shortly", - "protection", - "picture", - "notable", - "exchange", - "elections", - "1980s", - "loved", - "percent", - "racing", - "fish", - "elizabeth", - "garden", - "volume", - "hockey", - "1941", - "beside", - "settled", - "##ford", - "1940", - "competed", - "replied", - "drew", - "1948", - "actress", - "marine", - "scotland", - "steel", - "glanced", - "farm", - "steve", - "1957", - "risk", - "tonight", - "positive", - "magic", - "singles", - "effects", - "gray", - "screen", - "dog", - "##ja", - "residents", - "bus", - "sides", - "none", - "secondary", - "literature", - "polish", - "destroyed", - "flying", - "founder", - "households", - "1939", - "lay", - "reserve", - "usa", - "gallery", - "##ler", - "1946", - "industrial", - "younger", - "approach", - "appearances", - "urban", - "ones", - "1950", - "finish", - "avenue", - "powerful", - "fully", - "growth", - "page", - "honor", - "jersey", - "projects", - "advanced", - "revealed", - "basic", - "90", - "infantry", - "pair", - "equipment", - "visit", - "33", - "evening", - "search", - "grant", - "effort", - "solo", - "treatment", - "buried", - "republican", - "primarily", - "bottom", - "owner", - "1970s", - "israel", - "gives", - "jim", - "dream", - "bob", - "remain", - "spot", - "70", - "notes", - "produce", - "champions", - "contact", - "ed", - "soul", - "accepted", - "ways", - "del", - "##ally", - "losing", - "split", - "price", - "capacity", - "basis", - "trial", - "questions", - "##ina", - "1955", - "20th", - "guess", - "officially", - "memorial", - "naval", - "initial", - "##ization", - "whispered", - "median", - "engineer", - "##ful", - "sydney", - "##go", - "columbia", - "strength", - "300", - "1952", - "tears", - "senate", - "00", - "card", - "asian", - "agent", - "1947", - "software", - "44", - "draw", - "warm", - "supposed", - "com", - "pro", - "##il", - "transferred", - "leaned", - "##at", - "candidate", - "escape", - "mountains", - "asia", - "potential", - "activity", - "entertainment", - "seem", - "traffic", - "jackson", - "murder", - "36", - "slow", - "product", - "orchestra", - "haven", - "agency", - "bbc", - "taught", - "website", - "comedy", - "unable", - "storm", - "planning", - "albums", - "rugby", - "environment", - "scientific", - "grabbed", - "protect", - "##hi", - "boat", - "typically", - "1954", - "1953", - "damage", - "principal", - "divided", - "dedicated", - "mount", - "ohio", - "##berg", - "pick", - "fought", - "driver", - "##der", - "empty", - "shoulders", - "sort", - "thank", - "berlin", - "prominent", - "account", - "freedom", - "necessary", - "efforts", - "alex", - "headquarters", - "follows", - "alongside", - "des", - "simon", - "andrew", - "suggested", - "operating", - "learning", - "steps", - "1949", - "sweet", - "technical", - "begin", - "easily", - "34", - "teeth", - "speaking", - "settlement", - "scale", - "##sh", - "renamed", - "ray", - "max", - "enemy", - "semi", - "joint", - "compared", - "##rd", - "scottish", - "leadership", - "analysis", - "offers", - "georgia", - "pieces", - "captured", - "animal", - "deputy", - "guest", - "organized", - "##lin", - "tony", - "combined", - "method", - "challenge", - "1960s", - "huge", - "wants", - "battalion", - "sons", - "rise", - "crime", - "types", - "facilities", - "telling", - "path", - "1951", - "platform", - "sit", - "1990s", - "##lo", - "tells", - "assigned", - "rich", - "pull", - "##ot", - "commonly", - "alive", - "##za", - "letters", - "concept", - "conducted", - "wearing", - "happen", - "bought", - "becomes", - "holy", - "gets", - "ocean", - "defeat", - "languages", - "purchased", - "coffee", - "occurred", - "titled", - "##q", - "declared", - "applied", - "sciences", - "concert", - "sounds", - "jazz", - "brain", - "##me", - "painting", - "fleet", - "tax", - "nick", - "##ius", - "michigan", - "count", - "animals", - "leaders", - "episodes", - "##line", - "content", - "##den", - "birth", - "##it", - "clubs", - "64", - "palace", - "critical", - "refused", - "fair", - "leg", - "laughed", - "returning", - "surrounding", - "participated", - "formation", - "lifted", - "pointed", - "connected", - "rome", - "medicine", - "laid", - "taylor", - "santa", - "powers", - "adam", - "tall", - "shared", - "focused", - "knowing", - "yards", - "entrance", - "falls", - "##wa", - "calling", - "##ad", - "sources", - "chosen", - "beneath", - "resources", - "yard", - "##ite", - "nominated", - "silence", - "zone", - "defined", - "##que", - "gained", - "thirty", - "38", - "bodies", - "moon", - "##ard", - "adopted", - "christmas", - "widely", - "register", - "apart", - "iran", - "premier", - "serves", - "du", - "unknown", - "parties", - "##les", - "generation", - "##ff", - "continues", - "quick", - "fields", - "brigade", - "quiet", - "teaching", - "clothes", - "impact", - "weapons", - "partner", - "flat", - "theater", - "supreme", - "1938", - "37", - "relations", - "##tor", - "plants", - "suffered", - "1936", - "wilson", - "kids", - "begins", - "##age", - "1918", - "seats", - "armed", - "internet", - "models", - "worth", - "laws", - "400", - "communities", - "classes", - "background", - "knows", - "thanks", - "quarter", - "reaching", - "humans", - "carry", - "killing", - "format", - "kong", - "hong", - "setting", - "75", - "architecture", - "disease", - "railroad", - "inc", - "possibly", - "wish", - "arthur", - "thoughts", - "harry", - "doors", - "density", - "##di", - "crowd", - "illinois", - "stomach", - "tone", - "unique", - "reports", - "anyway", - "##ir", - "liberal", - "der", - "vehicle", - "thick", - "dry", - "drug", - "faced", - "largely", - "facility", - "theme", - "holds", - "creation", - "strange", - "colonel", - "##mi", - "revolution", - "bell", - "politics", - "turns", - "silent", - "rail", - "relief", - "independence", - "combat", - "shape", - "write", - "determined", - "sales", - "learned", - "4th", - "finger", - "oxford", - "providing", - "1937", - "heritage", - "fiction", - "situated", - "designated", - "allowing", - "distribution", - "hosted", - "##est", - "sight", - "interview", - "estimated", - "reduced", - "##ria", - "toronto", - "footballer", - "keeping", - "guys", - "damn", - "claim", - "motion", - "sport", - "sixth", - "stayed", - "##ze", - "en", - "rear", - "receive", - "handed", - "twelve", - "dress", - "audience", - "granted", - "brazil", - "##well", - "spirit", - "##ated", - "noticed", - "etc", - "olympic", - "representative", - "eric", - "tight", - "trouble", - "reviews", - "drink", - "vampire", - "missing", - "roles", - "ranked", - "newly", - "household", - "finals", - "wave", - "critics", - "##ee", - "phase", - "massachusetts", - "pilot", - "unlike", - "philadelphia", - "bright", - "guns", - "crown", - "organizations", - "roof", - "42", - "respectively", - "clearly", - "tongue", - "marked", - "circle", - "fox", - "korea", - "bronze", - "brian", - "expanded", - "sexual", - "supply", - "yourself", - "inspired", - "labour", - "fc", - "##ah", - "reference", - "vision", - "draft", - "connection", - "brand", - "reasons", - "1935", - "classic", - "driving", - "trip", - "jesus", - "cells", - "entry", - "1920", - "neither", - "trail", - "claims", - "atlantic", - "orders", - "labor", - "nose", - "afraid", - "identified", - "intelligence", - "calls", - "cancer", - "attacked", - "passing", - "stephen", - "positions", - "imperial", - "grey", - "jason", - "39", - "sunday", - "48", - "swedish", - "avoid", - "extra", - "uncle", - "message", - "covers", - "allows", - "surprise", - "materials", - "fame", - "hunter", - "##ji", - "1930", - "citizens", - "figures", - "davis", - "environmental", - "confirmed", - "shit", - "titles", - "di", - "performing", - "difference", - "acts", - "attacks", - "##ov", - "existing", - "votes", - "opportunity", - "nor", - "shop", - "entirely", - "trains", - "opposite", - "pakistan", - "##pa", - "develop", - "resulted", - "representatives", - "actions", - "reality", - "pressed", - "##ish", - "barely", - "wine", - "conversation", - "faculty", - "northwest", - "ends", - "documentary", - "nuclear", - "stock", - "grace", - "sets", - "eat", - "alternative", - "##ps", - "bag", - "resulting", - "creating", - "surprised", - "cemetery", - "1919", - "drop", - "finding", - "sarah", - "cricket", - "streets", - "tradition", - "ride", - "1933", - "exhibition", - "target", - "ear", - "explained", - "rain", - "composer", - "injury", - "apartment", - "municipal", - "educational", - "occupied", - "netherlands", - "clean", - "billion", - "constitution", - "learn", - "1914", - "maximum", - "classical", - "francis", - "lose", - "opposition", - "jose", - "ontario", - "bear", - "core", - "hills", - "rolled", - "ending", - "drawn", - "permanent", - "fun", - "##tes", - "##lla", - "lewis", - "sites", - "chamber", - "ryan", - "##way", - "scoring", - "height", - "1934", - "##house", - "lyrics", - "staring", - "55", - "officials", - "1917", - "snow", - "oldest", - "##tic", - "orange", - "##ger", - "qualified", - "interior", - "apparently", - "succeeded", - "thousand", - "dinner", - "lights", - "existence", - "fans", - "heavily", - "41", - "greatest", - "conservative", - "send", - "bowl", - "plus", - "enter", - "catch", - "##un", - "economy", - "duty", - "1929", - "speech", - "authorities", - "princess", - "performances", - "versions", - "shall", - "graduate", - "pictures", - "effective", - "remembered", - "poetry", - "desk", - "crossed", - "starring", - "starts", - "passenger", - "sharp", - "##ant", - "acres", - "ass", - "weather", - "falling", - "rank", - "fund", - "supporting", - "check", - "adult", - "publishing", - "heads", - "cm", - "southeast", - "lane", - "##burg", - "application", - "bc", - "##ura", - "les", - "condition", - "transfer", - "prevent", - "display", - "ex", - "regions", - "earl", - "federation", - "cool", - "relatively", - "answered", - "besides", - "1928", - "obtained", - "portion", - "##town", - "mix", - "##ding", - "reaction", - "liked", - "dean", - "express", - "peak", - "1932", - "##tte", - "counter", - "religion", - "chain", - "rare", - "miller", - "convention", - "aid", - "lie", - "vehicles", - "mobile", - "perform", - "squad", - "wonder", - "lying", - "crazy", - "sword", - "##ping", - "attempted", - "centuries", - "weren", - "philosophy", - "category", - "##ize", - "anna", - "interested", - "47", - "sweden", - "wolf", - "frequently", - "abandoned", - "kg", - "literary", - "alliance", - "task", - "entitled", - "##ay", - "threw", - "promotion", - "factory", - "tiny", - "soccer", - "visited", - "matt", - "fm", - "achieved", - "52", - "defence", - "internal", - "persian", - "43", - "methods", - "##ging", - "arrested", - "otherwise", - "cambridge", - "programming", - "villages", - "elementary", - "districts", - "rooms", - "criminal", - "conflict", - "worry", - "trained", - "1931", - "attempts", - "waited", - "signal", - "bird", - "truck", - "subsequent", - "programme", - "##ol", - "ad", - "49", - "communist", - "details", - "faith", - "sector", - "patrick", - "carrying", - "laugh", - "##ss", - "controlled", - "korean", - "showing", - "origin", - "fuel", - "evil", - "1927", - "##ent", - "brief", - "identity", - "darkness", - "address", - "pool", - "missed", - "publication", - "web", - "planet", - "ian", - "anne", - "wings", - "invited", - "##tt", - "briefly", - "standards", - "kissed", - "##be", - "ideas", - "climate", - "causing", - "walter", - "worse", - "albert", - "articles", - "winners", - "desire", - "aged", - "northeast", - "dangerous", - "gate", - "doubt", - "1922", - "wooden", - "multi", - "##ky", - "poet", - "rising", - "funding", - "46", - "communications", - "communication", - "violence", - "copies", - "prepared", - "ford", - "investigation", - "skills", - "1924", - "pulling", - "electronic", - "##ak", - "##ial", - "##han", - "containing", - "ultimately", - "offices", - "singing", - "understanding", - "restaurant", - "tomorrow", - "fashion", - "christ", - "ward", - "da", - "pope", - "stands", - "5th", - "flow", - "studios", - "aired", - "commissioned", - "contained", - "exist", - "fresh", - "americans", - "##per", - "wrestling", - "approved", - "kid", - "employed", - "respect", - "suit", - "1925", - "angel", - "asking", - "increasing", - "frame", - "angry", - "selling", - "1950s", - "thin", - "finds", - "##nd", - "temperature", - "statement", - "ali", - "explain", - "inhabitants", - "towns", - "extensive", - "narrow", - "51", - "jane", - "flowers", - "images", - "promise", - "somewhere", - "object", - "fly", - "closely", - "##ls", - "1912", - "bureau", - "cape", - "1926", - "weekly", - "presidential", - "legislative", - "1921", - "##ai", - "##au", - "launch", - "founding", - "##ny", - "978", - "##ring", - "artillery", - "strike", - "un", - "institutions", - "roll", - "writers", - "landing", - "chose", - "kevin", - "anymore", - "pp", - "##ut", - "attorney", - "fit", - "dan", - "billboard", - "receiving", - "agricultural", - "breaking", - "sought", - "dave", - "admitted", - "lands", - "mexican", - "##bury", - "charlie", - "specifically", - "hole", - "iv", - "howard", - "credit", - "moscow", - "roads", - "accident", - "1923", - "proved", - "wear", - "struck", - "hey", - "guards", - "stuff", - "slid", - "expansion", - "1915", - "cat", - "anthony", - "##kin", - "melbourne", - "opposed", - "sub", - "southwest", - "architect", - "failure", - "plane", - "1916", - "##ron", - "map", - "camera", - "tank", - "listen", - "regarding", - "wet", - "introduction", - "metropolitan", - "link", - "ep", - "fighter", - "inch", - "grown", - "gene", - "anger", - "fixed", - "buy", - "dvd", - "khan", - "domestic", - "worldwide", - "chapel", - "mill", - "functions", - "examples", - "##head", - "developing", - "1910", - "turkey", - "hits", - "pocket", - "antonio", - "papers", - "grow", - "unless", - "circuit", - "18th", - "concerned", - "attached", - "journalist", - "selection", - "journey", - "converted", - "provincial", - "painted", - "hearing", - "aren", - "bands", - "negative", - "aside", - "wondered", - "knight", - "lap", - "survey", - "ma", - "##ow", - "noise", - "billy", - "##ium", - "shooting", - "guide", - "bedroom", - "priest", - "resistance", - "motor", - "homes", - "sounded", - "giant", - "##mer", - "150", - "scenes", - "equal", - "comic", - "patients", - "hidden", - "solid", - "actual", - "bringing", - "afternoon", - "touched", - "funds", - "wedding", - "consisted", - "marie", - "canal", - "sr", - "kim", - "treaty", - "turkish", - "recognition", - "residence", - "cathedral", - "broad", - "knees", - "incident", - "shaped", - "fired", - "norwegian", - "handle", - "cheek", - "contest", - "represent", - "##pe", - "representing", - "beauty", - "##sen", - "birds", - "advantage", - "emergency", - "wrapped", - "drawing", - "notice", - "pink", - "broadcasting", - "##ong", - "somehow", - "bachelor", - "seventh", - "collected", - "registered", - "establishment", - "alan", - "assumed", - "chemical", - "personnel", - "roger", - "retirement", - "jeff", - "portuguese", - "wore", - "tied", - "device", - "threat", - "progress", - "advance", - "##ised", - "banks", - "hired", - "manchester", - "nfl", - "teachers", - "structures", - "forever", - "##bo", - "tennis", - "helping", - "saturday", - "sale", - "applications", - "junction", - "hip", - "incorporated", - "neighborhood", - "dressed", - "ceremony", - "##ds", - "influenced", - "hers", - "visual", - "stairs", - "decades", - "inner", - "kansas", - "hung", - "hoped", - "gain", - "scheduled", - "downtown", - "engaged", - "austria", - "clock", - "norway", - "certainly", - "pale", - "protected", - "1913", - "victor", - "employees", - "plate", - "putting", - "surrounded", - "##ists", - "finishing", - "blues", - "tropical", - "##ries", - "minnesota", - "consider", - "philippines", - "accept", - "54", - "retrieved", - "1900", - "concern", - "anderson", - "properties", - "institution", - "gordon", - "successfully", - "vietnam", - "##dy", - "backing", - "outstanding", - "muslim", - "crossing", - "folk", - "producing", - "usual", - "demand", - "occurs", - "observed", - "lawyer", - "educated", - "##ana", - "kelly", - "string", - "pleasure", - "budget", - "items", - "quietly", - "colorado", - "philip", - "typical", - "##worth", - "derived", - "600", - "survived", - "asks", - "mental", - "##ide", - "56", - "jake", - "jews", - "distinguished", - "ltd", - "1911", - "sri", - "extremely", - "53", - "athletic", - "loud", - "thousands", - "worried", - "shadow", - "transportation", - "horses", - "weapon", - "arena", - "importance", - "users", - "tim", - "objects", - "contributed", - "dragon", - "douglas", - "aware", - "senator", - "johnny", - "jordan", - "sisters", - "engines", - "flag", - "investment", - "samuel", - "shock", - "capable", - "clark", - "row", - "wheel", - "refers", - "session", - "familiar", - "biggest", - "wins", - "hate", - "maintained", - "drove", - "hamilton", - "request", - "expressed", - "injured", - "underground", - "churches", - "walker", - "wars", - "tunnel", - "passes", - "stupid", - "agriculture", - "softly", - "cabinet", - "regarded", - "joining", - "indiana", - "##ea", - "##ms", - "push", - "dates", - "spend", - "behavior", - "woods", - "protein", - "gently", - "chase", - "morgan", - "mention", - "burning", - "wake", - "combination", - "occur", - "mirror", - "leads", - "jimmy", - "indeed", - "impossible", - "singapore", - "paintings", - "covering" - }; + @SuppressWarnings("unchecked") + private List<String> loadVocab() throws IOException { + + String path = "/org/elasticsearch/xpack/core/ml/inference/pipeline_config.json"; + URL resource = getClass().getResource(path); + if (resource == null) { + throw new ElasticsearchException("Could not find resource stored at [" + path + "]"); + } + try(XContentParser parser = + XContentType.JSON.xContent().createParser( + NamedXContentRegistry.EMPTY, + DeprecationHandler.THROW_UNSUPPORTED_OPERATION, + getClass().getResourceAsStream(path))) { + + Map<String, Object> map = parser.map(); + assertNotNull(map.get("task_type")); + assertNotNull(map.get("vocab")); + + return (List<String>)map.get("vocab"); + } } } From 558ce9f241465aaa2c2d81f2ad7d8b7e44b32af1 Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Mon, 10 May 2021 17:06:24 +0100 Subject: [PATCH 05/21] Add pipeline post processor --- .../InferTrainedModelDeploymentAction.java | 14 +- .../MlInferenceNamedXContentProvider.java | 4 + .../inference/deployment/PyTorchResult.java | 4 + .../core/ml/inference/results/NerResults.java | 51 +++++++ .../deployment/DeploymentManager.java | 27 ++-- .../TrainedModelDeploymentTask.java | 4 +- .../inference/pipelines/nlp/NerProcessor.java | 132 ++++++++++++++++++ .../ml/inference/pipelines/nlp/NerResult.java | 47 +++++++ .../inference/pipelines/nlp/NlpPipeline.java | 28 +++- .../ml/inference/pipelines/nlp/TaskType.java | 34 +---- .../pipelines/nlp/NerProcessorTests.java | 27 ++++ .../pipelines/nlp/TaskTypeTests.java | 11 -- 12 files changed, 318 insertions(+), 65 deletions(-) create mode 100644 x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/NerResults.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessor.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResult.java create mode 100644 x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessorTests.java diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferTrainedModelDeploymentAction.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferTrainedModelDeploymentAction.java index 78ff743dd13b3..f4af24a8ac2a9 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferTrainedModelDeploymentAction.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferTrainedModelDeploymentAction.java @@ -20,7 +20,7 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.tasks.Task; -import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; +import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; import java.io.IOException; import java.util.Collections; @@ -116,28 +116,28 @@ public int hashCode() { public static class Response extends BaseTasksResponse implements Writeable, ToXContentObject { - private final PyTorchResult result; + private final InferenceResults results; - public Response(PyTorchResult result) { + public Response(InferenceResults result) { super(Collections.emptyList(), Collections.emptyList()); - this.result = Objects.requireNonNull(result); + this.results = Objects.requireNonNull(result); } public Response(StreamInput in) throws IOException { super(in); - result = new PyTorchResult(in); + results = in.readNamedWriteable(InferenceResults.class); } @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - result.toXContent(builder, params); + results.toXContent(builder, params); return builder; } @Override public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); - result.writeTo(out); + out.writeNamedWriteable(results); } } } diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/MlInferenceNamedXContentProvider.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/MlInferenceNamedXContentProvider.java index abe027b4c4bc2..13f183ccb39ce 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/MlInferenceNamedXContentProvider.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/MlInferenceNamedXContentProvider.java @@ -20,6 +20,7 @@ import org.elasticsearch.xpack.core.ml.inference.preprocessing.TargetMeanEncoding; import org.elasticsearch.xpack.core.ml.inference.results.ClassificationInferenceResults; import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; +import org.elasticsearch.xpack.core.ml.inference.results.NerResults; import org.elasticsearch.xpack.core.ml.inference.results.RegressionInferenceResults; import org.elasticsearch.xpack.core.ml.inference.results.WarningInferenceResults; import org.elasticsearch.xpack.core.ml.inference.trainedmodel.ClassificationConfig; @@ -215,6 +216,9 @@ public List<NamedWriteableRegistry.Entry> getNamedWriteables() { namedWriteables.add(new NamedWriteableRegistry.Entry(InferenceResults.class, WarningInferenceResults.NAME, WarningInferenceResults::new)); + namedWriteables.add(new NamedWriteableRegistry.Entry(InferenceResults.class, + NerResults.NAME, + NerResults::new)); // Inference Configs namedWriteables.add(new NamedWriteableRegistry.Entry(InferenceConfig.class, diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/deployment/PyTorchResult.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/deployment/PyTorchResult.java index e5115357fbde6..e0eaf0910045a 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/deployment/PyTorchResult.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/deployment/PyTorchResult.java @@ -81,6 +81,10 @@ public String getRequestId() { return requestId; } + public double[][] getInferenceResult() { + return inference; + } + @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/NerResults.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/NerResults.java new file mode 100644 index 0000000000000..47a2f421f76f1 --- /dev/null +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/NerResults.java @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.core.ml.inference.results; + +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.xcontent.XContentBuilder; + +import java.io.IOException; +import java.util.Map; + +public class NerResults implements InferenceResults { + + public static final String NAME = "ner_result"; + + public NerResults(StreamInput in) throws IOException { + + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + return builder; + } + + @Override + public String getWriteableName() { + return NAME; + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + + } + + @Override + public Map<String, Object> asMap() { + // TODO required for Ingest Pipelines + return null; + } + + @Override + public Object predictedValue() { + // TODO required for Ingest Pipelines + return null; + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java index 34c60e4d429b4..658b4e382a9db 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java @@ -33,6 +33,7 @@ import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; import org.elasticsearch.xpack.core.ml.inference.deployment.TrainedModelDeploymentState; import org.elasticsearch.xpack.core.ml.inference.deployment.TrainedModelDeploymentTaskState; +import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; import org.elasticsearch.xpack.core.ml.job.messages.Messages; import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper; import org.elasticsearch.xpack.ml.MachineLearning; @@ -162,7 +163,7 @@ public void stopDeployment(TrainedModelDeploymentTask task) { } } - public void infer(TrainedModelDeploymentTask task, String inputs, ActionListener<PyTorchResult> listener) { + public void infer(TrainedModelDeploymentTask task, String inputs, ActionListener<InferenceResults> listener) { ProcessContext processContext = processContextByAllocation.get(task.getAllocationId()); final String requestId = String.valueOf(requestIdCounter.getAndIncrement()); @@ -176,8 +177,14 @@ public void onFailure(Exception e) { @Override protected void doRun() { try { - processContext.infer(inputs, requestId); - waitForResult(processContext, requestId, listener); + NlpPipeline.Processor processor = processContext.pipeline.get().createProcessor(); + + logger.info("tokenizing input [{}]", inputs); + BytesReference request = processor.getRequestBuilder().buildRequest(inputs, requestId); + logger.info("Inference Request "+ request.utf8ToString()); + processContext.process.get().writeInferenceRequest(request); + + waitForResult(processContext, requestId, processor.getResultProcessor(), listener); } catch (IOException e) { logger.error(new ParameterizedMessage("[{}] error writing to process", processContext.modelId), e); onFailure(ExceptionsHelper.serverError("error writing to process", e)); @@ -186,7 +193,10 @@ protected void doRun() { }); } - private void waitForResult(ProcessContext processContext, String requestId, ActionListener<PyTorchResult> listener) { + private void waitForResult(ProcessContext processContext, + String requestId, + NlpPipeline.ResultProcessor inferenceResultsProcessor, + ActionListener<InferenceResults> listener) { try { // TODO the timeout value should come from the action TimeValue timeout = TimeValue.timeValueSeconds(5); @@ -195,7 +205,7 @@ private void waitForResult(ProcessContext processContext, String requestId, Acti listener.onFailure(new ElasticsearchStatusException("timeout [{}] waiting for inference result", RestStatus.TOO_MANY_REQUESTS, timeout)); } else { - listener.onResponse(pyTorchResult); + listener.onResponse(inferenceResultsProcessor.processResult(pyTorchResult)); } } catch (InterruptedException e) { listener.onFailure(e); @@ -223,13 +233,6 @@ class ProcessContext { this.stateStreamer = new PyTorchStateStreamer(client, executorService, xContentRegistry); } - void infer(String inputs, String requestId) throws IOException { - logger.info("tokenizing input [{}]", inputs); - BytesReference request = pipeline.get().createRequest(inputs, requestId); - logger.info("I Request "+ request.utf8ToString()); - process.get().writeInferenceRequest(request); - } - synchronized void startProcess() { process.set(pyTorchProcessFactory.createProcess(modelId, executorServiceForProcess, onProcessCrash())); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java index 3b88befdc94ec..139d41c8b222e 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java @@ -15,7 +15,7 @@ import org.elasticsearch.xpack.core.ml.MlTasks; import org.elasticsearch.xpack.core.ml.action.StartTrainedModelDeploymentAction; import org.elasticsearch.xpack.core.ml.action.StartTrainedModelDeploymentAction.TaskParams; -import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; +import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; import java.util.Map; @@ -60,7 +60,7 @@ protected void onCancelled() { stop(reason); } - public void infer(String inputs, ActionListener<PyTorchResult> listener) { + public void infer(String inputs, ActionListener<InferenceResults> listener) { manager.infer(this, inputs, listener); } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessor.java new file mode 100644 index 0000000000000..a67ed7ae93ac4 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessor.java @@ -0,0 +1,132 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; +import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class NerProcessor extends NlpPipeline.Processor { + + public enum Entity { + NONE, MISC, PERSON, ORGANISATION, LOCATION + } + + // Inside-Outside-Beginning (IOB) tag + private enum IobTag { + O(Entity.NONE), // Outside of a named entity + B_MISC(Entity.MISC), // Beginning of a miscellaneous entity right after another miscellaneous entity + I_MISC(Entity.MISC), // Miscellaneous entity + B_PER(Entity.PERSON), // Beginning of a person's name right after another person's name + I_PER(Entity.PERSON), // Person's name + B_ORG(Entity.ORGANISATION), // Beginning of an organisation right after another organisation + I_ORG(Entity.ORGANISATION), // Organisation + B_LOC(Entity.LOCATION), // Beginning of a location right after another location + I_LOC(Entity.LOCATION); // Location + + private final Entity entity; + + IobTag(Entity entity) { + this.entity = entity; + } + + Entity getEntity() { + return entity; + } + } + + + private final BertTokenizer tokenizer; + private BertTokenizer.TokenizationResult tokenization; + + NerProcessor(BertTokenizer tokenizer) { + this.tokenizer = tokenizer; + } + + private NerResult processResult(PyTorchResult pyTorchResult) { + List<IobTag> tags = toClassification(pyTorchResult); + return labelInputs(tags, tokenization); + } + + private BytesReference buildRequest(String requestId, String inputs) throws IOException { + tokenization = tokenizer.tokenize(inputs, true); + return jsonRequest(tokenization.getTokenIds(), requestId); + } + + @Override + public NlpPipeline.RequestBuilder getRequestBuilder() { + return this::buildRequest; + } + + @Override + public NlpPipeline.ResultProcessor getResultProcessor() { + return this::processResult; + } + + private NerResult labelInputs(List<IobTag> tags, BertTokenizer.TokenizationResult tokenization) { + // TODO. The subword tokenisation means that words may have been split. + // Split tokens need to be reassembled into the original text. + // Each IOB tag maps to a split token, where a single word has + // more than one token we need a method to resolve a single IOB + // token type for the word. There are numerous ways to do this: + // pick the first token, take the most common token or take the + // IOB token with the highest probability. + // For example Elasticsearch maybe split Elastic and ##search with + // the tokens I-ORG and O + return null; + } + + private List<IobTag> toClassification(PyTorchResult pyTorchResult) { + List<IobTag> tags = new ArrayList<>(pyTorchResult.getInferenceResult().length); + IobTag[] enumMap = IobTag.values(); + for (double[] arr : pyTorchResult.getInferenceResult()) { + int ordinalValue = argmax(arr); + assert ordinalValue < IobTag.values().length; + tags.add(enumMap[argmax(arr)]); + } + return tags; + } + + private static int argmax(double[] arr) { + int greatest = 0; + for (int i=1; i<arr.length; i++) { + if (arr[i] > arr[greatest]) { + greatest = i; + } + } + return greatest; + } + + static BytesReference jsonRequest(int[] tokens, String requestId) throws IOException { + XContentBuilder builder = XContentFactory.jsonBuilder(); + builder.startObject(); + builder.field(REQUEST_ID, requestId); + builder.array(TOKENS, tokens); + + int[] inputMask = new int[tokens.length]; + Arrays.fill(inputMask, 1); + int[] segmentMask = new int[tokens.length]; + Arrays.fill(segmentMask, 0); + int[] positionalIds = new int[tokens.length]; + Arrays.setAll(positionalIds, i -> i); + builder.array(ARG1, inputMask); + builder.array(ARG2, segmentMask); + builder.array(ARG3, positionalIds); + builder.endObject(); + + // BytesReference.bytes closes the builder + return BytesReference.bytes(builder); + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResult.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResult.java new file mode 100644 index 0000000000000..6ce7b821d0284 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResult.java @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; + +import java.io.IOException; +import java.util.Map; + +public class NerResult implements InferenceResults { + + public String NAME = "ner_result"; + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + return null; + } + + @Override + public String getWriteableName() { + return NAME; + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + + } + + @Override + public Map<String, Object> asMap() { + // TODO required for Ingest Pipelines + return null; + } + + @Override + public Object predictedValue() { + // TODO required for Ingest Pipelines + return null; + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java index a81a275cdbab7..abf5146089b3f 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java @@ -8,6 +8,8 @@ package org.elasticsearch.xpack.ml.inference.pipelines.nlp; import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; +import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; import java.io.IOException; @@ -22,12 +24,32 @@ private NlpPipeline(TaskType taskType, BertTokenizer tokenizer) { this.tokenizer = tokenizer; } - public BytesReference createRequest(String inputs, String requestId) throws IOException { - BertTokenizer.TokenizationResult tokens = tokenizer.tokenize(inputs, true); - return taskType.jsonRequest(tokens.getTokenIds(), requestId); + public Processor createProcessor() throws IOException { + return taskType.createProcessor(tokenizer); } public static NlpPipeline fromConfig(PipelineConfig config) { return new NlpPipeline(config.getTaskType(), config.buildTokenizer()); } + + public interface RequestBuilder { + BytesReference buildRequest(String inputs, String requestId) throws IOException; + } + + public interface ResultProcessor { + InferenceResults processResult(PyTorchResult pyTorchResult); + } + + + public abstract static class Processor { + + protected static final String REQUEST_ID = "request_id"; + protected static final String TOKENS = "tokens"; + protected static final String ARG1 = "arg_1"; + protected static final String ARG2 = "arg_2"; + protected static final String ARG3 = "arg_3"; + + public abstract RequestBuilder getRequestBuilder(); + public abstract ResultProcessor getResultProcessor(); + } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java index b6fd37dd96326..78321df8c4526 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java @@ -7,40 +7,20 @@ package org.elasticsearch.xpack.ml.inference.pipelines.nlp; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; import java.io.IOException; -import java.util.Arrays; import java.util.Locale; public enum TaskType { TOKEN_CLASSIFICATION { - public BytesReference jsonRequest(int[] tokens, String requestId) throws IOException { - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field(REQUEST_ID, requestId); - builder.array(TOKENS, tokens); - - int[] inputMask = new int[tokens.length]; - Arrays.fill(inputMask, 1); - int[] segmentMask = new int[tokens.length]; - Arrays.fill(segmentMask, 0); - int[] positionalIds = new int[tokens.length]; - Arrays.setAll(positionalIds, i -> i); - builder.array(ARG1, inputMask); - builder.array(ARG2, segmentMask); - builder.array(ARG3, positionalIds); - builder.endObject(); - - // BytesReference.bytes closes the builder - return BytesReference.bytes(builder); + public NlpPipeline.Processor createProcessor(BertTokenizer tokenizer) throws IOException { + return new NerProcessor(tokenizer); } }; - public BytesReference jsonRequest(int[] tokens, String requestId) throws IOException { + public NlpPipeline.Processor createProcessor(BertTokenizer tokenizer) throws IOException { throw new UnsupportedOperationException("json request must be specialised for task type [" + this.name() + "]"); } @@ -52,10 +32,4 @@ public String toString() { public static TaskType fromString(String name) { return valueOf(name.trim().toUpperCase(Locale.ROOT)); } - - private static final String REQUEST_ID = "request_id"; - private static final String TOKENS = "tokens"; - private static final String ARG1 = "arg_1"; - private static final String ARG2 = "arg_2"; - private static final String ARG3 = "arg_3"; } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessorTests.java new file mode 100644 index 0000000000000..e8c1b0f64c092 --- /dev/null +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessorTests.java @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.test.ESTestCase; + +import java.io.IOException; + +public class NerProcessorTests extends ESTestCase { + + public void testJsonRequest() throws IOException { + String requestId = "foo"; + int [] tokens = new int[] {100, 101, 102, 103, 104}; + BytesReference bytesReference = NerProcessor.jsonRequest(tokens, requestId); + + String jsonDoc = bytesReference.utf8ToString(); + assertEquals( + "{\"request_id\":\"foo\",\"tokens\":[100,101,102,103,104],\"arg_1\":[1,1,1,1,1],\"arg_2\":[0,0,0,0,0],\"arg_3\":[0,1,2,3,4]}", + jsonDoc); + } +} diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskTypeTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskTypeTests.java index 7daaff2307071..1c048c2ee4f16 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskTypeTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskTypeTests.java @@ -7,21 +7,10 @@ package org.elasticsearch.xpack.ml.inference.pipelines.nlp; -import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.test.ESTestCase; -import java.io.IOException; public class TaskTypeTests extends ESTestCase { - public void testTokenClassificationJsonRequest() throws IOException { - String requestId = "foo"; - int [] tokens = new int[] {100, 101, 102, 103, 104}; - BytesReference bytesReference = TaskType.TOKEN_CLASSIFICATION.jsonRequest(tokens, requestId); - String jsonDoc = bytesReference.utf8ToString(); - assertEquals( - "{\"request_id\":\"foo\",\"tokens\":[100,101,102,103,104],\"arg_1\":[1,1,1,1,1],\"arg_2\":[0,0,0,0,0],\"arg_3\":[0,1,2,3,4]}", - jsonDoc); - } } From 568fabd209fd0ffa577deccabb08610a39dc3129 Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Mon, 10 May 2021 17:44:08 +0100 Subject: [PATCH 06/21] Fixing tests --- .../pipelines/nlp/tokenizers/BertTokenizerTests.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java index f85cc57fd35b1..38acbc6061b5f 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java @@ -28,11 +28,11 @@ public class BertTokenizerTests extends ESTestCase { public void testTokenize() { BertTokenizer tokenizer = BertTokenizer.builder( - WordPieceTokenizerTests.createVocabMap("elastic", "##search", "fun")) + WordPieceTokenizerTests.createVocabMap("Elastic", "##search", "fun")) .build(); BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun", false); - assertThat(tokenization.getTokens(), contains("elastic", "##search", "fun")); + assertThat(tokenization.getTokens(), contains("Elastic", "##search", "fun")); assertArrayEquals(new int[] {0, 1, 2}, tokenization.getTokenIds()); assertArrayEquals(new int[] {0, 0, 1}, tokenization.getTokenMap()); } @@ -43,7 +43,7 @@ public void testTokenizeAppendSpecialTokens() { BertTokenizer.CLASS_TOKEN, BertTokenizer.SEPARATOR_TOKEN)) .build(); - BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun", true); + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("elasticsearch fun", true); assertThat(tokenization.getTokens(), contains("[CLS]", "elastic", "##search", "fun", "[SEP]")); assertArrayEquals(new int[] {3, 0, 1, 2, 4}, tokenization.getTokenIds()); assertArrayEquals(new int[] {-1, 0, 0, 1, -1}, tokenization.getTokenMap()); @@ -70,12 +70,12 @@ public void testNeverSplitTokens() { final String specialToken = "SP001"; BertTokenizer tokenizer = BertTokenizer.builder( - WordPieceTokenizerTests.createVocabMap("elastic", "##search", "fun", specialToken, BertTokenizer.UNKNOWN_TOKEN)) + WordPieceTokenizerTests.createVocabMap("Elastic", "##search", "fun", specialToken, BertTokenizer.UNKNOWN_TOKEN)) .setNeverSplit(Collections.singleton(specialToken)) .build(); BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch " + specialToken + " fun", false); - assertThat(tokenization.getTokens(), contains("elastic", "##search", specialToken, "fun")); + assertThat(tokenization.getTokens(), contains("Elastic", "##search", specialToken, "fun")); assertArrayEquals(new int[] {0, 1, 3, 2}, tokenization.getTokenIds()); assertArrayEquals(new int[] {0, 0, 1, 2}, tokenization.getTokenMap()); } From 8ce7ede27d943380f3d6aee6d66bea410b60cc48 Mon Sep 17 00:00:00 2001 From: Dimitris Athanasiou <dimitris@elastic.co> Date: Wed, 12 May 2021 18:29:14 +0300 Subject: [PATCH 07/21] Implement NER result processor --- .../InferTrainedModelDeploymentAction.java | 24 +-- ...portInferTrainedModelDeploymentAction.java | 2 +- .../deployment/DeploymentManager.java | 6 +- .../TrainedModelDeploymentTask.java | 4 +- .../inference/pipelines/nlp/EntityGroup.java | 63 +++++++ .../inference/pipelines/nlp/NerProcessor.java | 71 +++---- .../ml/inference/pipelines/nlp/NerResult.java | 21 ++- .../pipelines/nlp/NerResultProcessor.java | 173 ++++++++++++++++++ .../pipelines/nlp/PipelineConfig.java | 12 +- .../nlp/tokenizers/BertTokenizer.java | 27 ++- .../nlp/NerResultProcessorTests.java | 104 +++++++++++ .../nlp/tokenizers/BertTokenizerTests.java | 30 +-- 12 files changed, 427 insertions(+), 110 deletions(-) create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/EntityGroup.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java create mode 100644 x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferTrainedModelDeploymentAction.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferTrainedModelDeploymentAction.java index f4af24a8ac2a9..41d973d4b8a78 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferTrainedModelDeploymentAction.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferTrainedModelDeploymentAction.java @@ -40,11 +40,11 @@ public InferTrainedModelDeploymentAction() { public static class Request extends BaseTasksRequest<Request> implements ToXContentObject { public static final String DEPLOYMENT_ID = "deployment_id"; - public static final ParseField INPUTS = new ParseField("inputs"); + public static final ParseField INPUT = new ParseField("input"); private static final ObjectParser<Request, Void> PARSER = new ObjectParser<>(NAME, Request::new); static { - PARSER.declareString((request, inputs) -> request.inputs = inputs, INPUTS); + PARSER.declareString((request, inputs) -> request.input = inputs, INPUT); } public static Request parseRequest(String deploymentId, XContentParser parser) { @@ -54,42 +54,42 @@ public static Request parseRequest(String deploymentId, XContentParser parser) { } private String deploymentId; - private String inputs; + private String input; private Request() { } - public Request(String deploymentId, String inputs) { + public Request(String deploymentId, String input) { this.deploymentId = Objects.requireNonNull(deploymentId); - this.inputs = Objects.requireNonNull(inputs); + this.input = Objects.requireNonNull(input); } public Request(StreamInput in) throws IOException { super(in); deploymentId = in.readString(); - inputs = in.readString(); + input = in.readString(); } public String getDeploymentId() { return deploymentId; } - public String getInputs() { - return inputs; + public String getInput() { + return input; } @Override public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); out.writeString(deploymentId); - out.writeString(inputs); + out.writeString(input); } @Override public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params params) throws IOException { builder.startObject(); builder.field(DEPLOYMENT_ID, deploymentId); - builder.field(INPUTS.getPreferredName(), inputs); + builder.field(INPUT.getPreferredName(), input); builder.endObject(); return builder; } @@ -105,12 +105,12 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; InferTrainedModelDeploymentAction.Request that = (InferTrainedModelDeploymentAction.Request) o; return Objects.equals(deploymentId, that.deploymentId) - && Objects.equals(inputs, that.inputs); + && Objects.equals(input, that.input); } @Override public int hashCode() { - return Objects.hash(deploymentId, inputs); + return Objects.hash(deploymentId, input); } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java index c3b31f8e62ebe..dce2ea7790749 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java @@ -70,7 +70,7 @@ protected InferTrainedModelDeploymentAction.Response newResponse(InferTrainedMod @Override protected void taskOperation(InferTrainedModelDeploymentAction.Request request, TrainedModelDeploymentTask task, ActionListener<InferTrainedModelDeploymentAction.Response> listener) { - task.infer(request.getInputs(), + task.infer(request.getInput(), ActionListener.wrap( pyTorchResult -> listener.onResponse(new InferTrainedModelDeploymentAction.Response(pyTorchResult)), listener::onFailure) diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java index 658b4e382a9db..cfb9a1a8b0d3b 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java @@ -163,7 +163,7 @@ public void stopDeployment(TrainedModelDeploymentTask task) { } } - public void infer(TrainedModelDeploymentTask task, String inputs, ActionListener<InferenceResults> listener) { + public void infer(TrainedModelDeploymentTask task, String input, ActionListener<InferenceResults> listener) { ProcessContext processContext = processContextByAllocation.get(task.getAllocationId()); final String requestId = String.valueOf(requestIdCounter.getAndIncrement()); @@ -179,8 +179,8 @@ protected void doRun() { try { NlpPipeline.Processor processor = processContext.pipeline.get().createProcessor(); - logger.info("tokenizing input [{}]", inputs); - BytesReference request = processor.getRequestBuilder().buildRequest(inputs, requestId); + logger.info("tokenizing input [{}]", input); + BytesReference request = processor.getRequestBuilder().buildRequest(requestId, input); logger.info("Inference Request "+ request.utf8ToString()); processContext.process.get().writeInferenceRequest(request); diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java index 139d41c8b222e..ea295b4ef8e66 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java @@ -60,7 +60,7 @@ protected void onCancelled() { stop(reason); } - public void infer(String inputs, ActionListener<InferenceResults> listener) { - manager.infer(this, inputs, listener); + public void infer(String input, ActionListener<InferenceResults> listener) { + manager.infer(this, input, listener); } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/EntityGroup.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/EntityGroup.java new file mode 100644 index 0000000000000..d2098bca41a61 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/EntityGroup.java @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.common.ParseField; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.common.xcontent.ToXContentObject; +import org.elasticsearch.common.xcontent.XContentBuilder; + +import java.io.IOException; +import java.util.Objects; + +public class EntityGroup implements ToXContentObject, Writeable { + + private static final ParseField LABEL = new ParseField("label"); + private static final ParseField SCORE = new ParseField("score"); + private static final ParseField WORD = new ParseField("word"); + + private final NerProcessor.Entity label; + private final double score; + private final String word; + + public EntityGroup(NerProcessor.Entity label, double score, String word) { + this.label = label; + this.score = score; + this.word = Objects.requireNonNull(word); + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject(); + builder.field(LABEL.getPreferredName(), label); + builder.field(SCORE.getPreferredName(), score); + builder.field(WORD.getPreferredName(), word); + builder.endObject(); + return builder; + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + label.writeTo(out); + out.writeDouble(score); + out.writeString(word); + } + + public NerProcessor.Entity getLabel() { + return label; + } + + public double getScore() { + return score; + } + + public String getWord() { + return word; + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessor.java index a67ed7ae93ac4..7bf162925a106 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessor.java @@ -8,24 +8,34 @@ package org.elasticsearch.xpack.ml.inference.pipelines.nlp; import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; import java.io.IOException; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; +import java.util.Locale; public class NerProcessor extends NlpPipeline.Processor { - public enum Entity { - NONE, MISC, PERSON, ORGANISATION, LOCATION + public enum Entity implements Writeable { + NONE, MISC, PERSON, ORGANISATION, LOCATION; + + @Override + public void writeTo(StreamOutput out) throws IOException { + out.writeEnum(this); + } + + @Override + public String toString() { + return name().toLowerCase(Locale.ROOT); + } } // Inside-Outside-Beginning (IOB) tag - private enum IobTag { + enum IobTag { O(Entity.NONE), // Outside of a named entity B_MISC(Entity.MISC), // Beginning of a miscellaneous entity right after another miscellaneous entity I_MISC(Entity.MISC), // Miscellaneous entity @@ -45,6 +55,10 @@ private enum IobTag { Entity getEntity() { return entity; } + + boolean isBeginning() { + return name().toLowerCase(Locale.ROOT).startsWith("b"); + } } @@ -55,13 +69,8 @@ Entity getEntity() { this.tokenizer = tokenizer; } - private NerResult processResult(PyTorchResult pyTorchResult) { - List<IobTag> tags = toClassification(pyTorchResult); - return labelInputs(tags, tokenization); - } - - private BytesReference buildRequest(String requestId, String inputs) throws IOException { - tokenization = tokenizer.tokenize(inputs, true); + private BytesReference buildRequest(String requestId, String input) throws IOException { + tokenization = tokenizer.tokenize(input, true); return jsonRequest(tokenization.getTokenIds(), requestId); } @@ -72,41 +81,7 @@ public NlpPipeline.RequestBuilder getRequestBuilder() { @Override public NlpPipeline.ResultProcessor getResultProcessor() { - return this::processResult; - } - - private NerResult labelInputs(List<IobTag> tags, BertTokenizer.TokenizationResult tokenization) { - // TODO. The subword tokenisation means that words may have been split. - // Split tokens need to be reassembled into the original text. - // Each IOB tag maps to a split token, where a single word has - // more than one token we need a method to resolve a single IOB - // token type for the word. There are numerous ways to do this: - // pick the first token, take the most common token or take the - // IOB token with the highest probability. - // For example Elasticsearch maybe split Elastic and ##search with - // the tokens I-ORG and O - return null; - } - - private List<IobTag> toClassification(PyTorchResult pyTorchResult) { - List<IobTag> tags = new ArrayList<>(pyTorchResult.getInferenceResult().length); - IobTag[] enumMap = IobTag.values(); - for (double[] arr : pyTorchResult.getInferenceResult()) { - int ordinalValue = argmax(arr); - assert ordinalValue < IobTag.values().length; - tags.add(enumMap[argmax(arr)]); - } - return tags; - } - - private static int argmax(double[] arr) { - int greatest = 0; - for (int i=1; i<arr.length; i++) { - if (arr[i] > arr[greatest]) { - greatest = i; - } - } - return greatest; + return new NerResultProcessor(tokenization); } static BytesReference jsonRequest(int[] tokens, String requestId) throws IOException { diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResult.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResult.java index 6ce7b821d0284..264f70fc1c08e 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResult.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResult.java @@ -12,15 +12,28 @@ import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; import java.io.IOException; +import java.util.List; import java.util.Map; +import java.util.Objects; public class NerResult implements InferenceResults { public String NAME = "ner_result"; + private final List<EntityGroup> entityGroups; + + public NerResult(List<EntityGroup> entityGroups) { + this.entityGroups = Objects.requireNonNull(entityGroups); + } + @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - return null; + builder.startArray(); + for (EntityGroup entity : entityGroups) { + entity.toXContent(builder, params); + } + builder.endArray(); + return builder; } @Override @@ -30,7 +43,7 @@ public String getWriteableName() { @Override public void writeTo(StreamOutput out) throws IOException { - + out.writeList(entityGroups); } @Override @@ -44,4 +57,8 @@ public Object predictedValue() { // TODO required for Ingest Pipelines return null; } + + List<EntityGroup> getEntityGroups() { + return entityGroups; + } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java new file mode 100644 index 0000000000000..1b68b1c1d76ad --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java @@ -0,0 +1,173 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.search.aggregations.pipeline.MovingFunctions; +import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; +import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; +import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +import static org.elasticsearch.xpack.ml.inference.pipelines.nlp.NerProcessor.IobTag; + +class NerResultProcessor implements NlpPipeline.ResultProcessor { + + private final BertTokenizer.TokenizationResult tokenization; + + NerResultProcessor(BertTokenizer.TokenizationResult tokenization) { + this.tokenization = Objects.requireNonNull(tokenization); + } + + @Override + public InferenceResults processResult(PyTorchResult pyTorchResult) { + if (tokenization.getTokens().isEmpty()) { + return new NerResult(Collections.emptyList()); + } + // TODO It might be best to do the soft max after averaging scores for + // sub-tokens. If we had a word that is "elastic" which is tokenized to + // "el" and "astic" then perhaps we get a prediction for org of 10 for "el" + // and -5 for "astic". Averaging after softmax would produce a prediction + // of maybe (1 + 0) / 2 = 0.5 while before softmax it'd be exp(10 - 5) / normalization + // which could easily be close to 1. + double[][] normalizedScores = convertToProbabilitesBySoftMax(pyTorchResult.getInferenceResult()); + List<TaggedToken> taggedTokens = tagTokens(normalizedScores); + List<EntityGroup> entities = groupTaggedTokens(taggedTokens); + return new NerResult(entities); + } + + static double[][] convertToProbabilitesBySoftMax(double[][] scores) { + double[][] probabilities = new double[scores.length][scores[0].length]; + double[] sum = new double[scores.length]; + for (int i = 0; i < scores.length; i++) { + double maxScore = MovingFunctions.max(scores[i]); + for (int j = 0; j < scores[i].length; j++) { + probabilities[i][j] = Math.exp(scores[i][j] - maxScore); + sum[i] += probabilities[i][j]; + } + } + for (int i = 0; i < scores.length; i++) { + for (int j = 0; j < scores[i].length; j++) { + probabilities[i][j] /= sum[i]; + } + } + return probabilities; + } + + /** + * Here we tag each token with the IoB label that has the max score. + * Additionally, we merge sub-tokens that are part of the same word + * in the original input replacing them with a single token that + * gets labelled based on the average score of all its sub-tokens. + */ + private List<TaggedToken> tagTokens(double[][] scores) { + List<TaggedToken> taggedTokens = new ArrayList<>(); + int startTokenIndex = 0; + while (startTokenIndex < tokenization.getTokens().size()) { + int inputMapping = tokenization.getTokenMap()[startTokenIndex]; + if (inputMapping < 0) { + // This token does not map to a token in the input (special tokens) + startTokenIndex++; + continue; + } + int endTokenIndex = startTokenIndex; + StringBuilder word = new StringBuilder(tokenization.getTokens().get(startTokenIndex)); + while (endTokenIndex < tokenization.getTokens().size() - 1 && tokenization.getTokenMap()[endTokenIndex + 1] == inputMapping) { + endTokenIndex++; + // TODO Here we try to get rid of the continuation hashes at the beginning of sub-tokens. + // It is probably more correct to implement detokenization on the tokenizer + // that does reverse lookup based on token IDs. + String endTokenWord = tokenization.getTokens().get(endTokenIndex).substring(2); + word.append(endTokenWord); + } + double[] avgScores = Arrays.copyOf(scores[startTokenIndex], IobTag.values().length); + for (int i = startTokenIndex + 1; i <= endTokenIndex; i++) { + for (int j = 0; j < scores[i].length; j++) { + avgScores[j] += scores[i][j]; + } + } + for (int i = 0; i < avgScores.length; i++) { + avgScores[i] /= endTokenIndex - startTokenIndex + 1; + } + int maxScoreIndex = argmax(avgScores); + double score = avgScores[maxScoreIndex]; + taggedTokens.add(new TaggedToken(word.toString(), IobTag.values()[maxScoreIndex], score)); + startTokenIndex = endTokenIndex + 1; + } + return taggedTokens; + } + + /** + * Now that we have merged sub-tokens and tagged them with their IoB label, + * we group tokens together into the final entity groups. Effectively, + * we want to group B_X I_X B_X so that it results into two + * entities, one for the first B_X I_X and another for the latter B_X, + * where X is the same entity. + * When multiple tokens are grouped together, the entity score is the + * mean score of the tokens. + */ + private List<EntityGroup> groupTaggedTokens(List<TaggedToken> tokens) { + if (tokens.isEmpty()) { + return Collections.emptyList(); + } + List<EntityGroup> entities = new ArrayList<>(); + int startTokenIndex = 0; + while (startTokenIndex < tokens.size()) { + TaggedToken token = tokens.get(startTokenIndex); + if (token.tag.getEntity() == NerProcessor.Entity.NONE) { + startTokenIndex++; + continue; + } + StringBuilder entityWord = new StringBuilder(token.word); + int endTokenIndex = startTokenIndex + 1; + double scoreSum = token.score; + while (endTokenIndex < tokens.size()) { + TaggedToken endToken = tokens.get(endTokenIndex); + if (endToken.tag.isBeginning() || endToken.tag.getEntity() != token.tag.getEntity()) { + break; + } + // TODO Here we add a space between tokens. + // It is probably more correct to implement detokenization on the tokenizer + // that does reverse lookup based on token IDs. + entityWord.append(" ").append(endToken.word); + scoreSum += endToken.score; + endTokenIndex++; + } + entities.add(new EntityGroup(token.tag.getEntity(), scoreSum / (endTokenIndex - startTokenIndex), entityWord.toString())); + startTokenIndex = endTokenIndex; + } + + return entities; + } + + private static int argmax(double[] arr) { + int maxIndex = 0; + for (int i = 1; i < arr.length; i++) { + if (arr[i] > arr[maxIndex]) { + maxIndex = i; + } + } + return maxIndex; + } + + private static class TaggedToken { + private final String word; + private final IobTag tag; + private final double score; + + private TaggedToken(String word, IobTag tag, double score) { + this.word = word; + this.tag = tag; + this.score = score; + } + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java index 63969df35bac6..89a8d856f0678 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java @@ -17,8 +17,6 @@ import java.io.IOException; import java.util.List; import java.util.Objects; -import java.util.SortedMap; -import java.util.TreeMap; public class PipelineConfig implements ToXContentObject { @@ -63,15 +61,7 @@ public TaskType getTaskType() { } public BertTokenizer buildTokenizer() { - return BertTokenizer.builder(vocabMap()).setDoLowerCase(doLowerCase).build(); - } - - SortedMap<String, Integer> vocabMap() { - SortedMap<String, Integer> vocab = new TreeMap<>(); - for (int i = 0; i < vocabulary.size(); i++) { - vocab.put(vocabulary.get(i), i); - } - return vocab; + return BertTokenizer.builder(vocabulary).setDoLowerCase(doLowerCase).build(); } @Override diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java index 12e540d97ce25..4eb43dcdab2c5 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java @@ -9,8 +9,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; /** * Performs basic tokenization and normalization of input text @@ -33,13 +34,13 @@ public class BertTokenizer { public static final int DEFAULT_MAX_INPUT_CHARS_PER_WORD = 100; private final WordPieceTokenizer wordPieceTokenizer; - private final Map<String, Integer> vocab; + private final SortedMap<String, Integer> vocab; private final boolean doLowerCase; private final boolean doTokenizeCjKChars; private final boolean doStripAccents; private final Set<String> neverSplit; - private BertTokenizer(Map<String, Integer> vocab, + private BertTokenizer(SortedMap<String, Integer> vocab, boolean doLowerCase, boolean doTokenizeCjKChars, boolean doStripAccents, @@ -119,12 +120,12 @@ public TokenizationResult tokenize(String text, boolean withSpecialTokens) { return new TokenizationResult(tokens, tokenIds, tokenMap); } - public class TokenizationResult { + public static class TokenizationResult { private final List<String> tokens; private final int [] tokenIds; private final int [] tokenMap; - TokenizationResult(List<String> tokens, int [] tokenIds, int [] tokenMap) { + public TokenizationResult(List<String> tokens, int[] tokenIds, int[] tokenMap) { assert tokens.size() == tokenIds.length; assert tokenIds.length == tokenMap.length; this.tokens = tokens; @@ -159,20 +160,28 @@ public int[] getTokenMap() { } } - public static Builder builder(Map<String, Integer> vocab) { + public static Builder builder(List<String> vocab) { return new Builder(vocab); } public static class Builder { - private final Map<String, Integer> vocab; + private final SortedMap<String, Integer> vocab; private boolean doLowerCase = false; private boolean doTokenizeCjKChars = true; private Boolean doStripAccents = null; private Set<String> neverSplit; - public Builder(Map<String, Integer> vocab) { - this.vocab = vocab; + private Builder(List<String> vocab) { + this.vocab = buildSortedVocab(vocab); + } + + private static SortedMap<String, Integer> buildSortedVocab(List<String> vocab) { + SortedMap<String, Integer> sortedVocab = new TreeMap<>(); + for (int i = 0; i < vocab.size(); i++) { + sortedVocab.put(vocab.get(i), i); + } + return sortedVocab; } public Builder setDoLowerCase(boolean doLowerCase) { diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java new file mode 100644 index 0000000000000..6c04b50327501 --- /dev/null +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.search.aggregations.pipeline.MovingFunctions; +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; +import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; +import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer.TokenizationResult; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.hamcrest.Matchers.closeTo; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.lessThanOrEqualTo; + +public class NerResultProcessorTests extends ESTestCase { + + public void testProcessResults_GivenNoTokens() { + NerResultProcessor processor = new NerResultProcessor(new TokenizationResult(Collections.emptyList(), new int[0], new int[0])); + NerResult result = (NerResult) processor.processResult(new PyTorchResult("test", null, null)); + assertThat(result.getEntityGroups(), is(empty())); + } + + public void testProcessResults() { + NerResultProcessor processor = createProcessor(Arrays.asList("el", "##astic", "##search", "many", "use", "in", "london"), + "Many use Elasticsearch in London"); + double[][] scores = { + { 7, 0, 0, 0, 0, 0, 0, 0, 0}, // many + { 7, 0, 0, 0, 0, 0, 0, 0, 0}, // use + { 0.01, 0.01, 0, 0.01, 0, 7, 0, 3, 0}, // el + { 0.01, 0.01, 0, 0, 0, 0, 0, 0, 0}, // ##astic + { 0, 0, 0, 0, 0, 0, 0, 0, 0}, // ##search + { 0, 0, 0, 0, 0, 0, 0, 0, 0}, // in + { 0, 0, 0, 0, 0, 0, 0, 6, 0} // london + }; + NerResult result = (NerResult) processor.processResult(new PyTorchResult("1", scores, null)); + + assertThat(result.getEntityGroups().size(), equalTo(2)); + assertThat(result.getEntityGroups().get(0).getWord(), equalTo("elasticsearch")); + assertThat(result.getEntityGroups().get(0).getLabel(), equalTo(NerProcessor.Entity.ORGANISATION)); + assertThat(result.getEntityGroups().get(1).getWord(), equalTo("london")); + assertThat(result.getEntityGroups().get(1).getLabel(), equalTo(NerProcessor.Entity.LOCATION)); + } + + public void testConvertToProbabilitiesBySoftMax_GivenConcreteExample() { + double[][] scores = { + { 0.1, 0.2, 3}, + { 6, 0.2, 0.1} + }; + + double[][] probabilities = NerResultProcessor.convertToProbabilitesBySoftMax(scores); + + assertThat(probabilities[0][0], closeTo(0.04931133, 0.00000001)); + assertThat(probabilities[0][1], closeTo(0.05449744, 0.00000001)); + assertThat(probabilities[0][2], closeTo(0.89619123, 0.00000001)); + assertThat(probabilities[1][0], closeTo(0.99426607, 0.00000001)); + assertThat(probabilities[1][1], closeTo(0.00301019, 0.00000001)); + assertThat(probabilities[1][2], closeTo(0.00272374, 0.00000001)); + } + + public void testConvertToProbabilitiesBySoftMax_GivenRandom() { + double[][] scores = new double[100][100]; + for (int i = 0; i < scores.length; i++) { + for (int j = 0; j < scores[i].length; j++) { + scores[i][j] = randomDoubleBetween(-10, 10, true); + } + } + + double[][] probabilities = NerResultProcessor.convertToProbabilitesBySoftMax(scores); + + // Assert invariants that + // 1. each row sums to 1 + // 2. all values are in [0-1] + assertThat(probabilities.length, equalTo(scores.length)); + for (int i = 0; i < probabilities.length; i++) { + assertThat(probabilities[i].length, equalTo(scores[i].length)); + double rowSum = MovingFunctions.sum(probabilities[i]); + assertThat(rowSum, closeTo(1.0, 0.01)); + for (int j = 0; j < probabilities[i].length; j++) { + assertThat(probabilities[i][j], greaterThanOrEqualTo(0.0)); + assertThat(probabilities[i][j], lessThanOrEqualTo(1.0)); + } + } + } + + private static NerResultProcessor createProcessor(List<String> vocab, String input){ + BertTokenizer tokenizer = BertTokenizer.builder(vocab) + .setDoLowerCase(true) + .build(); + TokenizationResult tokenizationResult = tokenizer.tokenize(input, false); + return new NerResultProcessor(tokenizationResult); + } +} diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java index 38acbc6061b5f..ed449fdf6a93f 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java @@ -16,20 +16,17 @@ import java.io.IOException; import java.net.URL; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.SortedMap; -import java.util.TreeMap; import static org.hamcrest.Matchers.contains; public class BertTokenizerTests extends ESTestCase { public void testTokenize() { - BertTokenizer tokenizer = BertTokenizer.builder( - WordPieceTokenizerTests.createVocabMap("Elastic", "##search", "fun")) - .build(); + BertTokenizer tokenizer = BertTokenizer.builder(Arrays.asList("Elastic", "##search", "fun")).build(); BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch fun", false); assertThat(tokenization.getTokens(), contains("Elastic", "##search", "fun")); @@ -38,10 +35,8 @@ public void testTokenize() { } public void testTokenizeAppendSpecialTokens() { - BertTokenizer tokenizer = BertTokenizer.builder( - WordPieceTokenizerTests.createVocabMap("elastic", "##search", "fun", - BertTokenizer.CLASS_TOKEN, BertTokenizer.SEPARATOR_TOKEN)) - .build(); + BertTokenizer tokenizer = BertTokenizer.builder(Arrays.asList( + "elastic", "##search", "fun", BertTokenizer.CLASS_TOKEN, BertTokenizer.SEPARATOR_TOKEN)).build(); BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("elasticsearch fun", true); assertThat(tokenization.getTokens(), contains("[CLS]", "elastic", "##search", "fun", "[SEP]")); @@ -50,7 +45,7 @@ public void testTokenizeAppendSpecialTokens() { } public void testBertVocab() throws IOException { - BertTokenizer tokenizer = BertTokenizer.builder(vocabMap(loadVocab())).setDoLowerCase(false).build(); + BertTokenizer tokenizer = BertTokenizer.builder(loadVocab()).setDoLowerCase(false).build(); BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Jim bought 300 shares of Acme Corp. in 2006", true); @@ -58,19 +53,11 @@ public void testBertVocab() throws IOException { tokenization.getTokenIds()); } - private SortedMap<String, Integer> vocabMap(List<String> vocabulary) { - SortedMap<String, Integer> vocab = new TreeMap<>(); - for (int i = 0; i < vocabulary.size(); i++) { - vocab.put(vocabulary.get(i), i); - } - return vocab; - } - public void testNeverSplitTokens() { final String specialToken = "SP001"; BertTokenizer tokenizer = BertTokenizer.builder( - WordPieceTokenizerTests.createVocabMap("Elastic", "##search", "fun", specialToken, BertTokenizer.UNKNOWN_TOKEN)) + Arrays.asList("Elastic", "##search", "fun", specialToken, BertTokenizer.UNKNOWN_TOKEN)) .setNeverSplit(Collections.singleton(specialToken)) .build(); @@ -83,7 +70,7 @@ public void testNeverSplitTokens() { public void testDoLowerCase() { { BertTokenizer tokenizer = BertTokenizer.builder( - WordPieceTokenizerTests.createVocabMap("elastic", "##search", "fun", BertTokenizer.UNKNOWN_TOKEN)) + Arrays.asList("elastic", "##search", "fun", BertTokenizer.UNKNOWN_TOKEN)) .setDoLowerCase(false) .build(); @@ -97,8 +84,7 @@ public void testDoLowerCase() { } { - BertTokenizer tokenizer = BertTokenizer.builder( - WordPieceTokenizerTests.createVocabMap("elastic", "##search", "fun")) + BertTokenizer tokenizer = BertTokenizer.builder(Arrays.asList("elastic", "##search", "fun")) .setDoLowerCase(true) .build(); From f3aef8651b0abbc41b2aac94d3b2c72a94695b4e Mon Sep 17 00:00:00 2001 From: Dimitris Athanasiou <dimitris@elastic.co> Date: Fri, 14 May 2021 15:05:31 +0300 Subject: [PATCH 08/21] Add fill_mask processor --- .../deployment/DeploymentManager.java | 5 +- .../pipelines/nlp/FillMaskProcessor.java | 65 +++++++++++++ .../pipelines/nlp/FillMaskResult.java | 95 +++++++++++++++++++ .../nlp/FillMaskResultProcessor.java | 50 ++++++++++ .../pipelines/nlp/NerResultProcessor.java | 33 +------ .../inference/pipelines/nlp/NlpHelpers.java | 44 +++++++++ .../ml/inference/pipelines/nlp/TaskType.java | 5 + .../nlp/tokenizers/BertTokenizer.java | 36 ++++++- .../nlp/NerResultProcessorTests.java | 47 +-------- .../pipelines/nlp/NlpHelpersTests.java | 60 ++++++++++++ 10 files changed, 357 insertions(+), 83 deletions(-) create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskProcessor.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResult.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResultProcessor.java create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpers.java create mode 100644 x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpersTests.java diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java index cfb9a1a8b0d3b..e4ae4bc3ff7b2 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java @@ -205,7 +205,10 @@ private void waitForResult(ProcessContext processContext, listener.onFailure(new ElasticsearchStatusException("timeout [{}] waiting for inference result", RestStatus.TOO_MANY_REQUESTS, timeout)); } else { - listener.onResponse(inferenceResultsProcessor.processResult(pyTorchResult)); + logger.debug(() -> new ParameterizedMessage("[{}] retrieved result for request [{}]", processContext.modelId, requestId)); + InferenceResults results = inferenceResultsProcessor.processResult(pyTorchResult); + logger.debug(() -> new ParameterizedMessage("[{}] processed result for request [{}]", processContext.modelId, requestId)); + listener.onResponse(results); } } catch (InterruptedException e) { listener.onFailure(e); diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskProcessor.java new file mode 100644 index 0000000000000..9503d833865e4 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskProcessor.java @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; + +import java.io.IOException; +import java.util.Arrays; + +public class FillMaskProcessor extends NlpPipeline.Processor { + + private final BertTokenizer tokenizer; + private BertTokenizer.TokenizationResult tokenization; + + FillMaskProcessor(BertTokenizer tokenizer) { + this.tokenizer = tokenizer; + } + + private BytesReference buildRequest(String requestId, String input) throws IOException { + tokenization = tokenizer.tokenize(input, true); + return jsonRequest(tokenization.getTokenIds(), requestId); + } + + @Override + public NlpPipeline.RequestBuilder getRequestBuilder() { + return this::buildRequest; + } + + @Override + public NlpPipeline.ResultProcessor getResultProcessor() { + return new FillMaskResultProcessor(tokenization); + } + + static BytesReference jsonRequest(int[] tokens, String requestId) throws IOException { + // TODO the request here is identical is with NER + // refactor to reuse code when a proper name + // can be found for a base processor + XContentBuilder builder = XContentFactory.jsonBuilder(); + builder.startObject(); + builder.field(REQUEST_ID, requestId); + builder.array(TOKENS, tokens); + + int[] inputMask = new int[tokens.length]; + Arrays.fill(inputMask, 1); + int[] segmentMask = new int[tokens.length]; + Arrays.fill(segmentMask, 0); + int[] positionalIds = new int[tokens.length]; + Arrays.setAll(positionalIds, i -> i); + builder.array(ARG1, inputMask); + builder.array(ARG2, segmentMask); + builder.array(ARG3, positionalIds); + builder.endObject(); + + // BytesReference.bytes closes the builder + return BytesReference.bytes(builder); + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResult.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResult.java new file mode 100644 index 0000000000000..7aa3ea1684309 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResult.java @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.common.ParseField; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.common.xcontent.ToXContentObject; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class FillMaskResult implements InferenceResults { + + public static class Result implements ToXContentObject, Writeable { + + private static final ParseField TOKEN = new ParseField("token"); + private static final ParseField SCORE = new ParseField("score"); + private static final ParseField SEQUENCE = new ParseField("sequence"); + + private final String token; + private final double score; + private final String sequence; + + public Result(String token, double score, String sequence) { + this.token = Objects.requireNonNull(token); + this.score = score; + this.sequence = Objects.requireNonNull(sequence); + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject(); + builder.field(TOKEN.getPreferredName(), token); + builder.field(SCORE.getPreferredName(), score); + builder.field(SEQUENCE.getPreferredName(), sequence); + builder.endObject(); + return builder; + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + out.writeString(token); + out.writeDouble(score); + out.writeString(sequence); + } + } + + private static final String NAME = "fill_mask_result"; + + private final List<Result> results; + + public FillMaskResult(List<Result> results) { + this.results = results; + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startArray(); + for (Result result : results) { + result.toXContent(builder, params); + } + builder.endArray(); + return builder; + } + + @Override + public String getWriteableName() { + return NAME; + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + out.writeList(results); + } + + @Override + public Map<String, Object> asMap() { + return null; + } + + @Override + public Object predictedValue() { + return null; + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResultProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResultProcessor.java new file mode 100644 index 0000000000000..17f03730c1f28 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResultProcessor.java @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; +import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; +import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +class FillMaskResultProcessor implements NlpPipeline.ResultProcessor { + + private final BertTokenizer.TokenizationResult tokenization; + + FillMaskResultProcessor(BertTokenizer.TokenizationResult tokenization) { + this.tokenization = Objects.requireNonNull(tokenization); + } + + @Override + public InferenceResults processResult(PyTorchResult pyTorchResult) { + if (tokenization.getTokens().isEmpty()) { + return new FillMaskResult(Collections.emptyList()); + } + List<String> maskTokens = tokenization.getTokens().stream() + .filter(t -> BertTokenizer.MASK_TOKEN.equals(t)) + .collect(Collectors.toList()); + if (maskTokens.isEmpty()) { + throw new IllegalArgumentException("no [MASK] token could be found"); + } + if (maskTokens.size() > 1) { + throw new IllegalArgumentException("only one [MASK] token should exist in the input"); + } + int maskTokenIndex = tokenization.getTokens().indexOf(BertTokenizer.MASK_TOKEN); + double[][] normalizedScores = NlpHelpers.convertToProbabilitesBySoftMax(pyTorchResult.getInferenceResult()); + int predictionTokenId = NlpHelpers.argmax(normalizedScores[maskTokenIndex]); + String predictedToken = tokenization.getFromVocab(predictionTokenId); + double score = normalizedScores[maskTokenIndex][predictionTokenId]; + String sequence = tokenization.getInput().replace(BertTokenizer.MASK_TOKEN, predictedToken); + FillMaskResult.Result result = new FillMaskResult.Result(predictedToken, score, sequence); + return new FillMaskResult(Collections.singletonList(result)); + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java index 1b68b1c1d76ad..d953d269f686c 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java @@ -7,7 +7,6 @@ package org.elasticsearch.xpack.ml.inference.pipelines.nlp; -import org.elasticsearch.search.aggregations.pipeline.MovingFunctions; import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; @@ -39,30 +38,12 @@ public InferenceResults processResult(PyTorchResult pyTorchResult) { // and -5 for "astic". Averaging after softmax would produce a prediction // of maybe (1 + 0) / 2 = 0.5 while before softmax it'd be exp(10 - 5) / normalization // which could easily be close to 1. - double[][] normalizedScores = convertToProbabilitesBySoftMax(pyTorchResult.getInferenceResult()); + double[][] normalizedScores = NlpHelpers.convertToProbabilitesBySoftMax(pyTorchResult.getInferenceResult()); List<TaggedToken> taggedTokens = tagTokens(normalizedScores); List<EntityGroup> entities = groupTaggedTokens(taggedTokens); return new NerResult(entities); } - static double[][] convertToProbabilitesBySoftMax(double[][] scores) { - double[][] probabilities = new double[scores.length][scores[0].length]; - double[] sum = new double[scores.length]; - for (int i = 0; i < scores.length; i++) { - double maxScore = MovingFunctions.max(scores[i]); - for (int j = 0; j < scores[i].length; j++) { - probabilities[i][j] = Math.exp(scores[i][j] - maxScore); - sum[i] += probabilities[i][j]; - } - } - for (int i = 0; i < scores.length; i++) { - for (int j = 0; j < scores[i].length; j++) { - probabilities[i][j] /= sum[i]; - } - } - return probabilities; - } - /** * Here we tag each token with the IoB label that has the max score. * Additionally, we merge sub-tokens that are part of the same word @@ -98,7 +79,7 @@ private List<TaggedToken> tagTokens(double[][] scores) { for (int i = 0; i < avgScores.length; i++) { avgScores[i] /= endTokenIndex - startTokenIndex + 1; } - int maxScoreIndex = argmax(avgScores); + int maxScoreIndex = NlpHelpers.argmax(avgScores); double score = avgScores[maxScoreIndex]; taggedTokens.add(new TaggedToken(word.toString(), IobTag.values()[maxScoreIndex], score)); startTokenIndex = endTokenIndex + 1; @@ -149,16 +130,6 @@ private List<EntityGroup> groupTaggedTokens(List<TaggedToken> tokens) { return entities; } - private static int argmax(double[] arr) { - int maxIndex = 0; - for (int i = 1; i < arr.length; i++) { - if (arr[i] > arr[maxIndex]) { - maxIndex = i; - } - } - return maxIndex; - } - private static class TaggedToken { private final String word; private final IobTag tag; diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpers.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpers.java new file mode 100644 index 0000000000000..be0eb11b8ae60 --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpers.java @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.search.aggregations.pipeline.MovingFunctions; + +public final class NlpHelpers { + + private NlpHelpers() {} + + static double[][] convertToProbabilitesBySoftMax(double[][] scores) { + double[][] probabilities = new double[scores.length][]; + double[] sum = new double[scores.length]; + for (int i = 0; i < scores.length; i++) { + probabilities[i] = new double[scores[i].length]; + double maxScore = MovingFunctions.max(scores[i]); + for (int j = 0; j < scores[i].length; j++) { + probabilities[i][j] = Math.exp(scores[i][j] - maxScore); + sum[i] += probabilities[i][j]; + } + } + for (int i = 0; i < scores.length; i++) { + for (int j = 0; j < scores[i].length; j++) { + probabilities[i][j] /= sum[i]; + } + } + return probabilities; + } + + static int argmax(double[] arr) { + int maxIndex = 0; + for (int i = 1; i < arr.length; i++) { + if (arr[i] > arr[maxIndex]) { + maxIndex = i; + } + } + return maxIndex; + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java index 78321df8c4526..f1abc45e400d7 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java @@ -18,6 +18,11 @@ public enum TaskType { public NlpPipeline.Processor createProcessor(BertTokenizer tokenizer) throws IOException { return new NerProcessor(tokenizer); } + }, + FILL_MASK { + public NlpPipeline.Processor createProcessor(BertTokenizer tokenizer) throws IOException { + return new FillMaskProcessor(tokenizer); + } }; public NlpPipeline.Processor createProcessor(BertTokenizer tokenizer) throws IOException { diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java index 4eb43dcdab2c5..31d129cf4d20b 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java @@ -6,8 +6,12 @@ */ package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; +import org.elasticsearch.common.util.set.Sets; + import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.SortedMap; @@ -33,24 +37,31 @@ public class BertTokenizer { public static final int DEFAULT_MAX_INPUT_CHARS_PER_WORD = 100; + private final Set<String> NEVER_SPLIT = new HashSet<>(Arrays.asList(MASK_TOKEN)); + private final WordPieceTokenizer wordPieceTokenizer; + private final List<String> originalVocab; + // TODO Not sure this needs to be a sorted map private final SortedMap<String, Integer> vocab; private final boolean doLowerCase; private final boolean doTokenizeCjKChars; private final boolean doStripAccents; private final Set<String> neverSplit; - private BertTokenizer(SortedMap<String, Integer> vocab, + private BertTokenizer( + List<String> originalVocab, + SortedMap<String, Integer> vocab, boolean doLowerCase, boolean doTokenizeCjKChars, boolean doStripAccents, Set<String> neverSplit) { wordPieceTokenizer = new WordPieceTokenizer(vocab, UNKNOWN_TOKEN, DEFAULT_MAX_INPUT_CHARS_PER_WORD); + this.originalVocab = originalVocab; this.vocab = vocab; this.doLowerCase = doLowerCase; this.doTokenizeCjKChars = doTokenizeCjKChars; this.doStripAccents = doStripAccents; - this.neverSplit = neverSplit; + this.neverSplit = Sets.union(neverSplit, NEVER_SPLIT); } public TokenizationResult tokenize(String text) { @@ -117,22 +128,31 @@ public TokenizationResult tokenize(String text, boolean withSpecialTokens) { tokenMap[i] = SPECIAL_TOKEN_POSITION; } - return new TokenizationResult(tokens, tokenIds, tokenMap); + return new TokenizationResult(text, originalVocab, tokens, tokenIds, tokenMap); } public static class TokenizationResult { + + String input; + List<String> vocab; private final List<String> tokens; private final int [] tokenIds; private final int [] tokenMap; - public TokenizationResult(List<String> tokens, int[] tokenIds, int[] tokenMap) { + public TokenizationResult(String input, List<String> vocab, List<String> tokens, int[] tokenIds, int[] tokenMap) { assert tokens.size() == tokenIds.length; assert tokenIds.length == tokenMap.length; + this.input = input; + this.vocab = vocab; this.tokens = tokens; this.tokenIds = tokenIds; this.tokenMap = tokenMap; } + public String getFromVocab(int tokenId) { + return vocab.get(tokenId); + } + /** * The token strings from the tokenization process * @return A list of tokens @@ -158,6 +178,10 @@ public int[] getTokenIds() { public int[] getTokenMap() { return tokenMap; } + + public String getInput() { + return input; + } } public static Builder builder(List<String> vocab) { @@ -166,6 +190,7 @@ public static Builder builder(List<String> vocab) { public static class Builder { + private final List<String> originalVocab; private final SortedMap<String, Integer> vocab; private boolean doLowerCase = false; private boolean doTokenizeCjKChars = true; @@ -173,6 +198,7 @@ public static class Builder { private Set<String> neverSplit; private Builder(List<String> vocab) { + this.originalVocab = vocab; this.vocab = buildSortedVocab(vocab); } @@ -214,7 +240,7 @@ public BertTokenizer build() { neverSplit = Collections.emptySet(); } - return new BertTokenizer(vocab, doLowerCase, doTokenizeCjKChars, doStripAccents, neverSplit); + return new BertTokenizer(originalVocab, vocab, doLowerCase, doTokenizeCjKChars, doStripAccents, neverSplit); } } } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java index 6c04b50327501..b824cbf962e26 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java @@ -7,7 +7,6 @@ package org.elasticsearch.xpack.ml.inference.pipelines.nlp; -import org.elasticsearch.search.aggregations.pipeline.MovingFunctions; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; @@ -17,17 +16,14 @@ import java.util.Collections; import java.util.List; -import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.lessThanOrEqualTo; public class NerResultProcessorTests extends ESTestCase { public void testProcessResults_GivenNoTokens() { - NerResultProcessor processor = new NerResultProcessor(new TokenizationResult(Collections.emptyList(), new int[0], new int[0])); + NerResultProcessor processor = createProcessor(Collections.emptyList(), ""); NerResult result = (NerResult) processor.processResult(new PyTorchResult("test", null, null)); assertThat(result.getEntityGroups(), is(empty())); } @@ -53,47 +49,6 @@ public void testProcessResults() { assertThat(result.getEntityGroups().get(1).getLabel(), equalTo(NerProcessor.Entity.LOCATION)); } - public void testConvertToProbabilitiesBySoftMax_GivenConcreteExample() { - double[][] scores = { - { 0.1, 0.2, 3}, - { 6, 0.2, 0.1} - }; - - double[][] probabilities = NerResultProcessor.convertToProbabilitesBySoftMax(scores); - - assertThat(probabilities[0][0], closeTo(0.04931133, 0.00000001)); - assertThat(probabilities[0][1], closeTo(0.05449744, 0.00000001)); - assertThat(probabilities[0][2], closeTo(0.89619123, 0.00000001)); - assertThat(probabilities[1][0], closeTo(0.99426607, 0.00000001)); - assertThat(probabilities[1][1], closeTo(0.00301019, 0.00000001)); - assertThat(probabilities[1][2], closeTo(0.00272374, 0.00000001)); - } - - public void testConvertToProbabilitiesBySoftMax_GivenRandom() { - double[][] scores = new double[100][100]; - for (int i = 0; i < scores.length; i++) { - for (int j = 0; j < scores[i].length; j++) { - scores[i][j] = randomDoubleBetween(-10, 10, true); - } - } - - double[][] probabilities = NerResultProcessor.convertToProbabilitesBySoftMax(scores); - - // Assert invariants that - // 1. each row sums to 1 - // 2. all values are in [0-1] - assertThat(probabilities.length, equalTo(scores.length)); - for (int i = 0; i < probabilities.length; i++) { - assertThat(probabilities[i].length, equalTo(scores[i].length)); - double rowSum = MovingFunctions.sum(probabilities[i]); - assertThat(rowSum, closeTo(1.0, 0.01)); - for (int j = 0; j < probabilities[i].length; j++) { - assertThat(probabilities[i][j], greaterThanOrEqualTo(0.0)); - assertThat(probabilities[i][j], lessThanOrEqualTo(1.0)); - } - } - } - private static NerResultProcessor createProcessor(List<String> vocab, String input){ BertTokenizer tokenizer = BertTokenizer.builder(vocab) .setDoLowerCase(true) diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpersTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpersTests.java new file mode 100644 index 0000000000000..65d60e4ac0c37 --- /dev/null +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpersTests.java @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.pipelines.nlp; + +import org.elasticsearch.search.aggregations.pipeline.MovingFunctions; +import org.elasticsearch.test.ESTestCase; + +import static org.hamcrest.Matchers.closeTo; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.lessThanOrEqualTo; + +public class NlpHelpersTests extends ESTestCase { + + public void testConvertToProbabilitiesBySoftMax_GivenConcreteExample() { + double[][] scores = { + { 0.1, 0.2, 3}, + { 6, 0.2, 0.1} + }; + + double[][] probabilities = NlpHelpers.convertToProbabilitesBySoftMax(scores); + + assertThat(probabilities[0][0], closeTo(0.04931133, 0.00000001)); + assertThat(probabilities[0][1], closeTo(0.05449744, 0.00000001)); + assertThat(probabilities[0][2], closeTo(0.89619123, 0.00000001)); + assertThat(probabilities[1][0], closeTo(0.99426607, 0.00000001)); + assertThat(probabilities[1][1], closeTo(0.00301019, 0.00000001)); + assertThat(probabilities[1][2], closeTo(0.00272374, 0.00000001)); + } + + public void testConvertToProbabilitiesBySoftMax_GivenRandom() { + double[][] scores = new double[100][100]; + for (int i = 0; i < scores.length; i++) { + for (int j = 0; j < scores[i].length; j++) { + scores[i][j] = randomDoubleBetween(-10, 10, true); + } + } + + double[][] probabilities = NlpHelpers.convertToProbabilitesBySoftMax(scores); + + // Assert invariants that + // 1. each row sums to 1 + // 2. all values are in [0-1] + assertThat(probabilities.length, equalTo(scores.length)); + for (int i = 0; i < probabilities.length; i++) { + assertThat(probabilities[i].length, equalTo(scores[i].length)); + double rowSum = MovingFunctions.sum(probabilities[i]); + assertThat(rowSum, closeTo(1.0, 0.01)); + for (int j = 0; j < probabilities[i].length; j++) { + assertThat(probabilities[i][j], greaterThanOrEqualTo(0.0)); + assertThat(probabilities[i][j], lessThanOrEqualTo(1.0)); + } + } + } +} From 5edff630088159350fda6688a5d9bd67b0814098 Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Tue, 25 May 2021 15:24:11 +0100 Subject: [PATCH 09/21] Move results into core and add tests --- .../MlInferenceNamedXContentProvider.java | 4 + .../inference/results/FillMaskResults.java} | 146 +++++++++++++----- .../core/ml/inference/results/NerResults.java | 123 ++++++++++++++- .../results/FillMaskResultsTests.java | 50 ++++++ .../ml/inference/results/NerResultsTests.java | 50 ++++++ .../inference/pipelines/nlp/EntityGroup.java | 63 -------- .../nlp/FillMaskResultProcessor.java | 7 +- .../ml/inference/pipelines/nlp/NerResult.java | 64 -------- .../pipelines/nlp/NerResultProcessor.java | 14 +- .../nlp/NerResultProcessorTests.java | 9 +- 10 files changed, 346 insertions(+), 184 deletions(-) rename x-pack/plugin/{ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResult.java => core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResults.java} (51%) create mode 100644 x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResultsTests.java create mode 100644 x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/NerResultsTests.java delete mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/EntityGroup.java delete mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResult.java diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/MlInferenceNamedXContentProvider.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/MlInferenceNamedXContentProvider.java index 13f183ccb39ce..2eb91e140ba0e 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/MlInferenceNamedXContentProvider.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/MlInferenceNamedXContentProvider.java @@ -19,6 +19,7 @@ import org.elasticsearch.xpack.core.ml.inference.preprocessing.StrictlyParsedPreProcessor; import org.elasticsearch.xpack.core.ml.inference.preprocessing.TargetMeanEncoding; import org.elasticsearch.xpack.core.ml.inference.results.ClassificationInferenceResults; +import org.elasticsearch.xpack.core.ml.inference.results.FillMaskResults; import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; import org.elasticsearch.xpack.core.ml.inference.results.NerResults; import org.elasticsearch.xpack.core.ml.inference.results.RegressionInferenceResults; @@ -219,6 +220,9 @@ public List<NamedWriteableRegistry.Entry> getNamedWriteables() { namedWriteables.add(new NamedWriteableRegistry.Entry(InferenceResults.class, NerResults.NAME, NerResults::new)); + namedWriteables.add(new NamedWriteableRegistry.Entry(InferenceResults.class, + FillMaskResults.NAME, + FillMaskResults::new)); // Inference Configs namedWriteables.add(new NamedWriteableRegistry.Entry(InferenceConfig.class, diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResult.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResults.java similarity index 51% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResult.java rename to x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResults.java index 7aa3ea1684309..b7dd6074d9293 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResult.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResults.java @@ -5,21 +5,88 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.core.ml.inference.results; import org.elasticsearch.common.ParseField; +import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; import java.io.IOException; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; -public class FillMaskResult implements InferenceResults { +public class FillMaskResults implements InferenceResults { + + public static final String NAME = "fill_mask_result"; + public static final String DEFAULT_RESULTS_FIELD = "results"; + + private final List<Result> results; + + public FillMaskResults(List<Result> results) { + this.results = results; + } + + public FillMaskResults(StreamInput in) throws IOException { + this.results = in.readList(Result::new); + } + + public List<Result> getResults() { + return results; + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startArray(); + for (Result result : results) { + result.toXContent(builder, params); + } + builder.endArray(); + return builder; + } + + @Override + public String getWriteableName() { + return NAME; + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + out.writeList(results); + } + + @Override + public Map<String, Object> asMap() { + Map<String, Object> map = new LinkedHashMap<>(); + map.put(DEFAULT_RESULTS_FIELD, results.stream().map(Result::toMap).collect(Collectors.toList())); + return map; + } + + @Override + public Object predictedValue() { + if (results.isEmpty()) { + return null; + } + return results.get(0).token; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FillMaskResults that = (FillMaskResults) o; + return Objects.equals(results, that.results); + } + + @Override + public int hashCode() { + return Objects.hash(results); + } public static class Result implements ToXContentObject, Writeable { @@ -37,6 +104,32 @@ public Result(String token, double score, String sequence) { this.sequence = Objects.requireNonNull(sequence); } + public Result(StreamInput in) throws IOException { + token = in.readString(); + score = in.readDouble(); + sequence = in.readString(); + } + + public double getScore() { + return score; + } + + public String getSequence() { + return sequence; + } + + public String getToken() { + return token; + } + + public Map<String, Object> toMap() { + Map<String, Object> map = new LinkedHashMap<>(); + map.put(TOKEN.getPreferredName(), token); + map.put(SCORE.getPreferredName(), score); + map.put(SEQUENCE.getPreferredName(), sequence); + return map; + } + @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); @@ -53,43 +146,20 @@ public void writeTo(StreamOutput out) throws IOException { out.writeDouble(score); out.writeString(sequence); } - } - private static final String NAME = "fill_mask_result"; - - private final List<Result> results; - - public FillMaskResult(List<Result> results) { - this.results = results; - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.startArray(); - for (Result result : results) { - result.toXContent(builder, params); + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Result result = (Result) o; + return Double.compare(result.score, score) == 0 && + Objects.equals(token, result.token) && + Objects.equals(sequence, result.sequence); } - builder.endArray(); - return builder; - } - - @Override - public String getWriteableName() { - return NAME; - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - out.writeList(results); - } - @Override - public Map<String, Object> asMap() { - return null; - } - - @Override - public Object predictedValue() { - return null; + @Override + public int hashCode() { + return Objects.hash(token, score, sequence); + } } } diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/NerResults.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/NerResults.java index 47a2f421f76f1..7ba274995f64e 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/NerResults.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/NerResults.java @@ -7,23 +7,41 @@ package org.elasticsearch.xpack.core.ml.inference.results; +import org.elasticsearch.common.ParseField; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; public class NerResults implements InferenceResults { public static final String NAME = "ner_result"; - public NerResults(StreamInput in) throws IOException { + private final List<EntityGroup> entityGroups; + + public NerResults(List<EntityGroup> entityGroups) { + this.entityGroups = Objects.requireNonNull(entityGroups); + } + public NerResults(StreamInput in) throws IOException { + entityGroups = in.readList(EntityGroup::new); } @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startArray(); + for (EntityGroup entity : entityGroups) { + entity.toXContent(builder, params); + } + builder.endArray(); return builder; } @@ -34,18 +52,111 @@ public String getWriteableName() { @Override public void writeTo(StreamOutput out) throws IOException { - + out.writeList(entityGroups); } @Override public Map<String, Object> asMap() { - // TODO required for Ingest Pipelines - return null; + Map<String, Object> map = new LinkedHashMap<>(); + map.put(FillMaskResults.DEFAULT_RESULTS_FIELD, entityGroups.stream().map(EntityGroup::toMap).collect(Collectors.toList())); + return map; } @Override public Object predictedValue() { - // TODO required for Ingest Pipelines - return null; + // Used by the inference aggregation + throw new UnsupportedOperationException("Named Entity Recognition does not support a single predicted value"); + } + + public List<EntityGroup> getEntityGroups() { + return entityGroups; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + NerResults that = (NerResults) o; + return Objects.equals(entityGroups, that.entityGroups); + } + + @Override + public int hashCode() { + return Objects.hash(entityGroups); + } + + public static class EntityGroup implements ToXContentObject, Writeable { + + private static final ParseField LABEL = new ParseField("label"); + private static final ParseField SCORE = new ParseField("score"); + private static final ParseField WORD = new ParseField("word"); + + private final String label; + private final double score; + private final String word; + + public EntityGroup(String label, double score, String word) { + this.label = Objects.requireNonNull(label); + this.score = score; + this.word = Objects.requireNonNull(word); + } + + public EntityGroup(StreamInput in) throws IOException { + label = in.readString(); + score = in.readDouble(); + word = in.readString(); + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject(); + builder.field(LABEL.getPreferredName(), label); + builder.field(SCORE.getPreferredName(), score); + builder.field(WORD.getPreferredName(), word); + builder.endObject(); + return builder; + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + out.writeString(label); + out.writeDouble(score); + out.writeString(word); + } + + public Map<String, Object> toMap() { + Map<String, Object> map = new LinkedHashMap<>(); + map.put(LABEL.getPreferredName(), label); + map.put(SCORE.getPreferredName(), score); + map.put(WORD.getPreferredName(), word); + return map; + } + + public String getLabel() { + return label; + } + + public double getScore() { + return score; + } + + public String getWord() { + return word; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + EntityGroup that = (EntityGroup) o; + return Double.compare(that.score, score) == 0 && + Objects.equals(label, that.label) && + Objects.equals(word, that.word); + } + + @Override + public int hashCode() { + return Objects.hash(label, score, word); + } } } diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResultsTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResultsTests.java new file mode 100644 index 0000000000000..f353fe8336abf --- /dev/null +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResultsTests.java @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.core.ml.inference.results; + +import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.test.AbstractWireSerializingTestCase; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasSize; + +public class FillMaskResultsTests extends AbstractWireSerializingTestCase<FillMaskResults> { + @Override + protected Writeable.Reader<FillMaskResults> instanceReader() { + return FillMaskResults::new; + } + + @Override + protected FillMaskResults createTestInstance() { + int numResults = randomIntBetween(0, 3); + List<FillMaskResults.Result> resultList = new ArrayList<>(); + for (int i=0; i<numResults; i++) { + resultList.add(new FillMaskResults.Result(randomAlphaOfLength(4), randomDouble(), randomAlphaOfLength(4))); + } + return new FillMaskResults(resultList); + } + + @SuppressWarnings("unchecked") + public void testAsMap() { + FillMaskResults testInstance = createTestInstance(); + Map<String, Object> asMap = testInstance.asMap(); + List<Map<String, Object>> resultList = (List<Map<String, Object>>)asMap.get("results"); + assertThat(resultList, hasSize(testInstance.getResults().size())); + for (int i=0; i<testInstance.getResults().size(); i++) { + FillMaskResults.Result result = testInstance.getResults().get(i); + Map<String, Object> map = resultList.get(i); + assertThat(map.get("score"), equalTo(result.getScore())); + assertThat(map.get("token"), equalTo(result.getToken())); + assertThat(map.get("sequence"), equalTo(result.getSequence())); + } + } +} diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/NerResultsTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/NerResultsTests.java new file mode 100644 index 0000000000000..e2764583c53b6 --- /dev/null +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/NerResultsTests.java @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.core.ml.inference.results; + +import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.test.AbstractWireSerializingTestCase; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasSize; + +public class NerResultsTests extends AbstractWireSerializingTestCase<NerResults> { + @Override + protected Writeable.Reader<NerResults> instanceReader() { + return NerResults::new; + } + + @Override + protected NerResults createTestInstance() { + int numEntities = randomIntBetween(0, 3); + List<NerResults.EntityGroup> entityGroups = new ArrayList<>(); + for (int i=0; i<numEntities; i++) { + entityGroups.add(new NerResults.EntityGroup(randomFrom("foo", "bar"), randomDouble(), randomAlphaOfLength(4))); + } + return new NerResults(entityGroups); + } + + @SuppressWarnings("unchecked") + public void testAsMap() { + NerResults testInstance = createTestInstance(); + Map<String, Object> asMap = testInstance.asMap(); + List<Map<String, Object>> resultList = (List<Map<String, Object>>)asMap.get("results"); + assertThat(resultList, hasSize(testInstance.getEntityGroups().size())); + for (int i=0; i<testInstance.getEntityGroups().size(); i++) { + NerResults.EntityGroup entity = testInstance.getEntityGroups().get(i); + Map<String, Object> map = resultList.get(i); + assertThat(map.get("label"), equalTo(entity.getLabel())); + assertThat(map.get("score"), equalTo(entity.getScore())); + assertThat(map.get("word"), equalTo(entity.getWord())); + } + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/EntityGroup.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/EntityGroup.java deleted file mode 100644 index d2098bca41a61..0000000000000 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/EntityGroup.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; - -import org.elasticsearch.common.ParseField; -import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.common.xcontent.ToXContentObject; -import org.elasticsearch.common.xcontent.XContentBuilder; - -import java.io.IOException; -import java.util.Objects; - -public class EntityGroup implements ToXContentObject, Writeable { - - private static final ParseField LABEL = new ParseField("label"); - private static final ParseField SCORE = new ParseField("score"); - private static final ParseField WORD = new ParseField("word"); - - private final NerProcessor.Entity label; - private final double score; - private final String word; - - public EntityGroup(NerProcessor.Entity label, double score, String word) { - this.label = label; - this.score = score; - this.word = Objects.requireNonNull(word); - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.startObject(); - builder.field(LABEL.getPreferredName(), label); - builder.field(SCORE.getPreferredName(), score); - builder.field(WORD.getPreferredName(), word); - builder.endObject(); - return builder; - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - label.writeTo(out); - out.writeDouble(score); - out.writeString(word); - } - - public NerProcessor.Entity getLabel() { - return label; - } - - public double getScore() { - return score; - } - - public String getWord() { - return word; - } -} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResultProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResultProcessor.java index 17f03730c1f28..eed9e92b2c551 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResultProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResultProcessor.java @@ -8,6 +8,7 @@ package org.elasticsearch.xpack.ml.inference.pipelines.nlp; import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; +import org.elasticsearch.xpack.core.ml.inference.results.FillMaskResults; import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; @@ -27,7 +28,7 @@ class FillMaskResultProcessor implements NlpPipeline.ResultProcessor { @Override public InferenceResults processResult(PyTorchResult pyTorchResult) { if (tokenization.getTokens().isEmpty()) { - return new FillMaskResult(Collections.emptyList()); + return new FillMaskResults(Collections.emptyList()); } List<String> maskTokens = tokenization.getTokens().stream() .filter(t -> BertTokenizer.MASK_TOKEN.equals(t)) @@ -44,7 +45,7 @@ public InferenceResults processResult(PyTorchResult pyTorchResult) { String predictedToken = tokenization.getFromVocab(predictionTokenId); double score = normalizedScores[maskTokenIndex][predictionTokenId]; String sequence = tokenization.getInput().replace(BertTokenizer.MASK_TOKEN, predictedToken); - FillMaskResult.Result result = new FillMaskResult.Result(predictedToken, score, sequence); - return new FillMaskResult(Collections.singletonList(result)); + FillMaskResults.Result result = new FillMaskResults.Result(predictedToken, score, sequence); + return new FillMaskResults(Collections.singletonList(result)); } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResult.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResult.java deleted file mode 100644 index 264f70fc1c08e..0000000000000 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResult.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; - -import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; - -import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -public class NerResult implements InferenceResults { - - public String NAME = "ner_result"; - - private final List<EntityGroup> entityGroups; - - public NerResult(List<EntityGroup> entityGroups) { - this.entityGroups = Objects.requireNonNull(entityGroups); - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.startArray(); - for (EntityGroup entity : entityGroups) { - entity.toXContent(builder, params); - } - builder.endArray(); - return builder; - } - - @Override - public String getWriteableName() { - return NAME; - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - out.writeList(entityGroups); - } - - @Override - public Map<String, Object> asMap() { - // TODO required for Ingest Pipelines - return null; - } - - @Override - public Object predictedValue() { - // TODO required for Ingest Pipelines - return null; - } - - List<EntityGroup> getEntityGroups() { - return entityGroups; - } -} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java index d953d269f686c..2db38f900bb9b 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java @@ -9,6 +9,7 @@ import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; +import org.elasticsearch.xpack.core.ml.inference.results.NerResults; import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; import java.util.ArrayList; @@ -30,7 +31,7 @@ class NerResultProcessor implements NlpPipeline.ResultProcessor { @Override public InferenceResults processResult(PyTorchResult pyTorchResult) { if (tokenization.getTokens().isEmpty()) { - return new NerResult(Collections.emptyList()); + return new NerResults(Collections.emptyList()); } // TODO It might be best to do the soft max after averaging scores for // sub-tokens. If we had a word that is "elastic" which is tokenized to @@ -40,8 +41,8 @@ public InferenceResults processResult(PyTorchResult pyTorchResult) { // which could easily be close to 1. double[][] normalizedScores = NlpHelpers.convertToProbabilitesBySoftMax(pyTorchResult.getInferenceResult()); List<TaggedToken> taggedTokens = tagTokens(normalizedScores); - List<EntityGroup> entities = groupTaggedTokens(taggedTokens); - return new NerResult(entities); + List<NerResults.EntityGroup> entities = groupTaggedTokens(taggedTokens); + return new NerResults(entities); } /** @@ -96,11 +97,11 @@ private List<TaggedToken> tagTokens(double[][] scores) { * When multiple tokens are grouped together, the entity score is the * mean score of the tokens. */ - private List<EntityGroup> groupTaggedTokens(List<TaggedToken> tokens) { + private List<NerResults.EntityGroup> groupTaggedTokens(List<TaggedToken> tokens) { if (tokens.isEmpty()) { return Collections.emptyList(); } - List<EntityGroup> entities = new ArrayList<>(); + List<NerResults.EntityGroup> entities = new ArrayList<>(); int startTokenIndex = 0; while (startTokenIndex < tokens.size()) { TaggedToken token = tokens.get(startTokenIndex); @@ -123,7 +124,8 @@ private List<EntityGroup> groupTaggedTokens(List<TaggedToken> tokens) { scoreSum += endToken.score; endTokenIndex++; } - entities.add(new EntityGroup(token.tag.getEntity(), scoreSum / (endTokenIndex - startTokenIndex), entityWord.toString())); + entities.add(new NerResults.EntityGroup(token.tag.getEntity().toString(), + scoreSum / (endTokenIndex - startTokenIndex), entityWord.toString())); startTokenIndex = endTokenIndex; } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java index b824cbf962e26..371d078fbe479 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java @@ -9,6 +9,7 @@ import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; +import org.elasticsearch.xpack.core.ml.inference.results.NerResults; import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer.TokenizationResult; @@ -24,7 +25,7 @@ public class NerResultProcessorTests extends ESTestCase { public void testProcessResults_GivenNoTokens() { NerResultProcessor processor = createProcessor(Collections.emptyList(), ""); - NerResult result = (NerResult) processor.processResult(new PyTorchResult("test", null, null)); + NerResults result = (NerResults) processor.processResult(new PyTorchResult("test", null, null)); assertThat(result.getEntityGroups(), is(empty())); } @@ -40,13 +41,13 @@ public void testProcessResults() { { 0, 0, 0, 0, 0, 0, 0, 0, 0}, // in { 0, 0, 0, 0, 0, 0, 0, 6, 0} // london }; - NerResult result = (NerResult) processor.processResult(new PyTorchResult("1", scores, null)); + NerResults result = (NerResults) processor.processResult(new PyTorchResult("1", scores, null)); assertThat(result.getEntityGroups().size(), equalTo(2)); assertThat(result.getEntityGroups().get(0).getWord(), equalTo("elasticsearch")); - assertThat(result.getEntityGroups().get(0).getLabel(), equalTo(NerProcessor.Entity.ORGANISATION)); + assertThat(result.getEntityGroups().get(0).getLabel(), equalTo(NerProcessor.Entity.ORGANISATION.toString())); assertThat(result.getEntityGroups().get(1).getWord(), equalTo("london")); - assertThat(result.getEntityGroups().get(1).getLabel(), equalTo(NerProcessor.Entity.LOCATION)); + assertThat(result.getEntityGroups().get(1).getLabel(), equalTo(NerProcessor.Entity.LOCATION.toString())); } private static NerResultProcessor createProcessor(List<String> vocab, String input){ From b76f14e23702a83ed23e73130a2a8c888ec48b4b Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Tue, 25 May 2021 16:45:48 +0100 Subject: [PATCH 10/21] Drop Pipeline terminology --- .../nlp/FillMaskProcessor.java | 10 +++---- .../nlp/FillMaskResultProcessor.java | 6 ++--- .../{pipelines => }/nlp/NerProcessor.java | 10 +++---- .../nlp/NerResultProcessor.java | 16 +++++------- .../{pipelines => }/nlp/NlpHelpers.java | 2 +- .../nlp/NlpPipeline.java => nlp/NlpTask.java} | 12 ++++----- .../TaskConfig.java} | 26 +++++++++---------- .../{pipelines => }/nlp/TaskType.java | 10 +++---- .../nlp/tokenizers/BasicTokenizer.java | 2 +- .../nlp/tokenizers/BertTokenizer.java | 2 +- .../nlp/tokenizers/WordPieceTokenizer.java | 2 +- .../nlp/tokenizers/WordPieceVocabulary.java | 2 +- .../nlp/NerProcessorTests.java | 2 +- .../nlp/NerResultProcessorTests.java | 7 +++-- .../{pipelines => }/nlp/NlpHelpersTests.java | 2 +- .../{pipelines => }/nlp/TaskTypeTests.java | 2 +- .../nlp/tokenizers/BasicTokenizerTests.java | 2 +- .../nlp/tokenizers/BertTokenizerTests.java | 2 +- .../tokenizers/WordPieceTokenizerTests.java | 2 +- 19 files changed, 58 insertions(+), 61 deletions(-) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/FillMaskProcessor.java (85%) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/FillMaskResultProcessor.java (91%) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/NerProcessor.java (91%) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/NerResultProcessor.java (92%) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/NlpHelpers.java (95%) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{pipelines/nlp/NlpPipeline.java => nlp/NlpTask.java} (79%) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{pipelines/nlp/PipelineConfig.java => nlp/TaskConfig.java} (76%) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/TaskType.java (68%) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/tokenizers/BasicTokenizer.java (99%) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/tokenizers/BertTokenizer.java (99%) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/tokenizers/WordPieceTokenizer.java (98%) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/tokenizers/WordPieceVocabulary.java (97%) rename x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/NerProcessorTests.java (93%) rename x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/NerResultProcessorTests.java (88%) rename x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/NlpHelpersTests.java (97%) rename x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/TaskTypeTests.java (85%) rename x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/tokenizers/BasicTokenizerTests.java (98%) rename x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/tokenizers/BertTokenizerTests.java (98%) rename x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/{pipelines => }/nlp/tokenizers/WordPieceTokenizerTests.java (97%) diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java similarity index 85% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskProcessor.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java index 9503d833865e4..6ff84426ff75c 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java @@ -5,17 +5,17 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.ml.inference.nlp; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; +import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; import java.io.IOException; import java.util.Arrays; -public class FillMaskProcessor extends NlpPipeline.Processor { +public class FillMaskProcessor extends NlpTask.Processor { private final BertTokenizer tokenizer; private BertTokenizer.TokenizationResult tokenization; @@ -30,12 +30,12 @@ private BytesReference buildRequest(String requestId, String input) throws IOExc } @Override - public NlpPipeline.RequestBuilder getRequestBuilder() { + public NlpTask.RequestBuilder getRequestBuilder() { return this::buildRequest; } @Override - public NlpPipeline.ResultProcessor getResultProcessor() { + public NlpTask.ResultProcessor getResultProcessor() { return new FillMaskResultProcessor(tokenization); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResultProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskResultProcessor.java similarity index 91% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResultProcessor.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskResultProcessor.java index eed9e92b2c551..6fb61da3c0336 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/FillMaskResultProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskResultProcessor.java @@ -5,19 +5,19 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.ml.inference.nlp; import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; import org.elasticsearch.xpack.core.ml.inference.results.FillMaskResults; import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; -import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; +import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -class FillMaskResultProcessor implements NlpPipeline.ResultProcessor { +class FillMaskResultProcessor implements NlpTask.ResultProcessor { private final BertTokenizer.TokenizationResult tokenization; diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessor.java similarity index 91% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessor.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessor.java index 7bf162925a106..259daa33c2c8e 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessor.java @@ -5,20 +5,20 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.ml.inference.nlp; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; +import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; import java.io.IOException; import java.util.Arrays; import java.util.Locale; -public class NerProcessor extends NlpPipeline.Processor { +public class NerProcessor extends NlpTask.Processor { public enum Entity implements Writeable { NONE, MISC, PERSON, ORGANISATION, LOCATION; @@ -75,12 +75,12 @@ private BytesReference buildRequest(String requestId, String input) throws IOExc } @Override - public NlpPipeline.RequestBuilder getRequestBuilder() { + public NlpTask.RequestBuilder getRequestBuilder() { return this::buildRequest; } @Override - public NlpPipeline.ResultProcessor getResultProcessor() { + public NlpTask.ResultProcessor getResultProcessor() { return new NerResultProcessor(tokenization); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessor.java similarity index 92% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessor.java index 2db38f900bb9b..ba7d2861af826 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessor.java @@ -5,12 +5,12 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.ml.inference.nlp; import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; import org.elasticsearch.xpack.core.ml.inference.results.NerResults; -import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; +import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; import java.util.ArrayList; import java.util.Arrays; @@ -18,9 +18,7 @@ import java.util.List; import java.util.Objects; -import static org.elasticsearch.xpack.ml.inference.pipelines.nlp.NerProcessor.IobTag; - -class NerResultProcessor implements NlpPipeline.ResultProcessor { +class NerResultProcessor implements NlpTask.ResultProcessor { private final BertTokenizer.TokenizationResult tokenization; @@ -71,7 +69,7 @@ private List<TaggedToken> tagTokens(double[][] scores) { String endTokenWord = tokenization.getTokens().get(endTokenIndex).substring(2); word.append(endTokenWord); } - double[] avgScores = Arrays.copyOf(scores[startTokenIndex], IobTag.values().length); + double[] avgScores = Arrays.copyOf(scores[startTokenIndex], NerProcessor.IobTag.values().length); for (int i = startTokenIndex + 1; i <= endTokenIndex; i++) { for (int j = 0; j < scores[i].length; j++) { avgScores[j] += scores[i][j]; @@ -82,7 +80,7 @@ private List<TaggedToken> tagTokens(double[][] scores) { } int maxScoreIndex = NlpHelpers.argmax(avgScores); double score = avgScores[maxScoreIndex]; - taggedTokens.add(new TaggedToken(word.toString(), IobTag.values()[maxScoreIndex], score)); + taggedTokens.add(new TaggedToken(word.toString(), NerProcessor.IobTag.values()[maxScoreIndex], score)); startTokenIndex = endTokenIndex + 1; } return taggedTokens; @@ -134,10 +132,10 @@ private List<NerResults.EntityGroup> groupTaggedTokens(List<TaggedToken> tokens) private static class TaggedToken { private final String word; - private final IobTag tag; + private final NerProcessor.IobTag tag; private final double score; - private TaggedToken(String word, IobTag tag, double score) { + private TaggedToken(String word, NerProcessor.IobTag tag, double score) { this.word = word; this.tag = tag; this.score = score; diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpers.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java similarity index 95% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpers.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java index be0eb11b8ae60..dcf0ec2ddb890 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpers.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java @@ -5,7 +5,7 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.ml.inference.nlp; import org.elasticsearch.search.aggregations.pipeline.MovingFunctions; diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java similarity index 79% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java index abf5146089b3f..c32a753cfcb01 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpPipeline.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java @@ -5,21 +5,21 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.ml.inference.nlp; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; -import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; +import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; import java.io.IOException; -public class NlpPipeline { +public class NlpTask { private final TaskType taskType; private final BertTokenizer tokenizer; - private NlpPipeline(TaskType taskType, BertTokenizer tokenizer) { + private NlpTask(TaskType taskType, BertTokenizer tokenizer) { this.taskType = taskType; this.tokenizer = tokenizer; } @@ -28,8 +28,8 @@ public Processor createProcessor() throws IOException { return taskType.createProcessor(tokenizer); } - public static NlpPipeline fromConfig(PipelineConfig config) { - return new NlpPipeline(config.getTaskType(), config.buildTokenizer()); + public static NlpTask fromConfig(TaskConfig config) { + return new NlpTask(config.getTaskType(), config.buildTokenizer()); } public interface RequestBuilder { diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/TaskConfig.java similarity index 76% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/TaskConfig.java index 89a8d856f0678..0157654df18f8 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/PipelineConfig.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/TaskConfig.java @@ -5,30 +5,30 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.ml.inference.nlp; import org.elasticsearch.common.ParseField; import org.elasticsearch.common.xcontent.ObjectParser; import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; +import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; import java.io.IOException; import java.util.List; import java.util.Objects; -public class PipelineConfig implements ToXContentObject { +public class TaskConfig implements ToXContentObject { public static final ParseField VOCAB = new ParseField("vocab"); public static final ParseField TASK_TYPE = new ParseField("task_type"); public static final ParseField LOWER_CASE = new ParseField("do_lower_case"); - private static final ObjectParser<PipelineConfig.Builder, Void> STRICT_PARSER = createParser(false); - private static final ObjectParser<PipelineConfig.Builder, Void> LENIENT_PARSER = createParser(true); + private static final ObjectParser<TaskConfig.Builder, Void> STRICT_PARSER = createParser(false); + private static final ObjectParser<TaskConfig.Builder, Void> LENIENT_PARSER = createParser(true); - private static ObjectParser<PipelineConfig.Builder, Void> createParser(boolean ignoreUnknownFields) { - ObjectParser<PipelineConfig.Builder, Void> parser = new ObjectParser<>("pipeline_config", + private static ObjectParser<TaskConfig.Builder, Void> createParser(boolean ignoreUnknownFields) { + ObjectParser<TaskConfig.Builder, Void> parser = new ObjectParser<>("task_config", ignoreUnknownFields, Builder::new); @@ -38,19 +38,19 @@ private static ObjectParser<PipelineConfig.Builder, Void> createParser(boolean i return parser; } - public static PipelineConfig fromXContent(XContentParser parser, boolean lenient) { + public static TaskConfig fromXContent(XContentParser parser, boolean lenient) { return lenient ? LENIENT_PARSER.apply(parser, null).build() : STRICT_PARSER.apply(parser, null).build(); } public static String documentId(String model) { - return model + "_pipeline_config"; + return model + "_task_config"; } private final TaskType taskType; private final List<String> vocabulary; private final boolean doLowerCase; - PipelineConfig(TaskType taskType, List<String> vocabulary, boolean doLowerCase) { + TaskConfig(TaskType taskType, List<String> vocabulary, boolean doLowerCase) { this.taskType = taskType; this.vocabulary = vocabulary; this.doLowerCase = doLowerCase; @@ -77,7 +77,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - PipelineConfig that = (PipelineConfig) o; + TaskConfig that = (TaskConfig) o; return taskType == that.taskType && doLowerCase == that.doLowerCase && Objects.equals(vocabulary, that.vocabulary); @@ -118,8 +118,8 @@ public Builder setDoLowerCase(boolean doLowerCase) { return this; } - public PipelineConfig build() { - return new PipelineConfig(taskType, vocabulary, doLowerCase); + public TaskConfig build() { + return new TaskConfig(taskType, vocabulary, doLowerCase); } } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/TaskType.java similarity index 68% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/TaskType.java index f1abc45e400d7..b5d5074a9ee57 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskType.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/TaskType.java @@ -5,9 +5,9 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.ml.inference.nlp; -import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; +import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; import java.io.IOException; import java.util.Locale; @@ -15,17 +15,17 @@ public enum TaskType { TOKEN_CLASSIFICATION { - public NlpPipeline.Processor createProcessor(BertTokenizer tokenizer) throws IOException { + public NlpTask.Processor createProcessor(BertTokenizer tokenizer) throws IOException { return new NerProcessor(tokenizer); } }, FILL_MASK { - public NlpPipeline.Processor createProcessor(BertTokenizer tokenizer) throws IOException { + public NlpTask.Processor createProcessor(BertTokenizer tokenizer) throws IOException { return new FillMaskProcessor(tokenizer); } }; - public NlpPipeline.Processor createProcessor(BertTokenizer tokenizer) throws IOException { + public NlpTask.Processor createProcessor(BertTokenizer tokenizer) throws IOException { throw new UnsupportedOperationException("json request must be specialised for task type [" + this.name() + "]"); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizer.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizer.java similarity index 99% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizer.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizer.java index 78d607758cd49..50d16da931258 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizer.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizer.java @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; +package org.elasticsearch.xpack.ml.inference.nlp.tokenizers; import joptsimple.internal.Strings; diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizer.java similarity index 99% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizer.java index 31d129cf4d20b..78b3839b4382f 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizer.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizer.java @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; +package org.elasticsearch.xpack.ml.inference.nlp.tokenizers; import org.elasticsearch.common.util.set.Sets; diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizer.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/WordPieceTokenizer.java similarity index 98% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizer.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/WordPieceTokenizer.java index 431b70968e770..23634d200a771 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizer.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/WordPieceTokenizer.java @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; +package org.elasticsearch.xpack.ml.inference.nlp.tokenizers; import java.util.ArrayList; import java.util.List; diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceVocabulary.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/WordPieceVocabulary.java similarity index 97% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceVocabulary.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/WordPieceVocabulary.java index 09d567ea80998..1b9acf6dc34da 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceVocabulary.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/WordPieceVocabulary.java @@ -5,7 +5,7 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; +package org.elasticsearch.xpack.ml.inference.nlp.tokenizers; import org.elasticsearch.common.ParseField; import org.elasticsearch.common.xcontent.ConstructingObjectParser; diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessorTests.java similarity index 93% rename from x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessorTests.java rename to x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessorTests.java index e8c1b0f64c092..07f1775f92e64 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerProcessorTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessorTests.java @@ -5,7 +5,7 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.ml.inference.nlp; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.test.ESTestCase; diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessorTests.java similarity index 88% rename from x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java rename to x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessorTests.java index 371d078fbe479..9856a60cc0538 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NerResultProcessorTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessorTests.java @@ -5,13 +5,12 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.ml.inference.nlp; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; import org.elasticsearch.xpack.core.ml.inference.results.NerResults; -import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer; -import org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers.BertTokenizer.TokenizationResult; +import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; import java.util.Arrays; import java.util.Collections; @@ -54,7 +53,7 @@ private static NerResultProcessor createProcessor(List<String> vocab, String inp BertTokenizer tokenizer = BertTokenizer.builder(vocab) .setDoLowerCase(true) .build(); - TokenizationResult tokenizationResult = tokenizer.tokenize(input, false); + BertTokenizer.TokenizationResult tokenizationResult = tokenizer.tokenize(input, false); return new NerResultProcessor(tokenizationResult); } } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpersTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java similarity index 97% rename from x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpersTests.java rename to x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java index 65d60e4ac0c37..8c1cc786be2ff 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/NlpHelpersTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java @@ -5,7 +5,7 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.ml.inference.nlp; import org.elasticsearch.search.aggregations.pipeline.MovingFunctions; import org.elasticsearch.test.ESTestCase; diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskTypeTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/TaskTypeTests.java similarity index 85% rename from x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskTypeTests.java rename to x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/TaskTypeTests.java index 1c048c2ee4f16..25faba9248f81 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/TaskTypeTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/TaskTypeTests.java @@ -5,7 +5,7 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp; +package org.elasticsearch.xpack.ml.inference.nlp; import org.elasticsearch.test.ESTestCase; diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizerTests.java similarity index 98% rename from x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizerTests.java rename to x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizerTests.java index 309430d082807..25310d173d3c6 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BasicTokenizerTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizerTests.java @@ -5,7 +5,7 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; +package org.elasticsearch.xpack.ml.inference.nlp.tokenizers; import org.elasticsearch.test.ESTestCase; diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java similarity index 98% rename from x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java rename to x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java index ed449fdf6a93f..8ea617edbf279 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/BertTokenizerTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java @@ -5,7 +5,7 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; +package org.elasticsearch.xpack.ml.inference.nlp.tokenizers; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.common.xcontent.DeprecationHandler; diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/WordPieceTokenizerTests.java similarity index 97% rename from x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizerTests.java rename to x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/WordPieceTokenizerTests.java index f16e32961ec9c..671ccd2e4fb27 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/pipelines/nlp/tokenizers/WordPieceTokenizerTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/WordPieceTokenizerTests.java @@ -5,7 +5,7 @@ * 2.0. */ -package org.elasticsearch.xpack.ml.inference.pipelines.nlp.tokenizers; +package org.elasticsearch.xpack.ml.inference.nlp.tokenizers; import org.elasticsearch.test.ESTestCase; From 5d2491f7a31a5d7cdca786854e920a0465619a1a Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Tue, 25 May 2021 17:00:55 +0100 Subject: [PATCH 11/21] Remove big config file --- .../core/ml/inference/pipeline_config.json | 29001 ---------------- .../nlp/tokenizers/BertTokenizerTests.java | 42 +- 2 files changed, 1 insertion(+), 29042 deletions(-) delete mode 100644 x-pack/plugin/core/src/test/resources/org/elasticsearch/xpack/core/ml/inference/pipeline_config.json diff --git a/x-pack/plugin/core/src/test/resources/org/elasticsearch/xpack/core/ml/inference/pipeline_config.json b/x-pack/plugin/core/src/test/resources/org/elasticsearch/xpack/core/ml/inference/pipeline_config.json deleted file mode 100644 index af998c799bf8a..0000000000000 --- a/x-pack/plugin/core/src/test/resources/org/elasticsearch/xpack/core/ml/inference/pipeline_config.json +++ /dev/null @@ -1,29001 +0,0 @@ -{ - "task_type": "token_classification", - "vocab": [ - "[PAD]", - "[unused1]", - "[unused2]", - "[unused3]", - "[unused4]", - "[unused5]", - "[unused6]", - "[unused7]", - "[unused8]", - "[unused9]", - "[unused10]", - "[unused11]", - "[unused12]", - "[unused13]", - "[unused14]", - "[unused15]", - "[unused16]", - "[unused17]", - "[unused18]", - "[unused19]", - "[unused20]", - "[unused21]", - "[unused22]", - "[unused23]", - "[unused24]", - "[unused25]", - "[unused26]", - "[unused27]", - "[unused28]", - "[unused29]", - "[unused30]", - "[unused31]", - "[unused32]", - "[unused33]", - "[unused34]", - "[unused35]", - "[unused36]", - "[unused37]", - "[unused38]", - "[unused39]", - "[unused40]", - "[unused41]", - "[unused42]", - "[unused43]", - "[unused44]", - "[unused45]", - "[unused46]", - "[unused47]", - "[unused48]", - "[unused49]", - "[unused50]", - "[unused51]", - "[unused52]", - "[unused53]", - "[unused54]", - "[unused55]", - "[unused56]", - "[unused57]", - "[unused58]", - "[unused59]", - "[unused60]", - "[unused61]", - "[unused62]", - "[unused63]", - "[unused64]", - "[unused65]", - "[unused66]", - "[unused67]", - "[unused68]", - "[unused69]", - "[unused70]", - "[unused71]", - "[unused72]", - "[unused73]", - "[unused74]", - "[unused75]", - "[unused76]", - "[unused77]", - "[unused78]", - "[unused79]", - "[unused80]", - "[unused81]", - "[unused82]", - "[unused83]", - "[unused84]", - "[unused85]", - "[unused86]", - "[unused87]", - "[unused88]", - "[unused89]", - "[unused90]", - "[unused91]", - "[unused92]", - "[unused93]", - "[unused94]", - "[unused95]", - "[unused96]", - "[unused97]", - "[unused98]", - "[unused99]", - "[UNK]", - "[CLS]", - "[SEP]", - "[MASK]", - "[unused100]", - "[unused101]", - "!", - "\"", - "#", - "$", - "%", - "&", - "'", - "(", - ")", - "*", - "+", - ",", - "-", - ".", - "/", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - ":", - ";", - "<", - "=", - ">", - "?", - "@", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "[", - "\\", - "]", - "^", - "_", - "`", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "{", - "|", - "}", - "~", - "¡", - "¢", - "£", - "¥", - "§", - "¨", - "©", - "ª", - "«", - "¬", - "®", - "°", - "±", - "²", - "³", - "´", - "µ", - "¶", - "·", - "¹", - "º", - "»", - "¼", - "½", - "¾", - "¿", - "À", - "Á", - "Â", - "Ä", - "Å", - "Æ", - "Ç", - "È", - "É", - "Í", - "Î", - "Ñ", - "Ó", - "Ö", - "×", - "Ø", - "Ú", - "Ü", - "Þ", - "ß", - "à", - "á", - "â", - "ã", - "ä", - "å", - "æ", - "ç", - "è", - "é", - "ê", - "ë", - "ì", - "í", - "î", - "ï", - "ð", - "ñ", - "ò", - "ó", - "ô", - "õ", - "ö", - "÷", - "ø", - "ù", - "ú", - "û", - "ü", - "ý", - "þ", - "ÿ", - "Ā", - "ā", - "ă", - "ą", - "Ć", - "ć", - "Č", - "č", - "ď", - "Đ", - "đ", - "ē", - "ė", - "ę", - "ě", - "ğ", - "ġ", - "Ħ", - "ħ", - "ĩ", - "Ī", - "ī", - "İ", - "ı", - "ļ", - "Ľ", - "ľ", - "Ł", - "ł", - "ń", - "ņ", - "ň", - "ŋ", - "Ō", - "ō", - "ŏ", - "ő", - "Œ", - "œ", - "ř", - "Ś", - "ś", - "Ş", - "ş", - "Š", - "š", - "Ţ", - "ţ", - "ť", - "ũ", - "ū", - "ŭ", - "ů", - "ű", - "ų", - "ŵ", - "ŷ", - "ź", - "Ż", - "ż", - "Ž", - "ž", - "Ə", - "ƒ", - "ơ", - "ư", - "ǎ", - "ǐ", - "ǒ", - "ǔ", - "ǫ", - "Ș", - "ș", - "Ț", - "ț", - "ɐ", - "ɑ", - "ɔ", - "ɕ", - "ə", - "ɛ", - "ɡ", - "ɣ", - "ɨ", - "ɪ", - "ɲ", - "ɾ", - "ʀ", - "ʁ", - "ʂ", - "ʃ", - "ʊ", - "ʋ", - "ʌ", - "ʐ", - "ʑ", - "ʒ", - "ʔ", - "ʰ", - "ʲ", - "ʳ", - "ʷ", - "ʻ", - "ʼ", - "ʾ", - "ʿ", - "ˈ", - "ː", - "ˡ", - "ˢ", - "ˣ", - "́", - "̃", - "̍", - "̯", - "͡", - "Α", - "Β", - "Γ", - "Δ", - "Ε", - "Η", - "Θ", - "Ι", - "Κ", - "Λ", - "Μ", - "Ν", - "Ο", - "Π", - "Σ", - "Τ", - "Φ", - "Χ", - "Ψ", - "Ω", - "ά", - "έ", - "ή", - "ί", - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - "ς", - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "ό", - "ύ", - "ώ", - "І", - "Ј", - "А", - "Б", - "В", - "Г", - "Д", - "Е", - "Ж", - "З", - "И", - "К", - "Л", - "М", - "Н", - "О", - "П", - "Р", - "С", - "Т", - "У", - "Ф", - "Х", - "Ц", - "Ч", - "Ш", - "Э", - "Ю", - "Я", - "а", - "б", - "в", - "г", - "д", - "е", - "ж", - "з", - "и", - "й", - "к", - "л", - "м", - "н", - "о", - "п", - "р", - "с", - "т", - "у", - "ф", - "х", - "ц", - "ч", - "ш", - "щ", - "ъ", - "ы", - "ь", - "э", - "ю", - "я", - "ё", - "і", - "ї", - "ј", - "њ", - "ћ", - "Ա", - "Հ", - "ա", - "ե", - "ի", - "կ", - "մ", - "յ", - "ն", - "ո", - "ս", - "տ", - "ր", - "ւ", - "ְ", - "ִ", - "ֵ", - "ֶ", - "ַ", - "ָ", - "ֹ", - "ּ", - "א", - "ב", - "ג", - "ד", - "ה", - "ו", - "ז", - "ח", - "ט", - "י", - "כ", - "ל", - "ם", - "מ", - "ן", - "נ", - "ס", - "ע", - "פ", - "צ", - "ק", - "ר", - "ש", - "ת", - "،", - "ء", - "آ", - "أ", - "إ", - "ئ", - "ا", - "ب", - "ة", - "ت", - "ث", - "ج", - "ح", - "خ", - "د", - "ذ", - "ر", - "ز", - "س", - "ش", - "ص", - "ض", - "ط", - "ظ", - "ع", - "غ", - "ف", - "ق", - "ك", - "ل", - "م", - "ن", - "ه", - "و", - "ى", - "ي", - "َ", - "ِ", - "ٹ", - "پ", - "چ", - "ک", - "گ", - "ہ", - "ی", - "ے", - "ं", - "आ", - "क", - "ग", - "च", - "ज", - "ण", - "त", - "द", - "ध", - "न", - "प", - "ब", - "भ", - "म", - "य", - "र", - "ल", - "व", - "श", - "ष", - "स", - "ह", - "ा", - "ि", - "ी", - "ु", - "े", - "ो", - "्", - "।", - "॥", - "আ", - "ই", - "এ", - "ও", - "ক", - "খ", - "গ", - "চ", - "ছ", - "জ", - "ট", - "ত", - "থ", - "দ", - "ধ", - "ন", - "প", - "ব", - "ম", - "য", - "র", - "ল", - "শ", - "স", - "হ", - "়", - "া", - "ি", - "ী", - "ু", - "ে", - "ো", - "্", - "য়", - "க", - "த", - "ப", - "ம", - "ய", - "ர", - "ல", - "வ", - "ா", - "ி", - "ு", - "்", - "ร", - "་", - "ག", - "ང", - "ད", - "ན", - "བ", - "མ", - "ར", - "ལ", - "ས", - "ི", - "ུ", - "ེ", - "ོ", - "ა", - "ე", - "ი", - "ლ", - "ნ", - "ო", - "რ", - "ს", - "ᴬ", - "ᴵ", - "ᵀ", - "ᵃ", - "ᵇ", - "ᵈ", - "ᵉ", - "ᵍ", - "ᵏ", - "ᵐ", - "ᵒ", - "ᵖ", - "ᵗ", - "ᵘ", - "ᵢ", - "ᵣ", - "ᵤ", - "ᵥ", - "ᶜ", - "ᶠ", - "ḍ", - "Ḥ", - "ḥ", - "Ḩ", - "ḩ", - "ḳ", - "ṃ", - "ṅ", - "ṇ", - "ṛ", - "ṣ", - "ṭ", - "ạ", - "ả", - "ấ", - "ầ", - "ẩ", - "ậ", - "ắ", - "ế", - "ề", - "ể", - "ễ", - "ệ", - "ị", - "ọ", - "ố", - "ồ", - "ổ", - "ộ", - "ớ", - "ờ", - "ợ", - "ụ", - "ủ", - "ứ", - "ừ", - "ử", - "ữ", - "ự", - "ỳ", - "ỹ", - "ἀ", - "ἐ", - "ὁ", - "ὐ", - "ὰ", - "ὶ", - "ὸ", - "ῆ", - "ῖ", - "ῦ", - "ῶ", - "‐", - "‑", - "‒", - "–", - "—", - "―", - "‖", - "‘", - "’", - "‚", - "“", - "”", - "„", - "†", - "‡", - "•", - "…", - "‰", - "′", - "″", - "⁄", - "⁰", - "ⁱ", - "⁴", - "⁵", - "⁶", - "⁷", - "⁸", - "⁹", - "⁺", - "⁻", - "ⁿ", - "₀", - "₁", - "₂", - "₃", - "₄", - "₅", - "₆", - "₇", - "₈", - "₉", - "₊", - "₍", - "₎", - "ₐ", - "ₑ", - "ₒ", - "ₓ", - "ₕ", - "ₖ", - "ₘ", - "ₙ", - "ₚ", - "ₛ", - "ₜ", - "₤", - "€", - "₱", - "₹", - "ℓ", - "№", - "ℝ", - "⅓", - "←", - "↑", - "→", - "↔", - "⇌", - "⇒", - "∂", - "∈", - "−", - "∗", - "∘", - "√", - "∞", - "∧", - "∨", - "∩", - "∪", - "≈", - "≠", - "≡", - "≤", - "≥", - "⊂", - "⊆", - "⊕", - "⋅", - "─", - "│", - "■", - "●", - "★", - "☆", - "☉", - "♠", - "♣", - "♥", - "♦", - "♭", - "♯", - "⟨", - "⟩", - "ⱼ", - "、", - "。", - "《", - "》", - "「", - "」", - "『", - "』", - "〜", - "い", - "う", - "え", - "お", - "か", - "き", - "く", - "け", - "こ", - "さ", - "し", - "す", - "せ", - "そ", - "た", - "ち", - "つ", - "て", - "と", - "な", - "に", - "の", - "は", - "ひ", - "ま", - "み", - "む", - "め", - "も", - "や", - "ゆ", - "よ", - "ら", - "り", - "る", - "れ", - "ん", - "ア", - "ィ", - "イ", - "ウ", - "エ", - "オ", - "カ", - "ガ", - "キ", - "ク", - "グ", - "コ", - "サ", - "シ", - "ジ", - "ス", - "ズ", - "タ", - "ダ", - "ッ", - "テ", - "デ", - "ト", - "ド", - "ナ", - "ニ", - "ハ", - "バ", - "パ", - "フ", - "ブ", - "プ", - "マ", - "ミ", - "ム", - "ャ", - "ュ", - "ラ", - "リ", - "ル", - "レ", - "ロ", - "ン", - "・", - "ー", - "一", - "三", - "上", - "下", - "中", - "事", - "二", - "井", - "京", - "人", - "亻", - "仁", - "佐", - "侍", - "光", - "公", - "力", - "北", - "十", - "南", - "原", - "口", - "史", - "司", - "吉", - "同", - "和", - "囗", - "国", - "國", - "土", - "城", - "士", - "大", - "天", - "太", - "夫", - "女", - "子", - "宀", - "安", - "宮", - "宿", - "小", - "尚", - "山", - "島", - "川", - "州", - "平", - "年", - "心", - "愛", - "戸", - "文", - "新", - "方", - "日", - "明", - "星", - "書", - "月", - "木", - "本", - "李", - "村", - "東", - "松", - "林", - "正", - "武", - "氏", - "水", - "氵", - "江", - "河", - "海", - "版", - "犬", - "王", - "生", - "田", - "白", - "皇", - "省", - "真", - "石", - "社", - "神", - "竹", - "美", - "義", - "花", - "藤", - "西", - "谷", - "車", - "辶", - "道", - "郎", - "郡", - "部", - "野", - "金", - "長", - "門", - "陽", - "青", - "食", - "馬", - "高", - "龍", - "龸", - "사", - "씨", - "의", - "이", - "한", - "fi", - "fl", - "!", - "(", - ")", - ",", - "-", - "/", - ":", - "the", - "of", - "and", - "to", - "in", - "was", - "The", - "is", - "for", - "as", - "on", - "with", - "that", - "##s", - "his", - "by", - "he", - "at", - "from", - "it", - "her", - "He", - "had", - "an", - "were", - "you", - "be", - "In", - "she", - "are", - "but", - "which", - "It", - "not", - "or", - "have", - "my", - "him", - "one", - "this", - "me", - "has", - "also", - "up", - "their", - "first", - "out", - "who", - "been", - "they", - "She", - "into", - "all", - "would", - "its", - "##ing", - "time", - "two", - "##a", - "##e", - "said", - "about", - "when", - "over", - "more", - "other", - "can", - "after", - "back", - "them", - "then", - "##ed", - "there", - "like", - "so", - "only", - "##n", - "could", - "##d", - "##i", - "##y", - "what", - "no", - "##o", - "where", - "This", - "made", - "than", - "if", - "You", - "##ly", - "through", - "we", - "before", - "##r", - "just", - "some", - "##er", - "years", - "do", - "New", - "##t", - "down", - "between", - "new", - "now", - "will", - "three", - "most", - "On", - "around", - "year", - "used", - "such", - "being", - "well", - "during", - "They", - "know", - "against", - "under", - "later", - "did", - "part", - "known", - "off", - "while", - "His", - "re", - "...", - "##l", - "people", - "until", - "way", - "American", - "didn", - "University", - "your", - "both", - "many", - "get", - "United", - "became", - "head", - "There", - "second", - "As", - "work", - "any", - "But", - "still", - "again", - "born", - "even", - "eyes", - "After", - "including", - "de", - "took", - "And", - "long", - "team", - "season", - "family", - "see", - "right", - "same", - "called", - "name", - "because", - "film", - "don", - "10", - "found", - "much", - "school", - "##es", - "going", - "won", - "place", - "away", - "We", - "day", - "left", - "John", - "000", - "hand", - "since", - "World", - "these", - "how", - "make", - "number", - "each", - "life", - "area", - "man", - "four", - "go", - "No", - "here", - "very", - "National", - "##m", - "played", - "released", - "never", - "began", - "States", - "album", - "home", - "last", - "too", - "held", - "several", - "May", - "own", - "##on", - "take", - "end", - "School", - "##h", - "ll", - "series", - "What", - "want", - "use", - "another", - "city", - "When", - "2010", - "side", - "At", - "may", - "That", - "came", - "face", - "June", - "think", - "game", - "those", - "high", - "March", - "early", - "September", - "##al", - "2011", - "looked", - "July", - "state", - "small", - "thought", - "went", - "January", - "October", - "##u", - "based", - "August", - "##us", - "world", - "good", - "April", - "York", - "us", - "12", - "2012", - "2008", - "For", - "2009", - "group", - "along", - "few", - "South", - "little", - "##k", - "following", - "November", - "something", - "2013", - "December", - "set", - "2007", - "old", - "2006", - "2014", - "located", - "##an", - "music", - "County", - "City", - "former", - "##in", - "room", - "ve", - "next", - "All", - "##man", - "got", - "father", - "house", - "##g", - "body", - "15", - "20", - "18", - "started", - "If", - "2015", - "town", - "our", - "line", - "War", - "large", - "population", - "named", - "British", - "company", - "member", - "five", - "My", - "single", - "##en", - "age", - "State", - "moved", - "February", - "11", - "Her", - "should", - "century", - "government", - "built", - "come", - "best", - "show", - "However", - "within", - "look", - "men", - "door", - "without", - "need", - "wasn", - "2016", - "water", - "One", - "system", - "knew", - "every", - "died", - "League", - "turned", - "asked", - "North", - "St", - "wanted", - "building", - "received", - "song", - "served", - "though", - "felt", - "##ia", - "station", - "band", - "##ers", - "local", - "public", - "himself", - "different", - "death", - "say", - "##1", - "30", - "##2", - "2005", - "16", - "night", - "behind", - "children", - "English", - "members", - "near", - "saw", - "together", - "son", - "14", - "voice", - "village", - "13", - "hands", - "help", - "##3", - "due", - "French", - "London", - "top", - "told", - "open", - "published", - "third", - "2017", - "play", - "across", - "During", - "put", - "final", - "often", - "include", - "25", - "##le", - "main", - "having", - "2004", - "once", - "ever", - "let", - "book", - "led", - "gave", - "late", - "front", - "find", - "club", - "##4", - "German", - "included", - "species", - "College", - "form", - "opened", - "mother", - "women", - "enough", - "West", - "must", - "2000", - "power", - "really", - "17", - "making", - "half", - "##6", - "order", - "might", - "##is", - "given", - "million", - "times", - "days", - "point", - "full", - "service", - "With", - "km", - "major", - "##7", - "original", - "become", - "seen", - "II", - "north", - "six", - "##te", - "love", - "##0", - "national", - "International", - "##5", - "24", - "So", - "District", - "lost", - "run", - "couldn", - "career", - "always", - "##9", - "2003", - "##th", - "country", - "##z", - "House", - "air", - "tell", - "south", - "worked", - "woman", - "player", - "##A", - "almost", - "war", - "River", - "##ic", - "married", - "continued", - "Then", - "James", - "close", - "black", - "short", - "##8", - "##na", - "using", - "history", - "returned", - "light", - "car", - "##ra", - "sure", - "William", - "things", - "General", - "##ry", - "2002", - "better", - "support", - "100", - "among", - "From", - "feet", - "King", - "anything", - "21", - "19", - "established", - "district", - "2001", - "feel", - "great", - "##ton", - "level", - "Cup", - "These", - "written", - "games", - "others", - "already", - "title", - "story", - "##p", - "law", - "thing", - "US", - "record", - "role", - "however", - "By", - "students", - "England", - "white", - "control", - "least", - "inside", - "land", - "##C", - "22", - "give", - "community", - "hard", - "##ie", - "non", - "##c", - "produced", - "George", - "round", - "period", - "Park", - "business", - "various", - "##ne", - "does", - "present", - "wife", - "far", - "taken", - "per", - "reached", - "David", - "able", - "version", - "working", - "young", - "live", - "created", - "joined", - "East", - "living", - "appeared", - "case", - "High", - "done", - "23", - "important", - "President", - "Award", - "France", - "position", - "office", - "looking", - "total", - "general", - "class", - "To", - "production", - "##S", - "football", - "party", - "brother", - "keep", - "mind", - "free", - "Street", - "hair", - "announced", - "development", - "either", - "nothing", - "moment", - "Church", - "followed", - "wrote", - "why", - "India", - "San", - "election", - "1999", - "lead", - "How", - "##ch", - "##rs", - "words", - "European", - "course", - "considered", - "America", - "arms", - "Army", - "political", - "##la", - "28", - "26", - "west", - "east", - "ground", - "further", - "church", - "less", - "site", - "First", - "Not", - "Australia", - "toward", - "California", - "##ness", - "described", - "works", - "An", - "Council", - "heart", - "past", - "military", - "27", - "##or", - "heard", - "field", - "human", - "soon", - "founded", - "1998", - "playing", - "trying", - "##x", - "##ist", - "##ta", - "television", - "mouth", - "although", - "taking", - "win", - "fire", - "Division", - "##ity", - "Party", - "Royal", - "program", - "Some", - "Don", - "Association", - "According", - "tried", - "TV", - "Paul", - "outside", - "daughter", - "Best", - "While", - "someone", - "match", - "recorded", - "Canada", - "closed", - "region", - "Air", - "above", - "months", - "elected", - "##da", - "##ian", - "road", - "##ar", - "brought", - "move", - "1997", - "leave", - "##um", - "Thomas", - "1996", - "am", - "low", - "Robert", - "formed", - "person", - "services", - "points", - "Mr", - "miles", - "##b", - "stop", - "rest", - "doing", - "needed", - "international", - "release", - "floor", - "start", - "sound", - "call", - "killed", - "real", - "dark", - "research", - "finished", - "language", - "Michael", - "professional", - "change", - "sent", - "50", - "upon", - "29", - "track", - "hit", - "event", - "2018", - "term", - "example", - "Germany", - "similar", - "return", - "##ism", - "fact", - "pulled", - "stood", - "says", - "ran", - "information", - "yet", - "result", - "developed", - "girl", - "##re", - "God", - "1995", - "areas", - "signed", - "decided", - "##ment", - "Company", - "seemed", - "##el", - "co", - "turn", - "race", - "common", - "video", - "Charles", - "Indian", - "##ation", - "blood", - "art", - "red", - "##able", - "added", - "rather", - "1994", - "met", - "director", - "addition", - "design", - "average", - "minutes", - "##ies", - "##ted", - "available", - "bed", - "coming", - "friend", - "idea", - "kind", - "Union", - "Road", - "remained", - "##ting", - "everything", - "##ma", - "running", - "care", - "finally", - "Chinese", - "appointed", - "1992", - "Australian", - "##ley", - "popular", - "mean", - "teams", - "probably", - "##land", - "usually", - "project", - "social", - "Championship", - "possible", - "word", - "Russian", - "instead", - "mi", - "herself", - "##T", - "Peter", - "Hall", - "Center", - "seat", - "style", - "money", - "1993", - "else", - "Department", - "table", - "Music", - "current", - "31", - "features", - "special", - "events", - "character", - "Two", - "square", - "sold", - "debut", - "##v", - "process", - "Although", - "Since", - "##ka", - "40", - "Central", - "currently", - "education", - "placed", - "lot", - "China", - "quickly", - "forward", - "seven", - "##ling", - "Europe", - "arm", - "performed", - "Japanese", - "1991", - "Henry", - "Now", - "Dr", - "##ion", - "week", - "Group", - "myself", - "big", - "UK", - "Washington", - "ten", - "deep", - "1990", - "Club", - "Japan", - "space", - "La", - "directed", - "smile", - "episode", - "hours", - "whole", - "##de", - "##less", - "Why", - "wouldn", - "designed", - "strong", - "training", - "changed", - "Society", - "stage", - "involved", - "hadn", - "towards", - "leading", - "police", - "eight", - "kept", - "Institute", - "study", - "largest", - "child", - "eventually", - "private", - "modern", - "Court", - "throughout", - "getting", - "originally", - "attack", - "##E", - "talk", - "Great", - "longer", - "songs", - "alone", - "##ine", - "wide", - "dead", - "walked", - "shot", - "##ri", - "Oh", - "force", - "##st", - "Art", - "today", - "friends", - "Island", - "Richard", - "1989", - "center", - "construction", - "believe", - "size", - "White", - "ship", - "completed", - "##B", - "gone", - "Just", - "rock", - "sat", - "##R", - "radio", - "below", - "entire", - "families", - "league", - "includes", - "type", - "lived", - "official", - "range", - "hold", - "featured", - "Most", - "##ter", - "president", - "passed", - "means", - "##f", - "forces", - "lips", - "Mary", - "Do", - "guitar", - "##ce", - "food", - "wall", - "Of", - "spent", - "Its", - "performance", - "hear", - "##P", - "Western", - "reported", - "sister", - "##et", - "morning", - "##M", - "especially", - "##ive", - "Minister", - "itself", - "post", - "bit", - "groups", - "1988", - "##tion", - "Black", - "##ng", - "Well", - "raised", - "sometimes", - "Canadian", - "Paris", - "Spanish", - "replaced", - "schools", - "Academy", - "leaving", - "central", - "female", - "Christian", - "Jack", - "whose", - "college", - "onto", - "provided", - "##D", - "##ville", - "players", - "actually", - "stopped", - "##son", - "Museum", - "doesn", - "##ts", - "books", - "fight", - "allowed", - "##ur", - "beginning", - "Records", - "awarded", - "parents", - "coach", - "##os", - "Red", - "saying", - "##ck", - "Smith", - "Yes", - "Lake", - "##L", - "aircraft", - "1987", - "##ble", - "previous", - "ft", - "action", - "Italian", - "African", - "happened", - "vocals", - "Act", - "future", - "court", - "##ge", - "1986", - "degree", - "phone", - "##ro", - "Is", - "countries", - "winning", - "breath", - "Love", - "river", - "matter", - "Lord", - "Other", - "list", - "self", - "parts", - "##ate", - "provide", - "cut", - "shows", - "plan", - "1st", - "interest", - "##ized", - "Africa", - "stated", - "Sir", - "fell", - "owned", - "earlier", - "ended", - "competition", - "attention", - "1985", - "lower", - "nearly", - "bad", - "older", - "stay", - "Saint", - "##se", - "certain", - "1984", - "fingers", - "blue", - "try", - "fourth", - "Grand", - "##as", - "king", - "##nt", - "makes", - "chest", - "movement", - "states", - "moving", - "data", - "introduced", - "model", - "date", - "section", - "Los", - "deal", - "##I", - "skin", - "entered", - "middle", - "success", - "Texas", - "##w", - "summer", - "island", - "##N", - "Republic", - "length", - "husband", - "1980", - "##ey", - "reason", - "anyone", - "forced", - "via", - "base", - "500", - "job", - "covered", - "Festival", - "Roman", - "successful", - "rights", - "cover", - "Man", - "writing", - "Ireland", - "##F", - "related", - "goal", - "takes", - "buildings", - "true", - "weeks", - "1983", - "Because", - "opening", - "novel", - "ISBN", - "meet", - "gold", - "##ous", - "mid", - "km²", - "standing", - "Football", - "Chicago", - "shook", - "whom", - "##ki", - "1982", - "Day", - "feeling", - "scored", - "boy", - "higher", - "Force", - "leader", - "heavy", - "fall", - "question", - "sense", - "army", - "Second", - "energy", - "meeting", - "themselves", - "kill", - "##am", - "board", - "census", - "##ya", - "##ns", - "mine", - "meant", - "market", - "required", - "battle", - "campaign", - "attended", - "approximately", - "Kingdom", - "runs", - "active", - "##ha", - "contract", - "clear", - "previously", - "health", - "1979", - "Arts", - "complete", - "Catholic", - "couple", - "units", - "##ll", - "##ty", - "Committee", - "shoulder", - "sea", - "systems", - "listed", - "##O", - "caught", - "tournament", - "##G", - "northern", - "author", - "Film", - "Your", - "##men", - "holding", - "offered", - "personal", - "1981", - "southern", - "artist", - "traditional", - "studio", - "200", - "capital", - "##ful", - "regular", - "ask", - "giving", - "organization", - "month", - "news", - "Are", - "read", - "managed", - "helped", - "studied", - "student", - "defeated", - "natural", - "industry", - "Year", - "noted", - "decision", - "Government", - "quite", - "##id", - "smiled", - "1972", - "Maybe", - "tracks", - "##ke", - "Mark", - "al", - "media", - "engine", - "hour", - "Their", - "relationship", - "plays", - "property", - "structure", - "1976", - "ago", - "Hill", - "Martin", - "1978", - "ready", - "Many", - "Like", - "Bay", - "immediately", - "generally", - "Italy", - "Greek", - "practice", - "caused", - "division", - "significant", - "Joseph", - "speed", - "Let", - "thinking", - "completely", - "1974", - "primary", - "mostly", - "##field", - "##K", - "1975", - "##to", - "Even", - "writer", - "##led", - "dropped", - "magazine", - "collection", - "understand", - "route", - "highest", - "particular", - "films", - "lines", - "network", - "Science", - "loss", - "carried", - "direction", - "green", - "1977", - "location", - "producer", - "according", - "Women", - "Queen", - "neck", - "thus", - "independent", - "view", - "1970", - "Angeles", - "Soviet", - "distance", - "problem", - "Board", - "tour", - "western", - "income", - "appearance", - "access", - "Mexico", - "nodded", - "street", - "surface", - "arrived", - "believed", - "Old", - "1968", - "1973", - "becoming", - "whether", - "1945", - "figure", - "singer", - "stand", - "Following", - "issue", - "window", - "wrong", - "pain", - "everyone", - "lives", - "issues", - "park", - "slowly", - "la", - "act", - "##va", - "bring", - "Lee", - "operations", - "key", - "comes", - "fine", - "cold", - "famous", - "Navy", - "1971", - "Me", - "additional", - "individual", - "##ner", - "Zealand", - "goals", - "county", - "contains", - "Service", - "minute", - "2nd", - "reach", - "talking", - "particularly", - "##ham", - "movie", - "Director", - "glass", - "paper", - "studies", - "##co", - "railway", - "standard", - "Education", - "45", - "represented", - "Chief", - "Louis", - "launched", - "Star", - "terms", - "60", - "1969", - "experience", - "watched", - "Another", - "Press", - "Tom", - "staff", - "starting", - "subject", - "break", - "Virginia", - "nine", - "eye", - "##age", - "evidence", - "foot", - "##est", - "companies", - "Prince", - "##V", - "gun", - "create", - "Big", - "People", - "guy", - "Green", - "simply", - "numerous", - "##line", - "increased", - "twenty", - "##ga", - "##do", - "1967", - "award", - "officer", - "stone", - "Before", - "material", - "Northern", - "grew", - "male", - "plant", - "Life", - "legs", - "step", - "Al", - "unit", - "35", - "except", - "answer", - "##U", - "report", - "response", - "Edward", - "commercial", - "edition", - "trade", - "science", - "##ca", - "Irish", - "Law", - "shown", - "rate", - "failed", - "##ni", - "remains", - "changes", - "mm", - "limited", - "larger", - "Later", - "cause", - "waiting", - "Time", - "##wood", - "cost", - "Bill", - "manager", - "activities", - "likely", - "allow", - "operated", - "retired", - "##ping", - "65", - "directly", - "Who", - "associated", - "effect", - "hell", - "Florida", - "straight", - "hot", - "Valley", - "management", - "girls", - "expected", - "eastern", - "Mike", - "chance", - "cast", - "centre", - "chair", - "hurt", - "problems", - "##li", - "walk", - "programs", - "Team", - "characters", - "Battle", - "edge", - "pay", - "maybe", - "corner", - "majority", - "medical", - "Joe", - "Summer", - "##io", - "attempt", - "Pacific", - "command", - "Radio", - "##by", - "names", - "municipality", - "1964", - "train", - "economic", - "Brown", - "feature", - "sex", - "source", - "agreed", - "remember", - "Three", - "1966", - "1965", - "Pennsylvania", - "victory", - "senior", - "annual", - "III", - "Southern", - "results", - "Sam", - "serving", - "religious", - "Jones", - "appears", - "##der", - "despite", - "claimed", - "Both", - "musical", - "matches", - "fast", - "security", - "selected", - "Young", - "double", - "complex", - "hospital", - "chief", - "Times", - "##ve", - "Championships", - "filled", - "Public", - "Despite", - "beautiful", - "Research", - "plans", - "Province", - "##ally", - "Wales", - "##ko", - "artists", - "metal", - "nearby", - "Spain", - "##il", - "32", - "houses", - "supported", - "piece", - "##no", - "stared", - "recording", - "nature", - "legal", - "Russia", - "##ization", - "remaining", - "looks", - "##sh", - "bridge", - "closer", - "cases", - "scene", - "marriage", - "Little", - "##é", - "uses", - "Earth", - "specific", - "Frank", - "theory", - "Good", - "discovered", - "referred", - "bass", - "culture", - "university", - "presented", - "Congress", - "##go", - "metres", - "continue", - "1960", - "isn", - "Awards", - "meaning", - "cell", - "composed", - "separate", - "Series", - "forms", - "Blue", - "cross", - "##tor", - "increase", - "test", - "computer", - "slightly", - "Where", - "Jewish", - "Town", - "tree", - "status", - "1944", - "variety", - "responsible", - "pretty", - "initially", - "##way", - "realized", - "pass", - "provides", - "Captain", - "Alexander", - "recent", - "score", - "broke", - "Scott", - "drive", - "financial", - "showed", - "Line", - "stories", - "ordered", - "soldiers", - "genus", - "operation", - "gaze", - "sitting", - "society", - "Only", - "hope", - "actor", - "follow", - "Empire", - "Yeah", - "technology", - "happy", - "focus", - "policy", - "spread", - "situation", - "##ford", - "##ba", - "Mrs", - "watch", - "Can", - "1963", - "Commission", - "touch", - "earned", - "troops", - "Under", - "1962", - "individuals", - "cannot", - "19th", - "##lin", - "mile", - "expression", - "exactly", - "suddenly", - "weight", - "dance", - "stepped", - "places", - "appear", - "difficult", - "Railway", - "anti", - "numbers", - "kilometres", - "star", - "##ier", - "department", - "ice", - "Britain", - "removed", - "Once", - "##lo", - "Boston", - "value", - "##ant", - "mission", - "trees", - "Order", - "sports", - "join", - "serve", - "Major", - "poor", - "Poland", - "mainly", - "Theatre", - "pushed", - "Station", - "##it", - "Lady", - "federal", - "silver", - "##ler", - "foreign", - "##ard", - "Eastern", - "##den", - "box", - "hall", - "subsequently", - "lies", - "acquired", - "1942", - "ancient", - "CD", - "History", - "Jean", - "beyond", - "##ger", - "El", - "##les", - "growing", - "championship", - "native", - "Parliament", - "Williams", - "watching", - "direct", - "overall", - "offer", - "Also", - "80", - "Secretary", - "spoke", - "Latin", - "ability", - "##ated", - "safe", - "presence", - "##ial", - "headed", - "regional", - "planned", - "1961", - "Johnson", - "throat", - "consists", - "##W", - "extended", - "Or", - "bar", - "walls", - "Chris", - "stations", - "politician", - "Olympics", - "influence", - "share", - "fighting", - "speak", - "hundred", - "Carolina", - "die", - "stars", - "##tic", - "color", - "Chapter", - "##ish", - "fear", - "sleep", - "goes", - "Francisco", - "oil", - "Bank", - "sign", - "physical", - "##berg", - "Dutch", - "seasons", - "##rd", - "Games", - "Governor", - "sorry", - "lack", - "Centre", - "memory", - "baby", - "smaller", - "charge", - "Did", - "multiple", - "ships", - "shirt", - "Assembly", - "amount", - "leaves", - "3rd", - "Foundation", - "conditions", - "1943", - "Rock", - "Democratic", - "Daniel", - "##at", - "winner", - "products", - "##ina", - "store", - "latter", - "Professor", - "civil", - "prior", - "host", - "1956", - "soft", - "vote", - "needs", - "Each", - "rules", - "1958", - "pressure", - "letter", - "normal", - "proposed", - "levels", - "records", - "1959", - "paid", - "intended", - "Victoria", - "purpose", - "okay", - "historical", - "issued", - "1980s", - "broadcast", - "rule", - "simple", - "picked", - "firm", - "Sea", - "1941", - "Elizabeth", - "1940", - "serious", - "featuring", - "highly", - "graduated", - "mentioned", - "choice", - "1948", - "replied", - "percent", - "Scotland", - "##hi", - "females", - "constructed", - "1957", - "settled", - "Steve", - "recognized", - "cities", - "crew", - "glanced", - "kiss", - "competed", - "flight", - "knowledge", - "editor", - "More", - "Conference", - "##H", - "fifth", - "elements", - "##ee", - "##tes", - "function", - "newspaper", - "recently", - "Miss", - "cultural", - "brown", - "twice", - "Office", - "1939", - "truth", - "Creek", - "1946", - "households", - "USA", - "1950", - "quality", - "##tt", - "border", - "seconds", - "destroyed", - "pre", - "wait", - "ahead", - "build", - "image", - "90", - "cars", - "##mi", - "33", - "promoted", - "professor", - "et", - "bank", - "medal", - "text", - "broken", - "Middle", - "revealed", - "sides", - "wing", - "seems", - "channel", - "1970s", - "Ben", - "loved", - "effort", - "officers", - "Will", - "##ff", - "70", - "Israel", - "Jim", - "upper", - "fully", - "label", - "Jr", - "assistant", - "powerful", - "pair", - "positive", - "##ary", - "gives", - "1955", - "20th", - "races", - "remain", - "kitchen", - "primarily", - "##ti", - "Sydney", - "easy", - "Tour", - "whispered", - "buried", - "300", - "News", - "Polish", - "1952", - "Duke", - "Columbia", - "produce", - "accepted", - "00", - "approach", - "minor", - "1947", - "Special", - "44", - "Asian", - "basis", - "visit", - "Fort", - "Civil", - "finish", - "formerly", - "beside", - "leaned", - "##ite", - "median", - "rose", - "coast", - "effects", - "supposed", - "Cross", - "##hip", - "Corps", - "residents", - "Jackson", - "##ir", - "Bob", - "basketball", - "36", - "Asia", - "seem", - "Bishop", - "Book", - "##ber", - "ring", - "##ze", - "owner", - "BBC", - "##ja", - "transferred", - "acting", - "De", - "appearances", - "walking", - "Le", - "press", - "grabbed", - "1954", - "officially", - "1953", - "##pe", - "risk", - "taught", - "review", - "##X", - "lay", - "##well", - "council", - "Avenue", - "seeing", - "losing", - "Ohio", - "Super", - "province", - "ones", - "travel", - "##sa", - "projects", - "equipment", - "spot", - "Berlin", - "administrative", - "heat", - "potential", - "shut", - "capacity", - "elections", - "growth", - "fought", - "Republican", - "mixed", - "Andrew", - "teacher", - "turning", - "strength", - "shoulders", - "beat", - "wind", - "1949", - "Health", - "follows", - "camp", - "suggested", - "perhaps", - "Alex", - "mountain", - "contact", - "divided", - "candidate", - "fellow", - "34", - "Show", - "necessary", - "workers", - "ball", - "horse", - "ways", - "questions", - "protect", - "gas", - "activity", - "younger", - "bottom", - "founder", - "Scottish", - "screen", - "treatment", - "easily", - "com", - "##house", - "dedicated", - "Master", - "warm", - "Night", - "Georgia", - "Long", - "von", - "##me", - "perfect", - "website", - "1960s", - "piano", - "efforts", - "##ide", - "Tony", - "sort", - "offers", - "Development", - "Simon", - "executive", - "##nd", - "save", - "Over", - "Senate", - "1951", - "1990s", - "draw", - "master", - "Police", - "##ius", - "renamed", - "boys", - "initial", - "prominent", - "damage", - "Co", - "##ov", - "##za", - "online", - "begin", - "occurred", - "captured", - "youth", - "Top", - "account", - "tells", - "Justice", - "conducted", - "forest", - "##town", - "bought", - "teeth", - "Jersey", - "##di", - "purchased", - "agreement", - "Michigan", - "##ure", - "campus", - "prison", - "becomes", - "product", - "secret", - "guess", - "Route", - "huge", - "types", - "drums", - "64", - "split", - "defeat", - "estate", - "housing", - "##ot", - "brothers", - "Coast", - "declared", - "happen", - "titled", - "therefore", - "sun", - "commonly", - "alongside", - "Stadium", - "library", - "Home", - "article", - "steps", - "telling", - "slow", - "assigned", - "refused", - "laughed", - "wants", - "Nick", - "wearing", - "Rome", - "Open", - "##ah", - "Hospital", - "pointed", - "Taylor", - "lifted", - "escape", - "participated", - "##j", - "drama", - "parish", - "Santa", - "##per", - "organized", - "mass", - "pick", - "Airport", - "gets", - "Library", - "unable", - "pull", - "Live", - "##ging", - "surrounding", - "##ries", - "focused", - "Adam", - "facilities", - "##ning", - "##ny", - "38", - "##ring", - "notable", - "era", - "connected", - "gained", - "operating", - "laid", - "Regiment", - "branch", - "defined", - "Christmas", - "machine", - "Four", - "academic", - "Iran", - "adopted", - "concept", - "Men", - "compared", - "search", - "traffic", - "Max", - "Maria", - "greater", - "##ding", - "widely", - "##burg", - "serves", - "1938", - "37", - "Go", - "hotel", - "shared", - "typically", - "scale", - "1936", - "leg", - "suffered", - "yards", - "pieces", - "Ministry", - "Wilson", - "episodes", - "empty", - "1918", - "safety", - "continues", - "yellow", - "historic", - "settlement", - "400", - "Come", - "Corporation", - "enemy", - "content", - "picture", - "evening", - "territory", - "method", - "trial", - "solo", - "driver", - "Here", - "##ls", - "entrance", - "Prize", - "spring", - "whatever", - "##ent", - "75", - "##ji", - "reading", - "Arthur", - "##cy", - "Our", - "clothes", - "Prime", - "Illinois", - "Kong", - "code", - "##ria", - "sit", - "Harry", - "Federal", - "chosen", - "administration", - "bodies", - "begins", - "stomach", - "Though", - "seats", - "Hong", - "density", - "Sun", - "leaders", - "Field", - "museum", - "chart", - "platform", - "languages", - "##ron", - "birth", - "holds", - "Gold", - "##un", - "fish", - "combined", - "##ps", - "4th", - "1937", - "largely", - "captain", - "trust", - "Game", - "van", - "boat", - "Oxford", - "basic", - "beneath", - "Islands", - "painting", - "nice", - "Toronto", - "path", - "males", - "sources", - "block", - "conference", - "parties", - "murder", - "clubs", - "crowd", - "calling", - "About", - "Business", - "peace", - "knows", - "lake", - "speaking", - "stayed", - "Brazil", - "allowing", - "Born", - "unique", - "thick", - "Technology", - "##que", - "receive", - "des", - "semi", - "alive", - "noticed", - "format", - "##ped", - "coffee", - "digital", - "##ned", - "handed", - "guard", - "tall", - "faced", - "setting", - "plants", - "partner", - "claim", - "reduced", - "temple", - "animals", - "determined", - "classes", - "##out", - "estimated", - "##ad", - "Olympic", - "providing", - "Massachusetts", - "learned", - "Inc", - "Philadelphia", - "Social", - "carry", - "42", - "possibly", - "hosted", - "tonight", - "respectively", - "Today", - "shape", - "Mount", - "roles", - "designated", - "brain", - "etc", - "Korea", - "thoughts", - "Brian", - "Highway", - "doors", - "background", - "drew", - "models", - "footballer", - "tone", - "turns", - "1935", - "quiet", - "tower", - "wood", - "bus", - "write", - "software", - "weapons", - "flat", - "marked", - "1920", - "newly", - "tight", - "Eric", - "finger", - "Journal", - "FC", - "Van", - "rise", - "critical", - "Atlantic", - "granted", - "returning", - "communities", - "humans", - "quick", - "39", - "48", - "ranked", - "sight", - "pop", - "Swedish", - "Stephen", - "card", - "analysis", - "attacked", - "##wa", - "Sunday", - "identified", - "Jason", - "champion", - "situated", - "1930", - "expanded", - "tears", - "##nce", - "reaching", - "Davis", - "protection", - "Emperor", - "positions", - "nominated", - "Bridge", - "tax", - "dress", - "allows", - "avoid", - "leadership", - "killing", - "actress", - "guest", - "steel", - "knowing", - "electric", - "cells", - "disease", - "grade", - "unknown", - "##ium", - "resulted", - "Pakistan", - "confirmed", - "##ged", - "tongue", - "covers", - "##Y", - "roof", - "entirely", - "applied", - "votes", - "drink", - "interview", - "exchange", - "Township", - "reasons", - "##ised", - "page", - "calls", - "dog", - "agent", - "nose", - "teaching", - "##ds", - "##ists", - "advanced", - "wish", - "Golden", - "existing", - "vehicle", - "del", - "1919", - "develop", - "attacks", - "pressed", - "Sports", - "planning", - "resulting", - "facility", - "Sarah", - "notes", - "1933", - "Class", - "Historic", - "winter", - "##mo", - "audience", - "Community", - "household", - "Netherlands", - "creation", - "##ize", - "keeping", - "1914", - "claims", - "dry", - "guys", - "opposite", - "##ak", - "explained", - "Ontario", - "secondary", - "difference", - "Francis", - "actions", - "organizations", - "yard", - "animal", - "Up", - "Lewis", - "titles", - "Several", - "1934", - "Ryan", - "55", - "Supreme", - "rolled", - "1917", - "distribution", - "figures", - "afraid", - "rural", - "yourself", - "##rt", - "sets", - "barely", - "Instead", - "passing", - "awards", - "41", - "silence", - "authority", - "occupied", - "environment", - "windows", - "engineering", - "surprised", - "flying", - "crime", - "reports", - "Mountain", - "powers", - "driving", - "succeeded", - "reviews", - "1929", - "Head", - "missing", - "Song", - "Jesus", - "opportunity", - "inspired", - "ends", - "albums", - "conversation", - "impact", - "injury", - "surprise", - "billion", - "learning", - "heavily", - "oldest", - "union", - "creating", - "##ky", - "festival", - "literature", - "letters", - "sexual", - "##tte", - "apartment", - "Final", - "comedy", - "nation", - "orders", - "##sen", - "contemporary", - "Power", - "drawn", - "existence", - "connection", - "##ating", - "Post", - "Junior", - "remembered", - "message", - "Medal", - "castle", - "note", - "engineer", - "sounds", - "Beach", - "crossed", - "##dy", - "ear", - "scientific", - "sales", - "##ai", - "theme", - "starts", - "clearly", - "##ut", - "trouble", - "##gan", - "bag", - "##han", - "BC", - "sons", - "1928", - "silent", - "versions", - "daily", - "Studies", - "ending", - "Rose", - "guns", - "1932", - "headquarters", - "reference", - "obtained", - "Squadron", - "concert", - "none", - "du", - "Among", - "##don", - "prevent", - "Member", - "answered", - "staring", - "Between", - "##lla", - "portion", - "drug", - "liked", - "association", - "performances", - "Nations", - "formation", - "Castle", - "lose", - "learn", - "scoring", - "relatively", - "quarter", - "47", - "Premier", - "##ors", - "Sweden", - "baseball", - "attempted", - "trip", - "worth", - "perform", - "airport", - "fields", - "enter", - "honor", - "Medical", - "rear", - "commander", - "officials", - "condition", - "supply", - "materials", - "52", - "Anna", - "volume", - "threw", - "Persian", - "43", - "interested", - "Gallery", - "achieved", - "visited", - "laws", - "relief", - "Area", - "Matt", - "singles", - "Lieutenant", - "Country", - "fans", - "Cambridge", - "sky", - "Miller", - "effective", - "tradition", - "Port", - "##ana", - "minister", - "extra", - "entitled", - "System", - "sites", - "authorities", - "acres", - "committee", - "racing", - "1931", - "desk", - "trains", - "ass", - "weren", - "Family", - "farm", - "##ance", - "industrial", - "##head", - "iron", - "49", - "abandoned", - "Out", - "Holy", - "chairman", - "waited", - "frequently", - "display", - "Light", - "transport", - "starring", - "Patrick", - "Engineering", - "eat", - "FM", - "judge", - "reaction", - "centuries", - "price", - "##tive", - "Korean", - "defense", - "Get", - "arrested", - "1927", - "send", - "urban", - "##ss", - "pilot", - "Okay", - "Media", - "reality", - "arts", - "soul", - "thirty", - "##be", - "catch", - "generation", - "##nes", - "apart", - "Anne", - "drop", - "See", - "##ving", - "sixth", - "trained", - "Management", - "magic", - "cm", - "height", - "Fox", - "Ian", - "resources", - "vampire", - "principal", - "Was", - "haven", - "##au", - "Walter", - "Albert", - "rich", - "1922", - "causing", - "entry", - "##ell", - "shortly", - "46", - "worry", - "doctor", - "composer", - "rank", - "Network", - "bright", - "showing", - "regions", - "1924", - "wave", - "carrying", - "kissed", - "finding", - "missed", - "Earl", - "lying", - "target", - "vehicles", - "Military", - "controlled", - "dinner", - "##board", - "briefly", - "lyrics", - "motion", - "duty", - "strange", - "attempts", - "invited", - "kg", - "villages", - "5th", - "Land", - "##mer", - "Christ", - "prepared", - "twelve", - "check", - "thousand", - "earth", - "copies", - "en", - "transfer", - "citizens", - "Americans", - "politics", - "nor", - "theatre", - "Project", - "##bo", - "clean", - "rooms", - "laugh", - "##ran", - "application", - "contained", - "anyway", - "containing", - "Sciences", - "1925", - "rare", - "speech", - "exist", - "1950s", - "falling", - "passenger", - "##im", - "stands", - "51", - "##ol", - "##ow", - "phase", - "governor", - "kids", - "details", - "methods", - "Vice", - "employed", - "performing", - "counter", - "Jane", - "heads", - "Channel", - "wine", - "opposition", - "aged", - "1912", - "Every", - "1926", - "highway", - "##ura", - "1921", - "aired", - "978", - "permanent", - "Forest", - "finds", - "joint", - "approved", - "##pur", - "brief", - "doubt", - "acts", - "brand", - "wild", - "closely", - "Ford", - "Kevin", - "chose", - "shall", - "port", - "sweet", - "fun", - "asking", - "Be", - "##bury", - "sought", - "Dave", - "Mexican", - "mom", - "Right", - "Howard", - "Moscow", - "Charlie", - "Stone", - "##mann", - "admitted", - "##ver", - "wooden", - "1923", - "Officer", - "relations", - "Hot", - "combat", - "publication", - "chain", - "shop", - "inhabitants", - "proved", - "ideas", - "address", - "1915", - "Memorial", - "explain", - "increasing", - "conflict", - "Anthony", - "Melbourne", - "narrow", - "temperature", - "slid", - "1916", - "worse", - "selling", - "documentary", - "Ali", - "Ray", - "opposed", - "vision", - "dad", - "extensive", - "Infantry", - "commissioned", - "Doctor", - "offices", - "programming", - "core", - "respect", - "storm", - "##pa", - "##ay", - "##om", - "promotion", - "der", - "struck", - "anymore", - "shit", - "Region", - "receiving", - "DVD", - "alternative", - "##ue", - "ride", - "maximum", - "1910", - "##ious", - "Third", - "Affairs", - "cancer", - "Executive", - "##op", - "dream", - "18th", - "Due", - "##ker", - "##worth", - "economy", - "IV", - "Billboard", - "identity", - "subsequent", - "statement", - "skills", - "##back", - "funding", - "##ons", - "Round", - "Foreign", - "truck", - "Please", - "lights", - "wondered", - "##ms", - "frame", - "yes", - "Still", - "districts", - "fiction", - "Colonel", - "converted", - "150", - "grown", - "accident", - "critics", - "fit", - "Information", - "architecture", - "Point", - "Five", - "armed", - "Billy", - "poet", - "functions", - "consisted", - "suit", - "Turkish", - "Band", - "object", - "desire", - "##ities", - "sounded", - "flow", - "Norwegian", - "articles", - "Marie", - "pulling", - "thin", - "singing", - "Hunter", - "Human", - "Battalion", - "Federation", - "Kim", - "origin", - "represent", - "dangerous", - "weather", - "fuel", - "ex", - "##sing", - "Last", - "bedroom", - "aid", - "knees", - "Alan", - "angry", - "assumed", - "plane", - "Something", - "founding", - "concerned", - "global", - "Fire", - "di", - "please", - "Portuguese", - "touched", - "Roger", - "nuclear", - "Register", - "Jeff", - "fixed", - "royal", - "lie", - "finals", - "NFL", - "Manchester", - "towns", - "handle", - "shaped", - "Chairman", - "Dean", - "launch", - "understanding", - "Children", - "violence", - "failure", - "sector", - "Brigade", - "wrapped", - "fired", - "sharp", - "tiny", - "developing", - "expansion", - "Free", - "institutions", - "technical", - "Nothing", - "otherwise", - "Main", - "inch", - "Saturday", - "wore", - "Senior", - "attached", - "cheek", - "representing", - "Kansas", - "##chi", - "##kin", - "actual", - "advantage", - "Dan", - "Austria", - "##dale", - "hoped", - "multi", - "squad", - "Norway", - "streets", - "1913", - "Services", - "hired", - "grow", - "pp", - "wear", - "painted", - "Minnesota", - "stuff", - "Building", - "54", - "Philippines", - "1900", - "##ties", - "educational", - "Khan", - "Magazine", - "##port", - "Cape", - "signal", - "Gordon", - "sword", - "Anderson", - "cool", - "engaged", - "Commander", - "images", - "Upon", - "tied", - "Security", - "cup", - "rail", - "Vietnam", - "successfully", - "##red", - "Muslim", - "gain", - "bringing", - "Native", - "hers", - "occurs", - "negative", - "Philip", - "Kelly", - "Colorado", - "category", - "##lan", - "600", - "Have", - "supporting", - "wet", - "56", - "stairs", - "Grace", - "observed", - "##ung", - "funds", - "restaurant", - "1911", - "Jews", - "##ments", - "##che", - "Jake", - "Back", - "53", - "asks", - "journalist", - "accept", - "bands", - "bronze", - "helping", - "##ice", - "decades", - "mayor", - "survived", - "usual", - "influenced", - "Douglas", - "Hey", - "##izing", - "surrounded", - "retirement", - "Temple", - "derived", - "Pope", - "registered", - "producing", - "##ral", - "structures", - "Johnny", - "contributed", - "finishing", - "buy", - "specifically", - "##king", - "patients", - "Jordan", - "internal", - "regarding", - "Samuel", - "Clark", - "##q", - "afternoon", - "Finally", - "scenes", - "notice", - "refers", - "quietly", - "threat", - "Water", - "Those", - "Hamilton", - "promise", - "freedom", - "Turkey", - "breaking", - "maintained", - "device", - "lap", - "ultimately", - "Champion", - "Tim", - "Bureau", - "expressed", - "investigation", - "extremely", - "capable", - "qualified", - "recognition", - "items", - "##up", - "Indiana", - "adult", - "rain", - "greatest", - "architect", - "Morgan", - "dressed", - "equal", - "Antonio", - "collected", - "drove", - "occur", - "Grant", - "graduate", - "anger", - "Sri", - "worried", - "standards", - "##ore", - "injured", - "somewhere", - "damn", - "Singapore", - "Jimmy", - "pocket", - "homes", - "stock", - "religion", - "aware", - "regarded", - "Wisconsin", - "##tra", - "passes", - "fresh", - "##ea", - "argued", - "Ltd", - "EP", - "Diego", - "importance", - "Census", - "incident", - "Egypt", - "Missouri", - "domestic", - "leads", - "ceremony", - "Early", - "camera", - "Father", - "challenge", - "Switzerland", - "lands", - "familiar", - "hearing", - "spend", - "educated", - "Tennessee", - "Thank", - "##ram", - "Thus", - "concern", - "putting", - "inches", - "map", - "classical", - "Allen", - "crazy", - "valley", - "Space", - "softly", - "##my", - "pool", - "worldwide", - "climate", - "experienced", - "neighborhood", - "scheduled", - "neither", - "fleet", - "1908", - "Girl", - "##J", - "Part", - "engines", - "locations", - "darkness", - "Revolution", - "establishment", - "lawyer", - "objects", - "apparently", - "Queensland", - "Entertainment", - "bill", - "mark", - "Television", - "##ong", - "pale", - "demand", - "Hotel", - "selection", - "##rn", - "##ino", - "Labour", - "Liberal", - "burned", - "Mom", - "merged", - "Arizona", - "request", - "##lia", - "##light", - "hole", - "employees", - "##ical", - "incorporated", - "95", - "independence", - "Walker", - "covering", - "joining", - "##ica", - "task", - "papers", - "backing", - "sell", - "biggest", - "6th", - "strike", - "establish", - "##ō", - "gently", - "59", - "Orchestra", - "Winter", - "protein", - "Juan", - "locked", - "dates", - "Boy", - "aren", - "shooting", - "Luke", - "solid", - "charged", - "Prior", - "resigned", - "interior", - "garden", - "spoken", - "improve", - "wonder", - "promote", - "hidden", - "##med", - "combination", - "Hollywood", - "Swiss", - "consider", - "##ks", - "Lincoln", - "literary", - "drawing", - "Marine", - "weapon", - "Victor", - "Trust", - "Maryland", - "properties", - "##ara", - "exhibition", - "understood", - "hung", - "Tell", - "installed", - "loud", - "fashion", - "affected", - "junior", - "landing", - "flowers", - "##he", - "Internet", - "beach", - "Heart", - "tries", - "Mayor", - "programme", - "800", - "wins", - "noise", - "##ster", - "##ory", - "58", - "contain", - "fair", - "delivered", - "##ul", - "wedding", - "Square", - "advance", - "behavior", - "Program", - "Oregon", - "##rk", - "residence", - "realize", - "certainly", - "hill", - "Houston", - "57", - "indicated", - "##water", - "wounded", - "Village", - "massive", - "Moore", - "thousands", - "personnel", - "dating", - "opera", - "poetry", - "##her", - "causes", - "feelings", - "Frederick", - "applications", - "push", - "approached", - "foundation", - "pleasure", - "sale", - "fly", - "gotten", - "northeast", - "costs", - "raise", - "paintings", - "##ney", - "views", - "horses", - "formal", - "Arab", - "hockey", - "typical", - "representative", - "rising", - "##des", - "clock", - "stadium", - "shifted", - "Dad", - "peak", - "Fame", - "vice", - "disappeared", - "users", - "Way", - "Naval", - "prize", - "hoping", - "values", - "evil", - "Bell", - "consisting", - "##ón", - "Regional", - "##ics", - "improved", - "circle", - "carefully", - "broad", - "##ini", - "Fine", - "maintain", - "operate", - "offering", - "mention", - "Death", - "stupid", - "Through", - "Princess", - "attend", - "interests", - "ruled", - "somewhat", - "wings", - "roads", - "grounds", - "##ual", - "Greece", - "Champions", - "facing", - "hide", - "voted", - "require", - "Dark", - "Matthew", - "credit", - "sighed", - "separated", - "manner", - "##ile", - "Boys", - "1905", - "committed", - "impossible", - "lip", - "candidates", - "7th", - "Bruce", - "arranged", - "Islamic", - "courses", - "criminal", - "##ened", - "smell", - "##bed", - "08", - "consecutive", - "##ening", - "proper", - "purchase", - "weak", - "Prix", - "1906", - "aside", - "introduction", - "Look", - "##ku", - "changing", - "budget", - "resistance", - "factory", - "Forces", - "agency", - "##tone", - "northwest", - "user", - "1907", - "stating", - "##one", - "sport", - "Design", - "environmental", - "cards", - "concluded", - "Carl", - "250", - "accused", - "##ology", - "Girls", - "sick", - "intelligence", - "Margaret", - "responsibility", - "Guard", - "##tus", - "17th", - "sq", - "goods", - "1909", - "hate", - "##ek", - "capture", - "stores", - "Gray", - "comic", - "Modern", - "Silver", - "Andy", - "electronic", - "wheel", - "##ied", - "Deputy", - "##bs", - "Czech", - "zone", - "choose", - "constant", - "reserve", - "##lle", - "Tokyo", - "spirit", - "sub", - "degrees", - "flew", - "pattern", - "compete", - "Dance", - "##ik", - "secretary", - "Imperial", - "99", - "reduce", - "Hungarian", - "confused", - "##rin", - "Pierre", - "describes", - "regularly", - "Rachel", - "85", - "landed", - "passengers", - "##ise", - "##sis", - "historian", - "meters", - "Youth", - "##ud", - "participate", - "##cing", - "arrival", - "tired", - "Mother", - "##gy", - "jumped", - "Kentucky", - "faces", - "feed", - "Israeli", - "Ocean", - "##Q", - "##án", - "plus", - "snow", - "techniques", - "plate", - "sections", - "falls", - "jazz", - "##ris", - "tank", - "loan", - "repeated", - "opinion", - "##res", - "unless", - "rugby", - "journal", - "Lawrence", - "moments", - "shock", - "distributed", - "##ded", - "adjacent", - "Argentina", - "crossing", - "uncle", - "##ric", - "Detroit", - "communication", - "mental", - "tomorrow", - "session", - "Emma", - "Without", - "##gen", - "Miami", - "charges", - "Administration", - "hits", - "coat", - "protected", - "Cole", - "invasion", - "priest", - "09", - "Gary", - "enjoyed", - "plot", - "measure", - "bound", - "friendly", - "throw", - "musician", - "##lon", - "##ins", - "Age", - "knife", - "damaged", - "birds", - "driven", - "lit", - "ears", - "breathing", - "Arabic", - "Jan", - "faster", - "Jonathan", - "##gate", - "Independent", - "starred", - "Harris", - "teachers", - "Alice", - "sequence", - "mph", - "file", - "translated", - "decide", - "determine", - "Review", - "documents", - "sudden", - "threatened", - "##ft", - "bear", - "distinct", - "decade", - "burning", - "##sky", - "1930s", - "replace", - "begun", - "extension", - "##time", - "1904", - "equivalent", - "accompanied", - "Christopher", - "Danish", - "##ye", - "Besides", - "##more", - "persons", - "fallen", - "Rural", - "roughly", - "saved", - "willing", - "ensure", - "Belgium", - "05", - "musicians", - "##ang", - "giant", - "Six", - "Retrieved", - "worst", - "purposes", - "##bly", - "mountains", - "seventh", - "slipped", - "brick", - "07", - "##py", - "somehow", - "Carter", - "Iraq", - "cousin", - "favor", - "islands", - "journey", - "FIFA", - "contrast", - "planet", - "vs", - "calm", - "##ings", - "concrete", - "branches", - "gray", - "profit", - "Russell", - "##ae", - "##ux", - "##ens", - "philosophy", - "businesses", - "talked", - "parking", - "##ming", - "owners", - "Place", - "##tle", - "agricultural", - "Kate", - "06", - "southeast", - "draft", - "Eddie", - "earliest", - "forget", - "Dallas", - "Commonwealth", - "edited", - "66", - "inner", - "ed", - "operates", - "16th", - "Harvard", - "assistance", - "##si", - "designs", - "Take", - "bathroom", - "indicate", - "CEO", - "Command", - "Louisiana", - "1902", - "Dublin", - "Books", - "1901", - "tropical", - "1903", - "##tors", - "Places", - "tie", - "progress", - "forming", - "solution", - "62", - "letting", - "##ery", - "studying", - "##jo", - "duties", - "Baseball", - "taste", - "Reserve", - "##ru", - "Ann", - "##gh", - "visible", - "##vi", - "notably", - "link", - "NCAA", - "southwest", - "Never", - "storage", - "mobile", - "writers", - "favorite", - "Pro", - "pages", - "truly", - "count", - "##tta", - "string", - "kid", - "98", - "Ross", - "row", - "##idae", - "Kennedy", - "##tan", - "Hockey", - "hip", - "waist", - "grandfather", - "listen", - "##ho", - "feels", - "busy", - "72", - "stream", - "obvious", - "cycle", - "shaking", - "Knight", - "##ren", - "Carlos", - "painter", - "trail", - "web", - "linked", - "04", - "Palace", - "existed", - "##ira", - "responded", - "closing", - "End", - "examples", - "Marshall", - "weekend", - "jaw", - "Denmark", - "lady", - "township", - "medium", - "chin", - "Story", - "option", - "fifteen", - "Moon", - "represents", - "makeup", - "investment", - "jump", - "childhood", - "Oklahoma", - "roll", - "normally", - "Ten", - "Operation", - "Graham", - "Seattle", - "Atlanta", - "paused", - "promised", - "rejected", - "treated", - "returns", - "flag", - "##ita", - "Hungary", - "danger", - "glad", - "movements", - "visual", - "subjects", - "credited", - "soldier", - "Norman", - "ill", - "translation", - "José", - "Quebec", - "medicine", - "warning", - "theater", - "praised", - "municipal", - "01", - "commune", - "churches", - "acid", - "folk", - "8th", - "testing", - "add", - "survive", - "Sound", - "devices", - "residential", - "severe", - "presidential", - "Mississippi", - "Austin", - "Perhaps", - "Charlotte", - "hanging", - "Montreal", - "grin", - "##ten", - "racial", - "partnership", - "shoot", - "shift", - "##nie", - "Les", - "downtown", - "Brothers", - "Garden", - "matters", - "restored", - "mirror", - "forever", - "winners", - "rapidly", - "poverty", - "##ible", - "Until", - "DC", - "faith", - "hundreds", - "Real", - "Ukraine", - "Nelson", - "balance", - "Adams", - "contest", - "relative", - "ethnic", - "Edinburgh", - "composition", - "##nts", - "emergency", - "##van", - "marine", - "reputation", - "Down", - "pack", - "12th", - "Communist", - "Mountains", - "pro", - "stages", - "measures", - "##ld", - "ABC", - "Li", - "victims", - "benefit", - "Iowa", - "Broadway", - "gathered", - "rating", - "Defense", - "classic", - "##ily", - "ceiling", - "##ions", - "snapped", - "Everything", - "constituency", - "Franklin", - "Thompson", - "Stewart", - "entering", - "Judge", - "forth", - "##sk", - "wanting", - "smiling", - "moves", - "tunnel", - "premiered", - "grass", - "unusual", - "Ukrainian", - "bird", - "Friday", - "tail", - "Portugal", - "coal", - "element", - "Fred", - "guards", - "Senator", - "collaboration", - "beauty", - "Wood", - "chemical", - "beer", - "justice", - "signs", - "##Z", - "sees", - "##zi", - "Puerto", - "##zed", - "96", - "smooth", - "Bowl", - "gift", - "limit", - "97", - "heading", - "Source", - "wake", - "requires", - "Ed", - "Constitution", - "factor", - "Lane", - "factors", - "adding", - "Note", - "cleared", - "pictures", - "pink", - "##ola", - "Kent", - "Local", - "Singh", - "moth", - "Ty", - "##ture", - "courts", - "Seven", - "temporary", - "involving", - "Vienna", - "emerged", - "fishing", - "agree", - "defensive", - "stuck", - "secure", - "Tamil", - "##ick", - "bottle", - "03", - "Player", - "instruments", - "Spring", - "patient", - "flesh", - "contributions", - "cry", - "Malaysia", - "120", - "Global", - "da", - "Alabama", - "Within", - "##work", - "debuted", - "expect", - "Cleveland", - "concerns", - "retained", - "horror", - "10th", - "spending", - "Peace", - "Transport", - "grand", - "Crown", - "instance", - "institution", - "acted", - "Hills", - "mounted", - "Campbell", - "shouldn", - "1898", - "##ably", - "chamber", - "soil", - "88", - "Ethan", - "sand", - "cheeks", - "##gi", - "marry", - "61", - "weekly", - "classification", - "DNA", - "Elementary", - "Roy", - "definitely", - "Soon", - "Rights", - "gate", - "suggests", - "aspects", - "imagine", - "golden", - "beating", - "Studios", - "Warren", - "differences", - "significantly", - "glance", - "occasionally", - "##od", - "clothing", - "Assistant", - "depth", - "sending", - "possibility", - "mode", - "prisoners", - "requirements", - "daughters", - "dated", - "Representatives", - "prove", - "guilty", - "interesting", - "smoke", - "cricket", - "93", - "##ates", - "rescue", - "Connecticut", - "underground", - "Opera", - "13th", - "reign", - "##ski", - "thanks", - "leather", - "equipped", - "routes", - "fan", - "##ans", - "script", - "Wright", - "bishop", - "Welsh", - "jobs", - "faculty", - "eleven", - "Railroad", - "appearing", - "anniversary", - "Upper", - "##down", - "anywhere", - "Rugby", - "Metropolitan", - "Meanwhile", - "Nicholas", - "champions", - "forehead", - "mining", - "drinking", - "76", - "Jerry", - "membership", - "Brazilian", - "Wild", - "Rio", - "scheme", - "Unlike", - "strongly", - "##bility", - "fill", - "##rian", - "easier", - "MP", - "Hell", - "##sha", - "Stanley", - "banks", - "Baron", - "##ique", - "Robinson", - "67", - "Gabriel", - "Austrian", - "Wayne", - "exposed", - "##wan", - "Alfred", - "1899", - "manage", - "mix", - "visitors", - "eating", - "##rate", - "Sean", - "commission", - "Cemetery", - "policies", - "Camp", - "parallel", - "traveled", - "guitarist", - "02", - "supplies", - "couples", - "poem", - "blocks", - "Rick", - "Training", - "Energy", - "achieve", - "appointment", - "Wing", - "Jamie", - "63", - "novels", - "##em", - "1890", - "songwriter", - "Base", - "Jay", - "##gar", - "naval", - "scared", - "miss", - "labor", - "technique", - "crisis", - "Additionally", - "backed", - "destroy", - "seriously", - "tools", - "tennis", - "91", - "god", - "##ington", - "continuing", - "steam", - "obviously", - "Bobby", - "adapted", - "fifty", - "enjoy", - "Jacob", - "publishing", - "column", - "##ular", - "Baltimore", - "Donald", - "Liverpool", - "92", - "drugs", - "movies", - "##ock", - "Heritage", - "##je", - "##istic", - "vocal", - "strategy", - "gene", - "advice", - "##bi", - "Ottoman", - "riding", - "##side", - "Agency", - "Indonesia", - "11th", - "laughing", - "sleeping", - "und", - "muttered", - "listening", - "deck", - "tip", - "77", - "ownership", - "grey", - "Claire", - "deeply", - "provincial", - "popularity", - "Cooper", - "##á", - "Emily", - "##sed", - "designer", - "Murray", - "describe", - "Danny", - "Around", - "Parker", - "##dae", - "68", - "rates", - "suffering", - "considerable", - "78", - "nervous", - "powered", - "tons", - "circumstances", - "wished", - "belonged", - "Pittsburgh", - "flows", - "9th", - "##use", - "belt", - "81", - "useful", - "15th", - "context", - "List", - "Dead", - "Iron", - "seek", - "Season", - "worn", - "frequency", - "legislation", - "replacement", - "memories", - "Tournament", - "Again", - "Barry", - "organisation", - "copy", - "Gulf", - "waters", - "meets", - "struggle", - "Oliver", - "1895", - "Susan", - "protest", - "kick", - "Alliance", - "components", - "1896", - "Tower", - "Windows", - "demanded", - "regiment", - "sentence", - "Woman", - "Logan", - "Referee", - "hosts", - "debate", - "knee", - "Blood", - "##oo", - "universities", - "practices", - "Ward", - "ranking", - "correct", - "happening", - "Vincent", - "attracted", - "classified", - "##stic", - "processes", - "immediate", - "waste", - "increasingly", - "Helen", - "##po", - "Lucas", - "Phil", - "organ", - "1897", - "tea", - "suicide", - "actors", - "lb", - "crash", - "approval", - "waves", - "##ered", - "hated", - "grip", - "700", - "amongst", - "69", - "74", - "hunting", - "dying", - "lasted", - "illegal", - "##rum", - "stare", - "defeating", - "##gs", - "shrugged", - "°C", - "Jon", - "Count", - "Orleans", - "94", - "affairs", - "formally", - "##and", - "##ves", - "criticized", - "Disney", - "Vol", - "successor", - "tests", - "scholars", - "palace", - "Would", - "celebrated", - "rounds", - "grant", - "Schools", - "Such", - "commanded", - "demon", - "Romania", - "##all", - "Karl", - "71", - "##yn", - "84", - "Daily", - "totally", - "Medicine", - "fruit", - "Die", - "upset", - "Lower", - "Conservative", - "14th", - "Mitchell", - "escaped", - "shoes", - "Morris", - "##tz", - "queen", - "harder", - "prime", - "Thanks", - "indeed", - "Sky", - "authors", - "rocks", - "definition", - "Nazi", - "accounts", - "printed", - "experiences", - "##ters", - "divisions", - "Cathedral", - "denied", - "depending", - "Express", - "##let", - "73", - "appeal", - "loose", - "colors", - "filed", - "##isation", - "gender", - "##ew", - "throne", - "forests", - "Finland", - "domain", - "boats", - "Baker", - "squadron", - "shore", - "remove", - "##ification", - "careful", - "wound", - "railroad", - "82", - "seeking", - "agents", - "##ved", - "Blues", - "##off", - "customers", - "ignored", - "net", - "##ction", - "hiding", - "Originally", - "declined", - "##ess", - "franchise", - "eliminated", - "NBA", - "merely", - "pure", - "appropriate", - "visiting", - "forty", - "markets", - "offensive", - "coverage", - "cave", - "##nia", - "spell", - "##lar", - "Benjamin", - "##ire", - "Convention", - "filmed", - "Trade", - "##sy", - "##ct", - "Having", - "palm", - "1889", - "Evans", - "intense", - "plastic", - "Julia", - "document", - "jeans", - "vessel", - "SR", - "##fully", - "proposal", - "Birmingham", - "le", - "##ative", - "assembly", - "89", - "fund", - "lock", - "1893", - "AD", - "meetings", - "occupation", - "modified", - "Years", - "odd", - "aimed", - "reform", - "Mission", - "Works", - "shake", - "cat", - "exception", - "convinced", - "executed", - "pushing", - "dollars", - "replacing", - "soccer", - "manufacturing", - "##ros", - "expensive", - "kicked", - "minimum", - "Josh", - "coastal", - "Chase", - "ha", - "Thailand", - "publications", - "deputy", - "Sometimes", - "Angel", - "effectively", - "##illa", - "criticism", - "conduct", - "Serbian", - "landscape", - "NY", - "absence", - "passage", - "##ula", - "Blake", - "Indians", - "1892", - "admit", - "Trophy", - "##ball", - "Next", - "##rated", - "##ians", - "charts", - "kW", - "orchestra", - "79", - "heritage", - "1894", - "rough", - "exists", - "boundary", - "Bible", - "Legislative", - "moon", - "medieval", - "##over", - "cutting", - "print", - "##ett", - "birthday", - "##hood", - "destruction", - "Julian", - "injuries", - "influential", - "sisters", - "raising", - "statue", - "colour", - "dancing", - "characteristics", - "orange", - "##ok", - "##aries", - "Ken", - "colonial", - "twin", - "Larry", - "surviving", - "##shi", - "Barbara", - "personality", - "entertainment", - "assault", - "##ering", - "talent", - "happens", - "license", - "86", - "couch", - "Century", - "soundtrack", - "shower", - "swimming", - "cash", - "Staff", - "bent", - "1885", - "bay", - "lunch", - "##lus", - "dozen", - "vessels", - "CBS", - "greatly", - "critic", - "Test", - "symbol", - "panel", - "shell", - "output", - "reaches", - "87", - "Front", - "motor", - "ocean", - "##era", - "##ala", - "maintenance", - "violent", - "scent", - "Limited", - "Las", - "Hope", - "Theater", - "Which", - "survey", - "Robin", - "recordings", - "compilation", - "##ward", - "bomb", - "insurance", - "Authority", - "sponsored", - "satellite", - "Jazz", - "refer", - "stronger", - "blow", - "whilst", - "Wrestling", - "suggest", - "##rie", - "climbed", - "##els", - "voices", - "shopping", - "1891", - "Neil", - "discovery", - "##vo", - "##ations", - "burst", - "Baby", - "peaked", - "Brooklyn", - "knocked", - "lift", - "##try", - "false", - "nations", - "Hugh", - "Catherine", - "preserved", - "distinguished", - "terminal", - "resolution", - "ratio", - "pants", - "cited", - "competitions", - "completion", - "DJ", - "bone", - "uniform", - "schedule", - "shouted", - "83", - "1920s", - "rarely", - "Basketball", - "Taiwan", - "artistic", - "bare", - "vampires", - "arrest", - "Utah", - "Marcus", - "assist", - "gradually", - "qualifying", - "Victorian", - "vast", - "rival", - "Warner", - "Terry", - "Economic", - "##cia", - "losses", - "boss", - "versus", - "audio", - "runner", - "apply", - "surgery", - "Play", - "twisted", - "comfortable", - "##cs", - "Everyone", - "guests", - "##lt", - "Harrison", - "UEFA", - "lowered", - "occasions", - "##lly", - "##cher", - "chapter", - "youngest", - "eighth", - "Culture", - "##room", - "##stone", - "1888", - "Songs", - "Seth", - "Digital", - "involvement", - "expedition", - "relationships", - "signing", - "1000", - "fault", - "annually", - "circuit", - "afterwards", - "meat", - "creature", - "##ou", - "cable", - "Bush", - "##net", - "Hispanic", - "rapid", - "gonna", - "figured", - "extent", - "considering", - "cried", - "##tin", - "sigh", - "dynasty", - "##ration", - "cabinet", - "Richmond", - "stable", - "##zo", - "1864", - "Admiral", - "Unit", - "occasion", - "shares", - "badly", - "longest", - "##ify", - "Connor", - "extreme", - "wondering", - "girlfriend", - "Studio", - "##tions", - "1865", - "tribe", - "exact", - "muscles", - "hat", - "Luis", - "Orthodox", - "decisions", - "amateur", - "description", - "##lis", - "hips", - "kingdom", - "##ute", - "Portland", - "whereas", - "Bachelor", - "outer", - "discussion", - "partly", - "Arkansas", - "1880", - "dreams", - "perfectly", - "Lloyd", - "##bridge", - "asleep", - "##tti", - "Greg", - "permission", - "trading", - "pitch", - "mill", - "Stage", - "liquid", - "Keith", - "##tal", - "wolf", - "processing", - "stick", - "Jerusalem", - "profile", - "rushed", - "spiritual", - "argument", - "Ice", - "Guy", - "till", - "Delhi", - "roots", - "Section", - "missions", - "Glasgow", - "penalty", - "NBC", - "encouraged", - "identify", - "keyboards", - "##zing", - "##ston", - "disc", - "plain", - "informed", - "Bernard", - "thinks", - "fled", - "Justin", - "##day", - "newspapers", - "##wick", - "Ralph", - "##zer", - "unlike", - "Stars", - "artillery", - "##ified", - "recovered", - "arrangement", - "searching", - "##pers", - "##tory", - "##rus", - "deaths", - "Egyptian", - "diameter", - "##í", - "marketing", - "corporate", - "teach", - "marks", - "Turner", - "staying", - "hallway", - "Sebastian", - "chapel", - "naked", - "mistake", - "possession", - "1887", - "dominated", - "jacket", - "creative", - "Fellow", - "Falls", - "Defence", - "suspended", - "employment", - "##rry", - "Hebrew", - "Hudson", - "Week", - "Wars", - "recognize", - "Natural", - "controversial", - "Tommy", - "thank", - "Athletic", - "benefits", - "decline", - "intention", - "##ets", - "Lost", - "Wall", - "participation", - "elevation", - "supports", - "parliament", - "1861", - "concentration", - "Movement", - "##IS", - "competing", - "stops", - "behalf", - "##mm", - "limits", - "funded", - "discuss", - "Collins", - "departure", - "obtain", - "woods", - "latest", - "universe", - "alcohol", - "Laura", - "rush", - "blade", - "funny", - "Dennis", - "forgotten", - "Amy", - "Symphony", - "apparent", - "graduating", - "1862", - "Rob", - "Grey", - "collections", - "Mason", - "emotions", - "##ugh", - "literally", - "Any", - "counties", - "1863", - "nomination", - "fighter", - "habitat", - "respond", - "external", - "Capital", - "exit", - "Video", - "carbon", - "sharing", - "Bad", - "opportunities", - "Perry", - "photo", - "##mus", - "Orange", - "posted", - "remainder", - "transportation", - "portrayed", - "Labor", - "recommended", - "percussion", - "rated", - "Grade", - "rivers", - "partially", - "suspected", - "strip", - "adults", - "button", - "struggled", - "intersection", - "Canal", - "##ability", - "poems", - "claiming", - "Madrid", - "1886", - "Together", - "##our", - "Much", - "Vancouver", - "instrument", - "instrumental", - "1870", - "mad", - "angle", - "Control", - "Phoenix", - "Leo", - "Communications", - "mail", - "##ette", - "##ev", - "preferred", - "adaptation", - "alleged", - "discussed", - "deeper", - "##ane", - "Yet", - "Monday", - "volumes", - "thrown", - "Zane", - "##logy", - "displayed", - "rolling", - "dogs", - "Along", - "Todd", - "##ivity", - "withdrew", - "representation", - "belief", - "##sia", - "crown", - "Late", - "Short", - "hardly", - "grinned", - "romantic", - "Pete", - "##ken", - "networks", - "enemies", - "Colin", - "Eventually", - "Side", - "donated", - "##su", - "steady", - "grab", - "guide", - "Finnish", - "Milan", - "pregnant", - "controversy", - "reminded", - "1884", - "Stuart", - "##bach", - "##ade", - "Race", - "Belgian", - "LP", - "Production", - "Zone", - "lieutenant", - "infantry", - "Child", - "confusion", - "sang", - "resident", - "##ez", - "victim", - "1881", - "channels", - "Ron", - "businessman", - "##gle", - "Dick", - "colony", - "pace", - "producers", - "##ese", - "agencies", - "Craig", - "Lucy", - "Very", - "centers", - "Yorkshire", - "photography", - "##ched", - "Album", - "championships", - "Metro", - "substantial", - "Standard", - "terrible", - "directors", - "contribution", - "advertising", - "emotional", - "##its", - "layer", - "segment", - "sir", - "folded", - "Roberts", - "ceased", - "Hampshire", - "##ray", - "detailed", - "partners", - "m²", - "##pt", - "Beth", - "genre", - "commented", - "generated", - "remote", - "aim", - "Hans", - "credits", - "concerts", - "periods", - "breakfast", - "gay", - "shadow", - "defence", - "Too", - "Had", - "transition", - "Afghanistan", - "##book", - "eggs", - "defend", - "##lli", - "writes", - "Systems", - "bones", - "mess", - "seed", - "scientists", - "Shortly", - "Romanian", - "##zy", - "Freedom", - "muscle", - "hero", - "parent", - "agriculture", - "checked", - "Islam", - "Bristol", - "Freyja", - "Arena", - "cabin", - "Germans", - "electricity", - "ranks", - "viewed", - "medals", - "Wolf", - "associate", - "Madison", - "Sorry", - "fort", - "Chile", - "detail", - "widespread", - "attorney", - "boyfriend", - "##nan", - "Students", - "Spencer", - "##ig", - "bite", - "Maine", - "demolished", - "Lisa", - "erected", - "Someone", - "operational", - "Commissioner", - "NHL", - "Coach", - "Bar", - "forcing", - "Dream", - "Rico", - "cargo", - "Murphy", - "##fish", - "##ase", - "distant", - "##master", - "##ora", - "Organization", - "doorway", - "Steven", - "traded", - "electrical", - "frequent", - "##wn", - "Branch", - "Sure", - "1882", - "placing", - "Manhattan", - "attending", - "attributed", - "excellent", - "pounds", - "ruling", - "principles", - "component", - "Mediterranean", - "Vegas", - "machines", - "percentage", - "infrastructure", - "throwing", - "affiliated", - "Kings", - "secured", - "Caribbean", - "Track", - "Ted", - "honour", - "opponent", - "Virgin", - "Construction", - "grave", - "produces", - "Challenge", - "stretched", - "paying", - "murmured", - "##ata", - "integrated", - "waved", - "Nathan", - "##ator", - "transmission", - "videos", - "##yan", - "##hu", - "Nova", - "descent", - "AM", - "Harold", - "conservative", - "Therefore", - "venue", - "competitive", - "##ui", - "conclusion", - "funeral", - "confidence", - "releases", - "scholar", - "##sson", - "Treaty", - "stress", - "mood", - "##sm", - "Mac", - "residing", - "Action", - "Fund", - "##ship", - "animated", - "fitted", - "##kar", - "defending", - "voting", - "tend", - "##berry", - "answers", - "believes", - "##ci", - "helps", - "Aaron", - "##tis", - "themes", - "##lay", - "populations", - "Players", - "stroke", - "Trinity", - "electoral", - "paint", - "abroad", - "charity", - "keys", - "Fair", - "##pes", - "interrupted", - "participants", - "murdered", - "Days", - "supporters", - "##ab", - "expert", - "borders", - "mate", - "##llo", - "solar", - "architectural", - "tension", - "##bling", - "Parish", - "tape", - "operator", - "Cultural", - "Clinton", - "indicates", - "publisher", - "ordinary", - "sugar", - "arrive", - "rifle", - "acoustic", - "##uring", - "assets", - "##shire", - "SS", - "sufficient", - "options", - "HMS", - "Classic", - "bars", - "rebuilt", - "governments", - "Beijing", - "reporter", - "screamed", - "Abbey", - "crying", - "mechanical", - "instantly", - "communications", - "Political", - "cemetery", - "Cameron", - "Stop", - "representatives", - "USS", - "texts", - "mathematics", - "innings", - "civilian", - "Serbia", - "##hill", - "practical", - "patterns", - "dust", - "Faculty", - "debt", - "##end", - "##cus", - "junction", - "suppose", - "experimental", - "Computer", - "Food", - "wrist", - "abuse", - "dealing", - "bigger", - "cap", - "principle", - "##pin", - "Muhammad", - "Fleet", - "Collection", - "attempting", - "dismissed", - "##burn", - "regime", - "Herbert", - "##ua", - "shadows", - "1883", - "Eve", - "Lanka", - "1878", - "Performance", - "fictional", - "##lock", - "Noah", - "Run", - "Voivodeship", - "exercise", - "broadcasting", - "##fer", - "RAF", - "Magic", - "Bangladesh", - "suitable", - "##low", - "##del", - "styles", - "toured", - "Code", - "identical", - "links", - "insisted", - "110", - "flash", - "Model", - "slave", - "Derek", - "Rev", - "fairly", - "Greater", - "sole", - "##lands", - "connecting", - "zero", - "bench", - "##ome", - "switched", - "Fall", - "Owen", - "yours", - "Electric", - "shocked", - "convention", - "##bra", - "climb", - "memorial", - "swept", - "Racing", - "decides", - "belong", - "##nk", - "parliamentary", - "##und", - "ages", - "proof", - "##dan", - "delivery", - "1860", - "##ów", - "sad", - "publicly", - "leaning", - "Archbishop", - "dirt", - "##ose", - "categories", - "1876", - "burn", - "##bing", - "requested", - "Guinea", - "Historical", - "rhythm", - "relation", - "##heim", - "ye", - "pursue", - "merchant", - "##mes", - "lists", - "continuous", - "frowned", - "colored", - "tool", - "gods", - "involves", - "Duncan", - "photographs", - "Cricket", - "slight", - "Gregory", - "atmosphere", - "wider", - "Cook", - "##tar", - "essential", - "Being", - "FA", - "emperor", - "wealthy", - "nights", - "##bar", - "licensed", - "Hawaii", - "viewers", - "Language", - "load", - "nearest", - "milk", - "kilometers", - "platforms", - "##ys", - "territories", - "Rogers", - "sheet", - "Rangers", - "contested", - "##lation", - "isolated", - "assisted", - "swallowed", - "Small", - "Contemporary", - "Technical", - "Edwards", - "express", - "Volume", - "endemic", - "##ei", - "tightly", - "Whatever", - "indigenous", - "Colombia", - "##ulation", - "hp", - "characterized", - "##ida", - "Nigeria", - "Professional", - "duo", - "Soccer", - "slaves", - "Farm", - "smart", - "Attorney", - "Attendance", - "Common", - "salt", - "##vin", - "tribes", - "nod", - "sentenced", - "bid", - "sample", - "Drive", - "switch", - "instant", - "21st", - "Cuba", - "drunk", - "Alaska", - "proud", - "awareness", - "hitting", - "sessions", - "Thai", - "locally", - "elsewhere", - "Dragon", - "gentle", - "touching", - "##lee", - "Springs", - "Universal", - "Latino", - "spin", - "1871", - "Chart", - "recalled", - "Type", - "pointing", - "##ii", - "lowest", - "##ser", - "grandmother", - "Adelaide", - "Jacques", - "spotted", - "Buffalo", - "restoration", - "Son", - "Joan", - "farmers", - "Lily", - "1879", - "lucky", - "##dal", - "luck", - "eldest", - "##rant", - "Market", - "drummer", - "deployed", - "warned", - "prince", - "sing", - "amazing", - "sailed", - "##oon", - "1875", - "Primary", - "traveling", - "Masters", - "Sara", - "cattle", - "Trail", - "gang", - "Further", - "desert", - "relocated", - "##tch", - "##ord", - "Flight", - "illness", - "Munich", - "ninth", - "repair", - "Singles", - "##lated", - "Tyler", - "tossed", - "boots", - "Work", - "sized", - "earning", - "shoved", - "magazines", - "housed", - "dam", - "researchers", - "Former", - "spun", - "premiere", - "spaces", - "organised", - "wealth", - "crimes", - "devoted", - "stones", - "Urban", - "automatic", - "hop", - "affect", - "outstanding", - "tanks", - "mechanism", - "Muslims", - "Ms", - "shots", - "argue", - "Jeremy", - "connections", - "Armenian", - "increases", - "rubbed", - "1867", - "retail", - "gear", - "Pan", - "bonus", - "jurisdiction", - "weird", - "concerning", - "whisper", - "##gal", - "Microsoft", - "tenure", - "hills", - "www", - "Gmina", - "porch", - "files", - "reportedly", - "venture", - "Storm", - "##ence", - "Nature", - "killer", - "panic", - "fate", - "Secret", - "Wang", - "scream", - "drivers", - "belongs", - "Chamber", - "clan", - "monument", - "mixing", - "Peru", - "bet", - "Riley", - "Friends", - "Isaac", - "submarine", - "1877", - "130", - "judges", - "harm", - "ranging", - "affair", - "prepare", - "pupils", - "householder", - "Policy", - "decorated", - "Nation", - "slammed", - "activist", - "implemented", - "Room", - "qualify", - "Publishing", - "establishing", - "Baptist", - "touring", - "subsidiary", - "##nal", - "legend", - "1872", - "laughter", - "PC", - "Athens", - "settlers", - "ties", - "dual", - "dear", - "Draft", - "strategic", - "Ivan", - "reveal", - "closest", - "dominant", - "Ah", - "##ult", - "Denver", - "bond", - "boundaries", - "drafted", - "tables", - "##TV", - "eyed", - "Edition", - "##ena", - "1868", - "belonging", - "1874", - "Industrial", - "cream", - "Ridge", - "Hindu", - "scholarship", - "Ma", - "opens", - "initiated", - "##ith", - "yelled", - "compound", - "random", - "Throughout", - "grades", - "physics", - "sank", - "grows", - "exclusively", - "settle", - "Saints", - "brings", - "Amsterdam", - "Make", - "Hart", - "walks", - "battery", - "violin", - "##born", - "explanation", - "##ware", - "1873", - "##har", - "provinces", - "thrust", - "exclusive", - "sculpture", - "shops", - "##fire", - "VI", - "constitution", - "Barcelona", - "monster", - "Devon", - "Jefferson", - "Sullivan", - "bow", - "##din", - "desperate", - "##ć", - "Julie", - "##mon", - "##ising", - "terminus", - "Jesse", - "abilities", - "golf", - "##ple", - "##via", - "##away", - "Raymond", - "measured", - "jury", - "firing", - "revenue", - "suburb", - "Bulgarian", - "1866", - "##cha", - "timber", - "Things", - "##weight", - "Morning", - "spots", - "Alberta", - "Data", - "explains", - "Kyle", - "friendship", - "raw", - "tube", - "demonstrated", - "aboard", - "immigrants", - "reply", - "breathe", - "Manager", - "ease", - "##ban", - "##dia", - "Diocese", - "##vy", - "##ía", - "pit", - "ongoing", - "##lie", - "Gilbert", - "Costa", - "1940s", - "Report", - "voters", - "cloud", - "traditions", - "##MS", - "gallery", - "Jennifer", - "swung", - "Broadcasting", - "Does", - "diverse", - "reveals", - "arriving", - "initiative", - "##ani", - "Give", - "Allied", - "Pat", - "Outstanding", - "monastery", - "blind", - "Currently", - "##war", - "bloody", - "stopping", - "focuses", - "managing", - "Florence", - "Harvey", - "creatures", - "900", - "breast", - "internet", - "Artillery", - "purple", - "##mate", - "alliance", - "excited", - "fee", - "Brisbane", - "lifetime", - "Private", - "##aw", - "##nis", - "##gue", - "##ika", - "phrase", - "regulations", - "reflected", - "manufactured", - "conventional", - "pleased", - "client", - "##ix", - "##ncy", - "Pedro", - "reduction", - "##con", - "welcome", - "jail", - "comfort", - "Iranian", - "Norfolk", - "Dakota", - "##tein", - "evolution", - "everywhere", - "Initially", - "sensitive", - "Olivia", - "Oscar", - "implementation", - "sits", - "stolen", - "demands", - "slide", - "grandson", - "##ich", - "merger", - "##mic", - "Spirit", - "##°", - "ticket", - "root", - "difficulty", - "Nevada", - "##als", - "lined", - "Dylan", - "Original", - "Call", - "biological", - "EU", - "dramatic", - "##hn", - "Operations", - "treaty", - "gap", - "##list", - "Am", - "Romanized", - "moral", - "Butler", - "perspective", - "Furthermore", - "Manuel", - "absolutely", - "unsuccessful", - "disaster", - "dispute", - "preparation", - "tested", - "discover", - "##ach", - "shield", - "squeezed", - "brushed", - "battalion", - "Arnold", - "##ras", - "superior", - "treat", - "clinical", - "##so", - "Apple", - "Syria", - "Cincinnati", - "package", - "flights", - "editions", - "Leader", - "minority", - "wonderful", - "hang", - "Pop", - "Philippine", - "telephone", - "bell", - "honorary", - "##mar", - "balls", - "Democrat", - "dirty", - "thereafter", - "collapsed", - "Inside", - "slip", - "wrestling", - "##ín", - "listened", - "regard", - "bowl", - "None", - "Sport", - "completing", - "trapped", - "##view", - "copper", - "Wallace", - "Honor", - "blame", - "Peninsula", - "##ert", - "##oy", - "Anglo", - "bearing", - "simultaneously", - "honest", - "##ias", - "Mix", - "Got", - "speaker", - "voiced", - "impressed", - "prices", - "error", - "1869", - "##feld", - "trials", - "Nine", - "Industry", - "substitute", - "Municipal", - "departed", - "slept", - "##ama", - "Junction", - "Socialist", - "flower", - "dropping", - "comment", - "fantasy", - "##ress", - "arrangements", - "travelled", - "furniture", - "fist", - "relieved", - "##tics", - "Leonard", - "linear", - "earn", - "expand", - "Soul", - "Plan", - "Leeds", - "Sierra", - "accessible", - "innocent", - "Winner", - "Fighter", - "Range", - "winds", - "vertical", - "Pictures", - "101", - "charter", - "cooperation", - "prisoner", - "interviews", - "recognised", - "sung", - "manufacturer", - "exposure", - "submitted", - "Mars", - "leaf", - "gauge", - "screaming", - "likes", - "eligible", - "##ac", - "gathering", - "columns", - "##dra", - "belly", - "UN", - "maps", - "messages", - "speakers", - "##ants", - "garage", - "unincorporated", - "Number", - "Watson", - "sixteen", - "lots", - "beaten", - "Could", - "Municipality", - "##ano", - "Horse", - "talks", - "Drake", - "scores", - "Venice", - "genetic", - "##mal", - "##ère", - "Cold", - "Jose", - "nurse", - "traditionally", - "##bus", - "Territory", - "Key", - "Nancy", - "##win", - "thumb", - "São", - "index", - "dependent", - "carries", - "controls", - "Comics", - "coalition", - "physician", - "referring", - "Ruth", - "Based", - "restricted", - "inherited", - "internationally", - "stretch", - "THE", - "plates", - "margin", - "Holland", - "knock", - "significance", - "valuable", - "Kenya", - "carved", - "emotion", - "conservation", - "municipalities", - "overseas", - "resumed", - "Finance", - "graduation", - "blinked", - "temperatures", - "constantly", - "productions", - "scientist", - "ghost", - "cuts", - "permitted", - "##ches", - "firmly", - "##bert", - "patrol", - "##yo", - "Croatian", - "attacking", - "1850", - "portrait", - "promoting", - "sink", - "conversion", - "##kov", - "locomotives", - "Guide", - "##val", - "nephew", - "relevant", - "Marc", - "drum", - "originated", - "Chair", - "visits", - "dragged", - "Price", - "favour", - "corridor", - "properly", - "respective", - "Caroline", - "reporting", - "inaugural", - "1848", - "industries", - "##ching", - "edges", - "Christianity", - "Maurice", - "Trent", - "Economics", - "carrier", - "Reed", - "##gon", - "tribute", - "Pradesh", - "##ale", - "extend", - "attitude", - "Yale", - "##lu", - "settlements", - "glasses", - "taxes", - "targets", - "##ids", - "quarters", - "##ological", - "connect", - "hence", - "metre", - "collapse", - "underneath", - "banned", - "Future", - "clients", - "alternate", - "explosion", - "kinds", - "Commons", - "hungry", - "dragon", - "Chapel", - "Buddhist", - "lover", - "depression", - "pulls", - "##ges", - "##uk", - "origins", - "computers", - "crosses", - "kissing", - "assume", - "emphasis", - "lighting", - "##ites", - "personally", - "crashed", - "beam", - "touchdown", - "lane", - "comparison", - "##mont", - "Hitler", - "##las", - "execution", - "##ene", - "acre", - "sum", - "Pearl", - "ray", - "##point", - "essentially", - "worker", - "convicted", - "tear", - "Clay", - "recovery", - "Literature", - "Unfortunately", - "##row", - "partial", - "Petersburg", - "Bulgaria", - "coaching", - "evolved", - "reception", - "enters", - "narrowed", - "elevator", - "therapy", - "defended", - "pairs", - "##lam", - "breaks", - "Bennett", - "Uncle", - "cylinder", - "##ison", - "passion", - "bases", - "Actor", - "cancelled", - "battles", - "extensively", - "oxygen", - "Ancient", - "specialized", - "negotiations", - "##rat", - "acquisition", - "convince", - "interpretation", - "##00", - "photos", - "aspect", - "colleges", - "Artist", - "keeps", - "##wing", - "Croatia", - "##ona", - "Hughes", - "Otto", - "comments", - "##du", - "Ph", - "Sweet", - "adventure", - "describing", - "Student", - "Shakespeare", - "scattered", - "objective", - "Aviation", - "Phillips", - "Fourth", - "athletes", - "##hal", - "##tered", - "Guitar", - "intensity", - "née", - "dining", - "curve", - "Obama", - "topics", - "legislative", - "Mill", - "Cruz", - "##ars", - "Members", - "recipient", - "Derby", - "inspiration", - "corresponding", - "fed", - "YouTube", - "coins", - "pressing", - "intent", - "Karen", - "cinema", - "Delta", - "destination", - "shorter", - "Christians", - "imagined", - "canal", - "Newcastle", - "Shah", - "Adrian", - "super", - "Males", - "160", - "liberal", - "lord", - "bat", - "supplied", - "Claude", - "meal", - "worship", - "##atic", - "Han", - "wire", - "°F", - "##tha", - "punishment", - "thirteen", - "fighters", - "##ibility", - "1859", - "Ball", - "gardens", - "##ari", - "Ottawa", - "pole", - "indicating", - "Twenty", - "Higher", - "Bass", - "Ivy", - "farming", - "##urs", - "certified", - "Saudi", - "plenty", - "##ces", - "restaurants", - "Representative", - "Miles", - "payment", - "##inger", - "##rit", - "Confederate", - "festivals", - "references", - "##ić", - "Mario", - "PhD", - "playoffs", - "witness", - "rice", - "mask", - "saving", - "opponents", - "enforcement", - "automatically", - "relegated", - "##oe", - "radar", - "whenever", - "Financial", - "imperial", - "uncredited", - "influences", - "Abraham", - "skull", - "Guardian", - "Haven", - "Bengal", - "impressive", - "input", - "mixture", - "Warsaw", - "altitude", - "distinction", - "1857", - "collective", - "Annie", - "##ean", - "##bal", - "directions", - "Flying", - "##nic", - "faded", - "##ella", - "contributing", - "##ó", - "employee", - "##lum", - "##yl", - "ruler", - "oriented", - "conductor", - "focusing", - "##die", - "Giants", - "Mills", - "mines", - "Deep", - "curled", - "Jessica", - "guitars", - "Louise", - "procedure", - "Machine", - "failing", - "attendance", - "Nepal", - "Brad", - "Liam", - "tourist", - "exhibited", - "Sophie", - "depicted", - "Shaw", - "Chuck", - "##can", - "expecting", - "challenges", - "##nda", - "equally", - "resignation", - "##logical", - "Tigers", - "loop", - "pitched", - "outdoor", - "reviewed", - "hopes", - "True", - "temporarily", - "Borough", - "torn", - "jerked", - "collect", - "Berkeley", - "Independence", - "cotton", - "retreat", - "campaigns", - "participating", - "Intelligence", - "Heaven", - "##ked", - "situations", - "borough", - "Democrats", - "Harbor", - "##len", - "Liga", - "serial", - "circles", - "fourteen", - "##lot", - "seized", - "filling", - "departments", - "finance", - "absolute", - "Roland", - "Nate", - "floors", - "raced", - "struggling", - "deliver", - "protests", - "##tel", - "Exchange", - "efficient", - "experiments", - "##dar", - "faint", - "3D", - "binding", - "Lions", - "lightly", - "skill", - "proteins", - "difficulties", - "##cal", - "monthly", - "camps", - "flood", - "loves", - "Amanda", - "Commerce", - "##oid", - "##lies", - "elementary", - "##tre", - "organic", - "##stein", - "##ph", - "receives", - "Tech", - "enormous", - "distinctive", - "Joint", - "experiment", - "Circuit", - "citizen", - "##hy", - "shelter", - "ideal", - "practically", - "formula", - "addressed", - "Foster", - "Productions", - "##ax", - "variable", - "punk", - "Voice", - "fastest", - "concentrated", - "##oma", - "##yer", - "stored", - "surrender", - "vary", - "Sergeant", - "Wells", - "ward", - "Wait", - "##ven", - "playoff", - "reducing", - "cavalry", - "##dle", - "Venezuela", - "tissue", - "amounts", - "sweat", - "##we", - "Non", - "##nik", - "beetle", - "##bu", - "##tu", - "Jared", - "Hunt", - "##₂", - "fat", - "Sultan", - "Living", - "Circle", - "Secondary", - "Suddenly", - "reverse", - "##min", - "Travel", - "##bin", - "Lebanon", - "##mas", - "virus", - "Wind", - "dissolved", - "enrolled", - "holiday", - "Keep", - "helicopter", - "Clarke", - "constitutional", - "technologies", - "doubles", - "instructions", - "##ace", - "Azerbaijan", - "##ill", - "occasional", - "frozen", - "trick", - "wiped", - "writings", - "Shanghai", - "preparing", - "challenged", - "mainstream", - "summit", - "180", - "##arian", - "##rating", - "designation", - "##ada", - "revenge", - "filming", - "tightened", - "Miguel", - "Montana", - "reflect", - "celebration", - "bitch", - "flashed", - "signals", - "rounded", - "peoples", - "##tation", - "renowned", - "Google", - "characteristic", - "Campaign", - "sliding", - "##rman", - "usage", - "Record", - "Using", - "woke", - "solutions", - "holes", - "theories", - "logo", - "Protestant", - "relaxed", - "brow", - "nickname", - "Reading", - "marble", - "##tro", - "symptoms", - "Overall", - "capita", - "##ila", - "outbreak", - "revolution", - "deemed", - "Principal", - "Hannah", - "approaches", - "inducted", - "Wellington", - "vulnerable", - "Environmental", - "Drama", - "incumbent", - "Dame", - "1854", - "travels", - "samples", - "accurate", - "physically", - "Sony", - "Nashville", - "##sville", - "##lic", - "##og", - "Producer", - "Lucky", - "tough", - "Stanford", - "resort", - "repeatedly", - "eyebrows", - "Far", - "choir", - "commenced", - "##ep", - "##ridge", - "rage", - "swing", - "sequel", - "heir", - "buses", - "ad", - "Grove", - "##late", - "##rick", - "updated", - "##SA", - "Delaware", - "##fa", - "Athletics", - "warmth", - "Off", - "excitement", - "verse", - "Protection", - "Villa", - "corruption", - "intellectual", - "Jenny", - "##lyn", - "mystery", - "prayer", - "healthy", - "##ologist", - "Bear", - "lab", - "Ernest", - "Remix", - "register", - "basement", - "Montgomery", - "consistent", - "tier", - "1855", - "Preston", - "Brooks", - "##maker", - "vocalist", - "laboratory", - "delayed", - "wheels", - "rope", - "bachelor", - "pitcher", - "Block", - "Nevertheless", - "suspect", - "efficiency", - "Nebraska", - "siege", - "FBI", - "planted", - "##AC", - "Newton", - "breeding", - "##ain", - "eighteen", - "Argentine", - "encounter", - "servant", - "1858", - "elder", - "Shadow", - "Episode", - "fabric", - "doctors", - "survival", - "removal", - "chemistry", - "volunteers", - "Kane", - "variant", - "arrives", - "Eagle", - "Left", - "##fe", - "Jo", - "divorce", - "##ret", - "yesterday", - "Bryan", - "handling", - "diseases", - "customer", - "Sheriff", - "Tiger", - "Harper", - "##oi", - "resting", - "Linda", - "Sheffield", - "gasped", - "sexy", - "economics", - "alien", - "tale", - "footage", - "Liberty", - "yeah", - "fundamental", - "Ground", - "flames", - "Actress", - "photographer", - "Maggie", - "Additional", - "joke", - "custom", - "Survey", - "Abu", - "silk", - "consumption", - "Ellis", - "bread", - "##uous", - "engagement", - "puts", - "Dog", - "##hr", - "poured", - "guilt", - "CDP", - "boxes", - "hardware", - "clenched", - "##cio", - "stem", - "arena", - "extending", - "##com", - "examination", - "Steel", - "encountered", - "revised", - "140", - "picking", - "Car", - "hasn", - "Minor", - "pride", - "Roosevelt", - "boards", - "##mia", - "blocked", - "curious", - "drag", - "narrative", - "brigade", - "Prefecture", - "mysterious", - "namely", - "connects", - "Devil", - "historians", - "CHAPTER", - "quit", - "installation", - "Golf", - "empire", - "elevated", - "##eo", - "releasing", - "Bond", - "##uri", - "harsh", - "ban", - "##BA", - "contracts", - "cloth", - "presents", - "stake", - "chorus", - "##eau", - "swear", - "##mp", - "allies", - "generations", - "Motor", - "meter", - "pen", - "warrior", - "veteran", - "##EC", - "comprehensive", - "missile", - "interaction", - "instruction", - "Renaissance", - "rested", - "Dale", - "fix", - "fluid", - "les", - "investigate", - "loaded", - "widow", - "exhibit", - "artificial", - "select", - "rushing", - "tasks", - "signature", - "nowhere", - "Engineer", - "feared", - "Prague", - "bother", - "extinct", - "gates", - "Bird", - "climbing", - "heels", - "striking", - "artwork", - "hunt", - "awake", - "##hin", - "Formula", - "thereby", - "commitment", - "imprisoned", - "Beyond", - "##MA", - "transformed", - "Agriculture", - "Low", - "Movie", - "radical", - "complicated", - "Yellow", - "Auckland", - "mansion", - "tenth", - "Trevor", - "predecessor", - "##eer", - "disbanded", - "sucked", - "circular", - "witch", - "gaining", - "lean", - "Behind", - "illustrated", - "rang", - "celebrate", - "bike", - "consist", - "framework", - "##cent", - "Shane", - "owns", - "350", - "comprises", - "collaborated", - "colleagues", - "##cast", - "engage", - "fewer", - "##ave", - "1856", - "observation", - "diplomatic", - "legislature", - "improvements", - "Interstate", - "craft", - "MTV", - "martial", - "administered", - "jet", - "approaching", - "permanently", - "attraction", - "manuscript", - "numbered", - "Happy", - "Andrea", - "shallow", - "Gothic", - "Anti", - "##bad", - "improvement", - "trace", - "preserve", - "regardless", - "rode", - "dies", - "achievement", - "maintaining", - "Hamburg", - "spine", - "##air", - "flowing", - "encourage", - "widened", - "posts", - "##bound", - "125", - "Southeast", - "Santiago", - "##bles", - "impression", - "receiver", - "Single", - "closure", - "##unt", - "communist", - "honors", - "Northwest", - "105", - "##ulated", - "cared", - "un", - "hug", - "magnetic", - "seeds", - "topic", - "perceived", - "prey", - "prevented", - "Marvel", - "Eight", - "Michel", - "Transportation", - "rings", - "Gate", - "##gne", - "Byzantine", - "accommodate", - "floating", - "##dor", - "equation", - "ministry", - "##ito", - "##gled", - "Rules", - "earthquake", - "revealing", - "Brother", - "Celtic", - "blew", - "chairs", - "Panama", - "Leon", - "attractive", - "descendants", - "Care", - "Ambassador", - "tours", - "breathed", - "threatening", - "##cho", - "smiles", - "Lt", - "Beginning", - "##iness", - "fake", - "assists", - "fame", - "strings", - "Mobile", - "Liu", - "parks", - "http", - "1852", - "brush", - "Aunt", - "bullet", - "consciousness", - "##sta", - "##ther", - "consequences", - "gather", - "dug", - "1851", - "bridges", - "Doug", - "##sion", - "Artists", - "ignore", - "Carol", - "brilliant", - "radiation", - "temples", - "basin", - "clouds", - "##cted", - "Stevens", - "spite", - "soap", - "consumer", - "Damn", - "Snow", - "recruited", - "##craft", - "Advanced", - "tournaments", - "Quinn", - "undergraduate", - "questioned", - "Palmer", - "Annual", - "Others", - "feeding", - "Spider", - "printing", - "##orn", - "cameras", - "functional", - "Chester", - "readers", - "Alpha", - "universal", - "Faith", - "Brandon", - "François", - "authored", - "Ring", - "el", - "aims", - "athletic", - "possessed", - "Vermont", - "programmes", - "##uck", - "bore", - "Fisher", - "statements", - "shed", - "saxophone", - "neighboring", - "pronounced", - "barrel", - "bags", - "##dge", - "organisations", - "pilots", - "casualties", - "Kenneth", - "##brook", - "silently", - "Malcolm", - "span", - "Essex", - "anchor", - "##hl", - "virtual", - "lessons", - "Henri", - "Trump", - "Page", - "pile", - "locomotive", - "wounds", - "uncomfortable", - "sustained", - "Diana", - "Eagles", - "##pi", - "2000s", - "documented", - "##bel", - "Cassie", - "delay", - "kisses", - "##ines", - "variation", - "##ag", - "growled", - "##mark", - "##ways", - "Leslie", - "studios", - "Friedrich", - "aunt", - "actively", - "armor", - "eaten", - "historically", - "Better", - "purse", - "honey", - "ratings", - "##ée", - "naturally", - "1840", - "peer", - "Kenny", - "Cardinal", - "database", - "Looking", - "runners", - "handsome", - "Double", - "PA", - "##boat", - "##sted", - "protecting", - "##jan", - "Diamond", - "concepts", - "interface", - "##aki", - "Watch", - "Article", - "Columbus", - "dialogue", - "pause", - "##rio", - "extends", - "blanket", - "pulse", - "1853", - "affiliate", - "ladies", - "Ronald", - "counted", - "kills", - "demons", - "##zation", - "Airlines", - "Marco", - "Cat", - "companion", - "mere", - "Yugoslavia", - "Forum", - "Allan", - "pioneer", - "Competition", - "Methodist", - "patent", - "nobody", - "Stockholm", - "##ien", - "regulation", - "##ois", - "accomplished", - "##itive", - "washed", - "sake", - "Vladimir", - "crops", - "prestigious", - "humor", - "Sally", - "labour", - "tributary", - "trap", - "altered", - "examined", - "Mumbai", - "bombing", - "Ash", - "noble", - "suspension", - "ruins", - "##bank", - "spare", - "displays", - "guided", - "dimensional", - "Iraqi", - "##hon", - "sciences", - "Franz", - "relating", - "fence", - "followers", - "Palestine", - "invented", - "proceeded", - "Batman", - "Bradley", - "##yard", - "##ova", - "crystal", - "Kerala", - "##ima", - "shipping", - "handled", - "Want", - "abolished", - "Drew", - "##tter", - "Powell", - "Half", - "##table", - "##cker", - "exhibitions", - "Were", - "assignment", - "assured", - "##rine", - "Indonesian", - "Grammy", - "acknowledged", - "Kylie", - "coaches", - "structural", - "clearing", - "stationed", - "Say", - "Total", - "Rail", - "besides", - "glow", - "threats", - "afford", - "Tree", - "Musical", - "##pp", - "elite", - "centered", - "explore", - "Engineers", - "Stakes", - "Hello", - "tourism", - "severely", - "assessment", - "##tly", - "crack", - "politicians", - "##rrow", - "sheets", - "volunteer", - "##borough", - "##hold", - "announcement", - "recover", - "contribute", - "lungs", - "##ille", - "mainland", - "presentation", - "Johann", - "Writing", - "1849", - "##bird", - "Study", - "Boulevard", - "coached", - "fail", - "airline", - "Congo", - "Plus", - "Syrian", - "introduce", - "ridge", - "Casey", - "manages", - "##fi", - "searched", - "Support", - "succession", - "progressive", - "coup", - "cultures", - "##lessly", - "sensation", - "Cork", - "Elena", - "Sofia", - "Philosophy", - "mini", - "trunk", - "academy", - "Mass", - "Liz", - "practiced", - "Reid", - "##ule", - "satisfied", - "experts", - "Wilhelm", - "Woods", - "invitation", - "Angels", - "calendar", - "joy", - "Sr", - "Dam", - "packed", - "##uan", - "bastard", - "Workers", - "broadcasts", - "logic", - "cooking", - "backward", - "##ack", - "Chen", - "creates", - "enzyme", - "##xi", - "Davies", - "aviation", - "VII", - "Conservation", - "fucking", - "Knights", - "##kan", - "requiring", - "hectares", - "wars", - "ate", - "##box", - "Mind", - "desired", - "oak", - "absorbed", - "Really", - "Vietnamese", - "Paulo", - "athlete", - "##car", - "##eth", - "Talk", - "Wu", - "##cks", - "survivors", - "Yang", - "Joel", - "Almost", - "Holmes", - "Armed", - "Joshua", - "priests", - "discontinued", - "##sey", - "blond", - "Rolling", - "suggesting", - "CA", - "clay", - "exterior", - "Scientific", - "##sive", - "Giovanni", - "Hi", - "farther", - "contents", - "Winners", - "animation", - "neutral", - "mall", - "Notes", - "layers", - "professionals", - "Armstrong", - "Against", - "Piano", - "involve", - "monitor", - "angel", - "parked", - "bears", - "seated", - "feat", - "beliefs", - "##kers", - "Version", - "suffer", - "##ceae", - "guidance", - "##eur", - "honored", - "raid", - "alarm", - "Glen", - "Ellen", - "Jamaica", - "trio", - "enabled", - "##ils", - "procedures", - "##hus", - "moderate", - "upstairs", - "##ses", - "torture", - "Georgian", - "rebellion", - "Fernando", - "Nice", - "##are", - "Aires", - "Campus", - "beast", - "##hing", - "1847", - "##FA", - "Isle", - "##logist", - "Princeton", - "cathedral", - "Oakland", - "Solomon", - "##tto", - "Milwaukee", - "upcoming", - "midfielder", - "Neither", - "sacred", - "Eyes", - "appreciate", - "Brunswick", - "secrets", - "Rice", - "Somerset", - "Chancellor", - "Curtis", - "##gel", - "Rich", - "separation", - "grid", - "##los", - "##bon", - "urge", - "##ees", - "##ree", - "freight", - "towers", - "psychology", - "requirement", - "dollar", - "##fall", - "##sman", - "exile", - "tomb", - "Salt", - "Stefan", - "Buenos", - "Revival", - "Porter", - "tender", - "diesel", - "chocolate", - "Eugene", - "Legion", - "Laboratory", - "sheep", - "arched", - "hospitals", - "orbit", - "Full", - "##hall", - "drinks", - "ripped", - "##RS", - "tense", - "Hank", - "leagues", - "##nberg", - "PlayStation", - "fool", - "Punjab", - "relatives", - "Comedy", - "sur", - "1846", - "Tonight", - "Sox", - "##if", - "Rabbi", - "org", - "speaks", - "institute", - "defender", - "painful", - "wishes", - "Weekly", - "literacy", - "portions", - "snake", - "item", - "deals", - "##tum", - "autumn", - "sharply", - "reforms", - "thighs", - "prototype", - "##ition", - "argues", - "disorder", - "Physics", - "terror", - "provisions", - "refugees", - "predominantly", - "independently", - "march", - "##graphy", - "Arabia", - "Andrews", - "Bus", - "Money", - "drops", - "##zar", - "pistol", - "matrix", - "revolutionary", - "##ust", - "Starting", - "##ptic", - "Oak", - "Monica", - "##ides", - "servants", - "##hed", - "archaeological", - "divorced", - "rocket", - "enjoying", - "fires", - "##nel", - "assembled", - "qualification", - "retiring", - "##fied", - "Distinguished", - "handful", - "infection", - "Durham", - "##itz", - "fortune", - "renewed", - "Chelsea", - "##sley", - "curved", - "gesture", - "retain", - "exhausted", - "##ifying", - "Perth", - "jumping", - "Palestinian", - "Simpson", - "colonies", - "steal", - "##chy", - "corners", - "Finn", - "arguing", - "Martha", - "##var", - "Betty", - "emerging", - "Heights", - "Hindi", - "Manila", - "pianist", - "founders", - "regret", - "Napoleon", - "elbow", - "overhead", - "bold", - "praise", - "humanity", - "##ori", - "Revolutionary", - "##ere", - "fur", - "##ole", - "Ashley", - "Official", - "##rm", - "lovely", - "Architecture", - "##sch", - "Baronet", - "virtually", - "##OS", - "descended", - "immigration", - "##das", - "##kes", - "Holly", - "Wednesday", - "maintains", - "theatrical", - "Evan", - "Gardens", - "citing", - "##gia", - "segments", - "Bailey", - "Ghost", - "##city", - "governing", - "graphics", - "##ined", - "privately", - "potentially", - "transformation", - "Crystal", - "Cabinet", - "sacrifice", - "hesitated", - "mud", - "Apollo", - "Desert", - "bin", - "victories", - "Editor", - "Railways", - "Web", - "Case", - "tourists", - "Brussels", - "Franco", - "compiled", - "topped", - "Gene", - "engineers", - "commentary", - "egg", - "escort", - "nerve", - "arch", - "necessarily", - "frustration", - "Michelle", - "democracy", - "genes", - "Facebook", - "halfway", - "##ient", - "102", - "flipped", - "Won", - "##mit", - "NASA", - "Lynn", - "Provincial", - "ambassador", - "Inspector", - "glared", - "Change", - "McDonald", - "developments", - "tucked", - "noting", - "Gibson", - "circulation", - "dubbed", - "armies", - "resource", - "Headquarters", - "##iest", - "Mia", - "Albanian", - "Oil", - "Albums", - "excuse", - "intervention", - "Grande", - "Hugo", - "integration", - "civilians", - "depends", - "reserves", - "Dee", - "compositions", - "identification", - "restrictions", - "quarterback", - "Miranda", - "Universe", - "favourite", - "ranges", - "hint", - "loyal", - "Op", - "entity", - "Manual", - "quoted", - "dealt", - "specialist", - "Zhang", - "download", - "Westminster", - "Rebecca", - "streams", - "Anglican", - "variations", - "Mine", - "detective", - "Films", - "reserved", - "##oke", - "##key", - "sailing", - "##gger", - "expanding", - "recall", - "discovers", - "particles", - "behaviour", - "Gavin", - "blank", - "permit", - "Java", - "Fraser", - "Pass", - "##non", - "##TA", - "panels", - "statistics", - "notion", - "courage", - "dare", - "venues", - "##roy", - "Box", - "Newport", - "travelling", - "Thursday", - "warriors", - "Glenn", - "criteria", - "360", - "mutual", - "restore", - "varied", - "bitter", - "Katherine", - "##lant", - "ritual", - "bits", - "##à", - "Henderson", - "trips", - "Richardson", - "Detective", - "curse", - "psychological", - "Il", - "midnight", - "streak", - "facts", - "Dawn", - "Indies", - "Edmund", - "roster", - "Gen", - "##nation", - "1830", - "congregation", - "shaft", - "##ically", - "##mination", - "Indianapolis", - "Sussex", - "loving", - "##bit", - "sounding", - "horrible", - "Continental", - "Griffin", - "advised", - "magical", - "millions", - "##date", - "1845", - "Safety", - "lifting", - "determination", - "valid", - "dialect", - "Penn", - "Know", - "triple", - "avoided", - "dancer", - "judgment", - "sixty", - "farmer", - "lakes", - "blast", - "aggressive", - "Abby", - "tag", - "chains", - "inscription", - "##nn", - "conducting", - "Scout", - "buying", - "##wich", - "spreading", - "##OC", - "array", - "hurried", - "Environment", - "improving", - "prompted", - "fierce", - "Taking", - "Away", - "tune", - "pissed", - "Bull", - "catching", - "##ying", - "eyebrow", - "metropolitan", - "terrain", - "##rel", - "Lodge", - "manufacturers", - "creator", - "##etic", - "happiness", - "ports", - "##ners", - "Relations", - "fortress", - "targeted", - "##ST", - "allegedly", - "blues", - "##osa", - "Bosnia", - "##dom", - "burial", - "similarly", - "stranger", - "pursued", - "symbols", - "rebels", - "reflection", - "routine", - "traced", - "indoor", - "eventual", - "##ska", - "##ão", - "##una", - "MD", - "##phone", - "oh", - "grants", - "Reynolds", - "rid", - "operators", - "##nus", - "Joey", - "vital", - "siblings", - "keyboard", - "br", - "removing", - "societies", - "drives", - "solely", - "princess", - "lighter", - "Various", - "Cavalry", - "believing", - "SC", - "underwent", - "relay", - "smelled", - "syndrome", - "welfare", - "authorized", - "seemingly", - "Hard", - "chicken", - "##rina", - "Ages", - "Bo", - "democratic", - "barn", - "Eye", - "shorts", - "##coming", - "##hand", - "disappointed", - "unexpected", - "centres", - "Exhibition", - "Stories", - "Site", - "banking", - "accidentally", - "Agent", - "conjunction", - "André", - "Chloe", - "resist", - "width", - "Queens", - "provision", - "##art", - "Melissa", - "Honorary", - "Del", - "prefer", - "abruptly", - "duration", - "##vis", - "Glass", - "enlisted", - "##ado", - "discipline", - "Sisters", - "carriage", - "##ctor", - "##sburg", - "Lancashire", - "log", - "fuck", - "##iz", - "closet", - "collecting", - "holy", - "rape", - "trusted", - "cleaning", - "inhabited", - "Rocky", - "104", - "editorial", - "##yu", - "##ju", - "succeed", - "strict", - "Cuban", - "##iya", - "Bronze", - "outcome", - "##ifies", - "##set", - "corps", - "Hero", - "barrier", - "Kumar", - "groaned", - "Nina", - "Burton", - "enable", - "stability", - "Milton", - "knots", - "##ination", - "slavery", - "##borg", - "curriculum", - "trailer", - "warfare", - "Dante", - "Edgar", - "revival", - "Copenhagen", - "define", - "advocate", - "Garrett", - "Luther", - "overcome", - "pipe", - "750", - "construct", - "Scotia", - "kings", - "flooding", - "##hard", - "Ferdinand", - "Felix", - "forgot", - "Fish", - "Kurt", - "elaborate", - "##BC", - "graphic", - "gripped", - "colonel", - "Sophia", - "Advisory", - "Self", - "##uff", - "##lio", - "monitoring", - "seal", - "senses", - "rises", - "peaceful", - "journals", - "1837", - "checking", - "legendary", - "Ghana", - "##power", - "ammunition", - "Rosa", - "Richards", - "nineteenth", - "ferry", - "aggregate", - "Troy", - "inter", - "##wall", - "Triple", - "steep", - "tent", - "Cyprus", - "1844", - "##woman", - "commanding", - "farms", - "doi", - "navy", - "specified", - "na", - "cricketer", - "transported", - "Think", - "comprising", - "grateful", - "solve", - "##core", - "beings", - "clerk", - "grain", - "vector", - "discrimination", - "##TC", - "Katie", - "reasonable", - "drawings", - "veins", - "consideration", - "Monroe", - "repeat", - "breed", - "dried", - "witnessed", - "ordained", - "Current", - "spirits", - "remarkable", - "consultant", - "urged", - "Remember", - "anime", - "singers", - "phenomenon", - "Rhode", - "Carlo", - "demanding", - "findings", - "manual", - "varying", - "Fellowship", - "generate", - "safely", - "heated", - "withdrawn", - "##ao", - "headquartered", - "##zon", - "##lav", - "##ency", - "Col", - "Memphis", - "imposed", - "rivals", - "Planet", - "healing", - "##hs", - "ensemble", - "Warriors", - "##bone", - "cult", - "Frankfurt", - "##HL", - "diversity", - "Gerald", - "intermediate", - "##izes", - "reactions", - "Sister", - "##ously", - "##lica", - "quantum", - "awkward", - "mentions", - "pursuit", - "##ography", - "varies", - "profession", - "molecular", - "consequence", - "lectures", - "cracked", - "103", - "slowed", - "##tsu", - "cheese", - "upgraded", - "suite", - "substance", - "Kingston", - "1800", - "Idaho", - "Theory", - "##een", - "ain", - "Carson", - "Molly", - "##OR", - "configuration", - "Whitney", - "reads", - "audiences", - "##tie", - "Geneva", - "Outside", - "##nen", - "##had", - "transit", - "volleyball", - "Randy", - "Chad", - "rubber", - "motorcycle", - "respected", - "eager", - "Level", - "coin", - "##lets", - "neighbouring", - "##wski", - "confident", - "##cious", - "poll", - "uncertain", - "punch", - "thesis", - "Tucker", - "IATA", - "Alec", - "##ographic", - "##law", - "1841", - "desperately", - "1812", - "Lithuania", - "accent", - "Cox", - "lightning", - "skirt", - "##load", - "Burns", - "Dynasty", - "##ug", - "chapters", - "Working", - "dense", - "Morocco", - "##kins", - "casting", - "Set", - "activated", - "oral", - "Brien", - "horn", - "HIV", - "dawn", - "stumbled", - "altar", - "tore", - "considerably", - "Nicole", - "interchange", - "registration", - "biography", - "Hull", - "Stan", - "bulk", - "consent", - "Pierce", - "##ER", - "Fifth", - "marched", - "terrorist", - "##piece", - "##itt", - "Presidential", - "Heather", - "staged", - "Plant", - "relegation", - "sporting", - "joins", - "##ced", - "Pakistani", - "dynamic", - "Heat", - "##lf", - "ourselves", - "Except", - "Elliott", - "nationally", - "goddess", - "investors", - "Burke", - "Jackie", - "##ā", - "##RA", - "Tristan", - "Associate", - "Tuesday", - "scope", - "Near", - "bunch", - "##abad", - "##ben", - "sunlight", - "##aire", - "manga", - "Willie", - "trucks", - "boarding", - "Lion", - "lawsuit", - "Learning", - "Der", - "pounding", - "awful", - "##mine", - "IT", - "Legend", - "romance", - "Serie", - "AC", - "gut", - "precious", - "Robertson", - "hometown", - "realm", - "Guards", - "Tag", - "batting", - "##vre", - "halt", - "conscious", - "1838", - "acquire", - "collar", - "##gg", - "##ops", - "Herald", - "nationwide", - "citizenship", - "Aircraft", - "decrease", - "em", - "Fiction", - "Female", - "corporation", - "Located", - "##ip", - "fights", - "unconscious", - "Tampa", - "Poetry", - "lobby", - "Malta", - "##sar", - "##bie", - "layout", - "Tate", - "reader", - "stained", - "##bre", - "##rst", - "##ulate", - "loudly", - "Eva", - "Cohen", - "exploded", - "Merit", - "Maya", - "##rable", - "Rovers", - "##IC", - "Morrison", - "Should", - "vinyl", - "##mie", - "onwards", - "##gie", - "vicinity", - "Wildlife", - "probability", - "Mar", - "Barnes", - "##ook", - "spinning", - "Moses", - "##vie", - "Surrey", - "Planning", - "conferences", - "protective", - "Plaza", - "deny", - "Canterbury", - "manor", - "Estate", - "tilted", - "comics", - "IBM", - "destroying", - "server", - "Dorothy", - "##horn", - "Oslo", - "lesser", - "heaven", - "Marshal", - "scales", - "strikes", - "##ath", - "firms", - "attract", - "##BS", - "controlling", - "Bradford", - "southeastern", - "Amazon", - "Travis", - "Janet", - "governed", - "1842", - "Train", - "Holden", - "bleeding", - "gifts", - "rent", - "1839", - "palms", - "##ū", - "judicial", - "Ho", - "Finals", - "conflicts", - "unlikely", - "draws", - "##cies", - "compensation", - "adds", - "elderly", - "Anton", - "lasting", - "Nintendo", - "codes", - "ministers", - "pot", - "associations", - "capabilities", - "##cht", - "libraries", - "##sie", - "chances", - "performers", - "runway", - "##af", - "##nder", - "Mid", - "Vocals", - "##uch", - "##eon", - "interpreted", - "priority", - "Uganda", - "ruined", - "Mathematics", - "cook", - "AFL", - "Lutheran", - "AIDS", - "Capitol", - "chase", - "axis", - "Moreover", - "María", - "Saxon", - "storyline", - "##ffed", - "Tears", - "Kid", - "cent", - "colours", - "Sex", - "##long", - "pm", - "blonde", - "Edwin", - "CE", - "diocese", - "##ents", - "##boy", - "Inn", - "##ller", - "Saskatchewan", - "##kh", - "stepping", - "Windsor", - "##oka", - "##eri", - "Xavier", - "Resources", - "1843", - "##top", - "##rad", - "##lls", - "Testament", - "poorly", - "1836", - "drifted", - "slope", - "CIA", - "remix", - "Lords", - "mature", - "hosting", - "diamond", - "beds", - "##ncies", - "luxury", - "trigger", - "##lier", - "preliminary", - "hybrid", - "journalists", - "Enterprise", - "proven", - "expelled", - "insects", - "Beautiful", - "lifestyle", - "vanished", - "##ake", - "##ander", - "matching", - "surfaces", - "Dominican", - "Kids", - "referendum", - "Orlando", - "Truth", - "Sandy", - "privacy", - "Calgary", - "Speaker", - "sts", - "Nobody", - "shifting", - "##gers", - "Roll", - "Armenia", - "Hand", - "##ES", - "106", - "##ont", - "Guild", - "larvae", - "Stock", - "flame", - "gravity", - "enhanced", - "Marion", - "surely", - "##tering", - "Tales", - "algorithm", - "Emmy", - "darker", - "VIII", - "##lash", - "hamlet", - "deliberately", - "occurring", - "choices", - "Gage", - "fees", - "settling", - "ridiculous", - "##ela", - "Sons", - "cop", - "custody", - "##ID", - "proclaimed", - "Cardinals", - "##pm", - "Metal", - "Ana", - "1835", - "clue", - "Cardiff", - "riders", - "observations", - "MA", - "sometime", - "##och", - "performer", - "intact", - "Points", - "allegations", - "rotation", - "Tennis", - "tenor", - "Directors", - "##ats", - "Transit", - "thigh", - "Complex", - "##works", - "twentieth", - "Factory", - "doctrine", - "Daddy", - "##ished", - "pretend", - "Winston", - "cigarette", - "##IA", - "specimens", - "hydrogen", - "smoking", - "mathematical", - "arguments", - "openly", - "developer", - "##iro", - "fists", - "somebody", - "##san", - "Standing", - "Caleb", - "intelligent", - "Stay", - "Interior", - "echoed", - "Valentine", - "varieties", - "Brady", - "cluster", - "Ever", - "voyage", - "##of", - "deposits", - "ultimate", - "Hayes", - "horizontal", - "proximity", - "##ás", - "estates", - "exploration", - "NATO", - "Classical", - "##most", - "bills", - "condemned", - "1832", - "hunger", - "##ato", - "planes", - "deserve", - "offense", - "sequences", - "rendered", - "acceptance", - "##ony", - "manufacture", - "Plymouth", - "innovative", - "predicted", - "##RC", - "Fantasy", - "##une", - "supporter", - "absent", - "Picture", - "bassist", - "rescued", - "##MC", - "Ahmed", - "Monte", - "##sts", - "##rius", - "insane", - "novelist", - "##és", - "agrees", - "Antarctic", - "Lancaster", - "Hopkins", - "calculated", - "startled", - "##star", - "tribal", - "Amendment", - "##hoe", - "invisible", - "patron", - "deer", - "Walk", - "tracking", - "Lyon", - "tickets", - "##ED", - "philosopher", - "compounds", - "chuckled", - "##wi", - "pound", - "loyalty", - "Academic", - "petition", - "refuses", - "marking", - "Mercury", - "northeastern", - "dimensions", - "scandal", - "Canyon", - "patch", - "publish", - "##oning", - "Peak", - "minds", - "##boro", - "Presbyterian", - "Hardy", - "theoretical", - "magnitude", - "bombs", - "cage", - "##ders", - "##kai", - "measuring", - "explaining", - "avoiding", - "touchdowns", - "Card", - "theology", - "##ured", - "Popular", - "export", - "suspicious", - "Probably", - "photograph", - "Lou", - "Parks", - "Arms", - "compact", - "Apparently", - "excess", - "Banks", - "lied", - "stunned", - "territorial", - "Filipino", - "spectrum", - "learns", - "wash", - "imprisonment", - "ugly", - "##rose", - "Albany", - "Erik", - "sends", - "##hara", - "##rid", - "consumed", - "##gling", - "Belgrade", - "Da", - "opposing", - "Magnus", - "footsteps", - "glowing", - "delicate", - "Alexandria", - "Ludwig", - "gorgeous", - "Bros", - "Index", - "##PA", - "customs", - "preservation", - "bonds", - "##mond", - "environments", - "##nto", - "instructed", - "parted", - "adoption", - "locality", - "workshops", - "goalkeeper", - "##rik", - "##uma", - "Brighton", - "Slovenia", - "##ulating", - "##tical", - "towel", - "hugged", - "stripped", - "Bears", - "upright", - "Wagner", - "##aux", - "secretly", - "Adventures", - "nest", - "Course", - "Lauren", - "Boeing", - "Abdul", - "Lakes", - "450", - "##cu", - "USSR", - "caps", - "Chan", - "##nna", - "conceived", - "Actually", - "Belfast", - "Lithuanian", - "concentrate", - "possess", - "militia", - "pine", - "protagonist", - "Helena", - "##PS", - "##band", - "Belle", - "Clara", - "Reform", - "currency", - "pregnancy", - "1500", - "##rim", - "Isabella", - "hull", - "Name", - "trend", - "journalism", - "diet", - "##mel", - "Recording", - "acclaimed", - "Tang", - "Jace", - "steering", - "vacant", - "suggestion", - "costume", - "laser", - "##š", - "##ink", - "##pan", - "##vić", - "integral", - "achievements", - "wise", - "classroom", - "unions", - "southwestern", - "##uer", - "Garcia", - "toss", - "Tara", - "Large", - "##tate", - "evident", - "responsibilities", - "populated", - "satisfaction", - "##bia", - "casual", - "Ecuador", - "##ght", - "arose", - "##ović", - "Cornwall", - "embrace", - "refuse", - "Heavyweight", - "XI", - "Eden", - "activists", - "##uation", - "biology", - "##shan", - "fraud", - "Fuck", - "matched", - "legacy", - "Rivers", - "missionary", - "extraordinary", - "Didn", - "holder", - "wickets", - "crucial", - "Writers", - "Hurricane", - "Iceland", - "gross", - "trumpet", - "accordance", - "hurry", - "flooded", - "doctorate", - "Albania", - "##yi", - "united", - "deceased", - "jealous", - "grief", - "flute", - "portraits", - "##а", - "pleasant", - "Founded", - "Face", - "crowned", - "Raja", - "advisor", - "Salem", - "##ec", - "Achievement", - "admission", - "freely", - "minimal", - "Sudan", - "developers", - "estimate", - "disabled", - "##lane", - "downstairs", - "Bruno", - "##pus", - "pinyin", - "##ude", - "lecture", - "deadly", - "underlying", - "optical", - "witnesses", - "Combat", - "Julius", - "tapped", - "variants", - "##like", - "Colonial", - "Critics", - "Similarly", - "mouse", - "voltage", - "sculptor", - "Concert", - "salary", - "Frances", - "##ground", - "hook", - "premises", - "Software", - "instructor", - "nominee", - "##ited", - "fog", - "slopes", - "##zu", - "vegetation", - "sail", - "##rch", - "Body", - "Apart", - "atop", - "View", - "utility", - "ribs", - "cab", - "migration", - "##wyn", - "bounded", - "2019", - "pillow", - "trails", - "##ub", - "Halifax", - "shade", - "Rush", - "##lah", - "##dian", - "Notre", - "interviewed", - "Alexandra", - "Springfield", - "Indeed", - "rubbing", - "dozens", - "amusement", - "legally", - "##lers", - "Jill", - "Cinema", - "ignoring", - "Choice", - "##ures", - "pockets", - "##nell", - "laying", - "Blair", - "tackles", - "separately", - "##teen", - "Criminal", - "performs", - "theorem", - "Communication", - "suburbs", - "##iel", - "competitors", - "rows", - "##hai", - "Manitoba", - "Eleanor", - "interactions", - "nominations", - "assassination", - "##dis", - "Edmonton", - "diving", - "##dine", - "essay", - "##tas", - "AFC", - "Edge", - "directing", - "imagination", - "sunk", - "implement", - "Theodore", - "trembling", - "sealed", - "##rock", - "Nobel", - "##ancy", - "##dorf", - "##chen", - "genuine", - "apartments", - "Nicolas", - "AA", - "Bach", - "Globe", - "Store", - "220", - "##10", - "Rochester", - "##ño", - "alert", - "107", - "Beck", - "##nin", - "Naples", - "Basin", - "Crawford", - "fears", - "Tracy", - "##hen", - "disk", - "##pped", - "seventeen", - "Lead", - "backup", - "reconstruction", - "##lines", - "terrified", - "sleeve", - "nicknamed", - "popped", - "##making", - "##ern", - "Holiday", - "Gospel", - "ibn", - "##ime", - "convert", - "divine", - "resolved", - "##quet", - "ski", - "realizing", - "##RT", - "Legislature", - "reservoir", - "Rain", - "sinking", - "rainfall", - "elimination", - "challenging", - "tobacco", - "##outs", - "Given", - "smallest", - "Commercial", - "pin", - "rebel", - "comedian", - "exchanged", - "airing", - "dish", - "Salvador", - "promising", - "##wl", - "relax", - "presenter", - "toll", - "aerial", - "##eh", - "Fletcher", - "brass", - "disappear", - "zones", - "adjusted", - "contacts", - "##lk", - "sensed", - "Walt", - "mild", - "toes", - "flies", - "shame", - "considers", - "wildlife", - "Hanna", - "Arsenal", - "Ladies", - "naming", - "##ishing", - "anxiety", - "discussions", - "cute", - "undertaken", - "Cash", - "strain", - "Wyoming", - "dishes", - "precise", - "Angela", - "##ided", - "hostile", - "twins", - "115", - "Built", - "##pel", - "Online", - "tactics", - "Newman", - "##bourne", - "unclear", - "repairs", - "embarrassed", - "listing", - "tugged", - "Vale", - "##gin", - "Meredith", - "bout", - "##cle", - "velocity", - "tips", - "froze", - "evaluation", - "demonstrate", - "##card", - "criticised", - "Nash", - "lineup", - "Rao", - "monks", - "bacteria", - "lease", - "##lish", - "frightened", - "den", - "revived", - "finale", - "##rance", - "flee", - "Letters", - "decreased", - "##oh", - "Sounds", - "wrap", - "Sharon", - "incidents", - "renovated", - "everybody", - "stole", - "Bath", - "boxing", - "1815", - "withdraw", - "backs", - "interim", - "react", - "murders", - "Rhodes", - "Copa", - "framed", - "flown", - "Estonia", - "Heavy", - "explored", - "##rra", - "##GA", - "##ali", - "Istanbul", - "1834", - "##rite", - "##aging", - "##ues", - "Episcopal", - "arc", - "orientation", - "Maxwell", - "infected", - "##rot", - "BCE", - "Brook", - "grasp", - "Roberto", - "Excellence", - "108", - "withdrawal", - "Marines", - "rider", - "Lo", - "##sin", - "##run", - "Subsequently", - "garrison", - "hurricane", - "facade", - "Prussia", - "crushed", - "enterprise", - "##mber", - "Twitter", - "Generation", - "Physical", - "Sugar", - "editing", - "communicate", - "Ellie", - "##hurst", - "Ernst", - "wagon", - "promotional", - "conquest", - "Parliamentary", - "courtyard", - "lawyers", - "Superman", - "email", - "Prussian", - "lately", - "lecturer", - "Singer", - "Majesty", - "Paradise", - "sooner", - "Heath", - "slot", - "curves", - "convoy", - "##vian", - "induced", - "synonym", - "breeze", - "##plane", - "##ox", - "peered", - "Coalition", - "##hia", - "odds", - "##esh", - "##lina", - "Tomorrow", - "Nadu", - "##ico", - "##rah", - "damp", - "autonomous", - "console", - "Victory", - "counts", - "Luxembourg", - "intimate", - "Archived", - "Carroll", - "spy", - "Zero", - "habit", - "Always", - "faction", - "teenager", - "Johnston", - "chaos", - "ruin", - "commerce", - "blog", - "##shed", - "##the", - "reliable", - "Word", - "Yu", - "Norton", - "parade", - "Catholics", - "damned", - "##iling", - "surgeon", - "##tia", - "Allison", - "Jonas", - "remarked", - "##ès", - "idiot", - "Making", - "proposals", - "Industries", - "strategies", - "artifacts", - "batteries", - "reward", - "##vers", - "Agricultural", - "distinguish", - "lengths", - "Jeffrey", - "Progressive", - "kicking", - "Patricia", - "##gio", - "ballot", - "##ios", - "skilled", - "##gation", - "Colt", - "limestone", - "##AS", - "peninsula", - "##itis", - "LA", - "hotels", - "shapes", - "Crime", - "depicting", - "northwestern", - "HD", - "silly", - "Das", - "##²", - "##ws", - "##ash", - "##matic", - "thermal", - "Has", - "forgive", - "surrendered", - "Palm", - "Nacional", - "drank", - "haired", - "Mercedes", - "##foot", - "loading", - "Timothy", - "##roll", - "mechanisms", - "traces", - "digging", - "discussing", - "Natalie", - "##zhou", - "Forbes", - "landmark", - "Anyway", - "Manor", - "conspiracy", - "gym", - "knocking", - "viewing", - "Formation", - "Pink", - "Beauty", - "limbs", - "Phillip", - "sponsor", - "Joy", - "granite", - "Harbour", - "##ero", - "payments", - "Ballet", - "conviction", - "##dam", - "Hood", - "estimates", - "lacked", - "Mad", - "Jorge", - "##wen", - "refuge", - "##LA", - "invaded", - "Kat", - "suburban", - "##fold", - "investigated", - "Ari", - "complained", - "creek", - "Georges", - "##uts", - "powder", - "accepting", - "deserved", - "carpet", - "Thunder", - "molecules", - "Legal", - "cliff", - "strictly", - "enrollment", - "ranch", - "##rg", - "##mba", - "proportion", - "renovation", - "crop", - "grabbing", - "##liga", - "finest", - "entries", - "receptor", - "helmet", - "blown", - "Listen", - "flagship", - "workshop", - "resolve", - "nails", - "Shannon", - "portal", - "jointly", - "shining", - "Violet", - "overwhelming", - "upward", - "Mick", - "proceedings", - "##dies", - "##aring", - "Laurence", - "Churchill", - "##rice", - "commit", - "170", - "inclusion", - "Examples", - "##verse", - "##rma", - "fury", - "paths", - "##SC", - "ankle", - "nerves", - "Chemistry", - "rectangular", - "sworn", - "screenplay", - "cake", - "Mann", - "Seoul", - "Animal", - "sizes", - "Speed", - "vol", - "Population", - "Southwest", - "Hold", - "continuously", - "Qualified", - "wishing", - "Fighting", - "Made", - "disappointment", - "Portsmouth", - "Thirty", - "##beck", - "Ahmad", - "teammate", - "MLB", - "graph", - "Charleston", - "realizes", - "##dium", - "exhibits", - "preventing", - "##int", - "fever", - "rivalry", - "Male", - "mentally", - "dull", - "##lor", - "##rich", - "consistently", - "##igan", - "Madame", - "certificate", - "suited", - "Krishna", - "accuracy", - "Webb", - "Budapest", - "Rex", - "1831", - "Cornell", - "OK", - "surveillance", - "##gated", - "habitats", - "Adventure", - "Conrad", - "Superior", - "Gay", - "sofa", - "aka", - "boot", - "Statistics", - "Jessie", - "Liberation", - "##lip", - "##rier", - "brands", - "saint", - "Heinrich", - "Christine", - "bath", - "Rhine", - "ballet", - "Jin", - "consensus", - "chess", - "Arctic", - "stack", - "furious", - "cheap", - "toy", - "##yre", - "##face", - "##gging", - "gastropod", - "##nne", - "Romans", - "membrane", - "answering", - "25th", - "architects", - "sustainable", - "##yne", - "Hon", - "1814", - "Baldwin", - "dome", - "##awa", - "##zen", - "celebrity", - "enclosed", - "##uit", - "##mmer", - "Electronic", - "locals", - "##CE", - "supervision", - "mineral", - "Chemical", - "Slovakia", - "alley", - "hub", - "##az", - "heroes", - "Creative", - "##AM", - "incredible", - "politically", - "ESPN", - "yanked", - "halls", - "Aboriginal", - "Greatest", - "yield", - "##20", - "congressional", - "robot", - "Kiss", - "welcomed", - "MS", - "speeds", - "proceed", - "Sherman", - "eased", - "Greene", - "Walsh", - "Geoffrey", - "variables", - "rocky", - "##print", - "acclaim", - "Reverend", - "Wonder", - "tonnes", - "recurring", - "Dawson", - "continent", - "finite", - "AP", - "continental", - "ID", - "facilitate", - "essays", - "Rafael", - "Neal", - "1833", - "ancestors", - "##met", - "##gic", - "Especially", - "teenage", - "frustrated", - "Jules", - "cock", - "expense", - "##oli", - "##old", - "blocking", - "Notable", - "prohibited", - "ca", - "dock", - "organize", - "##wald", - "Burma", - "Gloria", - "dimension", - "aftermath", - "choosing", - "Mickey", - "torpedo", - "pub", - "##used", - "manuscripts", - "laps", - "Ulster", - "staircase", - "sphere", - "Insurance", - "Contest", - "lens", - "risks", - "investigations", - "ERA", - "glare", - "##play", - "Graduate", - "auction", - "Chronicle", - "##tric", - "##50", - "Coming", - "seating", - "Wade", - "seeks", - "inland", - "Thames", - "Rather", - "butterfly", - "contracted", - "positioned", - "consumers", - "contestants", - "fragments", - "Yankees", - "Santos", - "administrator", - "hypothesis", - "retire", - "Denis", - "agreements", - "Winnipeg", - "##rill", - "1820", - "trophy", - "crap", - "shakes", - "Jenkins", - "##rium", - "ya", - "twist", - "labels", - "Maritime", - "##lings", - "##iv", - "111", - "##ensis", - "Cairo", - "Anything", - "##fort", - "opinions", - "crowded", - "##nian", - "abandon", - "##iff", - "drained", - "imported", - "##rr", - "tended", - "##rain", - "Going", - "introducing", - "sculptures", - "bankruptcy", - "danced", - "demonstration", - "stance", - "settings", - "gazed", - "abstract", - "pet", - "Calvin", - "stiff", - "strongest", - "wrestler", - "##dre", - "Republicans", - "grace", - "allocated", - "cursed", - "snail", - "advancing", - "Return", - "errors", - "Mall", - "presenting", - "eliminate", - "Amateur", - "Institution", - "counting", - "##wind", - "warehouse", - "##nde", - "Ethiopia", - "trailed", - "hollow", - "##press", - "Literary", - "capability", - "nursing", - "preceding", - "lamp", - "Thomson", - "Morton", - "##ctic", - "Crew", - "Close", - "composers", - "boom", - "Clare", - "missiles", - "112", - "hunter", - "snap", - "##oni", - "##tail", - "Us", - "declaration", - "##cock", - "rally", - "huh", - "lion", - "straightened", - "Philippe", - "Sutton", - "alpha", - "valued", - "maker", - "navigation", - "detected", - "favorable", - "perception", - "Charter", - "##ña", - "Ricky", - "rebounds", - "tunnels", - "slapped", - "Emergency", - "supposedly", - "##act", - "deployment", - "socialist", - "tubes", - "anybody", - "corn", - "##NA", - "Seminary", - "heating", - "pump", - "##AA", - "achieving", - "souls", - "##ass", - "Link", - "##ele", - "##smith", - "greeted", - "Bates", - "Americas", - "Elder", - "cure", - "contestant", - "240", - "fold", - "Runner", - "Uh", - "licked", - "Politics", - "committees", - "neighbors", - "fairy", - "Silva", - "Leipzig", - "tipped", - "correctly", - "exciting", - "electronics", - "foundations", - "cottage", - "governmental", - "##hat", - "allied", - "claws", - "presidency", - "cruel", - "Agreement", - "slender", - "accompanying", - "precisely", - "##pass", - "driveway", - "swim", - "Stand", - "crews", - "##mission", - "rely", - "everyday", - "Wings", - "demo", - "##hic", - "recreational", - "min", - "nationality", - "##duction", - "Easter", - "##hole", - "canvas", - "Kay", - "Leicester", - "talented", - "Discovery", - "shells", - "##ech", - "Kerry", - "Ferguson", - "Leave", - "##place", - "altogether", - "adopt", - "butt", - "wolves", - "##nsis", - "##ania", - "modest", - "soprano", - "Boris", - "##ught", - "electron", - "depicts", - "hid", - "cruise", - "differ", - "treasure", - "##nch", - "Gun", - "Mama", - "Bengali", - "trainer", - "merchants", - "innovation", - "presumably", - "Shirley", - "bottles", - "proceeds", - "Fear", - "invested", - "Pirates", - "particle", - "Dominic", - "blamed", - "Fight", - "Daisy", - "##pper", - "##graphic", - "nods", - "knight", - "Doyle", - "tales", - "Carnegie", - "Evil", - "Inter", - "Shore", - "Nixon", - "transform", - "Savannah", - "##gas", - "Baltic", - "stretching", - "worlds", - "protocol", - "Percy", - "Toby", - "Heroes", - "brave", - "dancers", - "##aria", - "backwards", - "responses", - "Chi", - "Gaelic", - "Berry", - "crush", - "embarked", - "promises", - "Madonna", - "researcher", - "realised", - "inaugurated", - "Cherry", - "Mikhail", - "Nottingham", - "reinforced", - "subspecies", - "rapper", - "##kie", - "Dreams", - "Re", - "Damon", - "Minneapolis", - "monsters", - "suspicion", - "Tel", - "surroundings", - "afterward", - "complaints", - "OF", - "sectors", - "Algeria", - "lanes", - "Sabha", - "objectives", - "Donna", - "bothered", - "distracted", - "deciding", - "##ives", - "##CA", - "##onia", - "bishops", - "Strange", - "machinery", - "Voiced", - "synthesis", - "reflects", - "interference", - "##TS", - "##ury", - "keen", - "##ign", - "frown", - "freestyle", - "ton", - "Dixon", - "Sacred", - "Ruby", - "Prison", - "##ión", - "1825", - "outfit", - "##tain", - "curiosity", - "##ight", - "frames", - "steadily", - "emigrated", - "horizon", - "##erly", - "Doc", - "philosophical", - "Table", - "UTC", - "Marina", - "##DA", - "secular", - "##eed", - "Zimbabwe", - "cops", - "Mack", - "sheriff", - "Sanskrit", - "Francesco", - "catches", - "questioning", - "streaming", - "Kill", - "testimony", - "hissed", - "tackle", - "countryside", - "copyright", - "##IP", - "Buddhism", - "##rator", - "ladder", - "##ON", - "Past", - "rookie", - "depths", - "##yama", - "##ister", - "##HS", - "Samantha", - "Dana", - "Educational", - "brows", - "Hammond", - "raids", - "envelope", - "##sco", - "##hart", - "##ulus", - "epic", - "detection", - "Streets", - "Potter", - "statistical", - "für", - "ni", - "accounting", - "##pot", - "employer", - "Sidney", - "Depression", - "commands", - "Tracks", - "averaged", - "lets", - "Ram", - "longtime", - "suits", - "branded", - "chip", - "Shield", - "loans", - "ought", - "Said", - "sip", - "##rome", - "requests", - "Vernon", - "bordered", - "veterans", - "##ament", - "Marsh", - "Herzegovina", - "Pine", - "##igo", - "mills", - "anticipation", - "reconnaissance", - "##ef", - "expectations", - "protested", - "arrow", - "guessed", - "depot", - "maternal", - "weakness", - "##ap", - "projected", - "pour", - "Carmen", - "provider", - "newer", - "remind", - "freed", - "##rily", - "##wal", - "##tones", - "intentions", - "Fiji", - "timing", - "Match", - "managers", - "Kosovo", - "Herman", - "Wesley", - "Chang", - "135", - "semifinals", - "shouting", - "Indo", - "Janeiro", - "Chess", - "Macedonia", - "Buck", - "##onies", - "rulers", - "Mail", - "##vas", - "##sel", - "MHz", - "Programme", - "Task", - "commercially", - "subtle", - "propaganda", - "spelled", - "bowling", - "basically", - "Raven", - "1828", - "Colony", - "109", - "##ingham", - "##wara", - "anticipated", - "1829", - "##iers", - "graduates", - "##rton", - "##fication", - "endangered", - "ISO", - "diagnosed", - "##tage", - "exercises", - "Battery", - "bolt", - "poison", - "cartoon", - "##ción", - "hood", - "bowed", - "heal", - "Meyer", - "Reagan", - "##wed", - "subfamily", - "##gent", - "momentum", - "infant", - "detect", - "##sse", - "Chapman", - "Darwin", - "mechanics", - "NSW", - "Cancer", - "Brooke", - "Nuclear", - "comprised", - "hire", - "sanctuary", - "wingspan", - "contrary", - "remembering", - "surprising", - "Basic", - "stealing", - "OS", - "hatred", - "##lled", - "masters", - "violation", - "Rule", - "##nger", - "assuming", - "conquered", - "louder", - "robe", - "Beatles", - "legitimate", - "##vation", - "massacre", - "Rica", - "unsuccessfully", - "poets", - "##enberg", - "careers", - "doubled", - "premier", - "battalions", - "Dubai", - "Paper", - "Louisville", - "gestured", - "dressing", - "successive", - "mumbled", - "Vic", - "referee", - "pupil", - "##cated", - "##rre", - "ceremonies", - "picks", - "##IN", - "diplomat", - "alike", - "geographical", - "rays", - "##HA", - "##read", - "harbour", - "factories", - "pastor", - "playwright", - "Ultimate", - "nationalist", - "uniforms", - "obtaining", - "kit", - "Amber", - "##pling", - "screenwriter", - "ancestry", - "##cott", - "Fields", - "PR", - "Coleman", - "rat", - "Bavaria", - "squeeze", - "highlighted", - "Adult", - "reflecting", - "Mel", - "1824", - "bicycle", - "organizing", - "sided", - "Previously", - "Underground", - "Prof", - "athletics", - "coupled", - "mortal", - "Hampton", - "worthy", - "immune", - "Ava", - "##gun", - "encouraging", - "simplified", - "##ssa", - "##nte", - "##ann", - "Providence", - "entities", - "Pablo", - "Strong", - "Housing", - "##ista", - "##ators", - "kidnapped", - "mosque", - "Kirk", - "whispers", - "fruits", - "shattered", - "fossil", - "Empress", - "Johns", - "Webster", - "Thing", - "refusing", - "differently", - "specimen", - "Ha", - "##EN", - "##tina", - "##elle", - "##night", - "Horn", - "neighbourhood", - "Bolivia", - "##rth", - "genres", - "Pre", - "##vich", - "Amelia", - "swallow", - "Tribune", - "Forever", - "Psychology", - "Use", - "##bers", - "Gazette", - "ash", - "##usa", - "Monster", - "##cular", - "delegation", - "blowing", - "Oblast", - "retreated", - "automobile", - "##ex", - "profits", - "shirts", - "devil", - "Treasury", - "##backs", - "Drums", - "Ronnie", - "gameplay", - "expertise", - "Evening", - "resides", - "Caesar", - "unity", - "Crazy", - "linking", - "Vision", - "donations", - "Isabel", - "valve", - "Sue", - "WWE", - "logical", - "availability", - "fitting", - "revolt", - "##mill", - "Linux", - "taxi", - "Access", - "pollution", - "statues", - "Augustus", - "##pen", - "cello", - "##some", - "lacking", - "##ati", - "Gwen", - "##aka", - "##ovich", - "1821", - "Wow", - "initiatives", - "Uruguay", - "Cain", - "stroked", - "examine", - "##ī", - "mentor", - "moist", - "disorders", - "buttons", - "##tica", - "##anna", - "Species", - "Lynch", - "museums", - "scorer", - "Poor", - "eligibility", - "op", - "unveiled", - "cats", - "Title", - "wheat", - "critically", - "Syracuse", - "##osis", - "marketed", - "enhance", - "Ryder", - "##NG", - "##ull", - "##rna", - "embedded", - "throws", - "foods", - "happily", - "##ami", - "lesson", - "formats", - "punched", - "##rno", - "expressions", - "qualities", - "##sal", - "Gods", - "##lity", - "elect", - "wives", - "##lling", - "jungle", - "Toyota", - "reversed", - "Grammar", - "Cloud", - "Agnes", - "##ules", - "disputed", - "verses", - "Lucien", - "threshold", - "##rea", - "scanned", - "##bled", - "##dley", - "##lice", - "Kazakhstan", - "Gardner", - "Freeman", - "##rz", - "inspection", - "Rita", - "accommodation", - "advances", - "chill", - "Elliot", - "thriller", - "Constantinople", - "##mos", - "debris", - "whoever", - "1810", - "Santo", - "Carey", - "remnants", - "Guatemala", - "##irs", - "carriers", - "equations", - "mandatory", - "##WA", - "anxious", - "measurement", - "Summit", - "Terminal", - "Erin", - "##zes", - "LLC", - "##uo", - "glancing", - "sin", - "##₃", - "Downtown", - "flowering", - "Euro", - "Leigh", - "Lance", - "warn", - "decent", - "recommendations", - "##ote", - "Quartet", - "##rrell", - "Clarence", - "colleague", - "guarantee", - "230", - "Clayton", - "Beast", - "addresses", - "prospect", - "destroyer", - "vegetables", - "Leadership", - "fatal", - "prints", - "190", - "##makers", - "Hyde", - "persuaded", - "illustrations", - "Southampton", - "Joyce", - "beats", - "editors", - "mount", - "##grave", - "Malaysian", - "Bombay", - "endorsed", - "##sian", - "##bee", - "applying", - "Religion", - "nautical", - "bomber", - "Na", - "airfield", - "gravel", - "##rew", - "Cave", - "bye", - "dig", - "decree", - "burden", - "Election", - "Hawk", - "Fe", - "##iled", - "reunited", - "##tland", - "liver", - "Teams", - "Put", - "delegates", - "Ella", - "##fect", - "Cal", - "invention", - "Castro", - "bored", - "##kawa", - "##ail", - "Trinidad", - "NASCAR", - "pond", - "develops", - "##pton", - "expenses", - "Zoe", - "Released", - "##rf", - "organs", - "beta", - "parameters", - "Neill", - "##lene", - "lateral", - "Beat", - "blades", - "Either", - "##hale", - "Mitch", - "##ET", - "##vous", - "Rod", - "burnt", - "phones", - "Rising", - "##front", - "investigating", - "##dent", - "Stephanie", - "##keeper", - "screening", - "##uro", - "Swan", - "Sinclair", - "modes", - "bullets", - "Nigerian", - "melody", - "##ques", - "Rifle", - "##12", - "128", - "##jin", - "charm", - "Venus", - "##tian", - "fusion", - "advocated", - "visitor", - "pinned", - "genera", - "3000", - "Ferry", - "Solo", - "quantity", - "regained", - "platinum", - "shoots", - "narrowly", - "preceded", - "update", - "##ichi", - "equality", - "unaware", - "regiments", - "ally", - "##tos", - "transmitter", - "locks", - "Seeing", - "outlets", - "feast", - "reopened", - "##ows", - "struggles", - "Buddy", - "1826", - "bark", - "elegant", - "amused", - "Pretty", - "themed", - "schemes", - "Lisbon", - "Te", - "patted", - "terrorism", - "Mystery", - "##croft", - "##imo", - "Madagascar", - "Journey", - "dealer", - "contacted", - "##quez", - "ITV", - "vacation", - "Wong", - "Sacramento", - "organisms", - "##pts", - "balcony", - "coloured", - "sheer", - "defines", - "MC", - "abortion", - "forbidden", - "accredited", - "Newfoundland", - "tendency", - "entrepreneur", - "Benny", - "Tanzania", - "needing", - "finalist", - "mythology", - "weakened", - "gown", - "sentences", - "Guest", - "websites", - "Tibetan", - "UFC", - "voluntary", - "annoyed", - "Welcome", - "honestly", - "correspondence", - "geometry", - "Deutsche", - "Biology", - "Help", - "##aya", - "Lines", - "Hector", - "##ael", - "reluctant", - "##ages", - "wears", - "inquiry", - "##dell", - "Holocaust", - "Tourism", - "Wei", - "volcanic", - "##mates", - "Visual", - "sorts", - "neighborhoods", - "Running", - "apple", - "shy", - "Laws", - "bend", - "Northeast", - "feminist", - "Speedway", - "Murder", - "visa", - "stuffed", - "fangs", - "transmitted", - "fiscal", - "Ain", - "enlarged", - "##ndi", - "Cecil", - "Peterson", - "Benson", - "Bedford", - "acceptable", - "##CC", - "##wer", - "purely", - "triangle", - "foster", - "Alberto", - "educator", - "Highland", - "acute", - "LGBT", - "Tina", - "Mi", - "adventures", - "Davidson", - "Honda", - "translator", - "monk", - "enacted", - "summoned", - "##ional", - "collector", - "Genesis", - "Un", - "liner", - "Di", - "Statistical", - "##CS", - "filter", - "Knox", - "Religious", - "Stella", - "Estonian", - "Turn", - "##ots", - "primitive", - "parishes", - "##lles", - "complexity", - "autobiography", - "rigid", - "cannon", - "pursuing", - "exploring", - "##gram", - "##mme", - "freshman", - "caves", - "Expedition", - "Traditional", - "iTunes", - "certification", - "cooling", - "##ort", - "##gna", - "##IT", - "##lman", - "##VA", - "Motion", - "explosive", - "licence", - "boxer", - "shrine", - "loosely", - "Brigadier", - "Savage", - "Brett", - "MVP", - "heavier", - "##elli", - "##gged", - "Buddha", - "Easy", - "spells", - "fails", - "incredibly", - "Georg", - "stern", - "compatible", - "Perfect", - "applies", - "cognitive", - "excessive", - "nightmare", - "neighbor", - "Sicily", - "appealed", - "static", - "##₁", - "Aberdeen", - "##leigh", - "slipping", - "bride", - "##guard", - "Um", - "Clyde", - "1818", - "##gible", - "Hal", - "Frost", - "Sanders", - "interactive", - "Hour", - "##vor", - "hurting", - "bull", - "termed", - "shelf", - "capturing", - "##pace", - "rolls", - "113", - "##bor", - "Chilean", - "teaches", - "##rey", - "exam", - "shipped", - "Twin", - "borrowed", - "##lift", - "Shit", - "##hot", - "Lindsay", - "Below", - "Kiev", - "Lin", - "leased", - "##sto", - "Eli", - "Diane", - "Val", - "subtropical", - "shoe", - "Bolton", - "Dragons", - "##rification", - "Vatican", - "##pathy", - "Crisis", - "dramatically", - "talents", - "babies", - "##ores", - "surname", - "##AP", - "##cology", - "cubic", - "opted", - "Archer", - "sweep", - "tends", - "Karnataka", - "Judy", - "stint", - "Similar", - "##nut", - "explicitly", - "##nga", - "interact", - "Mae", - "portfolio", - "clinic", - "abbreviated", - "Counties", - "##iko", - "hearts", - "##ı", - "providers", - "screams", - "Individual", - "##etti", - "Monument", - "##iana", - "accessed", - "encounters", - "gasp", - "##rge", - "defunct", - "Avery", - "##rne", - "nobility", - "useless", - "Phase", - "Vince", - "senator", - "##FL", - "1813", - "surprisingly", - "##illo", - "##chin", - "Boyd", - "rumors", - "equity", - "Gone", - "Hearts", - "chassis", - "overnight", - "Trek", - "wrists", - "submit", - "civic", - "designers", - "##rity", - "prominence", - "decorative", - "derives", - "starter", - "##AF", - "wisdom", - "Powers", - "reluctantly", - "measurements", - "doctoral", - "Noel", - "Gideon", - "Baden", - "Cologne", - "lawn", - "Hawaiian", - "anthology", - "##rov", - "Raiders", - "embassy", - "Sterling", - "##pal", - "Telugu", - "troubled", - "##FC", - "##bian", - "fountain", - "observe", - "ore", - "##uru", - "##gence", - "spelling", - "Border", - "grinning", - "sketch", - "Benedict", - "Xbox", - "dialects", - "readily", - "immigrant", - "Constitutional", - "aided", - "nevertheless", - "SE", - "tragedy", - "##ager", - "##rden", - "Flash", - "##MP", - "Europa", - "emissions", - "##ield", - "panties", - "Beverly", - "Homer", - "curtain", - "##oto", - "toilet", - "Isn", - "Jerome", - "Chiefs", - "Hermann", - "supernatural", - "juice", - "integrity", - "Scots", - "auto", - "Patriots", - "Strategic", - "engaging", - "prosecution", - "cleaned", - "Byron", - "investments", - "adequate", - "vacuum", - "laughs", - "##inus", - "##nge", - "Usually", - "Roth", - "Cities", - "Brand", - "corpse", - "##ffy", - "Gas", - "rifles", - "Plains", - "sponsorship", - "Levi", - "tray", - "owed", - "della", - "commanders", - "##ead", - "tactical", - "##rion", - "García", - "harbor", - "discharge", - "##hausen", - "gentleman", - "endless", - "highways", - "##itarian", - "pleaded", - "##eta", - "archive", - "Midnight", - "exceptions", - "instances", - "Gibraltar", - "cart", - "##NS", - "Darren", - "Bonnie", - "##yle", - "##iva", - "OCLC", - "bra", - "Jess", - "##EA", - "consulting", - "Archives", - "Chance", - "distances", - "commissioner", - "##AR", - "LL", - "sailors", - "##sters", - "enthusiasm", - "Lang", - "##zia", - "Yugoslav", - "confirm", - "possibilities", - "Suffolk", - "##eman", - "banner", - "1822", - "Supporting", - "fingertips", - "civilization", - "##gos", - "technically", - "1827", - "Hastings", - "sidewalk", - "strained", - "monuments", - "Floyd", - "Chennai", - "Elvis", - "villagers", - "Cumberland", - "strode", - "albeit", - "Believe", - "planets", - "combining", - "Mohammad", - "container", - "##mouth", - "##tures", - "verb", - "BA", - "Tank", - "Midland", - "screened", - "Gang", - "Democracy", - "Helsinki", - "screens", - "thread", - "charitable", - "##version", - "swiftly", - "ma", - "rational", - "combine", - "##SS", - "##antly", - "dragging", - "Cliff", - "Tasmania", - "quest", - "professionally", - "##aj", - "rap", - "##lion", - "livestock", - "##hua", - "informal", - "specially", - "lonely", - "Matthews", - "Dictionary", - "1816", - "Observatory", - "correspondent", - "constitute", - "homeless", - "waving", - "appreciated", - "Analysis", - "Meeting", - "dagger", - "##AL", - "Gandhi", - "flank", - "Giant", - "Choir", - "##not", - "glimpse", - "toe", - "Writer", - "teasing", - "springs", - "##dt", - "Glory", - "healthcare", - "regulated", - "complaint", - "math", - "Publications", - "makers", - "##hips", - "cement", - "Need", - "apologize", - "disputes", - "finishes", - "Partners", - "boring", - "ups", - "gains", - "1793", - "Congressional", - "clergy", - "Folk", - "##made", - "##nza", - "Waters", - "stays", - "encoded", - "spider", - "betrayed", - "Applied", - "inception", - "##urt", - "##zzo", - "wards", - "bells", - "UCLA", - "Worth", - "bombers", - "Mo", - "trademark", - "Piper", - "##vel", - "incorporates", - "1801", - "##cial", - "dim", - "Twelve", - "##word", - "Appeals", - "tighter", - "spacecraft", - "##tine", - "coordinates", - "##iac", - "mistakes", - "Zach", - "laptop", - "Teresa", - "##llar", - "##yr", - "favored", - "Nora", - "sophisticated", - "Irving", - "hammer", - "División", - "corporations", - "niece", - "##rley", - "Patterson", - "UNESCO", - "trafficking", - "Ming", - "balanced", - "plaque", - "Latvia", - "broader", - "##owed", - "Save", - "confined", - "##vable", - "Dalton", - "tide", - "##right", - "##ural", - "##num", - "swords", - "caring", - "##eg", - "IX", - "Acting", - "paved", - "##moto", - "launching", - "Antoine", - "substantially", - "Pride", - "Philharmonic", - "grammar", - "Indoor", - "Ensemble", - "enabling", - "114", - "resided", - "Angelo", - "publicity", - "chaired", - "crawled", - "Maharashtra", - "Telegraph", - "lengthy", - "preference", - "differential", - "anonymous", - "Honey", - "##itation", - "wage", - "##iki", - "consecrated", - "Bryant", - "regulatory", - "Carr", - "##én", - "functioning", - "watches", - "##ú", - "shifts", - "diagnosis", - "Search", - "app", - "Peters", - "##SE", - "##cat", - "Andreas", - "honours", - "temper", - "counsel", - "Urdu", - "Anniversary", - "maritime", - "##uka", - "harmony", - "##unk", - "essence", - "Lorenzo", - "choked", - "Quarter", - "indie", - "##oll", - "loses", - "##prints", - "amendment", - "Adolf", - "scenario", - "similarities", - "##rade", - "##LC", - "technological", - "metric", - "Russians", - "thoroughly", - "##tead", - "cruiser", - "1806", - "##nier", - "1823", - "Teddy", - "##psy", - "au", - "progressed", - "exceptional", - "broadcaster", - "partnered", - "fitness", - "irregular", - "placement", - "mothers", - "unofficial", - "Garion", - "Johannes", - "1817", - "regain", - "Solar", - "publishes", - "Gates", - "Broken", - "thirds", - "conversations", - "dive", - "Raj", - "contributor", - "quantities", - "Worcester", - "governance", - "##flow", - "generating", - "pretending", - "Belarus", - "##voy", - "radius", - "skating", - "Marathon", - "1819", - "affection", - "undertook", - "##wright", - "los", - "##bro", - "locate", - "PS", - "excluded", - "recreation", - "tortured", - "jewelry", - "moaned", - "##logue", - "##cut", - "Complete", - "##rop", - "117", - "##II", - "plantation", - "whipped", - "slower", - "crater", - "##drome", - "Volunteer", - "attributes", - "celebrations", - "regards", - "Publishers", - "oath", - "utilized", - "Robbie", - "Giuseppe", - "fiber", - "indication", - "melted", - "archives", - "Damien", - "storey", - "affecting", - "identifying", - "dances", - "alumni", - "comparable", - "upgrade", - "rented", - "sprint", - "##kle", - "Marty", - "##lous", - "treating", - "railways", - "Lebanese", - "erupted", - "occupy", - "sympathy", - "Jude", - "Darling", - "Qatar", - "drainage", - "McCarthy", - "heel", - "Klein", - "computing", - "wireless", - "flip", - "Du", - "Bella", - "##ast", - "##ssen", - "narrator", - "mist", - "sings", - "alignment", - "121", - "2020", - "securing", - "##rail", - "Progress", - "missionaries", - "brutal", - "mercy", - "##shing", - "Hip", - "##ache", - "##olo", - "switching", - "##here", - "Malay", - "##ob", - "constituted", - "Mohammed", - "Often", - "standings", - "surge", - "teachings", - "ink", - "detached", - "systematic", - "Trial", - "Myanmar", - "##wo", - "offs", - "Reyes", - "decoration", - "translations", - "wherever", - "reviewer", - "speculation", - "Bangkok", - "terminated", - "##ester", - "beard", - "RCA", - "Aidan", - "Associated", - "Emerson", - "Charity", - "1803", - "generous", - "Dudley", - "ATP", - "##haven", - "prizes", - "toxic", - "gloves", - "##iles", - "##dos", - "Turning", - "myth", - "Parade", - "##building", - "Hits", - "##eva", - "teamed", - "Above", - "Duchess", - "Holt", - "##oth", - "Sub", - "Ace", - "atomic", - "inform", - "Ship", - "depend", - "Jun", - "##bes", - "Norwich", - "globe", - "Baroque", - "Christina", - "Cotton", - "Tunnel", - "kidding", - "Concerto", - "Brittany", - "tasted", - "phases", - "stems", - "angles", - "##TE", - "##nam", - "##40", - "charted", - "Alison", - "intensive", - "Willis", - "glory", - "##lit", - "Bergen", - "est", - "taller", - "##dicate", - "labeled", - "##ido", - "commentator", - "Warrior", - "Viscount", - "shortened", - "aisle", - "Aria", - "Spike", - "spectators", - "goodbye", - "overlooking", - "mammals", - "##lude", - "wholly", - "Barrett", - "##gus", - "accompany", - "seventy", - "employ", - "##mb", - "ambitious", - "beloved", - "basket", - "##mma", - "##lding", - "halted", - "descendant", - "pad", - "exclaimed", - "cloak", - "##pet", - "Strait", - "Bang", - "Aviv", - "sadness", - "##ffer", - "Donovan", - "1880s", - "agenda", - "swinging", - "##quin", - "jerk", - "Boat", - "##rist", - "nervously", - "Silence", - "Echo", - "shout", - "implies", - "##iser", - "##cking", - "Shiva", - "Weston", - "damages", - "##tist", - "effectiveness", - "Horace", - "cycling", - "Rey", - "ache", - "Photography", - "PDF", - "Dear", - "leans", - "Lea", - "##vision", - "booth", - "attained", - "disbelief", - "##eus", - "##ution", - "Hop", - "pension", - "toys", - "Eurovision", - "faithful", - "##heads", - "Andre", - "owe", - "default", - "Atlas", - "Megan", - "highlights", - "lovers", - "Constantine", - "Sixth", - "masses", - "##garh", - "emerge", - "Auto", - "Slovak", - "##oa", - "##vert", - "Superintendent", - "flicked", - "inventor", - "Chambers", - "Frankie", - "Romeo", - "pottery", - "companions", - "Rudolf", - "##liers", - "diary", - "Unless", - "tap", - "alter", - "Randall", - "##ddle", - "##eal", - "limitations", - "##boards", - "utterly", - "knelt", - "guaranteed", - "Cowboys", - "Islander", - "horns", - "##ike", - "Wendy", - "sexually", - "Smart", - "breasts", - "##cian", - "compromise", - "Duchy", - "AT", - "Galaxy", - "analog", - "Style", - "##aking", - "weighed", - "Nigel", - "optional", - "Czechoslovakia", - "practicing", - "Ham", - "##0s", - "feedback", - "batted", - "uprising", - "operative", - "applicable", - "criminals", - "classrooms", - "Somehow", - "##ode", - "##OM", - "Naomi", - "Winchester", - "##pping", - "Bart", - "Regina", - "competitor", - "Recorded", - "Yuan", - "Vera", - "lust", - "Confederation", - "##test", - "suck", - "1809", - "Lambert", - "175", - "Friend", - "##ppa", - "Slowly", - "##⁺", - "Wake", - "Dec", - "##aneous", - "chambers", - "Color", - "Gus", - "##site", - "Alternative", - "##world", - "Exeter", - "Omaha", - "celebrities", - "striker", - "210", - "dwarf", - "meals", - "Oriental", - "Pearson", - "financing", - "revenues", - "underwater", - "Steele", - "screw", - "Feeling", - "Mt", - "acids", - "badge", - "swore", - "theaters", - "Moving", - "admired", - "lung", - "knot", - "penalties", - "116", - "fork", - "##cribed", - "Afghan", - "outskirts", - "Cambodia", - "oval", - "wool", - "fossils", - "Ned", - "Countess", - "Darkness", - "delicious", - "##nica", - "Evelyn", - "Recordings", - "guidelines", - "##CP", - "Sandra", - "meantime", - "Antarctica", - "modeling", - "granddaughter", - "##rial", - "Roma", - "Seventh", - "Sunshine", - "Gabe", - "##nton", - "Shop", - "Turks", - "prolific", - "soup", - "parody", - "##nta", - "Judith", - "disciplines", - "resign", - "Companies", - "Libya", - "Jets", - "inserted", - "Mile", - "retrieve", - "filmmaker", - "##rand", - "realistic", - "unhappy", - "##30", - "sandstone", - "##nas", - "##lent", - "##ush", - "##rous", - "Brent", - "trash", - "Rescue", - "##unted", - "Autumn", - "disgust", - "flexible", - "infinite", - "sideways", - "##oss", - "##vik", - "trailing", - "disturbed", - "50th", - "Newark", - "posthumously", - "##rol", - "Schmidt", - "Josef", - "##eous", - "determining", - "menu", - "Pole", - "Anita", - "Luc", - "peaks", - "118", - "Yard", - "warrant", - "generic", - "deserted", - "Walking", - "stamp", - "tracked", - "##berger", - "paired", - "surveyed", - "sued", - "Rainbow", - "##isk", - "Carpenter", - "submarines", - "realization", - "touches", - "sweeping", - "Fritz", - "module", - "Whether", - "resembles", - "##form", - "##lop", - "unsure", - "hunters", - "Zagreb", - "unemployment", - "Senators", - "Georgetown", - "##onic", - "Barker", - "foul", - "commercials", - "Dresden", - "Words", - "collision", - "Carlton", - "Fashion", - "doubted", - "##ril", - "precision", - "MIT", - "Jacobs", - "mob", - "Monk", - "retaining", - "gotta", - "##rod", - "remake", - "Fast", - "chips", - "##pled", - "sufficiently", - "##lights", - "delivering", - "##enburg", - "Dancing", - "Barton", - "Officers", - "metals", - "##lake", - "religions", - "##ré", - "motivated", - "differs", - "dorsal", - "##birds", - "##rts", - "Priest", - "polished", - "##aling", - "Saxony", - "Wyatt", - "knockout", - "##hor", - "Lopez", - "RNA", - "##link", - "metallic", - "##kas", - "daylight", - "Montenegro", - "##lining", - "wrapping", - "resemble", - "Jam", - "Viking", - "uncertainty", - "angels", - "enables", - "##fy", - "Stuttgart", - "tricks", - "tattoo", - "127", - "wicked", - "asset", - "breach", - "##yman", - "MW", - "breaths", - "Jung", - "im", - "1798", - "noon", - "vowel", - "##qua", - "calmly", - "seasonal", - "chat", - "ingredients", - "cooled", - "Randolph", - "ensuring", - "##ib", - "##idal", - "flashing", - "1808", - "Macedonian", - "Cool", - "councils", - "##lick", - "advantages", - "Immediately", - "Madras", - "##cked", - "Pain", - "fancy", - "chronic", - "Malayalam", - "begged", - "##nese", - "Inner", - "feathers", - "##vey", - "Names", - "dedication", - "Sing", - "pan", - "Fischer", - "nurses", - "Sharp", - "inning", - "stamps", - "Meg", - "##ello", - "edged", - "motioned", - "Jacksonville", - "##ffle", - "##dic", - "##US", - "divide", - "garnered", - "Ranking", - "chasing", - "modifications", - "##oc", - "clever", - "midst", - "flushed", - "##DP", - "void", - "##sby", - "ambulance", - "beaches", - "groan", - "isolation", - "strengthen", - "prevention", - "##ffs", - "Scouts", - "reformed", - "geographic", - "squadrons", - "Fiona", - "Kai", - "Consequently", - "##uss", - "overtime", - "##yas", - "Fr", - "##BL", - "Papua", - "Mixed", - "glances", - "Haiti", - "Sporting", - "sandy", - "confronted", - "René", - "Tanner", - "1811", - "##IM", - "advisory", - "trim", - "##ibe", - "González", - "gambling", - "Jupiter", - "##ility", - "##owski", - "##nar", - "122", - "apology", - "teased", - "Pool", - "feminine", - "wicket", - "eagle", - "shiny", - "##lator", - "blend", - "peaking", - "nasty", - "nodding", - "fraction", - "tech", - "Noble", - "Kuwait", - "brushing", - "Italia", - "Canberra", - "duet", - "Johan", - "1805", - "Written", - "cameo", - "Stalin", - "pig", - "cord", - "##zio", - "Surely", - "SA", - "owing", - "holidays", - "123", - "Ranger", - "lighthouse", - "##ige", - "miners", - "1804", - "##ë", - "##gren", - "##ried", - "crashing", - "##atory", - "wartime", - "highlight", - "inclined", - "Torres", - "Tax", - "##zel", - "##oud", - "Own", - "##corn", - "Divine", - "EMI", - "Relief", - "Northwestern", - "ethics", - "BMW", - "click", - "plasma", - "Christie", - "coordinator", - "Shepherd", - "washing", - "cooked", - "##dio", - "##eat", - "Cerambycidae", - "algebra", - "Engine", - "costumes", - "Vampire", - "vault", - "submission", - "virtue", - "assumption", - "##rell", - "Toledo", - "##oting", - "##rva", - "crept", - "emphasized", - "##lton", - "##ood", - "Greeks", - "surgical", - "crest", - "Patrol", - "Beta", - "Tessa", - "##GS", - "pizza", - "traits", - "rats", - "Iris", - "spray", - "##GC", - "Lightning", - "binary", - "escapes", - "##take", - "Clary", - "crowds", - "##zong", - "hauled", - "maid", - "##fen", - "Manning", - "##yang", - "Nielsen", - "aesthetic", - "sympathetic", - "affiliation", - "soaked", - "Mozart", - "personalities", - "begging", - "##iga", - "clip", - "Raphael", - "yearly", - "Lima", - "abundant", - "##lm", - "1794", - "strips", - "Initiative", - "reporters", - "##vsky", - "consolidated", - "##itated", - "Civic", - "rankings", - "mandate", - "symbolic", - "##ively", - "1807", - "rental", - "duck", - "nave", - "complications", - "##nor", - "Irene", - "Nazis", - "haunted", - "scholarly", - "Pratt", - "Gran", - "Embassy", - "Wave", - "pity", - "genius", - "bats", - "canton", - "Tropical", - "marker", - "##cos", - "escorted", - "Climate", - "##posed", - "appreciation", - "freezing", - "puzzle", - "Internal", - "pools", - "Shawn", - "pathway", - "Daniels", - "Fitzgerald", - "extant", - "olive", - "Vanessa", - "marriages", - "cocked", - "##dging", - "prone", - "chemicals", - "doll", - "drawer", - "##HF", - "Stark", - "Property", - "##tai", - "flowed", - "Sheridan", - "##uated", - "Less", - "Omar", - "remarks", - "catalogue", - "Seymour", - "wreck", - "Carrie", - "##bby", - "Mercer", - "displaced", - "sovereignty", - "rip", - "Flynn", - "Archie", - "Quarterfinals", - "Hassan", - "##ards", - "vein", - "Osaka", - "pouring", - "wages", - "Romance", - "##cript", - "##phere", - "550", - "##eil", - "##stown", - "Documentary", - "ancestor", - "CNN", - "Panthers", - "publishers", - "Rise", - "##mu", - "biting", - "Bright", - "String", - "succeeding", - "119", - "loaned", - "Warwick", - "Sheikh", - "Von", - "Afterwards", - "Jax", - "Camden", - "helicopters", - "Hence", - "Laurel", - "##ddy", - "transaction", - "Corp", - "clause", - "##owing", - "##kel", - "Investment", - "cups", - "Lucia", - "Moss", - "Giles", - "chef", - "López", - "decisive", - "30th", - "distress", - "linguistic", - "surveys", - "Ready", - "maiden", - "Touch", - "frontier", - "incorporate", - "exotic", - "mollusk", - "Leopold", - "Ride", - "##wain", - "##ndo", - "teammates", - "tones", - "drift", - "ordering", - "Feb", - "Penny", - "Normandy", - "Present", - "Flag", - "pipes", - "##rro", - "delight", - "motto", - "Tibet", - "leap", - "Eliza", - "Produced", - "teenagers", - "sitcom", - "Try", - "Hansen", - "Cody", - "wandered", - "terrestrial", - "frog", - "scare", - "resisted", - "employers", - "coined", - "##DS", - "resistant", - "Fly", - "captive", - "dissolution", - "judged", - "associates", - "defining", - "##court", - "Hale", - "##mbo", - "raises", - "clusters", - "twelfth", - "##metric", - "Roads", - "##itude", - "satisfy", - "Android", - "Reds", - "Gloucester", - "Category", - "Valencia", - "Daemon", - "stabbed", - "Luna", - "Churches", - "Canton", - "##eller", - "Attack", - "Kashmir", - "annexed", - "grabs", - "asteroid", - "Hartford", - "recommendation", - "Rodriguez", - "handing", - "stressed", - "frequencies", - "delegate", - "Bones", - "Erie", - "Weber", - "Hands", - "Acts", - "millimetres", - "24th", - "Fat", - "Howe", - "casually", - "##SL", - "convent", - "1790", - "IF", - "##sity", - "1795", - "yelling", - "##ises", - "drain", - "addressing", - "amino", - "Marcel", - "Sylvia", - "Paramount", - "Gerard", - "Volleyball", - "butter", - "124", - "Albion", - "##GB", - "triggered", - "1792", - "folding", - "accepts", - "##ße", - "preparations", - "Wimbledon", - "dose", - "##grass", - "escaping", - "##tling", - "import", - "charging", - "##dation", - "280", - "Nolan", - "##fried", - "Calcutta", - "##pool", - "Cove", - "examining", - "minded", - "heartbeat", - "twisting", - "domains", - "bush", - "Tunisia", - "Purple", - "Leone", - "##code", - "evacuated", - "battlefield", - "tiger", - "Electrical", - "##ared", - "chased", - "##cre", - "cultivated", - "Jet", - "solved", - "shrug", - "ringing", - "Impact", - "##iant", - "kilometre", - "##log", - "commemorate", - "migrated", - "singular", - "designing", - "promptly", - "Higgins", - "##own", - "##aves", - "freshwater", - "Marketing", - "Payne", - "beg", - "locker", - "pray", - "implied", - "AAA", - "corrected", - "Trans", - "Europeans", - "Ashe", - "acknowledge", - "Introduction", - "##writer", - "##llen", - "Munster", - "auxiliary", - "growl", - "Hours", - "Poems", - "##AT", - "reduces", - "Plain", - "plague", - "canceled", - "detention", - "polite", - "necklace", - "Gustav", - "##gu", - "##lance", - "En", - "Angola", - "##bb", - "dwelling", - "##hea", - "5000", - "Qing", - "Dodgers", - "rim", - "##ored", - "##haus", - "spilled", - "Elisabeth", - "Viktor", - "backpack", - "1802", - "amended", - "##worthy", - "Phantom", - "##ctive", - "keeper", - "##loom", - "Vikings", - "##gua", - "employs", - "Tehran", - "specialty", - "##bate", - "Marx", - "Mirror", - "Jenna", - "rides", - "needle", - "prayers", - "clarinet", - "forewings", - "##walk", - "Midlands", - "convincing", - "advocacy", - "Cao", - "Birds", - "cycles", - "Clement", - "Gil", - "bubble", - "Maximum", - "humanitarian", - "Tan", - "cries", - "##SI", - "Parsons", - "Trio", - "offshore", - "Innovation", - "clutched", - "260", - "##mund", - "##duct", - "Prairie", - "relied", - "Falcon", - "##ste", - "Kolkata", - "Gill", - "Swift", - "Negro", - "Zoo", - "valleys", - "##OL", - "Opening", - "beams", - "MPs", - "outline", - "Bermuda", - "Personal", - "exceed", - "productive", - "##MT", - "republic", - "forum", - "##sty", - "tornado", - "Known", - "dipped", - "Edith", - "folks", - "mathematician", - "watershed", - "Ricardo", - "synthetic", - "##dication", - "deity", - "##₄", - "gaming", - "subjected", - "suspects", - "Foot", - "swollen", - "Motors", - "##tty", - "##ý", - "aloud", - "ceremonial", - "es", - "nuts", - "intend", - "Carlisle", - "tasked", - "hesitation", - "sponsors", - "unified", - "inmates", - "##ctions", - "##stan", - "tiles", - "jokes", - "whereby", - "outcomes", - "Lights", - "scary", - "Stoke", - "Portrait", - "Blind", - "sergeant", - "violations", - "cultivation", - "fuselage", - "Mister", - "Alfonso", - "candy", - "sticks", - "teen", - "agony", - "Enough", - "invite", - "Perkins", - "Appeal", - "mapping", - "undergo", - "Glacier", - "Melanie", - "affects", - "incomplete", - "##dd", - "Colombian", - "##nate", - "CBC", - "purchasing", - "bypass", - "Drug", - "Electronics", - "Frontier", - "Coventry", - "##aan", - "autonomy", - "scrambled", - "Recent", - "bounced", - "cow", - "experiencing", - "Rouge", - "cuisine", - "Elite", - "disability", - "Ji", - "inheritance", - "wildly", - "Into", - "##wig", - "confrontation", - "Wheeler", - "shiver", - "Performing", - "aligned", - "consequently", - "Alexis", - "Sin", - "woodland", - "executives", - "Stevenson", - "Ferrari", - "inevitable", - "##cist", - "##dha", - "##base", - "Corner", - "comeback", - "León", - "##eck", - "##urus", - "MacDonald", - "pioneering", - "breakdown", - "landscapes", - "Veterans", - "Rican", - "Theological", - "stirred", - "participant", - "Credit", - "Hyderabad", - "snails", - "Claudia", - "##ocene", - "compliance", - "##MI", - "Flags", - "Middlesex", - "storms", - "winding", - "asserted", - "er", - "##ault", - "##kal", - "waking", - "##rates", - "abbey", - "Augusta", - "tooth", - "trustees", - "Commodore", - "##uded", - "Cunningham", - "NC", - "Witch", - "marching", - "Sword", - "Same", - "spiral", - "Harley", - "##ahan", - "Zack", - "Audio", - "1890s", - "##fit", - "Simmons", - "Kara", - "Veronica", - "negotiated", - "Speaking", - "FIBA", - "Conservatory", - "formations", - "constituencies", - "explicit", - "facial", - "eleventh", - "##ilt", - "villain", - "##dog", - "##case", - "##hol", - "armored", - "tin", - "hairs", - "##umi", - "##rai", - "mattress", - "Angus", - "cease", - "verbal", - "Recreation", - "savings", - "Aurora", - "peers", - "Monastery", - "Airways", - "drowned", - "additions", - "downstream", - "sticking", - "Shi", - "mice", - "skiing", - "##CD", - "Raw", - "Riverside", - "warming", - "hooked", - "boost", - "memorable", - "posed", - "treatments", - "320", - "##dai", - "celebrating", - "blink", - "helpless", - "circa", - "Flowers", - "PM", - "uncommon", - "Oct", - "Hawks", - "overwhelmed", - "Sparhawk", - "repaired", - "Mercy", - "pose", - "counterpart", - "compare", - "survives", - "##½", - "##eum", - "coordinate", - "Lil", - "grandchildren", - "notorious", - "Yi", - "Judaism", - "Juliet", - "accusations", - "1789", - "floated", - "marathon", - "roar", - "fortified", - "reunion", - "145", - "Nov", - "Paula", - "##fare", - "##toria", - "tearing", - "Cedar", - "disappearance", - "Si", - "gifted", - "scar", - "270", - "PBS", - "Technologies", - "Marvin", - "650", - "roller", - "cupped", - "negotiate", - "##erman", - "passport", - "tram", - "miracle", - "styled", - "##tier", - "necessity", - "Des", - "rehabilitation", - "Lara", - "USD", - "psychic", - "wipe", - "##lem", - "mistaken", - "##lov", - "charming", - "Rider", - "pageant", - "dynamics", - "Cassidy", - "##icus", - "defenses", - "##tadt", - "##vant", - "aging", - "##inal", - "declare", - "mistress", - "supervised", - "##alis", - "##rest", - "Ashton", - "submerged", - "sack", - "Dodge", - "grocery", - "ramp", - "Teacher", - "lineage", - "imagery", - "arrange", - "inscriptions", - "Organisation", - "Siege", - "combines", - "pounded", - "Fleming", - "legends", - "columnist", - "Apostolic", - "prose", - "insight", - "Arabian", - "expired", - "##uses", - "##nos", - "Alone", - "elbows", - "##asis", - "##adi", - "##combe", - "Step", - "Waterloo", - "Alternate", - "interval", - "Sonny", - "plains", - "Goals", - "incorporating", - "recruit", - "adjoining", - "Cheshire", - "excluding", - "marrying", - "ducked", - "Cherokee", - "par", - "##inate", - "hiking", - "Coal", - "##bow", - "natives", - "ribbon", - "Allies", - "con", - "descriptions", - "positively", - "##lal", - "defendant", - "22nd", - "Vivian", - "##beat", - "Weather", - "possessions", - "Date", - "sweetheart", - "inability", - "Salisbury", - "adviser", - "ideology", - "Nordic", - "##eu", - "Cubs", - "IP", - "Administrative", - "##nick", - "facto", - "liberation", - "Burnett", - "Javier", - "fashioned", - "Electoral", - "Turin", - "theft", - "unanimous", - "Per", - "1799", - "Clan", - "Hawkins", - "Teachers", - "##wes", - "Cameroon", - "Parkway", - "##gment", - "demolition", - "atoms", - "nucleus", - "##thi", - "recovering", - "##yte", - "##vice", - "lifts", - "Must", - "deposit", - "Hancock", - "Semi", - "darkened", - "Declaration", - "moan", - "muscular", - "Myers", - "attractions", - "sauce", - "simulation", - "##weed", - "Alps", - "barriers", - "##baum", - "Barack", - "galleries", - "Min", - "holders", - "Greenwich", - "donation", - "Everybody", - "Wolfgang", - "sandwich", - "Kendra", - "Collegiate", - "casino", - "Slavic", - "ensuing", - "Porto", - "##grapher", - "Jesuit", - "suppressed", - "tires", - "Ibrahim", - "protesters", - "Ibn", - "Amos", - "1796", - "phenomena", - "Hayden", - "Paraguay", - "Squad", - "Reilly", - "complement", - "aluminum", - "##eers", - "doubts", - "decay", - "demise", - "Practice", - "patience", - "fireplace", - "transparent", - "monarchy", - "##person", - "Rodney", - "mattered", - "rotating", - "Clifford", - "disposal", - "Standards", - "paced", - "##llie", - "arise", - "tallest", - "tug", - "documentation", - "node", - "freeway", - "Nikolai", - "##cite", - "clicked", - "imaging", - "Lorraine", - "Tactical", - "Different", - "Regular", - "Holding", - "165", - "Pilot", - "guarded", - "##polis", - "Classics", - "Mongolia", - "Brock", - "monarch", - "cellular", - "receptors", - "Mini", - "Chandler", - "financed", - "financially", - "Lives", - "erection", - "Fuller", - "unnamed", - "Kannada", - "cc", - "passive", - "plateau", - "##arity", - "freak", - "##rde", - "retrieved", - "transactions", - "##sus", - "23rd", - "swimmer", - "beef", - "fulfill", - "Arlington", - "offspring", - "reasoning", - "Rhys", - "saves", - "pseudonym", - "centimetres", - "shivered", - "shuddered", - "##ME", - "Feel", - "##otic", - "professors", - "Blackburn", - "##eng", - "##life", - "##haw", - "interred", - "lodge", - "fragile", - "Della", - "guardian", - "##bbled", - "catalog", - "clad", - "observer", - "tract", - "declaring", - "##headed", - "Lok", - "dean", - "Isabelle", - "1776", - "irrigation", - "spectacular", - "shuttle", - "mastering", - "##aro", - "Nathaniel", - "Retired", - "##lves", - "Brennan", - "##kha", - "dick", - "##dated", - "##hler", - "Rookie", - "leapt", - "televised", - "weekends", - "Baghdad", - "Yemen", - "##fo", - "factions", - "ion", - "Lab", - "mortality", - "passionate", - "Hammer", - "encompasses", - "confluence", - "demonstrations", - "Ki", - "derivative", - "soils", - "##unch", - "Ranch", - "Universities", - "conventions", - "outright", - "aiming", - "hierarchy", - "reside", - "illusion", - "graves", - "rituals", - "126", - "Antwerp", - "Dover", - "##ema", - "campuses", - "Hobart", - "lifelong", - "aliens", - "##vity", - "Memory", - "coordination", - "alphabet", - "##mina", - "Titans", - "pushes", - "Flanders", - "##holder", - "Normal", - "excellence", - "capped", - "profound", - "Taipei", - "portrayal", - "sparked", - "scratch", - "se", - "##eas", - "##hir", - "Mackenzie", - "##cation", - "Neo", - "Shin", - "##lined", - "magnificent", - "poster", - "batsman", - "##rgent", - "persuade", - "##ement", - "Icelandic", - "miserable", - "collegiate", - "Feature", - "geography", - "##mura", - "Comic", - "Circus", - "processor", - "barracks", - "Tale", - "##11", - "Bulls", - "##rap", - "strengthened", - "##bell", - "injection", - "miniature", - "broadly", - "Letter", - "fare", - "hostage", - "traders", - "##nium", - "##mere", - "Fortune", - "Rivera", - "Lu", - "triumph", - "Browns", - "Bangalore", - "cooperative", - "Basel", - "announcing", - "Sawyer", - "##him", - "##cco", - "##kara", - "darted", - "##AD", - "##nova", - "sucking", - "##position", - "perimeter", - "flung", - "Holdings", - "##NP", - "Basque", - "sketches", - "Augustine", - "Silk", - "Elijah", - "analyst", - "armour", - "riots", - "acquiring", - "ghosts", - "##ems", - "132", - "Pioneer", - "Colleges", - "Simone", - "Economy", - "Author", - "semester", - "Soldier", - "il", - "##unting", - "##bid", - "freaking", - "Vista", - "tumor", - "##bat", - "murderer", - "##eda", - "unreleased", - "##grove", - "##sser", - "##té", - "edit", - "statute", - "sovereign", - "##gawa", - "Killer", - "stares", - "Fury", - "comply", - "##lord", - "##nant", - "barrels", - "Andhra", - "Maple", - "generator", - "mascot", - "unusually", - "eds", - "##ante", - "##runner", - "rod", - "##tles", - "Historically", - "Jennings", - "dumped", - "Established", - "resemblance", - "##lium", - "##cise", - "##body", - "##voke", - "Lydia", - "##hou", - "##iring", - "nonetheless", - "1797", - "corrupt", - "patrons", - "physicist", - "sneak", - "Livingston", - "Citizens", - "Architects", - "Werner", - "trends", - "Melody", - "eighty", - "markings", - "brakes", - "##titled", - "oversaw", - "processed", - "mock", - "Midwest", - "intervals", - "##EF", - "stretches", - "werewolf", - "##MG", - "Pack", - "controller", - "##dition", - "Honours", - "cane", - "Griffith", - "vague", - "repertoire", - "Courtney", - "orgasm", - "Abdullah", - "dominance", - "occupies", - "Ya", - "introduces", - "Lester", - "instinct", - "collaborative", - "Indigenous", - "refusal", - "##rank", - "outlet", - "debts", - "spear", - "155", - "##keeping", - "##ulu", - "Catalan", - "##osh", - "tensions", - "##OT", - "bred", - "crude", - "Dunn", - "abdomen", - "accurately", - "##fu", - "##lough", - "accidents", - "Row", - "Audrey", - "rude", - "Getting", - "promotes", - "replies", - "Paolo", - "merge", - "##nock", - "trans", - "Evangelical", - "automated", - "Canon", - "##wear", - "##ggy", - "##gma", - "Broncos", - "foolish", - "icy", - "Voices", - "knives", - "Aside", - "dreamed", - "generals", - "molecule", - "AG", - "rejection", - "insufficient", - "##nagar", - "deposited", - "sacked", - "Landing", - "arches", - "helpful", - "devotion", - "intake", - "Flower", - "PGA", - "dragons", - "evolutionary", - "##mail", - "330", - "GM", - "tissues", - "##tree", - "arcade", - "composite", - "lid", - "Across", - "implications", - "lacks", - "theological", - "assessed", - "concentrations", - "Den", - "##mans", - "##ulous", - "Fu", - "homeland", - "##stream", - "Harriet", - "ecclesiastical", - "troop", - "ecological", - "winked", - "##xed", - "eighteenth", - "Casino", - "specializing", - "##sworth", - "unlocked", - "supreme", - "devastated", - "snatched", - "trauma", - "GDP", - "Nord", - "saddle", - "Wes", - "convenient", - "competes", - "##nu", - "##iss", - "Marian", - "subway", - "##rri", - "successes", - "umbrella", - "##far", - "##ually", - "Dundee", - "##cence", - "spark", - "##rix", - "##я", - "Quality", - "Geological", - "cockpit", - "rpm", - "Cam", - "Bucharest", - "riot", - "##PM", - "Leah", - "##dad", - "##pose", - "Ka", - "m³", - "Bundesliga", - "Wolfe", - "grim", - "textile", - "quartet", - "expressing", - "fantastic", - "destroyers", - "eternal", - "picnic", - "##oro", - "contractor", - "1775", - "spanning", - "declining", - "##cating", - "Lowe", - "Sutherland", - "Emirates", - "downward", - "nineteen", - "violently", - "scout", - "viral", - "melting", - "enterprises", - "##cer", - "Crosby", - "Jubilee", - "antenna", - "urgent", - "Rory", - "##uin", - "##sure", - "wandering", - "##gler", - "##vent", - "Suzuki", - "Lifetime", - "Dirty", - "occupying", - "##quent", - "Disc", - "Guru", - "mound", - "Lennon", - "Humanities", - "listeners", - "Walton", - "uh", - "Braves", - "Bologna", - "##bis", - "##gra", - "Dwight", - "crawl", - "flags", - "memoir", - "Thorne", - "Archdiocese", - "dairy", - "##uz", - "##tery", - "roared", - "adjust", - "patches", - "inn", - "Knowing", - "##bbed", - "##zan", - "scan", - "Papa", - "precipitation", - "angrily", - "passages", - "postal", - "Phi", - "embraced", - "blacks", - "economist", - "triangular", - "Sen", - "shooter", - "punished", - "Millennium", - "Swimming", - "confessed", - "Aston", - "defeats", - "Era", - "cousins", - "Williamson", - "##rer", - "daytime", - "dumb", - "##rek", - "underway", - "specification", - "Buchanan", - "prayed", - "concealed", - "activation", - "##issa", - "canon", - "awesome", - "Starr", - "plural", - "summers", - "##fields", - "Slam", - "unnecessary", - "1791", - "resume", - "trilogy", - "compression", - "##rough", - "selective", - "dignity", - "Yan", - "##xton", - "immense", - "##yun", - "lone", - "seeded", - "hiatus", - "lightweight", - "summary", - "Yo", - "approve", - "Galway", - "rejoined", - "Elise", - "garbage", - "burns", - "speeches", - "129", - "Honduras", - "##liness", - "inventory", - "jersey", - "FK", - "assure", - "slumped", - "Lionel", - "Suite", - "##sbury", - "Lena", - "continuation", - "##AN", - "brightly", - "##nti", - "GT", - "Knowledge", - "##park", - "##lius", - "lethal", - "##tribution", - "##sions", - "Certificate", - "Mara", - "##lby", - "algorithms", - "Jade", - "blows", - "pirates", - "fleeing", - "wheelchair", - "Stein", - "sophomore", - "Alt", - "Territorial", - "diploma", - "snakes", - "##olic", - "##tham", - "Tiffany", - "Pius", - "flush", - "urging", - "Hanover", - "Reich", - "##olate", - "Unity", - "Pike", - "collectively", - "Theme", - "ballad", - "kindergarten", - "rocked", - "zoo", - "##page", - "whip", - "Rodríguez", - "strokes", - "checks", - "Becky", - "Stern", - "upstream", - "##uta", - "Silent", - "volunteered", - "Sigma", - "##ingen", - "##tract", - "##ede", - "Gujarat", - "screwed", - "entertaining", - "##action", - "##ryn", - "defenders", - "innocence", - "lesbian", - "que", - "Richie", - "nodes", - "Lie", - "juvenile", - "Jakarta", - "safer", - "confront", - "Bert", - "breakthrough", - "gospel", - "Cable", - "##zie", - "institutional", - "Archive", - "brake", - "liquor", - "feeds", - "##iate", - "chancellor", - "Encyclopedia", - "Animation", - "scanning", - "teens", - "##mother", - "Core", - "Rear", - "Wine", - "##flower", - "reactor", - "Ave", - "cardinal", - "sodium", - "strands", - "Olivier", - "crouched", - "Vaughan", - "Sammy", - "Image", - "scars", - "Emmanuel", - "flour", - "bias", - "nipple", - "revelation", - "##ucci", - "Denny", - "##ssy", - "Form", - "Runners", - "admits", - "Rama", - "violated", - "Burmese", - "feud", - "underwear", - "Mohamed", - "Named", - "swift", - "statewide", - "Door", - "Recently", - "comparing", - "Hundred", - "##idge", - "##nity", - "##rds", - "Rally", - "Reginald", - "Auburn", - "solving", - "waitress", - "Treasurer", - "##ilization", - "Halloween", - "Ministers", - "Boss", - "Shut", - "##listic", - "Rahman", - "demonstrating", - "##pies", - "Gaza", - "Yuri", - "installations", - "Math", - "schooling", - "##bble", - "Bronx", - "exiled", - "gasoline", - "133", - "bundle", - "humid", - "FCC", - "proportional", - "relate", - "VFL", - "##dez", - "continuity", - "##cene", - "syndicated", - "atmospheric", - "arrows", - "Wanderers", - "reinforcements", - "Willow", - "Lexington", - "Rotten", - "##yon", - "discovering", - "Serena", - "portable", - "##lysis", - "targeting", - "£1", - "Goodman", - "Steam", - "sensors", - "detachment", - "Malik", - "##erie", - "attitudes", - "Goes", - "Kendall", - "Read", - "Sleep", - "beans", - "Nikki", - "modification", - "Jeanne", - "knuckles", - "Eleven", - "##iously", - "Gross", - "Jaime", - "dioxide", - "moisture", - "Stones", - "UCI", - "displacement", - "Metacritic", - "Jury", - "lace", - "rendering", - "elephant", - "Sergei", - "##quire", - "GP", - "Abbott", - "##type", - "projection", - "Mouse", - "Bishops", - "whispering", - "Kathleen", - "Rams", - "##jar", - "whites", - "##oran", - "assess", - "dispatched", - "##hire", - "kin", - "##mir", - "Nursing", - "advocates", - "tremendous", - "sweater", - "assisting", - "##bil", - "Farmer", - "prominently", - "reddish", - "Hague", - "cyclone", - "##SD", - "Sage", - "Lawson", - "Sanctuary", - "discharged", - "retains", - "##ube", - "shotgun", - "wilderness", - "Reformed", - "similarity", - "Entry", - "Watts", - "Bahá", - "Quest", - "Looks", - "visions", - "Reservoir", - "Arabs", - "curls", - "Blu", - "dripping", - "accomplish", - "Verlag", - "drill", - "sensor", - "Dillon", - "physicians", - "smashed", - "##dir", - "painters", - "Renault", - "straw", - "fading", - "Directorate", - "lounge", - "commissions", - "Brain", - "##graph", - "neo", - "##urg", - "plug", - "coordinated", - "##houses", - "Critical", - "lamps", - "illustrator", - "Returning", - "erosion", - "Crow", - "##ciation", - "blessing", - "Thought", - "Wife", - "medalist", - "synthesizer", - "Pam", - "Thornton", - "Esther", - "HBO", - "fond", - "Associates", - "##raz", - "pirate", - "permits", - "Wide", - "tire", - "##PC", - "Ernie", - "Nassau", - "transferring", - "RFC", - "##ntly", - "um", - "spit", - "AS", - "##mps", - "Mining", - "polar", - "villa", - "anchored", - "##zzi", - "embarrassment", - "relates", - "##ă", - "Rupert", - "counterparts", - "131", - "Baxter", - "##18", - "Igor", - "recognizes", - "Clive", - "##hane", - "##eries", - "##ibly", - "occurrence", - "##scope", - "fin", - "colorful", - "Rapids", - "banker", - "tile", - "##rative", - "##dus", - "delays", - "destinations", - "##llis", - "Pond", - "Dane", - "grandparents", - "rewarded", - "socially", - "motorway", - "##hof", - "##lying", - "##human", - "modeled", - "Dayton", - "Forward", - "conscience", - "Sharma", - "whistle", - "Mayer", - "Sasha", - "##pical", - "circuits", - "Zhou", - "##ça", - "Latvian", - "finalists", - "predators", - "Lafayette", - "closes", - "obligations", - "Resolution", - "##vier", - "Trustees", - "reminiscent", - "##hos", - "Highlands", - "Protected", - "asylum", - "evacuation", - "##acy", - "Chevrolet", - "confession", - "Somalia", - "emergence", - "separating", - "##rica", - "alright", - "calcium", - "Laurent", - "Welfare", - "Leonardo", - "ashes", - "dental", - "Deal", - "minerals", - "##lump", - "##mount", - "accounted", - "staggered", - "slogan", - "photographic", - "builder", - "##imes", - "##raft", - "tragic", - "144", - "SEC", - "Hit", - "tailed", - "##ples", - "##rring", - "##rson", - "ethical", - "wrestlers", - "concludes", - "lunar", - "##ept", - "nitrogen", - "Aid", - "cyclist", - "quarterfinals", - "##ه", - "harvest", - "##hem", - "Pasha", - "IL", - "##mis", - "continually", - "##forth", - "Intel", - "bucket", - "##ended", - "witches", - "pretended", - "dresses", - "viewer", - "peculiar", - "lowering", - "volcano", - "Marilyn", - "Qualifier", - "clung", - "##sher", - "Cut", - "modules", - "Bowie", - "##lded", - "onset", - "transcription", - "residences", - "##pie", - "##itor", - "scrapped", - "##bic", - "Monaco", - "Mayo", - "eternity", - "Strike", - "uncovered", - "skeleton", - "##wicz", - "Isles", - "bug", - "Promoted", - "##rush", - "Mechanical", - "XII", - "##ivo", - "gripping", - "stubborn", - "velvet", - "TD", - "decommissioned", - "operas", - "spatial", - "unstable", - "Congressman", - "wasted", - "##aga", - "##ume", - "advertisements", - "##nya", - "obliged", - "Cannes", - "Conway", - "bricks", - "##gnant", - "##mity", - "##uise", - "jumps", - "Clear", - "##cine", - "##sche", - "chord", - "utter", - "Su", - "podium", - "spokesman", - "Royce", - "assassin", - "confirmation", - "licensing", - "liberty", - "##rata", - "Geographic", - "individually", - "detained", - "##ffe", - "Saturn", - "crushing", - "airplane", - "bushes", - "knights", - "##PD", - "Lilly", - "hurts", - "unexpectedly", - "Conservatives", - "pumping", - "Forty", - "candle", - "Pérez", - "peasants", - "supplement", - "Sundays", - "##ggs", - "##rries", - "risen", - "enthusiastic", - "corresponds", - "pending", - "##IF", - "Owens", - "floods", - "Painter", - "inflation", - "presumed", - "inscribed", - "Chamberlain", - "bizarre", - "1200", - "liability", - "reacted", - "tub", - "Legacy", - "##eds", - "##pted", - "shone", - "##litz", - "##NC", - "Tiny", - "genome", - "bays", - "Eduardo", - "robbery", - "stall", - "hatch", - "Depot", - "Variety", - "Flora", - "reprinted", - "trembled", - "outlined", - "CR", - "Theresa", - "spans", - "##plication", - "Jensen", - "##eering", - "posting", - "##rky", - "pays", - "##ost", - "Marcos", - "fortifications", - "inferior", - "##ential", - "Devi", - "despair", - "Talbot", - "##chus", - "updates", - "ego", - "Booth", - "Darius", - "tops", - "##lau", - "Scene", - "##DC", - "Harlem", - "Trey", - "Generally", - "candles", - "##α", - "Neville", - "Admiralty", - "##hong", - "iconic", - "victorious", - "1600", - "Rowan", - "abundance", - "miniseries", - "clutching", - "sanctioned", - "##words", - "obscure", - "##ision", - "##rle", - "##EM", - "disappearing", - "Resort", - "Obviously", - "##eb", - "exceeded", - "1870s", - "Adults", - "##cts", - "Cry", - "Kerr", - "ragged", - "selfish", - "##lson", - "circled", - "pillars", - "galaxy", - "##asco", - "##mental", - "rebuild", - "caution", - "Resistance", - "Start", - "bind", - "splitting", - "Baba", - "Hogan", - "ps", - "partnerships", - "slam", - "Peggy", - "courthouse", - "##OD", - "organizational", - "packages", - "Angie", - "##nds", - "possesses", - "##rp", - "Expressway", - "Gould", - "Terror", - "Him", - "Geoff", - "nobles", - "##ope", - "shark", - "##nh", - "identifies", - "##oor", - "testified", - "Playing", - "##ump", - "##isa", - "stool", - "Idol", - "##pice", - "##tana", - "Byrne", - "Gerry", - "grunted", - "26th", - "observing", - "habits", - "privilege", - "immortal", - "wagons", - "##thy", - "dot", - "Bring", - "##lian", - "##witz", - "newest", - "##uga", - "constraints", - "Screen", - "Issue", - "##RNA", - "##vil", - "reminder", - "##gles", - "addiction", - "piercing", - "stunning", - "var", - "##rita", - "Signal", - "accumulated", - "##wide", - "float", - "devastating", - "viable", - "cartoons", - "Uttar", - "flared", - "##encies", - "Theology", - "patents", - "##bahn", - "privileges", - "##ava", - "##CO", - "137", - "##oped", - "##NT", - "orchestral", - "medication", - "225", - "erect", - "Nadia", - "École", - "fried", - "Sales", - "scripts", - "##rease", - "airs", - "Cage", - "inadequate", - "structured", - "countless", - "Avengers", - "Kathy", - "disguise", - "mirrors", - "Investigation", - "reservation", - "##nson", - "Legends", - "humorous", - "Mona", - "decorations", - "attachment", - "Via", - "motivation", - "Browne", - "strangers", - "##ński", - "Shadows", - "Twins", - "##pressed", - "Alma", - "Nominated", - "##ott", - "Sergio", - "canopy", - "152", - "Semifinals", - "devised", - "##irk", - "upwards", - "Traffic", - "Goddess", - "Move", - "beetles", - "138", - "spat", - "##anne", - "holdings", - "##SP", - "tangled", - "Whilst", - "Fowler", - "anthem", - "##ING", - "##ogy", - "snarled", - "moonlight", - "songwriting", - "tolerance", - "Worlds", - "exams", - "##pia", - "notices", - "sensitivity", - "poetic", - "Stephens", - "Boone", - "insect", - "reconstructed", - "Fresh", - "27th", - "balloon", - "##ables", - "Brendan", - "mug", - "##gee", - "1780", - "apex", - "exports", - "slides", - "Lahore", - "hiring", - "Shell", - "electorate", - "sexuality", - "poker", - "nonprofit", - "##imate", - "cone", - "##uce", - "Okinawa", - "superintendent", - "##HC", - "referenced", - "turret", - "Sprint", - "Citizen", - "equilibrium", - "Stafford", - "curb", - "Driver", - "Valerie", - "##rona", - "aching", - "impacts", - "##bol", - "observers", - "Downs", - "Shri", - "##uth", - "airports", - "##uda", - "assignments", - "curtains", - "solitary", - "icon", - "patrols", - "substances", - "Jasper", - "mountainous", - "Published", - "ached", - "##ingly", - "announce", - "dove", - "damaging", - "##tism", - "Primera", - "Dexter", - "limiting", - "batch", - "##uli", - "undergoing", - "refugee", - "Ye", - "admiral", - "pavement", - "##WR", - "##reed", - "pipeline", - "desires", - "Ramsey", - "Sheila", - "thickness", - "Brotherhood", - "Tea", - "instituted", - "Belt", - "Break", - "plots", - "##ais", - "masculine", - "##where", - "Theo", - "##aged", - "##mined", - "Experience", - "scratched", - "Ethiopian", - "Teaching", - "##nov", - "Aiden", - "Abe", - "Samoa", - "conditioning", - "##mous", - "Otherwise", - "fade", - "Jenks", - "##encing", - "Nat", - "##lain", - "Anyone", - "##kis", - "smirk", - "Riding", - "##nny", - "Bavarian", - "blessed", - "potatoes", - "Hook", - "##wise", - "likewise", - "hardened", - "Merry", - "amid", - "persecution", - "##sten", - "Elections", - "Hoffman", - "Pitt", - "##vering", - "distraction", - "exploitation", - "infamous", - "quote", - "averaging", - "healed", - "Rhythm", - "Germanic", - "Mormon", - "illuminated", - "guides", - "##ische", - "interfere", - "##ilized", - "rector", - "perennial", - "##ival", - "Everett", - "courtesy", - "##nham", - "Kirby", - "Mk", - "##vic", - "Medieval", - "##tale", - "Luigi", - "limp", - "##diction", - "Alive", - "greeting", - "shove", - "##force", - "##fly", - "Jasmine", - "Bend", - "Capt", - "Suzanne", - "ditch", - "134", - "##nning", - "Host", - "fathers", - "rebuilding", - "Vocal", - "wires", - "##manship", - "tan", - "Factor", - "fixture", - "##LS", - "Māori", - "Plate", - "pyramid", - "##umble", - "slap", - "Schneider", - "yell", - "##ulture", - "##tional", - "Goodbye", - "sore", - "##pher", - "depressed", - "##dox", - "pitching", - "Find", - "Lotus", - "##wang", - "strand", - "Teen", - "debates", - "prevalent", - "##bilities", - "exposing", - "hears", - "billed", - "##rse", - "reorganized", - "compelled", - "disturbing", - "displaying", - "##tock", - "Clinical", - "emotionally", - "##iah", - "Derbyshire", - "grouped", - "##quel", - "Bahrain", - "Journalism", - "IN", - "persistent", - "blankets", - "Crane", - "camping", - "Direct", - "proving", - "Lola", - "##dding", - "Corporate", - "birthplace", - "##boats", - "##ender", - "Figure", - "dared", - "Assam", - "precursor", - "##nched", - "Tribe", - "Restoration", - "slate", - "Meyrick", - "hunted", - "stroking", - "Earlier", - "Kind", - "polls", - "appeals", - "monetary", - "##reate", - "Kira", - "Langdon", - "explores", - "GPS", - "extensions", - "squares", - "Results", - "draped", - "announcer", - "merit", - "##ennial", - "##tral", - "##roved", - "##cion", - "robots", - "supervisor", - "snorted", - "##group", - "Cannon", - "procession", - "monkey", - "freeze", - "sleeves", - "Nile", - "verdict", - "ropes", - "firearms", - "extraction", - "tensed", - "EC", - "Saunders", - "##tches", - "diamonds", - "Marriage", - "##amble", - "curling", - "Amazing", - "##haling", - "unrelated", - "##roads", - "Daughter", - "cum", - "discarded", - "kidney", - "cliffs", - "forested", - "Candy", - "##lap", - "authentic", - "tablet", - "notation", - "##nburg", - "Bulldogs", - "Callum", - "Meet", - "mouths", - "coated", - "##xe", - "Truman", - "combinations", - "##mation", - "Steelers", - "Fan", - "Than", - "paternal", - "##father", - "##uti", - "Rebellion", - "inviting", - "Fun", - "theatres", - "##ي", - "##rom", - "curator", - "##cision", - "networking", - "Oz", - "drought", - "##ssel", - "granting", - "MBA", - "Shelby", - "Elaine", - "jealousy", - "Kyoto", - "shores", - "signaling", - "tenants", - "debated", - "Intermediate", - "Wise", - "##hes", - "##pu", - "Havana", - "duke", - "vicious", - "exited", - "servers", - "Nonetheless", - "Reports", - "explode", - "##beth", - "Nationals", - "offerings", - "Oval", - "conferred", - "eponymous", - "folklore", - "##NR", - "Shire", - "planting", - "1783", - "Zeus", - "accelerated", - "Constable", - "consuming", - "troubles", - "McCartney", - "texture", - "bust", - "Immigration", - "excavated", - "hopefully", - "##cession", - "##coe", - "##name", - "##ully", - "lining", - "Einstein", - "Venezuelan", - "reissued", - "minorities", - "Beatrice", - "crystals", - "##nies", - "circus", - "lava", - "Beirut", - "extinction", - "##shu", - "Becker", - "##uke", - "issuing", - "Zurich", - "extract", - "##esta", - "##rred", - "regulate", - "progression", - "hut", - "alcoholic", - "plea", - "AB", - "Norse", - "Hubert", - "Mansfield", - "ashamed", - "##put", - "Bombardment", - "stripes", - "electrons", - "Denise", - "horrified", - "Nor", - "arranger", - "Hay", - "Koch", - "##ddling", - "##iner", - "Birthday", - "Josie", - "deliberate", - "explorer", - "##jiang", - "##signed", - "Arrow", - "wiping", - "satellites", - "baritone", - "mobility", - "##rals", - "Dorset", - "turbine", - "Coffee", - "185", - "##lder", - "Cara", - "Colts", - "pits", - "Crossing", - "coral", - "##birth", - "Tai", - "zombie", - "smoothly", - "##hp", - "mates", - "##ady", - "Marguerite", - "##tary", - "puzzled", - "tapes", - "overly", - "Sonic", - "Prayer", - "Thinking", - "##uf", - "IEEE", - "obligation", - "##cliffe", - "Basil", - "redesignated", - "##mmy", - "nostrils", - "Barney", - "XIII", - "##phones", - "vacated", - "unused", - "Berg", - "##roid", - "Towards", - "viola", - "136", - "Event", - "subdivided", - "rabbit", - "recruiting", - "##nery", - "Namibia", - "##16", - "##ilation", - "recruits", - "Famous", - "Francesca", - "##hari", - "Goa", - "##lat", - "Karachi", - "haul", - "biblical", - "##cible", - "MGM", - "##rta", - "horsepower", - "profitable", - "Grandma", - "importantly", - "Martinez", - "incoming", - "##kill", - "beneficial", - "nominal", - "praying", - "##isch", - "gable", - "nail", - "noises", - "##ttle", - "Polytechnic", - "rub", - "##cope", - "Thor", - "audition", - "erotic", - "##ending", - "##iano", - "Ultimately", - "armoured", - "##mum", - "presently", - "pedestrian", - "##tled", - "Ipswich", - "offence", - "##ffin", - "##borne", - "Flemish", - "##hman", - "echo", - "##cting", - "auditorium", - "gentlemen", - "winged", - "##tched", - "Nicaragua", - "Unknown", - "prosperity", - "exhaust", - "pie", - "Peruvian", - "compartment", - "heights", - "disabilities", - "##pole", - "Harding", - "Humphrey", - "postponed", - "moths", - "Mathematical", - "Mets", - "posters", - "axe", - "##nett", - "Nights", - "Typically", - "chuckle", - "councillors", - "alternating", - "141", - "Norris", - "##ately", - "##etus", - "deficit", - "dreaming", - "cooler", - "oppose", - "Beethoven", - "##esis", - "Marquis", - "flashlight", - "headache", - "investor", - "responding", - "appointments", - "##shore", - "Elias", - "ideals", - "shades", - "torch", - "lingering", - "##real", - "pier", - "fertile", - "Diploma", - "currents", - "Snake", - "##horse", - "##15", - "Briggs", - "##ota", - "##hima", - "##romatic", - "Coastal", - "Kuala", - "ankles", - "Rae", - "slice", - "Hilton", - "locking", - "Approximately", - "Workshop", - "Niagara", - "strangely", - "##scence", - "functionality", - "advertisement", - "Rapid", - "Anders", - "ho", - "Soviets", - "packing", - "basal", - "Sunderland", - "Permanent", - "##fting", - "rack", - "tying", - "Lowell", - "##ncing", - "Wizard", - "mighty", - "tertiary", - "pencil", - "dismissal", - "torso", - "grasped", - "##yev", - "Sand", - "gossip", - "##nae", - "Beer", - "implementing", - "##19", - "##riya", - "Fork", - "Bee", - "##eria", - "Win", - "##cid", - "sailor", - "pressures", - "##oping", - "speculated", - "Freddie", - "originating", - "##DF", - "##SR", - "##outh", - "28th", - "melt", - "Brenda", - "lump", - "Burlington", - "USC", - "marginal", - "##bine", - "Dogs", - "swamp", - "cu", - "Ex", - "uranium", - "metro", - "spill", - "Pietro", - "seize", - "Chorus", - "partition", - "##dock", - "##media", - "engineered", - "##oria", - "conclusions", - "subdivision", - "##uid", - "Illustrated", - "Leading", - "##hora", - "Berkshire", - "definite", - "##books", - "##cin", - "##suke", - "noun", - "winced", - "Doris", - "dissertation", - "Wilderness", - "##quest", - "braced", - "arbitrary", - "kidnapping", - "Kurdish", - "##but", - "clearance", - "excavations", - "wanna", - "Allmusic", - "insult", - "presided", - "yacht", - "##SM", - "Honour", - "Tin", - "attracting", - "explosives", - "Gore", - "Bride", - "##ience", - "Packers", - "Devils", - "Observer", - "##course", - "Loser", - "##erry", - "##hardt", - "##mble", - "Cyrillic", - "undefeated", - "##stra", - "subordinate", - "##ame", - "Wigan", - "compulsory", - "Pauline", - "Cruise", - "Opposition", - "##ods", - "Period", - "dispersed", - "expose", - "##60", - "##has", - "Certain", - "Clerk", - "Wolves", - "##hibition", - "apparatus", - "allegiance", - "orbital", - "justified", - "thanked", - "##ević", - "Biblical", - "Carolyn", - "Graves", - "##tton", - "Hercules", - "backgrounds", - "replica", - "1788", - "aquatic", - "Mega", - "Stirling", - "obstacles", - "filing", - "Founder", - "vowels", - "Deborah", - "Rotterdam", - "surpassed", - "Belarusian", - "##ologists", - "Zambia", - "Ren", - "Olga", - "Alpine", - "bi", - "councillor", - "Oaks", - "Animals", - "eliminating", - "digit", - "Managing", - "##GE", - "laundry", - "##rdo", - "presses", - "slamming", - "Tudor", - "thief", - "posterior", - "##bas", - "Rodgers", - "smells", - "##ining", - "Hole", - "SUV", - "trombone", - "numbering", - "representations", - "Domingo", - "Paralympics", - "cartridge", - "##rash", - "Combined", - "shelves", - "Kraków", - "revision", - "##frame", - "Sánchez", - "##tracted", - "##bler", - "Alain", - "townships", - "sic", - "trousers", - "Gibbs", - "anterior", - "symmetry", - "vaguely", - "Castile", - "IRA", - "resembling", - "Penguin", - "##ulent", - "infections", - "##stant", - "raped", - "##pressive", - "worrying", - "brains", - "bending", - "JR", - "Evidence", - "Venetian", - "complexes", - "Jonah", - "850", - "exported", - "Ambrose", - "Gap", - "philanthropist", - "##atus", - "Marxist", - "weighing", - "##KO", - "##nath", - "Soldiers", - "chiefs", - "reject", - "repeating", - "shaky", - "Zürich", - "preserving", - "##xin", - "cigarettes", - "##break", - "mortar", - "##fin", - "Already", - "reproduction", - "socks", - "Waiting", - "amazed", - "##aca", - "dash", - "##path", - "Airborne", - "##harf", - "##get", - "descending", - "OBE", - "Sant", - "Tess", - "Lucius", - "enjoys", - "##ttered", - "##ivation", - "##ete", - "Leinster", - "Phillies", - "execute", - "geological", - "unfinished", - "Courts", - "SP", - "Beaver", - "Duck", - "motions", - "Platinum", - "friction", - "##aud", - "##bet", - "Parts", - "Stade", - "entirety", - "sprang", - "Smithsonian", - "coffin", - "prolonged", - "Borneo", - "##vise", - "unanimously", - "##uchi", - "Cars", - "Cassandra", - "Australians", - "##CT", - "##rgen", - "Louisa", - "spur", - "Constance", - "##lities", - "Patent", - "racism", - "tempo", - "##ssion", - "##chard", - "##nology", - "##claim", - "Million", - "Nichols", - "##dah", - "Numerous", - "ing", - "Pure", - "plantations", - "donor", - "##EP", - "##rip", - "convenience", - "##plate", - "dots", - "indirect", - "##written", - "Dong", - "failures", - "adapt", - "wizard", - "unfortunately", - "##gion", - "practitioners", - "economically", - "Enrique", - "unchanged", - "kingdoms", - "refined", - "definitions", - "lazy", - "worries", - "railing", - "##nay", - "Kaiser", - "##lug", - "cracks", - "sells", - "ninety", - "##WC", - "Directed", - "denotes", - "developmental", - "papal", - "unfortunate", - "disappointing", - "sixteenth", - "Jen", - "##urier", - "NWA", - "drifting", - "Horror", - "##chemical", - "behaviors", - "bury", - "surfaced", - "foreigners", - "slick", - "AND", - "##rene", - "##ditions", - "##teral", - "scrap", - "kicks", - "comprise", - "buddy", - "##anda", - "Mental", - "##ype", - "Dom", - "wines", - "Limerick", - "Luca", - "Rand", - "##won", - "Tomatoes", - "homage", - "geometric", - "##nted", - "telescope", - "Shelley", - "poles", - "##fan", - "shareholders", - "Autonomous", - "cope", - "intensified", - "Genoa", - "Reformation", - "grazing", - "##tern", - "Zhao", - "provisional", - "##bies", - "Con", - "##riel", - "Cynthia", - "Raleigh", - "vivid", - "threaten", - "Length", - "subscription", - "roses", - "Müller", - "##isms", - "robin", - "##tial", - "Laos", - "Stanton", - "nationalism", - "##clave", - "##ND", - "##17", - "##zz", - "staging", - "Busch", - "Cindy", - "relieve", - "##spective", - "packs", - "neglected", - "CBE", - "alpine", - "Evolution", - "uneasy", - "coastline", - "Destiny", - "Barber", - "Julio", - "##tted", - "informs", - "unprecedented", - "Pavilion", - "##bei", - "##ference", - "betrayal", - "awaiting", - "leaked", - "V8", - "puppet", - "adverse", - "Bourne", - "Sunset", - "collectors", - "##glass", - "##sque", - "copied", - "Demon", - "conceded", - "resembled", - "Rafe", - "Levy", - "prosecutor", - "##ject", - "flora", - "manned", - "deaf", - "Mosque", - "reminds", - "Lizzie", - "Products", - "Funny", - "cassette", - "congress", - "##rong", - "Rover", - "tossing", - "prompting", - "chooses", - "Satellite", - "cautiously", - "Reese", - "##UT", - "Huang", - "Gloucestershire", - "giggled", - "Kitty", - "##å", - "Pleasant", - "Aye", - "##ond", - "judging", - "1860s", - "intentionally", - "Hurling", - "aggression", - "##xy", - "transfers", - "employing", - "##fies", - "##oda", - "Archibald", - "Blessed", - "Ski", - "flavor", - "Rosie", - "##burgh", - "sunset", - "Scholarship", - "WC", - "surround", - "ranged", - "##jay", - "Degree", - "Houses", - "squeezing", - "limb", - "premium", - "Leningrad", - "steals", - "##inated", - "##ssie", - "madness", - "vacancy", - "hydraulic", - "Northampton", - "##prise", - "Marks", - "Boxing", - "##fying", - "academics", - "##lich", - "##TY", - "CDs", - "##lma", - "hardcore", - "monitors", - "paperback", - "cables", - "Dimitri", - "upside", - "advent", - "Ra", - "##clusive", - "Aug", - "Christchurch", - "objected", - "stalked", - "Simple", - "colonists", - "##laid", - "CT", - "discusses", - "fellowship", - "Carnival", - "cares", - "Miracle", - "pastoral", - "rooted", - "shortage", - "borne", - "Quentin", - "meditation", - "tapping", - "Novel", - "##ades", - "Alicia", - "Burn", - "famed", - "residency", - "Fernández", - "Johannesburg", - "Zhu", - "offended", - "Mao", - "outward", - "##inas", - "XV", - "denial", - "noticing", - "##ís", - "quarry", - "##hound", - "##amo", - "Bernie", - "Bentley", - "Joanna", - "mortgage", - "##rdi", - "##sumption", - "lenses", - "extracted", - "depiction", - "##RE", - "Networks", - "Broad", - "Revenue", - "flickered", - "virgin", - "flanked", - "##о", - "Enterprises", - "probable", - "Liberals", - "Falcons", - "drowning", - "phrases", - "loads", - "assumes", - "inhaled", - "awe", - "logs", - "slightest", - "spiders", - "waterfall", - "##pate", - "rocking", - "shrub", - "##uil", - "roofs", - "##gard", - "prehistoric", - "wary", - "##rak", - "TO", - "clips", - "sustain", - "treason", - "microphone", - "voter", - "Lamb", - "psychologist", - "wrinkled", - "##ères", - "mating", - "Carrier", - "340", - "##lbert", - "sensing", - "##rino", - "destiny", - "distract", - "weaker", - "UC", - "Nearly", - "neurons", - "spends", - "Apache", - "##rem", - "genuinely", - "wells", - "##lanted", - "stereo", - "##girl", - "Lois", - "Leaving", - "consul", - "fungi", - "Pier", - "Cyril", - "80s", - "Jungle", - "##tani", - "illustration", - "Split", - "##hana", - "Abigail", - "##patrick", - "1787", - "diminished", - "Selected", - "packaging", - "##EG", - "Martínez", - "communal", - "Manufacturing", - "sentiment", - "143", - "unwilling", - "praising", - "Citation", - "pills", - "##iti", - "##rax", - "muffled", - "neatly", - "workforce", - "Yep", - "leisure", - "Tu", - "##nding", - "Wakefield", - "ancestral", - "##uki", - "destructive", - "seas", - "Passion", - "showcase", - "##ceptive", - "heroic", - "142", - "exhaustion", - "Customs", - "##aker", - "Scholar", - "sliced", - "##inian", - "Direction", - "##OW", - "Swansea", - "aluminium", - "##eep", - "ceramic", - "McCoy", - "Career", - "Sector", - "chartered", - "Damascus", - "pictured", - "Interest", - "stiffened", - "Plateau", - "obsolete", - "##tant", - "irritated", - "inappropriate", - "overs", - "##nko", - "bail", - "Talent", - "Sur", - "ours", - "##nah", - "barred", - "legged", - "sociology", - "Bud", - "dictionary", - "##luk", - "Cover", - "obey", - "##oring", - "annoying", - "##dong", - "apprentice", - "Cyrus", - "Role", - "##GP", - "##uns", - "##bag", - "Greenland", - "Porsche", - "Rocket", - "##32", - "organism", - "##ntary", - "reliability", - "##vocation", - "##й", - "Found", - "##hine", - "motors", - "promoter", - "unfair", - "##oms", - "##note", - "distribute", - "eminent", - "rails", - "appealing", - "chiefly", - "meaningful", - "Stephan", - "##rehension", - "Consumer", - "psychiatric", - "bowler", - "saints", - "##iful", - "##н", - "1777", - "Pol", - "Dorian", - "Townsend", - "hastily", - "##jima", - "Quincy", - "Sol", - "fascinated", - "Scarlet", - "alto", - "Avon", - "certainty", - "##eding", - "Keys", - "##chu", - "Chu", - "##VE", - "ions", - "tributaries", - "Thanksgiving", - "##fusion", - "astronomer", - "oxide", - "pavilion", - "Supply", - "Casa", - "Bollywood", - "sadly", - "mutations", - "Keller", - "##wave", - "nationals", - "##rgo", - "##ym", - "predict", - "Catholicism", - "Vega", - "##eration", - "##ums", - "Mali", - "tuned", - "Lankan", - "Plans", - "radial", - "Bosnian", - "Lexi", - "##14", - "##ü", - "sacks", - "unpleasant", - "Empty", - "handles", - "##taking", - "Bon", - "switches", - "intently", - "tuition", - "antique", - "##jk", - "fraternity", - "notebook", - "Desmond", - "##sei", - "prostitution", - "##how", - "deed", - "##OP", - "501", - "Somewhere", - "Rocks", - "##mons", - "campaigned", - "frigate", - "gases", - "suppress", - "##hang", - "Merlin", - "Northumberland", - "dominate", - "expeditions", - "thunder", - "##ups", - "##rical", - "Cap", - "thorough", - "Ariel", - "##kind", - "renewable", - "constructing", - "pacing", - "terrorists", - "Bowen", - "documentaries", - "westward", - "##lass", - "##nage", - "Merchant", - "##ued", - "Beaumont", - "Din", - "##hian", - "Danube", - "peasant", - "Garrison", - "encourages", - "gratitude", - "reminding", - "stormed", - "##ouse", - "pronunciation", - "##ailed", - "Weekend", - "suggestions", - "##ffing", - "##DI", - "Active", - "Colombo", - "##logists", - "Merrill", - "##cens", - "Archaeological", - "Medina", - "captained", - "##yk", - "duel", - "cracking", - "Wilkinson", - "Guam", - "pickup", - "renovations", - "##ël", - "##izer", - "delighted", - "##iri", - "Weaver", - "##ctional", - "tens", - "##hab", - "Clint", - "##usion", - "##each", - "petals", - "Farrell", - "##sable", - "caste", - "##will", - "Ezra", - "##qi", - "##standing", - "thrilled", - "ambush", - "exhaled", - "##SU", - "Resource", - "blur", - "forearm", - "specifications", - "contingent", - "cafe", - "##iology", - "Antony", - "fundraising", - "grape", - "##rgy", - "turnout", - "##udi", - "Clifton", - "laboratories", - "Irvine", - "##opus", - "##lid", - "Monthly", - "Bihar", - "statutory", - "Roses", - "Emil", - "##rig", - "lumber", - "optimal", - "##DR", - "pumps", - "plaster", - "Mozambique", - "##aco", - "nightclub", - "propelled", - "##hun", - "ked", - "surplus", - "wax", - "##urai", - "pioneered", - "Sunny", - "imprint", - "Forget", - "Eliot", - "approximate", - "patronage", - "##bek", - "##ely", - "##mbe", - "Partnership", - "curl", - "snapping", - "29th", - "Patriarch", - "##jord", - "seldom", - "##ature", - "astronomy", - "Bremen", - "XIV", - "airborne", - "205", - "1778", - "recognizing", - "stranded", - "arrogant", - "bombardment", - "destined", - "ensured", - "146", - "robust", - "Davenport", - "Interactive", - "Offensive", - "Fi", - "prevents", - "probe", - "propeller", - "sorrow", - "Blade", - "mounting", - "automotive", - "##dged", - "wallet", - "201", - "lashes", - "Forrest", - "##ift", - "Cell", - "Younger", - "shouts", - "##cki", - "folds", - "##chet", - "Epic", - "yields", - "homosexual", - "tunes", - "##minate", - "##text", - "Manny", - "chemist", - "hindwings", - "##urn", - "pilgrimage", - "##sfield", - "##riff", - "MLS", - "##rive", - "Huntington", - "translates", - "Path", - "slim", - "##ndra", - "##oz", - "climax", - "commuter", - "desperation", - "##reet", - "denying", - "##rious", - "daring", - "seminary", - "polo", - "##clamation", - "Teatro", - "Torah", - "Cats", - "identities", - "Poles", - "photographed", - "fiery", - "popularly", - "##cross", - "winters", - "Hesse", - "##vio", - "Nurse", - "Senegal", - "Salon", - "prescribed", - "justify", - "##gues", - "##и", - "##orted", - "HQ", - "##hiro", - "evaluated", - "momentarily", - "##unts", - "Debbie", - "##licity", - "##TP", - "Mighty", - "Rabbit", - "##chal", - "Events", - "Savoy", - "##ht", - "Brandenburg", - "Bordeaux", - "##laus", - "Release", - "##IE", - "##kowski", - "1900s", - "SK", - "Strauss", - "##aly", - "Sonia", - "Updated", - "synagogue", - "McKay", - "flattened", - "370", - "clutch", - "contests", - "toast", - "evaluate", - "pope", - "heirs", - "jam", - "tutor", - "reverted", - "##ading", - "nonsense", - "hesitate", - "Lars", - "Ceylon", - "Laurie", - "##guchi", - "accordingly", - "customary", - "148", - "Ethics", - "Multiple", - "instincts", - "IGN", - "##ä", - "bullshit", - "##hit", - "##par", - "desirable", - "##ducing", - "##yam", - "alias", - "ashore", - "licenses", - "##lification", - "misery", - "147", - "Cola", - "assassinated", - "fiercely", - "##aft", - "las", - "goat", - "substrate", - "lords", - "Cass", - "Bridges", - "ICC", - "lasts", - "sights", - "reproductive", - "##asi", - "Ivory", - "Clean", - "fixing", - "##lace", - "seeming", - "aide", - "1850s", - "harassment", - "##FF", - "##LE", - "reasonably", - "##coat", - "##cano", - "NYC", - "1784", - "Fifty", - "immunity", - "Canadians", - "Cheng", - "comforting", - "meanwhile", - "##tera", - "##blin", - "breeds", - "glowed", - "##vour", - "Aden", - "##verted", - "##aded", - "##oral", - "neat", - "enforced", - "poisoning", - "##ews", - "##hone", - "enforce", - "predecessors", - "survivor", - "Month", - "unfamiliar", - "pierced", - "waived", - "dump", - "responds", - "Mai", - "Declan", - "angular", - "Doesn", - "interpretations", - "##yar", - "invest", - "Dhaka", - "policeman", - "Congregation", - "Eighth", - "painfully", - "##este", - "##vior", - "Württemberg", - "##cles", - "blockade", - "encouragement", - "##fie", - "Caucasus", - "Malone", - "Universidad", - "utilize", - "Nissan", - "inherent", - "151", - "agreeing", - "syllable", - "determines", - "Protocol", - "conclude", - "##gara", - "40th", - "Xu", - "Taiwanese", - "##ather", - "boiler", - "printer", - "Lacey", - "titular", - "Klaus", - "Fallon", - "Wembley", - "fox", - "Chandra", - "Governorate", - "obsessed", - "##Ps", - "micro", - "##25", - "Cooke", - "gymnasium", - "weaving", - "Shall", - "Hussein", - "glaring", - "softball", - "Reader", - "Dominion", - "Trouble", - "varsity", - "Cooperation", - "Chaos", - "Kang", - "Kramer", - "Eisenhower", - "proves", - "Connie", - "consortium", - "governors", - "Bethany", - "opener", - "Normally", - "Willy", - "linebacker", - "Regent", - "Used", - "AllMusic", - "Twilight", - "##shaw", - "Companion", - "Tribunal", - "simpler", - "##gam", - "Experimental", - "Slovenian", - "cellar", - "deadline", - "trout", - "Hubbard", - "ads", - "idol", - "##hetto", - "Granada", - "clues", - "salmon", - "1700", - "Omega", - "Caldwell", - "softened", - "Bills", - "Honolulu", - "##gn", - "Terrace", - "suitcase", - "##IL", - "frantic", - "##oons", - "Abbot", - "Sitting", - "Fortress", - "Riders", - "sickness", - "enzymes", - "trustee", - "Bern", - "forged", - "##13", - "##ruff", - "##rl", - "##versity", - "inspector", - "champagne", - "##held", - "##FI", - "hereditary", - "Taliban", - "handball", - "##wine", - "Sioux", - "##dicated", - "honoured", - "139", - "##tude", - "Skye", - "meanings", - "##rkin", - "cardiac", - "analyzed", - "vegetable", - "##FS", - "Royals", - "dial", - "freelance", - "##fest", - "partisan", - "petroleum", - "ridden", - "Lincolnshire", - "panting", - "##comb", - "presidents", - "Haley", - "##chs", - "contributes", - "Jew", - "discoveries", - "panicked", - "Woody", - "eyelids", - "Fate", - "Tulsa", - "mg", - "whiskey", - "zombies", - "Wii", - "##udge", - "investigators", - "##bull", - "centred", - "##screen", - "Bone", - "Lana", - "##oise", - "forts", - "##ske", - "Conan", - "Lyons", - "##writing", - "SH", - "##ride", - "rhythmic", - "154", - "##llah", - "pioneers", - "##bright", - "captivity", - "Sanchez", - "Oman", - "##mith", - "Flint", - "Platform", - "##ioned", - "emission", - "packet", - "Persia", - "##formed", - "takeover", - "tempted", - "Vance", - "Few", - "Toni", - "receptions", - "##ن", - "exchanges", - "Camille", - "whale", - "Chronicles", - "##rent", - "##ushing", - "##rift", - "Alto", - "Genus", - "##asing", - "onward", - "foremost", - "longing", - "Rockefeller", - "containers", - "##cribe", - "intercepted", - "##olt", - "pleading", - "Bye", - "bee", - "##umbling", - "153", - "undertake", - "Izzy", - "cheaper", - "Ultra", - "validity", - "##pse", - "Sa", - "hovering", - "##pert", - "vintage", - "engraved", - "##rise", - "farmland", - "##ever", - "##ifier", - "Atlantis", - "propose", - "Catalonia", - "plunged", - "##edly", - "demonstrates", - "gig", - "##cover", - "156", - "Osborne", - "cowboy", - "herd", - "investigator", - "loops", - "Burning", - "rests", - "Instrumental", - "embarrassing", - "focal", - "install", - "readings", - "swirling", - "Chatham", - "parameter", - "##zin", - "##holders", - "Mandarin", - "Moody", - "converting", - "Escape", - "warnings", - "##chester", - "incarnation", - "##ophone", - "adopting", - "##lins", - "Cromwell", - "##laws", - "Axis", - "Verde", - "Kappa", - "Schwartz", - "Serbs", - "caliber", - "Wanna", - "Chung", - "##ality", - "nursery", - "principally", - "Bulletin", - "likelihood", - "logging", - "##erty", - "Boyle", - "supportive", - "twitched", - "##usive", - "builds", - "Marseille", - "omitted", - "motif", - "Lands", - "##lusion", - "##ssed", - "Barrow", - "Airfield", - "Harmony", - "WWF", - "endured", - "merging", - "convey", - "branding", - "examinations", - "167", - "Italians", - "##dh", - "dude", - "1781", - "##teau", - "crawling", - "thoughtful", - "clasped", - "concluding", - "brewery", - "Moldova", - "Wan", - "Towers", - "Heidelberg", - "202", - "##ict", - "Lagos", - "imposing", - "##eval", - "##serve", - "Bacon", - "frowning", - "thirteenth", - "conception", - "calculations", - "##ович", - "##mile", - "##ivated", - "mutation", - "strap", - "##lund", - "demographic", - "nude", - "perfection", - "stocks", - "##renched", - "##dit", - "Alejandro", - "bites", - "fragment", - "##hack", - "##rchy", - "GB", - "Surgery", - "Berger", - "punish", - "boiling", - "consume", - "Elle", - "Sid", - "Dome", - "relies", - "Crescent", - "treasurer", - "Bloody", - "1758", - "upheld", - "Guess", - "Restaurant", - "signatures", - "font", - "millennium", - "mural", - "stakes", - "Abel", - "hailed", - "insists", - "Alumni", - "Breton", - "##jun", - "digits", - "##FM", - "##thal", - "Talking", - "motive", - "reigning", - "babe", - "masks", - "##ø", - "Shaun", - "potato", - "sour", - "whitish", - "Somali", - "##derman", - "##rab", - "##wy", - "chancel", - "telecommunications", - "Noise", - "messenger", - "tidal", - "grinding", - "##ogenic", - "Rebel", - "constituent", - "peripheral", - "recruitment", - "##ograph", - "##tler", - "pumped", - "Ravi", - "poked", - "##gley", - "Olive", - "diabetes", - "discs", - "liking", - "sting", - "fits", - "stir", - "Mari", - "Sega", - "creativity", - "weights", - "Macau", - "mandated", - "Bohemia", - "disastrous", - "Katrina", - "Baku", - "Rajasthan", - "waiter", - "##psis", - "Siberia", - "verbs", - "##truction", - "patented", - "1782", - "##ndon", - "Relegated", - "Hunters", - "Greenwood", - "Shock", - "accusing", - "skipped", - "Sessions", - "markers", - "subset", - "monumental", - "Viola", - "comparative", - "Alright", - "Barbados", - "setup", - "Session", - "standardized", - "##ík", - "##sket", - "appoint", - "AFB", - "Nationalist", - "##WS", - "Troop", - "leaped", - "Treasure", - "goodness", - "weary", - "originates", - "100th", - "compassion", - "expresses", - "recommend", - "168", - "composing", - "seventeenth", - "Tex", - "Atlético", - "bald", - "Finding", - "Presidency", - "Sharks", - "favoured", - "inactive", - "##lter", - "suffix", - "princes", - "brighter", - "##ctus", - "classics", - "defendants", - "culminated", - "terribly", - "Strategy", - "evenings", - "##ção", - "##iver", - "##urance", - "absorb", - "##rner", - "Territories", - "RBI", - "soothing", - "Martín", - "concurrently", - "##tr", - "Nicholson", - "fibers", - "swam", - "##oney", - "Allie", - "Algerian", - "Dartmouth", - "Mafia", - "##bos", - "##tts", - "Councillor", - "vocabulary", - "##bla", - "##lé", - "intending", - "##dler", - "Guerrero", - "sunshine", - "pedal", - "##TO", - "administrators", - "periodic", - "scholarships", - "Loop", - "Madeline", - "exaggerated", - "##ressed", - "Regan", - "##cellular", - "Explorer", - "##oids", - "Alexandre", - "vows", - "Reporter", - "Unable", - "Average", - "absorption", - "##bedience", - "Fortunately", - "Auxiliary", - "Grandpa", - "##HP", - "##ovo", - "potent", - "temporal", - "adrenaline", - "##udo", - "confusing", - "guiding", - "Dry", - "qualifications", - "joking", - "wherein", - "heavyweight", - "##ices", - "nightmares", - "pharmaceutical", - "Commanding", - "##aled", - "##ove", - "Gregor", - "##UP", - "censorship", - "degradation", - "glorious", - "Austro", - "##rench", - "380", - "Miriam", - "sped", - "##orous", - "offset", - "##KA", - "fined", - "specialists", - "Pune", - "João", - "##dina", - "propped", - "fungus", - "##ς", - "frantically", - "Gabrielle", - "Hare", - "committing", - "##plied", - "Ask", - "Wilmington", - "stunt", - "numb", - "warmer", - "preacher", - "earnings", - "##lating", - "integer", - "##ija", - "federation", - "homosexuality", - "##cademia", - "epidemic", - "grumbled", - "shoving", - "Milk", - "Satan", - "Tobias", - "innovations", - "##dington", - "geology", - "memoirs", - "##IR", - "spared", - "culminating", - "Daphne", - "Focus", - "severed", - "stricken", - "Paige", - "Mans", - "flats", - "Russo", - "communes", - "litigation", - "strengthening", - "##powered", - "Staffordshire", - "Wiltshire", - "Painting", - "Watkins", - "##د", - "specializes", - "Select", - "##rane", - "##aver", - "Fulton", - "playable", - "##VN", - "openings", - "sampling", - "##coon", - "##21", - "Allah", - "travelers", - "allocation", - "##arily", - "Loch", - "##hm", - "commentators", - "fulfilled", - "##troke", - "Emeritus", - "Vanderbilt", - "Vijay", - "pledged", - "##tative", - "diagram", - "drilling", - "##MD", - "##plain", - "Edison", - "productivity", - "31st", - "##rying", - "##ption", - "##gano", - "##oration", - "##bara", - "posture", - "bothering", - "platoon", - "politely", - "##inating", - "redevelopment", - "Job", - "##vale", - "stark", - "incorrect", - "Mansion", - "renewal", - "threatens", - "Bahamas", - "fridge", - "##tata", - "Uzbekistan", - "##edia", - "Sainte", - "##mio", - "gaps", - "neural", - "##storm", - "overturned", - "Preservation", - "shields", - "##ngo", - "##physics", - "ah", - "gradual", - "killings", - "##anza", - "consultation", - "premiership", - "Felipe", - "coincidence", - "##ène", - "##any", - "Handbook", - "##loaded", - "Edit", - "Guns", - "arguably", - "##ş", - "compressed", - "depict", - "seller", - "##qui", - "Kilkenny", - "##kling", - "Olympia", - "librarian", - "##acles", - "dramas", - "JP", - "Kit", - "Maj", - "##lists", - "proprietary", - "##nged", - "##ettes", - "##tok", - "exceeding", - "Lock", - "induction", - "numerical", - "##vist", - "Straight", - "foyer", - "imaginary", - "##pop", - "violinist", - "Carla", - "bouncing", - "##ashi", - "abolition", - "##uction", - "restoring", - "scenic", - "##č", - "Doom", - "overthrow", - "para", - "##vid", - "##ughty", - "Concord", - "HC", - "cocaine", - "deputies", - "##aul", - "visibility", - "##wart", - "Kapoor", - "Hutchinson", - "##agan", - "flashes", - "kn", - "decreasing", - "##ronology", - "quotes", - "vain", - "satisfying", - "##iam", - "##linger", - "310", - "Hanson", - "fauna", - "##zawa", - "##rrel", - "Trenton", - "##VB", - "Employment", - "vocational", - "Exactly", - "bartender", - "butterflies", - "tow", - "##chers", - "##ocks", - "pigs", - "merchandise", - "##game", - "##pine", - "Shea", - "##gration", - "Connell", - "Josephine", - "monopoly", - "##dled", - "Cobb", - "warships", - "cancellation", - "someday", - "stove", - "##Cs", - "candidacy", - "superhero", - "unrest", - "Toulouse", - "admiration", - "undergone", - "whirled", - "Reconnaissance", - "costly", - "##ships", - "290", - "Cafe", - "amber", - "Tory", - "##mpt", - "definitive", - "##dress", - "proposes", - "redesigned", - "acceleration", - "##asa", - "##raphy", - "Presley", - "exits", - "Languages", - "##cel", - "Mode", - "spokesperson", - "##tius", - "Ban", - "forthcoming", - "grounded", - "ACC", - "compelling", - "logistics", - "retailers", - "abused", - "##gating", - "soda", - "##yland", - "##lution", - "Landmark", - "XVI", - "blush", - "##tem", - "hurling", - "dread", - "Tobago", - "Foley", - "##uad", - "scenarios", - "##mentation", - "##rks", - "Score", - "fatigue", - "hairy", - "correspond", - "##iard", - "defences", - "confiscated", - "##rudence", - "1785", - "Formerly", - "Shot", - "advertised", - "460", - "Text", - "ridges", - "Promise", - "Dev", - "exclusion", - "NHS", - "tuberculosis", - "rockets", - "##offs", - "sparkling", - "256", - "disappears", - "mankind", - "##hore", - "HP", - "##omo", - "taxation", - "Multi", - "DS", - "Virgil", - "##ams", - "Dell", - "stacked", - "guessing", - "Jump", - "Nope", - "cheer", - "hates", - "ballots", - "overlooked", - "analyses", - "Prevention", - "maturity", - "dos", - "##cards", - "##lect", - "Mare", - "##yssa", - "Petty", - "##wning", - "differing", - "iOS", - "##ior", - "Joachim", - "Sentinel", - "##nstein", - "90s", - "Pamela", - "480", - "Asher", - "##lary", - "Vicente", - "landings", - "portray", - "##rda", - "##xley", - "Virtual", - "##uary", - "finances", - "Jain", - "Somebody", - "Tri", - "behave", - "Michele", - "##ider", - "dwellings", - "FAA", - "Gallagher", - "##lide", - "Monkey", - "195", - "aforementioned", - "##rism", - "##bey", - "##kim", - "##puted", - "Mesa", - "hopped", - "unopposed", - "recipients", - "Reality", - "Been", - "gritted", - "149", - "playground", - "pillar", - "##rone", - "Guinness", - "##tad", - "Théâtre", - "depended", - "Tipperary", - "Reuben", - "frightening", - "wooded", - "Target", - "globally", - "##uted", - "Morales", - "Baptiste", - "drunken", - "Institut", - "characterised", - "##chemistry", - "Strip", - "discrete", - "Premiership", - "##zzling", - "gazing", - "Outer", - "##quisition", - "Sikh", - "Booker", - "##yal", - "contemporaries", - "Jericho", - "##chan", - "##physical", - "##witch", - "Militia", - "##rez", - "##zard", - "dangers", - "##utter", - "##₀", - "Programs", - "darling", - "participates", - "railroads", - "##ienne", - "behavioral", - "bureau", - "##rook", - "161", - "Hicks", - "##rises", - "Comes", - "inflicted", - "bees", - "kindness", - "norm", - "##ković", - "generators", - "##pard", - "##omy", - "##ili", - "methodology", - "Alvin", - "façade", - "latitude", - "##plified", - "DE", - "Morse", - "##mered", - "educate", - "intersects", - "##MF", - "##cz", - "##vated", - "AL", - "##graded", - "##fill", - "constitutes", - "artery", - "feudal", - "avant", - "cautious", - "##ogue", - "immigrated", - "##chenko", - "Saul", - "Clinic", - "Fang", - "choke", - "Cornelius", - "flexibility", - "temperate", - "pins", - "##erson", - "oddly", - "inequality", - "157", - "Natasha", - "Sal", - "##uter", - "215", - "aft", - "blinking", - "##ntino", - "northward", - "Exposition", - "cookies", - "Wedding", - "impulse", - "Overseas", - "terrifying", - "##ough", - "Mortimer", - "##see", - "440", - "https", - "og", - "imagining", - "##cars", - "Nicola", - "exceptionally", - "threads", - "##cup", - "Oswald", - "Provisional", - "dismantled", - "deserves", - "1786", - "Fairy", - "discourse", - "Counsel", - "departing", - "Arc", - "guarding", - "##orse", - "420", - "alterations", - "vibrant", - "Em", - "squinted", - "terrace", - "rowing", - "Led", - "accessories", - "SF", - "Sgt", - "cheating", - "Atomic", - "##raj", - "Blackpool", - "##iary", - "boarded", - "substituted", - "bestowed", - "lime", - "kernel", - "##jah", - "Belmont", - "shaken", - "sticky", - "retrospective", - "Louie", - "migrants", - "weigh", - "sunglasses", - "thumbs", - "##hoff", - "excavation", - "##nks", - "Extra", - "Polo", - "motives", - "Drum", - "infrared", - "tastes", - "berth", - "verge", - "##stand", - "programmed", - "warmed", - "Shankar", - "Titan", - "chromosome", - "cafeteria", - "dividing", - "pepper", - "CPU", - "Stevie", - "satirical", - "Nagar", - "scowled", - "Died", - "backyard", - "##gata", - "##reath", - "##bir", - "Governors", - "portraying", - "##yah", - "Revenge", - "##acing", - "1772", - "margins", - "Bahn", - "OH", - "lowland", - "##razed", - "catcher", - "replay", - "##yoshi", - "Seriously", - "##licit", - "Aristotle", - "##ald", - "Habsburg", - "weekday", - "Secretariat", - "CO", - "##dly", - "##joy", - "##stad", - "litre", - "ultra", - "##cke", - "Mongol", - "Tucson", - "correlation", - "compose", - "traps", - "Groups", - "Hai", - "Salvatore", - "##dea", - "cents", - "##eese", - "concession", - "clash", - "Trip", - "Panzer", - "Moroccan", - "cruisers", - "torque", - "Ba", - "grossed", - "##arate", - "restriction", - "concentrating", - "FDA", - "##Leod", - "##ones", - "Scholars", - "##esi", - "throbbing", - "specialised", - "##heses", - "Chicken", - "##fia", - "##ificant", - "Erich", - "Residence", - "##trate", - "manipulation", - "namesake", - "##tom", - "Hoover", - "cue", - "Lindsey", - "Lonely", - "275", - "##HT", - "combustion", - "subscribers", - "Punjabi", - "respects", - "Jeremiah", - "penned", - "##gor", - "##rilla", - "suppression", - "##tration", - "Crimson", - "piston", - "Derry", - "crimson", - "lyrical", - "oversee", - "portrays", - "CF", - "Districts", - "Lenin", - "Cora", - "searches", - "clans", - "VHS", - "##hel", - "Jacqueline", - "Redskins", - "Clubs", - "desktop", - "indirectly", - "alternatives", - "marijuana", - "suffrage", - "##smos", - "Irwin", - "##liff", - "Process", - "##hawks", - "Sloane", - "##bson", - "Sonata", - "yielded", - "Flores", - "##ares", - "armament", - "adaptations", - "integrate", - "neighbours", - "shelters", - "##tour", - "Skinner", - "##jet", - "##tations", - "1774", - "Peterborough", - "##elles", - "ripping", - "Liang", - "Dickinson", - "charities", - "Rwanda", - "monasteries", - "crossover", - "racist", - "barked", - "guerrilla", - "##ivate", - "Grayson", - "##iques", - "##vious", - "##got", - "Rolls", - "denominations", - "atom", - "affinity", - "##delity", - "Wish", - "##inted", - "##inae", - "interrogation", - "##cey", - "##erina", - "##lifting", - "192", - "Sands", - "1779", - "mast", - "Likewise", - "##hyl", - "##oft", - "contempt", - "##por", - "assaulted", - "fills", - "establishments", - "Mal", - "consulted", - "##omi", - "##sight", - "greet", - "##roma", - "##egan", - "Pulitzer", - "##rried", - "##dius", - "##ractical", - "##voked", - "Hasan", - "CB", - "##zzy", - "Romanesque", - "Panic", - "wheeled", - "recorder", - "##tters", - "##warm", - "##gly", - "botanist", - "Balkan", - "Lockheed", - "Polly", - "farewell", - "suffers", - "purchases", - "Eaton", - "##80", - "Quick", - "commenting", - "Saga", - "beasts", - "hides", - "motifs", - "##icks", - "Alonso", - "Springer", - "Wikipedia", - "circulated", - "encoding", - "jurisdictions", - "snout", - "UAE", - "Integrated", - "unmarried", - "Heinz", - "##lein", - "##figured", - "deleted", - "##tley", - "Zen", - "Cycling", - "Fuel", - "Scandinavian", - "##rants", - "Conner", - "reef", - "Marino", - "curiously", - "lingered", - "Gina", - "manners", - "activism", - "Mines", - "Expo", - "Micah", - "promotions", - "Server", - "booked", - "derivatives", - "eastward", - "detailing", - "reelection", - "##chase", - "182", - "Campeonato", - "Po", - "158", - "Peel", - "winger", - "##itch", - "canyon", - "##pit", - "LDS", - "A1", - "##shin", - "Giorgio", - "pathetic", - "##rga", - "##mist", - "Aren", - "##lag", - "confronts", - "motel", - "textbook", - "shine", - "turbines", - "1770", - "Darcy", - "##cot", - "Southeastern", - "##lessness", - "Banner", - "recognise", - "stray", - "Kitchen", - "paperwork", - "realism", - "Chrysler", - "filmmakers", - "fishermen", - "##hetic", - "variously", - "Vishnu", - "fiddle", - "Eddy", - "Origin", - "##tec", - "##ulin", - "Flames", - "Rs", - "bankrupt", - "Extreme", - "Pomeranian", - "##emption", - "ratified", - "##iu", - "jockey", - "Stratford", - "##ivating", - "##oire", - "Babylon", - "pardon", - "AI", - "affordable", - "deities", - "disturbance", - "Trying", - "##sai", - "Ida", - "Papers", - "advancement", - "70s", - "archbishop", - "Luftwaffe", - "announces", - "tugging", - "##lphin", - "##sistence", - "##eel", - "##ishes", - "ambition", - "aura", - "##fled", - "##lected", - "##vue", - "Prasad", - "boiled", - "clarity", - "Violin", - "investigative", - "routing", - "Yankee", - "##uckle", - "McMahon", - "bugs", - "eruption", - "##rooms", - "Minutes", - "relics", - "##ckle", - "##nse", - "sipped", - "valves", - "weakly", - "##ital", - "Middleton", - "collided", - "##quer", - "bamboo", - "insignia", - "Tyne", - "exercised", - "Ninth", - "echoing", - "polynomial", - "considerations", - "lunged", - "##bius", - "objections", - "complain", - "disguised", - "plaza", - "##VC", - "institutes", - "Judicial", - "ascent", - "imminent", - "Waterford", - "hello", - "Lumpur", - "Niger", - "Goldman", - "vendors", - "Kensington", - "Wren", - "browser", - "##bner", - "##tri", - "##mize", - "##pis", - "##lea", - "Cheyenne", - "Bold", - "Settlement", - "Hollow", - "Paralympic", - "axle", - "##toire", - "##actic", - "impose", - "perched", - "utilizing", - "slips", - "Benz", - "Michaels", - "manipulate", - "Chiang", - "##mian", - "Dolphins", - "prohibition", - "attacker", - "ecology", - "Estadio", - "##SB", - "##uild", - "attracts", - "recalls", - "glacier", - "lad", - "##rima", - "Barlow", - "kHz", - "melodic", - "##aby", - "##iracy", - "assumptions", - "Cornish", - "##aru", - "DOS", - "Maddie", - "##mers", - "lyric", - "Luton", - "nm", - "##tron", - "Reno", - "Fin", - "YOU", - "Broadcast", - "Finch", - "sensory", - "##bent", - "Jeep", - "##uman", - "additionally", - "Buildings", - "businessmen", - "treaties", - "235", - "Stranger", - "gateway", - "Charlton", - "accomplishments", - "Diary", - "apologized", - "zinc", - "histories", - "supplier", - "##tting", - "162", - "asphalt", - "Treatment", - "Abbas", - "##pating", - "##yres", - "Bloom", - "sedan", - "soloist", - "##cum", - "antagonist", - "denounced", - "Fairfax", - "##aving", - "##enko", - "noticeable", - "Budget", - "Buckingham", - "Snyder", - "retreating", - "Jai", - "spoon", - "invading", - "giggle", - "woven", - "gunfire", - "arrests", - "##vered", - "##come", - "respiratory", - "violet", - "##aws", - "Byrd", - "shocking", - "tenant", - "Jamaican", - "Ottomans", - "Seal", - "theirs", - "##isse", - "##48", - "cooperate", - "peering", - "##nius", - "163", - "Composer", - "organist", - "Mongolian", - "Bauer", - "Spy", - "collects", - "prophecy", - "congregations", - "##moor", - "Brick", - "calculation", - "fixtures", - "exempt", - "##dden", - "Ada", - "Thousand", - "##lue", - "tracing", - "##achi", - "bodyguard", - "vicar", - "supplying", - "Łódź", - "interception", - "monitored", - "##heart", - "Paso", - "overlap", - "annoyance", - "##dice", - "yellowish", - "stables", - "elders", - "illegally", - "honesty", - "##oar", - "skinny", - "spinal", - "##puram", - "Bourbon", - "##cor", - "flourished", - "Medium", - "##stics", - "##aba", - "Follow", - "##ckey", - "stationary", - "##scription", - "dresser", - "scrutiny", - "Buckley", - "Clearly", - "##SF", - "Lyrics", - "##heimer", - "drying", - "Oracle", - "internally", - "rains", - "##last", - "Enemy", - "##oes", - "McLean", - "Ole", - "phosphate", - "Rosario", - "Rifles", - "##mium", - "battered", - "Pepper", - "Presidents", - "conquer", - "Château", - "castles", - "##aldo", - "##ulf", - "Depending", - "Lesser", - "Boom", - "trades", - "Peyton", - "164", - "emphasize", - "accustomed", - "SM", - "Ai", - "Classification", - "##mins", - "##35", - "##rons", - "leak", - "piled", - "deeds", - "lush", - "##self", - "beginnings", - "breathless", - "1660", - "McGill", - "##ago", - "##chaft", - "##gies", - "humour", - "Bomb", - "securities", - "Might", - "##zone", - "##eves", - "Matthias", - "Movies", - "Levine", - "vengeance", - "##ads", - "Challenger", - "Misty", - "Traditionally", - "constellation", - "##rass", - "deepest", - "workplace", - "##oof", - "##vina", - "impatient", - "##ML", - "Mughal", - "Alessandro", - "scenery", - "Slater", - "postseason", - "troupe", - "##ń", - "Volunteers", - "Facility", - "militants", - "Reggie", - "sanctions", - "Expeditionary", - "Nam", - "countered", - "interpret", - "Basilica", - "coding", - "expectation", - "Duffy", - "def", - "Tong", - "wakes", - "Bowling", - "Vehicle", - "Adler", - "salad", - "intricate", - "stronghold", - "medley", - "##uries", - "##bur", - "joints", - "##rac", - "##yx", - "##IO", - "Ordnance", - "Welch", - "distributor", - "Ark", - "cavern", - "trench", - "Weiss", - "Mauritius", - "decreases", - "docks", - "eagerly", - "irritation", - "Matilda", - "biographer", - "Visiting", - "##marked", - "##iter", - "##ear", - "##gong", - "Moreno", - "attendant", - "Bury", - "instrumentation", - "theologian", - "clit", - "nuns", - "symphony", - "translate", - "375", - "loser", - "##user", - "##VR", - "##meter", - "##orious", - "harmful", - "##yuki", - "Commissioners", - "Mendoza", - "sniffed", - "Hulk", - "##dded", - "##ulator", - "##nz", - "Donnell", - "##eka", - "deported", - "Met", - "SD", - "Aerospace", - "##cultural", - "##odes", - "Fantastic", - "cavity", - "remark", - "emblem", - "fearing", - "##iance", - "ICAO", - "Liberia", - "stab", - "##yd", - "Pac", - "Gymnasium", - "IS", - "Everton", - "##vanna", - "mantle", - "##ief", - "Ramon", - "##genic", - "Shooting", - "Smoke", - "Random", - "Africans", - "MB", - "tavern", - "bargain", - "voluntarily", - "Ion", - "Peoples", - "Rusty", - "attackers", - "Patton", - "sins", - "##cake", - "Hat", - "moderately", - "##hala", - "##alia", - "requesting", - "mechanic", - "##eae", - "Seine", - "Robbins", - "##ulum", - "susceptible", - "Bravo", - "Slade", - "Strasbourg", - "rubble", - "entrusted", - "Creation", - "##amp", - "smoothed", - "##uintet", - "evenly", - "reviewers", - "skip", - "Sculpture", - "177", - "Rough", - "##rrie", - "Reeves", - "##cede", - "Administrator", - "garde", - "minus", - "carriages", - "grenade", - "Ninja", - "fuscous", - "##kley", - "Punk", - "contributors", - "Aragon", - "Tottenham", - "##cca", - "##sir", - "VA", - "laced", - "dealers", - "##sonic", - "crisp", - "harmonica", - "Artistic", - "Butch", - "Andes", - "Farmers", - "corridors", - "unseen", - "##tium", - "Countries", - "Lone", - "envisioned", - "Katy", - "##lang", - "##cc", - "Quarterly", - "##neck", - "consort", - "##aceae", - "bidding", - "Corey", - "concurrent", - "##acts", - "##gum", - "Highness", - "##lient", - "##rators", - "arising", - "##unta", - "pathways", - "49ers", - "bolted", - "complaining", - "ecosystem", - "libretto", - "Ser", - "narrated", - "212", - "Soft", - "influx", - "##dder", - "incorporation", - "plagued", - "tents", - "##ddled", - "1750", - "Risk", - "citation", - "Tomas", - "hostilities", - "seals", - "Bruins", - "Dominique", - "attic", - "competent", - "##UR", - "##cci", - "hugging", - "Breuning", - "bacterial", - "Shrewsbury", - "vowed", - "eh", - "elongated", - "hangs", - "render", - "centimeters", - "##ficient", - "Mu", - "turtle", - "besieged", - "##gaard", - "grapes", - "bravery", - "collaborations", - "deprived", - "##amine", - "##using", - "##gins", - "arid", - "##uve", - "coats", - "hanged", - "##sting", - "Pa", - "prefix", - "##ranged", - "Exit", - "Chain", - "Flood", - "Materials", - "suspicions", - "##ö", - "hovered", - "Hidden", - "##state", - "Malawi", - "##24", - "Mandy", - "norms", - "fascinating", - "airlines", - "delivers", - "##rust", - "Cretaceous", - "spanned", - "pillows", - "##onomy", - "jar", - "##kka", - "regent", - "fireworks", - "morality", - "discomfort", - "lure", - "uneven", - "##jack", - "Lucian", - "171", - "archaeology", - "##til", - "mornings", - "Billie", - "Marquess", - "impending", - "spilling", - "tombs", - "##volved", - "Celia", - "Coke", - "underside", - "##bation", - "Vaughn", - "Daytona", - "Godfrey", - "Pascal", - "Alien", - "##sign", - "172", - "##lage", - "iPhone", - "Gonna", - "genocide", - "##rber", - "oven", - "endure", - "dashed", - "simultaneous", - "##phism", - "Wally", - "##rō", - "ants", - "predator", - "reissue", - "##aper", - "Speech", - "funk", - "Rudy", - "claw", - "Hindus", - "Numbers", - "Bing", - "lantern", - "##aurus", - "scattering", - "poisoned", - "##active", - "Andrei", - "algebraic", - "baseman", - "##ritz", - "Gregg", - "##cola", - "selections", - "##putation", - "lick", - "Laguna", - "##IX", - "Sumatra", - "Warning", - "turf", - "buyers", - "Burgess", - "Oldham", - "exploit", - "worm", - "initiate", - "strapped", - "tuning", - "filters", - "haze", - "##е", - "##ledge", - "##ydro", - "##culture", - "amendments", - "Promotion", - "##union", - "Clair", - "##uria", - "petty", - "shutting", - "##eveloped", - "Phoebe", - "Zeke", - "conducts", - "grains", - "clashes", - "##latter", - "illegitimate", - "willingly", - "Deer", - "Lakers", - "Reference", - "chaplain", - "commitments", - "interrupt", - "salvation", - "Panther", - "Qualifying", - "Assessment", - "cancel", - "efficiently", - "attorneys", - "Dynamo", - "impress", - "accession", - "clinging", - "randomly", - "reviewing", - "Romero", - "Cathy", - "charting", - "clapped", - "rebranded", - "Azerbaijani", - "coma", - "indicator", - "punches", - "##tons", - "Sami", - "monastic", - "prospects", - "Pastor", - "##rville", - "electrified", - "##CI", - "##utical", - "tumbled", - "Chef", - "muzzle", - "selecting", - "UP", - "Wheel", - "protocols", - "##tat", - "Extended", - "beautifully", - "nests", - "##stal", - "Andersen", - "##anu", - "##³", - "##rini", - "kneeling", - "##reis", - "##xia", - "anatomy", - "dusty", - "Safe", - "turmoil", - "Bianca", - "##elo", - "analyze", - "##ر", - "##eran", - "podcast", - "Slovene", - "Locke", - "Rue", - "##retta", - "##uni", - "Person", - "Prophet", - "crooked", - "disagreed", - "Versailles", - "Sarajevo", - "Utrecht", - "##ogen", - "chewing", - "##ception", - "##iidae", - "Missile", - "attribute", - "majors", - "Arch", - "intellectuals", - "##andra", - "ideological", - "Cory", - "Salzburg", - "##fair", - "Lot", - "electromagnetic", - "Distribution", - "##oper", - "##pered", - "Russ", - "Terra", - "repeats", - "fluttered", - "Riga", - "##ific", - "##gt", - "cows", - "Hair", - "labelled", - "protects", - "Gale", - "Personnel", - "Düsseldorf", - "Moran", - "rematch", - "##OE", - "Slow", - "forgiveness", - "##ssi", - "proudly", - "Macmillan", - "insist", - "undoubtedly", - "Québec", - "Violence", - "##yuan", - "##aine", - "mourning", - "linen", - "accidental", - "##iol", - "##arium", - "grossing", - "lattice", - "maneuver", - "##marine", - "prestige", - "petrol", - "gradient", - "invasive", - "militant", - "Galerie", - "widening", - "##aman", - "##quist", - "disagreement", - "##ales", - "creepy", - "remembers", - "buzz", - "##erial", - "Exempt", - "Dirk", - "mon", - "Addison", - "##inen", - "deposed", - "##agon", - "fifteenth", - "Hang", - "ornate", - "slab", - "##lades", - "Fountain", - "contractors", - "das", - "Warwickshire", - "1763", - "##rc", - "Carly", - "Essays", - "Indy", - "Ligue", - "greenhouse", - "slit", - "##sea", - "chewed", - "wink", - "##azi", - "Playhouse", - "##kon", - "Gram", - "Ko", - "Samson", - "creators", - "revive", - "##rians", - "spawned", - "seminars", - "Craft", - "Tall", - "diverted", - "assistants", - "computational", - "enclosure", - "##acity", - "Coca", - "##eve", - "databases", - "Drop", - "##loading", - "##hage", - "Greco", - "Privy", - "entrances", - "pork", - "prospective", - "Memories", - "robes", - "##market", - "transporting", - "##lik", - "Rudolph", - "Horton", - "visually", - "##uay", - "##nja", - "Centro", - "Tor", - "Howell", - "##rsey", - "admitting", - "postgraduate", - "herbs", - "##att", - "Chin", - "Rutherford", - "##bot", - "##etta", - "Seasons", - "explanations", - "##bery", - "Friedman", - "heap", - "##ryl", - "##sberg", - "jaws", - "##agh", - "Choi", - "Killing", - "Fanny", - "##suming", - "##hawk", - "hopeful", - "##aid", - "Monty", - "gum", - "remarkably", - "Secrets", - "disco", - "harp", - "advise", - "##avia", - "Marathi", - "##cycle", - "Truck", - "abbot", - "sincere", - "urine", - "##mology", - "masked", - "bathing", - "##tun", - "Fellows", - "##TM", - "##gnetic", - "owl", - "##jon", - "hymn", - "##leton", - "208", - "hostility", - "##cée", - "baked", - "Bottom", - "##AB", - "shudder", - "##ater", - "##von", - "##hee", - "reorganization", - "Cycle", - "##phs", - "Lex", - "##style", - "##rms", - "Translation", - "##erick", - "##imeter", - "##ière", - "attested", - "Hillary", - "##DM", - "gal", - "wander", - "Salle", - "##laming", - "Perez", - "Pit", - "##LP", - "USAF", - "contexts", - "Disease", - "blazing", - "aroused", - "razor", - "walled", - "Danielle", - "Mont", - "Funk", - "royalty", - "thee", - "203", - "donors", - "##erton", - "famously", - "processors", - "reassigned", - "welcoming", - "Goldberg", - "##quities", - "undisclosed", - "Orient", - "Patty", - "vaccine", - "refrigerator", - "Cypriot", - "consonant", - "##waters", - "176", - "sober", - "##lement", - "Racecourse", - "##uate", - "Luckily", - "Selection", - "conceptual", - "vines", - "Breaking", - "wa", - "lions", - "oversight", - "sheltered", - "Dancer", - "ponds", - "borrow", - "##BB", - "##pulsion", - "Daly", - "##eek", - "fertility", - "spontaneous", - "Worldwide", - "gasping", - "##tino", - "169", - "ABS", - "Vickers", - "ambient", - "energetic", - "prisons", - "##eson", - "Stacy", - "##roach", - "GmbH", - "Afro", - "Marin", - "farmhouse", - "pinched", - "##cursion", - "##sp", - "Sabine", - "##pire", - "181", - "nak", - "swelling", - "humble", - "perfume", - "##balls", - "Rai", - "cannons", - "##taker", - "Married", - "Maltese", - "canals", - "interceptions", - "hats", - "lever", - "slowing", - "##ppy", - "Nike", - "Silas", - "Scarborough", - "skirts", - "166", - "inauguration", - "Shuttle", - "alloy", - "beads", - "belts", - "Compton", - "Cause", - "battling", - "critique", - "surf", - "Dock", - "roommate", - "##ulet", - "invade", - "Garland", - "##slow", - "nutrition", - "persona", - "##zam", - "Wichita", - "acquaintance", - "coincided", - "##cate", - "Dracula", - "clamped", - "##gau", - "overhaul", - "##broken", - "##rrier", - "melodies", - "ventures", - "Paz", - "convex", - "Roots", - "##holding", - "Tribute", - "transgender", - "##ò", - "chimney", - "##riad", - "Ajax", - "Thereafter", - "messed", - "nowadays", - "pH", - "##100", - "##alog", - "Pomerania", - "##yra", - "Rossi", - "glove", - "##TL", - "Races", - "##asily", - "tablets", - "Jase", - "##ttes", - "diner", - "##rns", - "Hu", - "Mohan", - "anytime", - "weighted", - "remixes", - "Dove", - "cherry", - "imports", - "##urity", - "GA", - "##TT", - "##iated", - "##sford", - "Clarkson", - "evidently", - "rugged", - "Dust", - "siding", - "##ometer", - "acquitted", - "choral", - "##mite", - "infants", - "Domenico", - "gallons", - "Atkinson", - "gestures", - "slated", - "##xa", - "Archaeology", - "unwanted", - "##ibes", - "##duced", - "premise", - "Colby", - "Geelong", - "disqualified", - "##pf", - "##voking", - "simplicity", - "Walkover", - "Qaeda", - "Warden", - "##bourg", - "##ān", - "Invasion", - "Babe", - "harness", - "183", - "##tated", - "maze", - "Burt", - "bedrooms", - "##nsley", - "Horizon", - "##oast", - "minimize", - "peeked", - "MLA", - "Trains", - "tractor", - "nudged", - "##iform", - "Growth", - "Benton", - "separates", - "##about", - "##kari", - "buffer", - "anthropology", - "brigades", - "foil", - "##wu", - "Domain", - "licking", - "whore", - "##rage", - "##sham", - "Initial", - "Courthouse", - "Rutgers", - "dams", - "villains", - "supermarket", - "##brush", - "Brunei", - "Palermo", - "arises", - "Passenger", - "outreach", - "##gill", - "Labrador", - "McLaren", - "##uy", - "Lori", - "##fires", - "Heads", - "magistrate", - "¹⁄₂", - "Weapons", - "##wai", - "##roke", - "projecting", - "##ulates", - "bordering", - "McKenzie", - "Pavel", - "midway", - "Guangzhou", - "streamed", - "racer", - "##lished", - "eccentric", - "spectral", - "206", - "##mism", - "Wilde", - "Grange", - "preparatory", - "lent", - "##tam", - "starving", - "Gertrude", - "##cea", - "##ricted", - "Breakfast", - "Mira", - "blurted", - "derive", - "##lair", - "blunt", - "sob", - "Cheltenham", - "Henrik", - "reinstated", - "intends", - "##istan", - "unite", - "##ector", - "playful", - "sparks", - "mapped", - "Cadet", - "luggage", - "prosperous", - "##ein", - "salon", - "##utes", - "Biological", - "##rland", - "Tyrone", - "buyer", - "##lose", - "amounted", - "Saw", - "smirked", - "Ronan", - "Reviews", - "Adele", - "trait", - "##proof", - "Bhutan", - "Ginger", - "##junct", - "digitally", - "stirring", - "##isted", - "coconut", - "Hamlet", - "Dinner", - "Scale", - "pledge", - "##RP", - "Wrong", - "Goal", - "Panel", - "therapeutic", - "elevations", - "infectious", - "priesthood", - "##inda", - "Guyana", - "diagnostic", - "##mbre", - "Blackwell", - "sails", - "##arm", - "literal", - "periodically", - "gleaming", - "Robot", - "Rector", - "##abulous", - "##tres", - "Reaching", - "Romantic", - "CP", - "Wonderful", - "##tur", - "ornamental", - "##nges", - "traitor", - "##zilla", - "genetics", - "mentioning", - "##eim", - "resonance", - "Areas", - "Shopping", - "##nard", - "Gail", - "Solid", - "##rito", - "##mara", - "Willem", - "Chip", - "Matches", - "Volkswagen", - "obstacle", - "Organ", - "invites", - "Coral", - "attain", - "##anus", - "##dates", - "Midway", - "shuffled", - "Cecilia", - "dessert", - "Gateway", - "Ch", - "Napoleonic", - "Petroleum", - "jets", - "goose", - "striped", - "bowls", - "vibration", - "Sims", - "nickel", - "Thirteen", - "problematic", - "intervene", - "##grading", - "##unds", - "Mum", - "semifinal", - "Radical", - "##izations", - "refurbished", - "##sation", - "##harine", - "Maximilian", - "cites", - "Advocate", - "Potomac", - "surged", - "preserves", - "Curry", - "angled", - "ordination", - "##pad", - "Cade", - "##DE", - "##sko", - "researched", - "torpedoes", - "Resident", - "wetlands", - "hay", - "applicants", - "depart", - "Bernstein", - "##pic", - "##ario", - "##rae", - "favourable", - "##wari", - "##р", - "metabolism", - "nobleman", - "Defaulted", - "calculate", - "ignition", - "Celebrity", - "Belize", - "sulfur", - "Flat", - "Sc", - "USB", - "flicker", - "Hertfordshire", - "Sept", - "CFL", - "Pasadena", - "Saturdays", - "Titus", - "##nir", - "Canary", - "Computing", - "Isaiah", - "##mler", - "formidable", - "pulp", - "orchid", - "Called", - "Solutions", - "kilograms", - "steamer", - "##hil", - "Doncaster", - "successors", - "Stokes", - "Holstein", - "##sius", - "sperm", - "API", - "Rogue", - "instability", - "Acoustic", - "##rag", - "159", - "undercover", - "Wouldn", - "##pra", - "##medical", - "Eliminated", - "honorable", - "##chel", - "denomination", - "abrupt", - "Buffy", - "blouse", - "fi", - "Regardless", - "Subsequent", - "##rdes", - "Lover", - "##tford", - "bacon", - "##emia", - "carving", - "##cripts", - "Massacre", - "Ramos", - "Latter", - "##ulp", - "ballroom", - "##gement", - "richest", - "bruises", - "Rest", - "Wiley", - "##aster", - "explosions", - "##lastic", - "Edo", - "##LD", - "Mir", - "choking", - "disgusted", - "faintly", - "Barracks", - "blasted", - "headlights", - "Tours", - "ensued", - "presentations", - "##cale", - "wrought", - "##oat", - "##coa", - "Quaker", - "##sdale", - "recipe", - "##gny", - "corpses", - "##liance", - "comfortably", - "##wat", - "Landscape", - "niche", - "catalyst", - "##leader", - "Securities", - "messy", - "##RL", - "Rodrigo", - "backdrop", - "##opping", - "treats", - "Emilio", - "Anand", - "bilateral", - "meadow", - "VC", - "socialism", - "##grad", - "clinics", - "##itating", - "##ppe", - "##ymphonic", - "seniors", - "Advisor", - "Armoured", - "Method", - "Alley", - "##orio", - "Sad", - "fueled", - "raided", - "Axel", - "NH", - "rushes", - "Dixie", - "Otis", - "wrecked", - "##22", - "capitalism", - "café", - "##bbe", - "##pion", - "##forcing", - "Aubrey", - "Lublin", - "Whenever", - "Sears", - "Scheme", - "##lana", - "Meadows", - "treatise", - "##RI", - "##ustic", - "sacrifices", - "sustainability", - "Biography", - "mystical", - "Wanted", - "multiplayer", - "Applications", - "disliked", - "##tisfied", - "impaired", - "empirical", - "forgetting", - "Fairfield", - "Sunni", - "blurred", - "Growing", - "Avalon", - "coil", - "Camera", - "Skin", - "bruised", - "terminals", - "##fted", - "##roving", - "Commando", - "##hya", - "##sper", - "reservations", - "needles", - "dangling", - "##rsch", - "##rsten", - "##spect", - "##mbs", - "yoga", - "regretted", - "Bliss", - "Orion", - "Rufus", - "glucose", - "Olsen", - "autobiographical", - "##dened", - "222", - "humidity", - "Shan", - "##ifiable", - "supper", - "##rou", - "flare", - "##MO", - "campaigning", - "descend", - "socio", - "declares", - "Mounted", - "Gracie", - "Arte", - "endurance", - "##ety", - "Copper", - "costa", - "airplay", - "##MB", - "Proceedings", - "dislike", - "grimaced", - "occupants", - "births", - "glacial", - "oblivious", - "cans", - "installment", - "muddy", - "##ł", - "captains", - "pneumonia", - "Quiet", - "Sloan", - "Excuse", - "##nine", - "Geography", - "gymnastics", - "multimedia", - "drains", - "Anthology", - "Gear", - "cylindrical", - "Fry", - "undertaking", - "##pler", - "##tility", - "Nan", - "##recht", - "Dub", - "philosophers", - "piss", - "Atari", - "##pha", - "Galicia", - "México", - "##nking", - "Continuing", - "bump", - "graveyard", - "persisted", - "Shrine", - "##erapy", - "defects", - "Advance", - "Bomber", - "##oil", - "##ffling", - "cheerful", - "##lix", - "scrub", - "##eto", - "awkwardly", - "collaborator", - "fencing", - "##alo", - "prophet", - "Croix", - "coughed", - "##lication", - "roadway", - "slaughter", - "elephants", - "##erated", - "Simpsons", - "vulnerability", - "ivory", - "Birth", - "lizard", - "scarce", - "cylinders", - "fortunes", - "##NL", - "Hate", - "Priory", - "##lai", - "McBride", - "##copy", - "Lenny", - "liaison", - "Triangle", - "coronation", - "sampled", - "savage", - "amidst", - "Grady", - "whatsoever", - "instinctively", - "Reconstruction", - "insides", - "seizure", - "Drawing", - "##rlin", - "Antioch", - "Gao", - "Díaz", - "1760", - "Sparks", - "##tien", - "##bidae", - "rehearsal", - "##bbs", - "botanical", - "##hers", - "compensate", - "wholesale", - "Seville", - "shareholder", - "prediction", - "astronomical", - "Reddy", - "hardest", - "circling", - "whereabouts", - "termination", - "Rep", - "Assistance", - "Dramatic", - "Herb", - "##ghter", - "climbs", - "188", - "Poole", - "301", - "##pable", - "wit", - "##istice", - "Walters", - "relying", - "Jakob", - "##redo", - "proceeding", - "Langley", - "affiliates", - "ou", - "##allo", - "##holm", - "Samsung", - "##ishi", - "Missing", - "Xi", - "vertices", - "Claus", - "foam", - "restless", - "##uating", - "##sso", - "##ttering", - "Philips", - "delta", - "bombed", - "Catalogue", - "coaster", - "Ling", - "Willard", - "satire", - "410", - "Composition", - "Net", - "Orioles", - "##ldon", - "fins", - "Palatinate", - "Woodward", - "tease", - "tilt", - "brightness", - "##70", - "##bbling", - "##loss", - "##dhi", - "##uilt", - "Whoever", - "##yers", - "hitter", - "Elton", - "Extension", - "ace", - "Affair", - "restructuring", - "##loping", - "Paterson", - "hi", - "##rya", - "spouse", - "Shay", - "Himself", - "piles", - "preaching", - "##gical", - "bikes", - "Brave", - "expulsion", - "Mirza", - "stride", - "Trees", - "commemorated", - "famine", - "masonry", - "Selena", - "Watt", - "Banking", - "Rancho", - "Stockton", - "dip", - "tattoos", - "Vlad", - "acquainted", - "Flyers", - "ruthless", - "fourteenth", - "illustrate", - "##akes", - "EPA", - "##rows", - "##uiz", - "bumped", - "Designed", - "Leaders", - "mastered", - "Manfred", - "swirled", - "McCain", - "##rout", - "Artemis", - "rabbi", - "flinched", - "upgrades", - "penetrate", - "shipyard", - "transforming", - "caretaker", - "##eiro", - "Maureen", - "tightening", - "##founded", - "RAM", - "##icular", - "##mper", - "##rung", - "Fifteen", - "exploited", - "consistency", - "interstate", - "##ynn", - "Bridget", - "contamination", - "Mistress", - "##rup", - "coating", - "##FP", - "##jective", - "Libyan", - "211", - "Gemma", - "dependence", - "shrubs", - "##ggled", - "Germain", - "retaliation", - "traction", - "##PP", - "Dangerous", - "terminology", - "psychiatrist", - "##garten", - "hurdles", - "Natal", - "wasting", - "Weir", - "revolves", - "stripe", - "##reased", - "preferences", - "##entation", - "##lde", - "##áil", - "##otherapy", - "Flame", - "##ologies", - "viruses", - "Label", - "Pandora", - "veil", - "##ogical", - "Coliseum", - "Cottage", - "creeping", - "Jong", - "lectured", - "##çaise", - "shoreline", - "##fference", - "##hra", - "Shade", - "Clock", - "Faye", - "bilingual", - "Humboldt", - "Operating", - "##fter", - "##was", - "algae", - "towed", - "amphibious", - "Parma", - "impacted", - "smacked", - "Piedmont", - "Monsters", - "##omb", - "Moor", - "##lberg", - "sinister", - "Postal", - "178", - "Drummond", - "Sign", - "textbooks", - "hazardous", - "Brass", - "Rosemary", - "Pick", - "Sit", - "Architect", - "transverse", - "Centennial", - "confess", - "polling", - "##aia", - "Julien", - "##mand", - "consolidation", - "Ethel", - "##ulse", - "severity", - "Yorker", - "choreographer", - "1840s", - "##ltry", - "softer", - "versa", - "##geny", - "##quila", - "##jō", - "Caledonia", - "Friendship", - "Visa", - "rogue", - "##zzle", - "bait", - "feather", - "incidence", - "Foods", - "Ships", - "##uto", - "##stead", - "arousal", - "##rote", - "Hazel", - "##bolic", - "Swing", - "##ej", - "##cule", - "##jana", - "##metry", - "##uity", - "Valuable", - "##ₙ", - "Shropshire", - "##nect", - "365", - "Ones", - "realise", - "Café", - "Albuquerque", - "##grown", - "##stadt", - "209", - "##ᵢ", - "prefers", - "withstand", - "Lillian", - "MacArthur", - "Hara", - "##fulness", - "domination", - "##VO", - "##school", - "Freddy", - "ethnicity", - "##while", - "adorned", - "hormone", - "Calder", - "Domestic", - "Freud", - "Shields", - "##phus", - "##rgan", - "BP", - "Segunda", - "Mustang", - "##GI", - "Bonn", - "patiently", - "remarried", - "##umbria", - "Crete", - "Elephant", - "Nuremberg", - "tolerate", - "Tyson", - "##evich", - "Programming", - "##lander", - "Bethlehem", - "segregation", - "Constituency", - "quarterly", - "blushed", - "photographers", - "Sheldon", - "porcelain", - "Blanche", - "goddamn", - "lively", - "##fused", - "bumps", - "##eli", - "curated", - "coherent", - "provoked", - "##vet", - "Madeleine", - "##isco", - "rainy", - "Bethel", - "accusation", - "ponytail", - "gag", - "##lington", - "quicker", - "scroll", - "##vate", - "Bow", - "Gender", - "Ira", - "crashes", - "ACT", - "Maintenance", - "##aton", - "##ieu", - "bitterly", - "strains", - "rattled", - "vectors", - "##arina", - "##ishly", - "173", - "parole", - "##nx", - "amusing", - "Gonzalez", - "##erative", - "Caucus", - "sensual", - "Penelope", - "coefficient", - "Mateo", - "##mani", - "proposition", - "Duty", - "lacrosse", - "proportions", - "Plato", - "profiles", - "Botswana", - "Brandt", - "reins", - "mandolin", - "encompassing", - "##gens", - "Kahn", - "prop", - "summon", - "##MR", - "##yrian", - "##zaki", - "Falling", - "conditional", - "thy", - "##bao", - "##ych", - "radioactive", - "##nics", - "Newspaper", - "##people", - "##nded", - "Gaming", - "sunny", - "##look", - "Sherwood", - "crafted", - "NJ", - "awoke", - "187", - "timeline", - "giants", - "possessing", - "##ycle", - "Cheryl", - "ng", - "Ruiz", - "polymer", - "potassium", - "Ramsay", - "relocation", - "##leen", - "Sociology", - "##bana", - "Franciscan", - "propulsion", - "denote", - "##erjee", - "registers", - "headline", - "Tests", - "emerges", - "Articles", - "Mint", - "livery", - "breakup", - "kits", - "Rap", - "Browning", - "Bunny", - "##mington", - "##watch", - "Anastasia", - "Zachary", - "arranging", - "biographical", - "Erica", - "Nippon", - "##membrance", - "Carmel", - "##sport", - "##xes", - "Paddy", - "##holes", - "Issues", - "Spears", - "compliment", - "##stro", - "##graphs", - "Castillo", - "##MU", - "##space", - "Corporal", - "##nent", - "174", - "Gentlemen", - "##ilize", - "##vage", - "convinces", - "Carmine", - "Crash", - "##hashi", - "Files", - "Doctors", - "brownish", - "sweating", - "goats", - "##conductor", - "rendition", - "##bt", - "NL", - "##spiration", - "generates", - "##cans", - "obsession", - "##noy", - "Danger", - "Diaz", - "heats", - "Realm", - "priorities", - "##phon", - "1300", - "initiation", - "pagan", - "bursts", - "archipelago", - "chloride", - "Screenplay", - "Hewitt", - "Khmer", - "bang", - "judgement", - "negotiating", - "##ait", - "Mabel", - "densely", - "Boulder", - "knob", - "430", - "Alfredo", - "##kt", - "pitches", - "##ées", - "##ان", - "Macdonald", - "##llum", - "imply", - "##mot", - "Smile", - "spherical", - "##tura", - "Derrick", - "Kelley", - "Nico", - "cortex", - "launches", - "differed", - "parallels", - "Navigation", - "##child", - "##rming", - "canoe", - "forestry", - "reinforce", - "##mote", - "confirming", - "tasting", - "scaled", - "##resh", - "##eting", - "Understanding", - "prevailing", - "Pearce", - "CW", - "earnest", - "Gaius", - "asserts", - "denoted", - "landmarks", - "Chargers", - "warns", - "##flies", - "Judges", - "jagged", - "##dain", - "tails", - "Historian", - "Millie", - "##sler", - "221", - "##uard", - "absurd", - "Dion", - "##ially", - "makeshift", - "Specifically", - "ignorance", - "Eat", - "##ieri", - "comparisons", - "forensic", - "186", - "Giro", - "skeptical", - "disciplinary", - "battleship", - "##45", - "Libby", - "520", - "Odyssey", - "ledge", - "##post", - "Eternal", - "Missionary", - "deficiency", - "settler", - "wonders", - "##gai", - "raging", - "##cis", - "Romney", - "Ulrich", - "annexation", - "boxers", - "sect", - "204", - "ARIA", - "dei", - "Hitchcock", - "te", - "Varsity", - "##fic", - "CC", - "lending", - "##nial", - "##tag", - "##rdy", - "##obe", - "Defensive", - "##dson", - "##pore", - "stellar", - "Lam", - "Trials", - "contention", - "Sung", - "##uminous", - "Poe", - "superiority", - "##plicate", - "325", - "bitten", - "conspicuous", - "##olly", - "Lila", - "Pub", - "Petit", - "distorted", - "ISIL", - "distinctly", - "##family", - "Cowboy", - "mutant", - "##cats", - "##week", - "Changes", - "Sinatra", - "epithet", - "neglect", - "Innocent", - "gamma", - "thrill", - "reggae", - "##adia", - "##ational", - "##due", - "landlord", - "##leaf", - "visibly", - "##ì", - "Darlington", - "Gomez", - "##iting", - "scarf", - "##lade", - "Hinduism", - "Fever", - "scouts", - "##roi", - "convened", - "##oki", - "184", - "Lao", - "boycott", - "unemployed", - "##lore", - "##ß", - "##hammer", - "Curran", - "disciples", - "odor", - "##ygiene", - "Lighthouse", - "Played", - "whales", - "discretion", - "Yves", - "##ceived", - "pauses", - "coincide", - "##nji", - "dizzy", - "##scopic", - "routed", - "Guardians", - "Kellan", - "carnival", - "nasal", - "224", - "##awed", - "Mitsubishi", - "640", - "Cast", - "silky", - "Projects", - "joked", - "Huddersfield", - "Rothschild", - "zu", - "##olar", - "Divisions", - "mildly", - "##eni", - "##lge", - "Appalachian", - "Sahara", - "pinch", - "##roon", - "wardrobe", - "##dham", - "##etal", - "Bubba", - "##lini", - "##rumbling", - "Communities", - "Poznań", - "unification", - "Beau", - "Kris", - "SV", - "Rowing", - "Minh", - "reconciliation", - "##saki", - "##sor", - "taped", - "##reck", - "certificates", - "gubernatorial", - "rainbow", - "##uing", - "litter", - "##lique", - "##oted", - "Butterfly", - "benefited", - "Images", - "induce", - "Balkans", - "Velvet", - "##90", - "##xon", - "Bowman", - "##breaker", - "penis", - "##nitz", - "##oint", - "##otive", - "crust", - "##pps", - "organizers", - "Outdoor", - "nominees", - "##rika", - "TX", - "##ucks", - "Protestants", - "##imation", - "appetite", - "Baja", - "awaited", - "##points", - "windshield", - "##igh", - "##zled", - "Brody", - "Buster", - "stylized", - "Bryce", - "##sz", - "Dollar", - "vest", - "mold", - "ounce", - "ok", - "receivers", - "##uza", - "Purdue", - "Harrington", - "Hodges", - "captures", - "##ggio", - "Reservation", - "##ssin", - "##tman", - "cosmic", - "straightforward", - "flipping", - "remixed", - "##athed", - "Gómez", - "Lim", - "motorcycles", - "economies", - "owning", - "Dani", - "##rosis", - "myths", - "sire", - "kindly", - "1768", - "Bean", - "graphs", - "##mee", - "##RO", - "##geon", - "puppy", - "Stephenson", - "notified", - "##jer", - "Watching", - "##rama", - "Sino", - "urgency", - "Islanders", - "##mash", - "Plata", - "fumble", - "##chev", - "##stance", - "##rack", - "##she", - "facilitated", - "swings", - "akin", - "enduring", - "payload", - "##phine", - "Deputies", - "murals", - "##tooth", - "610", - "Jays", - "eyeing", - "##quito", - "transparency", - "##cote", - "Timor", - "negatively", - "##isan", - "battled", - "##fected", - "thankful", - "Rage", - "hospitality", - "incorrectly", - "207", - "entrepreneurs", - "##cula", - "##wley", - "hedge", - "##cratic", - "Corpus", - "Odessa", - "Whereas", - "##ln", - "fetch", - "happier", - "Amherst", - "bullying", - "graceful", - "Height", - "Bartholomew", - "willingness", - "qualifier", - "191", - "Syed", - "Wesleyan", - "Layla", - "##rrence", - "Webber", - "##hum", - "Rat", - "##cket", - "##herence", - "Monterey", - "contaminated", - "Beside", - "Mustafa", - "Nana", - "213", - "##pruce", - "Reason", - "##spense", - "spike", - "##gé", - "AU", - "disciple", - "charcoal", - "##lean", - "formulated", - "Diesel", - "Mariners", - "accreditation", - "glossy", - "1800s", - "##ih", - "Mainz", - "unison", - "Marianne", - "shear", - "overseeing", - "vernacular", - "bowled", - "##lett", - "unpopular", - "##ckoned", - "##monia", - "Gaston", - "##TI", - "##oters", - "Cups", - "##bones", - "##ports", - "Museo", - "minors", - "1773", - "Dickens", - "##EL", - "##NBC", - "Presents", - "ambitions", - "axes", - "Río", - "Yukon", - "bedside", - "Ribbon", - "Units", - "faults", - "conceal", - "##lani", - "prevailed", - "214", - "Goodwin", - "Jaguar", - "crumpled", - "Cullen", - "Wireless", - "ceded", - "remotely", - "Bin", - "mocking", - "straps", - "ceramics", - "##avi", - "##uding", - "##ader", - "Taft", - "twenties", - "##aked", - "Problem", - "quasi", - "Lamar", - "##ntes", - "##avan", - "Barr", - "##eral", - "hooks", - "sa", - "##ône", - "194", - "##ross", - "Nero", - "Caine", - "trance", - "Homeland", - "benches", - "Guthrie", - "dismiss", - "##lex", - "César", - "foliage", - "##oot", - "##alty", - "Assyrian", - "Ahead", - "Murdoch", - "dictatorship", - "wraps", - "##ntal", - "Corridor", - "Mackay", - "respectable", - "jewels", - "understands", - "##pathic", - "Bryn", - "##tep", - "ON", - "capsule", - "intrigued", - "Sleeping", - "communists", - "##chayat", - "##current", - "##vez", - "doubling", - "booklet", - "##uche", - "Creed", - "##NU", - "spies", - "##sef", - "adjusting", - "197", - "Imam", - "heaved", - "Tanya", - "canonical", - "restraint", - "senators", - "stainless", - "##gnate", - "Matter", - "cache", - "restrained", - "conflicting", - "stung", - "##ool", - "Sustainable", - "antiquity", - "193", - "heavens", - "inclusive", - "##ador", - "fluent", - "303", - "911", - "archaeologist", - "superseded", - "##plex", - "Tammy", - "inspire", - "##passing", - "##lub", - "Lama", - "Mixing", - "##activated", - "##yote", - "parlor", - "tactic", - "198", - "Stefano", - "prostitute", - "recycling", - "sorted", - "banana", - "Stacey", - "Musée", - "aristocratic", - "cough", - "##rting", - "authorised", - "gangs", - "runoff", - "thoughtfully", - "##nish", - "Fisheries", - "Provence", - "detector", - "hum", - "##zhen", - "pill", - "##árez", - "Map", - "Leaves", - "Peabody", - "skater", - "vent", - "##color", - "390", - "cerebral", - "hostages", - "mare", - "Jurassic", - "swell", - "##isans", - "Knoxville", - "Naked", - "Malaya", - "scowl", - "Cobra", - "##anga", - "Sexual", - "##dron", - "##iae", - "196", - "##drick", - "Ravens", - "Blaine", - "##throp", - "Ismail", - "symmetric", - "##lossom", - "Leicestershire", - "Sylvester", - "glazed", - "##tended", - "Radar", - "fused", - "Families", - "Blacks", - "Sale", - "Zion", - "foothills", - "microwave", - "slain", - "Collingwood", - "##pants", - "##dling", - "killers", - "routinely", - "Janice", - "hearings", - "##chanted", - "##ltration", - "continents", - "##iving", - "##yster", - "##shot", - "##yna", - "injected", - "Guillaume", - "##ibi", - "kinda", - "Confederacy", - "Barnett", - "disasters", - "incapable", - "##grating", - "rhythms", - "betting", - "draining", - "##hak", - "Callie", - "Glover", - "##iliated", - "Sherlock", - "hearted", - "punching", - "Wolverhampton", - "Leaf", - "Pi", - "builders", - "furnished", - "knighted", - "Photo", - "##zle", - "Touring", - "fumbled", - "pads", - "##ий", - "Bartlett", - "Gunner", - "eerie", - "Marius", - "Bonus", - "pots", - "##hino", - "##pta", - "Bray", - "Frey", - "Ortiz", - "stalls", - "belongings", - "Subway", - "fascination", - "metaphor", - "Bat", - "Boer", - "Colchester", - "sway", - "##gro", - "rhetoric", - "##dheim", - "Fool", - "PMID", - "admire", - "##hsil", - "Strand", - "TNA", - "##roth", - "Nottinghamshire", - "##mat", - "##yler", - "Oxfordshire", - "##nacle", - "##roner", - "BS", - "##nces", - "stimulus", - "transports", - "Sabbath", - "##postle", - "Richter", - "4000", - "##grim", - "##shima", - "##lette", - "deteriorated", - "analogous", - "##ratic", - "UHF", - "energies", - "inspiring", - "Yiddish", - "Activities", - "##quential", - "##boe", - "Melville", - "##ilton", - "Judd", - "consonants", - "labs", - "smuggling", - "##fari", - "avid", - "##uc", - "truce", - "undead", - "##raith", - "Mostly", - "bracelet", - "Connection", - "Hussain", - "awhile", - "##UC", - "##vention", - "liable", - "genetically", - "##phic", - "Important", - "Wildcats", - "daddy", - "transmit", - "##cas", - "conserved", - "Yesterday", - "##lite", - "Nicky", - "Guys", - "Wilder", - "Lay", - "skinned", - "Communists", - "Garfield", - "Nearby", - "organizer", - "Loss", - "crafts", - "walkway", - "Chocolate", - "Sundance", - "Synod", - "##enham", - "modify", - "swayed", - "Surface", - "analysts", - "brackets", - "drone", - "parachute", - "smelling", - "Andrés", - "filthy", - "frogs", - "vertically", - "##OK", - "localities", - "marries", - "AHL", - "35th", - "##pian", - "Palazzo", - "cube", - "dismay", - "relocate", - "##на", - "Hear", - "##digo", - "##oxide", - "prefecture", - "converts", - "hangar", - "##oya", - "##ucking", - "Spectrum", - "deepened", - "spoiled", - "Keeping", - "##phobic", - "Verona", - "outrage", - "Improvement", - "##UI", - "masterpiece", - "slung", - "Calling", - "chant", - "Haute", - "mediated", - "manipulated", - "affirmed", - "##hesis", - "Hangul", - "skies", - "##llan", - "Worcestershire", - "##kos", - "mosaic", - "##bage", - "##wned", - "Putnam", - "folder", - "##LM", - "guts", - "noteworthy", - "##rada", - "AJ", - "sculpted", - "##iselle", - "##rang", - "recognizable", - "##pent", - "dolls", - "lobbying", - "impatiently", - "Se", - "staple", - "Serb", - "tandem", - "Hiroshima", - "thieves", - "##ynx", - "faculties", - "Norte", - "##alle", - "##trusion", - "chords", - "##ylon", - "Gareth", - "##lops", - "##escu", - "FIA", - "Levin", - "auspices", - "groin", - "Hui", - "nun", - "Listed", - "Honourable", - "Larsen", - "rigorous", - "##erer", - "Tonga", - "##pment", - "##rave", - "##track", - "##aa", - "##enary", - "540", - "clone", - "sediment", - "esteem", - "sighted", - "cruelty", - "##boa", - "inverse", - "violating", - "Amtrak", - "Status", - "amalgamated", - "vertex", - "AR", - "harmless", - "Amir", - "mounts", - "Coronation", - "counseling", - "Audi", - "CO₂", - "splits", - "##eyer", - "Humans", - "Salmon", - "##have", - "##rado", - "##čić", - "216", - "takeoff", - "classmates", - "psychedelic", - "##gni", - "Gypsy", - "231", - "Anger", - "GAA", - "ME", - "##nist", - "##tals", - "Lissa", - "Odd", - "baptized", - "Fiat", - "fringe", - "##hren", - "179", - "elevators", - "perspectives", - "##TF", - "##ngle", - "Question", - "frontal", - "950", - "thicker", - "Molecular", - "##nological", - "Sixteen", - "Baton", - "Hearing", - "commemorative", - "dorm", - "Architectural", - "purity", - "##erse", - "risky", - "Georgie", - "relaxing", - "##ugs", - "downed", - "##rar", - "Slim", - "##phy", - "IUCN", - "##thorpe", - "Parkinson", - "217", - "Marley", - "Shipping", - "sweaty", - "Jesuits", - "Sindh", - "Janata", - "implying", - "Armenians", - "intercept", - "Ankara", - "commissioners", - "ascended", - "sniper", - "Grass", - "Walls", - "salvage", - "Dewey", - "generalized", - "learnt", - "PT", - "##fighter", - "##tech", - "DR", - "##itrus", - "##zza", - "mercenaries", - "slots", - "##burst", - "##finger", - "##nsky", - "Princes", - "Rhodesia", - "##munication", - "##strom", - "Fremantle", - "homework", - "ins", - "##Os", - "##hao", - "##uffed", - "Thorpe", - "Xiao", - "exquisite", - "firstly", - "liberated", - "technician", - "Oilers", - "Phyllis", - "herb", - "sharks", - "MBE", - "##stock", - "Product", - "banjo", - "##morandum", - "##than", - "Visitors", - "unavailable", - "unpublished", - "oxidation", - "Vogue", - "##copic", - "##etics", - "Yates", - "##ppard", - "Leiden", - "Trading", - "cottages", - "Principles", - "##Millan", - "##wife", - "##hiva", - "Vicar", - "nouns", - "strolled", - "##eorological", - "##eton", - "##science", - "precedent", - "Armand", - "Guido", - "rewards", - "##ilis", - "##tise", - "clipped", - "chick", - "##endra", - "averages", - "tentatively", - "1830s", - "##vos", - "Certainly", - "305", - "Société", - "Commandant", - "##crats", - "##dified", - "##nka", - "marsh", - "angered", - "ventilation", - "Hutton", - "Ritchie", - "##having", - "Eclipse", - "flick", - "motionless", - "Amor", - "Fest", - "Loire", - "lays", - "##icit", - "##sband", - "Guggenheim", - "Luck", - "disrupted", - "##ncia", - "Disco", - "##vigator", - "criticisms", - "grins", - "##lons", - "##vial", - "##ody", - "salute", - "Coaches", - "junk", - "saxophonist", - "##eology", - "Uprising", - "Diet", - "##marks", - "chronicles", - "robbed", - "##iet", - "##ahi", - "Bohemian", - "magician", - "wavelength", - "Kenyan", - "augmented", - "fashionable", - "##ogies", - "Luce", - "F1", - "Monmouth", - "##jos", - "##loop", - "enjoyment", - "exemption", - "Centers", - "##visor", - "Soundtrack", - "blinding", - "practitioner", - "solidarity", - "sacrificed", - "##oso", - "##cture", - "##riated", - "blended", - "Abd", - "Copyright", - "##nob", - "34th", - "##reak", - "Claudio", - "hectare", - "rotor", - "testify", - "##ends", - "##iably", - "##sume", - "landowner", - "##cess", - "##ckman", - "Eduard", - "Silesian", - "backseat", - "mutually", - "##abe", - "Mallory", - "bounds", - "Collective", - "Poet", - "Winkler", - "pertaining", - "scraped", - "Phelps", - "crane", - "flickering", - "Proto", - "bubbles", - "popularized", - "removes", - "##86", - "Cadillac", - "Warfare", - "audible", - "rites", - "shivering", - "##sist", - "##nst", - "##biotic", - "Mon", - "fascist", - "Bali", - "Kathryn", - "ambiguous", - "furiously", - "morale", - "patio", - "Sang", - "inconsistent", - "topology", - "Greens", - "monkeys", - "Köppen", - "189", - "Toy", - "vow", - "##ías", - "bombings", - "##culus", - "improvised", - "lodged", - "subsidiaries", - "garment", - "startling", - "practised", - "Hume", - "Thorn", - "categorized", - "Till", - "Eileen", - "wedge", - "##64", - "Federico", - "patriotic", - "unlock", - "##oshi", - "badminton", - "Compared", - "Vilnius", - "##KE", - "Crimean", - "Kemp", - "decks", - "spaced", - "resolutions", - "sighs", - "##mind", - "Imagine", - "Cartoon", - "huddled", - "policemen", - "forwards", - "##rouch", - "equals", - "##nter", - "inspected", - "Charley", - "MG", - "##rte", - "pamphlet", - "Arturo", - "dans", - "scarcely", - "##ulton", - "##rvin", - "parental", - "unconstitutional", - "watts", - "Susannah", - "Dare", - "##sitive", - "Rowland", - "Valle", - "invalid", - "##ué", - "Detachment", - "acronym", - "Yokohama", - "verified", - "##lsson", - "groove", - "Liza", - "clarified", - "compromised", - "265", - "##rgon", - "##orf", - "hesitant", - "Fruit", - "Application", - "Mathias", - "icons", - "##cell", - "Qin", - "interventions", - "##uron", - "punt", - "remnant", - "##rien", - "Ames", - "manifold", - "spines", - "floral", - "##zable", - "comrades", - "Fallen", - "orbits", - "Annals", - "hobby", - "Auditorium", - "implicated", - "researching", - "Pueblo", - "Ta", - "terminate", - "##pella", - "Rings", - "approximation", - "fuzzy", - "##ús", - "thriving", - "##ket", - "Conor", - "alarmed", - "etched", - "Cary", - "##rdon", - "Ally", - "##rington", - "Pay", - "mint", - "##hasa", - "##unity", - "##dman", - "##itate", - "Oceania", - "furrowed", - "trams", - "##aq", - "Wentworth", - "ventured", - "choreography", - "prototypes", - "Patel", - "mouthed", - "trenches", - "##licing", - "##yya", - "Lies", - "deception", - "##erve", - "##vations", - "Bertrand", - "earthquakes", - "##tography", - "Southwestern", - "##aja", - "token", - "Gupta", - "##yō", - "Beckett", - "initials", - "ironic", - "Tsar", - "subdued", - "shootout", - "sobbing", - "liar", - "Scandinavia", - "Souls", - "ch", - "therapist", - "trader", - "Regulation", - "Kali", - "busiest", - "##pation", - "32nd", - "Telephone", - "Vargas", - "##moky", - "##nose", - "##uge", - "Favorite", - "abducted", - "bonding", - "219", - "255", - "correction", - "mat", - "drown", - "fl", - "unbeaten", - "Pocket", - "Summers", - "Quite", - "rods", - "Percussion", - "##ndy", - "buzzing", - "cadet", - "Wilkes", - "attire", - "directory", - "utilities", - "naive", - "populous", - "Hendrix", - "##actor", - "disadvantage", - "1400", - "Landon", - "Underworld", - "##ense", - "Occasionally", - "mercury", - "Davey", - "Morley", - "spa", - "wrestled", - "##vender", - "eclipse", - "Sienna", - "supplemented", - "thou", - "Stream", - "liturgical", - "##gall", - "##berries", - "##piration", - "1769", - "Bucks", - "abandoning", - "##jutant", - "##nac", - "232", - "venom", - "##31", - "Roche", - "dotted", - "Currie", - "Córdoba", - "Milo", - "Sharif", - "divides", - "justification", - "prejudice", - "fortunate", - "##vide", - "##ābād", - "Rowe", - "inflammatory", - "##eld", - "avenue", - "Sources", - "##rimal", - "Messenger", - "Blanco", - "advocating", - "formulation", - "##pute", - "emphasizes", - "nut", - "Armored", - "##ented", - "nutrients", - "##tment", - "insistence", - "Martins", - "landowners", - "##RB", - "comparatively", - "headlines", - "snaps", - "##qing", - "Celebration", - "##mad", - "republican", - "##NE", - "Trace", - "##500", - "1771", - "proclamation", - "NRL", - "Rubin", - "Buzz", - "Weimar", - "##AG", - "199", - "posthumous", - "##ental", - "##deacon", - "Distance", - "intensely", - "overheard", - "Arcade", - "diagonal", - "hazard", - "Giving", - "weekdays", - "##ù", - "Verdi", - "actresses", - "##hare", - "Pulling", - "##erries", - "##pores", - "catering", - "shortest", - "##ctors", - "##cure", - "##restle", - "##reta", - "##runch", - "##brecht", - "##uddin", - "Moments", - "senate", - "Feng", - "Prescott", - "##thest", - "218", - "divisional", - "Bertie", - "sparse", - "surrounds", - "coupling", - "gravitational", - "werewolves", - "##lax", - "Rankings", - "##mated", - "##tries", - "Shia", - "##mart", - "##23", - "##vocative", - "interfaces", - "morphology", - "newscast", - "##bide", - "inputs", - "solicitor", - "Olaf", - "cabinets", - "puzzles", - "##tains", - "Unified", - "##firmed", - "WA", - "solemn", - "##opy", - "Tito", - "Jaenelle", - "Neolithic", - "horseback", - "##ires", - "pharmacy", - "prevalence", - "##lint", - "Swami", - "##bush", - "##tudes", - "Philipp", - "mythical", - "divers", - "Scouting", - "aperture", - "progressively", - "##bay", - "##nio", - "bounce", - "Floor", - "##elf", - "Lucan", - "adulthood", - "helm", - "Bluff", - "Passage", - "Salvation", - "lemon", - "napkin", - "scheduling", - "##gets", - "Elements", - "Mina", - "Novak", - "stalled", - "##llister", - "Infrastructure", - "##nky", - "##tania", - "##uished", - "Katz", - "Norma", - "sucks", - "trusting", - "1765", - "boilers", - "Accordingly", - "##hered", - "223", - "Crowley", - "##fight", - "##ulo", - "Henrietta", - "##hani", - "pounder", - "surprises", - "##chor", - "##glia", - "Dukes", - "##cracy", - "##zier", - "##fs", - "Patriot", - "silicon", - "##VP", - "simulcast", - "telegraph", - "Mysore", - "cardboard", - "Len", - "##QL", - "Auguste", - "accordion", - "analytical", - "specify", - "ineffective", - "hunched", - "abnormal", - "Transylvania", - "##dn", - "##tending", - "Emilia", - "glittering", - "Maddy", - "##wana", - "1762", - "External", - "Lecture", - "endorsement", - "Hernández", - "Anaheim", - "Ware", - "offences", - "##phorus", - "Plantation", - "popping", - "Bonaparte", - "disgusting", - "neared", - "##notes", - "Identity", - "heroin", - "nicely", - "##raverse", - "apron", - "congestion", - "##PR", - "padded", - "##fts", - "invaders", - "##came", - "freshly", - "Halle", - "endowed", - "fracture", - "ROM", - "##max", - "sediments", - "diffusion", - "dryly", - "##tara", - "Tam", - "Draw", - "Spin", - "Talon", - "Anthropology", - "##lify", - "nausea", - "##shirt", - "insert", - "Fresno", - "capitalist", - "indefinitely", - "apples", - "Gift", - "scooped", - "60s", - "Cooperative", - "mistakenly", - "##lover", - "murmur", - "##iger", - "Equipment", - "abusive", - "orphanage", - "##9th", - "##lterweight", - "##unda", - "Baird", - "ant", - "saloon", - "33rd", - "Chesapeake", - "##chair", - "##sound", - "##tend", - "chaotic", - "pornography", - "brace", - "##aret", - "heiress", - "SSR", - "resentment", - "Arbor", - "headmaster", - "##uren", - "unlimited", - "##with", - "##jn", - "Bram", - "Ely", - "Pokémon", - "pivotal", - "##guous", - "Database", - "Marta", - "Shine", - "stumbling", - "##ovsky", - "##skin", - "Henley", - "Polk", - "functioned", - "##layer", - "##pas", - "##udd", - "##MX", - "blackness", - "cadets", - "feral", - "Damian", - "##actions", - "2D", - "##yla", - "Apocalypse", - "##aic", - "inactivated", - "##china", - "##kovic", - "##bres", - "destroys", - "nap", - "Macy", - "sums", - "Madhya", - "Wisdom", - "rejects", - "##amel", - "60th", - "Cho", - "bandwidth", - "##sons", - "##obbing", - "##orama", - "Mutual", - "shafts", - "##estone", - "##rsen", - "accord", - "replaces", - "waterfront", - "##gonal", - "##rida", - "convictions", - "##ays", - "calmed", - "suppliers", - "Cummings", - "GMA", - "fearful", - "Scientist", - "Sinai", - "examines", - "experimented", - "Netflix", - "Enforcement", - "Scarlett", - "##lasia", - "Healthcare", - "##onte", - "Dude", - "inverted", - "##36", - "##regation", - "##lidae", - "Munro", - "##angay", - "Airbus", - "overlapping", - "Drivers", - "lawsuits", - "bodily", - "##udder", - "Wanda", - "Effects", - "Fathers", - "##finery", - "##islav", - "Ridley", - "observatory", - "pod", - "##utrition", - "Electricity", - "landslide", - "##mable", - "##zoic", - "##imator", - "##uration", - "Estates", - "sleepy", - "Nickelodeon", - "steaming", - "irony", - "schedules", - "snack", - "spikes", - "Hmm", - "##nesia", - "##bella", - "##hibit", - "Greenville", - "plucked", - "Harald", - "##ono", - "Gamma", - "infringement", - "roaring", - "deposition", - "##pol", - "##orum", - "660", - "seminal", - "passports", - "engagements", - "Akbar", - "rotated", - "##bina", - "##gart", - "Hartley", - "##lown", - "##truct", - "uttered", - "traumatic", - "Dex", - "##ôme", - "Holloway", - "MV", - "apartheid", - "##nee", - "Counter", - "Colton", - "OR", - "245", - "Spaniards", - "Regency", - "Schedule", - "scratching", - "squads", - "verify", - "##alk", - "keyboardist", - "rotten", - "Forestry", - "aids", - "commemorating", - "##yed", - "##érie", - "Sting", - "##elly", - "Dai", - "##fers", - "##berley", - "##ducted", - "Melvin", - "cannabis", - "glider", - "##enbach", - "##rban", - "Costello", - "Skating", - "cartoonist", - "AN", - "audit", - "##pectator", - "distributing", - "226", - "312", - "interpreter", - "header", - "Alternatively", - "##ases", - "smug", - "##kumar", - "cabins", - "remastered", - "Connolly", - "Kelsey", - "LED", - "tentative", - "Check", - "Sichuan", - "shaved", - "##42", - "Gerhard", - "Harvest", - "inward", - "##rque", - "Hopefully", - "hem", - "##34", - "Typical", - "binds", - "wrath", - "Woodstock", - "forcibly", - "Fergus", - "##charged", - "##tured", - "prepares", - "amenities", - "penetration", - "##ghan", - "coarse", - "##oned", - "enthusiasts", - "##av", - "##twined", - "fielded", - "##cky", - "Kiel", - "##obia", - "470", - "beers", - "tremble", - "youths", - "attendees", - "##cademies", - "##sex", - "Macon", - "communism", - "dir", - "##abi", - "Lennox", - "Wen", - "differentiate", - "jewel", - "##SO", - "activate", - "assert", - "laden", - "unto", - "Gillespie", - "Guillermo", - "accumulation", - "##GM", - "NGO", - "Rosenberg", - "calculating", - "drastically", - "##omorphic", - "peeled", - "Liège", - "insurgents", - "outdoors", - "##enia", - "Aspen", - "Sep", - "awakened", - "##eye", - "Consul", - "Maiden", - "insanity", - "##brian", - "furnace", - "Colours", - "distributions", - "longitudinal", - "syllables", - "##scent", - "Martian", - "accountant", - "Atkins", - "husbands", - "sewage", - "zur", - "collaborate", - "highlighting", - "##rites", - "##PI", - "colonization", - "nearer", - "##XT", - "dunes", - "positioning", - "Ku", - "multitude", - "luxurious", - "Volvo", - "linguistics", - "plotting", - "squared", - "##inder", - "outstretched", - "##uds", - "Fuji", - "ji", - "##feit", - "##ahu", - "##loat", - "##gado", - "##luster", - "##oku", - "América", - "##iza", - "Residents", - "vine", - "Pieces", - "DD", - "Vampires", - "##ová", - "smoked", - "harshly", - "spreads", - "##turn", - "##zhi", - "betray", - "electors", - "##settled", - "Considering", - "exploits", - "stamped", - "Dusty", - "enraged", - "Nairobi", - "##38", - "intervened", - "##luck", - "orchestras", - "##lda", - "Hereford", - "Jarvis", - "calf", - "##itzer", - "##CH", - "salesman", - "Lovers", - "cigar", - "Angelica", - "doomed", - "heroine", - "##tible", - "Sanford", - "offenders", - "##ulously", - "articulated", - "##oam", - "Emanuel", - "Gardiner", - "Edna", - "Shu", - "gigantic", - "##stable", - "Tallinn", - "coasts", - "Maker", - "ale", - "stalking", - "##oga", - "##smus", - "lucrative", - "southbound", - "##changing", - "Reg", - "##lants", - "Schleswig", - "discount", - "grouping", - "physiological", - "##OH", - "##sun", - "Galen", - "assurance", - "reconcile", - "rib", - "scarlet", - "Thatcher", - "anarchist", - "##oom", - "Turnpike", - "##ceding", - "cocktail", - "Sweeney", - "Allegheny", - "concessions", - "oppression", - "reassuring", - "##poli", - "##ticus", - "##TR", - "##VI", - "##uca", - "##zione", - "directional", - "strikeouts", - "Beneath", - "Couldn", - "Kabul", - "##national", - "hydroelectric", - "##jit", - "Desire", - "##riot", - "enhancing", - "northbound", - "##PO", - "Ok", - "Routledge", - "volatile", - "Bernardo", - "Python", - "333", - "ample", - "chestnut", - "automobiles", - "##innamon", - "##care", - "##hering", - "BWF", - "salaries", - "Turbo", - "acquisitions", - "##stituting", - "strengths", - "pilgrims", - "Ponce", - "Pig", - "Actors", - "Beard", - "sanitation", - "##RD", - "##mett", - "Telecommunications", - "worms", - "##idas", - "Juno", - "Larson", - "Ventura", - "Northeastern", - "weighs", - "Houghton", - "collaborating", - "lottery", - "##rano", - "Wonderland", - "gigs", - "##lmer", - "##zano", - "##edd", - "##nife", - "mixtape", - "predominant", - "tripped", - "##ruly", - "Alexei", - "investing", - "Belgarath", - "Brasil", - "hiss", - "##crat", - "##xham", - "Côte", - "560", - "kilometer", - "##cological", - "analyzing", - "##As", - "engined", - "listener", - "##cakes", - "negotiation", - "##hisky", - "Santana", - "##lemma", - "IAAF", - "Seneca", - "skeletal", - "Covenant", - "Steiner", - "##lev", - "##uen", - "Neptune", - "retention", - "##upon", - "Closing", - "Czechoslovak", - "chalk", - "Navarre", - "NZ", - "##IG", - "##hop", - "##oly", - "##quatorial", - "##sad", - "Brewery", - "Conflict", - "Them", - "renew", - "turrets", - "disagree", - "Petra", - "Slave", - "##reole", - "adjustment", - "##dela", - "##regard", - "##sner", - "framing", - "stature", - "##rca", - "##sies", - "##46", - "##mata", - "Logic", - "inadvertently", - "naturalist", - "spheres", - "towering", - "heightened", - "Dodd", - "rink", - "##fle", - "Keyboards", - "bulb", - "diver", - "ul", - "##tsk", - "Exodus", - "Deacon", - "España", - "Canadiens", - "oblique", - "thud", - "reigned", - "rug", - "Whitman", - "Dash", - "##iens", - "Haifa", - "pets", - "##arland", - "manually", - "dart", - "##bial", - "Sven", - "textiles", - "subgroup", - "Napier", - "graffiti", - "revolver", - "humming", - "Babu", - "protector", - "typed", - "Provinces", - "Sparta", - "Wills", - "subjective", - "##rella", - "temptation", - "##liest", - "FL", - "Sadie", - "manifest", - "Guangdong", - "Transfer", - "entertain", - "eve", - "recipes", - "##33", - "Benedictine", - "retailer", - "##dence", - "establishes", - "##cluded", - "##rked", - "Ursula", - "##ltz", - "##lars", - "##rena", - "qualifiers", - "##curement", - "colt", - "depictions", - "##oit", - "Spiritual", - "differentiation", - "staffed", - "transitional", - "##lew", - "1761", - "fatalities", - "##oan", - "Bayern", - "Northamptonshire", - "Weeks", - "##CU", - "Fife", - "capacities", - "hoarse", - "##latt", - "##ة", - "evidenced", - "##HD", - "##ographer", - "assessing", - "evolve", - "hints", - "42nd", - "streaked", - "##lve", - "Yahoo", - "##estive", - "##rned", - "##zas", - "baggage", - "Elected", - "secrecy", - "##champ", - "Character", - "Pen", - "Decca", - "cape", - "Bernardino", - "vapor", - "Dolly", - "counselor", - "##isers", - "Benin", - "##khar", - "##CR", - "notch", - "##thus", - "##racy", - "bounty", - "lend", - "grassland", - "##chtenstein", - "##dating", - "pseudo", - "golfer", - "simplest", - "##ceive", - "Lucivar", - "Triumph", - "dinosaur", - "dinosaurs", - "##šić", - "Seahawks", - "##nco", - "resorts", - "reelected", - "1766", - "reproduce", - "universally", - "##OA", - "ER", - "tendencies", - "Consolidated", - "Massey", - "Tasmanian", - "reckless", - "##icz", - "##ricks", - "1755", - "questionable", - "Audience", - "##lates", - "preseason", - "Quran", - "trivial", - "Haitian", - "Freeway", - "dialed", - "Appointed", - "Heard", - "ecosystems", - "##bula", - "hormones", - "Carbon", - "Rd", - "##arney", - "##working", - "Christoph", - "presiding", - "pu", - "##athy", - "Morrow", - "Dar", - "ensures", - "posing", - "remedy", - "EA", - "disclosed", - "##hui", - "##rten", - "rumours", - "surveying", - "##ficiency", - "Aziz", - "Jewel", - "Plays", - "##smatic", - "Bernhard", - "Christi", - "##eanut", - "##friend", - "jailed", - "##dr", - "govern", - "neighbour", - "butler", - "Acheron", - "murdering", - "oils", - "mac", - "Editorial", - "detectives", - "bolts", - "##ulon", - "Guitars", - "malaria", - "36th", - "Pembroke", - "Opened", - "##hium", - "harmonic", - "serum", - "##sio", - "Franks", - "fingernails", - "##gli", - "culturally", - "evolving", - "scalp", - "VP", - "deploy", - "uploaded", - "mater", - "##evo", - "Jammu", - "Spa", - "##icker", - "flirting", - "##cursions", - "Heidi", - "Majority", - "sprawled", - "##alytic", - "Zheng", - "bunker", - "##lena", - "ST", - "##tile", - "Jiang", - "ceilings", - "##ently", - "##ols", - "Recovery", - "dire", - "##good", - "Manson", - "Honestly", - "Montréal", - "1764", - "227", - "quota", - "Lakshmi", - "incentive", - "Accounting", - "##cilla", - "Eureka", - "Reaper", - "buzzed", - "##uh", - "courtroom", - "dub", - "##mberg", - "KC", - "Gong", - "Theodor", - "Académie", - "NPR", - "criticizing", - "protesting", - "##pired", - "##yric", - "abuses", - "fisheries", - "##minated", - "1767", - "yd", - "Gemini", - "Subcommittee", - "##fuse", - "Duff", - "Wasn", - "Wight", - "cleaner", - "##tite", - "planetary", - "Survivor", - "Zionist", - "mounds", - "##rary", - "landfall", - "disruption", - "yielding", - "##yana", - "bids", - "unidentified", - "Garry", - "Ellison", - "Elmer", - "Fishing", - "Hayward", - "demos", - "modelling", - "##anche", - "##stick", - "caressed", - "entertained", - "##hesion", - "piers", - "Crimea", - "##mass", - "WHO", - "boulder", - "trunks", - "1640", - "Biennale", - "Palestinians", - "Pursuit", - "##udes", - "Dora", - "contender", - "##dridge", - "Nanjing", - "##ezer", - "##former", - "##ibel", - "Whole", - "proliferation", - "##tide", - "##weiler", - "fuels", - "predictions", - "##ente", - "##onium", - "Filming", - "absorbing", - "Ramón", - "strangled", - "conveyed", - "inhabit", - "prostitutes", - "recession", - "bonded", - "clinched", - "##eak", - "##iji", - "##edar", - "Pleasure", - "Rite", - "Christy", - "Therapy", - "sarcasm", - "##collegiate", - "hilt", - "probation", - "Sarawak", - "coefficients", - "underworld", - "biodiversity", - "SBS", - "groom", - "brewing", - "dungeon", - "##claiming", - "Hari", - "turnover", - "##ntina", - "##omer", - "##opped", - "orthodox", - "styling", - "##tars", - "##ulata", - "priced", - "Marjorie", - "##eley", - "##abar", - "Yong", - "##tically", - "Crambidae", - "Hernandez", - "##ego", - "##rricular", - "##ark", - "##lamour", - "##llin", - "##augh", - "##tens", - "Advancement", - "Loyola", - "##4th", - "##hh", - "goin", - "marshes", - "Sardinia", - "##ša", - "Ljubljana", - "Singing", - "suspiciously", - "##hesive", - "Félix", - "Regarding", - "flap", - "stimulation", - "##raught", - "Apr", - "Yin", - "gaping", - "tighten", - "skier", - "##itas", - "##lad", - "##rani", - "264", - "Ashes", - "Olson", - "Problems", - "Tabitha", - "##rading", - "balancing", - "sunrise", - "##ease", - "##iture", - "##ritic", - "Fringe", - "##iciency", - "Inspired", - "Linnaeus", - "PBA", - "disapproval", - "##kles", - "##rka", - "##tails", - "##urger", - "Disaster", - "Laboratories", - "apps", - "paradise", - "Aero", - "Came", - "sneaking", - "Gee", - "Beacon", - "ODI", - "commodity", - "Ellington", - "graphical", - "Gretchen", - "spire", - "##skaya", - "##trine", - "RTÉ", - "efficacy", - "plc", - "tribunal", - "##ytic", - "downhill", - "flu", - "medications", - "##kaya", - "widen", - "Sunrise", - "##nous", - "distinguishing", - "pawn", - "##BO", - "##irn", - "##ssing", - "##ν", - "Easton", - "##vila", - "Rhineland", - "##aque", - "defect", - "##saurus", - "Goose", - "Ju", - "##classified", - "Middlesbrough", - "shaping", - "preached", - "1759", - "##erland", - "Ein", - "Hailey", - "musicals", - "##altered", - "Galileo", - "Hilda", - "Fighters", - "Lac", - "##ometric", - "295", - "Leafs", - "Milano", - "##lta", - "##VD", - "##ivist", - "penetrated", - "Mask", - "Orchard", - "plaintiff", - "##icorn", - "Yvonne", - "##fred", - "outfielder", - "peek", - "Collier", - "Caracas", - "repealed", - "Bois", - "dell", - "restrict", - "Dolores", - "Hadley", - "peacefully", - "##LL", - "condom", - "Granny", - "Orders", - "sabotage", - "##toon", - "##rings", - "compass", - "marshal", - "gears", - "brigadier", - "dye", - "Yunnan", - "communicating", - "donate", - "emerald", - "vitamin", - "administer", - "Fulham", - "##classical", - "##llas", - "Buckinghamshire", - "Held", - "layered", - "disclosure", - "Akira", - "programmer", - "shrimp", - "Crusade", - "##ximal", - "Luzon", - "bakery", - "##cute", - "Garth", - "Citadel", - "uniquely", - "Curling", - "info", - "mum", - "Para", - "##ști", - "sleek", - "##ione", - "hey", - "Lantern", - "mesh", - "##lacing", - "##lizzard", - "##gade", - "prosecuted", - "Alba", - "Gilles", - "greedy", - "twists", - "##ogged", - "Viper", - "##kata", - "Appearances", - "Skyla", - "hymns", - "##pelled", - "curving", - "predictable", - "Grave", - "Watford", - "##dford", - "##liptic", - "##vary", - "Westwood", - "fluids", - "Models", - "statutes", - "##ynamite", - "1740", - "##culate", - "Framework", - "Johanna", - "##gression", - "Vuelta", - "imp", - "##otion", - "##raga", - "##thouse", - "Ciudad", - "festivities", - "##love", - "Beyoncé", - "italics", - "##vance", - "DB", - "##haman", - "outs", - "Singers", - "##ueva", - "##urning", - "##51", - "##ntiary", - "##mobile", - "285", - "Mimi", - "emeritus", - "nesting", - "Keeper", - "Ways", - "##onal", - "##oux", - "Edmond", - "MMA", - "##bark", - "##oop", - "Hampson", - "##ñez", - "##rets", - "Gladstone", - "wreckage", - "Pont", - "Playboy", - "reluctance", - "##ná", - "apprenticeship", - "preferring", - "Value", - "originate", - "##wei", - "##olio", - "Alexia", - "##rog", - "Parachute", - "jammed", - "stud", - "Eton", - "vols", - "##ganized", - "1745", - "straining", - "creep", - "indicators", - "##mán", - "humiliation", - "hinted", - "alma", - "tanker", - "##egation", - "Haynes", - "Penang", - "amazement", - "branched", - "rumble", - "##ddington", - "archaeologists", - "paranoid", - "expenditure", - "Absolutely", - "Musicians", - "banished", - "##fining", - "baptism", - "Joker", - "Persons", - "hemisphere", - "##tieth", - "##ück", - "flock", - "##xing", - "lbs", - "Kung", - "crab", - "##dak", - "##tinent", - "Regulations", - "barrage", - "parcel", - "##ós", - "Tanaka", - "##rsa", - "Natalia", - "Voyage", - "flaws", - "stepfather", - "##aven", - "##eological", - "Botanical", - "Minsk", - "##ckers", - "Cinderella", - "Feast", - "Loving", - "Previous", - "Shark", - "##took", - "barrister", - "collaborators", - "##nnes", - "Croydon", - "Graeme", - "Juniors", - "##7th", - "##formation", - "##ulos", - "##ák", - "£2", - "##hwa", - "##rove", - "##ș", - "Whig", - "demeanor", - "Otago", - "##TH", - "##ooster", - "Faber", - "instructors", - "##ahl", - "##bha", - "emptied", - "##schen", - "saga", - "##lora", - "exploding", - "##rges", - "Crusaders", - "##caster", - "##uations", - "streaks", - "CBN", - "bows", - "insights", - "ka", - "1650", - "diversion", - "LSU", - "Wingspan", - "##liva", - "Response", - "sanity", - "Producers", - "imitation", - "##fine", - "Lange", - "Spokane", - "splash", - "weed", - "Siberian", - "magnet", - "##rocodile", - "capitals", - "##rgus", - "swelled", - "Rani", - "Bells", - "Silesia", - "arithmetic", - "rumor", - "##hampton", - "favors", - "Weird", - "marketplace", - "##orm", - "tsunami", - "unpredictable", - "##citation", - "##ferno", - "Tradition", - "postwar", - "stench", - "succeeds", - "##roup", - "Anya", - "Users", - "oversized", - "totaling", - "pouch", - "##nat", - "Tripoli", - "leverage", - "satin", - "##cline", - "Bathurst", - "Lund", - "Niall", - "thereof", - "##quid", - "Bangor", - "barge", - "Animated", - "##53", - "##alan", - "Ballard", - "utilizes", - "Done", - "ballistic", - "NDP", - "gatherings", - "##elin", - "##vening", - "Rockets", - "Sabrina", - "Tamara", - "Tribal", - "WTA", - "##citing", - "blinded", - "flux", - "Khalid", - "Una", - "prescription", - "##jee", - "Parents", - "##otics", - "##food", - "Silicon", - "cured", - "electro", - "perpendicular", - "intimacy", - "##rified", - "Lots", - "##ceiving", - "##powder", - "incentives", - "McKenna", - "##arma", - "##ounced", - "##rinkled", - "Alzheimer", - "##tarian", - "262", - "Seas", - "##cam", - "Novi", - "##hout", - "##morphic", - "##hazar", - "##hul", - "##nington", - "Huron", - "Bahadur", - "Pirate", - "pursed", - "Griffiths", - "indicted", - "swap", - "refrain", - "##mulating", - "Lal", - "stomped", - "##Pad", - "##mamoto", - "Reef", - "disposed", - "plastered", - "weeping", - "##rato", - "Minas", - "hourly", - "tumors", - "##ruising", - "Lyle", - "##yper", - "##sol", - "Odisha", - "credibility", - "##Dowell", - "Braun", - "Graphic", - "lurched", - "muster", - "##nex", - "##ührer", - "##connected", - "##iek", - "##ruba", - "Carthage", - "Peck", - "maple", - "bursting", - "##lava", - "Enrico", - "rite", - "##jak", - "Moment", - "##skar", - "Styx", - "poking", - "Spartan", - "##urney", - "Hepburn", - "Mart", - "Titanic", - "newsletter", - "waits", - "Mecklenburg", - "agitated", - "eats", - "##dious", - "Chow", - "matrices", - "Maud", - "##sexual", - "sermon", - "234", - "##sible", - "##lung", - "Qi", - "cemeteries", - "mined", - "sprinter", - "##ckett", - "coward", - "##gable", - "##hell", - "##thin", - "##FB", - "Contact", - "##hay", - "rainforest", - "238", - "Hemisphere", - "boasts", - "##nders", - "##verance", - "##kat", - "Convent", - "Dunedin", - "Lecturer", - "lyricist", - "##bject", - "Iberian", - "comune", - "##pphire", - "chunk", - "##boo", - "thrusting", - "fore", - "informing", - "pistols", - "echoes", - "Tier", - "battleships", - "substitution", - "##belt", - "moniker", - "##charya", - "##lland", - "Thoroughbred", - "38th", - "##01", - "##tah", - "parting", - "tongues", - "Cale", - "##seau", - "Unionist", - "modular", - "celebrates", - "preview", - "steamed", - "Bismarck", - "302", - "737", - "vamp", - "##finity", - "##nbridge", - "weaknesses", - "husky", - "##berman", - "absently", - "##icide", - "Craven", - "tailored", - "Tokugawa", - "VIP", - "syntax", - "Kazan", - "captives", - "doses", - "filtered", - "overview", - "Cleopatra", - "Conversely", - "stallion", - "Burger", - "Suez", - "Raoul", - "th", - "##reaves", - "Dickson", - "Nell", - "Rate", - "anal", - "colder", - "##sław", - "Arm", - "Semitic", - "##green", - "reflective", - "1100", - "episcopal", - "journeys", - "##ours", - "##pository", - "##dering", - "residue", - "Gunn", - "##27", - "##ntial", - "##crates", - "##zig", - "Astros", - "Renee", - "Emerald", - "##vili", - "connectivity", - "undrafted", - "Sampson", - "treasures", - "##kura", - "##theon", - "##vern", - "Destroyer", - "##iable", - "##ener", - "Frederic", - "briefcase", - "confinement", - "Bree", - "##WD", - "Athena", - "233", - "Padres", - "Thom", - "speeding", - "##hali", - "Dental", - "ducks", - "Putin", - "##rcle", - "##lou", - "Asylum", - "##usk", - "dusk", - "pasture", - "Institutes", - "ONE", - "jack", - "##named", - "diplomacy", - "Intercontinental", - "Leagues", - "Towns", - "comedic", - "premature", - "##edic", - "##mona", - "##ories", - "trimmed", - "Charge", - "Cream", - "guarantees", - "Dmitry", - "splashed", - "Philosophical", - "tramway", - "##cape", - "Maynard", - "predatory", - "redundant", - "##gratory", - "##wry", - "sobs", - "Burgundy", - "edible", - "outfits", - "Handel", - "dazed", - "dangerously", - "idle", - "Operational", - "organizes", - "##sional", - "blackish", - "broker", - "weddings", - "##halt", - "Becca", - "McGee", - "##gman", - "protagonists", - "##pelling", - "Keynes", - "aux", - "stumble", - "##ordination", - "Nokia", - "reel", - "sexes", - "##woods", - "##pheric", - "##quished", - "##voc", - "##oir", - "##pathian", - "##ptus", - "##sma", - "##tating", - "##ê", - "fulfilling", - "sheath", - "##ayne", - "Mei", - "Ordinary", - "Collin", - "Sharpe", - "grasses", - "interdisciplinary", - "##OX", - "Background", - "##ignment", - "Assault", - "transforms", - "Hamas", - "Serge", - "ratios", - "##sik", - "swaying", - "##rcia", - "Rosen", - "##gant", - "##versible", - "cinematographer", - "curly", - "penny", - "Kamal", - "Mellon", - "Sailor", - "Spence", - "phased", - "Brewers", - "amassed", - "Societies", - "##ropriations", - "##buted", - "mythological", - "##SN", - "##byss", - "##ired", - "Sovereign", - "preface", - "Parry", - "##ife", - "altitudes", - "crossings", - "##28", - "Crewe", - "southernmost", - "taut", - "McKinley", - "##owa", - "##tore", - "254", - "##ckney", - "compiling", - "Shelton", - "##hiko", - "228", - "Poll", - "Shepard", - "Labs", - "Pace", - "Carlson", - "grasping", - "##ов", - "Delaney", - "Winning", - "robotic", - "intentional", - "shattering", - "##boarding", - "##git", - "##grade", - "Editions", - "Reserves", - "ignorant", - "proposing", - "##hanna", - "cutter", - "Mongols", - "NW", - "##eux", - "Codex", - "Cristina", - "Daughters", - "Rees", - "forecast", - "##hita", - "NGOs", - "Stations", - "Beaux", - "Erwin", - "##jected", - "##EX", - "##trom", - "Schumacher", - "##hrill", - "##rophe", - "Maharaja", - "Oricon", - "##sul", - "##dynamic", - "##fighting", - "Ce", - "Ingrid", - "rumbled", - "Prospect", - "stairwell", - "Barnard", - "applause", - "complementary", - "##uba", - "grunt", - "##mented", - "Bloc", - "Carleton", - "loft", - "noisy", - "##hey", - "490", - "contrasted", - "##inator", - "##rief", - "##centric", - "##fica", - "Cantonese", - "Blanc", - "Lausanne", - "License", - "artifact", - "##ddin", - "rot", - "Amongst", - "Prakash", - "RF", - "##topia", - "milestone", - "##vard", - "Winters", - "Mead", - "churchyard", - "Lulu", - "estuary", - "##ind", - "Cha", - "Infinity", - "Meadow", - "subsidies", - "##valent", - "CONCACAF", - "Ching", - "medicinal", - "navigate", - "Carver", - "Twice", - "abdominal", - "regulating", - "RB", - "toilets", - "Brewer", - "weakening", - "ambushed", - "##aut", - "##vignon", - "Lansing", - "unacceptable", - "reliance", - "stabbing", - "##mpo", - "##naire", - "Interview", - "##ested", - "##imed", - "bearings", - "##lts", - "Rashid", - "##iation", - "authenticity", - "vigorous", - "##frey", - "##uel", - "biologist", - "NFC", - "##rmaid", - "##wash", - "Makes", - "##aunt", - "##steries", - "withdrawing", - "##qa", - "Buccaneers", - "bleed", - "inclination", - "stain", - "##ilo", - "##ppel", - "Torre", - "privileged", - "cereal", - "trailers", - "alumnus", - "neon", - "Cochrane", - "Mariana", - "caress", - "##47", - "##ients", - "experimentation", - "Window", - "convict", - "signaled", - "##YP", - "rower", - "Pharmacy", - "interacting", - "241", - "Strings", - "dominating", - "kinase", - "Dinamo", - "Wire", - "pains", - "sensations", - "##suse", - "Twenty20", - "##39", - "spotlight", - "##hend", - "elemental", - "##pura", - "Jameson", - "Swindon", - "honoring", - "pained", - "##ediatric", - "##lux", - "Psychological", - "assemblies", - "ingredient", - "Martial", - "Penguins", - "beverage", - "Monitor", - "mysteries", - "##ION", - "emigration", - "mused", - "##sique", - "crore", - "AMC", - "Funding", - "Chinatown", - "Establishment", - "Finalist", - "enjoyable", - "1756", - "##mada", - "##rams", - "NO", - "newborn", - "CS", - "comprehend", - "Invisible", - "Siemens", - "##acon", - "246", - "contraction", - "##volving", - "##moration", - "##rok", - "montane", - "##ntation", - "Galloway", - "##llow", - "Verity", - "directorial", - "pearl", - "Leaning", - "##rase", - "Fernandez", - "swallowing", - "Automatic", - "Madness", - "haunting", - "paddle", - "##UE", - "##rrows", - "##vies", - "##zuki", - "##bolt", - "##iber", - "Fender", - "emails", - "paste", - "##lancing", - "hind", - "homestead", - "hopeless", - "##dles", - "Rockies", - "garlic", - "fatty", - "shrieked", - "##ismic", - "Gillian", - "Inquiry", - "Schultz", - "XML", - "##cius", - "##uld", - "Domesday", - "grenades", - "northernmost", - "##igi", - "Tbilisi", - "optimistic", - "##poon", - "Refuge", - "stacks", - "Bose", - "smash", - "surreal", - "Nah", - "Straits", - "Conquest", - "##roo", - "##weet", - "##kell", - "Gladys", - "CH", - "##lim", - "##vitation", - "Doctorate", - "NRHP", - "knocks", - "Bey", - "Romano", - "##pile", - "242", - "Diamonds", - "strides", - "eclectic", - "Betsy", - "clade", - "##hady", - "##leashed", - "dissolve", - "moss", - "Suburban", - "silvery", - "##bria", - "tally", - "turtles", - "##uctive", - "finely", - "industrialist", - "##nary", - "Ernesto", - "oz", - "pact", - "loneliness", - "##hov", - "Tomb", - "multinational", - "risked", - "Layne", - "USL", - "ne", - "##quiries", - "Ad", - "Message", - "Kamen", - "Kristen", - "reefs", - "implements", - "##itative", - "educators", - "garments", - "gunshot", - "##essed", - "##rve", - "Montevideo", - "vigorously", - "Stamford", - "assemble", - "packaged", - "##same", - "état", - "Viva", - "paragraph", - "##eter", - "##wire", - "Stick", - "Navajo", - "MCA", - "##pressing", - "ensembles", - "ABA", - "##zor", - "##llus", - "Partner", - "raked", - "##BI", - "Iona", - "thump", - "Celeste", - "Kiran", - "##iscovered", - "##rith", - "inflammation", - "##arel", - "Features", - "loosened", - "##yclic", - "Deluxe", - "Speak", - "economical", - "Frankenstein", - "Picasso", - "showcased", - "##zad", - "##eira", - "##planes", - "##linear", - "##overs", - "monsoon", - "prosecutors", - "slack", - "Horses", - "##urers", - "Angry", - "coughing", - "##truder", - "Questions", - "##tō", - "##zak", - "challenger", - "clocks", - "##ieving", - "Newmarket", - "##acle", - "cursing", - "stimuli", - "##mming", - "##qualified", - "slapping", - "##vasive", - "narration", - "##kini", - "Advertising", - "CSI", - "alliances", - "mixes", - "##yes", - "covert", - "amalgamation", - "reproduced", - "##ardt", - "##gis", - "1648", - "id", - "Annette", - "Boots", - "Champagne", - "Brest", - "Daryl", - "##emon", - "##jou", - "##llers", - "Mean", - "adaptive", - "technicians", - "##pair", - "##usal", - "Yoga", - "fronts", - "leaping", - "Jul", - "harvesting", - "keel", - "##44", - "petitioned", - "##lved", - "yells", - "Endowment", - "proponent", - "##spur", - "##tised", - "##zal", - "Homes", - "Includes", - "##ifer", - "##oodoo", - "##rvette", - "awarding", - "mirrored", - "ransom", - "Flute", - "outlook", - "##ganj", - "DVDs", - "Sufi", - "frontman", - "Goddard", - "barren", - "##astic", - "Suicide", - "hillside", - "Harlow", - "Lau", - "notions", - "Amnesty", - "Homestead", - "##irt", - "GE", - "hooded", - "umpire", - "mustered", - "Catch", - "Masonic", - "##erd", - "Dynamics", - "Equity", - "Oro", - "Charts", - "Mussolini", - "populace", - "muted", - "accompaniment", - "##lour", - "##ndes", - "ignited", - "##iferous", - "##laced", - "##atch", - "anguish", - "registry", - "##tub", - "##hards", - "##neer", - "251", - "Hooker", - "uncomfortably", - "##6th", - "##ivers", - "Catalina", - "MiG", - "giggling", - "1754", - "Dietrich", - "Kaladin", - "pricing", - "##quence", - "Sabah", - "##lving", - "##nical", - "Gettysburg", - "Vita", - "Telecom", - "Worst", - "Palais", - "Pentagon", - "##brand", - "##chichte", - "Graf", - "unnatural", - "1715", - "bio", - "##26", - "Radcliffe", - "##utt", - "chatting", - "spices", - "##aus", - "untouched", - "##eper", - "Doll", - "turkey", - "Syndicate", - "##rlene", - "##JP", - "##roots", - "Como", - "clashed", - "modernization", - "1757", - "fantasies", - "##iating", - "dissipated", - "Sicilian", - "inspect", - "sensible", - "reputed", - "##final", - "Milford", - "poised", - "RC", - "metabolic", - "Tobacco", - "Mecca", - "optimization", - "##heat", - "lobe", - "rabbits", - "NAS", - "geologist", - "##liner", - "Kilda", - "carpenter", - "nationalists", - "##brae", - "summarized", - "##venge", - "Designer", - "misleading", - "beamed", - "##meyer", - "Matrix", - "excuses", - "##aines", - "##biology", - "401", - "Moose", - "drafting", - "Sai", - "##ggle", - "Comprehensive", - "dripped", - "skate", - "##WI", - "##enan", - "##ruk", - "narrower", - "outgoing", - "##enter", - "##nounce", - "overseen", - "##structure", - "travellers", - "banging", - "scarred", - "##thing", - "##arra", - "Ebert", - "Sometime", - "##nated", - "BAFTA", - "Hurricanes", - "configurations", - "##MLL", - "immortality", - "##heus", - "gothic", - "##mpest", - "clergyman", - "viewpoint", - "Maxim", - "Instituto", - "emitted", - "quantitative", - "1689", - "Consortium", - "##rsk", - "Meat", - "Tao", - "swimmers", - "Shaking", - "Terence", - "mainline", - "##linity", - "Quantum", - "##rogate", - "Nair", - "banquet", - "39th", - "reprised", - "lagoon", - "subdivisions", - "synonymous", - "incurred", - "password", - "sprung", - "##vere", - "Credits", - "Petersen", - "Faces", - "##vu", - "statesman", - "Zombie", - "gesturing", - "##going", - "Sergey", - "dormant", - "possessive", - "totals", - "southward", - "Ángel", - "##odies", - "HM", - "Mariano", - "Ramirez", - "Wicked", - "impressions", - "##Net", - "##cap", - "##ème", - "Transformers", - "Poker", - "RIAA", - "Redesignated", - "##chuk", - "Harcourt", - "Peña", - "spacious", - "tinged", - "alternatively", - "narrowing", - "Brigham", - "authorization", - "Membership", - "Zeppelin", - "##amed", - "Handball", - "steer", - "##orium", - "##rnal", - "##rops", - "Committees", - "endings", - "##MM", - "##yung", - "ejected", - "grams", - "##relli", - "Birch", - "Hilary", - "Stadion", - "orphan", - "clawed", - "##kner", - "Motown", - "Wilkins", - "ballads", - "outspoken", - "##ancipation", - "##bankment", - "##cheng", - "Advances", - "harvested", - "novelty", - "ineligible", - "oversees", - "##´s", - "obeyed", - "inevitably", - "Kingdoms", - "burying", - "Fabian", - "relevance", - "Tatiana", - "##MCA", - "sarcastic", - "##onda", - "Akron", - "229", - "sandwiches", - "Adobe", - "Maddox", - "##azar", - "Hunting", - "##onized", - "Smiling", - "##tology", - "Juventus", - "Leroy", - "Poets", - "attach", - "lo", - "##rly", - "##film", - "Structure", - "##igate", - "olds", - "projections", - "SMS", - "outnumbered", - "##tase", - "judiciary", - "paramilitary", - "playfully", - "##rsing", - "##tras", - "Chico", - "Vin", - "informally", - "abandonment", - "##russ", - "Baroness", - "injuring", - "octagonal", - "deciduous", - "##nea", - "##olm", - "Hz", - "Norwood", - "poses", - "Marissa", - "alerted", - "willed", - "##KS", - "Dino", - "##ddler", - "##vani", - "Barbie", - "Thankfully", - "625", - "bicycles", - "shimmering", - "##tinuum", - "##wolf", - "Chesterfield", - "##idy", - "##urgency", - "Knowles", - "sweetly", - "Ventures", - "##ponents", - "##valence", - "Darryl", - "Powerplant", - "RAAF", - "##pec", - "Kingsley", - "Parramatta", - "penetrating", - "spectacle", - "##inia", - "Marlborough", - "residual", - "compatibility", - "hike", - "Underwood", - "depleted", - "ministries", - "##odus", - "##ropriation", - "rotting", - "Faso", - "##inn", - "Happiness", - "Lille", - "Suns", - "cookie", - "rift", - "warmly", - "##lvin", - "Bugs", - "Gotham", - "Gothenburg", - "Properties", - "##seller", - "##ubi", - "Created", - "MAC", - "Noelle", - "Requiem", - "Ulysses", - "##ails", - "franchises", - "##icious", - "##rwick", - "celestial", - "kinetic", - "720", - "STS", - "transmissions", - "amplitude", - "forums", - "freeing", - "reptiles", - "tumbling", - "##continent", - "##rising", - "##tropy", - "physiology", - "##uster", - "Loves", - "bodied", - "neutrality", - "Neumann", - "assessments", - "Vicky", - "##hom", - "hampered", - "##uku", - "Custom", - "timed", - "##eville", - "##xious", - "elastic", - "##section", - "rig", - "stilled", - "shipment", - "243", - "artworks", - "boulders", - "Bournemouth", - "##hly", - "##LF", - "##linary", - "rumored", - "##bino", - "##drum", - "Chun", - "Freiburg", - "##dges", - "Equality", - "252", - "Guadalajara", - "##sors", - "##taire", - "Roach", - "cramped", - "##ultural", - "Logistics", - "Punch", - "fines", - "Lai", - "caravan", - "##55", - "lame", - "Collector", - "pausing", - "315", - "migrant", - "hawk", - "signalling", - "##erham", - "##oughs", - "Demons", - "surfing", - "Rana", - "insisting", - "Wien", - "adolescent", - "##jong", - "##rera", - "##umba", - "Regis", - "brushes", - "##iman", - "residues", - "storytelling", - "Consider", - "contrasting", - "regeneration", - "##elling", - "##hlete", - "afforded", - "reactors", - "costing", - "##biotics", - "##gat", - "##евич", - "chanting", - "secondly", - "confesses", - "##ikos", - "##uang", - "##ronological", - "##−", - "Giacomo", - "##eca", - "vaudeville", - "weeds", - "rejecting", - "revoked", - "affluent", - "fullback", - "progresses", - "geologic", - "proprietor", - "replication", - "gliding", - "recounted", - "##bah", - "##igma", - "Flow", - "ii", - "newcomer", - "##lasp", - "##miya", - "Candace", - "fractured", - "interiors", - "confidential", - "Inverness", - "footing", - "##robe", - "Coordinator", - "Westphalia", - "jumper", - "##chism", - "dormitory", - "##gno", - "281", - "acknowledging", - "leveled", - "##éra", - "Algiers", - "migrate", - "Frog", - "Rare", - "##iovascular", - "##urous", - "DSO", - "nomadic", - "##iera", - "woken", - "lifeless", - "##graphical", - "##ifications", - "Dot", - "Sachs", - "crow", - "nmi", - "Tacoma", - "Weight", - "mushroom", - "RS", - "conditioned", - "##zine", - "Tunisian", - "altering", - "##mizing", - "Handicap", - "Patti", - "Monsieur", - "clicking", - "gorge", - "interrupting", - "##powerment", - "drawers", - "Serra", - "##icides", - "Specialist", - "##itte", - "connector", - "worshipped", - "##ask", - "consoles", - "tags", - "##iler", - "glued", - "##zac", - "fences", - "Bratislava", - "honeymoon", - "313", - "A2", - "disposition", - "Gentleman", - "Gilmore", - "glaciers", - "##scribed", - "Calhoun", - "convergence", - "Aleppo", - "shortages", - "##43", - "##orax", - "##worm", - "##codes", - "##rmal", - "neutron", - "##ossa", - "Bloomberg", - "Salford", - "periodicals", - "##ryan", - "Slayer", - "##ynasties", - "credentials", - "##tista", - "surveyor", - "File", - "stinging", - "unnoticed", - "Medici", - "ecstasy", - "espionage", - "Jett", - "Leary", - "circulating", - "bargaining", - "concerto", - "serviced", - "37th", - "HK", - "##fueling", - "Delilah", - "Marcia", - "graded", - "##join", - "Kaplan", - "feasible", - "##nale", - "##yt", - "Burnley", - "dreadful", - "ministerial", - "Brewster", - "Judah", - "##ngled", - "##rrey", - "recycled", - "Iroquois", - "backstage", - "parchment", - "##numbered", - "Kern", - "Motorsports", - "Organizations", - "##mini", - "Seems", - "Warrington", - "Dunbar", - "Ezio", - "##eor", - "paralyzed", - "Ara", - "yeast", - "##olis", - "cheated", - "reappeared", - "banged", - "##ymph", - "##dick", - "Lyndon", - "glide", - "Mat", - "##natch", - "Hotels", - "Household", - "parasite", - "irrelevant", - "youthful", - "##smic", - "##tero", - "##anti", - "2d", - "Ignacio", - "squash", - "##nets", - "shale", - "##اد", - "Abrams", - "##oese", - "assaults", - "##dier", - "##otte", - "Swamp", - "287", - "Spurs", - "##economic", - "Fargo", - "auditioned", - "##mé", - "Haas", - "une", - "abbreviation", - "Turkic", - "##tisfaction", - "favorites", - "specials", - "##lial", - "Enlightenment", - "Burkina", - "##vir", - "Comparative", - "Lacrosse", - "elves", - "##lerical", - "##pear", - "Borders", - "controllers", - "##villa", - "excelled", - "##acher", - "##varo", - "camouflage", - "perpetual", - "##ffles", - "devoid", - "schooner", - "##bered", - "##oris", - "Gibbons", - "Lia", - "discouraged", - "sue", - "##gnition", - "Excellent", - "Layton", - "noir", - "smack", - "##ivable", - "##evity", - "##lone", - "Myra", - "weaken", - "weaponry", - "##azza", - "Shake", - "backbone", - "Certified", - "clown", - "occupational", - "caller", - "enslaved", - "soaking", - "Wexford", - "perceive", - "shortlisted", - "##pid", - "feminism", - "Bari", - "Indie", - "##avelin", - "##ldo", - "Hellenic", - "Hundreds", - "Savings", - "comedies", - "Honors", - "Mohawk", - "Told", - "coded", - "Incorporated", - "hideous", - "trusts", - "hose", - "Calais", - "Forster", - "Gabon", - "Internationale", - "AK", - "Colour", - "##UM", - "##heist", - "McGregor", - "localized", - "##tronomy", - "Darrell", - "##iara", - "squirrel", - "freaked", - "##eking", - "##manned", - "##ungen", - "radiated", - "##dua", - "commence", - "Donaldson", - "##iddle", - "MR", - "SAS", - "Tavern", - "Teenage", - "admissions", - "Instruments", - "##ilizer", - "Konrad", - "contemplated", - "##ductor", - "Jing", - "Reacher", - "recalling", - "Dhabi", - "emphasizing", - "illumination", - "##tony", - "legitimacy", - "Goethe", - "Ritter", - "McDonnell", - "Polar", - "Seconds", - "aspiring", - "derby", - "tunic", - "##rmed", - "outlines", - "Changing", - "distortion", - "##cter", - "Mechanics", - "##urly", - "##vana", - "Egg", - "Wolverine", - "Stupid", - "centralized", - "knit", - "##Ms", - "Saratoga", - "Ogden", - "storylines", - "##vres", - "lavish", - "beverages", - "##grarian", - "Kyrgyzstan", - "forcefully", - "superb", - "Elm", - "Thessaloniki", - "follower", - "Plants", - "slang", - "trajectory", - "Nowadays", - "Bengals", - "Ingram", - "perch", - "coloring", - "carvings", - "doubtful", - "##aph", - "##gratulations", - "##41", - "Curse", - "253", - "nightstand", - "Campo", - "Meiji", - "decomposition", - "##giri", - "McCormick", - "Yours", - "##amon", - "##bang", - "Texans", - "injunction", - "organise", - "periodical", - "##peculative", - "oceans", - "##aley", - "Success", - "Lehigh", - "##guin", - "1730", - "Davy", - "allowance", - "obituary", - "##tov", - "treasury", - "##wayne", - "euros", - "readiness", - "systematically", - "##stered", - "##igor", - "##xen", - "##cliff", - "##lya", - "Send", - "##umatic", - "Celtics", - "Judiciary", - "425", - "propagation", - "rebellious", - "##ims", - "##lut", - "Dal", - "##ayman", - "##cloth", - "Boise", - "pairing", - "Waltz", - "torment", - "Hatch", - "aspirations", - "diaspora", - "##hame", - "Rank", - "237", - "Including", - "Muir", - "chained", - "toxicity", - "Université", - "##aroo", - "Mathews", - "meadows", - "##bio", - "Editing", - "Khorasan", - "##them", - "##ahn", - "##bari", - "##umes", - "evacuate", - "##sium", - "gram", - "kidnap", - "pinning", - "##diation", - "##orms", - "beacon", - "organising", - "McGrath", - "##ogist", - "Qur", - "Tango", - "##ceptor", - "##rud", - "##cend", - "##cie", - "##jas", - "##sided", - "Tuscany", - "Venture", - "creations", - "exhibiting", - "##rcerer", - "##tten", - "Butcher", - "Divinity", - "Pet", - "Whitehead", - "falsely", - "perished", - "handy", - "Moines", - "cyclists", - "synthesizers", - "Mortal", - "notoriety", - "##ronic", - "Dialogue", - "expressive", - "uk", - "Nightingale", - "grimly", - "vineyards", - "Driving", - "relentless", - "compiler", - "##district", - "##tuated", - "Hades", - "medicines", - "objection", - "Answer", - "Soap", - "Chattanooga", - "##gogue", - "Haryana", - "Parties", - "Turtle", - "##ferred", - "explorers", - "stakeholders", - "##aar", - "##rbonne", - "tempered", - "conjecture", - "##tee", - "##hur", - "Reeve", - "bumper", - "stew", - "##church", - "##generate", - "##ilitating", - "##chanized", - "##elier", - "##enne", - "translucent", - "##lows", - "Publisher", - "evangelical", - "inherit", - "##rted", - "247", - "SmackDown", - "bitterness", - "lesions", - "##worked", - "mosques", - "wed", - "##lashes", - "Ng", - "Rebels", - "booking", - "##nail", - "Incident", - "Sailing", - "yo", - "confirms", - "Chaplin", - "baths", - "##kled", - "modernist", - "pulsing", - "Cicero", - "slaughtered", - "boasted", - "##losure", - "zipper", - "##hales", - "aristocracy", - "halftime", - "jolt", - "unlawful", - "Marching", - "sustaining", - "Yerevan", - "bracket", - "ram", - "Markus", - "##zef", - "butcher", - "massage", - "##quisite", - "Leisure", - "Pizza", - "collapsing", - "##lante", - "commentaries", - "scripted", - "##disciplinary", - "##sused", - "eroded", - "alleging", - "vase", - "Chichester", - "Peacock", - "commencement", - "dice", - "hotter", - "poisonous", - "executions", - "##occo", - "frost", - "fielding", - "vendor", - "Counts", - "Troops", - "maize", - "Divisional", - "analogue", - "shadowy", - "Nuevo", - "Ville", - "radiating", - "worthless", - "Adriatic", - "Buy", - "blaze", - "brutally", - "horizontally", - "longed", - "##matical", - "federally", - "Rolf", - "Root", - "exclude", - "rag", - "agitation", - "Lounge", - "astonished", - "##wirl", - "Impossible", - "transformations", - "##IVE", - "##ceded", - "##slav", - "downloaded", - "fucked", - "Egyptians", - "Welles", - "##ffington", - "U2", - "befriended", - "radios", - "##jid", - "archaic", - "compares", - "##ccelerator", - "##imated", - "##tosis", - "Hung", - "Scientists", - "Thousands", - "geographically", - "##LR", - "Macintosh", - "fluorescent", - "##ipur", - "Wehrmacht", - "##BR", - "##firmary", - "Chao", - "##ague", - "Boyer", - "##grounds", - "##hism", - "##mento", - "##taining", - "infancy", - "##cton", - "510", - "Boca", - "##loy", - "1644", - "ben", - "dong", - "stresses", - "Sweat", - "expressway", - "graders", - "ochreous", - "nets", - "Lawn", - "thirst", - "Uruguayan", - "satisfactory", - "##tracts", - "baroque", - "rusty", - "##ław", - "Shen", - "Gdańsk", - "chickens", - "##graving", - "Hodge", - "Papal", - "SAT", - "bearer", - "##ogo", - "##rger", - "merits", - "Calendar", - "Highest", - "Skills", - "##ortex", - "Roberta", - "paradigm", - "recounts", - "frigates", - "swamps", - "unitary", - "##oker", - "balloons", - "Hawthorne", - "Muse", - "spurred", - "advisors", - "reclaimed", - "stimulate", - "fibre", - "pat", - "repeal", - "##dgson", - "##iar", - "##rana", - "anthropologist", - "descends", - "flinch", - "reared", - "##chang", - "##eric", - "##lithic", - "commissioning", - "##cumenical", - "##lume", - "##rchen", - "Wolff", - "##tsky", - "Eurasian", - "Nepali", - "Nightmare", - "ZIP", - "playback", - "##latz", - "##vington", - "Warm", - "##75", - "Martina", - "Rollins", - "Saetan", - "Variations", - "sorting", - "##م", - "530", - "Joaquin", - "Ptolemy", - "thinner", - "##iator", - "##pticism", - "Cebu", - "Highlanders", - "Linden", - "Vanguard", - "##SV", - "##mor", - "##ulge", - "ISSN", - "cartridges", - "repression", - "Étienne", - "311", - "Lauderdale", - "commodities", - "null", - "##rb", - "1720", - "gearbox", - "##reator", - "Ang", - "Forgotten", - "dubious", - "##rls", - "##dicative", - "##phate", - "Groove", - "Herrera", - "##çais", - "Collections", - "Maximus", - "##published", - "Fell", - "Qualification", - "filtering", - "##tized", - "Roe", - "hazards", - "##37", - "##lative", - "##tröm", - "Guadalupe", - "Tajikistan", - "Preliminary", - "fronted", - "glands", - "##paper", - "##iche", - "##iding", - "Cairns", - "rallies", - "Location", - "seduce", - "##mple", - "BYU", - "##itic", - "##FT", - "Carmichael", - "Prentice", - "songwriters", - "forefront", - "Physicians", - "##rille", - "##zee", - "Preparatory", - "##cherous", - "UV", - "##dized", - "Navarro", - "misses", - "##nney", - "Inland", - "resisting", - "##sect", - "Hurt", - "##lino", - "galaxies", - "##raze", - "Institutions", - "devote", - "##lamp", - "##ciating", - "baron", - "##bracing", - "Hess", - "operatic", - "##CL", - "##ος", - "Chevalier", - "Guiana", - "##lattered", - "Fed", - "##cuted", - "##smo", - "Skull", - "denies", - "236", - "Waller", - "##mah", - "Sakura", - "mole", - "nominate", - "sermons", - "##bering", - "widowed", - "##röm", - "Cavendish", - "##struction", - "Nehru", - "Revelation", - "doom", - "Gala", - "baking", - "Nr", - "Yourself", - "banning", - "Individuals", - "Sykes", - "orchestrated", - "630", - "Phone", - "steered", - "620", - "specialising", - "starvation", - "##AV", - "##alet", - "##upation", - "seductive", - "##jects", - "##zure", - "Tolkien", - "Benito", - "Wizards", - "Submarine", - "dictator", - "Duo", - "Caden", - "approx", - "basins", - "##nc", - "shrink", - "##icles", - "##sponsible", - "249", - "mit", - "outpost", - "##bayashi", - "##rouse", - "##tl", - "Jana", - "Lombard", - "RBIs", - "finalized", - "humanities", - "##function", - "Honorable", - "tomato", - "##iot", - "Pie", - "tee", - "##pect", - "Beaufort", - "Ferris", - "bucks", - "##graduate", - "##ocytes", - "Directory", - "anxiously", - "##nating", - "flanks", - "##Ds", - "virtues", - "##believable", - "Grades", - "criterion", - "manufactures", - "sourced", - "##balt", - "##dance", - "##tano", - "Ying", - "##BF", - "##sett", - "adequately", - "blacksmith", - "totaled", - "trapping", - "expanse", - "Historia", - "Worker", - "Sense", - "ascending", - "housekeeper", - "##oos", - "Crafts", - "Resurrection", - "##verty", - "encryption", - "##aris", - "##vat", - "##pox", - "##runk", - "##iability", - "gazes", - "spying", - "##ths", - "helmets", - "wired", - "##zophrenia", - "Cheung", - "WR", - "downloads", - "stereotypes", - "239", - "Lucknow", - "bleak", - "Bragg", - "hauling", - "##haft", - "prohibit", - "##ermined", - "##castle", - "barony", - "##hta", - "Typhoon", - "antibodies", - "##ascism", - "Hawthorn", - "Kurdistan", - "Minority", - "Gorge", - "Herr", - "appliances", - "disrupt", - "Drugs", - "Lazarus", - "##ilia", - "##ryo", - "##tany", - "Gotta", - "Masovian", - "Roxy", - "choreographed", - "##rissa", - "turbulent", - "##listed", - "Anatomy", - "exiting", - "##det", - "##isław", - "580", - "Kaufman", - "sage", - "##apa", - "Symposium", - "##rolls", - "Kaye", - "##ptera", - "##rocław", - "jerking", - "##menclature", - "Guo", - "M1", - "resurrected", - "trophies", - "##lard", - "Gathering", - "nestled", - "serpent", - "Dow", - "reservoirs", - "Claremont", - "arbitration", - "chronicle", - "eki", - "##arded", - "##zers", - "##mmoth", - "Congregational", - "Astronomical", - "NE", - "RA", - "Robson", - "Scotch", - "modelled", - "slashed", - "##imus", - "exceeds", - "##roper", - "##utile", - "Laughing", - "vascular", - "superficial", - "##arians", - "Barclay", - "Caucasian", - "classmate", - "sibling", - "Kimberly", - "Shreveport", - "##ilde", - "##liche", - "Cheney", - "Deportivo", - "Veracruz", - "berries", - "##lase", - "Bed", - "MI", - "Anatolia", - "Mindanao", - "broadband", - "##olia", - "##arte", - "##wab", - "darts", - "##immer", - "##uze", - "believers", - "ordinance", - "violate", - "##wheel", - "##ynth", - "Alongside", - "Coupe", - "Hobbs", - "arrondissement", - "earl", - "townland", - "##dote", - "##lihood", - "##sla", - "Ghosts", - "midfield", - "pulmonary", - "##eno", - "cues", - "##gol", - "##zda", - "322", - "Siena", - "Sultanate", - "Bradshaw", - "Pieter", - "##thical", - "Raceway", - "bared", - "competence", - "##ssent", - "Bet", - "##urer", - "##ła", - "Alistair", - "Göttingen", - "appropriately", - "forge", - "##osterone", - "##ugen", - "DL", - "345", - "convoys", - "inventions", - "##resses", - "##cturnal", - "Fay", - "Integration", - "slash", - "##roats", - "Widow", - "barking", - "##fant", - "1A", - "Hooper", - "##cona", - "##runched", - "unreliable", - "##emont", - "##esign", - "##stabulary", - "##stop", - "Journalists", - "bony", - "##iba", - "##trata", - "##ège", - "horrific", - "##bish", - "Jocelyn", - "##rmon", - "##apon", - "##cier", - "trainers", - "##ulatory", - "1753", - "BR", - "corpus", - "synthesized", - "##bidden", - "##rafford", - "Elgin", - "##entry", - "Doherty", - "clockwise", - "##played", - "spins", - "##ample", - "##bley", - "Cope", - "constructions", - "seater", - "warlord", - "Voyager", - "documenting", - "fairies", - "##viator", - "Lviv", - "jewellery", - "suites", - "##gold", - "Maia", - "NME", - "##eavor", - "##kus", - "Eugène", - "furnishings", - "##risto", - "MCC", - "Metropolis", - "Older", - "Telangana", - "##mpus", - "amplifier", - "supervising", - "1710", - "buffalo", - "cushion", - "terminating", - "##powering", - "steak", - "Quickly", - "contracting", - "dem", - "sarcastically", - "Elsa", - "##hein", - "bastards", - "narratives", - "Takes", - "304", - "composure", - "typing", - "variance", - "##ifice", - "Softball", - "##rations", - "McLaughlin", - "gaped", - "shrines", - "##hogany", - "Glamorgan", - "##icle", - "##nai", - "##ntin", - "Fleetwood", - "Woodland", - "##uxe", - "fictitious", - "shrugs", - "##iper", - "BWV", - "conform", - "##uckled", - "Launch", - "##ductory", - "##mized", - "Tad", - "##stituted", - "##free", - "Bel", - "Chávez", - "messing", - "quartz", - "##iculate", - "##folia", - "##lynn", - "ushered", - "##29", - "##ailing", - "dictated", - "Pony", - "##opsis", - "precinct", - "802", - "Plastic", - "##ughter", - "##uno", - "##porated", - "Denton", - "Matters", - "SPD", - "hating", - "##rogen", - "Essential", - "Deck", - "Dortmund", - "obscured", - "##maging", - "Earle", - "##bred", - "##ittle", - "##ropolis", - "saturated", - "##fiction", - "##ression", - "Pereira", - "Vinci", - "mute", - "warehouses", - "##ún", - "biographies", - "##icking", - "sealing", - "##dered", - "executing", - "pendant", - "##wives", - "murmurs", - "##oko", - "substrates", - "symmetrical", - "Susie", - "##mare", - "Yusuf", - "analogy", - "##urage", - "Lesley", - "limitation", - "##rby", - "##ío", - "disagreements", - "##mise", - "embroidered", - "nape", - "unarmed", - "Sumner", - "Stores", - "dwell", - "Wilcox", - "creditors", - "##rivatization", - "##shes", - "##amia", - "directs", - "recaptured", - "scouting", - "McGuire", - "cradle", - "##onnell", - "Sato", - "insulin", - "mercenary", - "tolerant", - "Macquarie", - "transitions", - "cradled", - "##berto", - "##ivism", - "##yotes", - "FF", - "Ke", - "Reach", - "##dbury", - "680", - "##bill", - "##oja", - "##sui", - "prairie", - "##ogan", - "reactive", - "##icient", - "##rits", - "Cyclone", - "Sirius", - "Survival", - "Pak", - "##coach", - "##trar", - "halves", - "Agatha", - "Opus", - "contrasts", - "##jection", - "ominous", - "##iden", - "Baylor", - "Woodrow", - "duct", - "fortification", - "intercourse", - "##rois", - "Colbert", - "envy", - "##isi", - "Afterward", - "geared", - "##flections", - "accelerate", - "##lenching", - "Witness", - "##rrer", - "Angelina", - "Material", - "assertion", - "misconduct", - "Nix", - "cringed", - "tingling", - "##eti", - "##gned", - "Everest", - "disturb", - "sturdy", - "##keepers", - "##vied", - "Profile", - "heavenly", - "##kova", - "##victed", - "translating", - "##sses", - "316", - "Invitational", - "Mention", - "martyr", - "##uristic", - "Barron", - "hardness", - "Nakamura", - "405", - "Genevieve", - "reflections", - "##falls", - "jurist", - "##LT", - "Pyramid", - "##yme", - "Shoot", - "heck", - "linguist", - "##tower", - "Ives", - "superiors", - "##leo", - "Achilles", - "##phological", - "Christophe", - "Padma", - "precedence", - "grassy", - "Oral", - "resurrection", - "##itting", - "clumsy", - "##lten", - "##rue", - "huts", - "##stars", - "Equal", - "##queduct", - "Devin", - "Gaga", - "diocesan", - "##plating", - "##upe", - "##graphers", - "Patch", - "Scream", - "hail", - "moaning", - "tracts", - "##hdi", - "Examination", - "outsider", - "##ergic", - "##oter", - "Archipelago", - "Havilland", - "greenish", - "tilting", - "Aleksandr", - "Konstantin", - "warship", - "##emann", - "##gelist", - "##ought", - "billionaire", - "##blivion", - "321", - "Hungarians", - "transplant", - "##jured", - "##fters", - "Corbin", - "autism", - "pitchers", - "Garner", - "thence", - "Scientology", - "transitioned", - "integrating", - "repetitive", - "##dant", - "Rene", - "vomit", - "##burne", - "1661", - "Researchers", - "Wallis", - "insulted", - "wavy", - "##wati", - "Ewing", - "excitedly", - "##kor", - "frescoes", - "injustice", - "##achal", - "##lumber", - "##úl", - "novella", - "##sca", - "Liv", - "##enstein", - "##river", - "monstrous", - "topping", - "downfall", - "looming", - "sinks", - "trillion", - "##pont", - "Effect", - "##phi", - "##urley", - "Sites", - "catchment", - "##H1", - "Hopper", - "##raiser", - "1642", - "Maccabi", - "lance", - "##chia", - "##sboro", - "NSA", - "branching", - "retorted", - "tensor", - "Immaculate", - "drumming", - "feeder", - "##mony", - "Dyer", - "homicide", - "Temeraire", - "fishes", - "protruding", - "skins", - "orchards", - "##nso", - "inlet", - "ventral", - "##finder", - "Asiatic", - "Sul", - "1688", - "Melinda", - "assigns", - "paranormal", - "gardening", - "Tau", - "calming", - "##inge", - "##crow", - "regimental", - "Nik", - "fastened", - "correlated", - "##gene", - "##rieve", - "Sick", - "##minster", - "##politan", - "hardwood", - "hurled", - "##ssler", - "Cinematography", - "rhyme", - "Montenegrin", - "Packard", - "debating", - "##itution", - "Helens", - "Trick", - "Museums", - "defiance", - "encompassed", - "##EE", - "##TU", - "##nees", - "##uben", - "##ünster", - "##nosis", - "435", - "Hagen", - "cinemas", - "Corbett", - "commended", - "##fines", - "##oman", - "bosses", - "ripe", - "scraping", - "##loc", - "filly", - "Saddam", - "pointless", - "Faust", - "Orléans", - "Syriac", - "##♭", - "longitude", - "##ropic", - "Alfa", - "bliss", - "gangster", - "##ckling", - "SL", - "blending", - "##eptide", - "##nner", - "bends", - "escorting", - "##bloid", - "##quis", - "burials", - "##sle", - "##è", - "Ambulance", - "insults", - "##gth", - "Antrim", - "unfolded", - "##missible", - "splendid", - "Cure", - "warily", - "Saigon", - "Waste", - "astonishment", - "boroughs", - "##VS", - "##dalgo", - "##reshing", - "##usage", - "rue", - "marital", - "versatile", - "unpaid", - "allotted", - "bacterium", - "##coil", - "##cue", - "Dorothea", - "IDF", - "##location", - "##yke", - "RPG", - "##tropical", - "devotees", - "liter", - "##pree", - "Johnstone", - "astronaut", - "attends", - "pollen", - "periphery", - "doctrines", - "meta", - "showered", - "##tyn", - "GO", - "Huh", - "laude", - "244", - "Amar", - "Christensen", - "Ping", - "Pontifical", - "Austen", - "raiding", - "realities", - "##dric", - "urges", - "##dek", - "Cambridgeshire", - "##otype", - "Cascade", - "Greenberg", - "Pact", - "##cognition", - "##aran", - "##urion", - "Riot", - "mimic", - "Eastwood", - "##imating", - "reversal", - "##blast", - "##henian", - "Pitchfork", - "##sunderstanding", - "Staten", - "WCW", - "lieu", - "##bard", - "##sang", - "experimenting", - "Aquino", - "##lums", - "TNT", - "Hannibal", - "catastrophic", - "##lsive", - "272", - "308", - "##otypic", - "41st", - "Highways", - "aggregator", - "##fluenza", - "Featured", - "Reece", - "dispatch", - "simulated", - "##BE", - "Communion", - "Vinnie", - "hardcover", - "inexpensive", - "til", - "##adores", - "groundwater", - "kicker", - "blogs", - "frenzy", - "##wala", - "dealings", - "erase", - "Anglia", - "##umour", - "Hapoel", - "Marquette", - "##raphic", - "##tives", - "consult", - "atrocities", - "concussion", - "##érard", - "Decree", - "ethanol", - "##aen", - "Rooney", - "##chemist", - "##hoot", - "1620", - "menacing", - "Schuster", - "##bearable", - "laborers", - "sultan", - "Juliana", - "erased", - "onstage", - "##ync", - "Eastman", - "##tick", - "hushed", - "##yrinth", - "Lexie", - "Wharton", - "Lev", - "##PL", - "Testing", - "Bangladeshi", - "##bba", - "##usions", - "communicated", - "integers", - "internship", - "societal", - "##odles", - "Loki", - "ET", - "Ghent", - "broadcasters", - "Unix", - "##auer", - "Kildare", - "Yamaha", - "##quencing", - "##zman", - "chilled", - "##rapped", - "##uant", - "Duval", - "sentiments", - "Oliveira", - "packets", - "Horne", - "##rient", - "Harlan", - "Mirage", - "invariant", - "##anger", - "##tensive", - "flexed", - "sweetness", - "##wson", - "alleviate", - "insulting", - "limo", - "Hahn", - "##llars", - "##hesia", - "##lapping", - "buys", - "##oaming", - "mocked", - "pursuits", - "scooted", - "##conscious", - "##ilian", - "Ballad", - "jackets", - "##kra", - "hilly", - "##cane", - "Scenic", - "McGraw", - "silhouette", - "whipping", - "##roduced", - "##wark", - "##chess", - "##rump", - "Lemon", - "calculus", - "demonic", - "##latine", - "Bharatiya", - "Govt", - "Que", - "Trilogy", - "Ducks", - "Suit", - "stairway", - "##ceipt", - "Isa", - "regulator", - "Automobile", - "flatly", - "##buster", - "##lank", - "Spartans", - "topography", - "Tavi", - "usable", - "Chartered", - "Fairchild", - "##sance", - "##vyn", - "Digest", - "nuclei", - "typhoon", - "##llon", - "Alvarez", - "DJs", - "Grimm", - "authoritative", - "firearm", - "##chschule", - "Origins", - "lair", - "unmistakable", - "##xial", - "##cribing", - "Mouth", - "##genesis", - "##shū", - "##gaon", - "##ulter", - "Jaya", - "Neck", - "##UN", - "##oing", - "##static", - "relativity", - "##mott", - "##utive", - "##esan", - "##uveau", - "BT", - "salts", - "##roa", - "Dustin", - "preoccupied", - "Novgorod", - "##asus", - "Magnum", - "tempting", - "##histling", - "##ilated", - "Musa", - "##ghty", - "Ashland", - "pubs", - "routines", - "##etto", - "Soto", - "257", - "Featuring", - "Augsburg", - "##alaya", - "Bit", - "loomed", - "expects", - "##abby", - "##ooby", - "Auschwitz", - "Pendleton", - "vodka", - "##sent", - "rescuing", - "systemic", - "##inet", - "##leg", - "Yun", - "applicant", - "revered", - "##nacht", - "##ndas", - "Muller", - "characterization", - "##patient", - "##roft", - "Carole", - "##asperated", - "Amiga", - "disconnected", - "gel", - "##cologist", - "Patriotic", - "rallied", - "assign", - "veterinary", - "installing", - "##cedural", - "258", - "Jang", - "Parisian", - "incarcerated", - "stalk", - "##iment", - "Jamal", - "McPherson", - "Palma", - "##oken", - "##viation", - "512", - "Rourke", - "irrational", - "##rippled", - "Devlin", - "erratic", - "##NI", - "##payers", - "Ni", - "engages", - "Portal", - "aesthetics", - "##rrogance", - "Milne", - "assassins", - "##rots", - "335", - "385", - "Cambodian", - "Females", - "fellows", - "si", - "##block", - "##otes", - "Jayne", - "Toro", - "flutter", - "##eera", - "Burr", - "##lanche", - "relaxation", - "##fra", - "Fitzroy", - "##undy", - "1751", - "261", - "comb", - "conglomerate", - "ribbons", - "veto", - "##Es", - "casts", - "##ege", - "1748", - "Ares", - "spears", - "spirituality", - "comet", - "##nado", - "##yeh", - "Veterinary", - "aquarium", - "yer", - "Councils", - "##oked", - "##ynamic", - "Malmö", - "remorse", - "auditions", - "drilled", - "Hoffmann", - "Moe", - "Nagoya", - "Yacht", - "##hakti", - "##race", - "##rrick", - "Talmud", - "coordinating", - "##EI", - "##bul", - "##his", - "##itors", - "##ligent", - "##uerra", - "Narayan", - "goaltender", - "taxa", - "##asures", - "Det", - "##mage", - "Infinite", - "Maid", - "bean", - "intriguing", - "##cription", - "gasps", - "socket", - "##mentary", - "##reus", - "sewing", - "transmitting", - "##different", - "##furbishment", - "##traction", - "Grimsby", - "sprawling", - "Shipyard", - "##destine", - "##hropic", - "##icked", - "trolley", - "##agi", - "##lesh", - "Josiah", - "invasions", - "Content", - "firefighters", - "intro", - "Lucifer", - "subunit", - "Sahib", - "Myrtle", - "inhibitor", - "maneuvers", - "##teca", - "Wrath", - "slippery", - "##versing", - "Shoes", - "##dial", - "##illiers", - "##luded", - "##mmal", - "##pack", - "handkerchief", - "##edestal", - "##stones", - "Fusion", - "cumulative", - "##mell", - "##cacia", - "##rudge", - "##utz", - "foe", - "storing", - "swiped", - "##meister", - "##orra", - "batter", - "strung", - "##venting", - "##kker", - "Doo", - "Taste", - "immensely", - "Fairbanks", - "Jarrett", - "Boogie", - "1746", - "mage", - "Kick", - "legislators", - "medial", - "##ilon", - "##logies", - "##ranton", - "Hybrid", - "##uters", - "Tide", - "deportation", - "Metz", - "##secration", - "##virus", - "UFO", - "##fell", - "##orage", - "##raction", - "##rrigan", - "1747", - "fabricated", - "##BM", - "##GR", - "##rter", - "muttering", - "theorist", - "##tamine", - "BMG", - "Kincaid", - "solvent", - "##azed", - "Thin", - "adorable", - "Wendell", - "ta", - "##viour", - "pulses", - "##pologies", - "counters", - "exposition", - "sewer", - "Luciano", - "Clancy", - "##angelo", - "##riars", - "Showtime", - "observes", - "frankly", - "##oppy", - "Bergman", - "lobes", - "timetable", - "##bri", - "##uest", - "FX", - "##dust", - "##genus", - "Glad", - "Helmut", - "Meridian", - "##besity", - "##ontaine", - "Revue", - "miracles", - "##titis", - "PP", - "bluff", - "syrup", - "307", - "Messiah", - "##erne", - "interfering", - "picturesque", - "unconventional", - "dipping", - "hurriedly", - "Kerman", - "248", - "Ethnic", - "Toward", - "acidic", - "Harrisburg", - "##65", - "intimidating", - "##aal", - "Jed", - "Pontiac", - "munitions", - "##nchen", - "growling", - "mausoleum", - "##ération", - "##wami", - "Cy", - "aerospace", - "caucus", - "Doing", - "##around", - "##miring", - "Cuthbert", - "##poradic", - "##rovisation", - "##wth", - "evaluating", - "##scraper", - "Belinda", - "owes", - "##sitic", - "##thermal", - "##fast", - "economists", - "##lishing", - "##uerre", - "##ân", - "credible", - "##koto", - "Fourteen", - "cones", - "##ebrates", - "bookstore", - "towels", - "##phony", - "Appearance", - "newscasts", - "##olin", - "Karin", - "Bingham", - "##elves", - "1680", - "306", - "disks", - "##lston", - "##secutor", - "Levant", - "##vout", - "Micro", - "snuck", - "##ogel", - "##racker", - "Exploration", - "drastic", - "##kening", - "Elsie", - "endowment", - "##utnant", - "Blaze", - "##rrosion", - "leaking", - "45th", - "##rug", - "##uernsey", - "760", - "Shapiro", - "cakes", - "##ehan", - "##mei", - "##ité", - "##kla", - "repetition", - "successively", - "Friendly", - "Île", - "Koreans", - "Au", - "Tirana", - "flourish", - "Spirits", - "Yao", - "reasoned", - "##leam", - "Consort", - "cater", - "marred", - "ordeal", - "supremacy", - "##ritable", - "Paisley", - "euro", - "healer", - "portico", - "wetland", - "##kman", - "restart", - "##habilitation", - "##zuka", - "##Script", - "emptiness", - "communion", - "##CF", - "##inhabited", - "##wamy", - "Casablanca", - "pulsed", - "##rrible", - "##safe", - "395", - "Dual", - "Terrorism", - "##urge", - "##found", - "##gnolia", - "Courage", - "patriarch", - "segregated", - "intrinsic", - "##liography", - "##phe", - "PD", - "convection", - "##icidal", - "Dharma", - "Jimmie", - "texted", - "constituents", - "twitch", - "##calated", - "##mitage", - "##ringing", - "415", - "milling", - "##geons", - "Armagh", - "Geometridae", - "evergreen", - "needy", - "reflex", - "template", - "##pina", - "Schubert", - "##bruck", - "##icted", - "##scher", - "##wildered", - "1749", - "Joanne", - "clearer", - "##narl", - "278", - "Print", - "automation", - "consciously", - "flashback", - "occupations", - "##ests", - "Casimir", - "differentiated", - "policing", - "repay", - "##aks", - "##gnesium", - "Evaluation", - "commotion", - "##CM", - "##smopolitan", - "Clapton", - "mitochondrial", - "Kobe", - "1752", - "Ignoring", - "Vincenzo", - "Wet", - "bandage", - "##rassed", - "##unate", - "Maris", - "##eted", - "##hetical", - "figuring", - "##eit", - "##nap", - "leopard", - "strategically", - "##reer", - "Fen", - "Iain", - "##ggins", - "##pipe", - "Matteo", - "McIntyre", - "##chord", - "##feng", - "Romani", - "asshole", - "flopped", - "reassure", - "Founding", - "Styles", - "Torino", - "patrolling", - "##erging", - "##ibrating", - "##ructural", - "sincerity", - "##ät", - "##teacher", - "Juliette", - "##cé", - "##hog", - "##idated", - "##span", - "Winfield", - "##fender", - "##nast", - "##pliant", - "1690", - "Bai", - "Je", - "Saharan", - "expands", - "Bolshevik", - "rotate", - "##root", - "Britannia", - "Severn", - "##cini", - "##gering", - "##say", - "sly", - "Steps", - "insertion", - "rooftop", - "Piece", - "cuffs", - "plausible", - "##zai", - "Provost", - "semantic", - "##data", - "##vade", - "##cimal", - "IPA", - "indictment", - "Libraries", - "flaming", - "highlands", - "liberties", - "##pio", - "Elders", - "aggressively", - "##pecific", - "Decision", - "pigeon", - "nominally", - "descriptive", - "adjustments", - "equestrian", - "heaving", - "##mour", - "##dives", - "##fty", - "##yton", - "intermittent", - "##naming", - "##sets", - "Calvert", - "Casper", - "Tarzan", - "##kot", - "Ramírez", - "##IB", - "##erus", - "Gustavo", - "Roller", - "vaulted", - "##solation", - "##formatics", - "##tip", - "Hunger", - "colloquially", - "handwriting", - "hearth", - "launcher", - "##idian", - "##ilities", - "##lind", - "##locating", - "Magdalena", - "Soo", - "clubhouse", - "##kushima", - "##ruit", - "Bogotá", - "Organic", - "Worship", - "##Vs", - "##wold", - "upbringing", - "##kick", - "groundbreaking", - "##urable", - "##ván", - "repulsed", - "##dira", - "##ditional", - "##ici", - "melancholy", - "##bodied", - "##cchi", - "404", - "concurrency", - "H₂O", - "bouts", - "##gami", - "288", - "Leto", - "troll", - "##lak", - "advising", - "bundled", - "##nden", - "lipstick", - "littered", - "##leading", - "##mogeneous", - "Experiment", - "Nikola", - "grove", - "##ogram", - "Mace", - "##jure", - "cheat", - "Annabelle", - "Tori", - "lurking", - "Emery", - "Walden", - "##riz", - "paints", - "Markets", - "brutality", - "overrun", - "##agu", - "##sat", - "din", - "ostensibly", - "Fielding", - "flees", - "##eron", - "Pound", - "ornaments", - "tornadoes", - "##nikov", - "##organisation", - "##reen", - "##Works", - "##ldred", - "##olten", - "##stillery", - "soluble", - "Mata", - "Grimes", - "Léon", - "##NF", - "coldly", - "permitting", - "##inga", - "##reaked", - "Agents", - "hostess", - "##dl", - "Dyke", - "Kota", - "avail", - "orderly", - "##saur", - "##sities", - "Arroyo", - "##ceps", - "##egro", - "Hawke", - "Noctuidae", - "html", - "seminar", - "##ggles", - "##wasaki", - "Clube", - "recited", - "##sace", - "Ascension", - "Fitness", - "dough", - "##ixel", - "Nationale", - "##solidate", - "pulpit", - "vassal", - "570", - "Annapolis", - "bladder", - "phylogenetic", - "##iname", - "convertible", - "##ppan", - "Comet", - "paler", - "##definite", - "Spot", - "##dices", - "frequented", - "Apostles", - "slalom", - "##ivision", - "##mana", - "##runcated", - "Trojan", - "##agger", - "##iq", - "##league", - "Concept", - "Controller", - "##barian", - "##curate", - "##spersed", - "##tring", - "engulfed", - "inquired", - "##hmann", - "286", - "##dict", - "##osy", - "##raw", - "MacKenzie", - "su", - "##ienced", - "##iggs", - "##quitaine", - "bisexual", - "##noon", - "runways", - "subsp", - "##!", - "##\"", - "###", - "##$", - "##%", - "##&", - "##'", - "##(", - "##)", - "##*", - "##+", - "##,", - "##-", - "##.", - "##/", - "##:", - "##;", - "##<", - "##=", - "##>", - "##?", - "##@", - "##[", - "##\\", - "##]", - "##^", - "##_", - "##`", - "##{", - "##|", - "##}", - "##~", - "##¡", - "##¢", - "##£", - "##¥", - "##§", - "##¨", - "##©", - "##ª", - "##«", - "##¬", - "##®", - "##±", - "##´", - "##µ", - "##¶", - "##·", - "##¹", - "##º", - "##»", - "##¼", - "##¾", - "##¿", - "##À", - "##Á", - "##Â", - "##Ä", - "##Å", - "##Æ", - "##Ç", - "##È", - "##É", - "##Í", - "##Î", - "##Ñ", - "##Ó", - "##Ö", - "##×", - "##Ø", - "##Ú", - "##Ü", - "##Þ", - "##â", - "##ã", - "##æ", - "##ç", - "##î", - "##ï", - "##ð", - "##ñ", - "##ô", - "##õ", - "##÷", - "##û", - "##þ", - "##ÿ", - "##Ā", - "##ą", - "##Ć", - "##Č", - "##ď", - "##Đ", - "##đ", - "##ē", - "##ė", - "##ę", - "##ě", - "##ğ", - "##ġ", - "##Ħ", - "##ħ", - "##ĩ", - "##Ī", - "##İ", - "##ļ", - "##Ľ", - "##ľ", - "##Ł", - "##ņ", - "##ň", - "##ŋ", - "##Ō", - "##ŏ", - "##ő", - "##Œ", - "##œ", - "##ř", - "##Ś", - "##ś", - "##Ş", - "##Š", - "##Ţ", - "##ţ", - "##ť", - "##ũ", - "##ŭ", - "##ů", - "##ű", - "##ų", - "##ŵ", - "##ŷ", - "##ź", - "##Ż", - "##ż", - "##Ž", - "##ž", - "##Ə", - "##ƒ", - "##ơ", - "##ư", - "##ǎ", - "##ǐ", - "##ǒ", - "##ǔ", - "##ǫ", - "##Ș", - "##Ț", - "##ț", - "##ɐ", - "##ɑ", - "##ɔ", - "##ɕ", - "##ə", - "##ɛ", - "##ɡ", - "##ɣ", - "##ɨ", - "##ɪ", - "##ɲ", - "##ɾ", - "##ʀ", - "##ʁ", - "##ʂ", - "##ʃ", - "##ʊ", - "##ʋ", - "##ʌ", - "##ʐ", - "##ʑ", - "##ʒ", - "##ʔ", - "##ʰ", - "##ʲ", - "##ʳ", - "##ʷ", - "##ʻ", - "##ʼ", - "##ʾ", - "##ʿ", - "##ˈ", - "##ː", - "##ˡ", - "##ˢ", - "##ˣ", - "##́", - "##̃", - "##̍", - "##̯", - "##͡", - "##Α", - "##Β", - "##Γ", - "##Δ", - "##Ε", - "##Η", - "##Θ", - "##Ι", - "##Κ", - "##Λ", - "##Μ", - "##Ν", - "##Ο", - "##Π", - "##Σ", - "##Τ", - "##Φ", - "##Χ", - "##Ψ", - "##Ω", - "##ά", - "##έ", - "##ή", - "##ί", - "##β", - "##γ", - "##δ", - "##ε", - "##ζ", - "##η", - "##θ", - "##ι", - "##κ", - "##λ", - "##μ", - "##ξ", - "##ο", - "##π", - "##ρ", - "##σ", - "##τ", - "##υ", - "##φ", - "##χ", - "##ψ", - "##ω", - "##ό", - "##ύ", - "##ώ", - "##І", - "##Ј", - "##А", - "##Б", - "##В", - "##Г", - "##Д", - "##Е", - "##Ж", - "##З", - "##И", - "##К", - "##Л", - "##М", - "##Н", - "##О", - "##П", - "##Р", - "##С", - "##Т", - "##У", - "##Ф", - "##Х", - "##Ц", - "##Ч", - "##Ш", - "##Э", - "##Ю", - "##Я", - "##б", - "##в", - "##г", - "##д", - "##ж", - "##з", - "##к", - "##л", - "##м", - "##п", - "##с", - "##т", - "##у", - "##ф", - "##х", - "##ц", - "##ч", - "##ш", - "##щ", - "##ъ", - "##ы", - "##ь", - "##э", - "##ю", - "##ё", - "##і", - "##ї", - "##ј", - "##њ", - "##ћ", - "##Ա", - "##Հ", - "##ա", - "##ե", - "##ի", - "##կ", - "##մ", - "##յ", - "##ն", - "##ո", - "##ս", - "##տ", - "##ր", - "##ւ", - "##ְ", - "##ִ", - "##ֵ", - "##ֶ", - "##ַ", - "##ָ", - "##ֹ", - "##ּ", - "##א", - "##ב", - "##ג", - "##ד", - "##ה", - "##ו", - "##ז", - "##ח", - "##ט", - "##י", - "##כ", - "##ל", - "##ם", - "##מ", - "##ן", - "##נ", - "##ס", - "##ע", - "##פ", - "##צ", - "##ק", - "##ר", - "##ש", - "##ת", - "##،", - "##ء", - "##آ", - "##أ", - "##إ", - "##ئ", - "##ا", - "##ب", - "##ت", - "##ث", - "##ج", - "##ح", - "##خ", - "##ذ", - "##ز", - "##س", - "##ش", - "##ص", - "##ض", - "##ط", - "##ظ", - "##ع", - "##غ", - "##ف", - "##ق", - "##ك", - "##ل", - "##و", - "##ى", - "##َ", - "##ِ", - "##ٹ", - "##پ", - "##چ", - "##ک", - "##گ", - "##ہ", - "##ی", - "##ے", - "##ं", - "##आ", - "##क", - "##ग", - "##च", - "##ज", - "##ण", - "##त", - "##द", - "##ध", - "##न", - "##प", - "##ब", - "##भ", - "##म", - "##य", - "##र", - "##ल", - "##व", - "##श", - "##ष", - "##स", - "##ह", - "##ा", - "##ि", - "##ी", - "##ु", - "##े", - "##ो", - "##्", - "##।", - "##॥", - "##আ", - "##ই", - "##এ", - "##ও", - "##ক", - "##খ", - "##গ", - "##চ", - "##ছ", - "##জ", - "##ট", - "##ত", - "##থ", - "##দ", - "##ধ", - "##ন", - "##প", - "##ব", - "##ম", - "##য", - "##র", - "##ল", - "##শ", - "##স", - "##হ", - "##়", - "##া", - "##ি", - "##ী", - "##ু", - "##ে", - "##ো", - "##্", - "##য়", - "##க", - "##த", - "##ப", - "##ம", - "##ய", - "##ர", - "##ல", - "##வ", - "##ா", - "##ி", - "##ு", - "##்", - "##ร", - "##་", - "##ག", - "##ང", - "##ད", - "##ན", - "##བ", - "##མ", - "##ར", - "##ལ", - "##ས", - "##ི", - "##ུ", - "##ེ", - "##ོ", - "##ა", - "##ე", - "##ი", - "##ლ", - "##ნ", - "##ო", - "##რ", - "##ს", - "##ᴬ", - "##ᴵ", - "##ᵀ", - "##ᵃ", - "##ᵇ", - "##ᵈ", - "##ᵉ", - "##ᵍ", - "##ᵏ", - "##ᵐ", - "##ᵒ", - "##ᵖ", - "##ᵗ", - "##ᵘ", - "##ᵣ", - "##ᵤ", - "##ᵥ", - "##ᶜ", - "##ᶠ", - "##ḍ", - "##Ḥ", - "##ḥ", - "##Ḩ", - "##ḩ", - "##ḳ", - "##ṃ", - "##ṅ", - "##ṇ", - "##ṛ", - "##ṣ", - "##ṭ", - "##ạ", - "##ả", - "##ấ", - "##ầ", - "##ẩ", - "##ậ", - "##ắ", - "##ế", - "##ề", - "##ể", - "##ễ", - "##ệ", - "##ị", - "##ọ", - "##ố", - "##ồ", - "##ổ", - "##ộ", - "##ớ", - "##ờ", - "##ợ", - "##ụ", - "##ủ", - "##ứ", - "##ừ", - "##ử", - "##ữ", - "##ự", - "##ỳ", - "##ỹ", - "##ἀ", - "##ἐ", - "##ὁ", - "##ὐ", - "##ὰ", - "##ὶ", - "##ὸ", - "##ῆ", - "##ῖ", - "##ῦ", - "##ῶ", - "##‐", - "##‑", - "##‒", - "##–", - "##—", - "##―", - "##‖", - "##‘", - "##’", - "##‚", - "##“", - "##”", - "##„", - "##†", - "##‡", - "##•", - "##…", - "##‰", - "##′", - "##″", - "##⁄", - "##⁰", - "##ⁱ", - "##⁴", - "##⁵", - "##⁶", - "##⁷", - "##⁸", - "##⁹", - "##⁻", - "##ⁿ", - "##₅", - "##₆", - "##₇", - "##₈", - "##₉", - "##₊", - "##₍", - "##₎", - "##ₐ", - "##ₑ", - "##ₒ", - "##ₓ", - "##ₕ", - "##ₖ", - "##ₘ", - "##ₚ", - "##ₛ", - "##ₜ", - "##₤", - "##€", - "##₱", - "##₹", - "##ℓ", - "##№", - "##ℝ", - "##⅓", - "##←", - "##↑", - "##→", - "##↔", - "##⇌", - "##⇒", - "##∂", - "##∈", - "##∗", - "##∘", - "##√", - "##∞", - "##∧", - "##∨", - "##∩", - "##∪", - "##≈", - "##≠", - "##≡", - "##≤", - "##≥", - "##⊂", - "##⊆", - "##⊕", - "##⋅", - "##─", - "##│", - "##■", - "##●", - "##★", - "##☆", - "##☉", - "##♠", - "##♣", - "##♥", - "##♦", - "##♯", - "##⟨", - "##⟩", - "##ⱼ", - "##、", - "##。", - "##《", - "##》", - "##「", - "##」", - "##『", - "##』", - "##〜", - "##い", - "##う", - "##え", - "##お", - "##か", - "##き", - "##く", - "##け", - "##こ", - "##さ", - "##し", - "##す", - "##せ", - "##そ", - "##た", - "##ち", - "##つ", - "##て", - "##と", - "##な", - "##に", - "##の", - "##は", - "##ひ", - "##ま", - "##み", - "##む", - "##め", - "##も", - "##や", - "##ゆ", - "##よ", - "##ら", - "##り", - "##る", - "##れ", - "##ん", - "##ア", - "##ィ", - "##イ", - "##ウ", - "##エ", - "##オ", - "##カ", - "##ガ", - "##キ", - "##ク", - "##グ", - "##コ", - "##サ", - "##シ", - "##ジ", - "##ス", - "##ズ", - "##タ", - "##ダ", - "##ッ", - "##テ", - "##デ", - "##ト", - "##ド", - "##ナ", - "##ニ", - "##ハ", - "##バ", - "##パ", - "##フ", - "##ブ", - "##プ", - "##マ", - "##ミ", - "##ム", - "##ャ", - "##ュ", - "##ラ", - "##リ", - "##ル", - "##レ", - "##ロ", - "##ン", - "##・", - "##ー", - "##一", - "##三", - "##上", - "##下", - "##中", - "##事", - "##二", - "##井", - "##京", - "##人", - "##亻", - "##仁", - "##佐", - "##侍", - "##光", - "##公", - "##力", - "##北", - "##十", - "##南", - "##原", - "##口", - "##史", - "##司", - "##吉", - "##同", - "##和", - "##囗", - "##国", - "##國", - "##土", - "##城", - "##士", - "##大", - "##天", - "##太", - "##夫", - "##女", - "##子", - "##宀", - "##安", - "##宮", - "##宿", - "##小", - "##尚", - "##山", - "##島", - "##川", - "##州", - "##平", - "##年", - "##心", - "##愛", - "##戸", - "##文", - "##新", - "##方", - "##日", - "##明", - "##星", - "##書", - "##月", - "##木", - "##本", - "##李", - "##村", - "##東", - "##松", - "##林", - "##正", - "##武", - "##氏", - "##水", - "##氵", - "##江", - "##河", - "##海", - "##版", - "##犬", - "##王", - "##生", - "##田", - "##白", - "##皇", - "##省", - "##真", - "##石", - "##社", - "##神", - "##竹", - "##美", - "##義", - "##花", - "##藤", - "##西", - "##谷", - "##車", - "##辶", - "##道", - "##郎", - "##郡", - "##部", - "##野", - "##金", - "##長", - "##門", - "##陽", - "##青", - "##食", - "##馬", - "##高", - "##龍", - "##龸", - "##사", - "##씨", - "##의", - "##이", - "##한", - "##fi", - "##fl", - "##!", - "##(", - "##)", - "##,", - "##-", - "##/", - "##:" - ] -} diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java index 8ea617edbf279..6d62c6a67005d 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java @@ -7,19 +7,10 @@ package org.elasticsearch.xpack.ml.inference.nlp.tokenizers; -import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.common.xcontent.DeprecationHandler; -import org.elasticsearch.common.xcontent.NamedXContentRegistry; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.test.ESTestCase; -import java.io.IOException; -import java.net.URL; import java.util.Arrays; import java.util.Collections; -import java.util.List; -import java.util.Map; import static org.hamcrest.Matchers.contains; @@ -43,16 +34,7 @@ public void testTokenizeAppendSpecialTokens() { assertArrayEquals(new int[] {3, 0, 1, 2, 4}, tokenization.getTokenIds()); assertArrayEquals(new int[] {-1, 0, 0, 1, -1}, tokenization.getTokenMap()); } - - public void testBertVocab() throws IOException { - BertTokenizer tokenizer = BertTokenizer.builder(loadVocab()).setDoLowerCase(false).build(); - - BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Jim bought 300 shares of Acme Corp. in 2006", true); - - assertArrayEquals(new int[] {101, 3104, 3306, 3127, 6117, 1104, 138, 1665, 3263, 13619, 119, 1107, 1386, 102}, - tokenization.getTokenIds()); - } - + public void testNeverSplitTokens() { final String specialToken = "SP001"; @@ -92,26 +74,4 @@ public void testDoLowerCase() { assertThat(tokenization.getTokens(), contains("elastic", "##search", "fun")); } } - - @SuppressWarnings("unchecked") - private List<String> loadVocab() throws IOException { - - String path = "/org/elasticsearch/xpack/core/ml/inference/pipeline_config.json"; - URL resource = getClass().getResource(path); - if (resource == null) { - throw new ElasticsearchException("Could not find resource stored at [" + path + "]"); - } - try(XContentParser parser = - XContentType.JSON.xContent().createParser( - NamedXContentRegistry.EMPTY, - DeprecationHandler.THROW_UNSUPPORTED_OPERATION, - getClass().getResourceAsStream(path))) { - - Map<String, Object> map = parser.map(); - assertNotNull(map.get("task_type")); - assertNotNull(map.get("vocab")); - - return (List<String>)map.get("vocab"); - } - } } From 4b267209ebed1cda47b76ea19eb5c1a6a1324b2c Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Wed, 26 May 2021 10:18:46 +0100 Subject: [PATCH 12/21] Use a common BERT request builder --- .../ml/inference/nlp/BertRequestBuilder.java | 64 +++++++++++++++++ .../ml/inference/nlp/FillMaskProcessor.java | 72 +++++++++---------- .../nlp/FillMaskResultProcessor.java | 51 ------------- .../xpack/ml/inference/nlp/NerProcessor.java | 40 ++--------- .../xpack/ml/inference/nlp/NlpTask.java | 14 +--- .../nlp/BertRequestBuilderTests.java | 41 +++++++++++ .../ml/inference/nlp/NerProcessorTests.java | 27 ------- .../nlp/tokenizers/BertTokenizerTests.java | 2 +- 8 files changed, 148 insertions(+), 163 deletions(-) create mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/BertRequestBuilder.java delete mode 100644 x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskResultProcessor.java create mode 100644 x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/BertRequestBuilderTests.java delete mode 100644 x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessorTests.java diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/BertRequestBuilder.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/BertRequestBuilder.java new file mode 100644 index 0000000000000..09b754c98f31d --- /dev/null +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/BertRequestBuilder.java @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.nlp; + +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; + +import java.io.IOException; +import java.util.Arrays; + +public class BertRequestBuilder implements NlpTask.RequestBuilder { + + static final String REQUEST_ID = "request_id"; + static final String TOKENS = "tokens"; + static final String ARG1 = "arg_1"; + static final String ARG2 = "arg_2"; + static final String ARG3 = "arg_3"; + + private final BertTokenizer tokenizer; + private BertTokenizer.TokenizationResult tokenization; + + public BertRequestBuilder(BertTokenizer tokenizer) { + this.tokenizer = tokenizer; + } + + public BertTokenizer.TokenizationResult getTokenization() { + return tokenization; + } + + @Override + public BytesReference buildRequest(String input, String requestId) throws IOException { + tokenization = tokenizer.tokenize(input, true); + return jsonRequest(tokenization.getTokenIds(), requestId); + } + + static BytesReference jsonRequest(int[] tokens, String requestId) throws IOException { + XContentBuilder builder = XContentFactory.jsonBuilder(); + builder.startObject(); + builder.field(REQUEST_ID, requestId); + builder.array(TOKENS, tokens); + + int[] inputMask = new int[tokens.length]; + Arrays.fill(inputMask, 1); + int[] segmentMask = new int[tokens.length]; + Arrays.fill(segmentMask, 0); + int[] positionalIds = new int[tokens.length]; + Arrays.setAll(positionalIds, i -> i); + + builder.array(ARG1, inputMask); + builder.array(ARG2, segmentMask); + builder.array(ARG3, positionalIds); + builder.endObject(); + + // BytesReference.bytes closes the builder + return BytesReference.bytes(builder); + } +} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java index 6ff84426ff75c..5f49599812c5d 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java @@ -7,59 +7,55 @@ package org.elasticsearch.xpack.ml.inference.nlp; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; +import org.elasticsearch.xpack.core.ml.inference.results.FillMaskResults; +import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; -import java.io.IOException; -import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; -public class FillMaskProcessor extends NlpTask.Processor { +public class FillMaskProcessor implements NlpTask.Processor { - private final BertTokenizer tokenizer; - private BertTokenizer.TokenizationResult tokenization; + private final BertRequestBuilder bertRequestBuilder; FillMaskProcessor(BertTokenizer tokenizer) { - this.tokenizer = tokenizer; - } - - private BytesReference buildRequest(String requestId, String input) throws IOException { - tokenization = tokenizer.tokenize(input, true); - return jsonRequest(tokenization.getTokenIds(), requestId); + this.bertRequestBuilder = new BertRequestBuilder(tokenizer); } @Override public NlpTask.RequestBuilder getRequestBuilder() { - return this::buildRequest; + return bertRequestBuilder; } @Override public NlpTask.ResultProcessor getResultProcessor() { - return new FillMaskResultProcessor(tokenization); + return this::processResult; } - static BytesReference jsonRequest(int[] tokens, String requestId) throws IOException { - // TODO the request here is identical is with NER - // refactor to reuse code when a proper name - // can be found for a base processor - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field(REQUEST_ID, requestId); - builder.array(TOKENS, tokens); - - int[] inputMask = new int[tokens.length]; - Arrays.fill(inputMask, 1); - int[] segmentMask = new int[tokens.length]; - Arrays.fill(segmentMask, 0); - int[] positionalIds = new int[tokens.length]; - Arrays.setAll(positionalIds, i -> i); - builder.array(ARG1, inputMask); - builder.array(ARG2, segmentMask); - builder.array(ARG3, positionalIds); - builder.endObject(); - - // BytesReference.bytes closes the builder - return BytesReference.bytes(builder); + private InferenceResults processResult(PyTorchResult pyTorchResult) { + BertTokenizer.TokenizationResult tokenization = bertRequestBuilder.getTokenization(); + + if (tokenization.getTokens().isEmpty()) { + return new FillMaskResults(Collections.emptyList()); + } + List<String> maskTokens = tokenization.getTokens().stream() + .filter(BertTokenizer.MASK_TOKEN::equals) + .collect(Collectors.toList()); + if (maskTokens.isEmpty()) { + throw new IllegalArgumentException("no [MASK] token could be found"); + } + if (maskTokens.size() > 1) { + throw new IllegalArgumentException("only one [MASK] token should exist in the input"); + } + int maskTokenIndex = tokenization.getTokens().indexOf(BertTokenizer.MASK_TOKEN); + double[][] normalizedScores = NlpHelpers.convertToProbabilitesBySoftMax(pyTorchResult.getInferenceResult()); + int predictionTokenId = NlpHelpers.argmax(normalizedScores[maskTokenIndex]); + String predictedToken = tokenization.getFromVocab(predictionTokenId); + double score = normalizedScores[maskTokenIndex][predictionTokenId]; + String sequence = tokenization.getInput().replace(BertTokenizer.MASK_TOKEN, predictedToken); + FillMaskResults.Result result = new FillMaskResults.Result(predictedToken, score, sequence); + return new FillMaskResults(Collections.singletonList(result)); } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskResultProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskResultProcessor.java deleted file mode 100644 index 6fb61da3c0336..0000000000000 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskResultProcessor.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -package org.elasticsearch.xpack.ml.inference.nlp; - -import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; -import org.elasticsearch.xpack.core.ml.inference.results.FillMaskResults; -import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; -import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; - -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -class FillMaskResultProcessor implements NlpTask.ResultProcessor { - - private final BertTokenizer.TokenizationResult tokenization; - - FillMaskResultProcessor(BertTokenizer.TokenizationResult tokenization) { - this.tokenization = Objects.requireNonNull(tokenization); - } - - @Override - public InferenceResults processResult(PyTorchResult pyTorchResult) { - if (tokenization.getTokens().isEmpty()) { - return new FillMaskResults(Collections.emptyList()); - } - List<String> maskTokens = tokenization.getTokens().stream() - .filter(t -> BertTokenizer.MASK_TOKEN.equals(t)) - .collect(Collectors.toList()); - if (maskTokens.isEmpty()) { - throw new IllegalArgumentException("no [MASK] token could be found"); - } - if (maskTokens.size() > 1) { - throw new IllegalArgumentException("only one [MASK] token should exist in the input"); - } - int maskTokenIndex = tokenization.getTokens().indexOf(BertTokenizer.MASK_TOKEN); - double[][] normalizedScores = NlpHelpers.convertToProbabilitesBySoftMax(pyTorchResult.getInferenceResult()); - int predictionTokenId = NlpHelpers.argmax(normalizedScores[maskTokenIndex]); - String predictedToken = tokenization.getFromVocab(predictionTokenId); - double score = normalizedScores[maskTokenIndex][predictionTokenId]; - String sequence = tokenization.getInput().replace(BertTokenizer.MASK_TOKEN, predictedToken); - FillMaskResults.Result result = new FillMaskResults.Result(predictedToken, score, sequence); - return new FillMaskResults(Collections.singletonList(result)); - } -} diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessor.java index 259daa33c2c8e..df1c2dba91ad6 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessor.java @@ -7,18 +7,14 @@ package org.elasticsearch.xpack.ml.inference.nlp; -import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; import java.io.IOException; -import java.util.Arrays; import java.util.Locale; -public class NerProcessor extends NlpTask.Processor { +public class NerProcessor implements NlpTask.Processor { public enum Entity implements Writeable { NONE, MISC, PERSON, ORGANISATION, LOCATION; @@ -62,46 +58,20 @@ boolean isBeginning() { } - private final BertTokenizer tokenizer; - private BertTokenizer.TokenizationResult tokenization; + private final BertRequestBuilder bertRequestBuilder; NerProcessor(BertTokenizer tokenizer) { - this.tokenizer = tokenizer; + this.bertRequestBuilder = new BertRequestBuilder(tokenizer); } - private BytesReference buildRequest(String requestId, String input) throws IOException { - tokenization = tokenizer.tokenize(input, true); - return jsonRequest(tokenization.getTokenIds(), requestId); - } @Override public NlpTask.RequestBuilder getRequestBuilder() { - return this::buildRequest; + return bertRequestBuilder; } @Override public NlpTask.ResultProcessor getResultProcessor() { - return new NerResultProcessor(tokenization); - } - - static BytesReference jsonRequest(int[] tokens, String requestId) throws IOException { - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field(REQUEST_ID, requestId); - builder.array(TOKENS, tokens); - - int[] inputMask = new int[tokens.length]; - Arrays.fill(inputMask, 1); - int[] segmentMask = new int[tokens.length]; - Arrays.fill(segmentMask, 0); - int[] positionalIds = new int[tokens.length]; - Arrays.setAll(positionalIds, i -> i); - builder.array(ARG1, inputMask); - builder.array(ARG2, segmentMask); - builder.array(ARG3, positionalIds); - builder.endObject(); - - // BytesReference.bytes closes the builder - return BytesReference.bytes(builder); + return new NerResultProcessor(bertRequestBuilder.getTokenization()); } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java index c32a753cfcb01..53f7aed007188 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java @@ -40,16 +40,8 @@ public interface ResultProcessor { InferenceResults processResult(PyTorchResult pyTorchResult); } - - public abstract static class Processor { - - protected static final String REQUEST_ID = "request_id"; - protected static final String TOKENS = "tokens"; - protected static final String ARG1 = "arg_1"; - protected static final String ARG2 = "arg_2"; - protected static final String ARG3 = "arg_3"; - - public abstract RequestBuilder getRequestBuilder(); - public abstract ResultProcessor getResultProcessor(); + public interface Processor { + RequestBuilder getRequestBuilder(); + ResultProcessor getResultProcessor(); } } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/BertRequestBuilderTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/BertRequestBuilderTests.java new file mode 100644 index 0000000000000..0f1f9fe3ff497 --- /dev/null +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/BertRequestBuilderTests.java @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.nlp; + +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.collect.Tuple; +import org.elasticsearch.common.xcontent.XContentHelper; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Map; + +import static org.hamcrest.Matchers.hasSize; + +public class BertRequestBuilderTests extends ESTestCase { + + public void testBuildRequest() throws IOException { + BertTokenizer tokenizer = BertTokenizer.builder( + Arrays.asList("Elastic", "##search", "fun", BertTokenizer.CLASS_TOKEN, BertTokenizer.SEPARATOR_TOKEN)).build(); + + BertRequestBuilder requestBuilder = new BertRequestBuilder(tokenizer); + BytesReference bytesReference = requestBuilder.buildRequest("Elasticsearch fun", "request1"); + + Map<String, Object> jsonDocAsMap = XContentHelper.convertToMap(bytesReference, true, XContentType.JSON).v2(); + + assertThat(jsonDocAsMap.keySet(), hasSize(5)); + assertEquals("request1", jsonDocAsMap.get("request_id")); + assertEquals(Arrays.asList(3, 0, 1, 2, 4), jsonDocAsMap.get("tokens")); + assertEquals(Arrays.asList(1, 1, 1, 1, 1), jsonDocAsMap.get("arg_1")); + assertEquals(Arrays.asList(0, 0, 0, 0, 0), jsonDocAsMap.get("arg_2")); + assertEquals(Arrays.asList(0, 1, 2, 3, 4), jsonDocAsMap.get("arg_3")); + } +} diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessorTests.java deleted file mode 100644 index 07f1775f92e64..0000000000000 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessorTests.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -package org.elasticsearch.xpack.ml.inference.nlp; - -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.test.ESTestCase; - -import java.io.IOException; - -public class NerProcessorTests extends ESTestCase { - - public void testJsonRequest() throws IOException { - String requestId = "foo"; - int [] tokens = new int[] {100, 101, 102, 103, 104}; - BytesReference bytesReference = NerProcessor.jsonRequest(tokens, requestId); - - String jsonDoc = bytesReference.utf8ToString(); - assertEquals( - "{\"request_id\":\"foo\",\"tokens\":[100,101,102,103,104],\"arg_1\":[1,1,1,1,1],\"arg_2\":[0,0,0,0,0],\"arg_3\":[0,1,2,3,4]}", - jsonDoc); - } -} diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java index 6d62c6a67005d..9620574ea7550 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java @@ -34,7 +34,7 @@ public void testTokenizeAppendSpecialTokens() { assertArrayEquals(new int[] {3, 0, 1, 2, 4}, tokenization.getTokenIds()); assertArrayEquals(new int[] {-1, 0, 0, 1, -1}, tokenization.getTokenMap()); } - + public void testNeverSplitTokens() { final String specialToken = "SP001"; From 9aa04576b415d9bea71d62d0779a5ca78b1f1750 Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Thu, 27 May 2021 10:25:24 +0100 Subject: [PATCH 13/21] Add top k function --- .../ml/inference/nlp/FillMaskProcessor.java | 21 ++++-- .../ml/inference/nlp/NerResultProcessor.java | 2 +- .../xpack/ml/inference/nlp/NlpHelpers.java | 59 +++++++++++++++- .../ml/inference/nlp/NlpHelpersTests.java | 69 ++++++++++++++++++- 4 files changed, 140 insertions(+), 11 deletions(-) diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java index 5f49599812c5d..c2adc15fbddaa 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java @@ -12,12 +12,15 @@ import org.elasticsearch.xpack.core.ml.inference.results.InferenceResults; import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; public class FillMaskProcessor implements NlpTask.Processor { + private static final int NUM_RESULTS = 5; + private final BertRequestBuilder bertRequestBuilder; FillMaskProcessor(BertTokenizer tokenizer) { @@ -50,12 +53,16 @@ private InferenceResults processResult(PyTorchResult pyTorchResult) { throw new IllegalArgumentException("only one [MASK] token should exist in the input"); } int maskTokenIndex = tokenization.getTokens().indexOf(BertTokenizer.MASK_TOKEN); - double[][] normalizedScores = NlpHelpers.convertToProbabilitesBySoftMax(pyTorchResult.getInferenceResult()); - int predictionTokenId = NlpHelpers.argmax(normalizedScores[maskTokenIndex]); - String predictedToken = tokenization.getFromVocab(predictionTokenId); - double score = normalizedScores[maskTokenIndex][predictionTokenId]; - String sequence = tokenization.getInput().replace(BertTokenizer.MASK_TOKEN, predictedToken); - FillMaskResults.Result result = new FillMaskResults.Result(predictedToken, score, sequence); - return new FillMaskResults(Collections.singletonList(result)); + double[] normalizedScores = NlpHelpers.convertToProbabilitiesBySoftMax(pyTorchResult.getInferenceResult()[maskTokenIndex]); + + int[] topKIds = NlpHelpers.topK(NUM_RESULTS, normalizedScores); + List<FillMaskResults.Result> results = new ArrayList<>(NUM_RESULTS); + for (int i=0; i<topKIds.length; i++) { + String predictedToken = tokenization.getFromVocab(topKIds[i]); + double score = normalizedScores[topKIds[i]]; + String sequence = tokenization.getInput().replace(BertTokenizer.MASK_TOKEN, predictedToken); + results.add(new FillMaskResults.Result(predictedToken, score, sequence)); + } + return new FillMaskResults(results); } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessor.java index ba7d2861af826..2bebaeda406bb 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessor.java @@ -37,7 +37,7 @@ public InferenceResults processResult(PyTorchResult pyTorchResult) { // and -5 for "astic". Averaging after softmax would produce a prediction // of maybe (1 + 0) / 2 = 0.5 while before softmax it'd be exp(10 - 5) / normalization // which could easily be close to 1. - double[][] normalizedScores = NlpHelpers.convertToProbabilitesBySoftMax(pyTorchResult.getInferenceResult()); + double[][] normalizedScores = NlpHelpers.convertToProbabilitiesBySoftMax(pyTorchResult.getInferenceResult()); List<TaggedToken> taggedTokens = tagTokens(normalizedScores); List<NerResults.EntityGroup> entities = groupTaggedTokens(taggedTokens); return new NerResults(entities); diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java index dcf0ec2ddb890..c908f11424191 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java @@ -13,7 +13,7 @@ public final class NlpHelpers { private NlpHelpers() {} - static double[][] convertToProbabilitesBySoftMax(double[][] scores) { + static double[][] convertToProbabilitiesBySoftMax(double[][] scores) { double[][] probabilities = new double[scores.length][]; double[] sum = new double[scores.length]; for (int i = 0; i < scores.length; i++) { @@ -32,6 +32,21 @@ static double[][] convertToProbabilitesBySoftMax(double[][] scores) { return probabilities; } + static double[] convertToProbabilitiesBySoftMax(double[] scores) { + double[] probabilities = new double[scores.length]; + double sum = 0.0; + double maxScore = MovingFunctions.max(scores); + for (int i = 0; i < scores.length; i++) { + probabilities[i] = Math.exp(scores[i] - maxScore); + sum += probabilities[i]; + } + for (int i = 0; i < scores.length; i++) { + probabilities[i] /= sum; + } + return probabilities; + } + + static int argmax(double[] arr) { int maxIndex = 0; for (int i = 1; i < arr.length; i++) { @@ -41,4 +56,46 @@ static int argmax(double[] arr) { } return maxIndex; } + + static int[] topK(int k, double[] arr) { + int[] topK = new int[k]; + for (int i=0; i<k; i++) { + topK[i] = i; + } + + int min = indexOfSmallestValue(topK, arr); + for (int i = k; i < arr.length; i++) { + if (arr[i] > arr[topK[min]]) { + topK[min] = i; + min = indexOfSmallestValue(topK, arr); + } + } + + // Sort the result so the largest values are at the beginning + insertionSort(topK, arr); + return topK; + } + + // modifies indices + private static void insertionSort(int [] indices, double [] data) { + for (int i=1; i< indices.length; i++) { + int j = i; + while (j > 0 && data[indices[j-1]] < data[indices[j]]) { + int tmp = indices[j-1]; + indices[j-1] = indices[j]; + indices[j] = tmp; + j--; + } + } + } + + private static int indexOfSmallestValue(int [] indices, double [] data) { + int minIndex = 0; + for (int i=1; i<indices.length; i++) { + if (data[indices[i]] < data[indices[minIndex]]) { + minIndex = i; + } + } + return minIndex; + } } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java index 8c1cc786be2ff..974a89fd49159 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java @@ -10,6 +10,12 @@ import org.elasticsearch.search.aggregations.pipeline.MovingFunctions; import org.elasticsearch.test.ESTestCase; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThanOrEqualTo; @@ -23,7 +29,7 @@ public void testConvertToProbabilitiesBySoftMax_GivenConcreteExample() { { 6, 0.2, 0.1} }; - double[][] probabilities = NlpHelpers.convertToProbabilitesBySoftMax(scores); + double[][] probabilities = NlpHelpers.convertToProbabilitiesBySoftMax(scores); assertThat(probabilities[0][0], closeTo(0.04931133, 0.00000001)); assertThat(probabilities[0][1], closeTo(0.05449744, 0.00000001)); @@ -33,6 +39,15 @@ public void testConvertToProbabilitiesBySoftMax_GivenConcreteExample() { assertThat(probabilities[1][2], closeTo(0.00272374, 0.00000001)); } + public void testConvertToProbabilitiesBySoftMax_OneDimension() { + double[] scores = { 0.1, 0.2, 3}; + double[] probabilities = NlpHelpers.convertToProbabilitiesBySoftMax(scores); + + assertThat(probabilities[0], closeTo(0.04931133, 0.00000001)); + assertThat(probabilities[1], closeTo(0.05449744, 0.00000001)); + assertThat(probabilities[2], closeTo(0.89619123, 0.00000001)); + } + public void testConvertToProbabilitiesBySoftMax_GivenRandom() { double[][] scores = new double[100][100]; for (int i = 0; i < scores.length; i++) { @@ -41,7 +56,7 @@ public void testConvertToProbabilitiesBySoftMax_GivenRandom() { } } - double[][] probabilities = NlpHelpers.convertToProbabilitesBySoftMax(scores); + double[][] probabilities = NlpHelpers.convertToProbabilitiesBySoftMax(scores); // Assert invariants that // 1. each row sums to 1 @@ -57,4 +72,54 @@ public void testConvertToProbabilitiesBySoftMax_GivenRandom() { } } } + + public void testTopK() { + { + int k = 3; + double[] data = new double[]{1.0, 0.0, 2.0, 8.0, 9.0, 4.2, 4.2, 3.0}; + int[] topKIndices = NlpHelpers.topK(k, data); + + assertArrayEquals(new int[]{4, 3, 5}, topKIndices); + } + { + int k = 5; + double[] data = new double[]{10.0, 0.0, 2.0, 6.0, 9.0, 4.2, 7.6, 6.0, 0.2, 4.2, 3.0, 0.1, 4.0}; + int[] topKIndices = NlpHelpers.topK(k, data); + + assertArrayEquals(new int[]{0, 4, 6, 7, 3}, topKIndices); + } + { + // in this case use the standard java libraries to sort the + // doubles and track the starting index of each value + class ValueAndStartIndex { + final double value; + final int originalIndex; + ValueAndStartIndex(double value, int index) { + this.value = value; + this.originalIndex = index; + } + } + + int size = randomIntBetween(50, 100); + int k = randomIntBetween(1, 10); + double[] data = new double[size]; + for (int i=0; i<data.length; i++) { + data[i] = randomDouble(); + } + + AtomicInteger index = new AtomicInteger(0); + List<ValueAndStartIndex> sortedByValue = Stream.generate(() -> new ValueAndStartIndex(data[index.get()], index.getAndIncrement())) + .limit(size) + .sorted((o1, o2) -> Double.compare(o2.value, o1.value)) + .collect(Collectors.toList()); + + int[] topKIndices = NlpHelpers.topK(k, data); + + // now compare the starting indices in the sorted list + // to the top k. + for (int i=0; i<topKIndices.length; i++) { + assertEquals(sortedByValue.get(i).originalIndex, topKIndices[i]); + } + } + } } From 0f0424beb02dd9d696c069d66618cb288e2247e0 Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Thu, 27 May 2021 10:39:28 +0100 Subject: [PATCH 14/21] Handle punctuation chars next to the [MASK] token --- .../nlp/tokenizers/BasicTokenizer.java | 37 +++++++++++++++++-- .../nlp/BertRequestBuilderTests.java | 1 - .../ml/inference/nlp/NlpHelpersTests.java | 4 +- .../nlp/tokenizers/BasicTokenizerTests.java | 34 +++++++++++++---- .../nlp/tokenizers/BertTokenizerTests.java | 16 ++++++++ 5 files changed, 79 insertions(+), 13 deletions(-) diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizer.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizer.java index 50d16da931258..e6bb49e41be53 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizer.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizer.java @@ -15,6 +15,7 @@ import java.util.Locale; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Predicate; /** * Basic tokenization of text by whitespace with optional extras: @@ -88,12 +89,23 @@ public List<String> tokenize(String text) { List<String> processedTokens = new ArrayList<>(tokens.length); for (String token : tokens) { + + if (Strings.EMPTY.equals(token)) { + continue; + } + if (neverSplit.contains(token)) { processedTokens.add(token); continue; } - if (Strings.EMPTY.equals(token)) { + // At this point text has been tokenized by whitespace + // but one of the special never split tokens could be adjacent + // to a punctuation character. + if (isCommonPunctuation(token.codePointAt(token.length() -1)) && + neverSplit.contains(token.substring(0, token.length() -1))) { + processedTokens.add(token.substring(0, token.length() -1)); + processedTokens.add(token.substring(token.length() -1)); continue; } @@ -148,12 +160,16 @@ static String stripAccents(String word) { } static List<String> splitOnPunctuation(String word) { + return splitOnPredicate(word, BasicTokenizer::isPunctuationMark); + } + + static List<String> splitOnPredicate(String word, Predicate<Integer> test) { List<String> split = new ArrayList<>(); int [] codePoints = word.codePoints().toArray(); int lastSplit = 0; for (int i=0; i<codePoints.length; i++) { - if (isPunctuation(codePoints[i])) { + if (test.test(codePoints[i])) { int charCount = i - lastSplit; if (charCount > 0) { // add a new string for what has gone before @@ -265,7 +281,7 @@ static boolean isWhiteSpace(int codePoint) { * @param codePoint code point * @return true if is punctuation */ - static boolean isPunctuation(int codePoint) { + static boolean isPunctuationMark(int codePoint) { if ((codePoint >= 33 && codePoint <= 47) || (codePoint >= 58 && codePoint <= 64) || (codePoint >= 91 && codePoint <= 96) || @@ -276,4 +292,19 @@ static boolean isPunctuation(int codePoint) { int category = Character.getType(codePoint); return category >= Character.DASH_PUNCTUATION && category <= Character.OTHER_PUNCTUATION; } + + /** + * True if the code point is for a common punctuation character + * {@code ! " # $ % & ' ( ) * + , - . / and : ; < = > ?} + * @param codePoint codepoint + * @return true if codepoint is punctuation + */ + static boolean isCommonPunctuation(int codePoint) { + if ((codePoint >= 33 && codePoint <= 47) || + (codePoint >= 58 && codePoint <= 64) ) { + return true; + } + + return false; + } } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/BertRequestBuilderTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/BertRequestBuilderTests.java index 0f1f9fe3ff497..24037e3bd9fe4 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/BertRequestBuilderTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/BertRequestBuilderTests.java @@ -8,7 +8,6 @@ package org.elasticsearch.xpack.ml.inference.nlp; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.collect.Tuple; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.test.ESTestCase; diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java index 974a89fd49159..9fceee69b916b 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java @@ -10,7 +10,6 @@ import org.elasticsearch.search.aggregations.pipeline.MovingFunctions; import org.elasticsearch.test.ESTestCase; -import java.util.Comparator; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -108,7 +107,8 @@ class ValueAndStartIndex { } AtomicInteger index = new AtomicInteger(0); - List<ValueAndStartIndex> sortedByValue = Stream.generate(() -> new ValueAndStartIndex(data[index.get()], index.getAndIncrement())) + List<ValueAndStartIndex> sortedByValue = + Stream.generate(() -> new ValueAndStartIndex(data[index.get()], index.getAndIncrement())) .limit(size) .sorted((o1, o2) -> Double.compare(o2.value, o1.value)) .collect(Collectors.toList()); diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizerTests.java index 25310d173d3c6..b06f7cf84839c 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizerTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BasicTokenizerTests.java @@ -64,12 +64,20 @@ public void testNeverSplit() { List<String> tokens = tokenizer.tokenize(" \tHeLLo!how \n Are yoU? [UNK]"); assertThat(tokens, contains("HeLLo", "!", "how", "Are", "yoU", "?", "[UNK]")); + tokens = tokenizer.tokenize("Hello [UNK]."); + assertThat(tokens, contains("Hello", "[UNK]", ".")); + + tokens = tokenizer.tokenize("Hello [UNK]?"); + assertThat(tokens, contains("Hello", "[UNK]", "?")); } public void testSplitOnPunctuation() { List<String> tokens = BasicTokenizer.splitOnPunctuation("hi!"); assertThat(tokens, contains("hi", "!")); + tokens = BasicTokenizer.splitOnPunctuation("hi."); + assertThat(tokens, contains("hi", ".")); + tokens = BasicTokenizer.splitOnPunctuation("!hi"); assertThat(tokens, contains("!", "hi")); @@ -81,6 +89,9 @@ public void testSplitOnPunctuation() { tokens = BasicTokenizer.splitOnPunctuation("[hi]"); assertThat(tokens, contains("[", "hi", "]")); + + tokens = BasicTokenizer.splitOnPunctuation("hi."); + assertThat(tokens, contains("hi", ".")); } public void testStripAccents() { @@ -133,13 +144,22 @@ public void testIsControl() { } public void testIsPunctuation() { - assertTrue(BasicTokenizer.isPunctuation('-')); - assertTrue(BasicTokenizer.isPunctuation('$')); - assertTrue(BasicTokenizer.isPunctuation('`')); - assertTrue(BasicTokenizer.isPunctuation('.')); - - assertFalse(BasicTokenizer.isPunctuation(' ')); - assertFalse(BasicTokenizer.isPunctuation('A')); + assertTrue(BasicTokenizer.isCommonPunctuation('-')); + assertTrue(BasicTokenizer.isCommonPunctuation('$')); + assertTrue(BasicTokenizer.isCommonPunctuation('.')); + assertFalse(BasicTokenizer.isCommonPunctuation(' ')); + assertFalse(BasicTokenizer.isCommonPunctuation('A')); + assertFalse(BasicTokenizer.isCommonPunctuation('`')); + + assertTrue(BasicTokenizer.isPunctuationMark('-')); + assertTrue(BasicTokenizer.isPunctuationMark('$')); + assertTrue(BasicTokenizer.isPunctuationMark('`')); + assertTrue(BasicTokenizer.isPunctuationMark('.')); + assertFalse(BasicTokenizer.isPunctuationMark(' ')); + assertFalse(BasicTokenizer.isPunctuationMark('A')); + + assertFalse(BasicTokenizer.isCommonPunctuation('[')); + assertTrue(BasicTokenizer.isPunctuationMark('[')); } public void testIsCjkChar() { diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java index 9620574ea7550..380d868f85acd 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/tokenizers/BertTokenizerTests.java @@ -74,4 +74,20 @@ public void testDoLowerCase() { assertThat(tokenization.getTokens(), contains("elastic", "##search", "fun")); } } + + public void testPunctuation() { + BertTokenizer tokenizer = BertTokenizer.builder( + Arrays.asList("Elastic", "##search", "fun", ".", ",", + BertTokenizer.MASK_TOKEN, BertTokenizer.UNKNOWN_TOKEN)).build(); + + BertTokenizer.TokenizationResult tokenization = tokenizer.tokenize("Elasticsearch, fun.", false); + assertThat(tokenization.getTokens(), contains("Elastic", "##search", ",", "fun", ".")); + assertArrayEquals(new int[] {0, 1, 4, 2, 3}, tokenization.getTokenIds()); + assertArrayEquals(new int[] {0, 0, 1, 2, 3}, tokenization.getTokenMap()); + + tokenization = tokenizer.tokenize("Elasticsearch, fun [MASK].", false); + assertThat(tokenization.getTokens(), contains("Elastic", "##search", ",", "fun", "[MASK]", ".")); + assertArrayEquals(new int[] {0, 1, 4, 2, 5, 3}, tokenization.getTokenIds()); + assertArrayEquals(new int[] {0, 0, 1, 2, 3, 4}, tokenization.getTokenMap()); + } } From bc050aea41a72b46a6de2da6ba30d44bd81757be Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Thu, 27 May 2021 15:16:56 +0100 Subject: [PATCH 15/21] Ner Processor tests --- .../ml/inference/nlp/NerResultProcessor.java | 13 ++-- .../nlp/NerResultProcessorTests.java | 70 +++++++++++++++++++ 2 files changed, 78 insertions(+), 5 deletions(-) diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessor.java index 2bebaeda406bb..7a4309928dc36 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessor.java @@ -75,8 +75,11 @@ private List<TaggedToken> tagTokens(double[][] scores) { avgScores[j] += scores[i][j]; } } - for (int i = 0; i < avgScores.length; i++) { - avgScores[i] /= endTokenIndex - startTokenIndex + 1; + int numTokensInBlock = endTokenIndex - startTokenIndex + 1; + if (numTokensInBlock > 1) { + for (int i = 0; i < avgScores.length; i++) { + avgScores[i] /= numTokensInBlock; + } } int maxScoreIndex = NlpHelpers.argmax(avgScores); double score = avgScores[maxScoreIndex]; @@ -95,7 +98,7 @@ private List<TaggedToken> tagTokens(double[][] scores) { * When multiple tokens are grouped together, the entity score is the * mean score of the tokens. */ - private List<NerResults.EntityGroup> groupTaggedTokens(List<TaggedToken> tokens) { + static List<NerResults.EntityGroup> groupTaggedTokens(List<TaggedToken> tokens) { if (tokens.isEmpty()) { return Collections.emptyList(); } @@ -130,12 +133,12 @@ private List<NerResults.EntityGroup> groupTaggedTokens(List<TaggedToken> tokens) return entities; } - private static class TaggedToken { + static class TaggedToken { private final String word; private final NerProcessor.IobTag tag; private final double score; - private TaggedToken(String word, NerProcessor.IobTag tag, double score) { + TaggedToken(String word, NerProcessor.IobTag tag, double score) { this.word = word; this.tag = tag; this.score = score; diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessorTests.java index 9856a60cc0538..cb3e14081b22b 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessorTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NerResultProcessorTests.java @@ -12,12 +12,14 @@ import org.elasticsearch.xpack.core.ml.inference.results.NerResults; import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; public class NerResultProcessorTests extends ESTestCase { @@ -49,6 +51,74 @@ public void testProcessResults() { assertThat(result.getEntityGroups().get(1).getLabel(), equalTo(NerProcessor.Entity.LOCATION.toString())); } + public void testGroupTaggedTokens() { + List<NerResultProcessor.TaggedToken> tokens = new ArrayList<>(); + tokens.add(new NerResultProcessor.TaggedToken("Hi", NerProcessor.IobTag.O, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("Sarah", NerProcessor.IobTag.B_PER, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("Jessica", NerProcessor.IobTag.I_PER, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("I", NerProcessor.IobTag.O, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("live", NerProcessor.IobTag.O, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("in", NerProcessor.IobTag.O, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("Manchester", NerProcessor.IobTag.B_LOC, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("and", NerProcessor.IobTag.O, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("work", NerProcessor.IobTag.O, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("for", NerProcessor.IobTag.O, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("Elastic", NerProcessor.IobTag.B_ORG, 1.0)); + + List<NerResults.EntityGroup> entityGroups = NerResultProcessor.groupTaggedTokens(tokens); + assertThat(entityGroups, hasSize(3)); + assertThat(entityGroups.get(0).getLabel(), equalTo("person")); + assertThat(entityGroups.get(0).getWord(), equalTo("Sarah Jessica")); + assertThat(entityGroups.get(1).getLabel(), equalTo("location")); + assertThat(entityGroups.get(1).getWord(), equalTo("Manchester")); + assertThat(entityGroups.get(2).getLabel(), equalTo("organisation")); + assertThat(entityGroups.get(2).getWord(), equalTo("Elastic")); + } + + public void testGroupTaggedTokens_GivenNoEntities() { + List<NerResultProcessor.TaggedToken> tokens = new ArrayList<>(); + tokens.add(new NerResultProcessor.TaggedToken("Hi", NerProcessor.IobTag.O, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("there", NerProcessor.IobTag.O, 1.0)); + + List<NerResults.EntityGroup> entityGroups = NerResultProcessor.groupTaggedTokens(tokens); + assertThat(entityGroups, is(empty())); + } + + public void testGroupTaggedTokens_GivenConsecutiveEntities() { + List<NerResultProcessor.TaggedToken> tokens = new ArrayList<>(); + tokens.add(new NerResultProcessor.TaggedToken("Rita", NerProcessor.IobTag.B_PER, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("Sue", NerProcessor.IobTag.B_PER, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("and", NerProcessor.IobTag.O, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("Bob", NerProcessor.IobTag.B_PER, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("to", NerProcessor.IobTag.O, 1.0)); + + List<NerResults.EntityGroup> entityGroups = NerResultProcessor.groupTaggedTokens(tokens); + assertThat(entityGroups, hasSize(3)); + assertThat(entityGroups.get(0).getLabel(), equalTo("person")); + assertThat(entityGroups.get(0).getWord(), equalTo("Rita")); + assertThat(entityGroups.get(1).getLabel(), equalTo("person")); + assertThat(entityGroups.get(1).getWord(), equalTo("Sue")); + assertThat(entityGroups.get(2).getLabel(), equalTo("person")); + assertThat(entityGroups.get(2).getWord(), equalTo("Bob")); + } + + public void testGroupTaggedTokens_GivenConsecutiveContinuingEntities() { + List<NerResultProcessor.TaggedToken> tokens = new ArrayList<>(); + tokens.add(new NerResultProcessor.TaggedToken("FirstName", NerProcessor.IobTag.B_PER, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("SecondName", NerProcessor.IobTag.I_PER, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("NextPerson", NerProcessor.IobTag.B_PER, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("NextPersonSecondName", NerProcessor.IobTag.I_PER, 1.0)); + tokens.add(new NerResultProcessor.TaggedToken("something_else", NerProcessor.IobTag.B_ORG, 1.0)); + + List<NerResults.EntityGroup> entityGroups = NerResultProcessor.groupTaggedTokens(tokens); + assertThat(entityGroups, hasSize(3)); + assertThat(entityGroups.get(0).getLabel(), equalTo("person")); + assertThat(entityGroups.get(0).getWord(), equalTo("FirstName SecondName")); + assertThat(entityGroups.get(1).getLabel(), equalTo("person")); + assertThat(entityGroups.get(1).getWord(), equalTo("NextPerson NextPersonSecondName")); + assertThat(entityGroups.get(2).getLabel(), equalTo("organisation")); + } + private static NerResultProcessor createProcessor(List<String> vocab, String input){ BertTokenizer tokenizer = BertTokenizer.builder(vocab) .setDoLowerCase(true) From 178837420ed3edd7d4b389ba536c6e740bab600d Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Thu, 27 May 2021 15:31:45 +0100 Subject: [PATCH 16/21] tidy up --- .../xpack/core/ml/job/messages/Messages.java | 2 +- ...portInferTrainedModelDeploymentAction.java | 2 +- .../deployment/DeploymentManager.java | 51 +++++++++---------- .../TrainedModelDeploymentTask.java | 7 ++- .../xpack/ml/inference/nlp/NlpTask.java | 2 +- .../{TaskConfig.java => NlpTaskConfig.java} | 20 ++++---- 6 files changed, 39 insertions(+), 45 deletions(-) rename x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/{TaskConfig.java => NlpTaskConfig.java} (81%) diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/job/messages/Messages.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/job/messages/Messages.java index 0ae5788be7a6c..b86060dae5114 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/job/messages/Messages.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/job/messages/Messages.java @@ -115,7 +115,7 @@ public final class Messages { "Configuration [{0}] requires minimum node version [{1}] (current minimum node version [{2}]"; public static final String MODEL_DEFINITION_NOT_FOUND = "Could not find trained model definition [{0}]"; public static final String MODEL_METADATA_NOT_FOUND = "Could not find trained model metadata {0}"; - public static final String PIPELINE_CONFIG_NOT_FOUND = "Could not find pipeline config for model [{0}]"; + public static final String TASK_CONFIG_NOT_FOUND = "Could not find task config for model [{0}]"; public static final String INFERENCE_CANNOT_DELETE_ML_MANAGED_MODEL = "Unable to delete model [{0}] as it is required by machine learning"; public static final String MODEL_DEFINITION_TRUNCATED = diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java index dce2ea7790749..be5a218985a13 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java @@ -70,7 +70,7 @@ protected InferTrainedModelDeploymentAction.Response newResponse(InferTrainedMod @Override protected void taskOperation(InferTrainedModelDeploymentAction.Request request, TrainedModelDeploymentTask task, ActionListener<InferTrainedModelDeploymentAction.Response> listener) { - task.infer(request.getInput(), + task.infer(request.getInput(), request.getTimeout(), ActionListener.wrap( pyTorchResult -> listener.onResponse(new InferTrainedModelDeploymentAction.Response(pyTorchResult)), listener::onFailure) diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java index e4ae4bc3ff7b2..88d0b0938fd8e 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java @@ -37,8 +37,8 @@ import org.elasticsearch.xpack.core.ml.job.messages.Messages; import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper; import org.elasticsearch.xpack.ml.MachineLearning; -import org.elasticsearch.xpack.ml.inference.pipelines.nlp.NlpPipeline; -import org.elasticsearch.xpack.ml.inference.pipelines.nlp.PipelineConfig; +import org.elasticsearch.xpack.ml.inference.nlp.NlpTask; +import org.elasticsearch.xpack.ml.inference.nlp.NlpTaskConfig; import org.elasticsearch.xpack.ml.inference.pytorch.process.NativePyTorchProcess; import org.elasticsearch.xpack.ml.inference.pytorch.process.PyTorchProcessFactory; import org.elasticsearch.xpack.ml.inference.pytorch.process.PyTorchResultProcessor; @@ -106,46 +106,42 @@ private void doStartDeployment(TrainedModelDeploymentTask task) { ActionListener<SearchResponse> configListener = ActionListener.wrap( searchResponse -> { - logger.info("search response"); if (searchResponse.getHits().getHits().length == 0) { failTask(task, new ResourceNotFoundException( - Messages.getMessage(Messages.PIPELINE_CONFIG_NOT_FOUND, task.getModelId()))); + Messages.getMessage(Messages.TASK_CONFIG_NOT_FOUND, task.getModelId()))); return; } - PipelineConfig config = parseModelDefinitionDocLeniently(searchResponse.getHits().getAt(0)); - NlpPipeline pipeline = NlpPipeline.fromConfig(config); - logger.info("loaded pipeline"); - processContext.pipeline.set(pipeline); + NlpTaskConfig config = parseConfigDocLeniently(searchResponse.getHits().getAt(0)); + NlpTask nlpTask = NlpTask.fromConfig(config); + processContext.nlpTask.set(nlpTask); processContext.startProcess(); processContext.loadModel(modelLoadedListener); - }, e -> failTask(task, e) ); - logger.info("looking for config " + PipelineConfig.documentId(task.getModelId())); - SearchRequest searchRequest = pipelineConfigSearchRequest(task.getModelId(), task.getIndex()); + SearchRequest searchRequest = taskConfigSearchRequest(task.getModelId(), task.getIndex()); executeAsyncWithOrigin(client, ML_ORIGIN, SearchAction.INSTANCE, searchRequest, configListener); } - private SearchRequest pipelineConfigSearchRequest(String modelId, String index) { + private SearchRequest taskConfigSearchRequest(String modelId, String index) { return client.prepareSearch(index) - .setQuery(new IdsQueryBuilder().addIds(PipelineConfig.documentId(modelId))) + .setQuery(new IdsQueryBuilder().addIds(NlpTaskConfig.documentId(modelId))) .setSize(1) .setTrackTotalHits(false) .request(); } - public PipelineConfig parseModelDefinitionDocLeniently(SearchHit hit) throws IOException { + public NlpTaskConfig parseConfigDocLeniently(SearchHit hit) throws IOException { try (InputStream stream = hit.getSourceRef().streamInput(); XContentParser parser = XContentFactory.xContent(XContentType.JSON) .createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, stream)) { - return PipelineConfig.fromXContent(parser, true); + return NlpTaskConfig.fromXContent(parser, true); } catch (IOException e) { - logger.error(new ParameterizedMessage("failed to parse pipeline config [{}]", hit.getId()), e); + logger.error(new ParameterizedMessage("failed to parse NLP task config [{}]", hit.getId()), e); throw e; } } @@ -156,14 +152,16 @@ public void stopDeployment(TrainedModelDeploymentTask task) { processContext = processContextByAllocation.get(task.getAllocationId()); } if (processContext != null) { - logger.debug("[{}] Stopping deployment", task.getModelId()); + logger.info("[{}] Stopping deployment", task.getModelId()); processContext.stopProcess(); } else { - logger.debug("[{}] No process context to stop", task.getModelId()); + logger.info("[{}] No process context to stop", task.getModelId()); } } - public void infer(TrainedModelDeploymentTask task, String input, ActionListener<InferenceResults> listener) { + public void infer(TrainedModelDeploymentTask task, + String input, TimeValue timeout, + ActionListener<InferenceResults> listener) { ProcessContext processContext = processContextByAllocation.get(task.getAllocationId()); final String requestId = String.valueOf(requestIdCounter.getAndIncrement()); @@ -177,14 +175,12 @@ public void onFailure(Exception e) { @Override protected void doRun() { try { - NlpPipeline.Processor processor = processContext.pipeline.get().createProcessor(); - - logger.info("tokenizing input [{}]", input); + NlpTask.Processor processor = processContext.nlpTask.get().createProcessor(); BytesReference request = processor.getRequestBuilder().buildRequest(requestId, input); - logger.info("Inference Request "+ request.utf8ToString()); + logger.trace("Inference Request "+ request.utf8ToString()); processContext.process.get().writeInferenceRequest(request); - waitForResult(processContext, requestId, processor.getResultProcessor(), listener); + waitForResult(processContext, requestId, timeout, processor.getResultProcessor(), listener); } catch (IOException e) { logger.error(new ParameterizedMessage("[{}] error writing to process", processContext.modelId), e); onFailure(ExceptionsHelper.serverError("error writing to process", e)); @@ -195,11 +191,10 @@ protected void doRun() { private void waitForResult(ProcessContext processContext, String requestId, - NlpPipeline.ResultProcessor inferenceResultsProcessor, + TimeValue timeout, + NlpTask.ResultProcessor inferenceResultsProcessor, ActionListener<InferenceResults> listener) { try { - // TODO the timeout value should come from the action - TimeValue timeout = TimeValue.timeValueSeconds(5); PyTorchResult pyTorchResult = processContext.resultProcessor.waitForResult(requestId, timeout); if (pyTorchResult == null) { listener.onFailure(new ElasticsearchStatusException("timeout [{}] waiting for inference result", @@ -225,7 +220,7 @@ class ProcessContext { private final String modelId; private final String index; private final SetOnce<NativePyTorchProcess> process = new SetOnce<>(); - private final SetOnce<NlpPipeline> pipeline = new SetOnce<>(); + private final SetOnce<NlpTask> nlpTask = new SetOnce<>(); private final PyTorchResultProcessor resultProcessor; private final PyTorchStateStreamer stateStreamer; diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java index ea295b4ef8e66..290b6f1a2e34e 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/TrainedModelDeploymentTask.java @@ -10,6 +10,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.elasticsearch.action.ActionListener; +import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.persistent.AllocatedPersistentTask; import org.elasticsearch.tasks.TaskId; import org.elasticsearch.xpack.core.ml.MlTasks; @@ -24,7 +25,6 @@ public class TrainedModelDeploymentTask extends AllocatedPersistentTask implemen private static final Logger logger = LogManager.getLogger(TrainedModelDeploymentTask.class); private final TaskParams params; - private volatile boolean isStopping; private volatile DeploymentManager manager; public TrainedModelDeploymentTask(long id, String type, String action, TaskId parentTask, Map<String, String> headers, @@ -42,7 +42,6 @@ public String getIndex() { } public void stop(String reason) { - isStopping = true; logger.debug("[{}] Stopping due to reason [{}]", getModelId(), reason); assert manager != null : "manager should not be unset when stop is called"; @@ -60,7 +59,7 @@ protected void onCancelled() { stop(reason); } - public void infer(String input, ActionListener<InferenceResults> listener) { - manager.infer(this, input, listener); + public void infer(String input, TimeValue timeout, ActionListener<InferenceResults> listener) { + manager.infer(this, input, timeout, listener); } } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java index 53f7aed007188..cf5352c3fcb1c 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java @@ -28,7 +28,7 @@ public Processor createProcessor() throws IOException { return taskType.createProcessor(tokenizer); } - public static NlpTask fromConfig(TaskConfig config) { + public static NlpTask fromConfig(NlpTaskConfig config) { return new NlpTask(config.getTaskType(), config.buildTokenizer()); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/TaskConfig.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTaskConfig.java similarity index 81% rename from x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/TaskConfig.java rename to x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTaskConfig.java index 0157654df18f8..47086bcba532c 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/TaskConfig.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTaskConfig.java @@ -18,17 +18,17 @@ import java.util.List; import java.util.Objects; -public class TaskConfig implements ToXContentObject { +public class NlpTaskConfig implements ToXContentObject { public static final ParseField VOCAB = new ParseField("vocab"); public static final ParseField TASK_TYPE = new ParseField("task_type"); public static final ParseField LOWER_CASE = new ParseField("do_lower_case"); - private static final ObjectParser<TaskConfig.Builder, Void> STRICT_PARSER = createParser(false); - private static final ObjectParser<TaskConfig.Builder, Void> LENIENT_PARSER = createParser(true); + private static final ObjectParser<NlpTaskConfig.Builder, Void> STRICT_PARSER = createParser(false); + private static final ObjectParser<NlpTaskConfig.Builder, Void> LENIENT_PARSER = createParser(true); - private static ObjectParser<TaskConfig.Builder, Void> createParser(boolean ignoreUnknownFields) { - ObjectParser<TaskConfig.Builder, Void> parser = new ObjectParser<>("task_config", + private static ObjectParser<NlpTaskConfig.Builder, Void> createParser(boolean ignoreUnknownFields) { + ObjectParser<NlpTaskConfig.Builder, Void> parser = new ObjectParser<>("task_config", ignoreUnknownFields, Builder::new); @@ -38,7 +38,7 @@ private static ObjectParser<TaskConfig.Builder, Void> createParser(boolean ignor return parser; } - public static TaskConfig fromXContent(XContentParser parser, boolean lenient) { + public static NlpTaskConfig fromXContent(XContentParser parser, boolean lenient) { return lenient ? LENIENT_PARSER.apply(parser, null).build() : STRICT_PARSER.apply(parser, null).build(); } @@ -50,7 +50,7 @@ public static String documentId(String model) { private final List<String> vocabulary; private final boolean doLowerCase; - TaskConfig(TaskType taskType, List<String> vocabulary, boolean doLowerCase) { + NlpTaskConfig(TaskType taskType, List<String> vocabulary, boolean doLowerCase) { this.taskType = taskType; this.vocabulary = vocabulary; this.doLowerCase = doLowerCase; @@ -77,7 +77,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - TaskConfig that = (TaskConfig) o; + NlpTaskConfig that = (NlpTaskConfig) o; return taskType == that.taskType && doLowerCase == that.doLowerCase && Objects.equals(vocabulary, that.vocabulary); @@ -118,8 +118,8 @@ public Builder setDoLowerCase(boolean doLowerCase) { return this; } - public TaskConfig build() { - return new TaskConfig(taskType, vocabulary, doLowerCase); + public NlpTaskConfig build() { + return new NlpTaskConfig(taskType, vocabulary, doLowerCase); } } } From 92c4123870db8bd8f7db434359629d25e73741a1 Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Thu, 27 May 2021 16:47:13 +0100 Subject: [PATCH 17/21] Heap based top k --- .../xpack/ml/inference/nlp/NlpHelpers.java | 58 +++++++++++++++++++ .../ml/inference/nlp/NlpHelpersTests.java | 35 ++++++----- 2 files changed, 79 insertions(+), 14 deletions(-) diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java index c908f11424191..3b1a3f4471a55 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java @@ -9,6 +9,9 @@ import org.elasticsearch.search.aggregations.pipeline.MovingFunctions; +import java.util.Objects; +import java.util.PriorityQueue; + public final class NlpHelpers { private NlpHelpers() {} @@ -57,6 +60,37 @@ static int argmax(double[] arr) { return maxIndex; } + + static ScoreAndIndex[] topKWithHeap(int k, double[] arr) { + PriorityQueue<ScoreAndIndex> minHeap = new PriorityQueue<>(k, (o1, o2) -> Double.compare(o1.score, o2.score)); + for (int i=0; i<k; i++) { + minHeap.add(new ScoreAndIndex(arr[i], i)); + } + + double minValue = minHeap.peek().score; + for (int i = k; i < arr.length; i++) { + if (arr[i] > minValue) { + minHeap.poll(); + minHeap.add(new ScoreAndIndex(arr[i], i)); + minValue = minHeap.peek().score; + } + } + + ScoreAndIndex[] result = new ScoreAndIndex[k]; + // The result should be ordered highest score first + // so reverse the min heap order + for (int i=k-1; i>=0; i--) { + result[i] = minHeap.poll(); + } + return result; + } + + /** + * + * @param k + * @param arr + * @return + */ static int[] topK(int k, double[] arr) { int[] topK = new int[k]; for (int i=0; i<k; i++) { @@ -98,4 +132,28 @@ private static int indexOfSmallestValue(int [] indices, double [] data) { } return minIndex; } + + static class ScoreAndIndex { + final double score; + final int index; + + ScoreAndIndex(double value, int index) { + this.score = value; + this.index = index; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ScoreAndIndex that = (ScoreAndIndex) o; + return Double.compare(that.score, score) == 0 && index == that.index; + } + + @Override + public int hashCode() { + return Objects.hash(score, index); + } + } + } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java index 9fceee69b916b..0cc0f22141634 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java @@ -77,8 +77,15 @@ public void testTopK() { int k = 3; double[] data = new double[]{1.0, 0.0, 2.0, 8.0, 9.0, 4.2, 4.2, 3.0}; int[] topKIndices = NlpHelpers.topK(k, data); - assertArrayEquals(new int[]{4, 3, 5}, topKIndices); + + NlpHelpers.ScoreAndIndex[] scoreAndIndices = NlpHelpers.topKWithHeap(k, data); + assertEquals(4, scoreAndIndices[0].index); + assertEquals(3, scoreAndIndices[1].index); + assertEquals(5, scoreAndIndices[2].index); + assertEquals(9.0, scoreAndIndices[0].score, 0.001); + assertEquals(8.0, scoreAndIndices[1].score, 0.001); + assertEquals(4.2, scoreAndIndices[2].score, 0.001); } { int k = 5; @@ -90,15 +97,6 @@ public void testTopK() { { // in this case use the standard java libraries to sort the // doubles and track the starting index of each value - class ValueAndStartIndex { - final double value; - final int originalIndex; - ValueAndStartIndex(double value, int index) { - this.value = value; - this.originalIndex = index; - } - } - int size = randomIntBetween(50, 100); int k = randomIntBetween(1, 10); double[] data = new double[size]; @@ -107,10 +105,10 @@ class ValueAndStartIndex { } AtomicInteger index = new AtomicInteger(0); - List<ValueAndStartIndex> sortedByValue = - Stream.generate(() -> new ValueAndStartIndex(data[index.get()], index.getAndIncrement())) + List<NlpHelpers.ScoreAndIndex> sortedByValue = + Stream.generate(() -> new NlpHelpers.ScoreAndIndex(data[index.get()], index.getAndIncrement())) .limit(size) - .sorted((o1, o2) -> Double.compare(o2.value, o1.value)) + .sorted((o1, o2) -> Double.compare(o2.score, o1.score)) .collect(Collectors.toList()); int[] topKIndices = NlpHelpers.topK(k, data); @@ -118,7 +116,16 @@ class ValueAndStartIndex { // now compare the starting indices in the sorted list // to the top k. for (int i=0; i<topKIndices.length; i++) { - assertEquals(sortedByValue.get(i).originalIndex, topKIndices[i]); + assertEquals(sortedByValue.get(i).index, topKIndices[i]); + } + + NlpHelpers.ScoreAndIndex[] scoreAndIndices = NlpHelpers.topKWithHeap(k, data); + assertEquals(k, scoreAndIndices.length); + + // now compare the starting indices in the sorted list + // to the top k. + for (int i=0; i<scoreAndIndices.length; i++) { + assertEquals(sortedByValue.get(i), scoreAndIndices[i]); } } } From b7a4a7f4f3f1164e8ba5a6efae8a389ccd9c227e Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Thu, 27 May 2021 20:07:51 +0100 Subject: [PATCH 18/21] Implement top k using a priority queue --- .../ml/inference/nlp/FillMaskProcessor.java | 9 +-- .../xpack/ml/inference/nlp/NlpHelpers.java | 74 +++++------------- .../ml/inference/nlp/NlpHelpersTests.java | 76 +++++++------------ 3 files changed, 54 insertions(+), 105 deletions(-) diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java index c2adc15fbddaa..09e9f18ddfe82 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java @@ -55,13 +55,12 @@ private InferenceResults processResult(PyTorchResult pyTorchResult) { int maskTokenIndex = tokenization.getTokens().indexOf(BertTokenizer.MASK_TOKEN); double[] normalizedScores = NlpHelpers.convertToProbabilitiesBySoftMax(pyTorchResult.getInferenceResult()[maskTokenIndex]); - int[] topKIds = NlpHelpers.topK(NUM_RESULTS, normalizedScores); + NlpHelpers.ScoreAndIndex[] scoreAndIndices = NlpHelpers.topK(NUM_RESULTS, normalizedScores); List<FillMaskResults.Result> results = new ArrayList<>(NUM_RESULTS); - for (int i=0; i<topKIds.length; i++) { - String predictedToken = tokenization.getFromVocab(topKIds[i]); - double score = normalizedScores[topKIds[i]]; + for (NlpHelpers.ScoreAndIndex scoreAndIndex : scoreAndIndices) { + String predictedToken = tokenization.getFromVocab(scoreAndIndex.index); String sequence = tokenization.getInput().replace(BertTokenizer.MASK_TOKEN, predictedToken); - results.add(new FillMaskResults.Result(predictedToken, score, sequence)); + results.add(new FillMaskResults.Result(predictedToken, scoreAndIndex.score, sequence)); } return new FillMaskResults(results); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java index 3b1a3f4471a55..617f4da8174d9 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java @@ -9,6 +9,7 @@ import org.elasticsearch.search.aggregations.pipeline.MovingFunctions; +import java.util.Comparator; import java.util.Objects; import java.util.PriorityQueue; @@ -49,7 +50,11 @@ static double[] convertToProbabilitiesBySoftMax(double[] scores) { return probabilities; } - + /** + * Find the index of the highest value in {@code arr} + * @param arr Array to search + * @return Index of highest value + */ static int argmax(double[] arr) { int maxIndex = 0; for (int i = 1; i < arr.length; i++) { @@ -61,8 +66,20 @@ static int argmax(double[] arr) { } - static ScoreAndIndex[] topKWithHeap(int k, double[] arr) { - PriorityQueue<ScoreAndIndex> minHeap = new PriorityQueue<>(k, (o1, o2) -> Double.compare(o1.score, o2.score)); + /** + * Find the top K highest values in {@code arr} and their + * index positions. Similar to {@link #argmax(double[])} + * but generalised to k instead of just 1. + * + * The function uses a PriorityQueue of size {@code k} to + * track the highest values + * @param k Number of values to track + * @param arr Array to search + * @return Index positions and values of the top k elements. + */ + static ScoreAndIndex[] topK(int k, double[] arr) { + PriorityQueue<ScoreAndIndex> minHeap = new PriorityQueue<>(k, Comparator.comparingDouble(o -> o.score)); + // initialise with the first k values for (int i=0; i<k; i++) { minHeap.add(new ScoreAndIndex(arr[i], i)); } @@ -85,55 +102,7 @@ static ScoreAndIndex[] topKWithHeap(int k, double[] arr) { return result; } - /** - * - * @param k - * @param arr - * @return - */ - static int[] topK(int k, double[] arr) { - int[] topK = new int[k]; - for (int i=0; i<k; i++) { - topK[i] = i; - } - - int min = indexOfSmallestValue(topK, arr); - for (int i = k; i < arr.length; i++) { - if (arr[i] > arr[topK[min]]) { - topK[min] = i; - min = indexOfSmallestValue(topK, arr); - } - } - - // Sort the result so the largest values are at the beginning - insertionSort(topK, arr); - return topK; - } - - // modifies indices - private static void insertionSort(int [] indices, double [] data) { - for (int i=1; i< indices.length; i++) { - int j = i; - while (j > 0 && data[indices[j-1]] < data[indices[j]]) { - int tmp = indices[j-1]; - indices[j-1] = indices[j]; - indices[j] = tmp; - j--; - } - } - } - - private static int indexOfSmallestValue(int [] indices, double [] data) { - int minIndex = 0; - for (int i=1; i<indices.length; i++) { - if (data[indices[i]] < data[indices[minIndex]]) { - minIndex = i; - } - } - return minIndex; - } - - static class ScoreAndIndex { + public static class ScoreAndIndex { final double score; final int index; @@ -155,5 +124,4 @@ public int hashCode() { return Objects.hash(score, index); } } - } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java index 0cc0f22141634..e5e8d9a39a6f9 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java @@ -72,61 +72,43 @@ public void testConvertToProbabilitiesBySoftMax_GivenRandom() { } } - public void testTopK() { - { - int k = 3; - double[] data = new double[]{1.0, 0.0, 2.0, 8.0, 9.0, 4.2, 4.2, 3.0}; - int[] topKIndices = NlpHelpers.topK(k, data); - assertArrayEquals(new int[]{4, 3, 5}, topKIndices); - - NlpHelpers.ScoreAndIndex[] scoreAndIndices = NlpHelpers.topKWithHeap(k, data); - assertEquals(4, scoreAndIndices[0].index); - assertEquals(3, scoreAndIndices[1].index); - assertEquals(5, scoreAndIndices[2].index); - assertEquals(9.0, scoreAndIndices[0].score, 0.001); - assertEquals(8.0, scoreAndIndices[1].score, 0.001); - assertEquals(4.2, scoreAndIndices[2].score, 0.001); - } - { - int k = 5; - double[] data = new double[]{10.0, 0.0, 2.0, 6.0, 9.0, 4.2, 7.6, 6.0, 0.2, 4.2, 3.0, 0.1, 4.0}; - int[] topKIndices = NlpHelpers.topK(k, data); + public void testTopK_SimpleCase() { + int k = 3; + double[] data = new double[]{1.0, 0.0, 2.0, 8.0, 9.0, 4.2, 4.2, 3.0}; + + NlpHelpers.ScoreAndIndex[] scoreAndIndices = NlpHelpers.topK(k, data); + assertEquals(4, scoreAndIndices[0].index); + assertEquals(3, scoreAndIndices[1].index); + assertEquals(5, scoreAndIndices[2].index); + assertEquals(9.0, scoreAndIndices[0].score, 0.001); + assertEquals(8.0, scoreAndIndices[1].score, 0.001); + assertEquals(4.2, scoreAndIndices[2].score, 0.001); + } - assertArrayEquals(new int[]{0, 4, 6, 7, 3}, topKIndices); + public void testTopK() { + // in this case use the standard java libraries to sort the + // doubles and track the starting index of each value + int size = randomIntBetween(50, 100); + int k = randomIntBetween(1, 10); + double[] data = new double[size]; + for (int i = 0; i < data.length; i++) { + data[i] = randomDouble(); } - { - // in this case use the standard java libraries to sort the - // doubles and track the starting index of each value - int size = randomIntBetween(50, 100); - int k = randomIntBetween(1, 10); - double[] data = new double[size]; - for (int i=0; i<data.length; i++) { - data[i] = randomDouble(); - } - AtomicInteger index = new AtomicInteger(0); - List<NlpHelpers.ScoreAndIndex> sortedByValue = - Stream.generate(() -> new NlpHelpers.ScoreAndIndex(data[index.get()], index.getAndIncrement())) + AtomicInteger index = new AtomicInteger(0); + List<NlpHelpers.ScoreAndIndex> sortedByValue = + Stream.generate(() -> new NlpHelpers.ScoreAndIndex(data[index.get()], index.getAndIncrement())) .limit(size) .sorted((o1, o2) -> Double.compare(o2.score, o1.score)) .collect(Collectors.toList()); - int[] topKIndices = NlpHelpers.topK(k, data); + NlpHelpers.ScoreAndIndex[] scoreAndIndices = NlpHelpers.topK(k, data); + assertEquals(k, scoreAndIndices.length); - // now compare the starting indices in the sorted list - // to the top k. - for (int i=0; i<topKIndices.length; i++) { - assertEquals(sortedByValue.get(i).index, topKIndices[i]); - } - - NlpHelpers.ScoreAndIndex[] scoreAndIndices = NlpHelpers.topKWithHeap(k, data); - assertEquals(k, scoreAndIndices.length); - - // now compare the starting indices in the sorted list - // to the top k. - for (int i=0; i<scoreAndIndices.length; i++) { - assertEquals(sortedByValue.get(i), scoreAndIndices[i]); - } + // now compare the starting indices in the sorted list + // to the top k. + for (int i = 0; i < scoreAndIndices.length; i++) { + assertEquals(sortedByValue.get(i), scoreAndIndices[i]); } } } From b744aa367f3fba31c8ba1ad115f98aec57dcd3a5 Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Thu, 27 May 2021 21:07:12 +0100 Subject: [PATCH 19/21] Fixes --- .../ml/action/TransportInferTrainedModelDeploymentAction.java | 4 +++- .../xpack/ml/inference/deployment/DeploymentManager.java | 2 +- .../ml/inference/pytorch/process/PyTorchResultProcessor.java | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java index be5a218985a13..7ff1157706079 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportInferTrainedModelDeploymentAction.java @@ -14,6 +14,7 @@ import org.elasticsearch.action.support.tasks.TransportTasksAction; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.inject.Inject; +import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.persistent.PersistentTasksCustomMetadata; import org.elasticsearch.tasks.Task; import org.elasticsearch.threadpool.ThreadPool; @@ -70,7 +71,8 @@ protected InferTrainedModelDeploymentAction.Response newResponse(InferTrainedMod @Override protected void taskOperation(InferTrainedModelDeploymentAction.Request request, TrainedModelDeploymentTask task, ActionListener<InferTrainedModelDeploymentAction.Response> listener) { - task.infer(request.getInput(), request.getTimeout(), + TimeValue timeout = request.getTimeout() == null ? TimeValue.timeValueSeconds(10) : request.getTimeout(); + task.infer(request.getInput(), timeout, ActionListener.wrap( pyTorchResult -> listener.onResponse(new InferTrainedModelDeploymentAction.Response(pyTorchResult)), listener::onFailure) diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java index 88d0b0938fd8e..fb9edba652f4b 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java @@ -176,7 +176,7 @@ public void onFailure(Exception e) { protected void doRun() { try { NlpTask.Processor processor = processContext.nlpTask.get().createProcessor(); - BytesReference request = processor.getRequestBuilder().buildRequest(requestId, input); + BytesReference request = processor.getRequestBuilder().buildRequest(input, requestId); logger.trace("Inference Request "+ request.utf8ToString()); processContext.process.get().writeInferenceRequest(request); diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pytorch/process/PyTorchResultProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pytorch/process/PyTorchResultProcessor.java index ce66226b65998..61311b3ff5a37 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pytorch/process/PyTorchResultProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/pytorch/process/PyTorchResultProcessor.java @@ -41,7 +41,7 @@ public void process(NativePyTorchProcess process) { logger.debug(() -> new ParameterizedMessage("[{}] Parsed result with id [{}]", deploymentId, result.getRequestId())); PendingResult pendingResult = pendingResults.get(result.getRequestId()); if (pendingResult == null) { - logger.debug(() -> new ParameterizedMessage("[{}] no pending result for [{}]", deploymentId, result.getRequestId())); + logger.warn(() -> new ParameterizedMessage("[{}] no pending result for [{}]", deploymentId, result.getRequestId())); } else { pendingResult.result = result; pendingResult.latch.countDown(); From 5abec25cc4baabcda9ff2372cf5807564b306a50 Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Tue, 1 Jun 2021 16:20:55 +0100 Subject: [PATCH 20/21] Fill Mask test --- .../ml/inference/results/FillMaskResults.java | 36 +++---- .../results/FillMaskResultsTests.java | 10 +- .../ml/inference/nlp/FillMaskProcessor.java | 38 +++++--- .../xpack/ml/inference/nlp/NlpHelpers.java | 8 +- .../xpack/ml/inference/nlp/NlpTask.java | 16 +++- .../inference/nlp/FillMaskProcessorTests.java | 93 +++++++++++++++++++ .../ml/inference/nlp/NlpHelpersTests.java | 12 +++ .../xpack/ml/inference/nlp/TaskTypeTests.java | 16 ---- 8 files changed, 170 insertions(+), 59 deletions(-) create mode 100644 x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessorTests.java delete mode 100644 x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/TaskTypeTests.java diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResults.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResults.java index b7dd6074d9293..b89defe347977 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResults.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResults.java @@ -26,25 +26,25 @@ public class FillMaskResults implements InferenceResults { public static final String NAME = "fill_mask_result"; public static final String DEFAULT_RESULTS_FIELD = "results"; - private final List<Result> results; + private final List<Prediction> predictions; - public FillMaskResults(List<Result> results) { - this.results = results; + public FillMaskResults(List<Prediction> predictions) { + this.predictions = predictions; } public FillMaskResults(StreamInput in) throws IOException { - this.results = in.readList(Result::new); + this.predictions = in.readList(Prediction::new); } - public List<Result> getResults() { - return results; + public List<Prediction> getPredictions() { + return predictions; } @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startArray(); - for (Result result : results) { - result.toXContent(builder, params); + for (Prediction prediction : predictions) { + prediction.toXContent(builder, params); } builder.endArray(); return builder; @@ -57,22 +57,22 @@ public String getWriteableName() { @Override public void writeTo(StreamOutput out) throws IOException { - out.writeList(results); + out.writeList(predictions); } @Override public Map<String, Object> asMap() { Map<String, Object> map = new LinkedHashMap<>(); - map.put(DEFAULT_RESULTS_FIELD, results.stream().map(Result::toMap).collect(Collectors.toList())); + map.put(DEFAULT_RESULTS_FIELD, predictions.stream().map(Prediction::toMap).collect(Collectors.toList())); return map; } @Override public Object predictedValue() { - if (results.isEmpty()) { + if (predictions.isEmpty()) { return null; } - return results.get(0).token; + return predictions.get(0).token; } @Override @@ -80,15 +80,15 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; FillMaskResults that = (FillMaskResults) o; - return Objects.equals(results, that.results); + return Objects.equals(predictions, that.predictions); } @Override public int hashCode() { - return Objects.hash(results); + return Objects.hash(predictions); } - public static class Result implements ToXContentObject, Writeable { + public static class Prediction implements ToXContentObject, Writeable { private static final ParseField TOKEN = new ParseField("token"); private static final ParseField SCORE = new ParseField("score"); @@ -98,13 +98,13 @@ public static class Result implements ToXContentObject, Writeable { private final double score; private final String sequence; - public Result(String token, double score, String sequence) { + public Prediction(String token, double score, String sequence) { this.token = Objects.requireNonNull(token); this.score = score; this.sequence = Objects.requireNonNull(sequence); } - public Result(StreamInput in) throws IOException { + public Prediction(StreamInput in) throws IOException { token = in.readString(); score = in.readDouble(); sequence = in.readString(); @@ -151,7 +151,7 @@ public void writeTo(StreamOutput out) throws IOException { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - Result result = (Result) o; + Prediction result = (Prediction) o; return Double.compare(result.score, score) == 0 && Objects.equals(token, result.token) && Objects.equals(sequence, result.sequence); diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResultsTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResultsTests.java index f353fe8336abf..57867b6091d0f 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResultsTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/FillMaskResultsTests.java @@ -26,9 +26,9 @@ protected Writeable.Reader<FillMaskResults> instanceReader() { @Override protected FillMaskResults createTestInstance() { int numResults = randomIntBetween(0, 3); - List<FillMaskResults.Result> resultList = new ArrayList<>(); + List<FillMaskResults.Prediction> resultList = new ArrayList<>(); for (int i=0; i<numResults; i++) { - resultList.add(new FillMaskResults.Result(randomAlphaOfLength(4), randomDouble(), randomAlphaOfLength(4))); + resultList.add(new FillMaskResults.Prediction(randomAlphaOfLength(4), randomDouble(), randomAlphaOfLength(4))); } return new FillMaskResults(resultList); } @@ -38,9 +38,9 @@ public void testAsMap() { FillMaskResults testInstance = createTestInstance(); Map<String, Object> asMap = testInstance.asMap(); List<Map<String, Object>> resultList = (List<Map<String, Object>>)asMap.get("results"); - assertThat(resultList, hasSize(testInstance.getResults().size())); - for (int i=0; i<testInstance.getResults().size(); i++) { - FillMaskResults.Result result = testInstance.getResults().get(i); + assertThat(resultList, hasSize(testInstance.getPredictions().size())); + for (int i = 0; i<testInstance.getPredictions().size(); i++) { + FillMaskResults.Prediction result = testInstance.getPredictions().get(i); Map<String, Object> map = resultList.get(i); assertThat(map.get("score"), equalTo(result.getScore())); assertThat(map.get("token"), equalTo(result.getToken())); diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java index 09e9f18ddfe82..9333760594295 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessor.java @@ -15,7 +15,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; public class FillMaskProcessor implements NlpTask.Processor { @@ -27,6 +26,23 @@ public class FillMaskProcessor implements NlpTask.Processor { this.bertRequestBuilder = new BertRequestBuilder(tokenizer); } + @Override + public void validateInputs(String inputs) { + if (inputs.isBlank()) { + throw new IllegalArgumentException("input request is empty"); + } + + int maskIndex = inputs.indexOf(BertTokenizer.MASK_TOKEN); + if (maskIndex < 0) { + throw new IllegalArgumentException("no " + BertTokenizer.MASK_TOKEN + " token could be found"); + } + + maskIndex = inputs.indexOf(BertTokenizer.MASK_TOKEN, maskIndex + BertTokenizer.MASK_TOKEN.length()); + if (maskIndex > 0) { + throw new IllegalArgumentException("only one " + BertTokenizer.MASK_TOKEN + " token should exist in the input"); + } + } + @Override public NlpTask.RequestBuilder getRequestBuilder() { return bertRequestBuilder; @@ -34,33 +50,25 @@ public NlpTask.RequestBuilder getRequestBuilder() { @Override public NlpTask.ResultProcessor getResultProcessor() { - return this::processResult; + return (pyTorchResult) -> processResult(bertRequestBuilder.getTokenization(), pyTorchResult); } - private InferenceResults processResult(PyTorchResult pyTorchResult) { - BertTokenizer.TokenizationResult tokenization = bertRequestBuilder.getTokenization(); + InferenceResults processResult(BertTokenizer.TokenizationResult tokenization, + PyTorchResult pyTorchResult) { if (tokenization.getTokens().isEmpty()) { return new FillMaskResults(Collections.emptyList()); } - List<String> maskTokens = tokenization.getTokens().stream() - .filter(BertTokenizer.MASK_TOKEN::equals) - .collect(Collectors.toList()); - if (maskTokens.isEmpty()) { - throw new IllegalArgumentException("no [MASK] token could be found"); - } - if (maskTokens.size() > 1) { - throw new IllegalArgumentException("only one [MASK] token should exist in the input"); - } + int maskTokenIndex = tokenization.getTokens().indexOf(BertTokenizer.MASK_TOKEN); double[] normalizedScores = NlpHelpers.convertToProbabilitiesBySoftMax(pyTorchResult.getInferenceResult()[maskTokenIndex]); NlpHelpers.ScoreAndIndex[] scoreAndIndices = NlpHelpers.topK(NUM_RESULTS, normalizedScores); - List<FillMaskResults.Result> results = new ArrayList<>(NUM_RESULTS); + List<FillMaskResults.Prediction> results = new ArrayList<>(NUM_RESULTS); for (NlpHelpers.ScoreAndIndex scoreAndIndex : scoreAndIndices) { String predictedToken = tokenization.getFromVocab(scoreAndIndex.index); String sequence = tokenization.getInput().replace(BertTokenizer.MASK_TOKEN, predictedToken); - results.add(new FillMaskResults.Result(predictedToken, scoreAndIndex.score, sequence)); + results.add(new FillMaskResults.Prediction(predictedToken, scoreAndIndex.score, sequence)); } return new FillMaskResults(results); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java index 617f4da8174d9..1509f5172e8f7 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpers.java @@ -69,15 +69,21 @@ static int argmax(double[] arr) { /** * Find the top K highest values in {@code arr} and their * index positions. Similar to {@link #argmax(double[])} - * but generalised to k instead of just 1. + * but generalised to k instead of just 1. If {@code arr.length < k} + * then {@code arr.length} items are returned. * * The function uses a PriorityQueue of size {@code k} to * track the highest values + * * @param k Number of values to track * @param arr Array to search * @return Index positions and values of the top k elements. */ static ScoreAndIndex[] topK(int k, double[] arr) { + if (k > arr.length) { + k = arr.length; + } + PriorityQueue<ScoreAndIndex> minHeap = new PriorityQueue<>(k, Comparator.comparingDouble(o -> o.score)); // initialise with the first k values for (int i=0; i<k; i++) { diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java index cf5352c3fcb1c..3e3065c5f1b9a 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NlpTask.java @@ -19,6 +19,10 @@ public class NlpTask { private final TaskType taskType; private final BertTokenizer tokenizer; + public static NlpTask fromConfig(NlpTaskConfig config) { + return new NlpTask(config.getTaskType(), config.buildTokenizer()); + } + private NlpTask(TaskType taskType, BertTokenizer tokenizer) { this.taskType = taskType; this.tokenizer = tokenizer; @@ -28,10 +32,6 @@ public Processor createProcessor() throws IOException { return taskType.createProcessor(tokenizer); } - public static NlpTask fromConfig(NlpTaskConfig config) { - return new NlpTask(config.getTaskType(), config.buildTokenizer()); - } - public interface RequestBuilder { BytesReference buildRequest(String inputs, String requestId) throws IOException; } @@ -41,6 +41,14 @@ public interface ResultProcessor { } public interface Processor { + /** + * Validate the task input. + * Throws an exception if the inputs fail validation + * + * @param inputs Text to validate + */ + void validateInputs(String inputs); + RequestBuilder getRequestBuilder(); ResultProcessor getResultProcessor(); } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessorTests.java new file mode 100644 index 0000000000000..4a2b65670f13c --- /dev/null +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/FillMaskProcessorTests.java @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.ml.inference.nlp; + +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xpack.core.ml.inference.deployment.PyTorchResult; +import org.elasticsearch.xpack.core.ml.inference.results.FillMaskResults; +import org.elasticsearch.xpack.ml.inference.nlp.tokenizers.BertTokenizer; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.hasSize; +import static org.mockito.Mockito.mock; + +public class FillMaskProcessorTests extends ESTestCase { + + public void testProcessResults() { + // only the scores of the MASK index array + // are used the rest is filler + double[][] scores = { + { 0, 0, 0, 0, 0, 0, 0}, // The + { 0, 0, 0, 0, 0, 0, 0}, // capital + { 0, 0, 0, 0, 0, 0, 0}, // of + { 0.01, 0.01, 0.3, 0.1, 0.01, 0.2, 1.2}, // MASK + { 0, 0, 0, 0, 0, 0, 0}, // is + { 0, 0, 0, 0, 0, 0, 0} // paris + }; + + String input = "The capital of " + BertTokenizer.MASK_TOKEN + " is Paris"; + + List<String> vocab = Arrays.asList("The", "capital", "of", BertTokenizer.MASK_TOKEN, "is", "Paris", "France"); + List<String> tokens = Arrays.asList(input.split(" ")); + int[] tokenMap = new int[] {0, 1, 2, 3, 4, 5}; + int[] tokenIds = new int[] {0, 1, 2, 3, 4, 5}; + + BertTokenizer.TokenizationResult tokenization = new BertTokenizer.TokenizationResult(input, vocab, tokens, + tokenIds, tokenMap); + + FillMaskProcessor processor = new FillMaskProcessor(mock(BertTokenizer.class)); + FillMaskResults result = (FillMaskResults) processor.processResult(tokenization, new PyTorchResult("1", scores, null)); + assertThat(result.getPredictions(), hasSize(5)); + FillMaskResults.Prediction prediction = result.getPredictions().get(0); + assertEquals("France", prediction.getToken()); + assertEquals("The capital of France is Paris", prediction.getSequence()); + + prediction = result.getPredictions().get(1); + assertEquals("of", prediction.getToken()); + assertEquals("The capital of of is Paris", prediction.getSequence()); + + prediction = result.getPredictions().get(2); + assertEquals("Paris", prediction.getToken()); + assertEquals("The capital of Paris is Paris", prediction.getSequence()); + } + + public void testProcessResults_GivenMissingTokens() { + BertTokenizer.TokenizationResult tokenization = + new BertTokenizer.TokenizationResult("", Collections.emptyList(), Collections.emptyList(), + new int[] {}, new int[] {}); + + FillMaskProcessor processor = new FillMaskProcessor(mock(BertTokenizer.class)); + PyTorchResult pyTorchResult = new PyTorchResult("1", new double[][]{{}}, null); + FillMaskResults result = (FillMaskResults) processor.processResult(tokenization, pyTorchResult); + assertThat(result.getPredictions(), empty()); + } + + public void testValidate_GivenMissingMaskToken() { + String input = "The capital of France is Paris"; + + FillMaskProcessor processor = new FillMaskProcessor(mock(BertTokenizer.class)); + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + () -> processor.validateInputs(input)); + assertThat(e.getMessage(), containsString("no [MASK] token could be found")); + } + + + public void testProcessResults_GivenMultipleMaskTokens() { + String input = "The capital of [MASK] is [MASK]"; + + FillMaskProcessor processor = new FillMaskProcessor(mock(BertTokenizer.class)); + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + () -> processor.validateInputs(input)); + assertThat(e.getMessage(), containsString("only one [MASK] token should exist in the input")); + } +} diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java index e5e8d9a39a6f9..bb72f3ee88069 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/NlpHelpersTests.java @@ -111,4 +111,16 @@ public void testTopK() { assertEquals(sortedByValue.get(i), scoreAndIndices[i]); } } + + public void testTopK_KGreaterThanArrayLength() { + int k = 6; + double[] data = new double[]{1.0, 0.0, 2.0, 8.0}; + + NlpHelpers.ScoreAndIndex[] scoreAndIndices = NlpHelpers.topK(k, data); + assertEquals(4, scoreAndIndices.length); + assertEquals(3, scoreAndIndices[0].index); + assertEquals(2, scoreAndIndices[1].index); + assertEquals(0, scoreAndIndices[2].index); + assertEquals(1, scoreAndIndices[3].index); + } } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/TaskTypeTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/TaskTypeTests.java deleted file mode 100644 index 25faba9248f81..0000000000000 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/inference/nlp/TaskTypeTests.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -package org.elasticsearch.xpack.ml.inference.nlp; - -import org.elasticsearch.test.ESTestCase; - - -public class TaskTypeTests extends ESTestCase { - - -} From ff2a6c1f83e0030d2f705b65afe3d5aa1d70099d Mon Sep 17 00:00:00 2001 From: David Kyle <david.kyle@elastic.co> Date: Tue, 1 Jun 2021 16:21:19 +0100 Subject: [PATCH 21/21] Check for error from pytorch results --- .../ml/inference/deployment/PyTorchResult.java | 8 ++++++++ .../deployment/DeploymentManager.java | 18 +++++++++++++----- .../xpack/ml/inference/nlp/NerProcessor.java | 4 ++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/deployment/PyTorchResult.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/deployment/PyTorchResult.java index e0eaf0910045a..5cc0cf0c4d4e2 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/deployment/PyTorchResult.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/deployment/PyTorchResult.java @@ -81,6 +81,14 @@ public String getRequestId() { return requestId; } + public boolean isError() { + return error != null; + } + + public String getError() { + return error; + } + public double[][] getInferenceResult() { return inference; } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java index fb9edba652f4b..0316271818164 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/deployment/DeploymentManager.java @@ -176,6 +176,7 @@ public void onFailure(Exception e) { protected void doRun() { try { NlpTask.Processor processor = processContext.nlpTask.get().createProcessor(); + processor.validateInputs(input); BytesReference request = processor.getRequestBuilder().buildRequest(input, requestId); logger.trace("Inference Request "+ request.utf8ToString()); processContext.process.get().writeInferenceRequest(request); @@ -199,12 +200,19 @@ private void waitForResult(ProcessContext processContext, if (pyTorchResult == null) { listener.onFailure(new ElasticsearchStatusException("timeout [{}] waiting for inference result", RestStatus.TOO_MANY_REQUESTS, timeout)); - } else { - logger.debug(() -> new ParameterizedMessage("[{}] retrieved result for request [{}]", processContext.modelId, requestId)); - InferenceResults results = inferenceResultsProcessor.processResult(pyTorchResult); - logger.debug(() -> new ParameterizedMessage("[{}] processed result for request [{}]", processContext.modelId, requestId)); - listener.onResponse(results); + return; } + + if (pyTorchResult.isError()) { + listener.onFailure(new ElasticsearchStatusException(pyTorchResult.getError(), + RestStatus.INTERNAL_SERVER_ERROR)); + return; + } + + logger.debug(() -> new ParameterizedMessage("[{}] retrieved result for request [{}]", processContext.modelId, requestId)); + InferenceResults results = inferenceResultsProcessor.processResult(pyTorchResult); + logger.debug(() -> new ParameterizedMessage("[{}] processed result for request [{}]", processContext.modelId, requestId)); + listener.onResponse(results); } catch (InterruptedException e) { listener.onFailure(e); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessor.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessor.java index df1c2dba91ad6..730b6f548ebcd 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessor.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/nlp/NerProcessor.java @@ -64,6 +64,10 @@ boolean isBeginning() { this.bertRequestBuilder = new BertRequestBuilder(tokenizer); } + @Override + public void validateInputs(String inputs) { + // No validation + } @Override public NlpTask.RequestBuilder getRequestBuilder() {