Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:127579 X-Original-To: internals@lists.php.net Delivered-To: internals@lists.php.net Received: from php-smtp4.php.net (php-smtp4.php.net [45.112.84.5]) by lists.php.net (Postfix) with ESMTPS id 4F41F1A00BC for ; Wed, 4 Jun 2025 13:04:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=php.net; s=mail; t=1749042128; bh=JITX05VECOSmxEM3ITdZ6oPvcx8PW8vWy+WWFL7GuwY=; h=Date:Subject:To:References:From:In-Reply-To:From; b=Jzbm+GB5Pm6CvNEcvRVasaj2oVqE6w6/6xasAxOV0DY1VAWDAUjWdcvIBdMu9Crx9 8RFMTIssdQoYVaiQfIYk+FdSK+8W56RxvhZvZVOthNJuS6gRut7xQnUDDCiA/z6UAe D6RCf0sXQ2J/kSozmIVY22GiuFsqsJxV7VnQ6oIbSD+3re9ZMtr9621ZU7pCDdBTU7 DTarQ6xLFaSvRZ7x3UIL14v8+vSNFcND9b7Q0aqFgZVu47Zshi9jU+yLEBwvEY+OxR iEQWfjk13m48MFhUy85k0Feo+o4elw0BQIfCq+5FDbfYyq5vaZMBl2X8jMa/FSx487 7vZS9oEnDyfMQ== Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 5C0D9180047 for ; Wed, 4 Jun 2025 13:02:07 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=BAYES_50,DKIM_INVALID, DKIM_SIGNED,DMARC_MISSING,HTML_MESSAGE,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=4.0.1 X-Spam-Virus: Error (Cannot connect to unix socket '/var/run/clamav/clamd.ctl': connect: Connection refused) X-Envelope-From: Received: from wp160.webpack.hosteurope.de (wp160.webpack.hosteurope.de [80.237.132.167]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Wed, 4 Jun 2025 13:02:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mabe.berlin ; s=he194859; h=Content-Type:In-Reply-To:From:References:To:Subject: MIME-Version:Date:Message-ID:From:Sender:Reply-To:Subject:Date:Message-ID:To: Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID: Content-Description:In-Reply-To:References; bh=F+Pj1zI5tSURiY9MvZkrVxzxJ8kRqrIQxlm9pyvKei8=; t=1749042250; x=1749474250; b=gFcDxjB7jNjNw0rhPITOEknwrPxLc3voStAmUNJ8hFCikLS5Rok6MHkiQi21rHqa86lwNk+/AtI nNKFUrFMjYR+S/g6IS6yTxcMY6+LtZJndUZqqx1Yjt7K/17OO+3X2zYcFNnKS5DBfUs4f5C8xhjAV YlgJCG9sCOwbhgshmMTo1phnqKX3fPK6GlU8zo3mE5c9Oulj0nGgcRfRiE4jcsM6mPR5mCmG4WZgR 6BHDm0BPslLwcHD15R6VDwTT0uQrHs84VJrl4nLhNVigQJtr/xM6JV949UyzTrIrTA1Gf6mXwCNDg 9Lh2LvezzjIL+HG1tzRPdXLJlGfPge2Ft2Jw==; Received: from [2a02:8109:b300:8f00:5b61:757b:2104:d3b5]; authenticated by wp160.webpack.hosteurope.de running ExIM with esmtpsa (TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_128_GCM:128) id 1uMnmr-00AXFe-0d; Wed, 04 Jun 2025 15:04:09 +0200 Message-ID: <68d1ae56-194d-4471-8943-435ed4e09770@mabe.berlin> Date: Wed, 4 Jun 2025 15:04:08 +0200 Precedence: bulk list-help: list-post: List-Id: internals.lists.php.net x-ms-reactions: disallow MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PHP-DEV] Allow hooks in `readonly` promoted properties To: internals@lists.php.net References: <28F14D0F-8483-418D-85D1-660564A4EAE2@nicksdot.dev> Content-Language: en-US Autocrypt: addr=marc@mabe.berlin; keydata= xsBNBFby8roBCAD4qHjbk9+V3SmB5DfpkTtX58jYJ9VXVfF54MDoI0fQiYvKyrrghfO78alH c12RsEZxLH2F5kEfu8WO4wA4apg2gBnRRxqPj7krsct1ySOAdMrRVp8Wtaeaznpdcn2gJZyA MSI6LTzebT25N77ksvSrUi1BuCKyOa7SmYff3xGgOwYsHQlT5opMNGPCVegiPmO/K37anwts gj6L7RVtjXtp2Z3wAs6r3EmO318PL48xDLUgYMvEFAPJglth5FGH2En6n6HFIhxh43LqXQiN eHVjLjS2y8huNBswwc9ZVxk3ip5z/GCmpWnNkgGBOSJ7loJRsq2tOaU6yU8KWb5rhOoFABEB AAHNIU1hcmMgQmVubmV3aXR6IDxtYXJjQG1hYmUuYmVybGluPsLAeAQTAQIAIgUCVvLyugIb AwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQOTar91O8iM6jzggAwvV6MqU/hcAI6ldp xVjucGz2J9cAWtva8GL+rm9zvEs7EENtamehJiZob/CTw50WiI/zsJzPblktpT0D2AFBEp9k P5/8CmCpZzxYPsxnLtsFM52fOBpO+aP0PSStBpJjndjBH7HPqKcTCXM3ZM+SL6lyRweAJR7G +JXIZbuUrbjB2lbGx3itNZ6TeXqqnE6KTXNKLEbNHfVdzE4sPDkmuZRo/M2h+gmeS1iQb29W BmhvL6czugCQI9rYl7C4Nci9wPii1lTYyfCWQfQKID4/F2HiOv+N/vDMCK1xV8TUeCy8w4X+ nYj+wDog046ki9lUM60oPij6WoSJLqfsXr1kNc7ATQRW8vK6AQgAq7QYLB1Dz+8RSi5AGJP1 tOFQXtcxyOhNVQZsI1mCQiHay4wteQ+5m4EOUuR+FrFIlnbSrPdTkKD2wvQDHVqpZivThBpJ vara/ick0wi2R3dasu1sPMu1P6h1EwUsydhviNJB07aLfPAWD6eoqmGTd8236znIIq7mbnNp OnxIQxviTyELUekrNw38uQtVzR6XZv9PAThA2o1J1JZID7QUpKcNyo9ebYlwxyS+xzhA4DLD qfD6O5sKoKvxEf2fIZeP0ETPpHNYk0WiWnmNoPy8eEY07LriYALVidBwPBcxus0wGoKf8Nun y2aE13SHmj0ioBI1bXMGJx3hEbvzXK6WrwARAQABwsBfBBgBAgAJBQJW8vK6AhsMAAoJEDk2 q/dTvIjOkowIAI70P8U4j3eqyK/7x1bnCZZRcpwZ1aH+LR1yMKTINo9NDqlOBWQTLT69YMfV 4UN+nTSiD/uLw1fSeLSzBwpoalCMLPVOX/d3Mq5JtL5cKtWUTIVf3Vb7VbN4Rvb8HgWjeSnM 1PiG9yQBmLKI68sG/gdgvA/xANdUatkDgG0yj8PCdt+Vy4EblXbIAXZXJ6eRugSKowTjst7i HXKOJxivomHFcmqmkiqjwGTGx/jrhbDtEpPDRk+U9W45D4CbUcyPR6lMSrje5JPGQDv/45M5 wPe286YelBjnb0cWRJpA7GZCWDKZOsQ2H6cCRBi8i4m+vfRk7GLA536XnmvWxKFVP9U= In-Reply-To: Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------a6MyPD7Wv2OXQpQaUQgMfKG7" X-bounce-key: webpack.hosteurope.de;marc@mabe.berlin;1749042250;1b127ba7; X-HE-SMSGID: 1uMnmr-00AXFe-0d From: marc@mabe.berlin (Marc Bennewitz) This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------a6MyPD7Wv2OXQpQaUQgMfKG7 Content-Type: multipart/mixed; boundary="------------8uYhe1UKZUJO20tyejzALe8G"; protected-headers="v1" From: Marc Bennewitz To: internals@lists.php.net Message-ID: <68d1ae56-194d-4471-8943-435ed4e09770@mabe.berlin> Subject: Re: [PHP-DEV] Allow hooks in `readonly` promoted properties References: <28F14D0F-8483-418D-85D1-660564A4EAE2@nicksdot.dev> In-Reply-To: --------------8uYhe1UKZUJO20tyejzALe8G Content-Type: multipart/mixed; boundary="------------l5HULV9zDRVZItttmTFoswNX" --------------l5HULV9zDRVZItttmTFoswNX Content-Type: multipart/alternative; boundary="------------zEhyuPstfm28pqGD0OMMr8Bn" --------------zEhyuPstfm28pqGD0OMMr8Bn Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 SGkgTGFycnksDQoNCk9uIDAzLjA2LjI1IDE5OjAzLCBMYXJyeSBHYXJmaWVsZCB3cm90ZToN Cj4gT24gTW9uLCBKdW4gMiwgMjAyNSwgYXQgMTE6MzQgUE0sIE5pY2sgd3JvdGU6DQo+DQo+ PiBJIHdvdWxkIGxpa2UgdG8gYWRkLCBwZXJzb25hbGx5LCBJIGRvbuKAmXQgYmVsaWV2ZSB0 aGUgYWJvdmUgaXMgZHVtYjoNCj4+DQo+PiBgYGBwaHANCj4+IGNsYXNzIER1bWIgew0KPj4g cHVibGljIHJlYWRvbmx5IGludCAkdmFsdWUgeyBnZXQgPT4gJHRoaXMtPnZhbHVlICogcmFu ZG9tX2ludCgxLCAxMDApOyB9DQo+PiB9DQo+PiBgYGANCj4+DQo+PiBJIHRoaW5rIGl0IGlz IGEgbGVnaXRpbWF0ZSB1c2UtY2FzZS4NCj4+IFdoeSB3b3VsZG7igJl0IGEgYHJlYWRvbmx5 YCBwcm9wZXJ0eSBhbGxvdyB1cyB0byBmb3JtYXQsIGNhc3Qgb3IgaG93ZXZlcg0KPj4gbXV0 YXRlIGEg4oCcb25seSBvbmNlIHdyaXR0ZW4gdmFsdWXigJ0gb24gY29uc3VtcHRpb24/IEl0 IHdpbGwgbm90IGNoYW5nZQ0KPj4gdGhlIHVuZGVybHlpbmcgdmFsdWUuDQo+PiBJZiBpdCBt YWtlcyB0aGluZ3MgZWFzaWVyIGZvciB1cywgYWxsb3cgaXQuIEl04oCZcyBub3QgbGlrZSB0 aGlzIGlzIHNvbWUNCj4+IGhpZGRlbiBpbXBsaWNpdCBiZWhhdmlvdXIuIFdlIGNvbnNjaW91 c2x5IG11c3QgYWRkIHRoZSBleHRyYSBjb2RlLA0KPj4gaGVuY2UgZXhwZWN0IHRoZSBvdXRw dXQgdG8gYmUgY2hhbmdlZCBhY2NvcmRpbmdseS4NCj4gSXQncyBhYm91dCBleHBlY3RhdGlv biBzZXR0aW5nLiAgSWYgeW91IHNlZSBhIHByb3BlcnR5IG1hcmtlZCBgcmVhZG9ubHlgLCBp dCdzIHJlYXNvbmFibGUgdG8gZXhwZWN0IHRoaXMgdG8gYmUgdHJ1ZToNCj4NCj4gJGZvby0+ YmFyID09ICRmb28tPmJhcjsNCj4NCj4gRm9yIGEgdHJhZGl0aW9uYWwgZmllbGQgKHByZS1o b29rcyksIHRoaXMgd291bGQgYmUgdHJpdmlhbGx5IHRydWUuICBXaXRoIGhvb2tzLCBpdCBt YXkgb3IgbWF5IG5vdCBiZS4gIFNheWluZyAid2VsbCwgdGhhdCBhc3N1bXB0aW9uIGRvZXNu J3QgaG9sZCBhbnltb3JlLCBkZWFsIiBpcyBjZXJ0YWlubHkgYW4gb3B0aW9uLCBidXQgaXQn cyBub3QgYW4gb3B0aW9uIHdlIHdhbnRlZCB0byBwdXJzdWUgYXMgcGFydCBvZiB0aGUgbGFy Z2VyIFJGQy4gIEJ1dCB0aGF0IGlzIGNlcnRhaW5seSBhIGRpcmVjdGlvbiB3ZSBjb3VsZCB0 YWtlLg0KDQpJIHJlY2VudGx5IHJ1biBpbnRvIHRoaXMgbGltaXRhdGlvbiBhcyB3ZWxsIGFu ZCBJIHdhcyB1bmRlciB0aGUgDQppbXByZXNzaW9uLCB0aGF0IGEgZ2V0IHByb3BlcnR5IGhv b2sgYWxsb3dzIGZvciByZXBsYWNpbmcgZ2V0dGVyIG1ldGhvZHMgDQp3aGljaCBpc24ndCBm dWxseSB0aGUgY2FzZSBhcyBzZWVuIGhlcmUuDQoNCj4+IFNvLCBJIHdvdWxkIGxvdmUgdG8g c2VlIHRoaXMgUkZDIHRvIGJlIGltcGxlbWVudGVkLg0KPj4gTWF5YmUgeW91IHdhbnQgdG8g bW92ZSBpdCB0byBkaXNjdXNzaW9uPyBUaGVuIG15IHNlcGFyYXRlIHRocmVhZCBoZXJlDQo+ PiB3b3VsZCBiZSBvYnNvbGV0ZS4NCj4gSSBiZWxpZXZlIGF0IHRoZSBtb21lbnQgdGhhdCBS RkMgdGV4dCBpcyBhbGwgdGhlcmUgaXMuIDotKSAgSSBkb24ndCBrbm93IHRoYXQgaXQncyB3 b3J0aCBvcGVuaW5nIGEgZGlzY3Vzc2lvbiB3aXRob3V0IGF0IGxlYXN0IGEgbW9zdGx5LWRv bmUgaW1wbGVtZW50YXRpb24uICBBbHNvLCBJbGlqYSBpcyByYXRoZXIgYnVzeSBvbiBvdGhl ciB0YXNrcyBhdCB0aGUgbW9tZW50LCBhcyBhbSBJLiAgKFVubGVzcyBzb21lb25lIGVsc2Ug d2FudHMgdG8ganVtcCBpbiB0byBpbXBsZW1lbnQgaXQsIHdoaWNoIHdvdWxkIGJlIGZpbmUu KQ0KDQpJIHdhbnRlZCB0byBjcmVhdGUgYW4gYWJzdHJhY3QgY2xhc3Mgd2l0aCBhIHNwZWNp ZmljIHByb3BlcnR5IGRlZmluZWQgdG8gDQpiZSByZWFkb25seSBhcyBpdCdzIHN1cHBvc2Vk IHRvIGJlIHVzZWQgYXMgdmFsdWUgb2JqZWN0LiBUaGFuIGluIHRoZSANCmltcGxlbWVudGF0 aW9uIEkgd29udCB0byBsYXp5IGxvYWQgb25lIG9mIHRoZSBleHBlbnNpdmUgcHJvcGVydHkg dmFsdWVzIHRvLg0KDQpUaGlzIFJGQyB3b3VsZCByZXNvbHZlIHRoYXQgbGltaXRhdGlvbiBm b3IgbWUgOisxIGJ1dCBJIHN0aWxsIGRvbid0IGdldCANCnRoZSBsb2dpYyBiZWhpbmQgaXQu DQoNCkVzcGVjaWFsbHkgd2h5IHRoZSBmb2xsb3dpbmcgaXMgYWxsb3dlZCBmcm9tIHRoZSBS RkM6DQoNCnJlYWRvbmx5Y2xhc3MgTGF6eVByb2R1Y3R7DQogICAgIHB1YmxpYyBDYXRlZ29y eSRjYXRlZ29yeSB7DQogICAgICAgICBnZXQgPT4kdGhpcy0+Y2F0ZWdvcnkgPz89ICR0aGlz LT5kYkFwaS0+bG9hZENhdGVnb3J5KCR0aGlzLT5jYXRlZ29yeUlkKTsNCiAgICAgfQ0KfQ0K DQpidXQgdGhpcyBpc24ndDoNCg0KcmVhZG9ubHljbGFzcyBSYW5kb217DQogICAgIHB1Ymxp YyBpbnQkdmFsdWUgew0KICAgICAgICAgZ2V0ID0+IHJhbmRvbV9pbnQoUEhQX0lOVF9NSU4s IFBIUF9JTlRfTUFYKTsNCiAgICAgfQ0KfQ0KDQpXaGlsZSBjb25zaWRlcmluZyBzb21lb25l IHJlLXdyaXRlcyB0aGUgYWJvdmUgUmFuZG9tIGNsYXNzIGp1c3QgdG8gbWFrZSANCml0IHdv cmsgd2l0aCBhIGJhY2tlZCBwcm9wZXJ0eToNCg0KcmVhZG9ubHljbGFzcyBSYW5kb217DQog ICAgIHB1YmxpYyBpbnQkdmFsdWUgew0KICAgICAgICAgZ2V0ID0+ICgkdGhpcy0+dmFsdWUg Pz8gMSkgKiByYW5kb21faW50KFBIUF9JTlRfTUlOLCBQSFBfSU5UX01BWCk7DQogICAgIH0N Cn0NCg0KIEZyb20gdGhlIFJGQyB0ZXh0IEkgd291bGQgZXhwZWN0IHRoaXMgdG8gYmUgYWxs b3dlZCBidXQgaXQgZG9lc24ndCBoZWxwIA0KYW55b25lLiBZb3VyIGRlc2NyaWJlZCBleHBl Y3RhdGlvbiBpc24ndCB0cnVlIGFueW1vcmUsIHRoZSBjbGFzcyBhdXRob3IgDQpoYXMgbW9y ZSB3b3JrIGFuZCBub3cgaXQgc3RvcmVzIGEgbmVlZGxlc3MgdmFsdWUgaW4gbWVtb3J5Lg0K DQpBZGRpdGlvbmFsbHksIHlvdXIgZXhwZWN0YXRpb24gaXNuJ3QgdHJ1ZSBhbnl3YXkgYXMg eW91IG5vdGVkIGluIHlvdXIgUkZDOg0KDQogPiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlcmUg aXMgbm8gc2hvcnRhZ2Ugb2YgZHVtYiB0aGluZ3MgdGhhdCBwZW9wbGUgDQpjYW4gZG8gd2l0 aCBQSFAgYWxyZWFkeS4gVGhlIGV4YWN0IHNhbWUgc2lsbGluZXNzIGNvdWxkIGJlIGltcGxl bWVudGVkIA0KdXNpbmcgfF9fZ2V0fCwgZm9yIGluc3RhbmNlLiAuLi4NCg0KPiAtLUxhcnJ5 IEdhcmZpZWxkDQoNClRoYW5rcywNCk1hcmMNCg0K --------------zEhyuPstfm28pqGD0OMMr8Bn Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

Hi Larry,

On 03.06.25 19:03, Larry Garfield wrote:
=
On Mon, Jun 2, 2025, at 11:3=
4 PM, Nick wrote:

I would like to add, perso=
nally, I don=E2=80=99t believe the above is dumb:

```php
class Dumb {
public readonly int $value { get =3D> $this->value * random_int(1, =
100); }
}
```

I think it is a legitimate use-case.
Why wouldn=E2=80=99t a `readonly` property allow us to format, cast or ho=
wever=20
mutate a =E2=80=9Conly once written value=E2=80=9D on consumption? It wil=
l not change=20
the underlying value.
If it makes things easier for us, allow it. It=E2=80=99s not like this is=
 some=20
hidden implicit behaviour. We consciously must add the extra code,=20
hence expect the output to be changed accordingly.
It's about expectation setting.  If you see a property marked `readonly`,=
 it's reasonable to expect this to be true:

$foo->bar =3D=3D $foo->bar;

For a traditional field (pre-hooks), this would be trivially true.  With =
hooks, it may or may not be.  Saying "well, that assumption doesn't hold =
anymore, deal" is certainly an option, but it's not an option we wanted t=
o pursue as part of the larger RFC.  But that is certainly a direction we=
 could take.

I recently run into this limitation as well and I was under the impression, that a get property hook allows for replacing getter methods which isn't fully the case as seen here.

=
So, I would love to see th=
is RFC to be implemented.
Maybe you want to move it to discussion? Then my separate thread here=20
would be obsolete.
I believe at the moment that RFC text is all there is. :-)  I don't know =
that it's worth opening a discussion without at least a mostly-done imple=
mentation.  Also, Ilija is rather busy on other tasks at the moment, as a=
m I.  (Unless someone else wants to jump in to implement it, which would =
be fine.)

I wanted to create an abstract class with a specific property defined to be readonly as it's supposed to be used as value object. Than in the implementation I wont to lazy load one of the expensive property values to.

This RFC would resolve that limitation for me :+1 but I still don't get the logic behind it.

Especially why the following is allowed from the RFC:

readonly class Laz=
yProduct {
    public Category $categ=
ory {
        get =3D> $this-=
>category ??=3D $this->dbApi->loadCategory($this->categoryId);
    }
}

but this isn't:

readonly class Ran=
dom {
    public int $value {
        get =3D> random_int(PHP_INT_MIN, PHP_INT_MAX);
    }
}

While considering someone re-writes the above Random class just to make it work with a backed property:

readonly class Ran=
dom {
    public int $value {
        get =3D> ($this->value ?? 1) * random_int(PHP_INT_MIN, PHP_=
INT_MAX);
    }
}

From the RFC text I would expect this to be allowed but it doesn't help anyone. Your described expectation isn't true anymore, the class author has more work and now it stores a needless value in memory.

Additionally, your expectation isn't true anyway as you noted in your RFC:

> On the other hand, there is no shortage of dumb things that people can do with PHP already. The exact same silliness could be implemented using __get, for instance. ...

=
--Larry Garfield

Thanks,
Marc

--------------zEhyuPstfm28pqGD0OMMr8Bn-- --------------l5HULV9zDRVZItttmTFoswNX Content-Type: application/pgp-keys; name="OpenPGP_0x3936ABF753BC88CE.asc" Content-Disposition: attachment; filename="OpenPGP_0x3936ABF753BC88CE.asc" Content-Description: OpenPGP public key Content-Transfer-Encoding: quoted-printable -----BEGIN PGP PUBLIC KEY BLOCK----- xsBNBFby8roBCAD4qHjbk9+V3SmB5DfpkTtX58jYJ9VXVfF54MDoI0fQiYvKyrrg hfO78alHc12RsEZxLH2F5kEfu8WO4wA4apg2gBnRRxqPj7krsct1ySOAdMrRVp8W taeaznpdcn2gJZyAMSI6LTzebT25N77ksvSrUi1BuCKyOa7SmYff3xGgOwYsHQlT 5opMNGPCVegiPmO/K37anwtsgj6L7RVtjXtp2Z3wAs6r3EmO318PL48xDLUgYMvE FAPJglth5FGH2En6n6HFIhxh43LqXQiNeHVjLjS2y8huNBswwc9ZVxk3ip5z/GCm pWnNkgGBOSJ7loJRsq2tOaU6yU8KWb5rhOoFABEBAAHNIU1hcmMgQmVubmV3aXR6 IDxtYXJjQG1hYmUuYmVybGluPsLAeAQTAQIAIgUCVvLyugIbAwYLCQgHAwIGFQgC CQoLBBYCAwECHgECF4AACgkQOTar91O8iM6jzggAwvV6MqU/hcAI6ldpxVjucGz2 J9cAWtva8GL+rm9zvEs7EENtamehJiZob/CTw50WiI/zsJzPblktpT0D2AFBEp9k P5/8CmCpZzxYPsxnLtsFM52fOBpO+aP0PSStBpJjndjBH7HPqKcTCXM3ZM+SL6ly RweAJR7G+JXIZbuUrbjB2lbGx3itNZ6TeXqqnE6KTXNKLEbNHfVdzE4sPDkmuZRo /M2h+gmeS1iQb29WBmhvL6czugCQI9rYl7C4Nci9wPii1lTYyfCWQfQKID4/F2Hi Ov+N/vDMCK1xV8TUeCy8w4X+nYj+wDog046ki9lUM60oPij6WoSJLqfsXr1kNc7A TQRW8vK6AQgAq7QYLB1Dz+8RSi5AGJP1tOFQXtcxyOhNVQZsI1mCQiHay4wteQ+5 m4EOUuR+FrFIlnbSrPdTkKD2wvQDHVqpZivThBpJvara/ick0wi2R3dasu1sPMu1 P6h1EwUsydhviNJB07aLfPAWD6eoqmGTd8236znIIq7mbnNpOnxIQxviTyELUekr Nw38uQtVzR6XZv9PAThA2o1J1JZID7QUpKcNyo9ebYlwxyS+xzhA4DLDqfD6O5sK oKvxEf2fIZeP0ETPpHNYk0WiWnmNoPy8eEY07LriYALVidBwPBcxus0wGoKf8Nun y2aE13SHmj0ioBI1bXMGJx3hEbvzXK6WrwARAQABwsBfBBgBAgAJBQJW8vK6AhsM AAoJEDk2q/dTvIjOkowIAI70P8U4j3eqyK/7x1bnCZZRcpwZ1aH+LR1yMKTINo9N DqlOBWQTLT69YMfV4UN+nTSiD/uLw1fSeLSzBwpoalCMLPVOX/d3Mq5JtL5cKtWU TIVf3Vb7VbN4Rvb8HgWjeSnM1PiG9yQBmLKI68sG/gdgvA/xANdUatkDgG0yj8PC dt+Vy4EblXbIAXZXJ6eRugSKowTjst7iHXKOJxivomHFcmqmkiqjwGTGx/jrhbDt EpPDRk+U9W45D4CbUcyPR6lMSrje5JPGQDv/45M5wPe286YelBjnb0cWRJpA7GZC WDKZOsQ2H6cCRBi8i4m+vfRk7GLA536XnmvWxKFVP9U=3D =3Doi2m -----END PGP PUBLIC KEY BLOCK----- --------------l5HULV9zDRVZItttmTFoswNX-- --------------8uYhe1UKZUJO20tyejzALe8G-- --------------a6MyPD7Wv2OXQpQaUQgMfKG7 Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature.asc" -----BEGIN PGP SIGNATURE----- wsB5BAABCAAjFiEENJIbKB0SAX2RmUKbOTar91O8iM4FAmhAREgFAwAAAAAACgkQOTar91O8iM58 TAgA9+cy8TfLhEBnwm8FiF8Cn4i0fdG41ErobSYbfbgf2mYHE1099/HbXo9dNAUpnLIxqichoVpB s5+bWAAIcBGd4jyo8tnfT6b1RdflrDyjMZk9AQKAdvdSQyt1ZVQpPySNGPQZYWsfOh1Cw2pF2m7f 5TYkO7Y79Iwwy9okE4SwZdDugc0ahgwBLpvW7R/mcUbZGDAZ7hvSTPtgZntrbw+0wo9O/hoTComu bcu+HZfv+VqgZvBYIkt35I1xsNh9p696b9fyD6pihQY8kllE19KIoY1gXXR00fDPWjl/yJVx91+c t3sAMPAElZ60KRCVyvDVNug+RVrVaCOMCu/XCUN3Uw== =pEeO -----END PGP SIGNATURE----- --------------a6MyPD7Wv2OXQpQaUQgMfKG7--