From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4170 invoked by alias); 26 Jul 2016 06:08:03 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 4157 invoked by uid 89); 26 Jul 2016 06:08:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.5 required=5.0 tests=AWL,BAYES_00,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy=sk:_cygwin, 1749, 26072016, 26.07.2016 X-HELO: mail-lf0-f46.google.com Received: from mail-lf0-f46.google.com (HELO mail-lf0-f46.google.com) (209.85.215.46) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 26 Jul 2016 06:07:48 +0000 Received: by mail-lf0-f46.google.com with SMTP id l69so142770213lfg.1 for ; Mon, 25 Jul 2016 23:07:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:from:to:references:message-id:date :user-agent:mime-version:in-reply-to; bh=IFyWcFMqghk7VPA9iwH767CsCCMRcPY3J2aBZ4VQK0M=; b=OgLJ4GDoiNFbNFE6RNyinb/KeFkMr1t7Fx8OuE9ciZqP3F1Ip6C1B30HeQ1qei0AdX CeOqdr6RbiVexXUdvMS1zuuSmBD3lQcDtkxuydctkt7ewvzlu7N665p1oAAWDtSJFTBQ wjbkfxAZWFSVw2eliol7y6ILDLQfRRw0DL2MRyZNxLNOGHU7yylrpNDXOTkJrePl3e8d jKqOgCVVnsf1upIScXM7B8Kcxro9vFt2uPLeO2kUBgto2/qzwY+IpdZ/9qnAf9niEm77 8NTFP/nEKmeHDlkjda0k70L1hXHZXoQQdlW4INvSmD4lByko8KafZdxfcqBwcH9tlEAY 4BjA== X-Gm-Message-State: AEkooutzEJ55zi9UnskNNVdfvDFY/hRw/YGo+O5MstbDu9vfdvQ65aUeZraB3A6w27jjpg== X-Received: by 10.25.81.137 with SMTP id f131mr7536017lfb.206.1469513264515; Mon, 25 Jul 2016 23:07:44 -0700 (PDT) Received: from [192.168.4.39] (broadband-95-84-200-6.nationalcablenetworks.ru. [95.84.200.6]) by smtp.gmail.com with ESMTPSA id p102sm6030266lfi.9.2016.07.25.23.07.43 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 25 Jul 2016 23:07:43 -0700 (PDT) Subject: Re: Program-assigned thread names on Windows From: LRN To: gdb-patches@sourceware.org References: <5052d495-ea40-b364-96ea-9e68c90bd747@gmail.com> <14995502.J10EtrK3xV@ralph.baldwin.cx> <6a3446f9-63dc-67a1-3702-203d77c8d85d@gmail.com> <0cabec98-8411-2c3a-98d0-3d950de02bc5@gmail.com> <28023f06-f99c-77d1-10cf-5243f2a082a4@gmail.com> Message-ID: Date: Tue, 26 Jul 2016 06:08:00 -0000 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Thunderbird/50.0a1 MIME-Version: 1.0 In-Reply-To: <28023f06-f99c-77d1-10cf-5243f2a082a4@gmail.com> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="W3f1Jhx46qPo4mutv7AVisteCVERK8T7G" X-IsSubscribed: yes X-SW-Source: 2016-07/txt/msg00339.txt.bz2 This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --W3f1Jhx46qPo4mutv7AVisteCVERK8T7G Content-Type: multipart/mixed; boundary="E4RO7Bhb0HHrO62XUPe5uBkCb2X1Kuwr6" From: LRN To: gdb-patches@sourceware.org Message-ID: Subject: Re: Program-assigned thread names on Windows References: <5052d495-ea40-b364-96ea-9e68c90bd747@gmail.com> <14995502.J10EtrK3xV@ralph.baldwin.cx> <6a3446f9-63dc-67a1-3702-203d77c8d85d@gmail.com> <0cabec98-8411-2c3a-98d0-3d950de02bc5@gmail.com> <28023f06-f99c-77d1-10cf-5243f2a082a4@gmail.com> In-Reply-To: <28023f06-f99c-77d1-10cf-5243f2a082a4@gmail.com> --E4RO7Bhb0HHrO62XUPe5uBkCb2X1Kuwr6 Content-Type: multipart/mixed; boundary="------------8472070F59882C623B1B59E3" This is a multi-part message in MIME format. --------------8472070F59882C623B1B59E3 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Content-length: 4789 On 26.07.2016 0:32, LRN wrote: > On 25.07.2016 17:23, LRN wrote: >> On 25.07.2016 17:06, Jon Turney wrote: >>> On 25/07/2016 14:34, LRN wrote: >>>> On 25.07.2016 15:17, Jon Turney wrote: >>>>> On 23/07/2016 18:01, LRN wrote: >>>>>> + named_thread_id =3D (DWORD) current_event.u.Exception.ExceptionR= ecord.ExceptionInformation[2]; >>>>>> + thread_name_target =3D (uintptr_t) current_event.u.Exception.Exc= eptionRecord.ExceptionInformation[1]; >>>>> >>>>> Is this going to be correct for 64-bit builds? >>>> >>>> I've only tested this on i686. >>>> >>>> Which variable are you concerned about - named_thread_id or thread_nam= e_target? >>> >>> Both. The ExceptionInformation isn't actually array of DWORDs, it's a= =20 >>> THREADNAME_INFO structure, which contains a LPCSTR pointer (which has a= =20 >>> different size on x86 and x86_64) *before* the thread id. >>> >>> So, I think this should check that NumbersParameters * sizeof(DWORD) is= =20 >>> equal to or greater than sizeof(THREADNAME_INFO), then cast=20 >>> ExceptionInformation to a THREADNAME_INFO. >>> >>>> Tough this is a good point. MSDN says that i686 and x86_64 EXCEPTION_R= ECORD >>>> structures have different layout (well, to-be-pointer struct fields are >>>> DWORD64 on x86_64). >>> >>> I don't think gdb currently supports 32/64 bit interworking on Windows,= =20 >>> so perhaps that is all moot (although if that is the case, perhaps it=20 >>> should diagnose attempts to do that) >>> >> >> Yep, just tried to attach to a 64-bit process from a 32-bit gdb, and gdb >> failed to attach. >> >> I'll try to come up with a way to build 64-bit gdb... it might take a wh= ile >> though. >> >=20 > 1) 64-bit gdb can attach to 32-bit debugees. > 64-bit gdb sure throws a number of warnings when attaching to a 32-bit > debugee, but still attaches. However, it quickly gets into a tailspin, if= i > do anything other than "run" (set breakpoints, step through functions). >=20 > 2) EXCEPTION_RECORD does not need to be casted into EXCEPTION_RECORD32 or > EXCEPTION_RECORD64 for native processes, as it's correctly aligned in > either way ("2x4, 2 pointers, 4, pointer" - for 32-bit case everything is > tightly packed and 4-byte aligned, for 64-bit case the last pointer moves= 4 > bytes further to be self-aligned to 8 bytes, while everything else remains > the same), so we can keep accessing stuff via EXCEPTION_RECORD natively. > That is, EXCEPTION_RECORD64 is how EXCEPTION_RECORD normally looks in > 64-bit process. >=20 > 3) EXCEPTION_RECORD that we receive is sized to *gdb* bitness. That is, > casing it to EXCEPTION_RECORD32 in 64-bit gdb will always lead to bad > interpretation, even if debugee is 32-bit. >=20 > 4) ExceptionInfromation array that we receive as part of EXCEPTION_RECORD > is *also natively aligned for gdb*. I've made 32-bit debugee print out the > addresses of fields of the THEADNAME_INFO structure, and it's aligned to 4 > bytes (as expected), but examining the EXCEPTION_RECORD structure that > 64-bit gdb receives shows that the ExceptionInformation array is aligned = to > 8 bytes. Therefore, it's safe to always use EXCEPTION_RECORD as-is, witho= ut > worrying about alignment of the ExceptionInformation data. >=20 > 5) 64-bit gdb receives an EXCEPTION_RECORD with NumberParameters =3D=3D 6= when > debugee is 64-bit. The contents of the extra 2 elements are a mystery (th= ey > seem to point to the stack, but that's all i can tell). Also, the 4-th > element (which is "Reserved for future use, must be zero") is not zero wh= en > the exception is caught. > In light of this, we should probably check for NumberParameters >=3D 4. Or > even NumberParameters >=3D 3, given that we don't really look at the 4th > parameter. >=20 Attaching the latest version of the patch: * Treats ExceptionInformation[0] !=3D 0x1000 or NumberParameters < 3 as unknown exception. * Uses (hopefully) correct datatypes for thread_name_target and named_thread_id. * Ensures thread name is 0-terminated, doesn't leak. * Uses "MS_VC_EXCEPTION" as the exception name. By the way, the realignment of the ExceptionInformation when it is passed from a 32-bit process to a 64-bit one suggests that RaiseException() documentation is actually precise: ExceptionInformation is an array of pointer-sized values, and is treated as such. As a test, i've tried to pass a struct with 12 separate char fields initialized into consecutive numbers (and packed tightly, i've checked), and by the time gdb got it, the "struct" was chopped into groups of 4 bytes, each of which was padded by 4 empty extra bytes. MS uses THREADNAME_INFO struct in its example, but it really should have used an array of ULONG_PTR, because that is what is being actually sent. --=20 O< ascii ribbon - stop html email! - www.asciiribbon.org --------------8472070F59882C623B1B59E3 Content-Type: text/plain; charset=UTF-8; name="0001-Support-settings-thread-name-MS-Windows.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0001-Support-settings-thread-name-MS-Windows.patch" Content-length: 5836 RnJvbSAxNDFjNGZmOGYxODVkZDJlZTFhOGZmYmY0ZDI2YTIxZTE2Yzg1MmJk IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/PUQw PUEwPUQxPTgzPUQxPTgxPUQwPUJCPUQwPUIwPUQwPUJEPTIwPUQwPTk4PUQw PUI2PUQwPUIxPz0KID0/VVRGLTg/cT89RDE9ODM9RDA9QkI9RDA9QjA9RDE9 ODI9RDA9QkU9RDA9QjI/PSA8bHJuMTk4NkBnbWFpbC5jb20+CkRhdGU6IFN1 biwgMjYgSnVuIDIwMTYgMTE6MTQ6NDkgKzAwMDAKU3ViamVjdDogW1BBVENI IDEvM10gU3VwcG9ydCBzZXR0aW5ncyB0aHJlYWQgbmFtZSAoTVMtV2luZG93 cykKClRoaXMgaXMgZG9uZSBieSBjYXRjaGluZyBhbiBleGNlcHRpb24gbnVt YmVyIDB4NDA2RDEzODgKKGl0IGhhcyBubyBkb2N1bWVudGVkIG5hbWUpLCB3 aGljaCBpcyB0aHJvd24gYnkgdGhlIHByb2dyYW0uClRoZSBleGNlcHRpb24g cmVjb3JkIGNvbnRhaW5zIGFuIElEIG9mIGEgdGhyZWFkIGFuZCBhIG5hbWUg dG8KZ2l2ZSBpdC4KClRoaXMgcmVxdWlyZXMgcm9sbGluZyBiYWNrIHNvbWUg Y2hhbmdlcyBpbiBoYW5kbGVfZXhjZXB0aW9uKCksCndoaWNoIG5vdyBhZ2Fp biByZXR1cm5zIG1vcmUgdGhhbiB0d28gZGlzdGluY3QgdmFsdWVzLiBUaGUg Y29kZQoyIG1lYW5zIHRoYXQgZ2RiIHNob3VsZCBqdXN0IGNvbnRpbnVlLCB3 aXRob3V0IHJldHVybmluZwp0aHJlYWQgSUQgdXAgdGhlIHN0YWNrICh3aGlj aCB3aWxsIHJlc3VsdCBpbiBmdXJ0aGVyIGhhbmRsaW5nCm9mIHRoZSBleGNl cHRpb24sIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnQpLgotLS0KIGdkYi93 aW5kb3dzLW5hdC5jIHwgNjYgKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKystLS0tLQogMSBmaWxlIGNoYW5nZWQs IDYxIGluc2VydGlvbnMoKyksIDUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0 IGEvZ2RiL3dpbmRvd3MtbmF0LmMgYi9nZGIvd2luZG93cy1uYXQuYwppbmRl eCAzZjY3NDg2Li4wODRkNWE5IDEwMDY0NAotLS0gYS9nZGIvd2luZG93cy1u YXQuYworKysgYi9nZGIvd2luZG93cy1uYXQuYwpAQCAtMTc0LDYgKzE3NCw5 IEBAIHN0YXRpYyBpbnQgZGVidWdfcmVnaXN0ZXJzX3VzZWQ7CiBzdGF0aWMg aW50IHdpbmRvd3NfaW5pdGlhbGl6YXRpb25fZG9uZTsKICNkZWZpbmUgRFI2 X0NMRUFSX1ZBTFVFIDB4ZmZmZjBmZjAKIAorI2RlZmluZSBNU19WQ19FWENF UFRJT04gMHg0MDZEMTM4OAorI2RlZmluZSBNU19WQ19FWENFUFRJT05fUyAi MHg0MDZEMTM4OCIKKwogLyogVGhlIHN0cmluZyBzZW50IGJ5IGN5Z3dpbiB3 aGVuIGl0IHByb2Nlc3NlcyBhIHNpZ25hbC4KICAgIEZJWE1FOiBUaGlzIHNo b3VsZCBiZSBpbiBhIGN5Z3dpbiBpbmNsdWRlIGZpbGUuICAqLwogI2lmbmRl ZiBfQ1lHV0lOX1NJR05BTF9TVFJJTkcKQEAgLTEwMzUsNiArMTAzOCw3IEBA IHN0YXRpYyBpbnQKIGhhbmRsZV9leGNlcHRpb24gKHN0cnVjdCB0YXJnZXRf d2FpdHN0YXR1cyAqb3Vyc3RhdHVzKQogewogICBEV09SRCBjb2RlID0gY3Vy cmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0 aW9uQ29kZTsKKyAgaW50IHJlc3VsdCA9IDE7CiAKICAgb3Vyc3RhdHVzLT5r aW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CiAKQEAgLTExNDAsNiAr MTE0NCw0OSBAQCBoYW5kbGVfZXhjZXB0aW9uIChzdHJ1Y3QgdGFyZ2V0X3dh aXRzdGF0dXMgKm91cnN0YXR1cykKICAgICAgIERFQlVHX0VYQ0VQVElPTl9T SU1QTEUgKCJFWENFUFRJT05fTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OIik7 CiAgICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IEdEQl9TSUdOQUxfSUxM OwogICAgICAgYnJlYWs7CisgICAgY2FzZSBNU19WQ19FWENFUFRJT046Cisg ICAgICBpZiAoY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25S ZWNvcmQuTnVtYmVyUGFyYW1ldGVycyA+PSAzCisgICAgICAgICAgJiYgY3Vy cmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0 aW9uSW5mb3JtYXRpb25bMF0gPT0gMHgxMDAwKQorCXsKKwkgIGxvbmcgbmFt ZWRfdGhyZWFkX2lkOworCSAgcHRpZF90IG5hbWVkX3RocmVhZF9wdGlkOwor CSAgc3RydWN0IHRocmVhZF9pbmZvICpuYW1lZF90aHJlYWQ7CisJICBDT1JF X0FERFIgdGhyZWFkX25hbWVfdGFyZ2V0OworCSAgY2hhciAqdGhyZWFkX25h bWU7CisJICBpbnQgdGhyZWFkX25hbWVfbGVuOworCisJICBERUJVR19FWENF UFRJT05fU0lNUExFIChNU19WQ19FWENFUFRJT05fUyk7CisKKwkgIG5hbWVk X3RocmVhZF9pZCA9IChsb25nKSBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9u LkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25JbmZvcm1hdGlvblsyXTsKKwkg IHRocmVhZF9uYW1lX3RhcmdldCA9IGN1cnJlbnRfZXZlbnQudS5FeGNlcHRp b24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkluZm9ybWF0aW9uWzFdOwor CisJICBpZiAobmFtZWRfdGhyZWFkX2lkID09IChEV09SRCkgLTEpCisJICAg IG5hbWVkX3RocmVhZF9pZCA9IGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZDsK KworCSAgbmFtZWRfdGhyZWFkX3B0aWQgPSBwdGlkX2J1aWxkIChjdXJyZW50 X2V2ZW50LmR3UHJvY2Vzc0lkLCAwLCBuYW1lZF90aHJlYWRfaWQpLAorCSAg bmFtZWRfdGhyZWFkID0gZmluZF90aHJlYWRfcHRpZCAobmFtZWRfdGhyZWFk X3B0aWQpOworCisJICB0aHJlYWRfbmFtZSA9IE5VTEw7CisJICB0aHJlYWRf bmFtZV9sZW4gPSB0YXJnZXRfcmVhZF9zdHJpbmcgKHRocmVhZF9uYW1lX3Rh cmdldCwgJnRocmVhZF9uYW1lLCAxMDI1LCAwKTsKKwkgIGlmICh0aHJlYWRf bmFtZV9sZW4gPiAwICYmIHRocmVhZF9uYW1lICE9IE5VTEwpCisJICAgIHsK KwkgICAgICBpZiAodGhyZWFkX25hbWVbdGhyZWFkX25hbWVfbGVuIC0gMV0g IT0gJ1wwJykKKwkJdGhyZWFkX25hbWVbdGhyZWFkX25hbWVfbGVuIC0gMV0g PSAnXDAnOworCSAgICAgIGlmICh0aHJlYWRfbmFtZVswXSAhPSAnXDAnKQor CQl7CisJCSAgeGZyZWUgKG5hbWVkX3RocmVhZC0+bmFtZSk7CisJCSAgbmFt ZWRfdGhyZWFkLT5uYW1lID0gdGhyZWFkX25hbWU7CisJCX0KKwkgICAgICBl bHNlCisJCXsKKwkJICB4ZnJlZSAodGhyZWFkX25hbWUpOworCQl9CisJICAg IH0KKwkgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gR0RCX1NJR05BTF9UUkFQ OworCSAgcmVzdWx0ID0gMjsKKwkgIGJyZWFrOworCX0KKwkvKiB0cmVhdCBp bXByb3Blcmx5IGZvcm1lZCBleGNlcHRpb24gYXMgdW5rbm93biwgZmFsbHRo cm91Z2ggKi8KICAgICBkZWZhdWx0OgogICAgICAgLyogVHJlYXQgdW5oYW5k bGVkIGZpcnN0IGNoYW5jZSBleGNlcHRpb25zIHNwZWNpYWxseS4gICovCiAg ICAgICBpZiAoY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5kd0ZpcnN0Q2hh bmNlKQpAQCAtMTE1Myw3ICsxMjAwLDcgQEAgaGFuZGxlX2V4Y2VwdGlvbiAo c3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXMpCiAgICAgfQog ICBleGNlcHRpb25fY291bnQrKzsKICAgbGFzdF9zaWcgPSBvdXJzdGF0dXMt PnZhbHVlLnNpZzsKLSAgcmV0dXJuIDE7CisgIHJldHVybiByZXN1bHQ7CiB9 CiAKIC8qIFJlc3VtZSB0aHJlYWQgc3BlY2lmaWVkIGJ5IElELCBvciBhbGwg YXJ0aWZpY2lhbGx5IHN1c3BlbmRlZApAQCAtMTUxMCwxMCArMTU1NywxOSBA QCBnZXRfd2luZG93c19kZWJ1Z19ldmVudCAoc3RydWN0IHRhcmdldF9vcHMg Km9wcywKIAkJICAgICAiRVhDRVBUSU9OX0RFQlVHX0VWRU5UIikpOwogICAg ICAgaWYgKHNhd19jcmVhdGUgIT0gMSkKIAlicmVhazsKLSAgICAgIGlmICho YW5kbGVfZXhjZXB0aW9uIChvdXJzdGF0dXMpKQotCXRocmVhZF9pZCA9IGN1 cnJlbnRfZXZlbnQuZHdUaHJlYWRJZDsKLSAgICAgIGVsc2UKLQljb250aW51 ZV9zdGF0dXMgPSBEQkdfRVhDRVBUSU9OX05PVF9IQU5ETEVEOworICAgICAg c3dpdGNoIChoYW5kbGVfZXhjZXB0aW9uIChvdXJzdGF0dXMpKQorCXsKKwlj YXNlIDA6CisJZGVmYXVsdDoKKwkgIGNvbnRpbnVlX3N0YXR1cyA9IERCR19F WENFUFRJT05fTk9UX0hBTkRMRUQ7CisJICBicmVhazsKKwljYXNlIDE6CisJ ICB0aHJlYWRfaWQgPSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQ7CisJICBi cmVhazsKKwljYXNlIDI6CisJICBjb250aW51ZV9zdGF0dXMgPSBEQkdfQ09O VElOVUU7CisJICBicmVhazsKKwl9CiAgICAgICBicmVhazsKIAogICAgIGNh c2UgT1VUUFVUX0RFQlVHX1NUUklOR19FVkVOVDoJLyogTWVzc2FnZSBmcm9t IHRoZSBrZXJuZWwuICAqLwotLSAKMi40LjAKCg== --------------8472070F59882C623B1B59E3 Content-Type: application/pgp-keys; name="0x6759BA74.asc" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0x6759BA74.asc" Content-length: 3718 -----BEGIN PGP PUBLIC KEY BLOCK-----=0A= Version: GnuPG v2=0A= =0A= mQINBFd+4e0BEACxh5wQhm5pG3DMdXokYTZYyncAc0MGQkuCG7+0CUa06VW+qVz3=0A= x+wkWRSJSbFrltSzNpKY67kOGPc1b7e1V4vIQ5ubNSYNOnwqFedEorBCyA6jvpfE=0A= vmLHcWJyK6emZC2s09ToxN1ovzcJBkQMgpJNYj4jZHdHEJ0PD+qEp7bKTXlxzWXM=0A= oHjPdykSLPDuTzQ1Gi09OakKhzOUvg+3Lgqo1aAf+r8HtysM19wUE06h1BYpsMo/=0A= gP87w/uhyqrqqAPBb3tpJtAhw8OcUREsJ4GC5zsp80eHy7IS6LIrPB3nf9XyIxvd=0A= 5qql9y1XclbB/sTGfD2Z27gYLLqFDIlYxXKT1z999yGN71gXYoLi9wbqpP0VSbdh=0A= tr8LVhGiuP+BPNq1y62wKyBKpJulBq2TnYWhukYowI1tCkCFeL1F0yG2M0RTvo3P=0A= dUp6YSHiNbuvgiFzoow2YVCPW+w2MBFR2S1Si72Yegq2+tf5Dd0mSOEKOhaChz/X=0A= L3gFlbjgaF0qA879Q/8pppjdsmwDY+q48WV4NnI3bPsTlZ6dKnI0ZMpct9Kfi7E5=0A= dmexGdOCde4RbEs4dOsdMhjFl9B1YQPjKpTmh7FtoTDJqMklZEAzBr+pEDb7BorM=0A= Beh2aHsJ0Z7Qd52BCaUAIuPUXjwXDI4qzf7UyWLFS66BkeDXBRDRWaRL5QARAQAB=0A= tBdMUk4gPGxybjE5ODZAZ21haWwuY29tPokCPwQTAQgAKQUCV37h7QIbIwUJCWYB=0A= gAcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAAAoJEI2t6SdnWbp0qtoQAIjcnzeN=0A= riwftAfLsnXKYBrxmdbfPsmu4G7cQxsabst841sOrvWFPHTkEZk/xpfyQgxpZEiB=0A= 8uF82XKNbHNh9+nWqiDyt/Y9v23IIt1fIodOuB1q3Jdbh7nraflgzeji91rR3BuP=0A= mKcbpX+t4zlOg2RNh3dG+xoY91C5gXXWqBZ73kyGDHkpp2jGFXNStzdlcR4qLBiV=0A= dbtXfU/mnmB3tFuojx/zgL71816G2toBZzeWT/6c7UnmrubarvbNIVPbYufM0Xzw=0A= 7sK1y+i6p+QnZPZJ7nytINAVAZJ3pxle1Ajwb5p4QAVSsau78iG04/9cNU+gtftT=0A= kwNOIJ0LDnj+S6A58uLIr2Ebl4Jr4g0MPlw74CsUIspQz9sb6/yANLQ98kz3PrUa=0A= MpodI2dNpV8UROoJ/t96ys755FcEb/09SDJcTUx7QlPukgoq4mrWqB59kVID7CKq=0A= HRRDanuoyR/+ITDUxXUEUIJkWGYzUfKzjI8ditBCI6zxNftWCaiw5XkrEEpctvzS=0A= CBbNE7KjAoFbZDnsXHgg9xZWpAzYYP6aCmBvpjISMGihXbw1oS6mJvvHTFSzjTvX=0A= QHShvyO8XLI7Q+NwrYV+mVNvtBX+mQaTsQdS9knSpoHHO/N0QlCUzbnPIEOVKjN6=0A= Hw7bcBokYeI0ez3yMZlf/bU/yyMRfxskOqxciQEcBBMBCAAGBQJXfuIzAAoJEOs4=0A= Jb6SI2CwxPgIAJtQBb/79MSdZZb3kggOC0ClZ7WDRSdP31R272gdckcbqVqm7vMl=0A= 0OZxQH5G4QRuFNLMSJG5ytf//qoxYj5CmvQS5NkP/sgnMaHvjHG+jRaBfB9t00Um=0A= h24BBL04Ac0lv3eiBc64nUJT37dEBUNEE8fgQ67gnV1hacqybVXqWIm1RXluL+Un=0A= fdFsbD6KWHLY2uPrARXdLYT7veUPnEgziw4s/2AVrGHiSgNZV1Z8pFMsuiUGpCRr=0A= 1K0r8b6hP3nxa0xxzk83NrKI6ZL1Jyhlqe7dLSWaSVofHk9WmcARZ+hJ/PlP+9N5=0A= Fd5ZuJ9R5t8C0gUB5v1ID4vPxt/YFCeiVJy5Ag0EV37h7QEQAKcbtHNm2vc6aYgR=0A= /eK0cJmJOqV3S0PtXychIV6zYj2/DppUOttsQN39nEgTBui1QFYfVgYNv3S0DBZY=0A= ESSijTLrzyCbzYL9AL/OzIgo++m8F0lERhhMKsVKtdZWLBflkQgPgCpMdwqhGdRP=0A= 5WrximbRtHN7JD4TCfupCqepefqvxyYv/pHYcDTFEycEChkRgCpc88tTxNdAyd2+=0A= F7lfvMxsgGmNcMa5IzIm1GXjKQONyiMffmjYT0Sod/AS/RA7z3aTv9/2Sm4TLgae=0A= 4BtV+ZU39VMkfA8c2DsnVi4zVKOBho7MH/Lwar2bQwKZ8U1TKhKDwK0Q1eYTq+3U=0A= Nc6Rk/9QolYpYup7/lH5wWppPvipqlltTQa6F0csD6AIc9W7rO7RVFo+lqvrEZAw=0A= AUXrRCTFtBijg715eZenDzS0QZw9WtQ6ufhsAamap6hJQmIZD3HdWdrHCT1TQ/Tt=0A= JzPAyIYbRbKCe2hoxUojF0A/P1ZL90kf/OZPQ6Oisl5XMyuyiJFgVbdbXYMJ+f+k=0A= 3pTrVxB9vASmGxX3LXCxVJAZ9xJWdBC73VK7rwit0tA8ijekrmkhSjZlIZCKvDYA=0A= j9fV4O6QXRuuFZKo4xGYWCIPFwe802jOrbvQw8YT5CgN7hGMUyHV/GCH50uUoVJD=0A= andFGy7hvTckfXk85oXARMswdyQ3ABEBAAGJAiUEGAEIAA8FAld+4e0CGwwFCQlm=0A= AYAACgkQja3pJ2dZunQeVQ/9FtseE5WqnmvPGc5NPGvbWhrd5x9CpStPG9b+xsBu=0A= 91ZXrMHsNOVQ0SxFdB708OT15sTy1ldeemxUK62E5XO1bvFJ4R1gHkWe6K/j9TfG=0A= Fshbyl3J6WKwG2qwT2JpNVpb+6QShFZVRe9a1rn3D/DNZurj3XYgVQGWlYVYT/LA=0A= 32zmBjQEzSXMbDBR/wSiJzYqgTB+9udGkcrYVgrmNz5YSA2mp6l1+PH/i++FD4j/=0A= KWFVnmqt1QqT8Q0l4MYQH65MdzHdspwfMt0XZ5abnubWIO78ImbOA/CD7MwbuWvy=0A= zezkiDcqQQ2G8mu/ER3oByfQ84iMIxGv1V608EBddHWygd6YQIKdScay0D+54IUz=0A= DXyv9tcnAAnxvMM5wzJyjWytOwL2H7FvSVAtfdywaF2wZA0iHho5Df8OeZdPEZhF=0A= 85GngH3hOBE0EAUMSFwThhRU7a2oMLSTFXRg0bKC3n0MoNExAV/oKiSM5HC06PsP=0A= exONpT/8WHL6GRk6vfsj09m7qScZSvyX35TxggnEHNwNW5/aYKIuhsXohxhLkUqM=0A= Bzu9/Xdq0xPOTyJSTberO8LR1TdWwi2WtPEBOtD25VMtEwhHrX3BKBkmYVu5f7vr=0A= CZikOLr7N8a5zJHJIiEdA2uljajBVTkPRCbMVsIBN2VVPcY2YOyNmG4gAtYmuDRL=0A= rb8=3D=0A= =3D8FDv=0A= -----END PGP PUBLIC KEY BLOCK-----=0A= --------------8472070F59882C623B1B59E3-- --E4RO7Bhb0HHrO62XUPe5uBkCb2X1Kuwr6-- --W3f1Jhx46qPo4mutv7AVisteCVERK8T7G Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" Content-length: 819 -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJXlv4uAAoJEI2t6SdnWbp0ue4P/09LXP90u9fMCOTcw+21FIcF h6FJGspQUDeOvKfkwP3zPrPJacEnsyavR87S1paaTXOD2gwwZDnYIBAhACxsuuwQ w0QlnyPByxBz1O858LxEggVxT/DWmuFJ3TnNOMIQSfW0m8NdDECXHghRyPI9DFDE QYkcQ6Tqt4dTZWTgEbypmsmna1YvrenJX3iODZq1SZBPMwkbO8GEnhqgwacHj9Gq nI/u4LxaEIgwz3TybYdJgeTt3j44AeTdqV8sALSZ50L5iiliOVUzdaKj61Vsq1Br IKcoci+7TKEJC8x0Xo6SHIGb25/W9o6zoSPNcZ4MGpVKIWDaKtwW+R1Um21DqMbv 6SAu5bTXPyfXz2QcY2hgNwtDBibPTX4W45r6D9gzd5z8jaEQhmC1RLRhZOIYMhvK yII06iqpI4Wt1LwDpbvcc6HX2q1UL/LLkzh1+YQDTv8aFxz15lhXEcFJSKy2dWIu MkUGlM3neAGpbRH0GftKkr9EsGvg/nGiywHdX5bPfLDKrlnVuUjN3NKEP1rkDeUA UvIFBNeyIHVFIdSzs3Voi9HHToZfmfrpGj/HbcoStNIhIeusddWzmUZNy83r3fyG OBqiR3Qx2JaKOjRXKmNxzxVGeE/8LrlH8bFAFtB+pqkUtplyRErXjlxXFUpBNcTW f93wf5RUhIZQnHvZAd1C =l5n+ -----END PGP SIGNATURE----- --W3f1Jhx46qPo4mutv7AVisteCVERK8T7G--