diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml
index 4ed79ca80..a998e6b2d 100644
--- a/.github/workflows/run-e2e-tests.yml
+++ b/.github/workflows/run-e2e-tests.yml
@@ -14,9 +14,16 @@ on:
- 'powertools-idempotency/**'
- 'powertools-parameters/**'
- 'powertools-metrics/**'
+ - 'powertools-large-messages/**'
- 'pom.xml'
- '.github/workflows/**'
+ pull_request:
+ branches:
+ - main
+ paths:
+ - 'powertools-e2e-tests/**'
+
jobs:
e2e:
runs-on: ubuntu-latest
diff --git a/docs/utilities/large_messages.md b/docs/utilities/large_messages.md
new file mode 100644
index 000000000..c4947a6e8
--- /dev/null
+++ b/docs/utilities/large_messages.md
@@ -0,0 +1,419 @@
+---
+title: Large Messages
+description: Utility
+---
+
+The large message utility handles SQS and SNS messages which have had their payloads
+offloaded to S3 if they are larger than the maximum allowed size (256 KB).
+
+!!! Notice
+ The large message utility (available in the `powertools-sqs` module for versions v1.16.1 and earlier) is now deprecated
+ and replaced by the `powertools-large-messages` described in this page.
+ You can still get the documentation [here](sqs_large_message_handling.md)
+ and the migration guide [here](#migration-from-the-sqs-large-message-utility).
+
+## Features
+
+- Automatically retrieve the content of S3 objects when SQS or SNS messages have been offloaded to S3.
+- Automatically delete the S3 Objects after processing succeeds.
+- Compatible with the batch module (with SQS).
+
+## Background
+
+```mermaid
+stateDiagram-v2
+ direction LR
+ Function : Lambda Function
+
+ state Application {
+ direction TB
+ sendMsg: sendMessage(QueueUrl, MessageBody)
+ extendLib: extended-client-lib
+ [*] --> sendMsg
+ sendMsg --> extendLib
+ state extendLib {
+ state if_big <>
+ bigMsg: MessageBody > 256KB ?
+ putObject: putObject(S3Bucket, S3Key, Body)
+ updateMsg: Update MessageBody with a pointer to S3 and add a message attribute
+ bigMsg --> if_big
+ if_big --> [*]: size(body) <= 256kb
+ if_big --> putObject: size(body) > 256kb
+ putObject --> updateMsg
+ updateMsg --> [*]
+ }
+ }
+
+ state Function {
+ direction TB
+ iterateMsgs: Iterate over messages
+ ptLargeMsg: powertools-large-messages
+ [*] --> Handler
+ Handler --> iterateMsgs
+ iterateMsgs --> ptLargeMsg
+ state ptLargeMsg {
+ state if_pointer <>
+ pointer: Message attribute for large message ?
+ normalMsg: Small message, body left unchanged
+ getObject: getObject(S3Pointer)
+ deleteObject: deleteObject(S3Pointer)
+ updateBody: Update message body with content from S3 object and remove message attribute
+ updateMD5: Update MD5 of the body and attributes (SQS only)
+ yourcode: YOUR CODE HERE!
+ pointer --> if_pointer
+ if_pointer --> normalMsg : False
+ normalMsg --> [*]
+ if_pointer --> getObject : True
+ getObject --> updateBody
+ updateBody --> updateMD5
+ updateMD5 --> yourcode
+ yourcode --> deleteObject
+ deleteObject --> [*]
+ }
+ }
+
+ [*] --> Application
+ Application --> Function : Lambda Invocation
+ Function --> [*]
+
+```
+
+SQS and SNS message payload is limited to 256KB. If you wish to send messages with a larger payload, you can leverage the
+[amazon-sqs-java-extended-client-lib](https://github.com/awslabs/amazon-sqs-java-extended-client-lib)
+or [amazon-sns-java-extended-client-lib](https://github.com/awslabs/amazon-sns-java-extended-client-lib) which
+offload the message to Amazon S3. See documentation
+([SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-s3-messages.html)
+/ [SNS](https://docs.aws.amazon.com/sns/latest/dg/large-message-payloads.html))
+
+When offloaded to S3, the message contains a specific message attribute and the payload only contains a pointer to the
+S3 object (bucket and object key).
+
+This utility automatically retrieves messages which have been offloaded to S3 using the
+extended client libraries. Once a message's payload has been processed successfully, the
+utility deletes the payload from S3.
+
+This utility is compatible with
+versions *[1.1.0+](https://github.com/awslabs/amazon-sqs-java-extended-client-lib/releases/tag/1.1.0)*
+of amazon-sqs-java-extended-client-lib
+and *[1.0.0+](https://github.com/awslabs/amazon-sns-java-extended-client-lib/releases/tag/1.0.0)*
+of amazon-sns-java-extended-client-lib.
+
+## Install
+
+Depending on your version of Java (either Java 1.8 or 11+), the configuration slightly changes.
+
+=== "Maven Java 11+"
+```xml hl_lines="3-7 16 18 24-27"
+
+...
+
+software.amazon.lambda
+powertools-large-messages
+{{ powertools.version }}
+
+...
+
+...
+
+
+
+...
+
+dev.aspectj
+aspectj-maven-plugin
+1.13.1
+
+11
+11
+11
+
+
+software.amazon.lambda
+powertools-large-messages
+
+
+
+
+
+
+compile
+
+
+
+
+...
+
+
+```
+
+=== "Maven Java 1.8"
+
+ ```xml hl_lines="3-7 16 18 24-27"
+
+ ...
+
+ software.amazon.lambda
+ powertools-large-messages
+ {{ powertools.version }}
+
+ ...
+
+ ...
+
+
+
+ ...
+
+ org.codehaus.mojo
+ aspectj-maven-plugin
+ 1.14.0
+
+ 1.8
+ 1.8
+ 1.8
+
+
+ software.amazon.lambda
+ powertools-large-messages
+
+
+
+
+
+
+ compile
+
+
+
+
+ ...
+
+
+ ```
+
+=== "Gradle Java 11+"
+
+ ```groovy hl_lines="3 11"
+ plugins {
+ id 'java'
+ id 'io.freefair.aspectj.post-compile-weaving' version '8.1.0'
+ }
+
+ repositories {
+ mavenCentral()
+ }
+
+ dependencies {
+ aspect 'software.amazon.lambda:powertools-large-messages:{{ powertools.version }}'
+ }
+
+ sourceCompatibility = 11 // or higher
+ targetCompatibility = 11 // or higher
+ ```
+
+=== "Gradle Java 1.8"
+
+ ```groovy hl_lines="3 11"
+ plugins {
+ id 'java'
+ id 'io.freefair.aspectj.post-compile-weaving' version '6.6.3'
+ }
+
+ repositories {
+ mavenCentral()
+ }
+
+ dependencies {
+ aspect 'software.amazon.lambda:powertools-large-messages:{{ powertools.version }}'
+ }
+
+ sourceCompatibility = 1.8
+ targetCompatibility = 1.8
+ ```
+
+## Permissions
+
+As the utility interacts with Amazon S3, the lambda function must have the following permissions
+on the S3 bucket used for the large messages offloading:
+
+- `s3:GetObject`
+- `s3:DeleteObject`
+
+## Annotation
+
+The annotation `@LargeMessage` can be used on any method where the *first* parameter is one of:
+
+- `SQSEvent.SQSMessage`
+- `SNSEvent.SNSRecord`
+
+=== "SQS Example"
+
+ ```java hl_lines="8 13 15"
+ import software.amazon.lambda.powertools.largemessages.LargeMessage;
+
+ public class SqsMessageHandler implements RequestHandler {
+
+ @Override
+ public SQSBatchResponse handleRequest(SQSEvent event, Context context) {
+ for (SQSMessage message: event.getRecords()) {
+ processRawMessage(message, context);
+ }
+ return SQSBatchResponse.builder().build();
+ }
+
+ @LargeMessage
+ private void processRawMessage(SQSEvent.SQSMessage sqsMessage, Context context) {
+ // sqsMessage.getBody() will contain the content of the S3 object
+ }
+ }
+ ```
+
+=== "SNS Example"
+
+ ```java hl_lines="7 11 13"
+ import software.amazon.lambda.powertools.largemessages.LargeMessage;
+
+ public class SnsRecordHandler implements RequestHandler {
+
+ @Override
+ public String handleRequest(SNSEvent event, Context context) {
+ processSNSRecord(event.records.get(0)); // there are always only one message
+ return "Hello World";
+ }
+
+ @LargeMessage
+ private void processSNSRecord(SNSEvent.SNSRecord snsRecord) {
+ // snsRecord.getSNS().getMessage() will contain the content of the S3 object
+ }
+ }
+ ```
+
+When the Lambda function is invoked with a SQS or SNS event, the utility first
+checks if the content was offloaded to S3. In the case of a large message, there is a message attribute
+specifying the size of the offloaded message and the message contains a pointer to the S3 object.
+
+If this is the case, the utility will retrieve the object from S3 using the `getObject(bucket, key)` API,
+and place the content of the object in the message payload. You can then directly use the content of the message.
+If there was an error during the S3 download, the function will fail with a `LargeMessageProcessingException`.
+
+After your code is invoked and returns without error, the object is deleted from S3
+using the `deleteObject(bucket, key)` API. You can disable the deletion of S3 objects with the following configuration:
+
+=== "Don't delete S3 Objects"
+ ```java
+ @LargeMessage(deleteS3Object = false)
+ private void processRawMessage(SQSEvent.SQSMessage sqsMessage) {
+ // do something with the message
+ }
+ ```
+
+!!! tip "Use together with batch module"
+ This utility works perfectly together with the batch module (`powertools-batch`), especially for SQS:
+
+ ```java hl_lines="2 5-7 12 15 16" title="Combining batch and large message modules"
+ public class SqsBatchHandler implements RequestHandler {
+ private final BatchMessageHandler handler;
+
+ public SqsBatchHandler() {
+ handler = new BatchMessageHandlerBuilder()
+ .withSqsBatchHandler()
+ .buildWithRawMessageHandler(this::processMessage);
+ }
+
+ @Override
+ public SQSBatchResponse handleRequest(SQSEvent sqsEvent, Context context) {
+ return handler.processBatch(sqsEvent, context);
+ }
+
+ @LargeMessage
+ private void processMessage(SQSEvent.SQSMessage sqsMessage) {
+ // do something with the message
+ }
+ }
+ ```
+
+!!! tip "Use together with idempotency module"
+ This utility also works together with the idempotency module (`powertools-idempotency`).
+ You can add both the `@LargeMessage` and `@Idempotent` annotations, in any order, to the same method.
+ The `@Idempotent` takes precedence over the `@LargeMessage` annotation.
+ It means Idempotency module will use the initial raw message (containing the S3 pointer) and not the large message.
+
+ ```java hl_lines="6 23-25" title="Combining idempotency and large message modules"
+ public class SqsBatchHandler implements RequestHandler {
+
+ public SqsBatchHandler() {
+ Idempotency.config().withConfig(
+ IdempotencyConfig.builder()
+ .withEventKeyJMESPath("body") // get the body of the message for the idempotency key
+ .build())
+ .withPersistenceStore(
+ DynamoDBPersistenceStore.builder()
+ .withTableName(System.getenv("IDEMPOTENCY_TABLE"))
+ .build()
+ ).configure();
+ }
+
+ @Override
+ public SQSBatchResponse handleRequest(SQSEvent sqsEvent, Context context) {
+ for (SQSMessage message: event.getRecords()) {
+ processRawMessage(message, context);
+ }
+ return SQSBatchResponse.builder().build();
+ }
+
+ @Idempotent
+ @LargeMessage
+ private String processRawMessage(@IdempotencyKey SQSEvent.SQSMessage sqsMessage, Context context) {
+ // do something with the message
+ }
+ }
+ ```
+
+## Customizing S3 client configuration
+
+To interact with S3, the utility creates a default S3 Client :
+
+=== "Default S3 Client"
+ ```java
+ S3Client client = S3Client.builder()
+ .httpClient(UrlConnectionHttpClient.builder().build())
+ .region(Region.of(System.getenv(AWS_REGION_ENV)))
+ .build();
+ ```
+
+If you need to customize this `S3Client`, you can leverage the `LargeMessageConfig` singleton:
+
+=== "Custom S3 Client"
+ ```java hl_lines="6"
+ import software.amazon.lambda.powertools.largemessages.LargeMessage;
+
+ public class SnsRecordHandler implements RequestHandler {
+
+ public SnsRecordHandler() {
+ LargeMessageConfig.init().withS3Client(/* put your custom S3Client here */);
+ }
+
+ @Override
+ public String handleRequest(SNSEvent event, Context context) {
+ processSNSRecord(event.records.get(0));
+ return "Hello World";
+ }
+
+ @LargeMessage
+ private void processSNSRecord(SNSEvent.SNSRecord snsRecord) {
+ // snsRecord.getSNS().getMessage() will contain the content of the S3 object
+ }
+ }
+ ```
+
+## Migration from the SQS Large Message utility
+
+- Replace the dependency in maven / gradle: `powertools-sqs` ==> `powertools-large-messages`
+- Replace the annotation: `@SqsLargeMessage` ==> `@LargeMessage` (the new module handles both SQS and SNS)
+- Move the annotation away from the Lambda `handleRequest` method and put it on a method with `SQSEvent.SQSMessage`
+ or `SNSEvent.SNSRecord` as first parameter.
+- The annotation now handles a single message, contrary to the previous version that was handling the complete batch.
+ It gives more control, especially when dealing with partial failures with SQS (see the batch module).
+- The new module only provides an annotation, an equivalent to the `SqsUtils` class is not available anymore in this new version.
+
+Finally, if you are still using the `powertools-sqs` library for batch processing, consider moving to `powertools-batch` at the same time to remove the dependency on this library completely; it has been deprecated and will be removed in v2.
\ No newline at end of file
diff --git a/docs/utilities/sqs_large_message_handling.md b/docs/utilities/sqs_large_message_handling.md
index 82e1afef4..6308f1c79 100644
--- a/docs/utilities/sqs_large_message_handling.md
+++ b/docs/utilities/sqs_large_message_handling.md
@@ -3,6 +3,10 @@ title: SQS Large Message Handling
description: Utility
---
+!!! warning
+This module is now deprecated and will be removed in version 2.
+See [Large Message Handling](large_messages.md) for the new module (`powertools-large-messages`) documentation.
+
The large message handling utility handles SQS messages which have had their payloads
offloaded to S3 due to them being larger than the SQS maximum.
@@ -11,16 +15,19 @@ The utility automatically retrieves messages which have been offloaded to S3 usi
client library. Once the message payloads have been processed successful the
utility can delete the message payloads from S3.
-This utility is compatible with versions *[1.1.0+](https://github.com/awslabs/amazon-sqs-java-extended-client-lib)* of amazon-sqs-java-extended-client-lib.
+This utility is compatible with versions *[1.1.0+](https://github.com/awslabs/amazon-sqs-java-extended-client-lib)* of
+amazon-sqs-java-extended-client-lib.
=== "Maven"
- ```xml
-
- com.amazonaws
- amazon-sqs-java-extended-client-lib
- 1.1.0
-
- ```
+
+```xml
+
+
+ com.amazonaws
+ amazon-sqs-java-extended-client-lib
+ 1.1.0
+
+```
=== "Gradle"
```groovy
@@ -33,48 +40,49 @@ This utility is compatible with versions *[1.1.0+](https://github.com/awslabs/am
Depending on your version of Java (either Java 1.8 or 11+), the configuration slightly changes.
=== "Maven Java 11+"
- ```xml hl_lines="3-7 16 18 24-27"
-
- ...
-
- software.amazon.lambda
- powertools-sqs
- {{ powertools.version }}
-
- ...
-
- ...
-
-
-
- ...
-
- dev.aspectj
- aspectj-maven-plugin
- 1.13.1
-
- 11
- 11
- 11
-
-
- software.amazon.lambda
- powertools-sqs
-
-
-
-
-
-
- compile
-
-
-
-
- ...
-
-
- ```
+
+```xml hl_lines="3-7 16 18 24-27"
+
+...
+
+software.amazon.lambda
+powertools-sqs
+{{ powertools.version }}
+
+...
+
+...
+
+
+
+...
+
+dev.aspectj
+aspectj-maven-plugin
+1.13.1
+
+11
+11
+11
+
+
+software.amazon.lambda
+powertools-sqs
+
+
+
+
+
+
+compile
+
+
+
+
+...
+
+
+```
=== "Maven Java 1.8"
@@ -186,12 +194,13 @@ which implements `com.amazonaws.services.lambda.runtime.RequestHandler` with
`@SqsLargeMessage` creates a default S3 Client `AmazonS3 amazonS3 = AmazonS3ClientBuilder.defaultClient()`.
-!!! tip
- When the Lambda function is invoked with an event from SQS, each received record
- in the SQSEvent is checked to see to validate if it is offloaded to S3.
- If it does then `getObject(bucket, key)` will be called, and the payload retrieved.
- If there is an error during this process then the function will fail with a `FailedProcessingLargePayloadException` exception.
-
+!!! tip
+When the Lambda function is invoked with an event from SQS, each received record
+in the SQSEvent is checked to see to validate if it is offloaded to S3.
+If it does then `getObject(bucket, key)` will be called, and the payload retrieved.
+If there is an error during this process then the function will fail with a `FailedProcessingLargePayloadException`
+exception.
+
If the request handler method returns without error then each payload will be
deleted from S3 using `deleteObject(bucket, key)`
diff --git a/mkdocs.yml b/mkdocs.yml
index 841a95fae..62d8d75ce 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -13,7 +13,7 @@ nav:
- Utilities:
- utilities/idempotency.md
- utilities/parameters.md
- - utilities/sqs_large_message_handling.md
+ - utilities/large_messages.md
- utilities/batch.md
- utilities/validation.md
- utilities/custom_resources.md
diff --git a/pom.xml b/pom.xml
index 1d80b3081..3e751f186 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,6 +52,7 @@
powertools-test-suite
powertools-cloudformation
powertools-idempotency
+ powertools-large-messages
powertools-e2e-tests
examples
@@ -89,7 +90,7 @@
3.5.0
3.3.0
3.1.0
- 5.9.3
+ 5.10.0
1.0.6
0.5.1
@@ -243,21 +244,16 @@
- org.junit.jupiter
- junit-jupiter-api
- ${junit-jupiter.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit-jupiter.version}
- test
+ org.junit
+ junit-bom
+ ${junit.version}
+ pom
+ import
- org.junit.jupiter
- junit-jupiter-params
- ${junit-jupiter.version}
+ org.junit-pioneer
+ junit-pioneer
+ 1.9.1
test
@@ -540,9 +536,9 @@
- jdk11
+ newerThanJdk8
- 11
+ [9,)
diff --git a/powertools-e2e-tests/handlers/idempotency/pom.xml b/powertools-e2e-tests/handlers/idempotency/pom.xml
index 4e24c738c..25dfbfabf 100644
--- a/powertools-e2e-tests/handlers/idempotency/pom.xml
+++ b/powertools-e2e-tests/handlers/idempotency/pom.xml
@@ -17,6 +17,14 @@
software.amazon.lambda
powertools-idempotency
+
+ software.amazon.lambda
+ powertools-logging
+
+
+ org.apache.logging.log4j
+ log4j-slf4j2-impl
+
com.amazonaws
aws-lambda-java-events
@@ -38,6 +46,10 @@
software.amazon.lambda
powertools-idempotency
+
+ software.amazon.lambda
+ powertools-logging
+
diff --git a/powertools-e2e-tests/handlers/idempotency/src/main/java/software/amazon/lambda/powertools/e2e/Function.java b/powertools-e2e-tests/handlers/idempotency/src/main/java/software/amazon/lambda/powertools/e2e/Function.java
index 8c2b5fc58..e4c2f2b9a 100644
--- a/powertools-e2e-tests/handlers/idempotency/src/main/java/software/amazon/lambda/powertools/e2e/Function.java
+++ b/powertools-e2e-tests/handlers/idempotency/src/main/java/software/amazon/lambda/powertools/e2e/Function.java
@@ -28,6 +28,7 @@
import software.amazon.lambda.powertools.idempotency.IdempotencyConfig;
import software.amazon.lambda.powertools.idempotency.Idempotent;
import software.amazon.lambda.powertools.idempotency.persistence.DynamoDBPersistenceStore;
+import software.amazon.lambda.powertools.logging.Logging;
public class Function implements RequestHandler {
@@ -53,6 +54,7 @@ public Function(DynamoDbClient client) {
).configure();
}
+ @Logging(logEvent = true)
@Idempotent
public String handleRequest(Input input, Context context) {
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME.withZone(TimeZone.getTimeZone("UTC").toZoneId());
diff --git a/powertools-e2e-tests/handlers/idempotency/src/main/resources/log4j2.xml b/powertools-e2e-tests/handlers/idempotency/src/main/resources/log4j2.xml
new file mode 100644
index 000000000..8925f70b9
--- /dev/null
+++ b/powertools-e2e-tests/handlers/idempotency/src/main/resources/log4j2.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/powertools-e2e-tests/handlers/largemessage/pom.xml b/powertools-e2e-tests/handlers/largemessage/pom.xml
new file mode 100644
index 000000000..c626f5f64
--- /dev/null
+++ b/powertools-e2e-tests/handlers/largemessage/pom.xml
@@ -0,0 +1,72 @@
+
+ 4.0.0
+
+
+ software.amazon.lambda
+ e2e-test-handlers-parent
+ 1.0.0
+
+
+ e2e-test-handler-largemessage
+ jar
+ A Lambda function using Powertools for AWS Lambda (Java) large message
+
+
+
+ software.amazon.awssdk
+ dynamodb
+
+
+ software.amazon.lambda
+ powertools-large-messages
+
+
+ software.amazon.lambda
+ powertools-logging
+
+
+ com.amazonaws
+ aws-lambda-java-events
+
+
+ org.apache.logging.log4j
+ log4j-slf4j2-impl
+
+
+
+
+
+
+ dev.aspectj
+ aspectj-maven-plugin
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+ ${maven.compiler.target}
+
+
+ software.amazon.lambda
+ powertools-large-messages
+
+
+ software.amazon.lambda
+ powertools-logging
+
+
+
+
+
+
+ compile
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+
+
+
diff --git a/powertools-e2e-tests/handlers/largemessage/src/main/java/software/amazon/lambda/powertools/e2e/Function.java b/powertools-e2e-tests/handlers/largemessage/src/main/java/software/amazon/lambda/powertools/e2e/Function.java
new file mode 100644
index 000000000..70f1bceea
--- /dev/null
+++ b/powertools-e2e-tests/handlers/largemessage/src/main/java/software/amazon/lambda/powertools/e2e/Function.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.e2e;
+
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.RequestHandler;
+import com.amazonaws.services.lambda.runtime.events.SQSBatchResponse;
+import com.amazonaws.services.lambda.runtime.events.SQSEvent;
+import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage;
+import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
+import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
+import software.amazon.awssdk.services.dynamodb.model.PutItemRequest;
+import software.amazon.awssdk.utils.BinaryUtils;
+import software.amazon.awssdk.utils.Md5Utils;
+import software.amazon.lambda.powertools.largemessages.LargeMessage;
+import software.amazon.lambda.powertools.logging.Logging;
+
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Function implements RequestHandler {
+
+ private static final String TABLE_FOR_ASYNC_TESTS = System.getenv("TABLE_FOR_ASYNC_TESTS");
+ private DynamoDbClient client;
+
+ public Function() {
+ if (client == null) {
+ client = DynamoDbClient.builder()
+ .httpClient(UrlConnectionHttpClient.builder().build())
+ .region(Region.of(System.getenv("AWS_REGION")))
+ .build();
+ }
+ }
+
+ @Logging(logEvent = true)
+ public SQSBatchResponse handleRequest(SQSEvent event, Context context) {
+ for (SQSMessage message: event.getRecords()) {
+ processRawMessage(message, context);
+ }
+ return SQSBatchResponse.builder().build();
+ }
+
+ @LargeMessage
+ private void processRawMessage(SQSMessage sqsMessage, Context context) {
+ String bodyMD5 = md5(sqsMessage.getBody());
+ if (!sqsMessage.getMd5OfBody().equals(bodyMD5)) {
+ throw new SecurityException(String.format("message digest does not match, expected %s, got %s", sqsMessage.getMd5OfBody(), bodyMD5));
+ }
+
+ Map item = new HashMap<>();
+ item.put("functionName", AttributeValue.builder().s(context.getFunctionName()).build());
+ item.put("id", AttributeValue.builder().s(sqsMessage.getMessageId()).build());
+ item.put("bodyMD5", AttributeValue.builder().s(bodyMD5).build());
+ item.put("bodySize", AttributeValue.builder().n(String.valueOf(sqsMessage.getBody().getBytes(StandardCharsets.UTF_8).length)).build());
+
+ client.putItem(PutItemRequest.builder().tableName(TABLE_FOR_ASYNC_TESTS).item(item).build());
+ }
+
+ private String md5(String message) {
+ return BinaryUtils.toHex(Md5Utils.computeMD5Hash(message.getBytes(StandardCharsets.UTF_8)));
+ }
+}
\ No newline at end of file
diff --git a/powertools-e2e-tests/handlers/largemessage/src/main/resources/log4j2.xml b/powertools-e2e-tests/handlers/largemessage/src/main/resources/log4j2.xml
new file mode 100644
index 000000000..8925f70b9
--- /dev/null
+++ b/powertools-e2e-tests/handlers/largemessage/src/main/resources/log4j2.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/powertools-e2e-tests/handlers/largemessage_idempotent/pom.xml b/powertools-e2e-tests/handlers/largemessage_idempotent/pom.xml
new file mode 100644
index 000000000..9635efd87
--- /dev/null
+++ b/powertools-e2e-tests/handlers/largemessage_idempotent/pom.xml
@@ -0,0 +1,77 @@
+
+ 4.0.0
+
+
+ software.amazon.lambda
+ e2e-test-handlers-parent
+ 1.0.0
+
+
+ e2e-test-handler-large-msg-idempotent
+ jar
+ A Lambda function using Powertools for AWS Lambda (Java) idempotency with large messages
+
+
+
+ software.amazon.lambda
+ powertools-idempotency
+
+
+ software.amazon.lambda
+ powertools-large-messages
+
+
+ software.amazon.lambda
+ powertools-logging
+
+
+ com.amazonaws
+ aws-lambda-java-events
+
+
+ org.apache.logging.log4j
+ log4j-slf4j2-impl
+
+
+
+
+
+
+
+ dev.aspectj
+ aspectj-maven-plugin
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+ ${maven.compiler.target}
+
+
+ software.amazon.lambda
+ powertools-idempotency
+
+
+ software.amazon.lambda
+ powertools-large-messages
+
+
+ software.amazon.lambda
+ powertools-logging
+
+
+
+
+
+
+ compile
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+
+
+
diff --git a/powertools-e2e-tests/handlers/largemessage_idempotent/src/main/java/software/amazon/lambda/powertools/e2e/Function.java b/powertools-e2e-tests/handlers/largemessage_idempotent/src/main/java/software/amazon/lambda/powertools/e2e/Function.java
new file mode 100644
index 000000000..b9f737857
--- /dev/null
+++ b/powertools-e2e-tests/handlers/largemessage_idempotent/src/main/java/software/amazon/lambda/powertools/e2e/Function.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.e2e;
+
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.RequestHandler;
+import com.amazonaws.services.lambda.runtime.events.SQSBatchResponse;
+import com.amazonaws.services.lambda.runtime.events.SQSEvent;
+import java.nio.charset.StandardCharsets;
+import java.time.Duration;
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TimeZone;
+import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
+import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
+import software.amazon.awssdk.services.dynamodb.model.PutItemRequest;
+import software.amazon.awssdk.utils.BinaryUtils;
+import software.amazon.awssdk.utils.Md5Utils;
+import software.amazon.lambda.powertools.idempotency.Idempotency;
+import software.amazon.lambda.powertools.idempotency.IdempotencyConfig;
+import software.amazon.lambda.powertools.idempotency.IdempotencyKey;
+import software.amazon.lambda.powertools.idempotency.Idempotent;
+import software.amazon.lambda.powertools.idempotency.persistence.DynamoDBPersistenceStore;
+import software.amazon.lambda.powertools.largemessages.LargeMessage;
+import software.amazon.lambda.powertools.logging.Logging;
+
+public class Function implements RequestHandler {
+
+ private static final String TABLE_FOR_ASYNC_TESTS = System.getenv("TABLE_FOR_ASYNC_TESTS");
+ private final DynamoDbClient client;
+
+ public Function() {
+ this(DynamoDbClient
+ .builder()
+ .httpClient(UrlConnectionHttpClient.builder().build())
+ .region(Region.of(System.getenv("AWS_REGION")))
+ .build());
+ }
+
+ public Function(DynamoDbClient client) {
+ this.client = client;
+ Idempotency.config().withConfig(
+ IdempotencyConfig.builder()
+ .withExpiration(Duration.of(22, ChronoUnit.SECONDS))
+ .withEventKeyJMESPath("body") // get the body of the message
+ .build())
+ .withPersistenceStore(
+ DynamoDBPersistenceStore.builder()
+ .withDynamoDbClient(client)
+ .withTableName(System.getenv("IDEMPOTENCY_TABLE"))
+ .build()
+ ).configure();
+ }
+
+ @Logging(logEvent = true)
+ public SQSBatchResponse handleRequest(SQSEvent event, Context context) {
+ for (SQSEvent.SQSMessage message: event.getRecords()) {
+ processRawMessage(message, context);
+ }
+ return SQSBatchResponse.builder().build();
+ }
+
+ @Idempotent
+ @LargeMessage(deleteS3Object = false)
+ private String processRawMessage(@IdempotencyKey SQSEvent.SQSMessage sqsMessage, Context context) {
+ String bodyMD5 = md5(sqsMessage.getBody());
+ if (!sqsMessage.getMd5OfBody().equals(bodyMD5)) {
+ throw new SecurityException(String.format("message digest does not match, expected %s, got %s", sqsMessage.getMd5OfBody(), bodyMD5));
+ }
+
+ Instant now = Instant.now();
+ Map item = new HashMap<>();
+ item.put("functionName", AttributeValue.builder().s(context.getFunctionName()).build());
+ item.put("id", AttributeValue.builder().s(sqsMessage.getMessageId()).build());
+ item.put("bodyMD5", AttributeValue.builder().s(bodyMD5).build());
+ item.put("now", AttributeValue.builder().n(String.valueOf(now.getEpochSecond())).build());
+ item.put("bodySize", AttributeValue.builder().n(String.valueOf(sqsMessage.getBody().getBytes(StandardCharsets.UTF_8).length)).build());
+
+ client.putItem(PutItemRequest.builder().tableName(TABLE_FOR_ASYNC_TESTS).item(item).build());
+
+ DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME.withZone(TimeZone.getTimeZone("UTC").toZoneId());
+ return dtf.format(now);
+ }
+
+ private String md5(String message) {
+ return BinaryUtils.toHex(Md5Utils.computeMD5Hash(message.getBytes(StandardCharsets.UTF_8)));
+ }
+}
\ No newline at end of file
diff --git a/powertools-e2e-tests/handlers/largemessage_idempotent/src/main/resources/log4j2.xml b/powertools-e2e-tests/handlers/largemessage_idempotent/src/main/resources/log4j2.xml
new file mode 100644
index 000000000..8925f70b9
--- /dev/null
+++ b/powertools-e2e-tests/handlers/largemessage_idempotent/src/main/resources/log4j2.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/powertools-e2e-tests/handlers/pom.xml b/powertools-e2e-tests/handlers/pom.xml
index ae26364dd..4dd8cbb45 100644
--- a/powertools-e2e-tests/handlers/pom.xml
+++ b/powertools-e2e-tests/handlers/pom.xml
@@ -20,6 +20,8 @@
3.5.0
1.13.1
3.11.0
+ 2.20.108
+ 2.20.0
@@ -32,6 +34,14 @@
+
+ software.amazon.awssdk
+ bom
+ ${aws.sdk.version}
+ pom
+ import
+
+
software.amazon.lambda
powertools-logging
@@ -57,6 +67,11 @@
powertools-parameters
${lambda.powertools.version}
+
+ software.amazon.lambda
+ powertools-large-messages
+ ${lambda.powertools.version}
+
com.amazonaws
aws-lambda-java-core
@@ -67,6 +82,11 @@
aws-lambda-java-events
${lambda.java.events}
+
+ org.apache.logging.log4j
+ log4j-slf4j2-impl
+ ${log4j.version}
+
diff --git a/powertools-e2e-tests/pom.xml b/powertools-e2e-tests/pom.xml
index 7e354d15e..500b7f30a 100644
--- a/powertools-e2e-tests/pom.xml
+++ b/powertools-e2e-tests/pom.xml
@@ -51,6 +51,13 @@
test
+
+ software.amazon.awssdk
+ dynamodb
+ ${aws.sdk.version}
+ test
+
+
software.amazon.awssdk
cloudwatch
@@ -65,6 +72,20 @@
test
+
+ software.amazon.awssdk
+ sqs
+ ${aws.sdk.version}
+ test
+
+
+
+ com.amazonaws
+ amazon-sqs-java-extended-client-lib
+ 2.0.3
+ test
+
+
software.amazon.awssdk
url-connection-client
@@ -77,6 +98,12 @@
test
+
+ commons-io
+ commons-io
+ 2.11.0
+
+
org.junit.jupiter
junit-jupiter-engine
@@ -182,6 +209,7 @@
+ 1
**/*E2ET.java
diff --git a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/IdempotencyE2ET.java b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/IdempotencyE2ET.java
index fed823299..242d1a2db 100644
--- a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/IdempotencyE2ET.java
+++ b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/IdempotencyE2ET.java
@@ -14,10 +14,11 @@
package software.amazon.lambda.powertools;
+import static software.amazon.lambda.powertools.testutils.Infrastructure.FUNCTION_NAME_OUTPUT;
import static software.amazon.lambda.powertools.testutils.lambda.LambdaInvoker.invokeFunction;
import java.time.Year;
-import java.util.Collections;
+import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import org.assertj.core.api.Assertions;
@@ -40,9 +41,9 @@ public static void setup() {
.testName(IdempotencyE2ET.class.getSimpleName())
.pathToFunction("idempotency")
.idempotencyTable("idempo" + random)
- .environmentVariables(Collections.singletonMap("IDEMPOTENCY_TABLE", "idempo" + random))
.build();
- functionName = infrastructure.deploy();
+ Map outputs = infrastructure.deploy();
+ functionName = outputs.get(FUNCTION_NAME_OUTPUT);
}
@AfterAll
diff --git a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LargeMessageE2ET.java b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LargeMessageE2ET.java
new file mode 100644
index 000000000..2d9f74135
--- /dev/null
+++ b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LargeMessageE2ET.java
@@ -0,0 +1,167 @@
+package software.amazon.lambda.powertools;
+
+import com.amazon.sqs.javamessaging.AmazonSQSExtendedClient;
+import com.amazon.sqs.javamessaging.ExtendedClientConfiguration;
+import org.apache.commons.io.IOUtils;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Timeout;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import software.amazon.awssdk.http.SdkHttpClient;
+import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
+import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
+import software.amazon.awssdk.services.dynamodb.model.DeleteItemRequest;
+import software.amazon.awssdk.services.dynamodb.model.QueryRequest;
+import software.amazon.awssdk.services.dynamodb.model.QueryResponse;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.sqs.SqsClient;
+import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
+import software.amazon.lambda.powertools.testutils.Infrastructure;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static software.amazon.lambda.powertools.testutils.Infrastructure.FUNCTION_NAME_OUTPUT;
+
+public class LargeMessageE2ET {
+
+ private static final Logger LOG = LoggerFactory.getLogger(LargeMessageE2ET.class);
+ private static final SdkHttpClient httpClient = UrlConnectionHttpClient.builder().build();
+ private static final Region region = Region.of(System.getProperty("AWS_DEFAULT_REGION", "eu-west-1"));
+
+ private static final S3Client s3Client = S3Client.builder()
+ .httpClient(httpClient)
+ .region(region)
+ .build();
+ private static final DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
+ .httpClient(httpClient)
+ .region(region)
+ .build();
+
+ private static Infrastructure infrastructure;
+ private static String functionName;
+ private static String bucketName;
+ private static String queueUrl;
+ private static String tableName;
+ private String messageId;
+
+ @BeforeAll
+ @Timeout(value = 5, unit = TimeUnit.MINUTES)
+ public static void setup() {
+ String random = UUID.randomUUID().toString().substring(0, 6);
+ bucketName = "largemessagebucket" + random;
+ String queueName = "largemessagequeue" + random;
+
+ infrastructure = Infrastructure.builder()
+ .testName(LargeMessageE2ET.class.getSimpleName())
+ .queue(queueName)
+ .largeMessagesBucket(bucketName)
+ .pathToFunction("largemessage")
+ .timeoutInSeconds(60)
+ .build();
+
+ Map outputs = infrastructure.deploy();
+ functionName = outputs.get(FUNCTION_NAME_OUTPUT);
+ queueUrl = outputs.get("QueueURL");
+ tableName = outputs.get("TableNameForAsyncTests");
+
+ LOG.info("Testing '" + LargeMessageE2ET.class.getSimpleName() + "'");
+ }
+
+ @AfterEach
+ public void reset() {
+ if (messageId != null) {
+ Map itemToDelete = new HashMap<>();
+ itemToDelete.put("functionName", AttributeValue.builder().s(functionName).build());
+ itemToDelete.put("id", AttributeValue.builder().s(messageId).build());
+ dynamoDbClient.deleteItem(DeleteItemRequest.builder().tableName(tableName).key(itemToDelete).build());
+ messageId = null;
+ }
+ }
+
+ @AfterAll
+ public static void tearDown() {
+ if (infrastructure != null)
+ infrastructure.destroy();
+ }
+
+ @Test
+ public void bigSQSMessageOffloadedToS3_shouldLoadFromS3() throws IOException, InterruptedException {
+ // given
+ final ExtendedClientConfiguration extendedClientConfig =
+ new ExtendedClientConfiguration()
+ .withPayloadSupportEnabled(s3Client, bucketName);
+ AmazonSQSExtendedClient client = new AmazonSQSExtendedClient(SqsClient.builder().httpClient(httpClient).build(), extendedClientConfig);
+ InputStream inputStream = this.getClass().getResourceAsStream("/large_sqs_message.txt");
+ String bigMessage = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
+
+ // when
+ client.sendMessage(SendMessageRequest
+ .builder()
+ .queueUrl(queueUrl)
+ .messageBody(bigMessage)
+ .build());
+
+ Thread.sleep(30000); // wait for function to be executed
+
+ // then
+ QueryRequest request = QueryRequest
+ .builder()
+ .tableName(tableName)
+ .keyConditionExpression("functionName = :func")
+ .expressionAttributeValues(Collections.singletonMap(":func", AttributeValue.builder().s(functionName).build()))
+ .build();
+ QueryResponse response = dynamoDbClient.query(request);
+ List> items = response.items();
+ assertThat(items).hasSize(1);
+ messageId = items.get(0).get("id").s();
+ assertThat(Integer.valueOf(items.get(0).get("bodySize").n())).isEqualTo(300977);
+ assertThat(items.get(0).get("bodyMD5").s()).isEqualTo("22bde5e7b05fa80bc7be45bdd4bc6c75");
+ }
+
+ @Test
+ public void smallSQSMessage_shouldNotReadFromS3() throws IOException, InterruptedException {
+ // given
+ final ExtendedClientConfiguration extendedClientConfig =
+ new ExtendedClientConfiguration()
+ .withPayloadSupportEnabled(s3Client, bucketName);
+ AmazonSQSExtendedClient client = new AmazonSQSExtendedClient(SqsClient.builder().httpClient(httpClient).build(), extendedClientConfig);
+ String message = "Hello World";
+
+ // when
+ client.sendMessage(SendMessageRequest
+ .builder()
+ .queueUrl(queueUrl)
+ .messageBody(message)
+ .build());
+
+ Thread.sleep(30000); // wait for function to be executed
+
+ // then
+ QueryRequest request = QueryRequest
+ .builder()
+ .tableName(tableName)
+ .keyConditionExpression("functionName = :func")
+ .expressionAttributeValues(Collections.singletonMap(":func", AttributeValue.builder().s(functionName).build()))
+ .build();
+ QueryResponse response = dynamoDbClient.query(request);
+ List> items = response.items();
+ assertThat(items).hasSize(1);
+ messageId = items.get(0).get("id").s();
+ assertThat(Integer.valueOf(items.get(0).get("bodySize").n())).isEqualTo(message.getBytes(StandardCharsets.UTF_8).length);
+ assertThat(items.get(0).get("bodyMD5").s()).isEqualTo("b10a8db164e0754105b7a99be72e3fe5");
+ }
+}
diff --git a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LargeMessageIdempotentE2ET.java b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LargeMessageIdempotentE2ET.java
new file mode 100644
index 000000000..986d22a2f
--- /dev/null
+++ b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LargeMessageIdempotentE2ET.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import org.apache.commons.io.IOUtils;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Timeout;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import software.amazon.awssdk.core.sync.RequestBody;
+import software.amazon.awssdk.http.SdkHttpClient;
+import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
+import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
+import software.amazon.awssdk.services.dynamodb.model.QueryRequest;
+import software.amazon.awssdk.services.dynamodb.model.QueryResponse;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.model.PutObjectRequest;
+import software.amazon.awssdk.services.sqs.SqsClient;
+import software.amazon.awssdk.services.sqs.model.MessageAttributeValue;
+import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
+import software.amazon.lambda.powertools.testutils.Infrastructure;
+
+public class LargeMessageIdempotentE2ET {
+
+ private static final Logger LOG = LoggerFactory.getLogger(LargeMessageIdempotentE2ET.class);
+ private static final SdkHttpClient httpClient = UrlConnectionHttpClient.builder().build();
+ private static final Region region = Region.of(System.getProperty("AWS_DEFAULT_REGION", "eu-west-1"));
+
+ private static final S3Client s3Client = S3Client.builder()
+ .httpClient(httpClient)
+ .region(region)
+ .build();
+ // cannot use the extended library as it will create different S3 objects (we need to have the same for Idempotency)
+ private static final SqsClient sqsClient = SqsClient.builder()
+ .httpClient(httpClient)
+ .region(region)
+ .build();
+ private static final DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
+ .httpClient(httpClient)
+ .region(region)
+ .build();
+
+ private static Infrastructure infrastructure;
+ private static String functionName;
+ private static String bucketName;
+ private static String queueUrl;
+ private static String tableName;
+
+
+ @BeforeAll
+ @Timeout(value = 5, unit = TimeUnit.MINUTES)
+ public static void setup() {
+ String random = UUID.randomUUID().toString().substring(0, 6);
+ bucketName = "largemessagebucket" + random;
+ String queueName = "largemessagequeue" + random;
+
+ infrastructure = Infrastructure.builder()
+ .testName(LargeMessageIdempotentE2ET.class.getSimpleName())
+ .pathToFunction("largemessage_idempotent")
+ .idempotencyTable("idempo" + random)
+ .queue(queueName)
+ .largeMessagesBucket(bucketName)
+ .build();
+
+ Map outputs = infrastructure.deploy();
+
+ functionName = outputs.get(Infrastructure.FUNCTION_NAME_OUTPUT);
+ queueUrl = outputs.get("QueueURL");
+ tableName = outputs.get("TableNameForAsyncTests");
+
+ LOG.info("Testing '" + LargeMessageIdempotentE2ET.class.getSimpleName() + "'");
+ }
+
+ @AfterAll
+ public static void tearDown() {
+ if (infrastructure != null) {
+ infrastructure.destroy();
+ }
+ }
+
+ @Test
+ public void test_ttlNotExpired_doesNotInsertInDDB_ttlExpired_insertInDDB() throws InterruptedException,
+ IOException {
+ int waitMs = 10000;
+
+ // GIVEN
+ InputStream inputStream = this.getClass().getResourceAsStream("/large_sqs_message.txt");
+ String bigMessage = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
+
+ // upload manually to S3
+ String key = UUID.randomUUID().toString();
+ s3Client.putObject(PutObjectRequest.builder()
+ .bucket(bucketName)
+ .key(key)
+ .build(), RequestBody.fromString(bigMessage));
+
+ // WHEN
+ SendMessageRequest messageRequest = SendMessageRequest.builder()
+ .queueUrl(queueUrl)
+ .messageBody(String.format(
+ "[\"software.amazon.payloadoffloading.PayloadS3Pointer\",{\"s3BucketName\":\"%s\",\"s3Key\":\"%s\"}]",
+ bucketName, key))
+ .messageAttributes(Collections.singletonMap("SQSLargePayloadSize", MessageAttributeValue.builder()
+ .stringValue("300977")
+ .dataType("Number")
+ .build()))
+ .build();
+
+ // First invocation
+ // send message to SQS with the good pointer and metadata
+ sqsClient.sendMessage(messageRequest);
+ Thread.sleep(waitMs); // wait for the function to be invoked & executed
+
+ // THEN
+ QueryRequest request = QueryRequest
+ .builder()
+ .tableName(tableName)
+ .keyConditionExpression("functionName = :func")
+ .expressionAttributeValues(Collections.singletonMap(":func", AttributeValue.builder().s(functionName).build()))
+ .build();
+ QueryResponse response = dynamoDbClient.query(request);
+ List> items = response.items();
+ assertThat(items).hasSize(1);
+ assertThat(Integer.valueOf(items.get(0).get("bodySize").n())).isEqualTo(300977);
+ assertThat(items.get(0).get("bodyMD5").s()).isEqualTo("22bde5e7b05fa80bc7be45bdd4bc6c75");
+ long timeOfInvocation1 = Long.parseLong(items.get(0).get("now").n());
+
+ // WHEN
+ // Second invocation
+ // send the same message before ttl expires
+ sqsClient.sendMessage(messageRequest);
+ Thread.sleep(waitMs); // wait for the function to be invoked & executed
+
+ // THEN
+ response = dynamoDbClient.query(request);
+ items = response.items();
+ assertThat(items).hasSize(1); // we should have the same number of items (idempotency working)
+ assertThat(Integer.valueOf(items.get(0).get("bodySize").n())).isEqualTo(300977);
+ assertThat(items.get(0).get("bodyMD5").s()).isEqualTo("22bde5e7b05fa80bc7be45bdd4bc6c75");
+ long timeOfInvocation2 = Long.parseLong(items.get(0).get("now").n());
+ assertThat(timeOfInvocation2).isEqualTo(timeOfInvocation1); // should be the same as first invocation
+
+ // WHEN
+ // waiting for TTL to expire
+ Thread.sleep(24000);
+
+ // Third invocation
+ // send the same message again
+ sqsClient.sendMessage(messageRequest);
+ Thread.sleep(waitMs); // wait for the function to be invoked
+
+ // THEN
+ response = dynamoDbClient.query(request);
+ items = response.items();
+ assertThat(items).hasSize(2); // not idempotent anymore, function should put a new item in DDB
+ assertThat(Integer.valueOf(items.get(0).get("bodySize").n())).isEqualTo(300977);
+ assertThat(items.get(0).get("bodyMD5").s()).isEqualTo("22bde5e7b05fa80bc7be45bdd4bc6c75");
+ assertThat(Integer.valueOf(items.get(1).get("bodySize").n())).isEqualTo(300977);
+ assertThat(items.get(1).get("bodyMD5").s()).isEqualTo("22bde5e7b05fa80bc7be45bdd4bc6c75");
+ long timeOfInvocation3 = Long.parseLong(items.get(0).get("now").n());
+ long timeOfInvocation4 = Long.parseLong(items.get(1).get("now").n());
+ assertThat(timeOfInvocation3).isNotEqualTo(timeOfInvocation4); // should be different (not idempotent anymore)
+
+ }
+}
diff --git a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LoggingE2ET.java b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LoggingE2ET.java
index e4b8dccd2..f958970d8 100644
--- a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LoggingE2ET.java
+++ b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/LoggingE2ET.java
@@ -15,12 +15,14 @@
package software.amazon.lambda.powertools;
import static org.assertj.core.api.Assertions.assertThat;
+import static software.amazon.lambda.powertools.testutils.Infrastructure.FUNCTION_NAME_OUTPUT;
import static software.amazon.lambda.powertools.testutils.lambda.LambdaInvoker.invokeFunction;
import static software.amazon.lambda.powertools.testutils.logging.InvocationLogs.Level.INFO;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -52,7 +54,8 @@ public static void setup() {
})
.collect(Collectors.toMap(data -> data[0], data -> data[1])))
.build();
- functionName = infrastructure.deploy();
+ Map outputs = infrastructure.deploy();
+ functionName = outputs.get(FUNCTION_NAME_OUTPUT);
}
@AfterAll
diff --git a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/MetricsE2ET.java b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/MetricsE2ET.java
index 32965b3be..80673b995 100644
--- a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/MetricsE2ET.java
+++ b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/MetricsE2ET.java
@@ -15,10 +15,12 @@
package software.amazon.lambda.powertools;
import static org.assertj.core.api.Assertions.assertThat;
+import static software.amazon.lambda.powertools.testutils.Infrastructure.FUNCTION_NAME_OUTPUT;
import static software.amazon.lambda.powertools.testutils.lambda.LambdaInvoker.invokeFunction;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -50,7 +52,8 @@ public static void setup() {
})
.collect(Collectors.toMap(data -> data[0], data -> data[1])))
.build();
- functionName = infrastructure.deploy();
+ Map outputs = infrastructure.deploy();
+ functionName = outputs.get(FUNCTION_NAME_OUTPUT);
}
@AfterAll
diff --git a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/ParametersE2ET.java b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/ParametersE2ET.java
index 678321a99..9582f9f23 100644
--- a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/ParametersE2ET.java
+++ b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/ParametersE2ET.java
@@ -15,6 +15,7 @@
package software.amazon.lambda.powertools;
import static org.assertj.core.api.Assertions.assertThat;
+import static software.amazon.lambda.powertools.testutils.Infrastructure.FUNCTION_NAME_OUTPUT;
import static software.amazon.lambda.powertools.testutils.lambda.LambdaInvoker.invokeFunction;
import java.util.HashMap;
@@ -60,7 +61,8 @@ public void setup() {
})
.collect(Collectors.toMap(data -> data[0], data -> data[1])))
.build();
- functionName = infrastructure.deploy();
+ Map outputs = infrastructure.deploy();
+ functionName = outputs.get(FUNCTION_NAME_OUTPUT);
}
@AfterAll
diff --git a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/TracingE2ET.java b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/TracingE2ET.java
index 043de5494..0827d91ae 100644
--- a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/TracingE2ET.java
+++ b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/TracingE2ET.java
@@ -15,6 +15,7 @@
package software.amazon.lambda.powertools;
import static org.assertj.core.api.Assertions.assertThat;
+import static software.amazon.lambda.powertools.testutils.Infrastructure.FUNCTION_NAME_OUTPUT;
import static software.amazon.lambda.powertools.testutils.lambda.LambdaInvoker.invokeFunction;
import java.util.Collections;
@@ -46,7 +47,8 @@ public static void setup() {
.tracing(true)
.environmentVariables(Collections.singletonMap("POWERTOOLS_SERVICE_NAME", service))
.build();
- functionName = infrastructure.deploy();
+ Map outputs = infrastructure.deploy();
+ functionName = outputs.get(FUNCTION_NAME_OUTPUT);
}
@AfterAll
diff --git a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/testutils/Infrastructure.java b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/testutils/Infrastructure.java
index 62bb018f4..996f49bd4 100644
--- a/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/testutils/Infrastructure.java
+++ b/powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/testutils/Infrastructure.java
@@ -33,6 +33,7 @@
import software.amazon.awscdk.App;
import software.amazon.awscdk.BundlingOptions;
import software.amazon.awscdk.BundlingOutput;
+import software.amazon.awscdk.CfnOutput;
import software.amazon.awscdk.DockerVolume;
import software.amazon.awscdk.Duration;
import software.amazon.awscdk.RemovalPolicy;
@@ -52,9 +53,14 @@
import software.amazon.awscdk.services.lambda.Code;
import software.amazon.awscdk.services.lambda.Function;
import software.amazon.awscdk.services.lambda.Tracing;
+import software.amazon.awscdk.services.lambda.eventsources.SqsEventSource;
import software.amazon.awscdk.services.logs.LogGroup;
import software.amazon.awscdk.services.logs.RetentionDays;
+import software.amazon.awscdk.services.s3.Bucket;
+import software.amazon.awscdk.services.s3.LifecycleRule;
import software.amazon.awscdk.services.s3.assets.AssetOptions;
+import software.amazon.awscdk.services.sqs.DeadLetterQueue;
+import software.amazon.awscdk.services.sqs.Queue;
import software.amazon.awssdk.core.waiters.WaiterResponse;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
@@ -85,6 +91,7 @@
* and the CloudFormation stack is created (with the SDK `createStack`)
*/
public class Infrastructure {
+ public static final String FUNCTION_NAME_OUTPUT = "functionName";
private static final Logger LOG = LoggerFactory.getLogger(Infrastructure.class);
private final String stackName;
@@ -102,6 +109,9 @@ public class Infrastructure {
private final String idempotencyTable;
private final AppConfig appConfig;
private final SdkHttpClient httpClient;
+ private final String queue;
+ private final String largeMessagesBucket;
+
private String functionName;
private Object cfnTemplate;
private String cfnAssetDirectory;
@@ -115,6 +125,8 @@ private Infrastructure(Builder builder) {
this.pathToFunction = builder.pathToFunction;
this.idempotencyTable = builder.idemPotencyTable;
this.appConfig = builder.appConfig;
+ this.queue = builder.queue;
+ this.largeMessagesBucket = builder.largeMessagesBucket;
this.app = new App();
this.stack = createStackWithLambda();
@@ -147,7 +159,7 @@ public static Builder builder() {
*
* @return the name of the function deployed part of the stack
*/
- public String deploy() {
+ public Map deploy() {
uploadAssets();
LOG.info("Deploying '" + stackName + "' on account " + account);
cfn.createStack(CreateStackRequest.builder()
@@ -160,12 +172,14 @@ public String deploy() {
WaiterResponse waiterResponse =
cfn.waiter().waitUntilStackCreateComplete(DescribeStacksRequest.builder().stackName(stackName).build());
if (waiterResponse.matched().response().isPresent()) {
- LOG.info("Stack " + waiterResponse.matched().response().get().stacks().get(0).stackName() +
- " successfully deployed");
+ software.amazon.awssdk.services.cloudformation.model.Stack deployedStack = waiterResponse.matched().response().get().stacks().get(0);
+ LOG.info("Stack " + deployedStack.stackName() + " successfully deployed");
+ Map outputs = new HashMap<>();
+ deployedStack.outputs().forEach(output -> outputs.put(output.outputKey(), output.outputValue()));
+ return outputs;
} else {
throw new RuntimeException("Failed to create stack");
}
- return functionName;
}
/**
@@ -182,6 +196,7 @@ public void destroy() {
* @return the CDK stack
*/
private Stack createStackWithLambda() {
+ boolean createTableForAsyncTests = false;
Stack stack = new Stack(app, stackName);
List packagingInstruction = Arrays.asList(
"/bin/sh",
@@ -209,6 +224,9 @@ private Stack createStackWithLambda() {
.outputType(BundlingOutput.ARCHIVED);
functionName = stackName + "-function";
+ CfnOutput.Builder.create(stack, FUNCTION_NAME_OUTPUT)
+ .value(functionName)
+ .build();
LOG.debug("Building Lambda function with command " +
packagingInstruction.stream().collect(Collectors.joining(" ", "[", "]")));
@@ -244,10 +262,43 @@ private Stack createStackWithLambda() {
.tableName(idempotencyTable)
.timeToLiveAttribute("expiration")
.build();
+ function.addEnvironment("IDEMPOTENCY_TABLE", idempotencyTable);
table.grantReadWriteData(function);
}
+ if (!StringUtils.isEmpty(queue)) {
+ Queue sqsQueue = Queue.Builder
+ .create(stack, "SQSQueue")
+ .queueName(queue)
+ .visibilityTimeout(Duration.seconds(timeout * 6))
+ .retentionPeriod(Duration.seconds(timeout * 6))
+ .build();
+ DeadLetterQueue.builder()
+ .queue(sqsQueue)
+ .maxReceiveCount(1) // do not retry in case of error
+ .build();
+ sqsQueue.grantConsumeMessages(function);
+ SqsEventSource sqsEventSource = SqsEventSource.Builder.create(sqsQueue).enabled(true).batchSize(1).build();
+ function.addEventSource(sqsEventSource);
+ CfnOutput.Builder
+ .create(stack, "QueueURL")
+ .value(sqsQueue.getQueueUrl())
+ .build();
+ createTableForAsyncTests = true;
+ }
+
+ if (!StringUtils.isEmpty(largeMessagesBucket)) {
+ Bucket offloadBucket = Bucket.Builder
+ .create(stack, "LargeMessagesOffloadBucket")
+ .removalPolicy(RemovalPolicy.RETAIN) // autodelete does not work without cdk deploy
+ .bucketName(largeMessagesBucket)
+ .build();
+ // instead of autodelete, have a lifecycle rule to delete files after a day
+ LifecycleRule.builder().expiration(Duration.days(1)).enabled(true).build();
+ offloadBucket.grantReadWrite(function);
+ }
+
if (appConfig != null) {
CfnApplication app = CfnApplication.Builder
.create(stack, "AppConfigApp")
@@ -260,7 +311,7 @@ private Stack createStackWithLambda() {
.name(appConfig.getEnvironment())
.build();
- // Create a fast deployment strategy so we don't have to wait ages
+ // Create a fast deployment strategy, so we don't have to wait ages
CfnDeploymentStrategy fastDeployment = CfnDeploymentStrategy.Builder
.create(stack, "AppConfigDeployment")
.name("FastDeploymentStrategy")
@@ -306,11 +357,25 @@ private Stack createStackWithLambda() {
// We need to chain the deployments to keep CFN happy
if (previousDeployment != null) {
- deployment.addDependsOn(previousDeployment);
+ deployment.addDependency(previousDeployment);
}
previousDeployment = deployment;
}
}
+ if (createTableForAsyncTests) {
+ Table table = Table.Builder
+ .create(stack, "TableForAsyncTests")
+ .billingMode(BillingMode.PAY_PER_REQUEST)
+ .removalPolicy(RemovalPolicy.DESTROY)
+ .partitionKey(Attribute.builder().name("functionName").type(AttributeType.STRING).build())
+ .sortKey(Attribute.builder().name("id").type(AttributeType.STRING).build())
+ .build();
+
+ table.grantReadWriteData(function);
+ function.addEnvironment("TABLE_FOR_ASYNC_TESTS", table.getTableName());
+ CfnOutput.Builder.create(stack, "TableNameForAsyncTests").value(table.getTableName()).build();
+ }
+
return stack;
}
@@ -379,11 +444,13 @@ public static class Builder {
public String pathToFunction;
public String testName;
public AppConfig appConfig;
+ private String largeMessagesBucket;
private String stackName;
private boolean tracing = false;
private JavaRuntime runtime;
private Map environmentVariables = new HashMap<>();
private String idemPotencyTable;
+ private String queue;
private Builder() {
getJavaRuntime();
@@ -453,6 +520,16 @@ public Builder timeoutInSeconds(long timeoutInSeconds) {
this.timeoutInSeconds = timeoutInSeconds;
return this;
}
+
+ public Builder queue(String queue) {
+ this.queue = queue;
+ return this;
+ }
+
+ public Builder largeMessagesBucket(String largeMessagesBucket) {
+ this.largeMessagesBucket = largeMessagesBucket;
+ return this;
+ }
}
private static class Asset {
diff --git a/powertools-e2e-tests/src/test/resources/large_sqs_message.txt b/powertools-e2e-tests/src/test/resources/large_sqs_message.txt
new file mode 100644
index 000000000..102216e83
--- /dev/null
+++ b/powertools-e2e-tests/src/test/resources/large_sqs_message.txt
@@ -0,0 +1,977 @@
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam in nibh eget ante viverra mattis. Etiam elit est, pharetra efficitur fermentum at, accumsan id eros. Aenean accumsan nisi facilisis tempor suscipit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam magna erat, tincidunt eu placerat at, molestie at sem. In sit amet cursus mauris. Etiam ullamcorper lacus nisi, et porta metus semper id. Nulla mauris nunc, pharetra at facilisis a, consequat id metus. Sed convallis ligula non felis vulputate finibus. Curabitur nisl nulla, pharetra in justo a, dapibus ultricies dui. Morbi ultricies sollicitudin purus, quis pellentesque leo rhoncus sed. Curabitur sed eros quis lacus vulputate pretium. Vestibulum vitae urna nec arcu vulputate efficitur. Cras venenatis sodales dolor non ullamcorper.
+
+Donec eu placerat magna. Vestibulum justo lacus, luctus ac luctus sit amet, dapibus at orci. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec eu tortor ac justo pharetra hendrerit. Phasellus ornare lacinia vestibulum. Maecenas diam orci, molestie rhoncus fringilla vitae, aliquam eu purus. Maecenas vehicula felis dui, vel dapibus odio lobortis quis. Cras a velit non nisl efficitur tempor.
+
+Suspendisse magna enim, ultrices et elementum ut, venenatis ut purus. Curabitur convallis vel tortor id rhoncus. Pellentesque varius arcu non imperdiet eleifend. Vestibulum fringilla aliquet vehicula. Nullam et lorem ullamcorper, tincidunt ante eget, egestas ex. Donec laoreet, justo id tincidunt egestas, lectus diam faucibus tortor, nec venenatis felis leo a urna. In at tortor semper augue finibus ornare et vitae erat. Praesent vulputate, dui sed pulvinar porta, justo tortor feugiat tellus, eget accumsan velit turpis at orci. Nulla vitae velit facilisis augue sagittis fringilla nec sagittis nunc.
+
+Duis vel elementum odio, id eleifend mauris. Nam in ultrices nulla. Quisque pharetra blandit risus eget lacinia. Nulla mattis mi felis, a ultrices nisi egestas vulputate. Donec a augue ac ex laoreet semper at porta ante. Vestibulum arcu ipsum, vehicula vel mollis lobortis, ullamcorper sed augue. Ut viverra faucibus nunc, sit amet sodales diam gravida sollicitudin. Fusce finibus quam sed ornare consequat. Suspendisse viverra ultricies dui in volutpat. Maecenas blandit erat in rhoncus placerat. Phasellus eu nisi rutrum, bibendum nunc eu, viverra ex. Praesent sollicitudin mi sit amet dictum convallis. Vivamus purus ligula, interdum at tincidunt sit amet, pellentesque ut elit. Aenean vitae ultrices ex. In facilisis lectus est, nec vulputate diam tristique vel. In gravida tincidunt ex et viverra.
+
+Pellentesque mi justo, dignissim a nisl quis, tempor dictum lacus. Nam tristique varius dolor tincidunt pharetra. Nullam iaculis est sed quam dignissim cursus. Duis sit amet vehicula nisi, sed consectetur velit. Nullam non tellus nec dolor venenatis porta quis at quam. In pharetra id orci sed faucibus. Cras et malesuada erat.
+
+Quisque fringilla commodo metus nec feugiat. Donec et est urna. Maecenas ut magna dui. Vivamus eu sem venenatis, porta mi at, efficitur tortor. In lacinia hendrerit elit, in faucibus nulla ultrices et. Mauris accumsan nec orci et vestibulum. Aliquam eget justo velit. Mauris fringilla ullamcorper enim, in elementum enim eleifend a. Nulla id libero ac arcu tristique ultrices. Maecenas mattis orci vitae nisl laoreet auctor.
+
+Quisque id aliquam orci. Nunc molestie vitae quam eu consectetur. Vivamus molestie venenatis est, nec lacinia odio faucibus eget. Etiam ornare eu leo eget posuere. Quisque elementum ligula at euismod placerat. Maecenas lobortis leo diam, vel egestas odio iaculis ac. Integer dapibus mi metus. Sed at eleifend ligula, ullamcorper vestibulum eros. Suspendisse dignissim metus in vulputate iaculis. Nam rhoncus felis sit amet velit scelerisque semper. Ut sed augue eget nulla laoreet scelerisque.
+
+Aenean convallis ipsum id turpis gravida, et elementum ante facilisis. Donec vitae arcu id mauris mollis hendrerit. Mauris imperdiet cursus nibh at laoreet. Sed sit amet enim magna. Mauris blandit nisi quis arcu sodales, eget consequat orci euismod. Curabitur id bibendum diam. Ut pharetra tellus nec enim tristique, id efficitur eros accumsan. Suspendisse potenti. Praesent vel porttitor risus. Nulla vitae ex nec ex hendrerit euismod non mattis arcu. Aenean eget velit massa. Pellentesque venenatis arcu mauris, sit amet scelerisque sem lobortis ornare. Vivamus auctor porta eros, eget blandit lorem semper non. Nunc sed nibh commodo, hendrerit nunc at, malesuada nisl. Aliquam pretium leo sed iaculis vehicula. Vivamus interdum porta augue.
+
+Suspendisse potenti. Aenean sodales vehicula erat, vel sollicitudin eros eleifend id. Suspendisse hendrerit malesuada est, imperdiet tristique ex aliquet ac. Vivamus ultricies placerat lorem, ac placerat lectus sollicitudin ac. Etiam consequat odio vel bibendum pretium. Integer elementum nisl magna. Nam et vehicula risus, sed mollis tortor. Ut in molestie turpis. Nam luctus, elit molestie varius luctus, lacus ligula ullamcorper elit, non interdum ipsum neque non nibh. Curabitur vulputate facilisis suscipit. Sed vitae augue eu ex luctus lacinia ac vitae quam. Quisque non nibh ex. Praesent gravida efficitur dui, a vulputate nulla ultrices vitae. Duis libero dolor, facilisis in tempus vitae, pharetra non libero. Sed urna leo, placerat quis neque at, interdum placerat odio. Interdum et malesuada fames ac ante ipsum primis in faucibus.
+
+Vivamus in hendrerit elit, quis egestas sem. Sed tempus dolor finibus massa ultrices, sed tristique quam semper. Pellentesque euismod molestie facilisis. Vivamus sit amet ultrices elit. Ut eleifend, libero eu molestie maximus, ipsum elit pulvinar tortor, et aliquet nulla orci eu est. Nullam pretium, ligula at faucibus gravida, velit mauris pulvinar felis, sit amet tincidunt magna dui ut quam. Phasellus porttitor eu nunc id maximus. Suspendisse volutpat suscipit porta.
+
+Integer dictum augue purus, sed cursus eros blandit id. Vestibulum non nibh viverra, molestie lectus eu, vestibulum justo. Nullam a libero non nibh dignissim posuere id vel orci. Nulla viverra lorem eget condimentum scelerisque. Donec porta nunc sed sapien pretium dapibus. In hac habitasse platea dictumst. Suspendisse sit amet ligula elementum, accumsan ipsum vel, imperdiet massa. Fusce scelerisque non erat ac bibendum. Pellentesque consequat vehicula euismod. Morbi sapien nisl, ultrices ut scelerisque consectetur, ornare et orci. Maecenas efficitur eros a venenatis rutrum. Aenean bibendum dui in enim luctus posuere. Donec placerat porta eros eu dignissim. Fusce nulla velit, sodales eget nibh gravida, tincidunt venenatis urna. Aenean condimentum, massa in fringilla lobortis, turpis felis lacinia metus, sit amet facilisis nisl quam aliquet diam. Praesent fringilla vitae arcu nec lobortis.
+
+In tincidunt nisi ac dictum cursus. Sed dolor purus, posuere vel dolor vel, semper tempor elit. Integer nec scelerisque tellus, sit amet dictum magna. Donec hendrerit aliquet libero, a varius velit dapibus quis. Donec lectus turpis, egestas vel vestibulum vitae, iaculis quis eros. Maecenas id convallis metus. Duis quis tellus iaculis, lobortis massa vitae, condimentum eros. Pellentesque scelerisque nisl id hendrerit tempor. Donec quam augue, maximus eu porta ut, venenatis a ante. Curabitur dictum et nibh sed auctor. Nam et consequat odio. In vitae magna a dui porta pellentesque quis id magna. Sed eu nunc bibendum, imperdiet nunc sit amet, cursus diam. Vivamus in odio vel nibh sollicitudin molestie. Morbi sit amet leo et odio congue pharetra. Aliquam quis suscipit orci.
+
+Donec at ornare orci. Suspendisse nec tellus elit. Nam erat urna, laoreet at elit sed, tristique interdum ligula. Nullam dapibus orci sed lorem convallis fringilla. Cras urna ipsum, tristique maximus nisl quis, auctor mattis quam. Donec finibus consectetur lectus et interdum. Aenean posuere lectus vel turpis auctor finibus. Praesent molestie lectus ipsum, et tristique quam porttitor ac. Suspendisse aliquam pretium tortor, id egestas erat. Nulla mollis, orci at semper vulputate, nisl est pharetra diam, sit amet vulputate diam augue a sem. Donec in mauris felis.
+
+Nunc eleifend at elit a volutpat. Integer semper quis quam at faucibus. Donec pretium purus vitae erat pretium posuere. Sed ac aliquet nulla. Nam ut sagittis mauris. Sed quis sagittis risus, id pretium urna. Nam sagittis elementum ornare. Aenean ligula sapien, congue eget mi quis, viverra commodo nibh. Suspendisse non iaculis magna, nec volutpat neque. Donec eu dapibus eros.
+
+Nam sit amet iaculis massa. Nullam vel laoreet tellus, id cursus tortor. In hac habitasse platea dictumst. Curabitur in urna risus. Proin dui sem, interdum accumsan cursus ut, dignissim in purus. Nunc vitae consequat arcu. Proin volutpat elementum quam in posuere. Pellentesque luctus arcu in ornare tempor. Cras est turpis, viverra vel consectetur ac, dictum a quam. Donec sagittis tortor sed volutpat accumsan. Curabitur a tellus vitae arcu pretium viverra vel in ligula. Pellentesque turpis augue, porta vitae quam id, fermentum congue leo. Sed nec fermentum turpis. Nulla vehicula vulputate sem eu consequat. In tincidunt nisi et mi maximus, non facilisis justo porttitor. Proin eu sapien aliquam, accumsan nunc non, pulvinar leo.
+
+Nam vitae commodo sem. Ut laoreet in quam in suscipit. Nullam at faucibus diam. Fusce ut purus at ex lobortis elementum vitae quis sapien. Nam tempus consectetur ex, sed luctus felis. Donec porttitor mi dui, non luctus quam consectetur eu. Ut a egestas diam. Etiam sodales, nisl vitae gravida pulvinar, libero est condimentum tellus, vitae ullamcorper tortor justo a urna. Maecenas ac velit accumsan, laoreet leo eget, elementum libero. Maecenas dictum tincidunt blandit. Proin sed bibendum urna. Phasellus fermentum tincidunt tempor. Mauris iaculis, mi ac fermentum interdum, nibh odio pellentesque nunc, vel scelerisque sapien sem id purus.
+
+Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas imperdiet sit amet lectus at hendrerit. Vivamus luctus, elit non lacinia hendrerit, risus velit finibus nulla, quis sagittis ipsum diam ut odio. Sed mauris sapien, vehicula efficitur gravida sed, gravida in lectus. Fusce eget consectetur turpis, in fermentum neque. Nullam turpis turpis, feugiat a accumsan in, euismod a augue. Vestibulum nec neque libero. Phasellus eget efficitur turpis, fermentum molestie nunc. Sed consequat elit urna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
+
+Nunc egestas consequat blandit. Donec quis porta sapien. Sed augue nunc, efficitur vitae tellus sed, finibus bibendum sem. Fusce id sem quis quam pharetra ultrices. Phasellus non convallis velit. Quisque erat tellus, pretium eget porta in, ornare a arcu. Aenean nec lectus lorem. Suspendisse dolor lectus, ullamcorper ornare lorem a, consequat lobortis elit. Nunc dignissim est nec gravida facilisis. Proin faucibus erat vel eros volutpat, in vulputate neque sodales.
+
+Nunc vitae imperdiet ipsum, faucibus vehicula magna. Nulla nec nisl sapien. Curabitur et dui eget tortor efficitur accumsan. Aenean in pellentesque erat. Nam condimentum neque pulvinar, aliquam nisl eu, mollis lorem. Integer rutrum arcu eget felis semper euismod. Quisque vestibulum vel diam a tempor. Aenean mollis, tellus sit amet pretium pulvinar, nulla dolor ornare ligula, eget dignissim orci tortor ut sapien. Nam ut ipsum id lectus venenatis tempus vel non ex. Suspendisse blandit vitae nunc vitae porta. Suspendisse tincidunt est sit amet ultricies consectetur. Nulla fermentum hendrerit ex, vehicula rhoncus arcu lobortis ut. Vestibulum fermentum ornare diam at pellentesque. Praesent nunc lorem, porta et magna nec, sodales commodo justo. Duis aliquam sapien et rutrum tempus. Vestibulum malesuada felis eu ligula posuere luctus.
+
+Maecenas lacinia, lectus eget rhoncus aliquam, tortor est gravida sapien, vel aliquam arcu erat et magna. Praesent fringilla leo eget neque posuere imperdiet. In porttitor elit non enim gravida euismod. Aliquam tempus, orci at interdum dapibus, mauris lacus egestas sapien, ac ullamcorper ex nibh sed orci. Quisque iaculis enim et lectus egestas, malesuada posuere lectus interdum. Sed dignissim neque vel turpis dictum ornare. Vestibulum suscipit consequat maximus.
+
+Ut et ante sit amet leo rutrum volutpat. Sed malesuada quis sapien et ornare. Aliquam ac ex enim. Curabitur vel quam et orci posuere feugiat. Pellentesque nec metus eget sapien eleifend tincidunt non sit amet arcu. Cras posuere metus eget risus varius fermentum. Nullam orci eros, efficitur nec sapien nec, pretium laoreet erat. Nam gravida purus mauris, ac viverra orci hendrerit sed. Aenean ligula massa, posuere id faucibus vitae, malesuada quis augue. Morbi consectetur mattis mi, quis sodales diam bibendum eget. Aliquam sagittis neque at feugiat posuere. Donec gravida lectus a lectus fringilla tincidunt. Vivamus volutpat dui et turpis condimentum, ut tincidunt tortor lacinia. Ut laoreet, ante in pellentesque sodales, elit mauris scelerisque dui, quis tincidunt quam massa ac enim. Nulla porta porta sapien vel sollicitudin.
+
+Phasellus sed lectus posuere, mollis ante non, feugiat odio. Aenean a quam id mi ornare dapibus. Donec venenatis ipsum non velit accumsan, id elementum dolor imperdiet. Phasellus lacinia erat diam, sit amet convallis lectus ornare in. Curabitur lorem ligula, maximus eu varius quis, auctor quis odio. Etiam in orci porttitor, sodales ipsum at, rhoncus turpis. Nulla eget luctus nisi. Duis convallis est eget ligula fringilla viverra. Duis nec sapien quis dui luctus ornare sit amet quis erat. Quisque nec justo dui.
+
+Sed eleifend, tellus quis laoreet rhoncus, leo turpis imperdiet turpis, pretium varius odio tortor et leo. Morbi ut mi fringilla, porttitor sem ac, accumsan ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum cursus dolor accumsan dolor aliquet dignissim. Duis sed feugiat erat. Donec sed arcu accumsan, ornare nisl eget, lobortis nibh. Praesent pulvinar quis justo et hendrerit.
+
+Sed velit nibh, efficitur ut leo sed, eleifend iaculis nisl. Mauris ac diam euismod, luctus enim maximus, tincidunt sem. Ut tempus magna vitae blandit bibendum. Sed sapien tortor, ultrices et justo vel, pharetra faucibus dui. Vivamus et vestibulum arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Mauris tincidunt suscipit risus, vitae varius felis commodo in. Nullam semper tortor dolor, sit amet pharetra odio interdum hendrerit. Pellentesque sed justo eros. Cras quam purus, eleifend id tellus molestie, eleifend finibus lorem. Donec a volutpat libero, at vehicula tellus. Vivamus tellus orci, pharetra in nisi vitae, tincidunt dapibus nunc.
+
+Suspendisse ultricies sem laoreet quam molestie ullamcorper. Sed auctor sodales metus, eget convallis eros ultrices quis. Duis rutrum mi a tortor iaculis posuere. Suspendisse potenti. Pellentesque dictum faucibus dui a vestibulum. Donec elit nisl, aliquet at dolor non, viverra dignissim felis. Donec mi elit, condimentum sit amet magna id, efficitur sodales arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque est elit, porttitor eget bibendum nec, auctor nec nulla. Pellentesque dignissim nisl vel orci commodo, ut ullamcorper justo viverra.
+
+Suspendisse pharetra gravida turpis sit amet efficitur. Nulla mattis tortor eget pharetra ultrices. Ut a turpis maximus, pharetra justo non, tempor quam. Nam et volutpat lectus. Vestibulum congue turpis augue, quis eleifend nulla euismod in. Vestibulum sed erat tempus, porttitor diam vel, elementum metus. Aenean facilisis molestie ante, sit amet ornare lacus mollis sed. Maecenas rutrum urna nec ex malesuada consequat. Nunc interdum pellentesque nisl sed viverra. Nam nec fermentum ipsum. Nulla facilisi. Maecenas congue dolor erat, a fermentum enim congue vitae. Integer metus libero, feugiat at eleifend eu, iaculis nec leo. Praesent eleifend convallis leo, eu posuere urna elementum eu.
+
+Aliquam dapibus dolor vel urna luctus venenatis. Suspendisse potenti. Donec vitae tellus nisi. Pellentesque vel neque dignissim, ornare tellus sed, sodales metus. Aliquam vitae maximus tortor. Nullam mattis, odio id porttitor euismod, est leo aliquet massa, bibendum pulvinar justo orci a magna. Morbi ut nisl congue, porttitor erat non, gravida turpis. In nulla risus, ullamcorper quis suscipit vel, tristique ut nulla. In malesuada odio augue, ac hendrerit nunc mattis a. Nam in quam ut elit ullamcorper mattis. Sed fringilla tempus felis, id pretium tortor varius non. Aenean quis sem quis risus mattis posuere vel quis nibh.
+
+Sed pulvinar commodo dui sit amet malesuada. Quisque porta tellus placerat congue efficitur. Cras id blandit enim. Praesent a urna felis. Aliquam ornare, nisl eget iaculis tempor, ligula mi vehicula dolor, ut eleifend massa massa vel est. Fusce venenatis laoreet lobortis. Proin tempus aliquet nunc ut porttitor. In est mauris, blandit eu mattis vitae, aliquam a orci. Cras vitae nulla nec ex cursus blandit. Aliquam fermentum, erat in aliquet dictum, metus urna fermentum quam, non varius magna lectus non urna.
+
+Donec faucibus nisl nunc. Integer rutrum dui enim, malesuada semper turpis pulvinar eget. Fusce consectetur ipsum tellus, sed maximus lorem auctor in. Morbi nec est in quam ultricies hendrerit. Sed aliquam sollicitudin elementum. Aenean aliquam ex sit amet dignissim venenatis. Duis malesuada leo nisi, id accumsan turpis pretium id. Sed ornare magna non pharetra pharetra. Ut auctor dolor neque, nec bibendum odio viverra in. Nulla convallis interdum condimentum. Proin vestibulum turpis in lorem ultrices, bibendum tristique ligula faucibus. In tincidunt auctor sem, vitae fringilla neque pulvinar eu. Etiam commodo pellentesque enim. Phasellus feugiat non sapien eget sollicitudin. Etiam consequat efficitur lacus vel maximus. Suspendisse vitae elementum diam.
+
+Mauris urna velit, efficitur at viverra at, interdum a velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean bibendum sagittis massa in interdum. Mauris facilisis dui eget ipsum euismod ultrices. Donec sit amet lorem iaculis, condimentum velit quis, lacinia justo. Integer faucibus metus sed eros semper, in congue tortor venenatis. Proin tincidunt maximus enim, accumsan facilisis tellus gravida eu. Phasellus interdum aliquam ante, sit amet rhoncus nisl ornare at. Suspendisse libero eros, cursus quis fermentum nec, tempor eget lectus. Aenean ullamcorper augue lacus, non iaculis dui rutrum id. Aliquam erat volutpat.
+
+Morbi hendrerit fermentum sodales. Proin rutrum congue auctor. Mauris pellentesque elit non velit condimentum tincidunt a sit amet velit. Etiam accumsan ante id neque commodo vulputate. Aenean nec mattis neque. Aliquam tempor urna quis nisl convallis congue. Praesent vitae porttitor ante. Mauris mattis vestibulum ante, nec auctor augue. Praesent sem leo, accumsan eu fermentum egestas, iaculis ac nulla.
+
+Etiam vel nisi congue, varius neque id, volutpat quam. Fusce placerat arcu hendrerit orci condimentum vehicula. Integer sem ex, facilisis et lacinia a, condimentum at ante. Morbi condimentum diam tellus, non lobortis arcu pellentesque sit amet. Phasellus imperdiet augue eget sollicitudin mollis. Vivamus sollicitudin arcu aliquam lectus tristique, in consequat diam egestas. Suspendisse aliquet non velit id feugiat. Sed eu est fringilla, gravida nulla ac, dignissim tortor. Phasellus pellentesque nisl non venenatis sagittis. Etiam facilisis nulla quis lorem scelerisque vehicula id at ex. Duis in risus enim. In eu vulputate massa, vel dignissim odio. Praesent ut mi tellus. In hac habitasse platea dictumst.
+
+Nunc malesuada turpis in fermentum lobortis. Donec blandit eu orci non laoreet. Suspendisse posuere blandit tortor, in accumsan velit cursus in. Integer suscipit justo nulla, in viverra orci suscipit et. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum a pulvinar lacus. Vestibulum mattis nisi vel nunc convallis maximus. Fusce aliquam, erat in volutpat gravida, elit odio feugiat ante, nec varius enim leo eget nisl. Donec sit amet ligula lobortis, sollicitudin dolor quis, blandit augue. Duis at interdum sem. Nullam eleifend ligula urna, vitae sollicitudin purus cursus nec.
+
+In commodo risus eu justo hendrerit, ut posuere mi eleifend. Suspendisse sollicitudin odio sem. Vestibulum at dapibus dui, vel dictum nisi. In hac habitasse platea dictumst. Sed ac pharetra ex. Ut ultrices augue ut vulputate condimentum. Phasellus convallis arcu tortor, ac tincidunt justo cursus vitae. Mauris dignissim dapibus imperdiet. Nullam id quam eget mauris cursus molestie finibus eu enim. Fusce laoreet orci eu nunc fermentum tincidunt. Pellentesque vitae ex ac nunc porta mattis sed ut ligula. Phasellus erat dui, consequat et lacinia vel, blandit nec dui. Donec ipsum magna, rhoncus ac viverra vitae, feugiat vel ligula.
+
+Cras ut nisl sed elit dictum semper a at magna. Aliquam laoreet viverra velit vel lobortis. Nam tempor lorem sit amet purus tincidunt accumsan. Vestibulum et vestibulum ligula. Donec sit amet neque faucibus leo rutrum semper. Maecenas scelerisque, lacus et lobortis congue, purus quam euismod risus, et mattis orci nisl eget est. In hac habitasse platea dictumst. Pellentesque eros velit, sollicitudin quis ante vel, blandit maximus mi. Suspendisse at eros id quam vulputate ornare. Duis placerat tellus vel odio ultrices, ac feugiat enim placerat. Vestibulum ut massa mattis, commodo orci euismod, cursus lacus. Suspendisse potenti. Sed venenatis cursus neque, at lacinia erat ornare et. Sed rutrum, dui at porttitor hendrerit, lacus magna fringilla quam, id mollis elit leo ut ante. Praesent vel diam sed urna mollis laoreet eget ut risus.
+
+Mauris varius odio lectus, sit amet consequat nulla sollicitudin sed. Suspendisse commodo rhoncus enim vitae pellentesque. Aliquam vulputate sollicitudin aliquet. Mauris interdum interdum orci, non varius sem ornare ut. Sed vel nibh nunc. Duis tincidunt quam quis lectus egestas, eu ultricies ante posuere. Aenean in mauris eros. Suspendisse potenti. Vivamus sit amet augue at velit accumsan fermentum. Phasellus vel dui sit amet felis convallis sodales.
+
+Nunc mattis vitae sapien ut dignissim. Nam fermentum sit amet massa eu accumsan. In ut ipsum sit amet ante pellentesque accumsan. Nulla egestas eros eget lacus rhoncus pharetra. Nam pellentesque laoreet ex in lobortis. Vivamus congue tincidunt molestie. Integer vel turpis augue. Cras vel molestie quam. Etiam vel mauris ut tellus finibus consequat.
+
+Curabitur velit erat, vestibulum blandit massa a, aliquam elementum tellus. Pellentesque id nisl tempor lorem condimentum dapibus. Quisque ut lorem at orci elementum dapibus quis ut enim. Praesent venenatis congue arcu eu sagittis. Nunc nunc massa, posuere ac gravida id, scelerisque nec velit. Suspendisse non lacus a orci dapibus congue. Sed leo velit, facilisis sed egestas ut, vehicula at turpis. Praesent a finibus felis. Quisque est mi, pellentesque sit amet varius eu, gravida id est.
+
+Donec auctor gravida urna ac suscipit. Etiam placerat ipsum vitae ante congue, at fringilla lectus ullamcorper. Donec viverra lacus ut erat posuere, dignissim porta purus tempor. Duis eget enim quis diam vehicula pulvinar. Donec tempus eros velit, sit amet pharetra ligula placerat in. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sit amet pretium tellus, non dictum ligula. Nullam a ex purus. Vestibulum id ex rhoncus, pretium eros vel, consequat tellus. Vivamus lacinia dolor nec ipsum aliquam, euismod fermentum sem efficitur. Nulla facilisi. Pellentesque pharetra lacinia augue, et eleifend lorem aliquet eu. Ut ut porta ante. Duis ut auctor nisi, id porttitor erat. Proin sollicitudin sem quis justo sodales aliquam. Nulla pharetra gravida arcu vel tempus.
+
+Maecenas nec imperdiet nulla, vitae fringilla diam. Mauris maximus aliquet tellus at congue. Aliquam in dictum elit. Sed pretium mattis lectus, non pellentesque enim dignissim vel. Sed quis elementum diam, a porttitor enim. Cras cursus eros nisl. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ornare sapien vel diam vestibulum, at commodo metus lobortis. Sed euismod iaculis scelerisque. Pellentesque venenatis malesuada dolor, at tempus eros venenatis sit amet. Fusce a massa non libero blandit suscipit.
+
+Nulla facilisi. Sed nec leo nisl. Proin condimentum nunc at risus semper, in laoreet dui congue. Integer in dolor vitae ex maximus porttitor. In efficitur vulputate metus, ac egestas diam pharetra ac. Sed tristique tempus ligula dignissim convallis. Ut tincidunt laoreet fringilla. Praesent nunc est, lacinia tristique odio in, varius rhoncus ipsum. Vivamus bibendum justo at metus ullamcorper imperdiet. Quisque elit nibh, rhoncus a placerat eget, vehicula quis ante.
+
+Morbi fermentum turpis enim, eu interdum dui interdum sit amet. Sed vulputate lacus nec ligula gravida euismod. Duis in nisl fringilla, sollicitudin diam ac, laoreet tortor. Sed eget porttitor augue. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed eu enim convallis augue vulputate convallis. Praesent laoreet, leo at ornare luctus, nisi felis semper sapien, sit amet sodales augue mauris eu lorem. Fusce ornare volutpat malesuada. Curabitur vehicula, eros id fringilla placerat, tellus elit venenatis lorem, ac imperdiet purus ex blandit felis. Nunc suscipit elementum risus ac dictum. Aliquam bibendum dignissim ipsum, sit amet posuere sem viverra ut. Vestibulum egestas in ex ac volutpat.
+
+Donec ut faucibus velit, nec suscipit metus. Nullam dui ligula, commodo eget est venenatis, ullamcorper porttitor lectus. Suspendisse dictum, metus vitae commodo ultricies, enim quam pretium enim, a efficitur tortor purus sed ipsum. Nam sit amet lacus vel elit consectetur ultrices. Vestibulum ac nibh in metus porttitor vestibulum. In blandit et est non efficitur. Aenean vestibulum tortor sit amet mattis semper. Praesent sit amet turpis ac neque malesuada tincidunt nec nec urna. Mauris posuere elit nisl, ac ullamcorper nisi pulvinar in. Nulla ac elit in neque ullamcorper facilisis sed et dui.
+
+Quisque molestie euismod dui, non scelerisque arcu dictum a. Donec eu nulla nisl. Aliquam neque orci, ultrices in nunc vitae, sollicitudin eleifend augue. Etiam at mattis velit, a efficitur dui. Nam bibendum enim non elit tristique aliquet. Vestibulum eget nibh lacus. Pellentesque id sapien dui. Nullam urna leo, faucibus et efficitur vel, ullamcorper iaculis mi. Donec sit amet bibendum justo, id dapibus sem. Pellentesque dignissim varius tellus nec egestas. Praesent eu orci vel ipsum pharetra maximus. Cras nisl ligula, sollicitudin in ligula vel, posuere sagittis eros. Phasellus porta tristique mauris vel eleifend. Mauris sit amet volutpat ipsum, sed vestibulum orci.
+
+Ut rutrum augue quis rhoncus tincidunt. Aenean sollicitudin lacus at erat varius ullamcorper. Integer vitae orci vel nisi vulputate cursus eget nec ex. Mauris elementum, augue ac accumsan convallis, libero leo porta ante, sit amet elementum felis ligula non enim. Ut venenatis semper posuere. Vestibulum nec nisl nisi. Ut a sapien ac orci finibus dictum sed at ex. Phasellus ac lorem nisl. Quisque vitae tempor lacus. Vestibulum in mauris diam. Proin mattis ligula vitae ipsum bibendum, at dapibus nunc placerat. Nam iaculis justo in accumsan tristique.
+
+Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris pretium velit et tristique pellentesque. Nunc in sapien a purus congue rutrum. Nam placerat risus in ante rutrum rutrum. In in ligula magna. Duis orci ante, vehicula elementum consectetur vitae, lobortis vitae arcu. Ut feugiat tempus metus quis sollicitudin. Etiam cursus venenatis augue at fermentum.
+
+Vestibulum id vehicula massa. Proin ut ligula et sapien placerat tristique non nec nibh. Etiam non lacus placerat, molestie ex eu, venenatis elit. Sed posuere, ante et ullamcorper luctus, elit lectus blandit tortor, nec consequat massa elit a tortor. Fusce urna felis, porttitor at ultrices vel, eleifend porta ipsum. Pellentesque nisl nibh, molestie sit amet sem eu, dapibus pharetra nulla. Phasellus viverra augue eu augue volutpat dignissim. Integer bibendum faucibus varius. Curabitur non turpis purus.
+
+Sed pretium eros nisl, sed ullamcorper magna faucibus quis. Etiam ornare euismod tellus, vitae accumsan eros bibendum ut. Morbi a ex sed risus faucibus rutrum et ut urna. Nullam non tortor commodo, facilisis massa non, tristique metus. Curabitur placerat, arcu in egestas ullamcorper, nisl nisl luctus felis, ac dapibus erat velit sed erat. Proin sagittis felis vitae sem posuere semper. Vivamus fermentum eu nisi ac facilisis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque pellentesque lacinia ex tempus lacinia. Aliquam erat volutpat. Nam aliquet mattis risus non pretium. Suspendisse potenti.
+
+Suspendisse et sapien ornare, elementum erat vel, ultrices nisi. Curabitur interdum dignissim tincidunt. Cras eget est a velit consectetur finibus et sed nisl. Curabitur vestibulum semper posuere. Aliquam porta diam commodo nulla tempus imperdiet. Sed id dictum neque. Ut sit amet risus aliquet, dignissim velit sed, tristique ipsum. Nam a sapien id magna commodo tincidunt quis ac tellus. Nunc nec pellentesque orci. In justo purus, vulputate quis urna a, fringilla blandit sem. Cras porttitor quam vitae metus vehicula faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut eleifend orci lectus, vitae semper eros hendrerit id. Fusce nec tellus condimentum, vehicula elit quis, gravida erat. Maecenas volutpat interdum velit id vestibulum.
+
+Pellentesque id metus metus. Nullam ac metus non nisi facilisis aliquet quis a sem. Morbi cursus consectetur aliquam. Morbi id sapien nibh. Etiam tempus tempor tempor. Nam scelerisque condimentum purus. Proin nec cursus eros, in condimentum dolor. Nam in sagittis urna. Ut eget ornare erat. Vivamus nec elit ut sapien tristique aliquet a nec urna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas varius pellentesque diam.
+
+Ut eget libero iaculis urna porta iaculis vel ac eros. Sed sed mi et libero porta consequat a in libero. Sed in imperdiet ipsum, sit amet ultricies dui. Curabitur sit amet consectetur eros. Praesent nunc tellus, feugiat ac laoreet consectetur, accumsan nec magna. Praesent at elementum orci. Donec dapibus venenatis libero, id tincidunt libero euismod ac.
+
+Aenean sit amet ex placerat, molestie sapien a, volutpat turpis. Vivamus elementum lacinia nisi a convallis. Donec a sagittis turpis. Curabitur pulvinar laoreet dolor id consequat. Aliquam aliquam feugiat magna, vitae sagittis lorem mattis ut. Donec sed auctor nulla. Ut convallis, neque vitae faucibus efficitur, nisi justo pharetra odio, vitae tristique purus lorem et nisi. Quisque eleifend aliquam arcu nec maximus. Nunc mauris elit, finibus nec gravida non, maximus nec nibh. Sed eu ipsum in arcu gravida maximus. Maecenas massa dolor, ullamcorper eget odio eu, congue ornare leo. Suspendisse venenatis ultricies imperdiet. Nam finibus orci vitae sagittis finibus. Pellentesque sit amet dapibus diam. Nam eu nunc elit.
+
+Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam euismod turpis nec urna lobortis, ut malesuada ex suscipit. Fusce sed viverra risus. Pellentesque tristique nulla pulvinar tincidunt accumsan. Nullam vitae nibh imperdiet erat rutrum pellentesque et sit amet quam. Aenean laoreet ultricies hendrerit. Duis elementum tellus a feugiat vulputate. Aliquam aliquam enim placerat dolor viverra, non suscipit lorem ultrices.
+
+Proin interdum vitae lorem quis viverra. Praesent nec tempor dolor, vitae sagittis turpis. Etiam sit amet imperdiet sapien, ac laoreet arcu. Proin aliquam, risus nec maximus dapibus, dui diam elementum dolor, vitae tempor augue lorem vel justo. Aenean ac egestas dolor. Ut aliquet, felis at fringilla venenatis, leo nisl ullamcorper ex, vitae pellentesque turpis orci quis lectus. Nullam vitae suscipit metus. Integer congue, ante in lacinia rhoncus, erat lorem interdum elit, egestas suscipit lectus nunc non orci. Nunc vel viverra quam. Mauris sit amet sodales tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam quis sollicitudin libero. In nec venenatis orci.
+
+Integer non quam fringilla, tristique nulla id, gravida arcu. Aenean scelerisque lacinia magna. Praesent nunc sem, lobortis non convallis rhoncus, rutrum vitae ante. Sed et orci ut erat viverra bibendum a et lectus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce sit amet eros eget dolor pharetra vestibulum. Nullam vestibulum, massa dictum finibus egestas, orci nulla pulvinar sem, nec tempor libero lacus eu ante. Nam lacus erat, gravida eu placerat sit amet, facilisis sed urna. Suspendisse efficitur felis non ornare dictum. Nam sit amet nulla enim. Nulla eget scelerisque est. Suspendisse lacinia velit arcu, id lobortis felis facilisis in.
+
+Suspendisse potenti. Nulla porttitor metus ut nunc dictum tristique. Cras sit amet tortor eget ligula tristique efficitur. Ut at nisi id purus imperdiet laoreet. Sed sit amet malesuada urna. In nunc dolor, luctus ac condimentum ut, dapibus vel metus. Suspendisse pretium urna eget libero convallis vestibulum. Integer ut mauris hendrerit ex posuere euismod sed sed odio. Nulla egestas libero sit amet magna venenatis faucibus. Pellentesque semper vestibulum elit, et pretium felis scelerisque non. Suspendisse aliquet leo arcu, sed dapibus ex semper non. Donec lacinia dictum dignissim. Maecenas ipsum nunc, aliquet eget consectetur sit amet, aliquet vitae odio.
+
+Proin consectetur blandit feugiat. Nulla ac dictum quam. Vivamus suscipit scelerisque ipsum, vitae consequat neque sagittis id. Donec eu augue hendrerit, varius ipsum at, cursus massa. Morbi id augue id ipsum porttitor mollis. Phasellus nec libero eu arcu finibus dapibus. Nullam nec pharetra ante. Aenean sit amet urna eget justo tempus pharetra ut nec mi. Pellentesque viverra, ligula nec elementum ornare, ante elit eleifend enim, nec dignissim ligula elit in nibh. Vestibulum facilisis, felis eu condimentum dapibus, ante risus tincidunt urna, ut posuere dui augue ut ante.
+
+Nam arcu lacus, accumsan ac dolor in, egestas euismod est. Sed consectetur mauris et enim tincidunt semper. Donec sit amet pellentesque diam. Fusce viverra arcu a placerat fermentum. Nullam euismod dui eget egestas ultrices. Duis euismod viverra tortor eget eleifend. Pellentesque vitae neque dapibus, bibendum mi eu, auctor velit.
+
+Pellentesque congue consectetur turpis, eget auctor dui suscipit vel. Aliquam a sollicitudin turpis. Praesent nec blandit tortor. Suspendisse non nunc at urna tincidunt elementum. Integer eu elit nec urna maximus blandit quis at tortor. Nulla laoreet elit a purus tempus, et tincidunt lorem sagittis. Aenean semper erat eu neque hendrerit ornare. Cras posuere lorem nec orci vulputate finibus. Fusce tempor ex ac lacus gravida venenatis.
+
+Phasellus laoreet, libero vel fermentum euismod, sem diam accumsan quam, vitae gravida arcu est at sem. In bibendum, felis at viverra congue, felis nunc fringilla libero, ut scelerisque erat massa ut neque. Suspendisse potenti. Cras faucibus dolor vel tortor blandit, quis imperdiet magna semper. Nullam ut urna dapibus, vulputate est a, hendrerit purus. Vivamus vestibulum nisi a tempus placerat. Morbi vitae ultricies lacus.
+
+Nunc vel efficitur urna. Fusce bibendum suscipit mauris, quis imperdiet nisl bibendum non. Nam sed nisi imperdiet, pellentesque sem sed, pellentesque diam. Praesent luctus feugiat odio, eget fermentum lectus ullamcorper non. Phasellus pulvinar lectus sed ligula semper lobortis. Pellentesque fermentum ultricies fermentum. Quisque id turpis vel orci rutrum rhoncus id vel metus. Vivamus ex leo, accumsan eu luctus sit amet, tincidunt vitae erat. Sed eu mollis odio, ut ultricies lacus. Duis enim odio, pellentesque non velit vel, aliquam blandit erat. Mauris feugiat felis fermentum purus blandit, id rhoncus lorem tempus. Integer cursus, nunc vitae laoreet commodo, nunc lacus venenatis orci, quis eleifend risus est nec quam. Nulla tincidunt nunc ac purus tincidunt, eu molestie ipsum sollicitudin.
+
+Vestibulum ac varius velit, non suscipit nulla. Vestibulum a sagittis tortor. Suspendisse vestibulum felis quam, eget blandit nulla dictum vel. Praesent eu tellus ut lacus facilisis ultrices. Etiam fringilla nulla nec leo viverra faucibus. Sed nec sollicitudin nisl. Aenean libero massa, ornare sed elit ut, interdum fermentum arcu.
+
+Aliquam maximus diam et elit dapibus, eget condimentum sapien finibus. Etiam gravida nunc dapibus facilisis feugiat. Sed quis massa ligula. Nunc eleifend dolor lacus, at dapibus nisi vulputate eget. Etiam vel euismod urna, quis molestie nibh. Vestibulum bibendum erat non dictum sollicitudin. Suspendisse sed placerat lacus. Cras sollicitudin quam justo, a condimentum urna feugiat a. Quisque mauris libero, ultricies at ligula a, facilisis euismod ante.
+
+Morbi hendrerit maximus sapien ut auctor. Nullam nisi erat, aliquam ac metus eu, fermentum laoreet augue. Nam ultricies mi at vulputate laoreet. In ipsum est, blandit sit amet lorem id, egestas aliquam odio. Praesent venenatis lobortis mi. Aenean eu lacus consequat, mattis enim et, pellentesque leo. Duis convallis facilisis placerat. Donec porta, enim eget placerat congue, nisi augue faucibus odio, et fringilla purus elit vitae felis.
+
+Nulla et tellus a libero pellentesque eleifend vitae mattis nisi. Nunc placerat neque et sapien lobortis, aliquet pharetra nunc vulputate. Suspendisse potenti. Etiam ullamcorper lacinia varius. Suspendisse sit amet malesuada magna. Nam molestie mi nec diam tempus laoreet. Suspendisse urna tellus, scelerisque vitae purus et, dapibus fermentum felis.
+
+Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec scelerisque eget neque sed hendrerit. Donec at ligula augue. Donec vulputate massa nunc, a feugiat nunc elementum ut. Donec pulvinar libero sit amet ante faucibus sagittis. Mauris quis diam ultrices, tristique sapien nec, tempus urna. Morbi hendrerit odio sit amet leo lacinia, non egestas diam condimentum. Suspendisse efficitur sapien eget elit euismod tristique. Duis posuere vestibulum risus id sodales. Ut eget mi in urna rutrum molestie non nec dolor. Curabitur sollicitudin pharetra lacus, in sodales tortor tempor vitae. Nullam rhoncus arcu vel euismod varius.
+
+Aenean malesuada, purus quis volutpat sollicitudin, lectus risus lacinia mi, a facilisis ante lacus a dolor. Aenean vel aliquam tortor. Vivamus ornare, tellus at malesuada suscipit, quam dolor egestas erat, id convallis enim augue a enim. Aenean ultricies sodales placerat. Vivamus vel erat ac mi vulputate commodo nec eget urna. Suspendisse potenti. Mauris quis dapibus est, id tristique libero.
+
+Suspendisse ex diam, imperdiet quis dui id, interdum sodales elit. Maecenas at nunc ligula. Etiam imperdiet convallis magna sit amet tristique. Proin hendrerit laoreet magna, eget malesuada elit rhoncus et. Curabitur eget odio imperdiet, molestie sapien pretium, efficitur turpis. Aliquam sed congue arcu. Pellentesque vitae mauris id neque pulvinar tempor. Donec lobortis tellus id gravida dictum. Nulla et varius ex. Vestibulum pharetra eu quam dapibus finibus. Nullam accumsan sagittis turpis. Mauris fermentum orci et tortor tempus, ac tristique odio sollicitudin. Duis nec elit et magna imperdiet molestie eget vel ante.
+
+Suspendisse tempus augue nec massa molestie aliquam. Pellentesque vestibulum, erat sit amet fringilla fermentum, sapien lorem tempor felis, at efficitur augue erat quis nisi. Proin nec felis sagittis, sollicitudin turpis eu, fringilla leo. Vestibulum at augue nec dui vestibulum aliquam a at metus. Duis ullamcorper eleifend bibendum. Maecenas viverra mauris lacus, et consequat nisl pharetra eu. Praesent rutrum diam eu mi aliquet, non pellentesque est suscipit. Vestibulum massa leo, blandit eget mi at, cursus faucibus nunc. Praesent nec bibendum libero, vitae cursus libero. Sed consequat vitae eros nec maximus.
+
+Pellentesque et tortor eget lectus feugiat venenatis. Integer ornare nisl quam, nec imperdiet justo finibus at. Morbi malesuada, ante sit amet rutrum tempor, risus lorem tristique urna, egestas varius purus ex ut sem. Etiam sit amet feugiat sapien. Etiam quis risus commodo, eleifend velit quis, tincidunt enim. Mauris fermentum lacinia velit quis efficitur. Nunc sit amet lacus sit amet urna viverra feugiat. Nullam sagittis rhoncus suscipit. Aliquam eu sem ligula. Sed sodales risus et tortor lacinia tristique. Nulla massa augue, malesuada sit amet euismod ac, euismod placerat nulla. Sed lobortis ex nec lacus facilisis, nec semper mauris ultrices. Quisque ornare non felis vitae pellentesque. Donec mattis ut magna sed imperdiet. Integer viverra tempus feugiat.
+
+Donec laoreet aliquam imperdiet. Fusce justo neque, dictum vitae fringilla vitae, euismod sed augue. Fusce sodales, lectus a congue bibendum, ante eros pharetra tortor, eu sollicitudin libero ipsum sit amet felis. Curabitur sed condimentum quam, in iaculis ante. Ut feugiat dictum odio, vitae hendrerit lacus volutpat sed. Sed scelerisque et metus nec gravida. Mauris mattis porttitor magna, ut maximus justo sagittis vitae. Donec at metus ut leo gravida vehicula in sed diam. Vestibulum dignissim suscipit sagittis. Nam varius et arcu sit amet lacinia. Sed eget elit rhoncus, elementum dolor a, vehicula orci. Nam vitae tellus sapien. Phasellus massa lorem, commodo quis placerat in, semper faucibus tortor.
+
+Vivamus id dolor mi. Curabitur sagittis posuere quam in mollis. Phasellus finibus ipsum vel elit tincidunt, a bibendum ligula vulputate. Suspendisse quis purus nisl. Integer mi sem, posuere quis nisi a, consequat consequat magna. Vestibulum bibendum mauris in risus auctor fringilla vel at lacus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus venenatis mauris at mattis eleifend. Donec tempus ipsum ac nisl convallis ultrices.
+
+Nullam eu nibh ut erat vehicula accumsan. Vivamus vitae faucibus libero. In in luctus odio. Nulla nec enim pharetra, fermentum erat in, tempor turpis. Sed ac magna suscipit, dignissim elit id, faucibus libero. Maecenas placerat in dolor et faucibus. Sed maximus purus dolor, non egestas massa rutrum non. Nunc ut rhoncus lacus. Sed sit amet dolor eu sapien sagittis molestie. Aenean ipsum erat, rutrum a diam et, varius porttitor ligula. Phasellus fermentum fermentum felis.
+
+Phasellus odio massa, lacinia ac hendrerit vestibulum, placerat sit amet erat. Praesent eget justo scelerisque, congue est in, pharetra mi. Etiam blandit turpis dui, a faucibus ipsum viverra vitae. Praesent sed scelerisque arcu. Cras nec venenatis ipsum. In et tempus metus. Pellentesque cursus quis nibh quis porttitor. Duis leo lacus, pretium eget rutrum eu, tincidunt lobortis tellus. Cras in erat tristique arcu faucibus luctus sit amet tempus erat. Nullam placerat, est a interdum iaculis, purus justo convallis arcu, at mattis erat sem tempor velit. Curabitur sapien sapien, tempor eget sodales vitae, blandit ac libero. Proin eget sem et arcu malesuada convallis non a est.
+
+Ut id sagittis urna. Morbi est mauris, molestie quis magna ut, convallis porta justo. Etiam in vulputate sem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nullam consectetur enim nisl, sit amet pulvinar turpis elementum at. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum convallis cursus libero vel feugiat.
+
+Curabitur vel scelerisque metus. Etiam aliquet faucibus quam, vel aliquet est mattis quis. Pellentesque pulvinar sodales augue, a dignissim sem tristique vitae. Pellentesque dolor quam, pharetra vitae rhoncus ut, blandit at elit. Sed dignissim diam turpis, ac condimentum justo iaculis vel. Donec facilisis eros sit amet est dapibus, vel pellentesque eros consequat. Integer euismod mollis metus, vel rutrum risus imperdiet ac. Fusce semper dolor sit amet mi congue accumsan. Maecenas sagittis magna justo, vel varius ante scelerisque id. Fusce at urna sapien. Aliquam dui sapien, facilisis eu magna laoreet, feugiat tincidunt elit. Fusce iaculis sit amet erat id dignissim. Suspendisse sollicitudin laoreet consequat. Pellentesque eu mollis quam, vel dapibus libero. Duis mattis tortor vitae orci vehicula, et viverra ipsum lobortis. Quisque iaculis sapien est, id sagittis tortor rutrum at.
+
+Duis ut condimentum risus, et venenatis nulla. Praesent urna ex, faucibus eu mollis nec, lobortis vitae neque. Vivamus a malesuada tellus. Quisque bibendum dolor nec massa porta, nec malesuada magna auctor. Phasellus non auctor turpis, et bibendum risus. Ut pellentesque justo non neque convallis, ut imperdiet diam sagittis. Nunc arcu nisi, rutrum sagittis neque elementum, finibus consequat felis. Proin euismod elit eu urna tristique ultrices.
+
+Curabitur id hendrerit ipsum. Aliquam tortor nisi, dignissim vel sodales a, ultricies a ipsum. Etiam commodo arcu sed volutpat varius. Proin vehicula lacinia tempor. Vestibulum feugiat nibh eu ante tempor efficitur. Etiam eleifend a orci eu euismod. Cras a tortor risus. Cras nec urna non urna malesuada maximus vel et ipsum. In ullamcorper porttitor dolor, at fringilla tortor tristique ac. Nulla gravida tortor nec dolor convallis, accumsan sollicitudin dui luctus. Vestibulum euismod vestibulum semper. Nam semper lacus dolor, vitae rhoncus nisi blandit nec. Phasellus turpis dolor, posuere sed sodales sit amet, interdum ut arcu.
+
+Sed blandit nulla et sem vulputate, et semper lacus posuere. Proin velit lorem, sagittis tincidunt aliquet vitae, fermentum sed orci. Ut interdum ultrices dolor eu tempor. Quisque pretium vulputate dui at blandit. Aenean pretium urna sed purus dapibus aliquam. Mauris tristique augue pretium magna scelerisque, vel cursus sapien porttitor. Nullam neque justo, aliquam non neque id, lobortis facilisis nibh. Duis molestie dui eu augue tristique porttitor. Sed posuere justo massa, efficitur vulputate erat posuere non. Cras quis condimentum tellus.
+
+Etiam eleifend ipsum ut justo viverra porttitor. Nam bibendum enim nec ligula vestibulum, vel fringilla velit posuere. Praesent leo enim, varius sit amet nulla ut, sodales sollicitudin nunc. Phasellus hendrerit varius ex quis tempus. Suspendisse maximus laoreet enim, ut bibendum tortor. Ut non magna vehicula augue condimentum scelerisque. Aenean efficitur elit vel rhoncus euismod. Vestibulum sit amet sollicitudin dui. Quisque ac diam nibh. Nullam quam enim, volutpat eu turpis et, posuere consectetur neque.
+
+Ut tincidunt semper dictum. Etiam varius enim sit amet metus consequat malesuada in at ligula. Cras nisl dui, tincidunt a urna et, porttitor rhoncus velit. Mauris interdum imperdiet lectus ac mollis. Aliquam sollicitudin ornare mi, a varius nulla faucibus aliquet. Nunc fermentum tempor ullamcorper. Pellentesque laoreet libero condimentum pellentesque pharetra. Nullam sed eros vel erat vestibulum dictum. Nulla nec interdum dui, quis finibus nunc.
+
+Sed ac turpis in mi ultricies finibus sit amet et diam. Pellentesque sagittis non ligula et convallis. Suspendisse interdum est aliquet erat rhoncus semper. Donec pretium turpis ante, vel posuere mauris facilisis vel. Vivamus nibh ligula, pharetra sit amet hendrerit nec, vulputate ut sapien. Nulla ullamcorper condimentum metus vitae imperdiet. Ut eget ex purus. Nulla dapibus malesuada pharetra. Praesent sit amet ornare turpis. Nulla pulvinar felis eget arcu mollis vulputate. Vestibulum eget semper felis. Donec viverra justo id mi tempor, a mollis ipsum porttitor. Maecenas aliquet volutpat ante eget tempor. Duis ipsum nisi, scelerisque quis metus vitae, blandit faucibus nisl. Mauris rutrum nisi sed lorem dictum ultricies.
+
+Nulla dictum arcu augue, aliquet ornare ligula suscipit ut. Integer libero erat, bibendum quis arcu at, consequat luctus sem. Ut ut erat tincidunt, porta erat efficitur, bibendum neque. Maecenas eget convallis sapien. Nullam facilisis ex et lorem fringilla, ut convallis leo dictum. Duis porttitor, ex eu venenatis faucibus, erat augue dapibus leo, sit amet scelerisque neque dui sed arcu. Praesent at diam nec sem sodales condimentum. Vivamus vehicula urna tellus, a semper ipsum cursus id. Duis auctor enim erat, laoreet volutpat dui rhoncus maximus. Suspendisse pellentesque euismod lacus, at auctor purus. Suspendisse volutpat imperdiet diam, id laoreet est egestas at.
+
+Fusce lobortis ex vel condimentum convallis. Vivamus fermentum convallis dolor quis rutrum. Donec tempus ornare maximus. Mauris quam neque, dignissim rutrum maximus sed, volutpat sed lectus. Donec id augue gravida, pretium purus eu, sagittis tellus. Maecenas tincidunt gravida felis nec pulvinar. Fusce turpis urna, sodales non rhoncus nec, sodales ac ipsum. Suspendisse risus felis, imperdiet id malesuada fermentum, ultricies et erat. Suspendisse potenti. Pellentesque tellus ipsum, dapibus eget pellentesque eleifend, venenatis sed risus. Ut sed mollis nisl. Aliquam lobortis aliquam ipsum, et ornare magna bibendum ut. Proin quis justo vitae neque tincidunt maximus ultricies et purus. Nullam non semper turpis. Quisque non mauris odio.
+
+Donec commodo tempus egestas. Vestibulum at diam vel mi tincidunt finibus. Donec aliquam magna id eros tristique finibus. Cras ut enim sapien. Proin gravida risus a nisi dapibus, ac vulputate nunc laoreet. Donec at leo vel nulla iaculis feugiat sed et ante. Nulla a arcu at ligula sollicitudin semper sed eget est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Ut dolor magna, luctus id elit ut, interdum viverra lacus. Aenean sed tempor metus. Aenean arcu dui, eleifend quis est sed, luctus lacinia nulla. Morbi id luctus libero. Maecenas sodales leo eu sapien maximus porta. Praesent gravida augue eu ligula pretium cursus.
+
+Duis aliquam luctus tortor, eu facilisis quam sodales sed. Phasellus feugiat venenatis lorem, in scelerisque est efficitur quis. Cras quis nisl nisl. Quisque magna felis, tempus nec pharetra et, tempor id ligula. Pellentesque sed dignissim velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris convallis iaculis posuere. Nullam orci velit, venenatis eget enim quis, molestie consequat dolor. Nulla egestas risus vestibulum sagittis blandit. Nullam dui lacus, tempus euismod sapien a, eleifend sodales justo. In id tortor neque. Vivamus faucibus ante ac odio vestibulum, vitae condimentum nibh consectetur. In rutrum hendrerit est, sit amet mollis ex aliquet tempor.
+
+Donec non tincidunt sem. Nullam dignissim felis nibh, et accumsan felis tristique sed. Maecenas id massa erat. Ut justo ligula, aliquet eu condimentum a, aliquet eget ex. Phasellus et neque eu nisl consectetur ullamcorper. Sed gravida efficitur nisi, vitae posuere nisi tincidunt sed. Duis vitae molestie metus, vitae finibus urna. Integer at lacus vitae turpis convallis feugiat a dignissim libero. In dolor nibh, aliquam eu malesuada in, tincidunt vitae nisi. Nullam at lectus risus. Integer vitae ligula interdum, congue nibh id, tincidunt dolor.
+
+Mauris risus quam, mollis eu consequat vitae, molestie sit amet risus. Vestibulum congue vulputate nibh sit amet ullamcorper. Nullam elit justo, hendrerit euismod elit nec, gravida tincidunt ipsum. Aenean tellus tortor, commodo vitae cursus vitae, finibus quis mi. Nam in tellus scelerisque, cursus magna a, elementum tellus. Praesent ut lacinia justo. Donec consectetur, mi nec faucibus viverra, nisl justo suscipit est, in consequat ex urna vitae orci. Fusce molestie feugiat ex sed dictum. Phasellus interdum eros dapibus sodales volutpat. Morbi elementum sapien ante, quis sagittis justo fermentum at. Maecenas vestibulum massa quis eleifend rhoncus. Praesent auctor ex at urna pellentesque facilisis.
+
+Duis tincidunt porta quam, in commodo orci dapibus interdum. Donec mattis erat ante, nec faucibus magna pharetra id. Aliquam dignissim ultricies auctor. Duis quis ex mi. Phasellus ipsum mi, volutpat quis augue nec, dapibus aliquet lectus. Aenean id eros mi. Fusce rhoncus iaculis magna, commodo commodo nibh pellentesque ut. Donec consectetur lacinia erat ut luctus. Mauris efficitur erat vitae sapien fringilla sollicitudin. Maecenas a egestas ipsum. Aenean placerat congue augue, ut condimentum lorem accumsan in. Morbi ac quam nunc.
+
+Nunc posuere faucibus semper. Integer at convallis ex. Duis a purus molestie, dignissim mi quis, consequat nulla. Proin tempus congue ligula, sit amet ultricies enim consequat ut. Nunc ac est at nisl euismod cursus. Pellentesque vulputate molestie ipsum. Praesent varius, lacus non lobortis blandit, nibh lacus scelerisque nisi, sit amet interdum ligula tellus ac purus. Vestibulum sed quam tempor, pharetra tellus ullamcorper, tincidunt est. Nulla tempus tortor nec erat tempus eleifend pellentesque eget purus. Duis gravida dui justo, ac commodo ipsum mollis et. Nullam vitae nibh enim. Ut sodales mi eu diam sagittis, quis luctus tortor euismod.
+
+Maecenas a augue ac augue varius rhoncus. Fusce nunc turpis, mattis eu iaculis a, dapibus nec purus. Pellentesque imperdiet sit amet purus a blandit. Morbi augue tellus, venenatis nec tortor in, consectetur tincidunt nulla. Aenean purus libero, volutpat quis neque vitae, mattis efficitur eros. Donec sodales venenatis augue, sed faucibus magna accumsan convallis. Pellentesque efficitur elementum imperdiet. Cras at condimentum leo. Curabitur feugiat ut nisi facilisis commodo.
+
+Sed commodo sapien quam, quis vulputate orci lobortis nec. Aenean luctus dictum ipsum, non consequat sapien molestie vel. Proin blandit libero tortor, vitae efficitur tortor hendrerit at. Sed eleifend eu velit eu tempor. Nunc auctor tincidunt mollis. Ut molestie, erat ut lobortis convallis, odio felis sollicitudin elit, vitae ultricies lorem neque et dui. Sed venenatis tempus ullamcorper. Integer eget elementum nulla. Maecenas a placerat ipsum. Etiam sagittis sagittis rhoncus. Aliquam faucibus magna id lacus pharetra, nec interdum lacus sodales.
+
+Mauris ipsum sem, venenatis non elit in, feugiat pretium lacus. Fusce eget tincidunt dolor. Nam pharetra lacus vitae diam bibendum, ac placerat tortor aliquet. Sed eget gravida orci. Ut in orci lorem. Morbi condimentum ligula dolor, in dictum mi vestibulum sed. Suspendisse eu velit finibus, tincidunt dolor malesuada, mattis est. Morbi iaculis sapien vitae metus facilisis fringilla. Donec sed volutpat neque. Mauris ipsum metus, venenatis cursus mattis quis, convallis ultricies purus. Aliquam quam magna, sagittis at mi quis, lacinia iaculis turpis. Praesent viverra, ex nec euismod lacinia, urna risus pretium odio, sit amet mattis metus eros non lectus.
+
+Nam sed vehicula est, ac aliquet mi. Aenean iaculis placerat orci, ut lobortis dui vestibulum convallis. Vestibulum eleifend ante sed lorem interdum lobortis ut vel tortor. Sed auctor id nisl sed bibendum. Fusce maximus vulputate mauris, tempus sollicitudin nunc efficitur vitae. Nulla pellentesque molestie leo, quis hendrerit enim. In vel dapibus nisi. Nam at dui quis eros porttitor volutpat in id magna. Maecenas quis quam a justo cursus aliquet viverra sit amet mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut hendrerit est at augue pretium condimentum at ut velit. Suspendisse non gravida metus.
+
+Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Praesent lacinia commodo elit, sed fringilla ipsum imperdiet ut. Proin a dictum ante. Suspendisse potenti. Praesent ac nulla volutpat, ultricies diam vel, auctor risus. Nullam aliquam elit vel quam suscipit molestie vel ac dolor. Ut pharetra finibus elit, id vulputate ex dignissim in. Ut ac finibus urna, a luctus magna.
+
+Fusce suscipit convallis eros nec blandit. Cras quis lectus nibh. Donec pulvinar rhoncus pulvinar. Vivamus nulla nisi, vestibulum vel neque et, dictum gravida ex. Vestibulum in arcu vitae nibh auctor rhoncus ac in massa. Sed semper enim ac dui sollicitudin porttitor. Etiam ante erat, laoreet sed dolor eget, cursus commodo lorem. Curabitur maximus tincidunt nulla at molestie. Phasellus ultrices felis a cursus facilisis. Nullam a semper tortor. Nulla ac vulputate justo. Mauris maximus nisi quam, elementum eleifend nulla condimentum nec. Aenean congue tincidunt mi, id mollis orci blandit vitae. Integer placerat orci at nisl vestibulum lacinia.
+
+Sed egestas posuere egestas. Quisque pulvinar velit commodo felis accumsan, a consequat purus laoreet. Ut at arcu at augue sodales rhoncus. Ut non nisl dui. Sed sed nulla quis orci eleifend auctor ut et sem. Aliquam erat volutpat. Donec egestas tincidunt leo in interdum. Donec varius odio nulla, id porttitor erat venenatis ut. Nulla ac nisl ut enim placerat congue. Fusce consequat purus eget risus luctus finibus. Donec in blandit odio. Sed vestibulum nisl ut diam vestibulum volutpat. Donec magna quam, tempor eget velit quis, blandit tristique lacus. Pellentesque et orci dui.
+
+Integer tempor mollis purus ut volutpat. Pellentesque efficitur cursus neque in ullamcorper. Integer ac tincidunt lacus, at venenatis tellus. Curabitur convallis commodo enim a convallis. Aenean sagittis sodales nibh, sed eleifend diam ultricies at. Vestibulum erat mauris, lobortis ac tempor a, viverra non sem. Nulla non ipsum mollis, dignissim elit a, laoreet enim.
+
+In laoreet purus eget orci rhoncus viverra. Quisque vel metus quis nulla hendrerit viverra. In consectetur velit vitae purus vestibulum, in hendrerit odio sollicitudin. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ut est sed ligula tincidunt fermentum nec ac nulla. Nam in sagittis velit. Vivamus vel dapibus erat, ullamcorper sollicitudin metus.
+
+Quisque pulvinar nulla eget mi mattis, ut convallis nulla ullamcorper. Vivamus placerat mauris vel elementum aliquet. Sed ac accumsan eros. Vivamus vitae rhoncus urna. Fusce gravida cursus varius. In posuere finibus leo cursus molestie. Interdum et malesuada fames ac ante ipsum primis in faucibus. Mauris vulputate mi ut nunc finibus convallis. Praesent luctus erat eu urna facilisis convallis.
+
+Nam efficitur tempus augue varius porttitor. Pellentesque scelerisque dolor scelerisque, dignissim massa eget, iaculis nibh. Praesent viverra molestie dui a pulvinar. Mauris malesuada mattis felis, vitae sagittis metus pellentesque viverra. Phasellus faucibus congue blandit. Pellentesque mattis, justo sed imperdiet rutrum, metus metus porta nisi, vel malesuada lorem massa at dolor. Nullam nisi eros, tristique quis mollis ac, hendrerit nec leo. Praesent viverra molestie vestibulum. Nullam eu aliquam risus, at dignissim diam. Quisque blandit fermentum erat, sed ullamcorper augue pellentesque in. Integer eleifend libero non lacus sagittis auctor. Aliquam volutpat interdum accumsan.
+
+Etiam in eros porta, bibendum lacus eget, feugiat orci. Integer massa dui, commodo ac luctus nec, ornare id velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis dignissim scelerisque ex. Aliquam tempus cursus nibh, sed scelerisque libero sagittis ut. Morbi finibus vestibulum nulla, nec aliquam urna venenatis vulputate. Pellentesque ultricies, lorem a dignissim bibendum, augue nisi eleifend libero, cursus ultrices nulla purus a nunc. Quisque dictum pulvinar turpis vitae finibus. Etiam eget ultrices diam. Sed commodo enim ante, fermentum rhoncus tortor tincidunt ac. Suspendisse fermentum aliquet erat non posuere. Aenean vel dapibus lorem.
+
+Aenean lorem libero, rutrum vel egestas vel, pellentesque ut ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum felis diam, pellentesque sit amet ultricies sed, vestibulum in leo. Morbi aliquet, quam ut fringilla sollicitudin, justo risus suscipit mi, in vulputate neque erat ut turpis. Duis auctor dui non urna sagittis dictum. Vestibulum nec felis vel sapien congue volutpat a a orci. Phasellus tincidunt libero ac lorem feugiat, ac elementum lectus eleifend. Praesent sit amet est id massa convallis congue. Integer ac nunc eget orci pharetra vehicula. Mauris et ultricies diam. Nunc et pellentesque lacus, eget bibendum sapien. Morbi condimentum mi ac metus euismod convallis. Proin consequat rhoncus varius. Maecenas feugiat elementum vulputate.
+
+Vestibulum tempor feugiat dapibus. Ut ornare in augue non euismod. Nulla faucibus gravida condimentum. Curabitur pharetra dui non lorem sagittis iaculis. Quisque vitae nibh magna. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce quis pharetra sem, sed aliquet lectus.
+
+Fusce volutpat tempor tincidunt. Pellentesque ultricies imperdiet tincidunt. Integer porta dictum lorem, non luctus tellus bibendum sit amet. Quisque posuere felis et est dapibus, commodo rutrum leo molestie. Fusce sodales felis sed sem pharetra pretium. Praesent nec sollicitudin nisl. Donec volutpat convallis elementum. Duis id libero augue. Nulla facilisi.
+
+Nulla viverra, urna nec efficitur vulputate, metus odio lacinia purus, in sagittis elit erat vel massa. Fusce ligula leo, finibus non felis dignissim, dictum ullamcorper odio. Phasellus vel eros eu sem venenatis sagittis a nec nulla. Pellentesque sapien elit, lobortis quis dictum et, maximus vitae metus. Curabitur quis aliquam eros. Quisque cursus condimentum urna vel efficitur. Etiam aliquet lorem ut varius suscipit. In viverra molestie felis vitae vehicula. Curabitur cursus, nunc sodales faucibus ullamcorper, urna magna dapibus velit, accumsan blandit mi quam nec justo. Donec ac dui lorem. Sed eu sagittis nulla. Suspendisse ut ante lacus. Fusce non tristique felis. Nulla convallis consectetur arcu, semper egestas urna efficitur quis. Nulla ac turpis at leo pretium maximus. Morbi cursus diam ac purus imperdiet, non commodo tellus cursus.
+
+Mauris ut eros suscipit, suscipit nisi vel, porttitor sapien. Morbi in nulla sapien. Cras maximus pretium justo, vel eleifend urna vulputate sed. Aenean egestas nisl ex. Curabitur sed pharetra ligula. Nulla blandit lorem id mauris tincidunt, at elementum risus aliquet. Quisque id interdum dui.
+
+Aenean nec elit condimentum ex viverra hendrerit. Pellentesque blandit nibh elit, a ultrices orci vestibulum vitae. Donec ultricies malesuada justo ac luctus. Pellentesque laoreet nunc a sem varius, ac dapibus ligula volutpat. Aenean sem felis, aliquam nec ullamcorper quis, ullamcorper non ante. Pellentesque libero leo, sagittis nec tempus a, tincidunt eget risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec elementum massa vel diam suscipit suscipit. Suspendisse eget neque porta, cursus orci eget, imperdiet libero.
+
+Vivamus faucibus vulputate sapien, non pulvinar ex sodales vitae. Maecenas consequat est urna, id faucibus eros dictum at. Vestibulum tortor mi, porta vitae sagittis sed, convallis quis enim. Vestibulum gravida justo pulvinar sem ornare, efficitur dictum neque varius. Nullam egestas congue tellus vitae interdum. Nam lectus erat, porta vitae lorem non, mollis semper velit. Nulla vestibulum tincidunt elit. Phasellus sed vulputate leo.
+
+Sed efficitur quam ac iaculis volutpat. Praesent nec feugiat ex. Aenean at ligula iaculis, imperdiet lacus et, condimentum magna. Integer euismod leo id mauris condimentum, quis semper lacus blandit. Sed volutpat neque urna, sit amet ullamcorper est dignissim non. Vestibulum tristique sollicitudin risus, sed hendrerit massa finibus id. Vestibulum sit amet risus non eros vehicula malesuada. Nam facilisis lacus sed quam pulvinar, at fermentum lectus tincidunt.
+
+Vivamus laoreet sem nec odio blandit, ut ornare sem egestas. Suspendisse potenti. Nulla aliquam pretium volutpat. Maecenas a orci suscipit, aliquam eros a, maximus urna. Aliquam eu gravida justo, et hendrerit justo. Suspendisse a commodo lorem, quis viverra nisl. Nulla vel pellentesque nisl. Nulla ligula tellus, vehicula sit amet turpis in, sodales tincidunt tellus. Proin ut nibh sed ipsum porta dignissim vel sed mauris. Interdum et malesuada fames ac ante ipsum primis in faucibus. In hac habitasse platea dictumst. Vestibulum efficitur nulla rutrum, accumsan lacus at, dignissim tortor. Morbi egestas metus ut nibh tincidunt posuere at sed elit. Integer eget hendrerit nulla.
+
+Donec sagittis sagittis tempus. Proin iaculis neque vehicula commodo faucibus. Pellentesque erat ante, vehicula sed efficitur vitae, varius non sem. Mauris pellentesque, felis nec egestas scelerisque, nulla nunc fringilla arcu, feugiat fringilla quam neque in elit. Nullam ut ex odio. Mauris enim risus, consequat at suscipit at, pulvinar ut arcu. Fusce mollis sem sed tellus tempus pellentesque. In pharetra, libero sed tristique vestibulum, massa velit egestas risus, at mollis augue lorem sit amet turpis. Mauris risus dui, sagittis vitae congue ut, condimentum ut augue. Quisque non sollicitudin purus, sit amet consectetur sapien.
+
+Sed scelerisque ipsum sed augue varius, sit amet ultricies purus posuere. Etiam vehicula at nunc in posuere. Cras eget risus a sapien mollis facilisis. Morbi vel purus auctor, faucibus mauris non, malesuada leo. Donec venenatis consectetur libero in pretium. Ut efficitur molestie metus id scelerisque. Nunc dolor justo, pharetra vel sagittis vitae, placerat ut justo. Donec tempor fermentum est semper auctor. Nullam tincidunt risus non risus elementum varius. Suspendisse euismod augue metus, nec pellentesque enim sagittis ac. Morbi et lectus quis justo commodo varius commodo vel risus. In bibendum purus in erat ullamcorper, sit amet dignissim sapien scelerisque. Quisque tempus elementum rutrum.
+
+In viverra sollicitudin pretium. Sed finibus scelerisque sollicitudin. Nulla lobortis purus in lectus iaculis, a ornare ex accumsan. Morbi malesuada mollis placerat. In hac habitasse platea dictumst. Pellentesque sed dui quis odio scelerisque molestie eu nec libero. Proin viverra magna ligula, at luctus lacus posuere sed. Nullam non congue mi. Praesent non mattis neque, sit amet tempus diam. Mauris eget cursus lacus, id dictum mi.
+
+Sed semper velit in vehicula tristique. In lobortis est augue, et maximus tellus iaculis ut. Proin quis ex maximus erat iaculis imperdiet. Curabitur ultrices turpis ac nibh congue ornare. Fusce a aliquet felis, nec sodales tellus. Nunc mauris ante, feugiat et facilisis at, pharetra ultricies dui. Integer felis metus, porttitor ac ipsum vitae, placerat varius ex. Morbi in dui a nunc aliquam posuere. Nulla tempus tortor ac lorem consectetur sodales. Praesent sit amet placerat diam. Curabitur sodales mauris ante, et tincidunt lacus ultricies quis. Nulla eu finibus nisl, sit amet volutpat leo. Donec ligula enim, feugiat non aliquet nec, congue interdum lorem. Pellentesque a nisi blandit, semper massa sit amet, auctor eros.
+
+Aenean ligula libero, commodo a erat at, tristique facilisis quam. Sed congue fringilla lacus, vel iaculis quam suscipit ornare. Curabitur non pretium mi. Donec condimentum odio dui, id malesuada ipsum porta ac. Aliquam imperdiet cursus ullamcorper. Duis cursus tincidunt nibh sit amet cursus. Aliquam urna orci, sodales ac ipsum at, placerat lobortis neque. Sed sit amet convallis felis, vestibulum finibus arcu. Phasellus venenatis egestas felis, id aliquam turpis iaculis non. Proin a lacus ut felis malesuada sodales. Duis elementum, eros ac placerat bibendum, quam nisl varius mauris, vel venenatis neque augue et justo. Nunc varius sem velit, vel tempus mi aliquet id. Fusce purus massa, mollis id nulla non, dignissim cursus massa. Sed sollicitudin interdum felis, nec eleifend nisl feugiat eget. Nulla rutrum id odio ut consectetur. Maecenas fermentum turpis vitae libero ullamcorper suscipit.
+
+Vestibulum auctor lectus ligula, non sollicitudin odio maximus nec. Cras faucibus, felis sed suscipit tempor, risus lorem consectetur est, eget pulvinar nibh dui eu dolor. Vestibulum pellentesque, ex aliquam vulputate laoreet, libero lorem rhoncus risus, vitae congue velit justo vitae nisi. Nullam placerat venenatis tortor, sit amet lacinia augue placerat nec. Quisque vulputate lectus vel pulvinar condimentum. Nullam at libero iaculis, mattis purus vel, tincidunt diam. Suspendisse eu ullamcorper eros. Nulla id eros odio. Ut enim leo, ultricies quis mauris sed, interdum commodo felis. Etiam enim lacus, scelerisque a interdum eget, mollis vel tellus. Phasellus vel vulputate orci. Nulla ornare leo sed arcu rhoncus convallis. Duis libero arcu, pulvinar ut tellus vitae, aliquam euismod magna. Donec semper nisi eget nulla tempus, sed condimentum massa sollicitudin.
+
+Suspendisse bibendum ante vitae ullamcorper semper. Praesent dui est, elementum nec lacus in, pellentesque accumsan sapien. Cras quis urna at lacus posuere commodo eget nec arcu. Nunc varius ante quis ligula rhoncus, ut dignissim metus commodo. Integer volutpat gravida nunc eget faucibus. Quisque imperdiet, mauris vitae cursus malesuada, lacus mauris tempus sem, ut accumsan purus lectus quis nisi. Vestibulum aliquam dui sed nisl laoreet, id posuere quam imperdiet. Aliquam ultricies non enim vel tempor. Donec sed feugiat justo, vel rutrum enim. Phasellus lorem quam, dapibus a tincidunt vulputate, pellentesque non lorem.
+
+Nunc quam diam, condimentum sit amet enim semper, hendrerit laoreet magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam et pulvinar leo, ac fermentum lectus. Sed erat ante, mattis ac tempor vitae, euismod at tortor. Ut sagittis fringilla scelerisque. Ut pulvinar molestie leo eu faucibus. Sed quis efficitur purus. Pellentesque nibh nisi, porta id orci id, sagittis sodales tellus. Ut venenatis velit a lectus lacinia, at ultrices nisi commodo. Vivamus eros orci, ornare vel ullamcorper elementum, posuere id ligula. Aliquam non massa pellentesque, semper ipsum scelerisque, dapibus leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla pretium leo diam, sit amet bibendum lacus tempus quis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer quis pulvinar nibh.
+
+Mauris sed eros nisi. Cras malesuada, turpis vitae laoreet porta, sapien odio maximus nulla, ut efficitur mauris odio tincidunt elit. Nam ut urna eros. Sed at vestibulum risus. Nulla luctus pulvinar rhoncus. Pellentesque maximus ligula a est ullamcorper, sed tempus tortor ultrices. Curabitur ligula odio, mollis sit amet risus quis, tempor auctor magna. Suspendisse vel quam quis lorem commodo facilisis. Donec eu ipsum suscipit, molestie dui sed, fringilla dui. Proin placerat ex a lorem sodales convallis. Sed molestie quam mi.
+
+Fusce laoreet nec dolor id bibendum. Nunc condimentum vulputate massa lacinia fermentum. Donec maximus cursus eros sed porta. Nunc eu porta turpis. Nulla cursus et nisl eu elementum. Ut rutrum scelerisque aliquet. In tellus erat, rhoncus id tempus vitae, vestibulum non quam.
+
+Vivamus luctus elit a efficitur dapibus. Praesent magna mi, pellentesque sed accumsan dapibus, blandit at lectus. Praesent sodales erat diam. Pellentesque placerat lobortis enim, a dapibus ligula molestie ut. Phasellus dui augue, suscipit ac urna non, iaculis eleifend augue. Maecenas sed elit iaculis, pretium ligula lacinia, aliquam libero. Nulla sem mi, pellentesque viverra lorem vel, luctus vulputate augue. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque fermentum nunc ex, at lobortis turpis congue vitae. Suspendisse iaculis elementum enim commodo facilisis. Vestibulum non neque tellus. Proin vitae sodales urna. Mauris interdum purus et neque tempus, vitae mattis libero finibus. Suspendisse iaculis condimentum nibh, eu mattis enim vehicula a.
+
+Fusce dictum urna non lectus ullamcorper vestibulum id in elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc fermentum odio non ante sollicitudin posuere. Praesent vulputate quam nec magna euismod pellentesque. Etiam tempor nunc eget velit volutpat eleifend. Mauris sodales nunc ullamcorper, gravida purus eget, rutrum sem. Nam a sapien rhoncus, scelerisque lacus ac, condimentum ipsum. Pellentesque suscipit, ligula ut rhoncus ullamcorper, ligula augue rutrum lorem, eget aliquam risus tortor eget metus. Curabitur scelerisque bibendum purus vel vulputate. Morbi et odio at neque sodales suscipit. Nam at pretium nulla. In scelerisque vulputate suscipit. Nulla facilisi. Pellentesque eu sem eu ligula efficitur viverra. Pellentesque gravida consequat urna id bibendum.
+
+Nulla consectetur facilisis est nec aliquam. Proin hendrerit magna suscipit ante accumsan hendrerit. Nulla ut sem id neque tempor vehicula. Sed eget massa eget sem placerat tincidunt. Ut eleifend, justo sit amet egestas lacinia, ex velit pharetra nulla, nec aliquet elit neque ut turpis. Quisque in gravida velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed euismod malesuada convallis. Ut ultricies, magna et blandit fringilla, dolor dolor maximus sapien, in aliquet augue est vel odio. Nulla commodo elit massa, euismod tempor turpis aliquet eget. Morbi non odio et tortor egestas ultrices. Etiam semper, ipsum et dictum pharetra, eros purus bibendum lacus, vel laoreet lacus sem vehicula nibh. Nunc enim nulla, pulvinar sit amet lobortis sed, porttitor molestie risus. Morbi tincidunt diam mi, nec auctor sem rutrum at.
+
+Donec pellentesque odio odio, eu condimentum risus consectetur quis. Vivamus ullamcorper, mauris non semper rutrum, dui risus suscipit tellus, ut tempor velit risus vitae nibh. Duis tempor nibh at tristique rutrum. Cras congue nisl at sem sollicitudin efficitur. Aenean auctor purus vel libero fermentum elementum. Mauris convallis orci id interdum accumsan. Aliquam at metus risus. Sed accumsan, quam id dignissim congue, velit risus eleifend ligula, ut fringilla elit erat at neque. Aliquam tempor, quam ut ultrices volutpat, orci lectus vulputate turpis, eget pharetra purus nisi non lorem. Ut condimentum convallis justo, a volutpat eros. Sed tempus turpis leo, in convallis est fringilla sed. Vivamus eu laoreet tellus. Quisque ullamcorper ullamcorper leo. Nam fermentum egestas facilisis. Nulla egestas ligula feugiat urna molestie, faucibus convallis erat accumsan. Cras pellentesque ipsum lectus, vitae luctus dolor suscipit nec.
+
+Vivamus vel nibh sed mi tincidunt cursus quis facilisis tellus. Donec eget est eu velit pretium molestie. Maecenas lacinia risus turpis. Sed tristique id risus sit amet venenatis. Duis maximus, metus ac molestie convallis, quam ex dapibus sem, at rutrum metus nisi quis lectus. Suspendisse sodales in nisi at hendrerit. Maecenas suscipit lobortis vulputate. Nunc convallis sit amet elit eget porta. Mauris tincidunt massa in augue finibus iaculis. Vestibulum imperdiet, orci vel bibendum laoreet, ligula quam mollis lacus, a eleifend nisi tellus vitae ipsum. Cras non ante sollicitudin, auctor dolor id, condimentum tellus. Morbi malesuada leo nec lectus scelerisque, nec interdum lacus ornare. Integer ultrices ligula nunc, sed blandit urna aliquam eget. Proin consequat viverra ex non rhoncus. Phasellus id nibh at tortor sodales blandit. Donec dignissim ipsum vel ligula malesuada rhoncus.
+
+Nullam mauris sem, dapibus ac nisl at, hendrerit faucibus nisi. Mauris dictum fermentum pellentesque. Praesent in gravida odio. Vestibulum pharetra iaculis est quis tincidunt. Sed venenatis rhoncus lacus, non porta ante vulputate at. Duis fringilla ipsum at urna euismod molestie. Duis a porttitor ante. Mauris pharetra elit et metus auctor, a eleifend sapien porta. Vivamus ut tincidunt purus, lobortis euismod tellus. Nullam non nulla gravida, laoreet tellus ac, placerat urna.
+
+Sed justo sapien, scelerisque nec nisl vel, efficitur aliquet purus. Phasellus eget posuere nisl. Integer porta vel purus nec ornare. Pellentesque rutrum in nulla at hendrerit. Nullam elementum sodales volutpat. Duis tempus, purus sagittis auctor ullamcorper, dui erat hendrerit nulla, id finibus eros dui quis risus. Quisque posuere nunc quis augue placerat lacinia. Nunc quis lorem vulputate, tincidunt enim nec, rhoncus odio. Ut porttitor porta velit ut vulputate. Duis convallis sagittis magna nec gravida. Ut eu luctus sem, non placerat erat. Vivamus viverra ut ligula ac finibus. Cras ligula urna, tincidunt id risus eu, dapibus viverra lorem. Aliquam erat volutpat. Sed dolor nisi, faucibus non ligula faucibus, laoreet bibendum diam. Vivamus sagittis lacus ut condimentum tincidunt.
+
+Proin tristique mi ullamcorper dolor accumsan mollis. Nulla facilisi. Pellentesque iaculis mattis augue ac rutrum. Mauris in nulla at ligula fringilla pulvinar. Nam commodo ornare nibh ac viverra. Maecenas eget augue a risus mattis ullamcorper non at nibh. Aenean nec erat diam. Pellentesque augue nisl, venenatis mollis dolor non, bibendum malesuada leo. Pellentesque elementum purus ornare mauris iaculis porttitor. Sed mollis tempor dui eu elementum. Donec porttitor tellus non mattis gravida. Mauris venenatis suscipit convallis. Sed dolor sapien, pellentesque et tellus a, tempus cursus magna. Nunc lobortis leo magna, at maximus orci ultrices eget. Nullam vulputate dictum nisi, vel egestas orci.
+
+Nam nibh mi, ornare sit amet nibh vel, lobortis lacinia leo. Ut egestas mi vel nunc luctus vestibulum. Nullam id tempus felis, eget convallis erat. Aliquam venenatis ut tellus id fringilla. Aliquam erat volutpat. Sed vehicula, odio nec mollis dapibus, ligula sapien consequat risus, ut volutpat diam neque ut neque. Mauris venenatis libero vitae sem elementum, sit amet maximus massa varius. Maecenas malesuada mi id leo euismod, eu maximus sapien vehicula. Nulla facilisi. Duis nec venenatis ante, non pulvinar lacus. In sollicitudin sit amet velit suscipit egestas. Maecenas a lectus euismod, dictum nulla at, malesuada lectus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec lorem massa, laoreet non elit nec, sollicitudin blandit felis.
+
+Cras dignissim fermentum tellus ut fringilla. Maecenas maximus eros pretium sagittis venenatis. Maecenas id enim ac est semper efficitur ac hendrerit leo. Cras eu arcu tincidunt risus pellentesque aliquam. Pellentesque vel sodales libero, non rhoncus enim. Integer vulputate vulputate libero, eu consectetur eros euismod vitae. Fusce magna nibh, vehicula sed turpis eget, malesuada ultricies sem. Sed convallis sem nisl, rhoncus mollis mauris bibendum ut. Pellentesque vitae massa a justo dapibus laoreet. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed mollis egestas nisl vel ultricies. Phasellus sit amet varius leo, sed vehicula sapien. Etiam in urna eget neque aliquet ultricies in nec quam. Aliquam at feugiat elit.
+
+Maecenas placerat nisi ultrices neque pulvinar, et ultrices ante tempus. Vestibulum laoreet quam lacus, eget commodo magna dictum consectetur. Aliquam erat volutpat. Aenean tincidunt ipsum sit amet justo aliquet tempus. Quisque blandit sit amet est facilisis dictum. Sed non consequat dui. Integer purus diam, gravida quis tortor lobortis, iaculis vehicula sem. Morbi pellentesque est elit, vitae interdum elit laoreet et. Vestibulum in blandit ante, eu blandit velit. Morbi sagittis eu est eu vulputate. Nullam ac mi feugiat nibh feugiat suscipit. Sed interdum tincidunt efficitur. Integer dictum sem erat, ut pharetra libero lacinia in. Mauris at hendrerit odio, a facilisis lacus. Donec blandit massa ac nisi ultrices faucibus.
+
+Aenean tempus id ligula at mollis. Cras id dui magna. Integer id neque tincidunt, rhoncus nunc et, laoreet nibh. Pellentesque consectetur odio ligula, et consectetur tortor scelerisque non. Cras quis ex pharetra mi ornare lobortis. Phasellus fringilla interdum felis, vel aliquam ligula. Mauris cursus varius turpis in iaculis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent eget mi id nulla semper dapibus.
+
+Vivamus lacus augue, eleifend dignissim ipsum eu, interdum accumsan massa. Nam id quam vel ligula consectetur volutpat id eget eros. Aliquam sed felis velit. Duis egestas velit ac dolor blandit, ut elementum mi tincidunt. Integer varius nisl a sapien pellentesque, et pellentesque ante elementum. Fusce ac orci interdum, faucibus nisl ut, sagittis nisi. Vestibulum sed diam eu magna congue ornare. Integer dignissim ligula sit amet mauris pretium vulputate. Duis ac tincidunt magna. Sed vehicula, ante nec vulputate venenatis, mauris odio blandit dolor, vitae lacinia nibh lorem et metus.
+
+Sed non sapien vel lorem tempor semper ac ac tellus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas auctor ante sit amet suscipit vulputate. In ac cursus turpis. Donec eu sem bibendum, blandit est nec, blandit tortor. Pellentesque scelerisque justo vitae magna cursus, vitae egestas libero interdum. Pellentesque vitae ligula vel mauris vehicula convallis. Nunc ornare lectus sit amet lorem aliquet dignissim. Cras nec ligula pretium, semper nulla a, pulvinar lacus. Sed ac augue bibendum, posuere ipsum eu, venenatis quam. Sed elementum nunc quis odio pellentesque, a vestibulum ex congue. Cras id malesuada arcu. Mauris ut egestas nulla, sed tempus ligula. Donec ac elit ut nisi pulvinar elementum. Suspendisse id auctor lectus, vitae ultricies lacus.
+
+Vestibulum pulvinar ornare cursus. Curabitur accumsan sollicitudin mi in vestibulum. Vestibulum vulputate tincidunt luctus. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Phasellus a mattis neque, id malesuada odio. Aliquam id auctor magna. Vestibulum quis nibh lacinia, tincidunt felis sed, vestibulum ex.
+
+Donec placerat ipsum diam, vel imperdiet velit eleifend ac. Quisque dapibus erat non dui convallis eleifend. Praesent pellentesque felis id suscipit rutrum. Donec quis lacinia turpis. Nulla justo eros, fringilla vel fringilla in, euismod sollicitudin arcu. In ut lobortis arcu, at rhoncus elit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
+
+Pellentesque iaculis quam nec interdum eleifend. Fusce mauris mauris, imperdiet sollicitudin volutpat eu, sollicitudin blandit leo. Vestibulum hendrerit diam gravida erat imperdiet, blandit dignissim dui tempor. Phasellus viverra ante quis aliquam finibus. Duis sed condimentum augue, nec sollicitudin dui. Ut ullamcorper metus ac ligula accumsan, ac fringilla metus gravida. Morbi rhoncus est nunc, at lacinia ex fringilla sit amet. Integer lobortis ultricies nisi vitae accumsan. Nulla nec sagittis ante. Mauris bibendum nisi ut magna vulputate maximus. Praesent in elit eu metus dignissim cursus. Ut a tellus felis. Mauris eget ornare diam.
+
+Suspendisse potenti. Nam nec tortor ex. Duis eu elementum ligula. Pellentesque efficitur sodales orci, vitae sollicitudin odio tempor ac. Nam lacus ante, lobortis vitae lobortis eu, eleifend et velit. Nulla et lectus eu nibh tristique malesuada a sit amet felis. Proin molestie, lectus vitae sagittis malesuada, massa velit finibus est, id vestibulum dolor felis eget lectus. Phasellus varius pellentesque neque, a malesuada ex mattis eget. Nulla facilisi. Phasellus interdum placerat lobortis. Sed et odio tristique, viverra libero et, sagittis diam. Proin tristique lectus id bibendum maximus. Integer ornare euismod ligula nec malesuada. Nulla facilisi. Nullam bibendum hendrerit pharetra.
+
+Duis pharetra auctor felis, eget aliquet justo commodo at. Donec quis nibh non arcu sodales efficitur. Aenean lorem sapien, tincidunt eu sapien nec, convallis tempor diam. Curabitur volutpat, felis ut congue euismod, lacus nisl euismod ipsum, vel consectetur orci nibh sed ligula. Curabitur consectetur vitae mauris sed tempor. Fusce vel pretium nibh, et tristique dolor. Aliquam semper a ante non finibus. Praesent euismod urna augue, at feugiat orci commodo ut. Duis imperdiet purus non augue cursus gravida. Maecenas sodales purus et sollicitudin venenatis. Nam ultrices lorem lectus, ut pretium turpis hendrerit eget. Vestibulum vel lacinia lectus, at dignissim diam. Vivamus ut tortor ac tortor blandit finibus. Etiam porttitor tortor sit amet elit lacinia gravida. Pellentesque pretium, orci vitae tempor vehicula, nisi tellus tincidunt sapien, id egestas felis quam a nunc. Pellentesque sed vestibulum nisl.
+
+Mauris congue, justo vel dapibus pretium, ipsum augue consectetur leo, at aliquam ipsum neque non mauris. Nam sollicitudin in urna eu blandit. Aliquam erat volutpat. Morbi eget interdum ante. Pellentesque congue gravida arcu, eget ornare ante elementum nec. Integer a auctor dolor, in varius sem. Etiam dictum nibh magna, at volutpat nunc blandit eu. Curabitur at sem ipsum.
+
+Nulla porttitor erat eget volutpat iaculis. Pellentesque egestas, nisl vel ultrices efficitur, ex magna condimentum urna, in tincidunt massa turpis eget metus. Etiam vitae magna elementum, fermentum justo ut, pretium velit. Aliquam aliquet venenatis malesuada. Quisque consequat enim metus, pellentesque blandit leo rhoncus id. Vivamus vestibulum, est in condimentum mollis, ligula eros blandit lorem, vitae dignissim lectus mi eget nulla. Cras posuere leo at neque convallis, sed pretium massa ultrices. Morbi tempus porttitor turpis. Nam vitae mauris et massa venenatis tincidunt. Quisque vestibulum lacus ligula, in sodales felis elementum vel. Sed a tellus condimentum, sodales nisi id, aliquet elit.
+
+Vestibulum ac ex eu turpis lacinia condimentum nec eget ipsum. Nulla non imperdiet erat, at malesuada lorem. Praesent efficitur imperdiet augue vel laoreet. Sed dignissim, ante non porta feugiat, enim nunc rhoncus lorem, eu luctus turpis risus sit amet orci. Vivamus bibendum pharetra venenatis. In at gravida nisi. Vestibulum pulvinar sapien ac augue scelerisque, vitae blandit nibh malesuada. Nunc vitae est faucibus, accumsan risus a, laoreet urna. Cras imperdiet lacus in augue facilisis dignissim. Duis sed nisi quis diam mollis rutrum.
+
+Vestibulum eget egestas neque. Praesent viverra, velit quis porttitor euismod, sem libero venenatis mauris, id congue urna nulla sed lorem. Nulla mollis metus nec diam malesuada aliquam. Duis ac risus nunc. Cras sollicitudin urna nunc, id sodales quam gravida sit amet. Fusce in vulputate orci, in venenatis lorem. Donec a sagittis ipsum. Quisque consequat sapien tellus, sed efficitur lacus aliquam eu. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean in neque at augue elementum commodo pellentesque eget ligula. Nullam condimentum efficitur tincidunt. Phasellus posuere tincidunt odio sed facilisis. Aenean eu risus at est euismod facilisis. Curabitur elit purus, malesuada quis blandit id, rutrum vitae dui. Praesent porta rutrum erat, ullamcorper viverra nunc. Cras ut velit dui.
+
+Etiam posuere pulvinar mi at ullamcorper. Pellentesque finibus, tellus non convallis commodo, orci nibh dapibus nisl, at aliquam purus nulla eget dui. Praesent fringilla urna nec nulla pellentesque, nec rhoncus turpis ultricies. Sed laoreet velit pellentesque libero varius, ac interdum urna viverra. Phasellus sed consectetur massa. Morbi quis velit nec ipsum varius tempor. Proin id sodales felis. Aliquam lacinia risus quis ligula condimentum sodales. Nulla vel arcu aliquet neque iaculis aliquet. Cras sed lorem eu turpis tincidunt sodales. Sed pulvinar elementum ligula, nec faucibus nisl. Fusce nec tellus eget dui tempor sagittis. In vitae enim in ex viverra commodo. Duis est erat, fringilla ac semper a, dapibus in tortor.
+
+Maecenas commodo vulputate iaculis. Aliquam non facilisis est. Donec pellentesque vitae nibh nec volutpat. In commodo metus placerat lorem commodo, non lacinia nibh bibendum. In viverra rhoncus erat. Mauris nec nisl blandit, elementum justo nec, accumsan libero. Aliquam elementum, velit et ullamcorper convallis, turpis lorem elementum lorem, quis consequat tortor eros ut erat. Curabitur et enim quis felis vulputate congue et vel purus. Sed elementum interdum ipsum, sed tincidunt arcu scelerisque et.
+
+Aenean interdum elementum mauris ut porta. Mauris vel purus ac odio vulputate pulvinar at quis odio. In turpis turpis, convallis in augue id, elementum vulputate lorem. Sed tincidunt fermentum vulputate. Nunc ipsum ipsum, molestie vel convallis id, pharetra vel arcu. Maecenas vel dui elit. Sed blandit dolor sit amet risus commodo faucibus. Duis rhoncus felis arcu, vel aliquam nisi faucibus sed. Suspendisse cursus eget nunc ut bibendum. Fusce non ligula risus. Curabitur vitae cursus metus, quis fringilla diam. Phasellus turpis ante, pulvinar ac turpis tristique, sollicitudin congue lectus. Proin quis ipsum at ipsum euismod euismod.
+
+Nunc ut fermentum nunc. Donec id commodo lacus, at hendrerit justo. Donec cursus purus sodales nunc commodo, quis bibendum elit hendrerit. Quisque quis pellentesque nibh, ac vulputate neque. Aenean non placerat felis, eget feugiat ligula. Vivamus a eros accumsan, cursus neque at, ultricies magna. Fusce tincidunt tellus vitae mi rutrum laoreet sed quis ligula. Nullam ullamcorper ligula ligula, vel fringilla metus aliquet a. Morbi aliquet, mauris vel interdum venenatis, ex arcu venenatis tortor, at tincidunt dui ipsum et arcu. Nulla blandit gravida nulla ac iaculis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed ullamcorper lectus in sapien lobortis, eget posuere massa varius.
+
+Cras lacinia nunc faucibus mauris placerat pretium eget non sapien. Morbi viverra bibendum posuere. Aliquam accumsan sagittis dolor non iaculis. Sed nunc odio, lobortis in dolor ac, rutrum fermentum velit. In venenatis, velit in molestie semper, est magna condimentum dui, aliquam auctor lorem nulla vel ligula. Morbi vehicula turpis turpis, quis mollis justo tempus vitae. Proin luctus lacus in mauris porttitor aliquet. Duis vitae nunc ex. Nullam eget erat vitae nulla iaculis rhoncus. Sed lacus dui, suscipit eu leo vitae, tincidunt dignissim risus. Praesent ut massa ut arcu sagittis consequat. Sed sit amet tincidunt turpis. Nulla bibendum, felis eget posuere dictum, libero mi tristique elit, at venenatis neque elit ac quam. Curabitur nisi sem, scelerisque nec nunc ac, pulvinar pharetra odio. Curabitur egestas pellentesque arcu sed suscipit. In mattis dolor vel dui mollis feugiat.
+
+Sed commodo, dui ac vestibulum dictum, tellus libero tincidunt lacus, viverra commodo est felis vitae urna. Proin tincidunt neque vel turpis eleifend laoreet. Vestibulum sagittis, tortor sed iaculis consequat, urna ante sagittis est, ac ullamcorper lorem nibh dignissim odio. Nam arcu mi, cursus et blandit nec, aliquam ut nulla. Aenean quis iaculis tellus, eu egestas augue. Etiam pretium eget nisi quis iaculis. Aliquam sed convallis eros. Ut bibendum rhoncus lacus, in vestibulum dui ultricies id. Fusce vestibulum, mauris ut tempor consequat, dolor nisl pellentesque elit, in porta arcu elit vel ante. Vivamus at nisl est. Etiam nec blandit tortor, at pulvinar orci. Proin semper dapibus tincidunt. Phasellus lobortis enim ullamcorper dolor tempor cursus.
+
+Mauris a libero in enim gravida aliquet ac sit amet nibh. Vestibulum ac neque posuere, blandit libero ac, vehicula enim. Aliquam auctor iaculis eros sit amet molestie. Quisque faucibus turpis et massa tristique, nec dapibus mauris aliquet. Proin blandit aliquet mauris, non tincidunt odio blandit vel. Curabitur a nibh in eros commodo tincidunt eu et libero. Curabitur sit amet dapibus ex, in condimentum magna. Sed eu sem sem. Nunc tellus dolor, rutrum eu mauris nec, congue feugiat purus. Fusce tempor, neque vitae bibendum imperdiet, dolor ipsum condimentum urna, et egestas quam tortor in ex. Aliquam velit magna, commodo hendrerit sagittis sed, feugiat eget erat. Nunc quis ullamcorper velit, eu consequat augue. Nam arcu mauris, condimentum sit amet magna in, finibus scelerisque nunc. Mauris erat est, hendrerit ac accumsan eget, facilisis ut nisl. Quisque dignissim arcu quis diam tincidunt tristique. Sed rhoncus nisl non enim fermentum, a lobortis dolor consectetur.
+
+Sed eget condimentum ligula. Vestibulum vitae cursus eros. Donec elementum sapien magna, posuere iaculis sem ultrices lobortis. Morbi eu bibendum lectus. Suspendisse ante eros, ullamcorper ac viverra eget, pellentesque sed sapien. Duis sit amet tincidunt dui, vitae lobortis purus. Sed venenatis tincidunt volutpat. Vivamus a nisl ac elit consectetur semper ut eu libero. Proin id cursus ex. In hac habitasse platea dictumst. Aenean sed nisi vitae odio venenatis pulvinar vitae ac risus. Sed varius magna ut erat luctus vehicula.
+
+Nunc non ex eget purus blandit faucibus at quis velit. Donec quis mi vestibulum, facilisis nisi quis, tincidunt turpis. Sed bibendum metus sed consectetur mollis. Maecenas fermentum, erat finibus pulvinar lacinia, ex risus dictum sem, ut vestibulum augue diam vel diam. Donec ac massa non nibh pretium laoreet eget in orci. Nulla placerat eleifend mi, pretium vestibulum diam condimentum vitae. Nunc odio turpis, feugiat vitae turpis eget, pellentesque commodo turpis. Etiam sapien purus, consequat nec mi eget, consectetur efficitur neque. Phasellus porttitor sapien sit amet nunc semper, vel bibendum nibh finibus. Ut ac imperdiet ex, eu congue felis. In posuere nisi felis. Mauris tempus pretium mauris, ac viverra nunc hendrerit id. Sed fermentum nec sem ac pulvinar. Integer dictum velit eget congue venenatis.
+
+Cras eros dolor, venenatis ac dictum sed, dignissim nec sem. Curabitur tempor erat quis pretium interdum. Nunc vestibulum justo nisi, sit amet sagittis tellus consequat vel. Donec pharetra nunc vitae consequat eleifend. Quisque ut mauris quis nunc volutpat consectetur. Nam a suscipit ligula, at gravida libero. Vestibulum blandit, tellus sed bibendum volutpat, libero tortor convallis nisl, sit amet placerat lorem dolor nec libero. Integer blandit libero elit, ut congue ex euismod congue. Nulla sodales justo id eros condimentum faucibus.
+
+Proin quam ante, hendrerit at bibendum eu, pharetra at lectus. Proin finibus arcu id nisl aliquam dapibus. Fusce a suscipit nisl. Ut placerat ultrices nibh nec efficitur. Vestibulum vitae interdum magna. Donec lobortis finibus risus, et luctus ipsum efficitur euismod. Quisque dictum diam et venenatis euismod. Cras dictum molestie aliquet. Vestibulum imperdiet quam eget diam malesuada, quis pulvinar odio dignissim. Curabitur sapien elit, iaculis vitae justo eget, pretium malesuada elit. Donec gravida molestie tincidunt. Nullam at commodo ipsum. Sed nisi erat, tincidunt ultricies interdum consequat, pretium mollis ipsum. Vivamus in erat consectetur, sodales nibh at, porta nunc. Mauris semper, dui vitae condimentum tempus, mauris justo volutpat urna, ac ullamcorper tortor dolor in sem.
+
+Aenean leo ligula, egestas at vestibulum ac, porta vel mauris. Curabitur at lorem non mauris fringilla venenatis vel eu arcu. Donec posuere eleifend diam. Duis aliquet justo lacus, eu egestas erat eleifend sed. Sed non cursus urna. Sed pretium purus id blandit varius. Mauris turpis mi, lobortis eu tellus sit amet, maximus venenatis felis. Proin non varius enim, aliquet finibus velit. Praesent posuere pharetra ipsum eget varius. Phasellus non fermentum magna, ut iaculis augue. Praesent ut nisl nunc.
+
+Sed ligula tellus, interdum at sapien ut, dictum pellentesque nisl. Duis fringilla, sem nec elementum dapibus, nisl tellus maximus velit, eu varius sem nisl feugiat eros. Maecenas quis viverra lacus. Nulla nec commodo ex, nec placerat enim. Curabitur ultrices sagittis fringilla. Vestibulum sit amet enim sagittis, condimentum nisl sit amet, pulvinar orci. Ut at erat finibus erat bibendum convallis. Quisque euismod magna eget leo facilisis hendrerit. Cras venenatis, nisi quis sollicitudin volutpat, metus enim vestibulum nunc, at mollis leo leo nec est. Fusce fermentum tristique feugiat. Suspendisse sem est, condimentum ut ante at, egestas convallis ante. Vestibulum dictum, ex nec imperdiet laoreet, magna est ullamcorper augue, vel molestie quam odio vel ante. Donec dui dui, posuere a neque ac, condimentum vehicula magna. Curabitur suscipit, risus vitae bibendum posuere, mauris lorem viverra est, at tristique arcu quam quis leo. Donec sed posuere neque. Suspendisse iaculis aliquet condimentum.
+
+Morbi tempus condimentum diam eget bibendum. Aliquam varius magna quis lectus interdum, in elementum ligula tempor. Morbi vitae lorem sapien. Morbi luctus consectetur eros non aliquet. Pellentesque vestibulum sem sed ante accumsan faucibus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam ac suscipit justo. Nunc efficitur lectus eu arcu venenatis, vel accumsan ex suscipit. Vestibulum egestas ultricies tellus, et interdum enim pretium eu. Aenean rutrum est tincidunt rhoncus molestie. Phasellus hendrerit tellus et laoreet varius. Integer efficitur felis magna, nec sollicitudin arcu sollicitudin in. Curabitur non feugiat odio. Mauris nisi odio, luctus quis dolor sed, tristique luctus ex. Nullam libero enim, facilisis ut venenatis et, vulputate sed purus.
+
+Mauris a odio ut leo porttitor ultrices a et ex. Pellentesque vestibulum lacinia faucibus. In pellentesque eget augue at feugiat. Integer finibus augue dolor, in luctus lorem rutrum vitae. Donec pharetra lectus ac purus sollicitudin, vel tristique mauris pretium. Cras porttitor mi eu lectus consequat, a ultrices felis venenatis. In condimentum turpis in velit mattis laoreet. Aliquam sed mauris id nulla ultrices convallis vel vel velit. Suspendisse ut arcu finibus justo fermentum fringilla. Etiam in malesuada nisl. In hac habitasse platea dictumst. Duis a est lacinia, pretium dui eget, condimentum turpis. Integer ac placerat augue. Donec et eros felis.
+
+Integer cursus magna id quam sagittis consectetur. Aliquam erat volutpat. Quisque ullamcorper nisl nec massa dapibus facilisis vitae at nunc. Donec laoreet, libero in elementum tempus, enim odio porttitor felis, venenatis fermentum augue velit eu urna. Ut at ullamcorper enim. In molestie, velit et blandit maximus, erat nunc laoreet quam, vel finibus est mauris non sapien. Donec et dictum lorem. Nunc vestibulum, dolor eget tempus maximus, elit eros aliquam velit, vitae mattis mauris lectus ac tortor. Donec rutrum justo orci, id dictum metus vestibulum a. Etiam bibendum ipsum convallis, lacinia turpis vitae, dictum tortor. In velit dolor, scelerisque sed molestie nec, volutpat a turpis. Cras posuere commodo erat ut gravida. Quisque ante ipsum, volutpat a tellus non, dignissim ornare elit. Pellentesque sed porttitor dui, luctus rhoncus purus. In vitae ante pulvinar, consectetur orci quis, tempus velit. Curabitur tempus ligula id sapien ornare rhoncus.
+
+Maecenas eu nibh et elit accumsan blandit a at erat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam commodo feugiat condimentum. In non ante ut mauris eleifend lobortis. Phasellus eleifend vitae metus et semper. Nam sit amet rhoncus diam. Nunc molestie libero sed erat volutpat consequat.
+
+Aenean eget tristique odio. Vivamus quam tellus, dignissim sed faucibus sed, sagittis ut elit. Maecenas in ullamcorper sem. In at ipsum accumsan lectus vestibulum commodo nec non leo. Aliquam at suscipit felis. Nunc non egestas tortor. Donec sit amet eleifend eros.
+
+Sed eleifend nisi velit, in egestas erat condimentum eu. Pellentesque a tincidunt urna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vestibulum dapibus mauris vitae elit auctor, id venenatis sem consectetur. Vivamus non leo pulvinar, blandit libero ut, vehicula arcu. Nullam elementum ex enim, at mattis massa pharetra eu. Nunc nulla magna, lobortis a magna sit amet, laoreet fermentum justo. Curabitur aliquam sollicitudin posuere. Aenean semper porta dictum. Mauris accumsan non nisi nec faucibus augue.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam in nibh eget ante viverra mattis. Etiam elit est, pharetra efficitur fermentum at, accumsan id eros. Aenean accumsan nisi facilisis tempor suscipit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam magna erat, tincidunt eu placerat at, molestie at sem. In sit amet cursus mauris. Etiam ullamcorper lacus nisi, et porta metus semper id. Nulla mauris nunc, pharetra at facilisis a, consequat id metus. Sed convallis ligula non felis vulputate finibus. Curabitur nisl nulla, pharetra in justo a, dapibus ultricies dui. Morbi ultricies sollicitudin purus, quis pellentesque leo rhoncus sed. Curabitur sed eros quis lacus vulputate pretium. Vestibulum vitae urna nec arcu vulputate efficitur. Cras venenatis sodales dolor non ullamcorper.
+
+Donec eu placerat magna. Vestibulum justo lacus, luctus ac luctus sit amet, dapibus at orci. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec eu tortor ac justo pharetra hendrerit. Phasellus ornare lacinia vestibulum. Maecenas diam orci, molestie rhoncus fringilla vitae, aliquam eu purus. Maecenas vehicula felis dui, vel dapibus odio lobortis quis. Cras a velit non nisl efficitur tempor.
+
+Suspendisse magna enim, ultrices et elementum ut, venenatis ut purus. Curabitur convallis vel tortor id rhoncus. Pellentesque varius arcu non imperdiet eleifend. Vestibulum fringilla aliquet vehicula. Nullam et lorem ullamcorper, tincidunt ante eget, egestas ex. Donec laoreet, justo id tincidunt egestas, lectus diam faucibus tortor, nec venenatis felis leo a urna. In at tortor semper augue finibus ornare et vitae erat. Praesent vulputate, dui sed pulvinar porta, justo tortor feugiat tellus, eget accumsan velit turpis at orci. Nulla vitae velit facilisis augue sagittis fringilla nec sagittis nunc.
+
+Duis vel elementum odio, id eleifend mauris. Nam in ultrices nulla. Quisque pharetra blandit risus eget lacinia. Nulla mattis mi felis, a ultrices nisi egestas vulputate. Donec a augue ac ex laoreet semper at porta ante. Vestibulum arcu ipsum, vehicula vel mollis lobortis, ullamcorper sed augue. Ut viverra faucibus nunc, sit amet sodales diam gravida sollicitudin. Fusce finibus quam sed ornare consequat. Suspendisse viverra ultricies dui in volutpat. Maecenas blandit erat in rhoncus placerat. Phasellus eu nisi rutrum, bibendum nunc eu, viverra ex. Praesent sollicitudin mi sit amet dictum convallis. Vivamus purus ligula, interdum at tincidunt sit amet, pellentesque ut elit. Aenean vitae ultrices ex. In facilisis lectus est, nec vulputate diam tristique vel. In gravida tincidunt ex et viverra.
+
+Pellentesque mi justo, dignissim a nisl quis, tempor dictum lacus. Nam tristique varius dolor tincidunt pharetra. Nullam iaculis est sed quam dignissim cursus. Duis sit amet vehicula nisi, sed consectetur velit. Nullam non tellus nec dolor venenatis porta quis at quam. In pharetra id orci sed faucibus. Cras et malesuada erat.
+
+Quisque fringilla commodo metus nec feugiat. Donec et est urna. Maecenas ut magna dui. Vivamus eu sem venenatis, porta mi at, efficitur tortor. In lacinia hendrerit elit, in faucibus nulla ultrices et. Mauris accumsan nec orci et vestibulum. Aliquam eget justo velit. Mauris fringilla ullamcorper enim, in elementum enim eleifend a. Nulla id libero ac arcu tristique ultrices. Maecenas mattis orci vitae nisl laoreet auctor.
+
+Quisque id aliquam orci. Nunc molestie vitae quam eu consectetur. Vivamus molestie venenatis est, nec lacinia odio faucibus eget. Etiam ornare eu leo eget posuere. Quisque elementum ligula at euismod placerat. Maecenas lobortis leo diam, vel egestas odio iaculis ac. Integer dapibus mi metus. Sed at eleifend ligula, ullamcorper vestibulum eros. Suspendisse dignissim metus in vulputate iaculis. Nam rhoncus felis sit amet velit scelerisque semper. Ut sed augue eget nulla laoreet scelerisque.
+
+Aenean convallis ipsum id turpis gravida, et elementum ante facilisis. Donec vitae arcu id mauris mollis hendrerit. Mauris imperdiet cursus nibh at laoreet. Sed sit amet enim magna. Mauris blandit nisi quis arcu sodales, eget consequat orci euismod. Curabitur id bibendum diam. Ut pharetra tellus nec enim tristique, id efficitur eros accumsan. Suspendisse potenti. Praesent vel porttitor risus. Nulla vitae ex nec ex hendrerit euismod non mattis arcu. Aenean eget velit massa. Pellentesque venenatis arcu mauris, sit amet scelerisque sem lobortis ornare. Vivamus auctor porta eros, eget blandit lorem semper non. Nunc sed nibh commodo, hendrerit nunc at, malesuada nisl. Aliquam pretium leo sed iaculis vehicula. Vivamus interdum porta augue.
+
+Suspendisse potenti. Aenean sodales vehicula erat, vel sollicitudin eros eleifend id. Suspendisse hendrerit malesuada est, imperdiet tristique ex aliquet ac. Vivamus ultricies placerat lorem, ac placerat lectus sollicitudin ac. Etiam consequat odio vel bibendum pretium. Integer elementum nisl magna. Nam et vehicula risus, sed mollis tortor. Ut in molestie turpis. Nam luctus, elit molestie varius luctus, lacus ligula ullamcorper elit, non interdum ipsum neque non nibh. Curabitur vulputate facilisis suscipit. Sed vitae augue eu ex luctus lacinia ac vitae quam. Quisque non nibh ex. Praesent gravida efficitur dui, a vulputate nulla ultrices vitae. Duis libero dolor, facilisis in tempus vitae, pharetra non libero. Sed urna leo, placerat quis neque at, interdum placerat odio. Interdum et malesuada fames ac ante ipsum primis in faucibus.
+
+Vivamus in hendrerit elit, quis egestas sem. Sed tempus dolor finibus massa ultrices, sed tristique quam semper. Pellentesque euismod molestie facilisis. Vivamus sit amet ultrices elit. Ut eleifend, libero eu molestie maximus, ipsum elit pulvinar tortor, et aliquet nulla orci eu est. Nullam pretium, ligula at faucibus gravida, velit mauris pulvinar felis, sit amet tincidunt magna dui ut quam. Phasellus porttitor eu nunc id maximus. Suspendisse volutpat suscipit porta.
+
+Integer dictum augue purus, sed cursus eros blandit id. Vestibulum non nibh viverra, molestie lectus eu, vestibulum justo. Nullam a libero non nibh dignissim posuere id vel orci. Nulla viverra lorem eget condimentum scelerisque. Donec porta nunc sed sapien pretium dapibus. In hac habitasse platea dictumst. Suspendisse sit amet ligula elementum, accumsan ipsum vel, imperdiet massa. Fusce scelerisque non erat ac bibendum. Pellentesque consequat vehicula euismod. Morbi sapien nisl, ultrices ut scelerisque consectetur, ornare et orci. Maecenas efficitur eros a venenatis rutrum. Aenean bibendum dui in enim luctus posuere. Donec placerat porta eros eu dignissim. Fusce nulla velit, sodales eget nibh gravida, tincidunt venenatis urna. Aenean condimentum, massa in fringilla lobortis, turpis felis lacinia metus, sit amet facilisis nisl quam aliquet diam. Praesent fringilla vitae arcu nec lobortis.
+
+In tincidunt nisi ac dictum cursus. Sed dolor purus, posuere vel dolor vel, semper tempor elit. Integer nec scelerisque tellus, sit amet dictum magna. Donec hendrerit aliquet libero, a varius velit dapibus quis. Donec lectus turpis, egestas vel vestibulum vitae, iaculis quis eros. Maecenas id convallis metus. Duis quis tellus iaculis, lobortis massa vitae, condimentum eros. Pellentesque scelerisque nisl id hendrerit tempor. Donec quam augue, maximus eu porta ut, venenatis a ante. Curabitur dictum et nibh sed auctor. Nam et consequat odio. In vitae magna a dui porta pellentesque quis id magna. Sed eu nunc bibendum, imperdiet nunc sit amet, cursus diam. Vivamus in odio vel nibh sollicitudin molestie. Morbi sit amet leo et odio congue pharetra. Aliquam quis suscipit orci.
+
+Donec at ornare orci. Suspendisse nec tellus elit. Nam erat urna, laoreet at elit sed, tristique interdum ligula. Nullam dapibus orci sed lorem convallis fringilla. Cras urna ipsum, tristique maximus nisl quis, auctor mattis quam. Donec finibus consectetur lectus et interdum. Aenean posuere lectus vel turpis auctor finibus. Praesent molestie lectus ipsum, et tristique quam porttitor ac. Suspendisse aliquam pretium tortor, id egestas erat. Nulla mollis, orci at semper vulputate, nisl est pharetra diam, sit amet vulputate diam augue a sem. Donec in mauris felis.
+
+Nunc eleifend at elit a volutpat. Integer semper quis quam at faucibus. Donec pretium purus vitae erat pretium posuere. Sed ac aliquet nulla. Nam ut sagittis mauris. Sed quis sagittis risus, id pretium urna. Nam sagittis elementum ornare. Aenean ligula sapien, congue eget mi quis, viverra commodo nibh. Suspendisse non iaculis magna, nec volutpat neque. Donec eu dapibus eros.
+
+Nam sit amet iaculis massa. Nullam vel laoreet tellus, id cursus tortor. In hac habitasse platea dictumst. Curabitur in urna risus. Proin dui sem, interdum accumsan cursus ut, dignissim in purus. Nunc vitae consequat arcu. Proin volutpat elementum quam in posuere. Pellentesque luctus arcu in ornare tempor. Cras est turpis, viverra vel consectetur ac, dictum a quam. Donec sagittis tortor sed volutpat accumsan. Curabitur a tellus vitae arcu pretium viverra vel in ligula. Pellentesque turpis augue, porta vitae quam id, fermentum congue leo. Sed nec fermentum turpis. Nulla vehicula vulputate sem eu consequat. In tincidunt nisi et mi maximus, non facilisis justo porttitor. Proin eu sapien aliquam, accumsan nunc non, pulvinar leo.
+
+Nam vitae commodo sem. Ut laoreet in quam in suscipit. Nullam at faucibus diam. Fusce ut purus at ex lobortis elementum vitae quis sapien. Nam tempus consectetur ex, sed luctus felis. Donec porttitor mi dui, non luctus quam consectetur eu. Ut a egestas diam. Etiam sodales, nisl vitae gravida pulvinar, libero est condimentum tellus, vitae ullamcorper tortor justo a urna. Maecenas ac velit accumsan, laoreet leo eget, elementum libero. Maecenas dictum tincidunt blandit. Proin sed bibendum urna. Phasellus fermentum tincidunt tempor. Mauris iaculis, mi ac fermentum interdum, nibh odio pellentesque nunc, vel scelerisque sapien sem id purus.
+
+Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas imperdiet sit amet lectus at hendrerit. Vivamus luctus, elit non lacinia hendrerit, risus velit finibus nulla, quis sagittis ipsum diam ut odio. Sed mauris sapien, vehicula efficitur gravida sed, gravida in lectus. Fusce eget consectetur turpis, in fermentum neque. Nullam turpis turpis, feugiat a accumsan in, euismod a augue. Vestibulum nec neque libero. Phasellus eget efficitur turpis, fermentum molestie nunc. Sed consequat elit urna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
+
+Nunc egestas consequat blandit. Donec quis porta sapien. Sed augue nunc, efficitur vitae tellus sed, finibus bibendum sem. Fusce id sem quis quam pharetra ultrices. Phasellus non convallis velit. Quisque erat tellus, pretium eget porta in, ornare a arcu. Aenean nec lectus lorem. Suspendisse dolor lectus, ullamcorper ornare lorem a, consequat lobortis elit. Nunc dignissim est nec gravida facilisis. Proin faucibus erat vel eros volutpat, in vulputate neque sodales.
+
+Nunc vitae imperdiet ipsum, faucibus vehicula magna. Nulla nec nisl sapien. Curabitur et dui eget tortor efficitur accumsan. Aenean in pellentesque erat. Nam condimentum neque pulvinar, aliquam nisl eu, mollis lorem. Integer rutrum arcu eget felis semper euismod. Quisque vestibulum vel diam a tempor. Aenean mollis, tellus sit amet pretium pulvinar, nulla dolor ornare ligula, eget dignissim orci tortor ut sapien. Nam ut ipsum id lectus venenatis tempus vel non ex. Suspendisse blandit vitae nunc vitae porta. Suspendisse tincidunt est sit amet ultricies consectetur. Nulla fermentum hendrerit ex, vehicula rhoncus arcu lobortis ut. Vestibulum fermentum ornare diam at pellentesque. Praesent nunc lorem, porta et magna nec, sodales commodo justo. Duis aliquam sapien et rutrum tempus. Vestibulum malesuada felis eu ligula posuere luctus.
+
+Maecenas lacinia, lectus eget rhoncus aliquam, tortor est gravida sapien, vel aliquam arcu erat et magna. Praesent fringilla leo eget neque posuere imperdiet. In porttitor elit non enim gravida euismod. Aliquam tempus, orci at interdum dapibus, mauris lacus egestas sapien, ac ullamcorper ex nibh sed orci. Quisque iaculis enim et lectus egestas, malesuada posuere lectus interdum. Sed dignissim neque vel turpis dictum ornare. Vestibulum suscipit consequat maximus.
+
+Ut et ante sit amet leo rutrum volutpat. Sed malesuada quis sapien et ornare. Aliquam ac ex enim. Curabitur vel quam et orci posuere feugiat. Pellentesque nec metus eget sapien eleifend tincidunt non sit amet arcu. Cras posuere metus eget risus varius fermentum. Nullam orci eros, efficitur nec sapien nec, pretium laoreet erat. Nam gravida purus mauris, ac viverra orci hendrerit sed. Aenean ligula massa, posuere id faucibus vitae, malesuada quis augue. Morbi consectetur mattis mi, quis sodales diam bibendum eget. Aliquam sagittis neque at feugiat posuere. Donec gravida lectus a lectus fringilla tincidunt. Vivamus volutpat dui et turpis condimentum, ut tincidunt tortor lacinia. Ut laoreet, ante in pellentesque sodales, elit mauris scelerisque dui, quis tincidunt quam massa ac enim. Nulla porta porta sapien vel sollicitudin.
+
+Phasellus sed lectus posuere, mollis ante non, feugiat odio. Aenean a quam id mi ornare dapibus. Donec venenatis ipsum non velit accumsan, id elementum dolor imperdiet. Phasellus lacinia erat diam, sit amet convallis lectus ornare in. Curabitur lorem ligula, maximus eu varius quis, auctor quis odio. Etiam in orci porttitor, sodales ipsum at, rhoncus turpis. Nulla eget luctus nisi. Duis convallis est eget ligula fringilla viverra. Duis nec sapien quis dui luctus ornare sit amet quis erat. Quisque nec justo dui.
+
+Sed eleifend, tellus quis laoreet rhoncus, leo turpis imperdiet turpis, pretium varius odio tortor et leo. Morbi ut mi fringilla, porttitor sem ac, accumsan ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum cursus dolor accumsan dolor aliquet dignissim. Duis sed feugiat erat. Donec sed arcu accumsan, ornare nisl eget, lobortis nibh. Praesent pulvinar quis justo et hendrerit.
+
+Sed velit nibh, efficitur ut leo sed, eleifend iaculis nisl. Mauris ac diam euismod, luctus enim maximus, tincidunt sem. Ut tempus magna vitae blandit bibendum. Sed sapien tortor, ultrices et justo vel, pharetra faucibus dui. Vivamus et vestibulum arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Mauris tincidunt suscipit risus, vitae varius felis commodo in. Nullam semper tortor dolor, sit amet pharetra odio interdum hendrerit. Pellentesque sed justo eros. Cras quam purus, eleifend id tellus molestie, eleifend finibus lorem. Donec a volutpat libero, at vehicula tellus. Vivamus tellus orci, pharetra in nisi vitae, tincidunt dapibus nunc.
+
+Suspendisse ultricies sem laoreet quam molestie ullamcorper. Sed auctor sodales metus, eget convallis eros ultrices quis. Duis rutrum mi a tortor iaculis posuere. Suspendisse potenti. Pellentesque dictum faucibus dui a vestibulum. Donec elit nisl, aliquet at dolor non, viverra dignissim felis. Donec mi elit, condimentum sit amet magna id, efficitur sodales arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque est elit, porttitor eget bibendum nec, auctor nec nulla. Pellentesque dignissim nisl vel orci commodo, ut ullamcorper justo viverra.
+
+Suspendisse pharetra gravida turpis sit amet efficitur. Nulla mattis tortor eget pharetra ultrices. Ut a turpis maximus, pharetra justo non, tempor quam. Nam et volutpat lectus. Vestibulum congue turpis augue, quis eleifend nulla euismod in. Vestibulum sed erat tempus, porttitor diam vel, elementum metus. Aenean facilisis molestie ante, sit amet ornare lacus mollis sed. Maecenas rutrum urna nec ex malesuada consequat. Nunc interdum pellentesque nisl sed viverra. Nam nec fermentum ipsum. Nulla facilisi. Maecenas congue dolor erat, a fermentum enim congue vitae. Integer metus libero, feugiat at eleifend eu, iaculis nec leo. Praesent eleifend convallis leo, eu posuere urna elementum eu.
+
+Aliquam dapibus dolor vel urna luctus venenatis. Suspendisse potenti. Donec vitae tellus nisi. Pellentesque vel neque dignissim, ornare tellus sed, sodales metus. Aliquam vitae maximus tortor. Nullam mattis, odio id porttitor euismod, est leo aliquet massa, bibendum pulvinar justo orci a magna. Morbi ut nisl congue, porttitor erat non, gravida turpis. In nulla risus, ullamcorper quis suscipit vel, tristique ut nulla. In malesuada odio augue, ac hendrerit nunc mattis a. Nam in quam ut elit ullamcorper mattis. Sed fringilla tempus felis, id pretium tortor varius non. Aenean quis sem quis risus mattis posuere vel quis nibh.
+
+Sed pulvinar commodo dui sit amet malesuada. Quisque porta tellus placerat congue efficitur. Cras id blandit enim. Praesent a urna felis. Aliquam ornare, nisl eget iaculis tempor, ligula mi vehicula dolor, ut eleifend massa massa vel est. Fusce venenatis laoreet lobortis. Proin tempus aliquet nunc ut porttitor. In est mauris, blandit eu mattis vitae, aliquam a orci. Cras vitae nulla nec ex cursus blandit. Aliquam fermentum, erat in aliquet dictum, metus urna fermentum quam, non varius magna lectus non urna.
+
+Donec faucibus nisl nunc. Integer rutrum dui enim, malesuada semper turpis pulvinar eget. Fusce consectetur ipsum tellus, sed maximus lorem auctor in. Morbi nec est in quam ultricies hendrerit. Sed aliquam sollicitudin elementum. Aenean aliquam ex sit amet dignissim venenatis. Duis malesuada leo nisi, id accumsan turpis pretium id. Sed ornare magna non pharetra pharetra. Ut auctor dolor neque, nec bibendum odio viverra in. Nulla convallis interdum condimentum. Proin vestibulum turpis in lorem ultrices, bibendum tristique ligula faucibus. In tincidunt auctor sem, vitae fringilla neque pulvinar eu. Etiam commodo pellentesque enim. Phasellus feugiat non sapien eget sollicitudin. Etiam consequat efficitur lacus vel maximus. Suspendisse vitae elementum diam.
+
+Mauris urna velit, efficitur at viverra at, interdum a velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean bibendum sagittis massa in interdum. Mauris facilisis dui eget ipsum euismod ultrices. Donec sit amet lorem iaculis, condimentum velit quis, lacinia justo. Integer faucibus metus sed eros semper, in congue tortor venenatis. Proin tincidunt maximus enim, accumsan facilisis tellus gravida eu. Phasellus interdum aliquam ante, sit amet rhoncus nisl ornare at. Suspendisse libero eros, cursus quis fermentum nec, tempor eget lectus. Aenean ullamcorper augue lacus, non iaculis dui rutrum id. Aliquam erat volutpat.
+
+Morbi hendrerit fermentum sodales. Proin rutrum congue auctor. Mauris pellentesque elit non velit condimentum tincidunt a sit amet velit. Etiam accumsan ante id neque commodo vulputate. Aenean nec mattis neque. Aliquam tempor urna quis nisl convallis congue. Praesent vitae porttitor ante. Mauris mattis vestibulum ante, nec auctor augue. Praesent sem leo, accumsan eu fermentum egestas, iaculis ac nulla.
+
+Etiam vel nisi congue, varius neque id, volutpat quam. Fusce placerat arcu hendrerit orci condimentum vehicula. Integer sem ex, facilisis et lacinia a, condimentum at ante. Morbi condimentum diam tellus, non lobortis arcu pellentesque sit amet. Phasellus imperdiet augue eget sollicitudin mollis. Vivamus sollicitudin arcu aliquam lectus tristique, in consequat diam egestas. Suspendisse aliquet non velit id feugiat. Sed eu est fringilla, gravida nulla ac, dignissim tortor. Phasellus pellentesque nisl non venenatis sagittis. Etiam facilisis nulla quis lorem scelerisque vehicula id at ex. Duis in risus enim. In eu vulputate massa, vel dignissim odio. Praesent ut mi tellus. In hac habitasse platea dictumst.
+
+Nunc malesuada turpis in fermentum lobortis. Donec blandit eu orci non laoreet. Suspendisse posuere blandit tortor, in accumsan velit cursus in. Integer suscipit justo nulla, in viverra orci suscipit et. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum a pulvinar lacus. Vestibulum mattis nisi vel nunc convallis maximus. Fusce aliquam, erat in volutpat gravida, elit odio feugiat ante, nec varius enim leo eget nisl. Donec sit amet ligula lobortis, sollicitudin dolor quis, blandit augue. Duis at interdum sem. Nullam eleifend ligula urna, vitae sollicitudin purus cursus nec.
+
+In commodo risus eu justo hendrerit, ut posuere mi eleifend. Suspendisse sollicitudin odio sem. Vestibulum at dapibus dui, vel dictum nisi. In hac habitasse platea dictumst. Sed ac pharetra ex. Ut ultrices augue ut vulputate condimentum. Phasellus convallis arcu tortor, ac tincidunt justo cursus vitae. Mauris dignissim dapibus imperdiet. Nullam id quam eget mauris cursus molestie finibus eu enim. Fusce laoreet orci eu nunc fermentum tincidunt. Pellentesque vitae ex ac nunc porta mattis sed ut ligula. Phasellus erat dui, consequat et lacinia vel, blandit nec dui. Donec ipsum magna, rhoncus ac viverra vitae, feugiat vel ligula.
+
+Cras ut nisl sed elit dictum semper a at magna. Aliquam laoreet viverra velit vel lobortis. Nam tempor lorem sit amet purus tincidunt accumsan. Vestibulum et vestibulum ligula. Donec sit amet neque faucibus leo rutrum semper. Maecenas scelerisque, lacus et lobortis congue, purus quam euismod risus, et mattis orci nisl eget est. In hac habitasse platea dictumst. Pellentesque eros velit, sollicitudin quis ante vel, blandit maximus mi. Suspendisse at eros id quam vulputate ornare. Duis placerat tellus vel odio ultrices, ac feugiat enim placerat. Vestibulum ut massa mattis, commodo orci euismod, cursus lacus. Suspendisse potenti. Sed venenatis cursus neque, at lacinia erat ornare et. Sed rutrum, dui at porttitor hendrerit, lacus magna fringilla quam, id mollis elit leo ut ante. Praesent vel diam sed urna mollis laoreet eget ut risus.
+
+Mauris varius odio lectus, sit amet consequat nulla sollicitudin sed. Suspendisse commodo rhoncus enim vitae pellentesque. Aliquam vulputate sollicitudin aliquet. Mauris interdum interdum orci, non varius sem ornare ut. Sed vel nibh nunc. Duis tincidunt quam quis lectus egestas, eu ultricies ante posuere. Aenean in mauris eros. Suspendisse potenti. Vivamus sit amet augue at velit accumsan fermentum. Phasellus vel dui sit amet felis convallis sodales.
+
+Nunc mattis vitae sapien ut dignissim. Nam fermentum sit amet massa eu accumsan. In ut ipsum sit amet ante pellentesque accumsan. Nulla egestas eros eget lacus rhoncus pharetra. Nam pellentesque laoreet ex in lobortis. Vivamus congue tincidunt molestie. Integer vel turpis augue. Cras vel molestie quam. Etiam vel mauris ut tellus finibus consequat.
+
+Curabitur velit erat, vestibulum blandit massa a, aliquam elementum tellus. Pellentesque id nisl tempor lorem condimentum dapibus. Quisque ut lorem at orci elementum dapibus quis ut enim. Praesent venenatis congue arcu eu sagittis. Nunc nunc massa, posuere ac gravida id, scelerisque nec velit. Suspendisse non lacus a orci dapibus congue. Sed leo velit, facilisis sed egestas ut, vehicula at turpis. Praesent a finibus felis. Quisque est mi, pellentesque sit amet varius eu, gravida id est.
+
+Donec auctor gravida urna ac suscipit. Etiam placerat ipsum vitae ante congue, at fringilla lectus ullamcorper. Donec viverra lacus ut erat posuere, dignissim porta purus tempor. Duis eget enim quis diam vehicula pulvinar. Donec tempus eros velit, sit amet pharetra ligula placerat in. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sit amet pretium tellus, non dictum ligula. Nullam a ex purus. Vestibulum id ex rhoncus, pretium eros vel, consequat tellus. Vivamus lacinia dolor nec ipsum aliquam, euismod fermentum sem efficitur. Nulla facilisi. Pellentesque pharetra lacinia augue, et eleifend lorem aliquet eu. Ut ut porta ante. Duis ut auctor nisi, id porttitor erat. Proin sollicitudin sem quis justo sodales aliquam. Nulla pharetra gravida arcu vel tempus.
+
+Maecenas nec imperdiet nulla, vitae fringilla diam. Mauris maximus aliquet tellus at congue. Aliquam in dictum elit. Sed pretium mattis lectus, non pellentesque enim dignissim vel. Sed quis elementum diam, a porttitor enim. Cras cursus eros nisl. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ornare sapien vel diam vestibulum, at commodo metus lobortis. Sed euismod iaculis scelerisque. Pellentesque venenatis malesuada dolor, at tempus eros venenatis sit amet. Fusce a massa non libero blandit suscipit.
+
+Nulla facilisi. Sed nec leo nisl. Proin condimentum nunc at risus semper, in laoreet dui congue. Integer in dolor vitae ex maximus porttitor. In efficitur vulputate metus, ac egestas diam pharetra ac. Sed tristique tempus ligula dignissim convallis. Ut tincidunt laoreet fringilla. Praesent nunc est, lacinia tristique odio in, varius rhoncus ipsum. Vivamus bibendum justo at metus ullamcorper imperdiet. Quisque elit nibh, rhoncus a placerat eget, vehicula quis ante.
+
+Morbi fermentum turpis enim, eu interdum dui interdum sit amet. Sed vulputate lacus nec ligula gravida euismod. Duis in nisl fringilla, sollicitudin diam ac, laoreet tortor. Sed eget porttitor augue. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed eu enim convallis augue vulputate convallis. Praesent laoreet, leo at ornare luctus, nisi felis semper sapien, sit amet sodales augue mauris eu lorem. Fusce ornare volutpat malesuada. Curabitur vehicula, eros id fringilla placerat, tellus elit venenatis lorem, ac imperdiet purus ex blandit felis. Nunc suscipit elementum risus ac dictum. Aliquam bibendum dignissim ipsum, sit amet posuere sem viverra ut. Vestibulum egestas in ex ac volutpat.
+
+Donec ut faucibus velit, nec suscipit metus. Nullam dui ligula, commodo eget est venenatis, ullamcorper porttitor lectus. Suspendisse dictum, metus vitae commodo ultricies, enim quam pretium enim, a efficitur tortor purus sed ipsum. Nam sit amet lacus vel elit consectetur ultrices. Vestibulum ac nibh in metus porttitor vestibulum. In blandit et est non efficitur. Aenean vestibulum tortor sit amet mattis semper. Praesent sit amet turpis ac neque malesuada tincidunt nec nec urna. Mauris posuere elit nisl, ac ullamcorper nisi pulvinar in. Nulla ac elit in neque ullamcorper facilisis sed et dui.
+
+Quisque molestie euismod dui, non scelerisque arcu dictum a. Donec eu nulla nisl. Aliquam neque orci, ultrices in nunc vitae, sollicitudin eleifend augue. Etiam at mattis velit, a efficitur dui. Nam bibendum enim non elit tristique aliquet. Vestibulum eget nibh lacus. Pellentesque id sapien dui. Nullam urna leo, faucibus et efficitur vel, ullamcorper iaculis mi. Donec sit amet bibendum justo, id dapibus sem. Pellentesque dignissim varius tellus nec egestas. Praesent eu orci vel ipsum pharetra maximus. Cras nisl ligula, sollicitudin in ligula vel, posuere sagittis eros. Phasellus porta tristique mauris vel eleifend. Mauris sit amet volutpat ipsum, sed vestibulum orci.
+
+Ut rutrum augue quis rhoncus tincidunt. Aenean sollicitudin lacus at erat varius ullamcorper. Integer vitae orci vel nisi vulputate cursus eget nec ex. Mauris elementum, augue ac accumsan convallis, libero leo porta ante, sit amet elementum felis ligula non enim. Ut venenatis semper posuere. Vestibulum nec nisl nisi. Ut a sapien ac orci finibus dictum sed at ex. Phasellus ac lorem nisl. Quisque vitae tempor lacus. Vestibulum in mauris diam. Proin mattis ligula vitae ipsum bibendum, at dapibus nunc placerat. Nam iaculis justo in accumsan tristique.
+
+Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris pretium velit et tristique pellentesque. Nunc in sapien a purus congue rutrum. Nam placerat risus in ante rutrum rutrum. In in ligula magna. Duis orci ante, vehicula elementum consectetur vitae, lobortis vitae arcu. Ut feugiat tempus metus quis sollicitudin. Etiam cursus venenatis augue at fermentum.
+
+Vestibulum id vehicula massa. Proin ut ligula et sapien placerat tristique non nec nibh. Etiam non lacus placerat, molestie ex eu, venenatis elit. Sed posuere, ante et ullamcorper luctus, elit lectus blandit tortor, nec consequat massa elit a tortor. Fusce urna felis, porttitor at ultrices vel, eleifend porta ipsum. Pellentesque nisl nibh, molestie sit amet sem eu, dapibus pharetra nulla. Phasellus viverra augue eu augue volutpat dignissim. Integer bibendum faucibus varius. Curabitur non turpis purus.
+
+Sed pretium eros nisl, sed ullamcorper magna faucibus quis. Etiam ornare euismod tellus, vitae accumsan eros bibendum ut. Morbi a ex sed risus faucibus rutrum et ut urna. Nullam non tortor commodo, facilisis massa non, tristique metus. Curabitur placerat, arcu in egestas ullamcorper, nisl nisl luctus felis, ac dapibus erat velit sed erat. Proin sagittis felis vitae sem posuere semper. Vivamus fermentum eu nisi ac facilisis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque pellentesque lacinia ex tempus lacinia. Aliquam erat volutpat. Nam aliquet mattis risus non pretium. Suspendisse potenti.
+
+Suspendisse et sapien ornare, elementum erat vel, ultrices nisi. Curabitur interdum dignissim tincidunt. Cras eget est a velit consectetur finibus et sed nisl. Curabitur vestibulum semper posuere. Aliquam porta diam commodo nulla tempus imperdiet. Sed id dictum neque. Ut sit amet risus aliquet, dignissim velit sed, tristique ipsum. Nam a sapien id magna commodo tincidunt quis ac tellus. Nunc nec pellentesque orci. In justo purus, vulputate quis urna a, fringilla blandit sem. Cras porttitor quam vitae metus vehicula faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut eleifend orci lectus, vitae semper eros hendrerit id. Fusce nec tellus condimentum, vehicula elit quis, gravida erat. Maecenas volutpat interdum velit id vestibulum.
+
+Pellentesque id metus metus. Nullam ac metus non nisi facilisis aliquet quis a sem. Morbi cursus consectetur aliquam. Morbi id sapien nibh. Etiam tempus tempor tempor. Nam scelerisque condimentum purus. Proin nec cursus eros, in condimentum dolor. Nam in sagittis urna. Ut eget ornare erat. Vivamus nec elit ut sapien tristique aliquet a nec urna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas varius pellentesque diam.
+
+Ut eget libero iaculis urna porta iaculis vel ac eros. Sed sed mi et libero porta consequat a in libero. Sed in imperdiet ipsum, sit amet ultricies dui. Curabitur sit amet consectetur eros. Praesent nunc tellus, feugiat ac laoreet consectetur, accumsan nec magna. Praesent at elementum orci. Donec dapibus venenatis libero, id tincidunt libero euismod ac.
+
+Aenean sit amet ex placerat, molestie sapien a, volutpat turpis. Vivamus elementum lacinia nisi a convallis. Donec a sagittis turpis. Curabitur pulvinar laoreet dolor id consequat. Aliquam aliquam feugiat magna, vitae sagittis lorem mattis ut. Donec sed auctor nulla. Ut convallis, neque vitae faucibus efficitur, nisi justo pharetra odio, vitae tristique purus lorem et nisi. Quisque eleifend aliquam arcu nec maximus. Nunc mauris elit, finibus nec gravida non, maximus nec nibh. Sed eu ipsum in arcu gravida maximus. Maecenas massa dolor, ullamcorper eget odio eu, congue ornare leo. Suspendisse venenatis ultricies imperdiet. Nam finibus orci vitae sagittis finibus. Pellentesque sit amet dapibus diam. Nam eu nunc elit.
+
+Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam euismod turpis nec urna lobortis, ut malesuada ex suscipit. Fusce sed viverra risus. Pellentesque tristique nulla pulvinar tincidunt accumsan. Nullam vitae nibh imperdiet erat rutrum pellentesque et sit amet quam. Aenean laoreet ultricies hendrerit. Duis elementum tellus a feugiat vulputate. Aliquam aliquam enim placerat dolor viverra, non suscipit lorem ultrices.
+
+Proin interdum vitae lorem quis viverra. Praesent nec tempor dolor, vitae sagittis turpis. Etiam sit amet imperdiet sapien, ac laoreet arcu. Proin aliquam, risus nec maximus dapibus, dui diam elementum dolor, vitae tempor augue lorem vel justo. Aenean ac egestas dolor. Ut aliquet, felis at fringilla venenatis, leo nisl ullamcorper ex, vitae pellentesque turpis orci quis lectus. Nullam vitae suscipit metus. Integer congue, ante in lacinia rhoncus, erat lorem interdum elit, egestas suscipit lectus nunc non orci. Nunc vel viverra quam. Mauris sit amet sodales tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam quis sollicitudin libero. In nec venenatis orci.
+
+Integer non quam fringilla, tristique nulla id, gravida arcu. Aenean scelerisque lacinia magna. Praesent nunc sem, lobortis non convallis rhoncus, rutrum vitae ante. Sed et orci ut erat viverra bibendum a et lectus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce sit amet eros eget dolor pharetra vestibulum. Nullam vestibulum, massa dictum finibus egestas, orci nulla pulvinar sem, nec tempor libero lacus eu ante. Nam lacus erat, gravida eu placerat sit amet, facilisis sed urna. Suspendisse efficitur felis non ornare dictum. Nam sit amet nulla enim. Nulla eget scelerisque est. Suspendisse lacinia velit arcu, id lobortis felis facilisis in.
+
+Suspendisse potenti. Nulla porttitor metus ut nunc dictum tristique. Cras sit amet tortor eget ligula tristique efficitur. Ut at nisi id purus imperdiet laoreet. Sed sit amet malesuada urna. In nunc dolor, luctus ac condimentum ut, dapibus vel metus. Suspendisse pretium urna eget libero convallis vestibulum. Integer ut mauris hendrerit ex posuere euismod sed sed odio. Nulla egestas libero sit amet magna venenatis faucibus. Pellentesque semper vestibulum elit, et pretium felis scelerisque non. Suspendisse aliquet leo arcu, sed dapibus ex semper non. Donec lacinia dictum dignissim. Maecenas ipsum nunc, aliquet eget consectetur sit amet, aliquet vitae odio.
+
+Proin consectetur blandit feugiat. Nulla ac dictum quam. Vivamus suscipit scelerisque ipsum, vitae consequat neque sagittis id. Donec eu augue hendrerit, varius ipsum at, cursus massa. Morbi id augue id ipsum porttitor mollis. Phasellus nec libero eu arcu finibus dapibus. Nullam nec pharetra ante. Aenean sit amet urna eget justo tempus pharetra ut nec mi. Pellentesque viverra, ligula nec elementum ornare, ante elit eleifend enim, nec dignissim ligula elit in nibh. Vestibulum facilisis, felis eu condimentum dapibus, ante risus tincidunt urna, ut posuere dui augue ut ante.
+
+Nam arcu lacus, accumsan ac dolor in, egestas euismod est. Sed consectetur mauris et enim tincidunt semper. Donec sit amet pellentesque diam. Fusce viverra arcu a placerat fermentum. Nullam euismod dui eget egestas ultrices. Duis euismod viverra tortor eget eleifend. Pellentesque vitae neque dapibus, bibendum mi eu, auctor velit.
+
+Pellentesque congue consectetur turpis, eget auctor dui suscipit vel. Aliquam a sollicitudin turpis. Praesent nec blandit tortor. Suspendisse non nunc at urna tincidunt elementum. Integer eu elit nec urna maximus blandit quis at tortor. Nulla laoreet elit a purus tempus, et tincidunt lorem sagittis. Aenean semper erat eu neque hendrerit ornare. Cras posuere lorem nec orci vulputate finibus. Fusce tempor ex ac lacus gravida venenatis.
+
+Phasellus laoreet, libero vel fermentum euismod, sem diam accumsan quam, vitae gravida arcu est at sem. In bibendum, felis at viverra congue, felis nunc fringilla libero, ut scelerisque erat massa ut neque. Suspendisse potenti. Cras faucibus dolor vel tortor blandit, quis imperdiet magna semper. Nullam ut urna dapibus, vulputate est a, hendrerit purus. Vivamus vestibulum nisi a tempus placerat. Morbi vitae ultricies lacus.
+
+Nunc vel efficitur urna. Fusce bibendum suscipit mauris, quis imperdiet nisl bibendum non. Nam sed nisi imperdiet, pellentesque sem sed, pellentesque diam. Praesent luctus feugiat odio, eget fermentum lectus ullamcorper non. Phasellus pulvinar lectus sed ligula semper lobortis. Pellentesque fermentum ultricies fermentum. Quisque id turpis vel orci rutrum rhoncus id vel metus. Vivamus ex leo, accumsan eu luctus sit amet, tincidunt vitae erat. Sed eu mollis odio, ut ultricies lacus. Duis enim odio, pellentesque non velit vel, aliquam blandit erat. Mauris feugiat felis fermentum purus blandit, id rhoncus lorem tempus. Integer cursus, nunc vitae laoreet commodo, nunc lacus venenatis orci, quis eleifend risus est nec quam. Nulla tincidunt nunc ac purus tincidunt, eu molestie ipsum sollicitudin.
+
+Vestibulum ac varius velit, non suscipit nulla. Vestibulum a sagittis tortor. Suspendisse vestibulum felis quam, eget blandit nulla dictum vel. Praesent eu tellus ut lacus facilisis ultrices. Etiam fringilla nulla nec leo viverra faucibus. Sed nec sollicitudin nisl. Aenean libero massa, ornare sed elit ut, interdum fermentum arcu.
+
+Aliquam maximus diam et elit dapibus, eget condimentum sapien finibus. Etiam gravida nunc dapibus facilisis feugiat. Sed quis massa ligula. Nunc eleifend dolor lacus, at dapibus nisi vulputate eget. Etiam vel euismod urna, quis molestie nibh. Vestibulum bibendum erat non dictum sollicitudin. Suspendisse sed placerat lacus. Cras sollicitudin quam justo, a condimentum urna feugiat a. Quisque mauris libero, ultricies at ligula a, facilisis euismod ante.
+
+Morbi hendrerit maximus sapien ut auctor. Nullam nisi erat, aliquam ac metus eu, fermentum laoreet augue. Nam ultricies mi at vulputate laoreet. In ipsum est, blandit sit amet lorem id, egestas aliquam odio. Praesent venenatis lobortis mi. Aenean eu lacus consequat, mattis enim et, pellentesque leo. Duis convallis facilisis placerat. Donec porta, enim eget placerat congue, nisi augue faucibus odio, et fringilla purus elit vitae felis.
+
+Nulla et tellus a libero pellentesque eleifend vitae mattis nisi. Nunc placerat neque et sapien lobortis, aliquet pharetra nunc vulputate. Suspendisse potenti. Etiam ullamcorper lacinia varius. Suspendisse sit amet malesuada magna. Nam molestie mi nec diam tempus laoreet. Suspendisse urna tellus, scelerisque vitae purus et, dapibus fermentum felis.
+
+Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec scelerisque eget neque sed hendrerit. Donec at ligula augue. Donec vulputate massa nunc, a feugiat nunc elementum ut. Donec pulvinar libero sit amet ante faucibus sagittis. Mauris quis diam ultrices, tristique sapien nec, tempus urna. Morbi hendrerit odio sit amet leo lacinia, non egestas diam condimentum. Suspendisse efficitur sapien eget elit euismod tristique. Duis posuere vestibulum risus id sodales. Ut eget mi in urna rutrum molestie non nec dolor. Curabitur sollicitudin pharetra lacus, in sodales tortor tempor vitae. Nullam rhoncus arcu vel euismod varius.
+
+Aenean malesuada, purus quis volutpat sollicitudin, lectus risus lacinia mi, a facilisis ante lacus a dolor. Aenean vel aliquam tortor. Vivamus ornare, tellus at malesuada suscipit, quam dolor egestas erat, id convallis enim augue a enim. Aenean ultricies sodales placerat. Vivamus vel erat ac mi vulputate commodo nec eget urna. Suspendisse potenti. Mauris quis dapibus est, id tristique libero.
+
+Suspendisse ex diam, imperdiet quis dui id, interdum sodales elit. Maecenas at nunc ligula. Etiam imperdiet convallis magna sit amet tristique. Proin hendrerit laoreet magna, eget malesuada elit rhoncus et. Curabitur eget odio imperdiet, molestie sapien pretium, efficitur turpis. Aliquam sed congue arcu. Pellentesque vitae mauris id neque pulvinar tempor. Donec lobortis tellus id gravida dictum. Nulla et varius ex. Vestibulum pharetra eu quam dapibus finibus. Nullam accumsan sagittis turpis. Mauris fermentum orci et tortor tempus, ac tristique odio sollicitudin. Duis nec elit et magna imperdiet molestie eget vel ante.
+
+Suspendisse tempus augue nec massa molestie aliquam. Pellentesque vestibulum, erat sit amet fringilla fermentum, sapien lorem tempor felis, at efficitur augue erat quis nisi. Proin nec felis sagittis, sollicitudin turpis eu, fringilla leo. Vestibulum at augue nec dui vestibulum aliquam a at metus. Duis ullamcorper eleifend bibendum. Maecenas viverra mauris lacus, et consequat nisl pharetra eu. Praesent rutrum diam eu mi aliquet, non pellentesque est suscipit. Vestibulum massa leo, blandit eget mi at, cursus faucibus nunc. Praesent nec bibendum libero, vitae cursus libero. Sed consequat vitae eros nec maximus.
+
+Pellentesque et tortor eget lectus feugiat venenatis. Integer ornare nisl quam, nec imperdiet justo finibus at. Morbi malesuada, ante sit amet rutrum tempor, risus lorem tristique urna, egestas varius purus ex ut sem. Etiam sit amet feugiat sapien. Etiam quis risus commodo, eleifend velit quis, tincidunt enim. Mauris fermentum lacinia velit quis efficitur. Nunc sit amet lacus sit amet urna viverra feugiat. Nullam sagittis rhoncus suscipit. Aliquam eu sem ligula. Sed sodales risus et tortor lacinia tristique. Nulla massa augue, malesuada sit amet euismod ac, euismod placerat nulla. Sed lobortis ex nec lacus facilisis, nec semper mauris ultrices. Quisque ornare non felis vitae pellentesque. Donec mattis ut magna sed imperdiet. Integer viverra tempus feugiat.
+
+Donec laoreet aliquam imperdiet. Fusce justo neque, dictum vitae fringilla vitae, euismod sed augue. Fusce sodales, lectus a congue bibendum, ante eros pharetra tortor, eu sollicitudin libero ipsum sit amet felis. Curabitur sed condimentum quam, in iaculis ante. Ut feugiat dictum odio, vitae hendrerit lacus volutpat sed. Sed scelerisque et metus nec gravida. Mauris mattis porttitor magna, ut maximus justo sagittis vitae. Donec at metus ut leo gravida vehicula in sed diam. Vestibulum dignissim suscipit sagittis. Nam varius et arcu sit amet lacinia. Sed eget elit rhoncus, elementum dolor a, vehicula orci. Nam vitae tellus sapien. Phasellus massa lorem, commodo quis placerat in, semper faucibus tortor.
+
+Vivamus id dolor mi. Curabitur sagittis posuere quam in mollis. Phasellus finibus ipsum vel elit tincidunt, a bibendum ligula vulputate. Suspendisse quis purus nisl. Integer mi sem, posuere quis nisi a, consequat consequat magna. Vestibulum bibendum mauris in risus auctor fringilla vel at lacus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus venenatis mauris at mattis eleifend. Donec tempus ipsum ac nisl convallis ultrices.
+
+Nullam eu nibh ut erat vehicula accumsan. Vivamus vitae faucibus libero. In in luctus odio. Nulla nec enim pharetra, fermentum erat in, tempor turpis. Sed ac magna suscipit, dignissim elit id, faucibus libero. Maecenas placerat in dolor et faucibus. Sed maximus purus dolor, non egestas massa rutrum non. Nunc ut rhoncus lacus. Sed sit amet dolor eu sapien sagittis molestie. Aenean ipsum erat, rutrum a diam et, varius porttitor ligula. Phasellus fermentum fermentum felis.
+
+Phasellus odio massa, lacinia ac hendrerit vestibulum, placerat sit amet erat. Praesent eget justo scelerisque, congue est in, pharetra mi. Etiam blandit turpis dui, a faucibus ipsum viverra vitae. Praesent sed scelerisque arcu. Cras nec venenatis ipsum. In et tempus metus. Pellentesque cursus quis nibh quis porttitor. Duis leo lacus, pretium eget rutrum eu, tincidunt lobortis tellus. Cras in erat tristique arcu faucibus luctus sit amet tempus erat. Nullam placerat, est a interdum iaculis, purus justo convallis arcu, at mattis erat sem tempor velit. Curabitur sapien sapien, tempor eget sodales vitae, blandit ac libero. Proin eget sem et arcu malesuada convallis non a est.
+
+Ut id sagittis urna. Morbi est mauris, molestie quis magna ut, convallis porta justo. Etiam in vulputate sem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nullam consectetur enim nisl, sit amet pulvinar turpis elementum at. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum convallis cursus libero vel feugiat.
+
+Curabitur vel scelerisque metus. Etiam aliquet faucibus quam, vel aliquet est mattis quis. Pellentesque pulvinar sodales augue, a dignissim sem tristique vitae. Pellentesque dolor quam, pharetra vitae rhoncus ut, blandit at elit. Sed dignissim diam turpis, ac condimentum justo iaculis vel. Donec facilisis eros sit amet est dapibus, vel pellentesque eros consequat. Integer euismod mollis metus, vel rutrum risus imperdiet ac. Fusce semper dolor sit amet mi congue accumsan. Maecenas sagittis magna justo, vel varius ante scelerisque id. Fusce at urna sapien. Aliquam dui sapien, facilisis eu magna laoreet, feugiat tincidunt elit. Fusce iaculis sit amet erat id dignissim. Suspendisse sollicitudin laoreet consequat. Pellentesque eu mollis quam, vel dapibus libero. Duis mattis tortor vitae orci vehicula, et viverra ipsum lobortis. Quisque iaculis sapien est, id sagittis tortor rutrum at.
+
+Duis ut condimentum risus, et venenatis nulla. Praesent urna ex, faucibus eu mollis nec, lobortis vitae neque. Vivamus a malesuada tellus. Quisque bibendum dolor nec massa porta, nec malesuada magna auctor. Phasellus non auctor turpis, et bibendum risus. Ut pellentesque justo non neque convallis, ut imperdiet diam sagittis. Nunc arcu nisi, rutrum sagittis neque elementum, finibus consequat felis. Proin euismod elit eu urna tristique ultrices.
+
+Curabitur id hendrerit ipsum. Aliquam tortor nisi, dignissim vel sodales a, ultricies a ipsum. Etiam commodo arcu sed volutpat varius. Proin vehicula lacinia tempor. Vestibulum feugiat nibh eu ante tempor efficitur. Etiam eleifend a orci eu euismod. Cras a tortor risus. Cras nec urna non urna malesuada maximus vel et ipsum. In ullamcorper porttitor dolor, at fringilla tortor tristique ac. Nulla gravida tortor nec dolor convallis, accumsan sollicitudin dui luctus. Vestibulum euismod vestibulum semper. Nam semper lacus dolor, vitae rhoncus nisi blandit nec. Phasellus turpis dolor, posuere sed sodales sit amet, interdum ut arcu.
+
+Sed blandit nulla et sem vulputate, et semper lacus posuere. Proin velit lorem, sagittis tincidunt aliquet vitae, fermentum sed orci. Ut interdum ultrices dolor eu tempor. Quisque pretium vulputate dui at blandit. Aenean pretium urna sed purus dapibus aliquam. Mauris tristique augue pretium magna scelerisque, vel cursus sapien porttitor. Nullam neque justo, aliquam non neque id, lobortis facilisis nibh. Duis molestie dui eu augue tristique porttitor. Sed posuere justo massa, efficitur vulputate erat posuere non. Cras quis condimentum tellus.
+
+Etiam eleifend ipsum ut justo viverra porttitor. Nam bibendum enim nec ligula vestibulum, vel fringilla velit posuere. Praesent leo enim, varius sit amet nulla ut, sodales sollicitudin nunc. Phasellus hendrerit varius ex quis tempus. Suspendisse maximus laoreet enim, ut bibendum tortor. Ut non magna vehicula augue condimentum scelerisque. Aenean efficitur elit vel rhoncus euismod. Vestibulum sit amet sollicitudin dui. Quisque ac diam nibh. Nullam quam enim, volutpat eu turpis et, posuere consectetur neque.
+
+Ut tincidunt semper dictum. Etiam varius enim sit amet metus consequat malesuada in at ligula. Cras nisl dui, tincidunt a urna et, porttitor rhoncus velit. Mauris interdum imperdiet lectus ac mollis. Aliquam sollicitudin ornare mi, a varius nulla faucibus aliquet. Nunc fermentum tempor ullamcorper. Pellentesque laoreet libero condimentum pellentesque pharetra. Nullam sed eros vel erat vestibulum dictum. Nulla nec interdum dui, quis finibus nunc.
+
+Sed ac turpis in mi ultricies finibus sit amet et diam. Pellentesque sagittis non ligula et convallis. Suspendisse interdum est aliquet erat rhoncus semper. Donec pretium turpis ante, vel posuere mauris facilisis vel. Vivamus nibh ligula, pharetra sit amet hendrerit nec, vulputate ut sapien. Nulla ullamcorper condimentum metus vitae imperdiet. Ut eget ex purus. Nulla dapibus malesuada pharetra. Praesent sit amet ornare turpis. Nulla pulvinar felis eget arcu mollis vulputate. Vestibulum eget semper felis. Donec viverra justo id mi tempor, a mollis ipsum porttitor. Maecenas aliquet volutpat ante eget tempor. Duis ipsum nisi, scelerisque quis metus vitae, blandit faucibus nisl. Mauris rutrum nisi sed lorem dictum ultricies.
+
+Nulla dictum arcu augue, aliquet ornare ligula suscipit ut. Integer libero erat, bibendum quis arcu at, consequat luctus sem. Ut ut erat tincidunt, porta erat efficitur, bibendum neque. Maecenas eget convallis sapien. Nullam facilisis ex et lorem fringilla, ut convallis leo dictum. Duis porttitor, ex eu venenatis faucibus, erat augue dapibus leo, sit amet scelerisque neque dui sed arcu. Praesent at diam nec sem sodales condimentum. Vivamus vehicula urna tellus, a semper ipsum cursus id. Duis auctor enim erat, laoreet volutpat dui rhoncus maximus. Suspendisse pellentesque euismod lacus, at auctor purus. Suspendisse volutpat imperdiet diam, id laoreet est egestas at.
+
+Fusce lobortis ex vel condimentum convallis. Vivamus fermentum convallis dolor quis rutrum. Donec tempus ornare maximus. Mauris quam neque, dignissim rutrum maximus sed, volutpat sed lectus. Donec id augue gravida, pretium purus eu, sagittis tellus. Maecenas tincidunt gravida felis nec pulvinar. Fusce turpis urna, sodales non rhoncus nec, sodales ac ipsum. Suspendisse risus felis, imperdiet id malesuada fermentum, ultricies et erat. Suspendisse potenti. Pellentesque tellus ipsum, dapibus eget pellentesque eleifend, venenatis sed risus. Ut sed mollis nisl. Aliquam lobortis aliquam ipsum, et ornare magna bibendum ut. Proin quis justo vitae neque tincidunt maximus ultricies et purus. Nullam non semper turpis. Quisque non mauris odio.
+
+Donec commodo tempus egestas. Vestibulum at diam vel mi tincidunt finibus. Donec aliquam magna id eros tristique finibus. Cras ut enim sapien. Proin gravida risus a nisi dapibus, ac vulputate nunc laoreet. Donec at leo vel nulla iaculis feugiat sed et ante. Nulla a arcu at ligula sollicitudin semper sed eget est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Ut dolor magna, luctus id elit ut, interdum viverra lacus. Aenean sed tempor metus. Aenean arcu dui, eleifend quis est sed, luctus lacinia nulla. Morbi id luctus libero. Maecenas sodales leo eu sapien maximus porta. Praesent gravida augue eu ligula pretium cursus.
+
+Duis aliquam luctus tortor, eu facilisis quam sodales sed. Phasellus feugiat venenatis lorem, in scelerisque est efficitur quis. Cras quis nisl nisl. Quisque magna felis, tempus nec pharetra et, tempor id ligula. Pellentesque sed dignissim velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris convallis iaculis posuere. Nullam orci velit, venenatis eget enim quis, molestie consequat dolor. Nulla egestas risus vestibulum sagittis blandit. Nullam dui lacus, tempus euismod sapien a, eleifend sodales justo. In id tortor neque. Vivamus faucibus ante ac odio vestibulum, vitae condimentum nibh consectetur. In rutrum hendrerit est, sit amet mollis ex aliquet tempor.
+
+Donec non tincidunt sem. Nullam dignissim felis nibh, et accumsan felis tristique sed. Maecenas id massa erat. Ut justo ligula, aliquet eu condimentum a, aliquet eget ex. Phasellus et neque eu nisl consectetur ullamcorper. Sed gravida efficitur nisi, vitae posuere nisi tincidunt sed. Duis vitae molestie metus, vitae finibus urna. Integer at lacus vitae turpis convallis feugiat a dignissim libero. In dolor nibh, aliquam eu malesuada in, tincidunt vitae nisi. Nullam at lectus risus. Integer vitae ligula interdum, congue nibh id, tincidunt dolor.
+
+Mauris risus quam, mollis eu consequat vitae, molestie sit amet risus. Vestibulum congue vulputate nibh sit amet ullamcorper. Nullam elit justo, hendrerit euismod elit nec, gravida tincidunt ipsum. Aenean tellus tortor, commodo vitae cursus vitae, finibus quis mi. Nam in tellus scelerisque, cursus magna a, elementum tellus. Praesent ut lacinia justo. Donec consectetur, mi nec faucibus viverra, nisl justo suscipit est, in consequat ex urna vitae orci. Fusce molestie feugiat ex sed dictum. Phasellus interdum eros dapibus sodales volutpat. Morbi elementum sapien ante, quis sagittis justo fermentum at. Maecenas vestibulum massa quis eleifend rhoncus. Praesent auctor ex at urna pellentesque facilisis.
+
+Duis tincidunt porta quam, in commodo orci dapibus interdum. Donec mattis erat ante, nec faucibus magna pharetra id. Aliquam dignissim ultricies auctor. Duis quis ex mi. Phasellus ipsum mi, volutpat quis augue nec, dapibus aliquet lectus. Aenean id eros mi. Fusce rhoncus iaculis magna, commodo commodo nibh pellentesque ut. Donec consectetur lacinia erat ut luctus. Mauris efficitur erat vitae sapien fringilla sollicitudin. Maecenas a egestas ipsum. Aenean placerat congue augue, ut condimentum lorem accumsan in. Morbi ac quam nunc.
+
+Nunc posuere faucibus semper. Integer at convallis ex. Duis a purus molestie, dignissim mi quis, consequat nulla. Proin tempus congue ligula, sit amet ultricies enim consequat ut. Nunc ac est at nisl euismod cursus. Pellentesque vulputate molestie ipsum. Praesent varius, lacus non lobortis blandit, nibh lacus scelerisque nisi, sit amet interdum ligula tellus ac purus. Vestibulum sed quam tempor, pharetra tellus ullamcorper, tincidunt est. Nulla tempus tortor nec erat tempus eleifend pellentesque eget purus. Duis gravida dui justo, ac commodo ipsum mollis et. Nullam vitae nibh enim. Ut sodales mi eu diam sagittis, quis luctus tortor euismod.
+
+Maecenas a augue ac augue varius rhoncus. Fusce nunc turpis, mattis eu iaculis a, dapibus nec purus. Pellentesque imperdiet sit amet purus a blandit. Morbi augue tellus, venenatis nec tortor in, consectetur tincidunt nulla. Aenean purus libero, volutpat quis neque vitae, mattis efficitur eros. Donec sodales venenatis augue, sed faucibus magna accumsan convallis. Pellentesque efficitur elementum imperdiet. Cras at condimentum leo. Curabitur feugiat ut nisi facilisis commodo.
+
+Sed commodo sapien quam, quis vulputate orci lobortis nec. Aenean luctus dictum ipsum, non consequat sapien molestie vel. Proin blandit libero tortor, vitae efficitur tortor hendrerit at. Sed eleifend eu velit eu tempor. Nunc auctor tincidunt mollis. Ut molestie, erat ut lobortis convallis, odio felis sollicitudin elit, vitae ultricies lorem neque et dui. Sed venenatis tempus ullamcorper. Integer eget elementum nulla. Maecenas a placerat ipsum. Etiam sagittis sagittis rhoncus. Aliquam faucibus magna id lacus pharetra, nec interdum lacus sodales.
+
+Mauris ipsum sem, venenatis non elit in, feugiat pretium lacus. Fusce eget tincidunt dolor. Nam pharetra lacus vitae diam bibendum, ac placerat tortor aliquet. Sed eget gravida orci. Ut in orci lorem. Morbi condimentum ligula dolor, in dictum mi vestibulum sed. Suspendisse eu velit finibus, tincidunt dolor malesuada, mattis est. Morbi iaculis sapien vitae metus facilisis fringilla. Donec sed volutpat neque. Mauris ipsum metus, venenatis cursus mattis quis, convallis ultricies purus. Aliquam quam magna, sagittis at mi quis, lacinia iaculis turpis. Praesent viverra, ex nec euismod lacinia, urna risus pretium odio, sit amet mattis metus eros non lectus.
+
+Nam sed vehicula est, ac aliquet mi. Aenean iaculis placerat orci, ut lobortis dui vestibulum convallis. Vestibulum eleifend ante sed lorem interdum lobortis ut vel tortor. Sed auctor id nisl sed bibendum. Fusce maximus vulputate mauris, tempus sollicitudin nunc efficitur vitae. Nulla pellentesque molestie leo, quis hendrerit enim. In vel dapibus nisi. Nam at dui quis eros porttitor volutpat in id magna. Maecenas quis quam a justo cursus aliquet viverra sit amet mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut hendrerit est at augue pretium condimentum at ut velit. Suspendisse non gravida metus.
+
+Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Praesent lacinia commodo elit, sed fringilla ipsum imperdiet ut. Proin a dictum ante. Suspendisse potenti. Praesent ac nulla volutpat, ultricies diam vel, auctor risus. Nullam aliquam elit vel quam suscipit molestie vel ac dolor. Ut pharetra finibus elit, id vulputate ex dignissim in. Ut ac finibus urna, a luctus magna.
+
+Fusce suscipit convallis eros nec blandit. Cras quis lectus nibh. Donec pulvinar rhoncus pulvinar. Vivamus nulla nisi, vestibulum vel neque et, dictum gravida ex. Vestibulum in arcu vitae nibh auctor rhoncus ac in massa. Sed semper enim ac dui sollicitudin porttitor. Etiam ante erat, laoreet sed dolor eget, cursus commodo lorem. Curabitur maximus tincidunt nulla at molestie. Phasellus ultrices felis a cursus facilisis. Nullam a semper tortor. Nulla ac vulputate justo. Mauris maximus nisi quam, elementum eleifend nulla condimentum nec. Aenean congue tincidunt mi, id mollis orci blandit vitae. Integer placerat orci at nisl vestibulum lacinia.
+
+Sed egestas posuere egestas. Quisque pulvinar velit commodo felis accumsan, a consequat purus laoreet. Ut at arcu at augue sodales rhoncus. Ut non nisl dui. Sed sed nulla quis orci eleifend auctor ut et sem. Aliquam erat volutpat. Donec egestas tincidunt leo in interdum. Donec varius odio nulla, id porttitor erat venenatis ut. Nulla ac nisl ut enim placerat congue. Fusce consequat purus eget risus luctus finibus. Donec in blandit odio. Sed vestibulum nisl ut diam vestibulum volutpat. Donec magna quam, tempor eget velit quis, blandit tristique lacus. Pellentesque et orci dui.
+
+Integer tempor mollis purus ut volutpat. Pellentesque efficitur cursus neque in ullamcorper. Integer ac tincidunt lacus, at venenatis tellus. Curabitur convallis commodo enim a convallis. Aenean sagittis sodales nibh, sed eleifend diam ultricies at. Vestibulum erat mauris, lobortis ac tempor a, viverra non sem. Nulla non ipsum mollis, dignissim elit a, laoreet enim.
+
+In laoreet purus eget orci rhoncus viverra. Quisque vel metus quis nulla hendrerit viverra. In consectetur velit vitae purus vestibulum, in hendrerit odio sollicitudin. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ut est sed ligula tincidunt fermentum nec ac nulla. Nam in sagittis velit. Vivamus vel dapibus erat, ullamcorper sollicitudin metus.
+
+Quisque pulvinar nulla eget mi mattis, ut convallis nulla ullamcorper. Vivamus placerat mauris vel elementum aliquet. Sed ac accumsan eros. Vivamus vitae rhoncus urna. Fusce gravida cursus varius. In posuere finibus leo cursus molestie. Interdum et malesuada fames ac ante ipsum primis in faucibus. Mauris vulputate mi ut nunc finibus convallis. Praesent luctus erat eu urna facilisis convallis.
+
+Nam efficitur tempus augue varius porttitor. Pellentesque scelerisque dolor scelerisque, dignissim massa eget, iaculis nibh. Praesent viverra molestie dui a pulvinar. Mauris malesuada mattis felis, vitae sagittis metus pellentesque viverra. Phasellus faucibus congue blandit. Pellentesque mattis, justo sed imperdiet rutrum, metus metus porta nisi, vel malesuada lorem massa at dolor. Nullam nisi eros, tristique quis mollis ac, hendrerit nec leo. Praesent viverra molestie vestibulum. Nullam eu aliquam risus, at dignissim diam. Quisque blandit fermentum erat, sed ullamcorper augue pellentesque in. Integer eleifend libero non lacus sagittis auctor. Aliquam volutpat interdum accumsan.
+
+Etiam in eros porta, bibendum lacus eget, feugiat orci. Integer massa dui, commodo ac luctus nec, ornare id velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis dignissim scelerisque ex. Aliquam tempus cursus nibh, sed scelerisque libero sagittis ut. Morbi finibus vestibulum nulla, nec aliquam urna venenatis vulputate. Pellentesque ultricies, lorem a dignissim bibendum, augue nisi eleifend libero, cursus ultrices nulla purus a nunc. Quisque dictum pulvinar turpis vitae finibus. Etiam eget ultrices diam. Sed commodo enim ante, fermentum rhoncus tortor tincidunt ac. Suspendisse fermentum aliquet erat non posuere. Aenean vel dapibus lorem.
+
+Aenean lorem libero, rutrum vel egestas vel, pellentesque ut ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum felis diam, pellentesque sit amet ultricies sed, vestibulum in leo. Morbi aliquet, quam ut fringilla sollicitudin, justo risus suscipit mi, in vulputate neque erat ut turpis. Duis auctor dui non urna sagittis dictum. Vestibulum nec felis vel sapien congue volutpat a a orci. Phasellus tincidunt libero ac lorem feugiat, ac elementum lectus eleifend. Praesent sit amet est id massa convallis congue. Integer ac nunc eget orci pharetra vehicula. Mauris et ultricies diam. Nunc et pellentesque lacus, eget bibendum sapien. Morbi condimentum mi ac metus euismod convallis. Proin consequat rhoncus varius. Maecenas feugiat elementum vulputate.
+
+Vestibulum tempor feugiat dapibus. Ut ornare in augue non euismod. Nulla faucibus gravida condimentum. Curabitur pharetra dui non lorem sagittis iaculis. Quisque vitae nibh magna. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce quis pharetra sem, sed aliquet lectus.
+
+Fusce volutpat tempor tincidunt. Pellentesque ultricies imperdiet tincidunt. Integer porta dictum lorem, non luctus tellus bibendum sit amet. Quisque posuere felis et est dapibus, commodo rutrum leo molestie. Fusce sodales felis sed sem pharetra pretium. Praesent nec sollicitudin nisl. Donec volutpat convallis elementum. Duis id libero augue. Nulla facilisi.
+
+Nulla viverra, urna nec efficitur vulputate, metus odio lacinia purus, in sagittis elit erat vel massa. Fusce ligula leo, finibus non felis dignissim, dictum ullamcorper odio. Phasellus vel eros eu sem venenatis sagittis a nec nulla. Pellentesque sapien elit, lobortis quis dictum et, maximus vitae metus. Curabitur quis aliquam eros. Quisque cursus condimentum urna vel efficitur. Etiam aliquet lorem ut varius suscipit. In viverra molestie felis vitae vehicula. Curabitur cursus, nunc sodales faucibus ullamcorper, urna magna dapibus velit, accumsan blandit mi quam nec justo. Donec ac dui lorem. Sed eu sagittis nulla. Suspendisse ut ante lacus. Fusce non tristique felis. Nulla convallis consectetur arcu, semper egestas urna efficitur quis. Nulla ac turpis at leo pretium maximus. Morbi cursus diam ac purus imperdiet, non commodo tellus cursus.
+
+Mauris ut eros suscipit, suscipit nisi vel, porttitor sapien. Morbi in nulla sapien. Cras maximus pretium justo, vel eleifend urna vulputate sed. Aenean egestas nisl ex. Curabitur sed pharetra ligula. Nulla blandit lorem id mauris tincidunt, at elementum risus aliquet. Quisque id interdum dui.
+
+Aenean nec elit condimentum ex viverra hendrerit. Pellentesque blandit nibh elit, a ultrices orci vestibulum vitae. Donec ultricies malesuada justo ac luctus. Pellentesque laoreet nunc a sem varius, ac dapibus ligula volutpat. Aenean sem felis, aliquam nec ullamcorper quis, ullamcorper non ante. Pellentesque libero leo, sagittis nec tempus a, tincidunt eget risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec elementum massa vel diam suscipit suscipit. Suspendisse eget neque porta, cursus orci eget, imperdiet libero.
+
+Vivamus faucibus vulputate sapien, non pulvinar ex sodales vitae. Maecenas consequat est urna, id faucibus eros dictum at. Vestibulum tortor mi, porta vitae sagittis sed, convallis quis enim. Vestibulum gravida justo pulvinar sem ornare, efficitur dictum neque varius. Nullam egestas congue tellus vitae interdum. Nam lectus erat, porta vitae lorem non, mollis semper velit. Nulla vestibulum tincidunt elit. Phasellus sed vulputate leo.
+
+Sed efficitur quam ac iaculis volutpat. Praesent nec feugiat ex. Aenean at ligula iaculis, imperdiet lacus et, condimentum magna. Integer euismod leo id mauris condimentum, quis semper lacus blandit. Sed volutpat neque urna, sit amet ullamcorper est dignissim non. Vestibulum tristique sollicitudin risus, sed hendrerit massa finibus id. Vestibulum sit amet risus non eros vehicula malesuada. Nam facilisis lacus sed quam pulvinar, at fermentum lectus tincidunt.
+
+Vivamus laoreet sem nec odio blandit, ut ornare sem egestas. Suspendisse potenti. Nulla aliquam pretium volutpat. Maecenas a orci suscipit, aliquam eros a, maximus urna. Aliquam eu gravida justo, et hendrerit justo. Suspendisse a commodo lorem, quis viverra nisl. Nulla vel pellentesque nisl. Nulla ligula tellus, vehicula sit amet turpis in, sodales tincidunt tellus. Proin ut nibh sed ipsum porta dignissim vel sed mauris. Interdum et malesuada fames ac ante ipsum primis in faucibus. In hac habitasse platea dictumst. Vestibulum efficitur nulla rutrum, accumsan lacus at, dignissim tortor. Morbi egestas metus ut nibh tincidunt posuere at sed elit. Integer eget hendrerit nulla.
+
+Donec sagittis sagittis tempus. Proin iaculis neque vehicula commodo faucibus. Pellentesque erat ante, vehicula sed efficitur vitae, varius non sem. Mauris pellentesque, felis nec egestas scelerisque, nulla nunc fringilla arcu, feugiat fringilla quam neque in elit. Nullam ut ex odio. Mauris enim risus, consequat at suscipit at, pulvinar ut arcu. Fusce mollis sem sed tellus tempus pellentesque. In pharetra, libero sed tristique vestibulum, massa velit egestas risus, at mollis augue lorem sit amet turpis. Mauris risus dui, sagittis vitae congue ut, condimentum ut augue. Quisque non sollicitudin purus, sit amet consectetur sapien.
+
+Sed scelerisque ipsum sed augue varius, sit amet ultricies purus posuere. Etiam vehicula at nunc in posuere. Cras eget risus a sapien mollis facilisis. Morbi vel purus auctor, faucibus mauris non, malesuada leo. Donec venenatis consectetur libero in pretium. Ut efficitur molestie metus id scelerisque. Nunc dolor justo, pharetra vel sagittis vitae, placerat ut justo. Donec tempor fermentum est semper auctor. Nullam tincidunt risus non risus elementum varius. Suspendisse euismod augue metus, nec pellentesque enim sagittis ac. Morbi et lectus quis justo commodo varius commodo vel risus. In bibendum purus in erat ullamcorper, sit amet dignissim sapien scelerisque. Quisque tempus elementum rutrum.
+
+In viverra sollicitudin pretium. Sed finibus scelerisque sollicitudin. Nulla lobortis purus in lectus iaculis, a ornare ex accumsan. Morbi malesuada mollis placerat. In hac habitasse platea dictumst. Pellentesque sed dui quis odio scelerisque molestie eu nec libero. Proin viverra magna ligula, at luctus lacus posuere sed. Nullam non congue mi. Praesent non mattis neque, sit amet tempus diam. Mauris eget cursus lacus, id dictum mi.
+
+Sed semper velit in vehicula tristique. In lobortis est augue, et maximus tellus iaculis ut. Proin quis ex maximus erat iaculis imperdiet. Curabitur ultrices turpis ac nibh congue ornare. Fusce a aliquet felis, nec sodales tellus. Nunc mauris ante, feugiat et facilisis at, pharetra ultricies dui. Integer felis metus, porttitor ac ipsum vitae, placerat varius ex. Morbi in dui a nunc aliquam posuere. Nulla tempus tortor ac lorem consectetur sodales. Praesent sit amet placerat diam. Curabitur sodales mauris ante, et tincidunt lacus ultricies quis. Nulla eu finibus nisl, sit amet volutpat leo. Donec ligula enim, feugiat non aliquet nec, congue interdum lorem. Pellentesque a nisi blandit, semper massa sit amet, auctor eros.
+
+Aenean ligula libero, commodo a erat at, tristique facilisis quam. Sed congue fringilla lacus, vel iaculis quam suscipit ornare. Curabitur non pretium mi. Donec condimentum odio dui, id malesuada ipsum porta ac. Aliquam imperdiet cursus ullamcorper. Duis cursus tincidunt nibh sit amet cursus. Aliquam urna orci, sodales ac ipsum at, placerat lobortis neque. Sed sit amet convallis felis, vestibulum finibus arcu. Phasellus venenatis egestas felis, id aliquam turpis iaculis non. Proin a lacus ut felis malesuada sodales. Duis elementum, eros ac placerat bibendum, quam nisl varius mauris, vel venenatis neque augue et justo. Nunc varius sem velit, vel tempus mi aliquet id. Fusce purus massa, mollis id nulla non, dignissim cursus massa. Sed sollicitudin interdum felis, nec eleifend nisl feugiat eget. Nulla rutrum id odio ut consectetur. Maecenas fermentum turpis vitae libero ullamcorper suscipit.
+
+Vestibulum auctor lectus ligula, non sollicitudin odio maximus nec. Cras faucibus, felis sed suscipit tempor, risus lorem consectetur est, eget pulvinar nibh dui eu dolor. Vestibulum pellentesque, ex aliquam vulputate laoreet, libero lorem rhoncus risus, vitae congue velit justo vitae nisi. Nullam placerat venenatis tortor, sit amet lacinia augue placerat nec. Quisque vulputate lectus vel pulvinar condimentum. Nullam at libero iaculis, mattis purus vel, tincidunt diam. Suspendisse eu ullamcorper eros. Nulla id eros odio. Ut enim leo, ultricies quis mauris sed, interdum commodo felis. Etiam enim lacus, scelerisque a interdum eget, mollis vel tellus. Phasellus vel vulputate orci. Nulla ornare leo sed arcu rhoncus convallis. Duis libero arcu, pulvinar ut tellus vitae, aliquam euismod magna. Donec semper nisi eget nulla tempus, sed condimentum massa sollicitudin.
+
+Suspendisse bibendum ante vitae ullamcorper semper. Praesent dui est, elementum nec lacus in, pellentesque accumsan sapien. Cras quis urna at lacus posuere commodo eget nec arcu. Nunc varius ante quis ligula rhoncus, ut dignissim metus commodo. Integer volutpat gravida nunc eget faucibus. Quisque imperdiet, mauris vitae cursus malesuada, lacus mauris tempus sem, ut accumsan purus lectus quis nisi. Vestibulum aliquam dui sed nisl laoreet, id posuere quam imperdiet. Aliquam ultricies non enim vel tempor. Donec sed feugiat justo, vel rutrum enim. Phasellus lorem quam, dapibus a tincidunt vulputate, pellentesque non lorem.
+
+Nunc quam diam, condimentum sit amet enim semper, hendrerit laoreet magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam et pulvinar leo, ac fermentum lectus. Sed erat ante, mattis ac tempor vitae, euismod at tortor. Ut sagittis fringilla scelerisque. Ut pulvinar molestie leo eu faucibus. Sed quis efficitur purus. Pellentesque nibh nisi, porta id orci id, sagittis sodales tellus. Ut venenatis velit a lectus lacinia, at ultrices nisi commodo. Vivamus eros orci, ornare vel ullamcorper elementum, posuere id ligula. Aliquam non massa pellentesque, semper ipsum scelerisque, dapibus leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla pretium leo diam, sit amet bibendum lacus tempus quis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer quis pulvinar nibh.
+
+Mauris sed eros nisi. Cras malesuada, turpis vitae laoreet porta, sapien odio maximus nulla, ut efficitur mauris odio tincidunt elit. Nam ut urna eros. Sed at vestibulum risus. Nulla luctus pulvinar rhoncus. Pellentesque maximus ligula a est ullamcorper, sed tempus tortor ultrices. Curabitur ligula odio, mollis sit amet risus quis, tempor auctor magna. Suspendisse vel quam quis lorem commodo facilisis. Donec eu ipsum suscipit, molestie dui sed, fringilla dui. Proin placerat ex a lorem sodales convallis. Sed molestie quam mi.
+
+Fusce laoreet nec dolor id bibendum. Nunc condimentum vulputate massa lacinia fermentum. Donec maximus cursus eros sed porta. Nunc eu porta turpis. Nulla cursus et nisl eu elementum. Ut rutrum scelerisque aliquet. In tellus erat, rhoncus id tempus vitae, vestibulum non quam.
+
+Vivamus luctus elit a efficitur dapibus. Praesent magna mi, pellentesque sed accumsan dapibus, blandit at lectus. Praesent sodales erat diam. Pellentesque placerat lobortis enim, a dapibus ligula molestie ut. Phasellus dui augue, suscipit ac urna non, iaculis eleifend augue. Maecenas sed elit iaculis, pretium ligula lacinia, aliquam libero. Nulla sem mi, pellentesque viverra lorem vel, luctus vulputate augue. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque fermentum nunc ex, at lobortis turpis congue vitae. Suspendisse iaculis elementum enim commodo facilisis. Vestibulum non neque tellus. Proin vitae sodales urna. Mauris interdum purus et neque tempus, vitae mattis libero finibus. Suspendisse iaculis condimentum nibh, eu mattis enim vehicula a.
+
+Fusce dictum urna non lectus ullamcorper vestibulum id in elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc fermentum odio non ante sollicitudin posuere. Praesent vulputate quam nec magna euismod pellentesque. Etiam tempor nunc eget velit volutpat eleifend. Mauris sodales nunc ullamcorper, gravida purus eget, rutrum sem. Nam a sapien rhoncus, scelerisque lacus ac, condimentum ipsum. Pellentesque suscipit, ligula ut rhoncus ullamcorper, ligula augue rutrum lorem, eget aliquam risus tortor eget metus. Curabitur scelerisque bibendum purus vel vulputate. Morbi et odio at neque sodales suscipit. Nam at pretium nulla. In scelerisque vulputate suscipit. Nulla facilisi. Pellentesque eu sem eu ligula efficitur viverra. Pellentesque gravida consequat urna id bibendum.
+
+Nulla consectetur facilisis est nec aliquam. Proin hendrerit magna suscipit ante accumsan hendrerit. Nulla ut sem id neque tempor vehicula. Sed eget massa eget sem placerat tincidunt. Ut eleifend, justo sit amet egestas lacinia, ex velit pharetra nulla, nec aliquet elit neque ut turpis. Quisque in gravida velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed euismod malesuada convallis. Ut ultricies, magna et blandit fringilla, dolor dolor maximus sapien, in aliquet augue est vel odio. Nulla commodo elit massa, euismod tempor turpis aliquet eget. Morbi non odio et tortor egestas ultrices. Etiam semper, ipsum et dictum pharetra, eros purus bibendum lacus, vel laoreet lacus sem vehicula nibh. Nunc enim nulla, pulvinar sit amet lobortis sed, porttitor molestie risus. Morbi tincidunt diam mi, nec auctor sem rutrum at.
+
+Donec pellentesque odio odio, eu condimentum risus consectetur quis. Vivamus ullamcorper, mauris non semper rutrum, dui risus suscipit tellus, ut tempor velit risus vitae nibh. Duis tempor nibh at tristique rutrum. Cras congue nisl at sem sollicitudin efficitur. Aenean auctor purus vel libero fermentum elementum. Mauris convallis orci id interdum accumsan. Aliquam at metus risus. Sed accumsan, quam id dignissim congue, velit risus eleifend ligula, ut fringilla elit erat at neque. Aliquam tempor, quam ut ultrices volutpat, orci lectus vulputate turpis, eget pharetra purus nisi non lorem. Ut condimentum convallis justo, a volutpat eros. Sed tempus turpis leo, in convallis est fringilla sed. Vivamus eu laoreet tellus. Quisque ullamcorper ullamcorper leo. Nam fermentum egestas facilisis. Nulla egestas ligula feugiat urna molestie, faucibus convallis erat accumsan. Cras pellentesque ipsum lectus, vitae luctus dolor suscipit nec.
+
+Vivamus vel nibh sed mi tincidunt cursus quis facilisis tellus. Donec eget est eu velit pretium molestie. Maecenas lacinia risus turpis. Sed tristique id risus sit amet venenatis. Duis maximus, metus ac molestie convallis, quam ex dapibus sem, at rutrum metus nisi quis lectus. Suspendisse sodales in nisi at hendrerit. Maecenas suscipit lobortis vulputate. Nunc convallis sit amet elit eget porta. Mauris tincidunt massa in augue finibus iaculis. Vestibulum imperdiet, orci vel bibendum laoreet, ligula quam mollis lacus, a eleifend nisi tellus vitae ipsum. Cras non ante sollicitudin, auctor dolor id, condimentum tellus. Morbi malesuada leo nec lectus scelerisque, nec interdum lacus ornare. Integer ultrices ligula nunc, sed blandit urna aliquam eget. Proin consequat viverra ex non rhoncus. Phasellus id nibh at tortor sodales blandit. Donec dignissim ipsum vel ligula malesuada rhoncus.
+
+Nullam mauris sem, dapibus ac nisl at, hendrerit faucibus nisi. Mauris dictum fermentum pellentesque. Praesent in gravida odio. Vestibulum pharetra iaculis est quis tincidunt. Sed venenatis rhoncus lacus, non porta ante vulputate at. Duis fringilla ipsum at urna euismod molestie. Duis a porttitor ante. Mauris pharetra elit et metus auctor, a eleifend sapien porta. Vivamus ut tincidunt purus, lobortis euismod tellus. Nullam non nulla gravida, laoreet tellus ac, placerat urna.
+
+Sed justo sapien, scelerisque nec nisl vel, efficitur aliquet purus. Phasellus eget posuere nisl. Integer porta vel purus nec ornare. Pellentesque rutrum in nulla at hendrerit. Nullam elementum sodales volutpat. Duis tempus, purus sagittis auctor ullamcorper, dui erat hendrerit nulla, id finibus eros dui quis risus. Quisque posuere nunc quis augue placerat lacinia. Nunc quis lorem vulputate, tincidunt enim nec, rhoncus odio. Ut porttitor porta velit ut vulputate. Duis convallis sagittis magna nec gravida. Ut eu luctus sem, non placerat erat. Vivamus viverra ut ligula ac finibus. Cras ligula urna, tincidunt id risus eu, dapibus viverra lorem. Aliquam erat volutpat. Sed dolor nisi, faucibus non ligula faucibus, laoreet bibendum diam. Vivamus sagittis lacus ut condimentum tincidunt.
+
+Proin tristique mi ullamcorper dolor accumsan mollis. Nulla facilisi. Pellentesque iaculis mattis augue ac rutrum. Mauris in nulla at ligula fringilla pulvinar. Nam commodo ornare nibh ac viverra. Maecenas eget augue a risus mattis ullamcorper non at nibh. Aenean nec erat diam. Pellentesque augue nisl, venenatis mollis dolor non, bibendum malesuada leo. Pellentesque elementum purus ornare mauris iaculis porttitor. Sed mollis tempor dui eu elementum. Donec porttitor tellus non mattis gravida. Mauris venenatis suscipit convallis. Sed dolor sapien, pellentesque et tellus a, tempus cursus magna. Nunc lobortis leo magna, at maximus orci ultrices eget. Nullam vulputate dictum nisi, vel egestas orci.
+
+Nam nibh mi, ornare sit amet nibh vel, lobortis lacinia leo. Ut egestas mi vel nunc luctus vestibulum. Nullam id tempus felis, eget convallis erat. Aliquam venenatis ut tellus id fringilla. Aliquam erat volutpat. Sed vehicula, odio nec mollis dapibus, ligula sapien consequat risus, ut volutpat diam neque ut neque. Mauris venenatis libero vitae sem elementum, sit amet maximus massa varius. Maecenas malesuada mi id leo euismod, eu maximus sapien vehicula. Nulla facilisi. Duis nec venenatis ante, non pulvinar lacus. In sollicitudin sit amet velit suscipit egestas. Maecenas a lectus euismod, dictum nulla at, malesuada lectus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec lorem massa, laoreet non elit nec, sollicitudin blandit felis.
+
+Cras dignissim fermentum tellus ut fringilla. Maecenas maximus eros pretium sagittis venenatis. Maecenas id enim ac est semper efficitur ac hendrerit leo. Cras eu arcu tincidunt risus pellentesque aliquam. Pellentesque vel sodales libero, non rhoncus enim. Integer vulputate vulputate libero, eu consectetur eros euismod vitae. Fusce magna nibh, vehicula sed turpis eget, malesuada ultricies sem. Sed convallis sem nisl, rhoncus mollis mauris bibendum ut. Pellentesque vitae massa a justo dapibus laoreet. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed mollis egestas nisl vel ultricies. Phasellus sit amet varius leo, sed vehicula sapien. Etiam in urna eget neque aliquet ultricies in nec quam. Aliquam at feugiat elit.
+
+Maecenas placerat nisi ultrices neque pulvinar, et ultrices ante tempus. Vestibulum laoreet quam lacus, eget commodo magna dictum consectetur. Aliquam erat volutpat. Aenean tincidunt ipsum sit amet justo aliquet tempus. Quisque blandit sit amet est facilisis dictum. Sed non consequat dui. Integer purus diam, gravida quis tortor lobortis, iaculis vehicula sem. Morbi pellentesque est elit, vitae interdum elit laoreet et. Vestibulum in blandit ante, eu blandit velit. Morbi sagittis eu est eu vulputate. Nullam ac mi feugiat nibh feugiat suscipit. Sed interdum tincidunt efficitur. Integer dictum sem erat, ut pharetra libero lacinia in. Mauris at hendrerit odio, a facilisis lacus. Donec blandit massa ac nisi ultrices faucibus.
+
+Aenean tempus id ligula at mollis. Cras id dui magna. Integer id neque tincidunt, rhoncus nunc et, laoreet nibh. Pellentesque consectetur odio ligula, et consectetur tortor scelerisque non. Cras quis ex pharetra mi ornare lobortis. Phasellus fringilla interdum felis, vel aliquam ligula. Mauris cursus varius turpis in iaculis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent eget mi id nulla semper dapibus.
+
+Vivamus lacus augue, eleifend dignissim ipsum eu, interdum accumsan massa. Nam id quam vel ligula consectetur volutpat id eget eros. Aliquam sed felis velit. Duis egestas velit ac dolor blandit, ut elementum mi tincidunt. Integer varius nisl a sapien pellentesque, et pellentesque ante elementum. Fusce ac orci interdum, faucibus nisl ut, sagittis nisi. Vestibulum sed diam eu magna congue ornare. Integer dignissim ligula sit amet mauris pretium vulputate. Duis ac tincidunt magna. Sed vehicula, ante nec vulputate venenatis, mauris odio blandit dolor, vitae lacinia nibh lorem et metus.
+
+Sed non sapien vel lorem tempor semper ac ac tellus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas auctor ante sit amet suscipit vulputate. In ac cursus turpis. Donec eu sem bibendum, blandit est nec, blandit tortor. Pellentesque scelerisque justo vitae magna cursus, vitae egestas libero interdum. Pellentesque vitae ligula vel mauris vehicula convallis. Nunc ornare lectus sit amet lorem aliquet dignissim. Cras nec ligula pretium, semper nulla a, pulvinar lacus. Sed ac augue bibendum, posuere ipsum eu, venenatis quam. Sed elementum nunc quis odio pellentesque, a vestibulum ex congue. Cras id malesuada arcu. Mauris ut egestas nulla, sed tempus ligula. Donec ac elit ut nisi pulvinar elementum. Suspendisse id auctor lectus, vitae ultricies lacus.
+
+Vestibulum pulvinar ornare cursus. Curabitur accumsan sollicitudin mi in vestibulum. Vestibulum vulputate tincidunt luctus. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Phasellus a mattis neque, id malesuada odio. Aliquam id auctor magna. Vestibulum quis nibh lacinia, tincidunt felis sed, vestibulum ex.
+
+Donec placerat ipsum diam, vel imperdiet velit eleifend ac. Quisque dapibus erat non dui convallis eleifend. Praesent pellentesque felis id suscipit rutrum. Donec quis lacinia turpis. Nulla justo eros, fringilla vel fringilla in, euismod sollicitudin arcu. In ut lobortis arcu, at rhoncus elit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
+
+Pellentesque iaculis quam nec interdum eleifend. Fusce mauris mauris, imperdiet sollicitudin volutpat eu, sollicitudin blandit leo. Vestibulum hendrerit diam gravida erat imperdiet, blandit dignissim dui tempor. Phasellus viverra ante quis aliquam finibus. Duis sed condimentum augue, nec sollicitudin dui. Ut ullamcorper metus ac ligula accumsan, ac fringilla metus gravida. Morbi rhoncus est nunc, at lacinia ex fringilla sit amet. Integer lobortis ultricies nisi vitae accumsan. Nulla nec sagittis ante. Mauris bibendum nisi ut magna vulputate maximus. Praesent in elit eu metus dignissim cursus. Ut a tellus felis. Mauris eget ornare diam.
+
+Suspendisse potenti. Nam nec tortor ex. Duis eu elementum ligula. Pellentesque efficitur sodales orci, vitae sollicitudin odio tempor ac. Nam lacus ante, lobortis vitae lobortis eu, eleifend et velit. Nulla et lectus eu nibh tristique malesuada a sit amet felis. Proin molestie, lectus vitae sagittis malesuada, massa velit finibus est, id vestibulum dolor felis eget lectus. Phasellus varius pellentesque neque, a malesuada ex mattis eget. Nulla facilisi. Phasellus interdum placerat lobortis. Sed et odio tristique, viverra libero et, sagittis diam. Proin tristique lectus id bibendum maximus. Integer ornare euismod ligula nec malesuada. Nulla facilisi. Nullam bibendum hendrerit pharetra.
+
+Duis pharetra auctor felis, eget aliquet justo commodo at. Donec quis nibh non arcu sodales efficitur. Aenean lorem sapien, tincidunt eu sapien nec, convallis tempor diam. Curabitur volutpat, felis ut congue euismod, lacus nisl euismod ipsum, vel consectetur orci nibh sed ligula. Curabitur consectetur vitae mauris sed tempor. Fusce vel pretium nibh, et tristique dolor. Aliquam semper a ante non finibus. Praesent euismod urna augue, at feugiat orci commodo ut. Duis imperdiet purus non augue cursus gravida. Maecenas sodales purus et sollicitudin venenatis. Nam ultrices lorem lectus, ut pretium turpis hendrerit eget. Vestibulum vel lacinia lectus, at dignissim diam. Vivamus ut tortor ac tortor blandit finibus. Etiam porttitor tortor sit amet elit lacinia gravida. Pellentesque pretium, orci vitae tempor vehicula, nisi tellus tincidunt sapien, id egestas felis quam a nunc. Pellentesque sed vestibulum nisl.
+
+Mauris congue, justo vel dapibus pretium, ipsum augue consectetur leo, at aliquam ipsum neque non mauris. Nam sollicitudin in urna eu blandit. Aliquam erat volutpat. Morbi eget interdum ante. Pellentesque congue gravida arcu, eget ornare ante elementum nec. Integer a auctor dolor, in varius sem. Etiam dictum nibh magna, at volutpat nunc blandit eu. Curabitur at sem ipsum.
+
+Nulla porttitor erat eget volutpat iaculis. Pellentesque egestas, nisl vel ultrices efficitur, ex magna condimentum urna, in tincidunt massa turpis eget metus. Etiam vitae magna elementum, fermentum justo ut, pretium velit. Aliquam aliquet venenatis malesuada. Quisque consequat enim metus, pellentesque blandit leo rhoncus id. Vivamus vestibulum, est in condimentum mollis, ligula eros blandit lorem, vitae dignissim lectus mi eget nulla. Cras posuere leo at neque convallis, sed pretium massa ultrices. Morbi tempus porttitor turpis. Nam vitae mauris et massa venenatis tincidunt. Quisque vestibulum lacus ligula, in sodales felis elementum vel. Sed a tellus condimentum, sodales nisi id, aliquet elit.
+
+Vestibulum ac ex eu turpis lacinia condimentum nec eget ipsum. Nulla non imperdiet erat, at malesuada lorem. Praesent efficitur imperdiet augue vel laoreet. Sed dignissim, ante non porta feugiat, enim nunc rhoncus lorem, eu luctus turpis risus sit amet orci. Vivamus bibendum pharetra venenatis. In at gravida nisi. Vestibulum pulvinar sapien ac augue scelerisque, vitae blandit nibh malesuada. Nunc vitae est faucibus, accumsan risus a, laoreet urna. Cras imperdiet lacus in augue facilisis dignissim. Duis sed nisi quis diam mollis rutrum.
+
+Vestibulum eget egestas neque. Praesent viverra, velit quis porttitor euismod, sem libero venenatis mauris, id congue urna nulla sed lorem. Nulla mollis metus nec diam malesuada aliquam. Duis ac risus nunc. Cras sollicitudin urna nunc, id sodales quam gravida sit amet. Fusce in vulputate orci, in venenatis lorem. Donec a sagittis ipsum. Quisque consequat sapien tellus, sed efficitur lacus aliquam eu. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean in neque at augue elementum commodo pellentesque eget ligula. Nullam condimentum efficitur tincidunt. Phasellus posuere tincidunt odio sed facilisis. Aenean eu risus at est euismod facilisis. Curabitur elit purus, malesuada quis blandit id, rutrum vitae dui. Praesent porta rutrum erat, ullamcorper viverra nunc. Cras ut velit dui.
+
+Etiam posuere pulvinar mi at ullamcorper. Pellentesque finibus, tellus non convallis commodo, orci nibh dapibus nisl, at aliquam purus nulla eget dui. Praesent fringilla urna nec nulla pellentesque, nec rhoncus turpis ultricies. Sed laoreet velit pellentesque libero varius, ac interdum urna viverra. Phasellus sed consectetur massa. Morbi quis velit nec ipsum varius tempor. Proin id sodales felis. Aliquam lacinia risus quis ligula condimentum sodales. Nulla vel arcu aliquet neque iaculis aliquet. Cras sed lorem eu turpis tincidunt sodales. Sed pulvinar elementum ligula, nec faucibus nisl. Fusce nec tellus eget dui tempor sagittis. In vitae enim in ex viverra commodo. Duis est erat, fringilla ac semper a, dapibus in tortor.
+
+Maecenas commodo vulputate iaculis. Aliquam non facilisis est. Donec pellentesque vitae nibh nec volutpat. In commodo metus placerat lorem commodo, non lacinia nibh bibendum. In viverra rhoncus erat. Mauris nec nisl blandit, elementum justo nec, accumsan libero. Aliquam elementum, velit et ullamcorper convallis, turpis lorem elementum lorem, quis consequat tortor eros ut erat. Curabitur et enim quis felis vulputate congue et vel purus. Sed elementum interdum ipsum, sed tincidunt arcu scelerisque et.
+
+Aenean interdum elementum mauris ut porta. Mauris vel purus ac odio vulputate pulvinar at quis odio. In turpis turpis, convallis in augue id, elementum vulputate lorem. Sed tincidunt fermentum vulputate. Nunc ipsum ipsum, molestie vel convallis id, pharetra vel arcu. Maecenas vel dui elit. Sed blandit dolor sit amet risus commodo faucibus. Duis rhoncus felis arcu, vel aliquam nisi faucibus sed. Suspendisse cursus eget nunc ut bibendum. Fusce non ligula risus. Curabitur vitae cursus metus, quis fringilla diam. Phasellus turpis ante, pulvinar ac turpis tristique, sollicitudin congue lectus. Proin quis ipsum at ipsum euismod euismod.
+
+Nunc ut fermentum nunc. Donec id commodo lacus, at hendrerit justo. Donec cursus purus sodales nunc commodo, quis bibendum elit hendrerit. Quisque quis pellentesque nibh, ac vulputate neque. Aenean non placerat felis, eget feugiat ligula. Vivamus a eros accumsan, cursus neque at, ultricies magna. Fusce tincidunt tellus vitae mi rutrum laoreet sed quis ligula. Nullam ullamcorper ligula ligula, vel fringilla metus aliquet a. Morbi aliquet, mauris vel interdum venenatis, ex arcu venenatis tortor, at tincidunt dui ipsum et arcu. Nulla blandit gravida nulla ac iaculis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed ullamcorper lectus in sapien lobortis, eget posuere massa varius.
+
+Cras lacinia nunc faucibus mauris placerat pretium eget non sapien. Morbi viverra bibendum posuere. Aliquam accumsan sagittis dolor non iaculis. Sed nunc odio, lobortis in dolor ac, rutrum fermentum velit. In venenatis, velit in molestie semper, est magna condimentum dui, aliquam auctor lorem nulla vel ligula. Morbi vehicula turpis turpis, quis mollis justo tempus vitae. Proin luctus lacus in mauris porttitor aliquet. Duis vitae nunc ex. Nullam eget erat vitae nulla iaculis rhoncus. Sed lacus dui, suscipit eu leo vitae, tincidunt dignissim risus. Praesent ut massa ut arcu sagittis consequat. Sed sit amet tincidunt turpis. Nulla bibendum, felis eget posuere dictum, libero mi tristique elit, at venenatis neque elit ac quam. Curabitur nisi sem, scelerisque nec nunc ac, pulvinar pharetra odio. Curabitur egestas pellentesque arcu sed suscipit. In mattis dolor vel dui mollis feugiat.
+
+Sed commodo, dui ac vestibulum dictum, tellus libero tincidunt lacus, viverra commodo est felis vitae urna. Proin tincidunt neque vel turpis eleifend laoreet. Vestibulum sagittis, tortor sed iaculis consequat, urna ante sagittis est, ac ullamcorper lorem nibh dignissim odio. Nam arcu mi, cursus et blandit nec, aliquam ut nulla. Aenean quis iaculis tellus, eu egestas augue. Etiam pretium eget nisi quis iaculis. Aliquam sed convallis eros. Ut bibendum rhoncus lacus, in vestibulum dui ultricies id. Fusce vestibulum, mauris ut tempor consequat, dolor nisl pellentesque elit, in porta arcu elit vel ante. Vivamus at nisl est. Etiam nec blandit tortor, at pulvinar orci. Proin semper dapibus tincidunt. Phasellus lobortis enim ullamcorper dolor tempor cursus.
+
+Mauris a libero in enim gravida aliquet ac sit amet nibh. Vestibulum ac neque posuere, blandit libero ac, vehicula enim. Aliquam auctor iaculis eros sit amet molestie. Quisque faucibus turpis et massa tristique, nec dapibus mauris aliquet. Proin blandit aliquet mauris, non tincidunt odio blandit vel. Curabitur a nibh in eros commodo tincidunt eu et libero. Curabitur sit amet dapibus ex, in condimentum magna. Sed eu sem sem. Nunc tellus dolor, rutrum eu mauris nec, congue feugiat purus. Fusce tempor, neque vitae bibendum imperdiet, dolor ipsum condimentum urna, et egestas quam tortor in ex. Aliquam velit magna, commodo hendrerit sagittis sed, feugiat eget erat. Nunc quis ullamcorper velit, eu consequat augue. Nam arcu mauris, condimentum sit amet magna in, finibus scelerisque nunc. Mauris erat est, hendrerit ac accumsan eget, facilisis ut nisl. Quisque dignissim arcu quis diam tincidunt tristique. Sed rhoncus nisl non enim fermentum, a lobortis dolor consectetur.
+
+Sed eget condimentum ligula. Vestibulum vitae cursus eros. Donec elementum sapien magna, posuere iaculis sem ultrices lobortis. Morbi eu bibendum lectus. Suspendisse ante eros, ullamcorper ac viverra eget, pellentesque sed sapien. Duis sit amet tincidunt dui, vitae lobortis purus. Sed venenatis tincidunt volutpat. Vivamus a nisl ac elit consectetur semper ut eu libero. Proin id cursus ex. In hac habitasse platea dictumst. Aenean sed nisi vitae odio venenatis pulvinar vitae ac risus. Sed varius magna ut erat luctus vehicula.
+
+Nunc non ex eget purus blandit faucibus at quis velit. Donec quis mi vestibulum, facilisis nisi quis, tincidunt turpis. Sed bibendum metus sed consectetur mollis. Maecenas fermentum, erat finibus pulvinar lacinia, ex risus dictum sem, ut vestibulum augue diam vel diam. Donec ac massa non nibh pretium laoreet eget in orci. Nulla placerat eleifend mi, pretium vestibulum diam condimentum vitae. Nunc odio turpis, feugiat vitae turpis eget, pellentesque commodo turpis. Etiam sapien purus, consequat nec mi eget, consectetur efficitur neque. Phasellus porttitor sapien sit amet nunc semper, vel bibendum nibh finibus. Ut ac imperdiet ex, eu congue felis. In posuere nisi felis. Mauris tempus pretium mauris, ac viverra nunc hendrerit id. Sed fermentum nec sem ac pulvinar. Integer dictum velit eget congue venenatis.
+
+Cras eros dolor, venenatis ac dictum sed, dignissim nec sem. Curabitur tempor erat quis pretium interdum. Nunc vestibulum justo nisi, sit amet sagittis tellus consequat vel. Donec pharetra nunc vitae consequat eleifend. Quisque ut mauris quis nunc volutpat consectetur. Nam a suscipit ligula, at gravida libero. Vestibulum blandit, tellus sed bibendum volutpat, libero tortor convallis nisl, sit amet placerat lorem dolor nec libero. Integer blandit libero elit, ut congue ex euismod congue. Nulla sodales justo id eros condimentum faucibus.
+
+Proin quam ante, hendrerit at bibendum eu, pharetra at lectus. Proin finibus arcu id nisl aliquam dapibus. Fusce a suscipit nisl. Ut placerat ultrices nibh nec efficitur. Vestibulum vitae interdum magna. Donec lobortis finibus risus, et luctus ipsum efficitur euismod. Quisque dictum diam et venenatis euismod. Cras dictum molestie aliquet. Vestibulum imperdiet quam eget diam malesuada, quis pulvinar odio dignissim. Curabitur sapien elit, iaculis vitae justo eget, pretium malesuada elit. Donec gravida molestie tincidunt. Nullam at commodo ipsum. Sed nisi erat, tincidunt ultricies interdum consequat, pretium mollis ipsum. Vivamus in erat consectetur, sodales nibh at, porta nunc. Mauris semper, dui vitae condimentum tempus, mauris justo volutpat urna, ac ullamcorper tortor dolor in sem.
+
+Aenean leo ligula, egestas at vestibulum ac, porta vel mauris. Curabitur at lorem non mauris fringilla venenatis vel eu arcu. Donec posuere eleifend diam. Duis aliquet justo lacus, eu egestas erat eleifend sed. Sed non cursus urna. Sed pretium purus id blandit varius. Mauris turpis mi, lobortis eu tellus sit amet, maximus venenatis felis. Proin non varius enim, aliquet finibus velit. Praesent posuere pharetra ipsum eget varius. Phasellus non fermentum magna, ut iaculis augue. Praesent ut nisl nunc.
+
+Sed ligula tellus, interdum at sapien ut, dictum pellentesque nisl. Duis fringilla, sem nec elementum dapibus, nisl tellus maximus velit, eu varius sem nisl feugiat eros. Maecenas quis viverra lacus. Nulla nec commodo ex, nec placerat enim. Curabitur ultrices sagittis fringilla. Vestibulum sit amet enim sagittis, condimentum nisl sit amet, pulvinar orci. Ut at erat finibus erat bibendum convallis. Quisque euismod magna eget leo facilisis hendrerit. Cras venenatis, nisi quis sollicitudin volutpat, metus enim vestibulum nunc, at mollis leo leo nec est. Fusce fermentum tristique feugiat. Suspendisse sem est, condimentum ut ante at, egestas convallis ante. Vestibulum dictum, ex nec imperdiet laoreet, magna est ullamcorper augue, vel molestie quam odio vel ante. Donec dui dui, posuere a neque ac, condimentum vehicula magna. Curabitur suscipit, risus vitae bibendum posuere, mauris lorem viverra est, at tristique arcu quam quis leo. Donec sed posuere neque. Suspendisse iaculis aliquet condimentum.
+
+Morbi tempus condimentum diam eget bibendum. Aliquam varius magna quis lectus interdum, in elementum ligula tempor. Morbi vitae lorem sapien. Morbi luctus consectetur eros non aliquet. Pellentesque vestibulum sem sed ante accumsan faucibus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam ac suscipit justo. Nunc efficitur lectus eu arcu venenatis, vel accumsan ex suscipit. Vestibulum egestas ultricies tellus, et interdum enim pretium eu. Aenean rutrum est tincidunt rhoncus molestie. Phasellus hendrerit tellus et laoreet varius. Integer efficitur felis magna, nec sollicitudin arcu sollicitudin in. Curabitur non feugiat odio. Mauris nisi odio, luctus quis dolor sed, tristique luctus ex. Nullam libero enim, facilisis ut venenatis et, vulputate sed purus.
+
+Mauris a odio ut leo porttitor ultrices a et ex. Pellentesque vestibulum lacinia faucibus. In pellentesque eget augue at feugiat. Integer finibus augue dolor, in luctus lorem rutrum vitae. Donec pharetra lectus ac purus sollicitudin, vel tristique mauris pretium. Cras porttitor mi eu lectus consequat, a ultrices felis venenatis. In condimentum turpis in velit mattis laoreet. Aliquam sed mauris id nulla ultrices convallis vel vel velit. Suspendisse ut arcu finibus justo fermentum fringilla. Etiam in malesuada nisl. In hac habitasse platea dictumst. Duis a est lacinia, pretium dui eget, condimentum turpis. Integer ac placerat augue. Donec et eros felis.
+
+Integer cursus magna id quam sagittis consectetur. Aliquam erat volutpat. Quisque ullamcorper nisl nec massa dapibus facilisis vitae at nunc. Donec laoreet, libero in elementum tempus, enim odio porttitor felis, venenatis fermentum augue velit eu urna. Ut at ullamcorper enim. In molestie, velit et blandit maximus, erat nunc laoreet quam, vel finibus est mauris non sapien. Donec et dictum lorem. Nunc vestibulum, dolor eget tempus maximus, elit eros aliquam velit, vitae mattis mauris lectus ac tortor. Donec rutrum justo orci, id dictum metus vestibulum a. Etiam bibendum ipsum convallis, lacinia turpis vitae, dictum tortor. In velit dolor, scelerisque sed molestie nec, volutpat a turpis. Cras posuere commodo erat ut gravida. Quisque ante ipsum, volutpat a tellus non, dignissim ornare elit. Pellentesque sed porttitor dui, luctus rhoncus purus. In vitae ante pulvinar, consectetur orci quis, tempus velit. Curabitur tempus ligula id sapien ornare rhoncus.
+
+Maecenas eu nibh et elit accumsan blandit a at erat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam commodo feugiat condimentum. In non ante ut mauris eleifend lobortis. Phasellus eleifend vitae metus et semper. Nam sit amet rhoncus diam. Nunc molestie libero sed erat volutpat consequat.
+
+Aenean eget tristique odio. Vivamus quam tellus, dignissim sed faucibus sed, sagittis ut elit. Maecenas in ullamcorper sem. In at ipsum accumsan lectus vestibulum commodo nec non leo. Aliquam at suscipit felis. Nunc non egestas tortor. Donec sit amet eleifend eros.
+
+Sed eleifend nisi velit, in egestas erat condimentum eu. Pellentesque a tincidunt urna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vestibulum dapibus mauris vitae elit auctor, id venenatis sem consectetur. Vivamus non leo pulvinar, blandit libero ut, vehicula arcu. Nullam elementum ex enim, at mattis massa pharetra eu. Nunc nulla magna, lobortis a magna sit amet, laoreet fermentum justo. Curabitur aliquam sollicitudin posuere. Aenean semper porta dictum. Mauris accumsan non nisi nec faucibus augue.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam in nibh eget ante viverra mattis. Etiam elit est, pharetra efficitur fermentum at, accumsan id eros. Aenean accumsan nisi facilisis tempor suscipit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam magna erat, tincidunt eu placerat at, molestie at sem. In sit amet cursus mauris. Etiam ullamcorper lacus nisi, et porta metus semper id. Nulla mauris nunc, pharetra at facilisis a, consequat id metus. Sed convallis ligula non felis vulputate finibus. Curabitur nisl nulla, pharetra in justo a, dapibus ultricies dui. Morbi ultricies sollicitudin purus, quis pellentesque leo rhoncus sed. Curabitur sed eros quis lacus vulputate pretium. Vestibulum vitae urna nec arcu vulputate efficitur. Cras venenatis sodales dolor non ullamcorper.
+
+Donec eu placerat magna. Vestibulum justo lacus, luctus ac luctus sit amet, dapibus at orci. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec eu tortor ac justo pharetra hendrerit. Phasellus ornare lacinia vestibulum. Maecenas diam orci, molestie rhoncus fringilla vitae, aliquam eu purus. Maecenas vehicula felis dui, vel dapibus odio lobortis quis. Cras a velit non nisl efficitur tempor.
+
+Suspendisse magna enim, ultrices et elementum ut, venenatis ut purus. Curabitur convallis vel tortor id rhoncus. Pellentesque varius arcu non imperdiet eleifend. Vestibulum fringilla aliquet vehicula. Nullam et lorem ullamcorper, tincidunt ante eget, egestas ex. Donec laoreet, justo id tincidunt egestas, lectus diam faucibus tortor, nec venenatis felis leo a urna. In at tortor semper augue finibus ornare et vitae erat. Praesent vulputate, dui sed pulvinar porta, justo tortor feugiat tellus, eget accumsan velit turpis at orci. Nulla vitae velit facilisis augue sagittis fringilla nec sagittis nunc.
+
+Duis vel elementum odio, id eleifend mauris. Nam in ultrices nulla. Quisque pharetra blandit risus eget lacinia. Nulla mattis mi felis, a ultrices nisi egestas vulputate. Donec a augue ac ex laoreet semper at porta ante. Vestibulum arcu ipsum, vehicula vel mollis lobortis, ullamcorper sed augue. Ut viverra faucibus nunc, sit amet sodales diam gravida sollicitudin. Fusce finibus quam sed ornare consequat. Suspendisse viverra ultricies dui in volutpat. Maecenas blandit erat in rhoncus placerat. Phasellus eu nisi rutrum, bibendum nunc eu, viverra ex. Praesent sollicitudin mi sit amet dictum convallis. Vivamus purus ligula, interdum at tincidunt sit amet, pellentesque ut elit. Aenean vitae ultrices ex. In facilisis lectus est, nec vulputate diam tristique vel. In gravida tincidunt ex et viverra.
+
+Pellentesque mi justo, dignissim a nisl quis, tempor dictum lacus. Nam tristique varius dolor tincidunt pharetra. Nullam iaculis est sed quam dignissim cursus. Duis sit amet vehicula nisi, sed consectetur velit. Nullam non tellus nec dolor venenatis porta quis at quam. In pharetra id orci sed faucibus. Cras et malesuada erat.
+
+Quisque fringilla commodo metus nec feugiat. Donec et est urna. Maecenas ut magna dui. Vivamus eu sem venenatis, porta mi at, efficitur tortor. In lacinia hendrerit elit, in faucibus nulla ultrices et. Mauris accumsan nec orci et vestibulum. Aliquam eget justo velit. Mauris fringilla ullamcorper enim, in elementum enim eleifend a. Nulla id libero ac arcu tristique ultrices. Maecenas mattis orci vitae nisl laoreet auctor.
+
+Quisque id aliquam orci. Nunc molestie vitae quam eu consectetur. Vivamus molestie venenatis est, nec lacinia odio faucibus eget. Etiam ornare eu leo eget posuere. Quisque elementum ligula at euismod placerat. Maecenas lobortis leo diam, vel egestas odio iaculis ac. Integer dapibus mi metus. Sed at eleifend ligula, ullamcorper vestibulum eros. Suspendisse dignissim metus in vulputate iaculis. Nam rhoncus felis sit amet velit scelerisque semper. Ut sed augue eget nulla laoreet scelerisque.
+
+Aenean convallis ipsum id turpis gravida, et elementum ante facilisis. Donec vitae arcu id mauris mollis hendrerit. Mauris imperdiet cursus nibh at laoreet. Sed sit amet enim magna. Mauris blandit nisi quis arcu sodales, eget consequat orci euismod. Curabitur id bibendum diam. Ut pharetra tellus nec enim tristique, id efficitur eros accumsan. Suspendisse potenti. Praesent vel porttitor risus. Nulla vitae ex nec ex hendrerit euismod non mattis arcu. Aenean eget velit massa. Pellentesque venenatis arcu mauris, sit amet scelerisque sem lobortis ornare. Vivamus auctor porta eros, eget blandit lorem semper non. Nunc sed nibh commodo, hendrerit nunc at, malesuada nisl. Aliquam pretium leo sed iaculis vehicula. Vivamus interdum porta augue.
+
+Suspendisse potenti. Aenean sodales vehicula erat, vel sollicitudin eros eleifend id. Suspendisse hendrerit malesuada est, imperdiet tristique ex aliquet ac. Vivamus ultricies placerat lorem, ac placerat lectus sollicitudin ac. Etiam consequat odio vel bibendum pretium. Integer elementum nisl magna. Nam et vehicula risus, sed mollis tortor. Ut in molestie turpis. Nam luctus, elit molestie varius luctus, lacus ligula ullamcorper elit, non interdum ipsum neque non nibh. Curabitur vulputate facilisis suscipit. Sed vitae augue eu ex luctus lacinia ac vitae quam. Quisque non nibh ex. Praesent gravida efficitur dui, a vulputate nulla ultrices vitae. Duis libero dolor, facilisis in tempus vitae, pharetra non libero. Sed urna leo, placerat quis neque at, interdum placerat odio. Interdum et malesuada fames ac ante ipsum primis in faucibus.
+
+Vivamus in hendrerit elit, quis egestas sem. Sed tempus dolor finibus massa ultrices, sed tristique quam semper. Pellentesque euismod molestie facilisis. Vivamus sit amet ultrices elit. Ut eleifend, libero eu molestie maximus, ipsum elit pulvinar tortor, et aliquet nulla orci eu est. Nullam pretium, ligula at faucibus gravida, velit mauris pulvinar felis, sit amet tincidunt magna dui ut quam. Phasellus porttitor eu nunc id maximus. Suspendisse volutpat suscipit porta.
+
+Integer dictum augue purus, sed cursus eros blandit id. Vestibulum non nibh viverra, molestie lectus eu, vestibulum justo. Nullam a libero non nibh dignissim posuere id vel orci. Nulla viverra lorem eget condimentum scelerisque. Donec porta nunc sed sapien pretium dapibus. In hac habitasse platea dictumst. Suspendisse sit amet ligula elementum, accumsan ipsum vel, imperdiet massa. Fusce scelerisque non erat ac bibendum. Pellentesque consequat vehicula euismod. Morbi sapien nisl, ultrices ut scelerisque consectetur, ornare et orci. Maecenas efficitur eros a venenatis rutrum. Aenean bibendum dui in enim luctus posuere. Donec placerat porta eros eu dignissim. Fusce nulla velit, sodales eget nibh gravida, tincidunt venenatis urna. Aenean condimentum, massa in fringilla lobortis, turpis felis lacinia metus, sit amet facilisis nisl quam aliquet diam. Praesent fringilla vitae arcu nec lobortis.
+
+In tincidunt nisi ac dictum cursus. Sed dolor purus, posuere vel dolor vel, semper tempor elit. Integer nec scelerisque tellus, sit amet dictum magna. Donec hendrerit aliquet libero, a varius velit dapibus quis. Donec lectus turpis, egestas vel vestibulum vitae, iaculis quis eros. Maecenas id convallis metus. Duis quis tellus iaculis, lobortis massa vitae, condimentum eros. Pellentesque scelerisque nisl id hendrerit tempor. Donec quam augue, maximus eu porta ut, venenatis a ante. Curabitur dictum et nibh sed auctor. Nam et consequat odio. In vitae magna a dui porta pellentesque quis id magna. Sed eu nunc bibendum, imperdiet nunc sit amet, cursus diam. Vivamus in odio vel nibh sollicitudin molestie. Morbi sit amet leo et odio congue pharetra. Aliquam quis suscipit orci.
+
+Donec at ornare orci. Suspendisse nec tellus elit. Nam erat urna, laoreet at elit sed, tristique interdum ligula. Nullam dapibus orci sed lorem convallis fringilla. Cras urna ipsum, tristique maximus nisl quis, auctor mattis quam. Donec finibus consectetur lectus et interdum. Aenean posuere lectus vel turpis auctor finibus. Praesent molestie lectus ipsum, et tristique quam porttitor ac. Suspendisse aliquam pretium tortor, id egestas erat. Nulla mollis, orci at semper vulputate, nisl est pharetra diam, sit amet vulputate diam augue a sem. Donec in mauris felis.
+
+Nunc eleifend at elit a volutpat. Integer semper quis quam at faucibus. Donec pretium purus vitae erat pretium posuere. Sed ac aliquet nulla. Nam ut sagittis mauris. Sed quis sagittis risus, id pretium urna. Nam sagittis elementum ornare. Aenean ligula sapien, congue eget mi quis, viverra commodo nibh. Suspendisse non iaculis magna, nec volutpat neque. Donec eu dapibus eros.
+
+Nam sit amet iaculis massa. Nullam vel laoreet tellus, id cursus tortor. In hac habitasse platea dictumst. Curabitur in urna risus. Proin dui sem, interdum accumsan cursus ut, dignissim in purus. Nunc vitae consequat arcu. Proin volutpat elementum quam in posuere. Pellentesque luctus arcu in ornare tempor. Cras est turpis, viverra vel consectetur ac, dictum a quam. Donec sagittis tortor sed volutpat accumsan. Curabitur a tellus vitae arcu pretium viverra vel in ligula. Pellentesque turpis augue, porta vitae quam id, fermentum congue leo. Sed nec fermentum turpis. Nulla vehicula vulputate sem eu consequat. In tincidunt nisi et mi maximus, non facilisis justo porttitor. Proin eu sapien aliquam, accumsan nunc non, pulvinar leo.
+
+Nam vitae commodo sem. Ut laoreet in quam in suscipit. Nullam at faucibus diam. Fusce ut purus at ex lobortis elementum vitae quis sapien. Nam tempus consectetur ex, sed luctus felis. Donec porttitor mi dui, non luctus quam consectetur eu. Ut a egestas diam. Etiam sodales, nisl vitae gravida pulvinar, libero est condimentum tellus, vitae ullamcorper tortor justo a urna. Maecenas ac velit accumsan, laoreet leo eget, elementum libero. Maecenas dictum tincidunt blandit. Proin sed bibendum urna. Phasellus fermentum tincidunt tempor. Mauris iaculis, mi ac fermentum interdum, nibh odio pellentesque nunc, vel scelerisque sapien sem id purus.
+
+Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas imperdiet sit amet lectus at hendrerit. Vivamus luctus, elit non lacinia hendrerit, risus velit finibus nulla, quis sagittis ipsum diam ut odio. Sed mauris sapien, vehicula efficitur gravida sed, gravida in lectus. Fusce eget consectetur turpis, in fermentum neque. Nullam turpis turpis, feugiat a accumsan in, euismod a augue. Vestibulum nec neque libero. Phasellus eget efficitur turpis, fermentum molestie nunc. Sed consequat elit urna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
+
+Nunc egestas consequat blandit. Donec quis porta sapien. Sed augue nunc, efficitur vitae tellus sed, finibus bibendum sem. Fusce id sem quis quam pharetra ultrices. Phasellus non convallis velit. Quisque erat tellus, pretium eget porta in, ornare a arcu. Aenean nec lectus lorem. Suspendisse dolor lectus, ullamcorper ornare lorem a, consequat lobortis elit. Nunc dignissim est nec gravida facilisis. Proin faucibus erat vel eros volutpat, in vulputate neque sodales.
+
+Nunc vitae imperdiet ipsum, faucibus vehicula magna. Nulla nec nisl sapien. Curabitur et dui eget tortor efficitur accumsan. Aenean in pellentesque erat. Nam condimentum neque pulvinar, aliquam nisl eu, mollis lorem. Integer rutrum arcu eget felis semper euismod. Quisque vestibulum vel diam a tempor. Aenean mollis, tellus sit amet pretium pulvinar, nulla dolor ornare ligula, eget dignissim orci tortor ut sapien. Nam ut ipsum id lectus venenatis tempus vel non ex. Suspendisse blandit vitae nunc vitae porta. Suspendisse tincidunt est sit amet ultricies consectetur. Nulla fermentum hendrerit ex, vehicula rhoncus arcu lobortis ut. Vestibulum fermentum ornare diam at pellentesque. Praesent nunc lorem, porta et magna nec, sodales commodo justo. Duis aliquam sapien et rutrum tempus. Vestibulum malesuada felis eu ligula posuere luctus.
+
+Maecenas lacinia, lectus eget rhoncus aliquam, tortor est gravida sapien, vel aliquam arcu erat et magna. Praesent fringilla leo eget neque posuere imperdiet. In porttitor elit non enim gravida euismod. Aliquam tempus, orci at interdum dapibus, mauris lacus egestas sapien, ac ullamcorper ex nibh sed orci. Quisque iaculis enim et lectus egestas, malesuada posuere lectus interdum. Sed dignissim neque vel turpis dictum ornare. Vestibulum suscipit consequat maximus.
+
+Ut et ante sit amet leo rutrum volutpat. Sed malesuada quis sapien et ornare. Aliquam ac ex enim. Curabitur vel quam et orci posuere feugiat. Pellentesque nec metus eget sapien eleifend tincidunt non sit amet arcu. Cras posuere metus eget risus varius fermentum. Nullam orci eros, efficitur nec sapien nec, pretium laoreet erat. Nam gravida purus mauris, ac viverra orci hendrerit sed. Aenean ligula massa, posuere id faucibus vitae, malesuada quis augue. Morbi consectetur mattis mi, quis sodales diam bibendum eget. Aliquam sagittis neque at feugiat posuere. Donec gravida lectus a lectus fringilla tincidunt. Vivamus volutpat dui et turpis condimentum, ut tincidunt tortor lacinia. Ut laoreet, ante in pellentesque sodales, elit mauris scelerisque dui, quis tincidunt quam massa ac enim. Nulla porta porta sapien vel sollicitudin.
+
+Phasellus sed lectus posuere, mollis ante non, feugiat odio. Aenean a quam id mi ornare dapibus. Donec venenatis ipsum non velit accumsan, id elementum dolor imperdiet. Phasellus lacinia erat diam, sit amet convallis lectus ornare in. Curabitur lorem ligula, maximus eu varius quis, auctor quis odio. Etiam in orci porttitor, sodales ipsum at, rhoncus turpis. Nulla eget luctus nisi. Duis convallis est eget ligula fringilla viverra. Duis nec sapien quis dui luctus ornare sit amet quis erat. Quisque nec justo dui.
+
+Sed eleifend, tellus quis laoreet rhoncus, leo turpis imperdiet turpis, pretium varius odio tortor et leo. Morbi ut mi fringilla, porttitor sem ac, accumsan ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum cursus dolor accumsan dolor aliquet dignissim. Duis sed feugiat erat. Donec sed arcu accumsan, ornare nisl eget, lobortis nibh. Praesent pulvinar quis justo et hendrerit.
+
+Sed velit nibh, efficitur ut leo sed, eleifend iaculis nisl. Mauris ac diam euismod, luctus enim maximus, tincidunt sem. Ut tempus magna vitae blandit bibendum. Sed sapien tortor, ultrices et justo vel, pharetra faucibus dui. Vivamus et vestibulum arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Mauris tincidunt suscipit risus, vitae varius felis commodo in. Nullam semper tortor dolor, sit amet pharetra odio interdum hendrerit. Pellentesque sed justo eros. Cras quam purus, eleifend id tellus molestie, eleifend finibus lorem. Donec a volutpat libero, at vehicula tellus. Vivamus tellus orci, pharetra in nisi vitae, tincidunt dapibus nunc.
+
+Suspendisse ultricies sem laoreet quam molestie ullamcorper. Sed auctor sodales metus, eget convallis eros ultrices quis. Duis rutrum mi a tortor iaculis posuere. Suspendisse potenti. Pellentesque dictum faucibus dui a vestibulum. Donec elit nisl, aliquet at dolor non, viverra dignissim felis. Donec mi elit, condimentum sit amet magna id, efficitur sodales arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque est elit, porttitor eget bibendum nec, auctor nec nulla. Pellentesque dignissim nisl vel orci commodo, ut ullamcorper justo viverra.
+
+Suspendisse pharetra gravida turpis sit amet efficitur. Nulla mattis tortor eget pharetra ultrices. Ut a turpis maximus, pharetra justo non, tempor quam. Nam et volutpat lectus. Vestibulum congue turpis augue, quis eleifend nulla euismod in. Vestibulum sed erat tempus, porttitor diam vel, elementum metus. Aenean facilisis molestie ante, sit amet ornare lacus mollis sed. Maecenas rutrum urna nec ex malesuada consequat. Nunc interdum pellentesque nisl sed viverra. Nam nec fermentum ipsum. Nulla facilisi. Maecenas congue dolor erat, a fermentum enim congue vitae. Integer metus libero, feugiat at eleifend eu, iaculis nec leo. Praesent eleifend convallis leo, eu posuere urna elementum eu.
+
+Aliquam dapibus dolor vel urna luctus venenatis. Suspendisse potenti. Donec vitae tellus nisi. Pellentesque vel neque dignissim, ornare tellus sed, sodales metus. Aliquam vitae maximus tortor. Nullam mattis, odio id porttitor euismod, est leo aliquet massa, bibendum pulvinar justo orci a magna. Morbi ut nisl congue, porttitor erat non, gravida turpis. In nulla risus, ullamcorper quis suscipit vel, tristique ut nulla. In malesuada odio augue, ac hendrerit nunc mattis a. Nam in quam ut elit ullamcorper mattis. Sed fringilla tempus felis, id pretium tortor varius non. Aenean quis sem quis risus mattis posuere vel quis nibh.
+
+Sed pulvinar commodo dui sit amet malesuada. Quisque porta tellus placerat congue efficitur. Cras id blandit enim. Praesent a urna felis. Aliquam ornare, nisl eget iaculis tempor, ligula mi vehicula dolor, ut eleifend massa massa vel est. Fusce venenatis laoreet lobortis. Proin tempus aliquet nunc ut porttitor. In est mauris, blandit eu mattis vitae, aliquam a orci. Cras vitae nulla nec ex cursus blandit. Aliquam fermentum, erat in aliquet dictum, metus urna fermentum quam, non varius magna lectus non urna.
+
+Donec faucibus nisl nunc. Integer rutrum dui enim, malesuada semper turpis pulvinar eget. Fusce consectetur ipsum tellus, sed maximus lorem auctor in. Morbi nec est in quam ultricies hendrerit. Sed aliquam sollicitudin elementum. Aenean aliquam ex sit amet dignissim venenatis. Duis malesuada leo nisi, id accumsan turpis pretium id. Sed ornare magna non pharetra pharetra. Ut auctor dolor neque, nec bibendum odio viverra in. Nulla convallis interdum condimentum. Proin vestibulum turpis in lorem ultrices, bibendum tristique ligula faucibus. In tincidunt auctor sem, vitae fringilla neque pulvinar eu. Etiam commodo pellentesque enim. Phasellus feugiat non sapien eget sollicitudin. Etiam consequat efficitur lacus vel maximus. Suspendisse vitae elementum diam.
+
+Mauris urna velit, efficitur at viverra at, interdum a velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean bibendum sagittis massa in interdum. Mauris facilisis dui eget ipsum euismod ultrices. Donec sit amet lorem iaculis, condimentum velit quis, lacinia justo. Integer faucibus metus sed eros semper, in congue tortor venenatis. Proin tincidunt maximus enim, accumsan facilisis tellus gravida eu. Phasellus interdum aliquam ante, sit amet rhoncus nisl ornare at. Suspendisse libero eros, cursus quis fermentum nec, tempor eget lectus. Aenean ullamcorper augue lacus, non iaculis dui rutrum id. Aliquam erat volutpat.
+
+Morbi hendrerit fermentum sodales. Proin rutrum congue auctor. Mauris pellentesque elit non velit condimentum tincidunt a sit amet velit. Etiam accumsan ante id neque commodo vulputate. Aenean nec mattis neque. Aliquam tempor urna quis nisl convallis congue. Praesent vitae porttitor ante. Mauris mattis vestibulum ante, nec auctor augue. Praesent sem leo, accumsan eu fermentum egestas, iaculis ac nulla.
+
+Etiam vel nisi congue, varius neque id, volutpat quam. Fusce placerat arcu hendrerit orci condimentum vehicula. Integer sem ex, facilisis et lacinia a, condimentum at ante. Morbi condimentum diam tellus, non lobortis arcu pellentesque sit amet. Phasellus imperdiet augue eget sollicitudin mollis. Vivamus sollicitudin arcu aliquam lectus tristique, in consequat diam egestas. Suspendisse aliquet non velit id feugiat. Sed eu est fringilla, gravida nulla ac, dignissim tortor. Phasellus pellentesque nisl non venenatis sagittis. Etiam facilisis nulla quis lorem scelerisque vehicula id at ex. Duis in risus enim. In eu vulputate massa, vel dignissim odio. Praesent ut mi tellus. In hac habitasse platea dictumst.
+
+Nunc malesuada turpis in fermentum lobortis. Donec blandit eu orci non laoreet. Suspendisse posuere blandit tortor, in accumsan velit cursus in. Integer suscipit justo nulla, in viverra orci suscipit et. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum a pulvinar lacus. Vestibulum mattis nisi vel nunc convallis maximus. Fusce aliquam, erat in volutpat gravida, elit odio feugiat ante, nec varius enim leo eget nisl. Donec sit amet ligula lobortis, sollicitudin dolor quis, blandit augue. Duis at interdum sem. Nullam eleifend ligula urna, vitae sollicitudin purus cursus nec.
+
+In commodo risus eu justo hendrerit, ut posuere mi eleifend. Suspendisse sollicitudin odio sem. Vestibulum at dapibus dui, vel dictum nisi. In hac habitasse platea dictumst. Sed ac pharetra ex. Ut ultrices augue ut vulputate condimentum. Phasellus convallis arcu tortor, ac tincidunt justo cursus vitae. Mauris dignissim dapibus imperdiet. Nullam id quam eget mauris cursus molestie finibus eu enim. Fusce laoreet orci eu nunc fermentum tincidunt. Pellentesque vitae ex ac nunc porta mattis sed ut ligula. Phasellus erat dui, consequat et lacinia vel, blandit nec dui. Donec ipsum magna, rhoncus ac viverra vitae, feugiat vel ligula.
+
+Cras ut nisl sed elit dictum semper a at magna. Aliquam laoreet viverra velit vel lobortis. Nam tempor lorem sit amet purus tincidunt accumsan. Vestibulum et vestibulum ligula. Donec sit amet neque faucibus leo rutrum semper. Maecenas scelerisque, lacus et lobortis congue, purus quam euismod risus, et mattis orci nisl eget est. In hac habitasse platea dictumst. Pellentesque eros velit, sollicitudin quis ante vel, blandit maximus mi. Suspendisse at eros id quam vulputate ornare. Duis placerat tellus vel odio ultrices, ac feugiat enim placerat. Vestibulum ut massa mattis, commodo orci euismod, cursus lacus. Suspendisse potenti. Sed venenatis cursus neque, at lacinia erat ornare et. Sed rutrum, dui at porttitor hendrerit, lacus magna fringilla quam, id mollis elit leo ut ante. Praesent vel diam sed urna mollis laoreet eget ut risus.
+
+Mauris varius odio lectus, sit amet consequat nulla sollicitudin sed. Suspendisse commodo rhoncus enim vitae pellentesque. Aliquam vulputate sollicitudin aliquet. Mauris interdum interdum orci, non varius sem ornare ut. Sed vel nibh nunc. Duis tincidunt quam quis lectus egestas, eu ultricies ante posuere. Aenean in mauris eros. Suspendisse potenti. Vivamus sit amet augue at velit accumsan fermentum. Phasellus vel dui sit amet felis convallis sodales.
+
+Nunc mattis vitae sapien ut dignissim. Nam fermentum sit amet massa eu accumsan. In ut ipsum sit amet ante pellentesque accumsan. Nulla egestas eros eget lacus rhoncus pharetra. Nam pellentesque laoreet ex in lobortis. Vivamus congue tincidunt molestie. Integer vel turpis augue. Cras vel molestie quam. Etiam vel mauris ut tellus finibus consequat.
+
+Curabitur velit erat, vestibulum blandit massa a, aliquam elementum tellus. Pellentesque id nisl tempor lorem condimentum dapibus. Quisque ut lorem at orci elementum dapibus quis ut enim. Praesent venenatis congue arcu eu sagittis. Nunc nunc massa, posuere ac gravida id, scelerisque nec velit. Suspendisse non lacus a orci dapibus congue. Sed leo velit, facilisis sed egestas ut, vehicula at turpis. Praesent a finibus felis. Quisque est mi, pellentesque sit amet varius eu, gravida id est.
+
+Donec auctor gravida urna ac suscipit. Etiam placerat ipsum vitae ante congue, at fringilla lectus ullamcorper. Donec viverra lacus ut erat posuere, dignissim porta purus tempor. Duis eget enim quis diam vehicula pulvinar. Donec tempus eros velit, sit amet pharetra ligula placerat in. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sit amet pretium tellus, non dictum ligula. Nullam a ex purus. Vestibulum id ex rhoncus, pretium eros vel, consequat tellus. Vivamus lacinia dolor nec ipsum aliquam, euismod fermentum sem efficitur. Nulla facilisi. Pellentesque pharetra lacinia augue, et eleifend lorem aliquet eu. Ut ut porta ante. Duis ut auctor nisi, id porttitor erat. Proin sollicitudin sem quis justo sodales aliquam. Nulla pharetra gravida arcu vel tempus.
+
+Maecenas nec imperdiet nulla, vitae fringilla diam. Mauris maximus aliquet tellus at congue. Aliquam in dictum elit. Sed pretium mattis lectus, non pellentesque enim dignissim vel. Sed quis elementum diam, a porttitor enim. Cras cursus eros nisl. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ornare sapien vel diam vestibulum, at commodo metus lobortis. Sed euismod iaculis scelerisque. Pellentesque venenatis malesuada dolor, at tempus eros venenatis sit amet. Fusce a massa non libero blandit suscipit.
+
+Nulla facilisi. Sed nec leo nisl. Proin condimentum nunc at risus semper, in laoreet dui congue. Integer in dolor vitae ex maximus porttitor. In efficitur vulputate metus, ac egestas diam pharetra ac. Sed tristique tempus ligula dignissim convallis. Ut tincidunt laoreet fringilla. Praesent nunc est, lacinia tristique odio in, varius rhoncus ipsum. Vivamus bibendum justo at metus ullamcorper imperdiet. Quisque elit nibh, rhoncus a placerat eget, vehicula quis ante.
+
+Morbi fermentum turpis enim, eu interdum dui interdum sit amet. Sed vulputate lacus nec ligula gravida euismod. Duis in nisl fringilla, sollicitudin diam ac, laoreet tortor. Sed eget porttitor augue. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed eu enim convallis augue vulputate convallis. Praesent laoreet, leo at ornare luctus, nisi felis semper sapien, sit amet sodales augue mauris eu lorem. Fusce ornare volutpat malesuada. Curabitur vehicula, eros id fringilla placerat, tellus elit venenatis lorem, ac imperdiet purus ex blandit felis. Nunc suscipit elementum risus ac dictum. Aliquam bibendum dignissim ipsum, sit amet posuere sem viverra ut. Vestibulum egestas in ex ac volutpat.
+
+Donec ut faucibus velit, nec suscipit metus. Nullam dui ligula, commodo eget est venenatis, ullamcorper porttitor lectus. Suspendisse dictum, metus vitae commodo ultricies, enim quam pretium enim, a efficitur tortor purus sed ipsum. Nam sit amet lacus vel elit consectetur ultrices. Vestibulum ac nibh in metus porttitor vestibulum. In blandit et est non efficitur. Aenean vestibulum tortor sit amet mattis semper. Praesent sit amet turpis ac neque malesuada tincidunt nec nec urna. Mauris posuere elit nisl, ac ullamcorper nisi pulvinar in. Nulla ac elit in neque ullamcorper facilisis sed et dui.
+
+Quisque molestie euismod dui, non scelerisque arcu dictum a. Donec eu nulla nisl. Aliquam neque orci, ultrices in nunc vitae, sollicitudin eleifend augue. Etiam at mattis velit, a efficitur dui. Nam bibendum enim non elit tristique aliquet. Vestibulum eget nibh lacus. Pellentesque id sapien dui. Nullam urna leo, faucibus et efficitur vel, ullamcorper iaculis mi. Donec sit amet bibendum justo, id dapibus sem. Pellentesque dignissim varius tellus nec egestas. Praesent eu orci vel ipsum pharetra maximus. Cras nisl ligula, sollicitudin in ligula vel, posuere sagittis eros. Phasellus porta tristique mauris vel eleifend. Mauris sit amet volutpat ipsum, sed vestibulum orci.
+
+Ut rutrum augue quis rhoncus tincidunt. Aenean sollicitudin lacus at erat varius ullamcorper. Integer vitae orci vel nisi vulputate cursus eget nec ex. Mauris elementum, augue ac accumsan convallis, libero leo porta ante, sit amet elementum felis ligula non enim. Ut venenatis semper posuere. Vestibulum nec nisl nisi. Ut a sapien ac orci finibus dictum sed at ex. Phasellus ac lorem nisl. Quisque vitae tempor lacus. Vestibulum in mauris diam. Proin mattis ligula vitae ipsum bibendum, at dapibus nunc placerat. Nam iaculis justo in accumsan tristique.
+
+Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris pretium velit et tristique pellentesque. Nunc in sapien a purus congue rutrum. Nam placerat risus in ante rutrum rutrum. In in ligula magna. Duis orci ante, vehicula elementum consectetur vitae, lobortis vitae arcu. Ut feugiat tempus metus quis sollicitudin. Etiam cursus venenatis augue at fermentum.
+
+Vestibulum id vehicula massa. Proin ut ligula et sapien placerat tristique non nec nibh. Etiam non lacus placerat, molestie ex eu, venenatis elit. Sed posuere, ante et ullamcorper luctus, elit lectus blandit tortor, nec consequat massa elit a tortor. Fusce urna felis, porttitor at ultrices vel, eleifend porta ipsum. Pellentesque nisl nibh, molestie sit amet sem eu, dapibus pharetra nulla. Phasellus viverra augue eu augue volutpat dignissim. Integer bibendum faucibus varius. Curabitur non turpis purus.
+
+Sed pretium eros nisl, sed ullamcorper magna faucibus quis. Etiam ornare euismod tellus, vitae accumsan eros bibendum ut. Morbi a ex sed risus faucibus rutrum et ut urna. Nullam non tortor commodo, facilisis massa non, tristique metus. Curabitur placerat, arcu in egestas ullamcorper, nisl nisl luctus felis, ac dapibus erat velit sed erat. Proin sagittis felis vitae sem posuere semper. Vivamus fermentum eu nisi ac facilisis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque pellentesque lacinia ex tempus lacinia. Aliquam erat volutpat. Nam aliquet mattis risus non pretium. Suspendisse potenti.
+
+Suspendisse et sapien ornare, elementum erat vel, ultrices nisi. Curabitur interdum dignissim tincidunt. Cras eget est a velit consectetur finibus et sed nisl. Curabitur vestibulum semper posuere. Aliquam porta diam commodo nulla tempus imperdiet. Sed id dictum neque. Ut sit amet risus aliquet, dignissim velit sed, tristique ipsum. Nam a sapien id magna commodo tincidunt quis ac tellus. Nunc nec pellentesque orci. In justo purus, vulputate quis urna a, fringilla blandit sem. Cras porttitor quam vitae metus vehicula faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut eleifend orci lectus, vitae semper eros hendrerit id. Fusce nec tellus condimentum, vehicula elit quis, gravida erat. Maecenas volutpat interdum velit id vestibulum.
+
+Pellentesque id metus metus. Nullam ac metus non nisi facilisis aliquet quis a sem. Morbi cursus consectetur aliquam. Morbi id sapien nibh. Etiam tempus tempor tempor. Nam scelerisque condimentum purus. Proin nec cursus eros, in condimentum dolor. Nam in sagittis urna. Ut eget ornare erat. Vivamus nec elit ut sapien tristique aliquet a nec urna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas varius pellentesque diam.
+
+Ut eget libero iaculis urna porta iaculis vel ac eros. Sed sed mi et libero porta consequat a in libero. Sed in imperdiet ipsum, sit amet ultricies dui. Curabitur sit amet consectetur eros. Praesent nunc tellus, feugiat ac laoreet consectetur, accumsan nec magna. Praesent at elementum orci. Donec dapibus venenatis libero, id tincidunt libero euismod ac.
+
+Aenean sit amet ex placerat, molestie sapien a, volutpat turpis. Vivamus elementum lacinia nisi a convallis. Donec a sagittis turpis. Curabitur pulvinar laoreet dolor id consequat. Aliquam aliquam feugiat magna, vitae sagittis lorem mattis ut. Donec sed auctor nulla. Ut convallis, neque vitae faucibus efficitur, nisi justo pharetra odio, vitae tristique purus lorem et nisi. Quisque eleifend aliquam arcu nec maximus. Nunc mauris elit, finibus nec gravida non, maximus nec nibh. Sed eu ipsum in arcu gravida maximus. Maecenas massa dolor, ullamcorper eget odio eu, congue ornare leo. Suspendisse venenatis ultricies imperdiet. Nam finibus orci vitae sagittis finibus. Pellentesque sit amet dapibus diam. Nam eu nunc elit.
+
+Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam euismod turpis nec urna lobortis, ut malesuada ex suscipit. Fusce sed viverra risus. Pellentesque tristique nulla pulvinar tincidunt accumsan. Nullam vitae nibh imperdiet erat rutrum pellentesque et sit amet quam. Aenean laoreet ultricies hendrerit. Duis elementum tellus a feugiat vulputate. Aliquam aliquam enim placerat dolor viverra, non suscipit lorem ultrices.
+
+Proin interdum vitae lorem quis viverra. Praesent nec tempor dolor, vitae sagittis turpis. Etiam sit amet imperdiet sapien, ac laoreet arcu. Proin aliquam, risus nec maximus dapibus, dui diam elementum dolor, vitae tempor augue lorem vel justo. Aenean ac egestas dolor. Ut aliquet, felis at fringilla venenatis, leo nisl ullamcorper ex, vitae pellentesque turpis orci quis lectus. Nullam vitae suscipit metus. Integer congue, ante in lacinia rhoncus, erat lorem interdum elit, egestas suscipit lectus nunc non orci. Nunc vel viverra quam. Mauris sit amet sodales tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam quis sollicitudin libero. In nec venenatis orci.
+
+Integer non quam fringilla, tristique nulla id, gravida arcu. Aenean scelerisque lacinia magna. Praesent nunc sem, lobortis non convallis rhoncus, rutrum vitae ante. Sed et orci ut erat viverra bibendum a et lectus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce sit amet eros eget dolor pharetra vestibulum. Nullam vestibulum, massa dictum finibus egestas, orci nulla pulvinar sem, nec tempor libero lacus eu ante. Nam lacus erat, gravida eu placerat sit amet, facilisis sed urna. Suspendisse efficitur felis non ornare dictum. Nam sit amet nulla enim. Nulla eget scelerisque est. Suspendisse lacinia velit arcu, id lobortis felis facilisis in.
+
+Suspendisse potenti. Nulla porttitor metus ut nunc dictum tristique. Cras sit amet tortor eget ligula tristique efficitur. Ut at nisi id purus imperdiet laoreet. Sed sit amet malesuada urna. In nunc dolor, luctus ac condimentum ut, dapibus vel metus. Suspendisse pretium urna eget libero convallis vestibulum. Integer ut mauris hendrerit ex posuere euismod sed sed odio. Nulla egestas libero sit amet magna venenatis faucibus. Pellentesque semper vestibulum elit, et pretium felis scelerisque non. Suspendisse aliquet leo arcu, sed dapibus ex semper non. Donec lacinia dictum dignissim. Maecenas ipsum nunc, aliquet eget consectetur sit amet, aliquet vitae odio.
+
+Proin consectetur blandit feugiat. Nulla ac dictum quam. Vivamus suscipit scelerisque ipsum, vitae consequat neque sagittis id. Donec eu augue hendrerit, varius ipsum at, cursus massa. Morbi id augue id ipsum porttitor mollis. Phasellus nec libero eu arcu finibus dapibus. Nullam nec pharetra ante. Aenean sit amet urna eget justo tempus pharetra ut nec mi. Pellentesque viverra, ligula nec elementum ornare, ante elit eleifend enim, nec dignissim ligula elit in nibh. Vestibulum facilisis, felis eu condimentum dapibus, ante risus tincidunt urna, ut posuere dui augue ut ante.
+
+Nam arcu lacus, accumsan ac dolor in, egestas euismod est. Sed consectetur mauris et enim tincidunt semper. Donec sit amet pellentesque diam. Fusce viverra arcu a placerat fermentum. Nullam euismod dui eget egestas ultrices. Duis euismod viverra tortor eget eleifend. Pellentesque vitae neque dapibus, bibendum mi eu, auctor velit.
+
+Pellentesque congue consectetur turpis, eget auctor dui suscipit vel. Aliquam a sollicitudin turpis. Praesent nec blandit tortor. Suspendisse non nunc at urna tincidunt elementum. Integer eu elit nec urna maximus blandit quis at tortor. Nulla laoreet elit a purus tempus, et tincidunt lorem sagittis. Aenean semper erat eu neque hendrerit ornare. Cras posuere lorem nec orci vulputate finibus. Fusce tempor ex ac lacus gravida venenatis.
+
+Phasellus laoreet, libero vel fermentum euismod, sem diam accumsan quam, vitae gravida arcu est at sem. In bibendum, felis at viverra congue, felis nunc fringilla libero, ut scelerisque erat massa ut neque. Suspendisse potenti. Cras faucibus dolor vel tortor blandit, quis imperdiet magna semper. Nullam ut urna dapibus, vulputate est a, hendrerit purus. Vivamus vestibulum nisi a tempus placerat. Morbi vitae ultricies lacus.
+
+Nunc vel efficitur urna. Fusce bibendum suscipit mauris, quis imperdiet nisl bibendum non. Nam sed nisi imperdiet, pellentesque sem sed, pellentesque diam. Praesent luctus feugiat odio, eget fermentum lectus ullamcorper non. Phasellus pulvinar lectus sed ligula semper lobortis. Pellentesque fermentum ultricies fermentum. Quisque id turpis vel orci rutrum rhoncus id vel metus. Vivamus ex leo, accumsan eu luctus sit amet, tincidunt vitae erat. Sed eu mollis odio, ut ultricies lacus. Duis enim odio, pellentesque non velit vel, aliquam blandit erat. Mauris feugiat felis fermentum purus blandit, id rhoncus lorem tempus. Integer cursus, nunc vitae laoreet commodo, nunc lacus venenatis orci, quis eleifend risus est nec quam. Nulla tincidunt nunc ac purus tincidunt, eu molestie ipsum sollicitudin.
+
+Vestibulum ac varius velit, non suscipit nulla. Vestibulum a sagittis tortor. Suspendisse vestibulum felis quam, eget blandit nulla dictum vel. Praesent eu tellus ut lacus facilisis ultrices. Etiam fringilla nulla nec leo viverra faucibus. Sed nec sollicitudin nisl. Aenean libero massa, ornare sed elit ut, interdum fermentum arcu.
+
+Aliquam maximus diam et elit dapibus, eget condimentum sapien finibus. Etiam gravida nunc dapibus facilisis feugiat. Sed quis massa ligula. Nunc eleifend dolor lacus, at dapibus nisi vulputate eget. Etiam vel euismod urna, quis molestie nibh. Vestibulum bibendum erat non dictum sollicitudin. Suspendisse sed placerat lacus. Cras sollicitudin quam justo, a condimentum urna feugiat a. Quisque mauris libero, ultricies at ligula a, facilisis euismod ante.
+
+Morbi hendrerit maximus sapien ut auctor. Nullam nisi erat, aliquam ac metus eu, fermentum laoreet augue. Nam ultricies mi at vulputate laoreet. In ipsum est, blandit sit amet lorem id, egestas aliquam odio. Praesent venenatis lobortis mi. Aenean eu lacus consequat, mattis enim et, pellentesque leo. Duis convallis facilisis placerat. Donec porta, enim eget placerat congue, nisi augue faucibus odio, et fringilla purus elit vitae felis.
+
+Nulla et tellus a libero pellentesque eleifend vitae mattis nisi. Nunc placerat neque et sapien lobortis, aliquet pharetra nunc vulputate. Suspendisse potenti. Etiam ullamcorper lacinia varius. Suspendisse sit amet malesuada magna. Nam molestie mi nec diam tempus laoreet. Suspendisse urna tellus, scelerisque vitae purus et, dapibus fermentum felis.
+
+Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec scelerisque eget neque sed hendrerit. Donec at ligula augue. Donec vulputate massa nunc, a feugiat nunc elementum ut. Donec pulvinar libero sit amet ante faucibus sagittis. Mauris quis diam ultrices, tristique sapien nec, tempus urna. Morbi hendrerit odio sit amet leo lacinia, non egestas diam condimentum. Suspendisse efficitur sapien eget elit euismod tristique. Duis posuere vestibulum risus id sodales. Ut eget mi in urna rutrum molestie non nec dolor. Curabitur sollicitudin pharetra lacus, in sodales tortor tempor vitae. Nullam rhoncus arcu vel euismod varius.
+
+Aenean malesuada, purus quis volutpat sollicitudin, lectus risus lacinia mi, a facilisis ante lacus a dolor. Aenean vel aliquam tortor. Vivamus ornare, tellus at malesuada suscipit, quam dolor egestas erat, id convallis enim augue a enim. Aenean ultricies sodales placerat. Vivamus vel erat ac mi vulputate commodo nec eget urna. Suspendisse potenti. Mauris quis dapibus est, id tristique libero.
+
+Suspendisse ex diam, imperdiet quis dui id, interdum sodales elit. Maecenas at nunc ligula. Etiam imperdiet convallis magna sit amet tristique. Proin hendrerit laoreet magna, eget malesuada elit rhoncus et. Curabitur eget odio imperdiet, molestie sapien pretium, efficitur turpis. Aliquam sed congue arcu. Pellentesque vitae mauris id neque pulvinar tempor. Donec lobortis tellus id gravida dictum. Nulla et varius ex. Vestibulum pharetra eu quam dapibus finibus. Nullam accumsan sagittis turpis. Mauris fermentum orci et tortor tempus, ac tristique odio sollicitudin. Duis nec elit et magna imperdiet molestie eget vel ante.
+
+Suspendisse tempus augue nec massa molestie aliquam. Pellentesque vestibulum, erat sit amet fringilla fermentum, sapien lorem tempor felis, at efficitur augue erat quis nisi. Proin nec felis sagittis, sollicitudin turpis eu, fringilla leo. Vestibulum at augue nec dui vestibulum aliquam a at metus. Duis ullamcorper eleifend bibendum. Maecenas viverra mauris lacus, et consequat nisl pharetra eu. Praesent rutrum diam eu mi aliquet, non pellentesque est suscipit. Vestibulum massa leo, blandit eget mi at, cursus faucibus nunc. Praesent nec bibendum libero, vitae cursus libero. Sed consequat vitae eros nec maximus.
+
+Pellentesque et tortor eget lectus feugiat venenatis. Integer ornare nisl quam, nec imperdiet justo finibus at. Morbi malesuada, ante sit amet rutrum tempor, risus lorem tristique urna, egestas varius purus ex ut sem. Etiam sit amet feugiat sapien. Etiam quis risus commodo, eleifend velit quis, tincidunt enim. Mauris fermentum lacinia velit quis efficitur. Nunc sit amet lacus sit amet urna viverra feugiat. Nullam sagittis rhoncus suscipit. Aliquam eu sem ligula. Sed sodales risus et tortor lacinia tristique. Nulla massa augue, malesuada sit amet euismod ac, euismod placerat nulla. Sed lobortis ex nec lacus facilisis, nec semper mauris ultrices. Quisque ornare non felis vitae pellentesque. Donec mattis ut magna sed imperdiet. Integer viverra tempus feugiat.
+
+Donec laoreet aliquam imperdiet. Fusce justo neque, dictum vitae fringilla vitae, euismod sed augue. Fusce sodales, lectus a congue bibendum, ante eros pharetra tortor, eu sollicitudin libero ipsum sit amet felis. Curabitur sed condimentum quam, in iaculis ante. Ut feugiat dictum odio, vitae hendrerit lacus volutpat sed. Sed scelerisque et metus nec gravida. Mauris mattis porttitor magna, ut maximus justo sagittis vitae. Donec at metus ut leo gravida vehicula in sed diam. Vestibulum dignissim suscipit sagittis. Nam varius et arcu sit amet lacinia. Sed eget elit rhoncus, elementum dolor a, vehicula orci. Nam vitae tellus sapien. Phasellus massa lorem, commodo quis placerat in, semper faucibus tortor.
+
+Vivamus id dolor mi. Curabitur sagittis posuere quam in mollis. Phasellus finibus ipsum vel elit tincidunt, a bibendum ligula vulputate. Suspendisse quis purus nisl. Integer mi sem, posuere quis nisi a, consequat consequat magna. Vestibulum bibendum mauris in risus auctor fringilla vel at lacus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus venenatis mauris at mattis eleifend. Donec tempus ipsum ac nisl convallis ultrices.
+
+Nullam eu nibh ut erat vehicula accumsan. Vivamus vitae faucibus libero. In in luctus odio. Nulla nec enim pharetra, fermentum erat in, tempor turpis. Sed ac magna suscipit, dignissim elit id, faucibus libero. Maecenas placerat in dolor et faucibus. Sed maximus purus dolor, non egestas massa rutrum non. Nunc ut rhoncus lacus. Sed sit amet dolor eu sapien sagittis molestie. Aenean ipsum erat, rutrum a diam et, varius porttitor ligula. Phasellus fermentum fermentum felis.
+
+Phasellus odio massa, lacinia ac hendrerit vestibulum, placerat sit amet erat. Praesent eget justo scelerisque, congue est in, pharetra mi. Etiam blandit turpis dui, a faucibus ipsum viverra vitae. Praesent sed scelerisque arcu. Cras nec venenatis ipsum. In et tempus metus. Pellentesque cursus quis nibh quis porttitor. Duis leo lacus, pretium eget rutrum eu, tincidunt lobortis tellus. Cras in erat tristique arcu faucibus luctus sit amet tempus erat. Nullam placerat, est a interdum iaculis, purus justo convallis arcu, at mattis erat sem tempor velit. Curabitur sapien sapien, tempor eget sodales vitae, blandit ac libero. Proin eget sem et arcu malesuada convallis non a est.
+
+Ut id sagittis urna. Morbi est mauris, molestie quis magna ut, convallis porta justo. Etiam in vulputate sem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nullam consectetur enim nisl, sit amet pulvinar turpis elementum at. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum convallis cursus libero vel feugiat.
+
+Curabitur vel scelerisque metus. Etiam aliquet faucibus quam, vel aliquet est mattis quis. Pellentesque pulvinar sodales augue, a dignissim sem tristique vitae. Pellentesque dolor quam, pharetra vitae rhoncus ut, blandit at elit. Sed dignissim diam turpis, ac condimentum justo iaculis vel. Donec facilisis eros sit amet est dapibus, vel pellentesque eros consequat. Integer euismod mollis metus, vel rutrum risus imperdiet ac. Fusce semper dolor sit amet mi congue accumsan. Maecenas sagittis magna justo, vel varius ante scelerisque id. Fusce at urna sapien. Aliquam dui sapien, facilisis eu magna laoreet, feugiat tincidunt elit. Fusce iaculis sit amet erat id dignissim. Suspendisse sollicitudin laoreet consequat. Pellentesque eu mollis quam, vel dapibus libero. Duis mattis tortor vitae orci vehicula, et viverra ipsum lobortis. Quisque iaculis sapien est, id sagittis tortor rutrum at.
+
+Duis ut condimentum risus, et venenatis nulla. Praesent urna ex, faucibus eu mollis nec, lobortis vitae neque. Vivamus a malesuada tellus. Quisque bibendum dolor nec massa porta, nec malesuada magna auctor. Phasellus non auctor turpis, et bibendum risus. Ut pellentesque justo non neque convallis, ut imperdiet diam sagittis. Nunc arcu nisi, rutrum sagittis neque elementum, finibus consequat felis. Proin euismod elit eu urna tristique ultrices.
+
+Curabitur id hendrerit ipsum. Aliquam tortor nisi, dignissim vel sodales a, ultricies a ipsum. Etiam commodo arcu sed volutpat varius. Proin vehicula lacinia tempor. Vestibulum feugiat nibh eu ante tempor efficitur. Etiam eleifend a orci eu euismod. Cras a tortor risus. Cras nec urna non urna malesuada maximus vel et ipsum. In ullamcorper porttitor dolor, at fringilla tortor tristique ac. Nulla gravida tortor nec dolor convallis, accumsan sollicitudin dui luctus. Vestibulum euismod vestibulum semper. Nam semper lacus dolor, vitae rhoncus nisi blandit nec. Phasellus turpis dolor, posuere sed sodales sit amet, interdum ut arcu.
+
+Sed blandit nulla et sem vulputate, et semper lacus posuere. Proin velit lorem, sagittis tincidunt aliquet vitae, fermentum sed orci. Ut interdum ultrices dolor eu tempor. Quisque pretium vulputate dui at blandit. Aenean pretium urna sed purus dapibus aliquam. Mauris tristique augue pretium magna scelerisque, vel cursus sapien porttitor. Nullam neque justo, aliquam non neque id, lobortis facilisis nibh. Duis molestie dui eu augue tristique porttitor. Sed posuere justo massa, efficitur vulputate erat posuere non. Cras quis condimentum tellus.
+
+Etiam eleifend ipsum ut justo viverra porttitor. Nam bibendum enim nec ligula vestibulum, vel fringilla velit posuere. Praesent leo enim, varius sit amet nulla ut, sodales sollicitudin nunc. Phasellus hendrerit varius ex quis tempus. Suspendisse maximus laoreet enim, ut bibendum tortor. Ut non magna vehicula augue condimentum scelerisque. Aenean efficitur elit vel rhoncus euismod. Vestibulum sit amet sollicitudin dui. Quisque ac diam nibh. Nullam quam enim, volutpat eu turpis et, posuere consectetur neque.
+
+Ut tincidunt semper dictum. Etiam varius enim sit amet metus consequat malesuada in at ligula. Cras nisl dui, tincidunt a urna et, porttitor rhoncus velit. Mauris interdum imperdiet lectus ac mollis. Aliquam sollicitudin ornare mi, a varius nulla faucibus aliquet. Nunc fermentum tempor ullamcorper. Pellentesque laoreet libero condimentum pellentesque pharetra. Nullam sed eros vel erat vestibulum dictum. Nulla nec interdum dui, quis finibus nunc.
+
+Sed ac turpis in mi ultricies finibus sit amet et diam. Pellentesque sagittis non ligula et convallis. Suspendisse interdum est aliquet erat rhoncus semper. Donec pretium turpis ante, vel posuere mauris facilisis vel. Vivamus nibh ligula, pharetra sit amet hendrerit nec, vulputate ut sapien. Nulla ullamcorper condimentum metus vitae imperdiet. Ut eget ex purus. Nulla dapibus malesuada pharetra. Praesent sit amet ornare turpis. Nulla pulvinar felis eget arcu mollis vulputate. Vestibulum eget semper felis. Donec viverra justo id mi tempor, a mollis ipsum porttitor. Maecenas aliquet volutpat ante eget tempor. Duis ipsum nisi, scelerisque quis metus vitae, blandit faucibus nisl. Mauris rutrum nisi sed lorem dictum ultricies.
+
+Nulla dictum arcu augue, aliquet ornare ligula suscipit ut. Integer libero erat, bibendum quis arcu at, consequat luctus sem. Ut ut erat tincidunt, porta erat efficitur, bibendum neque. Maecenas eget convallis sapien. Nullam facilisis ex et lorem fringilla, ut convallis leo dictum. Duis porttitor, ex eu venenatis faucibus, erat augue dapibus leo, sit amet scelerisque neque dui sed arcu. Praesent at diam nec sem sodales condimentum. Vivamus vehicula urna tellus, a semper ipsum cursus id. Duis auctor enim erat, laoreet volutpat dui rhoncus maximus. Suspendisse pellentesque euismod lacus, at auctor purus. Suspendisse volutpat imperdiet diam, id laoreet est egestas at.
+
+Fusce lobortis ex vel condimentum convallis. Vivamus fermentum convallis dolor quis rutrum. Donec tempus ornare maximus. Mauris quam neque, dignissim rutrum maximus sed, volutpat sed lectus. Donec id augue gravida, pretium purus eu, sagittis tellus. Maecenas tincidunt gravida felis nec pulvinar. Fusce turpis urna, sodales non rhoncus nec, sodales ac ipsum. Suspendisse risus felis, imperdiet id malesuada fermentum, ultricies et erat. Suspendisse potenti. Pellentesque tellus ipsum, dapibus eget pellentesque eleifend, venenatis sed risus. Ut sed mollis nisl. Aliquam lobortis aliquam ipsum, et ornare magna bibendum ut. Proin quis justo vitae neque tincidunt maximus ultricies et purus. Nullam non semper turpis. Quisque non mauris odio.
+
+Donec commodo tempus egestas. Vestibulum at diam vel mi tincidunt finibus. Donec aliquam magna id eros tristique finibus. Cras ut enim sapien. Proin gravida risus a nisi dapibus, ac vulputate nunc laoreet. Donec at leo vel nulla iaculis feugiat sed et ante. Nulla a arcu at ligula sollicitudin semper sed eget est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Ut dolor magna, luctus id elit ut, interdum viverra lacus. Aenean sed tempor metus. Aenean arcu dui, eleifend quis est sed, luctus lacinia nulla. Morbi id luctus libero. Maecenas sodales leo eu sapien maximus porta. Praesent gravida augue eu ligula pretium cursus.
+
+Duis aliquam luctus tortor, eu facilisis quam sodales sed. Phasellus feugiat venenatis lorem, in scelerisque est efficitur quis. Cras quis nisl nisl. Quisque magna felis, tempus nec pharetra et, tempor id ligula. Pellentesque sed dignissim velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris convallis iaculis posuere. Nullam orci velit, venenatis eget enim quis, molestie consequat dolor. Nulla egestas risus vestibulum sagittis blandit. Nullam dui lacus, tempus euismod sapien a, eleifend sodales justo. In id tortor neque. Vivamus faucibus ante ac odio vestibulum, vitae condimentum nibh consectetur. In rutrum hendrerit est, sit amet mollis ex aliquet tempor.
+
+Donec non tincidunt sem. Nullam dignissim felis nibh, et accumsan felis tristique sed. Maecenas id massa erat. Ut justo ligula, aliquet eu condimentum a, aliquet eget ex. Phasellus et neque eu nisl consectetur ullamcorper. Sed gravida efficitur nisi, vitae posuere nisi tincidunt sed. Duis vitae molestie metus, vitae finibus urna. Integer at lacus vitae turpis convallis feugiat a dignissim libero. In dolor nibh, aliquam eu malesuada in, tincidunt vitae nisi. Nullam at lectus risus. Integer vitae ligula interdum, congue nibh id, tincidunt dolor.
+
+Mauris risus quam, mollis eu consequat vitae, molestie sit amet risus. Vestibulum congue vulputate nibh sit amet ullamcorper. Nullam elit justo, hendrerit euismod elit nec, gravida tincidunt ipsum. Aenean tellus tortor, commodo vitae cursus vitae, finibus quis mi. Nam in tellus scelerisque, cursus magna a, elementum tellus. Praesent ut lacinia justo. Donec consectetur, mi nec faucibus viverra, nisl justo suscipit est, in consequat ex urna vitae orci. Fusce molestie feugiat ex sed dictum. Phasellus interdum eros dapibus sodales volutpat. Morbi elementum sapien ante, quis sagittis justo fermentum at. Maecenas vestibulum massa quis eleifend rhoncus. Praesent auctor ex at urna pellentesque facilisis.
+
+Duis tincidunt porta quam, in commodo orci dapibus interdum. Donec mattis erat ante, nec faucibus magna pharetra id. Aliquam dignissim ultricies auctor. Duis quis ex mi. Phasellus ipsum mi, volutpat quis augue nec, dapibus aliquet lectus. Aenean id eros mi. Fusce rhoncus iaculis magna, commodo commodo nibh pellentesque ut. Donec consectetur lacinia erat ut luctus. Mauris efficitur erat vitae sapien fringilla sollicitudin. Maecenas a egestas ipsum. Aenean placerat congue augue, ut condimentum lorem accumsan in. Morbi ac quam nunc.
+
+Nunc posuere faucibus semper. Integer at convallis ex. Duis a purus molestie, dignissim mi quis, consequat nulla. Proin tempus congue ligula, sit amet ultricies enim consequat ut. Nunc ac est at nisl euismod cursus. Pellentesque vulputate molestie ipsum. Praesent varius, lacus non lobortis blandit, nibh lacus scelerisque nisi, sit amet interdum ligula tellus ac purus. Vestibulum sed quam tempor, pharetra tellus ullamcorper, tincidunt est. Nulla tempus tortor nec erat tempus eleifend pellentesque eget purus. Duis gravida dui justo, ac commodo ipsum mollis et. Nullam vitae nibh enim. Ut sodales mi eu diam sagittis, quis luctus tortor euismod.
+
+Maecenas a augue ac augue varius rhoncus. Fusce nunc turpis, mattis eu iaculis a, dapibus nec purus. Pellentesque imperdiet sit amet purus a blandit. Morbi augue tellus, venenatis nec tortor in, consectetur tincidunt nulla. Aenean purus libero, volutpat quis neque vitae, mattis efficitur eros. Donec sodales venenatis augue, sed faucibus magna accumsan convallis. Pellentesque efficitur elementum imperdiet. Cras at condimentum leo. Curabitur feugiat ut nisi facilisis commodo.
+
+Sed commodo sapien quam, quis vulputate orci lobortis nec. Aenean luctus dictum ipsum, non consequat sapien molestie vel. Proin blandit libero tortor, vitae efficitur tortor hendrerit at. Sed eleifend eu velit eu tempor. Nunc auctor tincidunt mollis. Ut molestie, erat ut lobortis convallis, odio felis sollicitudin elit, vitae ultricies lorem neque et dui. Sed venenatis tempus ullamcorper. Integer eget elementum nulla. Maecenas a placerat ipsum. Etiam sagittis sagittis rhoncus. Aliquam faucibus magna id lacus pharetra, nec interdum lacus sodales.
+
+Mauris ipsum sem, venenatis non elit in, feugiat pretium lacus. Fusce eget tincidunt dolor. Nam pharetra lacus vitae diam bibendum, ac placerat tortor aliquet. Sed eget gravida orci. Ut in orci lorem. Morbi condimentum ligula dolor, in dictum mi vestibulum sed. Suspendisse eu velit finibus, tincidunt dolor malesuada, mattis est. Morbi iaculis sapien vitae metus facilisis fringilla. Donec sed volutpat neque. Mauris ipsum metus, venenatis cursus mattis quis, convallis ultricies purus. Aliquam quam magna, sagittis at mi quis, lacinia iaculis turpis. Praesent viverra, ex nec euismod lacinia, urna risus pretium odio, sit amet mattis metus eros non lectus.
+
+Nam sed vehicula est, ac aliquet mi. Aenean iaculis placerat orci, ut lobortis dui vestibulum convallis. Vestibulum eleifend ante sed lorem interdum lobortis ut vel tortor. Sed auctor id nisl sed bibendum. Fusce maximus vulputate mauris, tempus sollicitudin nunc efficitur vitae. Nulla pellentesque molestie leo, quis hendrerit enim. In vel dapibus nisi. Nam at dui quis eros porttitor volutpat in id magna. Maecenas quis quam a justo cursus aliquet viverra sit amet mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut hendrerit est at augue pretium condimentum at ut velit. Suspendisse non gravida metus.
+
+Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Praesent lacinia commodo elit, sed fringilla ipsum imperdiet ut. Proin a dictum ante. Suspendisse potenti. Praesent ac nulla volutpat, ultricies diam vel, auctor risus. Nullam aliquam elit vel quam suscipit molestie vel ac dolor. Ut pharetra finibus elit, id vulputate ex dignissim in. Ut ac finibus urna, a luctus magna.
+
+Fusce suscipit convallis eros nec blandit. Cras quis lectus nibh. Donec pulvinar rhoncus pulvinar. Vivamus nulla nisi, vestibulum vel neque et, dictum gravida ex. Vestibulum in arcu vitae nibh auctor rhoncus ac in massa. Sed semper enim ac dui sollicitudin porttitor. Etiam ante erat, laoreet sed dolor eget, cursus commodo lorem. Curabitur maximus tincidunt nulla at molestie. Phasellus ultrices felis a cursus facilisis. Nullam a semper tortor. Nulla ac vulputate justo. Mauris maximus nisi quam, elementum eleifend nulla condimentum nec. Aenean congue tincidunt mi, id mollis orci blandit vitae. Integer placerat orci at nisl vestibulum lacinia.
+
+Sed egestas posuere egestas. Quisque pulvinar velit commodo felis accumsan, a consequat purus laoreet. Ut at arcu at augue sodales rhoncus. Ut non nisl dui. Sed sed nulla quis orci eleifend auctor ut et sem. Aliquam erat volutpat. Donec egestas tincidunt leo in interdum. Donec varius odio nulla, id porttitor erat venenatis ut. Nulla ac nisl ut enim placerat congue. Fusce consequat purus eget risus luctus finibus. Donec in blandit odio. Sed vestibulum nisl ut diam vestibulum volutpat. Donec magna quam, tempor eget velit quis, blandit tristique lacus. Pellentesque et orci dui.
+
+Integer tempor mollis purus ut volutpat. Pellentesque efficitur cursus neque in ullamcorper. Integer ac tincidunt lacus, at venenatis tellus. Curabitur convallis commodo enim a convallis. Aenean sagittis sodales nibh, sed eleifend diam ultricies at. Vestibulum erat mauris, lobortis ac tempor a, viverra non sem. Nulla non ipsum mollis, dignissim elit a, laoreet enim.
+
+In laoreet purus eget orci rhoncus viverra. Quisque vel metus quis nulla hendrerit viverra. In consectetur velit vitae purus vestibulum, in hendrerit odio sollicitudin. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ut est sed ligula tincidunt fermentum nec ac nulla. Nam in sagittis velit. Vivamus vel dapibus erat, ullamcorper sollicitudin metus.
+
+Quisque pulvinar nulla eget mi mattis, ut convallis nulla ullamcorper. Vivamus placerat mauris vel elementum aliquet. Sed ac accumsan eros. Vivamus vitae rhoncus urna. Fusce gravida cursus varius. In posuere finibus leo cursus molestie. Interdum et malesuada fames ac ante ipsum primis in faucibus. Mauris vulputate mi ut nunc finibus convallis. Praesent luctus erat eu urna facilisis convallis.
+
+Nam efficitur tempus augue varius porttitor. Pellentesque scelerisque dolor scelerisque, dignissim massa eget, iaculis nibh. Praesent viverra molestie dui a pulvinar. Mauris malesuada mattis felis, vitae sagittis metus pellentesque viverra. Phasellus faucibus congue blandit. Pellentesque mattis, justo sed imperdiet rutrum, metus metus porta nisi, vel malesuada lorem massa at dolor. Nullam nisi eros, tristique quis mollis ac, hendrerit nec leo. Praesent viverra molestie vestibulum. Nullam eu aliquam risus, at dignissim diam. Quisque blandit fermentum erat, sed ullamcorper augue pellentesque in. Integer eleifend libero non lacus sagittis auctor. Aliquam volutpat interdum accumsan.
+
+Etiam in eros porta, bibendum lacus eget, feugiat orci. Integer massa dui, commodo ac luctus nec, ornare id velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis dignissim scelerisque ex. Aliquam tempus cursus nibh, sed scelerisque libero sagittis ut. Morbi finibus vestibulum nulla, nec aliquam urna venenatis vulputate. Pellentesque ultricies, lorem a dignissim bibendum, augue nisi eleifend libero, cursus ultrices nulla purus a nunc. Quisque dictum pulvinar turpis vitae finibus. Etiam eget ultrices diam. Sed commodo enim ante, fermentum rhoncus tortor tincidunt ac. Suspendisse fermentum aliquet erat non posuere. Aenean vel dapibus lorem.
+
+Aenean lorem libero, rutrum vel egestas vel, pellentesque ut ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum felis diam, pellentesque sit amet ultricies sed, vestibulum in leo. Morbi aliquet, quam ut fringilla sollicitudin, justo risus suscipit mi, in vulputate neque erat ut turpis. Duis auctor dui non urna sagittis dictum. Vestibulum nec felis vel sapien congue volutpat a a orci. Phasellus tincidunt libero ac lorem feugiat, ac elementum lectus eleifend. Praesent sit amet est id massa convallis congue. Integer ac nunc eget orci pharetra vehicula. Mauris et ultricies diam. Nunc et pellentesque lacus, eget bibendum sapien. Morbi condimentum mi ac metus euismod convallis. Proin consequat rhoncus varius. Maecenas feugiat elementum vulputate.
+
+Vestibulum tempor feugiat dapibus. Ut ornare in augue non euismod. Nulla faucibus gravida condimentum. Curabitur pharetra dui non lorem sagittis iaculis. Quisque vitae nibh magna. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce quis pharetra sem, sed aliquet lectus.
+
+Fusce volutpat tempor tincidunt. Pellentesque ultricies imperdiet tincidunt. Integer porta dictum lorem, non luctus tellus bibendum sit amet. Quisque posuere felis et est dapibus, commodo rutrum leo molestie. Fusce sodales felis sed sem pharetra pretium. Praesent nec sollicitudin nisl. Donec volutpat convallis elementum. Duis id libero augue. Nulla facilisi.
+
+Nulla viverra, urna nec efficitur vulputate, metus odio lacinia purus, in sagittis elit erat vel massa. Fusce ligula leo, finibus non felis dignissim, dictum ullamcorper odio. Phasellus vel eros eu sem venenatis sagittis a nec nulla. Pellentesque sapien elit, lobortis quis dictum et, maximus vitae metus. Curabitur quis aliquam eros. Quisque cursus condimentum urna vel efficitur. Etiam aliquet lorem ut varius suscipit. In viverra molestie felis vitae vehicula. Curabitur cursus, nunc sodales faucibus ullamcorper, urna magna dapibus velit, accumsan blandit mi quam nec justo. Donec ac dui lorem. Sed eu sagittis nulla. Suspendisse ut ante lacus. Fusce non tristique felis. Nulla convallis consectetur arcu, semper egestas urna efficitur quis. Nulla ac turpis at leo pretium maximus. Morbi cursus diam ac purus imperdiet, non commodo tellus cursus.
+
+Mauris ut eros suscipit, suscipit nisi vel, porttitor sapien. Morbi in nulla sapien. Cras maximus pretium justo, vel eleifend urna vulputate sed. Aenean egestas nisl ex. Curabitur sed pharetra ligula. Nulla blandit lorem id mauris tincidunt, at elementum risus aliquet. Quisque id interdum dui.
+
+Aenean nec elit condimentum ex viverra hendrerit. Pellentesque blandit nibh elit, a ultrices orci vestibulum vitae. Donec ultricies malesuada justo ac luctus. Pellentesque laoreet nunc a sem varius, ac dapibus ligula volutpat. Aenean sem felis, aliquam nec ullamcorper quis, ullamcorper non ante. Pellentesque libero leo, sagittis nec tempus a, tincidunt eget risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec elementum massa vel diam suscipit suscipit. Suspendisse eget neque porta, cursus orci eget, imperdiet libero.
+
+Vivamus faucibus vulputate sapien, non pulvinar ex sodales vitae. Maecenas consequat est urna, id faucibus eros dictum at. Vestibulum tortor mi, porta vitae sagittis sed, convallis quis enim. Vestibulum gravida justo pulvinar sem ornare, efficitur dictum neque varius. Nullam egestas congue tellus vitae interdum. Nam lectus erat, porta vitae lorem non, mollis semper velit. Nulla vestibulum tincidunt elit. Phasellus sed vulputate leo.
+
+Sed efficitur quam ac iaculis volutpat. Praesent nec feugiat ex. Aenean at ligula iaculis, imperdiet lacus et, condimentum magna. Integer euismod leo id mauris condimentum, quis semper lacus blandit. Sed volutpat neque urna, sit amet ullamcorper est dignissim non. Vestibulum tristique sollicitudin risus, sed hendrerit massa finibus id. Vestibulum sit amet risus non eros vehicula malesuada. Nam facilisis lacus sed quam pulvinar, at fermentum lectus tincidunt.
+
+Vivamus laoreet sem nec odio blandit, ut ornare sem egestas. Suspendisse potenti. Nulla aliquam pretium volutpat. Maecenas a orci suscipit, aliquam eros a, maximus urna. Aliquam eu gravida justo, et hendrerit justo. Suspendisse a commodo lorem, quis viverra nisl. Nulla vel pellentesque nisl. Nulla ligula tellus, vehicula sit amet turpis in, sodales tincidunt tellus. Proin ut nibh sed ipsum porta dignissim vel sed mauris. Interdum et malesuada fames ac ante ipsum primis in faucibus. In hac habitasse platea dictumst. Vestibulum efficitur nulla rutrum, accumsan lacus at, dignissim tortor. Morbi egestas metus ut nibh tincidunt posuere at sed elit. Integer eget hendrerit nulla.
+
+Donec sagittis sagittis tempus. Proin iaculis neque vehicula commodo faucibus. Pellentesque erat ante, vehicula sed efficitur vitae, varius non sem. Mauris pellentesque, felis nec egestas scelerisque, nulla nunc fringilla arcu, feugiat fringilla quam neque in elit. Nullam ut ex odio. Mauris enim risus, consequat at suscipit at, pulvinar ut arcu. Fusce mollis sem sed tellus tempus pellentesque. In pharetra, libero sed tristique vestibulum, massa velit egestas risus, at mollis augue lorem sit amet turpis. Mauris risus dui, sagittis vitae congue ut, condimentum ut augue. Quisque non sollicitudin purus, sit amet consectetur sapien.
+
+Sed scelerisque ipsum sed augue varius, sit amet ultricies purus posuere. Etiam vehicula at nunc in posuere. Cras eget risus a sapien mollis facilisis. Morbi vel purus auctor, faucibus mauris non, malesuada leo. Donec venenatis consectetur libero in pretium. Ut efficitur molestie metus id scelerisque. Nunc dolor justo, pharetra vel sagittis vitae, placerat ut justo. Donec tempor fermentum est semper auctor. Nullam tincidunt risus non risus elementum varius. Suspendisse euismod augue metus, nec pellentesque enim sagittis ac. Morbi et lectus quis justo commodo varius commodo vel risus. In bibendum purus in erat ullamcorper, sit amet dignissim sapien scelerisque. Quisque tempus elementum rutrum.
+
+In viverra sollicitudin pretium. Sed finibus scelerisque sollicitudin. Nulla lobortis purus in lectus iaculis, a ornare ex accumsan. Morbi malesuada mollis placerat. In hac habitasse platea dictumst. Pellentesque sed dui quis odio scelerisque molestie eu nec libero. Proin viverra magna ligula, at luctus lacus posuere sed. Nullam non congue mi. Praesent non mattis neque, sit amet tempus diam. Mauris eget cursus lacus, id dictum mi.
+
+Sed semper velit in vehicula tristique. In lobortis est augue, et maximus tellus iaculis ut. Proin quis ex maximus erat iaculis imperdiet. Curabitur ultrices turpis ac nibh congue ornare. Fusce a aliquet felis, nec sodales tellus. Nunc mauris ante, feugiat et facilisis at, pharetra ultricies dui. Integer felis metus, porttitor ac ipsum vitae, placerat varius ex. Morbi in dui a nunc aliquam posuere. Nulla tempus tortor ac lorem consectetur sodales. Praesent sit amet placerat diam. Curabitur sodales mauris ante, et tincidunt lacus ultricies quis. Nulla eu finibus nisl, sit amet volutpat leo. Donec ligula enim, feugiat non aliquet nec, congue interdum lorem. Pellentesque a nisi blandit, semper massa sit amet, auctor eros.
+
+Aenean ligula libero, commodo a erat at, tristique facilisis quam. Sed congue fringilla lacus, vel iaculis quam suscipit ornare. Curabitur non pretium mi. Donec condimentum odio dui, id malesuada ipsum porta ac. Aliquam imperdiet cursus ullamcorper. Duis cursus tincidunt nibh sit amet cursus. Aliquam urna orci, sodales ac ipsum at, placerat lobortis neque. Sed sit amet convallis felis, vestibulum finibus arcu. Phasellus venenatis egestas felis, id aliquam turpis iaculis non. Proin a lacus ut felis malesuada sodales. Duis elementum, eros ac placerat bibendum, quam nisl varius mauris, vel venenatis neque augue et justo. Nunc varius sem velit, vel tempus mi aliquet id. Fusce purus massa, mollis id nulla non, dignissim cursus massa. Sed sollicitudin interdum felis, nec eleifend nisl feugiat eget. Nulla rutrum id odio ut consectetur. Maecenas fermentum turpis vitae libero ullamcorper suscipit.
+
+Vestibulum auctor lectus ligula, non sollicitudin odio maximus nec. Cras faucibus, felis sed suscipit tempor, risus lorem consectetur est, eget pulvinar nibh dui eu dolor. Vestibulum pellentesque, ex aliquam vulputate laoreet, libero lorem rhoncus risus, vitae congue velit justo vitae nisi. Nullam placerat venenatis tortor, sit amet lacinia augue placerat nec. Quisque vulputate lectus vel pulvinar condimentum. Nullam at libero iaculis, mattis purus vel, tincidunt diam. Suspendisse eu ullamcorper eros. Nulla id eros odio. Ut enim leo, ultricies quis mauris sed, interdum commodo felis. Etiam enim lacus, scelerisque a interdum eget, mollis vel tellus. Phasellus vel vulputate orci. Nulla ornare leo sed arcu rhoncus convallis. Duis libero arcu, pulvinar ut tellus vitae, aliquam euismod magna. Donec semper nisi eget nulla tempus, sed condimentum massa sollicitudin.
+
+Suspendisse bibendum ante vitae ullamcorper semper. Praesent dui est, elementum nec lacus in, pellentesque accumsan sapien. Cras quis urna at lacus posuere commodo eget nec arcu. Nunc varius ante quis ligula rhoncus, ut dignissim metus commodo. Integer volutpat gravida nunc eget faucibus. Quisque imperdiet, mauris vitae cursus malesuada, lacus mauris tempus sem, ut accumsan purus lectus quis nisi. Vestibulum aliquam dui sed nisl laoreet, id posuere quam imperdiet. Aliquam ultricies non enim vel tempor. Donec sed feugiat justo, vel rutrum enim. Phasellus lorem quam, dapibus a tincidunt vulputate, pellentesque non lorem.
+
+Nunc quam diam, condimentum sit amet enim semper, hendrerit laoreet magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam et pulvinar leo, ac fermentum lectus. Sed erat ante, mattis ac tempor vitae, euismod at tortor. Ut sagittis fringilla scelerisque. Ut pulvinar molestie leo eu faucibus. Sed quis efficitur purus. Pellentesque nibh nisi, porta id orci id, sagittis sodales tellus. Ut venenatis velit a lectus lacinia, at ultrices nisi commodo. Vivamus eros orci, ornare vel ullamcorper elementum, posuere id ligula. Aliquam non massa pellentesque, semper ipsum scelerisque, dapibus leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla pretium leo diam, sit amet bibendum lacus tempus quis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer quis pulvinar nibh.
+
+Mauris sed eros nisi. Cras malesuada, turpis vitae laoreet porta, sapien odio maximus nulla, ut efficitur mauris odio tincidunt elit. Nam ut urna eros. Sed at vestibulum risus. Nulla luctus pulvinar rhoncus. Pellentesque maximus ligula a est ullamcorper, sed tempus tortor ultrices. Curabitur ligula odio, mollis sit amet risus quis, tempor auctor magna. Suspendisse vel quam quis lorem commodo facilisis. Donec eu ipsum suscipit, molestie dui sed, fringilla dui. Proin placerat ex a lorem sodales convallis. Sed molestie quam mi.
+
+Fusce laoreet nec dolor id bibendum. Nunc condimentum vulputate massa lacinia fermentum. Donec maximus cursus eros sed porta. Nunc eu porta turpis. Nulla cursus et nisl eu elementum. Ut rutrum scelerisque aliquet. In tellus erat, rhoncus id tempus vitae, vestibulum non quam.
+
+Vivamus luctus elit a efficitur dapibus. Praesent magna mi, pellentesque sed accumsan dapibus, blandit at lectus. Praesent sodales erat diam. Pellentesque placerat lobortis enim, a dapibus ligula molestie ut. Phasellus dui augue, suscipit ac urna non, iaculis eleifend augue. Maecenas sed elit iaculis, pretium ligula lacinia, aliquam libero. Nulla sem mi, pellentesque viverra lorem vel, luctus vulputate augue. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque fermentum nunc ex, at lobortis turpis congue vitae. Suspendisse iaculis elementum enim commodo facilisis. Vestibulum non neque tellus. Proin vitae sodales urna. Mauris interdum purus et neque tempus, vitae mattis libero finibus. Suspendisse iaculis condimentum nibh, eu mattis enim vehicula a.
+
+Fusce dictum urna non lectus ullamcorper vestibulum id in elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc fermentum odio non ante sollicitudin posuere. Praesent vulputate quam nec magna euismod pellentesque. Etiam tempor nunc eget velit volutpat eleifend. Mauris sodales nunc ullamcorper, gravida purus eget, rutrum sem. Nam a sapien rhoncus, scelerisque lacus ac, condimentum ipsum. Pellentesque suscipit, ligula ut rhoncus ullamcorper, ligula augue rutrum lorem, eget aliquam risus tortor eget metus. Curabitur scelerisque bibendum purus vel vulputate. Morbi et odio at neque sodales suscipit. Nam at pretium nulla. In scelerisque vulputate suscipit. Nulla facilisi. Pellentesque eu sem eu ligula efficitur viverra. Pellentesque gravida consequat urna id bibendum.
+
+Nulla consectetur facilisis est nec aliquam. Proin hendrerit magna suscipit ante accumsan hendrerit. Nulla ut sem id neque tempor vehicula. Sed eget massa eget sem placerat tincidunt. Ut eleifend, justo sit amet egestas lacinia, ex velit pharetra nulla, nec aliquet elit neque ut turpis. Quisque in gravida velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed euismod malesuada convallis. Ut ultricies, magna et blandit fringilla, dolor dolor maximus sapien, in aliquet augue est vel odio. Nulla commodo elit massa, euismod tempor turpis aliquet eget. Morbi non odio et tortor egestas ultrices. Etiam semper, ipsum et dictum pharetra, eros purus bibendum lacus, vel laoreet lacus sem vehicula nibh. Nunc enim nulla, pulvinar sit amet lobortis sed, porttitor molestie risus. Morbi tincidunt diam mi, nec auctor sem rutrum at.
+
+Donec pellentesque odio odio, eu condimentum risus consectetur quis. Vivamus ullamcorper, mauris non semper rutrum, dui risus suscipit tellus, ut tempor velit risus vitae nibh. Duis tempor nibh at tristique rutrum. Cras congue nisl at sem sollicitudin efficitur. Aenean auctor purus vel libero fermentum elementum. Mauris convallis orci id interdum accumsan. Aliquam at metus risus. Sed accumsan, quam id dignissim congue, velit risus eleifend ligula, ut fringilla elit erat at neque. Aliquam tempor, quam ut ultrices volutpat, orci lectus vulputate turpis, eget pharetra purus nisi non lorem. Ut condimentum convallis justo, a volutpat eros. Sed tempus turpis leo, in convallis est fringilla sed. Vivamus eu laoreet tellus. Quisque ullamcorper ullamcorper leo. Nam fermentum egestas facilisis. Nulla egestas ligula feugiat urna molestie, faucibus convallis erat accumsan. Cras pellentesque ipsum lectus, vitae luctus dolor suscipit nec.
+
+Vivamus vel nibh sed mi tincidunt cursus quis facilisis tellus. Donec eget est eu velit pretium molestie. Maecenas lacinia risus turpis. Sed tristique id risus sit amet venenatis. Duis maximus, metus ac molestie convallis, quam ex dapibus sem, at rutrum metus nisi quis lectus. Suspendisse sodales in nisi at hendrerit. Maecenas suscipit lobortis vulputate. Nunc convallis sit amet elit eget porta. Mauris tincidunt massa in augue finibus iaculis. Vestibulum imperdiet, orci vel bibendum laoreet, ligula quam mollis lacus, a eleifend nisi tellus vitae ipsum. Cras non ante sollicitudin, auctor dolor id, condimentum tellus. Morbi malesuada leo nec lectus scelerisque, nec interdum lacus ornare. Integer ultrices ligula nunc, sed blandit urna aliquam eget. Proin consequat viverra ex non rhoncus. Phasellus id nibh at tortor sodales blandit. Donec dignissim ipsum vel ligula malesuada rhoncus.
+
+Nullam mauris sem, dapibus ac nisl at, hendrerit faucibus nisi. Mauris dictum fermentum pellentesque. Praesent in gravida odio. Vestibulum pharetra iaculis est quis tincidunt. Sed venenatis rhoncus lacus, non porta ante vulputate at. Duis fringilla ipsum at urna euismod molestie. Duis a porttitor ante. Mauris pharetra elit et metus auctor, a eleifend sapien porta. Vivamus ut tincidunt purus, lobortis euismod tellus. Nullam non nulla gravida, laoreet tellus ac, placerat urna.
+
+Sed justo sapien, scelerisque nec nisl vel, efficitur aliquet purus. Phasellus eget posuere nisl. Integer porta vel purus nec ornare. Pellentesque rutrum in nulla at hendrerit. Nullam elementum sodales volutpat. Duis tempus, purus sagittis auctor ullamcorper, dui erat hendrerit nulla, id finibus eros dui quis risus. Quisque posuere nunc quis augue placerat lacinia. Nunc quis lorem vulputate, tincidunt enim nec, rhoncus odio. Ut porttitor porta velit ut vulputate. Duis convallis sagittis magna nec gravida. Ut eu luctus sem, non placerat erat. Vivamus viverra ut ligula ac finibus. Cras ligula urna, tincidunt id risus eu, dapibus viverra lorem. Aliquam erat volutpat. Sed dolor nisi, faucibus non ligula faucibus, laoreet bibendum diam. Vivamus sagittis lacus ut condimentum tincidunt.
+
+Proin tristique mi ullamcorper dolor accumsan mollis. Nulla facilisi. Pellentesque iaculis mattis augue ac rutrum. Mauris in nulla at ligula fringilla pulvinar. Nam commodo ornare nibh ac viverra. Maecenas eget augue a risus mattis ullamcorper non at nibh. Aenean nec erat diam. Pellentesque augue nisl, venenatis mollis dolor non, bibendum malesuada leo. Pellentesque elementum purus ornare mauris iaculis porttitor. Sed mollis tempor dui eu elementum. Donec porttitor tellus non mattis gravida. Mauris venenatis suscipit convallis. Sed dolor sapien, pellentesque et tellus a, tempus cursus magna. Nunc lobortis leo magna, at maximus orci ultrices eget. Nullam vulputate dictum nisi, vel egestas orci.
+
+Nam nibh mi, ornare sit amet nibh vel, lobortis lacinia leo. Ut egestas mi vel nunc luctus vestibulum. Nullam id tempus felis, eget convallis erat. Aliquam venenatis ut tellus id fringilla. Aliquam erat volutpat. Sed vehicula, odio nec mollis dapibus, ligula sapien consequat risus, ut volutpat diam neque ut neque. Mauris venenatis libero vitae sem elementum, sit amet maximus massa varius. Maecenas malesuada mi id leo euismod, eu maximus sapien vehicula. Nulla facilisi. Duis nec venenatis ante, non pulvinar lacus. In sollicitudin sit amet velit suscipit egestas. Maecenas a lectus euismod, dictum nulla at, malesuada lectus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec lorem massa, laoreet non elit nec, sollicitudin blandit felis.
+
+Cras dignissim fermentum tellus ut fringilla. Maecenas maximus eros pretium sagittis venenatis. Maecenas id enim ac est semper efficitur ac hendrerit leo. Cras eu arcu tincidunt risus pellentesque aliquam. Pellentesque vel sodales libero, non rhoncus enim. Integer vulputate vulputate libero, eu consectetur eros euismod vitae. Fusce magna nibh, vehicula sed turpis eget, malesuada ultricies sem. Sed convallis sem nisl, rhoncus mollis mauris bibendum ut. Pellentesque vitae massa a justo dapibus laoreet. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed mollis egestas nisl vel ultricies. Phasellus sit amet varius leo, sed vehicula sapien. Etiam in urna eget neque aliquet ultricies in nec quam. Aliquam at feugiat elit.
+
+Maecenas placerat nisi ultrices neque pulvinar, et ultrices ante tempus. Vestibulum laoreet quam lacus, eget commodo magna dictum consectetur. Aliquam erat volutpat. Aenean tincidunt ipsum sit amet justo aliquet tempus. Quisque blandit sit amet est facilisis dictum. Sed non consequat dui. Integer purus diam, gravida quis tortor lobortis, iaculis vehicula sem. Morbi pellentesque est elit, vitae interdum elit laoreet et. Vestibulum in blandit ante, eu blandit velit. Morbi sagittis eu est eu vulputate. Nullam ac mi feugiat nibh feugiat suscipit. Sed interdum tincidunt efficitur. Integer dictum sem erat, ut pharetra libero lacinia in. Mauris at hendrerit odio, a facilisis lacus. Donec blandit massa ac nisi ultrices faucibus.
+
+Aenean tempus id ligula at mollis. Cras id dui magna. Integer id neque tincidunt, rhoncus nunc et, laoreet nibh. Pellentesque consectetur odio ligula, et consectetur tortor scelerisque non. Cras quis ex pharetra mi ornare lobortis. Phasellus fringilla interdum felis, vel aliquam ligula. Mauris cursus varius turpis in iaculis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent eget mi id nulla semper dapibus.
+
+Vivamus lacus augue, eleifend dignissim ipsum eu, interdum accumsan massa. Nam id quam vel ligula consectetur volutpat id eget eros. Aliquam sed felis velit. Duis egestas velit ac dolor blandit, ut elementum mi tincidunt. Integer varius nisl a sapien pellentesque, et pellentesque ante elementum. Fusce ac orci interdum, faucibus nisl ut, sagittis nisi. Vestibulum sed diam eu magna congue ornare. Integer dignissim ligula sit amet mauris pretium vulputate. Duis ac tincidunt magna. Sed vehicula, ante nec vulputate venenatis, mauris odio blandit dolor, vitae lacinia nibh lorem et metus.
+
+Sed non sapien vel lorem tempor semper ac ac tellus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas auctor ante sit amet suscipit vulputate. In ac cursus turpis. Donec eu sem bibendum, blandit est nec, blandit tortor. Pellentesque scelerisque justo vitae magna cursus, vitae egestas libero interdum. Pellentesque vitae ligula vel mauris vehicula convallis. Nunc ornare lectus sit amet lorem aliquet dignissim. Cras nec ligula pretium, semper nulla a, pulvinar lacus. Sed ac augue bibendum, posuere ipsum eu, venenatis quam. Sed elementum nunc quis odio pellentesque, a vestibulum ex congue. Cras id malesuada arcu. Mauris ut egestas nulla, sed tempus ligula. Donec ac elit ut nisi pulvinar elementum. Suspendisse id auctor lectus, vitae ultricies lacus.
+
+Vestibulum pulvinar ornare cursus. Curabitur accumsan sollicitudin mi in vestibulum. Vestibulum vulputate tincidunt luctus. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Phasellus a mattis neque, id malesuada odio. Aliquam id auctor magna. Vestibulum quis nibh lacinia, tincidunt felis sed, vestibulum ex.
+
+Donec placerat ipsum diam, vel imperdiet velit eleifend ac. Quisque dapibus erat non dui convallis eleifend. Praesent pellentesque felis id suscipit rutrum. Donec quis lacinia turpis. Nulla justo eros, fringilla vel fringilla in, euismod sollicitudin arcu. In ut lobortis arcu, at rhoncus elit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
+
+Pellentesque iaculis quam nec interdum eleifend. Fusce mauris mauris, imperdiet sollicitudin volutpat eu, sollicitudin blandit leo. Vestibulum hendrerit diam gravida erat imperdiet, blandit dignissim dui tempor. Phasellus viverra ante quis aliquam finibus. Duis sed condimentum augue, nec sollicitudin dui. Ut ullamcorper metus ac ligula accumsan, ac fringilla metus gravida. Morbi rhoncus est nunc, at lacinia ex fringilla sit amet. Integer lobortis ultricies nisi vitae accumsan. Nulla nec sagittis ante. Mauris bibendum nisi ut magna vulputate maximus. Praesent in elit eu metus dignissim cursus. Ut a tellus felis. Mauris eget ornare diam.
+
+Suspendisse potenti. Nam nec tortor ex. Duis eu elementum ligula. Pellentesque efficitur sodales orci, vitae sollicitudin odio tempor ac. Nam lacus ante, lobortis vitae lobortis eu, eleifend et velit. Nulla et lectus eu nibh tristique malesuada a sit amet felis. Proin molestie, lectus vitae sagittis malesuada, massa velit finibus est, id vestibulum dolor felis eget lectus. Phasellus varius pellentesque neque, a malesuada ex mattis eget. Nulla facilisi. Phasellus interdum placerat lobortis. Sed et odio tristique, viverra libero et, sagittis diam. Proin tristique lectus id bibendum maximus. Integer ornare euismod ligula nec malesuada. Nulla facilisi. Nullam bibendum hendrerit pharetra.
+
+Duis pharetra auctor felis, eget aliquet justo commodo at. Donec quis nibh non arcu sodales efficitur. Aenean lorem sapien, tincidunt eu sapien nec, convallis tempor diam. Curabitur volutpat, felis ut congue euismod, lacus nisl euismod ipsum, vel consectetur orci nibh sed ligula. Curabitur consectetur vitae mauris sed tempor. Fusce vel pretium nibh, et tristique dolor. Aliquam semper a ante non finibus. Praesent euismod urna augue, at feugiat orci commodo ut. Duis imperdiet purus non augue cursus gravida. Maecenas sodales purus et sollicitudin venenatis. Nam ultrices lorem lectus, ut pretium turpis hendrerit eget. Vestibulum vel lacinia lectus, at dignissim diam. Vivamus ut tortor ac tortor blandit finibus. Etiam porttitor tortor sit amet elit lacinia gravida. Pellentesque pretium, orci vitae tempor vehicula, nisi tellus tincidunt sapien, id egestas felis quam a nunc. Pellentesque sed vestibulum nisl.
+
+Mauris congue, justo vel dapibus pretium, ipsum augue consectetur leo, at aliquam ipsum neque non mauris. Nam sollicitudin in urna eu blandit. Aliquam erat volutpat. Morbi eget interdum ante. Pellentesque congue gravida arcu, eget ornare ante elementum nec. Integer a auctor dolor, in varius sem. Etiam dictum nibh magna, at volutpat nunc blandit eu. Curabitur at sem ipsum.
+
+Nulla porttitor erat eget volutpat iaculis. Pellentesque egestas, nisl vel ultrices efficitur, ex magna condimentum urna, in tincidunt massa turpis eget metus. Etiam vitae magna elementum, fermentum justo ut, pretium velit. Aliquam aliquet venenatis malesuada. Quisque consequat enim metus, pellentesque blandit leo rhoncus id. Vivamus vestibulum, est in condimentum mollis, ligula eros blandit lorem, vitae dignissim lectus mi eget nulla. Cras posuere leo at neque convallis, sed pretium massa ultrices. Morbi tempus porttitor turpis. Nam vitae mauris et massa venenatis tincidunt. Quisque vestibulum lacus ligula, in sodales felis elementum vel. Sed a tellus condimentum, sodales nisi id, aliquet elit.
+
+Vestibulum ac ex eu turpis lacinia condimentum nec eget ipsum. Nulla non imperdiet erat, at malesuada lorem. Praesent efficitur imperdiet augue vel laoreet. Sed dignissim, ante non porta feugiat, enim nunc rhoncus lorem, eu luctus turpis risus sit amet orci. Vivamus bibendum pharetra venenatis. In at gravida nisi. Vestibulum pulvinar sapien ac augue scelerisque, vitae blandit nibh malesuada. Nunc vitae est faucibus, accumsan risus a, laoreet urna. Cras imperdiet lacus in augue facilisis dignissim. Duis sed nisi quis diam mollis rutrum.
+
+Vestibulum eget egestas neque. Praesent viverra, velit quis porttitor euismod, sem libero venenatis mauris, id congue urna nulla sed lorem. Nulla mollis metus nec diam malesuada aliquam. Duis ac risus nunc. Cras sollicitudin urna nunc, id sodales quam gravida sit amet. Fusce in vulputate orci, in venenatis lorem. Donec a sagittis ipsum. Quisque consequat sapien tellus, sed efficitur lacus aliquam eu. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean in neque at augue elementum commodo pellentesque eget ligula. Nullam condimentum efficitur tincidunt. Phasellus posuere tincidunt odio sed facilisis. Aenean eu risus at est euismod facilisis. Curabitur elit purus, malesuada quis blandit id, rutrum vitae dui. Praesent porta rutrum erat, ullamcorper viverra nunc. Cras ut velit dui.
+
+Etiam posuere pulvinar mi at ullamcorper. Pellentesque finibus, tellus non convallis commodo, orci nibh dapibus nisl, at aliquam purus nulla eget dui. Praesent fringilla urna nec nulla pellentesque, nec rhoncus turpis ultricies. Sed laoreet velit pellentesque libero varius, ac interdum urna viverra. Phasellus sed consectetur massa. Morbi quis velit nec ipsum varius tempor. Proin id sodales felis. Aliquam lacinia risus quis ligula condimentum sodales. Nulla vel arcu aliquet neque iaculis aliquet. Cras sed lorem eu turpis tincidunt sodales. Sed pulvinar elementum ligula, nec faucibus nisl. Fusce nec tellus eget dui tempor sagittis. In vitae enim in ex viverra commodo. Duis est erat, fringilla ac semper a, dapibus in tortor.
+
+Maecenas commodo vulputate iaculis. Aliquam non facilisis est. Donec pellentesque vitae nibh nec volutpat. In commodo metus placerat lorem commodo, non lacinia nibh bibendum. In viverra rhoncus erat. Mauris nec nisl blandit, elementum justo nec, accumsan libero. Aliquam elementum, velit et ullamcorper convallis, turpis lorem elementum lorem, quis consequat tortor eros ut erat. Curabitur et enim quis felis vulputate congue et vel purus. Sed elementum interdum ipsum, sed tincidunt arcu scelerisque et.
+
+Aenean interdum elementum mauris ut porta. Mauris vel purus ac odio vulputate pulvinar at quis odio. In turpis turpis, convallis in augue id, elementum vulputate lorem. Sed tincidunt fermentum vulputate. Nunc ipsum ipsum, molestie vel convallis id, pharetra vel arcu. Maecenas vel dui elit. Sed blandit dolor sit amet risus commodo faucibus. Duis rhoncus felis arcu, vel aliquam nisi faucibus sed. Suspendisse cursus eget nunc ut bibendum. Fusce non ligula risus. Curabitur vitae cursus metus, quis fringilla diam. Phasellus turpis ante, pulvinar ac turpis tristique, sollicitudin congue lectus. Proin quis ipsum at ipsum euismod euismod.
+
+Nunc ut fermentum nunc. Donec id commodo lacus, at hendrerit justo. Donec cursus purus sodales nunc commodo, quis bibendum elit hendrerit. Quisque quis pellentesque nibh, ac vulputate neque. Aenean non placerat felis, eget feugiat ligula. Vivamus a eros accumsan, cursus neque at, ultricies magna. Fusce tincidunt tellus vitae mi rutrum laoreet sed quis ligula. Nullam ullamcorper ligula ligula, vel fringilla metus aliquet a. Morbi aliquet, mauris vel interdum venenatis, ex arcu venenatis tortor, at tincidunt dui ipsum et arcu. Nulla blandit gravida nulla ac iaculis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed ullamcorper lectus in sapien lobortis, eget posuere massa varius.
+
+Cras lacinia nunc faucibus mauris placerat pretium eget non sapien. Morbi viverra bibendum posuere. Aliquam accumsan sagittis dolor non iaculis. Sed nunc odio, lobortis in dolor ac, rutrum fermentum velit. In venenatis, velit in molestie semper, est magna condimentum dui, aliquam auctor lorem nulla vel ligula. Morbi vehicula turpis turpis, quis mollis justo tempus vitae. Proin luctus lacus in mauris porttitor aliquet. Duis vitae nunc ex. Nullam eget erat vitae nulla iaculis rhoncus. Sed lacus dui, suscipit eu leo vitae, tincidunt dignissim risus. Praesent ut massa ut arcu sagittis consequat. Sed sit amet tincidunt turpis. Nulla bibendum, felis eget posuere dictum, libero mi tristique elit, at venenatis neque elit ac quam. Curabitur nisi sem, scelerisque nec nunc ac, pulvinar pharetra odio. Curabitur egestas pellentesque arcu sed suscipit. In mattis dolor vel dui mollis feugiat.
+
+Sed commodo, dui ac vestibulum dictum, tellus libero tincidunt lacus, viverra commodo est felis vitae urna. Proin tincidunt neque vel turpis eleifend laoreet. Vestibulum sagittis, tortor sed iaculis consequat, urna ante sagittis est, ac ullamcorper lorem nibh dignissim odio. Nam arcu mi, cursus et blandit nec, aliquam ut nulla. Aenean quis iaculis tellus, eu egestas augue. Etiam pretium eget nisi quis iaculis. Aliquam sed convallis eros. Ut bibendum rhoncus lacus, in vestibulum dui ultricies id. Fusce vestibulum, mauris ut tempor consequat, dolor nisl pellentesque elit, in porta arcu elit vel ante. Vivamus at nisl est. Etiam nec blandit tortor, at pulvinar orci. Proin semper dapibus tincidunt. Phasellus lobortis enim ullamcorper dolor tempor cursus.
+
+Mauris a libero in enim gravida aliquet ac sit amet nibh. Vestibulum ac neque posuere, blandit libero ac, vehicula enim. Aliquam auctor iaculis eros sit amet molestie. Quisque faucibus turpis et massa tristique, nec dapibus mauris aliquet. Proin blandit aliquet mauris, non tincidunt odio blandit vel. Curabitur a nibh in eros commodo tincidunt eu et libero. Curabitur sit amet dapibus ex, in condimentum magna. Sed eu sem sem. Nunc tellus dolor, rutrum eu mauris nec, congue feugiat purus. Fusce tempor, neque vitae bibendum imperdiet, dolor ipsum condimentum urna, et egestas quam tortor in ex. Aliquam velit magna, commodo hendrerit sagittis sed, feugiat eget erat. Nunc quis ullamcorper velit, eu consequat augue. Nam arcu mauris, condimentum sit amet magna in, finibus scelerisque nunc. Mauris erat est, hendrerit ac accumsan eget, facilisis ut nisl. Quisque dignissim arcu quis diam tincidunt tristique. Sed rhoncus nisl non enim fermentum, a lobortis dolor consectetur.
+
+Sed eget condimentum ligula. Vestibulum vitae cursus eros. Donec elementum sapien magna, posuere iaculis sem ultrices lobortis. Morbi eu bibendum lectus. Suspendisse ante eros, ullamcorper ac viverra eget, pellentesque sed sapien. Duis sit amet tincidunt dui, vitae lobortis purus. Sed venenatis tincidunt volutpat. Vivamus a nisl ac elit consectetur semper ut eu libero. Proin id cursus ex. In hac habitasse platea dictumst. Aenean sed nisi vitae odio venenatis pulvinar vitae ac risus. Sed varius magna ut erat luctus vehicula.
+
+Nunc non ex eget purus blandit faucibus at quis velit. Donec quis mi vestibulum, facilisis nisi quis, tincidunt turpis. Sed bibendum metus sed consectetur mollis. Maecenas fermentum, erat finibus pulvinar lacinia, ex risus dictum sem, ut vestibulum augue diam vel diam. Donec ac massa non nibh pretium laoreet eget in orci. Nulla placerat eleifend mi, pretium vestibulum diam condimentum vitae. Nunc odio turpis, feugiat vitae turpis eget, pellentesque commodo turpis. Etiam sapien purus, consequat nec mi eget, consectetur efficitur neque. Phasellus porttitor sapien sit amet nunc semper, vel bibendum nibh finibus. Ut ac imperdiet ex, eu congue felis. In posuere nisi felis. Mauris tempus pretium mauris, ac viverra nunc hendrerit id. Sed fermentum nec sem ac pulvinar. Integer dictum velit eget congue venenatis.
+
+Cras eros dolor, venenatis ac dictum sed, dignissim nec sem. Curabitur tempor erat quis pretium interdum. Nunc vestibulum justo nisi, sit amet sagittis tellus consequat vel. Donec pharetra nunc vitae consequat eleifend. Quisque ut mauris quis nunc volutpat consectetur. Nam a suscipit ligula, at gravida libero. Vestibulum blandit, tellus sed bibendum volutpat, libero tortor convallis nisl, sit amet placerat lorem dolor nec libero. Integer blandit libero elit, ut congue ex euismod congue. Nulla sodales justo id eros condimentum faucibus.
+
+Proin quam ante, hendrerit at bibendum eu, pharetra at lectus. Proin finibus arcu id nisl aliquam dapibus. Fusce a suscipit nisl. Ut placerat ultrices nibh nec efficitur. Vestibulum vitae interdum magna. Donec lobortis finibus risus, et luctus ipsum efficitur euismod. Quisque dictum diam et venenatis euismod. Cras dictum molestie aliquet. Vestibulum imperdiet quam eget diam malesuada, quis pulvinar odio dignissim. Curabitur sapien elit, iaculis vitae justo eget, pretium malesuada elit. Donec gravida molestie tincidunt. Nullam at commodo ipsum. Sed nisi erat, tincidunt ultricies interdum consequat, pretium mollis ipsum. Vivamus in erat consectetur, sodales nibh at, porta nunc. Mauris semper, dui vitae condimentum tempus, mauris justo volutpat urna, ac ullamcorper tortor dolor in sem.
+
+Aenean leo ligula, egestas at vestibulum ac, porta vel mauris. Curabitur at lorem non mauris fringilla venenatis vel eu arcu. Donec posuere eleifend diam. Duis aliquet justo lacus, eu egestas erat eleifend sed. Sed non cursus urna. Sed pretium purus id blandit varius. Mauris turpis mi, lobortis eu tellus sit amet, maximus venenatis felis. Proin non varius enim, aliquet finibus velit. Praesent posuere pharetra ipsum eget varius. Phasellus non fermentum magna, ut iaculis augue. Praesent ut nisl nunc.
+
+Sed ligula tellus, interdum at sapien ut, dictum pellentesque nisl. Duis fringilla, sem nec elementum dapibus, nisl tellus maximus velit, eu varius sem nisl feugiat eros. Maecenas quis viverra lacus. Nulla nec commodo ex, nec placerat enim. Curabitur ultrices sagittis fringilla. Vestibulum sit amet enim sagittis, condimentum nisl sit amet, pulvinar orci. Ut at erat finibus erat bibendum convallis. Quisque euismod magna eget leo facilisis hendrerit. Cras venenatis, nisi quis sollicitudin volutpat, metus enim vestibulum nunc, at mollis leo leo nec est. Fusce fermentum tristique feugiat. Suspendisse sem est, condimentum ut ante at, egestas convallis ante. Vestibulum dictum, ex nec imperdiet laoreet, magna est ullamcorper augue, vel molestie quam odio vel ante. Donec dui dui, posuere a neque ac, condimentum vehicula magna. Curabitur suscipit, risus vitae bibendum posuere, mauris lorem viverra est, at tristique arcu quam quis leo. Donec sed posuere neque. Suspendisse iaculis aliquet condimentum.
+
+Morbi tempus condimentum diam eget bibendum. Aliquam varius magna quis lectus interdum, in elementum ligula tempor. Morbi vitae lorem sapien. Morbi luctus consectetur eros non aliquet. Pellentesque vestibulum sem sed ante accumsan faucibus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam ac suscipit justo. Nunc efficitur lectus eu arcu venenatis, vel accumsan ex suscipit. Vestibulum egestas ultricies tellus, et interdum enim pretium eu. Aenean rutrum est tincidunt rhoncus molestie. Phasellus hendrerit tellus et laoreet varius. Integer efficitur felis magna, nec sollicitudin arcu sollicitudin in. Curabitur non feugiat odio. Mauris nisi odio, luctus quis dolor sed, tristique luctus ex. Nullam libero enim, facilisis ut venenatis et, vulputate sed purus.
+
+Mauris a odio ut leo porttitor ultrices a et ex. Pellentesque vestibulum lacinia faucibus. In pellentesque eget augue at feugiat. Integer finibus augue dolor, in luctus lorem rutrum vitae. Donec pharetra lectus ac purus sollicitudin, vel tristique mauris pretium. Cras porttitor mi eu lectus consequat, a ultrices felis venenatis. In condimentum turpis in velit mattis laoreet. Aliquam sed mauris id nulla ultrices convallis vel vel velit. Suspendisse ut arcu finibus justo fermentum fringilla. Etiam in malesuada nisl. In hac habitasse platea dictumst. Duis a est lacinia, pretium dui eget, condimentum turpis. Integer ac placerat augue. Donec et eros felis.
+
+Integer cursus magna id quam sagittis consectetur. Aliquam erat volutpat. Quisque ullamcorper nisl nec massa dapibus facilisis vitae at nunc. Donec laoreet, libero in elementum tempus, enim odio porttitor felis, venenatis fermentum augue velit eu urna. Ut at ullamcorper enim. In molestie, velit et blandit maximus, erat nunc laoreet quam, vel finibus est mauris non sapien. Donec et dictum lorem. Nunc vestibulum, dolor eget tempus maximus, elit eros aliquam velit, vitae mattis mauris lectus ac tortor. Donec rutrum justo orci, id dictum metus vestibulum a. Etiam bibendum ipsum convallis, lacinia turpis vitae, dictum tortor. In velit dolor, scelerisque sed molestie nec, volutpat a turpis. Cras posuere commodo erat ut gravida. Quisque ante ipsum, volutpat a tellus non, dignissim ornare elit. Pellentesque sed porttitor dui, luctus rhoncus purus. In vitae ante pulvinar, consectetur orci quis, tempus velit. Curabitur tempus ligula id sapien ornare rhoncus.
+
+Maecenas eu nibh et elit accumsan blandit a at erat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam commodo feugiat condimentum. In non ante ut mauris eleifend lobortis. Phasellus eleifend vitae metus et semper. Nam sit amet rhoncus diam. Nunc molestie libero sed erat volutpat consequat.
+
+Aenean eget tristique odio. Vivamus quam tellus, dignissim sed faucibus sed, sagittis ut elit. Maecenas in ullamcorper sem. In at ipsum accumsan lectus vestibulum commodo nec non leo. Aliquam at suscipit felis. Nunc non egestas tortor. Donec sit amet eleifend eros.
+
+Sed eleifend nisi velit, in egestas erat condimentum eu. Pellentesque a tincidunt urna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vestibulum dapibus mauris vitae elit auctor, id venenatis sem consectetur. Vivamus non leo pulvinar, blandit libero ut, vehicula arcu. Nullam elementum ex enim, at mattis massa pharetra eu. Nunc nulla magna, lobortis a magna sit amet, laoreet fermentum justo. Curabitur aliquam sollicitudin posuere. Aenean semper porta dictum. Mauris accumsan non nisi nec faucibus augue.
diff --git a/powertools-idempotency/pom.xml b/powertools-idempotency/pom.xml
index ba4b147ae..2e68ea563 100644
--- a/powertools-idempotency/pom.xml
+++ b/powertools-idempotency/pom.xml
@@ -105,7 +105,6 @@
org.junit-pioneer
junit-pioneer
- 1.9.1
test
diff --git a/powertools-idempotency/src/main/java/software/amazon/lambda/powertools/idempotency/internal/IdempotentAspect.java b/powertools-idempotency/src/main/java/software/amazon/lambda/powertools/idempotency/internal/IdempotentAspect.java
index d34dd72dd..989e88eb7 100644
--- a/powertools-idempotency/src/main/java/software/amazon/lambda/powertools/idempotency/internal/IdempotentAspect.java
+++ b/powertools-idempotency/src/main/java/software/amazon/lambda/powertools/idempotency/internal/IdempotentAspect.java
@@ -23,6 +23,7 @@
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.DeclarePrecedence;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import software.amazon.lambda.powertools.idempotency.Constants;
@@ -37,6 +38,8 @@
* It uses the {@link IdempotencyHandler} to actually do the job.
*/
@Aspect
+// Idempotency annotation should come first before large message
+@DeclarePrecedence("software.amazon.lambda.powertools.idempotency.internal.IdempotentAspect, *")
public class IdempotentAspect {
@SuppressWarnings({"EmptyMethod"})
@Pointcut("@annotation(idempotent)")
diff --git a/powertools-large-messages/pom.xml b/powertools-large-messages/pom.xml
new file mode 100644
index 000000000..a9ded60c5
--- /dev/null
+++ b/powertools-large-messages/pom.xml
@@ -0,0 +1,166 @@
+
+
+
+
+ 4.0.0
+
+A suite of utilities for AWS Lambda Functions that makes handling large messages in SQS and SNS easier.
+
+
+ software.amazon.lambda
+ powertools-parent
+ 1.17.0-SNAPSHOT
+
+
+ powertools-large-messages
+ jar
+
+ Powertools for AWS Lambda (Java) library Large messages
+
+
+ GitHub Issues
+ https://github.com/aws-powertools/powertools-lambda-java/issues
+
+
+ https://github.com/aws-powertools/powertools-lambda-java.git
+
+
+
+ Powertools for AWS Lambda team
+ Amazon Web Services
+ https://aws.amazon.com/
+
+
+
+
+
+ ossrh
+ https://aws.oss.sonatype.org/content/repositories/snapshots
+
+
+
+
+
+ software.amazon.lambda
+ powertools-core
+
+
+ org.aspectj
+ aspectjrt
+
+
+ com.amazonaws
+ aws-lambda-java-events
+
+
+ software.amazon.payloadoffloading
+ payloadoffloading-common
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+
+
+ software.amazon.awssdk
+ sdk-core
+
+
+ software.amazon.awssdk
+ utils
+
+
+ software.amazon.awssdk
+ s3
+
+
+ software.amazon.awssdk
+ netty-nio-client
+
+
+ software.amazon.awssdk
+ apache-client
+
+
+
+
+ software.amazon.awssdk
+ url-connection-client
+ ${aws.sdk.version}
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+ org.junit-pioneer
+ junit-pioneer
+ test
+
+
+ org.mockito
+ mockito-core
+ test
+
+
+ org.mockito
+ mockito-inline
+ test
+
+
+ org.apache.commons
+ commons-lang3
+ test
+
+
+ org.assertj
+ assertj-core
+ test
+
+
+ org.apache.logging.log4j
+ log4j-slf4j2-impl
+ test
+
+
+
+
+
+
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+ eu-central-1
+
+
+
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/LargeMessage.java b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/LargeMessage.java
new file mode 100644
index 000000000..758d7eb45
--- /dev/null
+++ b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/LargeMessage.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.largemessages;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Use this annotation to handle large messages (> 256 KB) from SQS or SNS.
+ * When large messages are sent to an SQS Queue or SNS Topic, they are offloaded to S3 and only a reference is passed in the message/record.
+ *
+ * {@code @LargeMessage} automatically retrieves and deletes messages
+ * which have been offloaded to S3 using the {@code amazon-sqs-java-extended-client-lib} or {@code amazon-sns-java-extended-client-lib}
+ * client libraries.
+ *
+ * This version of the {@code @LargeMessage} is compatible with version
+ * 1.1.0+ of {@code amazon-sqs-java-extended-client-lib} / {@code amazon-sns-java-extended-client-lib}.
+ *
+ * Put this annotation on a method where the first parameter is either a {@link com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage} or {@link com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord}.
+ *
+ * SQS :
+ *
+ * @LargeMessage
+ * private void processRawMessage(SQSMessage sqsMessage, Context context) {
+ * // sqsMessage.getBody() will contain the content of the S3 Object
+ * }
+ *
+ * SNS :
+ *
+ * @LargeMessage
+ * private void processMessage(SNSRecord snsRecord) {
+ * // snsRecord.getSNS().getMessage() will contain the content of the S3 Object
+ * }
+ *
+ *
+ *
+ * To disable the deletion of S3 objects, you can configure the {@code deleteS3Object} option to false (default is true):
+ *
+ * @LargeMessage(deleteS3Object = false)
+ *
+ *
+ *
+ * Note 1 : Retrieving payloads and deleting objects from S3 will increase the duration of the
+ * Lambda function.
+ * Note 2 : Make sure to configure your function with enough memory to be able to retrieve S3 objects.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface LargeMessage {
+
+ /**
+ * Specify if S3 objects must be deleted after being processed (default = true)
+ Alternatively you might consider using S3 lifecycle policies to remove the payloads automatically after a period of time.
+ */
+ boolean deleteS3Object() default true;
+}
diff --git a/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/LargeMessageConfig.java b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/LargeMessageConfig.java
new file mode 100644
index 000000000..fb8ea9b15
--- /dev/null
+++ b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/LargeMessageConfig.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.largemessages;
+
+import static software.amazon.lambda.powertools.core.internal.LambdaConstants.AWS_REGION_ENV;
+
+import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.S3ClientBuilder;
+
+/**
+ * Singleton instance for Large Message Config. We need this to provide a way to customize the S3 client configuration used by the annotation.
+ *
+ * Optional: Use it in your Lambda constructor to pass a custom {@link S3Client} to the {@link software.amazon.lambda.powertools.largemessages.internal.LargeMessageProcessor}
+ *
+ * If you don't use this, a default S3Client will be created.
+ *
+ * public MyLambdaHandler() {
+ * LargeMessageConfig.init().withS3Client(S3Client.create());
+ * }
+ *
+ */
+public class LargeMessageConfig {
+
+ private static final LargeMessageConfig INSTANCE = new LargeMessageConfig();
+ private S3Client s3Client;
+
+ private LargeMessageConfig() {
+ }
+
+ /**
+ * Retrieve the singleton instance (you generally don't need to use this one, used internally by the library)
+ *
+ * @return the singleton instance
+ */
+ public static LargeMessageConfig get() {
+ return INSTANCE;
+ }
+
+ /**
+ * Initialize the singleton instance
+ *
+ * @return the singleton instance
+ */
+ public static LargeMessageConfig init() {
+ return INSTANCE;
+ }
+
+ public void withS3Client(S3Client s3Client) {
+ if (this.s3Client == null) {
+ this.s3Client = s3Client;
+ }
+ }
+
+ // For tests purpose
+ void resetS3Client() {
+ this.s3Client = null;
+ }
+
+ // Getter needs to initialize if not done with setter
+ public S3Client getS3Client() {
+ if (this.s3Client == null) {
+ S3ClientBuilder s3ClientBuilder = S3Client.builder()
+ .httpClient(UrlConnectionHttpClient.builder().build())
+ .region(Region.of(System.getenv(AWS_REGION_ENV)));
+ this.s3Client = s3ClientBuilder.build();
+ }
+ return this.s3Client;
+ }
+}
diff --git a/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/LargeMessageProcessingException.java b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/LargeMessageProcessingException.java
new file mode 100644
index 000000000..20b19230a
--- /dev/null
+++ b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/LargeMessageProcessingException.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.largemessages;
+
+/**
+ * Exception that occurs when the utility fails to retrieve the content from S3
+ */
+public class LargeMessageProcessingException extends RuntimeException {
+ public LargeMessageProcessingException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public LargeMessageProcessingException(String message) {
+ super(message);
+ }
+}
diff --git a/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageAspect.java b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageAspect.java
new file mode 100644
index 000000000..861193203
--- /dev/null
+++ b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageAspect.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.largemessages.internal;
+
+import java.util.Optional;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import software.amazon.lambda.powertools.largemessages.LargeMessage;
+
+/**
+ * Handle {@link LargeMessage} annotations.
+ */
+@Aspect
+public class LargeMessageAspect {
+
+ private static final Logger LOG = LoggerFactory.getLogger(LargeMessageAspect.class);
+
+ @SuppressWarnings({"EmptyMethod"})
+ @Pointcut("@annotation(largeMessage)")
+ public void callAt(LargeMessage largeMessage) {
+ }
+
+ @Around(value = "callAt(largeMessage) && execution(@LargeMessage * *.*(..))", argNames = "pjp,largeMessage")
+ public Object around(ProceedingJoinPoint pjp,
+ LargeMessage largeMessage) throws Throwable {
+ Object[] proceedArgs = pjp.getArgs();
+
+ // we need a message to process
+ if (proceedArgs.length == 0) {
+ LOG.warn("@LargeMessage annotation is placed on a method without any message to process, proceeding");
+ return pjp.proceed(proceedArgs);
+ }
+
+ Object message = proceedArgs[0];
+ Optional> largeMessageProcessor = LargeMessageProcessorFactory.get(message);
+
+ if (!largeMessageProcessor.isPresent()) {
+ LOG.warn("@LargeMessage annotation is placed on a method with unsupported message type [{}], proceeding", message.getClass());
+ return pjp.proceed(proceedArgs);
+ }
+
+ return largeMessageProcessor.get().process(pjp, largeMessage.deleteS3Object());
+ }
+
+}
diff --git a/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageProcessor.java b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageProcessor.java
new file mode 100644
index 000000000..f0e89e631
--- /dev/null
+++ b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageProcessor.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.largemessages.internal;
+
+import static java.lang.String.format;
+
+import java.nio.charset.StandardCharsets;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import software.amazon.awssdk.core.exception.SdkException;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.lambda.powertools.largemessages.LargeMessageConfig;
+import software.amazon.lambda.powertools.largemessages.LargeMessageProcessingException;
+import software.amazon.payloadoffloading.S3BackedPayloadStore;
+import software.amazon.payloadoffloading.S3Dao;
+
+/**
+ * Abstract processor for Large Messages. Handle the download from S3 and replace the actual S3 pointer with the content
+ * of the S3 Object leveraging the payloadoffloading library.
+ *
+ * @param any message type that support Large Messages with S3 pointers
+ * ({@link com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage} and {@link com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord} at the moment)
+ */
+abstract class LargeMessageProcessor {
+ protected static final String RESERVED_ATTRIBUTE_NAME = "ExtendedPayloadSize";
+ private static final Logger LOG = LoggerFactory.getLogger(LargeMessageProcessor.class);
+
+ private final S3Client s3Client = LargeMessageConfig.get().getS3Client();
+ private final S3BackedPayloadStore payloadStore = new S3BackedPayloadStore(new S3Dao(s3Client), "DUMMY");
+
+ public Object process(ProceedingJoinPoint pjp, boolean deleteS3Object) throws Throwable {
+ Object[] proceedArgs = pjp.getArgs();
+ T message = (T) proceedArgs[0];
+
+ if (!isLargeMessage(message)) {
+ LOG.warn("Not a large message, proceeding");
+ return pjp.proceed(proceedArgs);
+ }
+
+ String payloadPointer = getMessageContent(message);
+ if (payloadPointer == null) {
+ LOG.warn("No content in the message, proceeding");
+ return pjp.proceed(proceedArgs);
+ }
+ // legacy attribute (sqs only)
+ payloadPointer = payloadPointer.replace("com.amazon.sqs.javamessaging.MessageS3Pointer", "software.amazon.payloadoffloading.PayloadS3Pointer");
+
+ if (LOG.isInfoEnabled()) {
+ LOG.info("Large message [{}]: retrieving content from S3", getMessageId(message));
+ }
+
+ String s3ObjectContent = getS3ObjectContent(payloadPointer);
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Large message [{}] retrieved in S3 [{}]: {}KB", getMessageId(message), payloadPointer,
+ s3ObjectContent.getBytes(StandardCharsets.UTF_8).length / 1024);
+ }
+
+ updateMessageContent(message, s3ObjectContent);
+ removeLargeMessageAttributes(message);
+
+ Object response = pjp.proceed(proceedArgs);
+
+ if (deleteS3Object) {
+ if (LOG.isInfoEnabled()) {
+ LOG.info("Large message [{}]: deleting object from S3", getMessageId(message));
+ }
+ deleteS3Object(payloadPointer);
+ }
+
+ return response;
+ }
+
+ /**
+ * Retrieve the message id
+ *
+ * @param message the message itself
+ * @return the id of the message (String format)
+ */
+ protected abstract String getMessageId(T message);
+
+ /**
+ * Retrieve the content of the message (ex: body of an SQSMessage)
+ *
+ * @param message the message itself
+ * @return the content of the message (String format)
+ */
+ protected abstract String getMessageContent(T message);
+
+ /**
+ * Update the message content of the message (ex: body of an SQSMessage)
+ *
+ * @param message the message itself
+ * @param messageContent the new content of the message (String format)
+ */
+ protected abstract void updateMessageContent(T message, String messageContent);
+
+ /**
+ * Check if the message is actually a large message (indicator in message attributes)
+ *
+ * @param message the message itself
+ * @return true if the message is a large message
+ */
+ protected abstract boolean isLargeMessage(T message);
+
+ /**
+ * Remove the large message indicator (in message attributes)
+ *
+ * @param message the message itself
+ */
+ protected abstract void removeLargeMessageAttributes(T message);
+
+ private String getS3ObjectContent(String payloadPointer) {
+ try {
+ return payloadStore.getOriginalPayload(payloadPointer);
+ } catch (SdkException e) {
+ throw new LargeMessageProcessingException(format("Failed processing S3 record [%s]", payloadPointer), e);
+ }
+ }
+
+ private void deleteS3Object(String payloadPointer) {
+ try {
+ payloadStore.deleteOriginalPayload(payloadPointer);
+ } catch (SdkException e) {
+ throw new LargeMessageProcessingException(format("Failed deleting S3 record [%s]", payloadPointer), e);
+ }
+ }
+
+}
diff --git a/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageProcessorFactory.java b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageProcessorFactory.java
new file mode 100644
index 000000000..26c33738a
--- /dev/null
+++ b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageProcessorFactory.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.largemessages.internal;
+
+import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord;
+import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage;
+import java.util.Optional;
+
+class LargeMessageProcessorFactory {
+
+ private LargeMessageProcessorFactory() {
+ // not intended to be instantiated
+ }
+
+ public static Optional> get(Object message) {
+ if (message instanceof SQSMessage) {
+ return Optional.of(new LargeSQSMessageProcessor());
+ } else if (message instanceof SNSRecord) {
+ return Optional.of(new LargeSNSMessageProcessor());
+ } else {
+ return Optional.empty();
+ }
+ }
+}
diff --git a/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeSNSMessageProcessor.java b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeSNSMessageProcessor.java
new file mode 100644
index 000000000..1ed7f5eaa
--- /dev/null
+++ b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeSNSMessageProcessor.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.largemessages.internal;
+
+import com.amazonaws.services.lambda.runtime.events.SNSEvent.MessageAttribute;
+import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord;
+import java.util.HashMap;
+import java.util.Map;
+
+class LargeSNSMessageProcessor extends LargeMessageProcessor {
+
+ @Override
+ protected String getMessageId(SNSRecord message) {
+ return message.getSNS().getMessageId();
+ }
+
+ @Override
+ protected String getMessageContent(SNSRecord message) {
+ return message.getSNS().getMessage();
+ }
+
+ @Override
+ protected void updateMessageContent(SNSRecord message, String messageContent) {
+ message.getSNS().setMessage(messageContent);
+ }
+
+ @Override
+ protected boolean isLargeMessage(SNSRecord message) {
+ Map msgAttributes = message.getSNS().getMessageAttributes();
+ return msgAttributes != null && msgAttributes.containsKey(RESERVED_ATTRIBUTE_NAME);
+ }
+
+ @Override
+ protected void removeLargeMessageAttributes(SNSRecord message) {
+ // message.getSNS().getMessageAttributes() does not support remove operation, copy to new map
+ Map newAttributes = new HashMap<>(message.getSNS().getMessageAttributes());
+ newAttributes.remove(RESERVED_ATTRIBUTE_NAME);
+ message.getSNS().setMessageAttributes(newAttributes);
+ }
+}
diff --git a/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeSQSMessageProcessor.java b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeSQSMessageProcessor.java
new file mode 100644
index 000000000..18c99e300
--- /dev/null
+++ b/powertools-large-messages/src/main/java/software/amazon/lambda/powertools/largemessages/internal/LargeSQSMessageProcessor.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.largemessages.internal;
+
+import com.amazonaws.services.lambda.runtime.events.SQSEvent.MessageAttribute;
+import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import software.amazon.awssdk.utils.BinaryUtils;
+import software.amazon.awssdk.utils.Md5Utils;
+
+class LargeSQSMessageProcessor extends LargeMessageProcessor {
+
+ private static final Logger LOG = LoggerFactory.getLogger(LargeSQSMessageProcessor.class);
+ private static final String LEGACY_RESERVED_ATTRIBUTE_NAME = "SQSLargePayloadSize";
+ private static final int INTEGER_SIZE_IN_BYTES = 4;
+ private static final byte STRING_TYPE_FIELD_INDEX = 1;
+ private static final byte BINARY_TYPE_FIELD_INDEX = 2;
+ private static final byte STRING_LIST_TYPE_FIELD_INDEX = 3;
+ private static final byte BINARY_LIST_TYPE_FIELD_INDEX = 4;
+
+ @Override
+ protected String getMessageId(SQSMessage message) {
+ return message.getMessageId();
+ }
+
+ @Override
+ protected String getMessageContent(SQSMessage message) {
+ return message.getBody();
+ }
+
+ @Override
+ protected void updateMessageContent(SQSMessage message, String messageContent) {
+ message.setBody(messageContent);
+ // we update the MD5 digest so it doesn't look tempered
+ message.setMd5OfBody(calculateMessageBodyMd5(messageContent).orElse(message.getMd5OfBody()));
+ }
+
+ @Override
+ protected boolean isLargeMessage(SQSMessage message) {
+ Map msgAttributes = message.getMessageAttributes();
+ return msgAttributes != null && (msgAttributes.containsKey(RESERVED_ATTRIBUTE_NAME) || msgAttributes.containsKey(LEGACY_RESERVED_ATTRIBUTE_NAME));
+ }
+
+ @Override
+ protected void removeLargeMessageAttributes(SQSMessage message) {
+ // message.getMessageAttributes() does not support remove operation, copy to new map
+ Map newAttributes = new HashMap<>(message.getMessageAttributes());
+ newAttributes.remove(RESERVED_ATTRIBUTE_NAME);
+ newAttributes.remove(LEGACY_RESERVED_ATTRIBUTE_NAME);
+ message.setMessageAttributes(newAttributes);
+ // we update the MD5 digest so it doesn't look tempered
+ message.setMd5OfMessageAttributes(calculateMessageAttributesMd5(newAttributes).orElse(message.getMd5OfMessageAttributes()));
+ }
+
+ /**
+ * Compute the MD5 of the message body.
+ * Inspired from {@code software.amazon.awssdk.services.sqs.internal.MessageMD5ChecksumInterceptor}.
+ * package protected for testing purpose.
+ *
+ * @param messageBody body of the SQS Message
+ * @return the MD5 digest of the SQS Message body (or empty in case of error)
+ */
+ static Optional calculateMessageBodyMd5(String messageBody) {
+ byte[] expectedMd5;
+ try {
+ expectedMd5 = Md5Utils.computeMD5Hash(messageBody.getBytes(StandardCharsets.UTF_8));
+ } catch (Exception e) {
+ LOG.warn("Unable to calculate the MD5 hash of the message body. ", e);
+ return Optional.empty();
+ }
+ return Optional.of(BinaryUtils.toHex(expectedMd5));
+ }
+
+ /**
+ * Compute the MD5 of the message attributes.
+ * Inspired from {@code software.amazon.awssdk.services.sqs.internal.MessageMD5ChecksumInterceptor}.
+ * package protected for testing purpose.
+ *
+ * @param messageAttributes attributes of the SQS Message
+ * @return the MD5 digest of the SQS Message attributes (or empty in case of error)
+ */
+ @SuppressWarnings("squid:S4790") // MD5 algorithm is used by SQS, we must use MD5
+ static Optional calculateMessageAttributesMd5(final Map messageAttributes) {
+ List sortedAttributeNames = new ArrayList<>(messageAttributes.keySet());
+ Collections.sort(sortedAttributeNames);
+
+ MessageDigest md5Digest;
+ try {
+ md5Digest = MessageDigest.getInstance("MD5");
+
+ for (String attrName : sortedAttributeNames) {
+ MessageAttribute attrValue = messageAttributes.get(attrName);
+
+ // Encoded Name
+ updateLengthAndBytes(md5Digest, attrName);
+
+ // Encoded Type
+ updateLengthAndBytes(md5Digest, attrValue.getDataType());
+
+ // Encoded Value
+ if (attrValue.getStringValue() != null) {
+ md5Digest.update(STRING_TYPE_FIELD_INDEX);
+ updateLengthAndBytes(md5Digest, attrValue.getStringValue());
+ } else if (attrValue.getBinaryValue() != null) {
+ md5Digest.update(BINARY_TYPE_FIELD_INDEX);
+ updateLengthAndBytes(md5Digest, attrValue.getBinaryValue());
+ } else if (attrValue.getStringListValues() != null &&
+ attrValue.getStringListValues().size() > 0) {
+ md5Digest.update(STRING_LIST_TYPE_FIELD_INDEX);
+ for (String strListMember : attrValue.getStringListValues()) {
+ updateLengthAndBytes(md5Digest, strListMember);
+ }
+ } else if (attrValue.getBinaryListValues() != null &&
+ attrValue.getBinaryListValues().size() > 0) {
+ md5Digest.update(BINARY_LIST_TYPE_FIELD_INDEX);
+ for (ByteBuffer byteListMember : attrValue.getBinaryListValues()) {
+ updateLengthAndBytes(md5Digest, byteListMember);
+ }
+ }
+ }
+ } catch (Exception e) {
+ LOG.warn("Unable to calculate the MD5 hash of the message attributes. ", e);
+ return Optional.empty();
+ }
+
+ return Optional.of(BinaryUtils.toHex(md5Digest.digest()));
+ }
+
+ /**
+ * Update the digest using a sequence of bytes that consists of the length (in 4 bytes) of the
+ * input String and the actual utf8-encoded byte values.
+ */
+ private static void updateLengthAndBytes(MessageDigest digest, String str) {
+ byte[] utf8Encoded = str.getBytes(StandardCharsets.UTF_8);
+ ByteBuffer lengthBytes = ByteBuffer.allocate(INTEGER_SIZE_IN_BYTES).putInt(utf8Encoded.length);
+ digest.update(lengthBytes.array());
+ digest.update(utf8Encoded);
+ }
+
+ /**
+ * Update the digest using a sequence of bytes that consists of the length (in 4 bytes) of the
+ * input ByteBuffer and all the bytes it contains.
+ */
+ private static void updateLengthAndBytes(MessageDigest digest, ByteBuffer binaryValue) {
+ ByteBuffer readOnlyBuffer = binaryValue.asReadOnlyBuffer();
+ int size = readOnlyBuffer.remaining();
+ ByteBuffer lengthBytes = ByteBuffer.allocate(INTEGER_SIZE_IN_BYTES).putInt(size);
+ digest.update(lengthBytes.array());
+ digest.update(readOnlyBuffer);
+ }
+}
diff --git a/powertools-large-messages/src/test/java/software/amazon/lambda/powertools/largemessages/LargeMessageConfigTest.java b/powertools-large-messages/src/test/java/software/amazon/lambda/powertools/largemessages/LargeMessageConfigTest.java
new file mode 100644
index 000000000..b6bcaf6b5
--- /dev/null
+++ b/powertools-large-messages/src/test/java/software/amazon/lambda/powertools/largemessages/LargeMessageConfigTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.largemessages;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.s3.S3Client;
+
+public class LargeMessageConfigTest {
+
+ @BeforeEach
+ public void setup() {
+ LargeMessageConfig.get().resetS3Client();
+ }
+
+ @AfterEach
+ public void tearDown() {
+ LargeMessageConfig.get().resetS3Client();
+ }
+
+ @Test
+ public void singleton_shouldNotChangeWhenCalledMultipleTimes() {
+ LargeMessageConfig.init().withS3Client(S3Client.builder().region(Region.US_EAST_1).build());
+ LargeMessageConfig config = LargeMessageConfig.get();
+
+ LargeMessageConfig.init().withS3Client(null);
+ LargeMessageConfig config2 = LargeMessageConfig.get();
+
+ assertThat(config2).isEqualTo(config);
+ }
+
+ @Test
+ public void singletonWithDefaultClient_shouldNotChangeWhenCalledMultipleTimes() {
+ S3Client s3Client = LargeMessageConfig.get().getS3Client();
+
+ LargeMessageConfig.init().withS3Client(S3Client.create());
+ S3Client s3Client2 = LargeMessageConfig.get().getS3Client();
+
+ assertThat(s3Client2).isEqualTo(s3Client);
+ }
+}
diff --git a/powertools-large-messages/src/test/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageAspectTest.java b/powertools-large-messages/src/test/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageAspectTest.java
new file mode 100644
index 000000000..95dfd445a
--- /dev/null
+++ b/powertools-large-messages/src/test/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageAspectTest.java
@@ -0,0 +1,333 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.largemessages.internal;
+
+import static java.lang.String.format;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.openMocks;
+import static software.amazon.lambda.powertools.largemessages.internal.LargeSQSMessageProcessor.calculateMessageAttributesMd5;
+import static software.amazon.lambda.powertools.largemessages.internal.LargeSQSMessageProcessor.calculateMessageBodyMd5;
+
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.events.KinesisEvent.KinesisEventRecord;
+import com.amazonaws.services.lambda.runtime.events.SNSEvent;
+import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNS;
+import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord;
+import com.amazonaws.services.lambda.runtime.events.SQSEvent.MessageAttribute;
+import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage;
+import java.io.ByteArrayInputStream;
+import java.lang.reflect.Field;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Consumer;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import software.amazon.awssdk.core.ResponseInputStream;
+import software.amazon.awssdk.http.AbortableInputStream;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;
+import software.amazon.awssdk.services.s3.model.GetObjectRequest;
+import software.amazon.awssdk.services.s3.model.GetObjectResponse;
+import software.amazon.awssdk.services.s3.model.S3Exception;
+import software.amazon.lambda.powertools.largemessages.LargeMessage;
+import software.amazon.lambda.powertools.largemessages.LargeMessageConfig;
+import software.amazon.lambda.powertools.largemessages.LargeMessageProcessingException;
+
+public class LargeMessageAspectTest {
+
+ private static final String BIG_MSG = "A biiiiiiiig message";
+ private static final String BIG_MSG_MD5 = "919ebd392d8cb7161f95cb612a903d42";
+
+ private static final String BUCKET_NAME = "bucketname";
+ private static final String BUCKET_KEY = "c71eb2ae-37e0-4265-8909-32f4153faddf";
+
+ private static final String BIG_MESSAGE_BODY = "[\"software.amazon.payloadoffloading.PayloadS3Pointer\", {\"s3BucketName\":\"" + BUCKET_NAME + "\", \"s3Key\":\"" + BUCKET_KEY + "\"}]";
+
+ @Mock
+ private S3Client s3Client;
+ @Mock
+ private Context context;
+
+ @BeforeEach
+ public void init() throws NoSuchFieldException, IllegalAccessException {
+ openMocks(this);
+ setupContext();
+ // need to clean the s3Client with introspection (singleton)
+ Field client = LargeMessageConfig.class.getDeclaredField("s3Client");
+ client.setAccessible(true);
+ client.set(LargeMessageConfig.get(), null);
+ LargeMessageConfig.init().withS3Client(s3Client);
+ }
+
+ @LargeMessage
+ private String processSQSMessage(SQSMessage sqsMessage, Context context) {
+ return sqsMessage.getBody();
+ }
+
+ @LargeMessage
+ private String processSQSMessageWithMd5Checks(SQSMessage transformedMessage, String initialBodyMD5, String initialAttributesMD5) {
+ assertThat(transformedMessage.getMd5OfBody()).isNotEqualTo(initialBodyMD5);
+ assertThat(transformedMessage.getMd5OfBody()).isEqualTo(BIG_MSG_MD5);
+
+ assertThat(transformedMessage.getMessageAttributes()).hasSize(3);
+
+ assertThat(transformedMessage.getMd5OfMessageAttributes()).isNotEqualTo(initialAttributesMD5);
+ return transformedMessage.getBody();
+ }
+
+ @LargeMessage
+ private String processSNSMessageWithoutContext(SNSRecord snsRecord) {
+ return snsRecord.getSNS().getMessage();
+ }
+
+ @LargeMessage(deleteS3Object = false)
+ private String processSQSMessageNoDelete(SQSMessage sqsMessage, Context context) {
+ return sqsMessage.getBody();
+ }
+
+ @LargeMessage
+ private String processKinesisMessage(KinesisEventRecord kinesisEventRecord) {
+ return kinesisEventRecord.getEventID();
+ }
+
+ @LargeMessage
+ private String processNoMessage() {
+ return "Hello World";
+ }
+
+ @Test
+ public void testLargeSQSMessageWithDefaultDeletion() {
+ // given
+ when(s3Client.getObject(any(GetObjectRequest.class))).thenReturn(s3ObjectWithLargeMessage());
+ SQSMessage sqsMessage = sqsMessageWithBody(BIG_MESSAGE_BODY, true);
+
+ // when
+ String message = processSQSMessage(sqsMessage, context);
+
+ // then
+ assertThat(message).isEqualTo(BIG_MSG);
+ ArgumentCaptor delete = ArgumentCaptor.forClass(DeleteObjectRequest.class);
+ verify(s3Client).deleteObject(delete.capture());
+ Assertions.assertThat(delete.getValue())
+ .satisfies((Consumer) deleteObjectRequest -> {
+ assertThat(deleteObjectRequest.bucket())
+ .isEqualTo(BUCKET_NAME);
+
+ assertThat(deleteObjectRequest.key())
+ .isEqualTo(BUCKET_KEY);
+ });
+ }
+
+ @Test
+ public void testLargeSQSMessage_shouldChangeMd5OfBodyAndAttributes() {
+ // given
+ when(s3Client.getObject(any(GetObjectRequest.class))).thenReturn(s3ObjectWithLargeMessage());
+
+ MessageAttribute stringListAttribute = new MessageAttribute();
+ stringListAttribute.setStringListValues(Collections.singletonList("customAttributeValue"));
+ stringListAttribute.setDataType("StringList");
+
+ MessageAttribute binAttribute = new MessageAttribute();
+ binAttribute.setBinaryValue(ByteBuffer.wrap("customAttributeValue".getBytes(StandardCharsets.UTF_8)));
+ binAttribute.setDataType("Binary");
+
+ MessageAttribute listBinAttribute = new MessageAttribute();
+ listBinAttribute.setBinaryListValues(Collections.singletonList(ByteBuffer.wrap("customAttributeValue".getBytes(StandardCharsets.UTF_8))));
+ listBinAttribute.setDataType("BinaryList");
+
+ Map attrs = new HashMap<>();
+ attrs.put("stringListAttribute", stringListAttribute);
+ attrs.put("binAttribute", binAttribute);
+ attrs.put("listBinAttribute", listBinAttribute);
+ SQSMessage sqsMessage = sqsMessageWithBody(BIG_MESSAGE_BODY, true, attrs);
+
+ // when
+ String message = processSQSMessageWithMd5Checks(sqsMessage, sqsMessage.getMd5OfBody(), sqsMessage.getMd5OfMessageAttributes());
+
+ // then
+ assertThat(message).isEqualTo(BIG_MSG);
+ }
+
+ @Test
+ public void testLargeSNSMessageWithDefaultDeletion() {
+ // given
+ when(s3Client.getObject(any(GetObjectRequest.class))).thenReturn(s3ObjectWithLargeMessage());
+ SNSRecord snsRecord = snsRecordWithMessage(BIG_MESSAGE_BODY, true);
+
+ //when
+ String message = processSNSMessageWithoutContext(snsRecord);
+
+ // then
+ assertThat(message).isEqualTo(BIG_MSG);
+ ArgumentCaptor delete = ArgumentCaptor.forClass(DeleteObjectRequest.class);
+ verify(s3Client).deleteObject(delete.capture());
+ Assertions.assertThat(delete.getValue())
+ .satisfies((Consumer) deleteObjectRequest -> {
+ assertThat(deleteObjectRequest.bucket())
+ .isEqualTo(BUCKET_NAME);
+
+ assertThat(deleteObjectRequest.key())
+ .isEqualTo(BUCKET_KEY);
+ });
+ }
+
+ @Test
+ public void testLargeSQSMessageWithNoDeletion_shouldNotDelete() {
+ // given
+ when(s3Client.getObject(any(GetObjectRequest.class))).thenReturn(s3ObjectWithLargeMessage());
+ SQSMessage sqsMessage = sqsMessageWithBody(BIG_MESSAGE_BODY, true);
+
+ // when
+ String message = processSQSMessageNoDelete(sqsMessage, context);
+
+ // then
+ assertThat(message).isEqualTo(BIG_MSG);
+ verify(s3Client, never()).deleteObject(any(DeleteObjectRequest.class));
+ }
+
+ @Test
+ public void testKinesisMessage_shouldProceedWithoutS3() {
+ // given
+ KinesisEventRecord kinesisEventRecord = new KinesisEventRecord();
+ kinesisEventRecord.setEventID("kinesis_id1234567890");
+
+ // when
+ String message = processKinesisMessage(kinesisEventRecord);
+
+ // then
+ assertThat(message).isEqualTo("kinesis_id1234567890");
+ verifyNoInteractions(s3Client);
+ }
+
+ @Test
+ public void testNoMessage_shouldProceedWithoutS3() {
+ // when
+ String message = processNoMessage();
+
+ // then
+ assertThat(message).isEqualTo("Hello World");
+ verifyNoInteractions(s3Client);
+ }
+
+ @Test
+ public void testSmallMessage_shouldProceedWithoutS3() {
+ // given
+ SQSMessage sqsMessage = sqsMessageWithBody("This is small message", false);
+
+ // when
+ String message = processSQSMessage(sqsMessage, context);
+
+ // then
+ assertThat(message)
+ .isEqualTo("This is small message");
+ verifyNoInteractions(s3Client);
+ }
+
+ @Test
+ public void testNullMessage_shouldProceedWithoutS3() {
+ // given
+ SQSMessage sqsMessage = sqsMessageWithBody(null, true);
+
+ // when
+ String message = processSQSMessage(sqsMessage, context);
+
+ // then
+ assertThat(message).isNull();
+ verifyNoInteractions(s3Client);
+ }
+
+ @Test
+ public void testGetS3ObjectException_shouldThrowLargeMessageProcessingException() {
+ // given
+ when(s3Client.getObject(any(GetObjectRequest.class))).thenThrow(S3Exception.create("Permission denied", new Exception("User is not allowed to access bucket " + BUCKET_NAME)));
+ SQSMessage sqsMessage = sqsMessageWithBody(BIG_MESSAGE_BODY, true);
+
+ // when / then
+ assertThatThrownBy(() -> processSQSMessage(sqsMessage, context))
+ .isInstanceOf(LargeMessageProcessingException.class)
+ .hasMessage(format("Failed processing S3 record [%s]", BIG_MESSAGE_BODY));
+ }
+
+ @Test
+ public void testDeleteS3ObjectException_shouldThrowLargeMessageProcessingException() {
+ // given
+ when(s3Client.getObject(any(GetObjectRequest.class))).thenReturn(s3ObjectWithLargeMessage());
+ when(s3Client.deleteObject(any(DeleteObjectRequest.class))).thenThrow(S3Exception.create("Permission denied", new Exception("User is not allowed to access bucket " + BUCKET_NAME)));
+ SQSMessage sqsMessage = sqsMessageWithBody(BIG_MESSAGE_BODY, true);
+
+ // when / then
+ assertThatThrownBy(() -> processSQSMessage(sqsMessage, context))
+ .isInstanceOf(LargeMessageProcessingException.class)
+ .hasMessage(format("Failed deleting S3 record [%s]", BIG_MESSAGE_BODY));
+ }
+
+ private ResponseInputStream s3ObjectWithLargeMessage() {
+ return new ResponseInputStream<>(GetObjectResponse.builder().build(), AbortableInputStream.create(new ByteArrayInputStream(BIG_MSG.getBytes())));
+ }
+
+ private SQSMessage sqsMessageWithBody(String messageBody, boolean largeMessage) {
+ return sqsMessageWithBody(messageBody, largeMessage, null);
+ }
+
+ private SQSMessage sqsMessageWithBody(String messageBody, boolean largeMessage, Map optionalAttributes) {
+ SQSMessage sqsMessage = new SQSMessage();
+ sqsMessage.setBody(messageBody);
+ if (messageBody != null) {
+ sqsMessage.setMd5OfBody(calculateMessageBodyMd5(messageBody).orElseThrow(() -> new RuntimeException("Unable to md5 body " + messageBody)));
+ }
+
+ if (largeMessage) {
+ Map attributeMap = new HashMap<>();
+ if (optionalAttributes != null) {
+ attributeMap.putAll(optionalAttributes);
+ }
+ MessageAttribute payloadAttribute = new MessageAttribute();
+ payloadAttribute.setStringValue("300450");
+ payloadAttribute.setDataType("Number");
+ attributeMap.put(LargeMessageProcessor.RESERVED_ATTRIBUTE_NAME, payloadAttribute);
+
+ sqsMessage.setMessageAttributes(attributeMap);
+ sqsMessage.setMd5OfMessageAttributes(calculateMessageAttributesMd5(attributeMap).orElseThrow(() -> new RuntimeException("Unable to md5 attributes " + attributeMap)));
+ }
+ return sqsMessage;
+ }
+
+ private SNSRecord snsRecordWithMessage(String messageBody, boolean largeMessage) {
+ SNS sns = new SNS().withMessage(messageBody);
+ if (largeMessage) {
+ sns.setMessageAttributes(Collections.singletonMap(LargeMessageProcessor.RESERVED_ATTRIBUTE_NAME, new SNSEvent.MessageAttribute()));
+ }
+ return new SNSRecord().withSns(sns);
+ }
+
+ private void setupContext() {
+ when(context.getFunctionName()).thenReturn("testFunction");
+ when(context.getInvokedFunctionArn()).thenReturn("testArn");
+ when(context.getFunctionVersion()).thenReturn("1");
+ when(context.getMemoryLimitInMB()).thenReturn(1024);
+ }
+}
diff --git a/powertools-large-messages/src/test/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageProcessorFactoryTest.java b/powertools-large-messages/src/test/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageProcessorFactoryTest.java
new file mode 100644
index 000000000..3011c8189
--- /dev/null
+++ b/powertools-large-messages/src/test/java/software/amazon/lambda/powertools/largemessages/internal/LargeMessageProcessorFactoryTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2023 Amazon.com, Inc. or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package software.amazon.lambda.powertools.largemessages.internal;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.amazonaws.services.lambda.runtime.events.KinesisEvent;
+import com.amazonaws.services.lambda.runtime.events.SNSEvent;
+import com.amazonaws.services.lambda.runtime.events.SQSEvent;
+import org.junit.jupiter.api.Test;
+
+public class LargeMessageProcessorFactoryTest {
+
+ @Test
+ public void createLargeSQSMessageProcessor() {
+ assertThat(LargeMessageProcessorFactory.get(new SQSEvent.SQSMessage()))
+ .isPresent()
+ .get()
+ .isInstanceOf(LargeSQSMessageProcessor.class);
+ }
+
+ @Test
+ public void createLargeSNSMessageProcessor() {
+ assertThat(LargeMessageProcessorFactory.get(new SNSEvent.SNSRecord()))
+ .isPresent()
+ .get()
+ .isInstanceOf(LargeSNSMessageProcessor.class);
+ }
+
+ @Test
+ public void createUnknownMessageProcessor() {
+ assertThat(LargeMessageProcessorFactory.get(new KinesisEvent.KinesisEventRecord())).isNotPresent();
+ }
+}
diff --git a/powertools-sqs/pom.xml b/powertools-sqs/pom.xml
index d8afac783..c21943fba 100644
--- a/powertools-sqs/pom.xml
+++ b/powertools-sqs/pom.xml
@@ -29,6 +29,7 @@
Powertools for AWS Lambda (Java) library SQS
+ Deprecated: Batch processing is now handled in powertools-batch and large messages in powertools-large-messages modules.
A suite of utilities for AWS Lambda Functions that makes tracing with AWS X-Ray, structured logging and creating custom metrics asynchronously easier.
https://aws.amazon.com/lambda/
diff --git a/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsLargeMessage.java b/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsLargeMessage.java
index 847dd456c..a3a92cea1 100644
--- a/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsLargeMessage.java
+++ b/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsLargeMessage.java
@@ -20,9 +20,12 @@
import java.lang.annotation.Target;
/**
- * {@code SqsLargeMessage} is used to signal that the annotated method
+ * @deprecated See software.amazon.lambda.powertools.largemessages.LargeMessage in powertools-large-messages module.
+ * Will be removed in version 2.
+ *
+ * {@code SqsLargeMessage} is used to signal that the annotated method
* should be extended to handle large SQS messages which have been offloaded
- * to S3
+ * to S3
*
* {@code SqsLargeMessage} automatically retrieves and deletes messages
* which have been offloaded to S3 using the {@code amazon-sqs-java-extended-client-lib}
@@ -73,6 +76,7 @@
*
To disable deletion of payloads setting the following annotation parameter
* {@code @SqsLargeMessage(deletePayloads=false)}
*/
+@Deprecated
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SqsLargeMessage {
diff --git a/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsUtils.java b/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsUtils.java
index 8c06a6291..ace2a42d6 100644
--- a/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsUtils.java
+++ b/powertools-sqs/src/main/java/software/amazon/lambda/powertools/sqs/SqsUtils.java
@@ -36,7 +36,11 @@
/**
* A class of helper functions to add additional functionality to {@link SQSEvent} processing.
+ *
+ * @deprecated Batch processing is now handled in powertools-batch and large messages in powertools-large-messages .
+ * This class will no longer be available in version 2.
*/
+@Deprecated
public final class SqsUtils {
private static final Logger LOG = LoggerFactory.getLogger(SqsUtils.class);
diff --git a/spotbugs-exclude.xml b/spotbugs-exclude.xml
index 5a5e3bed8..eca7e266f 100644
--- a/spotbugs-exclude.xml
+++ b/spotbugs-exclude.xml
@@ -36,6 +36,10 @@
+
+
+
+
@@ -93,6 +97,10 @@
+
+
+
+