@trkyshorty/node-lzf 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,32 @@
1
+ BSD 2-Clause License
2
+
3
+ Copyright (c) 2011 Ian Babrou <ibobrik@gmail.com>
4
+ Copyright (c) 2025 Türkay Tanrikulu <trky.shorty@gmail.com>
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright notice,
10
+ this list of conditions and the following disclaimer.
11
+
12
+ 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
+ POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ ----------------------------------------------------------------------------
29
+
30
+ This package bundles liblzf by Marc Alexander Lehmann (src/lzf/), which is
31
+ distributed under the BSD 2-Clause license (or alternatively the GPL v2 or
32
+ later). See the license headers in src/lzf/*.h and src/lzf/*.cc for details.
package/README.md CHANGED
@@ -4,81 +4,122 @@
4
4
 
5
5
  LZF advantages:
6
6
 
7
- * Small code size (less then 500 lines including header files and docs).
8
- * Very fast compression speeds, rivaling a straight copy loop, especially for decompression which is basically at (unoptimized) memcpy-speed. Compression speed can be increased by 20% by sacrificing a few percent of compression ratio.
9
- * Mediocre compression ratios - you can usually expect about 40-50% compression for typical binary data
10
- * Easy to use (just two functions, no state attached)
11
- * Highly portable (written in C)
12
- * Tunable, see the file lzfP.h in the distribution, to tailor liblzf to your needs. The generated compressed blocks can be decompressed by any liblzf version regardless of the options used to compress.
13
- * Freely usable (BSD-type-license)
7
+ - Small code size (less then 500 lines including header files and docs).
8
+ - Very fast compression speeds, rivaling a straight copy loop, especially for decompression which is basically at (unoptimized) memcpy-speed. Compression speed can be increased by 20% by sacrificing a few percent of compression ratio.
9
+ - Mediocre compression ratios - you can usually expect about 40-50% compression for typical binary data
10
+ - Easy to use (just two functions, no state attached)
11
+ - Highly portable (written in C)
12
+ - Tunable, see the file lzfP.h in the distribution, to tailor liblzf to your needs. The generated compressed blocks can be decompressed by any liblzf version regardless of the options used to compress.
13
+ - Freely usable (BSD-type-license)
14
+
15
+ ### Install
16
+
17
+ ```bash
18
+ npm install @trkyshorty/node-lzf
19
+ ```
20
+
21
+ The module is N-API based and ships prebuilt binaries (`prebuilds/`) for
22
+ linux-x64, linux-arm64, win32-x64 and darwin-arm64 — no compiler toolchain
23
+ is needed on those platforms. On other platforms it falls back to compiling
24
+ from source via `node-gyp-build` (requires a C++ toolchain).
25
+
26
+ Prebuilds are produced by the `prebuild` GitHub Actions workflow
27
+ (`npm run prebuild` runs `prebuildify --napi --strip` for the current
28
+ platform). Before `npm publish`, download the merged `prebuilds` artifact
29
+ from the workflow run and place it in the package root as `prebuilds/`.
14
30
 
15
31
  ### Usage
16
32
 
17
33
  ```javascript
18
- var lzf = require("lzf");
34
+ const lzf = require('@trkyshorty/node-lzf');
19
35
 
36
+ const data = Buffer.from('some data to compress');
20
37
 
21
- var lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit." +
22
- "Curabitur volutpat, nulla nec egestas semper," +
23
- "ante dui tristique nibh, quis feugiat.";
38
+ // sync — runs on the calling thread
39
+ const compressed = lzf.compress(data);
40
+ const restored = lzf.decompress(compressed, data.length);
24
41
 
25
- // create buffer of your data
26
- var loremBuffer = new Buffer(lorem);
42
+ // async — runs on the libuv thread pool, never blocks the event loop
43
+ const compressed2 = await lzf.compressAsync(data);
44
+ const restored2 = await lzf.decompressAsync(compressed2, data.length);
45
+ ```
27
46
 
28
- // compress your buffer and get another buffer
29
- var loremCompressed = lzf.compress(loremBuffer);
47
+ ### API
30
48
 
31
- // decompress compressed buffer
32
- var loremDecompressed = lzf.decompress(loremCompressed);
49
+ TypeScript definitions are bundled (`index.d.ts`).
33
50
 
34
- ```
51
+ #### `compress(data: Buffer): Buffer`
35
52
 
36
- ### Benchmarks
53
+ Returns an LZF-compressed Buffer sized exactly to the result. Throws
54
+ `TypeError` if `data` is not a Buffer, is empty, or exceeds 1 GiB.
55
+ Note: incompressible input can grow slightly (up to ~104%).
37
56
 
38
- Benchmarks against [compress-buffer](https://github.com/egorFiNE/node-compress-buffer) library. Just to be short: it's faster.
57
+ #### `decompress(data: Buffer, expectedLength: number): Buffer`
39
58
 
59
+ Returns the decompressed Buffer. `expectedLength` is **required** — pass the
60
+ exact decompressed size (or an upper bound); the result is shrunk to the
61
+ actual size. Throws `TypeError`/`RangeError` for invalid arguments
62
+ (`expectedLength` must be an integer between 1 and 1 GiB) and `Error` with
63
+ a descriptive message when the input is corrupted (`corrupted input`) or
64
+ `expectedLength` is too small (`expected length too small`). The
65
+ decompressor is safe on untrusted input: corrupt streams throw instead of
66
+ reading or writing out of bounds.
67
+
68
+ > **v1.1.0 note:** older versions allowed omitting `expectedLength` and
69
+ > silently allocated a 999 MB scratch buffer per call — that default has
70
+ > been removed.
71
+
72
+ #### `compressAsync(data: Buffer): Promise<Buffer>` / `decompressAsync(data: Buffer, expectedLength: number): Promise<Buffer>`
73
+
74
+ Same semantics as the sync variants, but the (de)compression runs on the
75
+ libuv thread pool and the returned promise rejects with the errors the sync
76
+ variants would throw. Prefer these for payloads larger than a few hundred
77
+ KB on latency-sensitive servers.
78
+
79
+ Compressed output is a valid LZF stream decodable by any liblzf build.
80
+ The exact compressed bytes are not guaranteed to be identical across calls
81
+ (liblzf's hash table is intentionally left uninitialized for speed) — only
82
+ the roundtrip contract holds.
83
+
84
+ ### Benchmarks
85
+
86
+ `npm run bench` compares against node's built-in zlib (`deflateRaw`,
87
+ levels 1 and 6) on deterministic datasets. Numbers below from a Windows
88
+ x64 machine, Node 24 (`ratio` = compressed/original; lower is better):
89
+
90
+ ```text
91
+ dataset codec ratio comp ms comp MB/s decomp ms decomp MB/s
92
+ text 100KB lzf 40% 0.158 433 0.094 726
93
+ text 100KB zlib-1 30% 0.354 194 0.122 562
94
+ text 100KB zlib-6 27% 1.421 48 0.120 570
95
+ json 64KB lzf 37% 0.039 917 0.037 963
96
+ json 64KB zlib-1 24% 0.122 291 0.054 658
97
+ json 64KB zlib-6 19% 0.486 73 0.049 722
98
+ json 2MB lzf 36% 1.837 617 1.156 980
99
+ json 2MB zlib-1 24% 4.383 259 1.511 750
100
+ json 2MB zlib-6 18% 17.541 65 1.311 865
101
+ binary 4KB lzf 79% 0.008 509 0.004 904
102
+ binary 4KB zlib-1 72% 0.039 100 0.011 346
103
+ binary 64KB lzf 76% 0.127 493 0.049 1286
104
+ binary 64KB zlib-1 71% 0.660 95 0.127 492
105
+ random 1MB lzf 103% 2.816 355 0.415 2410
106
+ random 1MB zlib-1 100% 15.080 66 0.385 2598
107
+ zeros 1MB lzf 1% 0.273 3660 1.531 653
108
+ zeros 1MB zlib-1 0% 0.350 2861 0.473 2115
40
109
  ```
41
- Testing compression at 100 bytes
42
- lzf-compress x 139,495 ops/sec ±11.88% (58 runs sampled)
43
- zlib-compress x 29,879 ops/sec ±6.88% (88 runs sampled)
44
- Fastest is lzf-compress
45
-
46
- Testing decompression at 100 bytes
47
- lzf-decompress x 36,574 ops/sec ±7.74% (87 runs sampled)
48
- zlib-decompress x 26,153 ops/sec ±6.92% (89 runs sampled)
49
- Fastest is lzf-decompress
50
-
51
- Testing compression at 1000 bytes
52
- lzf-compress x 57,345 ops/sec ±9.49% (81 runs sampled)
53
- zlib-compress x 11,828 ops/sec ±3.93% (60 runs sampled)
54
- Fastest is lzf-compress
55
-
56
- Testing decompression at 1000 bytes
57
- lzf-decompress x 29,221 ops/sec ±7.06% (89 runs sampled)
58
- zlib-decompress x 19,351 ops/sec ±4.77% (92 runs sampled)
59
- Fastest is lzf-decompress
60
-
61
- Testing compression at 10000 bytes
62
- lzf-compress x 10,512 ops/sec ±3.26% (92 runs sampled)
63
- zlib-compress x 1,850 ops/sec ±0.20% (73 runs sampled)
64
- Fastest is lzf-compress
65
-
66
- Testing decompression at 10000 bytes
67
- lzf-decompress x 12,487 ops/sec ±3.85% (91 runs sampled)
68
- zlib-decompress x 6,939 ops/sec ±3.14% (93 runs sampled)
69
- Fastest is lzf-decompress
70
-
71
- Testing compression at 100000 bytes
72
- lzf-compress x 1,628 ops/sec ±1.50% (96 runs sampled)
73
- zlib-compress x 132 ops/sec ±0.13% (93 runs sampled)
74
- Fastest is lzf-compress
75
-
76
- Testing decompression at 100000 bytes
77
- lzf-decompress x 2,472 ops/sec ±1.09% (91 runs sampled)
78
- zlib-decompress x 1,430 ops/sec ±0.73% (95 runs sampled)
79
- Fastest is lzf-decompress
80
- ```
110
+
111
+ In short: LZF compresses 2–10× faster than zlib at its fastest level, at
112
+ the cost of a worse ratio. Pick LZF when compression latency matters more
113
+ than size (hot network paths); pick zlib/brotli for cold storage.
81
114
 
82
115
  ---
116
+
83
117
  ### Authors
84
- - Ian Babrou (ibobrik@gmail.com)
118
+
119
+ - Ian Babrou (`ibobrik@gmail.com`) — original author
120
+ - Türkay Tanrikulu (`trky.shorty@gmail.com`) — fork maintainer
121
+
122
+ ### License
123
+
124
+ BSD-2-Clause, see [LICENSE](LICENSE). Bundles [liblzf](http://oldhome.schmorp.de/marc/liblzf.html)
125
+ by Marc Alexander Lehmann (BSD-2-Clause / GPL dual-licensed).
package/binding.gyp CHANGED
@@ -8,14 +8,16 @@
8
8
  "src/lzf/lzf_d.cc"
9
9
  ],
10
10
  "include_dirs": [
11
- "<!(node -e \"require('nan')\")",
11
+ "<!(node -p \"require('node-addon-api').include_dir\")",
12
12
  "src/lzf"
13
13
  ],
14
+ "defines": [ "NAPI_DISABLE_CPP_EXCEPTIONS" ],
14
15
  "conditions": [
15
16
  [
16
17
  'OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris"',
17
18
  {
18
19
  "cflags": [ "-O3" ],
20
+ "cflags_cc": [ "-O3" ],
19
21
  "conditions": [
20
22
  ["target_arch=='x64'", { "cflags": [ "-fPIC" ] }]
21
23
  ]
package/index.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ /// <reference types="node" />
2
+
3
+ declare namespace lzf {
4
+ /**
5
+ * Compresses a Buffer with LZF. Throws TypeError on invalid input
6
+ * (non-Buffer, empty, or larger than 1 GiB). Runs synchronously on
7
+ * the calling thread.
8
+ */
9
+ function compress(data: Buffer): Buffer;
10
+
11
+ /**
12
+ * Compresses a Buffer with LZF on the libuv thread pool without
13
+ * blocking the event loop. Rejects with the same errors compress()
14
+ * throws.
15
+ */
16
+ function compressAsync(data: Buffer): Promise<Buffer>;
17
+
18
+ /**
19
+ * Decompresses an LZF-compressed Buffer. expectedLength is the exact
20
+ * (or an upper bound of the) decompressed size, between 1 and 1 GiB.
21
+ * Throws TypeError/RangeError on invalid arguments and Error when the
22
+ * input is corrupted or expectedLength is too small.
23
+ */
24
+ function decompress(data: Buffer, expectedLength: number): Buffer;
25
+
26
+ /**
27
+ * Decompresses on the libuv thread pool without blocking the event
28
+ * loop. Rejects with the same errors decompress() throws.
29
+ */
30
+ function decompressAsync(data: Buffer, expectedLength: number): Promise<Buffer>;
31
+ }
32
+
33
+ export = lzf;
package/index.js CHANGED
@@ -1,5 +1,4 @@
1
- try {
2
- module.exports = require('./build/default/lzf.node');
3
- } catch(e) {
4
- module.exports = require('./build/Release/lzf.node');
5
- }
1
+ // Resolves a bundled prebuild for the current platform/arch when available
2
+ // (prebuilds/<platform>-<arch>/node.napi.node), otherwise falls back to a
3
+ // locally compiled build/Release/lzf.node.
4
+ module.exports = require('node-gyp-build')(__dirname);
package/package.json CHANGED
@@ -1,26 +1,48 @@
1
1
  {
2
- "name": "@trkyshorty/node-lzf",
3
- "version": "1.0.0",
4
- "description": "lzf compression module for nodejs (Topface/node-lzf fork with mem-leak fix)",
5
- "keywords": ["lzf", "compression", "buffer"],
6
- "author": "Ian Babrou <ibobrik@gmail.com>",
7
- "engines": [
8
- "node"
9
- ],
10
- "repository": {
11
- "type": "git",
12
- "url": "git+https://github.com/trkyshorty/node-lzf.git"
13
- },
14
- "dependencies": {
15
- "nan": "^2.18.0"
16
- },
17
- "directories": {
18
- "lib": "./lib"
19
- },
20
- "main": "./index",
21
- "gypfile": true,
22
- "scripts": {
23
- "test": "node test/test.js"
24
- },
25
- "license": "BSD-2-Clause"
2
+ "name": "@trkyshorty/node-lzf",
3
+ "version": "1.1.0",
4
+ "description": "lzf compression module for nodejs (Topface/node-lzf fork)",
5
+ "keywords": [
6
+ "lzf",
7
+ "compression",
8
+ "buffer",
9
+ "prebuilds",
10
+ "napi"
11
+ ],
12
+ "author": "Türkay TANRIKULU <trky.shorty@gmail.com>",
13
+ "contributors": [
14
+ "Ian Babrou <ibobrik@gmail.com>"
15
+ ],
16
+ "engines": {
17
+ "node": ">=18"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/trkyshorty/node-lzf.git"
22
+ },
23
+ "dependencies": {
24
+ "node-addon-api": "^8.3.0",
25
+ "node-gyp-build": "^4.8.4"
26
+ },
27
+ "devDependencies": {
28
+ "prebuildify": "^6.0.1"
29
+ },
30
+ "main": "./index.js",
31
+ "types": "./index.d.ts",
32
+ "gypfile": true,
33
+ "files": [
34
+ "index.js",
35
+ "index.d.ts",
36
+ "binding.gyp",
37
+ "src/",
38
+ "prebuilds/",
39
+ "README.md"
40
+ ],
41
+ "scripts": {
42
+ "install": "node-gyp-build",
43
+ "prebuild": "prebuildify --napi --strip",
44
+ "test": "node --test test/test.js",
45
+ "bench": "node benchmark/benchmark.js"
46
+ },
47
+ "license": "BSD-2-Clause"
26
48
  }
package/src/lzf.cc CHANGED
@@ -1,95 +1,301 @@
1
1
  /* node-lzf (C) 2011 Ian Babrou <ibobrik@gmail.com> */
2
2
  /* node-lzf (C) 2025 Maintained Türkay Tanrikulu <trky.shorty@gmail.com> */
3
3
 
4
- #include <node_buffer.h>
5
- #include <stdlib.h>
4
+ #include <napi.h>
6
5
 
7
- #ifdef __APPLE__
8
- #include <malloc/malloc.h>
9
- #endif
6
+ #include <cerrno>
7
+ #include <climits>
8
+ #include <cstdlib>
9
+ #include <string>
10
10
 
11
- #include "nan.h"
12
11
  #include "lzf/lzf.h"
13
12
 
14
- using namespace v8;
15
- using namespace node;
13
+ namespace {
16
14
 
17
- NAN_METHOD(compress) {
18
- if (info.Length() < 1 || !info[0]->IsObject() || !node::Buffer::HasInstance(info[0])) {
19
- return Nan::ThrowTypeError("First argument must be a Buffer");
15
+ /* Hard caps so a bogus length argument can never trigger a multi-GB
16
+ * allocation. 1 GiB is far above any realistic LZF payload. */
17
+ constexpr size_t kMaxInputLength = 1024u * 1024u * 1024u;
18
+ constexpr size_t kMaxOutputLength = 1024u * 1024u * 1024u;
19
+
20
+ /* Worst-case compressed size for an input of n bytes (same formula the
21
+ * original node-lzf used; slightly above the theoretical n + n/32 + 1). */
22
+ inline size_t CompressBound(size_t n) {
23
+ return n + (n / 16) + 64 + 3;
24
+ }
25
+
26
+ struct RawResult {
27
+ char* data = nullptr;
28
+ size_t length = 0;
29
+ };
30
+
31
+ /* Compresses into a malloc'd buffer shrunk to the exact result size.
32
+ * Returns false and fills `error` on failure (buffer already freed). */
33
+ bool DoCompress(const char* input, size_t inputLength, RawResult* out, std::string* error) {
34
+ size_t bound = CompressBound(inputLength);
35
+ char* buffer = static_cast<char*>(malloc(bound));
36
+ if (buffer == nullptr) {
37
+ *error = "Failed to allocate output buffer";
38
+ return false;
20
39
  }
21
40
 
22
- Local<Object> inBuf = Nan::To<Object>(info[0]).ToLocalChecked();
23
- char* dataIn = node::Buffer::Data(inBuf);
24
- size_t lenIn = node::Buffer::Length(inBuf);
41
+ unsigned int compressedLength = lzf_compress(
42
+ input, static_cast<unsigned int>(inputLength),
43
+ buffer, static_cast<unsigned int>(bound));
25
44
 
26
- size_t maxCompressedLen = lenIn + (lenIn / 16) + 64 + 3;
27
- auto maybeBuf = Nan::NewBuffer(maxCompressedLen);
28
- if (maybeBuf.IsEmpty()) {
29
- return Nan::ThrowError("Failed to allocate output buffer");
45
+ if (compressedLength == 0) {
46
+ free(buffer);
47
+ *error = "Compression failed";
48
+ return false;
30
49
  }
31
50
 
32
- Local<Object> outBuf = maybeBuf.ToLocalChecked();
33
- char* outData = node::Buffer::Data(outBuf);
51
+ char* shrunk = static_cast<char*>(realloc(buffer, compressedLength));
52
+ out->data = shrunk != nullptr ? shrunk : buffer;
53
+ out->length = compressedLength;
54
+ return true;
55
+ }
34
56
 
35
- unsigned int compressedLen = lzf_compress(dataIn, lenIn, outData, maxCompressedLen);
36
- if (compressedLen == 0) {
37
- return Nan::ThrowError("Compression failed");
57
+ /* Decompresses into a malloc'd buffer of expectedLength, shrunk to the
58
+ * actual result size. Distinguishes "expected length too small" (E2BIG)
59
+ * from corrupted input via errno set by lzf_decompress. */
60
+ bool DoDecompress(const char* input, size_t inputLength, size_t expectedLength, RawResult* out,
61
+ std::string* error) {
62
+ char* buffer = static_cast<char*>(malloc(expectedLength));
63
+ if (buffer == nullptr) {
64
+ *error = "Failed to allocate output buffer";
65
+ return false;
38
66
  }
39
67
 
40
- // Avoid .Get + .Call + new[]
41
- Local<Function> sliceFn = outBuf->Get(Nan::GetCurrentContext(), Nan::New("slice").ToLocalChecked())
42
- .ToLocalChecked().As<Function>();
43
- Local<Value> args[] = {
44
- Nan::New(0),
45
- Nan::New((uint32_t)compressedLen)
46
- };
47
- Local<Value> sliced = sliceFn->Call(Nan::GetCurrentContext(), outBuf, 2, args).ToLocalChecked();
68
+ errno = 0;
69
+ unsigned int decompressedLength = lzf_decompress(
70
+ input, static_cast<unsigned int>(inputLength),
71
+ buffer, static_cast<unsigned int>(expectedLength));
72
+
73
+ if (decompressedLength == 0) {
74
+ int cause = errno;
75
+ free(buffer);
76
+ *error = cause == E2BIG ? "Decompression failed: expected length too small"
77
+ : "Decompression failed: corrupted input";
78
+ return false;
79
+ }
80
+
81
+ if (decompressedLength < expectedLength) {
82
+ char* shrunk = static_cast<char*>(realloc(buffer, decompressedLength));
83
+ if (shrunk != nullptr) buffer = shrunk;
84
+ }
85
+ out->data = buffer;
86
+ out->length = decompressedLength;
87
+ return true;
88
+ }
89
+
90
+ /* Wraps a malloc'd result as a Buffer without copying when the runtime
91
+ * supports external buffers (plain Node does); falls back to copy+free. */
92
+ Napi::Value WrapResult(Napi::Env env, RawResult* result) {
93
+ return Napi::Buffer<char>::NewOrCopy(
94
+ env, result->data, result->length,
95
+ [](Napi::Env, char* data) { free(data); });
96
+ }
97
+
98
+ /* ---- argument validation ------------------------------------------------ */
48
99
 
49
- info.GetReturnValue().Set(sliced);
100
+ bool ValidateInputBuffer(const Napi::CallbackInfo& info, std::string* error) {
101
+ if (info.Length() < 1 || !info[0].IsBuffer()) {
102
+ *error = "First argument must be a Buffer";
103
+ return false;
104
+ }
105
+ size_t length = info[0].As<Napi::Buffer<char>>().Length();
106
+ if (length == 0) {
107
+ *error = "Input buffer must not be empty";
108
+ return false;
109
+ }
110
+ if (length > kMaxInputLength) {
111
+ *error = "Input buffer exceeds 1 GiB limit";
112
+ return false;
113
+ }
114
+ return true;
50
115
  }
51
116
 
52
- NAN_METHOD(decompress) {
53
- if (info.Length() < 1 || !info[0]->IsObject() || !node::Buffer::HasInstance(info[0])) {
54
- return Nan::ThrowTypeError("First argument must be a Buffer");
117
+ /* expectedLength is required: the legacy default silently allocated a
118
+ * 999 MB buffer per call, which is a footgun rather than a feature. */
119
+ bool ValidateExpectedLength(const Napi::CallbackInfo& info, size_t* expectedLength,
120
+ std::string* error, bool* rangeError) {
121
+ *rangeError = false;
122
+ if (info.Length() < 2 || !info[1].IsNumber()) {
123
+ *error = "Second argument (expectedLength) must be a number";
124
+ return false;
125
+ }
126
+ double raw = info[1].As<Napi::Number>().DoubleValue();
127
+ if (raw != raw /* NaN */ || raw != static_cast<double>(static_cast<int64_t>(raw))) {
128
+ *rangeError = true;
129
+ *error = "expectedLength must be an integer";
130
+ return false;
131
+ }
132
+ int64_t value = static_cast<int64_t>(raw);
133
+ if (value <= 0 || static_cast<uint64_t>(value) > kMaxOutputLength) {
134
+ *rangeError = true;
135
+ *error = "expectedLength must be between 1 and 1 GiB";
136
+ return false;
137
+ }
138
+ *expectedLength = static_cast<size_t>(value);
139
+ return true;
140
+ }
141
+
142
+ /* ---- async workers ------------------------------------------------------ */
143
+
144
+ class CompressWorker : public Napi::AsyncWorker {
145
+ public:
146
+ CompressWorker(Napi::Env env, Napi::Buffer<char> input)
147
+ : Napi::AsyncWorker(env),
148
+ deferred_(Napi::Promise::Deferred::New(env)),
149
+ inputRef_(Napi::Persistent(input.As<Napi::Object>())),
150
+ data_(input.Data()),
151
+ length_(input.Length()) {}
152
+
153
+ Napi::Promise Promise() { return deferred_.Promise(); }
154
+
155
+ protected:
156
+ void Execute() override {
157
+ std::string error;
158
+ if (!DoCompress(data_, length_, &result_, &error)) SetError(error);
159
+ }
160
+
161
+ void OnOK() override { deferred_.Resolve(WrapResult(Env(), &result_)); }
162
+
163
+ void OnError(const Napi::Error& e) override { deferred_.Reject(e.Value()); }
164
+
165
+ private:
166
+ Napi::Promise::Deferred deferred_;
167
+ Napi::ObjectReference inputRef_; // keeps the input buffer alive while the worker runs
168
+ const char* data_;
169
+ size_t length_;
170
+ RawResult result_;
171
+ };
172
+
173
+ class DecompressWorker : public Napi::AsyncWorker {
174
+ public:
175
+ DecompressWorker(Napi::Env env, Napi::Buffer<char> input, size_t expectedLength)
176
+ : Napi::AsyncWorker(env),
177
+ deferred_(Napi::Promise::Deferred::New(env)),
178
+ inputRef_(Napi::Persistent(input.As<Napi::Object>())),
179
+ data_(input.Data()),
180
+ length_(input.Length()),
181
+ expectedLength_(expectedLength) {}
182
+
183
+ Napi::Promise Promise() { return deferred_.Promise(); }
184
+
185
+ protected:
186
+ void Execute() override {
187
+ std::string error;
188
+ if (!DoDecompress(data_, length_, expectedLength_, &result_, &error)) SetError(error);
189
+ }
190
+
191
+ void OnOK() override { deferred_.Resolve(WrapResult(Env(), &result_)); }
192
+
193
+ void OnError(const Napi::Error& e) override { deferred_.Reject(e.Value()); }
194
+
195
+ private:
196
+ Napi::Promise::Deferred deferred_;
197
+ Napi::ObjectReference inputRef_;
198
+ const char* data_;
199
+ size_t length_;
200
+ size_t expectedLength_;
201
+ RawResult result_;
202
+ };
203
+
204
+ /* ---- sync API ----------------------------------------------------------- */
205
+
206
+ Napi::Value Compress(const Napi::CallbackInfo& info) {
207
+ Napi::Env env = info.Env();
208
+
209
+ std::string error;
210
+ if (!ValidateInputBuffer(info, &error)) {
211
+ Napi::TypeError::New(env, error).ThrowAsJavaScriptException();
212
+ return env.Undefined();
213
+ }
214
+
215
+ Napi::Buffer<char> input = info[0].As<Napi::Buffer<char>>();
216
+ RawResult result;
217
+ if (!DoCompress(input.Data(), input.Length(), &result, &error)) {
218
+ Napi::Error::New(env, error).ThrowAsJavaScriptException();
219
+ return env.Undefined();
55
220
  }
221
+ return WrapResult(env, &result);
222
+ }
56
223
 
57
- Local<Object> inBuf = Nan::To<Object>(info[0]).ToLocalChecked();
58
- char* dataIn = node::Buffer::Data(inBuf);
59
- size_t lenIn = node::Buffer::Length(inBuf);
224
+ Napi::Value Decompress(const Napi::CallbackInfo& info) {
225
+ Napi::Env env = info.Env();
60
226
 
61
- size_t expectedOutLen = 999 * 1024 * 1024;
62
- if (info.Length() > 1 && info[1]->IsNumber()) {
63
- expectedOutLen = Nan::To<uint32_t>(info[1]).FromJust();
227
+ std::string error;
228
+ bool rangeError = false;
229
+ size_t expectedLength = 0;
230
+ if (!ValidateInputBuffer(info, &error)) {
231
+ Napi::TypeError::New(env, error).ThrowAsJavaScriptException();
232
+ return env.Undefined();
233
+ }
234
+ if (!ValidateExpectedLength(info, &expectedLength, &error, &rangeError)) {
235
+ if (rangeError) Napi::RangeError::New(env, error).ThrowAsJavaScriptException();
236
+ else Napi::TypeError::New(env, error).ThrowAsJavaScriptException();
237
+ return env.Undefined();
64
238
  }
65
239
 
66
- auto maybeBuf = Nan::NewBuffer(expectedOutLen);
67
- if (maybeBuf.IsEmpty()) {
68
- return Nan::ThrowError("Failed to allocate output buffer");
240
+ Napi::Buffer<char> input = info[0].As<Napi::Buffer<char>>();
241
+ RawResult result;
242
+ if (!DoDecompress(input.Data(), input.Length(), expectedLength, &result, &error)) {
243
+ Napi::Error::New(env, error).ThrowAsJavaScriptException();
244
+ return env.Undefined();
69
245
  }
246
+ return WrapResult(env, &result);
247
+ }
248
+
249
+ /* ---- async API (libuv thread pool; never blocks the event loop) --------- */
250
+
251
+ Napi::Value RejectedPromise(Napi::Env env, const Napi::Error& error) {
252
+ auto deferred = Napi::Promise::Deferred::New(env);
253
+ deferred.Reject(error.Value());
254
+ return deferred.Promise();
255
+ }
70
256
 
71
- Local<Object> outBuf = maybeBuf.ToLocalChecked();
72
- char* outData = node::Buffer::Data(outBuf);
257
+ Napi::Value CompressAsync(const Napi::CallbackInfo& info) {
258
+ Napi::Env env = info.Env();
73
259
 
74
- unsigned int decompressedLen = lzf_decompress(dataIn, lenIn, outData, expectedOutLen);
75
- if (decompressedLen == 0) {
76
- return Nan::ThrowError("Decompression failed");
260
+ std::string error;
261
+ if (!ValidateInputBuffer(info, &error)) {
262
+ return RejectedPromise(env, Napi::TypeError::New(env, error));
77
263
  }
78
264
 
79
- Local<Function> sliceFn = outBuf->Get(Nan::GetCurrentContext(), Nan::New("slice").ToLocalChecked())
80
- .ToLocalChecked().As<Function>();
81
- Local<Value> args[] = {
82
- Nan::New(0),
83
- Nan::New((uint32_t)decompressedLen)
84
- };
85
- Local<Value> sliced = sliceFn->Call(Nan::GetCurrentContext(), outBuf, 2, args).ToLocalChecked();
265
+ auto* worker = new CompressWorker(env, info[0].As<Napi::Buffer<char>>());
266
+ Napi::Promise promise = worker->Promise();
267
+ worker->Queue();
268
+ return promise;
269
+ }
270
+
271
+ Napi::Value DecompressAsync(const Napi::CallbackInfo& info) {
272
+ Napi::Env env = info.Env();
273
+
274
+ std::string error;
275
+ bool rangeError = false;
276
+ size_t expectedLength = 0;
277
+ if (!ValidateInputBuffer(info, &error)) {
278
+ return RejectedPromise(env, Napi::TypeError::New(env, error));
279
+ }
280
+ if (!ValidateExpectedLength(info, &expectedLength, &error, &rangeError)) {
281
+ if (rangeError) return RejectedPromise(env, Napi::RangeError::New(env, error));
282
+ return RejectedPromise(env, Napi::TypeError::New(env, error));
283
+ }
86
284
 
87
- info.GetReturnValue().Set(sliced);
285
+ auto* worker = new DecompressWorker(env, info[0].As<Napi::Buffer<char>>(), expectedLength);
286
+ Napi::Promise promise = worker->Promise();
287
+ worker->Queue();
288
+ return promise;
88
289
  }
89
290
 
90
- NAN_MODULE_INIT(init) {
91
- Nan::SetMethod(target, "compress", compress);
92
- Nan::SetMethod(target, "decompress", decompress);
291
+ Napi::Object Init(Napi::Env env, Napi::Object exports) {
292
+ exports.Set("compress", Napi::Function::New(env, Compress));
293
+ exports.Set("decompress", Napi::Function::New(env, Decompress));
294
+ exports.Set("compressAsync", Napi::Function::New(env, CompressAsync));
295
+ exports.Set("decompressAsync", Napi::Function::New(env, DecompressAsync));
296
+ return exports;
93
297
  }
94
298
 
95
- NODE_MODULE(lzf, init)
299
+ } // namespace
300
+
301
+ NODE_API_MODULE(lzf, Init)
@@ -1,69 +0,0 @@
1
- var lzf = require("../index.js");
2
- var zlib = require("compress-buffer");
3
- var fs = require("fs");
4
- var path = require("path");
5
-
6
-
7
- var Benchmark = require('benchmark');
8
-
9
-
10
- function testCompression(length) {
11
- var data = fs.readFileSync(path.join(__dirname, "data", length + ".txt"));
12
- var suite = new Benchmark.Suite();
13
-
14
- console.log("Testing compression at " + length + " bytes");
15
-
16
- suite.add('lzf-compress', function() {
17
- lzf.compress(data);
18
- });
19
-
20
- suite.add('zlib-compress', function() {
21
- zlib.compress(data);
22
- })
23
-
24
- suite.on('cycle', function(event, bench) {
25
- console.log(String(bench));
26
- });
27
-
28
- suite.on('complete', function() {
29
- console.log('Fastest is ' + this.filter('fastest').pluck('name'));
30
- console.log();
31
- });
32
-
33
- suite.run();
34
- }
35
-
36
- function testDecompression(length) {
37
- var data = fs.readFileSync(path.join(__dirname, "data", length + ".txt"));
38
- var suite = new Benchmark.Suite();
39
- var lzfCompressed = lzf.compress(data);
40
- var zlibCompressed = zlib.compress(data);
41
-
42
- console.log("Testing decompression at " + length + " bytes");
43
-
44
- suite.add('lzf-decompress', function() {
45
- lzf.decompress(lzfCompressed);
46
- });
47
-
48
- suite.add('zlib-decompress', function() {
49
- zlib.uncompress(zlibCompressed);
50
- })
51
-
52
- suite.on('cycle', function(event, bench) {
53
- console.log(String(bench));
54
- });
55
-
56
- suite.on('complete', function() {
57
- console.log('Fastest is ' + this.filter('fastest').pluck('name'));
58
- console.log();
59
- });
60
-
61
- suite.run();
62
- }
63
-
64
- for (var i = 0; i < 4; i++) {
65
- var length = Math.pow(10, i + 2);
66
- testCompression(length);
67
- testDecompression(length);
68
- }
69
-
@@ -1 +0,0 @@
1
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur vitae eros lorem. Duis cras amet.
@@ -1,3 +0,0 @@
1
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum congue sem sed arcu fermentum suscipit. Cras eleifend purus sollicitudin enim condimentum molestie. Aliquam elementum arcu libero. Sed blandit quam luctus sapien ultricies dignissim. Aliquam blandit congue lorem at suscipit. Nulla eleifend volutpat mauris nec cursus. Sed sit amet lectus lorem. Sed tincidunt nunc nec dolor pulvinar imperdiet. Cras tincidunt lectus in orci sodales id congue felis condimentum. In ultricies, magna at viverra volutpat, tortor ante semper mauris, dignissim suscipit nisi risus a nulla.
2
-
3
- Quisque nec urna nibh, ut molestie eros. Nunc lobortis pharetra vestibulum. Mauris facilisis tincidunt turpis, nec condimentum nisi vestibulum ac. Nullam sed odio sed arcu malesuada scelerisque. In hac habitasse platea dictumst. Phasellus risus odio, mollis sed interdum nec, commodo vel est. In porta euismod urna in pulvinar. Fusce suscipit vulputate odio vel venenatis. Vestibulum ante ipsum primis in cras amet.
@@ -1,39 +0,0 @@
1
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nec augue nibh, vitae sagittis mi. Suspendisse elementum dapibus eros nec varius. Ut mollis varius sapien, eget vehicula ipsum ultrices non. Nullam ac erat lectus. Quisque ultricies iaculis ipsum, eget suscipit eros venenatis non. Duis mattis justo in erat volutpat varius. Sed vitae lobortis odio.
2
-
3
- Vestibulum posuere risus quis nisl vehicula adipiscing. Ut vitae mi et urna ultricies egestas ut ut est. Nam lobortis placerat dui, et imperdiet lacus aliquet imperdiet. Sed dapibus nisl ipsum, ac dignissim erat. Nam et nisl vitae nisl egestas vehicula. Vestibulum eget lobortis justo. Etiam laoreet pretium accumsan. Proin dapibus nisi vitae erat dapibus quis ultrices enim sollicitudin.
4
-
5
- Mauris eu sem dui. Integer dignissim mollis massa, ac pharetra enim bibendum ut. Sed tempor quam vitae est aliquam rutrum. Duis aliquet cursus nisi non vestibulum. Sed ac sapien tortor, sed scelerisque enim. Suspendisse odio velit, dapibus nec posuere non, faucibus non nisl. Etiam dignissim sodales nibh ut commodo. Pellentesque non est sed mi elementum sagittis et eget odio.
6
-
7
- Morbi feugiat dictum mollis. Pellentesque ultricies diam quis nisi auctor vitae tristique risus euismod. Sed condimentum feugiat leo sed euismod. Quisque pretium nunc porta arcu viverra convallis quis fringilla arcu. Nam facilisis, lorem a aliquet faucibus, neque elit bibendum erat, eget bibendum ipsum ante et purus. Cras est tellus, vestibulum vitae rutrum vel, ultrices quis sapien. Donec fringilla vehicula eros ac tincidunt. Nulla imperdiet, neque eget posuere aliquam, tortor magna tempus tortor, nec sodales libero turpis eget risus.
8
-
9
- Vivamus auctor ligula nec turpis consectetur euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur turpis tellus, pharetra in lobortis ac, semper sit amet turpis. Quisque dolor est, pulvinar a porttitor non, suscipit ut magna. Suspendisse eget arcu id urna eleifend ullamcorper sit amet id eros. Praesent tincidunt rhoncus tristique. Cras tempor adipiscing arcu eu posuere. Proin vulputate, enim sit amet volutpat facilisis, mi quam venenatis nulla, vitae varius ligula nibh non massa. Sed feugiat nibh et ipsum mollis ac porta urna auctor. Donec mauris mauris, elementum a sodales in, ultricies at tortor. Aenean commodo facilisis euismod. Integer sed urna at tortor cursus ultricies id a ante. In aliquam velit sit amet diam consequat egestas.
10
-
11
- Vivamus ut dui ante, ut posuere turpis. Sed ornare risus quam. Aliquam sit amet ligula felis, ultrices sagittis mauris. Aenean faucibus molestie quam sodales molestie. Cras tincidunt sagittis purus, sed convallis sapien semper ut. Suspendisse luctus dapibus ante at ultricies. Nam at lacus orci. Aliquam mattis, velit in accumsan mattis, metus nisl mattis est, ut tincidunt sapien elit sit amet eros. Cras tempus ultrices feugiat.
12
-
13
- In rhoncus lectus id lorem feugiat eu pulvinar metus scelerisque. Etiam a erat eget dolor facilisis luctus. Pellentesque at odio pretium nisi adipiscing laoreet. Etiam non justo ligula. Nunc mauris sapien, dictum tempor sodales non, pharetra congue mi. Mauris at lacus eu arcu scelerisque varius et ut augue. In consequat justo vitae ante condimentum euismod.
14
-
15
- Aliquam molestie bibendum malesuada. Curabitur scelerisque, augue a bibendum vestibulum, justo massa mattis est, a ullamcorper velit ligula faucibus ligula. Donec sit amet nibh sed nibh malesuada dictum ut ut lectus. Fusce adipiscing urna felis, sed pharetra sapien. Suspendisse potenti. Aenean auctor orci commodo tellus sollicitudin dignissim. Donec posuere venenatis vulputate.
16
-
17
- Mauris non ipsum turpis. Cras euismod, lectus sed commodo vulputate, lacus mi sodales risus, non sodales lorem justo sed erat. Mauris non adipiscing lorem. Phasellus at est quis metus auctor hendrerit. Cras sed purus erat, id dignissim elit. In sed est diam. Fusce id diam lorem, vel auctor nunc. Pellentesque mattis sollicitudin blandit. Phasellus vitae justo non sem gravida iaculis. Etiam cursus nisl nec sem mollis ac congue sapien pellentesque. In eu est urna.
18
-
19
- Cras luctus bibendum feugiat. Sed varius, libero ornare dictum tempor, turpis quam mattis purus, nec pulvinar tellus odio nec metus. Pellentesque tempus vulputate fermentum. Proin porttitor viverra pretium. Donec interdum magna et augue vehicula non faucibus quam vehicula. Ut euismod, turpis eu vehicula gravida, augue ligula auctor nisl, non interdum felis mauris at nisi. Sed vulputate eleifend nisl, et consectetur sapien dignissim sit amet.
20
-
21
- Proin elit est, congue vel sollicitudin ac, molestie sed justo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nulla facilisi. Duis est odio, sollicitudin a feugiat a, blandit eget felis. Vivamus vitae pharetra nisi. Vestibulum condimentum dui et ligula aliquam pretium. Nulla non dapibus metus. Suspendisse potenti. Aenean molestie hendrerit nulla, vel posuere nisi eleifend non. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed mauris dui, adipiscing quis vestibulum a, vestibulum ut lectus. Ut sit amet est nisl, a aliquam nulla. Nullam libero ipsum, consequat id pharetra sit amet, commodo at neque. Donec eget bibendum est.
22
-
23
- Cras fermentum porttitor massa, nec convallis massa consequat at. Morbi eu vehicula orci. Aenean ultricies faucibus sapien eget dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nunc in quam id leo interdum consectetur vitae interdum quam. Donec scelerisque purus et metus posuere eget viverra justo facilisis. Nam at eros sit amet sapien vehicula bibendum ut id enim. Vivamus rhoncus malesuada justo at ultricies. Nulla congue leo iaculis erat tempor tempor. Vivamus sagittis, elit ac faucibus tristique, leo odio adipiscing lorem, a volutpat lacus mi ac erat. Nulla facilisi. Nullam scelerisque auctor gravida. Proin a magna dolor. Morbi congue, nunc nec volutpat dictum, lorem odio consequat neque, vulputate egestas tortor elit eu neque.
24
-
25
- Duis a nisi condimentum sem laoreet condimentum. Curabitur malesuada felis eget velit rutrum tincidunt. Nulla placerat laoreet placerat. Aliquam suscipit consequat elementum. Etiam pellentesque porttitor aliquam. Mauris non massa ut dui tincidunt sodales varius vitae eros. Quisque imperdiet aliquam orci, et suscipit metus facilisis vel.
26
-
27
- Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum in massa eu augue lobortis volutpat non sit amet enim. Vestibulum quis ante tellus. Curabitur in arcu a ipsum commodo cursus. Pellentesque id lorem odio. Vivamus consequat purus in magna aliquet at tincidunt turpis varius. Praesent sed nunc quam, vel varius sem. Aenean eget vehicula massa. Aliquam posuere, massa non placerat molestie, magna orci aliquam justo, luctus ullamcorper ligula leo a quam.
28
-
29
- Donec id leo sit amet nisl sollicitudin ultricies. Suspendisse blandit rutrum risus vel dictum. Duis tempus metus et risus ornare ut volutpat ligula ultrices. Proin accumsan tellus id felis elementum ornare. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis consequat justo at enim interdum a pretium justo suscipit. Nullam sit amet sapien placerat risus ultrices tincidunt.
30
-
31
- Maecenas dignissim lacus non tortor scelerisque fringilla. Nulla facilisis diam non augue faucibus elementum. Maecenas vel magna lacus. Aliquam pretium semper dui, a fringilla ligula bibendum et. Pellentesque commodo metus id lectus lobortis eget feugiat enim scelerisque. Praesent accumsan iaculis ligula, et hendrerit sapien ultricies quis. In congue mauris a odio facilisis porttitor. Fusce vitae facilisis magna. Nam urna erat, feugiat at bibendum a, pretium a massa.
32
-
33
- Suspendisse arcu lectus, sollicitudin nec ultrices eu, venenatis sit amet nulla. Quisque consequat tortor sed ligula tempor tristique. Cras ipsum dolor, congue vitae hendrerit eget, ornare eget metus. Suspendisse potenti. Morbi rhoncus rhoncus velit, et ultrices mi condimentum sed. Nullam metus justo, tempor a vestibulum eu, pellentesque in enim. Curabitur scelerisque, est non congue iaculis, magna lorem pretium nisl, ac aliquet nibh neque eu augue. Etiam vel arcu ut urna rutrum imperdiet. Aliquam semper nulla eget mi vulputate ac ornare tellus suscipit. Nunc vitae risus ac elit rutrum sodales vitae et velit. Duis in nibh a mi pharetra pulvinar. Nunc egestas, turpis vel ullamcorper luctus, nulla ligula ullamcorper dolor, accumsan egestas quam purus nec nisi. Donec sit amet dolor non dui semper euismod vitae non lectus. Vestibulum vel urna vel diam dignissim bibendum. Sed non justo in urna dignissim laoreet. Nulla rhoncus auctor blandit.
34
-
35
- Suspendisse leo enim, dictum ut malesuada in, tempus sed purus. Integer commodo rutrum nisl id ullamcorper. Fusce imperdiet felis vel mauris imperdiet eget volutpat nibh pretium. Integer sit amet ipsum id nunc ullamcorper gravida ac facilisis purus. Etiam non enim purus, vel sagittis felis. Aliquam erat volutpat. Nunc eget ante eu magna egestas fringilla. Vivamus vel sem felis. Nullam tincidunt sapien vel nunc ullamcorper non feugiat turpis molestie.
36
-
37
- Donec mattis faucibus quam non fermentum. Aenean volutpat leo et metus gravida accumsan. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec eleifend dui et ipsum tempus dictum. Sed eget nisl sit amet nisi sollicitudin adipiscing nec ac turpis. Suspendisse potenti. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce laoreet lacus vel mi tempor convallis. Aenean viverra auctor lobortis.
38
-
39
- Nunc consectetur mattis dui, quis fermentum lectus feugiat tincidunt. Fusce tempus quam in dui malesuada quis semper ante tempus. Aliquam eget turpis et neque facilisis ornare. Sed rutrum, sem et euismod aliquam, arcu dolor bibendum erat, quis rutrum elit leo vel massa. Nam felis ipsum, varius in posuere id, interdum vel posuere.
@@ -1,247 +0,0 @@
1
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam ac enim eget lacus venenatis pulvinar ac sit amet tortor. In euismod, magna tempus feugiat auctor, ante leo tempus lorem, vel blandit tellus massa suscipit neque. Pellentesque ac mi libero, non tristique justo. Maecenas nunc elit, condimentum non feugiat ut, porta ullamcorper quam. Nunc scelerisque blandit augue, sit amet tristique est mollis non. Integer sed ipsum sed metus rhoncus aliquet. Etiam faucibus ipsum faucibus purus placerat ut volutpat arcu rutrum. Aliquam ac lectus at ligula ullamcorper sollicitudin sed eu libero. Aliquam eleifend ipsum urna, ut tempus justo. In facilisis libero quis tortor scelerisque et feugiat quam ultricies. Nullam feugiat odio eu ipsum pharetra faucibus. Quisque hendrerit euismod diam id rhoncus. Vivamus ultricies fermentum sapien et varius.
2
-
3
- Nunc id lacus quis ipsum lobortis ultrices eu sit amet purus. Pellentesque consectetur turpis in velit semper tristique. Phasellus non turpis ac lectus varius facilisis at nec elit. Donec eleifend mattis tellus ac ultricies. In hac habitasse platea dictumst. Sed urna massa, fringilla id elementum id, dapibus ac tortor. Sed bibendum varius varius.
4
-
5
- Etiam molestie adipiscing ante a commodo. Nulla facilisi. Cras ac venenatis risus. Duis ultrices mollis purus ut dictum. Ut egestas, ligula vitae interdum pretium, arcu lectus placerat velit, vitae blandit sapien nunc quis libero. In hac habitasse platea dictumst. Pellentesque semper tellus eget sapien aliquam eu ornare elit auctor. Ut sit amet mi neque. Sed euismod viverra ipsum. Nulla et porttitor nibh.
6
-
7
- Fusce tempor vulputate nibh, sed fermentum libero lobortis ut. Duis quis dolor tortor. Nunc consequat metus et neque posuere sit amet sodales enim viverra. Vivamus dignissim, arcu sed ultricies venenatis, orci neque scelerisque augue, egestas semper nulla nunc non dolor. Nulla facilisi. Fusce interdum rutrum facilisis. Aliquam erat volutpat. Quisque porta urna a nunc suscipit vehicula. Praesent aliquam convallis ligula. Mauris vel augue metus. Pellentesque condimentum, erat eu volutpat accumsan, urna ligula sollicitudin lorem, nec scelerisque justo est sed enim. Duis scelerisque odio eu magna dignissim sed malesuada est condimentum. Nullam ultricies dolor in felis vestibulum aliquet. Nulla at nulla nisl. Nulla accumsan ligula sed dui dignissim sagittis. Nam turpis nibh, iaculis ac lacinia ac, tempus a lectus.
8
-
9
- Nam sed turpis elit, nec feugiat magna. Morbi sodales, neque vitae auctor pretium, sapien turpis laoreet dui, quis tincidunt ligula sapien non est. Sed iaculis placerat dui vel pulvinar. Mauris pretium ligula id justo facilisis venenatis. Vivamus quis enim venenatis risus ornare vulputate at a enim. Maecenas ac metus vitae nisl eleifend congue et ac leo. Nunc quis nisi eu arcu facilisis commodo. Ut dolor libero, facilisis sed eleifend nec, luctus in sem. Aenean ultrices nisi sed mauris blandit facilisis.
10
-
11
- Proin scelerisque magna ultricies ante lacinia dapibus. Quisque mauris purus, lobortis nec fermentum sit amet, elementum ac ipsum. Aliquam vestibulum, sapien in sodales blandit, lorem lectus posuere enim, quis cursus mi lorem at neque. Nunc auctor auctor magna a cursus. Suspendisse potenti. Nullam feugiat tristique urna ut adipiscing. Donec vel enim in est pretium malesuada. In a sapien ipsum. Nulla facilisi. Sed adipiscing faucibus enim, ut tempus nunc volutpat non. Quisque at felis ac metus convallis tempus. Vestibulum laoreet elit sit amet nisi bibendum egestas. Nullam accumsan malesuada diam, in fermentum purus fermentum in. Morbi dignissim tincidunt tristique.
12
-
13
- Duis ac erat vel purus tincidunt ultrices ac quis felis. Suspendisse dignissim rhoncus velit, at semper magna rhoncus non. Sed ipsum tortor, vehicula sed ultrices eget, ornare congue risus. In hac habitasse platea dictumst. Mauris magna nisl, volutpat eu pellentesque ut, aliquet ac dui. Mauris malesuada dolor eget arcu interdum imperdiet. Maecenas quis augue est. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec imperdiet arcu enim. Sed in diam in risus lobortis facilisis. Curabitur quis mollis mauris. Proin orci mauris, euismod quis pretium in, mattis vitae metus. Curabitur ligula odio, fermentum et tempus ut, posuere ac elit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse augue sem, iaculis congue varius nec, aliquet vel est.
14
-
15
- Proin nec arcu nulla, nec sodales arcu. Fusce eu justo vitae lacus tempus egestas eu non massa. Cras enim lorem, consequat id feugiat in, ornare ut elit. Maecenas lacinia nisi at risus hendrerit rhoncus. Morbi neque lorem, condimentum nec porttitor id, viverra sit amet odio. Donec pretium lobortis placerat. Integer eget adipiscing est. Fusce vitae sem eget lectus consectetur mattis. Nam at nunc quis odio tincidunt laoreet sit amet faucibus libero. Vestibulum eros dolor, pretium eget blandit consequat, molestie at neque. Proin vehicula, augue vitae consequat mollis, urna orci pretium felis, et cursus enim ipsum at lectus. Fusce quis sem vitae risus ullamcorper suscipit eget ac ipsum.
16
-
17
- Proin non lacinia arcu. Fusce congue porttitor tortor, nec bibendum sapien dapibus quis. Fusce ullamcorper, arcu ut sodales ullamcorper, magna nisi tincidunt neque, at aliquet lacus sapien in tellus. Morbi consectetur tellus nec lectus porta at gravida neque euismod. Etiam aliquam rhoncus purus eget pharetra. Suspendisse et lacus orci. Maecenas pharetra tincidunt pellentesque. Sed faucibus condimentum bibendum.
18
-
19
- Donec in nulla odio, sit amet aliquam lectus. Vivamus sed odio eros, sed porta justo. Aliquam cursus lorem neque, sit amet ultrices turpis. Integer ultrices pharetra orci in ornare. Sed vitae nunc et magna sagittis aliquet. Suspendisse potenti. Proin blandit nisi vitae dui mattis dapibus. Sed at purus massa, non convallis metus. Aenean malesuada arcu id enim sodales condimentum. Morbi dapibus lorem quis tellus varius rutrum. Suspendisse sit amet turpis justo. Nullam sed enim ipsum, ac bibendum erat. Nulla porta dolor et massa molestie ultricies. Duis convallis lorem sed velit feugiat volutpat. Sed at volutpat magna. Nunc enim felis, faucibus vitae feugiat eu, porttitor eu mi.
20
-
21
- Nunc scelerisque condimentum nunc, eget hendrerit sem eleifend vitae. Quisque justo velit, egestas vel ullamcorper fringilla, ultricies a nibh. Phasellus cursus accumsan nunc. Donec ut vestibulum nibh. Aliquam massa leo, congue eu tristique nec, commodo nec felis. Proin a nibh vel libero ultrices aliquet varius a erat. Integer ut dolor ligula. Etiam vitae nisi leo.
22
-
23
- Donec eu sem eget odio auctor laoreet sed molestie tortor. Sed vitae purus vel purus venenatis bibendum a eu nibh. Phasellus tristique ante in elit bibendum et hendrerit nibh auctor. Ut ullamcorper tortor eget ligula auctor varius. Nullam quis nunc urna. Nulla facilisi. Mauris accumsan nisl mi. Ut vestibulum quam a massa rutrum consequat. Duis non sapien erat, malesuada pharetra mauris. Aenean neque libero, vulputate vel fringilla in, egestas vitae velit.
24
-
25
- Donec vitae nisl ipsum. Pellentesque rhoncus laoreet neque nec aliquet. Sed eget auctor mauris. Quisque interdum ullamcorper laoreet. Nulla enim neque, vulputate quis molestie quis, dictum non magna. Quisque accumsan vehicula orci vitae imperdiet. Suspendisse justo augue, tempus nec scelerisque eget, tincidunt sed dolor. Pellentesque porta, sem imperdiet lobortis convallis, leo ipsum condimentum sem, at ullamcorper est lectus vitae nisi. Donec quam est, sagittis vitae aliquet non, iaculis a dolor.
26
-
27
- Maecenas sapien dolor, viverra in adipiscing in, adipiscing quis augue. Nullam vel ipsum at justo malesuada iaculis a eu quam. Maecenas venenatis mi quam, vitae mattis felis. Praesent lacinia leo vitae enim ullamcorper id tincidunt augue pellentesque. Ut mauris enim, dignissim vel lacinia egestas, molestie at urna. Aliquam sit amet tortor eu magna dignissim cursus a ac enim. Morbi tristique, libero quis suscipit malesuada, eros elit imperdiet nibh, vulputate venenatis est eros eget velit. Donec egestas sagittis libero, at porta nisl pharetra sed. Vestibulum neque est, congue ac ullamcorper ut, eleifend at enim. Fusce fringilla facilisis neque, sit amet facilisis sapien commodo ultrices. Mauris ac orci sit amet purus tincidunt viverra.
28
-
29
- Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque convallis dictum tellus vel euismod. Phasellus sollicitudin facilisis euismod. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nunc a odio vel neque lacinia ultrices. Cras ac sagittis augue. Nam ornare, dui ut vestibulum mollis, arcu elit varius ipsum, sed vulputate lacus nulla ac velit. Sed vitae neque augue, iaculis tristique orci. Morbi commodo ipsum lorem. Aliquam erat volutpat. Vivamus aliquam interdum sem in mollis. Duis quis lacus felis.
30
-
31
- Aenean eget vestibulum felis. Donec eu suscipit quam. Ut pharetra tristique nibh id aliquet. Aenean tortor arcu, auctor eget tincidunt non, hendrerit id orci. Proin egestas libero eget lacus cursus laoreet. Etiam metus est, tincidunt ac pulvinar ut, ornare placerat nibh. Ut enim dolor, sollicitudin quis pretium in, tincidunt ac sem. Nulla felis purus, blandit id placerat quis, ultricies ut sem. Vivamus tristique felis a lacus commodo posuere. Mauris vel pharetra arcu. Maecenas fermentum, felis sit amet faucibus varius, sapien orci mattis libero, a eleifend eros est at turpis.
32
-
33
- Maecenas consequat luctus euismod. Vivamus eget augue nisl. Donec vitae convallis metus. Nullam a risus ipsum, nec luctus augue. Curabitur ultrices odio ac libero egestas sed mollis ipsum tempor. Sed commodo facilisis tincidunt. Praesent consectetur tortor eget metus bibendum feugiat. Aenean placerat, ligula vel suscipit blandit, leo ipsum commodo libero, id auctor eros dolor ut lacus. Nulla felis lorem, dictum at rutrum ut, suscipit non dolor. Curabitur gravida, dolor id aliquam gravida, leo purus ullamcorper sapien, eget hendrerit lorem eros vitae nunc. Pellentesque viverra scelerisque lacus non consequat. Nullam congue mollis dui, id vulputate magna vehicula eget. Ut velit risus, mattis eget gravida euismod, commodo sit amet quam. Maecenas tempor ante eu turpis fermentum ultrices accumsan felis egestas. Etiam neque ligula, dictum vitae tristique et, commodo et augue.
34
-
35
- Phasellus id tortor lectus, quis posuere risus. Praesent at nunc tortor. Praesent pellentesque metus ut libero varius porttitor. Duis elementum interdum blandit. Nullam pulvinar magna nec neque vulputate vitae vestibulum elit tempor. Nullam a risus massa, a vestibulum sapien. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In fringilla cursus est malesuada iaculis. Vivamus laoreet tempus lacus id luctus. Fusce lacinia nibh non orci eleifend consectetur. Ut eu lacus non nunc feugiat imperdiet ac et nibh. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec ac magna risus, vitae pretium justo. Sed vitae rutrum orci.
36
-
37
- Donec ut purus sit amet nisl imperdiet dapibus ut consectetur eros. Nam et mi eget nibh sodales ullamcorper vitae eget eros. Etiam in nisi diam. Nulla venenatis ullamcorper nibh, sed placerat risus pretium id. Curabitur aliquet, elit id convallis interdum, nulla erat interdum nibh, ut porta nibh dui eu elit. Phasellus pharetra mattis faucibus. Nullam mi tortor, laoreet eu consectetur id, congue vitae sapien. Morbi eleifend lorem non sem auctor et porttitor nulla viverra. Maecenas congue, diam cursus accumsan cursus, diam nulla vulputate orci, at facilisis risus metus non dolor. Maecenas et felis sit amet tortor porttitor suscipit.
38
-
39
- Aliquam erat volutpat. Vestibulum non justo eu nisl sagittis tempus. In varius commodo pharetra. Cras ut viverra metus. Donec id nulla vel augue adipiscing pretium. Pellentesque ac risus quis dui tempor pharetra. Donec vulputate, justo sed auctor euismod, libero nunc consequat dolor, in dictum eros elit in purus. Donec consequat ultricies dignissim. Phasellus non nibh eros, id pulvinar enim.
40
-
41
- Nulla et cursus felis. Phasellus pulvinar pharetra odio, vitae lobortis arcu mattis iaculis. Ut venenatis velit at augue bibendum ullamcorper. Ut consectetur odio sed felis gravida lobortis. Curabitur nec massa eget nibh placerat tempus sit amet ut dui. Nulla feugiat adipiscing odio, at mattis ante ultricies et. Donec scelerisque, sapien ut hendrerit ultricies, quam urna lacinia nulla, ac gravida magna urna vitae nibh. Mauris viverra, dolor a fringilla hendrerit, augue enim vulputate neque, eu porttitor diam lorem nec urna. Vestibulum consectetur malesuada dapibus.
42
-
43
- Quisque sodales aliquam turpis. Mauris malesuada suscipit vehicula. Proin tristique enim quis risus aliquam ornare. Pellentesque aliquet blandit sagittis. Aliquam pretium sagittis mi a pulvinar. Vivamus tempus elit ut neque dapibus sit amet rutrum odio scelerisque. In justo elit, dapibus non rhoncus eget, pulvinar non sapien. Etiam in velit metus, ut hendrerit est.
44
-
45
- Quisque scelerisque iaculis pulvinar. Morbi mauris sapien, volutpat eget venenatis eget, interdum quis ipsum. Mauris pharetra urna non leo pretium viverra dapibus turpis congue. Vestibulum ultrices elit sit amet sapien molestie feugiat. In hac habitasse platea dictumst. Nunc scelerisque consequat elementum. Pellentesque vulputate lacinia libero, sit amet faucibus massa scelerisque id.
46
-
47
- In placerat elementum tortor, sed volutpat purus aliquam eu. Proin eu congue quam. Nunc malesuada eros eget quam feugiat non scelerisque purus accumsan. Maecenas vitae justo ac sem pretium iaculis id vitae est. Sed accumsan, tortor a accumsan varius, justo orci aliquam nisi, a placerat ligula diam non turpis. Suspendisse non tortor ligula. Quisque a libero euismod felis feugiat pulvinar. Mauris tempor orci et risus semper vitae volutpat nulla tempor. Sed posuere tincidunt pellentesque. Phasellus lectus orci, semper ut fermentum in, ullamcorper eu metus. Nullam tempor consequat tortor eget iaculis. Suspendisse quis metus purus.
48
-
49
- Nulla sit amet congue ligula. Integer quis nisl nec mi adipiscing eleifend nec quis leo. Suspendisse a massa eget nisl ultricies eleifend auctor non lorem. Mauris tincidunt tristique cursus. Proin sit amet lectus sit amet urna pretium mollis. Nulla vitae tortor a nisl pellentesque porta vitae quis ipsum. Suspendisse cursus, lacus aliquet luctus hendrerit, erat nibh congue eros, ut euismod mauris nibh a lacus. Pellentesque elementum luctus luctus.
50
-
51
- Morbi id nibh nulla. Aenean tristique enim ac turpis consequat ut tincidunt est egestas. Donec tincidunt venenatis nulla, ac interdum felis varius vitae. Praesent sed dolor ac nunc consequat feugiat sed sed mi. Cras a lorem sed arcu consequat condimentum ac vel est. Vivamus at mauris tellus, eget egestas augue. Sed id rutrum nulla. Nunc placerat sapien libero, vitae convallis dolor. Nunc et erat eros. Mauris accumsan nulla nec nunc gravida vehicula.
52
-
53
- Praesent porta, nibh at sagittis suscipit, leo magna sodales sem, sit amet pharetra ipsum risus non orci. Duis ullamcorper pulvinar dui vitae auctor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nunc dapibus orci non lorem euismod at tempor mi malesuada. Donec sit amet orci sed dui volutpat suscipit. Phasellus leo velit, fringilla sit amet tristique nec, congue ac tortor. Pellentesque viverra massa sit amet enim tincidunt placerat.
54
-
55
- Aenean malesuada tristique tellus, faucibus sagittis metus dignissim a. Nunc luctus dictum risus, in condimentum erat condimentum nec. Vestibulum ullamcorper ornare lectus, sed tempus velit consequat in. Sed sollicitudin mauris in augue posuere dapibus. Nam a porta orci. Duis commodo lectus id nisi suscipit blandit. Pellentesque felis dolor, lacinia in commodo ut, suscipit vel risus. Aliquam malesuada mattis condimentum. Aliquam ac lorem tellus. Praesent vitae sem at lacus luctus euismod. Ut vel imperdiet ligula. Integer risus magna, condimentum in tempor quis, consequat sed est. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
56
-
57
- Ut a arcu risus, semper elementum odio. Curabitur porttitor nibh facilisis est pellentesque scelerisque. Vestibulum nec dolor vitae purus dictum consectetur. Nunc tincidunt libero nec eros placerat tempor vel quis erat. Curabitur non dolor hendrerit eros posuere interdum vitae in leo. Fusce commodo elementum consequat. Maecenas suscipit tellus vel velit auctor ut volutpat justo cursus. Suspendisse tempus mollis purus, vitae vulputate lectus mattis pellentesque.
58
-
59
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam interdum hendrerit lacus eu placerat. Donec orci velit, commodo eget semper quis, aliquet et est. Quisque eu nibh ut urna lacinia pulvinar. Vestibulum quis orci placerat sapien egestas dignissim. Nam molestie dapibus metus sit amet gravida. Sed nec lorem purus. Donec hendrerit risus ut metus volutpat lacinia. Aliquam vel lorem purus, et euismod est. Fusce laoreet dictum dolor, vel lacinia justo suscipit nec. Etiam lobortis nisi nec felis dictum imperdiet. Aliquam at lacus id tortor luctus venenatis.
60
-
61
- Etiam pellentesque, magna sed bibendum vestibulum, lectus risus iaculis tortor, vel cursus justo magna vel metus. Duis ac condimentum sem. Maecenas sit amet nisi augue, ut pharetra nulla. Vivamus quis massa vel nunc condimentum vehicula. Nullam pharetra nunc erat, vitae sagittis tellus. Nulla facilisi. In hac habitasse platea dictumst. Praesent vel orci arcu. Donec purus odio, rutrum et tristique vel, cursus ut sapien. Mauris turpis sem, eleifend ut gravida sodales, fermentum ac orci. Etiam feugiat volutpat diam ut condimentum. Donec quis risus at sapien iaculis pellentesque.
62
-
63
- Phasellus vitae nisl mauris, sit amet porta justo. Aenean magna mauris, consequat ac posuere vitae, vehicula a lorem. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Morbi accumsan lacinia accumsan. Nulla nibh est, accumsan in elementum non, accumsan porta lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam lobortis congue mi, sed ultrices orci condimentum eu. Curabitur sit amet risus erat, sit amet aliquam dolor.
64
-
65
- Vestibulum elit ligula, rhoncus ac ullamcorper et, accumsan eget risus. Maecenas a dolor vitae tortor tempus porttitor et in lacus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec est arcu, fermentum vel eleifend sit amet, bibendum pellentesque purus. Suspendisse non pulvinar leo. Praesent a nibh nec enim sollicitudin feugiat. Nulla iaculis, ante id rutrum sagittis, neque felis laoreet nisl, a cursus sem quam eget nunc. Ut elementum porta eleifend. Nam sed purus eget velit pellentesque imperdiet. Nam et lorem nisi, quis rutrum quam. Cras vitae ante sem. Morbi non augue at magna convallis mollis. Nunc malesuada pretium nisi, vel vestibulum tortor sodales non.
66
-
67
- Pellentesque augue dui, egestas eget eleifend vel, tincidunt viverra dui. Sed urna dolor, pellentesque at tristique eget, rhoncus sed augue. In gravida ornare neque, vitae placerat leo gravida vitae. In hac habitasse platea dictumst. In gravida pulvinar turpis id suscipit. Donec sagittis tempor orci eget semper. Phasellus vel nisi nulla, sed porttitor elit. In risus ipsum, accumsan et aliquam vitae, imperdiet ac mi.
68
-
69
- Praesent congue eleifend nisi tincidunt pretium. Nam vulputate nisi nec nisi pharetra consequat placerat augue vestibulum. Pellentesque lacinia lacus sit amet tortor pretium eu ultrices nunc auctor. Donec est sapien, sollicitudin in scelerisque quis, eleifend in quam. Mauris eget lectus sem, et auctor urna. In quis nibh libero. Sed sit amet tristique magna. Nullam mattis, odio in porttitor adipiscing, quam sem laoreet libero, nec ullamcorper nisi diam eget ligula. Donec mollis, elit vitae accumsan iaculis, orci felis tincidunt odio, sed vestibulum arcu velit eget tellus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce sed ante suscipit nibh pretium sagittis. Aliquam quis mauris lacus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
70
-
71
- Nam pellentesque quam vitae leo elementum scelerisque. Suspendisse potenti. Morbi venenatis, enim fringilla commodo imperdiet, magna leo volutpat enim, ut pulvinar magna mi condimentum urna. Mauris eget tellus orci, et vehicula eros. Integer sem quam, faucibus in tincidunt ac, facilisis in dui. Nulla tempus lorem eu libero lobortis pharetra. Ut at malesuada lectus.
72
-
73
- Aliquam vehicula diam a odio viverra sit amet cursus ipsum vestibulum. Suspendisse sit amet lacus eget mi adipiscing vestibulum. Etiam vel nulla lorem, eget iaculis nunc. Suspendisse scelerisque faucibus tellus, vel lobortis ipsum porttitor vel. Nam at elit cursus enim accumsan molestie. Vestibulum tortor ipsum, posuere et aliquet a, ultricies vel erat. Donec congue mollis est, quis rutrum dui malesuada at.
74
-
75
- Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam in augue vel dui dictum tincidunt a a diam. Aliquam a lorem ante. Duis in vehicula urna. Suspendisse potenti. Fusce et tempor sapien. Morbi hendrerit elit non tortor consequat lobortis.
76
-
77
- Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In facilisis nulla augue, ac adipiscing lectus. Vestibulum rhoncus enim lectus. Sed tempus lacinia sagittis. Vivamus gravida urna nec est lacinia eget aliquet nunc interdum. Nunc fringilla, neque non dictum ullamcorper, risus turpis consectetur metus, ut luctus risus diam id justo. Vivamus elit ligula, iaculis et lacinia vel, consectetur ac dui. Sed malesuada lobortis tempus. Sed et tellus mi, quis tristique sapien. Vivamus scelerisque ligula ut enim semper sit amet aliquet nunc lacinia. Pellentesque scelerisque, nisi a ultrices iaculis, nulla leo pulvinar justo, a ultricies erat augue at arcu. Mauris nulla leo, euismod id accumsan ac, placerat in turpis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
78
-
79
- Maecenas nec blandit magna. Fusce ut orci nibh, nec cursus purus. Morbi sed est quis ligula dictum auctor eget non eros. Nam dignissim, nulla nec bibendum tristique, ipsum purus pellentesque enim, sit amet varius ligula ante rutrum augue. Etiam at dolor vitae felis sollicitudin eleifend. Sed semper nisl eu metus lobortis congue. Maecenas accumsan eros non elit commodo nec sodales ante suscipit. Donec molestie dignissim tellus, molestie pulvinar dui adipiscing in. In a fermentum nisi. Nullam at lobortis mauris. Nullam vel metus ut diam gravida auctor. Cras non leo et felis interdum placerat eget non enim. Ut id velit a risus tincidunt egestas eu et mauris. Sed eget tincidunt magna.
80
-
81
- Curabitur auctor, sapien et malesuada placerat, massa nunc ornare quam, non varius leo sem ut nisi. Proin sagittis dignissim dui. Donec et metus neque. Proin faucibus neque egestas sem placerat nec dapibus felis pellentesque. Mauris ac lacus nulla, eget cursus mauris. Nam faucibus dictum magna. Praesent semper dapibus placerat. Aenean vitae ligula urna. Nullam sit amet metus tellus. Donec quis dui mi, pulvinar vestibulum tortor. Vestibulum leo est, sagittis id imperdiet nec, sodales vitae purus. Aenean eleifend imperdiet aliquet. Curabitur sed sapien sed elit lacinia pulvinar eu sed metus. Integer eu diam elit. Fusce orci metus, interdum ut eleifend non, pharetra sit amet metus.
82
-
83
- Nunc quis sapien est, at sagittis arcu. Aliquam arcu odio, mollis luctus vulputate nec, tincidunt id metus. Fusce enim turpis, eleifend ut mollis sit amet, egestas in orci. Integer sit amet ligula massa. Cras sit amet leo mi. Suspendisse ornare dignissim lectus, et hendrerit neque luctus id. Pellentesque quis turpis arcu.
84
-
85
- Aliquam molestie volutpat euismod. Maecenas ultricies congue purus, eget rutrum eros venenatis quis. Morbi molestie ligula fermentum mi tempor volutpat. Nam eget vulputate nibh. Curabitur ac purus quam, eu lobortis turpis. Suspendisse congue adipiscing volutpat. Aliquam erat volutpat. Maecenas dictum condimentum erat vel cursus. Praesent auctor erat eget eros ornare vulputate. Ut mattis pellentesque pulvinar. Cras scelerisque mauris eu odio faucibus iaculis. Vestibulum ultricies lacinia purus sit amet ultrices. Praesent dignissim, felis eget viverra convallis, metus tellus accumsan augue, eget condimentum lectus orci quis arcu. Fusce semper varius orci id semper. Cras cursus blandit consequat. Vestibulum quis risus nulla.
86
-
87
- Fusce id nibh sed nulla rutrum vestibulum. In ut magna mi, eu interdum augue. Curabitur luctus varius felis. Etiam fringilla convallis diam quis sagittis. Proin ac leo eros, id tempus justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis aliquam, diam lobortis hendrerit consequat, lorem augue tincidunt erat, eget porttitor orci orci id lacus. Maecenas et suscipit erat. Phasellus pellentesque pretium scelerisque. Maecenas sit amet auctor ipsum. In non rhoncus nisl. Nam pretium pretium volutpat. Mauris volutpat, quam vel egestas ullamcorper, purus quam eleifend erat, mattis commodo lacus lectus id dui.
88
-
89
- Cras feugiat ultricies lorem, id dignissim lacus lacinia a. Vivamus gravida consectetur sem in blandit. Pellentesque massa turpis, pellentesque quis aliquet ac, porta sit amet libero. Suspendisse ultrices eros ut risus sagittis eget blandit nulla feugiat. Donec nulla est, fermentum nec venenatis id, tempor vel neque. Donec dui mi, ullamcorper a porta quis, elementum eu enim. Etiam sem nisi, placerat vitae eleifend sit amet, consectetur mollis velit. Pellentesque cursus convallis dolor elementum molestie. Phasellus massa orci, egestas et elementum vulputate, cursus in leo. Vestibulum quis ornare enim. Maecenas quis nisi pulvinar magna tristique lobortis in non nunc. Aliquam id arcu a diam imperdiet imperdiet in sed odio. Nulla facilisi. Integer iaculis, quam vitae ultrices scelerisque, eros ante porttitor mi, vel scelerisque mauris risus vel dui. Nulla in enim dolor. Etiam at velit id lacus condimentum tincidunt sit amet tincidunt enim.
90
-
91
- Fusce est dolor, fringilla iaculis venenatis eu, ornare id lacus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed pulvinar gravida lorem suscipit vehicula. Pellentesque sed justo vitae urna rutrum consectetur nec nec lorem. Praesent magna dui, ullamcorper a vestibulum non, scelerisque non turpis. Vivamus pellentesque commodo arcu, at imperdiet massa lobortis nec. Pellentesque ac diam magna, ut varius nisi. Aenean venenatis lacinia enim, sed bibendum est posuere a. Suspendisse consectetur ultricies pretium. Nulla convallis faucibus justo et elementum. Pellentesque eu justo non metus luctus elementum. Donec neque libero, ullamcorper eget volutpat et, cursus ac dui. Etiam lacinia gravida ipsum, a ultricies justo sagittis nec.
92
-
93
- Nulla quam enim, feugiat sit amet imperdiet vitae, tempor at lectus. Sed ac hendrerit metus. Donec semper venenatis lectus at laoreet. Phasellus condimentum auctor cursus. Aenean at turpis ante, a adipiscing metus. Duis vulputate purus a elit fermentum bibendum. Nulla nibh quam, tristique vitae rutrum ut, tempor mollis neque. Cras ornare ultricies orci vitae pretium. Vestibulum volutpat, eros non ullamcorper suscipit, ipsum lorem mattis arcu, vitae tempor magna risus eu purus. Aenean quis ornare erat. Nulla rhoncus sagittis metus, tempor fermentum lorem feugiat in. Vivamus molestie tincidunt euismod.
94
-
95
- Sed eu mi ut mauris malesuada tincidunt nec a odio. Integer non felis erat. Mauris venenatis fringilla auctor. Mauris iaculis bibendum accumsan. Phasellus rhoncus auctor porta. Pellentesque et dolor lacinia dolor porta pretium eget eu lacus. Ut imperdiet lorem sit amet nunc bibendum sit amet semper magna aliquet. Sed id urna id est bibendum vestibulum vitae et augue. Fusce congue elit vehicula dolor aliquam vehicula malesuada erat suscipit. In elementum, nunc ac porta fermentum, nisl ligula tempor diam, non ultrices urna leo eget urna. Mauris congue mattis mollis. Pellentesque quis nibh sit amet magna malesuada rutrum. Maecenas ullamcorper justo vel lectus tempus sit amet congue magna porta.
96
-
97
- Aliquam tempor posuere lorem sit amet blandit. Quisque lacinia, ipsum a vehicula consequat, arcu nunc auctor odio, non hendrerit est tortor eget diam. Donec sapien sapien, tincidunt at semper in, aliquam in tellus. Nunc varius ultrices interdum. Duis sed mauris ligula, pulvinar malesuada purus. Cras non odio arcu. Cras sit amet orci magna. Nullam eu orci ut ipsum gravida venenatis. In hac habitasse platea dictumst. Cras congue congue enim quis adipiscing. Ut aliquam semper felis, adipiscing mattis sapien laoreet eget. Curabitur tempor pretium molestie. Sed et magna eros.
98
-
99
- Phasellus ut arcu sed ante viverra interdum eu ut odio. Nulla luctus venenatis dui, sit amet mattis nulla ultricies a. Morbi faucibus urna vitae ante bibendum sed lobortis ante consequat. Duis euismod mattis mi eu ornare. Phasellus aliquet viverra odio sed faucibus. Ut ut ante sollicitudin diam scelerisque rutrum. Phasellus sodales odio et massa vestibulum ultrices. Duis a enim diam. Donec at eros in risus fermentum viverra eget cursus sem. Donec in turpis nisi. Maecenas id est neque. Donec id lectus justo.
100
-
101
- Donec tristique turpis sit amet orci malesuada pharetra. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis velit lectus, convallis vel dapibus sed, fermentum porttitor quam. Phasellus lorem nisi, consequat id lacinia facilisis, eleifend a nisl. Donec vitae ligula purus. Pellentesque aliquam nisl quis elit tristique convallis. Fusce dictum, enim ac placerat rhoncus, eros ligula pellentesque quam, eget placerat mauris nisl sed lacus.
102
-
103
- Suspendisse nec iaculis magna. Cras lacinia sapien et enim ultricies ac vestibulum purus interdum. Etiam eu massa nibh. Sed lacus ligula, pulvinar ut viverra et, bibendum id eros. Duis vel orci ligula. Suspendisse hendrerit gravida augue at facilisis. Duis porta sapien eget neque porta sed sodales eros sodales. Maecenas feugiat, odio non fringilla rutrum, magna diam elementum mi, id auctor justo est ac tellus. Proin at odio mi. Aenean lacus nunc, luctus ac posuere eu, tempus eget augue. Etiam mollis adipiscing odio, at porta ligula ullamcorper eu. Curabitur et eros sit amet lectus facilisis pharetra. Suspendisse nec nulla nec nibh sagittis semper eget a purus.
104
-
105
- Sed eu libero sit amet enim blandit interdum. Ut id diam justo, quis cursus sem. Duis tristique, nibh a tempor dapibus, velit turpis lacinia lacus, in venenatis tellus leo non magna. Vestibulum fermentum iaculis adipiscing. Mauris id urna eu mi laoreet aliquet. In neque lorem, congue a mattis non, condimentum sed nibh. Nullam tempus, tellus sit amet gravida ornare, nunc nulla bibendum erat, sit amet elementum dolor diam eu nisl. Suspendisse pharetra condimentum laoreet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean non erat nec neque fermentum bibendum nec at erat. Donec tincidunt pretium pretium. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas quis diam eu arcu auctor blandit.
106
-
107
- Suspendisse potenti. Suspendisse feugiat viverra ornare. In eget quam nulla. Vestibulum ornare, mauris vitae fermentum mollis, lorem ante pulvinar magna, vel accumsan lectus arcu sit amet arcu. Nulla non dui quis sem porta faucibus. Pellentesque varius sodales tellus sed blandit. Donec vitae erat ut nibh pulvinar pellentesque hendrerit eget libero. In volutpat sollicitudin elit et pulvinar. Ut tempus elit sed ante sagittis eu consectetur urna mattis. In hac habitasse platea dictumst.
108
-
109
- Morbi eget metus sem. Proin purus quam, placerat id condimentum et, sollicitudin et diam. Aenean a ultricies lectus. Nunc libero felis, ullamcorper quis porttitor quis, fringilla quis orci. Donec augue massa, laoreet nec posuere nec, pharetra id turpis. Sed turpis nisi, pellentesque suscipit fringilla tincidunt, faucibus quis ipsum. Praesent sed tortor sit amet urna varius pellentesque. Sed hendrerit, justo vitae sodales pharetra, justo tortor tempor purus, et rutrum nulla purus a lorem. Vivamus fermentum arcu a libero interdum a scelerisque est semper. Nam ac tristique erat. Phasellus nec sollicitudin arcu.
110
-
111
- Donec molestie ipsum eu augue imperdiet sed aliquam dolor ornare. Ut vel orci id felis rhoncus vehicula et eu est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Praesent metus enim, mollis eget auctor in, suscipit quis justo. Sed sit amet ante in tortor mollis auctor. Quisque ac mauris orci, quis bibendum diam. Vivamus velit elit, auctor at volutpat a, porttitor non orci.
112
-
113
- Sed sed velit et tellus euismod auctor vel sit amet tortor. Pellentesque et turpis est, at placerat elit. Fusce condimentum nulla at metus pellentesque id sodales diam convallis. Vestibulum egestas viverra mi non ornare. Pellentesque sem elit, placerat et iaculis posuere, ullamcorper eget magna. Sed sed metus dolor. Mauris nec nulla eleifend eros facilisis interdum at vel nisi. Duis felis mi, commodo eget tempus non, aliquam vitae risus. Aliquam odio eros, imperdiet eu facilisis ac, vestibulum quis tellus. Nunc sollicitudin interdum iaculis. Sed pellentesque, eros ut egestas eleifend, lacus nibh eleifend mauris, ac rutrum velit orci at urna. Nullam semper convallis consequat.
114
-
115
- Donec sodales mi bibendum massa gravida in porttitor neque consectetur. Praesent ac quam ligula. Morbi iaculis tristique mi, sed porttitor sapien mollis vitae. Nullam quis purus nisl. Sed ac lectus nunc. Maecenas eget sapien vel odio fermentum vehicula in at augue. Phasellus ultricies ligula id quam malesuada fringilla porta quam tristique.
116
-
117
- Morbi ullamcorper felis pretium augue sagittis ornare. Ut pharetra sagittis urna, in accumsan ante adipiscing ut. Morbi lorem est, interdum eget aliquet quis, bibendum id orci. In vitae suscipit velit. In vel turpis magna. Suspendisse magna leo, sodales a mollis id, lacinia sed sem. Pellentesque elementum quam et quam imperdiet consectetur. Cras laoreet libero ut libero accumsan feugiat. Sed non nunc in leo consectetur blandit.
118
-
119
- Phasellus feugiat diam sit amet sem facilisis rhoncus. Proin eu ultricies orci. Maecenas vitae ante lorem, non volutpat elit. Pellentesque sit amet mauris sit amet nisi consectetur blandit sit amet et odio. Vivamus purus velit, dapibus quis volutpat eget, semper ac diam. Vivamus mollis est at est tempus sollicitudin. Pellentesque feugiat, sem non pretium dictum, erat massa rutrum elit, sed faucibus felis eros quis nunc. Phasellus augue risus, pharetra nec vulputate cursus, egestas et nunc. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed sagittis ante sit amet est sollicitudin condimentum. Suspendisse a tortor ligula, vitae bibendum massa. Sed mattis, nulla quis pellentesque semper, mi velit posuere ipsum, id sodales velit odio in sapien. Praesent vel odio sapien, sed rutrum metus.
120
-
121
- Nulla facilisi. Duis sed diam leo. Donec laoreet elementum venenatis. Maecenas sapien tortor, auctor vitae aliquam a, feugiat a felis. Sed et arcu mauris. Nulla lacinia lectus eget elit interdum rhoncus. Aliquam blandit lacinia vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
122
-
123
- Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris posuere erat sit amet nunc rhoncus sed aliquam risus laoreet. Cras hendrerit, lacus id rhoncus tempus, mi sapien dignissim dolor, ac cursus justo lorem non neque. Ut facilisis hendrerit sapien, id mollis tellus congue a. Proin nisi est, dapibus et accumsan sed, feugiat sit amet odio. Nulla urna purus, sollicitudin vitae venenatis vitae, feugiat et lectus. Morbi ultricies consectetur ipsum quis varius. Ut venenatis varius metus sit amet convallis. Nullam sapien nisi, ornare non pulvinar in, tempor id arcu.
124
-
125
- Aliquam vitae elit et tellus fringilla lacinia. Pellentesque eleifend volutpat euismod. Suspendisse pharetra dolor quis sapien dictum lacinia. Aliquam erat volutpat. Nullam enim neque, ultricies eu fermentum sed, convallis accumsan velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed feugiat pellentesque consectetur. Ut ligula magna, varius non interdum sed, tempus eget nisi. Cras arcu turpis, congue ac congue quis, tincidunt sit amet urna. Ut aliquam, velit vitae molestie lacinia, elit enim suscipit turpis, in gravida enim massa eu quam. Aliquam fringilla felis felis, et ullamcorper lacus. Duis quam odio, pulvinar sed consectetur ut, dignissim nec arcu.
126
-
127
- Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean consectetur massa at odio facilisis nec gravida dolor pulvinar. In non massa ut est tempus viverra sit amet et tortor. Mauris vestibulum, orci id euismod tempor, mauris sem condimentum enim, in pellentesque odio sapien ut sem. Donec ut ipsum dui. Phasellus malesuada porta interdum. Suspendisse commodo convallis mi, ac tempus elit adipiscing ut. Cras id tellus dolor.
128
-
129
- Nam vel ultricies dui. Ut et massa turpis. In eu rhoncus odio. Fusce eget dui et quam accumsan adipiscing. In eu nunc quis mi elementum condimentum. Pellentesque nisl massa, condimentum aliquam posuere eu, euismod cursus metus. Aenean ut sem nec sem congue volutpat ut vitae nisl. Aliquam eget arcu nec massa egestas malesuada sit amet pellentesque odio.
130
-
131
- Phasellus congue aliquet ipsum nec fringilla. Aliquam enim dolor, ultricies nec congue sit amet, mollis ut est. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean nulla metus, venenatis vitae rhoncus id, sollicitudin a libero. Fusce vel justo odio. Ut diam lorem, semper eget suscipit adipiscing, consectetur tristique nulla. Nullam laoreet diam sit amet sem placerat facilisis. Mauris tempus convallis tellus, eget consectetur augue sagittis quis. Maecenas lectus turpis, tincidunt sed scelerisque ut, tincidunt vitae arcu. Donec viverra sagittis elit, sed ullamcorper felis sodales eu. Suspendisse ullamcorper, tortor ac tempor varius, nunc augue elementum leo, a scelerisque lectus turpis non ipsum. Praesent rhoncus enim eu massa placerat non varius felis blandit. Nunc ut massa id lorem tempus vulputate quis ac risus.
132
-
133
- In sit amet felis elit. Suspendisse vel est nec nulla euismod volutpat vitae in ipsum. Maecenas dapibus ornare vehicula. Donec elementum ipsum iaculis velit aliquam tempus. Aliquam erat volutpat. Maecenas at ipsum sit amet magna mollis molestie in ultrices purus. Cras elementum dictum dui, non ultricies neque posuere ac.
134
-
135
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi nec sapien enim. Duis vehicula vestibulum aliquam. Phasellus volutpat ultrices magna sed ultricies. Nam lectus ante, dictum quis gravida in, aliquam at lacus. Nulla facilisi. Nam sit amet nisi felis, luctus fermentum dui. Nulla facilisi. Curabitur imperdiet, quam non accumsan dapibus, neque nunc dignissim libero, vel facilisis velit nisl et augue. Duis nec purus mauris. Aenean vel dictum enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse pellentesque dapibus imperdiet. Pellentesque quis urna at felis mollis posuere sed suscipit enim. Morbi ultrices tincidunt rhoncus. Proin massa purus, iaculis non sodales sollicitudin, tincidunt vel leo.
136
-
137
- Mauris sem elit, tincidunt et mattis ac, viverra ac urna. Curabitur sed nunc at dolor interdum tempor. Vestibulum aliquam dictum odio, sit amet rutrum arcu dictum sed. Sed blandit erat ac tellus dignissim interdum. Suspendisse viverra tellus eu neque congue congue. Aliquam eget arcu diam, at iaculis nisl. Donec dictum justo eu orci tincidunt facilisis. Integer nisl augue, tincidunt aliquam elementum quis, commodo nec mi. Nulla laoreet nibh quis velit rhoncus euismod.
138
-
139
- Mauris nulla ligula, ultricies sed rhoncus malesuada, iaculis in massa. Vestibulum pulvinar viverra nunc quis imperdiet. Mauris blandit ante in ligula vulputate vitae commodo quam vulputate. Donec et leo magna, id tristique metus. Duis ac ultricies tellus. Praesent tincidunt molestie molestie. Integer sapien lorem, fringilla elementum tempor ultricies, cursus vel dolor. Nam sit amet erat sed odio dignissim luctus cursus a arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vestibulum in magna mi. Sed hendrerit ante vel elit hendrerit imperdiet. Vivamus faucibus est vel libero dignissim suscipit. Nullam elit libero, scelerisque non pretium eget, ullamcorper in orci. Nam quis elit erat. Morbi at nisl laoreet odio pulvinar faucibus. Integer venenatis tristique vehicula.
140
-
141
- Cras sit amet tortor sit amet urna ultrices semper sit amet vitae ligula. Maecenas libero purus, sodales at laoreet quis, faucibus ac felis. Donec bibendum leo eget ipsum tempor at mollis diam congue. Curabitur eu nisi molestie neque suscipit scelerisque. In elementum diam metus, eget eleifend erat. Vivamus mollis mi eu nulla mattis volutpat. Ut quis erat at nisl tempor bibendum ac vitae nunc.
142
-
143
- Nulla id elit eros. Ut ac augue augue. Morbi fringilla rutrum velit sed mollis. Aliquam erat volutpat. Nullam consequat, nunc non sodales rutrum, tortor ligula egestas odio, at condimentum felis enim eget purus. Aliquam erat volutpat. Aliquam tempus malesuada libero in rhoncus. Nunc non consectetur lorem. Mauris eros nunc, imperdiet a faucibus ac, dictum vel metus. Proin id magna est, quis dignissim lectus. Nulla sed erat sit amet nulla semper iaculis sed non tortor. Ut a ligula velit. Sed ultrices tempus mauris eu posuere. Nullam pharetra laoreet magna et aliquam. Praesent eget augue sed metus mollis tincidunt. Nulla facilisi.
144
-
145
- Fusce ultrices, nulla id adipiscing congue, quam augue vulputate tortor, quis pharetra ligula nunc eu tortor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Integer vel purus velit, in consectetur est. Morbi nisi nisi, aliquam vitae gravida at, cursus nec lorem. Curabitur eget augue dolor. Mauris congue lacus quis velit ultrices eu ornare quam rhoncus. Maecenas orci eros, bibendum non dictum sed, adipiscing a felis. Aliquam ullamcorper massa in sapien pellentesque eget blandit tellus fermentum. Curabitur sed nunc quis mi mattis aliquet elementum quis quam. Quisque adipiscing tincidunt accumsan. Nunc non laoreet magna. Pellentesque blandit, augue id consequat hendrerit, mauris nisl suscipit erat, ut volutpat libero augue in felis. Suspendisse libero sapien, dapibus sed aliquam eget, ornare at velit.
146
-
147
- Pellentesque neque orci, facilisis ac pellentesque id, congue sit amet nibh. Donec dignissim, odio nec gravida gravida, dui tortor vehicula est, vitae dapibus orci ipsum eu ipsum. Vestibulum sollicitudin sem in diam interdum et porttitor augue sagittis. Cras condimentum felis et diam blandit porttitor. Nunc rhoncus volutpat turpis eu tincidunt. Quisque porttitor hendrerit dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla nunc orci, aliquet vel vehicula sed, dictum vel risus.
148
-
149
- Cras dignissim, diam et gravida faucibus, eros libero sagittis elit, vel commodo leo tortor in tortor. Nulla tristique lorem vel felis semper vitae pellentesque arcu rhoncus. In eget cursus ante. Fusce purus turpis, congue in tempor in, condimentum vitae massa. Sed viverra velit a risus porta condimentum vel nec sem. In rutrum interdum sapien sit amet pretium. Fusce sed tempus odio. Pellentesque vitae nulla tortor, at adipiscing ante. Aliquam erat volutpat.
150
-
151
- Sed ultricies velit a augue condimentum eu imperdiet augue cursus. Nullam ullamcorper nisi eget elit sodales sed dictum lorem accumsan. Nullam vestibulum dictum purus nec suscipit. Nulla condimentum turpis nunc. Nulla mi turpis, dictum sed commodo ut, vehicula tempor diam. Nulla rhoncus dolor nec justo gravida tempus. Aliquam vitae lacus leo, sit amet viverra nulla. Duis viverra ante et est congue vitae dapibus enim laoreet. Quisque laoreet ullamcorper nunc vel sodales.
152
-
153
- Vivamus mollis egestas arcu a vehicula. Praesent viverra sagittis condimentum. Donec pharetra sapien in nisl scelerisque consectetur eget in felis. Mauris ac orci ac erat tempor ornare. Vivamus eget augue mi. Nulla hendrerit, mi iaculis pellentesque mollis, risus ipsum venenatis sem, et vulputate risus lacus at lectus. Morbi rhoncus urna sed ipsum ornare cursus. Pellentesque porttitor pretium cursus. Ut nec quam neque. Nam at odio et arcu gravida porttitor ac vitae velit. Morbi luctus varius ante sed consectetur. Aliquam metus nisl, iaculis pulvinar cursus id, tempus ut lorem. Vestibulum et enim velit, id tristique tortor. In hac habitasse platea dictumst. Integer tristique tellus nec urna adipiscing quis lobortis lorem interdum. Aliquam eget lectus metus.
154
-
155
- Vivamus ut ipsum in tellus rutrum pharetra vel non orci. Vivamus aliquet rutrum feugiat. Praesent placerat arcu quis nibh porta eget feugiat ante mollis. Integer nec purus erat, vel facilisis tellus. Aliquam erat volutpat. Mauris nibh ligula, porttitor vel dignissim et, vulputate in tortor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc ac felis ac orci tincidunt porttitor eu et arcu. Donec accumsan adipiscing dolor, non eleifend ante pretium at. Morbi vel dui quam. Duis feugiat tincidunt feugiat. Ut suscipit magna at felis sodales ac molestie leo iaculis. Etiam posuere cursus ultrices. Suspendisse quis tortor sem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras fermentum, dui eu volutpat euismod, erat risus mollis felis, at vestibulum felis elit nec dolor.
156
-
157
- Nullam ultrices tellus nec turpis viverra ac lacinia ante posuere. Aliquam eleifend dictum nisl, vitae adipiscing eros dignissim sed. Duis vestibulum odio non magna sollicitudin nec commodo nisl suscipit. Suspendisse vitae mi sapien, ac semper augue. Pellentesque ac rutrum lorem. Quisque fringilla facilisis pharetra. Vivamus tempor eros nunc, quis placerat urna. Sed a velit id sapien lobortis commodo eget a dolor. Nulla facilisi.
158
-
159
- Donec mollis pellentesque turpis eu semper. Sed vestibulum convallis odio, a bibendum nisi scelerisque at. Integer eu sapien velit, id sagittis felis. Cras ac nibh at quam aliquet egestas. Suspendisse gravida ullamcorper magna, vitae fermentum neque ullamcorper non. Curabitur luctus interdum ipsum et pharetra. Duis dictum urna nunc.
160
-
161
- Proin nec est magna. Proin in enim risus, varius mattis urna. Donec eu arcu purus, vel vestibulum mauris. Quisque pharetra aliquam velit id rhoncus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id ligula at tortor ullamcorper mattis ut ut ipsum. Aliquam erat volutpat. Curabitur adipiscing urna id turpis placerat sit amet mattis mi vulputate. Sed gravida euismod auctor. Nulla facilisi. Curabitur sed neque eget risus aliquam eleifend non vitae lectus. Morbi odio nisi, volutpat et laoreet sit amet, ornare et mi. Sed ultrices ultricies ornare.
162
-
163
- Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur quis elit a ipsum placerat ultricies. Duis lobortis facilisis erat quis ultrices. Integer eget odio mauris, ac vehicula metus. In non nunc odio. Sed quis erat a elit blandit elementum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris dignissim nisl a turpis faucibus molestie pulvinar est mattis. Cras tincidunt felis quis augue aliquam blandit ac vitae sem. Ut magna risus, fermentum in euismod at, scelerisque et nisl. Integer semper tincidunt risus, nec venenatis purus placerat non.
164
-
165
- Aenean bibendum tincidunt eros, sit amet varius arcu tempor quis. Integer sed neque est. Maecenas sagittis ligula non tellus aliquet et tincidunt tortor imperdiet. Vivamus eget massa nec felis sagittis hendrerit. Maecenas sapien lorem, condimentum ac pretium tempor, laoreet et felis. Morbi posuere justo sed nisl porttitor lobortis. Nunc purus dolor, lacinia eu aliquam vestibulum, dapibus eu enim. Etiam varius auctor quam, pharetra dignissim mauris varius volutpat. Sed magna dui, cursus vel posuere ac, tincidunt sit amet metus. Quisque eu tortor in lectus malesuada blandit eget quis justo.
166
-
167
- Integer eget euismod risus. Pellentesque porta vehicula massa, sed rutrum dui porta sed. Etiam eleifend magna id nunc tincidunt semper. Cras at aliquet enim. Cras nibh ante, scelerisque nec eleifend non, gravida eu massa. Duis aliquet felis eget lectus varius placerat. Curabitur euismod libero nec risus dapibus mollis nec vitae lectus. Pellentesque scelerisque faucibus sem, in tempus quam semper id. Morbi ut urna elit, et blandit mauris. Fusce sed porta ante. Aliquam erat volutpat. Etiam id bibendum odio.
168
-
169
- Etiam posuere porttitor massa id gravida. Morbi ac justo lacus. Donec lectus elit, ultrices eget tempus non, bibendum eget dolor. Etiam ullamcorper viverra nisi, a imperdiet turpis tristique quis. Phasellus tristique quam sit amet nisl scelerisque ac iaculis est mollis. Suspendisse sollicitudin, diam sed ultricies consequat, erat orci porta felis, et posuere sem nulla at odio. Praesent eu lectus ac leo ultrices rutrum. Proin et nisi quis dui condimentum faucibus. Pellentesque porttitor, nunc non tristique vulputate, nisl eros sodales mi, eget sodales eros nisi et lacus. Ut sagittis ullamcorper sapien ut aliquam.
170
-
171
- Sed velit ante, sollicitudin fermentum consectetur a, tempus quis risus. Aliquam erat volutpat. Duis sodales tellus quis neque accumsan commodo. Cras quis nisl quam. Nulla ac mauris eu elit dignissim feugiat. Fusce ullamcorper ultricies felis, ac rutrum erat semper ac. Etiam id lorem ut augue ullamcorper tempor eget nec ipsum. Phasellus vitae purus odio, non accumsan neque. Aliquam sit amet dolor tortor, ac condimentum magna.
172
-
173
- Vestibulum aliquam aliquam orci, eget cursus leo consequat at. Quisque varius pharetra tortor, vitae aliquam orci condimentum eget. Aliquam eget ligula non magna gravida blandit. Nunc sem enim, ultrices sed consectetur at, posuere sed nisl. Mauris vehicula nisi a est condimentum fringilla. In quis fermentum lacus. Donec aliquet orci et dui facilisis convallis faucibus est dictum. Etiam orci elit, interdum nec venenatis in, consectetur sit amet felis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin consectetur urna vel urna adipiscing vel molestie tortor condimentum.
174
-
175
- Nam in dictum lorem. Phasellus pellentesque, ipsum vitae laoreet tincidunt, neque mi eleifend enim, et eleifend leo tellus in justo. Integer posuere dolor eget neque malesuada iaculis. Morbi ac neque odio. Sed nisl nisi, blandit sed volutpat sodales, dictum a libero. Duis malesuada, eros a porta volutpat, erat enim commodo tortor, vel placerat odio nisi et ante. Vivamus molestie porttitor libero, faucibus posuere dui consequat at. Pellentesque eleifend molestie tristique. Donec lorem tellus, viverra vestibulum tincidunt quis, sagittis a nisl. Morbi eget augue est, ac tempus mauris. Pellentesque ultricies malesuada odio, non egestas orci feugiat eget. Vivamus facilisis tempor mi, at tristique justo congue et. Donec id blandit odio. Mauris vel lacus velit, sit amet pulvinar dolor. Quisque nec ullamcorper leo. Cras euismod cursus bibendum.
176
-
177
- Etiam faucibus tincidunt nisi, ut luctus nulla convallis cursus. Aliquam dapibus risus a orci ullamcorper venenatis. Aliquam blandit hendrerit nulla, et convallis urna sodales sit amet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque egestas sodales vulputate. Duis semper sagittis elit vel sollicitudin. Cras turpis quam, rhoncus nec suscipit sit amet, fringilla id mi. Suspendisse potenti. Duis mauris erat, scelerisque non pellentesque non, congue pharetra orci. Aliquam at magna libero, vel venenatis nisi. Morbi sed est magna, eu suscipit risus. Ut eleifend sodales ultrices.
178
-
179
- Fusce cursus ultricies orci, ut imperdiet lorem tempor et. Morbi ac quam ipsum, in placerat turpis. Mauris at consequat metus. Suspendisse potenti. Phasellus tempus eleifend blandit. Nullam egestas nisi eget est pellentesque vitae scelerisque risus vehicula. Nulla hendrerit purus nec elit mattis gravida. Nunc mauris massa, mollis sed pharetra eget, faucibus ac orci.
180
-
181
- Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus ornare, tortor sit amet porttitor auctor, mauris ligula imperdiet diam, quis semper metus nisl a metus. Mauris erat purus, mattis sit amet consectetur quis, elementum eu arcu. Sed dignissim imperdiet pretium. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis faucibus enim eget augue feugiat eu ultricies est egestas. Nunc consectetur tincidunt libero, eget vestibulum eros rutrum ut. Aliquam a luctus ipsum. Nullam nec libero sit amet lorem porta elementum ut sit amet est. Vivamus congue tincidunt augue ut fringilla. Donec sagittis pulvinar accumsan. Sed pretium tincidunt fermentum.
182
-
183
- In a enim eget turpis gravida tincidunt. Cras est libero, vehicula at pulvinar fringilla, faucibus et lorem. Vestibulum semper molestie eros in eleifend. Nulla accumsan consequat vulputate. Proin egestas venenatis lectus a luctus. Integer ac mi sed urna ullamcorper interdum. Ut non ipsum nibh. Morbi egestas purus a magna pharetra sed eleifend magna gravida.
184
-
185
- Vivamus venenatis massa quis purus dignissim a scelerisque lectus molestie. Vestibulum mauris arcu, tempor sit amet auctor ac, ullamcorper ac nulla. Mauris a est et magna tristique mattis non vitae purus. Pellentesque eu diam sem, eget luctus augue. Nunc congue orci at est volutpat placerat. Donec dignissim semper iaculis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin tortor nisl, ornare at pharetra vel, fermentum non mi. Maecenas eu placerat ligula. Donec sit amet sem sit amet eros accumsan semper.
186
-
187
- Praesent lorem mauris, lobortis ac consectetur vitae, egestas et lorem. Sed semper arcu sed mi porttitor in aliquet quam molestie. Phasellus volutpat commodo lectus scelerisque facilisis. Duis massa metus, fringilla at interdum id, porttitor nec sapien. Vivamus ut pellentesque quam. Pellentesque malesuada malesuada justo a blandit. Sed a libero leo.
188
-
189
- Sed vitae ipsum augue, at pharetra quam. In ac ipsum dui. Proin arcu nunc, auctor nec facilisis at, faucibus non lectus. Ut sit amet suscipit nibh. Nam orci dolor, dignissim quis laoreet nec, blandit sed ligula. Praesent semper luctus ultrices. Nam odio neque, pellentesque ut interdum quis, vestibulum quis eros.
190
-
191
- Suspendisse justo mauris, laoreet id tempus non, aliquet vel sem. Nam ac metus est. Etiam imperdiet feugiat consectetur. Praesent at lorem velit. Proin rutrum dui at ante rhoncus fermentum. Curabitur commodo semper diam quis tempor. Integer in neque lacus, eu fringilla tellus. Curabitur arcu nulla, malesuada a tincidunt id, semper aliquet risus. Duis mattis, lectus sit amet adipiscing rhoncus, justo mauris pulvinar felis, quis congue felis enim a justo. Quisque mollis gravida arcu eu fermentum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut leo ante, mollis eget vulputate vel, bibendum in sapien.
192
-
193
- Pellentesque quam metus, cursus ut sollicitudin egestas, venenatis sit amet tortor. Praesent vulputate rutrum tellus, non ullamcorper massa cursus vitae. Nunc dolor mi, fermentum feugiat euismod nec, pharetra sit amet nisl. Donec malesuada, arcu in egestas adipiscing, orci neque consequat ipsum, facilisis imperdiet turpis turpis non arcu. Nunc eu est vehicula est varius aliquet. Aenean sit amet neque ut dui semper mollis. Aenean mollis blandit congue. Duis luctus scelerisque erat, at bibendum metus porta sit amet. Phasellus nibh elit, pulvinar tincidunt viverra eu, aliquam vitae turpis. Sed bibendum, lorem id tristique condimentum, tortor enim lobortis metus, mattis placerat justo nulla et justo. Morbi hendrerit nisl a diam ultrices iaculis.
194
-
195
- Fusce adipiscing sapien nunc, ac mollis odio. Cras gravida libero vel ante dignissim aliquam. Morbi congue lectus in sapien placerat et consequat magna tempor. Etiam nec sem felis, ut scelerisque lectus. Cras sollicitudin pretium nunc ut pellentesque. Nunc quis nunc vel metus vehicula convallis. Ut ultrices, est non euismod molestie, ipsum mi elementum ipsum, et dapibus leo turpis vel enim.
196
-
197
- Ut rhoncus iaculis dui et rhoncus. Duis commodo sapien quis libero rhoncus semper. Phasellus ac nunc quis leo placerat semper sit amet nec leo. Donec lacinia imperdiet ligula a cursus. Suspendisse eu nulla tellus, a mollis lorem. Donec ut malesuada ante. Fusce ante ante, porttitor quis facilisis ac, adipiscing vitae libero. Cras erat diam, mattis eget imperdiet at, sagittis a tortor. Aliquam euismod sagittis mauris et tempus. Donec et lectus sit amet quam malesuada pretium. Vestibulum aliquet mauris quis felis dignissim cursus venenatis tortor mollis.
198
-
199
- Nullam at dolor justo, non blandit ligula. Proin ut dolor lorem. Praesent vitae mi metus, id ornare arcu. Duis iaculis tellus sodales nibh gravida nec adipiscing nisl dictum. Morbi ut ultricies magna. Aenean ligula lorem, sollicitudin ac accumsan in, malesuada laoreet odio. Aenean ornare turpis non neque viverra at consectetur libero fringilla. Fusce sodales nisi a sem consectetur eu tincidunt ante ullamcorper. Donec iaculis consectetur ligula, vel iaculis risus placerat sit amet.
200
-
201
- Aliquam pulvinar, augue ac laoreet imperdiet, mauris lectus venenatis orci, et rhoncus arcu metus ac metus. Suspendisse congue, tellus in suscipit interdum, enim tortor interdum enim, ut porttitor diam justo pharetra diam. Donec dui diam, gravida sed vehicula eu, vehicula sit amet mi. Praesent felis urna, consectetur et vestibulum sed, ultrices non quam. Mauris ac arcu eget neque convallis placerat. Sed nec massa justo, et ultricies nisl. Nam vestibulum quam in odio venenatis ut consequat turpis tristique. Ut blandit felis at nunc eleifend nec tempor metus venenatis. Phasellus consequat lacus volutpat orci mattis sed tincidunt nibh varius. Fusce dolor lectus, auctor id facilisis nec, molestie et ipsum. Praesent mauris purus, fermentum sed placerat eget, sollicitudin in nulla. Suspendisse non erat tortor, vitae volutpat ipsum. Integer tristique, sapien eget porttitor cursus, urna diam mattis lacus, sed aliquam massa metus non lectus. Phasellus vel metus lectus.
202
-
203
- Nam ipsum tortor, posuere eu mollis vel, commodo nec metus. Sed pretium, neque eleifend ultricies varius, neque erat aliquet turpis, quis viverra arcu erat sit amet lacus. Mauris tempor, enim ut ornare gravida, sem nisl convallis lectus, in auctor tortor dolor vitae risus. Aliquam ut erat tellus, ac vehicula nunc. Mauris porta tristique libero, id vehicula erat varius quis. Nunc eu diam eros. Nunc elementum dolor at eros scelerisque cursus. Praesent facilisis consectetur eleifend. Duis fermentum cursus congue. In porttitor ligula eget est rhoncus gravida.
204
-
205
- Donec rhoncus neque ac ante ultricies eleifend nec non lorem. Proin luctus mi a odio fringilla placerat in ut velit. Aenean ullamcorper tincidunt augue, quis hendrerit massa facilisis sed. Phasellus sodales consectetur sagittis. Nulla tincidunt feugiat tempor. Maecenas at velit mauris. Phasellus tellus lacus, eleifend sit amet cursus fringilla, consectetur a lorem. Ut felis ipsum, commodo ullamcorper suscipit id, imperdiet laoreet felis. Cras cursus elit id purus pretium fermentum.
206
-
207
- Duis sollicitudin libero vel nisl venenatis sodales. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean a quam enim. Nunc lacinia leo sed nulla aliquam pulvinar. Vestibulum facilisis risus vel urna consequat dapibus. In at mauris vestibulum tortor bibendum fringilla eget ac massa. Aliquam dolor purus, accumsan vitae ultrices id, bibendum sed orci. Sed suscipit neque a ipsum tristique quis placerat turpis tempus. Sed at nisl a risus rhoncus hendrerit et vitae justo. Nunc adipiscing pulvinar fringilla. Suspendisse ut arcu orci, sit amet aliquam metus. In convallis viverra velit id molestie.
208
-
209
- Ut ut nisi neque. Maecenas enim justo, vestibulum eu commodo eget, facilisis non libero. Phasellus sollicitudin, nulla in aliquam sagittis, odio metus hendrerit libero, sit amet suscipit nunc nunc in felis. Sed volutpat congue varius. Sed eget pulvinar lorem. Suspendisse justo arcu, interdum eget ultricies eget, viverra at quam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras sodales turpis in lectus imperdiet nec placerat lacus tempor. Cras lacinia purus a augue adipiscing egestas. Integer adipiscing iaculis neque.
210
-
211
- Donec dui purus, ornare in laoreet vitae, aliquam vel ligula. Aenean iaculis venenatis tortor porta malesuada. Quisque semper ultrices dolor, at hendrerit purus condimentum a. Morbi a erat eu erat venenatis mattis. Etiam venenatis felis commodo orci semper porttitor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In elit mi, ornare at condimentum et, molestie at erat. Aenean sagittis tempor diam non consequat. Morbi aliquet vulputate dui, et euismod arcu suscipit nec. Nam eget rhoncus tellus. In vulputate sapien nibh. Aliquam vel dignissim nisl. Aliquam sit amet turpis ac neque facilisis lobortis. Mauris luctus felis a sem gravida volutpat. Fusce tellus sapien, vehicula id semper quis, tristique vitae mi.
212
-
213
- Quisque volutpat mauris et lacus venenatis non pretium urna auctor. Morbi molestie elementum magna, blandit iaculis risus convallis nec. Etiam viverra, turpis eu egestas adipiscing, justo odio euismod tellus, pellentesque sagittis metus velit a dui. Donec euismod sollicitudin neque in iaculis. Nulla a arcu metus. Nulla facilisi. Duis nulla est, tincidunt eu aliquam a, iaculis quis orci. Sed ante diam, convallis ac interdum eget, commodo nec risus. In hac habitasse platea dictumst. Nam varius porta blandit.
214
-
215
- Nullam adipiscing viverra justo ut mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum lobortis accumsan neque et pellentesque. Nunc ut turpis et turpis rutrum varius. Aenean ac magna diam, vitae laoreet mi. Vestibulum tincidunt convallis tortor vitae elementum. Morbi varius pulvinar diam, eu congue orci mattis nec.
216
-
217
- Integer vitae malesuada ligula. Maecenas fringilla convallis dui, at tincidunt risus gravida ac. Nullam urna est, ornare ut iaculis vel, euismod non est. Nullam nec vehicula sapien. Suspendisse aliquam ullamcorper dolor, et mollis odio interdum vehicula. Donec blandit purus vitae orci consequat pharetra. Curabitur malesuada lacinia quam, eu posuere purus aliquam ac. Cras tincidunt tellus ac eros porttitor viverra.
218
-
219
- Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam luctus nisl eget risus dictum accumsan. Suspendisse non posuere erat. Sed vitae ante mi. Sed dapibus posuere rhoncus. Fusce non neque blandit risus aliquet laoreet. Duis orci nisl, ultrices a facilisis sit amet, vehicula non sem. Donec ut nibh vel nisi tempor eleifend. Ut sodales felis sit amet augue porta eleifend. Suspendisse ultrices auctor felis eu pellentesque. Morbi ut mollis nulla. Donec congue odio eget neque rhoncus tristique.
220
-
221
- Aliquam tellus magna, convallis auctor placerat sed, cursus facilisis quam. Curabitur sit amet erat vitae mi pharetra vestibulum sit amet a tortor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed sed dolor orci. Maecenas sed diam mi, sagittis vestibulum nibh. Duis ultrices, nisl vel euismod luctus, velit nulla pharetra arcu, ut dignissim metus lorem at lorem. Donec porta ornare molestie. Aliquam scelerisque massa at felis tincidunt ullamcorper. Pellentesque tempus, ligula sit amet scelerisque pulvinar, libero risus fermentum libero, sed hendrerit eros nisl eu neque. Proin congue, lectus porta gravida egestas, tortor mauris dapibus quam, ornare vulputate quam tortor a nisi. In interdum ornare mauris ac rhoncus. Nunc a massa a sapien placerat placerat at vitae turpis. Curabitur nisi tellus, pulvinar in venenatis aliquam, fermentum sed mauris. Nulla ullamcorper, odio nec commodo accumsan, purus risus malesuada velit, varius consequat lectus justo a tellus. Ut adipiscing mattis dapibus.
222
-
223
- Nunc risus elit, sagittis non tempor vitae, venenatis at nulla. Duis tincidunt pretium gravida. In hac habitasse platea dictumst. Vivamus sed nisi lorem, quis bibendum purus. Mauris neque sapien, vestibulum sed volutpat in, auctor vitae ligula. Mauris vel metus in urna venenatis iaculis at vitae nisi. Nunc laoreet, nulla ut lacinia blandit, elit nunc bibendum lectus, id ultricies nisl orci et arcu. Cras dictum luctus elit, quis semper turpis pharetra et. Praesent luctus suscipit lobortis.
224
-
225
- Vestibulum pretium porttitor odio nec semper. Aliquam id libero sed neque mattis lacinia ut quis nisl. Morbi congue tincidunt augue, ac adipiscing mi convallis et. Quisque at diam justo, nec tempus sapien. Aenean luctus urna eget libero auctor malesuada. Nulla convallis arcu vel augue lobortis id bibendum diam facilisis. Aliquam tristique sapien vitae arcu facilisis ornare. In volutpat, massa eu interdum volutpat, purus turpis auctor augue, eu posuere justo justo sit amet augue. Nulla bibendum cursus urna, nec egestas justo ultricies at. Phasellus molestie aliquet neque.
226
-
227
- Nulla auctor dui ac risus facilisis in ornare enim suscipit. Fusce quis augue sit amet ante sodales viverra sit amet varius metus. Cras pellentesque fringilla leo vitae scelerisque. Nullam varius rutrum neque, in semper enim luctus tristique. Maecenas auctor felis eu justo interdum eget imperdiet nisi venenatis. In lacinia, ipsum vel cursus convallis, sapien turpis lobortis eros, nec aliquet neque ipsum vitae sapien. Integer eleifend neque non est lobortis nec egestas felis tincidunt. Ut id nisi dolor. Ut ac lacus nunc. Vivamus et risus ipsum, vel volutpat augue. Donec pretium tempor felis sed iaculis. Sed vulputate sem elit, a volutpat lorem. Suspendisse potenti. Nunc id dolor dignissim ipsum volutpat ultrices. Vestibulum nec arcu at velit bibendum egestas.
228
-
229
- Pellentesque eu purus dolor, sagittis tristique ante. Nullam rutrum dapibus enim, vel tincidunt sapien cursus ac. Duis non erat non nisi malesuada egestas ut in turpis. Sed facilisis faucibus sapien, sit amet volutpat velit laoreet imperdiet. Nullam blandit felis et augue pellentesque sed pulvinar risus gravida. Nunc consectetur facilisis odio id dapibus. Etiam scelerisque magna quis urna mollis pulvinar.
230
-
231
- Fusce eu sapien neque. Aenean ac est dolor, vitae posuere ante. Suspendisse nec justo in sem mattis sodales ac sed augue. In laoreet varius velit, ac blandit ante pharetra eget. Donec porttitor luctus elit eu eleifend. Suspendisse vel elit metus, non imperdiet lorem. Donec a neque velit, ut interdum sapien. Praesent scelerisque dolor eget mi semper pharetra. Proin sed lorem felis. Curabitur lacus tellus, condimentum sit amet rutrum et, hendrerit nec tortor. Sed orci felis, vulputate a pharetra quis, rutrum vel mauris. Aliquam lacinia, lectus sed blandit tempus, sem quam condimentum arcu, ornare pharetra felis tellus quis turpis. Nulla placerat ipsum nec sapien convallis luctus. Cras ac velit mi. Donec eget orci nec felis pretium venenatis nec nec enim.
232
-
233
- In hac habitasse platea dictumst. Donec ac mi orci. Nullam vehicula vehicula porttitor. Vestibulum viverra lorem eget nibh pharetra aliquam placerat felis rhoncus. Aliquam libero eros, vulputate sit amet eleifend a, eleifend nec quam. Nunc adipiscing enim quis lorem condimentum sed blandit ligula tincidunt. In aliquet molestie nibh sit amet blandit. Ut aliquam blandit suscipit. Cras euismod fermentum arcu, eu sodales nisl lobortis ac.
234
-
235
- Sed rhoncus nulla in tortor viverra id convallis lacus pulvinar. Donec semper, elit at vulputate porttitor, metus odio rhoncus elit, sit amet aliquet nulla risus ac sapien. Sed feugiat lacus et dui accumsan at sagittis erat scelerisque. Curabitur fringilla tellus id erat cursus eu convallis ligula placerat. Vivamus pellentesque semper ipsum, vel tempor est vestibulum eget. Vestibulum et gravida felis. Sed tincidunt rhoncus mi at iaculis.
236
-
237
- Donec pretium, mauris at eleifend cursus, felis augue cursus est, vitae cursus lacus urna eget orci. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In est purus, egestas in dapibus vel, placerat placerat nulla. Suspendisse potenti. Phasellus sollicitudin nunc quis ligula semper ultrices. Sed sit amet pellentesque eros. Phasellus tincidunt fringilla neque vitae molestie. Sed at libero eget ipsum porta pharetra. Suspendisse id lectus diam, ac sollicitudin eros. Phasellus lectus eros, venenatis sit amet hendrerit vel, laoreet sed tortor. Cras dignissim quam non diam venenatis in volutpat nulla feugiat. Vestibulum at consequat lacus. Quisque euismod cursus suscipit. In vel sapien turpis, vitae pulvinar lorem.
238
-
239
- Donec lectus purus, lobortis vitae aliquet a, fermentum sit amet nibh. Pellentesque a ornare sapien. Quisque auctor tortor vel diam aliquet elementum. Ut in risus vel justo vulputate varius. Integer diam odio, elementum quis pulvinar in, malesuada sit amet purus. Nullam tincidunt ante non odio iaculis a laoreet risus porta. Mauris lectus mi, pellentesque a sagittis vel, rutrum sed quam. Fusce ipsum nisl, dictum eget lacinia sit amet, cursus eget sapien. Proin eget massa massa. Morbi sapien tortor, faucibus ut hendrerit vitae, ultricies eget massa. Vivamus pulvinar mauris eget odio consequat a tincidunt tortor commodo.
240
-
241
- Ut posuere leo et risus molestie sed auctor lectus laoreet. Praesent ultricies pulvinar tellus ut elementum. Curabitur id lacus tincidunt tortor viverra sollicitudin vel vel ipsum. Aenean feugiat magna eu nibh hendrerit mattis. Aliquam erat volutpat. Etiam in erat eget arcu rutrum iaculis. Nam rhoncus tempus arcu in ultrices. Aliquam at nisl justo. Duis porttitor semper mattis. Fusce in ligula neque, vel consequat neque. Vivamus nec porta erat.
242
-
243
- Mauris imperdiet egestas pellentesque. Vivamus adipiscing feugiat ante, ac cursus augue auctor id. Ut varius convallis risus id suscipit. Nunc auctor libero sit amet tortor eleifend aliquam. Sed lectus turpis, tincidunt vitae fringilla sed, scelerisque vel metus. Ut ligula lorem, tincidunt at tristique eu, laoreet sed mi. Nullam ac nisi et lacus pellentesque convallis. Maecenas eget erat felis, in elementum sem.
244
-
245
- Quisque hendrerit rutrum eleifend. Ut id mauris ac purus dictum varius. Sed congue risus id quam ornare pretium pharetra mauris accumsan. Ut tincidunt fermentum arcu sed pulvinar. Aliquam blandit bibendum leo et vehicula. Maecenas vitae diam ac libero lobortis vestibulum. Duis non dui imperdiet leo elementum sagittis et quis est. Vivamus interdum pulvinar odio, eu adipiscing tellus fringilla vitae. Suspendisse et libero ac tellus bibendum tincidunt nec eget quam. Morbi ipsum sem, feugiat ut malesuada vel, tincidunt sed mi. Fusce congue, arcu vitae adipiscing pretium, diam lacus accumsan quam, ut vehicula magna odio tristique dolor. Pellentesque mauris lectus, varius ac condimentum quis, scelerisque nec purus. In gravida tincidunt purus id egestas.
246
-
247
- Nulla viverra metus dolor. Cras justo elit, sollicitudin rhoncus auctor et, egestas quis risus. Nulla eget quam orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin vehicula ipsum id orci tempus et condimentum nulla auctor. Aliquam pretium diam convallis ipsum mattis at commodo augue sodales. Integer molestie convallis felis, vel fringilla eros imperdiet vitae. Curabitur tincidunt ultricies aliquam. Vestibulum pharetra purus sit amet diam consequat eget blandit volutpat.
package/test/test.js DELETED
@@ -1,27 +0,0 @@
1
- var assert = require("assert");
2
-
3
-
4
- var lzf = require("../index.js");
5
-
6
-
7
- var lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit." +
8
- "Curabitur volutpat, nulla nec egestas semper," +
9
- "ante dui tristique nibh, quis feugiat.";
10
-
11
- var loremBuffer = new Buffer(lorem);
12
- var loremCompressed = lzf.compress(loremBuffer);
13
- var loremDecompressed = lzf.decompress(loremCompressed);
14
-
15
- // check default output buffer
16
- assert.equal(loremDecompressed.toString(), lorem);
17
-
18
- // check minimum output buffer
19
- assert.equal(lzf.decompress(loremCompressed, loremBuffer.length), lorem);
20
-
21
- // check error on too small buffer
22
- try {
23
- lzf.decompress(loremCompressed, loremBuffer.length - 1);
24
- assert.fail("exception should be thrown for too small buffer");
25
- } catch (e) {}
26
-
27
- console.log("test ok");