Topic: smart function pointer proposal
Author: Houe <mboyko2000@gmail.com>
Date: Tue, 12 May 2015 17:26:48 -0700 (PDT)
Raw View
------=_Part_3430_76621746.1431476808805
Content-Type: multipart/alternative;
boundary="----=_Part_3431_1438980469.1431476808805"
------=_Part_3431_1438980469.1431476808805
Content-Type: text/plain; charset=UTF-8
Here is a proposal document for a smart function pointer. It is purely a
library proposal - no additional language features are needed. I believe
I've got the correct syntax and semantics for the type but looking for
feedback. I've included 2 different implementations for the smart pointer
(fun_ptr2 and fun_ptr3). Version 2 is easier to understand and follow while
version3 is probably 10x performance. I've also included example and test
code. I created an event<> type based on the smart function pointer that
has nice syntax and semantics as well to show a very good use for the type.
Just posting it here to gauge if the community is interested in such a
library.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_3431_1438980469.1431476808805
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Here is a proposal document for a smart function pointer. =
It is purely a library proposal - no additional language features are neede=
d. I believe I've got the correct syntax and semantics for the type bu=
t looking for feedback. I've included 2 different implementations for the s=
mart pointer (fun_ptr2 and fun_ptr3). Version 2 is easier to understand and=
follow while version3 is probably 10x performance. I've also included exam=
ple and test code. I created an event<> type based on the smart funct=
ion pointer that has nice syntax and semantics as well to show a very good =
use for the type. Just posting it here to gauge if the community is interes=
ted in such a library.</div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_3431_1438980469.1431476808805--
------=_Part_3430_76621746.1431476808805
Content-Type: application/zip; name=smart_function_pointer.zip
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=smart_function_pointer.zip
X-Attachment-Id: 64ec14c6-c909-4255-be5b-006b29605a89
Content-ID: <64ec14c6-c909-4255-be5b-006b29605a89>
UEsDBBQAAAAIAOCWrEb3D/hztQYAAHYVAAAHAAAAZXZlbnQuaK1YS4/TMBC+r7T/wYC0SllaQNxC
u4B4CCTEARY4IFS5idMa0iSyncKy6n/n8yuO0xRYiR76GM98855xev/+3f/6Oj25f/8WeVrwkrmv
K8FZQV7uWKWIYtumpIqRnBW84orXlZydnvx/I05P7vCiyqH44+Wbt8uXn16+u1y+BtUoZhHVcldZ
2eaM3C7aatko8Wi2ud0nQ4qW5VVMne9Ypmpx0SfRcl0LrjbbiCpVzn5mrFERlSsm6BAgo1IyAUaY
VdEtkw3NGGkVL09PrjWxC+JcXTVMs5BXbZV94OuKqlYwSGYlQAjTMX+sRUIiLJEYBkdXDRV0S94z
RS43jAgGkIpobFIXRIFkZQoo0Rkj0msiSStbHRayq3k+mcWAz8RaDkWpWLdbUOSYG9qEe8T/ms1m
BiJ2Zw6eRJNxPLkwEWnaVcmz9PSEEMuTZCgrZb+fTcgC1VYyxR73OOzZ+OEZqRubl8XfkXrMo6CG
sxf+F6b+dFQNzxoBsKFuJcuJqkmGeHbxkuQHSqnD0GKHaXBp4i5CM81uMFHrpm4epamr6jh6nQVL
cB83VgJ8YCSvdvV3dkxpjOuYRackZGFC0sBbcqmWyeQeaZZWYplTRZfXVVuWMH1/j6zpji092nVB
S8n2Bu3avO8PHNC1jM+djbeTJEUt+pZ7mU72EmchyhmtSF2hxFfM5Ibl+JkxIxa5RtZMeeuSyUg0
n+U5oZ2/QYOqjXnBGtNNXV2duyqMo3qmZV44yqSLgn4NQjprWrlZrmj2PemLPD4Ws/dsW+/YqKWF
qLd/tHX6D7aayDSC7/AjdcrJc0RWErwZeKoUzTYs72DkjFyGDAaD6tU3TGCTF2ly6vA6Dmsjqt7J
+uInFJ+9JBFq2gkqbclKUjGUcm6LxajGALeHK5ZRNAJEdrRscVSQ6UOy5euN8mjsJ5eDnuiGHFZB
mtrFMY/CdJGmOS8KJliVGYrT2m8cSIsWHvc6JOQ9cJOsFUIPfxhjybbK/EFI0Igsq/LHmhTJ1hha
DZXKgGAcDxD2zr4/eDcoS1N/fT/uxo3vGFZ1XUaNr+la240WiCeN7ZA07XXxEY6otU9PTMR13pPI
sklIhdqI+gdJUxMO0VaKb9mSCVGL5DYmSlUrsubosm1bKt6UTq0vcHnbt6d5j5RguaAE7Apyu9oP
+S1F7FD5ydkf3Lxn+kTj728YRNPpo8g3aX9Ez3fJK1TXYBPWBEhSXyzwJqBM4NNfk3Qz2trjmEVc
4Evddj0n2ZYizpmc2MajrUdb4j5GFoboK7SA6mQwJ8WKrXmlN9DwAB0B8nCKecWfqcQs2FKVbWBh
W+VPuvII6m8txlF9zRioPgiZEsQSATAtdxgLOEer7qfBiJ3WPpPk/LyzYTJb4ZtdTUHlG9lbhn48
lFcIsdarbVDsJwJd+Ak6se45D+Oe7Xnj57rQRY5MrZBd1CdM1vcDPd95tQ4bJejRPztdEVr/6oMR
aRjtqMHADqZDFaBdaPS6RuRm5I1BjPFgs07clRn2iKg2sm1yLYUainh9Mmxw3ygbfzcfk3VLBYov
oFwsyANr/HC8uuxYwYWtxhwFQeHRsCJ9QXYZ7XIX0mfjBTl9rbauW/ZcB2WOU2oyOYyPC3Eew3kD
homdXjjxSdiGJmrSOUzzb8gylJasUBGmWR2yxMSTdU+4qTkeA/xaknTbOTGLnYrRDjz8saFd2fZA
Ew2wWJAMfH2bJUZlGSEed0Nb7kqtberKTVuoD1fgxGBHeFYRTAPYTmc1nxHMe5Z6K03FrfTUy4Rx
0FbN9CF84dkGkjHeD4ZrkX1uzcGC+wEGznilYGg81JrbyvOXtIpT3Ckx3mmsugLtqqtmHNkgm9s+
aIgHzdGY4IiQuuEz8+Ro6lmw+YIcqSQ3K8LLPvceKzwyPwDCALV7Mrym0yPif+UDWJ9nj+qTbOjO
uBHw5Kbo/vs+msWSFgz9qRUOq3+YcMOT9OeCRrv5Ugd9fKeP3Jf7u5tVUj95Kt19VV11fxXIdiUz
wVf9y7vrlejJIeT7Vhwr7UrY3/0TmdW4SneLvH92/eAeOpti+y/R8Goexu3FcKZK/gtdO9n3Frhp
HgvXLSJzFluGaX12aM/jobHP3SZbmGtZmrp/jpIvZ19dnfgI6qYaUzum2T0Fuzz3rh/2DwOGfRrd
yHWblxjjhwbPQkONHNpyDmba0aVTZxSZ2UVLNH43zTBgjC+8MBz6QdM9kJ0vCFbzdDFewl+Om/Y1
oa4Qrb+hWI7L6JU7fXgTgWP+B4zz8+Piccftdajif+vM34qA4wXOBn84/gZQSwMEFAAAAAgAJGSr
RkncnbvvBAAA2xsAAAoAAABmdW5fcHRyMi5o7VlLj9MwEL73VxitVLnV7oI49hGJS8UJIQjnyE0c
akiT4DgFhMpvZ2zHsfPaTR/LQyJatU08j29mPtvj7A2L04jGaPPhTfDWf/cyeD25gXuWUvfR5Ial
YVJGFK32dJ/x7x5Cz58XIlosih3hNApywR2hUrCECZCqhOKMfyU8mkxSsqdFTkKKpMjLyQ/3UUQF
YYl8Jug+T4gAS+J7TqUEekfFLTJ39/f36BX/WHiTMCFFgQThH6kItqSgoJ6X24SFiwlC6MC4KEmC
fjoSeIbW4CsmZSKWjpB0gVh6yD5TLI1LJwS+ZyjM0kKA0ouG+DbLEhTuaPg5oF/gAQSMtaTjbIoy
saPc2Egz+i2keWVskvNM0FDQSIFtYrSiFuxxeXpuCkHSiCRZSgPtAC2QzpDrcKVsVGF7zSTSbzn8
ZKJrCsuU4XlcpuHM5GxmoYOyvBbDjvDsFoT0Ja0EWNmSz37Ij6PMETtAuBLJYxXKDpRzFtFKXV2c
ipKnFchghl0+rlSesDIhkS+1S/gcV9xmLM1Sa/cmFf3YSCkylMsCf4fKsTAISSFWSr2b67mHp9rB
shVajp6tUVomSS7A+3SKsIoVrdcov/PUbzc0XTPtRQ3a0o1jGPKH2bYvBdkmNIBlYkv5xYzrmLOs
8xeL+Z6KXRZZ/LfIn6Ns+wnm1Lks1CYDrL/tQGU2wPr7KShaebjzqrigMFL1b2NmsyZnsFPHafhZ
3ckhqWmvqgRGrrpzU1HzQAOrs/bKyZpkhB6uHF3OcWXuWgxXxsbyW0sDJx++tNj/ufD0c0F9/gMz
QQOVCvrXE8wKuZUIlqWBtnjxxOi3h30UWzqPJfIJVwwtyBMQOg7+Sv62knwGhaexouVUdhouJc02
gaBgFbuOcBxA7Xa/l3QbgPWefUwJeKUOweQxYwRNDTVbmjKR9Yxo0s6IYJdb5uGPKuCjSwuro1vK
SiYQfezEJmX9Fvrb6PZarf3syWca6EPXSmdwsej0ik3KeLqpbjvvyaLvOajGtVkdlO6kG0Tc6SEs
at8Bbow1N6TbyvcVI6o21vbGeUINlOZJ8VwaDEysM7PfmvXDcOPZEGNVuOZu2ntabcgbyQdEfxrZ
R63BGphTTkTG14OTr8ZtD9aoXrpay9pc7Fihl64BN6fG66iOCd1serWW2hlw+61Bd1+pQ3tmY+un
kF0ZN1/V2qj3M+sSz7AemU6b+5rrVq3gGeyGCBgVoTLV74oitKU7cmAAnMU1JlYYTL2Y7zy9lTaP
5JuvnUN5dx9uvXmqiT24a3rG6XJobm14ewuBR3WiYs5oGqmq2Mq2WLFSJrDWkshhr052xUNdyKP6
fFfUrDn5/Q9LE6jNI6Cly5GAu4pDSCeSLpIKGOzdV6mfaRJVA7wzUBNsC72HZFmLPZZAjtE7r9U+
zV3DZp4fW80YSQpqeNWL5wF5i9His9TmJQgeL63Ss99YpQr5M1kq6OSUyBVCuIRozTV9CDB0PcJ0
s9K1h5PrQL8k++Ogm1xXglcC3fR9fYLwsaD5WNDrs0HzcaCbkM9Lc2+mkOqrYMj07rnTubsQ+tVx
nI8rOvIvRCa7XXDW6d3HgVTd6R9C2ujJr4jaN6jUydiC8FFC9tuIqJb3zoMOLUykEq4lpgDRtku3
yF2B/LlXn/KaDLjIENaYZDD6AC3/2v9Fm9xAc8JiGHL/afcLUEsDBBQAAAAIALVaq0b6mdigHwgA
ANQwAAAKAAAAZnVuX3B0cjMuaO1bWY/TMBB+768YQFRptRQQb93dSNwgIYSgPEfZxKGGNAmOw3Jo
+e3M2E7iHG3Tg1P0YdvY45lvLh8T7w0eJSGL4O3i+QvvyduX3qvF63ves9ENbOQJ67SPbvAkiIuQ
wVnCLl0oP7dvQxb7AVuxRAL2WHSF5DGXX9ySLpfhfB6l4tIXoUUmv2TMk8LnMncrMj/m7xIWekXC
08QiXrFVKgzLijhf+gJpMyksSuxhnwOWSdeiFEUi+Yp5TIjUJg78PGdCVlD1IxJEcE0bJHRePnr8
4O3TSQs5T6LUHd1gScijuut6A/9seZ2YkuwY3gUBLP0c0oRZrHiaS8H8lTsaJf6K5RmaFMiA90bf
7KaQSZ/H1IYMUT4S5SwEmQJK+liw+AvwkKGg6Av4EPNcQhqBZCt0kmRqRD6iv+T7TykPwZnqkR4P
PTlxJqeKNfODJfAklz7y8iUqofgseV4xU1pwiZpcJmhdJAogLFarLxAVSUBDZrBYMuLmh6FgeV6y
qAgAf6/Fj6Ss1MAAN6KN6ckqs9kM7ot3uTtC+xWBhOfhU5bAtxFAiSlIUQ32OROoT0yhbekL75j0
qmdngsNorPoIJguRwFhxnM+VaqfUdzUaZYJ/QhzzWow2piIybDTp1emoBza8ZvIEukoEsZ+jhX1B
uC78nKGns+Ii5oES9YkLWfgxfLconAkkqY50OAd0q1/EEoXW5CQMdf+UfmAOiSFxPn5PlGlo1B1N
f/t2OYR6tEFTgQ7h6QpuIW+WYUemPZNevGeBtMTYsKcQxBjgDhllCpiYRpYN9U4T5EWaotglCz54
7CM24MzhqDE23zGkKHsdt0ykEjGxUBkLXY524xK2G2sfJyVFHHuaNcxBO8kWdaZGG3u7lR8b0Gwm
NrT5ekYmuLpx2Ofl21Py8/R2aa/0E058mF9WmJupzrl2XY8NwbdRXZ+cGjq5FOllzyzqbBx4RT4e
5tumnk1PawylgTYqQv7CVJ7SRDOB83MwDZpdpY4KzYlqPKXA/1hwtF+RqOnoky+4fxEzwKUq4ck7
uFyyBMPlonhHU1bIc+oNmxMFpgurdV6v2fbcaGpXr3W4WjA1gZrkg4iTy2VKCYndXxmxo3mZGpQY
VIHHMfhxnhJ1AzEt1+AQgGYcnu4/c9F6Efok9+DU6LBycBSuVrR2TMoIn1RJY1TbnDonSKQ/xMVz
6O8u+VTPml0n1XY1IL2J4+txf3gq+IVMxyDg3CxlHu6G5JkS1vXC2DXDT1s6K5VJiJhp7f/WXOgG
XkcfHYkaqeqsA3LYYgKL9Tm0KiTNLh5udS+YODiPOuzqXFrM59MVk8s0rPGfwGJqTLpvbmmWnqO/
6w7D1nP0989IPCPhlmv0+idysOnBbXmoFTeZWFoBxuPSOKZHP/y9WdprlFL5E+hRrwp5jb0KkPtW
gFDwq+6SweHprNgdK5kVs6GprKkx/TZ/NNn/tP/T0l79/duS3s7TeswRs1QzpAH610/I2LI64WmO
BydtPz9nAdFkUIZBFnmOOnit/A/M09Wus4XrRJO+ZBokvFU3Q24oZd/Mr/FhSDhZE9aBqT3Non8i
m1t+2JLQWWQyFn/8wmTtB4kebaRob+zovDMZ9CZdsYf0C1uuaCPQLmD2JugTlP4Gy6Y+omJWMpKQ
ASldpnFrJBmqmj2aKVqSNEovZeM3OhPj91UzlstuHfCGxutbNHHO8xCbKjTi+OpjTDCfq8LiWflk
HcGbvnXn81aV8spyYhlqJlJV3TmNnJAFMQl3CAWekm9u2AWUY7YiodBfx+dO/z7juq4DdYHS3g9l
Knjgnqu94CAMW+WocB5rxlvZYbWj49r+QkO/X5u+7PNyfZz8M7xb4/npPq6p+7y9A6aTNf4damR1
grc93TOXLFwrBIadj/cNic7ZpUa82DMyajGDY6Qk3A1VHR91UGyPhKb/1wYYke2OaGtUWhEz2tMZ
Zs9ablmPE0vmgKa/jhBXis8fFlVDMP3KmBqEZ5eI2sn6h4QRnhf2jozWxu5PCY6BsH5lfAyFtFeI
DGTuRH27EhVf5RMeM5Z5velsRwR2zuyGhhupE8VW73tm6uygsdqCv3e3xzabBovmG+kuejx6ZUz4
+Dr5vLVz3o/5nvs8/NhmgfPR8XblrSOcOixuNkTXo3sbY7tPO6pDO0g2KlCXFCoF1BHcaZ80uwfM
ptxrZPNjnoYsiP33Q55cqmOhLkTU8J2Jo3vG41ZBoqtC0wWmlGHfZzozQhzFhhb37lWRWtf1FYqG
oE02nQqGdXQmMnzWdYatzKduJ8e1vjvj2urxLrqBgvowlr7s3gyrFru7J0OPAiejwdu/kqSqZthc
Bu68duDRWhyGssGEIANZKV5e5ulcqeJMv2bRnJEphiYL9TWyHDMCf3OdrVg3zvCKB/+qrn5pdtVN
LcGozkePdDPr9WLxfGIHt329qjG9rNvmPBHtOg42VSkbCY6X69RcU0+drbnzTLFw9ChKPgzYeJlv
evWxdbw9G+98RUjfNNsCmkQOBLxhYHvd+DayqqfIc9ac9dvTvn5PYMmN2ytJq8baXmnojfehprn2
601zjWxjzHEMFQ7xbnNDtA6wXVMm0a4THwf6IdYfBr20tSE8Euim7OMHiDg66POfDboJeT/EvUJB
vXrCrrI4mlmlURtC/3AnyobZDxYHIqM6Cwrr1OuGgVQH89+EtFENOiLqRYlKvZ+qQSwg9lcXoa8W
71suVKf3imKMEOvd8knjrdYCd2plZjQj4CBGjsZEyphXR+3r8OauPXZ1/kfhB1BLAwQUAAAACAAl
UqtG4U74cPgHAABfHQAAEwAAAGZ1bl9wdHJfaW50ZXJmYWNlLmjVWcmu0zAU3fMVBgS0DC3DrkwC
BIIFCEERC4SQm9xSQ2KH2HmlIPh2zrWdOMkr8/w2bWP73HPn67zjaq1zWos7Tx68eLh89OLeg+Xt
R3du3Lr94u6R41hQmvauHZnPxbrRLypXC2WFFAeyaEi4XUViq9xGKGeF0cVOWFko0k5I52q1ahyJ
FSn90m9wsn5JbsZgyw3Fn4zn8AvwmVNGi4l1UueyMJrOirJxclWQECWVK6rPisxo69pfQErnzOoV
ZW5eyHKVy7PC1EI3RQHGUwG8sAxpmuEz0N6QFrKqCpWxBM/qiS7UaxLW5YtF4gOklTHWpWdTkRXS
2r5JcrLqpaZcOCM28oAG1CqjtKNaBHQqpXYqs7PuvG2qytSwEL1pYD+3E6aiWvJZC6Iq2wBuRCs3
ZIU2bja0JRQ8MK/B40DJiGLqyXQm7vFz9oTsOTM4T7aW6mA8ssDpUjlH+axDuiqyjdQvIdp1UhnP
rPlBC8sGj34dRIV3pwOJpB/2SCcyqcXK2wzP16YuoQDWZAvI3uHV2619MlNWslbW6M6K1isTOVmP
GwwPlzATkCgphgGwukhgsp2rIjAFT8C2WzPCz9V6TTWUSdr7PLBiombUBmyM0A6XhYTYHa9MAVsU
rVxGa/Q3CB+Fsx2gtBBdqtFhu4mabFOwr7HbVpSptSJ4bd3zrFfMU09mSxIhKNl11YATqodPFreJ
ATFW1rK4A1U70GGwyYoy2VgSt86cEUyiC2sRKO0YJVJlzMSffyUkltBPNTttQ+bOsD5wNocSMWXt
ohqrHTvngHSsQETiPu0YRlRIdMqxA2Cx7E28RdaOdLABlcheWe+iCMgWT3116RWI4Py6yZBO3pcM
J8fVC2UybQQ1/Kh20ZaH9oIFP9eMhJIikZW+zBZqTU6VhAA6fMrHCbYcwG9GFIYLggXUruXKaDX5
KMs84EzcwIbWBy7F5FCndW3KNhySVKD1BbNnhykWjE1vZVkhay5MRRsRKQq9iwCUoj8F4Wdsw66F
/nfNlg5C16h2vvb1tOxCLanBlZC2YzBvR14oECU1SWjbwnilfG3e9LIhEvcegmqOgqO8Yz5DGACm
Kfw2b7JavVRaFp2cl0aYxmeAhS7UBbepxynWGU2F3K7a8gej1vydtG3qvn0HHo/NXeU95WVqLAMj
tmr68pZKRCi9OkQXZNJbZZ091FSiDh3YRlo2Y1GYrfdIMF96Uu36rXPpRXdaJ+lt+IfMDonh87ff
oGL/PucZaYLaFlWl2GEb1LPQsqAetzbeQpmrjLVqFTfr3RwEB9gpOM9FJ8guRPJgsxBT8dFYiRSY
SBNoqyqEHFBjcATjaLIc/KMG6VHfNGQ9XKlebhwSChmOiWABJslzGwQyrCvXdF08oizoIF0/P7by
8FjztZlG2BBsUtstcd2LpENaADAthrhMdBfiGJtqLGHI9RgGGfYyiFVIKx46PYji8lGiNPihYpxk
XBYDnIXUmU+bbsocjGqjWXTrk1JTMMCKOxFk1NA1gMhD2WfqPUOpL/iQ6P3oDqN6PZHuPCntdLap
jVbvUobcDtXRiguLMXLX2X07aQCH5iauimfPJ1PxXsxPz2az03Px4XK3nl/Acilf0wtATbB72lu7
iLX8wmUxn3O+pcIYtOJOWLsJ7+JtU94ni63cWYFd8GuBnshG2XMY+yf+QJhPe6Np2Pg5fORi1t/d
ttKkOeLUZ0ucTHMv7OJhJZMAmODoVezxAnzJ73I2Rk4cERi6Lfkc2e3BoI/gr62tgM2ZwiE4lHSV
d33FVOns2OMXFzHCvu74oWNPPjYlvfBlbrGw/B04vHJWnLTd0vf7/tsU+nd8/1122KNj/0a0TQ3e
mnZ8gXRqJxOmO9+i4c0uTP9cjFxa+PKnsnhhNOvOPqHNpPG5Rs0LdsyNPsX3rjqMiQzY/zMH4Hbg
bzIrQuFXxhdzlROXeeh9jlNkNvQNdxEkyoXz58+P8UJDNrqzYD/jGOpzBWpcyL4tYsW50Fvbdw7x
9nRh5osz1ieKp0icP38ZH1eYM76dOaMgLHDnm9Ak2uuE8GF5Pi76vxDU8ecHQYWlwerF3mr4HDvc
r2PxCF8gCu4NV3hs1bCOv7U8hr+lw6x27cjgdcPlvScekTsr2l8wlrhRv7Sjk1ewacLPsT69duT9
kapZIW4WR4Rot0BbbehtRpWDnN5z//Yhvid44ca75nOfhjlBHkaabrUb582ah2tZ136W4x4abzCm
QtSG3pfvwF1lEQ95anCn4vEvRDaHmB8G0Rn7zKCUmJzm+jjtlJv+PVp7fLO8dojvcrE4XZLbmDyR
PiuWp2N5/y/5hww8Gz5+QJdDlPeSDVjfR3kp1h2LTvD169fFY1QJf6eJhSLN3jVqqKrp81RmEe5m
w6fEPfSi8K6pqqFik5OfOlmxteH2jUwez6n2ep+kN1v766SoN/Zzudju2bvp41cy+WR6mfctSf1P
2qqnw7ebrXfoyxakt9xNlYv7w/vfop1WRptT7PWL752tL7+8gdMl9clJWOE9Ep8BE1AfvquqK13g
Vb2nlZSKpthf7E+KYmPPHhH7/75wcGShn6Z59P+g+TPWHGbVLyT1M7b7baSujsvIv+C+o/8Iqb24
3XTbji5Vb3D5Bili+ZMSuXknoWnw+CvCvQfYP9/05zd/me6ypeOvCUn6kunx7WDKss5d86MIn5qk
2yLIpVp9FmRPT7t/I7K446Rx10Mr2/tv0k9QSwMEFAAAAAgAwpmsRqBfGD/OBAAAxx8AABEAAAB0
ZXN0X2RlbGVnYXRlLmNwcO1ZWY/TMBB+769wi4QScTY2PDQNEkc5xCVBES9IUUjcbUSaVImzgBD/
nbHjxjldlwXElZfdeGY+j+cbT8b1pYhu4pSi9er12l8/frVaTSaX4jRMyoiiZZwVLKfB7g4f3KBK
N7KE8ssXK1upzh7QhJ4FjF7fziZlEadnKA12tNgHIUUlixN3cphqF3ygfiTV0Zv1k2f+87tPV/6D
1bPVo7vrVa1Y6xywJ5do0nVj/fZl041Nmfp7ljtjbjhuB0QtfAAGcxg1Ss9pysaQsUAuuJN5nuVo
tisLJqdBjBZsBpI0ijfDAVZjYVAUNGcQc5CVIUMPswx9mSCE4pQJpIepxf8NbBjkEvHklJV5igJ0
Bc1dPvZ10ra5n6UFk4Yo5C8j5kSaf3VrF+4F+WkuOBdz4VbDBWX+KMneB8lhYjBrTwlGMGGYQPzQ
4/hs6xdhllPQ25fvkzhccP0bNwJUvSLBJowJ9hYL8bo8z+KIT2DfQSn9yFFec5AVF7piNQrZsqXj
i75uLbvalz1Jz7MPNLd6gutnlPmxlNoKYaumvFkFXAWXO4yK8v0uZpWKCI/4r8UNpLwlRtGdBp7N
5YdHDSOvQnBr4fgqGmAH9a/SvX0en8O2rQMv35FcItrANmFbeoyJxUIa+Ozzno564tbJplxyRQZx
KJFCPtj6SsrhW3AyqQoWLRZhVjK0XKIZKAhEdAjNDIZbZkLtXTqD2ap03QVxajXB9jkMb6zZtWMP
oNhiIWLXb7KMx1Rsv/eBWKFiNChZhqI58qqKCiXLugxGi0W1Wa6iy2Bec1IVFSua2y5wgbI9zQOW
AWyWJeBqVwtNPZSWSQJFsAsx5WJPibtyOc4RYLaucS32hBjk3amlxIWxpqee13dDztFe0tTrIlpz
m4M6oNdUrJatQukgjiawwmz/mRcoUf5AtYMokLge/bSHUhKzbjy7+vpwOqbhdPThdGpjNXMlOBrN
aG6q6JjzA8uWXhkRaaBYIc77ilITFOpItlUssQ+lyGe9QPKl6yntx0HP6fQ4p56W0zooA7tzkKvp
QGTrxOgotjTrwJpAygQwgDTLKJUoelpVlYNy2KhyUBg7dpbYuXX/eBnl28Ie2MKDz4lJ8Os29r+e
BDWkLOcYFDXVHEPKyDZ+CR/fqpU4RFWY1glytDbwqdAPSBesrxnYtGZgfc3AA+mCK0MTInAFcpRb
bJ6BMLsRt9g8AyvI/qegnQVkMAs69PcJJ7Z7MaaJnmliyjTRM00GmCbmtBBDWog5LRXk3ABSLM8k
H6vZydF8JOYpTvQpDgto9BGDnRIZaotrRwf7kbGOa7wdqk7Bp3T94oT9L7f+I73/Ldv9Va3/79Mi
/ISPr+kxgVNkCHnygeJ/+29c4P+Ozg8UtD9y/G///4Ek6Lb/TreiH88W3ccR4P4Y5j1z5qeGzHvm
zJt9eH8i87eOH/wU/c2bgx7p+DTSsZ50bEo61pOOR7c7NmEI8uOE45sR6dh4uxt76ZzkpVG2Y8M6
d+Gj8MC59VCUbutzk5jnJjktN4k+N4lpbhJ9bpKRnxaUYT98RB1klLR1LcIDUaAoSyncf4D2Re5N
HqtbrG0hhuDv9d6lEbrSYqJ/OWTXtq3bNdgvQ8N4eNixNR5c+z4PeKAbV583+a3TN1BLAwQUAAAA
CAAvmqxGRm8BtBr1AgC8JAMAHAAAAEEgU21hcnQgRnVuY3Rpb24gUG9pbnRlci5wZGbEvAVYnMuS
P4wHdw8yuDPM4O7uTnAb3CFocLegwSFIggaCe3CCheDuFoJDcP+T5N7dc+65u3t3n/t8H/PMdPfb
3VX1q7fenuqqHmhUJKRYQKycaMg0dU9/aMggABvA0dQGDVlAAKjh5QQBipu4mdg5WgJVTCwhrgDw
U7caUMHEwZIe4sCiqc4AAKq7ubw0c9NwgUDUHB3dAOxsv4YomrjYyjpYOD6R+VmFmAOehkGEnv7Q
kCEO5r9YgP+R1y8eQHHHlw5uAE6gvLW5qx6A/Sc5AIjnVwH+3QJz/i64fxYGgD/SZP9nNJ8+XCBP
NH9LrwZxdXzpYgZxfRoi5ejg9rMAAX6RBEqBAby/K+wA0E9dqAkJASU93aTV3UzcIE8jpdW5Ab/Y
PtV4ADx/G6Hi4mimDnHTAz6pE6gB8XQDyto/8RX7XYj/LmR/SgoUdXBwdHvCBeL6DexvGICKEHNr
EzFHTz3ATwVygcAAbl7w03XxJwmfZHcFcPzm6uL40unv2H41gOpADRcTB1ennxjNvIDi6kAJiLu1
GURNWuyJn4aJqevTkN936bceXAFsf1QZxx9UJmVt5wZxAUrZPaGVgJg5mkOAChAHSzcrAAc3F/jn
LFc3F4iJPRqyZ1a2nl7cwudEP+7Vx9G48flCWfdTfPOafuf9DwT968YbwadOFlWrVsVY3MSyFCXp
Xx5uykstkgxw5U3RUWETC2+0DFI/spYLPWj6Pt73GQn53suGCt/lPvyYoDtPdXRceXWHXUKvvVLv
uCLBGOKfEEWFI6ELMSHZrLq5gJMQfswo6bs4yFQRHG9ofbw4XeBmRBXLMj6Nm4qzuV/ZXfBv9T0l
ov08EE60ISCD4y91RSR9x4g2aq1SyXJndq7Bld0okoLg3LnTLlPbhJQYM5GDsYdxYlMzXVZhSFe2
cSNezScTbW0Gk32M9MA4RssnQ/ucf9q2hs9NkyqWoTo3LebkMl/o8Ycsw5EQlfvbqqBbFLSWcWb0
rtlijuggnoOiO+/vGRvdXtnlXEs3wYZTxzueafuRhdGFE5IdgQJbEwZLJgJvGqMZltBNvn05U/fz
vkTnLiSbVrU7emczdQPL5khKdAsrA6eyv7ouR+39uV1rz/S93I34Quf2D6g7P5HEb9Cs2sl58eav
D1axpLTCSxkud+HIR9hkg8mtDtxJJcts+Jb6gN7fPJ3Jnql+pn0UmhzYJi8M3vbE2baOp3tlWXuF
Q0YwaTqG74b7bGcLv415Puh1NSCHTXoyrhixesC9wTLZy3ilsCzQi8EXIac5uhzDid0g1IO2TJIk
zW4NHzmYscdKFab0QqObUZX+NQcfamIJSVStNdvaAH/kpETxFzKW+WGe1/2obTgeZshqHP6EsVYj
RS+b+ToTInzRwNVlCSX01btEL/S5zvl2Y4nkHJjK192ArFIvc5oqrztVdeBot4Lfh1JifqDcri3O
++h5RNdMbk1dyfeaoCK/c0HB6kgLu6ppMbERSfxy2N2IbLQw+ZaKD7NafsqnVngcN1QT4v+azrL2
e7dgdZ4oli9QlxEnv8EsCVVKiSQZV5T4RNSHLcNbP8VuU/qOa1nIIYQaUMWIsvAOKPPYPoWgHMtN
X6VQBCDFyVkqpzHF7LFzqRB5pxhE/YIWk28omG2jVphxJYjy+Qemk02/7I/Hq80NmtLUde7I6Pqc
yCPLhwjaIYz1dM9c/ddwCzPwd3K/c1czqB4P+ei4GzGkMejZq2bOBRVYeHx/78wLz43eQjtF5AAp
49vGUM3VnZVp3jV0zjf8ZD4Wk5QM17Pw/AXaPHQ5C0wp4dgSj4ov1AL+N1W5wlLcPjwKojNnfceF
h5CJaT6pV72E3iEJyk4OzXq0TWR0MHMvcUU7546vL9l3eNbrO/VLYq1qNgKOIi6ON1MOh10WjhTS
4Dy76bAMJPJgcdjHX+ThhtE5Y2/qUw7ALMWvvut3nvL7FMmesZ4wpmkumnZj5kunIxhhSIVRu9Zt
FWL+PJ8HmbJNcoysj9gXvuDexbDo63ne9XNJKxvYVX8q7ykeuKLskxKkYqGCK0wZwSxZDZ/Tlfiq
qpwbu873oS0eVlhiIxNMMHL+yVd7AG1jQWr0XVzKlCBHeO3FeMs+POsgJmMbvmZ8a/VJsseKUUIr
W2T0uETMYPPNnS940WrkoYFfr3OOUfuN1UbqpaTs5XZUEF55macgRYKg6NWU5K1+aAReKlOIzU7i
LaduwuPM2lc5VcFxjCngt+wsZmsF0bCS4Ja/JSmd1w4uK0PPd/lMAUMh1Gt849MQdCxF/BazC7Ih
WS6Pms8r5ZNsNYH5Zo5OEnZKN8YcVuimWAkyI42ZqBkLDQ11Y5oUaUU9zRdBxySPTzctq2I+hE4O
K8AJX3SPZ9D0cq/OTdQ50eRVsx2acUY6SS2CmdgF5UH3zOsYFBth4oby2N7RV28xRNQpgRtTiPT0
HfWAEo24N73NuEQFn0IqZ3uJy78LKCTGT98s2Lx1QlVk3fZQqACGDMWpNKa35VFbh/U71xIRQBeX
DtyUwqbfvh5HGqkd8o4rcjO2f80JDCC2XAU4VZNLssfRO4SvTihUysWuH/un+VTuLx+pPmuwXNw4
q6X88RXqyNZPF+vU2J1yrXZoHYxTaFU4KyMriyoRpdpmJ41A2RuT5Nc70fD1KAVDG7MERDSP6n/W
1EDUFcDRW/w2FjMuK3SzDJ+UaoL6WMhe/Dp8OnphJ5E/fA3SB+VpCp5JQ0xSMISB4s2KuXESF+1I
JIAl0A+RZ7v7lB+BMRwSzq/y7pEQXVWQoji3XcVTtl32S0w3TwRO26ZPqLwcPkllxLczl+l0U3up
lrlUlh/6UvZIUNExGGJ4HzsnOTNJSbKS1YUwQzCuu9BseFpz7EZxgsXc1wAiU8G77tNCOuoK9dHG
A8Hz2N7M/K0faqxi0Eo2GvlE62Rwjm2ohR3VFEvX0fa6uZwDet0fGCRxoJvf9H9p6Wfae59+BOfk
h32u/mCgI9jHvBDifskYlIZZ9G0y3Cxcm1r6OVLVIvm4acjry7PjJQ/bwVbzMliapagp0U8Fo8O5
S7DpldSXOvnxnHCVfvnXxI+0KYodyXhZF4ztw+MCbZ08HfDJRvyhq7DqksNzvCIM0/Js02bdHlxk
w/rmK5Zl/Wap39GoyLYKXs4PIjXCjBHo5R6QtcE23C9RP7oKHs0Vyc9KzLg4roVcZLOorB7yt84I
FUkVNSOcc3qOsZ1uV9vo9bwLrYt4FlBDxH8ViylvNis4dxbxyhvT+h4aJjlCTe3jIEUmC41+hxiF
HSg1UiJEhKwNcbIdoxeqR2WKvevtN4QUdq9N68SNghhUj+mbMnXx63kfhxeiUq6I9XrV76ZiKO+8
GTGCWalzWGPeT8A5NzSw3Pqcfhe6nxlpnHrUl94ZXAVjVVJ0YvRyfpLfnu7KD/hmK3ghOWdrggZX
Y9LJ6zFMlB9zW9uAM2wd6Iz8vNaV7Vaiwsao7oDM8Rue0seLrW/cY+S24vWRw1rX143atk4oI3yN
zJlVuy8FxwrRaAPwq7q/o7IIFbw3nysUMEIQPNXkCX6zmzxc1Ypp5TJIVYk2SSp3UIgLbYyI/waD
t3EhdzTMskza62U1qrOEGv2X7G1G1GodzqkF7gX/9BnpjrE8stATOfwusTRJgejj12r+P4Q7a2QI
0myPn300lOm+nFiMr+TrWZL1q7qpdeD7xmTavPp8s8vCRENo7sP3AZGR2rVa89bqhXqmzCo6VdH+
VIO1rINmj3F2/M7bcdnrW87nKSNzbBFKo2GKPd8K0SYY5tgevweuW3sjnfSkTZpQGfAJbzvHKspO
2hvNJe1hVBm6mxD38MjzsKzmJ0IloB2WrI6VIYaGbfkVH2SFdRnL+k0289CkaCtkxFcdp+ql2HW+
AhJcQQZSVA0RXgRhwtKGsNF9sufvmDujsHHk/5bErnFBXJA9DUul8yNjmrKHUjSHUulC61O+Da9x
RchElOS6mJnEkBWWkdyJoxjyqrrRqsrX48wltnOVyWzuFjUGV3rRpOiGDu+JqDxiqXXwLetkuw5x
aTqP1JZ7pCr0o0mkv9itBheXUbi1PKgNsQqu97NsrKmqRBOLlI+QXYRtZchBamI5O4R5zrhElrna
VyPmQscMq5QK8xXLuxgKkn4qoQu6SHxMX10nXTeCg88XSwH52WETpDPapuQLDn20zct57mMu9PCv
m2Uq+R1NXz5sT5po4ccaWLg+bJHVfMXF99Y06GEHUi+S4jFpLNUNpj/Lsnq06WY9w8asCpAKuA/l
CVVrUvRtr99is7WdFCwlVuLDF7MSS66uzvvGRvKqQDqQdEcqDqbgvr6mXK6WVx8DPcYER3KiiVz/
vgm1EYGQd3GBdAu/VtvJ4xNzsyPEqysnhL26hunoUlxLN6FJpiib6QjpNbqgITq5eY0961FvCkxs
4LOF4kW/eNMWxoLss4+raK+zSSbNRO+ZkmkWch9zK1Kb3NMuo16bDlVofISftYK2n1ksxzNb2p8s
FTLGxvtYAjO92PzcKd2aA79PXVz0Zkhp8EXgIyJdtx3vfe4gzo1YvNuquLWZwdhzYrlxrwn9smXV
gzdjD2gj0kz3YWQQuzaJ+njxlrWpQy1W59Hi24JbBfUvaO2t0w+sn+E+Smp82gLEnKvUnW80e6Sl
CQuWtgHeRkIUYfn0mTeiB4rNW2KmpVxiLt6yWFmrA9ad4FkCuVCqX4m11J6CYeJhnIHPmSwl2RUw
2HVr6yzOM+tKWGg9cqZhB6FCRLXx3l9UYHYQTSsETWHve7KVrczUC5vOR7mSUiZVvZqbei4bXimr
KD30tahTeztjop7UpJrGdNk2BGoF5u62IbucIDFcVJTmVAHM3FDOpzpK7KPUunt/qqJD3ftKRaOf
OkJHd8J9F6VJfCuvCRaCPKk9P1tzmtMeK2j1Xscpj9ayHqmJxwwzmm1+bCm6qQzOXuC5OQvoJMzr
QY13SOTNrOCDlbX0IfHI2+YLRQyZuPUzc0taIy4JMic91hZzBkH8Byb7iMQCc1OVaWvBICqNxia/
BKgpSo8e54+nZsj7tlkxCefsXfrIBVvlwQmuxyS+14JeSoR9Ft0UB3vBzOZxmpo9L3JDlCvWcpns
+TwxSzZ0MRQ2lwqXKvZvmE8DE79c5pegT0QXRF7MTOcTlRv48+szXr+K1iXD1d5wGQQgTz8faKGt
VPDcCmI9+dGbhI4E7JOMkVTi37a0BXTWB307smeO0JzTDqF43kObvMbzxkkP7e7jAec53tJQA/kp
QylcMF49q+6x6Mtow+EPSp8ChMY5vW/CKPid3uCacVHWBXH2nBWzfucapHt2DdSLh7e1fzteOTxI
iWUalTwmZ+9AO0koBdZ14YQ648LlUAhYe3Uk9dZtfSkvebnRhMzUaXteNlE+/FmxzIoOTtSzIGY4
YgVqWux+FscGzYmybRZ+HDqkQoXZdZedgOY3hOUok5Ts7lzTgSyIX+GJTkGwkW8Wc19/glVtdolF
rpAvrEmIacs64CtQ9yZzQhoNg3rmbIlg2rbSnfjVTeGjOuqdrN8sZf4aAgA5y7y2wgNlhMOUShn9
dXHagHGP3iTteP+zkN3JH5yGwuqlizRJdjOxOLYuRm46g+iKcqxv8p3ccGUGSNTIj/PN6FSx0rIm
/Fp2hMySEAYkBFttxiAVl/m6cInUXWvJhq2VnPOnbQWYWGaJWqrPDHxKuc5TFleCSxs2xUaTTVR4
JE4FX20taeFsgHxdE4YuWONAlnuOiofX4LSsY1ngkbcniUmDRCONUd1XzG7ly0+zL1GhVSjDgtYy
kQupYlg+m2b0GrWMrSktc3xhArEjTaDzdnn4Lhc78LnEqxk5oQZWMlzVb3rwwNcrs823TH1ieZbI
8cr72V5bd68q4SQs7VTIB3vbA0oZVDxJXyvJPKIlRJn0y2lx7I2hGT5T/pCWUPrO4mEyE6y3lMcp
ROR04kqxeDxSTPopyVm53F5D+OzT7Le1fqTQ+uLk+/WYm/olaD2hras0htGWUXqCjlX42COfWAhX
RA0LY/u5Xys+2sRdGv2YTNYh68aGa8SrP657Zr2qRXhw1olJ6M6I25646pDmIqj+6KONIYmUOuwM
HVA+mUv9sL4sGJ9XdgzDRu7OuICPuikY9Vg2i068DtsvSQdO+PzVT2pI/XPlzVLpu+l7VXG7lppQ
zOH9oeWdTxbLLcpM6sqwbVUzFj4+Xq9Nb5zQxQ/aF3iwzh9Fwj5Sr6agex3FOuovVPAmhZKJq+7N
PD1z+4JCUQxXFZIrmOIBpM66De9RUPmZWgcdPhdu0t4PEkp0I/HJbRf5Vly5DZSUrLU7kw6cz5T9
wKNfWNstpyWmdPoo+zk10TYM4S0cm65b5ua0fCoKgGO51FdR58Ou532FKVLeg0pCkx9j+CLme1Va
cyNhs6/2MQP2VpWWM6Y4/AcRAvsGqCew2PIB9Eg7vH2U9Y0L4A2fmkIx1N3auHcQY8WAVhXhxGKo
wG0EUHzyRhbSDbl5hSP/HJf0pcgx5cFYilknruDl+msRWDuZ2YFNFXZ44rfjLaJ2EOI34ZUXJp56
nRxRXn7PpRIkCcUD9RowtzuP0S32fYa0psipn4nDvPM3Qth/3e9d4bMvHdGbn32cmOQXGxM4wHRg
4dzlThOeCiqE8lWrDT53lw/AbKHLl4ULvq/1jNa0RenJeYP1AcAlQ2AX24mPdvIKiJWQgLp2Nrdj
l1lwNblgoIH7LNTV4qvxBXDp87w57yEq55rcNW2mAkOqN0cpR0Hd9d71YfCXj3doDqX+7G4ALF/V
u8BrhTASy0t7N+OCucDr8F14/5W4o7fcBc70J0tcpTw0OGFnWyhVyPIe69EdzNK1DRHAWSUCpavx
QzkedXYLfzYs0pUQLPie5916xS4ynpX5wMFRatqe5ntyCfUXR1PbAx1JGuJswged2VvnMeJ2HtKp
JUvK+gU6YnkPYo9slI0yaJ+LhUok5c+pCqlLynw+6vxIV1jYSMiDJXNz0OTfHP+QH9nG2N2Gal0Q
sv9I/kMx7+JXZOvvYaq/B7k4/zEu+DPyB1R/aer2s6Hh8hLy66qSif1TFwgoZuIK+TVCVExcQlKS
SdzEztrUxRoo6WDmaG7tYAnUtnYQdXC1/o/2z8ESEFczF2snN0cXANfvIKK1i6ubuJWJC4AdDFQw
+VsdBOZ6mm7uZuUKALNx/o4g/qegXP9M0P+k/Kv5S8p/kEzKzsTS9ScfWbenK2aiDpZ2EAAbUNTV
7Gfkk5uTDfiTyM86C/ipIW7iJAOxtrT63SXqbvlLIgAnGARUNPH83QBxc7D/4qf9eyQHGxtQ52+z
ftJQd4PYaz1N+TVG7FfskoWTjf0XgyeUHGw/aRsAfnVLWdtBwE942f8RL/c/4v2PaCtQTBGo5Ohi
b2IHNDMBgP44iedfmSQu+udJvP8bEwD/VybALOZoZ/4v2wGI7b81BNB/GgLXPyrm19T/gyX8FvDf
ZA7sXH80B07eP5oD9z83B/Y/mQOI9781B+6/oP5LAuLPd+npg+1/fjplzZ+QWbt5scj8Daa5yRNP
x5+hb9DvJICGo6aD9c/49pMQ4L8I8R+ZCT0AiP13gP4PvX/MMfxXovxdYHFZiZ/dP+UG/wHP02UN
R2lZCUUTp/8QFiih/WQvT0p96lT3cn3S5s8ECgD0O/D/j4b1O1+h/SQ+x1/E/2NEX9nFHOLypBP6
v7NhAADVIJbWTwukF73o0wTIzxzOSycnO4j9T3P4U2oA9E+Xzf/ZBv9d5vf/+WoE+uPy+/d7qGDt
YPukMzM3PQAYBGblBf9MhrBycALAHFysPE8tXhArD+8TaTH1p1naP1UIlAJwAEX/rjRRMzdrRweg
OlBTTfbnm97Kzc2JDwj08PBgdXSCOLC4upmzOrpYAm3czEBAVzMwGOhh+YTd3NHMFehk4gRxcQWC
2UAcQAcOECcvq5O5BcPPVNIfczp/XupA3P89DBAPD+vTVw8HF4iVDQQAs3Ow8oD+Bur/CMPU0dHV
7ReGJ6GBT0bgCgQZcfIYsf1qW7nZ2wEtXjr8JmBh4sz688pfQYD/BOIvq/z/LZf3f8vPgX+t3E83
/HcBBvyLaTrQ7/zhvydPx/4nffzxC+y/TtSxc3Bx/DlRN6y757jBhf3Y1vGAYSeM6+5j0hNuuIPS
EIfLmxtuuue4ZJpXtyXRUL8h96NwZ+3hMpMoMZE+M4pAcJE0ygLHR+arjx87dctdpO/p8FYc0NGw
6nvL0Wy0NnAuuvfUMnUmCKmTahh/b3sELnpVuFNtgKrkBfGWgOys6e3dix6Hkz6Mkbf34Ja2t0b9
L4a/UWbYbxN4a331h0S3C/pfEHP1KC5xUarp03Xb+4FQlkemPoSgGWeem1RY8l/5RC7U4e2TTqzY
5YzM57dlbzwc23Y7QaaqS0Xl3Ge7uT9kF7HrwrQbFM+ROqBO7o+uPsx9CAWqz5ctdvLx8kNJGoyP
HRjIUl/EcwFC5XBy6I2Q8d8NN0WMvBuGU1Z7W88640ohwr31+kyVuARlM8s3y4i6xlQduoapDIBN
Wncd5yJL6az/FV+JQFI+Ucs1z0IxAsv2gHpG3zwlwYY7zpL8xI5vXTyUVpSzCmaqRWj18ujCXhFf
BI22uBOlL6XOpMqMLDr3AApHDaVC7W0kZrcaU86WkL2Pdm48/cf8moRn9TuLkQr6Sdu57HevzTUn
iI1KidWS9Cy45pKS3JUM64rn63s+qtwLdGThJ5adbo6KnSrc1HKRhXDNf2Iing6wsqmfWw2nHoH9
npDwif+E2PSQAaWIKMcSndH9a5zxIxqZU1y+IFvl5g8yA/u4Z0KJipnYQjSco9X1XRv94s+/4hv7
VQoyjl/1gq02edbAF9fFh9m9Uuho/vDcaqo9rmuOuDHsX8QGi0IBajWcUm+c521QDPeDyqWkgybj
0alZ+/219u+pBnboMkU5mLklzV4xmp8KrKmuu7piPWk4ZVuWSDpomwoH485rHojd+4aMmTGVRm6Z
QzI2aj5XLIYq4G7VBx5eRlwWBq8GSSuAY/3kewAmO6WmwKDvfAVfK6ygmUh9oc3ogKLefgrtm4I+
YwvHMZJbH1Myg9qSZdi1bwlXkvnSlYzm7/vkk+RFwR/dMA38v5MJbn6Xcck05pri296R2cwNNOvt
9Zofc/6CszORkbxZrY2li8Sa8NYLMZlakA+uJi5nivpsl0F6nGHQgd1FW1u0KJ7m0Aplg9dixCX0
9RRNbFQ1+paQFMRHhTNNtoUVdl5l6SX5GcNCiKMeCxMcIvwWjSvjCyfC5sBXeWasLkYpxg6ilGsT
rOWErAxHg4Um6IUfZOfh7niNodMB5j+43gksTncGFdAQsfQAfe435D8jXCmjHq/MBiRegDOZDxWc
7i2Cy+wUKiTuvdmGJ/v0Rll36w6CYhPNxl5BwaaUMQWvEKt06JOGa/top/ZGdVUxTNMwXy/nRXIj
LBjX7gbeI+LWbUTY78WXuIQ6DSWxWWkpjFPNh+fvZFfaBQAT08a3oii+hvRYifRLw0adms1odVJl
Q+fjDgWzt2pyeFUEknEuxEMLJReyFTg0nFawAtGSNr0QCKjcyULIxjgjAMxQffuB/besuBhg6OmQ
kReY6TQZfYNF9sjmFgs773KtRI4N9gMSFkHjzT+OFGK8aXPoSI+R2W+2jwsyZAZUXrwbmcJc9b7i
SiNm0MRooLdjBmKhS3bHp3E4Z6GQWSbRciHkBYziYiT3tEk3j/Cew3BTmFPnwo5V+ctUros1j6i/
dYdspIweOYRyjlCbJTLHLFPlxCiREsYzS5EFLMDoficxncFHULiYL5hAzMwOeWHIlrBub9t4FBU4
RsNs7fTslqJI11VxNtcC7WUqtVFVk8eqMC4MiDpoUyCbj0p8gv4zwKK/GWKf+44i/UgZY9X8bAa6
hLufY+ENjcsnsJaz4vFtYqWl4kqgi61GuSwaCURZ5CzIXn7SoRFH+Ifl87S8yVL4ZDLlTWPcgQh5
Lzl+QNpbWulhe3ypKj66eN7FScqCwPXkqQUcC3njslcRIS1+IxPV4iGUziB5RRhN+qC04YKJ5R/o
pB8Pm7N2MYwL9ENLm5Ix25tG+s05U5c5pMHfGZSVXU1pnLlM6u/SbaQUR5EgSIWIWCZdp9OGz6xx
mFPJDqBXqwXzxe4Pgp5Bf/siFe2P/I2ncyui5BbZ7pOtYqo/1tcN8KAX7V0dN4VuXmWGV+3CfRhq
2/vkmJ12zlX+OjXT+ANa3bFXblfvnKeaCpp5orz2Wx/DsIRuIl6lkLLRIiqjK0A+6uZdUroFznpX
mlVX2gNOvCw5ttqKUcQKRVcxZXMY/V/MMoOUEATmB0pFR5vf4iPYtoc0Z3s9Zz+zgrqKpvEc5qtF
Hc3HfADrYgnQxTnLfUdyyvfZ4slM6raoKd1ufr6iT5g7kRyxN7vrrO2W3qzrrtLyzsjOpox8eLLr
rPpszOUDqQXjEs4AxqnVdoojPsriRRgVzAvPl2lhor6p4gMnoypbO6UZVPCg+teCpP27BPgw6UJF
82pIfcxecGjT7vU67IxO5M7fdYSxMz7YqYsSvqY881hsW2wIee5mNBXGZtYh3d09Cuya3Cx55k1V
WouGJpdi+ElfMBb6ZWkVUZVf20sKvoOND7OjCt24eeIb3zA5AOgSDhVYaN598AUkGWQiwWQsPe58
iJ35NGXYzGVlW+FrV51X5fAG09xEscry2w2X6C4TrI74IvWNSHhi8OUSOW/7muXUYvjiLj6iAUi7
hCGusyEBTK+Ne73CregdqTTnn8Px6gamE7ule0bqlpGoRiG8ypmPcYFORxTqqoU58Wrtc66f4euk
9e/owbFGKlJVYQx+qJdkAyOsUWCianLzK2tXhXzg56trafKi5Fgn8XHUm+JfudSDRl72hhyFiTVq
9Mcw+XfnnjLhbEiHZ0pJBGRQyjGuEROt3U0tGCvOtVQhJnDpeug0twu1FHVSuoqaHZJ+bvooKs0+
g//NAhF7AcGfgY8kzqvIKugEl4mVrtY5RPCsqUMt+DD3bK5ZtaK88bsO4kNuSqibUg2r4zW1dNWW
zCqEWimFfVhDylOp+60Xgi/9mfXL67u5myGH+5Fb0xn7hCyUYrd3zsT2h0InpzfT9xdhDqL+1G5b
agu5cc1CX5KMyc/VZ+K8l8SDV865wQWBZ5zLjxyzo/NIEXMDN/LB4g5ZnTWpxyfaV8Ll3qFTzurL
+OWyQeoZisoxcKCSwqoiRNYdYsKHaxO7D4ay2TDQm4Uh0VBwUgJvzLrP+iyLUFEOsuSyTaAjbQWt
5wQEpnr0XghC5Ll3WufWR/ziVzUWVvz1CQhLdva3tI1MMi8HLQAq7Ev12Mzpk7URSscMkC91x1d3
uJpluINGg3ASjYM5KnVpaQ+lOhu4lq9WVmrLypgGQzuRAntTgaOS5NsniCifsklte2qy4+nSsAMa
RJ6TqRfFXHrwKBc4wz1EdDJfv4OelIWV4NlApV89EJj9wLSvizAklrIbkpeC6H2nIwQprjn9mIiU
mr9N3HyrEjnsuQ4MCKvP9bvOYghoOIxkCJC+LVGHcjzBUYeKu8Apglqen+lkEAmaPrfyBzYTdfiJ
13BhMmlsO9HnbD0gTBBwnMye5THSnGbROSicETfKWYlgfWik/By1V468ILA1F6EFF5gCY7WfYJgd
ahmq8Bkl+E5kVGK8CI3uXVtLwfqMR8aW47N95mBoFiePI0xvplEhsgHXQWa1Xp3aIBjVV+71wTcZ
1TpO9+bjQs/r+xXiXEQD+apHcrnuNVHFIhxlqdrvkJG9UGRf8w34Y0u0wyW0b5JkPgJ3SkkGHs9f
HpMFFj4G17x1OVb37JaFgm9v6SMBt4tBKfLm+O6JjNb7kEIOu5fT+YMaahSFeQL30ShDvZSr9s6V
sr8JZq4KKjUhV7E++3BZ/SqWDWbKdwcD+8L1Ge+oxy1X7vuUGxEhx+Zc43m5kklUnYwUWxiRseCy
w/ky68Hm0IxDVvFs45KX9B+uqTMnWjnxZT2tC0UjismOGYgGrKQQOG2+LKs5TBO6BX8eEODlfU/+
io6j2eUjxlB9Aaohojym0nW1ovK8sih3EYWkB+Y9aYYqVPGqLYnMS4T6mdf4zf4d1SYueIFKdrfN
CGMh5nzErJydTI303aJFff21PDgymNnSd+H72bPhYlcadHkWMy8bp/07Ww1uqhrGzILR1bkFA+yy
91ZFD22W/dsb3lm6Li20nwS89w+T7b7K65mw4Q/VzJ6nnGrfkqjrV9/ZhT0/Omrlb1ce0OEhPI3L
sLjCXa1DpWJ+Aza3SrITFpeveQNXMZ7UqXDSxEQe/2F+DYeBpCFlScTMfhmQrOGXny780RgD94iD
PlDj2YMK/j2VPDEgU3UdcO8/PcVasHFM9ZrnQjJLKzlHBdetwJrr9ZEJVyptpseurJ0UufB7OBbt
hs2044Tn5wjS1cjRSR5XtYgnIYjd2gbQereiLI9lsiR4OK09spUpXtiL8/2d0Zh2nR5nd8DkXXjt
LiPh8j5zsTi+7e2lL4XbXZ78SPxBJ2kPymipytDWEqvLQtq+07LHsZiNaz7q5p9n7jHNgrUbzb4v
8jV+31phP3EiPtW/fhV6XKmSUXFCSobP2+iHiT2ERIgwSEi5ak21tS1mCy1olnX3wjiq7bF3ROd9
P7MG/H6BibWCO6dnB94lgd/R8eecHO+5Tw9B26/G0ixXxbsO0cBBcSIi7zCRmoDjZ5JncBeBAkzB
Aff+wd7hzIpDnNBBUITmj+07P0aMlwPNpeevudWgn+f807A0+I9Bvn+yUefiZeXmBLDz8LLysAPY
n1o/gw8gDlZO0P9xn/5zp+jk4mjzRP2pbg8UdXGzNrODuAK5QZxsT7tbe1OIC4vU33bqLCqO1k/b
WhdXFhMHcxY3KwiLlImrG8TV7anD1dXa1A7y1y08x59O+IL+JXhcnKwgzqc9NjcrF8ffwP674YFA
bCBOoMYTBFl7p9/Ce/1CwyLOIgGxg1g+7aNd/4qG809owP89mp9RFRAPgJ39CRXoCQ6YlY3nb+D+
j3D+XcEhrj/B+Dedkf7fxVX+x8AJ+N95wJn7T4D/tRPOYA6efwicbOnaOy5IYT84dDyaBOYLjsfO
LBq0NSsFcLysYBjNl5lS1qJgw35zTDnEKvvWDPf+KDudpsRgriXRhQc3XNz4BYWHu2WO11tO/tt0
A/2s+6vdYQ9m75Mg39slpouDzavv+3XGYsf0FklbJwnGWHc4zEkCiaCh/KAihkx9cnLJfUG/u9Or
74w6IYyYayXIhZ0cd7QxsO4Iyl+7JniKZ0yw7/gVgjOPOZCEtEzw2a4y4BvyIoJLGVoqR4+IqS2O
/ciiZIR1u1ntCR4+0wqTkBvAuPavdiTGuOTQ0cprQ7NPVw+RG4EsZBhQGRo25aKT5ecc1fjQv4Ar
8svr7PU4DTwZRX9I0msAsOAvSN55fj3eQ0jHfH8TZhjcEzJM1DGOLXIahSWB1JGPiNdVjBSKysGM
CBlyiuNtlePkyMMUld7WaF+Bdm4qhX4lcWbC873Nzhq6ou/+/Md1OHhyZBlWtM5J5oPLgKSp/H6o
jjcg7FN16wqcCVHuLtEnKayhOHoTzu7wIX5jtBdZCFfHZUbxvrqanT/mXmmub9QL9vWeiXrOllWo
CtylsRxhfrfcZ4IzAMrdJhmX1dMUd3qSylBjaUeyhBAgbYlSsjRGPTOjQoHBGtDpoOnBwaf2xZ98
g8ZQJT5TqqffM819dSH0BXaaovNZLSOXqUbi/pcO1KxYzavHFZMt0rtkpjDHQmiH90GvSTxUgWtT
1Tal5yQrWt8revoF5x3PkVJdoBeha5RhiVB6oxc/d6CY70ODZT1NdJLZmG0Cb6gXUXvUhj9cAJBF
5pVFkM59XBA938VaHiDz50NBg/fsgI+R4Y86P6hXVjBJUEtCyhaXv5ixfYcwoWpebmHS6bIlcliN
rtSqJjNNukojiIIi3vDZxSQQdU8SmnG84tNPgnSy3x0Gqch2vqnkvTBN82ZLhifwIVKzoOHdUXIp
kfGcPvK8LoELrHDU1oyur9Dni4+iw1+7nh4smiiN38Endc1RgXKdHr8hxgvICKhcYSrat3G5Bwl+
N2+hpnHg5dmKeqY/PDBDR65yq2bbanOkRfrc5TSRk4a3j1JDS0x3EQCfcxEndFrJK8SQabM4iYdE
GVrlRr62Qb/VZegtDoFngzYMDpq4/EHKVlU624L847mTPAY0Zv871JptC49SQylfHKrIVeevlDmy
0xp90kNJ5fsrwNfUqVLwcDY6UEyYwF3ezwrhFyGbTRyRH4PUt3VZPjRNf3JEj9CRB7EwkvZcxXLF
F6GweGqqT+9x1uuqMohwIvTmIDpFnxFIw+Nb6hff87xx7sSxZREhlYVe2dYW1W7pB3yxSFeUwsW1
1OXCTbEKFC/FOdGq2IuG1vq4gP6FEFskNH3sOOaNYW/2RarxOxfkG/rpzcOAN5u8GWLkZ6Bvu7rK
lszsobGSWG1XMl8XtEETq7vcAAnBfIB/7kMYqkcXb7gHnWXaxuzbXHEPTSqKOxHWGp0fg5qem4P0
aLybiQslL75PZhGVd6nPQdB/EJVDNfFJffQyAvAPK4p9SplTaCJREjtWCv30hDKK1rHcnmK2R7SA
PUQzdkn9bqefek6s8Ys8NGx6eGBftsLmmDijJ8WNQUoyKjFXqNCHAjeVAmzT6hQrDdFh1g6XNKiJ
KOYR8ujwj+2FnoE0oSLBrlNS2J+mTDuBEUV08utZfXO0GtSblzFNGkmiAQMN/RHvDIPu0Hgf4ttG
bdskEmg02wCrp2PblAb8qnDOyBkWyWAuywPsyQkiGpUOSZvZULDtY6ToUKdojmBh3bwT5tjWBeVg
rntd3Dn4yNoCu3grcd2JJd1c4gedt3KdTQmO+zr6cBtbpIfz4Q5ZIv02+FZhVnFeMbyeYH+6yvCb
YLm4fo+A9rNuhwTrWYMgOcMe/E5WB0FJ7yzxTv/GBB1zCTFfvrPsTCkkFqE99iFXjUWxIGxwA3Yi
oXpT1TlrEzhOHxMh6t1Kbyi1xDn1vO6e8Ji6YE//g19e3WzDSqSZJ7vO5iUrg4vVQsO01qyUyFcd
4y6UKs13mLv1fojp0whDxEypeGiVYufFlvNnQkhaPfglZWlxmoFUZRLO9Czlpg8nlTZHVU/3Poex
5vulcqfACxZ8EEEwptHkEAWTprwcz0f/0CNh6EL2yq23IGLF5a/HM5lvO4rpjo9/HOyl5skEaaey
p1ZQZ0FDsl8mvzVRdo+iEnGOgDJiLqVBY2aia8CEsnQ8ntvEfiO/WOjnUBJd+fXEdU9WGhmmdnHo
43s6zuIYCwFvAkGEPLksb/vdj2fiX3AJJl8K2PGVc55hX0ONGhRL150aVX4nLaKGeMzkjhs1sqka
O0UOhxsRK1eoWIeUpy6HWmSjLkRwpC2ZirIsVqnJZpXrnPmxCvCKiNYQHhQRKfdoylGwPTZZLI/n
pmsJdPdujGYhHN/LLclVpaLtlr9kZGLxzLObvoPxhmkN+iyJHF7N+mQ1eOh7hdDgNwgszv1FedG8
qiJdeBf1ft8EBHOi1D4cnbNWEJePeEzrPhYvTgz3izlzzi7bCzd7c79uzSKiEnPJnB8JpjOXp5f+
0V1GEB0j8/k52iQNXjR87G74AC9nx5T99lkfLoDzcokmme6D/CzTctm2do4TE07kxF1wHmggJyjM
AdTce309elMwr12m0lJEBvuFr0C1YI36K5wPNbQk1IzgpYwnswKXu8mqLL7agQ90iYAo8TOUe9IF
UZkMcwnwskslZyEJcY6bXatmMaCQYyroPKBTniTWN0NbHPc9EetdbpLm6Y+K9/I5fsj6uwvvq63F
0C4Fa+i4OS4c5b4wnr5ejvVtcD7YayWUKWHkDmnuOrH3943EkaN/dWZsdVJZ2EQo+eh9SLzIIOos
cugTWCJApBB18uMIgJdursdILPUKz3fHMn0YthTqXW/neeu+DYoBsflEK37NUtRo08cwi35O00Tw
Zxmr42oURGVs/F5PLw9ETPw5dUPHTXMJC+Ks3NyN/GuOSYMV+VqhrGqTC9jogLPtdGcxssFQryvW
AcG5F5s+yzcMyvh4x/xKGOEj1Lcrzufe+nfXD7YRbXv1s+ryESEVo+ifl6hvM+9nViEEmDlBUj0D
TifemJi06W310KJltr7pr889Zh5VoRCD35e26e+j2Pgycd7Ndfa8+PhNg4v455KgvnmG9qUzKMPc
B74UyeaMZFLRP9zFNEPycs1CpaItPpzwG+MUhTzNtx1t9+ICsUeizFGigrL8y4eyruhEdHQooawE
tjhP/dnb27xzDT/P07TDIoDyAXV+SNkIYijt3OML+sWINhQP5boXiIYkZEiKpe28mA46c6FBRblD
Lq0nwrjwSbvtJPDc0oIUW0YpVBUv/vkm6y9Z7P+Vw/vv9nO5/o1+Ls+f/Fyuf8nPBfGA/uGXfFO6
Cw6LXJi+3Kv+xkaoDJXWJ7RyJbYA2aR8eBjcz22QaGOqoSq9hRcf8Ki9rNo/sSdr0XqkUg2wwTyT
JNXbRLVE33aRiSR9HFBSer3SdnOvnZKdU53a3mYKtLz16XOEwwmyzBhmvbiEG1oV7vywmT75xYJm
xJWrZW5laFb67mThgWzI+Evli3NWk5j3/lVz5Lc+H0XxSvfwkhdxA2E8YygJ3qpnLxYyerXbaZ1u
MuO9UOPeSZDT0aU9NU8hG9j0slnz97xAzVl6J81Xspb67QeOEP+zNa8ol9PN3l2zDDqPrGA1IeUX
8Owf1P1nAnooysYpAy0LfT4bX+zPeXNyH0MjPCiFyuyWdr7RnRKWvlOTc9a78YNGXta/uDlg+izw
ITT8HKHZK92VoY8+ISRRzEXPDTFuJU3kSyQJLEcfIlSLYqhdFXQrySoMV26z4YddV5LJA4DDwEyp
VAKNcYQnVXGEpQGL0MoUqvvYsFu3doRzO170nu1staMD3Vdnwcuy5863aDWaaiDUsOdsH9pkWzS1
783D+IxTfPRZnAL3/aDdXxKIiqD0aq5RsQW0UY6OyFecuZ35VqGd+X5sEzmb3hbIV+gPst1heu4k
gfOasHtox89TTQkmGOpil97Dx++Tlb5pEz1fJ+pD/euUG/dAw+ZPL7trJtJSJb+Wn6cQO41jKtkg
WShfjhMsaPawHVt8jUZp9kYsJoPkOnWkZzlJpejHzLvL02OFLewEeKq1HBdP19UBe/bXT+1tFo+h
H5rEklmdcaMu+E7NNGnCCjmIgOWWw1Do8IHitE0kmiNDjdjquK3xSWOoPe6dSP6lD8oKxcGwHYnl
rFitt6YG/qHeelPy2GAatvRWmvB5bakrWzT8cZBuBKuVS6c8iJTT6EvknQe5GeK4gHNeqMgF6R5T
mO4WfV91JC0DIYL9nJ5xP3++4HM0Tm8NN+T8YUKIZ2Gh2Wa0vXTKkIR0WkpF90f8YT5n7fYvSfxW
QsPXrleRbqihbOh5/CVc7NpH/G2bNMc6MZAEZ4gvbPgohXdqQlCm6idRzOFOc/jUCVsTABeR2RUp
g+2ylhzqQoqL/d5swgGVk9aLr+x7z3lDMMec3Uq8QA4NESkFKJ1TbqVYEYqfm5jQjovRlmDhjjre
hE/RFDuPCrMluhoSrrRS2EVwvXMdkmeXQxkLrx1bVPhYHJiG4/zJMxLJX9OA8z5y4ISb3Pgiz/LD
YThVpe99OYzha8vK4XyBxXrUkKpjFhI+Nix7edtAXpAUylh9ba3AW8NE2KpwdYtDpdb94dRDKBKq
ETUxINO9Zrg+rXc6fkb0Dh4Y05XSkrM+5cKTcKezo2+wi8C3gdSd0OTwa2543qdnxhGr+b7jW2cW
CbEIxD1SrF0vrVsjKsprYhZuMbE8ZWCPHmNZHFBy1Z+bsvS8g5ew1AjtPSDfeDZG9Eazv0aPRTHW
c/lD8I/5XvNbTJSeyJZB5+3TesyVLq+27+tzLfu8PQONb5Y0pkb2xZ57TGIGooUvq4UWjqFjxypu
EXHvnTV2KTn7TqkeTh9j7Gh56XE/3yrdLFVcqFgxNmvw/QKNbDCGwjc9QETbBmu2R7aHG2izkKT3
JTsZ3UzQkC+fmAdLXpaGc4Yxi19BpBI92z4jyp3XZ2yRishtoi0J20Oyipktf1Pr89Lc8osgO3p7
Ly5W6Ij6mFS/Jq8MpNVMKX4ZNgQadtbeApoOZbP0g1mSRgVJJWooCYUXYUo9OCKUoYjf0Bci45S/
LpJxV2zYze9eUbu49b0i66KKrWyNuK30ZZBlIzG/d9fQ1IDrTni/Lic4UIyhUEBKfRUDF6SWLOw5
h5FFSH/budhyPteGMnXoRK4KNcXTkBeUnQqFQX9FLJeW4ixdf5m8qg8eUZ0jZIFzTPw8NkJHdNNm
XRsM9z5p0Mf/vAD/riMyMIj8S2zIw7dP+PPdDsJrXmUsa+eJAgJWNMdCHDbTF+hYWRqDVcBneJ3+
744NXQSrRPALVtqxJhWSl4c+SpetFcBQ42erbX03Mn7BzAfSmvysD4zmMsyOn3OFchf+nh2glaFH
2uDhI4xIyxCV8HGHo9PoGMFwWxlsAzth9QzJhkYB6VHI5vrAYe9t0TcKLNtjb5ZKRrIq/BFI52I2
9yt+JLccjnhjJ91XVUFjcZ5aryTQy9/0zOiqCtdfRhiHi2UmAK05O6Xh0ibb3/ua5u3/1LsKDQVy
DgG/mNfl/PtVyoX4Uo+TEGJkbQEtfdu2zhCdu40AL/LijqOo6TeJTVEP+6a8ylVWXcVFpWh1XsS+
/jA9L5Lzmjg04Haw09ds9A8AEdAAncEjPJUnL/ZQvhRB5axvocXqjqMsju/VZkesZE7ioWDyEUws
rKi9Xed5RaP6Ck2OhY7VgvJkUD92zrQ4lyvOzVHuYpGFROUWvDatkx1K9iM0vpBH6T/3I/5yVvX/
Vz+C59/oR/D+yY/g+Zf8CC4Q95/diHKNMZsFNlxfjE1yVtQwXOzeRMjAoViuYlJ5cAp2a5F3GrOr
3DQ1SsntaPvRp2qUiyAFcqmIqv0y1xHey362tvAB81f8LU1hxnyhZXtE+u/vlz0pROWwrGS473NC
oPyxP2AHjhsHSxDC7rStoKwmsBrdfnqGcEf3buX2E+9h+PUBai406/PVx470HsT3JIuwTChCyHM5
cRz8P+IPtPTDzsVXkTKT3S7lUqlSM/DCp3L6PkB5V2+CjUPLCNWcIx+bOey0C68sEGkayi8nB1+y
hmDqszcKjBVIt/rmcPVwcoYw4g/Wc7oR5/HFRLypdEarFjyOOKjv3xfZJzkYRlHLg/gxKydBAu+G
Yk4STPs1tCVIXRNOGNKhn76uppLYaR1Fza201VrgEU1feAeSAq0EZ0nYc7DoS1LRNHQeaSRgPFnD
hZTzdWaLWZ69qpPie8yos82P9s1vxnDqHu/0gVuMNrpaV/7c7qlSlwi3DXHielNpxkiLlfeAGHEI
FUmZcBceoe7kq5rMhSVXr/tyPJbvuw1NfgV1Bb3U+yEYZ3dTlXBTZSXpNq88RaIfvUE2VRWDykSX
x9pqKFQLn3yrVMeRieptpdt08RCza22LlHodx4PPZlp+1BE/u44Np6jAy8toxKZCK73el1IhxdGD
H/PlUyr7IZhWFAN5FcHEp37egUBPNEJP0l+79FqbnGQ+yMItREcvwaqd3BKWkxRWMzKeHLnqACoh
oZLzMx23JTJceuNSByHGTppCcG8cf+uI6rJg+UAgxM81fH6C97pS/woma9W5rpwrlV3i7XbtQaZH
q1xacd2ewupzRD83pn/+bP7xcJzoSzcrRxd6RWszKxOIHUDM0cvWkeHp0Xma4vZ0/eERShHKGsoM
ygXKEcr16W0B5QZVAQWA0n6qu0CZP9XAUGxQICi2v0+ydnSQeLJ/egk+MBuIk40TBAbxgrjBPCxs
nHRsbHRPwxQdzf+HEU/PvvlLM8j/jv2f/rXJX34aoGxqo+5mD1QCgLhBv8+YA0AcnBz/XYwbxMb7
54f2IMMgTp0bM+wo4Qrj4dnJlyt1MRl76DE1odroyeioaKiiSoisCiL23W2bq0CgPbdJjfjUslPV
CW/kdp2gn+HbmmqaUMJ3YQqiurn9ot65zBSqq2liiR284ckwHshIwhvAtehZsdLGXYq10o1MbPCD
GkaoCk2YGvUmoU3GlK0jhavVFcIuKdoWLt+Di2gNViceRIrGLRixbhSDEbVORIFBJLYxWUUNEIl9
jIPUrOWS21NMoKo1Gfza/d13nlGr3ktJFYzm91MqedpjrO+KJRfFG6bIGN2anYqv2qgI1Ujy9JgG
w3zQvyMc6hnTdgaoiL3r7RAT5KBWUCnJM1wnIQanqjSJ0qGYbNI7T8itBsUUMOl7o6J541lL4ej7
iNrAcJtj7Vgoqocb9vG0wEX2eyvTJ+C+00f0Eo3ARIjNQy4g/1QwKSql8IFNigDUkN8dfXpmnZP3
hg2qCzXaHT29T3JiMH7CDUuNKgMolqkGeoubpz+Glk1qLQP6hkRgQCfX1HmGjZ1E2VNryfDVFYmj
lpIWh4DPB86BkFwCEP7Sb/SAw+MNFasbAmElTRjYAkCzmXzsOjgPCnORmo7Aa37nKdIEAIZU0WzF
Eg6iIQG0hKBJ4qEzCElMajvwBtP2SGQZ1JTwqKBj5xmcQlGG8wLkLWjQMdlVAI3UKD2IQgP5ROI2
LmKSYtouXRyMNLwbwWzlvB7wGrzhqjIGahsxjKwcZrIJfQKY3wS4XwbrvqPag1vYrNC37NVriUpI
LubVCOAseIcOgDxPgDdez1/Pt8lGmPjuZlYrmXEDVaFAyBpI7vZszabyQ0r4JzkEWz7x9x1rITHJ
41OcKhXfo9W0vlXkfxqfrDyW3ekIZIt+XyaZUEdcZ1YpFmsjRvhhlwP7RkOWt8cIooBlUsjEzfnu
BnOHjrAwSq3otYKcwQSNRIn4p9LPtKMqNWrh+zP5vCHlNpq7xtW6b/hiyrneK5GucJgBCt3fK31a
fMPHaaSxa8z5AW7XZ1Y7oVMsAOU9etKMDj9CJud0zEsdbbdyCZsMt6nAa2imFCTEwoq9sHlSA8nS
zArRVXiWLpVK+2y00gvc86x59c70A6TBZj7WnfV3rpgUMQiTHKhVeg34yhocYUm9O+sD6ztFHhPr
bi3Xx6Y+l6+8WzyPfSJGutYHythmmnxvv8VSiX2/oXh1jzlHEIRERlF0lFImr9qyG/2M4kW//tZJ
XHsWM5nwI87dsLBRyhYV5HQr58673rvm46P16zE6iihHYvk54RRvY+YtmTnv2KpJUMrFsJm19Fch
zLd6m6qbqsmqZ+JLV80WHrmHVeHd5JtsES9j58/LfcoJ3XsiqGgPYhm0Ezh3jY6/rdh3OVsm+SMb
bV2PdG25WKITvUedSEUp9IgrMvy64Du/8P14kDC+bYXM7rb0/Zrrgr0/644K60JV1/3T2G8u9U1t
cf63nvRk2V+qJmOxdoYe8z7vjd1hHozQkvdbKEoznW4dkshZktpasTx+jtiUUZ5ZCwdR3s98V1nQ
Zta7nQljCqqmK/YMKqUr9gpqtoS+FGCYPS8+FmCaPa00xsDapwgSlKgMR7zA7CSj7BEP8YyoDJs9
eeytM53Fonqdthkx8DptPaLkddq3iJ0c3peBqxSBAvTx4fA/OkTIiPuDYb08ARiYm7+I2Nof/yQy
Kw7nE/EHyieYFE+UzxuPf5U/OWBiYK1TiAlIUGNgDYhL/MBM0HfEJKNMDI/YpDBNPdn3NGlRQuU3
7cFKIgHNYamTgKawJkhAS+xFrJgC1PHP4H9UipAR9ovDejkBMDA2oYMEfnJxL0f7K+uLv7FsJCP4
B9YRP5lRekXIPPHdQ+v6JcUvgVqsS183tO71VFJJkYAGsJJIQb1Y6pd9+xfQb5m5F+5RErRGa9xd
QRcF5vuRsQfugizcBGaPwLj7duYCwjUvu/TtvMRwOTJGM6Zx9zG7S+m4suHe4nGpN1y6VgVyz1lq
x8Se38rZF9eOqTxntC8+yxsPlyNn9P2PSsglVgXdhJSsVvUbU0g1WO/Fhw9aXEyKcQr/5KX415ey
wu/XyOiomWUBh6BZKCo+WLffiYJfQ9S9NGg/AplmouYUz7xPkD5dCUy6EYvKA17vj6cyUxpJix0/
ixEC3/VfUcHG28Fm2j3LtCPIjtrBm2BXG7iwGuCyHnCPKskw5BQUz7AjSLR7nmjHlFy6oznBfjGw
SlfwFtUf/DCAKvINCowS7xXwBc6cFVADnY7RHyPyDQ7MFJ8e8AXe280uudDMz/gUVnohu63xkwB+
QlGmNd+Ljw3RSefXZ07XrBH2S0DuCZsHTtTizz7j8U3HewU7GxedZztDbdeCEeXTC9YnMsKHFYZP
+8qo5pEZcoKiieiD9YfaV7z2n+s+71f4G2a/LS+cmJE/yPc76UZGHjqY84ZcZh7Mkcvrf/FoL+d2
zPk444jvMQ0UapUs+ua43J5TeKDDRs5qZDdNcOjvHTuCcunxNWV7T5ugjUdQ2IfXoJh/XrROO3Nr
ofdTjTY5V1Ls+Vh4w9FJBCq/z4ESxckhVGLOeBZw/HBUcpmUkP7tZXPwsGGm8rfhoblX4KPTGIOq
ngXoYlWIB5SNBkjYD3Ltj6/xmGYZkE1KxDls9Q1Yk9Rk3fDGURml7Ie/EMtnQLswuMv/oZ8w/fFh
8cro7XMupJWb40avDaBLFRL3f3GiBfwv7R7AYK4/OyIGKkM2PWyorbdMbotk+HR63iiBie4U4UJW
8xhOdjSExHP0Xyn8jeaWlsTg/x8t7xijC9C1a7Z227Zt27aN3bZt78bTu227d9s2n7Zt2zbm/c6c
k8yc5Esmk5nkqmSt9adW7rqzUqkf1YJtIRld3PldTpUn3OtaB06Zzs8zzGFnhyKZLVDeAXZi35F/
vwEULwHyX9oOlJTSlP0D/SI5zPSKGCyCI9um+RpGXFuAj6h1QOa3Ywk4CEnOV7WHQ6TCeTTZr9RB
dqsn8KXqUvpQ4Q+MmhEgzYatCRxc3XWKGSbFy1ThSFGHm9Kp0JC+Jgp0jlnQCPi5pXextrQurbiO
uhg/AfWe0ePtZJGrc4lOpLa8+9PqC0RupOslGn1xzvpv1GL7f6QWDzsnM8v/TFiIWXi4Wbn+tzfc
Sz8oP3WN92eeF8WJZDPKDJkscjbjRBgSElBRGI4kWSYacBhkaWiNMwOIoVgR+r8GKvoXuItjxKhV
Zaudtnp0VTUdsFG2axgy94HT/ifCwitKvVs3Gz/fATxjrnknXaWbrttqxzEwrNPYrnsFpknjFVJx
8vSCq/3JTA7m9G/d94kNmXyxBFnA1ZOPhJW0tGg6hkwnLX5TKCQWCx9fMx1vYKmS30TG/Zl/dLlh
bDZ7vU//ZcEJc41v8B1eFVllKEVF5he4mkfXlDaQD63y4ePrdnuDJtr5UEdsoXC4xLHHVn9QuwUN
fHWuyaeEy+3rewU7yyeIxX98s+QB0//ny4vOtHsuUP2+axhDTgf2Ye/rpqDbf3uA7bgF/80Gz5Qt
joXTY+GTJ6Yxrmrtnv09L/Y++MG4bst+M/oTY9Ry0rDJxf4fwxXOcLLo8OdNjqDl275Uy84zuOlM
T186T5OTjNqBRQuBf2uVJb39fOFws9xChNn7XA/CVfdfPKwpme12OzLT2qJNTpOzRAw6vq1LsOgT
EpUet7fsktKdSrfdpdpddw9Kv8rA3d28FUamDBy2S75UMxNSgVfgOxZEbxfr+RZRXIsjgNesi2iN
+h+zrJWlEUH0DdfN693pHIFKRFNuB/mWtDFgzAQvI3fqF7qF5ZsdomnsxO1vjJIKxgjDcNSkb11/
0A55Mk1DYyzqyaFk7O5Cal6NOQIjWcugq8viF1bOnvULc1D50uhhoy6VO1+cXpnkct/HOZN/pwLv
Q1avE9hzUyYGAXrzCuZ87uZVd5YTiPU5Bg/nllQnPzqqN99vPh2mVJdR1ytPT3qJewwtajsXOwu1
NSOAALfm0tc9B877k/WyvLr0Gm9/JI8VR+9SlhiEH4anTjVPVBn/UIWfanu3r7Xmc3rOJ61le+4z
f6GGd8MFRZ1h1sCLtu9ASnchvFvbcxhDmakds5OfVM/bGb4d7u8ePcXzk/W8Ssf0qZqr95686JLb
leq1u/eEniFc2pmczdrMadpABaJxAfqv1q4HQxnsE4zelpqOnKfZ1i83hCUOer1uwNMrQCBr6avy
4EJxq5zPvfT6cScp+aJdx8b9hSkw4EFxWW7MqCgICkOg8/3kvMzdji3+QW+kgDL7nc3MzI9O+42p
hW/5bVDmCav+Idh9XPaZmlmDJ04BUvPr3BnflOtbdM2pJ89eBaqO4d1w66BXyBgf56e99adX5tXb
H90JqY4/8QZ8kqdEcSnQwm1Va0Nnr7e5d3m6/seGKPJG0n3K1FA9OzFvTiINnOqt8b+6W8zpUPM8
/5+t/u/Jwk9HsWS8aC/H3kNzb7mpDcLCnTPzIQvTAssdlxPnsenXKojmEO2qFWewgokIZ5iC6ZMd
JV+SvRnf6tbvTq4lveW18ic7sQn55TwEC6AdOl7cu8bIBVcDQsI7ja7/9lsOZ3qElXJOoKWkckVm
uUWZw9R8Mf/bXFWcrOA79/1Gzu8qpNwibYXDXvm8143s8svEJMuyWJVazZdTyMqVMq1yvKXGRTm3
waX8Dv1qDayKiMXB87Rzz3N094Yaea0qOq0R0x5EzAnUPTShCfO3U2fIrKlj17ARJz6lY+suqryh
0nufniCmQ7lX2p5Mx12sO4ZPkwCc3tib449X00+ab/ZAEQEpAa3uRJxXEnt6w59DT7VsmoTecPVV
Jqptd87or3k/5avId3ezd6qZmBx2vn9TcaoZzx/1NJlQzW+i1dGP9TDceNoRxp+G3qD2YUTfnpRP
yZfw7hYrXTUnjufVH5ufG9MKRoeXGWznpUpZulp4VeU1FdnszgOvzqYj0YQcDYVdVU3F3MrsJq91
BWKQWIi43MRCtZ4OSoEW4bURVHNndSOr9MfUSXP5K+Wwlu1HPVGQjqM7yPNv/kWST5jehmTwMQbw
CCRM8hhUKzDeeE0220m2kMqu1zQc4OpsTl2Urb4R9cbdrt1Hgo6nQNa81hil6qqwbd3jyodwRFuf
rn/uAQymYpQCBAxdR4CHiS6S7V0GJI2q3B39beXwb12GY1XDM3zXG/1lmxZh3XxRAX85Pe8ZFH00
2Zl7kmpYtrUhWzEbC++Dy9ni8fV7Vk8fnxwL0xJdQxIx69GypyMD4uHJFi891xcOw00Ly0Zcl6pG
/0a80pXwRUl2G82JrCwmeB4X0bWeBuXnjjg0liOeAn1DHW/qkYjpYU2CQFCkM7YrQccHT/jQFwJB
t4YSFhMWs/VeU9EoGkJPtPESC2w8yci3ktK/9XbWcHU6o384NZZVtycs2gfp4/PUsFRxxccEdfZh
oxIVGg69HiANO7Qr7sNHX87fAAUKjV3drnv+V3xoO9Qv4eqBg1X/3kLwTtg/xsdHHTmaC4RxxPNZ
WFfulwXfynZWg2TokR3KqhCOPlLDs3tQK0BCtar6Q851q2WKdUZ1cE0QFBI0Cz7vWVkYHb1dxXAQ
lB+PKqu2JmB5kZqeXzo8MXYFy9AOoIFpJiqfR1PNjSfh/AjXa6t5rt3N14/K+YjXlQ9L0+VolYeN
EQ1Iu+5n63jNmukbNM3m5iyupv/G9CrblnjrdZm96G5vU+DFggkmSsyBUanwD8suXElLt6nSCAWK
51A4HI1uydSqEgvzKtePHW6yvczknmby75Px5XKGHtixcYDtB6UIyWZgUEP3ket4B/xtseJTAqik
z8ebM+0AVgJWUZgM/Qm1TrHF/uHAv3y8KXJNljk8k6Su5h6eHl6iZ2Uj1er0rNvmlh7TSn9TutJl
m0qCNQoOqqOyrngXktRYkwwV2XooOpdNF53mT2mGQH6+8+T9uYbVDbv7mGoHzJwPUgJWJkVkSvvb
OIdNVewNIqlGsNas2sK5iLj0qOPhlmmFxkw98ODjkiOEh4hIQb8iS66PCtuI9uZ6zSUHp1q02ihz
07fVzMTt9jZfWV1/P1dz2yDHmlzdzpXpdE9XBXvtPVlrMRkDW8hxmxcfHDgrTQntMBWzLlIynwrR
4eIlzxsE5hYZuiVrSIadxeEMCzYZPEsFe9i1y/l/ff/I9IQbAX8kZLORsA46GF6mMScaexwCXMVy
uPXpCeUAjoT7PSj0xa+STS5AI4QMf1dZUUxDQB0WjC/KGsKAw9Dw7h3+NIqnqmso0gs6pzqDq+t6
VMXp/Mbymo5a1nfhh5MBb8u6m5GNPTUtlGevoCv8eQy6VZC3mZWaWhE2FNxyVMvw5JyC+2pLg5g6
DkGUKJJKAqFykagtWQsZLoexfV2Q7ofCf7y9FHbuMiRni7VovbFGaFLkJ1Z3uVi6zfQ72XAF/+Ki
NEcB/5frcVhIITOnpoEcJleDlw4Bz5gVcDTLj9rG5nZgg3dZPaZa0bN8TSGVpw3V/ZsHd/JamgRt
QZWNgdOVmhaJYF/PSi6XO/Fd3tSAAOH3hAF2eZDnhhhm9OgOMCUB8hYxSvJv/e6HKLyGur+8m9ra
cIWfrXNjpIitAI4KfoN5rMPQkdIVQ90rrLlpUhsZfYLgc9IStYVD2M7SZGbLNJ+fZbGnTLer//6g
iJ388fbfmKnzTCWOP/+OHqc5cmyarY+PLZKuTvDie+VbDuijt138bJgxY1W77ce9XyQo7lmQT2Sd
Y9Et5eplohqLV6mBkDTLcs7/0C+KucWimlWrEkya0SuLtWmAsDSpMvXqURSq9KkmCehwJdwGUQvF
2sRAP5pjGRatKB7VydRCmSgdVXbZOWKgPI2FtAoT0I3mnwyLRhQvjU1JOinQjCZEdVFahUEiBT1F
VT7RpBAdrRibCchNMyzLIhk1pxqdaFKMjqGaLKdCKVGOTqGKLocSXygdhaIKn2aSji5Wgk0KNKKB
LcEmBwrTQErPGUaB0bzLzGlFCaoeyiVQSTjSuJSMJhSmoa+pPiaTysH2omeomknvJRVGoJ+pepXc
SidQSlSg06i2lUinkspEidOgFkemDVCEqUVx05iUOEkbp5FKRlnR2Klql9RJG6eSysImoUvSwKue
lszKFMgWSPeXGKH085WcxhcaRJmqflIDVWgC4veJVD8Nom5KXhWjHEteJaN6Ze6a0aWKX2WjmEq4
6YEkND3x+64037RAS1U/WiCV6qdEVFzJq3SUkJyzchS4qh81EEq1iwnoq9pFB+RT/ZSJai3xkovi
KvESi1opeS1Cr5W5q0Cvlb5rQGeSuStEZ5K+60KfkbmrQp+RvmtCV5K5K0b/KPESjRop8ZKP8lfl
pwWSqfLTA8VU+amB4KqXKYUKUQKqm0xAB5rrJJM0dGMa3RJoGeda9Bdp51Z0vhKrhH1Gmm9iYI7q
JgnwSnWTElitukkKvClp04kiUN0kB8ao2qXtQ9LUpO3z0tSk7OPS1KTu09LUJO/D0rTI3PHRMKbt
s9Iwpuyj0rTIOtej6xVbpe6T0nDKORegY0k796CzXu79v2CiJP4OKe3/V4z/F3OI/x1MWxQQhcdO
69BIJsdOmXBuiEfTiKUIoPaFmzrieIPWmrOQ49VUvElWBHM4e4sms+tONjRWCHM2hRrqLYkudJGp
Sc463M0QTclWMHMmFQ2RViRzZ3vJLrPW4nCRx2hTZJl4ijTgUwWbdoWUhTriMeII4mwAC+VOn3EF
qkxJ9pSy2LJUK9g5s0JiFQQVDhUMFYo58kKAOFrkMFoMGa4cO+UlIQKuAjvtJSE4row6ikfcr5SI
rQNhc/EScQp1TfkrMHGJRQeIOadCY3VX6jlkG8H0sngr5DnhQtBFncBCsPMSIhXDQsFFHUEVwuYL
hWS5ZLHFv9RZZVQqmO5XVOPFgmyRfuICZRdupEzND8glKCWoJcjtgMTBMTRhGXHA3iEgH6LQi7Uj
MtssmiyKwkU5I4c6PHpOnJOULkUnclJcRd2ClBUVZ0AmSfjdSZVCWqo4UaUAn8oE906xELEa1rF0
k6WQCBCruoaU/AE1twPooXpnzNYGf+fM1kZ4D3cJJHvPPIVO8ZdoZwIgohEUNjBFClIdGAIEyd6T
T9Eq7rHG/eXb46hfLAtDxaHKLsUKkUZfBed8xW9Qu8U0vsXbWwHbsFTyoN04iunwPqGn7qzfCacc
hVqA3wW0TGjd4sNYgN/EPrmnPBX39HNsZn6ZpzSFVIBnNAERDqLSTVPxj0jCkgapSELKAzFxJFQB
4aa0shib64LNL/FOwDXZOkYsE1jY4N2CcLU4SaEv4JqkI8uKSgVuzmDPa3PlE2lxIkfcU3ntSrwV
ZUvWDW7uBuBAuS7ihubuQfbUkHMKSduZe8pbaAuoKYDUUrumLaQD1OQ32C9O3EQyljZMRDJSdPyx
opsDqrvCHWUCGEnX5d1I5n4Za5GdftbZYp7yF7oO1rTnu0ZOI3aG5CsYYzGaBmiuciA3JViBcxgq
XU2T62J5TEHmiEytoFaT6Co0RVlRzMGe+/BwGEo2sV/agDEUTGOqTUmIwwEUqXhjrECbs5TY4yQ5
0zJnSDIVOLIiLVA4UDmQp8gzRZJqShP+y4xJubIGK3N/bQD/Zp2oFv6GLMr9n440X8UBUYDlA+JR
hueY+CpB8838ikHi8w0dVkmpFzcdUBz65cd+JIkSQ24qsdqOok7o8RuaFo5vBiwlPCdLmGJvFVaZ
RSWoLNJKnBsz78aP+yg8jMA9v0BcbACxngMSDSOcgEwkdCBWd7avzpTWCiTliYoWms9F5KvMYqdO
TL5KaZVk2uI/7uW4UXAcpRgvmPZBMVezFAA0RH6KZxhH3KpCJsS9X4r4/1Oz/H0OFEuWvFIFqEZu
io+Jyxj7ClCz2OWBykJvWIbsA/TFFQu5C7VtdvMhPViHkSXQ1iKr1BdEOabMoklZUXAA8OpqShzu
ZuoAdFLFIbAclkZ+MAIWhdzn9LVc01khMKlgIqMPKLtAqB6oHvCesC+8XUfqD9w3sj6tvrQ+41Uk
UMP8S9fDH1g/SD9YP1SBmYe007fcuOC4ICFwKGM+kG/kVxAvoreXvhuwG5BAsO2WnGvvieWVB8pX
hA3RmQvO3pO4PtvZ2nUX/loQJnCmgk+J1d91DPf8SF/4j42zM6uKD/z2erve45w7D8X2uZZC64LB
34RQhOBgOR+3fuheEF6rHZMP8e7tJyIXsDPgyym53cJ4dVDPH8Fb1J1I5p1GcODVwtBtKy7hJ4QT
vDNbqU+5OakIuZgTkjMGfURBfMF8QRvBG/TdAq0hjqABcZxcoZ7aii+bEP5kjx67kKcXcyvupxe6
j+4IdlrgWqBaYFogG0E7BVtHpzesDxAzJceAXLnJB369qVZvRs6dPR7DqcfsUkyf6aOwXNeQrBDL
VjvYXIxN5M3VBhKrtT4GvE28YQduV7GJcE8uCBOE46d+9342veVfM9A1MDX2Omh+wu1BUxrTSPBw
NQ46GIvVLjW67bJfHhiOOsAJzTvByrYBzTUtb63y5ZT+o34MholQu7fio6zUiNSL8PBUIu2auqPN
zeV2xxUXT91f3HUB7VO/6+nbyNuazGWc7jYl+heY+36FPYQ86B3/OsGcRpy2ziCwo83GsKO3g56m
r0KatipHUmTKxs1eZuXQ1tLGyw55T4KzDelPzTRyNzavqyhh5a53EnUCuzyAG4EcaY5GiKXBx8Df
YqXlbqgj1Y4da0T3jeKSaP4LKi/dL52elfboDLUJtSm1yXuM2P7SvrSabqbUkEiQNCRHRXlHIWNJ
YZBZPEzek10GgdroSmeC+lvxlXmvEsJAn5iErzYEuHHQfVchN8kQ4KcQNixhPuQPZeVKQHTzoDXU
5hU9caA6LsA4jQ+FL4VfcaHyMeFBQRk+MuQ2TB2MrR4HeBan25/DqYYs/ECsiKz3tovycltffA1C
wJwzTXVXVZCIBpqqhEikAjApjGhoq6G1fV7KjWhfXKbbCIozh6jbJtSCXbvpci94BGf0bCtcXYZb
MrSXVuOt55uQd/DHqzBnhI8W441dI3+VKlbaH30mdmjWJC//yd7natH9/qzW05E5X1W2cbe3krLZ
Wp2ljAxCzkGmb+bITVk8mtSut5FQnB7H8fpPxCr1IRlbi9qOb4y+Q6dJytSjae2d+vAXUBFsUSOs
SxNDF9i+9PM89LMA/nqjVC3/mSDiXOpCmFWdDZcNno1gBzYNxgmGF/TUl9HHuwtvxFAHqY1QBaYJ
Rhdk3qdqBFOHrQ1BD6EIpQiOCfIQ7N2nb4TIjGcFZgEaIwzOjJYOugi+EGzdp56PWPbrH0hSMLEy
uDq4hjAFM0w6tDzIMPhBUH0fthE7Myw2jDrIkTCOMmwyCFAYhBpMEmQw2LhP2QiaGZsaAhIUPBhU
ODAf5BTq8dc7yJsw4Sze6C+XoN/CnLNoo2CfwpTxoK9BhMK8u7/4hXHjYYtBHIhxpMFQgyGICZ1A
FYkRI3/hBxFEghaC4hn9og/CiQSTD0JhBvER1toElMJSg0BhZ00ZHxAI8znBv6Jww36CfIK/8t0K
3BLcMtwi3HLt2u5C32LcUjhhc0P4gfohfmK8wr+iv0K8wt2y3KLc/tfX8yCv/2MAeSF5YXlBvaLd
ct5i3lLeQt7y3krtcuxq7GLsmu9S7Ers/tr13uXZ1dnF2bXepdmVMRK6hbjlvsWuQ/L6ryGD7QXt
hewFsgrXBOob9J/Z0uffx0gM3wRGsvt7l3DXwYhqFmzz1ydoG1obeBtBG0IbRtuvVwEntjrwNpg2
lFXETRB9JH0ofTh9cH0E/V/6MPqgduABUPqI+pD6sPpgdr8YIVtApvok+ix2RXfBdv04O73QRt5O
uH/wT/IOPl2zA2MfZpy/eaaF/vuiH08QX9AB4m4bOPc1SOz/p+H/2mbthPsD3zLv4NI12z+2ccb5
mWda8H8Uf858X3v5l75KoW4Nc1Etp40mvchMCTYU3/GuZS7ZW0LsB1Z+2dFtDBOa3zToXOqX2a4h
evB9gMPVj6w2XlbvPGJd/0QsOocHoDRW+KYHA1mWvZsenEauhLMEO/6a47k4897AyJV2P0yo2Rl6
2F00eTbhmGTo2Nqq/Q59wtve9kbPqx31RET3PhI9xa4Grgzj8V1ftR2gE6k3lNvhZk2f64DbDn0C
e+21QWaypzEbJOzqU/WiG7y9piUUP3MErlEV8sqa/zD8Sm1MscPQi6ktmaUj5VFpkZ+oNbG9bU7N
6V+uZ1vzaSG51y/SWS4yy0k1hLMzszQ2n7Y4sZJl1Zk2P6l/qLfBapi6LDScNHDT52hkuDSpeqC4
nA+saM1N7oQ3TGvcMRbS768x06q3rWOqseTKNunWbTQccTDjMp6JbKAzbpdRK3wkeUbfmLo2fmn4
4DDk7Lc9RDlLa89EShuAumAZdO2MTv9sPW5r5TS5NnGYSsioCfvKZmTQlPqktsn9m7kIVx16aj5I
k9sG70rsbyKZ3Kma9QNjq1X7majxfhDOmNv+ewLGveIp76xy1SO7L+sO/TfG+ctsscO8m9ZHzMjF
9ex9a53emr32Xz52igz6VrGd/uuhtZ6/zXU5r7wFnbT7vqtb6+Nh2nRwjQaXglWHX3ZItguXverP
rs8GKL6vbeZMvkECkQT30BsRWcfOfjITg3UCuPXXK3bJgdkCwV1lEu2lqwttBbmmM41YqxOXMoe/
53NniF9gfWO+ErqB9sq1Db37a9O/5wInC3XqX4nmB2e46nBe5w80dQt6wvXEzSU502Ms0VabItIR
iF7u7KB3ujc0NC3O7f0giI5gH0ixmVmm5cBZeIEtVDzto62WQcaV59hbw747WmabUcytZV+hz2n3
G0Lc+HzcP8wzgT+7UFBXhr2H2NmGTrdPof4fTlIdYqFsuiy4OZCGcfzmwqmBRiIivSjjQd8BhnFW
Eo1PRNxWf3RnmRRUcuZZRVG8a3o87Cp467fy7R4xFBhnSylGuO0huxMTsTd8tf91++ge13WpF9mw
l/kk1Z/kJxKaYqW+eI2cSrsDS4cz5evL72rUI+q/DPwf53rPigLplxg+72CXmN18VMJ9YtaKT+HD
W5qGin+LLUgpxQIaL+idPaS6xrAv6p7ps7YDgukkHhP2XVQMrw72MA1PVLYku5OejAJa/JkmTj8v
BStz4h6aJf70Vj+M+mNC/0W3iBRuUM7wuGuyVqp8hn88zCjkXhkYsXz9zNjRZVgeIiwXbPzP8VdN
2rTSvrwTPnVfqvlr5nFwNtNyliE1FBYWrvaHPjxcXBDAhBLEx4J97AXEgnnxl+YKwuooKlr4dYm4
eqdm1khW9hAG/PSJZH9mGz2Wn3VoUDrMPHqxHhS6ya0L8ShwjLypqrKZtgEi3FuKq9gdaw+ttjI+
xb5fb708mxQ5dIteZ2Mti+xUeP2b+H5jtYhnqS+hm66tB/x7fTHlAwp9DFzLmvJUxQugST+Tr795
xQlI8tt5keve3ZrU7HsOBeeO1YCMG4Amd+qn6qvwaKlPY6S4Shz9J3wB/ZQf5X25Crf4BvPywbIJ
ibuMAtQpHNx46nB826VJ1JkgrXpoP+ugy7kst/p/4LI1/dAarPXG6OnGcFSdOiW0OEI9fL6HZi68
d+eKgR1nZ/cX76lbNk2nbQ8K9c39xyK8XSeoHzwKR18P6HkzJJyumzDlB7kDAIUJSc/NpPicnL4v
ulqrc6w8tU3bvsf7XIKrsTC1kT8vaZoI8pnxPPeP42mxiNUMTw8YgycaMadH92Zn02P3h8tVeHla
bA3My/z5NvUDDyMI0mdlLwg5q9/f8evGubEDySIa0Y3D02S8lYIIpV7LNeic7FT7KdmRWn0Rf7T6
DGFrD8W7Eh+gA4ZjLQD8eSVsQjMIIxoXhIfdqyDLESfNkgrDCQFfdSAzpWcbO5s7rUr/2NZnj7Rx
9RNMaRHrJjL+RXr/tS9ppPVJYmN+mJzDy+t183vSqM3V8FpfhG2VqT2Xx1Rz6wVMUCpu8/rOBv2b
+BdjqLImNGzFWeZ7Caifm76k95yqNnTsfVvtXjDY/n192naobSmrr64ZoPn2K65a6GGvMerrLSCU
DIFK+bJBrn7CJCOiGqYYs+SBu951f2ga4Goy7Vyf7qRPaoH3kr/KQ5/hl4R/p+BiNkIu5SHvMsQ1
hrR/8k39OowbW+PW6hxYmesBeAReuEgt/sW7KmYwvmwAZczx20jY4OtZTBV6mJ5p0bq+7j2sgbu2
Nwhcue8fd/f89tLDYHhM1hPs9Oi/fhjGd41efUx/TatOz+ggZJswr9RLaiSly8TAcdc0W9RJULGU
kMxZ+scNpqLivM3NBJm3OawAukEptHNyUvvavuMojdqbX69hEayLMOLp/9VwlK7Z4xGzStZpqGd5
RMW3lXbNLVFx4W6RVe6flV7AumLGdvbk5YbttfqnUgTrl4DIHmWWDhfrMoFt4Vqmyda0duvgorNu
sgAFI+eaw+WprUtbs7cnoYYt8w09Z/cSNlaGp77ZtnOC94jEMcF/Evzj7o3U8XnVmPT1mrY2cjG8
m/ZKKfPENmKyPOm3D4LQuJnYHzPW+wVJRa3q/qFogttclNAVt77DR0qqZ6dM5iXYqQ4hxl+N2OZN
nQbODlLqH4bRnEW/4yKuCVkmFkej3ZJuaRJm1q/pzif8l0eLqxJkdMiSGiQpzWPkx2kx2ShIBkk9
miQurf62wTFYLNZHEtijtOqCwbU5YUDuDw1e9ymdgCY3QtzlrakQvwYkUzxWDKSk4UWuWR7Varc/
Hc4g2QUPSuC/bF4MCKBQ5azCPmWM5CwsKblNG9TJlGeZufyjovTN+fdsoCwzoEVpGTdU7FYqg1Pr
jUS7Zoah2JCZjHIVJ1ftK1XxXBQlch7548XweWKS9IxOIS/fxiVijoLVEAmnMxRGvy+K6UziC1K6
utnuiMRv3KJlvQBkjyPamsyTD18Zd5Zqn0dL7Ih9HoImK2I9NMpDNOUDfw5HkZOibhH0R71/mPIG
AMbse+8TUeiyU+dWbDj+cnD+38DZfWCMJ/+XxFI3n5huNKF0mWV5+1j1CHGEigncH+wFcU3K040E
uRxJMb29/QwBQ0Fzy6iP+8sNggL6ktP00hwfhBW5K/wQSTJy+EhOUTySkRwLtrQv694xn41ZYko+
4kNJ4XMQ3X79ti2IA1Dxi8k1NJJ5fk3CBLYdVFHhc92M0EVbFFUMYsTlX6wfPG/4mmsn+XbEKag4
Kl2kmAGi5Nwlpicku0MRLE9uxqMAzpLZ5c7yf+xxiVCm3SSzzxazMyymJy6osteYWCT5levztmjR
Kx7RNC7pq+vGs7GSSuRQX0LbIDleYE6+hjzffiX8jec/erF82z8wEDqoZeco6LsRqo9zw7OvMdvI
P6TPm1li2dHLLqSOoplOSj8FcBxRapVYeKsS+Emf9wX4o/HUjHArqXZxLbPPA6gXEteZ5HiYvQZn
VbRieJ6n7uCOanIFJmHWcp8t37k4Fk+U7DLK+EOw4bmqlqi/lWD2t/1wP1jCzBubq3HCI1fgExis
Iu1ExMzgcEl/s0GnkXOrhk2oAr/lmvXs/fQrIptVgUTPLFIWeFw3rNhVgkOynfopy4xatDyTAffV
53xPtEvub8LqeYhV7b5XLWVtj+TObT4Urlq1d3CYMRPbAm6y/tcKK0rpWgkFDrZdxnd1sV0HHxBq
XJToCkKm40ML71KtP7OuZmpmw7xwFvzxKfUT4NbP/CPEaJIC0pMm8Zx/RUw0Q4fGkWzUYJ/N/kKz
dY6S6IMeRbYNozjHkO3jSg1xIN5BBdJ4e/hFbfey94EH/9m77bt+HP8zWrAgyCcx+poU6exktmIF
6pn7jpY2RFVcntDHQsIomPvyH/m/WM3qsLNxrMfOFP86xFS+RGYW0BU3IosOPTEoEnaaiKbWmr0b
Of5sC+TQFSkQXJknJUbBMvY2VpUPhYpZDuT2pd5sBMom1H4pjeREIpF329BldxU3eW0PkUyfZhuj
vXv4JSdU5Ao5iITMzbIw+p+SZ/ck5EQsUfrz4k0Jbk1E3YXKwwew08S2lXHvd+yPrtHFtlW0KYwh
HD7CDfG8tQWAQgUEnKXNzZwrottv7Yu6blztB1M61ONfQyX37GtuHC1fn/t3JpJekvcISfrF6zwQ
HurYIbO5Bvbt3yLuh4Jh0hGdIPfac8JxjLKMogjB5712/t16vzx/5czdqsijH8Cl7zeOiLR0cTm/
irgyqcx9NftbEsJI0q2Nl/PJkxRAPMX2mQSyks+ZUtPe3uM1llwAg0mwSWDAbL2WPvA+Hx2gAYc5
U0uL3bF7n5lNcxABxHGLsqnDZngzfxKD/EYyNwTb0XQ/9p0xcL9JceOS0fromWiwk0v1/KC8o6SK
PaCfPrcjBx1I/IPcUkweL1zQ11QiHEjPVjIR2rJA84ce4lR0p7jkip+tCbzAPyz1e7s2riTpbHZF
q0U74GTTl4IOju3hUtwzgSHnIcfxLfDnhu++IbHVHjht61lDHVK5/IMgDz6g4kkKwaZGmRn7iy8V
gy/1uQnzQ+s6I52fOwWLnyQsbTMK3rlWCBO6iV4+Oe25BeND8zLYllxYL5DAJgB947tKL3TfXU7a
ZkQF4pMJTxCWHlW+OP54gTVEDnShZcMo0s8QazrOdf9Mn4B+KjQI93PFef6Cd9Q3H5NrLwMGDEDG
C7HIMk8VqKU1VI05VkstiRtDetZ6Mp3INfiaO0i4DJb1QBxdxRldxR2tThVtYoxtjbA+VyIT4wVl
g3vMSnX5f8WHEAsFU7gMutnfit4PhrFdX/86awWPACIDRIirlnRh12TR9B8vAuPPcYFY6bPB02N1
KKS8Or0C3bMG5k3W5FkhgJr+9QphhkB3NfBhDA+grYB/8t11Pd389o+jtZZyUdJvDuoOqKdM2716
NJLYnX+1uBmxTlr8CNPGj+mWyBj0p2xHJqgML8essI9AkupNM94R9I17dER45P7yXhtOiR1MEPsK
crdqF4sUZvJGnAAJubnRrEHfoQ8cwZIRa0o5QmYuDybcJYBPx5/oJ73Ol21POsmQuGLnX3AyfMQ+
bGgoNghiiDt5yHdkKIUwJBRoiKZJsJE8hPo8YwE25RrAMJtucXqsV6vbI7Fu9U1JMWmrC0QgU2JX
6A1mbbDfdfxaI+FnB0RgCeTOtSrSenVBV1sb+z9L+rZKt2HAnIlki4akmQYwitAv/wOO8A+DBhRc
E94aa9nep94BTcUtKzMktmPjQjBMjz2i+BubDkDRdQJE7ZPNV7f5HS/wyy/zVhZdvMhst/u4voer
6oBcs+xIzZKCQNUxu8b8b6krXmnn5GYFAmREDHIEiSAkabiHj2AWY0saPJfpNol7twn8yAFtSwpf
JOjczUP4pYBhNv4aX8ZN73eWFqFTM+PV+YaqdbMuMb6RH1ypR3LLZjPrW8wHZCsDfLVBi5FW3oZN
2N1Gh4MRN0uXaX/ililgb77Bw5AYsy6SsB/tdhhMdqFCTytX8wE8Yw8DDqrAjSh83j9mPdQcBZEP
FCH0b7LCX9osTE3Oo7Aad+8UpWAkjjy2CJdrfWwWROlvHrMZHhUqUidFUxYqLYe4ePUJGuEc+di3
cCCFwe0jNUeNHjF6wbrGiMkDa+WG0bh3PQvu+Fj6vil5mhwUXi0G08eAWw0rf3YITilaCF2myoAD
krjuGbCo6Kz6pUoxcEUnc37ga13Z5rav8JuDgPD2uQcrFl5u7HqyeZZQBnWdbKlcSuOV+SNC3lJe
3+f1zF+s1fEiqRFuowKpVnvLdy3Aqv4if2hgaKbO4/K6KEAgEwdnXM/C4n7aGWKPKWH8Z+ON5nPT
V9Im7iGz2gjKY2aDJKYxJtzoO5xIazhSqIXUcGZdUi9LEfSdmi/WK3NT56tA0TCnhuoOK56jCWX8
VLIiHPoA/eDMoOtf3VHB1RXcM38XJxfP6rWFtX4LTPm2xhYXYbTVQreBGjgPHdi9YRJ/4lQS9Oj6
t+nH9eseg0Ah13kLnQMPRlQx2UyA59MeR7sXo4UK2Kgil1g7v6RBKEU94yUhA/ssuJchVsM04+Fa
JzLrqej6XFhyycWvoO9j+f543X50zf+iaTWEpgpMlVoRAP9gQENkPVPoofqCze5+n+6frRsSklGj
CI5Vx9khuKRWIIn2Z7aqRkOcdU3axh05jiVxJzhyNyFixdDj5txtY5nJIZO7iiUWeZ7mGSCRh4Mf
hAvBYSNSrISn6G0D63bwuvi6V6RXG7g3OjpLml1r/L5GUsanh2QV2uoY0dFUhiFjiyt7YXy65KIN
81GTypAMNd45/iekSgaGDFYcwE6Cv/Sn2Dy+qCMwtON2DtC/yeXCXfilSGxLl/DvPuFf7NlKVwA7
Pj7gEAvA3u0W+QkG6JUO0ZIWTvwewBtjefHNuuq8asvxn6mlW3Uj0zLDPsriEVtzC1fnUubFtFam
O3kbj+BTMzfIh79zGmf7kHfyeiluqVatY+VX2IUYTCt9turM7arp9Jw5SLvyc3L9htk/xvvgfJQy
Pk+Oou+xrlg7c2f1iLNTg6C7cab7as3uOHo/ccDD3fw4xT16hspMs7sRTmBjeWEJoHJHi87eyHUG
jIK4Dz5k/J7QetAUXMh5kze/L4hhY1gbKm/XYsdhoYG5tvMeyuLfYMX9TRp7HtmLgBLUvgB8QcCj
y60ZlAIn5I3xXoiJJOp4y/RcORLe90xMDrPI7o9mUoHdCLTY05HFDLAIroH5t5AaWhipP9W/esph
Wh/mXBmWDyHRrEY/0/E3aUsPZ6xyaPDk22ovQWmf4Q8bvlYXKlv3XaMaTpaRhl9koGNtAKAt65Vm
OY4ByGlca6XIIxRSZTcEVsqPiolRZ1bMDaLyC7U/yNrw9nVZ5nERhA1UiSOLOJQCTVDViiQKPrRJ
avHoqdAilOqN9OCBBcgPMKtKiY9fyW/VRsPcq60eo2QnJEQThRNzi/1SuojyzJ6eyhnq7C5aux0w
9Iyt/nH3GigmhnqM9H6O3nt3BeKQ62MUuv1ZoPBSyx7rD2xfB0/kTWaRB7rTUKmxP1oyLk1W2PCu
gA7allcJ4aYioDEpyy4P0hSeJ5Un5zDXRnZi7LWk99q/z87HTvg1dOR/jkh0pnGl1fiYzHAgOdqj
klXvLYvqkaIz2bfZy1iQQ4jLVGi2KrVGoy9eXehJwZ1HKSTdhLM5PI8i/G19+Yi8MC14PR+Yz9Jk
/6Xv4sq8HO3qVexor/RzrVENY29PM7+j8+iVyv5kr0j5Dyt2p4F1Rpd06YVLn/C6qnjlGto9etrh
krCPIdeP8kq/jnp2Pu7xwzjymygioR2h8+1VGMbsREZZrR5vVSWJIcxYBwF3qECR5Pyy4JrT6xHf
0im8vwqKsvOx8a3+tc4ScC34RI6FLj8+CT1scIJm6cNuzCgChzs7J8PvkBCTfuFQ0/RIhP0njdde
HQ5IZlhWtdFLvl9+xsYY7YgfXavD4at0pWj6aaB/tuH8gnlIc5P+gS2v+msSIFHnm0cQqTDkAYRO
AxxNi/1EBfhdhND3j8L+7nsxCpi0lh63/k5d8FvWQStHizojxxJdomkKO2yTqjq953HltPQRY2vQ
z9RQV16VGIduRn40pAYpKS/li/hekRDGN46GYcsv4cs6C/nZiz75XRkAYxfKFmvKsJozQrmu3K0M
BXf7asl+LT5VXyRKmikMdvVvSofl4QT3VcX0t3sh+rtgzINXXYsF+4gF94jpmTIQlOxMRbZVlVut
XLtqT8e0xalm0Xus8eIz+rTLWgmy2Z5sryuLArS/Dp5AjSwsv/v4MR6+oT03t6rO/mc8O6xRpgFh
6Re1VECT6OcXcJ/5chekKRT1Od+CgDpUns5qyYwZcW+O7v1Qd+p2JcrCcSnO59XWH1Spf3PNZnx3
4c3TCve3lmAcSQI25X7UvXrHPlGqzTGJp8hDkBFcoa8AZVO3xkJIB25xH0X0oHypUZkRiFN7JDgm
xfkTcBPMQMClICAoBXMNzd23UHGZUj0PamXdK+eYBBsP7lu/2cCO8iQAxmHXjh40lNbW/e/SSSXM
mPU74iyS+fEQe47cTonrWdrx9Ik7hJ9XNlrEE04WrJP19Sfp1LM+P7sr+iId8gH94PaCX8NoFkZH
ce7Uv0d1jxcXZj/nlBGjPNwKkZulLz3m05DSfqOs/pwL+g7F/AuH2ND3r0vWISz6i942K4uuSwlg
M1ZfxOxYVFCAxR02xE6ThR7zslD2TdVhmhfucm897aq5S5CqVvV4UFdJT8qukEtG3rFYjsW7PS3c
U9SeLMbfIuu6dtsb5AZCjkLmmn8SUwYrKwJ0DB8aWsJmqX498+0edRKTSoyEgNqeAtTMl/r6Gji/
S6BnJBlyOjLEhJ6DPsceA710K6IFxqlf2qIJsn4/5yWoArMmskD63umAxntyJoEsZmgX9XJh4u99
mzKHYKQ8DnA0WDncNKIJn/2UzFMUmzKpf7hQ9rIfvci52T86XhVwdxMHPzJevErKysJZKm6ia7uO
BX/Q6cP81R6QzIR1IXFgyO2JrX/JwEmzElc2koiwjcFkgsFlOtBZFT7n09QRg130g0FxQ42XEUjr
IyZjcSv3XAmzuvLHuUZq+Wv2DXsOmt/nC7gNaMNbxFr4xLCKq5k1q88RhzwyzQbl4qKd68KKf7b4
3gjpt170Guhdr3/kdN+u3hkY/kwDxlNCUXb6pgFzOaHGtxG2eZ2udwN6cYZQcaa3XvkuH8s18/82
RkYcduY11r349jErkJBrRdaIHfaQ9zFJzacXUf9DzbE/t+tzNqJJNmR1Pho8b6cdM3zaIQbt/lDp
PWxaIQZjAVmeIt1mL4tAm/BfLuq/g2dJGZOJd2OfyzMkugVlC7CD5f16mE+1V7chno6v23soLLpR
Gh+2PfF+WOfwIsJX7Twbec6MPPeLPQUbLU+0GRLVS1KaVWdbHsIzeQVNhGwl7qXHofuwdzxmzDzT
ukXablRpYu2umHS4NguzaA+5a2hqFynlT0N9m2sZZbf+7cg0nEWba3zLABdLZ3zgp9zJ9MlYlQFr
+kBmT9lVXi5f4+ikKCIlG6euDAlKs8EzUOFsryCB3qbS5ZXiuPCz3aeLkoY56SwKphlfV/bRrKYc
UPMeGEO+TmxmhFrtS/Upk4PTdfl67RGPLl+COlkOx3GEKl+NFu8yhlDMOs86CefOWFDfXl+8C6+V
PXpxev0b6bWdF9NBHoTpyMqNovCOyjmzWXtRePPM2vom1uDUAhWuoxOsRZrfiAJG2M79F0WqOUPs
MQVBo5LhpRViGpQamPEe93KNp4L8dA7QMJytxojJdnlgPxiI9heJMcCGZUm57a1Sp24uxQS0sDQZ
DpbXhwSqqyAs+jzmd6sIrQWmo3JUtF/sjfetVjf5FIm22ZJbGQRT0u0TZJWSjrPtQxbBJlGJ+byF
das4tkTmTj7sVPoFwSD2xRFOIzdbzOlz+P4kf+r3D8P0LhMW13ZPk/mT8t+/ZCp3FFzMSxkEdg8l
TeaVlM3qFm/fR3dz19FJJMS8+1acujXoDbrDGcuptboFJUH+pzZt2xUjKEg0yIHvA4I8morkcmfK
7CtCSxs9JfNmKTmFGk6ARCkzfcI0VNu70vWFPasWTwrdv6Obebe2o4F9HfUII2zp6BNZrDNZtglc
K6SOuGbbi+P8qqKVNhN5MTGQdpZLc5p/enAG7WeIm+kyL5cmrUPXyZgUmLOVxNps3OADYiTgLTOX
9ux1dzVFJDEyZxaD1jci+VLDWvkkF9t2jAu0o/SJIqM8UhXptzvRW/HgBzN0+9+i+0XU288U6EdU
PbgyX8AjT8h6oFj6v3ShSUEFw9ip/wvYRpotmRJxApfgOEXcVEzWElTWErA4ovMWgGLs2VXwv/pw
eQKEAv0wjfsUdCVvWuR0lQczooaZzN6KykWKsR44WJ6jWO/1GxZJRO6lIPE4oeKIgGHjQ2ob46aS
wB/kA2iRiZQ1XtI256X57Ymb7Sgp22WejzSAwl9UW829DxvPeL9CZLariHvrge8VV207REk2CDcx
HwYqFDCRA3Jo/WP+nOM5FqTApyL9WqWZr87l4KgNZA1pYooQ9l+F1l5FTLD7KsgipeAoyHFBdQFc
8PvG8ah9CCjIIuRYdDxSZMZWzbfnBDFhFdgi8GQdonQoIrWOYb3YMlqkXa0DeIjKTAlHylpnTbH4
LsNCQbehJJ7qCuNn/j1PmEnhyAVlBFFru51EuxC/c0jst92Y059Xx84nyMMySRaF5Y3HaGX8Qlxl
h0ohKcJfYcdcNI83W5XzaKzrXYdsKidRmamG9sD5Lpp1736mdBkgHPYSmjaMY50hZH2hP65cV6Hd
lPydbHIiP8fdQhDd5NlDzSDIB4lxwMaIpSGFx5HmyUeR8zuhHt1Cc/lPJfK0byAOCmWI8ouGRdwx
Bm8xxPu7YmIzMX6huulpK88FIsK4CmcjewKgJFQXzVbKtKvIabcMrcAUTtspDzkkgBw+/7kVK7wi
d1UyGifEG4olZgsKMDODU1iPdhq9islLWbt3WUBn1kxkSLMgNHfKRXbtJfOKqi4hQWdlIoY3ENLd
+eMHRtV5s/Urw/7WECqUTjco+y6zIwmIOWDaq4JfEiTXu11xdoK0TIlcIRCeGOD+8ybRf2O6ttb9
IEfOjZ0aQQfBtqTDNDGA0SAy8jeza7OZbnOg4Glc+EIbfqUyaOsNfxn2FxlJANFbjMUhi09mMN75
gYz6jCv40iNCzToDllFCi4XKdlRAKRZ4DovyMSiR5NkvXYxcR/sxdZMu9DLpJ/RCW+HEYBFDU+k6
aW+ErykK/VjdiUe/kUc/CXUVG3NlYfoG6nJl5uPDMcNuxfvpMqH4eBC4zSUkemGZMHAWKKnpLlEX
1VEs6VFuva+ysRptmvQcNiPfJxUvYupKE6iZEKqrqBhyq9hywl9o7OcZ+wSi7mT3hMi/CIPuAaYT
eYN+TjVXo/f+xAfgDgLeHqHF3XYjavS3hfGbV79yFcm5kaA1+LNV9zCT0FZN2KwllnayjZtGvcj+
sCwhUmT8yVSr0PLHyFly5sHu8kLbWj9GkOP2D8IAnCMxmPBjR/Nqw4Lsi+lGhX85A2pykSnGz+tC
GVWPIxEUW3NI6UPsW3CEim7Ro9FYs8d0oW0MqXKBLtozrunQlvui3bwy3aalIHlM9aH005Tk6U34
D9GwNALeweBSh754Q7BsszfpNIQ2SksZv5FZTPO3Z8tbl0HconoV9S5T19gUiealnAyf8sviq2KA
Mr8bWE9/uxN5DZiYnhkDqVi+pRevXbzF/SzJSQZt168TBzxazzEsiUzEI5uc+qa+MLpE7IeytSEb
8/JRe5ydsWGfptJO6ECvxBsUgwzqwvY+4NdFd9NwYLSzWXqZjptWdZR40ceFfZ0sRQuaIn592JSl
eW3T6tGs0+oInUUd+vHfTEiQeiPN+N7z/rxpmXDgy8DgARMzBQiR6mNN0ZcGED2KsGFiW+DJTm8p
10MLHi6GoS+ymB5VMr3OCysewjKI6zvst6oP5OmP4McxcesaDD0YVmePEGz1MD1ql1nxwUNJrk4z
N1U7zhPsGZYWnDj7mbMRsg24oS2lPh2mDLImFj9CgiaJ+l4rmDP6EewNssITc/OzUsEYW6VgvI96
6K4FVlz37EBTq78xL4HbA37YL/C17yx3SzhFY1HG8HErBYslXWktlfNbyQp31InjoPeI2wQvPvu0
P2/K5Tw33hl79B1oYOMkhtrF1izR91Vz5zd9/kOhzKZMRglFziNwrxDvvsKv32j61CuiMNrGkD00
4li1399UCH/te8rdzgo2IzS5siUrsxCLlkrsK9ywzJMEGgSbBjU5rp0HC1D2nNAyXdW4M6VGPi/b
BFd/jPewUY94hCuQMEd+p3/04dvCPhAA8Utvv2Zc+tMtYSiiTcDZwNmg6VsMfJJPaA4lDjpv3/ed
S8iGEdq4mU99HkZ9A3FiT3TbePn/EUowSDPlildL0oNu0ePLXktZleO27drCfXVPnf5wkIUdk7wS
jf0w7ksWZnTA1DhBWfApShnYk60KO0NO7XdVxLYLRLYPGWypCfRXsrTyne8XlAFnVDWpbeaAoBUV
v/dhThvHEvS6jTP+HdVxaf9BzZujQFwq8nlWyxUumkLh2u8ti0tVKge+W11kxsunHmsEdxSH7PYK
h7b/bRpzYMfehy4d5reZBGoRWXuBIeYt5okUlaqScOO+RIdJRRmHRTkjv5tnpg5sK/mC1SCX9Sg4
LSLl7zTgY9BUgXQH2yAOHxZmOCZySvWdAUbJY5SSOClO/5SDynQ7otGTm6rZPQZk9Q288dndPoX3
OXfh3AxCTAbgm742kofjik6N6w9pW2+Bc02ouhfB9/at5OeV9EmVG1FnwM8nYoG7Emn0ipu4OkyG
w1Axh/umiTeH/zUcljApdKtRSjQHvEqpVOQCwkLrrdCnLmLPk3Z/lF+MWOgreGAgMKCTi1F9uEmy
Sb4R7fJBqvutnoqMNckrn6aUp/7U8A1/9udxKjjqKoH69pH5YtCp/N4+Q3JnYALTfOxU741U0wvU
NPA9fjrvCGyQ5Q9bwLQZYQp4Os4VcPx8T0tLYkcYbIm028PkLmzdiyTVvuOR52TusjsOOvUCi5Ff
3sD3zjFnlky3rfQkY+XoUkndkPMaj6askIN0/OCjmvijcTe+HYSgjMfpsCm9X2jo/k4BF/AmuNl4
MmX4ZQJlXuAMC9mWF0plKASe+4lD5+Lkxs6jlhN08GH8JLEptRUZZvR5/6l+2/MntcaphfJe1wG9
vDS+I/cd4gPfwn2Mn6mzCqSooBPr0vCHl1dzRsKPmZf3FD+qoKlM1vhnpLspn9S6qrIHWjHzhvJ7
kaxLPOtGEsd+yeKcN2/oPOVPUleV7sklmJvf5EqvA/5JVcVk4OVtfzE/aTmYQs5zBIVGMc5Yab5n
ZsU3CFExojGatnAjAjxEQAV16rxjomlv/elNmePNOVuo0eQkmMpppbVI++ZvOvQVjzBmH4Udq0X3
c31MH1iiPzzMDB/JEmr2DegX0v3R2jvIXJoqUZWYtIQZLK09ZpsqVEwWkHIl/dGjPGQ2qc2DXRaK
6vaYqIeaBOtv97vjwegwWvoY4mnCB6mhUD0+RwXl+MR7DCgKSNLVarY3tfo9XREnPpqX2B/9meWa
OOnzW1AnXQTT3qhTPEk4PzASgJIdevhvyS6vaeXK7GYfbwYIt/zb2hlCWJER0KdS+QD8Kd28R4/D
t4Ycls4ie5vgffc+usxwthmRvCGZswITZ2qGAp5/3sFkNNAN5LUNThUKIqiiRpA3yAYekPFA87SY
c9c/gKyp7KJNsBNuj68WlVxb3SaLSyhbLRzXZIml6UVyjsXLAvqQ3yPvfJ8skf7XIQnr1WuhZ8oV
+awh0q5+0RE1CprG40jE7KVn6rLOBX0LBczsNg3Xp9IknbSVtAniBZEkvOOMp8jY4WWrzhoI2oYP
aHvHx8x7gUu46hpGgT/+fMpL+U9L618rVaAawKsbNKX5enVdC6LqAPrI2ZPZuAYXXoyi2nUYY1VZ
CyLQZOjeijx+sBsq00nFxSVAoOgnmTdCNI5O+nlfPMAYtk2z8X1jnTSwxfJHtF1/lgsLbn9Na6YF
w60K1LLww3o9v83Gx3bWENJvQSuK5Jsvl2h7dp5Vf5q88K6KSRd6vdA4Qio/MTSLF47syI4fdeZd
ZQnD4us3tfs8Z5sp9XE0B0epmEt+iRDlA7mpuZ+YVuxQzhx+xwWDlUyC1BxE7DehCdRp4XM/9oCg
GIB5e4o9ZFt3CkQcp59hgpCviNTdSSqbnvi6iq39pyqNUYcsakBriGjOUEVqoecQ2mctOKNFruf2
zVNf8ZPZjbPhEtMqxTXf06Uu/33t4bqZnMnP1k3TXuAnl9qEPHzqCw+jcLguZRXj3eH/IL2to+J6
um1RJECCBvfGgntwaCB4cAjuFtzSaBM8uHYS3N3d3d0tuNPBrXGHx+87557z3fveeH+cO8Yec689
91g1q1bNVbv7/ke/xnX8Dz6POc7uugI4kOk+mI7GJQ3hMqzrzP6FCX3+emKf28M2wjRZNUrm48PD
Q9i1h+F4o5Yd82EZs3R+OcXnjclDLx4WpT+hFxYIz3CNgoUGhrLutL1Hl09apU32GmxN5zAXl8WD
K8XoyuXhUCoI818/AQ9bjo7C91v8SSHYnSTXgrq1GgaL+8w3bCQLNR6ynnC5gSoi6k2l87t2AAf7
Cjz9+QFkd5ZhFvIpr7wRvgrFWtbhwdn1AA3yBMUKB6YKnY94h+s1zYlk7aUVlofBV/ZJdYeaBd4S
0JGPIMx7/lRsu/TxEvb1xOiGN2WNfcdnb5DGTSFXvDItXMXMM6JVcZ3ead49TaM/8/sQj4kb2NeF
UtgUMXpzP0mPOS425wkAOTKx3T/Zhx56H2MmUimZGegaL54XtQ+fztXNHMqN3q8j1Xz5Rv4Yza4L
MMobd/SKD7fqcU7xICq0FxezmrROneXQyvXRxOIND5ONoGPc+kC9Qxxg6Pcj4ZtkaZRAaruhilVE
VBMNmhXRt1nK2gy7qzYWpXc+s1HlH++VtVndLRwI8KQamRGJGAubnxCSkMrxKkPFGkgq1SjbtFQs
IPn+XPIrlE1I+d+BRLOQdWlJPyVUBZ50lMkagsoPRNFIXQjgiA/E6eXPmWfA2qbvZE+/FBP7RtNo
DbOpObgGTU6t09HCo8N0pzghjQWBfhDH8YBgJ+riLKH3ZoefSP3IrJZ5RgMoewe6kXXIef0VFkqZ
ghSXCADrYomiAOS9igkrFsJ+XQ4MmkvyU5aD1b90/GQzHjLeKaRejgrrQ/5K/JEjfHeTKMGozJM+
NDXkLyymlpdjJKGx2L6iq9qHY/tk/QVabEPBCHiyreqNO/vLDh5OMuXbBwVYxyEDBcft+qfgkeI0
7/KNH8c5aSX3xnMBviddHYDV6ns9CuBzJ8r9mZAeoMlEI8RysW295T7ixaVQqN0K6ur+SfnWAJ2m
XbxIm+sahRWA9QMM1/tEuYMIYg/1hKM2U/85Zc5Og1wsdZokseUAT4TDGs+5+BLJOBk5FGCp4G+h
EM4cwGu1GOBwKe8AED7HMSWPipKvAARUMCa19WPcGHHzfRSb6lkH6yP8ps5AQBwwHeHaYuwkSvFd
RrawvFxCu08WO46sM6D4XK3tkG6ZyrsYv1SPFXpuFWB09DkxOCdHcouZ29LMgo9DE2CKmIK0ICqd
FvEGY2aexTqoKJKUTv1U54iFJ7SYOXJP42tFL07H95809mIaThGa9yFvZBFy5zK8AOJv8Y4rAqZ9
0A9cRK/hJAXMf6L9UIAD1ZPglIT3FsMTTpsmYD4YmKSR9l7QR7y7jXJNqj75DhANPQv+Bu6dPC+E
fjo4Qg1pyTznyWBp3tvBp3Y5208OjJTTEHO8EOPpSLqnszaQFiT0TP/2vu07fJb4fA98jmOiR6Qp
klv96gke0Q/c0ozS9mr56wZ25n3Fx8F80PDWiY6nxkT/Q36KAY37SXJXBIF/Qf+kA6U0ejPZ+8QF
uIbN55T6HSfo6pSVoM2vAKUu2qW0s8QW7x5WiacH0Zc/rpbaxCBNbbTLkheEJxuCg0N6XT7q9gvK
2TdbjO+VfwRSfPCmzGd26MbAYfrc/Gn63W/Mn3hiX+BAqL1UyBfwBhHmEhEXbHxAUJBUTcP4XpHn
oc4f511HBwLlsbQZBBi9ZC3LW0AXSm8KzS51NreipNCRGpH1Hsc7cokyKR2oCuTj4pfPd8nK8IbQ
QX1JvKZBJ4c4Q3+/ElVJwLqxg7OFBrr9cuoQsf1pXVzTBlrqeqKe0UeOih6294jYW0Zk5091q2U1
pzpSpKPX/MiPv7/8UBQj+tr3QGt5VQJ2FQbjHEV/KHkxZEaC/xXsYPjuuzopFc2kfFfqzYqy6W1L
zernmAaJ08f35iHJjzRj8QdwRdVrqOJ7yV7TKn8x1fSELrEwxJaJpjTLuPG8SdYUcyxqa72z7bWW
u3izj6dJ+TIGIt6PtzqPXlbRXz7zbOPZoIs9ZYW3RF7/0EtpfsGR9tQuzJflu6eMXFpr6r7Uwbb2
xgy1HBW/2d/XMppVxtik3k9ma9AM79stkkzbT3pZgEvUSB7L7JXoCYk2XPW8Gv6osP4t9g9o8Rez
DOFxup2SIiDxQC/mskUCvnWC+lusRDmyaVy8gfLRAQLE6KzOYPX3gH2DnKHOuSyBcicpoNWr1Hfm
0+CB4ob4h1FxaGhBCdYX8EP8hFiaESbt05tLYtYF8aOH5N/WyDqoXy8PlHjf/SYjkhwmk6ameFNG
8IfO6i0sXnNyVte6rTpusO6HZm3Vr76ja4560p6rMbJghXXB6K9LAancj7OAv9bml4cP3z81WTZa
ymBhn8ILF8BSLdg/fBJ/cOYfjX35bQC/bScwrDAr+u2N/cIkmmWBSaiEXuCGlF5OrKtADGF8pxBJ
A0siqd3hVLkCcNMqaeWlbLVpCEkRk+C7EVrGiZ7hitNEMl3rk/+Ylq+1fbH9Ll95yuMoMiutML5B
o4dxVzCgo8B5tbvvZmui4nFc66QpO4TQXOCvq8dxLCVahKO3qURhnuVAG3M+oM2En8tnbLdd0Guv
qEQPFXd5ybMek+58cMRlvA3iOEAxLTBUSCdUSUn/3W+XcdOYAdlUWbWhR/bU/+XTpkzF856pzXm3
IY2Xp8tt8dQwPprEr64SJlwt6zXPvs8C2MxSkrRzAEVCCV6Ojz6HS/U7sxk6mgKV5eqGvvJ5zq7u
netN2c7fvFu4FmoQEJ0jdtcoy/OWVIPPyPJH27QPf/pg26OqTBZgZ/gRfJ1i5NzbuvqikuZb5Oga
8cUtZH3zvEshlF98MU2kYMaSloUg3twYp0Sbca575o2ZO2xhhazX2FGlZdMz/zMK3VaGlMyPEKJw
qpkNuODHTg43HtBvl67H2TMFXoAkxYhJnnni3djoON5LDkYCRkaz39H+h7FF1lk1gqFTlzcfwP1L
/CT9xmiF2rl+iFPisNF+tcb826+1fDEynlxZOc1L1A94l2Fkr/yX2KqQmVBCUjH6swZJpBoTEZZv
ZDVcSs+efhK+o2QizZx/CrFQ6eYXB6dldw2wfUtQazS7tn/COgaj+51/fA4R3wdz6xpEoXaEWeEN
fX2bQteuQFcFZyGcjwpopORCHsCqki5LXYQfZstpRvzx5tFaaWPiidmSliie7oMGNVGK6zWczyCd
dmiFhzhvKrKvBC0026h+c8NwzeCtZNp7tpfGe+dg9/6fov28OAWDbwl+nDI+SC15KeeADQb44TJr
y/Xdigo1bvBknS+bRM+oh32PgD4DR2K3PvxD3cDFrkWYz9DuRtjBVais+pNqQRyCd2bajkGVHx9c
iPqqfN5kAcx79hY5SPnpGbG9bvMhI8px66XqhgemqmG5tjvadiH8TkIS/Vc/M2XUcH+hOiMCJhE+
vInciIwZBvHHu99e6DGyiZT+tpJrlDpC91/ki+r2muOb5+br5GZdV8NgdJo18Zrq4VZqj8UEnK74
F0utK0+iE21cSYGFCyftLR3rKQ8cLwIUEwK7Ai/O6bvpKYFJQTSDOQHZPhHbAwVM11LX7u3aZOYf
+FMTz19/Poez3s0ObrGRxk3gTCROxK6u7dMMXuTf2sj8xHo2oz2EDf026D9f/mWuQDxS8OF5MeAj
r+/Ry3Bs6mIGFYoTZqqm+9JyfqQn7KtA2wb77wGZ32cYlvpp8VpOlnnbITkfmV4y5NiHAvF7cr27
Dz3ULnYsByEXIncsAhel6El8CsOsHrBR/zBC5dJ08F/mPJrhmKTfolS+hj4POvOPGucDL1rZq97X
1TWiIg9QWWUlBw5zuS4j2qgCBtEHcY+lWOdqlqSJaTclJ3Vp8/+/67kF9UXDHwZkyH1cx6TSP1gV
xxfoz/AzyUHXtr9EMOvvEY8TigIYT/O/OeI1xC52KjvD+5ZEhKjP6NX5xYzqW9zZW45wn37UWX5U
dNIHf04olmkpSybOpXTi1yNqxcuw2upRMK426ii2ySa2AMPdG+3wZ+dYja1lakJvAHxwlPtrhsQv
tDQjBC3TWP3aJ7hGOQZTau51xB3jlbBsvCflWF6oaybF691jzzJ7lM8QiYBI1pi5oAF0p2SDhHaD
KNSkwZfHWdHQq3752NBJBiWq/AOWUJCa6HjzZUJt6kLVWOQ+KVyk6CtpwofI+V51bSHyxulGss9u
Sho2Ub7YMwvn+HtNyET9pVqZE4ifOs5wOLB4Sz9lVMChdfajXirs2+und8qV/RRqak15n7Pgx6z8
SKzNVO1XIoldObeAGUniKfVu2QjhYR0h2MTk3a3kO2kBdDseQ2S6qAb/tP5Tv9VAbVsIQ1CaL0Jw
ly+jLhXGmLt/WqIUI/c6dh4qyDD8CY488vadpnpfO6rZSoJ/Xj/ImMgWt19hP0X6CdnbyCpdbF09
2XHSPQgZ4z5+mi6gHa0uqSpupMHpO6mt2zdBk8mbRJH+/Vyx9b9L1pM3rW7El8flq8jeFbYQbHwT
DrW3+g4ryPompSjl3O3ILPhQ/94vRCzeWERBGrOVd1KqY0I1JMkhUui0viijXSfhZyymlS/vMimE
RJEfKFB2SCHwAf3OnXRmFJVJVfiafcaieQ1VFigFuP3sfhCQYBhPVNfOrhQ6lAAugdRkQw5KvcH0
CyOSpCUP4+GaZkMJ6k2pCy8UheVvoD9tT/abt7S7xAmdWxSOLhLamdZP3/mhQIi4JVLLbzX1hHMt
1mzyQHh/oFUErh7hYqqH8zXdjLJubLf+zurB07jhzLETAC0clVk2q4azx0J46o/oBEI9jNvPKj5J
whlPLqC81hzBAboUeEbAwVjtl9YNf0QAoLzSgQMs+TFH8VeqK8CV47h2Fp7Jb9D9Yg8gOns/iaX0
g+jM21iEBWs4kx9jAdXiB1HEsHv3DqXpPPEnMMq3uFu6Sk19GvnEWRyLukAdVhPN/xW2Acr6R0j6
dSOfSSYdj1B2iCcQLqIK/Mv6ReEbQLIIwn+yd6GdA5EN5qxHL012W9gp4F46QFWYzH+FSTwpOjX/
DnqqD+8qZ/ZQ3ExYdVUfOCtRgA0/JrS2Ndfw9Ty07LYNquK03Jgrjv7t2b2PF7b/izzxdORTB+hN
YsgS5ugNq/HPmbJXzy3zRzWiKJjiC1ZWG1KW2aHYvUWoKvHPC60kNz4XNMbzpIFfXkM54V5Doqsy
fFfPBF+yhujW8/ymVJAOt/KAtQn3uhXxkmsna1Zp4QJQif9gSc+S9Tutn9SJvv8cQSusxF81R41u
6vrtzyU6xu+IF8RomUl/iWmnJh46X3sFTku2Vw+L4/VsUOp36AeU2uHUoMFrkTD75yE8B2Nbwuf0
V5jTS3sR7sk4phGdEXFkVMEJdeDSfEmWPuoNjVXiOOldbYiReY3ZjPkKPCuj00Yt6aV7iy9C04Cm
r3mybia9Wv4+UL7X7YfjWAdjLqBiHXQzqP/uPHm9YW6YVZahCeujR5JMDDpcwjwzKWoOpbF84XYC
qhwWjuCRm1pfW4dz2uHUIr55ccehvilFqyPF/iR47KozThrtp91Jf6izn2pvFKDZCPEpdTxgW5jo
VyWcUBYKjQ+c3fbSP2dB+E2nU7HijyrAETHTfj739/RCfbRU9Amt/Vr/h/mozkRQQDW6J5TWnDjN
xK8EXVJv79ZPoJ/KeKEQQZN0wI+TJrs0EAPFX4wT0DjDD6dAIoriRqIM3yKwSgMclrsUIG1EzSnt
bW0vmVy90OusbMQkClBitLhHmHRcQRzlesZMdHzEI+IGINSTKCM0gDy6b+u+oK7tvBbYmZPiSlKU
AwVaLp5hFquxZ48x6fgH4SIS2VjEbNLqjSG7ficJlL9yCIy9MLowfK8n0BZ1JcSfxuGA/M/xcUZQ
GVOFFl/arWCEcE10ylBiPKuwITfaQODsJZ5VeFssrvqLI4PTqjVfRf2DAlGHRraLJTwdcUunW6xS
wLB0OFcnCahJUC/vhYetd32B7t19rk1zdyRqhmmNgIx1yqCmOnNZKKNcdJwml8sRP5WhaR458bbS
VClL/TQbCGAzWqtnNSzCfFx1LHfo2ee0rch8jLtbxFXmEm8fkjw9RFAXDS9oeeH6q2ZJTn7T5aR2
mnfTpc0yD/8X9D7mX0N272qW1tLkrDCyOUOqXodsrumSawlab+uU8/zKUXaKv9siX1qrnHrS3idn
OSR1EqtU39h7wcvyq3h5a1EhBZhiHWPJZX9ulz+LTv4aHQ8y8HnwztBNWCz9/d9eK6aP1Q5dKAfR
sXW/OxHnJC+yvdOLzckW497SeKc804v/eDyz464SovIlQL2NQXJMXxVtqvdLrMbmCqEE87DGRhvC
0lgnB3fFpxbdvVJpHQxuG232QC3ye9QaB2GnKIaSXcEabwyWSRiqWAWycC1lA2YRUf/0rVCFFo0B
mkGUvYP4IYdvgRv+zbTxFUmAdBoPnbVVohkiRKdrPU3RuSl4Vzfs93vfAudYy6wzz1BLWWjyBYPM
GPdJU7S8TdPAe/6PI2o5f7IydC1YTHV0IL8FAbNHMTvEI5V+0pEw/S/rd/bV9ktKNDx+8FEdx83h
OoWbpw35pxgQULQFmXxFyFCSQHh//bzehY2xg1bNTmZfEhf13NbKeOoVyV80D9Gv5TtaTQ2CJ1lB
HlbVmiIxjrqczs/4dqJj6/oJDKfI3/lkcuvmJmU+CJPO9DPJF2A3XWmeco5262ftXDIFgSGBKrp8
Xw2LVvUx5cWBPk08PlSnC0yGzMUCiygW6dyH23PjRVXXC/OTI3lbWxOL+5wArlGhX9I6MYYBeHw0
d4ZxdRU01vZLTTvh8xIdP27Gqa1iIxB2LvX3Aps6SprsEW8oAiQ5IGiUh9qoiwXB0VpWVz7w06yt
iCULB2+/W4kxcmoOceWnCdbOq3vQ+s54x97IF3c4XpCNGkx3lywPEvSDKfiq15PKeNIR7z4hVRhj
QFS7bBuTl/MXmr+w9LTu6trnEPPkvwQmxYhlaFt6S3hdWUba7sg2kDEv9JIFz3iyjF5hr1GxEj8w
dXOVNbjFL2oh0XgMwzzU2vZ/IVlJMUu1mLh+z/1VWixatKu2a1V5o67+p7SRwKxlJKQ3IWY3PZyu
57iZJQA+OUyAkGs4/wR3yqUX03m0eHcB/340KRkYEvzN5rtXQNBO6agL7mkrnQOxxUvBonruA9WY
7nXyhF7WC0MH0WUY2gLJOTzXOeG5rpTkY8GSlBSh0nx5GSOEl5tXvb+WmST7V7AVg+aMilHhWFnZ
bPycusYASV0efhT+1E74t038rKXk2SmSsnxVNGtXjM1wq7Y5omLHPypGakUawQc2Nnq1rjxVNmVV
1q6l9eIRvNyzIbYHJSR1yIX9TAeT1SKlcXySh8zZUUFLPJxl1dR4tuGa3DZT4Splmrg9RNtRM7X9
ze9ZGLCkfubTuSrWVSW/bS51LC4JFa+pou4n57b5ZYV4RFcz5Wlv3yNYRhJsy+P6S8VDoaRo3pQb
SzuYTtdeUbjfpvCP5rw6aGDnU1U4GD3Kdk4dz2aOu2OpcDboQK/2nE5hrVZIM+qMec566v0OTllX
7RSHegGPlBXRpXbQ7/7kKxUIj7H4GHfez3o2vDKuAerkkRIJVSJNbFZ9XdVZddLwfC1jC5u9bUqU
mal2TfB+n8RniJTEZnizigvGmF8psX4b0zfyrK1zZIXW9vzsqm+qah5ihWf6rPpZBuT2VqEaA6a/
kgj1Kx1Wm7ub1VvEC43e24Zxq0tJ/DqIRxs2i8O4qpKWj5uOo0LvCL5sX518I6dbm9+Pio4ZUKiL
ZoLElP1aXm0pbb3VbguDJrsp/T/SAgFX7/iSmKvKm/NbBXNY12wPRmxTuq1Q+7t5on7pon/Sl8rm
UWEI0ZTyLlWRj1pVgQSxFApolRTqKUYhtxQrM0KssEtmNHurufuzebZ3fGQhSssfZufN7T6JYUh3
xdNmhE73Y/KVllTYvzXHRE2RyM/TBisQkqllMxJYh/tf7ySfo04XlRdGoadMFpUiVfQibYYPv+f1
NSnkxFEW5ZuytLTHpjHAIeH3iJgJnOGAtZrXpPO+SYcFpTo+t284s2m0Te/GTFZJKWmIMkdcxg0o
a/iOEk03RKjN3jzIrnO+qF8NRNN6W26pXykLYdyDCS8v86pFhL3ZTMmYqyWjB3Gb+LWUenGH1Fc2
C8L6Qkvmw0wll5mxtbRCeVWp25nl+gxC60Wl9gGSS23TdJjDnFsY+4TeH5UfdXbkE1h+XjorKMYP
dvyaH0mqljZktd12WqQcMY+JHLTwyLGL0/ur6dGyQncaT35O8VX85JeQeYGXwnOJwnDA5zaqlr8y
1Xok1QM7agQL4yrldYqq8Yts6vHL7eWllQZ5pbXeEox1ZSqai5qMdfVMtDZ6BaUNdUyk9nzMKXbu
DM3HgG265R65lGOj2BR7doaGRUO1dktPmaYZN4W79uPG6h438bugLY1opqbhh2GBYc5t6jzlJv27
mOrPd9p39feueV/SyriLneM067SbpNq+3LFdd2IFnxc+7snDFlABjkiQdRTIjf+Ar+T+zMaZB2wB
DfDyFvACGY1hAo/CQ4zgIbsBA8QbZ0ywW0VYIwlQuhMqDWvEBzqgPBMBRd4CMuAgD53Qik6oCewW
E/yo4raIt2g/ggyx/DFQtAESBKeiAAj9BvA3QDzgUmQINowIBXK8ccYLayQHrqEAKJD+yYaH3dKB
H98C01VO1I+Gb+JYzEOcXjPRARGdUDtYIxywHA5iAmskADq8gbzgAl+FT5AhEL+GguDzvUe3Vy2/
AedOaN8GiA2sjwCoQIHYdpqhgRX8Blq6oAEbZ7KwWxawFzGw/R3ghWXgc8HlyNkGCAfc+h44jgx5
lXDdOEP+Z156XVBM2C0u7PbD0xExbQc8pAMF4r0B+nRS2/TXrP7so3XKByH7oH9UWgmAPihAzYAB
1w0QGviRDfyIDX5kBHu9VgQekAEPQemEUv1TSVF1FykNBwQt+2H1bYvtL9u85u3nwuaMYBZ4yPZG
FQFw7S2g4cfAacDAq5IoCiRt40xr44wHBtZPK1n6YzpbYliUjsknYssAWQMjQ3A7zeDBrXhAQyRA
gv8AB9juDcR+4yxk4+y1fG/AXgQ8FX4DDV3QgWm6mi4zABiIBX4HbkUFsiFBSrqgujAw7j8TXUEC
UOSvo/gNEHZBTzuhFF3Qguqenfh3y/sbZ3Yw8KsAOtAQAyDfaUYLtkOA8PkPLHdBhf+lwQ9eQQFk
oPyzONuNM0TYLSf4saZadui1/gEDr+k2MG0EwGGnGRnwwNieGdyKCHxGB4og/ZMS0glt2agyutN2
LTbSGiipmUXrhJpvVBEBkbug7sHn/Duf/mWYi65XFkQFbsUElmdNOCND3H8M+L6BvMpzgIGoABTJ
usuwxEemfzyV4DfwEaaNAuCbdvzdCTXYOBOD3U5sVKEA2zEBoj8VealSunSYr1c0v9WPuQn844oO
RIDtP3NbQwCcwkFE4SGQHwPeG2fzG2dvwY98MH640wsmZux5ubiaWA05eLe5IDl1Rs25Hj4+JjEY
EbIeCLYAD3D3H5DpgtZsnEnBbpnAXrjA9opH8SsGmVngtvcVcDtRUG1fjZDB94t8JxRjAyQMfgSA
W1FYROAAN34Dlq/LPBlHB3QgANC6oOIwbQyAXie0bOOMfuMMBLvFeW2d2M9SsXJAs8HX90BYIyrQ
AQ7y6o6WTijixhkj7JYMDEQHvDZrcGlVVFxdfVF1Fy8ikA0O8uo0OMCrd1/NMLBxZrlxltEJvdg4
a9ioUnZjVFosS2XzfP9CyAC/rXv79yOsRr8IBZLSCV3/MfDahw6wRlKgCAbg9QDYVV1+NaymA4Ky
/YHO8NiByzbvFcm258HHbaW453nfuGoJAzQA7r8ErGG3zP86KCrOq4T1npqfWFzrveMF59s/sdb7
qrVNA7oXs/zHedjon++ekJD6SJeW9N32na7pcLyPj4+9Y0GSS676x9gJEs363scpoCxpKcWMcmiG
yIecGhIX5M9TtHnys2Uj27/ZJtbafCGHKKLGdd4PJy2OD9fRmIAQmQ881X5cYdduJ80sWSjcvtmj
5oRsMh0WhkWgvfCW1u7t1VL7OYI3BG/a4adcFN0X8noWd8MbGgaalIkWlFYF1fcrZQaz3ya0fEaS
K6WwPp2/apTHZ6tjmCTMRJPDlAH+YpihoaPd29+0LAoTEDZRmsghYpPCjfeQrdefx2353eJGGwzb
+CYbYjnB3rC1RTXWXjoF+qWBWWDNPLP5LRm5WR9TSvCPYQ3haDf2VIzUs2EBU2qxtR22u8SSUDG5
22ZlQwNKQPLON7SQFgPH+QQqoPKPRNfCd/UtyLMI8CSdaxGBaykmNZMevG0+vjqUlAioWyEI+AmK
/LFwac8/QZ/3VVyG93AIV0NzRwArdfLwCdfG3xLm2VbcEkZO560oDUIQi20qXN72cG5UmbAw5TK/
32Ch3UOoiVXM35NPXvRzpRVGnZOjkRq2AQQtfQknXbaesGqhaeEh3dkv9NHuqsVzyfk00W47z5aA
+1Bo9fyYnUdOrpqAuISERIr646mL0pHPENsQ9+uw29nStR5PYiQBB5eUVJdx9vopXwPDXeCIDe5m
3MVNs373tmGbt+fVrfNE27BSfSaNotpR98ke4ZP+FpMcQRN/XsJ2/H4GNHHhcZy4T1LmLLJjjXN1
evv4j9CVJ9UyVa2akpPKrtFhZvsESKXBoDnte36IoALWNqrWklRRNsuUDH7xtx4pmfMpdcuMzdyD
zJhmjf3gGF3Dg/jpNLrtCie1cA4s+pAmRpS4zkGfg1syUVf0+yKzN6Jjtbp7wJzq3oQr9YbtohP2
c/UKjJw8IL5D/11sSXbihbXRbIyFyHapfy4hZLZ4P/mo3DBoCeXj02zatVbBfoXDiNHq3wqHApeW
ISOtdVB1j6kZpiDLxwDMER7GECmLSZNfxC7aJYhu2nxkvB9O3i+DImHhoHu8J9TNDznc1/qKeUj7
hDQP5cusKw4JRChZrqnMvGeYLkK5y1Ke+RSGU8rOoLHkAYWxlD6uw/UVacIDK9ybw/wLzJ37JsLp
D3W4byQaypZpVts/lHsi3Lw5Md73azSYPt5v3U1fbnBo245PWUTnpbLH213ClgIzNO/LhOI0qDWm
0T/OxQGItM7QG7SaawaLHOtW7sXTVpasE5SohaLbjkGfIWgSwHas1VPP1OJRRCnPwBJ1jSjXzGKa
HZfPBczRsNxDUmAxbGGmndwvf6bJn0AjRNzrc0ZlQoHjXcOJGvpNZkBPn7DbfpbxpJJIutXN533i
D/LuzXkzN85TPVQTeLy9B0LmfyyctUu81qF4sgy2i9E6/Br7tfqGBdxBFR87OhK6Y4V5YqhPIC09
gWF055b8tTM0qWtbn0AbwLSvLNFVFjxMAV1uysFMK4EPpxcxjtceuWNmyp4d4zV5UYa52O+KFRfU
nZgboqLfwmPCwa8y5uF+UHkzaf9l6afm1CSn6K/Pxlo0nL4+1CNUrZga5DgouTancUqgbg9q+V+A
lnjst9xsWYEeWcMytG0BX2+Skfbrpr57F/8Nqs8WyxyUYc7IFexo8nJLfj+A2OefRuTjEhKOn+uX
WWJ15Nf3DiL/HcgVHgHC6nC9iCdYq1bLt0v9aP7c+Xg351afjbBbWph5pecK7Psk2uTP1ZBp/Px4
DZ/AvA16i/4XGbOEUNLdt2KABrj2szEtQEK70VWZkp6D8Vv9Cffpgo8T0Swj2TiueGrlzIHOJjwj
JhagAUYJREcOVXyL7RXgJAdJ8f6F0AWnOCZsWT60viIAnPGvT7kVZ/Xo/sTEhA7bKggIHB/Otaq8
r0w7PZNT1qxm0QlObD50O3bjPysjEeDiy/lsEowKCED/aCa1JPImYixlufRJ2jPN6pw/aCAumuC5
FsllLEVKwsJx7suAX2SoSXNSM7zDputndg93i8FvulQBh39+mQVr4RuuyRVlbkquSjvpkxcUYEi0
PHUXbtbJs0tFqS/A5PbHKE9FGR0m1aFk4IfnGmiw1lJrUaMYNyxwCP/59+Cma/KvAJwMQgH9rcCR
Qc1cPhonld6N7K5JsTj9WGyh98Kj1KzQgzHNvKa9IjgchuF8707sXlQqXRxL1go0zsAfb00D0OhR
eOrS31IbYlIbNlx+tww1HfRS/dBOVR+uJ0lqCOLHcbvKlY2JlO2TBoE4PSW9nA+sDquWgWys5Gql
uuntBBwG3HzkGvwt8G79VddzZSwOx0ha67v9+PPG+qBmhnL+fb8y6sTY7eLU/DfVhhDYdy/qkG27
z5/WcwMcVP66ylVst5EZtrL9vZDY0X0jfhd7c+nIiaiwHO9zTYLKoRlIPMq1p7C0gUNMPMKzYtaq
My1El5QyuqpRWULJKcqZsXXGWq6nb892Qlt0+uMD5fG9xWfSv3SrHxOVJVfkmRyDM3h5GdqJ+wmb
QlUq1MBcCD99E/2LbMsTaRYyedF989ZjEartEkQ3sGA5aAM0LJETjN4OXE6TVZbrUAlAe+NcsO2O
hrrnrIKDUE6iKY7NcbdlBidRrBW8foBqkX1P5fjy0ihDWrj893hT8EfEmPhLgdyJOOwk3ofcS3Oc
spbW6bgnyWr55VSqy8RDJYzuJOK+HcZxIe0e+PCLokVj08dASymGVUEqtUaZ2gIuCcpJRyV75Bsb
TDgSq4Hsh60fCGTVXBnPX/zDW7YGiCWZHPMFH+eA8T0BtX5rpzG8GTTCwt96yCSXNsV7cvCf7DoB
lekusBUae7YWB5HDr73MRkyGd/yG5kJBE9Y1edTx+JVHRX480r9EhF78qPArEUgSQEz4VQiCCRjv
dL5X6MQT19SucTINhyNIZM8R4ZP2ReommYy4Oy2c53XHT8iajOz+Eskgrg+XgkfQev8s4X+Iysm8
79pFyv8t6VdE24D+zZ9pz1WprsBtFnp+ivVIKS1GcNoGbIOUz0EOdGaBaOfcRtyWKbEWfwBxC186
vUKtYMexmm8I16NSlIXsTDnVyi6t/E0INxapgHnUSNXzx2yLP4m3sTS9C8EXrLjVn94l3js4WOKb
rHM/XSuHzyBFsgwLNaT7Tfwl+HfNmwtn8aNZoauv/bNFp7PKb6/bcWMpNqZxA5DoFYQdRBZGB49o
9mtMjDAZB+NFfE9718K8a66VhbQ9K68XpYSFHwSbha7vr+8bS9a+Gjn5nlPmokwjedA18S0m1dL1
XXC2ZMtihLJVJeTJqyyNuh7Y7ZQOf63mE+Fc3twLe9Dv3uV1QqkwccMypHpy2iSl8TYTIk+LbtMb
FhoWYvJk8mQT4PfeLgU7qDpgi27Z7znx87q5tk2mbv/WAdi43x63ubR5L3hZlP0dZ7IEtf04rGYq
r2iOBHCb6GkREukLM49Q1ZDVDA8P34+UjshcpVR6GZD+Jp0yhcKork/GqodYeJLwqO3rjHiqj6Sk
xPEwDNt0lJK285fK0wO8vVE8vzeXBhMnLNOvmmHetKv94ZG8teYXBuxaaDg1O8Wz55wc99Tiqf9M
p9gZhiCjeKpJTM44e1GUBVXQKO0yDGy4WH5bn+OnDPFh+iRqzUz4IeETnfjK4q2MZy6wwUYGPHAZ
Ynm1vcUIj/XWYX5teFinqYaJ+eZe2iEFjRHHrtePna+hsJRF4Kd5jbm5nQJsUL9PiAwzxBG5ERHi
JrV0VMkhC7F2yL2dv9X3e0haVnpE00VobqKylMEql40TFhZ2Kxh00tDUvK6FuIbb0Tdfmmzo6+La
pMcW1wrd5+qlfiNtNupD5hgZQxuiZvsb66oqTHiNsVrmbWEy9bNk4vS9TnSYRU/u7IAk29G2Szn7
/BK1UsKg0248UZO0bLm4Mlto1vUlXZWZc/P3veHz4dJSge6v9V9Gcbh+18EUw0m2h3TMM9d2RVIm
vgQr8WOZ7l3cphnMLwkXYfy9GA2lULjL7kIiba507sTXHDTeHSe4MwUSgJiQW1HL7fcwxbqXSK0v
7L5lys4Hd8EPsxcA7r1F9keirY7JrBrCC1U8V30afEtf7Hwz5xVnLvV+EWRpCq7i2TQt7FzQzN17
846DwuUCr+bJAaAK+zyVYb3sOlN9jVrTqEQd0vDZCKnCX+v6gso9mjkTu/nrNf72wKZkAcZKrN59
fYf4BdhXIeQaUvZY2x9dd6bD07TzNtl7evKENvweSYKXNzw+IORdvEgO3lUhJRh/k1KlE7942Ixk
On8NcJoI+4ZTpPOWAwroLyDK0FHDLiOc+NjeCfY7e2/GDl2OlNmf6OgNCZzuShzQHuSHgASgGK62
B3ODUZF6RI5mrTFnDv0PxBRyL3GjhFlAKRd/WSQy/k6OH/6wZ8L4xUpMHaP7NDeBJ3Lep+1vpOm2
J/iQUMtex17ss6zad3wTf8zHrgszXxCzMlf53/DKdqTEco3dXLPuPEDuuZaMO8hb3D8b3iMH79QU
YI5BxoiTRe13Jx8F6IN30IJnMxL4uEXJs+bjk14Yctao/s7WBO8Qroa7Y127+L+dfiEVS+FV0fiK
Fq5Y/2BXEWowDImlCEO0UWiTaf3qOzXFhj/BJ0x1F7jruxF2oJOx7p53jLru2t5iz6qzWUpq95Ja
x1jSU8++HH9c/UT3EHOkbNeB/0VUaYXfcHyJK/sohGz4O5fEWs3Xl7fnqte5tXifLMTDqfgqj4jY
dB5qTsd8/vgW0LZ8/AuPI3gPoUyv6qpdEXTz1I1O+c0FesMYqEDRwCVxwhVkGzzUKNMvnBJPqHQa
1Kr40ZBc1gl1YDeSnR86h744fj4aWv0Sqaz2W4iNj521L56FSPUHy0jZTVa23ufvBiwo06b1PsIN
jt0euN24J+mVKV/Bp7gAEtnRNXqgyGYoLQUGatTHTTWAfMG8FoFielK8VExCPq3dEMZ773MMNbYf
b8YZgQXgc4zObuf0pPsjLSOLu8LMNzgC7kxfl5pkxo8HDgeb6Mc9rx9bZMeFnZ7Vdjvcnz1n/lgv
zvQreuI4ZX7D/KCt7dRlEA/0zvI5+xPxwvEULZ8vsaOf7Gk9lHdGDNE+/xNZToxikY6SxOk8Yh5i
KaSNU5NhQpzoPJSKwrrI5Ql3h7J7CSo/dVrerhfAMhRh/aa3UdQUpFUe2OrjenUUWBR1I6J2mCyQ
6z6WjRRDgMeaWGN8013E0hXEV9lL6KADJuRohwl8Ps2+iriUqjAi9V9pakTX7epjZ/Ex2XTu7In9
Qabj5XJWIO8S/5BwWdna/pfBsIJdAKCeQCbzNGUsC/sGG+Qz/SkUbzPZ4jsEqrHYv6cdSGhvulyo
3jgvj2OumGjy2bpSK/lT/Ls4QCMjf62kQAxQdDOvHN5LY//r69/Pf63+3uq6HkvZRsxrlkeVGnTU
ex+n2VLot1get9d1hElnu0u6y4ja4UUJRF2QavGJzN462X23cz0qz99WPFZU5vP+c2SVPuelcREw
5ljBbHhj7WX6WAzWAZJ0MD+rPBqP5Maf1h5ZCyyc739fvz87tCzNaBBpfX6+QnEEnvZvkco7roCg
iHyA9rPb4M7gK9J0G9daZN2cMqwGtzpMu9Fl7baz5ygZvrEVvPXLn4DHSO06SzCQhMT+ckcsi79b
VLK6N5IyY9MTLdhzRUWU0/0+VJUe3+PjV6ujyRbkoOwAH2OV0cZPnH9ePjnMEy9jh2CN7Uv8+Us0
ehraYBYQWiFUfXq1nlQnSs6VJXR9+5ejbmwpps2Mwy2ZhUqQ0PmRp47OfD3FFCLHSFBzQlVs6R0h
dtlCf6goee45tfX+pp5ibjXsRoIlwD3kJngVP5zrBDHA/Yfn0ElM9gsivZQvBP/CcRs8oZr+IHZ4
ZJrrnktNNWfWUGcYqmjxyAlNqYsODQv1q7XZdHFRKGMw1T9BeHpbR6QPHZK/ornHvpTWpchi498c
/JtHf/qutwuRGNs1kD+FWEs5ukjz78nW6lfpKamiW1kQOS2RhqigCZ9c/A4ye1L7bdBZsQcF1H2l
Zvz28tLwqDj1zyq9q9ZQEr8heStiUsvvE/vSst/ISyJcIiE2hYG1hUBL07nnP0pjYyNJoULGmHUF
tTqCYIqx1pjfrF7ztScpxO7jZJccjyJN3oOroA5XS7KEasBVRnLOzC1aQMHNDkFPOtURrm0vpyZT
j5kaWUr6Z7tkIXMnIi/2zNkPdE4BULfz76f5dUOwgyRcQLe+mvsCokXF/ZS+gagNatSn05iE6WKV
4RXry3IK4YJvw1I7I609ik2hp3LE4u78Fyf9NwMdKrfpyVT0trA0XolSIQddJQcx9yV2ei92EXPZ
9SpRiWAuqd/tEN9gWNpTbJAyaQFDz+Iml1xw6ihFhsHHwOu2pmkjJaWTu4gyIR5Oj/wa+eu2GnI0
ujHAoKBkASD+TQL/Xm5PU+8PWRfk6gNKfrGxTLUYHbmqjC8fvAR1h+iZBSWuxvahF9hKMp+FuYS6
CnCFvcOpmnzD2m9hOGlKHKkt64K7ifsPIFRBcVqX7Cy3CNZNXOXICenJ7aWHd/TAN8cP+9xBVpyu
ZyYi7n2s75yG1AVdQWyNtxx9tCWYP2L0sMdtXMRz3PT4kTaddQMnnCe3Y3TvW+s5wE1RxMSUbO3Y
XEmJxxt3naYz00EToHXuaYKTiAfygzD6CqsdkduDEQsl/j3cvr2Y3j3n3j21V+yJLejL+yEyYSXq
u0SQF32+yy77zM1B6r1G6LuUoPUYwEl5TYxYrZBKJ2FapM9KN+gEqkePqHLC8E1fcLnPZX0OZA3z
WXvP5OI9SY5mQOEivLKuNylIt/JbJChfQUH66eMfX6SrmKl5gb1Du9pnqiOPNBHsfvCb62gN3s5o
TShhpXv+efCZ97aiam4rLduXNexd5lOSDs21nhm2q3aKNoqsCTkuu8sw/Uti/cd3+iBOaZb3Pq0W
4c595uCgKKMI1FamMxvuNWxOKM1UoBaX4SEsHDp7ftq6auulb754ehaXxC0b827AiUW7+46S0jKP
ASUPQQ4fWxLW9fYHMjw2C0rdJA4mdUjxWzxVMYEc1s9HPbKm/gi0tD9rZZPp6rIUQz7MxHHLcsVY
o609CF2oi4ictIl6diw+9E3w1FiUea7Ov/gazLdplo4w4D8xsET5RGYY05XLtF04do81IjVsFTRi
iPYcNyKyS9JLsVOfXoi+z0aUo47dGJn685sLhp8aVpHNdv9liHQKD3uediI6Wj5dC+z5li3KRxd8
+sXJrVamWuReez/AxHpf4lY4Xhollk2CdGnKf3uvF9Uli5T57GbP791y4Ny706A83DmpondVEwFE
mPIjdJIFceTGnpIunxan6hOC56pHvgm0Q4izKo5sJvMjec1rGR+wrdSuXbjrjoiBIWdWNnf+U7Hn
AbCxPb9zXX0/ig05/RCdRAySuBeyjs6AW2+XL3cU9iicgSaRxnjQTJO+oFtetu5Iq+FehmRB0Bfu
vMSWU8L1RM1bbhUvtCXM6nqxOd7Bem/z5bDqY+lFt3y7lk/1aUzLSgytPaWw/Opuz2FUR0bm1pxS
mGZ1t9DQ76jNqq8VQHmZob8PTt8oBSsSLW0jTumXr3OK+UUFL436RftutUhfvkIpoHvOUU/MZqK7
pTSR3hVVFBxrRlHubrVxqnOk5m2q9ZzDPtJNKwwhJNsqOWRfY59QHTOZWrNKYT6vkqmojrTM0vfx
ysoyQqRQx/7bFM5r9jsL8BR/CMluSr/ANL8lye7t72ZYeRUmaxJpuvuOfD8zz9qshVsVZwNfzfec
1XR93P7RcsbFCl2U7ICYJFb8ljJVLG6bNFUI58GQ9Opy6AOpvc6msHifO74IvW9JvUsilutvccsm
0WIskAuuQz9rI75on/0tMerpcQuiIhUFa9eyVb8QmJDVqu8Lyz/bGtYR8r5MHGutx6ZUzFEbp0yK
JCdLaClzfOCnFCZ08NCB9Kn9XcoZvEiv6ChtYOMHcdkq5mu6iTiT9beHMbvLc8FXefIS+s3o9lYy
KPE5uMyTQQ6lvetTFOd5iIPG5Kbopm8POSOxI00R+43Z8l4+vZWnsyOMj814f75ND+X2gp+RMLrT
sp/obvIRxdqFplCxVfQh3aav+xh70vrsXfA0EszfPeMu69TXgCImGn5gbTvb+To8oK0cX1R8wzrp
8+73nXwWvX0MnfC9vLPOMEKADHuoj+c4AeLcQ1TacYBMu6oCkOF153GbUnjIMIq4uwfyYS+OGUdt
LJZJ23pwlPAP1ci78Zbz1OPGU2Bx4/v1fqlHOUl3qZhwZq2PzfIn6bQhaCXzb9Z37tySHQuGz6WG
3HMCsnE8nad2v1o0jB7FJ61+rNGzcBsZdUhaZOVqMf+HdHPJUBgZqW39b2AJN1dQ6v/79R/Qr4Ap
VZ/89ZXE/b3ejfRxr3uS2bbZXLGhdD+eZ7U6X2/OZSTZQWeG9b/J1FHQx4EhMsKWpoWxJrL55qa5
sTKyAqfUgx05Pr7movSC7+kHHsW7r4GNwmxitkD4DkNyjikfvrP6Uf7rrSUCfxk/buZcMk7f5Nh7
camFctG0zL4OVcc+/N5CcoGpe1bK23dLb3Mss2XqRpqGBTJepTSnTW9bGsMzN0Ry+DXKtbpfUMcs
rfQ/aP19K9vttbnhtlm7lGR7tRp7G7e65LHixdL/BF3lBrUaa54Uzf+Ax+h241Xgl7RyzQLhA5c6
wWNZw/fHKa2VsOuJPbrDPbx/XV9tLaPqavqXdMyOS6vc5rSFbEvTeObGSf6NVo2wrkvUfIWF/Otq
m3LFsbqiplqe8n4SLTPvkqr2We15mz9yS0uaZvbLemW5ZY485x2Kzw1DL7x363QvWiMvs+eizC81
cx3Hpb7LQy+1qY4xFzoCGfXIc9ovNqW+PHMdyeLtIaq6kGbRFuaVUX+1y4vZ+zt0pdTuMJmn7yF2
ogJNf9LU9W5lqoWbM/cMG3JayGat+1qZ9U+XkcYNDlbMr9M3VlpSH/KdlZ0dUi7aAXH2RTkVAtWr
v+yjgWVgX43BpIEIGoO/N9Cn5+h1oUeR2c8Nd1fENGlfc+lovLPBj+Fb3lvFW7472cO/y3IYaXe3
vugHn0JRH+G0tkJuk+J8lrtTmNEci1hac6phmsNbbVMSU0pDCdk5vytgvoq1CRoPCu5hyzpN7q4J
jVrVRpZEHAGR3ofZOaW7WsFaqVU5nsPCaLbNF+xRSnU/0ph3JyKUFNONWh8EeZaGR+lSFr9ypdhZ
xIzZVScp8tYMWfAu/ou0VHLa2R5P/Ts6EmGpKVSzlDQ7XupmUcdVkqZzPGrzH9SD4AWHJcGauqf2
2Wgsl9q4ggDX9v8W6I0DnUaSZML/tu59ysBksVlRaZUhYm8NqIY5fEz1r9hQ8OIpdjnV3F8rm27T
y/NsGA4Lekmvr4UhD3ULYTasWLMwfa8VtGFeFC1lFIBD2aL0IkOBvicLV97gIIum+fYhunuKHzmj
t+AbS/4WvxdJRtcZPzz91gcvgoyeocTgCSheavgMDMkLu8BMsD3QCAr/iNzREwB+2zFAAeMAdOWA
0SHQd8CwApjM47sLDgplKPEj8UQ2vG8Xgrstmr3ROwPaii0elu5DcM8zn4TnkGlrEB2L2KZB3BgY
5bQ5gH9+ZvguK+/S1R3HcUORpV/PqhunNWpn0vAecw3jGLcew5ZOoRtzAVvIxPIIZy52rOspU2zx
tPvBHBJ0Zf6fwoQPRjWuDTrXzROsWW12SVAh7/Egnu0WqFniD2EV3LmE07C2Sr7rrvasNi/RI4rm
YSw/fYYEtG0vdtGVG5pHXp5WI5/UY63u+3BJbbVfkox0mejbhZ2S6tmojOpmzHZR9pRr4ceVwr0G
VCeoIK3QFvEV/K3yBfyYKtLRju5H5n+BTSX9dffaAspD8szm5lM4Daxo0hDEkr/kjpC/eXGbD2Wr
bFtwXAetuKuGyHP0OHKBhB06WUarXkwGRE9u6cW1+mLaRYNUH6pNxnpxQl23rrO8s/npTt6vZTSG
kN2DzrwL/zBmKb1zlStUE0/DOYjlzwkUpH2lFM7KipZNhewgsgvwQqb0R5EGKuAKm82yYrVKlP+a
kmlH94OPsDmFHyLovUh0AOgtZh/9NyLMAWx+HJlNK7IA5S01fgI1EJlI1MQGONUPF4QjEjGx+VWh
ZxeEqtRnfYvQHjrDSW4kvhlVabnBzI9r1Kez483bHuwMc8Vb2/j+r5X0RxUOKDYSN2xoPuIFNYwQ
rLE+oD3iuEO1GlFutkTw1gru4XwC1jfFgIHrUCwwEWRDFYjMbDyEC8ZR3oTc4u6YiFwu4bTV/50A
E2Dcym+O1QfxjWxptAZLgdtgBFr/YYtHT0IBZq8S2I7eYeec4AsoiK+FYE1KD3xjXxStVQyNOwDn
CRr+f4f7XhMM/2ZMIAWyvFFnBPidb9+IVe965fuKjX+0rKK/5J1urDLwmCwXOnXnFtr8l/E04lax
kUdO0EGLZBmnVx4Oe8wt68m9AaZ8noOOpoyefxx39C3GzXf08+UThMnn4oUDLJ/m/MQTHpQHRC3X
0Xx8sdnvnrUSLZM8CFrWU9r57uzDjpeveaDkrRHxDBr1o3XCy3Ee9cyHlY4eROxuw2zOF0CtuV39
CRbzqomT8pEVg4SyEMv4j6/P6TrDvMboOn97eQFz8Y74yCMN/bwLBEIhZ+cGlcx0ZnxHAI14X/TX
3b+O+rL9YOJL5tdzJLRy/VbbfKSs/GXWNUddirq4+HM2Hq5KcHeHPvuj52pYoST+l8J+zQWSZWM9
u5BjTsbi0v/lpn+NmWgZ5KH5L/iD9zyAvoDmaUZxRIjMjHkeeQ0ii5Twci9QASVOvBz1ytx7cUd3
0Z8xgsgi2O+9BIG7ml5DHkaYEUzjnVqwKw7DM8WL1gXQy1qe8KkmeK2sEZlrbPP7ip9OdMdY3axv
le26rdB84w10HgwHIT1991gT8TIlAtD8mtYiEKkc2b0URhv0EqQRSj/tbJp3XH/tSJEXnraKygOi
f3DrZ5uE0J9o3rZ8zZpuWNEaY2llbgZDrg9kHtjZW9Oabt1ju5/mVLipQHK30ueXsOSWmeHu9fpH
XiJv4FnYT1myMLNvQKV3ZWFqPb97Cb81t5zXdDO5EzKvGpSWAulZioCEDcEK28ogUp/gZRDKSaBl
07DArYCPv9GWwyPqzYbhSkhTI0VHP+Ithk/Ev9k8UOEg82fYb4tk+VRo0q3cxKTamKjt82JvFZX9
K1raO6KV4IpeHDkZulQ+u1bSJKinE0/HGfUt3iKzoZcws3flNZJpbYQ08nzti8fX07TTqTL/nwZl
gqyl5ff/2crdCSBpbdZrFizIuxGBS7fsPTNt/ceRTbwqUaoTepzdoLswR+jHFQKC6UzY2jnbK3tN
3/scuJDx/kG8ih3vv6C0lXe0ohVTtN9uhWwnZV78QtfKEG3MNsuDlbsiaKduspVAmt4pMxrRdWdu
xF/wgjRBzOyj1SjQczR3RkEwxvLJjMVjXLRaM8FmnEwXHCDqjrl6Htnx2S1qqJyz5pC7Rem/YfwP
KD+ayzW1CKpAbnnArzaQJPg/oRgmZf2VUF2+ZMYgpOHt5X6iRxIUUCP0jketUy/c7tN7hQG9MLXs
VSlRg8uZhse2q2vWiRmULyYyTGSqty8VDK1l3iNGYR3jJQ3gK4KKta1ZvT+JSlH7/waFedKsPDZF
qvJRujZ/vuTEk9T9jygzQZ58tf8DcniZEtDMqJXCbgmp23V7l8Ng37ENcY/Fc6QudSRTMJdcJrNg
Lzg1aUanBC/UZ+w4/wLfkFuh3nWqZ8wz99COHqDgaM7/ARJlf4IGXsrWo6RQ6McnoeNiaSLuYYAb
YX1Us5QzT4qr5qTv/RgmsrMQifwD+sSwQxCihQmvg6Swwz9/k7+bxa1p5/Fp7kdp/L9Cds39CI17
07j2fwsbZ1+/qnITzC7XCqATHZ50Tag1T3q+3qaAt1EHm0aLdV2K5n+C80Sy59xKzU46z01pk+WY
sO2Jzv+cYr8sde5GtelQ3NQSOdAJCv2e3SP1Z+OGx4ditx9l5daPlIK/fqAKP7rsC2MctbBknnr4
9U9WX8TvARIU3/YQVXlDq8ViMbLt3psHMJBKLlIOI/9fUJIyYbnpfBEeNfyqhMf9GX3UjSpIdurw
Ar9WPvxOq380tyjoNrKQdDLarNBp1Rtt6ftPYCn+rjobUWyofpVdTKjRVnggpcH+f0G5eilVRYsy
hrs3PLorzYzeO9T48BbjONaAU/qWWMrJe2v/H9rcAiiOfmv3TUKQoCG4BwiuA8EHt+Du7jC4u7uH
4G7BXQaXwODuDoO7uwS4ed/92b7nO+fuc26dqt888/TTq6arp+bfvVZPoN4pulydW1rvNH2W6cVX
cZNwPK92bitpbYw1uZUvTKfIwuGeiL4Wja5Km4XfIyV/7/XtvxHf/jQ/FHZkp2Qut/JJ5YuN8y1R
Lr+97cbzhYHj5kt189CzdeLTcunqBUC6i7i4K+u+wYixu/cetSOSWzvgbONPtz584a3t/9czjGAS
Q7jKvr9G1w1xA0dAlozpUnoK3mNPLftFWTXfhgQTN4d9gVUnIutxu2rC/EbIxI+U4MUmdA5Rni82
H+SodjlP9zbae5jOpVaimzdgL9rlExFs1SgUIj5QC3PRMqMnFgshzi4gahkRWEX+6ewoDeCPwzKr
WV26KlMIQ8w5RSCk+KiTdmEhwl8J8zbkZ2tyC0C0MZCiCzzCWAw7MtluswuujCiLe6BsV8l9A+e/
chIbwcXKu+V5myy0lbIrBGLbUzIGyllR4nq7QllI7qhWmwKkEFUtewfVjAxyB+UxJS7b4EENAwfV
lAwsSrO/7cy4Er/cM/Dm6n/X+GLccCj8s2jsOKg2Z6gwmiUO/xerwCG3CnS+mhlV+tcN6BS0qFPc
m/q1XdcFimkteqILqsq9fdxHxOeYalIovONxAFR4Wqym38edsUL86sRMfOivjFJJhn+noJFc5sah
RXvhSqxgrSm/HVb55YBVrQ1LryZle4Rie16cKX4CBG0rkMfiu88M5IsRs10Wx4lH/59G7cDDHQWm
WA/3meF8XeKby2K14B7aL6qkNYjhKt/KhQyxPpV9V/8fo5T+aKDNtj15LIH7ysCWGDHHZVNc/wnQ
Zs+eJ3bZfWVsy4W48aop81+IxJ0JpR2ZR7tQfvskRh5xzfc2O2cQbK583Avh5Oh5xXzN3tEdaee0
b/V2dfCQTenv8kG9dazODnwmJNxeDwO6p0byah9vGI70pkQCcIwY+7SjmlN2DdMiLRgL/3fN1Mfk
kKavPQWkjCj2FmFSwtr4m/9NpDhSkCIFSDZk7NWOaMZ0pNlVREv2aJqBFBAz3tiVhErxah9u/AvR
JFVTwpZipXr06043Lo5YE3O3PyE84rgM+QxR7imCs3gxj9Aq+uFucXq+TUwL1/+uYRXKRD+MkjcL
4iafwcsdQ3AWy4NxDkFzCkFT9rXirZJeYYzgEVHIaB+/M6y8efE5ujV2dW41cPVC/sd01HGSEmkH
6Ag86yb6UtFvwSt7ZK8ZO+2RMbdVT1x0w/nfRvlnUy3Zc8+mhOn25YgspZ/z/xKlmddsLIG7V5qr
1S4qRN/Fe6iZJz//48PkeKyPz/VVfjbJ8+/9PfF/MYI1QuzDjKLBVWIu1JfuSgmoAQ0Uh0T9f8vI
qyibMWfChnyIMB6qyb9qCpv60HBetQby3bGuaOesDVcpZZ5SbmGjjfD7v8ZYEE5zFtpLb6X0Af6F
AAnQZxjVixsJwDai71OPqsE1+n8HW6VCjCO/ZpvgLmX+2jInaOd8glqKFa7qll9nZKU98c+Ged6V
reZ7sKhY08yqFi6pltUTKWuafH3Oj2GBgIAY856MnYNgGyQIi+fCpDuYy8qZ2HGOFHNMwe1Y7zQt
xOSu+pg4aRVS66nugvbqe8gOqbVVv0UZ7jBY5KB/CjGBVh8TvPh6qCm7aQ4qHY7GZmn15W0nebsz
WseM5VljWKffcwx0Ci5hZ1m1cAL8O7yvT+huO7k6XodYu3lPE3aXXH338y1JdJ72l8Tn+VpuJ8Gx
lTJO1nmWGDrp+0si85Qt7JPg8H81cgDJy6IMlQhysVEXwe3M5GTgJygFOp3le5KsPu2vid/xtdxN
tseeev9rkUowp9k6SDvQ0p7IB/MxAt92RfHDg/lTT4B5fw/dKadeYnJVsEY4BwQjHOWUtdZA1tDI
XOIwYzCQt50YP0uWGG+K5Nlypy7f+oce3Qv/e+wXGQPfUp42SI14FA9JVanfvJCWYZy0L5Fty67h
MkUuz0UM1Sq7mmXjiYDvVwAgR7Hu1N7xNKivhibqS/65bi0h1kLv9GtuLoe7+sJ3IKH4evF3KVkU
S0UwqawOZpoSNJA47rHjBCuX5wZm/0MJyfJYfTvxaa7STbVh4WlQqfToxdPq7YF3yZNXdiQUdyuu
GnDz8yK7j9VA+HDcba4DDqpXjaVU2tuhSt/rAOWZPLmSbNtr6jrXBcH0QTxn47vlb/4M7lmoZbxE
qmfWrxS5zUu83mB3FSh+X+kZMkHpWdezGyeyaJG1AjhSzr2Usejwswp8yeNblXlFcHzpcEmL/1+S
kcYFilF0TPiRn0BYsE2NxaEIkOqlx6rDJPypjwObrGTHBdtK3ZQRkIl5/FfA8yrTxYiIqmj3PSDw
H0krNee3LkFExqK1zzdwJckFukkOgZjDivRSNfQFtQlDiqDvivkJ+AUz1AViNGySJQqS0YqghD+R
ZodoCaMkiiKtVMlfhfjRt9JALJ8M9Y9Zucr5hCvSuf3FtYw1tF7iWaPfkIPgTe4WwwGuSwQQs+1F
gkFj9QR6JFcKpQ2HxbWsDEzQD6W8yPinIJKh37zxoUHxxbfVx9mUe8TffCi1s4GAjMYdPbObL53Y
xJJZGIwSc8HJSK8+EspMhxJV6hS6kPSNs8p7Pn7VZsMlLLgobqseNjHtqqTC0gI5TzKvCKOqIFUz
rMOdE8Poa3ESx1tFs46dEfBuEnsjLXk91tHGwMTuiFq31pgHVOP1IOoks2bpxiPi5qikRR2iNHPQ
1UGCr8p1xFunjXnCWMeOOa79pU633xCvrmfxbKCU3TXupIHIoOJYnY5nbigKzGIEHlFnoFMdjkCp
NQwsX/hMfslCxvRHDMHSA8NBbdLqw83gjOVfYKG9s9gGlmwWVt+emyyH1b3ex3fYoTJOOhLjTodL
31lfii/Eo/nTWqB30OAMe7F8RbPo1IfEMXWlAU/XbrkDCqSeS03zmkaeydJYzK/aWCxOlmynDluM
sWP2s1wxWQWFHpGLl14pB4esmVxC4TIJC8ZBupLvJaOsS8oAklEU3BAvcvaBn0ki9J60ABrthJU4
gr8eH2FVSp5Ge3e3bL948b2Bd4w9Hdx69jG8gDKSmLKHlrTrHsYouEqf3Ci6RXX7dwv+MQaUBTAU
u/KGqBS7xZ26INu8W8o/4iLv235YlXyYXtwRrslKwy9Wk1rizj3p1YZZKclQ600w6gZPNxHc+VTR
7wIGzAWVleafi90EMXe2IO8UX3jraecJj6I6zugzcXCoQAnmlKGhzfdsPgS74iosDsrslRvX6C3j
of9Am1+swLd4il/5gKT0EC1/9V7hnEX8yWAJjadMOhZ/Ml/suhi9JjbcW/rYaJMY+666KbSXm37O
4NlExBdvUkvsOgm93UTEJ3afgXyX2zQL4tEbpgvIU4tKUG7ZtMKzY7rDcXhNXnk12TSJYd9MPDc1
jFO5cG7DI06CTceQOrGN18o0EDMUvbfMQ1pVD+80UmlimzRqhWvv07ZMFyN5zF+sLSCNu3AnMkzl
MOcJutko7WEW8yLuDZEv4gDvr2RyuxYh8mnFelDVLNqSrEPOHTZJGrpotQPeIz6XKTfInDdLZ5ci
1/1Q4SvqNun1aQCfsC9gLxsoptBqycVVFA3MKZVXNH5xRZn/QvVkzSEd3pFVXrOK4Xng7mmUfR69
3dFxFvrszf8G/vG3PSEhX5m4j5RZaj94UTt9FLxY++z0fDm2PRnDBZeNzEHJb+JJXxhC8KN/0Qc/
+8NrLq2sRNb6VfiGZKL9bZIvgEcuWDseyLHE5c532N36eJSt6JxL4fyhEiFdZdAU61IKq1YjaSSJ
os5k8HjGqhMalr3J/hvZVYSn8LRHJ2Xr3vO4FefugQ/njmDvLdTX7Em/if7GExgl3s1QIg5hU60j
UJR7ePnrmXz3VxW2UUTXQOQMBhizVv6mXlpX4UOmjb6Zd7+LtnSrzyj6n2f3kifNX8mg0HrfGvv0
Y62AxhPLPh5zgCpdkmHqVjJPAwbd7znYVS2XcVXwtGJZt57K6deyfZTSO8xZHoZZy2xC6cGumafv
oSU+yEHBNO4pP0JLcB2YwcQQ3Mm3YnFXXCS6stY9lNn8QRlSg1w6BqrgtrIk19nBcwfnkpMgZuHk
lFypkeLKc++8U4UPXOqZiEhlZTWJ43/ms6fGXpeFtReJ3GlJqEXBWfnaoBsPjynOccTgAkorj0sE
9E4g+ujMIhu1jGC0tIO0vvh8cbZRjEf1qiVtfratsoPIdV22c5WoUuGhzrnUgnv2ayYojZFZqzFN
9dnP3sdyDQ3/ymCLf/Ppr38xQsvy8HU2JXU2x3sTH2Y3PV5aZCeKNveKj1/lF5GUT6ZLbxksbVR7
X2R6b0uHVGcXfiLqqQYPK68O0h55JV7XRzQr9bZVGj4qD/KWGqfSmic8xw69MA2+BNd2nncqc2r2
dRLo5OjxWlD61hoyyACtEzVzqIC2UCS3We67NCh2MOpqHWQILD+OX+/AUA2HmnbiN2vp/4eXm7DU
zko5lJQHHo9JsrrTGdu5fQ7LkTa5ThvWqxsPl/Ss1cJsepYnd48uYLt+loYN+3AV5ql7ua6UEnTK
ggkRqVz/D1IV+kgzuzlLhPUBDCrZcqXjgjcPPx+9FL35LGC10loG3Tm2XFbQuZ1uUHXaha1RNUeT
/nB4TsTtFbrkNQVqELDmK0naHXxyv/TKyiCuzqrXkFvaPvFjK5CpRB2YFr28RHd/CGvzEmFEHQCz
OVhHa2uRN8Jtz/m1aZJXzQ2Uic7lsXOBBxAbBWR5LYK1QDv730liB2LfPtT0EW0PX+agVzUJe7IC
5Q7AqqGqzXY/bDoUOfRoSJLkb3hLG+TBorLAIseqvGPDTA8KExwll5oVdSqOtfno5IO+YactE4ft
LQdj7eSTKZPW7SFE9x9zGunOc6aZYI2x+qNCOqdJ2UzH1JiFUvIGRW+G2XlFzwrUhVKYhkO/Cm79
MtQFyUVwi25Z5XzpNPjQPLNFPZlxriDS+dBwtEW9DnWuJLBiokt1X5XOqYxxtUTK9XAqs8WpyHS1
RMMVNJepui+p06I4n1Q5U07gfCCW2TLJcko/p6F6SE/XXJ8iHOmcrNIyTEtknGhTo9ioXsJaPoOn
eohMxzXbXYItC95HLHPyS8wAbShHDukNlvTSdqr0Npbeq2JBSze1VLzKImxVT0ZL26XAriW3jLNr
5Uutyk+SjA3Fl4mlXgW0eiVDah6Up66u2k1VfCxeH4kKhhDHNaBKCo4qM9pYN7TZZiVp0V7eUVUo
XtbyDHgdt5fOfHJ7V04dEQNlAUAm0wvDJMSBK6OkqPHhy+Zar0r67OFIjVog0/DV3xt06RxTlnyZ
u8O70fVpcmW6mjdDh9HXh4mDBAfTAtlwj18nitTYbRNGCSxmBPLhHkeS290XedR2bTAdA3H1kFyH
FuzR246X4RzHQ4q2d0vN1eKszxkYat/GoYRZqSuPPgqIGY+SWbK3opjOW7mMmjZ2HaeNggLxrJnz
37Li/5G6RX12ghHTX1ZwI4WL9IjjtTCTmGpDLVOIapKtikuJjxbqbmLW9mCAmqU9GFttuEUzsgzc
pDk3q2kOkIxUUBudMpxJrKvMcNmppyuyABweaqiNt3gszU5Xrm0eBu9B6s2CVB53Qs4ri6HOOwA1
7ZLk9pwtxnl7pHH4cSwem9T8vgagsEnDb9sUVJksDCJd5VPezvLrYc9e22Cz1lFRIiorLsuZxoV7
oj4Se46Vgyz2wnNKe1VFsu73dz9NqMWjz542Gw0WcMsixuq5W5ZpFVO21OurALp3w1fXBGxzkTFu
r9njd703lFN6Qwr+Q+d5xWMfR4OdCAu2aLkr84w2HjywnsVGN0Qd3VYJdTlC5y0eoNmtVEaNvu4v
lfa/10D2estQ7hfBJ8TxFQpD4ggXlk50R3xAkfNuvc2wnt1c+rOfewVH1c1uzRpwLh3iMU9sf4L+
R1adK1vHnOeb17jntfY0j3TMetjmRD0JnikmO0kve1+nTJb3geOJDr2Vmhq/k8k4bC8cgvePEF/z
9rJXxXsidW4o1LwHVfQe9VyyhIpK7LVzh48ttfZxO52PO12jwntVnAKf/KKzKobvPVSbDIc7T93m
Ezt1f+Pkh6bf0Yrz9YNNx2GJdl8bXwVXUgXEFXaeXlVXD0sPDw+rg6uHOvLfRXDmIWwZa4sJ4PUK
yv96K8osKC/w+f2KggL7Is5bwTAW8m+EiTLKfQba6tMCk6S4LlNBEVKf/YM6zqatTV/Gfu+1c7Ha
jrnvesk6q0BbPJ99oLYkB6ZJc89fAr6wBPZLM5hUYLjfYdaBExY1h9waFI6+gjyTVVbCXXh+ITOa
wCXX/uBJ7S0AohPLBfVHnBp7LbvRAvvcggDEBlHi6rOZ5tUwf9ivgPHF4QKqulOVtV1VxeXTONfL
S+E9sfd5B6mspUYRo6TceJny8j9Y9LjnDYiCM3WzjXavDi64PDLukfcI6zLHrfamhx2vzwnrMsbp
91iHH0Yc+P5hIQ/1TjF4Y2YuV6mrXqYc2YujeyXccjPtIrdGd9WQsTJrISokXSEaHcxPbLWBdWec
PAxpDrtbBkOTVHyPPVRKSXE0wwMJJirZ6H0T9NC8reFBNwCLTpS0mlghnXBVcvyJofm1g1NwLCUT
VWti3OrQgI3J/qmDkytXakXUiGrI6fmgFaA+VK6Qhnw6IU5nSOS7tk9cFj2p69P2cVAlj2gZH13T
Dyzt1ChawVrvEmmKH9oFEXiC6AURO855+Ohw4+TckzFUyIdcgrzh49rDGOT6PTaXGEHqeUDWuKEr
p0zaPY9NJQ1JOyhAIb2uZ18Kz5smn0kmpo1f0yBn6TU+Lpnlcmq7+M5uBenpMwkqTL6RcUFUeUJc
YgRlfUPkA+/4b2JjH7SXmdRpF0BFhrHN+HS3hCbngxpHB+lDOFRi9xbo6Pm9mfeVA/X5857updKv
n0pmNmhTj3/2rMuttkzgPrhPCoW4J5Ym5SZ5zfyI1bw8mIa/PoAxPQJGlCD0Jtw7nRBeOWGbbNe9
Syz/pamqz8BXS8nHcuErTqksh15aFObj7ddCI7SKmWsTIc8hWpxKNiON/vzwhkIpKOLiz0dRR5Bh
iqJH5CGwKXyh97giZngViNypv4ep0PkJrjI/oZvMcI1lsS062CJ9dAv7gVPKB3nxpXMiGjoVu70Z
Tw1VOfzq6BbO1XY9r7L0C6w9xuGwEjW11HVRVOby3RHtpdYDNoHm52+A876tKiBag854DjEVLGRa
+j2V9icUquxNqTIQhclCHjwiRlqnMGCFyULwb1YakwUjeESItE5+gB6TBSk4j2+LXj8KNqrGD5DE
3IdgNGIU5R4FQCtIW3B2j6JCU8ETVunDlXo7xFIDc4UrRWw0KCzRhytOvDVgRAgblesH2AaEAPu+
J/9WSxjd+TypTf9ReFboghn4Tq50xzAvjaJW/5MxxJizEjsMw+5TR9GIKJuSdgBicdAwqHBO7GRy
SYjHHE2tW8WOzckvZuJDpb9lLqs2vM66xz3eyhudDbGmDy1doxNEHr/GN7DvYX9CmDZUm1BsQnnW
1eyoroN0JwhOAzbyYm7Dlwq9S/lm+AJPzsXvCV2KK5ayN5DuP3UoakWbgJJqCFV/yY65dtnol4sR
JqThFVdiw4FKYd8qu7xJJBIwgT8U0CmGDwap5qSw7K1rsQ1bIel8Fmb4ymrwBYhqNOvgSMh8tosM
7l/Jb0jjJC5LXAKBQ9gPhcsYtGHmHXwwrtWQyt8yy4/W70Joqbd/UxPCzI3QKg5X4Cac69Ls4cxI
a6l5Wn2Ae//rfUJetGJ94LoAgjaCMKJy4KE8DEiIoUnQGtza/VmXv/vCIsaSc7cY7eQKJPe9JQA8
0Y8WkQZKLoYV4VcgmMpBrQ9hn8BeEvRswvAQYtpHce1anYD3Qbn75W3Hj6witdD8D+J7ccHKUcH2
55hRoeG0oasZEJsxA4696nTHKLUZRiP8NsSqLqeUt6wG2CMh8waoI8Hu1VFPSRDEREgp0wdC5dZ3
oblvOvyFKrM33fAj3F8JvYbBw6BkiwBYQbscxpnApAnEFPh4d33X7ZRMLpcNN/L+5XVBXIRAfWbj
YorjjP9g8A+UW2x4TDzU/T5AAIdh0hK5KeSIGX63G6iOYvkZfi3EdV3qHrEjJLMayQVCvPBnkaOR
VZMAOSvZP2L8g46P/AI0GaFI8nA4s9ybPf/JVtSSEaYg8pgQYF0WmURyXesetQOeMFIBMfxpM2eG
O6sRBbvm1+Zio9scQ5Zz5N7KYUVH9enOAs6jkukbZOWj8n5OEhijDRpctPh10RREoC22ozFA/G8B
yh2Vc3BVbjbFbJnqE9Pvdhn+EX8za5jxJbgsMArQksBtrmNd46mbG6lXvru9QNuMz+10zkINSXjm
41tmDP6vCfcoaAhCm8utwuuUvtltId/8K8lkVhCEVbA9gZG8Wb3EJMPEJF3/BVJKeYhI4iDfuHG2
We046+Je6iaXggwQjelXJDOWbkDyBlYKXFW32OQ3q4AtEBkddxxW5kDEmIGoo/okoerXUKzRP1Zk
k+AnU6mVKlu6yqipSp3GrJV13FIVQwjFORx94E71u7WgxGrEtYDZajiHdWs3+Lnus/W7c8bywJtz
Yis/bTe9k3meCJAHVVyh6+4CkY2axiPRocSz7D7kwe4mik/IZD9WMGRIoG6VBr4YsN/As/M5xmgm
2aF8ie4uzG+FTtGEuNSVv/K3n922fSK5XI6obAT7JWb/dPgZ3Kab6szXvjD8PnVceLkut5Q3GKRI
lILs0iE01dImn5hYwnFS+/gURgcCEY5DYew+AjnfKwyEQuTfjFC18qavZsmUDyLOyD8t3mCEA1L9
67pJO4zR9WrDmFL9ERUgCb/WWCyFGMxRrVUKF2OMqJpUf6IrsYweuWfm1oaRaPTE0m+KY18Y0f/N
+wujoEFdFqp3noPaxbfpkT9eA3w6nWG/BvRNvOcWtE2ExLPHUVmTyWk2sGkq12X5FW3gpcBeNXdE
bSFOhhXRLGsOHwkNkQQb/craGkyFxLOGUlH9oZ+bKiAJjSKBacf7lkROvkGFsnSxBNSp89dinQn2
kCfBFxDOqWL3Bh+UyeidFE4gpwkjmX8QLrakBiIvZsiF0IB85ZWeMn0OJYr4jcuQzRDPVziBHKjj
0RDHrb/tmCUzkekvaf22MSs3ot1f2inwVwZv6YNEq3GTfim6waSQmHGV+3EYUJR/mhXSYP5Qa8Ai
/XaXvWclJAs26+zjuGvYHk/PFVFeNukj3n8rsaSPuP8s+w04s4oB6wJh9znDq0Ca/nCxcLXwM+KS
fH7Rr47xnYz6AbDs77v8PzYN2la7hpsyIn6OeBeW9yaP2o/6v7EiHZp/oPbHlfwc8iks973hf2PR
KUL/Qbh4IlMIBMENmeUzhlj3FjOiGATj/Ce+rAiR6H/lqwxVWiGGzHR44YHItFNeifBX57BC1MkZ
0jRuEaVQ88OPMkR/hwOtoYP/A6KbVzGEbgRr/tF5xHGNxA/zVK+P23rZv4/ifb0vq+RebgY7+f4p
zLsx/wf2+EyecBGf4cxyccf80SjOGbzgoWUPIrez/8TNh/+KuQeazFnuAe/X9tDCu4lr4rQ14WnP
/xvh0iqZzBFMZ4jnuq76TzLjPIRUaiHKiO/h/z+sLhkOUw3sPxEXmTzQK7W9SeFw8al5ab570qWb
cYGBsDZFCttx0LByje3CVpnrJWDrBIS4WM6xWO7Kko4i3/sojyvr8iShOs2qAkitIEi1fv8P1fUK
8VJ81rVRzR6MFY34nXDcSMDfiZOdRXX4fcfQmIsGbfPMd8TpLYtO5LardF+TT9IIq1iTMVcy/d6P
He3aDKkkx0EHRo0xiuHmfw8TnJApiIQl+uWnAP8zO5JS5WX0X1ZQUokTixl3KisRNDHybKjXdeeH
KFFtsTC280AeqsYMaSS3sUIo/eH3/wy5p8XNHvelSTIP8lm9nQpjx64nU/n+Kdxqo2VnFMBLgIg2
vceS/wDEMN798DcGxrsIqe5fX8Yhr+73/GivexuvwN/ZoVJhm5/ymoJwGUkl4eTQMuT5ZEkjlMJ+
DIbGDYbC7iv58cVNTg/uM1aS4oc5VibYIk4IwNNos7RH5odtUudxRlDHkEnuug7+Zhwji6gLS0Oh
8YT9uqcpNab1tgY7GV0U72c+snYd+VkdvAI82I5IAVOIG7Gr113EnlghQxxzD/0fNgHC/B/Ec4I+
ictsFj98ifKvAXGCDP+A+QdaMiL+o9wvZNThYQ9ilwSpUyM35z6XWn/ex7lOFZqLo8IGNTc9eeuk
f+ZyklHHIESQB2yGrQc7XnQ3u20w/IH6O4KPG5IP53yLAqfbpraXfyzT+QUsX8evfhxCsYLyPpz7
+3ckYBZ8MMuShwCWFlq3ANtb33UtvLbd1Np/XA+U9jB+NZ2jhl6g8q119fPcUxPCB2+tk3oBg2zb
hR4sBm2xrhV4UX26++Xu7z+Q8G/kB1DmBBAqy/N6Bcd+SvP75HCOzbfW3a9174ZEYruxxeCFOWX+
Hxy9d84OUhIobwy7KS58+JvZvyj4UFwwWVzwt6GArzrbuOFt6widvzt/JNaFQo483bzR/uehstr7
WSxBZ1F5HfR/zdZU5crNd6PQzp8iBhZ7IuwJbxi4BVlCOPkQIQbvgZWG1PUIiAwBQpELco7jyJVV
uVYxS4ado0eu622XAUI/c9fJBPuwywscAsHBWyv5MTx33d4TcjdiizcuxOs3birH0n7095FTniHz
TL+UN/LutTGzIzcdFbwYI8ZFL5qp+XB69/4Pw2d+Za9TKHXHkmFLiwQBtYdFYC/vkrBh263WhZR1
WJMEAa1PPpTx8QDS611b1SJ6q8SfnD4Deqg5pIgtYZoIKfmBQCVXonEZtUQaKQKDB7HNVMERMQLw
duiUqzz1kMzygTqbD5f1W+U9PUG2cie89RuH75pvvlSs79qZeKuoaR6I0RntYIM1bIJjt3ovMW7g
HVYEH1IftW3Upi2e3TUZk6lmLTTPJI9YzXWmHgnqO3QWHJI1Ke4mqDLaVopCBoBgBbGmI78hKjrs
HKX5Uv7JRn6FSx+HPUbJ8SKnpBWcWCUP2IKzz7Ev/jxZmzGig2cuxwK2dYO7at/bzyY8/yzUso3H
b6Q3rhODy7O2N0Qgfx8R7aJsKvKiCFBtoIeUDTqjRgsMuVtsksu6eMFK6PxK1RqVFHwx71gYmfFh
eak0QxmwxNi4yAQ9P8L+uZy76FkMF5SP4PcBe+Hje3ihdSFcxZy0JfpSYbVEJpugvRmPC2DbG6Zu
ZbcPuiFq+n86+ulUSDSoauHnLahlaP4L7sc3GPTVpAioQZ+RZ3PhZoI0vyOCSVH+nnKicwBf/f+9
E6nIYVupQKznO7dsgj8NtkpBVlq3cIPLCt5bd3d7qxtUcv5pRDm0XoOZQDeUixlnt8vL+dtZ8dxR
Zi7PtQLJAVNZ8UtERO3wUy1t73Gd5O2Ch2peCq8Ljme5om5YdpwJEH1n6AfOlsmlIlBPlVpJtU9u
eLi0NcpRp8RD7LNPH/MsQ0gBPSQmGa/LrWODehqhV46g8tAmqDlLqBkAygdg93UpMRNT/hIZCJD4
jhJvgNhWchn9v2xjSV7ekJS8MyK3Chithm3o7q9G4fOX22BdQPUN8ga1x8GjL6DBr392s0PI+44W
mitQgaZcHF34/rYKTz59NI3QUtDRHD5zXTPRVnf8QkVFfywQNoNV9opBl5U4/iIlqt8YuMtdWRGK
8h2JpFus0vavY+y3SkBHmdyfsbxGj/6eYt5yFqOmKqzxoJht8NwT+/gpcqKZlP6S9AfJE4EEdJwH
SuFvct9+DRqjhbYQi5XdzGGcfwXC1Onjlct7VoAJh2c8WsG01ctlXk+gGCKu25BWN+9ObmO0jefc
c+a2kRtYbT2ESH1AeTCiMzW1smA1nHhW1edxlWq+r8oPYx+xnMUE4KKCFJjh3NaIslxD91Y33F3/
tntsKais+pQTembsbaiO+owjgQ/Vb7C7ydSRpfRp2t5GTWqg0q3LqH8om3mcqFL+6vTvg3VrLppx
SaxQ/GcCSgimG36Wv9kGlxuxrh+OAW3beyYIHTOKbvC8PveIX+p//kLU3yDNitt4gvkoivkk7T//
5PsE12zIG8dPeRdZFj6caFiZUowdSZ/yfpEZj7GU+oUrwjdmMzv/fo/6ZbGf/+nejOT1eCvb+3dd
rO/txTjf/4XQZ1OrqZ5/cpyoFHdcM8qMoa8Oe0sj8iIX6fwPme73Y0Avs6wOyUyJl9c4/hc9cfEb
FucEq924Xuzh1TzAQ+135FtaYhvAv1GJi6YWFSp1X0T9QhPhG7GZ6gWMjzW7vJDmyxrsZ31w+9l7
n9N7n9Dr9qPXLazXDYEkVj6K4/zibe+9n2FZZoTmSTy0XyPqVs78gZqbJ6IhJi8433yd+nFe/PVx
X4/k+Sjf1/u6KvblZrKT738RzhpegwAes+L52MtGJU8WulUSXpZpl5PpfB51nClDVzNyDAJGjAJK
u7k0VytWzn2ZyEozqXal3PiVKBYTuGm/WLX1SmIQM8sveS65uWVtPnEMjG4KNss4JWWHtYychV6y
Jsy4TGqefmpPPVq7f3wTsWHa5i2Dhz7PfAbNIcTPdYyxv2kyD9Xdj9Y1pxgP0yq5qysdr12enioC
MezoyTU0Z92J5dCyR2JWenctnvbcKb68QgvKUHBWXy/uDqayZYFEHJMgucsNouuNfrrMgSQT7fZg
q+ZUKzwpH/GLxZ4qBQcwqRkHFb9SufBi0jXphdb7oh6VhKa0utU8HnLpnXaxKLaLCtvnGVkuMaeC
12y81QlLbrWXkUW1BEqO3A9SnHTr9MJBXK09i9milgZhp2RvKNX1hT8SIvgjGXzL7e3IaziO7SNA
wIuyYOU+x3DaLQJVAcScOPq6Od0Q+yDvUxD+bbBCX724XL04/pv9v9levYCuXqytXiyvxnf6oout
Jk0pvs3npGis+RGux/qg7O3Xwju80M9Mlb4/ryoJ0OwjxmYD8+Y1N6g5GZvCsaB1fn+mYRNA/g4T
DwVwCJgWy2FAJb/0lxg5ZO2T7UUeWfSbFWjlGa+x2Xycx9URFTe19DPvIYo2L2It4xL7mlvgGH4b
zxBc5jNvHOrl10ry87d+DJo9IQR1OR81Ny5ysh8n/mnPr7pZCpH1Qoo6QTbfGJ8iMOGaRoFsqsc+
jxpfMkOEg1dQKpyNqOhyYrW33ION7HTN2Btd1Y7fVcFMCB0eVCoJ9KIg7vgUqx0uXtlDrrYZR3fR
kVi/qJYp8TuSCmTVH29IYblcJSma2Wlx9dZwTn/A2MpIfrN11vW6Msj+/rhpqd47q5WvaPXjSdLr
tItwvSf9xTL9jGq8C8yMWxZ+ZElNAn7gzK3OLDWt+9ijA9uFtz9azjY8BKONVWxma+wzL3vz1TtX
VQezlI4ejLq+TCwgVn+v9eb7jKDI42Mp+beJdqn7Ezh7U3LOCWgfGYgxA7f/+gZGep6Agr59JYkO
n54Ms+7xnjYoTb3QGFxkKkf5wF8XNUWI1lOlene0S5fI53FnrHsEw+f80zbZy/iR/fzzwGwkqoKk
e+IbuBNyZUGWBYRME409d/xJE3WRUQ9kvJb9TUxTdS5RrXxbsiLI6RfcUTf1QOpSKtdV7NP7KB5Z
O3HvU84uopvmLbOEStlsOQrXNT4Vwc7h5iuRy8pvl64fHqfX3rhcCsQEcsZQ0BJjjIa5UfTghg6o
xw6oB7o1UjxEcoffRCpKOhQEOe8Pl/kMmpFfWLtZXEq4zCpttypdPyEzYNPwN0MRm8/e33HN2CjV
jfEoKMghq0DDQzfQ3X7Mng173BbpwRjQ87AqPHK2bmOyeqfxYW0wGc04JAEXZWY+KKtBYSM2Mh7H
RvykcT/EQtRxxdtpVDo/bCs4JqTlX0qIsSWl+EY5A8cYubswEggZ7O+RHZV/dsh6XHBfVwW8qEx0
RpROUvEp8QkxiBeLFiW5XNdwgxMUpDI0P0G/2ipBJnvO0Cc7ER/VBF9p9/Vgn8tyfLGuq4S0KUIi
sjYN3N5TRjjFwf51R4l00iwXi1T7VPduxI7EUNVP41R4RBMibatf2Fgr51otd6affZtwVqwRdUDH
IlJG4im8Jnm9iwzahJtM5F2a3S8EGqV+40iCIMYRFzN6wCFyYTsC4aERTnUMTv7Ik9MjQXHnnF8e
zabLkFSexKqWODwcKj6xqv+UpeKPdkv2qaqkTVRVoY32eUpoo3z4IBI3ZGRm3NO4BTu+8Yx44bF3
7hIsln4vcasptrIH+qAmGcV+aAoaDSOJw0nZQzyt/MKurdoa5UcLwUkiIFWRHNRJaGNzPytqa02m
82ze/HJ2s0OxVKavylj27DbShI5JeddHAyZhwisydt1UFPuNWdFjX1JwXa6uu60uWJZ4PEJyVv5z
lvO0PoEYh4BdPFQ3qOnFSCYxah3Yygijp0X5FUSTm8QJpgZxxlstY+K7Jtu5ZrRiuWaVHAov9wB7
zaZCjVZWM1qvmp8C2now0ve9KZ7uWXgYY2TlD1m8ucSsR0sYspcYcQWxJGJoe7hb87j/XChHkw+m
zzA0lA9m1GX5EY2191dUZJdhxVLmrZWnRcLvbSQzCtt7pEVp7NO4MeowC2JsU1c7tZhUO0GZTU/Z
5XK1Vg461E9yc4GAF6Z5f7dHpjF+hV1+4FnURWfq2TbPq12WaEQcbYCY9aOaGqeYN8jyFy/KJLLa
eQv6Gdtuu2nbfMBVUtt8xJ1mPBoyeTQ2/rkNRgyDBsb8tx1kNIOZ3OfH+gm/pE/ObJseRpUcOx5I
lY3b3DfViOFT4UkEyonf6hOKyyifp9zvfsb1JXLLq33N82Wjcf/BTTDJn/lysOI8Zd79JJOLN68l
X0gxr3nR4rypNlhS4NdBKVZMcLNv6Y1eXEph7/r2WS5KniPtShdp7enCJvOiUMj6Vhffu1Kq/QZP
Cka1k9RaJw4X54xj95myDRp1p2VXQXHWuPk8FxWrUM0OLuGILnPOqeQWINkcGQPkk1q6wxrZiKT2
JVj8fWyTNKVCWBNNhUK2VIYaWRsH3aMI5ce4lBqHxzhJfqFriMyYNeuY1hez6gy+n1Oh8oYqQdIx
7T6zwNeFp57jwe0m37b8n6XzLcW3Z6cfsjSzH55avbum1wSDXmfbu3SIgm+gJ2hr1jSg56JbBLDO
YPHrqHf3qrVI9OuJbm4SwSfyx/FjHNXN4W3uFy1PylSC7tfDDgmxG/ZLobawb9wpYdPfi+ekdCOS
P8760NBtAfLG5fM0MfI01cg/MpHloVLis30pvWEJuPiUt8QULQ8UM8aXVLYUUj4C/exjYiZXA5Bb
p8Y1iOmMHZXQpcZhesyGa1j0ltd/xbdvB+ykyRfSfN1q49rRlK+k2NFUqGRrpQxzdLzQXjXZdPVu
iNQsXlVOsEFS7h2fQMzOvy2l8NUyj2eXXylGwW4EoYVbLNlyoXY136lIbXu7xUGLZahjKQb1Si2f
+BMegRq0FwTf4OPVXh0aXqrMuGVfjE4wwHwPtBdHLv1uKijJXokf8+iy6jPvuXyJejM3iSclVqh8
ILNPkw4c4eK9ZZtqhi1u4kBG9vBYrqegTo1NKXuBEWxi32GRt6fGzZwy0baWKPVwhtlz31olty14
wbqbTS7JLlWcJTfzxB/NwIJLnzcs0SyERcOTcqMx+c2NwLCbAQ1hnY9Ln17wzW3P5+U9tTzFW4We
RJYr2OZ4DufNia7HHm+W2DzU2svmRDs1zip1ql6F5OZtJmxnbWdtZmznz2ZspjwP2uuJPUieiU/2
Hr09+Bl0SHLQJmym4Q8C65dvch8hS0SPzN4pLkV82iQlNzPZE/0WnXP9R0pg6D7TUZUF5BrvEcgg
rJfDNNO3X3Z9V2/vUfnSfNvWIcyfMzrP+9zUIMY0NQ5q9gh/qbj1f2nXLfT+qTdDVx/rTBF8WzJT
MNMgJRUCHjdh01B60iwcUraOlY6/AbfXllgVEn1nMJYaja8w0WKgrUpQs4CtDTzO8SbnGbSsF1rU
cJmMGay8FDv5eUxpOyc7TFwbqvrFNq7RHJDKOA2uq01uk6JLuhvy0Qw/Zgo1L2ARNgXZPwR5SeI4
/Mj4me5Qm1Gu5ZCVUbV8qfNQeTpwt/Pk8c2Hmn9Gp1nBZh7ikAwsnk/s39ZoT237nOhTgM6seM0o
VjopdmbgxNpy4B0N6FN+5tvC2kJ7RNgi3zLyzqqZXqhgYrvFo7rZ6cMTPjiDz/DL9yWyg6nsYJXn
lVeCYg0gEU7dwaHCIzoz2QHttJkQMhAzpmLfj72PuLZ9ZwYDPRSHgcJ3zMvBj8EPXbP6R/pHPi4K
iOYIMaFqs8M8ck2zKF0jmTrXtRBzWKaBnU3m2AgkLNjZqhJj3DPdM9u629baZNhZzliehlB3A3fr
aiMf2h7yvH55LWZQwqeyjuBdNu7SOzYQGo6x7Q2Fjj7sfnoIa17RZmQdSdyVTLXoMOmgEE+zHNV+
aHrwbxaN4WhMzR6k2c0eIbrkukJy7PTqApp7ODTgseU7xLj3/BYbY5NLB3BBf4+VJ0QyGBw4RJto
yGzzqNKV1f3Odw6cldnV4C0nnqrzMVilRNPorPUYJlclKYsF2qxartLJqd9p3A3Gq/pafgeaoNSE
DBlaNrFpP84ZzblpGMrUUw4Pz03PsYbYtJvLsCEfYVmmGWiylsOGWDPUYuOxVVDMfcpPugkBj3wD
q2qURX21rAAvFhtZN3YwL6l7VsCIwdNBH9eaxmjBjHjt5ZJSeHdLFceqYvyt0atjTdCOpVN9oL5r
Aw8BzAnBcWXf5yfK1vSL76uQUwPkGttGXxNksOcSb7SBi+0T45bCE3FrFaC7A9oBHagPXYBExd1u
3ZpvSXjm8U7impktL/Yp3U7f1vW5eZY+18aZyNXpsVEusx7j9U3fWnk2XETxjutaAS2rahyjko/B
t5pbWE86TzpGac/tz4EXpd5rfLbSjcMnDkZi33+ZjSDjC0JSiOoDYi48JlDmALvwR7BHeHSBKAHR
USpdlF2UYjGOsdNQt2W8Y2T2NccQbuFolLH8MTvyefcR95H7wPiDqK98dmJc+VGxGfZjnEb5rJOp
5lYOlFxKUaNjynuufex7GHvjfRJmnY4L55nkYxJbAY4AZWhYaFqoKVxakGmo6vvCUD4Eb0I38nqe
a2/9aMtmZxi95pNVPTjEFZ/TfH+HO4BrAp5Ttl1/yuyK/albXSHPZKb5nAtVM1OKxanUqVNdOM90
pkWDi1mr4wj7KdC1eXHNe9p7+niz0sHXTPes0hHK4dlE0pI+qrVacap6Jeua3jp6fOBz+LJ4vONz
csr61ILOYci3TmzHeyXIcehjhOoS2wJNi23ib9rZ5bz7oWUh67BlYCD74chg1YvdKkjmqrmaCDWd
KaQsdHpEDeIMcR6dh9xAUEa5NsQ2sHd/25XZ0V1FnyecYzpq3KeeI+1enkttzI80dtd1V6VbQhwh
VyOuECQI0ujNRu9G767nRsEG1m7I+dA5/hUEk5eid+WHImtBzIOoZGAC3cgqjQlN8oi3kOvEmVBT
40yTVj26TI/vPj9YgkitSETcOWT+4bVaRJtB9eieTqHKzqUR/xdv9tXhiK/CHdG5Atby697YqpaL
KzvRN9JrVEPzt/4T75XlBenv5TGr9XHQW6nV0RXks/3k3tM8YmJ6YyeQPWIek0UoH+Q4/QxU3H3l
NeMgBfh/+TUNfd1lrXMcz2xwNeu44m30wuDpmLQSa6NsaKySd+drWTzugk4a6aKfHIvdm9U8t6Nt
5L9LSjTPpW90GEHJwrlkYIOPm1MfZCpCuJ3HOjY6baTJG7UdBdWteoXiz20u21BXxlIseM1ws6g+
edTNjrB19ty6YIG8kboR64bomeGlqRA3V2Zzhx5iSGgqAXU4navEM3b1e5yv+vST+VUpat/It59D
fGnbUTZw6pCdy3sqYbJUAjVJVRRixgBXI2RRJFFE9yeijfyL0sxGF1zvc8EltqfMMN+HXIkdO3kV
tZAS+Qz5OAiYA/g4oDkk90T3x1j0icl3y4aysF1yFBHxM9OAYZeZZ53ThRF+WsMk3vvdVrtTX/bW
rrstA1CUHmmVc52oTy5DczNSIhTEbhBjPc675WWizJe8N66k3Wn0kIS10Frxay2ZogxGC2aQhMDC
FODDD6VnLNx5fth1gQGpSp9yjFgC80f3KE6Vui47L/fXAVr7A92fEvo4WGMlQEvZe3UHSgGXuOS7
vF0Vib9bE11Yq5DSOmKuNN2upJQhtqYhOaYf+kXR2Y5pH4pp85yQDUZjqZQfrcNxWB0yLisUPiy9
srUkpQbiirdKrQbwnU6mIaz+TFzBspW5ZnJpM0Q3AW1Vkb2AcPZ3ymrGz/J9+2mgOQOXNXWRCrU4
+/V36kRwPjasPP76ZSayF8V8n2/3tu1gr8JTrX02sZ5xd9B2pPglLH69ns4Em30baXhnCRnpVs9Q
29XvuEYoB144od4IeYBGGlDNzkKNqkqbT4bDfN7uBApkvwC+mD3x7DLUjsL307/uKez78d4EP5cs
XDCN4nC+6vXfIm7dkTxMCStwR4+RmwpVGDXEjjjNnO8ClvX06p8RfAB94o7+XFBt65Yeh1g65RfS
nAW6XRlW6O+E8fJiKl5pyHePtJArHtZrOLFT5cc3x3aUo4UhDiqk6Xz5ojMJSVNMM6ns6tg6oJta
j8mT8/3WyTe3Oweyt5sHjM6BLamn/vwdQXCl2bPcHgLWygQH9mAN61zS4/RpebDcSZHBYQ73N7k6
W1nIIkeR2Xp66AFXa55OnNhy8jLvAWxr8mq6LrI0kjT5LQgl2vlHxpfHOW+od3aHI7+D2TTwzsyV
a9Q12nJf/PbA/O2TU33P0aGOAN1CUb7K+UHLNOhPyvAnjfPmXhrhI7I2yI7xMcuOiflV5DlF5uY4
rl55l8GxhFgrZ9ZbJ2dGUf3n5YHRLqHK8uSkind7UI5/fuCiUdSVzqqKA70lOmKB3gnPYXXcbpWv
+eRlW+mcJF8Ma3g/O3W2OQfqdVUZrx6r3ZRpPf9W9bE8cnGznld3/cVDYLiKcnYscaR721n+tEBV
e2qWPYCP28EE7MYfyYphk6TaV7Ys9BHuNBidPLpGtWR8wp97d8tWXnBsqT68OF+tWlNlUGGqB9Hs
7wgBh3ujWML/KZD9U8D7pwB+MbYatYbEgMiUX6ikSV9b3d3eZHOoRH7Fv4kfE6qkTk/e9wM9n9lQ
rDsfV/S1O8UnjrLrEvEF6JFIaZSYFnCxPeTmAMgyNZjzDlLA+qGA1V38iHhbdUCFOC30myaqVlR/
VsqCa2EWUTOSqwHVqJLFOicz5aL1XC3YZdqnVBL+XC3apwiinBmjL0I5FDaSgG4xHDbDQsYmti2T
kGPT1zTDwhjPzKgmrwFWrPhpDJasyHUAVWhKlYCI+izd8arwWHSVTNqS4i7SGLfYNPBMqBfhnosw
ozSDcQkSuxZuvvfFylm4fNziFO2zh+u72FGGnIZPamPkN+NMtQMKLYdSxnpSdAVV9U3WcRT99WAI
BlCskK2K7NYbfxGXflwgWBC/8H/2F1YG2OHmd7ZEvQyxPLKaXJsN7Y8nTGaHT/pSFridtN9i3nK7
EVGvO/d42TGTcHdNLR4hDzevNW+777nvxZ1lxrorYl39pBvS9Vv8lLD4aZfuM+ZFi9FYj8GYtlhi
+3B7FuaZzoaO4Gw7HSDykwk2xRB9LXOkjUhJepvPgGP6PEnScvuyhDtMG8/EUOZaZvED40g9s+mS
N7Vzpyv/MUy7/8Drm11dkd2s3nml72Zhd++XiA55w/Mh7RvVUediOTOsa6wDVxkcn5IU1qivjes5
8LFH5BAvfovwGrXXULONEcA/idiSHaZuywiN0axhqq+dF+Yda61pcaLZep5tjLSdyYjzm7mx2sma
erBOlo23Ne+f7K2pFV/Bo5FPa+0bSHtEtpsUn5jZYqlcqnoe2cnOeRJMzlHasqpcNLhp2VM2ui+X
pN2l3xFormycCGXfuXl+d6xqxBG/c3/Sh56diMuhunXmv/C38ctfCZ59BvFtE+UZn1W74laQXMTk
lF8gv/qqQHOlxTB6BP57av0oY8mJN9FIe1OE3vZh1uIqfYNROhUHMl9/pmCu/Y5irCHC3cbZFkT2
566uk/CLWpg9H7ngrcmcQq1u1bxSxIvoqxD6c9lL4tAhigdMjM0MAY2K7VR6cdtaeSNpu46t+Av0
2nagTvhMIGvVg2PK81pXcv7pmm97sQrt8zjJIxohbzGagjrJZIgi+bEmFasPKarIu7DMMCkJAUD2
kGhA3MfE8CByg+2ZOIRE+EoKyI9PNFIHUTbK2PtJMZzkisTutCK0ipI/FX9+OiwhLAlwmv2msl2F
XRLytRrNRZ+Enkm0Ly/RPi5ZAeRlDARl4aYGceuF/04fYsb/MWr+7UNUSMKbnkc5ZBTx9XHsr05+
IflxPuic5kioLQJdHN+zJEnIsmRxrQUgct9fMHHNp7XXc1AItRF6tN97gXce25n+qkxCJ6Sn48T9
REhPxZlCy5lCyZnCyFlc4UaXRaaKVga/mV6ejg4F3YgDf+H7uRWzJZAJDCJ9+yAJ5/9Djdw0ARlJ
Eg6WYus9htKMKjjxEyx8/Hv4+FkD55RN2LcYx35EOV/0s2OdBlAV8v501YI7J8PbEux9HdJdHRG3
WLdY1Xo0co0AVFNEVNX6pwU1BTFiVJvPBAhNoV76UFLED4cFSIeJO2UNKdnW7Q0p7SdtLsZIfQ9r
Gr+a3jBXsk5F2TTkpNPtJx06X7T86t439cTxwCHrGGjF5cLbehdgYwK7KhRgcyDQqPuznU+XpEfN
XY30lW2NLezJwxuddeohwCkXdwrlHO6XA/z3Mayoq3bPNk/5W90z3e1x0Rb4uBjDFeE1yLe/Cxs+
6wwQ7KIIlxS1FRkYzFzB3jgh32TdZAVn1ozjHEvhzNTB3rxbkxLg5QnxYPJkIuddI0ATSV+XEfDp
E9SyY+YlQV0KCOSzs4ObUjhO33nGORhvewjDe/pzliw/8W6GEA4TsWaQPhwmYsxIYc1I/VGcmek1
G1sOScBtItax1B9iDaCk+hkMuEXew40DMXkq+6cTvJjIqzgtaBe/JgQQQ4nfswcLBwoHGrh/vaaG
hS1Svl88R/r53l7xml1fJmCtxFXhx7pUwGcpxO8m/FPw12eYaNJcAe5jKT9wa8jZe2FkgBEYhBKf
CCXeBnwhHUX4QUiDQxMKjCKiiRv5RnmMZbSggMfG7PLlg8sXBJcviC5f3vLoCmVukW3JgwyNyS7l
3oG+fABRK6K4nifOF3Zmpcpk7k8ZXfx+5Wevm7Ta/LispZMA7Z1339bUszjSHVdr6rl6Ebn1HbNW
2nwAnDnSPWVvRjKyWo6GBKg5Rdhy3CFmHqg9EmctjTqF7A1m91+3IyUuIMg9RWJ0Msarjc/xn6Vm
fuo/Pse6Wx+pZFtGv6w83rkSUbpM1A3Rlgqr8kwQpnUJBsy3vkQ2yOvaXjaWHZAYLivOzMLWNZ+D
ueqGywFS9j8ndMIwVh2qfuCsbD1gEMw+VOLknLnoehzV+JjUlZ6rjCqBsbzhixYU40fcHoBf1CCd
27/mQ0eOvnljDcfz1LrBnbFB95akZsc88PItY0+vVJjryPRiirY9PurR6VGU3OzL+ARFZEJ/vHQ4
zHpYXzxIdhr83CmbP2YN/fiybqmza+fv1d/KdONr9RS55/WBnXX3C6IrQ14HWBnJqLpbYsbjdwX2
hwaWLMRC7Oa3BJJeaBfb8xH8s2o5ag97uh+GO41M0xuN7uAVRzhZtcqP3JzHOz2yP/qqv7PSZvht
EGiHIciqGz8C8pIN31livFvuEEuJ7ESBrdJG+lGgcApe5FJH6mDh/xzlD47X0O9Af5JTwCZ1rX9V
eMzCPnwofOdZG5L2ul23ok+Zlj6K4ZUIvR6va/A7Ec5yDT7j/gR1ZPBicqp7eA81WSxJL2ne8p8H
fFZnZPodYXhndnX3tinD1TborAZT6cq1qDSWqmWDXnT7Cq8Dqr2//4a1SGBtfw+x3ObILShDwBPJ
fQYJ+uOqh6bctszIDKWmeW0kHurJvyhaboA+RKu85zISaF3TKsX+nfyucvplfzJeDxqzFsro1smS
XMB898PZk/elAWczqyzIExuwDEiXA7hggZ8/jGNjcvvsjyelPDfknSinPe0XrI2AC+g/evcZhrkr
8/livHdLhlGsSrWYTCAc/n+I8MbgysJu6ZmYE9u2JhPnxJlMbDuZ2LZt27ZtT2zbdnKiE31531v3
flW7a/Xq1b3qqf1j11P70MS+B61nAYh2sslzJEx89FrXxWX88/ZekMgW9/sILHoGeOKIUV/Pd6+e
sF0R4Ie6Vh53D/N1RoyhU/GNzoTON4JIGi+bInzjMvX0lpTzjspdpWpdHKM9f1Pd2+dQPjLUDP4O
iDiP9Or6J5bbzU5vGBcStv7IfxouqpXJntPNOwgTv56yBWw8MvyM/dtwymRZKqhSu/2RZPXZ0n3v
3+pwDKsH1kB42+CJNuwDUmxMYprRVbinR/P8i2199P6qOFlt0ncKLFtm3jHB8axHYE7XcS/ZT0py
fcoSS6e806qp1+ZuVySfaFgP8Hx1d6pWkNd7Y2hS6+HXYZ4FQtO67xiagrLJ07T/bq72bhS9sxSP
TpONx6f5mfFWxjUipw03TqfG214OXi10fj5liE1Qi/vE3PJl5ySGVQnLd7cud4Ywvx6sxaXX58vW
ZyoRnE/UqMEaeQ3agOj+6RMeR3+cGUNzDkfnY+uVrXN/n8qqAXLM6mJ46eO/MTa30LL7GHR9eBw5
yGe0LWkZGqeZFf61yW1DM92kG4OZgD769hictj6BU0xr21jXNq7lg2ol+mJYlHBmg5CQz2e1dR+8
D08ISMpIc4Q725ntoA4/22kJ8vbi6l56c3XE+PDgAB6ZTHC1HYWxTGQbZJegGrVzgiD7WbKV3ys4
gE+nb6xYb+b/tldzDG1SrcBTeURzHNlaAgjeA1exAI91g/wZp0c/7yEUBibvSi8h1kF7B6+aY5hP
Bz5T559XycN2Lllv80migHNv2hZqHojPD8iKLZpWA/kN1rFhBs1+FKOteItXTZnOIk/NNZqyIhG8
1hlxVtX7ibITcRarwdgfF4+FNeM5+bplrSpLfqsfMSZjZeu97o+Z9awJjqjvnBj370ydRHakBSid
JlaNfy8mozfOSe8P+AY69zG7KZKfLudaXlVtqO5+iORxR7txHHAaHZgDdGnC3ftn6bjdnvyFh+9j
DtescTelrE/Xk+6obpJTVokthmddRu1rRpMWWuDn1YtsHmw2x7JN++a23Ui9y/2uJY/dHo2LB9d9
p4e2op57mv2ergGPPGgvdwTP209FfzVHke9EVB9It5Nomxnc/HdOOgLsh0lt/gaF0ydmpNQoJ5WM
Mx9/BFcRu8TkQ3WWGNiqXA2+IS6/Tkwpqi3jhmvLM95FFazdJaNtC352hxYMLU5ey1eNMqRlxNO9
WRgkb7Br/tH0OVPt7hqOWUpbx/LWrZCrea6qhPJMORLpdGb912lufNAFjSnJQhaqPf/GV0OECPfw
tDjXopr7BstL89c7sQNV9/hynFVgJ8M67BqYtHPZZdiofdAxOpT4olytcSvBqEbs4cD8lD+CzE3Y
k4hBka2RdOE1STqWM3KPBP/sJQn7mv+KOlydTkREYLBd5Nl3HMXc7ZxORB6ZZ79TmGHgkqAidtwY
2YQnsT1v0C0G/KHJZ7MJ/OmS5pNRl48X+yQVc2q5RWM06fCB+2/Ci9eZ5+iPvEtSgQv659919Tft
TLTNA5w07J8Z2jtoHb0xyalGYnEjlkFR1zgcrCkjHx3Y3yOkZFlTniaHj3KOHLoNGIez6eSewrU8
ytwXhjYsoTJk6gDi+hCPScAK4/zTGDtmKEsrKBWdKZbJTputiKo1T6dueqNRwHHHpLRBBF8MJ2Yn
iOIDoEZBck2TC7bsP3HdZnOfUt7DlLq8W/FO18whu0ZIxskvO/V928tr/YLlMwlhtuXRUBZ78Ldd
wlwLyMXqM6GlDr6lnhKrLv8p67P6UuRKcTdl6/dLNfcBDXni30txSm/vYyHxlJJ/NwA68VXdXm7v
uEXyANy0oNS8t5b+yl8met1ACqv8c/cJ2aGLSJDSocHr9eCVEvWYh6HGhQ3+scdIA8aRTqVDHV1s
cVUbal5DW3K8tCPi1OIMduhMXyMzVsZKBuKRZINWdvIOTgeOxVx66qdGivnomLqqPcHn2e/Zd1wb
SlJvgI0P1Ks9ZHZlK3Vya2S7PKs5NTfL4uGfj2tC7rsCWKJVJrpDeocCt5Rl5ntft1TFUidTP+OC
ad9NV7D3rtGN8GufiovnP5vkrS+1lQv8Oy0btuQgynfofLj4jtE0tpbhM2q/GNW/6xnh04qlEypu
pL5u/pGUOJMOtUSxA6BWzxDJIUVJoM6sv4Hjhfug4wVhvgO9UVJehWjWlbV8CR7pmaNwFaGKLK6+
to227Ce6dvtxFU9l3q81XOOo/LJKGTFWtaxo43pugkkDJ27QCKjmAeBVWa8Enl6CW2GZPn3m2CjQ
pFJ1SqVSUhB0hr+YhlnxceasUXyl8jRjzyYEEKNbJGcLWyr3qShrlJFWJJrBZNOWLrEyT06XXl/E
Z0txLq9ZUG3U9Co5miVk030XeF0Aa/L9USpqjvJubcEj5LMC64xKYBDE9TOfWSyf+Xhl8cI8mQrO
obt0LOjSkmc9PLRcK7N0jOKrxJ+MUqwDLsYr0V/hXiUq6HvoTIrqzzKSpsptVN57of1WVZBUvBpA
tXMZToh0XerL3LAy+YvL4nZzlefq15Pti+pXlXVXf7s4zr2XPBqg6rcyHr6dd6kHqF1Puk+snuM3
EppEcZybLbk2/K77l8EWzbZVmaK+P5k+iGuzhP6lGjf8y3hgsehUv9/MvjJcMlBxUcSs6Cj7VtFB
E7K4mTh8Zj3moutMVc655KQoXnleHK++LJ1kos2hnOS0qST9ROcSVj4Zbn2GoOKoOLmJeIW5GI+x
qaT51R3X5WecjX2NoL6ap5tXu7Pvui8SgJOO7hKoF33+SsK7/XeIh9qcvZJSsXclfmnAkQkozTxU
d7UmP1tviO2BnK66TL+ytTj4FfEN6gxnSVtxuv4q3T3aaXnh3huvpwp3qN3iDPJLNlRzke4abLcw
xz+vLoP9aPLWZYv7MtF9fPPxdY9aXF44r+wupmwApafv8e/y5xWDBt70zxh8WvmFuibPLM4IVHQV
r+u/plNnFubFn9X8mpN3/LdYpUzvoh8GTRu6Z5+VKiC6N0TzqJ7R7armetqMtelyyzNfG/9kUJby
6gKJipFiiHrSZLO/WR+cc+DDysWBXpIeAw+FGofa9hQMOwJ7Ix1UBkTGSpK/dADDxVhfph5Px+9a
r9oubaYVFtdmL41axdqGLAxeppUha+wLws4Fa9ROipVta9xy9HLjlr9OHB0MFR2rx7UaGZthi2sX
3pVLxtsD5laPeioWDTkwuujdY9n9NperrOpVkx9SHtxbH8lOaxdBoJ9eWV0BX4ysch4TplZGs9cw
q1kg1GkNTH/JDD5R/6tx+yJ/62U0c1HPGyHPzsTdJXIJvxhuw5fE9UU0/kMQv8jal2kH/8vtaJTV
3Av5tbD1T82sBThAzYjBlquiEtK9fkwjF+mLVBsmNfVGVdZjtnLJDL34ae45amntRLcWtib2blZW
YrYyWftsfPSC36LbQBKSG1VBng317UeUQNRTo/iwU+gT/JCjXbKGrnB3WrHYmS5IV4P0KodORABD
0oyFIrz7dDOl+PwegMIqg8xKGOoGK+E0rEtq20Bl3ulfnc/uyMbcyMDcyJ86cPlsIQZ+Yk0r/LRT
Q78piZR7CO1XWyagJm2mMhhe4OgmzDkg8e0oG2qiClaSoQLTSL2pirt2uemMVBtJLZNSbeOb2gak
nSqxPfQsvHSDO1gKHhwjB7qWNYRWN9Gj39L+wgquAaJgluy3MlbfhQGadVx9gKx0VZzAJZT/GiJE
Ex6Mucn3Jl0x95+1PPArAKzzvuOl44V+UD8oWENjG2zSAWISY6aTZY+y11GVGSDIrA1bTAVTXAJT
nEOT6t2u587aB7zrBS6X5adXUioWp+dvFY6Z08p1h+d6Ygi+SAi8qIfygy2pIlfWUKrlwFZ+/rjl
JfamIP7wHOT/9kQHc6WKvFEDt7GstBn97d0CBrSMCqyBBcoWcTunZ/12unTkyVq7l/D9pQJWHpWU
S7mn4WyV2O8u8OAKECg7cnYYZLjA5Ew3PCa2NmoRIqxEDK1j7+2/1sih+ALDtepXVf2qSi6D3LfE
TXAIcLwymCoRKOhErpTM8VMwkXCRxQe98H51C7zMjMzZY5CUEFuFjb0Lva+J0RiH4OYj5vkLqcsY
5qPncGY6qshUnLALS+KOqGXfaxgXkCvGZf/ywGcFKY2qH9Dnu5rUNaSCTaGa0HCpOSUP1Perfx+X
MKFwm6I1wXiZMjdhS7Jb4rSgnrBAFXWVFpqKmvot4cjOlUENSzePWZ9ZNcXe2Lr5EhWfRTD1g3bY
AkNj4/yiSMkkpyHGPvN9yht46evw7f1l84XglD+TP5bvBL9QZUr/mNmcb49WwtmKQ6BKa9hppB/u
GAUTfrkkFM9RGP06eJN5tdqZragdhUOIyzoTL4RXDfKlp71jlDpjL1lwVYkD8WV+E0HCfrwjrbTN
X9NP7XvTzz1aa4wFucWq8LfFDfMR3c2qoLemzTWlqar9Jb+uas0UMGtAC+FQW0nbg/zn6dUpdcah
cV4zlDX4gdkJu8jqb2uyuc69/Kpia8WVjLbJuIagdTC2Rsf12P1mJx5iE7EWMrcr9Sv1EwesJzDP
GuurodKeknX4qifn19ykig0LeVndp9/m+1sHWxJWm95X3xpdQzyomhyu7f0IrwBXXUpLXdNdSF1d
217ftg8FXZDPcC5+/EZEakPKCw7ZDKG54Nvj81chdCISzR7eGJ6Bw/5mxAyeS8/sa1Ja91r5Ss9m
QChgtvO9wNaxkSd9bhNLa8f365JH2uQ43Gpo26zrrPubdytLAFEdHPOlD0NuAN0Fbo9DK1LBpZwH
w2jbfrv4x5XPxmfukcuGi51jOg+iEb8tv++7sAuU/ZSjCcnx8BUVJ0j3SXEMauAZ/5Fpg6mUz/Wf
6shn0ysb/XbrNvFxy9XTCNd2VszH285HKC/8BuTJruyVENAtriNUxgGrI6KsrGNQ279+h5q6aU47
LF21rULOPKDje5OVIwfZJ6YL/N214xPpNJ8L0dQ/bxd+kHMvQMRswrAUxVUK4pSTKQ7XQ1znp5Er
jQ7X2KNC193CwjiQVh68NjN9Ya7icLHYoZNbR9t8d/H+rM8+3YX70FVdB9PcdIdNYCpYR/jA7ICt
f/YfoaeYbQFradjyhkV0s4YrQ2xP0TKqmEMnfuNQOhimA6X5SCYsCyeagS3l4I5UaF8acgArCZSJ
EMKUyOlEGnUA138m3FFcaHM7UgvxXGhFdSoMi0/rICt5uAlYTGaqg+8OQghHIqsTmaU0qWi833tq
tlPse3Osi1x7cnzw7nxF8+jV0C/05Ee4RogC3aFeA+K8R3xgnJlpgdCRcC8hrwNldfz9RH4KO8oL
MJ3m5PQFnpHcPo2fpHOfj59RzTr3ugUOqWZ9YMWiJMYaoX2NyAFmJFDzQp2j2+JV79ofjI3169tR
7r3t1BHqWHP/ON56WvxFCPxVZvJ/Geslfoc6InkM4GODNSio1KPGFtKA3kcehq77gELzh00kkEKg
7IvHlypO7kvUg2ODS4ZNzsvUW9XjWpn3N1vgTCWUKpn3x+lDKByHHi9ImtCjjFaBUfGF3PhhZssD
hNj4wdJKYGDLM7jjHNp3iRywTgLVIoxgHYL9vwM4lpaCpR1nLAWhk/wZ0YNgxh/akUCKPMnYK8Kz
aGBRHmFi/wRS8rBwwp8gHdguv1/PRHM7PiPgHyG8PSEMCvoYMiWsaZAKDaXO4A0CChNgKAGQpN1S
ur/TQPZeXMpzACdZiQXVE7rS/G4FXXFlJ6bNiPKTrXaO1faYbqhTi4emkW3VJ9Hsc6DTiENBN8pp
BnBSSXo730YwW9OJ/+C05nX/5NL9m/K3hk74x46HzdoAXdJu3e0Y11xv37Fz6Afi8kro85DYe/13
Znu+fCLRCGFgQi3CvGyBsa1c412lN+atAyhnhFUhRihH7Hy29BjynalQd4GJ9BMbAHWaApQsdagk
jCjYB3KWl+kuMSlaGVcrwU84oS4u1pyolnZ5K/dEA/8CcNyKT2g4Qcne8LfrIH4l2Z6C7b5ZlwcP
TpDfR+zZyak7FD3rg5RarwtKwDXpR81HYvn5NBD/IK2CvwQXBP8Oae9d1iNCt312rZ9W4yOSpTdQ
6hOnE+hap+PPOw6c5mzXYhID0AElClVPlRew6d0QzTUrlhWkj8aUvmu9kNASuXHewSiH8eL2qYPZ
EAo9kMqK2FaTDpAOlBoclI0o1vKiuSWf/c6O4BW7TJMdAOOTfkiVVYS7N1OYKEEJkCWDyilGP5pf
QJ6ojro5je4vSWI+pbaZMpqYiNkPJBqe5b/Bopp4ttT/lxWIQwXLyqeaaqeu/+8wEKcEjlVmvGR7
P9Q7hgkEiD554szfRkN9JxQDeuDPXod9yWT/J/+PYTDiv9pxqLesyey1OOZ79r1Iz7Hn7PUpKQig
LdpDRSAFQNjCryPtn50vDUuyLgoQZlW0gSreCkqHx+qZaV8BQV9MDGmqLWss++tv62/6Pcuc69wc
vfaNZPjHIeXh295SxXrPuaO+pMVxQJIRiVr1Dg3LadbePCH32HTJXlaaLQ1zjtF3dtTesAYFtWBh
bn2n542w1N915vuwCvDJoXl7xb+5nurvV9enJoYTDstnTqSGEzYS0aeW/8+/mNlpOdnSvIXwpPfT
fGxFEx0d1a6irfy1M+Gbu/L+kQp4spqybvltXx9WrJpKbyX+/m7kt476Ukyj8iJzSOwX2iY4Fjrs
RTTlFm7zLhBkMqI5uMGScwXx2O/FBfYmArMljvI853LtPw1j8gxOcgRC6U3RtOVkY3KQ8rzlBprN
QulOMeYr0ZfEk2diyiLvpekEzQO1gwHvy1hb23KuPoa775sXCB28FxMf5+vKfR+yLRa+X7PHHKPl
unNi7enqkFa/zVDcPjTTcEfWDpws45zvPrndz+CIF8k30GfrVZdLpTnvfqA9WC367F6K/y3gjhCv
ROJ2O++GNOLYPuXMHwj6b5Ng873Pmr6303mZvRu9LQsyrj6vnulS0aY/hyIoFetNfzphyOYmuIJZ
ieaUNTyDT+4i0ROren6bVocj6sUg6kUjIpZZ6aG64F9Uv66EHv9cXP0Gf++tiu3Dpf+WFXhLBbsv
i/Ev5+jC7pHYWGZbnrOLKpNPnNNLbBc45tR3CtC/z659+aV/SRBU49G/kBBYVgLLc03duYGmk03b
2UnWyvmm08KH3UanxSve6jqMDW9zwf77w5ID7yUtwgUdk/BwI/vGUrb1YbW/ige2RQbV2qva9ry+
v2r8q8GwzqK84JokOPoBXuI55gVnGb/q4KA/wbAZd/VnJY2FA+XfxhLBeTRkzN/qzEuZb6rWNFpc
wq320a/lPDi83nBq9sG1B/BBRMet123XeegNB5b6o1j+FD6h9fN9SayBdBxo1Zn73kdTgogOm20j
01pcmv9NGPfHOwRStLj4QEha09C3VdX+J8fVH78OI3lFTN8W1tGv7VcwEVMw0RrWsbj5Hf5+37g/
JgOev3sGsEf4XdjIeEMh1e5Hqh1XYRpaC4rMxlLFhXKJc3/kOjzrFePEs9Run1UQtAsW4YaOq23w
8oJFeCqOLbR+72XXko7Fwmi4wW0+xVFoslpnaehQRHgqGa0BiTwKj67SIL48ikOntQ5H45SGQbRp
2NdQzUQeRRITo646nzSZkdbgNJ/0KPS/iej/ZtXs+TDqXOVR4MPC/7Ot6H+23X65DhRRHERE6XX+
u/Q/Gxzl/1eYuy8L5conxWSiNdAWFZ1AeWemyvFOJQPpo8wiRWC9M4sBB9qP5pEcRPjpdYAD+P8n
/n82hfJeO5VPlEwP0j8O8155ySdaEv0KhXurtZ+EcH116l8erPfa6pf/piS/UtB8Uj/ZQoYVstbC
feamak6XA23kxmsgq3WXayQn39w/zG44zl4f9KfvGgy8JZu3Z2xECAY9Rh8b3o1DV0PMrltuNHMJ
H/XXXgjeG5BzLl1+Wx2DjkmmXz5eFgavwWQph6/PXAJCZjavowsuphtva4A1Ij6gZy852vLBEUIZ
D1dOjlyGR9u9t/W3j9Jj50/nxPaBnoAp4PXdtb9R7idxN+Qr1+RQyyjy4T/LW1sNkOyrLJkxf0nA
MxfD+7FXbuAz1+re7sHz/ptdrRSQKt/p0XktomV+02czJ1Lh4v7g2QZkQzqt+bEeuh10jPaoCjpH
/gTLoaLnm1bfu2+8f3r2kGN95Z18D/gQ9OR5dOvfu9ei5pPVvHXTCG9JYNiScbh1rg9AceVk2N0l
V8C7tV2LCHEoduUk2NlNDMJSYkwNzzS7sU0Ps0kg+ZDieWZlm5UgeGbVf2aNQjGBziCb8kNCwySi
RCAqhjd41Onf6woc8uCC3xoXZYkJ8kqS3A0BIscc3s0c1mphtIdrBFnDbPo+F89Ih9rAbvq36pYS
7X3P+x6qHsEo33iCKhpRHWk6m4TC0C4ymy+JPj2MuX3kb/u7FS4L5Qq921cjqObHtiRWmIK2QGfW
N97M9hvSlZAyOj4pKy9Ez9QxkLsXeCr3K0PSkGEZfMyhSuHr6foO10bZdeDXQcpBfF5E9OAPATcK
K/xljB/i2rey5gP8OHDjCTcK5hEpCopIywNxOe8J7SA3AKqYWB9/GeznAeTCvw9xp1vZ/Gxx5Vup
s/Nbd969MHdSg0cp3AiTOemeH9OF33kTOPR8FGWL6G+lcENN5v7wJvy7kdoKOgS882UVl5yajXBp
y4ZkvSfMP9A/Uz08WALwxI57WUdRcwrrnsk3gcsgPPx3lemALEDCb3c/Hd/Mi4RfS5IPP1d8gmXn
YPhG4RaaUbPFIW+l6oHmXbiX9T5zcm9fu7gRo6nOfB9EYhqjtypb+vsl/JSBzl3gZkvwlSTufsoi
TLXZJ5AqKF294fliGoJESyEoDc56AKtf2LnUMCrgLNDg6AR94fnSGoILEKyiGY3+pnBLyNJ97l8K
FSpWWEjWA6SFSDzZaG3tmB6DPE4ltnhU4T61BeISWlUfbj6bmmQjVIVouUj5DjXdjyXkoT7afE41
BnvhA6hy+mw1J1eDgCG0AddQXkI3fMI1ZFfdxaFXc3JvVY5n7WkywM+f6fWDr+boL6oHun8a7PUR
5Rkn0A/73fO11CQT4S1C7fV9KyO1D6H93sw9qKtIzxbB87D6m2A4SIBirTzX82ccODlIxLz+zOj6
EP1/Allg0JB1hFPDbwj7EQJlkfnEnjF3xQIpYOjEEUEaYA8aTIKI6TG1MKeTMDzIjyT4pGdVyJ6B
nIHogY6BErN8wGq7yGn32XZ3jkhIxnmEvCT8gq1LFG7RVzojSpEew+tqmBRiLcKmYb7F3EPUSm8b
Milhd6tsBlx2UsuYIiySi7Ciz9DgPnR4Rv/ff4T+iJYiT/K0ph+UbHkhV0dkl2y1HGTdm25xx8e4
Iwm0Yukj9xvWXTPTr23tVK64eGHq/+pfWbkVr9tfrZtBZX+L7np5nRB6/nXdIdJz/ytQHSaH1DOM
GWmXKtAIpgLFO8rLevIpLcMHq99v5bherQ38JZqI5AxNAIaEnDhRlNoHmODTw6eMbJ70rIho7QJs
2bteKvG+aGG0+sOE/dcTKaqZbJ8WkC67NkmES/aLH5SmKtaow/ZsubJO7BgZxY9/7nA1O823icyI
SK5TBzqSAT9+cj9QAflcZPnI4a1m7ejCq5tiB+t/PThC2MHMgchCMCT4kjAkCCSBJPQklSnI5JIM
JAtVKhWL5rAkGkIwiHac4fpdP87JomMOPRn35AYPHfCn7EKnh+t1wuUCH+oYo0npRUNjSPFJ6I/l
DrqvxQ3eyEYniF63tb3OX2fv589Vnjy2n969tx1apEtJIyGzmyi/QVeN9t4v/doJZUPjNJ881egV
c9NsVK180dE+Ly7qPvc+by4qsxDl0WcgpQfQ6LaoOFbt2HQVLwEkJZfbncc0NpsIaUPcTGedrMxK
qpwCo3pxFLJJDrksWG1nyyEZNaN6lenWm4Ji7uwF0BJjGLSWo50HaL8RaWj3aldsNAWcd+X/NkPp
eGyCXvp2M+K+dL40qLahHTNFXRkQeAwr5nvGmtTLeU7NPOsOmWqQ9a1Ys8YF0C/m5mVSX6l4F0q5
tZeQZ1I1/3OOXN2/Hm4eb6FQA3S4wgq5hKNX5yQTPcS29SHnlYqTTMIlmGCFk5wwnaiOJatmpp2c
YNflQj3BOy7KdSkV5ZRkC64mOya9FNKLec4oZwL4ll4pRnXgGuTyHDlS0YXFFpTMwnUfmRGTwDq6
at/PxsfHIqS1TzCfqPbv8I1VkC+IGaDw72HLTrrNSIGRe37aZFS09SJrIfG+Ta66fiNWchrhFjJw
iOpQvxvBNa4GIvqWrdeum5BzlCPOPkIrPOZha2ZBw3oUIx1qnKANNIGo49Kv2TnlcT5BsEWuaiGj
aXzILV1hlK0FLkadnWjixqEFa6Uejzc9cd+Nxngr2CZv2Mwbm7FewuMZKNjvvSM1jGxbbYjdumKH
0rrBAqV1iZ2ScSvfdfUYFT2qkxPcUjmqEfV3NTHqEonH+psLjzXK3p3gMMFqaM8lojlvspX6ovcC
C13FBNy4s41PKG6Pkazx5Fm0Wz+FHj7NcJy9wTC4nsQwLnOXIVrqYh1Dw3PpFskOSeIr/XC93tTl
CjimIz5YBE8u1PLTDwsozqKLnyltLHSbLF/v8LgVW519uXWfZVJQQQZsqUPRT/oKQS+CB6/U4fi7
9JWQ+j+xh+g0Lhfx69Yjf2PtH6miLm34M1p7e4cNqZtp6eNa8bymzh0VvnwuVbyhFu5Uwg/6OocK
h/fpFlrBvAY/2vFkVq75EB2gzzxsAt0SxpPFJoWvVIRAhbwX7OBM7W47qZpg0R2AXvEWIteBzWWP
cc9xwM6imbWD2x3GPcFT2xbPgSXabrr6E+QOL2X1adbixiHc4fkRxRNF/3jcz+rrrOWNfYkDmnvw
J2U3uBSPlAmLK4supF/wWm28VluB2dDtNtmJLZstfh5XHb3CT4CdOg/BbOPEq9de7Kdw3qiYS+35
jePyA5xJOFW6aZbbq4eS1IOt+ONf51oBnaWrezLj41LlHiG2n4WZu97kTBbOrSpuSaNXIlQT50qj
Fele0ckcU7w7r7AhvhaFnaNI4C0vEb0AbwTXkRjwmBdxN3Ciw64CxTuOzoZ0sUx171JRfKbrM4Nn
zV7XfvJ+pY/ozoiehykL5UxyIlPlN3pKxvOfz242mezJ9yNi7ZbeYTd9ioe83ohqIzZgks9Welw9
VES7BZ2SaxBT18qmCW18NRqqQ0RgFi+GegHSsLxWEbflTWYbvhwyyxJ/1ve6kBrTNrhs8qcsJUml
KCZuKM1ZrVbljqzcBEZVYIArEraARt35F6tDuXmTijtrc4dW+C30Td8qTNeppR3p2SOHlANRqevm
K//LRhdZzUHt4McUyyrbYFK8KFg2izwQs2RbxZajFaQLYvVl/SRCp4Tr5D/h6R2Q8KZ0BsRsQmLT
4oa0TfJV86TwCf+utibRTbbVt1Y9HuhOm45vWnXaYNXrjB4xTprNFXwUmcfNHKoZxh1QlTtXYOet
HrZZPM0ZvV5SCg3FVgeYnZDtYs3rsqjLr3qr5h3nk3MVlk+et2vGV90takQWmjeY+/VM4uuWAbhV
yZokTxh77oWVsrVW3xOseHp/rfMxzz/CpJIR63Xn+nsMDxOaR220t0iN22tuSXjFIb+iSwZB2BSp
7Dh3smlgtVxXLaveCKcK3cFWBP2y6VI5InTLADoJUdbG1aqPfDcP8tSlnRL3xHEvkIN4gT2A6rYE
0CU6W51C5oGdoJYLo2ykhOzn1sgxwTvZp/MR/xoz40R9kQCaBBnjJ0EwIBtE1WjxU2Mfkr67+QU9
g90PqRYRoUC4ga9X1ajw07YekL1jCELJwPjFRr3g3jyDZM5r4E261NfM9ZFh3ncsFmVhj+1yYMh6
Z7Jk4At6cXbDW7JFMqWLa1kx85Ee39alxE38J34eZo32lk811vpsDehUP8WWXU4kirFx8Dj4rkzj
syJmvawcO2J+70uASJo4nVK4IazKwrj7WffG9p7JvFvwENHvlKPeQy/14vpeznyZAMTrl1oO/8hj
Xm6q3sbA9CI0bUCw+hGonKPrQ275DDINupnhEKgI0t7m4pbhPFmbXYATs4fMMlV9ZpyhcW66jj9q
BMhUF8xfhnWPp1t6hF+XU05nM5bMqj/SX9NnWUw/aBfAX0B2Z+R5BjA2Y71azxs91ldDZso/X80l
PUpsA9r/6QSI9ekQhV04dnWF1UKuQCw3C7SsOHW/Nk5Z31XNUPIca5ZwdZys54t2rLcId1zybXtT
lwAKaqFJIuAP5ckl87wevUe0xbf+QF8K93q/Mv+1W2EnzJpd9QPGelXizQ483lpjeM3yrRJIxuwm
4xa9/17mA1j3LGYhj200kj3yaMMDC70wjzhH5U/xHl+qq1hpHouqxYAMr+DPTgleiKDdaC80Tovt
ZNZTt1fCA739R+HWbIpXlhu/UiCiKdIgNudnOvZ2lpRNuHg35Ab4phmwORW3/vJKyl12wvceP3zV
HsWL/sjpGDvRQN/Fm3rg12AoxaZosGtdZwf6dMQVnHC8GqQ698HZ5iIJrsLQmhzUlvYTNh5sxmiN
KWxUMEJdnsV4LEP21RrLQViV9itnwZUxYhApASN8ICNvT/uhrawQ3wYBMW9ETbnHjBxpege0sFH/
fbB9XAoagnI+xAvz36FNsmCNWbQxvw4xon2MESVRrvkZYpBfCYvd0hoAJT9P+QLeqHxzGbGRk/gY
b2KPi3hBGJFJB8aoqvvuaQUQZOL19GtXKhRKvBOijfpv4aYDVIwrzk/ZEckOLETv23ItkxO0mu9u
t5QHmfd7ViMMt630IabYyNfONWc/Bz2YO+pMolkz0bCI3Y1Dn/I8BbVOt2aKw845SUM1N5EQUwYJ
rrN361u3uyxaafnO+Ji1HHKvyAakQ8ZqYF6d97qaJqPVetZs1+O+ba0c/nkcDuLN260mm8wxbT0e
AZZgY1oqfzgOeIlF89Mlgp9MRHuGQpKPYavUbv8YMh1oLxjJsVixTwTBI/BwruE+EmAgP/RavEQ4
wUeb+9TtovQcMM1nOSy4KUaOzJ7Iwg4fjkcb22TKH87safXrJ3JE1v3AHHYMISbCQcNntMlnWSUZ
uK7mBOP05uqFxp3HD5DLOeW8ll445vlNGtefuo/9oIp7T6C6s0acciLDjMlF6Qn/fPXG9k9h+CG2
5IERhw5f0TbbfPiXyPfQtg93QwKXye3A/cSeoZWT1NvzyMlorp7RUid6ENeGjXdc5rDVL+7kdz6y
c7Ugth/Ptj7MiZd6IA3hyL9smQfXwwiLzyEwIbdsz0yo0TiQw8Gq+o5chO6Lv3FMyDhZb5twwaM3
5XD2CJCj/dV2iIZ1lvmtec85YQ4xPkaZdxk9Ef8JDqMMwitQPrFZ8zLRdJ7+QxFHxIE8wPjA+ydP
w5go2qucNcNf2UFP4e4QpVqIvhOYSBj+bEuY+5l8256IEX73wfOPhmZZUy8zGc5XDomNVcGOeuzV
hGifN1rxg6Jfvx/6H1cZggGHiO1nup18eeAfRLuNHjOtZPNOtn/KZYStJGyC6BUJGp3ShdMtsE/9
gHu5ObeIqI74UU0z3lhOm67bP6iHUexBB49EPx1NnJiDWVyWIM+wuxtQqJ3YxwMiSxTp8HB8SuRV
WLyyLJkJ12BuLgVK6FIHM88Td9fhs/z0aB3K7i2ZA9o2uGAq8iSzjg8bJhan4vSaj7SOS+lZl7lr
IO5TM7LQ+oSOnI8f9GBFJmjcEtvWuTbnhzfOM2GTWeGzHPrKZ84EHGoc5LMNrlwYoS3SMJ6a9MAb
ttpweSctnax7ua0r7nfFCbvn2/AsjR55kHLfSu9Lj3EjeMOJJ8t5z3LToh4GId3Y+xKwE1f+ykrM
DBS7zQV8zMAtaO2P+rOpmhYJL6FbFlNxrGBpHNZxyZHVvmSDqTkIViL9SB3mHer7TrmuiMk7jOlG
G4C1oiArPWM5NcTABp7tvjqk4prunyJ0XvloJiv5F4CnYVi/+Fdb3XBrkI4v5upgeRhASaxOV+dE
+ENFKo9tiqWSpWT139TmlYJDmljgPYfHRt945dJ+gBMmUOCG1gIIMdA2hjzuDjqUV7lBGB2vHGfF
7/w3lh3Rl5H3QIx3Ewlp02AC2O/r4JyG3TKEBiTUFgcnOdn63fB5bDmA50NV5pLofAugS9WpL/5R
va8Lax00Eu1q3UcQ1Z8uqVfjejXC2PmBeFWLlr1q65ZzgzKVsiW4mx24eM5TzrxbvhVmVONxtB2G
mASLtkIzHe+ZnfXI67tIV6m/LW5swmuRh3HOYxbDMs97vhpImHFvCY7Fcos778It4rzagKWh2p0w
UO3+4/D8IvgYG+ZB7r5WEkfDsDvhEzvCFvNJhkZfNPTCWhWhEl///VmGzWMGA+lcRE20W3GY0Ili
NAJTVJVWbjOJhElzr70+oMpVa8uM3HIJwfEQ0oU+TDvoLpGiqEIku6HQJUl4vLKatq1NmuHlbfjv
pcAeyq12rbFZRII/YKxZpKyH6ndFfHA72ppCoT4+T2EE4NbqNFWO8FzcfDz+n4eCXwLVRJI18G8j
xp8W9/r18F1qJ1PpZRXKzdNRi4pEYw+4dfPCl+z4ZnezspJOBshX2f6BZspTwSfGx2SAcmATd0/j
kbSlRRy7B+6a45zztJlVXOOxtgWreAigyirTcUMYLb0u52J3wIJOL2aBkjsJkD3DXTF5GXl62/KS
eQvwshI0UZgW0OxhbTrWWo9lBee8mLhq8/Uynv66S1thZbkBVP2CdETXUxsKjzXWWxs6jzWoixul
uSvcrZs3bZceN6w7Di1P2tadh93aj3XWKxuaOhJd5Z3WOxOSo6wkZRymhdbBqbYdeqwmaR4qTdVL
hjVXm0+BHuNrzVledw9ygf0X6stjyIh5F/g3HcJpGSRbbtUmFVbTbnkmYhGZKe6P6z+yUjwImwh4
akAx6/ZZy+4/pSSOJ7N5FSPvnb+l7WW5gNMqxt/rEC8lnmnFQkvjzNkS7942pNVnPYGPFvMeSxBP
Kp1oIf1Nl8jU9MNXbHOgirUpt7+CDpdqmhLzU1AMgIeklSrRLhdoKlvEwCtlna2GyF1Nwv8Dk+BS
NIpHOZqEY/rLTYsL4J2wnURkyv7QFg6mMe9b8UvvV5aDMoTaPKSqkwCztv0ipJarJ3j9af0SBkxq
dTsuuIl0GePNS7EFo5Ue8y/n4gxGw53O0+aIB8TUq/bA3tDT7HFILdtRP/l5L05guNmQ01JOaZVz
H9x44xU30oZ9FASlFE/1bK/TfPc53E1cAznzYrQW2mbFJe2yk/oi4Xk6nFQLVWsxOOvlaDVOmpWs
wyTk0RqrdoTf0CP+sr1eGyBH84TRism+6jGxMaWdHaxi5o6ksdL2EopdqGdO55IbhteyxoHgBXMN
jwfdT7tqLJGBqJHDpRQcem0umtPGvaOZjMV2wfriz6lyYwPBadeZc9/BqbIFHg8xd0sHt70HSco5
9Q170zjBUFfYpV90/VbiYwNBUtfpZQABW5e6FSTBw2ZHaldbnrLP60t08Zb/Y1x08pZBZhcweZe+
qAX1Oh+4FGiMv9p3gnStxMvFYx3yBDcyJWDj9WoaUk2FN/y0RdkJdW3Vt7RSAX/5A+XTdsVbFDf4
PkGq0it/4EDbfPxsp1NydxOvvmbOO2vfQ9rKg8CACUvjoUXWqdVDlHepG6pQoEahY+HzdyiIwckX
fYHszOWP+LuOIEnSXqJQULYib02o6DTdHgZTHhZ6DXX8TEQ4+pDFCYVo8B4isJ5U81YeGL7HE36d
q1pQXtAdGC+rnAUileCiyKwvWFDkBzwoJmJC+/PhpxA+sUvEVMRYCDrZpbfqAB9aXfa9/d/sGuzW
T6DteOygT/i0JnWJKV62kfZmIk64gKjmItMFlIXCuoK/QJjmgp+EiLnfcEX4xQSBsidYJ4QgLFqo
dyTaZPfv79nuce5B+dRv0Qm4/BziXRJsilZKtIsykGX45THcYsqKAwsupTXyn0EgnIeH0msxr5z4
xPw5Qa4kvqKcM7lHmh5Rt8Rr2u0izzEbus/kMxVv1RcXJQGuvMzC7rLOvDeUxZq3sDuqhdy7HrrP
bPeUzhg3mbbSN64Hq8Ny+yiQ5mHxnepC6N3ymK5iSmKP8gfdA9GtouPCSlmKbJfU+7EiP7+TlLZ8
loKRgmQ5h7KNwmt5TPld6XY5XwFtnnfI9k2udw3Iv1whT0m5bEulVElXvol6T8lEqZFU2UgJNtwx
SZiCjq8aVGwucIuzmGsucqu+6KKcgsH2PAkrGmAu9BATXlN+pHwPl2Eu2FSJrERXjiFaYi7dVHxT
6l3mXnrSP21I067cI39J518OvliXz4Qr2pPrysFNAsIYcinQjfIWvnWZVZ/NUZH67cOXriwltl4Q
gr4+64P2ziFfN7sdTRjmTgLymEWTZ9r/VGU7Wzwh+r0dKRGVHf5hpoTrTUhNSwfKyU8pgCsgErH5
jSH2SQvSLdhSMCmrEWUr97nfOJfvCX3V3rhOfPbiwnz4biiP673eavCz0nxGK3HorBxJXdHoIeVK
9agBn67+6oxtaRiKbhUk+AjlEdGlyDU0VX9/gfrqq23IYWFozrryoRFG4F5xxIDGM6Hzd3jFzrme
fb9KopaWYuWZse52mzQcBHjwKPwWES0mf7MZMpJQ+ucWMPSEXPTcvfd6s1m4B00tcWs4FDNLc0de
LnHLOjQdm94J+5i5dxxOgS6cLRhFIZvTnfsctIdFHc3rAsrfWw7XHbjolU2mFJGXXxj9xPWklQiK
H8kwHJUXlxc/mc6PL4iXh3NTADaVXpRaAknuVNQ0lMyUaCSorn27CJUJH9wSBbfCR8mnLT0hqvmT
JYgBIWGpHSMDG0ZXLPATXsZB6ibNqQTGOW6DpMY5ynV1lmAZUr+iJv86pBKw5zAYSK7CNadXGeKt
GquM46onY6hh0TV8f6TnGck2EVuRz1ddgX3k5hmSaWC9wO8YYeRnTKZ0TtrUI6rvoLLvJVRHx3ww
RDURbyxUm8tjP4c1q/sruK4l6VeUCggPLZpQMCv7blDWcrKiHQG7Zo+ZJdrYysAnOTOHdDxRj6Ae
zIDFYGj7ueBguWKx47KkS+oVj4AapCCYSA3fFSaTpxVrCoRFZqP97vYjyX8w92fssTyFewSv9ofR
Dfdz1zjWrG6eMXqMhiBq7/XMidFfMHERZ/J4DsbNA21JJrf8TugiX353rK7gbsQ7EiCRwNyMj1DK
bMjsk4COGBoxzokYsU3uJ1x8mDfCHQpwe0a7tduDePXAZ+CDWuP3Z6T9zCfEqOgn2J0dUDKWtzHE
G3zZO/QDCUTODfWCXpSbL0+CAd5dE8jL/3G887onT+Pm3RkpUaAjllOwlbsloEt87aHiz1FJZePI
XkB7hpeI6RU3J88NNLqjd2Nw67i3Ci9SUxJTp6EDwR3mkivJOsl7L3zrZg2VCXh6owTRnWkq8YO4
2f4g5tvEtvBo9iVsieCah6cLuZung2jyy3DOruPiQNBnRLFhIDHzH01or0a98H/JVLIKpgRV7hwJ
az4K27+tjqC5OTuFtUOEnf10wrGP5Qgjv3vLUqxSzhEkMO/SiOHWt+SY/V73TvrGJJlaEyDjJxMw
5TsV5MRSOZ5bccI0qXhkdh/pNtVpqsNek84xgTTZcQS+g1Kgt0BsJ0Wa0F/Iqi7FqNiLzmokRfH1
3WOVloIvMJRCGA6NzLhlESzOwTEITouYwB7hZB3d0LNmcUlVN85WNyBktpigbJi8YAmZYFkfpl3F
Zs+WNlBcRWDPmDSEX0Vtxi8MrzLCW5knrqKfTFfPTlJDOofG0Zuuw7r5JHaXcCkn8N/h2NMY7am5
WepJ8+pBvCOtu3M1OGRCofNJU3P7alRDk6hQ6GQpVbKFKt/YDA7LBsfmQ5N8UtXcuOvuEAwObZDp
pslVPlAMDtUHx7a/mPwv6Hhhy3fDwSWHsKpjFM1PiLoHT4PzHPLmD5qvAqWpmktqsJ1D8vh+XYok
b6b3tFIvGWbkk6zmjOPGv+cwmD4exuaTreYAWXfE5Mvm0od/o6CTCv7MEMaEalFNuaQl/M72sMxM
VCu9HP9EtvUliFW2ZaeD81jnHpW5AZUflhd0haPOjJ1YQent2pvR28vRT0M5QXbhQd0+hPLNKrUd
YDMGMz9nxmy1EU0Bpmim8NWK3X8ZGzFYInw0xDOM9Ee1DOjYUtZpUxepMJbTKiwXJ6BOhHe/qzhU
VUWvvs+Hr6fiWUYdzTcbH+0AhnzYW9YaJ+Kkx2kD2VitWOvP+KsKpTNrzdjX1dhn/6W7ZQgo1bet
oM84+pEd0utnTGI8ThBmWD6ug1n2eUh8aNHjp79amqzWP81K7KZW1dFNgjcL5h9bHk9iWZJZev2x
w9nGWwdmx3t0/cUz0rQseE44MVrHUHn6CF9Pq1mjnFi2XFafTzDvNssIz3yyY9tulm7Y8DDvtsh4
IR5rkcCaeLJ0OIJc3yNaeG02quRl0O4316mr8ibWbrFKbbFEypklWGdU2bIkYr5e/8EXetfpuPo2
4hyYJOjvXyohZ3hIcUr70Wgfbfeb7iRVjSRaHBk1R2WLTNswPijxSXGLaZP8+A/aXJgxnLpUdOxr
4BE85LRpnNxbYDKcEZEaXaBEsUap2+/zQPdieVP33xlByVTo20/QciqNw8y/+wZrwZ6gMboNNx9d
l0xkSS8hBN8EzlA3Iumfs+U9u4lNewBJsDB9SPkXsYAALjpgzkkus2P+86v+TMSjpQJhw3Hd/qPQ
USezVPUTjRHVJUUhL6mWJ7+Rzcr4quZjOdUUC20kIE818NYEnchjWGdcCibhorLLz3NqXfYz7/yl
wF27tU8KtiV71mz3ByvZBF+BQ//b/hjjqiZZ97udLv5tEhXflV8W362ghfP9vvfBoAwh0fJIqwjI
dH4qB3jZrO3+lh7KdAqeA+aQQwTz8u1Dy/Qj3s1J8A+JHfhFVg+Eu3o7QZ3JB61n//XO9SqgIwTQ
+Lpq6JEjakbUezuEasgfcn7bpb53iUUv/ii50qOhcJlSl9P4d6VGo/5y2Rah9mDVxmBb5grnYlPB
tIfgdjoZ9VVbsu2dsNtGMsnr+1NQ0ZI30auMp0w+4iPGuNlre9Fit1HeJQ9mg9d2/zqROjnK7gcF
C8wTBTBvCNzuJ/40vXco/653M7DPDUoEgw/65SoT26KNmHKn1QHVggivIMHBAHE48Q9973KgYcFh
fKpU9WV9KiaOyRzhqze2B2oKyVGcRwet8R73OFvoLgXJ0C3u0zWaBl74OKdOnCtCD1rY0HMC9QpS
W0uJAf0Lg9y4dEYkxvDKH62o0sNmK+Rz8chBFlZ8PKKYJNnBEdvMyNJDxkFBbEPUV2JCjavV4lrU
jiG7K+c/sp6YpUaCEyQ5T0Oe4+FqImd9PmpLQwrjyWr6qygVDK8GBGXDDtjDqLw2+oS7L3/dyNnt
/1j+6w5VDNP4yUR6T3yBFWbV51abs2/QxxF0DIPDdKP5/ByK5GlsDWCrkXmTPADt4q/Y2MPmo8Rw
pdDXUw3vPzJvt/6S3/kpitVtzSiW2ObJIuDJ2U3UCl39h3c8KTzgoPXpnn/3fI+235v353BATBOs
Lmvbcsnb7ei7Hj/+LP+jps9gjv3i7jS3Pur2fBjfJRXRU9IK/2/Pg30+lLX4+x32Z54T8OpZnXHd
hKs7jiIPNTvrgOGMA7aWIkgFaL4ITcfBW5ei17i3oB6qKtvvdunPLCM8z5BmWQfoO/OtsLckVBGK
cZm+PUxWKDnB+/xTeLU1mnHOtpFHy0Ve3pLug9IRYm/RaLevMhifIzgWwlMQGWNplhFOxXGZ9BdM
o3WcHPDH0uTHYQfUz1q7DjvXlrBTUhdMt05ZB85xvJafACKpX/EDgQ5InoyZMavxWVyc23VFXPdk
wwmPtvwH0zO6f7N7u1Z/ZokW/jiOQkE8DpM9mW/T43zyEBp4BznquORzYkWczLtpk4u9grelMVAV
Xmdk7G6c377BH2vFdZ7X4cPr0nFhtsA+jbI6wB8RLdNn+xjrmA3F/YkewhmSj8ao0dNFNxuG3YNo
tpii0KF6RL8Fb0XMdtDzObiv5BxADHco9NTROvg9aFQZM81hraQ1xOffQWqN/NrJeMWXMOxrr7j3
Xb5WrPIvoUEP275c7DRXCPdP6NvMnWSCsI1yssO/H/pEjbt/qLqP8sgi1p0O7KGjwfA9SMOvsWrq
Rt4CPI6i8YdUggoiM/HeQpQvS8mfcKxtohwW1NAIHpbQxRLYNmf9veLYxvMajrillsCgTRicQzk/
4rBD39EOIJZ+hqxrnN7o+1hW2UGMpkMa5DVtzdpY2SOoa+IPtPZUcg+LVoyyBC/DqsyyhL2Onjlv
9F5W8Q0zWMzYDa9dpw5xET9+omxbEthPaIYQSIrsenJO6a036zjy9r5bEzhUqg8TZKxMVSZEW+0N
6OFXceB7HHRoRgvbR/NEG16MVzXEz3EzDamlFLqeg9OMtlMWaXAUIZw3J1ptJtzZfmogFQntDd+8
E0lSPCeoShyuED5jl4XHpJi/kJf5ySbJ5KwgHexwfu6wFqrwaea/8I5KnQ3wpTAlunaLxI889/Hu
jlMg6VK8vGiUXQ+qkJ37/on0/7lNjLjD/mZ2il8tDCcyBLkPhQL69Am4+5zZzrUs6Hr6IPTlE6gk
GYq1Hvl5gAuHMBRc/7sob07OsBSaHUfjJCAWe64O1xEKzQsdFdwEGdE6YBr5FxAvGGEgOCKYZaBV
v96u13bAtuK2eTdaf4nZJhR+HHmWYgBc2EBtCSEj2Goge3fG1lIJ1zDy9h+5YTnLQKrVBCsmrmTk
4T/aAFLSmfylFT1eK0u2UmGDwihjMqRLcvug53BbyTeCD8AzZOf0Zz/nymPKh/Sj4HZw2y1GbMoI
nynYKrRX2kVAt9CjYEIsbNpsRSikOElHXk3c5gzSf5CwOeNYjwfiXkX0CrgINo7fnImJ3ZzhGLU2
ZV9FfKdeRZz8chORdeS1MR8fyRGmQ7+QryIyEHfk5ZB+gbIjT/Qk5UT1hPXExy8xFjDLT+WRn0Px
BTKP/MO/ssD7L8Ar4SYF045mn2j+lW0MvwjzjrsIU0kAzDLFAWZx66lARvVUGpJO8jpKYk6KmydM
I9mm4Kto77RfwF1FtPJP+xAGpizElBLlGX+Znb6AWE9VLp+t7A1vNtrzq1RxS+kDZpa5xiRWvq3o
DeNn3xvAt7swFn70erWc8ErNR7cnX3fZ5tRF4PEhJndf2ZE+S4Bq3kwk8pckfGNEsiAYUN09lk82
ZqYAiOHu/4cyS/h4XtSRJg6u37z9x8ofjnkN+hVrdCLwjhfXFWvUkWvDCPle7C7YpQArUdh33W//
qaKWFLj0hwy1JJ0mH/hqYqwryM0xx2Feg/Fed1g73di15JaIt3rw1/4AfZ4/3+haER4DGYhR3r8d
YBh8Fx8E0wm67YF3jnga+ET495bT139T2vP7NyDpws8H5vcHiQSZYabM0AB2j8xvjoDIc7y/Iqw0
iEWiRCRkIMpI6ph6Gtjfv0Iu7H0iz0LkJygKnu1+hrv9lX1FW0Aqy6Amkj8jdTo13I8r8BTPuW+c
sV4rmV7GEg2cmksJLtozywsAmXtp/znx9irojiP0Ty8JJCxmOssQbCT+TQ/Efvn7ICRyYtd1rp5H
NYqj5c5F7xc7wwE0eTA51eztMwnqLuCvIeKKk99gp1ft/3nb2CjbqLusuywrOthakfNjfGJ+jq8o
J+JN5bXRG+Uvunk2qnDeh0APgr+PDUYETUZ0wDSiPQTKwFSDyfJ0avkIjjEpoMIHO/4R573au+Ud
7mZH3Swn4JWHO45bw470LPbNLzu96PiTyeMYTNvJ7vLTwTsmIdRWRAqFdC6VlhRpyBc9Dl4iTmwK
vDAXvWzwoNNeRCKOlBQLJe53OAw6taigBM0/mNBQdGTkts7CRFUUuTj7OFIsA5G8UPT+zVfWHoFC
x8Xqjg+L9+V2l/eljw92j8eLtNUGk+kJrmFs+H/1jLwdBqu8RDpAkUU0HuSva3u5e+rtQJ1xCu+h
kO6/O9e1EYf/B2NAnL/ak1fGHcH2F0YULRoZrxHr9PdPvHYsP1431iN2vz7xBrF+5onnxgaKpDBW
GG8cK6xm58ITv7XoaCx14RkYG1L1GO8X7ZcZkfiOtyV2u8bvjnfWGIuH1RPxnhof8T7CPcRom8Vj
8TQ9SjNWY0kjZSeztKV4b/F+ouEQ3j+Kp8vjg2TttBD/tS5qFx9aVBofIV4OxkdL/0riEySWC+JT
JN6HxWfErPhsieWJhSXxebE20u4EiZMxojs/vji+rOhsfHV8XXyz9Fjjf2J8O6MskBnbVDQmvls0
ovF98YNiS1ctI0LTrBWd3TFFveJHpP8VMuaTIh8neq1l1Y2LnxGuRfyhhK+oXSKQqJmok6iXaJi4
kbXcyzyJJokWul4TrRPt5OmY6CqrdYBZsYloohetSUuJvkVjEgW6JhNiWTQHJAYnhiVGJsYUTUuM
89afrsDSxMTEAIm1IPGWLaXTYvmxNomXYtmJOYnSxMJYv8QSmV+ZrfiExIrEmsQG8VyzWCfp07TY
1sSWxE7R3ivP/lheYgURqKNkrlRPHokY9VLikNDRWCdZwxMTp0Q+JHE2aSX2JzOT0nYyK5mdzEk2
SjYTX6eTeRrvyTbJ9slOyfxkD41x8Sxznrw/3liirU2yX2JAslCeVHJgrL0+UjYkmZccLiPIj90v
JaNi/ZJjNU4FC5Pjk5OT05OzEjcm5xYdTZbFUslFEo8DdWzJpcmV0mahROgQHV/x8aIlxadSMckM
a4rPyvzsl/F0kniZmLbSmZIFStNByRQbEtOS5emsonpFKwo3J3uks9M5uq4lZsRb6UbpZum8RGm6
Tbq9RKhmjlOSzdQ7pcUrilcYjaKJqe3pTmJL8x0RjKbJMhLBYmtnOr9oWrpH0cL0/UUbYpborZD+
HE/3E25Jsl+6sGhNvG0yL9U2nUoPTA8hC3qZLD28mMyabFO8s3hnelR6rOS5QybXpcenJ9OatJSe
XnQ0PUuzmeDx9Kz03HRZelGqbloyerKfyVzkrszio+mV6fGxfum12pPkWpknjZ1+yU3JrRo/5olP
kH5vSO7SnJT8UOb4QKyHzM5hiatmkg+aJcvF13OTX8baJ08nK4uiKScleafoUKp2qm7h5sLNqQYy
g3Mlbo4XDUvlphqnbk21SrVN3R0rTOxXvxctibVJdU6Fi46neqb6JA6lHpLVM04STDo2UNrfL/vj
4dTdsoKDkrMKpWRQamhqRCw7NTpVkpqQmlI0MpaZmpGanZpXtDM1P7U4tSwWTK0Wq8HUutTmor1i
eX9qu/QpKH3ZndqXOpg6kqpInZQ+bhHbmUXHRfNMsa84UDSuuKZkmzqylqISN/WkTjOJlTbFDSV+
y4tvLFqYapwsT5bHJyQPFO1P7CxuUtyi+Ebxg1XcurhdccfEluKuxdHiXsV9iwuKE8VdY/nyHpA4
VTy4eJhoj0xNSG4tHlM8LjakeGLxtOKXiuekJhSXxmOcppr/3w3zf9ENM+UbxK8a6ur/Taag1Od/
2PJlFcyVp0yeRfIslWdlwcq+8hSsLVjbf2//vQWb5NlasBXZLnk+lEdlB+Q5LI/U61PRp6KgXJ4v
C/QOawWjwe7SRm1uND5uNBZ3GZszr8NdxuUWE+DMm8EtJpNbzBXcXK7k5lKTM2+QM+9VnHlrc2e5
mtvKNT5/7VjtgYyJ3x0WtPL5C8Lybivvns7VXecVdP42lJ8v7/lCi/8BLTOU389Q19XfktYJbb4M
bTeUP0Teu78d5Y+S9z6PDnp0xFC3/eadP11olvAVQif/nvLL5H3mn1P+UqGVYtfnUUCo5jeJsV1C
3epcQvX+BWoodONlqMll7Cq1uIRafzuKit+7tRPq+A+oq6HobkPdot+Segn1vQwVGIrKvHVLfDuK
ytx2G+DRYI+GGYoeMe/IAXnvFBopNObvKSox0G3cP6foSc/GRI+mCb10Cc25DJVeQgv/BVoitOIy
tEZow2VoyyW089tR/mF57y1gfVyWpCy/XOhLT+/Qt6SjQscvQ3s9m5XyPvXtKOTI++xFyrcu0gWd
2t67rlADKcu82FZ1CuV67Qf/OYUaC936zfr5WZdQ9mVI67aSd46823rvuy/fn39E+Y2Eml2G8oTa
XIbaf5NCnavl7+r5tipfenksFC64kF9CPQu+mT+q4qT6vHr+vuCjPtV8+9A3+3Qhp1TPAVVr2Ftb
umdUxXz3epfE9ClTHooJpYUGmRyh+0tohJHrmEKjhUpMfi3Q+ZI8GZoiNMPsAaHZXn4/Y+I9JD6p
ys8h2dNCi814Q8s8P4hNzZdqE1K7Mp8hyYsh8V1I+hBSu0c8/3r+1Lrsk1V72MFqfhY7YZ+xoWVh
2S/CNb1+XTpPl8zRhT2lap5KzN4YrmP6Fq5Xrf4ZMxb+vdjb++Tf4YaebH41WnYZunRf3n4Z2l1t
f622x16gimp0yf56Yb/8n+yTDQu+uRc2Kbi4B1bb7y7kLKFwR+8t+1Y46q0xyR9h2ZPCsgeFZf8J
Jzy5rGHdP1i3nc16Css+Ex5sclF4mLcuvHVQlRc1ttSO5jnyU9UaKTF5S+tfyIGXrq1L1lVVfrmw
tkq8/o/x5nzcxfroy3oLy94Unmb6HZY9Kax70H4vJ+kYZA8KL/Tq/bMcdGkev5xOVZ8vk48vlGVe
pH+Y6/5ZPs35Jv1dnqyeK/Oq5chq+RDdHE+njfGB5ujuEj/dmxjSs43Ot55purfwZBIrkU7Cax7z
zi/d5WwUPuXlMZnT7hpbY0w+i6jv1V/emaB7Vy+X6f4/zctzGn+yR3cXe93FXkT6213iprvY6y5x
1l1tSox1H+nlz6p8udA7m1WdmwZfzKPY8mzQxzEmX9KvS/PwJTn4whmmKg/rONWWlklMdZ9Yrf44
bzytjb84c8nYuk/zZO2qUdfL0KVnwYLLkOfXS891F2hkNbr0XFd1RvufnM2WFHzz/LWm4OK5q/oZ
q8Cru6KaTy5dW7L+wlsK/m5dhXcWXDhjhXVd7ze56EK+OmTiOnzUi6cqueqc8uJP35JXIt66i8ga
iwQNVV9vkSyTIyLZJj4jjS5zjhGKNPMozxB5UO238d7tL65BXRMR2esiPaqtP9GL3G/WW0T26Eih
UMrsPVVEPiozftIxRwYKDfFsyzgiw71xevoRudNFxgqNF5pcQC6KTBeSO1xkrlCZ2f+UyJNyJogs
Elpq8nFkpYlT3Qsja4U2CW31/LVL6ENzT4gcNn6KlBv9iOwdkdNCleYMqPm/KjdHZQ+I1jCk9thn
JLajtY3fo3IGjTYwcRbNNX7UeYw29spu9Wy0Mrk8KmfEqJwPo5p75DwWlXNYVM5VUTlPRWPGv9G0
l8dk/NFB3nuoiYeonIWicgaKyh4RnXAxfjR363kgKmehqJyForM9uZdzo3IeiM439nWdRMVHUTkD
RFdXi9Wqe0DVHiV8dJ3RiW42Mv01Rq21tdb/368x/jd9VuY0cdbpN6rWZt/rPl9GjlAjoWZCeUJt
hNpXe3cSyhfqIXS/UD+hQqGU0EChIULDhUYJjRUaLzRZaLrQLKG5QmUeLRJaKrRSaK3QJqGtQruE
PhQ6IHTYa7P8H7y/FDrtkepX+nyZjpFn1hCq7fWt3HvLGDLrCjUQyjXyC+/GQreavma2ujjmzLZC
dwt1FgobO5k9TXuZfYQeEop58rTQIKGhxm7mCKHRQiVCE4SmCM0Qmi00T2i+915c7V2lv0xotfee
7dVbXa18ndBmoe1Cu4X2CR28+Fb/ZB4RqvgX3lW+OGn8+K8Sc1CdehhS+8zXAU/3yCV0xvxv56ve
VfWr7F4REKrpzbfIr6hz8X1FPaGGvtdDXUPRUK9Q31BBKAENCA0ODQuNDI0JjQtNDE0LvRSaEyoN
LQwtCa0IrQltCG0J7ZRnb2h/6FDoaOh46FTobNgKZ4aD4axwNpQTbsS/m8mTF24j1D7cKZwf7hG+
PzQx3C9UGi4Mp8IDoSHh4eFR4bHh8eHJ4enhWeG54bLwIvn30vDK8NrwpvDW8K7wh+ED4cPh8vCX
4dPhyogTqRGpHakbaRDJjTSO3BppFWkbuTvSORLWcpH3jPSJPBSJRdKRQZGhkRGR0VBJZEJkymVp
RmR2ZF5oQGS+9yyW53L8MnlWR9ZFNgu/3Xt2R/ZBB+U5Ik9F5GTkTNQXDUA1o3VkT6h/2b+44PP+
4kImf3GhBn9xoSZ/cSHIX1yozV9cqMNfXMjiLy7U5S8uXMvfWqgfzAne7rsu2DLYydc8WBRM+ToE
BwR/6rs3OCT4hC8UHBl8yndfcEzwWd8Pg5OCb/t6B1cFV/tGBTcFj/lG89cX5v1/3DO/v45/EL9X
WaH/N/ncPI8ks+S296iTR/nVeCVZNbn3e7zq9fP4Qo9SHknWzZWsmytZN1eybu5YT3e8p6+yydX+
Pd17z/JobrU2y7x/L/I1zd8sz/b83fn78g/KcwQ8mF8hz8n8MyFfKBCqaZ78zaE6oXqhhqEbRdpE
5A1DLUKt8w+G2oU6yppkVeaflHUZDRXIXF3FX9rw8Tc2LP7Ghh3MC+b5nOC9wc4+N9gtGPFl8Pc2
agb7BwtlHoqDj/iuDw4OPubLCQ4P/rsvNzg6+IyvUXBlcKWvcfCd4Du+W4LlwXJfk//H1v2VDzo/
EOwr0eGvvBK+Bvzt8LfDt3S6CrZyhyAvRP4r+PGCee4b8F3hTd3b4XtQ9zbBW5G3cgZiR+vmYb+f
01LRfVB/++QOFz7L6ajo/kxwMTova7vn4M+tog+jkT8C3xK+JXwr01sPh4M/RUdsnvtPp6ngAW9E
TSl9kF4xUudOxlVMz1PK23vhMyn1UetVJI9SN4TkKvgO1H0ca1fRkw6gi05rdBKCLeBbwOc5bZGn
4VtjATnYktI8Sr/v3KXoPkJP2qKpfEv7S3SMH8ZjbSXWdC5uc0qRG2wD9kQnhs2l2BRvWPdpi1Zz
t0DwWVdWtzUUvgO41x0sOFJ1/BY4FX36afkU7QSaU90iwXnYvFol/j3K+09QOgn9e9F/AT4LayfA
A+ifcf4gcstZL9jT2aWtKO//HEnC2SPYTnV8pxT9+eDX4CpF20azG3Z6q77/EyyUwi+gtAv659Fv
An8YXAu+hf4x5yeiGXb/Q/jTGrdWwH1H+EqV+wvdzYIHHYkEK1t1fMfcpwX/qug/7EkE7TzsZIMN
qBsHJ4HXOucpfVj4bYrWPviV4HZwqtNP5yhwDFwKloElYIViRj1pq5WZQTSfDejfUCmE7wDW8rAM
LAG17rVorqN0EZK9SEYimW3mXXnBpWAZWAJWgKrfDc0R1PIZdH+tUQE/lZ7Pg18BzvMkZWAJWAF2
krGscUuIopQire8BT1B3kodLwTKwBFQLk/DGC6pjTwdfoM8nwAPYOaB99h9ztwieBI+5M8FBYH+Q
SHDLxcK1zNdpNA+ARz18mhhYq7GBpBILlVioxEIlUXGQ0oNIDnqSFYI2Y7nBXUfMbAEHgf3BHYpE
wgETY8pLpKm1HfDH5EyvfRCJ1dZDGYu1UaPUaoCkAZIGrO4GallwPbiCyJwvYxxu4hPLE8FJXl1d
F48R89fq/4lb2poJDgL7g+vBclBt7qPuPryxHWvb4afCv+yhem8z/bwvQ63VMmgiDX6eQfdtZnYQ
86ilJ+CPBf5NPWxQe+VDIndaxWzk25nZ7UgWs0YagTlkodvJb88GGgs+hfxTctFJ+Mm6g/j/Qk6r
ZfKhavpruEnBa8hmY8Br8cZCdJqxFt6Hvw8s9XKg7C9+7FsZioEdOvuBX6g3XHKpU6A+CSxTPtBM
efsIsV1KnOQRvVuotcxdrHWdhfRKS9Mmnwc0czZVlLW5izW1i3Wkq+Mm+EmU/sUb42P0J0Hd19B/
DT+TYdwj6h9FydWKZr6aB2R/tIaiXwt+HfojvexRRh4o0d2BNZhAPhW8GryJVvaA5zO66mxmzKdd
Lb1XZ1lWrvJZHqrNO7ycPEv4esTkDiQ54IeB63R+ybcvE88PkLeXaBZ1dxKT21XTbUzsZapE5k5j
OEvzuX+LWcVyV5YdgXnZqR6WPLCCGFvBqjS4nvWyAlzPDqK5Olvrij/fodbTrKCniUNt5WfaK7ub
ltrdTFZx5Kziv5413pFaywJfkR9Uv432ViJZJYd1pUuEv687Cz3P8/LP02hqK3PBSeDawM3KB55n
5XbXXYaVu4/SlR6aFap8r0BTSsuRlNN/9XDrwA7NdfR2pu6G/j+yJ2bT23PI38Dn18PnMJaDelKy
ejhqf6sTFDyip0ervqLM19NkFZ21GYxxlq41+3b2wVsU7RxHJNZ7WH4RzRNY/jP8n+G7YH+Lel5Q
LefT54GKvkXwR8EH3Bo+PVeo/buYqSZY2Gr2Xz1HyTnhYbKfRvg4Ti9HnTSj0Hj7HqUz6PkO2lqF
tWwdqfMn9YaLT5yvmN+hur/bddWa/b7yzl3wnRlvBaP4ilzxFSsxm36S7a2V2kO7FWO/wuut9iQX
vpkjZ1f/Rkb9e0dOg/676dsm6hLtVltngK5xavXSM7DVy/5McIpzr1huzzwucWIan9aLwu/C2qce
qrWXsXMHNvMcR/ATRYm66316KhMP2Bn44RVqDQYnEgNHHPXeQiw0Bn+FnSj8zxj7TPzckTGmqfUp
uA8sVo/JKUtHMVpPrcJfoVHBHvQo1grpZy/sBNxpmgG8aNTRvU1/zgRuVHRPgO+Dq5DngvmaE8yZ
UzWtFmBbdw/7iPKdzSkUOzvAjdjZiJ2N2PkI/QT6CZVYg5C0QxI1p1blfae0J4Lvg6uQ58Krfi1z
sqWVVQY5R3XDTjeta/WG7214tSO4CnkueD2SBsQP5w1sfoK1k2ApuACc7+gO2AWbXbDZBZtdsNkF
m13wUhe1bDdRTbsJHliLhbXwb8G/paMQr86i/4pvmvEqL32bhZ1Z1DqBBZW0oZ9febiZlaV96One
xmrV2Xna0dPmGu92oK2sd3azZrkdqKbPnOQPcbavzy2gK/ge1upj/xS4G5xP3T5gZ+ouQ/4puMWR
KA3k6rgCZYpOWnWcre5yWem0FRjs6j7VD18NwgNfox9UrwbKWNe309sdxMkn4ETvnrKH2dlATO5h
1vbgGeJTV5l4oJHOlHut4EvciSw0G6K5A34Mrbcz8cZcvKoS22ambOTd0P8E/AosBTdwki8NHKYV
lZzXeZH5Vf6wh8w1/DITOSqRSMhnBvOZcblH+8bYf5J7ZdS9UjEg99Zz23QlntvmyizbL3JS2qw+
ce7UfceJK2+/Af4Seamex5yXyYroy9lYz0XfpW6Ic9EjaL6r901no2Zpm/uj3Vvvy05tSt+k1u8U
M65DXhcLZ8H56BcQJyN1Luy31Lf2fvguYEtFJ0fnyMklNkrQf4eI+kDRnYtOS6IiWzXt55jZz+DT
lN5CaT2ipRMWzF11PtiVtjpwKniZHbCzesz+hB2khNy4jl1jg55P7NmcSCewB83hfDgCybOcaiqw
sxrcBb4PfoCdQ+BW8HH2pg/YZ5cpuu/CjwSXk11PsQf9XM9vTlNOcR94/FKwDCwBK7RUb17uUfzf
Dc2a4J2BHwmaGxk3RHu5h2VgCagW3kBzGLXeUomgSnqoxH2IqOjHWfdxMAQO4mQ4mPNnZ+6knGCd
RsTP27SFpl2iudRBIqijOILlmzxcCpaBJaBYc2/RO2ngHWJmo1tXal2JtdlgEcj91Mli7E/AL/Vw
KVgGllCq43pCfeWsUj7j+sCvwT5qn1qOh+of7gj2fPWD3YFT3wgPZ4KDwP4gsaQnt0AN5v3HaHbW
3Oje5G4U/nP3XcFfI9/t4SCwP7gevE3jjdINSDYgeU7PuvbrukL9/85ZuiH4b+DjnC1zuAfdydm1
GafiCUTU40TsBD0HWp2x/Cb8E9xel9C3j5F/rHacEP3frxLnOg9ngoPA/qCur5u1V8539Q4beMXE
vK4I6xDWrgRnc0IYxTrK4vzwU+L/JUo/8HAmOAjsD65HR/zp3KCtuO/q54qCqrOcWsvhs/DAKbz0
oVvGWmiopQa5sR7WG6tzRCXuKu2JsxT+c3iHOHHQH+EeYxYM6u11m95exRsaFVudUfRNI9YHv5ye
L6fUZNH24JVulqBP58utH7hP+Dkqd28gkj8Gn/ByqWaeleTSSeiMQ/9VVtxnrKMryahtyMAz4N/W
DCxxJbXcNczLBmxye7UnY/lRrDWFX6r3X7nhaukgNFcqZq7SCM/0cdv6FZb5zCTDZPs/cLspYYUe
ZQW9xeq4A+R2bC/AwitY8znPSq2V2Pm99s3hcyqHG7HMhe6hce7CjykvFirAXazrCnAXq7UC3EVv
3xT+eVpchpfO6hnAfpHstBF06Nvbekd2fgsOUbT55MTeHBir+x2reBL8W+i/TN3nWeklKgmkNBsE
HkH+LvoHwN7g7MApxYy+utOh8zuNnIzr4OuCLbF2Fv0p9LmG7g5OHf2cyrnNzSZ+lLe0b265zr5T
h7Uzwtw3iYf57iaNE5U7n3h3av3Esow7zp2s6y66R2R0Ze7eZ6buUj5Qw60lpafZs5brjViiV3NC
Jy3N6MrOMltXk+SrFeB68tIKUPfQfD5Haop8P/L9yD9Hfgj5B8j7Ye1jWjE3rxHsjLvA5dque0BH
FODzWHsxN+457HHTVd/6D71fS5brj4e/os+al+7Uu3agFqu+gtW9WlE8uYU8cxs9UdxK6ZWci67U
k4/kw3OshZlkDC0dCZZ42UNr7SFvvKP3btGZgXwG/SdfBZ4Sfil9vte5TvA3ik4O/l/ESD9idoai
84CnqZKG3IPe0zE6V+sd2eZTZdvc2vZya9tETn4SPzRg3ptzL/s10VLPlVwUyKTWV5wQXtf7uJt2
5GbhTCDHDqTuQOqOhy/Vtqzv02Ih8/Iyt/4YI/o5N9xdrAgHyfN6K3ea0s8H0T9Oi/TKHQM/Qu/m
9k/gjc6jWGgN/ljPS3Ju1FW53LlW9wV6+Clxbm7T9xAJXRj7bfZKGVdftRMYAg5XdGY7C8icuiJ+
oLw7zB1Gr9SfvdAx33esIpu5Wmo/pruY68dObfy/nB7+Tu/d9ofwn+tt3b4dvove1u3XGMtV2hOX
FeQ84NQXySz6P8r+XPApWyLBOarf8gR+y5nwYb2ty+i0P9fpnd0eh83HPFQf1gIf0Hu6uxz8kd4j
7L/p2AN18UA+d/CD1CrQe7r9HfjVlJ6kP/9FDxcj/4LvMnLUM4HGtN4e7M94B4CtvbOl7qr1qbVF
b+7Wn/Tmbv8c/9Tn88MD9PBhMJ/ZeY55DOmsSfQKWguQNKCfM7jFTAI7GJ4byiTW2iRuOpP0ViWl
chNxb+ZEvQbNZ8C33GfJh8oHwZBBLISwEMJCFzQruOs1VYnTFMkeJDMcmXE/da0bwbHcl3/IffmH
3MLu5H73a70rSSSIvpVC8wNarMv5sznWmmtdpxP80waRPK3WBFchzwWvZ2cXz7g7GF3akVuh/RI2
78S+GV178Em9e0r/GQU2m2KzKSOtYKQV6ivnAbUc6OTuBJ/RKMLCIoP4pxC+K37oEAjjK8Xu3N8/
1Pu7jCKsn305O2g3zAr6CAsnsBbW3Up7JZlH8UXnJsGHnNEiH0ZG5b4s92stfQ5sgKS9M0b4QY72
rTkS8q1zPXPxGfiFor1Z0d2q6DQHn9a67q208h1sdgPbgnOxVmJ8hYXPwcZ4+AnwUc14GRvVA5lR
/Hmae98jfEr/qPIZAXa9h7XUvRkPb0azE3xc+YyNai0zqicTt5L74J2My8RGG2a5E/PyEnwWFtqh
85p+PmAXqP+dbGZhEbFxg+5i9mEdnb0Avjb8SHT2g82plQtmMZt1ta47R2fcnYu8JZqvMMvPKW99
huTOQGtwisYbmvV1NiVOniUHKm7H5nz4m+hzFj58UuWieZrenmaF8k39+Vd9fp99/j34BfpdNph3
/hX4W8AS/ZbcK30VnIP+cHiD9cBJyE3dhfALsTYf/BjJx/B70RG5dd95/US0OfgsOBTsAO4FRyr6
LUXfSSR5oE/RTsBPBeeBV3u8fmuwh7onkEwC76XWC/BZlB4AzyChFasnks/hjf12tH4K/IDSr8FV
WLPR6Qb2Rv6Jx2sfSpEsQNIF/jy1msAfBteCb4HH0AzDn4YPwFeC9cCDlU30ZEh/0Pf9VSW28UwD
MFslfkbtfwDchnwf/EpwOzrGe/dV3iMWWpm5UN7qAM4CZ5tZgM8DfeBUcF6lnk7XGP+rxP86eILS
P2J5uhkd/LXG8+hUonODGQuSA/TqMPwObyz3MK5MqTucuiNU4sM//qfQzKuMMooZ9HwGvZ1B3xQn
ITkBHkNyg6LP8A3AbPAQLTYCc8DbwU9py0TgZPi/gNmVHQV7wV/DzI4xMalyayF8s0q9fb8P3xY5
UWFlKAaItMDjis5yLJxTDwQeVd7dzFzPM545/6J+24j+L0xsYG0yffgKna/x1X26KmVN1SP+FSea
WT73pa44RjrUQwvMEbwW7ACOpHQk1kaqRPyp8s7I80Cfhzm6L8BP9VA1o3h7j+f5HGZhFqj8vSq3
X6D0JLXuoIcmwk8yIvzv/9DMCCN92cQzfAydJXhpp8ke6itnFx4z6zcLvgGeWYv+2sq79VMp+KHY
+Rn8TEWbVWx3IwJP47dJlDKb/uuRH1Mf+s/S5wDey2ZEmXipUlHiyvA6Rnzl/wVo4vBhD3OoOws7
qr8NmzspfRXEn77jjPooOBP84/lrBM8xxhpI3oC/Hj6HWesBv5WeH6G0vvKSMUpFcjelj4EzKJ2F
B4h2+3Z4s9Kz1WPWLcjNingPfBHLcSzEsbzb85LyJrNtYV2vY7V+yiyQVfwOnr8LOyYTbgX/63xL
9ST8ZpMD0RyH5vdMDqSVHchZfc4o1s5G+K/Od5F+mn1kDtnmffWVcxd8Z+QV2PkKnkxoXQE2BXPN
mkVnI/h7LzvdIchO4d+EzhKzokEygDUFL7VHZxdo8gZxa7EviFflTmGz9v2vgINBkysag78Cf4Z8
CHxHME0EPoH8VW8v0Hge7fHqAbN39EOfHGIVmj2F2Qzg/3rgJHAbuBIkn/vfYL7Ow78NnqHudjNf
8HjS/zl8AozipVPwtShdBd8N7F15SnuI/BNsTgQXgPO99Wva0sjfSOSfYkX0BrsgXwvfBv2nsca+
419P65XEBjujn0xu10dzFdEC7z9FNt4NPx95H3iTV5n9QBkRVRt8hgzD+STQEGsmI/Wmt2+df0m/
Y8LC+cpfMF5B/wbwDHm4J5lkAfgQmmfIwzUZi9mnsry8mkNsa2Zoh6Qd3mtHVjmFvBZ+WOWh5l4b
zW4eqoVSShd4mMO+MwAf5tBPzUs5lG4B36JuDz5jPMln+A34pLFB4E3RrOn9ukZ/ndKG3+Sc47Pl
W/RXjv5tilYZ3/+u5+7JJ1T+vzj6y5w13Mj4tsXqFLhSVzrf4GxV3noX/ktnL3dVvvPS87mvr9VI
50U/kbCbOMXauvNbPWMob1U4X2g0KtpfOvN8+vmSaPr2KfpT1Oqq6JbxmUYAvNUZoWsTC6WOnHvt
flg4q6WBXtTqCbbi9wmnwUwnW2fcflI9Zq9THeWtUfpfuFgDFO1B9n6siaZvk6I/19RCslPRKVeU
USjOsZ/XUWCnk36qYG0wdijto+iOxsJpcD84Dlxs6+c5TRStlbbe7nP0Xm+dRlLH7Us/9VdkNVXi
26m8b5+i6Cu/SfXddtjJoVYLW3+/18ierrNvz6Fv8/UzbWotBtsiaaz67mpqHfJ6oqV9kMyyh2u2
Qd7eQ/0dkeNZm6Neom9LlfcfoD+25Vd0T+pfvYG3LEsl/tWU6i+QW/oP8otZ/VVbD2ucYHP91MVa
ab2gWdf6ufbc+p2ua+WtsdZYwZGWfrttqb5/EthT0X4EnakWv3W0JgreZj8n+AZ8M/sV7AjvP4Em
da17qfsC/DVYO6FR6v8zrZ+xrtG1bGlU9LHq0c/aGv8W3/JbAZHcY12la9m6Wdey6vuj4H2Kvr8q
2jYWumKtt1Vfc6a1DZvKn7I+0V0Dfj6aYSxUUve78IfBd/3q4SX04aj/e6J5q18/4ZS8KJKzfv2W
+Zz/pO4FVgvNq9YovrXXvyx7zH9A+6Pov8eqqxJrme5c/r/ongs2AG9VFGuCvk/gJ4J1/PvR3K8r
HX6ff7juJtjc5p8rOMX/ke5H2hPfp1j4q/bEOuvz6a/QneOKgSz4/4Svxa/Tr4T/PvLXkYgd5zcB
sen0BTuB5Yr2EXCBolsT+VlFywGfR9IYnR8rBvag2QQMU5oLXwjfB83DSJA74xQzGsLfTOk74Ekk
tGL/AT4OPwrsgWQ0OEzRT2+t9pS+B3+A/gTQmQSWUboe/g34z8Du4I+QMyL7HHWNtS3gM2Ax+D6a
reAZl/03Wvwp/Dr6sxs8iuS3WItRqw2am5HfAL8QfiY+WQb/OPgyeAu1fpMhu0/gOjM7yjvl4Hkz
R8q7NZGchb/bzBGSyWamlLd/DBaCg7D2kJkvamWYWYPHJ4HPzayhvwA8TGmuYkZDJO/Qt9vQHA+m
jX9o/Qf0cI3xiUpkT1TeeAw/O3PAdrSIt/1fUIonrZVYIOrcKeAG9GeDO8EIyKgdE2kz6edI9G/C
Aj53g/SB+LEaEXtXoH8IndfgO6BpYqwjGFTMfE3rZn6HftrodMHC78Es5Ncx6sZ4ZjP6UylljTi7
qHUjbeFbe4pZd/hwD3XxrTMOvBk7b6LTAvv407qHukuQs8pcE6sp2jIrsaGJPez8ER5N6zlqHUPn
l6CJELxnDzaRTLs34KuFiv4vkLxIWyYO7wDvAu+j7nb4lljIAz8Fv0Y+lraK4H+IHcbl0rrbGs0J
2JkOj+ct8oMzFxwK9kbHtPgn0ETI25Q+AjIvdn1a/AmI5zOQOCdocThyk9NYg45Z3axc9yokdUAy
g01U2FizTKYiq1jH0aeuMwR8FSxFbnIjvL0NyUb4/bROXNmsHetLahF1rllNZkSr0KmB/ktIzLyv
Rt4TzAbps03ODJRg0/SKqHA+AllTDrHhp+eBp6j1JPpn4FmJzghwL3Lm1Mb/bj/k5CiHrOUQDxZZ
3UmAK9A/ScyMIn5MvioDyUUu68h+BonJnBXUNXPKvNvMVIBYsh8EWWv2RJDozdiqmElUuOxfLtEe
wNsZjD1AqYO+TY6y7wS7a+s+n95BnN9U6rdFfcFOYLmifQRcoOjWRH5W0XLA55E0RufHioE9aDYB
w5TmwhfC90HzMBLkzjjFjIbwN1P6DngSCa3Yf4CPw48CeyAZDQ5T9NNbqz2l78EfoD8BdCaBZZSu
h38D/jOwO/gj5IzIPkddY20L+AxYDL6PZit4xmX/jRZ/Cr+O/uwGjyL5LdZi1GqD5mbkN8AvhJ+J
T5bBPw6+DN5C3euoex6du+EnUzoI/iHkGSBjCXwO3kbpeDAN/oBaa2i3AT00PWe8zhywHXUZtf8L
ShmRtZK6zL47BdyA/mxwJxgBTQ/NjJtxjQRvwgJjd4PYZB6tRsTAFegfQuc1+A5omrnuCFIrk9LM
79BPG50uWPg9mEXpVHgi09mFzo1YxjM2/bffpLQFdvCMdQ/yJciJXtfEQAprJsJNrP4ROTrWc0iO
UfpLkNmx8IM9GHwRa2Ye7wDvAu+jdDt8S2rlgZ+CXyMfi80i+B9ih567tOK2RnMCdqbD4yuLleXM
BYeCvdExLf4JNHP6NqWPgHjSrk+LPwHxXgYS5wQtDkdusgHR65h1Qcy7VyGpA7KmbObRxppl1jjr
0TqOPnWdIeCrYClyk1Xg7W1INsLvp3UiwSbCrS+pRZy4JubNiFahUwP9l5CYmV2NvCeYDdJnm2wT
KMGm6RXz7nwEsgocZt9PzwNPUetJ9M/As3acEeBe5Mypjf/dfshZ3Q6RYJEJnQS4Ah2i2jGZpALe
zBSzaeP/ABFiPwgS8/ZEkNjL2Er8M9cu+dwlVgP4MIMRBSh1/pu97wCvouj6PzOze+dmd+8QQoAQ
iiGEjpBAiDRpAtJEiCgYmvRiKEIIiDQRpIiANOkg0kRERQSkSW/SRHrvvTcxkJvvzLkrL8nr/6/v
6/d9z//5P+9zn/zmzJnZ2ZnfnD1ndu7eDdUX5B9EWY1wjB8BvSuyG0ujAvsYYhRqatJ9dzu92yBm
005CLSqdoX8bKyL082liEu2lcK3hV0g/Suv1Axagf22hNU01mvs0GsVJf5+O7UallzV6upPcjrAm
tXYzUJPO29jdzYgCvUeh7w1nkGaIu+NRnH5bp3dRatP+SQrth4TS3sgi0s/Rx/K9pGlHpRNJ5tTC
TcJkwgU0dkcjH0gMNNQ7JHwL7VrEkhwrlutjdR1Io/2KLO7+CSKc0XXMktROPB1VjXZIymkNy2JM
Q302d29kEe2BLKL9EET/2DS9T1U/bbf2vSQ31ve2fK+WWXWSE6i0GslrSD5MNfuS7CW5HJVupKOu
kiYk0Bppzvr1nX4xqhNCR0UTtqLSgwGk0nCSU6h0MrUQRfq5pI8juQiVekhuT/LQQB+0zI4E+kCl
vbXsj097iJZQgDRLIAfiUZJnaFlkonv5NI2iIuFd0qSQPIlqntJo7tNoMNJzwkVU6tXI7pN8kzCa
6gPVGUVYhHAwlSZTH8aT3IrkBXTGa1SnD8nbqDSR2rGo/Q2Ec9ye6550Is0K0qwmHEFIIxU1qVSR
ZqB/Ff0Xdt3yWr/eCYyglru4fdD643qOREWNcJyOXUw4hlqjHQ9+njQNdR2jgF8/q1aJSqv45yP6
oS7qg6lOjNbw24E+U8uzdR88uUmzRstsDOnj/d9q+9T1jU1UelCX4tj17DjUcjzpw6jN0dT/nGkp
2M9B1NsH1Lej+iizG43lIulnkdX110exODpXH5IjqZ1o/xP6BuGJ5pNwhEZcTWk8TZpcVOciySEa
xUvUq1iatS10rt7Ucjvq4WmNHoO4LRSwkLTXtdXpOjxEa/T7d9BD0lVmBOuxeMKo/kUtmzWojkOa
hIAdEtu56CwOMROiGWMf0qgb+/XebCL1cAHJlr+RtjG/3u3MQliPzr6F2KhOcitdk92no6JJfkg1
t1ALY0geSfqDxMZO0hcgzT0q/YQ0R6m1T0hTiWre0ogeh+YrYIfU/7o0ljPUh9NkCQFLHq9HjXcB
J4klmnfCgTRT96m+n1ooTucqR6XRZD+nSV9GI/p3PS+13Doaz5MN7KOW9wb4d9nQPa9GYzlNXGUj
vY+wMdVMdM/7hK6LJ2R7d8kSAjU1b3m0jLZ9lyxZ12lOOIY0jahmOJ0rnGrupqO2UJ0phCuotJ57
/ZbEsXioz0tpjLtIn4vwR+pPh0BNGm+XwKh1TbQi2rUmi/K4rM4mqyY2NDOsA7U8kfzAWmJvg3su
3U5JmqlsAU9FR92kozZQTT9ZezTVXEqWGaplTyRkIktbRTOu+z8tcEW714hurSnNURThW9TD667H
y0GxRp9lp3vNTsLSbwLXsm4NveVE6lVJOirgV3XLg2mX+Ca0Ibtqo2N6WgOU3yCru0p1yA+IwHU0
ko6tx38iy19Fs6nHuC7gG6nmANI3JObHa0S/tIp8hfYqgRlZQOil0ggadVUa70nCUYRPqOVqNF+V
CSMJa7t1tJfr786j9mzjtM9Ee1hFV9N8soon9E3uE7LVJ2TPT2gutPyIeBvoRrEcpNGjnkIjrRCI
YuRzbtLsrNYoyYokRRlxmWq2IaQYB7e1HeIa+AT5wLvkA7WHaUj9LEdWGk02vJesmnwR1pxNNXX9
r0mfSDVrklyH9HOo5wdJXkT6Gv79hN3o6rur1+T6LP5JaWdpvuL11Upz+gqNKzIQ1/wb6fv6rLq3
1PNBNJYIqhnvpzUPHZsL8mCb4e7Mopz6lW4ZgN7zBob+nY6706gRLNJbWg+gNf4m+ilrf4J+Et5P
vwfxWyTHkBxDcin9nLY/Vj9Lj/pupF9Icgv9/Jh+Mh/lzSTfJPm6lvWvePDYlfotN6SP1U8DYjtf
0rtZHtD7bVZr1L8jANC/c/eH6l9z+EP170H8SzyJ+i038n39lhstp67Rsn+QZ7R+y428rdv3nNco
b5F8TLcvL5P8mORAnQaEpahmS8I2+r03um+ppwN99nxK9WeTHDjqKvX5PumjSB+sUVam0RUnvEXj
HUylSwkl6V+gmlXpXNdJv4PaLEmacsRMQJNCpU2o/gg64w5iKYVwAJ29CtUsSsfqmtEkR5Nc0rON
9I9ILkrtBPQFqCdvkFyY5DepnUMavZJkepOP10ulTUgznFr7Qb8Dh1p4gVqIITmG5FL69/JY/2eS
sxFmpaOqU59LUp9b0SxPp5E+oFLqm2ceaVoQbia8T6XZEUvIr0n+htpcS/JIqvMd4TjSLyV5H8n3
dA/1Wziwt9oOS9H38iI1jWTiTX+T7o9JvaL7k0pzob95R81dXZq6RjMZ0PgHEEYQ0lHUQkzqJqpJ
x6bSqFOnk3ye2txI8kGSb1IpWVTqEdJconb0EzgAFhvmvQqi9bvdEyG0ffe2b0P/xJZJXWAJ4J3f
a/FVIwDvLNLSICs44IFckA9CoDiUhrJQGWpDI2iGbTSA9+B9aA0doSv0hKFufR9IyA1RkAVKQBy2
UgXqQGNojmeNh74wCD1HJ+gGyTCM/sdg4BgFXvQZ+SEUouEFKA9V0Tu/CS2Aw2vQDz6AtvA2vAO9
YDhkA1Grfv2aUDv+1VcioFXD+DoRMIlayU7vDH0OfXMBbDEGKsBL8DK8AgnwFggoAg2hPwyGdpAI
3aE3jKBjgiACCoKOdC9CNagHReEj0odBMPKQF8KhELZbCspARagONeFVaAItsd/F4HUYAEOgPXSG
HvAujHR7kBlsiIScUBhbiIVKUANqQX1oCq3AhOfhDRgIH0IH6AJJ0Ee/y7R1yR6txRuEzQnbEXYh
TCbs37plYpL4kHAM4RTCOYSLCVe0btmjrdhAuI1wN+F+wqOEp1u37txNXCS8r9HghMGEeQiLEZZr
k9ixvVGDsC5hfJsuXTsbjQmbE7Yh7ETYjTCZsG+77i1bG4MIRxJOJJxFuJBwKeFabLilsY1wN+F+
wqOJXXp2Nk4TXiS8TniX8BGhX6NpJHZtnWhahMGEYYR5sLC7GUVYhDCaMI6wAmFVwppddTv1CBsS
JhC+RdiOMJGwe9fubbqYvQn7Ew7upvUjCMcQTiScRjibcAHh4h44R+ZSwpWEGwi3Ee4mPNijY5d2
5nHCs4SXCW8S3idM6dG5dTcPEFqEoYR5CAsRluzRIzrGU4GwGmFdwoaETQnbIJb0JBImEfYlHEw4
knA8YinPNMI5hIsIlxKuJtyEGOvZSbiP8DDhScLzhFd79GzVw3Ob8CHhE42SE3oJVY+e3XrIUMJw
wgjCAoTFCEsmIZOyDGFFwmqEtQnrE75BqFfjHH1P6L+QCrzOc0Kuf0ti9OLQ/zua6DFM9KISvP9t
OYNyAZmh18uIvr+IAv2cTe9c/jsSQ+/9xxjyl5HTjHBsVedot0fHB71K/MuY+S9j7n/C4L+MEdRT
QSl7BvUIntWpP0WBkSobhP2LUnaSOManyH8pzQdR/1KaHwr8CynDSPrn+OecMIzgf46Z/hLG4Goj
CaP+eJgDS2ET7IfzcJ8ZLJRFsVhWjTVkbVgSG8zGszlsKdvE9rPz7D43eB5el/fhI/gUvpCv5Dv4
UX6VpwhLhIsiopyoLRJEJ9FHjBBTxEK8BvW5vAGbFfUy5FtlyI/MkB/1TN7IUO7By/wwSPZM3opN
n3dmpz9ePUzffmhC+nxWSN9+1tAM+QIZ6tfMkG+aIZ9hPFmPps9nK5QhXz9Dvnf6/uealb489+r0
+fzFMuSLP5PH6y9/dIbyQZTn6B9CAiMsWD+QFgqM3ECby4a+qoCr3eumR930vJve/qPaRWLdtKKb
1nTThul7UWRE+lEWjUufL+5PX79E4/T5mAyzULJkhnxshvzeDPl9GfLXM+Rvps+XCnnGylCIC82Q
j0tfP65MhnzG8toZ8nUz5Ouln8WytREVMtOaTYB2bBp521b4AbxSxwMzg83MFCtCwOPUUlucmmqT
Wqc2oMbDbrAbWO82uw2M3WV3gbMH7AEIVUVVAUO9pF7CuKntgYvqQs8X5yE8K2r0L4iU7o/w4ZHF
MZ8N70a6wzTYAqchhYViH7zYq1CnAXCnphOPWMt5DVGPLhh9cgTeLUTjPU8FdRkED8Y+XaF0i8I7
LZ4V89co3aIOAsfcYcQt6ijiNhyrttBwiFSnsa/rsPQMpVvUWUw3YP4cpVueqXnerXnBrXnRrXnJ
rfl7f+tQf+tSf1+h/v5eUo9KXqWS+s+WqB3Uw53Uw93Uw99L9lLJPirZTyUcJMcPXmY2109uB/Ng
ZDUrsiqcGs7LyPo6tQ482KcNyJQAHfGZoB0m/CuExw/CUQ3CbCaWCQawcJYbBtL/sxzMElhTGMIS
WWcYRv/DcgR7hyXBR2wEGwGj2SQ2GcawO+wOjGUP2UMYxx6zxzBemwZM4B7ugYnc4Q58yjPzzDCJ
Z+PZYDLPyXPCFJ6P54OpvDAvDNN4NK8P03kS7wlreS/eC9ah9+8D63k/3h828MF8MGziQ/lQ2MzH
8/GwhX/KP4WtfA4/BNuED63miYgVseAXVUU1SBO1RC3GxXQxnQkjyfiMGWZrszUrabY127JSZnuz
PYs1O5odWWmzh9mDxZk9zZ7sBbOX2YuVMX/xDGNlrdesluyWNdRmzO8EO9X5u04TZwb/2tfG14nf
8w3wjeQpiiuv8Kq8Kq/IpPKpfCJY5Vf5RWZVUBUUIaqwKiyyqKKqqAhVz6vnRVZVQpUQ2VSMihHZ
VayKFWEqTsWJHKqMKiPCVTlVTuRUFVQFkUtVVBVFblVZVRZ5VFVVVTynqqlqIkLVVDVFXtVcNReR
+l8Ki3yqnWonolQH1UHkV51VZ1FAdVVdRUH1jnpHFFI9VU9RWPVSvUQR9a56VxRVA9QAUUy9r94X
z6shaogoroapYaKEGqFGiGj1sfpYxKjRarQoqcaqsaKUGq/Gi1g1UU0UpdUkNUnEqSlqinhBTVPT
RBk1Q80QZdUsNUuUU7PVbFFezVFzRAU1T80TL6oFaoGoqBaqhaKSWqQWicpqsVosqqhv1beiqvpO
fSdeUt+r70U1tVwtF9XVD+oHUUOtUqvEy2qtWitqqvVqvailNqqNorbarDaLOmqr2irqqu1qu3hF
/aR+EvXULrVLvKr2qD2ivvpZ/SwaqF/ULyJeHVAHxGvqkDokGqoj6oh4XR1Tx8Qb6pQ6JRqpG+qG
aKxuq9viTXVX3RUJ6r66L5qoh+pX0RSNtyX5LyDPxVgKS0EvlsbS0HuYHO8D6Doz6Trz0HUmeTgP
By+P5JEQxAvxQmCJmujdbLOV2Qocs43ZBnxmO7MdKLOD2QEymd3N7hBsJplJkNlMNpMhREWoCMii
IlUkXuNRKgqyqgKqAGRThVQhyK6KqCIQpoqpYpBDFVfFIVxFq2h6T30pyKVKq9KQW72gXoA8qqwq
C8+p8qo8RKgX1YuQV1VSldBbaf+bj/xvlHpZvQz5VTPVDAqo1qo1FFRtVVsopNqr9lBYJapEKKK6
qC5QVHVT3aCYSlJJ8LxKVslQXPVWvaGE6q/6Q7QaqAZCjBqsBkNJNVQNhVJquBoOsWqkGgml1Sg1
CuLUJ+oTeEGNU+OgjJqgJkBZ9an6FMqpyWoylFdT1VT019PVdHhRzVQzoaL6TH0GldTn6nOorOaq
uVBFzVfzoar6Qn0BL6kv1ZdQTX2lvoLq6hv1DdRQS9QSeFktVUuhplqmlkEttUKtgNpqpVoJddQa
tQbqkv97hfxfPfSdm+BV9J1boL7aht6zgdqB3jZe7URv+5rajd62odqLXvZ1tQ+97BtqP3rZRuog
xozG6jDGjDfVUYwZCeqkOglN6B3xTdUtdQuaqTvqDjRX99Q9aKEeqAe07xW4v2IQS762MNqWyZqx
Zqhuy9oCM5Yby4F7Uj2pILwVvRXRD//3WB/6wP9Y33+sz7W+cLK+Inq1xTp6jv3Hxv5jY/9NNsbM
TrieD2aRPFbUMBpDLigHVaE2xEMC3i90wvV7H1xZjoCxMAVmw0JYAithA+yAfXAUzsJVuIsre2Ae
5gT1BhHUIygp6F1Kewb1oTQ56D1KewX1wzQJpf6UJgUNoLRn0EBKk4Pep7RX0AeY9sR6gylNChpC
ac+gDylNDhpKaa+g4ZgmY70RlCYFfURpz6CRlCYHfUxpr6DRmPbCemMoTQr6hNKeQWMpTQ4aR2mv
oL7AsXQQYs+gYYjJQaMQe/0NRibQyHsETXSZ+dRlZpLLzGSXmSkuM1NdRqa5jEx3GZnpMjLLZeQz
l5HZLiOfu4zMdRmZ5zIy32VkgcvIFy4jX7qMLHIZ+cplZLHLyNcuI+Nx/D2CZhAjc4iRhX+TkW9d
Rpa4jHznMrLUZeR7l5HlLiMrXFv5wWVmpcvMKpeZ1S4za1xm1rqM/Ogyst5lZIPLyEaXkU0uI5td
Rra6jGxzGdnuMrLDZeQnl5FviJFlZCnriJEtf5ORXS4ju11G9riM7HUZ+dll5BeXkf0uIwdcRg66
jBxyGTniMnLUZeSYayvHXWZOuMycdJk55TJz2mXmjMvIOZeR8y4jF1xGLrqMXHIZ2UmM7CNGDpOl
nP2bjFxxGbnqMnLNZeS6y8gNl5FbLiO3XUbuuIzcdRm55zLywGXkocvIry4jj1xGfnMZeewy8sRl
JNVlxO/aSlqAGQsCzFgswIzFA8xYwmXmMjFykxi5T4ykaEvR/6dR95t20xpDYbaPzxR1xauinWgv
Oom3RQ/RU/QS74p+YpgYLkaIj8RI8THeBZ8V58R5cUFcFJfEZXFFXBXXxHVxQ9wUt8RtcUfcFffE
ffHAF6f/jxLby/biCWboX+eKOqIOcFFP1AMh2oi2YIgOoiN4RHfRHbwiSSRBkEgWybgS6C16gy36
ir7giP7iA/CJqWIqZBErxS4I9ZX2laZdhnCwjDzGc0aEkdeINPIZUUZ+o4BRUI8Me/SAdtcD65Vc
7t5EUV2GxwT2rplIfFqjkFujmN6bEolYAkaood8AVsgoBPYzxwXOG2pkNbIZ2Y0wI4cRrt99h3X/
cV4OUZDJCDGyGKbhMaThNYIMy7ANx/AZyshkBBt6v8vAsQ3ATupjuPGiUREco4pRBRSWxUGYmCcW
iEXia7FJbBZbxFaxTWwXO8RPYqfY9UeM690yMVfMxRbn6981iy/Fl8j3YoF+FJnbiOc7K649bX0u
1voSS1eKVWK1WCPWih/FOrFebBAb/2iOqfV5Yh62vkAs0E9kikXY+tcCvTP2cBe2rsehWy8OoX/Y
6h+Mgzg763Kmj/uL1kXHaWvA48wufCl8AINhCHwIQ2EYDMfr+iMYSf9ddDSMgU/wKh8H42ECTIRP
YRJMxmt+KkyD6TADZsIs+Aw9wOcwB+bCPJgPC+AL9AdfwiL4ChbD1/ANfIve4TtYCt/DMlgOK+AH
9BWrYDWsgbXwI6yD9eg5NsIm2AxbYCtsg+3oR36CnbALdsMe2As/o1f5BfbDATgIh+AwHEEfcwyO
wwk4CafgNJxBj3MOzsMFuAiX4DJcQf9zDa7DDbgJt+A23EFvdA/uwwN4CL/CI/gNUuAxPIFU8EMa
mjHjDXg8f4035K/zN3gj3pi/yRN4E96UN+PNeQv+Fm/JW/HWvA1vy9vx9rwD78g78bd5Iu/Mu/Cu
vBt/h8/ih/kRfpQf48f5CX6Sn+Kn+Rl+lp/j5/kFfpFf4pf5FX6VX+PXhcVv8JvC5rf4bX6H3+X3
+H3+gD/kv/JH/Deewh/zJzyV+3kauiD9tL0QhjCFR0jhFUGigYgXr4mGoqloJt4SLUVn8Y4YLIaI
D8VQMU5MFtPEN+Jb8Z1YKlaIH8RusUfsFT+LfeIXsV8cEAfFIXFYHBFHxTFxXJwQJ8UpcVqcMcob
FfT/bTX2GweMg8Yh47BxxDhqHDOOGyeMk8Yp47RxxjhrnDPOGxeMi8Yl47JxxbhqXDOuGzeMm8Yt
47Zxx7hr3DPuGw+Mh8avxiPjNyPFeGw8MVINv5Fm+swQWUVWlS/JarK6rCFfljVlLVlb1pF15Suy
nnxV1pcNZLx8TTaUr8s3ZCPZWL4pE2QT3LgFV13LtjUa3IK7uzsLW8GCW3B3h+AaXIK7u1sIENzd
3d3d3d0fZJ99z72tfb/gtdmK2UfVsOrVC9ZiQZE9dsQI7iHBglpjYPbeNDTz9v6AimugzijnmK6p
v7Qy1V3UMZHHMOaYOtaIcUGjlfZpPb/smPJpCMQuy10HIYawv8Mu6FkWIb5r2wYo4EkmOhi5QwVU
j4jO7K+wS8NjpOwPvlQAiksnKGwrAqWkEwHb34CSnhQmQ2M7eA95mmRtMaE7c5e4DyWaJG2xkjt3
dsmva2WXUA3ypTFFOzgNyq9UcwM3dr7LVBwDI3ahyzR1Ayd2gc/ip3FN21YNoqfxfEMel5gNOgRR
UDvELqoE0aI7zC6aGVGUO9Qu6hnRJjtAF23tKMwdchc17WiVHTYXrdUojh16F43VaKcd0ofUb9GR
O6jJNC8sI3DaFHuDLnatmkRtUXA7PC46vFGIO2XK1kdaRZE3GTNzhyY3dZCqYCV3JfyzULO65kE3
2S8ZK3OnJnd1UPNgJ3cn/LdQt7pPgm4FPMMEVpHlfJWii4RLuccTt1huITwzGcYydSbzgBO1W5Nb
iyd7twieuQyTsTrMeZ15uBPGk7Ljntu5W47buluUJy63wpeWl9yWUW1r63KOxdTjkVsMt8CX2Jah
VcuzirtFvqWnY53jl1uQpyyPeV6DzCrG+cRj2lu2pwSPvlaTtTrCecQTnRPRW2vHkJd5T/2nE1Yo
vF0bUc4Agy8Ee2n2qw3rmg4MwMR02lGlvRT7lYaNZQcrYF0616jWXob9mss6t4PnDwJgG5B61GAv
OPbwPp2V8D4p8slv7DyZN1LmsbmVKHOnyiNibE+h9Vurro6xThBjKON04kziSOIK5u7QBtzdzvXO
5c7tzgXPXuj5zo3w4+VDjvuDB4S7gseU+5QHwB3gUeWe+WD8xHs3cjFyM3I1ckefZZ1pap15Ow91
nozHQ3WS5kVhZuDOR6Tdce8pRhZEYSPEikm/jiU8hZqTug9JybzZgpjfrcqMMRosro+Slt/v6b05
KxyikUhlpfW7/ocwHerQBo1w0JGIWi4e2KL33m8jdbrFz+y+ap9PKhKv0y40DRONqsOMOEzbXjLY
plMGG9jmHqNN6mo1Ip3FF39YCz+dXDEtrvkTQfuKhT3c2ECwQpC2q1+POsO6QdvUpP8SJjs4++5D
jLtdWaf/GtUCfxHUgn+R1HJluiJIVQLFWErZSYRY+ikEvJWnMvJ7i8fnC8on8E2GJ7RNgqcAXnmj
Gfo/Fo3C8Vp1YpZ58kVtXqKofg0jgwLLf44dyJMLyJIkWPJpYXJj8BRRpMnxfGxmc2xPB21e1mIG
ry7bXeC1wcDLesy9O3R2ynxMw6t6vfvUreihTFdqrQzcljXbvV4JQyoOSI/f1i5uvCg7D7EeVbZ2
3wyHP0dbGnIt8LcGIouJjh5iAY7kWc1/Rpui9Qz0YpH+cPjc3VvrxUxz+xLrfD82YcPS2+El1G6S
O/RmPnFuWt1VzwmzdVclVwFbynu9SFp+OX4U8Vh/eT+i5cTdq9SXWr+ZxG8ekVy/KcZf5AFGX+Nf
O7RmQHmWxmv1pUPamLJ7YNPvi1q6hbQj5fDAhh8XMF1T2ooy8ioNdWP7B0m6u3Rc7Br1OpoDLNA/
ncQLyzLw2bZZiX9Q/lYnpDH0FXj65xuNqtFr/n7TzKqxdT5W8xVi7jlxWJfoscEtzNP02YWqkcIC
NcXaPZ/IzrRXxBDNtx3ZjTdlB2nM1PTpN/99zUjbBHRroy41YmijGzXBftG1Bkz9ETUNqsHFqlvZ
kB+G+MQJLSNfBE1n42+8WYoZUz/NzKOx46dUnS0QfO9puiLb74t14cPqhzq/08N6+4noH3lv88oc
tpH7oJr0dS1DZhcV6OrW2JdJjIcMCnj/5uTvQpJKBXolzCwHqhyKJQc/K9e9JoP89mmlBZ/VGNdt
/U/ywvBw53DgrmBCl7shr/6GcUhyp51rFEPCEGD5innoBPsEu4+EB5U7VpV/DG3MQXkaMFUVFX9O
d0lntMMzxK2hyjbGPqZ927iXtUdkfgrcBPaqO0s7S1co17OLGVnymNazY5FtGbrUCrRS0VbUrHau
kli01CXVgS/th1/0lpesclrjLe3SH9EP1R6djc0jWBtZG93G1v2po1k6KNko6XB0MXcxr1hZbVxt
tIisy64jXjqy3Lbs9rylcEad57WGsza/Da3LrSPlwvOrezkOmhk0G4lQtyxBOK6fGZDQzy8xpE3W
6uLkitfq43widftpe4t8tbRs1Zm3MnzapfEFkF7l/vPMYA2tlfncHW41nOG3tWZKhWOp8QIAB3Kn
fauUB3Y9hQJjaG9TdEtfE304T3Fvtr6BLYnLm/AlTkpOGa3kNydtxEbpZ1pfy9Zh7d51+cAZEF8p
/dh96lTL8cnPHPYpDcPLxgRXQEDnsLlIysMwFaBNrZ3uOwYLXKrwcI4x85VLVb1aZxi7wXCMMfUt
3NIYQrnvMRLXcER57jEW16h0eewxGtfIaHnVMR7XGEN56DFK03BpedExTpMVdBcSYk/ZZvS91K+g
vs1gMXTP6FsnB0iEnvXqKd3xMnSWqVUZLE/w7c5I72H07mgMsBdNdZhn5+gZu3rp4p+EcDSbfQFm
svh4Bb6EEOHnsTCrfuCahOx9MtDVHTIY+z8zZfdBxKPQV/15o/Ah1ymhtNPxOtUoMD4DL3DgA5fp
EIfAXPYPkvbOXUsQkZ1bKL5qPypzxJROu9NFkwug8TDGZt4YDsj+vDF4OU8hGA0Q1LtFxoURnsdi
hwzZQOeGyOijvXejGp2tuJH1sdTTIA44MeTKRjvh6JmMxxQ1P1ysPppOc0xfdW3ErB1YgXMjSB4c
MXD+XIq15Zz2aolVFkDbu9jM/m66cJdi4V6I6G425tM72/Rcvc8FqpG2m4dX9/60HKnaFSy/8a+B
Fij2nSXuN8aviBBM+jH4JdD8oNXRqz90woBJ6KD/kz8zizukcA1hIMp+H6LAZ9czVFkcnnvqIEFC
TwTtr3yeIIPrLTPkVKGtz7Bxgl6e8IO5Mm3e9r8y32jGUnnxhxCc6Hps6Vwmw/PoGEN/3ASBl0Xe
sUCG9/9CdrHxSPwU07vTM7PEhSS0VfldkxdHBTqcdlrdwsOXVF2f3jeNtRcax+DXj4FGUIhi81l6
vEQCU1sc08/hrBEi6pBba5rNfEmRTtjx36dnTKcZDTRdoX8w0eRtpgcTyNGvDrzcKr0NVsCHF/gR
kIbmHxFkmP28ZQEetdPwzdjORqF3ae5PuTpDPINgojtDbAsA9MfxUrtDA52ju0MTnWE6f1gDyoPw
U41XiCPcZ1NnU7POR5v5DDubyio477ZKCqPgzjoS+ONqOh+RN8+ljzEUq09VI7PoS4kDBEw06cO8
eeu/qIL7Mt16IaIyzRJ6H7De0X4/9WqH9oRUjoEoJoFTlcIoD6DTpVdrjzQEOWKqXPO5wVo5a4cM
Oy8sR95qgHLcwqH8jLDZSMGY1l3zDbk+qAgF12rzkASw3IFFGOH0aR/mAuEA/5MHFIzSDQMY6/iY
ZYf5rZv0j/nwvm3j2ANq0YtIbG/lbnNWNa0XE2OyR0IAKHz2pgJ+4OD1icv7xvH82EZSfE20TSwF
zZ9GZm9D1RvHEK4pGW/IFnm4+qr83rgy0COHJTyh+xGZLwV9nqP4PfvJ+LaJ+cgGEF0GECGiCSv7
ERe2A/EuBUOeZSkuBTu2AwX6EY2I+dAkPKloH7KPtwOvz0I41qHxtBWKhShej92wRukwfFrCDIVV
xZUjlIxq1LhvS9GPuhsrDDWbPut3zVOxE4x9CR0xCJ1HqfUpMUqdR6jFbABGcGsacyx4JPiMrnXh
E3R2ORMQ9IQSNdkWQ0e0ItldcOfBYL04LIbF51UDaUVN4ZQzJutUISQ0KjGpLXto5BdTlHKq4bVd
vlgO/ZFdjFDKrSYt4jclEVFMdzQqk//SM1yqYJCMLXJgBwiUnjEoK1EAhM5NFJpEzIke4JTlOJRw
oOYVrupKvKwOx/12EXQIKUqki1Me7N7nTlfVuwZPZhq1H0YX/Nb+vWwOYR/RJu67L2cvVnedqnh3
QjGaPm3AETSehmk3Ox1CBb0bSAV+0Z/MF11G4taRP6QUm67eWwVmJI4GNUhrejXITVWNQQrztEFT
qjzdhcZUNnjWyt07v1cfnI97gjuic5S2OOG72bQ1rdexeB5NKcqErt1agkxXidY52TVfnGn59Zr/
pOg3S3VzLmFCdolhIU7pItD55JXjbM1LzyP2XYy+fdFeOr1z+S6u9/1I7rvkBF2E0lfzPwOH2YHf
2m3fVNz2QNCFK28uSgkCmLKhBWPIoGOgXKF9YGFJsoiw+dHAYpTIKCeURIRVeqBDyGB8CoiI6kNs
R5LQmfWFFNHAaEKCOlW0sMZ/rC3djd618qwBx75IK90Ms678sH45O3O8cwjMapkPEKHFDR931JSB
3KnPAKWx4UE/br9hlQ0+OsiCnfPOwpkD0aUs9f0KX+rLT18q2K10gHOSi6OV24IXdAS2eVjPS1Xq
fSSz6WuzQloafKRtS98o4saNNUfKz1u7RmHRAGrRIGDRQGLRoG9RNTJvTD4fkjdvp1G+M1i+Uzt5
i5TYQ8oQKKpJEFkPSmArzL0Jdh5Eu4Gs0kta6iOKh0QSA976J9W7xqcdgC82yTeRdbZ9FFJWOEf+
TZbu1Z0Mtt9AR6GdN0fszdKVXrd9ThnrRLz6loRHLdIDom3SpP8nmjwVaH92GqQuOUlF6zizVPQ9
ehhUazvit0+8RGFsIMKZwR59/gPOl5h21MkD/cYWRsd+hBuU82Bu0a27FZdqqaoQxQLKyEVJNdim
J3qzyLNys8yztrMws+LKPMd+ZIZfkfv9cmQ/h1Q1qhKqrhRHFssUEygz4g4QuMG70bvhc/mmD2iP
rbaP6lsbvvWujqx2lRqcGZ0ZnJkQ6hIarhmu6a/prRlwVGnMR86XHOcfmxxjHjvemkdgiaaRdujZ
zuMhBA5544lHgPRFde1h2YYB0UTbmTeS7IY5d9OI8eAiyE2oTLBMOPtCDEawO7AHKjbm7URsjzlz
gbdRYA1IAtj9vpXnPMc+hFksit7XQDHLtBtkzikDEjsbEWZLSCCc8Aln3IRtvwtV7tZmUSbx6BqZ
rTKFf2SLBOAP9oxf2Pe87+gdqCv0jalRqCdoJ0LLAXboAt6jSkhry3o8ZNf7YRATw/JoTYHZaR6Y
eoGVJ7jdnHG2HMgMnI5Nm/MnAQZ1XBErBJyObu+Gv0EdR8TKlu3xbUfFEmbfKcwxAVrNC6c8lbxM
X7QrQcQ0XBZeyDTchOcpOcUreuirG8Zz5PxBqL+qMysMdwqKM57ROSfNlu10p9tonxsv+FkD1Kq9
9TBVq0cyISrfAWJNOvRj/SmVQEnb29t+j9dppEer7yxROI9/e0ZnOwZGz63ffEbMfIb8fMbkfAbL
fAa3hYyahQzQQsbFQgbCQkbYYgxkPkOi3wrW73KvxASg11YSGMTBN6bqOmrAR16eCXqcT3ar0Lt3
ZpcU89JaFFSwXQTrnnygCjyna88Y7s6gC+BRa2YMhShr5xp/SYb8Je4inzxNdoNlkOw9rGtMBUjD
HgozoRCAL4CBEsQvgIInIsQRBGH1Fcwix4MsWYf+DibaMWHzOQ3UVxf6sy8yE4pIl3MSdOyGexIs
ZleeDfa3wKJ19SSQuS66JHh7PV66n8I2ADp/IxtcukCuj38sNa1bqULddfieM3HDRnbFnqNxg411
wJ2jNH8uazc/h7Twcdqwn0fQ6UK4P21TiX+7Sxl6yzNnEBeAZfaCjoVqkhsmfEgspRYFIA8jtcyc
weraPqonj6nMPHeZG7Zqi/rO8qvHKrTuHntIpkWDegy4iI/zO5CIcFDST1Aej7NwTPpeE7+IebFA
myqhybe4XANLMtEfuZXffGYvPSqeDbLHXG8Yr4GVmRhNhCFgHpAnTZu3fQKZUkc6463P4vwX600+
tw9Pm3dVPpt9ThDhk3dGsAxrj/x8cbKKxs/iwY9qenfuOrLTj62f77M/P7a6r7a1nvSY359VBPMB
2UGCuKg81bNV+SDlajlaEQcTmzLHnQTURIopZnOP84OoSB2znk0YL7hsQY2+wnf/YPVE4517KmtV
f9Uos3obPZKJ9LrGx9/IMuNJv0OqdWD4qZ/OPUqwb4/3aT+bO0Voghe1Zs4XviAdYj/faS93OBS8
qV3yEaF8HX1QRXvLRLcZ4ky2CdVhI2khfJGQH9HsLuYaVUxMHvwBLxZN2JI5ptWcJlXogWOgZ+wq
ikQuQmowqrKAXnQwtxb0xR0BTSVeTsN/+usJP9ngshj94wAhVe9hdi1vYeQi5C8QM9yYAPAXIVRe
M9zo61hnu3686VFyezmuyGHBE/cA0tbQI1WfDhv9y/2nbuaJV5b4pNvrdPjkCHBfYAD217X8VOyI
RcB+PmiuanrQovg1fm5SaHKoHFf4Axc/38Y9kxkhsuggnXQOXQzaXEKS+KdgNZSgazKSeg2Y9pVe
YTVGJ667d58NAtET1CBFEEXBtI6vrAuhAO5fgzG/fjmuWadVGInpP+7p7HoaIP3EBteFBHnx5Idl
8v00TPQJAN3+GfT8jPeT8X+Wkvj/hQdLAiix0O1koEzBn76RfPr/D7zceSXSOcPIcUCZqXSmznYI
QqE5QY0fl8GNnR2A0Df0li3Eo6chBUEqp4aR+w1iGCXxzQcWyQg7CBSZqJrIW8wbc4cf+1YjR/5X
7VeIzNEKkuWgAyE65GAh1qQgwbeDKS5SqnBPWtTomve/qZ20EuHJbIAeT/2posKRsMZx0Oy0KJQQ
vDy/sBOIzyhRZGNolpv1ncqJVTW21F0XkJG59Tp1GEwTjuSbI4ZhmMg70Vst4NwSKadBV6qtIBV6
G1WCWyQmcL+oxBjRtoJdIKGEhUYRUArkaK5RMGRGybmZKFjYWcikVxhYKGhYKIgY8DwEfXHE2sbW
qT3d1ri4SZLO0DGRkPNOrUwkC6ltIH6DXo91C/3EQZWbS2N5WMyTN38l1ejNm79+ssgICk1tyv8a
iLM8p5RqiUmAjoGXy7s4pL2yOvQjCX9Ht5cjjy7wXHSJSxUWUiHFw+3X5RTPJWyEODTi599+urJv
yL8Jv5AL0fgnVIkRfxK6uUEczIEMNqLHjt2T4E1RaLztYbGeGdEK3cS05nTr9XrpMb94xt1cicXR
PofKLMe6cHxilNBG9EActeBxcOU5SugqCjYj7Q9Iv6tWQeGnhiqZbcnUjWn+xW9aufuqGWkQI08o
RHEcI5P0YvEWHAjFpxxHWGu56Mj7UDI4Gl6rsfuZfX8lozudqdg15Ck9y/ZOeuhgjd5jsgrY7RwT
5+dXK7IlVmor1PXUPROm5mRoJKHMTcBSbiAuHl8isA2WWB9FmhmSgz/MMzqqeA79TJRYwe72p+p0
VfTy1iAT6/RQrfXXpYG430qJ/KFvxukQXmn2WycXywHALDVH53FIenpu+kQq/NKjRoAu1UlrLdQw
y0WRDhzlu1BSHA2OvFKQjWZthIbc1qStfeykNP7JhebNxFxVClc5YqFZCJX8JZwh28jq2rlDkD5P
3YH0filzwRczbVJxlylCLKpNAaCCARwe3PHUcefmZk4ANi5U7zBLyL0+ZW57P/RWQfLGtfxWQVJ/
1n17vepWmfGvkqDwoOZJaA+/FCKaCAqKWGrIn/2cg8E4V3ky0abKmW9f9fU3x16/2gzzqdrj9eTW
OZVDB+p7qJELPgfCDGS1COknF303OrLfgFCq0Ck9sJ7Qv6KtojQdGQvaDdP5k7dNjTnfvOh/ELcT
t+ThJSk076yXvjp1XsJVxr2+3OzwY1Q39JcsurRT7KpQHnzCo6AHXuOIwpF6MT5FqcUDljVzh/Wx
3RwFbUOzqsxeLdpoOelzFxsw49ltt+8I4Wm2Wh1TPdyzhLqsd3HXJNueecpeYuE5evWk8M7aiBC6
Nea61H553KPuTKvmp3llYnGQBx7+9gLQx/aluyGJx9hYLVZZ05NWezHBoTP3Jxwpl7H6ApVULMcy
zWFyfqeGB2+MoltKjMbV6UuAaZkvoxZOveH8xv2t3IF9RlnQQvKkZX2xY3iuU5XcvZqLNTkfmcFY
VBjbbWwFzYHE7GVoF8dKL4vmTW4Y+Ztot0Ds5H7qtcTLGiKs8h0sYnr47KNUP5V3cHJwcGHhgax6
/zBVVZkWzY+NN/8oj1fOLRneVxn/wprJNrH0J22nU0/jwecQTEuYnUZt0kC2heEiNdPHfifD4MC0
ZKcB/8UdDdEEteW9Jj6ORCePA5b84MTy6sHylTEv86UXc9cL+sHQH3arzXt7SwjMuksOhHitdaN8
nunN+VemU1sYStaLntRu5rR7jATFf/QmrOqdkDT+qNMw2o5vCtuvHMapqLTQn6qtdgw40ju7heRN
NJ+AYG3eD6hyksZfOBY9lHxea7baE6GyqNQkn7paP0yrz+O/yyfEtfjVRipjS6T4dCKWp0zvsOYl
apT+Nj+5rdXGln4WIjEBEXq7f6TFWR0/0Owlw7K4o+DftivQUhvbl36o8QND63XHD58rVle5CUKU
8I3k29R40P2bRQ7LY2G8jsOBkEJiqpo+nCtmIb7mJLqB/lPKZdZaAga/a8WCN85LrkdU4LgWhcya
oi7v9HI7HRmRX4oV8ToUeLL6+Qgo6LcHEEHZOf3+66+Dy93Tw3RE+1wg3KQrro3Zyp6gnEZ6hjSM
OhwMqWxRlweoXzlgxXVBYtpZn7zEP0UzksqISHPHV26nwt5TxP3sROGsyARvlBcDfxJfD2qj8Paq
PK3PPEhfX7TwwNaZmqZ1oVxsDGCLcEQe82LeOQ0Tb4pljGp4Qu28VMHcrYwcZVS/GDSy3h23Om15
AuLH1pDFTyUOwqcuKdq27k4XtwjCn+yZiruZK2halW0pBMx3JUQNBFC7/NHI4y1Q7GlxhMtMblMy
nxjZO4I77bXyBAoWLru4vhY1tA2NEtqPGu3tlzoW/UDOLa0b9fglG4WKQZG9JGzlTD0yj3uoZnsv
LmVhKrgOzN9FprfW5LvBWF0SvQyQUW4DeBpeRMywgw45r1CTaOCTELSkx1rY6643KD/RcqVQRjrj
el3Kia1XV6lUYtKLz+V80UnR+qxYQoB+CJ6OCO/L6DWEV9tTaXSufjGZRwy9lPQUvWp5OsWl/LOw
FuU3W0ckCwd6EZSkfslt2ZE2LqQ3yOVn1nMfkLhOJzjy1kXh9vzPjw78R6kMziIiJLZfA2ARYRA/
B8Ep14VHwoWGwURK9uqLyCX8Zg2AZ2Pj1ze+bDAXcHqTTn8xga0F9I55fUJ3EGNzS2l8LAiH0a4S
odIJ53bbnZlK5sHdzjtdwceokzWts/UeqFrlEhVpMNMOJk4Z9lBry1jN5q3N5Sle7gG2bH+ttHeI
yJ0fkfE92+1hbCmnd7x+Ni+UskZoJqh8iGt7KRmEPXJr1MONq43r7n5slu///mCYgaxgw6b3Rz3n
pbMn4RLTgJI5euhX4vFnjlbgz5UqdukyYMf8Uy3dzl0rscdjPiD/9xfo5SMHZ3r2aX8sHuoVfkp6
zRK4b8UqmbTVaFrHZ4ek0zMmKceOrbsY9/XefC/xLTdbdrab6YJ6r3nitNUt6nsW9q4nNh2dgyxt
7BNtQsR8L2HXNIRFXTsoCtiJbVTzaKwkqNTi6tjO11sWyWhgSi/TR/kSAqHxf34FQV+2s0qIKG7a
m5FACSU590B7tTGQHtS4N5LZtBS30F15zlZvGPn0yxe9zD1M/ywjjCEX5jSj6wwNEj0Iw9d7Sk/o
sNtgxSVMh0eEuuI9XDNxMXqssfi9/FRtQbcjtoA5jz7/O/z5SP325gRre7EaXA/96jRf34CKbPBF
cfhSBwTo2jl/U3IT+SgM2mm9H/SwiBBvGc0+Q9FkXM2/tWBkwLX0u5ePkCPNa6TUZ8V+F0ZHttjF
sdRtFjR8YGe2d+sWI/5hmzdosS7/1uOytII5nTRjcZTPIzMXyfM3mUr6m/eJ5/Ae3pu3QtdrQZ/R
MolI8FgLz1Cah45JxKDHze5OKJQp2Ejx7b1hnZspw+wanaLaXBrx78fGhZuXkM6pkuYYttKbQfgi
fZabXFK7uNWiajcteB6ugjmdG82JELAvXLFgHiKYLmlHrvLcHXuOCKZ8i85mfSP44QKxC4QcJpfq
i52E1vQs3KrWRBC+KlYWrhrX/CIaJPMsWzNp3tJPDCt3pi1J1doTb3ENz9NLR4p9pduExUy4JZcC
EtLBSe5L7jG9D8WxKIwYXehWyFF7Zjwq1t+shvM4qqQJPTGUjptmnbRFXL0vsXq7R+F6sovrY4jH
HnphbyL16Qy/kBSVCPhrZXBNSe34zqxXLsk7+XwhGeNi1VZ2jnH/9uvWrm5jxXvockhthRs/NSSh
9Eljj+sYNXUXi3ukt8ZsGjC3xwYzMKdmjIJMAwcOlpp9dxLov4KIn0fjU+m6shO+S6BvNmw6Wj0D
w9dopbRbeH0ExOGqf204Eeaa7MSwMz6/Ix8mU5xTaU6QcaFsky2yOvDHNooA3TrWQMwpKUNu++bU
7OB5UMgTQqj77XFD/0hi0ljE2nn00biQpVAdzumiSLSEOrsAa/IsUedag3f481Hd4Fr2WhyEkQhx
DztH3ncsNuT1Umphp7dWh7fMwrvfnWozTqm9xTOZXFPf21/ARhAjrK/HHco4vTQmlCQve/LoE3uV
uuUOJy31VZoBO73GVJHqTaRDmZOt4sMWUsDzYxXmAWmqmJnXowVvk281Cdstp9BKzM9Jl86Fh1N9
pT3+gWwt0vle5W1EtrYSOz1/5EiEtfKqZv21p1p21pXiHS+yS32jpV1SlpxlpOG6yt16D2emj8mt
nwuaEds0V2Sn/lRsJN7BN3NsNrWQcJufqFjjCHICA8SO9v3jLL830KUcKk7XfA+tzi32s5nK2duK
df1a+6fpXl8gxM659Snid1ergfuZVLyZeK1PdxXQKZBRUwXr66n8jrLX8fACzCii3e3piT4BT87o
a87q0kSQxYPo4cuU0D3XTcJh2ep1V0nhdDHvhZSWVN7vN01PODAOqOe+FQWqeE1inX1FWXlmBkeB
QKwxqvu38MO3vGn88JrpACPRF+zcwGVPeY3oeQfehS4IRdweYZmQ9fPaTL6kSrNIudxvEyFBB27u
A4DSQ+678Lq9edan06K0qBI7HfRf8WeSri3Pm1Ub68JXHUp0xh6PSbuOjA1LVktztdzSmbZGHRui
2GXC4ZiAjOKJORy0mZdTA8lJEVKrfFX7aU/hueZ4gBpzshts4G7AZaRbe/7Ui+igCb0K4QLdb8PJ
H8rrcUTl7EF6c3zhladaw5srPJ2wqguelpECqUeXD30j8L/RCM2W+CJ5aPImaEW2IH646siXv5Fl
tcf4w3MYVa2qz/h/K9jA5TtVT3Oc7cpnY6QxUH4Ytw0/i0G0VEgDaJ0ZyUVkJH/PmbxWmDVDBvM/
OY4NeGKYn+E+dmW3nvMdMbLdddOMFDUf/E5ZXsKtIiTjUB67oqOgsIOi3maqeOZjGA7xYKcodkSV
TC1x8+DLyrDIw+xcWWYwrNbVe0QB12t6FDmR8uWicGxokgv3ShoxlDvqDyolzQsJ/5ZsxHl5xJ31
DKDYi/4bdEG6Vj8tT/VIhRbF5RRLrBqX26nrdNk4N7odkcyP4G9IpiNl1xo1+cJbG6V/prxrxFeH
RTRI7y7D/sT8OmGDONqKtyrW6gwlNLSQp+Bt0p0M6QiE1Wb4UmJbIzVyongbWnH3hd9mu+zY5Wbj
JtKYb6Vyo/lrGSZB5rbXinDD+SPU1nO0yNaOScYmuhcKtPA4GsaCAOjX7IPbu4vLMcRUd64gzSjX
sN6asVfaDiSbR8JsEdzzkj6Mr3/emuxYP3s+5AR9Cp5MISAfGTSXK2xC8eIAJrtptQ0YqbChT5/R
4nkj7mhltX1NtCHuDP5KEhDUDdUgGMQpkH5OERNMNQ0nPAQmSxsmxjCtnXWTH8vGAKRhYaUgoqFT
ewnMIiEB9+s6U3DJWeU14FvBJmqYi7OwAMyjOK9SXeUqxoyiAqcWwUn76kW1uXC+GJvTiOX/kDb3
MFsjB0xl3l1kr4v9ISyTLxxlVQqQbdFa7pgYYm/YtvfQXyzkKM4V0L4ueLyOww+e4lhhqcNIRX9a
GlGyj0RbaKm+NYGLB2tZO8HwW6vXYe/33kEia9Nv915RbqpPTHQ5iiPDUAlVTo/EnuxtKSebL9zd
MGJ+m50SfwI08LuH41oh6Ak2xf6qi1S8BjLgL6Kw0OfVnsuz1fWbLYCrxUYE9cgdSTltU9qccUaU
IkqkYDwsG8C6fd/91AfT6NkzmqdCyOqaDm/mTOBqrS0wmwVsoOkEIxyjD2ZAi2mMi5p+NCaV846K
Ewz9VaFS+rxEtb5nQvb4sG0oUdEmWdmWrgayH+nlEUgddcw1SFGOpJqkkaIu/ewrOtvHA1cYPiwr
h+M2d95PHrvenhJFzLfPdkJbCPTfY2cOLxbROGUlVK1z+iFshlikvqVgMtS4RRq5jKCdw70fUcoS
z0dcy8zacD8IXxcyu3++/2cL6kafQIxX0wYHfiamSEDtqWsofghBc/qeZ189PYdfXeGH5KvASwA5
YoCxSjBE25XGL/sXX5+H3OdEZF+1LTbcI32jtRrR6Ys+tAzxRuC4lr2XsUrGoe/yvrtjWWRftOYO
1OaVWlrU9QP+w4/UyATPcjlVNO6b7nER5PC9hlFBD3IFBPWrm0ixBUqC5/r+DdX6jpAotsHJ9NOG
oUjO0xY6rE1Z1M04gPOEavba4rNL5NqwK82DCKWFVLDn/mi49k3EE1+6FAJmojogsWaJAiC24ntP
GBCvJAUPa2RlaO9gZ6Rn+Rda65vBw7IwsRIxEf2FGkRMGkRsTBxaREQADSIWFnYiNg7gu8HM8T7N
ykrEBgC8WyysGkTszGwfiFODiJWT88P9A7F9+LJ+rLJ8+LG+R7Gwsbwj9vdVTjY2InZW9neL8yMb
80cR4Ec51g9fIOu/8cxMTB9JOf7Cj1ysHxmYmdnfUwCZPoqyfdT62xcLB/N7AhY2Ita/BVk4Wf6a
f+G7PyvwozUW4DsEMH3MAgAfsxzMH5CV/V9fACvwvVHAR24AO/MHBP6Ff1v668DO8T8OHO/EcACB
/4Zy/m3gL2FAwP8kBLL909Z75g8ePnYEAH5UZWX+gIAPJ1YAx7/+rKx/2WMh4vjLKivbR2UA4B38
pZH9b/jHCifr+wYBLH9JZH2vwcr+4cDJ9nFYbExELOyc/4y/pHOyvzuzMnN+jL+sf9DA+Tf2gycA
01/4cQT/8MT5cQYAJsB/Bsc/g5n1Y7wvA5n/xxP4oYd3+K4Q5vfdMb+f70dBIBvzvx7vh8j6V0n/
jn/mODX+j80M0Pgf/EHkP9t/x2z/zcMJ/C8GsvxT9q+tRfS/Jcz2Xwl/yPado7+NfXgzfeT9aPFv
u/9u8D95/vL2TsUHZx/s/O+e3yP/i5j+Y/3L8b/xfwc74GOVA/jvJfm4Hh8X40PS7yvv1+Fv/n+y
/OcifEQw/63BCvjr9675D7F/eACZ/uML+Fv7n5//7IWVA/iv4v95v8++i/tD1X/td5l+CPhDuX/x
f7T6IdL/vP/K8kOPH0L8J8c/0vtXcx9i+3vwTH9//mX7f3PN/n+5Zvp/PP/0+u/zfzn978PC8d/o
fzj852F/7/t/sQdgfmf8/0ayAT54YnuPYeX4Nw7I9P/qhRX4cSIcfy/Cx5vt4/yZ/7L/brGw/hPz
8eZkBvzjAfiP5/sAvLMIeGcQwPqP/Tfjx1lxsP5fTj6W/kJubkYRUwsHIztGEQs9ByMhIwNrQyPG
b0ZWJg7f3y8tgJ3lPwYzETMnEwsbOy8vPOy/v5Kd047TYHQVlGbvxzwYJasoV2LYLWPZLRt/STUK
Zo/LLk76C0jimqppDO76KGZZDObkFihNy9mq2OD+kBUH00dWVBQy0ezTw+tDFzXWLKoPJx3f5bpL
/4XWjY3/Yvx69eK2dOV5l9HU7DbGc9f6NPmJ6VNQR+hnHJoUMwpwdXkrqI1T2J/3HLRDtCn4UrV1
IKD0nxqZ43dQ+874XppfPiFigWzPoNLQFK16HdJCdp6MfNrMR8Wh4MA3M5oD4fYEK09dzRjfpsXc
SRblT6pFyTq8GZDKeDY4FHX8VD53XmqJH7rItdSaNgsRRd31OOZIp2N8N40282k6HSorKGmtQXfi
hDB+DTHqhfsnjRn/06R0+U+ws8iZjvr1YqWrIYKn36hZFwJ09j2dLif2iHWaAZZV2Ek6zUjojeGD
D0mtGFOFcJj0Gi72dSBnlGHgNrxeu83kJmvVm5C07fT2F6/iJvSn3708Fp9UQIrDIcXMVKdbKwEg
+umqbZhHS2NWOqxnJ4e98J9SLzwbsdNDExng1EGm7gi3H9Ild3/w2jsn42ZBTzHXfaoreY52sn5r
/mVam31tHhS6/hKwQph5x70nOaRojefR4pV7iLozpaoMASrb7gqL9alWpmVn/0iUvYA3Wh0HxdBI
00AsUDlKEhYkbN2b/ZMl1GoilJwy7XHHMvRD+CWoBUswVevnSGgkEB9+6iCWZKp+BB+k684X/kbG
rx6xKwiOYRbZvFTWqGmOuql5IneDN+6/5htfna3nJc+roBog2RGkQs8yk15bid5PyM7uxLYl6rJr
8ZGZn/n8qoaalm814fg59vicLu5F8w4bJ07b5sW6mgvv1RrqQjLp3OCo/1C3ZB52hq/cYgXGlHz6
Ncq1kxzpzuDp5k1/vRa2b4HDZndsgqK26lbRtQei3HH/pXUq8ZGQ3cR3R9DyAoimzVWhxYxo5imG
2+nJ9Jbk9hr380XzRmEJifBT071G0AvwEYAX0GWDhdC10cYBzdGl02V7Qaz66HuI1pHwVoPwggl+
4ZP5ikeAsAZ/P+pJLwEXcsa3kvjWS0Tg2/nmQPhPqB7n58ANJrz/p/FcQBRARnwt1WSQ1Jl0DtK/
TvQ7XbcvCdTgixgIJlo7FZUvTYG36/efFEmwVxsO+z5K5eRYcerjevCY2+I7NFnqNBwQQzVdApxw
yhI7qufmn9R+1Yt+Q8s7m4JoAyEnif7SQwHBJfAijn1sKk9llUgGV9lFimTec9ThQ2qTMwo2pYuB
muSNrcYtqY9tgZM6gFHFUJtWopdYOTS/c0zjiOoGjXaMWvi6R+nVhzQlsI8bDPq81R5wvf6LCBfQ
3e+xmb9pQpnkcahb7CkrbvDJFA2N5hctY2gu7EFCeg6uYG8oNV7FL56ZggZPPrfdzLAjPsLuzJqa
t63W45IUHvPdsIMpdQ33ESkFHFwKmT+ZqioaCjzZfyr13R84rRfmmfNyRePD8OQ0t233DE04p+Tx
qdklqwe+j5tO/4HOE2BAhYBciI/4w960trCbCMSfmQFyn3wXFX5CEk5di/jzB3Xo/sRSnvkpmLxF
1e5VnLxFcZJLNQb7JE82JdayzGH+hVGR87jFQt0ArpdDmVP95JWXWpuxx0iaOrtLyI5ltlxFHUN5
/qV4RPugTL21vKmyBHTpaKKgj6t3TGHPUDBS3VcOvvcZO2KUIIE5QRyZONdOMfIT8hdPjbYk5QXe
ubXxeXk1PSlpq3gHJm2zoTKsMxUJywWZPY+AoWOeBbcmxjO2zjT2RMdSA6unMIy2+Yj4xp7B09PQ
F4pEvim5jTFNj34fwYy9MUdFxUctBItiq8F1+CSdDGOH+aY2yOPm3LNYVLYT4nCSkXu2cyrCzaxk
Jj48qGPcW6S+xLThJzu1Msxd3c621gr/ScckA/ifc1tmN3CW3CbWnJS9ffazgfaQRXXAmAdFpVp/
z0TG6vu5sYo9w9ybvDXW5x73Jh2H2pED1f4F3rIlOTl+R3OrCzdapk1LxPCaSso5352lJRukfHsA
a+09T4S0V3VuGmxW5+je+vVvjEKJghQ+12bCxS8CNc8Zg7CrjG5GThoQP6Lqdr5bLEBAdPjy+Dse
3YJS+SmvInodO6ehmRg5DS0/eGqk/mB43HN3C2VbOLMUvqr5or5bc6lmh/WSDHXhODCJn6fOWRsr
EQh3FU07RXJM76NksVPlD+uGro23k5ek130QE+MuMiR5Qj8Mu6HvnCgLQ8CVjf8tyHSryCWhvyii
rJaijkLhHkqrMuCRTOZK9LPpUFBIB++ER2uduWKKE9WUNrBMXwxK5rsiwaFuQY3CncJ6LfQKlrnQ
+UExgkmwab2dHKUuICZkLKfnNBDSLdQgI3fGm3fb8vuGwVZtwm5d6YDcHGeJcMpJVCJrZlTOc3Tc
pSCLcSBqp/N1B00iG3eJvKtPHME35cw4LdTRWidRzsOURpetCFlf3T50P19lTvNFRlxstSDJKlgn
DlGlpi6rapUfdXeQc2MHpxeuTVy0SxgRm5acZruOXCnqEiXyOvnVxRWlu3Uhfl+U5zQzYsPdZFwi
fbUm57eMElmlzBeMuqE6yEfoQbxhtpYGNdzkmcuMMHkJm2OU19VLt2G4ZM4TfuuSCNBYr+xAqDLu
DJL5x53uGxEdkHR+gcRvAT0I00v/+QX7oDkmAiqNbEiAldmqLv62wd111FxrfmV2EBOze1Nxk/EK
0Kd6DhdRwfNN9vuLWV+zXVuv3OiNkaaOiCvEHO0Esyqd4NY5T2HTiPcT2hdFOFXshpz+1Oo7SN8R
+gFG1Sf12IkZ46xv5hdFmvV3Q1NmFcvgDJYFGes6axOjTyCtGNoqycpTEyFWuFZIodP3SvM+NNOg
CQUxhzZO3RL4nByc3vIvN0nnZdY3dY33UhrS1vHLC/uBZn1UaY5mCqfbHJfVjqJfLvNqgiX50x2Z
A2GfIKXof1Xoo1jPSojIm1Xs4SMMH36vyq0xGp/wK5V2K1yUSHGpJx9MuyKT0xBMbg8k/23qYNY2
GA6/yRhpvuwuPjgVV1Iy7UL9w7bg0+rS/pxuZJrgN+w/P2c7inFWMZ9bsJoGQ3k7Uk2P/akj4uur
zqUl6amZl8oki0z7RjIPzWW3sLBL8TruoKUKwj1+KV1Gm0+c6qvbW58T9P3ZJiamXOogRFhm7miE
w8dVb5JRvs9vsqsklZ49JPvh5OR3Oo3er43cyJ+D4qqoX3ZuSUQ9MUv7zBO1LeCOKjYo8hx+zrZB
O/gUI6+DxEuJR+Euch8ncYvMS7zT5xcJTYjCS9Qsc0+7wegn6E2Gvskj8ZJ8bkXEjGLLFIUV6EwZ
tc/fLOUcek6xAU9z+SXvVcg5/Fy0s8iPDwkByVPG2f+cq3PILxGaUZ5Sm4hbxjniXKPxxLpgu8rP
BPoJRgb1FjmDhFvc2ac88Zyz5gFrQ07+lPiYgltgXnifnPvbvLhzULlveToS0TU4yiWyZ2ftVwGQ
Tf5OML8nGA2YNgSybeJT0mXJm1Pi5xAbjg2GznQ/roLHEz96vxG/Jeg6FKvs39YUy0Iz1mTLX+sz
bPD1UGeaEmzgN8w6GWFUkEvJNPmlrH8dJqIykDqgMpBrCqAzUFgQaQrVR53DdUKAmBNvune6dn7p
VO/E6XTxs4cpgimCpoWhhR6C0fIz8svzI/ezh0736/G+J+le8BP2q4I2QRklSpNWFVP9miSTJJok
uU80TFyNughdBVMFDYABQE/BTEGXeNcjB2F0KnaaghNmJ48LJQl8J2NFokClQD6EQYX54acuAJ+d
wuQtK1xApojUizoIswWtLYCtR6f3OTuOKYUpRBalPI5IBEUEKQRG2E9AAIQ4M0q0P56o8mdPODUi
9YofngB7h3A/iSEKC/QBOCUxvS5BuBg5J6jx6Tg1yBWVEAv1CTgucXCUmBiRKsyFH6ePvy5FN4r+
PsKEQyCVvAjKN3DSjq/jqA7g9PyCsqiK08bg/OISEPzSUchCPl91waPaffxABPg2sDaoNqA3NDrX
YNbE6oy8YkW6Wyl2VPwYYf6roXHRe79z5g3SzkA/ROizqZdXnKAfRK8CnGhBwlAGZ8iveEH4wc6J
NkxIXAQX0kS1oBfsG/Sdqd7zEt243vM03Ud+fMjaub/fxJzjcZ7A2Bx/nrt10k7PnxWs/tUTyj9y
OnxJSHmF31A7fAb4vTi05YNV7AR5KG5QN07ETh9RFlS0+PXBRCITkB//VZXUWc5vt8KDwMKDdL9A
aK59kSUYEAHElVmZeRHnqBTPnzZ8erQbc35PoMz1Z5VuYMxbSHdInuhBhaLL+EHJfvW0SABsWxMi
Y9jNiK9hmLZc6AsCwuwK0UsF/SVxTnDxzcnyHHIDuDAcsv5HMHMQ+jhIqQWPNX7m0CoKiZ7i5GU5
MSoopdDdrCTs8gNDMInIjWAT9EGSYBMlQZKgEwAkTKgcExJ28BxzZEyInHxShl/NOrIDcAX9D6uW
/V0BEksmj2ZL/CdkS7FUMlnHwi6a9in0Pyd9N0UXAi6JBsGo7nIthB/YBj2o7nKWfS9p45rkTgUa
UHcQ4pbkarMsRBqkWsYdUQfDqTiyNCPt8Acp4szlSvkbcHYSqVQKMRZLhRpAjUgHd6i2FDuZN6DT
INk3qOyI5+cbv6LpRJiDRS/XJCAnQH57fyGNEjugYKCOUtCRpAlzxtpAvsvyi+42ljAVcRhZGBEa
agi0vx+ogGd7+wtrZJRkEFkStIiPdxblPigndcs3yXGkaXB0Yp+sz/v3irTNU9GZOdfZ7j6XzIOi
759CHFp9L9kHNaisc5q9L78MZtqoaws+kA4aUEXmHPMvhF9CD5ZwotdlXVfeGB7MgKA6PSgZpsX7
ofvt+DF0OgsAF/TwOiSpSMPIw7KJ+5ByYOTwmoTk0EC1l7Qig0GPvy4EkoR89QAmjgtV8fq7zop9
J/pG8Y1kGpUC5RC6xg9HgE0PNDtEVryA6BdSTOGVo094lJAYGRlSsZ+zAF6HQBcrqn4LB+mTXEQ2
njDQ55Je+nxNrpX/AXdwjkon2z246hFicI/qLPcZfYeRKlB2VfABMNjE2cSYxR15iTdoLefpe0k3
CKB6kssQWQi8RJNgHOzi3OKSIxBY8K7E3zHmfRLgW3CG3+DuPABBJfCfF+gEZRly7+Tu1BSA0kPI
Th8XSZJKEk4ST+JPkk4S+U5ejfQbRZr0HnoEHLFD6vcosSGqph+dAAWxb5S0Dcrkdyt5GASfNCLS
IHDv9u/CPncIhkhGn3bAWI+LqLy+An9eusWpyHoGXrIMSlIx5mQ7ZWuS/V5gQFup1WGqO/E5vGm9
qiu9KynS3tJo+hEuU2V8ndLIlmMcjm57mlJivqqay1nmWnO2XFLkUTkzUQRx8+cQvTVeQ+WelTbJ
0eVHYlnDkeycipa+g4r93HKpkdacI/5X/8vSUnytp8bu1XVta8O5/gmlo6bSQ5QcZp2fDMbrh9sM
4a1majcoa5Mlku6V5P6SfhM69HpQiUzETjDmqpO1Qu3yS4m/jBUvJoUl9beKwiTtEp0Tg/YUGW9/
WGkdpzY7X2z+COVg9HSvcF/ZpMWEW2KicMYsclAyUWG8bKkK6iAghhaJaxFgIvqDeYYB+bPDpPMn
R/+oEFiadwDnSkt7nc0R6Jr7neZac4m9B/4psNXRKdW61u239exsciv2qWnrgUb+g/oKfWuh6iur
U9VYXc3C3LbVtdTC4n7qccZ2qt+jq1O69ebsF52SpkWVqprFOdkRivoi93j9CvhMoii/tnTxo1gE
ygFWy+D0YAGTzY7urmB9k84NcL30eOzNuR4dbEacc5Jx8lEMJ6Pl3XpLWztfNOSa9OgjUn/pKdfY
KPPLFG12fNaB9uoeMqxSVgt2C0BQLHwVfCa2D+QCO9jSby/NtxjttOLMEp1iTHjXDIxw7RaussGs
qoNmVO4vFdO5tFNSs8Eqh0kqe6Nll4fyU0WD1bE1VTWbxvRXZunJSpmFvmYdRb1hY4r88UiKzEjJ
6cy6In5YHXtBPfN/xgnr+liAXbnCMvaxQ0pzRZ+lC69EWb/dVUk+m0o9H1qm7apobkKtVR/Q84Rp
TSx2+V2MvH5/7aiIa/2+JUIlU3xFyV5zX0dWO/swZ9A9RMof9lVfhi6urtGY/kS90SHZvBCOkaoq
IcdYDfNVQtdZ2JF+CziUAIph6yGzTp5g5yDun+A4ctrJzgQ2I0nOJjMSE+Kug/s2e95C+uAEfpvZ
/PC21sHihvHzkv2nt3nAs/+r+3MDRG2n4Dk0N0ib/1pX4jd4SxtkboSzDtFzCLweoz+GzHTeRq/X
jOB+Xe2M26FfKU8hIN7W2H1Efd4/RGE+I30tJcxpgFQwTr6qp8DCPuZS47AZ+XrWHgoLj5XXKLIB
nCYw9uggFcCWgQp1Ua9P6svDCYyvg7fAnXcXcPqiB+PQIaEKUbShqQpmrof/DMre3mMDoxlSqxp4
MbRuNw+t0h5vg/6MUhpgvq4+Dz7XcWMDtgzN0THyvU9jg30eb3DrYOl87wt14t4ySJvP07rndroN
5jL8XXtL0iub+punM9KPX9nXYAULoHW5tyoFO3n1Vriv99lQoOX4jutpcl/SDv1bylEJRE47F5bh
3dblnD/v2TKOHsfGRJh3Hpwxis/l6xJywz9tYDtjePpmXOBxIzK2h55PtsVdXWcF5GsHrHXQ7ptD
rSOe0zwjv4Jbty+dI+D58eXOeVymP8+Vdx+p7pbIFjpVTOusC9ItBJIX4sW7KAy+fDXb+DTLAx2o
Cu4+As4Jyx92sdAknZKNm+eyXdVnsscwMOrOW6uXMjbO42t/9WnxHiRNJmPzIlWg6oIo4YQfLuDE
yayoBSsFv/KOgK7LssNeG3phM3n827kjAW7xU1ocZtQhD3D+0DZ0EvqNqfuLNULFhs56WYxRv2uc
27JrczcxXVfJ8BLnRK1Xb6Ohh3biUeDshkuZwaPgMj4vv6S9J91Id9/5q+7zi6wnoTtsZsfc5A2T
e8TTQOI5+u+3gJSupMfSW8MRjvsrp3uMiPXPBL6vxIWvsXaPep/2sLAMQFH11p2P65VRsAmY0erz
hZnQFQD0U8wt11qEO+LAlA68KSe76vx+BfEUMYyeHNs2VgBcqInyMgeqGkpVhWECCxmjFVNfBBAh
YXBSwKVCfqS+o5GdTo9Anj12pxLd+Qczx5UudyR6JQm7T3wWBdTUQxKBv0sDylA2yG67mo3Qq/c5
dy1heJME4hvfM2RCiPV6BLUPikQWAQX/FcF4hYatBn5PxvvXbOToXPfPsaDzC/ZI3rtNM7jkqA7K
5sm5YrYN89//UCtoM7AKqr0tWZ/0DcFFk2dgJu2VtKo8hb08SZFntIJ5uDQMx1nEkKkzUsXD+pP2
0KPlcYXCwV72wQr7S4uGaEc5+PeQ9oZAPIj7YOHPhqE7pwRb46XSKd/mwxbFiHLsDCTTjliEhgQh
WYo3VoM2ZZeuyqUhMyYKUwm5+LG01C9vaMilXuYsxmREJVnJkaKiRr3IDN6ItkYdRUrHK+GtkLrL
TrKwK1VI5CNv/wnSAMToy1+h9E4ffP7SsGoWISMrknR9WHx4+4q7NTVsVgOk5yUOr4uf5cOhr0T+
2vum0ylW3gF8vj8wd8HL8Uu94Edh1ISnKQfnm89mLg/GcC+7+nMdrgwno/bAlamy+jmh8v6RV0Ut
MzQ6urjJ0ya8eVnZSkLULqSqX1FVMyoMIwazESKwq5ueZonrqsP6jNCZAUhJmSzlvn7VJIPLeZzS
YjojnJjxw1I0w0Yhy0tSy7XWQs/RdWs38jTNdqnStq8Ux2W05Z7X1wCFsY/ZyDdTZBo1c5VW84St
IOdYzhFPoVk4kCfEC1wGZHQdiutH8eqBYvdNwCM+5Y3GXBLDDVd625gruuBj+OjG5taNUEKcM3dv
qzvezWhmrjir2OIAZHA02u/YHE7uGv6ZtrQlkfmsyaIduxpttqgxBmVs5+UsHNUe7Y0LiH1OHJbY
Lww8MCuigHIZA5FAu5QZsLnvdAfPuAW4vqLdCNWqX45h1b5hz9BqHoXPkAvI57B0tR/GY5RESCni
sGF5+En5F6xvpGNFhoQoXEMiWvWhwJpWu7LLTQz9Pjv/zdr7YOM3iSQI5mBbdAKIF6O4SvHsdYTy
MC3I6yxitJDEy4EsmR5k/3ON04Cm86dmJ58LLsbhe59jafxKdJzpBMJyXq0hGblRtzlkDKtIuIA3
5sLvYwcpTQw1yVppAngC5+DiGjju6Zlq2UQFwWm/AgTkKK4oBPo382Kgku+5WXsaG7nSZdj0SjFY
cxa853r4rqnv7G/06hxl3GRO8knKxF6tAIMMHvPfknb4u8DxRMYGIvywEu2ZtmXl+ReyWPgaAktt
5gI4UaMjB/GH0WsfoZWvPuzBdAWSNDa/9yhNF4i19PkbAXziiX/Y/6DDNkOnvJZ12S682lgQhbcg
R8QqLVBUm3029C+B7axBdJnppZ5W2+2wytmyQKSV3repN7eIZVgm1uA9G7+wwmv70b+Hvpc1ltiZ
ue+pHc7AMXd8UbCCIelexuQkapahXNTb3xWlvoyVP6PqWIVXXcDl7Bz4/5HeFlB1Nd22YAgWIEBw
lwT3ADm4hODubsHd7eDB3d2Du7s7B3eXg7udgzv9/e+/3X37dr8e3feNvfYcs+bYo6rWqlVVa898
lRk/RSW9W3Uft95TJ9GdyF7na+5LnjG/Rk1vZZzV6StGRIzNyfmnLqP/fhVRahxZ/LdH5Q+s59Fh
5xjSgcP3zmGj43GHvrYtDvb6j8HojCNe4U4/wlotSluRtAy2lDQLmDipqJZw6dB0aMzj+Urk57EP
1y+Zpxqt0kSHlJybxuMs+BdvWr6qyfF5SJgpRTh2mWJGd3GWCHb/Xd6iHeFZZKmrUCxF4F/c2Yw+
LJcccJf4I6NBtuqthNMeZNUDF9aHpYeTOksZIndqUnWOHLSIAVYlKVnejrKYR7tAPJr0MhOYxltN
8tUZhFDvcLkfxqJ6M4bh4PG1vVXEJlhcs2lkt1ushB+c+XWtlz2NT+6bdO3AQfNE75mZSI7wiZ/3
SWNm+Vzv2rhxmDTT/dITWbumh08d9gYVYJpnh93wN4pkbm0NBAV8xT9xIrKNyczec6wP2W9GdTLa
tC9ZkWKpRR6bpPF2jkQd1BB9ji6Gyxl5RITUWvfR4KTnH+pbmYSSFUbYQnkPwgA0YV4gVeowUydr
RgbnIt4sA6sFccqo0alR+fnR5EHjPff6okDUEPTbEfj9RUmroraEznopLBRHtjxcgnlY9Ej6GOZh
zS4D4+vhQOwoIaYECxmt5EzOWnIfcsvp7CWz4jERWeg8zu3upDUpUeEUbakDYhaaQ1UzlVIV/kMh
oNq/Glq3FfJQIhNAuEwCVh5CWhJMTM9Jr268upz7sziRsvZJoT4zqwjjAUubkEPSgmUMagnS3E+T
rY0nG7xC7+28muubsmmwzBkTCflgRObGeyzSc1/Cv/WWlo7KaxKujSsgNus+V/mpEIc193ELcTr1
iDII+DiAQnqG391g4twhFhzywVuofyd9PUwUqfXWCXeydKrybHX9JHvmO4cWHZ5IoVz+SGU6a9++
yyCQekqXy02Jud3+TRYF2ciGDupuq63WQc1NsZIJWEzTTT4cJdnVXuRy2pVpBsdjV3Ly7mCx7zQi
jSymNvSJ4O2ziLa3+4snzrSkpPS1TYPLrkoaFdIzyicucU46T5QqV/Kknbga6Dr7qO0KlvJIWKms
pKqEKbIhzmwpW01kh7XEP/tFkgfcpaS+STMOwSrx1QV2rFo9gMvWnYTXso++9BP9ndPUYbTxVIRX
dJZDBxka4Ug98oanVlz5x49GSjxK9wm4Gz89YOR/z8UH6lINJGEDxShLBu+XadiyKrlomgeKUryp
OmjKsJD5V9xr8yw7qGbIU4gwmQy3aw8nwsTomHn5AexqzJaGedFUEdWims6OaZOY3ozCXnPmiyP7
tVU/1lGp/1Yz471/gt8ySTNu/DOqs8wgswlzfPy9TL3khlA2L83bwvRAz+Yrr9ow8qP+R5WXD6oa
R6QpC2OMeqe92NRVkiup34DKhEqrSiLC4Uyi06NKSsZhwCfISeORYxguRbk8307V/ulmed9AqrCe
TednxmxI3LyoeEAau9nU3nMICHCd2ZV2uBVdVx2Y4z5y9b4NluDF8sVw4okI/8Vi7CWLjY0za/nJ
wng2X1bylKKJvBsY2MK3mpSUYEFYC21AYig6iNZsNBpUUX5qWa+LDoMXi5LMV6BRmdDie7qRtVnZ
bIjiruSy/aWpWL5WxEmfJPYaOLNvATBTldfSStHKVE3GyYqN/xvjlm5TGhZdUCKzGUxQLV6ESxlz
g4t3dbi2uhXCFuv2CzfS7/TXdZkcM5ipYVsRRKUTit6C7+KgWCeTTQT+5uipmaV+WNGoRkCTLOEp
gvQeUKquRwamGH2QDmilvCnZTai91rfZfUCgKAB53U+LM4iQspXMYhMxnJ8qcB2OHnMnUKsU7aRx
jSQTFC/utH5l4lTMUFJUzJqZ4QcYbZXQWXkJ6dgKOSgpeirqicr9eDYeNCIqk51UTDufnaziMN9D
A2RVL8AqAmen5cE1neV7kXTuT4k7kX5L9NR7nOOg1wKeh7hUxi5k0e1DY3KYWTKsZD9SxvHg6qrS
XMXiK0Ek8YVRUoOF2BBwSa96WIe1xcPKy+WoHg5q96ZLz4J68JLAxczjbPSrsnbeYYHhMIrgxTjy
aiqr2HPTTe3POlp1LbEFOReWZa/FUCjDZXqComAXrRoVXn4UtZmBy1tmEBT+Fj7IhSKLJ0mN7hrE
y4jg5Ngx024KqkOVrySLyLCr6N0JJdoXWmp/Ozmpt5qzlstYTR98rUS7jzvcj+hBoqqhM2aKajRu
7nmH5ohr7KiKU6lbSM1WsnmrLWvaVy4CVZNXf1l4BaWubi8sjdEEx4jv0ZnM8goweS90rw5NKx9P
AyJAoULFWFmT0/UydSufoO6NVOwj2RjFpR0+Qy9RlQTwTlXZus1tKhStOv53Eg7iDmA4dRljU1ED
Lz2hWn6qMz2SRuXpfJ6WtSiCCTDKs5avgagLONFdlGLKfJSzIHJ4y7VctP184HUJPkhGznWNFCcp
c6Ib8Zg+8dZxjCpiRXHFH/BMR7B5Mv6QjM6WL5O6TG6VgKRt7JNGnkAFnP72YhIzZwViyxae1Brb
/Gk3j0KtWF1nrtk56g+vsumB1Se3x/NnTVvfvDjDHa0r4XYifWTKzm67f5JC82XT085CW4ErPuTB
ZjwMzDRQgCd9XYDtZlp0121Fwu+k87ierhMgRfQVue7TRonF2Ki6tT63x9nV8+TROp/gPYPD09k6
UjaXH4mDWco4cQqmSbSSGDVocNUQ1SNiRaXtKQ7AQNpdUtZhNcb4TFCuBPrhbn8Ogo/5xDmsvqNp
aGGuZhj1J6R5Zc2pfna+k9HBExoINFtGyWqxdvNwKj/HiloIOFx+YdM5eEZ+usc5SxDIVXrvkRJu
EhshMxpGDs8V/+31EJjDHa9q3Ida96nxl0W4NKv23G6j25W8QV7+xTz1XnHRAZUlT37eXolWplZ3
HmsnvXB1/EiXhLMIXRKGlPKq+RJ2IzeFQ2DxZmURuuN8H0M2RhiBqcvGjXRxuwuCrg7PqrENJPQB
WUD5ykDxQaccwxTxqj7PM6jpXFLTQRj96VYvibOYo5He9hvTEGQlG4w2Te5HpvY2sGRjoa6cvaP8
kUdnMLTaHOtKae4Ks0GxlGpynfufTSScustcldZVJEBFxaewKFjVRFtr6fXeVGN6VN+rrdYGqUPr
kpv6TGpAtJ8A2U77nLQtz2gUBILCsyHklFrW1DqRXQ0RWJXcVxsexvhyPG50KPuEfhm8t8lUJ5Zi
1PZ2nMof4ngWi4ECUtDudHWiPFHvsMXjeB3mh9PD8qXNk5ctMwvxaVGy/FHb8IPRMaPSj/9YGP+p
HxTcKsm7CBTYip3kZq9c6z9R9h2HZukVei1ZzyMGIbs1IiwTejRXhe9Y0dDR6U90F4K/c2TliFz1
cg3AfHRpLO0E5QTc6nW66Zwvl2XGAbixYjzhSbtDvB60/avTHto0vqU90gDu5F/OnolZqJ3LimGl
I38Vyg7LOh1QW8pE5zVkEgyaF6vY0ihLOZR5Dv3lLdtlt7ljrG+7Sw/GYEp6LIp8amu7WVxwuRPy
RC7KTCC+bieEdthbCwkHrKimHxBmkKq2/W0n7SvHOSQnm0SfEFLD5vSIbzD/ioS3uX0O7IjFzeXo
+ARo+VS/o2SFYIMtiYvs3YXBcRNT+tivZj8uqN0bQN1ee5xTsYU17n9gDrrVjjo0INCiQJ6NeR/8
qnXUNyeJqbfQso3uY056qUpgSZI8bcaBJCxfLfy+AxG2+rwy1T9VA+nl8FqMHZFSv89u7+u23ktd
QM9pn+123vvpK+OjvDJ8YGhlrXe9HH+wA7zbjudPmU+uPtft2puJsAJVnvN3e0Gx3Q72BrFiudMS
cK+V33uoCbZoQ7KfEiIWtpXfRd+P5vWNMl8S5F/fK6Jyi9+UW3rus56gWwAG7/VUpee/LAMmq/GQ
mxw9ztIR9pCcp5hUNtAhaB+q7KttoGfi+vlUG/oQbNn/XnNPBVHEOe5SPXTOAacEMmbJSaAFBlpT
fmW0IP9pb6D/8dM3ZErjr/8UoBdyEt/JmXdHIfjZlyf7PNFg6CTwViDYAZsAlBbWRzkK5wIHoP+u
qDgPExmJx0743OG7wL1xDJdq8LLxfNHenfL2cqKy8HhS7ut9u6DuIsdJzSTI5KzMxXYsF0zSnwHg
57Wd0ZW3y97R5QD3yr1e6vFXm1ug8o4Ev6UsF65894qXrd+rS7BGS+uZNIISXDPOOc05T77UwFw9
0s3zb/YjXm4XKxx+e43vdox/reLJ66QT8279clc2IJkiOFpXAzemOVRzSGlaG6baPsZe1Wqql01F
Jy034ZrGwjMZvNrvmi8fSThFFv8Qt+gHKyy6HAvUUppqIEqxMNMidQ/Uh7ohCzBdGfPUHCZqha0Z
yLHjpYpmmJuKi6E8R/szswBSDiannAfGrnfc9z6J77ucMXpIRHAfdDMJ7m05l5L388tg+gQ55a3g
pyQSEuWwo+WaSoRK5mxDC5aVTFJEq7EG4I2uNkxdFQiV4+/PayMCZIxmKmRCzL+nVULPPNPdR4v7
3CN9SB+dt871ffbONwGF+WGqKfLX8jhGwhw50XTMJrkNGsy4Im+jk4q/pJfX7o3fVi+wPU04BXtH
wHaxcCfzVJkxjAx3JOFPYFtUX4dmW9mq6zPCF86jwt+lLznra25AddrMHKV2J/eZKCcUrAqe/AXj
ESZdVvebgloHgjk8Jt0f/Pnm5xtL+4x0E0QG82F5vZY/TOQ0FbjaJFxNJzXqnEciZdLbvrcAKyhm
cASZ7Yw9Or7SLdi4mbUqO+0nzrgXlpsl2+qkGkVFuXHtzGEmiIMIdnShrm4eOlrRmWz01TcI40p5
jmLLpc/caVJvxTzSU4MDy0UmCTcOZ17x5kR4esm79lLvok/rcU32QVH8eTSTJFM+nHqW05EBg+6B
dmhYXUw8Ktj5Anyv8ZHPzFLzr0puxwFvWyC/QIhwfM0cZoaeQmbdX4OLoyiKnVRtsDVB6UU+S9pj
fU/vi4WDo1KkUJ3EE5M7PIW987jObF1kV172DW/t8q0H453crSZ5gymYL2DkdygZrFVjXbFnLaxZ
WNRqeFOkKtn5XKBLYTTG7kFU41HCgYU+zM6P73tfMysVSF+AZ/X6YQ+F2cuI0c98NbLMpEDXS0Pt
PtrA2sf3lrOiyggxaK+RJMh064uiIrGPKRmJN1tJZ7NYqEpgZP0j6y8NwqreFpPM3K4YB7xYkpMW
ffL8oOfQiEgMRynZR+Yvkg0a6J9wCqOVGPHbU3/HoUh4tMGD1s00s6xHslNswwi4WUy3NH4Edeq6
tsuZV6cYFbfoTmJp6F3Uv5w7PqB6OR5TrbH1UwZ248/oseDFfEEEs4jr0Ufs3Ef+MLHcbtn5EXKh
/yZqRsbNSmOXF5HexWOSd0G3e01duHor6CHS0AaKmshIlGCioRmiXL7NGzEtmhNGnOBIKGmmGZg+
POqvlXSVTLQ+mNb+ATIHnDjfFbRMi2nQwrTvs9dM4yuVa5kLAtLOBqIk3BbeZlltV85cSb58/B60
kcXBMsJnmO3uZ4uk+eWf39pOczde+RJcWq4+BLvOAi4xQSmVjVygiOmBRjo360knj2duwhezLxcl
7ElMo/TOSMETTUDvo9AJQCF5M+2gLVDYOkVsD+dQTpIjGI2KCj+zCj+dgWplMOyYACo2k574cK78
K4h3yFxmeGsTy6fC6+sXb6Zo+RXKc3g+KAk5W/aD60XzEXs8HrdZQhq7fEdZFlK/vms4LLqzsE/Y
tQCAZt8wQpJNuRlgo6S2OPAjA8xh6ejqWmtdPzK4spIgvnKEte2tvm4QUS+JsPZpjVO6jj+fJHom
+yyT7hhN/Ak7mOmv19cqxKYwY2ZNyMc0ypf4cUoPg0UfkIxC0/Mfe7vSBOMYggTT8OcgPX3zNlP6
52KrEUEWuLP6ngnSLI2K8DO8sl3R93nzs2UZXO95oM/M2nnuoZaDd2/4hFNUA3CnxMGWAaBo1JH5
O6ehhJa1Fdhq1mcoH0wwo8My6I6bIm/tY2ikWLLGUcbFgJgfjONYFy6+MrA7dsGYY8mHT8RAeJ7M
7pg89mO1/ntzjbWlVibD5N4oURYziIqGxwxwdqYPmKf96K7yyO6t90IgeEjznjlA8gWNz0xOFiQc
ZsSc5m58gBFofsd0rrDHKlx84s6bkTySX6F2a0mmhYvlyGdEHM2anbleapQ5yarcnZXBHqQqMzKS
NlQ1t0zcGK7a1/40YfAehkdp+DUfzsK3SYDbKdoJ7eVQAuPlsLJeMfUbGjY3Y0TaevNuUEDRw8zF
njN+X3omzZj7yIFCFh3zRhYfD1gCi648E6C3TvA2Gv/GQbwoXI+wNAgyuhX4GdoinyNxNVK/2v4x
gy4jva7EgbGwtiHWt3HnC24SrlKcMdkX1/dvCyZh3H8zvXCTWCkM0acrC4tuTFbQaBqPss5y1kR8
fgcC1X5ca6fy3g/nIm0aiu52/FxUuIvOnU/KEq2fkVdRrwhhmEFkqNTOP9Gsp37pL4TgfV9eL5Dp
0sc1M0ffY11nupfEbT9eG7GnDXv9cBixhCU+JOE/Y1uI5BFiZa1l6jcGnN+rOSpXGqrTL4fqd2kO
PMJECFDTzCUl/+YUyJ+LwDbDmOMUX5lKodWEX+v8O0XObl5hytvOHHPiWGpBD5DNTVbCtxMcF5Gy
6IPZXn9DIiBn23ffJq6lzUlKX2FCcQlNzoSdbxccYhdNLqa0Kt7Zg3B/JbiXssHCLHjZnxxOWEBV
FNylV4oxbtUYZRR+RLeaJFXEu374tex1TmhauTeLETANkyT8EnOWJju+CtCyC6ApagEGc1F6SKxm
6A4QvBGV4t3Yj9vpIjlmSjpSD97qdDIKUgt4ik02EFVPNKdZi3XSpiVU6W3qaL3+XgAu9T2/oM/G
cg/R2xCnnTfhY13PiuMYF4DuJ9EqGIjYLbX0lCzF0gGFv50NtQwjGSg2ANtDlU5mto9vyhlvI+mJ
Ua3aveA2owu1Gc3V4ymukHQz5bETSEFl0S76p+rEVVyWKR2d9Fagg2mpubyP3kPil+UQpOWVdluB
MFeNWZ/z6iMptqjUo9VX1rmfSAmAADk0Ime2Zzer6+RDkr9ts/iai1NG+gNzonF2u+pi3kRT0T/h
zYq5Wt0pNm/qS/mTPXHl/eDh4UPXYLEydSznED5soUEFycZ7rEOm3jB97Qi4n1COYTcj9DrcP8v4
epXRXuT4Hvo9lftzykQBCESK5/h8DCYqdk6LomS6F3lBZhGN33wGNThldfl15YY7qX13ZK+pNVYI
RGJlHNgXwWxu5+j0NAVynT6jABeUuiMmnHcFdgsRqTJ2Zm4is669BmO33oWV3QM5CVbKSFmiNAwz
Geb0BF5LLVslrWDr0DEZWcKkLeI4bmo6O/fTPguACWm7eaaKGipZmsRiGMupceYrW3ayxCRM70MF
AwfATIb+mSZAjS4ZW4br6jwOSaXTfIb3BNE6ruYH/Umz9fiSfnKFnPIRzm2zD7P0Uc2IAaDmg2ix
xjwPe5blAFQnNa3Ph/mxm8LOPSUDi105HiP3iM3pc3kEa8jdNy2orx90eFN8vmTGCC9hKywPnSBs
RF3GtwNzdmNAwm7uKImBptQxlVk8mCqlkCXSTV+myDlKoDt1vPId74hBLDlI/Scv4rCWqTdvuvU1
i7CZtdnZppsG4Gl3cM/6Tc75zU5xnITVl7TI4Ok9y9DM4el18MdO91P9Wzf6YFxLArTz/VKpL9OA
sOj/zZ4ufwW+B0nMRN24xn2BrcXEQ6I3k0DWHFOipyX76kJfHNeWhB5bRE8TZ0pXTb4xen1//cTP
d67iI882c0cRH9bEQmFiwz5z93lWZdg4D6e8NWfp7Nebh4QrhQv95TeX63SV/RiJ+lDYY7Xs7pyl
SyUB4baQJbdvuhMOVQgHLMOWVb6AvRiK88A9Lb1u3Ed0yS/xeBJfvM/FT1SyxU7U9H6ml/GFNCCZ
BzSkFWsneUtc7j8+t46jZW8OXk9deRU7ZiLX9HdTbORniq72zsnt859s3aIN6/9sEz8WXu095VW8
hAtmibMd3FCR8PFzjnEktQiZDWjA8qgjvxYvkNuHU+JcNYU5dCjQTrqPA09ZudKZxbpisutOeOpM
xFUcSKg5Ucp2dIUtcUKfqPU2x08z3L3Zq+0ObrXjfIksaL6Ax0wu9vNbUmJ29ATCPR9pXT9sK/7T
q3BBKqCgdLRYovnq5ZVvY3BOzjCv/e+5090S+dd6FA8B4dWw2jO/bHaJrFFxiY2WdkQPOYqN0dPL
Q4Bnorw5IqVnLE+SILkLwyW5rKqecFvS0vo/M+vNJknNZ2/Aurr8J7BkFCbpvNx9cg9JBMdqv4/2
nnhnTqYk7iEey8qcupxZlNBN7UisZf0+lfdVMxx50S7Ls46Bq4+s4dyULymW16JZyUsYeGrJ6UsU
+gX7VHuHVu6wFrhLVu4UI19dmey+1S1X7k/05cd1MRoXLhfvV1KKN2uMrQWGODNpgeVOPk8Ob0Yy
sTVYuEt9Du7U0iPnUZZ5qO6PFzGSGDsNXTCevfLY223sCHyhZbIjn5PZbeiIGyC6mL6i3vmxYOnO
zhRxY/K1tQiXyY4KWkRm5U6ka87zd//cuE4U9FZXPVmwojlR7qp2XZa10GFpBqhe/f/WfE8aLgjF
jocaf3OMCE1RwRS0oISxR82LlqkSm5T34qv8GYXXihAfw1svQSJBPabQ7De/o/cnpcyhMtiZfZZe
Qi/K1SVWM4aHhbJDp+qjDrquqk4TTOGHE8IH/sZOvE/G9vB7HdPT4bOme/5HESM/hIy+3C7Qso7L
musGPaP+7G/4YakVEFuy9GSMyTa0PPxs3An3oHEArV38GxxVi3S70BGUszTvMC9kQ5zUkgACLF2n
81TVfuRQOu3vnBeWJ2lOlRde+ZPuAS4vS4hixw/6c3u0a6R4TtLUFJ51O/8JZRi/29IhuIy0DudI
cFjaeqB32KuEQ9kzjvsOwUYnar3ptHXvw84RBmt5I8T1pIQzL3Pq9asHB8jR5lZHmKFZOIHjeubO
lL0oujt912xX/XBwqtNPd4F0RWdsejsiUmywRSgB6W+D6BzpAO08gWX0uBL8fRzy/CI6ofpyBoNf
gf+9fultji9SdY7HDJeJI87FgtCa1IRVR7qvrH+wIZtB6EtL6Mt+p+Cwg4rDpXEqh9gBlXW1dCUI
Nb36+dvseIYqi/kfL8B9cVBsCaXm+uRKbOnO0wGkKUrH98tevwTKzwzu/WsXjpZuL1lPmKvKdQZO
+3kBc3NRpnpD1Ga4a3CvVv+tNXx5/ib+jBssWcAJd6XXECyxQeyz659q0cbGcVDPoiggR5XlMj99
6tQDzGFdaTWCHOmZvLhI5iKuq6y6Tg17asx+WR5fnS99W56cZk1lWhO2VkO/46b6IqC9cvKpr+tg
l8JmukN2QXVCuckjODpjQ13dAlerNs0QXCMwO1eoANApeBy1+fGXn5jOhGkRnvtiVIj1cKc2hGJc
QWcuj7FHLC9aNKpju7OfLGxHlS8aAAGqOazElblW4RsrA5B/WJby0AM2B/irw5ordlj9oop48kIk
F6Gq10umR4KWup8rwj5GB1fCuHAOHzrtUzC90+PhROfQslypPRHBRgGEHk/Euqtn9DFuODj2xupP
TvZMwKiNvX86KngUzu2qqka72/Im28GXSZ0wrb+q7CrK7jiH/cKD/0Q+gwlbi/LA2kv0dncIVvs/
555+6zae2VlbllxxWH8ajvqCqraUbyKcpLNyZFdyh3i17y7UWtT2bXmvGm347SScZ4VIhCzJj49b
QR8GLglHYE8z4amo7e8SYhKq7O2CjwRCWYCO0M+7RyK/jN7gu7a2oQlHpj9jYA99UROFO45hIQ40
cmGs1sm1P12EVnu3YFSd2lXFmjaq0CFw1MJjHcd4LUxrV16uapV135bqeq/WjX6n5p36b0YfluCo
YJxbx4QYF9goIgUsiK0fsAYD1tJUuCyWU/3hdKErNY3BiuHlg9r5VEyqj2WL/GPZUFtZ0ndUBAr5
UZbsvwsxRrcB42Q36iqqS+oPnHW133Vgr1tg1O5rT0bFUv/2apMM6y+rpKliDCeXl+1zvw0N/bb5
fpShpVDjfn3w8mTf7hWKB6ftHUX0gtO1uug/+lvWSPj737A6L1n4ts3hPVtza38Hrf2inwAeRHJX
7aoeHZXn087e3y5JHV1J/W2ug32aLaeH8OMqqgk8NBlWnUmNijYOtxwqiwDVXDpr9X3Uh5NpmPr0
qcugn1QFZUT+j44tl0MIMhbJnNpVVfpThKgllp9Q9DEx8MzkwpCQ4V7BUgtO3zrZQ5BO04dgjN1n
UDJTKtEEnaBlQxOoLlE4M1kfnYLCsZn/bPcNMc5h3wDgDe5M7UwACaWVVdeoBNNJ4/A5Yf5lJ+nI
jAEv4f/sGM+ib+ER6y5hgl492eoimVMTwFFOWmQlIU/Mr0AfCuOcp4udai+dtmM1hqDP511K7hlR
Iyj3OqUd/b17olNJo7xZOm8JDEkxYQZXbSFVKj4Dn4Z3pZYT0qLH6otnZHZ+pf+yHm516CONSOWJ
0wnIevPIHFKjwKwW5UONr1Qhby8NeInlGUmYl80uLN2j0nj+pCsLLrQatliVWF6D8+NQJtqQ0r3R
S5e7LA4CDuVEHz62ApX05XIKTyFwPuzZBRkDjzeuDhivZDu3NwZQoSdlKONrGjC6i9xHTn9GttjO
QII/ADqrvIlxqdzTTgZEh7m06vH8CHyH6/CF0YOFtP3hJAFe+7kRQibhwfs97bhAzo927BAwQgev
373BljcmMAcerA97+Q8lAvpFZRNFqntRIFeTtGJvTcDooUMmEcCAnnYMoLbfve2WNxwwBw6s//Hy
8s89PuTuw+VhD1FeVI0VlixM+setLIQOpz9uVBA12EvqOzU44CUiGNHvHtTz/APS9amjGvbSYev1
E/Cd0YdZYcO5F0ZfjjRS3ZcDuRq2VWWLBLGDqqf9A7D8D+eHjmbYS/Q/95JbG+gdJD3PCBCfDx2H
fzhFlhR4IdFwYIcebWRjFD83nGmbD2DTrU4SoNvHy/6eZziIAGzHPwPSQnw+deTA2uUA5b5/sPsI
Mf1gN/O7Y6iBtmNkeP/j5Y8tXaQOQI8nEeTtA5AMFvzPl3iQLtiOHJhL9R9JhBa4UcXlFtQQXNhL
4i1deOfbnnZ44CXCvzwp7nn+/B+eIG29fgZ24+Ih4UI9vop6KQxjTiHv+rnhQpjhwchbNviRSy+v
tB0UcWOI4LQeTyzIIuyld8+zfI/nB6A+DDjGL6UTNbEkYwjGjhoiBwde6WlHBnb2eKJALhDA4n5u
LJA3XKA+IjihxxMB+GwR8rsoy186k0XmI5i7xxMWsvihGh1oBwve6Hk22toA7ZTM/Iwc6qpC82p7
ivQwTHxaXYPqP//9xYsXIBOKRLjynOJ6bvQDI/9x8JzMv2v17eAOa00fBtrUubGx0Snz6xeLt66u
94auru5L9OX+HRh3SVggPw2fSfdc9/x2jUCWPJKSP65AT13azQ0Fz9bOLLzNk4rE9lEjRUDv0vDb
l52rLtsea9YT7Pyqmo7mTO88IrcMOMOPxnkG0aR/jCnjH/s8z/JdJ4jMtaAGnRaN+KgsJSTtOvES
lLoxZaKiS7sMZ6xH2AFy8IrDC87oW4E8tADLRpOuX1vYJYogly9VpMFOrV77BR06mKEDP/P1sEsV
34/yY9i0pYK6vIMebsqbvIb36RmXilDgc1CCF+rRjFvlk6MwTa7HBGNzZ66l8w9SwoQKckZQ0/Qt
G3R+dH8xU15dKG7sHH/RCptZVVxWXNa4gJe1YIETnaiW/EYN2983Iyr7vdugUWttOYpD8lt8bmF5
d2fnRIG6DI98K8dgwKobarZRJXa2MXsc46a1WVcR5lJp09z87pxh5PydQ3fSZ/qP5UkBpyQ8C2Ik
rCdj/U4Te+0qAylpVgk/ZU902FOp+VmhjxHjTXIZNq6wNg+jYeMcDA1nNVqsG3G/Ihba8k1+N8ki
WLKVlhOMrVAqJuR262btvAkVujKvYOjNKLYs86MAVjwgj3mH6PuXfmgp3ciGyJEGuw3iUl6rsh60
oIb7B75Ut4Ss1DPESsTKLF4OPpUl3aVzqLtXUBBCGD6++XLDBKNiPSubizcCP+B7s4Wd7wrILoim
u3yCXDEAY25u06dksILG1Nv4aQyR4ZgNZb4igutnu9pn38+mljVi7T/VedUrAWhu/es9fApTwaMR
hIRbbEclQk5BrskpLSzYdzXHgew3DuakVdXSRP4wsJcl5dfzCy6p7qRBPDEgVY3hnydrFMwGi8r1
Qi5IB1gIfoQt8lvJ0Rs7tZHunQc4Qa8dBa2izz/DeBGeAISZcmafrDmU6lsF592/5EwqCHLqCq7n
olOcHYoKt3zCl0mVpEeWDtGYtS409Yypxstxu2P1qIQ0/moan0Cw5Lhlj0FmFY/AfjYYi0YDm0i/
5951cZxGv+HWB6SSsEghXpatK86pzgFa2wsKCwZVj+hVzArJrjc3TVkVIsJu3TOt+CdfBqb7dtVR
umm258YvAeXsy+jiQrz8tUf8TKmoLjwIpzDJvVWGGCVUln/W1a0vbdTzvAd/olJXAqaaoXpr43FP
0w4u4wgJCJ+mW/Td7kUfpew83Q1Y7nEkhZd2tp9aTCO/rapHDvzmA9YUFRXACXXF5n5+Rg6wjQsd
nJ6NWbnDxsWsqO4FG26D+yr1ltfKPaQF16esrVE2qFh9kYK+DTbZzOrmcuTHpUYyp0grxmrIzBsi
YQQRr78ZBqLZqkuEfnciFP56wP0HE1mTMtE9m+a8w6Il7COhwnfzLzLzYkzRpPIxxc2FKZfl4qQ8
V9NW6C5tPLpeswjrpRuGBbjsLPf3bs7EfMOeJmgLc/F9fKM75LgXioiXhqSqc6og9TSQ8tHOM5FM
kOq6vhlAwSqRPTD6miSSzlJwfrPvUmwdmd3whwJFxrnCs3QuR3m2Rj5JOZ/UCsgLGaCP3K7Wrvp3
0XzTklOrdManQ/yYfwIvSqojoSbcPma9l/EkK7omBOqIT/T7yrujvVp8odKM4thozU6fJSLZgCYg
xaGShGRbqBaWhB39ZdxQxO8x7cBcTahGCqMDP0w1T43iviERRn0OvSU9qT1dFJOxqKa8d+nhhfVw
NpNJybY/WWB+rcLUsrFvbevbzJDhBda39eHxzT40zoKPnzSv/UyRzbf6i8hXD1crXS2jjiX/eZiO
mXrfVEB9zofRkyTWc3WEpapRiVllm5qy82XMcHJfZ+V5gNGP7OJKdedUXAZhum0ob7t/bBdQ8im0
w2MGObrO2bCsjRJ+sytlaN5mzX2qLxYGPVadWPAGtSnbkProD5itVr68Vc7JiFmypVjzeitY+L4v
EnDwN0rOTGqQzgCVHiHk7+ZGMS1G7bJ/m4SGzDk1S0dY57/yIrvrY/DHZfsZaYclJX0rSYvSEIWj
Jr/GElpmWpj7qIavRq9dwsglqtAMbLFtzJDbxz03V1o6sCg/PapJDx0Z+KwriS+LUPiF4d09PGIZ
rpdjq8Q6lgO2MU3ryU0qvjPQ0/Irr355Vfiah8b48NSuV7Iuk/eyle46onvQSeW4rqLBJ3WRx3K6
s2oRTxQj6nfGim+GJuXd0QM2EHU7SuVTen9U468X0/tjVfErWH/zIM0smLVxXJUiYX7LknzV6lb2
J0NOwI8SmepqHCmRmk3GcTLI1dpNP6nZfxDckY6PvEcX+3ekDYg0nIYGDdTp00Mw87AJhNYpW2fx
IHEg9ydK+Xuos6C8/taxNFH5K+qeSXbX6JwRn3dKMT/fa2qx2bK0lmN2ocpOaUbxI19neDGDu4fT
69BTlDOR/OXOsVz2G6w82faxPLCN84rj1K7wBlmZgpGuD4HL5ttUV+97dTnWd/Sm7mdLmlLKHMbd
zZsNOdcEX2r5hJRhoj1Yx+yd2uCY+ZKou88G3UZfZpjRUALqzDx4VDvBTjKdb/byKkQPaxb3f9kW
EBFTCsURUmTvUZm1jRBTlDMQU8RRWwU97rccwVgDlCJJoAXRjZRPWY/jW1eNH6tMH5xx6fqBZ+ZO
vDKqtIlx2kGgoOaR/B30QbJ4o7a/F6xXRW8lzug4E2MTODcpB+1MiV3WLlrVOFVNYHNvEfNG1RVb
XB+b9oUmYS5jvDOxbdRn9bvqQLdPnZWRK2I8lmtukjyfeUx5CUSLf/B4IfGYyYdNm0+LTH9WwCne
EB5xXX6r8a52ShHzzDtykNPXDzd0Zr2mcDYbn/x0W4adYY80+nEfxP9FNKZk4PJzbotvhCfdLxZQ
N8rJNnYb9qAplQaWGA24dMZb8eZDcQqzZDWNDwm1euYYSa7Vj3RfSfrdBqV2tKJzrdE9Hi6SiNjV
p4JyTjqaUvrjuAIafNSF7IZ7pQJLeZ7YGz8xfbQvp1THVuAl1yEKvKJD8ZIf3q6BahYNuNgy+rzU
WD9YjZyDabyZZmcIntn18T1T52g0I4T+cT4281XtjgCivXLopDe8MUH7XLnu3Uoj5O3+K5vVjuVo
/+XbNOAxAsXV4ubmYQvuPnAX6zI9E56evgmXhbnq+kUk3zv7kJ9FXhZ+X9Yme1HV0W/mpunYk9ub
jcJlCJaQn+0VK5EsdWZCeoNdAJb/O3tVQ+sNVBNpKdmf5yBR1k650OFcrfDAhK3VHesww2B+/LEd
d5nbHZdx92b/l0Gu1fYRvP43dYQyTRFcyYgyXF0NZwOH0Z2Yr4eajhvxp7jJX3WnHP+uUr1RrY1R
yrmbRHAnpQD+jI1pjdqyWPV6+2rezy5Ij6Vk63v4pDmtUMSO9fP7mGnqa45d3Y6dqnV4vALKwVr1
VhPZgBi7Fm9ht/PR1WRI493IKk1nECovEemt7rIIx8SyStfxgWyvbLPdavNxoWwxR9ba/GHKi8Mb
8bvIu+ob23vrH/ZYAgh8E7wrPM9H/t7S3lN/eUTP9HVZUHqXLbN1lYWtBXjuZdz0/uCUQ3BDac1R
f4ydqbrppiFdW1nLrPnCkr/DZDx5Rduy2XrF8TA5x3qleT9Ke8c2zXtMuJnPW1o9Y/7AMmNTbaGp
+Tyhkls7QPve9nwluc1mpymjeaP+vFJ711bX+xSr2aeD3+TZjhmr8Q41SiZgd/JOGXbg26jNHYyS
0YiJ2uZLrpUtRErR+zUeSkMckGduj91qs/Oh9sF+TRW2QAwBVzYrpp0Hk+yniABHPhE0QdzIR3Qv
Ki1Gon3trcYp5dyey2PorIEk4lhWf3B19W7FDV1EcUEqdI4dSKlWqHSGHlIJsnRXMa0DLXszV2t+
8bhfkftWJBiJC2pp6v/ZjLJklIlwF6YsfBdCoMjb15MN+d7vPSMAeZj2/lCrXzz4ytuPkXMqZPX8
ec8txOjrwS6STdeXrPlPBWJcNqQYOBiwKxWV4QMgSOS30dYD9kc/ArkcVP6zt5QSFumnD/sRHTCs
EA2VH50ikVHRpXggZSZLN3tBJQpzCy7XutTo9BUZltF6XZOE+mQdPDIlNzafwaqkB8BdmYI/znNs
03WgW+Jy4MN0z0X+E8XaZqqXV6jk31tpJDXXkAVI52fAmZ61/7n9sryu7fqlEPp0HJCGBfrkRwLw
kDdJfXgjAAtReNLeyZxS3Y0jMq+y66u7SZ3FOWzXbr0t0aNF703CZz+46S59WPu78luNuM2xH1dd
nbK+8oT1uPz366O1bZqujokDOiTN139CZf5kUn6VKOPLilWMhVZz+VvPgehtdUEnQT7IuKziwtKI
7VEOW9RaXdntRxeNj/jOszm2LmOv2xLtrOvKJ911/8sqXzzo6304XZ20fnCwVrii8WXXZ+jGS3hY
zveq2GCtkBzpvCPDZ+i1FDarvLrZ02V+BODdxlldrCxrxX3wzX4k6PHgOGc5ujYBrZhDTdnRL8tW
w8JjzYud977kHn97PhEkJ2XJtBkhoByWEyr1aBGeldFm5nzNjsHL6ZIvSiQYIxHnhJLfwWYx8sQW
lqUJpJPnXSl55Mv0tNREFdz4S9LOZnhl/tXBZv/FllQ64e4XT0xWDmYFypn0Yn09Lq+ZwxWEkJfX
DBpvNuKBG9bgSY5LvRwWmTMN58MBy+re8JuGS6Jubrnn0drPbMhsnTTnuzQjf/Vq7t5HMlRIGRde
MuvESwfNd90ycO8pZOcx8s6/NmQBM868/aqsReKR0wFeElMdI+RIXS6i++uKSE/WZv78hJPZAM6o
xa+4t6BPEjHh5Yn5QA5fqdafaHR45tySxTjG8LoxVlQjeaqUSbaUpbE6yCMuhllXyLnT1xgzQosw
KyrDPORWB0+TP09Q7nz1qGzXyUKeT+27P9yDhNQxnE1yb+W5SVEc5WHtypaLOmhtVX3gOrAG0JNA
A8rGmQ8YdJjyu+BiqeYHgmzXfnNBcp692Vhp+PTiv8e0Fl/R2MK4epVHaNlQdeBfF7YI7X9y9753
KmO1EHQQrH+0HcS6wN1328O1JwIyAIke0OJFLuB80b3wHmwh/Fuevfd+l4iXH94x5bemAp5j0f1w
4kWQUv3HQkOY4VlgWRD1Ee/iqRoCKA0HTgeSCkQ64jQGXbZ4ZsnB4XFgsdlBXomyC/HRS+cYfzLY
bqF4Z/FeUI+d/+bHbtQLhG5YH7wX0geuBzjJWd4kW++YK97XnFA5X4TH+i29fbf4bJn4Ooesn2KS
CQ6Vym2FHvawLRjrBZmx6b01UXBrEjVRDfCf1yQEKUgtyB64IeoDRsNfw4J1IDzxxrSI1Yh2H597
K7fOt9Z6auIM8B4Qt8j8yCg0g4vt+VEEEC/gfWEE0N+QPxMRMvSqblnaY0n+wNhhHYwTuWg/3Foy
zX7GrgeL72w3hvzLbI4hTfCQprVtm/Jtm9MtGxNIU2usbUi3DlVVYLVONR9StyZMdysiof+OXSL/
TgikPiZU80XjsfKBTrPn9exHgQA1a5xqbXKiyLE+4ivMkT7Maz15p96c96fKIuH7/OnXxKLqyOX8
htTcQnwtwr+FcFpSDQDFz4nFuRbcP14/aI3+3W72KpiCZqLw+KCSdAdHM7bJuZN6SP0FofCj/DUD
3IwX6e2jHtHnotNN5e1X/2XBfdLyY/yQZUtuFdS0sYM4ivfTTeIFjuFU+WHdbDW8UbRy2WFaq6DS
p8lwU2QMS8M9IpGsz5fJMtDg0lnxHe1R3DHEMXgd6Y30gRmyseXZc+9/CVvvu9AC66XxGPxCug4v
8NEH54XwwQVC1mP3J8Y/xm8Tzi1AnvarI+aLuD36gzcEcQs9aWmEDiK+dT26tjc1+rwnDekOYPnT
/fGezi6++7esL+obwjr6Gy7xR1xRbmGk1KuSh9oWrWMcOyXmUCsHJnXmI7DC5FH0/+i6G96HaB3V
B/GF+YEf4gBBgtCMcrbJ9+b4vcMJwAr8s5hvxOsobx+9SF/MICm/f88E9SAvWldcteWqPA7ZMwEF
gDDA2quubR4d9T/qu29R7yHNvDHV7VVXgm/nnTbJ1F8ZUz7Cm+DACBVUfGQOzaOl5QmYW9w0F4Ox
ENUMlHAe/fapDgdn9Ft74C9tY5u0XIIUBS1Cqbnp+DWEjEKLzojW1mbOx7uhIopNdzBvHNmu0QFr
d7ePb0fHmhv34avAoZfA/SptF2llxZtYYrltHyeUJEf3Aoqsc/yIbg/Q6ngzi1ly7yDldPdhf1Dw
LgbluL9wX1y92DL28Lcs3ZJB36r57G69wg6nPMAIpKrXJeniC3xlb8I3cremkH83SL/s4n72F19Y
MTe6zflOmUIcnH9xwodc1bnRGIEvdKQBVk3pEDwAxFh2BaHYf+027H0h7y2FkpOOx3iAdTuLgLd1
6s2eAPkku/BqFDQkavdmbC8tE2pVU6X/B5id8aa3SZFaK5x1LW3Q/TcNd6QvKjCU+h9w0bz4irDz
XoL1hrQZ+Yb/rnYjrpqgApD8n4JcMpfmjnFYhCQzNbf6jla8laRtEpfqjko8g+Q/p2RXxEl7yX9A
GXfZAa1WnnlYHhU9dalGnmF8uCQ9NQNJO0dJ0T4dT+vo6nNs430XUN3e/mXi91TLQlGencevTSYc
bzvoSb5eluRm+ZhnxO8iFzaDLBkNGqzFkcD/SlvmWBdHj/8xjyb5qbvjFQH+tXIzt6MVEg/XkOyN
XDM3DXmiW+uY7POZen6PJvGpq7WGV0v7QAGSxWJub54KeSeoHYI4qDtI2h+FenEGtjIfycqsbzWt
xpW6Iut/QjuX8/E8bwxj9M7mPHlvdHKyT+ec+BdbAgHMBt7SGpuYi42Bese1TVQVNnO3UjG3TLlv
z/O+OU+Xyu/eJ93qr/dl7yQnviG31TNPSyVvnvNeOembuQeeFX5Ip/p9Tyk1b1RcAHZCZvVO4tsm
3VWvuWcvqyX1fAHlV5ic90SyMa82hYmp0Op7HfWh9kojE3ROnrYlxQyZk8cZgF4jVzOodd+NJVUD
cYnnHv/Qleey4u9oHAoJ91RcQPSZ2976KHO5DncEg/pT+tTUrXvx1Bjgik69baM4pnUWo+qmjIFE
l1tAfYXJtvLFbORpyZyFiyhlq70FO2XbUcePwcHK3roGVLCp7vEqpP4u+niBY0Ymqm3/q4Mk4K5V
O6D+DIeochPJc/B1hyBGk7dc0N1ueJLxYlzOTKa+fr26o473PX7L+XTZ+rmqGv5wsFtvJSBL/U2Q
tWZyYojqgZl50KSFWH1Lal2rSuD+IZ1kbYnfh+JBb388kB1rUoaLffv/SjK3x9kzufvTzFQmrZ1N
89mJslaOxsXMOHjqZ9Ki/iXtDqTpp3LVd4g/EoK6cqtHCVmqz7CHSgEab8+GVo8pUJwXkjeBksaA
8v/DKpneZa+MkS+PM1uxBYrryFg8GypfLqvyKxOiBxQfvkQPsT58jx4Utyc23QJm/sFywJQbonug
lRu04CIh6wdBkbwwzbaUubByhszscQUipratvUj1e7i58PQHUiBj5vazsMAv6LsYfOEgCANftBqf
XxAQU94AA9cIKXuoGvo5e9AJSMqyJco4WGee+C0gYTUfLFn9G15vUKri6s1K0XHW0nnLpaKX6A7L
aibM5cm1afTVo8HgatTc+Yq+I3jhqOdUI4CzZtFyOsxF0XGUdGYrUaTBZRScGuxdw3IX0aS2Efac
30tPqMJPvF+GK5avKr9Dx9hnyHj7hhxTbVh4qKtYZxmwe65dJjWzeHIvGrBwCfLj+oQonr8QsqVA
HIy+Zc8AQnQIbHWhjHZcD/knBkDvjim5+tXMCyjDjLks46oWFshYRginTDFAS0aU5GTmz8Z06EYt
4t2AnoRIAMDTiPCut2sZfa5WEO3Pg9WAPsUbIXSJOFLYnhatH9G+JdV0mZM4Jkbr8Z9wgp8pJ/vM
oKj3z0WgCK87G5BuJHdqRLmOEWlVb2PLZK2bx7sDSPD4oTgPnC6qxzIUeu8qom1FIxrQ6Fi5wSC1
OJrvekmr7hlL2OahJNM4wEqgrBBkOf8XV1kxBOGMtJDm3I+/Fg9zmWiuBv1u0Ce1qg9MhirP8wVx
+zexv7ADvsCffmjv1btlsKYTZXRfiP2P6N4QB0YB/93vsKBduMzQBHs2uV5xB3q5/uMHfIFo+a0E
2ql6+W0ZL8KcXs0HRoGQeqi7F8zh3xdf4mtRL6RD0RVJ/SF1iNuDZyZLd/UO2Xes+u/yzEtbWjoh
p1Cj9T9EUKz1wAyo8sMi67HZzENBzi5eC4qbEcxFbyftu5023x9E6HfS3nzg5+6+XfNBLI1QGig2
bq8ll8V/zZvLiSvXDn8cIA4DlFAtH7baCBUcelUkAcYeyfjmrvxkqvykdNrjQ/1+vOj3KvM+J3se
lSDbMUINNsayqwvjXBnIsN6R5YBSZwD/s/yYZg68qgeiTe3Cd4QWagT7Do5pRHO8EPkEbO64PfCv
QpHVtlQrUAlp3Ax1p7lMYn6fJIrUrCV2sqI+/9Y/wztTc/H8oeMSQudcfHgP9NFPrGoTTNUahJ1j
1L8tmdpTug2cGtChOqBnVU+bVZ0SWyk7JAfTQ9MdH8tSiN9ZwJ4rh2Nf/xHUwuqlMov0u04AoI6L
eoBet1/j0QCPM3yUKtH6GmcH/SakLB68hh+VkfhY1jx4oK2rutoqnH3I1wyqqgNV0fdwppTl7Yp/
D//CqxC/ppFYCWYirLIduFiGfRbbXXg24LkDwQD1vzc+vXL9kwb27X3oO5+Iw3Y7OPt3oVy9e/wE
xaKPJ3MBQ+kaNdqyxAms8KolYqiWrDguJeKwrsIUriDSZSzPrxgylSv/e1JFvzp8GNCkmCR0WAyt
P/iPxPrgVHQgzLUqwodAdvdCQX3okD0VekXt0HUANyXfN8JVyJe270A/CX3R8WKVWvIaca/Pg6bb
hZ5/y/Fec8czQjvo49wgfB5NJ/ud/awXYOWQtWvnIMhvp3RodQEF5lhtxOjvwPAde8gbxE3hGYXd
/wKd219UmXdwhNY1JviXNgKoOVGtij3W+5894aOK3LsWy1TaY+7/meyM/bkzscKbaN36BpZnqbbz
/m8T/bt2t83umWdOFR8husva8N7E5cO86qEppnc2HBmm9zLVx7OjZfE8lTO4TOJCoxzIQ+tR5fLK
zOgynr3t/L5Uxhmtkit2aSl7fpKy2a7plG+4tj2Dbf95C+y1A41P8H/K8Bb0+90U4Af0na98keIQ
WtL+agiXVr7Ka0ieyhc8CzqOueZtx5fiMEFsX3xewCrl23fXIpB2HlOtdj7TwaKQ6aJQtA737WWe
rPI7qf7ge29zHpPy4Q6mF3rKttQ6cZAjyj7uKFOiNm2zgm3u+q/W/19CzcX1THIbyxZxZgTLjjQX
un500zD/3vbIjBiaTbiqV+QqfbcoMe091ZUe5rPWPG77h81BJkVEVJ7RTbG9LpEL6X8D+Os9Wqvb
cKfwBYnjZaqHyzxHI7xg3+2D5Dx1FZqDS2i5sA7JzskX9ZAWnoEFjMxeP1O0HxFMg36m0Kjyv3nI
9OHXNnGfw42/+7zxGu3YZD5wOI0PNKcZUftQrBe0hZeV07YJzaCG2yo4B+QRYW+Qm6Vzz42nmU7+
cCpKY5/ItDiQYf/vSNj4BT3k8Ah03yX8hJA/K/2O/RiQaYE2WfALCycdWBuNLPuigfes8133rt5Y
MEKb7O78tjbschokX1EOkvvX68Viu7PAo1e5+y/IH2K0HM/7P0EMC5BeMiMSRW35QzE/jFB23vy/
J9WXsEb8V5AVatSiHX2QINCn2HVnA2sHp4xCrHp9fnhkC0zNFUVw6DqbFwg9dgtqMb4f7r93vOSk
vF9fXcb7pry0721SvTM/uoXlSxPr7hxhiqdwtQ3MUEUzOzgfJ3EnvlVf21JyUd+ZqPLMVWQYTU4A
drsCpCGdJe1XY4P6Zht87Lur5iYbMXkqG4L/vqjQlnZBLTCcOzQtSKZGWSsaZhyLaVEu/zfKvJgW
4XJgmNX6n2iLNlNR3uR4hsrjbTmxZwnI8wYYQ3qZq02ycUK/4eQyn+/meWMbAz6faec3RB8kDefH
9qS9UzjLXRauDfnvCCxTFWkzppZ2efZr7ezlmTMHv4MjtbzfxHNinPIHojA5paK912rJHM6OeUzK
ZGKm6ZRNPAN52vL5nrlVdhQkkyvrrJNMyhm1TVbox9Q0m0brVP8XpN4wNovtCS1wRdQEUhHUrPIz
8zwMN0mNKrXb8N6HNGKqBFhjx0SZg7E9bnDl/obWf0CSakSFlvHCt3JczcbhMlE1pjrLuP8FSSBb
83hX2bhWD1ea5u15+arL0ECBZhPt0XW4UVjPc8zCLoePIQft0Xm4WFiA5Or4U5mhOrRFE/6dfHTI
1vmOZDEEfn9zubOd3dVIBZn6cap2S0I8crDqTk96/9WlNsN/dXlisiklZgPrjLR96vlenPf0XxcQ
GTgG1uEL2tDXlg94O9+8iP515O/wtsBtDt7b0zH377d83AQltSDvlD/DDKjQFLWRifEyPJ5hW9Bz
sNAPU5G0846CLnDez5ZxDlbvHZLcqpNNUKqiFkFV/bcPrLafwXjtdE82Z3KgV8aTqFfi7h7dFhYt
pu4FF9Z6xuiRVH96lXyExtRwnvl8mPZcjHYj9LOwztie/6gf+53PyHAsNAoM4oJFCXH/TQbblPNv
XYr/N1rcAiiubl3XTUiABA3ukEBwd4fg7u7uwd2DBadDcA/u7pDGnUYad2gaC66Nw03+VXuvf917
9t1r1zmn6umvn/HOWd3VMsf4xoS4+aGQDVKfymQG/UsT5BwkwNQnccPFNEAM6vd0etsRfQJR1f86
6gzfAaB3xkk/e6Ufi/vAoksir8mrV8Lzqf/zYbZ1im4b610CHwHyOFR0KOxUMGnGvn9Yz/k8bkiN
NybJ02Y96lwz9ScOlWPYsJ7JbxW4EtsPn0EvJVMVLgiQfvx29+HfCHqfG4OFmeP+NrMPwFc5f2Dq
aXZm3TFm+nNZG/xeQTbZ9NGWlLkLHKRXv7V9cBfb/zqDWkqEwDlzpAWhxMmONsj/6oiCOUNaAHvf
GN1tweFQ7Nwuq8RblzBHq1tsKjxTesHjHMteHdtU/nBEF9g+sn5Mp+Gn3RvO6UfTt5ORKhzdtP+l
ks+4HG2hLGWNjYjPa2Ys34G0EgIm/FtpvCjJkjoSsN1V4Qcsec+M53v82xFNfz42QFVA9uw/5Ne3
Iz7zdrTFKrGmg/9OL7xQAfOn/6/SkjG4KnC848wNaPdeGYM6kHpe/PfRsTEaoisxyJlly5MIT2zc
fkc/yFViHIdXa0t/8dn/5pnt2mVltN/hYo0ks4Pd52tILzHxzgYLYjhvS1ZI/r75Kzx2fZAT62A/
MZ6rPsj5f0voXEqHCslTov7/ZMSZdrCQOMXlb+JE21uIksL274v8KQZTUot6mRs0VoQCL0off7uH
BlGWmCbQkbDwmMZdqpRfdlVlP061WXwV011uhlHlfyhZKvsxqlaJfPkzBIXjNO6SpeyExBZsMRko
0KJTroPbmQX7uhagqnDe9QPpyu7Ffb4zCXcVdMB9pSWOaN4ZyuegPxh70OKsC5j2yZyDNpAWX/FU
DtoIKh78OxGpvvzBS130CB7qzfMH2YPgBibpg2A3iedOj66ssgerIsjEGfIKPP+N9m1K7HPrEuIN
axfgZQDKqdkXslcP+BuDL4QR/r2IJjXfOC6YF2nnPyS5/UMl0VTbf1+e0Ve/bSpHidGiFfIk/rtS
OkJoVEO/ipl5eXzZttxXm1LgHwd7DqQagW95hwdZbsF37XLl3dlKTTBTjOP9m+yPNDr9mcxKuP+E
9YP2yeDno7TMOPSxZZfiFNDM1PMcBex4DLbAXQbNmDmwz153qHYrdly/fu2LYFSgn+1yO1LlR1rl
PBNL6sh67Rh24u9T/5MPL8vd3MKzveviPg8DCVByHLzP9M+iLKR0K7B9kTih9j+T6juksuof/1q6
0jDGY5wsQ9kpMgkgoDdWkjzsPf9GRLeuOUDTuLN6wtj/3vDWEJrBkeIBvzvNJbP88RnpgV5bzvPG
jZ16fy8j17GI7fl4a2qVagSOv/D+0PgEUOc2NskpNo9iwO42Js9YjVpLIzP/0SDBTWGK838kpUVI
tmU//rV8ukZZZXebmBQU+6cwrNa7TUwJyv37osnBdCAkDhVG9B1ILt2CWVsc4ri3krexwXQvvT5z
+PA3UbRxNrH7sK+9Qx0ARH7dHJRU6leKQFh79BwxQi0afP5gnXlzPRKyYrs9wM53iDPb2UMK01Cs
6LPjs+e0mvNas2G+w6VuF6SKfwuLs6g05c/UcnnCH1hljLiDzpYENYJXp8+gP4VfDUL7rH0fGqzt
/NUSyztZ9kue0UDhd3KCqvnZhFc7Io8AgfFotqv5Dd2VDeAy0BNxp/c66679pyf38ZX+1YzwHmGl
SmlA/IFw9G5e7t3uWfC14eWdBcCl7OR8LUMbEGvo2EMmsB7zchBV6vEqHz/6jghTpcjEUb43iOdN
uHegwwzYCbi7advCO8K1goHKydD16LUSt32BVeYAATOVORTYMmv4lt7hlTkU2aaXEZXyic7Gqq9K
jwlwus6AVNikhokpXdWJ803joyTocGm1f2zgIjkUbEgiOeT+LkW0qUW/g6JnyW5G7MNCY2Z4338k
Drl/eUu8D/w+TolWgWG8C3wUDq1mgXa8qoQsDq3GD/U4VV7ZbZqk/L8LEXXikmip4Z8TCtTjVVs3
NhY2rRU/61xyFGqWdgcWT7KrD/fd5dHPLLrXfm5QtpiIDAO7JAnqZV0NQMFFXhqXn34K3dkUTmGB
a89ehbSeoYtzl98p9QsT+0fbVpc8uM7o6z1AwdAz9jxkqoD4/awbrWFXqGve+q/gph9rqwl+sm33
RMdNsXhZx1x7+7xaxO6NBeU4V5M2PnsxxtzOKZmNazr8WRrHgO9eVjy+0+KIln2cDFWv9D/8QqLV
2kMjpEurqnH1YfQZJxjkN4u+t/eYQyA4ctnBtSLhcZ6jsrpCPFFTgbfa1pgqkSXUkBAro1GX0Lle
y42qK6Mpp6srIy8nr6MjV8fItX2jISbCia0uJkIZUxaqksRShimKw1IGJ6nxKdlMJw6nhdN2wCq4
t2/q/brmfVv/8X21qRdBeb6w1hPqiTyOk3ui52PiQbG+sEZg5zy6lPe8DHxCVqPaFh5vfvthRWst
j0/W7uPaEczBSt5d4/KAnRmzgV9432P12Liofdzz0t2Hdjtmd8U/u33CdQef0kPZNJz+c0zl2erP
af+1POnmwY9cEnL6zmlIumSjpV9LpcW1BitLne1sV9IJhTnaPgTgC3VBKX4KYQ4uGGV1XSt5BUhi
R+18BmdW7qrOrMqsZvkwSUCyrlLgI+9GTYolw7yvhM/9DDlyMC9oWY3WC0uAIUv8JcD8J8Wc9W1g
u3P1/DUkYFdwTxfd94FzO1tEz03ssZx0vUvXLQ/RMX/e6pG02ZilLfdDhKFNKiajTYkoJxrszgkU
6+Fi3LEm5+wq1StI3Ip3DUnxotE1lXCoVt98XzzB5r7G+heQuzS+BxKSpzi0QCnuTiziLgD5kWuD
Elhou+Lr9ThVK962YaKvyhqtd/GWwTgn5fxMu+t2ZxqtKWMU+9UaAatNGb9hIVxAz+P2SmfQPXdf
QC94Pc+guYNQPrqyz85yiNC9be1++7Z2uGwBuny9fPOKKx/PHzxWGwAIWSh7avJ+oJgaej1fnoxn
Gnju94Z3Hh+WKtXt35y/d/tGMr98rACVymOpT/FgjXd7EXt5Gxg4aJTXbHriFeN29bFPOVsvQWMZ
e6I8z0pjK+msTXbeqPwAcTMWvHr2536tODmfWOO4ZmW9xsFnu/3ps1/g/LNHf48XaChPrAE1g2JO
1m5VskJalEZYwisH6JsR1kVR2QTCIxf5zvKXOPVnsmoWjPO4rvas87jlsAvQ8PZZArErm2KkYUzg
DLSUh9E2Nuf4zOzGi8NICxQXOHXBnnfgNiCx8wv3ouGBuT4QP4fkp/CTOyhyLimQojoHq7I6J3o0
eNVt2IFvC4GkLoOuVTZJv1C2qqxzbVd4QMkZ2aH/qLvhjp+FzJMvIOj6uBtouB5+b7D7spoMdiPt
5vlo5kVcCZ6+UhIH6PbrHuD5Al8rQefB8gac0yNzZXB45V39MHglvVXdgxRJ5jnmXrk430Vfe3Dr
1fPOreOp3knnvkCjRueSu9H1GuFPCLBxTzzFDhh5tbBxExu3GkqaA4wV9gpk9zFoZl764WqlK6jn
fvJ51dfhUfOktNuHUzsnmK9i4j2R+3x5r4+7dk4IYQWzMX/UOanI8IWwlOPsSV/LbmBQermWa1FP
Eup+lcgqZ19+MyGVb+Ym8Pd+bOBAd9qMbsZYzH9mdfLLqoBj3/Ha+itfU+YT6rwGHCH7MCXuQ6jP
PZ+lsPzgE8+LE9fDICHhN4jtgx/W2E0U8umJfm//Dk7LCR3QijhP24LmUX86tKA2Q+OsnXsNwPl8
gbUynNMF6TaqYxzwuBma7ESkTlnh+rsY834rV3rAADjkM3M3MQtq51ras7zSSRNqsCP5w8DHm5C4
TgmrQCMrZnCj0sGSx4F9idmzxKDDdBKRO7S87ZTXoMVwPquynmlGBnCQuuwGiuazjGZqVUipAMN3
ajyiyz/ETsuVPReOBBb7SzQw3RR5Nyp/RK7ULjeb0M1PkbADVQ6OVQ5KaGRnP9v6VLEIamm34ipU
QI7mumKsm3WAS5WGRzvz5PHVHMWq5CcM1cZ5ihncy6AMe/IT9mpfCUO2et+xw7VInGOZeuN4nRrp
RH5xb5vbao4Kw/KD52HS656SVaQ5B3g9e3i7QE/A5OHVLBiK5RsWduea+6RvDa9ncOIr9ajkROQA
0Ezdp5e/wkkC9hoIdRJd+/iTHXvGIhpcmwDsweTundJZzKrTtAcy1VcFWqtFFbRAW07OWh9G1ZTo
mW3yxlRVu+WZJa7GJgX7whlNWQN7Na1luvJlE4/vz609jeWlYZots5pxOPtm8XfSpQD7bg3NyD/s
QzxtIW9l8SrQymd6UuQvUIu8vaOq/yy182ruwHSv7q3j4s8pMsCgOoPEI1Wi/pHQbFygBWHnbwol
LUvis4o+A2iX2WuNDth0luXnuBIaFcYq2BXWOSS0MjId0yLK5fs01JmVgZ+Ogt+2jLzWt4CrYnup
lfalnEaP5Uozzadcvk2DaslWrWIQ+4C1XzPD1L5IO+Nt09Jr3+nfNPhMN+yzZvnIF5NOlw662bJn
LckXc03/UlArHVTfZ01aki/kmi4Z5NC1JwT2ZzElWIQM1wXJGRDvsxncKaQEYBWsNywY6yZS9yIk
mIQM1wSpHfA2ZqsdKIQFYBm/Kp5ztQWOr3eVMmV1yg5WT52Vuz3QkfxD7duACs3XezDS1bX85WU3
X4ADs+etj0GHSIrj5DaR2y3Cegi7x8C24NVbsJdTHhOyu3pCnO6PfNy9kvmblTK7gZu2b9XIt23K
zQW36bsHmNlMkF+YJBj7wd/wKn9az77cznIpj0LXuIXT6PiUxLwhUU6HruHtXfzz90B5zOxSV7SY
ssw7RlPOOqlYw1ADAKav/j64V/9NCPnX7+I9K1CUPmjd8E3y91D86muZZ9AIScKFKG9VhINqLb/5
aYVWvuk6hmAFFzf8tIXmaZmU5SPbQYqOrGZ1xiubNCBT/byE1pMHrG3PEM9AxK06uux9XnDEncQM
c14AGFtc7Z1Cp/WdxEUbDVLeHjqaWzF45Pr79/ZYkxWmM2bYsIjFtapbM+qxpmGl5GqlPjvRiv3M
6kj5FA2j5Kp7Im7+scD+uODxCnRcsAHf/VrFk8z9mtTzxPka9Vho/1iwg+JSAn3EL6tivtUVTKJm
uVgtvxJLdSzJfvQBy1NBebtkqu+6eLPPiIEEK4eAmJA4d3S6TeAoIkDq8/1Bs50UbLTgY4KigeFc
pRpVVt3ezEsbkm/JCsXyfBaq32VkcClJvs39if4qT8zrftfOoPuf1/OOXeE+AdozpenT247tZbyV
6dN/FRzH5/d1wlo/szZnpbe5k7LwuWXKRgJjzbXcvxvMysD2M7a+RX/1T2Y/CB8bN6l3zVhsHTtk
mBgwcXVeIF7ZsfVPavMudyn0kug2dWqxY7gYHl0hcancjlt4qmKCveMgyBt8J/h1xey2r7P2M+T8
nf/XPba+7Q9LKM6e0iij/TXyKKN9NTHTYs8SCY9AoReBs1vGg2Q7VxBSMpcHiqR1eZfuj4t4If59
3By14/a40zsuu1E2ypeB2PM/WhD6WWniRFhR2q6/+aK3et52ZKx61t87eHSOHTcvAhFWi/0AY90m
VU8FhymjP48E7T7dtj+5eI5oWT7NjHTOtNrlTXFpeTRppQKw6lUG7I/vCtqFflUpPTW71gogonvo
eyOQHtcKTJC6HK6P1+uCH6Lf3NF1cqlrPDF5VPFXu+66YwVSN9ClfjhWiNPvblRc11XdNFIoXFex
4U0aqRWuzhuVZdx299b6VjynasuYNGGr5Q+aTXatnR6v+4nJXLihqphc7ldKp1R+ziHFv92s21i8
3SITl7HVElme5RFBy9+XuGrsHWao+Gs70bBqf1r/eMuFejZFzb91RUstoHRFa9QXK4Wft0ZgIWff
QP3ku2s4CtL5E7BkdMQzkod58+fe+cxxnkcKzQU5SK01esRA/TjPBS+pvWRFAsLkOaLWEt1mMHOU
54Dn3n45H7eH16CjBKhAqiffKzarXKSWDETbhMna0XdWZeFfwSP6Nuafl2/nWq6Y8DAR1sYBtAel
iFXqvqIvquBQBVgQ16Gh64RLVfRSYHWyoWkEWHxmv366SBnAsDuJaPTcEuzkiNP2lDqMkqxsF/OQ
zJ/rxjjYiGh0/FjSOI2PNRzigds/wtxCLU7gyfgs0aNG7Fd2Xm4fC5RmzX53wZq0jtisGVDNA17c
RcxhfV4jk/eIrUyyIyY6ons+ptN74g2YrNUr+fYNHAnWlgCs+ySjw2AVN9ydHDvQ+iO/TlL7eGfD
gdvrB7bUZ7IAAlDnNZGf0zf+pEBU0qIDrjaH+wyjUPZjNvlpE098j3DI9YML/yFTLwdJ0S+udLTn
serm3x5wPb9sOIjiJWiN2bGLt2j8vaJ3o8ZLrP+M+hAiefQX/ZffUw3zZlL99buFqjb24kcc/XNO
bwmSOs/1JG8tdk5Fdpxu19WKj/qRYKbwzkDzCY2aXboFV5zDViSYNrxvRbCXYV0n3YJebNQvyvvM
YH/FbqFiY4DamzKJi2D+8CQj/FG0bMj4rtTR8Rwp8f40o9sBFtSS1cHD/BbvShjMLNfJ8Fh3SfRj
XfvWk44QBnaK+WrGAZpikesVIowD1yhVZNgsSPUyoNb/DmsAX/3/HKPfGeMgxjqxJLS0SS004UqV
bAwou1KrzFEFJu7jXFs6O+apC0v40E7JxRraXqrmpxACZ/YKJZkpfWjBSmGGdJequSlIwG43b8ut
1HizoryB2iq/TBxvhLhB2rttXtd9b4YrP4KlvJjH4wh9vu1zsr6st37YEkvP5e22bb587AShTq85
SyAzEpR150h1+1X0VV6QxjdRLZtBxIYvMXjVlT9xEIt+CkFC2iM0dDMAU74REdESSKeAg7JGvTXn
CZ58A3lT9LR+LK6lpTNvIPzMfXFbZNVWXl5WXp69e41cAHVmJL3zQJ+HOJOQztcm2S2McHrphwxy
ekFOnBCel3n0QNiPEa+5exScUgIMUeYT+oEscJI9NCWTF32WC3C+NK7KSpjhPxDQeud9voM1UwiO
NsR53gbAH0HMeeAVw9C+IRaLSN1wZqJlbQRuoOyhGGzI7yF1BtVvfOZBDEDuDHGFXDuRuoVcQNCd
XrqFI0PIW/CZgp7IB7WrtAgc95IGMmrgNHv0Tj29EDW720+zDUuz5xJmP6e+IjtdDJntaizTnfRR
LQjKJrMp2ZWoc9MpYOUIKppEqTNJyCYuzQMpLlRS6x1tuOGX7OqFGLOsIIhdXswpG69UyrSBdPO1
dGfbQA6VWkv2PxgbQgR4UMdDDX2yV4nu9mRgKKnIGTcP8ImvrkFrRTnNzb1McUfbro3ZW6ltoPhP
AZ7kxi/vZkU6+bYcwx+OzD+hbH57+/Z9Mf+WW3jmMUcw+6VsMbv+4H3GwtogjLdpolfIALewypoC
qKpPT8gGJRTB5fhKNYm99EnPGpG6R2aShCk0esO05TVTGKkTgT6aVvfspBKz8Q7TXwgxnJ+9ETOm
WUHtNW4xHPr8T0pI57LT3wBelIvidH1MRVEzphNAmP6Ck48EsRnPQHW9FD2+Cx6SPJLQNojH9kPL
WDAa5kLVIF5/27543QhjQJ6c1cTWt0ZYnETSfQU1ZkUDxYVpSjUV1x/1NBHpI/tv8O0hv7qCsxz/
T3pBmeGMVfObPmkiyFnLwbUYapPqahDWVITp3HeTeuSTehO9ORB4L7y1kGvIq1Njzoqgxhq0kQ0x
bXSZksnoiLf/wAJuggIGd23I4gm/Fs6jIptJQ6mYiEktG4lVaFvOpLZszH/4ha6LvZT5JUnZZC6S
f2mJmkpxniJOphaybkrdGu5iH1xGo2P9nP1c2xhfs84uDMeJ8jJP3nEvX+7opd94+AcnbpQQjNN3
Ma/mMsbwF2Pi/xSMg9KZgK9H+k3MdQZwMSFjPAt/Ss0cbu0/GdG2s+CaN3dVqGhVnVshzzgzXk0i
pEYOI4z8As/F8w4ej+09gvObbN5VnQY8gx85TKZxeKyD0alQCdDZ4t/ZJAV/8xZK/hswKwE5OqXE
T2FMW3G4LlLIrfn9K2CLv7P5hSeqXbfLgHGjCtdJC7mlHP65M4B5TUDDPINE3LeeYrl+w8/A/EkE
L301N9zaEjbPnNq8jwh6yaIs/MWSiMH34Gyvqfucr+mWJ+3D1i9O8g/zUQw6CAfDdUTicRWThS7s
Oc0RTXVsfmViVSvjHuHSJX7x+V+7lFuIvnYLshAfh2GwYEp2753y6ppF4v0h8Ni1IfUIHgSDs/R9
WVtE85D18LXtGz47V50Yx8cObAyjqAhmMwpO8sHvXSt1hKIUQ2EePhXu5MtoTunWSvIEdu6bj58M
xB9oyAOwMYSjIsgk+gDkm4OffxPdao6KuDPV3HlgVDQaeOp7332yaVSRUjuFpGMTVtEQ7JjTezXG
3hJs5ThmHLh60XyurQAPYW/hUnlCpkHcIaYvTk1SA43oDIzoWJ5gSy0a9TCNnGzzXABw1N8JFB/g
3ZM8nggdHPB32pE9kAKX1fDa9FP4VYU34hDmYkfbnHW4mQ4GLFZbKoiuVWi+yLAQtBh6/rlqjPmw
e1BS3wJ6sZRf12/IeCHhk3lygYKsNnRS6evYj3HG2CS7pPHh8yFCLWSkX1hZcElDw42JY8LfnrLI
h0pt/OO1inrMWFCLxD6AvqSdtljj8suYW0lK1MvjsYmzz2zaaopI3GAnzEISlFxA7ZGWb/N0gq2T
36dT9nSmvgvbcAyx/GsWQVVpjn2PTCiGZY1k/wI+Fk4694UqzRfseOaUoZRoTOn811M0QRyy72P/
F6rClkOTppQIwmveaLjrrWR5gdDzHh+lGf5Zi+T4Cz+EyX8CIDkDaSMCN/yNGcr0NnG1FOt9TAWD
vFI5DvfIIqa/wq1V2XMHSu/m7z/1ZNYqP55ofvekH25P+s94KENua4zy+W7LKOfhICHQ/7xa6elq
uFPodp76X8KGbNG/IJ9qk/0cZl9D4vEJ5zCU2QTvEIEMtpcSeRj9L+ybRfyNyUsZDn9MhRzxaWrw
/32NlZNoAr9iChmFIHmJ+pqTA+S34iMF2OKlqM6HxEnThiiwvP8nITqzSnAKTb9c4ial7BlmoVek
6k/xt4Z5r/+Ku+US8U+Q529eCGgz6tdpBzMky+DKpd6QsOn09E1/G8NNGLuLH7sLW6xormK7FwkU
hLbrjBFjC60WEqUdabLpcbPpnSYW4G0b3PG2hjI0yfdtE/lk6lcakY9SDrkw6TApJLtuSxooFtFX
BXqoKN5kjh4drn8gN299rcMkkiz3bRvzf600vzhk+WK/K+YXTP9X2pCe68+JRRpO/eONZXfCKbZA
ZXs87x8g7bKnBpQ3VZh1JXK47sN5TDozlNFt5iopDPvfJQz+GUpY3e3Jk2X9ymf3dysCjF+C04T4
pqX+HlbDftFpoN5DXhCHiim/Cg/iFLEkFfvDODW7r/kO7U3nxyfmyGe5zefv/1A5aQimaksoB9MH
CYQT3MUK/0xRpOJv5Am7CcMXFJe0ojlDe6tDe2/1xehUR60q/eW+vKSSjn8/Te2ETUssgSQV36NS
MPTwli0Qziq+R6egwozGl2GrrhonR+9VLW5KvCiBmxjBxwo13rWgIxtyvPl40Q9uYh8+OpHSZkoh
7cb3eBf8Q7e/AVyGpHi38onPGTdLJIgbI/LnDL6hi10KlkT6dmhg9Sk/fMakhOR+FDighegyR30+
oPQKu66u9Y8+IjQIHjllOKbs4LaBV9oS0PSlQUPvh+TyCPx0emvY8ppZPwqPSSLI6wai+uAUuSrR
4rWJ6RcEYD49gxfq6BrEU89TxYUi+/2OdNOCddNMjfLLD+1yAaQhwqdHQT+tFBZDIFwtJMc/xvmD
Dnr41TdJ/H6GADxPVXiYkAb7xW683qwHpJ5j9VIT3ZWQ4glDoNR+D6GAnFMVETNlESY6GjwjSH7o
wI9Q/Z9hgObTM1yhtZ5BvRsvZLIwDvj/oH9NflXvB2bEFVct6ewlW9kvC/Vp09/MTOHPTGHPTP0l
36PnlTavErwePxoKR/57WsKEPrud2yagnhK+f65sQFo2Kubu/V+HvN6Xvzh4xFJ4siB8+x1BE48b
ki2R/tz1QPjfM6JThmL+pAB2erjoReY9jxXmfU7+4UXbzC37idEXfz4CHHIi+F2J1iZrCgNMewb9
axeDnU3k1fIfxcfhdQe7hr33Jm0jQMTjMMfEtcefge8GIl9HMQdtyv24waTp+D+iZ4ElN5jran6x
EkFCE3sUPgT+EB9W0E1Cy1qLiL7tJdYj6KLfcexpU967sEMWNiNoHskUP+omrFM1OvlVx8X1Jmae
16UctsX1c8bjYQ7NgFE3InipMk/bEZf+ytL2RPdZfEmu9JHYVrj4SaZutrs+z4YyQ1Nf95cs/aq1
RZ2fQSd9Sg/b0cj25/VJnHMFW6PcnKIr3gZ9iubQSiPRg3rr1cIriQZDKuJfKqao/j3Do+6XQPnq
72R1jq8InCkoTS+PBO9gpJT33/kFZSdyL71kuYvcWAuryQHJLgM04/gUcejZzDKOVgljgRKwY0dD
caqTajJWRMTnZjVix6pJMVDnAe+OVV50K7pweliAkEQnnRH1PRNWsQv8yaTq24CZpANR5v34QqwZ
w14ce3I1QPXEjAOQ2r2VzcgBWtZDjbpvMEAWNnUh8ZqhpjuIpqXb0Ursr6480//VXoUgGH5g760p
g8Ab9G4efHSsDZPUN4BPQYZMuAda4pEB/SxgYUxs8S44IuKIYGSCd+EIn7I5fnc175Px+zBDtE3f
yaGYRoowsEaQINT2vvfA70MLWTB5x49iGi5yyKIrRtSinkIguMFmbE9UYW/2MSYY7ES2go7ehY+P
jN4jxoI20GsOHEmF+49W2XJPY6fUJ3gRYzyYdAX4domdbGecYTrFWass1WoWVJvSgqXhPuG35ep+
lOHSOf4d0Vbt3Ng+TUD9PriiVGGktzF6e55PbK7OaF6zVPooY2RKZ6RKgba4SV7CzkjZwV7VYoZJ
kzUrd/NwokC/I7v6/9PlWX9apmuoFP23S5nEKbdBEa7YW4ageRNahhBVbTTHrr/2ZXyCIknd4TWk
XF2S0j1Sp6x+cDmiskoRM3u3ya93qnHA/ZpiTbHv8RRD0ZwI235gLUu5pWm8Yb8FueteeE1caesD
+v+UK/J7w+AUSPUpIYNl4J83CerQu1z1Sbk+6b7/+fx7fUQlMs43tPAH1XIcviCDdWnV4MG6Awws
rUThCLtUJuWr6+pzeYlRBz9JuclSt4gp1ZyE3m8EpMIp9RI/RhmAPDqzNxrAFuMyWy0Ji9kjMNOW
0GutA41xVOITRG64C3Da8NMg5C1NsGkJuDxPNEUCYDp6F1VXlbe1R3O7CHzpEBbEgu8Q7mcMbK/w
TLk6rlszmGsf9fEkC4NLfZ0Q9NT2n79ql7wXcfYX8lR4pR61Ls62ehM0gVcTPfqCH6BwRxZ/7W03
dNmZguRyEVfKd81jvsSzIEn2+jsJC7wwM/7XP2ZXvvKLBGM2+bBBY0L5cNHUl+wQZ0Fqj+/Z3whm
XdkMhiZdQ8nvOsW3lEavtupit2p/mfKcXRjiv6QwwSb+mEwaTMiDYoRVvmRL9nwIzfF/qAcEws4m
hJ4WB4Xvb6z+z4fdF10xze5IE7phVpU99ZoQnfLTCo2bSe8/jGN3sIedyKe5uvMS2AulfS7XqfRM
v78aP+XOWOvyrKIiqgTTsi34Ceizklbho2vFhJf39GpAIHDPW5AcgYeEcKvzM3mh7OFB9lsvKrKJ
LWh81JlI/02iqYAMK2kePjoEihFMHXF384XO71OSf57iInWY0ivU7NeE1t7oWUe5lYINNeEIsMlO
obt5qee7PSOyx4P8QP/LasDTFfi/Dqs1c7XKJ8uFCDm9RK2QSPbzRcons4R8pqUcNSXq3ZBiedF/
o5AmqlZkSuHu/Rk7Zm77jAHIvoaf/gmZB+3Y6rke8uywVLGbMA9OrRPPpEqJIDIvtaZNid6JObk/
VwBrV72zL6BuY59bFTPqVMwMaVYaQpcghRriPGATZamNryGBSYGTgg8EHqf3KMvKjO7Co+P5hdyX
piPMaMt+kWb5oQXApkN6ZNkoFKgqhPD3xNNCXPXliRz9emdzDW53Z3NqxfpUSwvncdjEPZNACCvN
T5psH7b1jXH60F6uiYFKLznM5x234igOTa79ZuapVZTIosDduwfBUFkf/euHrdPSqSAqpKfVj35P
+kpAzR12LkeW8Lao17uwmYObS9rClDz4lAN/P7rd6U/jelXo5zZZ1hTYjVL/OXmG8JhPbSZt0izK
PRvAgoJiNjGBQelCxUWcdEZbpR9YsI+/mjiho4T7mryOCVVh0d2CbF+cHnp7wQQEfEhJBdGVssOf
x3t9dyHNv+QW5jE5VjEHbEufRJPropIPANbOb/dhclWCRpl9mTxR+QEseC0wBvCkNkUc51yU5tUz
85HkYrSqu5KtEK2Xaj0x/pPivK8LzV2TckMC+w9xR6hizpfv3jpZHxTVsyToJcubh7Zi5Jd4w9rT
Jki0yzoLCq97kjcbakJwBbxRj4yi4Y5GYT5Ntw11koFRklWiZGRouxMIGBAGLe1uI7NcNy7Keto0
BZkczHtxLBURbAmxSEZ3pRNkPeKRZJ5uA8A754SZ5pSSdgD7w4/xTxhShPu2An6cpB2EAP1YqaoB
Ci1ofPlZx2yDN+X8UoLueasrqRV8I7wwq/0dkKs696mDRRrfZLmc4Jbz0EjO9wB/l81y3CfxFiH+
zLExQ2XdgbeRsiWK0JaheIDO9rIUXPb8S+8jiCwtEWYxUUNGexf/3fPrNU8K6TKbl4urgVEZL3tI
x4yTx4ayn3NdybusPzfvECXsnN/YbrD4Meqqua5PMhr08rVr6tPe1wGzj95ngrJmBNSrv1G0JISB
LgkqtNXRzWbYfnIfXI6a2JHtx1a0MuiPm+xIk7p+VFJpLoNn1JUijFL0YN5D9Re380UAhSn4PcGN
BAUstS80p9hz+kdP1dv6zGSvNezq1u+foC0m4bxbgcaC0oyLkqaeVSWpFH4xSFKPEehkxkv9onlc
GR7ykzDyv/N5jz9/ysCcmbNCsePCZNecfptJH/7u7ajENB9w3E/B1TN4fXqpSCs0cJi6xYpWtvVw
UUq4w1tU//E5Lt6TVerY8tHRQuiz2UPlndVSMW/4wgCOeg9XFuZiHplgK4ZDcHtPp7GyQqDA3aYK
Hz2DgUh0bjR0gYvc9MZV69xUKx7L5sd0PN1C6fTcJ/zXv1tofDixUu76pxPy10qb8iqusmv9OKgQ
2dFWRxwffi2fmmPZqwAfAzH6ctGT1cSn28uJ4sCn5vICPM6roPa95XfHcrxWmpPXXVLzrWMb+1zw
ga8i/3GS0OPFrxylZz/6G+4kGNwuk0NohjFPzslfq7WK66qRgq1UzEhFIJr/O+fxD5Jjxol4rCP0
aSmUoFH2tJTdYbzU6u3LimA7ZF+xbFnXiaZ9bNc6LNe6hP2yhH0bsOHYV948/4IgHua6SHuc5awa
vYbmJfhn2NtX/d5zf24PiEz+7gdJ4V2pVIWtyCHAMhSrULKny9zUgIlq5iQDI7qMgPtEEPI97kqg
HFqFvyLpZPupD63FgYFXa6Kt3j2aP6l2eyRw9rBU0/6qusTd+EhSZyyrDHLYO3PZyKSF4a/c2iaZ
K0WjoziMBmlF5k03V/q+BAvb9Tl/50zOc21nGbKTWVLT62rmVSPfZO8eZy097GldiKC1P11PR/Dw
uyfQFaxAd97RHa8omiVcKVEClGOXReiiTYWIzTQkp+85HuGtlAbdLLTpwlTkUBtnEPzRlqv4fcms
5p087Beu24TExbHGiaXJRrYDBg5fLIfEkNG1Po0knNvNuVWuiSog/pJrrRPnakxS02uM+r59IBl6
gKeCM69Xcvve34djKL1xewY/RkR37rvr4endNN34fZNuKKUhyslQbo36qkHk18Jg/vo48GPxfVh2
SadS5iPWNTUD0RreyFPf4zvUp+X796bCng9p/Z2nLeyDAJY1SDwZiVV8aV1oPqGaHTukbMeJY5e4
93bwnLSxTNfp8PVac6gmsd1YLVdQmbpCCdQ6jnSwSYMFgS5ayQthNpFtrDc/QFsL7V7v9MlrrRlF
7l5EsAdJjhtZbxUvmefDZ4sca+lOcuJKVYWFaez0SOK7lB/mOO47k8L7Ybh+QnHQwd63h44yaZqH
dmP3XA3xMow2d4T6JuIW0z6uHw7s3o4rTj9vIFHQpZgx8mp6eohz/EBnsjpBqW4guOIqngHHrLEe
VtutF37NgrzJ7DpLPrTrP5s7RF/aoSvpZJXK2Fsts3GqBLXUoK+Mmllfa8O2lYvg7+PyQWfd+MpU
h8gWumpFqPFMLUqRTvoZkRV39+piwnV7UlSP0qFmvnA5B8dqqP5Deehp3QZvpZhVA+fWTq6EWo7b
2GEBywd9gXzU2o1k58c5O/DlwLCI55XWbp3WiikKEHpceh6YmVOqpJLV96nXu2eR1XkmkF+rpFDG
SaIT5AdRBKGeQAM5rHroo55XvMUyEJXrZxvtIsOOInmiSuZESMsMJNX5dUmrDEQuecXm5ubezRKW
SB/pmpr55sWTl7krg5csxBvzNSSPkMinCegM9cTUzVDnAvoiOKzEN2Ok9TnL/cMxbCrS5zWnypNj
okzV5ZPEWnET+ePYfn/XiaOF+nIjjXn6diONJnPizrZvBea82W7oRelFNXLCRsZENLbghZuljizC
A4dL+vYo2vD9+70HrkzzzqibuJ00Tz3Dq6Ych4Xzvvrs60CMBu2umWWBOMl3O8xMY3ewabn1ALZY
HrQW4Lu8eh65zIhdIalMurboUQlE56QbCt9qyeYsWgcMQASyeJCXyAqVbB+bEOMup8RPeq6IUvLI
XS/dgtjQGyOoNdS6tnuIdSk6diBsQOIQ2Nci+pndh2A+wmDAfcDdFOAMBCv5WaBwIEQ/DrwzK+Ix
F+imH0ztLw87w66GxggTMeMPEo3GzkpWeZelWWVaenDwExRnZI2NS1pdcO/oSOJdeO60SmpdCFwI
QBku/OrbnZu8473jnasWe3+u3AC9kxanedYP7WFcbRnzafMEeOmPIKLYaFDGWEasHOhpxxiqeqHo
WuKcxAsitrrkok4FEL4CyVjmOrfzTvut4FuOcz6bonA/23ZYxHA/OziwRIEKdEywM/TGSAbsdphc
m2v7VsyOuZPTEccIzcJKC1nWkosSB/inkp2hBmnfUGMb2eQsCQ4ssBZXFt4DUqjxc4aS65Liv9ub
80Ndb+kX12hSiofUYsbqQkDsTUNx524UjPyjTAMeixpPAyXfrUbrY5m3HbcdYw3O9b2ravUMPzKz
+nmHHdocJgG3UAdEeJXR8n7xb69aisd9owCh8MrGsZnVKY+zQF1y9a2ptujPceqD/BQ6LEkp8UZx
LMV+Dcfu1NbpH7MsD9mWjqHR5bGNMdHJNXIGVreVVVkyJ1UPpAFne23jvTPuMnQtcUvRZ2wvCBoV
7Vl3SytlM6IpHPo45yVN41NbmabeT00yRCdKCLFxiwvFfmZTi4+SDtMhLY1RT8eJr4y339kZihty
qGero64brIg6jD7k9pREk0RLb6fgjCecBvjZS4AEk+0t0jk1X5UHJWqKldeqa7LTS/HNnc3ZsJk8
Lt01CnTvm7sntM5RziXV5btXXn05NI1tJP0+r4dVEVmXwzmc/tGxqUhbbZtxzs2u7edsusnY91cV
i3OfvcOvKq4qfk6nW40leOr0zxlZdFyVXbUR2yTpOo7Uzi3PLbv8bBzRpaDWtpjz4e1fsqbc5jgw
OzDTsfa39Gey0raxa/dbOa/sPZfRWyh6qLdfHhyG97Brz/dbPv7smXRwVH9Uvy0FOzl0ODe7h7s3
vW1d7T3+wL2staA1xAjTgJFZFK6Odig6NDrW3A8zHz15BLYukxqjJ3QIrpBSNvrn+HeqwsRg4haL
CYdpdJbCJsK56Qv1hzplpY+Jjw22lsJ2ExpjR6a+kXwDhibVqkdHjTDSWfCa3Lf2EZujBs1AlyU+
6jKizIQstRkFRani/LZ+3t5fFXf8VnwGsy92/XbhOIdaJ1uVV4/1D/Xzjp2YPKvUPXm1+LXKc8dR
x8f2HXa5dtE4ewiOUbTys+LHpd1zXHMuvrStE+zKK5tlRY5T2GayD6cVUPGoZZXumxRP0qpiZe1m
7s5iFy/QagJ4kbPCbNPrB29lFTxhvPczKLtfXD+NxWCCZqAqOBplNLZS9pz0Iyk+bOkRXMpKEkQS
ROWL4EPrJh8uH7dLfE7udKwxlYvV0VXDfd7m6mUt4B7M9b40ZUVv5Wmf+fiF55e7cv4hkgpDZ0dP
R63qNrHV3H1OzxZ+/ccxEkicZvSq8zFc44zBcUc+3crVcXHZyCNoNQ/WhsieXt5L0EqQQMFLoMa+
I0467MVppmOuObAfIxjvzco/x1BH56F6eB2vZCpo1ixeZvbKtFnP43BcuwMHgBqLWk/Y93Xwq16s
KYUpuq5O7VktHD01Fy/Xoi1OBmGGZWMczoCl3pHpRF92Ld/AzgCudmccEN+3/07hsHEB82BlYWpB
9QC9dkq71F3kMHaBX/N64b7WfW67Ft2MTBdoSmQqU+55CF3Y1cxZwKtd1exc0Kp9pRlwqHxYwymg
SYQ3N9RCwF15v0nnoHM9mH/Wwsm19n6tL/2dI66jpUIcN4DMTCFyt09Pd3qzElpZmXezd2Ntp/nw
dBMyl3B2diZVabWptgnQmRgsHkSu3LyBng1WPsfi9UdXhJ1RQ10r8KATAzn1hsMc7OyV/Wmo7Bm6
jlakWd4VVwE7TyCxOVsTSbL3+REx3xGqo7nywm4kOi6t7lzBpFaUl0tkgob5yJeihrM++DlV09z7
8D4YJyO9+dt8Y9fM+6OazxuHG9a69z+fnBkOEAs9uhdyDn953Yx6ClGXAp0nezA69f1p9rKeoq67
n+OPqHQveK/sUfU6/bWeKI4qZ3P27e8EDbd9uG0fOx9tZbPqe9Pp3ZIMrxQO2vYRGbXC8jUL1WKe
rjatJSsMJi/u8jmFZ7+tFXfO+F5qAreXDWIX7i28DnGODUU7R9rHhH2YCi8VdavnlsVZbHnJtTIN
5n3jPk8SpTLmIJ7ETcLUfDSdknze6FcElp/MQ72ub5sHPf2u6Z5/rRAO3LEvBYh19s/er5RKP8YD
nkq3loV5EXwlHuWnE3pPOtYkjq7qT/kpLhRu/WMWSP0/VRevwENmPUy2DnxLmw+O/NY1jWBd6ONr
/akaCK4FAQbq0TuQpsMhLd/QgOKOa5suz7XOp5PZrvnhZ+t4fk0qcp9HpQbCiq6jKzJFbJJni8Xb
u0jj7Neue7uBvxi7cdjahR6745kDzldWWaj8mjdyTozfZQVsHiLRvKWYGnzWvn0+xqv3MboBHkqh
UT1VEsK6inKWHR5bRw+ao59CXHNQOjtJ9J+ZH2ZvqZfXdD2NrkRMf6UI18MCBcuyNkZqYpn3O+aB
+4AnbY/Pg+Xw1R7rB5CH0/v9tvlOnvZeQLYBQcB66TVmO4y0tJwYOW/J41GmBi3Edd/Uy2CcYqly
5mS/k+zs8MRcQ1CEWEm8Q1q/51443HdkSK36YAtj4klxbUpt+NXi5jWPkqZyyy7WXM9IoPguRSOJ
ufKOipOHlL7dYwBQu1MyTtBU/06qovpZliUAuBCo5OVW+pRhWJUym7J6G1LfmbBIUCqeGh5c4WLS
YkVZmbL3naLJ/7WBMhFN8PXlbFs46Y/qCub7EOkiapaqkz30y931aPaiPYqBjUn4AH/VUz1q06CI
yLBNTrAmQ3f7btjao1st3MmajF+o50mcHLe4Un41WGslzLdDfguxQwcFlbi+ZfnnLPHH4+57qn7p
C6wLdtYRBm76vlc3G5WmFa2rKx9IUVZq8K00M+77X9cPVGBgveJmIH27UkPThWoVMczmRQV28479
qYk90nHuw6oGLDPEUdqgaKSJ4ojhwC6vkJgjP6tqnNGlWqsXqhXCIdNemjJ138jpS+8SjryCFXqg
nzn/HhUHBWKW/k4mXj1/bHr9JFPw5xnhSUYd8Ulm5vfYLzYw3VT6ntW3yASeaSTizwORaWQIRT8R
/N5JRbK3S4KgNSiaTfF34JxLkRUBnnYmnt876suUzwe4Jk4PtazZHHJw3vGOZZnFZGQR7/JANann
bSxQXAKgmRYrca5t4BascI41/GCxdOsVEq/3ZtobEjG+cMymKBMt3GZ1rHRO+AMN2iHa7FDHWvha
+AGi2qgFB+jYJyiRHVys4+c3HB1nKj/OYpVexToW/AmQODpqKSdvJDV+h1lBA9weiITrC2R7ntBP
P9ZjQ4ICuG3Z89MIikCfMxdnGtjQzUnZ8kEZV5CfrD3eZmyOSCrn7H1YexnkrCmCF16Lph1eIjx5
qToWYfUjpppApjxTWtdR1N3k0RXd/ifP/nDyEN1512MEQ2fL5WJytQJxXruK4DTPTGnkHI368Pmz
Tfpao8z3aKcjOIj983mFJRaGpDjjo2Y93rS93gTIuxYx3rzKHDeBMwbImQrbS4Fzur4GlhPtVgOg
1IwPKc6dAJl0Z2r3LeWpbWnLCRp3J8uTRZm6cKAVWuxHmTBZzDik4fiPMtwyLlvKPKLfocmhod+u
HtetTgiIVCRvOxxvgRM+Ozon91We1Y9Vz3fCdkdXxU+o9WqnhzGDhyuyMvtcIPBrEJgksSIgJE03
zMqWcGLGPLs0ybuo6FxeQdl+tuh1LIsRFquRhjaDOkH9XCigOku1gQa0IZ7dbZPa7V/S5IG340wC
MuN+EADt8AlkTLNmNH/fXNi5YS6NM4hbNeeB8aApN0B9BzHK9m/AzommJIPExSXpUCvQPUr29az3
WvHFT6Vd75zxCyGSiw4syvTfTTW2vaGVoRRaPfL4axIrUS1xBw5H8YKMxVj5i4mdnGG2dihKaST7
FlUDkGBXBjuHGsyj5ECR4s0/noyfyeip6l4P8MbrT/cf60g02dl8KO3bVaIUCsTOFH4Ftv32SyJL
dDp86HHnsSA9ZAyxJuXDzrvLh/fjtdaZZgENdGzR78gc0KQeMXgO9P3maHkOZFWsGm7fwPgRrIwZ
xrsGMQgc46TKqUHUyrsyruTkCSAZ/GFzVzZyHvZh2gn571Y76g0+3X4vzwh2UC7ZpzMj011BvBEg
zt3cI7sdOx60i7EwHjbHVEeTTDkQJQ+VY4ajmTpZOplJAz1IaXK3UwEkc4GMVQ9esXaQdDRKNwJr
7HhcEBEnZO2QHtpVtwJsU9fT750/drKjKzNe+F74Hp798MY3EzIlFRkjGyOrvSrxxj4z22GN2Wq5
xboTNsn+NEE9lrB3m+gdhQnKGcupvZ7esWloVMjIo4xTbuvD0N54w+D0GpcHDpk4CD6uC07KOIii
pgtD9QtFYU1+JbhAluNDuDiW6sf0by/SsbvRPBFoFE2RbLoSUT/mcUs6kmtdBuahq2X24U197FBG
Ot0mkn3H368oi/2M80yZskDpofJ9gdHD7IC0Nvx7v2FtSlmE/yb/DWLfy5lnQz8AH2K/yMytyMOL
54ibeNV+FWds97hIaImraGbXXMImtkT0dE+ROZ5ioOy3IfgDJ15j9xSRsy5mag0PifY8FakWfXV4
7eQv0nn0kaqUeSqY7xhRm6LoSdzLWqvyxLXctdwvlXs1sAIYtRhnJpwsuhDXPqD9FNvynle/fA62
I9QF7vlgCE44jYnnPDsBxZMo4TAp3vfLvC7g+TFTbvKaGBCoywun+PWZuEbJ7HA6yM8VMpHfX+MI
xpTsut4IfLEyvUdhnINweA+n3RrE1bMeGkhlljOwkDK0oJVWyxxVyxxZy/xbwmqZk2qZdSM1TGVo
gElrNSHY77M2VfxqQpK6a8wSWbs6MmYzZCzMG77EePbKmruxsenGxDBJ9r5276R7Xn8T+SUJ/yV0
Nmc2h/ZrLbOmqzVa2euZ+g1+Tup+G2DjmrpEu1p7QhnbfiH7vsb0na0/xsSsC0bKm9TxN9oKo/N3
Kr8/wTEV6oJnqPyPNdoo059yFj/LGU6iNh8OrT0+xjqPvc5bfUNfK2/GME0w+n2M1BJd/GOyzQ7j
DmMNEKSnopanbSFZSyNZq/4jlWjXoyMNfXniMDz9OvW6a81uDZkeY8xcPBqJYsnYlYUc/QXYbYBt
2m/ILwLDHn9fTpw9yPrlzQcGetZnNCPy9OGIItY8iTSzsVrrq1ReNIxIB6p8PTf8VapULGmzGHYC
qCrBKseF90Y67kCjzQ7HDXM683cTRe7i/CJxvth4Jk64XxySfFjSza87xLmn9W070J/FXBkrxLmx
9poIOvoaxQcaR2LsVGLsZGLshmPsaGPsSmPswDvoO+jWlOBKtny939jiryq+7OeQrLWWq8WeEvXa
It73i2AoXv8VTnJMrKho9WIP6obLH41BsE0sgUsRTyj44Y5AlUANs8/zU4K2s/QLJQIRUwJ+zC8k
gxtkeMIqKMpQjnHzSEJnprFCFZTTno94UAnKgejX7yUE/CKxz6rMtdj2pWOknTTcNSQe6IzFBVjy
EHy+4atEspIns5LHseZhsmx6X94GH8A3pEPSg+7Yg9CS8EnUVYnWP5xYcgmDfT6yfTfE2zx7TsG7
rwGK4cLQs/x3i36Oq9x34gGlvHM7tkkW7WlyTo2WR0zZfCHtIdTbJHWTj+Qxm5OLnizMmehfm6uR
q++N7oYCqvs7prN7Dno7S2FovrEgWMCBfwMyrP75s9GaFWOnlge+zjqab7lAOmzgXNeqA3iaZSe0
o4r6g7B/ZImY/2TtmqyNp5cicsWOoXF7Aeba6X/fdXvdzuL7ZBFoSlY+tPJw1W9IZBiIlT2MSNH0
qMzlQ9rP7JcDSzYSSglIiTdwmYBx+GJWA5bsWNmFxNKshC2qkQNPtqG7/NF2rOGamnt+60oYSh9E
JxTIm+Ia0eGkYOGAPVLe7xEDFvWQwfWaHOhltBI/k2c3t7flpZRTBdqPoXbJwfGyxpOH5Of55HNf
Q9/AZf1WffE26/VOt+bbnkatBceF0aNbzOKN8OPPVejr+St6hnbzBJ/bQzs6E6+ZexeaATkvSOCC
h4rJL0QfoSfotU/auDdWqxMNu9/6ikF1SvAzBuiJtlKch7G51C9h3DBCQwB9e6+nt9zWdOXkNMX9
7HlnTjPiAmDB4d7gxn8kn+RIBKbnV8i7W/KMKQvBYqhd7yfu3ABOI8Xds1AoeF26fPTro6jWDSc/
iVnOYF5aHln3dEupexHbM7F+2L37WccBQHc9Wm2cioHJ7LE54gOecAsCyvQlrsOTEWXn3PcMvp0L
+HJtdn6x4Vo9E/lAXznU8fHVwle7ZDUY9g6CcFgzyV2j2RPRgA8CLUV2cJKJWQTgBdTzomM83duv
40jo5K6jM28iia4tVNumbx3PXDheiYUiz/G5Axq5dzsnVwKa8D4EQ6yipJwlT74rvTm6hWVOJvTU
V52E99R/jgf+gIPqIhmeWi4YvY3Z2W09f0h0fUFsJnWTNqIiOadg4oEhqjLP6w8cXbhAgD6051q9
h5XV2z74/aJAadaXwlBa7h1qjWPdM4AFhcVknIRbiuxFmu8dvnFsHT8GBQLNrgfjib+omgp/vTog
NgiYWzMcVCH7fF3RxSMIw45cvXkw6m3HMmRlC6WFfdZ/NbjMvYxlPvClBERgWG8VOk5wb+iQqQ0T
4FyZ98k8Mn5SBzwqJ+NYGp2Xkj4HiI8DkB4QQq0UbhOOJht5Dh0LnY5dqQD59a06V66B16eDzPHE
qkIJvzt9rcfoJp7wdaO07Yrd9Afz1afjTfkYwHnS2BTNuZfpE7EV6RW0/+LVQCpSzEXPRA5zLoDe
x++wFCbtmykY+kgyJGm1OBHafNgsvHvl+WnzZJylGemoMF/wim3wltKlmhPCz8p/hArbj1j/xlot
OXCR9ih2e4JI15Ri1GrlCm5alz6OvbJJnN3YhZS/fF779NQUTvAcFlDvvo37o2k5OX2A9mE+5OY+
wJwuk3f095LTsN6QU1PvjKrzCiVHs9ZxPBtUrpvCOTV5fWdyU+2ES9SG9QljcWabOeW0vQr5yukb
4EcfBLhRvus/utChY+nf6VnlUoqcOmsYQ54IOO4VEMSvja1mSx0sd/5aede/o/W5m2dX/MkDvuUS
8rxmHWBTe1J7Lx2aeItyyPMguP6Edw+JQb/YULin8mUYfrDz7d9ZSHoiZeEPaKvz/dnw/7BdTtF1
Re3eb2ybbWzbjdPYthsnu+EO2thpbNvese2k2bFt2yfvO75zrr4x1hjz98w/5rpYF2sWIt+dOU59
vB1S3V6HrEMhcYy+NVv6+Hk+PNF7XXwXzn6M4jLaMSLKfmGolTOw0bd82WjfJPQjeHg+pfHtitU3
RjPxbkLTn+T5ABquMDfHVN6HMfhMbf/DA7IdICcDBY/fmQOe+pLGfOohtNIQBSu3gCN77l2PPL0W
B0k3vVYEgF1dcPo44qmzn6Synu+L1XXjZUf3xv2Jc0+XyvtHTYFmQWx7iNEfzRPyasZrIVT94uh3
NiWyj1CY17vhaqPaUzWcQ08fSd/cqXG/Cx2/RJKxkoiGOA7eRId+4o7eiHGpsbeODDhvH2fo7Zct
rcdOhV1alvLs6r69/BvuObQuub/4V+s9hbevBNErVhbAWNLkOney0fvkPiC/rSCGX2LWEZO+ZdA8
RoT3QW6L/oqcWNdCc7/zpFibjkm2UOdDB+UrwajU9GuG82TrrVBi09r7mCP7u2z5h4Svy1Lfk5IR
c7P6oSJUZ6FBl+FJuyaw70BA5ObgQNSiq9jJcBcF+4lPtVRcctIduFC9BvE+oJneR3WrLr6+Jvx9
q5gI7ydOq16a1/2TlWPdw+VK1h0dia0vd3g5Wj1qloJfy+2Vwa/Ti3qmqaczE9CK70xWv1LIVAaH
+/Ksp8/164bBay+Rf8jpxXtK29NrxN/p+jKFTd6T2EwHyC5mP47g7MVhgaezs5XHCw0QWiPsIsNV
2HpDx9ZLmpXQ7PbJsJDbA2KkJbrXGcb90s5DMM2S4+LFktJKy71LFkbpqznQQEfK4kNhsATkzW++
4QjkdcMeemUAEgqPEd17vyReYmXUn5tcNW45v4wgRgKKOvJeHdYRXyQXl0yEr6M6un0xawO2ylQw
Uv3gITiYffy0vFowlcw9NIN8q53WvbsggRu6uQfOQLptVHmP+zcvkUTl7VKkF4LNu8aSotdX3vrd
j8vZ8GOIGLec08GlJiIrRZ5NiYo1/xPp5Av75jWq0+AsQRYWv+xZ5LdnKn3HK5hBUrH2H93Azu1F
iBfLNnQL7LkGQLMs/sYTyim3m/SL4Quzx8Ww/5VCvdVK9qWjoxiwXNGVFtbWt4mYw3eymjTkZohT
RL3Xj6nHKtwjGuPdVYE6ZV+D8oOls+5hOFkS/IPfZxHXjQZI43RksBIgTL2yc9mStBgjSYpDD8xu
owxES+adDGE1EruAP7kUvDc6G/JAtd828m4VS/kai3CVfpBrBPtqSep0T/qQ+aG442jtSut97hI8
NuXg+y2AZ8Bw95lZr0DV1vuD3ueWoVW8o69VnOqWRlKDfnatgo4zgStIqr5oGr+wyQUvSuu97DUx
y5QrtzgRLoGNU4egXD7PU1UtNElGgcxLzwZxRrWUTuKC9oIhe6bNhqORr1KlHpzUoPkpeDVmLkcL
J6eJ3QY909xJLZc8g19+1vOr+4SCSnbmaH6m86tl/hAAJ4M9b6NaZXziOzU2VDfyLsCFx+z8Ocxa
InnixzTHNLcBzyyuKCQqC2UfRfnHXq5CJFo8JUSHNArWzPy5Az+vfskeQ8ZOtH7vb/3empRrQUt9
AqlTAYNd2QjWpWeehww3Ycrh/VyscHKgK5vciuNK7uZcEimfzoPiyBu9EjhL5/I5nduPtItuk3SF
ZDvBByrnsc+Csn5CitUFq+U0x6WjRoWyMdux9EKj6KX/8h8/B1VKDa+ELdVCaQSZRFKLhPd8X1VP
bfob2pgfFqQWeer7KkWyFqR7MKXj+eN/RwVH7T6hnSLRM8FCNVX6Sf7TSFTAHuMi+wmgT7PGp2zz
qcwVssfY4M9GEpT9TRO0yQDvqjD8UCDlUrC5LuEqoI7R1fsE18i7QerGMPUdlfoCwhivxtqVR80O
qbKrksrCzzHgc98xwUbwWEg1SpqEcWNQOUS3rLAMTSfYoqyvwppBl6nOtJLXtTnRmqoMgmFAViNA
U6O8TNd0rsamzC/5me+YtjQ7X5jxDgCWrtjXBNyplOblRyfS8x+bqUpK+6weG7sqZ//V5T+GLi3M
F2Zq/AUOU5WTzmT8hIOK9/mOY+zPfcVGWL2AObzCvGh+A/rjEo6CT5j16veS8BkhtI3SMAKRNg2W
V8tIkrhGq4NVDmQ/4c8n4MkykdyhfOY76T7rBj57feRsjkoc5ZhIXEvB/1Q2Yj/PZf+PjpdImFjl
S6vxCxxTGB7dqlp2WGJbSB/97Fgank8aX8ZL+EODeCKujFdX/1f1oa9ukXe8+AmthnNDVS927TKT
Kpr0CcU59sNPNFkhYvsEcN8MaaIX7zJvaUi+ENmdUwPCpyGd/BMI/gN0n5BcQBoN+j6ODWhYKCSN
vgd9RtaTPyOInxEfxk9D4qdTj+EToj5hhfITWAYWTEPuG9XrZzpjbbiXFUst888SP+FBdUJKgHHO
roGCzSay8A2fwtS0QY3tii0sjQnHjthmvDbFDFUoyRQnRLTsWhidHlYGW865YHNZN4xT3yAeQyGX
/vv6r7IoD5JXjlJmLsoIQoiZvGlyuIXOeTDsAhj0nafnkBp/Tf9708r0sdtrBMzgWlDni6pIQ7NA
pLvw6YHvq614wE9aqmnxx2SZPmtojaIv06wI1rS0Os50bAm9jiGF9M7dQ5ybZgYSx3R3JbWqRj9/
e4gXkr1KdU+YD05Qd0+Q1vBACK3Uk+vVueCxNtCZWasNTlt2T5P3hzAUgvUJKiOlsmO+aKj9KYtR
K2I39EzTpcX6U6OAb5LO2sttEmiPHOgD8263aWe2eSoN1tHJrcixTYhJVCpNrCMcBjJRVCPuTvh3
ED7asr4Psr6XRXaxRXZdRXbZE/gRsb1bsr1rQrx3is2Bl47tZLUOSqpVXV1J0VtgKVxQpHbLfw/L
mWxAMGtZ6FcNNGeg6r/jnRLm3Gh8P2is+YCV0rKIrBrFN8DCZ6IVB0CU2nKoLlgUVEEVKOY+65Yl
yaI0cDJFLf8AB6OBi7y+n7XW3DU8W8OcFgVjts3Q640FT8y41DRGzcOCKudxXX/v1HQ7S+wC3Uie
hNoUXx0MpH2bqrC6lBYgUkhz7KSnVWQR//oIthAr8VL/m4v+ET2iPnIVaUbf+Kt90yOWXqBIwLDQ
fEhwiCgB8tYvPk22g9uGuRoCLGsINUxXDVHj7EXcOM9wlFgS1o6prKaPIEyj8CH24V/1j+eQaLjQ
EcwTJ75R8BHyS58M9K1OYyN8mNuHKPVZ61nL/Gjl7izhWzUxNlM1cUm99IZ47bOhD8vA1vMVE92z
75vA6cnvdyGNf2jHcKV17XnGRiLHIqpxvuoisgvHQ7dm+HPOb7xS1/HvWK9YzwiPNHfxCZUfFR+R
WUpE9BrsnH2iS8EOhwWb/OaYxqs1tMuh7Bm77HlR1v+QTeBl2fWDI6q4TCPxwT2N4abOlbLfVyTy
2ZeL8EtLsi3Vc3kp1krCs8oJ5qZBwSpQoCIVLCEwu02ub3Dsn+fGKK8So40SpcQoWCmofiJClBET
TnbCWFZCIoVpP7V8umVujrTcpn0pAHiEk30GFDTjn3HdGupjYKYf4MFAQcQFiCS+nV62Vmqd6WlG
5WrDNxjmrOKpGkoB4vPsAO44HSQ/3AkcToWmhocMnwneZqY6Br+PssESkNrYe0T1LO5ADaLbmAla
f+GJDIk0SbB+RBGR0jOP7LZCwBe9VbPDzg/BzIcWiuSUyvtQGaS181n0wH/bWZYvvV6Wj3K29/VP
I8KKRADLG+bSEWgd/ljkX0qRpxvkgJ302eHb4bOxkGcr2uRV4ijq6bSWLy5S1UG7c8aRRgNE8tUA
UMblzbLY0OyNOPbVgDvZgyIzN5A7rnYG5oxiKzxRPBhGdoyiE01RhSVPVVekoE5H7++p18sxjzSD
NCUto9owH2o7amAde+9gftuoRvwRLzMhqbuWzz+Slp7F7z8HpcwoGlm5CdKnEfUh7poIVqZXtAa1
SrpWFqN87/FflD/0dvTAIuavofzSUfm8kEORZvhTzjvYVHLCohPdNPqXZuOy4NVIHizaOXnOeLpZ
ebbZ0iCduQpFhW7uY1WG+iydbP50lPHgX1FLw3aBMmb1dAa23BzpuSH7lgDwOCeHSnHQEqRe/Thj
f/2E3SnV0LjoxLylbf9Kin0N3hNqKbkOEldiBQzu/+cJUqW0zVUf0TXu0aVVqMN9NGYCy9bhyiZV
wNz16G4GNBozaCMxaiNZyM6LMXXrPue/d8x3/GJqjgjRT1qglyBhxW+ACRAlRoblCtBEf8PWG7iU
q8Ds77FkxawhAPutemWk6e1UXlnDKIpPdP+kJmcf6T2to9ab6vEb8UJ48VrySuWXSwoYNjlh9Xrs
eYZw7XYtqd3lTyCkcvRuiFHNw5ZNioTDYCXVZgTjR8ItDJU0l/COQl/8yNFUCVMJAzOWuahbtGoe
I6jelDSUcMpGlGFqwPh6qfM/QzDk7RtLNilH1ifX4xFM6mU29XZNeBK9rmQ29XX1LaVvU1mJFYD5
4tUPRDIAWwF8PXAAMRJWGvATnS4Zl26UYj4oTkRF81BBeyRbJvEVAfcV4V7RmaYwQjgPzYDqHNNd
peKQ4VmVK5bBpbTICYlnDt2TPIYzluX8z4bRrfQbcKCjBJDdjOYKG/7nEi6sS4VJ5Rui8hBFe8kO
lrBdhxFyUdmmORq5sDqyJPE4MkgGuwcVj6IkHD70mwbeQB401wfze3QaxQDtqXODB3ZsrSmxFyyw
z5A6FKFGKbxY2SovJZBNCTd+ZopjW+dxKuxA2S88BfLD80rwOYO+yPQEaRumjKIo7Ke6kotwGdIk
TzxhqF+on7IAm1w7pB8oJYof0E9s56PQDitg9BpPGA5jCgHqZMY1PUk3ZZvDcwyjCm1nWpeClsfA
lce497mCsAhFG3ABP8lU5Cxvm12x2VRhM9Qmz21zSMyHux5iCWK+OaITGfOEK5TU63iHVer1497W
a9gFfCQ+hqcFGPlGrbuFkqhL18mXISbpiGno+7lHFRBWqTATU7FOzoCn70KRhka55rmSylpIAULB
w1hVCODuu4KTHzY0qbTkxnlgZXaV8GT5BPURCZMeibBU2gE5almFnjBCNqyzfnl1C1RC0wyyKgKS
HkaDW7xXAFtxezTf3h1GxrXSOB1WqpqmpWJqfwY7ldjdd6s5qAANtF+aQtN94Syq/50zNdAyKrxy
6o//TJbB8ZeTwn+KOnffa/47Z+rc5SCVk/bXHvegVHhNJ2qgOZjPBThUeP1FjiZCGTxS1R93UOtx
uIqpS9kBQQ+dQXDT6dih7WnusYTK4QIr/xkdKWkFdAl/EZAgkFqSxWg+ndusy6eDY7zHeIyhj8nr
3K3TChhTzOM2rlUrYXo8EVvkSeApyayT8cTTo/LrCHqyBe5Xk6R0uUH72Uuh7lejWlbVjuuTGFc9
Bnfrf0ggHEdtViNUjKGrVoSZGATjz1uEWn0ulk1+lm7AqOdQ/mBduTmT1jA+B36O5eBj22NbdSMD
ZCm9iBY7+/061zmlOaUefaqIytwqtQWyd5gUW5R5r5K8d+k1ROaXxGecCrCPdTc97x0489gPY6ny
PDhRl1dDBy2v6DnT60unetCwMlppyJacfSj/8Y87bO9SdBUFocpl9URX8jLb8KLeZBsMgrSqo8tC
SwnX+ciSUknbmdB+fx4ey8HVDAIAkuX4WiO9Lv92HA/PvM0fHp6Z49+f2vqqum0O1+8NGXFqGNQ1
f/ae3Oo/G7K2klENtj0FRBzxDkWNsPEOFY2zy7l+I58bIZ2pfL+U9qd5OELOR05bsDxuJC73f2yO
JqYw0LBpKVpUrf6rhdd/0nXa20vYeRyuTVtmMztHzzXPrY8LMqaK4NWsOxwkfvban7bXmctD4jjS
HE9XsByn5rDEA1jEt7jEdaptIJC2y21Ehe4OJaZ+NfraExOf8rX4UPqWoiYOwt0U1k6KdVNx/LdG
3xco7tSXtHEftZQdN1M3W6nLZez9usyUgbRx0/iUATdIgH1kpRWvLY1l+YxUUmxQGlNUUgkd339m
Mgcb9q9cqQGGQ8S3z/CozzT7OWHjogwccAqmqGm9+hwD+LaRMACfcY/IuhRbkKlvqr08JzU585MF
4c0YaFDdjN7V3DLVQh6uftzSMnV0nH0oxWK8yG0z+QY9NqMOrn6E2Cy3Fr2SsnjcVHEJKsOFbbkT
5j++OiqOMeIdcTM+r8fhR/g7EW5hKZ8RRrVUHdBnXd94XUDtpHYIKWWX3dgre8STBerNGPc4iwB7
lzwHiFCvVoN9jF2xZYM3NNQ8iekzY2q51Mdrn1Fkt5+wNE4H6KaL35LjXgpeMterD9ZJX2YrPu3O
uMbdTzhLFQVZwHoicQyjjn9Tm7AdtzWmCjgdRq4LWJq0CxEuXA837sDJvNOEPqmEn9eboWjIb61b
D5/0Ymhdmj0N65Cbw8nU0IIur/plMpfIq2lwNFjGMFLRGjdexsBfXnVY0ZpXfxxuPJfYDD+H01PG
gFteBa9p8MPyf1OHGP/1fe7N6LhSRWtoxem4Slr91zryf9J/Ovn/z8v76ag5Dp8sY1gjV9f6pWmA
8b+H/Kfz/2ZZq89gbxmDc0WrC9Tn61nMJRLpuBYSlVdR1v83baDtWsjwKUQo//fs1M/s7hfjWuPX
xlKmmxc3TYNy5r3fewv5duW5c391daMqBhNgBjegryw161kvpurYK3HBsUt+SXP/bGAYAL9RNaMT
A3yX9c5M2rQX+taN10LXW3X8pDLPNd13kYX+ou1qN+k1UTDf/OHWrEqMiN3Veyr5+q8ojkAMzhwe
qiZZOVjZ+mm6723+zfru992XxibSBlIJ82ac7keLrOlwQID6fN3oNjLZCqFVVECip5j0JFZdZTHT
JtQBgk4G2a42izbLN/a+tD8dY3a5UFZITdrV2vUzsvvIfPPl8+UlN2lcXzX30c4qKOYxbr/dhGjO
/zihbNx6zYU7QLPn8xuOrstjHN1+zdVI4BhF2Ah6JRMoU1WnAifrSMBNki8DcGfY6OnoEfikXNQR
bYrIk61HdCRs1O9KjsGoOhIs4XvjZLh8fSQJm6dR42Q9S0NLcLG+k77gZb5uvi9ufwHodn/qv8yf
3PaiuqEGJyIKsFXUYPUhClx9LlP/byIIDQBEikhrhVX9WJBwj+pM1ZXeIBGKdEBk+DNSIS5eNPOX
OEOOc1c/r7M5BBDWFQ5h3MruV9KTKi5ujkr6aKgCDysigSwqsY/cGGj0iEHADGl8w65UMuEpJj6J
dUyhhB8wnD+MewwAKWsJMpNK+6TScGIrRYQt8iN4ihnsIkzl8KTSgPcFc2Gt4Bt5xa0ZDbFZeifR
OYwtgqf9OQLPt3HM4Sf+ko1LvmqwxaS5BE9HcgTKT6LrfhP3IIkN2kaxocQNkyx5SvJAcv5sxpCL
peHEHetntzOIRs6lO4Bl4uU5ZNYMU6p1bdQOaB5HZx/wqiXlsnCYFnuVtpN6lduFTR1GAeU12Q+j
l32Wq9vhrdQafRYdCOaGPUr9tq3dV4GaVymnuQ97C5V5yz/e/s0Lb1T2zaIGUdVVU9Smm15mTgem
lPCkRANHJCLbpJBcFcoEiZVtXrIMwR+ZevBYZk5brZLellLDWYcZqVNddtS4sAC2okJzCmcnXFK/
jNqiGVMfIVTmrIC/IlN9InFbtk+zNAf8GyeBXVu0FJWBdu7X1leQLEkh8rxK2SS/LJcBlD7U34/h
yBJu9jxTWWmpwKdNetdEVQNzCTOMZB1l6gORtdgPQRS/PFt2rj1G2tm7ihOdR9UYuoC7lLIaUjWo
ebOyPi95ArJGbtUyYkU0U6YGtluc2DaecKJCkdFv2F9Hp68bVXmRTjC2FmUS2Gh3VKjz5EVTo6/Z
RwUTgmjllNfFdf7UEVqQjFKryiE2/wUS4TWas46yPgqo3OcSS/CFu4TTKknWKpuKvUzKSfwQLyWt
rcK6cs9XNvJMpa1UXs77Fa3tLtmCsAdyImo5D4iLcfmKOJjI0+xdmQTdQhsEUMHt9msWxKU3U6EO
fDOhje97BzulEjDXq+znM4rphF+LNp/LVil5uoy7vLGOaicgCFYpr3Hpx1xT58tLpoaxE1kIj+Zd
vguHdGHvQWHruKOER9qjOm4QM69gxFvgCU+ZJljsZQdd3+cTS/FFu6TRbvzZlghDInl4pUy4vWzd
T3X1fPPK5fu2oC/CfOv+dE9Nq0O7RHum0przS6A+acPIVylBgHzeR+U8Whvt+1VS9VycQa7zARqC
D+g1z0mEKlnTw1A6KTaXfMhZ009oii5fZTBoIX/qRJop1gyIuLc07R4vgmKh2e/FPAopXbh66s/8
p+fcPkvtn5cGCPdU0RH5VNiR/FTUkfBUxdF1UW2d/09PncalTNaxPbZg7Epnjp6xtkOyf9Yf46y9
CfOVstWYKxAK9N686eiZppP05la7hONBdx+ZiB0Q9xYlckLuxs0COMvn63phX+Pa7mNM5HljwtHx
ADM4qjkgdU4C4w5HvXvPhI+ekrEwqvdlZV4AH1Tvrm1cF4kXsdqG1P6n1NOgQ3QxvR0Nb+gAlRYf
MyXVPd2dcQXBjqbv/koxaOJhMrBjSoAI1C3w1a3GHeO0xp9sgM5T9OLftk3Lun9e92l7SMdXaMsD
VDpahPEpIj1l1YxYPXVW/hpaR393qlPzC8LFUpj8CKLdid1H9Z8AOcRBmKT9aGYP+kvRdbuLgz23
TnfAJhQBiwMuaAcxC6ViXC+w8p8Dy0Oyl3uP7+YaWts/IL5b1INHy9sqsLXZYn1fTNr5ZLUYsQhm
ftee5RfsvJNjdghFG+KO8YMcA8UACSCbKQVnMcMdf0h/ucqiMxJv469ApbGDMXD9qreg2+0Iz31K
wCAF1U+zx7+7ylvaRAF0N+pjZYK12NzLuFjQa7d423tfw4XUVrOBAjLs8d82bAEg4cLdHzDTauPy
ZmwU1Fg5X9TbaW6RDHQA8PAY0YinDDRr6J34RdpqWFbaxt7ug6AgiwHJeBUo/Ndt2F5j9k29ZKLS
52X+KKIHv5/6UGuEeu+hT8lFepjviGq+PsKcyvoJnhL6yU7T6UWdCm8C/Br/JQMWcO0QBvccaBcx
5AlrlrIh2tY2fld+fqrpMPG78/88W/QQ76H30RYvHAlSvl73uUn3/DF+/t33Pm8nkLXz9WHjC3B5
QyhFeHrrAubk9gG1aEyzEAnwgE2MMD8upOxEru1onLGBkr57gZZ+/hW7gmanUM4lxoN20dxYoQsN
lOVnfQRsoRGUYrU1xvqAB1EsRf+ZuI4JmbhXCrS/yIZcGRAhAaV/7Bkn2Wm0mhorfbSHuDeP+Iiz
AjdJ3oN67Jq2MHru/yVVuSEpedeMdXe+U9W4v2wgucXG/nPN9VgcBKr6r63SZdn0ZEHBPWol6FX7
udYURyY7IK7YZEVukkCFPC7Urqmf4z019SQ9uvdG318EkByIwL8kfNCe1r+rFa7AKjKoyrm3cgii
+PvATdLX+fu0NLX1xbZIslloSsk+tBB5pMHAIev/vkAF0daOJ1/9Czi3zEq6BuAUmrxeyi2g6Our
k/jKKZ3kuG/W5fHbESW+jEWwm2jhNPob6IFx3cRVrBaZJA1M3LHXsG9HQYXSa5VCJAHiqyRCPNAR
sOd0rZWrpMbAghKlGvghkED0JUqWYU/cH5rw66V1rX20vDx/4x/npEoXxhOiUjObLgzhwTC2rW3A
1Z6ZJyGkiMWkhBd37OjgMz1e1Pvz3mJjOGxhpBOmDFxiJj2ctpsQ7En684vzvaOvxAfnZwTY3vRd
JU7MdggrM3ZDOMzwwlRNuGgubUKdm/UO7lumPwuzP9S36jb13f2mprsDX62QkusNXKNFKp2YTit6
UWoASE3dzLSrGCnf9HBeVgMEKfxnV4WnhjcrXgeCgMbJOKS/DQw9oN00tsI2GR+Up1I2V18b7Xge
SzxKgIFW3k6i77jZPZo1UWjMTjGXhd0bW+WwbUPJEMDuhe+DQjsR0rtfr7jEdwOrLa5kHmSm+je3
fXdtUWwf+WHx2oY8iqCT77Cy6AbMngdeHOCZATEP8mjMh8nbJ6h6EwtIb99UBf3PHqc1HySmxnr2
zumyPHta3ti9O8bsobKJpGGvtsPe0p6e8ZQQns6PsoJ6NN50n2Fr7xJX5jtza0h8KIwdL6MCz86J
oFbGeEhBTY6mV7e+DhsJ28kzU3Gby75vPrMBtltdcC91VjBSvMMP7Cue+Djk+AeCU8ebwb7CG731
lZF4Uyc84KYCD5MujM4Hf53zoCzXHqY3qWdN6CaZLo8wYO6F3+LLew5vHMNERdHcLStynzU+LAey
Jf64cWRtJNt8Lf4Y+yB7n3GkRUUiQbCowkJMldEvLS0tvOmGtKKfJtHG2kyWrvgn2orSw+x/cPgj
+RjNFIfqdCGxUuZqAxX/NEIPEpOd1Iy7sP+5sOCO4kyrtXpf/HDbGXhpLRmdHB19ve5IjmFMCdpx
/hkmOAPZIz2Uei/w++xeo5v5BdY45k3YONuHaPCw3Qcvi6QTaUqAbu2nYVVqkmaH+xQyLzIcr4TT
osn9emVqInf7CRfSP59xCGnknmbWrJZ9GWhUxh8r60CrQRI6ON4jGbgMN/PMTEEOBtzsTOH6zeE/
j9BDsPVWScTS6QKTq87YkFX84fdCj5D3AVbJk3a8smlWk6vuCTxT6Eq/DsZB+ZhAKmmNm+VUg6v9
JY2IHpWVdis2gZR9IXYjbkY2VIx91P0zH7kM8Z/nIEr+X93YIe7ZZise3lPnuv9IIC4m0iCk4b7d
BkwZj7j82hF2voWMo2nc5X2GiOGH7UiuGfq5sofG49Xz8nsPjfAxcPA3T5iSw+kXedtT1KWDHAK9
FmPk7KXFE6GBrz9PH7J63ajxhw64UE3TZz0I0Bl/sMayWBNDnDi3O4NP+sZFTmqx+ZmBckyS0RjZ
S6rb+HcD2qMkWBMMSbJD6vULqnspP1G1bUgAnby09fAW+EN1LDPk/JqTpCDaaK4Lz4jzxdtC7fbo
yn1Due7a2fafR06nT/+Y1sJnki2ONPLSpBnfZCtYhthL+l+idZkZfkxwJGFQzWlZE2iwe0smIVCt
aGGG8zCqyVZVr7Ln777QO0s4g8bZi4lvNHRwE00FEWVLq7l3l5jGZGE2w10QnRRK79mSFAa2sZj0
EA/UGAXCT2eZgOHHN/MEiVJGOcyyV0/8YmxnK4my6FLZ/Yq5tIXMmke3JP1Ro0/7660ee5AeNpvB
1Q9nBHt51U3MP1p2T6rlNKoeYU/YE8qFC5nTE8Y1BtOKj68TTzrHXIcSiJz0K1btNI9lEz27Efc0
AdJrdHvcxo0uTZ41k3kVUC6jHfup/DqeX0ro0dIPjgkz4acPOEWB/pPW3YoHJhvDK1STgfvvrTeT
5hvWazBWhP2k01CdYa0Rk+M+DgtgAxfSP15VvDdpD8dV/Ejeaq5mkzudqa0nvL0VbVuCW+nlbUeM
N0zbnlt6VenuWYG0JKauG4g9ja16k7O58KtNP5wiNlF7hLyTcc3gTxwEbNPaTs75Ky9PTxRJl92U
EvTyjkl5z16GaqF3rl5tfpQBQ4GYQ31MpdAcTqsrcfaSipVU6cQHmONNaRlZ+wi2DbNoV6wSA0xD
FSGZZ7n4zYUpxnQ94U0LGQYTgHloKzRjdiniRlAGuba9AuA+iHwON4Jrlm+63U5omxgy8MaJeoqP
OFxXj9efXRRn6jlJyr8TXRcpYyGNp3JooDYp5y4Q0O45pktt6HjUkPVLkftCW0mgGMI2o34CqFkO
gDCVw09OuoFm0fY8iGPZj5xD0Jyxca8C6TfYTEYlyTnBVuTN7awGJ71ktjFpVZyV5e6VNcpxAav1
gOCUJDbbbMIFF5JJGtBqDWoJHRNPpbgNv7araUdln43mWPtdWhrUvIeo0LILgzlC5Y6NyZj9SYEu
2GWBvzKpoULPau46CTgPgwm1qsnQgxfYjly7QvbV3kC1vHsnoMne07gjoKPSVaMSRglOs3xvKxWL
fvZ6ujU33Ne8o5p+ne0EVNa0ivK0x/GzDC/LQgtlU1vs7BL2Z8BylE/r8sqqQvrce01ToRlY9LQL
PLae/iuDH9IKc06lG9uV/JTu8JfrqGNePZiAd1Ll4HXmVsV1xg9fJFPkD7N68gNTZSazqlZOFqbr
BDCMWYvnbeRXYeueUkDW0pXVP43jrA94gxP25xvrQZw9lu63fRHFYz5n2BbTDrOGw/CHZBOic5GW
r2dfnpWwKhCkueLWHKlktom7MnOCVzYf0G9nwxlGgLHMzoVicr+Io6YNS9escqCqIqdruzKN8e5h
3kntXN+EfsEdmYQyv/pAw8m81ii4t9X1GHXX+oUao62djN6t57wYPKGrfNff+loEZzAkphI49XvG
L8p4IZVTq9adtCoJ0tBN4xT4ah/57uzV70q/u/cWf1tSvgyMyHLS+bIlmJHq4kzGcpFNzSvnBPFC
94HZw+zvfkiQjNxJJOgREZQFKN0s7Yl50TqS1Mp3zzR0e2o/aeTRF90cbC6fBcbcPsH2vBR8rZph
qLpZX7lNO/F/YO44aoUXzpTIvU06ieNJFpnhxZDfGiMsfm17HRlMNeb3a3Wucg2u/qmPbHk1P7i3
j5HlqE9mMZ8T2eGMtW1Y6cyQ0gckdPeX9vTbMaz56+jIDhvxWFVEW5JbTMet3fvANQA39vSniPKC
zbeEjkt7BI3HArr80VZhaZNnKN0loPHVXM33hlpk7RfjcKAm3KudWm1TipE1PUr4q52Z7ApkF1gd
Q/1RQKG4Rsu+DPX4xfnRJj7oG1zzDCVcx+sbNRf+ZlM6YQDJq0M8yyITfpp/j2HPKpjgFM80bRIO
TpxBWc9tFkYbEKTJb65A1s9lgGyIWnkd2F8k95tOQctY8rfPWyjT4i8u3t70tEH/fDGv2Tvj78M2
rZ83koG4OD4FHiitoHyFm56waf4Iop/+XNXKi7+I5uv1FNw7foipzPJXMNSnn3sCguKK4LbakPYU
0HJRzBMp1b3QK1LEzkqvU77YCs300OmVHdTw6BkLIvQQiN5S8rjvkMJPIoTTMGGXNxhg/VKiBu/f
EV89B/6mYWmm/eWB6D+We5czfcZHqo/hJUTjb8s7ieCA+JbFfmlbU4fqgLGKAStEI36yt0k6mIQc
aTXLmsWx3ZZB8cCPNyYNzPkIGiPVRkKiIC3nIar2mxpAyif1/eANM6aPTp4MAmJqVh/UIexva2aO
4VEL3gOedh/xe0xNRvM95YIIYuA0q2uChbToxz1fc3FOWtCzyOFPZJUEbhfzihkiPaI83fB2+CJq
To8QKhmmnHvDi6fGEGyzIL7zollxC4nnclGvkuyw+ZsXekZXEEyVQhMFMU2xVhCbvHlM0px6VPXw
Y2jGHvj3ZlmtAuU5vagh8gVn0XdSBevX1QWZD/gRsvxO/lhtrcKwzdfvMuHuCLm3R5nGWc2dYKkJ
Ea3Teg25DhA1gNqq/OeWAVGikWV/NNp78Q0W9Bw4VKqI3u2p511v7NCwLtJEytl+MGu3kWzafzDH
H7eu2HzRp/FAY+27y5kbN28jBQ2ytlR5hi6OpE0uV5GV8BlxNA6yDTUczksUaQusppmS9N5jUawW
qstZK1jRn0rr1qeo/eZrROPU7mGb09U9URnMswDhsme4FTSGxja2z2NKzSG287CCkswElnRbukDk
w5w2Q+nu+Nm/KhvDEWxodG1TFSsrEk0mbWn0JPf93Vo1TJhtuH7jcdqWT+r/e9Rk6fkCkKxvcvti
81uLK8YRevqCqAfU0JhOMLusB0w90dWyFQGIn/wkMXew8alMTvW0z3GF1puZV9lP4gbz96zOB3ew
A7Ta5vkHKmx3JsbGhewx7YzDuNf4+wSnLfUOxEgRzU5MJ+L451r16wuYGqoCyZta05dVTwhvlNtm
W0fI7RtdTyoV7fM9g7l+Pui5L1rbt82Nk8676T0sQjf1aI1Qt01AUKTvRyNI1KaeN39nBPZn4of6
tXNzT2ViykDKoxXUwZxXfIcFrmZiDVsqNcfAuiyxu5t8yxY6YkYkNlNqk4McsItqE1Qe1V1L/IOY
5K4Fo1jr5m6fQ/gXQVt7ggmWd35HE5L9xP3EqtKubYVIeYnZ/dv08H2zAGSnzynAHc6fDAQWdnqA
5V+CcPfbFBTYJUXWNw5ZS4bCW7I9j+2mclsVImzuVWylgdTKzaIrsVoWwsI3s1oD/Dk59QeyOQUY
uLBkk5heNGtB8hwJPaQ9ULcdr0OvOjnC7C+9nGfu43QLdduv4TcPnB+r/FnJEI1BWd0b9/I2zoyY
iYd8aOYV4rr8LQfmgERrwRZaGXM+8nIg2q679b5gYpYWmW/tI5mLWJHXzzU8JtoKv0W0JmpB0srL
tonYH707BvVx0bjK6YkpRE16sjgltq4m6c/ml9v/5PLxMtOjzpkSmNI46gFR/M60l7YJvrux99Sv
9O1J160vMLJj2MR/U11xVgRXN2RuYr/Z6BEUn5jZ0yxBvPHfYhqvHE2XZd8c8yzbNP/2rY/atV+W
qfhnecBPqZSOm+bMO8ib3pJd6vFwio+2hyiW+mfeoUov2/HG+GN9f8j2EnTvoxh3ij7JlHG25XWn
Z2+QKxN5suAIhXrsPrX8UM9DWd2LT9VZCTcVDer8PKatoroJ5a/GATd7Dl7pC/hDMvRZCEZEBa1U
5BvFnTRUkHywOCyW1+hlAxmhkH0ol2BIFlu7caj0FCEmCkvuAXJpsNbMTTBy39AMUvAFQWeIYSQv
xpVGglPJ47SW8jbZCxmcLP/tjbiI9Ajbt8N8Njo2x5yElOsUenXcG015hme3cQE2EfHOlNQUhdv8
FCDbyiFuw/7JsMy6UZToVF7xNOCQ0otQI0/3lstcdENU41AkT3FX2uAwmfb3O8Yb4prEh7xk7oek
pNpUjojqlCqLMnaijIWyZbtfrFcsv8KMOuaAKgR9PKLqQSmWOsud0HE62C/fV9RHYDsEQ6RAPd/0
lypz/sJh/upgzpWAev4VyY5AwsKjwc6GslXUBs870x4PKpF0CWBQZUepBHVnKlIkvzXyY/bRHSyw
e9Z1Mwizw1J6QXiBr1XSxVZF4Cd+R+Bn+8rkOvMI3OlS/iC4sMyHRRPyO/Q87iJ93ssVshn+NZwg
xZRmyNEhJcTqs5qg8LZ+y6cmfAf3WgR5Jz2bLC8Jm1+6eBvcY/6cVjqKbua1Ys5GmVpB3UY2sMvp
iZzNmcnhSihsdcx+RyDs+Nx5FJcL3QVnXMKKkv7ec4kym/FzUtkxjYeJ4LRopWglGHY2/OfAtPVz
48++6cAHOYLJNF8rL2P4FJACMNiYMtx78FJxd2sYD3kjxpvtWqNvQ6pI2neeFfNpQGadleAo9JTb
TurddddIerND2AdjSuL9mwvvtufrxya5YeSr8662hOqux+4URdyVb2bo7bBfpH74cJR+tH4EL+FT
+rBf2GMd35o313bBk7tSB+ZVeYpI/2tP6Mbjtgo6KyHVDo9/l8fXX3i5O3w5R7QGxI/0NKhhfduN
1YYYQwM/nHUzcPD6qUZeXSXDY7cL+qtjZOlUWxOo9mSkC3v/hThS+lnk2Im138Biag2gXHU2M53L
BvPEGV180ST4s/OAMOQXQ3scA/4aC4FPEkG+uTxmLk3L/tp9CSVB4Gv9SKZPxPYKL4nva/NIxy/h
FpiG3MX6Cpk60iavROD7U1tCxZzFmnMJ5jlySyvYKBe/7uNGp88RpQvl46Eant6f/9ExJIRcnjar
/SUBHeMrRowwZix67G/MkeiJZHJ2cvbpsd2Oot1Q/1DIBLF1Uy+qbe1+PBV6zyGKqNOlR/wGkTR+
eS9UCsx49H4007IUMsuIFtNOD3lGXLkBxCts40ZrDD4VWI0BqRka2C3dYg/D9m+G2CxhWv3l2yke
Bu1k69gHA3rb9lfMm60eSt5fFkhD0agoRdWpRdupRBsYRMG3zKkJ33Djvp3z/WU/KvilW+YpX4HJ
skSlcP19SZqdaQLyudCtVO449hnV/DthXHChrcRgbicMbzINU88MyU+caO6CF2WrrAams1HYUpKs
bK/wjSbCx47rA5lsyt8SOZToFLLS1bnitEiUmD6I/ZHXolliMN9UStB3f6oHdsqvf/UmqVA8nOjp
kigeSQ+YU86G2fXs/91PBqc6jTQc9euW3Ab2Cd4G4gc08BbVC8EHb9fiNvt73IyfaPK09Azad0PR
vm+lhzTfqvM+UOOCfRGv2W5FplGsNxT+Il9/CIhEJ02L5MrfdonWTYsEeGO+EVIS2eduiK64T3+I
Z0sBv2XnIqtTjhbmdd/vxfus+kGAWHBx/vqsBqmz3yE+Q97R39E/Y3qa1cJXmPA9sz+JuA+A09VR
nhE15ObyFkayzlWvfbeJsJWuSiLjaBF8olxU6emL02i/ln1ZIfhe3O2VJe73wyfk+PtGUWsJ8y21
p0gtIeMRvlcEYfHgDIFN3DNfnfIseIOM4e4BvEER/Axng1sb2MVdA0kQymOVxhEr4TY1sq+UDlAW
WmI7YD1Iv4k1ZebEI6fxNJKietnR3ye8WRm2FzYTDiA0tluY5t7yJX0H8vSaTENPm09zTo/7CNVV
e+bAHOqJ+f9lLEBI7cUgU6JFj0aiCWTfKnDSLcGogEQzhZuDjtnEWw5izpU+xIINJDPRbqaORIrv
bWBlYISX6yUx0VhEP0da6a2y/sIWwWaakUJbFHpkmpRCQYqDFPSzVoYRY2xA1lmyAtNWUgpbUhIs
WY2PLtDvUItXYESMzRJB8S1/O5CXajIUsJ3XjFxH7RCu9/iRR1Im1O+P5c1RRIhv+8X33fbqBeWv
FcKYGcJYNgWjX1aNYHTNK0zvtUfvNXTvtUTvdTL8WPzngzAmIqudJaadJav9Tm/iSWjyNAQ/Nosw
ZkTB+MGbBjNCqf8BveWFu+XFvfVcDL8Qg17ll+b0xhF4kg1TRaRMuvVwAN/1AXXHnojcPjTO/G38
XdDEjcxTaQspcGIIPr1LZtE7o+ZJrnufOgVqQp1jHOIV1KsFn66Ezp2s7Cf5hjMON36kep3VSxQ4
YRE4sQdmvGz2T8vfn+YZ3+D0w8rkzObOltrgrLfE7XImPomyD3EOD+70I1QZ1Qh8dJtmniadFubl
gc2GyhHP6ctZ2Fx13QF4h/yjKHrzpLJgn7Pr1DvaASZCXA234WTvvCSSsaE1fJ8YGEWj79u+Eqlu
RvbTaRmMod3ZDpMO99uXTvxRi3xbkDalRDu7fSRSXSAf5RWZrWopWc4+NkWLJHGQQBUL11g+sKut
JicZo9vDQu/+aGGhcSuieg1o8wo3UuHur0KbJm1MA9cWrdK0ltrd6I1WLeKpeo9f8KJsd1MMiNwA
Fet5dzl3lCr8ZwgoUP1qtl3EEjgUQ12pwxfWK8XaOSRlXIoidi40yeZSqRSFVcn6Um9MwM6G2Th1
mdJB+lZbLzad9fDlO/6dvzV49xmflHVPGfFkMxP9ZEnw7qhye3XuTMDCh51MGS7zmJVu7BJMihjl
O3G+cH7LeHfWQzg+GpsZ4d8E7mjmhLcN8dSLHwLAzhobTpFHD0FSVr9LppbIoDPXLv4pWl0Ab9vr
Pwy8evgec+/ybuqcRviuSTu2iXGq+GnW85Xu71IAx30lvJW6gSeTBFvBgHMfnKqwenoa5hJ2OvfZ
lsfcX+str52rPXdMf9ZVNLaSAHt9Jc1l3IhNmbZwXgstnjmPz7CHPnPS0U1zOc3lbognk0z/1mnU
2UsORq6EDibhSs01WWTYjgfc5666Wx6YfUoIs9XpFDsoqcq0JAqkftAda1ynVkV3GAHfE8KpuTQj
NXc28kPmKNlEFXxiqMsJYsoTCg3RVu7dl7Z99AhAzqrRXhR2AQX5xxNDZ8MQSqRfFy6bA19KlDNF
DlfI7+Z37MlBu/yL2Jv5O1KhydHpLwD8qXLPab1n7v22He5DAx+ecashfu9enwLMO5B61Xoi/Zxr
qWwHzVwZWo1fLP4dmbBSFop3IGUr+j1V3Db7j1YG3etWVDkILX/wlmxSq8HPRdCOVZKXQapq1wk8
aOpfDoNS6yn9Xyn9oTAD2PToFzFC18xukFqaU+KWVyHdwo+fg666aYA5mQjm8obT7UKcZANdwM9+
adOvgT6Q530KXHrLLp41X+Pduj8CXzynNKiJDHz14TqppVuW97S18K6ETIxeFvFJwGGuG8WBPhAO
ePdRLu3l0ooudyOlVX8CnAf3TE4vF8cIqsj4VrgYD1qrRp6qnF3O8R8vz/+a+kW93bf9Yt1N3jPd
I7wacsquYRnMlvgjsruUdVn7iFWuX7baE/5mtlgdrFGlfG4mdBm7aHX+Mjjks7cjzH5K00efDSkC
3/n3UfgyxKWRA4Zhi+keUEqWyFT1Y1wuFaAwVmebRFxeBdMy0yjBi3Qvft9yPiy6QN8yf7T8LfvA
4GEPqcpe0HEvospAMHsYYPAP+RpngtFoznS4HX4qwKct1L5UsGjARIDGCG6lQUR6l0iXHKT3+GJC
9JjVctffzl/D8gJAWvhzVuSt5vNtypauOQpuI+Tao3OkqeHXEyiJamPOZdf1rMRbiaH/bJAbQSTg
9TtD3Fcbso1LUW7rLoM7643okLN//8ws7lfks+4QgN6XgouoIXdKaydKi7Nes+9WDYRBQ+QVF7Xx
MSuydl/7uK/ZgKFjcV5OBHbpOWjHaOVaxA+EyB6RJGiE4498JGhEpthg9OIUQswrT9N6cx+ZMAcZ
siukS9RkDVSegngPqG1UqlyyiH5s49mE3WBizOKzIWhZ3T4Vqvpc9Be/PRlxDJCrrCFUbZCsqDif
pqB04g5K4mhYMH1hRS7uismeOVR+hgP6D3nYe9XSn8rD7pUoz6LjgWZZb/hB4EYjuM6iSxRD6aB1
xWWc6LPeWtEBCiJ5TuK+0yHSZmbVkA4yY6VfWn8vArtixsyIovwG27t9fmcr2B5+O3BaxZ9/470y
eDYxFV0FOck/aOu75/BmIZ3EOxvwSgGzF+WvAm+hzDiIgUKkflspDMTuQqRmW6Dti232LeGlbL07
BF2+J/l5+pPZBvpeDeKbwAONIk09Pwmz0P2fpj5/isBfF26fsdKaOuWR0IVKXcHZ861fD4A+UfNy
4LK7nSeNKduAO7czl46iKDCwYeYh07FGuOTBFuvubFndJ5lbbSN/IuhAzycb5OEkmMOERfJPsyau
haeics5olnvkoBmEkxVwF7+s+NYA0hI54SYdF0nRukM6p/2XReXOCNK5c1+9WnwIxBlKuCs/L3hG
caf33H85j3y2d+cGGSz6gi9aAbVKCMlNRKtPbvUvKUKDBnYxgGRT4WW11eLTo3MbYNKK6ZQzgJe5
5qvrWDPpqt+9WJMNiwtP3CLu4Ibh9v3S2JpoXuK54upB88WpxvnNve4DjMBOpzXeWnLNGYjhnKGg
/bzT5qF16BTiwZUYallglacXtLR+1klwL3dv+NDeseGDVC19mrzmfpXWK3zcaZXtJFKj1PJ12epX
4MuMcHH6pRf0i8NLnS/+gonRDNYl78rCrblg9Wm6V5qP3FTDxaH0KdArq68Ejzfvdmexa8c2WvsN
OgtQQNywglGdzBd3Gx+t/sbp0EYhXu1sfqIpuB+tn+m+e+L2qh9t1rpPOy8UrbqmZNfbOTHg9s9Z
9qK3859K5QMvo1d2wCxcTQeg5LkmX6UruCXiBemrgPcz7xaHUw8GmIYk85nzXNr8u7r8tyKkXL8P
lNGu3I0cu7xK6c9LkRzG1GjFKHedMPewW93BEtKp5D0mEOaSXmAw6TxC9pYfGFC5mJx+KgiM6JhY
t1hgoFkEnkLdk4Xwqu0R4k2QvGsKJiu39FLVJ/39jqDMHDVm3vJXfdKbIUmgd08j2gVm1fkcWmsw
c1cRwJWRuMMnUOxMOjmVhYiUYH3Q2kxaFVOJisDTjeLcp3xO+POrAwZzWPWWQC+JU9ZH6lj3WfV7
+a7oxu+WK66/BzKkt6wjAcJK1zksfwWtBU3RQwwlBGXIR4I7JepyWeLtDqV/cHMGmYsbkS1Na31i
lLm4iFRdbnWsnTXsSLBvhrk4xw/uWyxKojQYgAOuRT7fX6V4O2vUTyn40ylXl+t5uHDIcwg4/Pi9
G59xaPQ34/Dgh+ItEiWNV+SuRJeMS55RXlypubrEJ1DzzZjGYb0hjoRlfeObqY7LsEYYCetUdMkr
VMeaixwtqQfr3LrGYVV+io6fPTw/uBswLZ9jZppKspVFRIs/a1coaZ6pPzMWdjy+cHN/uxK1bIk5
3qF1jA2VKMqd1x6J+rtf16Q8Xjk/bwYa1Kh7rM7y5PG9BRw63/jGVYr+0pnKprgUxZWS/5u4ZX8b
/wYgMA8ksKBOobMMTjXDTbUgb0TuC40U68weOITukP9Sg1sAhbQftYXVna50frPP2iJiGQkxeMhl
jLYfjvEsArcY0GJKrh8GXeRNwBsI2FeCEFCECmEVyaJ+DaX2vLbabLHrphwP1t7sFeimGQ/o6/aX
+1x/895S/MWDh9pGgDIMvOqCaB94uozpTvnAYkWOeZYzB8fLoL5a4D+hJMgP8gaFB7H5BkU60BMs
aI2EFqk4qnAdmplLGAVgJKrAFvaGWsYxPtCUoOIPMLKHZ69+CMTxFr/RHQ+B8fn9aQFZLZszHtOJ
gweHozRBV2yireFVhQJivb/+aYx7MnLeFLDiWcdqivXqF7jqWjH3pNIEtog9zBr+/SJTMlm+W59+
joLEAWuxTjHu6oVu0ywfczpmLZNCBO0IqdiuleLpFZ7F9/e3Kz8jHBdcFvbPf/M/pmYiTGKLjvZ8
dDxVC3Ss53RlCmC84tfN8zbHsciZfrgfMv1MXIdY6iO3D725JTUzz+slX7MyzcY+zPwmNIw7HSHv
LVOBRBYLSqWk/rFsHEfaeFOLe6HblgKumRaQl9LOGVReWxqvpNnlBuCdxwO/ncgL49ouALPTWqRp
2IdQoZMjrMKz/8LloKWqkuPIw0SIHehgEaFkF4s1mpmg1SPI3wGDFCwZ7Qj7MDo9luRf+7UXKexI
9YzXLGLqaRbrpO8ENXd+nPSaeccRJAqRYBaxUdqh7PPYUq3i6GQ1mjHXEO4jn/S8Gr+NM4EyBe3Z
Vgbu/+Le/V1+wU9UYVMzhzqKEV1iHNo0TNxxuhgLay5egnALJbGsrt05pTQYUOx7sMw9h3EL01wU
OKVvE4VbfJnu9HVLX9tDzkiN2NpulmAOkjuoO/Q9oUzuI9lDbCGvCmQ4oG+ht66Fr8zYtBlhRHJC
pnFBLAZINvR6tnwBB1kxeZKr1mWPY3mQVwXMtzhUJZ8UM7SIlgAJR+d69Qn3mPtUcHh6oyAVndRW
kXmGmFzGzJlPyLY0m7leG1apmwbOnIDcFOOajB0gWr0Kpiwn4nNzuTxp+1IP7mX27/X2LSDvFTa9
2sqErDqNaQ6QWjOu4I3dHLdcaKl8VVT9CPfc/LD6oneDKdIyPwFSvLmAY9uXjlXrNus28zbTNkRv
pmCM4aaopaoVhy8H9HY8ovupqitMvd121AKcmgX6XJbIpAwr9tNtINcVIeqV+y9VJaCQTbCCN6df
ysgeVrOvcKrSDseR5Dt8dkhXD97l0BPWN4vAnSc7AT5gnMjEAitOe+KBp0DoIPB3n/a1p8jGpLto
OVND8sXWSwql75ebhK/bIU+2r7wiI0o39YLjur5h53sXX75avNq90nf1bFjFQIlrUKdvWNLkOkot
7bDuJO1h1xjMbbdnMFvN2LqgXnrGrMfG+BeGJiItabTA71/nueoyYxwMeApWH5G3ZIz8Zdijb0li
MIkvtD48Ex2XrbFcFD7bXBGjo4UQmRgm16a3u4APEKeqDSLbUZVwHA1vlJv/s2PImw2xh9tjSDXy
SARwCVlFsT9NfNkTfaoTJI/BZGimUzJGolUa4XBq4mvRM6SsQ3abxK9zXS2RPw8mYHzQxdvlspvY
5SohSF5NaNol8YzJihMQS4pYrNJe+vIPySctXM9U78Ad5pVmfVwsEh0O10ZGBhuzUrw7MUIs/G+0
PaYBg7lz+N++XSTpILF0JVrT8CDMXP0S7LIUNbHK7m4cFWW7E39mj6AvWbViIdNMt/8MV2ByjfCx
mZEoekumGeTh1XojWWkYEccYMTW/LwQqmMgtYtxLUCRTSYXV3lqYLIEUlUKvlFvDDWthRv4HekCF
vxWyJ4dW8K4c21V2CO/MofsP9uZUixZ6ReTI7pz9vTn0Ht6bIyyyq/v7czrpqffdo7Mu3hMWxQcw
13bYaLxLh42WTMDTCuBrGYz8CKNKh8E2ZlinH+3cYcFbSHlMrJRgi93ftbO/W4exSCfF7P2dOslk
r86jnTnhHTnjvJ1EU5/89xXmv6EVJoNksqshHhBZVxFF56A46wrImnXtzao3q6ybIL3WXnK8Zd16
c+XNFesOyJ51D5+jjSBRdBQ+V+Wp8tCxIPF0fHVudS6dBJJKp8J9DDFlMV+De8SSFQ0iKxoDWctE
kJjXSNYyh8gqxkRi3kiyijGTVcxTZOXyNFm5RJOYN4bEvM+SmDeWrFmeI6uV5xEVa4kVyTORfYdW
C6KsQfiENYq10/hcyZ7V92G0tM/qe90IGvUnNDakpcMhfT3+Q2oSaOr7aEZIS/8/e2cCJVWR9Puq
e/PeahZLwUZoRARperBlX6VVRFlEaaqrqtseZESBxn7IoqAOICAgg4iMoigCowh8/bkwTguCiMrm
hoC4ISIiIiIiA4LtAiiyFC/ilxdokTnjnO+8c945750+8a8gbmRkZGRkZObtsl0ln41/H+Wul8+W
AeUE1N5S8Q32M/cboe+F7yyU+1vKPSKfyX9P3dICG90DUvt9T6H+p6HBp9DQ/4BGCY07DU0Umnwa
mnoKPfb7KOnL5xyhp/8FlVpKVrbUdeHvpJeFVvxrSlaVz5W/jxKaO2sDWhfQRkvJGvYzIfOTrC38
FqHtv6WE5tmuf0/JTKFs4csC2i906NeUGzoN+adQ5f+AJBa5NU5DMp7czN/SqbHOzf591O1i+Wwq
1PpfkDzr1k6oY6B36e+kK0+fO9hQm3H57PL7qFuhfMagiXwWlKPjOn2Cz35Ctwjf42Rf5anbHQHf
699TtxFCY0+xUXwKDfwtdZsgdL/wt0nd6Ws/u804vT//koYLjT4NjReadBp66NfUbdbJ2v2renu8
Xh6vY0+erC/dnv11/TiRJ+Xn9fi8HI/R8+Viu/jXPp2oKeVz8/gaPr621FaQ88mCU/Ja53OZ0BtC
a4TeLx6Xpz7I/tJts5XrmHSP6LatmL2kWGpst71CPwodFJLxx3TfyrXjjcleFdO9SuYlJm1j0iam
dWBwUNMlDrEGtl7GGlu7MdlPiuV5TPaPmNSUmNiKqa3uQXyPx1Pa6j4Z09qvNnNOxlltxYZaG/os
JrU8Ns769Zt5OmWOTuwnwTypLd0bY1L3YzJPsanl2ift3Om/YxL7mNTxmKy7WGmgY8rRWaehU/fl
BqehxsUn99dye+wJ6lyOTt1jj++X/5N9clTxr/fCicUn98By+11so83LmNT/2PaAl5yLlQU5K/kW
k1oeO2T/nRcKPqVW51W26zavql1POq48qb95Un/zMoN1cXwdBHVRa2ledlDnCk6ukbzWtn5p+xM1
8NS1dcq6OlFfgrWVF9Rizf+8K62PJ9r3sustT9rnaT/Sd57Uv7xe1m/qkowhT+zlDQza/bv6c0od
P63OcZ9PU49PUI9y9K/6+jf1VOfhV3RqnSxfK8eXq5Hla2LToO3o4Fm2rdHJXnaOk8V2nEnpLyl6
yeFWrjUrIbmTlHacX0ZZ3aT0wXlDzh1JrXXbg3r2UJCbwZkgOU1IaoLu/8mSoM7NtXaT8yzpGk0u
Eloi9Jqtw0mpacl3g/op9TK5Pmi7qfjkmWlduTo676QNzlJbxe+VgV+n1uFTavCJM8zxOjwvsLGj
eFz8/qDN8fa7bG3m30/bGDC2bwLZnHJUehr6PWfBlcUnz3Trik+c607QlnJ06rnu+Bntf3I2q1r8
6/NX7eIT565f7WUrgrY1Tsbk+NrKmxR86rqbVnzyzBOsqzzJibySgCQf8iTmeTJ/eTJ/ea8FJDmQ
9+6v8z1vfUCb7PrKk3nOk3nKk/jnfX/69aa1Me8nIbnbxB2htJPrLR4tx6cHVNOSrr14HaGs4LPh
yTUYby4k9S7ertz6kzHHO1p/4tfYmhWP273nOOmZMi7nufj1dsxxObfF+9napfUjfovdU47rx+W8
FpdzWFzOYfEJNh/jDwvJeSouZ5z4k/ZcEH82sCPxi8uZJL7Y1mOd/7icIeJvBLTGxlxjF9d2G4Tk
LBHfZmt3fGegL2eIuJwh4gftGTCeKj5RmxPm5L6UkPNE4ix7H0nUsneKhOyRCdkjE3JuSOTYOCba
2/uI7t2JXGsjkbTznOhu11VC7pAJ2Q8Tsv8l1LbsdYlRdn/n2Ti75pRXvxMyrwnZ8xJTre8Jyb/E
HDvnCdUrteNKaA2T9ZZYYWvCiZorNSyx1u6VCVlnCb0zbbH1LqH+lNnc1Xgpn9hv81lzISFxTYZs
HPXbGGe8ccZb///bGP8vvSsz2Wal/kbVWRuaHwpF6ghlCTUUai50sVC7cp8dg89rhOJChULXC/UR
6id0i9AdQiOExgpNELpf6GGhGUKzhJ4M6Fmh54UWCy0TekNojdD7QhuCvjYLbRPaWe5zb7l//yh0
UCgVCqUZoYrlPs8SOkeoltXXz7QLhBoINRZqKZRT7rO9UGehXKGkUPdA/wahvkL9hQYLDRUaJTRO
aKLQZKGpQo8JzRF6WqhUaKHQy0IrhFYKrRVaJ7TRjitti9D24HNXuc/j+mU2pnxuDtr1K/d8v9Ah
/hffoQq+kKzXClVPfmp8KtQQql3uM1Mou9xnU6HWJz/V5wqXCl0ZtO/ynxFzVp6usaT9/8pejVMo
JlQQfMZ+a6dCD6FeNt4VioUGlvu8TWh4aH5iUuKhxLTEzERJYq6SPzwxL7EosSTxWmJV4t3E+sSm
xFZ/YGJH4pvE94mfEkeSTjJNfqLJ9GTNZJ1kVrJhsnny4mS7ZMfkNck4VJi8nn/3SfZL3pK8AxqR
HJuckLw/8W7yYX9gckZyVvJJ6Nnk88nFyWXJN5Jrku8nNyQ3S7ttyZ3JvckfkweTqXyTXzH/rPxz
8mvlX5DfIHlHfuP8lvk5+e3zO+fn5ifzu+ffkN83v3/+YKGh2iZ/VP64/In5k/On5j+WPyf/6fzS
/IXQy/kr8ldCa/PXQRvzt0Db83fll/nD8/cHP4dOcMofKggFP778VE4eLKgq8i32p6BGQW2hGgWZ
8pMtP00LWhdcmr+/4Eqlgi4FMdkTMk77FxdCwV9cSOMvLlTkLy5U5i8uRPmLC2c5+hcXqvIXF9L5
iwvn8BcXqvO3FjKidaLNQudGW0Q7hhpFi6L9QpdHB0aHhDpF74jeGeoaHR0dE0pEx0fvCeVHp0SX
hq6NLo+uCI2NronuCY3jry88/X+xZ+Fw1fBgvq+yJHRRKFRvY0Cy0uttD2hXQGXleCVZ3fUOBfx2
/R+3Wz7TD6hyQLLSM2UFZcrqzhSlzGyrm9k00FdZ63L/vjT4vDKgLif7zIzZf2cWhC5K+PJTOVE1
USNRW34yE9n8NE20TlyauDLRJRFLFPDTI9ErUZwYmLgtMVykoxPjhZskLbKD1WjXo67EksQSmasz
+UsbIf7GhsPf2HCjzaPNQybaKdo55EWvjnYLRfh7G5WjN0b7yDzcHB0QOi96W/T2UJ3oiOhdoQui
46J/CWVFl0WXhRpEX42+Growuje6N5T9f9h6OPUnc4lgD6+/YCX4ivAt4VvCt4BvZmKK3lj4OwSb
e9PhL4HvD38RfFdaNRRsHFjLx9pofYr+9aaBopfUbz15I4RPN5mK3p8FF6IzW9sehT+6HDvjkA+w
XgW+tcPy7fBdkMN7vRX96cgvQ1Ikdr5UD49u87rjbTtGZNtehM6f8LYVNovg28LfjOcdGF0/2irf
zD2GpBH8l1ioxNMuyAdhuQPyIfBnwl+OTmN6v55ezqSXy+E7wFv91ugXCzaFbwrf3OSArbGABGyB
vA1RauMNoJccdJRv4c6g1So078ByCfwc+Pfh74dfpj6k2qPfDnkrcLxgE7AF89XCdALb0qov/d4M
vhIKOwO9yYLtvImC93jSuzMUvjrogpu8xwQnqGa4CvgYrZqDIUV3DJol3l8FF3mPC9ZVSXiH8uHD
PJ2Jfk/058C3BNOxuRudeuYdwVrmLcGk2aC9KB/+EFyNvNh8IhhTzXAaeAOtHPjlim4mmkXIB6l+
OIWFl+CX87SQpzXR70TbneAv5laR53qqedDcIrzvfaTRUHm4j7dW8GsjmePUV53QYW+5SKLgnkAi
6F6BnfpgFm0HgjPAut4feNpbo6ToHIbfCH4NTjfX6xxFzgMdRf8IuAFJfbCn9DXaziCa9/hHdR7h
q1ukVXVaVadVdXSe5+nzSDYhmYDkvzQTwlWUF3QU1YLgBiT14Y+SD5KfTl/0R9G2OZIQfMjbDqqk
AViCvISxLIJfZHk8XISHi/BnkS/Vw/2AcdUlA+ui3wqvdoCHLXoPa3bxdCbWZmJtJtZmYm2mRkky
UHxw6de1PabTKp3R7cbabsb1i2x3gt4OcA04HzzCU1lrbgbzeBDNzWAZeNBbT278pDmjEllHa8D5
4BFwvc4y+l9j82sr0VbhM/CqqfKhw6ojGbUGnA8eUTRSDZywzT3lw1Gs7fHeVFRJ6HCkB/pfqj94
Ul9H5BzBhywkWUiy8DALD7PsU/zPMmUy0httJnv7NYfpZQZtL8bz/mBdfyg6a8D54BH6baW5rfqu
Z5F4fg1Ox9p0IrZWV5ZUpBKyegW5apEMhF9kEcsz4dPRT2fe01UiszOIyIM6OonhIMbLmlWU3ncQ
f5WUkj9twaupgRneM4K7/VzBycj3KYZBWR3PMMt/19WKZBOaPVkF6WBL7DRXdCfDl3jT8Fxaua2w
/yBt26P/JXxj8BWbz1TOl6iiX7AKIir3D2lu+HM1bt552tYM0Oj5Xyjvx5R3XybzO5PPHytGjI7X
n2q2qbdk13jidrv6I+sxRsybgBnEvAmYQeSbgBnEvwmYwXpsAmYwF01A1T+A/1OwXIuxD6S2LALT
be3yL6JStRSsrZ6EDysffp2ZbRe5UCsY+i78JlpNsDUKzyewfpvbOqNP3TGs6zHolIB1wctZ0Tss
Rl5UlLu69qhPe5I5PakMc1Qie5Pa78LTlrZK0HZ35I9kiKwCpwmYYz6lOqnOZUjqmy9Ygz8Ltme9
/OjLzuu8qXJZET9T+WVFhIvgF2iF93ayLkKq7xVQB75DkkHNWc1aqxCRehh+lfVimP1DOptSkb4j
z79jpX/Hyv1O12mArEH4DYa1qXacQd4PgmcqioX1tLL1RytMGWMZrT67Me9VwTxb69gfBzGuPhE5
QTlj7Ki15ojlq3Xsal8qT33dARnFFUE9XI8/ijMs+o+A+6keczgtaC06zNONAWqVyPf/Qg1pxZpV
7BC5gJ36C2rUF0RSdurwSrOVvn6gfv6skeHpi2ieC59N5Wzi3Sv8N+Yawe/NAOZOq2gr+m0FHwEf
Ybzvg453QEaU5g1mf1c7LTmlZBKrjvTyEfgu+u9g4R1bOek9Dh7QuQg3oHL2pJ6/Bf8wWOTJCdPp
jv1CZq0OdnYgofKHN4Mj0S/VUYcPmdsZ40jBbLNR6wk6TzGiPepneBYW5ujYvVYaJS9L0Z2uOSl1
Say53ylvhsEPU8/dBLOcQaX6OahUmldnqzX3fPVQdkMddVXG9bnZInwz87bwzyNpjSc/gHfhw2bG
lQNfQNtOZqFgR6M79VTlZd/RWG1BM8utJvy3WDsMPou8AxbamAmCP4BdPVnjjsG38+jxJfTnmdWa
b9g8BE5AfgALOVhbD98b+SpvKz5r5t+jpzU5lQ0TnKaVXOQdxf4f/RaiP8TomuqvKOdDbdWJ+Dzt
vc26G0kGKr6lp3ennv9H8BIwG6wIXgdOEbRn3SSaLcGk31ArnvLhDwPMBiuC14GqU4z+ZKxNRhJD
0svTGptG2zTtXTAbrAheB6p+GzRvQHO5Rc5yRdgpwvNB8IMCPhusCF4HFlJnbpAoXc7ZO4XNFNZe
sjbNs5rh2CnETiF2CrFTiJ1ColGo1txOqunmgdfh+U7s7IRfDb8a/+v5HxENi3akH+EV6FXG5ke0
vQRU+UhPbnxOFKwmd3qthx2oclIlnDzkf1MMr4a/2evI6lYsRbIRzWqMtJZ5XnC08o6j6HaBLwIH
aSu3iqLsPtq2Kq2WY38vksG6Ep1C72JyWGP4kEbMb68j9Vcqmie0lflZT8jeHuX98Zw62hDDEcTW
Qb89bTexfltz94nrfVZiVUSUiohSEVEqYqaKiJLyb+FPb/Rd+HrEeZCiRI/s9fI0S/XmLqPQveBv
5jWR1Ary1mZmRbLR5mQ22VVR72vMaSbyImymwJcC1J3upchQ9FWnps6a5ENDRmfR5kNDdLJ5OgXJ
FLz9s9TY8a6sx1TM3afo1Q2Fj36g7z2OfuDdLfqP6w3dXev1kni21QpvblLeXQA+gnyud5vgbNUM
oy+7v6A5n7ZdFf0BaL6ubyfMan134W7DwrX6PsScxdMXaPWUYuRc5Odg4QhYin4vbqajdd7dF7V6
u1vhrwJbKJo6ep81F7AvT0T/VWb2U0XvSXRaKG9qqqZ7H1XlW/j+PL2QpzUU/Y5YsDfoUrALfV2u
NdCdrW883M66z7pfcSqYyL1gpZ7b3VV6I5azk+iEJ2s8wyVEdRSSe/SE4JVhZwW4AfwY/BQ7O8D3
wWHmGPLeeppV9F6HHw2+wn35J27HL+ipz1zO2W9pwDuKenIT3ICkPk9lZ/HbEP9BaFYG2/p3Cr6G
hfvBby2qBcENSNTCAjQfp9URlZgjSDh5eo+yPz7KiXQlOBLczAnzQ06SKznHzuYGndJTpeSSnpB3
0mMB+KJWWi8Dmxna1hsBP8LyakdwAxKx4/1Fb8oRh3G53jmC3bDzDX521fVunsNCNEC1E8VOlPg8
x1ie0/h4bZWP/Nn/GzhccwM7d1okqhWwX6pjd4dyxvvEop7fBNeA88Ej6Egd8zsw1+PQ7OzJjcOb
7p8v1i7Tm6a7WOWmukW1IDgfPALGdHQ85QbtrlKJW0LbXboqw1s4J98FTgPf4Dw5ljvpvdxJ7+a8
NJmzAff0cJmeAJ05WK4Bv05vzW47L6VrB3kLtWO2q/+Gs7e5ySLym/D2Jry9CW8nq1fmdr07++/R
KsSJsRZj597t5oMvc054gRFN4wY9hZPYu9hvZJFeGtFLI3pphP67GlVzr/blt/RGgWt4s6GtqllE
kkc0fiJiB70vWAs5ZLVFzc/GeneWfBOJP9gjN+BvZkR3sqbuRP8TbzczYlEjXFvv0caoxOtjluGh
8mPhq+F/NSRVycYZYHcvXazt0Luwd4U/WSQfqdybydNOiu5S+H2qY6pwd16JzgbV9yqyds4Hr+Mu
/By34O8VvQw9p3kjtJXfjl7aY/Nt9sfPsbwAa+PAqN64zWKePsVqSgfP1qcVeFOU1oOb1zGt0l6R
1rfI69Twzso7n3E3b8OaOsJ6mW1XMRIfC4fVZloPM0taVWEX+EU9lMjr7BzVe7TUqwzmpQmo9+tZ
3K//obxoNgEzWOlNwAzmqwmobZ/ytQ5swwfeVJgCv5bucdSr1eCd1JBMvYmbL/X2bRYqyj6o2bXW
f4o81zW+Ev4Io5hN223UxhdV4q/XWuEPQP462Jf6sI2214LfRpqBE3QHVIkX0YyKnIv+OeBT2KSi
unP1rm2u0nuH6Q2msyP/0ZtNdu2HF32/O/Le3L+WcuMrYq195Wew94nc4yYra1DvR29xpvpONc3d
1IHxetqPPMZ6PKjz6Ocym4+qxO/gaXxq6a1WMlxrGu/6nNmKkcd0D3LX6+pzh+otW1BHsRh+Mat7
ovLS1qI+bcTT81lZlr9TfTAttBfZW+VGZi7lXvYJ73M2KMoKms9Oup89VG9Mw3Qs3vu6w/oFVNcf
OAmUcIvpx63tF72nG949unP0hu7cqxXe768+e2XUhBVU195E4GPlnR3g+zzN988EB2uPmkUyFzt0
R+bpaLCMOvMKrXgL6lbXO7tUpAV4vkCrnC85b85gLhqBfZi1UUbr7VvgMcb+NbNTGx1u9+4U8D4w
gbyQG9wGHam5Gkk9+FbmA+zrvY+4hT8jGpWJxnncxMfrLd6MNHvFw5to1VXPV94usmWl+RO1SMe7
lLZLaduVbKlF5PeAE/FnCXN3LvfHB5jxV9hl5jLX7ZDM13uE4TZqVqDfGWsvKHofwS+itvvwo7lT
Wws54Di945vPWctn66nVxNVPz/NmasXAz8fIliWcFce4q0S+QyPpf6xZKjuR4gRF85XReXmKOj9S
eW+3p3v9i+xWX6DTj0p4iDrZh6dVFd2/6S7pTVIP/W5E4HO83aS3flNJb/3u7dygv8WrGKM+n3F1
Uq+8d4jAH5Ev1FG4bxi5NZgn9DduZqb7KT4I73+C/Y3o38Qs36TvASTPtccPkdeDfzzQUZv363sA
P6Ro5ujbAJNUuT8MH6agX0vfBjjfY/8GMIn8SyzElfcega9ve+HtXCNWJfuj/xmxWgJyEnafBUeB
dj1W4xy7nHi65jPhs3VXclcSvem8/6xKL7lgeyK2lspwlGp2kPjcB15FjjXmrrQEbB3wl4DZYEXw
Op7K3cd7gDP8XjT/Cr7ozRX7OfCNwMkBZoMVQbVwFZq1uWmOUYkZg+QcJGXccCdxx5wDXgeu4y6P
P84z3Pge5t3Cfr2dyVqTVs7TaO6n37v0xGtKsFmibc098DsDvATMBiuC6skP+k5Abr43SCQbMcaX
9Dfa7j+xmQ32Al/Xm69pgLX7ArwEzAYr8vQ6UCJmPlDL/mv6Wz/Bp8XCm7TKDFCjtBDLXTQaEuc8
Iqb4IGOvre8TZBQi8T7Xtw3Si/Jb4DPpPVMlZh6+Xaro7jNyv3aHmFd1XXj3U9n06UGeHgD7I7lL
b9buPHCASryO6A8ntueD+xWlMjyvuzN8CbhTW3lHFc1GbBap3L0Xy3XAvdSH+8wiwR48bUWE54BT
VCctSyOQRhy8B7lv7mP33Kh85Fb20Hk8fYAIjyF6l4H3kGPTsJClNtMW6onIf5jb6FKzVJ4OD3Jb
7tHu/CA/i7hDaebcq7zYKWLGi4iw8q307YQZRi+z1I6cGxtrJpC3NcFM/JlNX329KoLNFd0Y8RzN
nG4FB6A/Bv0L4Icx+9eqxM/UDPGeRN4CrIGf9ynvfIuFv/rXgz/q3KFzl86+35Gny5Fcis1SJAk8
H0bMX1e5/5p/Bj6fQTT02xctjskuEHKPvQ3/nH5/AGx+7Bn4C8GJ+m2E4OnfQb5LcGwEvMUa4BTk
tu08+HlYKwU/R/I5/CZ0RO4MPKbvPNuB94BDweqgC24CJyiGqyiGUkiagyFFdwx8CbgIrGv5lL6v
3kHbw0hmgj1pNQe+JZiOzm74emAtMIn8Q3A1kmIwhiQNf75F4iBZjuVMJEXgIOTW50H48xJ8IVgT
/U7o7AR/QZ4LfxDeh28Ifp3SeliffhlROKqS8B7sXIF+Flgf+Qx0rCdWfyM4HcnAVBvNVRt/5Z3q
4Cbwv2zM4fvamMOHwBJwUUrX8gc25ioJTwUP83Qm9hfZccFnwC/kqQs2tWOBD9uxYOHMYBQq/9KO
K/WeWLgRC8XIL7ajQ795qo5I+qQKGUUhnhfiYSGeKKYj/wW+rqL0W4jlQvpSbEtfVxPPc7G/D6xJ
LzZPyBl3Mngh42pFqwfB9ik5n4Stz43BV8CzwIhipIaiP1XRvAe21bH7/408TXn35SCH25CZN+lv
YG1mpvT3Vgfgp6Qyhf8p1ZrZ3Mk87iT+iiPtLB/drKuM0bVLDdFVBj/U8kfXwlcibooTeDohlQ9W
IpIqjyNvTqsQfCjgK+kaRFIS4BBQW+UjyVdJeAfxPxzgELASs9MZVL6nPnXnoLM7QLXWhMjvZ0SX
2bWT0jdg7ZH/GGSLRMZ502bF0cPCDyOjFqjEO4TOEpV4NVhHVx/lewtEeHrqLD3tpy7WdXpUz+pk
YPgJjW14MZLRimJZb09UADcP+weJ9gw0p5OZ9bD5y1H9jUDjlO41uYzCJxq+5Yl8TUZ9BuiC9VNX
g5XIT5VUIA57tFWIuLlXBBmrMbwRnIHO3WARkmGBNY3tufA28tMDVJ2VKdlTnCgjfZH42JzPxv9v
iMn3QWzbCk+eC+pbdDI5/Aj4Pugw9jc0huJhW1Al1EO3I3Y+At/FGvU//KnqhMrI5HqpeoJx5DOQ
v6WS0C7kZ4KVmYVHg7Wv89Udm3VshQQ3g9+kjjDSi0H9fQ07SPh1sBS5zQpbJ5NY3oMns5A31Rwz
5I/Zofpe1jGJiWvr54fqj/udxtAMgx/GSBM8tbXuZ1sHdLyC6u3Z6JyPvCo6n8M3g38+qIfibbg1
kh9AW0MYl5MDFoDsHY6NLfUkvAVkVwo/i7wD2AbEmtM1JSclh3rinofmPJB91lkP9gYnIn8ITevD
UiRTwCPg28HepLMzzfqsvHkOfhSthoD97e5GVvjkWEPQp+0O+I08bQW/IMgB5UHH7sJ1kHyIpB3Y
i77SkG8GlyNnd5Cdd534T1UPp3g6EnlhsFoLsVaIhULqRiFPVbIT3u7a1UB73rgZa++Adk+8DZ6T
Q3gJEeuC5ufsEVXsjOvu4NSGH4zmF+A2Kn8/kDOPGQCyt3pE3uek5Np5HMQoVh8rZnV30vjYWbPy
YFy6IySpTsvBy9Gpd3QX+0ghOISqrnxnqv3X4IdUjBjyWOpysBLxqUT8VZ5NDVlOlJYHvO4FTXha
FOAQvK3EalKdl4LYdgZV3gusSeXPw9rqALVtB3AgvxnZx29AHudt7eMR3fGbwjf190jbZvB/4Az8
DN8dyuU3lTneMR0X73O+Vt75FP5V7uz22x0pvoNRj9+frubW2Z3fsXb3r9WagHyP8o7l93mdtKbx
u9cMvR2Emjs5wk/y9M1VS3Oz3vHNfwuuVd5ZZ/T7JAsV3R+N3gc3qGZop2K4H626KHorFI0PNjb6
VrAL1pLYmcu7kXbYOaI6fgFtk7ZfRWcz2NHUFDzojgTl1O0Www9F3l3RHexuVbnyofWK4YY83azo
paMzHix1HxB0sNDRhBmLykeAWPOm2R7BreBYcKGrb1OzFZ2p8HW8HsLvUD68X79RLB7KjcCtrJLQ
GldujqEtis4ylYfWqL7XmbbnWAsqd9Lcpbqm3MVa7d0S5NqqTJ96FdGZC5Yhz1IUuVpoqejNwauD
YA44Vu043QOfRT9sFM0mRTcJluKh64QV9a1OyIF3HEcl4RU85Z4V3s63pvdqDjuTtF459+q4HP2d
8izlw/sc/Z7eRkffLd/vjBac4Eh9DldR/fA08DHQVXTHYKHEuU9wkaMZXtfVbx+1d+/TKqqS8GF0
ZtJjT1rNgW8JpjtporMbnXqOZnst52ydWUd/29hF+fBqsFT/H45OzKkInqMVALwNfAiMKrqZWChS
3hnk1NY15UiuOrcq71R1Pte1j3w5moVo1qRtp7CexBys7Qz/Q89O4SyR1A9/I/yGsKxup0pYv3no
Kh9u6DTFQxlL6JBJ1x1Tn4Y9cJLTWiXOy2K5K23rg1kBv1kwohg6gLUZYFPs1w9/RQwlPs7h8Cid
FyRfY3k6OhHFUJm2Cv2snjifhkL8Nw7NFP2eivr9eZE8D/82/AH4m+EflYz61H9ScBR4qaJXSdH9
J1iKJAOsrOhcAD6Nfi90+ij6KXQ6gTfz9Er4u+DvRnMN+BPytsiXKkbaw/cDG6DzEfxV4MVI3oGf
Av8g2B3JTPw5C7T9evBH8KoLktXgZlodhd8K1kdyKzgSCeM1rWg7Cd7w9D1wH5Ku8NfBR+hromL4
Z3gbvU+wMA6dbsg3IW8Gvwr+beJANNznwLVgY1p9Ghmov3ew86K8Vwk8z84OfAZYGexgZ0d587ad
I+XdPuAQcCjWRtuZolVdO1/wt9mZQnMN+BPytoqR9lhugPwjfGuBPmMxD9jIoNMb3rUxUYlzO/7U
wnP79BDYgyitgB+MThVwF602om/nsTZYHW+Za48oeTYHrOePgNarz/Dc5vAPaN6Ob0uwXwzafOtL
BuKb3x9N+nI/AN9A53rwJiR74KOKaVvVZhqZ7F9I20FYQycSR94STy6064Xo7aHVW+ikI99J23rw
WHP3wneGvwe+IrzNqFHYKWUWUozrSnAp2A98GM0babUYngzxb2Hsdj3uoN974XOQf4sm0YjcCe/Q
qhD+Dpvb9P53G2fwfNo+Cc98OUTPfwKcjcTWiil2vWChGbO8CqyCz7noFIGsKS8TnnkxeWAbLFwL
fwN4DTobwG08HQBa+R9AaojDWjb/AK/G/uvgM+AMdKiHzhxafUMOlyFhLhzGYhaArFlzBZqLwI/B
eVhrBH8AnQKwJxJqrI++Ty2K/Al96qrx4enFp66a/SBrxP0OnhF5w5BQPw2aLhF2yEB3OzyrzHsR
nbmgrWn3IbeV9hWQeXRtVCeAVEXvK/jpYAW8ugRNsshlXbh46LI7mD/TymbCF8iJQ4QK4CWRL0PO
GnQvA1n7/nx8HgiSOYZRGGbWEFXHjsLOL7uDT6U1dr5oa6gMru3rZXA9aLPIVhhbCe1+9Fd8Y08x
dl8jK9wz4KuBrBTfVuaryN4HyduzyNvNrHHsGFalR5zd93hKhTcXgbYOML8e+exOw5/h2H8IJBPc
EaDdnb+E/wXEchrVNQ2fvRdoxYqL2Jr2LHJmx+epeZO21Eb3VvUqFDqWA9YAn9MdJ6W/3RsFXqro
VVJ0/wmWIskAKys6F4BPo98LnT6KfgqdTuDNPL0S/i74u9FcA/6EvC3ypYqR9vD9wAbofAR/FXgx
knfgp8A/CHZHMhN/zgJtvx78EbzqgmQ1uJlWR+G3gvWR3AqORMJ4TSvaToI3PH0P3IekK/x18BH6
mqgY/hneRu8TLIxDpxvyTcibwa+Cf5s4EA33OXAt2Ji2LXl6HtgBO+i7Q8ChSEbztC54G61aIMe+
eQDsDbr0eztYCwtWfgjsQdsV8IPRqQLuAjeib+NZG6xOj8Tcw1vPzgU+mEdA68lnPLW59AM8Ppgl
WC4G7bz3JRPwze+PJn25H4BvoHM9eBOSPfBRxTRmM42M8i+k7SCsoROJI0Ge9haSdNruRF4Pnrbu
XvjO8PfAV4S38/gweCOSxfDMi38Lo7AZvgOb98LnIP8WTcYVuRPeoVUh/B1o/h3+fPSfhCfaDmP3
nwBnI7ErjlVgcuGLQDLQy4QneiYPbEOra+FvAK9BZwO4jacDQCv/A8iKc8h88w/wauy/Dj4DzkCH
6uHModU3iuEyJMTQwWezACTDzRVoLgI/BudhrRH8AXQKwJ5IqEg++j4rN/In9KlCxoenF58qZPaD
ZLL7HTwj8oYhodoYNF0i6ZAn7nZ41oL3IjpzQVsB7kNu69IrIFnt2qhOAKkh3lfw08EKeHUJmmSI
S/a6eOhSS82faWVn/AvkxCHCGvGSyJchZ6W4l4GsUH8+Pg8EyRDDKAwza4iqY0dh55da6lOXjJ0v
2hrWr2v7ehlcD9ossnXAVhtbvf+Kb1RgY3cBssI9A74ayCrwbWWw+jaS1DpzEch6NMydR6660+hr
OG0fAplldwRo96kv4X8BsZlGZUvDH+8FWrFqIraqPIucyPs8NW/SluoU+sB1Q/pOTL+7kulV5G2M
/vfdXXgjVOzqb71LeI90NU9neV5I3yClC87gTZqjEmc38skqN75qyibk6ZsT5NcreusVTWPk+7Ew
mKe7FP3b4IvBLtgss5r0Pkn/W3i3sr4xc2YhuSd436Vv/w7w9uwa3qQdsm/MkDyprZx1SBz0y8C5
jLGyojOWkRbwTmwVb6tawrd0X9JWqhM6pvLw2cFbMsHQl7wTa46dJK068uYqRyXhs83MkL4rK9VV
w9NZYHfF1OBj+l/mxo/pN4WWHdM3k931DYazTvlwQ/gePO0Ivxx+E5qjlA+nsJDF0zdptRG+qrWG
ZHuqBIm2bQr2QZ5SzfAhJH9DP5O2T/G0NXw2T334/wV/L5o59P4pmt/wdLjyqaT6Y3LtKEL6fdeD
yrtn0tcF8INDvFlFYpCsRX+zom9Cmht44majUwPeAbeimQZfGT6mKDmk/Fx6XAg/FX4umueAJbwd
2glfjM5Q2vbQHt3Fgc/6dAT9voufm+D3Bz1qNjaFvx79Pqml+uZN5aH1KX2L2wWb03g6lrYVNP5S
8XgviuQhZmQg9nNTz+CD6vdW3lmlnrsNlZecbqO7Ia06qUTaPiFPn0gtlliRIeGXU/p2dJ4+ldr1
DOPVEWVjYXuoIu/wF1MD9b/TvMD2ot+CEG/V82eR1yDy1RjjOrXpDcd+NPWo6CxC56GUZv652Izy
9A2wmXoVfsxGT0cXngA2V30nK/Ua/a7V2VHeWQafBaaBTRWlr2Xwr9HXbM1DehwfSte1o/06y0Jn
6ptJIlZGj0nkO8BVzPIcWpXi2zawPdlFLnl9kaRU3916TH+bUOvYXsF92Bxoe7Hzxfo6GKwyjcwk
+Iii/u0vqa5kkZkIXqk54LfWp94n6oMXP3aIuVgAlrISte251hPlJTIaqwPHdnM6msoKpV9iVUvn
LjwB3zoiGapz50wibnPhc1LtND6pYnSKeTqeUYxX+0e/Q7KL37v9b/a+AzyLYuv/zMzuO++7u+8k
hAAhFOldICGEKigC0gQEFAxFIHRDD0ERARGkiIg0IXSki4iIgAhI700Ivffee0nynTlZuST6/8u9
3u97vud77rNPfmdmdnZ2zm/OnDNb3o1uwSGsrEt4Qf1kxyhNDF+nko1JvbT1al3YZRqLk1TfS5g3
SX+FwKTnQRN130Rw0jd0ri40IxL0MwLqLVAPsyXpp0JtkvWbAF7ScSFp7dN2xWqQrbbRDBgLU8ZL
n50tS7EuXdNDNobarabIrjnMQ37mdIrf0HMQtdMc3tV7PQv0WVgCtVmLetWI+AyiY4vTXAjS5XjV
Rk8cNJqW7qGoQ3OzkR4veKwZQE7m0yi8STW1RrWTDhCeojMWIkvW7XyU9CUdqznvpjlB/I6OPU7H
XiQL13YeqjlhIUn0HIf2Nk66R2n9LMYgztdSnQVUf0YKEifx9P7S17R3DLVQhjQaQucq477jsZpW
VrqdRSnvO1H70dRnL3HekEZkjkY2gvjZDvWQk0DyD8WppJ9G2KzZQMaGkx8bo+ca+ZxXdTs4Rk+o
byZFH43bqf51zaQ5lTCcxi6UvFNzXR/Z1pbgobMcJs5Hk38ztP2jTyNvRuPbiLzNZ7oE6F0yOEq4
mLhaQLMyH9nhcKq/IuUoOksr6s9l0reC64HLE7f6LCvJZkakaEHteHU5RiiT3lTRs7iqPq9npP6C
E1q4/p3dBqigrwHpLGdpdnchS8tD7c/X50ULf0L2GUBeK5hiTTBFJYosZP+K7MQgL9SM6t8nbzac
enIYwsnvDaM+6/Q4jEho58RGCNkq1+2LJsT/shTv5HrFqhSFS5EHK03xWrc/kWreJTbepxYGuFpg
2pPiz0ekzDU3uunfGPbj2yitI8Jm4iqSNE1I2kVeeivNvl+IB/3L1gYazZv0TtoSamE0WXgMlVQg
Dgfr1nAu/0C86bG+SDic7Ko3lQfSvOtHVtFLp+EBRbSdVNKb6ie4M3o+xawUnx+uvQrZg6M5h6Ok
V7OU0ad4PSNlL/nV/TQ7QsiL9iOMoZIkio8ZaRVRlmLKKiohn2/OIwsJJyZ70dP8OLLhrBQRaLUm
aT2DEZzWFXSuEM2VSHCtPYG8xxLygUBapHjyBPIDGptRndVJ8aCf0XehXmk/U59aqE115pANt6OS
fFR/u4tdaFy6kLUnkKZdSLslFIWnU5+xJOlR8mmyhHqkbyesOTclYtJR3dxVWcrKTdvhBjq2H2TH
9GrScTn1/4TGpDDdWvJ9/S0sxJZYpyvd37tId+ToLqiXnj2BpesgtqSndboEqIXGpn43NcpzT38n
jdIWpcMoHUbpCM9hKplKJQmUHqTfa/XMp3QCpRNpr1+nZUn9hTQqicDR0y3sozoGfRvtgEbPQ90H
qdsJ9lTRKMfqL6TpX/MlTZFz9BfSdDpxpU4n9ffE6y+kyRv6ybLMRPiQvoR2TrefktZft8D0Iyqn
r5/JuZSuROl2+jtp5ib9nbQUHT1ndX1vkE5Li2o+pd6WoHZaUJ1Q2luN9CpN+Ii0Hk57V1D6IZXn
o5KdhPq30uHenNRmeTp7B3omnkBpTnU+pZZ/IJYS6Iyczj6E0kvp2LL6beQU1P1HDk/qcq+idFlq
IaU8nPrQnNJlKN2WWjhF9QOoP4TUn/CU/nhGU3/W6i+bkdalXK1LUMstqE5jqj+E0qUJJR1VkdL0
DTr5PqVJX1mHtNBniQDqCX11rYTHpL2NKG3QWa4RJ4OopATtxdFJKkZYQgrCYVTnHOFeqplM5WHU
5+XUZxo7entQJF6ndCnCd/RZEjfqPiTuovQJjUktCaOo5KKumbhYM+yW9yC0CTNQOxko/RFhKTpq
OR11htKbqJz4SZxC5/qZyrfpdBKnFmjE3T7cpjrH6aicKU/RwWKDvZdBRH/YLQaC23Zr/T70iWkR
2wkW6QhUv16lHIB+MTkZMoADHsgKuSEIikJJ5PdVqAENoSm28RZ8BJ9ANLSHztADBrn1/SAhG+SB
9FAMIrGV16AmNIJmeNZ60Bv6QyvoAF0gDgbT/69NOUaBFz1OXvToxTGulYNKUAvehfeAQ334GD6F
1vA+dIWeMAQygqhet241qFGvzps5oGWDejVzwDhqJRN9j/ol9On5sMUwXAm8Dm/AmxAFzUFghG8A
fWAAtIEY6AYfwFA6xgc5ID+2GQ6vQGWoDYXhcyoPgUDkISeEQgFstwSUxlVBFagGdaAxtMB+F4G3
oS8MhLbQEbrDhxjHU3qQDmzIBVmgILYQARUxUleHutAEWmIseRnegX7wGbRDLxwLvfR3sqPDu0eL
dwibEbYh7EQYR9gnukVMrPiMcARhPOEMwgWEy6JbdG8t1hJuJtxJmEB4mPBkdHTHLuI84V2NBicM
JMxOWISwbKuY9m2NqoS1COu16tS5o9GIsBlhK8IOhF0I4wh7t+nWItroTziMcCzhVMJ5hIsJV2HD
LYzNhDsJEwgPx3Tq0dE4SXie8CrhbcKHhEkaTSOmc3SMaREGEoYQZsed3cw8hIUIixNGEpYnrERY
rbNupzZhA8IowuaEbQhjCLt17taqk/kBYR/CAV10+VDCEYRjCScSTiecQ7igO46RuZhwOeFaws2E
Own3d2/fqY15lPA04UXC64R3CR937xjdxQOEFmEwYXbCAoTh3bsXD/OUJ6xMWIuwAWETwlaI4Z4Y
wljC3oQDCIcRjkYs4ZlIOINwPuFiwhWE6xEjPNsJ9xAeJDxOeJbwcvceLbt7bhLeJ3yqUXJCL6Hq
3qNLdxlMGEqYgzAfYRHC8FhkUpYmrEBYmbAGYV3Cdwj1nRuOvif4n5AC53kWyPovpRh9ZPv/jybo
+14e9Ivef1vOoFxKmsFLf0D/C6JAP2fT9/z/Toqh9/5zDHph5DQiHFvVOebGKY3WC2O6F8Zsf8DA
F8Yc1FNBkj2HWoPny9RfosBIlRFC/slUJkpxjE+5/imZmz7//OIyL+T7JyTDSPrX+NecMIzgf40B
L4RhuNqIxag/GmbAYlgPCXAW7jKDBbM8LIJVZg1YKxbLBrDRbAZbzNazBHaW3eUGz85r8V58KI/n
8/hyvpUf5pf5Y2GJUFFIlBU1RJToIHqJoSJezMM5qM/lTbFZUTtNvmWa/LA0+eHP5Y00+z04zQ+C
ZM/lrYjUeWd66uPV/dTtB0elzmeA1O1nCE6Tz5emfrU0+SZp8mn0yXA4dT5jgTT5umnyH6Tuf9ap
qfdnW5E6n7dImnzR5/I4//IWT7O/P+U5+oegFA3z102RBVI0N9DmMqKvyueW7nblYVeedeXNP6td
KMKVFVxZzZUNUvei0NDUWhaOTJ0vmpS6frFGqfNhaUYhPDxNPiJNfnea/J40+atp8tdT50sEPWdl
mIgMTpOPTF0/snSafNr9NdLka6XJ1049imVqICpkJpqNgTZsInnblrgBztTR+o0MMx3FiiDwONXV
RqeaWq9Wq7VY4mHX2DWsd5PdBMZus9vA2T12D4R6Tb0GhnpdvY5xU9sDF1WEHi/Og3gGLMFzC6X7
I/x4ZFHMZ8SrkW4wETbCSXjMgrEPXuxVsPMWcKeaUw+xulMfUWsXiD45B14tFMdrnvLqIggeiH26
RHKjwistngHzV0huVPuBY+4g4kZ1GHEzGGShoZBLncS+rsa9p0huVKdRrsX8GZIbn6t51q15zq15
3q15wa35e39rUn9rUX/fpP7+vqc27alDe+o+v0dtpR5upx7upB7+vmc37dlDexJoDwfJccNpZnP9
K5NAHoisZkBWhVPVeQNZX61Wgwf7tBaZwqtsPRcFPS/EvwJ4fH/Uqj9mA1gA9GWhLBv0o/+VPIBF
sSYwkMWwjjCY/j/yUNaVxcLnbCgbCl+ycWw8jGC32C0Yye6z+zCKPWFPYLQ2DRjDPdwDY7nDHfia
p+PpYBzPyDPCeJ6FZ4F4npvnhgm8IC8IE3lxXhcm8VjeA1bxnrwnrEbv3wvW8I95H1jLB/ABsJ4P
4oNgAx/NR8NG/jX/GjbxGfwAbBZ+tJqnIkJEQJKoJCpDsqguqjMuJolJTBixxjRmmNFmNAs3W5ut
WQmzrdmWRZjtzfaspNnd7M4izR5mD1bK7Gn2ZKXNvZ7BrIxV32rBbliDbMaSnECnCv/QaexM5t/7
W/k78Dv+vv5h/LHiyiu8KqfKKQJUbpVbBKq8Kq9Ip/Kr/CJIFVQFRXpVWBUWwepl9bLIoIqpYiKj
ClNhIpOKUBEiREWqSJFZlValRagqq8qKLKq8Ki+yqgqqgsimXlWviuyqkqokXlKVVWWRQ1VT1URO
1Uw1E7lUK9VK5FZtVBuRR7VT7URe1VF1FPlUZ9VZ5FddVVdRQPVQPURB1VP1FIXUh+pDUVj1VX1F
EfWJ+kS8rAaqgaKoGqwGi2JqqBoqiqsv1BciTH2pvhThaqQaKUqo0Wq0iFBj1VhRUo1T40Skilfx
opSaqCaK0mqymizKqKlqqiirpqvpopyaoWaI8mqWmiVeUXPUHFFBzVPzREU1X80Xr6oFaoF4Tf2g
fhCV1I/qR/G6+kn9JCqrpWqpqKJ+Vj+LquoX9Yt4Q61Sq0Q1tUatEdXVOrVO1FAb1AZRU21Sm0Qt
tUVtEW+qbWqbqK12qB2ijtqldom66jf1m3hL7VV7RT21T+0T9dUBdUA0UIfUIfG2OqKOiHfUCXVC
NFTX1DXRSN1UN8W76ra6LaLUXXVXNFb31QPRBI23BfkvIM/F2GP2GL1YMktG72FyvA6geWbSPPPQ
PJM8lIeCl+fiucDHC/ACYGkrBNtsabYEx2xltgK/2cZsA8psZ7aDALOb2Q0CzVgzFtKZcWYcBKkc
KgekV7lULpzjeVQeyKDyqXyQURVQBSCTKqQKQYgqoopAZlVUFYVQVVwVp/+BUgKyqpKqJGRTpVQp
yK7KqDLwkiqnykEO9Yp6BXKqiqoieivtf3OT/82j3lBvQF7VVDWFfCpaRUN+1Vq1hgKqrWoLBVWM
ioFCqpPqBIVVF9UFiqhYFQsvqzgVB0XVB+oDKKb6qD5QXPVT/SBMDVADIFwNUoOghBqihkCEGqaG
QUk1XA2HSPWV+gpKqVFqFJRWY9QYKKO+Vl9DWTVejYdyaoKagP56kpoEr6gpagpUUNPUNKiovlHf
wKtqppoJr6nZajZUUnPVXHhdfau+hcrqO/UdVFEL1UKoqhapRfCGWqwWQzW1RC2B6mqZWgY11HK1
HGqqlWol1CL/9yb5v9roO9dDHfSdG6Gu2oze8y21Fb1tPbUdvW19tRO9bQO1G73s22oPetl3VAJ6
2YZqP8aMRuogxox31WGMGVHquDoOjen/jzRRN9QNaKpuqVvQTN1Rd+A9dU/do/teKddXDCLI1xZE
2zJZU9YUi1uz1sCMpcZS4J5ETyIIbwVvBfTD/7G+/1jfv9v6Qsn6CunVFmvvOfIfG/uPjf2bbIyZ
HXA9H8hy8QhR1WgEWaEsVIIaUA+i8HqhA67fe+HKciiMhHiYDvNgESyHtbAV9sBhOA2X4Tau7IF5
mOP7AISvuy/W9yHJHr5eJON8H5Hs6fsYZSym+pCM9fUl2cPXj2Sc7xOSPX2fouyB9QaQjPUNJNnD
9xnJON8gkj19Q1DGYb2hJGN9n5Ps4RtGMs73Bcmevi9R9sR6I0jG+r4i2cM3kmScbxTJnr7ewHFv
f8QevsGIcb7hiD3/BiNjSPPuvrEuM1+7zIxzmRnvMhPvMjPBZWSiy8gkl5EpLiNTXUamuYxMdxn5
xmVkpsvILJeR2S4jc1xG5rqMfOsyMt9l5DuXkQUuI9+7jIxG/bv7JhMjM4iReX+TkR9cRha5jPzo
MrLYZeQnl5GlLiPLXFv52WVmucvMLy4zK1xmVrrMrHIZ+dVlZI3LyFqXkXUuI+tdRja4jGxyGdns
MrLFZWSry8g2l5GFxMgSspTVxMjGv8nIDpeRnS4ju1xGdruM/OYystdlJMFlZJ/LyH6XkQMuI4dc
Rg67jBxxbeWoy8wxl5njLjMnXGZOusycchk54zJy1mXknMvIeZeRCy4j24mRPcTIQbKU03+TkUsu
I5ddRq64jFx1GbnmMnLDZeSmy8gtl5HbLiN3XEbuuYzcdxl54DLy0GXkkcvIE5eRpy4jiS4jSa6t
JKcwY0EKMxZLYcbiKcxYwmXmIjFynRi5S4w81pai/wew7jfdTWsEBdkePkXUEnVEG9FWdBDvi+6i
h+gpPhQfi8FiiBgqPhfDxBd4FXxanBFnxTlxXlwQF8UlcVlcEVfFNXFd3BA3xS1xW9wRd8U9f6T+
H31sN9uNJ5isf5svaoqawEVtURuEaCVagyHaifbgEd1EN/CKWBELPhEn4nAl8IH4AGzRW/QGR/QR
n4JfTBATIL1YLnZAsL+kvyTdZQgFy8huvGTkMHIauYzcRh4jr5HPyK81wx7do7vrKeuVrO69icJ6
Hx6Tcu+aiZhnNQq4NYroe1MiBveAEWzo7/gWMAqA/dxxKecNNjIYGY1MRoiR2Qg1shhZse4/zssh
DwQYQUZ6wzQ8hjS8hs+wDNtwDL+hjAAj0ND3uwzUrS92Uh/DjVeMCuAYrxmvgcJ9kRAiZok5Yr74
XqwXG8RGsUlsFlvEVrFNbBc7/oxxfbdMzBQzscXZQr9v9a34FvleINCPInPr8HynxZVnrc/EWt/i
3uXiF7FCrBSrxK9itVgj1op1fzbG1PosMQtbnyP010Lmi/nY+vcCvTP2cAe2rvXQrReF4D9t9U/0
IM5Ou5zp417Quug4bQ14nNmJL4ZPYQAMhM9gEAyGITivP4dh9J+rv4QR8BXO8lEwGsbAWPgaxsF4
nPMTYCJMgskwBabCNPQA38AMmAmzYDbMgbnoD76F+fAdLIDvYSH8gN7hR1gMP8ESWArL4Gf0Fb/A
ClgJq+BXWA1r0HOsg/WwATbCJtgMW9CPbIPtsAN2wi7YDb+hV9kLCbAP9sMBOAiH0MccgaNwDI7D
CTgJp9DjnIGzcA7OwwW4CJfQ/1yBq3ANrsMNuAm30BvdgbtwD+7DA3gIj+AxPIGnkAhJkIxmzPhb
vB6vzxvwt/k7vCFvxN/lUbwxb8Kb8mb8Pd6ct+AteTRvxVvzNrwtb8fb8w78fR7DO/JOvDPvwrvy
qfwgP8QP8yP8KD/Gj/MT/CQ/xU/zM/wsP8fP8wv8Ir/EL/Mr/Kqw+DV+Xdj8Br/Jb/Hb/A6/y+/x
+/wBf8gf8cf8CX/KE3kST0YXpH+LIYQhTOERUniFT7wl6on6ooFoIpqK5qKF6Ci6igFioPhMDBKj
xHgxUSwUP4gfxWKxTPwsdopdYrf4TewRe0WC2Cf2iwPioDgkDosj4qg4Jo6LE+KkOGWUM8rr/wlu
JBj7jP3GAeOgccg4bBwxjhrHjOPGCeOkcco4bZwxzhrnjPPGBeOiccm4bFwxrhrXjOvGDeOmccu4
bdwx7hr3jPvGA+Oh8ch4bDwxnhqJRpKRbPrNIPmarCRfl5VlFVlVviGryeqyhqwpa8k3ZW1ZR9aV
b8l6sr5sIN+W78iGspF8V0bJxrKJbCqbyfdkc9lCtpTRuN2YdVBbT+OvS0tLi2uB4g5FTyC4FHcr
FHenuEuQYsXdihQvFLfiVlwLRYq7FwvFndvf+/7kzpczc/+6c2dukplsPtmc3Wdnc57drekpZbbd
N0W6bI2IJTGlm9F0jdU15ZrR7RkghSicJZD1YZiyznsORpuSzaifxWf23R2p8LxBT8jsF3asIKYM
HhjZYLsMImZpS6BaV3fMI6aRHAQcS260ouLXTJvTyekGpB2r0ikLBiwdG28khmOWBi6P+Bre+LDi
D5CtU17m6jD5xsme3OMlCw1uHOE3iJQlFK+XO9boUE0NuDi2zJNzDcg7Vs9T1g3YODbNU7gN6DrW
3cgfxMJM/efpzgefHGXxU2MMUh195aeNHsQ5yuOnURxkPyrhpxsZRDnKaaZmHWQ8KmqmLR8kOspv
prEbDD6K9WLK7CuAKNP2m7C6p6QzmPfPOEalM2718x2VNdPBB5EmkSaD1Vh3qYrrTit/9e5YnVYL
Vl5pZ2o9KfGbND+TdLW7Nm6KXpg6MPc1Oq8TqkGazpwJ2Gs/w4R9vW0QGLrrILX1tYyuWNt/cSYG
ixOYyTBSrCmYGd+32yM8k4MlCcxlGI/UbM0szS7NoOzB94POMM4oryVhlbfxt8Uts3rG5TVTM7v7
aGcSsOKWH4uG8G9uM037S3sCZ3p87Yvm8DqM2YI99jOea3/v/lajpQq7Gbe9pjOB69bb7z4WQlVk
c4p7Ba5xn/c+dBIfPO+1l+tdS3cY5t1KPx5+upXj1N+wp+NQxjuVvjuMtpXvNNiwP+9wwHuefj38
ZCv7uM9jj98hgzdUIS5+D0no2KntkMhnHP5Htm0KfqztMwe/uPXZwDhEuhq/DLj5fdt+h3oXcSd3
h+lr5vtVKFyoWChNqOmexhfdV8GXxdfWl9RXz1fwHvFe7J763uQe9171nuPe+Z7rjvAu5U7zbuaO
5+Qk5WB/XOCs1QtZEkPGbbgg9BXB0nkoF9BKhqmcAxBj/+iC2Qfm/AZGxZ391gj+CPrhGOURvDDv
4gbQh9+aCEk67PJ3l6Lg1rG8nW+kTgr5Yp9C2fUuN0I5CWHBbyvfVKukntDiWRVbYy/pAc8GzwjL
wCrEX7fget+tRHgScbg0ZbKcP76m27Ov83cZTLZxSRAl99bmUPj5escnfSL1N38IENSy3XpUpp/4
FTMnpCoy3EbQYkJE1GA4mxjTaVgYM9qY0dNzmb8EPhRCl7tPxZ6b9OK9yU4okDyj0LUlE543IxOd
N8x8M2+qPy5ZhNoonqhc9xXy+2Vhqdj703NzDsEhG6WXq7SmBbM4b2CPLRUbVWEiFopmszgyMO4L
+4mwtenEzSuBY8dmYnu9RPWn7cXHOwaHvM3onybprXDdS75Mvo2ZlN+lre39wXNTd59PkMbbcbcU
VX7PjqXW+xM/Mu3+M8AuVRtnY8J3iSVBTsJTbDBUIj66xxwh18mgwNlBUJhrLGNtfeuvXHmu39Up
JNH5hwDpHgshM5rlfi5npdoi2MGBuAe+lbtqVX/10yo6ITFYz22iO7GXym3hD6I6CXw1zBhSypO/
HLYGaO3zWRTCLZtuBFyPogrX8nG285z8008UKuLb+7dNHEXShxS+xnf375g4VfGx8vCkpyuw0NXF
9/bvrjsd8T1N91fIFoqsfXLPv/g6syrhVkTZ7Y5srQxZye/1AlkOnBZW3RJkdHgmFNmBxIZOVhU9
3buH09ZrnKhsmvPJa/+eMBHnniD5XchAicj9l+3015x8ofdPRhs415ie6A18rHqMObRT9SwmLaMB
3+CHhhX90GxVrZJ/jfk+hX/LCK+I9GTKqf9YCRfRk0RN/jTEH9OK1vjf1hfcmbyG1i56f0afb2R+
N7hjIEPMPKa4QSFob1unMkQVECAb6XU8OXOOFNLkpnyeH2KAhVotJqH83CycMoegBNMwB1KSH5L5
BsuXTLdlnyufqGm5KmVYrldk6HrTO2nGy0LQJHvT+BgYXBVu1FAbwRzBZ0rbkh2hTxpk72GP2jjv
gtFWdmQwZHiUfDJvNQcYtzRXZ/pewzhhrtV1AtcC15rsIxQjWGcZW5+2EK1CrQLEJmfjI6wC7iBv
k4wH1xmrKLU3mLeZuybdw93DK10W2ewI5tYjTySqfixCFiHW4T4+PbWe+qetA7UejB6MlfuLRYtF
1sF1jXW8c79LN0q7XT2I3IkqFhY/Ln7c47JL4Arb/9O6FWkGa9lv2Z8RJtM7qxZVk2VMJanV0t6f
Vi4OwBtU0HJQI27yd3B93BTmcKbuirG2J5pk4tQEJLuqNOHbrcg5KBy33rHe/PHSHbhmdoc2fsio
5zC1mY+jGUlko0chdduPxZjiwKr3pbV9hb9cZEAr/Vn796aa0QGB7RVzWkcJm5a8cv49ipGl2qs5
r4AWv/YvtMUvnhH19oxqc6ZlBxG+NwOqU2eG9jZlzdDZC1IGh2w2gePUy6EbM4TqLM0+JuuXgD5n
eGr30KrZJ0LbJAOY5uO53rPqJ3vkfF3o1VR79Hw9UdU4e9R83QrV7HtMfL3D1Sh7lE1dLNWMe0UU
qKLz+Bhdon+k+F8qdqnE0seJHS0xsCvhBYx/fhbgUxoTdXAbuExLzmj7DJJMBmV+fNXyzajeI/ZX
Vb0CU3TaUzz76myIKgLS+9X8LApbhEMWsZWrCkJb4Z/IdSc/0esMttErYxAEA/ViXlytJhGa0wUr
vfz+mAJleFSpr6eqei/m82KUx4stK90+v2MosuOYyoIOh4pTNcHLJx7b3inNJUjhAV57xmfA8G8K
6+e4JpnVhkohkQZUWc+Hl93dCc0PFZUSSs2ssgjm+jiFCeaGa0VfNC7hCrOzxk1OQLfLVNgbdydu
ZloqTg9aKpJjC635I4JXwoC3vmRx6puJDt0aAVPf8YwF9DDUI9A8RNkcFsZf8devepCpRwSUZi/X
fNSk+l5rpllN8TPV6kcwuVWbyyOIVnBJLqbR54rhZa3GugUkR6MTgkceziYf/AkI84UN93uzCa7+
3GJ+XLwmSBDD8HlMORqc6fd2u3dE2LK5tvGR6c9kff+q7ZHyNzwnv6dOysUrfTfc480brV1cGMIa
TRS/yBLqPdt9H4lYHj4FeWZpEidBqrMk7kfd0lzvuYssODZI2XKTp475G8+aueJljkR4CU1MkPOQ
MO9mFYtGMnmmS3ejn6elfHhcvmGeJbWl1qu1JblmwU+R6oR40ruv806JCJIPROUjZELdTXOgRcN8
9Yr6Vis31uKv8MZ5qzw54CuaL362yA3PVqpnJjpMfsBr1zms9uR+chcYftTM75hNCFhEyK92izZL
rXbLNl/YL8zhMhn15iu7hVC1nZadstA3Q+BPENxPodi9Pt+gCFWr0GnsPmPmap8gqWbsJgS8Eu1J
UYtIqxDhn1jqKFRZ+GXom6K+EbdC7QQRp8EG2JG3kFfXmYB/pv+GCUJbzNMSchQN6ZcVYUzL6lUf
fhHM2H1/FXFQZ8AscSGmEfxn/gmfQyTO42sH3XicqDWtfMz03nehaFMOLrHotoYRGN2Mj04C3YMm
8N7oC4vQeCcjLI7BbYS9r6kKkPe6jKsq/5wk5V70hjy6fY1dfvbt1y9vW7Gwe2OxLL87mirtnpV3
np6kNyWkSIby38yWU9S100ZnSWdmfSoTyqpVruLjPd/OC/D1VgfeMWbgRQ+98XnehwEcifrfxAj7
9FELrVMIUfdjePRjXPZhaK4HWx+Jol9SiPvQf7hRIr/MJj8S/d2P8TSebOCNDz3OJcVtd0TNV7/O
4tCNvi59geCVISPh6UGdEkwUc1NNGrWAX52LNSYkGvgvg62S76zZiIYl1jQLqjStBbW7kirfWQvM
DbhScUnGBofv8TYNkuYen9sHI/3BzPi8tRIUsyCl9ryG9YNOsxwEOTczSV6TMO6HhmYcvNKROq36
iFq7Ql2q1gRPSqI6jFp7ZWi8CgqLNCFSSzGBqSWaoEqoMvNV81Kv/ZDTeiU7hBkn+2NIq4hOT1uW
vWVqdIy9c5euYaxYquzoWYzcybM4uaN8qpQ9tDFsddbf0mqoBs4Z6CXknv6PIo6JncQxc9lmd2ue
XD2ZwLbBdEEVtR7uwNKuwA5hJiyjUqqLCynVoDayUkOuRCvOW7o1KKdqHSki71n29MtV+4XZVLET
oquJ1mVb8tKIH4bjQFkcyd2O+izqyuyNzvsdPjLFZm62rwxa0B1L8rKTVc8nLifbdSnN2ED/rrjc
2dWHXNv6qz9qgf7cxakGzZHt3HNEJ3C4ZKfYJ4RjQ6DkO3ctCfYyvd6lfnfDvuCIqCyysPZIQK1q
unjVkYX8Lw2bkxjlr25EE0akVXjRqN6yVQxpilWE11HrMGuE/s09WBzzjEjc6B5SHPM0ZVzpdDS1
dnU39Zx7tWUor9kUdo1X6LqMHXpccTOPNK2nU6zc0SZtyt6PXJr36ckm4pwpPXbIkfOqrxosORzH
Lddbs4E0YWPOeAmHl5Hz1q8aeDgcnU7d3QNC/6B2uUsY8eMApCIR5rQ9oqF/mLrc1YzS/bAenajV
kesjcIxrfrgL/XgX5WbjWdD6KNCYyRUuVhlhYpXSJyFy0uDCyHRcrcpnIz17niNEKFsr8jUzpvLN
idJ3CNut/nYN3eq6vrMcih/Fns1kTMvgq0o3Db5iLInMrwnXHc1I8E6kY4BSbwgvfEIl8WucKuRq
SnrSxCoM+ivVTL6utdIsq1zXuLRmUnO3FG1Swiq+RlNASeeFKb2KR4Kq3m7s6bSnkUANdik144xE
nbmvafQ3yZncfeBM49oKli6wqGfEWpM8IzQ3uK+/h3cmA0v0nhZ8T1anOFuwX33mcZ3jPdP6Xr/O
braO5Lc7SaYxT+0at48kD4KCYUHIcZXKBMMmrltHun1BIM5KgjPl5/v3cLnv72cXhVqnBD9vqnUq
j/Jbrk4IFrx9ZfFTykkGNxXp1Tq98kR2YMcPpbx0mUDKATzCMs3sIZXAQClq0YGfvp8TKcpgvufn
sLtz38z745uM0wlNK7jT2QysBX7VmukG957kxOPCIWO2ZbGlsGWwpRGU8Cqpr6mPrC+t/3zB7QCj
R6chD4TEIAR/d6vAPxMW/4p4OUVe4zApuSwXHdVnyB9mObouh1vDQ5+LQ6eiLEHnB/f5yO0b36WZ
git4/lp+7u+z7/kBdgklgf814jlWlb+Av0DInFKZSN+xE14XF3MOxgsBnx5/C1qUblunhGo4zZ5S
rXf8pw+QA7MOvF5bLuKmBYe9s++Vczi9tqzETS1/P7RXwiijFlq5Xa9XpgWk93DCZu9W39K/RVqT
+hxG5fIqQTzWE4t3+EnXepvR6P2Qv2/451YNKdxzWj+YCuJ5LuqBpPh8tNZFX8pFn+QK1XmX5EEA
Ybcd+XFu+BjNIb0zxcWWi82LxPa7+1z8+0oh9Av0WX+OM9zHMGQ0bQ3MORwjmMzflyFMxhg2YACD
VAgEG8AGjGADhrABYxh69xnxx/3CD3u0ivQ+izCAl/jbOeafzS2sQbLjacUXewWPrhlCbxPOLqtX
nfuFM0nCvq4XI3sR/tbgOaT/niHXm8EUKKDpTh7+lLVd+/COHU0q3jGPslB6ZzT9N8UJmyeiQJhg
mmBwBuKvbFpidJcsUmKElJ+YVVkA8dMfWTzfAo2zoN+C1rJw0pFFDbkjAgE29GF/JwNsuY8ohrxD
HzTtCYf8GA1ZdJ5MtXvVI9gGiscgyS6b1T9N6tyveHwQ2GQInUc5b7+tQCf9KLni4I6d8fH0kIkf
I21Z3J1QL2hqRX4aFd6hMP20acXq4qztXOfuPGPw/guMRVoEGfDl/oywlPtJ6Ix1QSVKgjLkZbPA
NrqB4V0LJBNedDkOM2ldlAyoFdaKVWnb3Hsi20P19CruOG4Zem+JlffC8uOiYXBSQ3xGHutvxWcx
2VLFq7E7X47KLW9LDsuN0VgsGJfwq5fw796Vtwf5Ru4VdB8Er35v8z/Tdbj3XtGXJ9L5WXkjLPxn
uck/6vJ69b7af7XX7enp2Lnpa5al2WyhhOeqOfdZXfclId5XrVlfT70Jz0RHL1q9BFv9bru1L+AN
oULcXAghL3GFmJVL3EQS9gO2hC8h1y98aRNMu14bkQz4yIQ4GtEN+KJjtmEVKD1zDq33u4rumPK8
X7g3ux/1Pb9fv1cc8UVNJ8GSZN298MAw7Bx5qlQS3znz5P4V0iNP+mha5W9bI4r16OvZnoLLI3aa
gRBW7L2nrEotKM1ilzJcb3E+5Gxoq8IRWrjNWiVPMZZxis7jb7YwYvMe+baKvcX8FXSI49UlleAb
j51HfUdDPVApTRgnxJfOxBC8c0TtOww8fYv1K1HKRXWKXHlT4n0s79cy2Z3sRkEfrZ/PHRGLoqkl
c3jjTXIaEfozGUs+ML05jVyXUGWlRlFuCdkM2TpyobXgwOcNEDJ+TULCqut3f8PU+GQhNmv087bw
V1K5aJFTi7v4beUSBZHThpPurxnCI29O5a7sbhrKf0sq335ie2tmiG0am1dR24f6OGQIVziPDpuq
MvIR9hyN0iRjpegqfRFZPHfoTgFm4eOv/twBHy2qyMzdpRJppKX3/Za4jQdjxA639Dd9jDE/ECIa
PEMI8BFGZgt4NET+iP35d9THoEVIRTA1LdYHaUQDbIRPYo/+/ymuD96Q65ujKHNH6gUvfwnswAor
VqKjz8n8nTBDhRAoRaqe/Zj5NR2CQagypf8JVozE658vXkspOQeSYz7SUcF+ftjMoPh+PYtGhua1
pcyFYxTNigIiTnUoN3WOISLS7R9WeET2BJKNnIHUe6OgyygG6Wz891f5CanErTFLrys+9yZuvNXx
W8NNrg2QpEKQhkT8ZHklMNHPFMRyZekeHEkfWg5D2bZoizu0HaNFfg7pC11kekbzw+45u9itv5mk
RLeE/aqR5lvcdVZco+ceQUE9Xd0fq1Tpae6wlT+WWKlKiczv1dtHperqiHjpiGDSIXuLfH67UV4A
fPTRhuPg4fScbCJ2dxV7TM8ovT7CZqIaCLEZyKdnrx01meDIl/C2efv7l+9ghrSS0c2pESqCuhsG
axI61CurENsKH4+MMCmLc3hO78fi3I/59kCbHg4IFGqaOvMpygitgAMpSup3geQ6SVIMAR62hINf
zzLpM2f/HvHXQUnhcTqPQj4mfTSMK9r1ahi3na4qf957o3UxVzmMW00SH/HaPA82YVYY/uxgwLgs
1euqvj3jhboId7zgokDDxJb/dEM0Eb4snXpCkVUXwcLcDGR+VnBKnlLMvctxnO9AZLTuNC2PtvwE
henbTjwGhWJ3dOH4dnpVU7B3ls1k+/qdm3nmReTGkO/E59RVrv6KVWymthSXca1fOp3578TS1j/D
uJsBPqNR3WA3wrJeu6Di9IyW7zm0yj6yhNG9KRp39ldKaQbV44bofIjrHd6ZZ7Y8VnO42zjvP92V
9UfEJKQ6+MYKDxMUmA+3soxwirUIMjKc6vVN07jT9oUKlNbWUywb9Xkm4vmNUA+up9eOWChzUVta
ECc6+j3fweL9EtGoSkhJTCYi95Z43OPoy/JOJ1OxMhTPyG+vzHlPdCD1sShDwzeK1B64rSdPV7ir
Vpuil75Azk69dA31RqdvQNEHRmiG4ybP0R77PiVPuruTaGdMYMozQH/PBBMb35hAiCqsbYJNkILF
WeG5ee2KOvtRaUhkSPPYo5agVGr6iGe0n1kQP3xHHAhyvBrL75MbHNGPSUg4qWZ9LnsRz+xE/8zX
NxglRCVHn1Ma587wzdiFnsiZUF++gHfld+v7uwT5l3rhnOeWqbrZvySu4d6erCzhZ7zD7J6ll+kR
rl/mROgWkPEGiWqIgy0a0qj3F92VzO8G3pxj+A8eH3meInuWJLaMqVPzjr50xu+Dz3k4hfWwUrzc
s6SFK94aeRw81cnklDjEZ+/h//MiODI12lltNl1GeULGcP7lLZtPyitdTZPfrLlB8xMLWmb5XVP7
7oW1q7p387/rksstkfmabROp7dZWhz+0MHA2k29SNIWwPfU+SCwdvIFNY8iQZQ7N5ConF8NyX8/B
TPNyjf+gKZ1CpM4CvYBjv0u583pdtRHtk6KezwIZRA4fLBJ0KG5XKftNecr7WU+cU7ULvX5cqVMb
j8RE6BJSG78baxJL1q+YdkYatP8VDUm6qQsJov0iyLaN96wcA03lOCosRFybhNqEqRZIszEx4fB8
0xfRxll4In6PL3J2uf9NyP26DTf/TBeB5j023FkFfWyLtcRrMVYje1dgsnmGt8YzaJSqrdI0o6pH
0FQeOlgXyczVMnKyzRHrBFvhLU+J/fQOWjUoZKDde7vr6TSLy+6MrNdi/HIm4hWF2e1dRbffLYKT
2qBHpB0br6XWaZGx8CUR0cyjFTZTl/GyWCSOrjxXWTxaSxMmBYel8vqiHfnfBRvl3Vz1fxYnwovq
bH0fSfD4cKxLFIwvWrM3tPSUH95eMMbMWde+3RwPsDrm1sw+D1BE5fq5pMmtild042mdrIZ2wj2d
8433u4fs0aJ+GhFsbWvXv7vmylNesnb09zlcetjxVoMwq0GqfO1EOpl9nzeclZXblK42KQvuipHm
chTOJi8pgH1Y7SdDlKd2V10rx+nYksiaMNmmsXEYt4hYK8+10a/PzPzhxKj6CfRA8pocY4XrN6o3
VVK/RTxWz4rwimoFQzgh7nuTAQ50ZIjRs0gR+XHldoqEF3N909z0J3wI/IwLi/aFErbYX7mgbHHx
c0KGAV9fb/CRfzjAjXtDGvdd7tpX9lEsK5WihAJ/pEhlVLeJChOy7PK6MPa2BAUWMbWf8V0q4l17
LY/QON/kqYY3oVDuSXFQAa/nj/IIJzwWT8FT25ME73759Z6A0Fjx4jCuMBJ9jbjbsdPvs6NwmoMF
VneSrzSFn+JprDLGdGY0dIWOv2/HnhVqjQnOJgSKta2ppP7srD38HnuMklgnfcrwzqFxIdcM12Zc
y6vYiQR+sPeDNQfvdQ8SfovcpU2fSMFxGazn1FWzLKqyZTTjSCpDHZOQIWdOdrMlJp8k5LCI/yrP
8yxJlmJLV6v3W4vj9bS+V3mUiQZiUY0csXajUyJ00DrqQNXPBh2IXhySrRXM82xduNsZnvwO2G2m
++CSQm7nf6GFJ69bKAuwRrAG0sNrI+391qI/deK3lUGX3k9y8qu7y6pxd3BeCee5pSGdKHD0SWkj
jL/alUxJ+/hLVJVaHfZ75yA22+ATMZoLvxUBzf2CSGy5qyFQiPWkMetUHr95dTWGm1xUPEgyCNGh
Y8J6055yDTuHu19j6O9KpXLaetKCihOb/WyLNm3phs7lTJ9hOgPx/oOh6jbWBtr4rwnrKTrPEeJc
d+aD+ZlkRXOvgfj4Rrep9Gopw0yK6NuSto1PpWmbvxBzZroUnS07FaBbU7qxeGVrTgPoNNGZ75bp
nXfXDpuCnKpSa0dI6w49PY+LRRdyOaeQppcW31m6KHJBFA2tNDusl5KPrGYFU0ukl3Vl0/PjTNro
O+UOOvYYnNchPKawHFQ7NJzrhMFRK3mOkwb2wCNfNwa6i7WZK0t0puhb3ghOqyIGYUUZ9bVvhWl4
0TY1O16VKQYSH9JY1dUzhxe57hphfWuyQ8vJZ2rRjIGhdejd4vgFJlawupG5g7H9nybvLdVU43GV
aPUTnNQ8v5RvjCLHWn4b1Me1fr0T259ArU9IQL+Pl6XCcQKRavEpovaqfJuEi/mG9JN0//MwLwV5
E79HJHYEK/ApU2pfRjLWqnkWK1ZtmJBvozgPo234RjuR3PvpKS40iqdd78Re2Bmhy5jvPU+Df0NV
sy/Qvt5ZFyAevsjy1Z+AlfrOmQ0YvxlMZ5AcyDDvre4nvp6q2dvdQVyf9XrR8XqTXao7nZ56IEB1
aG8JgefuQyXR9A78NBwx8H4bQKkhcXXp0oSbwSMPPnys3BgWIBnfdFaoMNCrK8a9dj57Ef+uyIOl
m0pIXqCiY8C+wy/OcSkSY3X3vdUiDdxFYZvweMLMsNPb4fJrtSnRr0/eRqR0XiPsZPU6vAT39To5
gWqbsHLXGfe2g5paIv1Wzz83wvlFlaal8I8sdj9Qb3/ofPlVahWY0KS9sGiKz/WNfcDHgS/X3dK0
Q+tWE3iKDE9obC4XTx/fxlAS1I/zljJXdAyB12OPHLcoytBdLjKQ7/cSKsC8rbbwWPjOOjdrImqj
vvbOyUiQCrKLIH8s1Vi6yc9TlNCmHrL+MehRxOKCD7+u1f/UZGvxpiV0/htfceJndTYM9VfRKp4s
NMVvEBeBlJzFT75a6x7Phlyj/VC5inEFCiJf4Ov/sOa+YmqdYJ1idZFHVxwN5WwoKOQQSVDhLIq3
pPfdVPYvHNqtX0jCmtcrF+CRcDR8bT9DUpj0c8ohEl2dZVBIWpBCyenytq+paDDstdgSu3MJ45wn
3E57W4mOYwGwbqzRTtxnrxve6VonyumhBGQsmX6pbTttGf65Do56m5h9eUvq+IxBcnvnWGtqdluM
RL/F0cZ7OPLx6WdsBKImGVczCRbsaLNJmmHyhKl3roM/fBnrpKx81VScG6gG7Tv3kapLynBQ/ElY
Oc1+TaHvB7zgkZQtdY2dHL1Vfrqr9WXgy3s5gcBykrqcen8RqTZ9r1G7BinjkiWZ+0AflfwEIAh3
ritktZM+LSiN/pfED1+WhXv1nZZC982Dph8KDVcM7KgfF4QmrpbXPRXlowd6+EQXvlFn6s97OojQ
BL+NP8Bs3KlWm/SIzLE5GL55JHP9Esj1vss2lw2ihmW98Zkacyoyj/yWhOvaFqX06tLwbo1poyB6
QSY8+r0n1/rJDFeozqfGXZHE0jfS8KSUYqqy3UXXw7KB5kOlqfY3BZTj3jnJ7kQ269fb74q/TtOU
3xR2tD6dOiqa+3X8srmpy52meYSvp7jH5xctXUc3oKMlydrMX75fZdAoKw1fLR2LEhWrT3vpppB+
/cJa6QxzmDyPPnjYmzkV3YXuk2Caa+FQjSHNZ8Z6q0oLFwfMBnVNo/PgDH+BLGXjZkVf1tsLAFrJ
utPy5LRvUkgFnknbsVRYN2Fwuik0myEzQoa5dPJO1XN4ZKOO28Tp59JBhk7hukyDEb6e5kbgTLwe
CoDacbf09U5fZkFZX3aDmY/0DRHXznB86kDeZo+JonrF3Ad2K5kIbmPJtZVLRiu0sr4Ek17EqatY
84UJAtJd+FC17WnxHNQyYMzbNEZTmasOdhlk/nLZY3clMeeEnUehVHexym3ebb1WYDi0NdX1ZDTV
VrgTdTZe/6SGY3Wp7fYnp1uLn1i0ktVNe7ZtEKNZCG1JKTNpC+DvMYYjiIZOwJjcpmNjXRzzuOmc
eJAm1hRKKbw3NO5efIeq3LNgnCPM2Fg2NeBWz6zvPmbSNTFGRYKk0m29pf9HQclXATrxAw3l0+N1
8eDvsnUf19sq58kEC1MtL+q5qI7TC+xghjepKXi5dDoeaV4m1z892j1ZZZBPIp7G4/rvlqoaqTbo
GhVITkJn3gnteSc1nrdvOkZJl871a6ZCZkONkvRmqmn5ptF4NHR1N145mMXb+GpVeWrFMuEt2jKy
v1uRi/149bSJjipjosWVl+toAM11FtHGm67UMj7zqnV6rKq1op3/QKkRXVLpyiPnKvbxgTJJpr6b
pDYzswJqUSizmTVP1UKlLO3BGuRsSCDzwDOjf7IEQ0j1a7MYbcI3o4Mjfc25/Dt7u3eiUj90yK7w
iJ5Eh0HfmTq5qR5P/lCuT2kKBCQ7Y3RZiAfT4gRunsO7V5+dWpG8PjglyuBb2kUwdJDtfjsi9tnj
763VSo9KtpwsIx3bvvNd5YVEpuGoRkCoI/sO4RcyTR0EjsCntXGPlCzqb52ab47HaZcUKI/HFA8d
9qvvw35qrAaMKOWSXExiGwu/P9TSFET1ucx6hBI6NnkZbhVRXs+lqzTrIM1ZTi0kX04fj0xyguWQ
xLrROa44TqMTSk8ZKEW+eih9YO8v+hVLUAyCFa2FZeGBWSSO3d89a6nly63B0//HAeuF8J/Y/vdC
iHgILOS2BV+jG27DqCrfSw/5Nzd8nD0ODDpilsv9YbKUp1+bDdOtynuS+kengWlG/eXifvJxjYjz
217IpuMVf4l5XaKgnTzRRqMIsk7x9TdzF/1BxsX+ruFAj6JnhHMFp/R1btA0m2rvbbfCZUTzoCGO
zs6cFaPmo+0A9mmMqKVf7BHe73XOXMfQh2d/vj5zFJaUTc6KyBX4MlZDASTzDdtc01OLkunpT8Ys
EEzGHZDN/zSCeiKUm/q03a6pGhO51OqUhrW6lv+iZR/7Y/M+UXE2zchOODi4OaoKTWX4/Bts30KL
xzOa3eWkTBmmZ13rqp8ZX2FyXyOpUDLcKv0KZ/VprzrkfG8Qsu1UW/F6M64RN3niyoxK+GVygnh4
XqV62UUv/fKWOvWzSxNyqHOFbJh3U9Xjn8m+uqLm0ujppsYpVXLyQxFDtPfDVJ1R3R6uBFPncjOc
uVoUXcxa/c5mAxieP84T+0tn0ujqLqpZtFviyEgHrebU4Rc7EwSyHbztRrdU1XXsN6aq6O/mh8df
Jc/+nqsf+53hbnyfZCibLNAKb8q1n/1T2IIhuq9arWI3XEpSuk25UUceqmxv7StvkJhk+1SgueAd
m1KuEb+LtaXL16cpbE1hBMXaw/zeTGP2E5fFboKvUGfgiVbME7rT1nbccX3VhNfulS5qGaLfQ6MF
kbi+scT9TK5o+OScZXLt8VNza28X11XlVOWq4NrN9tmegppm7SDDufMvgc4PlzKTsKvztDI3tHn4
mavC94Ea12t4iaxefdfQWX9ueEO0pXJGZ5BpsGKDS99K0ruYqat9kvEnmbQVdnYpSTfZHu0dxfCQ
ewRT/wU4GrKprYmTs6Opoc2/inZG79GQIWzc5Gzk/yry87Oqetibsmq8NTVjVbH0NCX/+yWrujY5
QM5BDtElZ31rZ+f89wMb+VtWaVszO3IIz7/LYtr8XFxswhwQEWEuiLCIOPRviQMQFxZj5+aW4OTg
4OIRFvw/1/jbgISltbOpI6uEtaGzqZipsZ2JKaucqa25swU5Bzu3oCAa8n/13j0dOsGl+NIeE2kZ
v3tR6bc4k0aMkejTpueuwpXqJdMweEgLShjaHl7ngXUOLTo6eo/issHqdhTrvaRdPV3yDUvDb8pY
i5pvXWKwEam8xPiLlxY4RCH3eFJfUagnlwV8kOJePe6v8UsQw12GkUPZY14Gk/md9LyRcCIv4I3R
Juwb7Mx8czfyhiKs9Vl+GC4dokyrmGIUaSaeh1+ye9DWBb4HiS69zZ1QdxbabA6R0SjC/k9SktGn
n38S6o6SCGAGZ2wHcW1HulOTY/2WEnkdF+vPcSL57CoHAzKKIcr2KCAmyI8gwhpVHN0xNtgLtdM+
4rtUhAiChDFqTw6mOEHwH/fwF59CpD9FMHwKM5ITfSEDkLCz4VSzETmx4R8rfXQc6n2sakDx0hBI
MmBIMuRRM6BRM4ROZmFbVaLvViIQVb54Nx3BPB1mY9HhuvddYa/Ddq9db6/Th/i7MHGHIXG7MnGn
Q/p36fQOS9U11Pf2L7fsSfHtsZLtCdXt8absSbjsceqUwnnne0gm1lgOVgRJlykWsxEi3QN73f0L
3F/eipnirQQkqtdhH2e/PgT4DgsFDxsYsC9R+n1t34JOQHdHUzM0ZLa/c43n79t/PtjZyDmhUHYo
udn/ZAAX+b/eyW3/OwMg0AfZ3+s8yKAA5z+zvxdnf5BBIZAHGRfnw4wbeNAulJuT+58ZJxvHgzY4
IdwP+sfJ8bBdTg7ow4wTeHg9Tu4H48LJA3nQFy4A8qAeFzuE40EG5fnnWAEAwP4wY4f+kwMAoJz/
HBcA4OL8ZxsA5O9w/TPjAPnt39vCP/sM/OV9UI+T58Hc+NssyDxgYwcezit2CEjGDpJxgGRQkIwT
JOMCybhBMp6HGQfIf4EDhIMDhIMDhIMDhIMDhIMDhIMDhIMDhIMDhAMKwgEF4YCCcEBBOKAgHFAQ
DigIBxSEAwrCAQXh4ATh4ATh4ATh4ATh4ATh4ATh4ATh4ATh4ATh4ATh4ALh4ALh4ALh4ALh4ALh
4ALh4ALh4ALh4ALh4ALh4Abh4Abh4Abh4Abh4Abh4Abh4Abh4Abh4Abh4Abh4AHh4AHh4AHh4AHh
4AHh4AHh4AHh4AHh4AHh4HnIAbA95ADYHnIAbA85ALaHHADbQw6A7SEHwPaQA2B7yAGwPeQA2EA4
ABAOAIQDAOEAQDgAEA4AhAMA4QBAOAAQDgCEAwLCAQHhgIBwQEA4ICAcEBAOCAgHBIQDAsIBAeEA
WRMCID4HQHwOgPgcAPH530UNSAbCAeJzAMTnAIjPARCfAyA+B0B8DoD4HADxOQDicwDE5wCIzwEQ
nwMgPgdAfA6A+BwA8TkA4nMAxOcAiM8BEJ8DID4HQHwOgPgcAPE5AOJzAMTnAIjPARCfAyA+B0B8
DoD4HADxOQDicwDE5wCIzwEQnwMgPgdAfA6A+BwA8TkA4nMAxOcAiM8BEJ8DID4HQHwOgPgcAPE5
AOJzAMTnAIjPARCfAyA+B0B8DoD4HADxOQDicwDE5wCIzwEQnwMgPgdAfA6A+BwC4nMIiM/ZHtSD
/GvN/+9vbP87Y//nvvavBP9jr/HPjOuf+/O/YgT+uc/7m7Hz/KMe5D+WcP/b/tfZ0dDS2tTxX+db
/3mqxfN//Sjr34dVho7O/z7egPzHbZUHDZmGRlxR4n/OPNj+H/WOVcnR1JX8353613GfirMN+b/H
7UHHodyQ/+r4/wJQSwECFAAUAAAACADglqxG9w/4c7UGAAB2FQAABwAkAAAAAAAAACAAAAAAAAAA
ZXZlbnQuaAoAIAAAAAAAAQAYAApCyQ0PjdABGUTIDQ+N0AE+vA3pA4zQAVBLAQIUABQAAAAIACRk
q0ZJ3J277wQAANsbAAAKACQAAAAAAAAAIAAAANoGAABmdW5fcHRyMi5oCgAgAAAAAAABABgADnAU
ixCM0AHj/BKLEIzQATySGOkDjNABUEsBAhQAFAAAAAgAtVqrRvqZ2KAfCAAA1DAAAAoAJAAAAAAA
AAAgAAAA8QsAAGZ1bl9wdHIzLmgKACAAAAAAAAEAGAD4h6GQBozQAUQBoJAGjNABllUZ6QOM0AFQ
SwECFAAUAAAACAAlUqtG4U74cPgHAABfHQAAEwAkAAAAAAAAACAAAAA4FAAAZnVuX3B0cl9pbnRl
cmZhY2UuaAoAIAAAAAAAAQAYAIAIRIz9i9ABgCaq6AOM0AEbjBvpA4zQAVBLAQIUABQAAAAIAMKZ
rEagXxg/zgQAAMcfAAARACQAAAAAAAAAIAAAAGEcAAB0ZXN0X2RlbGVnYXRlLmNwcAoAIAAAAAAA
AQAYAKn1VrcRjdABLr9UtxGN0AGqpg7pA4zQAVBLAQIUABQAAAAIAC+arEZGbwG0GvUCALwkAwAc
AAAAAAAAAAAAIAAAAF4hAABBIFNtYXJ0IEZ1bmN0aW9uIFBvaW50ZXIucGRmUEsFBgAAAAAGAAYA
IwIAALIWAwAAAA==
------=_Part_3430_76621746.1431476808805--
.
Author: David Krauss <potswa@mac.com>
Date: Wed, 13 May 2015 10:48:19 +0800
Raw View
--Apple-Mail=_D08FD25A-CF2E-43B2-AA15-6CE2260B41B9
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9313, at 8:26 AM, Houe <mboyko2000@gmail.com <ma=
ilto:mboyko2000@gmail.com>> wrote:
>=20
> Here is a proposal document for a smart function pointer.
Function wrapper types and memory management are a bit complicated, so it=
=E2=80=99s important to leverage existing functionality. I think std::funct=
ion (and any successors) should completely handle type erasure, std::shared=
_ptr should implement reference counting, and std::reference_wrapper should=
indicate functor observer semantics. These three components can already be=
combined:
template< typename t >
class shared_reference
: public std::reference_wrapper< t > {
std::shared_ptr< t > ptr;
public:
/* implicit */ shared_reference( std::shared_ptr< t > in_ptr )
: std::reference_wrapper< t >( * in_ptr )
, ptr( std::move( in_ptr ) )
{}
};
// Demo:
struct heavyweight {
std::map< std::string, payload > big_state;
foo operator () ( bar );
fizz operator () ( buzz );
};
shared_reference< heavyweight > on_heap =3D std::make_shared< heavyweight >=
();
std::function< foo( bar ) > =3D on_heap;
std::function< fizz( buzz ) > =3D on_heap;
Composing a reference_wrapper with a shared_ptr does lead to duplication of=
state, which is likely to tip std::function into the heap allocation regim=
e. You could implement the reference_wrapper interface yourself based using=
the shared_ptr, and if the use-case is common enough, perhaps the standard=
library should provide that. If the operator-dot proposal brings us more t=
ransparent reference classes, there will be similar use-cases outside funct=
ions too, and such a standard template becomes more likely.
Unfortunately, std::bind respects only bona-fide std::reference_wrapper obj=
ects, not derived ones. This is easily fixable, though. It=E2=80=99s possib=
le to roughly detect inheritance from a template specialization by inspecti=
ng the injected-class-name, e.g. the standard could say =E2=80=9Cif typenam=
e TiD::reference_wrapper is reference_wrapper<T>, the argument is tid.get()=
and its type Vi is T&.=E2=80=9D Phrasing it exactly thus would allow a cus=
tom wrapper with no inheritance, but implementing a member typedef and get.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_D08FD25A-CF2E-43B2-AA15-6CE2260B41B9
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"><meta http-equiv=3D"Content-Type" content=3D"text/html charset=3D=
utf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: spac=
e; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><div c=
lass=3D""><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=
=80=9305=E2=80=9313, at 8:26 AM, Houe <<a href=3D"mailto:mboyko2000@gmai=
l.com" class=3D"">mboyko2000@gmail.com</a>> wrote:</div><br class=3D"App=
le-interchange-newline"><div class=3D""><div dir=3D"ltr" class=3D"">Here is=
a proposal document for a smart function pointer. </div></div></blockquote=
><div class=3D""><br class=3D""></div><div class=3D"">Function wrapper type=
s and memory management are a bit complicated, so it=E2=80=99s important to=
leverage existing functionality. I think <font face=3D"Courier" class=3D""=
>std::function</font> (and any successors) should completely handle type er=
asure, <font face=3D"Courier" class=3D"">std::shared_ptr</font> should=
implement reference counting, and <font face=3D"Courier" class=3D"">std::r=
eference_wrapper</font> should indicate functor observer semantics. These t=
hree components can already be combined:</div><div class=3D""><br class=3D"=
"></div><div class=3D""><font face=3D"Courier" class=3D"">template< type=
name t ></font></div><div class=3D""><font face=3D"Courier" class=3D"">c=
lass shared_reference</font></div><div class=3D""><font face=3D"Courier" cl=
ass=3D""> : public std::reference_wrapper< t > {</font><=
/div><div class=3D""><font face=3D"Courier" class=3D""> std::s=
hared_ptr< t > ptr;</font></div><div class=3D""><font face=3D"Courier=
" class=3D"">public:</font></div><div class=3D""><font face=3D"Courier" cla=
ss=3D""> /* implicit */ shared_reference( std::shared_ptr< =
t > in_ptr )</font></div><div class=3D""><font face=3D"Courier" class=3D=
""> : std::reference_wrapper< t >( * in_pt=
r )</font></div><div class=3D""><font face=3D"Courier" class=3D""> &n=
bsp; , ptr( std::move( in_ptr ) )</font></div><div class=3D""=
><font face=3D"Courier" class=3D""> {}</font></d=
iv><div class=3D""><span style=3D"font-family: Courier;" class=3D"">};</spa=
n></div><div class=3D""><font face=3D"Courier" class=3D""><br class=3D""></=
font></div><div class=3D""><font face=3D"Courier" class=3D"">// Demo:</font=
></div><div class=3D""><font face=3D"Courier" class=3D"">struct heavyweight=
{</font></div><div class=3D""><font face=3D"Courier" class=3D""> &nb=
sp; std::map< std::string, payload > big_state;</font></div><div clas=
s=3D""><font face=3D"Courier" class=3D""><br class=3D""></font></div><div c=
lass=3D""><font face=3D"Courier" class=3D""> foo operator () (=
bar );</font></div><div class=3D""><font face=3D"Courier" class=3D""> =
; fizz operator () ( buzz );</font></div><div class=3D""><font face=
=3D"Courier" class=3D"">};</font></div><div class=3D""><font face=3D"Courie=
r" class=3D""><br class=3D""></font></div><div class=3D""><font face=3D"Cou=
rier" class=3D"">shared_reference< heavyweight > on_heap =3D std::mak=
e_shared< heavyweight >();</font></div><div class=3D""><font face=3D"=
Courier" class=3D"">std::function< foo( bar ) > =3D on_heap;</font></=
div><div class=3D""><div class=3D""><font face=3D"Courier" class=3D"">std::=
function< fizz( buzz ) > =3D on_heap;</font></div><div class=3D""><fo=
nt face=3D"Courier" class=3D""><br class=3D""></font></div><div class=3D"">=
Composing a <font face=3D"Courier" class=3D"">reference_wrapper</font> with=
a <font face=3D"Courier" class=3D"">shared_ptr</font> does lead to duplica=
tion of state, which is likely to tip <font face=3D"Courier" class=3D"=
">std::function</font> into the heap allocation regime. You could implement=
the <font face=3D"Courier" class=3D"">reference_wrapper</font> interface y=
ourself based using the <font face=3D"Courier" class=3D"">shared_ptr</font>=
, and if the use-case is common enough, perhaps the standard library should=
provide that. If the operator-dot proposal brings us more transparent refe=
rence classes, there will be similar use-cases outside functions too, and s=
uch a standard template becomes more likely.</div><div class=3D""><br class=
=3D""></div><div class=3D"">Unfortunately, <font face=3D"Courier" class=3D"=
">std::bind</font> respects only bona-fide <font face=3D"Courier" clas=
s=3D"">std::reference_wrapper</font> objects, not derived ones. This is eas=
ily fixable, though. It=E2=80=99s possible to roughly detect inheritance fr=
om a template specialization by inspecting the injected-class-name, e.g. th=
e standard could say =E2=80=9Cif <font face=3D"Courier" class=3D"">typename=
TiD::reference_wrapper</font> is <font face=3D"Courier" class=3D=
"">reference_wrapper<T></font>, the argument is <font face=3D"Co=
urier" class=3D"">tid.get()</font> and its type <font face=3D"Cou=
rier" class=3D"">Vi</font> is <font face=3D"Courier" class=3D"">T=
&</font>.=E2=80=9D Phrasing it exactly thus would allow a custom wrappe=
r with no inheritance, but implementing a member typedef and <font face=3D"=
Courier" class=3D"">get</font>.</div></div></div></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_D08FD25A-CF2E-43B2-AA15-6CE2260B41B9--
.
Author: Houe <mboyko2000@gmail.com>
Date: Tue, 12 May 2015 20:16:51 -0700 (PDT)
Raw View
------=_Part_2459_902246888.1431487011209
Content-Type: multipart/alternative;
boundary="----=_Part_2460_681415149.1431487011209"
------=_Part_2460_681415149.1431487011209
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Hmm. Did you even read my proposal and understand the code? Your comments=
=20
don't seem to address my proposal. std::function can't do equality=20
comparison which has always been my biggest problem with it. Removes a lot=
=20
of usefulness hence my proposal.
On Tuesday, May 12, 2015 at 9:48:30 PM UTC-5, David Krauss wrote:
>
> On 2015=E2=80=9305=E2=80=9313, at 8:26 AM, Houe <mboyk...@gmail.com <java=
script:>> wrote:
>
> Here is a proposal document for a smart function pointer.=20
>
>
> Function wrapper types and memory management are a bit complicated, so=20
> it=E2=80=99s important to leverage existing functionality. I think std::f=
unction=20
> (and any successors) should completely handle type erasure,=20
> std::shared_ptr should implement reference counting, and=20
> std::reference_wrapper should indicate functor observer semantics. These=
=20
> three components can already be combined:
>
> template< typename t >
> class shared_reference
> : public std::reference_wrapper< t > {
> std::shared_ptr< t > ptr;
> public:
> /* implicit */ shared_reference( std::shared_ptr< t > in_ptr )
> : std::reference_wrapper< t >( * in_ptr )
> , ptr( std::move( in_ptr ) )
> {}
> };
>
> // Demo:
> struct heavyweight {
> std::map< std::string, payload > big_state;
>
> foo operator () ( bar );
> fizz operator () ( buzz );
> };
>
> shared_reference< heavyweight > on_heap =3D std::make_shared< heavyweight=
=20
> >();
> std::function< foo( bar ) > =3D on_heap;
> std::function< fizz( buzz ) > =3D on_heap;
>
> Composing a reference_wrapper with a shared_ptr does lead to duplication=
=20
> of state, which is likely to tip std::function into the heap allocation=
=20
> regime. You could implement the reference_wrapper interface yourself=20
> based using the shared_ptr, and if the use-case is common enough, perhaps=
=20
> the standard library should provide that. If the operator-dot proposal=20
> brings us more transparent reference classes, there will be similar=20
> use-cases outside functions too, and such a standard template becomes mor=
e=20
> likely.
>
> Unfortunately, std::bind respects only bona-fide std::reference_wrapper=
=20
> objects, not derived ones. This is easily fixable, though. It=E2=80=99s p=
ossible to=20
> roughly detect inheritance from a template specialization by inspecting t=
he=20
> injected-class-name, e.g. the standard could say =E2=80=9Cif typename=20
> TiD::reference_wrapper is reference_wrapper<T>, the argument is tid.get()=
and=20
> its type Vi is T&.=E2=80=9D Phrasing it exactly thus would allow a custom=
wrapper=20
> with no inheritance, but implementing a member typedef and get.
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_2460_681415149.1431487011209
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>Hmm. Did you even read my proposal and understand the=
code? Your comments don't seem to address my proposal. std::function can't=
do equality comparison which has always been my biggest problem with it. R=
emoves a lot of usefulness hence my proposal.</div><div><br>On Tuesday, May=
12, 2015 at 9:48:30 PM UTC-5, David Krauss wrote:</div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; bor=
der-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-sty=
le: solid;"><div style=3D"-ms-word-wrap: break-word;"><br><div><blockquote =
type=3D"cite"><div>On 2015=E2=80=9305=E2=80=9313, at 8:26 AM, Houe <<a o=
nmousedown=3D"this.href=3D'javascript:';return true;" onclick=3D"this.href=
=3D'javascript:';return true;" href=3D"javascript:" target=3D"_blank" rel=
=3D"nofollow" gdf-obfuscated-mailto=3D"l0dggcz95n8J">mboyk...@gmail.com</a>=
> wrote:</div><br><div><div dir=3D"ltr">Here is a proposal document for =
a smart function pointer. </div></div></blockquote><div><br></div><div>Func=
tion wrapper types and memory management are a bit complicated, so it=E2=80=
=99s important to leverage existing functionality. I think <font face=3D"Co=
urier">std::function</font> (and any successors) should completely handle t=
ype erasure, <font face=3D"Courier">std::shared_ptr</font> should impl=
ement reference counting, and <font face=3D"Courier">std::reference_wrapper=
</font> should indicate functor observer semantics. These three components =
can already be combined:</div><div><br></div><div><font face=3D"Courier">te=
mplate< typename t ></font></div><div><font face=3D"Courier">class sh=
ared_reference</font></div><div><font face=3D"Courier"> : publ=
ic std::reference_wrapper< t > {</font></div><div><font face=3D"Couri=
er"> std::shared_ptr< t > ptr;</font></div><div><font fa=
ce=3D"Courier">public:</font></div><div><font face=3D"Courier">  =
; /* implicit */ shared_reference( std::shared_ptr< t > in_ptr )</fon=
t></div><div><font face=3D"Courier"> : std::refe=
rence_wrapper< t >( * in_ptr )</font></div><div><font face=3D"Courier=
"> , ptr( std::move( in_ptr ) )</font></div><div=
><font face=3D"Courier"> {}</font></div><div><sp=
an style=3D"font-family: Courier;">};</span></div><div><font face=3D"Courie=
r"><br></font></div><div><font face=3D"Courier">// Demo:</font></div><div><=
font face=3D"Courier">struct heavyweight {</font></div><div><font face=3D"C=
ourier"> std::map< std::string, payload > big_state;</fo=
nt></div><div><font face=3D"Courier"><br></font></div><div><font face=3D"Co=
urier"> foo operator () ( bar );</font></div><div><font face=
=3D"Courier"> fizz operator () ( buzz );</font></div><div><fon=
t face=3D"Courier">};</font></div><div><font face=3D"Courier"><br></font></=
div><div><font face=3D"Courier">shared_reference< heavyweight > on_he=
ap =3D std::make_shared< heavyweight >();</font></div><div><font face=
=3D"Courier">std::function< foo( bar ) > =3D on_heap;</font></div><di=
v><div><font face=3D"Courier">std::function< fizz( buzz ) > =3D on_he=
ap;</font></div><div><font face=3D"Courier"><br></font></div><div>Composing=
a <font face=3D"Courier">reference_wrapper</font> with a <font face=3D"Cou=
rier">shared_ptr</font> does lead to duplication of state, which is likely =
to tip <font face=3D"Courier">std::function</font> into the heap alloc=
ation regime. You could implement the <font face=3D"Courier">reference_wrap=
per</font> interface yourself based using the <font face=3D"Courier">shared=
_ptr</font>, and if the use-case is common enough, perhaps the standard lib=
rary should provide that. If the operator-dot proposal brings us more trans=
parent reference classes, there will be similar use-cases outside functions=
too, and such a standard template becomes more likely.</div><div><br></div=
><div>Unfortunately, <font face=3D"Courier">std::bind</font> respects =
only bona-fide <font face=3D"Courier">std::reference_wrapper</font> objects=
, not derived ones. This is easily fixable, though. It=E2=80=99s possible t=
o roughly detect inheritance from a template specialization by inspecting t=
he injected-class-name, e.g. the standard could say =E2=80=9Cif <font face=
=3D"Courier">typename TiD::reference_wrapper</font> is <font face=
=3D"Courier">refe<wbr>rence_wrapper<T></font>, the argument is <=
font face=3D"Courier">tid.get()</font> and its type <font face=3D=
"Courier">Vi</font> is <font face=3D"Courier">T&</font>.=E2=
=80=9D Phrasing it exactly thus would allow a custom wrapper with no inheri=
tance, but implementing a member typedef and <font face=3D"Courier">get</fo=
nt>.</div></div></div></div></blockquote></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_2460_681415149.1431487011209--
------=_Part_2459_902246888.1431487011209--
.
Author: Houe <mboyko2000@gmail.com>
Date: Tue, 12 May 2015 20:44:45 -0700 (PDT)
Raw View
------=_Part_3217_916257476.1431488685999
Content-Type: multipart/alternative;
boundary="----=_Part_3218_2081650142.1431488685999"
------=_Part_3218_2081650142.1431488685999
Content-Type: text/plain; charset=UTF-8
Equality comparison is the key feature and opens up so many more
possibilities than std::function has. The basic idea is this:
void standalone_function(int a)
{
}
class some_class {
public:
void member_function(int a) {}
};
int main()
{
auto fp1 = make_fun(&standalone_function);
fp1(1); //call standalone_function
some_class foo;
auto fp2 = make_fun(&some_class::member_function, &foo);
fp2(1); //call member_function() on foo instance
bool compare = (fp1 == fp2); // false
auto fp3 = make_fun([](int) {
//do something
});
fp3(1); //call the lambda
bool compare2 = (fp1 == fp3); //false
fp1 = fp2;
bool compare3 = (fp1 == fp2); //true
}
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_3218_2081650142.1431488685999
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>Equality comparison is the key feature and opens up s=
o many more possibilities than std::function has. The basic idea is this:</=
div><div><br></div><div>void standalone_function(int a)</div><div>{</d=
iv><div>}</div><div><br></div><div>class some_class {</div><div>public:</di=
v><div> void member_function(int a) {}</div><div>}; </div>=
<div><br></div><div>int main()</div><div>{</div><div> auto fp1 =
=3D make_fun(&standalone_function);</div><div> fp1(1); //ca=
ll standalone_function</div><div><br></div><div> some_class foo=
;</div><div> auto fp2 =3D make_fun(&some_class::member_func=
tion, &foo);</div><div> fp2(1); //call member_function() on=
foo instance</div><div><br></div><div> bool compare =3D (fp1 =
=3D=3D fp2); // false</div><div><br></div><div> auto fp3 =3D ma=
ke_fun([](int) {</div><div> //do something</d=
iv><div> });</div><div> fp3(1); //call the lambda</=
div><div><br></div><div> bool compare2 =3D (fp1 =3D=3D fp3); //=
false</div><div><br></div><div> fp1 =3D fp2;</div><div><div>&nb=
sp; bool compare3 =3D (fp1 =3D=3D fp2); //true</div></div><div>}</div=
><div><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_3218_2081650142.1431488685999--
------=_Part_3217_916257476.1431488685999--
.
Author: Christopher Jefferson <chris@bubblescope.net>
Date: Wed, 13 May 2015 12:03:49 +0100
Raw View
On 13 May 2015 at 04:16, Houe <mboyko2000@gmail.com> wrote:
> Hmm. Did you even read my proposal and understand the code? Your comments
> don't seem to address my proposal. std::function can't do equality
> comparison which has always been my biggest problem with it. Removes a lo=
t
> of usefulness hence my proposal.
I have read your proposal, but I don't really understand what you are
getting at.
Is the only useful feature your tool adds equality comparison? What
does your wrapper lose in comparison with std::function?
Do you believe std::function could be efficiently extended with
operator=3D=3D? (If that is the case, adding operator=3D=3D there seems lik=
e a
better idea).
I feel there should be an extremely high bar to introducing a second
function wrapper (and std::function isn't going away soon, if ever).
Can you explain exactly what is wrong with std::function, and why it
cannot be fixed?
Chris
>
> On Tuesday, May 12, 2015 at 9:48:30 PM UTC-5, David Krauss wrote:
>>
>>
>> On 2015=E2=80=9305=E2=80=9313, at 8:26 AM, Houe <mboyk...@gmail.com> wro=
te:
>>
>> Here is a proposal document for a smart function pointer.
>>
>>
>> Function wrapper types and memory management are a bit complicated, so
>> it=E2=80=99s important to leverage existing functionality. I think std::=
function
>> (and any successors) should completely handle type erasure, std::shared_=
ptr
>> should implement reference counting, and std::reference_wrapper should
>> indicate functor observer semantics. These three components can already =
be
>> combined:
>>
>> template< typename t >
>> class shared_reference
>> : public std::reference_wrapper< t > {
>> std::shared_ptr< t > ptr;
>> public:
>> /* implicit */ shared_reference( std::shared_ptr< t > in_ptr )
>> : std::reference_wrapper< t >( * in_ptr )
>> , ptr( std::move( in_ptr ) )
>> {}
>> };
>>
>> // Demo:
>> struct heavyweight {
>> std::map< std::string, payload > big_state;
>>
>> foo operator () ( bar );
>> fizz operator () ( buzz );
>> };
>>
>> shared_reference< heavyweight > on_heap =3D std::make_shared< heavyweigh=
t
>> >();
>> std::function< foo( bar ) > =3D on_heap;
>> std::function< fizz( buzz ) > =3D on_heap;
>>
>> Composing a reference_wrapper with a shared_ptr does lead to duplication
>> of state, which is likely to tip std::function into the heap allocation
>> regime. You could implement the reference_wrapper interface yourself bas=
ed
>> using the shared_ptr, and if the use-case is common enough, perhaps the
>> standard library should provide that. If the operator-dot proposal bring=
s us
>> more transparent reference classes, there will be similar use-cases outs=
ide
>> functions too, and such a standard template becomes more likely.
>>
>> Unfortunately, std::bind respects only bona-fide std::reference_wrapper
>> objects, not derived ones. This is easily fixable, though. It=E2=80=99s =
possible to
>> roughly detect inheritance from a template specialization by inspecting =
the
>> injected-class-name, e.g. the standard could say =E2=80=9Cif typename
>> TiD::reference_wrapper is reference_wrapper<T>, the argument is tid.get(=
)
>> and its type Vi is T&.=E2=80=9D Phrasing it exactly thus would allow a c=
ustom
>> wrapper with no inheritance, but implementing a member typedef and get.
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
.
Author: Houe <mboyko2000@gmail.com>
Date: Wed, 13 May 2015 04:26:57 -0700 (PDT)
Raw View
------=_Part_3231_16786881.1431516417193
Content-Type: multipart/alternative;
boundary="----=_Part_3232_816751210.1431516417194"
------=_Part_3232_816751210.1431516417194
Content-Type: text/plain; charset=UTF-8
Chris,
Thanks for taking the time to examine it. Yes, equality comparison is the
main feature this proposal improves on over std::function. I do not know of
a viable strategy to add equality into function and neither do the
designers (if there was it would have it by now). In my proposal I
references the boost FAQ as to why std::function is unable to provide
equality comparison. I also referenced N4159 which is a proposal to fix
std::function's const incorrectness. In addition beside std::function's
const incorrectness std::function performs a deep copy (copies the function
object given to it) which is not the semantics of a pointer like type.
fun_ptr (by combining parts of bind and function into a single class) is
able to provide equality comparison, true function pointer like semantics
(hence the class name), and better syntax (function + bind looks pretty
ugly in comparison). I agree the bar needs to be very high to introduce a
new std library feature. If there is not enough interest then this will
remain just be a 3rd party library instead of a standard one.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_3232_816751210.1431516417194
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Chris,<div><br></div><div>Thanks for taking the time to ex=
amine it. Yes, equality comparison is the main feature this proposal improv=
es on over std::function. I do not know of a viable strategy to add equalit=
y into function and neither do the designers (if there was it would have it=
by now). In my proposal I references the boost FAQ as to why std::function=
is unable to provide equality comparison. I also referenced N4159 which is=
a proposal to fix std::function's const incorrectness. In addition beside =
std::function's const incorrectness std::function performs a deep copy (cop=
ies the function object given to it) which is not the semantics of a pointe=
r like type. fun_ptr (by combining parts of bind and function into a single=
class) is able to provide equality comparison, true function pointer like =
semantics (hence the class name), and better syntax (function + bind looks =
pretty ugly in comparison). I agree the bar needs to be very high to introd=
uce a new std library feature. If there is not enough interest then this wi=
ll remain just be a 3rd party library instead of a standard one.</div></div=
>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_3232_816751210.1431516417194--
------=_Part_3231_16786881.1431516417193--
.
Author: David Krauss <potswa@mac.com>
Date: Wed, 13 May 2015 21:14:39 +0800
Raw View
--Apple-Mail=_BB418AEB-9516-4304-A520-BD2310B38760
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9313, at 7:26 PM, Houe <mboyko2000@gmail.com> wr=
ote:
>=20
> Thanks for taking the time to examine it. Yes, equality comparison is the=
main feature this proposal improves on over std::function.
Forgive me for overlooking that.
> I do not know of a viable strategy to add equality into function and neit=
her do the designers (if there was it would have it by now).
That=E2=80=99s a leap of logic.
One quite feasible way to give std::function equality-checking capabilities=
on par with your utility, along with much other functionality, would be to=
extend its single signature to a variadic list:
typedef std::function< ret( arg ), std::shared_ptr< void * >( get_ptr_tag )=
> equality_func;
bool operator =3D=3D ( equality_func const & lhs, equality_func const & rhs=
)
{ return lhs( get_ptr_tag{} ) =3D=3D rhs( get_ptr_tag{} ); }
Multiple-signature std::functions might not be mentioned in N4159, but I th=
ink they=E2=80=99re likely to happen sooner or later. The implementation is=
likely to use a vtable instead of a raw pointer, but otherwise they should=
n=E2=80=99t be much different from the existing single-signature case.
> In my proposal I references the boost FAQ as to why std::function is unab=
le to provide equality comparison.
That comparison semantic, using operator=3D=3D, is completely different.
For what it=E2=80=99s worth, I think void *std::function::target< void >() =
might be nice. It would also enable this kind of identity checking, as long=
as you know both targets are standard-layout with compatible identifying i=
nfo at the beginning. Possible to arrange for something like shared_referen=
ce, but still a narrow use-case in the grand scheme of things.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_BB418AEB-9516-4304-A520-BD2310B38760
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=80=9305=
=E2=80=9313, at 7:26 PM, Houe <<a href=3D"mailto:mboyko2000@gmail.com" c=
lass=3D"">mboyko2000@gmail.com</a>> wrote:</div><br class=3D"Apple-inter=
change-newline"><div class=3D""><div dir=3D"ltr" class=3D""><div class=3D""=
>Thanks for taking the time to examine it. Yes, equality comparison is the =
main feature this proposal improves on over std::function. </div></div></di=
v></blockquote><div><br class=3D""></div><div>Forgive me for overlooking th=
at.</div><div><br class=3D""></div><blockquote type=3D"cite" class=3D""><di=
v class=3D""><div dir=3D"ltr" class=3D""><div class=3D"">I do not know of a=
viable strategy to add equality into function and neither do the designers=
(if there was it would have it by now). </div></div></div></blockquote><di=
v><br class=3D""></div><div>That=E2=80=99s a leap of logic.</div><div><br c=
lass=3D""></div><div>One quite feasible way to give <font face=3D"Courier" =
class=3D"">std::function</font> equality-checking capabilities on par with =
your utility, along with much other functionality, would be to extend its s=
ingle signature to a variadic list:</div><div><br class=3D""></div><div><fo=
nt face=3D"Courier" class=3D"">typedef std::function< ret( arg ), std::s=
hared_ptr< void * >( get_ptr_tag ) > equality_func;</font></div><d=
iv><font face=3D"Courier" class=3D""><br class=3D""></font></div><div><font=
face=3D"Courier" class=3D"">bool operator =3D=3D ( equality_func const &am=
p; lhs, equality_func const & rhs )</font></div><div><font face=3D"Cour=
ier" class=3D""> { return lhs( get_ptr_tag{} ) =3D=3D rhs( get=
_ptr_tag{} ); }</font></div><div><br class=3D""></div><div>Multiple-signatu=
re <font face=3D"Courier" class=3D"">std::function</font>s might not be men=
tioned in N4159, but I think they=E2=80=99re likely to happen sooner or lat=
er. The implementation is likely to use a vtable instead of a raw pointer, =
but otherwise they shouldn=E2=80=99t be much different from the existing si=
ngle-signature case.</div><br class=3D""><blockquote type=3D"cite" class=3D=
""><div class=3D""><div dir=3D"ltr" class=3D""><div class=3D"">In my propos=
al I references the boost FAQ as to why std::function is unable to provide =
equality comparison. </div></div></div></blockquote><div><br class=3D""></d=
iv><div>That comparison semantic, using <font face=3D"Courier" class=3D"">o=
perator=3D=3D</font>, is completely different.</div><div><br class=3D""></d=
iv><div>For what it=E2=80=99s worth, I think <font face=3D"Courier" class=
=3D"">void *std::function::target< void >()</font> might be nice=
.. It would also enable this kind of identity checking, as long as you know =
both targets are standard-layout with compatible identifying info at the be=
ginning. Possible to arrange for something like <font face=3D"Courier" clas=
s=3D"">shared_reference</font>, but still a narrow use-case in the grand sc=
heme of things.</div></div></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_BB418AEB-9516-4304-A520-BD2310B38760--
.
Author: Arthur O'Dwyer <arthur.j.odwyer@gmail.com>
Date: Wed, 13 May 2015 23:03:46 -0700 (PDT)
Raw View
------=_Part_3132_512422251.1431583426496
Content-Type: multipart/alternative;
boundary="----=_Part_3133_871348087.1431583426496"
------=_Part_3133_871348087.1431583426496
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On Tuesday, May 12, 2015 at 8:44:46 PM UTC-7, Michael Boyko wrote:
>
> Equality comparison is the key feature and opens up so many more=20
> possibilities than std::function has.
>
=20
What would you suggest the output ought to be for
http://melpon.org/wandbox/permlink/MdGMF2NFqO5bIYtT
auto lam1 =3D [state=3D0]() mutable { return state++; };
std::function<int(void)> f1 =3D lam1; lam1();
std::function<int(void)> f2 =3D lam1;
return (f1 =3D=3D f2); // true or false? f1 and f2 have different beha=
viors
or for that matter
auto lam1 =3D [state=3D0]() mutable { return state++; };
std::function<int(void)> f1 =3D lam1;
std::function<int(void)> f2 =3D f1;
assert(f1 =3D=3D f2); // "obviously" true at this point, right?
f1();
assert(f1 =3D=3D f2); // is it still true at this point? f1 and f2 have=
=20
different behaviors
OTOH, if we ignore these "difficult" cases, then what you describe in the=
=20
paper can be implemented as a (very thin wrapper around a)=20
std::shared_ptr<std::function<SignatureType>>. Your make_fun is equivalent=
=20
to make_shared and can be implemented in terms of it.
=E2=80=93Arthur
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_3133_871348087.1431583426496
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Tuesday, May 12, 2015 at 8:44:46 PM UTC-7, Michael Boyk=
o wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0=
..8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>=
Equality comparison is the key feature and opens up so many more possibilit=
ies than std::function has.</div></div></blockquote><div> </div><div>W=
hat would you suggest the output ought to be for</div><div><a href=3D"http:=
//melpon.org/wandbox/permlink/MdGMF2NFqO5bIYtT">http://melpon.org/wandbox/p=
ermlink/MdGMF2NFqO5bIYtT<br></a></div><div><br></div><div><div class=3D"pre=
ttyprint" style=3D"background-color: rgb(250, 250, 250); border: 1px solid =
rgb(187, 187, 187); word-wrap: break-word;"><code class=3D"prettyprint"><di=
v class=3D"subprettyprint"><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> </span><span style=3D"color: #008;" class=3D"styled=
-by-prettify">auto</span><span style=3D"color: #000;" class=3D"styled-by-pr=
ettify"> lam1 </span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </=
span><span style=3D"color: #660;" class=3D"styled-by-prettify">[</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify">state</span><span sty=
le=3D"color: #660;" class=3D"styled-by-prettify">=3D</span><span style=3D"c=
olor: #066;" class=3D"styled-by-prettify">0</span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">]()</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"> </span><span style=3D"color: #008;" class=3D"sty=
led-by-prettify">mutable</span><span style=3D"color: #000;" class=3D"styled=
-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-prett=
ify">{</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </s=
pan><span style=3D"color: #008;" class=3D"styled-by-prettify">return</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> state</span><spa=
n style=3D"color: #660;" class=3D"styled-by-prettify">++;</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">};</span><span style=3D"color: #000;"=
class=3D"styled-by-prettify"><br> std</span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">::</span><span style=3D"color: #00=
8;" class=3D"styled-by-prettify">function</span><span style=3D"color: #660;=
" class=3D"styled-by-prettify"><</span><span style=3D"color: #008;" clas=
s=3D"styled-by-prettify">int</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">(</span><span style=3D"color: #008;" class=3D"styled-by-p=
rettify">void</span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">)></span><span style=3D"color: #000;" class=3D"styled-by-prettify"> f=
1 </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=3D</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"> lam1</span><sp=
an style=3D"color: #660;" class=3D"styled-by-prettify">;</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> lam1</span><span style=3D"c=
olor: #660;" class=3D"styled-by-prettify">();</span><span style=3D"color: #=
000;" class=3D"styled-by-prettify"><br> std</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">::</span><span style=3D"colo=
r: #008;" class=3D"styled-by-prettify">function</span><span style=3D"color:=
#660;" class=3D"styled-by-prettify"><</span><span style=3D"color: #008;=
" class=3D"styled-by-prettify">int</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">(</span><span style=3D"color: #008;" class=3D"style=
d-by-prettify">void</span><span style=3D"color: #660;" class=3D"styled-by-p=
rettify">)></span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"> f2 </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> lam1</=
span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"><br> </s=
pan><span style=3D"color: #008;" class=3D"styled-by-prettify">return</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span sty=
le=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"col=
or: #000;" class=3D"styled-by-prettify">f1 </span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">=3D=3D</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify"> f2</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">);</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"> </span><span style=3D"color: #800;" class=3D"styled-=
by-prettify">// true or false? f1 and f2 have different behaviors</span></d=
iv></code></div><div><br></div></div><div>or for that matter</div><div><br>=
</div><div><div class=3D"prettyprint" style=3D"background-color: rgb(250, 2=
50, 250); border: 1px solid rgb(187, 187, 187); word-wrap: break-word;"><co=
de class=3D"prettyprint"><div class=3D"subprettyprint"><span style=3D"color=
: #000;" class=3D"styled-by-prettify"> </span><span style=3D"c=
olor: #008;" class=3D"styled-by-prettify">auto</span><span style=3D"color: =
#000;" class=3D"styled-by-prettify"> lam1 </span><span style=3D"color: #660=
;" class=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D"styl=
ed-by-prettify">[</span><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify">state</span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">=3D</span><span style=3D"color: #066;" class=3D"styled-by-prettify">0</sp=
an><span style=3D"color: #660;" class=3D"styled-by-prettify">]()</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">mutable</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #=
660;" class=3D"styled-by-prettify">{</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"> </span><span style=3D"color: #008;" class=3D"sty=
led-by-prettify">return</span><span style=3D"color: #000;" class=3D"styled-=
by-prettify"> state</span><span style=3D"color: #660;" class=3D"styled-by-p=
rettify">++;</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">};</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"><br> &nbs=
p; std</span><span style=3D"color: #660;" class=3D"styled-by-prettify">::</=
span><span style=3D"color: #008;" class=3D"styled-by-prettify">function</sp=
an><span style=3D"color: #660;" class=3D"styled-by-prettify"><</span><sp=
an style=3D"color: #008;" class=3D"styled-by-prettify">int</span><span styl=
e=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"colo=
r: #008;" class=3D"styled-by-prettify">void</span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">)></span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"> f1 </span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> lam1</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"><br> std</span><span style=3D"color: #660;" class=3D"styled=
-by-prettify">::</span><span style=3D"color: #008;" class=3D"styled-by-pret=
tify">function</span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy"><</span><span style=3D"color: #008;" class=3D"styled-by-prettify">in=
t</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</span><=
span style=3D"color: #008;" class=3D"styled-by-prettify">void</span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify">)></span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> f2 </span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">=3D</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"> f1</span><span style=3D"color: #660;" cl=
ass=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"><br> </span><span style=3D"color: #008;" cla=
ss=3D"styled-by-prettify">assert</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify">f1 </span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">=3D=3D</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"> f2</span><span style=3D"color: #660;" class=3D"styled-by-prettify">);<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><sp=
an style=3D"color: #800;" class=3D"styled-by-prettify">// "obviously" true =
at this point, right?</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"><br> f1</span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">();</span><span style=3D"color: #000;" class=3D"styled=
-by-prettify"><br> </span><span style=3D"color: #008;" class=
=3D"styled-by-prettify">assert</span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">(</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify">f1 </span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">=3D=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify">=
f2</span><span style=3D"color: #660;" class=3D"styled-by-prettify">);</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span s=
tyle=3D"color: #800;" class=3D"styled-by-prettify">// is it still true at t=
his point? f1 and f2 have different behaviors</span></div></code></div><br>=
OTOH, if we ignore these "difficult" cases, then what you describe in the p=
aper can be implemented as a (very thin wrapper around a) <font face=3D"cou=
rier new, monospace">std::shared_ptr<std::function<SignatureType>&=
gt;</font>. Your <font face=3D"courier new, monospace">make_fun</font> is e=
quivalent to <font face=3D"courier new, monospace">make_shared</font><font =
face=3D"arial, sans-serif"> and can be implemented in terms of it.</fo=
nt></div><div><br></div><div>=E2=80=93Arthur</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_3133_871348087.1431583426496--
------=_Part_3132_512422251.1431583426496--
.
Author: David Krauss <potswa@mac.com>
Date: Thu, 14 May 2015 14:27:35 +0800
Raw View
--Apple-Mail=_0C7472D1-F2C2-452F-B4D0-FB07D170676A
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9314, at 2:03 PM, Arthur O'Dwyer <arthur.j.odwye=
r@gmail.com> wrote:
>=20
> http://melpon.org/wandbox/permlink/MdGMF2NFqO5bIYtT <http://melpon.org/wa=
ndbox/permlink/MdGMF2NFqO5bIYtT>
> <http://melpon.org/wandbox/permlink/MdGMF2NFqO5bIYtT>
Ooh, more online compilers is better.
As the Boost FAQ says, the only viable operator=3D=3D behavior for std::fun=
ction is to form an equality expression on-demand (impossible) from two era=
sed types (impossible).
> OTOH, if we ignore these "difficult" cases, then what you describe in the=
paper can be implemented as a (very thin wrapper around a) std::shared_ptr=
<std::function<SignatureType>>. Your make_fun is equivalent to make_shared =
and can be implemented in terms of it.
The final result needs to be a std::function for polymorphism to work. You =
could put the thin wrapper inside a std::function, but then you=E2=80=99d b=
e arriving at my solutions which need to access the target without its exac=
t type, e.g. target<void>().
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_0C7472D1-F2C2-452F-B4D0-FB07D170676A
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=80=9305=
=E2=80=9314, at 2:03 PM, Arthur O'Dwyer <<a href=3D"mailto:arthur.j.odwy=
er@gmail.com" class=3D"">arthur.j.odwyer@gmail.com</a>> wrote:</div><br =
class=3D"Apple-interchange-newline"><div class=3D""><div dir=3D"ltr" class=
=3D""><div class=3D""><a href=3D"http://melpon.org/wandbox/permlink/MdGMF2N=
FqO5bIYtT" class=3D"">http://melpon.org/wandbox/permlink/MdGMF2NFqO5bIYtT</=
a><a href=3D"http://melpon.org/wandbox/permlink/MdGMF2NFqO5bIYtT" class=3D"=
"><br class=3D""></a></div></div></div></blockquote><div><br class=3D""></d=
iv><div>Ooh, more online compilers is better.</div><div><br class=3D""></di=
v><div>As the Boost FAQ says, the only viable <font face=3D"Courier" class=
=3D"">operator=3D=3D</font> behavior for <span style=3D"font-family: C=
ourier;" class=3D"">std::function</span> is to form an equality expres=
sion on-demand (impossible) from two erased types (impossible).</div><br cl=
ass=3D""><blockquote type=3D"cite" class=3D""><div class=3D""><div dir=3D"l=
tr" class=3D""><div class=3D"">OTOH, if we ignore these "difficult" cases, =
then what you describe in the paper can be implemented as a (very thin wrap=
per around a) <font face=3D"courier new, monospace" class=3D"">std::shared_=
ptr<std::function<SignatureType>></font>. Your <font face=3D"co=
urier new, monospace" class=3D"">make_fun</font> is equivalent to <font fac=
e=3D"courier new, monospace" class=3D"">make_shared</font><font face=3D"ari=
al, sans-serif" class=3D""> and can be implemented in terms of it.</fo=
nt></div></div></div></blockquote><div><br class=3D""></div><div>The final =
result needs to be a <font face=3D"Courier" class=3D"">std::function</font>=
for polymorphism to work. You could put the thin wrapper inside a <font fa=
ce=3D"Courier" class=3D"">std::function</font>, but then you=E2=80=99d be a=
rriving at my solutions which need to access the target without its exact t=
ype, e.g. <font face=3D"Courier" class=3D"">target<void>()</font=
>.</div></div></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_0C7472D1-F2C2-452F-B4D0-FB07D170676A--
.
Author: David Krauss <potswa@mac.com>
Date: Thu, 14 May 2015 14:31:00 +0800
Raw View
--Apple-Mail=_AE5C749C-6FCC-42EE-B50E-5D02365EFB09
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9314, at 2:27 PM, David Krauss <potswa@mac.com> =
wrote:
>=20
> The final result needs to be a std::function for polymorphism to work. Yo=
u could put the thin wrapper inside a std::function, but then you=E2=80=99d=
be arriving at my solutions which need to access the target without its ex=
act type, e.g. target<void>().
Oops, actually you would avoid that issue, but at the cost of two indirect =
calls: the std::function inside the wrapper and the one outside. Workable, =
just a little sluggish.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_AE5C749C-6FCC-42EE-B50E-5D02365EFB09
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=80=9305=
=E2=80=9314, at 2:27 PM, David Krauss <<a href=3D"mailto:potswa@mac.com"=
class=3D"">potswa@mac.com</a>> wrote:</div><br class=3D"Apple-interchan=
ge-newline"><div class=3D""><span style=3D"font-family: Helvetica; font-siz=
e: 12px; font-style: normal; font-variant: normal; font-weight: normal; let=
ter-spacing: normal; line-height: normal; orphans: auto; text-align: start;=
text-indent: 0px; text-transform: none; white-space: normal; widows: auto;=
word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: i=
nline !important;" class=3D"">The final result needs to be a<span class=3D"=
Apple-converted-space"> </span></span><font face=3D"Courier" class=3D"=
" style=3D"font-size: 12px; font-style: normal; font-variant: normal; font-=
weight: normal; letter-spacing: normal; line-height: normal; orphans: auto;=
text-align: start; text-indent: 0px; text-transform: none; white-space: no=
rmal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;">std=
::function</font><span style=3D"font-family: Helvetica; font-size: 12px; fo=
nt-style: normal; font-variant: normal; font-weight: normal; letter-spacing=
: normal; line-height: normal; orphans: auto; text-align: start; text-inden=
t: 0px; text-transform: none; white-space: normal; widows: auto; word-spaci=
ng: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !impo=
rtant;" class=3D""><span class=3D"Apple-converted-space"> </span>for p=
olymorphism to work. You could put the thin wrapper inside a<span class=3D"=
Apple-converted-space"> </span></span><font face=3D"Courier" class=3D"=
" style=3D"font-size: 12px; font-style: normal; font-variant: normal; font-=
weight: normal; letter-spacing: normal; line-height: normal; orphans: auto;=
text-align: start; text-indent: 0px; text-transform: none; white-space: no=
rmal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;">std=
::function</font><span style=3D"font-family: Helvetica; font-size: 12px; fo=
nt-style: normal; font-variant: normal; font-weight: normal; letter-spacing=
: normal; line-height: normal; orphans: auto; text-align: start; text-inden=
t: 0px; text-transform: none; white-space: normal; widows: auto; word-spaci=
ng: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !impo=
rtant;" class=3D"">, but then you=E2=80=99d be arriving at my solutions whi=
ch need to access the target without its exact type, e.g. </span><font=
face=3D"Courier" class=3D"" style=3D"font-size: 12px; font-style: normal; =
font-variant: normal; font-weight: normal; letter-spacing: normal; line-hei=
ght: normal; orphans: auto; text-align: start; text-indent: 0px; text-trans=
form: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-t=
ext-stroke-width: 0px;">target<void>()</font><span style=3D"font-fami=
ly: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; f=
ont-weight: normal; letter-spacing: normal; line-height: normal; orphans: a=
uto; text-align: start; text-indent: 0px; text-transform: none; white-space=
: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
float: none; display: inline !important;" class=3D"">.</span></div></blockq=
uote></div><br class=3D""><div class=3D"">Oops, actually you would avoid th=
at issue, but at the cost of two indirect calls: the <font face=3D"Courier"=
class=3D"">std::function</font> inside the wrapper and the one outside. Wo=
rkable, just a little sluggish.</div></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_AE5C749C-6FCC-42EE-B50E-5D02365EFB09--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Thu, 14 May 2015 07:23:49 -0700 (PDT)
Raw View
------=_Part_4036_1426088204.1431613429348
Content-Type: multipart/alternative;
boundary="----=_Part_4037_199460461.1431613429348"
------=_Part_4037_199460461.1431613429348
Content-Type: text/plain; charset=UTF-8
Arthur,
Good examples that do need answers. fun_ptr answers these in a way
consistent with function pointer like semantics.
John Lakos has a talk on the meaning of values (see youtube: Value
Semantics: It aint about the syntax
<https://www.youtube.com/watch?v=BshgPboz_AQ>). Basically I took away from
it 3 properties a value type should have:
A. be able to substitutable with a copy
B. If a and b have the same values and the same salient operations are
performed on a and b then both objects will again have the same value.
C. Two objects of a given value-semantic type have the same value if and
only if there does not exist a distinguishing sequence among all of its
salient operations.
The definition for a salient operation is basically any operation that has
an effect on the type's value. The example Lakos gives is a std::vector's
size is a salient attribute, but its capacity is not. So reserve() and
shrink_to_fit() would not be salient operations but resize(), push_back(),
etc. would be salient operations.
In my paper I document that a smart function pointer is designed to have
function pointer like semantics. Consider calling/invoking a regular old
standalone function pointer: it does not change the pointer's value and so
too calling operator() on fun_ptr should not change its value (and it
doesn't). I'd also make the argument that since operator() is a
const member function it should not change the types value (that
is operator() is NOT a salient operation).
fun_ptr meets all three of these value type properties. Its hard to imagine
how std::function could in general satisfy these 3 properties since it
performs a deep copy of the contained function object.
For function pointer like semantics we want the copy to behave exactly like
the original, right (property A above)? The following code should behave
exactly the same no matter the output from rand(). And for fun_ptr it does
- it calls the lambda 1000 times regardless of rand()'s output.
auto f1 = make_fun([]() { /*...*/ });
auto f2 = f1; //copy constructor - shares target with d1.
for (int i = 0; i < 1000; ++i) {
assert(f1 == f2); //true each time through the loop
if (rand() % 2 == 0) f1();
else f2();
}
If the above example was replaced with regular old function pointers what
is the behavior we would want and expect? std::function does not behave
like a regular function pointer would, but fun_ptr does!
Now let's consider your two examples with fun_ptr replacing std::function
and then compare and discuss...
auto lam1 = [state=0]() mutable { return state++; };
std::fun_ptr<int(void)> f1 = lam1; lam1();
std::fun_ptr<int(void)> f2 = lam1;
return (f1 == f2); // false, if fact calling lam1() or not does not
change this
Functors are the trickiest part of fun_ptr's implementation...
Scott Myers says in Effective STL (emphasis mine):
STL function objects are *modeled after function pointers*, so the
convention in the STL is that function objects, too, are passed by value
(i.e., copied) when passed to and from functions.
This is why we want fun_ptr to accept function objects by value. Its akin
to assigning one function pointer to another. When a fun_ptr is created it
copies the functor (and state if any) but when fun_ptr is copied it shares
that copy of the functor. After creating a fun_ptr with a functor the only
way it will ever test equal with another fun_ptr is by making a copy of the
original fun_ptr. This is why the rand example above works no matter if
fun_ptr's target is a standalone function, a member function, or a functor!
auto lam1 = [state=0]() mutable { return state++; };
std::fun_ptr<int(void)> f1 = lam1;
std::fun_ptr<int(void)> f2 = f1;
assert(f1 == f2); // true, f2 was just assigned f1 so it better be!
f1(); //operator() is const and this is not a salient operation
assert(f1 == f2); // true, and f1 and f2 do NOT have different
behaviors (std::function does have different behaveior)
Again calling f1() is const operation and not salient (doesn't change its
target) and so the f1 has the same value after the call as it did before
the call.
I will try to add some of these examples and explanations to my proposal -
I don't think I am marketing this very well...
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_4037_199460461.1431613429348
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>Arthur,</div><div><br></div><div>Good examples that d=
o need answers. fun_ptr answers these in a way consistent with function poi=
nter like semantics.</div><div><br></div><div>John Lakos has a talk on the =
meaning of values (see youtube: <a href=3D"https://www.youtube.com/watch?v=
=3DBshgPboz_AQ">Value Semantics: It aint about the syntax</a>). Basically&n=
bsp;I took away from it 3 properties a value type should have:</div><div><b=
r></div><div>A. be able to substitutable with a copy</div><div>B. If a=
and b have the same values and the same salient operations are performed o=
n a and b then both objects will again have the same value.</div><div>C. Tw=
o objects of a given value-semantic type have the same value if and only if=
there does not exist a distinguishing sequence among all of its salient op=
erations.</div><div><br></div><div>The definition for a sali=
ent operation is basically any operation that has an effect on the type's&n=
bsp;value. The example Lakos gives is a std::vector's size is a salient att=
ribute, but its capacity is not. So reserve() and shrink_to_fit() would not=
be salient operations but resize(), push_back(), etc. would be salient ope=
rations.</div><div><br></div><div>In my paper I document that a smart funct=
ion pointer is designed to have function pointer like semantics. Consider c=
alling/invoking a regular old standalone function pointer: it doe=
s not change the pointer's value and so too calling operator() on=
fun_ptr should not change its value (and it doesn't). I'd also make&n=
bsp;the argument that since operator() is a const member function=
it should not change the types value (that is operator() is NOT =
a salient operation).</div><div><br></div><div>fun_ptr meets all three of t=
hese value type properties. Its hard to imagine how std::function could in =
general satisfy these 3 properties since it performs a deep copy of the con=
tained function object.</div><div><br></div><div><div class=3D"subprettypri=
nt">For function pointer like semantics we want the copy to behave exactly =
like the original, right (property A above)? The following code should beha=
ve exactly the same no matter the output from rand(). And for fun_ptr it do=
es - it calls the lambda 1000 times regardless of rand()'s output.</div><di=
v class=3D"subprettyprint"><br></div><div class=3D"prettyprint" style=3D"bo=
rder: 1px solid rgb(187, 187, 187); border-image: none; -ms-word-wrap: brea=
k-word; background-color: rgb(250, 250, 250);"><code class=3D"prettyprint">=
<div class=3D"subprettyprint"><span class=3D"styled-by-prettify" style=3D"c=
olor: rgb(0, 0, 136);">auto</span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 0, 0);"> f1 </span><span class=3D"styled-by-prettify" sty=
le=3D"color: rgb(102, 102, 0);">=3D</span><span class=3D"styled-by-prettify=
" style=3D"color: rgb(0, 0, 0);"> make_fun</span><span class=3D"styled-by-p=
rettify" style=3D"color: rgb(102, 102, 0);">([]()</span><span class=3D"styl=
ed-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"style=
d-by-prettify" style=3D"color: rgb(102, 102, 0);">{</span><span class=3D"st=
yled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(136, 0, 0);">/*...*/</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">});</span><span =
class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br></span><spa=
n class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">auto</span>=
<span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> f2 </spa=
n><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">=3D=
</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> f=
1</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0)=
;">;</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);=
"> </span><span class=3D"styled-by-prettify" style=3D"color: rgb(136, 0, 0)=
;">//copy constructor - shares target with d1.</span><span class=3D"styled-=
by-prettify" style=3D"color: rgb(0, 0, 0);"><br></span><span class=3D"style=
d-by-prettify" style=3D"color: rgb(0, 0, 136);">for</span><span class=3D"st=
yled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(102, 102, 0);">(</span><span class=3D"=
styled-by-prettify" style=3D"color: rgb(0, 0, 136);">int</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> i </span><span clas=
s=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">=3D</span><span=
class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span =
class=3D"styled-by-prettify" style=3D"color: rgb(0, 102, 102);">0</span><sp=
an class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">;</span>=
<span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> i </span=
><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);"><=
</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> <=
/span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 102, 102);"=
>1000</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102=
, 0);">;</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0,=
0);"> </span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 1=
02, 0);">++</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0,=
0, 0);">i</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102=
, 102, 0);">)</span><span class=3D"styled-by-prettify" style=3D"color: rgb(=
0, 0, 0);"> </span><span class=3D"styled-by-prettify" style=3D"color: rgb(1=
02, 102, 0);">{</span><span class=3D"styled-by-prettify" style=3D"color: rg=
b(0, 0, 0);"><br> </span><span class=3D"styled-by-prettify" sty=
le=3D"color: rgb(0, 0, 136);">assert</span><span class=3D"styled-by-prettif=
y" style=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-by-pret=
tify" style=3D"color: rgb(0, 0, 0);">f1 </span><span class=3D"styled-by-pre=
ttify" style=3D"color: rgb(102, 102, 0);">=3D=3D</span><span class=3D"style=
d-by-prettify" style=3D"color: rgb(0, 0, 0);"> f2</span><span class=3D"styl=
ed-by-prettify" style=3D"color: rgb(102, 102, 0);">);</span><span class=3D"=
styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"s=
tyled-by-prettify" style=3D"color: rgb(136, 0, 0);">//true each time throug=
h the loop</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, =
0, 0);"><br> </span><span class=3D"styled-by-prettify" style=3D=
"color: rgb(0, 0, 136);">if</span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-by-prettify" st=
yle=3D"color: rgb(0, 0, 0);">rand</span><span class=3D"styled-by-prettify" =
style=3D"color: rgb(102, 102, 0);">()</span><span class=3D"styled-by-pretti=
fy" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettif=
y" style=3D"color: rgb(102, 102, 0);">%</span><span class=3D"styled-by-pret=
tify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prett=
ify" style=3D"color: rgb(0, 102, 102);">2</span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-pre=
ttify" style=3D"color: rgb(102, 102, 0);">=3D=3D</span><span class=3D"style=
d-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled=
-by-prettify" style=3D"color: rgb(0, 102, 102);">0</span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(102, 102, 0);">)</span><span class=3D"=
styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> f1</span><span class=3D=
"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">();</span><span cla=
ss=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br> <=
/span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">e=
lse</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"=
> f2</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102,=
0);">();</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0=
, 0);"><br></span><span class=3D"styled-by-prettify" style=3D"color: rgb(10=
2, 102, 0);">}</span></div></code></div><div class=3D"subprettyprint"><br>I=
f the above example was replaced with regular old function pointers what is=
the behavior we would want and expect? std::function does not behave like =
a regular function pointer would, but fun_ptr does!</div><div class=3D"subp=
rettyprint"><br></div><div class=3D"subprettyprint">Now let's consider your=
two examples with fun_ptr replacing std::function and then compare and dis=
cuss...</div></div><code style=3D"margin: 0px; padding: 0px; border: 0px cu=
rrentColor; border-image: none; vertical-align: baseline;"><div><br></div><=
/code><div class=3D"prettyprint" style=3D"border: 1px solid rgb(187, 187, 1=
87); border-image: none; -ms-word-wrap: break-word; background-color: rgb(2=
50, 250, 250);"><code class=3D"prettyprint"><div class=3D"subprettyprint"><=
span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> &nb=
sp; </span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136=
);">auto</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0,=
0);"> lam1 </span><span class=3D"styled-by-prettify" style=3D"color: rgb(1=
02, 102, 0);">=3D</span><span class=3D"styled-by-prettify" style=3D"color: =
rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify" style=3D"color: r=
gb(102, 102, 0);">[</span><span class=3D"styled-by-prettify" style=3D"color=
: rgb(0, 0, 0);">state</span><span class=3D"styled-by-prettify" style=3D"co=
lor: rgb(102, 102, 0);">=3D</span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 102, 102);">0</span><span class=3D"styled-by-prettify" st=
yle=3D"color: rgb(102, 102, 0);">]()</span><span class=3D"styled-by-prettif=
y" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify=
" style=3D"color: rgb(0, 0, 136);">mutable</span><span class=3D"styled-by-p=
rettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(102, 102, 0);">{</span><span class=3D"styled-by=
-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-=
prettify" style=3D"color: rgb(0, 0, 136);">return</span><span class=3D"styl=
ed-by-prettify" style=3D"color: rgb(0, 0, 0);"> state</span><span class=3D"=
styled-by-prettify" style=3D"color: rgb(102, 102, 0);">++;</span><span clas=
s=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">};</span><span c=
lass=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br>  =
; std</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102=
, 0);">::</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0=
, 0);">fun_ptr</span><span class=3D"styled-by-prettify" style=3D"color: rgb=
(102, 102, 0);"><</span><span class=3D"styled-by-prettify" style=3D"colo=
r: rgb(0, 0, 136);">int</span><span class=3D"styled-by-prettify" style=3D"c=
olor: rgb(102, 102, 0);">(</span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 0, 136);">void</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: rgb(102, 102, 0);">)></span><span class=3D"styled-by-pret=
tify" style=3D"color: rgb(0, 0, 0);"> f1 </span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(102, 102, 0);">=3D</span><span class=3D"styled-=
by-prettify" style=3D"color: rgb(0, 0, 0);"> lam1</span><span class=3D"styl=
ed-by-prettify" style=3D"color: rgb(102, 102, 0);">;</span><span class=3D"s=
tyled-by-prettify" style=3D"color: rgb(0, 0, 0);"> lam1</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">();</span><span =
class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br> &nbs=
p; std</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 10=
2, 0);">::</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, =
0, 0);">fun_ptr</span><span class=3D"styled-by-prettify" style=3D"color: rg=
b(102, 102, 0);"><</span><span class=3D"styled-by-prettify" style=3D"col=
or: rgb(0, 0, 136);">int</span><span class=3D"styled-by-prettify" style=3D"=
color: rgb(102, 102, 0);">(</span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 0, 136);">void</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: rgb(102, 102, 0);">)></span><span class=3D"styled-by-pret=
tify" style=3D"color: rgb(0, 0, 0);"> f2 </span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(102, 102, 0);">=3D</span><span class=3D"styled-=
by-prettify" style=3D"color: rgb(0, 0, 0);"> lam1</span><span class=3D"styl=
ed-by-prettify" style=3D"color: rgb(102, 102, 0);">;</span><span class=3D"s=
tyled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br> </span>=
<span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">return<=
/span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </=
span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">=
(</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);">f=
1 </span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0=
);">=3D=3D</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, =
0, 0);"> f2</span><span class=3D"styled-by-prettify" style=3D"color: rgb(10=
2, 102, 0);">);</span><span class=3D"styled-by-prettify" style=3D"color: rg=
b(0, 0, 0);"> </span><span class=3D"styled-by-prettify" style=3D"colo=
r: rgb(136, 0, 0);">// false, if fact calling lam1() or not does not change=
this</span></div></code></div><div><br></div><div>Functors are the trickie=
st part of fun_ptr's implementation...</div><div><br></div><div>Scott Myers=
says in Effective STL (emphasis mine):</div><blockquote style=3D"margin-ri=
ght: 0px;" dir=3D"ltr"><div>STL function objects are <strong><u>modeled aft=
er function pointers</u></strong>, so the convention in the STL
is that function objects, too, are passed by value (i.e., copied) when pass=
ed to and from
functions. </div></blockquote><div>This is why we want fun_ptr to=
accept function objects by value. Its akin to assigning one function point=
er to another. When a fun_ptr is created it copies the functor (and state i=
f any) but when fun_ptr is copied it shares that copy of the functor. =
After creating a fun_ptr with a functor the only way it will ever test equa=
l with another fun_ptr is by making a copy of the original fun_ptr. This is=
why the rand example above works no matter if fun_ptr's target is a standa=
lone function, a member function, or a functor!</div><div><span style=3D"fo=
nt: 13px/normal monospace; margin: 0px; padding: 0px; border: 0px currentCo=
lor; border-image: none; color: rgb(0, 0, 136); text-transform: none; text-=
indent: 0px; letter-spacing: normal; word-spacing: 0px; vertical-align: bas=
eline; white-space: normal; widows: 1; font-size-adjust: none; font-stretch=
: normal; background-color: rgb(250, 250, 250); -webkit-text-stroke-width: =
0px;"> </span></div><div class=3D"prettyprint" style=3D"b=
order: 1px solid rgb(187, 187, 187); border-image: none; -ms-word-wrap: bre=
ak-word; background-color: rgb(250, 250, 250);"><code class=3D"prettyprint"=
><div class=3D"subprettyprint"><span class=3D"styled-by-prettify" style=3D"=
color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettif=
y" style=3D"color: rgb(0, 0, 136);">auto</span><span class=3D"styled-by-pre=
ttify" style=3D"color: rgb(0, 0, 0);"> lam1 </span><span class=3D"styled-by=
-prettify" style=3D"color: rgb(102, 102, 0);">=3D</span><span class=3D"styl=
ed-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"style=
d-by-prettify" style=3D"color: rgb(102, 102, 0);">[</span><span class=3D"st=
yled-by-prettify" style=3D"color: rgb(0, 0, 0);">state</span><span class=3D=
"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">=3D</span><span cla=
ss=3D"styled-by-prettify" style=3D"color: rgb(0, 102, 102);">0</span><span =
class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">]()</span><=
span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><s=
pan class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">mutable</=
span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </s=
pan><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">{=
</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> <=
/span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">r=
eturn</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0)=
;"> state</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102,=
102, 0);">++;</span><span class=3D"styled-by-prettify" style=3D"color: rgb=
(0, 0, 0);"> </span><span class=3D"styled-by-prettify" style=3D"color: rgb(=
102, 102, 0);">};</span><span class=3D"styled-by-prettify" style=3D"color: =
rgb(0, 0, 0);"><br> std</span><span class=3D"styled-by-prettif=
y" style=3D"color: rgb(102, 102, 0);">::</span><span class=3D"styled-by-pre=
ttify" style=3D"color: rgb(0, 0, 0);">fun_ptr</span><span class=3D"styled-b=
y-prettify" style=3D"color: rgb(102, 102, 0);"><</span><span class=3D"st=
yled-by-prettify" style=3D"color: rgb(0, 0, 136);">int</span><span class=3D=
"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">(</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">void</span><span c=
lass=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">)></span>=
<span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> f1 </spa=
n><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">=3D=
</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> l=
am1</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, =
0);">;</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0=
);"><br> std</span><span class=3D"styled-by-prettify" style=3D=
"color: rgb(102, 102, 0);">::</span><span class=3D"styled-by-prettify" styl=
e=3D"color: rgb(0, 0, 0);">fun_ptr</span><span class=3D"styled-by-prettify"=
style=3D"color: rgb(102, 102, 0);"><</span><span class=3D"styled-by-pre=
ttify" style=3D"color: rgb(0, 0, 136);">int</span><span class=3D"styled-by-=
prettify" style=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-=
by-prettify" style=3D"color: rgb(0, 0, 136);">void</span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(102, 102, 0);">)></span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> f2 </span><span cla=
ss=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">=3D</span><spa=
n class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> f1</span><sp=
an class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">;</span>=
<span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br> =
; </span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0=
, 136);">assert</span><span class=3D"styled-by-prettify" style=3D"color: rg=
b(102, 102, 0);">(</span><span class=3D"styled-by-prettify" style=3D"color:=
rgb(0, 0, 0);">f1 </span><span class=3D"styled-by-prettify" style=3D"color=
: rgb(102, 102, 0);">=3D=3D</span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 0, 0);"> f2</span><span class=3D"styled-by-prettify" styl=
e=3D"color: rgb(102, 102, 0);">);</span><span class=3D"styled-by-prettify" =
style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify" s=
tyle=3D"color: rgb(136, 0, 0);">// true, f2 was just assigned f1 so it bett=
er be!</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0=
);"><br> f1</span><span class=3D"styled-by-prettify" style=3D"=
color: rgb(102, 102, 0);">();</span><span class=3D"styled-by-prettify" styl=
e=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(136, 0, 0);">//operator() is const and this is not a salient=
operation</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, =
0, 0);"><br> </span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 0, 136);">assert</span><span class=3D"styled-by-prettify"=
style=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-by-pretti=
fy" style=3D"color: rgb(0, 0, 0);">f1 </span><span class=3D"styled-by-prett=
ify" style=3D"color: rgb(102, 102, 0);">=3D=3D</span><span class=3D"styled-=
by-prettify" style=3D"color: rgb(0, 0, 0);"> f2</span><span class=3D"styled=
-by-prettify" style=3D"color: rgb(102, 102, 0);">);</span><span class=3D"st=
yled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(136, 0, 0);">// true, and f1 and f2 do=
NOT have different behaviors (std::function does have different behaveior)=
</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><b=
r></span></div></code></div><div><br></div><div>Again calling f1() is =
const operation and not salient (doesn't change its target) and so the f1 h=
as the same value after the call as it did before the call.</div><div><br><=
/div><div class=3D"subprettyprint">I will try to add some of these examples=
and explanations to my proposal - I don't think I am marketing this very w=
ell...</div><div class=3D"subprettyprint"><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_4037_199460461.1431613429348--
------=_Part_4036_1426088204.1431613429348--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Thu, 14 May 2015 09:13:12 -0700 (PDT)
Raw View
------=_Part_148_668006021.1431619992363
Content-Type: multipart/alternative;
boundary="----=_Part_149_132688431.1431619992363"
------=_Part_149_132688431.1431619992363
Content-Type: text/plain; charset=UTF-8
On Tuesday, May 12, 2015 at 7:26:49 PM UTC-5, Michael Boyko wrote:
>
> Here is a proposal document for a smart function pointer. It is purely a
> library proposal - no additional language features are needed. I believe
> I've got the correct syntax and semantics for the type but looking for
> feedback. I've included 2 different implementations for the smart pointer
> (fun_ptr2 and fun_ptr3). Version 2 is easier to understand and follow while
> version3 is probably 10x performance. I've also included example and test
> code. I created an event<> type based on the smart function pointer that
> has nice syntax and semantics as well to show a very good use for the type.
> Just posting it here to gauge if the community is interested in such a
> library.
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_149_132688431.1431619992363
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<br><br>On Tuesday, May 12, 2015 at 7:26:49 PM UTC-5, Michael Boyko wrote:<=
blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; paddin=
g-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px;=
border-left-style: solid;"><div dir=3D"ltr">Here is a proposal document fo=
r a smart function pointer. It is purely a library proposal - no additional=
language features are needed. I believe I've got the correct syntax a=
nd semantics for the type but looking for feedback. I've included 2 differe=
nt implementations for the smart pointer (fun_ptr2 and fun_ptr3). Version 2=
is easier to understand and follow while version3 is probably 10x performa=
nce. I've also included example and test code. I created an event<> t=
ype based on the smart function pointer that has nice syntax and semantics =
as well to show a very good use for the type. Just posting it here to gauge=
if the community is interested in such a library.</div></blockquote>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_149_132688431.1431619992363--
------=_Part_148_668006021.1431619992363
Content-Type: application/zip; name=smart_function_pointer.zip
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=smart_function_pointer.zip
X-Attachment-Id: 4afe5c57-19cd-416a-882f-f0a07d2b07bb
Content-ID: <4afe5c57-19cd-416a-882f-f0a07d2b07bb>
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
Q3uq7K9V9tjLVFaFrtpfL++X/519slHGN/fCZhlX9sAq+93lnCUUvsd7l30rHPXWmOSPsOxJYdmD
wrL/hHM8uaxh3T9Yt93NegrLPhMebnJReJS3Lrx1UJkXNbbUjuY58lPlGikweUvrX86BV6+tq9ZV
ZX65vLYKvP5P8OZ80pX66Mt6C8veFH7R9Dsse1JY96CDXk7SMcgeFF7s1ftXOejqPF6dTmWfq8nH
l8sSr9A/zXX/Kp+mfJP+IU9WzZVpVXJklXyIboqn08H4QHN0b4mf3s0M6dlG51vPNL1bezKJlUg3
4TWPeeeX3nI2Cp/z8pjMaW+NrQkmn0XU9+ov70zQu6eXy3T/f9HLcxp/skf3Fnu9xV5E+ttb4qa3
2OstcdZbbUqM9R7r5c/KfLnYO5tVnpuGX8mj2PJs0McJJl/Sr6vz8FU5+PIZpjIP6zjVlpZJTPWe
WqX+JG887Y2/OHPJ2Hq/6Mk6V6Ge1dDVZ8GMasjz69Xnuss0tgpdfa6rPKP9d85myzK+ef5am3Hl
3FX1jJXh1V1VxSdXry1Zf+EtGf+wrsI7My6fscK6rg+aXHQ5Xx0xcR0+7sVTpVx1znnxp++SVyLe
uovIGosEDVVdb5EkkyMiySY+I02qOccIRVp4lGaIPKj2O3jvXa6sQV0TEdnrIn2qrD/Ri9xv1ltE
9uhIplDM7D2VRD4qMn7SMUeGCY3wbMs4IqO9cXr6EbnTRSYKTRaankEuiswSkjtcZIFQkdn/lMiT
ciaILBFabvJxpMTEqe6FkXVCm4W2ev7aJbTf3BMiR42fIieNfkT2jsh5oXJzBtT8X5mbo7IHRGsY
UnvsMxLb0TrG71E5g0YbmjiLpho/6jxGm3plrTwb7Uwuj8oZMSrnw6jmHjmPReUcFpVzVVTOU9Fs
499o3MtjMv5ovvc+0sRDVM5CUTkDRWWPiE65Ej+au/U8EJWzUFTOQtF5ntzLuVE5D0SLjX1dJ1Hx
UVTOANE1VWK18h5QuUcJH11vdKKlRqbfxqi9rvaG//82xv+lZ2VOM2e9fqJqlfre9PkSUoSaCLUQ
ShPqINSlyns3oXShPkL3Cw0SyhSKCQ0TGiE0Wmic0EShyULThWYJzRVaIFTk0RKh5UIlQuuENgtt
FdoltF/okNBRr82T/+T9tNB5j1S/3OdLdIw8sYZQHa9vJ713GUNiPaGGQqlGfvm9qVAr09fEdlfG
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
JT2se5rwsedjS0s0JZkAZoS0pTXS6ydpmqpqKAxTVszhtVVXk1tOrprifUVX017M/D7K7Ij2kuHN
STe0OJIamyrtKHKmMJpKfXVbk2vN8RzsnWwTdCU3pHtJj8wtN8Td03aOu5q6rolRzRSzqHwmdh/5
NyDbeh9BNxRfM0CPI5z/fkkhJIecjDlH4tFETBw8onKL+NMIphRMJT3CcsvEp5sea3Er+FOPTUE7
F+WSUU5R/9dRUJRPYTuXfcnMJsMei3zE6ZH1pcWceDhHfRkwpAmOmwMC+iYJT2Q6ZOrSbY91PlL0
KNem4J2Lt8k4p+idq7cp2qbwHy07VG+Tu04IOjR/SN4mDE/8vYQIUiOOjb3ECNLGjp28RPJTy4+t
vSTy086OvbyEDVIzjs29xA3S1o7dvER3U9uO7b0kd9MSjk0/xATS5syS5dKpDe5ZuHVnk1xO+D5a
chnvJj4fg3ypApq9de+0/WreantXITUEq/vY+wHzOFZ+ZvBNELqEW3dbfjeI1/7uAT6B34X88z/j
BGYBdoiNEZtD1wevlK9Qn6qfrJ8uPiX8C/lmiq3l66o31q+uPuH8Sz+T+eZzrWfrLjder2uvvj5B
33E94z+rBnYBloyNfW0Zm4LrghtX1y+vED7FPRO7do6NHuuCW13XO68EPvXfMT1zPyu7joQNiJsR
N6yv3J/BfhO9JobNjhse1z6vfp9B3/M/M/5mgq0F64o3lu5NeYeBQ3i3UGN/5MaOcl1meTFzY2bJ
z5pcRjou9VzqeDlzc2bpz1pdxjqutl1ueRFzI2YdZ0nPGp+GvS75XJJzzShHEP1Pz/wPOL/K9o4y
/Ov3ztq+WvcePr8nCwYI9+fOEZ8tHyE/Qr6Jf6Z/lAIwAjIFqwVzBLsEI37JAxQCGALaBdsEEwTr
BQsCkgOaAqIDqgKyAzoDwgPKfml/6X7tfvF+9X75vAFyb68XBD4BAnHFkKW8Z6xi8rF3kMNXWHuI
UVoLaPGRGEXkeMVW3iKuqDv7ZBLdiAepWOQSA9zMBrERT2gbjErbnVJOVygjtVNobXWR5ibceqVQ
TjtU9qnGQh77HdZZGDFMoNNAGNJv68V8lnyYG+bYxMUb8p17/nM4JvKH29n238Osulu1knzRt51t
ZZ83Lkybe+CEoSJco1887SDZkchG9N6WfKH8WO2bCpVhqYtzViBEYE0buswB47vhnsO78Z7Tux/d
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
0X97J0ExQf839/NzqJ57i2yLzTKPXny23VLMHBiDDPxWFqjevWg5Ym+Zqin6yCirJXU0sJV5Icn0
9OK1S/sJQBad7UzNbuDxnH2jEWdv/3VDoOlQSCQcSWf23zUYmu4f73Q2/67BIOS5GgRDnashIejP
GpIHznuuBvGc6wOJQJyvoSDYuRov6ly/SD6+c32geKDzNRgv37kahIKfqyF5EOdqaJ7z4/H9tS/+
zxqaB30uBxp+fr2gEahz2dAIvvO1sx3kudrZDM/V+M73ywtDncvLC0eer6GgP6eFwRHnlhl2Numf
08LgaNSf6wAG5+P9c3uBISDkn+sPhkbAz42HBiwLmg/+57TQX4H/rMF4zm0vEAw6tx1AMATP+RoK
+WdeCMaLPDc/6Px2BZ3d/lwHEIRAn5sfAnZu3UMIBM+58VA88HPb39l3lff8dxXBd76G5AHUYIAa
BKjBATUEoIYE1FCAGmD/ggTkQAJyoAA5UIAcKEAOFCAHCpADBciBAuRAAXKgADlQgBxoQA40IAca
kAMNyIEG5EADcqABOdCAHGhADjQgBy8gBy8gBy8gBy8gBy8gBy8gBy8gBy8gBy8gBy8gBx8gBx8g
Bx8gBx8gBx8gBx8gBx8gBx8gBx8gB9/5HDCe8zlgPOdznO0UAbXzOWA853PAeM7ngPGczwHjOZ8D
xnM+B4wHkAMGyAED5IABcsAAOWCAHDBADhggBwyQAwbIAQPkgAA5IEAOCJADAuSAADkgQA4IkAMC
5IAAOSBADjggBxyQAw7IAQfkgANywAE54IAccEAOOCAHHJADAciBAORAAHIgADkQgBwIQA4EIAfg
OBsG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG
8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG
8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwCeA4BPIcAnkMAzyGA
5xDAcwjgOQTwHAJ4DgE8hwCeQwDPIYDnEMBzCOA5BPAcAngOATyHAJ5DAM8hgOcQwHMI4DkE8BwC
eA4BPIcAnkMAzyGA5xDAcwjgOQTwHAJ4DgE8hwCeQ3BADoDnEMBzCOA5BPAcAngOATyHAJ5DAM8h
gOcQwHMI4DkE8BwCeA4BPIcAnkMAzyGA5xDAcwjgOQTwHAJ4DgE8hwCeQwDPIYDnEMBzCOA5BPAc
AngOATyHAJ5DAM8hgOcQwHMI4DkE8BwCeA4BPIcAnkMAzyGA5xDAcwjgOQTwHAJ4DgE8hwCeQwDP
IYDnEMBzCOA5BPAcAngOATyHAJ5DAM8hgOcQwHMI4DkE8BwCeA4BPIcAnkMAz+EAz+EAz+EAz+EA
z+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EA
z+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+FwQA6A53CA53CA53CA53CA53CA
53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53DQ
/9vP7cPg//D8ny02/66h/zwXCDs7ovnzfM9ZjRd5bjwU9Of5j7MagveP2tkPiL9+E/9ZQ6D/mN/Z
AdJfx9l/1lBwnnM1Pt5z4yHO+j5fQ/xtWgc7I0trU7t/XCnxX9dHIP7XL4r452UPRnYO/zyFe3Zw
xwPnu4HHzCypJPXf53V5/h8tHfcDO1NHun8u1D8uHFF1eEL3z/X254Kjzo7T/rXg/wdQSwECFAAU
AAAACABoVK5GXuJuV98GAABpFQAABwAkAAAAAAABACAAAAAAAAAAZXZlbnQuaAoAIAAAAAAAAQAY
AApCyQ0PjdABGUTIDQ+N0AE+vA3pA4zQAVBLAQIUABQAAAAIANtCrUacyfkvAwUAANsbAAAKACQA
AAAAAAEAIAAAAAQHAABmdW5fcHRyMi5oCgAgAAAAAAABABgADnAUixCM0AHj/BKLEIzQATySGOkD
jNABUEsBAhQAFAAAAAgAtVqrRvqZ2KBOCAAA1DAAAAoAJAAAAAAAAQAgAAAALwwAAGZ1bl9wdHIz
LmgKACAAAAAAAAEAGAD4h6GQBozQAUQBoJAGjNABllUZ6QOM0AFQSwECFAAUAAAACAAlUqtG4U74
cBwIAABfHQAAEwAkAAAAAAABACAAAAClFAAAZnVuX3B0cl9pbnRlcmZhY2UuaAoAIAAAAAAAAQAY
AIAIRIz9i9ABgCaq6AOM0AEbjBvpA4zQAVBLAQIUABQAAAAIAEBUrkZpMDZIBQUAANQfAAARACQA
AAAAAAEAIAAAAPIcAAB0ZXN0X2RlbGVnYXRlLmNwcAoAIAAAAAAAAQAYAKn1VrcRjdABLr9UtxGN
0AGqpg7pA4zQAVBLAQIUABQAAAAIAGtYrkY5xfAAaroDAM4CBAAcAAAAAAAAAAAAIAAAACYiAABB
IFNtYXJ0IEZ1bmN0aW9uIFBvaW50ZXIucGRmUEsFBgAAAAAGAAYAIwIAAMrcAwAAAA==
------=_Part_148_668006021.1431619992363--
.
Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Thu, 14 May 2015 09:33:11 -0700
Raw View
--001a11c37c1897d22f05160d4806
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On Thu, May 14, 2015 at 7:23 AM, Michael Boyko <mboyko2000@gmail.com> wrote=
:
> Arthur,
>
> Good examples that do need answers. fun_ptr answers these in a way
> consistent with function pointer like semantics.
You mean shared_ptr<function> semantics.
[...]
> In my paper I document that a smart function pointer is designed to have
> function pointer like semantics. Consider calling/invoking a regular old
> standalone function pointer: it does not change the pointer's value and s=
o
> too calling operator() on fun_ptr should not change its value (and it
> doesn't). I'd also make the argument that since operator() is a const mem=
ber
> function it should not change the types value (that is operator() is NOT =
a
> salient operation).
operator() is not always a const member function. To take a concrete exampl=
e:
> auto lam1 =3D [state=3D0]() mutable { return state++; };
In the above example, the lambda type's operator() is not a const
member function,
and does modify the state of the lambda object.
> fun_ptr meets all three of these value type properties. Its hard to imagi=
ne
> how std::function could in general satisfy these 3 properties since it
> performs a deep copy of the contained function object.
[...but then later you say...]
> This is why we want fun_ptr to accept function objects by value. Its akin=
to
> assigning one function pointer to another. When a fun_ptr is created it
> copies the functor (and state if any)
Does fun_ptr make a deep copy, or not? From your proposal it's pretty
clear that you *do* think of make_fun(f1) as making a deep copy of f1,
in exactly the same way as make_shared<function<F>>(f1). However,
whenever anyone brings this up, you switch to saying "oh no, there are
no deep copies here."
> For function pointer like semantics we want the copy to behave exactly li=
ke
> the original, right (property A above)? The following code should behave
> exactly the same no matter the output from rand(). And for fun_ptr it doe=
s -
> it calls the lambda 1000 times regardless of rand()'s output.
>
> auto f1 =3D make_fun([]() { /*...*/ });
> auto f2 =3D f1; //copy constructor - shares target with d1.
> for (int i =3D 0; i < 1000; ++i) {
> assert(f1 =3D=3D f2); //true each time through the loop
> if (rand() % 2 =3D=3D 0) f1();
> else f2();
> }
>
> If the above example was replaced with regular old function pointers what=
is
> the behavior we would want and expect? std::function does not behave like=
a
> regular function pointer would, but fun_ptr does!
shared_ptr<function<F>> behaves like (F*).
> Now let's consider your two examples with fun_ptr replacing std::function
> and then compare and discuss...
>
> auto lam1 =3D [state=3D0]() mutable { return state++; };
> std::fun_ptr<int(void)> f1 =3D lam1; lam1();
> std::fun_ptr<int(void)> f2 =3D lam1;
> return (f1 =3D=3D f2); // false, if fact calling lam1() or not does =
not
> change this
Yep, that corresponds with my interpretation of your proposal as well.
The fun_ptr constructor (and make_fun) create deep copies of their
argument, as if by make_shared<function<F>>(lam1).
> auto lam1 =3D [state=3D0]() mutable { return state++; };
> std::fun_ptr<int(void)> f1 =3D lam1;
> std::fun_ptr<int(void)> f2 =3D f1;
> assert(f1 =3D=3D f2); // true, f2 was just assigned f1 so it better b=
e!
> f1(); //operator() is const and this is not a salient operation
> assert(f1 =3D=3D f2); // true, and f1 and f2 do NOT have different be=
haviors
> (std::function does have different behaveior)
Yep, this corresponds with my interpretation of your proposal as well.
fun_ptr<F>, being a synonym for shared_ptr<function<F>>, has reference
semantics with relation to the controlled object of type function<F>.
The controlled object is created via deep copy when
make_shared/make_fun is called, but after that point, copying the
shared_ptr simply creates a new pointer to the single copy.
> Again calling f1() is const operation and not salient (doesn't change its
> target) and so the f1 has the same value after the call as it did before =
the
> call.
Calling f1() is not actually a const operation. In particular, after
the assignment
fun_ptr<int(void)> f1 =3D lam1;
calling f1() will affect a different copy of the functor object than
calling lam1() will =E2=80=94 f1 is in no sense a "pointer to" lam1.
(Try it out and see!)
> I will try to add some of these examples and explanations to my proposal =
- I
> don't think I am marketing this very well...
You're just not realizing that (1) shared_ptr and function already
exist, and that (2) combining them gives you exactly the semantics
you're looking for.
I've attached a copy of "event.h" with delegate_type replaced with
shared_ptr<function>, so you can see concretely what that looks like.
HTH,
=E2=80=93Arthur
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--001a11c37c1897d22f05160d4806
Content-Type: text/x-chdr; charset=US-ASCII; name="event.h"
Content-Disposition: attachment; filename="event.h"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_i9oe7f500
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioNCi8vISBAZmlsZQ0KLy8hIEBicmllZiBFdmVudCB0ZW1w
bGF0ZSBkZWZpbml0aW9ucy4NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCiNpZm5kZWYgVVRJ
TF9FVkVOVF9IDQojZGVmaW5lIFVUSUxfRVZFTlRfSA0KDQojaW5jbHVkZSA8ZnVuY3Rpb25hbD4N
CiNpbmNsdWRlIDxtZW1vcnk+DQojaW5jbHVkZSAiZmluYWxseS5oIg0KI2luY2x1ZGUgPHZlY3Rv
cj4NCiNpbmNsdWRlIDxhbGdvcml0aG0+DQojaW5jbHVkZSA8c3RkZXhjZXB0Pg0KI2luY2x1ZGUg
PGl0ZXJhdG9yPg0KI2luY2x1ZGUgPGNhc3NlcnQ+DQoNCm5hbWVzcGFjZSB1dGlsDQp7DQoNCnRl
bXBsYXRlIDx0eXBlbmFtZSBGdW5jU2lnbmF0dXJlPg0KY2xhc3MgZXZlbnQ7DQoNCi8vISBAYnJp
ZWYgZXZlbnQgY2xhc3MNCi8vISBAdHBhcmFtIFJldCBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGV2
ZW50IGZ1bmN0aW9uIHNpZ25hdHVyZSAodXN1YWxseSB2b2lkKS4NCi8vISBAdHBhcmFtIEFyZ3Mg
ZXZlbnQgZnVuY3Rpb24gYXJndW1lbnRzDQp0ZW1wbGF0ZSA8dHlwZW5hbWUgUmV0LCB0eXBlbmFt
ZS4uLiBBcmdzPg0KY2xhc3MgZXZlbnQ8UmV0KEFyZ3MuLi4pPg0Kew0KcHVibGljOg0KICAgZXZl
bnQoY29uc3QgZXZlbnQmKSA9IGRlbGV0ZTsNCiAgIGV2ZW50KGV2ZW50JiYpID0gZGVsZXRlOw0K
ICAgZXZlbnQmIG9wZXJhdG9yPShjb25zdCBldmVudCYpID0gZGVsZXRlOw0KICAgZXZlbnQmIG9w
ZXJhdG9yPShldmVudCYmKSA9IGRlbGV0ZTsNCg0KICAgLy8hIEBicmllZiBEZWZpbmUgdGhlIGRl
bGVnYXRlIHR5cGUgdXNlZCB0byBjYWxsIGZ1bmN0aW9ucyB3aXRoDQogICAvLyEgIHRoZSBmdW5j
dGlvbiBzaWduYXR1cmUgb2YgdGhpcyBldmVudC4NCiAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxS
ZXQoQXJncy4uLik+IGZ1bmN0aW9uX3R5cGU7DQogICB0eXBlZGVmIHN0ZDo6c2hhcmVkX3B0cjxz
dGQ6OmZ1bmN0aW9uPFJldChBcmdzLi4uKT4+IGRlbGVnYXRlX3R5cGU7DQoNCiAgIC8vISBAYnJp
ZWYgRGVmaW5lcyB0aGUgdHlwZSB1c2VkIHRvIGludm9rZSB0aGlzIGV2ZW50Lg0KICAgdHlwZWRl
ZiBkZWxlZ2F0ZV90eXBlIGludm9rZXJfdHlwZTsNCg0KICAgZXZlbnQoKSA6IGRlbGVnYXRlX2xp
c3RfKCksIHBfaW52b2tlX2RhdGFfe251bGxwdHJ9LCBnYXZlX2ludm9rZXJfe2ZhbHNlfQ0KICAg
ew0KICAgfQ0KDQogICAvLyEgQGJyaWVmIHJldHJpZXZlIHRoZSBpbnZva2VyIGZvciB0aGlzIGV2
ZW50Lg0KICAgLy8hDQogICAvLyEgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgb25j
ZS4NCiAgIGludm9rZXJfdHlwZSBnZXRfaW52b2tlcigpOw0KDQogICAvLyEgQGJyaWVmIEFkZCBh
IGRlbGVnYXRlIGZ1bmN0aW9uIHRvIHRoZSBldmVudC4NCiAgIHZvaWQgb3BlcmF0b3IrPShjb25z
dCBkZWxlZ2F0ZV90eXBlJiB0aGVEZWxlZ2F0ZSkNCiAgIHsNCiAgICAgIGRlbGVnYXRlX2xpc3Rf
LnB1c2hfYmFjayh0aGVEZWxlZ2F0ZSk7DQogICB9DQoNCiAgIC8vISBAYnJpZWYgUmVtb3ZlIGEg
ZGVsZWdhdGUgZnVuY3Rpb24gZnJvbSB0aGUgZXZlbnQuDQogICB2b2lkIG9wZXJhdG9yLT0oY29u
c3QgZGVsZWdhdGVfdHlwZSYgdGhlRGVsZWdhdGUpOw0KDQpwcml2YXRlOg0KICAgLy8gQ2FsbHMg
YWxsIHRoZSBhdHRhY2hlZCBkZWxlZ2F0ZXMuIFRoZSBpbnZva2VyIGZ1bmN0aW9uIG9iamVjdCBj
YWxscyB0aGlzDQogICAvLyBmdW5jdGlvbi4NCiAgIFJldCBpbnZva2UoQXJncy4uLiBhcmdzKTsN
Cg0KICAgLy8gYSBzaWduZWQgdHlwZSBpcyBuZWVkZWQgZm9yIHRoZSBpbmRleCB0eXBlIGJlY2F1
c2UgYSB2YWx1ZSBpZiAtMSBtaWdodA0KICAgLy8gZXhpc3QuDQogICB0eXBlZGVmIHR5cGVuYW1l
IHN0ZDo6dmVjdG9yPGRlbGVnYXRlX3R5cGU+OjpkaWZmZXJlbmNlX3R5cGUgaW5kZXhfdHlwZTsN
Cg0KICAgc3RydWN0IGludm9rZV9kYXRhIHsNCiAgICAgIGluZGV4X3R5cGUgY3VycmVudDsgLy8g
aW5kZXggdG8gdGhlIGN1cnJlbnQgZGVsZWdhdGUNCiAgICAgIGluZGV4X3R5cGUgZW5kOyAgICAg
Ly8gaW5kZXggdG8gb25lIHBhc3QgdGhlIGxhc3QgZGVsZWdhdGUNCiAgIH07DQoNCiAgIHN0ZDo6
dmVjdG9yPGRlbGVnYXRlX3R5cGU+IGRlbGVnYXRlX2xpc3RfOw0KICAgaW52b2tlX2RhdGEqIHBf
aW52b2tlX2RhdGFfOw0KICAgZGVsZWdhdGVfdHlwZSBpbnZva2VyXzsNCn07DQoNCnRlbXBsYXRl
IDx0eXBlbmFtZSBSZXQsIHR5cGVuYW1lLi4uIEFyZ3M+DQp0eXBlbmFtZSBldmVudDxSZXQoQXJn
cy4uLik+OjppbnZva2VyX3R5cGUgZXZlbnQ8UmV0KEFyZ3MuLi4pPjo6Z2V0X2ludm9rZXIoKQ0K
ew0KICAgaWYgKGludm9rZXJfICE9IG51bGxwdHIpIHsNCiAgICAgIC8vIFdlIGNvdWxkIHNhZmVs
eSByZW1vdmUgdGhpcyB0aHJvdywgaWYgd2Ugd2FudGVkIHRvLg0KICAgICAgdGhyb3cgOjpzdGQ6
OnJ1bnRpbWVfZXJyb3IoImNhbm5vdCBnaXZlIG11bHRpcGxlIGV2ZW50IGludm9rZXJzIik7DQog
ICB9DQogICBhdXRvIGludm9rZXIgPSBbdGhpc10oYXV0byYmLi4uIGFyZ3MpeyBpbnZva2Uoc3Rk
Ojpmb3J3YXJkPGRlY2x0eXBlKGFyZ3MpPihhcmdzKS4uLik7IH07DQogICBpbnZva2VyXyA9IHN0
ZDo6bWFrZV9zaGFyZWQ8ZnVuY3Rpb25fdHlwZT4oaW52b2tlcik7DQogICByZXR1cm4gaW52b2tl
cl87DQp9DQoNCnRlbXBsYXRlIDx0eXBlbmFtZSBSZXQsIHR5cGVuYW1lLi4uIEFyZ3M+DQp2b2lk
IGV2ZW50PFJldChBcmdzLi4uKT46Om9wZXJhdG9yLT0oY29uc3QgZGVsZWdhdGVfdHlwZSYgdGhl
RGVsZWdhdGUpDQp7DQogICAvLyBGaW5kIHRoZSBkZWxlZ2F0ZSB0byBlcmFzZSAodXNlIHJldmVy
c2UgaXRlcmF0b3IgZm9yIGxhc3QgaW4gZmlyc3Qgb3V0DQogICAvLyBzZW1hbnRpY3MpLg0KICAg
YXV0byBlcmFzZV9yaXQgPQ0KICAgICAgc3RkOjpmaW5kKGRlbGVnYXRlX2xpc3RfLnJiZWdpbigp
LCBkZWxlZ2F0ZV9saXN0Xy5yZW5kKCksIHRoZURlbGVnYXRlKTsNCg0KICAgLy8gV2FzIGEgbWF0
Y2ggZm91bmQ/DQogICBpZiAoZXJhc2Vfcml0ICE9IGRlbGVnYXRlX2xpc3RfLnJlbmQoKSkgew0K
ICAgICAgLy8gbWF0Y2ggZm91bmQgLSBjb252ZXJ0IHRoZSByZXZlcnNlIGl0ZXJhdG9yIHRvIGFu
IGl0ZXJhdG9yDQogICAgICBhdXRvIGVyYXNlX2l0ID0gKCsrZXJhc2Vfcml0KS5iYXNlKCk7DQoN
CiAgICAgIC8vIElzIHRoaXMgZXZlbnQgY3VycmVudGx5IGluIHRoZSBjb250ZXh0IG9mIGludm9r
ZSgpPw0KICAgICAgaWYgKHBfaW52b2tlX2RhdGFfKSB7DQogICAgICAgICAvLyBDYXJlIG11c3Qg
YmUgdGFrZW4gaWYgZGV0YWNoaW5nIGZyb20gdGhlIGNvbnRleHQgb2YgdGhlIGludm9rZSgpDQog
ICAgICAgICAvLyBmdW5jdGlvbiBzaW5jZSB0aGUgdmVjdG9yIGlzIGN1cnJlbnRseSBiZWluZyBp
dGVyYXRlZCBvdmVyLiBJbnZva2UNCiAgICAgICAgIC8vIGRhdGEgbWF5IG5lZWQgdG8gYmUgdXBk
YXRlZC4NCg0KICAgICAgICAgLy8gY29udmVydCBlcmFzZUl0IHRvIGFuIGluZGV4IChndWFyYW50
ZWVkIHRvIGJlID49IDApDQogICAgICAgICBpbmRleF90eXBlIGVyYXNlX2luZGV4ID0gc3RkOjpk
aXN0YW5jZShkZWxlZ2F0ZV9saXN0Xy5iZWdpbigpLCBlcmFzZV9pdCk7DQoNCiAgICAgICAgIC8v
IElmIHRoZSBlbGVtZW50IGJlaW5nIGVyYXNlZCBpcyA8IHRoYW4gdGhlIGN1cnJlbnRseSBiZWlu
ZyBpbnZva2VkDQogICAgICAgICAvLyBkZWxlZ2F0ZSAocF9pbnZva2VfZGF0YV8tPmN1cnJlbnQp
IHRoZSBpbmRleCBuZWVkcyB0byBiZSBhZGp1c3RlZCBsZWZ0DQogICAgICAgICAvLyBvbmUgc2xv
dCBzbyB0aGUgaW5kZXggcG9pbnRzIHRvIHRoZSBzYW1lIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50
DQogICAgICAgICAvLyBiZWluZyBlcmFzZWQgaXMgd2hhdCBjdXJyZW50IHBvaW50cyB0byAodGhl
ID09IGNhc2UpIHRoZSBpbmRleCBzdGlsbA0KICAgICAgICAgLy8gbmVlZHMgdG8gYmUgYWRqdXN0
ZWQgbGVmdCBvbmUgc2luY2UgdXBvbiByZXR1cm5pbmcgdG8gaW52b2tlKCkgdGhlDQogICAgICAg
ICAvLyBpbmRleCBpcyBhZHZhbmNlZC4gbm90ZTogY3VycmVudCBtYXkgYmUgZGVjcmVtZW50ZWQg
dG8gLTEgd2hpY2ggaXMNCiAgICAgICAgIC8vIHdlbGwgZGVmaW5lZCB3aGVyZWFzIGRlbGVnYXRl
X2xpc3RfLmJlZ2luKCkgLSAxIGlzIHVuZGVmaW5lZCBsYW5kDQogICAgICAgICAvLyB3aGljaCBp
cyBvbmUgcmVhc29uIHdoeSBhbiBpbmRleCBpcyBiZWluZyB1c2VkIGluc3RlYWQgb2YgYW4NCiAg
ICAgICAgIC8vIGl0ZXJhdG9yLg0KICAgICAgICAgaWYgKGVyYXNlX2luZGV4IDw9IHBfaW52b2tl
X2RhdGFfLT5jdXJyZW50KSB7DQogICAgICAgICAgICBhc3NlcnQocF9pbnZva2VfZGF0YV8tPmN1
cnJlbnQgPCBwX2ludm9rZV9kYXRhXy0+ZW5kKTsNCiAgICAgICAgICAgIC0tcF9pbnZva2VfZGF0
YV8tPmN1cnJlbnQ7DQogICAgICAgICAgICAtLXBfaW52b2tlX2RhdGFfLT5lbmQ7DQogICAgICAg
ICB9IGVsc2UgaWYgKGVyYXNlX2luZGV4IDwgcF9pbnZva2VfZGF0YV8tPmVuZCkgew0KICAgICAg
ICAgICAgLS1wX2ludm9rZV9kYXRhXy0+ZW5kOw0KICAgICAgICAgfQ0KICAgICAgfQ0KDQogICAg
ICAvLyBzYWZlbHkgZXJhc2UgZWxlbWVudA0KICAgICAgZGVsZWdhdGVfbGlzdF8uZXJhc2UoZXJh
c2VfaXQpOw0KICAgfQ0KfQ0KDQp0ZW1wbGF0ZSA8dHlwZW5hbWUgUmV0LCB0eXBlbmFtZS4uLiBB
cmdzPg0KUmV0IGV2ZW50PFJldChBcmdzLi4uKT46Omludm9rZShBcmdzLi4uIGFyZ3MpDQp7DQog
ICAvLyBlbnN1cmUgdGhhdCBub25lIG9mIHRoZSBzdWJzY3JpYmVkIGRlbGVnYXRlcyBpbnZva2Ug
dGhlIGV2ZW50Lg0KICAgYXNzZXJ0KCFwX2ludm9rZV9kYXRhXyk7DQoNCiAgIGF1dG8gaW52b2tl
X2RhdGFfc2NvcGVkID0NCiAgICAgIGludm9rZV9kYXRhezAsIHN0YXRpY19jYXN0PGluZGV4X3R5
cGU+KGRlbGVnYXRlX2xpc3RfLnNpemUoKSl9Ow0KDQogICAvLyBiZWdpbiBpbnZva2UgY29udGV4
dA0KICAgcF9pbnZva2VfZGF0YV8gPSAmaW52b2tlX2RhdGFfc2NvcGVkOw0KICAgYXV0byBpbnZv
a2VDb250ZXh0ID0gdXRpbDo6ZmluYWxseShbJl0gew0KICAgICAgLy8gZW5kIG9mIGludm9rZSBj
b250ZXh0DQogICAgICBwX2ludm9rZV9kYXRhXyA9IG51bGxwdHI7DQogICB9KTsNCg0KICAgLy8g
Y2FsbCBlYWNoIGRlbGVnYXRlDQogICB3aGlsZSAoaW52b2tlX2RhdGFfc2NvcGVkLmN1cnJlbnQg
PCBpbnZva2VfZGF0YV9zY29wZWQuZW5kKSB7DQogICAgICAvLyBub3RlOiB0aGUgY2FsbCBtYXkg
YWx0ZXIgY3VycmVudCBhbmQgZW5kIGlmIGNhbGxiYWNrIGNhbGxzICs9IG9yIC09DQogICAgICAo
KmRlbGVnYXRlX2xpc3RfW2ludm9rZV9kYXRhX3Njb3BlZC5jdXJyZW50XSkoYXJncy4uLik7DQog
ICAgICBhc3NlcnQoaW52b2tlX2RhdGFfc2NvcGVkLmN1cnJlbnQgPj0gLTEpOw0KICAgICAgYXNz
ZXJ0KGludm9rZV9kYXRhX3Njb3BlZC5jdXJyZW50IDwgaW52b2tlX2RhdGFfc2NvcGVkLmVuZCk7
DQogICAgICArK2ludm9rZV9kYXRhX3Njb3BlZC5jdXJyZW50Ow0KICAgfQ0KfQ0KDQp9IC8vIG5h
bWVzcGFjZSB1dGlsDQoNCiNlbmRpZiAvLyBVVElMX0VWRU5UX0gNCg==
--001a11c37c1897d22f05160d4806--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Thu, 14 May 2015 09:44:56 -0700 (PDT)
Raw View
------=_Part_4227_1837622982.1431621896681
Content-Type: multipart/alternative;
boundary="----=_Part_4228_1967130967.1431621896682"
------=_Part_4228_1967130967.1431621896682
Content-Type: text/plain; charset=UTF-8
Here is an updated document.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_4228_1967130967.1431621896682
Content-Type: text/html; charset=UTF-8
<div dir="ltr"><div>Here is an updated document.</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an email to <a href="mailto:std-proposals+unsubscribe@isocpp.org">std-proposals+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href="mailto:std-proposals@isocpp.org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href="http://groups.google.com/a/isocpp.org/group/std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/</a>.<br />
------=_Part_4228_1967130967.1431621896682--
------=_Part_4227_1837622982.1431621896681
Content-Type: application/zip; name=smart_function_pointer.zip
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=smart_function_pointer.zip
X-Attachment-Id: 5d3666de-b2d8-4b4e-ac11-653151f4c16c
Content-ID: <5d3666de-b2d8-4b4e-ac11-653151f4c16c>
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
Q3uq7K9V9tjLVFaFrtpfL++X/519slHGN/fCZhlX9sAq+93lnCUUvsd7l30rHPXWmOSPsOxJYdmD
wrL/hHM8uaxh3T9Yt93NegrLPhMebnJReJS3Lrx1UJkXNbbUjuY58lPlGikweUvrX86BV6+tq9ZV
ZX65vLYKvP5P8OZ80pX66Mt6C8veFH7R9Dsse1JY96CDXk7SMcgeFF7s1ftXOejqPF6dTmWfq8nH
l8sSr9A/zXX/Kp+mfJP+IU9WzZVpVXJklXyIboqn08H4QHN0b4mf3s0M6dlG51vPNL1bezKJlUg3
4TWPeeeX3nI2Cp/z8pjMaW+NrQkmn0XU9+ov70zQu6eXy3T/f9HLcxp/skf3Fnu9xV5E+ttb4qa3
2OstcdZbbUqM9R7r5c/KfLnYO5tVnpuGX8mj2PJs0McJJl/Sr6vz8FU5+PIZpjIP6zjVlpZJTPWe
WqX+JG887Y2/OHPJ2Hq/6Mk6V6Ge1dDVZ8GMasjz69Xnuss0tgpdfa6rPKP9d85myzK+ef5am3Hl
3FX1jJXh1V1VxSdXry1Zf+EtGf+wrsI7My6fscK6rg+aXHQ5Xx0xcR0+7sVTpVx1znnxp++SVyLe
uovIGosEDVVdb5EkkyMiySY+I02qOccIRVp4lGaIPKj2O3jvXa6sQV0TEdnrIn2qrD/Ri9xv1ltE
9uhIplDM7D2VRD4qMn7SMUeGCY3wbMs4IqO9cXr6EbnTRSYKTRaankEuiswSkjtcZIFQkdn/lMiT
ciaILBFabvJxpMTEqe6FkXVCm4W2ev7aJbTf3BMiR42fIieNfkT2jsh5oXJzBtT8X5mbo7IHRGsY
UnvsMxLb0TrG71E5g0YbmjiLpho/6jxGm3plrTwb7Uwuj8oZMSrnw6jmHjmPReUcFpVzVVTOU9Fs
499o3MtjMv5ovvc+0sRDVM5CUTkDRWWPiE65Ej+au/U8EJWzUFTOQtF5ntzLuVE5D0SLjX1dJ1Hx
UVTOANE1VWK18h5QuUcJH11vdKKlRqbfxqi9rvaG//82xv+lZ2VOM2e9fqJqlfre9PkSUoSaCLUQ
ShPqINSlyns3oXShPkL3Cw0SyhSKCQ0TGiE0Wmic0EShyULThWYJzRVaIFTk0RKh5UIlQuuENgtt
FdoltF/okNBRr82T/+T9tNB5j1S/3OdLdIw8sYZQHa9vJ713GUNiPaGGQqlGfvm9qVAr09fEdlfG
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
JT2se5rwsedjS0s0JZkAZoS0pTXS6ydpmqpqKAxTVszhtVVXk1tOrprifUVX017M/D7K7Ij2kuHN
STe0OJIamyrtKHKmMJpKfXVbk2vN8RzsnWwTdCU3pHtJj8wtN8Td03aOu5q6rolRzRSzqHwmdh/5
NyDbeh9BNxRfM0CPI5z/fkkhJIecjDlH4tFETBw8onKL+NMIphRMJT3CcsvEp5sea3Er+FOPTUE7
F+WSUU5R/9dRUJRPYTuXfcnMJsMei3zE6ZH1pcWceDhHfRkwpAmOmwMC+iYJT2Q6ZOrSbY91PlL0
KNem4J2Lt8k4p+idq7cp2qbwHy07VG+Tu04IOjR/SN4mDE/8vYQIUiOOjb3ECNLGjp28RPJTy4+t
vSTy086OvbyEDVIzjs29xA3S1o7dvER3U9uO7b0kd9MSjk0/xATS5syS5dKpDe5ZuHVnk1xO+D5a
chnvJj4fg3ypApq9de+0/WreantXITUEq/vY+wHzOFZ+ZvBNELqEW3dbfjeI1/7uAT6B34X88z/j
BGYBdoiNEZtD1wevlK9Qn6qfrJ8uPiX8C/lmiq3l66o31q+uPuH8Sz+T+eZzrWfrLjder2uvvj5B
33E94z+rBnYBloyNfW0Zm4LrghtX1y+vED7FPRO7do6NHuuCW13XO68EPvXfMT1zPyu7joQNiJsR
N6yv3J/BfhO9JobNjhse1z6vfp9B3/M/M/5mgq0F64o3lu5NeYeBQ3i3UGN/5MaOcl1meTFzY2bJ
z5pcRjou9VzqeDlzc2bpz1pdxjqutl1ueRFzI2YdZ0nPGp+GvS75XJJzzShHEP1Pz/wPOL/K9o4y
/Ov3ztq+WvcePr8nCwYI9+fOEZ8tHyE/Qr6Jf6Z/lAIwAjIFqwVzBLsEI37JAxQCGALaBdsEEwTr
BQsCkgOaAqIDqgKyAzoDwgPKfml/6X7tfvF+9X75vAFyb68XBD4BAnHFkKW8Z6xi8rF3kMNXWHuI
UVoLaPGRGEXkeMVW3iKuqDv7ZBLdiAepWOQSA9zMBrERT2gbjErbnVJOVygjtVNobXWR5ibceqVQ
TjtU9qnGQh77HdZZGDFMoNNAGNJv68V8lnyYG+bYxMUb8p17/nM4JvKH29n238Osulu1knzRt51t
ZZ83Lkybe+CEoSJco1887SDZkchG9N6WfKH8WO2bCpVhqYtzViBEYE0buswB47vhnsO78Z7Tux/d
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
0X97J0ExQf839/NzqJ57i2yLzTKPXny23VLMHBiDDPxWFqjevWg5Ym+Zqin6yCirJXU0sJV5Icn0
9OK1S/sJQBad7UzNbuDxnH2jEWdv/3VDoOlQSCQcSWf23zUYmu4f73Q2/67BIOS5GgRDnashIejP
GpIHznuuBvGc6wOJQJyvoSDYuRov6ly/SD6+c32geKDzNRgv37kahIKfqyF5EOdqaJ7z4/H9tS/+
zxqaB30uBxp+fr2gEahz2dAIvvO1sx3kudrZDM/V+M73ywtDncvLC0eer6GgP6eFwRHnlhl2Numf
08LgaNSf6wAG5+P9c3uBISDkn+sPhkbAz42HBiwLmg/+57TQX4H/rMF4zm0vEAw6tx1AMATP+RoK
+WdeCMaLPDc/6Px2BZ3d/lwHEIRAn5sfAnZu3UMIBM+58VA88HPb39l3lff8dxXBd76G5AHUYIAa
BKjBATUEoIYE1FCAGmD/ggTkQAJyoAA5UIAcKEAOFCAHCpADBciBAuRAAXKgADlQgBxoQA40IAca
kAMNyIEG5EADcqABOdCAHGhADjQgBy8gBy8gBy8gBy8gBy8gBy8gBy8gBy8gBy8gBy8gBx8gBx8g
Bx8gBx8gBx8gBx8gBx8gBx8gBx8gB9/5HDCe8zlgPOdznO0UAbXzOWA853PAeM7ngPGczwHjOZ8D
xnM+B4wHkAMGyAED5IABcsAAOWCAHDBADhggBwyQAwbIAQPkgAA5IEAOCJADAuSAADkgQA4IkAMC
5IAAOSBADjggBxyQAw7IAQfkgANywAE54IAccEAOOCAHHJADAciBAORAAHIgADkQgBwIQA4EIAfg
OBsG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG
8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG
8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwG8BwCeA4BPIcAnkMAzyGA
5xDAcwjgOQTwHAJ4DgE8hwCeQwDPIYDnEMBzCOA5BPAcAngOATyHAJ5DAM8hgOcQwHMI4DkE8BwC
eA4BPIcAnkMAzyGA5xDAcwjgOQTwHAJ4DgE8hwCeQ3BADoDnEMBzCOA5BPAcAngOATyHAJ5DAM8h
gOcQwHMI4DkE8BwCeA4BPIcAnkMAzyGA5xDAcwjgOQTwHAJ4DgE8hwCeQwDPIYDnEMBzCOA5BPAc
AngOATyHAJ5DAM8hgOcQwHMI4DkE8BwCeA4BPIcAnkMAzyGA5xDAcwjgOQTwHAJ4DgE8hwCeQwDP
IYDnEMBzCOA5BPAcAngOATyHAJ5DAM8hgOcQwHMI4DkE8BwCeA4BPIcAnkMAz+EAz+EAz+EAz+EA
z+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EA
z+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+EAz+FwQA6A53CA53CA53CA53CA53CA
53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53CA53DQ
/9vP7cPg//D8ny02/66h/zwXCDs7ovnzfM9ZjRd5bjwU9Of5j7MagveP2tkPiL9+E/9ZQ6D/mN/Z
AdJfx9l/1lBwnnM1Pt5z4yHO+j5fQ/xtWgc7I0trU7t/XCnxX9dHIP7XL4r452UPRnYO/zyFe3Zw
xwPnu4HHzCypJPXf53V5/h8tHfcDO1NHun8u1D8uHFF1eEL3z/X254Kjzo7T/rXg/wdQSwECFAAU
AAAACABoVK5GXuJuV98GAABpFQAABwAkAAAAAAABACAAAAAAAAAAZXZlbnQuaAoAIAAAAAAAAQAY
AApCyQ0PjdABGUTIDQ+N0AE+vA3pA4zQAVBLAQIUABQAAAAIANtCrUacyfkvAwUAANsbAAAKACQA
AAAAAAEAIAAAAAQHAABmdW5fcHRyMi5oCgAgAAAAAAABABgADnAUixCM0AHj/BKLEIzQATySGOkD
jNABUEsBAhQAFAAAAAgAtVqrRvqZ2KBOCAAA1DAAAAoAJAAAAAAAAQAgAAAALwwAAGZ1bl9wdHIz
LmgKACAAAAAAAAEAGAD4h6GQBozQAUQBoJAGjNABllUZ6QOM0AFQSwECFAAUAAAACAAlUqtG4U74
cBwIAABfHQAAEwAkAAAAAAABACAAAAClFAAAZnVuX3B0cl9pbnRlcmZhY2UuaAoAIAAAAAAAAQAY
AIAIRIz9i9ABgCaq6AOM0AEbjBvpA4zQAVBLAQIUABQAAAAIAEBUrkZpMDZIBQUAANQfAAARACQA
AAAAAAEAIAAAAPIcAAB0ZXN0X2RlbGVnYXRlLmNwcAoAIAAAAAAAAQAYAKn1VrcRjdABLr9UtxGN
0AGqpg7pA4zQAVBLAQIUABQAAAAIAGtYrkY5xfAAaroDAM4CBAAcAAAAAAAAAAAAIAAAACYiAABB
IFNtYXJ0IEZ1bmN0aW9uIFBvaW50ZXIucGRmUEsFBgAAAAAGAAYAIwIAAMrcAwAAAA==
------=_Part_4227_1837622982.1431621896681--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Thu, 14 May 2015 10:30:23 -0700 (PDT)
Raw View
------=_Part_20_1943393319.1431624623234
Content-Type: multipart/alternative;
boundary="----=_Part_21_1532725210.1431624623234"
------=_Part_21_1532725210.1431624623234
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
I think you are missing that fun_ptr can handle standalone functions as=20
well as member functions in addition to function objects. Consider this:
auto f1 =3D make_fun(&standalone);
auto f2 =3D make_fun(&standalone);
assert(f1 =3D=3D f2); // this is true for fun_ptr, but would not be true if=
=20
implemented in terms of shared_ptr<function<F>>
I think that addresses a lot of your comments but I do have a few other=20
below...
On Thursday, May 14, 2015 at 11:33:13 AM UTC-5, Arthur O'Dwyer wrote:
> On Thu, May 14, 2015 at 7:23 AM, Michael Boyko <mboyk...@gmail.com=20
> <javascript:>> wrote:=20
> > Arthur,=20
> >=20
> > Good examples that do need answers. fun_ptr answers these in a way=20
> > consistent with function pointer like semantics.=20
>
> You mean shared_ptr<function> semantics.=20
>
fun_ptr has shared_ptr<function> semantics just for function objects.=20
fun_ptr can also target member functions and standalone functions.=20
make_fun(&some_class::some_function, &obj) or=20
make_fun(&standalone_function) definitely cannot have shared_ptr<function>=
=20
semantics - equality will not work.=20
=20
>
> [...]=20
> > In my paper I document that a smart function pointer is designed to hav=
e=20
> > function pointer like semantics. Consider calling/invoking a regular ol=
d=20
> > standalone function pointer: it does not change the pointer's value and=
=20
> so=20
> > too calling operator() on fun_ptr should not change its value (and it=
=20
> > doesn't). I'd also make the argument that since operator() is a const=
=20
> member=20
> > function it should not change the types value (that is operator() is NO=
T=20
> a=20
> > salient operation).=20
>
> operator() is not always a const member function. To take a concrete=20
> example:=20
>
> > auto lam1 =3D [state=3D0]() mutable { return state++; };=20
>
> In the above example, the lambda type's operator() is not a const=20
> member function,=20
> and does modify the state of the lambda object.=20
>
I'm not referring to operator() in the lambda. operator() in std::function=
=20
is always const as well as in fun_ptr - that's what I was referring to. So=
=20
yes operator() being const in std::function is kind of lying. That's what=
=20
N4159 points out.
=20
>
> > fun_ptr meets all three of these value type properties. Its hard to=20
> imagine=20
> > how std::function could in general satisfy these 3 properties since it=
=20
> > performs a deep copy of the contained function object.=20
> [...but then later you say...]=20
> > This is why we want fun_ptr to accept function objects by value. Its=20
> akin to=20
> > assigning one function pointer to another. When a fun_ptr is created it=
=20
> > copies the functor (and state if any)=20
>
> Does fun_ptr make a deep copy, or not? From your proposal it's pretty=20
> clear that you *do* think of make_fun(f1) as making a deep copy of f1,=20
> in exactly the same way as make_shared<function<F>>(f1). However,=20
> whenever anyone brings this up, you switch to saying "oh no, there are=20
> no deep copies here."=20
>
For the case of functors only(!) fun_ptr does the following: Copy=20
construction makes a copy of the lambda and copy assignment does not make=
=20
another copy of the lambda (its shared via a shared_ptr). For member=20
functions and standalone functions just copying of the target is performed.=
=20
Equality works in all cases.
=20
>
>
> > For function pointer like semantics we want the copy to behave exactly=
=20
> like=20
> > the original, right (property A above)? The following code should behav=
e=20
> > exactly the same no matter the output from rand(). And for fun_ptr it=
=20
> does -=20
> > it calls the lambda 1000 times regardless of rand()'s output.=20
> >=20
> > auto f1 =3D make_fun([]() { /*...*/ });=20
> > auto f2 =3D f1; //copy constructor - shares target with d1.=20
> > for (int i =3D 0; i < 1000; ++i) {=20
> > assert(f1 =3D=3D f2); //true each time through the loop=20
> > if (rand() % 2 =3D=3D 0) f1();=20
> > else f2();=20
> > }=20
> >=20
> > If the above example was replaced with regular old function pointers=20
> what is=20
> > the behavior we would want and expect? std::function does not behave=20
> like a=20
> > regular function pointer would, but fun_ptr does!=20
>
> shared_ptr<function<F>> behaves like (F*).=20
>
>
> > Now let's consider your two examples with fun_ptr replacing=20
> std::function=20
> > and then compare and discuss...=20
> >=20
> > auto lam1 =3D [state=3D0]() mutable { return state++; };=20
> > std::fun_ptr<int(void)> f1 =3D lam1; lam1();=20
> > std::fun_ptr<int(void)> f2 =3D lam1;=20
> > return (f1 =3D=3D f2); // false, if fact calling lam1() or not doe=
s not=20
> > change this=20
>
> Yep, that corresponds with my interpretation of your proposal as well.=20
> The fun_ptr constructor (and make_fun) create deep copies of their=20
> argument, as if by make_shared<function<F>>(lam1).=20
>
> > auto lam1 =3D [state=3D0]() mutable { return state++; };=20
> > std::fun_ptr<int(void)> f1 =3D lam1;=20
> > std::fun_ptr<int(void)> f2 =3D f1;=20
> > assert(f1 =3D=3D f2); // true, f2 was just assigned f1 so it better=
be!=20
> > f1(); //operator() is const and this is not a salient operation=20
> > assert(f1 =3D=3D f2); // true, and f1 and f2 do NOT have different=
=20
> behaviors=20
> > (std::function does have different behaveior)=20
>
> Yep, this corresponds with my interpretation of your proposal as well.=20
> fun_ptr<F>, being a synonym for shared_ptr<function<F>>, has reference=20
> semantics with relation to the controlled object of type function<F>.=20
> The controlled object is created via deep copy when=20
> make_shared/make_fun is called, but after that point, copying the=20
> shared_ptr simply creates a new pointer to the single copy.=20
>
> > Again calling f1() is const operation and not salient (doesn't change=
=20
> its=20
> > target) and so the f1 has the same value after the call as it did befor=
e=20
> the=20
> > call.=20
>
> Calling f1() is not actually a const operation. In particular, after=20
> the assignment=20
>
> fun_ptr<int(void)> f1 =3D lam1;=20
>
> calling f1() will affect a different copy of the functor object than=20
> calling lam1() will =E2=80=94 f1 is in no sense a "pointer to" lam1.=20
> (Try it out and see!)=20
>
agreed. When a fun_ptr is constructed with a functor it does make a=20
separate copy of the lambda and then manages it and shares when fun_ptr is=
=20
copied. No two fun_ptr's constructed from lambda's (even the same lambda)=
=20
will ever be equal. However constructing two fun_ptrs from standalone=20
functions will compare equal.
=20
>
>
> > I will try to add some of these examples and explanations to my proposa=
l=20
> - I=20
> > don't think I am marketing this very well...=20
>
> You're just not realizing that (1) shared_ptr and function already=20
> exist, and that (2) combining them gives you exactly the semantics=20
> you're looking for.=20
>
No. I pointed out why this is not the case: standalone and member=20
functions. See above.
=20
>
> I've attached a copy of "event.h" with delegate_type replaced with=20
> shared_ptr<function>, so you can see concretely what that looks like.=20
>
I've looked at it but as I explained above this cannot work for uses of=20
standalone and member functions. It will work like fun_ptr for functors I=
=20
think.
=20
>
> HTH,=20
> =E2=80=93Arthur=20
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_21_1532725210.1431624623234
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>I think you are missing that fun_ptr can handle stand=
alone functions as well as member functions in addition to function objects=
.. Consider this:</div><div><br></div><div>auto f1 =3D make_fun(&standal=
one);</div><div>auto f2 =3D make_fun(&standalone);</div><div>assert(f1 =
=3D=3D f2); // this is true for fun_ptr, but would not be true if impl=
emented in terms of shared_ptr<function<F>></div><div><br>=
</div><div>I think that addresses a lot of your comments but I do have a fe=
w other below...</div><div><br></div><div><br></div><div>On Thursday, May 1=
4, 2015 at 11:33:13 AM UTC-5, Arthur O'Dwyer wrote:</div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; bor=
der-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-sty=
le: solid;">On Thu, May 14, 2015 at 7:23 AM, Michael Boyko <<a onmousedo=
wn=3D"this.href=3D'javascript:';return true;" onclick=3D"this.href=3D'javas=
cript:';return true;" href=3D"javascript:" target=3D"_blank" rel=3D"nofollo=
w" gdf-obfuscated-mailto=3D"B0EBMSIFBB0J">mboyk...@gmail.com</a>> wrote:
<br>> Arthur,
<br>>
<br>> Good examples that do need answers. fun_ptr answers these in a way
<br>> consistent with function pointer like semantics.
<br>
<br>You mean shared_ptr<function> semantics.
<br></blockquote><div><br></div><div>fun_ptr has shared_ptr<function>=
semantics just for function objects. fun_ptr can also target member functi=
ons and standalone functions. make_fun(&some_class::some_function, &=
;obj) or make_fun(&standalone_function) definitely cannot have shared_p=
tr<function> semantics - equality will not work. </div><div> </d=
iv><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; pa=
dding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: =
1px; border-left-style: solid;">
<br>[...]
<br>> In my paper I document that a smart function pointer is designed t=
o have
<br>> function pointer like semantics. Consider calling/invoking a regul=
ar old
<br>> standalone function pointer: it does not change the pointer's valu=
e and so
<br>> too calling operator() on fun_ptr should not change its value (and=
it
<br>> doesn't). I'd also make the argument that since operator() is a co=
nst member
<br>> function it should not change the types value (that is operator() =
is NOT a
<br>> salient operation).
<br>
<br>operator() is not always a const member function. To take a concrete ex=
ample:
<br></blockquote><div><br></div><blockquote class=3D"gmail_quote" style=3D"=
margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 2=
04, 204); border-left-width: 1px; border-left-style: solid;">
<br>> auto lam1 =3D [state=3D0]() mutable { return state++=
; };
<br>
<br>In the above example, the lambda type's operator() is not a const
<br>member function,
<br>and does modify the state of the lambda object.
<br></blockquote><div><br></div><div><div>I'm not referring to operator() i=
n the lambda. operator() in std::function is always const as well=
as in fun_ptr - that's what I was referring to. So yes operator() bei=
ng const in std::function is kind of lying. That's what N4159 points out.</=
div> </div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px =
0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border=
-left-width: 1px; border-left-style: solid;">
<br>> fun_ptr meets all three of these value type properties. Its hard t=
o imagine
<br>> how std::function could in general satisfy these 3 properties sinc=
e it
<br>> performs a deep copy of the contained function object.
<br>[...but then later you say...]
<br>> This is why we want fun_ptr to accept function objects by value. I=
ts akin to
<br>> assigning one function pointer to another. When a fun_ptr is creat=
ed it
<br>> copies the functor (and state if any)
<br>
<br>Does fun_ptr make a deep copy, or not? From your proposal it's pr=
etty
<br>clear that you *do* think of make_fun(f1) as making a deep copy of f1,
<br>in exactly the same way as make_shared<function<F>>(f1). Ho=
wever,
<br>whenever anyone brings this up, you switch to saying "oh no, there are
<br>no deep copies here."
<br></blockquote><div><br></div><div>For the case of functors only(!) fun_p=
tr does the following: Copy construction makes a copy of the lambda and cop=
y assignment does not make another copy of the lambda (its shared via a sha=
red_ptr). For member functions and standalone functions just copying of the=
target is performed. Equality works in all cases.</div><div> </div><b=
lockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding=
-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; =
border-left-style: solid;">
<br>
<br>> For function pointer like semantics we want the copy to behave exa=
ctly like
<br>> the original, right (property A above)? The following code should =
behave
<br>> exactly the same no matter the output from rand(). And for fun_ptr=
it does -
<br>> it calls the lambda 1000 times regardless of rand()'s output.
<br>>
<br>> auto f1 =3D make_fun([]() { /*...*/ });
<br>> auto f2 =3D f1; //copy constructor - shares target with d1.
<br>> for (int i =3D 0; i < 1000; ++i) {
<br>> assert(f1 =3D=3D f2); //true each time through the lo=
op
<br>> if (rand() % 2 =3D=3D 0) f1();
<br>> else f2();
<br>> }
<br>>
<br>> If the above example was replaced with regular old function pointe=
rs what is
<br>> the behavior we would want and expect? std::function does not beha=
ve like a
<br>> regular function pointer would, but fun_ptr does!
<br>
<br>shared_ptr<function<F>> behaves like (F*).
<br></blockquote><div><br></div><blockquote class=3D"gmail_quote" style=3D"=
margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 2=
04, 204); border-left-width: 1px; border-left-style: solid;">
<br>
<br>> Now let's consider your two examples with fun_ptr replacing std::f=
unction
<br>> and then compare and discuss...
<br>>
<br>> auto lam1 =3D [state=3D0]() mutable { return state++=
; };
<br>> std::fun_ptr<int(void)> f1 =3D lam1; lam1();
<br>> std::fun_ptr<int(void)> f2 =3D lam1;
<br>> return (f1 =3D=3D f2); // false, if fact calli=
ng lam1() or not does not
<br>> change this
<br>
<br>Yep, that corresponds with my interpretation of your proposal as well.
<br>The fun_ptr constructor (and make_fun) create deep copies of their
<br>argument, as if by make_shared<function<F>>(lam1)<wbr>.
<br>
<br>> auto lam1 =3D [state=3D0]() mutable { return state++=
; };
<br>> std::fun_ptr<int(void)> f1 =3D lam1;
<br>> std::fun_ptr<int(void)> f2 =3D f1;
<br>> assert(f1 =3D=3D f2); // true, f2 was just assigned =
f1 so it better be!
<br>> f1(); //operator() is const and this is not a salien=
t operation
<br>> assert(f1 =3D=3D f2); // true, and f1 and f2 do NOT =
have different behaviors
<br>> (std::function does have different behaveior)
<br>
<br>Yep, this corresponds with my interpretation of your proposal as well.
<br>fun_ptr<F>, being a synonym for shared_ptr<function<F>&g=
t;, has reference
<br>semantics with relation to the controlled object of type function<F&=
gt;.
<br>The controlled object is created via deep copy when
<br>make_shared/make_fun is called, but after that point, copying the
<br>shared_ptr simply creates a new pointer to the single copy.
<br>
<br>> Again calling f1() is const operation and not salient (doesn't cha=
nge its
<br>> target) and so the f1 has the same value after the call as it did =
before the
<br>> call.
<br>
<br>Calling f1() is not actually a const operation. In particular, after
<br>the assignment
<br>
<br> fun_ptr<int(void)> f1 =3D lam1;
<br>
<br>calling f1() will affect a different copy of the functor object than
<br>calling lam1() will =E2=80=94 f1 is in no sense a "pointer to" lam1.
<br>(Try it out and see!)
<br></blockquote><div><br></div><div>agreed. When a fun_ptr is constructed =
with a functor it does make a separate copy of the lambda and then manages =
it and shares when fun_ptr is copied. No two fun_ptr's constructed from lam=
bda's (even the same lambda) will ever be equal. However constructing =
two fun_ptrs from standalone functions will compare equal.</div><div>&=
nbsp;</div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0=
..8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left=
-width: 1px; border-left-style: solid;">
<br>
<br>> I will try to add some of these examples and explanations to my pr=
oposal - I
<br>> don't think I am marketing this very well...
<br>
<br>You're just not realizing that (1) shared_ptr and function already
<br>exist, and that (2) combining them gives you exactly the semantics
<br>you're looking for.
<br></blockquote><div><br></div><div>No. I pointed out why this is not the =
case: standalone and member functions. See above.</div><div> </div><bl=
ockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-=
left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; b=
order-left-style: solid;">
<br>I've attached a copy of "event.h" with delegate_type replaced with
<br>shared_ptr<function>, so you can see concretely what that looks l=
ike.
<br></blockquote><div><br></div><div>I've looked at it but as I explained a=
bove this cannot work for uses of standalone and member functions. It will =
work like fun_ptr for functors I think.</div><div> </div><blockquote c=
lass=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex;=
border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left=
-style: solid;">
<br>HTH,
<br>=E2=80=93Arthur
<br></blockquote></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_21_1532725210.1431624623234--
------=_Part_20_1943393319.1431624623234--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Thu, 14 May 2015 10:48:37 -0700 (PDT)
Raw View
------=_Part_250_2126244221.1431625717838
Content-Type: multipart/alternative;
boundary="----=_Part_251_1658736267.1431625717838"
------=_Part_251_1658736267.1431625717838
Content-Type: text/plain; charset=UTF-8
Let me also say that even if the target of functors was completely
removed so that fun_ptr only could target standalone and member functions
it would still be almost as useful. Please don't get hung up on the functor
target. Functors really are the 5% or less use case. The item to
concentrate on is equality operator works as excepted and has improved
syntax over combining std::function and std::bind.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_251_1658736267.1431625717838
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>Let me also say that even if the target of =
functors was completely removed so that fun_ptr only could target stan=
dalone and member functions it would still be almost as useful. Please don'=
t get hung up on the functor target. Functors really are the 5% or less&nbs=
p;use case. The item to concentrate on is equality operator works as except=
ed and has improved syntax over combining std::function and std::bind.</div=
></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_251_1658736267.1431625717838--
------=_Part_250_2126244221.1431625717838--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 14 May 2015 12:59:54 -0700 (PDT)
Raw View
------=_Part_27_1763138415.1431633594234
Content-Type: multipart/alternative;
boundary="----=_Part_28_2087979599.1431633594234"
------=_Part_28_2087979599.1431633594234
Content-Type: text/plain; charset=UTF-8
On Thursday, May 14, 2015 at 1:30:25 PM UTC-4, Michael Boyko wrote:
>
> I think you are missing that fun_ptr can handle standalone functions as
> well as member functions in addition to function objects. Consider this:
>
> auto f1 = make_fun(&standalone);
> auto f2 = make_fun(&standalone);
> assert(f1 == f2); // this is true for fun_ptr, but would not be true if
> implemented in terms of shared_ptr<function<F>>
>
> I think that addresses a lot of your comments but I do have a few other
> below...
>
I find this all somewhat confusing. You say that the principle problem that
func_ptr is intended to solve is the lack of an equality comparison. OK,
but then you say this:
agreed. When a fun_ptr is constructed with a functor it does make a
> separate copy of the lambda and then manages it and shares when fun_ptr is
> copied. No two fun_ptr's constructed from lambda's (even the same lambda)
> will ever be equal. However constructing two fun_ptrs from standalone
> functions will compare equal.
>
Which means that the only functional differences between std::function and
your proposed fun_ptr are:
1) Performs equality testing, but only if both were filled with a function
pointer or member function pointer. No effort to test equality is made for
any other callable type, even if they are technically equality comparable.
2) When storing functors, the object allocates memory, whose ownership is
shared among all copies of that fun_ptr.
There's no reason std::function couldn't be extended to handle #1. Boost
doesn't like this solution, since they'd prefer that two boost::function
objects that store different types to fail to compile if you test equality.
But the standard committee won't a priori reject such a proposal for that
reason.
The shared ownership of functors is, quite frankly, not something we need
an object to handle. It's *certainly* not something that should be tied
directly into comparison semantics. There's no reason why a user of
std::function should have to choose between value semantics and (limited)
operator== support.
In short, there's no reason why we need an object to represent the concept
of a shared_ptr that owns a std::function. We have std::function, which has
value semantics. We have shared_ptr, which has shared reference semantics.
Just combine them.
Just like we don't need a std::vector that has shared reference semantics,
rather than value semantics.
And there's an even better reason not to combine these concepts. You didn't
do it very well.
You have fun_ptr, which is meant to represent shared_ptr<function>. But it
doesn't; it's missing *tons* of stuff. Where's the weak_fun_ptr? What about
allocation/deleter support; even std::function has that (well, the
allocator part)?
In short, I'd be much better off using shared_ptr<function>, with a minor
enhancement to std::function.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_28_2087979599.1431633594234
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Thursday, May 14, 2015 at 1:30:25 PM UTC-4, Mic=
hael Boyko wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"l=
tr"><div>I think you are missing that fun_ptr can handle standalone functio=
ns as well as member functions in addition to function objects. Consider th=
is:</div><div><br></div><div>auto f1 =3D make_fun(&standalone);</div><d=
iv>auto f2 =3D make_fun(&standalone);</div><div>assert(f1 =3D=3D f2); /=
/ this is true for fun_ptr, but would not be true if implemented in te=
rms of shared_ptr<function<F>></div><div><br></div><div>I =
think that addresses a lot of your comments but I do have a few other below=
....</div></div></blockquote><div><br>I find this all somewhat confusing. Yo=
u say that the principle problem that func_ptr is intended to solve is the =
lack of an equality comparison. OK, but then you say this:<br><br><blockquo=
te style=3D"margin: 0px 0px 0px 0.8ex; border-left: 1px solid rgb(204, 204,=
204); padding-left: 1ex;" class=3D"gmail_quote"><div>agreed. When a fun_pt=
r is constructed with a functor it does make a
separate copy of the lambda and then manages it and shares when fun_ptr
is copied. No two fun_ptr's constructed from lambda's (even the same=20
lambda) will ever be equal. However constructing two fun_ptrs fro=
m=20
standalone functions will compare equal.</div></blockquote><br>Which means =
that the only functional differences between std::function and your propose=
d fun_ptr are:<br><br>1) Performs equality testing, but only if both were f=
illed with a function pointer or member function pointer. No effort to test=
equality is made for any other callable type, even if they are technically=
equality comparable.<br><br>2) When storing functors, the object allocates=
memory, whose ownership is shared among all copies of that fun_ptr.<br><br=
>There's no reason std::function couldn't be extended to handle #1. Boost d=
oesn't like this solution, since they'd prefer that two boost::function obj=
ects that store different types to fail to compile if you test equality. Bu=
t the standard committee won't a priori reject such a proposal for that rea=
son.<br><br>The shared ownership of functors is, quite frankly, not somethi=
ng we need an object to handle. It's <i>certainly</i> not something that sh=
ould be tied directly into comparison semantics. There's no reason why a us=
er of std::function should have to choose between value semantics and (limi=
ted) operator=3D=3D support.<br><br>In short, there's no reason why we need=
an object to represent the concept of a shared_ptr that owns a std::functi=
on. We have std::function, which has value semantics. We have shared_ptr, w=
hich has shared reference semantics. Just combine them.<br><br>Just like we=
don't need a std::vector that has shared reference semantics, rather than =
value semantics.<br><br>And there's an even better reason not to combine th=
ese concepts. You didn't do it very well.<br><br>You have fun_ptr, which is=
meant to represent shared_ptr<function>. But it doesn't; it's missin=
g <i>tons</i> of stuff. Where's the weak_fun_ptr? What about allocation/del=
eter support; even std::function has that (well, the allocator part)?<br><b=
r>In short, I'd be much better off using shared_ptr<function>, with a=
minor enhancement to std::function.</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_28_2087979599.1431633594234--
------=_Part_27_1763138415.1431633594234--
.
Author: Nevin Liber <nevin@eviloverlord.com>
Date: Thu, 14 May 2015 15:16:34 -0500
Raw View
--001a11349500e191860516106932
Content-Type: text/plain; charset=UTF-8
On 14 May 2015 at 14:59, Nicol Bolas <jmckesson@gmail.com> wrote:
> 1) Performs equality testing, but only if both were filled with a function
> pointer or member function pointer. No effort to test equality is made for
> any other callable type, even if they are technically equality comparable.
>
> There's no reason std::function couldn't be extended to handle #1. Boost
> doesn't like this solution, since they'd prefer that two boost::function
> objects that store different types to fail to compile if you test equality.
> But the standard committee won't a priori reject such a proposal for that
> reason.
>
Any such proposal would have to answer the hairy question on what equality
comparison should do (return, exception, etc.) if two std::function objects
hold other callable types. While you can extend such functionality to any
homogeneous comparison (compare std::function objects if they hold the same
type; otherwise return false), you still have to decide what to do if the
types being held are not comparable.
--
Nevin ":-)" Liber <mailto:nevin@eviloverlord.com> (847) 691-1404
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--001a11349500e191860516106932
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div class=3D"gmail_extra">On 14 May 2015 at 14:59, Nicol =
Bolas <span dir=3D"ltr"><<a href=3D"mailto:jmckesson@gmail.com" target=
=3D"_blank">jmckesson@gmail.com</a>></span> wrote:<br><div class=3D"gmai=
l_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;borde=
r-left:1px #ccc solid;padding-left:1ex"><div>1) Performs equality testing, =
but only if both were filled with a function pointer or member function poi=
nter. No effort to test equality is made for any other callable type, even =
if they are technically equality comparable.<br><br>There's no reason s=
td::function couldn't be extended to handle #1. Boost doesn't like =
this solution, since they'd prefer that two boost::function objects tha=
t store different types to fail to compile if you test equality. But the st=
andard committee won't a priori reject such a proposal for that reason.=
<br></div></blockquote></div><br>Any such proposal would have to answer the=
hairy question on what equality comparison should do (return, exception, e=
tc.) if two std::function objects hold other callable types.=C2=A0 While yo=
u can extend such functionality to any homogeneous comparison (compare std:=
:function objects if they hold the same type; otherwise return false), you =
still have to decide what to do if the types being held are not comparable.=
<br>-- <br><div class=3D"gmail_signature">=C2=A0Nevin ":-)" Liber=
=C2=A0 <mailto:<a href=3D"mailto:nevin@eviloverlord.com" target=3D"_blan=
k">nevin@eviloverlord.com</a>>=C2=A0 (847) 691-1404</div>
</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--001a11349500e191860516106932--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Thu, 14 May 2015 13:49:04 -0700 (PDT)
Raw View
------=_Part_8_1473146055.1431636544241
Content-Type: multipart/alternative;
boundary="----=_Part_9_826780122.1431636544241"
------=_Part_9_826780122.1431636544241
Content-Type: text/plain; charset=UTF-8
I find your comments constructive. I think I may have made a mistake of
allowing functors as a target of fun_ptr. That feature does have a few
quirks and probably limited uses. But here are some examples that might
help you understand my decisions.
Class Foo {
public:
Foo(int state) {/*...*/}
void bar() {/*...*/}
}
int state = 0;
Foo foo1(state);
Foo foo2(state);
fun_ptr<void()> fp1(&Foo::bar, &foo1);
fun_ptr<void()> fp2(&Foo::bar, &foo2);
compare = (fp1 == fp2);
compare should be false because fp1 and fp2 point to different instances of
Foo. This is the correct pointer like semantics we want.
Now consider this:
auto foo = [=]() {/*...*/};
fun_ptr<void()> fp1(foo);
fun_ptr<void()> fp2(foo);
compare = (fp1 == fp2);
What should compare be now? I chose false because functors are pass by
value which results is two separate instances of the lambda. This is
basically the same as the first example, right? So why should comparing
fun_ptr's with functor targets not consider which instance it points to? I
considered passing functors by reference but this would be an anti-pattern
and lead to lifetime issues when functors are often temporary objects.
Removing functor targets might be better than deciding to make a copy and
managing it. Or possibly only allowing non-capturing lambda's that can
convert to a function pointer and then handle them the same as standalone
functions.
On Thursday, May 14, 2015 at 2:59:54 PM UTC-5, Nicol Bolas wrote:
>
>
> On Thursday, May 14, 2015 at 1:30:25 PM UTC-4, Michael Boyko wrote:
>>
>> I think you are missing that fun_ptr can handle standalone functions as
>> well as member functions in addition to function objects. Consider this:
>>
>> auto f1 = make_fun(&standalone);
>> auto f2 = make_fun(&standalone);
>> assert(f1 == f2); // this is true for fun_ptr, but would not be true if
>> implemented in terms of shared_ptr<function<F>>
>>
>> I think that addresses a lot of your comments but I do have a few other
>> below...
>>
>
> I find this all somewhat confusing. You say that the principle problem
> that func_ptr is intended to solve is the lack of an equality comparison.
> OK, but then you say this:
>
> agreed. When a fun_ptr is constructed with a functor it does make a
>> separate copy of the lambda and then manages it and shares when fun_ptr is
>> copied. No two fun_ptr's constructed from lambda's (even the same lambda)
>> will ever be equal. However constructing two fun_ptrs from standalone
>> functions will compare equal.
>>
>
> Which means that the only functional differences between std::function and
> your proposed fun_ptr are:
>
> 1) Performs equality testing, but only if both were filled with a function
> pointer or member function pointer. No effort to test equality is made for
> any other callable type, even if they are technically equality comparable.
>
> 2) When storing functors, the object allocates memory, whose ownership is
> shared among all copies of that fun_ptr.
>
> There's no reason std::function couldn't be extended to handle #1. Boost
> doesn't like this solution, since they'd prefer that two boost::function
> objects that store different types to fail to compile if you test equality.
> But the standard committee won't a priori reject such a proposal for that
> reason.
>
> The shared ownership of functors is, quite frankly, not something we need
> an object to handle. It's *certainly* not something that should be tied
> directly into comparison semantics. There's no reason why a user of
> std::function should have to choose between value semantics and (limited)
> operator== support.
>
> In short, there's no reason why we need an object to represent the concept
> of a shared_ptr that owns a std::function. We have std::function, which has
> value semantics. We have shared_ptr, which has shared reference semantics.
> Just combine them.
>
> Just like we don't need a std::vector that has shared reference semantics,
> rather than value semantics.
>
> And there's an even better reason not to combine these concepts. You
> didn't do it very well.
>
> You have fun_ptr, which is meant to represent shared_ptr<function>. But it
> doesn't; it's missing *tons* of stuff. Where's the weak_fun_ptr? What
> about allocation/deleter support; even std::function has that (well, the
> allocator part)?
>
> In short, I'd be much better off using shared_ptr<function>, with a minor
> enhancement to std::function.
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_9_826780122.1431636544241
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>I find your comments constructive. I think I may=
have made a mistake of allowing functors as a target of fun_ptr. That feat=
ure does have a few quirks and probably limited uses. But here are some exa=
mples that might help you understand my decisions.</div><div><br></div=
><div class=3D"prettyprint" style=3D"border: 1px solid rgb(187, 187, 187); =
border-image: none; -ms-word-wrap: break-word; background-color: rgb(250, 2=
50, 250);"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span =
class=3D"styled-by-prettify" style=3D"color: rgb(102, 0, 102);">Class</span=
><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span>=
<span class=3D"styled-by-prettify" style=3D"color: rgb(102, 0, 102);">Foo</=
span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </s=
pan><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">{=
</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><b=
r> </span><span class=3D"styled-by-prettify" style=3D"color: rg=
b(0, 0, 136);">public</span><span class=3D"styled-by-prettify" style=3D"col=
or: rgb(102, 102, 0);">:</span><span class=3D"styled-by-prettify" style=3D"=
color: rgb(0, 0, 0);"><br> </span><span class=3D"styled=
-by-prettify" style=3D"color: rgb(102, 0, 102);">Foo</span><span class=3D"s=
tyled-by-prettify" style=3D"color: rgb(102, 102, 0);">(</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">int</span><span cl=
ass=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> state</span><spa=
n class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">)</span><=
span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><s=
pan class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">{</span=
><span class=3D"styled-by-prettify" style=3D"color: rgb(136, 0, 0);">/*...*=
/</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0)=
;">}</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);=
"><br> </span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 0, 136);">void</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: rgb(0, 0, 0);"> bar</span><span class=3D"styled-by-prettify"=
style=3D"color: rgb(102, 102, 0);">()</span><span class=3D"styled-by-prett=
ify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-pretti=
fy" style=3D"color: rgb(102, 102, 0);">{</span><span class=3D"styled-by-pre=
ttify" style=3D"color: rgb(136, 0, 0);">/*...*/</span><span class=3D"styled=
-by-prettify" style=3D"color: rgb(102, 102, 0);">}</span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(0, 0, 0);"><br></span><span class=3D"s=
tyled-by-prettify" style=3D"color: rgb(102, 102, 0);">}</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br><br></span><span=
class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">int</span><s=
pan class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> state </sp=
an><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">=
=3D</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"=
> </span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 102, 102=
);">0</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102=
, 0);">;</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0,=
0);"><br></span><span class=3D"styled-by-prettify" style=3D"color: rgb(102=
, 0, 102);">Foo</span><span class=3D"styled-by-prettify" style=3D"color: rg=
b(0, 0, 0);"> foo1</span><span class=3D"styled-by-prettify" style=3D"color:=
rgb(102, 102, 0);">(</span><span class=3D"styled-by-prettify" style=3D"col=
or: rgb(0, 0, 0);">state</span><span class=3D"styled-by-prettify" style=3D"=
color: rgb(102, 102, 0);">);</span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 0, 0);"><br></span><span class=3D"styled-by-prettify" sty=
le=3D"color: rgb(102, 0, 102);">Foo</span><span class=3D"styled-by-prettify=
" style=3D"color: rgb(0, 0, 0);"> foo2</span><span class=3D"styled-by-prett=
ify" style=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(0, 0, 0);">state</span><span class=3D"styled-by=
-prettify" style=3D"color: rgb(102, 102, 0);">);</span><span class=3D"style=
d-by-prettify" style=3D"color: rgb(0, 0, 0);"><br>fun_ptr</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);"><</span><span=
class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">void</span><=
span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">()>=
</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> f=
p1</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0=
);">(&</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102=
, 0, 102);">Foo</span><span class=3D"styled-by-prettify" style=3D"color: rg=
b(102, 102, 0);">::</span><span class=3D"styled-by-prettify" style=3D"color=
: rgb(0, 0, 0);">bar</span><span class=3D"styled-by-prettify" style=3D"colo=
r: rgb(102, 102, 0);">,</span><span class=3D"styled-by-prettify" style=3D"c=
olor: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify" style=3D"co=
lor: rgb(102, 102, 0);">&</span><span class=3D"styled-by-prettify" styl=
e=3D"color: rgb(0, 0, 0);">foo1</span><span class=3D"styled-by-prettify" st=
yle=3D"color: rgb(102, 102, 0);">);</span><span class=3D"styled-by-prettify=
" style=3D"color: rgb(0, 0, 0);"><br>fun_ptr</span><span class=3D"styled-by=
-prettify" style=3D"color: rgb(102, 102, 0);"><</span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(0, 0, 136);">void</span><span class=3D=
"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">()></span><span =
class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> fp2</span><spa=
n class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">(&</s=
pan><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 0, 102);">F=
oo</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0=
);">::</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0=
);">bar</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 1=
02, 0);">,</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, =
0, 0);"> </span><span class=3D"styled-by-prettify" style=3D"color: rgb(102,=
102, 0);">&</span><span class=3D"styled-by-prettify" style=3D"color: r=
gb(0, 0, 0);">foo2</span><span class=3D"styled-by-prettify" style=3D"color:=
rgb(102, 102, 0);">);</span><span class=3D"styled-by-prettify" style=3D"co=
lor: rgb(0, 0, 0);"><br>compare </span><span class=3D"styled-by-prettify" s=
tyle=3D"color: rgb(102, 102, 0);">=3D</span><span class=3D"styled-by-pretti=
fy" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettif=
y" style=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-by-pret=
tify" style=3D"color: rgb(0, 0, 0);">fp1 </span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(102, 102, 0);">=3D=3D</span><span class=3D"styl=
ed-by-prettify" style=3D"color: rgb(0, 0, 0);"> fp2</span><span class=3D"st=
yled-by-prettify" style=3D"color: rgb(102, 102, 0);">);</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br></span></div></c=
ode></div><div><br></div><div>compare should be false because fp1 and fp2 p=
oint to different instances of Foo. This is the correct pointer like s=
emantics we want. </div><div><br></div><div>Now consider this:</div><div><b=
r></div><div class=3D"prettyprint" style=3D"border: 1px solid rgb(187, 187,=
187); border-image: none; -ms-word-wrap: break-word; background-color: rgb=
(250, 250, 250);"><code class=3D"prettyprint"><div class=3D"subprettyprint"=
><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">auto</=
span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> foo=
</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0)=
;">=3D</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0=
);"> </span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102=
, 0);">[=3D]()</span><span class=3D"styled-by-prettify" style=3D"color: rgb=
(0, 0, 0);"> </span><span class=3D"styled-by-prettify" style=3D"color: rgb(=
102, 102, 0);">{</span><span class=3D"styled-by-prettify" style=3D"color: r=
gb(136, 0, 0);">/*...*/</span><span class=3D"styled-by-prettify" style=3D"c=
olor: rgb(102, 102, 0);">};</span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 0, 0);"><br>fun_ptr</span><span class=3D"styled-by-pretti=
fy" style=3D"color: rgb(102, 102, 0);"><</span><span class=3D"styled-by-=
prettify" style=3D"color: rgb(0, 0, 136);">void</span><span class=3D"styled=
-by-prettify" style=3D"color: rgb(102, 102, 0);">()></span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> fp1</span><span cla=
ss=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">(</span><span =
class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);">foo</span><span=
class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">);</span><=
span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br>fun_pt=
r</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0)=
;"><</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, =
136);">void</span><span class=3D"styled-by-prettify" style=3D"color: rgb(10=
2, 102, 0);">()></span><span class=3D"styled-by-prettify" style=3D"color=
: rgb(0, 0, 0);"> fp2</span><span class=3D"styled-by-prettify" style=3D"col=
or: rgb(102, 102, 0);">(</span><span class=3D"styled-by-prettify" style=3D"=
color: rgb(0, 0, 0);">foo</span><span class=3D"styled-by-prettify" style=3D=
"color: rgb(102, 102, 0);">);</span><span class=3D"styled-by-prettify" styl=
e=3D"color: rgb(0, 0, 0);"><br>compare </span><span class=3D"styled-by-pret=
tify" style=3D"color: rgb(102, 102, 0);">=3D</span><span class=3D"styled-by=
-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-=
prettify" style=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-=
by-prettify" style=3D"color: rgb(0, 0, 0);">fp1 </span><span class=3D"style=
d-by-prettify" style=3D"color: rgb(102, 102, 0);">=3D=3D</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> fp2</span><span cla=
ss=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">);</span></div=
></code></div><div><font color=3D"#666600"><font color=3D"#222222"><br></fo=
nt></font></div><div><font color=3D"#666600"><font color=3D"#222222">What s=
hould compare be now? I chose false because functors are pass by value whic=
h results is two separate instances of the lambda. This is basically the sa=
me as the first example, right? So why should comparing fun_ptr's with func=
tor targets not consider which instance it points to? I considere=
d passing functors by reference but this would be an anti-pattern=
and lead to lifetime issues when functors are often temporary objects. Rem=
oving functor targets might be better than deciding to make a copy and mana=
ging it. Or possibly only allowing non-capturing lambda's that can convert =
to a function pointer and then handle them the same as standalone functions=
..</font></font></div><span class=3D"styled-by-prettify" style=3D"color: rgb=
(102, 102, 0);"><div><br></div></span><p><br>On Thursday, May 14, 2015 at 2=
:59:54 PM UTC-5, Nicol Bolas wrote:</p><blockquote class=3D"gmail_quote" st=
yle=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb=
(204, 204, 204); border-left-width: 1px; border-left-style: solid;"><div di=
r=3D"ltr"><br><br>On Thursday, May 14, 2015 at 1:30:25 PM UTC-4, Michael Bo=
yko wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.=
8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-=
width: 1px; border-left-style: solid;"><div dir=3D"ltr"><div>I think you ar=
e missing that fun_ptr can handle standalone functions as well as member fu=
nctions in addition to function objects. Consider this:</div><div><br></div=
><div>auto f1 =3D make_fun(&standalone);</div><div>auto f2 =3D make_fun=
(&standalone);</div><div>assert(f1 =3D=3D f2); // this is true for fun_=
ptr, but would not be true if implemented in terms of shared_ptr&=
lt;function<F>></div><div><br></div><div>I think that addresses a =
lot of your comments but I do have a few other below...</div></div></blockq=
uote><div><br>I find this all somewhat confusing. You say that the principl=
e problem that func_ptr is intended to solve is the lack of an equality com=
parison. OK, but then you say this:<br><br><blockquote class=3D"gmail_quote=
" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color:=
rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;"><di=
v>agreed. When a fun_ptr is constructed with a functor it does make a
separate copy of the lambda and then manages it and shares when fun_ptr
is copied. No two fun_ptr's constructed from lambda's (even the same=20
lambda) will ever be equal. However constructing two fun_ptrs fro=
m=20
standalone functions will compare equal.</div></blockquote><br>Which means =
that the only functional differences between std::function and your propose=
d fun_ptr are:<br><br>1) Performs equality testing, but only if both were f=
illed with a function pointer or member function pointer. No effort to test=
equality is made for any other callable type, even if they are technically=
equality comparable.<br><br>2) When storing functors, the object allocates=
memory, whose ownership is shared among all copies of that fun_ptr.<br><br=
>There's no reason std::function couldn't be extended to handle #1. Boost d=
oesn't like this solution, since they'd prefer that two boost::function obj=
ects that store different types to fail to compile if you test equality. Bu=
t the standard committee won't a priori reject such a proposal for that rea=
son.<br><br>The shared ownership of functors is, quite frankly, not somethi=
ng we need an object to handle. It's <i>certainly</i> not something that sh=
ould be tied directly into comparison semantics. There's no reason why a us=
er of std::function should have to choose between value semantics and (limi=
ted) operator=3D=3D support.<br><br>In short, there's no reason why we need=
an object to represent the concept of a shared_ptr that owns a std::functi=
on. We have std::function, which has value semantics. We have shared_ptr, w=
hich has shared reference semantics. Just combine them.<br><br>Just like we=
don't need a std::vector that has shared reference semantics, rather than =
value semantics.<br><br>And there's an even better reason not to combine th=
ese concepts. You didn't do it very well.<br><br>You have fun_ptr, which is=
meant to represent shared_ptr<function>. But it doesn't; it's missin=
g <i>tons</i> of stuff. Where's the weak_fun_ptr? What about allocation/del=
eter support; even std::function has that (well, the allocator part)?<br><b=
r>In short, I'd be much better off using shared_ptr<function>, with a=
minor enhancement to std::function.</div></div></blockquote></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_9_826780122.1431636544241--
------=_Part_8_1473146055.1431636544241--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Thu, 14 May 2015 13:52:39 -0700 (PDT)
Raw View
------=_Part_6_474003429.1431636759719
Content-Type: multipart/alternative;
boundary="----=_Part_7_1558784480.1431636759719"
------=_Part_7_1558784480.1431636759719
Content-Type: text/plain; charset=UTF-8
On Thursday, May 14, 2015 at 3:17:18 PM UTC-5, Nevin ":-)" Liber wrote:
>
> On 14 May 2015 at 14:59, Nicol Bolas <jmck...@gmail.com <javascript:>>
> wrote:
>
>> 1) Performs equality testing, but only if both were filled with a
>> function pointer or member function pointer. No effort to test equality is
>> made for any other callable type, even if they are technically equality
>> comparable.
>>
>> There's no reason std::function couldn't be extended to handle #1. Boost
>> doesn't like this solution, since they'd prefer that two boost::function
>> objects that store different types to fail to compile if you test equality.
>> But the standard committee won't a priori reject such a proposal for that
>> reason.
>>
>
> Any such proposal would have to answer the hairy question on what equality
> comparison should do (return, exception, etc.) if two std::function objects
> hold other callable types. While you can extend such functionality to any
> homogeneous comparison (compare std::function objects if they hold the same
> type; otherwise return false), you still have to decide what to do if the
> types being held are not comparable.
>
This is why boost decided not to implement equality comparison - They did
not want a run time failure and can't do it at compile time.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_7_1558784480.1431636759719
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Thursday, May 14, 2015 at 3:17:18 PM UTC-5, Nev=
in ":-)" Liber wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px=
0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); b=
order-left-width: 1px; border-left-style: solid;"><div dir=3D"ltr"><div>On =
14 May 2015 at 14:59, Nicol Bolas <span dir=3D"ltr"><<a onmousedown=3D"t=
his.href=3D'javascript:';return true;" onclick=3D"this.href=3D'javascript:'=
;return true;" href=3D"javascript:" target=3D"_blank" rel=3D"nofollow" gdf-=
obfuscated-mailto=3D"TTB3HsDs6rEJ">jmck...@gmail.com</a>></span> wrote:<=
br><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"ma=
rgin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204=
, 204); border-left-width: 1px; border-left-style: solid;"><div>1) Performs=
equality testing, but only if both were filled with a function pointer or =
member function pointer. No effort to test equality is made for any other c=
allable type, even if they are technically equality comparable.<br><br>Ther=
e's no reason std::function couldn't be extended to handle #1. Boost doesn'=
t like this solution, since they'd prefer that two boost::function objects =
that store different types to fail to compile if you test equality. But the=
standard committee won't a priori reject such a proposal for that reason.<=
br></div></blockquote></div><br>Any such proposal would have to answer the =
hairy question on what equality comparison should do (return, exception, et=
c.) if two std::function objects hold other callable types. While you=
can extend such functionality to any homogeneous comparison (compare std::=
function objects if they hold the same type; otherwise return false), you s=
till have to decide what to do if the types being held are not comparable.<=
/div></div></blockquote><div><br></div><div>This is why boost decided not t=
o implement equality comparison - They did not want a run time fa=
ilure and can't do it at compile time.</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_7_1558784480.1431636759719--
------=_Part_6_474003429.1431636759719--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 14 May 2015 14:05:46 -0700 (PDT)
Raw View
------=_Part_43_842675825.1431637546656
Content-Type: multipart/alternative;
boundary="----=_Part_44_197938810.1431637546656"
------=_Part_44_197938810.1431637546656
Content-Type: text/plain; charset=UTF-8
I guess the fundamental issue I have with comparing arbitrary function
objects of this type is the answer to this question:
What exactly are the use cases where you're asking two function objects if
they're the same?
We're talking about opaque callables here. You have two functions, who's
implementations could come from anything. So what is the point of testing
if one is equal to another? What are you trying to achieve by doing so.
I have never been in a situation where I had some need to know if one
std::function I had received was equivalent by some measure to another.
Your proposal also doesn't seem to explain the need for such a feature. It
simply declares, "Equality comparison is a fundamental operation a smart
function pointer needs to support," as though it were an undeniable fact
that people obviously have need to compare two arbitrary callables.
When you said "Equality comparison is the key feature...", you go on to
show an example of its use. But this doesn't explain the *need* for it.
The closest your proposal gets is an example of an event handling
interface. The function you pass in to attach it to the container is also
used as the handle to unregistering the function. But personally, I prefer
to use a handle returned from the registration function. That way, I can
keep around a small handle object rather than this big, bulky
std::function. It also makes the interface more clear, if you're allowed to
do things like swap which function is registered, or add other attributes
to a specific registration (like a priority or whatever).
So why do you need to compare two arbitrary callables that have been given
to your piece of code?
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_44_197938810.1431637546656
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">I guess the fundamental issue I have with comparing arbitr=
ary function objects of this type is the answer to this question:<br><br>Wh=
at exactly are the use cases where you're asking two function objects if th=
ey're the same?<br><br>We're talking about opaque callables here. You have =
two functions, who's implementations could come from anything. So what is t=
he point of testing if one is equal to another? What are you trying to achi=
eve by doing so.<br><br>I have never been in a situation where I had some n=
eed to know if one std::function I had received was equivalent by some meas=
ure to another. Your proposal also doesn't seem to explain the need for suc=
h a feature. It simply declares, "Equality comparison is a fundamental oper=
ation a smart function pointer needs to support," as though it were an unde=
niable fact that people obviously have need to compare two arbitrary callab=
les.<br><br>When you said "Equality comparison is the key feature...", you =
go on to show an example of its use. But this doesn't explain the <i>need</=
i> for it.<br><br>The closest your proposal gets is an example of an event =
handling interface. The function you pass in to attach it to the container =
is also used as the handle to unregistering the function. But personally, I=
prefer to use a handle returned from the registration function. That way, =
I can keep around a small handle object rather than this big, bulky std::fu=
nction. It also makes the interface more clear, if you're allowed to do thi=
ngs like swap which function is registered, or add other attributes to a sp=
ecific registration (like a priority or whatever).<br><br>So why do you nee=
d to compare two arbitrary callables that have been given to your piece of =
code?<br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_44_197938810.1431637546656--
------=_Part_43_842675825.1431637546656--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Thu, 14 May 2015 14:22:58 -0700 (PDT)
Raw View
------=_Part_10_1747197703.1431638578594
Content-Type: multipart/alternative;
boundary="----=_Part_11_460405243.1431638578594"
------=_Part_11_460405243.1431638578594
Content-Type: text/plain; charset=UTF-8
Herb Sutter a while back wrote a article called Generalizing Observer
<http://www.drdobbs.com/cpp/generalizing-observer/184403873?pgno=1>. Under
this article is a section called "An Important Limitation of function".
Sutter says at one point "This lack of comparison operations is one
limitation of function, and it is significant." In fact he suggested
equality comparison for std::function in this article. Comparison of
callback functions is a common operation that is quite pervasive in code.
Yes, there are work-arounds to not having direct comparison support and
RAII handles are nice. We could remove function pointer comparison for
standalone and member functions and people would survive but they are
useful tools. C# has delegates and events which have proved extremely
useful.
On Thursday, May 14, 2015 at 4:05:46 PM UTC-5, Nicol Bolas wrote:
>
> I guess the fundamental issue I have with comparing arbitrary function
> objects of this type is the answer to this question:
>
> What exactly are the use cases where you're asking two function objects if
> they're the same?
>
> We're talking about opaque callables here. You have two functions, who's
> implementations could come from anything. So what is the point of testing
> if one is equal to another? What are you trying to achieve by doing so.
>
> I have never been in a situation where I had some need to know if one
> std::function I had received was equivalent by some measure to another.
> Your proposal also doesn't seem to explain the need for such a feature. It
> simply declares, "Equality comparison is a fundamental operation a smart
> function pointer needs to support," as though it were an undeniable fact
> that people obviously have need to compare two arbitrary callables.
>
> When you said "Equality comparison is the key feature...", you go on to
> show an example of its use. But this doesn't explain the *need* for it.
>
> The closest your proposal gets is an example of an event handling
> interface. The function you pass in to attach it to the container is also
> used as the handle to unregistering the function. But personally, I prefer
> to use a handle returned from the registration function. That way, I can
> keep around a small handle object rather than this big, bulky
> std::function. It also makes the interface more clear, if you're allowed to
> do things like swap which function is registered, or add other attributes
> to a specific registration (like a priority or whatever).
>
> So why do you need to compare two arbitrary callables that have been given
> to your piece of code?
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_11_460405243.1431638578594
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Herb Sutter a while back wrote a article called <a href=3D=
"http://www.drdobbs.com/cpp/generalizing-observer/184403873?pgno=3D1">Gener=
alizing Observer</a>. Under this article is a section called "An Important =
Limitation of function". Sutter says at one point "This lack of comparison =
operations is one limitation of function, and it is significant." In fact h=
e suggested equality comparison for std::function in this article. Comparis=
on of callback functions is a common operation that is quite pervasive in c=
ode. Yes, there are work-arounds to not having direct comparison support an=
d RAII handles are nice. We could remove function pointer comparison for st=
andalone and member functions and people would survive but they are useful =
tools. C# has delegates and events which have proved extremely useful.<br><=
br>On Thursday, May 14, 2015 at 4:05:46 PM UTC-5, Nicol Bolas wrote:<blockq=
uote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left=
: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; borde=
r-left-style: solid;"><div dir=3D"ltr">I guess the fundamental issue I have=
with comparing arbitrary function objects of this type is the answer to th=
is question:<br><br>What exactly are the use cases where you're asking two =
function objects if they're the same?<br><br>We're talking about opaque cal=
lables here. You have two functions, who's implementations could come from =
anything. So what is the point of testing if one is equal to another? What =
are you trying to achieve by doing so.<br><br>I have never been in a situat=
ion where I had some need to know if one std::function I had received was e=
quivalent by some measure to another. Your proposal also doesn't seem to ex=
plain the need for such a feature. It simply declares, "Equality comparison=
is a fundamental operation a smart function pointer needs to support," as =
though it were an undeniable fact that people obviously have need to compar=
e two arbitrary callables.<br><br>When you said "Equality comparison is the=
key feature...", you go on to show an example of its use. But this doesn't=
explain the <i>need</i> for it.<br><br>The closest your proposal gets is a=
n example of an event handling interface. The function you pass in to attac=
h it to the container is also used as the handle to unregistering the funct=
ion. But personally, I prefer to use a handle returned from the registratio=
n function. That way, I can keep around a small handle object rather than t=
his big, bulky std::function. It also makes the interface more clear, if yo=
u're allowed to do things like swap which function is registered, or add ot=
her attributes to a specific registration (like a priority or whatever).<br=
><br>So why do you need to compare two arbitrary callables that have been g=
iven to your piece of code?<br></div></blockquote></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_11_460405243.1431638578594--
------=_Part_10_1747197703.1431638578594--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 14 May 2015 15:39:39 -0700 (PDT)
Raw View
------=_Part_83_25262283.1431643179788
Content-Type: multipart/alternative;
boundary="----=_Part_84_1528911922.1431643179788"
------=_Part_84_1528911922.1431643179788
Content-Type: text/plain; charset=UTF-8
On Thursday, May 14, 2015 at 5:22:58 PM UTC-4, Michael Boyko wrote:
>
> Herb Sutter a while back wrote a article called Generalizing Observer
> <http://www.drdobbs.com/cpp/generalizing-observer/184403873?pgno=1>.
> Under this article is a section called "An Important Limitation of
> function". Sutter says at one point "This lack of comparison operations is
> one limitation of function, and it is significant." In fact he suggested
> equality comparison for std::function in this article. Comparison of
> callback functions is a common operation that is quite pervasive in code.
>
If it's such a "common operation" that is "quite pervasive", then surely
you can do better than repeat the same example. Or at the very least, you
could find an example where the lack of such comparison isn't easily
handled. And even moreso, handled in a way that ultimately makes for a
better *C++* interface.
Here's what I mean. In C#, functions are... functions. They're references
to existing code. They *cannot* have state. So equality is very simple.
In C++, any "polymorphic function" interface ought to be able to handle
functors. Function objects are extremely commonly used in a variety of C++
programming styles; indeed, this is why std::function is specifically
designed to permit their use.
Yet, equality comparison between functors can only make sense if the two
types are equal or if they have an operator== implementation between them.
That instantly rules out lambdas, since you can't make operator==
implementations for them.
Let's take your own example, with one minor modification:
auto foo = []() {/*...*/}; //Notice something missing.
fun_ptr<void()> fp1(foo);
fun_ptr<void()> fp2(foo);
compare = (fp1 == fp2);
There is no reason for these two functors to be considered different in any
way. In fact, I didn't even have to remove the "=" capture; I could have
simply stated that it didn't happen to capture anything from the enclosing
scope.
Most users would expect to be able to do this:
event.register(fp1);
event.unregister(fp2);
That code would have worked just fine if these were actual function
pointers. But because the user just so happened to store a lambda instead
of a function pointer, the semantics change.
From a user perspective, that is surprising. And that's a very bad thing to
surprise a user with.
If equality comparison between functions is as critical as you claim, then
you shouldn't do it half-way. You can't say that it's important for
function pointers, but that you can arbitrarily declare all functors to be
unequal. That's simply not a workable solution.
Plus, there's the fact that C++ functors often have state. And in some
cases, the functor is the sole owner of that state. So... why should the
user have to keep a heavyweight object around, or even a "smart pointer"
reference to one? The user isn't going to call that functor anymore;
they're only keeping it around to use as a handle. The user should be able
to move a std::functor into the event object, with the event being the sole
owner of it.
That's why the Boost.Signal approach is superior for C++; you don't have to
answer the question of whether different callable values are equal or not.
You simply return a handle that is used to represent the attached callable.
If the user happens to register the "same function" (by some definition)
twice, then it should be assumed that this is what the user intended to do
(which can be reasonable in some cases).
C++ is not C#, and therefore is going to have to do things differently.
What matters is that you can do the same things, not that the interfaces
are 100% identical.
And thus far, you have not proven that equality comparison is an essential
feature for polymorphic functions.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_84_1528911922.1431643179788
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Thursday, May 14, 2015 at 5:22:58 PM UTC-4, Mic=
hael Boyko wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"l=
tr">Herb Sutter a while back wrote a article called <a href=3D"http://www.d=
rdobbs.com/cpp/generalizing-observer/184403873?pgno=3D1" target=3D"_blank" =
rel=3D"nofollow" onmousedown=3D"this.href=3D'http://www.google.com/url?q\75=
http%3A%2F%2Fwww.drdobbs.com%2Fcpp%2Fgeneralizing-observer%2F184403873%3Fpg=
no%3D1\46sa\75D\46sntz\0751\46usg\75AFQjCNGBPRr50r9TI7o5gdOw_rIDj1hBMg';ret=
urn true;" onclick=3D"this.href=3D'http://www.google.com/url?q\75http%3A%2F=
%2Fwww.drdobbs.com%2Fcpp%2Fgeneralizing-observer%2F184403873%3Fpgno%3D1\46s=
a\75D\46sntz\0751\46usg\75AFQjCNGBPRr50r9TI7o5gdOw_rIDj1hBMg';return true;"=
>Generalizing Observer</a>. Under this article is a section called "An Impo=
rtant Limitation of function". Sutter says at one point "This lack of compa=
rison operations is one limitation of function, and it is significant." In =
fact he suggested equality comparison for std::function in this article. Co=
mparison of callback functions is a common operation that is quite pervasiv=
e in code.<br></div></blockquote><div><br>If it's such a "common operation"=
that is "quite pervasive", then surely you can do better than repeat the s=
ame example. Or at the very least, you could find an example where the lack=
of such comparison isn't easily handled. And even moreso, handled in a way=
that ultimately makes for a better <i>C++</i> interface.<br><br>Here's wha=
t I mean. In C#, functions are... functions. They're references to existing=
code. They <i>cannot</i> have state. So equality is very simple.<br><br>In=
C++, any "polymorphic function" interface ought to be able to handle funct=
ors. Function objects are extremely commonly used in a variety of C++ progr=
amming styles; indeed, this is why std::function is specifically designed t=
o permit their use.<br><br>Yet, equality comparison between functors can on=
ly make sense if the two types are equal or if they have an operator=3D=3D =
implementation between them. That instantly rules out lambdas, since you ca=
n't make operator=3D=3D implementations for them.<br><br>Let's take your ow=
n example, with one minor modification:<br><br><div class=3D"prettyprint" s=
tyle=3D"background-color: rgb(250, 250, 250); border-color: rgb(187, 187, 1=
87); border-style: solid; border-width: 1px; word-wrap: break-word;"><code =
class=3D"prettyprint"><div class=3D"subprettyprint"><span style=3D"color: #=
008;" class=3D"styled-by-prettify">auto</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify"> foo </span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">[]()</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">{</span=
><span style=3D"color: #800;" class=3D"styled-by-prettify">/*...*/</span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">};</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"colo=
r: #800;" class=3D"styled-by-prettify">//Notice something missing.</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"><br>fun_ptr</span><=
span style=3D"color: #660;" class=3D"styled-by-prettify"><</span><span s=
tyle=3D"color: #008;" class=3D"styled-by-prettify">void</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">()></span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"> fp1</span><span style=3D"color:=
#660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify">foo</span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">);</span><span style=3D"color: #000;" class=3D"styled-=
by-prettify"><br>fun_ptr</span><span style=3D"color: #660;" class=3D"styled=
-by-prettify"><</span><span style=3D"color: #008;" class=3D"styled-by-pr=
ettify">void</span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">()></span><span style=3D"color: #000;" class=3D"styled-by-prettify"> f=
p2</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify">foo</span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify">);</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"><br><br>compare </span><span sty=
le=3D"color: #660;" class=3D"styled-by-prettify">=3D</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify">fp1 </span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">=3D=3D</span><span style=3D"color: #000;" class=3D"styled=
-by-prettify"> fp2</span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">);</span><span style=3D"color: #000;" class=3D"styled-by-prettify">=
<br></span></div></code></div><br>There is no reason for these two functors=
to be considered different in any way. In fact, I didn't even have to remo=
ve the "=3D" capture; I could have simply stated that it didn't happen to c=
apture anything from the enclosing scope.<br><br>Most users would expect to=
be able to do this:<br><br><div class=3D"prettyprint" style=3D"background-=
color: rgb(250, 250, 250); border-color: rgb(187, 187, 187); border-style: =
solid; border-width: 1px; word-wrap: break-word;"><code class=3D"prettyprin=
t"><div class=3D"subprettyprint"><span style=3D"color: #008;" class=3D"styl=
ed-by-prettify">event</span><span style=3D"color: #660;" class=3D"styled-by=
-prettify">.</span><span style=3D"color: #008;" class=3D"styled-by-prettify=
">register</span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
(</span><span style=3D"color: #000;" class=3D"styled-by-prettify">fp1</span=
><span style=3D"color: #660;" class=3D"styled-by-prettify">);</span><span s=
tyle=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">event</span><span style=3D"c=
olor: #660;" class=3D"styled-by-prettify">.</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify">unregister</span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify">fp2</span><span style=3D"color: #660;" class=3D"sty=
led-by-prettify">);</span></div></code></div><br>That code would have worke=
d just fine if these were actual function pointers. But because the user ju=
st so happened to store a lambda instead of a function pointer, the semanti=
cs change.<br><br>From a user perspective, that is surprising. And that's a=
very bad thing to surprise a user with.<br><br>If equality comparison betw=
een functions is as critical as you claim, then you shouldn't do it half-wa=
y. You can't say that it's important for function pointers, but that you ca=
n arbitrarily declare all functors to be unequal. That's simply not a worka=
ble solution.<br><br>Plus, there's the fact that C++ functors often have st=
ate. And in some cases, the functor is the sole owner of that state. So... =
why should the user have to keep a heavyweight object around, or even a "sm=
art pointer" reference to one? The user isn't going to call that functor an=
ymore; they're only keeping it around to use as a handle. The user should b=
e able to move a std::functor into the event object, with the event being t=
he sole owner of it.<br><br>That's why the Boost.Signal approach is superio=
r for C++; you don't have to answer the question of whether different calla=
ble values are equal or not. You simply return a handle that is used to rep=
resent the attached callable. If the user happens to register the "same fun=
ction" (by some definition) twice, then it should be assumed that this is w=
hat the user intended to do (which can be reasonable in some cases).<br><br=
>C++ is not C#, and therefore is going to have to do things differently. Wh=
at matters is that you can do the same things, not that the interfaces are =
100% identical.<br><br>And thus far, you have not proven that equality comp=
arison is an essential feature for polymorphic functions.<br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_84_1528911922.1431643179788--
------=_Part_83_25262283.1431643179788--
.
Author: Nevin Liber <nevin@eviloverlord.com>
Date: Thu, 14 May 2015 18:08:42 -0500
Raw View
--089e011772057bc001051612d1e2
Content-Type: text/plain; charset=UTF-8
On 14 May 2015 at 17:39, Nicol Bolas <jmckesson@gmail.com> wrote:
>
> Yet, equality comparison between functors can only make sense if the two
> types are equal or if they have an operator== implementation between them.
>
I would say "equality comparison between functors can only make sense if
the two types are equal *and* if they have an operator== implementation
between them."
> That instantly rules out lambdas, since you can't make operator==
> implementations for them.
>
That may change, as the general direction of N4475
<http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4475.pdf> was
received favorably.
Another question: should a captureless lambda compare equal to its
function pointer equivalent; i.e.,:
auto l = []{ /* ... */};
auto f = +l;
are f and l equal?
--
Nevin ":-)" Liber <mailto:nevin@eviloverlord.com> (847) 691-1404
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--089e011772057bc001051612d1e2
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On 14 May 2015 at 17:39, Nicol Bolas <span dir=3D"ltr"><=
;<a href=3D"mailto:jmckesson@gmail.com" target=3D"_blank">jmckesson@gmail.c=
om</a>></span> wrote:<br><div class=3D"gmail_extra"><div class=3D"gmail_=
quote"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;=
border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:=
solid;padding-left:1ex"><div dir=3D"ltr"><span class=3D""><br>Yet, equality=
comparison between functors can only make sense if the two types are equal=
or if they have an operator=3D=3D implementation between them.</span></div=
></blockquote><div><br></div><div>I would say "equality comparison bet=
ween functors can only make sense if the two types are equal <b><i><u>and</=
u></i></b> if they have an operator=3D=3D implementation between them."=
;</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0=
px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);b=
order-left-style:solid;padding-left:1ex"><div dir=3D"ltr"><span class=3D"">=
That instantly rules out lambdas, since you can't make operator=3D=3D =
implementations for them.<br></span></div></blockquote><div><br></div><div>=
That may change, as the general direction of=C2=A0<a href=3D"http://www.ope=
n-std.org/jtc1/sc22/wg21/docs/papers/2015/n4475.pdf">N4475</a>=C2=A0was rec=
eived favorably.</div><div><br></div><div>Another question: =C2=A0should a =
captureless lambda compare equal to its function pointer equivalent; i.e.,:=
</div><div><br></div><div>auto l =3D []{ /* ... */};</div><div>auto f =3D +=
l;</div><div><br></div><div>are f and l equal?</div></div>-- <br><div class=
=3D"gmail_signature">=C2=A0Nevin ":-)" Liber=C2=A0 <mailto:<a =
href=3D"mailto:nevin@eviloverlord.com" target=3D"_blank">nevin@eviloverlord=
..com</a>>=C2=A0 (847) 691-1404</div>
</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--089e011772057bc001051612d1e2--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 14 May 2015 17:29:53 -0700 (PDT)
Raw View
------=_Part_151_345667024.1431649794511
Content-Type: multipart/alternative;
boundary="----=_Part_152_682407233.1431649794511"
------=_Part_152_682407233.1431649794511
Content-Type: text/plain; charset=UTF-8
On Thursday, May 14, 2015 at 7:09:26 PM UTC-4, Nevin ":-)" Liber wrote:
>
> On 14 May 2015 at 17:39, Nicol Bolas <jmck...@gmail.com <javascript:>>
> wrote:
>
>>
>> Yet, equality comparison between functors can only make sense if the two
>> types are equal or if they have an operator== implementation between them.
>>
>
> I would say "equality comparison between functors can only make sense if
> the two types are equal *and* if they have an operator== implementation
> between them."
>
Sure. Though it might be considered odd by the user if two different
functors compare equal normally, yet don't compare equal when wrapped by
std::function.
>
>
>> That instantly rules out lambdas, since you can't make operator==
>> implementations for them.
>>
>
> That may change, as the general direction of N4475
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4475.pdf> was
> received favorably.
>
Always good to hear.
> Another question: should a captureless lambda compare equal to its
> function pointer equivalent; i.e.,:
>
> auto l = []{ /* ... */};
> auto f = +l;
>
> are f and l equal?
>
Ugh. How many other gotcha cases are there with regard to function
equality? It's sounding better and better to just design interfaces to
avoid the whole issue...
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_152_682407233.1431649794511
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Thursday, May 14, 2015 at 7:09:26 PM UTC-4, Nevin ":-)"=
Liber wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-le=
ft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr">=
On 14 May 2015 at 17:39, Nicol Bolas <span dir=3D"ltr"><<a href=3D"javas=
cript:" target=3D"_blank" gdf-obfuscated-mailto=3D"NLpanlOGA2wJ" rel=3D"nof=
ollow" onmousedown=3D"this.href=3D'javascript:';return true;" onclick=3D"th=
is.href=3D'javascript:';return true;">jmck...@gmail.com</a>></span> wrot=
e:<br><div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(=
204,204,204);border-left-style:solid;padding-left:1ex"><div dir=3D"ltr"><sp=
an><br>Yet, equality comparison between functors can only make sense if the=
two types are equal or if they have an operator=3D=3D implementation betwe=
en them.</span></div></blockquote><div><br></div><div>I would say "equality=
comparison between functors can only make sense if the two types are equal=
<b><i><u>and</u></i></b> if they have an operator=3D=3D implementation bet=
ween them."</div></div></div></div></blockquote><div><br>Sure. Though it mi=
ght be considered odd by the user if two different functors compare equal n=
ormally, yet don't compare equal when wrapped by std::function.<br> </=
div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex=
;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><div=
class=3D"gmail_quote"><div> </div><blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rg=
b(204,204,204);border-left-style:solid;padding-left:1ex"><div dir=3D"ltr"><=
span> That instantly rules out lambdas, since you can't make operator=3D=3D=
implementations for them.<br></span></div></blockquote><div><br></div><div=
>That may change, as the general direction of <a href=3D"http://www.op=
en-std.org/jtc1/sc22/wg21/docs/papers/2015/n4475.pdf" target=3D"_blank" rel=
=3D"nofollow" onmousedown=3D"this.href=3D'http://www.google.com/url?q\75htt=
p%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2015%2Fn4=
475.pdf\46sa\75D\46sntz\0751\46usg\75AFQjCNEN9hkR1Mx1bwyYCBd44bXPtlD6Aw';re=
turn true;" onclick=3D"this.href=3D'http://www.google.com/url?q\75http%3A%2=
F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2015%2Fn4475.pd=
f\46sa\75D\46sntz\0751\46usg\75AFQjCNEN9hkR1Mx1bwyYCBd44bXPtlD6Aw';return t=
rue;">N4475</a> was received favorably.</div></div></div></div></block=
quote><div><br>Always good to hear.<br> </div><blockquote class=3D"gma=
il_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid=
;padding-left: 1ex;"><div dir=3D"ltr"><div><div class=3D"gmail_quote"><div>=
</div><div>Another question: should a captureless lambda compare equa=
l to its function pointer equivalent; i.e.,:</div><div><br></div><div>auto =
l =3D []{ /* ... */};</div><div>auto f =3D +l;</div><div><br></div><div>are=
f and l equal?</div></div></div></div></blockquote><div><br>Ugh. How many =
other gotcha cases are there with regard to function equality? It's soundin=
g better and better to just design interfaces to avoid the whole issue...<b=
r></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_152_682407233.1431649794511--
------=_Part_151_345667024.1431649794511--
.
Author: David Krauss <potswa@mac.com>
Date: Fri, 15 May 2015 09:59:59 +0800
Raw View
--Apple-Mail=_452D0130-DEC0-4127-810E-1139F4F89EE8
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9315, at 7:08 AM, Nevin Liber <nevin@eviloverlor=
d.com> wrote:
>=20
> I would say "equality comparison between functors can only make sense if =
the two types are equal and if they have an operator=3D=3D implementation b=
etween them."
Sounds like a job for a concept (or presently, a user-defined type trait).
> auto l =3D []{ /* ... */};
> auto f =3D +l;
>=20
> are f and l equal?
The problem is the implicit conversion. One solution is to add two deleted =
operator=3D=3D overloads in addition to the default one, to prevent such co=
mparisons.
Should be solved regardless of std::function.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_452D0130-DEC0-4127-810E-1139F4F89EE8
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=80=9305=
=E2=80=9315, at 7:08 AM, Nevin Liber <<a href=3D"mailto:nevin@eviloverlo=
rd.com" class=3D"">nevin@eviloverlord.com</a>> wrote:</div><br class=3D"=
Apple-interchange-newline"><div class=3D""><div dir=3D"ltr" class=3D""><div=
class=3D"gmail_extra"><div class=3D"gmail_quote"><div class=3D"">I would s=
ay "equality comparison between functors can only make sense if the two typ=
es are equal <b class=3D""><i class=3D""><u class=3D"">and</u></i></b> if t=
hey have an operator=3D=3D implementation between them."</div></div></div><=
/div></div></blockquote><div><br class=3D""></div><div>Sounds like a job fo=
r a concept (or presently, a user-defined type trait).</div><br class=3D"">=
<blockquote type=3D"cite" class=3D""><div dir=3D"ltr" class=3D""><div class=
=3D"gmail_extra"><div class=3D"gmail_quote"><div class=3D"">auto l =3D []{ =
/* ... */};</div><div class=3D"">auto f =3D +l;</div><div class=3D""><br cl=
ass=3D""></div><div class=3D"">are f and l equal?</div></div></div></div></=
blockquote><div><br class=3D""></div><div>The problem is the implicit conve=
rsion. One solution is to add two deleted <font face=3D"Courier" class=3D""=
>operator=3D=3D</font> overloads in addition to the default one, to prevent=
such comparisons.</div><div><br class=3D""></div><div>Should be solved reg=
ardless of <font face=3D"Courier" class=3D"">std::function</font>.</div></d=
iv></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_452D0130-DEC0-4127-810E-1139F4F89EE8--
.
Author: mash.boyko2014@gmail.com
Date: Thu, 14 May 2015 19:41:29 -0700 (PDT)
Raw View
------=_Part_70_847312285.1431657689086
Content-Type: multipart/alternative;
boundary="----=_Part_71_813510738.1431657689086"
------=_Part_71_813510738.1431657689086
Content-Type: text/plain; charset=UTF-8
On Thursday, May 14, 2015 at 5:39:40 PM UTC-5, Nicol Bolas wrote:
>
>
>
> On Thursday, May 14, 2015 at 5:22:58 PM UTC-4, Michael Boyko wrote:
>>
>> Herb Sutter a while back wrote a article called Generalizing Observer
>> <http://www.drdobbs.com/cpp/generalizing-observer/184403873?pgno=1>.
>> Under this article is a section called "An Important Limitation of
>> function". Sutter says at one point "This lack of comparison operations is
>> one limitation of function, and it is significant." In fact he suggested
>> equality comparison for std::function in this article. Comparison of
>> callback functions is a common operation that is quite pervasive in code.
>>
>
> If it's such a "common operation" that is "quite pervasive", then surely
> you can do better than repeat the same example. Or at the very least, you
> could find an example where the lack of such comparison isn't easily
> handled. And even moreso, handled in a way that ultimately makes for a
> better *C++* interface.
>
I can offer my personal use of this library. In the last two companies I
have worked for we used this library (minus functor targets) with good
results. The first project was on the order of 400k lines of code and this
library was used extensively throughout. My current project is also making
use of this library with equally good results. The primary use is callbacks
and searching for matching callbacks in lists and vectors.
Secondly, there is a very popular article I referenced in my paper called Member
Function Pointers and the Fastest Possible C++ Delegates
<http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible>.
This implementation has basically the same exact semantics (minus the
functor target as my proposal) and is a very popular article with over 1.6
million visits and over 20k downloads. Popularity is hurt because that
implementation uses non standard C++ to improve performance.
Hope that helps.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_71_813510738.1431657689086
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Thursday, May 14, 2015 at 5:39:40 PM UTC-5, Nic=
ol Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-=
left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr=
"><br><br>On Thursday, May 14, 2015 at 5:22:58 PM UTC-4, Michael Boyko wrot=
e:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bor=
der-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">Herb Sutter a wh=
ile back wrote a article called <a href=3D"http://www.drdobbs.com/cpp/gener=
alizing-observer/184403873?pgno=3D1" rel=3D"nofollow" target=3D"_blank" onm=
ousedown=3D"this.href=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.drd=
obbs.com%2Fcpp%2Fgeneralizing-observer%2F184403873%3Fpgno%3D1\46sa\75D\46sn=
tz\0751\46usg\75AFQjCNGBPRr50r9TI7o5gdOw_rIDj1hBMg';return true;" onclick=
=3D"this.href=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.drdobbs.com=
%2Fcpp%2Fgeneralizing-observer%2F184403873%3Fpgno%3D1\46sa\75D\46sntz\0751\=
46usg\75AFQjCNGBPRr50r9TI7o5gdOw_rIDj1hBMg';return true;">Generalizing Obse=
rver</a>. Under this article is a section called "An Important Limitation o=
f function". Sutter says at one point "This lack of comparison operations i=
s one limitation of function, and it is significant." In fact he suggested =
equality comparison for std::function in this article. Comparison of callba=
ck functions is a common operation that is quite pervasive in code.<br></di=
v></blockquote><div><br>If it's such a "common operation" that is "quite pe=
rvasive", then surely you can do better than repeat the same example. Or at=
the very least, you could find an example where the lack of such compariso=
n isn't easily handled. And even moreso, handled in a way that ultimately m=
akes for a better <i>C++</i> interface.<br></div></div></blockquote><div><b=
r></div><div>I can offer my personal use of this library. In the last two c=
ompanies I have worked for we used this library (minus functor targets) wit=
h good results. The first project was on the order of 400k lines of code an=
d this library was used extensively throughout. My current project is also =
making use of this library with equally good results. The primary use is ca=
llbacks and searching for matching callbacks in lists and vectors.</div><di=
v><br></div><div>Secondly, there is a very popular article I referenced in =
my paper called <a href=3D"http://www.codeproject.com/Articles/7150/Me=
mber-Function-Pointers-and-the-Fastest-Possible">Member Function Pointers a=
nd the Fastest Possible C++ Delegates</a>. This implementation has basicall=
y the same exact semantics (minus the functor target as my proposal) and is=
a very popular article with over 1.6 million visits and over 20k downloads=
.. Popularity is hurt because that implementation uses non standard C++ to i=
mprove performance.</div><div><br></div><div>Hope that helps.</div><div>&nb=
sp;</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_71_813510738.1431657689086--
------=_Part_70_847312285.1431657689086--
.
Author: mash.boyko2014@gmail.com
Date: Thu, 14 May 2015 19:46:16 -0700 (PDT)
Raw View
------=_Part_189_1876319771.1431657976605
Content-Type: multipart/alternative;
boundary="----=_Part_190_1656518649.1431657976605"
------=_Part_190_1656518649.1431657976605
Content-Type: text/plain; charset=UTF-8
On Thursday, May 14, 2015 at 6:09:26 PM UTC-5, Nevin ":-)" Liber wrote:
>
> auto l = []{ /* ... */};
> auto f = +l;
>
> are f and l equal?
>
Not only are equal but comparing l and f is currently valid C++ code.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_190_1656518649.1431657976605
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Thursday, May 14, 2015 at 6:09:26 PM UTC-5, Nev=
in ":-)" Liber wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=
=3D"ltr"><div class=3D"gmail_quote"><div>auto l =3D []{ /* ... */};</div><d=
iv>auto f =3D +l;</div><div><br></div><div>are f and l equal?</div></div></=
div></blockquote><div><br></div><div>Not only are equal but comparing l and=
f is currently valid C++ code. </div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_190_1656518649.1431657976605--
------=_Part_189_1876319771.1431657976605--
.
Author: mash.boyko2014@gmail.com
Date: Thu, 14 May 2015 20:13:51 -0700 (PDT)
Raw View
------=_Part_93_1141350802.1431659631184
Content-Type: multipart/alternative;
boundary="----=_Part_94_1358994210.1431659631184"
------=_Part_94_1358994210.1431659631184
Content-Type: text/plain; charset=UTF-8
I think discussing if two functors is equal or not is interesting but the
real question is what does it mean for a function pointer to be equal to
another function pointer. I don't think the state of the functor being
pointed to is all that important. The only property (or salient attribute)
that matters is does the pointer point to the same object and function or
not. It is a shallow comparison not a deep one. Consider data pointers:
int i1 = 1;
int i2 = 2;
int* p1 = &i1;
int* p2 = &i2;
bool compare1 = (p1 == p2); //false
i2 = 1;
bool compare2 = (p1 == p2); //still false
I'll submit that the internal state of the functor being pointed to is
likewise don't care for a function pointer. Consider the alternative that
equality did depend on the state of what its pointing to. This would mean
that equality would be volatile since another thread might change its state.
I'd point you to Lakos who deals with this here
<https://youtu.be/BshgPboz_AQ?t=3066> at time 51mins.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_94_1358994210.1431659631184
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>I think discussing if two functors is equal or not is=
interesting but the real question is what does it mean for a function poin=
ter to be equal to another function pointer. I don't think the state of the=
functor being pointed to is all that important. The only property (or sali=
ent attribute) that matters is does the pointer point to the same object an=
d function or not. It is a shallow comparison not a deep one. Consider data=
pointers:</div><div><br></div><div>int i1 =3D 1;</div><div>int i2 =3D 2;</=
div><div><br></div><div>int* p1 =3D &i1;</div><div>int* p2 =3D &i2;=
</div><div><br></div><div>bool compare1 =3D (p1 =3D=3D p2); //false</div><d=
iv>i2 =3D 1;</div><div>bool compare2 =3D (p1 =3D=3D p2); //still false</div=
><div><br></div><div>I'll submit that the internal state of the functor bei=
ng pointed to is likewise don't care for a function pointer. Consider the a=
lternative that equality did depend on the state of what its pointing to. T=
his would mean that equality would be volatile since another thread might c=
hange its state.</div><div><br></div><div>I'd point you to Lakos who deals =
with this <a href=3D"https://youtu.be/BshgPboz_AQ?t=3D3066">here</a> a=
t time 51mins.</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_94_1358994210.1431659631184--
------=_Part_93_1141350802.1431659631184--
.
Author: Nevin Liber <nevin@eviloverlord.com>
Date: Thu, 14 May 2015 22:13:49 -0500
Raw View
--001a11c3654e10e4270516163e0a
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On 14 May 2015 at 20:59, David Krauss <potswa@mac.com> wrote:
>
> On 2015=E2=80=9305=E2=80=9315, at 7:08 AM, Nevin Liber <nevin@eviloverlor=
d.com> wrote:
>
> I would say "equality comparison between functors can only make sense if
> the two types are equal *and* if they have an operator=3D=3D implementati=
on
> between them."
>
>
> Sounds like a job for a concept (or presently, a user-defined type trait)=
..
>
I don't understand what concepts, being a compile time mechanism, has to do
with either defining how a run time comparison should behave or how one
implements heterogeneous comparison between two type erased instances.
Could you elaborate?
> auto l =3D []{ /* ... */};
> auto f =3D +l;
>
> are f and l equal?
>
>
> The problem is the implicit conversion. One solution is to add two delete=
d
> operator=3D=3D overloads in addition to the default one, to prevent such
> comparisons.
>
Again, I don't understand why this is problematic, other than with trying
to add this to something like std::function. Could you elaborate?
--=20
Nevin ":-)" Liber <mailto:nevin@eviloverlord.com> (847) 691-1404
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--001a11c3654e10e4270516163e0a
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On 14 May 2015 at 20:59, David Krauss <span dir=3D"ltr">&l=
t;<a href=3D"mailto:potswa@mac.com" target=3D"_blank">potswa@mac.com</a>>=
;</span> wrote:<br><div class=3D"gmail_extra"><div class=3D"gmail_quote"><b=
lockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px =
#ccc solid;padding-left:1ex"><div style=3D"word-wrap:break-word"><br><div><=
span class=3D""><blockquote type=3D"cite"><div>On 2015=E2=80=9305=E2=80=931=
5, at 7:08 AM, Nevin Liber <<a href=3D"mailto:nevin@eviloverlord.com" ta=
rget=3D"_blank">nevin@eviloverlord.com</a>> wrote:</div><br><div><div di=
r=3D"ltr"><div class=3D"gmail_extra"><div class=3D"gmail_quote"><div>I woul=
d say "equality comparison between functors can only make sense if the=
two types are equal <b><i><u>and</u></i></b> if they have an operator=3D=
=3D implementation between them."</div></div></div></div></div></block=
quote><div><br></div></span><div>Sounds like a job for a concept (or presen=
tly, a user-defined type trait).</div></div></div></blockquote><div><br></d=
iv><div>I don't understand what concepts, being a compile time mechanis=
m, has to do with either defining how a run time comparison should behave o=
r how one implements heterogeneous comparison between two type erased insta=
nces.=C2=A0 Could you elaborate?</div><div>=C2=A0</div><blockquote class=3D=
"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding=
-left:1ex"><div style=3D"word-wrap:break-word"><div><span class=3D""><block=
quote type=3D"cite"><div dir=3D"ltr"><div class=3D"gmail_extra"><div class=
=3D"gmail_quote"><div>auto l =3D []{ /* ... */};</div><div>auto f =3D +l;</=
div><div><br></div><div>are f and l equal?</div></div></div></div></blockqu=
ote><div><br></div></span><div>The problem is the implicit conversion. One =
solution is to add two deleted <font face=3D"Courier">operator=3D=3D</font>=
overloads in addition to the default one, to prevent such comparisons.</di=
v></div></div></blockquote><div><br></div><div>Again, I don't understan=
d why this is problematic, other than with trying to add this to something =
like std::function.=C2=A0 Could you elaborate?</div></div>-- <br><div class=
=3D"gmail_signature">=C2=A0Nevin ":-)" Liber=C2=A0 <mailto:<a =
href=3D"mailto:nevin@eviloverlord.com" target=3D"_blank">nevin@eviloverlord=
..com</a>>=C2=A0 (847) 691-1404</div>
</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--001a11c3654e10e4270516163e0a--
.
Author: David Krauss <potswa@mac.com>
Date: Fri, 15 May 2015 13:02:53 +0800
Raw View
--Apple-Mail=_1A6798BB-E722-4831-BAA5-3F51D6655534
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9315, at 11:13 AM, Nevin Liber <nevin@eviloverlo=
rd.com> wrote:
>=20
> I don't understand what concepts, being a compile time mechanism, has to =
do with either defining how a run time comparison should behave or how one =
implements heterogeneous comparison between two type erased instances. Cou=
ld you elaborate?
The obstacles are not being able to know about classes outside the current =
TU, the quadratic number of potential type combinations within a TU, and th=
e difficulty of metaprogramming to even find those combinations. And to a l=
esser extent, the possibility that the user will instantiate std::function =
before declaring a non-member operator=3D=3D. These are compile-time proble=
ms.
By explicitly subscribing to an EqualityComparable concept, a type can decl=
are that operator=3D=3D will be defined.
A more elaborate trait can specify the comparison function to be used, avoi=
ding the problem of overload resolution. The function couldn=E2=80=99t be t=
emplated or overloaded, but it could take a reference to a base class. The =
erasure would include a pointer to the comparison function. Upon comparison=
, if the function pointers are equal, then the objects agree on what to do,=
even if they have different types.
Constructors for std::function could even accept comparator function pointe=
r arguments, and that could even be an alternative to a trait. But, I think=
the trait interface is easier and provides less potential for surprise.
>> auto l =3D []{ /* ... */};
>> auto f =3D +l;
>>=20
>> are f and l equal?
>=20
> The problem is the implicit conversion. One solution is to add two delete=
d operator=3D=3D overloads in addition to the default one, to prevent such =
comparisons.
>=20
> Again, I don't understand why this is problematic, other than with trying=
to add this to something like std::function. Could you elaborate?
Your question seemed to rhetorically say that the meaning isn=E2=80=99t obv=
ious, so I didn=E2=80=99t reflect much on the actual behavior. Yeah, now I =
see that it=E2=80=99s reasonable. The default comparison operator in a capt=
ureless lambda (like any empty class) would always return true, and compari=
sons that include lambda-to-fptr conversions essentially tell you whether t=
wo lambdas are of the same type.
Bringing in the type trait idea, captureless lambdas could uniformly nomina=
te function-pointer comparison as the post-erasure comparison semantic. So =
we could have:
// By default, no heterogeneous comparison.
template< typename t, typename =3D void >
struct post_erasure_comparison_traits {
static bool comp( t const & a, t const & b )
{ return a =3D=3D b; }
};
// A member typedef post_erasure_compare_as nominates an implicit cast to m=
ake heterogeneous objects comparable.
template< typename t >
struct post_erasure_comparison_traits< t, std::conditional_t< true, void,=
=20
typename t::post_erasure_compare_as > >
: post_erasure_comparison_traits< typename t::post_erasure_compare_as >
{};
Captureless lambdas would define a member typedef __signature *post_erasure=
_compare_as;.
Derived classes could nominate a reference to base class type, perhaps with=
a virtual operator=3D=3D.
A shared_ptr wrapper solving the OP problem could nominate std::shared_ptr<=
void*>.
Types where std::function shouldn=E2=80=99t use operator=3D=3D can speciali=
ze the traits class to refer to something else.
Not universal, effortless heterogeneous comparison, but it should cover the=
important cases.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_1A6798BB-E722-4831-BAA5-3F51D6655534
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=80=9305=
=E2=80=9315, at 11:13 AM, Nevin Liber <<a href=3D"mailto:nevin@eviloverl=
ord.com" class=3D"">nevin@eviloverlord.com</a>> wrote:</div><br class=3D=
"Apple-interchange-newline"><div class=3D""><div dir=3D"ltr" class=3D""><di=
v class=3D"gmail_extra"><div class=3D"gmail_quote"><div class=3D"">I don't =
understand what concepts, being a compile time mechanism, has to do with ei=
ther defining how a run time comparison should behave or how one implements=
heterogeneous comparison between two type erased instances. Could yo=
u elaborate?</div></div></div></div></div></blockquote><div><br class=3D"">=
</div><div>The obstacles are not being able to know about classes outside t=
he current TU, the quadratic number of potential type combinations within a=
TU, and the difficulty of metaprogramming to even find those combinations.=
And to a lesser extent, the possibility that the user will instantiate <fo=
nt face=3D"Courier" class=3D"">std::function</font> before declaring a non-=
member <font face=3D"Courier" class=3D"">operator=3D=3D</font>. These =
are compile-time problems.</div><div><br class=3D""></div><div>By explicitl=
y subscribing to an EqualityComparable concept, a type can declare that <fo=
nt face=3D"Courier" class=3D"">operator=3D=3D</font> will be defined.</div>=
<div><br class=3D""></div><div>A more elaborate trait can specify the compa=
rison function to be used, avoiding the problem of overload resolution. The=
function couldn=E2=80=99t be templated or overloaded, but it could take a =
reference to a base class. The erasure would include a pointer to the compa=
rison function. Upon comparison, if the function pointers are equal, then t=
he objects agree on what to do, even if they have different types.</div><di=
v><br class=3D""></div><div>Constructors for <font face=3D"Courier" class=
=3D"">std::function</font> could even accept comparator function pointer ar=
guments, and that could even be an alternative to a trait. But, I think the=
trait interface is easier and provides less potential for surprise.</div><=
div><br class=3D""></div><blockquote type=3D"cite" class=3D""><div dir=3D"l=
tr" class=3D""><div class=3D"gmail_extra"><div class=3D"gmail_quote"><block=
quote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc=
solid;padding-left:1ex"><div style=3D"word-wrap:break-word" class=3D""><di=
v class=3D""><span class=3D""><blockquote type=3D"cite" class=3D""><div dir=
=3D"ltr" class=3D""><div class=3D"gmail_extra"><div class=3D"gmail_quote"><=
div class=3D"">auto l =3D []{ /* ... */};</div><div class=3D"">auto f =3D +=
l;</div><div class=3D""><br class=3D""></div><div class=3D"">are f and l eq=
ual?</div></div></div></div></blockquote><div class=3D""><br class=3D""></d=
iv></span><div class=3D"">The problem is the implicit conversion. One solut=
ion is to add two deleted <font face=3D"Courier" class=3D"">operator=3D=3D<=
/font> overloads in addition to the default one, to prevent such comparison=
s.</div></div></div></blockquote><div class=3D""><br class=3D""></div><div =
class=3D"">Again, I don't understand why this is problematic, other than wi=
th trying to add this to something like std::function. Could you elab=
orate?</div></div></div></div></blockquote><div><br class=3D""></div><div>Y=
our question seemed to rhetorically say that the meaning isn=E2=80=99t obvi=
ous, so I didn=E2=80=99t reflect much on the actual behavior. Yeah, now I s=
ee that it=E2=80=99s reasonable. The default comparison operator in a captu=
reless lambda (like any empty class) would always return <font face=3D"Cour=
ier" class=3D"">true</font>, and comparisons that include lambda-to-fptr co=
nversions essentially tell you whether two lambdas are of the same type.</d=
iv><div><br class=3D""></div><div>Bringing in the type trait idea, cap=
tureless lambdas could uniformly nominate function-pointer comparison =
as the post-erasure comparison semantic. So we could have:</div><div><br cl=
ass=3D""></div><div><font face=3D"Courier" class=3D"">// By default, no het=
erogeneous comparison.</font></div><div><font face=3D"Courier" class=3D"">t=
emplate< typename t, typename =3D void ></font></div><div><font face=
=3D"Courier" class=3D"">struct post_erasure_comparison_traits {</font></div=
><div><font face=3D"Courier" class=3D""> static bool comp( t c=
onst & a, t const & b )</font></div><div><font face=3D"Courier" cla=
ss=3D""> { return a =3D=3D b; }</font></div><div=
><font face=3D"Courier" class=3D"">};</font></div><div><font face=3D"Courie=
r" class=3D""><br class=3D""></font></div><div><font face=3D"Courier" class=
=3D"">// A member typedef post_erasure_compare_as nominates an implicit cas=
t to make heterogeneous objects comparable.</font></div><div><div><font fac=
e=3D"Courier" class=3D"">template< typename t ></font></div><div><fon=
t face=3D"Courier" class=3D"">struct post_erasure_comparison_traits< t, =
std::conditional_t< true, void, </font></div><div><font face=3D"Cou=
rier" class=3D""> typename t::post_erasure_compare_as > >=
;</font></div><div><font face=3D"Courier" class=3D""> : post_e=
rasure_comparison_traits< typename t::post_erasure_compare_as ></font=
></div><div><font face=3D"Courier" class=3D""> {};</font></div=
><div><br class=3D""></div><div><ul class=3D""><li class=3D"">Captureless l=
ambdas would define a member <font face=3D"Courier" class=3D"">typedef __si=
gnature *post_erasure_compare_as;</font>.</li><li class=3D"">Derived classe=
s could nominate a reference to base class type, perhaps with a <font face=
=3D"Courier" class=3D"">virtual operator=3D=3D</font>.</li><li class=3D"">A=
<font face=3D"Courier" class=3D"">shared_ptr</font> wrapper solving the OP=
problem could nominate <font face=3D"Courier" class=3D"">std::shared_ptr&l=
t;void*></font>.</li><li class=3D"">Types where <font face=3D"Courier" c=
lass=3D"">std::function</font> shouldn=E2=80=99t use <font face=3D"Courier"=
class=3D"">operator=3D=3D</font> can specialize the traits class to r=
efer to something else.</li></ul></div><div><br class=3D""></div><div>Not u=
niversal, effortless heterogeneous comparison, but it should cover the impo=
rtant cases.</div></div></div></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_1A6798BB-E722-4831-BAA5-3F51D6655534--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 14 May 2015 22:08:04 -0700 (PDT)
Raw View
------=_Part_202_1363010267.1431666484142
Content-Type: multipart/alternative;
boundary="----=_Part_203_905494920.1431666484142"
------=_Part_203_905494920.1431666484142
Content-Type: text/plain; charset=UTF-8
On Thursday, May 14, 2015 at 11:13:51 PM UTC-4, mash.bo...@gmail.com wrote:
>
> I think discussing if two functors is equal or not is interesting but the
> real question is what does it mean for a function pointer to be equal to
> another function pointer. I don't think the state of the functor being
> pointed to is all that important. The only property (or salient attribute)
> that matters is does the pointer point to the same object and function or
> not. It is a shallow comparison not a deep one.
>
And I could find someone who believes quite differently. That what matters
for function equality is that passing the same parameters will produce the
same results and same side-effects, for all possible sets of parameters
(given other invariants like global state and the like). In this case, the
state of functors is very relevant. What is conceptually calling the same
code, but do different things based on internal state. But if the internal
state compares equal, then they are the same functor.
Again, I go back to my lambda vs. function pointer version. People would be
very surprised that the version with naked functions works but the lambdas
don't.
I'm of the opinion that there is no single reasonable standard that works
for everyone, or even most people. Different people simply have different
equality testing needs when it comes to functors. And if you try to define
one standard, what you do is break the class for people who need a
different standard.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_203_905494920.1431666484142
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Thursday, May 14, 2015 at 11:13:51 PM UTC-4, ma=
sh.bo...@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin:=
0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div =
dir=3D"ltr"><div>I think discussing if two functors is equal or not is inte=
resting but the real question is what does it mean for a function pointer t=
o be equal to another function pointer. I don't think the state of the func=
tor being pointed to is all that important. The only property (or salient a=
ttribute) that matters is does the pointer point to the same object and fun=
ction or not. It is a shallow comparison not a deep one.</div></div></block=
quote><div><br>And I could find someone who believes quite differently. Tha=
t what matters for function equality is that passing the same parameters wi=
ll produce the same results and same side-effects, for all possible sets of=
parameters (given other invariants like global state and the like). In thi=
s case, the state of functors is very relevant. What is conceptually callin=
g the same code, but do different things based on internal state. But if th=
e internal state compares equal, then they are the same functor.<br><br></d=
iv>Again, I go back to my lambda vs. function pointer version. People would=
be very surprised that the version with naked functions works but the lamb=
das don't.<br><br>I'm of the opinion that there is no single reasonable sta=
ndard that works for everyone, or even most people. Different people simply=
have different equality testing needs when it comes to functors. And if yo=
u try to define one standard, what you do is break the class for people who=
need a different standard.<br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_203_905494920.1431666484142--
------=_Part_202_1363010267.1431666484142--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 14 May 2015 22:15:40 -0700 (PDT)
Raw View
------=_Part_236_1570433372.1431666940443
Content-Type: multipart/alternative;
boundary="----=_Part_237_1699661574.1431666940443"
------=_Part_237_1699661574.1431666940443
Content-Type: text/plain; charset=UTF-8
On Thursday, May 14, 2015 at 10:41:29 PM UTC-4, mash.bo...@gmail.com wrote:
>
> On Thursday, May 14, 2015 at 5:39:40 PM UTC-5, Nicol Bolas wrote:
>>
>> On Thursday, May 14, 2015 at 5:22:58 PM UTC-4, Michael Boyko wrote:
>>>
>>> Herb Sutter a while back wrote a article called Generalizing Observer
>>> <http://www.drdobbs.com/cpp/generalizing-observer/184403873?pgno=1>.
>>> Under this article is a section called "An Important Limitation of
>>> function". Sutter says at one point "This lack of comparison operations is
>>> one limitation of function, and it is significant." In fact he suggested
>>> equality comparison for std::function in this article. Comparison of
>>> callback functions is a common operation that is quite pervasive in code.
>>>
>>
>> If it's such a "common operation" that is "quite pervasive", then surely
>> you can do better than repeat the same example. Or at the very least, you
>> could find an example where the lack of such comparison isn't easily
>> handled. And even moreso, handled in a way that ultimately makes for a
>> better *C++* interface.
>>
>
> I can offer my personal use of this library. In the last two companies I
> have worked for we used this library (minus functor targets) with good
> results. The first project was on the order of 400k lines of code and this
> library was used extensively throughout. My current project is also making
> use of this library with equally good results. The primary use is callbacks
> and searching for matching callbacks in lists and vectors.
>
You seem to have missed my question. Yes, by using code that allows you to
compare function pointers, you can have vectors and lists of function
pointers and find matches in them. That's not in doubt.
The question is *why* you need to do that? What is your use case? Not
merely that you used the functionality, but what you were using it to
accomplish.
You created an ordered sequence of callable objects. Then, at some point in
time, you searched that sequence of callable objects for a specific one.
What were you doing that you needed to do that? What was the problem that
prompted you to search through the ordered list of callables for a specific
callable?
And if it's yet another event/delegate/signal implementation, then you've
missed my point entirely. Because there's a better, more C++-friendly way
to handle that sort of thing.
> Secondly, there is a very popular article I referenced in my paper called Member
> Function Pointers and the Fastest Possible C++ Delegates
> <http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible>.
> This implementation has basically the same exact semantics (minus the
> functor target as my proposal) and is a very popular article with over 1.6
> million visits and over 20k downloads. Popularity is hurt because that
> implementation uses non standard C++ to improve performance.
>
I'm not exactly sure how that's relevant in this case. You'd be talking
about a callback/event/observable that you can't shove a lambda into. As
far as I'm concerned, that's a deal-breaker. Outside of certain very
specific performance cases, being unable to use a lambda for a callback is
a non-starter.
That's not to say that such classes shouldn't exist. But I see no reason
for the standard library to have or promote such functions. And certainly,
if the standard library were to create some kind of delegate/event/signal
object, it should use a polymorphic function object that can handle
lambdas. *Stateful* lambdas.
I see a pointer-only proposal as someone wanting to standardize a
fixed-length string, or a vector that does small-buffer optimization. These
are all legitimate optimizations. But they're also very special-case; we
need to cover the generally useful cases first.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_237_1699661574.1431666940443
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Thursday, May 14, 2015 at 10:41:29 PM UTC-4, mash.bo...=
@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"l=
tr">On Thursday, May 14, 2015 at 5:39:40 PM UTC-5, Nicol Bolas wrote:<block=
quote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left=
:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">On Thursday, May 14, 201=
5 at 5:22:58 PM UTC-4, Michael Boyko wrote:<blockquote class=3D"gmail_quote=
" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-le=
ft:1ex"><div dir=3D"ltr">Herb Sutter a while back wrote a article called <a=
href=3D"http://www.drdobbs.com/cpp/generalizing-observer/184403873?pgno=3D=
1" rel=3D"nofollow" target=3D"_blank" onmousedown=3D"this.href=3D'http://ww=
w.google.com/url?q\75http%3A%2F%2Fwww.drdobbs.com%2Fcpp%2Fgeneralizing-obse=
rver%2F184403873%3Fpgno%3D1\46sa\75D\46sntz\0751\46usg\75AFQjCNGBPRr50r9TI7=
o5gdOw_rIDj1hBMg';return true;" onclick=3D"this.href=3D'http://www.google.c=
om/url?q\75http%3A%2F%2Fwww.drdobbs.com%2Fcpp%2Fgeneralizing-observer%2F184=
403873%3Fpgno%3D1\46sa\75D\46sntz\0751\46usg\75AFQjCNGBPRr50r9TI7o5gdOw_rID=
j1hBMg';return true;">Generalizing Observer</a>. Under this article is a se=
ction called "An Important Limitation of function". Sutter says at one poin=
t "This lack of comparison operations is one limitation of function, and it=
is significant." In fact he suggested equality comparison for std::functio=
n in this article. Comparison of callback functions is a common operation t=
hat is quite pervasive in code.<br></div></blockquote><div><br>If it's such=
a "common operation" that is "quite pervasive", then surely you can do bet=
ter than repeat the same example. Or at the very least, you could find an e=
xample where the lack of such comparison isn't easily handled. And even mor=
eso, handled in a way that ultimately makes for a better <i>C++</i> interfa=
ce.<br></div></div></blockquote><div><br></div><div>I can offer my personal=
use of this library. In the last two companies I have worked for we used t=
his library (minus functor targets) with good results. The first project wa=
s on the order of 400k lines of code and this library was used extensively =
throughout. My current project is also making use of this library with equa=
lly good results. The primary use is callbacks and searching for matching c=
allbacks in lists and vectors.</div></div></blockquote><div><br>You seem to=
have missed my question. Yes, by using code that allows you to compare fun=
ction pointers, you can have vectors and lists of function pointers and fin=
d matches in them. That's not in doubt.<br><br>The question is <i>why</i> y=
ou need to do that? What is your use case? Not merely that you used the fun=
ctionality, but what you were using it to accomplish.<br><br>You created an=
ordered sequence of callable objects. Then, at some point in time, you sea=
rched that sequence of callable objects for a specific one. What were you d=
oing that you needed to do that? What was the problem that prompted you to =
search through the ordered list of callables for a specific callable?<br><b=
r>And if it's yet another event/delegate/signal implementation, then you've=
missed my point entirely. Because there's a better, more C++-friendly way =
to handle that sort of thing.<br> </div><blockquote class=3D"gmail_quo=
te" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;paddi=
ng-left: 1ex;"><div dir=3D"ltr"><div></div><div>Secondly, there is a very p=
opular article I referenced in my paper called <a href=3D"http://www.c=
odeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possi=
ble" target=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'http://=
www.google.com/url?q\75http%3A%2F%2Fwww.codeproject.com%2FArticles%2F7150%2=
FMember-Function-Pointers-and-the-Fastest-Possible\46sa\75D\46sntz\0751\46u=
sg\75AFQjCNFCUiH9L3xst7Kv4BDaGJ-ZBIMeiA';return true;" onclick=3D"this.href=
=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.codeproject.com%2FArticl=
es%2F7150%2FMember-Function-Pointers-and-the-Fastest-Possible\46sa\75D\46sn=
tz\0751\46usg\75AFQjCNFCUiH9L3xst7Kv4BDaGJ-ZBIMeiA';return true;">Member Fu=
nction Pointers and the Fastest Possible C++ Delegates</a>. This implementa=
tion has basically the same exact semantics (minus the functor target as my=
proposal) and is a very popular article with over 1.6 million visits and o=
ver 20k downloads. Popularity is hurt because that implementation uses non =
standard C++ to improve performance.</div></div></blockquote><div><br>I'm n=
ot exactly sure how that's relevant in this case. You'd be talking about a =
callback/event/observable that you can't shove a lambda into. As far as I'm=
concerned, that's a deal-breaker. Outside of certain very specific perform=
ance cases, being unable to use a lambda for a callback is a non-starter.<b=
r><br>That's not to say that such classes shouldn't exist. But I see no rea=
son for the standard library to have or promote such functions. And certain=
ly, if the standard library were to create some kind of delegate/event/sign=
al object, it should use a polymorphic function object that can handle lamb=
das. <i>Stateful</i> lambdas.<br><br>I see a pointer-only proposal as someo=
ne wanting to standardize a fixed-length string, or a vector that does smal=
l-buffer optimization. These are all legitimate optimizations. But they're =
also very special-case; we need to cover the generally useful cases first.<=
br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_237_1699661574.1431666940443--
------=_Part_236_1570433372.1431666940443--
.
Author: David Krauss <potswa@mac.com>
Date: Fri, 15 May 2015 13:57:02 +0800
Raw View
--Apple-Mail=_F79602B2-0F4E-43E0-8D1D-51E16222F8E3
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
Oops, my code neglected to handle non-comparable types.
// No comparability =3D> always compare false. Could throw if that=E2=80=99=
s preferable.
template< typename t >
struct post_erasure_comparison_traits< t, std::enable_if_t< ! is_equality_c=
omparable< t, t > > {
static bool comp( anything_t, anything_t )
{ return false; }
};
Disabling this specialization when post_erasure_compare_as is defined is le=
ft as an exercise to the reader ;) . Seriously though, shouldn=E2=80=99t be=
too much implementation effort if this direction is taken.
> On 2015=E2=80=9305=E2=80=9315, at 1:02 PM, David Krauss <potswa@mac.com> =
wrote:
>=20
> // By default, no heterogeneous comparison.
> template< typename t, typename =3D void >
> struct post_erasure_comparison_traits {
> static bool comp( t const & a, t const & b )
> { return a =3D=3D b; }
> };
>=20
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_F79602B2-0F4E-43E0-8D1D-51E16222F8E3
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D"">Oops, my code negl=
ected to handle non-comparable types.<div class=3D""><br class=3D""></div><=
div class=3D""><font face=3D"Courier" class=3D"">// No comparability =3D>=
; always compare false. Could throw if that=E2=80=99s preferable.</fon=
t></div><div class=3D""><span style=3D"font-family: Courier;" class=3D"">te=
mplate< typename t ></span></div><div class=3D""><div class=3D""><fon=
t face=3D"Courier" class=3D"">struct post_erasure_comparison_traits< t, =
std::enable_if_t< ! is_equality_comparable< t, t > > {<br class=
=3D""></font><span style=3D"font-family: Courier;" class=3D""> =
static bool comp( anything_t, anything_t )</span><br style=3D"font-family:=
Courier;" class=3D""><span style=3D"font-family: Courier;" class=3D"">&nbs=
p; { return false; }</span><br style=3D"font-family: C=
ourier;" class=3D""><font face=3D"Courier" class=3D"">};<br class=3D""></fo=
nt></div></div><div class=3D""><br class=3D""></div><div class=3D"">Disabli=
ng this specialization when <span style=3D"font-family: Courier;" clas=
s=3D"">post_erasure_compare_as</span> is defined is left as an exercis=
e to the reader ;) . Seriously though, shouldn=E2=80=99t be too much implem=
entation effort if this direction is taken.</div><div class=3D""><br class=
=3D""><div><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=
=80=9305=E2=80=9315, at 1:02 PM, David Krauss <<a href=3D"mailto:potswa@=
mac.com" class=3D"">potswa@mac.com</a>> wrote:</div><br class=3D"Apple-i=
nterchange-newline"><div class=3D""><div style=3D"font-family: Helvetica; f=
ont-size: 12px; font-style: normal; font-variant: normal; font-weight: norm=
al; letter-spacing: normal; line-height: normal; orphans: auto; text-align:=
start; text-indent: 0px; text-transform: none; white-space: normal; widows=
: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=3D""><fon=
t face=3D"Courier" class=3D"">// By default, no heterogeneous comparison.</=
font></div><div style=3D"font-family: Helvetica; font-size: 12px; font-styl=
e: normal; font-variant: normal; font-weight: normal; letter-spacing: norma=
l; line-height: normal; orphans: auto; text-align: start; text-indent: 0px;=
text-transform: none; white-space: normal; widows: auto; word-spacing: 0px=
; -webkit-text-stroke-width: 0px;" class=3D""><font face=3D"Courier" class=
=3D"">template< typename t, typename =3D void ></font></div><div styl=
e=3D"font-family: Helvetica; font-size: 12px; font-style: normal; font-vari=
ant: normal; font-weight: normal; letter-spacing: normal; line-height: norm=
al; orphans: auto; text-align: start; text-indent: 0px; text-transform: non=
e; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-strok=
e-width: 0px;" class=3D""><font face=3D"Courier" class=3D"">struct post_era=
sure_comparison_traits {</font></div><div style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant: normal; font-weight: nor=
mal; letter-spacing: normal; line-height: normal; orphans: auto; text-align=
: start; text-indent: 0px; text-transform: none; white-space: normal; widow=
s: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=3D""><fo=
nt face=3D"Courier" class=3D""> static bool comp( t const &=
; a, t const & b )</font></div><div style=3D"font-family: Helvetica; fo=
nt-size: 12px; font-style: normal; font-variant: normal; font-weight: norma=
l; letter-spacing: normal; line-height: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; widows:=
auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=3D""><font=
face=3D"Courier" class=3D""> { return a =3D=3D =
b; }</font></div><div style=3D"font-family: Helvetica; font-size: 12px; fon=
t-style: normal; font-variant: normal; font-weight: normal; letter-spacing:=
normal; line-height: normal; orphans: auto; text-align: start; text-indent=
: 0px; text-transform: none; white-space: normal; widows: auto; word-spacin=
g: 0px; -webkit-text-stroke-width: 0px;" class=3D""><font face=3D"Courier" =
class=3D"">};</font></div><br class=3D"Apple-interchange-newline"></div></b=
lockquote></div><br class=3D""></div></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_F79602B2-0F4E-43E0-8D1D-51E16222F8E3--
.
Author: Brent Friedman <fourthgeek@gmail.com>
Date: Fri, 15 May 2015 02:48:22 -0500
Raw View
--089e0129400487f0d405161a1126
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Although I don't feel strongly in favor of this proposal, I can offer at
least an example use-case where comparing std::functions would be very
useful. This example has not been implemented so is speculative and
theoretical. However it does relate directly to some work that I intend to
do.
The use case is some UI menu code. Each object implements a sort of visitor
pattern to describe valid menu commands.
void A::getCommands( CommandConsumer& c)
{
if (CanDelete())
c.add( "Delete", []{ ... } );
c.add( "Copy", []{ ... } );
}
void B::getCommands( CommandConsumer& c)
{
A::getCommands(c);
c.add( "Instantiate", []{ ... } );
}
So the CommandConsumer will be left with a mapping from objects to
commands. In the case where we multi-select several objects and invoke the
UI menu, it is very likely that some of these commands will be supported by
multiple objects. In the above example, A's commands will be available for
Bs and for As.
In the UI, it would be nice to organize the menu so that commands
applicable to all selected objects are perhaps sorted to the top, and
commands applicable to only a subset of objects perhaps appear in a
submenu. It is at this point where comparing two std functions becomes very
useful. We need that equality comparison to detect this overlap.
Ways to work around the issue:
1: augment CommandConsumer with an additional function which takes a
function pointer instead of a std::function. Internally it will store a
variant< function pointer, function>. This provides an escape hatch to work
around the equality comparison problem, but is not a general solution.
2: add a guid parameter to CommandConsumer::add -- explicitly defining
equality among things with the same guid. This is a solid solution that
will be annoying for users of the API.
Workaround 1 presents the argument for equality comparison of function
pointers but having not yet written that code I can't say for certain its
value. I don't anticipate that a smart function pointer will really be
needed in this example.
On Fri, May 15, 2015 at 12:57 AM, David Krauss <potswa@mac.com> wrote:
> Oops, my code neglected to handle non-comparable types.
>
> // No comparability =3D> always compare false. Could throw if that=E2=80=
=99s
> preferable.
> template< typename t >
> struct post_erasure_comparison_traits< t, std::enable_if_t< !
> is_equality_comparable< t, t > > {
> static bool comp( anything_t, anything_t )
> { return false; }
> };
>
> Disabling this specialization when post_erasure_compare_as is defined is
> left as an exercise to the reader ;) . Seriously though, shouldn=E2=80=99=
t be too
> much implementation effort if this direction is taken.
>
> On 2015=E2=80=9305=E2=80=9315, at 1:02 PM, David Krauss <potswa@mac.com> =
wrote:
>
> // By default, no heterogeneous comparison.
> template< typename t, typename =3D void >
> struct post_erasure_comparison_traits {
> static bool comp( t const & a, t const & b )
> { return a =3D=3D b; }
> };
>
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--089e0129400487f0d405161a1126
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Although I don't feel strongly in favor of this propos=
al, I can offer at least an example use-case where comparing std::functions=
would be very useful. This example has not been implemented so is speculat=
ive and theoretical. However it does relate directly to some work that I in=
tend to do.<div><br></div><div>The use case is some UI menu code. Each obje=
ct implements a sort of visitor pattern to describe valid menu commands.</d=
iv><div><br></div><div>void A::getCommands( CommandConsumer& c)</div><d=
iv>{</div><div>=C2=A0 =C2=A0if (CanDelete())</div><div>=C2=A0 =C2=A0 =C2=A0=
c.add( "Delete", []{ ... } );</div><div>=C2=A0 =C2=A0c.add( &quo=
t;Copy", []{ ... } );</div><div>}</div><div><br></div><div>void B::get=
Commands( CommandConsumer& c)</div><div>{</div><div>=C2=A0 =C2=A0A::get=
Commands(c);</div><div>=C2=A0 =C2=A0c.add( "Instantiate", []{ ...=
} );</div><div>}</div><div><br></div><div>So the CommandConsumer will be l=
eft with a mapping from objects to commands. In the case where we multi-sel=
ect several objects and invoke the UI menu, it is very likely that some of =
these commands will be supported by multiple objects. In the above example,=
A's commands will be available for Bs and for As.</div><div><br></div>=
<div>In the UI, it would be nice to organize the menu so that commands appl=
icable to all selected objects are perhaps sorted to the top, and commands =
applicable to only a subset of objects perhaps appear in a submenu. It is a=
t this point where comparing two std functions becomes very useful. We need=
that equality comparison to detect this overlap.</div><div><br></div><div>=
Ways to work around the issue:</div><div>1: augment CommandConsumer with an=
additional function which takes a function pointer instead of a std::funct=
ion. Internally it will store a variant< function pointer, function>.=
This provides an escape hatch to work around the equality comparison probl=
em, but is not a general solution.</div><div>2: add a guid parameter to Com=
mandConsumer::add -- explicitly defining equality among things with the sam=
e guid. This is a solid solution that will be annoying for users of the API=
..</div><div><br></div><div>Workaround 1 presents the argument for equality =
comparison of function pointers but having not yet written that code I can&=
#39;t say for certain its value. I don't anticipate that a smart functi=
on pointer will really be needed in this example.</div><div><br></div><div>=
<br></div></div><div class=3D"gmail_extra"><br><div class=3D"gmail_quote">O=
n Fri, May 15, 2015 at 12:57 AM, David Krauss <span dir=3D"ltr"><<a href=
=3D"mailto:potswa@mac.com" target=3D"_blank">potswa@mac.com</a>></span> =
wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bord=
er-left:1px #ccc solid;padding-left:1ex"><div style=3D"word-wrap:break-word=
">Oops, my code neglected to handle non-comparable types.<div><br></div><di=
v><font face=3D"Courier">// No comparability =3D> always compare false. =
Could throw if=C2=A0that=E2=80=99s preferable.</font></div><div><span style=
=3D"font-family:Courier">template< typename t ></span></div><div><div=
><font face=3D"Courier">struct post_erasure_comparison_traits< t, std::e=
nable_if_t< ! is_equality_comparable< t, t > > {<br></font><spa=
n style=3D"font-family:Courier">=C2=A0 =C2=A0 static bool comp( anything_t,=
anything_t )</span><br style=3D"font-family:Courier"><span style=3D"font-f=
amily:Courier">=C2=A0 =C2=A0 =C2=A0 =C2=A0 { return false; }</span><br styl=
e=3D"font-family:Courier"><font face=3D"Courier">};<br></font></div></div><=
div><br></div><div>Disabling this specialization when=C2=A0<span style=3D"f=
ont-family:Courier">post_erasure_compare_as</span>=C2=A0is defined is left =
as an exercise to the reader ;) . Seriously though, shouldn=E2=80=99t be to=
o much implementation effort if this direction is taken.</div><span class=
=3D""><div><br><div><blockquote type=3D"cite"><div>On 2015=E2=80=9305=E2=80=
=9315, at 1:02 PM, David Krauss <<a href=3D"mailto:potswa@mac.com" targe=
t=3D"_blank">potswa@mac.com</a>> wrote:</div><br><div><div style=3D"font=
-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font=
-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;te=
xt-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><fon=
t face=3D"Courier">// By default, no heterogeneous comparison.</font></div>=
<div style=3D"font-family:Helvetica;font-size:12px;font-style:normal;font-v=
ariant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;t=
ext-align:start;text-indent:0px;text-transform:none;white-space:normal;word=
-spacing:0px"><font face=3D"Courier">template< typename t, typename =3D =
void ></font></div><div style=3D"font-family:Helvetica;font-size:12px;fo=
nt-style:normal;font-variant:normal;font-weight:normal;letter-spacing:norma=
l;line-height:normal;text-align:start;text-indent:0px;text-transform:none;w=
hite-space:normal;word-spacing:0px"><font face=3D"Courier">struct post_eras=
ure_comparison_traits {</font></div><div style=3D"font-family:Helvetica;fon=
t-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter=
-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-tr=
ansform:none;white-space:normal;word-spacing:0px"><font face=3D"Courier">=
=C2=A0 =C2=A0 static bool comp( t const & a, t const & b )</font></=
div><div style=3D"font-family:Helvetica;font-size:12px;font-style:normal;fo=
nt-variant:normal;font-weight:normal;letter-spacing:normal;line-height:norm=
al;text-align:start;text-indent:0px;text-transform:none;white-space:normal;=
word-spacing:0px"><font face=3D"Courier">=C2=A0 =C2=A0 =C2=A0 =C2=A0 { retu=
rn a =3D=3D b; }</font></div><div style=3D"font-family:Helvetica;font-size:=
12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacin=
g:normal;line-height:normal;text-align:start;text-indent:0px;text-transform=
:none;white-space:normal;word-spacing:0px"><font face=3D"Courier">};</font>=
</div><br></div></blockquote></div><br></div></span></div><div class=3D"HOE=
nZb"><div class=3D"h5">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--089e0129400487f0d405161a1126--
.
Author: David Krauss <potswa@gmail.com>
Date: Fri, 15 May 2015 15:56:59 +0800
Raw View
--Apple-Mail=_2B6D6A85-E673-4343-9609-AE84D61E3BB3
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9315, at 3:48 PM, Brent Friedman <fourthgeek@gma=
il.com> wrote:
>=20
> In the UI, it would be nice to organize the menu so that commands applica=
ble to all selected objects are perhaps sorted to the top, and commands app=
licable to only a subset of objects perhaps appear in a submenu. It is at t=
his point where comparing two std functions becomes very useful. We need th=
at equality comparison to detect this overlap.
I don=E2=80=99t see how these functions would be comparable. I do see how t=
he strings (command names) would be comparable.
You mention a GUID, but what would happen if two functions have the same us=
er-visible name and different GUIDs? Or same GUIDs and different names?
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_2B6D6A85-E673-4343-9609-AE84D61E3BB3
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=80=9305=
=E2=80=9315, at 3:48 PM, Brent Friedman <<a href=3D"mailto:fourthgeek@gm=
ail.com" class=3D"">fourthgeek@gmail.com</a>> wrote:</div><br class=3D"A=
pple-interchange-newline"><div class=3D""><div style=3D"font-family: Helvet=
ica; font-size: 12px; font-style: normal; font-variant: normal; font-weight=
: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-=
align: start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=3D"=
">In the UI, it would be nice to organize the menu so that commands applica=
ble to all selected objects are perhaps sorted to the top, and commands app=
licable to only a subset of objects perhaps appear in a submenu. It is at t=
his point where comparing two std functions becomes very useful. We need th=
at equality comparison to detect this overlap.</div></div></blockquote></di=
v><br class=3D""><div class=3D"">I don=E2=80=99t see how these functions wo=
uld be comparable. I do see how the strings (command names) would be compar=
able.</div><div class=3D""><br class=3D""></div><div class=3D"">You mention=
a GUID, but what would happen if two functions have the same user-visible =
name and different GUIDs? Or same GUIDs and different names?</div></body></=
html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_2B6D6A85-E673-4343-9609-AE84D61E3BB3--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Fri, 15 May 2015 06:10:52 -0700 (PDT)
Raw View
------=_Part_337_696633084.1431695452946
Content-Type: multipart/alternative;
boundary="----=_Part_338_231399344.1431695452946"
------=_Part_338_231399344.1431695452946
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 12:08:04 AM UTC-5, Nicol Bolas wrote:
>
>
>
> On Thursday, May 14, 2015 at 11:13:51 PM UTC-4, mash.bo...@gmail.com
> wrote:
>>
>> I think discussing if two functors is equal or not is interesting but the
>> real question is what does it mean for a function pointer to be equal to
>> another function pointer. I don't think the state of the functor being
>> pointed to is all that important. The only property (or salient attribute)
>> that matters is does the pointer point to the same object and function or
>> not. It is a shallow comparison not a deep one.
>>
>
> And I could find someone who believes quite differently. That what matters
> for function equality is that passing the same parameters will produce the
> same results and same side-effects, for all possible sets of parameters
> (given other invariants like global state and the like). In this case, the
> state of functors is very relevant. What is conceptually calling the same
> code, but do different things based on internal state. But if the internal
> state compares equal, then they are the same functor.
>
Pointers compare memory addresses not values. Data/object pointers,
function pointers and member function pointers all compare memory addresses
only. Why would you want to change that long established pattern? Now
admittedly a functor is a strange animal - is it a function or is it an
object? Is light a particle or a wave? So yes I do understand where some
might like to compare it like an object (internal state). However going
down the path where a pointer type compares values of what it points to is
heading down the wrong road in my opinion.
>
> Again, I go back to my lambda vs. function pointer version. People would
> be very surprised that the version with naked functions works but the
> lambdas don't.
>
> I'm of the opinion that there is no single reasonable standard that works
> for everyone, or even most people. Different people simply have different
> equality testing needs when it comes to functors. And if you try to define
> one standard, what you do is break the class for people who need a
> different standard.
>
This might be true and I have pointed out that even removing the functor
targets leaves 95% of the usefulness intact. My last two companies have
used this type successfully without any lambda targets. Unfortunately this
thread is now only focused solely on the 5%. I guess that in itself is
helpful information.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_338_231399344.1431695452946
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Friday, May 15, 2015 at 12:08:04 AM UTC-5, Nico=
l Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0p=
x 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-l=
eft-width: 1px; border-left-style: solid;"><div dir=3D"ltr"><br><br>On Thur=
sday, May 14, 2015 at 11:13:51 PM UTC-4, <a>mash.bo...@gmail.com</a> wrote:=
<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; paddi=
ng-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px=
; border-left-style: solid;"><div dir=3D"ltr"><div>I think discussing if tw=
o functors is equal or not is interesting but the real question is what doe=
s it mean for a function pointer to be equal to another function pointer. I=
don't think the state of the functor being pointed to is all that importan=
t. The only property (or salient attribute) that matters is does the pointe=
r point to the same object and function or not. It is a shallow comparison =
not a deep one.</div></div></blockquote><div><br>And I could find someone w=
ho believes quite differently. That what matters for function equality is t=
hat passing the same parameters will produce the same results and same side=
-effects, for all possible sets of parameters (given other invariants like =
global state and the like). In this case, the state of functors is very rel=
evant. What is conceptually calling the same code, but do different things =
based on internal state. But if the internal state compares equal, then the=
y are the same functor.<br></div></div></blockquote><div><br></div><div>Poi=
nters compare memory addresses not values. Data/object pointers, funct=
ion pointers and member function pointers all compare memory addresses only=
.. Why would you want to change that long established pattern? Now admittedl=
y a functor is a strange animal - is it a function or is it an object?=
Is light a particle or a wave? So yes I do understand where some might lik=
e to compare it like an object (internal state). However going down the pat=
h where a pointer type compares values of what it points to =
is heading down the wrong road in my opinion.</div><div> </div><blockq=
uote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left=
: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; borde=
r-left-style: solid;"><div dir=3D"ltr"><div><br></div>Again, I go back to m=
y lambda vs. function pointer version. People would be very surprised that =
the version with naked functions works but the lambdas don't.<br><br>I'm of=
the opinion that there is no single reasonable standard that works for eve=
ryone, or even most people. Different people simply have different equality=
testing needs when it comes to functors. And if you try to define one stan=
dard, what you do is break the class for people who need a different standa=
rd.<br></div></blockquote><div><br></div><div>This might be true and I have=
pointed out that even removing the functor targets leaves 95% of the usefu=
lness intact. My last two companies have used this type successfully withou=
t any lambda targets. Unfortunately this thread is now only focused solely =
on the 5%. I guess that in itself is helpful information.</div><div> <=
/div><div> </div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_338_231399344.1431695452946--
------=_Part_337_696633084.1431695452946--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Fri, 15 May 2015 06:17:13 -0700 (PDT)
Raw View
------=_Part_266_1768544405.1431695833506
Content-Type: multipart/alternative;
boundary="----=_Part_267_604656708.1431695833507"
------=_Part_267_604656708.1431695833507
Content-Type: text/plain; charset=UTF-8
On Thursday, May 14, 2015 at 7:29:54 PM UTC-5, Nicol Bolas wrote:
>
>
>
>> Another question: should a captureless lambda compare equal to its
>> function pointer equivalent; i.e.,:
>>
>> auto l = []{ /* ... */};
>> auto f = +l;
>>
>> are f and l equal?
>>
>
> Ugh. How many other gotcha cases are there with regard to function
> equality? It's sounding better and better to just design interfaces to
> avoid the whole issue...
>
How about this:
class functor {
public:
void operator()() {...}
};
functor f;
auto fp1 = fun_ptr<void()>(&functor::operator(), &f);
auto fp2 = fun_ptr<void()>(f);
bool compare = (fp1 == fp2); //what should the result be?
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_267_604656708.1431695833507
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Thursday, May 14, 2015 at 7:29:54 PM UTC-5, Nic=
ol Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0=
px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-=
left-width: 1px; border-left-style: solid;"><div dir=3D"ltr"><div> </d=
iv><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; pa=
dding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: =
1px; border-left-style: solid;"><div dir=3D"ltr"><div><div class=3D"gmail_q=
uote"><div></div><div>Another question: should a captureless lambda c=
ompare equal to its function pointer equivalent; i.e.,:</div><div><br></div=
><div>auto l =3D []{ /* ... */};</div><div>auto f =3D +l;</div><div><br></d=
iv><div>are f and l equal?</div></div></div></div></blockquote><div><br>Ugh=
.. How many other gotcha cases are there with regard to function equality? I=
t's sounding better and better to just design interfaces to avoid the whole=
issue...<br></div></div></blockquote><div><br></div><div>How about this:</=
div><div><br></div><div class=3D"prettyprint" style=3D"border: 1px solid rg=
b(187, 187, 187); border-image: none; -ms-word-wrap: break-word; background=
-color: rgb(250, 250, 250);"><code class=3D"prettyprint"><div class=3D"subp=
rettyprint"><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 13=
6);">class</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, =
0, 0);"> functor </span><span class=3D"styled-by-prettify" style=3D"color: =
rgb(102, 102, 0);">{</span><span class=3D"styled-by-prettify" style=3D"colo=
r: rgb(0, 0, 0);"><br> </span><span class=3D"styled-by-prettify=
" style=3D"color: rgb(0, 0, 136);">public</span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(102, 102, 0);">:</span><span class=3D"styled-by=
-prettify" style=3D"color: rgb(0, 0, 0);"><br> </span><=
span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">void</sp=
an><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </spa=
n><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">opera=
tor</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, =
0);">()()</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0=
, 0);"> </span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, =
102, 0);">{...}</span><span class=3D"styled-by-prettify" style=3D"color: rg=
b(0, 0, 0);"><br></span><span class=3D"styled-by-prettify" style=3D"color: =
rgb(102, 102, 0);">};</span><span class=3D"styled-by-prettify" style=3D"col=
or: rgb(0, 0, 0);"> <br><br>functor f</span><span class=3D"styled-by-pretti=
fy" style=3D"color: rgb(102, 102, 0);">;</span><span class=3D"styled-by-pre=
ttify" style=3D"color: rgb(0, 0, 0);"><br><br></span><span class=3D"styled-=
by-prettify" style=3D"color: rgb(0, 0, 136);">auto</span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(0, 0, 0);"> fp1 </span><span class=3D"=
styled-by-prettify" style=3D"color: rgb(102, 102, 0);">=3D</span><span clas=
s=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> fun_ptr</span><spa=
n class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);"><</spa=
n><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">void<=
/span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);"=
>()>(&</span><span class=3D"styled-by-prettify" style=3D"color: rgb(=
0, 0, 0);">functor</span><span class=3D"styled-by-prettify" style=3D"color:=
rgb(102, 102, 0);">::</span><span class=3D"styled-by-prettify" style=3D"co=
lor: rgb(0, 0, 136);">operator</span><span class=3D"styled-by-prettify" sty=
le=3D"color: rgb(102, 102, 0);">(),</span><span class=3D"styled-by-prettify=
" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify"=
style=3D"color: rgb(102, 102, 0);">&</span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(0, 0, 0);">f</span><span class=3D"styled-by-pre=
ttify" style=3D"color: rgb(102, 102, 0);">);</span><span class=3D"styled-by=
-prettify" style=3D"color: rgb(0, 0, 0);"><br></span><span class=3D"styled-=
by-prettify" style=3D"color: rgb(0, 0, 136);">auto</span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(0, 0, 0);"> fp2 </span><span class=3D"=
styled-by-prettify" style=3D"color: rgb(102, 102, 0);">=3D</span><span clas=
s=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> fun_ptr</span><spa=
n class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);"><</spa=
n><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">void<=
/span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);"=
>()>(</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0,=
0);">f</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 1=
02, 0);">);</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0,=
0, 0);"><br><br></span><span class=3D"styled-by-prettify" style=3D"color: =
rgb(0, 0, 136);">bool</span><span class=3D"styled-by-prettify" style=3D"col=
or: rgb(0, 0, 0);"> compare </span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(102, 102, 0);">=3D</span><span class=3D"styled-by-prettify" =
style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify" s=
tyle=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-by-prettify=
" style=3D"color: rgb(0, 0, 0);">fp1 </span><span class=3D"styled-by-pretti=
fy" style=3D"color: rgb(102, 102, 0);">=3D=3D</span><span class=3D"styled-b=
y-prettify" style=3D"color: rgb(0, 0, 0);"> fp2</span><span class=3D"styled=
-by-prettify" style=3D"color: rgb(102, 102, 0);">);</span><span class=3D"st=
yled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(136, 0, 0);">//what should the result =
be?</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"=
><br><br></span></div></code></div><div><br></div><div><br></div><div><br><=
/div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_267_604656708.1431695833507--
------=_Part_266_1768544405.1431695833506--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Fri, 15 May 2015 06:37:52 -0700 (PDT)
Raw View
------=_Part_50_1288963093.1431697072979
Content-Type: multipart/alternative;
boundary="----=_Part_51_1935156762.1431697072979"
------=_Part_51_1935156762.1431697072979
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 12:15:40 AM UTC-5, Nicol Bolas wrote:
>
> On Thursday, May 14, 2015 at 10:41:29 PM UTC-4, mash.bo...@gmail.com
> wrote:
>>
>> On Thursday, May 14, 2015 at 5:39:40 PM UTC-5, Nicol Bolas wrote:
>>>
>>> On Thursday, May 14, 2015 at 5:22:58 PM UTC-4, Michael Boyko wrote:
>>>>
>>>> Herb Sutter a while back wrote a article called Generalizing Observer
>>>> <http://www.drdobbs.com/cpp/generalizing-observer/184403873?pgno=1>.
>>>> Under this article is a section called "An Important Limitation of
>>>> function". Sutter says at one point "This lack of comparison operations is
>>>> one limitation of function, and it is significant." In fact he suggested
>>>> equality comparison for std::function in this article. Comparison of
>>>> callback functions is a common operation that is quite pervasive in code.
>>>>
>>>
>>> If it's such a "common operation" that is "quite pervasive", then surely
>>> you can do better than repeat the same example. Or at the very least, you
>>> could find an example where the lack of such comparison isn't easily
>>> handled. And even moreso, handled in a way that ultimately makes for a
>>> better *C++* interface.
>>>
>>
>> I can offer my personal use of this library. In the last two companies I
>> have worked for we used this library (minus functor targets) with good
>> results. The first project was on the order of 400k lines of code and this
>> library was used extensively throughout. My current project is also making
>> use of this library with equally good results. The primary use is callbacks
>> and searching for matching callbacks in lists and vectors.
>>
>
> You seem to have missed my question. Yes, by using code that allows you to
> compare function pointers, you can have vectors and lists of function
> pointers and find matches in them. That's not in doubt.
>
> The question is *why* you need to do that? What is your use case? Not
> merely that you used the functionality, but what you were using it to
> accomplish.
>
> You created an ordered sequence of callable objects. Then, at some point
> in time, you searched that sequence of callable objects for a specific one.
> What were you doing that you needed to do that? What was the problem that
> prompted you to search through the ordered list of callables for a specific
> callable?
>
> And if it's yet another event/delegate/signal implementation, then you've
> missed my point entirely. Because there's a better, more C++-friendly way
> to handle that sort of thing.
>
Basically it is searching containers of callbacks and adding/removing from
that list. Yes, we also have RAII scoped attach objects that are nice and
used, but sometimes its not the right tool for the job (sometime a
lock_guard is not the right tool and calling lock() and unlock() directly
is). I'm sure its possible to do what we are doing without equality
comparison, but I'm not going to buy the argument of that being proof
it isn't a useful feature. Lambda functions are syntactic sugar - not
needed, but a nice feature nonetheless.
>
>
>> Secondly, there is a very popular article I referenced in my paper called Member
>> Function Pointers and the Fastest Possible C++ Delegates
>> <http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible>.
>> This implementation has basically the same exact semantics (minus the
>> functor target as my proposal) and is a very popular article with over 1.6
>> million visits and over 20k downloads. Popularity is hurt because that
>> implementation uses non standard C++ to improve performance.
>>
>
> I'm not exactly sure how that's relevant in this case. You'd be talking
> about a callback/event/observable that you can't shove a lambda into. As
> far as I'm concerned, that's a deal-breaker. Outside of certain very
> specific performance cases, being unable to use a lambda for a callback is
> a non-starter.
>
> That's not to say that such classes shouldn't exist. But I see no reason
> for the standard library to have or promote such functions. And certainly,
> if the standard library were to create some kind of delegate/event/signal
> object, it should use a polymorphic function object that can handle
> lambdas. *Stateful* lambdas.
>
> I see a pointer-only proposal as someone wanting to standardize a
> fixed-length string, or a vector that does small-buffer optimization. These
> are all legitimate optimizations. But they're also very special-case; we
> need to cover the generally useful cases first.
>
Maybe this type would not be useful for you - I don't know what types of
code you write. There is certainly stuff in the standard library I've never
used or found useful yet. But it is relevant because these things have
been found to be useful by quite a few people. Dozens of these things have
been created and continue to be. Why do these things continue to be created
when std::function already exists?
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_51_1935156762.1431697072979
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Friday, May 15, 2015 at 12:15:40 AM UTC-5, Nico=
l Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0p=
x 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-l=
eft-width: 1px; border-left-style: solid;"><div dir=3D"ltr">On Thursday, Ma=
y 14, 2015 at 10:41:29 PM UTC-4, <a>mash.bo...@gmail.com</a> wrote:<blockqu=
ote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left:=
1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border=
-left-style: solid;"><div dir=3D"ltr">On Thursday, May 14, 2015 at 5:39:40 =
PM UTC-5, Nicol Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"marg=
in: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, =
204); border-left-width: 1px; border-left-style: solid;"><div dir=3D"ltr">O=
n Thursday, May 14, 2015 at 5:22:58 PM UTC-4, Michael Boyko wrote:<blockquo=
te class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: =
1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-=
left-style: solid;"><div dir=3D"ltr">Herb Sutter a while back wrote a artic=
le called <a onmousedown=3D"this.href=3D'http://www.google.com/url?q\75http=
%3A%2F%2Fwww.drdobbs.com%2Fcpp%2Fgeneralizing-observer%2F184403873%3Fpgno%3=
D1\46sa\75D\46sntz\0751\46usg\75AFQjCNGBPRr50r9TI7o5gdOw_rIDj1hBMg';return =
true;" onclick=3D"this.href=3D'http://www.google.com/url?q\75http%3A%2F%2Fw=
ww.drdobbs.com%2Fcpp%2Fgeneralizing-observer%2F184403873%3Fpgno%3D1\46sa\75=
D\46sntz\0751\46usg\75AFQjCNGBPRr50r9TI7o5gdOw_rIDj1hBMg';return true;" hre=
f=3D"http://www.drdobbs.com/cpp/generalizing-observer/184403873?pgno=3D1" t=
arget=3D"_blank" rel=3D"nofollow">Generalizing Observer</a>. Under this art=
icle is a section called "An Important Limitation of function". Sutter says=
at one point "This lack of comparison operations is one limitation of func=
tion, and it is significant." In fact he suggested equality comparison for =
std::function in this article. Comparison of callback functions is a common=
operation that is quite pervasive in code.<br></div></blockquote><div><br>=
If it's such a "common operation" that is "quite pervasive", then surely yo=
u can do better than repeat the same example. Or at the very least, you cou=
ld find an example where the lack of such comparison isn't easily handled. =
And even moreso, handled in a way that ultimately makes for a better <i>C++=
</i> interface.<br></div></div></blockquote><div><br></div><div>I can offer=
my personal use of this library. In the last two companies I have worked f=
or we used this library (minus functor targets) with good results. The firs=
t project was on the order of 400k lines of code and this library was used =
extensively throughout. My current project is also making use of this libra=
ry with equally good results. The primary use is callbacks and searching fo=
r matching callbacks in lists and vectors.</div></div></blockquote><div><br=
>You seem to have missed my question. Yes, by using code that allows you to=
compare function pointers, you can have vectors and lists of function poin=
ters and find matches in them. That's not in doubt.<br><br>The question is =
<i>why</i> you need to do that? What is your use case? Not merely that you =
used the functionality, but what you were using it to accomplish.<br><br>Yo=
u created an ordered sequence of callable objects. Then, at some point in t=
ime, you searched that sequence of callable objects for a specific one. Wha=
t were you doing that you needed to do that? What was the problem that prom=
pted you to search through the ordered list of callables for a specific cal=
lable?<br><br>And if it's yet another event/delegate/signal implementation,=
then you've missed my point entirely. Because there's a better, more C++-f=
riendly way to handle that sort of thing.<br></div></div></blockquote><div>=
<br></div><div>Basically it is searching containers of callbacks and adding=
/removing from that list. Yes, we also have RAII scoped attach objects that=
are nice and used, but sometimes its not the right tool for the job (=
sometime a lock_guard is not the right tool and calling lock() and unl=
ock() directly is). I'm sure its possible to do what we are doing wit=
hout equality comparison, but I'm not going to buy the argument of that bei=
ng proof it isn't a useful feature. Lambda functions are syntactic sug=
ar - not needed, but a nice feature nonetheless.</div><div> </div><blo=
ckquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-l=
eft: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; bo=
rder-left-style: solid;"><div dir=3D"ltr"><div> </div><blockquote clas=
s=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; bo=
rder-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-st=
yle: solid;"><div dir=3D"ltr"><div></div><div>Secondly, there is a very pop=
ular article I referenced in my paper called <a onmousedown=3D"this.hr=
ef=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.codeproject.com%2FArti=
cles%2F7150%2FMember-Function-Pointers-and-the-Fastest-Possible\46sa\75D\46=
sntz\0751\46usg\75AFQjCNFCUiH9L3xst7Kv4BDaGJ-ZBIMeiA';return true;" onclick=
=3D"this.href=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.codeproject=
..com%2FArticles%2F7150%2FMember-Function-Pointers-and-the-Fastest-Possible\=
46sa\75D\46sntz\0751\46usg\75AFQjCNFCUiH9L3xst7Kv4BDaGJ-ZBIMeiA';return tru=
e;" href=3D"http://www.codeproject.com/Articles/7150/Member-Function-Pointe=
rs-and-the-Fastest-Possible" target=3D"_blank" rel=3D"nofollow">Member Func=
tion Pointers and the Fastest Possible C++ Delegates</a>. This implementati=
on has basically the same exact semantics (minus the functor target as my p=
roposal) and is a very popular article with over 1.6 million visits and ove=
r 20k downloads. Popularity is hurt because that implementation uses non st=
andard C++ to improve performance.</div></div></blockquote><div><br>I'm not=
exactly sure how that's relevant in this case. You'd be talking about a ca=
llback/event/observable that you can't shove a lambda into. As far as I'm c=
oncerned, that's a deal-breaker. Outside of certain very specific performan=
ce cases, being unable to use a lambda for a callback is a non-starter.<br>=
<br>That's not to say that such classes shouldn't exist. But I see no reaso=
n for the standard library to have or promote such functions. And certainly=
, if the standard library were to create some kind of delegate/event/signal=
object, it should use a polymorphic function object that can handle lambda=
s. <i>Stateful</i> lambdas.<br><br>I see a pointer-only proposal as someone=
wanting to standardize a fixed-length string, or a vector that does small-=
buffer optimization. These are all legitimate optimizations. But they're al=
so very special-case; we need to cover the generally useful cases first.<br=
></div></div></blockquote><div><br></div><div>Maybe this type would not be =
useful for you - I don't know what types of code you write. There is certai=
nly stuff in the standard library I've never used or found useful yet. But =
it is relevant because these things have been found to be us=
eful by quite a few people. Dozens of these things have been created and co=
ntinue to be. Why do these things continue to be created when std::function=
already exists?</div><div> </div><div> </div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_51_1935156762.1431697072979--
------=_Part_50_1288963093.1431697072979--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Fri, 15 May 2015 06:52:09 -0700 (PDT)
Raw View
------=_Part_39_1715243439.1431697929104
Content-Type: multipart/alternative;
boundary="----=_Part_40_276001945.1431697929104"
------=_Part_40_276001945.1431697929104
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 9:10:53 AM UTC-4, Michael Boyko wrote:
>
> On Friday, May 15, 2015 at 12:08:04 AM UTC-5, Nicol Bolas wrote:
>>
>> Again, I go back to my lambda vs. function pointer version. People would
>> be very surprised that the version with naked functions works but the
>> lambdas don't.
>>
>> I'm of the opinion that there is no single reasonable standard that works
>> for everyone, or even most people. Different people simply have different
>> equality testing needs when it comes to functors. And if you try to define
>> one standard, what you do is break the class for people who need a
>> different standard.
>>
>
> This might be true and I have pointed out that even removing the functor
> targets leaves 95% of the usefulness intact. My last two companies have
> used this type successfully without any lambda targets.
>
I'm sure they did. Though since lambdas are relatively new, and this
pseudo-polymorphic function is relatively old, people just find ways to
work around it. That doesn't mean that people *should*.
After all, lots of people refuse to use std::string or other standard
library classes, instead rolling their own solutions that may have more
limited (or at least different) interfaces than the standard library
versions. Sometimes, these are for very good reasons (iostream). Sometimes,
they aren't. But the fact that they do so *by itself* is not an argument
that something is wrong with the standard library classes.
If you take functors out of the concept... what's left? It certainly isn't
a polymorphic function object. It's just a function object that could store
a non-member function pointer or a member function pointer+object reference.
Even the "shared" aspect becomes moot. You can't really claim ownership
over a function pointer. And member pointer bindings are given a pointer to
the type to call, it can't really claim ownership over that pointer either,
since the user may not be transferring said ownership to you. It is a naked
pointer, after all.
Is there a use for such a limited "polymorphic" function object? Sure. Is
it sufficiently general of a use that it should be standardized?
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_40_276001945.1431697929104
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Friday, May 15, 2015 at 9:10:53 AM UTC-4, Michael Boyko=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.=
8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr">On Fri=
day, May 15, 2015 at 12:08:04 AM UTC-5, Nicol Bolas wrote:<blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-=
left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">=
<div dir=3D"ltr"><div></div>Again, I go back to my lambda vs. function poin=
ter version. People would be very surprised that the version with naked fun=
ctions works but the lambdas don't.<br><br>I'm of the opinion that there is=
no single reasonable standard that works for everyone, or even most people=
.. Different people simply have different equality testing needs when it com=
es to functors. And if you try to define one standard, what you do is break=
the class for people who need a different standard.<br></div></blockquote>=
<div><br></div><div>This might be true and I have pointed out that even rem=
oving the functor targets leaves 95% of the usefulness intact. My last two =
companies have used this type successfully without any lambda targets.</div=
></div></blockquote><div><br>I'm sure they did. Though since lambdas are re=
latively new, and this pseudo-polymorphic function is relatively old, peopl=
e just find ways to work around it. That doesn't mean that people <i>should=
</i>.<br><br>After all, lots of people refuse to use std::string or other s=
tandard library classes, instead rolling their own solutions that may have =
more limited (or at least different) interfaces than the standard library v=
ersions. Sometimes, these are for very good reasons (iostream). Sometimes, =
they aren't. But the fact that they do so <i>by itself</i> is not an argume=
nt that something is wrong with the standard library classes.<br><br>If you=
take functors out of the concept... what's left? It certainly isn't a poly=
morphic function object. It's just a function object that could store a non=
-member function pointer or a member function pointer+object reference.<br>=
<br>Even the "shared" aspect becomes moot. You can't really claim ownership=
over a function pointer. And member pointer bindings are given a pointer t=
o the type to call, it can't really claim ownership over that pointer eithe=
r, since the user may not be transferring said ownership to you. It is a na=
ked pointer, after all.<br><br>Is there a use for such a limited "polymorph=
ic" function object? Sure. Is it sufficiently general of a use that it shou=
ld be standardized?</div><br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_40_276001945.1431697929104--
------=_Part_39_1715243439.1431697929104--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Fri, 15 May 2015 07:10:35 -0700 (PDT)
Raw View
------=_Part_349_1516250000.1431699035262
Content-Type: multipart/alternative;
boundary="----=_Part_350_1572794698.1431699035262"
------=_Part_350_1572794698.1431699035262
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 8:52:09 AM UTC-5, Nicol Bolas wrote:
>
> On Friday, May 15, 2015 at 9:10:53 AM UTC-4, Michael Boyko wrote:
>>
>> On Friday, May 15, 2015 at 12:08:04 AM UTC-5, Nicol Bolas wrote:
>>>
>>> Again, I go back to my lambda vs. function pointer version. People would
>>> be very surprised that the version with naked functions works but the
>>> lambdas don't.
>>>
>>> I'm of the opinion that there is no single reasonable standard that
>>> works for everyone, or even most people. Different people simply have
>>> different equality testing needs when it comes to functors. And if you try
>>> to define one standard, what you do is break the class for people who need
>>> a different standard.
>>>
>>
>> This might be true and I have pointed out that even removing the functor
>> targets leaves 95% of the usefulness intact. My last two companies have
>> used this type successfully without any lambda targets.
>>
>
> I'm sure they did. Though since lambdas are relatively new, and this
> pseudo-polymorphic function is relatively old, people just find ways to
> work around it. That doesn't mean that people *should*.
>
> After all, lots of people refuse to use std::string or other standard
> library classes, instead rolling their own solutions that may have more
> limited (or at least different) interfaces than the standard library
> versions. Sometimes, these are for very good reasons (iostream). Sometimes,
> they aren't. But the fact that they do so *by itself* is not an argument
> that something is wrong with the standard library classes.
>
> If you take functors out of the concept... what's left? It certainly isn't
> a polymorphic function object. It's just a function object that could store
> a non-member function pointer or a member function pointer+object reference.
>
> Even the "shared" aspect becomes moot. You can't really claim ownership
> over a function pointer. And member pointer bindings are given a pointer to
> the type to call, it can't really claim ownership over that pointer either,
> since the user may not be transferring said ownership to you. It is a naked
> pointer, after all.
>
> Is there a use for such a limited "polymorphic" function object? Sure. Is
> it sufficiently general of a use that it should be standardized?
>
Saying it another way: fun_ptr = std::function + std::bind + equality
comparison - probably functor targets.
You question is a fair one. Would such a tool be useful enough to
standardize? That's why I've posted it here...
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_350_1572794698.1431699035262
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Friday, May 15, 2015 at 8:52:09 AM UTC-5, Nicol=
Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px=
0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-le=
ft-width: 1px; border-left-style: solid;"><div dir=3D"ltr">On Friday, May 1=
5, 2015 at 9:10:53 AM UTC-4, Michael Boyko wrote:<blockquote class=3D"gmail=
_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-=
color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid=
;"><div dir=3D"ltr">On Friday, May 15, 2015 at 12:08:04 AM UTC-5, Nicol Bol=
as wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8=
ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-w=
idth: 1px; border-left-style: solid;"><div dir=3D"ltr"><div></div>Again, I =
go back to my lambda vs. function pointer version. People would be very sur=
prised that the version with naked functions works but the lambdas don't.<b=
r><br>I'm of the opinion that there is no single reasonable standard that w=
orks for everyone, or even most people. Different people simply have differ=
ent equality testing needs when it comes to functors. And if you try to def=
ine one standard, what you do is break the class for people who need a diff=
erent standard.<br></div></blockquote><div><br></div><div>This might be tru=
e and I have pointed out that even removing the functor targets leaves 95% =
of the usefulness intact. My last two companies have used this type success=
fully without any lambda targets.</div></div></blockquote><div><br>I'm sure=
they did. Though since lambdas are relatively new, and this pseudo-polymor=
phic function is relatively old, people just find ways to work around it. T=
hat doesn't mean that people <i>should</i>.<br><br>After all, lots of peopl=
e refuse to use std::string or other standard library classes, instead roll=
ing their own solutions that may have more limited (or at least different) =
interfaces than the standard library versions. Sometimes, these are for ver=
y good reasons (iostream). Sometimes, they aren't. But the fact that they d=
o so <i>by itself</i> is not an argument that something is wrong with the s=
tandard library classes.<br><br>If you take functors out of the concept... =
what's left? It certainly isn't a polymorphic function object. It's just a =
function object that could store a non-member function pointer or a member =
function pointer+object reference.<br><br>Even the "shared" aspect becomes =
moot. You can't really claim ownership over a function pointer. And member =
pointer bindings are given a pointer to the type to call, it can't really c=
laim ownership over that pointer either, since the user may not be transfer=
ring said ownership to you. It is a naked pointer, after all.<br><br>Is the=
re a use for such a limited "polymorphic" function object? Sure. Is it suff=
iciently general of a use that it should be standardized?</div></div></bloc=
kquote><div><br></div><div>Saying it another way: fun_ptr =3D std::function=
+ std::bind + equality comparison - probably functor targets.</div><div><b=
r></div><div>You question is a fair one. Would such a tool be useful enough=
to standardize? That's why I've posted it here...</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_350_1572794698.1431699035262--
------=_Part_349_1516250000.1431699035262--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Fri, 15 May 2015 07:17:12 -0700 (PDT)
Raw View
------=_Part_395_262637926.1431699432567
Content-Type: multipart/alternative;
boundary="----=_Part_396_1076727697.1431699432567"
------=_Part_396_1076727697.1431699432567
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 9:37:53 AM UTC-4, Michael Boyko wrote:
>
> On Friday, May 15, 2015 at 12:15:40 AM UTC-5, Nicol Bolas wrote:
>>
>> On Thursday, May 14, 2015 at 10:41:29 PM UTC-4, mash.bo...@gmail.com
>> wrote:
>>>
>>> I can offer my personal use of this library. In the last two companies I
>>> have worked for we used this library (minus functor targets) with good
>>> results. The first project was on the order of 400k lines of code and this
>>> library was used extensively throughout. My current project is also making
>>> use of this library with equally good results. The primary use is callbacks
>>> and searching for matching callbacks in lists and vectors.
>>>
>>
>> You seem to have missed my question. Yes, by using code that allows you
>> to compare function pointers, you can have vectors and lists of function
>> pointers and find matches in them. That's not in doubt.
>>
>> The question is *why* you need to do that? What is your use case? Not
>> merely that you used the functionality, but what you were using it to
>> accomplish.
>>
>> You created an ordered sequence of callable objects. Then, at some point
>> in time, you searched that sequence of callable objects for a specific one.
>> What were you doing that you needed to do that? What was the problem that
>> prompted you to search through the ordered list of callables for a specific
>> callable?
>>
>> And if it's yet another event/delegate/signal implementation, then you've
>> missed my point entirely. Because there's a better, more C++-friendly way
>> to handle that sort of thing.
>>
>
> Basically it is searching containers of callbacks and adding/removing from
> that list.
>
So it's just this event/delegate/signal thing.
> Yes, we also have RAII scoped attach objects that are nice and used, but
> sometimes its not the right tool for the job (sometime a lock_guard is not
> the right tool and calling lock() and unlock() directly is).
>
I don't know why you keep talking about "RAII scoped attach objects". I've
brought up Boost.Signal
<http://www.boost.org/doc/libs/1_58_0/doc/html/signals2/tutorial.html> as
an alternative event/delegate/signal system several times. While it does
use an attachment object for you to manipulate functor bindings, these connection
objects are *not *"RAII scoped"
<http://www.boost.org/doc/libs/1_58_0/doc/html/boost/signals2/connection.html>
..
The use of connection objects does not require that they're RAII scoped.
That certainly should be an option, but just like with mutexes, they're not
required.
> I'm sure its possible to do what we are doing without equality comparison,
> but I'm not going to buy the argument of that being proof it isn't a useful
> feature.
>
That makes no sense. If there's a different way to do what you need, which
in no way negatively impacts the existing users, as well as allows them
more freedom in how they use that functionality... we have a term for that.
It's "a better way."
We should not be encouraging a view of C++ where function/member pointers
are given greater primacy than functors/lambdas.
Maybe this type would not be useful for you - I don't know what types of
> code you write. There is certainly stuff in the standard library I've never
> used or found useful yet. But it is relevant because these things have
> been found to be useful by quite a few people. Dozens of these things have
> been created and continue to be. Why do these things continue to be created
> when std::function already exists?
>
The same reasons people give for making new string types: greater control,
performance benefits, herd mentality, inertia, legacy codebases, etc. There
are many things people back-door in the standard library, for both good
reasons and bad. Why is yours so special?
Also: what people have found useful is *not* polymorphic function pointers.
It's events/delegates/signals. And I'd bet they'd find them more useful if
they could shove a lambda into them.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_396_1076727697.1431699432567
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Friday, May 15, 2015 at 9:37:53 AM UTC-4, Michael Boyko=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.=
8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr">On Fri=
day, May 15, 2015 at 12:15:40 AM UTC-5, Nicol Bolas wrote:<blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-=
left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">=
<div dir=3D"ltr">On Thursday, May 14, 2015 at 10:41:29 PM UTC-4, <a>mash.bo=
....@gmail.com</a> wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0=
px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border=
-left-width:1px;border-left-style:solid"><div dir=3D"ltr"><div></div><div>I=
can offer my personal use of this library. In the last two companies I hav=
e worked for we used this library (minus functor targets) with good results=
.. The first project was on the order of 400k lines of code and this library=
was used extensively throughout. My current project is also making use of =
this library with equally good results. The primary use is callbacks and se=
arching for matching callbacks in lists and vectors.</div></div></blockquot=
e><div><br>You seem to have missed my question. Yes, by using code that all=
ows you to compare function pointers, you can have vectors and lists of fun=
ction pointers and find matches in them. That's not in doubt.<br><br>The qu=
estion is <i>why</i> you need to do that? What is your use case? Not merely=
that you used the functionality, but what you were using it to accomplish.=
<br><br>You created an ordered sequence of callable objects. Then, at some =
point in time, you searched that sequence of callable objects for a specifi=
c one. What were you doing that you needed to do that? What was the problem=
that prompted you to search through the ordered list of callables for a sp=
ecific callable?<br><br>And if it's yet another event/delegate/signal imple=
mentation, then you've missed my point entirely. Because there's a better, =
more C++-friendly way to handle that sort of thing.<br></div></div></blockq=
uote><div><br></div><div>Basically it is searching containers of callbacks =
and adding/removing from that list.</div></div></blockquote><div><br>So it'=
s just this event/delegate/signal thing.<br> </div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #cc=
c solid;padding-left: 1ex;"><div dir=3D"ltr"><div> Yes, we also have RAII s=
coped attach objects that are nice and used, but sometimes its not the righ=
t tool for the job (sometime a lock_guard is not the right tool and ca=
lling lock() and unlock() directly is).</div></div></blockquote><div><=
br>I don't know why you keep talking about "RAII scoped attach objects". I'=
ve brought up <a href=3D"http://www.boost.org/doc/libs/1_58_0/doc/html/sign=
als2/tutorial.html">Boost.Signal</a> as an alternative event/delegate/signa=
l system several times. While it does use an attachment object for you to m=
anipulate functor bindings, these <a href=3D"http://www.boost.org/doc/libs/=
1_58_0/doc/html/boost/signals2/connection.html">connection objects are <i>n=
ot </i>"RAII scoped"</a>.<br><br>The use of connection objects does not req=
uire that they're RAII scoped. That certainly should be an option, but just=
like with mutexes, they're not required.<br> </div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #cc=
c solid;padding-left: 1ex;"><div dir=3D"ltr"><div>I'm sure its possible to =
do what we are doing without equality comparison, but I'm not going to buy =
the argument of that being proof it isn't a useful feature.</div></div=
></blockquote><div><br>That makes no sense. If there's a different way to d=
o what you need, which in no way negatively impacts the existing users, as =
well as allows them more freedom in how they use that functionality... we h=
ave a term for that. It's "a better way."<br><br>We should not be encouragi=
ng a view of C++ where function/member pointers are given greater primacy t=
han functors/lambdas.<br><br></div><blockquote class=3D"gmail_quote" style=
=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: =
1ex;"><div dir=3D"ltr"><div></div><div>Maybe this type would not be useful =
for you - I don't know what types of code you write. There is certainly stu=
ff in the standard library I've never used or found useful yet. But it is r=
elevant because these things have been found to be useful by=
quite a few people. Dozens of these things have been created and continue =
to be. Why do these things continue to be created when std::function alread=
y exists?</div></div></blockquote><div><br>The same reasons people give for=
making new string types: greater control, performance benefits, herd menta=
lity, inertia, legacy codebases, etc. There are many things people back-doo=
r in the standard library, for both good reasons and bad. Why is yours so s=
pecial?<br><br>Also: what people have found useful is <i>not</i> polymorphi=
c function pointers. It's events/delegates/signals. And I'd bet they'd find=
them more useful if they could shove a lambda into them.<br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_396_1076727697.1431699432567--
------=_Part_395_262637926.1431699432567--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Fri, 15 May 2015 07:44:13 -0700 (PDT)
Raw View
------=_Part_107_599815918.1431701053255
Content-Type: multipart/alternative;
boundary="----=_Part_108_817894808.1431701053255"
------=_Part_108_817894808.1431701053255
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 3:48:23 AM UTC-4, Brent Friedman wrote:
>
> Although I don't feel strongly in favor of this proposal, I can offer at
> least an example use-case where comparing std::functions would be very
> useful. This example has not been implemented so is speculative and
> theoretical. However it does relate directly to some work that I intend to
> do.
> <snip>
>
That's an interesting problem. However, I have some questions about the
problem space that should help show the problem with your current interface.
Your `add` function associates a functor with a name. However, your
algorithm also seems to care about which object was responsible for making
that association. Yet your interface has no knowledge of this.
It seems to me that you already conceptually have a GUID: the name for the
function and the object that was responsible for registering it.
Now, if you have two different objects that register with the same name,
what happens rather depends on the meaning behind everything. You could
think of it in an inheritance pattern, such that new registrations are like
virtual functions, overriding the old. Or you can do it via composition,
where both are contacted. Or you could see it as an error, throwing an
exception if someone tries to register the same name twice. Personally, I
prefer option 2, as it makes the most sense.
But ultimately, I don't see how being able to compare functors would help
you in this instance. Any sorting you do would be based on the registered
name and source object types, both of which are properties that are
separate from the function itself.
Which only helps support the premise that comparing functions is not the
right thing to do. What you need to compare is registration properties,
which is a rather higher level construct.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_108_817894808.1431701053255
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Friday, May 15, 2015 at 3:48:23 AM UTC-4, Brent Friedma=
n wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0=
..8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr">Altho=
ugh I don't feel strongly in favor of this proposal, I can offer at least a=
n example use-case where comparing std::functions would be very useful. Thi=
s example has not been implemented so is speculative and theoretical. Howev=
er it does relate directly to some work that I intend to do.</div> <=
;snip><br></blockquote><div><br>That's an interesting problem. However, =
I have some questions about the problem space that should help show the pro=
blem with your current interface.<br><br>Your `add` function associates a f=
unctor with a name. However, your algorithm also seems to care about which =
object was responsible for making that association. Yet your interface has =
no knowledge of this.<br><br>It seems to me that you already conceptually h=
ave a GUID: the name for the function and the object that was responsible f=
or registering it.<br><br>Now, if you have two different objects that regis=
ter with the same name, what happens rather depends on the meaning behind e=
verything. You could think of it in an inheritance pattern, such that new r=
egistrations are like virtual functions, overriding the old. Or you can do =
it via composition, where both are contacted. Or you could see it as an err=
or, throwing an exception if someone tries to register the same name twice.=
Personally, I prefer option 2, as it makes the most sense.<br><br>But ulti=
mately, I don't see how being able to compare functors would help you in th=
is instance. Any sorting you do would be based on the registered name and s=
ource=20
object types, both of which are properties that are separate from the=20
function itself.<br><br>Which only helps support the premise that comparing=
functions is not the right thing to do. What you need to compare is regist=
ration properties, which is a rather higher level construct.<br></div></div=
>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_108_817894808.1431701053255--
------=_Part_107_599815918.1431701053255--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Fri, 15 May 2015 08:43:48 -0700 (PDT)
Raw View
------=_Part_124_953382233.1431704628239
Content-Type: multipart/alternative;
boundary="----=_Part_125_1119699764.1431704628239"
------=_Part_125_1119699764.1431704628239
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 9:17:12 AM UTC-5, Nicol Bolas wrote:
>
> On Friday, May 15, 2015 at 9:37:53 AM UTC-4, Michael Boyko wrote:
>>
>> On Friday, May 15, 2015 at 12:15:40 AM UTC-5, Nicol Bolas wrote:
>>>
>>> On Thursday, May 14, 2015 at 10:41:29 PM UTC-4, mash.bo...@gmail.com
>>> wrote:
>>>>
>>>> I can offer my personal use of this library. In the last two companies
>>>> I have worked for we used this library (minus functor targets) with good
>>>> results. The first project was on the order of 400k lines of code and this
>>>> library was used extensively throughout. My current project is also making
>>>> use of this library with equally good results. The primary use is callbacks
>>>> and searching for matching callbacks in lists and vectors.
>>>>
>>>
>>> You seem to have missed my question. Yes, by using code that allows you
>>> to compare function pointers, you can have vectors and lists of function
>>> pointers and find matches in them. That's not in doubt.
>>>
>>> The question is *why* you need to do that? What is your use case? Not
>>> merely that you used the functionality, but what you were using it to
>>> accomplish.
>>>
>>> You created an ordered sequence of callable objects. Then, at some point
>>> in time, you searched that sequence of callable objects for a specific one.
>>> What were you doing that you needed to do that? What was the problem that
>>> prompted you to search through the ordered list of callables for a specific
>>> callable?
>>>
>>> And if it's yet another event/delegate/signal implementation, then
>>> you've missed my point entirely. Because there's a better, more
>>> C++-friendly way to handle that sort of thing.
>>>
>>
>> Basically it is searching containers of callbacks and adding/removing
>> from that list.
>>
>
> So it's just this event/delegate/signal thing.
>
>
>> Yes, we also have RAII scoped attach objects that are nice and used, but
>> sometimes its not the right tool for the job (sometime a lock_guard is not
>> the right tool and calling lock() and unlock() directly is).
>>
>
> I don't know why you keep talking about "RAII scoped attach objects". I've
> brought up Boost.Signal
> <http://www.boost.org/doc/libs/1_58_0/doc/html/signals2/tutorial.html> as
> an alternative event/delegate/signal system several times. While it does
> use an attachment object for you to manipulate functor bindings, these connection
> objects are *not *"RAII scoped"
> <http://www.boost.org/doc/libs/1_58_0/doc/html/boost/signals2/connection.html>
> .
>
> The use of connection objects does not require that they're RAII scoped.
> That certainly should be an option, but just like with mutexes, they're not
> required.
>
>
>> I'm sure its possible to do what we are doing without equality
>> comparison, but I'm not going to buy the argument of that being proof
>> it isn't a useful feature.
>>
>
> That makes no sense. If there's a different way to do what you need, which
> in no way negatively impacts the existing users, as well as allows them
> more freedom in how they use that functionality... we have a term for that.
> It's "a better way."
>
> We should not be encouraging a view of C++ where function/member pointers
> are given greater primacy than functors/lambdas.
>
> Maybe this type would not be useful for you - I don't know what types of
>> code you write. There is certainly stuff in the standard library I've never
>> used or found useful yet. But it is relevant because these things have
>> been found to be useful by quite a few people. Dozens of these things have
>> been created and continue to be. Why do these things continue to be created
>> when std::function already exists?
>>
>
> The same reasons people give for making new string types: greater control,
> performance benefits, herd mentality, inertia, legacy codebases, etc. There
> are many things people back-door in the standard library, for both good
> reasons and bad. Why is yours so special?
>
> Also: what people have found useful is *not* polymorphic function
> pointers. It's events/delegates/signals. And I'd bet they'd find them more
> useful if they could shove a lambda into them.
>
Consider this example:
There is some event E. Suppose we have two objects A and B. Object A can
have a dependency on B but B cannot have a dependency on A. Object A might
attach a member function of object B to E. Now a few different scenarios
might be allowed by program flow:
1. Maybe Object A could go out of scope and B still might need the
capability to detach itself from E.
2. Maybe A would do the detach or Maybe B would do the detach whoever has
reason to do it first.
3. Maybe another Object C comes into existence and wants to detach B from E.
Where should this connection objects live? Maybe some global object?
4. Maybe the above scenario is multiplied by few thousand with various
interactions. A global connection object for every conceivable connection?
Maybe a global matrix for every possible connection?
This scenario could mimic a RPG game. Event E is some spell. Object A and B
are players. Spells are cast on other players by attaching to the
event/spell. Players can detach themselves by taking an antidote or some
other player casting a reverse spell.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_125_1119699764.1431704628239
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Friday, May 15, 2015 at 9:17:12 AM UTC-5, Nicol=
Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px=
0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-le=
ft-width: 1px; border-left-style: solid;"><div dir=3D"ltr">On Friday, May 1=
5, 2015 at 9:37:53 AM UTC-4, Michael Boyko wrote:<blockquote class=3D"gmail=
_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-=
color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid=
;"><div dir=3D"ltr">On Friday, May 15, 2015 at 12:15:40 AM UTC-5, Nicol Bol=
as wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8=
ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-w=
idth: 1px; border-left-style: solid;"><div dir=3D"ltr">On Thursday, May 14,=
2015 at 10:41:29 PM UTC-4, <a>mash.bo...@gmail.com</a> wrote:<blockquote c=
lass=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex;=
border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left=
-style: solid;"><div dir=3D"ltr"><div></div><div>I can offer my personal us=
e of this library. In the last two companies I have worked for we used this=
library (minus functor targets) with good results. The first project was o=
n the order of 400k lines of code and this library was used extensively thr=
oughout. My current project is also making use of this library with equally=
good results. The primary use is callbacks and searching for matching call=
backs in lists and vectors.</div></div></blockquote><div><br>You seem to ha=
ve missed my question. Yes, by using code that allows you to compare functi=
on pointers, you can have vectors and lists of function pointers and find m=
atches in them. That's not in doubt.<br><br>The question is <i>why</i> you =
need to do that? What is your use case? Not merely that you used the functi=
onality, but what you were using it to accomplish.<br><br>You created an or=
dered sequence of callable objects. Then, at some point in time, you search=
ed that sequence of callable objects for a specific one. What were you doin=
g that you needed to do that? What was the problem that prompted you to sea=
rch through the ordered list of callables for a specific callable?<br><br>A=
nd if it's yet another event/delegate/signal implementation, then you've mi=
ssed my point entirely. Because there's a better, more C++-friendly way to =
handle that sort of thing.<br></div></div></blockquote><div><br></div><div>=
Basically it is searching containers of callbacks and adding/removing from =
that list.</div></div></blockquote><div><br>So it's just this event/delegat=
e/signal thing.<br> </div><blockquote class=3D"gmail_quote" style=3D"m=
argin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 20=
4, 204); border-left-width: 1px; border-left-style: solid;"><div dir=3D"ltr=
"><div> Yes, we also have RAII scoped attach objects that are nice and used=
, but sometimes its not the right tool for the job (sometime a lock_gu=
ard is not the right tool and calling lock() and unlock() directly is)=
..</div></div></blockquote><div><br>I don't know why you keep talking about =
"RAII scoped attach objects". I've brought up <a onmousedown=3D"this.href=
=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.boost.org%2Fdoc%2Flibs%2=
F1_58_0%2Fdoc%2Fhtml%2Fsignals2%2Ftutorial.html\46sa\75D\46sntz\0751\46usg\=
75AFQjCNENH33eiOhzaNqixonlq-Ww2xMlZQ';return true;" onclick=3D"this.href=3D=
'http://www.google.com/url?q\75http%3A%2F%2Fwww.boost.org%2Fdoc%2Flibs%2F1_=
58_0%2Fdoc%2Fhtml%2Fsignals2%2Ftutorial.html\46sa\75D\46sntz\0751\46usg\75A=
FQjCNENH33eiOhzaNqixonlq-Ww2xMlZQ';return true;" href=3D"http://www.boost.o=
rg/doc/libs/1_58_0/doc/html/signals2/tutorial.html" target=3D"_blank" rel=
=3D"nofollow">Boost.Signal</a> as an alternative event/delegate/signal syst=
em several times. While it does use an attachment object for you to manipul=
ate functor bindings, these <a onmousedown=3D"this.href=3D'http://www.googl=
e.com/url?q\75http%3A%2F%2Fwww.boost.org%2Fdoc%2Flibs%2F1_58_0%2Fdoc%2Fhtml=
%2Fboost%2Fsignals2%2Fconnection.html\46sa\75D\46sntz\0751\46usg\75AFQjCNHJ=
c5lW0BfqBsW-d3SatKz1SwFXUw';return true;" onclick=3D"this.href=3D'http://ww=
w.google.com/url?q\75http%3A%2F%2Fwww.boost.org%2Fdoc%2Flibs%2F1_58_0%2Fdoc=
%2Fhtml%2Fboost%2Fsignals2%2Fconnection.html\46sa\75D\46sntz\0751\46usg\75A=
FQjCNHJc5lW0BfqBsW-d3SatKz1SwFXUw';return true;" href=3D"http://www.boost.o=
rg/doc/libs/1_58_0/doc/html/boost/signals2/connection.html" target=3D"_blan=
k" rel=3D"nofollow">connection objects are <i>not </i>"RAII scoped"</a>.<br=
><br>The use of connection objects does not require that they're RAII scope=
d. That certainly should be an option, but just like with mutexes, they're =
not required.<br> </div><blockquote class=3D"gmail_quote" style=3D"mar=
gin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204,=
204); border-left-width: 1px; border-left-style: solid;"><div dir=3D"ltr">=
<div>I'm sure its possible to do what we are doing without equality compari=
son, but I'm not going to buy the argument of that being proof it isn'=
t a useful feature.</div></div></blockquote><div><br>That makes no sense. I=
f there's a different way to do what you need, which in no way negatively i=
mpacts the existing users, as well as allows them more freedom in how they =
use that functionality... we have a term for that. It's "a better way."<br>=
<br>We should not be encouraging a view of C++ where function/member pointe=
rs are given greater primacy than functors/lambdas.<br><br></div><blockquot=
e class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1=
ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-l=
eft-style: solid;"><div dir=3D"ltr"><div></div><div>Maybe this type would n=
ot be useful for you - I don't know what types of code you write. There is =
certainly stuff in the standard library I've never used or found useful yet=
.. But it is relevant because these things have been found to be&n=
bsp;useful by quite a few people. Dozens of these things have been created =
and continue to be. Why do these things continue to be created when std::fu=
nction already exists?</div></div></blockquote><div><br>The same reasons pe=
ople give for making new string types: greater control, performance benefit=
s, herd mentality, inertia, legacy codebases, etc. There are many things pe=
ople back-door in the standard library, for both good reasons and bad. Why =
is yours so special?<br><br>Also: what people have found useful is <i>not</=
i> polymorphic function pointers. It's events/delegates/signals. And I'd be=
t they'd find them more useful if they could shove a lambda into them.<br><=
/div></div></blockquote><div><br></div><div>Consider this example:</div><di=
v><br></div><div>There is some event E. Suppose we have two objects A and B=
.. Object A can have a dependency on B but B cannot have a dependency on A. =
Object A might attach a member function of object B to E. Now a few differe=
nt scenarios might be allowed by program flow:</div><div>1. Maybe Obje=
ct A could go out of scope and B still might need the capability to de=
tach itself from E.</div><div>2. Maybe A would do the detach or Maybe =
B would do the detach whoever has reason to do it first.</div><div>3. Maybe=
another Object C comes into existence and wants to detach B from E.</div><=
div><br></div><div>Where should this connection objects live? Maybe s=
ome global object?</div><div><div><br></div><div>4. Maybe the above scenari=
o is multiplied by few thousand with various interactions. A global connect=
ion object for every conceivable connection? Maybe a global matrix for ever=
y possible connection?</div><div><br></div><div>This scenario could mi=
mic a RPG game. Event E is some spell. Object A and B are players. Spells a=
re cast on other players by attaching to the event/spell. Players can detac=
h themselves by taking an antidote or some other player casting a reverse s=
pell.</div></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_125_1119699764.1431704628239--
------=_Part_124_953382233.1431704628239--
.
Author: Brent Friedman <fourthgeek@gmail.com>
Date: Fri, 15 May 2015 12:33:22 -0500
Raw View
--001a11408632a4c9960516223d99
Content-Type: text/plain; charset=UTF-8
>
> It seems to me that you already conceptually have a GUID
>
Yes, the name of the command certainly could count as a GUID in my example.
The nature of this being a user interface system presents a pretty strong
reasoning for such as it would be a poor UI that had different commands
with the same name. Relying on plain text as a guid is probably not good
practice in general but makes decent sense in this particular example.
> Players can detach themselves by taking an antidote or some other player
> casting a reverse spell.
>
I do have code with a flavor similar to this. I have a complex object (a 3d
viewport) which can have callbacks attached to it for various events. Many
places can register or unregister these callbacks. In that system,
registering a callback returns a handle (iterator). That handle is used to
unregister. I've found this to work perfectly well in my case. Your case is
slightly different in that the antidote probably applies to a class of
spells rather than applying to a specific instance of a spell. It seems
like using an id for comparing functions is most correct here. As soon as
you have a spell which can apply random effects (selects from one of
several std::functions) the function equality technique could break down or
become onerous. It also seems wasteful and architecturally onerous to
require construction of the std::function just so you can do equality
comparison to unregister.
On Fri, May 15, 2015 at 10:43 AM, Michael Boyko <mboyko2000@gmail.com>
wrote:
>
>
> On Friday, May 15, 2015 at 9:17:12 AM UTC-5, Nicol Bolas wrote:
>>
>> On Friday, May 15, 2015 at 9:37:53 AM UTC-4, Michael Boyko wrote:
>>>
>>> On Friday, May 15, 2015 at 12:15:40 AM UTC-5, Nicol Bolas wrote:
>>>>
>>>> On Thursday, May 14, 2015 at 10:41:29 PM UTC-4, mash.bo...@gmail.com
>>>> wrote:
>>>>>
>>>>> I can offer my personal use of this library. In the last two companies
>>>>> I have worked for we used this library (minus functor targets) with good
>>>>> results. The first project was on the order of 400k lines of code and this
>>>>> library was used extensively throughout. My current project is also making
>>>>> use of this library with equally good results. The primary use is callbacks
>>>>> and searching for matching callbacks in lists and vectors.
>>>>>
>>>>
>>>> You seem to have missed my question. Yes, by using code that allows you
>>>> to compare function pointers, you can have vectors and lists of function
>>>> pointers and find matches in them. That's not in doubt.
>>>>
>>>> The question is *why* you need to do that? What is your use case? Not
>>>> merely that you used the functionality, but what you were using it to
>>>> accomplish.
>>>>
>>>> You created an ordered sequence of callable objects. Then, at some
>>>> point in time, you searched that sequence of callable objects for a
>>>> specific one. What were you doing that you needed to do that? What was the
>>>> problem that prompted you to search through the ordered list of callables
>>>> for a specific callable?
>>>>
>>>> And if it's yet another event/delegate/signal implementation, then
>>>> you've missed my point entirely. Because there's a better, more
>>>> C++-friendly way to handle that sort of thing.
>>>>
>>>
>>> Basically it is searching containers of callbacks and adding/removing
>>> from that list.
>>>
>>
>> So it's just this event/delegate/signal thing.
>>
>>
>>> Yes, we also have RAII scoped attach objects that are nice and used, but
>>> sometimes its not the right tool for the job (sometime a lock_guard is not
>>> the right tool and calling lock() and unlock() directly is).
>>>
>>
>> I don't know why you keep talking about "RAII scoped attach objects".
>> I've brought up Boost.Signal
>> <http://www.boost.org/doc/libs/1_58_0/doc/html/signals2/tutorial.html>
>> as an alternative event/delegate/signal system several times. While it does
>> use an attachment object for you to manipulate functor bindings, these connection
>> objects are *not *"RAII scoped"
>> <http://www.boost.org/doc/libs/1_58_0/doc/html/boost/signals2/connection.html>
>> .
>>
>> The use of connection objects does not require that they're RAII scoped.
>> That certainly should be an option, but just like with mutexes, they're not
>> required.
>>
>>
>>> I'm sure its possible to do what we are doing without equality
>>> comparison, but I'm not going to buy the argument of that being proof
>>> it isn't a useful feature.
>>>
>>
>> That makes no sense. If there's a different way to do what you need,
>> which in no way negatively impacts the existing users, as well as allows
>> them more freedom in how they use that functionality... we have a term for
>> that. It's "a better way."
>>
>> We should not be encouraging a view of C++ where function/member pointers
>> are given greater primacy than functors/lambdas.
>>
>> Maybe this type would not be useful for you - I don't know what types of
>>> code you write. There is certainly stuff in the standard library I've never
>>> used or found useful yet. But it is relevant because these things have
>>> been found to be useful by quite a few people. Dozens of these things have
>>> been created and continue to be. Why do these things continue to be created
>>> when std::function already exists?
>>>
>>
>> The same reasons people give for making new string types: greater
>> control, performance benefits, herd mentality, inertia, legacy codebases,
>> etc. There are many things people back-door in the standard library, for
>> both good reasons and bad. Why is yours so special?
>>
>> Also: what people have found useful is *not* polymorphic function
>> pointers. It's events/delegates/signals. And I'd bet they'd find them more
>> useful if they could shove a lambda into them.
>>
>
> Consider this example:
>
> There is some event E. Suppose we have two objects A and B. Object A can
> have a dependency on B but B cannot have a dependency on A. Object A might
> attach a member function of object B to E. Now a few different scenarios
> might be allowed by program flow:
> 1. Maybe Object A could go out of scope and B still might need the
> capability to detach itself from E.
> 2. Maybe A would do the detach or Maybe B would do the detach whoever has
> reason to do it first.
> 3. Maybe another Object C comes into existence and wants to detach B from
> E.
>
> Where should this connection objects live? Maybe some global object?
>
> 4. Maybe the above scenario is multiplied by few thousand with various
> interactions. A global connection object for every conceivable connection?
> Maybe a global matrix for every possible connection?
>
> This scenario could mimic a RPG game. Event E is some spell. Object A and
> B are players. Spells are cast on other players by attaching to the
> event/spell. Players can detach themselves by taking an antidote or some
> other player casting a reverse spell.
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--001a11408632a4c9960516223d99
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px =
0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-l=
eft-style:solid;padding-left:1ex">It seems to me that you already conceptua=
lly have a GUID<br></blockquote><div><br></div><div>Yes, the name of the co=
mmand certainly could count as a GUID in my example. The nature of this bei=
ng a user interface system presents a pretty strong reasoning for such as i=
t would be a poor UI that had different commands with the same name. Relyin=
g on plain text as a guid is probably not good practice in general but make=
s decent sense in this particular example.</div><div><br></div><div>=C2=A0<=
/div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bo=
rder-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:so=
lid;padding-left:1ex"><span style=3D"font-size:12.8000001907349px">Players =
can detach themselves by taking an antidote or some other player casting a =
reverse spell.</span><br></blockquote><div><br></div><div>I do have code wi=
th a flavor similar to this. I have a complex object (a 3d viewport) which =
can have callbacks attached to it for various events. Many places can regis=
ter or unregister these callbacks. In that system, registering a callback r=
eturns a handle (iterator). That handle is used to unregister. I've fou=
nd this to work perfectly well in my case. Your case is slightly different =
in that the antidote probably applies to a class of spells rather than appl=
ying to a specific instance of a spell. It seems like using an id for compa=
ring functions is most correct here. As soon as you have a spell which can =
apply random effects (selects from one of several std::functions) the funct=
ion equality technique could break down or become onerous. It also seems wa=
steful and architecturally onerous to require construction of the std::func=
tion just so you can do equality comparison to unregister.</div></div><div =
class=3D"gmail_extra"><br><div class=3D"gmail_quote">On Fri, May 15, 2015 a=
t 10:43 AM, Michael Boyko <span dir=3D"ltr"><<a href=3D"mailto:mboyko200=
0@gmail.com" target=3D"_blank">mboyko2000@gmail.com</a>></span> wrote:<b=
r><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:=
1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div class=3D"h5"><b=
r><br>On Friday, May 15, 2015 at 9:17:12 AM UTC-5, Nicol Bolas wrote:<block=
quote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-left:=
1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-st=
yle:solid"><div dir=3D"ltr">On Friday, May 15, 2015 at 9:37:53 AM UTC-4, Mi=
chael Boyko wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0px 0px=
0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-=
width:1px;border-left-style:solid"><div dir=3D"ltr">On Friday, May 15, 2015=
at 12:15:40 AM UTC-5, Nicol Bolas wrote:<blockquote class=3D"gmail_quote" =
style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(20=
4,204,204);border-left-width:1px;border-left-style:solid"><div dir=3D"ltr">=
On Thursday, May 14, 2015 at 10:41:29 PM UTC-4, <a>mash.bo...@gmail.com</a>=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;=
padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;b=
order-left-style:solid"><div dir=3D"ltr"><div></div><div>I can offer my per=
sonal use of this library. In the last two companies I have worked for we u=
sed this library (minus functor targets) with good results. The first proje=
ct was on the order of 400k lines of code and this library was used extensi=
vely throughout. My current project is also making use of this library with=
equally good results. The primary use is callbacks and searching for match=
ing callbacks in lists and vectors.</div></div></blockquote><div><br>You se=
em to have missed my question. Yes, by using code that allows you to compar=
e function pointers, you can have vectors and lists of function pointers an=
d find matches in them. That's not in doubt.<br><br>The question is <i>=
why</i> you need to do that? What is your use case? Not merely that you use=
d the functionality, but what you were using it to accomplish.<br><br>You c=
reated an ordered sequence of callable objects. Then, at some point in time=
, you searched that sequence of callable objects for a specific one. What w=
ere you doing that you needed to do that? What was the problem that prompte=
d you to search through the ordered list of callables for a specific callab=
le?<br><br>And if it's yet another event/delegate/signal implementation=
, then you've missed my point entirely. Because there's a better, m=
ore C++-friendly way to handle that sort of thing.<br></div></div></blockqu=
ote><div><br></div><div>Basically it is searching containers of callbacks a=
nd adding/removing from that list.</div></div></blockquote><div><br>So it&#=
39;s just this event/delegate/signal thing.<br>=C2=A0</div><blockquote clas=
s=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border=
-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid"=
><div dir=3D"ltr"><div> Yes, we also have RAII scoped attach objects that a=
re nice and used, but sometimes its not the right tool for the job=C2=A0(so=
metime a lock_guard is not the right tool and calling lock()=C2=A0and unloc=
k() directly is).</div></div></blockquote><div><br>I don't know why you=
keep talking about "RAII scoped attach objects". I've brough=
t up <a href=3D"http://www.boost.org/doc/libs/1_58_0/doc/html/signals2/tuto=
rial.html" rel=3D"nofollow" target=3D"_blank">Boost.Signal</a> as an altern=
ative event/delegate/signal system several times. While it does use an atta=
chment object for you to manipulate functor bindings, these <a href=3D"http=
://www.boost.org/doc/libs/1_58_0/doc/html/boost/signals2/connection.html" r=
el=3D"nofollow" target=3D"_blank">connection objects are <i>not </i>"R=
AII scoped"</a>.<br><br>The use of connection objects does not require=
that they're RAII scoped. That certainly should be an option, but just=
like with mutexes, they're not required.<br>=C2=A0</div><blockquote cl=
ass=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;bord=
er-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:soli=
d"><div dir=3D"ltr"><div>I'm sure its possible to do what we are doing =
without equality comparison, but I'm not going to buy the argument of t=
hat being proof it=C2=A0isn't a useful feature.</div></div></blockquote=
><div><br>That makes no sense. If there's a different way to do what yo=
u need, which in no way negatively impacts the existing users, as well as a=
llows them more freedom in how they use that functionality... we have a ter=
m for that. It's "a better way."<br><br>We should not be enco=
uraging a view of C++ where function/member pointers are given greater prim=
acy than functors/lambdas.<br><br></div><blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204=
,204,204);border-left-width:1px;border-left-style:solid"><div dir=3D"ltr"><=
div></div><div>Maybe this type would not be useful for you - I don't kn=
ow what types of code you write. There is certainly stuff in the standard l=
ibrary I've never used or found useful yet. But it is relevant because =
these things=C2=A0have been=C2=A0found to be=C2=A0useful by quite a few peo=
ple. Dozens of these things have been created and continue to be. Why do th=
ese things continue to be created when std::function already exists?</div><=
/div></blockquote><div><br>The same reasons people give for making new stri=
ng types: greater control, performance benefits, herd mentality, inertia, l=
egacy codebases, etc. There are many things people back-door in the standar=
d library, for both good reasons and bad. Why is yours so special?<br><br>A=
lso: what people have found useful is <i>not</i> polymorphic function point=
ers. It's events/delegates/signals. And I'd bet they'd find the=
m more useful if they could shove a lambda into them.<br></div></div></bloc=
kquote><div><br></div></div></div><div>Consider this example:</div><div><br=
></div><div>There is some event E. Suppose we have two objects A and B. Obj=
ect A can have a dependency on B but B cannot have a dependency on A. Objec=
t A might attach a member function of object B to E. Now a few different sc=
enarios might be allowed by program flow:</div><div>1.=C2=A0Maybe Object A=
=C2=A0could go out of scope and B still might need the capability to detach=
=C2=A0itself from E.</div><div>2. Maybe A would do the detach or Maybe B wo=
uld do the detach whoever has reason to do it first.</div><div>3. Maybe ano=
ther Object C comes into existence and wants to detach B from E.</div><div>=
<br></div><div>Where should=C2=A0 this connection objects live? Maybe some =
global object?</div><div><div><br></div><div>4. Maybe the above scenario is=
multiplied by few thousand with various interactions. A global connection =
object for every conceivable connection? Maybe a global matrix for every po=
ssible=C2=A0connection?</div><div><br></div><div>This scenario could mimic =
a RPG game. Event E is some spell. Object A and B are players. Spells are c=
ast on other players by attaching to the event/spell. Players can detach th=
emselves by taking an antidote or some other player casting a reverse spell=
..</div></div></div><div class=3D"HOEnZb"><div class=3D"h5">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--001a11408632a4c9960516223d99--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Fri, 15 May 2015 11:01:24 -0700 (PDT)
Raw View
------=_Part_273_1175286202.1431712884051
Content-Type: multipart/alternative;
boundary="----=_Part_274_480611908.1431712884051"
------=_Part_274_480611908.1431712884051
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 12:33:23 PM UTC-5, Brent Friedman wrote:
>
> Players can detach themselves by taking an antidote or some other player
>> casting a reverse spell.
>>
>
> I do have code with a flavor similar to this. I have a complex object (a
> 3d viewport) which can have callbacks attached to it for various events.
> Many places can register or unregister these callbacks. In that system,
> registering a callback returns a handle (iterator). That handle is used to
> unregister. I've found this to work perfectly well in my case. Your case is
> slightly different in that the antidote probably applies to a class of
> spells rather than applying to a specific instance of a spell. It seems
> like using an id for comparing functions is most correct here. As soon as
> you have a spell which can apply random effects (selects from one of
> several std::functions) the function equality technique could break down or
> become onerous. It also seems wasteful and architecturally onerous to
> require construction of the std::function just so you can do equality
> comparison to unregister.
>
>
I agree my example might be a bit contrived but the main point is
when different objects perform the attach and detach it would be nice to
not have to go searching for the handle to perform the disconnect. Sharing
a connection handle among many objects seems rather ugly. Most likely
similar examples are possible with GUI widget interactions.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_274_480611908.1431712884051
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Friday, May 15, 2015 at 12:33:23 PM UTC-5, Bren=
t Friedman wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px=
0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); borde=
r-left-width: 1px; border-left-style: solid;"><div dir=3D"ltr"><blockquote =
class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex=
; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-lef=
t-style: solid;"><span style=3D"font-size: 12.8px;">Players can detach them=
selves by taking an antidote or some other player casting a reverse spell.<=
/span><br></blockquote><div><br></div><div>I do have code with a flavor sim=
ilar to this. I have a complex object (a 3d viewport) which can have callba=
cks attached to it for various events. Many places can register or unregist=
er these callbacks. In that system, registering a callback returns a handle=
(iterator). That handle is used to unregister. I've found this to work per=
fectly well in my case. Your case is slightly different in that the antidot=
e probably applies to a class of spells rather than applying to a specific =
instance of a spell. It seems like using an id for comparing functions is m=
ost correct here. As soon as you have a spell which can apply random effect=
s (selects from one of several std::functions) the function equality techni=
que could break down or become onerous. It also seems wasteful and architec=
turally onerous to require construction of the std::function just so you ca=
n do equality comparison to unregister.</div></div><div><br></div></blockqu=
ote><div> </div><div>I agree my example might be a bit contrived =
but the main point is when different objects perform the attach&n=
bsp;and detach it would be nice to not have to go searching for&n=
bsp;the handle to perform the disconnect. Sharing a connection handle =
among many objects seems rather ugly. Most likely similar examples&nbs=
p;are possible with GUI widget interactions.</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_274_480611908.1431712884051--
------=_Part_273_1175286202.1431712884051--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Fri, 15 May 2015 11:06:05 -0700 (PDT)
Raw View
------=_Part_743_1271677048.1431713165973
Content-Type: multipart/alternative;
boundary="----=_Part_744_1318890792.1431713165973"
------=_Part_744_1318890792.1431713165973
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 11:43:48 AM UTC-4, Michael Boyko wrote:
>
> On Friday, May 15, 2015 at 9:17:12 AM UTC-5, Nicol Bolas wrote:
>>
>> On Friday, May 15, 2015 at 9:37:53 AM UTC-4, Michael Boyko wrote:
>>>
>>> On Friday, May 15, 2015 at 12:15:40 AM UTC-5, Nicol Bolas wrote:
>>>>
>>>> On Thursday, May 14, 2015 at 10:41:29 PM UTC-4, mash.bo...@gmail.com
>>>> wrote:
>>>>>
>>>>> I can offer my personal use of this library. In the last two companies
>>>>> I have worked for we used this library (minus functor targets) with good
>>>>> results. The first project was on the order of 400k lines of code and this
>>>>> library was used extensively throughout. My current project is also making
>>>>> use of this library with equally good results. The primary use is callbacks
>>>>> and searching for matching callbacks in lists and vectors.
>>>>>
>>>>
>>>> You seem to have missed my question. Yes, by using code that allows you
>>>> to compare function pointers, you can have vectors and lists of function
>>>> pointers and find matches in them. That's not in doubt.
>>>>
>>>> The question is *why* you need to do that? What is your use case? Not
>>>> merely that you used the functionality, but what you were using it to
>>>> accomplish.
>>>>
>>>> You created an ordered sequence of callable objects. Then, at some
>>>> point in time, you searched that sequence of callable objects for a
>>>> specific one. What were you doing that you needed to do that? What was the
>>>> problem that prompted you to search through the ordered list of callables
>>>> for a specific callable?
>>>>
>>>> And if it's yet another event/delegate/signal implementation, then
>>>> you've missed my point entirely. Because there's a better, more
>>>> C++-friendly way to handle that sort of thing.
>>>>
>>>
>>> Basically it is searching containers of callbacks and adding/removing
>>> from that list.
>>>
>>
>> So it's just this event/delegate/signal thing.
>>
>>
>>> Yes, we also have RAII scoped attach objects that are nice and used, but
>>> sometimes its not the right tool for the job (sometime a lock_guard is not
>>> the right tool and calling lock() and unlock() directly is).
>>>
>>
>> I don't know why you keep talking about "RAII scoped attach objects".
>> I've brought up Boost.Signal
>> <http://www.boost.org/doc/libs/1_58_0/doc/html/signals2/tutorial.html>
>> as an alternative event/delegate/signal system several times. While it does
>> use an attachment object for you to manipulate functor bindings, these connection
>> objects are *not *"RAII scoped"
>> <http://www.boost.org/doc/libs/1_58_0/doc/html/boost/signals2/connection.html>
>> .
>>
>> The use of connection objects does not require that they're RAII scoped.
>> That certainly should be an option, but just like with mutexes, they're not
>> required.
>>
>>
>>> I'm sure its possible to do what we are doing without equality
>>> comparison, but I'm not going to buy the argument of that being proof
>>> it isn't a useful feature.
>>>
>>
>> That makes no sense. If there's a different way to do what you need,
>> which in no way negatively impacts the existing users, as well as allows
>> them more freedom in how they use that functionality... we have a term for
>> that. It's "a better way."
>>
>> We should not be encouraging a view of C++ where function/member pointers
>> are given greater primacy than functors/lambdas.
>>
>> Maybe this type would not be useful for you - I don't know what types of
>>> code you write. There is certainly stuff in the standard library I've never
>>> used or found useful yet. But it is relevant because these things have
>>> been found to be useful by quite a few people. Dozens of these things have
>>> been created and continue to be. Why do these things continue to be created
>>> when std::function already exists?
>>>
>>
>> The same reasons people give for making new string types: greater
>> control, performance benefits, herd mentality, inertia, legacy codebases,
>> etc. There are many things people back-door in the standard library, for
>> both good reasons and bad. Why is yours so special?
>>
>> Also: what people have found useful is *not* polymorphic function
>> pointers. It's events/delegates/signals. And I'd bet they'd find them more
>> useful if they could shove a lambda into them.
>>
>
> Consider this example:
>
> There is some event E. Suppose we have two objects A and B. Object A can
> have a dependency on B but B cannot have a dependency on A. Object A might
> attach a member function of object B to E. Now a few different scenarios
> might be allowed by program flow:
> 1. Maybe Object A could go out of scope and B still might need the
> capability to detach itself from E.
>
How could B possibly know that it needed to detach itself from E... if B
were not informed that it had been attached to E?
> 2. Maybe A would do the detach or Maybe B would do the detach whoever has
> reason to do it first.
>
Yes, and in a similarly designed system, A might try to free memory owned
by B, thus creating a problem when B goes to try to free that memory too.
We have a solution to these: shared_ptr. If you think that this is so
important a problem (I don't, because the example seems rather contrived),
then clearly there needs to be a concept of shared ownership of
connections: shared_connection.
> 3. Maybe another Object C comes into existence and wants to detach B from
> E.
>
.... I'm sorry, what? The idea that object C has any right to detact object
B from E, when C has no established relationship to A or B, is *absurd*.
Why would you *ever* write code that does this? How would this pass code
review?
> Where should this connection objects live? Maybe some global object?
>
You handle connections just like any other resource that needs termination:
you made it, you own it. If someone else needs to own it, you transfer
ownership to them. If you need to share ownership, you develop that
ability. And so forth.
4. Maybe the above scenario is multiplied by few thousand with various
> interactions. A global connection object for every conceivable connection?
> Maybe a global matrix for every possible connection?
>
> This scenario could mimic a RPG game. Event E is some spell. Object A and
> B are players. Spells are cast on other players by attaching to the
> event/spell. Players can detach themselves by taking an antidote or some
> other player casting a reverse spell.
>
OK, let's take that as an example. Let's say that we have object C that
puts a debuff on B. And you want to model this as an event. Well... that
debuff itself must be an *object*. It must be something more than just a
naked pointer, because you're going to have to have many other things
interacting with the debuff.
For example, you need a UI element to appear when the debuff is active. Are
you really going to run through the player object and look for specific
functions for specific debuffs, then have some table mapping function
pointer addresses to UI images? No; that's way too fragile and incredibly
absurd. You look through each object's list of active debuffs, and the
debuff type will reference a specific UI image (as well as other debuff
properties).
It is the setting of this debuff on an entity that sets up any events that
are important for making it work. And it is the act of removing that debuff
from an entity that removes those events.
Object B has no right to be poking about at events in object A *directly*.
It can add or remove debuffs, but debuffs (and similar objects) are the
ones who are allowed to manipulate the actual events.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_744_1318890792.1431713165973
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Friday, May 15, 2015 at 11:43:48 AM UTC-4, Michael Boyk=
o wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0=
..8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr">On Fr=
iday, May 15, 2015 at 9:17:12 AM UTC-5, Nicol Bolas wrote:<blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-=
left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">=
<div dir=3D"ltr">On Friday, May 15, 2015 at 9:37:53 AM UTC-4, Michael Boyko=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;=
padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;b=
order-left-style:solid"><div dir=3D"ltr">On Friday, May 15, 2015 at 12:15:4=
0 AM UTC-5, Nicol Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);=
border-left-width:1px;border-left-style:solid"><div dir=3D"ltr">On Thursday=
, May 14, 2015 at 10:41:29 PM UTC-4, <a>mash.bo...@gmail.com</a> wrote:<blo=
ckquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-lef=
t:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-=
style:solid"><div dir=3D"ltr"><div></div><div>I can offer my personal use o=
f this library. In the last two companies I have worked for we used this li=
brary (minus functor targets) with good results. The first project was on t=
he order of 400k lines of code and this library was used extensively throug=
hout. My current project is also making use of this library with equally go=
od results. The primary use is callbacks and searching for matching callbac=
ks in lists and vectors.</div></div></blockquote><div><br>You seem to have =
missed my question. Yes, by using code that allows you to compare function =
pointers, you can have vectors and lists of function pointers and find matc=
hes in them. That's not in doubt.<br><br>The question is <i>why</i> you nee=
d to do that? What is your use case? Not merely that you used the functiona=
lity, but what you were using it to accomplish.<br><br>You created an order=
ed sequence of callable objects. Then, at some point in time, you searched =
that sequence of callable objects for a specific one. What were you doing t=
hat you needed to do that? What was the problem that prompted you to search=
through the ordered list of callables for a specific callable?<br><br>And =
if it's yet another event/delegate/signal implementation, then you've misse=
d my point entirely. Because there's a better, more C++-friendly way to han=
dle that sort of thing.<br></div></div></blockquote><div><br></div><div>Bas=
ically it is searching containers of callbacks and adding/removing from tha=
t list.</div></div></blockquote><div><br>So it's just this event/delegate/s=
ignal thing.<br> </div><blockquote class=3D"gmail_quote" style=3D"marg=
in:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);bo=
rder-left-width:1px;border-left-style:solid"><div dir=3D"ltr"><div> Yes, we=
also have RAII scoped attach objects that are nice and used, but sometimes=
its not the right tool for the job (sometime a lock_guard is not the =
right tool and calling lock() and unlock() directly is).</div></div></=
blockquote><div><br>I don't know why you keep talking about "RAII scoped at=
tach objects". I've brought up <a href=3D"http://www.boost.org/doc/libs/1_5=
8_0/doc/html/signals2/tutorial.html" rel=3D"nofollow" target=3D"_blank" onm=
ousedown=3D"this.href=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.boo=
st.org%2Fdoc%2Flibs%2F1_58_0%2Fdoc%2Fhtml%2Fsignals2%2Ftutorial.html\46sa\7=
5D\46sntz\0751\46usg\75AFQjCNENH33eiOhzaNqixonlq-Ww2xMlZQ';return true;" on=
click=3D"this.href=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.boost.=
org%2Fdoc%2Flibs%2F1_58_0%2Fdoc%2Fhtml%2Fsignals2%2Ftutorial.html\46sa\75D\=
46sntz\0751\46usg\75AFQjCNENH33eiOhzaNqixonlq-Ww2xMlZQ';return true;">Boost=
..Signal</a> as an alternative event/delegate/signal system several times. W=
hile it does use an attachment object for you to manipulate functor binding=
s, these <a href=3D"http://www.boost.org/doc/libs/1_58_0/doc/html/boost/sig=
nals2/connection.html" rel=3D"nofollow" target=3D"_blank" onmousedown=3D"th=
is.href=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.boost.org%2Fdoc%2=
Flibs%2F1_58_0%2Fdoc%2Fhtml%2Fboost%2Fsignals2%2Fconnection.html\46sa\75D\4=
6sntz\0751\46usg\75AFQjCNHJc5lW0BfqBsW-d3SatKz1SwFXUw';return true;" onclic=
k=3D"this.href=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.boost.org%=
2Fdoc%2Flibs%2F1_58_0%2Fdoc%2Fhtml%2Fboost%2Fsignals2%2Fconnection.html\46s=
a\75D\46sntz\0751\46usg\75AFQjCNHJc5lW0BfqBsW-d3SatKz1SwFXUw';return true;"=
>connection objects are <i>not </i>"RAII scoped"</a>.<br><br>The use of con=
nection objects does not require that they're RAII scoped. That certainly s=
hould be an option, but just like with mutexes, they're not required.<br>&n=
bsp;</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8=
ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1p=
x;border-left-style:solid"><div dir=3D"ltr"><div>I'm sure its possible to d=
o what we are doing without equality comparison, but I'm not going to buy t=
he argument of that being proof it isn't a useful feature.</div></div>=
</blockquote><div><br>That makes no sense. If there's a different way to do=
what you need, which in no way negatively impacts the existing users, as w=
ell as allows them more freedom in how they use that functionality... we ha=
ve a term for that. It's "a better way."<br><br>We should not be encouragin=
g a view of C++ where function/member pointers are given greater primacy th=
an functors/lambdas.<br><br></div><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204=
,204);border-left-width:1px;border-left-style:solid"><div dir=3D"ltr"><div>=
</div><div>Maybe this type would not be useful for you - I don't know what =
types of code you write. There is certainly stuff in the standard library I=
've never used or found useful yet. But it is relevant because these things=
have been found to be useful by quite a few people. Dozens =
of these things have been created and continue to be. Why do these things c=
ontinue to be created when std::function already exists?</div></div></block=
quote><div><br>The same reasons people give for making new string types: gr=
eater control, performance benefits, herd mentality, inertia, legacy codeba=
ses, etc. There are many things people back-door in the standard library, f=
or both good reasons and bad. Why is yours so special?<br><br>Also: what pe=
ople have found useful is <i>not</i> polymorphic function pointers. It's ev=
ents/delegates/signals. And I'd bet they'd find them more useful if they co=
uld shove a lambda into them.<br></div></div></blockquote><div><br></div><d=
iv>Consider this example:</div><div><br></div><div>There is some event E. S=
uppose we have two objects A and B. Object A can have a dependency on B but=
B cannot have a dependency on A. Object A might attach a member function o=
f object B to E. Now a few different scenarios might be allowed by program =
flow:</div><div>1. Maybe Object A could go out of scope and B sti=
ll might need the capability to detach itself from E.</div></div></blo=
ckquote><div><br>How could B possibly know that it needed to detach itself =
from E... if B were not informed that it had been attached to E?<br> <=
/div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8e=
x;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>2. =
Maybe A would do the detach or Maybe B would do the detach whoever has reas=
on to do it first.</div></div></blockquote><div><br>Yes, and in a similarly=
designed system, A might try to free memory owned by B, thus creating a pr=
oblem when B goes to try to free that memory too.<br><br>We have a solution=
to these: shared_ptr. If you think that this is so important a problem (I =
don't, because the example seems rather contrived), then clearly there need=
s to be a concept of shared ownership of connections: shared_connection.<br=
> </div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-le=
ft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr">=
<div>3. Maybe another Object C comes into existence and wants to detach B f=
rom E.</div></div></blockquote><div><br>... I'm sorry, what? The idea that =
object C has any right to detact object B from E, when C has no established=
relationship to A or B, is <i>absurd</i>. Why would you <i>ever</i> write =
code that does this? How would this pass code review?<br> </div><block=
quote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-le=
ft: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div></div><div>Whe=
re should this connection objects live? Maybe some global object?</di=
v></div></blockquote><div><br>You handle connections just like any other re=
source that needs termination: you made it, you own it. If someone else nee=
ds to own it, you transfer ownership to them. If you need to share ownershi=
p, you develop that ability. And so forth.<br><br></div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #cc=
c solid;padding-left: 1ex;"><div dir=3D"ltr"><div><div></div><div>4. Maybe =
the above scenario is multiplied by few thousand with various interactions.=
A global connection object for every conceivable connection? Maybe a globa=
l matrix for every possible connection?</div><div><br></div><div>This =
scenario could mimic a RPG game. Event E is some spell. Object A and B are =
players. Spells are cast on other players by attaching to the event/spell. =
Players can detach themselves by taking an antidote or some other player ca=
sting a reverse spell.</div></div></div></blockquote><div><br>OK, let's tak=
e that as an example. Let's say that we have object C that puts a debuff on=
B. And you want to model this as an event. Well... that debuff itself must=
be an <i>object</i>. It must be something more than just a naked pointer, =
because you're going to have to have many other things interacting with the=
debuff.<br><br>For example, you need a UI element to appear when the debuf=
f is active. Are you really going to run through the player object and look=
for specific functions for specific debuffs, then have some table mapping =
function pointer addresses to UI images? No; that's way too fragile and inc=
redibly absurd. You look through each object's list of active debuffs, and =
the debuff type will reference a specific UI image (as well as other debuff=
properties).<br><br>It is the setting of this debuff on an entity that set=
s up any events that are important for making it work. And it is the act of=
removing that debuff from an entity that removes those events.<br><br>Obje=
ct B has no right to be poking about at events in object A <i>directly</i>.=
It can add or remove debuffs, but debuffs (and similar objects) are the on=
es who are allowed to manipulate the actual events.<br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_744_1318890792.1431713165973--
------=_Part_743_1271677048.1431713165973--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Fri, 15 May 2015 11:07:48 -0700 (PDT)
Raw View
------=_Part_985_614064085.1431713268727
Content-Type: multipart/alternative;
boundary="----=_Part_986_1916152760.1431713268727"
------=_Part_986_1916152760.1431713268727
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 2:01:24 PM UTC-4, Michael Boyko wrote:
>
>
>
> On Friday, May 15, 2015 at 12:33:23 PM UTC-5, Brent Friedman wrote:
>>
>> Players can detach themselves by taking an antidote or some other player
>>> casting a reverse spell.
>>>
>>
>> I do have code with a flavor similar to this. I have a complex object (a
>> 3d viewport) which can have callbacks attached to it for various events.
>> Many places can register or unregister these callbacks. In that system,
>> registering a callback returns a handle (iterator). That handle is used to
>> unregister. I've found this to work perfectly well in my case. Your case is
>> slightly different in that the antidote probably applies to a class of
>> spells rather than applying to a specific instance of a spell. It seems
>> like using an id for comparing functions is most correct here. As soon as
>> you have a spell which can apply random effects (selects from one of
>> several std::functions) the function equality technique could break down or
>> become onerous. It also seems wasteful and architecturally onerous to
>> require construction of the std::function just so you can do equality
>> comparison to unregister.
>>
>>
> I agree my example might be a bit contrived but the main point is
> when different objects perform the attach and detach it would be nice to
> not have to go searching for the handle to perform the disconnect. Sharing
> a connection handle among many objects seems rather ugly. Most likely
> similar examples are possible with GUI widget interactions.
>
What's "rather ugly" about it? It makes more sense than various unrelated
GUI widgets assuming which public member functions they're all registering.
At least the ownership relationships for connections are clear.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_986_1916152760.1431713268727
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Friday, May 15, 2015 at 2:01:24 PM UTC-4, Micha=
el Boyko wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-=
left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr=
"><br><br>On Friday, May 15, 2015 at 12:33:23 PM UTC-5, Brent Friedman wrot=
e:<blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;paddi=
ng-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border=
-left-style:solid"><div dir=3D"ltr"><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204=
,204);border-left-width:1px;border-left-style:solid"><span style=3D"font-si=
ze:12.8px">Players can detach themselves by taking an antidote or some othe=
r player casting a reverse spell.</span><br></blockquote><div><br></div><di=
v>I do have code with a flavor similar to this. I have a complex object (a =
3d viewport) which can have callbacks attached to it for various events. Ma=
ny places can register or unregister these callbacks. In that system, regis=
tering a callback returns a handle (iterator). That handle is used to unreg=
ister. I've found this to work perfectly well in my case. Your case is slig=
htly different in that the antidote probably applies to a class of spells r=
ather than applying to a specific instance of a spell. It seems like using =
an id for comparing functions is most correct here. As soon as you have a s=
pell which can apply random effects (selects from one of several std::funct=
ions) the function equality technique could break down or become onerous. I=
t also seems wasteful and architecturally onerous to require construction o=
f the std::function just so you can do equality comparison to unregister.</=
div></div><div><br></div></blockquote><div> </div><div>I agree my=
example might be a bit contrived but the main point is when different=
objects perform the attach and detach it would be nice to n=
ot have to go searching for the handle to perform the disconnect.=
Sharing a connection handle among many objects seems rather ugly=
.. Most likely similar examples are possible with GUI widget interactio=
ns.</div></div></blockquote><div><br>What's "rather ugly" about it? It make=
s more sense than various unrelated GUI widgets assuming which public membe=
r functions they're all registering. At least the ownership relationships f=
or connections are clear.<br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_986_1916152760.1431713268727--
------=_Part_985_614064085.1431713268727--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Fri, 15 May 2015 11:18:29 -0700 (PDT)
Raw View
------=_Part_335_344862547.1431713909416
Content-Type: multipart/alternative;
boundary="----=_Part_336_46464176.1431713909416"
------=_Part_336_46464176.1431713909416
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 1:06:06 PM UTC-5, Nicol Bolas wrote:
>
> On Friday, May 15, 2015 at 11:43:48 AM UTC-4, Michael Boyko wrote:
>>
>> On Friday, May 15, 2015 at 9:17:12 AM UTC-5, Nicol Bolas wrote:
>>>
>>> On Friday, May 15, 2015 at 9:37:53 AM UTC-4, Michael Boyko wrote:
>>>>
>>>> On Friday, May 15, 2015 at 12:15:40 AM UTC-5, Nicol Bolas wrote:
>>>>>
>>>>> On Thursday, May 14, 2015 at 10:41:29 PM UTC-4, mash.bo...@gmail.com
>>>>> wrote:
>>>>>>
>>>>>> I can offer my personal use of this library. In the last two
>>>>>> companies I have worked for we used this library (minus functor targets)
>>>>>> with good results. The first project was on the order of 400k lines of code
>>>>>> and this library was used extensively throughout. My current project is
>>>>>> also making use of this library with equally good results. The primary use
>>>>>> is callbacks and searching for matching callbacks in lists and vectors.
>>>>>>
>>>>>
>>>>> You seem to have missed my question. Yes, by using code that allows
>>>>> you to compare function pointers, you can have vectors and lists of
>>>>> function pointers and find matches in them. That's not in doubt.
>>>>>
>>>>> The question is *why* you need to do that? What is your use case? Not
>>>>> merely that you used the functionality, but what you were using it to
>>>>> accomplish.
>>>>>
>>>>> You created an ordered sequence of callable objects. Then, at some
>>>>> point in time, you searched that sequence of callable objects for a
>>>>> specific one. What were you doing that you needed to do that? What was the
>>>>> problem that prompted you to search through the ordered list of callables
>>>>> for a specific callable?
>>>>>
>>>>> And if it's yet another event/delegate/signal implementation, then
>>>>> you've missed my point entirely. Because there's a better, more
>>>>> C++-friendly way to handle that sort of thing.
>>>>>
>>>>
>>>> Basically it is searching containers of callbacks and adding/removing
>>>> from that list.
>>>>
>>>
>>> So it's just this event/delegate/signal thing.
>>>
>>>
>>>> Yes, we also have RAII scoped attach objects that are nice and used,
>>>> but sometimes its not the right tool for the job (sometime a lock_guard is
>>>> not the right tool and calling lock() and unlock() directly is).
>>>>
>>>
>>> I don't know why you keep talking about "RAII scoped attach objects".
>>> I've brought up Boost.Signal
>>> <http://www.boost.org/doc/libs/1_58_0/doc/html/signals2/tutorial.html>
>>> as an alternative event/delegate/signal system several times. While it does
>>> use an attachment object for you to manipulate functor bindings, these connection
>>> objects are *not *"RAII scoped"
>>> <http://www.boost.org/doc/libs/1_58_0/doc/html/boost/signals2/connection.html>
>>> .
>>>
>>> The use of connection objects does not require that they're RAII scoped.
>>> That certainly should be an option, but just like with mutexes, they're not
>>> required.
>>>
>>>
>>>> I'm sure its possible to do what we are doing without equality
>>>> comparison, but I'm not going to buy the argument of that being proof
>>>> it isn't a useful feature.
>>>>
>>>
>>> That makes no sense. If there's a different way to do what you need,
>>> which in no way negatively impacts the existing users, as well as allows
>>> them more freedom in how they use that functionality... we have a term for
>>> that. It's "a better way."
>>>
>>> We should not be encouraging a view of C++ where function/member
>>> pointers are given greater primacy than functors/lambdas.
>>>
>>> Maybe this type would not be useful for you - I don't know what types of
>>>> code you write. There is certainly stuff in the standard library I've never
>>>> used or found useful yet. But it is relevant because these things have
>>>> been found to be useful by quite a few people. Dozens of these things have
>>>> been created and continue to be. Why do these things continue to be created
>>>> when std::function already exists?
>>>>
>>>
>>> The same reasons people give for making new string types: greater
>>> control, performance benefits, herd mentality, inertia, legacy codebases,
>>> etc. There are many things people back-door in the standard library, for
>>> both good reasons and bad. Why is yours so special?
>>>
>>> Also: what people have found useful is *not* polymorphic function
>>> pointers. It's events/delegates/signals. And I'd bet they'd find them more
>>> useful if they could shove a lambda into them.
>>>
>>
>> Consider this example:
>>
>> There is some event E. Suppose we have two objects A and B. Object A can
>> have a dependency on B but B cannot have a dependency on A. Object A might
>> attach a member function of object B to E. Now a few different scenarios
>> might be allowed by program flow:
>> 1. Maybe Object A could go out of scope and B still might need the
>> capability to detach itself from E.
>>
>
> How could B possibly know that it needed to detach itself from E... if B
> were not informed that it had been attached to E?
>
>
>> 2. Maybe A would do the detach or Maybe B would do the detach whoever has
>> reason to do it first.
>>
>
> Yes, and in a similarly designed system, A might try to free memory owned
> by B, thus creating a problem when B goes to try to free that memory too.
>
> We have a solution to these: shared_ptr. If you think that this is so
> important a problem (I don't, because the example seems rather contrived),
> then clearly there needs to be a concept of shared ownership of
> connections: shared_connection.
>
>
>> 3. Maybe another Object C comes into existence and wants to detach B from
>> E.
>>
>
> ... I'm sorry, what? The idea that object C has any right to detact object
> B from E, when C has no established relationship to A or B, is *absurd*.
> Why would you *ever* write code that does this? How would this pass code
> review?
>
>
>> Where should this connection objects live? Maybe some global object?
>>
>
> You handle connections just like any other resource that needs
> termination: you made it, you own it. If someone else needs to own it, you
> transfer ownership to them. If you need to share ownership, you develop
> that ability. And so forth.
>
> 4. Maybe the above scenario is multiplied by few thousand with various
>> interactions. A global connection object for every conceivable connection?
>> Maybe a global matrix for every possible connection?
>>
>> This scenario could mimic a RPG game. Event E is some spell. Object A and
>> B are players. Spells are cast on other players by attaching to the
>> event/spell. Players can detach themselves by taking an antidote or some
>> other player casting a reverse spell.
>>
>
> OK, let's take that as an example. Let's say that we have object C that
> puts a debuff on B. And you want to model this as an event. Well... that
> debuff itself must be an *object*. It must be something more than just a
> naked pointer, because you're going to have to have many other things
> interacting with the debuff.
>
> For example, you need a UI element to appear when the debuff is active.
> Are you really going to run through the player object and look for specific
> functions for specific debuffs, then have some table mapping function
> pointer addresses to UI images? No; that's way too fragile and incredibly
> absurd. You look through each object's list of active debuffs, and the
> debuff type will reference a specific UI image (as well as other debuff
> properties).
>
> It is the setting of this debuff on an entity that sets up any events that
> are important for making it work. And it is the act of removing that debuff
> from an entity that removes those events.
>
> Object B has no right to be poking about at events in object A *directly*.
> It can add or remove debuffs, but debuffs (and similar objects) are the
> ones who are allowed to manipulate the actual events.
>
I didn't say the event was a member of A and I'll disagree with you and say
object B has every right to attach A to some event. Its a valid design.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_336_46464176.1431713909416
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Friday, May 15, 2015 at 1:06:06 PM UTC-5, Nicol=
Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px=
0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-le=
ft-width: 1px; border-left-style: solid;"><div dir=3D"ltr">On Friday, May 1=
5, 2015 at 11:43:48 AM UTC-4, Michael Boyko wrote:<blockquote class=3D"gmai=
l_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left=
-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: soli=
d;"><div dir=3D"ltr">On Friday, May 15, 2015 at 9:17:12 AM UTC-5, Nicol Bol=
as wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8=
ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-w=
idth: 1px; border-left-style: solid;"><div dir=3D"ltr">On Friday, May 15, 2=
015 at 9:37:53 AM UTC-4, Michael Boyko wrote:<blockquote class=3D"gmail_quo=
te" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-colo=
r: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;"><=
div dir=3D"ltr">On Friday, May 15, 2015 at 12:15:40 AM UTC-5, Nicol Bolas w=
rote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; =
padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width=
: 1px; border-left-style: solid;"><div dir=3D"ltr">On Thursday, May 14, 201=
5 at 10:41:29 PM UTC-4, <a>mash.bo...@gmail.com</a> wrote:<blockquote class=
=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; bor=
der-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-sty=
le: solid;"><div dir=3D"ltr"><div></div><div>I can offer my personal use of=
this library. In the last two companies I have worked for we used this lib=
rary (minus functor targets) with good results. The first project was on th=
e order of 400k lines of code and this library was used extensively through=
out. My current project is also making use of this library with equally goo=
d results. The primary use is callbacks and searching for matching callback=
s in lists and vectors.</div></div></blockquote><div><br>You seem to have m=
issed my question. Yes, by using code that allows you to compare function p=
ointers, you can have vectors and lists of function pointers and find match=
es in them. That's not in doubt.<br><br>The question is <i>why</i> you need=
to do that? What is your use case? Not merely that you used the functional=
ity, but what you were using it to accomplish.<br><br>You created an ordere=
d sequence of callable objects. Then, at some point in time, you searched t=
hat sequence of callable objects for a specific one. What were you doing th=
at you needed to do that? What was the problem that prompted you to search =
through the ordered list of callables for a specific callable?<br><br>And i=
f it's yet another event/delegate/signal implementation, then you've missed=
my point entirely. Because there's a better, more C++-friendly way to hand=
le that sort of thing.<br></div></div></blockquote><div><br></div><div>Basi=
cally it is searching containers of callbacks and adding/removing from that=
list.</div></div></blockquote><div><br>So it's just this event/delegate/si=
gnal thing.<br> </div><blockquote class=3D"gmail_quote" style=3D"margi=
n: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 2=
04); border-left-width: 1px; border-left-style: solid;"><div dir=3D"ltr"><d=
iv> Yes, we also have RAII scoped attach objects that are nice and used, bu=
t sometimes its not the right tool for the job (sometime a lock_guard =
is not the right tool and calling lock() and unlock() directly is).</d=
iv></div></blockquote><div><br>I don't know why you keep talking about "RAI=
I scoped attach objects". I've brought up <a onmousedown=3D"this.href=3D'ht=
tp://www.google.com/url?q\75http%3A%2F%2Fwww.boost.org%2Fdoc%2Flibs%2F1_58_=
0%2Fdoc%2Fhtml%2Fsignals2%2Ftutorial.html\46sa\75D\46sntz\0751\46usg\75AFQj=
CNENH33eiOhzaNqixonlq-Ww2xMlZQ';return true;" onclick=3D"this.href=3D'http:=
//www.google.com/url?q\75http%3A%2F%2Fwww.boost.org%2Fdoc%2Flibs%2F1_58_0%2=
Fdoc%2Fhtml%2Fsignals2%2Ftutorial.html\46sa\75D\46sntz\0751\46usg\75AFQjCNE=
NH33eiOhzaNqixonlq-Ww2xMlZQ';return true;" href=3D"http://www.boost.org/doc=
/libs/1_58_0/doc/html/signals2/tutorial.html" target=3D"_blank" rel=3D"nofo=
llow">Boost.Signal</a> as an alternative event/delegate/signal system sever=
al times. While it does use an attachment object for you to manipulate func=
tor bindings, these <a onmousedown=3D"this.href=3D'http://www.google.com/ur=
l?q\75http%3A%2F%2Fwww.boost.org%2Fdoc%2Flibs%2F1_58_0%2Fdoc%2Fhtml%2Fboost=
%2Fsignals2%2Fconnection.html\46sa\75D\46sntz\0751\46usg\75AFQjCNHJc5lW0Bfq=
BsW-d3SatKz1SwFXUw';return true;" onclick=3D"this.href=3D'http://www.google=
..com/url?q\75http%3A%2F%2Fwww.boost.org%2Fdoc%2Flibs%2F1_58_0%2Fdoc%2Fhtml%=
2Fboost%2Fsignals2%2Fconnection.html\46sa\75D\46sntz\0751\46usg\75AFQjCNHJc=
5lW0BfqBsW-d3SatKz1SwFXUw';return true;" href=3D"http://www.boost.org/doc/l=
ibs/1_58_0/doc/html/boost/signals2/connection.html" target=3D"_blank" rel=
=3D"nofollow">connection objects are <i>not </i>"RAII scoped"</a>.<br><br>T=
he use of connection objects does not require that they're RAII scoped. Tha=
t certainly should be an option, but just like with mutexes, they're not re=
quired.<br> </div><blockquote class=3D"gmail_quote" style=3D"margin: 0=
px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204);=
border-left-width: 1px; border-left-style: solid;"><div dir=3D"ltr"><div>I=
'm sure its possible to do what we are doing without equality comparison, b=
ut I'm not going to buy the argument of that being proof it isn't a us=
eful feature.</div></div></blockquote><div><br>That makes no sense. If ther=
e's a different way to do what you need, which in no way negatively impacts=
the existing users, as well as allows them more freedom in how they use th=
at functionality... we have a term for that. It's "a better way."<br><br>We=
should not be encouraging a view of C++ where function/member pointers are=
given greater primacy than functors/lambdas.<br><br></div><blockquote clas=
s=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; bo=
rder-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-st=
yle: solid;"><div dir=3D"ltr"><div></div><div>Maybe this type would not be =
useful for you - I don't know what types of code you write. There is certai=
nly stuff in the standard library I've never used or found useful yet. But =
it is relevant because these things have been found to be us=
eful by quite a few people. Dozens of these things have been created and co=
ntinue to be. Why do these things continue to be created when std::function=
already exists?</div></div></blockquote><div><br>The same reasons people g=
ive for making new string types: greater control, performance benefits, her=
d mentality, inertia, legacy codebases, etc. There are many things people b=
ack-door in the standard library, for both good reasons and bad. Why is you=
rs so special?<br><br>Also: what people have found useful is <i>not</i> pol=
ymorphic function pointers. It's events/delegates/signals. And I'd bet they=
'd find them more useful if they could shove a lambda into them.<br></div><=
/div></blockquote><div><br></div><div>Consider this example:</div><div><br>=
</div><div>There is some event E. Suppose we have two objects A and B. Obje=
ct A can have a dependency on B but B cannot have a dependency on A. Object=
A might attach a member function of object B to E. Now a few different sce=
narios might be allowed by program flow:</div><div>1. Maybe Object A&n=
bsp;could go out of scope and B still might need the capability to detach&n=
bsp;itself from E.</div></div></blockquote><div><br>How could B possibly kn=
ow that it needed to detach itself from E... if B were not informed that it=
had been attached to E?<br> </div><blockquote class=3D"gmail_quote" s=
tyle=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rg=
b(204, 204, 204); border-left-width: 1px; border-left-style: solid;"><div d=
ir=3D"ltr"><div>2. Maybe A would do the detach or Maybe B would do the deta=
ch whoever has reason to do it first.</div></div></blockquote><div><br>Yes,=
and in a similarly designed system, A might try to free memory owned by B,=
thus creating a problem when B goes to try to free that memory too.<br><br=
>We have a solution to these: shared_ptr. If you think that this is so impo=
rtant a problem (I don't, because the example seems rather contrived), then=
clearly there needs to be a concept of shared ownership of connections: sh=
ared_connection.<br> </div><blockquote class=3D"gmail_quote" style=3D"=
margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 2=
04, 204); border-left-width: 1px; border-left-style: solid;"><div dir=3D"lt=
r"><div>3. Maybe another Object C comes into existence and wants to detach =
B from E.</div></div></blockquote><div><br>... I'm sorry, what? The idea th=
at object C has any right to detact object B from E, when C has no establis=
hed relationship to A or B, is <i>absurd</i>. Why would you <i>ever</i> wri=
te code that does this? How would this pass code review?<br> </div><bl=
ockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-=
left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; b=
order-left-style: solid;"><div dir=3D"ltr"><div></div><div>Where should&nbs=
p; this connection objects live? Maybe some global object?</div></div></blo=
ckquote><div><br>You handle connections just like any other resource that n=
eeds termination: you made it, you own it. If someone else needs to own it,=
you transfer ownership to them. If you need to share ownership, you develo=
p that ability. And so forth.<br><br></div><blockquote class=3D"gmail_quote=
" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color:=
rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;"><di=
v dir=3D"ltr"><div><div></div><div>4. Maybe the above scenario is multiplie=
d by few thousand with various interactions. A global connection object for=
every conceivable connection? Maybe a global matrix for every possible&nbs=
p;connection?</div><div><br></div><div>This scenario could mimic a RPG game=
.. Event E is some spell. Object A and B are players. Spells are cast on oth=
er players by attaching to the event/spell. Players can detach themselves b=
y taking an antidote or some other player casting a reverse spell.</div></d=
iv></div></blockquote><div><br>OK, let's take that as an example. Let's say=
that we have object C that puts a debuff on B. And you want to model this =
as an event. Well... that debuff itself must be an <i>object</i>. It must b=
e something more than just a naked pointer, because you're going to have to=
have many other things interacting with the debuff.<br><br>For example, yo=
u need a UI element to appear when the debuff is active. Are you really goi=
ng to run through the player object and look for specific functions for spe=
cific debuffs, then have some table mapping function pointer addresses to U=
I images? No; that's way too fragile and incredibly absurd. You look throug=
h each object's list of active debuffs, and the debuff type will reference =
a specific UI image (as well as other debuff properties).<br><br>It is the =
setting of this debuff on an entity that sets up any events that are import=
ant for making it work. And it is the act of removing that debuff from an e=
ntity that removes those events.<br><br>Object B has no right to be poking =
about at events in object A <i>directly</i>. It can add or remove debuffs, =
but debuffs (and similar objects) are the ones who are allowed to manipulat=
e the actual events.<br></div></div></blockquote><div><br></div><div>I didn=
't say the event was a member of A and I'll disagree with you and say objec=
t B has every right to attach A to some event. Its a va=
lid design.</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_336_46464176.1431713909416--
------=_Part_335_344862547.1431713909416--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Fri, 15 May 2015 11:41:18 -0700 (PDT)
Raw View
------=_Part_1041_539864701.1431715278235
Content-Type: multipart/alternative;
boundary="----=_Part_1042_387621132.1431715278235"
------=_Part_1042_387621132.1431715278235
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 2:18:29 PM UTC-4, Michael Boyko wrote:
>
> I didn't say the event was a member of A and I'll disagree with you and
> say object B has every right to attach A to some event. Its a valid design.
>
Let's say that object B has the right to attach object A to an event. OK,
fine.
But rights come with *responsibilities*. If you design a system such that
object B has the right to attach some other object A to events, then object
B must take on the responsibility to manage that attachment. It needs to
make sure that A is not destroyed before the connection is broken, for
example. Because B has done this without A's knowledge, this responsibility
must rest on B's shoulders, since it got A involved.
There are several ways to handle this. Maybe B stored a shared_ptr<A> in
the event. Maybe B tells A that it has been connected, so its destructor
can disconnect it (which also requires that it be able to detect if the
event E is destroyed). Maybe there's some higher-level construct that is
informed by B that a connection between A and E has been formed, so it will
destroy them when A is being destroyed. Or maybe you have an a priori
assumption that A will always outlive whatever event objects it gets
attached to.
That last one? I don't see how that is "valid design" in most cases. It's
certainly not something that should be *encouraged* or made the default
case. Ignoring one's responsibilities and pretending they don't exist is
not an effective solution to most problems.
Oh, and here's an interesting way to handle it. Instead of registering a
member pointer + shared_ptr<A> (assuming your `fun_ptr` can even handle
that), you instead register a lambda that looks like this:
[ptr = weak_ptr<A>{smart_ptr}](...)
{
shared_ptr<A> p = ptr.lock();
if(p) { return p->MemberFunction(...);}
return {};
}
Oh but that's right; you can't register a lambda with your `fun_ptr` type.
Too bad; either your event system handles weak relationships manually
(which is admittedly reasonable... though you wouldn't be able to use your
`fun_ptr` type to do it), or you're SOL.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_1042_387621132.1431715278235
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Friday, May 15, 2015 at 2:18:29 PM UTC-4, Michael Boyko=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.=
8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><=
/div><div>I didn't say the event was a member of A and I'll disagree with y=
ou and say object B has every right to attach A to some=
event. Its a valid design.</div></div></blockquote><div><br>Let's say that=
object B has the right to attach object A to an event. OK, fine.<br><br>Bu=
t rights come with <i>responsibilities</i>. If you design a system such tha=
t object B has the right to attach some other object A to events, then obje=
ct B must take on the responsibility to manage that attachment. It needs to=
make sure that A is not destroyed before the connection is broken, for exa=
mple. Because B has done this without A's knowledge, this responsibility mu=
st rest on B's shoulders, since it got A involved.<br><br>There are several=
ways to handle this. Maybe B stored a shared_ptr<A> in the event. Ma=
ybe B tells A that it has been connected, so its destructor can disconnect =
it (which also requires that it be able to detect if the event E is destroy=
ed). Maybe there's some higher-level construct that is informed by B that a=
connection between A and E has been formed, so it will destroy them when A=
is being destroyed. Or maybe you have an a priori assumption that A will a=
lways outlive whatever event objects it gets attached to.<br><br>That last =
one? I don't see how that is "valid design" in most cases. It's certainly n=
ot something that should be <i>encouraged</i> or made the default case. Ign=
oring one's responsibilities and pretending they don't exist is not an effe=
ctive solution to most problems.<br><br>Oh, and here's an interesting way t=
o handle it. Instead of registering a member pointer + shared_ptr<A> =
(assuming your `fun_ptr` can even handle that), you instead register a lamb=
da that looks like this:<br><br><div class=3D"prettyprint" style=3D"backgro=
und-color: rgb(250, 250, 250); border-color: rgb(187, 187, 187); border-sty=
le: solid; border-width: 1px; word-wrap: break-word;"><code class=3D"pretty=
print"><div class=3D"subprettyprint"><span style=3D"color: #660;" class=3D"=
styled-by-prettify">[</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify">ptr </span><span style=3D"color: #660;" class=3D"styled-by-prett=
ify">=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> w=
eak_ptr</span><span style=3D"color: #660;" class=3D"styled-by-prettify"><=
;</span><span style=3D"color: #000;" class=3D"styled-by-prettify">A</span><=
span style=3D"color: #660;" class=3D"styled-by-prettify">>{</span><span =
style=3D"color: #000;" class=3D"styled-by-prettify">smart_ptr</span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify">}](...)</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"c=
olor: #660;" class=3D"styled-by-prettify">{</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"><br> shared_ptr</span><span style=3D=
"color: #660;" class=3D"styled-by-prettify"><</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify">A</span><span style=3D"color: #660;" =
class=3D"styled-by-prettify">></span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> p </span><span style=3D"color: #660;" class=3D"sty=
led-by-prettify">=3D</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> ptr</span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">.</span><span style=3D"color: #008;" class=3D"styled-by-prettify">lock<=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">();</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"><br> </span>=
<span style=3D"color: #008;" class=3D"styled-by-prettify">if</span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify">p</span><span style=3D"color: #660=
;" class=3D"styled-by-prettify">)</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D"style=
d-by-prettify">{</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">ret=
urn</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> p</spa=
n><span style=3D"color: #660;" class=3D"styled-by-prettify">-></span><sp=
an style=3D"color: #606;" class=3D"styled-by-prettify">MemberFunction</span=
><span style=3D"color: #660;" class=3D"styled-by-prettify">(...);}</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"><br> </span><=
span style=3D"color: #008;" class=3D"styled-by-prettify">return</span><span=
style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D=
"color: #660;" class=3D"styled-by-prettify">{};</span><span style=3D"color:=
#000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">}</span></div></code></div><br>Oh but that's=
right; you can't register a lambda with your `fun_ptr` type. Too bad; eith=
er your event system handles weak relationships manually (which is admitted=
ly reasonable... though you wouldn't be able to use your `fun_ptr` type to =
do it), or you're SOL.<br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_1042_387621132.1431715278235--
------=_Part_1041_539864701.1431715278235--
.
Author: Nevin Liber <nevin@eviloverlord.com>
Date: Fri, 15 May 2015 16:35:26 -0500
Raw View
--089e011767f9c46a6b051625a1df
Content-Type: text/plain; charset=UTF-8
On 14 May 2015 at 19:29, Nicol Bolas <jmckesson@gmail.com> wrote:
> Ugh. How many other gotcha cases are there with regard to function
> equality?
You want another one? Take the following generic functor:
template<typename T>
struct Functor
{
explicit Functor(T t) : data(std::move(t)) {}
void operator()() const { return data(); }
friend bool operator==(Functor const& l, Functor const& r)
{ return l.data == r.data; }
T data;
};
What will a type trait / concept for equality comparable return for T?
1. Yes
2. No
3. Depends on T
What will a type trait / concept for equality comparable return for
Functor<T>?
1. Yes
2. No
3. Depends on T
Feel free to try it with, say, has_equal_to
<http://www.boost.org/doc/libs/1_58_0/libs/type_traits/doc/html/boost_typetraits/reference/has_equal_to.html>,
and then think about the implications...
As the expression goes, this is just like shooting fish in a barrel...
--
Nevin ":-)" Liber <mailto:nevin@eviloverlord.com> (847) 691-1404
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--089e011767f9c46a6b051625a1df
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div class=3D"gmail_extra">On 14 May 2015 at 19:29, Nicol =
Bolas <span dir=3D"ltr"><<a href=3D"mailto:jmckesson@gmail.com" target=
=3D"_blank">jmckesson@gmail.com</a>></span> wrote:<br><div class=3D"gmai=
l_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;borde=
r-left:1px #ccc solid;padding-left:1ex">Ugh. How many other gotcha cases ar=
e there with regard to function equality?</blockquote></div><br>You want an=
other one?=C2=A0 Take the following generic functor:</div><div class=3D"gma=
il_extra"><br></div><div class=3D"gmail_extra">template<typename T></=
div><div class=3D"gmail_extra">struct Functor</div><div class=3D"gmail_extr=
a">{</div><div class=3D"gmail_extra">=C2=A0 =C2=A0 explicit Functor(T t) : =
data(std::move(t)) {}</div><div class=3D"gmail_extra"><br></div><div class=
=3D"gmail_extra">=C2=A0 =C2=A0 void operator()() const { return data(); }</=
div><div class=3D"gmail_extra"><br></div><div class=3D"gmail_extra">=C2=A0 =
=C2=A0 friend bool operator=3D=3D(Functor const& l, Functor const& =
r)</div><div class=3D"gmail_extra">=C2=A0 =C2=A0 { return l.data =3D=3D r.d=
ata; }</div><div class=3D"gmail_extra"><br></div><div class=3D"gmail_extra"=
>=C2=A0 =C2=A0 T data;</div><div class=3D"gmail_extra">};</div><div class=
=3D"gmail_extra"><br></div><div class=3D"gmail_extra">What will a type trai=
t / concept for equality comparable return for T?</div><div class=3D"gmail_=
extra"><ol><li>Yes</li><li>No</li><li>Depends on T</li></ol><div>What will =
a type trait / concept for equality comparable return for Functor<T>?=
</div><div><ol><li>Yes</li><li>No</li><li>Depends on T</li></ol><div>Feel f=
ree to try it with, say, <a href=3D"http://www.boost.org/doc/libs/1_58_0/li=
bs/type_traits/doc/html/boost_typetraits/reference/has_equal_to.html">has_e=
qual_to</a>, and then think about the implications...</div><div><br></div><=
div><br></div><div>As the expression goes, this is just like shooting fish =
in a barrel...</div><div>--=C2=A0<br></div></div><div class=3D"gmail_signat=
ure">=C2=A0Nevin ":-)" Liber=C2=A0 <mailto:<a href=3D"mailto:n=
evin@eviloverlord.com" target=3D"_blank">nevin@eviloverlord.com</a>>=C2=
=A0 (847) 691-1404</div>
</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--089e011767f9c46a6b051625a1df--
.
Author: David Krauss <potswa@mac.com>
Date: Sat, 16 May 2015 07:28:37 +0800
Raw View
--Apple-Mail=_745A7A1C-5D5F-4069-BB23-2EF95CDF8909
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9316, at 5:35 AM, Nevin Liber <nevin@eviloverlor=
d.com> wrote:
>=20
> What will a type trait / concept for equality comparable return for T?
> Depends on T
=E2=80=A6 And if No, it=E2=80=99s a hard failure for Functor.
> What will a type trait / concept for equality comparable return for Funct=
or<T>?
> Yes
=E2=80=A6 Because it=E2=80=99s an intrinsic requirement of Functor.
> Feel free to try it with, say, has_equal_to <http://www.boost.org/doc/lib=
s/1_58_0/libs/type_traits/doc/html/boost_typetraits/reference/has_equal_to.=
html>, and then think about the implications=E2=80=A6
This how template argument requirements have always worked: duck-type speci=
fication, internal failure on violation. You =E2=80=9Cjust=E2=80=9D have to=
disable the operator=3D=3D declaration, with SFINAE or Concepts, if it=E2=
=80=99s supposed to be optional.
Will someone see a comparable std::function cause such errors? Probably. Bu=
t the code was arguably broken in the first place. The same failure mode wi=
ll be exposed by implicit operator=3D=3D, any time it sees a Functor<T> mem=
ber.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_745A7A1C-5D5F-4069-BB23-2EF95CDF8909
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=80=9305=
=E2=80=9316, at 5:35 AM, Nevin Liber <<a href=3D"mailto:nevin@eviloverlo=
rd.com" class=3D"">nevin@eviloverlord.com</a>> wrote:</div><br class=3D"=
Apple-interchange-newline"><div class=3D""><div dir=3D"ltr" class=3D""><div=
class=3D"gmail_extra">What will a type trait / concept for equality compar=
able return for T?</div><div class=3D"gmail_extra"><ol class=3D""><li class=
=3D"">Depends on T</li></ol></div></div></div></blockquote>=E2=80=A6 And if=
No, it=E2=80=99s a hard failure for Functor.<div><br class=3D""></div><blo=
ckquote type=3D"cite" class=3D""><div dir=3D"ltr" class=3D""><div class=3D"=
gmail_extra"><div class=3D"">What will a type trait / concept for equality =
comparable return for Functor<T>?</div><div class=3D""><ol class=3D""=
><li class=3D"">Yes</li></ol></div></div></div></blockquote><div>=E2=80=A6 =
Because it=E2=80=99s an intrinsic requirement of Functor.</div><div class=
=3D""><br class=3D""></div><blockquote type=3D"cite" class=3D""><div class=
=3D""><div dir=3D"ltr" class=3D""><div class=3D"gmail_extra"><div class=3D"=
"><div class=3D"">Feel free to try it with, say, <a href=3D"http://www.boos=
t.org/doc/libs/1_58_0/libs/type_traits/doc/html/boost_typetraits/reference/=
has_equal_to.html" class=3D"">has_equal_to</a>, and then think about the im=
plications=E2=80=A6</div></div></div></div></div></blockquote><br class=3D"=
"></div><div>This how template argument requirements have always worked: du=
ck-type specification, internal failure on violation. You =E2=80=9Cjust=E2=
=80=9D have to disable the <font face=3D"Courier" class=3D"">operator=3D=3D=
</font> declaration, with SFINAE or Concepts, if it=E2=80=99s supposed to b=
e optional.</div><div><br class=3D""></div><div>Will someone see a comparab=
le <font face=3D"Courier" class=3D"">std::function</font> cause such errors=
? Probably. But the code was arguably broken in the first place. The same f=
ailure mode will be exposed by implicit <font face=3D"Courier" class=3D"">o=
perator=3D=3D</font>, any time it sees a <font face=3D"Courier" class=
=3D"">Functor<T></font> member.</div></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_745A7A1C-5D5F-4069-BB23-2EF95CDF8909--
.
Author: David Krauss <potswa@mac.com>
Date: Sat, 16 May 2015 07:41:29 +0800
Raw View
--Apple-Mail=_4FD1EFEB-2AAA-4E08-B6E6-843F5D0FE2A1
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9316, at 7:28 AM, David Krauss <potswa@mac.com> =
wrote:
>=20
> The same failure mode will be exposed by implicit operator=3D=3D, any tim=
e it sees a Functor<T> member.
=E2=80=A6 I get the strong sense that EWG isn=E2=80=99t interested in every=
user=E2=80=99s potential internal template errors. New features include br=
eaking changes, and hardly anything won=E2=80=99t break a sufficiently brit=
tle template.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_4FD1EFEB-2AAA-4E08-B6E6-843F5D0FE2A1
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=80=9305=
=E2=80=9316, at 7:28 AM, David Krauss <<a href=3D"mailto:potswa@mac.com"=
class=3D"">potswa@mac.com</a>> wrote:</div><br class=3D"Apple-interchan=
ge-newline"><div class=3D""><span style=3D"font-family: Helvetica; font-siz=
e: 12px; font-style: normal; font-variant: normal; font-weight: normal; let=
ter-spacing: normal; line-height: normal; orphans: auto; text-align: start;=
text-indent: 0px; text-transform: none; white-space: normal; widows: auto;=
word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: i=
nline !important;" class=3D"">The same failure mode will be exposed by impl=
icit<span class=3D"Apple-converted-space"> </span></span><font face=3D=
"Courier" class=3D"" style=3D"font-size: 12px; font-style: normal; font-var=
iant: normal; font-weight: normal; letter-spacing: normal; line-height: nor=
mal; orphans: auto; text-align: start; text-indent: 0px; text-transform: no=
ne; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stro=
ke-width: 0px;">operator=3D=3D</font><span style=3D"font-family: Helvetica;=
font-size: 12px; font-style: normal; font-variant: normal; font-weight: no=
rmal; letter-spacing: normal; line-height: normal; orphans: auto; text-alig=
n: start; text-indent: 0px; text-transform: none; white-space: normal; wido=
ws: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; d=
isplay: inline !important;" class=3D"">, any time it sees a </span><fo=
nt face=3D"Courier" class=3D"" style=3D"font-size: 12px; font-style: normal=
; font-variant: normal; font-weight: normal; letter-spacing: normal; line-h=
eight: normal; orphans: auto; text-align: start; text-indent: 0px; text-tra=
nsform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit=
-text-stroke-width: 0px;">Functor<T></font><span style=3D"font-family=
: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; fon=
t-weight: normal; letter-spacing: normal; line-height: normal; orphans: aut=
o; text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; fl=
oat: none; display: inline !important;" class=3D""> member.</span></di=
v></blockquote></div><br class=3D""><div class=3D"">=E2=80=A6 I get the str=
ong sense that EWG isn=E2=80=99t interested in every user=E2=80=99s potenti=
al internal template errors. New features include breaking changes, and har=
dly anything <i class=3D"">won=E2=80=99t</i> break a sufficiently brit=
tle template.</div></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_4FD1EFEB-2AAA-4E08-B6E6-843F5D0FE2A1--
.
Author: Nevin Liber <nevin@eviloverlord.com>
Date: Fri, 15 May 2015 23:33:32 -0500
Raw View
--089e014942040f218605162b798e
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On 15 May 2015 at 18:41, David Krauss <potswa@mac.com> wrote:
> =E2=80=A6 I get the strong sense that EWG isn=E2=80=99t interested in eve=
ry user=E2=80=99s
> potential internal template errors. New features include breaking changes=
,
> and hardly anything *won=E2=80=99t* break a sufficiently brittle template=
..
>
I guess we'll find out for sure when you propose this "improvement" to
std::function...
--=20
Nevin ":-)" Liber <mailto:nevin@eviloverlord.com> (847) 691-1404
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--089e014942040f218605162b798e
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div class=3D"gmail_extra">On 15 May 2015 at 18:41, David =
Krauss <span dir=3D"ltr"><<a href=3D"mailto:potswa@mac.com" target=3D"_b=
lank">potswa@mac.com</a>></span> wrote:<br><div class=3D"gmail_quote"><b=
lockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px =
#ccc solid;padding-left:1ex"><div style=3D"word-wrap:break-word"><div>=E2=
=80=A6 I get the strong sense that EWG isn=E2=80=99t interested in every us=
er=E2=80=99s potential internal template errors. New features include break=
ing changes, and hardly anything <i>won=E2=80=99t</i>=C2=A0break a sufficie=
ntly brittle template.</div></div></blockquote><div><br></div><div>I guess =
we'll find out for sure when you propose this "improvement" t=
o std::function...</div></div>-- <br><div class=3D"gmail_signature">=C2=A0N=
evin ":-)" Liber=C2=A0 <mailto:<a href=3D"mailto:nevin@evilove=
rlord.com" target=3D"_blank">nevin@eviloverlord.com</a>>=C2=A0 (847) 691=
-1404</div>
</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--089e014942040f218605162b798e--
.
Author: David Krauss <potswa@mac.com>
Date: Sat, 16 May 2015 12:49:07 +0800
Raw View
--Apple-Mail=_4C64A96A-786E-44CF-B46E-BF9F5459DF87
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9316, at 12:33 PM, Nevin Liber <nevin@eviloverlo=
rd.com> wrote:
>=20
> I guess we'll find out for sure when you propose this "improvement" to st=
d::function=E2=80=A6
Unfortunately, I=E2=80=99m not convinced of its motivation. Personally, I=
=E2=80=99ve wanted target<void> in the past. But I=E2=80=99ve never wanted =
to compare std::functions.
Anyone who wants to pick up the ball is free to run with it.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_4C64A96A-786E-44CF-B46E-BF9F5459DF87
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=80=9305=
=E2=80=9316, at 12:33 PM, Nevin Liber <<a href=3D"mailto:nevin@eviloverl=
ord.com" class=3D"">nevin@eviloverlord.com</a>> wrote:</div><br class=3D=
"Apple-interchange-newline"><div class=3D""><div dir=3D"ltr" class=3D""><di=
v class=3D"gmail_extra"><div class=3D"gmail_quote"><div class=3D"">I guess =
we'll find out for sure when you propose this "improvement" to std::functio=
n=E2=80=A6</div></div></div></div></div></blockquote><br class=3D""></div><=
div>Unfortunately, I=E2=80=99m not convinced of its motivation. Personally,=
I=E2=80=99ve wanted <font face=3D"Courier" class=3D"">target<void></=
font> in the past. But I=E2=80=99ve never wanted to compare <font face=3D"C=
ourier" class=3D"">std::function</font>s.</div><div><br class=3D""></div><d=
iv>Anyone who wants to pick up the ball is free to run with it.</div></body=
></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_4C64A96A-786E-44CF-B46E-BF9F5459DF87--
.
Author: David Krauss <potswa@mac.com>
Date: Sat, 16 May 2015 14:03:07 +0800
Raw View
--Apple-Mail=_592B3D9B-206C-4D6D-AB34-8940B040D944
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9316, at 12:49 PM, David Krauss <potswa@mac.com>=
wrote:
>=20
> Anyone who wants to pick up the ball is free to run with it.
Actually, the implementation I described could be generalized into a facili=
ty for registering type-based metadata for inclusion into erasures. This co=
uld be used to implement things like target_type and comparison.
The user would associate the type to be erased with a type-list of tags map=
ping to compile-time constants. The implementation would turn that into a t=
ype_index-based map inside the erasure.
struct thing : foo {
// Register compile-time constants for post-erasure availability:
static constexpr auto erasure_info =3D static_tag_map(
{ std::comparison_fptr_tag{}, & compare_foos },
{ kind_tag{}, enum classifications::thing }
);
void operator();
};
// Erase the type a couple ways:
std::function< void() > f =3D thing{};
std::any a =3D thing{};
// Still get the data back:
assert ( f.get< kind_tag >() =3D=3D a.get< kind_tag >() );
// It=E2=80=99s really a runtime thing now:
try {
f.get< some_other_tag >();
} catch ( std::bad_erasure_info & ) {
std::cout << "Erasure entry not found." );
}
Implementing this would be a fair bit harder, but it would supply sorely-ne=
eded polymorphism to all type erasure facilities.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_592B3D9B-206C-4D6D-AB34-8940B040D944
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=80=9305=
=E2=80=9316, at 12:49 PM, David Krauss <<a href=3D"mailto:potswa@mac.com=
" class=3D"">potswa@mac.com</a>> wrote:</div><br class=3D"Apple-intercha=
nge-newline"><div class=3D""><span style=3D"font-family: Helvetica; font-si=
ze: 12px; font-style: normal; font-variant: normal; font-weight: normal; le=
tter-spacing: normal; line-height: normal; orphans: auto; text-align: start=
; text-indent: 0px; text-transform: none; white-space: normal; widows: auto=
; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: =
inline !important;" class=3D"">Anyone who wants to pick up the ball is free=
to run with it.</span></div></blockquote></div><br class=3D""><div class=
=3D"">Actually, the implementation I described could be generalized into a =
facility for registering type-based metadata for inclusion into erasures. T=
his could be used to implement things like <font face=3D"Courier" class=3D"=
">target_type</font> and comparison.</div><div class=3D""><br class=3D=
""></div><div class=3D"">The user would associate the type to be erased wit=
h a type-list of tags mapping to compile-time constants. The implementation=
would turn that into a <font face=3D"Courier" class=3D"">type_index</font>=
-based map inside the erasure.</div><div class=3D""><br class=3D""></div><d=
iv class=3D""><font face=3D"Courier" class=3D"">struct thing : foo {</font>=
</div><div class=3D""><font face=3D"Courier" class=3D""> // Re=
gister compile-time constants for post-erasure availability:</font></div><d=
iv class=3D""><font face=3D"Courier" class=3D""> static conste=
xpr auto erasure_info =3D static_tag_map(</font></div><div class=3D""><font=
face=3D"Courier" class=3D""> { std::comparison_=
fptr_tag{}, & compare_foos },</font></div><div class=3D""><font face=3D=
"Courier" class=3D""> { kind_tag{}, enum classif=
ications::thing }</font></div><div class=3D""><span style=3D"font-family: C=
ourier;" class=3D""> );</span></div><div class=3D""><font face=
=3D"Courier" class=3D""><br class=3D""></font></div><div class=3D""><font f=
ace=3D"Courier" class=3D""> void operator();</font></div><div =
class=3D""><font face=3D"Courier" class=3D"">};</font></div><div class=3D""=
><font face=3D"Courier" class=3D""><br class=3D""></font></div><div class=
=3D""><font face=3D"Courier" class=3D"">// Erase the type a couple ways:</f=
ont></div><div class=3D""><font face=3D"Courier" class=3D"">std::function&l=
t; void() > f =3D thing{};</font></div><div class=3D""><font face=3D"Cou=
rier" class=3D"">std::any a =3D thing{};</font></div><div class=3D""><font =
face=3D"Courier" class=3D""><br class=3D""></font></div><div class=3D""><fo=
nt face=3D"Courier" class=3D"">// Still get the data back:</font></div><div=
class=3D""><font face=3D"Courier" class=3D"">assert ( f.get< </fon=
t><span style=3D"font-family: Courier;" class=3D"">kind_tag</span><font fac=
e=3D"Courier" class=3D""> >() =3D=3D a.get< kind_tag >() );</=
font></div><div class=3D""><font face=3D"Courier" class=3D""><br class=3D""=
></font></div><div class=3D""><font face=3D"Courier" class=3D"">// It=E2=80=
=99s really a runtime thing now:</font></div><div class=3D""><font face=3D"=
Courier" class=3D"">try {</font></div><div class=3D""><font face=3D"Courier=
" class=3D""> f.get< some_other_tag >();</font></div><di=
v class=3D""><font face=3D"Courier" class=3D"">} catch ( std::bad_erasure_i=
nfo & ) {</font></div><div class=3D""><font face=3D"Courier" class=3D""=
> std::cout << "Erasure entry not found." );</font></div=
><div class=3D""><font face=3D"Courier" class=3D"">}</font></div><div class=
=3D""><br class=3D""></div><div class=3D"">Implementing this would be a fai=
r bit harder, but it would supply sorely-needed polymorphism to all type er=
asure facilities.</div></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_592B3D9B-206C-4D6D-AB34-8940B040D944--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Fri, 15 May 2015 23:38:40 -0700 (PDT)
Raw View
------=_Part_1302_598251631.1431758320235
Content-Type: multipart/alternative;
boundary="----=_Part_1303_296726963.1431758320235"
------=_Part_1303_296726963.1431758320235
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On Saturday, May 16, 2015 at 2:03:33 AM UTC-4, David Krauss wrote:
>
>
> On 2015=E2=80=9305=E2=80=9316, at 12:49 PM, David Krauss <pot...@mac.com =
<javascript:>>=20
> wrote:
>
> Anyone who wants to pick up the ball is free to run with it.
>
>
> Actually, the implementation I described could be generalized into a=20
> facility for registering type-based metadata for inclusion into erasures.=
=20
> This could be used to implement things like target_type and comparison.
> <snip>
>
That all seems suspiciously like something reflection ought to be able to=
=20
handle.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_1303_296726963.1431758320235
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Saturday, May 16, 2015 at 2:03:33 AM UTC-4, Dav=
id Krauss wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin=
-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div style=3D"=
word-wrap:break-word"><br><div><blockquote type=3D"cite"><div>On 2015=E2=80=
=9305=E2=80=9316, at 12:49 PM, David Krauss <<a href=3D"javascript:" tar=
get=3D"_blank" gdf-obfuscated-mailto=3D"_AE88bJbg2AJ" rel=3D"nofollow" onmo=
usedown=3D"this.href=3D'javascript:';return true;" onclick=3D"this.href=3D'=
javascript:';return true;">pot...@mac.com</a>> wrote:</div><br><div><spa=
n style=3D"font-family:Helvetica;font-size:12px;font-style:normal;font-vari=
ant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text=
-align:start;text-indent:0px;text-transform:none;white-space:normal;word-sp=
acing:0px;float:none;display:inline!important">Anyone who wants to pick up =
the ball is free to run with it.</span></div></blockquote></div><br><div>Ac=
tually, the implementation I described could be generalized into a facility=
for registering type-based metadata for inclusion into erasures. This coul=
d be used to implement things like <font face=3D"Courier">target_type</font=
> and comparison.<br><snip><br></div></div></blockquote><div><br=
>That all seems suspiciously like something reflection ought to be able to =
handle.</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_1303_296726963.1431758320235--
------=_Part_1302_598251631.1431758320235--
.
Author: David Krauss <potswa@mac.com>
Date: Sat, 16 May 2015 14:44:34 +0800
Raw View
> On 2015=E2=80=9305=E2=80=9316, at 2:38 PM, Nicol Bolas <jmckesson@gmail.c=
om> wrote:
>=20
> That all seems suspiciously like something reflection ought to be able to=
handle.
Which part? Compile-time reflection can=E2=80=99t see an erased type.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sat, 16 May 2015 00:14:55 -0700 (PDT)
Raw View
------=_Part_1430_610632128.1431760496022
Content-Type: multipart/alternative;
boundary="----=_Part_1431_69826283.1431760496023"
------=_Part_1431_69826283.1431760496023
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On Saturday, May 16, 2015 at 2:44:45 AM UTC-4, David Krauss wrote:
>
>
> > On 2015=E2=80=9305=E2=80=9316, at 2:38 PM, Nicol Bolas <jmck...@gmail.c=
om <javascript:>>=20
> wrote:=20
> >=20
> > That all seems suspiciously like something reflection ought to be able=
=20
> to handle.=20
>
> Which part? Compile-time reflection can=E2=80=99t see an erased type.
>
The part about associating a type with a compile-time value. Rather than=20
having to put code explicitly within each class like that, some form of=20
compile-time reflection should be able to associate compile-time "named"=20
values with classes, so that they can be compile-time retrieved later.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_1431_69826283.1431760496023
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Saturday, May 16, 2015 at 2:44:45 AM UTC-4, Dav=
id Krauss wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin=
-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<br>> On 2015=E2=80=9305=E2=80=9316, at 2:38 PM, Nicol Bolas <<a href=
=3D"javascript:" target=3D"_blank" gdf-obfuscated-mailto=3D"AS7zcPFplXQJ" r=
el=3D"nofollow" onmousedown=3D"this.href=3D'javascript:';return true;" oncl=
ick=3D"this.href=3D'javascript:';return true;">jmck...@gmail.com</a>> wr=
ote:
<br>>=20
<br>> That all seems suspiciously like something reflection ought to be =
able to handle.
<br>
<br>Which part? Compile-time reflection can=E2=80=99t see an erased type.<b=
r></blockquote><div><br>The part about associating a type with a compile-ti=
me value. Rather than having to put code explicitly within each class like =
that, some form of compile-time reflection should be able to associate comp=
ile-time "named" values with classes, so that they can be compile-time retr=
ieved later.<br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_1431_69826283.1431760496023--
------=_Part_1430_610632128.1431760496022--
.
Author: David Krauss <potswa@mac.com>
Date: Sat, 16 May 2015 15:18:35 +0800
Raw View
--Apple-Mail=_036FD904-C502-401D-90E6-975BDBDB4069
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9316, at 3:14 PM, Nicol Bolas <jmckesson@gmail.c=
om> wrote:
>=20
> The part about associating a type with a compile-time value. Rather than =
having to put code explicitly within each class like that, some form of com=
pile-time reflection should be able to associate compile-time "named" value=
s with classes, so that they can be compile-time retrieved later.
There are various ways of doing that interface, I just chose something simp=
le for illustration.
Also, the member .get<tag>() might not be a great interface either. That ps=
eudocode is only a serving suggestion.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_036FD904-C502-401D-90E6-975BDBDB4069
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=80=9305=
=E2=80=9316, at 3:14 PM, Nicol Bolas <<a href=3D"mailto:jmckesson@gmail.=
com" class=3D"">jmckesson@gmail.com</a>> wrote:</div><br class=3D"Apple-=
interchange-newline"><div class=3D""><div dir=3D"ltr" class=3D"">The part a=
bout associating a type with a compile-time value. Rather than having to pu=
t code explicitly within each class like that, some form of compile-time re=
flection should be able to associate compile-time "named" values with class=
es, so that they can be compile-time retrieved later.</div></div></blockquo=
te><br class=3D""></div><div>There are various ways of doing that interface=
, I just chose something simple for illustration.</div><div><br class=3D"">=
</div><div>Also, the member <font face=3D"Courier" class=3D"">.get<tag&g=
t;()</font> might not be a great interface either. That pseudocode is only =
a serving suggestion.</div></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_036FD904-C502-401D-90E6-975BDBDB4069--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Sat, 16 May 2015 20:47:41 -0700 (PDT)
Raw View
------=_Part_10_23927195.1431834461502
Content-Type: multipart/alternative;
boundary="----=_Part_11_564924376.1431834461502"
------=_Part_11_564924376.1431834461502
Content-Type: text/plain; charset=UTF-8
On Friday, May 15, 2015 at 12:08:04 AM UTC-5, Nicol Bolas wrote:
>
>
>
> On Thursday, May 14, 2015 at 11:13:51 PM UTC-4, mash.bo...@gmail.com
> wrote:
>>
>> I think discussing if two functors is equal or not is interesting but the
>> real question is what does it mean for a function pointer to be equal to
>> another function pointer. I don't think the state of the functor being
>> pointed to is all that important. The only property (or salient attribute)
>> that matters is does the pointer point to the same object and function or
>> not. It is a shallow comparison not a deep one.
>>
>
> And I could find someone who believes quite differently. That what matters
> for function equality is that passing the same parameters will produce the
> same results and same side-effects, for all possible sets of parameters
> (given other invariants like global state and the like). In this case, the
> state of functors is very relevant. What is conceptually calling the same
> code, but do different things based on internal state. But if the internal
> state compares equal, then they are the same functor.
>
After careful consideration of the discussion here I have changed my mind -
state is what is important for functor equality. A few thoughts based on
this:
1. mutable functors seems to be a different class than non mutable
functors. I'm not sure or not if they fall under function pointer
semantics. It would be akin to a function pointer changing each time it was
invoked.
2. There is a proposal to make std::function thread safe by removing
support for lambda/functors that do not have a const operator(). In light
of this if only non mutable lambda's are considered then type alone is all
that would be required guarantee equality. Said another way if two non
mutable lambda functions have the same type they have the same behavior. I
think that is correct. The problem is there currently is not a way to
distinguish a lambda from a user defined functor.
3. operator== should probably be noexcept and if equality can't be
determined for a particular class of function types the result would then
be unspecified. This follows the pattern c++ adopted for comparing virtual
functions. This then allows future c++ features (concepts, default==, type
traits, etc.) to possibly support another class of functions without
breaking code. The result of the compare simply changes from unspecified to
having a definite defined result which is a non breaking change. If it were
to throw an exception and then its wanted to change from throwing to have a
definite result that would be a breaking change.
So as of now standalone, member, lambda's that convert to function pointer,
and user defined functors that would define operator== have a clear path of
allowing operator==.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_11_564924376.1431834461502
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Friday, May 15, 2015 at 12:08:04 AM UTC-5, Nico=
l Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-l=
eft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"=
><br><br>On Thursday, May 14, 2015 at 11:13:51 PM UTC-4, <a>mash.bo...@gmai=
l.com</a> wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-=
left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><d=
iv>I think discussing if two functors is equal or not is interesting but th=
e real question is what does it mean for a function pointer to be equal to =
another function pointer. I don't think the state of the functor being poin=
ted to is all that important. The only property (or salient attribute) that=
matters is does the pointer point to the same object and function or not. =
It is a shallow comparison not a deep one.</div></div></blockquote><div><br=
>And I could find someone who believes quite differently. That what matters=
for function equality is that passing the same parameters will produce the=
same results and same side-effects, for all possible sets of parameters (g=
iven other invariants like global state and the like). In this case, the st=
ate of functors is very relevant. What is conceptually calling the same cod=
e, but do different things based on internal state. But if the internal sta=
te compares equal, then they are the same functor.</div></div></blockquote>=
<div><br></div><div>After careful consideration of the discussion here I ha=
ve changed my mind - state is what is important for functor equality. A few=
thoughts based on this:</div><div><br></div><div>1. mutable functors seems=
to be a different class than non mutable functors. I'm not sure or not if =
they fall under function pointer semantics. It would be akin to a function =
pointer changing each time it was invoked.</div><div><br></div><div>2. Ther=
e is a proposal to make std::function thread safe by removing support for l=
ambda/functors that do not have a const operator(). In light of this if onl=
y non mutable lambda's are considered then type alone is all that would be =
required guarantee equality. Said another way if two non mutable lambda fun=
ctions have the same type they have the same behavior. I think that is corr=
ect. The problem is there currently is not a way to distinguish a lambda fr=
om a user defined functor.</div><div><br></div><div>3. operator=3D=3D=
should probably be noexcept and if equality can't be determined for a part=
icular class of function types the result would then be unspecified. This f=
ollows the pattern c++ adopted for comparing virtual functions. This then a=
llows future c++ features (concepts, default=3D=3D, type traits, etc.) to p=
ossibly support another class of functions without breaking code. The resul=
t of the compare simply changes from unspecified to having a definite defin=
ed result which is a non breaking change. If it were to throw an exception =
and then its wanted to change from throwing to have a definite result that =
would be a breaking change.</div><div><br></div><div>So as of now standalon=
e, member, lambda's that convert to function pointer, and user defined func=
tors that would define operator=3D=3D have a clear path of allowing operato=
r=3D=3D.</div><div><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_11_564924376.1431834461502--
------=_Part_10_23927195.1431834461502--
.
Author: mash.boyko2014@gmail.com
Date: Sat, 16 May 2015 21:34:37 -0700 (PDT)
Raw View
------=_Part_18_1066356210.1431837277130
Content-Type: multipart/alternative;
boundary="----=_Part_19_507084651.1431837277133"
------=_Part_19_507084651.1431837277133
Content-Type: text/plain; charset=UTF-8
On Saturday, May 16, 2015 at 10:47:41 PM UTC-5, Michael Boyko wrote:
>
>
>
> On Friday, May 15, 2015 at 12:08:04 AM UTC-5, Nicol Bolas wrote:
>>
>>
>>
>> On Thursday, May 14, 2015 at 11:13:51 PM UTC-4, mash.bo...@gmail.com
>> wrote:
>>>
>>> I think discussing if two functors is equal or not is interesting but
>>> the real question is what does it mean for a function pointer to be equal
>>> to another function pointer. I don't think the state of the functor being
>>> pointed to is all that important. The only property (or salient attribute)
>>> that matters is does the pointer point to the same object and function or
>>> not. It is a shallow comparison not a deep one.
>>>
>>
>> And I could find someone who believes quite differently. That what
>> matters for function equality is that passing the same parameters will
>> produce the same results and same side-effects, for all possible sets of
>> parameters (given other invariants like global state and the like). In this
>> case, the state of functors is very relevant. What is conceptually calling
>> the same code, but do different things based on internal state. But if the
>> internal state compares equal, then they are the same functor.
>>
>
> After careful consideration of the discussion here I have changed my mind
> - state is what is important for functor equality. A few thoughts based on
> this:
>
> 1. mutable functors seems to be a different class than non mutable
> functors. I'm not sure or not if they fall under function pointer
> semantics. It would be akin to a function pointer changing each time it was
> invoked.
>
> 2. There is a proposal to make std::function thread safe by removing
> support for lambda/functors that do not have a const operator(). In light
> of this if only non mutable lambda's are considered then type alone is all
> that would be required guarantee equality. Said another way if two non
> mutable lambda functions have the same type they have the same behavior. I
> think that is correct. The problem is there currently is not a way to
> distinguish a lambda from a user defined functor.
>
> 3. operator== should probably be noexcept and if equality can't be
> determined for a particular class of function types the result would then
> be unspecified. This follows the pattern c++ adopted for comparing virtual
> functions. This then allows future c++ features (concepts, default==, type
> traits, etc.) to possibly support another class of functions without
> breaking code. The result of the compare simply changes from unspecified to
> having a definite defined result which is a non breaking change. If it were
> to throw an exception and then its wanted to change from throwing to have a
> definite result that would be a breaking change.
>
> So as of now standalone, member, lambda's that convert to function
> pointer, and user defined functors that would define operator== have a
> clear path of allowing operator==.
>
>
Here is a strategy that I believe could compare all function types with the
one constraint that mutating functors and lambdas are not allowed
(reasonable in light of N4159 and N4348) and all user defined functors
would require an operator==.
Operator==
1. If target types are different return false
2. else if targets are standalone funtions return true if function pointers
match
3. else if targets are member functions return true if member function
pointers and object instance pointers match
4. else if targets are functor/lambda
A. If functor/lambda types are different return false
B. else if operator== is defined return its result
C. else return true
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_19_507084651.1431837277133
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Saturday, May 16, 2015 at 10:47:41 PM UTC-5, Mi=
chael Boyko wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;marg=
in-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"=
ltr"><br><br>On Friday, May 15, 2015 at 12:08:04 AM UTC-5, Nicol Bolas wrot=
e:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bor=
der-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><br><br>On Thurs=
day, May 14, 2015 at 11:13:51 PM UTC-4, <a>mash.bo...@gmail.com</a> wrote:<=
blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border=
-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>I think discus=
sing if two functors is equal or not is interesting but the real question i=
s what does it mean for a function pointer to be equal to another function =
pointer. I don't think the state of the functor being pointed to is all tha=
t important. The only property (or salient attribute) that matters is does =
the pointer point to the same object and function or not. It is a shallow c=
omparison not a deep one.</div></div></blockquote><div><br>And I could find=
someone who believes quite differently. That what matters for function equ=
ality is that passing the same parameters will produce the same results and=
same side-effects, for all possible sets of parameters (given other invari=
ants like global state and the like). In this case, the state of functors i=
s very relevant. What is conceptually calling the same code, but do differe=
nt things based on internal state. But if the internal state compares equal=
, then they are the same functor.</div></div></blockquote><div><br></div><d=
iv>After careful consideration of the discussion here I have changed my min=
d - state is what is important for functor equality. A few thoughts based o=
n this:</div><div><br></div><div>1. mutable functors seems to be a differen=
t class than non mutable functors. I'm not sure or not if they fall under f=
unction pointer semantics. It would be akin to a function pointer changing =
each time it was invoked.</div><div><br></div><div>2. There is a proposal t=
o make std::function thread safe by removing support for lambda/functors th=
at do not have a const operator(). In light of this if only non mutable lam=
bda's are considered then type alone is all that would be required guarante=
e equality. Said another way if two non mutable lambda functions have the s=
ame type they have the same behavior. I think that is correct. The problem =
is there currently is not a way to distinguish a lambda from a user defined=
functor.</div><div><br></div><div>3. operator=3D=3D should probably =
be noexcept and if equality can't be determined for a particular class of f=
unction types the result would then be unspecified. This follows the patter=
n c++ adopted for comparing virtual functions. This then allows future c++ =
features (concepts, default=3D=3D, type traits, etc.) to possibly support a=
nother class of functions without breaking code. The result of the compare =
simply changes from unspecified to having a definite defined result which i=
s a non breaking change. If it were to throw an exception and then its want=
ed to change from throwing to have a definite result that would be a breaki=
ng change.</div><div><br></div><div>So as of now standalone, member, lambda=
's that convert to function pointer, and user defined functors that would d=
efine operator=3D=3D have a clear path of allowing operator=3D=3D.</div><di=
v><br></div></div></blockquote><div><br></div><div>Here is a strategy that =
I believe could compare all function types with the one constraint that mut=
ating functors and lambdas are not allowed (reasonable in light of N4159 an=
d N4348) and all user defined functors would require an operator=3D=3D.</di=
v><div><br></div><div>Operator=3D=3D</div><div>1. If target types are diffe=
rent return false</div><div>2. else if targets are standalone funtions retu=
rn true if function pointers match</div><div>3. else if targets are member =
functions return true if member function pointers and object instance point=
ers match</div><div>4. else if targets are functor/lambda</div><div> =
A. If functor/lambda types are different return false</div><div> =
; B. else if operator=3D=3D is defined return its result<br></div><di=
v> C. else return true</div><div><br></div><div><br></div></div=
>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_19_507084651.1431837277133--
------=_Part_18_1066356210.1431837277130--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sat, 16 May 2015 22:14:37 -0700 (PDT)
Raw View
------=_Part_2_1174693545.1431839677580
Content-Type: multipart/alternative;
boundary="----=_Part_3_1257243944.1431839677580"
------=_Part_3_1257243944.1431839677580
Content-Type: text/plain; charset=UTF-8
On Sunday, May 17, 2015 at 12:34:37 AM UTC-4, mash.bo...@gmail.com wrote:
>
> Here is a strategy that I believe could compare all function types with
> the one constraint that mutating functors and lambdas are not allowed
> (reasonable in light of N4159 and N4348) and all user defined functors
> would require an operator==.
>
> Operator==
> 1. If target types are different return false
> 2. else if targets are standalone funtions return true if function
> pointers match
> 3. else if targets are member functions return true if member function
> pointers and object instance pointers match
> 4. else if targets are functor/lambda
> A. If functor/lambda types are different return false
> B. else if operator== is defined return its result
> C. else return true
>
Assuming N4348 goes through (and it's not clear to me where the committee
is on that one. Anybody with actual knowledge care to chime in?), this
change to std::function seems reasonable. But it has created a problem:
The ability to attach "member function pointers and object instance
pointers".
I understand the argument, especially now that you mostly have operator==
ironed out. You want to be able to test to see if a particular member
function and its instance data are the same, so that you can do whatever it
is you do with that knowledge.
The problem is ownership. Or rather, the *lack* of ownership.
Those "object instance pointers" have got to be owned by someone. Are you
going to allow these pointers to be smart pointers? What about comparing
different pointer types, like if a pointer was registered with a
std::shared_ptr, but is being compared with a std::observer_ptr or a naked
pointer? Logically, the equality test shouldn't care, but your test doesn't
take this into account.
And if you deny ownership at all, if you only allow naked pointers for such
bindings, then... well, people are still going to want to give
std::function ownership. So they'll be forced to manage memory, most likely
by using a wrapper lambda. At which point, you've basically lost all of the
equality testing potential here. So they'd have to implement some kind of
wrapper non-lambda type.
And then that wrapper type would have to answer all the questions above.
And do so in a way that erases the actual type of the member pointer and
instance (smart) pointer from the interface, so that the wrapper type will
be the same for all types.
It's just a big can of worms.
Lastly, you still never explained what you need this equality testing
feature for. You want to make non-trivial changes to std::function, but you
only have one use case. And even that's not so much a "can't do this
without the feature" as "well, I can still do this without the feature, but
I would rather not because... oh look, a bunny!"
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_3_1257243944.1431839677580
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Sunday, May 17, 2015 at 12:34:37 AM UTC-4, mash.bo...@g=
mail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-=
left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr=
"><div></div><div>Here is a strategy that I believe could compare all funct=
ion types with the one constraint that mutating functors and lambdas are no=
t allowed (reasonable in light of N4159 and N4348) and all user defined fun=
ctors would require an operator=3D=3D.</div><div><br></div><div>Operator=3D=
=3D</div><div>1. If target types are different return false</div><div>2. el=
se if targets are standalone funtions return true if function pointers matc=
h</div><div>3. else if targets are member functions return true if member f=
unction pointers and object instance pointers match</div><div>4. else if ta=
rgets are functor/lambda</div><div> A. If functor/lambda types =
are different return false</div><div> B. else if operator=3D=3D=
is defined return its result<br></div><div> C. else return tru=
e</div></div></blockquote><div><br>Assuming N4348 goes through (and it's no=
t clear to me where the committee is on that one. Anybody with actual knowl=
edge care to chime in?), this change to std::function seems reasonable. But=
it has created a problem:<br><br>The ability to attach "member function po=
inters and object instance pointers".<br><br>I understand the argument, esp=
ecially now that you mostly have operator=3D=3D ironed out. You want to be =
able to test to see if a particular member function and its instance data a=
re the same, so that you can do whatever it is you do with that knowledge.<=
br><br>The problem is ownership. Or rather, the <i>lack</i> of ownership.<b=
r><br>Those "object instance pointers" have got to be owned by someone. Are=
you going to allow these pointers to be smart pointers? What about compari=
ng different pointer types, like if a pointer was registered with a std::sh=
ared_ptr, but is being compared with a std::observer_ptr or a naked pointer=
? Logically, the equality test shouldn't care, but your test doesn't take t=
his into account.<br><br>And if you deny ownership at all, if you only allo=
w naked pointers for such bindings, then... well, people are still going to=
want to give std::function ownership. So they'll be forced to manage memor=
y, most likely by using a wrapper lambda. At which point, you've basically =
lost all of the equality testing potential here. So they'd have to implemen=
t some kind of wrapper non-lambda type.<br><br>And then that wrapper type w=
ould have to answer all the questions above. And do so in a way that erases=
the actual type of the member pointer and instance (smart) pointer from th=
e interface, so that the wrapper type will be the same for all types.<br><b=
r>It's just a big can of worms.<br><br>Lastly, you still never explained wh=
at you need this equality testing feature for. You want to make non-trivial=
changes to std::function, but you only have one use case. And even that's =
not so much a "can't do this without the feature" as "well, I can still do =
this without the feature, but I would rather not because... oh look, a bunn=
y!"<br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_3_1257243944.1431839677580--
------=_Part_2_1174693545.1431839677580--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Sun, 17 May 2015 08:29:46 +0300
Raw View
On 17 May 2015 at 08:14, Nicol Bolas <jmckesson@gmail.com> wrote:
> Assuming N4348 goes through (and it's not clear to me where the committee is
> on that one. Anybody with actual knowledge care to chime in?), this change
That paper hasn't been discussed yet. As far as I understand, it will
be revisited
in Kona. I can't make any real predictions on it, but I can
for-full-disclosure say
that there is heavy opposition to that proposal due to compatibility issues.
And in case that wasn't clear, I will be raising such opposition.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
.
Author: mash.boyko2014@gmail.com
Date: Sun, 17 May 2015 08:23:03 -0700 (PDT)
Raw View
------=_Part_38_1751543360.1431876183192
Content-Type: multipart/alternative;
boundary="----=_Part_39_483418444.1431876183192"
------=_Part_39_483418444.1431876183192
Content-Type: text/plain; charset=UTF-8
On Sunday, May 17, 2015 at 12:14:37 AM UTC-5, Nicol Bolas wrote:
>
> On Sunday, May 17, 2015 at 12:34:37 AM UTC-4, mash.bo...@gmail.com wrote:
>>
>> Here is a strategy that I believe could compare all function types with
>> the one constraint that mutating functors and lambdas are not allowed
>> (reasonable in light of N4159 and N4348) and all user defined functors
>> would require an operator==.
>>
>> Operator==
>> 1. If target types are different return false
>> 2. else if targets are standalone funtions return true if function
>> pointers match
>> 3. else if targets are member functions return true if member function
>> pointers and object instance pointers match
>> 4. else if targets are functor/lambda
>> A. If functor/lambda types are different return false
>> B. else if operator== is defined return its result
>> C. else return true
>>
>
> Assuming N4348 goes through (and it's not clear to me where the committee
> is on that one. Anybody with actual knowledge care to chime in?), this
> change to std::function seems reasonable. But it has created a problem:
>
> The ability to attach "member function pointers and object instance
> pointers".
>
> I understand the argument, especially now that you mostly have operator==
> ironed out. You want to be able to test to see if a particular member
> function and its instance data are the same, so that you can do whatever it
> is you do with that knowledge.
>
> The problem is ownership. Or rather, the *lack* of ownership.
>
> Those "object instance pointers" have got to be owned by someone. Are you
> going to allow these pointers to be smart pointers? What about comparing
> different pointer types, like if a pointer was registered with a
> std::shared_ptr, but is being compared with a std::observer_ptr or a naked
> pointer? Logically, the equality test shouldn't care, but your test doesn't
> take this into account.
>
> And if you deny ownership at all, if you only allow naked pointers for
> such bindings, then... well, people are still going to want to give
> std::function ownership. So they'll be forced to manage memory, most likely
> by using a wrapper lambda. At which point, you've basically lost all of the
> equality testing potential here. So they'd have to implement some kind of
> wrapper non-lambda type.
>
> And then that wrapper type would have to answer all the questions above.
> And do so in a way that erases the actual type of the member pointer and
> instance (smart) pointer from the interface, so that the wrapper type will
> be the same for all types.
>
> It's just a big can of worms.
>
I don't want to go there - no object ownership. Maybe if someone wanted to
traffic in ownership a class that is implemented in terms of this type
would be an option instead of wrappers used by this type.
>
> Lastly, you still never explained what you need this equality testing
> feature for. You want to make non-trivial changes to std::function, but you
> only have one use case. And even that's not so much a "can't do this
> without the feature" as "well, I can still do this without the feature, but
> I would rather not because... oh look, a bunny!"
>
I already pointed out a couple good reasons:
1. When where an attach and where the matching detach are in different
scopes then a shared or copied connection object is required - propagating
objects around and maybe adding additional physical dependencies.
2. there is no way to know by examining a connection what attach the
connection object refers to - if you want to know that information you
would have to associate the connection with some additional data.
3. function compares are more flexible. function compares can easily be
used to create a connection like object for the case where that is better
or it can simply perform on demand detaches without having to manage
connection objects when that is better. Connection objects
On another note. I'd also like to get rid of is:
void fn(int a) { ... }
std::function<void(double)> fp1 = &fn; //really?
That does not seem like a strongly typed universal function pointer.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_39_483418444.1431876183192
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Sunday, May 17, 2015 at 12:14:37 AM UTC-5, Nico=
l Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-l=
eft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"=
>On Sunday, May 17, 2015 at 12:34:37 AM UTC-4, <a>mash.bo...@gmail.com</a> =
wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex=
;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><=
div>Here is a strategy that I believe could compare all function types with=
the one constraint that mutating functors and lambdas are not allowed (rea=
sonable in light of N4159 and N4348) and all user defined functors would re=
quire an operator=3D=3D.</div><div><br></div><div>Operator=3D=3D</div><div>=
1. If target types are different return false</div><div>2. else if targets =
are standalone funtions return true if function pointers match</div><div>3.=
else if targets are member functions return true if member function pointe=
rs and object instance pointers match</div><div>4. else if targets are func=
tor/lambda</div><div> A. If functor/lambda types are different =
return false</div><div> B. else if operator=3D=3D is defined re=
turn its result<br></div><div> C. else return true</div></div><=
/blockquote><div><br>Assuming N4348 goes through (and it's not clear to me =
where the committee is on that one. Anybody with actual knowledge care to c=
hime in?), this change to std::function seems reasonable. But it has create=
d a problem:<br><br>The ability to attach "member function pointers and obj=
ect instance pointers".<br><br>I understand the argument, especially now th=
at you mostly have operator=3D=3D ironed out. You want to be able to test t=
o see if a particular member function and its instance data are the same, s=
o that you can do whatever it is you do with that knowledge.<br><br>The pro=
blem is ownership. Or rather, the <i>lack</i> of ownership.<br><br>Those "o=
bject instance pointers" have got to be owned by someone. Are you going to =
allow these pointers to be smart pointers? What about comparing different p=
ointer types, like if a pointer was registered with a std::shared_ptr, but =
is being compared with a std::observer_ptr or a naked pointer? Logically, t=
he equality test shouldn't care, but your test doesn't take this into accou=
nt.<br><br>And if you deny ownership at all, if you only allow naked pointe=
rs for such bindings, then... well, people are still going to want to give =
std::function ownership. So they'll be forced to manage memory, most likely=
by using a wrapper lambda. At which point, you've basically lost all of th=
e equality testing potential here. So they'd have to implement some kind of=
wrapper non-lambda type.<br><br>And then that wrapper type would have to a=
nswer all the questions above. And do so in a way that erases the actual ty=
pe of the member pointer and instance (smart) pointer from the interface, s=
o that the wrapper type will be the same for all types.<br><br>It's just a =
big can of worms.<br></div></div></blockquote><div><br></div><div>I don't w=
ant to go there - no object ownership. Maybe if someone wanted to traffic i=
n ownership a class that is implemented in terms of this type would be an o=
ption instead of wrappers used by this type.</div><div> </div><blockqu=
ote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left=
: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><br>Lastly, you =
still never explained what you need this equality testing feature for. You =
want to make non-trivial changes to std::function, but you only have one us=
e case. And even that's not so much a "can't do this without the feature" a=
s "well, I can still do this without the feature, but I would rather not be=
cause... oh look, a bunny!"<br></div></div></blockquote><div><br></div><div=
>I already pointed out a couple good reasons:</div><div> 1. Whe=
n where an attach and where the matching detach are in different scopes the=
n a shared or copied connection object is required - propagating objects ar=
ound and maybe adding additional physical dependencies.</div><div> &n=
bsp;2. there is no way to know by examining a connection what attach the co=
nnection object refers to - if you want to know that information you would =
have to associate the connection with some additional data.</div><div> =
; 3. function compares are more flexible. function compares can easil=
y be used to create a connection like object for the case where that is bet=
ter or it can simply perform on demand detaches without having to manage co=
nnection objects when that is better. Connection objects</div><div><br></di=
v><div>On another note. I'd also like to get rid of is:</div><div><br></div=
><div>void fn(int a) { ... }</div><div><br></div><div>std::function<void=
(double)> fp1 =3D &fn; //really?</div><div><br></div><div>That does =
not seem like a strongly typed universal function pointer.</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_39_483418444.1431876183192--
------=_Part_38_1751543360.1431876183192--
.
Author: David Krauss <potswa@mac.com>
Date: Sun, 17 May 2015 23:56:20 +0800
Raw View
--Apple-Mail=_D86A0A61-7C81-4AB6-961B-FF15FD280EBA
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2015=E2=80=9305=E2=80=9317, at 11:23 PM, mash.boyko2014@gmail.com wrot=
e:
>=20
> void fn(int a) { ... }
>=20
> std::function<void(double)> fp1 =3D &fn; //really?
>=20
> That does not seem like a strongly typed universal function pointer.
It=E2=80=99s not strongly typed, it=E2=80=99s type-erased. If you want to o=
bserve the type, check target_type().
Breaking your example would break all implicit conversions. Perhaps narrowi=
ng conversions deserve a crackdown, but the example isn=E2=80=99t even that=
..
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--Apple-Mail=_D86A0A61-7C81-4AB6-961B-FF15FD280EBA
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2015=E2=80=9305=
=E2=80=9317, at 11:23 PM, <a href=3D"mailto:mash.boyko2014@gmail.com" class=
=3D"">mash.boyko2014@gmail.com</a> wrote:</div><br class=3D"Apple-interchan=
ge-newline"><div class=3D""><div dir=3D"ltr" style=3D"font-family: Helvetic=
a; font-size: 12px; font-style: normal; font-variant: normal; font-weight: =
normal; letter-spacing: normal; line-height: normal; orphans: auto; text-al=
ign: start; text-indent: 0px; text-transform: none; white-space: normal; wi=
dows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=3D"">=
<div class=3D"">void fn(int a) { ... }</div><div class=3D""><br class=3D"">=
</div><div class=3D"">std::function<void(double)> fp1 =3D &fn; //=
really?</div><div class=3D""><br class=3D""></div><div class=3D"">That does=
not seem like a strongly typed universal function pointer.</div></div></di=
v></blockquote></div><br class=3D""><div class=3D"">It=E2=80=99s not strong=
ly typed, it=E2=80=99s type-erased. If you want to observe the type, check =
<font face=3D"Courier" class=3D"">target_type()</font>.</div><div class=3D"=
"><br class=3D""></div><div class=3D"">Breaking your example would break al=
l implicit conversions. Perhaps narrowing conversions deserve a crackdown, =
but the example isn=E2=80=99t even that.</div></body></html>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--Apple-Mail=_D86A0A61-7C81-4AB6-961B-FF15FD280EBA--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 17 May 2015 10:36:19 -0700 (PDT)
Raw View
------=_Part_58_1397282300.1431884179027
Content-Type: multipart/alternative;
boundary="----=_Part_59_1389936155.1431884179027"
------=_Part_59_1389936155.1431884179027
Content-Type: text/plain; charset=UTF-8
On Sunday, May 17, 2015 at 11:23:03 AM UTC-4, mash.bo...@gmail.com wrote:
>
>
>
> On Sunday, May 17, 2015 at 12:14:37 AM UTC-5, Nicol Bolas wrote:
>>
>> On Sunday, May 17, 2015 at 12:34:37 AM UTC-4, mash.bo...@gmail.com wrote:
>>>
>>> Here is a strategy that I believe could compare all function types with
>>> the one constraint that mutating functors and lambdas are not allowed
>>> (reasonable in light of N4159 and N4348) and all user defined functors
>>> would require an operator==.
>>>
>>> Operator==
>>> 1. If target types are different return false
>>> 2. else if targets are standalone funtions return true if function
>>> pointers match
>>> 3. else if targets are member functions return true if member function
>>> pointers and object instance pointers match
>>> 4. else if targets are functor/lambda
>>> A. If functor/lambda types are different return false
>>> B. else if operator== is defined return its result
>>> C. else return true
>>>
>>
>> Assuming N4348 goes through (and it's not clear to me where the committee
>> is on that one. Anybody with actual knowledge care to chime in?), this
>> change to std::function seems reasonable. But it has created a problem:
>>
>> The ability to attach "member function pointers and object instance
>> pointers".
>>
>> I understand the argument, especially now that you mostly have operator==
>> ironed out. You want to be able to test to see if a particular member
>> function and its instance data are the same, so that you can do whatever it
>> is you do with that knowledge.
>>
>> The problem is ownership. Or rather, the *lack* of ownership.
>>
>> Those "object instance pointers" have got to be owned by someone. Are you
>> going to allow these pointers to be smart pointers? What about comparing
>> different pointer types, like if a pointer was registered with a
>> std::shared_ptr, but is being compared with a std::observer_ptr or a naked
>> pointer? Logically, the equality test shouldn't care, but your test doesn't
>> take this into account.
>>
>> And if you deny ownership at all, if you only allow naked pointers for
>> such bindings, then... well, people are still going to want to give
>> std::function ownership. So they'll be forced to manage memory, most likely
>> by using a wrapper lambda. At which point, you've basically lost all of the
>> equality testing potential here. So they'd have to implement some kind of
>> wrapper non-lambda type.
>>
>> And then that wrapper type would have to answer all the questions above.
>> And do so in a way that erases the actual type of the member pointer and
>> instance (smart) pointer from the interface, so that the wrapper type will
>> be the same for all types.
>>
>> It's just a big can of worms.
>>
>
> I don't want to go there - no object ownership. Maybe if someone wanted to
> traffic in ownership a class that is implemented in terms of this type
> would be an option instead of wrappers used by this type.
>
There's a reason why we invented RAII, smart pointers, and explicit
ownership of objects in C++. To arbitrarily *forbid* such management in a
feature as important as delegates seems very narrow-minded.
>> Lastly, you still never explained what you need this equality testing
>> feature for. You want to make non-trivial changes to std::function, but you
>> only have one use case. And even that's not so much a "can't do this
>> without the feature" as "well, I can still do this without the feature, but
>> I would rather not because... oh look, a bunny!"
>>
>
> I already pointed out a couple good reasons:
>
I'm going to deal with your "good reasons" in turn, but I keep bringing up
a point that you keep ignoring it.
You're always talking about events/delegates/signals. This is the *only
example* you have for where comparing functions is useful.
So let's pretend for a moment that your "good reasons" actually are good
reasons. Let's take it as a given that the correct interface for
events/delegates/signals, the only one worth using, is based on "function"
comparison.
So... why does std::function need to support comparison? Or why do we need
to invent a new type that does? If the *only reason* you need to compare
functions is for your perfect event/delegate/signal system, then just build
that into its interface:
template<typename Sig>
class event
{
public:
void connect(Sig *func_ptr);
template<typename T>
void connect(... *mem_func_ptr, T *t_ptr);
template<ConstCallableAndComparable Functor>
void connect(Functor *functor);
void disconnect(Sig *func_ptr);
template<typename T>
void disconnect(... *mem_func_ptr, T *t_ptr);
template<ConstCallableAndComparable Functor>
void disconnect(Functor *functor);
};
There is nothing about this interface which *requires* that the user
explicitly be exposed to the comparability aspect. That would purely be an
implementation detail. And that way, you can define whatever rules you
want, without affecting std::function or adding a new type or anything of
the like.
You can require that functors have certain properties. You can test them,
as I did above via concepts. And so forth.
If you can't come up with some *other* reason, some other real use-case for
function comparison besides events/delegates/signals, then just propose an
event system like the above.
> 1. When where an attach and where the matching detach are in different
> scopes then a shared or copied connection object is required - propagating
> objects around and maybe adding additional physical dependencies.
>
I want to restate your objection to a connection object. You're saying that
using a connection object requires that the place where the attachment is
made and the place where the attachment is severed have some sort of
dependency. That there must be some means of communication between them.
But... that dependency *already exists*. Why? Because both places need
access to whatever function was registered.
If it was a non-member function pointer, then this function needs to be
accessible to both. It can't be a file-static function unless both places
are in the same file. It can't be a private static member unless both
places are in the same object.
If you registered a member+pointer, then not only do you need access to the
member being registered (and therefore, you can't make it private), you
also need access to the exact pointer that was registered. And not a
derived class or base class type either; it's got to be value-identical.
So clearly there *must already exist* some means of communication between
the attacher and the detacher.
Now, to be fair, there is one difference: a specific connection object can
only be used with the specific event that it was made by. A function
pointer alone can be used by any event object, while a connection object is
event-specific.
Personally, I'd call that a feature, not a bug. But that's for other
reasons (see below).
> 2. there is no way to know by examining a connection what attach the
> connection object refers to - if you want to know that information you
> would have to associate the connection with some additional data.
>
.... I don't know what you mean by that. Presumably, any connection-based
interface could be used to fetch the std::function object that was
registered to the event/delegate/signal. And I don't know what other
"information" would be associated with the connection that you might want
to query.
3. function compares are more flexible. function compares can easily be
> used to create a connection like object for the case where that is better
> or it can simply perform on demand detaches without having to manage
> connection objects when that is better.
>
Yes, you could have one or the other. So?
It would be a very dysfunctional codebase that attempts to use *both*.
Especially for the same event/delegate/signal objects; that's just begging
for disaster (then again, you seem perfectly fine with storing non-owning
pointers in events long-term, so begging for disaster is really par for the
course).
The only advantage of such a system is that it would allow two different
codebases to use two different coding styles. And I fail to see how that's
a good thing.
Other points in favor of connections:
4) You don't have to expose implementation details, like pointers to the
exact object being registered. What does the code that detaches the
attachment care exactly what kind of thing was attached? Why should that
code have to be modified just because you decided to switch from a
non-member function to a member+instance? Or if you decide to wrap what
used to be a regular function pointer in a lambda?
This is *especially* true once you start shoving lambdas into it. Because
it means that, if I attach a lambda to an event... then whoever it is that
detaches that lambda needs access to the *exact lambda* that I created. Not
merely a lambda function that does the same thing. It must be the exact
same lambda, since every lambda declaration is its own type.
So now, I can't really use function-local lambdas; my lambda has to be
externally visible to the function. At which point, it loses about 90% of
the advantages of being a lambda in the first place; it may as well be a
normal functor.
Connection objects promote better encapsulation.
5) The functor doesn't have to be `const`. Remember: your method relies
upon N4348. And even though Ville apparently wants to do his best to ensure
that this doesn't happen, you can still do what I suggested above and write
an event system that doesn't rely on an externally-visible class. So your
event class can delcare that only `const` functors are allowed, presumably
so that you can implement comparisons.
However... what is conceptually wrong with registering an event that has
modifiable internal state? After all, if I registered a member
pointer+instance, you don't require that the instance pointer be `const` or
that the member pointer be callable via a `const` instance. If a member
pointer can modify its instance data, then why can't a functor?
That is, it's legal to do this:
struct Functor
{
void operator()() {++state;}
int state;
};
auto fn = new Functor;
event->connect(&Functor::operator(), &fn);
But not this, with the exact same object type:
event->connect(Functor{});
This seems like a rather arbitrary and absurd distinction to make.
The only reason you don't allow functor state modification is to make
comparing functors reasonable. But if we use connection objects to manage
connections, then we don't have to care about comparing std::function
objects. At which point, it is perfectly possible to register non-`const`
functions to events/delegates/signals.
Connection objects promote more sane APIs with regard to functors.
C++ isn't C# or Java or Python. Functors are really important in C++, and
any event system worthy of being in the standard library needs to support
them *just as effectively* (if not moreso) as it supports member
pointer+instances or whatever.
And if providing that support requires that C++ events/delegates/signals
must use explicit connection objects rather than passing the function
again, then that's the interface C++ should use.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_59_1389936155.1431884179027
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Sunday, May 17, 2015 at 11:23:03 AM UTC-4, mash=
..bo...@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0=
;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div di=
r=3D"ltr"><br><br>On Sunday, May 17, 2015 at 12:14:37 AM UTC-5, Nicol Bolas=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8e=
x;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">On Sunday, =
May 17, 2015 at 12:34:37 AM UTC-4, <a>mash.bo...@gmail.com</a> wrote:<block=
quote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left=
:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>Here is =
a strategy that I believe could compare all function types with the one con=
straint that mutating functors and lambdas are not allowed (reasonable in l=
ight of N4159 and N4348) and all user defined functors would require an ope=
rator=3D=3D.</div><div><br></div><div>Operator=3D=3D</div><div>1. If target=
types are different return false</div><div>2. else if targets are standalo=
ne funtions return true if function pointers match</div><div>3. else if tar=
gets are member functions return true if member function pointers and objec=
t instance pointers match</div><div>4. else if targets are functor/lambda</=
div><div> A. If functor/lambda types are different return false=
</div><div> B. else if operator=3D=3D is defined return its res=
ult<br></div><div> C. else return true</div></div></blockquote>=
<div><br>Assuming N4348 goes through (and it's not clear to me where the co=
mmittee is on that one. Anybody with actual knowledge care to chime in?), t=
his change to std::function seems reasonable. But it has created a problem:=
<br><br>The ability to attach "member function pointers and object instance=
pointers".<br><br>I understand the argument, especially now that you mostl=
y have operator=3D=3D ironed out. You want to be able to test to see if a p=
articular member function and its instance data are the same, so that you c=
an do whatever it is you do with that knowledge.<br><br>The problem is owne=
rship. Or rather, the <i>lack</i> of ownership.<br><br>Those "object instan=
ce pointers" have got to be owned by someone. Are you going to allow these =
pointers to be smart pointers? What about comparing different pointer types=
, like if a pointer was registered with a std::shared_ptr, but is being com=
pared with a std::observer_ptr or a naked pointer? Logically, the equality =
test shouldn't care, but your test doesn't take this into account.<br><br>A=
nd if you deny ownership at all, if you only allow naked pointers for such =
bindings, then... well, people are still going to want to give std::functio=
n ownership. So they'll be forced to manage memory, most likely by using a =
wrapper lambda. At which point, you've basically lost all of the equality t=
esting potential here. So they'd have to implement some kind of wrapper non=
-lambda type.<br><br>And then that wrapper type would have to answer all th=
e questions above. And do so in a way that erases the actual type of the me=
mber pointer and instance (smart) pointer from the interface, so that the w=
rapper type will be the same for all types.<br><br>It's just a big can of w=
orms.<br></div></div></blockquote><div><br></div><div>I don't want to go th=
ere - no object ownership. Maybe if someone wanted to traffic in ownership =
a class that is implemented in terms of this type would be an option instea=
d of wrappers used by this type.</div></div></blockquote><div><br>There's a=
reason why we invented RAII, smart pointers, and explicit ownership of obj=
ects in C++. To arbitrarily <i>forbid</i> such management in a feature as i=
mportant as delegates seems very narrow-minded.<br><br></div><blockquote cl=
ass=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px =
#ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><blockquote class=3D"gmail_=
quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;paddi=
ng-left:1ex"><div dir=3D"ltr"><div><br>Lastly, you still never explained wh=
at you need this equality testing feature for. You want to make non-trivial=
changes to std::function, but you only have one use case. And even that's =
not so much a "can't do this without the feature" as "well, I can still do =
this without the feature, but I would rather not because... oh look, a bunn=
y!"<br></div></div></blockquote><div><br></div><div>I already pointed out a=
couple good reasons:</div></div></blockquote><div><br>I'm going to deal wi=
th your "good reasons" in turn, but I keep bringing up a point that you kee=
p ignoring it.<br><br>You're always talking about events/delegates/signals.=
This is the <b>only example</b> you have for where comparing functions is =
useful.<br><br>So let's pretend for a moment that your "good reasons" actua=
lly are good reasons. Let's take it as a given that the correct interface f=
or events/delegates/signals, the only one worth using, is based on "functio=
n" comparison.<br><br>So... why does std::function need to support comparis=
on? Or why do we need to invent a new type that does? If the <i>only reason=
</i> you need to compare functions is for your perfect event/delegate/signa=
l system, then just build that into its interface:<br><br><div class=3D"pre=
ttyprint" style=3D"background-color: rgb(250, 250, 250); border-color: rgb(=
187, 187, 187); border-style: solid; border-width: 1px; word-wrap: break-wo=
rd;"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span style=
=3D"color: #008;" class=3D"styled-by-prettify">template</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify"><</span><span style=3D"co=
lor: #008;" class=3D"styled-by-prettify">typename</span><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #606;"=
class=3D"styled-by-prettify">Sig</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">></span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"><br></span><span style=3D"color: #008;" class=3D"styled-b=
y-prettify">class</span><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify"> </span><span style=3D"color: #008;" class=3D"styled-by-prettify">ev=
ent</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></s=
pan><span style=3D"color: #660;" class=3D"styled-by-prettify">{</span><span=
style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">public</span><span style=3D"=
color: #660;" class=3D"styled-by-prettify">:</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"><br><br> </span><span style=3D"colo=
r: #008;" class=3D"styled-by-prettify">void</span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"> connect</span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">(</span><span style=3D"color: #606;" class=
=3D"styled-by-prettify">Sig</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">*</span><span style=3D"color: #000;" class=3D"styled-by-prettify">f=
unc_ptr</span><span style=3D"color: #660;" class=3D"styled-by-prettify">);<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br><br>&nb=
sp; </span><span style=3D"color: #008;" class=3D"styled-by-prettify">templa=
te</span><span style=3D"color: #660;" class=3D"styled-by-prettify"><</sp=
an><span style=3D"color: #008;" class=3D"styled-by-prettify">typename</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify"> T</span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify">></span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"><br> </span><sp=
an style=3D"color: #008;" class=3D"styled-by-prettify">void</span><span sty=
le=3D"color: #000;" class=3D"styled-by-prettify"> connect</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">(...</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660=
;" class=3D"styled-by-prettify">*</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify">mem_func_ptr</span><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">,</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> T </span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">*</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
>t_ptr</span><span style=3D"color: #660;" class=3D"styled-by-prettify">);</=
span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br><br>&nbs=
p; </span><span style=3D"color: #008;" class=3D"styled-by-prettify">templat=
e</span><span style=3D"color: #660;" class=3D"styled-by-prettify"><</spa=
n><span style=3D"color: #606;" class=3D"styled-by-prettify">ConstCallableAn=
dComparable</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
> </span><span style=3D"color: #606;" class=3D"styled-by-prettify">Functor<=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">></span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"><br> =
</span><span style=3D"color: #008;" class=3D"styled-by-prettify">void</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify"> connect</span>=
<span style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span sty=
le=3D"color: #606;" class=3D"styled-by-prettify">Functor</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">*</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify">functor</span><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">);</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"><br><br> </span><span style=3D"color: #008;" class=
=3D"styled-by-prettify">void</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> disconnect</span><span style=3D"color: #660;" class=3D"s=
tyled-by-prettify">(</span><span style=3D"color: #606;" class=3D"styled-by-=
prettify">Sig</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">*</spa=
n><span style=3D"color: #000;" class=3D"styled-by-prettify">func_ptr</span>=
<span style=3D"color: #660;" class=3D"styled-by-prettify">);</span><span st=
yle=3D"color: #000;" class=3D"styled-by-prettify"><br><br> </span><sp=
an style=3D"color: #008;" class=3D"styled-by-prettify">template</span><span=
style=3D"color: #660;" class=3D"styled-by-prettify"><</span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">typename</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> T</span><span style=3D"colo=
r: #660;" class=3D"styled-by-prettify">></span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify"><br> </span><span style=3D"co=
lor: #008;" class=3D"styled-by-prettify">void</span><span style=3D"color: #=
000;" class=3D"styled-by-prettify"> disconnect</span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">(...</span><span style=3D"color: #000;"=
class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">*</span><span style=3D"color: #000;" class=3D"styled-b=
y-prettify">mem_func_ptr</span><span style=3D"color: #660;" class=3D"styled=
-by-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"> T </span><span style=3D"color: #660;" class=3D"styled-by-prettify">*<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify">t_ptr</span=
><span style=3D"color: #660;" class=3D"styled-by-prettify">);</span><span s=
tyle=3D"color: #000;" class=3D"styled-by-prettify"><br><br> </span><s=
pan style=3D"color: #008;" class=3D"styled-by-prettify">template</span><spa=
n style=3D"color: #660;" class=3D"styled-by-prettify"><</span><span styl=
e=3D"color: #606;" class=3D"styled-by-prettify">ConstCallableAndComparable<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><sp=
an style=3D"color: #606;" class=3D"styled-by-prettify">Functor</span><span =
style=3D"color: #660;" class=3D"styled-by-prettify">></span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"><br> </span><sp=
an style=3D"color: #008;" class=3D"styled-by-prettify">void</span><span sty=
le=3D"color: #000;" class=3D"styled-by-prettify"> disconnect</span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"co=
lor: #606;" class=3D"styled-by-prettify">Functor</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" =
class=3D"styled-by-prettify">*</span><span style=3D"color: #000;" class=3D"=
styled-by-prettify">functor</span><span style=3D"color: #660;" class=3D"sty=
led-by-prettify">);</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify"><br></span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">};</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br><=
/span></div></code></div><br>There is nothing about this interface which <i=
>requires</i> that the user explicitly be exposed to the comparability aspe=
ct. That would purely be an implementation detail. And that way, you can de=
fine whatever rules you want, without affecting std::function or adding a n=
ew type or anything of the like.<br><br>You can require that functors have =
certain properties. You can test them, as I did above via concepts. And so =
forth.<br><br>If you can't come up with some <b><i>other</i></b> reason, so=
me other real use-case for function comparison besides events/delegates/sig=
nals, then just propose an event system like the above.<br> </div><blo=
ckquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-=
left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>  =
;1. When where an attach and where the matching detach are in different sco=
pes then a shared or copied connection object is required - propagating obj=
ects around and maybe adding additional physical dependencies.</div></div><=
/blockquote><div><br>I want to restate your objection to a connection objec=
t. You're saying that using a connection object requires that the place whe=
re the attachment is made and the place where the attachment is severed hav=
e some sort of dependency. That there must be some means of communication b=
etween them.<br><br>But... that dependency <i>already exists</i>. Why? Beca=
use both places need access to whatever function was registered.<br><br>If =
it was a non-member function pointer, then this function needs to be access=
ible to both. It can't be a file-static function unless both places are in =
the same file. It can't be a private static member unless both places are i=
n the same object.<br><br>If you registered a member+pointer, then not only=
do you need access to the member being registered (and therefore, you can'=
t make it private), you also need access to the exact pointer that was regi=
stered. And not a derived class or base class type either; it's got to be v=
alue-identical.<br><br>So clearly there <i>must already exist</i> some mean=
s of communication between the attacher and the detacher.<br><br>Now, to be=
fair, there is one difference: a specific connection object can only be us=
ed with the specific event that it was made by. A function pointer alone ca=
n be used by any event object, while a connection object is event-specific.=
<br><br>Personally, I'd call that a feature, not a bug. But that's for othe=
r reasons (see below).<br> </div><blockquote class=3D"gmail_quote" sty=
le=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left=
: 1ex;"><div dir=3D"ltr"><div> 2. there is no way to know by ex=
amining a connection what attach the connection object refers to - if you w=
ant to know that information you would have to associate the connection wit=
h some additional data.</div></div></blockquote><div><br>... I don't know w=
hat you mean by that. Presumably, any connection-based interface could be u=
sed to fetch the std::function object that was registered to the event/dele=
gate/signal. And I don't know what other "information" would be associated =
with the connection that you might want to query.<br><br></div><blockquote =
class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1p=
x #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div> 3. func=
tion compares are more flexible. function compares can easily be used to cr=
eate a connection like object for the case where that is better or it can s=
imply perform on demand detaches without having to manage connection object=
s when that is better.</div></div></blockquote><div><br>Yes, you could have=
one or the other. So?<br><br>It would be a very dysfunctional codebase tha=
t attempts to use <i>both</i>. Especially for the same event/delegate/signa=
l objects; that's just begging for disaster (then again, you seem perfectly=
fine with storing non-owning pointers in events long-term, so begging for =
disaster is really par for the course).<br><br>The only advantage of such a=
system is that it would allow two different codebases to use two different=
coding styles. And I fail to see how that's a good thing.<br><br>Other poi=
nts in favor of connections:<br><br>4) You don't have to expose implementat=
ion details, like pointers to the exact object being registered. What does =
the code that detaches the attachment care exactly what kind of thing was a=
ttached? Why should that code have to be modified just because you decided =
to switch from a non-member function to a member+instance? Or if you decide=
to wrap what used to be a regular function pointer in a lambda?<br><br>Thi=
s is <i>especially</i> true once you start shoving lambdas into it. Because=
it means that, if I attach a lambda to an event... then whoever it is that=
detaches that lambda<i> </i>needs access to the <i>exact lambda</i> that I=
created. Not merely a lambda function that does the same thing. It must be=
the exact same lambda, since every lambda declaration is its own type.<br>=
<br>So now, I can't really use function-local lambdas; my lambda has to be =
externally visible to the function. At which point, it loses about 90% of t=
he advantages of being a lambda in the first place; it may as well be a nor=
mal functor.<br><br>Connection objects promote better encapsulation.<br><br=
>5) The functor doesn't have to be `const`. Remember: your method relies up=
on N4348. And even though Ville apparently wants to do his best to ensure t=
hat this doesn't happen, you can still do what I suggested above and write =
an event system that doesn't rely on an externally-visible class. So your e=
vent class can delcare that only `const` functors are allowed, presumably s=
o that you can implement comparisons.<br><br>However... what is conceptuall=
y wrong with registering an event that has modifiable internal state? After=
all, if I registered a member pointer+instance, you don't require that the=
instance pointer be `const` or that the member pointer be callable via a `=
const` instance. If a member pointer can modify its instance data, then why=
can't a functor?<br><br>That is, it's legal to do this:<br><br><div class=
=3D"prettyprint" style=3D"background-color: rgb(250, 250, 250); border-colo=
r: rgb(187, 187, 187); border-style: solid; border-width: 1px; word-wrap: b=
reak-word;"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span=
style=3D"color: #008;" class=3D"styled-by-prettify">struct</span><span sty=
le=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"col=
or: #606;" class=3D"styled-by-prettify">Functor</span><span style=3D"color:=
#000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">{</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br> </span><span style=3D"color: #008;" clas=
s=3D"styled-by-prettify">void</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"> </span><span style=3D"color: #008;" class=3D"styled-by-=
prettify">operator</span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">()()</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">{++</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify">state</span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">;}</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify"><br><br> </span><span=
style=3D"color: #008;" class=3D"styled-by-prettify">int</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> state</span><span style=3D"=
color: #660;" class=3D"styled-by-prettify">;</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #660;" c=
lass=3D"styled-by-prettify">};</span><span style=3D"color: #000;" class=3D"=
styled-by-prettify"><br><br></span><span style=3D"color: #008;" class=3D"st=
yled-by-prettify">auto</span><span style=3D"color: #000;" class=3D"styled-b=
y-prettify"> fn </span><span style=3D"color: #660;" class=3D"styled-by-pret=
tify">=3D</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> =
</span><span style=3D"color: #008;" class=3D"styled-by-prettify">new</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span sty=
le=3D"color: #606;" class=3D"styled-by-prettify">Functor</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">;</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #008=
;" class=3D"styled-by-prettify">event</span><span style=3D"color: #660;" cl=
ass=3D"styled-by-prettify">-></span><span style=3D"color: #000;" class=
=3D"styled-by-prettify">connect</span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">(&</span><span style=3D"color: #606;" class=3D"sty=
led-by-prettify">Functor</span><span style=3D"color: #660;" class=3D"styled=
-by-prettify">::</span><span style=3D"color: #008;" class=3D"styled-by-pret=
tify">operator</span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">(),</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </=
span><span style=3D"color: #660;" class=3D"styled-by-prettify">&</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify">fn</span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">);</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"><br></span></div></code></div><br=
>But not this, with the exact same object type:<br><br><div class=3D"pretty=
print" style=3D"background-color: rgb(250, 250, 250); border-color: rgb(187=
, 187, 187); border-style: solid; border-width: 1px; word-wrap: break-word;=
"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span style=3D"=
color: #008;" class=3D"styled-by-prettify">event</span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">-></span><span style=3D"color: #00=
0;" class=3D"styled-by-prettify">connect</span><span style=3D"color: #660;"=
class=3D"styled-by-prettify">(</span><span style=3D"color: #606;" class=3D=
"styled-by-prettify">Functor</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">{});</span></div></code></div><br>This seems like a rathe=
r arbitrary and absurd distinction to make.<br><br>The only reason you don'=
t allow functor state modification is to make comparing functors reasonable=
.. But if we use connection objects to manage connections, then we don't hav=
e to care about comparing std::function objects. At which point, it is perf=
ectly possible to register non-`const` functions to events/delegates/signal=
s.<br><br>Connection objects promote more sane APIs with regard to functors=
..<br><br>C++ isn't C# or Java or Python. Functors are really important in C=
++, and any event system worthy of being in the standard library needs to s=
upport them <i>just as effectively</i> (if not moreso) as it supports membe=
r pointer+instances or whatever.<br><br>And if providing that support requi=
res that C++ events/delegates/signals must use explicit connection objects =
rather than passing the function again, then that's the interface C++ shoul=
d use.<br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_59_1389936155.1431884179027--
------=_Part_58_1397282300.1431884179027--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 17 May 2015 10:42:11 -0700 (PDT)
Raw View
------=_Part_203_1257824018.1431884531888
Content-Type: multipart/alternative;
boundary="----=_Part_204_1701200147.1431884531896"
------=_Part_204_1701200147.1431884531896
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On Sunday, May 17, 2015 at 11:56:25 AM UTC-4, David Krauss wrote:
>
>
> On 2015=E2=80=9305=E2=80=9317, at 11:23 PM, mash.bo...@gmail.com <javascr=
ipt:> wrote:
>
> void fn(int a) { ... }
>
> std::function<void(double)> fp1 =3D &fn; //really?
>
> That does not seem like a strongly typed universal function pointer.
>
>
> It=E2=80=99s not strongly typed, it=E2=80=99s type-erased. If you want to=
observe the=20
> type, check target_type().
>
> Breaking your example would break all implicit conversions. Perhaps=20
> narrowing conversions deserve a crackdown, but the example isn=E2=80=99t =
even that.
>
I think you read the conversion backwards. The std::function's interface=20
takes a `double`, which must be converted to an `int` for consumption by=20
the function pointer.
And double-to-int most certainly is narrowing.
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_204_1701200147.1431884531896
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Sunday, May 17, 2015 at 11:56:25 AM UTC-4, Davi=
d Krauss wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-=
left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div style=3D"w=
ord-wrap:break-word"><br><div><blockquote type=3D"cite"><div>On 2015=E2=80=
=9305=E2=80=9317, at 11:23 PM, <a href=3D"javascript:" target=3D"_blank" gd=
f-obfuscated-mailto=3D"NsLlN9-gt1wJ" rel=3D"nofollow" onmousedown=3D"this.h=
ref=3D'javascript:';return true;" onclick=3D"this.href=3D'javascript:';retu=
rn true;">mash.bo...@gmail.com</a> wrote:</div><br><div><div dir=3D"ltr" st=
yle=3D"font-family:Helvetica;font-size:12px;font-style:normal;font-variant:=
normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-ali=
gn:start;text-indent:0px;text-transform:none;white-space:normal;word-spacin=
g:0px"><div>void fn(int a) { ... }</div><div><br></div><div>std::function&l=
t;void(double)> fp1 =3D &fn; //really?</div><div><br></div><div>That=
does not seem like a strongly typed universal function pointer.</div></div=
></div></blockquote></div><br><div>It=E2=80=99s not strongly typed, it=E2=
=80=99s type-erased. If you want to observe the type, check <font face=3D"C=
ourier">target_type()</font>.</div><div><br></div><div>Breaking your exampl=
e would break all implicit conversions. Perhaps narrowing conversions deser=
ve a crackdown, but the example isn=E2=80=99t even that.</div></div></block=
quote><div><br>I think you read the conversion backwards. The std::function=
's interface takes a `double`, which must be converted to an `int` for cons=
umption by the function pointer.<br><br>And double-to-int most certainly is=
narrowing.</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_204_1701200147.1431884531896--
------=_Part_203_1257824018.1431884531888--
.
Author: David Krauss <potswa@mac.com>
Date: Mon, 18 May 2015 01:49:18 +0800
Raw View
> On 2015=E2=80=9305=E2=80=9318, at 1:42 AM, Nicol Bolas <jmckesson@gmail.c=
om> wrote:
>=20
> I think you read the conversion backwards. The std::function's interface =
takes a `double`, which must be converted to an `int` for consumption by th=
e function pointer.
>=20
> And double-to-int most certainly is narrowing.
Derp.
So we have a narrowing conversion=E2=80=A6 is someone proposing to diagnose=
these?
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
.
Author: mash.boyko2014@gmail.com
Date: Sun, 17 May 2015 14:28:39 -0700 (PDT)
Raw View
------=_Part_178_420962495.1431898119758
Content-Type: multipart/alternative;
boundary="----=_Part_179_1038369930.1431898119762"
------=_Part_179_1038369930.1431898119762
Content-Type: text/plain; charset=UTF-8
On Sunday, May 17, 2015 at 12:36:19 PM UTC-5, Nicol Bolas wrote:
>
>
>
> On Sunday, May 17, 2015 at 11:23:03 AM UTC-4, mash.bo...@gmail.com wrote:
>>
>>
>>
>> On Sunday, May 17, 2015 at 12:14:37 AM UTC-5, Nicol Bolas wrote:
>>>
>>> On Sunday, May 17, 2015 at 12:34:37 AM UTC-4, mash.bo...@gmail.com
>>> wrote:
>>>>
>>>> Here is a strategy that I believe could compare all function types with
>>>> the one constraint that mutating functors and lambdas are not allowed
>>>> (reasonable in light of N4159 and N4348) and all user defined functors
>>>> would require an operator==.
>>>>
>>>> Operator==
>>>> 1. If target types are different return false
>>>> 2. else if targets are standalone funtions return true if function
>>>> pointers match
>>>> 3. else if targets are member functions return true if member function
>>>> pointers and object instance pointers match
>>>> 4. else if targets are functor/lambda
>>>> A. If functor/lambda types are different return false
>>>> B. else if operator== is defined return its result
>>>> C. else return true
>>>>
>>>
>>> Assuming N4348 goes through (and it's not clear to me where the
>>> committee is on that one. Anybody with actual knowledge care to chime in?),
>>> this change to std::function seems reasonable. But it has created a problem:
>>>
>>> The ability to attach "member function pointers and object instance
>>> pointers".
>>>
>>> I understand the argument, especially now that you mostly have
>>> operator== ironed out. You want to be able to test to see if a particular
>>> member function and its instance data are the same, so that you can do
>>> whatever it is you do with that knowledge.
>>>
>>> The problem is ownership. Or rather, the *lack* of ownership.
>>>
>>> Those "object instance pointers" have got to be owned by someone. Are
>>> you going to allow these pointers to be smart pointers? What about
>>> comparing different pointer types, like if a pointer was registered with a
>>> std::shared_ptr, but is being compared with a std::observer_ptr or a naked
>>> pointer? Logically, the equality test shouldn't care, but your test doesn't
>>> take this into account.
>>>
>>> And if you deny ownership at all, if you only allow naked pointers for
>>> such bindings, then... well, people are still going to want to give
>>> std::function ownership. So they'll be forced to manage memory, most likely
>>> by using a wrapper lambda. At which point, you've basically lost all of the
>>> equality testing potential here. So they'd have to implement some kind of
>>> wrapper non-lambda type.
>>>
>>> And then that wrapper type would have to answer all the questions above.
>>> And do so in a way that erases the actual type of the member pointer and
>>> instance (smart) pointer from the interface, so that the wrapper type will
>>> be the same for all types.
>>>
>>> It's just a big can of worms.
>>>
>>
>> I don't want to go there - no object ownership. Maybe if someone wanted
>> to traffic in ownership a class that is implemented in terms of this type
>> would be an option instead of wrappers used by this type.
>>
>
> There's a reason why we invented RAII, smart pointers, and explicit
> ownership of objects in C++. To arbitrarily *forbid* such management in a
> feature as important as delegates seems very narrow-minded.
>
>
>>> Lastly, you still never explained what you need this equality testing
>>> feature for. You want to make non-trivial changes to std::function, but you
>>> only have one use case. And even that's not so much a "can't do this
>>> without the feature" as "well, I can still do this without the feature, but
>>> I would rather not because... oh look, a bunny!"
>>>
>>
>> I already pointed out a couple good reasons:
>>
>
> I'm going to deal with your "good reasons" in turn, but I keep bringing up
> a point that you keep ignoring it.
>
> You're always talking about events/delegates/signals. This is the *only
> example* you have for where comparing functions is useful.
>
> So let's pretend for a moment that your "good reasons" actually are good
> reasons. Let's take it as a given that the correct interface for
> events/delegates/signals, the only one worth using, is based on "function"
> comparison.
>
> So... why does std::function need to support comparison? Or why do we need
> to invent a new type that does? If the *only reason* you need to compare
> functions is for your perfect event/delegate/signal system, then just build
> that into its interface:
>
> template<typename Sig>
> class event
> {
> public:
>
> void connect(Sig *func_ptr);
>
> template<typename T>
> void connect(... *mem_func_ptr, T *t_ptr);
>
> template<ConstCallableAndComparable Functor>
> void connect(Functor *functor);
>
> void disconnect(Sig *func_ptr);
>
> template<typename T>
> void disconnect(... *mem_func_ptr, T *t_ptr);
>
> template<ConstCallableAndComparable Functor>
> void disconnect(Functor *functor);
> };
>
> There is nothing about this interface which *requires* that the user
> explicitly be exposed to the comparability aspect. That would purely be an
> implementation detail. And that way, you can define whatever rules you
> want, without affecting std::function or adding a new type or anything of
> the like.
>
> You can require that functors have certain properties. You can test them,
> as I did above via concepts. And so forth.
>
This isn't the worst idea and in fact I did write one of these to hide the
implementation (older macro based delegate system I created a while back).
Writing the RAII scoped connection object turned out to be a bit more
difficult, but doable.
>
> If you can't come up with some *other* reason, some other real use-case
> for function comparison besides events/delegates/signals, then just propose
> an event system like the above.
>
Comparing function pointer has been around since the beginnings of c and
its used in ways I can't even imagine. If we did a search for function
pointer comparison in a large code bases I have no doubt I would find many
uses I can't possibly imagine.
Here is a reasonable programming problem for you to write... Write a
funciton called execute_action that takes an arbitrary action with a
signature of returning void and taking no params (i.e. void() ).
execute_action shall execute the action so long as the action is different
from the previously executed action. That is the same action is not allowed
to be executed back to back. Here is how i would write execute_action:
void execute_action(fun_ptr<void()> action) {
static fun_ptr<void()> last_executed = nullptr;
if (action != last_executed) {
action();
last_executed = std::move(action);
}
}
Want to implement this with std::function?
>
>
>> 1. When where an attach and where the matching detach are in different
>> scopes then a shared or copied connection object is required - propagating
>> objects around and maybe adding additional physical dependencies.
>>
>
> I want to restate your objection to a connection object. You're saying
> that using a connection object requires that the place where the attachment
> is made and the place where the attachment is severed have some sort of
> dependency. That there must be some means of communication between them.
>
> But... that dependency *already exists*. Why? Because both places need
> access to whatever function was registered.
>
> If it was a non-member function pointer, then this function needs to be
> accessible to both. It can't be a file-static function unless both places
> are in the same file. It can't be a private static member unless both
> places are in the same object.
>
> If you registered a member+pointer, then not only do you need access to
> the member being registered (and therefore, you can't make it private), you
> also need access to the exact pointer that was registered. And not a
> derived class or base class type either; it's got to be value-identical.
>
> So clearly there *must already exist* some means of communication between
> the attacher and the detacher.
>
> Now, to be fair, there is one difference: a specific connection object can
> only be used with the specific event that it was made by. A function
> pointer alone can be used by any event object, while a connection object is
> event-specific.
>
> Personally, I'd call that a feature, not a bug. But that's for other
> reasons (see below).
>
>
>> 2. there is no way to know by examining a connection what attach the
>> connection object refers to - if you want to know that information you
>> would have to associate the connection with some additional data.
>>
>
> ... I don't know what you mean by that. Presumably, any connection-based
> interface could be used to fetch the std::function object that was
> registered to the event/delegate/signal. And I don't know what other
> "information" would be associated with the connection that you might want
> to query.
>
> 3. function compares are more flexible. function compares can easily be
>> used to create a connection like object for the case where that is better
>> or it can simply perform on demand detaches without having to manage
>> connection objects when that is better.
>>
>
> Yes, you could have one or the other. So?
>
> It would be a very dysfunctional codebase that attempts to use *both*.
> Especially for the same event/delegate/signal objects; that's just begging
> for disaster (then again, you seem perfectly fine with storing non-owning
> pointers in events long-term, so begging for disaster is really par for the
> course).
>
> The only advantage of such a system is that it would allow two different
> codebases to use two different coding styles. And I fail to see how that's
> a good thing.
>
> Other points in favor of connections:
>
> 4) You don't have to expose implementation details, like pointers to the
> exact object being registered. What does the code that detaches the
> attachment care exactly what kind of thing was attached? Why should that
> code have to be modified just because you decided to switch from a
> non-member function to a member+instance? Or if you decide to wrap what
> used to be a regular function pointer in a lambda?
>
> This is *especially* true once you start shoving lambdas into it. Because
> it means that, if I attach a lambda to an event... then whoever it is that
> detaches that lambda needs access to the *exact lambda* that I created.
> Not merely a lambda function that does the same thing. It must be the exact
> same lambda, since every lambda declaration is its own type.
>
> So now, I can't really use function-local lambdas; my lambda has to be
> externally visible to the function. At which point, it loses about 90% of
> the advantages of being a lambda in the first place; it may as well be a
> normal functor.
>
> Connection objects promote better encapsulation.
>
> 5) The functor doesn't have to be `const`. Remember: your method relies
> upon N4348. And even though Ville apparently wants to do his best to ensure
> that this doesn't happen, you can still do what I suggested above and write
> an event system that doesn't rely on an externally-visible class. So your
> event class can delcare that only `const` functors are allowed, presumably
> so that you can implement comparisons.
>
> However... what is conceptually wrong with registering an event that has
> modifiable internal state? After all, if I registered a member
> pointer+instance, you don't require that the instance pointer be `const` or
> that the member pointer be callable via a `const` instance. If a member
> pointer can modify its instance data, then why can't a functor?
>
> That is, it's legal to do this:
>
> struct Functor
> {
> void operator()() {++state;}
>
> int state;
> };
>
> auto fn = new Functor;
> event->connect(&Functor::operator(), &fn);
>
> But not this, with the exact same object type:
>
> event->connect(Functor{});
>
> This seems like a rather arbitrary and absurd distinction to make.
>
> The only reason you don't allow functor state modification is to make
> comparing functors reasonable. But if we use connection objects to manage
> connections, then we don't have to care about comparing std::function
> objects. At which point, it is perfectly possible to register non-`const`
> functions to events/delegates/signals.
>
> Connection objects promote more sane APIs with regard to functors.
>
> C++ isn't C# or Java or Python. Functors are really important in C++, and
> any event system worthy of being in the standard library needs to support
> them *just as effectively* (if not moreso) as it supports member
> pointer+instances or whatever.
>
> And if providing that support requires that C++ events/delegates/signals
> must use explicit connection objects rather than passing the function
> again, then that's the interface C++ should use.
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_179_1038369930.1431898119762
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Sunday, May 17, 2015 at 12:36:19 PM UTC-5, Nico=
l Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-l=
eft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"=
><br><br>On Sunday, May 17, 2015 at 11:23:03 AM UTC-4, <a>mash.bo...@gmail.=
com</a> wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-le=
ft:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><br>=
<br>On Sunday, May 17, 2015 at 12:14:37 AM UTC-5, Nicol Bolas wrote:<blockq=
uote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:=
1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">On Sunday, May 17, 2015 a=
t 12:34:37 AM UTC-4, <a>mash.bo...@gmail.com</a> wrote:<blockquote class=3D=
"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc soli=
d;padding-left:1ex"><div dir=3D"ltr"><div></div><div>Here is a strategy tha=
t I believe could compare all function types with the one constraint that m=
utating functors and lambdas are not allowed (reasonable in light of N4159 =
and N4348) and all user defined functors would require an operator=3D=3D.</=
div><div><br></div><div>Operator=3D=3D</div><div>1. If target types are dif=
ferent return false</div><div>2. else if targets are standalone funtions re=
turn true if function pointers match</div><div>3. else if targets are membe=
r functions return true if member function pointers and object instance poi=
nters match</div><div>4. else if targets are functor/lambda</div><div> =
; A. If functor/lambda types are different return false</div><div>&nb=
sp; B. else if operator=3D=3D is defined return its result<br></div><=
div> C. else return true</div></div></blockquote><div><br>Assum=
ing N4348 goes through (and it's not clear to me where the committee is on =
that one. Anybody with actual knowledge care to chime in?), this change to =
std::function seems reasonable. But it has created a problem:<br><br>The ab=
ility to attach "member function pointers and object instance pointers".<br=
><br>I understand the argument, especially now that you mostly have operato=
r=3D=3D ironed out. You want to be able to test to see if a particular memb=
er function and its instance data are the same, so that you can do whatever=
it is you do with that knowledge.<br><br>The problem is ownership. Or rath=
er, the <i>lack</i> of ownership.<br><br>Those "object instance pointers" h=
ave got to be owned by someone. Are you going to allow these pointers to be=
smart pointers? What about comparing different pointer types, like if a po=
inter was registered with a std::shared_ptr, but is being compared with a s=
td::observer_ptr or a naked pointer? Logically, the equality test shouldn't=
care, but your test doesn't take this into account.<br><br>And if you deny=
ownership at all, if you only allow naked pointers for such bindings, then=
.... well, people are still going to want to give std::function ownership. S=
o they'll be forced to manage memory, most likely by using a wrapper lambda=
.. At which point, you've basically lost all of the equality testing potenti=
al here. So they'd have to implement some kind of wrapper non-lambda type.<=
br><br>And then that wrapper type would have to answer all the questions ab=
ove. And do so in a way that erases the actual type of the member pointer a=
nd instance (smart) pointer from the interface, so that the wrapper type wi=
ll be the same for all types.<br><br>It's just a big can of worms.<br></div=
></div></blockquote><div><br></div><div>I don't want to go there - no objec=
t ownership. Maybe if someone wanted to traffic in ownership a class that i=
s implemented in terms of this type would be an option instead of wrappers =
used by this type.</div></div></blockquote><div><br>There's a reason why we=
invented RAII, smart pointers, and explicit ownership of objects in C++. T=
o arbitrarily <i>forbid</i> such management in a feature as important as de=
legates seems very narrow-minded.<br><br></div><blockquote class=3D"gmail_q=
uote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;paddin=
g-left:1ex"><div dir=3D"ltr"><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div d=
ir=3D"ltr"><div><br>Lastly, you still never explained what you need this eq=
uality testing feature for. You want to make non-trivial changes to std::fu=
nction, but you only have one use case. And even that's not so much a "can'=
t do this without the feature" as "well, I can still do this without the fe=
ature, but I would rather not because... oh look, a bunny!"<br></div></div>=
</blockquote><div><br></div><div>I already pointed out a couple good reason=
s:</div></div></blockquote><div><br>I'm going to deal with your "good reaso=
ns" in turn, but I keep bringing up a point that you keep ignoring it.<br><=
br>You're always talking about events/delegates/signals. This is the <b>onl=
y example</b> you have for where comparing functions is useful.<br><br>So l=
et's pretend for a moment that your "good reasons" actually are good reason=
s. Let's take it as a given that the correct interface for events/delegates=
/signals, the only one worth using, is based on "function" comparison.<br><=
br>So... why does std::function need to support comparison? Or why do we ne=
ed to invent a new type that does? If the <i>only reason</i> you need to co=
mpare functions is for your perfect event/delegate/signal system, then just=
build that into its interface:<br><br><div style=3D"background-color:rgb(2=
50,250,250);border-color:rgb(187,187,187);border-style:solid;border-width:1=
px;word-wrap:break-word"><code><div><span style=3D"color:#008">template</sp=
an><span style=3D"color:#660"><</span><span style=3D"color:#008">typenam=
e</span><span style=3D"color:#000"> </span><span style=3D"color:#606">Sig</=
span><span style=3D"color:#660">></span><span style=3D"color:#000"><br><=
/span><span style=3D"color:#008">class</span><span style=3D"color:#000"> </=
span><span style=3D"color:#008">event</span><span style=3D"color:#000"><br>=
</span><span style=3D"color:#660">{</span><span style=3D"color:#000"><br></=
span><span style=3D"color:#008">public</span><span style=3D"color:#660">:</=
span><span style=3D"color:#000"><br><br> </span><span style=3D"color:=
#008">void</span><span style=3D"color:#000"> connect</span><span style=3D"c=
olor:#660">(</span><span style=3D"color:#606">Sig</span><span style=3D"colo=
r:#000"> </span><span style=3D"color:#660">*</span><span style=3D"color:#00=
0">func_ptr</span><span style=3D"color:#660">);</span><span style=3D"color:=
#000"><br><br> </span><span style=3D"color:#008">template</span><span=
style=3D"color:#660"><</span><span style=3D"color:#008">typename</span>=
<span style=3D"color:#000"> T</span><span style=3D"color:#660">></span><=
span style=3D"color:#000"><br> </span><span style=3D"color:#00=
8">void</span><span style=3D"color:#000"> connect</span><span style=3D"colo=
r:#660">(...</span><span style=3D"color:#000"> </span><span style=3D"color:=
#660">*</span><span style=3D"color:#000">mem_func_ptr</span><span style=3D"=
color:#660">,</span><span style=3D"color:#000"> T </span><span style=3D"col=
or:#660">*</span><span style=3D"color:#000">t_ptr</span><span style=3D"colo=
r:#660">);</span><span style=3D"color:#000"><br><br> </span><span sty=
le=3D"color:#008">template</span><span style=3D"color:#660"><</span><spa=
n style=3D"color:#606">ConstCallableAndCompa<wbr>rable</span><span style=3D=
"color:#000"> </span><span style=3D"color:#606">Functor</span><span style=
=3D"color:#660">></span><span style=3D"color:#000"><br> </s=
pan><span style=3D"color:#008">void</span><span style=3D"color:#000"> conne=
ct</span><span style=3D"color:#660">(</span><span style=3D"color:#606">Func=
tor</span><span style=3D"color:#000"> </span><span style=3D"color:#660">*</=
span><span style=3D"color:#000">functor</span><span style=3D"color:#660">);=
</span><span style=3D"color:#000"><br><br> </span><span style=3D"colo=
r:#008">void</span><span style=3D"color:#000"> disconnect</span><span style=
=3D"color:#660">(</span><span style=3D"color:#606">Sig</span><span style=3D=
"color:#000"> </span><span style=3D"color:#660">*</span><span style=3D"colo=
r:#000">func_ptr</span><span style=3D"color:#660">);</span><span style=3D"c=
olor:#000"><br><br> </span><span style=3D"color:#008">template</span>=
<span style=3D"color:#660"><</span><span style=3D"color:#008">typename</=
span><span style=3D"color:#000"> T</span><span style=3D"color:#660">></s=
pan><span style=3D"color:#000"><br> </span><span style=3D"colo=
r:#008">void</span><span style=3D"color:#000"> disconnect</span><span style=
=3D"color:#660">(...</span><span style=3D"color:#000"> </span><span style=
=3D"color:#660">*</span><span style=3D"color:#000">mem_func_ptr</span><span=
style=3D"color:#660">,</span><span style=3D"color:#000"> T </span><span st=
yle=3D"color:#660">*</span><span style=3D"color:#000">t_ptr</span><span sty=
le=3D"color:#660">);</span><span style=3D"color:#000"><br><br> </span=
><span style=3D"color:#008">template</span><span style=3D"color:#660"><<=
/span><span style=3D"color:#606">ConstCallableAndCompa<wbr>rable</span><spa=
n style=3D"color:#000"> </span><span style=3D"color:#606">Functor</span><sp=
an style=3D"color:#660">></span><span style=3D"color:#000"><br> &n=
bsp; </span><span style=3D"color:#008">void</span><span style=3D"color:#000=
"> disconnect</span><span style=3D"color:#660">(</span><span style=3D"color=
:#606">Functor</span><span style=3D"color:#000"> </span><span style=3D"colo=
r:#660">*</span><span style=3D"color:#000">functor</span><span style=3D"col=
or:#660">);</span><span style=3D"color:#000"><br></span><span style=3D"colo=
r:#660">};</span><span style=3D"color:#000"><br></span></div></code></div><=
br>There is nothing about this interface which <i>requires</i> that the use=
r explicitly be exposed to the comparability aspect. That would purely be a=
n implementation detail. And that way, you can define whatever rules you wa=
nt, without affecting std::function or adding a new type or anything of the=
like.<br></div></div></blockquote><blockquote class=3D"gmail_quote" style=
=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: =
1ex;"><div dir=3D"ltr"><div><br>You can require that functors have certain =
properties. You can test them, as I did above via concepts. And so forth.<b=
r></div></div></blockquote><div><br></div><div>This isn't the worst idea an=
d in fact I did write one of these to hide the implementation (older macro =
based delegate system I created a while back). Writing the RAII scoped conn=
ection object turned out to be a bit more difficult, but doable.</div><div>=
</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-lef=
t: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><=
div><br>If you can't come up with some <b><i>other</i></b> reason, some oth=
er real use-case for function comparison besides events/delegates/signals, =
then just propose an event system like the above.<br></div></div></blockquo=
te><div><br></div><div>Comparing function pointer has been around since the=
beginnings of c and its used in ways I can't even imagine. If we did a sea=
rch for function pointer comparison in a large code bases I have no doubt I=
would find many uses I can't possibly imagine.</div><div><br></div><div>He=
re is a reasonable programming problem for you to write... Write a funciton=
called execute_action that takes an arbitrary action with a signature of r=
eturning void and taking no params (i.e. void() ). execute_action shall exe=
cute the action so long as the action is different from the previously exec=
uted action. That is the same action is not allowed to be executed back to =
back. Here is how i would write execute_action:</div><div><br></div><div cl=
ass=3D"prettyprint" style=3D"border: 1px solid rgb(187, 187, 187); word-wra=
p: break-word; background-color: rgb(250, 250, 250);"><code class=3D"pretty=
print"><div class=3D"subprettyprint"><span style=3D"color: #008;" class=3D"=
styled-by-prettify">void</span><span style=3D"color: #000;" class=3D"styled=
-by-prettify"> execute_action</span><span style=3D"color: #660;" class=3D"s=
tyled-by-prettify">(</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify">fun_ptr</span><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify"><</span><span style=3D"color: #008;" class=3D"styled-by-prettify"=
>void</span><span style=3D"color: #660;" class=3D"styled-by-prettify">()>=
;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> action</=
span><span style=3D"color: #660;" class=3D"styled-by-prettify">)</span><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">{</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br> </span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">static</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"> fun_ptr</span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify"><</span><span style=3D"color: #=
008;" class=3D"styled-by-prettify">void</span><span style=3D"color: #660;" =
class=3D"styled-by-prettify">()></span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"> last_executed </span><span style=3D"color: #660;"=
class=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><span style=3D"color: #008;" class=3D"style=
d-by-prettify">nullptr</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"><br> </span><span style=3D"color: #008;" class=3D"styled-by-=
prettify">if</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify">action </span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">!=3D</span><span st=
yle=3D"color: #000;" class=3D"styled-by-prettify"> last_executed</span><spa=
n style=3D"color: #660;" class=3D"styled-by-prettify">)</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">{</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify"><br> action</span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">();</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"><br> last_ex=
ecuted </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=3D=
</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> std</span=
><span style=3D"color: #660;" class=3D"styled-by-prettify">::</span><span s=
tyle=3D"color: #000;" class=3D"styled-by-prettify">move</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify">action</span><span style=3D"color: #6=
60;" class=3D"styled-by-prettify">);</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"><br> </span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">}</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br></span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">}</span></div></code></div><div><br></div><div>Want to im=
plement this with std::function?</div><div> </div><blockquote class=3D=
"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc s=
olid;padding-left: 1ex;"><div dir=3D"ltr"><div> </div><blockquote clas=
s=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div dir=3D"ltr"><div> 1. When where an=
attach and where the matching detach are in different scopes then a shared=
or copied connection object is required - propagating objects around and m=
aybe adding additional physical dependencies.</div></div></blockquote><div>=
<br>I want to restate your objection to a connection object. You're saying =
that using a connection object requires that the place where the attachment=
is made and the place where the attachment is severed have some sort of de=
pendency. That there must be some means of communication between them.<br><=
br>But... that dependency <i>already exists</i>. Why? Because both places n=
eed access to whatever function was registered.<br><br>If it was a non-memb=
er function pointer, then this function needs to be accessible to both. It =
can't be a file-static function unless both places are in the same file. It=
can't be a private static member unless both places are in the same object=
..<br><br>If you registered a member+pointer, then not only do you need acce=
ss to the member being registered (and therefore, you can't make it private=
), you also need access to the exact pointer that was registered. And not a=
derived class or base class type either; it's got to be value-identical.<b=
r><br>So clearly there <i>must already exist</i> some means of communicatio=
n between the attacher and the detacher.<br><br>Now, to be fair, there is o=
ne difference: a specific connection object can only be used with the speci=
fic event that it was made by. A function pointer alone can be used by any =
event object, while a connection object is event-specific.<br><br>Personall=
y, I'd call that a feature, not a bug. But that's for other reasons (see be=
low).<br> </div><blockquote class=3D"gmail_quote" style=3D"margin:0;ma=
rgin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"lt=
r"><div> 2. there is no way to know by examining a connection w=
hat attach the connection object refers to - if you want to know that infor=
mation you would have to associate the connection with some additional data=
..</div></div></blockquote><div><br>... I don't know what you mean by that. =
Presumably, any connection-based interface could be used to fetch the std::=
function object that was registered to the event/delegate/signal. And I don=
't know what other "information" would be associated with the connection th=
at you might want to query.<br><br></div><blockquote class=3D"gmail_quote" =
style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left=
:1ex"><div dir=3D"ltr"><div> 3. function compares are more flex=
ible. function compares can easily be used to create a connection like obje=
ct for the case where that is better or it can simply perform on demand det=
aches without having to manage connection objects when that is better.</div=
></div></blockquote><div><br>Yes, you could have one or the other. So?<br><=
br>It would be a very dysfunctional codebase that attempts to use <i>both</=
i>. Especially for the same event/delegate/signal objects; that's just begg=
ing for disaster (then again, you seem perfectly fine with storing non-owni=
ng pointers in events long-term, so begging for disaster is really par for =
the course).<br><br>The only advantage of such a system is that it would al=
low two different codebases to use two different coding styles. And I fail =
to see how that's a good thing.<br><br>Other points in favor of connections=
:<br><br>4) You don't have to expose implementation details, like pointers =
to the exact object being registered. What does the code that detaches the =
attachment care exactly what kind of thing was attached? Why should that co=
de have to be modified just because you decided to switch from a non-member=
function to a member+instance? Or if you decide to wrap what used to be a =
regular function pointer in a lambda?<br><br>This is <i>especially</i> true=
once you start shoving lambdas into it. Because it means that, if I attach=
a lambda to an event... then whoever it is that detaches that lambda<i> </=
i>needs access to the <i>exact lambda</i> that I created. Not merely a lamb=
da function that does the same thing. It must be the exact same lambda, sin=
ce every lambda declaration is its own type.<br><br>So now, I can't really =
use function-local lambdas; my lambda has to be externally visible to the f=
unction. At which point, it loses about 90% of the advantages of being a la=
mbda in the first place; it may as well be a normal functor.<br><br>Connect=
ion objects promote better encapsulation.<br><br>5) The functor doesn't hav=
e to be `const`. Remember: your method relies upon N4348. And even though V=
ille apparently wants to do his best to ensure that this doesn't happen, yo=
u can still do what I suggested above and write an event system that doesn'=
t rely on an externally-visible class. So your event class can delcare that=
only `const` functors are allowed, presumably so that you can implement co=
mparisons.<br><br>However... what is conceptually wrong with registering an=
event that has modifiable internal state? After all, if I registered a mem=
ber pointer+instance, you don't require that the instance pointer be `const=
` or that the member pointer be callable via a `const` instance. If a membe=
r pointer can modify its instance data, then why can't a functor?<br><br>Th=
at is, it's legal to do this:<br><br><div style=3D"background-color:rgb(250=
,250,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px=
;word-wrap:break-word"><code><div><span style=3D"color:#008">struct</span><=
span style=3D"color:#000"> </span><span style=3D"color:#606">Functor</span>=
<span style=3D"color:#000"><br></span><span style=3D"color:#660">{</span><s=
pan style=3D"color:#000"><br> </span><span style=3D"color:#008">void<=
/span><span style=3D"color:#000"> </span><span style=3D"color:#008">operato=
r</span><span style=3D"color:#660">()()</span><span style=3D"color:#000"> <=
/span><span style=3D"color:#660">{++</span><span style=3D"color:#000">state=
</span><span style=3D"color:#660">;}</span><span style=3D"color:#000"><br><=
br> </span><span style=3D"color:#008">int</span><span style=3D"color:=
#000"> state</span><span style=3D"color:#660">;</span><span style=3D"color:=
#000"><br></span><span style=3D"color:#660">};</span><span style=3D"color:#=
000"><br><br></span><span style=3D"color:#008">auto</span><span style=3D"co=
lor:#000"> fn </span><span style=3D"color:#660">=3D</span><span style=3D"co=
lor:#000"> </span><span style=3D"color:#008">new</span><span style=3D"color=
:#000"> </span><span style=3D"color:#606">Functor</span><span style=3D"colo=
r:#660">;</span><span style=3D"color:#000"><br></span><span style=3D"color:=
#008">event</span><span style=3D"color:#660">-></span><span style=3D"col=
or:#000">connect</span><span style=3D"color:#660">(&</span><span style=
=3D"color:#606">Functor</span><span style=3D"color:#660">::</span><span sty=
le=3D"color:#008">opera<wbr>tor</span><span style=3D"color:#660">(),</span>=
<span style=3D"color:#000"> </span><span style=3D"color:#660">&</span><=
span style=3D"color:#000">fn</span><span style=3D"color:#660">);</span><spa=
n style=3D"color:#000"><br></span></div></code></div><br>But not this, with=
the exact same object type:<br><br><div style=3D"background-color:rgb(250,=
250,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px;=
word-wrap:break-word"><code><div><span style=3D"color:#008">event</span><sp=
an style=3D"color:#660">-></span><span style=3D"color:#000">connect</spa=
n><span style=3D"color:#660">(</span><span style=3D"color:#606">Functor</sp=
an><span style=3D"color:#660">{});</span></div></code></div><br>This seems =
like a rather arbitrary and absurd distinction to make.<br><br>The only rea=
son you don't allow functor state modification is to make comparing functor=
s reasonable. But if we use connection objects to manage connections, then =
we don't have to care about comparing std::function objects. At which point=
, it is perfectly possible to register non-`const` functions to events/dele=
gates/signals.<br><br>Connection objects promote more sane APIs with regard=
to functors.<br><br>C++ isn't C# or Java or Python. Functors are really im=
portant in C++, and any event system worthy of being in the standard librar=
y needs to support them <i>just as effectively</i> (if not moreso) as it su=
pports member pointer+instances or whatever.<br><br>And if providing that s=
upport requires that C++ events/delegates/signals must use explicit connect=
ion objects rather than passing the function again, then that's the interfa=
ce C++ should use.<br></div></div></blockquote></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_179_1038369930.1431898119762--
------=_Part_178_420962495.1431898119758--
.
Author: mash.boyko2014@gmail.com
Date: Sun, 17 May 2015 14:35:55 -0700 (PDT)
Raw View
------=_Part_150_17405178.1431898555441
Content-Type: multipart/alternative;
boundary="----=_Part_151_471050654.1431898555441"
------=_Part_151_471050654.1431898555441
Content-Type: text/plain; charset=UTF-8
On Sunday, May 17, 2015 at 12:36:19 PM UTC-5, Nicol Bolas wrote:
>
>
> 3. function compares are more flexible. function compares can easily be
>> used to create a connection like object for the case where that is better
>> or it can simply perform on demand detaches without having to manage
>> connection objects when that is better.
>>
>
> Yes, you could have one or the other. So?
>
> It would be a very dysfunctional codebase that attempts to use *both*.
> Especially for the same event/delegate/signal objects; that's just begging
> for disaster (then again, you seem perfectly fine with storing non-owning
> pointers in events long-term, so begging for disaster is really par for the
> course).
>
>
Boost allows connecting and disconnecting directly. dysfunctional?
From boost documentation:
> Disconnecting Equivalent Slots (Intermediate)
>
> One can disconnect slots that are equivalent to a given function object
> using a form of the signal::disconnect
> <http://www.boost.org/doc/libs/1_58_0/doc/html/boost/signals2/signal.html#idp195142656-bb> method,
> so long as the type of the function object has an accessible == operator.
> For instance:
>
> void foo() { std::cout << "foo"; }
> void bar() { std::cout << "bar\n"; }
>
> boost::signals2::signal <http://www.boost.org/doc/libs/1_58_0/doc/html/boost/signals2/signal.html><void ()> sig;
>
> sig.connect(&foo);
> sig.connect(&bar);
> sig();
>
> // disconnects foo, but not bar
> sig.disconnect(&foo);
> sig();
>
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_151_471050654.1431898555441
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Sunday, May 17, 2015 at 12:36:19 PM UTC-5, Nico=
l Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-l=
eft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"=
><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-=
left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><d=
iv> 3. function compares are more flexible. function compares c=
an easily be used to create a connection like object for the case where tha=
t is better or it can simply perform on demand detaches without having to m=
anage connection objects when that is better.</div></div></blockquote><div>=
<br>Yes, you could have one or the other. So?<br><br>It would be a very dys=
functional codebase that attempts to use <i>both</i>. Especially for the sa=
me event/delegate/signal objects; that's just begging for disaster (then ag=
ain, you seem perfectly fine with storing non-owning pointers in events lon=
g-term, so begging for disaster is really par for the course).<br><br></div=
></div></blockquote><div><br></div><div>Boost allows connecting and disconn=
ecting directly. dysfunctional? </div><div><br></div><div>From boost d=
ocumentation:</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;mar=
gin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D=
"ltr"><div><div class=3D"section" style=3D"color: rgb(0, 0, 0); font-family=
: sans-serif; font-size: medium;"><div class=3D"titlepage"><h4 class=3D"tit=
le" style=3D"margin: 1em 0em 1pc; font-weight: bold; font-size: 19.20000076=
29395px;">Disconnecting Equivalent Slots (Intermediate)</h4></div><p style=
=3D"font-size: 10pt; line-height: 1.15;">One can disconnect slots that are =
equivalent to a given function object using a form of the <code class=
=3D"computeroutput"><a class=3D"link" href=3D"http://www.boost.org/doc/libs=
/1_58_0/doc/html/boost/signals2/signal.html#idp195142656-bb" style=3D"color=
: rgb(156, 90, 156);">signal::disconnect</a></code> method, so long as=
the type of the function object has an accessible <code class=3D"comp=
uteroutput">=3D=3D</code> operator. For instance:</p><pre class=3D"pro=
gramlisting" style=3D"font-size: 9pt; margin: 1pc 36.7734375px 0pc; padding=
: 0.5pc; border: 1px solid rgb(220, 220, 220);"><code class=3D"computeroutp=
ut">void foo() { std::cout << "foo"; }
void bar() { std::cout << "bar\n"; }
</code></pre><pre class=3D"programlisting" style=3D"font-size: 9pt; margin:=
1pc 36.7734375px 0pc; padding: 0.5pc; border: 1px solid rgb(220, 220, 220)=
;"><code class=3D"computeroutput"><a class=3D"link" href=3D"http://www.boos=
t.org/doc/libs/1_58_0/doc/html/boost/signals2/signal.html" title=3D"Class t=
emplate signal" style=3D"color: rgb(156, 90, 156);">boost::signals2::signal=
</a></code><void ()> sig;</pre></div><pre class=3D"programlisting" st=
yle=3D"font-size: 9pt; margin: 1pc 36.7734375px 0pc; padding: 0.5pc; border=
: 1px solid rgb(220, 220, 220); color: rgb(0, 0, 0);"><code class=3D"comput=
eroutput"> sig.connect(&foo);
sig.connect(&bar);
sig();
// disconnects foo, but not bar
sig.disconnect(&foo);
sig();</code></pre></div></div></blockquote></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_151_471050654.1431898555441--
------=_Part_150_17405178.1431898555441--
.
Author: mash.boyko2014@gmail.com
Date: Sun, 17 May 2015 14:43:16 -0700 (PDT)
Raw View
------=_Part_166_1092415438.1431898996289
Content-Type: multipart/alternative;
boundary="----=_Part_167_1388568263.1431898996290"
------=_Part_167_1388568263.1431898996290
Content-Type: text/plain; charset=UTF-8
On Sunday, May 17, 2015 at 12:36:19 PM UTC-5, Nicol Bolas wrote:
>
>
> However... what is conceptually wrong with registering an event that has
> modifiable internal state? After all, if I registered a member
> pointer+instance, you don't require that the instance pointer be `const` or
> that the member pointer be callable via a `const` instance. If a member
> pointer can modify its instance data, then why can't a functor?
>
> That is, it's legal to do this:
>
> struct Functor
> {
> void operator()() {++state;}
>
> int state;
> };
>
> auto fn = new Functor;
> event->connect(&Functor::operator(), &fn);
>
> But not this, with the exact same object type:
>
> event->connect(Functor{});
>
> First since the operator() function is not const so it wouldn't be legal.
And second I have thought and even pointed out in this thread the ambiguity
between those 2 connects. I think it could either be disallowed or detected
and redirected to be consumed under the same target type. I don't see it as
a problem so great there is no solution.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_167_1388568263.1431898996290
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Sunday, May 17, 2015 at 12:36:19 PM UTC-5, Nico=
l Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-l=
eft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"=
><br>However... what is conceptually wrong with registering an event that h=
as modifiable internal state? After all, if I registered a member pointer+i=
nstance, you don't require that the instance pointer be `const` or that the=
member pointer be callable via a `const` instance. If a member pointer can=
modify its instance data, then why can't a functor?<br><br>That is, it's l=
egal to do this:<br><br><div style=3D"background-color:rgb(250,250,250);bor=
der-color:rgb(187,187,187);border-style:solid;border-width:1px;word-wrap:br=
eak-word"><code><div><span style=3D"color:#008">struct</span><span style=3D=
"color:#000"> </span><span style=3D"color:#606">Functor</span><span style=
=3D"color:#000"><br></span><span style=3D"color:#660">{</span><span style=
=3D"color:#000"><br> </span><span style=3D"color:#008">void</span><sp=
an style=3D"color:#000"> </span><span style=3D"color:#008">operator</span><=
span style=3D"color:#660">()()</span><span style=3D"color:#000"> </span><sp=
an style=3D"color:#660">{++</span><span style=3D"color:#000">state</span><s=
pan style=3D"color:#660">;}</span><span style=3D"color:#000"><br><br> =
</span><span style=3D"color:#008">int</span><span style=3D"color:#000"> st=
ate</span><span style=3D"color:#660">;</span><span style=3D"color:#000"><br=
></span><span style=3D"color:#660">};</span><span style=3D"color:#000"><br>=
<br></span><span style=3D"color:#008">auto</span><span style=3D"color:#000"=
> fn </span><span style=3D"color:#660">=3D</span><span style=3D"color:#000"=
> </span><span style=3D"color:#008">new</span><span style=3D"color:#000"> <=
/span><span style=3D"color:#606">Functor</span><span style=3D"color:#660">;=
</span><span style=3D"color:#000"><br></span><span style=3D"color:#008">eve=
nt</span><span style=3D"color:#660">-></span><span style=3D"color:#000">=
connect</span><span style=3D"color:#660">(&</span><span style=3D"color:=
#606">Functor</span><span style=3D"color:#660">::</span><span style=3D"colo=
r:#008">opera<wbr>tor</span><span style=3D"color:#660">(),</span><span styl=
e=3D"color:#000"> </span><span style=3D"color:#660">&</span><span style=
=3D"color:#000">fn</span><span style=3D"color:#660">);</span><span style=3D=
"color:#000"><br></span></div></code></div><br>But not this, with the exact=
same object type:<br><br><div style=3D"background-color:rgb(250,250,250);b=
order-color:rgb(187,187,187);border-style:solid;border-width:1px;word-wrap:=
break-word"><code><div><span style=3D"color:#008">event</span><span style=
=3D"color:#660">-></span><span style=3D"color:#000">connect</span><span =
style=3D"color:#660">(</span><span style=3D"color:#606">Functor</span><span=
style=3D"color:#660">{});</span></div></code></div><br></div></blockquote>=
<div>First since the operator() function is not const so it wouldn't be leg=
al. And second I have thought and even pointed out in this thread the ambig=
uity between those 2 connects. I think it could either be disallowed or det=
ected and redirected to be consumed under the same target type. I don't see=
it as a problem so great there is no solution.</div><div> </div></div=
>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_167_1388568263.1431898996290--
------=_Part_166_1092415438.1431898996289--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 17 May 2015 15:15:19 -0700 (PDT)
Raw View
------=_Part_403_566541571.1431900919034
Content-Type: multipart/alternative;
boundary="----=_Part_404_2069176646.1431900919034"
------=_Part_404_2069176646.1431900919034
Content-Type: text/plain; charset=UTF-8
On Sunday, May 17, 2015 at 5:28:39 PM UTC-4, mash.bo...@gmail.com wrote:
>
> On Sunday, May 17, 2015 at 12:36:19 PM UTC-5, Nicol Bolas wrote:
>
>
>>
>> If you can't come up with some *other* reason, some other real use-case
>> for function comparison besides events/delegates/signals, then just propose
>> an event system like the above.
>>
>
> Comparing function pointer has been around since the beginnings of c and
> its used in ways I can't even imagine. If we did a search for function
> pointer comparison in a large code bases I have no doubt I would find many
> uses I can't possibly imagine.
>
OK, you seem to have the way this works backwards.
You are the one suggesting the feature for inclusion in the standard
library. The burden of proof as to that feature's utility (and therefore
the importance of including it an *international standard*) is on *you*.
You can't just say, "I can't imagine it, but I'm sure you'll find some if
you search around in random codebases for it." That's *your job*; as the
person proposing the idea, it is your responsibility to find evidence that
it is a generally worthwhile feature. And that requires more than just
saying, "hey, I use it in event/delegate/signal types."
Equally importantly, you seem to be equating non-member function pointers
to your `fun_ptr` class, on the assumption that any code which uses one
ought to be able to use the other. I very much cannot agree with that.
If I take an actual non-member function pointer, then I'm taking a purely
stateless function. A member pointer+instance is very much not the same
thing; it is stateful, since it has that instance pointer there. A member
pointer who's instance is part of its parameter list (ie: the return value
from `mem_fn`) would be a reasonable equivalent. But once you put an
instance pointer there, it stops being an equivalent concept.
How so? Heh heh heh... read on.
Here is a reasonable programming problem for you to write...
>
There is nothing "reasonable" about this example; it is an obvious strawman
example, contrived specifically to make your point. What reason would
anyone have for an action executor who's *sole purpose* is to prevent the
execution of the same action twice?
If that is a problem in your code, if you need to explicitly filter someone
from executing the same function twice via some arbitrary means, then this
suggests that your code is completely out of control. That you have dozens
or hundreds of things banging away on some "action" system, and you cannot
resolve it in any reasonable way. Therefore, you create an arbitrary and
pointless rule about stopping the "same action" from happening multiple
times.
That's not to say that it can't happen. But it would be an incredibly rare
occurrence. And we don't standardize things to handle rare occurrences.
Write a funciton called execute_action that takes an arbitrary action with
> a signature of returning void and taking no params (i.e. void() ).
> execute_action shall execute the action so long as the action is different
> from the previously executed action. That is the same action is not allowed
> to be executed back to back. Here is how i would write execute_action:
>
> void execute_action(fun_ptr<void()> action) {
> static fun_ptr<void()> last_executed = nullptr;
> if (action != last_executed) {
> action();
> last_executed = std::move(action);
> }
> }
>
>
So... who gets rid of `last_executed`? Oh, that's right; `fun_ptr` isn't
supposed to own memory. So you simply have this object that references
memory that may or may not exist.
Oh, you may think this sophistry. But it's not. Why? Because it's the
source of a gigantic bug in your program. You don't see it? Allow me to
explain.
Your `fun_ptr` is stated to be able to take a member pointer+instance as a
valid "pointer", correct? OK, let's say you execute some action on an
object instance of type T; let's call this instance A. Instance A is
allocated on the heap.
You execute that action. So now `last_executed` contains a pointer to the
member of T. But it also contains a pointer to A.
Now, let's say we delete A; a perfectly valid thing to do. And then we
allocate a new object of type T; call it B. And, since we just deleted A,
let's say that our memory manager just so happens to allocate B in the *exact
same location* that A was in.
See the problem?
Now let's execute the same member pointer of T, but on a new instance B.
When we try to go through this again, `fun_ptr`'s equality testing system
believes that `last_executed` and `action` are the same. That's because
both the member pointers and *instance pointers* are the same. Therefore,
our action, which is new *by all reasonable definitions of that term*...
fails to execute.
Why? Because your `fun_ptr` wasn't informed that the memory it originally
referenced had been deleted. It thought that it was still a live object,
nobody nulled the action out (and since it's a function-static variable,
there's no API to do so), and thus, all it contains is a number, which
nothing in C++ declares will be unique.
This all happened because `fun_ptr` is blind to *ownership*, that thing
that you seem to believe isn't important. Yet you've managed to prove
exactly how essential it is, and therefore exactly how deficient any such
`fun_ptr` object would be *without* it.
Thank you; you did what I could not ;)
So not only is your "problem" obviously contrived and seems unlikely to
happen in the real world... you couldn't even solve problem you devised
correctly *with your own tool*.
> Want to implement this with std::function?
>
Well, since you have demonstrated that your own `fun_ptr` cannot *correctly*
implement it, I'd say the burden shifts back to you ;)
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_404_2069176646.1431900919034
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Sunday, May 17, 2015 at 5:28:39 PM UTC-4, mash.bo...@gm=
ail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-l=
eft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"=
>On Sunday, May 17, 2015 at 12:36:19 PM UTC-5, Nicol Bolas wrote:<div> =
;</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8e=
x;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br>If=
you can't come up with some <b><i>other</i></b> reason, some other real us=
e-case for function comparison besides events/delegates/signals, then just =
propose an event system like the above.<br></div></div></blockquote><div><b=
r></div><div>Comparing function pointer has been around since the beginning=
s of c and its used in ways I can't even imagine. If we did a search for fu=
nction pointer comparison in a large code bases I have no doubt I would fin=
d many uses I can't possibly imagine.</div></div></blockquote><div><br>OK, =
you seem to have the way this works backwards.<br><br>You are the one sugge=
sting the feature for inclusion in the standard library. The burden of proo=
f as to that feature's utility (and therefore the importance of including i=
t an <i>international standard</i>) is on <i>you</i>.<br><br>You can't just=
say, "I can't imagine it, but I'm sure you'll find some if you search arou=
nd in random codebases for it." That's <i>your job</i>; as the person propo=
sing the idea, it is your responsibility to find evidence that it is a gene=
rally worthwhile feature. And that requires more than just saying, "hey, I =
use it in event/delegate/signal types."<br><br>Equally importantly, you see=
m to be equating non-member function pointers to your `fun_ptr` class, on t=
he assumption that any code which uses one ought to be able to use the othe=
r. I very much cannot agree with that.<br><br>If I take an actual non-membe=
r function pointer, then I'm taking a purely stateless function. A member p=
ointer+instance is very much not the same thing; it is stateful, since it h=
as that instance pointer there. A member pointer who's instance is part of =
its parameter list (ie: the return value from `mem_fn`) would be a reasonab=
le equivalent. But once you put an instance pointer there, it stops being a=
n equivalent concept.<br><br>How so? Heh heh heh... read on.<br><br></div><=
blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bord=
er-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div></div><di=
v>Here is a reasonable programming problem for you to write...</div></div><=
/blockquote><div><br>There is nothing "reasonable" about this example; it i=
s an obvious strawman example, contrived specifically to make your point. W=
hat reason would anyone have for an action executor who's <i>sole purpose</=
i> is to prevent the execution of the same action twice?<br><br>If that is =
a problem in your code, if you need to explicitly filter someone from execu=
ting the same function twice via some arbitrary means, then this suggests t=
hat your code is completely out of control. That you have dozens or hundred=
s of things banging away on some "action" system, and you cannot resolve it=
in any reasonable way. Therefore, you create an arbitrary and pointless ru=
le about stopping the "same action" from happening multiple times.<br><br>T=
hat's not to say that it can't happen. But it would be an incredibly rare o=
ccurrence. And we don't standardize things to handle rare occurrences.<br><=
br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: =
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div=
> Write a funciton called execute_action that takes an arbitrary action wit=
h a signature of returning void and taking no params (i.e. void() ). execut=
e_action shall execute the action so long as the action is different from t=
he previously executed action. That is the same action is not allowed to be=
executed back to back. Here is how i would write execute_action:</div><div=
><br></div><div style=3D"border:1px solid rgb(187,187,187);word-wrap:break-=
word;background-color:rgb(250,250,250)"><code><div><span style=3D"color:#00=
8">void</span><span style=3D"color:#000"> execute_action</span><span style=
=3D"color:#660">(</span><span style=3D"color:#000">fun_ptr</span><span styl=
e=3D"color:#660"><</span><span style=3D"color:#008">void</span><span sty=
le=3D"color:#660">()></span><span style=3D"color:#000"> action</span><sp=
an style=3D"color:#660">)</span><span style=3D"color:#000"> </span><span st=
yle=3D"color:#660">{</span><span style=3D"color:#000"><br> </sp=
an><span style=3D"color:#008">static</span><span style=3D"color:#000"> fun_=
ptr</span><span style=3D"color:#660"><</span><span style=3D"color:#008">=
void</span><span style=3D"color:#660">()></span><span style=3D"color:#00=
0"> last_executed </span><span style=3D"color:#660">=3D</span><span style=
=3D"color:#000"> </span><span style=3D"color:#008">nullptr</span><span styl=
e=3D"color:#660">;</span><span style=3D"color:#000"><br> </span=
><span style=3D"color:#008">if</span><span style=3D"color:#000"> </span><sp=
an style=3D"color:#660">(</span><span style=3D"color:#000">action </span><s=
pan style=3D"color:#660">!=3D</span><span style=3D"color:#000"> last_execut=
ed</span><span style=3D"color:#660">)</span><span style=3D"color:#000"> </s=
pan><span style=3D"color:#660">{</span><span style=3D"color:#000"><br> =
; action</span><span style=3D"color:#660">();</span><span sty=
le=3D"color:#000"><br> last_executed </span><span style=
=3D"color:#660">=3D</span><span style=3D"color:#000"> std</span><span style=
=3D"color:#660">::</span><span style=3D"color:#000">move</span><span style=
=3D"color:#660">(</span><span style=3D"color:#000">action</span><span style=
=3D"color:#660">);</span><span style=3D"color:#000"><br> </span=
><span style=3D"color:#660">}</span><span style=3D"color:#000"><br></span><=
span style=3D"color:#660">}</span></div></code></div><div><br></div></div><=
/blockquote><div><br>So... who gets rid of `last_executed`? Oh, that's righ=
t; `fun_ptr` isn't supposed to own memory. So you simply have this object t=
hat references memory that may or may not exist.<br><br>Oh, you may think t=
his sophistry. But it's not. Why? Because it's the source of a gigantic bug=
in your program. You don't see it? Allow me to explain.<br><br>Your `fun_p=
tr` is stated to be able to take a member pointer+instance as a valid "poin=
ter", correct? OK, let's say you execute some action on an object instance =
of type T; let's call this instance A. Instance A is allocated on the heap.=
<br><br>You execute that action. So now `last_executed` contains a pointer =
to the member of T. But it also contains a pointer to A.<br><br>Now, let's =
say we delete A; a perfectly valid thing to do. And then we allocate a new =
object of type T; call it B. And, since we just deleted A, let's say that o=
ur memory manager just so happens to allocate B in the <i>exact same locati=
on</i> that A was in.<br><br>See the problem?<br><br>Now let's execute the =
same member pointer of T, but on a new instance B. When we try to go throug=
h this again, `fun_ptr`'s equality testing system believes that `last_execu=
ted` and `action` are the same. That's because both the member pointers and=
<i>instance pointers</i> are the same. Therefore, our action, which is new=
<i>by all reasonable definitions of that term</i>... fails to execute.<br>=
<br>Why? Because your `fun_ptr` wasn't informed that the memory it original=
ly referenced had been deleted. It thought that it was still a live object,=
nobody nulled the action out (and since it's a function-static variable, t=
here's no API to do so), and thus, all it contains is a number, which nothi=
ng in C++ declares will be unique.<br><br>This all happened because `fun_pt=
r` is blind to <i>ownership</i>, that thing that you seem to believe isn't =
important. Yet you've managed to prove exactly how essential it is, and the=
refore exactly how deficient any such `fun_ptr` object would be <i>without<=
/i> it.<br><br>Thank you; you did what I could not ;)<br><br>So not only is=
your "problem" obviously contrived and seems unlikely to happen in the rea=
l world... you couldn't even solve problem you devised correctly <i>with yo=
ur own tool</i>.<i></i><br> </div><blockquote class=3D"gmail_quote" st=
yle=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-lef=
t: 1ex;"><div dir=3D"ltr"><div></div><div>Want to implement this with std::=
function?</div></div></blockquote><div></div><br>Well, since you have demon=
strated that your own `fun_ptr` cannot <i>correctly</i> implement it, I'd s=
ay the burden shifts back to you ;)<br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_404_2069176646.1431900919034--
------=_Part_403_566541571.1431900919034--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 17 May 2015 15:25:27 -0700 (PDT)
Raw View
------=_Part_592_1388927719.1431901527772
Content-Type: multipart/alternative;
boundary="----=_Part_593_560930343.1431901527772"
------=_Part_593_560930343.1431901527772
Content-Type: text/plain; charset=UTF-8
On Sunday, May 17, 2015 at 5:43:16 PM UTC-4, mash.bo...@gmail.com wrote:
>
> On Sunday, May 17, 2015 at 12:36:19 PM UTC-5, Nicol Bolas wrote:
>>
>>
>> However... what is conceptually wrong with registering an event that has
>> modifiable internal state? After all, if I registered a member
>> pointer+instance, you don't require that the instance pointer be `const` or
>> that the member pointer be callable via a `const` instance. If a member
>> pointer can modify its instance data, then why can't a functor?
>>
>> That is, it's legal to do this:
>>
>> struct Functor
>> {
>> void operator()() {++state;}
>>
>> int state;
>> };
>>
>> auto fn = new Functor;
>> event->connect(&Functor::operator(), &fn);
>>
>> But not this, with the exact same object type:
>>
>> event->connect(Functor{});
>>
>> First since the operator() function is not const so it wouldn't be legal.
>
Yes, I know. I said that, when I wrote "but not this..." The problem is
that the first *is* legal. Your newest idea only talked about `const`
functors; you said nothing about disallowing member pointers who take
non-const `this`.
> And second I have thought and even pointed out in this thread the
> ambiguity between those 2 connects.
>
There is no "ambiguity" between them; there is nothing uncertain about
these cases. They are functionally identical. The problem is that your
proposal gleefully accepts one while denying the other. This was based on
the assumption that shallow, pointer-based equality can be trusted more
than deep, stateful equality.
My response to your last post demonstrates how incorrect that assumption is.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_593_560930343.1431901527772
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Sunday, May 17, 2015 at 5:43:16 PM UTC-4, mash.bo...@gm=
ail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-l=
eft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"=
>On Sunday, May 17, 2015 at 12:36:19 PM UTC-5, Nicol Bolas wrote:<blockquot=
e class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px=
#ccc solid;padding-left:1ex"><div dir=3D"ltr"><br>However... what is conce=
ptually wrong with registering an event that has modifiable internal state?=
After all, if I registered a member pointer+instance, you don't require th=
at the instance pointer be `const` or that the member pointer be callable v=
ia a `const` instance. If a member pointer can modify its instance data, th=
en why can't a functor?<br><br>That is, it's legal to do this:<br><br><div =
style=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);bo=
rder-style:solid;border-width:1px;word-wrap:break-word"><code><div><span st=
yle=3D"color:#008">struct</span><span style=3D"color:#000"> </span><span st=
yle=3D"color:#606">Functor</span><span style=3D"color:#000"><br></span><spa=
n style=3D"color:#660">{</span><span style=3D"color:#000"><br> </span=
><span style=3D"color:#008">void</span><span style=3D"color:#000"> </span><=
span style=3D"color:#008">operator</span><span style=3D"color:#660">()()</s=
pan><span style=3D"color:#000"> </span><span style=3D"color:#660">{++</span=
><span style=3D"color:#000">state</span><span style=3D"color:#660">;}</span=
><span style=3D"color:#000"><br><br> </span><span style=3D"color:#008=
">int</span><span style=3D"color:#000"> state</span><span style=3D"color:#6=
60">;</span><span style=3D"color:#000"><br></span><span style=3D"color:#660=
">};</span><span style=3D"color:#000"><br><br></span><span style=3D"color:#=
008">auto</span><span style=3D"color:#000"> fn </span><span style=3D"color:=
#660">=3D</span><span style=3D"color:#000"> </span><span style=3D"color:#00=
8">new</span><span style=3D"color:#000"> </span><span style=3D"color:#606">=
Functor</span><span style=3D"color:#660">;</span><span style=3D"color:#000"=
><br></span><span style=3D"color:#008">event</span><span style=3D"color:#66=
0">-></span><span style=3D"color:#000">connect</span><span style=3D"colo=
r:#660">(&</span><span style=3D"color:#606">Functor</span><span style=
=3D"color:#660">::</span><span style=3D"color:#008">opera<wbr>tor</span><sp=
an style=3D"color:#660">(),</span><span style=3D"color:#000"> </span><span =
style=3D"color:#660">&</span><span style=3D"color:#000">fn</span><span =
style=3D"color:#660">);</span><span style=3D"color:#000"><br></span></div><=
/code></div><br>But not this, with the exact same object type:<br><br><div =
style=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);bo=
rder-style:solid;border-width:1px;word-wrap:break-word"><code><div><span st=
yle=3D"color:#008">event</span><span style=3D"color:#660">-></span><span=
style=3D"color:#000">connect</span><span style=3D"color:#660">(</span><spa=
n style=3D"color:#606">Functor</span><span style=3D"color:#660">{});</span>=
</div></code></div><br></div></blockquote><div>First since the operator() f=
unction is not const so it wouldn't be legal.</div></div></blockquote><div>=
<br>Yes, I know. I said that, when I wrote "but not this..." The problem is=
that the first <i>is</i> legal. Your newest idea only talked about `const`=
functors; you said nothing about disallowing member pointers who take non-=
const `this`.<br> </div><blockquote class=3D"gmail_quote" style=3D"mar=
gin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><=
div dir=3D"ltr"><div>And second I have thought and even pointed out in this=
thread the ambiguity between those 2 connects.</div></div></blockquote><di=
v><br>There is no "ambiguity" between them; there is nothing uncertain abou=
t these cases. They are functionally identical. The problem is that your pr=
oposal gleefully accepts one while denying the other. This was based on the=
assumption that shallow, pointer-based equality can be trusted more than d=
eep, stateful equality.<br><br>My response to your last post demonstrates h=
ow incorrect that assumption is.<br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_593_560930343.1431901527772--
------=_Part_592_1388927719.1431901527772--
.
Author: mash.boyko2014@gmail.com
Date: Sun, 17 May 2015 15:56:33 -0700 (PDT)
Raw View
------=_Part_191_919082154.1431903393673
Content-Type: multipart/alternative;
boundary="----=_Part_192_163889407.1431903393673"
------=_Part_192_163889407.1431903393673
Content-Type: text/plain; charset=UTF-8
On Sunday, May 17, 2015 at 5:15:19 PM UTC-5, Nicol Bolas wrote:
>
> On Sunday, May 17, 2015 at 5:28:39 PM UTC-4, mash.bo...@gmail.com wrote:
>>
>> On Sunday, May 17, 2015 at 12:36:19 PM UTC-5, Nicol Bolas wrote:
>>
>>
>>>
>>> If you can't come up with some *other* reason, some other real use-case
>>> for function comparison besides events/delegates/signals, then just propose
>>> an event system like the above.
>>>
>>
>> Comparing function pointer has been around since the beginnings of c and
>> its used in ways I can't even imagine. If we did a search for function
>> pointer comparison in a large code bases I have no doubt I would find many
>> uses I can't possibly imagine.
>>
>
> OK, you seem to have the way this works backwards.
>
> You are the one suggesting the feature for inclusion in the standard
> library. The burden of proof as to that feature's utility (and therefore
> the importance of including it an *international standard*) is on *you*.
>
> You can't just say, "I can't imagine it, but I'm sure you'll find some if
> you search around in random codebases for it." That's *your job*; as the
> person proposing the idea, it is your responsibility to find evidence that
> it is a generally worthwhile feature. And that requires more than just
> saying, "hey, I use it in event/delegate/signal types."
>
> Equally importantly, you seem to be equating non-member function pointers
> to your `fun_ptr` class, on the assumption that any code which uses one
> ought to be able to use the other. I very much cannot agree with that.
>
> If I take an actual non-member function pointer, then I'm taking a purely
> stateless function. A member pointer+instance is very much not the same
> thing; it is stateful, since it has that instance pointer there. A member
> pointer who's instance is part of its parameter list (ie: the return value
> from `mem_fn`) would be a reasonable equivalent. But once you put an
> instance pointer there, it stops being an equivalent concept.
>
> How so? Heh heh heh... read on.
>
> Here is a reasonable programming problem for you to write...
>>
>
> There is nothing "reasonable" about this example; it is an obvious
> strawman example, contrived specifically to make your point. What reason
> would anyone have for an action executor who's *sole purpose* is to
> prevent the execution of the same action twice?
>
> If that is a problem in your code, if you need to explicitly filter
> someone from executing the same function twice via some arbitrary means,
> then this suggests that your code is completely out of control. That you
> have dozens or hundreds of things banging away on some "action" system, and
> you cannot resolve it in any reasonable way. Therefore, you create an
> arbitrary and pointless rule about stopping the "same action" from
> happening multiple times.
>
> That's not to say that it can't happen. But it would be an incredibly rare
> occurrence. And we don't standardize things to handle rare occurrences.
>
> Write a funciton called execute_action that takes an arbitrary action with
>> a signature of returning void and taking no params (i.e. void() ).
>> execute_action shall execute the action so long as the action is different
>> from the previously executed action. That is the same action is not allowed
>> to be executed back to back. Here is how i would write execute_action:
>>
>> void execute_action(fun_ptr<void()> action) {
>> static fun_ptr<void()> last_executed = nullptr;
>> if (action != last_executed) {
>> action();
>> last_executed = std::move(action);
>> }
>> }
>>
>>
> So... who gets rid of `last_executed`? Oh, that's right; `fun_ptr` isn't
> supposed to own memory. So you simply have this object that references
> memory that may or may not exist.
>
> Oh, you may think this sophistry. But it's not. Why? Because it's the
> source of a gigantic bug in your program. You don't see it? Allow me to
> explain.
>
> Your `fun_ptr` is stated to be able to take a member pointer+instance as a
> valid "pointer", correct? OK, let's say you execute some action on an
> object instance of type T; let's call this instance A. Instance A is
> allocated on the heap.
>
> You execute that action. So now `last_executed` contains a pointer to the
> member of T. But it also contains a pointer to A.
>
> Now, let's say we delete A; a perfectly valid thing to do. And then we
> allocate a new object of type T; call it B. And, since we just deleted A,
> let's say that our memory manager just so happens to allocate B in the *exact
> same location* that A was in.
>
> See the problem?
>
> Now let's execute the same member pointer of T, but on a new instance B.
> When we try to go through this again, `fun_ptr`'s equality testing system
> believes that `last_executed` and `action` are the same. That's because
> both the member pointers and *instance pointers* are the same. Therefore,
> our action, which is new *by all reasonable definitions of that term*...
> fails to execute.
>
> Why? Because your `fun_ptr` wasn't informed that the memory it originally
> referenced had been deleted. It thought that it was still a live object,
> nobody nulled the action out (and since it's a function-static variable,
> there's no API to do so), and thus, all it contains is a number, which
> nothing in C++ declares will be unique.
>
> This all happened because `fun_ptr` is blind to *ownership*, that thing
> that you seem to believe isn't important. Yet you've managed to prove
> exactly how essential it is, and therefore exactly how deficient any such
> `fun_ptr` object would be *without* it.
>
> Thank you; you did what I could not ;)
>
> So not only is your "problem" obviously contrived and seems unlikely to
> happen in the real world... you couldn't even solve problem you devised
> correctly *with your own tool*.
>
>
>> Want to implement this with std::function?
>>
>
> Well, since you have demonstrated that your own `fun_ptr` cannot
> *correctly* implement it, I'd say the burden shifts back to you ;)
>
Boy you are being difficult :) Write a function to remove duplicated
actions from a vector (std::vector<std::function<void()>>) and then execute
them. You don't have to worry about ownership.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_192_163889407.1431903393673
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Sunday, May 17, 2015 at 5:15:19 PM UTC-5, Nicol=
Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-le=
ft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr">=
On Sunday, May 17, 2015 at 5:28:39 PM UTC-4, <a>mash.bo...@gmail.com</a> wr=
ote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;b=
order-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">On Sunday, May=
17, 2015 at 12:36:19 PM UTC-5, Nicol Bolas wrote:<div> </div><blockqu=
ote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1=
px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br>If you can't come=
up with some <b><i>other</i></b> reason, some other real use-case for func=
tion comparison besides events/delegates/signals, then just propose an even=
t system like the above.<br></div></div></blockquote><div><br></div><div>Co=
mparing function pointer has been around since the beginnings of c and its =
used in ways I can't even imagine. If we did a search for function pointer =
comparison in a large code bases I have no doubt I would find many uses I c=
an't possibly imagine.</div></div></blockquote><div><br>OK, you seem to hav=
e the way this works backwards.<br><br>You are the one suggesting the featu=
re for inclusion in the standard library. The burden of proof as to that fe=
ature's utility (and therefore the importance of including it an <i>interna=
tional standard</i>) is on <i>you</i>.<br><br>You can't just say, "I can't =
imagine it, but I'm sure you'll find some if you search around in random co=
debases for it." That's <i>your job</i>; as the person proposing the idea, =
it is your responsibility to find evidence that it is a generally worthwhil=
e feature. And that requires more than just saying, "hey, I use it in event=
/delegate/signal types."<br><br>Equally importantly, you seem to be equatin=
g non-member function pointers to your `fun_ptr` class, on the assumption t=
hat any code which uses one ought to be able to use the other. I very much =
cannot agree with that.<br><br>If I take an actual non-member function poin=
ter, then I'm taking a purely stateless function. A member pointer+instance=
is very much not the same thing; it is stateful, since it has that instanc=
e pointer there. A member pointer who's instance is part of its parameter l=
ist (ie: the return value from `mem_fn`) would be a reasonable equivalent. =
But once you put an instance pointer there, it stops being an equivalent co=
ncept.<br><br>How so? Heh heh heh... read on.<br><br></div><blockquote clas=
s=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>Here is a reasonab=
le programming problem for you to write...</div></div></blockquote><div><br=
>There is nothing "reasonable" about this example; it is an obvious strawma=
n example, contrived specifically to make your point. What reason would any=
one have for an action executor who's <i>sole purpose</i> is to prevent the=
execution of the same action twice?<br><br>If that is a problem in your co=
de, if you need to explicitly filter someone from executing the same functi=
on twice via some arbitrary means, then this suggests that your code is com=
pletely out of control. That you have dozens or hundreds of things banging =
away on some "action" system, and you cannot resolve it in any reasonable w=
ay. Therefore, you create an arbitrary and pointless rule about stopping th=
e "same action" from happening multiple times.<br><br>That's not to say tha=
t it can't happen. But it would be an incredibly rare occurrence. And we do=
n't standardize things to handle rare occurrences.<br><br></div><blockquote=
class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px =
#ccc solid;padding-left:1ex"><div dir=3D"ltr"><div> Write a funciton called=
execute_action that takes an arbitrary action with a signature of returnin=
g void and taking no params (i.e. void() ). execute_action shall execute th=
e action so long as the action is different from the previously executed ac=
tion. That is the same action is not allowed to be executed back to back. H=
ere is how i would write execute_action:</div><div><br></div><div style=3D"=
border:1px solid rgb(187,187,187);word-wrap:break-word;background-color:rgb=
(250,250,250)"><code><div><span style=3D"color:#008">void</span><span style=
=3D"color:#000"> execute_action</span><span style=3D"color:#660">(</span><s=
pan style=3D"color:#000">fun_ptr</span><span style=3D"color:#660"><</spa=
n><span style=3D"color:#008">void</span><span style=3D"color:#660">()></=
span><span style=3D"color:#000"> action</span><span style=3D"color:#660">)<=
/span><span style=3D"color:#000"> </span><span style=3D"color:#660">{</span=
><span style=3D"color:#000"><br> </span><span style=3D"color:#0=
08">static</span><span style=3D"color:#000"> fun_ptr</span><span style=3D"c=
olor:#660"><</span><span style=3D"color:#008">void</span><span style=3D"=
color:#660">()></span><span style=3D"color:#000"> last_executed </span><=
span style=3D"color:#660">=3D</span><span style=3D"color:#000"> </span><spa=
n style=3D"color:#008">nullptr</span><span style=3D"color:#660">;</span><sp=
an style=3D"color:#000"><br> </span><span style=3D"color:#008">=
if</span><span style=3D"color:#000"> </span><span style=3D"color:#660">(</s=
pan><span style=3D"color:#000">action </span><span style=3D"color:#660">!=
=3D</span><span style=3D"color:#000"> last_executed</span><span style=3D"co=
lor:#660">)</span><span style=3D"color:#000"> </span><span style=3D"color:#=
660">{</span><span style=3D"color:#000"><br> action</sp=
an><span style=3D"color:#660">();</span><span style=3D"color:#000"><br>&nbs=
p; last_executed </span><span style=3D"color:#660">=3D</span>=
<span style=3D"color:#000"> std</span><span style=3D"color:#660">::</span><=
span style=3D"color:#000">move</span><span style=3D"color:#660">(</span><sp=
an style=3D"color:#000">action</span><span style=3D"color:#660">);</span><s=
pan style=3D"color:#000"><br> </span><span style=3D"color:#660"=
>}</span><span style=3D"color:#000"><br></span><span style=3D"color:#660">}=
</span></div></code></div><div><br></div></div></blockquote><div><br>So... =
who gets rid of `last_executed`? Oh, that's right; `fun_ptr` isn't supposed=
to own memory. So you simply have this object that references memory that =
may or may not exist.<br><br>Oh, you may think this sophistry. But it's not=
.. Why? Because it's the source of a gigantic bug in your program. You don't=
see it? Allow me to explain.<br><br>Your `fun_ptr` is stated to be able to=
take a member pointer+instance as a valid "pointer", correct? OK, let's sa=
y you execute some action on an object instance of type T; let's call this =
instance A. Instance A is allocated on the heap.<br><br>You execute that ac=
tion. So now `last_executed` contains a pointer to the member of T. But it =
also contains a pointer to A.<br><br>Now, let's say we delete A; a perfectl=
y valid thing to do. And then we allocate a new object of type T; call it B=
.. And, since we just deleted A, let's say that our memory manager just so h=
appens to allocate B in the <i>exact same location</i> that A was in.<br><b=
r>See the problem?<br><br>Now let's execute the same member pointer of T, b=
ut on a new instance B. When we try to go through this again, `fun_ptr`'s e=
quality testing system believes that `last_executed` and `action` are the s=
ame. That's because both the member pointers and <i>instance pointers</i> a=
re the same. Therefore, our action, which is new <i>by all reasonable defin=
itions of that term</i>... fails to execute.<br><br>Why? Because your `fun_=
ptr` wasn't informed that the memory it originally referenced had been dele=
ted. It thought that it was still a live object, nobody nulled the action o=
ut (and since it's a function-static variable, there's no API to do so), an=
d thus, all it contains is a number, which nothing in C++ declares will be =
unique.<br><br>This all happened because `fun_ptr` is blind to <i>ownership=
</i>, that thing that you seem to believe isn't important. Yet you've manag=
ed to prove exactly how essential it is, and therefore exactly how deficien=
t any such `fun_ptr` object would be <i>without</i> it.<br><br>Thank you; y=
ou did what I could not ;)<br><br>So not only is your "problem" obviously c=
ontrived and seems unlikely to happen in the real world... you couldn't eve=
n solve problem you devised correctly <i>with your own tool</i>.<i></i><br>=
</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left=
:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><=
/div><div>Want to implement this with std::function?</div></div></blockquot=
e><div></div><br>Well, since you have demonstrated that your own `fun_ptr` =
cannot <i>correctly</i> implement it, I'd say the burden shifts back to you=
;)<br></div></blockquote><div><br></div><div>Boy you are being difficult :=
) Write a function to remove duplicated actions from a vector (std::vector&=
lt;std::function<void()>>) and then execute them. You don't have t=
o worry about ownership. </div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_192_163889407.1431903393673--
------=_Part_191_919082154.1431903393673--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 17 May 2015 22:52:23 -0700 (PDT)
Raw View
------=_Part_742_717089285.1431928343206
Content-Type: multipart/alternative;
boundary="----=_Part_743_504725245.1431928343212"
------=_Part_743_504725245.1431928343212
Content-Type: text/plain; charset=UTF-8
On Sunday, May 17, 2015 at 6:56:33 PM UTC-4, mash.bo...@gmail.com wrote:
>
> Boy you are being difficult :) Write a function to remove duplicated
> actions from a vector (std::vector<std::function<void()>>) and then execute
> them. You don't have to worry about ownership.
>
*sigh*
You just brought up the same use case as before. Calling a sequence of
unique functions is *exactly* what a comparison-based event/delegate/signal
system does. This is nothing more than a possible implementation of such a
system.
So this isn't a new use case; it's the same use case as before.
Also, this "use case" is too low-level. It's not solving a problem; it's an
implementation detail for a larger problem.
For example, "I need an object where external code can register/deregister
functions, and I can call each of the registered functions in turn." This
is a problem statement. One solution to that problem is a comparison-based
event/delegate/signal system. And that solution relies upon `fun_ptr` or
something like it.
"I have a list of functions and need to ensure that only unique entries
exist" isn't a problem statement; it's something you find on a programming
test.
Remember: what is in question here is how often people genuinely *need* to
test equality on arbitrary callables. Your "use case" doesn't explain why
one has this array of callables or why entries in the array cannot be
duplicated. They're just arbitrary conditions, like problems on a test. And
without knowing why, we can't gauge whether it is a genuine need (ie: if
there might not be other, better alternatives) or how often such a
circumstance might arise.
By contrast, "comparison-based event/delegate/signal" system does make it
clear why you need the feature. I simply pointed out that a
"connection-based event/delegate/signal" system does the same job without
the added requirement, as well as offering other benefits.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_743_504725245.1431928343212
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Sunday, May 17, 2015 at 6:56:33 PM UTC-4, mash.bo...@gm=
ail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-l=
eft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"=
><div></div><div>Boy you are being difficult :) Write a function to remove =
duplicated actions from a vector (std::vector<std::function<<wbr>void=
()>>) and then execute them. You don't have to worry about ownership.=
</div></div></blockquote><div><br>*sigh*<br><br>You just brought up the sam=
e use case as before. Calling a sequence of unique functions is <i>exactly<=
/i> what a comparison-based event/delegate/signal system does. This is noth=
ing more than a possible implementation of such a system.<br><br>So this is=
n't a new use case; it's the same use case as before.<br><br>Also, this "us=
e case" is too low-level. It's not solving a problem; it's an implementatio=
n detail for a larger problem.<br><br>For example, "I need an object where =
external code can register/deregister functions, and I can call each of the=
registered functions in turn." This is a problem statement. One solution t=
o that problem is a comparison-based event/delegate/signal system. And that=
solution relies upon `fun_ptr` or something like it.<br><br>"I have a list=
of functions and need to ensure that only unique entries exist" isn't a pr=
oblem statement; it's something you find on a programming test.<br><br>Reme=
mber: what is in question here is how often people genuinely <i>need</i> to=
test equality on arbitrary callables. Your "use case" doesn't explain why =
one has this array of callables or why entries in the array cannot be dupli=
cated. They're just arbitrary conditions, like problems on a test. And with=
out knowing why, we can't gauge whether it is a genuine need (ie: if there =
might not be other, better alternatives) or how often such a circumstance m=
ight arise.<br><br>By contrast, "comparison-based event/delegate/signal" sy=
stem does make it clear why you need the feature. I simply pointed out that=
a "connection-based event/delegate/signal" system does the same job withou=
t the added requirement, as well as offering other benefits.<br></div></div=
>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_743_504725245.1431928343212--
------=_Part_742_717089285.1431928343206--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Mon, 18 May 2015 20:12:04 -0700 (PDT)
Raw View
------=_Part_1012_89588612.1432005124764
Content-Type: multipart/alternative;
boundary="----=_Part_1013_329765337.1432005124764"
------=_Part_1013_329765337.1432005124764
Content-Type: text/plain; charset=UTF-8
On Monday, May 18, 2015 at 12:52:23 AM UTC-5, Nicol Bolas wrote:
>
> On Sunday, May 17, 2015 at 6:56:33 PM UTC-4, mash.bo...@gmail.com wrote:
>>
>> Boy you are being difficult :) Write a function to remove duplicated
>> actions from a vector (std::vector<std::function<void()>>) and then execute
>> them. You don't have to worry about ownership.
>>
>
> *sigh*
>
> You just brought up the same use case as before. Calling a sequence of
> unique functions is *exactly* what a comparison-based
> event/delegate/signal system does. This is nothing more than a possible
> implementation of such a system.
>
> So this isn't a new use case; it's the same use case as before.
>
> Also, this "use case" is too low-level. It's not solving a problem; it's
> an implementation detail for a larger problem.
>
> For example, "I need an object where external code can register/deregister
> functions, and I can call each of the registered functions in turn." This
> is a problem statement. One solution to that problem is a comparison-based
> event/delegate/signal system. And that solution relies upon `fun_ptr` or
> something like it.
>
> "I have a list of functions and need to ensure that only unique entries
> exist" isn't a problem statement; it's something you find on a programming
> test.
>
> Remember: what is in question here is how often people genuinely *need*
> to test equality on arbitrary callables. Your "use case" doesn't explain
> why one has this array of callables or why entries in the array cannot be
> duplicated. They're just arbitrary conditions, like problems on a test. And
> without knowing why, we can't gauge whether it is a genuine need (ie: if
> there might not be other, better alternatives) or how often such a
> circumstance might arise.
>
> By contrast, "comparison-based event/delegate/signal" system does make it
> clear why you need the feature. I simply pointed out that a
> "connection-based event/delegate/signal" system does the same job without
> the added requirement, as well as offering other benefits.
>
We could come up with a dozen container operations that equality is needed
for (append unique action, find, count, find_adjacent, is_permutation, or
some user defined ones). But I guess all container operations that require
equality check are too arbitrary or low level - only for function objects
but for other types its ok... got it. And the boost signal library
supporting direct attach/detach for types that do support equality - lets
hope they get rid of that feature soon so all those bugs its causing can be
fixed.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_1013_329765337.1432005124764
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Monday, May 18, 2015 at 12:52:23 AM UTC-5, Nico=
l Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0p=
x 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-l=
eft-width: 1px; border-left-style: solid;"><div dir=3D"ltr">On Sunday, May =
17, 2015 at 6:56:33 PM UTC-4, <a>mash.bo...@gmail.com</a> wrote:<blockquote=
class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1e=
x; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-le=
ft-style: solid;"><div dir=3D"ltr"><div></div><div>Boy you are being diffic=
ult :) Write a function to remove duplicated actions from a vector (std::ve=
ctor<std::function<<wbr>void()>>) and then execute them. You do=
n't have to worry about ownership.</div></div></blockquote><div><br>*sigh*<=
br><br>You just brought up the same use case as before. Calling a sequence =
of unique functions is <i>exactly</i> what a comparison-based event/delegat=
e/signal system does. This is nothing more than a possible implementation o=
f such a system.<br><br>So this isn't a new use case; it's the same use cas=
e as before.<br><br>Also, this "use case" is too low-level. It's not solvin=
g a problem; it's an implementation detail for a larger problem.<br><br>For=
example, "I need an object where external code can register/deregister fun=
ctions, and I can call each of the registered functions in turn." This is a=
problem statement. One solution to that problem is a comparison-based even=
t/delegate/signal system. And that solution relies upon `fun_ptr` or someth=
ing like it.<br><br>"I have a list of functions and need to ensure that onl=
y unique entries exist" isn't a problem statement; it's something you find =
on a programming test.<br><br>Remember: what is in question here is how oft=
en people genuinely <i>need</i> to test equality on arbitrary callables. Yo=
ur "use case" doesn't explain why one has this array of callables or why en=
tries in the array cannot be duplicated. They're just arbitrary conditions,=
like problems on a test. And without knowing why, we can't gauge whether i=
t is a genuine need (ie: if there might not be other, better alternatives) =
or how often such a circumstance might arise.<br><br>By contrast, "comparis=
on-based event/delegate/signal" system does make it clear why you need the =
feature. I simply pointed out that a "connection-based event/delegate/signa=
l" system does the same job without the added requirement, as well as offer=
ing other benefits.<br></div></div></blockquote><div><br></div><div>We coul=
d come up with a dozen container operations that equality is needed fo=
r (append unique action, find, count, find_adjacent, is_permutation, o=
r some user defined ones). But I guess all container operations that r=
equire equality check are too arbitrary or low level - only for function ob=
jects but for other types its ok... got it. And the boost signal library su=
pporting direct attach/detach for types that do support equality - let=
s hope they get rid of that feature soon so all those bugs i=
ts causing can be fixed.</div><div> </div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_1013_329765337.1432005124764--
------=_Part_1012_89588612.1432005124764--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Mon, 18 May 2015 22:04:20 -0700 (PDT)
Raw View
------=_Part_2158_873070370.1432011860941
Content-Type: multipart/alternative;
boundary="----=_Part_2159_2085432286.1432011860942"
------=_Part_2159_2085432286.1432011860942
Content-Type: text/plain; charset=UTF-8
On Monday, May 18, 2015 at 11:12:04 PM UTC-4, Michael Boyko wrote:
>
> We could come up with a dozen container operations that equality is needed
> for (append unique action, find, count, find_adjacent, is_permutation, or
> some user defined ones). But I guess all container operations that require
> equality check are too arbitrary or low level - only for function objects
> but for other types its ok... got it.
>
By your logic, one could say that we should have an algorithm that returns
the second item in a sequence. And the use case for it is having a sequence
and needing the second item from it.
That's not a use-case; that's begging the question
<https://en.wikipedia.org/wiki/Begging_the_question>.
"Append unique action" is the same thing, assuming your own conclusion.
It's a "problem" which by its own premise, assumes that we're in a
situation where where we absolutely need function equality.
I'm asking you to provide evidence that there are situations where
programmers absolutely need function equality. So answers to that question
cannot be of the form, "Assume we need function equality..."
You need to show not merely where programmers have used it in the past, but
undeniably *need* it. You need a problem statement that is reasonable (ie:
not forced and contrived, like "no double action"), and where all other
solutions are less effective, less clean, lose some important aspect, or
otherwise represent a compromised solution.
And without assuming your own conclusion.
Thus far, the closest you've gotten is your event/delegate/signal system.
Which, as boost::signal2::signal::disconnect proves... you don't even
`fun_ptr` to implement.
It needs function equality, to be sure. But this happens only as an
implementation detail internally; it doesn't expose this to the user
(outside of the user having to implement operator==). So the user doesn't
have to care if `fun_ptr` has value or reference semantics; they just pass
stuff in and everything magically happens with `disconnect`.
Of course, since the connection interface is there, and it works just fine
with things that can't compare equal like lambdas, I don't really see the
point.
> And the boost signal library supporting direct attach/detach for types
> that do support equality - lets hope they get rid of that feature soon so
> all those bugs its causing can be fixed.
>
Except that Boost.Signal isn't so foolish as to make taking unowned
pointers part of its API. The API allows you to define equality for your
own functor types, but outside of taking non-member function pointers
(which are "owned" by the process), it won't do anything for you. So you
are forced to create a member pointer+instance type yourself. Which would
allow you to not only define equality as you wish, but also define
ownership, rather than assuming naked pointer "ownership".
Also, the bug in question wasn't merely having an unowned pointer. It was
having an unowned pointer in a place where the owner of that pointer had no
means of clearing it once the pointer was to be destroyed. Though even if
you added such a thing, it would still be a hugely bug-prone thing, with
objects arbitrarily having to remove themselves from this thing because
they've been deleted or something.
And forgetting to do it in one place would yield one of the worst kinds of
bug: the kind that don't show up very often.
Which means they'll only show up at 4am when you're trying to ship ;)
Such bugs should be dealt with by making them impossible, not by
encouraging their existence.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_2159_2085432286.1432011860942
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Monday, May 18, 2015 at 11:12:04 PM UTC-4, Michael Boyk=
o wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0=
..8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>=
</div><div>We could come up with a dozen container operations that equ=
ality is needed for (append unique action, find, count, find_adjacent,=
is_permutation, or some user defined ones). But I guess all container=
operations that require equality check are too arbitrary or low level - on=
ly for function objects but for other types its ok... got it.</div></div></=
blockquote><div><br>By your logic, one could say that we should have an alg=
orithm that=20
returns the second item in a sequence. And the use case for it is having
a sequence and needing the second item from it.<br><br>That's not a use-ca=
se; that's <a href=3D"https://en.wikipedia.org/wiki/Begging_the_question">b=
egging the question</a>.<br><br>"Append unique action" is the same thing, a=
ssuming your own conclusion. It's a "problem" which by its own premise, ass=
umes that we're in a situation where where we absolutely need function equa=
lity.<br><br>I'm asking you to provide evidence that there are situations w=
here programmers absolutely need function equality. So answers to that ques=
tion cannot be of the form, "Assume we need function equality..."<br><br>Yo=
u need to show not merely where programmers have used it in the past, but u=
ndeniably <i>need</i> it. You need a problem statement that is reasonable (=
ie: not forced and contrived, like "no double action"), and where all other=
solutions are less effective, less clean, lose some important aspect, or o=
therwise represent a compromised solution.<br><br>And without assuming your=
own conclusion.<br><br>Thus far, the closest you've gotten is your event/d=
elegate/signal system. Which, as boost::signal2::signal::disconnect proves.=
... you don't even `fun_ptr` to implement.<br><br>It needs function equality=
, to be sure. But this happens only as an implementation detail internally;=
it doesn't expose this to the user (outside of the user having to implemen=
t operator=3D=3D). So the user doesn't have to care if `fun_ptr` has value =
or reference semantics; they just pass stuff in and everything magically ha=
ppens with `disconnect`.<br><br>Of course, since the connection interface i=
s there, and it works just fine with things that can't compare equal like l=
ambdas, I don't really see the point.<br> </div><blockquote class=3D"g=
mail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc sol=
id;padding-left: 1ex;"><div dir=3D"ltr"><div>And the boost signal library s=
upporting direct attach/detach for types that do support equality - le=
ts hope they get rid of that feature soon so all those bugs =
its causing can be fixed.<br></div></div></blockquote><div><br>Except =
that Boost.Signal isn't so foolish as to make taking unowned pointers part =
of its API. The API allows you to define equality for your own functor type=
s, but outside of taking non-member function pointers (which are "owned" by=
the process), it won't do anything for you. So you are forced to create a =
member pointer+instance type yourself. Which would allow you to not only de=
fine equality as you wish, but also define ownership, rather than assuming =
naked pointer "ownership".<br><br>Also, the bug in question wasn't merely h=
aving an unowned pointer. It was having an unowned pointer in a place where=
the owner of that pointer had no means of clearing it once the pointer was=
to be destroyed. Though even if you added such a thing, it would still be =
a hugely bug-prone thing, with objects arbitrarily having to remove themsel=
ves from this thing because they've been deleted or something.<br><br>And f=
orgetting to do it in one place would yield one of the worst kinds of bug: =
the kind that don't show up very often.<br><br>Which means they'll only sho=
w up at 4am when you're trying to ship ;)<br><br>Such bugs should be dealt =
with by making them impossible, not by encouraging their existence.<br></di=
v></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_2159_2085432286.1432011860942--
------=_Part_2158_873070370.1432011860941--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Mon, 18 May 2015 22:50:18 -0700 (PDT)
Raw View
------=_Part_1083_1506553744.1432014618106
Content-Type: multipart/alternative;
boundary="----=_Part_1084_1816577278.1432014618106"
------=_Part_1084_1816577278.1432014618106
Content-Type: text/plain; charset=UTF-8
On Tuesday, May 19, 2015 at 12:04:21 AM UTC-5, Nicol Bolas wrote:
>
> I'm asking you to provide evidence that there are situations where
> programmers absolutely need function equality. So answers to that question
> cannot be of the form, "Assume we need function equality..."
>
> You need to show not merely where programmers have used it in the past,
> but undeniably *need* it. You need a problem statement that is reasonable
> (ie: not forced and contrived, like "no double action"), and where all
> other solutions are less effective, less clean, lose some important aspect,
> or otherwise represent a compromised solution.
>
I hope "absolutely need" and "undeniably need" are not the judgment
standards the committee uses for a new feature. I'd have a pretty rough go
of things. I'm hoping its more along the lines being useful and maybe fills
in missing features to make the language more orthogonal and uniform.
On another note I did implement the equality scheme I posted and all seems
to be working as stated. The thing that isn't the greatest characteristic
is if someone forgets to define operator== for a functor then comparing two
functors of that type results in an unspecified result. If compiler
generated equality functions become standard this burden will be somewhat
less (but not totally eliminated).
It would also be nice to be able to define operator< and allow all the
sorting operations on containers as well. I don't see a path forward on
that.
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_1084_1816577278.1432014618106
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Tuesday, May 19, 2015 at 12:04:21 AM UTC-5, Nic=
ol Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0=
px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-=
left-width: 1px; border-left-style: solid;"><div dir=3D"ltr"><div>I'm askin=
g you to provide evidence that there are situations where programmers absol=
utely need function equality. So answers to that question cannot be of the =
form, "Assume we need function equality..."<br><br>You need to show not mer=
ely where programmers have used it in the past, but undeniably <i>need</i> =
it. You need a problem statement that is reasonable (ie: not forced and con=
trived, like "no double action"), and where all other solutions are less ef=
fective, less clean, lose some important aspect, or otherwise represent a c=
ompromised solution.</div></div></blockquote><div><br></div><div>I hope "ab=
solutely need" and "undeniably need" are not the judgment standards th=
e committee uses for a new feature. I'd have a pretty rough go of things. I=
'm hoping its more along the lines being useful and maybe fills i=
n missing features to make the language more orthogonal and uniform.</div><=
div><br></div><div>On another note I did implement the equality scheme I po=
sted and all seems to be working as stated. The thing that isn't the greate=
st characteristic is if someone forgets to define operator=3D=3D for a func=
tor then comparing two functors of that type results in an u=
nspecified result. If compiler generated equality functions become standard=
this burden will be somewhat less (but not totally eliminated).</div>=
<div><br></div><div>It would also be nice to be able to define operator<=
and allow all the sorting operations on containers as well. I don't see a =
path forward on that.</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_1084_1816577278.1432014618106--
------=_Part_1083_1506553744.1432014618106--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Tue, 19 May 2015 01:31:02 -0700 (PDT)
Raw View
------=_Part_170_511366401.1432024262812
Content-Type: multipart/alternative;
boundary="----=_Part_171_305546313.1432024262812"
------=_Part_171_305546313.1432024262812
Content-Type: text/plain; charset=UTF-8
On Tuesday, May 19, 2015 at 1:50:18 AM UTC-4, Michael Boyko wrote:
>
> On Tuesday, May 19, 2015 at 12:04:21 AM UTC-5, Nicol Bolas wrote:
>>
>> I'm asking you to provide evidence that there are situations where
>> programmers absolutely need function equality. So answers to that question
>> cannot be of the form, "Assume we need function equality..."
>>
>> You need to show not merely where programmers have used it in the past,
>> but undeniably *need* it. You need a problem statement that is
>> reasonable (ie: not forced and contrived, like "no double action"), and
>> where all other solutions are less effective, less clean, lose some
>> important aspect, or otherwise represent a compromised solution.
>>
>
> I hope "absolutely need" and "undeniably need" are not the judgment
> standards the committee uses for a new feature.
>
You again seem to have misunderstood what I said. I'm talking about the
problem statement and the way your suggestion fits into the solution.
Let's say I want to propose Boost.Any. And I want to provide evidence that
this feature is generally useful. Then I need a problem statement where the
best solution to that problem requires the use of Boost.Any. And it needs
to not be a contrived problem, nor should it be begging the question..
A justifying problem statement for Boost.Any?
I have an event system, and the events are runtime-bound functions (whether
they're derived classes or function pointers is irrelevant). This means
that I have a piece of code who's sole purpose it is to pass data between
the event signaler and the event handler(s).
OK, fine. Now here's the problem. The caller needs to pass data to the
callee. Indeed, every caller needs to pass parameters to any of its
callees. My event system should not in any way preclude the use of whatever
data the caller and callee want to exchange. How do I go about doing this
without having the event signaler #including a bunch of data structures
that it doesn't use or rely on?
Clearly, some form of type erasure will be needed. You could use a void*;
that's a common practice. And C++ allows it, so long as you cast it back to
the exact same type as your originally stored it. Well... what happens when
someone casts it to the wrong thing?
Undefined behavior. You'll never know until a mysterious crash stops your
program at 4am the night you're trying to ship.
OK, what about a base class with derived implementations? If its a virtual
base class, you can use dynamic_cast to ensure that you get the right type
(with a hard crash immediately when you get it wrong). Well, that certainly
will function as a means of transmitting information. But its a rather ugly
solution, as you have all these types who's sole purpose is to be
polymorphic. They have nothing in common yet they're in the same class
hierarchy.
Not to mention the fact that if I want to pass a simple string or whatever,
I have to wrap it in some type. Or, God forbid, some moron uses
`static_cast` or even a C-style cast; there's no way to forbid that.
Boost.Any is a more perfect solution to the problem than any of the other
alternatives. It's a value type, so any question of ownership is
effectively moot. The casts are safe, going to exactly and only the type
the caller provided. And the objects you put into them don't have to be
related in any way; you can stick anything in there.
That's how it works. You have a problem statement that real programmers
experience in real programs (in effect, I just described window message
passing). It's high-level enough that you're not begging the question. You
list the alternatives, see how they're inadequate, then show how the
feature solves the problem better.
At the end of the day, what matters to me is effort vs. gain. Thus far, you
have demonstrated very little with regard to gain for this feature. Oh yes,
you can compare functions, but until you tell me why I would ever want to
do that, it's meaningless. The best case you made for it, an
event/delegate/signals system, in no way requires that the user be exposed
to such comparison functionality (as proven via Boost.Signal).
Yet you've shown that the effort to standardize this is substantial: you
have to define equality for callables. Your best shot at making this
palatable is dependent on C++ gaining the ability to define equality for
you, which is not a standard feature at the present time.
Boost punted on equality testing for a reason. If you want the committee to
make a serious effort to come up with a good resolution for function
equality (or at least, take the time to consider yours and the other
alternatives), you should come up with some explanation for what benefit
this will be.
I'd have a pretty rough go of things. I'm hoping its more along the
> lines being useful and maybe fills in missing features to make the language
> more orthogonal and uniform.
>
*Anything* is "useful" to *someone*. I'm sure someone out there has had
some need for an algorithm who's sole purpose is to return the second item
in a sequence. Someone out there would find a remote-controlled umbrella
handy.
But things don't get standardized simply because they're "useful"
(otherwise we'd have `puts` by now). Sure, sometimes standardizing
someone's pet idea gets you STL (though there are still plenty of defects
in that). But sometimes, you get std::iostream. And the last time we tried
to "make the language more orthogonal and uniform", we got "uniform
initialization", which is most assuredly not uniform.
Even your attempt to make callables "more orthogonal and uniform"
essentially favors function pointers over functors, since you have to do
work to test functor equality. Even if you can auto-generate operator==,
it's very easy to lambda capture something that isn't equality testable. Or
if you want to ignore certain state during equality testing. Or whatever.
So I lean towards wanting to see evidence. The more difficult what you're
proposing is (and yes, it is difficult), and the more potentially dangerous
it is (and yes, if you take away non-const functors for `std::function`,
that is dangerous), the more evidence I want to see that what we'll get
from the effort is actually worthwhile.
Nothing's stopping us from having an event/delegate/signal system right
now. So what else you got?
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_171_305546313.1432024262812
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Tuesday, May 19, 2015 at 1:50:18 AM UTC-4, Michael Boyk=
o wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0=
..8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr">On Tu=
esday, May 19, 2015 at 12:04:21 AM UTC-5, Nicol Bolas wrote:<blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;borde=
r-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid=
"><div dir=3D"ltr"><div>I'm asking you to provide evidence that there are s=
ituations where programmers absolutely need function equality. So answers t=
o that question cannot be of the form, "Assume we need function equality...=
"<br><br>You need to show not merely where programmers have used it in the =
past, but undeniably <i>need</i> it. You need a problem statement that is r=
easonable (ie: not forced and contrived, like "no double action"), and wher=
e all other solutions are less effective, less clean, lose some important a=
spect, or otherwise represent a compromised solution.</div></div></blockquo=
te><div><br></div><div>I hope "absolutely need" and "undeniably need" are&n=
bsp;not the judgment standards the committee uses for a new feature.</div><=
/div></blockquote><div><br>You again seem to have misunderstood what I said=
.. I'm talking about the problem statement and the way your suggestion fits =
into the solution.<br><br>Let's say I want to propose Boost.Any. And I want=
to provide evidence that this feature is generally useful. Then I need a p=
roblem statement where the best solution to that problem requires the use o=
f Boost.Any. And it needs to not be a contrived problem, nor should it be b=
egging the question..<br><br>A justifying problem statement for Boost.Any?<=
br><br>I have an event system, and the events are runtime-bound functions (=
whether they're derived classes or function pointers is irrelevant). This m=
eans that I have a piece of code who's sole purpose it is to pass data betw=
een the event signaler and the event handler(s).<br><br>OK, fine. Now here'=
s the problem. The caller needs to pass data to the callee. Indeed, every c=
aller needs to pass parameters to any of its callees. My event system shoul=
d not in any way preclude the use of whatever data the caller and callee wa=
nt to exchange. How do I go about doing this without having the event signa=
ler #including a bunch of data structures that it doesn't use or rely on?<b=
r><br>Clearly, some form of type erasure will be needed. You could use a vo=
id*; that's a common practice. And C++ allows it, so long as you cast it ba=
ck to the exact same type as your originally stored it. Well... what happen=
s when someone casts it to the wrong thing?<br><br>Undefined behavior. You'=
ll never know until a mysterious crash stops your program at 4am the night =
you're trying to ship.<br><br>OK, what about a base class with derived impl=
ementations? If its a virtual base class, you can use dynamic_cast to ensur=
e that you get the right type (with a hard crash immediately when you get i=
t wrong). Well, that certainly will function as a means of transmitting inf=
ormation. But its a rather ugly solution, as you have all these types who's=
sole purpose is to be polymorphic. They have nothing in common yet they're=
in the same class hierarchy.<br><br>Not to mention the fact that if I want=
to pass a simple string or whatever, I have to wrap it in some type. Or, G=
od forbid, some moron uses `static_cast` or even a C-style cast; there's no=
way to forbid that.<br><br>Boost.Any is a more perfect solution to the pro=
blem than any of the other alternatives. It's a value type, so any question=
of ownership is effectively moot. The casts are safe, going to exactly and=
only the type the caller provided. And the objects you put into them don't=
have to be related in any way; you can stick anything in there.<br><br>Tha=
t's how it works. You have a problem statement that real programmers experi=
ence in real programs (in effect, I just described window message passing).=
It's high-level enough that you're not begging the question. You list the =
alternatives, see how they're inadequate, then show how the feature solves =
the problem better.<br><br>At the end of the day, what matters to me is eff=
ort vs. gain. Thus far, you have demonstrated very little with regard to ga=
in for this feature. Oh yes, you can compare functions, but until you tell =
me why I would ever want to do that, it's meaningless. The best case you ma=
de for it, an event/delegate/signals system, in no way requires that the us=
er be exposed to such comparison functionality (as proven via Boost.Signal)=
..<br><br>Yet you've shown that the effort to standardize this is substantia=
l: you have to define equality for callables. Your best shot at making this=
palatable is dependent on C++ gaining the ability to define equality for y=
ou, which is not a standard feature at the present time.<br><br>Boost punte=
d on equality testing for a reason. If you want the committee to make a ser=
ious effort to come up with a good resolution for function equality (or at =
least, take the time to consider yours and the other alternatives), you sho=
uld come up with some explanation for what benefit this will be.<br><br></d=
iv><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;=
border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>I'd h=
ave a pretty rough go of things. I'm hoping its more along the lines b=
eing useful and maybe fills in missing features to make the language m=
ore orthogonal and uniform.</div></div></blockquote><div><br><i>Anything</i=
> is "useful" to <i>someone</i>. I'm sure someone out there has had some ne=
ed for an algorithm who's sole purpose is to return the second item in a se=
quence. Someone out there would find a remote-controlled umbrella handy.<br=
><br>But things don't get standardized simply because they're "useful" (oth=
erwise we'd have `puts` by now). Sure, sometimes standardizing someone's pe=
t idea gets you STL (though there are still plenty of defects in that). But=
sometimes, you get std::iostream. And the last time we tried to "make the =
language more orthogonal and uniform", we got "uniform initialization", whi=
ch is most assuredly not uniform.<br><br>Even your attempt to make callable=
s "more orthogonal and uniform"=20
essentially favors function pointers over functors, since you have to do wo=
rk to test functor equality. Even if you can auto-generate=20
operator=3D=3D, it's very easy to lambda capture something that isn't=20
equality testable. Or if you want to ignore certain state during=20
equality testing. Or whatever.<br><br>So I lean towards wanting to see evid=
ence. The more difficult what you're proposing is (and yes, it is difficult=
), and the more potentially dangerous it is (and yes, if you take away non-=
const functors for `std::function`, that is dangerous), the more evidence I=
want to see that what we'll get from the effort is actually worthwhile.<br=
><br>Nothing's stopping us from having an event/delegate/signal system righ=
t now. So what else you got?<br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_171_305546313.1432024262812--
------=_Part_170_511366401.1432024262812--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Thu, 28 May 2015 08:39:54 -0700 (PDT)
Raw View
------=_Part_124_515035358.1432827594489
Content-Type: multipart/alternative;
boundary="----=_Part_125_1840164496.1432827594489"
------=_Part_125_1840164496.1432827594489
Content-Type: text/plain; charset=UTF-8
I have updated my proposal and code as discussed in this thread.
I published the proposal and code on code project
<http://www.codeproject.com/Articles/995916/A-Smart-Function-Pointer> for
anyone to review. The code has been tested and bench marked (which can be
seen on code project).
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
------=_Part_125_1840164496.1432827594489
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>I have updated my proposal and code as discussed in t=
his thread. I published the proposal and code on <a href=3D"http:=
//www.codeproject.com/Articles/995916/A-Smart-Function-Pointer">code projec=
t</a> for anyone to review. The code has been tested and bench marked =
(which can be seen on code project).</div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_125_1840164496.1432827594489--
------=_Part_124_515035358.1432827594489--
.
Author: Patrice Roy <patricer@gmail.com>
Date: Thu, 28 May 2015 20:58:45 -0400
Raw View
--001a11c235dc668c5605172dfab8
Content-Type: text/plain; charset=UTF-8
First look is nice; I'll look at it in more detail soon to give more
complete feedback. Thanks
2015-05-28 11:39 GMT-04:00 Michael Boyko <mboyko2000@gmail.com>:
> I have updated my proposal and code as discussed in this thread.
> I published the proposal and code on code project
> <http://www.codeproject.com/Articles/995916/A-Smart-Function-Pointer> for
> anyone to review. The code has been tested and bench marked (which can be
> seen on code project).
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--001a11c235dc668c5605172dfab8
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">First look is nice; I'll look at it in more detail soo=
n to give more complete feedback. Thanks<br></div><div class=3D"gmail_extra=
"><br><div class=3D"gmail_quote">2015-05-28 11:39 GMT-04:00 Michael Boyko <=
span dir=3D"ltr"><<a href=3D"mailto:mboyko2000@gmail.com" target=3D"_bla=
nk">mboyko2000@gmail.com</a>></span>:<br><blockquote class=3D"gmail_quot=
e" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">=
<div dir=3D"ltr"><div>I have updated my proposal and code as discussed in t=
his thread. I=C2=A0published=C2=A0the proposal and code on <a href=3D"http:=
//www.codeproject.com/Articles/995916/A-Smart-Function-Pointer" target=3D"_=
blank">code project</a>=C2=A0for anyone to review. The code has been tested=
and bench marked (which can be seen on code project).</div></div><div clas=
s=3D"HOEnZb"><div class=3D"h5">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--001a11c235dc668c5605172dfab8--
.
Author: =?UTF-8?Q?David_Rodr=C3=ADguez_Ibeas?= <dibeas@ieee.org>
Date: Fri, 29 May 2015 14:05:05 +0100
Raw View
--001a1134ce26ff4fac0517381ff4
Content-Type: text/plain; charset=UTF-8
I am not sure what the definition of "value" is for you, or said otherwise,
what are the salient attributes of 'fun_ptr'. In some places it seems like
you want a strict: 'a == b => a() == b()', or rather that 'a == b' implies
that evaluating either 'a()' or 'b()' yields the same result (as two
consecutive evaluations of the same function could generate different
results anyway ('int f() { static int counter; return ++counter; }').
What is it really that you care about with equality?
For example these two 'fun_ptr' will compare (according to the wording,
have not tested the implementation):
struct base { void f(); };
struct derived : base {};
void (derived::*mptr)() = &derived::base;
derived d;
auto a = make_fun(mptr, &d);
auto b = make_fun(&derived::base, &d);
// a != b ?!?!? -- the type of holding the member in the
pointer-to-member should not matter
On the other direction, there are cases where equality would also be broken
on the other direction, the library claiming two 'fun_ptr' being "equal"
when they are not. The requirement seems to come from attempting to
consider 'fun_ptr's created from two lambda instances created by the same
lambda expression as the same, but the type of the lambda is not sufficient
to determine "equivalency":
auto c_str_getter(std::string const & s) { return [&s]() { return
s.c_str(); }; }
std::string h("Hello"), w("world");
auto a = make_fun(c_str_getter(h));
auto b = make_fun(c_str_getter(w));
This case is semantically equivalent to:
auto a = make_fun(&std::string::c_str, h);
auto b = make_fun(&std::string::c_str, w);
But in the first case the library (again judging by the documentation)
would claim 'a == b' in the first case but 'a != b' in the second case.
Beyond that case, the assumption that for a non-comparable type all
instances are the same is completely bogus:
struct S { void f(); void g(); };
auto a = make_fun(std::mem_fn(&S::f));
auto b = make_fun(std::mem_fn(&S::g));
And multiple other examples could be provided from stateful functors in
C++03, probably less and less used now since we have lambdas.
I believe the false positives are a much worse problem than the false
negatives as they violate the base principles of value type that you
provided.
Equality is complicated. Defining what the *value* of a generalized
callable thing is hard.
David
On Fri, May 29, 2015 at 1:58 AM, Patrice Roy <patricer@gmail.com> wrote:
> First look is nice; I'll look at it in more detail soon to give more
> complete feedback. Thanks
>
> 2015-05-28 11:39 GMT-04:00 Michael Boyko <mboyko2000@gmail.com>:
>
> I have updated my proposal and code as discussed in this thread.
>> I published the proposal and code on code project
>> <http://www.codeproject.com/Articles/995916/A-Smart-Function-Pointer> for
>> anyone to review. The code has been tested and bench marked (which can be
>> seen on code project).
>>
>> --
>>
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "ISO C++ Standard - Future Proposals" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to std-proposals+unsubscribe@isocpp.org.
>> To post to this group, send email to std-proposals@isocpp.org.
>> Visit this group at
>> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>>
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--
---
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.
--001a1134ce26ff4fac0517381ff4
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">I am not sure what the definition of "value" is =
for you, or said otherwise, what are the salient attributes of 'fun_ptr=
'. In some places it seems like you want a strict: 'a =3D=3D b =3D&=
gt; a() =3D=3D b()', or rather that 'a =3D=3D b' implies that e=
valuating either 'a()' or 'b()' yields the same result (as =
two consecutive evaluations of the same function could generate different r=
esults anyway ('int f() { static int counter; return ++counter; }')=
..<br><br>What is it really that you care about with equality?<br><br>For ex=
ample these two 'fun_ptr' will compare (according to the wording, h=
ave not tested the implementation):<br><br>struct base { void f(); };<br>st=
ruct derived : base {};<br><br>void (derived::*mptr)() =3D &derived::ba=
se;<br>derived d;<br>auto a =3D make_fun(mptr, &d);<br>auto b =3D make_=
fun(&derived::base, &d);<br>=C2=A0 =C2=A0// a !=3D b ?!?!? -- the t=
ype of holding the member in the pointer-to-member should not matter<br><di=
v><br>On the other direction, there are cases where equality would also be =
broken on the other direction, the library claiming two 'fun_ptr' b=
eing "equal" when they are not.=C2=A0 The requirement seems to co=
me from attempting to consider 'fun_ptr's created from two lambda i=
nstances created by the same lambda expression as the same, but the type of=
the lambda is not sufficient to determine "equivalency":<br><br>=
auto c_str_getter(std::string const & s) { return [&s]() { return s=
..c_str(); }; }<br>std::string h("Hello"), w("world");<b=
r>auto a =3D make_fun(c_str_getter(h));<br>auto b =3D make_fun(c_str_getter=
(w));<br><br>This case is semantically equivalent to:<br><br>auto a =3D mak=
e_fun(&std::string::c_str, h);<br>auto b =3D make_fun(&std::string:=
:c_str, w);<br><br>But in the first case the library (again judging by the =
documentation) would claim 'a =3D=3D b' in the first case but '=
a !=3D b' in the second case.<br><br>Beyond that case, the assumption t=
hat for a non-comparable type all instances are the same is completely bogu=
s:<br><br>struct S { void f(); void g(); };<br>auto a =3D make_fun(std::mem=
_fn(&S::f));<br>auto b =3D make_fun(std::mem_fn(&S::g));<br><br>And=
multiple other examples could be provided from stateful functors in C++03,=
probably less and less used now since we have lambdas.<br><br>I believe th=
e false positives are a much worse problem than the false negatives as they=
violate the base principles of value type that you provided.<br><br>Equali=
ty is complicated. Defining what the *value* of a generalized callable thin=
g is hard.<br><br>=C2=A0 =C2=A0 David<br><br><br></div></div><div class=3D"=
gmail_extra"><br><div class=3D"gmail_quote">On Fri, May 29, 2015 at 1:58 AM=
, Patrice Roy <span dir=3D"ltr"><<a href=3D"mailto:patricer@gmail.com" t=
arget=3D"_blank">patricer@gmail.com</a>></span> wrote:<br><blockquote cl=
ass=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;p=
adding-left:1ex"><div dir=3D"ltr">First look is nice; I'll look at it i=
n more detail soon to give more complete feedback. Thanks<br></div><div cla=
ss=3D"gmail_extra"><br><div class=3D"gmail_quote">2015-05-28 11:39 GMT-04:0=
0 Michael Boyko <span dir=3D"ltr"><<a href=3D"mailto:mboyko2000@gmail.co=
m" target=3D"_blank">mboyko2000@gmail.com</a>></span>:<div><div class=3D=
"h5"><br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;borde=
r-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>I have update=
d my proposal and code as discussed in this thread. I=C2=A0published=C2=A0t=
he proposal and code on <a href=3D"http://www.codeproject.com/Articles/9959=
16/A-Smart-Function-Pointer" target=3D"_blank">code project</a>=C2=A0for an=
yone to review. The code has been tested and bench marked (which can be see=
n on code project).</div></div><div><div>
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div></div></div><br></div><div class=3D"HOEnZb">=
<div class=3D"h5">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--001a1134ce26ff4fac0517381ff4--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Fri, 29 May 2015 07:37:12 -0700 (PDT)
Raw View
------=_Part_294_1210509151.1432910232698
Content-Type: multipart/alternative;
boundary="----=_Part_295_1914712826.1432910232698"
------=_Part_295_1914712826.1432910232698
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Thank you for taking some time to evaluate this.
On Friday, May 29, 2015 at 8:05:08 AM UTC-5, David Rodr=C3=ADguez Ibeas wro=
te:
> I am not sure what the definition of "value" is for you, or said=20
> otherwise, what are the salient attributes of 'fun_ptr'. In some places i=
t=20
> seems like you want a strict: 'a =3D=3D b =3D> a() =3D=3D b()', or rather=
that 'a =3D=3D=20
> b' implies that evaluating either 'a()' or 'b()' yields the same result (=
as=20
> two consecutive evaluations of the same function could generate different=
=20
> results anyway ('int f() { static int counter; return ++counter; }').
>
> What is it really that you care about with equality?
>
The only salient attribute is the target period. Two fun_ptr's are equal if=
=20
they have identical targets. While it is true that two consecutive=20
evaluations of the same function could generate different results calling=
=20
a() or b() at each stage results in the same behavior. that is:
assert(a =3D=3D b);
if (is_odd(rand())) a();
else b();
if (is_odd(rand())) a();
else b();
will result is the same behavior regardless of the result of rand().
This is the behavior we would expect if a and b were of type void(*)() and=
=20
it should be the same for the fun_ptr type.
=20
>
> For example these two 'fun_ptr' will compare (according to the wording,=
=20
> have not tested the implementation):
>
> struct base { void f(); };
> struct derived : base {};
>
> void (derived::*mptr)() =3D &derived::base;
> derived d;
> auto a =3D make_fun(mptr, &d);
> auto b =3D make_fun(&derived::base, &d);
> // a !=3D b ?!?!? -- the type of holding the member in the=20
> pointer-to-member should not matter
>
I think you have a typo here. I think you meant derived::f instead of=20
derived::base. But your point is well taken. That actually will not compile=
=20
for fun_ptr. I will have to think if that can be supported and still have=
=20
equality.
=20
>
> On the other direction, there are cases where equality would also be=20
> broken on the other direction, the library claiming two 'fun_ptr' being=
=20
> "equal" when they are not. The requirement seems to come from attempting=
=20
> to consider 'fun_ptr's created from two lambda instances created by the=
=20
> same lambda expression as the same, but the type of the lambda is not=20
> sufficient to determine "equivalency":
>
> auto c_str_getter(std::string const & s) { return [&s]() { return=20
> s.c_str(); }; }
> std::string h("Hello"), w("world");
> auto a =3D make_fun(c_str_getter(h));
> auto b =3D make_fun(c_str_getter(w));
>
You are correct. This would evaluate equal when they should not. I missed=
=20
that lambda captures are not necessarily the same for a given type when=20
they move out of a scope. This probably breaks lambda equality unless the=
=20
proposal for auto generated operator=3D=3D is adopted at some point in the=
=20
future. I'll have to look into this some more. Thanks for the example.
=20
>
> This case is semantically equivalent to:
>
> auto a =3D make_fun(&std::string::c_str, h);
> auto b =3D make_fun(&std::string::c_str, w);
>
> But in the first case the library (again judging by the documentation)=20
> would claim 'a =3D=3D b' in the first case but 'a !=3D b' in the second c=
ase.
>
> Beyond that case, the assumption that for a non-comparable type all=20
> instances are the same is completely bogus:
>
> struct S { void f(); void g(); };
> auto a =3D make_fun(std::mem_fn(&S::f));
> auto b =3D make_fun(std::mem_fn(&S::g));
>
Any user defined functor (which mem_fn is) that does not specify an=20
operator=3D=3D would not have a specified equality as stated in the=20
documentation. In light of your example that breaks lambdas it may be that=
=20
all function objects would once again be treated the same. That is without=
=20
operator=3D=3D the result of fun_ptr's equality is unspecified.
=20
>
> And multiple other examples could be provided from stateful functors in=
=20
> C++03, probably less and less used now since we have lambdas.
>
> I believe the false positives are a much worse problem than the false=20
> negatives as they violate the base principles of value type that you=20
> provided.
>
> Equality is complicated. Defining what the *value* of a generalized=20
> callable thing is hard.
>
> David
>
>
>
> On Fri, May 29, 2015 at 1:58 AM, Patrice Roy <patr...@gmail.com=20
> <javascript:>> wrote:
>
>> First look is nice; I'll look at it in more detail soon to give more=20
>> complete feedback. Thanks
>>
>> 2015-05-28 11:39 GMT-04:00 Michael Boyko <mboyk...@gmail.com=20
>> <javascript:>>:
>>
>> I have updated my proposal and code as discussed in this thread.=20
>>> I published the proposal and code on code project=20
>>> <http://www.codeproject.com/Articles/995916/A-Smart-Function-Pointer> f=
or=20
>>> anyone to review. The code has been tested and bench marked (which can =
be=20
>>> seen on code project).
>>>
>>> --=20
>>>
>>> ---=20
>>> You received this message because you are subscribed to the Google=20
>>> Groups "ISO C++ Standard - Future Proposals" group.
>>> To unsubscribe from this group and stop receiving emails from it, send=
=20
>>> an email to std-proposal...@isocpp.org <javascript:>.
>>> To post to this group, send email to std-pr...@isocpp.org <javascript:>=
..
>>> Visit this group at=20
>>> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>>>
>>
>> --=20
>>
>> ---=20
>> You received this message because you are subscribed to the Google Group=
s=20
>> "ISO C++ Standard - Future Proposals" group.
>> To unsubscribe from this group and stop receiving emails from it, send a=
n=20
>> email to std-proposal...@isocpp.org <javascript:>.
>> To post to this group, send email to std-pr...@isocpp.org <javascript:>.
>> Visit this group at=20
>> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>>
>
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_295_1914712826.1432910232698
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>Thank you for taking some time to evaluate this.</div=
><div><br>On Friday, May 29, 2015 at 8:05:08 AM UTC-5, David Rodr=C3=ADguez=
Ibeas wrote:</div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0=
px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); bor=
der-left-width: 1px; border-left-style: solid;"><div dir=3D"ltr">I am not s=
ure what the definition of "value" is for you, or said otherwise, what are =
the salient attributes of 'fun_ptr'. In some places it seems like you want =
a strict: 'a =3D=3D b =3D> a() =3D=3D b()', or rather that 'a =3D=3D b' =
implies that evaluating either 'a()' or 'b()' yields the same result (as tw=
o consecutive evaluations of the same function could generate different res=
ults anyway ('int f() { static int counter; return ++counter; }').<br><br>W=
hat is it really that you care about with equality?<br></div></blockquote><=
div><br></div><div>The only salient attribute is the target period. Two fun=
_ptr's are equal if they have identical targets. While it is true that two =
consecutive evaluations of the same function could generate different resul=
ts calling a() or b() at each stage results in the same behavior. that is:<=
/div><div><br></div><div class=3D"prettyprint" style=3D"border: 1px solid r=
gb(187, 187, 187); border-image: none; -ms-word-wrap: break-word; backgroun=
d-color: rgb(250, 250, 250);"><code class=3D"prettyprint"><div class=3D"sub=
prettyprint"><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 1=
36);">assert</span><span class=3D"styled-by-prettify" style=3D"color: rgb(1=
02, 102, 0);">(</span><span class=3D"styled-by-prettify" style=3D"color: rg=
b(0, 0, 0);">a </span><span class=3D"styled-by-prettify" style=3D"color: rg=
b(102, 102, 0);">=3D=3D</span><span class=3D"styled-by-prettify" style=3D"c=
olor: rgb(0, 0, 0);"> b</span><span class=3D"styled-by-prettify" style=3D"c=
olor: rgb(102, 102, 0);">);</span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 0, 0);"><br><br></span><span class=3D"styled-by-prettify"=
style=3D"color: rgb(0, 0, 136);">if</span><span class=3D"styled-by-prettif=
y" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify=
" style=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-by-prett=
ify" style=3D"color: rgb(0, 0, 0);">is_odd</span><span class=3D"styled-by-p=
rettify" style=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-b=
y-prettify" style=3D"color: rgb(0, 0, 0);">rand</span><span class=3D"styled=
-by-prettify" style=3D"color: rgb(102, 102, 0);">()))</span><span class=3D"=
styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> a</span><span class=3D"=
styled-by-prettify" style=3D"color: rgb(102, 102, 0);">();</span><span clas=
s=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br></span><span cl=
ass=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">else</span><spa=
n class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> b</span><spa=
n class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">();</span=
><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br><br>=
</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">=
if</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);">=
</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0)=
;">(</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);=
">is_odd</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, =
102, 0);">(</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0,=
0, 0);">rand</span><span class=3D"styled-by-prettify" style=3D"color: rgb(=
102, 102, 0);">()))</span><span class=3D"styled-by-prettify" style=3D"color=
: rgb(0, 0, 0);"> a</span><span class=3D"styled-by-prettify" style=3D"color=
: rgb(102, 102, 0);">();</span><span class=3D"styled-by-prettify" style=3D"=
color: rgb(0, 0, 0);"><br></span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 0, 136);">else</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: rgb(0, 0, 0);"> b</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: rgb(102, 102, 0);">();</span><span class=3D"styled-by-pretti=
fy" style=3D"color: rgb(0, 0, 0);"><br></span></div></code></div><div><br><=
/div><div>will result is the same behavior regardless of the result of rand=
().</div><div><br></div><div>This is the behavior we would expect if a and =
b were of type void(*)() and it should be the same for the fun_ptr type.</d=
iv><div> </div><blockquote class=3D"gmail_quote" style=3D"margin: 0px =
0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); bo=
rder-left-width: 1px; border-left-style: solid;"><div dir=3D"ltr"><br>For e=
xample these two 'fun_ptr' will compare (according to the wording, have not=
tested the implementation):<br><br>struct base { void f(); };<br>struct de=
rived : base {};<br><br>void (derived::*mptr)() =3D &derived::base;<br>=
derived d;<br>auto a =3D make_fun(mptr, &d);<br>auto b =3D make_fun(&am=
p;derived::base, &d);<br> // a !=3D b ?!?!? -- the type of =
holding the member in the pointer-to-member should not matter<br></div></bl=
ockquote><div><br></div><div>I think you have a typo here. I think you mean=
t derived::f instead of derived::base. But your point is well taken. That a=
ctually will not compile for fun_ptr. I will have to think if that can be s=
upported and still have equality.</div><div> </div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; bor=
der-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-sty=
le: solid;"><div dir=3D"ltr"><div><br>On the other direction, there are cas=
es where equality would also be broken on the other direction, the library =
claiming two 'fun_ptr' being "equal" when they are not. The requireme=
nt seems to come from attempting to consider 'fun_ptr's created from two la=
mbda instances created by the same lambda expression as the same, but the t=
ype of the lambda is not sufficient to determine "equivalency":<br><br>auto=
c_str_getter(std::string const & s) { return [&s]() { return s.c_s=
tr(); }; }<br>std::string h("Hello"), w("world");<br>auto a =3D make_fun(c_=
str_getter(h));<br>auto b =3D make_fun(c_str_getter(w));<br></div></div></b=
lockquote><div><br></div><div>You are correct. This would evaluate equal wh=
en they should not. I missed that lambda captures are not necessarily =
the same for a given type when they move out of a scope. This probably brea=
ks lambda equality unless the proposal for auto generated operator=3D=3D is=
adopted at some point in the future. I'll have to look into this some=
more. Thanks for the example.</div><div> </div><blockquote class=3D"g=
mail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-l=
eft-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: s=
olid;"><div dir=3D"ltr"><div><br>This case is semantically equivalent to:<b=
r><br>auto a =3D make_fun(&std::string::c_str, h);<br>auto b =3D make_f=
un(&std::string::c_str, w);<br><br>But in the first case the library (a=
gain judging by the documentation) would claim 'a =3D=3D b' in the first ca=
se but 'a !=3D b' in the second case.<br><br>Beyond that case, the assumpti=
on that for a non-comparable type all instances are the same is completely =
bogus:<br><br>struct S { void f(); void g(); };<br>auto a =3D make_fun(std:=
:mem_fn(&S::f));<br>auto b =3D make_fun(std::mem_fn(&S::g));<br></d=
iv></div></blockquote><div><br></div><div>Any user defined functor (which m=
em_fn is) that does not specify an operator=3D=3D would not have a specifie=
d equality as stated in the documentation. In light of your example that br=
eaks lambdas it may be that all function objects would once again=
be treated the same. That is without operator=3D=3D the result of fun_ptr'=
s equality is unspecified.</div><div> </div><blockquote class=3D"gmail=
_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-=
color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid=
;"><div dir=3D"ltr"><div><br>And multiple other examples could be provided =
from stateful functors in C++03, probably less and less used now since we h=
ave lambdas.<br><br>I believe the false positives are a much worse problem =
than the false negatives as they violate the base principles of value type =
that you provided.<br><br>Equality is complicated. Defining what the *value=
* of a generalized callable thing is hard.<br><br> David<br><b=
r><br></div></div><div><br><div class=3D"gmail_quote">On Fri, May 29, 2015 =
at 1:58 AM, Patrice Roy <span dir=3D"ltr"><<a onmousedown=3D"this.href=
=3D'javascript:';return true;" onclick=3D"this.href=3D'javascript:';return =
true;" href=3D"javascript:" target=3D"_blank" rel=3D"nofollow" gdf-obfuscat=
ed-mailto=3D"SiOIcXJDSO0J">patr...@gmail.com</a>></span> wrote:<br><bloc=
kquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-le=
ft: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; bor=
der-left-style: solid;"><div dir=3D"ltr">First look is nice; I'll look at i=
t in more detail soon to give more complete feedback. Thanks<br></div><div>=
<br><div class=3D"gmail_quote">2015-05-28 11:39 GMT-04:00 Michael Boyko <sp=
an dir=3D"ltr"><<a onmousedown=3D"this.href=3D'javascript:';return true;=
" onclick=3D"this.href=3D'javascript:';return true;" href=3D"javascript:" t=
arget=3D"_blank" rel=3D"nofollow" gdf-obfuscated-mailto=3D"SiOIcXJDSO0J">mb=
oyk...@gmail.com</a>></span>:<div><div><br><blockquote class=3D"gmail_qu=
ote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-col=
or: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;">=
<div dir=3D"ltr"><div>I have updated my proposal and code as discussed in t=
his thread. I published the proposal and code on <a onmousedown=
=3D"this.href=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.codeproject=
..com%2FArticles%2F995916%2FA-Smart-Function-Pointer\46sa\75D\46sntz\0751\46=
usg\75AFQjCNHyE3q7drn9og-eU19FaDfU_gR2pA';return true;" onclick=3D"this.hre=
f=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.codeproject.com%2FArtic=
les%2F995916%2FA-Smart-Function-Pointer\46sa\75D\46sntz\0751\46usg\75AFQjCN=
HyE3q7drn9og-eU19FaDfU_gR2pA';return true;" href=3D"http://www.codeproject.=
com/Articles/995916/A-Smart-Function-Pointer" target=3D"_blank" rel=3D"nofo=
llow">code project</a> for anyone to review. The code has been tested =
and bench marked (which can be seen on code project).</div></div><div><div>
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a onmousedown=3D"this.href=3D'javascript:';return true;" onclick=
=3D"this.href=3D'javascript:';return true;" href=3D"javascript:" target=3D"=
_blank" rel=3D"nofollow" gdf-obfuscated-mailto=3D"SiOIcXJDSO0J">std-proposa=
l...@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a onmousedown=3D"this.href=3D'javascr=
ipt:';return true;" onclick=3D"this.href=3D'javascript:';return true;" href=
=3D"javascript:" target=3D"_blank" rel=3D"nofollow" gdf-obfuscated-mailto=
=3D"SiOIcXJDSO0J">std-pr...@isocpp.org</a>.<br>
Visit this group at <a onmousedown=3D"this.href=3D'http://groups.google.com=
/a/isocpp.org/group/std-proposals/';return true;" onclick=3D"this.href=3D'h=
ttp://groups.google.com/a/isocpp.org/group/std-proposals/';return true;" hr=
ef=3D"http://groups.google.com/a/isocpp.org/group/std-proposals/" target=3D=
"_blank" rel=3D"nofollow">http://groups.google.com/a/<wbr>isocpp.org/group/=
std-<wbr>proposals/</a>.<br>
</div></div></blockquote></div></div></div><br></div><div><div>
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a onmousedown=3D"this.href=3D'javascript:';return true;" onclick=
=3D"this.href=3D'javascript:';return true;" href=3D"javascript:" target=3D"=
_blank" rel=3D"nofollow" gdf-obfuscated-mailto=3D"SiOIcXJDSO0J">std-proposa=
l...@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a onmousedown=3D"this.href=3D'javascr=
ipt:';return true;" onclick=3D"this.href=3D'javascript:';return true;" href=
=3D"javascript:" target=3D"_blank" rel=3D"nofollow" gdf-obfuscated-mailto=
=3D"SiOIcXJDSO0J">std-pr...@isocpp.org</a>.<br>
Visit this group at <a onmousedown=3D"this.href=3D'http://groups.google.com=
/a/isocpp.org/group/std-proposals/';return true;" onclick=3D"this.href=3D'h=
ttp://groups.google.com/a/isocpp.org/group/std-proposals/';return true;" hr=
ef=3D"http://groups.google.com/a/isocpp.org/group/std-proposals/" target=3D=
"_blank" rel=3D"nofollow">http://groups.google.com/a/<wbr>isocpp.org/group/=
std-<wbr>proposals/</a>.<br>
</div></div></blockquote></div><br></div>
</blockquote></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_295_1914712826.1432910232698--
------=_Part_294_1210509151.1432910232698--
.
Author: Patrice Roy <patricer@gmail.com>
Date: Fri, 29 May 2015 12:19:15 -0400
Raw View
--089e014939fc588ba805173ad64d
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
With respect to this:
auto c_str_getter(std::string const & s) { return [&s]() { return
> s.c_str(); }; }
> std::string h("Hello"), w("world");
> auto a =3D make_fun(c_str_getter(h));
> auto b =3D make_fun(c_str_getter(w));
>
> This case is semantically equivalent to:
>
> auto a =3D make_fun(&std::string::c_str, h);
> auto b =3D make_fun(&std::string::c_str, w);
.... we would be in the territory of =C2=ABfunctionally equivalent but not
equivalent=C2=BB statements, probably; informally same results when used, b=
ut
expressed differently.
I don't see this proposal as a semantic change as much as an additional
tool for such things as observer rejecting duplicates. Am I reading your
intentions right, Michael?
2015-05-29 10:37 GMT-04:00 Michael Boyko <mboyko2000@gmail.com>:
> Thank you for taking some time to evaluate this.
>
> On Friday, May 29, 2015 at 8:05:08 AM UTC-5, David Rodr=C3=ADguez Ibeas w=
rote:
>
>> I am not sure what the definition of "value" is for you, or said
>> otherwise, what are the salient attributes of 'fun_ptr'. In some places =
it
>> seems like you want a strict: 'a =3D=3D b =3D> a() =3D=3D b()', or rathe=
r that 'a =3D=3D
>> b' implies that evaluating either 'a()' or 'b()' yields the same result =
(as
>> two consecutive evaluations of the same function could generate differen=
t
>> results anyway ('int f() { static int counter; return ++counter; }').
>>
>> What is it really that you care about with equality?
>>
>
> The only salient attribute is the target period. Two fun_ptr's are equal
> if they have identical targets. While it is true that two consecutive
> evaluations of the same function could generate different results calling
> a() or b() at each stage results in the same behavior. that is:
>
> assert(a =3D=3D b);
>
> if (is_odd(rand())) a();
> else b();
>
> if (is_odd(rand())) a();
> else b();
>
> will result is the same behavior regardless of the result of rand().
>
> This is the behavior we would expect if a and b were of type void(*)() an=
d
> it should be the same for the fun_ptr type.
>
>
>>
>> For example these two 'fun_ptr' will compare (according to the wording,
>> have not tested the implementation):
>>
>> struct base { void f(); };
>> struct derived : base {};
>>
>> void (derived::*mptr)() =3D &derived::base;
>> derived d;
>> auto a =3D make_fun(mptr, &d);
>> auto b =3D make_fun(&derived::base, &d);
>> // a !=3D b ?!?!? -- the type of holding the member in the
>> pointer-to-member should not matter
>>
>
> I think you have a typo here. I think you meant derived::f instead of
> derived::base. But your point is well taken. That actually will not compi=
le
> for fun_ptr. I will have to think if that can be supported and still have
> equality.
>
>
>>
>> On the other direction, there are cases where equality would also be
>> broken on the other direction, the library claiming two 'fun_ptr' being
>> "equal" when they are not. The requirement seems to come from attemptin=
g
>> to consider 'fun_ptr's created from two lambda instances created by the
>> same lambda expression as the same, but the type of the lambda is not
>> sufficient to determine "equivalency":
>>
>> auto c_str_getter(std::string const & s) { return [&s]() { return
>> s.c_str(); }; }
>> std::string h("Hello"), w("world");
>> auto a =3D make_fun(c_str_getter(h));
>> auto b =3D make_fun(c_str_getter(w));
>>
>
> You are correct. This would evaluate equal when they should not. I missed
> that lambda captures are not necessarily the same for a given type when
> they move out of a scope. This probably breaks lambda equality unless the
> proposal for auto generated operator=3D=3D is adopted at some point in th=
e
> future. I'll have to look into this some more. Thanks for the example.
>
>
>>
>> This case is semantically equivalent to:
>>
>> auto a =3D make_fun(&std::string::c_str, h);
>> auto b =3D make_fun(&std::string::c_str, w);
>>
>> But in the first case the library (again judging by the documentation)
>> would claim 'a =3D=3D b' in the first case but 'a !=3D b' in the second =
case.
>>
>> Beyond that case, the assumption that for a non-comparable type all
>> instances are the same is completely bogus:
>>
>> struct S { void f(); void g(); };
>> auto a =3D make_fun(std::mem_fn(&S::f));
>> auto b =3D make_fun(std::mem_fn(&S::g));
>>
>
> Any user defined functor (which mem_fn is) that does not specify an
> operator=3D=3D would not have a specified equality as stated in the
> documentation. In light of your example that breaks lambdas it may be tha=
t
> all function objects would once again be treated the same. That is withou=
t
> operator=3D=3D the result of fun_ptr's equality is unspecified.
>
>
>>
>> And multiple other examples could be provided from stateful functors in
>> C++03, probably less and less used now since we have lambdas.
>>
>> I believe the false positives are a much worse problem than the false
>> negatives as they violate the base principles of value type that you
>> provided.
>>
>> Equality is complicated. Defining what the *value* of a generalized
>> callable thing is hard.
>>
>> David
>>
>>
>>
>> On Fri, May 29, 2015 at 1:58 AM, Patrice Roy <patr...@gmail.com> wrote:
>>
>>> First look is nice; I'll look at it in more detail soon to give more
>>> complete feedback. Thanks
>>>
>>> 2015-05-28 11:39 GMT-04:00 Michael Boyko <mboyk...@gmail.com>:
>>>
>>> I have updated my proposal and code as discussed in this thread.
>>>> I published the proposal and code on code project
>>>> <http://www.codeproject.com/Articles/995916/A-Smart-Function-Pointer> =
for
>>>> anyone to review. The code has been tested and bench marked (which can=
be
>>>> seen on code project).
>>>>
>>>> --
>>>>
>>>> ---
>>>> You received this message because you are subscribed to the Google
>>>> Groups "ISO C++ Standard - Future Proposals" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to std-proposal...@isocpp.org.
>>>> To post to this group, send email to std-pr...@isocpp.org.
>>>> Visit this group at
>>>> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>>>>
>>>
>>> --
>>>
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "ISO C++ Standard - Future Proposals" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to std-proposal...@isocpp.org.
>>> To post to this group, send email to std-pr...@isocpp.org.
>>> Visit this group at
>>> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>>>
>>
>> --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> Visit this group at
> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
--089e014939fc588ba805173ad64d
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">With respect to this:<br><br><blockquote style=3D"margin:0=
px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" c=
lass=3D"gmail_quote">auto c_str_getter(std::string const & s) { return =
[&s]() { return s.c_str(); }; }<br>std::string h("Hello"), w(=
"world");<br>auto a =3D make_fun(c_str_getter(h));<br>auto b =3D =
make_fun(c_str_getter(w));<br><br>This case is semantically equivalent to:<=
br><br>auto a =3D make_fun(&std::string::c_str, h);<br>auto b =3D make_=
fun(&std::string::c_str, w);</blockquote><div><br></div><div>... we wou=
ld be in the territory of =C2=ABfunctionally equivalent but not equivalent=
=C2=BB statements, probably; informally same results when used, but express=
ed differently.<br><br></div><div>I don't see this proposal as a semant=
ic change as much as an additional tool for such things as observer rejecti=
ng duplicates. Am I reading your intentions right, Michael?<br></div><div>=
=C2=A0<br></div><div class=3D"gmail_extra"><br><div class=3D"gmail_quote">2=
015-05-29 10:37 GMT-04:00 Michael Boyko <span dir=3D"ltr"><<a href=3D"ma=
ilto:mboyko2000@gmail.com" target=3D"_blank">mboyko2000@gmail.com</a>></=
span>:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bord=
er-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>Thank you fo=
r taking some time to evaluate this.</div><span class=3D""><div><br>On Frid=
ay, May 29, 2015 at 8:05:08 AM UTC-5, David Rodr=C3=ADguez Ibeas wrote:</di=
v><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;paddi=
ng-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border=
-left-style:solid"><div dir=3D"ltr">I am not sure what the definition of &q=
uot;value" is for you, or said otherwise, what are the salient attribu=
tes of 'fun_ptr'. In some places it seems like you want a strict: &=
#39;a =3D=3D b =3D> a() =3D=3D b()', or rather that 'a =3D=3D b&=
#39; implies that evaluating either 'a()' or 'b()' yields t=
he same result (as two consecutive evaluations of the same function could g=
enerate different results anyway ('int f() { static int counter; return=
++counter; }').<br><br>What is it really that you care about with equa=
lity?<br></div></blockquote><div><br></div></span><div>The only salient att=
ribute is the target period. Two fun_ptr's are equal if they have ident=
ical targets. While it is true that two consecutive evaluations of the same=
function could generate different results calling a() or b() at each stage=
results in the same behavior. that is:</div><div><br></div><div style=3D"b=
order:1px solid rgb(187,187,187);background-color:rgb(250,250,250)"><code><=
div><span style=3D"color:rgb(0,0,136)">assert</span><span style=3D"color:rg=
b(102,102,0)">(</span><span style=3D"color:rgb(0,0,0)">a </span><span style=
=3D"color:rgb(102,102,0)">=3D=3D</span><span style=3D"color:rgb(0,0,0)"> b<=
/span><span style=3D"color:rgb(102,102,0)">);</span><span style=3D"color:rg=
b(0,0,0)"><br><br></span><span style=3D"color:rgb(0,0,136)">if</span><span =
style=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(102,102,0)">(</=
span><span style=3D"color:rgb(0,0,0)">is_odd</span><span style=3D"color:rgb=
(102,102,0)">(</span><span style=3D"color:rgb(0,0,0)">rand</span><span styl=
e=3D"color:rgb(102,102,0)">()))</span><span style=3D"color:rgb(0,0,0)"> a</=
span><span style=3D"color:rgb(102,102,0)">();</span><span style=3D"color:rg=
b(0,0,0)"><br></span><span style=3D"color:rgb(0,0,136)">else</span><span st=
yle=3D"color:rgb(0,0,0)"> b</span><span style=3D"color:rgb(102,102,0)">();<=
/span><span style=3D"color:rgb(0,0,0)"><br><br></span><span style=3D"color:=
rgb(0,0,136)">if</span><span style=3D"color:rgb(0,0,0)"> </span><span style=
=3D"color:rgb(102,102,0)">(</span><span style=3D"color:rgb(0,0,0)">is_odd</=
span><span style=3D"color:rgb(102,102,0)">(</span><span style=3D"color:rgb(=
0,0,0)">rand</span><span style=3D"color:rgb(102,102,0)">()))</span><span st=
yle=3D"color:rgb(0,0,0)"> a</span><span style=3D"color:rgb(102,102,0)">();<=
/span><span style=3D"color:rgb(0,0,0)"><br></span><span style=3D"color:rgb(=
0,0,136)">else</span><span style=3D"color:rgb(0,0,0)"> b</span><span style=
=3D"color:rgb(102,102,0)">();</span><span style=3D"color:rgb(0,0,0)"><br></=
span></div></code></div><div><br></div><div>will result is the same behavio=
r regardless of the result of rand().</div><div><br></div><div>This is the =
behavior we would expect if a and b were of type void(*)() and it should be=
the same for the fun_ptr type.</div><span class=3D""><div>=C2=A0</div><blo=
ckquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-lef=
t:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-=
style:solid"><div dir=3D"ltr"><br>For example these two 'fun_ptr' w=
ill compare (according to the wording, have not tested the implementation):=
<br><br>struct base { void f(); };<br>struct derived : base {};<br><br>void=
(derived::*mptr)() =3D &derived::base;<br>derived d;<br>auto a =3D mak=
e_fun(mptr, &d);<br>auto b =3D make_fun(&derived::base, &d);<br=
>=C2=A0 =C2=A0// a !=3D b ?!?!? -- the type of holding the member in the po=
inter-to-member should not matter<br></div></blockquote><div><br></div></sp=
an><div>I think you have a typo here. I think you meant derived::f instead =
of derived::base. But your point is well taken. That actually will not comp=
ile for fun_ptr. I will have to think if that can be supported and still ha=
ve equality.</div><span class=3D""><div>=C2=A0</div><blockquote class=3D"gm=
ail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-c=
olor:rgb(204,204,204);border-left-width:1px;border-left-style:solid"><div d=
ir=3D"ltr"><div><br>On the other direction, there are cases where equality =
would also be broken on the other direction, the library claiming two '=
fun_ptr' being "equal" when they are not.=C2=A0 The requireme=
nt seems to come from attempting to consider 'fun_ptr's created fro=
m two lambda instances created by the same lambda expression as the same, b=
ut the type of the lambda is not sufficient to determine "equivalency&=
quot;:<br><br>auto c_str_getter(std::string const & s) { return [&s=
]() { return s.c_str(); }; }<br>std::string h("Hello"), w("w=
orld");<br>auto a =3D make_fun(c_str_getter(h));<br>auto b =3D make_fu=
n(c_str_getter(w));<br></div></div></blockquote><div><br></div></span><div>=
You are correct. This would evaluate equal when they should not. I missed t=
hat lambda captures=C2=A0are not necessarily the same for a given type when=
they move out of a scope. This probably breaks lambda equality unless the =
proposal for auto generated operator=3D=3D is adopted at some point in the =
future. I'll have to look into=C2=A0this some more. Thanks for the exam=
ple.</div><span class=3D""><div>=C2=A0</div><blockquote class=3D"gmail_quot=
e" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb=
(204,204,204);border-left-width:1px;border-left-style:solid"><div dir=3D"lt=
r"><div><br>This case is semantically equivalent to:<br><br>auto a =3D make=
_fun(&std::string::c_str, h);<br>auto b =3D make_fun(&std::string::=
c_str, w);<br><br>But in the first case the library (again judging by the d=
ocumentation) would claim 'a =3D=3D b' in the first case but 'a=
!=3D b' in the second case.<br><br>Beyond that case, the assumption th=
at for a non-comparable type all instances are the same is completely bogus=
:<br><br>struct S { void f(); void g(); };<br>auto a =3D make_fun(std::mem_=
fn(&S::f));<br>auto b =3D make_fun(std::mem_fn(&S::g));<br></div></=
div></blockquote><div><br></div></span><div>Any user defined functor (which=
mem_fn is) that does not specify an operator=3D=3D would not have a specif=
ied equality as stated in the documentation. In light of your example that =
breaks lambdas it may be that all=C2=A0function objects=C2=A0would once aga=
in be treated the same. That is without operator=3D=3D the result of fun_pt=
r's equality is unspecified.</div><div>=C2=A0</div><blockquote class=3D=
"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-lef=
t-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid"><sp=
an class=3D""><div dir=3D"ltr"><div><br>And multiple other examples could b=
e provided from stateful functors in C++03, probably less and less used now=
since we have lambdas.<br><br>I believe the false positives are a much wor=
se problem than the false negatives as they violate the base principles of =
value type that you provided.<br><br>Equality is complicated. Defining what=
the *value* of a generalized callable thing is hard.<br><br>=C2=A0 =C2=A0 =
David<br><br><br></div></div></span><div><br><div class=3D"gmail_quote"><sp=
an class=3D"">On Fri, May 29, 2015 at 1:58 AM, Patrice Roy <span dir=3D"ltr=
"><<a rel=3D"nofollow">patr...@gmail.com</a>></span> wrote:<br></span=
><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;paddin=
g-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-=
left-style:solid"><span class=3D""><div dir=3D"ltr">First look is nice; I&#=
39;ll look at it in more detail soon to give more complete feedback. Thanks=
<br></div></span><div><br><div class=3D"gmail_quote"><span class=3D"">2015-=
05-28 11:39 GMT-04:00 Michael Boyko <span dir=3D"ltr"><<a rel=3D"nofollo=
w">mboyk...@gmail.com</a>></span>:</span><div><div><br><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-=
left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">=
<span class=3D""><div dir=3D"ltr"><div>I have updated my proposal and code =
as discussed in this thread. I=C2=A0published=C2=A0the proposal and code on=
<a href=3D"http://www.codeproject.com/Articles/995916/A-Smart-Function-Poi=
nter" rel=3D"nofollow" target=3D"_blank">code project</a>=C2=A0for anyone t=
o review. The code has been tested and bench marked (which can be seen on c=
ode project).</div></div></span><div><div><span class=3D"">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br></span>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a rel=3D"nofollow">std-proposal...@isocpp.org</a>.<br>
To post to this group, send email to <a rel=3D"nofollow">std-pr...@isocpp.o=
rg</a>.<span class=3D""><br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" rel=3D"nofollow" target=3D"_blank">http://groups.google.com=
/a/isocpp.org/group/std-proposals/</a>.<br>
</span></div></div></blockquote></div></div></div><br></div><div><div><span=
class=3D"">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br></span>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a rel=3D"nofollow">std-proposal...@isocpp.org</a>.<br>
To post to this group, send email to <a rel=3D"nofollow">std-pr...@isocpp.o=
rg</a>.<span class=3D""><br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" rel=3D"nofollow" target=3D"_blank">http://groups.google.com=
/a/isocpp.org/group/std-proposals/</a>.<br>
</span></div></div></blockquote></div><br></div>
</blockquote></div><div class=3D"HOEnZb"><div class=3D"h5">
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
--089e014939fc588ba805173ad64d--
.
Author: Michael Boyko <mboyko2000@gmail.com>
Date: Fri, 29 May 2015 09:55:14 -0700 (PDT)
Raw View
------=_Part_253_49144419.1432918514650
Content-Type: multipart/alternative;
boundary="----=_Part_254_1336529685.1432918514650"
------=_Part_254_1336529685.1432918514650
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On Friday, May 29, 2015 at 11:19:18 AM UTC-5, Patrice Roy wrote:
>
> With respect to this:
>
> auto c_str_getter(std::string const & s) { return [&s]() { return=20
>> s.c_str(); }; }
>> std::string h("Hello"), w("world");
>> auto a =3D make_fun(c_str_getter(h));
>> auto b =3D make_fun(c_str_getter(w));
>>
>> This case is semantically equivalent to:
>>
>> auto a =3D make_fun(&std::string::c_str, h);
>> auto b =3D make_fun(&std::string::c_str, w);
>
>
> ... we would be in the territory of =C2=ABfunctionally equivalent but not=
=20
> equivalent=C2=BB statements, probably; informally same results when used,=
but=20
> expressed differently.
>
I simply erred in thinking type alone is enough to determine equality for=
=20
non mutating lambda functions - its not as this example shows. My first=20
stab at fun_ptr used reference semantics for function objects which would=
=20
produce correct results for this example. However it had other issues as=20
pointed out in this thread - mainly creating two fun_ptrs from the same=20
lambda would not be equal as expected. I think it comes down to function=20
objects would have to provide operator=3D=3D for everything to work correct=
ly.=20
Non capturing lambda's could be handled by way of function pointer=20
conversion but that's only one case.
=20
>
> I don't see this proposal as a semantic change as much as an additional=
=20
> tool for such things as observer rejecting duplicates. Am I reading your=
=20
> intentions right, Michael?
>
Rejecting duplicates could be one good use for this. Observer pattern is=20
probably the most popular use for such a tool, but other container=20
manipulations needing equality may also be useful.
=20
> =20
>
> 2015-05-29 10:37 GMT-04:00 Michael Boyko <mboyk...@gmail.com <javascript:=
>
> >:
>
>> Thank you for taking some time to evaluate this.
>>
>> On Friday, May 29, 2015 at 8:05:08 AM UTC-5, David Rodr=C3=ADguez Ibeas =
wrote:
>>
>>> I am not sure what the definition of "value" is for you, or said=20
>>> otherwise, what are the salient attributes of 'fun_ptr'. In some places=
it=20
>>> seems like you want a strict: 'a =3D=3D b =3D> a() =3D=3D b()', or rath=
er that 'a =3D=3D=20
>>> b' implies that evaluating either 'a()' or 'b()' yields the same result=
(as=20
>>> two consecutive evaluations of the same function could generate differe=
nt=20
>>> results anyway ('int f() { static int counter; return ++counter; }').
>>>
>>> What is it really that you care about with equality?
>>>
>>
>> The only salient attribute is the target period. Two fun_ptr's are equal=
=20
>> if they have identical targets. While it is true that two consecutive=20
>> evaluations of the same function could generate different results callin=
g=20
>> a() or b() at each stage results in the same behavior. that is:
>>
>> assert(a =3D=3D b);
>>
>> if (is_odd(rand())) a();
>> else b();
>>
>> if (is_odd(rand())) a();
>> else b();
>>
>> will result is the same behavior regardless of the result of rand().
>>
>> This is the behavior we would expect if a and b were of type void(*)()=
=20
>> and it should be the same for the fun_ptr type.
>> =20
>>
>>>
>>> For example these two 'fun_ptr' will compare (according to the wording,=
=20
>>> have not tested the implementation):
>>>
>>> struct base { void f(); };
>>> struct derived : base {};
>>>
>>> void (derived::*mptr)() =3D &derived::base;
>>> derived d;
>>> auto a =3D make_fun(mptr, &d);
>>> auto b =3D make_fun(&derived::base, &d);
>>> // a !=3D b ?!?!? -- the type of holding the member in the=20
>>> pointer-to-member should not matter
>>>
>>
>> I think you have a typo here. I think you meant derived::f instead of=20
>> derived::base. But your point is well taken. That actually will not comp=
ile=20
>> for fun_ptr. I will have to think if that can be supported and still hav=
e=20
>> equality.
>> =20
>>
>>>
>>> On the other direction, there are cases where equality would also be=20
>>> broken on the other direction, the library claiming two 'fun_ptr' being=
=20
>>> "equal" when they are not. The requirement seems to come from attempti=
ng=20
>>> to consider 'fun_ptr's created from two lambda instances created by the=
=20
>>> same lambda expression as the same, but the type of the lambda is not=
=20
>>> sufficient to determine "equivalency":
>>>
>>> auto c_str_getter(std::string const & s) { return [&s]() { return=20
>>> s.c_str(); }; }
>>> std::string h("Hello"), w("world");
>>> auto a =3D make_fun(c_str_getter(h));
>>> auto b =3D make_fun(c_str_getter(w));
>>>
>>
>> You are correct. This would evaluate equal when they should not. I misse=
d=20
>> that lambda captures are not necessarily the same for a given type when=
=20
>> they move out of a scope. This probably breaks lambda equality unless th=
e=20
>> proposal for auto generated operator=3D=3D is adopted at some point in t=
he=20
>> future. I'll have to look into this some more. Thanks for the example.
>> =20
>>
>>>
>>> This case is semantically equivalent to:
>>>
>>> auto a =3D make_fun(&std::string::c_str, h);
>>> auto b =3D make_fun(&std::string::c_str, w);
>>>
>>> But in the first case the library (again judging by the documentation)=
=20
>>> would claim 'a =3D=3D b' in the first case but 'a !=3D b' in the second=
case.
>>>
>>> Beyond that case, the assumption that for a non-comparable type all=20
>>> instances are the same is completely bogus:
>>>
>>> struct S { void f(); void g(); };
>>> auto a =3D make_fun(std::mem_fn(&S::f));
>>> auto b =3D make_fun(std::mem_fn(&S::g));
>>>
>>
>> Any user defined functor (which mem_fn is) that does not specify an=20
>> operator=3D=3D would not have a specified equality as stated in the=20
>> documentation. In light of your example that breaks lambdas it may be th=
at=20
>> all function objects would once again be treated the same. That is witho=
ut=20
>> operator=3D=3D the result of fun_ptr's equality is unspecified.
>> =20
>>
>>>
>>> And multiple other examples could be provided from stateful functors in=
=20
>>> C++03, probably less and less used now since we have lambdas.
>>>
>>> I believe the false positives are a much worse problem than the false=
=20
>>> negatives as they violate the base principles of value type that you=20
>>> provided.
>>>
>>> Equality is complicated. Defining what the *value* of a generalized=20
>>> callable thing is hard.
>>>
>>> David
>>>
>>>
>>>
>>> On Fri, May 29, 2015 at 1:58 AM, Patrice Roy <patr...@gmail.com> wrote:
>>>
>>>> First look is nice; I'll look at it in more detail soon to give more=
=20
>>>> complete feedback. Thanks
>>>>
>>>> 2015-05-28 11:39 GMT-04:00 Michael Boyko <mboyk...@gmail.com>:
>>>>
>>>> I have updated my proposal and code as discussed in this thread.=20
>>>>> I published the proposal and code on code project=20
>>>>> <http://www.codeproject.com/Articles/995916/A-Smart-Function-Pointer>=
for=20
>>>>> anyone to review. The code has been tested and bench marked (which ca=
n be=20
>>>>> seen on code project).
>>>>>
>>>>> --=20
>>>>>
>>>>> ---=20
>>>>> You received this message because you are subscribed to the Google=20
>>>>> Groups "ISO C++ Standard - Future Proposals" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, sen=
d=20
>>>>> an email to std-proposal...@isocpp.org.
>>>>> To post to this group, send email to std-pr...@isocpp.org.
>>>>> Visit this group at=20
>>>>> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>>>>>
>>>>
>>>> --=20
>>>>
>>>> ---=20
>>>> You received this message because you are subscribed to the Google=20
>>>> Groups "ISO C++ Standard - Future Proposals" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send=
=20
>>>> an email to std-proposal...@isocpp.org.
>>>> To post to this group, send email to std-pr...@isocpp.org.
>>>> Visit this group at=20
>>>> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>>>>
>>>
>>> --=20
>>
>> ---=20
>> You received this message because you are subscribed to the Google Group=
s=20
>> "ISO C++ Standard - Future Proposals" group.
>> To unsubscribe from this group and stop receiving emails from it, send a=
n=20
>> email to std-proposal...@isocpp.org <javascript:>.
>> To post to this group, send email to std-pr...@isocpp.org <javascript:>.
>> Visit this group at=20
>> http://groups.google.com/a/isocpp.org/group/std-proposals/.
>>
>
>
--=20
---=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposa=
ls/.
------=_Part_254_1336529685.1432918514650
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Friday, May 29, 2015 at 11:19:18 AM UTC-5, Patr=
ice Roy wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0p=
x 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-l=
eft-width: 1px; border-left-style: solid;"><div dir=3D"ltr">With respect to=
this:<br><br><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0p=
x 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204, 204); border-l=
eft-width: 1px; border-left-style: solid;">auto c_str_getter(std::string co=
nst & s) { return [&s]() { return s.c_str(); }; }<br>std::string h(=
"Hello"), w("world");<br>auto a =3D make_fun(c_str_getter(h));<br>auto b =
=3D make_fun(c_str_getter(w));<br><br>This case is semantically equivalent =
to:<br><br>auto a =3D make_fun(&std::string::c_str, h);<br>auto b =3D m=
ake_fun(&std::string::c_str, w);</blockquote><div><br></div><div>... we=
would be in the territory of =C2=ABfunctionally equivalent but not equival=
ent=C2=BB statements, probably; informally same results when used, but expr=
essed differently.<br></div></div></blockquote><div><br></div><div>I simply=
erred in thinking type alone is enough to determine equality for non =
mutating lambda functions - its not as this example shows. My first stab at=
fun_ptr used reference semantics for function objects which would produce =
correct results for this example. However it had other issues as pointed ou=
t in this thread - mainly creating two fun_ptrs from the same lambda would =
not be equal as expected. I think it comes down to function objects would h=
ave to provide operator=3D=3D for everything to work correctly. Non capturi=
ng lambda's could be handled by way of function pointer conversion but that=
's only one case.</div><div> </div><blockquote class=3D"gmail_quote" s=
tyle=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rg=
b(204, 204, 204); border-left-width: 1px; border-left-style: solid;"><div d=
ir=3D"ltr"><div><br></div><div>I don't see this proposal as a semantic chan=
ge as much as an additional tool for such things as observer rejecting dupl=
icates. Am I reading your intentions right, Michael?<br></div></div></block=
quote><div><br></div><div>Rejecting duplicates could be one good use for th=
is. Observer pattern is probably the most popular use for such a tool, but&=
nbsp;other container manipulations needing equality may also be u=
seful.</div><div> </div><blockquote class=3D"gmail_quote" style=3D"mar=
gin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rgb(204, 204,=
204); border-left-width: 1px; border-left-style: solid;"><div dir=3D"ltr">=
<div></div><div> <br></div><div><br><div class=3D"gmail_quote">2015-05=
-29 10:37 GMT-04:00 Michael Boyko <span dir=3D"ltr"><<a onmousedown=3D"t=
his.href=3D'javascript:';return true;" onclick=3D"this.href=3D'javascript:'=
;return true;" href=3D"javascript:" target=3D"_blank" rel=3D"nofollow" gdf-=
obfuscated-mailto=3D"5Ru4sazQSgkJ">mboyk...@gmail.com</a>></span>:<br><b=
lockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding=
-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; =
border-left-style: solid;"><div dir=3D"ltr"><div>Thank you for taking some =
time to evaluate this.</div><span><div><br>On Friday, May 29, 2015 at 8:05:=
08 AM UTC-5, David Rodr=C3=ADguez Ibeas wrote:</div><blockquote class=3D"gm=
ail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-le=
ft-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: so=
lid;"><div dir=3D"ltr">I am not sure what the definition of "value" is for =
you, or said otherwise, what are the salient attributes of 'fun_ptr'. In so=
me places it seems like you want a strict: 'a =3D=3D b =3D> a() =3D=3D b=
()', or rather that 'a =3D=3D b' implies that evaluating either 'a()' or 'b=
()' yields the same result (as two consecutive evaluations of the same func=
tion could generate different results anyway ('int f() { static int counter=
; return ++counter; }').<br><br>What is it really that you care about with =
equality?<br></div></blockquote><div><br></div></span><div>The only salient=
attribute is the target period. Two fun_ptr's are equal if they have ident=
ical targets. While it is true that two consecutive evaluations of the same=
function could generate different results calling a() or b() at each stage=
results in the same behavior. that is:</div><div><br></div><div style=3D"b=
order: 1px solid rgb(187, 187, 187); border-image: none; background-color: =
rgb(250, 250, 250);"><code><div><span style=3D"color: rgb(0, 0, 136);">asse=
rt</span><span style=3D"color: rgb(102, 102, 0);">(</span><span style=3D"co=
lor: rgb(0, 0, 0);">a </span><span style=3D"color: rgb(102, 102, 0);">=3D=
=3D</span><span style=3D"color: rgb(0, 0, 0);"> b</span><span style=3D"colo=
r: rgb(102, 102, 0);">);</span><span style=3D"color: rgb(0, 0, 0);"><br><br=
></span><span style=3D"color: rgb(0, 0, 136);">if</span><span style=3D"colo=
r: rgb(0, 0, 0);"> </span><span style=3D"color: rgb(102, 102, 0);">(</span>=
<span style=3D"color: rgb(0, 0, 0);">is_odd</span><span style=3D"color: rgb=
(102, 102, 0);">(</span><span style=3D"color: rgb(0, 0, 0);">rand</span><sp=
an style=3D"color: rgb(102, 102, 0);">()))</span><span style=3D"color: rgb(=
0, 0, 0);"> a</span><span style=3D"color: rgb(102, 102, 0);">();</span><spa=
n style=3D"color: rgb(0, 0, 0);"><br></span><span style=3D"color: rgb(0, 0,=
136);">else</span><span style=3D"color: rgb(0, 0, 0);"> b</span><span styl=
e=3D"color: rgb(102, 102, 0);">();</span><span style=3D"color: rgb(0, 0, 0)=
;"><br><br></span><span style=3D"color: rgb(0, 0, 136);">if</span><span sty=
le=3D"color: rgb(0, 0, 0);"> </span><span style=3D"color: rgb(102, 102, 0);=
">(</span><span style=3D"color: rgb(0, 0, 0);">is_odd</span><span style=3D"=
color: rgb(102, 102, 0);">(</span><span style=3D"color: rgb(0, 0, 0);">rand=
</span><span style=3D"color: rgb(102, 102, 0);">()))</span><span style=3D"c=
olor: rgb(0, 0, 0);"> a</span><span style=3D"color: rgb(102, 102, 0);">();<=
/span><span style=3D"color: rgb(0, 0, 0);"><br></span><span style=3D"color:=
rgb(0, 0, 136);">else</span><span style=3D"color: rgb(0, 0, 0);"> b</span>=
<span style=3D"color: rgb(102, 102, 0);">();</span><span style=3D"color: rg=
b(0, 0, 0);"><br></span></div></code></div><div><br></div><div>will result =
is the same behavior regardless of the result of rand().</div><div><br></di=
v><div>This is the behavior we would expect if a and b were of type void(*)=
() and it should be the same for the fun_ptr type.</div><span><div> </=
div><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; p=
adding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width:=
1px; border-left-style: solid;"><div dir=3D"ltr"><br>For example these two=
'fun_ptr' will compare (according to the wording, have not tested the impl=
ementation):<br><br>struct base { void f(); };<br>struct derived : base {};=
<br><br>void (derived::*mptr)() =3D &derived::base;<br>derived d;<br>au=
to a =3D make_fun(mptr, &d);<br>auto b =3D make_fun(&derived::base,=
&d);<br> // a !=3D b ?!?!? -- the type of holding the memb=
er in the pointer-to-member should not matter<br></div></blockquote><div><b=
r></div></span><div>I think you have a typo here. I think you meant derived=
::f instead of derived::base. But your point is well taken. That actually w=
ill not compile for fun_ptr. I will have to think if that can be supported =
and still have equality.</div><span><div> </div><blockquote class=3D"g=
mail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-l=
eft-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: s=
olid;"><div dir=3D"ltr"><div><br>On the other direction, there are cases wh=
ere equality would also be broken on the other direction, the library claim=
ing two 'fun_ptr' being "equal" when they are not. The requirement se=
ems to come from attempting to consider 'fun_ptr's created from two lambda =
instances created by the same lambda expression as the same, but the type o=
f the lambda is not sufficient to determine "equivalency":<br><br>auto c_st=
r_getter(std::string const & s) { return [&s]() { return s.c_str();=
}; }<br>std::string h("Hello"), w("world");<br>auto a =3D make_fun(c_str_g=
etter(h));<br>auto b =3D make_fun(c_str_getter(w));<br></div></div></blockq=
uote><div><br></div></span><div>You are correct. This would evaluate equal =
when they should not. I missed that lambda captures are not necessaril=
y the same for a given type when they move out of a scope. This probably br=
eaks lambda equality unless the proposal for auto generated operator=3D=3D =
is adopted at some point in the future. I'll have to look into this so=
me more. Thanks for the example.</div><span><div> </div><blockquote cl=
ass=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; =
border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-=
style: solid;"><div dir=3D"ltr"><div><br>This case is semantically equivale=
nt to:<br><br>auto a =3D make_fun(&std::string::c_str, h);<br>auto b =
=3D make_fun(&std::string::c_str, w);<br><br>But in the first case the =
library (again judging by the documentation) would claim 'a =3D=3D b' in th=
e first case but 'a !=3D b' in the second case.<br><br>Beyond that case, th=
e assumption that for a non-comparable type all instances are the same is c=
ompletely bogus:<br><br>struct S { void f(); void g(); };<br>auto a =3D mak=
e_fun(std::mem_fn(&S::f));<br>auto b =3D make_fun(std::mem_fn(&S::g=
));<br></div></div></blockquote><div><br></div></span><div>Any user defined=
functor (which mem_fn is) that does not specify an operator=3D=3D would no=
t have a specified equality as stated in the documentation. In light of you=
r example that breaks lambdas it may be that all function objects =
;would once again be treated the same. That is without operator=3D=3D the r=
esult of fun_ptr's equality is unspecified.</div><div> </div><blockquo=
te class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: =
1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-=
left-style: solid;"><span><div dir=3D"ltr"><div><br>And multiple other exam=
ples could be provided from stateful functors in C++03, probably less and l=
ess used now since we have lambdas.<br><br>I believe the false positives ar=
e a much worse problem than the false negatives as they violate the base pr=
inciples of value type that you provided.<br><br>Equality is complicated. D=
efining what the *value* of a generalized callable thing is hard.<br><br>&n=
bsp; David<br><br><br></div></div></span><div><br><div class=3D"gmai=
l_quote"><span>On Fri, May 29, 2015 at 1:58 AM, Patrice Roy <span dir=3D"lt=
r"><<a rel=3D"nofollow">patr...@gmail.com</a>></span> wrote:<br></spa=
n><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; pad=
ding-left: 1ex; border-left-color: rgb(204, 204, 204); border-left-width: 1=
px; border-left-style: solid;"><span><div dir=3D"ltr">First look is nice; I=
'll look at it in more detail soon to give more complete feedback. Thanks<b=
r></div></span><div><br><div class=3D"gmail_quote"><span>2015-05-28 11:39 G=
MT-04:00 Michael Boyko <span dir=3D"ltr"><<a rel=3D"nofollow">mboyk...@g=
mail.com</a>></span>:</span><div><div><br><blockquote class=3D"gmail_quo=
te" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-colo=
r: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;"><=
span><div dir=3D"ltr"><div>I have updated my proposal and code as discussed=
in this thread. I published the proposal and code on <a onmoused=
own=3D"this.href=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.codeproj=
ect.com%2FArticles%2F995916%2FA-Smart-Function-Pointer\46sa\75D\46sntz\0751=
\46usg\75AFQjCNHyE3q7drn9og-eU19FaDfU_gR2pA';return true;" onclick=3D"this.=
href=3D'http://www.google.com/url?q\75http%3A%2F%2Fwww.codeproject.com%2FAr=
ticles%2F995916%2FA-Smart-Function-Pointer\46sa\75D\46sntz\0751\46usg\75AFQ=
jCNHyE3q7drn9og-eU19FaDfU_gR2pA';return true;" href=3D"http://www.codeproje=
ct.com/Articles/995916/A-Smart-Function-Pointer" target=3D"_blank" rel=3D"n=
ofollow">code project</a> for anyone to review. The code has been test=
ed and bench marked (which can be seen on code project).</div></div></span>=
<div><div><span>
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.<br></span>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a rel=3D"nofollow">std-proposal...@isocpp.org</a>.<br>
To post to this group, send email to <a rel=3D"nofollow">std-pr...@isocpp.o=
rg</a>.<span><br>
Visit this group at <a onmousedown=3D"this.href=3D'http://groups.google.com=
/a/isocpp.org/group/std-proposals/';return true;" onclick=3D"this.href=3D'h=
ttp://groups.google.com/a/isocpp.org/group/std-proposals/';return true;" hr=
ef=3D"http://groups.google.com/a/isocpp.org/group/std-proposals/" target=3D=
"_blank" rel=3D"nofollow">http://groups.google.com/a/<wbr>isocpp.org/group/=
std-<wbr>proposals/</a>.<br>
</span></div></div></blockquote></div></div></div><br></div><div><div><span=
>
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.<br></span>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a rel=3D"nofollow">std-proposal...@isocpp.org</a>.<br>
To post to this group, send email to <a rel=3D"nofollow">std-pr...@isocpp.o=
rg</a>.<span><br>
Visit this group at <a onmousedown=3D"this.href=3D'http://groups.google.com=
/a/isocpp.org/group/std-proposals/';return true;" onclick=3D"this.href=3D'h=
ttp://groups.google.com/a/isocpp.org/group/std-proposals/';return true;" hr=
ef=3D"http://groups.google.com/a/isocpp.org/group/std-proposals/" target=3D=
"_blank" rel=3D"nofollow">http://groups.google.com/a/<wbr>isocpp.org/group/=
std-<wbr>proposals/</a>.<br>
</span></div></div></blockquote></div><br></div>
</blockquote></div><div><div>
<p></p>
-- <br>
<br>
--- <br>
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a onmousedown=3D"this.href=3D'javascript:';return true;" onclick=
=3D"this.href=3D'javascript:';return true;" href=3D"javascript:" target=3D"=
_blank" rel=3D"nofollow" gdf-obfuscated-mailto=3D"5Ru4sazQSgkJ">std-proposa=
l...@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a onmousedown=3D"this.href=3D'javascr=
ipt:';return true;" onclick=3D"this.href=3D'javascript:';return true;" href=
=3D"javascript:" target=3D"_blank" rel=3D"nofollow" gdf-obfuscated-mailto=
=3D"5Ru4sazQSgkJ">std-pr...@isocpp.org</a>.<br>
Visit this group at <a onmousedown=3D"this.href=3D'http://groups.google.com=
/a/isocpp.org/group/std-proposals/';return true;" onclick=3D"this.href=3D'h=
ttp://groups.google.com/a/isocpp.org/group/std-proposals/';return true;" hr=
ef=3D"http://groups.google.com/a/isocpp.org/group/std-proposals/" target=3D=
"_blank" rel=3D"nofollow">http://groups.google.com/a/<wbr>isocpp.org/group/=
std-<wbr>proposals/</a>.<br>
</div></div></blockquote></div><br></div></div>
</blockquote></div>
<p></p>
-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />
------=_Part_254_1336529685.1432918514650--
------=_Part_253_49144419.1432918514650--
.