From 77077b7b3b33b117384c7bcaf73d839777ae638c Mon Sep 17 00:00:00 2001
From: davidely <davidely@localhost>
Date: Thu, 03 May 2007 20:13:58 +0000
Subject: [PATCH] This is a checkin for Issue #311 "CRYPT Storage Scheme Support". This code was contributed externally by java.net user bdamm.
---
opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordStorageSchemeTestCase.java | 120 +
opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CryptPasswordStorageSchemeTestCase.java | 67
opends/src/server/org/opends/server/extensions/CryptPasswordStorageScheme.java | 314 +++
opends/tests/unit-tests-testng/resource/password-with-all-crypt-salts.txt | 4096 +++++++++++++++++++++++++++++++++++++++++++++
opends/src/server/org/opends/server/util/Crypt.java | 490 +++++
opends/resource/config/config.ldif | 7
opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java | 67
opends/src/server/org/opends/server/extensions/ExtensionsConstants.java | 8
opends/tests/unit-tests-testng/src/server/org/opends/server/util/TestCrypt.java | 281 +++
9 files changed, 5,447 insertions(+), 3 deletions(-)
diff --git a/opends/resource/config/config.ldif b/opends/resource/config/config.ldif
index 6fa3c52..9f0df6d 100644
--- a/opends/resource/config/config.ldif
+++ b/opends/resource/config/config.ldif
@@ -1085,6 +1085,13 @@
ds-cfg-password-storage-scheme-class: org.opends.server.extensions.SHA1PasswordStorageScheme
ds-cfg-password-storage-scheme-enabled: true
+dn: cn=CRYPT,cn=Password Storage Schemes,cn=config
+objectClass: top
+objectClass: ds-cfg-password-storage-scheme
+cn: CRYPT
+ds-cfg-password-storage-scheme-class: org.opends.server.extensions.CryptPasswordStorageScheme
+ds-cfg-password-storage-scheme-enabled: true
+
dn: cn=Password Validators,cn=config
objectClass: top
objectClass: ds-cfg-branch
diff --git a/opends/src/server/org/opends/server/extensions/CryptPasswordStorageScheme.java b/opends/src/server/org/opends/server/extensions/CryptPasswordStorageScheme.java
new file mode 100644
index 0000000..82ec8c2
--- /dev/null
+++ b/opends/src/server/org/opends/server/extensions/CryptPasswordStorageScheme.java
@@ -0,0 +1,314 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+package org.opends.server.extensions;
+
+
+
+import static org.opends.server.extensions.ExtensionsConstants.*;
+import static org.opends.server.messages.ExtensionsMessages.*;
+import static org.opends.server.messages.MessageHandler.getMessage;
+import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
+
+import java.util.Arrays;
+import java.util.Random;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.opends.server.api.PasswordStorageScheme;
+import org.opends.server.config.ConfigException;
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.types.ByteString;
+import org.opends.server.types.ByteStringFactory;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
+import org.opends.server.types.ResultCode;
+import org.opends.server.util.Crypt;
+import org.opends.server.admin.std.server.PasswordStorageSchemeCfg;
+
+
+/**
+ * This class defines a Directory Server password storage scheme based on the
+ * UNIX Crypt algorithm. This is a legacy one-way digest algorithm
+ * intended only for situations where passwords have not yet been
+ * updated to modern hashes such as SHA-1 and friends. This
+ * implementation does perform weak salting, which means that it is more
+ * vulnerable to dictionary attacks than schemes with larger salts.
+ */
+public class CryptPasswordStorageScheme
+ extends PasswordStorageScheme
+{
+ /**
+ * The fully-qualified name of this class for debugging purposes.
+ */
+ private static final String CLASS_NAME =
+ "org.opends.server.extensions.CryptPasswordStorageScheme";
+
+ /**
+ * An array of values that can be used to create salt characters
+ * when encoding new crypt hashes.
+ * */
+ private static final byte[] SALT_CHARS =
+ ("./0123456789abcdefghijklmnopqrstuvwxyz"
+ +"ABCDEFGHIJKLMNOPQRSTUVWXYZ").getBytes();
+
+ private final Random randomSaltIndex = new Random();
+ private final ReentrantLock saltLock = new ReentrantLock();
+ private final Crypt crypt = new Crypt();
+
+ /**
+ * Creates a new instance of this password storage scheme. Note that no
+ * initialization should be performed here, as all initialization should be
+ * done in the <CODE>initializePasswordStorageScheme</CODE> method.
+ */
+ public CryptPasswordStorageScheme()
+ {
+ super();
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public void initializePasswordStorageScheme(
+ PasswordStorageSchemeCfg configuration)
+ throws ConfigException, InitializationException {
+ // Nothing to configure
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public String getStorageSchemeName()
+ {
+ return STORAGE_SCHEME_NAME_CRYPT;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public ByteString encodePassword(ByteString plaintext)
+ throws DirectoryException
+ {
+
+ byte[] digestBytes;
+
+ try
+ {
+ digestBytes = crypt.crypt(plaintext.value(), randomSalt());
+ }
+ catch (Exception e)
+ {
+ int msgID = MSGID_PWSCHEME_CANNOT_ENCODE_PASSWORD;
+ String message = getMessage(msgID, CLASS_NAME,
+ stackTraceToSingleLineString(e));
+
+ throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
+ message, msgID, e);
+ }
+
+ return ByteStringFactory.create(digestBytes);
+ }
+
+
+ /**
+ * Return a random 2-byte salt.
+ *
+ * @return a random 2-byte salt
+ */
+ private byte[] randomSalt() {
+ saltLock.lock();
+
+ try {
+ byte[] salt = new byte[2];
+ int sb1 = randomSaltIndex.nextInt(SALT_CHARS.length);
+ int sb2 = randomSaltIndex.nextInt(SALT_CHARS.length);
+ salt[0] = SALT_CHARS[sb1];
+ salt[1] = SALT_CHARS[sb2];
+
+ return salt;
+ } finally {
+ saltLock.unlock();
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public ByteString encodePasswordWithScheme(ByteString plaintext)
+ throws DirectoryException
+ {
+ StringBuilder buffer =
+ new StringBuilder(STORAGE_SCHEME_NAME_CRYPT.length()+12);
+ buffer.append('{');
+ buffer.append(STORAGE_SCHEME_NAME_CRYPT);
+ buffer.append('}');
+
+ buffer.append(encodePassword(plaintext));
+
+ return ByteStringFactory.create(buffer.toString());
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public boolean passwordMatches(ByteString plaintextPassword,
+ ByteString storedPassword)
+ {
+ byte[] storedPWDigestBytes = storedPassword.value();
+
+ byte[] userPWDigestBytes;
+ try
+ {
+ // The salt is stored as the first two bytes of the storedPassword
+ // value, and crypt.crypt() only looks at the first two bytes, so
+ // we can pass it in directly.
+ byte[] salt = storedPWDigestBytes;
+
+ userPWDigestBytes = crypt.crypt(plaintextPassword.value(), salt);
+ }
+ catch (Exception e)
+ {
+ return false;
+ }
+
+ return Arrays.equals(userPWDigestBytes, storedPWDigestBytes);
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public boolean supportsAuthPasswordSyntax()
+ {
+ // This storage scheme does not support the authentication password syntax.
+ return false;
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public ByteString encodeAuthPassword(ByteString plaintext)
+ throws DirectoryException
+ {
+ int msgID = MSGID_PWSCHEME_DOES_NOT_SUPPORT_AUTH_PASSWORD;
+ String message = getMessage(msgID, getStorageSchemeName());
+ throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message,
+ msgID);
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public boolean authPasswordMatches(ByteString plaintextPassword,
+ String authInfo, String authValue)
+ {
+ // This storage scheme does not support the authentication password syntax.
+ return false;
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public boolean isReversible()
+ {
+ return false;
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public ByteString getPlaintextValue(ByteString storedPassword)
+ throws DirectoryException
+ {
+ int msgID = MSGID_PWSCHEME_NOT_REVERSIBLE;
+ String message = getMessage(msgID, STORAGE_SCHEME_NAME_CRYPT);
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
+ msgID);
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public ByteString getAuthPasswordPlaintextValue(String authInfo,
+ String authValue)
+ throws DirectoryException
+ {
+ int msgID = MSGID_PWSCHEME_DOES_NOT_SUPPORT_AUTH_PASSWORD;
+ String message = getMessage(msgID, getStorageSchemeName());
+ throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message,
+ msgID);
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public boolean isStorageSchemeSecure()
+ {
+ // FIXME:
+ // Technically, this isn't quite in keeping with the original spirit of
+ // this method, since the point was to determine whether the scheme could
+ // be trivially reversed. I'm not sure I would put crypt into that
+ // category, but it's certainly a lot more vulnerable to lookup tables
+ // than most other algorithms. I'd say we can keep it this way for now,
+ // but it might be something to reconsider later.
+ //
+ // Currently, this method is unused. However, the intended purpose is
+ // eventually for use in issue #321, where we could do things like prevent
+ // even authorized users from seeing the password value over an insecure
+ // connection if it isn't considered secure.
+
+ return false;
+ }
+}
diff --git a/opends/src/server/org/opends/server/extensions/ExtensionsConstants.java b/opends/src/server/org/opends/server/extensions/ExtensionsConstants.java
index 29dd7e4..2aaac17 100644
--- a/opends/src/server/org/opends/server/extensions/ExtensionsConstants.java
+++ b/opends/src/server/org/opends/server/extensions/ExtensionsConstants.java
@@ -191,6 +191,14 @@
/**
+ * The password storage scheme name that will be used for passwords stored in
+ * a UNIX crypt representation.
+ */
+ public static final String STORAGE_SCHEME_NAME_CRYPT = "CRYPT";
+
+
+
+ /**
* The string that will appear before the name of the password storage scheme
* in an encoded password.
*/
diff --git a/opends/src/server/org/opends/server/util/Crypt.java b/opends/src/server/org/opends/server/util/Crypt.java
new file mode 100644
index 0000000..01c7923
--- /dev/null
+++ b/opends/src/server/org/opends/server/util/Crypt.java
@@ -0,0 +1,490 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984,1988 AT&T */
+/* All Rights Reserved */
+package org.opends.server.util;
+
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * UNIX Crypt cipher, ported from the Sun OpenSolaris project.
+ * */
+public class Crypt
+{
+
+ /* LINTLIBRARY */
+ /*
+ * This program implements the Proposed Federal Information Processing Data
+ * Encryption Standard. See Federal Register, March 17, 1975 (40FR12134)
+ */
+
+ /*
+ * Initial permutation,
+ */
+ private static final byte IP[] =
+ { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20,
+ 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57,
+ 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37,
+ 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7, };
+
+ /*
+ * Final permutation, FP = IP^(-1)
+ */
+ private static final byte FP[] =
+ { 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23,
+ 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36,
+ 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10,
+ 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25, };
+
+ /*
+ * Permuted-choice 1 from the key bits to yield C and D. Note that bits
+ * 8,16... are left out: They are intended for a parity check.
+ */
+ private static final byte PC1_C[] =
+ { 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
+ 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, };
+
+ private static final byte PC1_D[] =
+ { 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
+ 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4, };
+
+ /*
+ * Sequence of shifts used for the key schedule.
+ */
+ private static final byte shifts[] =
+ { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, };
+
+ /*
+ * Permuted-choice 2, to pick out the bits from the CD array that generate the
+ * key schedule.
+ */
+ private static final int PC2_C[] =
+ { 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19,
+ 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, };
+
+ private static final byte PC2_D[] =
+ { 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44,
+ 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32, };
+
+ /**
+ * Container for many variables altered throughout the encryption process.
+ * */
+ private static class SubCrypt
+ {
+ /*
+ * The C and D arrays used to calculate the key schedule.
+ */
+ int _C[] = new int[28];
+
+ int _D[] = new int[28];
+
+ /*
+ * The key schedule. Generated from the key.
+ */
+ int _KS[][] = new int[16][48];
+
+ /*
+ * The E bit-selection table.
+ */
+ int _E[] = new int[48];
+
+ /*
+ * The current block, divided into 2 halves.
+ */
+ int _L[] = new int[32];
+
+ int _R[] = new int[32];
+
+ int _tempL[] = new int[32];
+
+ int _f[] = new int[32];
+
+ /*
+ * The combination of the key and the input, before selection.
+ */
+ int _preS[] = new int[48];
+
+ /*
+ * Temps for crypt
+ */
+ int _ablock[] = new int[66];
+
+ int _iobuf[] = new int[16];
+ }
+
+ private final SubCrypt _crypt;
+
+ /**
+ * Constructor.
+ */
+ public Crypt() {
+ _crypt = new SubCrypt();
+
+ for (int i = 0; i < _crypt._E.length; i++)
+ _crypt._E[i] = e[i];
+ }
+
+
+ /**
+ * Sets up the key schedule from the key.
+ */
+ private void setkey(int[] key)
+ {
+ int i, j, k;
+ int t;
+ SubCrypt _c = _crypt;
+
+ /*
+ * if (_c == null) { _cryptinit(); _c = __crypt; }
+ */
+ /*
+ * First, generate C and D by permuting the key. The low order bit of each
+ * 8-bit char is not used, so C and D are only 28 bits apiece.
+ */
+ for (i = 0; i < 28; i++)
+ {
+ _c._C[i] = key[PC1_C[i] - 1];
+ _c._D[i] = key[PC1_D[i] - 1];
+ }
+ /*
+ * To generate Ki, rotate C and D according to schedule and pick up a
+ * permutation using PC2.
+ */
+ for (i = 0; i < 16; i++)
+ {
+ /*
+ * rotate.
+ */
+ for (k = 0; k < shifts[i]; k++)
+ {
+ t = _c._C[0];
+ for (j = 0; j < 28 - 1; j++)
+ _c._C[j] = _c._C[j + 1];
+ _c._C[27] = t;
+ t = _c._D[0];
+ for (j = 0; j < 28 - 1; j++)
+ _c._D[j] = _c._D[j + 1];
+ _c._D[27] = t;
+ }
+ /*
+ * get Ki. Note C and D are concatenated.
+ */
+ for (j = 0; j < 24; j++)
+ {
+ _c._KS[i][j] = _c._C[PC2_C[j] - 1];
+ _c._KS[i][j + 24] = _c._D[PC2_D[j] - 28 - 1];
+ }
+ }
+ }
+
+ /*
+ * The E bit-selection table.
+ */
+ private static final byte e[] =
+ { 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12,
+ 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24,
+ 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1, };
+
+ /*
+ * The 8 selection functions. For some reason, they give a 0-origin index,
+ * unlike everything else.
+ */
+ private static final int S[][] =
+ {
+ { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14,
+ 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12,
+ 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 },
+
+ {
+ 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2,
+ 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12,
+ 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 },
+
+ {
+ 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4,
+ 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2,
+ 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 },
+
+ {
+ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6,
+ 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1,
+ 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 },
+
+ {
+ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, 12, 4,
+ 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12,
+ 5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 },
+
+ {
+ 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, 7,
+ 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4,
+ 10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 },
+
+ {
+ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9,
+ 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6,
+ 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 },
+
+ {
+ 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, 10,
+ 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10,
+ 13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 }
+ };
+
+ /*
+ * P is a permutation on the selected combination of the current L and key.
+ */
+ private static final int P[] =
+ { 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31,
+ 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25, };
+
+ /**
+ * Encrypts a block in place.
+ */
+ private final void encrypt(int block[], int edflag)
+ {
+ int i, ii;
+ int t, j, k;
+ SubCrypt _c = _crypt;
+
+ int a = 0;
+
+ /*
+ * First, permute the bits in the input
+ */
+ for (j = 0; j < 64; j++)
+ {
+ a = IP[j] - 1;
+ int b = block[a];
+ if (j <= 31)
+ _c._L[j] = b;
+ else
+ _c._R[j - 32] = b;
+
+ }
+ /*
+ * Perform an encryption operation 16 times.
+ */
+ for (ii = 0; ii < 16; ii++)
+ {
+ /*
+ * Set direction
+ */
+ if (edflag != 0)
+ {
+ i = 15 - ii;
+ }
+ else
+ {
+ i = ii;
+ }
+ /*
+ * Save the R array, which will be the new L.
+ */
+ for (j = 0; j < 32; j++)
+ _c._tempL[j] = _c._R[j];
+ /*
+ * Expand R to 48 bits using the E selector; exclusive-or with the current
+ * key bits.
+ */
+ for (j = 0; j < 48; j++)
+ _c._preS[j] = _c._R[_c._E[j] - 1] ^ _c._KS[i][j];
+ /*
+ * The pre-select bits are now considered in 8 groups of 6 bits each. The
+ * 8 selection functions map these 6-bit quantities into 4-bit quantities
+ * and the results permuted to make an f(R, K). The indexing into the
+ * selection functions is peculiar; it could be simplified by rewriting
+ * the tables.
+ */
+ for (j = 0; j < 8; j++)
+ {
+ t = 6 * j;
+ k = S[j][(_c._preS[t + 0] << 5) + (_c._preS[t + 1] << 3)
+ + (_c._preS[t + 2] << 2) + (_c._preS[t + 3] << 1)
+ + (_c._preS[t + 4] << 0) + (_c._preS[t + 5] << 4)];
+ t = 4 * j;
+ _c._f[t + 0] = (k >> 3) & 01;
+ _c._f[t + 1] = (k >> 2) & 01;
+ _c._f[t + 2] = (k >> 1) & 01;
+ _c._f[t + 3] = (k >> 0) & 01;
+ }
+ /*
+ * The new R is L ^ f(R, K). The f here has to be permuted first, though.
+ */
+ for (j = 0; j < 32; j++)
+ _c._R[j] = _c._L[j] ^ _c._f[P[j] - 1];
+ /*
+ * Finally, the new L (the original R) is copied back.
+ */
+ for (j = 0; j < 32; j++)
+ _c._L[j] = _c._tempL[j];
+ }
+ /*
+ * The output L and R are reversed.
+ */
+ for (j = 0; j < 32; j++)
+ {
+ t = _c._L[j];
+ _c._L[j] = _c._R[j];
+ _c._R[j] = t;
+ }
+ /*
+ * The final output gets the inverse permutation of the very original.
+ */
+ for (j = 0; j < 64; j++)
+ {
+ int iv = FP[j] - 1;
+ a = (iv <= 31) ? _c._L[iv] : _c._R[iv - 32];
+ block[j] = a;
+ }
+ }
+
+ private ReentrantLock digestLock = new ReentrantLock();
+
+ /**
+ * Encode the supplied password in unix crypt form with the provided
+ * salt.
+ *
+ * @param pw A password to encode.
+ * @param salt A salt array of any size, of which only the first
+ * 2 bytes will be considered.
+ * @return A trimmed array
+ *
+ * */
+ public byte[] crypt(byte[] pw, byte[] salt)
+ {
+ digestLock.lock();
+ int[] r;
+ try
+ {
+ r = _crypt(pw, salt);
+ }
+ finally
+ {
+ digestLock.unlock();
+ }
+
+ //TODO: crypt always returns same size array? So don't mess
+ // around calculating the number of zeros at the end.
+
+ // The _crypt algorithm pads the
+ // result block with zeros; we need to
+ // copy the array into a byte string,
+ // but without these zeros.
+ int zeroCount = 0;
+ for (int i = r.length - 1; i >= 0; --i)
+ {
+ if (r[i] == 0)
+ {
+ ++zeroCount;
+ }
+ else
+ {
+ // Zeros can only occur at the end
+ // of the block.
+ break;
+ }
+ }
+ byte[] b = new byte[r.length - zeroCount];
+
+ // Convert to byte
+ for (int i = 0; i < b.length; ++i)
+ {
+ b[i] = (byte) r[i];
+ }
+ return b;
+ }
+
+ private int[] _crypt(byte[] pw, byte[] salt)
+ {
+ int i, j, c, n;
+ int temp;
+ SubCrypt _c = _crypt;
+
+ for (i = 0; i < 66; i++)
+ _c._ablock[i] = 0;
+ for (i = 0, n = 0; n < pw.length && i < 64; n++)
+ {
+ c = pw[n];
+ for (j = 0; j < 7; j++, i++)
+ _c._ablock[i] = (c >> (6 - j)) & 01;
+ i++;
+ }
+
+ setkey(_c._ablock);
+
+ for (i = 0; i < 66; i++)
+ _c._ablock[i] = 0;
+
+ for (i = 0; i < 48; i++)
+ _c._E[i] = e[i];
+
+ for (i = 0; i < 2; i++)
+ {
+ c = salt[i];
+ _c._iobuf[i] = c;
+ if (c > 'Z') c -= 6;
+ if (c > '9') c -= 7;
+ c -= '.';
+ for (j = 0; j < 6; j++)
+ {
+ if (((c >> j) & 01) != 0)
+ {
+ temp = _c._E[6 * i + j];
+ _c._E[6 * i + j] = _c._E[6 * i + j + 24];
+ _c._E[6 * i + j + 24] = temp;
+ }
+ }
+ }
+
+ for (i = 0; i < 25; i++)
+ encrypt(_c._ablock, 0);
+
+ for (i = 0; i < 11; i++)
+ {
+ c = 0;
+ for (j = 0; j < 6; j++)
+ {
+ c <<= 1;
+ c |= _c._ablock[6 * i + j];
+ }
+ c += '.';
+ if (c > '9') c += 7;
+ if (c > 'Z') c += 6;
+ _c._iobuf[i + 2] = c;
+ }
+ _c._iobuf[i + 2] = 0;
+ if (_c._iobuf[1] == 0) _c._iobuf[1] = _c._iobuf[0];
+ return (_c._iobuf);
+ }
+}
+
diff --git a/opends/tests/unit-tests-testng/resource/password-with-all-crypt-salts.txt b/opends/tests/unit-tests-testng/resource/password-with-all-crypt-salts.txt
new file mode 100644
index 0000000..63b5a05
--- /dev/null
+++ b/opends/tests/unit-tests-testng/resource/password-with-all-crypt-salts.txt
@@ -0,0 +1,4096 @@
+..UZoIyj/Hy/c
+./xZjzHv5vzVE
+.0HDTuSCs5FOM
+.1d2n7Q0.r54s
+.2SXu7evaw9i.
+.3.5KLo9Y3YKk
+.4iUlD8gUQ.EM
+.5vvFjbkJCcrk
+.6FMi11BJFsAc
+.7YZO9BUfZmCU
+.8bypXUuL9p6o
+.9jqBP29IK9ok
+.a/xezhRLXhMk
+.b7PchEsXm/cM
+.cRdaWRGut07.
+.dYbx9qIxmBp6
+.exxf7yu9PNgg
+.fBPfla6uyn6o
+.gdhNJZLxkRS2
+.hsJbHuo7bAIQ
+.ivuQ2UBBOjZo
+.jgUSmANNkjM6
+.k5cwiK41NuEs
+.l2mmP7/.rW1U
+.mC7LOYOiR7uQ
+.ns47OlibXX0k
+.or370OV2C9N.
+.palL6D4PXVw6
+.qgQfvjMZWEek
+.rJKqL5hJ7w3Y
+.s7MwPHi9zXWc
+.tKd6Y.u958kE
+.uYPFKR1BvE0g
+.vi7vWrvjHRsc
+.wVTHlRY03U8U
+.xhiaPBQ9CMCI
+.yfv66TsQxojE
+.zs/E.NK2vwFs
+.AmxnZgFyr3vw
+.Bt77HtmlecrE
+.CdsUSVZsK7x6
+.DU/KBgTSTelc
+.E31i0Mm5/Ri.
+.Fy1dFl2z7cxI
+.GDJxqz1Ipii6
+.HfPUJhMXHr2A
+.IyFVhWFAbGvs
+.J5oI5oxD/dzY
+.K890kMytxy7.
+.LVXfEzR88P32
+.Mkl9Av4.FjsY
+.NpSv2yzfTVfE
+.OHFGqpeoa9CQ
+.P4EGKZl43aBk
+.Q7kADsEJ1WMI
+.RkDISPQTFoMA
+.SXStyU8byNW.
+.T09OA7ZVcUWk
+.USr4ePZMKA2k
+.VeFd7l2M2wmY
+.W57FZhV52w0s
+.XL3SG10t5ziQ
+.YzKrGwUvJwKU
+.Z8W7.SsrA6UU
+/.iTV2iP8pLgs
+//TIk/siaNpyQ
+/0qEvA/.5nt3g
+/14NJkTxUcjN6
+/2NC5BmFQYLzg
+/30CzdRBX9H.M
+/4gQ26nLrGw8.
+/5L0cR/wpFqSA
+/6wuHM3K6IPEA
+/7p1sdsKQV1ic
+/8dug.ZgyJyQs
+/9qua3Q0m0i3o
+/aniJcNTVAtd6
+/bAAUvSJcCwC2
+/cJC3f0ijUMIo
+/dhmY3lqSZmlg
+/eHRmp0dgMGAM
+/fil87yecM2X2
+/g7ePDOgwUsio
+/hoffG6YzYaIA
+/iTePe9w2IVww
+/jNSbCQVj1eiM
+/kVk78tmDSZ9s
+/lhgHLR06S.KA
+/m2kzf0chqyUY
+/nEK8sernWlSk
+/o9Sh9q9wWT1o
+/pEbvxEX3/iOQ
+/qJXDE0LVznrs
+/rk50dY865yJg
+/sKmvniPkD.hM
+/tenCXPLmrw62
+/uuE/9xtJJxo6
+/vEg2rI.PQcLE
+/w9qtoF4qJK0I
+/xXh7uUnFvuXg
+/ySVg4VoaA78c
+/z6v4ggF15ct.
+/AjPUkohQR39E
+/B0UUMAtR7mKo
+/CoLDtnWWkUfc
+/DLg8oelujUQg
+/E6.D2DwyIqU.
+/FA4UHhSibUYQ
+/GqdM3MS1KsuE
+/H1NmcAQmFIKo
+/IQkdtfhwFjW2
+/JvXlKBr1Ury2
+/KmmrL8n7ELxw
+/LPRbs.c/dDyE
+/MVimZJZBKJkw
+/NKJz6uCEBaoU
+/OEQUZ..bQI1s
+/Pqm/joo9CZus
+/QdUEXVnyv1d2
+/RoNdWgKE.ofg
+/S0sB9HOFeI3w
+/TMpI/3VZkfkY
+/UcADnpH5woa6
+/V2M4UTTDXEtY
+/W3LhyGA0N1cg
+/XvUn0J7foCgQ
+/Y3E6HhJv4pOs
+/ZU9ss0WcLwmE
+0.gpJcVSk0pto
+0/LuKncaZwTSQ
+00xQPHYlVDIw6
+01vokOibos3pg
+02yd6IWnPes66
+03dgZm5nZvqOc
+04aqostCGmvZM
+05FdoegP8UniQ
+06RVN8sVedRc2
+07cRVFoK7BCWE
+08P0iBjffmX0.
+09OAkv5TeWC7c
+0aZ1TxxdySiTg
+0b.TScr57nt7.
+0cXIQc8RDl.Rg
+0dcjn4jmx9L8w
+0eM.zrfiCD1OM
+0fh3vXJhFAOnI
+0gQGh6s51P/Y.
+0hRlJJTVR.rp6
+0i/33gdHI1.HM
+0jj2d2inc0Rxw
+0kIhA6zme3ao.
+0lrNHVmD.VNXM
+0mtYQ5X0S21VQ
+0n0LLS2sPIn.w
+0oGOrdLW1LoH6
+0pF2M.FIukAWo
+0qKv75kPWbFlo
+0r8.JEPr4Vokw
+0sqzDS6URBCog
+0tD4oGA08bBGA
+0uZ9KZUDtAfbE
+0viexUGurHjYM
+0wG86SNyWCbP6
+0x.c17KaOERyE
+0y4sZUszNap06
+0zxvuOgu5gWZg
+0A2hXM1rXbYgo
+0BsFTMbDK8jNA
+0Cg6yfuc4LL5I
+0DGYTSK0hIqEs
+0EM39We1Pzzas
+0F2eEwn9Ap2ew
+0GqY/uFx/.0Nc
+0Hf71zW8/F.aw
+0IBrnHh2hY6qM
+0JA8Rlsc0VKxI
+0KX2XksjZ9Yss
+0LBAhK6hnnmlc
+0M9CvDYjHe51M
+0N5Od4BqvwPKY
+0OPIUY48CQPM.
+0PwNHnFrxedsI
+0QbZTr0YoOBHg
+0R1tv3BIv7kRM
+0SI2sc.2Ssa62
+0TeS.zsNkQgBI
+0UaeBJ7jQ1nag
+0VVR5/81ivDRc
+0WMdk/ven8bok
+0X1TBswiBl8Pc
+0Y6g0wpCeQeUY
+0ZnHNZp9Qgm5g
+1.s7aoXaH7NEs
+1/sWcHqdfBK3A
+10xCP/g3c1sQc
+11fzdpvsGNKVI
+12CsGd8FRcMSM
+13tuGn7XXnAgQ
+14q74X93x5onY
+15y8hPKSuXZ6A
+16X9hePcNOujk
+17nbzie3Q8fLw
+18cTuMgi.ymhk
+19WaRorEQRWEs
+1abtv8E0hkEd6
+1bj32kdC1y4DU
+1ctQh2ii5y4.U
+1dVzQK99LSks6
+1eX0ut9CkJEi2
+1fhyk8FHD6yMg
+1gEzL8hQxaQNU
+1hZxInB.IRI/A
+1icyN5YThjOeM
+1jY9Nb2TWC6vg
+1ka4c7ob8kSDY
+1lBVM0/fM8rqk
+1mFITlwHsY9FM
+1n8yP3zTQg5nM
+1oCs2Y6GOzDm2
+1pnXSiWD1qn1A
+1qvftlsa29t6M
+1rp3zJGxrJ0hM
+1sh3MD6zSSl9w
+1tLsHKvdW.YVA
+1uzxePrZlNtp6
+1vOdy4h/v5T5Y
+1wyw8y52s5cuw
+1xu2pRucEDj.A
+1yaALWyHPgpCc
+1zx90gShZ8tVk
+1A9LThrJxiRmY
+1B3Faek0VjLvI
+1CG6dodF/ngg.
+1DD2oUwBzywy6
+1EWXvqbvr4rx2
+1F.5OTsRVjwLo
+1GljjFYPj.8ls
+1Hbtndp18CiFc
+1IsEKk1JjAT1s
+1JefVZClEkUZ6
+1K1lQUQFhOHI2
+1LKn95AnPR0BA
+1MXLZ7HqN6kT2
+1NvnhIrZtvnSg
+1O7y0RxvSDFv.
+1PTv0CG61i7Zw
+1QgEC2nyKFh6g
+1Rzz3v0SaxF42
+1SGlaIK43qL1A
+1TIQBdk2hkUhY
+1UFXOewqPXBHg
+1VtPY6HsBcsl.
+1WMMN6ATdRvjU
+1XSZXaWVy4MGA
+1YrYl2/nnZcvo
+1ZqyAl6RCMtJE
+2.eT/SXrEPV3E
+2/b3T0YK9.h/E
+20ewVEw7R2GAw
+21v9u3DXFIkpM
+22ChHEI62UiCA
+23TPVefOt0YPE
+247SSw8klbYoU
+25ZQPYWNQ4grM
+26ebxVBqeGFnQ
+27cykc0Tn2IY2
+28cgLvBVGfj8c
+29oMrLEDUSNFI
+2aA6O8FCvWCBU
+2b1bQKsl4ChLA
+2coWaGErdoogI
+2d/SWwLlVvQEE
+2e6EW/cpsCaDU
+2fmLLcoHXuQdI
+2gGD7ABvamxLg
+2h7tTgoNJ8Ivc
+2i0cW4dv7XCOc
+2jsqRhYHmdZDU
+2kRYD4J4z88yM
+2lrTlR/pWPUOQ
+2mCAypFtxblY6
+2nsJS1VQngsUo
+2oEhwANk1HZl2
+2p2FwdUgSowvk
+2qfZnoB6Qnj8o
+2rqD36Ri6hN/k
+2s4Y4FCv6dN.6
+2twTC9GOemxxo
+2u71Zsr5pXhMQ
+2vUX9v84RIzjc
+2wV/2MxEHEuy.
+2xl9t7MvXTnc.
+2yaRBjJqCJHKI
+2z/hJwsmIcTi2
+2AZ1KrbPqjOiA
+2B8snfnpg7tj.
+2Cjp8iV2IOuCA
+2Dj5i9ZC2rUMc
+2EtHk7FyD0THc
+2FWd4ES2dwmpM
+2GgGlbu/jxsu6
+2HW51zTN93I9Y
+2IqYJSbGV5YwI
+2JbLWKVIsXq.k
+2KR2zoiwn1EeQ
+2LotBgA9JpF/g
+2MJ6ZviUO5vCo
+2NxrZ.7rLk4mQ
+2OsmcH4G2VIpc
+2PGMRrokWDxnc
+2QV9xHAz4K2wE
+2Ru.36j8SESu6
+2ShMn6VLN3xsg
+2Te6hv5GiOmMc
+2UJ0V.qLEBPNg
+2VBztfcg54DN6
+2WWChImYY4/BY
+2XEAWGp2FeGgg
+2YEk.JFnEwHso
+2Z/JdMJsMWKOw
+3.4DHmhmr7csQ
+3/H1Ec7SRPVQA
+30dJVEURUeYJc
+31sEHfiAcXqSM
+32qjML0Qsbo8o
+33vEBoYZKHqV.
+34LjcDtcW0s0o
+35Ll2Q1/BozcQ
+36Tg28kLEXjMs
+37gwvIkM6gnJE
+38GB3fsjfwH7Y
+39ujvZR3H44SQ
+3adoYQzsR3lG6
+3bvgjyl7UxQhs
+3csRb5hc4vxMs
+3d.3IJOVBaz6g
+3ePSVjTiAVcpE
+3fkeuNNCcreu.
+3gcQCH.iIFgO.
+3h2Wu9Fl0c4v.
+3iy3/i4AN2YR6
+3jlDTcijbrgbQ
+3kbQdZ/VrM8ic
+3lOJEIin2rb8U
+3mqRbMzzdNS2o
+3nnpsSQWOWKG.
+3orMDy42Bd9OM
+3p6gwHD97nSYg
+3q9ri8KbyjptE
+3rwpKJjxq.Bh2
+3sManO.eXd1FM
+3t7l0XSh1tS32
+3uKbvvp/xsWlc
+3vmP6BKWDs9oo
+3wSZL7LArdlTo
+3x3Kp/SC/xkvo
+3yMxXQF3ASnWA
+3zklK5iQsx.C2
+3AtuKxSnkEKW6
+3B3JkXwTZn1T2
+3Cjq/9y4PFjWc
+3DzXOadH8UNRg
+3E14fZA/Q9asM
+3FqgIJWu55Xd.
+3G5/H31peci.o
+3HrDrz3IAILDk
+3IsHW/j5uSYgE
+3JrkCY.wKz02k
+3KY.T2Dp1nVG6
+3LKnI1MWyIW.s
+3M5exdls0QYS.
+3NptLSpJeCm4Q
+3Oa3gNcb4B7vM
+3PRgdmuBBIsxs
+3Q/N05j8/BYyY
+3R5IIodqQtR/I
+3Sz9NNwqQExGs
+3T7xDvJRSmX1M
+3U6GxZSGmKPGA
+3VE/9m1v35rTE
+3WSO4ErvrG3Pc
+3Xa1UoayHIu0A
+3YzEmdhmGUKww
+3ZRwflCiReE.2
+4.KXcO/zxYa3s
+4/WzpaAcD4IXw
+40EQinNC6Or/.
+41Y1OjTmLEWto
+428quTPELwvuA
+43eEPdlpnUmb6
+44E/qORekFV0E
+45X0h1uT9HvTw
+46NwyXgy5iOAo
+47amUs3AWvq5A
+487B7PE1LM7KQ
+4967GySWBBDZA
+4a3gehcFpLH5Y
+4bV2gKtZ0Whys
+4ciedZDH5FisE
+4dYjgXswso9zM
+4eRAf99.jxAlE
+4fSaNO9Lh4WPU
+4gT4SFlqv8oe2
+4hIiQ//Jcpp1o
+4inq6EdrlAHMA
+4jBpaq57i0l2s
+4kE4xN/ZbI4fU
+4lrSXTTfFadFo
+4mS7AKv2wbNSI
+4nwpbYhg6W8qM
+4opD.aVPSx6kw
+4pfrpG.XZ5PPQ
+4qAkbqYBIfwg6
+4rjSPhw3O/xpE
+4stmrH6AKE27g
+4tQSEW3lEnOio
+4u1vomyhU362s
+4vjXe011Rb9po
+4wXGe5hU4Xs2I
+4xoxyWMY1yHJ.
+4yhkuErAZNbt.
+4zXwW3XhZpvX2
+4AUsbL2rrOIk6
+4Btn/bWAT/9Mo
+4C0AV7tw2yGfw
+4DlHbGwWEnVv.
+4EVC.j8qDBvC2
+4FJRGBg9ZS/a6
+4Gu/q2xKwBQsQ
+4HQGUTmeuEGg.
+4I2UZHk7gvx3M
+4J9B2frNqc13.
+4K87bRHQHulu.
+4LLEY0pfBlRe.
+4MeiHU2QR7Ys6
+4NzFiNh.QZheI
+4OOc1OWbXei.k
+4Py4ttQiGGxo.
+4Q0S28fjNPoCg
+4R.P5VFF95vd6
+4SbUx.wZwoZQ2
+4ToYSJnKagDxQ
+4UgEmwE4keZRA
+4VMzyk7LGHRIk
+4WGlJlWr2XoJM
+4XInfSAhgU2Dk
+4YknlGInWZLt.
+4ZM81/MSYPQnY
+5.eH8r4qZODFA
+5/bGXjqHMkBi6
+50q.zrL5e0Sak
+51CbcBM13fOMo
+52lMw8K6okfFg
+53yR2D7fDrXCg
+54zglH2/twp/U
+55CeGsfZ1M932
+56pW4LejHHxl2
+57pK2EK2Kjgos
+584/8.WnbtLH.
+59zE6QwGByDHk
+5amJPpbbCTnEM
+5b7g7wGuHHc2w
+5cABS/.XryhAk
+5dMVAAguoRx/g
+5eztZv70OT2Ho
+5fjgIzboD2FrE
+5gS2X2DcpaSLE
+5hWS3T5ZAtULQ
+5iE01modGKEkI
+5jUlmhgiDw1MA
+5kHN6ivYZiXF.
+5l9rexsCEl7Lw
+5mjt285eHeODc
+5nyqNXKG3a5hs
+5ojK096ARd6jg
+5pL9un687fPQo
+5q4A5rDd9GdxM
+5rqRR7fNi3Kzo
+5syDgBLL/Bmss
+5tj4005buQvVg
+5ufORmDyb7Krc
+5vJdcOIV6TbH6
+5wnIpo3O7yD4E
+5xJ1CTQXFIBjY
+5yE50Zf2Dqg2o
+5zpSpEtBDZlgc
+5AVkROAPEExQE
+5BgGwXwSFs9AU
+5CEi8UeLk2uMY
+5DhmeVK5kjUbI
+5Eq1eOfEy5M0g
+5FyKdxW4oSrqQ
+5GcXGDHmFpzPg
+5HZI0K0mA4zdE
+5ImJi73Qou7lc
+5Jj.NQmEx7mSI
+5Kyx9fJc7317o
+5LWr3nItuzLWo
+5ML62.JIJ/NcQ
+5NNAt5W5Xrex2
+5OkhN2nLxMfEY
+5PnXicxCk/KPk
+5Q/g8qSiVAkyo
+5RmDJuSfVdrXk
+5SgbQrnmD3yHg
+5TFaDaSTs15Hg
+5UBsW0A43cEvs
+5VwMztKnd9XvQ
+5WFWnhTRgC64Y
+5XEIyNnK2z8UA
+5Yr783LYZJtcM
+5ZOYXRfHVZ7OY
+6.EzzMI2mNQjI
+6/5bVijEvjCzQ
+60lwxfC9Ln84g
+61khNRMuUn8X6
+62HNlw9/wMiMM
+63vs8BWNjMyIE
+64VfkYamEt2.Q
+65kKfJ.oFg1/Y
+66yGQHg8KA7jw
+67VCx.AXuQvSk
+68UDoGQi3hIJs
+69.j2j6Fc6IAU
+6am9tScjBkf36
+6bA8rypUEbjhs
+6cEo7fFtuCEVs
+6dsexxrKyO62w
+6ef0MSVG45YyQ
+6fd85kBwwCQE2
+6g8fRXiMEwg0Y
+6hlUeQAiu/g/Q
+6i/tBgpEPXYf6
+6j50ZucDoRYV6
+6kPgJ56CFBaq6
+6lfKjVFkmtLNc
+6mZBqEknTRjJM
+6n6aGMpx4qsx2
+6oWLg3lDxZEvc
+6p1pGQCxQ7CsQ
+6qs9wy8aNfoKQ
+6rKXEwLNbIiSw
+6sZYtymZbGO1s
+6tLHKrfBDCb3.
+6uKqmzaVxgt.s
+6vtXeslj0MvC.
+6wckwW.DHilNQ
+6xbr4ljohQlHU
+6ynhJRFhnQvYM
+6zJ9F0m7XQYbQ
+6Agv/sbFpHLWo
+6BP/Wjw88cz4k
+6CutqHkCJlarM
+6D4b8sup.zMZ.
+6ECsHjIcMzQ.Q
+6FeoJAzLGVKns
+6GNpuiI3/XtJs
+6HtV9D4KwcrgU
+6IqRvRbTp.F8I
+6Jo5LWmGqIDbE
+6Kobz3ZycIMck
+6L9Ed.DkkM20k
+6MOJJOFLXjuEU
+6NYGjYJ/Vtq4U
+6OmxleCtItszI
+6Pl2IfAX8M/oM
+6Qqs/MZUXmFBs
+6RDCAjs2EdnHE
+6SWfOuSYriKXU
+6TmlbxqZ2kBIA
+6Ucxaesk.9uKw
+6VhZohPEIIn4M
+6Wst2g4UePI62
+6XyX17CNkdy6Q
+6YDYHjdZQzujo
+6ZmV5nfCs/NTs
+7.4AyqnSWIzuM
+7/bDVXqnM2Zn6
+70FsGbn7KrNb6
+71wYhs3y.tvIc
+72w362BYLSqc.
+73o8ECeyEW3Y2
+74Afw8lruFEwg
+75gGIjHOI6Hmc
+76umD9fPv0k2g
+77TqDk5y5q3qk
+78wLefqCkd/rU
+79ZN8LKkeOTi6
+7aON9cCGKFFi.
+7bTdIH6Zdzuf2
+7cn8jGfWhqTy2
+7d6cXgmoyWT0U
+7eQhcyGmz9jeE
+7fPngA/15AVYc
+7gVEsFbimrIqw
+7hn51AXZJcLgA
+7i9KuNlPagxSM
+7jzjoVYlfbb/.
+7kui1zoXETHSY
+7lfPNnnglesp6
+7mCmhkS7JWyfU
+7nG38PNNND2.M
+7o0ppLxgDVmGc
+7pnoyta7lRz7M
+7qeFjndagetZk
+7rpABVh3LoKjE
+7s7ch0XPfnNds
+7tOJIQ3VtdKs2
+7u22I060joYR.
+7vKHcs0R9ASy.
+7wHwr8NZQN3B6
+7xMiU9e1UbhyA
+7y0rBxNyOI0JA
+7zrZgh1Ov6TOo
+7AqYam8tBLbFg
+7Be4KPx49znWo
+7CnclFvtPU7mI
+7Dpv3WBMxf..c
+7E/3wRVYs4zjU
+7FABKIOtV9cJg
+7GNHQNL7svIbg
+7HZXTmnj/97TM
+7Iva9sd4xuxTQ
+7JzRZgxuIFftc
+7KltmfWa4P0Mo
+7LcHNlquIG7Zo
+7MUPfzqdMsR/o
+7NoOCcGlagGMA
+7OHMql8YKdg6k
+7P6IlUlhKdKf2
+7QOWizOb8NlSc
+7Rji/2eFkS4Jc
+7Swq0kJA40JJs
+7TG2iZ/2eTuYs
+7UC5JYV/vDFpg
+7Vgkn5gzBRcZI
+7WyWyR4X1gRSI
+7X0OKkwZDuS/E
+7Y2osZHwJND8Y
+7Z4Zm6M3cT1g.
+8.LHXjPIUHotI
+8/ClIpkJrdD46
+80KN95Q9e5YXc
+81NcbiDsOm4v.
+82V510tchyt5M
+83qv92pCVqzk6
+840x4htlCWCjU
+85KSy0GVQDxYI
+86lR8NRhOuzXM
+87bgjPn4i4Aaw
+88z/l9bW5L5lM
+89o6CGGAwXwj6
+8aEiH10zBJ5aw
+8bk0SSzVY8H92
+8cCswLKLExELU
+8d5JMrXY/9kR.
+8edwuqwDDnTIw
+8fEs9PcGgF7oY
+8grE9Ucj1QAo2
+8hqMzzzX0C3z6
+8ir/hLYVdBjbk
+8jHpCD5eXWF3k
+8kn2LC4njrqL6
+8l.w7608JZJz6
+8m7UxPXfRw7/2
+8n.KnoqGMGISs
+8ocnelSJEoZWM
+8pzKaMxBTKq36
+8q2i5SFK.yp4U
+8rXnEvBBtcGwY
+8sEFNb3glOQTo
+8t2OIzQWORHSI
+8uCM/MXIrZIyk
+8vga8UiKwHHD.
+8wvdBhkcNFyqA
+8xwnckJzT4s3c
+8yI898v4dxYUk
+8zgBaY4I9UCTo
+8A1aUgKNVQ1mE
+8BG2aQDAdnuqg
+8CCMfWrAWOnH2
+8Dcm0qZ/iiwGk
+8EZaF5traZczw
+8FlyrN/W47ccI
+8GuUrchsYRQFU
+8HKzHAzQ4HldI
+8I/qeWO5UglCI
+8JYXriNQLRvrs
+8K.EZVQwHM/Ok
+8LYeX8rxFUu7s
+8MU9Dtqfm3VpU
+8NbrT44Shvnco
+8OqFqmjZ3HyEA
+8PnOi93dZ/pRQ
+8QRvjnvxOmISM
+8RmuIPIM6/jbw
+8ST6oO6ACuHbk
+8Te7NSNQOTkLE
+8UvwBSxtf3JXQ
+8VxdvznZY37zQ
+8WJ60l8wHJcK2
+8XY7WJ5KuiTCs
+8YC2dl57B7lqM
+8Z7GDTqavTtCk
+9.ccCdgR.77ws
+9/jR6Pjlc5.qY
+90hK45skpndt2
+91/eC84QzmvNk
+926G1Yo7GbhLM
+93ppdsLbmZTnU
+94SpfPEq9fac6
+956xkFuvbOmIw
+96WPTkzGTEPxw
+97t7k1nsyMcU6
+98iY4yUiTmhIE
+99ryZiYJu/1JE
+9aMglX4Bvvhfw
+9bwEGwfHym2jM
+9cMyY2QvDfW4Q
+9dYXEsbbKYCAU
+9ef.4CjzJgPqQ
+9f/.So4yoXKCE
+9g4PNnme8U/J6
+9hk6WyMf6ziaA
+9iPe90ALk79IA
+9jAqjfxZAqIMk
+9k9lTOz44eXUE
+9lWGMQmO4Eu1E
+9mRRw0srgeSiQ
+9nL8bmgcoY5HY
+9oPKQT9l38Xos
+9pW9wGmA2DDvc
+9qDh613MBGzrc
+9rIPoaKqAD1Po
+9sWiXl45HUO56
+9tcZ40/rdKRQk
+9uQbdAh9cyhZw
+9vPeMiCSVwSAM
+9w6iAhiYVZyJ6
+9x.dNJ8HINxFY
+9yx8ZzYPC8c6c
+9z3RNBnBoB0d6
+9AYl9JK28Uy02
+9BYyvew5JxOxY
+9CHchjUbz1RDU
+9DLVV3iUdyWiA
+9EX1keezbdDs2
+9FgzzIpxNepxM
+9Gwk.YquTjtPY
+9HPwExS9fRAxc
+9I06kE.hoPSW2
+9JFyUsIpQIh4I
+9K2sVu4POjcD6
+9L9.sYFyIsvEE
+9MXbowEbWILXI
+9N9D/nA5JJPMM
+9OJ2cklf81TWU
+9PfNy0O1z0O5g
+9QeLUGgvg7C8I
+9RIVltWzlpC0A
+9SuDfhDz3ll2U
+9TOWY5eftgZ5s
+9UMPWkLSQnXOM
+9VuPL5UF0N7lg
+9W/T2n21TI./.
+9XXD4trGYeGJA
+9Y07C8TySTfws
+9ZannrMrxnYUo
+a.Av8awQ0AsR6
+a/jnaC0CnEjXA
+a09mPwXifImcU
+a1Ve8Cgz9o7Bc
+a2MEKOIcmCijA
+a3kDUCoB00OaQ
+a4sLkn7C9GP12
+a5tPhn96BI7cI
+a6Q7dXXzwkivs
+a7NZDJAHCF5tc
+a8dzXozHYPd32
+a9CJ6HTSDXmf.
+aajfMKNH1hTm2
+abJnggxhB/yWI
+acBxUIBkuWIZE
+advwtv/9yU5yQ
+aeC10Dk/ExaG.
+afIQXjgrJ/D/M
+agnyWpMHmK1Tw
+ah/RaYcrGdZBY
+aix9wHfQrZRF6
+ajbWPXHBdEi.M
+akIqCme4NC.vg
+alHzjf8HTh5Mc
+amszwK2bfx.2U
+ansgBMFkfptE6
+aoGMnFHzfE.q6
+apGl30xzHaZxE
+aqLHSkrbhfU1.
+ar2jDWNsfCiWM
+as1ozOtJW9BFA
+at05n2JEUfXYI
+auYCUPgS0kJzQ
+avDMOnwont4ng
+awfZA7yDE5TH6
+axlzTXQMBoDwY
+aylR1sao2D.mE
+azoV33FJ2h3AA
+aAD/MIIgrI6mY
+aBkxK6be58viM
+aCTw3DHnVQOf6
+aDA3cCyLTSxeA
+aEF8pWWu5KtbQ
+aFCrgM0Gi2Cnw
+aG0LEL4gR0chI
+aHEuEaybn35SM
+aIUrpmAkTrnUk
+aJ.dSxFC0.BeQ
+aKy8AiCS8Sqlo
+aLaiiRKIS5nTc
+aMd4hvSiL1HJw
+aNXazlD26h86Q
+aOwaCP5w2Cj7Y
+aPy1Fc2ZNq.pA
+aQ0ZM64DG78KQ
+aRoWwFbQFh0ic
+aSP2C8UUWnxjA
+aTT8T/Jp38KSM
+aUGp9FHREqBpc
+aV.WJepiThMVI
+aWDuA3X3H.mc2
+aXTQseVVcEuLQ
+aYR9BD427nQlE
+aZO.bsx1kSpeE
+b.c7metWuFrUk
+b/H9oCjm1DxnE
+b0o2bXUkLkroU
+b1JpfiYo3IKo6
+b2YUoYX2JpSKY
+b3GPOfRG/2TAc
+b4Zagq1r5YJrU
+b5R8K8YXZaSq2
+b6tQV4YRkO3SE
+b7Qu39waDsM0w
+b875JseN8LA3k
+b9Bk7lyydRdiA
+ba5RwAwihj/nA
+bbv4NvUbQpMC2
+bcKeJseCHD6T2
+bdNnXV1FRilKM
+be2zFcJOdW7rQ
+bf1VWZNWQC8lw
+bgbsI02AIPby.
+bhxbjb.9jCNjs
+bi2wsSekmG6Yw
+bjXEt9oineRw2
+bki6qu1.bBWvk
+blah8dOpgxm.Q
+bmwh2k./spDdY
+bnE.UtZePZX8E
+boCXLU4aKrJ0Y
+bp.Ps6ns8vEDM
+bqtUeFi94GD/c
+br7QH37oXbKf6
+bs4y6rbCz/rW.
+btjTpZWJR/jaY
+buzCApcFHwKQc
+bv.m6GgYys86o
+bwgiHF9KZgWts
+bxlJF9JC7Shec
+byZVEt7uxSt8U
+bzDF20A25SorQ
+bAWrXFTOqBZps
+bBl5uAaNgugfg
+bCz7Mn/tYvf/s
+bD7V5wvyz9Vr6
+bE0PcaLZZnXlE
+bFx/nLU.rL2jc
+bGVh02xkuGli2
+bHzSM.UYsBrSs
+bIsoEXpW41pRk
+bJp9zEfYf8DKo
+bKsVRCOOK12Nc
+bLHwvU24Pc0nc
+bM4YgOgEjy.B2
+bN2AIeK00P9HQ
+bO55YDzYeSDeQ
+bP/XCcAzIKmUQ
+bQn2B67NGAO.c
+bRl4gqjrKM1nc
+bSwt3Mbd/B8a.
+bTlpBEF.95H/A
+bU.4L348IhKzA
+bVAw/UBlOTJ1U
+bWi.EijoZI6Yo
+bXya8tTNYSMVk
+bYZu3LPHc2WT2
+bZMfmHD5uJ3l6
+c.gVrEYFACZTQ
+c/2NcFodMUjnk
+c0sfExoldnsHU
+c1MxnjACNOiU.
+c2M87q...WWcU
+c3/PUesPUFG3s
+c4/BlNkh.Uhno
+c5T6w9P9jUEjw
+c6uM5NYM8sFSA
+c7mrQOkwU6U4U
+c87MS797DGOAY
+c97O6.0tGAp6.
+caskSSqUyjjzQ
+cbg8tn3SVszY2
+cc8z1Jo8eBXaw
+cdlRbNJGImptk
+ceDx/cy5D.nug
+cfPj7wshUzWD6
+cgqsar6SukNOE
+chvQ7Ow41U4RU
+ciyK8KO1WeiMQ
+cjuABtahLxdOk
+cktdrL5zz4sW.
+clWzbbBDUYi2Q
+cmqsU72G6oElw
+cnyYJBhnUi0f6
+cojkMmMifD5s6
+cpxIvyZrmsrLY
+cqw1qGL9p2NH.
+crSyFJbF4jCi2
+cs.ksmyNQa78Y
+ctmNrZ7a6zlUA
+cu0Z.Gv10NZPg
+cvu/RSU.jEq1U
+cw5O/ZsT/P2ro
+cxDPiimzY/mzs
+cyyWnDQ8wHbdQ
+czsZ/pRY.JVU2
+cAQlR9mfD3t0k
+cBFULLgGDCU9k
+cC7T9jrS4.Sxw
+cDRpdxPmHpzS.
+cE7mDnxQyFQtA
+cFYhj5kevy2jc
+cGyUX9QugYMgE
+cHJ3DBc2Y4Oj6
+cI1bPtS1BLRK.
+cJOjDZRXobRDc
+cKS6VFCpP7Bis
+cLIbDfXXdpjhA
+cMp.xbQMBaTNQ
+cNa.ziI6AGZCQ
+cOzhTqcdF2C7g
+cPmyh4wFDQ9xg
+cQ.n/ipzQCRYg
+cRKqQrC63eCmA
+cSdn4BsBFfzLQ
+cT.XiBbpZABpo
+cU8wlmPVKHazs
+cVwubkuIfcQ0c
+cWScE1jpkonjE
+cXP73YiReDjxg
+cY8D5Z5ZOhg1.
+cZnN8S9JO7O/I
+d.C1i7NUvKrew
+d/ngdmVnk94R6
+d0.72R/F48arg
+d1jvrbTQL5Zao
+d2y.JiDpktezs
+d3YfA9zDkFgS6
+d4bNcN.8pwoSg
+d5cBqcImSPGQU
+d6tAJazxJcnuo
+d7ZBtytXbhWME
+d8bny9xqDGvHc
+d9W9V1o1pFu9M
+da.w8zGvAlTcI
+db7hQSj/j3XTE
+dcMaXZtEZyAAI
+ddIObUcGgKq3c
+deQcvEr1PRPSM
+dfkNrxMRtYtGA
+dg2Mzo7WXL1Dw
+dhOM/dcYcCOjc
+dik16QI1A0azA
+dj0oljRC9X9Pw
+dkT.cLhc8hyJw
+dlKRxT2FoZOYA
+dm4Suf.s8qYUM
+dn42HBlgeACDU
+doLuh4A.LvjhQ
+dpqt5n0ubfpb6
+dqXpS4iYsIPI.
+drVNyY9t9Haq.
+dsxL0xGR5CHME
+dtyBdquRkPl8w
+duvpKvKu7t/PM
+dvQpkBh1vAOyI
+dwTQmFzNJnLwI
+dxLzJa.bBhHT2
+dyTdq1Q5htuuI
+dzsCRO5i5CDpM
+dAhxgtDqfiGls
+dBQ84XeUtwxWs
+dCfjgvjx.jvsg
+dDuwPDugL/5q2
+dEwTa0YLbUfuA
+dFNK6nQz23Tnw
+dGB2kr8CdpeZ2
+dHKfU6EfQymeY
+dIix/YXS4pJJk
+dJ4/E3.7RkvSU
+dKsw26jNk2CCE
+dL0GU02VpDZYE
+dMPfG7vdo8u1I
+dNQmxZbDJyHZI
+dOewO.u0fCroQ
+dP0h3v69E7LPA
+dQYg9L7wnvdP6
+dRCtCEMsFRnA2
+dS33YM3jgCwmY
+dTTsGDkA5ZHKg
+dUNUkgA7r.Ixg
+dV5/d04.huqak
+dW7KRXLBfChYM
+dXRqewxP/Jito
+dYEQyCFhmLjUM
+dZ.VQUWW./Jd2
+e.vfplEAfVWjc
+e/cl5LNdAYHmI
+e04ELQEpmpmnw
+e1bWQa5GoloMQ
+e2hTH7L3f8w1E
+e31cxi/5zcG2.
+e4HQqdTIwT8x6
+e5G0QZvvWg8L2
+e6F2zW5aDGSkU
+e7TeJQnIq1l72
+e8KEJPpCeOYuU
+e9yasxGdJQXzc
+eaL0dOhJ7ObMw
+ebHLzNLXM8afc
+ecB9Q0xjW6h1g
+edxdodtnQKRMU
+eefN4bzMcHCfE
+efrwiZ7Ejg4GQ
+eg372BvpakOSI
+ehlx92laL80TM
+ei.7.fxJ1Z2gY
+ej2QrbBRWjxDU
+ekFfXxv9iay5A
+elcfAk3ej.bXA
+emaDqnIPfsR7A
+enyL9hKoUVUsE
+eokuZG0E.5SfM
+epyYqY09AVNrE
+eqxZJhG/VvS6g
+erz0DZo6V0GUM
+esDhThbwWi.Dk
+etE.oxx1pL4bk
+eu4v3XZXvkFtk
+ev6veIlUQxnN6
+ew4pdU/Pb6JkI
+exzGTP76.NlS2
+ey2Dqqzeb29fE
+ezPXZFl8kpcQw
+eAIh2aA8W9Zxg
+eBvEABWc9G7ww
+eCv1DQR539J46
+eDFwa.I95QEKE
+eEBl05JXuAI4A
+eF2VP8ZAd0quc
+eGXQ.2NdBaLME
+eH.j0zIfa7U6w
+eII7jg73fHxQc
+eJL7mbBlf6rYs
+eKcvkT8aUFOoE
+eLh9x1r7U3Tzo
+eMsPV4rYyYQhE
+eNBO0nZMf3rWM
+eO3rzWPNjjZFo
+ePt9z1epWV/xY
+eQWwwPtahPfYA
+eRb7dhfBQDdUw
+eS5YZzH9C0M5E
+eTR15rPnyDKbM
+eUIWbnRbbBm2U
+eVpbhRfVtH1Uc
+eWrPXK48.KGn.
+eXCbyeeJC236A
+eYstG2a4e1vYc
+eZs4mEFLzDmhM
+f.mMEVhc3gSsQ
+f/oADtnozbr9s
+f0RH.QcjR4BvQ
+f1oVLzVIfCq86
+f2XdpbOJVCydQ
+f3GYSBiVW/IiQ
+f4tzRe73iJh06
+f5ZiGJqsURdnI
+f6c2ywaUipPgY
+f7KRLvD2Vo2Ao
+f8WKv7llm6hKA
+f9/VJbrAZOuoU
+fa/EWzNDWaxOY
+fbJALqb8h3Tkw
+fcNOjt/Wbe6EM
+fdgbEcORaNaQI
+feAYwEmSE6.pQ
+ffELa3xRAtT8.
+fgpQ0Pn6vFNWY
+fh7KCLQvbXD.o
+fi1IpG9ta02N.
+fjTcjcqUuwLNQ
+fkGlm21zY7AhM
+flswn17zbAsRI
+fmu/JuQs55ofs
+fnJcazAFegQms
+fozeF63JKKVKg
+fpfkyOiibtg8w
+fqv6JcxGHa3vs
+frmw3hal/BVcU
+fs2LVb4XK39hs
+ftjwz3/kqvc5.
+fuNA9szthqt2k
+fv6WWK8ZYdGtU
+fwRcuHMICeu9Q
+fx/Jch6iGztHk
+fyxVDtI3ywDUI
+fzY8vXeBBBPJA
+fA8HQ5zWzV.fM
+fB9YSkV5y8TyE
+fCe0c.ZLU/2Qs
+fDL2YHIbCTt6E
+fEbV2wEuwn3Us
+fFx7mPtJZynW.
+fG/o.vy1ko46E
+fHJKCeMpMhl/E
+fI3TrpNwUM8vE
+fJI0B/.5iObm.
+fKVEK3hRz/fcU
+fLAn4rTpYk1pk
+fMvCqKhGHBf1w
+fNOaY0OVh2.Cs
+fOSy4gkiceAkw
+fPTSLTxRP1G.M
+fQ0ATTLVpFKV6
+fR/R9xVCowV2w
+fSYJIzkUy66LI
+fTH5iShR4xbeU
+fUrFCWlp6xE1E
+fVTeJSBfG9wzA
+fWxJKqojfp99g
+fX8nlNkZKX/5M
+fYhoNiwSrhAkY
+fZ.F.g41my5Jc
+g.U7YF0bfpImc
+g/AoLv0JlsZMs
+g0Ghz9661OxcM
+g1mucM68K5Ses
+g2t0HmdCrK4fQ
+g3DJmbf.JDKGY
+g4TiqJWr0M4VA
+g5aRcn.GwrLpo
+g6hTHI.2o.Rw.
+g79kb9.uPjmEg
+g8PPh2vCWGdqc
+g9arnunLKqBxQ
+gaobrBilklkzU
+gbesFy9c2V.3s
+gcXKacGDyqbt2
+gd6TEO7jj3geU
+geiaiFKbLXTCg
+gfhNiM/5vtxA.
+gghLWWW84dl4U
+ghwZAKbC0Hozc
+giNt9gx.e9.Iw
+gjMduICe0NlPk
+gk4ydF8lssAkM
+glw6VUXJ3k1Gw
+gmDfKxIws/RLE
+gnwi00H36KT7s
+goBU.g71fjk6Y
+gpGXz5y0xpjPU
+gqwba1sQATGW2
+grIjHwSlIizo2
+gsR2LS7KAyeHc
+gtwmNme7pKRxc
+guXGgZuC4qvHw
+gv8pL7Szzy0t2
+gw0a.ihrf1LrE
+gx7mcEXp5dUgs
+gya0oJigklgQ6
+gzVPrnhc2MuBU
+gAk0/u3R3rZO.
+gBPCT0f/iVLoU
+gCogu5jr3/dDY
+gDKuSixaoKfPk
+gE11KlH.AuuBY
+gFRbhU67JmrQQ
+gGnn0i1qDw9lU
+gHgqzwALjccFM
+gI/gzUSJ6JGkk
+gJe8cTci3JO6E
+gK5hT4chNF/72
+gLkUJzNO2czFw
+gMVCANZlvVoUk
+gNrjkysyT2/LM
+gOOjKXXSstMkc
+gPXRwrh3nIipA
+gQLWzYAqmaxbA
+gRGu1.pCojE8s
+gSmwDpIUD6g4Y
+gTWRQe42.Dtx.
+gUVan2v6QkNA.
+gV5MpIjISCtqc
+gWWyLh3BX6.UU
+gXZ4cELs31ju.
+gYSzfkyr2p5oQ
+gZC5d.SB8YzYE
+h.oOond1ahi8o
+h/53CzF66vQvM
+h09ND34BeVGY.
+h1UY2FiKkYaos
+h25kdsaNPrvjM
+h36oLLr8gTAvo
+h4aPpjkXXOa6U
+h5EjvIRjEyoA.
+h6fH94fAyaiZ2
+h7aMtfXX92zdA
+h8Tx7TiBAwYvg
+h9YmdNIlXVq7M
+ha.kzD90q26XQ
+hbCG/27dMwzGk
+hci7FggfLjg9c
+hdtkPGbH2G81U
+heulY8GuWihjw
+hfivt8iYDPpz.
+hgUZ6MimlnZVg
+hh41ku5mk8gto
+hi3NYkdFdGoO6
+hjEnaBHSVih/2
+hk8d4jwDT/wrs
+hltZDBoTHP/uA
+hmNjoJWFxoXJ2
+hnt46kj.tjWBI
+hojdttYiBqLIo
+hpTYl3Gtmu8BQ
+hqEOunsI7Isso
+hrjt/QAMcR89k
+hsejUhvD1YmNY
+htkUydZj6zdWc
+huChzsCEv4gok
+hvpzLef3roaQQ
+hwmlrIrg/EF6Q
+hxRAEHLrFdI02
+hyONnFjRN/9bM
+hzbrg6XKmdNq.
+hAAV..1ysNLN6
+hBV74OI/PUpPg
+hCXkzwoN0WoRs
+hDaDcb1/tHcSw
+hEJl4VYKC9zOM
+hFYoN5btrRID6
+hGFbDiMzkZAv2
+hHbcSkUv7q7kI
+hIiAZWk4oMoLA
+hJ05pek3gdqSg
+hKIKNqLnVYoNA
+hL8nrFDt0aJ3E
+hM/rwmGJERrtU
+hNlN3uQOf0Hyg
+hOTi1VRWL86fw
+hPfmr4tp9OlqM
+hQcfUWksuIAmk
+hR2q5Ts9v.oEs
+hSHR/6W1L62K.
+hT0Jb817PxrAU
+hUrhTDWCxDDGg
+hVY/ZvIxnluSY
+hWm1RflMLkQIk
+hXudZN8p5aLQ6
+hYOoeyS05JlLw
+hZZ6pLIgvmPB6
+i.2VmV8xdaIEA
+i/AYUx.6XMDtk
+i0ku3cZOgVxzg
+i1fzVS.kpHAm.
+i2Cxohk10RlZA
+i3PxV7KdOJTkc
+i4kRY.V3Y4/QA
+i5BdYag4epxGM
+i6urJOTthPvYU
+i71x.UPD4l6EM
+i8H78IFODZjpk
+i9oX8gKSX2wtQ
+iauHGhXgwlB42
+ibWEPMMsR.AJc
+icmqBaqZ.ZbBU
+idxCVvvshFuuA
+ieL4JGsSS/Ljo
+ifeLyo3ULzzgA
+igCMckcdzF3oQ
+ihb.Y/MBwipqA
+iin1Yh1VHskP.
+ij8tfUhriJeww
+ikvS3Ge.Kjqrk
+il00c.JgrJ1WE
+imncH6Dg/cAXg
+inJ9202tBPozQ
+io/1kJDAYW3d2
+ipNgs4Ag1NdmA
+iqiOg2uXWs75E
+ir10ESgqMMDcY
+is1LYO/kerx8I
+itqyL2r98KgLA
+iue5INyBHK3Jw
+ivG0nfXWf.S3w
+iwhBIpeNlXxFI
+ixSeu0g6nBeDU
+iyqvar1HqTJ/s
+izAFKEg1vapaA
+iAOzLjOdWEnMA
+iBP1OV5ViyfDU
+iCxZUP8J97/Ys
+iDv5E9QU93JEQ
+iELEXKaifSr4.
+iFrlxqg0Q6RQ6
+iG7UCbGEtwY8g
+iHRK8Irq5Id5k
+iIURS57gpDdWw
+iJ93pBGkhQch.
+iKXBrz5XqTOt6
+iLWIQVkBPUswQ
+iMWszQ5P/moH2
+iN/RktGWjRdYE
+iOLxNCuhroH2o
+iPjSBmGzuYEEo
+iQD2fBDupmMa2
+iR/ZqiMc8zRZo
+iSEP.V8v6xN8o
+iTQ0P1mt8dm0.
+iUFP8aosktZ36
+iVd7DEFu/gmNA
+iWxPL.dCA7EdY
+iXEEh0.tqa9uk
+iYcEbp3ijLyGc
+iZrGInJyXsfWk
+j.Xtb7RmMCs7s
+j/6fLhW7q9e2Y
+j0l5nBxARs2HM
+j1VX9ZUbZmGL2
+j2mUI5qvBzpIU
+j3U1YNz.hXxrA
+j4Wqjd5LlY4T.
+j5/mv27LGHqU2
+j6PS4h4lWPWww
+j7SpMBcZZRZq6
+j87H9Yys40s1g
+j9lnvqjAuhNJs
+jaQIrJHXk0jzA
+jbWD0KWcl41fo
+jcH4WL16dRpJQ
+jd.eR1vZNPkNU
+je5/ATIGzeDQw
+jfqLZRqFyAlZc
+jgb5MWcT7AYc2
+jhsHN6MxSWbU.
+jikzo/HRLvnYk
+jjq.FiuIZ/B7s
+jk8hmgXpd5E5Y
+jlBppIXY/BZMA
+jm6xq/ss1VW7I
+jnnGobRdq7f7o
+jobbj4Fd7EAng
+jpAYTv9xRJoyw
+jqL.5MxALl/vY
+jra.Wd90KKM.s
+jsDV7LmqrN0L6
+jtUgHrkoCgKsk
+juSDXF1qhxlQM
+jvdW/t1qVzB.g
+jwSamN1gljMBA
+jxL/.JluAItDA
+jyqZkMg4/wixk
+jz31SYcSNezUA
+jAIGLgQ4DijAc
+jBfgvsMeCXKXU
+jCnBGraYXCZKQ
+jDPhFt6d3XPgo
+jENc1djIaLmyw
+jFHnfLBmVJICA
+jGgSIOvkIcPEI
+jHPzHMGInzy1.
+jICe3DlEUpIwQ
+jJTufADM1DBMQ
+jKuL5U0tqueio
+jLlOWp2Qkiroc
+jMYdr45TExLwo
+jNg1LIGQM.8hU
+jONC2cvPL00x.
+jPMyKMyDvqe4.
+jQ6RxF3rJ3zq.
+jRlgfrjACzG6Y
+jSSGnUXRNnt3U
+jTCaqQl5ld9aQ
+jUhlZmWtkCm/o
+jVMGlMVBayu/.
+jWAyE2tHU5EUk
+jXYRQGGEEiPZQ
+jY5lVv9PJN4DQ
+jZEgLoHAQM.Uw
+k.UTVSlTSqBoY
+k/69gy37G/JX.
+k0ASme0Qdarlw
+k18nM0E6BizDk
+k2ZAZbMvR/eOM
+k3MpvxZRJDE.w
+k4HQ2cthGFh4A
+k5wCAhtCrxtR.
+k6POIP5VEgHDA
+k7uEp71zdJ2u2
+k8A71rdOlP2Ds
+k9N3fCy9Ks7xs
+kaydDFz/k8NAw
+kbeMVnZM0oL7I
+kcYriND57b.vI
+kdLAldvghOv3k
+keZqlq1fzdLxY
+kfIF4H5ZRtQEQ
+kgN6jC4CVV7Rs
+kh0qphcijoOA2
+kis3dmAxk0f8E
+kjN6o5QbgB5C2
+kkdwIRQmgg2Jk
+klGDV42JhmAeM
+kmuMec40OCeOE
+knIoTSd6J5c52
+kog0WRPm0h0BQ
+kp2o7hoD.pkjk
+kqJuZ6bceVlxI
+krV9SH4H10LrI
+kso6CGl6FFimE
+ktsudxoI79bPk
+kuj3mYk.RCPfA
+kvDZ60kFpJ8cs
+kwzwe.fMQXsCU
+kxYRxp1j9zS0A
+kyc4qH7gL1KGc
+kzV3QDGeVacdc
+kAl1LstTGqhQ2
+kBsviRWaN8Y1.
+kCISOi.HYzx/E
+kD9DPZarGztdw
+kE2a.R6ciX582
+kFWfYZ9gO60Jw
+kGa25GAZVX1HE
+kHjNHXGflS2VE
+kI6oFWZHn9AJA
+kJs1GPxWtLet2
+kKI4PaPjeJIso
+kLR.S48T0D1tU
+kMAJL4yypa2HQ
+kNOriJINSqsZI
+kOu2N4WUR4B/2
+kPj.q84Ax1rrc
+kQZ5fcXEOn6sU
+kRCqfTDEsjJFo
+kSLwLSriCt5Co
+kT4S..19S3s0s
+kU/O5QeZM1vVE
+kVY9KP1SHbGN2
+kWfu6sWfWBxvQ
+kXNy33KIUIvII
+kYDtsEWNjtSwg
+kZgjjB87rZFV.
+l.eAapQhf0BqQ
+l/XMmsCFmgQgw
+l0MITrmACOqtQ
+l14aeXtphVSUg
+l2eNr.2J4AvwE
+l3vmImyenGFYg
+l4zVXeg.UTW26
+l5KfQR935b0sY
+l6m8HD0UETxVo
+l7JuE0D0ksnbY
+l8n2npozPB.sQ
+l9/p4Xg4PhJpw
+laxWBD552YBwQ
+lbyKDnZJsZpJM
+lcapiZ2v3vxYw
+ldClngwSjLd8E
+le3CAYy8yOKBA
+lf31YUy45bOrI
+lgAHTz.zbs4QY
+lhBdjyseX71zI
+liD9qG.4Rmvo2
+lj0xGbBuQNbKA
+lku7RuB1d71jY
+llGbCafZyLdEk
+lmUL57sjTc5DE
+lnEuADf6K/aX6
+lobwLmuIgWIHo
+lpf02L./2VtiU
+lqJyfZz8sW8bo
+lrVlwyKie6AW2
+lsBZ9nrN1dS/o
+ltYwF2A1uSCMg
+lul/tojKrjHbY
+lvc3v9fMA2uqE
+lwt.sO3a7aSN.
+lxYWq/KiySEjU
+ly9sHwcMHablg
+lziCC81heEV7Y
+lAz78bKJz90fg
+lBQH118i.vPAM
+lCgodG8Px/3/w
+lD.TfLwKeGiQ2
+lEMwzIk24XAcg
+lFeuV/Q78Swvk
+lGzSU69yzosBg
+lHfYZt2fuaZLI
+lIPolOx3kS5X.
+lJXf8PdgsSiwQ
+lKf6azuYghVEI
+lLR.2z20lNAZ.
+lMdVHuhG.GONM
+lNr8Nzvt0ztp2
+lOcQ9niRO8FTc
+lPrzsaszSPSD.
+lQlwl04utv8R2
+lRk62l2WdzX1k
+lSyOhaoIc/iUU
+lT8/54pY3lB1E
+lUcQmXZ.Wlzaw
+lVlQG4WwA0UOM
+lWjdCijcQwGFA
+lXryGgPq9G4FY
+lY1B5iHOE3gBg
+lZv867DMAKpII
+m.1n8IPB7Eazk
+m/yyxh7wbb8LI
+m0zZexx/1vg9A
+m1N0EJEgLthvk
+m2vLvW9xhZdHw
+m3dh6xUmiBkZc
+m4VlMJW81zji6
+m5DB1uPWcZugw
+m67VXP4hQhyDk
+m72tz5fuoXnl6
+m8PrMyDknNlQs
+m9XIf6UMsU352
+maC0ec.kN8AgI
+mb8KxTjNhxtzI
+mcu.9FQ28/STM
+mdekND9WvTSqo
+me797W335G/ME
+mfX/BwHM1XeQs
+mgUWEB8BtyLpE
+mhoxbDBXCQ9SQ
+miCZ1IkbNE9Dg
+mjth124WPZapY
+mkILKrgdmIQy2
+mlO36EwSe8sTk
+mmtWGc4ncckXo
+mnp8l8Oj89DuY
+moSlaPsPjEj1o
+mpOZtEoKHlTGc
+mq9YvcWYdlDLA
+mrMloWVDka18Q
+mskYxuygva2Ys
+mtnSGc5B9Lrzs
+muu540ApkWt1U
+mvr40.UrDACRk
+mw4PeJ7AH8W3M
+mxZtNZi7P9FnY
+myAjnPmbdo5wY
+mzlw0UREJT8VY
+mAEPnIL79U6uA
+mBVT5KtbUzAeM
+mCRk.tb86ARrc
+mDjuQXLtzfc6E
+mEouWYZktX8uM
+mFGjgtiqR3zwY
+mGyRmRv9zF9h.
+mH.PajAGSp0vk
+mIIwWwwGgNz6s
+mJURGKzyJfnEE
+mK7poGhC3ZSk.
+mLHlUOgtF.QCk
+mMOnGMraNO/6s
+mNd3wjXg1PHnY
+mOgcgwU6biduI
+mPDVgZZiXWiZ.
+mQLbZNPzOZ88Q
+mREpt.ID682mM
+mSVLufq77yQe6
+mTMl7LRytQr2A
+mU7OltQzHySmY
+mVKjCyS2P8gS6
+mWz/YuDGMWx8.
+mXnrzZFm/2gmQ
+mYIp28jTpRaEI
+mZnaRLznFd9VI
+n.h30Bi2S1..g
+n/XAfQZwPKJGE
+n0.MsiIae/bdo
+n1JPB3FYA10NA
+n2J0VEfyLj55g
+n3V2WocXM93Ak
+n42t/4ho0Ri8M
+n5liO/ajSyo12
+n6H8UWgELbyaw
+n7lIqIeN.4guk
+n8shmlfHw2mT6
+n9guM0k0.L17E
+naBIWrvj6XVrE
+nbGwQ3aJkq3qE
+ncryD5M8EjIB6
+ndBfmH3K.8fyw
+neBlQqO8mF74o
+nfXz1GXGDQS/Q
+nguSfKm1va51M
+nhdl0fk3fS19c
+ninh/CwyuKDPA
+njpFmbyVGHjaA
+nkcZbXdO8Dqio
+nlwhxBK6xENvU
+nmxzWJ/A7eIZk
+nnDwARN3kN10k
+noJZs3XczMf.c
+npsd6dlpoUT66
+nqmRGy0MczwnE
+nrd65QtfU08lE
+ns.QLObHQUkPU
+ntYZY0r7PRzk6
+nut067OFOMYV.
+nveTJsTWWN1qU
+nwFprWeMvftDc
+nxz2xIegZ0Ytc
+nyz4WHvEDqV4g
+nzU53KjWc0Xlc
+nA/d.oFVFvWeA
+nB/C.wE/fEFBk
+nCAg7L.2ABB/6
+nDfnEUFBUspFY
+nEk6n9PGrh60M
+nF9fSJD.FRc/w
+nGg5kj2cJWSKE
+nHAm6oTrOQEys
+nIdgQyguBRY52
+nJfzfCHUfQBfI
+nKo9EBPtoC1y6
+nLG0pfo39VMMw
+nM6pbOw5w9Yn.
+nNany7wy2drdQ
+nOlwAYa8N./yA
+nP2l/KxjVrSK6
+nQHg8jTsb9iQ6
+nRYRgef2IEoi6
+nSujo9hlhdp.k
+nTP7C5.8dVV2g
+nUKsTKiXQ7G16
+nVJLrbSq2I.5w
+nWTAr08q3M6lg
+nXsBOxhg.o4f6
+nYhpBssl5DYRY
+nZXYd7r.5Z14w
+o.GjdwYGlfN46
+o/creL9OF.7ao
+o0xqMS1bOb5HI
+o1kKsmIgpxyJ.
+o2QuQa4nMqcLM
+o3zw9.FixeVU2
+o41IzhKcgWh2g
+o5xUSzPkyX3ww
+o6TzH4CJZ0Ftk
+o71tGN90jPUik
+o8xdM.gQZeTpM
+o9zeMsxnhS45M
+oaK9wnkFgkG5c
+obZMdqplbm9iU
+ockfMCbL.Pv6s
+odtQ9BBZsdqrY
+oeSfrtaaE.7KI
+ofYtoL3QW0cfc
+ogyiKynUoPoB.
+ohnDoSwl7PVGw
+oiTk/Wgmtgmaw
+oja6hutGcybfQ
+okDf3IrUDfDys
+ollHp3J/qiG4w
+omDjdLfSeUPwQ
+onJmAkNcT72u6
+oovHo8LAwy7ys
+opGTbGQOb7.Bg
+oq0HBD9jO9fb2
+orBkLbW1KNHIA
+osh8OUj3EgOjk
+otm.DiUVsAw6A
+ouiHPda5mn9nM
+ovnMlJQDl/p7c
+owDyfUmpVtpi6
+oxYOsgonLYhxw
+oyGtC6v2M9wMA
+ozJnjhM8R1yy.
+oA0l7pl0DebH.
+oBB2.AAwaqVUU
+oCF9Pam/MXJg2
+oD/gDrEeBnSjI
+oERl/W4cq1/EQ
+oFFCGAm5QU43U
+oGK8D1VVGwWzk
+oHX0l/yRq2GXY
+oIHcw8.048g4.
+oJXNu6WricZ3k
+oK4XvwITa3WCU
+oLXAmibWvWWNQ
+oMOmYVjkdrLtM
+oN8/ajJF1LOdM
+oOC7TKyEah2Ic
+oP4xpmSmX24Bg
+oQ53IAdARaoyQ
+oR6vaV7B5eIgg
+oShFyMaIxqi7A
+oTQ7b/QYGAbxg
+oU0l6B0B7Morc
+oVZkWEiG8qpI2
+oWuAPFSWftRXw
+oXxrIOMlQZvNQ
+oYZiWKE7f0gsA
+oZmxacW.ZDsug
+p.HoCrr3eglww
+p/d9bZ2rxfnHI
+p0EeJRRZKxZxc
+p1.y5rofbhdoM
+p2azi8bhDo1ZI
+p3i5uUT8pJHa6
+p48f/FUZGQ32A
+p5eUtT8SJQxl.
+p6cUugZyGjvRM
+p7XrolKonku7o
+p8NOx3.eYF9B6
+p9/cvdIsJK63k
+papAq5PwY/QQM
+pbs8h2ARpSnpc
+pcqjgXYNW61qU
+pdIh9NCNslkq6
+peT.XxvLNbSrg
+pff3YtF35gWlg
+pg7EvB7QYJreo
+phjIN5YcE/3uo
+piS1wHGBkJ3z2
+pjhphnHrJC69Y
+pkbD2ndg.2MLQ
+plwlVdRMMKscg
+pmXgmk6bDqekY
+pnpAE6eqeLPuQ
+po04wiehp/UF6
+pp6hCEnDY5yz6
+pqlgA189RApBg
+pr1tkg5AOplio
+pspedtE/rlQa2
+pt/P.3xjlaU1g
+pus4s3.7AQ1do
+pvLPmFpcWNqJ6
+pwYf3wMZWxWvY
+pxjtQ1e/omvdo
+pyf3bPn8m7z7Y
+pzQ1UB1GHODQc
+pATfNCwRanDjY
+pB7DUIvtzVJvg
+pCqQfueYlkAxo
+pDoLfSN6DSXko
+pEG.q6FZ9ATmI
+pF.DnuKR5VWCs
+pG1Yb1NrvL22E
+pHDpRTyCCcmag
+pI6QzFX0HEnMQ
+pJqHkYRe9RlyI
+pK.IARcnqnEyI
+pLUcxHolF0cAk
+pMJ1APgCtrWWE
+pNQihs60rKnwE
+pOpB8xw91Xu7c
+pPD58OFGV5LNo
+pQH3ECsJmFWhc
+pROReO0dPaGSo
+pSDlkwwD0QMwo
+pThPrnVZakmsc
+pULef7adf.Pl6
+pVjR8rECLd1L.
+pWMcNbmD5nllU
+pXsMYj3qgtBs6
+pYw5pQf1/i11w
+pZRdq5.0rA/Rg
+q.MvkOv3.7zeU
+q/I4BNO.v4RQI
+q0Ifk2how87.M
+q1Oyx5r9mdGZ2
+q2mV0NZp92R3g
+q37g8yeDfMdQA
+q465HN.S58ohA
+q53zwFqmYUjxY
+q66to3JK5RgZM
+q729WOCa5u6Uo
+q8Ij/iH7nehPE
+q9HPzCGenwB2E
+qa5ce6Ndo8z4M
+qbpVLVTzA6YM2
+qcBHcUk/oSR1U
+qdUYgW6vvNB.U
+qeZ0tZcpodolk
+qfaibc.lG0Z6w
+qg39dEQNYpbGI
+qhQkbBO.igf/o
+qiMbk5T0wX9To
+qj65TByKEpJgM
+qkQHkhatkEZbg
+qlOH5IEWj.jss
+qm60NuoLq3pjk
+qnWv3h3tut8OU
+qo.dnDcKmFcQI
+qpwN0b9LTsj72
+qqtffW7HUMGtY
+qrYJvxP/8txGA
+qssoeR/1q8Tok
+qtStMbnVBkTgI
+qu2ovPrwDjSH2
+qvgviJREofgek
+qwIL39doGCEfo
+qx5FJki9vAtcU
+qyz8eIFW3uJoo
+qzQ4yNjKkcTIs
+qAVFGzGQRGdtk
+qBOSeiCWME7CQ
+qCIEdBsuTrzAA
+qDu02rwDmBg2w
+qEIW31YJNPJAo
+qFio7llfVKk.s
+qGWY9psobhCR2
+qH31Pric0xQaM
+qIiw5G2XdBfSA
+qJn7lPS/VNssM
+qKTw2Tiz4F5B2
+qL01SnumdwQ4A
+qMPdqLmyF.hD.
+qNhVyNtOw8fnE
+qOb0P8JVODrcw
+qPnBvxrBVykNk
+qQErjqvydueOE
+qR1dsBH.jM/tE
+qSF0./IL1nWLY
+qThjmNSnLeLyc
+qU5SIPgGNgqP6
+qVu6o0L9EXT3U
+qW7FyTtrxb/dg
+qXHZjtnNYfsRY
+qYG5YoSvmy39A
+qZhoSx0mN3ipA
+r.kILHemBlOPE
+r/2WTCYrcT6Eg
+r0/OR67FPw/Pw
+r1otY3zU.Uan.
+r2cka8TUAENak
+r38wMY./FxAkM
+r4SaQ9ekbVa9A
+r5vy7DrQWreG2
+r6LcyASiWJ3Uc
+r7/b9cx2mGCfQ
+r8AWRVsr2GzyE
+r9OXEqMwRBAOk
+raPko.wpxNfW2
+rb9ti8RUMyglI
+rcOL8s6Vfbjw2
+rdnyM8WcXkqng
+reu3tDNEHBSyc
+rfKgrBEwOCsnk
+rgMFIrplPFGkk
+rhlpN.oA3kM1A
+riGG8XaFxdOo6
+rjyvCWTZgZJKg
+rkdU9hxjI8/1Q
+rl0uE0e2WKB0.
+rmqTJ03o8MSH.
+rnegYA5UniKok
+rox7Jdqy.byUU
+rpgb/IvLX3GTI
+rqVTKtRlPS2tM
+rr62K0.V4uj9A
+rsJoqZEjfWMkU
+rtpLkM/PEJVxA
+ruay7vna5AaQU
+rvLb0EheUZUgw
+rwdabbi.4s.S6
+rx1aZuR96xfxI
+rywLNhBadJo.k
+rzOrgdzSAbbFI
+rAY7/MK3vtp06
+rBU2WQnQ8BKqI
+rCE5Q8VGI6rbo
+rD5.XtegcN5is
+rEK1ecacw.7.c
+rFypJMIFL2h2o
+rGk9YB6jucnvU
+rHwlt1vumbrV2
+rIiasCNZFB2/I
+rJBF1luqm6ihE
+rKmmG.BuDRx7U
+rLMMqgKYtSI9I
+rMYrRrKdTa7KE
+rNrvv3vs0mtNA
+rOVL0k/supDAY
+rPaCEBEQR4uIA
+rQ6Iszm0k4L3I
+rRHaMLVzPyCg2
+rSvhIM4iNe5Es
+rTpUkZEvkLfHk
+rUDQZByreU07Q
+rV8Yri9SGklak
+rWeZgMMB3/0Pk
+rXaSPx9pu6M0k
+rYp2LLU1ssvTU
+rZql3o7ACp/yA
+s.Y8S37dUtYo.
+s/byULtRRtKQs
+s0hzqP7jYt94A
+s1bASGcvcc/W.
+s21GZTaOBHOFc
+s38G5ylgQ1RHs
+s4zggnOE0.EwM
+s530C1gFZtXS.
+s6zaIDsJRimac
+s7MuuIoROZfb2
+s8hfsNSIsBAiQ
+s9L1De7/NAHdc
+sa3tHJ3/KuYvI
+sbBToWKkdNuEA
+scmXc/rfoCJIY
+sdcHxw1/PTr8Y
+secGBN1BHq1FA
+sf.AmM9Hpbp1s
+sgBX0EFeSOXZo
+shY2thr3eF5bs
+sih2hDu1acVcA
+sjIZUltAK7sGs
+skh9dtk2bCasY
+sl0N1Oj5JS0pw
+smskKoVAZCVbY
+snf3JLX29OeF6
+soHDZyOkM1YIE
+sp4a40h.B/C4.
+sqnG7acRferzw
+sr39fjQFZvb5U
+ss.Z87Dy17nfg
+stqZw66BRck1U
+sueUvZf1oEbmw
+sv/CcsNDDKHSE
+swPW/2M21AvvY
+sxoff0wn4m21o
+sym0BX7P64wgs
+szEsmk1f7MNQo
+sA7GDHZi9qB0s
+sBBliOeTSnv2Q
+sC6AeFZRDy/8U
+sD5WgKwfuKX6Y
+sEnmZiwqQzR.U
+sF2MM4mA994YE
+sGvathH62gqC.
+sHgc76cp5Ye1w
+sI61bzR2V6w4s
+sJvAhNeOb3Smw
+sKn24oBGX2qP.
+sLuF44izBerfQ
+sMEOUd3wm3d2E
+sNQ1ca2F/hkRk
+sOP4iqYvo5Rno
+sPeCTc7KR7gI6
+sQFveN8MpUMrs
+sRxAG7mEDwrUI
+sSrboLOpY2/XM
+sTgVzNZg/Ld2E
+sUjDZfAi20m2s
+sVdZmf7mjYOkE
+sWvE3e0e8aayw
+sXu5NbSPLNEAI
+sY0HP.DRw8Yb2
+sZeQeruH2O5VY
+t.KEawYVJvlSA
+t/uAQyXX6MvXI
+t0gI6IelZajIE
+t1nup18uF5Cow
+t2D9yT55hLHZg
+t3MbEI6Mb4rMk
+t4tvv4ixmbXn.
+t5uMQOChToeeA
+t6WO636XVju/6
+t70yJervl6pK2
+t83IIT7fA.0Qc
+t9DBu6h6z4.U2
+taN7j.7/kqxcI
+tbOEJJ5J31dmI
+tcA7gikJhAx6U
+tdo0P9yxNTGrU
+teobtLiiDGEOk
+tf.m7pLgFiPhE
+tg2LYMRVfLNKU
+thN7T8yCzgGy6
+tigUAA.Rf9XiE
+tj2q31t399FCA
+tktboY9RtThRY
+tl8wKGk3Hj4VU
+tmSdCRctL6nmE
+tnQ0E9vOe3cx.
+tovO5Co1svV8M
+tpxZ9Iax6irF2
+tq7JaQt84OmHo
+tr3lWLLFxYTr6
+ts4y8fDTtcEk2
+ttHVu3FSDqUDk
+tuQ/8RzuuEul2
+tv4g3QxhuWiAU
+tw1LWGV.Jgb/E
+tx5KCcsiUNUjU
+tyLPd4NTnjf.2
+tzmT.qnCEJe8Q
+tALaCujle0Zj2
+tBBSZgpT0Ij7U
+tC5UfYe.FrRus
+tDM63NOpmY0t.
+tEC1pjIEBikZ6
+tFsHt9Rbj36Cs
+tG42cvkjQIXbE
+tHe4RHuY2YMrg
+tIAijG.DvWAVo
+tJUD1OfcPjOmA
+tKYiwLwa7F2D6
+tLFBusYvOssZY
+tMtXoSVqzeAhs
+tNvHN3E3zr4Z2
+tO6v.u84VBHLI
+tPG8yxABEgZSs
+tQ/KPGtpy4cQY
+tR40ZxFCZTntI
+tSEsLj37c1zTo
+tT3AVl3TuMR7s
+tUQ7/t9jN8cEU
+tVAoEXYdCOm3.
+tWmC4lbeo6RRY
+tX2bjGrmt2aMI
+tYF.3ClkjNAeg
+tZOQGgJ2ZRyM.
+u.HtRvQad..wY
+u/iGJQUhcs5cM
+u0Kts.QuHdoKQ
+u13.ImIxrC5cU
+u2rY4qtsfwgUE
+u30cSRxq1fn7.
+u4gL4QbKPHzlw
+u5ozBcQVjmx3Y
+u60XNoTavlAvc
+u7HYxDdDSJz6M
+u8upKWeXUYcr.
+u9l5V5kAMU.qc
+uamL7xqjapbkA
+ub59x/K0LIP6g
+uci.MxIZrexto
+udwMwEV0pG/Gk
+uerFDTjwZy.c6
+ufgNWbFUFYjwc
+ug/fib3zqISok
+uherSqf9RQlQk
+uiDYxUVsdRYxk
+uj/R/pzKUx12M
+ukkmc4/dLF5XQ
+ulTiED2hRjnVA
+umanv/fEJzpwU
+unyrQWtxDX9EY
+uoA/pV18JP5PY
+upcj.3342oskU
+uqIzi1sY/K4cA
+urs8LAXJEsVic
+usjRS48E8ZADM
+uttJopbL2zDcY
+uugD2jYL1Mdpw
+uvEQCcITcwk3Y
+uwkKpeauAiP4M
+uxkGOgXdcfnOU
+uyRLVYFJrHOv6
+uz2.nRNvEdMwQ
+uAMdksdtrttj2
+uBva4FxUzsVeQ
+uCbGWrzSyNBoM
+uDGdyZA2EBdWk
+uE5rNVxNCU7r2
+uFjhCtjU6aNUE
+uGzoNJo9YcL6A
+uHL9FDUAkZpGs
+uINBRPMkpk8yo
+uJR8AWloutxrc
+uKYq.IPGZpaBI
+uLWQ0LeAUjWmU
+uMljR7COKYCwI
+uNQvRcn98lvEo
+uOUi.Z9O8ablw
+uPx4MSnwnEN6A
+uQL3VhS9FghO2
+uRL/En/riG9ZI
+uSuz2Xp8WPx8g
+uT.P5ujbyUEuk
+uUA8rdbgjF1oY
+uVA/m.caHhJ7Y
+uWfSrgP7jE3sM
+uXMLix06KeGMU
+uYhKrS/gFWRSo
+uZVYTQG7vO/AQ
+v.9Sa9YX3XvRM
+v/FfoSzTu1u3A
+v0r5Ugf74AIGM
+v1.OOx.FYhGSQ
+v2V9.pwC.85TQ
+v3l0KWx6v8mQM
+v4aZ4sAqg/BSM
+v5dlioC9Euw3E
+v63cxK80jEd4I
+v7PnSBmhwKWTY
+v8YmyOBnZrfIc
+v9iuCQikPaf7w
+vaIfwXyNOS5qo
+vbU9M70mw1Ta.
+vcLJVydyVl7cg
+vdcJejnZUluPo
+veFIEE6ItqLts
+vfJu5dEH53cEk
+vgRnyjvyEiy/E
+vhqzWKefpmolE
+viCNwXcvLcpdk
+vjrq3hLeMpqxI
+vkGC6S/KFJ07A
+vljy/JCBTlpSc
+vm9CRIsr1.v.I
+vnefJOsnnvToM
+vojc0QmiVWFaA
+vpHGvOLMOnQjs
+vqc1.vGfXqPL2
+vr/iHXb3.dRzQ
+vslY4NisivY5E
+vtfaiFVsLy9bA
+vu0DLJF9sYIOY
+vvR2wPAB0TELU
+vwwP0q2I5UmM6
+vxhTS9cRDZtew
+vyMC8DhJO3MUs
+vzg6yUKJ4iRig
+vAJYCgPhTjlYw
+vBOdLsiYBTQLI
+vCA6TIRP5ggPA
+vDVAwrOmabRCg
+vEuwSmbabnxKM
+vFPFSKU/J3EaQ
+vGO93oa2ug7hI
+vH7z2vItGr4sY
+vIRzN.6Qf0nkc
+vJyShDJs03k/2
+vKthH27IBibk2
+vL8n.tXUpj4PM
+vMvgnuXZtTKqw
+vNYPWHHB.0AC.
+vOiAkRJMzUJrY
+vPEbc2LL4nKzg
+vQ8e8SS4SYYZY
+vRP4o0LmryPNU
+vSpVpnAwF2YkU
+vTrp5mMYpGh6Y
+vUecDwMvsgNQI
+vV62LErlV23yo
+vWMpmIrGP2i5U
+vXJdAWTiq5A3Y
+vYH6.mjdoyHKs
+vZy6vtsmARr8w
+w.R1sIyptadLk
+w/jSAugKD.UAg
+w08rKyoC9ECsg
+w1JEwuaNQ8MDA
+w2KtqJNX5UpvA
+w3cQWqXACo/1A
+w4UcvUAba/71A
+w5.dw3hLI.mIk
+w6yncj9aig0AQ
+w7SakI3VJFz92
+w8G2g305KxNd2
+w9Plpd6sNTx/6
+wa0ODxIdBZdFA
+wb91BboByeU3U
+wc/Ibvmj8uFSs
+wdISxyVFy.a7I
+wegB/YNBuL7QI
+wfuZzscFZ2yPo
+wgfSVUmRZ/i7E
+whJbRiU7ws9zI
+wi6auciO1xX5c
+wj/0E7I43UJJ.
+wkiNW5FZlM06o
+wlvCFNwKoZrws
+wmufHByQi1nRs
+wncw0G8dza.Kk
+womp7fGlszT2Y
+wpxBzeru/C5gY
+wqhxlin3hU1DM
+wrvW2qtiYtTfc
+wsusM69Yr/nVw
+wt3T3FHETdggQ
+wulztBCiKx4Fw
+wvfR4um67kFfY
+wwljpxhGKT7yQ
+wxr6BARmXIzos
+wyJybWZHj/yEI
+wzSXdHtDO2Dh2
+wAbIE9MD.It5s
+wBTin4MUnz.Qk
+wCZWdqQpVamO6
+wDmCXwuGkcNFo
+wEM2C..RzmBio
+wFP/XpYbqUI.2
+wGE40fGJNTOoY
+wHeAazLloxIjE
+wI1Q.j5MF3peQ
+wJWVKQ4fZjPIc
+wKy6XtsNOID8U
+wL6kX/yoJfJgQ
+wMWJXcoe/i67Y
+wNQXHP9HmKVBQ
+wOEew0dB/2vp.
+wPqXPPVO5ad9M
+wQESFkXcHjSC2
+wRkPrfxswnUGo
+wS/Mc.bcBFdnM
+wTKGl3KLV2a4.
+wUQ0uaL7zkTf.
+wVeDYYv/7FpD6
+wWUv.2apLnfu2
+wX0EFifPcqg4s
+wYkeNxXihaHh.
+wZ67un4L5mGck
+x.hKW7fGvsEPI
+x/3mBwZ4Bs1xk
+x0k8MaaK4UeNg
+x1KFKo/2EolQQ
+x2d6lUCdc/0TQ
+x3rAA0pHBSa6I
+x4OpUoo9KBR1o
+x5llgroRjNYY2
+x6DHXRzl.bkiI
+x7JbcWx1DO5xw
+x8D96j0w3RzYE
+x92cHnkSt8Mqk
+xabBEcgByk8C2
+xbxzjfvCRPYvg
+xc7t0u/H7d15o
+xdbqIU3SAhWTU
+xe961N.JoN.jw
+xfJI12K.CkLis
+xg/aVrnWEGk9M
+xhw1U3HMPtoZE
+xiGPCrruqph5A
+xjOhFdLKGK84w
+xkgQ6DDmCbO8w
+xlRG2X5iotmNA
+xm.Wrlyv47JU6
+xnwjHiLGZnVZw
+xoKHFScim0ufY
+xpoJE4eNlY/p2
+xqwAmdyPenJ8c
+xr6FdZ9VwsVs6
+xsFjhU22u8Fuo
+xt7UzfdnImehY
+xurjAt6CAJVDc
+xv2pvhIQ4XwGI
+xwq1Wsea..vY2
+xxj31ZMTZzkVA
+xyAjYtmfRYx/.
+xzMSpnvDwGT9w
+xAsqwxvNy4p0s
+xBnzqBk7FldGs
+xCkFXfoxf/6k6
+xDZzFxlsmiXlE
+xEJdhpbmUCxRY
+xFUfk8kaKsxdg
+xGtGE5iXWkYCI
+xHXYMTEKfvew6
+xIQfSYIP/o0GU
+xJJQv83Bcxoqw
+xKBT5yQg/Lxis
+xLf43jk6eLpF2
+xMVQwUFJSH5r6
+xNCOewVLTirJ6
+xOAFZqRz5RduI
+xPk1ieoqpwl7E
+xQUDOfLwcnNB6
+xRoDQm3HnicYE
+xSA/797wQy8Mg
+xTEzCoiC3iiN.
+xU5aB8K7AAVeI
+xVr6lkSpxgAzM
+xWK5LnKoUnTTc
+xXA9mt4Afp9N6
+xYJPQON7N9.Ls
+xZX3RQm9R4w3.
+y.xHMgX6IcqmE
+y/d6sWyZXc5NU
+y0oDqWgIH4eic
+y1AYIa/drgPiU
+y28ajdUwfO.Xg
+y3EuHgsfToF3M
+y4MxsTYeofZBY
+y5SfcRm53cpiE
+y6ZTCEkjATBmU
+y7TWZcDAfezLk
+y84dpvHM9w.86
+y9OBH280b7TdY
+yaxjHWhZctR1c
+ybX5OhEi/vrsg
+ycy/1lxJlFnYs
+ydJYXP5kaLtZ2
+yeD2LhEeiVWSY
+yf9SMuP2vXvho
+ygbmg4aqeK7no
+yhhmo4PFHHkkM
+yiJDsdibCqol.
+yjfoXl9WDquCY
+yki88.CJHxkgs
+ylkljnQCaRzYE
+ym5C1T.ksrD/c
+ynZinVDRwK0lw
+yobCr3NhP2hks
+ypfaSoIDVmJzw
+yqXbZ1fdvhh3k
+yrm8UviHeDD0M
+ysVTmVb19akRk
+ytnVg9bpYmEP2
+yuWo0fwo.iPcE
+yvy0ySslClLro
+yw7wmG4vcGMyg
+yxz6DY2GqQPP.
+yy/N/uWjeS4EU
+yzRmDJITOAbiY
+yAS5K/fWo3Ik.
+yB5WEbpKWFsT2
+yCDP4k4KGIK1o
+yD9CMv4KDn4C6
+yEwfpSaPrXtx.
+yFuZPYREWaHI2
+yG.qBiNkocL0E
+yHib133sIzhCU
+yIGAsLiVEtkCw
+yJ6bYS7DdX.NI
+yKM/.HLcPa/Y6
+yLSI1zUQA4RK6
+yMyB2rDIzMP6U
+yNSa2dPHAhG3E
+yOtOkemCbmItQ
+yP25ms9jObpU6
+yQX.nyz0aKC/k
+yRCsyWfCPp/cU
+ySMaE.CtzUsc.
+yTBnb7ab/N072
+yUaQno0ALPxRg
+yVUuIR1/y2HbA
+yWEOEq0t6qigI
+yXQDPwEFsWf1s
+yYzgkCPkXO1A6
+yZEPH6exqDoqk
+z.x/tFH.RNjbo
+z/LfhO4s2PAws
+z0/P1Ts4ASKx6
+z1c98kczntICE
+z2AQLT65YmmPk
+z3ORQSIbkM.f6
+z4ogEzXtzCvaU
+z5Jyryh644.oc
+z6eBuWHbpbrRg
+z7kfCkt1LD0CU
+z8LKuCzNF9eOQ
+z9IzXUXrQX24Y
+za1aId0hfZ2IA
+zb49V5YNIYgls
+zcC4iIlrj7vN2
+zdRw1XiU5dGKk
+ze5C0UE82IECk
+zfgo6yd2LorMI
+zgkIaxpym/GlU
+zhRH2Qd3I15SE
+ziO.bMH7sifGE
+zjB8fX524dmlk
+zktkbQMbEvOQ6
+zlNgX6PMu2LmQ
+zmsu43fqt2N9c
+znCEvl0vPgeE6
+zoM631yZapE1c
+zpJXchoMHUpv2
+zqDuxpWs/j1bA
+zrI74sv/PI5K6
+zs9RZQrI/0aH2
+ztsY90YOY39QI
+zumQsCezKGcfc
+zvdN3dxoYGn5M
+zwGaG3b12ZIQc
+zxpSJ05Vh6dyM
+zyEbcafGgBcEw
+zzXUHfURnGg8I
+zAudc3X92cBTE
+zBQZgFQhW5me.
+zCG6JKPGFp1aM
+zDCCGanBdLeRY
+zEblJR6M.Vx6I
+zF.U5wWLZYTMY
+zG7K8sA03h9zI
+zHbR22hXZl5oU
+zI7S5DuNIAJYM
+zJly.yEQOYqFU
+zKw3KUWMt529c
+zL2a25ES3rPQE
+zMyfW3NEROQ7M
+zNH5zBwMfU17c
+zOg8eY/M4BUlE
+zPnOtM1RvpKLc
+zQ8gh3fOXdNRM
+zRLEFlFPpyMrY
+zSUzM/ulUNs0o
+zToGBsFjr64io
+zU6p736al5TEc
+zVx.XRhG/pH8I
+zW711QfKS.xWc
+zXGfW6ahNc6ug
+zY9KWaBAxmVPE
+zZDDIZ0NOlPzw
+A.xewbx2DpQ8I
+A/A1Q72rRitSE
+A0qxUqZSv1XUU
+A14wIOaAd8ru.
+A2FsSrMASVa7E
+A37PXN7bqEvlw
+A4oopdIf/JWAY
+A5dPztExYUebQ
+A6ayhDhnm4OMM
+A76Xigm0q0miY
+A8WJ7JbZW90Ls
+A9RXdR23Y.cY6
+AaAUb94kU3J3w
+AbTLrS7zqigWE
+AcTTVF2UuMGtM
+Ad/.QHABAhkig
+AeFRrSlpkiKtE
+AfCUaSFFiJOx.
+AgXezoAHL3i5E
+Ah4LiEWT3GBMs
+AipZTzfmFeQ3E
+Ajcnfg.hGSC2E
+AkFuiXCTUkJ9I
+AlorFaz.yUTPc
+AmvUHKTwOfS9M
+An9JM5.6ujk.I
+AoL1k78Zw/ivU
+ApIQ16XU9R0Lg
+Aq8Jsa1/pjieo
+Ar4farDnTEYmw
+AsQVswt1sWKM2
+AteFBEcNttka.
+AuiWP6ScsqOHY
+AvCSyg9e75YZM
+Aw0zPaDUZ6IBM
+AxzoOlRzUeOaQ
+AyBXH0n2RuXRw
+AzSzB2uy8JFlk
+AA6tQYSfGxd/A
+ABRCL9ijBr2LY
+ACTg6.CwWRuq.
+ADHYgMPKnS2Lc
+AEp.KavrfPRpI
+AFROIz0xfqx6c
+AGr6Sr3RFjWCY
+AHc4HAY7x0iu.
+AIswt6a750HGc
+AJGsfiT.M0eRc
+AKvHwKOh1cLR.
+ALcOsbamD/axA
+AMQ9PPe9uqy0M
+ANXjRsAoZQu0Y
+AOczbvVa/vfXE
+APS1QFB.pQFHo
+AQnEw392raoEY
+ARSnhYZg1bjks
+ASYRtiLFCipT6
+AThOPBVbNY1Ro
+AUNCh7ej87bWM
+AVm10WS0sVGBQ
+AWUEyCQT8ydxY
+AXrTQmbx5n34I
+AY9M0nxFiNa0A
+AZ1YI30i2lsIk
+B.t/DG9ZPJGuo
+B/zIGMZ/mmOPY
+B0m4Aq2qTqO4Q
+B1IRNtNLvAntc
+B2FxXZf0TNYuI
+B31bo2Usywm7c
+B4UF69IqLLpp.
+B5Ihtdc111Eqk
+B61OxHybX4H.A
+B7aK.aHrFB4NA
+B8JRvd/sVtej2
+B9.RVBiB5LoSU
+Bak6eB28O4O26
+Bb.4OKftSeQYE
+BcG6xlASDyr0o
+BdnSvr04pcTu2
+Be9oX7OSwWoU.
+BfM5Z2vaLaU7.
+BgcHmWUD18.DY
+Bhv786o1c9bHs
+BiY/LA1VIOSUA
+BjYkMIYR2SOXs
+Bk7Ujbfb8z8EY
+BlQ2f4jJgG/pA
+Bm5T5Xr0ZIoGM
+Bne4usScLwE4U
+BodDv430F5Nhs
+BpgPN56maG3tQ
+BqxxA7yzvtxiM
+BrvsokEWN7qTE
+BsEbl7nLTHkRc
+BtM5S0EIZJKHI
+BuZF59dj8rHok
+Bvf9hzGQXcubQ
+Bw6PSorJSp.0g
+BxZPctq22eZ4M
+By2mk6va4gAyg
+Bz9IZYGf11nAE
+BABnaAfABdmwc
+BBUTgMrYjsT0.
+BCQhgpN4C5T3E
+BD6FP24D/LsAU
+BE3og7CN4W/wI
+BFVDA21wa2ENQ
+BGL3zbjbbN482
+BHB0432Ynt13g
+BIyphJ6B1mPP6
+BJh1AfjLIM5kw
+BK.j0toibHx86
+BLkvn6sbzJ1BE
+BMLJnzh2VXLJo
+BNaT73E.ZDXFI
+BO8pkKUgRexpc
+BPUQiFy4S8Szo
+BQ5ZxmgXc9Eu.
+BRvZ.pACTqQMQ
+BSkfNxImwPHeQ
+BT2xpgW6NeZGA
+BUlSc8yD6q18U
+BVV4claB1NVXE
+BW7ndyxVvU4iw
+BXx6BeQ4xHcrI
+BYo9xZ4Zo40bs
+BZcU7AJb7DvoE
+C.1oP2DOot4MY
+C/sji91FJcsyw
+C0QwUt35PNC9.
+C1iy.g96M.oZg
+C284MBhj4uIVY
+C3/XxSfc5UtZc
+C4OZMnurrXM.s
+C57pFcIlcQN4w
+C6vuTIOwNUgQw
+C7bWL25Q76v06
+C87C40HO0Jods
+C9aFcy08CNAt.
+CarsB8qnqhQ5I
+CbkNr3Bog1MqU
+CcgCGKodMNsB.
+Cd3Lv2aD0aiBs
+CeSLB.HiZbNa2
+Cf/FiBHOCMmc6
+Cg7GF.ENNuABI
+Ch8kzRJ2OdUgE
+CiwTL1eJx70ps
+CjO854tVYj.WU
+CkJ8DGS6WvALY
+ClyfKpA707uFs
+CmJO//.L488S2
+Cn1c3KfBVgHXI
+CoxqpEN3yBd0k
+CpPVuYo7U5nqg
+CqkaeLJSVcRpI
+CrC3BP3gjcv8E
+CsP/9PtTebT..
+CtGg19us1eFyE
+CubIjg8TVS.EE
+Cvw/oyyec7eCA
+Cw7gk/AZ.iB/s
+Cxf.GhiOsNORc
+CyPXHszYbc3zU
+CzFUwKiiV87R2
+CA1QG0zB/YWyc
+CByEBoOJ2nVRg
+CC1pSQMFkUSCo
+CDCeBY/cBeFps
+CEpI3CkvwzpE6
+CF98JEEMzw8kI
+CG.vtKF0MPsPM
+CHtk.xh8JoU96
+CILxIE.TuM5hs
+CJhAamij6KuJY
+CKBgEM6soQTOs
+CL6nVnaZARxpA
+CMwC2CxH0a6mY
+CNmiiJBw1neH2
+CORIfgETbUyCs
+CPgf4DxSfkrfM
+CQwYLIZ8l0uu6
+CRdA8QWcCutMQ
+CSyYMArzR40ck
+CTFHtY.7ROl.U
+CUJca101.4aNc
+CVhaLTUt7s6OM
+CW58JHG05r5.Y
+CXDo4ZboA.x/Y
+CYqqxAmF0Wp9.
+CZfZ6CFyywfy.
+D.S7LA3ksYed2
+D/Yh0.al6fiiw
+D04fMJhA/bQNc
+D1utHaDS3.2Jk
+D2AkLx4DtScIc
+D3Z2r3c7ECj0E
+D4x3pAh/6VhEs
+D5cKRVra0twPU
+D6hLI2yAGm0VU
+D7Pu7adBRTpxc
+D8rrIm3n0b6Sg
+D9m8H3/Cvo0Qk
+DaIY4aLIeCJhY
+DbIyeMzwAhup6
+DcJLOjwd9Udvk
+DdDuZosF2Rnus
+DefsFIBKYqtEI
+Df.E6mtSRk2es
+DgFO5AGwY.yeI
+DhbhzqUVhZBBY
+DigkPx8cct5mc
+DjsDcXwFj1oc2
+DkqtPyB9KkwU2
+DlsrC3haRemEo
+Dm0JXAmrUFyBs
+DnWUOkb.ti/jI
+Doo3WQDSRDvdI
+DpRUrfGcfNSi6
+DqA55O1n.xoOk
+DrYQLW7lXnSks
+Ds81AR.h3maHY
+Dtl8y6P1CiDt6
+Dut0r1ybf2P7c
+DvMNV2yYfnloU
+DwnGy/AZJGi0.
+DxsmdjI38ZiIM
+DyGQeXkkFKY0E
+Dz4VRp/7QoAs2
+DA7i7c8mpufJs
+DBVcUKNkE4phA
+DCMOTIjT0WYO2
+DD4h0gd6UF8t6
+DEdHqPZLAMK6I
+DFkS2oDEJxgmY
+DGCgvBm.4VQ9M
+DHj9fMMYkzvfQ
+DIROAhycRwf4o
+DJaFvL4Hpt6P2
+DKh5iRyvaEamM
+DL.xDJgABf8vc
+DMNKyNJswdvq2
+DNGTOAlK7XuCA
+DOf2hfD.dyA0I
+DP9e6PNWvoJ62
+DQkieCL0CoF5.
+DRSA07ZWOpRt6
+DS7str5nFF57.
+DTWG/8.nLmCSA
+DUjHostQ4q9Gw
+DV3Z3OcAUN2ys
+DW8LiO7AY7oGg
+DX5t48Lfy89lE
+DYBsdmW6oJ1jo
+DZbs.jcG4Dy/o
+E.kPu71.ZoSH2
+E/EWUsuc.YkqQ
+E0UIgTzHr5s7o
+E1opTTYV8QZ9U
+E2qTL9aZZyi5c
+E3/ghhVLy9UoA
+E4XxxGk/2IcG2
+E5xcwSvbZHMqY
+E6Z1fk2QcTVP6
+E7i11zAGFLzQw
+E8d0vPbPTQJh.
+E9dwi6jil.dFQ
+EacuXrxsYukkI
+EbPld8hiMqMT6
+EcYgxUDpfzW0c
+EduHrNvt9Zh9Y
+EeAJqAJ0sluG.
+EfGvKi.32onxw
+EgTd7JxJ7gnWw
+EhZ.adVp50J1k
+Eit9Oyvvnb412
+EjdESLi5YXgXQ
+EkBDjKYdDeuho
+EltZN3N0l3GC6
+Em4xFk.mq3/BU
+EnlhXSlcNcgTs
+Eoa2Zf5TxvSOU
+Ep4Ro7A77l.4E
+EqiTuD7Ma5Tvg
+ErDRQoAcBMpVY
+EsrXOAQMCl4N2
+EtXsKmxUgWAW2
+EumwS4TEaizqU
+EvQZDhe6pHgtA
+EwOHykquKjfAw
+ExfhMIVhF9P.o
+EyJdPLm4o5WkY
+EzXlx3aO748FA
+EAAlIhlrjBruc
+EBOplh0RML8vY
+EC2Zhy4Kt2TOQ
+EDsuRmXCXYOh6
+EEC7t7Q9w8Ggs
+EF93VGC/nAJGc
+EG46R9qvNo/x2
+EHKslB.oqyCsg
+EIUM3aORHtKrw
+EJhziurm18S2U
+EKWKnlnzlqHWo
+ELCc.6oEVXFEY
+EMecN8mT1umes
+ENyDLr0fFDqWo
+EOuwpwD8/9fLE
+EPf4TQQwJljBg
+EQZwq1JmVcXqc
+ERiCbwAs9di8c
+ESfYQnw/i3YOU
+ETa2/67bqmQCA
+EUYzCkJ5dRZgA
+EVI98fj1HNQlk
+EW.9aE4tVXx1Y
+EX7sPmfzH9V2c
+EY8ULaXsqebTI
+EZ3B3PpJHIGBg
+F.P4/TDYxSj5w
+F/nck.cz6mgYg
+F0ZBs5cN3DGXo
+F1vL95cIcsp2w
+F2UUyQD41v.zw
+F3MhiOvS29SQ2
+F4JXN/zpplWo2
+F5SPiCnyHg8wo
+F6Z11ZD5ZUfxg
+F7G4x97RFUfBY
+F8GG5igastky2
+F9t92CDtAYVeY
+Fao01.4zxsbHA
+FbzYc6LM5dAG6
+FcNoGAAta.JLA
+Fdtr67zbisXVA
+FeIEnR8gmuZZI
+FfMaQxphlRE7g
+FgGgCMynLfYGw
+FhqB7t.XjDMTY
+FinEQbZtgUwjY
+Fj8aDPN3RE29U
+FkvD.5oGaIm76
+FlpYQTwTZbSWM
+Fmc5mEYNcUqkg
+FnKSNfIx0rh2M
+Fod20hgt1Te9k
+FpgHy/WD0Xaag
+FqD.MOQL0MO2o
+Fr9no9S6oMnf.
+FsjYjK4IUHh6w
+FtnHufxELQ1po
+FuKj/rYYrOQBc
+FvG..hOhrqP0c
+FwOgHYnhHjWb.
+FxrfCVBMYiUxs
+FyoVIrUv6eVqg
+FzZDNzDgGpE2o
+FAJzAuOSlGGT6
+FBedGYwM0uxyA
+FCRAm0MK/s7Po
+FDz8Yp32NKdm.
+FE3/TuB1QW6Z2
+FFQCPKOip3sXU
+FGH2K.l/5NRNE
+FHrLg6eHMx2nA
+FIee9ppkFJh1U
+FJxPnfhdJ5Ifc
+FKlWtfUlubqwM
+FLOOe4sdh.Pt6
+FMkw1IOQwMsUA
+FNuBe17TgqPz6
+FOdwLwEUUBkTE
+FP/Z1uTY4eyh2
+FQJVMfY6HUfNo
+FRrlUn6vYh47k
+FSu4ln/EAQuPU
+FTV0zRRmTgHjo
+FU7wHQmhV4WLY
+FVsT/CZV7XKC2
+FWe/JI9bzp/D6
+FXWUuZ.vwXttg
+FYsQ17GqYbH4Q
+FZPWOZi.fVjaY
+G.zaiLss9IQjE
+G/lCM97Un.b8s
+G0OcbTWwnDkIg
+G1EHBa7hFUwcI
+G2jwd6x.2/Msk
+G3I1MHQhhJRQQ
+G4xILbRj62NHA
+G5cCGM5MULa7E
+G66Wt/jrdme8w
+G71KNsal6Voow
+G8oe7fMK02e8E
+G9Fo.kxIwLufs
+GaWYYkxoaSZnc
+GbzWb62aHiC4Y
+Gcv/JcDQhsGro
+GdQYPRnlO6Hrw
+Ge5VTEhl5JXIc
+GfRlAFOlvmByM
+Ggbs5rCud5ji.
+Ghr5gd5U9CcJw
+GiSYYJV1ozCa.
+GjIcQ0DGpk0bI
+GkeuCAtCYJuH.
+Glpw3XOB7CpYc
+Gmp/80aUyh63c
+Gnb6uE9Lp4gt2
+Gon.kuorJVIsc
+GpLuxVp5.owgA
+GqiEFI6kEAsAM
+GrKLrj8sBniP6
+Gs4dZ.LgR146U
+GtGkpaGsMrIPE
+GuBqifMleNxmY
+Gv86p9nhNaaLU
+GwOb3KFhdpeqU
+GxF6NQoyblqO6
+GyiHZKXKGIHMo
+Gz4HBAsTfpEVY
+GA39XiH2gti6Y
+GB8k61xX80f3o
+GCz8K4Y3yVJrk
+GDk75T5aOub12
+GEU9v2Gw/CuX.
+GFMd1aPYXrKjw
+GGLjh9TBv2kUk
+GH8l0QQcYMwOU
+GIh0wdwXmuCQ2
+GJqD0hR3PzvkA
+GKX/5zp0XQIx6
+GL8O5P9.jYdCE
+GMuMeMoqUogqE
+GNdTQCOqX8daA
+GOJshogXi4Nhw
+GPil6BOf5VVBQ
+GQXJVApRA9.2.
+GRepisZNv.tcY
+GSD7QzYbbjxvc
+GTAzTDSyuJ3vY
+GUfM1sOCPgEhY
+GVlqDWYJOezdU
+GWNA3jPIlgdkQ
+GXSpYWtmC5Kaw
+GYaduKq2ItSAo
+GZpcR1RhUNb92
+H.uSfq3SPdV.c
+H/IpJcf4uRzQw
+H0gDGHaE3hLTU
+H1cIW97pVyXxw
+H2xpRxLq49Brc
+H3HRk/9WeiI5c
+H4ieF3H4veFv6
+H5ned8EV1vank
+H6xJcxd6FJNSE
+H7XyMzLQgOJfM
+H8/fD3KPTXgWY
+H9s1YManvYauM
+HahyzxH78LbAg
+HbEyKp1r1syB.
+Hc7k.UOf6uodk
+Hds4e3tSfGSTI
+Heq5ZtRwPepeA
+HfmqeYY6XqaRo
+HgZugJZPj2o8Y
+Hh2HlWfJNM1Kw
+HibyIiZMQCfU2
+HjzIwHkyPkTqU
+Hks1wGLqwPZfM
+Hl5Eyh1zbqyxc
+HmfZxv84UKJOk
+HnennjvqsGaQs
+Ho7nAqD/F5ulk
+HpLHf68KTZSCs
+Hq49e6VIbtXxA
+HrLNrZ3VS3TF2
+HsoNMZuuOKqQY
+Hte.uk7k0Jc7U
+HuxkYossz6A7I
+Hv0RySB7zauHs
+HwTfK4M7TJPms
+HxN28YQI4mRak
+HyKMbELsTMh0.
+HzIHrTFsllc2I
+HAYRs6vZAb4wo
+HBnPms3hEsN3o
+HCmJP//iIPqwU
+HDwMu4ME/cwzc
+HEaR480UDuETc
+HFVfWn/94Z4GI
+HGEn.WaTwkNtM
+HHfJtS7V7Esf6
+HIwyd0KZo65Jo
+HJAR/WhOuQinw
+HKb1I.GkA6Wu6
+HLTDfIl3IxKAs
+HMZY/e8Z8mHNg
+HNRpRHxqCN1RE
+HOFXBm7iCSb.w
+HPmss4wPach4U
+HQZyJJt9M00Jg
+HRxFR1HBWNabQ
+HSD9a.ShTTdvo
+HTc8YGuScFGZY
+HU29QfTPdjNu2
+HVdIpTGdNhChY
+HWNn1N/Y0rEh6
+HXHE1BtHtA3N2
+HYvTBkaCsoqLA
+HZhXUg8uR2X6s
+I.6i78tH1.Uhk
+I/DL6KbrODX56
+I0S3Ry62CSoFg
+I13hr0YUZls/Y
+I2pK48U2t5C1Q
+I3ywwl7Ra708g
+I4k9guz7HXWQw
+I5hi1B/e5uzfY
+I6avKXNy/.MMw
+I7pYK1/MWGnOo
+I89yACTnGyonY
+I9L/6w1kwTpMA
+IaHUP5CbX/yIU
+Ib1.BHziSbgVg
+Ic6VFuMzRi5SQ
+Id9cK1ljX82ao
+IeK5Ft7D7/tm.
+If2CvkRPU.NBY
+IgA/xeGWilPOo
+IhcxtGK7k74HA
+Iis0qTnwI160o
+IjGvb6BXeXDAs
+Ik5VA9e/HFj9U
+IlUnV0rigeD.I
+ImjHAffFGyAOY
+InHUGkGdkifVo
+IoWK9u5Xj6ZUA
+Ip92gg8I4jn7U
+IqMeXewNLcCNY
+IrzpPCqp8Qocs
+IsVpYtjneHBYc
+ItkroId4UAOF.
+IuTDemOTOK09k
+IvHdQpC5skCSg
+IwyL/HwMQJE6M
+Ix8wD2OW12vfw
+Iyl5P.tmWp.PA
+IzomJYd9LpZFI
+IALCqnlhKfsWA
+IBDXWbkBirMfU
+ICs0rmhf9Wuqw
+IDotudLkXS3Lk
+IE9ldwYLap9qI
+IFgjRNur0frI.
+IGSQpYrjm0znM
+IHPRkoP31Bpqc
+IIuId8TtqY5iA
+IJcNND58gQpL6
+IKwv1BQ1SnX9.
+ILBkZt7yJcEuI
+IMyXn8qsuEBEo
+INVVE0vlCEq5I
+IO3r0vZygY5qI
+IPWfZkhehzoS2
+IQ88huRqmf.0g
+IRaaeCR0pXngo
+ISkR1c/VBsbLY
+ITgdV/6LHU8Gs
+IUEi6JrtN2J4Y
+IVOtV7e7v9DH2
+IWxP2xufGdY9Q
+IXFpIAMnctcw6
+IY/ekh6Pgrp6s
+IZ7jMcLSx0oQk
+J.wMxYvkb.OSE
+J/ThTcMuvArwE
+J0C.WDR1amIt6
+J1Dj3y9oZN6D2
+J2BleDa5UUsck
+J3VFi9rqdepEU
+J4yPQ0IUJqr3w
+J5h11U4s90MWc
+J6QgS649LUQOA
+J7WtH1la12Zeo
+J8O2Y1HVGx9FY
+J97QwE3xHYU3Y
+Ja/uBmQcgHDwg
+JbUMz9TnpBq0Q
+Jc1YhO2EQKoHg
+JdzApwLVYgohY
+JeFfzfyaZmDK6
+JfB0YwsNhFnE2
+JgCdCd16U1GQg
+JhlsGPvYIdUZs
+JiTL6VEqzEzxo
+JjQ1gCQuB7rf.
+JkqZWdvHiO44w
+Jlg5Ap2/VkhkI
+JmPwfFimrxu.Q
+Jn8NTHMQt1Cew
+JoV7M81.yR7YU
+JpTkjP7IX2ZWA
+JqtpgwhnxZdTQ
+JryqixNl7088w
+JsmBeGpOUYkhA
+Jt3tFQhCpLSek
+Jut9LUFfsH8fY
+JvQvqHJwSYl6s
+JwsCrLFuHhnWA
+JxGLXVA1ofOeg
+JyuysvbvR43fQ
+Jz60Inf4tyCIg
+JANq0IAkawIEc
+JBelFptCPx3x.
+JCsHVliaF1Lk2
+JDyl9DwWD6v/I
+JEQ6D461j3sfg
+JFMQjUyOPu3yk
+JGLpFXLPtTBJ6
+JHjs5T7ZFh/og
+JILpwadFaxxZc
+JJ4IWbq/LzMKs
+JKcqw2wwsqFf2
+JLtFSXi7fqFmw
+JMaj/7RK.SXKY
+JNv/qE4ivqGt2
+JO2zhRFfKQfdE
+JP9/bL90dEiGI
+JQMuyS6H.AGMo
+JRrfeoQ9fzIEI
+JSWEAsd65whLs
+JT9TpSOzQKzQw
+JU1wTQ9mH04ns
+JVnjw63p0k1cA
+JWb5TGstvqtM2
+JXNUNYxZBs5JM
+JY2Q4PtDqraKo
+JZ6MfF8Pf8KH.
+K.578QIvUawY2
+K/YcgFL1qxHos
+K0doAdMdQBU8I
+K1PhLnmf1xpys
+K2JW8fJnFxsm6
+K3FMm19cgAO4s
+K4YPncTjM9HPo
+K5VR4PrwbI6Q.
+K6pbRTjC7L0A6
+K7Vjga.vILkVA
+K8MJbDna/jpGU
+K97L27BcOM6eQ
+Kan259TEB2S/s
+KbngrqE35Oc2g
+KcGOeVayrtSAQ
+KdcE8nHjwFGB6
+KeODPeL.SYhRQ
+Kf/LyO5LrHBkg
+KgH7pmEO3ZdPQ
+KhT1ux0j6GpFY
+Ki.uJ7lES6H42
+Kjs.0l8anffFM
+KkA4H.G80Q67.
+KlsAK.zZvKtoY
+KmCWDIu6p6Hpw
+KnF88PBLIi3is
+Ko6U4/QSzr0cM
+KpbKVcaO1mpOw
+KqIwcN604eTMI
+Krh7mbViV6Zz6
+KsYn16wJg1fAY
+Kt30xealzXdN6
+KuUQKWp/Z5anU
+KvHxFUw69c74A
+Kw8KvD.x4XDg2
+KxTbfFGHR7ZSA
+KyyafHQJkt6wc
+Kz5GOkRv60NIs
+KAaSCAlJqyanY
+KBbJe9oM6.jZQ
+KCsZofQvEShEg
+KD.ALqHqANOnM
+KE6zBbrDNB7Kw
+KFJGY9DJr9HD.
+KGbGyNm.3r8hg
+KHzACisVV.ZCU
+KI5eE8rTJvs.U
+KJQnxnfPjG8lU
+KKSuXzYXRIlV6
+KLBixklx84Xq2
+KMfeQ1LrwA9RA
+KNbAsAFspnON6
+KOIEOOfsIbv/c
+KPmCGtec4w0Uc
+KQOsM4V.szRT2
+KRkddkPGedm2.
+KSwcrVJv1qTeo
+KTtvmYZb12iGI
+KUDk6IegKvugQ
+KVjQts5WDHBZo
+KWoMZ6/NLY5uU
+KX.7pbwsYIIsU
+KYVdODyE7VfF6
+KZlIjHXymG2Ww
+L.0r4ClSY3KqA
+L/wf8tfTD9G4k
+L07nrFM/2UNOE
+L1MSCAnf.1vj6
+L2pHFKC2DBVDI
+L3j5Kznl29Aug
+L4W3m3U2fs8kA
+L50/yIQjPCBiU
+L6Di7Uk.Y5ANU
+L7FgJF.kGZs0I
+L8pAGI9w.YwMc
+L9yLGxncbOROc
+Lay1EhcWhup/s
+LbdFIkwBue4Ow
+Lc/MECGHNTWB2
+LdpHU0UF3r9vI
+LedhII68jn.XI
+LfhaERgNIfVDo
+Lge5HRkI2th6E
+Lh8Vft74nJYL2
+LiWGUkRIs.uxQ
+LjMURLGP.WKHc
+Lk1xViaCWayvg
+LlmKkt0I4LZBo
+LmSFjarVsobKs
+LneM3OJlC.mRw
+LoIB1WlGIr7Go
+LprVErrCt0ZuM
+LqKQG7ntMIdqg
+LrlopZJ/H5swE
+Ls2YO8XhhwCFg
+Lt2V7UrJGBqjc
+LucaB1d22mBUE
+Lvfja1wClMGnM
+Lwd3tByWPW6PI
+LxxiCKXT7Sb2Y
+LyRHPBiOC4lnU
+LzrcW8Of0Mw4Q
+LAoCMgjzUreJo
+LBCT7Ou3w//TQ
+LCY6WRiDZPkyQ
+LDMEpQwJgY.Mo
+LEIww.KkegBso
+LFQpfIh8kBStw
+LGF0vrNwa0MyU
+LHY.bIPCr1pP6
+LIfiPZ9HyP7b2
+LJUOyUYT7/h0o
+LK79Hd9MSCpns
+LL8rHf5wasz8E
+LMneiZPmGaKWA
+LNVAj83JmJOsY
+LOUqYm05xCb2E
+LPZbgHKnc0xrM
+LQMIk7Qf.ZtCs
+LR0a0tuihgAsY
+LSbt9SG8Y2rfI
+LT5bKcE1jkddM
+LUnNCqOOlMdbw
+LVxl5CFLdZpYs
+LW7jp8AWMUWgY
+LX7Ca/DpEPYsM
+LYQclfoG4tYkU
+LZuA4zAScblfQ
+M.SKrAxhD6dak
+M/TDcbjTrddX2
+M0zyxHYPeXi2s
+M16pxxjYKtZEA
+M2K8mRrdge1QU
+M3sFlS.eqcIHc
+M4Yxr8wUi.WDI
+M5DmnHNVTG73Y
+M6bzwuMFu29ok
+M7/AhwlvwTuGQ
+M88tUxnFU2S4w
+M9OGAyhVzLzIA
+MaQ/4x1U4/MK2
+MbiwOE4KpoNGQ
+McDfT.E0tlo46
+MdNR8c9pvrIho
+Me3DZyiLKwOYQ
+MfJJZ01x.wXBs
+MgV1j0HCs1UcE
+MhSRJ0nOtNsus
+MijCJVl9WoYTw
+MjHKz4C0Z0VCI
+MkO6qF1FZIItQ
+MlQ8OC3xHPIi.
+MmWbL6cJiRDbA
+MnscP0x6RNRwo
+Mo4BbD57XJI9U
+MpUosXWs.YTls
+Mq9xt5C8DjcLA
+Mr4/KyVcICu0g
+MsRvUI6LYAsQM
+MtZANfLX3peK2
+MuC9Xk2gpCNoE
+MvS5JOmdgocPA
+MwV8vcCiqrRbM
+Mx1lbGn.nkP8.
+MyNFy4KMREoZg
+MzE7JhgQTXSYQ
+MAt5eJnJk6JTI
+MBljuG.dW4gTE
+MCLI6g1QRmZdo
+MDrSol5RZx34w
+MEMJsUcgoKKwM
+MFfM20VMP7Tas
+MGfRtPzQZhD2Q
+MHPNxEa2WkNp.
+MI8JMpGqN/r2w
+MJmlODOuM3QxU
+MKMLcD69qK5FU
+MLM.0DCLqCqMA
+MMZHDBww0dk9o
+MNBGMAUvhELsg
+MO0owRx5ZtOpY
+MPcASb8NjZE5.
+MQGO990.8Fl.c
+MRZzirkQbIFEk
+MSy2JLpvOZqBA
+MTxEXgzIlcvpk
+MUVkgJzeNENs.
+MVutKwAb7rsTc
+MWmrRuZ7I1Cr.
+MX0tC7Y9TYWEk
+MYhWg5VCf/bwA
+MZn9oyu5LYqiA
+N.7KhXm3lB2xA
+N/vn99GGivIDQ
+N0tbCWOjll4GM
+N1oJihkAzvVI2
+N2xDE/UX29wtI
+N3Va22jxWuj6I
+N46CJdKWGw3wE
+N51p7v4bkcdC.
+N6n9JU.wmMGUk
+N7ucgg/YB7YQw
+N8AlJhWrsu7Pk
+N9uMdUYbg5YYQ
+Na3eD25AE5/zI
+NbqDBxZy0F.tE
+NcB3YSIzyraDg
+NdfnUQlyGm2j.
+NerNTazsaQYMY
+NfPfcBlZNAbH.
+NgFaue97KJPDc
+Nhwoht5xH8uvM
+NiT/5gqowisWo
+NjplNwXMzyH4.
+NkovQEZUPNjNA
+Nl7krfxBivS9o
+NmTd92xIhFa4.
+NnJk8wGHvJ08I
+NoFQMRgKMbAW.
+Npge08pfz4wuk
+NqGoN5uGxyGUM
+NrY6SYJddDZmI
+NsUmyZrs3XGbY
+Nt3AixExJlFZE
+NuBQNQed2c1sI
+NvD77wG0E2GW6
+NwylmbOt6cHpY
+NxTd.iBYruvMk
+Nyw78Skew.Rgo
+NzeaqLHIqxxWc
+NAmh31a3B0OVI
+NBZOG.ZwocXRs
+NCl4W1X/VxMQk
+NDQ5cBuOghoAY
+NEkkJMMvA.zYM
+NFy9PslWPh4Vo
+NGNBf5ixn0Tlc
+NH8dSl6BtGJgs
+NI6kjeu0Bu5OA
+NJtYXejekKXYk
+NKvGR0U/.B5ds
+NLmqM5pt3s6Xc
+NM6tn/SXvCuR6
+NNZu6HBN9n5/k
+NOwIXrpdwHbfc
+NPdxXkQWOAwLw
+NQNumTabnWTq.
+NRRq5Tde9vXi.
+NSGrGrrW8rwts
+NTAHlhFDwWOas
+NUjwAtbug62Vk
+NVrQpg0wIcPRw
+NWCX6cUfunBO2
+NXUEpstgk4Z2I
+NYl2Y5W6otjk2
+NZ0Ki/zcYqAvU
+O.PzrzUsQxi5I
+O/GGg47g3d5Gg
+O08Ofq.wvP9OY
+O1pxDP4ejorPY
+O26nQUAUM2vLA
+O3Z56gEVoDpqE
+O48wKobKjEAdc
+O5pfkUXbmLevg
+O6JjZs/u.zoYk
+O7Gh6LCq7eUlA
+O8TqYXh6GJoNg
+O9h4s2UUtAtok
+Oa5fH91gvZQw2
+ObkU3qX26j812
+Oc48KRqD1xE7s
+OdWswFIDIveiI
+OevK6sswhplDE
+Ofp.pD22zVJyY
+Og3jX/m6QDyO2
+Oh0HR4i95Ltcs
+OiO75nugpg0to
+Oj/V2up602f6M
+OkZVu4681QJL6
+OlSqxKTCN.v9k
+OmVSmV5zCNoKo
+On8witML8lans
+OoCt2vU3OWJn2
+OpSGpqG0stBAw
+OqYe5f3pNcSCM
+OrTzVhFFpktwg
+OszP9o1ict72M
+OtlUN5.ZPds3M
+Ou.RtGfHImtOQ
+OvrRmdQBnISNY
+Ow06fqHB6ysaA
+OxZUbztgH/YIM
+Oy6FGC2LNE6ao
+OzwYcz6c4YbuA
+OAD/QHZo4/7dc
+OBR6rxpSbHWBg
+OCuzEYy75SPGk
+ODB61KXGc5byc
+OEkufURo0wtpk
+OF0qoUu65QNi.
+OGnqGigeBbyJ6
+OHBn.WKL7Xtrc
+OIS/8vsvv865I
+OJINab17Xu3Mo
+OKqq1ib8XEv2E
+OLKdLTWns02ik
+OMyao/at64nVk
+ONHMD5XB/E8vk
+OOUkl0pE6GADw
+OPpKz1hnfe4NQ
+OQsWOlPvUfr2I
+ORiEWUtKweSYc
+OS3Gu2dfJ9LD.
+OTeYmOSHUGGAE
+OUsBz3OUjIHbU
+OVJdji.3/qRkw
+OW0QF2jvExGuA
+OX5Xo9IVTI15U
+OYWrsgtV0.OyM
+OZsT9FOX.QJ3.
+P.zUmptbzgojc
+P/n58kjIMf4Rs
+P0JuSCZWvBj4U
+P1pKa0fG5xHP2
+P2TBCwYriOvas
+P3BBcwCCih0vU
+P4u6ELVKiFG2o
+P5ENtSmla14FQ
+P6iWxs83PQuMU
+P7zoCUofE8GZo
+P8Ptk92sSGF82
+P9PHG1O/FNZeA
+PaPjMWpxq9MUk
+Pb.qWdt5IS/e.
+Pc1tl2aAwBPqc
+Pd5N67eKeX3oo
+PePpH3sRcEdno
+PfhQtIaXVNNv2
+PgKWVqJT/CPVU
+PhHYqSfV7I7R6
+PiSdhrD7nkuC2
+Pj2eZeE4CEzGY
+PkpCQ6v31evPQ
+PlGpWI7RquZKQ
+PmMo/L42APaZE
+PnDrGSnWThR02
+PoWvHTQWfZl9U
+PpfRzYsBuIk9c
+PqdEtpeoa./Ng
+Pr4XYhK.C.eos
+Ps90jNkUh3M3U
+PtzCIKoeoqu7s
+PuA4r68hfZ10g
+Pv3QGfWWgCDu6
+PwObn2NSdZRbg
+PxCgdmztDL5gs
+Py.Z3VRXrRE3k
+PzWE9Cx6GoV4w
+PAzNeZcFJV3Vk
+PBsFAH7mDBc5I
+PC1ijARWuO4hE
+PDHAf/4T4Dwdg
+PEeJZQYr7vnOo
+PFaTwxd6rlC0M
+PGW.dd9magG.k
+PHb4e19AzXB0A
+PIoip7Gq8M7wU
+PJKU49T1p9yk6
+PKm.AN46a3sfM
+PLV9x2sMA87qc
+PMlQSd8VrlIXw
+PNGa3oPd1.nmI
+PO.dWIDbKO6aY
+PPPTDkiCeu/jM
+PQyFAAHPD3vKs
+PRrBqvXRhTFh.
+PSL1o1zMHdUNY
+PTrV13OiJkpuU
+PUcb6SsMidNeQ
+PVzV2ID5WGOnk
+PWIdPD62BSS4w
+PXPGtxChLZM.I
+PYjbUOcvV8RjE
+PZNXNRCu2mYHM
+Q.4lhhAHPHjXU
+Q/HgozWYNTEEQ
+Q0n.n2BP3yj3k
+Q1oMWGqgPwe0k
+Q2otVZh9mviJg
+Q3eYKW6AjsUWU
+Q4sKIxRSoay2w
+Q5BF2xRtHrt06
+Q6OeF4nefmL2M
+Q7wR6DFTRluDU
+Q8WNlAKTBHANQ
+Q9jp0EYusm5eo
+Qa32OjQH/Auio
+QbYcc006Kso3E
+QcNNenrAns5FE
+QdQ/xnl2v877c
+Qe8kL2QmPWA3k
+QfNkX0IuuGwlA
+Qg4a/dq/.Q2Fk
+Qhi.8ZBVBBtuU
+QigdbimPProU6
+Qj4ktrI/C5JyE
+QkEVTbcnyRow2
+QlXLFge9JOgAw
+Qmi02eoUFKSg.
+QnTnriX3rMPB6
+QoH5hHfq83eu.
+Qpkm8APQNUdoI
+QqjgPLfXQD8Zk
+QrrTocjYyv74k
+Qs.bRxcRjGI4A
+QtTXLk8Xfkik.
+Quu1RjNScs85s
+QvQAzh3P6cYD.
+QwgfxNiQDR2zo
+Qx8wguS1lU08s
+QyPNeaIL9fYU2
+QzBi8W6DGi.6k
+QA/UDeseNrdL6
+QB34b5nkQ0bFY
+QCB3Ml8MktaOE
+QDMgL0W6TkfCA
+QEYLc0klINCJQ
+QFnhtyioVfBQs
+QGxOG7iX3lbLU
+QHFAQ0/gGjR.s
+QInjnV8WVW.Dw
+QJigSCLUnpuSo
+QKO95ePsuebPU
+QLxiz6npHzJjo
+QMaJlMrwicXQA
+QNj9ZeZ/yZA06
+QOsJ.AycZAcq2
+QPC40.c7Ub61o
+QQjYbirnCGD7A
+QRkUt2XC16XjA
+QS4GZP7LFu0bo
+QTtrP6f9CDawA
+QU8CAT6JPecW6
+QVMmapyOkhcj.
+QWOldZA7Qav4Y
+QXZx61KdaYegc
+QYKEXipUmnw2k
+QZXUDtW2Bp1AQ
+R.VmIlRHDEJlo
+R/McVzfTv8vVA
+R0gR8YgdKiAMc
+R1OOlsPiPE00A
+R2Xj0BGOvqQyc
+R35D0/z9D2V9U
+R4.vtUjBvXFEg
+R5VGGTdW8mSvA
+R6v9aY0rpc3w6
+R7e.FMGslpEEM
+R83yHD5JE8qIQ
+R9wH3j/qRxvAM
+Ra9QS3cXm0wrg
+RbRMuvpe3K2lU
+RcYKnUF5kUQFg
+RdI5p3ISo/dBA
+ReUJzjCd9kvgU
+RfXoiow5DLzyU
+Rg1x5oSHejW3I
+RhpfILsj4WjRU
+RixRVsTMonX5g
+RjKmEBcCR8EGs
+Rkd0fCwwn6ACw
+Rlvzp2Bq438Ws
+RmcXEvAkYAzus
+RnrYZzGOXo..6
+RoQKDZuwmCeMk
+RpEkiZ.c0UHGY
+RqWFny1SmHZTs
+RrqSyl1R9Owhc
+RsQvdHxiKcH5w
+RtZbv4PchTb1g
+RupJuoUbA4HyA
+RvDggAvAuHneg
+RwohkzA7pjViQ
+Rxyco0U0CmvH.
+RyzLhMvvHDgZQ
+RzHobAe.a/3.E
+RAbz4t5G6CMBs
+RBzctWbblM4PQ
+RC.tG7UTbWNPE
+RDhB9UK/Yy9UE
+REkFemOGb1iAU
+RFIAIrgS6/Tc2
+RGqTRYClWJ3uA
+RHPwDf4GF01iE
+RIGD9Ex/dV9RQ
+RJbh2eVpcL4wI
+RK4Vt3KZc.f4w
+RLt6lx54kW.TY
+RMHR7dBKnvPoo
+RN/Zk.JsUxnMo
+ROjOKNLVzEb7o
+RPKW3OxcBoAUw
+RQTKQq8eYyg6g
+RR8FWf6y7uMJA
+RSs/AeIofAcc.
+RTxFrITkhKQRQ
+RUDPrbadYt/dg
+RVxhyl3Jw.B.M
+RWb0hmJKY.qXo
+RXZvJtVa5KEd.
+RYELZid0GLFuo
+RZldHs786jH.k
+S.8fbCfmRQxow
+S/csmKR.LkEE2
+S0L0QnDTInef6
+S1wH636M66LWs
+S2r3mIoEDycLI
+S3UGsOF.PChY2
+S451H82iNlwqQ
+S5QlAyWgY2O9g
+S6OUIgS3KVnlQ
+S7lDEu6dGjWxs
+S8d1OLyaM2XoU
+S92NZPNp2lzwI
+SaIQ1RiNlnVxc
+SbZPjLAIycZyU
+ScRpgNPWh3biw
+SdlRy6w62boBE
+SeONYJNly1OC6
+Sf/rqvVc3Usvc
+SgyfdW3T6h0Yo
+ShuKpZV7v9akI
+SiYnqBkxiqWvo
+SjPCVdR9pFLD6
+SkOYlzHIxjxjA
+Sl4NKlXYkn.qs
+Sm6aBKtScod96
+SnXXjT3Omm3VI
+SoHxeeW5WrWG6
+SpOw6tizMsqOA
+SqClqSmcQkqT2
+SrmZ9buSJKlxk
+SsNjszdihy4q.
+StReH/tr.OhIE
+SuVQ4TTK7c3gE
+SvTvj3L9xC6E.
+SwvdR4/uouxTU
+SxLvMFN51I3oo
+SyTGdf8WV4yv2
+SznYsaQsmokRg
+SA01VjfokepR.
+SBavtCPaB/QLQ
+SCBuSkxsVh456
+SD.Gv.amOmPxA
+SEgSU5HqGseEs
+SFaeD526zZlAQ
+SG9215KiMdUcE
+SHA1gRjmWMnwg
+SIn0L7jHFHvM2
+SJavXo6YdEITo
+SK5cVenRu2ajY
+SLKAV/dsqSfhg
+SMi90SmqjYybA
+SNbUMVY9kKQpY
+SOUxTkjOxv2og
+SPcG6By6vc.jk
+SQb/gxZKGilN.
+SRR7lSOHAYhok
+SSi1glKdQJnsg
+ST4yxhm1KLHLQ
+SUpSjKfoD88is
+SVWRaOz3rjmGA
+SWT9S5of6iuXk
+SX4P4r5fNw3so
+SYvQd8O1A0Zyc
+SZ7GVibjHWy9U
+T.NTQPF7Q4Ios
+T/VEj.UfyP.Ak
+T0NR.Gbjaa7Gc
+T1X9ifbU9xALQ
+T2LiUlQ.CowBo
+T3AqtupMtxkt.
+T4ct0zmrfKxaA
+T5xpYag8nEKUc
+T6MGQqDua4yW6
+T70hL5XuIPyUg
+T8ylYcghEqK8w
+T9HkbL8orn3xk
+TalZXTpw1H39o
+TbqPeR3OQJdj.
+TcdICGbyTMoKg
+Tdk65jH0h5ayY
+Te.dKEP1Tav0c
+TfQHwsDXS7d7A
+TgYhzILiiThG2
+ThgMwd/LjMXJQ
+TiKCc.SabmTE2
+TjMGfVUTuoc3E
+Tk6qDgb/eb9pk
+Tl92XC4ELpRxA
+TmS5S8j/RyDds
+TnHKQlRCOABSM
+ToJ.b7heCorec
+Tpj73S22bStBU
+TqYyUPRRspKCw
+TrOblSuCYH8ic
+TsNInUhhgjEVM
+TtfLEfg4f.vR6
+TuptU6F1TtTYQ
+TvATuU0vTzyE.
+TwqLN.x8CxUqk
+Txz1Abok.kLDs
+Tyrd2AzcVmcU2
+Tzm040FYjuj7s
+TA/IEfFNTarCg
+TBE4xzjtrAxg6
+TC0D8dRsV2o8k
+TDs/PIcBHWvIA
+TEPizV8cFJ6YQ
+TFUz0h44GvAps
+TGya1gjhpZi82
+THMbMigabq1Bs
+TILD6mgDJ3zYo
+TJdd28.XTOGM2
+TK.r2KTgNNAMg
+TL35QMUfL9keo
+TMEAtnyO6zuQo
+TNbgs5SHfbOeE
+TOtM2LbCXW4XI
+TPLoa.pL/PZtQ
+TQx3WRHZhv1qI
+TRVkDSktnNAwA
+TS6SQtQUA5m3Q
+TTbmOLNZtgyz2
+TUYoJ02W.GvDM
+TVZDUgwBXpN1s
+TWSD3Q1UJR0X6
+TXHPtaOY15dJE
+TYVlO9aeSogv6
+TZTzMvZ4/HEbs
+U.IburbhEB4.k
+U/qrU6lzIx3VE
+U0ssZr0yZw6uE
+U1CiOcsWvfnyI
+U24KllRtBaCeE
+U3EgK9UgjP.TA
+U4s8uetYbmvDY
+U5ZeFo.qgmfxQ
+U6CjLveNVb5n.
+U7329MmBDQZsQ
+U8/qrB8lUH6Y.
+U9dt52rKRnva6
+UazqbqmqrFWjo
+Ub35pFC6SA/7s
+UcrGaLN2EM8RU
+Udz5GlrlvF4AU
+UeaaTXZ1LvmxE
+Ufg./1a5AGVJo
+UgWts2KZVpPtc
+UhjZrPGxqA446
+UicKWxLeisyG.
+UjAYDJ/Fd.7Qg
+UkQ2z/s0ysn4g
+UlAe9I2sqNJ.Y
+UmoFMgihHk.ic
+UnoHkGYv74KO.
+Uo115NH0hxadw
+UpG5D.JRp.el.
+UqUk7dNWtnMLY
+UrnbD4psNAOlc
+UsNzKe0MKEkaU
+UtoWIybejSsJM
+UupIlTuHy/wYk
+UvcRedzHIE9.c
+UwCCEaZPWherc
+UxiDZo1GyzcK.
+UygnNjh8YIdLE
+UzmQLi3fjL.J6
+UAbDU3A0F1XzE
+UBlhqMGI1iIe6
+UCNE4/948cbQA
+UDK03yLmpNCek
+UEmbRptN7fby6
+UFi8irSDmZgz6
+UGtNXA1ZrRBy2
+UHJqjf4gaXLyo
+UIgdRdoAL4rWo
+UJrzB7PEKHxzE
+UKzWtMD68dGiw
+UL0A8oBcEKkSY
+UMdfJbJYb1KzI
+UNESP4psC2NRw
+UOUmY5h6fvq6U
+UPkbIrYXkimjM
+UQpzrPi/wnUMA
+URfPPhbbuOafA
+USier/Lo/trNc
+UT7WKokcCngBY
+UUQzy/HZDBlds
+UVTCxG2O2F3uA
+UWtNBzcXiv2Qg
+UXtP6GTl.yja6
+UYMXijHR5MW42
+UZ8kfkzdGoYTQ
+V.Cj1d1d1kew2
+V/8Ir7Qn3gty.
+V0i2qcP0XCtQo
+V19MhDsvuswqk
+V2Ufqtn6XWUtI
+V3B3WzAQaWK3I
+V4D11EvjVgN6M
+V5lLY2UyeGp0A
+V6kLbqXksH6dU
+V79yRGP6zDoRg
+V8qXlGA8u.rcA
+V9wPexxvOnhIc
+VaSvKtRvolg5s
+VbT6V5mVm13MM
+VcKUk7cXx1s7c
+VdwId5T.bYNqM
+VeL9drN56GdoM
+VfRDtKAGIkVX6
+Vg4sD8/6ZPqpk
+VhvW4ftugflNE
+ViEf2XcUEeIio
+Vj3//Z7UVmuDI
+Vkedbdeq0kk7s
+Vlx1uaicSKKfI
+VmdUD7YJtSFUg
+Vn4RzGdp3Ip2Y
+VoVK2ziJ0s4.E
+Vp8tw1TxrX3so
+VqJi5bMy8Gg32
+VrCV.amoaC5AM
+Vsfg5w88cmoCM
+VtaSR4AWRsekk
+VuBlIF6Fdzsxw
+VvbrT5nJ9bciE
+VwQ.mGfhHu69w
+VxazU7NJekE9o
+VyTBOAi7DO0T.
+VzQ.sJeMI3SGM
+VA5WEetmxpZko
+VBc0EGbNynk4A
+VCJxC6luI3RVQ
+VDtMsA.7lGcqY
+VEGDd4Vbex8mE
+VFqovkJd8RPTo
+VGlYDcROpeovA
+VHzBv59fh4jbE
+VIsSD5LXPKxno
+VJgbzUiHmATwU
+VKLdvdq9BSnGc
+VLolUhMdXvlhE
+VMwdpe0GZEyUI
+VNVfyPIZL8WaY
+VO8RhrX/QqnUw
+VPZXpGCOXpj2M
+VQp2d9APaEDzs
+VR5zvFKotua2U
+VSVN.R6HwValI
+VTuEvr/mBkFsw
+VUjB99kC2IGws
+VVfUVYY40f.4.
+VWF3TMq17Z8no
+VXXked/n3NVes
+VYVqCVGdxP.aM
+VZGzudHoQEo2g
+W.JhKioelyP0c
+W/.DmNRsr4QlY
+W03IaiN3DKsCQ
+W1T/Df5UjNIaQ
+W2JkuUdeSbhwo
+W3Fo1SyCxXlD2
+W4goN16dZPCYM
+W57fgtehT/c2U
+W6XSfBSPvUDjk
+W7LukatJ/ZQvk
+W8vkGE1281V7o
+W9NKVzVgJ9kLM
+WaXoKL1d.N9cQ
+WbrLmGNGpuR2k
+WcfeS0cxMzOAE
+WdS5AWsAqoL/E
+WeC85YKh8/8..
+Wfa.rSckoeRMI
+WgsWSBSuSJgcw
+Wh7L2qsNGh2mM
+WiVrV96/SYzKM
+WjwOpfuB2pppo
+WkcvbfdmhFUX.
+WlJIjzvL6omNA
+WmrxZ8I.btks6
+Wnvxwi/7JQNJI
+Wo1Ebla3oJluw
+WpPYaXtHPTz/.
+WqfZMuz7GSCjU
+WrxJKr.2fLscw
+WshFE1bjQc41Y
+Wt/DCbdb5N1Mk
+WuL4ZfxZNivCI
+WvI/ObgF9Y9xQ
+WwAy1CFj3.IzM
+WxjdvMNOM1haU
+WyrAWnnPbtPy.
+WzP7ZlVY1J/qk
+WAEp/ysFzn6b6
+WBrqCQ7YFrcD.
+WCQYHZDYg0s7k
+WDLt.3atDkTQo
+WEhNE9BplLojs
+WFtL38g2y.mRw
+WGmyzAB7XwXlA
+WHohDk7Fol0xo
+WIMCw1Wn/BMr6
+WJaHIow78w.dc
+WKl8QgsIhXp0Y
+WLqwRSuqaXKD6
+WMaEFvCFEFplI
+WN66ZBzDfRRXE
+WOeqqrPFcHEoA
+WP8X3IVrEYVLk
+WQgGKQy1UOurA
+WRJuxN07h2eHI
+WS91J/cW57Lls
+WT5QC8NDUKXTo
+WUyNK.3Rsr/no
+WViI0QcNGzlyg
+WW/ph8h2o5YUc
+WXvvG0CWY7v5I
+WYx5hUKrvAfSs
+WZYBUyiH/ZxpY
+X.OPW8uuoq5N.
+X/HKcwl.El9rQ
+X0aJ0mHdTITlI
+X1IuTFvUP3Z7I
+X2ylQn7XyjAjc
+X3ebVz1FFcmLc
+X4S2KE58lWPG2
+X5.ejkiQdxbLw
+X6oGAIGLrLHSg
+X7YddAvpnB3hU
+X8/ymjfQQgVCo
+X9hVaE9J8ESpw
+XadO316dKZMns
+Xbs.myqnmA.bI
+Xch.R7Gsvr9PU
+XdQLWWoEyQmsg
+Xe0TDR1FVUM4s
+Xf6yM6qOQK84A
+XgU0jTY1f/EME
+XhTELR7sG09PA
+XiUKxD38z6daY
+XjNc5T/HsUSwU
+XkxTc9l8qSYDY
+Xl/4mx4ZrQ.SQ
+XmlGIW58Le5MM
+Xn88a2PfMQTvU
+XoEeDNlu/LMos
+Xp7fKf8gFYoMc
+XqtEuXhwqnqM.
+XrN/XA.FNTQ9.
+XsUqFR11hyh/2
+XtAHY1FRx.tMg
+XuT2vUIRQ8lwI
+XvPTDCFeXUED2
+XwvNWMMV1WQjo
+XxaTryFCCM1UU
+Xy2PtsPf0839Y
+XzxaQei6hAl2U
+XA3za.ryQoLxE
+XBS6rOZiohf3U
+XCwqAgedErGOA
+XDSweXtd0QNu.
+XEC/9QJZ4nSn2
+XFHeQSH9WDUUw
+XGM5Y/5w2wFdg
+XHhL7YsiQ1CSY
+XI/GtimshJTRE
+XJdsGifK2g5ig
+XK5iZSYjUUVuY
+XL0pOJWay9kOk
+XMeaQ8Oyt6kOg
+XNykDJhJXXI8c
+XOAibvr1B077k
+XPJHS24h43qBw
+XQUlRKYcbuS86
+XRGAlDcWAnjks
+XSkABeIiNxsfA
+XTHBOShYlf3xw
+XUVtu8NHvZKwE
+XVVIr4YlVgEEE
+XWY0iySw5BtkY
+XXq2wKiyI43A2
+XYGpusIMIT/IM
+XZiWg5DYnCHCM
+Y.mXtv3pggJ9U
+Y/dZrJnO05U3k
+Y0TVVr8vSLApg
+Y165fqHXLdop2
+Y26/LL5Oo0GYw
+Y3SweJ/ObxNqs
+Y4QKmsbqw8ABE
+Y54uR3OdTNheo
+Y6wQciYNMq2Cs
+Y7mVtdV.zWazc
+Y8eErKzJGtPS.
+Y9W9q5MFCAZWs
+YakLfsnNUgTYA
+YbJ6atRSvuw6E
+YcDZyi6mZNP.c
+YdVCYrqjOUpmA
+YeVmIKVNvij7Q
+Yf2jZTeNCxJVA
+Yg4nXl2JerV6E
+Yh2viyGlWuhQ2
+Yieu7JdXzEXio
+YjrdXlCUd5CI2
+YkZTNIboTMYE2
+Ylbtj.H5/yBfE
+YmwhP33gTK41E
+YnaVCVqN4gUPo
+Yoewi7u201B2.
+YpARwXMvDzHy2
+Yq7.SWYAYcBZY
+YrnMnsTH1xTMg
+Ysj05wnRZVpXU
+Yt4GrCSrhDzO.
+YuBTPqxwN/o/k
+YvbxjzNTCEaZQ
+Ywhcv0PMLVW5.
+YxrbCLzn4W83U
+YySNBbemZW8pI
+Yzo2wiHwFmHaU
+YAsIdyZPQf712
+YBXxrHv6uS9Xw
+YCoODQN9SCzBI
+YDgPa.WUDLqp.
+YEtn3alvdCT9Y
+YFf0/OmVZz6tQ
+YGsaiU9T60giQ
+YHDYtw2tBexlc
+YIH14pBTDJvJ6
+YJubb2MiV65TM
+YKU9xym3zeZW.
+YLcwFifGwPRS6
+YMPn8/3/iy6as
+YN.fFo8k9j6m2
+YO6No2FIkvxqU
+YPXELbkShGvqg
+YQyhPgG7w5s3s
+YRXY5KZ9YUgCE
+YSEjrNbvAtDAs
+YTL7QI65yNVAs
+YUQt65m8tQNus
+YVwpNED666.EY
+YWgM.k2/8deGM
+YXpWAIxBKjHr2
+YYh70/cT1TWEU
+YZ5FNoOzoKNmg
+Z.PgLzdzPW.ro
+Z/MdVDc4Vewqs
+Z0wI8qkuzyv22
+Z1MgYscNLv8VA
+Z2tQc0Ewto0c.
+Z35jyNrF5YVu6
+Z4Y3UxCSAu8pU
+Z5z56YtO4noR2
+Z6lLnJthXSYdU
+Z7hB5Cc15fdl2
+Z8Y6oRb/Ry6ws
+Z9x7Z2ipwW3t2
+ZarhgKphQ96.g
+Zb3YmLoy6IM2A
+ZcrEPysjigdQQ
+Zd8WtXJMMvbuQ
+ZeNZsFJ14yGqQ
+ZfKs0WFHZO0iQ
+ZgRwFz8hIoyXs
+ZhtwK5rOFvNqM
+Zig5XmKtFkF.o
+Zjd9iPNndkMWg
+ZkBU1xq4FHwVU
+ZlxaqKsG0BG3k
+Zm6vkCMyuUviM
+Zn5PyD8wCYltw
+ZoPAp4EhfC..M
+ZpOYNH4Bnt5Ek
+ZqwEk7mwPRq4.
+ZrklQ/HdMFK8w
+ZssO.41FO5Nlg
+ZtlgiXnRUYPHQ
+ZuS6D1g4iZCiU
+ZvA/X0HKF8wb.
+Zw5ASE2m9mn6Q
+ZxnjglVvhlyeM
+ZyGELw81iUBlQ
+ZziFATVXHo2.6
+ZAaechRqjH/AI
+ZB7yqPUHvNnmo
+ZCZaqhpo0jW7Q
+ZD3yxA4N/XZVg
+ZE74LAGWQ7Nk2
+ZF2JopHQ3C64M
+ZGMYp/wiHi5FQ
+ZH1Lxn1bE.b6k
+ZIXt0E7AewSr2
+ZJOl.OKpfJDj2
+ZKGvcl5c9C/uM
+ZLNxvzAFRu.ac
+ZMsSnfjBzNT3A
+ZNlvws1XtZpQE
+ZOb9qQRD8CKi6
+ZP1RzcrCEfjKk
+ZQg7C2q0JBCJU
+ZRQG7rv8uOLAo
+ZSPNdQKgnoC5I
+ZTX55YrvOa44c
+ZUfVzd3ZVL.U.
+ZVp4KX5dOnvaw
+ZWbNHVx9raLhk
+ZX4wrJEgKLn8s
+ZYDibVNtdFt.6
+ZZKRwXSu3tt8s
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
index 6c13eb8..8d6a286 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/TestCaseUtils.java
@@ -45,6 +45,7 @@
import java.net.ServerSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
+import java.net.Socket;
import org.opends.server.backends.MemoryBackend;
import org.opends.server.backends.jeb.BackendImpl;
@@ -61,6 +62,12 @@
import org.opends.server.loggers.debug.DebugLogger;
import org.opends.server.plugins.InvocationCounterPlugin;
import org.opends.server.protocols.internal.InternalClientConnection;
+import org.opends.server.protocols.asn1.ASN1Reader;
+import org.opends.server.protocols.asn1.ASN1Writer;
+import org.opends.server.protocols.asn1.ASN1OctetString;
+import org.opends.server.protocols.ldap.BindRequestProtocolOp;
+import org.opends.server.protocols.ldap.LDAPMessage;
+import org.opends.server.protocols.ldap.BindResponseProtocolOp;
import org.opends.server.tools.LDAPModify;
import org.opends.server.types.DN;
import org.opends.server.types.FilePermission;
@@ -75,6 +82,7 @@
import org.opends.server.util.ModifyDNChangeRecordEntry;
import static org.testng.Assert.*;
+import static org.testng.Assert.assertEquals;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
@@ -787,6 +795,40 @@
+ public static boolean canBind(String dn, String pw) throws Exception
+ {
+ // Check that the user can bind.
+ Socket s = null;
+ try {
+ s = new Socket("127.0.0.1", TestCaseUtils.getServerLdapPort());
+ ASN1Reader r = new ASN1Reader(s);
+ ASN1Writer w = new ASN1Writer(s);
+ r.setIOTimeout(3000);
+
+ BindRequestProtocolOp bindRequest =
+ new BindRequestProtocolOp(
+ new ASN1OctetString(dn),
+ 3,
+ new ASN1OctetString(pw));
+ LDAPMessage message = new LDAPMessage(1, bindRequest);
+ w.writeElement(message.encode());
+
+ message = LDAPMessage.decode(r.readElement().decodeAsSequence());
+ BindResponseProtocolOp bindResponse = message.getBindResponseProtocolOp();
+ if (bindResponse.getResultCode() == 0) {
+ return true;
+ }
+ } catch (Exception t) {
+ t.printStackTrace();
+ } finally {
+ if (s != null) {
+ s.close();
+ }
+ }
+ return false;
+ }
+
+
/**
* Adds the provided entry to the Directory Server using an internal
* operation.
@@ -889,6 +931,8 @@
+
+
/**
* Creates a temporary text file with the specified contents. It will be
* marked for automatic deletion when the JVM exits.
@@ -1044,6 +1088,29 @@
return new String(bytes);
}
+ /**
+ * Returns the contents of file as a List of the lines as defined by
+ * java.io.BufferedReader#readLine() (i.e. the line terminator is not
+ * included). An ArrayList is explicitly returned, so that callers know that
+ * random access is not expensive.
+ */
+ public static ArrayList<String> readFileToLines(File file)
+ throws IOException {
+ BufferedReader reader =
+ new BufferedReader(
+ new InputStreamReader(
+ new DataInputStream(
+ new FileInputStream(file))));
+
+ ArrayList<String> lines = new ArrayList<String>();
+ String line;
+ while ((line = reader.readLine()) != null) {
+ lines.add(line);
+ }
+
+ return lines;
+ }
+
/**
* Read the contents of a file and return it as a String.
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CryptPasswordStorageSchemeTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CryptPasswordStorageSchemeTestCase.java
new file mode 100644
index 0000000..383391a
--- /dev/null
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/CryptPasswordStorageSchemeTestCase.java
@@ -0,0 +1,67 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+package org.opends.server.extensions;
+
+
+
+import org.opends.server.api.PasswordStorageScheme;
+
+
+
+/**
+ * A set of test cases for the salted MD5 password storage scheme.
+ */
+public class CryptPasswordStorageSchemeTestCase
+ extends PasswordStorageSchemeTestCase
+{
+ /**
+ * Creates a new instance of this storage scheme test case.
+ */
+ public CryptPasswordStorageSchemeTestCase()
+ {
+ super("cn=Crypt,cn=Password Storage Schemes,cn=config");
+ }
+
+
+
+ /**
+ * Retrieves an initialized instance of this password storage scheme.
+ *
+ * @return An initialized instance of this password storage scheme.
+ *
+ * @throws Exception If an unexpected problem occurs.
+ */
+ public PasswordStorageScheme getScheme()
+ throws Exception
+ {
+ CryptPasswordStorageScheme scheme =
+ new CryptPasswordStorageScheme();
+ scheme.initializePasswordStorageScheme(null);
+ return scheme;
+ }
+}
+
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordStorageSchemeTestCase.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordStorageSchemeTestCase.java
index 22de6cf..c19418b 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordStorageSchemeTestCase.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/extensions/PasswordStorageSchemeTestCase.java
@@ -36,15 +36,25 @@
import org.opends.server.api.PasswordStorageScheme;
import org.opends.server.config.ConfigEntry;
import org.opends.server.core.DirectoryServer;
+import org.opends.server.core.PasswordPolicy;
+import org.opends.server.core.ModifyOperation;
import org.opends.server.protocols.asn1.ASN1OctetString;
+import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.schema.AuthPasswordSyntax;
import org.opends.server.schema.UserPasswordSyntax;
import org.opends.server.types.ByteString;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.ResultCode;
+import org.opends.server.types.Modification;
+import org.opends.server.types.ModificationType;
+import org.opends.server.types.Attribute;
import static org.testng.Assert.*;
+import static org.testng.Assert.assertEquals;
+import java.util.ArrayList;
/**
@@ -220,13 +230,117 @@
}
+ @DataProvider
+ public Object[][] passwordsForBinding()
+ {
+ return new Object[][]
+ {
+ // In the case of a clear-text password, these values will be shoved
+ // un-excaped into an LDIF file, so make sure they don't include \n
+ // or other characters that will cause LDIF parsing errors.
+ // We really don't need many test cases here, since that functionality
+ // is tested above.
+ new Object[] { new ASN1OctetString("a") },
+ new Object[] { new ASN1OctetString("abcdefgh") },
+ new Object[] { new ASN1OctetString("abcdefghi") },
+ };
+ }
+
+ /**
+ * An end-to-end test that verifies that we can set a pre-encoded password
+ * in a user entry, and then bind as that user using the cleartext password.
+ */
+ @Test(dataProvider = "passwordsForBinding")
+ public void testSettingEncodedPassword(ASN1OctetString plainPassword) throws Exception
+ {
+ // Start/clear-out the memory backend
+ TestCaseUtils.initializeTestBackend(true);
+
+ boolean allowPreencodedDefault = setAllowPreencodedPasswords(true);
+
+ try {
+ PasswordStorageScheme scheme = getScheme();
+ ByteString schemeEncodedPassword =
+ scheme.encodePasswordWithScheme(plainPassword);
+
+ //
+ // This code creates a user with the encoded password,
+ // and then verifies that they can bind with the raw password.
+ //
+
+ Entry userEntry = TestCaseUtils.makeEntry(
+ "dn: uid=test.user,o=test",
+ "objectClass: top",
+ "objectClass: person",
+ "objectClass: organizationalPerson",
+ "objectClass: inetOrgPerson",
+ "uid: test.user",
+ "givenName: Test",
+ "sn: User",
+ "cn: Test User",
+ "ds-privilege-name: bypass-acl",
+ "userPassword: " + schemeEncodedPassword.stringValue());
+
+ // Add the entry
+ TestCaseUtils.addEntry(userEntry);
+
+ assertTrue(TestCaseUtils.canBind("uid=test.user,o=test",
+ plainPassword.stringValue()),
+ "Failed to bind when pre-encoded password = \"" +
+ schemeEncodedPassword.stringValue() + "\" and " +
+ "plaintext password = \"" +
+ plainPassword.stringValue() + "\"");
+ } finally {
+ setAllowPreencodedPasswords(allowPreencodedDefault);
+ }
+ }
+
+
+ /**
+ * Sets whether or not to allow pre-encoded password values for the
+ * current password storage scheme and returns the previous value so that
+ * it can be restored.
+ *
+ * @param allowPreencoded whether or not to allow pre-encoded passwords
+ * @return the previous value for the allow preencoded passwords
+ */
+ private boolean setAllowPreencodedPasswords(boolean allowPreencoded)
+ throws Exception
+ {
+ // This code was borrowed from
+ // PasswordPolicyTestCase.testAllowPreEncodedPasswordsAuth
+ boolean previousValue = false;
+ try {
+ DN dn = DN.decode("cn=Default Password Policy,cn=Password Policies,cn=config");
+ PasswordPolicy p = DirectoryServer.getPasswordPolicy(dn);
+ previousValue = p.allowPreEncodedPasswords();
+
+ String attr = "ds-cfg-allow-pre-encoded-passwords";
+
+ ArrayList<Modification> mods = new ArrayList<Modification>();
+ mods.add(new Modification(ModificationType.REPLACE,
+ new Attribute(attr, ""+allowPreencoded)));
+
+ InternalClientConnection conn =
+ InternalClientConnection.getRootConnection();
+ ModifyOperation modifyOperation = conn.processModify(dn, mods);
+ assertEquals(modifyOperation.getResultCode(), ResultCode.SUCCESS);
+
+ p = DirectoryServer.getPasswordPolicy(dn);
+ assertEquals(p.allowPreEncodedPasswords(), allowPreencoded);
+ } catch (Exception e) {
+ System.err.println("Failed to set ds-cfg-allow-pre-encoded-password " +
+ " to " + allowPreencoded);
+ e.printStackTrace();
+ throw e;
+ }
+
+ return previousValue;
+ }
/**
* Retrieves an initialized instance of this password storage scheme.
*
- * @param configEntry The configuration entry for the password storage
- * scheme, or <CODE>null</CODE> if none is available.
- *
* @return An initialized instance of this password storage scheme.
*
* @throws Exception If an unexpected problem occurs.
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/util/TestCrypt.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/util/TestCrypt.java
new file mode 100644
index 0000000..986c578
--- /dev/null
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/util/TestCrypt.java
@@ -0,0 +1,281 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2007 Sun Microsystems, Inc.
+ * Portions Copyright 2007 Brighton Consulting, Inc.
+ */
+package org.opends.server.util;
+
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import org.opends.server.TestCaseUtils;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * This class defines a set of tests for the
+ * {@link org.opends.server.util.Crypt} class.
+ */
+@Test(groups = { "slow" }) // Make them slow, since they are unlikely to break and since there are 4K+ they can take a while
+public final class TestCrypt extends UtilTestCase {
+ private Crypt crypt = new Crypt();
+
+ /**
+ * Crypt valid test data provider. All crypts are variants of the password
+ * "password".
+ *
+ * @return Returns an array of all salted version of "password".
+ */
+ @DataProvider
+ public Object[][] passwordWithAllSalts() throws Exception {
+ File cryptFile = TestCaseUtils.getTestResource("password-with-all-crypt-salts.txt");
+ List <String> cryptedPasswords = TestCaseUtils.readFileToLines(cryptFile);
+
+ // Convert the passwords list into the 2D array needed expected by
+ // DataProviders
+ String[][] passwordArgs = new String[cryptedPasswords.size()][];
+ for (int i = 0; i < cryptedPasswords.size(); i++) {
+ passwordArgs[i] = new String[]{cryptedPasswords.get(i)};
+ }
+
+ return passwordArgs;
+ }
+
+ /**
+ * Tests the encryption of "password" against all possible salts.
+ * Because the salt is part of the crypt'ed password parameter, the
+ * single parameter serves as an input parameter (the salt at the
+ * start of the parameter), as well as to validate that the parameter
+ * was properly encrypted.
+ *
+ * @param saltedPassword
+ * A hashed value of "password".
+ */
+ @Test(dataProvider = "passwordWithAllSalts")
+ public void testAllSalts(String saltedPassword) throws Exception
+ {
+ validateCryptedPassword("password", saltedPassword);
+ }
+
+ // Passowrds and their corresponding crypt values for various salts.
+ // These were generated using the crypt() implementation in Perl.
+ private static final Object[][] PASSWORDS_AND_CRYPTS = {
+ {"", "AEypjPqkpWrm."},
+ {"", "DEkEMk50GlpvQ"},
+ {"", "SeF2s6N.rrxzE"},
+ {"", "seGYEzzfNS6p6"},
+ {"", "76gkheUg6SU6g"},
+ {"", "02oawyZdjhhpg"},
+ {"", "05/lfLEyErrp2"},
+ {"1", "AEycSgLoZE2NU"},
+ {"1", "DEcGEo4stCwKU"},
+ {"1", "Selkb/5Kk.a5U"},
+ {"1", "sexFKbViIp1BM"},
+ {"1", "76PZeYZkUIiJY"},
+ {"1", "02g/Is9QzZ59."},
+ {"1", "05Nc5lRLZkOL2"},
+ {"12", "AEo9g/hrWcroY"},
+ {"12", "DEhWm60GBm51E"},
+ {"12", "SeC1ub4/n1onQ"},
+ {"12", "seLOcGzRFXQ8A"},
+ {"12", "76RWqjxIlxH.s"},
+ {"12", "02Yg9V0ugcDK2"},
+ {"12", "05YvAHbiMsS/s"},
+ {"123", "AEeiDhPbE8FZA"},
+ {"123", "DEDUHYzEvFtCg"},
+ {"123", "SeKFH3Nooq92c"},
+ {"123", "seu.8HpuOxyTU"},
+ {"123", "76t8XtqAiQew2"},
+ {"123", "025QwM9.cl3TU"},
+ {"123", "05pundxrmpCa."},
+ {"1234", "AENOqZDrZtpEA"},
+ {"1234", "DE.28cJyrukGE"},
+ {"1234", "SedVHY1MtpuW."},
+ {"1234", "seUc7O/85EPvQ"},
+ {"1234", "76bHlu4JyJ4UU"},
+ {"1234", "02YlX9ogYhIOw"},
+ {"1234", "05pGklGDVsooY"},
+ {"12345", "AEsOUkNAVAV/k"},
+ {"12345", "DEa555/OS0gCw"},
+ {"12345", "Sevs2NnMDrR52"},
+ {"12345", "seWfr4VdeLxO."},
+ {"12345", "76fEe.ryflQn."},
+ {"12345", "02oa0q9I0b8YI"},
+ {"12345", "05pIZ2uxl1Oxc"},
+ {"123456", "AElA7SvR5BWYs"},
+ {"123456", "DERqDk0hJcemI"},
+ {"123456", "SeEsHpRQ3Ws4Y"},
+ {"123456", "seldpJxxtvI7E"},
+ {"123456", "76odHJ.uJuNlM"},
+ {"123456", "0274Bl5Z.iP8A"},
+ {"123456", "050o6La.i0hjQ"},
+ {"1234567", "AEvQ6nKFdz1/Q"},
+ {"1234567", "DEqKJFIOJAeP2"},
+ {"1234567", "SeevFxkmw4OPM"},
+ {"1234567", "seKgNYFPEl0YU"},
+ {"1234567", "76Q7Ud2dSYUyY"},
+ {"1234567", "02FYf5CcW.z9Y"},
+ {"1234567", "053NyeyMsGY3M"},
+ {"12345678", "AESEqSznA5e5o"},
+ {"12345678", "DE0gVuzpcrIb2"},
+ {"12345678", "Sev2LR/CJDCXo"},
+ {"12345678", "seXUEz1n7cRRY"},
+ {"12345678", "76fpN4iZgIRE2"},
+ {"12345678", "0291YyAhKiURA"},
+ {"12345678", "05tb4hpIF2mIE"},
+ {"123456789", "AESEqSznA5e5o"},
+ {"123456789", "DE0gVuzpcrIb2"},
+ {"123456789", "Sev2LR/CJDCXo"},
+ {"123456789", "seXUEz1n7cRRY"},
+ {"123456789", "76fpN4iZgIRE2"},
+ {"123456789", "0291YyAhKiURA"},
+ {"123456789", "05tb4hpIF2mIE"},
+ {"1234567890", "AESEqSznA5e5o"},
+ {"1234567890", "DE0gVuzpcrIb2"},
+ {"1234567890", "Sev2LR/CJDCXo"},
+ {"1234567890", "seXUEz1n7cRRY"},
+ {"1234567890", "76fpN4iZgIRE2"},
+ {"1234567890", "0291YyAhKiURA"},
+ {"1234567890", "05tb4hpIF2mIE"},
+ {"!@#0^&*", "AEs3QeaYDQTJE"},
+ {"!@#0^&*", "DE9RJdfpk3gEM"},
+ {"!@#0^&*", "SeF/SBOVIQgbM"},
+ {"!@#0^&*", "seyp8Lbs6DyRc"},
+ {"!@#0^&*", "76vSuJ/ho1RxE"},
+ {"!@#0^&*", "02i4O5873w8G6"},
+ {"!@#0^&*", "05.ep5H/6Gb/Q"},
+ {"()_+-=[]", "AE2JFPze7oG2s"},
+ {"()_+-=[]", "DE77ctMC0YTs6"},
+ {"()_+-=[]", "Se5tUe6lyM2nE"},
+ {"()_+-=[]", "sehWSNixuAffY"},
+ {"()_+-=[]", "76v/azh6t29QA"},
+ {"()_+-=[]", "02.j5xgLpYyto"},
+ {"()_+-=[]", "053cNRDrF.GOs"},
+ {"{}\\:;\"'<", "AEnWr4wYnt/Sg"},
+ {"{}\\:;\"'<", "DEveQ9wxQrdfQ"},
+ {"{}\\:;\"'<", "Se6LMgmv4jYSw"},
+ {"{}\\:;\"'<", "se4Lmhm8eCYvk"},
+ {"{}\\:;\"'<", "76vVkpMqk8MPc"},
+ {"{}\\:;\"'<", "024d3tyjpySTc"},
+ {"{}\\:;\"'<", "057OTKpDRH1yk"},
+ {",>.?/`~", "AEu8PanMV4Yos"},
+ {",>.?/`~", "DEfL4O2tY1pbQ"},
+ {",>.?/`~", "Se1o/Ln0pz53s"},
+ {",>.?/`~", "sevdxlNkzBC9s"},
+ {",>.?/`~", "76Oe5rgApyjqQ"},
+ {",>.?/`~", "02gwWt.cN0ZW2"},
+ {",>.?/`~", "05TkTNlUHKj0o"},
+ {"abcdefgh", "AE5sk6ZnF2ne6"},
+ {"abcdefgh", "DEgNPea/fV7o6"},
+ {"abcdefgh", "SeveLGJNvFGqo"},
+ {"abcdefgh", "seoDbs8R1TfGs"},
+ {"abcdefgh", "76OgHaEBgUoY6"},
+ {"abcdefgh", "02YewT6mKnbtc"},
+ {"abcdefgh", "05SENcp2oS3N2"},
+ {"ijklmnop", "AElKD7vOnptw2"},
+ {"ijklmnop", "DEpcYg28J1nGY"},
+ {"ijklmnop", "SemEov1ZT2QeA"},
+ {"ijklmnop", "sed20nQs9.5QU"},
+ {"ijklmnop", "76fgwIPFi/Yxw"},
+ {"ijklmnop", "02xnTfvOZm1Fw"},
+ {"ijklmnop", "053/TROBqFM5A"},
+ {"qrstuvwx", "AEcIntiaWvH4U"},
+ {"qrstuvwx", "DEjMRKWIS8RcE"},
+ {"qrstuvwx", "Sedkn.517oB1Q"},
+ {"qrstuvwx", "se7WusSyMU74A"},
+ {"qrstuvwx", "76KwGhfk1D9.o"},
+ {"qrstuvwx", "02NBEYIkvCEDw"},
+ {"qrstuvwx", "05WDiAK7932VI"},
+ {"yzABCDEF", "AEuBybr3w07MU"},
+ {"yzABCDEF", "DEnh3Aa09jH5c"},
+ {"yzABCDEF", "SeES5RpbP6IBg"},
+ {"yzABCDEF", "sepW867O5DecA"},
+ {"yzABCDEF", "76fkw0n09AlVY"},
+ {"yzABCDEF", "02b4yKXa2Ezmg"},
+ {"yzABCDEF", "05CwQ5.PMAOiw"},
+ {"GHIJKLMN", "AEdma.Wd8OVuc"},
+ {"GHIJKLMN", "DEvyOA86U40Yw"},
+ {"GHIJKLMN", "Se3i1.wK7SvFw"},
+ {"GHIJKLMN", "sey8LKM8jnnnY"},
+ {"GHIJKLMN", "76eFLLP7Y4z2g"},
+ {"GHIJKLMN", "02tr7rNC/2zeU"},
+ {"GHIJKLMN", "0527iVLJRmBz6"},
+ {"OPQRTSTU", "AEzOvkB5zDp2o"},
+ {"OPQRTSTU", "DE6epaIuO/6Xw"},
+ {"OPQRTSTU", "SemZ8Rw5UkXW2"},
+ {"OPQRTSTU", "seD6BA6YFbqhg"},
+ {"OPQRTSTU", "76/WPs6GC5pOU"},
+ {"OPQRTSTU", "020T4ievozzgU"},
+ {"OPQRTSTU", "05d/UmYKRWeME"},
+ {"VWXYZ", "AE.Wv.eqyQmso"},
+ {"VWXYZ", "DEM/AU49DMri2"},
+ {"VWXYZ", "Se26LxmPj52qM"},
+ {"VWXYZ", "sefTLuF2.KvE."},
+ {"VWXYZ", "76qVtYProZCDA"},
+ {"VWXYZ", "02HY6XzgJWEIU"},
+ {"VWXYZ", "051moQVL2PkfU"},
+
+ // Some non-ascii tests
+ {"\u00C4", "CyaE7.kWcy.fs"}, // \xC3\x84 in UTF-8
+ {"\u00C5", "AEUV1DMPEIDnA"}, // \xC3\x85 in UTF-8
+ {"\u00C7", "AEpWNQaF3IUno"}, // \xC3\x87 in UTF-8
+ {"\u2020", "AEboIqjs64Y0U"}, // \xE2\x80\xA0 in UTF-8
+ {"\u00BF", "AE35zYeBlLaTs"}, // \xC2\xBF in UTF-8
+ {"\u02C7", "AE0WyV2GLggXI"}, // \xCB\x87 in UTF-8
+ {"\uF8FF", "AEa0xrpV1JyiA"}, // \xEF\xA3\xBF in UTF-8
+ };
+
+ @DataProvider
+ public Object[][] passwordsAndCrypts() {
+ return PASSWORDS_AND_CRYPTS;
+ }
+
+ /**
+ * Tests various clear-text passwords and a corresponding crypt value.
+ * We use the salt from the cryptedPassword so that we can regenerate
+ * the same crypted value.
+ */
+ @Test(dataProvider = "passwordsAndCrypts")
+ public void testVarious(String clearPassword, String cryptedPassword) throws Exception
+ {
+ validateCryptedPassword(clearPassword, cryptedPassword);
+ }
+
+ private void validateCryptedPassword(String clearPassword, String cryptedPassword) throws Exception
+ {
+ byte[] pw = clearPassword.getBytes("UTF-8");
+ byte[] s = cryptedPassword.getBytes("UTF-8");
+
+ // The first two bytes of the saltedPassword are used as the salt,
+ // so the bytes that we get back from this should be
+ byte[] r = crypt.crypt(pw, s);
+
+ String st = new String(r, "UTF-8");
+ Assert.assertEquals(st, cryptedPassword);
+ }
+}
+
+
--
Gitblit v1.10.0