From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: "Dr. Arne Babenhauserheide" Newsgroups: gmane.lisp.guile.user,gmane.lisp.guile.devel Subject: Re: Guile Potluck 2021 Date: Tue, 02 Mar 2021 08:08:50 +0100 Message-ID: <874khujam5.fsf@web.de> References: <1144e4d9920845eb4f49e6e099a306e85735bd01.camel@yahoo.com> <87tupx97ey.fsf@web.de> <10585499-c6ef-4cce-b576-60940b3aa4d9@www.fastmail.com> <87o8g58nsv.fsf@web.de> <87lfb98nqw.fsf@web.de> Mime-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="12522"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: mu4e 1.4.15; emacs 27.1 Cc: guile-user , guile-devel@gnu.org To: Linus =?utf-8?Q?Bj=C3=B6rnstam?= Original-X-From: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Tue Mar 02 08:09:47 2021 Return-path: Envelope-to: guile-user@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lGzAB-000368-4g for guile-user@m.gmane-mx.org; Tue, 02 Mar 2021 08:09:47 +0100 Original-Received: from localhost ([::1]:48580 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lGzAA-00029Q-6B for guile-user@m.gmane-mx.org; Tue, 02 Mar 2021 02:09:46 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:57576) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lGz9s-000291-K5; Tue, 02 Mar 2021 02:09:28 -0500 Original-Received: from mout.web.de ([212.227.17.11]:50569) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lGz9o-0004Up-6g; Tue, 02 Mar 2021 02:09:28 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1614668938; bh=OU9cs5et88SoBrAWRR4QIZ9mqpNhAaLMQqghXeayilI=; h=X-UI-Sender-Class:References:From:To:Cc:Subject:In-reply-to:Date; b=rgeD8ZzEwj/SOcuRzpzaHICa8hwxmmH3AkYqaI/34VxveGNNjthK+C3v6Ljem1U/u b5Rluu5vmWnpxbtaCHiKyTC4r/qrLXi3BGKaPkCjOIwEZCkxZSa+58y7P+NQNlQE8m Men3kJlh2RmT9ZPnybmBg8SQ3WzjEXUo9n+zzkzU= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Original-Received: from fluss ([84.149.81.26]) by smtp.web.de (mrweb103 [213.165.67.124]) with ESMTPSA (Nemesis) id 0LoHcD-1ljCIV0qqn-00gHpe; Tue, 02 Mar 2021 08:08:58 +0100 In-reply-to: <87lfb98nqw.fsf@web.de> X-Provags-ID: V03:K1:1KrrC1bJFjireORNSv2BUrZZyHpNVYsh1GWQ41Aa+AXd9SVqD5J gY3SAPmoIYdy+AlitEz6+89W7rX4appyEnNBe81rDveMIW8ZQu1rQrBIO4VJgaLHHHY4Wo3 zY+meDGe89uvPltjxE3cvZ0xJYkfsny2tj/E8jyRZJ3MlkhCPMRBelo5hRcl8gwU3bc5kfx cd9Ehrt15Lm8i8CPq65jw== X-UI-Out-Filterresults: notjunk:1;V03:K0:MdsjP8EYyMg=:QYcvbcOJZmtRpRzhQLcLtz Nn4nUYP1ZctIiPNcaa5i+CtieNoxiXAG7OQ9aOiifoNfZUoZYXdF/EMGBM9WTWCPlOSn+w6LJ mxj+JXJpPIf3nDotXlCxLoBxEyLnpjkbT64y2yQ8PJmv7wbRr+pR4eBT78VxBjRbS3mWIrBCa msISaY7yMAzKA6WKqZukw0tuxwOaLN+pRQLigIkgO2lcoY2czQurtZp+BSh5h4lz5F0Ux3C6E G5nS+XbeAQRUg86ObVFyvqHz7RqqpkesyaMr82PZvl54PSZS5IarOjnh6ZR8eqPchQ2rxLT4m GLNgchnU15SKNFoqvzGMkuh3k71IadsMwXAU2X+e5Povnna19y93bXT3S15kF7OZOF3LOEqQD iIcTWeTku3+JieWnRgHKe5YcY1DD3s1Ci+NPFYLMSnLOHIN0DfWPBJ9qtLZTr7SE6MdZixiQn dGTM2wgqxRCFkzqTOcZXpnXAKAu9+CRCyU/7eWobJHbORjdlN/lHiWJtgitWkCTc1tN9DYr8f n7YengJhOuq1lC5CDPk0GKcRFXSOsDlaFEPs3DwCieV9CMbPADgsQSwRnr80vrCEmzUszcF7q 2/cHmJiIUq2kAP2/BDhZGo1a+XQJWHJDlaYjXL14aGq9mBkpl5NJLRSqnrtG5H2oza0hP1rP/ FBVAdmaIzW1gY6a0ca2rKKvUKHHJeewjZqxNe1eMsHxJrTCuLC1m9WQXUScV/17ahHs/gbZvT BT+/YOku5WdLDnw7nMkIsnYl5UOjseNC7XYx4NqEtRKRHX2oDUrfUfqdwqwkiVVte+boSM5G Received-SPF: pass client-ip=212.227.17.11; envelope-from=arne_bab@web.de; helo=mout.web.de X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: guile-user@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: General Guile related discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Original-Sender: "guile-user" Xref: news.gmane.io gmane.lisp.guile.user:17332 gmane.lisp.guile.devel:20684 Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Linus, I now created four profiles, one for the CSV import and three for the trust calculation. They are generated with: guile -L . > (import (wispwot wispwot)) > ,profile (define changed-and-state (import-trust-csv "trust-anonymized-20= 20-11-01-under-attack-sorted.csv")) > ,profile ((@@(wispwot wispwot)import-trust-value) (cdr changed-and-state)= "OBSERVER" "OBSERVER" "15363" 100) > ,profile ((@@(wispwot wispwot)import-trust-value) (cdr changed-and-state)= "OBSERVER" "OBSERVER" "242" 100) > ,profile ((@@(wispwot wispwot)import-trust-value) (cdr changed-and-state)= "OBSERVER" "OBSERVER" "853" 100) % cumulative self=20=20=20=20=20=20=20=20=20=20=20=20=20 time seconds seconds procedure 21.92 286.68 286.68 wispwot/wispwot.scm:456:18 21.14 276.46 276.46 wispwot/wispwot.scm:449:18 20.86 292.23 272.82 vector->list 13.26 2124682.83 173.39 srfi/srfi-1.scm:600:7:map2 6.46 84.52 84.52 %after-gc-thunk 4.04 55.03 52.83 wispwot/wispwot.scm:457:17 3.96 54.41 51.81 wispwot/wispwot.scm:450:17 2.27 29.69 29.63 make-srfi-4-vector 2.25 29.43 29.43 length+ 1.01 16.43 13.24 wispwot/wispwot.scm:276:0:calculate-scores 0.93 12.19 12.19 list-tail 0.53 6.92 6.92 display 0.23 3.10 3.01 write 0.16 1295.52 2.12 wispwot/wispwot.scm:375:0:import-trust-value 0.07 0.95 0.95 object->string 0.06 1309.39 0.80 srfi/srfi-1.scm:452:2:fold 0.06 0.78 0.78 srfi/srfi-4.scm:85:20:u16vector-set! 0.06 0.98 0.75 ice-9/pretty-print.scm:273:0:pretty-print 0.05 11.09 0.69 wispwot/wispwot.scm:513:8 0.05 4.98 0.66 ice-9/pretty-print.scm:258:2:rev-string-append 0.05 0.66 0.66 srfi/srfi-4.scm:85:20:s8vector-ref 0.05 0.63 0.63 vector-move-left! 0.03 16.75 0.45 ice-9/pretty-print.scm:37:0:generic-write 0.03 4.38 0.45 wispwot/wispwot.scm:349:0:vector-append! 0.03 0.45 0.45 srfi/srfi-4.scm:85:20:s8vector-set! 0.03 0.39 0.39 srfi/srfi-4.scm:85:20:u16vector-ref 0.03 29.90 0.33 srfi/srfi-1.scm:580:2:map 0.03 9.09 0.33 ice-9/pretty-print.scm:62:4:loop 0.03 0.66 0.33 make-vector 0.02 32.59 0.27 wispwot/wispwot.scm:194:0:calculate-ranks 0.02 0.92 0.27 wispwot/wispwot.scm:415:2:find-index-record-if-= needed 0.02 0.27 0.27 procedure? 0.02 0.24 0.24 ice-9/boot-9.scm:1345:3 0.02 0.24 0.24 make-string 0.01 0.18 0.18 ice-9/pretty-print.scm:100:12 0.01 0.18 0.18 min 0.01 6.14 0.15 ice-9/pretty-print.scm:293:17 0.01 0.21 0.15 ice-9/pretty-print.scm:72:22 0.01 0.15 0.15 srfi/srfi-4.scm:85:20:u16vector->list 0.01 0.15 0.15 remove 0.01 0.12 0.12 length 0.01 0.12 0.12 srfi/srfi-4.scm:76:2:make-u8vector 0.01 0.12 0.12 random 0.01 0.12 0.12 srfi/srfi-4.scm:85:20:s8vector-length 0.01 0.15 0.09 srfi/srfi-4.scm:85:20:u16vector-length 0.01 0.12 0.09 %read-line 0.01 0.09 0.09 srfi/srfi-4.scm:85:20:list->u8vector 0.01 0.09 0.09 srfi/srfi-4.scm:85:20:u8vector-set! 0.01 0.09 0.09 hash-ref 0.01 0.09 0.09 ice-9/pretty-print.scm:61:2:wr 0.01 0.09 0.09 cdr 0.00 1.40 0.06 ice-9/pretty-print.scm:58:2:out 0.00 0.39 0.06 wispwot/wispwot.scm:504:4 0.00 0.06 0.06 integer? 0.00 0.06 0.06 ice-9/boot-9.scm:806:0:and=3D> 0.00 8.08 0.03 ice-9/pretty-print.scm:95:4:pr 0.00 0.24 0.03 srfi/srfi-4.scm:85:20:list->u8vector 0.00 0.09 0.03 string-split 0.00 0.03 0.03 srfi/srfi-4.scm:85:20:make-u16vector 0.00 0.03 0.03 car 0.00 0.03 0.03 srfi/srfi-4.scm:85:20:make-s8vector 0.00 0.03 0.03 eof-object? 0.00 0.03 0.03 srfi/srfi-4.scm:85:20:s8vector->list 0.00 0.03 0.03 ice-9/pretty-print.scm:256:0:reverse-string-app= end 0.00 0.03 0.03 list? 0.00 0.03 0.03 ice-9/boot-9.scm:888:0:iota 0.00 0.03 0.03 reverse! 0.00 0.03 0.03 append 0.00 0.03 0.03 list-head 0.00 0.03 0.03 srfi/srfi-1.scm:584:5:map1 0.00 1307.69 0.00 ice-9/ports.scm:428:0:call-with-input-file 0.00 1307.69 0.00 :2:9 0.00 1307.69 0.00 ice-9/ports.scm:492:3 0.00 563.14 0.00 remove 0.00 84.52 0.00 anon #x7a24b0 0.00 54.83 0.00 gc 0.00 3.10 0.00 object->string 0.00 0.12 0.00 ice-9/rdelim.scm:193:0:read-line 0.00 0.03 0.00 inexact->exact =2D-- Sample count: 43863 Total time: 1307.687229447 seconds (726.756595442 seconds in GC) % cumulative self=20=20=20=20=20=20=20=20=20=20=20=20=20 time seconds seconds procedure 57.35 21.72 21.56 wispwot/wispwot.scm:194:0:calculate-ranks 11.35 4.27 4.27 wispwot/wispwot.scm:324:10:discard 4.91 3.43 1.85 wispwot/wispwot.scm:313:10:add-to-score 4.17 1.59 1.57 truncate/ 2.96 1.11 1.11 ice-9/boot-9.scm:888:0:iota 2.57 15.87 0.96 wispwot/wispwot.scm:276:0:calculate-scores 2.43 226.03 0.92 srfi/srfi-1.scm:600:7:map2 2.13 0.90 0.80 srfi/srfi-4.scm:85:20:u16vector->list 1.74 0.65 0.65 srfi/srfi-4.scm:85:20:u8vector-set! 1.65 0.67 0.62 srfi/srfi-4.scm:85:20:s8vector->list 0.96 0.85 0.36 srfi/srfi-1.scm:580:2:map 0.91 0.34 0.34 make-srfi-4-vector 0.87 0.33 0.33 append 0.74 1.34 0.28 srfi/srfi-4.scm:85:20:list->u8vector 0.70 0.31 0.26 srfi/srfi-4.scm:85:20:s8vector-length 0.70 0.26 0.26 remove 0.61 0.23 0.23 length+ 0.48 0.18 0.18 integer? 0.39 21.17 0.15 srfi/srfi-1.scm:584:5:map1 0.39 0.15 0.15 reverse! 0.35 0.13 0.13 car 0.30 0.11 0.11 wispwot/wispwot.scm:338:19 0.26 0.10 0.10 procedure? 0.26 0.10 0.10 min 0.17 0.07 0.07 %after-gc-thunk 0.17 0.07 0.07 list? 0.17 0.07 0.07 length 0.13 0.05 0.05 srfi/srfi-4.scm:85:20:list->u8vector 0.09 0.03 0.03 delete-duplicates 0.09 0.03 0.03 wispwot/wispwot.scm:236:10:discard 0.00 37.59 0.00 wispwot/wispwot.scm:375:0:import-trust-value 0.00 4.30 0.00 remove 0.00 0.07 0.00 anon #x7a24b0 =2D-- Sample count: 2300 Total time: 37.593051451 seconds (0.998694416 seconds in GC) % cumulative self=20=20=20=20=20=20=20=20=20=20=20=20=20 time seconds seconds procedure 69.60 47.03 46.98 wispwot/wispwot.scm:194:0:calculate-ranks 9.26 6.25 6.25 wispwot/wispwot.scm:324:10:discard 3.14 2.12 2.12 truncate/ 3.11 4.22 2.10 wispwot/wispwot.scm:313:10:add-to-score 2.36 241.68 1.60 srfi/srfi-1.scm:600:7:map2 1.91 1.38 1.29 ice-9/boot-9.scm:888:0:iota 1.62 20.47 1.09 wispwot/wispwot.scm:276:0:calculate-scores 1.30 0.93 0.88 srfi/srfi-4.scm:85:20:u16vector->list 1.18 0.81 0.80 srfi/srfi-4.scm:85:20:s8vector->list 1.06 0.72 0.72 srfi/srfi-4.scm:85:20:u8vector-set! 0.63 0.54 0.42 srfi/srfi-4.scm:85:20:s8vector-length 0.58 0.39 0.39 remove 0.53 0.36 0.36 append 0.46 0.31 0.31 make-srfi-4-vector 0.46 0.31 0.31 length+ 0.41 0.28 0.28 integer? 0.39 0.98 0.26 srfi/srfi-1.scm:580:2:map 0.36 0.24 0.24 procedure? 0.34 1.35 0.23 srfi/srfi-4.scm:85:20:list->u8vector 0.31 0.21 0.21 reverse! 0.22 16.14 0.15 srfi/srfi-1.scm:584:5:map1 0.19 0.13 0.13 car 0.17 0.11 0.11 wispwot/wispwot.scm:338:19 0.14 0.10 0.10 min 0.14 0.10 0.10 length 0.10 0.07 0.07 list? 0.02 0.02 0.02 srfi/srfi-4.scm:85:20:list->u8vector 0.00 67.50 0.00 wispwot/wispwot.scm:375:0:import-trust-value 0.00 6.25 0.00 remove =2D-- Sample count: 4145 Total time: 67.498343877 seconds (1.476365885 seconds in GC) % cumulative self=20=20=20=20=20=20=20=20=20=20=20=20=20 time seconds seconds procedure 57.04 35.87 35.81 wispwot/wispwot.scm:194:0:calculate-ranks 12.43 7.81 7.81 wispwot/wispwot.scm:324:10:discard 4.84 5.95 3.04 wispwot/wispwot.scm:313:10:add-to-score 4.61 2.91 2.89 truncate/ 3.30 367.72 2.07 srfi/srfi-1.scm:600:7:map2 2.96 26.90 1.86 wispwot/wispwot.scm:276:0:calculate-scores 2.72 1.73 1.71 ice-9/boot-9.scm:888:0:iota 1.81 1.13 1.13 srfi/srfi-4.scm:85:20:u8vector-set! 1.60 1.04 1.00 srfi/srfi-4.scm:85:20:u16vector->list 1.13 0.74 0.71 srfi/srfi-4.scm:85:20:s8vector->list 0.99 0.62 0.62 make-srfi-4-vector 0.84 2.35 0.53 srfi/srfi-4.scm:85:20:list->u8vector 0.73 1.46 0.46 srfi/srfi-1.scm:580:2:map 0.68 0.43 0.43 length+ 0.68 0.43 0.43 remove 0.60 0.51 0.38 srfi/srfi-4.scm:85:20:s8vector-length 0.58 0.36 0.36 append 0.50 0.31 0.31 procedure? 0.42 0.26 0.26 reverse! 0.34 0.21 0.21 integer? 0.29 0.18 0.18 list? 0.24 0.15 0.15 wispwot/wispwot.scm:338:19 0.18 0.12 0.12 car 0.13 0.08 0.08 min 0.10 22.56 0.07 srfi/srfi-1.scm:584:5:map1 0.10 0.07 0.07 srfi/srfi-4.scm:85:20:list->u8vector 0.10 0.07 0.07 length 0.03 0.02 0.02 %after-gc-thunk 0.03 0.02 0.02 wispwot/wispwot.scm:236:10:discard 0.00 62.77 0.00 wispwot/wispwot.scm:375:0:import-trust-value 0.00 7.82 0.00 remove 0.00 0.02 0.00 anon #x7a24b0 =2D-- Sample count: 3820 Total time: 62.773351245 seconds (2.013414284 seconds in GC) (I see here that the GC time during actual trust calculation is much lower than I had expected) I hope they help! (you=E2=80=99ll have to pull again =E2=80=94 with `hg pul= l -u` =E2=80=94 to get import-trust-csv exported) Best wishes, Arne Dr. Arne Babenhauserheide writes: > PS: Still it is important to get this code fast, because it is the > fallback for all situations where I cannot cheat and only calculate > a subset of the trust, and it is required at startup. > > Dr. Arne Babenhauserheide writes: > >> Hi Linus, >> >> Linus Bj=C3=B6rnstam writes: >>> I had a look and there is quite a lot you can do. Just out of >>> curiosity: how much is GC time? You are generating a lot of >>> intermediate data. Instead of vector-append! maybe use something like >>> the new vectorlist srfi? If you show me a flame graph and give me some >>> test data I can have a go! >> >> Thank you! >> >> I expect GC time to be roughly half during the trust calculation (much >> more during import), because this fills up two cores. >> >> I can=E2=80=99t easily give you a flame graph (except if you can tell me= how to >> generate it), but I now pushed a version in pure Scheme (instead of >> wisp) that runs a huge test: >> >> hg clone https://hg.sr.ht/~arnebab/wispwot >> cd wispwot >> ./run-wispwot.scm --test >> >> This imports 200k trust edges (which takes a lot of time) and then does >> three full trust calculations (which each take around 70s). >> >> The most important limitation for optimization is that the memory use >> must stay reasonable with 64k IDs which each have 1000 trust edges. This >> memory use is what the current code is optimized for (that=E2=80=99s why= there >> are all those u8vectors and u16vectors). >> >> For the math: at 64 million trust edges, this should currently require >> (in theory) less than 200MiB of memory for the actual trust structure (2 >> byte for the id, 1 byte for the trust). >> >> Going up to 300MiB for time-optimization would still be viable, but it >> shouldn=E2=80=99t go beyond that (there are algorithmic options to reduc= e the >> amount of work done per update, so the runtime of the current code is >> important but it is not a life-and-death situation). >> >> Best wishes, >> Arne =2D-=20 Unpolitisch sein hei=C3=9Ft politisch sein ohne es zu merken --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQJEBAEBCAAuFiEE801qEjXQSQPNItXAE++NRSQDw+sFAmA95IMQHGFybmVfYmFi QHdlYi5kZQAKCRAT741FJAPD66rxD/0QaGIZUXFdyA5tI6jjI10G4q6MwdhnSdJC anugF/MfmnHaeTsFm46m2ZLIOAhcrDNQ/6vvfH7gXxFaRx954K1lHt0Dy03D1dWT lpU3KFGyuS99TBHc+5y+tadkbM8LJ2PhXD+2wTa+/30c1LXO9GxpYVGwatHyMUj7 nDYmfo3ObZ6/NEDr6L70ljq19QxQM0X/+AAbzWnzeqQHB5PfuLTX8tI+Ox1rqMVz yPWiEASp3vzuE0cQiCWCxcBzktzaQ0zRiIVmhidRK+8t4Smq3PBF454ROyNjyxHW NGn64tJ4NvSN0cwGy6b7AVrO5CK8fgK3bXUX+pay7/Bd7uJgWnnjbW0+vPuVu9AJ Ek294NxHIn4an3QFzzlyZzkwU64DBe2eYZH592RCLfNBrYjSORJMQ8GnXDzu+Kwr 4cl6OKdiHQciOji5/Gug3WuSyR+mVRrjPxUpiTnnLkKun+GGtc1Tq5NyZv5xTL6P kwqcgDKdnrmrq35Lk9GlRz4Zt1UqBDRl56WUFt5FDsV5EEvS/vm5Zgi2VbJYQ/wM dHO/eaVhHHh9kR5ocg1ZeXt9jEkTrQjT8F6AcwnnWzX3xMyl2e53fnASsgJoom0u CewKRmw7iDzB96jSiQ2D3ZRsYbYC+BOxsgjZq3bGnNJCU/bsF9ByCYf6fE800oxT xfyxzFHok4jEBAEBCAAuFiEE3Si95tmHXKvOSosd3M8NswvBBUgFAmA95IcQHGFy bmVfYmFiQHdlYi5kZQAKCRDczw2zC8EFSOmJA/430/183nJObKCYJ+yA9szOOStH yppsgTCYnqwv2VTW6I0mv1mIIW1Rd9PvCmAyGeuYa6AD4BI8Kz7AEywALJsasmY2 1MoEj83xi4nceastQ8Zg2ZO77ssl2lx+GaX2ivfzvshSg9zAOm+EydFJFjZwBy8B Tq4LWVV8P+qDIvJ7tQ== =oFu9 -----END PGP SIGNATURE----- --=-=-=--