[prev in list] [next in list] [prev in thread] [next in thread] List: spamassassin-devel Subject: Re: Update to the Pyzor plugin (Re: bug 6108) From: James Birkett <james.birkett () cyberhound ! com> Date: 2017-03-13 3:04:23 Message-ID: CALK_y8JSo4WCum_aP4X=RZ_yomumEN_8oW2xEVNO4bMwRbSHnQ () mail ! gmail ! com [Download RAW message or body] --001a113d05eaf9eefe054a93f7b4 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 T24gMTEgTWFyY2ggMjAxNyBhdCAwMzoyOSwgUlcgPHJ3bWFpbGxpc3RzQGdvb2dsZW1haWwuY29t PiB3cm90ZToKCj4gT24gU3VuLCAyNiBGZWIgMjAxNyAxOTozNToxMSArMTAwMAo+IEphbWVzIEJp cmtldHQgd3JvdGU6Cj4KPiA+IEhpLAo+ID4KPiA+IEJ1ZyA2MTA4IHNheXMgaXMgdGhhdCB0aGUg cHl6b3IgcGx1Z2luIGlnbm9yZXMgd2hpdGVsaXN0aW5nIGVudGlyZWx5LAo+ID4gYW5kIGEgY29t bWVudCBvbiB0aGF0IGJ1ZyBzdWdnZXN0cyB1cGRhdGluZyB0aGUgUHl6b3IgcGx1Z2luIHRvIHVz ZQo+ID4gV2lsc29uIFNjb3JlIGZvcm11bGEgZGVzY3JpYmVkIGhlcmUKPiA+IGh0dHA6Ly93d3cu ZXZhbm1pbGxlci5vcmcvaG93LW5vdC10by1zb3J0LWJ5LWF2ZXJhZ2UtcmF0aW5nLmh0bWwKPgo+ IFNwYW1Bc3Nhc3NpbiBhbGxvd3MgZWFzeSByZXBvcnRpbmcgb2Ygd2hvbGUgbWFpbGJveGVzIG9m IHNwYW0sIGJ1dCB0bwo+IHJlcG9ydCBoYW0geW91IGhhdmUgdG8gZ28gdG8gdGhlIHdlYnNpdGUg YW5kIHR5cGUgaW4gY2FwdGNoYXMgKEkgdGhpbmsKPiB0aGVyZSBhcmUgYSBmZXcgdHJ1c3RlZCBh ZG1pbnMgdGhhdCBjYW4gYnlwYXNzIHRoaXMpLiBUaGVyZSdzIGxpYWJsZSB0bwo+IGJlIGEgc3Vi c3RhbnRpYWwgYmlhcyBpbiByZXBvcnRpbmcsIGFuZCB0aGUgYmlhcyBpcyBsaWtlbHkgdG8gdmFy eQo+IHN0cm9uZ2x5IGZyb20gaGFzaCB0byBoYXNoLiBJIGRvbid0IGtub3cgZm9yIHN1cmUsIGJ1 dCBJIHN1c3BlY3QgdGhhdCBhCj4gbG90IG9mIHdoaXRlbGlzdGluZyBjb3VudHMgbWF5IGJlIGhp c3RvcmljLgo+Cj4gRW1haWxzIHdoZXJlIHRoZSBib2R5IGNvbnRhaW5zIG9ubHkgbGlua3Mgb3Ig YWRkcmVzc2VzIGdldAo+IHByZWRpZ2VzdGVkIGRvd24gdG8gYSBudWxsIHN0cmluZyBhbmQgYWxs IGhhdmUgdGhlIHNhbWUgaGFzaCB3aXRoIGEKPiAyNi42OjEgcmVwb3J0aW5nIHJhdGlvLiBUaGVy ZSBhcmUgbnVtZXJvdXMgdmFyaWFudHMgd2l0aCBhZGRpdGlvbmFsCj4gYm9pbGVycGxhdGUgdGV4 dC4gVG8gZWxpbWluYXRlIHRoaXMgY2xhc3Mgb2YgRlAgeW91IG5lZWQgYSB0aHJlc2hvbGQgb2YK PiBhdCBsZWFzdCAwLjk3Lgo+CgpZZXAsIHNwb3R0ZWQgdGhvc2UgaW4gYm90aCBzcGFtIGFuZCBo YW0uIEkndmUgdXNlZCBhIHB5em9yIGxvY2FsIHdoaXRlbGlzdApvbiBzb21lIG9mIHRoZSBtb3N0 IGNvbW1vbiBoYXNoZXMuIFRoZSBlbXB0eSBzdHJpbmcsIGEgZmV3IHZhcmlhbnRzIG9uIHRoZQp0 aGVtZSBvZiAic2VudCBmcm9tIG15IGlQaG9uZSIsIGFzIHdlbGwgYXMgc29tZSBHb29nbGUgY2Fs ZW5kYXIgZW1haWxzLgoKCj4KPiBBbGwgaW4gYWxsIEkgZG9uJ3QgdGhpbmsgaXQgbWFrZXMgc2Vu c2UgdG8gdXNlIGFueXRoaW5nIG90aGVyIHRoYW4gdmVyeQo+IGhpZ2ggdGhyZXNob2xkcy4gSWYg eW91IHdhbnQgdG8gcGVyc3VlIHRoaXMgSSB3b3VsZCBzdWdnZXN0IHVzaW5nIGEKPiB0aHJlc2hv bGQgb2YgYXQgbGVhc3QgMC45OSBhbmQgdmFyeWluZyB0aGUgeiBwYXJhbWV0ZXIgaW5zdGVhZC4K Pgo+Cj4gPiBJIGhhdmUgdGVzdGVkIHRoaXMgdXNpbmcgYSBzcHJlYWRzaGVldCBhbmQgb3VyIG93 biBjb3JwdXMgb2Ygc3BhbSBhbmQKPiA+IGhhbSBlbWFpbCBhbmQgZ290IGdvb2QgcmVzdWx0cywK Pgo+IEkgdGhpbmsgYSBsb3Qgb2YgdGhlIGJlbmVmaXQgeW91IGFyZSBzZWVpbmcgY29tZXMgZnJv bSB0aGUgZmFjdCB0aGF0Cj4geW91IGFyZSByZXNjYW5uaW5nIGNvcnB1cyBtYWlsIHJhdGhlciB0 aGFuIHVzaW5nIHRoZSBweXpvciBjb3VudHMgYXQKPiBkZWxpdmVyeSB0aW1lLgo+CgpUaGF0IGRl ZmluaXRlbHkgY291bGQgYmUgcmVsYXRlZCwgYnV0IGEgbGFyZ2UgbnVtYmVyIG9mIHRoZXNlIG1h aWxzIHdlcmUKaGl0dGluZyBweXpvciBhbmQgbm90aGluZyBlbHNlLCBhbmQgb3RoZXJzIHdlcmUg aGl0dGluZyBweXpvciBhbmQKbG93LXNjb3JpbmcgcnVsZXMgdGhhdCB3ZXJlbid0IGVub3VnaCB0 byBwdXNoIGl0IG92ZXIgdGhlIHRocmVzaG9sZC4gQSBsb3QKb2YgdGhlIGV4YW1wbGVzIHdlcmUg c2V4dWFsbHktZXhwbGljaXQgc3BhbSwgYW5kIGl0IHNlZW1zIGxpa2VseSB0aGF0IHRoZQpCYXll c2lhbiBmaWx0ZXIgbWlnaHQgZ2V0IHRoZXNlIG1haWxzIGJ1dCBJJ20gcnVubmluZyBzcGFtIGZp bHRlcmluZyBmb3IKY3VzdG9tZXJzIGFuZCBhbSBub3QgcmVhbGx5IGFibGUgdG8gdHJhaW4gdGhl IEJheWVzaWFuIGZpbHRlciBwcm9wZXJseSBzbyBJCmhhdmUgaXQgZGlzYWJsZWQuCgoKPiBVc2lu ZyBXaWxzb24gZG9lc24ndCBqdXN0IGFmZmVjdCB3aGl0ZWxpc3RlZCBlbWFpbHMgaXQgYWxzbyBz ZXRzIHRoZQo+IG1pbmltdW0gbnVtYmVyIG9mIHJlcG9ydHMgbmVlZGVkIGZvciBhIHB5em9yIGhp dC4gRm9yIHlvdXIgdGhyZWUgcnVsZXMKPiB0aGF0IHJpc2VzIGZyb20gNSB0byAzODEsIDIyIGFu ZCAxMiAoYXNzdW1pbmcgdGhhdCB0aGUgdmVyeSBsb3cgeiB2YWx1ZQo+IGluIHRoZSBmaXJzdCBy dWxlIGlzIGFuIGVycm9yKS4gSW4gcHJvZHVjdGlvbiB5b3Ugd2lsbCBsb3NlIHB5em9yIGhpdHMs Cj4gYW5kIGZvciBuZXcgaGFzaGVzLCB0aGUgbW9zdCB2YWx1YWJsZSBlYXJseSBoaXRzLgo+Cj4K VGhlIGxvdyB6IHZhbHVlIGlzIG5vdCBhbiBlcnJvci4gSXQncyB0aGUgcmVzdWx0IG9mIHBsYXlp bmcgYXJvdW5kIHdpdGggdGhlCnBhcmFtZXRlcnMgaW4gYSBzcHJlYWRzaGVldCB0byBzZWUgd2hh dCB3b3JrcyBiZXN0LiBJdCBjYW1lIGFzIGEgc3VycHJpc2UKdG8gbWUgdG9vLCBidXQgaXQgZG9l cyBtYWtlIHNvbWUga2luZCBvZiBzZW5zZSAtIHdpdGggYSB2ZXJ5IGhpZ2ggdGhyZXNob2xkCihl LmcuIDk5LjUlKSBhbmQgbG93IHotc2NvcmUsIHlvdSdyZSBlc3NlbnRpYWxseSBzYXlpbmcgIlRo ZXJlIGlzIGF0IGxlYXN0CnNvbWUgY2hhbmNlIHRoYXQgOTkuNSUgb2YgcGVvcGxlIHdvdWxkIHRo aW5rIHRoaXMgaXMgc3BhbSIuIElmIHRoZXJlJ3Mgbm8Kd2hpdGVsaXN0aW5nLCA0IHB5em9yIHJl cG9ydHMgYXJlIGVub3VnaCB0byB0cmlnZ2VyIGl0LiBXaXRoIHRoZSBzZXR1cCBJCmRlc2NyaWJl ZCwgcGVyc29uYWxseSBJJ20gY29uZmlkZW50IGVub3VnaCB0byBzaG9ydC1jaXJjdWl0IG9uIHB5 em9yIHdpdGgKV2lsc29uIHBhcmFtZXRlcnMgOTkuNSUgdGhyZXNob2xkIGFuZCAxMCUgY29uZmlk ZW5jZSAoej1+MC4xMjYpLCBzbyBpdApnaXZlcyB1cyBhIGJpZyBib29zdC4KCgo+IEkgdGhpbmsg cHl6b3IncyBvd24gZGVmYXVsdHMgYXJlIHNlbnNpYmxlIC0ganVzdCBpZ25vcmUgYW55dGhpbmcK PiB0aGF0J3Mgd2hpdGVsaXN0ZWQuCgoKV2VsbCBJJ3ZlIHNlZW4gdmVyeSBzcGFtbXkgc3BhbSB0 aGF0IGhhcyBiZWVuIHdoaXRlbGlzdGVkLCBzbyBJIHRoaW5rIHRoZQp3aWxzb24gbWV0aG9kIGhh cyBpdHMgYWR2YW50YWdlcy4gSSdtIG5vdCBhYmxlIHRvIHNoYXJlIHRoZSBjb3JwdXMgSSB1c2Vk LApidXQgSSd2ZSBhdHRhY2hlZCB0aGUgc3ByZWFkc2hlZXQgSSB1c2VkIGZvciB0aGUgYW5hbHlz aXMuIEkgY291bGRuJ3QgZmluZAphbGwgb2YgdGhlIG9yaWdpbmFsIG1lc3NhZ2VzIEkgdXNlZCBi dXQgZm9yIHRoZSBvbmVzIEkgY291bGQgZmluZCBJJ3ZlIHB1dAp0aGUgcHl6b3IgcHJlZGlnZXN0 cyBpbiBhIHppcCBmaWxlIGlmIHlvdSdyZSBpbnRlcmVzdGVkLiBUaGVyZSdzIGEgY2x1c3Rlcgpv ZiB0aGVtIHdpdGggdmVyeSBzZXh1YWxseSBleHBsaWNpdCBtZXNzYWdlcyB0aGF0IGVhY2ggaGF2 ZSBiZWVuCndoaXRlbGlzdGVkIG9uY2UgYW5kIGxpc3RlZCBiZXR3ZWVuIDYwMCBhbmQgNzAwIHRp bWVzLCB0aGUgd2lsc29uIG1ldGhvZAp3b3VsZCBnZXQgdGhlc2UsIGJ1dCBzaW1wbHkgaWdub3Jp bmcgYW55dGhpbmcgdGhhdCBpcyB3aGl0ZWxpc3RlZCB3b3VsZCBub3QuCgo+IEkgd2FudGVkIHRv IG1ha2UgaXQgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBzcGFtYXNzYXNzaW4gcnVsZXMgd2l0 aAo+ID4gZGlmZmVyZW50IHdpbHNvbiBzY29yZSBwYXJhbWV0ZXJzIGdpdmluZyBkaWZmZXJlbnQg c3BhbWFzc2Fzc2luCj4gPiBzY29yZXMsIGJ1dCBvYnZpb3VzbHkgd2UgZG9uJ3Qgd2FudCB0byBx dWVyeSBweXpvciBtdWx0aXBsZSB0aW1lcyBvbgo+ID4gdGhlIHNhbWUgbWFpbCBzbyBJJ3ZlIGNo YW5nZWQgdGhlIGFjdHVhbCBweXpvciBsb29rdXAgdG8gYmUgZG9uZQo+ID4gZHVyaW5nIGV4dHJh Y3RfbWV0YWRhdGEoKSBpbnN0ZWFkCj4gPiBvZiB3aGVuIHRoZSBldmFsLXJ1bGUgaXMgcnVuLgo+ Cj4gVGhlIHVzdWFsIHdheSB0aGlzIHdvdWxkIGJlIGRvbmUgaXMgdG8gaGF2ZSBib3RoIGZ1bmN0 aW9ucyBsb29rIGZvcgo+IGNhY2hlZCBjb3VudHMgYW5kIHJ1biBweXpvciBpZiB0aGV5IGFyZW4n dCB0aGVyZSAtIHNlZSB0aGUgQkFZRVNfKgo+IHJ1bGVzIGZvciBhbiBleGFtcGxlLgo+CgpPaC4u Li4gRm9yIHNvbWUgcmVhc29uIEkgaGFkIGFzc3VtZWQgdGhhdCB0aGUgZXZhbCBydWxlcyB3ZXJl IGV2YWwnZWQKY29uY3VycmVudGx5IGluIHNvbWUga2luZCBvZiBhc3luY2hyb25vdXMgd2F5IChw b3NzaWJseSBiZWNhdXNlIEkgaGFkCnByZXZpb3VzbHkgYmVlbiBsb29raW5nIGF0IHRoZSBETlNC TCBhbmQgVVJJQkwgY29kZSB3aGljaCBkb2VzIHRvIHVzZQpjYWxsYmFja3MpLCBidXQgdGhhdCBk b2Vzbid0IHNlZW0gdG8gYmUgdGhlIGNhc2UgaGVyZSwgcmlnaHQ/IElmIHlvdSBkb24ndApoYXZl IHRvIHdvcnJ5IGFib3V0IGNhbGxiYWNrcyBvciB0aHJlYWRzIHRoZW4gZG9pbmcgd2hhdCB5b3Ug ZGVzY3JpYmUgaXMKbXVjaCBlYXNpZXIgdGhhbiBJIGhhZCB0aG91Z2h0LgoKSSdsbCBnaXZlIGl0 IGEgdHJ5IGFuZCBnZXQgYmFjayB0byB5b3UuIEknbGwgYWxzbyBhZGQgbWV0aG9kcyB0byBtYXRj aCBhbnkKbWFpbCB0aGF0IGhhcyBhdCBsZWFzdCAnbicgKHR5cGljYWxseSA1KSBsaXN0aW5ncyBv ciBhdCBsZWFzdCAnbicKKHR5cGljYWxseSAxKSB3aGl0ZWxpc3RzaW5ncyBzbyB5b3UgY2FuIHVz ZSBhIG1ldGEgcnVsZSB0byBvYnRhaW4gdGhlCnN0YW5kYXJkIHB5em9yIGJlaGF2aW91ci4KClRo YW5rcyB2ZXJ5IG11Y2gsCgotLSAKSmFtZXMgQmlya2V0dApDeWJlcmhvdW5kCgpTY2FubmVkIGJ5 IEN5YmVySG91bmQNCihodHRwOi8vY3liZXJob3VuZC5jb20vKQoKCkNvbmZpZGVudGlhbGl0eSBO b3RpY2U6IFRoaXMgZW1haWwsIGluY2x1ZGluZyBhbnkgYXR0YWNobWVudHMsIGlzIGNvbmZpZGVu dGlhbCBhbmQgbWF5IGJlIHByaXZpbGVnZWQuICBJZiB5b3UgYXJlIG5vdCB0aGUgaW50ZW5kZWQg cmVjaXBpZW50IHBsZWFzZSBub3RpZnkgdGhlIHNlbmRlciBpbW1lZGlhdGVseSBhbmQgZGVsZXRl IGl0LiBZb3Ugc2hvdWxkIG5vdCBjb3B5IGl0IG9yIHVzZSBpdCBmb3IgYW55IHB1cnBvc2Ugb3Ig ZGlzY2xvc2UgaXRzIGNvbnRlbnRzIHRvIGFueSBvdGhlciBwZXJzb24gd2l0aG91dCBDeWJlckhv dW5kJ3MgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBDeWJlckhvdW5kIFB0eSBMdGQgcmVzZXJ2 ZXMgdGhlIHJpZ2h0IHRvIG1vbml0b3IgYWxsIGVtYWlsIGNvbW11bmljYXRpb25zIHBhc3Npbmcg dGhyb3VnaCBpdHMgbmV0d29ya3MgYW5kIGRldmljZXMuDQoKCg= --001a113d05eaf9eefe054a93f7b4 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/html; charset="utf-8" <div dir="ltr"><div dir="auto"><div dir="ltr"><div class="gmail_extra"><div \ class="gmail_quote">On 11 March 2017 at 03:29, RW <span dir="ltr"><<a \ href="mailto:rwmaillists@googlemail.com" \ target="_blank">rwmaillists@googlemail.com</a>></span> wrote:<br><blockquote \ class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid \ rgb(204,204,204);padding-left:1ex"><span>On Sun, 26 Feb 2017 19:35:11 +1000<br> James \ Birkett wrote:<br> <br> > Hi,<br> ><br> > Bug 6108 says is that the pyzor plugin ignores whitelisting entirely,<br> > and a comment on that bug suggests updating the Pyzor plugin to use<br> > Wilson Score formula described here<br> > <a href="http://www.evanmiller.org/how-not-to-sort-by-average-rating.html" \ rel="noreferrer" target="_blank">http://www.evanmiller.org/how-<wbr>not-to-sort-by-average-rating.<wbr>html</a><br> <br> </span>SpamAssassin allows easy reporting of whole mailboxes of spam, but to<br> report ham you have to go to the website and type in captchas (I think<br> there are a few trusted admins that can bypass this). There's liable to<br> be a substantial bias in reporting, and the bias is likely to vary<br> strongly from hash to hash. I don't know for sure, but I suspect that a<br> lot of whitelisting counts may be historic.<br> <br> Emails where the body contains only links or addresses get<br> predigested down to a null string and all have the same hash with a<br> 26.6:1 reporting ratio. There are numerous variants with additional<br> boilerplate text. To eliminate this class of FP you need a threshold of<br> at least 0.97.<br></blockquote><div><br></div><div>Yep, spotted those in both spam \ and ham. I've used a pyzor local whitelist on some of the most common hashes. The \ empty string, a few variants on the theme of "sent from my iPhone", as well \ as some Google calendar emails.</div><div> </div><blockquote class="gmail_quote" \ style="margin:0px 0px 0px 0.8ex;border-left:1px solid \ rgb(204,204,204);padding-left:1ex"> <br> All in all I don't think it makes sense to use anything other than very<br> high thresholds. If you want to persue this I would suggest using a<br> threshold of at least 0.99 and varying the z parameter instead.<br> <span><br> <br> > I have tested this using a spreadsheet and our own corpus of spam and<br> > ham email and got good results,<br> <br> </span>I think a lot of the benefit you are seeing comes from the fact that<br> you are rescanning corpus mail rather than using the pyzor counts at<br> delivery time.<br></blockquote></div></div></div><div dir="auto"><br>That definitely \ could be related, but a large number of these mails were hitting pyzor and nothing \ else, and others were hitting pyzor and low-scoring rules that weren't enough to \ push it over the threshold. A lot of the examples were sexually-explicit spam, and it \ seems likely that the Bayesian filter might get these mails but I'm running spam \ filtering for customers and am not really able to train the Bayesian filter properly \ so I have it disabled.</div><div dir="auto"><br></div><div dir="ltr"><div \ class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" \ style="margin:0px 0px 0px 0.8ex;border-left:1px solid \ rgb(204,204,204);padding-left:1ex"> <br> Using Wilson doesn't just affect whitelisted emails it also sets the<br> minimum number of reports needed for a pyzor hit. For your three rules<br> that rises from 5 to 381, 22 and 12 (assuming that the very low z value<br> in the first rule is an error). In production you will lose pyzor hits,<br> and for new hashes, the most valuable early hits.<br> <br></blockquote><div> </div><div>The low z value is not an error. It's the \ result of playing around with the parameters in a spreadsheet to see what works best. \ It came as a surprise to me too, but it does make some kind of sense - with a very \ high threshold (e.g. 99.5%) and low z-score, you're essentially saying \ "There is at least some chance that 99.5% of people would think this is \ spam". If there's no whitelisting, 4 pyzor reports are enough to trigger it. \ With the setup I described, personally I'm confident enough to short-circuit on \ pyzor with Wilson parameters 99.5% threshold and 10% confidence (z=~0.126), so it \ gives us a big boost.<br> </div><blockquote class="gmail_quote" style="margin:0px \ 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> I think \ pyzor's own defaults are sensible - just ignore anything<br> that's \ whitelisted.</blockquote><div><br>Well I've seen very spammy spam that has been \ whitelisted, so I think the wilson method has its advantages. I'm not able to \ share the corpus I used, but I've attached the spreadsheet I used for the \ analysis. I couldn't find all of the original messages I used but for the ones I \ could find I've put the pyzor predigests in a zip file if you're interested. \ There's a cluster of them with very sexually explicit messages that each have \ been whitelisted once and listed between 600 and 700 times, the wilson method would \ get these, but simply ignoring anything that is whitelisted would \ not.<br><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px \ 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span> > I wanted \ to make it possible to have multiple spamassassin rules with<br> > different \ wilson score parameters giving different spamassassin<br> > scores, but obviously \ we don't want to query pyzor multiple times on<br> > the same mail so I've \ changed the actual pyzor lookup to be done<br> > during extract_metadata() \ instead<br> > of when the eval-rule is run.<br> <br> </span>The usual way this would be done is to have both functions look for<br> cached counts and run pyzor if they aren't there - see the BAYES_*<br> rules for an example.<br></blockquote><div><br>Oh.... For some reason I had assumed \ that the eval rules were eval'ed concurrently in some kind of asynchronous way \ (possibly because I had previously been looking at the DNSBL and URIBL code which \ does to use callbacks), but that doesn't seem to be the case here, right? If you \ don't have to worry about callbacks or threads then doing what you describe is \ much easier than I had thought.</div><div><br></div><div>I'll give it a try and \ get back to you. I'll also add methods to match any mail that has at least \ 'n' (typically 5) listings or at least 'n' (typically 1) \ whitelistsings so you can use a meta rule to obtain the standard pyzor \ behaviour.</div></div></div><div class="gmail_extra"><br></div><div \ class="gmail_extra">Thanks very much,</div><div class="gmail_extra"><br></div><div \ class="gmail_extra">-- </div><div class="gmail_extra">James \ Birkett<br>Cyberhound</div></div></div> </div> <br><br> <br> Scanned by <a href="http://cyberhound.com/">CyberHound</a> <br><br> <font size="-3"><b>Confidentiality Notice:</b> This email, including any attachments, is confidential and may be privileged. If you \ are not the intended recipient please notify the sender immediately and delete it. \ You should not copy it or use it for any purpose or disclose its contents to any \ other person without CyberHound's prior written permission. CyberHound Pty Ltd \ reserves the right to monitor all email communications passing through its networks \ and devices. </font> --001a113d05eaf9eefe054a93f7b4-- ["predigests.zip" (application/zip)] ["pyzor statistics.ods" (pyzor statistics.ods)] PK AmJl9. . mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK AmJ:+ Thumbnails/thumbnail.pngPNG IHDR " IDATxU?s糧CS@@Z$. IQN:g@y}9{^ڳ!/_ ,WA ]O^8\Se_#6/k~կej{k/۶*EO ^uO?yozymC ?vG7C"q*EO ^uO?yozymC ?vG7ōʁGtc<ym{mЋοn#n\% \ H w7?Ҏp-#u-_~-íW3`]{h.av?{*ǿ˝H{Hmį]G]2z5FڵHH8 \ "~-?WC17>nlexD@g߈m""?<*"w>/kӾp \ ]zyO3Έ-܉Fu-_~-íW3`]{ Yv""7 ^uO?yozymC \ ?vG7,} E \ U=H?7]{o>?<*"w>o?7_#:ҷsOFv7$]CadT}߷^aWiׯ9 îMoM;f?>f_^yHfeWiׯ9ܝRYڮH?8k17?<ײHqrC1 \ M ozUpmq;ai6;W}^|Tѿk]_WE^UPa+PW !@^qvPF2yʹ+`m2]?Wb+律ۅH"%Wڗ^Zw^Y(]n!!!VSܱ \ AϜpѸ3gbǎ8qb~>uT̘1'ObC+Wܸqٲec2f5jT?|0~Ε+WT^xB \ /_7xi,Y p_L\ߺuKoxs;wdȐ7.ؾ;tD/ &T:O\ܾ};N8̔)+ׯ_4>7O>MԩS{#M8Xbrq'^t){ i>}z T7o\P!p@K r SH/^<}=yZf <K,ӧOiC'DN8.]ѣ+οk̙Jy,hxlҤIfuuƍ/^yfJjԨ \ U;w.S$JP4iRoPwxs ZjtGmѢ8ٳ'H#AǏabܹ7n8,P \ mb֭ 1cƁЪf͚)R믿~i_b? 6eE!zԹvZ_~-ZaGr54i \ 1pkɓ3g,[,|GUR~CQL &0۟;wٳW{vR?~<M61CWǎ! a'<_L'Onڴ !5hٳgp*. \ 'OwuhjȲw1k,ń)sG0cǎ%?U^ 9rɕ*UT(Y$ W\8a 2OPv15kD6mA`"ٳg7nqP */>CYN$ iӦ!`T5`h'H.Z護zZldɒ5k @h'8 /p PA؇hiA2~wK(ѿ 6 =1#2?#VXH9͆ӷo_)I$@/ȁ@n.X b?UZqpzH>C_|E/6lztP˦ܹsի >$*T 9<=iԨQ.4p \ }W^R!y /18W>,; AXN+RA}9r`(:( \ .H{H;}ν{pO7=:́3BB4F<V2 #zAY۴iI?A&1 \ ^܁o ~vUF aQpa?9^|NUVxl< G 8 pB;˖ \ u{h>\>Զ VZ(AA,@EalقBաFB;S(p0MDzaA*4SׯߵkWѢE52 \ & Q\ԅJ_ CK. -}z > S 0p@J;tжm[ a( xj`1BV-<?CSNܧ=e{Ƹ(uTڳgʁ8L:}ꫯ:38&_# \ ]&M~PΝ;fF} oal?C#x Sb:ݺuæ+a ŋ#СCw \ 6Aݮ];~BroP)0X!< #+,S1dTͣ p` 4n F@JAd\syC+bOw h~J82N[h'چ[ bLd '!テ߃S @ ^ E $f̘1jNH}_8+ O~q@` Zx4Ya`5# g&8)ZX bm GYŊAȃ}h1.`+AxŻpvڈ^#ox8h >0k \ (6TL(`E/Ps 8n!^/tK .p0B Qm@vӝsָIu /OcѣGQPHL ,[9 ,5ej93AijD7U幏8@cF YeO:TQ 4Ѥ=&eBHZ{ȔTu. ^Y5 G!SP'~pJ\*H5>Tȥ i H-5_].)&Xg ~>ڝsPi( 4St wAE{Ӆ*w ЛVq/\'(|b:jKjw*Csq6Snﵶ8Kfd>3Y'RkEH\|wpxZ HcX>\͂催wS ݎN ZB@G@Vuj(9ḂFy*M.XZ,غ/'T.@A1h@b*@ \ e:?M+u-:1Fpҿ$kqpDI(A viC:$}@-q֟٧ODILB3H"b'zwUXk-KZL`H \ ץK)0lA)'L+(e=a9*nCnj@}uT4><9:m\AwxxI7XDxOTpjWXV<KBGp ` d'N1_%`ΜG1$4& \ um#R ˉHTWТ Q`AƯJB$!6&1DmX9VÆ \ #hd}F|G`%CDeOBG B'''@c \ TbZdSL!݄~HwܨQc i(D YlMTo߾2NUwe=`C(Aʕ~P TUgsb \ U|yba<!$`DBMёrI\r.4p͆KfhoMcCá<@vQD \ 59uRGwvIlLM"I:@t IrzΜ9-|hxQ7jo]pPPH uBe^d w \ ) a0_5۾};)<եK~e1(:Nꈪ`[hIC$<ϟt2ٲeCPNc(ݥ@ƅl@ދx0Ch\$O?aH(.5"FhCd \ ЎO@RqȂf*Ujժّ C4t9Aׇu \ DO\*`l"^r ()~ \ a>d)r1\`+HX*X1& s8Bb;q2h5\(LALj7ݡ<k|Ǖ}haNp*Ȍ;! X: \ 4d4h!PͰ>a/5{lPB4( E=ԍ߿~ˮ[.}>| \ nܸЁN\;`(VgpETeȐ!X3'8gh{gh1cF% \ C2$BiƈNKFm~Q. v1}lo dIZ L \ 5Y֭[ |h6Ai]1\#H~cǮ7|07 \ x`c3^+\p!z 2h?4|.ah \ ~i9uD7QiYBdh o-b\zʈ!*dǎWG#o|״)6p`7,nѢ# dӑ ))=׀P4#]* n',3|BD*Xc1)~~ڵ;v`d ;?\y9Lw`X,a <66:>H P;J4 Ă' n3Cl:VpOC < ,07ōԚûq|ܜ՝ P PL/7O(Cht%pNd2"S87ЋM)SZ[r|:h[!qlAG{֙8mOmwN \ b:Tup cq'[ L n>fznZl ^ \ v`}M |T\8ک;GϺ \ I +0AafYvZo1.\k/_Aqt LS:h"*n?$%pR)u]ާt'<Tyew< \ \9W:>U ]1s\1ko^:T܉*}ʝ?e}sC^L#d3щnM֪h1m>j@qkhQ5'e8 U#+Wd !Y"*q]oe \ _w|hlyb1PqQN=p""ЈAΕ긼^9wIC#+"!-x`rC'g \ [ 5!1GH b'n" #$bp}e&s?c$ p ,y pi /x@2,Q jsgϞ k7wWul;YrF_Hb 2$#b$#o"z,&">B!Z e \ i pPGVJV7A3jCԊ2jg, B$9MG "T0$ČH \ fD*!=F5 Gp1%@ @O>Ґz :t \ &N$$Ť$0LH$%4d:ʐF/$BGJK6l:dwB0r} ba \ Ջ M[ G` Bķ4 J%P`CHH \ /BjkHƏn"l,,2sG'PL.Ḧϑ3goX\90;w.ꅐ` \ ZF颗hYPt'1p awܹ}1Aķ5|r \ b\ԩS(n h# y͛+ (=x"H"0z!6H믿FA$C_BŊ \ mCþK< S !bx#BfIga Tx94*mD}W: )"C1;F IPAXG 6 =p("7<zpdhpM}Cȃ|fƍ:uBN̓<[Hd8X<kaD!iOSr!8g \ g2,5N%1 pq!5zY$)5~R#vQHTk|K%C@X6 \ v (2kΟ?!jԨn2P=~8FP h:cXUAFh\s \ |qeam<5B0>trS& Ԉ4B/iP`ґ047gώ3Ќץ ,0&@}f͚ўڀ^/\O F ٢E #`cƽA"{a.:tUЈ6/#6Hܻwʔ \ +WAD̙uԞ4ib^A1cjܸ1I4%6ڧO_niҤ2eJngϞEw 9ڵk+V- \ [Rɗ/1EZpe2ժU7n\Ge1cFe^q,Z++`1L8i̘1h@VG \ T.Vv=5k_ Qw˟@ɒ=z<bgƝ%$M[Fu11P8NP8qF16o \ !!fvYNKN<;v,|/766mҥ˨̘1ߡ^&N&L`B˖} . \ ΘCd7"6pw26mZw\_roM/]v^>͚5uo>̽Fo"IÇk$NhPfMv}Wj%c{/LBg0 \ Gn?rU.V|_?EU?@Qw߭˵FHt9VREG{#m>}:rI9yj]`lD>$ջ \ *~\l%YJ j tLF>