Doug Nazar 1 anno fa
parent
commit
cde23f55ed

+ 13 - 0
.gitignore

@@ -41,3 +41,16 @@ startup/solaris-init.xml
 startup/tmpfile.conf
 startup/upstart-init
 
+# Visual Studio Code IDE
+.vscode
+
+# gcov coverage files
+*.gcno
+*.gcda
+nrpe.info-file
+coverage-report/
+
+tests/logs
+tests/run
+tests/nrpe.cfg
+tests/misc.cfg

+ 22 - 0
Makefile.in

@@ -181,11 +181,15 @@ install-groups-users:
 
 clean:
 	cd $(SRC_BASE); $(MAKE) $@; cd ..
+	(cd tests; $(MAKE) $@)
 	rm -f core
 	rm -f *~ */*~
+	rm -f nrpe.info-file
+	rm -rf coverage-report
 
 distclean: clean
 	cd $(SRC_BASE); $(MAKE) $@; cd ..
+	(cd tests; $(MAKE) $@)
 	rm -rf autom4te.cache
 	rm -f config.log config.status config.cache sample-config/nrpe.cfg $(SRC_INCLUDE)/config.h
 	rm -f startup/bsd-init startup/debian-init startup/default-init startup/default-inetd
@@ -199,3 +203,21 @@ distclean: clean
 
 devclean: distclean
 
+test:
+	(cd $(SRC_BASE); $(MAKE) nrpe check_nrpe)
+	(cd tests; $(MAKE) $@)
+
+src/check_nrpe-check_nrpe.gcda:
+	$(MAKE) test
+
+src/nrpe-nrpe.gcda:
+	$(MAKE) test
+
+coverage: src/nrpe-nrpe.gcda src/check_nrpe-check_nrpe.gcda
+	@if ! which lcov >/dev/null 2>&1; then \
+		echo "ERROR: You must install lcov and genhtml first"; \
+	else \
+		lcov -c -d . -o nrpe.info-file; \
+		genhtml nrpe.info-file -o coverage-report; \
+		echo "Your coverage report is in coverage-report/index.html"; \
+	fi

+ 3 - 1
configure

@@ -5348,7 +5348,7 @@ fi
 
 ac_config_headers="$ac_config_headers include/config.h"
 
-ac_config_files="$ac_config_files Makefile src/Makefile nrpe.spec uninstall sample-config/nrpe.cfg startup/bsd-init startup/debian-init startup/default-init startup/default-inetd startup/default-service startup/default-socket startup/default-socket-svc startup/default-xinetd startup/mac-init.plist startup/mac-inetd.plist startup/newbsd-init startup/openbsd-init startup/openrc-conf startup/openrc-init startup/solaris-init.xml startup/solaris-inetd.xml startup/tmpfile.conf startup/upstart-init startup/rh-upstart-init include/common.h"
+ac_config_files="$ac_config_files Makefile src/Makefile tests/Makefile nrpe.spec uninstall sample-config/nrpe.cfg startup/bsd-init startup/debian-init startup/default-init startup/default-inetd startup/default-service startup/default-socket startup/default-socket-svc startup/default-xinetd startup/mac-init.plist startup/mac-inetd.plist startup/newbsd-init startup/openbsd-init startup/openrc-conf startup/openrc-init startup/solaris-init.xml startup/solaris-inetd.xml startup/tmpfile.conf startup/upstart-init startup/rh-upstart-init include/common.h tests/misc.cfg"
 
 
 
@@ -9225,6 +9225,7 @@ do
     "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
     "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+    "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
     "nrpe.spec") CONFIG_FILES="$CONFIG_FILES nrpe.spec" ;;
     "uninstall") CONFIG_FILES="$CONFIG_FILES uninstall" ;;
     "sample-config/nrpe.cfg") CONFIG_FILES="$CONFIG_FILES sample-config/nrpe.cfg" ;;
@@ -9248,6 +9249,7 @@ do
     "startup/upstart-init") CONFIG_FILES="$CONFIG_FILES startup/upstart-init" ;;
     "startup/rh-upstart-init") CONFIG_FILES="$CONFIG_FILES startup/rh-upstart-init" ;;
     "include/common.h") CONFIG_FILES="$CONFIG_FILES include/common.h" ;;
+    "tests/misc.cfg") CONFIG_FILES="$CONFIG_FILES tests/misc.cfg" ;;
 
   *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;;
   esac

+ 2 - 0
configure.ac

@@ -77,6 +77,7 @@ fi
 AC_CONFIG_HEADERS([include/config.h])
 AC_CONFIG_FILES([Makefile
 	src/Makefile
+	tests/Makefile
 	nrpe.spec
 	uninstall
 	sample-config/nrpe.cfg
@@ -100,6 +101,7 @@ AC_CONFIG_FILES([Makefile
 	startup/upstart-init
 	startup/rh-upstart-init
 	include/common.h
+	tests/misc.cfg
 ])
 
 dnl Checks for programs.

+ 1 - 0
src/Makefile.in

@@ -94,6 +94,7 @@ clean:
 	rm -f core nrpe check_nrpe generate_dh_params utils.o nrpe-ssl.o $(SNPRINTF_O) $(SSL_DH_HEADER)
 	rm -f *~ */*~
 	rm -rf nrpe.dSYM check_nrpe.dSYM
+	rm -f *.gcda *.gcno
 
 distclean: clean
 	rm -f Makefile

+ 52 - 0
tests/000-startup.t

@@ -0,0 +1,52 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+BEGIN {
+    use File::Basename;
+    use lib (dirname(__FILE__));
+}
+
+use Test::More tests => 11;
+use nrpe;
+
+
+my @output;
+
+@output = `$nrpe -V`;
+is($?, STATE_UNKNOWN, 'nrpe executes');
+like($output[0], qr/NRPE - Nagios Remote Plugin Executor/, 'nrpe banner');
+
+@output = `$nrpe --license`;
+is($?, STATE_UNKNOWN, 'license') || diag @output;
+
+@output = `$checknrpe -V`;
+is($?, STATE_UNKNOWN, 'check_nrpe executes');
+like($output[0], qr/NRPE Plugin for Nagios/, 'check_nrpe banner');
+
+
+@output = `$nrpe --daemon --dont-chdir --config configs/missing.cfg`;
+is($?, STATE_CRITICAL, 'missing config') || diag @output;
+
+SKIP: {
+    skip 'no SSL', 5 if ! supports_ssl();
+
+    @output = `$nrpe --daemon --dont-chdir --config configs/ssl-invalid.cfg`;
+    is($?, STATE_CRITICAL, 'invalid ssl config 1') || diag @output;
+    @output = `$nrpe --daemon --dont-chdir --config configs/ssl-invalid2.cfg`;
+    is($?, STATE_CRITICAL, 'invalid ssl config 2') || diag @output;
+    @output = `$nrpe --daemon --dont-chdir --config configs/ssl-invalid3.cfg`;
+    is($?, STATE_CRITICAL, 'invalid ssl config 3') || diag @output;
+    @output = `$nrpe --daemon --dont-chdir --config configs/ssl-invalid4.cfg`;
+    is($?, STATE_CRITICAL, 'invalid ssl config 4') || diag @output;
+    @output = `$nrpe --daemon --dont-chdir --config configs/ssl-invalid5.cfg`;
+    is($?, STATE_CRITICAL, 'invalid ssl config 5') || diag @output;
+}
+
+
+check_if_port_available();
+switch_config_file("configs/normal.cfg");
+launch_daemon();
+
+
+done_testing();

+ 147 - 0
tests/001-normal.t

@@ -0,0 +1,147 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+BEGIN {
+    use File::Basename;
+    use lib (dirname(__FILE__));
+}
+
+use Test::More tests => 44;
+use Digest::SHA qw(sha1_hex);
+use nrpe;
+
+my @output;
+
+
+ensure_daemon_running();
+switch_config_file("configs/normal.cfg");
+restart_daemon();
+
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321`;
+is($?, STATE_OK, 'version check') || diag @output;
+like($output[0], qr/NRPE v.*/, 'version check response') || diag @output;
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321 -2`;
+is($?, STATE_OK, 'version check - v2 packet') || diag @output;
+like($output[0], qr/NRPE v.*/, 'version check response - v2 packet') || diag @output;
+
+# Note: Server may fail v3 packet and we'll retry with a v2 packet. Could check log for difference if we care.
+@output = `$checknrpe -H 127.0.0.1 -p 40321 -3`;
+is($?, STATE_OK, 'version check - v3 packet') || diag @output;
+like($output[0], qr/NRPE v.*/, 'version check response - v3 packet') || diag @output;
+
+# Source address not allowed
+SKIP: {
+    skip 'not linux', 2 if $^O ne 'linux';
+
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 -b 127.0.0.2`;
+    is($?, STATE_UNKNOWN, 'invalid source ip') || diag @output;
+    like($output[0], qr/CHECK_NRPE: Error - Could not connect to .*: /, 'invalid source ip response') || diag @output;
+}
+
+
+SKIP: {
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 -c state_ok`;
+    is($?, STATE_OK, "state_ok exec") || diag @output && skip 'failed exec', 2;
+
+    is(@output, 1, 'state_ok result lines');
+    is($output[0], "OK: Everything is normal\n", 'state_ok result');
+}
+SKIP: {
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 -c state_warning`;
+    is($?, STATE_WARNING, "state_warning exec") || diag @output && skip 'failed exec', 2;
+
+    is(@output, 1, 'state_warning result lines');
+    is($output[0], "WARNING: That\'s strange.\n", 'state_warning result');
+}
+SKIP: {
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 -c state_critical`;
+    is($?, STATE_CRITICAL, "state_critical exec") || diag @output && skip 'failed exec', 2;
+
+    is(@output, 1, 'state_critical result lines');
+    is($output[0], "CRITICAL: Danger!\n", 'state_critical result');
+}
+SKIP: {
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 -c state_unknown`;
+    is($?, STATE_UNKNOWN, "state_unknown exec") || diag @output && skip 'failed exec', 2;
+
+    is(@output, 1, 'state_unknown result lines');
+    is($output[0], "UNKNOWN: Huh?\n", 'state_unknown result');
+}
+
+
+SKIP: {
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 -c lorem_10000`;
+    is($?, STATE_OK, "10,000 byte test exec") || diag @output && skip 'failed exec', 1;
+
+    is(sha1_hex(@output), '2ed4d81e96262f2b08441c1f819166209a2f5337', '10,000 byte test result');
+}
+
+SKIP: {
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 -c lorem_60000`;
+    is($?, STATE_OK, "60,000 byte test exec") || diag @output && skip 'failed exec', 1;
+
+    is(sha1_hex(@output), '2ad3e654c043773c309321d8fb62232833510b8f', '60,000 byte test result');
+}
+
+SKIP: {
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 -c lorem_70000`;
+    is($?, STATE_OK, "70,000 byte test exec") || diag @output && skip 'failed exec', 1;
+
+    # Note: We're expecting the output to be trimmed to 64k.
+    is(sha1_hex(@output), 'af05e7c515f21dd9b6944e9b092bf1691ae47050', '70,000 byte test result');
+    if ($? != 0) {
+        diag(scalar @output);
+        diag($output[0]);
+        diag($output[-1]);
+    }
+}
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321 -c invalid_command`;
+is($?, STATE_UNKNOWN, 'invalid command');
+like($output[0], qr/NRPE: Command 'invalid_command' not defined/, 'invalid command response');
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321 -c nonexistent`;
+is($?, STATE_UNKNOWN, 'nonexistent command');
+like($output[0], qr/NRPE: Unable to read output/, 'nonexistent command response');
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321 -c timeout`;
+is($?, STATE_UNKNOWN, 'timeout command');
+like($output[0], qr/NRPE: Command timed out after 5 seconds/, 'timeout command response');
+
+
+SKIP: {
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 -2 -c state_ok`;
+    is($?, STATE_OK, "v2 state_ok exec") || diag @output && skip 'failed exec', 2;
+
+    is(@output, 1, 'v2 state_ok result lines');
+    is($output[0], "OK: Everything is normal\n", 'v2 state_ok result');
+}
+
+SKIP: {
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 -2 -c ""`;
+    is($?, STATE_UNKNOWN, "v2 null exec") || diag @output && skip 'failed exec', 2;
+
+    is(@output, 1, 'v2 null result lines');
+    like($output[0], qr/CHECK_NRPE: Error - Could not connect to .*: /, 'v2 null result');
+}
+
+SKIP: {
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 -c "state_ok" -a 1 2 3`;
+    is($?, STATE_UNKNOWN, "args exec") || diag @output && skip 'failed exec', 2;
+
+    is(@output, 1, 'args - result lines');
+    like($output[0], qr/CHECK_NRPE: Error - Could not connect to .*: /, 'args - result');
+}
+
+SKIP: {
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 -c "< >"`;
+    is($?, STATE_UNKNOWN, "metachars - exec") || diag @output && skip 'failed exec', 2;
+
+    is(@output, 1, 'metachars - result lines');
+    like($output[0], qr/CHECK_NRPE: Error - Could not connect to .*: /, 'metachars - result');
+}
+
+done_testing();

+ 66 - 0
tests/002-ipv6.t

@@ -0,0 +1,66 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+BEGIN {
+    use File::Basename;
+    use lib (dirname(__FILE__));
+}
+
+use Test::More;
+use nrpe;
+
+my @output;
+
+if (!check_if_ipv6_available()) {
+    plan skip_all => 'IPv6 unavailable.';
+}
+
+plan tests => 12;
+
+
+ensure_daemon_running();
+switch_config_file("configs/ipv6.cfg");
+restart_daemon();
+
+
+@output = `$checknrpe -H ::1 -p 40321`;
+is($?, STATE_OK, 'connection ipv6') || diag @output;
+like($output[0], qr/NRPE v.*/, 'connection ipv6 response') || diag @output;
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321`;
+is($?, STATE_OK, 'connection ipv4 on ipv6') || diag @output;
+like($output[0], qr/NRPE v.*/, 'connection ipv4 on ipv6 response') || diag @output;
+
+# ipv6.conf has a command_prefix of /bin/echo
+@output = `$checknrpe -H ::1 -p 40321 -c timeout`;
+is($?, STATE_OK, 'timeout (echo)') || diag @output;
+like($output[0], qr'checks/timeout', 'timeout (echo) response') || diag @output;
+
+#####################################################################################
+
+switch_config_file("configs/ipv6-only.cfg");
+restart_daemon();
+
+
+@output = `$checknrpe -H ::1 -p 40321`;
+is($?, STATE_OK, 'connection ipv6 only') || diag @output;
+like($output[0], qr/NRPE v.*/, 'connection ipv6 only response') || diag @output;
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321 --stderr-to-stdout`;
+is($?, STATE_CRITICAL, 'connection ipv4 on ipv6 only') || diag @output;
+like($output[0], qr/connect to .*: Connection refused/, 'connection ipv6 only response') || diag @output;
+
+#####################################################################################
+
+switch_config_file("configs/ipv6-disallowed.cfg");
+restart_daemon();
+
+
+@output = `$checknrpe -H ::1 -p 40321`;
+is($?, STATE_UNKNOWN, 'connection ipv6 disallowed') || diag @output;
+like($output[0], qr/CHECK_NRPE:.* Error - Could not .*: /, 'connection ipv6 disallowed response') || diag @output;
+
+#####################################################################################
+
+done_testing();

+ 47 - 0
tests/010-no-ssl.t

@@ -0,0 +1,47 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+BEGIN {
+    use File::Basename;
+    use lib (dirname(__FILE__));
+}
+
+use Test::More;
+use nrpe;
+
+my @output;
+
+if (!supports_ssl()) {
+    plan skip_all => 'SSL/TLS support unavailable.';
+}
+
+plan tests => 8;
+
+
+ensure_daemon_running();
+switch_config_file("configs/nossl.cfg");
+restart_daemon();
+
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321`;
+is($?, STATE_UNKNOWN, 'connect ssl') || diag @output;
+like($output[0], qr/CHECK_NRPE:.* Error - Could not .*: /, 'connect ssl response') || diag @output;
+
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321 --no-ssl`;
+is($?, STATE_OK, 'connect without ssl') || diag @output;
+like($output[0], qr/NRPE v.*/, 'connect without ssl response') || diag @output;
+
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321 --no-ssl -2`;
+is($?, 0, 'version check - v2 packet') || diag @output;
+like($output[0], qr/NRPE v.*/, 'version check response - v2 packet') || diag @output;
+
+# Note: Server may fail v3 packet and we'll retry with a v2 packet. Could check log for difference if we care.
+@output = `$checknrpe -H 127.0.0.1 -p 40321 --no-ssl -3`;
+is($?, 0, 'version check - v3 packet') || diag @output;
+like($output[0], qr/NRPE v.*/, 'version check response - v3 packet') || diag @output;
+
+
+done_testing();

+ 57 - 0
tests/011-no-ssl-protocol.t

@@ -0,0 +1,57 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+BEGIN {
+    use File::Basename;
+    use lib (dirname(__FILE__));
+}
+
+use Test::More;
+use nrpe;
+
+my @response;
+
+#if (!supports_ssl()) {
+#    plan skip_all => 'SSL/TLS support unavailable.';
+#}
+
+plan tests => 9;
+
+
+ensure_daemon_running();
+switch_config_file("configs/nossl.cfg");
+restart_daemon();
+
+
+# v4
+@response = send_request('port' => 40321, 'ssl' => 0);
+is_response(\@response, 'v4 version check');
+
+@response = send_request('port' => 40321, 'ssl' => 0, 'length' => +10);
+is_response(\@response, 'v4 version check - large');
+
+@response = send_request('port' => 40321, 'ssl' => 0, 'length' => -10);
+isnt_response(\@response, "v4 version check - short");   # Expected failure - server read timeout
+
+@response = send_request('port' => 40321, 'ssl' => 0, 'crc' => 0);
+isnt_response(\@response, "v4 version check - invalid crc");   # Expected failure - crc
+
+@response = send_request('port' => 40321, 'ssl' => 0, 'type' => 20);
+isnt_response(\@response, "v4 version check - invalid type");   # Expected failure - invalid type
+
+# v3
+@response = send_request('port' => 40321, 'version' => 3, 'ssl' => 0);
+isnt_response(\@response, "v3 version check");   # Expected failure
+
+# v2
+@response = send_request('port' => 40321, 'version' => 2, 'ssl' => 0);
+is_response(\@response, 'v2 version check', 'version' => 2);
+
+@response = send_request('port' => 40321, 'version' => 2, 'ssl' => 0, 'length' => +10);
+is_response(\@response, 'v2 version check - large', 'version' => 2);
+
+@response = send_request('port' => 40321, 'version' => 2, 'ssl' => 0, 'length' => -10);
+isnt_response(\@response, "v2 version check - short");   # Expected failure
+
+done_testing();

+ 70 - 0
tests/020-ssl.t

@@ -0,0 +1,70 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+BEGIN {
+    use File::Basename;
+    use lib (dirname(__FILE__));
+}
+
+use Test::More;
+use nrpe;
+
+my @output;
+
+if (!supports_ssl()) {
+    plan skip_all => 'SSL/TLS support unavailable.';
+}
+
+# SSLv3 may or may not be supported so we don't explicitly test it.
+my @SSL_Versions_Bad = ( 'TLSv1', 'TLSv1.1' );
+my @SSL_Versions_Good = ( 'SSLv3+', 'TLSv1+', 'TLSv1.1+', 'TLSv1.2', 'TLSv1.2+', 'TLSv1.3', 'TLSv1.3+' );
+
+plan tests => 10 + ((scalar @SSL_Versions_Bad + scalar @SSL_Versions_Good) * 2);
+
+
+ensure_daemon_running();
+switch_config_file("configs/ssl.cfg");
+restart_daemon();
+
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321`;
+is($?, STATE_OK, 'connect ssl') || diag @output;
+like($output[0], qr/NRPE v.*/, 'connect ssl response') || diag @output;
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321 --ca-cert-file=configs/certs/nrpe.crt`;
+is($?, STATE_OK, 'connect ssl ca') || diag @output;
+like($output[0], qr/NRPE v.*/, 'connect ssl ca response') || diag @output;
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321 --ca-cert-file=configs/certs/nrpe.crt --client-cert=configs/certs/nrpe.crt --key-file=configs/certs/nrpe.key`;
+is($?, STATE_OK, 'connect ssl cert') || diag @output;
+like($output[0], qr/NRPE v.*/, 'connect ssl cert response') || diag @output;
+
+@output = `$checknrpe -H 127.0.0.1 -p 40321 --ca-cert-file=configs/certs/other.crt`;
+is($?, STATE_UNKNOWN, 'connect ssl other ca') || diag @output;
+like($output[0], qr/CHECK_NRPE: \(ssl_err != 5\) Error - Could not complete SSL handshake with/, 'connect ssl other ca response') || diag @output;
+
+# --log-file=logs/check_nrpe_ssl.log --ssl-logging=255 
+#  openssl: CHECK_NRPE: Error - Could not connect to .*
+# libressl: CHECK_NRPE: Error sending query to host.
+@output = `$checknrpe -H 127.0.0.1 -p 40321 --ca-cert-file=configs/certs/nrpe.crt --client-cert=configs/certs/other.crt --key-file=configs/certs/other.key`;
+is($?, STATE_UNKNOWN, 'connect ssl other cert') || diag @output;
+like($output[0], qr/CHECK_NRPE: Error /, 'connect ssl other cert response') || diag @output;
+
+
+foreach ( @SSL_Versions_Bad ) {
+    my $ver = $_;
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 --ca-cert-file=configs/certs/nrpe.crt --ssl-version=$ver`;
+    is($?, STATE_UNKNOWN, "connect ssl $ver") || diag @output;
+    like($output[0], qr/CHECK_NRPE: \(ssl_err != 5\) Error - Could not complete SSL handshake with/, "connect ssl $ver response") || diag @output;
+}
+
+foreach ( @SSL_Versions_Good ) {
+    my $ver = $_;
+    @output = `$checknrpe -H 127.0.0.1 -p 40321 --ca-cert-file=configs/certs/nrpe.crt --ssl-version=$ver`;
+    is($?, STATE_OK, "connect ssl $ver") || diag @output;
+    like($output[0], qr/NRPE v.*/, "connect ssl $ver response") || diag @output;
+}
+
+
+done_testing();

+ 85 - 0
tests/021-ssl-protocol.t

@@ -0,0 +1,85 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+BEGIN {
+    use File::Basename;
+    use lib (dirname(__FILE__));
+}
+
+use IO::Select;
+use IO::Socket;
+use IO::Socket::SSL;
+use Test::More;
+use nrpe;
+
+my @response;
+
+if (!supports_ssl()) {
+    plan skip_all => 'SSL/TLS support unavailable.';
+}
+
+plan tests => 16;
+
+
+ensure_daemon_running();
+switch_config_file("configs/ssl.cfg");
+restart_daemon();
+
+
+# v4
+@response = send_request('port' => 40321);
+is_response(\@response, 'v4 version check');
+
+@response = send_request('port' => 40321, 'length' => +10);
+is_response(\@response, 'v4 version check - large');
+
+@response = send_request('port' => 40321, 'length' => -10);
+isnt_response(\@response, "v4 version check - short");   # Expected failure - server read timeout
+
+@response = send_request('port' => 40321, 'crc' => 0);
+isnt_response(\@response, "v4 version check - invalid crc");   # Expected failure - crc
+
+@response = send_request('port' => 40321, 'type' => 20);
+isnt_response(\@response, "v4 version check - invalid type");   # Expected failure - invalid type
+
+# v3
+@response = send_request('port' => 40321, 'version' => 3);
+isnt_response(\@response, 'v3 version check');  # Expected failure
+
+# v2
+@response = send_request('port' => 40321, 'version' => 2);
+is_response(\@response, 'v2 version check', 'version' => 2);
+
+
+
+# SSL/TLS Connection/Handshake Timeout
+SKIP: {
+    my $client = IO::Socket->new(
+            Domain => AF_INET,
+            Type => SOCK_STREAM,
+            proto => 'tcp',
+            PeerHost => 'localhost',
+            PeerPort => 40321,
+        ) || skip 'failed create socket', 1;
+
+    my $sel = IO::Select->new( $client );
+    my @c = $sel->can_read(15);
+    is(@c, 1, 'SSL/TLS Handshake timeout');
+    $client->close();
+}
+
+# SSL/TLS short header - result (less than common)
+send_and_wait_for_timeout(pack('n!n!N! ', 4, 1, 0), 'v4 missing result');
+
+# SSL/TLS short header - alignment
+send_and_wait_for_timeout(pack('n!n!N!n! ', 4, 1, 0, 0), 'v4 missing alignmnet');
+
+# SSL/TLS short header - buffer size
+send_and_wait_for_timeout(pack('n!n!N!n! n!', 4, 1, 0, 0, 0), 'v4 buffer size');
+
+# SSL/TLS large buffer size
+send_and_wait_for_timeout(pack('n!n!N!n! n! N!', 4, 1, 0, 0, 0, 75*1024), 'v4 large buffer size', 'timeout' => 0);
+
+
+done_testing();

+ 31 - 0
tests/050-misc.t

@@ -0,0 +1,31 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+BEGIN {
+    use File::Basename;
+    use lib (dirname(__FILE__));
+}
+
+use Test::More tests => 6;
+use nrpe;
+
+my @output;
+
+
+# Various misc tests. Some just for code coverage
+
+@output = `$checknrpe`;
+is($?, STATE_UNKNOWN, 'usage') || diag @output;
+@output = `$checknrpe --license`;
+is($?, STATE_UNKNOWN, 'license') || diag @output;
+@output = `$checknrpe --config-file=configs/check_nrpe.cfg`;
+is($?, STATE_UNKNOWN, 'config') || diag @output;
+@output = `$checknrpe --config-file=configs/nonexistant.cfg`;
+is($?, STATE_UNKNOWN, 'config nonexistant') || diag @output;
+@output = `$checknrpe --config-file=configs/check_nrpe.cfg -H 127.0.0.1 -p 40000`;
+is($?, STATE_CRITICAL, 'invalid port') || diag @output;
+
+# We're trying to invoke alarm_handler() due to a timeout. Use an IP address that shouldn't be in use
+@output = `$checknrpe --config-file=configs/check_nrpe.cfg --timeout=1:WARNING -H 0.0.0.111 -p 40000`;
+is($?, STATE_WARNING, 'invalid ip') || diag @output;

+ 18 - 0
tests/999-shutdown.t

@@ -0,0 +1,18 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+BEGIN {
+    use File::Basename;
+    use lib (dirname(__FILE__));
+}
+
+use Test::More tests => 1;
+use nrpe;
+
+
+ensure_daemon_running();
+kill_daemon();
+
+pass("shutdown");
+done_testing();

+ 27 - 0
tests/Makefile.in

@@ -0,0 +1,27 @@
+# Makefile for nrpe tests using perl
+
+srcdir=@srcdir@
+builddir=@builddir@
+abs_top_builddir=@abs_top_builddir@
+
+
+all: 
+
+test: configs checks
+	@[ -d logs ] || mkdir logs
+	@[ -d run ] || mkdir run
+	prove $(srcdir)/*.t :: $(abs_top_builddir)
+
+configs: $(srcdir)/configs
+	ln -f -s $? $@
+
+checks: $(srcdir)/checks
+	ln -f -s $? $@
+
+clean:
+	rm -rf logs run
+	[ -h configs ] && rm configs || true
+	[ -h checks ] && rm checks || true
+
+distclean: clean
+	rm -f Makefile nrpe.cfg misc.cfg

+ 35 - 0
tests/checks/lorem.10000.txt

@@ -0,0 +1,35 @@
+
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur tempus tempus eros, vitae ullamcorper elit scelerisque vel. Maecenas mauris tellus, tristique sit amet dapibus in, dignissim sit amet orci. Suspendisse convallis sollicitudin turpis at semper. Cras velit diam, pretium a arcu ac, vestibulum ultricies ligula. Proin lacinia odio non molestie eleifend. Sed sodales interdum elit, mollis bibendum velit ultricies non. Maecenas ornare erat eget bibendum rutrum. In mollis, magna sed fermentum pretium, purus nunc lobortis nibh, eu sodales metus nisl nec purus. Duis venenatis odio non leo volutpat viverra. Morbi posuere tortor in viverra ultricies. Curabitur eget leo massa. Nullam quis ante elementum, varius nisl ut, auctor tellus. Aliquam a metus mattis, semper tellus at, suscipit arcu. Nullam sollicitudin dapibus maximus. Aliquam erat volutpat.
+
+Nulla id condimentum nisi. Sed a porttitor libero, eu tristique erat. Donec lacus ex, suscipit quis bibendum id, vulputate vel ex. Sed non placerat odio, quis pretium arcu. Vivamus lacinia rutrum commodo. Sed vel lacus felis. Maecenas tristique, lacus eu mattis volutpat, justo lectus hendrerit metus, id vehicula eros nisl a mi. Ut gravida mauris quis elit interdum viverra. Nam enim nunc, porttitor ac sem non, rutrum malesuada enim. Vestibulum scelerisque posuere consequat. Aenean porttitor euismod arcu, eget faucibus sapien condimentum at.
+
+In egestas condimentum tortor, dignissim consequat augue consectetur at. Ut fermentum placerat metus. Suspendisse sit amet nulla et magna pharetra interdum non et erat. Aliquam id elit ligula. Nam eu eros pellentesque, vehicula mi quis, dapibus lorem. Sed fermentum enim in lacus condimentum gravida. Ut ac varius libero. Donec vel purus id mi volutpat dapibus id quis massa. Morbi molestie vestibulum felis, vitae congue purus iaculis sit amet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent vel libero ac velit eleifend facilisis a vitae elit. Nam purus diam, aliquam a auctor non, tempor in mi. Etiam auctor lectus ut arcu dignissim facilisis. Donec id blandit mi. Ut erat ex, fringilla laoreet aliquam sed, vestibulum eu enim. Praesent in metus eu sem posuere porttitor.
+
+Nulla facilisi. Donec sit amet euismod justo, sed auctor ante. Nunc pellentesque vel sapien et viverra. Nam convallis, sem quis ultricies elementum, nunc ante aliquet neque, in iaculis libero magna eu ante. Praesent faucibus est eget felis elementum varius. Vestibulum placerat porttitor justo, ut suscipit dolor interdum a. Nunc a luctus leo, sit amet porttitor nulla. Praesent elementum sem metus, vel maximus enim dictum eu.
+
+Suspendisse dictum ligula ac hendrerit eleifend. Cras ut ipsum volutpat, sagittis sapien at, bibendum nisi. Donec posuere, odio sit amet finibus sagittis, nulla nisi consequat felis, ut egestas nibh quam et diam. In rhoncus non sem nec blandit. Vivamus nec sapien et lacus ultrices sagittis auctor vulputate diam. Sed sagittis ante quis purus commodo, vitae venenatis tortor ultrices. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam facilisis sapien eu diam iaculis, a viverra tortor ullamcorper. Fusce eu quam eget mi efficitur tempor.
+
+Mauris auctor urna vitae eros lacinia, a egestas diam malesuada. Aliquam ultrices tempus arcu nec posuere. Vivamus elementum, nibh id ultrices elementum, velit sem euismod libero, ut scelerisque ligula nunc vehicula dui. Nullam et ex nec lorem rhoncus ultrices ut quis dolor. Pellentesque congue condimentum porta. Sed eget ante malesuada, porttitor risus tristique, mattis dolor. Suspendisse justo dui, rhoncus vehicula tortor nec, consectetur pulvinar nisi. Nunc finibus in magna fermentum elementum. Maecenas dignissim magna in neque tristique accumsan.
+
+Donec at consectetur dolor. Aliquam eleifend porttitor accumsan. Sed tincidunt fringilla augue, non varius lectus rutrum vel. Pellentesque vitae metus sed urna mattis facilisis sed a odio. Pellentesque scelerisque suscipit nunc, at pellentesque arcu congue eget. Nunc dapibus ac neque at ultrices. Donec mi lorem, vehicula non fringilla a, pharetra eget eros. Curabitur eget lacus fringilla, commodo nulla id, ultrices orci. Donec fermentum, dolor vitae ultricies posuere, arcu nunc blandit risus, non tincidunt turpis nisl at purus. In eu finibus sapien. Phasellus iaculis aliquet orci.
+
+Donec sodales diam a bibendum hendrerit. Vestibulum dapibus semper nisl, vel luctus augue convallis viverra. Aenean sit amet mattis arcu. Phasellus ullamcorper fermentum lacinia. Duis nec augue elit. Nulla congue massa diam, eget tincidunt diam mollis vitae. In condimentum quam eros, a pretium ipsum ultrices in. Duis dictum leo in metus bibendum efficitur. Nunc finibus eu nisl sed egestas. Nam nec orci non ex rhoncus accumsan. Nunc ac nisl sed erat aliquet posuere sit amet at odio. Suspendisse tristique hendrerit dolor, maximus lacinia sem tempus ac. Cras in tincidunt nisi, vitae bibendum ex. Donec a tortor tempor, sollicitudin erat a, ornare quam. Nullam nec nibh a lacus bibendum malesuada.
+
+Sed ac nisl massa. Quisque id mollis nisl, non tempor turpis. Vestibulum magna sapien, venenatis eget ex ut, ultrices auctor dui. Morbi rhoncus eget risus in porttitor. Mauris non consectetur turpis. Pellentesque in porta tortor. Etiam faucibus lectus velit, vel aliquam magna aliquam id. Vivamus posuere non leo non venenatis. Aenean elementum tempor eros non interdum. Nullam a posuere nunc. Donec finibus id magna id rutrum. Proin vitae nisl eget ante viverra venenatis.
+
+Nullam vitae ligula libero. Nunc lacinia, massa at laoreet ullamcorper, tellus tellus rhoncus nibh, vel auctor ligula massa quis eros. Phasellus maximus accumsan ullamcorper. Nunc purus elit, placerat at felis ut, consequat convallis dui. In a leo tempor neque elementum mattis eget et orci. Nullam interdum risus tortor, eu pellentesque felis tincidunt in. Nam finibus lorem at tortor eleifend, faucibus feugiat nisl ultrices. Donec scelerisque at nisi quis malesuada. Nulla at lectus et nibh tristique rhoncus. Fusce at ex nisi. Donec et tincidunt ipsum. Vivamus et fermentum nulla.
+
+Integer quam libero, feugiat vel pellentesque non, commodo non mauris. Vestibulum in dui sit amet magna semper elementum ut sed eros. Quisque eget eleifend lacus. Nullam eget mollis metus, et cursus nunc. Vivamus quis purus viverra, euismod metus sit amet, condimentum dolor. Nam massa dolor, iaculis nec enim id, laoreet tincidunt ipsum. In ex tortor, luctus at vehicula mollis, eleifend quis erat. Ut id quam in mi condimentum accumsan. Nulla sed ipsum eget enim pharetra aliquam. Proin suscipit augue eget justo placerat vestibulum. Mauris venenatis euismod cursus. Curabitur pretium risus dolor, nec posuere arcu ornare in.
+
+Duis at lacinia elit. Etiam at efficitur est, eget luctus sapien. Mauris mollis lobortis urna ac lacinia. Suspendisse potenti. Duis elementum placerat augue at efficitur. Sed ultrices neque eu posuere varius. Aliquam dapibus auctor consequat. Aliquam ut lorem massa. Proin aliquet, nulla a consequat finibus, lectus tellus gravida lacus, id imperdiet neque erat a neque. Etiam finibus urna in erat ultricies, sed dapibus arcu euismod.
+
+Donec ullamcorper dui sit amet urna vestibulum, non posuere enim volutpat. Duis non iaculis neque, a sollicitudin tortor. In viverra nisi ultricies consectetur dapibus. Donec rhoncus a urna non convallis. Aliquam erat volutpat. Duis euismod tortor turpis, in euismod ex sollicitudin vel. Sed eget posuere nibh.
+
+Praesent tristique dolor lectus, nec elementum velit iaculis id. Ut laoreet nibh vitae arcu accumsan, sed eleifend ipsum lobortis. Mauris id sapien in mi iaculis faucibus ac id enim. Proin convallis, lacus ac imperdiet placerat, justo turpis maximus massa, vel pretium justo quam sit amet massa. Curabitur sed sem nec elit sollicitudin porta aliquam ac enim. Etiam elementum ante id augue volutpat elementum in eu leo. Donec dapibus nibh nulla, id tempor arcu aliquet eget. Integer sodales, leo sed faucibus eleifend, magna mauris pellentesque lacus, in suscipit augue arcu sit amet lacus.
+
+Integer elementum, dui ac vulputate gravida, erat enim iaculis erat, vitae malesuada diam metus vel eros. Donec sit amet ante diam. Sed mollis sem at elit rhoncus porttitor. Morbi leo ante, efficitur pellentesque nisl eu, faucibus semper leo. Fusce pellentesque metus ac lacus iaculis, et pellentesque mauris tempus. Maecenas dignissim eros ac ex euismod efficitur. Fusce dapibus tincidunt pellentesque. Ut porttitor ac tellus et facilisis. Aenean bibendum dignissim lorem, ac vehicula ligula sodales in. Nulla bibendum, eros vitae aliquam sodales, erat ligula pretium libero, non volutpat nisi sapien ut arcu. Curabitur accumsan, turpis ac vehicula mollis, quam turpis iaculis felis, sit amet ullamcorper magna ligula in ligula. Vivamus lacinia at quam ac pharetra. Donec dolor quam, rhoncus ac tincidunt at, pulvinar et augue.
+
+Proin quis imperdiet massa. Nulla efficitur arcu elementum sodales efficitur. Etiam ultrices sollicitudin suscipit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In iaculis nibh quis odio ultrices, nec posuere magna dignissim. Curabitur molestie tempus tempor. Duis facilisis imperdiet felis sit amet convallis. Nullam pharetra et turpis et mattis. Donec placerat a nisi vitae fringilla. Sed sollicitudin semper auctor. Donec volutpat condimentum arcu. In dapibus tincidunt mauris, non lobortis metus elementum non.
+
+Phasellus sit amet nisl finibus lacus luctus auctor vitae in nibh. Ut molestie orci quis sapien dictum, nec malesuada lacus pharetra. Ut vitae nisl cursus, eleifend augue at, ullamcorper urna. Praesent consectetur lectus eget massa congue, eget cursus justo facilisis. Quisque erat mauris, aliquet et vestibulum at, viverra et massa. Ut justo metus, facilisis ac venenatis et, laoreet eu magna. Suspendisse vitae nunc quis felis congue feugiat. Donec et nulla dignissim, condimentum est et, viverra dui. Ut eu mauris ut nisl ornare tincidunt. 

+ 204 - 0
tests/checks/lorem.60000.txt

@@ -0,0 +1,204 @@
+
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lorem augue, fermentum sit amet eros vitae, tristique semper lorem. Vivamus consequat accumsan risus, vitae eleifend nulla iaculis sed. Phasellus rutrum ac nisi eget vehicula. Nullam a sapien vel nunc elementum accumsan. Maecenas pellentesque, orci nec condimentum varius, sem velit molestie erat, non euismod elit justo ac nisl. Suspendisse lobortis lacus id odio cursus suscipit. Vestibulum at lorem tellus. Mauris id eros a justo feugiat viverra. Etiam egestas quam sit amet risus efficitur blandit. Aliquam ultrices ligula nunc, ac molestie enim vehicula sollicitudin.
+
+Vivamus neque augue, semper nec lobortis vitae, feugiat vitae nibh. Vestibulum nisl lectus, semper eu lorem id, facilisis dictum sapien. Donec aliquam dapibus risus vitae tempor. Maecenas iaculis porttitor suscipit. Donec hendrerit nulla quis justo malesuada, quis molestie sem gravida. Vivamus sem enim, pulvinar ac ultrices at, tincidunt dapibus nibh. Proin pulvinar faucibus neque in elementum. Ut sit amet nisl iaculis, vehicula eros feugiat, efficitur ligula. Pellentesque dictum orci urna, non porta sem gravida sit amet. In consectetur tortor sem, a tristique eros fringilla sed.
+
+Aenean vel libero sagittis, dictum magna rhoncus, ornare metus. Aenean sed ex diam. Ut semper, leo non tristique blandit, massa leo tristique arcu, in ultricies ante augue id eros. Morbi porta aliquet neque, non blandit elit tincidunt a. Sed viverra justo lectus, ac posuere quam porta vel. Nunc vitae risus eget erat gravida faucibus. Nam eros mauris, tempus vel nunc eu, eleifend tristique dui. Donec eget metus in nibh molestie elementum at sed lacus. Praesent laoreet lectus vitae placerat viverra. Donec dolor risus, aliquet quis vulputate sit amet, bibendum at ex. Morbi lobortis lacus porttitor orci sagittis, non finibus lorem sagittis. Pellentesque finibus metus vitae porta gravida.
+
+Proin fermentum eget nibh et malesuada. Etiam non euismod metus. Vivamus pretium nec magna bibendum laoreet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi facilisis faucibus tortor, nec ornare ante luctus nec. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque at libero iaculis, iaculis tellus in, sodales justo. Nulla facilisi.
+
+Praesent sit amet pulvinar tellus, eget dictum sapien. Nam sed enim pretium sem viverra fringilla in et sem. Sed in vestibulum lacus, eget lobortis arcu. Quisque viverra ultricies augue id dapibus. Aenean malesuada pulvinar nulla, sit amet posuere augue elementum nec. Suspendisse bibendum maximus lobortis. Morbi augue mauris, eleifend vitae felis cursus, congue mattis magna. Pellentesque sapien lacus, tincidunt nec aliquam sed, ultricies ac lectus. Nulla venenatis pharetra hendrerit. Integer ac semper velit. Duis sed hendrerit nibh. Donec vitae nisi vel justo sodales sagittis. Etiam condimentum neque eu elementum porttitor. In hac habitasse platea dictumst. Vestibulum tempor lacus vel placerat luctus.
+
+Suspendisse sit amet rhoncus lorem. Cras eget felis ac libero rutrum rutrum a dictum nulla. Mauris a metus turpis. Morbi quis dolor malesuada, venenatis eros eget, dictum neque. Aliquam tincidunt lectus elit, et cursus mauris vulputate pellentesque. Nullam blandit, urna in pretium placerat, nisi neque aliquam urna, eget ornare mauris justo ut diam. Nunc sit amet dictum lacus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer lobortis nibh vitae nisl iaculis, ac elementum diam mattis. Aliquam malesuada arcu et vulputate mattis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;
+
+Cras elementum ex et nisl vestibulum, congue consectetur nulla volutpat. Vestibulum finibus odio quis tempor tincidunt. Aliquam euismod sodales ante ac venenatis. Fusce blandit scelerisque consectetur. Mauris vitae justo pulvinar, imperdiet odio in, aliquam urna. Donec nibh justo, scelerisque in eros at, elementum euismod orci. Pellentesque varius purus vel mattis vulputate. Aenean vel pulvinar sem. Sed rhoncus molestie massa. Suspendisse potenti. Integer a odio nec dolor aliquet aliquet et molestie erat. Nulla hendrerit dignissim lacinia. Suspendisse maximus rutrum molestie. Quisque lacinia neque ut lacus accumsan iaculis. Fusce sit amet mollis nisi.
+
+Quisque sed quam sit amet felis auctor aliquam. Nunc quis ultricies tortor. Integer magna nisl, sollicitudin et risus ac, iaculis commodo augue. Sed bibendum placerat elit vitae condimentum. Vivamus porttitor, libero semper condimentum tempus, magna erat aliquam erat, et lobortis metus diam at libero. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut sagittis odio enim, eget lobortis orci efficitur sit amet. In a scelerisque arcu, eu gravida mi. Nullam ipsum ipsum, hendrerit dapibus gravida ut, suscipit quis ex. Nulla sapien velit, tincidunt commodo turpis sit amet, tempus luctus orci. Nunc a risus imperdiet nunc suscipit ultrices eget venenatis lectus. Aenean nec turpis eu arcu vestibulum egestas ac vitae purus. Aenean vehicula fringilla ligula sit amet auctor. Cras aliquam, lacus eu imperdiet iaculis, eros arcu vulputate quam, nec rutrum nisi leo quis urna. Duis auctor
+ullamcorper elit, in accumsan augue tempus a.
+
+Sed vulputate varius diam in pretium. Ut fermentum risus quis lacus lobortis tempor. Nulla ipsum mi, feugiat ut condimentum eget, dapibus et nibh. Cras mollis et risus id egestas. Sed congue ex a dignissim congue. Donec id venenatis erat. Nunc a blandit nulla, id gravida enim. Aliquam erat volutpat. Fusce id efficitur tortor. Fusce maximus felis orci, ut consectetur neque suscipit a. Suspendisse orci felis, faucibus ac ultricies sit amet, viverra non magna. Nam nisl risus, lacinia vitae accumsan venenatis, rhoncus a ligula. Maecenas pulvinar justo congue iaculis fermentum. Sed in massa orci. Etiam ultricies blandit ultricies.
+
+Phasellus dapibus magna nec arcu commodo, nec ultricies metus laoreet. Maecenas nibh neque, faucibus vel quam sit amet, dapibus pretium augue. Curabitur eget tincidunt ante. Sed id posuere felis. Aenean malesuada tortor nulla, in accumsan nisi placerat eu. Maecenas et mattis sapien. Proin ac pellentesque nulla, sed laoreet tellus. Fusce vulputate sit amet tortor a viverra. Etiam interdum mauris vel nisl maximus varius. Nulla laoreet iaculis tortor, non malesuada eros. In in nulla et risus placerat dictum.
+
+In mi felis, malesuada sed est sed, volutpat dignissim lorem. Praesent porta nibh quis odio sodales ultrices. Curabitur maximus turpis nec arcu viverra egestas. Nullam eu rutrum erat. Curabitur nulla leo, condimentum nec diam at, pellentesque mattis sapien. Suspendisse at diam ut turpis egestas tincidunt. Aenean felis justo, convallis id dolor non, tristique sagittis est. Curabitur eleifend eleifend ligula et lobortis.
+
+Nunc tristique, lorem in suscipit molestie, diam magna dignissim nisi, vitae dapibus ligula massa ac arcu. Integer vel arcu porttitor, scelerisque libero eget, euismod orci. Nullam pellentesque, nunc nec ultricies pulvinar, ante tortor vestibulum lectus, quis venenatis felis ipsum vel arcu. Nulla eget tortor a justo aliquet cursus. Pellentesque quis neque nec ligula blandit euismod. Integer commodo purus dignissim dolor bibendum faucibus. Etiam nibh ante, consectetur in placerat et, suscipit eget nibh.
+
+Suspendisse at nisl faucibus, pretium lacus quis, imperdiet ante. Curabitur pellentesque lacus venenatis ex vestibulum, dapibus sagittis augue auctor. Praesent imperdiet eleifend augue. Etiam in sodales magna. Quisque tristique tellus sit amet neque vulputate, non convallis mauris sollicitudin. Vivamus feugiat ullamcorper est, vel aliquet orci vehicula et. Vestibulum mattis diam eget nisi facilisis, eu blandit tortor tempor. Integer bibendum dolor sit amet eleifend ornare. Phasellus ut erat ut turpis aliquet finibus nec vel eros. Praesent sed egestas velit, id posuere tortor. Maecenas efficitur leo a diam elementum, bibendum fermentum augue posuere.
+
+Praesent non justo commodo, consectetur ante at, imperdiet nulla. Donec sodales, erat eget consequat lacinia, ante neque feugiat ante, sed elementum dui elit quis metus. Sed vel eros in libero porttitor imperdiet. Aliquam in lacus velit. Pellentesque commodo volutpat risus et lobortis. Vivamus faucibus tempus mi sit amet pellentesque. Praesent vitae nibh in sapien venenatis hendrerit ut quis purus. Duis ultrices, tellus sed posuere accumsan, magna quam varius lectus, vel tempus turpis nulla eget est.
+
+Quisque quis elit vehicula, ultrices tellus a, tempor metus. Aenean rhoncus justo sed massa laoreet, a pharetra dui efficitur. Nunc fringilla vel mi et iaculis. Aliquam in leo quis odio eleifend mollis. Suspendisse potenti. Aenean quis tristique nisi. Nullam accumsan tellus a eros varius, sed porta arcu placerat.
+
+Pellentesque varius nunc non tempus volutpat. Aliquam faucibus semper urna. Donec in ex in ex bibendum rhoncus. Nulla sed lacus consequat, congue dolor a, porta velit. Duis iaculis, dui et viverra mattis, ipsum nisl convallis dolor, congue suscipit eros elit non quam. Maecenas sit amet elit in augue gravida rutrum. Maecenas non tellus in metus bibendum efficitur. Etiam egestas neque mauris, mollis consectetur diam tempor vitae. In hac habitasse platea dictumst. Suspendisse quis congue dolor, sit amet luctus sapien. Aliquam eu odio et risus ultrices lobortis quis nec sapien. Sed congue ante ut leo fringilla, eget vehicula justo commodo.
+
+Integer consectetur sit amet leo sed scelerisque. Quisque vitae odio nisl. Vestibulum nunc metus, porta vel congue non, faucibus eu lorem. Phasellus odio magna, sodales vitae pellentesque sagittis, pretium a augue. Proin ipsum dolor, finibus eget orci at, convallis gravida diam. Quisque id pretium eros. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Duis non egestas nulla. Cras feugiat, ipsum quis vehicula pretium, quam sem finibus magna, feugiat egestas dolor est non velit. Duis ac lacus in nunc volutpat suscipit. Donec a efficitur arcu. Sed malesuada finibus augue at porta. Nullam hendrerit mauris odio, id pretium mi laoreet eget. Nullam posuere maximus maximus.
+
+Suspendisse varius mauris vitae sapien commodo semper. Pellentesque eu metus erat. Aliquam sodales lacinia erat vel dictum. Maecenas a nulla ut turpis consequat efficitur. Suspendisse commodo bibendum felis in vehicula. Nulla tristique ultrices lectus ut efficitur. Donec lacus nisl, porttitor in metus eu, congue rhoncus ligula. Sed a ex nec libero placerat egestas a quis mauris. Morbi nec mattis dolor. Integer eu malesuada sem.
+
+Nam vel rhoncus sem. Etiam quis convallis dolor. Ut nec odio velit. Mauris finibus finibus ipsum, in condimentum purus pulvinar at. Etiam dictum tellus ac bibendum pulvinar. Suspendisse quis ligula eu mi tempor feugiat. Nulla facilisi. Suspendisse vel commodo arcu, ac mollis massa. Aenean in tristique arcu, at tincidunt orci. Maecenas vitae quam cursus, tempus mauris rhoncus, elementum purus. Sed feugiat iaculis orci, id viverra metus fringilla in. Morbi dictum varius lorem, in consectetur sapien fringilla at. Proin velit enim, tincidunt vel sem a, posuere lacinia est. Nullam tincidunt sed magna vulputate congue.
+
+Etiam arcu ligula, tincidunt id viverra sit amet, pellentesque quis urna. Aenean vulputate dapibus quam ut tempor. Nullam consectetur posuere dolor nec iaculis. Fusce ac convallis nunc. Maecenas congue mauris lacus, vitae sagittis nibh ultrices et. Nullam ultricies ante eget aliquam elementum. Pellentesque et massa nec ligula aliquam faucibus. Aenean a arcu non sem tempus ultricies at eget nibh. Proin faucibus euismod molestie. Mauris ultricies, elit et accumsan consequat, nisi libero molestie est, molestie tempor turpis erat tempor nibh. Sed ornare, metus ac efficitur feugiat, nulla elit volutpat sem, vitae elementum arcu libero at lacus. Phasellus id consectetur velit, nec hendrerit est. Vestibulum ut diam bibendum, eleifend nulla sed, tempus nibh. Sed ultrices sagittis odio.
+
+Proin ullamcorper rhoncus dolor, sit amet dapibus ligula egestas eget. Nam vehicula vel dolor vitae sodales. Phasellus scelerisque ligula nec libero egestas facilisis. Cras pretium tempus tortor, non interdum nisl pharetra sit amet. Sed ornare viverra velit, a tempus mauris auctor ut. Donec in arcu dui. Fusce dictum ac nunc auctor auctor.
+
+Nunc bibendum imperdiet mauris, in rhoncus libero consequat vel. Vestibulum at odio magna. Mauris tincidunt ac arcu ac luctus. Integer justo mi, ullamcorper ut sapien nec, congue condimentum elit. Nunc eu tristique sem. Vestibulum tempus blandit massa eget aliquam. Maecenas ullamcorper tellus risus, id gravida eros volutpat in. Donec commodo, purus nec consectetur imperdiet, dolor nibh porttitor tellus, at elementum arcu nisi nec tortor. Mauris rutrum mi velit, non feugiat ipsum volutpat nec.
+
+In felis ipsum, molestie at odio id, mattis accumsan sapien. Maecenas at mattis diam. Aliquam tincidunt, orci eget imperdiet faucibus, est leo luctus odio, sit amet dignissim felis lacus sit amet nulla. Ut tempus sapien odio, quis venenatis diam mattis consequat. Quisque tincidunt pharetra malesuada. Suspendisse sed erat lacus. Praesent et lorem dignissim mauris pharetra porta at eget eros. Sed fermentum nec lectus nec scelerisque. Nulla fringilla magna dui, eget pellentesque diam tempus a. Suspendisse ullamcorper nulla et viverra porta. Curabitur in nisi finibus dui faucibus rhoncus nec vel purus. Mauris sed purus id ex tincidunt cursus.
+
+Quisque varius lacus sit amet nisi porttitor, at elementum mi sodales. Vestibulum facilisis mattis ex non bibendum. Sed vel leo efficitur, molestie purus sit amet, posuere felis. Aliquam nisl dolor, dignissim a lobortis et, porta quis libero. Aenean non scelerisque ligula. Duis egestas leo sed orci egestas, nec luctus mauris egestas. Curabitur vitae ligula vitae lacus rutrum molestie. Sed euismod eget odio at sollicitudin. Vivamus malesuada eleifend tellus, a mollis mauris vestibulum a. Aenean et erat condimentum, condimentum neque nec, tempus nunc.
+
+In at ullamcorper nisl. Aenean pretium rutrum felis, quis sollicitudin nunc mattis et. Vivamus dictum scelerisque velit, eget convallis leo vehicula vitae. Ut rhoncus efficitur lectus, quis accumsan quam eleifend vel. Etiam sed mauris dapibus, aliquam dolor quis, porttitor erat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam placerat auctor arcu, nec finibus ligula eleifend eu. Curabitur condimentum sagittis sem, non tristique mauris pellentesque ac. Proin ac luctus massa. Duis rutrum egestas tellus eget viverra. Sed lobortis neque at quam semper suscipit. Mauris venenatis urna ex, sed condimentum ante blandit sit amet. Ut ultrices fermentum felis maximus blandit. Mauris commodo fermentum rutrum. Quisque venenatis interdum ipsum eu efficitur.
+
+Donec tempus auctor ultrices. Aenean aliquet nunc nec efficitur dignissim. Nam tincidunt ipsum ut aliquam consectetur. Morbi mauris risus, iaculis eu sem sollicitudin, vulputate finibus nisl. Proin vel luctus diam. Donec nec vulputate enim. Vivamus eu egestas nibh. Cras a elementum ante. Mauris accumsan auctor enim. Maecenas malesuada luctus risus, et placerat libero rhoncus eget. Vivamus vehicula pulvinar augue in sodales. Praesent lorem nisl, tincidunt id bibendum eleifend, scelerisque sit amet lectus. Nam eu libero nec augue venenatis pharetra. Nullam varius risus sed neque scelerisque elementum.
+
+Cras euismod vehicula augue in vulputate. Donec eget volutpat ante. Nullam ut porta ante, ut volutpat sem. Aliquam auctor et nulla quis tempus. Etiam ex purus, elementum non sagittis nec, sagittis vitae felis. Proin vulputate sapien eget ante vulputate, id varius turpis egestas. Ut sit amet urna nunc. Vestibulum nec semper tellus. Morbi mattis lorem orci, quis finibus nibh posuere et. Cras et erat ante.
+
+Ut nec ullamcorper justo. Praesent in cursus tellus, nec pulvinar lacus. Pellentesque id dui maximus, aliquet nulla et, varius est. In id ullamcorper urna. Aliquam facilisis nunc vitae ullamcorper tempor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sit amet lorem leo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nulla turpis velit, vestibulum vitae est in, mollis molestie mauris.
+
+Praesent placerat, eros ut cursus ultricies, nisl purus elementum elit, in vulputate quam eros a libero. Quisque sit amet pellentesque arcu. Donec placerat quam in facilisis dictum. Integer venenatis elit sed volutpat suscipit. Pellentesque sed tortor sodales, iaculis libero ac, fringilla risus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Morbi quis diam vel sem semper commodo. Ut a nunc sem. Phasellus condimentum eros vitae erat ultricies, ullamcorper vulputate urna pharetra.
+
+Praesent tristique mi eros, vitae feugiat ipsum varius nec. Donec efficitur a lacus et finibus. Nunc mollis diam non venenatis feugiat. Quisque auctor finibus lacinia. Phasellus commodo pretium lorem ut gravida. Morbi porttitor lectus augue, sed fermentum nisi dapibus eu. Pellentesque quis urna iaculis, porttitor eros a, maximus magna. Sed placerat neque quis felis tempor varius.
+
+Sed lobortis laoreet malesuada. Donec rhoncus viverra enim, ut porttitor diam posuere ut. Duis non odio commodo, ultrices turpis non, lobortis urna. Morbi nec lacinia sem. Pellentesque varius lorem libero. Nullam faucibus mauris et urna feugiat suscipit. Integer faucibus porttitor nisi, quis aliquet orci mattis sed. Sed dignissim sit amet augue non blandit. Vestibulum condimentum consectetur magna quis euismod. Nam in risus auctor massa auctor ultrices vulputate luctus metus. Nullam maximus pulvinar tempus. In sit amet euismod augue. Ut pellentesque luctus odio id vulputate. Integer euismod lorem diam, at venenatis justo faucibus condimentum. Etiam maximus posuere magna, ut gravida velit blandit at.
+
+Aenean sollicitudin eu magna vitae faucibus. Phasellus risus orci, auctor sed lectus pretium, pellentesque volutpat purus. Nullam eu turpis faucibus, ullamcorper diam et, consequat ligula. Nam ullamcorper, ligula vel tincidunt volutpat, risus leo rhoncus lectus, vitae pellentesque massa leo quis lectus. Nullam ullamcorper ex in libero tempus, nec viverra felis ornare. Mauris malesuada magna ut nisi vehicula vehicula. Nullam mollis, tellus eu posuere volutpat, justo arcu sodales dui, non vehicula dui felis ut sem. Etiam faucibus euismod sapien. In vitae quam viverra, dignissim augue a, maximus elit. Aenean eleifend placerat metus, eu porttitor nibh vestibulum vitae. Suspendisse ex orci, faucibus in bibendum sed, tincidunt sit amet ligula. Pellentesque id interdum dolor. Curabitur venenatis neque dui, vitae porta velit gravida id. Nulla maximus velit vel ipsum sollicitudin, in accumsan
+purus sollicitudin. Suspendisse eu sodales sapien. Ut congue fringilla mollis.
+
+Integer eu turpis velit. Donec congue id odio ac imperdiet. Aenean eget egestas ante, ac feugiat leo. Suspendisse pulvinar venenatis mauris, lobortis vestibulum sem. Sed finibus elit convallis, euismod tellus id, molestie risus. Nulla facilisi. Sed eget faucibus magna, ut aliquet nulla.
+
+Vestibulum malesuada nulla at odio laoreet pharetra at finibus lectus. Aenean vitae eros vitae magna efficitur convallis. Cras et luctus libero. Aliquam rutrum varius ullamcorper. In est nunc, tempus sit amet rutrum sit amet, aliquam ut leo. Ut a ullamcorper massa. Fusce a finibus ex. Praesent gravida, odio eu gravida malesuada, lectus tellus aliquet felis, et luctus sem dui a diam. Mauris ac rhoncus est, id blandit lorem. Nunc malesuada libero massa, sed iaculis dolor tincidunt eu. Vivamus id blandit ligula. Sed elit tellus, consequat quis convallis viverra, laoreet in lectus. Nullam sit amet vehicula lacus, in convallis tellus.
+
+Sed ac lacinia orci. Quisque ultrices nibh neque, et mollis odio placerat vitae. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus eu dui sit amet nisl viverra maximus. Proin leo massa, sodales quis dapibus quis, condimentum vel felis. Maecenas finibus tortor risus, vel facilisis ligula auctor vitae. Sed nec pharetra dui. Proin ullamcorper malesuada pharetra. Mauris urna risus, interdum nec tincidunt ac, pretium et erat. In hac habitasse platea dictumst. Duis ac sapien sit amet risus placerat vestibulum nec nec leo. Donec vitae scelerisque nisi. In egestas pharetra massa, in fringilla odio.
+
+Sed vehicula magna tortor. Morbi diam felis, cursus eu sollicitudin vel, molestie eget odio. Nulla accumsan, nisl at malesuada lobortis, est lorem rutrum augue, sed ultrices arcu orci ac metus. Aenean metus ante, aliquam vitae massa eu, feugiat consequat tortor. Suspendisse imperdiet consectetur felis, sed rhoncus magna fringilla at. Nunc non leo ut quam auctor posuere sit amet in lorem. Nam dignissim ultrices ex in tincidunt. Vivamus vitae sapien enim. Etiam dapibus sit amet quam vel posuere. Aliquam sagittis tincidunt pretium. Vestibulum eget velit nec erat auctor suscipit. Ut dapibus augue at felis viverra luctus.
+
+Vestibulum mi libero, gravida et augue sit amet, vestibulum varius diam. Donec sagittis nibh ante, vitae congue quam pharetra vitae. Quisque sit amet tempor turpis, non sollicitudin ante. Sed non arcu convallis, dignissim justo et, semper ligula. Aliquam vehicula ante vitae elit scelerisque eleifend. Nam id pulvinar lectus. Nunc orci nulla, rhoncus eu libero eu, commodo posuere libero. Maecenas interdum nunc magna, in euismod lorem mollis quis. Nulla sed tempus turpis. Cras leo lacus, vulputate vel rutrum vel, scelerisque quis lacus. Suspendisse vitae aliquam tortor.
+
+Curabitur non hendrerit est. Phasellus tempus rhoncus tincidunt. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque neque ligula, auctor a scelerisque ut, euismod eget augue. Nulla semper porttitor lorem, non aliquet tortor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nunc consectetur viverra condimentum. Fusce sit amet justo mauris. Cras scelerisque tellus lorem, non eleifend enim volutpat vel. Cras condimentum ornare ipsum at vulputate. Suspendisse venenatis sed est nec consectetur. Sed elementum nulla a turpis faucibus semper.
+
+Ut enim elit, dignissim varius molestie non, eleifend vel tellus. Proin sit amet justo quis odio interdum cursus sed quis libero. Phasellus dui diam, laoreet ac libero euismod, mattis sodales leo. Vestibulum aliquet, lacus sit amet imperdiet mattis, augue purus dapibus lorem, ac lacinia enim enim vel elit. Pellentesque in dapibus ex. Proin aliquam tortor sit amet ipsum feugiat, eget euismod odio pharetra. Donec luctus nisl dui. Suspendisse auctor placerat ante volutpat placerat. Vestibulum in dignissim velit, sagittis aliquet urna. Vestibulum quis diam sed nisi consequat laoreet.
+
+Sed magna dolor, tempor eu congue nec, ultricies id dolor. Vestibulum et lacus ante. Quisque pretium turpis ut turpis cursus, eu placerat nisl posuere. Sed tristique fringilla mollis. Vestibulum varius ut nisi condimentum sollicitudin. Nullam condimentum sollicitudin leo at mollis. Sed ut massa facilisis, condimentum elit ut, lobortis risus. In eget tellus non ante consectetur accumsan. Aliquam bibendum libero mi, a fringilla tellus molestie sit amet. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Morbi tempor turpis gravida dictum tincidunt.
+
+Donec ac pulvinar mi, vitae semper nunc. Maecenas metus magna, sodales viverra scelerisque nec, sagittis at mi. Curabitur consectetur mi lorem, a mattis risus fermentum id. Aenean enim libero, ornare at metus sed, faucibus accumsan purus. Quisque aliquam at lectus at elementum. Proin maximus enim leo, at iaculis odio tempor ut. Vestibulum porttitor at sapien et congue. Fusce vehicula et ligula id ultricies. Maecenas ullamcorper auctor risus a dignissim. Nunc dapibus euismod metus at condimentum. Donec sodales efficitur erat, sed semper magna bibendum nec. Praesent volutpat ante ipsum, vitae ornare nunc maximus in. Sed facilisis quis velit eget semper. Maecenas neque massa, molestie in tristique in, egestas sed quam.
+
+In mattis convallis viverra. Fusce eu felis quam. Donec eget sem sit amet neque vehicula semper. Aliquam non fermentum libero. Donec vel massa quam. Curabitur non ante tempor, bibendum metus quis, tempor tortor. Proin vehicula eu nunc nec venenatis. Quisque sem ligula, dapibus egestas quam nec, consectetur tristique quam. Vestibulum facilisis finibus vulputate. Duis tellus elit, ultricies quis ex id, suscipit semper ex. Quisque porttitor rutrum nisi, id efficitur dolor condimentum eu. Cras faucibus malesuada ex vitae tempor.
+
+Etiam at turpis dapibus, sagittis enim nec, semper massa. Maecenas faucibus pulvinar urna vitae mollis. Quisque faucibus felis vel tellus molestie fringilla. Fusce vel vehicula nulla, vel convallis felis. Sed gravida libero eu justo pellentesque viverra. In eget urna dolor. Maecenas nec auctor nisl. Donec viverra nunc a diam finibus, nec finibus felis vulputate. Praesent velit mauris, faucibus non libero quis, commodo pharetra massa. Fusce et aliquet nibh, eget pulvinar magna. Pellentesque tempus diam lacus, in hendrerit metus pellentesque ut. Phasellus pretium venenatis mi, nec aliquet enim volutpat id. Curabitur egestas ante quis efficitur rutrum. Donec eu dignissim velit, et congue sem. Vivamus efficitur id libero nec faucibus.
+
+Fusce suscipit tortor ac leo dignissim tristique. Curabitur neque est, commodo sed porttitor sit amet, sodales et elit. Mauris vel ex libero. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla sed elementum eros, ut facilisis mauris. Morbi vel congue dui. Etiam et accumsan nisi. Morbi eget ex felis. Ut iaculis diam non metus malesuada luctus. Vivamus sed efficitur sem, nec faucibus diam.
+
+Curabitur varius tempus leo ut vulputate. Proin mattis rutrum pharetra. Mauris erat massa, mollis quis cursus eu, semper sed sapien. Nullam maximus, ligula ultrices ornare suscipit, purus enim condimentum est, nec elementum tellus nisi a arcu. Nullam rutrum quam non ultricies luctus. Integer sollicitudin efficitur ipsum, et pretium lectus scelerisque vel. Nulla pellentesque mi nulla, ullamcorper faucibus sem tempor at.
+
+Nam vel elit ac libero blandit dapibus ornare egestas orci. Proin consequat vulputate commodo. Mauris sit amet eleifend est. Vestibulum condimentum sodales eros ut luctus. Nullam ut ex et leo condimentum tempor. Nulla venenatis scelerisque sapien, sit amet laoreet dui semper eget. Donec porta mollis quam eget condimentum. Morbi ullamcorper, ante vel porta consectetur, dolor erat aliquam tellus, ac vehicula ligula orci sit amet ex. Nulla dui nulla, molestie non bibendum vitae, fermentum at tellus. Donec at pharetra dolor, sed ultricies ipsum. Aliquam elit neque, posuere eget tortor non, consectetur ullamcorper ante. Pellentesque ultricies ipsum id dignissim mollis. Sed tellus augue, condimentum et eros sit amet, ornare convallis leo. In hac habitasse platea dictumst. Curabitur ullamcorper, lectus et dapibus faucibus, diam purus semper nisi, mattis porta tellus risus non nunc. Praesent
+vel pellentesque lorem, id semper ligula.
+
+Nullam a dui eu magna rutrum efficitur. Nam fermentum eros ac nibh aliquam, nec elementum est fringilla. Pellentesque elementum ultrices diam at gravida. Curabitur ac lectus quam. Vivamus at arcu eros. Proin dolor diam, placerat a lacus sit amet, dignissim gravida lectus. Mauris vel ultrices ante. Integer vehicula libero eu cursus euismod. Nulla arcu eros, fringilla quis mauris at, hendrerit lacinia risus. Mauris sit amet tempor dui, sed ornare felis. Suspendisse potenti. Praesent eu gravida lacus. Fusce ullamcorper euismod turpis, non aliquet velit lacinia eu.
+
+Curabitur id urna sit amet nibh lobortis congue. Suspendisse elementum condimentum tortor vel ultricies. Nunc ut sem egestas, tincidunt dolor eget, iaculis lacus. Nam accumsan eros a dui facilisis, lobortis accumsan velit vestibulum. Phasellus viverra nunc in enim rutrum, ut consequat lacus tempus. Cras sollicitudin nunc eget consequat ultricies. Vestibulum dui mi, euismod et magna eu, eleifend imperdiet arcu. Donec a sodales mi, eget vulputate diam. Sed lacinia lorem ac interdum rhoncus. Nam vel sodales augue. Pellentesque tristique in dui a luctus. Curabitur rutrum, dolor nec maximus dignissim, ligula purus aliquet est, eget sagittis libero massa et lorem. Morbi imperdiet commodo tempor. In iaculis tristique risus quis eleifend. Morbi vel mauris nec elit aliquam tempor vel at sapien.
+
+Vestibulum sed ornare massa. Donec fringilla viverra vehicula. Donec bibendum maximus fringilla. Suspendisse nec ante volutpat, porta felis malesuada, dictum magna. Curabitur vulputate sapien ut tellus sollicitudin, eu pulvinar magna tincidunt. Aenean lacinia felis in lectus porta viverra. Nunc viverra scelerisque rhoncus.
+
+Proin sollicitudin a ligula ut tristique. Duis laoreet venenatis arcu, in sollicitudin mi fringilla sit amet. Pellentesque sed ligula semper, lacinia justo a, fringilla nunc. In eu mauris non enim suscipit interdum nec vitae massa. Nam elit erat, efficitur et augue ut, tempor congue mauris. Fusce libero ipsum, venenatis eu aliquam ut, mollis ornare nunc. Etiam at pellentesque erat. Vivamus sollicitudin velit facilisis vehicula pulvinar. Duis consequat felis ultricies fringilla varius. Phasellus finibus, eros mattis pharetra dictum, justo lorem volutpat elit, ac venenatis ligula eros vel urna. Phasellus sem quam, pretium ut ullamcorper eu, dignissim sed dui.
+
+Vivamus in finibus dui, a semper nisl. Praesent ornare libero nunc, ac accumsan justo varius in. Sed sapien est, auctor ac porta nec, fringilla vel nisl. Proin in neque malesuada, sagittis dui sagittis, varius mi. Mauris lacus lacus, rutrum a aliquet quis, sollicitudin ut ipsum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere, justo ut bibendum tempus, purus augue hendrerit ipsum, quis elementum odio augue vel ipsum. Pellentesque sed sapien non dui auctor elementum. Sed a sollicitudin lorem, in pulvinar tellus. Maecenas laoreet massa vel justo tincidunt maximus. Nullam volutpat velit sed massa efficitur fringilla. Nullam vitae nunc porta, consectetur dolor sit amet, accumsan leo. Nam elementum lacinia lacinia. Pellentesque nisi eros, pellentesque ut neque in, semper pulvinar mauris.
+
+Nullam commodo augue vel felis lacinia condimentum et at est. Nullam et lorem mauris. Proin tempus urna quis egestas imperdiet. Maecenas scelerisque, velit vel dapibus venenatis, diam mauris tristique leo, sit amet interdum magna sapien ac justo. Fusce at ex neque. Sed accumsan, ligula nec vehicula consectetur, enim lacus cursus lorem, eget efficitur turpis magna vel dui. Quisque molestie mi vel orci malesuada faucibus. Integer ut scelerisque magna, nec laoreet sapien. Nam convallis quam nec nulla dictum, eget commodo dui scelerisque. Mauris viverra, lorem in finibus luctus, turpis nibh sollicitudin erat, ut sollicitudin mauris erat id tellus. Aliquam commodo sapien diam, eget finibus turpis semper ac. Vestibulum ultrices semper feugiat.
+
+Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; In hac habitasse platea dictumst. Nulla in nisl sed ex faucibus venenatis tempus convallis neque. Integer vitae sollicitudin quam. Nulla facilisi. Aliquam blandit efficitur mollis. Proin sed dui egestas, scelerisque lorem non, aliquet augue. Sed vitae tincidunt augue. Nulla eleifend eros ac gravida mattis. Maecenas vulputate, ligula ut posuere maximus, metus purus finibus ex, in elementum sapien justo vel mauris.
+
+Mauris et fermentum ligula. Integer sit amet urna pellentesque, ornare felis nec, cursus magna. Mauris leo est, dictum consequat vehicula id, consectetur eget odio. Suspendisse sed nunc nisl. Cras varius nulla quis rutrum placerat. Sed quam dolor, porta et nisi in, dictum pharetra dui. Praesent vehicula accumsan justo, quis tristique massa ultrices vitae.
+
+Sed eget justo a mauris lacinia eleifend sit amet tincidunt mauris. Quisque et risus vel tellus posuere tincidunt. Etiam quis tristique velit. Quisque in gravida libero. Maecenas et consectetur tellus. Curabitur dui tellus, maximus sed faucibus in, interdum eu turpis. Sed tempus magna tortor, eget facilisis enim fringilla ut. Aliquam vitae risus at sapien sodales maximus id sed ligula. Quisque lacus turpis, rhoncus non ante pharetra, luctus sodales mi.
+
+Praesent at magna pharetra, dignissim nulla ac, mollis elit. Nam pulvinar ante ante, at feugiat sem blandit aliquam. Proin ut diam ac lectus varius accumsan in et erat. Nam tristique felis sed convallis semper. Nullam quam purus, lacinia et tellus eu, luctus cursus augue. Nam suscipit porttitor leo et lobortis. Proin sed rutrum dolor. Proin aliquet orci eget interdum congue.
+
+In ut mauris sit amet mauris condimentum aliquam sed vel eros. Mauris quis elit elit. Morbi facilisis tortor et lectus efficitur tempor. Pellentesque vel lorem a leo cursus feugiat vitae a sapien. Nullam id volutpat ipsum. Nulla fermentum leo odio, non iaculis lorem volutpat ut. Aliquam consequat turpis diam, et aliquet quam faucibus ac. Aliquam viverra leo urna, in porta massa commodo a. Donec placerat lorem quis hendrerit lobortis. In hac habitasse platea dictumst. Aenean hendrerit mi arcu, non rhoncus velit facilisis vel. Suspendisse potenti. Suspendisse id nisi aliquam, tincidunt libero quis, convallis enim. Quisque non mi turpis. Integer nunc ipsum, efficitur vel felis ut, volutpat placerat est.
+
+Morbi lacus libero, tincidunt a nibh sit amet, maximus ornare urna. Maecenas in lorem pellentesque, lobortis ex quis, posuere diam. Duis blandit, sapien nec pellentesque porta, nisi felis auctor velit, ut cursus risus nisi ac tellus. Sed et ipsum finibus, sodales erat ac, porta lacus. Mauris sed pellentesque diam. Proin dignissim egestas ante quis elementum. Ut orci sapien, congue a mollis non, posuere nec risus. Morbi sit amet aliquam massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut condimentum libero enim, porttitor consequat diam molestie vitae. Maecenas at libero leo. In rutrum accumsan aliquam. Pellentesque sodales porta diam, viverra molestie elit laoreet ut. Suspendisse interdum pharetra est vitae feugiat. Mauris vitae enim scelerisque, consectetur libero ut, pharetra lorem. Integer vel arcu libero.
+
+Mauris imperdiet, nulla non pulvinar vulputate, lectus ipsum condimentum libero, a laoreet augue ligula vitae mi. In a hendrerit purus. Duis egestas, lectus sed mattis dignissim, risus ante rhoncus nunc, ac faucibus mi ipsum convallis metus. Pellentesque eget diam et neque ornare pretium. Fusce lorem massa, cursus quis sollicitudin sed, maximus ut nisl. Ut mollis tortor felis, id feugiat diam dictum sed. Etiam id consequat mi. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis mollis consectetur tristique. Nam euismod venenatis arcu, vel semper leo vestibulum sit amet. Morbi fermentum nec diam condimentum feugiat. Ut a tortor ac nisi lacinia vehicula lacinia eu neque. Nulla ligula tortor, imperdiet a diam id, molestie accumsan elit. Aenean scelerisque posuere fermentum. Donec consectetur iaculis vulputate.
+
+Duis euismod erat id lacinia tincidunt. Integer placerat, nibh vel venenatis volutpat, turpis urna tempus tortor, porttitor lacinia ipsum risus non mi. Curabitur eget scelerisque lorem. Vestibulum ultricies urna eget arcu euismod tincidunt. Nam volutpat dolor vel lacus lacinia, eu dictum tortor egestas. Vestibulum eu arcu pulvinar, varius metus ut, pharetra urna. Praesent lobortis ornare ante, sed condimentum quam. Maecenas id metus felis. Cras ultrices metus ac neque posuere, vitae mollis nunc mollis. Vivamus nec nunc tempus, commodo velit non, consequat diam. Mauris a leo porttitor eros fringilla condimentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut ex suscipit, lacinia lacus non, molestie diam. Aliquam fermentum magna ac ligula vulputate finibus. Sed eu finibus ipsum. Curabitur tincidunt pharetra magna in suscipit.
+
+Duis quam risus, ornare et accumsan quis, bibendum sed felis. Morbi at eros at ligula malesuada vehicula at a felis. Mauris dapibus augue ut odio ullamcorper feugiat. Etiam eu arcu nisi. Nullam laoreet urna in lorem sollicitudin mollis eu quis tortor. Nulla facilisi. Vestibulum placerat purus ipsum, a tincidunt lorem hendrerit in. Morbi ultricies neque in facilisis sagittis. Cras auctor, odio id egestas bibendum, mi ipsum hendrerit turpis, quis tempor metus nisi in diam. In hac habitasse platea dictumst. In quis ultricies mauris, sed posuere nulla. Cras ac felis orci. Duis varius vitae risus eu dictum.
+
+Nam ut elit dui. Sed semper ut purus nec faucibus. Sed non pellentesque libero. Vestibulum ligula dolor, lobortis nec pellentesque sed, vehicula aliquam mauris. Aliquam sodales eros ut pulvinar elementum. Suspendisse eget dolor lacinia ligula semper pretium. Mauris volutpat vestibulum eleifend. Vestibulum ut odio sit amet ligula accumsan luctus. In hac habitasse platea dictumst. Proin et tincidunt lorem, quis pretium metus. Nam consequat, leo non maximus placerat, diam ipsum rhoncus augue, sit amet accumsan metus arcu vel erat. Nam tincidunt velit at massa sollicitudin, nec tristique ipsum iaculis. Mauris euismod tempor ante vitae pellentesque. Ut eu ex viverra, varius mi nec, malesuada turpis.
+
+Cras sed consectetur nunc. Donec egestas mauris id finibus condimentum. Nunc pellentesque tincidunt purus at feugiat. Aliquam eu augue vitae nisl mollis malesuada. In aliquam volutpat imperdiet. Vestibulum posuere sapien quis leo suscipit semper. Nam libero felis, laoreet nec mauris eget, faucibus volutpat nunc. Pellentesque blandit risus nec risus malesuada, quis consequat orci elementum. Cras facilisis neque dui, a malesuada elit dignissim a. Suspendisse convallis aliquam libero, sed cursus nisl scelerisque a. Donec hendrerit arcu orci, vitae aliquam enim interdum eget. Proin elementum ipsum id sapien porttitor, nec tempor sem pharetra. Maecenas eu diam lorem. Vivamus eget sem turpis. Duis blandit aliquet neque quis aliquam.
+
+Ut mollis, orci at interdum ornare, lacus erat scelerisque dolor, non scelerisque risus turpis id quam. Pellentesque accumsan neque non consequat condimentum. Ut pharetra lacus vel tellus elementum tincidunt. Praesent in sapien quis ante dapibus lobortis in in tellus. Fusce ullamcorper iaculis sapien, eu commodo justo. Duis velit ipsum, condimentum in orci in, consectetur pharetra leo. In hac habitasse platea dictumst. Fusce in imperdiet lacus. Morbi ornare non nisi vitae suscipit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus ac orci commodo, scelerisque tellus sit amet, fermentum urna. Etiam sodales eget lacus eget ultricies.
+
+Vestibulum laoreet, felis eu tempus bibendum, orci diam pulvinar lorem, ac laoreet lacus nisl eget nisl. In in massa id purus aliquet pharetra. Vivamus sit amet eros non massa cursus convallis vel et turpis. Vivamus at suscipit tellus. Vivamus blandit mi a ligula ullamcorper suscipit. Nam elementum ante a nulla pharetra, et interdum lorem aliquam. Phasellus quis erat quis lorem gravida vehicula id sed erat. Proin in lorem eu nibh efficitur posuere nec mollis lacus. Pellentesque non porttitor tellus. Quisque bibendum nec ex non lobortis.
+
+Aliquam cursus elit eu velit tempus, vitae egestas mauris viverra. Curabitur id augue elit. Suspendisse non consequat tellus, et porttitor libero. Donec gravida, ipsum vel pretium malesuada, erat ipsum volutpat ipsum, vel tristique augue mi in magna. Mauris nec sollicitudin dolor. Aliquam nec ex sit amet risus imperdiet gravida. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean nec urna dolor. Proin convallis vitae odio et luctus. Aenean tincidunt massa non pellentesque placerat. Pellentesque molestie quam id purus tempus blandit. Cras nulla ante, pellentesque non mattis eget, tempor ut quam. Morbi semper cursus enim.
+
+Fusce pellentesque odio id hendrerit auctor. Sed ut massa in tellus suscipit gravida. Aenean placerat metus orci, id feugiat diam viverra sit amet. Nunc porttitor ipsum eget orci ornare, a efficitur velit pulvinar. Morbi nulla metus, posuere nec elit vehicula, maximus volutpat leo. Vivamus rutrum hendrerit ullamcorper. Nam quis nunc laoreet magna auctor rhoncus. Duis posuere augue mauris, vitae cursus enim volutpat nec. Aliquam mauris orci, aliquet tempus est ut, pharetra lacinia massa. Maecenas ac nunc nisi. In eleifend mollis dolor. Integer nunc ante, facilisis eu cursus a, porta nec erat. Suspendisse potenti.
+
+Aliquam finibus molestie lorem id molestie. Mauris commodo ante et neque tristique euismod in a ligula. Aliquam ut mauris varius, fringilla nulla et, malesuada massa. Morbi fringilla tempor est id bibendum. Nullam aliquam molestie nisi sit amet tincidunt. Mauris blandit malesuada congue. Phasellus et magna sit amet nibh porta rutrum vel vitae quam. Vivamus ac posuere dui.
+
+Nullam dictum quis tellus ut posuere. Maecenas iaculis vel velit a finibus. Nulla varius dictum lectus eget condimentum. Cras at erat pellentesque, suscipit lacus at, consequat ex. Nulla ullamcorper accumsan mauris sed ultrices. Nullam nibh libero, fermentum sed turpis sagittis, luctus consequat ipsum. Nullam sit amet nunc risus. Ut cursus neque gravida dapibus faucibus. Suspendisse potenti. Aenean vehicula consectetur nisi, consequat fringilla sapien tristique vitae. Sed ac risus nec lacus imperdiet aliquam ultricies eget velit. Phasellus purus tortor, sodales id nulla vitae, malesuada convallis nunc.
+
+Aliquam ante tellus, vehicula ut lectus vitae, porttitor blandit arcu. Maecenas suscipit vehicula augue et malesuada. Integer a semper nibh. Pellentesque et velit rutrum, volutpat mi a, posuere ipsum. Nullam convallis risus sit amet dapibus lacinia. Fusce commodo mauris vitae congue maximus. In facilisis tristique justo vel maximus. Phasellus ac diam congue, consectetur ligula ut, euismod nunc. Sed ultrices lacinia imperdiet. Etiam id gravida elit, at luctus mauris. Pellentesque viverra fringilla felis, scelerisque gravida ex molestie quis.
+
+Sed eget interdum est. Suspendisse leo nunc, porttitor ac ultrices at, venenatis in ipsum. Vestibulum feugiat imperdiet faucibus. In ultrices ligula et enim semper eleifend. Vestibulum ultrices purus sit amet eros tristique efficitur eget vel elit. Mauris viverra purus sit amet ex semper dapibus. Aliquam tortor erat, bibendum non mollis ut, facilisis a massa. Morbi aliquam felis ac arcu auctor tempor. Praesent aliquet dapibus tortor.
+
+Fusce cursus ex tempus pharetra gravida. Praesent non dapibus erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nulla pharetra neque vitae mauris egestas dictum. Proin sodales ligula in mi maximus, et viverra magna tristique. Nulla convallis tincidunt nisi eu viverra. Morbi aliquam, erat nec feugiat aliquam, orci purus elementum ex, eget consectetur lorem quam vitae mauris. Mauris massa lacus, facilisis ut neque quis, placerat volutpat nunc. Maecenas sed vestibulum turpis. Cras quis aliquet nisi. Cras ipsum lectus, euismod congue risus a, fermentum volutpat velit. Proin id bibendum ante. Nullam at turpis sed tellus pulvinar posuere.
+
+Ut vehicula rhoncus purus, quis sollicitudin erat ultrices et. Integer sit amet neque pharetra lorem auctor fermentum. Pellentesque a erat non enim pellentesque dictum eget sed massa. Sed eget ipsum eleifend, hendrerit tellus quis, laoreet velit. Nulla non ante nec nulla semper lobortis. Morbi fringilla erat arcu, vel bibendum risus tempor id. Sed iaculis condimentum mattis. Fusce vitae tempus lorem. Donec fermentum risus dui, non iaculis orci cursus ut. Phasellus molestie et erat at aliquam.
+
+Nunc venenatis convallis velit, a cursus dolor euismod in. Fusce quis congue enim. Phasellus eu malesuada ipsum. Curabitur ut massa sed mauris pretium aliquam eu at enim. Aenean sed ex metus. Proin volutpat, leo at tincidunt efficitur, nibh sapien ultricies nisl, non fermentum lacus tellus vel metus. Donec et metus tincidunt, rutrum quam et, bibendum sapien. Suspendisse ante tellus, pellentesque eu scelerisque in, feugiat ac tellus. Maecenas non hendrerit risus, ut gravida arcu. Donec porta nulla et erat pulvinar pulvinar. In tempor nibh et urna ullamcorper, ut volutpat nisi gravida.
+
+Donec dignissim nibh ut diam malesuada, in condimentum nulla faucibus. Mauris eu tempus augue. Proin pellentesque elementum risus at euismod. Nam nec augue ut ipsum mattis suscipit eu pellentesque felis. Sed in justo bibendum, viverra est sed, bibendum est. Morbi pretium nisl in sapien ultricies, ac egestas nunc dictum. Cras pulvinar odio nec turpis ornare blandit ac at tellus. Donec venenatis consequat viverra.
+
+Vivamus mollis auctor odio, eu mattis elit efficitur ut. Sed ullamcorper pulvinar metus id convallis. Aliquam suscipit ac dui sed viverra. Etiam a elit lectus. Proin non malesuada erat. Praesent augue orci, ultricies et ante eget, aliquet ullamcorper orci. Sed tempus facilisis urna sed laoreet. Vivamus vehicula nisi non sodales tincidunt. Integer pellentesque, felis molestie vulputate dignissim, diam sem rhoncus enim, eget luctus sem sem sit amet odio. Nulla aliquam congue tellus, ac congue nunc ultricies nec. Nam hendrerit neque eros, sed lobortis neque aliquet et. Nullam quam lectus, consectetur laoreet dolor ut, dignissim porttitor libero.
+
+Duis sagittis semper diam eu malesuada. Integer non velit convallis urna pretium pellentesque vel sed nibh. Praesent cursus ante eu maximus venenatis. Proin auctor lobortis viverra. Quisque aliquet orci odio, a tincidunt purus fermentum in. Sed rutrum mattis dolor, at interdum felis porttitor nec. Suspendisse bibendum tincidunt lorem nec viverra. Nulla hendrerit mauris eu gravida iaculis. Suspendisse potenti. Curabitur non finibus turpis, vel scelerisque nibh. Aenean sit amet odio ipsum. Cras porta sed tellus quis luctus. Morbi non metus ac sem pulvinar feugiat auctor ut mauris.
+
+Sed odio justo, sodales et pellentesque vel, efficitur a metus. Aenean iaculis nulla sed fringilla varius. Nam dignissim consequat nisl, at cursus ante accumsan sed. Donec tincidunt metus ut leo auctor, ut scelerisque dui dignissim. Nunc efficitur condimentum ornare. Nam tempor tincidunt sem id consectetur. Praesent placerat vel mauris quis sagittis. Integer nec tellus et lectus elementum pulvinar. Aenean elementum condimentum scelerisque. Suspendisse ultricies nulla ut metus commodo imperdiet. Suspendisse tincidunt erat vitae tincidunt cursus.
+
+Proin in ante ut leo lacinia vulputate quis id ligula. Mauris et feugiat eros. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nulla nec dui a magna interdum porttitor. Curabitur et orci sit amet quam pretium viverra. Aenean et urna rutrum, suscipit lorem ac, molestie ante. In sollicitudin, risus non tristique condimentum, urna erat sollicitudin metus, id tincidunt magna lacus et dui. Pellentesque augue nulla, lacinia eu mi convallis, pellentesque ullamcorper diam. Nunc sit amet dignissim elit. Etiam rhoncus auctor neque, id posuere sem tempor eu.
+
+Fusce et purus sed metus dictum lacinia in ut dolor. Nullam in ipsum ex. Nullam et sagittis diam. Sed non lacus sed lorem condimentum aliquet ac ac mauris. Morbi cursus eu lorem vitae aliquam. Praesent lobortis, neque sit amet malesuada posuere, arcu nibh tempor tellus, porttitor maximus lorem orci semper ante. Donec nisl justo, laoreet ac bibendum et, pretium non neque. In at urna volutpat, volutpat purus at, egestas magna. Cras at elementum risus. Maecenas nec mollis nunc. Phasellus vitae justo mi.
+
+Nam ornare nulla a enim consectetur, tempus ornare tortor aliquam. Ut cursus velit ac mollis lacinia. Proin sit amet lectus accumsan, aliquam tortor vitae, dignissim nunc. Vestibulum cursus ex ac nisi posuere tempus. Aenean non blandit est. Mauris pulvinar mi vitae interdum porta. Donec lectus tortor, efficitur id odio in, volutpat sollicitudin nunc. Curabitur varius leo eget nunc vehicula, et ultrices lorem volutpat. Praesent aliquam placerat mattis. Nunc purus orci, mollis ac arcu euismod, vehicula lacinia enim. Nulla sit amet est in purus bibendum facilisis. Aliquam convallis eros vitae erat vestibulum lobortis. Pellentesque ut lacus a ante vulputate pulvinar.
+
+Donec sodales massa metus, sed posuere urna malesuada in. Nullam porta in ante ac porta. Sed efficitur mi justo, a congue enim viverra ac. Sed iaculis scelerisque dignissim. Fusce vulputate vestibulum dictum. Sed sodales, sapien eget feugiat placerat, lectus massa lacinia nibh, egestas molestie nunc leo et purus. Aliquam posuere aliquam sagittis. Maecenas efficitur tortor non nulla accumsan, a porttitor nisi volutpat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Morbi imperdiet semper sem, sit amet pellentesque tellus ultricies ac. Morbi pulvinar fermentum nulla, sed rhoncus neque hendrerit in. Praesent ac posuere tortor, ac egestas velit. Sed scelerisque ex tellus, sit amet pulvinar turpis tincidunt sed.
+
+Donec laoreet sapien at odio mollis blandit. Vivamus ac arcu ac odio cursus maximus. Donec mollis auctor dui sed ultrices. Curabitur at tellus erat. Phasellus et orci vel magna dignissim iaculis quis ac risus. Curabitur condimentum ut nisi at tristique. Aliquam imperdiet gravida tortor, in iaculis est lobortis id. Morbi dictum gravida eros tincidunt viverra. Phasellus est dolor, fringilla eu mauris sit amet, auctor ultrices massa. Ut consequat hendrerit erat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean lacinia felis sit amet turpis ultricies, in tristique ante maximus. Duis vitae efficitur velit. Aenean dignissim, urna ut maximus scelerisque, elit ipsum maximus magna, vitae consectetur tortor sapien non lorem. Proin massa nunc, efficitur ut cursus vitae, varius sit amet nulla. Etiam ullamcorper sit amet nibh nec dignissim.
+
+Duis dignissim ut felis non eleifend. Sed sed leo in nunc rutrum faucibus. Nullam nisi lorem, mollis nec ligula vitae, congue feugiat ex. Aenean bibendum sapien eget pharetra tempor. Praesent nec sapien non lorem vehicula dictum nec quis lorem. Pellentesque eu risus dapibus turpis molestie vulputate. Phasellus ultricies cursus enim, et pulvinar odio viverra sed. Nam ultricies sapien eros, a porttitor tellus lacinia sit amet. In volutpat rutrum volutpat. Praesent maximus auctor leo, eu commodo nibh congue condimentum. Integer laoreet in tellus id mollis. Vivamus eget pharetra nisi.
+
+Pellentesque dapibus molestie urna, faucibus dictum dui rhoncus sit amet. Nam quis posuere velit, ac suscipit odio. Fusce neque arcu, ultricies non consequat vel, aliquet id lorem. Suspendisse porttitor massa lorem, non laoreet lorem euismod ut. Cras rutrum pretium nisi sit amet facilisis. Nullam auctor nibh vel tincidunt auctor. Proin tempus cursus mattis. Nullam faucibus dictum efficitur. Nunc ut magna lacus. Cras sed rhoncus leo. Vivamus purus sem, faucibus sed mollis nec, gravida sit amet urna. Aenean lorem libero, porttitor sit amet convallis sed, placerat in odio. Donec pharetra massa arcu, nec ornare elit scelerisque non. Curabitur non libero ex. Aenean vitae felis viverra, venenatis diam vitae, tempor libero. Quisque faucibus sed urna sit amet auctor.
+
+Nulla ipsum sem, fermentum id ligula id, consequat semper sapien. Sed justo purus, accumsan vel semper non, iaculis id elit. Nam sollicitudin tincidunt metus a posuere. Maecenas venenatis rhoncus semper. Ut mollis lobortis nisl elementum sodales. Cras vel tincidunt leo. Donec viverra ornare mauris, id lacinia purus pretium at. Integer porta libero quis ex condimentum, in auctor felis placerat. Phasellus ac eros venenatis, dapibus libero vitae, mollis nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam non nulla mi. Quisque et metus nec purus malesuada aliquet vel ac quam.
+
+Etiam non velit diam. Vestibulum sed dictum nulla, ut aliquet nisl. Aliquam interdum dolor quis efficitur semper. Donec at sem maximus, viverra nulla quis, tincidunt nisl. Nam eget diam sodales, gravida magna a, eleifend velit. Aenean sit amet dignissim purus. Pellentesque metus magna, sodales ut mi vel, tempus tincidunt ipsum. Nullam vel consequat velit, et porta lacus. Fusce congue commodo lacinia. Ut pretium augue eu leo pharetra, non tempor enim ultricies. Suspendisse dictum aliquam convallis. Nunc ullamcorper rutrum lacus eget fermentum. Quisque sit amet cursus dolor. Morbi mollis nulla eros, id bibendum ante tincidunt eu. Maecenas congue auctor libero, a porta est vehicula non. Aliquam eros nisi, maximus ac neque sit amet, pulvinar porta ipsum.
+
+Donec vitae feugiat sapien, ac luctus felis. Sed viverra orci nec orci sodales, nec pellentesque orci posuere. Maecenas eu lectus sed mi tempor eleifend. Fusce in ligula metus. Vestibulum id lacinia nisl. Etiam laoreet lorem non tristique accumsan. Pellentesque magna purus, ornare ac faucibus ac, finibus eu nibh. Sed consectetur mi justo, vel fermentum sem pretium id. Nam eget risus posuere, ullamcorper sapien id, luctus massa. Vestibulum ut dapibus turpis, eget semper massa. Sed ac blandit tortor, ac consequat ligula.
+
+Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce tincidunt fermentum justo, non varius nisi dictum a. Vivamus nulla lorem, feugiat in cursus sed, condimentum in massa. Donec eleifend libero maximus ante aliquet feugiat. Aliquam vitae tincidunt velit. Fusce feugiat arcu nec neque ultrices blandit. Quisque varius ante et turpis fringilla, et dictum turpis dignissim. Maecenas dignissim lorem sem, ac eleifend libero elementum ut. In vel tellus quis tortor finibus pulvinar.
+
+Nunc rutrum elementum neque ut vestibulum. Ut quis tempor tortor, non posuere enim. Vestibulum fringilla a nibh quis feugiat. Quisque rutrum scelerisque neque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris faucibus euismod arcu aliquam dignissim. Nulla hendrerit nunc nec dui aliquet ullamcorper. Ut rutrum purus purus, ut dapibus neque lobortis sit amet. Vestibulum leo purus, dignissim ut mattis eget, cursus at ex. Aenean faucibus non lectus a mattis. Aliquam dictum tellus id nulla sodales, quis lacinia metus scelerisque.
+
+Vestibulum rutrum tristique ornare. Donec pellentesque, mi ac fringilla posuere, tortor urna auctor dui, vitae luctus libero diam ut risus. Proin ullamcorper vestibulum diam quis porttitor. Integer molestie nibh elit, nec interdum urna ultricies id. Suspendisse id egestas metus, vitae ultricies felis. Maecenas molestie, diam ac ultrices dictum, tellus arcu imperdiet diam, lobortis volutpat sem libero accumsan purus. Duis fringilla est metus, ut vulputate leo pretium eget. Curabitur vestibulum turpis et arcu pharetra laoreet eu eget nulla.
+
+Nunc tristique nibh nunc, nec imperdiet nisl gravida in. Cras aliquet sapien sit amet justo imperdiet auctor. Nunc risus quam, mattis mollis fermentum eget, accumsan sed lectus. Integer lorem ante, gravida sed iaculis vel, feugiat sed metus. Sed lacinia vitae ex id tempus. Sed sit amet felis accumsan, dictum est ut, faucibus erat. Nulla a nisl vel arcu ultrices fringilla vel eget mi. Pellentesque vestibulum sodales enim et tempor. Proin eu lacus nibh. Vivamus tempor, dolor ut aliquet ultricies, elit mi eleifend orci, varius pellentesque arcu nulla vel sapien. Etiam diam quam, dignissim id gravida id, congue in nunc. Nam elementum dolor metus, vel tempus eros condimentum sit amet. Pellentesque pulvinar purus orci, id interdum orci bibendum vitae. Nullam iaculis enim eros, sit amet pretium metus porttitor vel.
+
+Aliquam tincidunt porttitor tincidunt. Suspendisse posuere erat ligula, nec commodo arcu fermentum et. Integer viverra sed elit ut finibus. Praesent sit amet orci mauris. Nulla viverra commodo commodo. Phasellus imperdiet volutpat mauris eu sollicitudin. Morbi rutrum imperdiet purus, et maximus tortor.
+
+Cras in dapibus ante, sed tincidunt odio. Donec elit ex, ullamcorper at quam et, posuere eleifend lorem. Fusce sed nibh mattis, commodo felis ut, facilisis est. Vivamus turpis neque, aliquet vitae sapien non, pretium pharetra nisl. Suspendisse vel ullamcorper nisl. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vestibulum pretium velit, eget tempor ligula laoreet ac. Quisque arcu orci, tincidunt ac laoreet at, porttitor sed eros. Donec diam est, dapibus ut libero non, sodales vestibulum mauris.
+
+Quisque ullamcorper est quis velit convallis, id mattis lectus scelerisque. Nullam mattis lorem ipsum, non pellentesque quam pellentesque nec. Nam consequat leo eget auctor sollicitudin. Phasellus efficitur dolor tellus. Fusce augue ligula, faucibus ac tempus dictum, vulputate non dolor. Ut at justo egestas, semper mi a, efficitur felis. Ut a dolor diam. Fusce nulla felis, tincidunt eu congue sed, faucibus egestas tellus. Curabitur sit amet fermentum ante, non tempus mi. Nulla facilisi. Quisque faucibus commodo leo, id vulputate tellus auctor vel. Nam facilisis sit amet justo consectetur sodales.
+
+Sed eget tellus eu turpis bibendum cursus at ac lectus. Fusce eget iaculis magna, non molestie erat. Fusce tincidunt, mauris et viverra tempus, ante lectus fringilla justo, sit amet fringilla lectus justo sit amet quam. Pellentesque vehicula purus eu augue consectetur molestie. Aliquam ultrices molestie magna eget lacinia. Sed vel aliquam arcu. Ut at nisi sed nibh interdum aliquam ornare in arcu. Sed tempor pellentesque lectus, sed rutrum mi luctus sed. Quisque euismod erat eu finibus fringilla. Quisque viverra, nulla et elementum tempor, nisl mauris placerat elit, ac vulputate ante neque eget sapien. Curabitur a libero nec neque blandit consectetur nec sit amet ipsum. Nam at finibus lorem. Cras id volutpat lacus, in ultricies ipsum. Etiam in augue arcu.
+
+Aenean sit amet dui in erat scelerisque posuere ut varius sem. Sed id libero nunc. Fusce sit amet mi nisi. Maecenas mollis molestie auctor. Mauris ut pulvinar risus. Aenean eget hendrerit lacus. Suspendisse potenti. Donec eget purus a tortor aliquam hendrerit ut ut eros. Morbi pharetra viverra efficitur. Sed et ipsum lacinia, rutrum quam vitae, hendrerit orci. Sed vitae pellentesque elit, sit amet suscipit erat. Sed fringilla arcu turpis, a blandit erat convallis vitae. Aliquam lacinia arcu fringilla hendrerit ornare. Vestibulum lacus diam, ultricies non dui aliquam, efficitur hendrerit tellus.
+
+Curabitur vitae mattis augue. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin hendrerit consectetur lobortis. Quisque eget mauris purus. Nullam condimentum ipsum at malesuada finibus. Fusce laoreet nulla sit amet risus sodales scelerisque. Mauris ut libero tincidunt, molestie magna vitae, dictum neque. Proin purus turpis, pretium eleifend odio a, commodo tempor justo. Suspendisse potenti. Mauris dictum lacus sit amet pulvinar faucibus. Nam sagittis aliquam lectus, sit amet vehicula turpis ullamcorper in. Vestibulum et mattis ligula. Mauris rutrum nisi nunc, a posuere eros tempus mollis. Sed vel ornare turpis.
+
+Quisque at erat eu dui pretium euismod. Quisque scelerisque pellentesque fermentum. Cras elementum eros a eros ullamcorper venenatis. Cras lobortis hendrerit est vel volutpat. Pellentesque sollicitudin semper dignissim. Etiam fringilla sem dignissim odio facilisis sagittis. Sed quis consequat libero, non volutpat arcu. Pellentesque egestas augue metus, at dictum lectus accumsan non. Maecenas et justo id turpis molestie egestas ac nec arcu.
+
+Duis ornare arcu in diam ullamcorper tincidunt. Ut quis purus sed justo maximus pulvinar ut non elit. Etiam malesuada elit vitae justo pulvinar, quis iaculis elit dapibus. Quisque fermentum diam vitae mi sodales, eget venenatis nisi dictum. Nulla mattis nulla sit amet justo malesuada, in pretium arcu eleifend. Mauris pellentesque ac leo vitae maximus. Nunc iaculis suscipit sem, et vestibulum arcu scelerisque in. Suspendisse eget massa imperdiet, aliquet odio id, feugiat mauris velit.

+ 234 - 0
tests/checks/lorem.70000.txt

@@ -0,0 +1,234 @@
+
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris commodo eros id elit malesuada ultrices. Duis sit amet felis sed diam pharetra tincidunt. Mauris sed suscipit enim. Curabitur viverra, ipsum sit amet pharetra ultrices, purus nisi semper sapien, ac varius est risus sit amet lacus. Cras vehicula finibus sodales. Suspendisse dignissim, ligula eu vehicula ultrices, odio lorem efficitur nibh, et volutpat leo dolor et metus. Aenean condimentum dignissim ultricies. Mauris venenatis vitae ligula nec malesuada. Aliquam semper augue sit amet est ultrices tincidunt. Sed et nunc sit amet massa pretium volutpat vitae nec lacus. Proin eget turpis mattis, elementum nunc ut, eleifend magna. In varius est vel blandit sagittis. In id accumsan dolor, a consectetur felis. Praesent dapibus est nulla. Duis eu mi ornare, pulvinar nulla nec, euismod est. Duis quis suscipit lorem, non feugiat
+massa.
+
+Ut ac efficitur massa. Sed eu diam volutpat, volutpat dolor hendrerit, tempus lorem. Aliquam erat volutpat. Quisque ut ligula non nunc tempus mollis facilisis et urna. Fusce eget eleifend risus, at sollicitudin nisi. Nullam ligula massa, egestas ut tincidunt id, pharetra sed neque. Phasellus at lorem dui. Phasellus ultricies faucibus magna, at molestie tortor consequat sit amet. Etiam aliquet sapien tortor, in ornare enim commodo vel. Vestibulum semper purus vulputate ante finibus pretium. Aenean posuere lorem vel diam pulvinar fringilla. Etiam facilisis luctus erat, sit amet faucibus dolor eleifend a. Duis vel dignissim sem.
+
+Pellentesque eget vestibulum massa. Maecenas in lobortis risus, ac congue arcu. Suspendisse iaculis lacinia ex, eget lobortis ex consectetur non. In consequat, purus ut porttitor fringilla, augue nisl interdum eros, sit amet interdum elit lectus eget arcu. Pellentesque euismod convallis vestibulum. Cras tempus tortor at luctus euismod. Morbi quis est nisi. Nulla pharetra interdum neque. Integer eget dolor et velit ultricies sollicitudin. Nulla quis tortor molestie, vehicula magna sed, scelerisque tortor. Phasellus feugiat, urna sed semper porta, nisi nisi lobortis risus, et convallis magna felis et lectus. Phasellus laoreet mollis nulla. Aliquam in bibendum libero.
+
+Nam mi odio, porta lacinia suscipit nec, ultrices fermentum velit. Nullam suscipit congue sapien, sit amet ullamcorper nisi. Integer laoreet id purus nec fringilla. Donec eget sapien a lacus rhoncus hendrerit. Fusce nisi purus, sagittis vitae sem et, hendrerit scelerisque ligula. Cras commodo hendrerit nisl, sed placerat diam commodo eget. Suspendisse mollis, nisi ac tincidunt vulputate, libero purus hendrerit lectus, et tincidunt risus enim nec velit. Sed ut feugiat dolor.
+
+Aliquam erat volutpat. Vivamus ornare ex et nisi semper luctus. Suspendisse potenti. Donec aliquet metus odio. Duis a erat efficitur, dignissim lacus id, mollis nibh. Aliquam id sem leo. Aliquam aliquam a magna vitae ultricies. Sed iaculis tincidunt volutpat. Ut at pretium lectus. Ut a molestie augue. Suspendisse et pharetra odio, ac ullamcorper lorem. Pellentesque ligula neque, tristique quis dapibus vel, ullamcorper a enim. Ut vulputate sodales urna ut auctor. Nulla vitae ullamcorper justo. Sed ut blandit ex.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus rutrum pellentesque augue. Aenean consequat tristique ligula, nec pellentesque massa vestibulum at. Aliquam sagittis diam nisi, vitae eleifend magna sollicitudin at. Vestibulum sagittis turpis nec diam suscipit, eget faucibus nulla fringilla. Nullam eleifend bibendum elit, id imperdiet nibh aliquet vitae. Aenean nec sagittis libero, et iaculis dui. Morbi quis diam augue. Duis eu sapien augue. Suspendisse consequat velit libero. In ligula mi, congue vel vulputate ut, consequat eu lacus. Mauris quis finibus nisl, at semper nisi.
+
+Cras ullamcorper augue et augue cursus, quis fringilla metus gravida. Vivamus vulputate maximus nisl a faucibus. Nam risus dui, tempor vel lacinia imperdiet, bibendum at sapien. Integer tincidunt pellentesque sapien, sed viverra erat facilisis eu. Vestibulum vel nisl sit amet augue malesuada finibus. Duis ipsum mi, imperdiet a ultricies sed, aliquam at turpis. Phasellus ut metus vel justo egestas semper id vel nibh. Nulla at purus id nisi elementum finibus sodales non nunc. Curabitur ligula nulla, ultricies et turpis vitae, ornare pellentesque orci. Nam augue quam, dictum ac metus sed, molestie aliquet metus. Quisque tristique magna quis pretium dictum. Fusce lobortis diam eu facilisis sagittis. Proin tincidunt nunc vitae nisi viverra, in tristique lacus vestibulum. Ut sit amet nisi ac eros blandit pulvinar vel tristique nisl. Pellentesque rhoncus finibus ex. Fusce condimentum
+malesuada justo in aliquet.
+
+Aenean ex lacus, blandit in scelerisque nec, porta at odio. Cras sollicitudin eget eros eget mattis. Nunc rhoncus dui et arcu ornare luctus. Donec a commodo turpis. Phasellus ultricies quam nunc, et pretium neque aliquet sit amet. Mauris vestibulum felis massa, a pharetra mi faucibus vel. Nam porta nunc non fermentum dictum. Curabitur iaculis risus sagittis felis cursus interdum. Mauris vitae imperdiet erat. Etiam sed ornare libero. Sed ex sem, dapibus sed ex ac, ornare lobortis velit. Quisque vehicula, justo ut molestie tincidunt, tellus ligula tempor felis, pharetra scelerisque risus libero suscipit arcu. Nulla id massa in augue aliquet blandit eget vel ligula. Pellentesque ultrices mattis ipsum ac finibus. Nulla pellentesque ut libero et semper.
+
+Proin a vehicula ipsum. Nulla iaculis ut magna et tincidunt. Cras vitae nunc rutrum, consectetur lacus ac, dictum ante. Duis sit amet libero ac lectus placerat euismod nec et massa. Pellentesque faucibus tempus sollicitudin. Sed nec purus orci. Donec porttitor, enim sed fermentum fermentum, dui neque mattis diam, id efficitur metus arcu sit amet nulla. Morbi dignissim commodo ligula, et faucibus velit laoreet vel. In ultricies nec erat sit amet rutrum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque tincidunt risus ac dignissim porta. Sed molestie ante non orci commodo, vel molestie mauris dapibus. Nunc a faucibus leo. Nunc eleifend euismod metus, at tempus tellus vulputate vitae. Etiam quis placerat erat.
+
+Ut non magna eleifend, sagittis est a, bibendum augue. Aenean congue viverra consequat. Proin eu nunc sem. Maecenas fermentum, est a luctus vehicula, arcu quam ullamcorper nisi, non vehicula elit erat et ante. Vivamus id mollis leo. Nam non risus varius, volutpat nunc vel, convallis urna. Vivamus fermentum id dolor eget volutpat. Quisque tincidunt sapien id magna blandit rutrum. Integer ligula lectus, ultrices interdum urna id, feugiat tincidunt velit.
+
+Fusce sollicitudin diam eget neque gravida aliquet. Sed id arcu ligula. Phasellus et orci eleifend dui accumsan scelerisque sit amet viverra mauris. Pellentesque nec semper lacus, eget aliquet leo. Curabitur fermentum non tortor id pretium. Quisque elementum ex id sapien pulvinar rhoncus. Fusce eget arcu arcu. Vivamus tellus elit, gravida at porttitor ac, fringilla consequat nulla. Etiam efficitur orci sed nisi viverra, eget aliquam nisi accumsan. Donec eget egestas risus, non sodales arcu. Donec in elementum sem. Proin vel magna malesuada, placerat leo cursus, elementum elit. Donec convallis urna a tincidunt iaculis. Maecenas malesuada gravida sapien. Nulla mi urna, ullamcorper non velit dictum, finibus tincidunt neque. Morbi suscipit tempor elit, quis blandit est cursus ut.
+
+Cras pretium sodales dolor et ultrices. Phasellus tristique finibus ante et consequat. Sed ornare ultrices posuere. In id nibh ut velit placerat sagittis. Maecenas porttitor nisi sed orci luctus, sed eleifend est luctus. Integer pharetra odio non enim viverra mattis. Mauris cursus, quam sed rutrum congue, libero libero vulputate sapien, et eleifend neque lacus at libero. Proin hendrerit enim sit amet ex tincidunt, nec imperdiet turpis imperdiet. Aliquam tempor, felis in lobortis placerat, diam augue pharetra urna, varius euismod lacus purus eget ligula. Aenean quam quam, elementum id euismod commodo, tempus vel dolor.
+
+Aenean egestas lectus ut erat porttitor ultrices. Suspendisse elementum massa quis tortor facilisis, tempor lobortis lectus dignissim. Nunc viverra in lacus non varius. Nulla vitae ipsum auctor, porttitor purus vel, vulputate dui. Curabitur sit amet dui in lectus blandit facilisis. Aliquam erat volutpat. Curabitur sit amet laoreet lacus. Sed pretium ultrices mi non congue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Cras quis pulvinar urna, efficitur pellentesque elit. In sagittis maximus dui, eu congue ex. Aenean nulla purus, iaculis eu elementum non, tristique id lacus. Mauris nisl tellus, tristique ac laoreet eget, porttitor sed tortor. Etiam maximus in nibh quis ornare.
+
+Nulla volutpat, lectus ut viverra interdum, dui leo luctus odio, id tristique leo enim a arcu. Maecenas auctor felis massa, tincidunt vestibulum eros pellentesque in. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vivamus eros est, interdum vel enim eget, egestas tincidunt dui. Pellentesque dignissim dolor eget tempus ornare. Donec pretium hendrerit tortor. Praesent eu condimentum tellus. Phasellus commodo dignissim ante, a pharetra felis pharetra a. Ut sed dui diam. Nunc luctus lobortis bibendum. Suspendisse non blandit felis. Sed hendrerit iaculis mauris, id vulputate nisi interdum mollis. Nulla eget tellus tincidunt, vestibulum quam vel, mattis lectus. Quisque nec scelerisque ex, vitae viverra purus.
+
+Suspendisse enim quam, porttitor id felis non, volutpat efficitur tellus. Nullam mollis ligula leo, eget aliquet enim euismod a. Etiam vehicula sit amet est eget suscipit. Sed sed lectus ac leo sodales fermentum at consectetur felis. Morbi in arcu lacinia, porta arcu quis, euismod neque. Nam vitae sollicitudin erat. Aenean malesuada sodales commodo. Vestibulum a purus odio. Etiam a ultricies neque. Vivamus bibendum scelerisque malesuada. Morbi hendrerit nibh mollis turpis ultricies, non scelerisque lacus faucibus. Praesent commodo lorem elit, et fringilla tellus varius in. Sed ac nisi non ante fringilla efficitur.
+
+Donec vestibulum sed risus eget viverra. Phasellus mattis sodales posuere. Nunc finibus tincidunt augue ut congue. Vivamus facilisis lacus nisi, a vestibulum ligula efficitur nec. Maecenas in nisl eu mi laoreet mollis. Proin et consectetur enim. Duis elit neque, suscipit sed facilisis non, aliquam sed justo. Quisque facilisis lobortis porta. Suspendisse porttitor luctus arcu tempor rutrum.
+
+Vivamus ut consectetur nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris placerat dui vitae quam tristique elementum. Cras sed lorem consectetur, facilisis tortor eget, vulputate nunc. Sed scelerisque lacus sagittis mauris suscipit, nec finibus lacus tincidunt. Integer orci libero, tempus sed consectetur sit amet, gravida nec lorem. Duis cursus sapien ullamcorper, iaculis velit sit amet, ornare orci. Praesent cursus imperdiet luctus. Curabitur suscipit turpis vel rhoncus ultrices. In at tortor tempor, rhoncus erat non, tincidunt risus. Duis sagittis viverra malesuada. Phasellus sed lacus at sem aliquet sodales placerat vitae mi. Morbi vitae neque id dolor scelerisque luctus quis sit amet erat.
+
+Phasellus efficitur pharetra eleifend. Duis non turpis ligula. Mauris eget ante vitae dui lobortis egestas. Nam rhoncus vel lacus quis placerat. In sagittis efficitur arcu, vitae luctus nunc volutpat condimentum. Curabitur vestibulum nunc non ultricies tempus. Nunc pellentesque in leo non viverra. Duis tristique sollicitudin ex eu congue.
+
+Aliquam viverra ut neque a egestas. Fusce nec magna sed elit pulvinar bibendum eu sed elit. Quisque ut nisl libero. Nullam ac venenatis sem, in dapibus sapien. Mauris tincidunt tempor libero id vehicula. Fusce turpis lorem, pellentesque id eleifend sed, facilisis ut elit. Nunc at ultricies mauris. Pellentesque eleifend, enim vitae maximus finibus, nulla nisi finibus ligula, nec molestie ex massa vel felis. Vestibulum ultricies ut orci ut finibus. Maecenas non libero ac nisi egestas blandit. Maecenas sodales, odio vitae dignissim commodo, orci purus sollicitudin ex, nec rutrum lectus dolor in enim. Fusce metus nisl, porttitor quis interdum vitae, lacinia congue neque.
+
+Sed laoreet leo quis leo ornare mollis. Mauris pulvinar purus gravida dolor posuere euismod. Vestibulum facilisis nisi nec mattis maximus. Ut aliquam enim non ultricies rutrum. Duis nec nunc a nisi egestas convallis id id eros. Praesent nec gravida massa. Vestibulum maximus laoreet bibendum. Mauris finibus hendrerit libero, vel convallis ante rutrum ac. Vestibulum sed felis lectus. Suspendisse nec sodales leo, vel tristique lorem. Phasellus tincidunt est sagittis magna varius vulputate. Etiam eget diam pretium, vestibulum odio id, facilisis tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse justo elit, accumsan in ullamcorper vitae, semper tristique ex.
+
+Nunc egestas sed nibh id ullamcorper. Curabitur in cursus elit. Nunc molestie purus interdum magna pellentesque tempor. Etiam finibus magna velit, sit amet aliquam velit feugiat sodales. Vestibulum a dapibus odio. Donec dictum sapien ut condimentum convallis. Donec congue orci tellus, quis luctus dui facilisis sed. Nam vulputate eros leo, quis consectetur lectus tempor vel. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas et fringilla felis, eu dignissim dolor.
+
+Vestibulum malesuada, nunc vel cursus posuere, lacus leo sodales magna, sed venenatis purus lacus vel nibh. Donec rhoncus lorem id tempus lacinia. Quisque fringilla tortor id lorem interdum tempus. Sed gravida, sem vel pharetra feugiat, dui est rutrum neque, in varius velit leo vel urna. Proin in dolor est. In interdum cursus eros quis elementum. Etiam leo urna, ultricies non neque id, viverra elementum enim. Aenean in mauris interdum, sollicitudin sapien vel, mattis libero. Proin ultrices cursus tempus. Morbi faucibus varius fringilla. Nam ultrices nibh at eros ultrices venenatis. Fusce elementum orci non interdum molestie. Donec eget facilisis enim.
+
+Aenean faucibus tortor purus, nec ornare turpis convallis ut. Vivamus sed nibh iaculis, condimentum magna quis, laoreet libero. Nulla lorem dolor, tincidunt a lobortis viverra, molestie vitae enim. Aenean in velit id quam lacinia vestibulum. Sed vitae sem molestie, consequat ante ut, laoreet felis. Vivamus feugiat neque at justo dictum, quis viverra leo dignissim. Nulla facilisi. Curabitur ut diam eu quam fermentum semper sed eu velit. Nam odio felis, efficitur sed augue vel, condimentum porttitor nisl. Nunc bibendum lorem sit amet augue blandit, nec facilisis nisl lobortis. Mauris ligula velit, rhoncus in vehicula ut, tempus id nisi. In laoreet malesuada orci in scelerisque. Nullam luctus enim dictum dui aliquet elementum. In aliquet massa quis leo imperdiet, dapibus iaculis orci ultrices. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut
+eget porttitor massa.
+
+Duis rutrum sem ut tellus vehicula sagittis. Sed tristique porta felis ac viverra. Curabitur urna leo, interdum ac lacus a, molestie aliquet diam. Vestibulum quis lacinia justo, quis maximus enim. Quisque lorem enim, blandit a elementum commodo, imperdiet vel nisl. Fusce vel mi volutpat, efficitur leo sit amet, porta sem. Sed dictum justo a turpis fringilla lacinia. Phasellus id nunc at urna laoreet auctor. Donec laoreet est sed laoreet vestibulum. Mauris consectetur tincidunt nisi, eu aliquam dui pellentesque molestie. In eu erat vitae est elementum tincidunt sit amet vitae massa. Quisque purus dui, interdum ut viverra quis, volutpat accumsan urna. Aenean tempor dictum massa, quis mattis ante vestibulum nec.
+
+Aliquam cursus felis sit amet purus laoreet, sit amet fermentum augue suscipit. Donec eu facilisis ante, gravida dignissim nisl. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Quisque dignissim dignissim faucibus. Vestibulum in fermentum neque. Aenean id velit imperdiet dolor volutpat venenatis. Vestibulum congue lacus orci, a pharetra magna cursus eget. Sed pharetra ligula et nunc ultricies, sit amet maximus sem vehicula. Nullam tempus turpis et purus euismod, vel eleifend nunc dignissim.
+
+Phasellus et nisi non dui tincidunt scelerisque nec ut mi. Nullam gravida nibh non rhoncus vehicula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi quis tristique turpis, a faucibus tellus. Cras semper sollicitudin nisl aliquet iaculis. Nulla nec lobortis libero. Integer elementum ullamcorper tortor, ac imperdiet enim tincidunt ac. Aliquam rutrum gravida lectus quis fermentum. Proin egestas ipsum a fringilla convallis.
+
+Sed pulvinar ante non feugiat tempor. Donec in neque id sem posuere tempus. Sed volutpat est non ex eleifend viverra. Fusce feugiat purus id varius cursus. Donec ac leo risus. Fusce non elit in metus fermentum dignissim. Aenean quis magna et purus convallis imperdiet. Ut facilisis, nisl id auctor consequat, tortor lacus porttitor turpis, interdum sagittis ex sapien vitae ante. Vivamus nec sem porta augue ultrices consequat vel quis metus. Aliquam id bibendum nisi. Etiam suscipit mi a urna tempus, ac tempor leo ornare. In hac habitasse platea dictumst. Sed sollicitudin lorem felis, a pellentesque dui malesuada nec.
+
+Aliquam felis metus, sollicitudin vel sagittis eget, efficitur quis augue. Integer quis sapien vel diam ultrices molestie. Aliquam consectetur sapien nec eleifend cursus. Quisque mollis lacus sed posuere mattis. Proin nec ultricies purus. In hac habitasse platea dictumst. Vivamus lacinia magna diam, tempor mollis diam auctor quis. Praesent tincidunt erat a vestibulum pellentesque. Pellentesque vel justo ut neque aliquam pharetra et vel erat. Maecenas commodo nunc nec risus volutpat tempor. Sed sodales feugiat sapien, in fringilla tellus viverra venenatis. Etiam elementum dignissim est a varius. Ut facilisis, sem sit amet malesuada pharetra, velit ligula porttitor magna, vel commodo risus nisl eget nunc. In pharetra erat ac enim tristique dapibus.
+
+Sed et ante mattis leo lacinia fermentum a id nulla. Fusce varius ornare semper. Fusce congue interdum ipsum nec condimentum. Maecenas imperdiet dui diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Quisque at enim consequat, tincidunt eros eu, egestas neque. Pellentesque porta enim at blandit tristique. Cras convallis quam vel erat eleifend porta. Suspendisse varius porttitor orci, tempor facilisis neque consectetur eget. In sollicitudin ullamcorper ultrices. Maecenas non augue tincidunt, sollicitudin magna non, commodo mauris.
+
+Morbi lorem enim, finibus nec risus sit amet, aliquam mattis eros. Sed lobortis porta est at viverra. Nunc dapibus rutrum lobortis. Vivamus sollicitudin feugiat dapibus. Sed non placerat lacus. Morbi nec gravida lacus. Maecenas congue lectus non lorem faucibus, eget suscipit ex hendrerit. Donec commodo non diam eget condimentum. Cras ut lacinia odio.
+
+Proin vel velit facilisis, venenatis justo tincidunt, egestas lorem. Sed pellentesque est at ligula pretium, dictum porttitor massa pulvinar. Suspendisse blandit auctor nisl, eu rutrum sem convallis eget. Nulla dapibus erat eu nisl dignissim interdum ac at urna. Etiam quis justo eget metus rutrum ultricies id in dui. Pellentesque dignissim lorem nec massa eleifend, porttitor venenatis urna aliquet. Curabitur placerat pulvinar faucibus.
+
+Etiam varius, ante vel egestas rutrum, dolor sem sodales metus, eget tristique est metus quis lorem. Aliquam eget lobortis nisl. Vivamus vel luctus orci. Ut vel vehicula leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis vel dui id massa iaculis pellentesque et vitae ipsum. Curabitur at semper eros, id eleifend massa. Duis interdum sollicitudin nisl ac feugiat. Sed posuere nibh et dignissim semper. Pellentesque pellentesque lorem eget urna pulvinar semper. Sed vitae congue magna.
+
+Suspendisse vestibulum finibus dignissim. Phasellus vel ipsum non quam dapibus faucibus ut hendrerit nulla. Mauris eget velit condimentum, suscipit magna et, rhoncus lectus. Proin facilisis pretium neque, in aliquet augue egestas ut. Nunc consectetur cursus turpis. Nullam varius finibus quam, condimentum hendrerit urna iaculis sed. Nam ut ullamcorper libero. Fusce eleifend cursus metus et hendrerit. Vestibulum malesuada, augue sed iaculis dignissim, ipsum ligula hendrerit eros, vitae congue odio ipsum at eros. Praesent dui tellus, molestie condimentum sollicitudin eget, sodales et tellus. Duis orci felis, volutpat sit amet placerat ac, sagittis nec nulla. Phasellus lorem ex, varius at nulla sit amet, blandit laoreet est. Vivamus sapien dolor, ultrices ac varius quis, facilisis et sem. Nulla vehicula, sem quis posuere imperdiet, dolor turpis mattis ex, eu consequat libero nulla quis
+nisi. Phasellus malesuada mauris a arcu fermentum efficitur.
+
+Proin laoreet facilisis lobortis. Duis vitae ligula eget ex vehicula blandit. Proin in tristique nisi. Cras faucibus at erat quis congue. Nulla condimentum risus odio, ac sodales velit sollicitudin ut. Quisque nec pretium urna. Morbi fermentum, nibh in aliquet lacinia, est massa iaculis nisl, vitae ornare ex sem nec lacus.
+
+Maecenas volutpat nisi in elementum pulvinar. Morbi ex lacus, aliquet sit amet porttitor in, auctor in eros. Cras sem est, condimentum vitae ornare ut, faucibus eu diam. Donec in ultrices tellus. Phasellus aliquet, turpis eu consectetur placerat, velit ex ullamcorper nisl, a lobortis augue elit ut felis. Nulla dignissim a purus sed fringilla. Proin imperdiet posuere sollicitudin. In turpis erat, tempor id convallis ac, interdum nec eros. Nunc bibendum eget nibh eu dapibus. Pellentesque pellentesque cursus porta. Vivamus a sem volutpat, eleifend augue id, eleifend nunc. Vivamus feugiat, nisi ac faucibus condimentum, ante magna volutpat sem, vel imperdiet lacus neque ac risus. Vestibulum vel arcu orci. Integer rhoncus accumsan mauris eu fringilla.
+
+Maecenas faucibus, eros eu convallis pulvinar, sapien libero vulputate erat, et convallis lectus nunc eget felis. Nulla vestibulum erat leo. Curabitur pellentesque ipsum a ante pellentesque hendrerit. Sed porta euismod neque at sollicitudin. Fusce non posuere nisi, ac tempor enim. Duis ac laoreet odio, eget semper augue. Phasellus ac dapibus eros. Donec pretium id odio eu aliquet. Proin nisi diam, mattis ac nunc in, varius finibus nulla. Curabitur nec fermentum ex. Nullam eget mauris id urna gravida convallis quis sed odio. Mauris rutrum purus in arcu auctor auctor. In vitae nisl enim. Vivamus non commodo neque.
+
+Nunc semper urna sed volutpat rhoncus. Curabitur faucibus consequat ex, nec porta nisi fringilla eu. Sed sed magna tempor tortor maximus dignissim. Cras suscipit fringilla interdum. Sed vulputate ex et volutpat vulputate. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Etiam et ante mi. Integer in turpis tempor, sollicitudin purus non, scelerisque lectus. Phasellus at lectus nisl. Donec sed ipsum accumsan, vehicula orci vitae, feugiat nisl.
+
+Praesent gravida ac mauris eu viverra. Integer viverra, erat vitae blandit pellentesque, arcu orci interdum magna, non varius justo ex id magna. Phasellus ac sem vitae justo fermentum fermentum. Ut in sodales nisl. Etiam vel metus faucibus neque laoreet aliquam eget eu est. Nullam faucibus lorem in sollicitudin ultrices. Praesent finibus lacinia pretium. Fusce vel commodo arcu. Curabitur sed pharetra risus. Quisque sagittis bibendum lectus sed malesuada.
+
+Maecenas elementum ac justo sit amet tempor. Phasellus ultricies nisl vitae ligula tristique pellentesque. Fusce dictum gravida tempus. Mauris sed dolor a erat imperdiet interdum nec a felis. Sed venenatis metus a libero blandit, eu porta mi varius. Maecenas auctor velit ac lobortis dictum. Ut venenatis lacus porttitor faucibus rhoncus. Pellentesque sed quam purus. Vestibulum quam nisl, maximus sed hendrerit at, maximus sed ex. Sed hendrerit ullamcorper cursus. Sed hendrerit tristique eros, sed egestas purus accumsan sit amet. Aenean rutrum augue dui, non euismod orci luctus at. Fusce ut nunc odio. Nullam risus sapien, efficitur sit amet ornare eu, vestibulum eget nisi. Aenean a enim enim.
+
+Vivamus rutrum finibus placerat. Nulla non sodales lorem, a mattis justo. Ut sagittis dignissim enim vel hendrerit. Nullam eu dui et magna bibendum tristique quis at orci. Donec at diam sit amet diam suscipit commodo. Sed condimentum ipsum in ipsum lobortis, posuere finibus neque tempor. Donec in vulputate lacus, mollis semper ante. Donec in sem consectetur, vulputate leo interdum, tincidunt velit. Sed sem dolor, efficitur sit amet sodales sollicitudin, convallis eget leo. Integer turpis nisl, feugiat quis pulvinar ultrices, cursus in erat. Phasellus vulputate posuere elit, a vulputate lectus vehicula sollicitudin. Fusce posuere fermentum fermentum. Suspendisse potenti. Suspendisse scelerisque libero et varius commodo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
+
+Mauris nec justo velit. Morbi egestas, neque eu maximus pulvinar, lectus nibh porttitor ligula, vel dapibus metus felis molestie arcu. In eget lorem cursus magna pellentesque fermentum. Nulla nec dui metus. Quisque pretium id dui sit amet scelerisque. Integer vulputate venenatis mi ut commodo. Duis sit amet ligula sagittis nisl volutpat bibendum. Vestibulum eget feugiat leo. Morbi et placerat nulla. Quisque semper, tortor sed luctus lobortis, nulla magna pulvinar diam, non maximus enim purus eu ante. Nam finibus lacinia mollis. Pellentesque nec elementum nisl, tempor viverra est. Ut non fermentum magna. In quis odio magna. Suspendisse urna eros, tempus nec posuere sed, fringilla id mi.
+
+Vestibulum nisi lectus, bibendum non nisi et, rhoncus lobortis lacus. Integer egestas vel tellus convallis porttitor. Nullam lacinia, ante et porta condimentum, urna lacus vehicula augue, sit amet placerat turpis nulla vitae augue. Phasellus sit amet dolor dui. Curabitur eu arcu sit amet mauris imperdiet fermentum euismod vitae neque. Sed quis porta nulla, eu dignissim lectus. Mauris eleifend hendrerit ante, a convallis erat vulputate eu. Aenean vitae placerat ipsum, sit amet ultricies sapien. Quisque volutpat est felis, eget vestibulum felis congue vitae. Aenean dignissim magna et enim pellentesque cursus et non sem.
+
+Cras a ipsum non sem varius eleifend. Aenean finibus leo sed sapien tempus iaculis sed at arcu. Ut non interdum neque. Aliquam condimentum felis ac lacus dictum, quis fringilla velit posuere. Proin pharetra est mauris, sollicitudin facilisis justo convallis vitae. Nulla enim urna, facilisis non auctor placerat, dapibus sit amet ligula. Pellentesque vestibulum volutpat lorem sit amet blandit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
+Nulla ullamcorper porta nisl, sed consectetur lectus. Etiam est risus, interdum sit amet ligula sed, sagittis cursus risus. Duis eleifend eu ligula quis lobortis. Suspendisse volutpat lacinia finibus. Fusce volutpat pulvinar tristique. Duis dui massa, ullamcorper eget dapibus ac, maximus rutrum tellus. Nam lectus ex, facilisis sed odio non, pellentesque gravida nibh. Pellentesque molestie sit amet nulla consequat tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer venenatis arcu eu enim vestibulum consectetur. Curabitur congue erat dui, ac finibus eros fringilla id.
+
+Integer consequat aliquam neque. Praesent enim augue, condimentum at justo et, accumsan lobortis justo. Cras tempor vestibulum eleifend. Proin in pulvinar velit. Nam ac neque in dolor eleifend finibus id sit amet ante. Sed aliquam luctus quam, eget placerat nibh sagittis id. Cras ut ultricies magna, eu gravida sapien. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec vel blandit libero. Sed sit amet aliquam sapien. Maecenas facilisis fringilla est cursus lacinia. Suspendisse faucibus et ex a mattis. Nullam lorem lacus, auctor in lacus vel, rutrum lobortis augue.
+
+Aliquam non est eu neque ornare sagittis non et enim. Donec commodo bibendum lacus, vitae dictum ante laoreet in. Nulla facilisi. Fusce finibus aliquet nulla, ac aliquam enim gravida ac. Suspendisse ornare congue mi, ac tincidunt dolor sollicitudin nec. Fusce vitae rutrum ipsum, non pharetra metus. Phasellus finibus, sapien eget sagittis consequat, lacus dui tempus leo, eget blandit nunc nulla quis elit. Suspendisse ante purus, eleifend vel elit suscipit, ornare fermentum tellus. Sed gravida metus dictum odio aliquam auctor. Fusce eget rhoncus sem. Mauris sed elementum sem, sit amet efficitur eros. Praesent ultrices euismod ullamcorper. Aenean commodo vestibulum orci, laoreet gravida orci pharetra ac. Nullam mattis, lorem nec pulvinar efficitur, augue quam pellentesque ligula, id malesuada nisl felis in sapien. Etiam eu arcu ac risus maximus pellentesque sed ut mauris.
+
+Nunc porttitor elementum nunc, at hendrerit magna condimentum at. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas dictum sit amet lectus quis convallis. Cras id consequat nunc, at vulputate mauris. Sed quis massa pharetra, luctus enim pretium, consequat lectus. Aenean tincidunt, risus quis iaculis lacinia, sem dui sodales enim, in scelerisque justo justo ut nibh. Nam volutpat dignissim bibendum. Proin in tempus elit. Sed sollicitudin mi et odio aliquet, et luctus libero consectetur.
+
+Proin mattis placerat porttitor. Curabitur eleifend varius porta. Phasellus aliquet efficitur sem sed laoreet. Nullam accumsan aliquam enim sed sagittis. Nunc non interdum ipsum. Curabitur in ullamcorper augue. Duis suscipit at risus vel lacinia. Suspendisse venenatis at est at fringilla. Etiam facilisis lorem vel orci sodales, a mollis quam lacinia. Cras porttitor eros ex.
+
+Aenean sed libero quis mauris sagittis ullamcorper. Vestibulum et ligula at justo scelerisque consequat nec at odio. Duis consectetur porta est, non consequat lectus feugiat ut. Mauris ut ipsum ac tortor tincidunt tempor. Vivamus eu leo id turpis pharetra facilisis. Nullam eget placerat magna. Nulla ornare sit amet libero et sodales. Quisque porttitor nisl nec tempus faucibus. Suspendisse nulla enim, ornare non augue eget, gravida consectetur ipsum. In lacinia ornare risus, quis molestie quam pulvinar in. Ut vel felis eu quam pellentesque tincidunt quis nec odio.
+
+Cras auctor vitae nunc ac vulputate. Duis diam odio, lacinia ac nisi in, suscipit malesuada neque. Etiam sagittis facilisis justo, a tincidunt odio euismod id. Maecenas id suscipit elit. Nulla vel mauris quis odio accumsan tempus. Pellentesque vel turpis varius, hendrerit metus a, convallis erat. Etiam non dui aliquam, viverra lorem a, feugiat lacus. Vivamus non mauris scelerisque, convallis risus eget, posuere quam. Sed neque justo, varius eu dolor eu, tincidunt egestas lacus. Nam varius ornare lacus, vitae pellentesque turpis.
+
+Etiam tincidunt nulla sed lectus euismod, non placerat sapien ornare. Nullam quis tortor ut velit euismod vehicula. Aliquam eget mattis ex. Ut viverra, sem eu commodo pulvinar, turpis dolor rutrum nunc, vitae tempor magna odio in elit. Fusce nunc tortor, ullamcorper tempus massa posuere, lacinia vestibulum eros. Proin ornare, ipsum ut convallis sollicitudin, velit tellus euismod est, eget euismod lacus ipsum a lectus. Mauris elit justo, placerat at auctor sit amet, semper non elit. Nullam ac nulla neque. Mauris et mi eget eros mattis varius. Mauris tellus nisl, iaculis at nibh vitae, viverra vestibulum nibh. Interdum et malesuada fames ac ante ipsum primis in faucibus. Mauris tellus massa, pellentesque fringilla turpis sit amet, sollicitudin tincidunt odio. Sed volutpat lectus viverra consectetur varius. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec rutrum aliquet
+sapien in porta.
+
+Etiam in hendrerit tellus, eget lacinia ante. Suspendisse potenti. Sed vestibulum, purus sit amet vestibulum dapibus, enim velit finibus quam, nec rhoncus nulla risus ac mauris. Mauris id dolor non ligula volutpat porttitor sit amet ac arcu. Donec sit amet vehicula risus. Mauris quis mi nisi. Quisque non scelerisque nibh. Praesent tempor sollicitudin rutrum. Ut efficitur arcu ac ligula euismod, ut finibus est laoreet. Pellentesque sit amet dui non risus mollis interdum. Nam tempor mattis ligula ac pretium. Donec fringilla molestie justo, id posuere libero blandit vestibulum.
+
+Aliquam id placerat tortor. Ut est lectus, egestas et lacus id, pulvinar lobortis turpis. Mauris sit amet felis pellentesque, volutpat nisi in, porttitor ligula. Sed erat nisi, sollicitudin at ligula et, tristique rhoncus mauris. Ut consequat porta purus. Vestibulum sollicitudin nisl risus, vitae sodales nunc porta a. Sed pellentesque rutrum convallis. Fusce libero nisl, faucibus eu vulputate vitae, ullamcorper sit amet dolor. Integer faucibus urna sed urna lacinia facilisis. Aliquam quis risus odio. Vivamus ut odio lacinia, aliquam est non, porttitor tellus.
+
+Nullam id nulla ante. Donec consequat metus non purus sagittis finibus. Praesent ullamcorper nisi nec feugiat tempus. Aenean magna sapien, congue at metus id, congue pulvinar neque. Pellentesque nec convallis nisl. Phasellus purus leo, dignissim eget nunc quis, varius sollicitudin sem. Integer sapien orci, bibendum at eleifend non, ultricies sit amet ex. Donec molestie diam in justo eleifend facilisis. Sed imperdiet dui lacus, id dictum ex accumsan at. Quisque tincidunt at mauris placerat vestibulum. Nulla rhoncus pellentesque fermentum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed ex sapien, pellentesque eu commodo a, luctus ut tellus. Phasellus ac lacus sit amet odio elementum venenatis id vel arcu.
+
+Donec quis imperdiet ipsum. Suspendisse tempus lectus vel nisl ullamcorper, non interdum justo tincidunt. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent volutpat ex non nibh suscipit, vitae efficitur est mattis. Sed egestas tortor ac mauris pretium mattis. Praesent tincidunt faucibus ultrices. Nulla porttitor pharetra magna, at accumsan est iaculis quis. Proin vel dictum arcu, eget egestas arcu. Nunc vel condimentum metus. Vivamus a felis ut augue fermentum semper ac in diam. Duis sit amet metus nec felis vestibulum maximus a eget enim. Nam in sodales arcu.
+
+Praesent tincidunt fermentum nisl. Aliquam erat volutpat. Suspendisse eget nisi eget orci dapibus laoreet id vel nibh. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vivamus egestas, mauris sed sollicitudin interdum, nisl justo congue nulla, finibus finibus mi lacus in arcu. Nunc et velit neque. Nullam placerat ut diam vitae dictum. Pellentesque non mauris augue. Duis ornare dui lacus, eget pulvinar elit viverra quis. Integer eu justo nec sapien gravida mattis ut vel enim. Sed mollis orci in gravida luctus. Pellentesque mi lacus, consectetur quis bibendum a, rhoncus vel eros. Maecenas sit amet viverra arcu.
+
+Donec facilisis, orci sed condimentum scelerisque, purus massa finibus metus, aliquam tincidunt massa libero pellentesque massa. Pellentesque et ante mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas auctor magna nec nunc viverra, sagittis tristique urna ultrices. Etiam id consequat neque. In sed felis massa. Phasellus gravida ut massa non auctor. Aliquam blandit, felis sed volutpat ornare, lacus tellus pretium metus, at vehicula ex eros et est. Sed velit arcu, cursus vel sem suscipit, ultrices semper ex. Sed non vulputate lorem. Nunc sit amet euismod augue. Donec fermentum non sapien nec porta.
+
+Phasellus luctus tellus lacus, ut pellentesque justo facilisis id. Praesent convallis leo vel magna condimentum, in gravida diam lobortis. Duis non ex leo. Nunc id efficitur mi. Morbi non finibus sapien, ac blandit purus. Sed et vestibulum urna, ut tempor velit. Praesent et lorem et tortor ultrices placerat lobortis in elit. Morbi a orci id erat tincidunt feugiat.
+
+Phasellus ullamcorper augue vel dolor volutpat, nec scelerisque mi convallis. Etiam ut tortor tellus. Nunc cursus molestie odio, quis ornare ante vulputate vel. Nam ac fermentum urna. Proin facilisis libero eget velit ultrices, in volutpat sem scelerisque. Integer ac mi ornare, finibus leo eu, ullamcorper ligula. Mauris at nisl dapibus neque mollis pulvinar mattis id magna. Morbi eu porta purus, sed vehicula justo. Morbi rutrum dignissim enim, id semper metus. Quisque facilisis turpis non nibh semper cursus. Mauris et nulla ornare, scelerisque nisl sed, tincidunt orci. Sed ac tincidunt dui.
+
+Phasellus sodales enim maximus nisi fringilla consequat. Quisque eget volutpat orci. Integer pharetra mauris ipsum, vel vulputate risus venenatis nec. Sed ac rutrum quam. Pellentesque lacinia augue ut cursus ultricies. Phasellus rutrum ornare nunc, vel dapibus neque auctor ut. Nulla iaculis malesuada sem, a imperdiet diam facilisis a. Nunc iaculis sed lectus et tincidunt. Ut ut nibh sit amet est faucibus condimentum aliquam ut felis. Nunc mollis ultrices quam sed finibus. Aenean ac laoreet tortor.
+
+Suspendisse ac enim vitae velit pulvinar venenatis. Maecenas non tristique orci. Etiam aliquam dui quis lorem egestas suscipit. Integer eget mollis velit, vel rhoncus lectus. Nullam sed erat scelerisque nibh efficitur pharetra. Maecenas lobortis aliquam ante, et imperdiet nunc ullamcorper in. Donec eu feugiat nunc. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam vel malesuada ante.
+
+Sed faucibus massa eget mauris rutrum, sed posuere libero blandit. Nunc lobortis odio tristique ipsum porta molestie. Nam tempus velit eu quam sodales, vel consectetur diam vehicula. Nam quis facilisis magna. Maecenas vel mauris tortor. Suspendisse nisl enim, dictum sed sem a, feugiat euismod urna. Donec porttitor nibh at leo suscipit, vitae viverra sem fringilla. Proin accumsan pellentesque mi, et efficitur ligula feugiat sit amet.
+
+Cras ac elementum ligula. Sed eu lacus id erat tincidunt consectetur vitae sed tortor. Integer iaculis orci at nisl consequat, lacinia viverra orci vulputate. Vestibulum diam nisl, iaculis eu luctus non, faucibus ut libero. Quisque vel eros tempor, tempor tellus sed, lacinia ex. Ut non lorem bibendum, venenatis mi nec, faucibus augue. Vestibulum urna tellus, hendrerit at ultricies a, ultrices et mi. Mauris scelerisque luctus mauris dictum molestie. Curabitur dapibus lobortis massa, a dapibus libero tincidunt eget. Nunc ullamcorper nunc quis odio viverra, a facilisis justo scelerisque. Vestibulum tincidunt cursus enim, sed condimentum justo ullamcorper quis.
+
+Aenean quis dapibus elit. Maecenas lacinia consectetur ligula, sed condimentum lorem efficitur ornare. Sed et vulputate lacus. Pellentesque eleifend, lectus nec elementum venenatis, odio felis tempor est, sed sodales orci risus eu eros. Maecenas imperdiet tellus sed felis interdum, in pharetra arcu venenatis. Quisque eget libero sed lorem molestie semper. Aenean quis lacus consectetur, tincidunt massa elementum, ornare lorem. Quisque pellentesque, nisl vel scelerisque semper, lorem mi pellentesque justo, non commodo magna turpis ut nibh. Morbi nec massa eu odio aliquet suscipit. Sed nec cursus elit. Aenean id commodo magna, et hendrerit justo. Sed purus urna, imperdiet ut nunc sit amet, malesuada elementum lorem. Fusce congue sem arcu, in fermentum purus porta eget. Donec laoreet risus eu nisi interdum, ut imperdiet est pretium.
+
+Nulla non egestas urna. Suspendisse facilisis, nibh et suscipit luctus, ligula elit mollis ex, ac vulputate sapien nisl a magna. In in placerat ligula. Mauris ullamcorper purus non sapien pellentesque elementum. Sed pellentesque enim dolor, gravida facilisis mauris molestie id. Fusce metus nibh, dignissim ornare justo ac, suscipit blandit nulla. Suspendisse non suscipit ante.
+
+Phasellus sed commodo lorem, at consectetur leo. Proin eget malesuada risus. Maecenas eleifend lacus in arcu condimentum lacinia. Nulla convallis ante a velit feugiat, id posuere augue accumsan. Suspendisse aliquam justo sed est aliquam efficitur. Maecenas tempus orci quis lacinia convallis. Nullam non nisi ex. Maecenas vel turpis eu lacus tempus facilisis rhoncus ac velit. Etiam feugiat ligula sit amet tempus dapibus. Fusce odio ex, vulputate a rutrum nec, fringilla nec massa. Pellentesque pharetra augue quam, eget ultricies lacus tincidunt a.
+
+Curabitur pulvinar lobortis nunc. Nunc sollicitudin sapien eget tellus laoreet ornare. Duis et mi in quam dignissim cursus id ut eros. Aenean venenatis in lacus non sodales. Vestibulum vitae viverra massa, et bibendum massa. Fusce mi lorem, hendrerit id odio eget, feugiat vehicula ligula. Aliquam euismod, libero at efficitur feugiat, eros metus dignissim dolor, a dapibus orci tellus vel massa. Vestibulum vehicula sagittis elit hendrerit facilisis. Cras ut metus a nisl congue sagittis. Donec nec commodo nisi. Donec orci ex, dapibus eget bibendum ut, vehicula vel massa.
+
+Duis enim urna, vulputate at nunc eu, posuere semper nibh. Nulla leo nisl, gravida eget risus ultricies, efficitur molestie mauris. Nam sed placerat lorem. Duis rhoncus sodales lectus, a vulputate odio blandit eget. Nam dictum dolor sit amet metus tristique, non lobortis nulla tempor. Donec suscipit maximus velit at consequat. Donec ut odio vitae nibh placerat faucibus eget eget mi.
+
+In molestie ultrices felis, at ullamcorper lorem imperdiet accumsan. Aenean volutpat sed sem vel sollicitudin. Sed iaculis eros justo. Vestibulum posuere volutpat cursus. Proin dapibus sem sit amet nisi ornare auctor. Sed ultricies elit ac sapien feugiat, eget venenatis quam porta. Cras at nisi libero. Cras eget nunc non sem ullamcorper pretium et quis ipsum. Nam elementum auctor malesuada.
+
+Nam quis vestibulum felis. Ut a sodales dolor. Vestibulum et turpis id odio semper pretium. Vestibulum porta in nisl ut porta. Fusce commodo, quam sit amet porttitor lobortis, urna mauris dictum justo, ut egestas erat erat ut nunc. Aenean pulvinar metus libero. Nullam aliquet finibus ex, ac rhoncus dolor eleifend nec. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean vestibulum id mi vel malesuada. Curabitur nec mollis ex. Fusce ullamcorper est ligula, non dignissim augue imperdiet non. Nam tempor varius rhoncus. Phasellus suscipit urna in nisl facilisis, aliquam efficitur nunc vulputate. Proin ac accumsan velit, nec tincidunt erat. Suspendisse molestie ipsum eget erat ultricies consequat eget non lacus. Etiam porta augue eu fringilla commodo.
+
+Ut placerat consequat volutpat. Integer finibus elit ut tortor gravida semper. Aenean interdum, massa vitae molestie fermentum, lorem ligula blandit magna, at suscipit nulla urna quis nisi. Sed eget orci volutpat, tincidunt augue nec, mollis ligula. Aliquam erat volutpat. Nunc sed semper diam, sit amet blandit enim. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Duis id eros felis. Phasellus rhoncus consequat aliquam. Proin interdum mattis lectus et accumsan.
+
+Vivamus et enim sed urna congue ullamcorper vitae ac libero. Nam eu orci metus. Aliquam erat volutpat. Nulla diam purus, tincidunt at massa vel, eleifend rhoncus nunc. Suspendisse bibendum risus eu ligula elementum suscipit. Aenean posuere, purus vel sodales congue, purus augue venenatis tortor, eget cursus leo risus vel lacus. In vitae neque feugiat risus malesuada tempus. Maecenas maximus eget risus ut vestibulum. Donec at ex non orci malesuada porttitor. Praesent faucibus lectus ligula, at convallis tortor eleifend facilisis. Cras laoreet nibh et tellus semper tempus. Proin ligula sapien, ultrices eget tempus id, convallis eget risus. In maximus enim sed nulla accumsan ultrices.
+
+Donec tristique mi aliquam, interdum ex tincidunt, varius tellus. Curabitur eu eros ut eros facilisis iaculis sed ut leo. Aliquam vel hendrerit purus, et pulvinar elit. Nunc mollis porttitor euismod. Donec justo quam, viverra id sodales non, viverra sit amet massa. Maecenas consectetur eleifend nunc, quis malesuada libero mattis eget. Etiam dignissim posuere imperdiet. Phasellus lectus nibh, ultrices scelerisque pharetra ut, auctor nec mauris. Suspendisse et arcu non mauris lacinia efficitur sit amet sagittis purus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam consectetur, augue sed cursus pretium, felis nibh dictum enim, sit amet porttitor odio tellus et dolor. Pellentesque gravida nunc in enim facilisis, eu accumsan eros blandit. Nam iaculis massa purus, ut luctus ligula bibendum sit amet.
+
+Sed a volutpat turpis. Vestibulum id volutpat risus, et porta turpis. Mauris in velit auctor, laoreet urna non, elementum dui. Mauris fringilla, orci eget luctus ullamcorper, mauris ipsum volutpat leo, et gravida nibh ex vel eros. Duis at odio quis turpis sagittis venenatis a vel neque. Praesent venenatis lobortis magna, et scelerisque magna aliquet in. Phasellus eget ex tincidunt, venenatis orci at, egestas elit. In magna lacus, vestibulum nec molestie quis, faucibus convallis lectus. Sed ac facilisis sapien.
+
+Curabitur ut posuere tortor. Aliquam at ultricies mi. Vestibulum erat magna, dignissim vel diam in, semper cursus tortor. Cras nisl mauris, pellentesque vitae tincidunt eget, lobortis nec nibh. Nulla dapibus enim nulla, ac iaculis lorem tempus sit amet. Nam vitae elit arcu. Praesent tortor erat, euismod elementum dolor et, tincidunt fermentum dolor. Nulla porta ex at sapien posuere, at tincidunt elit lobortis. Nunc interdum accumsan accumsan. Aliquam et gravida nisl. Aliquam dictum justo et justo rutrum ultrices. Vivamus sodales sagittis libero in dignissim. Morbi at nulla id nisi sagittis bibendum. Aliquam at tortor dapibus, iaculis lorem ac, pretium justo. Vivamus malesuada ligula vitae diam cursus, quis imperdiet justo eleifend.
+
+Donec tristique lectus gravida, ultricies orci in, aliquet est. Maecenas lacus dui, fringilla maximus rutrum sed, sodales aliquet ligula. Donec ultrices porta fermentum. Curabitur at suscipit augue, non malesuada felis. Donec nec magna mollis, fringilla lectus at, consectetur lacus. Suspendisse a nulla libero. Aliquam laoreet ut libero quis volutpat. Sed varius turpis ut enim interdum, non ultricies turpis mattis. Etiam quis justo sed lacus vestibulum placerat at et libero. Aenean mollis pulvinar justo mollis placerat. Vivamus sit amet metus tortor. Sed massa enim, finibus eu ante a, rhoncus consectetur justo.
+
+Vivamus ultrices viverra dapibus. Vivamus molestie volutpat feugiat. Etiam eleifend id erat ac lobortis. Ut eget ex tempus, lobortis urna vel, laoreet felis. Nam sed fermentum nibh, in lacinia erat. Quisque at lobortis elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec maximus urna et pretium ornare. Vivamus velit nunc, gravida et massa ut, accumsan convallis dui. Aenean porta in velit ac pharetra. Etiam tincidunt rutrum ante feugiat porttitor. Nunc posuere, odio a ornare luctus, diam elit vestibulum quam, quis vulputate lectus justo a lectus. In a dui nec nulla fermentum pulvinar sit amet nec ligula.
+
+Maecenas euismod metus urna, et porta massa aliquam at. Vivamus et risus mi. Donec id pretium elit. Proin maximus auctor sapien, sit amet viverra velit faucibus euismod. Etiam sit amet justo volutpat, dictum neque id, porta justo. Suspendisse vestibulum placerat ligula vel pellentesque. Curabitur auctor, orci scelerisque ornare eleifend, risus est congue est, sit amet pulvinar est dolor in libero.
+
+Nam tincidunt massa neque. Praesent velit neque, molestie vitae mollis porttitor, placerat eu dui. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque interdum, magna et pellentesque tempus, diam elit egestas nibh, pellentesque aliquam lorem lacus ut augue. Donec scelerisque elit metus, eu molestie tellus semper eget. Aenean in mauris quis sapien scelerisque fermentum. Integer rutrum sem erat. Sed sit amet vestibulum tortor. Donec sodales tortor sollicitudin nisl venenatis, vitae ultricies turpis aliquet. Etiam egestas sem eu felis tincidunt, eget rutrum ante sodales.
+
+Curabitur magna eros, volutpat nec cursus at, mattis eu libero. Fusce maximus fringilla nisi, ac porttitor eros interdum at. Quisque ullamcorper tempor tellus, quis pretium lectus pretium pretium. Nam commodo massa a est gravida, a venenatis elit tristique. Mauris nisi dui, pellentesque in mauris in, semper placerat purus. Vestibulum nunc eros, aliquet non laoreet aliquam, dictum in justo. Phasellus neque urna, tincidunt in faucibus in, egestas vel quam. Vestibulum et egestas odio. Fusce neque quam, eleifend nec nulla eget, dictum vulputate leo.
+
+Sed tempus neque laoreet felis tempus bibendum. Aenean vel bibendum lectus. In quis tristique dui. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris quis ante non augue malesuada sodales. Curabitur maximus tincidunt placerat. Vestibulum nec est a tortor mollis tristique. Proin lacinia enim eget nisl tempus rhoncus. Etiam ut urna vitae purus sagittis pretium. Suspendisse placerat, velit id lacinia eleifend, nisi nulla volutpat dui, nec ultricies sem mi ut tortor.
+
+Aenean luctus metus et neque mollis rhoncus. Quisque vestibulum dignissim tincidunt. Donec dignissim, arcu eget bibendum aliquam, eros nisl imperdiet sem, at luctus lacus dui finibus neque. Aliquam eget convallis eros. In efficitur orci et imperdiet ornare. Morbi interdum consequat lorem, id dignissim magna molestie et. Maecenas finibus nulla eget sem volutpat, ac mollis sem faucibus. Phasellus sit amet fermentum tellus. Proin accumsan turpis sapien, ut pharetra leo pellentesque eu. Duis eu mattis lectus, sit amet aliquet dolor. Nullam tempus, quam eu pellentesque pretium, magna turpis porttitor ligula, nec luctus tellus nulla vel mauris. Quisque lacus turpis, consectetur in tellus gravida, pellentesque sollicitudin orci. Ut risus sapien, varius vitae ornare eu, tempor vitae enim. Vivamus lacinia purus arcu, sit amet pretium augue mollis eget.
+
+Aenean eget semper augue, in sollicitudin erat. Donec interdum bibendum lacus, in laoreet mi ullamcorper ut. Aliquam velit lacus, rutrum ultricies arcu vitae, iaculis venenatis sem. Nulla et lacinia justo. Vestibulum tempor porttitor rhoncus. Mauris maximus tincidunt erat at molestie. Vivamus pulvinar arcu et velit molestie, interdum faucibus dolor molestie. Fusce gravida, est sit amet blandit aliquam, est justo accumsan ligula, interdum euismod nunc ante ut odio. Vivamus a justo volutpat, tincidunt arcu vel, aliquam lacus. Morbi facilisis, nibh sit amet viverra sodales, lacus urna venenatis odio, a varius nisl sem vitae risus. Aenean et tellus vel nulla congue molestie eu at erat. Maecenas at urna sollicitudin, commodo est ac, laoreet ligula. Morbi commodo condimentum metus, eget vestibulum odio. Donec eu lectus viverra, rhoncus odio eget, placerat felis. Donec eget arcu nec ligula
+placerat accumsan ut sed enim. Ut massa nisl, sagittis vel tristique blandit, semper in dolor.
+
+Proin vitae posuere ipsum. Donec id augue vel enim commodo interdum. Maecenas ut pharetra risus. Donec lacinia lobortis massa et lacinia. Cras iaculis eros nec lorem finibus, id fringilla turpis interdum. Nulla facilisi. Donec nec scelerisque nunc. Praesent nulla nunc, varius tempus condimentum et, vehicula et nunc. Vivamus lacus nisl, condimentum at viverra et, venenatis ac est. Nulla interdum ullamcorper accumsan. Cras interdum diam id dui pellentesque commodo. Aenean scelerisque, est quis aliquet finibus, nisl est maximus dui, id lobortis est ligula id neque. Donec placerat suscipit quam, in hendrerit libero ultricies nec. Vestibulum justo arcu, hendrerit quis purus blandit, eleifend lobortis nunc. Suspendisse elementum magna turpis, non venenatis odio consequat pharetra.
+
+Maecenas eget tellus lectus. Proin sit amet odio libero. In sodales faucibus lacus, eget viverra neque. Proin posuere sollicitudin ex id mollis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut fringilla sit amet nulla a porttitor. Etiam venenatis est condimentum, rutrum nibh in, rutrum sem. Suspendisse potenti. Phasellus sit amet sem sem. Mauris imperdiet sagittis odio, vitae lacinia felis mollis vel.
+
+Sed ex lorem, semper non massa sed, molestie varius magna. Morbi semper scelerisque lectus nec dapibus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam a augue tincidunt, ullamcorper urna ut, gravida ipsum. Suspendisse potenti. Nullam sem tortor, ultricies in laoreet scelerisque, pharetra vitae sapien. Curabitur eleifend faucibus tincidunt.
+
+Donec maximus vestibulum lacus at congue. Sed cursus scelerisque justo, eget dapibus diam dignissim id. Sed non ligula lorem. Cras non orci lectus. Maecenas sit amet diam augue. Aliquam quis tempus neque, vel hendrerit dolor. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed dapibus, lectus nec sagittis imperdiet, elit metus consequat orci, eget euismod arcu orci et urna. Aliquam sollicitudin odio ac ante fringilla faucibus.
+
+Pellentesque porttitor arcu sed justo iaculis, nec blandit leo imperdiet. Donec eget rhoncus est. Quisque bibendum molestie mattis. Aenean rutrum ex sed gravida dignissim. Proin tempus mi id nulla dictum interdum. Nulla fringilla efficitur leo vel porta. Cras tortor ligula, egestas eget consectetur sollicitudin, auctor accumsan ligula. Nulla id pulvinar tortor. Proin lacinia augue a massa iaculis, eget fringilla risus commodo. Cras placerat felis at lacus consectetur dictum. In porttitor sed nibh quis pretium. Pellentesque velit lacus, ultricies vulputate consectetur quis, eleifend a augue. Phasellus interdum lectus at nisi iaculis fermentum.
+
+Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce posuere odio ac congue porttitor. In aliquam, odio id suscipit hendrerit, dui magna pretium lacus, ac rutrum neque purus et turpis. Morbi viverra pulvinar lectus quis pharetra. Nam sit amet lectus eu tortor efficitur maximus tristique eu lectus. Nunc aliquet porttitor ipsum, nec elementum ex hendrerit a. Praesent vehicula lorem nec urna vulputate congue. Morbi at laoreet augue, at fringilla purus. Vivamus venenatis, lorem eu hendrerit scelerisque, quam ante egestas leo, nec tempus est odio ut ante. Sed ac ipsum in lectus cursus convallis. Integer ut nisi at tortor congue consectetur sit amet ac arcu. Nullam accumsan dictum massa in imperdiet. Maecenas eget vestibulum sem.
+
+Suspendisse sit amet purus dignissim, laoreet ipsum vitae, euismod est. Nam eu pretium libero. Sed nec dolor quis ex lobortis vehicula. Maecenas a laoreet lectus. Nam in elementum leo. Vestibulum nec nisl ultrices, molestie sem a, pretium neque. Cras a condimentum nibh, vel efficitur ante. Quisque in urna sed velit maximus placerat. Curabitur et lacus nisi. Quisque vulputate ligula ex, ut scelerisque mi iaculis a. Proin eleifend tempus elit, a placerat ex ornare commodo. Morbi vitae nisi malesuada, imperdiet orci a, suscipit ex. Etiam posuere nibh mi, et feugiat tellus sagittis sit amet. Praesent risus lacus, suscipit eget consectetur vitae, finibus a arcu. Quisque pellentesque dignissim ipsum congue ullamcorper.
+
+Cras vel elementum arcu, non pellentesque lorem. Curabitur sed malesuada augue. Quisque ut massa nulla. Quisque sit amet ullamcorper ligula, ac dignissim nisi. Nullam commodo mi quis felis accumsan, nec mollis ante sagittis. Sed et consequat dui. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur quis fringilla purus, a imperdiet enim. Quisque sagittis laoreet pellentesque. Vestibulum ac nunc non lorem tempus imperdiet vel vel sapien. Maecenas vitae lobortis lectus, quis fringilla nisl. Quisque quis cursus lorem. Donec condimentum massa dolor, vitae finibus est ornare eu. Nam facilisis aliquam rutrum.
+
+Sed ornare, velit non gravida dignissim, lectus orci suscipit nisi, non porta dolor ante a urna. Pellentesque et sapien tristique eros euismod aliquam. Duis mi massa, ullamcorper in nulla sit amet, volutpat lobortis ante. Nam erat urna, rutrum vel lectus vel, imperdiet iaculis lacus. Phasellus eget neque consequat, posuere tortor eu, fringilla est. Donec tincidunt cursus suscipit. Aliquam erat volutpat. Vivamus auctor vehicula risus, sed ornare orci. Curabitur sed mi est. Aenean ultrices pellentesque nisl vel placerat. Duis sagittis egestas quam, lacinia sollicitudin lectus laoreet eget. Phasellus nec molestie tellus. Phasellus mollis eu nulla at scelerisque. Maecenas sed dui ut orci scelerisque aliquet. Maecenas posuere leo non risus tristique, vitae pellentesque leo fringilla.
+
+Cras in iaculis ex. Integer sollicitudin felis eu fermentum sollicitudin. Phasellus interdum blandit sapien eu facilisis. In sollicitudin, quam facilisis gravida fermentum, est ligula iaculis lorem, in commodo odio enim sed massa. Quisque vel tortor venenatis, eleifend augue euismod, lobortis enim. Donec venenatis odio sit amet sagittis malesuada. Vestibulum nec ex eros. Fusce ornare ex diam, dapibus faucibus ligula venenatis eget. Curabitur bibendum volutpat lectus, non molestie mi sollicitudin at. Nullam suscipit vitae lacus et venenatis. Cras auctor condimentum sodales. Sed non odio tincidunt, sodales lacus vitae, tristique eros.
+
+Sed fermentum lobortis tellus condimentum ullamcorper. Ut convallis lectus vitae condimentum congue. Etiam condimentum convallis metus, et sollicitudin nunc blandit quis. Aenean ut sodales augue. Quisque eget lobortis sapien, id sodales mauris. Vestibulum ac justo et nunc euismod dignissim ut sit amet elit. Suspendisse et mattis velit. Nunc varius tristique diam ultricies scelerisque. Proin fermentum nec orci non imperdiet. Donec erat lacus, imperdiet non elit ornare, bibendum lobortis tellus. Aliquam dictum laoreet enim vel tincidunt. Aenean elit nisl, facilisis et lobortis quis, feugiat id diam.
+
+Curabitur sit amet est quis lectus condimentum porttitor vitae in urna. Aenean sollicitudin, risus ac convallis imperdiet, libero metus vehicula est, ornare ornare magna lorem finibus nisi. Nam luctus diam sem, ut aliquam justo semper a. In feugiat convallis lacus id consequat. Vestibulum quis ligula risus. Duis molestie elit vitae arcu interdum dictum. Sed at sem eget enim ullamcorper commodo id eget leo. Nam aliquam turpis vitae ante mattis pretium. Curabitur vestibulum, nibh eget ornare accumsan, tortor metus pharetra ipsum, vitae egestas diam augue at justo. Sed arcu augue, elementum nec blandit id, hendrerit nec velit. Nulla quis nulla feugiat, hendrerit metus quis, elementum libero. Vestibulum ut massa sed erat dapibus imperdiet at aliquam justo. Aliquam vestibulum lacinia diam eget consequat. Nam maximus in enim sed semper.
+
+Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque in blandit libero. Donec vehicula tincidunt tortor, et tempus velit rutrum quis. Curabitur in rutrum leo, ut pulvinar orci. Proin quis porta tellus, vel laoreet erat. Sed commodo arcu at dolor tempus eleifend. Sed vel blandit nibh, id ultricies risus. Etiam quis dolor est. In dapibus rhoncus tellus, quis finibus dui pharetra ac. Integer consectetur elit purus, et accumsan nunc dictum eu. Nam at ligula convallis, pretium quam id, scelerisque arcu. Mauris vel sapien varius, bibendum quam in, efficitur leo. Suspendisse molestie rhoncus arcu et molestie.
+
+Nam tincidunt nisl eros, tempus faucibus nisl blandit ut. In sit amet nibh vel nulla congue pulvinar. Maecenas et sapien sed turpis consequat sollicitudin. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec blandit nisl rhoncus mauris congue, eu tempus eros lobortis. Donec sodales nisi accumsan justo tincidunt sollicitudin. Donec interdum libero ac ante volutpat tincidunt.
+
+Vestibulum sit amet feugiat dolor, eget aliquet magna. Sed feugiat, nulla sollicitudin dictum cursus, lectus justo auctor lectus, vitae porta erat mi id magna. Nam eu nulla id lacus suscipit pharetra. Fusce laoreet metus non pellentesque convallis. Curabitur gravida ligula eu rutrum laoreet. Maecenas eget finibus quam. Maecenas non turpis ante.
+
+Proin ullamcorper diam id orci laoreet semper eget eu massa. Donec aliquam maximus ultricies. Morbi lobortis mauris finibus, pharetra augue non, malesuada enim. Morbi lacus nulla, varius eu neque ac, finibus fringilla nunc. Cras accumsan eros quis pellentesque ornare. Praesent vulputate, tellus ut vulputate fringilla, massa mi sagittis orci, ut molestie magna enim et quam. Phasellus aliquet eleifend libero ac sagittis. Maecenas eu suscipit sapien. Sed consequat ut tortor id vehicula. Suspendisse elit augue, varius ac arcu vel, tempus suscipit elit. Nam ultrices eros a lobortis finibus. Aenean porta turpis sollicitudin ultricies placerat. In hac habitasse platea dictumst. Duis lectus turpis, pharetra ut lobortis vel, laoreet sit amet urna.
+
+Pellentesque est tellus, tempor et sagittis quis, egestas eget tellus. Duis non tincidunt eros. Aliquam lacus ligula, feugiat nec interdum at, consequat vitae odio. Morbi tristique pretium ante, non sodales metus molestie non. Donec accumsan vitae tellus in interdum. Mauris sagittis vel neque rutrum gravida. Quisque nec lectus vitae magna porttitor dapibus vitae eget felis. Phasellus facilisis consequat imperdiet. Aenean hendrerit dui quis felis ultricies, nec sollicitudin leo aliquet. Etiam rutrum justo quis nulla feugiat, sit amet tempus felis accumsan. Vivamus quam odio, interdum eu purus ut, mattis iaculis tortor. Sed turpis leo, imperdiet eu nibh et, condimentum luctus velit. Aenean vulputate dui diam, sit amet blandit nibh faucibus sit amet. Quisque diam erat, tincidunt quis tincidunt et, sagittis nec augue. Quisque eros tellus, aliquet non ex eget, rutrum ornare massa. Praesent
+ac ultrices purus.
+
+Quisque at massa eget massa dapibus porta. Duis tristique augue ac lobortis consectetur. Phasellus dapibus pulvinar urna, at congue nisl congue et. Phasellus ut neque lacinia, consectetur lectus quis, vulputate nunc. Sed semper, urna vitae imperdiet venenatis, ligula massa pulvinar est, sit amet tincidunt elit eros et quam. Phasellus feugiat, dolor ac dictum sollicitudin, massa lorem tempor velit, ac ultrices velit dui ac nisi. Phasellus facilisis aliquet ligula, et hendrerit sapien malesuada non. Donec efficitur luctus ullamcorper. Sed vel arcu at turpis elementum euismod vitae ac nunc. Pellentesque mi urna, pulvinar ac metus a, interdum ullamcorper urna. Vestibulum at tempor enim, sed congue felis. Maecenas gravida lectus ante, blandit laoreet turpis fermentum ac.
+
+Proin volutpat interdum massa eget vehicula. Vestibulum nisi arcu, varius eu nisl ac, dignissim aliquet elit. Praesent nec faucibus ex. Donec elementum et libero at sagittis. Aliquam tempus, eros sit amet hendrerit tempor, lectus lectus imperdiet lectus, ac pharetra urna erat nec enim. In molestie mauris vitae ipsum tincidunt, vel sollicitudin magna facilisis. Vivamus lectus massa, lacinia ac libero non, convallis molestie sapien. Ut suscipit pellentesque sollicitudin. Phasellus laoreet, sem eu suscipit rutrum, velit est rhoncus purus, semper facilisis dui felis nec diam. Phasellus in dolor aliquam, vulputate sapien imperdiet, suscipit elit. Proin sodales sed sem id euismod. Fusce commodo eget nibh et sollicitudin. Sed ut ullamcorper arcu.
+
+Quisque aliquam in turpis vel sagittis. Donec aliquet auctor lorem, ac suscipit turpis sollicitudin id. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam justo eros, aliquet sed hendrerit a, faucibus sed libero. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ullamcorper nulla ut tellus bibendum finibus. Morbi pretium, dolor vel aliquet euismod, mi metus scelerisque urna, condimentum varius justo lorem rutrum ante. Aliquam erat volutpat. Duis varius ac sem ac pulvinar. Nulla a pretium nulla. Quisque vitae iaculis turpis. Curabitur at rutrum mauris. Cras ac est ante.
+
+Integer id nisi id dolor egestas hendrerit. Nunc pellentesque nisl massa, ut condimentum ipsum fringilla sit amet. Etiam dolor neque, hendrerit commodo suscipit ut, vulputate vel nisl. Donec condimentum cursus lectus, at tempus est fermentum id. Nam hendrerit leo est, eu scelerisque tellus egestas quis. Nulla hendrerit tempus leo a vulputate. Mauris finibus ut ante eu dignissim. Praesent odio odio, sagittis a dapibus quis, vulputate et purus. Nam iaculis sagittis diam, id faucibus sem. Nullam fringilla felis eu nisi egestas, vel consectetur augue fermentum. Suspendisse porttitor sapien non nisi viverra vehicula. Donec eget nunc id enim pulvinar pharetra eget sed nisi. Morbi sed diam eget sapien vulputate ultricies ut nec nisl. Maecenas ac mollis mauris. Sed vulputate eget nulla commodo dignissim. Vivamus eu lacus felis.
+
+Phasellus laoreet bibendum odio. Phasellus mattis eleifend urna, sit amet aliquet nibh. Mauris consectetur felis quis sapien vulputate maximus. Morbi dolor dui, hendrerit vitae mi eu, interdum accumsan augue. Nunc fringilla, erat ut egestas iaculis, lectus quam dignissim enim, ut sollicitudin ipsum leo sed libero. Aliquam tristique lacus quis mauris semper egestas. Nunc iaculis lacus in ultricies condimentum. Pellentesque nec ligula sagittis, iaculis lectus ut, tristique libero. Aliquam mattis condimentum dolor id ultrices.
+
+Sed finibus, dui in consectetur varius, est magna blandit felis, in commodo lectus eros nec neque. Vestibulum faucibus sapien nec felis porta lobortis eget euismod felis. Duis lacinia hendrerit commodo. Nulla hendrerit tincidunt tellus in pharetra. Nam dapibus enim eros. Suspendisse sapien lectus, euismod ac mauris vel, faucibus pretium dolor. Phasellus rhoncus pellentesque consequat. Aliquam venenatis massa a mi sagittis, quis condimentum est pharetra. Praesent accumsan lectus arcu. Nullam molestie nulla sit amet enim ultrices porttitor. Morbi id ante arcu. Nam porttitor convallis eros nec interdum. Pellentesque quis turpis eleifend, vestibulum metus sit amet, porttitor risus. Ut bibendum sollicitudin leo, tincidunt dapibus nisi venenatis non. Nullam tristique justo a tincidunt ultrices.
+
+Donec vel massa non nunc dapibus lobortis quis et ex. Cras ut erat iaculis, consectetur leo non, elementum mi. Cras nulla arcu, auctor non odio nec, vehicula posuere sapien. In tincidunt ante ac nisl vulputate eleifend. Sed non leo fringilla, pellentesque metus sit amet, ultricies augue. Maecenas et sem non risus ornare cursus. Aliquam augue neque, ultrices eu dapibus ac, laoreet quis nunc. Nullam ornare congue velit in ultrices. In maximus sed sem id vehicula. Aliquam sed urna eget dui aliquam lacinia. Mauris porttitor, neque at viverra placerat, eros risus porttitor enim, eget venenatis eros libero quis arcu. Praesent viverra nec ligula sit amet feugiat. Duis odio nunc, porta vel ligula sit amet, cursus elementum sapien. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+
+Quisque ut rhoncus augue. Donec a cursus lorem. Nulla efficitur euismod ultrices. Cras maximus suscipit velit, ut pretium massa varius feugiat. Phasellus consequat erat enim, eget viverra magna semper vel. Quisque tempor magna dui, nec consectetur dolor volutpat nec. Pellentesque pretium risus sit amet dui tristique commodo. Nunc vitae ligula a arcu maximus condimentum vitae at ligula. Nulla facilisi. Fusce euismod lectus leo, sit amet convallis lorem fermentum quis. In pulvinar lacus eu ante feugiat vulputate. Vivamus tincidunt sed justo sed elementum. Nam orci enim, viverra et fermentum pretium, suscipit vitae risus.
+
+Vestibulum tempor nulla neque, quis tincidunt est feugiat eu. Donec mauris arcu, eleifend vel dui sit amet, maximus consectetur metus. Cras in tellus quam. Vivamus sit amet lectus non tellus ullamcorper volutpat quis vel mi. Nullam eget leo eleifend, consectetur turpis vel, maximus mi. Ut condimentum, sem convallis tristique blandit, dolor sapien consectetur nibh, a venenatis dolor lorem id est. Donec scelerisque, purus at fringilla bibendum, nibh ante pharetra sapien, eu ultrices sem urna quis arcu.
+
+Aenean varius, turpis a tempus sollicitudin, velit risus fermentum arcu, vitae euismod mi orci a dui. Nullam tempor ac ligula non blandit. Integer at nulla sapien. In pellentesque ante sed felis volutpat dignissim. Proin pulvinar justo et euismod mattis. Integer congue erat a tempus pretium. Mauris tempor nibh eget elit semper efficitur. Curabitur sit amet venenatis massa. Sed at pharetra nisi. Nam finibus arcu nec sapien commodo, a maximus sem semper. Morbi eleifend est sit amet risus finibus placerat.
+
+Nunc elit urna, iaculis sed risus nec, vestibulum lobortis turpis. Aenean eget massa sed magna finibus blandit. Ut ut arcu a massa suscipit rutrum eu ut felis. Vivamus metus quam, sagittis sed quam ac, tempor interdum nunc. Proin bibendum fringilla ultricies. Mauris non hendrerit quam. Nulla iaculis ultricies augue non suscipit. Integer imperdiet erat ut tincidunt elementum. Sed condimentum vehicula metus nec consectetur.
+
+Suspendisse ac justo convallis, dignissim ex et, pharetra erat. Mauris elementum, tellus et cursus ultricies, lorem nisl elementum elit, vitae gravida est sapien eget lorem. Sed id purus tortor. Sed ac nulla in metus porttitor commodo eu sed dui. Quisque egestas et ipsum sed finibus. Phasellus dictum quis tellus eget varius. Suspendisse placerat at risus vitae rutrum. In blandit dapibus lectus et rutrum. Suspendisse pharetra nibh ut nulla molestie, at euismod dolor consectetur.
+
+Pellentesque varius, risus eget porttitor tincidunt, purus dolor ornare elit, eu mollis odio justo a magna. Nam pharetra cursus elit. Mauris lectus metus, dictum ut eleifend nec, hendrerit sed nulla. Etiam tortor ex non.

+ 19 - 0
tests/checks/state

@@ -0,0 +1,19 @@
+#!/bin/sh
+
+case "$1" in
+    0)
+        echo "OK: Everything is normal"
+        exit 0
+        ;;
+    1)
+        echo "WARNING: That's strange."
+        exit 1
+        ;;
+    2)
+        echo "CRITICAL: Danger!"
+        exit 2
+        ;;
+esac
+
+echo "UNKNOWN: Huh?"
+exit 3

+ 6 - 0
tests/checks/test-lorem

@@ -0,0 +1,6 @@
+#!/bin/sh
+
+dir=$(dirname $0)
+
+cat $dir/lorem.$1.txt
+exit 0

+ 5 - 0
tests/checks/timeout

@@ -0,0 +1,5 @@
+#!/bin/sh
+
+sleep 10
+echo DONE
+exit 0

+ 0 - 0
tests/configs/certs/empty.crt


+ 29 - 0
tests/configs/certs/nrpe.crt

@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE/zCCAuegAwIBAgIUSfGYg8SERefq7yb1MQoegnb2fL8wDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEbnJwZTAeFw0yMzA1MDkxNTM1MDZaFw0zMzA1MDYxNTM1
+MDZaMA8xDTALBgNVBAMMBG5ycGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCl7h3pRQvI0O0/Sfjc0UP+gJrUJ05/PjRSFL2MRirkKBLPSU3uHbmj8nx1
+1RMhEBOKJegJoe+yjoZ5yBl5IZRcWx51zZZWTYZBGWRkJX4YSDiYJXSmaK8eSpU0
+JSlnjVfptC1FfVSWbNJIE9MG26k4x4Sf+7BMv1U1DwOnIFkyGlh7nXq6Oh91O6xF
+orlPcVHAPt7AcRpq9MKH5SIh/H1i57obNRbZvyz6+U5QHX1I9ZgaM2qAzYODbtQu
+xiL+nMu7IDumZXhiv+HIG9bTE3yFgpmTD32zkVXDtFFtKnsthfsLaLArWnR1651E
+HAvFY+4AAAI+raOIsjk8aLEXh+8cl/1pRrpjeOZ0gQE3BlXvXONasHD+9E5FE8V9
+48dtw62n7grp1IWi/86Fh0xy5QbqIJiDjwNoq5y/M1aOs2JYpN7IBkKF6rk9fIu0
+eVDk1dqdtJaLiikI7ly/ol++gfN1qYoVcWkNsYEyWHkKTyHyTZew/OSb1sZrZjly
+/RibUnS7Er6h5meLH1dskcLvKqXGG4bYJxpUIEM3bTlEE44wHtzfeu5kkV6ogD6w
+0/Vk9PgMcZ9M3e/ptxyfprafewXsvM8S0H2SHR27QgrS5ttTXZu1mAraJ7GOfCSX
+zzUS0XxihBg0xrDtsaaKjwgPK8TL7z/Bq/zLeWF6dri7OFg/4QIDAQABo1MwUTAd
+BgNVHQ4EFgQUf7xYuC0hci/8w4Yg/ybVJt8q8NkwHwYDVR0jBBgwFoAUf7xYuC0h
+ci/8w4Yg/ybVJt8q8NkwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
+AgEAatx6z3CD+zIiiDWSPW2w63XwIeVq6KWGkn5JcuZ3mOYkvABTrse9f/xFQOi4
+4A4RIn43fRXnmyCq9bUPGR1VtNSRRN7NfYxhXGQv7a07KMIYLupgRpe+ihToFsXK
+lKMDdeGa/zoJjRrLCP5lWM22+/XgTE55hqUN7DxjVsilH2ZHfapP2KBB7MpS0HZL
+4durv3yHyEoeyMeiboeeIjSS5GUvLSS7UJG0QYe8eHNtsqi754RDnT4+FHMgf3rn
+eCVSpEolj4K7pjo0VPW4rfDJiupm5EMpJPQzL8MomC02A52D97GtA4F+AiSuMU1+
+q4W0XFiPkWjikR9J6sRAOdAlPd/3VCYNaVKRUokjwl8NHkSH+70tYr1e9+2D1NR+
+J5kTaJwedZL8efWC8lrdNz1HPpMDjdWdRpx1SIearQpb/jYQarZFFCdVGA7RX70D
+efODYRq60xF2RFtba2LcMZdpwYgTEWz/emzZxuipvRgbzsW5sDFKhacctVPo8SJ8
+//KW82u5LLNKnZvl+22kSdmmKdAFCVhiD1KdePpr1Aqt+D0tyfqS0B9PTEb6CLzz
+qSLLQnFZb0ztvgxVR4FgKJFWJ/1wFPeUhTCh/44flRMilwdqxrWlLl5HjsIrSgPv
+/nFwHV2LeXiMyJ7f99q3kaPwoEUzZCKyT7ax7DurDB2Ef4w=
+-----END CERTIFICATE-----

+ 52 - 0
tests/configs/certs/nrpe.key

@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCl7h3pRQvI0O0/
+Sfjc0UP+gJrUJ05/PjRSFL2MRirkKBLPSU3uHbmj8nx11RMhEBOKJegJoe+yjoZ5
+yBl5IZRcWx51zZZWTYZBGWRkJX4YSDiYJXSmaK8eSpU0JSlnjVfptC1FfVSWbNJI
+E9MG26k4x4Sf+7BMv1U1DwOnIFkyGlh7nXq6Oh91O6xForlPcVHAPt7AcRpq9MKH
+5SIh/H1i57obNRbZvyz6+U5QHX1I9ZgaM2qAzYODbtQuxiL+nMu7IDumZXhiv+HI
+G9bTE3yFgpmTD32zkVXDtFFtKnsthfsLaLArWnR1651EHAvFY+4AAAI+raOIsjk8
+aLEXh+8cl/1pRrpjeOZ0gQE3BlXvXONasHD+9E5FE8V948dtw62n7grp1IWi/86F
+h0xy5QbqIJiDjwNoq5y/M1aOs2JYpN7IBkKF6rk9fIu0eVDk1dqdtJaLiikI7ly/
+ol++gfN1qYoVcWkNsYEyWHkKTyHyTZew/OSb1sZrZjly/RibUnS7Er6h5meLH1ds
+kcLvKqXGG4bYJxpUIEM3bTlEE44wHtzfeu5kkV6ogD6w0/Vk9PgMcZ9M3e/ptxyf
+prafewXsvM8S0H2SHR27QgrS5ttTXZu1mAraJ7GOfCSXzzUS0XxihBg0xrDtsaaK
+jwgPK8TL7z/Bq/zLeWF6dri7OFg/4QIDAQABAoICABnokUEQJ+PmQ3UjXrlT75L4
+j7RaotYZZ1/9nw8dEatoWm+FWaa5e3gO78ISUBdUhEiI3K9MWrn9qR+wz9FrHdhB
+3gK05Cl7l1/o0BUXCZZPCI8xIgKty9ImASAQQWPK3RQ/ruXvyNpoCXl5pvSmLckQ
+1jOIwCFrqqlLO93HnkXFeVVr5HLZinnqpF6HJvoxjns/FdbkkiRrLUi8zVSTMRzV
+Y+jFpFjBkgtqDAFUaXCP8Hz+1D1iWYuXLYhUJbit0N3aDZZQt7hrj5yIREXXABV0
+q/gbbhwwsDyLlj8+Z9dW2TkR0pgiWpbjAD5XRrs+fDYBylfxEtzQP0Ggcy5iakJD
+HszR37nSow7LnuRF4AkvmrgbFP/Etf2tJTB1N1JhWUIKA2nq1lNXLrHlwHE5BLy5
+pfVp73aoE9tI9vXvS1yZ+OyNrUoyJq84QuSheH/1lKsDk6Ds3Z225pn8EmsUzomi
+J3hx7WV36iaL/cSG599nn3s9i71eOutZjUZzxdDcxwoTQaUEqREX/oldiK5MYQyx
+YEcJd6EWyWxO97w/dRF7yy9+lLrEXlo+xh+8AxAhU6FDnnkwKxA7GFeaRFJQD1d0
+VlqqIe4XAvUjWJMou6Sg1pbmYIOZheodFq6iSHpzNggrCRsIfQ3osKvce8TqSxkr
+KS2syIFKnBngwStI9FylAoIBAQDgDOg5VLVeVH4gpPGWb2PYvbHw1O4iGfBcc6Cp
+BJw+Kxk1HuQ5+xlqe3tP8VRXxDhW3YNghnrLzDcA05Qcebe5xqZlz0XmpvyVCAsi
+gLgf+WU4YB18fsUdv33V5kkkEJMvEkIIqeMmAEzHOF8Puc+c6vgS9FuHpyk04gMj
+S10tngnXQEPMqpCBUKGt8bYPtuZOUybk1noVQNTDTO9ASzFZoPMrmWoaDwbeu6kQ
+lYpRteaxZFHxUtGGbn07VX39/9W5Baqqa+n2n4kyiCBkOr2nBiiCWHfYaz/tcsw5
+iljSWMKkmlwu4ALCa2HElpacp+3H11RclYHKP5NewIbdn2UvAoIBAQC9l36oqijU
+H/+qcaN1C9509s80aW9RZbrh7WFifmG6dInJhaDtt4nru4jKpevOOx7nKJL1pvfX
+sjosZryw2BHjICx4Gf4Cf4tBrFElDQfO5/xDTsJMcclrFkSCPRafELriT7vCD8+5
+npsDTDbAT1X2eap0CIuC4BNsipjHDqWGVS619ZebcyJ3z0VFlTx7I+I3s1G/+/0b
+SFsZTFdyfNYSMei2mNDpAsNza80+qe0XMZJE091QIBlcq8PwjB7m7gkdAj7iIfZh
+W2Sc0HZ8jZZ6CY/czC1fX27hIYdQV3nvhDS/g0xOqfTFycsF19S4cNBJuQLdBVGp
+ZMlG4ByvY4fvAoIBAAT8BIaR/d71XkD3qnBAViZSQg0rj4iurww/fkmEUr2HU+48
+m7M2hOA7kwi6Q7gYI3C7SNry4vR5vJeGHXtsscuuQbFuJQ32lRPzs9u2pWIAuGHC
+saU9ZME+q1wA3Yux2rRnYZSzwtvrkcm01ViSN640BATX7tlbvKzygkNcv9vt8iYZ
+xehduw1Fb/Ngtz4uQX1omCrrIpgqcxFNOt1hTt3BmOdVaGjgALUf06kMyqD6vQEh
+TDlkMEkfWCXjxwPJl0WgfKWB9RiJgBHhuWbBb8qxdmE/+pqT+D4eGbEGBOfZFat3
+y6k3Tphoryoid4NQsReLENNmeBa5x1uKSPXRP/0CggEAO6p+uPP8L232lxx2VbKr
+iuHVqef4mYRLgSikukuN1BEy/9HnKIjXhfGaBjSbdmbSverd/SNT4nT7q9eVUI5f
+arxIYm/DqeOb3sotK1zjdTE7Ca+ypD43JlV2sAoroVmxhuGS9Grnc8I/hJUqsfEF
+27DEfQnnZgPA+SrRE+w/GXybW7ZzxP9B/LSlV1W1GAfd/KuZcbMLH9fwm5CUALra
+4BUG6NhE/t/YxO1LRYpSzDbUkoaeosXHVYvU+VIPs5t8EL4RLjeEA3Wwv003zND+
+Z1+0/8beDKLLEVzs6dLt0/wmYZMfo64HE2wDUc5v6q/OTTVFemtfHNFUKtMDFAtd
+zwKCAQEA2UhBhEsJPpg98XKhUyCadHOELuQ2erYCQK9nsMFI7sdaCZtNbOvlI6UD
+k4hPbBl1eInwSJ0joTXyVNp1MlgiP7a/sHRST5pi9Rse7d2a/nQDGImnAw9lXc/6
+gVNLdiM2Og9W76DRmyHI+Dw5TK5Wx25GaipTsG1VFKUk6BsW4eEPyKIuyZOhIzFD
+VPd7pa7DDTWYOq6weEuVkAVCKFVPTVV+yI1T9iHMAdJQwBCat7vBSZtKqjIFSEsr
++KvXQDp5aV8vJJRK8udLzRu2vuiE6L39rThuOE0dliV3wQmmHepTscsMrUmkYjEE
+am+W0DxMoHOAmXceN906QD0UyEOTyQ==
+-----END PRIVATE KEY-----

+ 19 - 0
tests/configs/certs/other.crt

@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDATCCAemgAwIBAgIUPieDopOlV/nSzCJw5LtWQypC+FowDQYJKoZIhvcNAQEL
+BQAwEDEOMAwGA1UEAwwFb3RoZXIwHhcNMjQxMjE4MDMxNTEwWhcNNDQxMjEzMDMx
+NTEwWjAQMQ4wDAYDVQQDDAVvdGhlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAI6muE3po8su1Vz4V7Ayzmhe4xe9LYV8KbG4cAhoMm6P4g+BgCM4ha+5
+9L5RH/1phu7xoIXVIAuPx8i2WGG/pi7UZY4krZyqyyKlmRP7K2xgc7c/UlYgPYDq
+BXYlSqTtFX/CBvt2DPZMH248DU3AV3VUXOjTdQQLJBHVP8gzuST3OpEAm8y+0a5m
+KFQ7p/NHvwExGhyxGNRiW+EHj1hccuTl7loupGwiCFdwrs3e3my7OQFZgrAf8MwF
+x0qYFa9woT2lV75LoCFUvz54Erzsv8zBtLMVlmkhS/r6KQVf//ZrV6VQ39D+TFg4
+M7wkSXVcadhhJzBz0N8BL+oGfnaGnbkCAwEAAaNTMFEwHQYDVR0OBBYEFKc1Y7xJ
+/KTrKgT38YahBOW2FZxmMB8GA1UdIwQYMBaAFKc1Y7xJ/KTrKgT38YahBOW2FZxm
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAGwXBqqwTj4bshdc
+ydg437ii79cyeXHoveXWPn7IHcLuJNPAaZBfOYRO+O4jAYUljr6h0EBZsKQJSVAO
+xRgDi5DRVG+aflLocjlg/P7V7LzjyZJL0Sohuk0tFZ4W+CnE69+xl7lU9CEaxxrZ
+LEGSqGPLJKSquV98VgCYSUOGJ0nQVAm/OYjmrxJbcs8ObQFIfZWGW58hfqo98tSv
+A8iA2mnTPb44MhqiMf0cMSSKsAkHw4NEoyZKjkXrbxUyxdYH/RsA89bWky15ljJw
+Y6pnT+Cd3TvbQ8xNRRYlSVBSh+0lCXRrznqdimQ23OZyW8KTcKZL8fdyspgvbsFM
+l3snKiw=
+-----END CERTIFICATE-----

+ 28 - 0
tests/configs/certs/other.key

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCOprhN6aPLLtVc
++FewMs5oXuMXvS2FfCmxuHAIaDJuj+IPgYAjOIWvufS+UR/9aYbu8aCF1SALj8fI
+tlhhv6Yu1GWOJK2cqssipZkT+ytsYHO3P1JWID2A6gV2JUqk7RV/wgb7dgz2TB9u
+PA1NwFd1VFzo03UECyQR1T/IM7kk9zqRAJvMvtGuZihUO6fzR78BMRocsRjUYlvh
+B49YXHLk5e5aLqRsIghXcK7N3t5suzkBWYKwH/DMBcdKmBWvcKE9pVe+S6AhVL8+
+eBK87L/MwbSzFZZpIUv6+ikFX//2a1elUN/Q/kxYODO8JEl1XGnYYScwc9DfAS/q
+Bn52hp25AgMBAAECggEAFd5rPM6HpLt+TC1qTAHN8OQzDk2bL+6T+cHbsv4+VQLL
+1jK1MTEWFZV9dru7Gr9Vx0XVpQ7CReN57kQ+EmYuFNnM49itoOnyEFKwwAZuZsP2
+mW4ksj1pEF1QDweyhMwv0pEtPtmfLRcIbn7YT0YgYkVXpP3d34vRsMYvbAK57Heb
+tB04xSSIiMg0w1i+rJbMg6pkBjGDzHN2N9haJ0vMAHKZGdisbCgqGxkUaWb2Z9LV
+gUMwSbq8BoeZKmZq+EtWTGJNQZ/8gYcLVbBpy1h7xKUgAT7wZYgU5hsi0F4MQwax
+3rFmbgc2grD2jE8daKN+JZDu0zA/PFfOAhRrMqjicQKBgQC/cWD+ClLKNEWxJLqH
+sHsmIc5kX8SDrRGYNwwZ7w0VkcNvtTjq/knu9OHnT+sN1QuuXQvgfppJ3s0Ej12V
+O9MC3OcYfX4LwTvUB+qhAsNSOVPzCZxs31o8IpsBaC7WDCchSdxUmtBId6giFELP
+1HDBkiQeHlbZ3p4owcjGO1ucFQKBgQC+wVKxwI3gDRP3Y1gAGKsWh4GzqMFrV2Pb
+gXRCsG04RS6Iat7jHnvUGPdPzIymdCJ5fbvl5YORpNeJK+mrRAlIdzOROZYA/AxC
+NZ29Qbww+wi8euWW/URwb58cuJzAMhirU8Dan2WS5nZNZme2VC0yrnnfTjgdsOMv
+RBsIshuQFQKBgHYxPG162CQoY4J7J4IQTed75Z2Ilp2o4vzzt0/ni09uv5ce7jX+
+qoyRuUqCx56xklWi8ms2HnFO0YpoLKGu3pac5Tv0djYxpYtBG/Ut7IK+C/s3StDY
+kDAiOUqEFK5nsFzX6eR98+tZnH71vU3sXXTUkeHaX0qBK2oEQb1I9kUFAoGAPmMH
+4q6xOAfO8egBzfZDbljfKJ0WtT6doBrUpUMCVZb6ww8A2pMLuLB5ohWqIn51D/r5
+SxUnVKju/SPphmP4DUU/Dk4hKy1D7RuP/WfUXsibcNlY4WrvyT4YcdJHIezAeLgp
+qNbc55CMPIAzh0Q8jAjYPxpb7AoAI2NI3C00KokCgYBT6DO9r1oGLxAxge9hlnUw
+gz5/i7dDRc70xPMx8RDPY6HSAc0vHextTxcJ+xZTTcXrKQlKIs7H5LySqWYU9jZv
+3j0g0l3w8xbNkHC/CnFJWa40EiLO78IUSdeOz7Z0Mbpw7a5To8UH6hyPfdyJLkJp
+Og16OLirkAiR5WPGokgwdQ==
+-----END PRIVATE KEY-----

+ 5 - 0
tests/configs/check_nrpe.cfg

@@ -0,0 +1,5 @@
+--stderr-to-stdout
+--disable-syslog
+
+--ssl-version=TLSv1.2+
+--timeout=15:CRITICAL

+ 10 - 0
tests/configs/conf.d/commands.cfg

@@ -0,0 +1,10 @@
+command[lorem_10000]=checks/test-lorem 10000
+command[lorem_60000]=checks/test-lorem 60000
+command[lorem_70000]=checks/test-lorem 70000
+command[nonexistent]=checks/nonexistent
+command[timeout]=checks/timeout
+
+command[state_ok]=checks/state 0
+command[state_warning]=checks/state 1
+command[state_critical]=checks/state 2
+command[state_unknown]=checks/state x

+ 20 - 0
tests/configs/ipv6-disallowed.cfg

@@ -0,0 +1,20 @@
+address_family=6
+
+disable_syslog=1
+debug=1
+
+log_file=logs/ipv6-disallowed.log
+pid_file=run/nrpe.pid
+
+server_port=40321
+server_address=::1
+allowed_hosts=9f85:b4b7:6488:55ce:9f02:3f68:b8cc:f44a,eaa0:ce21:86c3:5262:44a6:a484:2f65:70c4,b6e0:607f:5237:c9d7::/64
+
+dont_blame_nrpe=0
+allow_bash_command_substitution=0
+
+max_commands=0
+command_timeout=60
+connection_timeout=300
+
+include_dir=configs/conf.d

+ 4 - 0
tests/configs/ipv6-only.cfg

@@ -0,0 +1,4 @@
+include_file=configs/ipv6.cfg
+
+address_family=6
+log_file=logs/ipv6-only.log

+ 24 - 0
tests/configs/ipv6.cfg

@@ -0,0 +1,24 @@
+disable_syslog=1
+debug=1
+
+log_file=logs/ipv6.log
+pid_file=run/nrpe.pid
+
+server_port=40321
+#server_address=127.0.0.1
+#server_address=0.0.0.0,::
+allowed_hosts=localhost
+
+dont_blame_nrpe=0
+allow_bash_command_substitution=0
+
+max_commands=0
+command_timeout=60
+connection_timeout=300
+
+command_prefix=/bin/echo
+listen_queue_size=15
+
+ssl_logging=0xff
+
+include_dir=configs/conf.d

+ 20 - 0
tests/configs/log_facility.cfg

@@ -0,0 +1,20 @@
+log_facility=kern
+log_facility=user
+log_facility=mail
+log_facility=daemon
+log_facility=auth
+log_facility=syslog
+log_facility=lrp
+log_facility=news
+log_facility=uucp
+log_facility=cron
+log_facility=authpriv
+log_facility=ftp
+log_facility=local0
+log_facility=local1
+log_facility=local2
+log_facility=local3
+log_facility=local4
+log_facility=local5
+log_facility=local6
+log_facility=local7

+ 30 - 0
tests/configs/normal.cfg

@@ -0,0 +1,30 @@
+disable_syslog=1
+debug=1
+
+log_file=logs/normal.log
+pid_file=run/nrpe.pid
+
+server_port=40321
+#server_address=127.0.0.1
+server_address=0.0.0.0
+allowed_hosts=127.0.0.1,::1,nrpe.invalid
+# duplicated on purpose, checks freeing of previous list
+allowed_hosts=localhost
+
+dont_blame_nrpe=0
+allow_bash_command_substitution=0
+#command_prefix=/usr/bin/sudo
+
+max_commands=0
+command_timeout=5
+connection_timeout=10
+
+nasty_metachars=|`&><'\\[]{};\r\n
+
+keep_env_vars=EDITOR
+
+ssl_logging=0xff
+
+include=misc.cfg
+include_dir=configs/conf.d
+include_file=configs/log_facility.cfg

+ 22 - 0
tests/configs/nossl.cfg

@@ -0,0 +1,22 @@
+ssl_enabled=0
+
+disable_syslog=1
+debug=1
+
+log_file=logs/nossl.log
+pid_file=run/nrpe.pid
+
+server_port=40321
+#server_address=127.0.0.1
+server_address=0.0.0.0
+allowed_hosts=127.0.0.0/24,::1
+
+dont_blame_nrpe=0
+allow_bash_command_substitution=0
+
+max_commands=0
+command_timeout=5
+connection_timeout=10
+
+include=misc.cfg
+include_dir=configs/conf.d

+ 16 - 0
tests/configs/ssl-invalid.cfg

@@ -0,0 +1,16 @@
+disable_syslog=1
+debug=0
+
+log_file=logs/ssl-invalid.log
+pid_file=run/nrpe.pid
+
+server_port=40321
+server_address=0.0.0.0
+allowed_hosts=127.0.0.0/24,::1
+
+ssl_cacert_file=configs/certs/missing.crt
+ssl_cert_file=configs/certs/other.crt
+ssl_privatekey_file=configs/certs/nrpe.key
+ssl_logging=0xff
+
+ssl_version=TLSv1.1

+ 16 - 0
tests/configs/ssl-invalid2.cfg

@@ -0,0 +1,16 @@
+disable_syslog=1
+debug=0
+
+log_file=logs/ssl-invalid.log
+pid_file=run/nrpe.pid
+
+server_port=40321
+server_address=0.0.0.0
+allowed_hosts=127.0.0.0/24,::1
+
+ssl_cacert_file=configs/certs/other.crt
+ssl_cert_file=configs/certs/other.crt
+ssl_privatekey_file=configs/certs/nrpe.key
+ssl_logging=0xff
+
+ssl_version=TLSv1.1+

+ 16 - 0
tests/configs/ssl-invalid3.cfg

@@ -0,0 +1,16 @@
+disable_syslog=1
+debug=0
+
+log_file=logs/ssl-invalid.log
+pid_file=run/nrpe.pid
+
+server_port=40321
+server_address=0.0.0.0
+allowed_hosts=127.0.0.0/24,::1
+
+ssl_cacert_file=configs/certs/other.crt
+ssl_cert_file=configs/certs/empty.crt
+ssl_privatekey_file=configs/certs/nrpe.key
+ssl_logging=0xff
+
+ssl_version=TLSv1.2

+ 16 - 0
tests/configs/ssl-invalid4.cfg

@@ -0,0 +1,16 @@
+disable_syslog=1
+debug=0
+
+log_file=logs/ssl-invalid.log
+pid_file=run/nrpe.pid
+
+server_port=40321
+server_address=0.0.0.0
+allowed_hosts=127.0.0.0/24,::1
+
+ssl_cacert_file=configs/certs/other.crt
+ssl_cert_file=configs/certs/other.crt
+ssl_privatekey_file=configs/certs/missing.key
+ssl_logging=0xff
+
+ssl_version=TLSv1.3

+ 20 - 0
tests/configs/ssl-invalid5.cfg

@@ -0,0 +1,20 @@
+disable_syslog=1
+debug=0
+
+log_file=logs/ssl-invalid.log
+pid_file=run/nrpe.pid
+
+server_port=40321
+server_address=0.0.0.0
+allowed_hosts=127.0.0.0/24,::1
+
+ssl_cacert_file=configs/certs/other.crt
+ssl_cert_file=configs/certs/other.crt
+ssl_privatekey_file=configs/certs/other.key
+ssl_logging=0xff
+
+ssl_version=TLSv1.3+
+
+ssl_cipher_list=THIS_IS_INVALID
+ssl_use_adh=0
+

+ 42 - 0
tests/configs/ssl.cfg

@@ -0,0 +1,42 @@
+disable_syslog=1
+debug=1
+
+log_file=logs/ssl.log
+pid_file=run/nrpe.pid
+
+server_port=40321
+#server_address=127.0.0.1
+server_address=0.0.0.0
+allowed_hosts=127.0.0.0/24,::1
+
+dont_blame_nrpe=0
+allow_bash_command_substitution=0
+
+max_commands=10
+command_timeout=5
+connection_timeout=10
+
+ssl_version=SSLv3
+ssl_version=SSLv3+
+ssl_version=TLSv1
+ssl_version=TLSv1+
+ssl_version=TLSv1.1
+ssl_version=TLSv1.1+
+ssl_version=TLSv1.2
+ssl_version=TLSv1.2+
+ssl_version=TLSv1.3
+ssl_version=TLSv1.3+
+
+ssl_version=TLSv1.2+
+ssl_cipher_list=EECDH+AESGCM:EDH+AESGCM
+
+ssl_cacert_file=configs/certs/nrpe.crt
+ssl_cert_file=configs/certs/nrpe.crt
+ssl_privatekey_file=configs/certs/nrpe.key
+ssl_client_certs=1
+#ssl_use_adh=1
+ssl_logging=0xff
+ssl_shutdown_timeout=10
+
+include=misc.cfg
+include_dir=configs/conf.d

+ 2 - 0
tests/misc.cfg.in

@@ -0,0 +1,2 @@
+nrpe_user=@nrpe_user@
+nrpe_group=@nrpe_group@

+ 296 - 0
tests/nrpe.pm

@@ -0,0 +1,296 @@
+package nrpe;
+use strict;
+use warnings;
+
+require Exporter;
+
+use Digest::CRC qw( crc32 );
+use IO::Socket;
+use IO::Socket::SSL;
+use Socket;
+use Test::More;
+
+our @ISA= qw( Exporter );
+
+# these CAN be exported.
+our @EXPORT_OK = qw( check_if_port_available check_if_ipv6_available supports_ssl
+        switch_config_file launch_daemon restart_daemon kill_daemon ensure_daemon_running
+        send_request send_and_wait_for_timeout is_response isnt_response
+        STATE_OK STATE_WARNING STATE_CRITICAL STATE_UNKNOWN
+        $nrpe $checknrpe );
+
+# these are exported by default.
+our @EXPORT = qw( check_if_port_available check_if_ipv6_available supports_ssl
+        switch_config_file launch_daemon restart_daemon kill_daemon ensure_daemon_running
+        send_request send_and_wait_for_timeout is_response isnt_response
+        STATE_OK STATE_WARNING STATE_CRITICAL STATE_UNKNOWN
+        $nrpe $checknrpe );
+
+defined($ARGV[0]) or die "Usage: $0 <top build dir>";
+
+my $top_builddir = $ARGV[0]; # shift @ARGV;
+our $nrpe = "$top_builddir/src/nrpe";
+our $checknrpe = "$top_builddir/src/check_nrpe --disable-syslog";
+#our $checknrpe = "valgrind --leak-check=full --log-file=logs/valgrind-check-%p.log $top_builddir/src/check_nrpe --disable-syslog";
+my $nrpe_pid = 0;
+
+use constant {
+    STATE_UNKNOWN => 3 << 8,
+    STATE_CRITICAL => 2 << 8,
+    STATE_WARNING => 1 << 8,
+    STATE_OK => 0 << 8,
+};
+
+$SIG{INT}  = \&signal_handler;
+$SIG{TERM} = \&signal_handler;
+
+sub read_pid {
+    open my $fh, '<', "run/nrpe.pid" or return 0;
+    chomp( my $pid = <$fh> );
+    return $pid
+}
+
+sub check_connection {
+    if (socket(my $s, AF_INET, SOCK_STREAM, Socket::IPPROTO_TCP)) {
+        my $a = connect($s, pack_sockaddr_in(40321, inet_aton("127.0.0.1")));
+        close $s;
+        return 1 if defined $a;
+    }
+    if (socket(my $s, AF_INET6, SOCK_STREAM, Socket::IPPROTO_TCP)) {
+        my $a = connect($s, pack_sockaddr_in6(40321, Socket::inet_pton(AF_INET6, "::1")));
+        close $s;
+        return 1 if defined $a;
+    }
+    return 0;
+}
+
+sub check_if_ipv6_available {
+    socket(my $s, AF_INET6, SOCK_STREAM, Socket::IPPROTO_TCP) || return 0;
+    return 1;
+}
+
+sub check_if_port_available {
+    BAIL_OUT('Something is already listening on our port 40321') if check_connection();
+}
+
+sub switch_config_file {
+    my $filename = shift @_;
+    unlink 'nrpe.cfg';
+    symlink($filename, 'nrpe.cfg') || BAIL_OUT('Unable to update config symlink');
+}
+
+sub wait_for_daemon {
+    my $counter = 0;
+    while (!check_connection() && $counter < 15) {
+        sleep(1);
+        $counter++;
+    }
+    diag("Waiting $counter seconds for daemon") if $counter > 7;
+}
+
+sub launch_daemon {
+    my @output = `$nrpe --daemon --dont-chdir --config nrpe.cfg`;
+#    my @output = `valgrind --leak-check=full --show-leak-kinds=all --log-file=logs/valgrind-%p.log $nrpe --daemon --dont-chdir --config nrpe.cfg`;
+    my $pid = 0;
+
+    my $counter = 0;
+    while ( ($pid = read_pid()) == 0 && $counter < 10) {
+        sleep(1);
+        $counter++;
+    }
+    diag(@output);
+    BAIL_OUT('Unable to get nrpe daemon pid') if $pid == 0;
+    note("started daemon on $pid");
+    $nrpe_pid = $pid;
+
+    wait_for_daemon();
+    return $pid
+}
+
+sub ensure_daemon_running {
+    my $pid = read_pid() || BAIL_OUT('daemon is not running');
+    kill 0, $pid || BAIL_OUT('daemon is not running');
+    $nrpe_pid = $pid;
+}
+
+sub restart_daemon {
+    if ($nrpe_pid > 0) {
+        note("restarting daemon on $nrpe_pid");
+        kill 'HUP', $nrpe_pid;
+        sleep(1);
+        wait_for_daemon();
+    } else {
+        diag('pid for nrpe daemon unknown');
+    }
+    return 0;
+}
+
+sub kill_daemon {
+    if ($nrpe_pid > 0) {
+        note("killing daemon on $nrpe_pid");
+        kill 'TERM', $nrpe_pid;
+        $nrpe_pid = 0;
+        sleep(1);
+    }
+    return 0;
+}
+
+sub supports_ssl {
+    my @output = `$nrpe --help`;
+    return grep(m'^SSL/TLS Available', @output);
+}
+
+################################################################################
+
+sub send_request {
+    my (%arg) = (
+        'host' => 'localhost',
+        'port' => 5666,
+        'version' => 4,
+        'type' => 1,
+        'crc' => 1,
+        'command' => '_NRPE_CHECK',
+        'length' => 0,
+        'ssl' => 1,
+        @_
+    );
+
+    my $client;
+    my $buffer;
+
+    if ($arg{'ssl'}) {
+        $client = IO::Socket::SSL->new(
+            PeerHost => $arg{'host'},
+            PeerPort => $arg{'port'},
+            SSL_verify_mode => SSL_VERIFY_NONE,
+        ) or diag("error=$!, ssl_error=$SSL_ERROR") and return ();
+    } else {
+        $client = IO::Socket->new(
+            Domain => AF_INET,
+            Type => SOCK_STREAM,
+            proto => 'tcp',
+            PeerHost => $arg{'host'},
+            PeerPort => $arg{'port'},
+        ) or diag("error=$!") and return ();
+    }
+
+    if ($arg{'version'} == 2) {
+        $buffer = pack('n!n!N!n! Z[1024] x![N]', $arg{'version'}, $arg{'type'}, 0, 0, $arg{'command'} );
+    } else {
+        $buffer = pack('n!n!N!n! n!N!/Z', $arg{'version'}, $arg{'type'}, 0, 0, 0, $arg{'command'} );
+    }
+
+    if ($arg{'crc'} == 1) {
+        my $d = pack('N!', crc32($buffer));
+        substr($buffer, 4, 4, $d);
+    }
+
+    if ($arg{'length'} > 0) {
+        $buffer = $buffer . "\0" x $arg{'length'};
+    } elsif ($arg{'length'} < 0) {
+        $buffer = substr($buffer, 0, $arg{'length'});
+    }
+
+#    diag(length($buffer), " - ", unpack("H*", $buffer), "\n");
+
+    print $client $buffer;
+    my $response = <$client>;
+
+    if ($arg{'version'} == 2 && defined $response) {
+        if (length($response) != 1036) {
+            $response .= <$client>;
+        }
+    }
+
+    $client->close();
+
+    return () if ! defined $response;
+
+    if ($arg{'version'} == 2) {
+        return unpack('n!n!N!n! Z[1024]', $response);
+    }
+    return unpack('n!n!N!n! x[n] N!/Z', $response);
+}
+
+sub send_and_wait_for_timeout {
+    my ($buffer, $name) = @_;
+    my (%arg) = (
+        'timeout' => 10,
+        @_
+    );
+
+    SKIP: {
+        my $client = IO::Socket::SSL->new(
+                PeerHost => 'localhost',
+                PeerPort => 40321,
+                SSL_verify_mode => SSL_VERIFY_NONE,
+            ) || skip 'failed create socket', 2;
+
+        my $sel = IO::Select->new( $client );
+        print $client $buffer;
+        my $start = time();
+
+        # SSL/TLS can have readable frames even though the server hasn't sent any data
+        # We need to look for read letting us know the server closed the socket.
+        $client->blocking(0);
+        my $n;
+        for (0..20) {
+            $sel->can_read(15);
+            $n = sysread($client, my $buf, 1);
+            if (defined $n and $n <= 0) {
+                last;
+            }
+        }
+        my $end = time();
+        $client->close();
+
+        is($n, 0, "$name - disconnected");
+        if ($arg{'timeout'} == 0) {
+            # We're actually looking for an immediate abort
+            cmp_ok($end - $start, '<=', 1, "$name - abort");
+        } else {
+            cmp_ok($end - $start, '>=', $arg{'timeout'}, "$name - timeout");
+        }
+    }
+}
+
+
+sub is_response {
+    my $response = shift;
+    my $name = shift;
+    my (%arg) = (
+        'version' => 4,
+        'like' => qr/NRPE v.*/,
+        @_
+    );
+
+    subtest "$name" => sub {
+        plan tests => 5;
+        is(@$response, 5, "$name count");
+
+        my ($ver, $type, $crc, $result, $text) = @$response;
+        is($ver, $arg{'version'}, "$name - is v$arg{'version'}");
+        is($type, 2, "$name - is response");
+        is($result, STATE_OK, "$name - result");
+        like($text, $arg{'like'}, "$name - text");
+    };
+}
+
+sub isnt_response {
+    my $response = shift;
+    my $name = shift;
+
+    is(@$response, 0, "$name");
+}
+
+################################################################################
+
+#END {
+#    kill_daemon();
+#}
+
+sub signal_handler {
+    kill_daemon();
+}
+
+1;