Re: (ITS#5354) slapd repeatedly hangs and stops reponding
by orenl@cs.columbia.edu
Russ Allbery wrote:
> Oren Laadan <orenl(a)cs.columbia.edu> writes:
>> Russ Allbery wrote:
>>> orenl(a)cs.columbia.edu writes:
>
>>>> Our configuration uses both BDB and META back-ends; as it turns out
>>>> the standard debian package of LDAP fails to run with the META
>>>> back-end configured (see also complaints here:
>>>> http://www.openldap.org/lists/openldap-bugs/200705/msg00011.html and
>>>> here: http://arkiv.netbsd.se/?ml=OpenLDAP-bugs&a=2007-02&t=3076794).
>
>>> Yeah, we're still trying to figure out the best way to fix that.
>>> libtool has some serious problems with how it handles namespaces when
>>> dynamically loading modules, and fixing one set of problems creates a
>>> separate set of problems. (This particular problem is Debian-specific
>>> and not a problem with the upstream OpenLDAP.)
>> :(
>>
>> Well, the good news is that it isn't a show-stopper, and the simple
>> workaround is to compile the code from scratch.
>
> Specifically, the workaround is to compile the code with the upstream
> libtool instead of with Debian's libtool, since upstream libtool imports
> all module symbols into the global namespace. Debian's libtool has been
> modified to not do this because it causes all sorts of other problems in
> the general case, but not doing this breaks the meta backend because it
> wants to reference symbols from the bdb backend.
>
> Steve had an ugly hack to work around this by linking the meta backend
> against the bdb backend. Doing that isn't the ugly part -- that's
> actually formally correct and really is what libtool should be doing in
> the first place. The ugly part is that libtool *really* doesn't like
> linking against something that doesn't start with lib*.
>
>> What's really bothering me, is that the system repeatedly and frequently
>> hangs with my configuration ... (my users aren't happy with me
>> recently). Do you have any idea how to investigate that ?
>
> Not beyond the standard advice to investigate what the server is doing
> during a hang using gdb attach or strace.
done that. couldn't find anything interesting: some threads where
waiting in some posix-threads related place (most of them were in
thread-join if I recall correctly).
as I'm not familiar with ldap implementation, was hard to just dive
in without prior knowledge.
note that the problems happens becomes more acute when I set the
"idle_timeout" to 30 seconds; the system is much more tolerant when
it isn't set.
>
> We have yet to have a chance to do intensive testing of 2.4.7. (Debian
> testing really is a testing distribution that doesn't have production
> stability.)
>
I observed the exact same behavior on 2.3.9 (latest stable) that I
compiled from scratch; this is actually the reason why I moved to
2.4.7 (hoped it would be better).
Is there someone who can work with me on getting to the root cause
and hopefully getting it fixed ?
Oren.
15 years, 3 months
Re: (ITS#5354) slapd repeatedly hangs and stops reponding
by rra@stanford.edu
Oren Laadan <orenl(a)cs.columbia.edu> writes:
> Russ Allbery wrote:
>> orenl(a)cs.columbia.edu writes:
>>> Our configuration uses both BDB and META back-ends; as it turns out
>>> the standard debian package of LDAP fails to run with the META
>>> back-end configured (see also complaints here:
>>> http://www.openldap.org/lists/openldap-bugs/200705/msg00011.html and
>>> here: http://arkiv.netbsd.se/?ml=OpenLDAP-bugs&a=2007-02&t=3076794).
>> Yeah, we're still trying to figure out the best way to fix that.
>> libtool has some serious problems with how it handles namespaces when
>> dynamically loading modules, and fixing one set of problems creates a
>> separate set of problems. (This particular problem is Debian-specific
>> and not a problem with the upstream OpenLDAP.)
>
> :(
>
> Well, the good news is that it isn't a show-stopper, and the simple
> workaround is to compile the code from scratch.
Specifically, the workaround is to compile the code with the upstream
libtool instead of with Debian's libtool, since upstream libtool imports
all module symbols into the global namespace. Debian's libtool has been
modified to not do this because it causes all sorts of other problems in
the general case, but not doing this breaks the meta backend because it
wants to reference symbols from the bdb backend.
Steve had an ugly hack to work around this by linking the meta backend
against the bdb backend. Doing that isn't the ugly part -- that's
actually formally correct and really is what libtool should be doing in
the first place. The ugly part is that libtool *really* doesn't like
linking against something that doesn't start with lib*.
> What's really bothering me, is that the system repeatedly and frequently
> hangs with my configuration ... (my users aren't happy with me
> recently). Do you have any idea how to investigate that ?
Not beyond the standard advice to investigate what the server is doing
during a hang using gdb attach or strace.
We have yet to have a chance to do intensive testing of 2.4.7. (Debian
testing really is a testing distribution that doesn't have production
stability.)
--
Russ Allbery (rra(a)stanford.edu) <http://www.eyrie.org/~eagle/>
15 years, 3 months
Re: (ITS#5354) slapd repeatedly hangs and stops reponding
by orenl@cs.columbia.edu
Russ Allbery wrote:
> orenl(a)cs.columbia.edu writes:
>
>> Our configuration uses both BDB and META back-ends; as it turns out the
>> standard debian package of LDAP fails to run with the META back-end
>> configured (see also complaints here:
>> http://www.openldap.org/lists/openldap-bugs/200705/msg00011.html and
>> here: http://arkiv.netbsd.se/?ml=OpenLDAP-bugs&a=2007-02&t=3076794).
>
> Yeah, we're still trying to figure out the best way to fix that. libtool
> has some serious problems with how it handles namespaces when dynamically
> loading modules, and fixing one set of problems creates a separate set of
> problems. (This particular problem is Debian-specific and not a problem
> with the upstream OpenLDAP.)
:(
Well, the good news is that it isn't a show-stopper, and the simple
workaround is to compile the code from scratch.
What's really bothering me, is that the system repeatedly and frequently
hangs with my configuration ... (my users aren't happy with me recently).
Do you have any idea how to investigate that ?
Thanks,
Oren.
15 years, 3 months
(ITS#5354) slapd repeatedly hangs and stops reponding
by orenl@cs.columbia.edu
Full_Name: Oren Laadan
Version: 2.4.7
OS: debian/sid
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (128.59.18.70)
Description:
The slapd server hangs frequently, and completely stops responding to any
request. This results in the entire machine (as well as all clients) becoming
unresponsive. Under certain configurations it can happen as frequently as every
few minutes. As a temporary measure, we have a script that restarts the server
every 10 minutes, just in case.
Operating System: Debian Sid
Linux ____ 2.6.22-3-amd64 #1 SMP Mon Nov 12 10:28:43 UTC 2007 x86_64
GNU/Linux
LDAP version:
Our configuration uses both BDB and META back-ends; as it turns out the standard
debian package of LDAP fails to run with the META back-end configured (see also
complaints here: http://www.openldap.org/lists/openldap-bugs/200705/msg00011.html
and here: http://arkiv.netbsd.se/?ml=OpenLDAP-bugs&a=2007-02&t=3076794).
So I downloaded the 2.4.7 and compiled with the following options:
./configure \
--enable-dynamic \
--prefix=/opt/ldap-2.4.7 \
--sysconfdir=/etc \
--localstatedir=/var/lib \
--disable-ipv6 \
--enable-spasswd \
--enable-bdb --enable-hdb --enable-ldap --enable-meta --enable-relay \
--enable-overlays \
--with-threads \
--with-tls
Setup:
Our server is used by clients in abc.main.example.com domain, who are also
part of main.example.com domain. In the latter there is already an ldap server
ldap.main.example.com; Our server builds on that server extending it by adding
some records (e.g. groups that are private to abc.main.example.com).
To implement this, I first built a BDB backend that holds the local data that
is added to the big database, serving the domain abc.main.example.com. Then I
setup a META backend that redirects queries to both the parent server and to
the local server; sending to local server also uses "suffixmassage" to convert
from the original domain (main.example.com) to the domain
(abc.main.example.com).
Note that the clients are configured for the regular, original domain, that is
main.example.com. Therefore the new domain is only for internal use within the
LDAP server.
See the configuration file for details.
Problem:
Originally the config file didn't have the two lines setting "thread" and
"idle_timeout"; To reproduce the problem, we would run on one of the clients
a script that opens 300 ssh connections outside to some destinations. The ldap
server would freeze.
Looking for a solution, some posts in google suggested playing with these two
parameters. So I added them. And - voila - now it not only happens under those
circumstances, but in fact it happens randomly and frequently, maybe every 15
minutes or so, sometimes more sometimes less.
It's quite reproducible, and I'm willing to work with whoever to try to solve
this. Right now our setup is hardly usable :(
Logs and other material are avilable on request.
Config file:
----------------------------------------------------------------------------
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/autofs.schema
include /etc/ldap/schema/dnszone.schema
include /etc/ldap/schema/dhcp.schema
# Where the pid file is put. The init.d script
# will not stop the server if you change this.
pidfile /var/run/slapd/slapd.pid
# List of arguments that were passed to the server
argsfile /var/run/slapd/slapd.args
# Read slapd.conf(5) for possible values
#loglevel 256
loglevel 64
# TRY TO SOLVE ISSUES ?
threads 32
idletimeout 30
# Where the dynamically loaded modules are stored
# [orenl] we use statically build backends/overlays
modulepath /opt/ldap/lib
moduleload back_ldap
moduleload back_meta
moduleload back_bdb
# The maximum number of entries that is returned for a search operation
sizelimit 10000
# The tool-threads parameter sets the actual amount of cpu's that is used
# for indexing.
tool-threads 1
#######################################################################
# Specific Backend Directives for bdb:
backend bdb
TLSCipherSuite HIGH:MEDIUM:LOW
TLSCACertificateFile /etc/ldap/ssl/SOME_IP.crt
TLSCertificateFile /etc/ldap/ssl/SOME_IP.crt
TLSCertificateKeyFile /etc/ldap/ssl/SOME_IP.pem
TLSVerifyClient try
#######################################################################
# Specific Backend Directives for meta:
backend meta
TLSCipherSuite HIGH:MEDIUM:LOW
TLSCACertificateFile /etc/ldap/ssl/SOME_IP.crt
TLSCACertificateFile /etc/ssl/certs/OTHER_IP.crt
TLSCertificateFile /etc/ldap/ssl/SOME_IP.crt
TLSCertificateKeyFile /etc/ldap/ssl/SOME_IP.pem
TLSVerifyClient allow
#######################################################################
# Specific Directives for database #1, of type bdb:
database bdb
# The base of your directory in database #1
suffix "dc=abc,dc=main,dc=example,dc=com"
readonly on
# rootdn directive for specifying a superuser on the database. This is needed
# for syncrepl.
#rootdn "cn=admin,dc=main,dc=example,dc=com"
#rootpw "change"
# Where the database file are physically stored for database #1
directory "/var/lib/ldap"
# For the Debian package we use 2MB as default but be sure to update this
# value if you have plenty of RAM
dbconfig set_cachesize 0 2097152 0
# Sven Hartge reported that he had to set this value incredibly high
# to get slapd running at all. See http://bugs.debian.org/303057
# for more information.
# Number of objects that can be locked at the same time.
dbconfig set_lk_max_objects 1500
# Number of locks (both requested and granted)
dbconfig set_lk_max_locks 1500
# Number of lockers
dbconfig set_lk_max_lockers 1500
# Indexing options for database #1
index objectClass eq
# Save the time that the entry gets modified, for database #1
lastmod on
# Everyone can read everything.
#access to * by * read
#######################################################################
# Specific Directives for database #2, of type 'ldap':
database meta
lastmod off
#rebind-as-user yes
# The base of your directory in database #3
suffix "dc=main,dc=example,dc=com"
uri "ldaps://OTHER_IP/dc=main,dc=example,dc=com"
uri "ldaps:///dc=main,dc=example,dc=com"
suffixmassage "dc=main,dc=example,dc=com" "dc=abc,dc=main,dc=eaxmple,dc=com"
----------------------------------------------------------------------------
15 years, 3 months
Re: (ITS#5353) openssl vs gnutls: gnutls doesn't fit
by quanah@zimbra.com
Read ITS#5341. It has the fix.
--Quanah
--On February 6, 2008 5:44:26 PM +0000 korsani(a)caramail.com wrote:
> Full_Name: GG
> Version: 2.4.7
> OS: Linux
> URL: ftp://ftp.openldap.org/incoming/
> Submission from: (NULL) (194.2.41.131)
>
>
> I was investigated a problem: I couldn't ldapsearch to my ldap directory
> in TLS:
> ldapsearch -Z -H ldap://127.0.0.1 -x uid=gab returns:
>
> ldap_start_tls: Connect error (-11)
> ldap_result: Can't contact LDAP server (-1)
>
> It is an openldap 2.4.7 on Debian (Etch). It is built against gnutls. And
> as it was working with openldap 2.3.30, and it works with openldap 2.4.7
> built on Crux (self-made package, built against openssl), I tried to
> compile it on my gentoo ('cause it has the .h of everything, and much
> more CPU :) ), from sources.
>
> When built with --with-tls=openssl, the ldapsearch above is ok.
> When built with --with-tls=gnutls, it fails:
>
> I modify slapd.conf accordingly to match the syntax of tlsciphersuite with
> gnutls or openssl
>
> Debugs
> slapd:
> [ ... ]
> TLS: gnutls_certificate_verify_peers2 failed -49
> connection_read(12): TLS accept failure error=-1 id=1, closing
> connection_closing: readying conn=1 sd=12 for close
> daemon: activity on 1 descriptor
> daemon: activity on:
> daemon: epoll: listen=7 active_threads=0 tvp=NULL
> connection_close: conn=1 sd=12
> daemon: removing 12
> tls_write: want=181, written=181
> 0000: 15 03 01 00 b0 0f 12 bd 11 3a 31 7b 10 f9 c3 f7
> .........:1{.... 0010: 87 dd 18 94 3d 19 52 5b 9a 30 8a 9c f6 a0 ac
> c7 ....=.R[.0...... 0020: 2f 7d 10 6a 21 55 aa b3 25 72 50 a1 c6 2e
> 16 e8 /}.j!U..%rP..... 0030: 50 89 bc 65 d0 2a 5e 61 b5 44 8a e9 b0
> 01 cb 9f P..e.*^a.D...... 0040: e4 85 81 9e 33 16 57 8b a8 32 ce 14
> 2f 5a 38 0e ....3.W..2../Z8. 0050: 12 f0 85 75 77 df 1b 57 56 c1 fb
> ae 2a cc 72 29 ...uw..WV...*.r) 0060: c7 38 eb d3 3c 3b d4 8e ba 29
> e6 8d 09 15 70 5f .8..<;...)....p_ 0070: 79 07 3e 8e 5a 9e c1 82 9f
> 39 73 ac b0 22 a4 31 y.>.Z....9s..".1 0080: d2 43 3a 09 b5 3d 07 b6
> e7 17 14 5e 65 d5 ed 2d .C:..=.....^e..- 0090: 71 09 c2 ea b9 c8 6a
> 35 2c b7 18 4b 33 7e 72 52 q.....j5,..K3~rR 00a0: bb b9 f4 bc 0a 23
> 4b f0 be dc 64 ef 3f bd a6 3a .....#K...d.?..: 00b0: 71 8e 07 64 90
> q..d. tls_read: want=5 error=Ressource temporairement non disponible
> conn=1 fd=12 closed (TLS negotiation failure)
>
> ldapsearch:
> [ ... ]
> ldap_chkResponseList ld 0x8057dd8 msgid 2 all 1
> ldap_chkResponseList returns ld 0x8057dd8 NULL
> ldap_int_select
> read1msg: ld 0x8057dd8 msgid 2 all 1
> ber_get_next
> tls_read: want=5, got=5
> 0000: 15 03 01 00 b0 .....
> tls_read: want=176, got=176
> 0000: 0f 12 bd 11 3a 31 7b 10 f9 c3 f7 87 dd 18 94 3d
> ....:1{........= 0010: 19 52 5b 9a 30 8a 9c f6 a0 ac c7 2f 7d 10 6a
> 21 .R[.0....../}.j! 0020: 55 aa b3 25 72 50 a1 c6 2e 16 e8 50 89 bc
> 65 d0 U..%rP.....P..e. 0030: 2a 5e 61 b5 44 8a e9 b0 01 cb 9f e4 85
> 81 9e 33 *^a.D..........3 0040: 16 57 8b a8 32 ce 14 2f 5a 38 0e 12
> f0 85 75 77 .W..2../Z8....uw 0050: df 1b 57 56 c1 fb ae 2a cc 72 29
> c7 38 eb d3 3c ..WV...*.r).8..< 0060: 3b d4 8e ba 29 e6 8d 09 15 70
> 5f 79 07 3e 8e 5a ;...)....p_y.>.Z 0070: 9e c1 82 9f 39 73 ac b0 22
> a4 31 d2 43 3a 09 b5 ....9s..".1.C:.. 0080: 3d 07 b6 e7 17 14 5e 65
> d5 ed 2d 71 09 c2 ea b9 =.....^e..-q.... 0090: c8 6a 35 2c b7 18 4b
> 33 7e 72 52 bb b9 f4 bc 0a .j5,..K3~rR..... 00a0: 23 4b f0 be dc 64
> ef 3f bd a6 3a 71 8e 07 64 90 #K...d.?..:q..d. TLS trace: SSL3 alert
> read:warning:close notify
> ldap_read: want=8, got=0
>
> ber_get_next failed.
> ldap_perror
> ldap_result: Can't contact LDAP server (-1)
>
> Versions:
> gnutls: 2.0.4
> openssl: 0.9.8g
>
>
--
Quanah Gibson-Mount
Principal Software Engineer
Zimbra, Inc
--------------------
Zimbra :: the leader in open source messaging and collaboration
15 years, 3 months
(ITS#5353) openssl vs gnutls: gnutls doesn't fit
by korsani@caramail.com
Full_Name: GG
Version: 2.4.7
OS: Linux
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (194.2.41.131)
I was investigated a problem: I couldn't ldapsearch to my ldap directory in
TLS:
ldapsearch -Z -H ldap://127.0.0.1 -x uid=gab returns:
ldap_start_tls: Connect error (-11)
ldap_result: Can't contact LDAP server (-1)
It is an openldap 2.4.7 on Debian (Etch). It is built against gnutls. And as it
was working with openldap 2.3.30, and it works with openldap 2.4.7 built on Crux
(self-made package, built against openssl), I tried to compile it on my gentoo
('cause it has the .h of everything, and much more CPU :) ), from sources.
When built with --with-tls=openssl, the ldapsearch above is ok.
When built with --with-tls=gnutls, it fails:
I modify slapd.conf accordingly to match the syntax of tlsciphersuite with
gnutls or openssl
Debugs
slapd:
[ ... ]
TLS: gnutls_certificate_verify_peers2 failed -49
connection_read(12): TLS accept failure error=-1 id=1, closing
connection_closing: readying conn=1 sd=12 for close
daemon: activity on 1 descriptor
daemon: activity on:
daemon: epoll: listen=7 active_threads=0 tvp=NULL
connection_close: conn=1 sd=12
daemon: removing 12
tls_write: want=181, written=181
0000: 15 03 01 00 b0 0f 12 bd 11 3a 31 7b 10 f9 c3 f7 .........:1{....
0010: 87 dd 18 94 3d 19 52 5b 9a 30 8a 9c f6 a0 ac c7 ....=.R[.0......
0020: 2f 7d 10 6a 21 55 aa b3 25 72 50 a1 c6 2e 16 e8 /}.j!U..%rP.....
0030: 50 89 bc 65 d0 2a 5e 61 b5 44 8a e9 b0 01 cb 9f P..e.*^a.D......
0040: e4 85 81 9e 33 16 57 8b a8 32 ce 14 2f 5a 38 0e ....3.W..2../Z8.
0050: 12 f0 85 75 77 df 1b 57 56 c1 fb ae 2a cc 72 29 ...uw..WV...*.r)
0060: c7 38 eb d3 3c 3b d4 8e ba 29 e6 8d 09 15 70 5f .8..<;...)....p_
0070: 79 07 3e 8e 5a 9e c1 82 9f 39 73 ac b0 22 a4 31 y.>.Z....9s..".1
0080: d2 43 3a 09 b5 3d 07 b6 e7 17 14 5e 65 d5 ed 2d .C:..=.....^e..-
0090: 71 09 c2 ea b9 c8 6a 35 2c b7 18 4b 33 7e 72 52 q.....j5,..K3~rR
00a0: bb b9 f4 bc 0a 23 4b f0 be dc 64 ef 3f bd a6 3a .....#K...d.?..:
00b0: 71 8e 07 64 90 q..d.
tls_read: want=5 error=Ressource temporairement non disponible
conn=1 fd=12 closed (TLS negotiation failure)
ldapsearch:
[ ... ]
ldap_chkResponseList ld 0x8057dd8 msgid 2 all 1
ldap_chkResponseList returns ld 0x8057dd8 NULL
ldap_int_select
read1msg: ld 0x8057dd8 msgid 2 all 1
ber_get_next
tls_read: want=5, got=5
0000: 15 03 01 00 b0 .....
tls_read: want=176, got=176
0000: 0f 12 bd 11 3a 31 7b 10 f9 c3 f7 87 dd 18 94 3d ....:1{........=
0010: 19 52 5b 9a 30 8a 9c f6 a0 ac c7 2f 7d 10 6a 21 .R[.0....../}.j!
0020: 55 aa b3 25 72 50 a1 c6 2e 16 e8 50 89 bc 65 d0 U..%rP.....P..e.
0030: 2a 5e 61 b5 44 8a e9 b0 01 cb 9f e4 85 81 9e 33 *^a.D..........3
0040: 16 57 8b a8 32 ce 14 2f 5a 38 0e 12 f0 85 75 77 .W..2../Z8....uw
0050: df 1b 57 56 c1 fb ae 2a cc 72 29 c7 38 eb d3 3c ..WV...*.r).8..<
0060: 3b d4 8e ba 29 e6 8d 09 15 70 5f 79 07 3e 8e 5a ;...)....p_y.>.Z
0070: 9e c1 82 9f 39 73 ac b0 22 a4 31 d2 43 3a 09 b5 ....9s..".1.C:..
0080: 3d 07 b6 e7 17 14 5e 65 d5 ed 2d 71 09 c2 ea b9 =.....^e..-q....
0090: c8 6a 35 2c b7 18 4b 33 7e 72 52 bb b9 f4 bc 0a .j5,..K3~rR.....
00a0: 23 4b f0 be dc 64 ef 3f bd a6 3a 71 8e 07 64 90 #K...d.?..:q..d.
TLS trace: SSL3 alert read:warning:close notify
ldap_read: want=8, got=0
ber_get_next failed.
ldap_perror
ldap_result: Can't contact LDAP server (-1)
Versions:
gnutls: 2.0.4
openssl: 0.9.8g
15 years, 3 months
Re: (ITS#5346) overlay and config backend
by h.b.furuseth@usit.uio.no
I wrote:
> On the other hand, this is strange:
>
>> cn=config
>> - cn= schema
>> - cn={0}core
>> - olcDatabase={-1}frontend
>> - olcDatabase={0}config
>> - olcDatabase={-1}ndb_pl
>> + olcoverlay={0}ndbover
>
> Two different databases should not have the same number.
> ndb_pl should get {1}.
Ignore that cn=config tree. The submitter tells me it was
a copy&paste error when he posted the ITS.
--
Hallvard
15 years, 3 months
Re: (ITS#5332) multimaster replication crash
by Marcel.Ritter@rrze.uni-erlangen.de
This is a multi-part message in MIME format.
--------------020804010101020205090300
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Gavin Henry schrieb:
>> # compile openldap
>> ./configure
>> make
>>
>
> This should be:
>
> ./configure
> make depend
> make
> make test (after of course copying you hacked test script).
>
Makes no difference, see attaches log, script, test.
Bye,
Marcel
--------------020804010101020205090300
Content-Type: application/x-shellscript;
name="runit.sh"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="runit.sh"
IyEvYmluL2Jhc2gKCnJtIC1yZiBvcGVubGRhcC0yLjQuNwp0YXIgeGpmIC4uL1NPVVJDRVMv
b3BlbmxkYXAtMi40LjcudGFyLmJ6MgpjZCBvcGVubGRhcC0yLjQuNwouL2NvbmZpZ3VyZQpt
YWtlIGRlcGVuZAptYWtlCmNwIC90bXAvdGVzdDA1MC1zeW5jcmVwbC1tdWx0aW1hc3RlciB0
ZXN0cy9zY3JpcHRzLwpta2RpciAtcCB0ZXN0cy9kYXRhL3Rlc3QwNTAvCmNkIHRlc3RzL2Rh
dGEvdGVzdDA1MC8KL3RtcC91c2Vyc2xkaWYyLnB5IHwgc3BsaXQgLWwgMjAwMDAgLQpjZCAt
Cm1ha2UgdGVzdAo=
--------------020804010101020205090300
Content-Type: text/plain;
name="test050-syncrepl-multimaster"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="test050-syncrepl-multimaster"
#! /bin/sh
# $OpenLDAP: pkg/ldap/tests/scripts/test050-syncrepl-multimaster,v 1.7 2008/01/07 23:20:17 kurt Exp $
## This work is part of OpenLDAP Software <http://www.openldap.org/>.
##
## Copyright 1998-2008 The OpenLDAP Foundation.
## All rights reserved.
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted only as authorized by the OpenLDAP
## Public License.
##
## A copy of this license is available in the file LICENSE in the
## top-level directory of the distribution or, alternatively, at
## <http://www.OpenLDAP.org/license.html>.
echo "running defines.sh"
. $SRCDIR/scripts/defines.sh
if test $SYNCPROV = syncprovno; then
echo "Syncrepl provider overlay not available, test skipped"
exit 0
fi
PRODIR=$TESTDIR/pro
CONDIR=$TESTDIR/con
CONDIR2=$TESTDIR/con2
DBPRO=$PRODIR/db
DBCON=$CONDIR/db
DBCON2=$CONDIR2/db
CFPRO=$PRODIR/slapd.d
CFCON=$CONDIR/slapd.d
CFCON2=$CONDIR2/slapd.d
mkdir -p $TESTDIR $PRODIR $CONDIR $CONDIR2 $DBPRO $DBCON $DBCON2 $CFPRO $CFCON $CFCON2
$SLAPPASSWD -g -n >$CONFIGPWF
#
# Test replication of dynamic config:
# - start producer
# - start consumer
# - start consumer2
# - configure over ldap
# - populate over ldap
# - configure syncrepl over ldap
# - retrieve database over ldap and compare against expected results
#
echo "Initializing server configurations..."
$SLAPADD -F $CFCON2 -n 0 <<EOF
dn: cn=config
objectClass: olcGlobal
cn: config
olcServerID: 3
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcRootPW:< file://$CONFIGPWF
EOF
$SLAPADD -F $CFCON -n 0 <<EOF
dn: cn=config
objectClass: olcGlobal
cn: config
olcServerID: 2
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcRootPW:< file://$CONFIGPWF
EOF
$SLAPADD -F $CFPRO -n 0 <<EOF
dn: cn=config
objectClass: olcGlobal
cn: config
olcServerID: 1
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcRootPW:< file://$CONFIGPWF
EOF
echo "Starting producer slapd on TCP/IP port $PORT1..."
cd $PRODIR
$SLAPD -F slapd.d -h $URI1 -d $LVL $TIMING > $LOG1 2>&1 &
PID=$!
if test $WAIT != 0 ; then
echo PID $PID
read foo
fi
KILLPIDS="$PID"
cd $TESTWD
sleep 1
echo "Using ldapsearch to check that producer slapd is running..."
for i in 0 1 2 3 4 5; do
$LDAPSEARCH -s base -b "" -H $URI1 \
'objectclass=*' > /dev/null 2>&1
RC=$?
if test $RC = 0 ; then
break
fi
echo "Waiting 5 seconds for slapd to start..."
sleep 5
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Inserting syncprov overlay on producer..."
if [ "$SYNCPROV" = syncprovmod ]; then
$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: ../../../servers/slapd/overlays
olcModuleLoad: syncprov.la
EOF
RC=$?
if test $RC != 0 ; then
echo "ldapadd failed for moduleLoad ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
fi
#
# Note that we configure a timeout here; it's possible for both
# servers to attempt to bind to each other while a modify to
# cn=config is in progress. When the modify pauses the thread pool
# neither server will progress. The timeout will drop the syncrepl
# attempt and allow the modifies to complete.
#
read CONFIGPW < $CONFIGPWF
$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1 $URI1
olcServerID: 2 $URI2
olcServerID: 3 $URI3
dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple
credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
olcSyncRepl: rid=002 provider=$URI2 binddn="cn=config" bindmethod=simple
credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
olcSyncRepl: rid=003 provider=$URI3 binddn="cn=config" bindmethod=simple
credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
EOF
RC=$?
if test $RC != 0 ; then
echo "ldapmodify failed for syncrepl config ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Starting consumer slapd on TCP/IP port $PORT2..."
cd $CONDIR
$SLAPD -F ./slapd.d -h $URI2 -d $LVL $TIMING > $LOG2 2>&1 &
SLAVEPID=$!
if test $WAIT != 0 ; then
echo SLAVEPID $SLAVEPID
read foo
fi
KILLPIDS="$KILLPIDS $SLAVEPID"
cd $TESTWD
sleep 1
echo "Using ldapsearch to check that consumer slapd is running..."
for i in 0 1 2 3 4 5; do
$LDAPSEARCH -s base -b "" -H $URI2 \
'objectclass=*' > /dev/null 2>&1
RC=$?
if test $RC = 0 ; then
break
fi
echo "Waiting 5 seconds for slapd to start..."
sleep 5
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Configuring syncrepl on consumer..."
$LDAPMODIFY -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple
credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
olcSyncRepl: rid=002 provider=$URI2 binddn="cn=config" bindmethod=simple
credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
olcSyncRepl: rid=003 provider=$URI3 binddn="cn=config" bindmethod=simple
credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
EOF
echo "Starting consumer2 slapd on TCP/IP port $PORT3..."
cd $CONDIR2
$SLAPD -F ./slapd.d -h $URI3 -d $LVL $TIMING > $LOG3 2>&1 &
SLAVE2PID=$!
if test $WAIT != 0 ; then
echo SLAVE2PID $SLAVE2PID
read foo
fi
KILLPIDS="$KILLPIDS $SLAVE2PID"
cd $TESTWD
sleep 1
echo "Using ldapsearch to check that consumer2 slapd is running..."
for i in 0 1 2 3 4 5; do
$LDAPSEARCH -s base -b "" -H $URI3 \
'objectclass=*' > /dev/null 2>&1
RC=$?
if test $RC = 0 ; then
break
fi
echo "Waiting 5 seconds for slapd to start..."
sleep 5
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Configuring syncrepl on consumer2..."
$LDAPMODIFY -D cn=config -H $URI3 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple
credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
olcSyncRepl: rid=002 provider=$URI2 binddn="cn=config" bindmethod=simple
credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
olcSyncRepl: rid=003 provider=$URI3 binddn="cn=config" bindmethod=simple
credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
EOF
echo "Adding schema and databases on producer..."
$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
include: file://$ABS_SCHEMADIR/core.ldif
include: file://$ABS_SCHEMADIR/cosine.ldif
include: file://$ABS_SCHEMADIR/inetorgperson.ldif
include: file://$ABS_SCHEMADIR/openldap.ldif
include: file://$ABS_SCHEMADIR/nis.ldif
EOF
RC=$?
if test $RC != 0 ; then
echo "ldapadd failed for schema config ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
if [ "$BACKENDTYPE" = mod ]; then
$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: ../../../servers/slapd/back-$BACKEND
olcModuleLoad: back_$BACKEND.la
EOF
RC=$?
if test $RC != 0 ; then
echo "ldapadd failed for backend config ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
fi
$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
dn: olcDatabase={1}$BACKEND,cn=config
objectClass: olcDatabaseConfig
objectClass: olc${BACKEND}Config
olcDatabase: {1}$BACKEND
olcSuffix: $BASEDN
olcDbDirectory: ./db
olcRootDN: $MANAGERDN
olcRootPW: $PASSWD
olcSyncRepl: rid=004 provider=$URI1 binddn="$MANAGERDN" bindmethod=simple
credentials=$PASSWD searchbase="$BASEDN" type=refreshOnly
interval=00:00:00:10 retry="5 5 300 5" timeout=1
olcSyncRepl: rid=005 provider=$URI2 binddn="$MANAGERDN" bindmethod=simple
credentials=$PASSWD searchbase="$BASEDN" type=refreshOnly
interval=00:00:00:10 retry="5 5 300 5" timeout=1
olcSyncRepl: rid=006 provider=$URI3 binddn="$MANAGERDN" bindmethod=simple
credentials=$PASSWD searchbase="$BASEDN" type=refreshOnly
interval=00:00:00:10 retry="5 5 300 5" timeout=1
olcMirrorMode: TRUE
dn: olcOverlay=syncprov,olcDatabase={1}${BACKEND},cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
EOF
RC=$?
if test $RC != 0 ; then
echo "ldapadd failed for database config ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Using ldapadd to populate producer..."
$LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDERED \
>> $TESTOUT 2>&1
RC=$?
if test $RC != 0 ; then
echo "ldapadd failed for database config ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
SLEEP=20
echo "Waiting $SLEEP seconds for syncrepl to receive changes..."
sleep $SLEEP
echo "Using ldapsearch to check that syncrepl received database changes..."
RC=32
for i in 0 1 2 3 4 5; do
RESULT=`$LDAPSEARCH -H $URI2 \
-s base -b "cn=Ursula Hampster,ou=Alumni Association,ou=People,dc=example,dc=com" \
'(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
if test "x$RESULT" = "xOK" ; then
RC=0
break
fi
echo "Waiting 5 seconds for syncrepl to receive changes..."
sleep 5
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Using ldapsearch to check that syncrepl received database changes on consumer2..."
RC=32
for i in 0 1 2 3 4 5; do
RESULT=`$LDAPSEARCH -H $URI3 \
-s base -b "cn=Ursula Hampster,ou=Alumni Association,ou=People,dc=example,dc=com" \
'(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
if test "x$RESULT" = "xOK" ; then
RC=0
break
fi
echo "Waiting 5 seconds for syncrepl to receive changes..."
sleep 5
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Using ldapsearch to read config from the producer..."
$LDAPSEARCH -b cn=config -D cn=config -H $URI1 -y $CONFIGPWF \
'objectclass=*' > $MASTEROUT 2>&1
RC=$?
if test $RC != 0 ; then
echo "ldapsearch failed at producer ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Using ldapsearch to read config from the consumer..."
$LDAPSEARCH -b cn=config -D cn=config -H $URI2 -y $CONFIGPWF \
'objectclass=*' > $SLAVEOUT 2>&1
RC=$?
if test $RC != 0 ; then
echo "ldapsearch failed at consumer ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Using ldapsearch to read config from consumer2..."
$LDAPSEARCH -b cn=config -D cn=config -H $URI3 -y $CONFIGPWF \
'objectclass=*' > $SLAVE2OUT 2>&1
RC=$?
if test $RC != 0 ; then
echo "ldapsearch failed at consumer2 ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Filtering producer results..."
. $LDIFFILTER < $MASTEROUT > $MASTERFLT
echo "Filtering consumer results..."
. $LDIFFILTER < $SLAVEOUT > $SLAVEFLT
echo "Filtering consumer2 results..."
. $LDIFFILTER < $SLAVE2OUT > $SLAVE2FLT
echo "Comparing retrieved configs from producer and consumer..."
$CMP $MASTERFLT $SLAVEFLT > $CMPOUT
if test $? != 0 ; then
echo "test failed - producer and consumer configs differ"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit 1
fi
echo "Comparing retrieved configs from producer and consumer2..."
$CMP $MASTERFLT $SLAVE2FLT > $CMPOUT
if test $? != 0 ; then
echo "test failed - producer and consumer2 configs differ"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit 1
fi
echo "Using ldapsearch to read all the entries from the producer..."
$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI1 -w $PASSWD \
'objectclass=*' > $MASTEROUT 2>&1
RC=$?
if test $RC != 0 ; then
echo "ldapsearch failed at producer ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Using ldapsearch to read all the entries from the consumer..."
$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI2 -w $PASSWD \
'objectclass=*' > $SLAVEOUT 2>&1
RC=$?
if test $RC != 0 ; then
echo "ldapsearch failed at consumer ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Using ldapsearch to read all the entries from the consumer2..."
$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI3 -w $PASSWD \
'objectclass=*' > $SLAVE2OUT 2>&1
RC=$?
if test $RC != 0 ; then
echo "ldapsearch failed at consumer2 ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
test $KILLSERVERS != no && kill -HUP $KILLPIDS
echo "Filtering producer results..."
. $LDIFFILTER < $MASTEROUT > $MASTERFLT
echo "Filtering consumer results..."
. $LDIFFILTER < $SLAVEOUT > $SLAVEFLT
echo "Filtering consumer2 results..."
. $LDIFFILTER < $SLAVE2OUT > $SLAVE2FLT
echo "Comparing retrieved entries from producer and consumer..."
$CMP $MASTERFLT $SLAVEFLT > $CMPOUT
if test $? != 0 ; then
echo "test failed - producer and consumer databases differ"
exit 1
fi
echo "Comparing retrieved entries from producer and consumer2..."
$CMP $MASTERFLT $SLAVE2FLT > $CMPOUT
if test $? != 0 ; then
echo "test failed - producer and consumer2 databases differ"
exit 1
fi
test $KILLSERVERS != no && wait
echo "Restarting servers..."
echo "Starting producer slapd on TCP/IP port $PORT1..."
cd $PRODIR
echo "======================= RESTART =======================" >> $LOG1
$SLAPD -F ./slapd.d -h $URI1 -d $LVL $TIMING >> $LOG1 2>&1 &
PID=$!
if test $WAIT != 0 ; then
echo PID $PID
read foo
fi
KILLPIDS="$PID"
cd $TESTWD
echo "Using ldapsearch to check that producer slapd is running..."
for i in 0 1 2 3 4 5; do
$LDAPSEARCH -s base -b "" -H $URI1 \
'objectclass=*' > /dev/null 2>&1
RC=$?
if test $RC = 0 ; then
break
fi
echo "Waiting 5 seconds for slapd to start..."
sleep 5
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
#exit 0
echo "Starting consumer slapd on TCP/IP port $PORT2..."
cd $CONDIR
echo "======================= RESTART =======================" >> $LOG2
$SLAPD -F ./slapd.d -h $URI2 -d $LVL $TIMING >> $LOG2 2>&1 &
SLAVEPID=$!
if test $WAIT != 0 ; then
echo SLAVEPID $SLAVEPID
read foo
fi
KILLPIDS="$KILLPIDS $SLAVEPID"
cd $TESTWD
sleep 1
echo "Using ldapsearch to check that consumer slapd is running..."
for i in 0 1 2 3 4 5; do
$LDAPSEARCH -s base -b "" -H $URI2 \
'objectclass=*' > /dev/null 2>&1
RC=$?
if test $RC = 0 ; then
break
fi
echo "Waiting 5 seconds for slapd to start..."
sleep 5
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
echo "Starting consumer2 slapd on TCP/IP port $PORT3..."
cd $CONDIR2
echo "======================= RESTART =======================" >> $LOG3
$SLAPD -F ./slapd.d -h $URI3 -d $LVL $TIMING >> $LOG3 2>&1 &
SLAVE2PID=$!
if test $WAIT != 0 ; then
echo SLAVE2PID $SLAVE2PID
read foo
fi
KILLPIDS="$KILLPIDS $SLAVE2PID"
cd $TESTWD
sleep 1
echo "Using ldapsearch to check that consumer2 slapd is running..."
for i in 0 1 2 3 4 5; do
$LDAPSEARCH -s base -b "" -H $URI3 \
'objectclass=*' > /dev/null 2>&1
RC=$?
if test $RC = 0 ; then
break
fi
echo "Waiting 5 seconds for slapd to start..."
sleep 5
done
if test $RC != 0 ; then
echo "ldapsearch failed ($RC)!"
test $KILLSERVERS != no && kill -HUP $KILLPIDS
exit $RC
fi
# Insert modifications and more tests here.
SLEEP=10
echo "Waiting $SLEEP seconds for servers to resync..."
sleep $SLEEP
echo "Start gdb for:"
echo "PIDS: $KILLPIDS"
echo "$PWD/data/test050/"
ls -l "$PWD"/data/test050/*
for LDIFORDERED in $PWD/data/test050/*; do
/usr/bin/time -f "%e" -o time -- $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDERED >> ldif.log 2>&1
RC=$?
SLAPDS=$(pidof slapd | wc -w)
TOOK=$(cat time)
if [ "x$RC" = "x0" ]; then
echo "Added: $(basename $LDIFORDERED) in $TOOK s - OK (# of slapds: $SLAPDS)"
else
echo "Added: $(basename $LDIFORDERED) in $TOOK s - Failed (# of slapds: $SLAPDS)"
fi
sleep 1
if [ "x$SLAPDS" != "x3" ]; then
echo "At least one slapd died ... test failed"
break
fi
done
test $KILLSERVERS != no && kill -HUP $KILLPIDS
echo ">>>>> Test succeeded"
test $KILLSERVERS != no && wait
exit 0
--------------020804010101020205090300
Content-Type: text/x-python;
name="usersldif2.py"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="usersldif2.py"
#!/usr/bin/env python
import string
import sys
uids=[]
for lineno in xrange(0,100000):
print """dn: uid=test%(lineno)s,ou=People,dc=example,dc=com
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
cn: User %(lineno)s
gecos: User %(lineno)s
gidNumber: %(lineno)s
homeDirectory: /home/test%(lineno)s
loginShell: /bin/bash
shadowInactive: -1
shadowLastChange: 12570
shadowMax: 99999
shadowMin: 0
shadowWarning: 7
sn: test%(lineno)s
uid: test%(lineno)s
uidNumber: %(lineno)s
userPassword: {crypt}WNu26PDD.aYC.
""" % { 'lineno': lineno }
--------------020804010101020205090300
Content-Type: application/x-bzip;
name="log.bz2"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="log.bz2"
QlpoOTFBWSZTWZ5Ih+UAyVFfnHwwf////7//3/7/////AAgADBgAYIw+fPgHBuq6ZfOGfVa8
s2qj3g7D1mmHs58+94q21eimQNGjoA5A6Pp6ddPe+4AoPoKeugfQc++4lQ+mk3dwneY61lg0
WwsGRrDYgAeAsC29zgBQAB6ADQAB3l2UFC7UwLWCumXoeXWUkoVfcyPvsAA5ABRgIZDVd9m9
vthE32ABwqk0x1pVwAAwygKlKrkad2CC6uabbaJq3caD6adybgqpIFayCCzNUop6HO0S7A1E
odZxsVTDGgFTzxw6DbwcarRlVGbKu2e5uUvYAzYQDkUqIk5wBiDW2TYcuIRFcrc9MeSkD1pW
itQ6eMcOkle2oKBSFU96mcezNew522pVVSSUgD2z77uj6yHwx8JIpoaBT1PKbVG/1RKfqn6S
b0EQ0aZNA0aBoNA0DQNAAEqYCBCEaSMgKBspp6mmg0aBoAAADQAACU2kkiaEqfpqmPU1GJ6j
QaNMIGCMgGgGJkDTRiABJ6pSRTJMBMgKbSeptNQDENBkaAGgADQDQAwUpIgTQCaAICYQAjCZ
Cn5TBTAnpqbTTUMjRkAKiiCAIEyAjQmIUbU8po/Smp6R6m01PU9RkbU0bU0NNPSAe1HM5GR9
tIMlVGi6SmEZMSf8n+b/g3JuP7UXsTB8XsD/VmlCaPNwcWWiv97eH9popXAktgv+uls/aoru
frUclNX+5hMqqq2JjwVEUW6uUWjIyKNCRoqxtiIiImbEkEhHntqtP4OAAAAc4AAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAABzgAAAer1Xy1/pr9iv0V045O7u78459JeTPqPGfWXn2H2n3Gs
+86poeQ/A5SDafifkfmfoeU/Uggggggggggggggggggggggggggggggggggggggggggggggg
gggggggggggggggggggggggggg5dwkg64UsaCZPJx2NBM0hciSdkr7JWvUNVtiTFQxSX/NLU
iZshNYWZLKX4PtJxJllmf0fdpUfNkXe07CJgdFSc1JhZGGXxMuzWTBS2cm1I8MWzErdihps0
NLF27JwslzorJSSTSyHRowVWyyfVGWJJVSrZJZUlJbFllip9qpJ72jCRq9EUwmStCTkqqypW
iNTQw1SVGTqwwqVgySmy1Fpi0Y5sRTTHB/c0puwr0nZlS5ZBoxmtJmSsyp9Ldc7b0skdrO+V
ulk8KtiTjYYpbJnGIiMeLJYHOzMw9YKJkgePP83cM9PtPrCRe5LkkmSE+38Pv37UP8eg+ncZ
Plez7t93A84chrH0XJCHdblUFX9t17dub6HzKvH6zX9l5Sk1D4ONTNDnYtv1Vrpfkd9j8DzJ
i2Xv1c0Ub5fl68X1d36L/F+jyvT4OIW/u/X1eCH0uvscLRRCWJSW2l5YjFLZ52f2ee2db91j
DyZZ0h5rIn53OfVuz908PmclfYVIcD9HroaE+D4uTwcilu30SFaUs0Hc4PiEMHAh0UULvB9K
MjLfHNzja+DOv5v4Pvfa1622WrS2bK4x18rbaj+3Kr3VelXGEZlOouzdBILX3l8lH2GjJ6in
1H7WjtOrp18SOaQnvdpMFJLVtstS2aIqCMolBIaJNhZC2WpaFsvycmn9T3n3PgrxZe9o0ZbP
sabN2z4P9zGz5PC8eezg8UhPOqxDvaazJPj6PV73AuxcVUL8dDlJtjUEMogjbwmw+H0QK+3W
3/Fi4xjGMYxeu4Du4AHdcuudwLuc7u5zdw7t77Wc8be1WtfQ21XNqrclciHcLuvG+iIdpDlU
ODvxyXeSB887MLbBimruiU8DSE+ceD9j96MJT4fNeo9Qn8GFz72pNOzbPq/QGgdojxDD9X4P
cfI+f4zabHtP9k2mmp2nv725nSOwjjP98fhfa3IPoTg+dpWhYKqSipuRIr31lhXh+9g9Z6tH
FWHFh/OaPjE/vNB2r/KpsrZXZX6O5lUpTLDB1MiO7DopPg0auCPhNsvQPj/M+cfEfP+fbLbz
l/Wz4aR51pPndT9q3qSSw8ut72MXqUnF8PEOMKiKKRDPEDpacOjDI98TZLl1p6R71CXJvDO0
QzrTNiZR0h4iY+q3rYKzdUTUol0W6RpVVVXNXpIiZ1isYxe8YKWIeFclmJWS6VJWFkvDsOmH
RaxN8U6piZiHpZh1kw8OqxKOz3jFUjTZZW7xiLVimpsKzTdXvSIxXDW/0IT5H1R+D2wnpEPS
UuD1qbZ+vIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrI
rIwiyKyKyMJCLIrIqd3Hdx3cd3HdxyIiIiCQiyMIsisisisisisisiuZrWszWtZmqhoQ/lqD
6ebh+y2flUmRXGQPJD6DAY1UWoWslbq3hWwaNalS27bW80qqzFDYoNaBYypDak2wqn6KosAf
ZJC6zwcLv5h8P/ZOf59UL6ULbcLbQC20ttDJbQBUWRwLAtTFQFTMxZJEEbcLUxo4Y20y1Fki
ZWtwwkwAtTAsMwttJDMMkyQy1xXDMP85ktmzczO2Z4kltvX3PQ9EjfWSB349POIglbzw80fd
+vsS7Pb9QuDCatosYaW2m1TWktm4tnd6B2dfci87JJ31aYUZmZBqjVGqAgCNr7c1021RtqQg
AtbFtv52+aPmi+r721X4JgGAmJJkI5VCSM8NOZ8/OEUFQOYm/KQpGopLzeFxUVHlEw9hBA5W
SNZrHLzIvOxc7CGCiC5Jc9wMZPiKCDBcyKYIOxlzZbrGqsnRW7OjZIknUTkviskWsDtrEtDQ
0Ta6+zXBNr+oS/wug7h8NR2S5YzCT2/za1rWtaqVtkLunkneLD6BF+O7HlnCp9vxc7fv9Z4H
+6InL/e9yRgHbh7k3M9iUyizRoa7t0aOVu/z7A6HTvekRfjbr1XyUH4PW7nDsYk7OfhbNEyz
/QIS6ezc2PFu0hCbcO/5Tvi4XLNWpuj1ag0wti1rCIex9IZPp+f2qfpf2+r4/NXPf3KD/G9i
j2rk7fF8wdwnYTg62N7qSRfD+h/Ows+DbxTDudsnNXFh1ex4E+9xCacf1OxBxE+10dGPhEXB
L3cOmdGfJjZspJVROLc7/9psJ/1H3MLW18fpiIjAJZKoCYtttlVbLZVlt/8UhzcGzm3QOk0y
qeoNDCYJkRMJ6Lu1TE8FatGGVZZYZVll6X+eDxpLdERRi4hS52tlXO0q51NtcrGo1HUoxcRK
MXAhUzr4/icSOL36sK4N2GVZZV0CMDhqYOugR934X4PZq8F+oveJcDweyKdzAm8Vsvedzfbg
vrH8C/KYLie33T/SPCdxB8p2i5BNAnQJfc6mJ5eTnZLDgsw9WrGbS0tLY+iYMWRU9lkwKmrm
qbcU/rj4RNEGqqlVK23s5OHdqwidzonFKaPZ0fjoaG7RyTn4MK4p4bdp+MVozV/BVInJ3cpq
178/dwRgjVIu1niwxYp5rPYn1URp/0HiRwNppZnwKiPAzpb6b6sYxor4+wGL+TfnvWlvrry6
VcOFldrMf04jFLZ1St/iicSVEzrZ6NOBJ2MV76acXtwOFiVyscZZ62eZu4eXA1Gag05JOkaY
GzaGycZr/lmxq1slhz91916Kr7ZWEySxQYUGqXtymnLEydMY7xHF2c+lji0UTfQaEHfxbteT
gxoSPM4sJgwrnr4a8udgsWxKPGWTjP5/042b83VXudnyasPk2Nj5t3FXc5ahRS5gGGHNjmSD
4iCQQQyOQIaMPk3eTm8HZfKzJwiZZWKeSu1aJq37wrG81b3FnPXNJ0RUd1cUYHFWFYZTQph6
tGpl1mzQceFcTVWWbJYdyXFJHpETiRI36zouu1d84zZRZLZqynBung4E4NoGDU1GcphJMFU4
Tg76DVx1TU1c30E0holLNsGJjvv9Dw9GqQnNOBwsipzWT7QzrJ12wxeoTbWvqbNXTdggYibm
XmJo0dl4cbKlObCYMMjzJNBpDtb0ji4pyaafTv6vo+fvPO6rjI3QuNvhhcI9N0p3cyXrzrep
BvUvEc3LkZ2MWWW2JwcZxt755uZ12Pd83FObQ5OBicXBsn6FR2KiiPkZH6FGSN+Fdng/rTTS
yvSz0A6Ol16scWUmybrJ2t2T4cXqy68ysOJwsipxWTdsTi6ni9yztyW8OVfJwxWrVbCNmzWy
WH7hHxJ8SZ0sqU7MfZ25cp488SeKs2J8FjFR+i7LDcZcGUvvLjpXNWQ3MmkylhiZpVhVhSxo
ZUrEDJFIaiLk8CsbFbIymIeDD1VXUd04bOQiqKpKZ0s52a29RM/S5dGNg6MgEMUBMffJA7kL
sEjBwQHMtnNsp9DzJyy4OHD3Ps4v7jsjYnRvWOPqSerxdIjVum5s5EZTJlZ427I7cNz69NpQ
7cogiIIiInyttX8qyFu4jIesyfTvPyFnQnub+CdFsU8VnlLmu5HNsNE0sio2LJtp+sJ/kPTn
r6HY50RhSipnmdWutnw8d+0L1vj17E5DH1saYfrZWmS6cP+6fU5uT4qiqlO6dz3Pvmz1PL9/
6stWtIZh3A7mUMz1cvBsNJujsy/HEYWHAXPxY0sz1Y1NMMF08WNK0ScB0ViSCfqaVW9m2iRM
TPzYf00tLZx4PpINtKr60nuoooo33X4/l/rAH9Xv5vv9l+b2+q9/It+OnxtNCrRTTYpKaaFW
imkpKaaJn77DM0kiV5muGhJ0aLi882zKuHHDCWLFtokK4GEDBgUphPkZOJNFVls0NFNEpRSp
RsVUe9oFL32aZnyTb92jDu3503e/+2G/JdNbMXFWVrntdcVik6tY5Lz/bJGIbY6bs4Rpyr4I
6tGzkpu0Ppvws/gmya+Omtf4zGvBgrSXAwnX7NJl3U2TaMWJR4yyaPvajU0sipqoxZVtmuEw
ZeiyfRYmzTWls8HkfwfM+bmnl2KvIeRzTmdHRN/1yRG8C8lncj9XsOpVVSqqVVK/i4eXqcpx
4uaeGzl8fU8eI8XZX1zTmdEHI5IHuBzFBTQYEp2WssakJHQMifrVJ3Tq+p6GE6OLxTdzmXtg
YTTrVzmytLO7MxZKmZZ3cmrWcKTWH7AnvPThziHRNxulFT5iZ+naEbzqd3Nhls5K1ez8T7Gz
rOrys8Z1KYaCp4GjCjRjSls/c9+M1wwwosjqy76aWzg4L3ZspwfqXcyl62FaYrTFeXSOK6r9
DuJNBolxObnpyDm6qrUnElRh0KUodfz4btE5K3cpXXTLzsmlq6vDH73NU7nORJpSPiL3ZaDK
Zass2KeizG7/hvzjO02y58UHAaJk3MJOhqdlVQqUqVkandK9tDec3FvZLDwS+Tg0xaaTQZUb
N8E7UurNW3Y1+cMmJlcWbmD9mWS5rSt0iaRlpJo7/b/G3+L/D/ofyjnxcVHZ0zIwxMZsoqZZ
dLq9XpstFFFG/RVr2vJNeNYOssn9Dc+KlYYMMPSf+qV6JqnqmTUvWLjEMwBhMFDP73e00kUS
f4Ecu21GpcRqxehjherCGxUez7GWiRptWhpGM1j0xmzLVcZrDK7ODDldv5SYZu+lY4D7UlG6
qUqpOZyka1hJG29ntcWY4/h3bkNdrN1xZyXFLZ2dufSLY3cFV+5phPm5IfrU/cqlHBqbH4Kn
FSyVKwwx0aIysJSVJqYFalYUzDBpOt+1YzuTMB9gg+0QdEH3CD2HyEPMuzPdhvlODmmubOq4
s1XFnxdn3KstuMYtxuyyqsuasMqrDDCq/wtOnA4TP53Ga951GhO7UapRU6urXBmNLOMy/PbX
Pv2tyKmjdkzMebGbMvGsispXWhtTZcCPY12r3tE5Op0YdYSVtOLGeD4e2zXjXey63vV8la89
KN6vERESREREkpPb6vLzc6IiX4HRJe8pokm+EMAWw4kudCHAeha1hS+QUuCW2PF+M1d3Ur+h
O0xXv3zSjfvcXc/GmnA0ZSYTEqeKRK8Wy4btm2TKZJlyOxqwzOLu7m0pZnBiUspZSzGDEpZi
fyf4NJo+3E+Gf28jkaz15NnDnqMpjY7Pn9jsU+nF2YVmPYqsifcfH5l+b93q+HLDqtVO7sFb
k6bfBuJs4GzHa3cnmvM832nI4j5bG0qU2Y936JgaJVslh8uHyvd3icOOeetXRb7NsrKuZzG9
OTOGKfehCZbndw2stUWGV8BJwPvCeXPwkG3CzR4pvWzUapRUoslrm64zWWbzaaWzL4/B+3H6
zGWu1PD6u3NnUdyfxG5TNpMD++LPfFk+6nFqMJ93nzPkCucKM0I3kwJi9QOog3mWuggLQ3F7
9vPokZryh271mSGthEtki1CWwtRLZbFsWrYth886WcUsck2Ye99X5P9Qcg6B+hP8ToS1OpzL
YtlpU+He/zAyTxC6FsUtiJbEtIwHg9GXdpEbKFESqllRJSpKe8P8owX9BOJvJ/gYdp+A95+Q
w/0HobHwP5gfqP9Z7ROB/OjtR+GIe3r/JlXP2sOtW29vA2AmOQsKxxj0jtHolYSwwbQvpOoW
nAMffIq79Z6w506lt7UFVbR111z1JKBMzL8nOur1vLtfHTx07VyvLfh+oj+QpMSRPwEsB9Tu
qa/ecZ7onrVkfgcOzOnDgJO8Jil+XEqdhuw5NMWG4m8c1l/lkWmUfZH5ENDFs/E25LFU2Yfe
09dTZVxFl8U8nxfJ++3dnm2bWYzEzfinwSVluy/Fs/lZTZow2T906z/ORIy5OT9nq7PN+5hq
+L+0/yGByP5jxMFKngfTz7aauasylKnR8ywrDrmyYFop0VJGRkCzObgKKBmY7nl3gvGPBReV
vtvnva+e8pZEmUWJJiFFlLbSlbVS1Vq+bzaP6Dxx4aN2GXV8X5OrdxfzNXo7NVbMtmzcnlwv
8nn+rP7PtkjxCH1feH0SkxGH/yeJxTzTB4lmtlpbVtVX4FufU9g9Ye9xVwYWMDk9K+T7m78h
YhBqqRuo2YYVUwUZUjKtum1vu523KiKKLUbBF4le01nxT3OLq4Nnyx89OWc6Z06k7o6NWILa
WsWa1UPowsyr9Dk5Ojsc3Rjk6MJfT9kRe9VK7IiyqqyIv3NIj8T4IiJpatWrZVfyTmQ/J4t3
9dEREREREaNFijRo0aNGjRo0aNGjRo0aNGjRo0aNGjRo0aKjRo2jRo0aNGjRVRUaNGjRo0aN
EzKUn+GSKv+STMlZKLMplaxSNjFFERGAxmEKi0gLSlCVIlqIkRiClarNtU1ttavzUfvf1raS
FzxPYd59FfMf0oNUqcIP7h1sgxQn91IthLVpmoZTpqkhlZm2ZqSNYS2SpJNoSpLZKqSSSU1k
qAtM1JUkkbDKsWqStG1M1G2sUbJopIsUk9jie83g/sZPV/B+8rD8TQ/jwR2UeJ9Zh9Hke84H
/Ej1n0R9u9VH1mRQv1HoeB3H33C7R4Hsvgj7ak4U5GKXeeXNhjtN36NhpLdfiOy0dEblXHEv
lkR0PA5nLo9Zj1KVes+NcTK3Hirs+LpubUo+TJRmC0WotRaiIxERjWkq1G2oiMRERtbFtvzm
+5mHkadxjWjDc4K7Yi/siLrXqPQ5HI7B9l1PYbnY63w/ZEWidh21q5wmsdh+EGnxMfis3M40
vadp7Hife2K0R4GhT3nwPJCO8nE/iWu2T2mJaPmXM/a/xUWMfpah+PWIyIBvZcju5BOdB3ck
5o4FGZu65c07rjuUa/oV6q2tf66WvPWixS17d1rmLRYq8XmjRobeNGo2KjlvNEiT3tGCJ9E7
MJCZ2NqxWFtsq1mZYxrNqj92Gew1EaUmKkyKyJikxS7Yix/zZSFyD8ZpSB/UkyWOORWKkyJr
ILCEnB5uXkH6kPsU/paMJXZ4Pyfsap/IobqNH+BJ+io9Tiw0OLE0dXydG4dlbrGVSqfcwN2U
wqjDi4J3aJJxYbH+1yeLYwor4sNdGCmGJB6uY4nIcJ8mzGa6OE3bv6mRytV8BhhwVzYTdVPF
Uw0c0wwjCoV3UyO7ZhCsGjq0fNWHVls0e5+xxOTVhXVsnNMuckYTm2ap0NWBtZODVhWx4q+1
9j8Xg/WqaKwc0c1Mt2EtXiObVU6KqMvFWG7RMJllWyKpu9zwYYcWVey/59XJ4nNzc3imSlaT
fk1Omr0aKqSVUcWiQmvu/hx+UtjjjO+2nhy78fljXZmEYwXhGlBvr+Zb9uBMqvEM8n3u0X2T
5VEP0U7oS5vnEbQeMPlmjshaU3TWQQlVQREEREERP9oVO/Zd8bTrnt6GYvavM+J55RUREyii
IiCeE7IOid01ZU14u3ypykF1VN+st4hVNuMXh/I/CRWtfuoQbyvMwNXdpxCuo/7lYXjtIv4K
bwj5VZQ7INZIgGkw3G3snhoZf72Erplta6FxBHRTCW61HpVEneU+a5F7VCy8CImxVTSqIgJX
ZBm/XhmQQREtqrbVrn+ecytt8uW/Phy5468tzIj+VJD4ImS/Iqk0RPyImyysLFi/fukraoYU
oxSGERm9BvVkMwq1KRWZVFkyIvyqj9hwqk1RSZFYqqplUWAmRNxwmMbSSayUSsUWllak2UmE
+99Mfyfd+t+Jo/G/2fsc0apsbCmSPohojRVaLxphSYBy6n4JHHPJYKKDAhOntgcoYsKFrXM6
v2uvFyt0dDGhSuekc+DLSdnHlklOuoSASqUywGJVyHUxnaWIGzsGzZBJ5Eoz+Fx9N7M6ViCi
UjLE0Kkq6EqijRLUtaXRvpu3112l3I2nqkTTH0t1fYhlnT6Gwv0MfiTMn05IcwKlXvlowv6W
axilwjGELs6abK3G5TFVzc1wTbG9nyanbUajKVVk+1xKMlTOvsVnF5yYioQd/udO51OCn4+S
of95Z0jr1iyY6lGSpnHSs4vWTEVeVPH1VXfvLne6afE+2qvwaXt4zD+FCw1rIAh4V67su1lL
Y1CNCdfNDefhveot7JYc9I5xB13mkTn6Hu73wmFSfM8tx3xtcv7munMK3DcNnacD+F+usPiG
rlto2laFy5peG939jY42pVajHN+2955vKJBDfb2dZet3SFnMueOuKxNDeuOez1hS4oyiSMQX
LeFt7hOC4gohgoowa5HcQgFtwbDJBcxIod/fRR6HY70QHPcynEav7+KtjodWHk+Lk1NHsw2P
JrxZTHpN2rEd2/MzKMthyjQzYBwQ5HFLkFxDBJkt2c9Txjh8CWMg5s8NbdpswpKECmipIGDf
r8HLnk82K5QgO3RpOY3fzzu/hA0h3Bxj0PJogBzyTcvPnL9C+SS73jA1NQ7VJiPTxUBO4PDn
d9FUbmFPah/hdSE2cIIXORnbPq5sbipTODBNtnlMF7lzxo8EHwmRqUkQztyTkoxd/Tawc34z
vfu7Tie8g1jBwetRFIx2973ExA1OYQUvBk6r4UeuO5jJahHs40x20U3wxcZDHijBnv7m6TBg
GWvF147NdETeJjpik73XaZzKaMnbo7NkxTbR+Ne+O3wmeeZ7kGB/hbvRXpza5WxfgYPU8Zr0
rwZNv6Gy1rCA9vkLClkC+ETSrhT49IM+FGUxEJpFTzqrvecbgyInp8fT5pfci6Oljjbo+pJR
Co4UZSIhOkVOs1d7zjqDIidddPml6RdHSxxt0fTTpIEersyowvDQrpDvdW6R0aa6QjzHbfht
TntnlnjlWFVur8V3WZ6Y7tnmEzWTvtLIliyAIgWbUYIv1LV/Lm2rNazKtM2FrWLE23owcmRx
cjrp3D2EPi2XGYS1ByaNE+YMjklElyCDBR8hkYGEIIyQZ8c6CbbMjNgqCWFYlCSYGLj2JJGM
paSbUNalHPY8yb849ffHfWp4IMD+4k6Mnxjnc89wk2duMfhsOcmODNcYb0NQm1qrJxqUZKmd
eis4vOTEVCDv7eHc6nBT8d6h/ZZ0jr1iyY6lGSpnHSs4vWTEVeVPT1qu/eXO900+J86ovwaX
t4zD+OFq1+3jlX5fh0hmmtJfTTf17bve2M3VW2+HTbMlE73NUTei9ey6dcwi4xJgWnSCEHZ0
y0rdi8zJnQxLqDuKOYGwwzkCi0imUIZ0lrrljMzJjI5Ihc4xvVpKXIhpHnG9vKY3WMUNdR3Q
fjGLNOWXXOXXpvvI61BwFq72SVq0c/dzebRyMUZMnJpjQxck7FDDlMboMBgwgxQpI1hxS8KI
QXJQY8nUHb1x38x21wX8jHRc8jnc6PVCTvnDevXDR6X6utR6yzrBRQrq7FKO+RfVo5q/bs/b
BGb3brjpo5vxdajqWdYKKFdXa1LMKkZF6bv6V39I53u/dub+H8ckemjsRrPrPi0Jco9MGfQf
wSoimzZ8MGLSTbzcyz4MKRBCnz8SStzm7kHHJImA8Gyhz1OiWOTrZyD2ZeOxgrJXZGGFo2YN
OMXlraJJl0uPadBfvCmCrjldjEHJJn563geDWs+YPRhy9qEPBHD6zyxylg6yoBosa3R46LvX
IuD5seHOkGKQ6G9RrmuR3OfB8vzmTVzOhTaC29zi9th64Dvc5yaMWMoMQ4xjsk2RlFHJ4uQd
sGj0YZTlTKnKmiuFYfjue1bOIFkeyasphR2ZOlaNQyRCxDu7u1soOpSl4XRgfwRo9VgvbPpl
7akUkb3v298dc9i+jfiBPTTc2PDsvBuUPeZPcV4yuPQxjgH4b41FLFpKqadJFm1FaOQkZTJB
gJAnspbcFjGaz5keF/nEl5lOh9Sd59bUlFOdLLIulamVYZWZrTMZ5zShJeIOgMAtMRCELEA7
30IEjx7Kerl1uzvpNTZ+dz8rp2/D7bv9vz48d799/K8kk/vPjCTZCaG/6iz9ClXJcVGD4ph6
W2hzYkXowv1KDK4lYXYMk+eYHTmKVNTvNDlU8XpkuTjJ1RPN5489DVEmUTnqEyqLKp0q1oi2
a0HNlcFLKltdSzBZRYZKYUyYmMMUsMaN2X1pfYpVyoY99LuJ87ivSRg8bd7lBscTsMP6Uktl
4E62UzBjNDoNPZlRLZXLA/wn+wVSqJVH+hgTB7CKVKWmFNMTTE00ItGW64MqzPSwwweoKw8M
PRK0pVudpucLKDKqtWlbWB9+JLzSLK5SpZS4RJYDn+bR2Kv7yywmf3ZmxNZdrbeRiQ9nmfsR
Inp+tgiR8cW9p+B92Pzn+0qI6O8QJ9uzhQAgWwWsoRV8SFyizQ6MPEg/2tSTgyyZmVYGBAZD
6wYLhBYgUGPiEFGGsEBMPR+aZwkXBQuCwMLSWixWCNOTNI7iU0C95iMP+B4aHVhYqNGxgpTv
JJOzBhDODCUpStmDDDBVKp22NTRoaYYFUqmuGBqphSqYcdjghoYasCqVQqlU1NtDRoWUqiVR
oyZZIiVSqVGqSNGhmIwwYJKmMDajgsqyTOhgyqqqqoxgjJjLhSL95j/CQfM6po4dUo61zidU
UwiiVTxNdHAkolGveBEfcP1bIiIYYxj4RFwiLxPY1ccXsY/q00rzO53NjoeBuxEk9u7CkxQ4
lZYJMNqEzTP1Oujtp2FSo5G7ycvRsbE1YibGQjuhqqv62DCla7cl3gKZw1KrKWStGUj5mGvA
jY1powjYyZUpWuWZsajWQmWqMpkWzQ24G4XNutN8L4sTg3W+yC8mU0zJWMDNPaoiz2fvkTbG
7ByV/xSLIQnWozKbxrSxSlRlexKh6KabQSQkd+1OkT/f1PqT5Pmttqqqq2nq97bAqpO/bA+e
iPceR5ngfM8zu1VKkpXu7Q93I4tmr3WP7pPtNbRUtzs5pdF1cSYZ2OZp2I+CpqkXDhicf7Wn
CItiYOTymjRone4VwTZg6KebOuU8c5ZTTj15K9vvfCtqvy1tfd+uJJJAM36XujKT8HWYVN3P
nb3+y3o7Y74zWMZuO/hWcZz9jIhPo3x0Tfl80dZ2NkYkqPm4e2PnqydTxNzkYFQrXobUk25b
HgUaSm3Xhm2M6MJxcGrTQw8Kwb4YKVVNKRAWbe6yHutYAjFoFKFr07bSIFdHiMCIu9szs/Mi
ZtoMl1NB2DO3PumAoHDQcAtsA/HoJx+kwkEmpUKicG9O6bP1BtXG4dMxk4I3VUwlMqtkmy7H
FDvk/DVg1csGVPHgmDjx0mUvZZs8SLWHDivUufYCehCCbDjQmOmnfYRFRnjGyIMrjBAIWyII
HOwcOAQ5M5oyakYNBsNHQ1hCVs4UfQ6btXq6iZIiUQQYnpgwhbshBwcqJySqWw5I9xEazCsi
S9gcmLMyJjuKWtY/CNqr9d1Vax31uEwjtEPMm+uq5zc8Tq4fk9nE5ngdTomHYk5spsvXTwRI
bWJDXWrhFxb37Tvppbz5Zyv/IfUfnli17PCJO/Bu2ktMomkJU8PZyeoHsWs4grAfzMd7jpbV
+2GZEZlp5VmZcrdEVkZa74sFn320aU5nA4mO3M2khEs0cOWJlxcsMqQwCCl7c5UVhx7KKX0x
kcRLKJYSyFb3MFps5YQsgAFTb2LlzjAk8XwrOiK7wcXEeF3Ssru10TZsFNg/B0Eh7ywcBsMh
xYjmSwZccyoWLWJ2o4wgpvoyw9hi0KIbaMub/MOmSt8Rq498xMqy8KvSMQmJgCZIkwSmlFVt
okl8CUjZdEVXdYegsWsYOBxMnE5GvHpsxiJJ71BtwutWlFTtKEHEE9IyZ280p26aEIPEDA43
avBhw4L9h+YX2vN/c8L8Vs+e/RsmNmmGk0zDTVfYw/1iMff/pqfz7Epug2Msn5kZfcpe4Tci
ZaP+Zhh323iYFkuMRGxJFPOdXuedfS4txH0Ywsw1aWtqGmYZsVltobKrouTvJj8bB76nPKme
keD9x7L94XhSL5Wz1P6i5P+Cne0vWYkx9q3R2nafvPE9nyP4bgkHSdnj8yjvtdT6FV2DTYsL
mXbA4jQ4AmALiOg/gpfNVV+m/D9CMRAgWiJUf93JL+VpjYNknBxL1vUrg4OoujxYbOlUrdZR
Vi/Obr3oYVP2vN+dupuWNGJHseDdI4NxD+psn1kx8jgXBNid4mHBUHeKWn40THVudrFQc3NL
gOSrHBjYLZxMScG7Z3r/0P66QfwZe6L7Yh9jSg2pBllIP6qQbH73/VwUfU/W4v3/vP0D/j6z
/Q6U+ip5R8WlCP+3BEX+BvU6VwHYdr4v9+mV1DVT+An3j5jcTcwnn0My/pMv4u/g9Z5wYf1n
kaRFu+SSXeRpCwltVBozDMYz/o7F/cf670O02dz/q+NUXccYp2P3dvrT9SnrJNPwn2I9zn4P
jdS7H5F3NFXuSS+kaUValSPecD/lyT1xf9Sev3zg2TofE0NymTY4m32QJCj96mJIHz7PeaNH
Q80yfYFEvnPYvgcr2HOqL2n+WzY5/4n2NzieDY4/9j2Qf6Vez4mx0OpS/U8R5LZ868r2O91P
c4riX1NRF6wH97S4322fIdg3HzO5T4bXxec4OJ4HiRKMp5PalFyRD3dL9bErDaqVjKKths5s
N0kt6ovhfa9w4fgvP8bi8TyinbB/SvUW90PEwr3twnuGzTCU2GgtCmMUe2Fe357mPZlHWD1p
Jfyzm6php1cAI0bPnONUXzHTYexEXYtH/S7jLbmg88u5fGHF8+h23lVFjk5YhyhoeYfgP2v6
mD7U2exuGFQ3Sq9w5n6PdlPueK8I4mHs+x2LhN2y/K6uF9o9JIXicmW8K61RbGGl9L8Exf3v
U/W7HGdWV9B4Q6xTDrFN1WnyPYfGtqfziq/Btqr35ewAAAAAgAAAI2tAABFoAAItsAAEWAAC
NAAAAAAABAAAAQAAEAABGwAARbAABGrUADfr6rW1cEEbPQjtENNzcwmmXtXbBona+5EW76Td
99XD7unyPDm2RF+CqLeDmE7V8ch6Bj1MKfgO4mXVzGnOXQ5rvP/k8XNdx2Hxn0HjbjpYe+bu
plNLJ9r8dPBPqcu50e9sEeaRZ8FZKkZkSKSJT82GU+197/a2cn0XovNeHmaNHWKcC3HpbOGR
DnVVYn9N+Q2O4eU+jO17n1mPgkl853WD0J85+d97xbtO9UXznytPpn3uT6W5X1p774HxRF8F
yX7T3pDSD8k8F8TL9+/ryX+Grq6sl22l2TtLpLqaNFjGqmrR/5R1qi9HmjViyxallZltZlmV
YijbWmUZYSZjMZkqXebH836e/XX7v8Tx+klEpIfw1QdIgm/heyxFyBenTZLsTsawJbsEOkiQ
9j578l7B9m2VVRRVFUmxxYLRYMDcQlyw3dtrjHbMjhKwLF4tMY1BzqcDdO6Sm5KZwzfw61M1
v0yOKO3ltzv5NNRyUUskV8F906ZntIkCANezueLeFKEhHxC90MJ7n9jydWrYnhcG+Es/NBGD
CyyUW2btC0LFMssVhDLLpp4kbToLwKo8KeDoKFzRPcRvTCZmDiYbl/r3zGKxc0ZlZlmW19Uq
IT4n3sfFcX68q/UOZfeZXGQehfwdegrv+Ripi1CZZo46WzTk6GJ+baeypflN57lUdiSWAY1m
MsZk2ORPP7NPpUjz1oayizJxzMllhcjTBFkWyLTxVxq4YkzPhHKTKNCmX/gj8X4du9ObocEe
+MhO0/1vsGJwSNsPVlahGU8Hwer+xkrDBhhWBXrgylQxXuR4pJbNnYe37VfBfNRaTzO2d9cV
29h9z+JWdX+LnpipP4KXsbObuw+ae0T1DEwzEIZpBhPhEUcgjiQ7N10u4UQut1dnbVde1S8r
a/kY4EpwfV7Zzyg+hrj3Iy/++FciU+udD+pimYsxMvsTweD2vFq+doP6GU/9VHsMWr6yTFcy
of+Lo6TzbseN5scCtGx5ZJe5THot6nELbKZtElxr1VNm3e+nq4qvrT4NJtPuXYtSd56VSurF
UrK6WktLAXTCQ7tVLRWTaZRoYRDEwMLFI5S0h8MrZkzMyy/ebrZFW1YquZt2Fue82w2TteIm
fRXH+gjc8akrhU4c8YyFqlNedi8lIbyj1PF9AXBckcCuSJci9rPB4rkleo7TuUzFFxykbDB2
HoRBzjwSLwcSz/hT7VaFRaRQP0SFdHikOzmk2FkKlJVDqownhc288szMxNhpERF8iWR8NXYV
ykFW4NEplKk3Y8dQqoTk6I4QceLmxS7G1+8nYicbHZguRTsD9TXVEnxYOxVqqtVVVXorBljC
818GknfLcp5tvtr2MPOtheUqcTZgSZSJwQOGaqro6t8PBGsWMNzFSHlTuqlpasqWRNH+J3eT
jPP8TUrvYVtYy1EWmwmOLc1T1a0tzLWpo0lhzeHiqsssyZZY0zGmYxjTMZfLkyZMmWSO3L8z
Gxvo2YnF9U61OQn2GlOCyos+OINDi7HWjTTYtBitFUy44sJL1wWUwaKJXURTVknhdq1MvGWI
kUWybKcTDdVSm3GEnqd0A/vdEiRrNPpjGM3OLMsnBHBz2QpRwTqVW57oT4GnDg1VTFVvMYZU
8CJHMxOjy/oUqyKof9ynoG7ix5UpHlmGMlDGYxOnvyQNGqVVVy2aRozHZWDMgh7jZgN6aKGh
SISk0VMsiSWxtFs/NHtRyic1H4NK/lUsdKuTiqZnyLhq8FIidXq+Tg0iCY9dmTkyKNg1vMpZ
UqmzaYZjLMwxZoskaSRJSNplkCimSUlkkoksaaxsRSopkklGKiZM1FIGZTTQqwpMTZbTJkll
KlKXW28nq3lvW8mutNLKYpZL03VmmLMspZlZspkpZZZkUlmYxaa8XUlJZTJLzrXUtLLKUu63
ZZLJZSzc6kpfJdXUtmYpLNpPHrvLzJpiyVllpbp0klLxcbJJZXbtXZZLIbNLLLMszFkpSyWa
ZMsizSyWbeXVuslvyqt2SyWb1100RZuluxjGMYxiNFkpMUyyRSlllmWSyWbNkqpTAdjc4k9i
aFcLoUxcKsUYYxLMWYWB1G4T/sdiqpVOoIPtfccfB/A3nWrZVq+tYVbaq0vzvCJfmdkSY4yo
epR5nyHKTVPKh6BYjvOQntMipiDCGSTKZTCgxVlR/pDD4Sr3ypSn9TDZ/aeMTaQ4Ku55tnRM
0Seq+Eq7ytqm9bXDGhTyOjueRp4uaPVc0yysdDpjg6m0ypZZQrx+GkmZWa1mVawWtaMy1ou4
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
cKHQiGKHAEoGdhEgQOjTqBjxOA2NK4YrJulgYgwqYSwj4yxN0yxJtcbXE9++PpWLFacfu0aN
NNNEk0qelGLKs45xM6YlrBs2aNE31TU0ECgOIgkopTivBI1UKIIglItkLHbUhLlDyO53O/Dh
Mhd5ppu7unFFiJmYWACCacNNN3d03d3DSQJnkRyDGHFsxo0hNM42bMSZKq7UtwTnym8YJkVW
Vu3K1JhodjGMNJTQpYYjkX6ZkOBXBxfRomomsS2S2JbLTt2xPRuUt9fiwfB6NPpMw2vk7XlU
3PYZS14LiKypiNFZwIqmRupNhdqNqHBcCUw0YJhEoioxVJahTDDAuBoNSai2MmxrFBVMzGMG
oksPvLCU2KcNEtXBwrW61U1Y2VZoaLEYlG9Nml/Wwa90721XGn0C0JywwS2e59jat5xv+ZhP
nxmwDePBhMCYVrEkjLElTLMYUdQeGjs2TS+lFzXhDgTvSXBiTi1pS7gulxj+97+SbOUh2nGq
tCbWToKlwmwdtbe/1u7nLdxEW1Se5gPN+R4Dd9IlwrtL7nf4m9Q/Le36zuJE7tzumIclhSyq
lSwwkieZRjMmJ9wmqaVIlJIrJVNiVil79cV8XNzXd1yNd3ovLleKOzWsMzVk1wbZWHpOjafm
SWnRbByXFIvrNKHNsFbospU28Lf1qD6Z5XCnJHYSnPRfaoPF8na7m4qvjSvViXXGw+pLGPt1
jKmZwvcYW9VZXlfJNt9MkkmCSSSSSQJJCSSSSSSSSQkokkkkzJJJJJJCSSQJJJJCSSQkAADI
SSSSSSSUySX5Mtqr2r9+9tefC991e2cxjF08rzXV112JSbytdzeXbr4zmLzrsYxg3V1uxXcz
AuXKjjhIUpSlMzMjMAuCYhwmMKIIrJkgjjmTcDBYSFuu04kl13d3ddXV0Yp0kkukY8q87yLu
6dSukOrq6MHXXRi66S7EjpdddddI5JkSDhKsokIDKY0uOSHlSZdvK87uukukYwEYxhmGMY87
jGMYxRoj3qpw1ckkXBnMBYEklVESmS4XBA6urqDF11xp0uMXq88S8ypI44kcmOIiIiKk0olK
RjMYSFEECUzCiUREpbbhmBSlxHEtKUpmEpRCUwwgyxJCQPLzzy666SzpduuujGMaO12upzjy
tnMYiDQaDEow2zGMYwMY08dnS4REoTGSkEVCJByTtmiWZJkhEERDWqqqqqqqqSQgiId10l26
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
--------------020804010101020205090300--
15 years, 3 months