Attn: Development Editor, Latest OCaml Weekly News
Alan Schmitt <[email protected]> Tue, 03 Mar 2026 14:54:42 +0100
| Newsgroups | gmane.comp.lang.caml.inria |
|---|---|
| Message-ID | <[email protected]> |
--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64
SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl
ZWsgb2YgRmVicnVhcnkgMjQgdG8NCk1hcmNoIDAzLCAyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50
cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN
Ckx3dC42LjEuMCwgTHd0X3BweC42LjEuMA0KT0NhbWwgUGxhdGZvcm0gTmV3c2xldHRlcjogTm92
ZW1iZXIgMjAyNSB0byBKYW51YXJ5IDIwMjYNCkFubm91bmNpbmcgdGhlIGZpcnN0IHJlbGVhc2Ug
b2YgQWxpY2UsIGEgcmFkaWNhbCBPQ2FtbCBidWlsZCBzeXN0ZW0NCm1uZXQsIGEgbmV3IFRDUC9J
UCBzdGFjayBmb3IgdW5pa2VybmVscyBpbiBPQ2FtbA0KRXhwZXJpbWVudDogZm9ybWF0LWxpbmUN
CkNhbWwgaW4gdGhlIENhcGl0YWwgLSBSZWdpc3RyYXRpb25zIE9wZW4hDQpFeHBlcmltZW50YWwg
dG9vbHMgZm9yIG1pZ3JhdGluZyBmcm9tIEx3dCB0byBFaW8NCkZpcnN0IGFscGhhIHJlbGVhc2Ug
b2YgT0NhbWwgNS41LjANCk5vdElucmlhQ2FtbF9TdGQuV2VudkAwLjEuMCAtIGNyZWF0ZSBXaW5k
b3dzIGVudnMgb24gbWFjT1MgW2RrMF0NClJ1bm5pbmcgUmVhbCBEb2NrZXIgQ29udGFpbmVycyBp
biBPQ2FtbCBUZXN0cw0KSSB3cm90ZSBhIERTTCBmb3IgQUkgcGVyc29uYWxpdGllcyBpbiBPQ2Ft
bA0KT3V0cmVhY2h5IE1heSAyMDI2DQpPbGQgQ1dODQoNCg0KTHd0LjYuMS4wLCBMd3RfcHB4LjYu
MS4wDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j
YW1sLm9yZy90L2Fubi1sd3QtNi0xLTAtbHd0LXBweC02LTEtMC8xNzc3MC8yPg0KDQoNCkNvbnRp
bnVpbmcgdGhpcyB0aHJlYWQsIFJhcGhhw6tsIFByb3VzdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEx3dC42LjEuMSBoYXMgYmVlbiByZWxlYXNlZC4gSXQg
Y29udGFpbnMgYSBmaXggdG8gc3VwcG9ydCBidWlsZCB3aXRoDQogIE9DYW1sLjUuNS4gVGhhbmtz
IHRvIEBraXQtdHkta2F0ZSBmb3IgdGhlIGNvbnRyaWJ1dGlvbi4NCg0KDQpPQ2FtbCBQbGF0Zm9y
bSBOZXdzbGV0dGVyOiBOb3ZlbWJlciAyMDI1IHRvIEphbnVhcnkgMjAyNg0K4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN
CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1wbGF0Zm9ybS1uZXdzbGV0dGVy
LW5vdmVtYmVyLTIwMjUtdG8tamFudWFyeS0yMDI2LzE3ODQ1LzE+DQoNCg0KU2FiaW5lIFNjaG1h
bHR6IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2VsY29tZSB0byB0aGUgc2V2
ZW50ZWVudGggZWRpdGlvbiBvZiB0aGUgT0NhbWwgUGxhdGZvcm0gbmV3c2xldHRlciENCg0KICBJ
biB0aGlzIE5vdmVtYmVyIDIwMjUgdG8gSmFudWFyeSAyMDI2IGVkaXRpb24sIHdlIGFyZSBleGNp
dGVkIHRvIGJyaW5nDQogIHlvdSB0aGUgbGF0ZXN0IG9uIHRoZSBPQ2FtbCBQbGF0Zm9ybSwgY29u
dGludWluZyBvdXIgdHJhZGl0aW9uIG9mDQogIGhpZ2hsaWdodGluZyByZWNlbnQgZGV2ZWxvcG1l
bnRzIGFzIHNlZW4gaW4gW3ByZXZpb3VzIGVkaXRpb25zXS4gVG8NCiAgdW5kZXJzdGFuZCB0aGUg
ZGlyZWN0aW9uIHdlJ3JlIGhlYWRlZCwgZXNwZWNpYWxseSByZWdhcmRpbmcNCiAgZGV2ZWxvcG1l
bnQgd29ya2Zsb3dzIGFuZCB1c2VyIGV4cGVyaWVuY2UgaW1wcm92ZW1lbnRzLCBjaGVjayBvdXQg
b3VyDQogIFtyb2FkbWFwXS4NCg0KICBZb3UgY2FuIFtzdWJzY3JpYmUgdG8gdGhpcyBuZXdzbGV0
dGVyIG9uIExpbmtlZEluXSENCg0KICAqSGlnaGxpZ2h0czoqDQoNCiAg4oCiICpvcGFtIDIuNS4w
IFJlbGVhc2VkKjogTWFqb3IgcmVsZWFzZSBmZWF0dXJpbmcgaW5jcmVtZW50YWwgb3BhbSBmaWxl
DQogICAgIGxvYWRpbmcgZm9yIHVwIHRvIDcwJSBmYXN0ZXIgYG9wYW0gdXBkYXRlJywgaW1wcm92
ZWQgc2hlbGwNCiAgICAgaW50ZWdyYXRpb24sIGFuZCBiZXR0ZXIgbWFjT1Mgc2FuZGJveCBzdXBw
b3J0DQogIOKAoiAqUmVsb2NhdGFibGUgT0NhbWwgTWVyZ2VkKjogVGhlIGZpbmFsIHBpZWNlIG9m
IHRoZSByZWxvY2F0YWJsZSBPQ2FtbA0KICAgICBwdXp6bGUgd2FzIG1lcmdlZCBpbiBEZWNlbWJl
ciwgZW5hYmxpbmcgb3BhbSB0byBjbG9uZSBzd2l0Y2hlcw0KICAgICBpbnN0ZWFkIG9mIHJlY29t
cGlsaW5nIHRoZW0uIFRoaXMgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIGZpcnN0DQogICAgIGFs
cGhhIHJlbGVhc2Ugb2YgT0NhbWwgNS41DQogIOKAoiAqRHVuZSAzLjIxLjAqOiBMYXJnZSByZWxl
YXNlIHdpdGggZG96ZW5zIG9mIGZpeGVzLCBpbXByb3ZlbWVudHMsIGFuZA0KICAgICBuZXcgZmVh
dHVyZXMgaW5jbHVkaW5nIE94Q2FtbCBjb21waWxlciBzdXBwb3J0IGFuZCBjb3B5LW9uLXdyaXRl
DQogICAgIGZpbGUgb3BlcmF0aW9ucw0KICDigKIgKkVuaGFuY2VkIEVkaXRvciBTdXBwb3J0Kjog
T0NhbWwtTFNQIDEuMjUuMCBhZGRzIGAubWx4JyBmaWxlIHN1cHBvcnQNCiAgICAgd2l0aCBmb3Jt
YXR0aW5nLCBkaWFnbm9zdGljcywgYW5kIGNvZGUgYWN0aW9ucywgcGx1cyBuZXcgY3VzdG9tDQog
ICAgIHJlcXVlc3RzDQogIOKAoiAqTWVybGluIDUuNi4xLTUwNCo6IFBlcmZvcm1hbmNlIG9wdGlt
aXphdGlvbnMsIHNtYXJ0ZXIgc2lnbmF0dXJlDQogICAgIGhlbHAsIGFuZCBmaXhlZCBjb21wbGV0
aW9uIGZvciBpbmxpbmVkIHJlY29yZCBsYWJlbHMNCiAg4oCiICpvcGFtLXB1Ymxpc2ggMi43LjEq
OiBGaXhlcyBmb3IgR2l0SHViIEFQSSB0b2tlbiBwZXJtaXNzaW9ucw0KICDigKIgKmR1bmUtcmVs
ZWFzZSAyLjIuMCo6IEZ1bGwgY29tcGF0aWJpbGl0eSB3aXRoIGNtZGxpbmVyIDIuMC4wDQogIOKA
oiAqb3BhbS1yZXBvc2l0b3J5IEFyY2hpdmFsKjogSmFudWFyeSAxLCAyMDI2IGFyY2hpdmFsIHJ1
biByZW1vdmVkDQogICAgIDMsMjY0IHBhY2thZ2UgdmVyc2lvbnMgdG8gbWFpbnRhaW4gcmVwb3Np
dG9yeSBzdXN0YWluYWJpbGl0eQ0KDQogICpCYWNrc3RhZ2UgT0NhbWw6Kg0KDQogIOKAoiBbT0Nh
bWwgSW5mcmFzdHJ1Y3R1cmU6IEhvdyB0aGUgb3BhbS1yZXBvc2l0b3J5IFdvcmtzXSAoTm92IDUs
IDIwMjUpDQoNCiAgKlN0YWJsZSBSZWxlYXNlczoqDQoNCiAg4oCiIFtvcGFtLXB1Ymxpc2ggMi43
LjFdIChOb3YgMTgsIDIwMjUpDQogIOKAoiBbb3BhbSAyLjUuMF0gKE5vdiAyNywgMjAyNSkNCiAg
4oCiIFtNZXJsaW4gNS42LjEtNTA0XSAoRGVjIDIwLCAyMDI1KQ0KICDigKIgW09DYW1sLUxTUCAx
LjI1LjBdIChEZWMgMjAsIDIwMjUpDQogIOKAoiBbRHVuZSAzLjIxLjBdIChKYW4gMTYsIDIwMjYp
DQogIOKAoiBbZHVuZS1yZWxlYXNlIDIuMi4wXSAoSmFuIDI5LCAyMDI2KQ0KDQogICpVbnN0YWJs
ZSBSZWxlYXNlczoqDQoNCiAg4oCiIFtvcGFtIDIuNS4wfnJjMV0gKE5vdiAyMCwgMjAyNSkNCiAg
4oCiIFtvcGFtIDIuNS4wfmJldGExXSAoTm92IDEwLCAyMDI1KQ0KDQoNCltwcmV2aW91cyBlZGl0
aW9uc10gPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdGFnL3BsYXRmb3JtLW5ld3NsZXR0ZXI+
DQoNCltyb2FkbWFwXSA8aHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9wbGF0Zm9ybS1yb2FkbWFwPg0K
DQpbc3Vic2NyaWJlIHRvIHRoaXMgbmV3c2xldHRlciBvbiBMaW5rZWRJbl0NCjxodHRwczovL3d3
dy5saW5rZWRpbi5jb20vbmV3c2xldHRlcnMvb2NhbWwtcGxhdGZvcm0tbmV3c2xldHRlci03MzA1
MjcwNjk0NTY3NjYxNTY4Lz4NCg0KW09DYW1sIEluZnJhc3RydWN0dXJlOiBIb3cgdGhlIG9wYW0t
cmVwb3NpdG9yeSBXb3Jrc10NCjxodHRwczovL29jYW1sLm9yZy9iYWNrc3RhZ2UvMjAyNS0xMS0w
NS1ob3ctdGhlLW9wYW0tcmVwb3NpdG9yeS13b3Jrcz4NCg0KW29wYW0tcHVibGlzaCAyLjcuMV0N
CjxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMS0xOC1vcGFtLXB1Ymxpc2gtMi43
LjE+DQoNCltvcGFtIDIuNS4wXSA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjUtMTEt
Mjctb3BhbS0yLjUuMD4NCg0KW01lcmxpbiA1LjYuMS01MDRdDQo8aHR0cHM6Ly9vY2FtbC5vcmcv
Y2hhbmdlbG9nLzIwMjUtMTItMjAtbWVybGluLXY1LTYtMS01MDQ+DQoNCltPQ2FtbC1MU1AgMS4y
NS4wXQ0KPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI1LTEyLTIwLW9jYW1sLWxzcC0x
LTI1LTA+DQoNCltEdW5lIDMuMjEuMF0gPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI2
LTAxLTE2LWR1bmUtMy0yMS0wPg0KDQpbZHVuZS1yZWxlYXNlIDIuMi4wXQ0KPGh0dHBzOi8vb2Nh
bWwub3JnL2NoYW5nZWxvZy9kdW5lLXJlbGVhc2UvMjAyNi0wMS0yOS1kdW5lLXJlbGVhc2UtMi4y
LjA+DQoNCltvcGFtIDIuNS4wfnJjMV0gPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI1
LTExLTIwLW9wYW0tMi01LTAtcmMxPg0KDQpbb3BhbSAyLjUuMH5iZXRhMV0NCjxodHRwczovL29j
YW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMS0xMC1vcGFtLTItNS0wLWJldGExPg0KDQpPQ2FtbCBD
b21waWxlcg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCuKX
iiBSZWxvY2F0YWJsZSBPQ2FtbCBNZXJnZWQNCg0KICBJbiBEZWNlbWJlciAyMDI1LCB0aGUgZmlu
YWwgcGllY2Ugb2YgdGhlIFtSZWxvY2F0YWJsZSBPQ2FtbF0gcHV6emxlDQogIHdhcyBtZXJnZWQs
IGVuYWJsaW5nIG9wYW0gdG8gY2xvbmUgc3dpdGNoZXMgaW5zdGVhZCBvZiByZWNvbXBpbGluZw0K
ICB0aGVtLiBUaGlzIGZlYXR1cmUgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIGZpcnN0IGFscGhh
IHJlbGVhc2Ugb2YNCiAgT0NhbWwgNS41Lg0KDQogICpXaGF0IFJlbG9jYXRhYmxlIE9DYW1sIEVu
YWJsZXM6Kg0KDQogIFRoaXMgZmVhdHVyZSBhbGxvd3MgdGhlIE9DYW1sIGNvbXBpbGVyIGFuZCBp
dHMgYXNzb2NpYXRlZCB0b29scyB0byBiZQ0KICBtb3ZlZCB0byBkaWZmZXJlbnQgZmlsZXN5c3Rl
bSBsb2NhdGlvbnMgYWZ0ZXIgaW5zdGFsbGF0aW9uIHdpdGhvdXQNCiAgYnJlYWtpbmcgZnVuY3Rp
b25hbGl0eS4gS2V5IGJlbmVmaXRzIGluY2x1ZGU6DQoNCiAg4oCiIEJpbmFyeSBkaXN0cmlidXRp
b25zIHRoYXQgd29yayByZWdhcmRsZXNzIG9mIGluc3RhbGxhdGlvbiBwYXRoDQogIOKAoiBJbXBy
b3ZlZCBmbGV4aWJpbGl0eSBmb3IgcGFja2FnZSBtYW5hZ2VycyBvcmdhbml6aW5nIE9DYW1sDQog
ICAgaW5zdGFsbGF0aW9ucw0KICDigKIgQnVuZGxpbmcgb2Ygc3BlY2lmaWMgT0NhbWwgdmVyc2lv
bnMgYnkgZGV2ZWxvcGVyIHRvb2xzIHdpdGhvdXQgcGF0aA0KICAgIGNvbmZsaWN0cw0KICDigKIg
U2ltcGxpZmllZCBjcm9zcy1wbGF0Zm9ybSBkaXN0cmlidXRpb24NCg0KICBUaGUgaW1wbGVtZW50
YXRpb24gaXMgdGhlIGN1bG1pbmF0aW9uIG9mIHdvcmsgYnkgRGF2aWQgQWxsc29wcCwgd2l0aA0K
ICByZXZpZXcgZnJvbSBTYW11ZWwgSHltLCBKb25haCBCZWNrZm9yZCwgYW5kIG90aGVycy4gU2Vl
IHRoZQ0KICBbYW5ub3VuY2VtZW50IG9uIERpc2N1c3NdIGFuZCB0aGUgW21lcmdlZCBQUnNdIChb
IzE0MjQ0XSwgWyMxNDI0NV0sDQogIFsjMTQyNDZdLCBbIzE0MjQ3XSkgZm9yIHRlY2huaWNhbCBk
ZXRhaWxzLg0KDQoNCiAgW1JlbG9jYXRhYmxlIE9DYW1sXQ0KICA8aHR0cHM6Ly93d3cuZHJhMjcu
dWsvYmxvZy9wbGF0Zm9ybS8yMDI1LzEyLzE3L2l0cy1tZXJnZWQuaHRtbD4NCg0KICBbYW5ub3Vu
Y2VtZW50IG9uIERpc2N1c3NdDQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcmVsb2Nh
dGFibGUtb2NhbWwvMTcyNTM+DQoNCiAgW21lcmdlZCBQUnNdIDxodHRwczovL2dpdGh1Yi5jb20v
b2NhbWwvb2NhbWwvcHVsbC8xNDI0Mz4NCg0KICBbIzE0MjQ0XSA8aHR0cHM6Ly9naXRodWIuY29t
L29jYW1sL29jYW1sL3B1bGwvMTQyNDQ+DQoNCiAgWyMxNDI0NV0gPGh0dHBzOi8vZ2l0aHViLmNv
bS9vY2FtbC9vY2FtbC9wdWxsLzE0MjQ1Pg0KDQogIFsjMTQyNDZdIDxodHRwczovL2dpdGh1Yi5j
b20vb2NhbWwvb2NhbWwvcHVsbC8xNDI0Nj4NCg0KICBbIzE0MjQ3XSA8aHR0cHM6Ly9naXRodWIu
Y29tL29jYW1sL29jYW1sL3B1bGwvMTQyNDc+DQoNCg0KQnVpbGQgU3lzdGVtDQrilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K4peKIER1bmUNCg0KICBbRHVuZSAzLjIxLjBd
IChKYW51YXJ5IDE2LCAyMDI2KSBpcyBhIGxhcmdlIHJlbGVhc2UgaW5jbHVkaW5nIGRvemVucw0K
ICBvZiBmaXhlcywgaW1wcm92ZW1lbnRzLCBhbmQgYWRkaXRpb25zIGZyb20gbWFueSBjb250cmli
dXRvcnMuDQoNCiAgKk5vdGFibGUgQWRkaXRpb25zOioNCg0KICDigKIgKEV4cGVyaW1lbnRhbCk6
IGBsaWJyYXJ5X3BhcmFtZXRlcicgc3RhbnphIGZvciB0aGUgT3hDYW1sIGNvbXBpbGVyDQogIOKA
oiBDb3B5LW9uLXdyaXRlIChDT1cpIHdoZW4gY29weWluZyBmaWxlcyBvbiBzdXBwb3J0aW5nIGZp
bGVzeXN0ZW1zDQogICAgKEJ0cmZzLCBaRlMsIFhGUykgdW5kZXIgTGludXgNCiAg4oCiIFN1cHBv
cnQgZm9yIFRhbmdsZWQgQVRwcm90by1iYXNlZCBjb2RlIHJlcG9zaXRvcmllcw0KICDigKIgTmV3
IGAoZGlyIC4uKScgZmllbGQgb24gcGFja2FnZXMgdG8gZmlsdGVyIHN0YW56YXMgd2l0aA0KICAg
IGAtLW9ubHktcGFja2FnZXMnDQogIOKAoiBgZHVuZSBwcm9tb3Rpb24gc2hvdycgY29tbWFuZCB0
byBwcmV2aWV3IGNvcnJlY3RlZCBmaWxlcw0KICDigKIgTmV3IGAobGFuZyByb2NxKScgYnVpbGQg
bW9kZSBmb3IgUm9jcSA5LjAgYW5kIGxhdGVyDQogIOKAoiBTdXBwb3J0IGZvciBpbnN0YW50aWF0
aW5nIE94Q2FtbCBwYXJhbWV0ZXJpc2VkIGxpYnJhcmllcw0KICDigKIgYGR1bmUgZGVzY3JpYmUg
dGVzdHMnIHRvIGxpc3QgdGVzdHMgaW4gdGhlIHdvcmtzcGFjZQ0KICDigKIgSG9yaXpvbnRhbCBz
Y3JvbGxpbmcgaW4gVFVJDQogIOKAoiBTdXBwb3J0IGZvciBleHBhbmRpbmcgdmFyaWFibGVzIGlu
IGAocHJvbW90ZSAoaW50byAuLikpJw0KDQogICpOb3RhYmxlIEZpeGVzOioNCg0KICDigKIgRml4
ZWQgYGluY2x1ZGVfc3ViZGlycyBxdWFsaWZpZWQnIHBpY2tpbmcgdGhlIGZ1cnRoZXN0IG1vZHVs
ZQ0KICAgIGluc3RlYWQgb2YgdGhlIGNsb3Nlc3QNCiAg4oCiIEltcHJvdmVkIGVycm9yIG1lc3Nh
Z2VzIGZvciBpbnZhbGlkIHZlcnNpb24gZm9ybWF0cyB3aXRoIG5vbi1BU0NJSQ0KICAgIGNoYXJh
Y3RlcnMNCiAg4oCiIEZpeGVkIGNyYXNoIHdoZW4gcnVubmluZyBgZHVuZSBidWlsZCBAY2hlY2sn
IG9uIGxpYnJhcmllcyB3aXRoDQogICAgdmlydHVhbCBtb2R1bGVzDQogIOKAoiBBbGxvdyBgJCBk
dW5lIGluaXQnIHRvIHdvcmsgb24gYWJzb2x1dGUgcGF0aHMNCiAg4oCiIFN0b3AgaGlkaW5nIHRo
ZSBgcm9vdF9tb2R1bGUnIGZyb20gdGhlIGluY2x1ZGUgcGF0aA0KDQogIEZvciB0aGUgY29tcGxl
dGUgbGlzdCBvZiBjaGFuZ2VzLCBzZWUgdGhlIFtmdWxsIHJlbGVhc2Ugb24gR2l0SHViXS4NCg0K
ICAqRHVuZSBNYWludGFpbmVkIGJ5KjogUnVkaSBHcmluYmVyZyAoQHJncmluYmVyZywgSmFuZSBT
dHJlZXQpLCBOaWNvbMOhcw0KICAgT2plZGEgQsOkciAoQG5vamIsIExleGlGaSksIE1hcmVrIEt1
YmljYSAoQExlb25pZGFzLWZyb20tWElWLA0KICAgVGFyaWRlcyksIEFsaSBDYWdsYXlhbiAoQEFs
aXp0ZXIsIFRhcmlkZXMpLCBTdGVwaGVuIFNoZXJyYXR0DQogICAoQGdyaWRidWdzLCBUYXJpZGVz
KSwgQW50b25pbyBOdW5vIE1vbnRlaXJvIChAYW5tb250ZWlybyksIFN1ZGhhDQogICBQYXJpbWFs
YSAoQFN1ZGhhMjQ3LCBUYXJpZGVzKSwgQW1icmUgU3VoYW15IChARWxlY3RyZUFBUywgVGFyaWRl
cyksDQogICBQdW5lZXRoIENoYWdhbnRpIChAcHVuY2hhZ2FuLCBUYXJpZGVzKQ0KDQoNCiAgW0R1
bmUgMy4yMS4wXSA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjYtMDEtMTYtZHVuZS0z
LTIxLTA+DQoNCiAgW2Z1bGwgcmVsZWFzZSBvbiBHaXRIdWJdDQogIDxodHRwczovL2dpdGh1Yi5j
b20vb2NhbWwvZHVuZS9yZWxlYXNlcy90YWcvMy4yMS4wPg0KDQoNClBhY2thZ2UgTWFuYWdlbWVu
dA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
DQoNCuKXiiBvcGFtDQoNCiAgW29wYW0gMi41LjBdIChOb3ZlbWJlciAyNywgMjAyNSkgaXMgYSBt
YWpvciByZWxlYXNlIHdpdGggc2lnbmlmaWNhbnQNCiAgcGVyZm9ybWFuY2UgYW5kIHVzYWJpbGl0
eSBpbXByb3ZlbWVudHMuDQoNCiAgKktleSBGZWF0dXJlczoqDQoNCiAg4oCiICpNYXNzaXZlIHNw
ZWVkdXAgZm9yIGBvcGFtIHVwZGF0ZScqOiBUaGFua3MgdG8gQGFyb3pvdnlrLCBvcGFtDQogICAg
IHVwZGF0ZSBub3cgbG9hZHMgb3BhbSBmaWxlcyBpbmNyZW1lbnRhbGx5LCBvbmx5IHBhcnNpbmcg
ZmlsZXMgdGhhdA0KICAgICBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdXBkYXRlLiBGb3Ig
dHlwaWNhbCBzbWFsbCBkaWZmcywgdGhpcw0KICAgICBtZWFucyBvcGVyYXRpb25zIHRoYXQgdG9v
ayBzZWNvbmRzIG5vdyBjb21wbGV0ZSBpbiBtaWxsaXNlY29uZHMNCiAg4oCiICpJbXByb3ZlZCBz
aGVsbCBpbnRlZ3JhdGlvbio6IEZpeGVkIGlzc3VlcyB3aGVyZSBwYXJ0cyBvZiBhIHByZXZpb3Vz
DQogICAgIGVudmlyb25tZW50IHdlcmUga2VwdCBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCwg
Y2F1c2luZyB2YXJpb3VzDQogICAgIHByb2JsZW1zDQogIOKAoiAqQ2hhbmdlZCBkZWZhdWx0IHNo
ZWxsIGludGVncmF0aW9uIGZpbGUqOiBOb3cgd3JpdGVzIHRvIGAuYmFzaHJjJw0KICAgICBpbnN0
ZWFkIG9mIGAucHJvZmlsZScgd2hlbiBiYXNoIGlzIGRldGVjdGVkLCBwcmV2ZW50aW5nIGluZmlu
aXRlDQogICAgIGxvb3AgaXNzdWVzDQogIOKAoiAqQXBwQXJtb3IgcHJvZmlsZSo6IFRoZSBpbnN0
YWxsIHNjcmlwdCBub3cgaW5zdGFsbHMgYW4gYXBwcm9wcmlhdGUNCiAgICAgYXBwYXJtb3IgcHJv
ZmlsZSBvbiBzeXN0ZW1zIGNvbmZpZ3VyZWQgd2l0aCBhcHBhcm1vciAoZW5hYmxlZCBieQ0KICAg
ICBkZWZhdWx0IG9uIFVidW50dSkNCiAg4oCiICptYWNPUyBzYW5kYm94IGltcHJvdmVtZW50cyo6
IEFsbG93IHdyaXRpbmcgdG8gYC92YXIvZm9sZGVycy8nIGFuZA0KICAgICBgL3Zhci9kYi9tZHMv
JyBkaXJlY3RvcmllcyBhcyByZXF1aXJlZCBieSBzb21lIG1hY09TIGNvcmUgdG9vbHMNCg0KICAq
QnVpbGQgQ2hhbmdlczoqDQoNCiAg4oCiICpFY29zeXN0ZW0gY21kbGluZXIgMi4wLjAgY29tcGF0
aWJpbGl0eSo6IG9wYW0gbm8gbG9uZ2VyIGRlcGVuZHMgb24NCiAgICAgYGNtZGxpbmVyJywgcmVt
b3ZpbmcgYSBrZXkgYmxvY2tlciB0aGF0IHByZXZlbnRlZCBjbWRsaW5lciAxLnggYW5kDQogICAg
IDIuMC4wIGZyb20gYmVpbmcgY28taW5zdGFsbGFibGUuIFRoaXMgY2hhbmdlIGVuYWJsZXMgZWNv
c3lzdGVtLXdpZGUNCiAgICAgbWlncmF0aW9uIHRvIGNtZGxpbmVyIDIuMC4wDQogIOKAoiBPQ2Ft
bCA1LjUgKHRydW5rKSBzdXBwb3J0IHdoZW4gdXNpbmcgZHVuZSdzIGRldiBwcm9maWxlDQogIOKA
oiBUaGUgcmVsZWFzZSBhcmNoaXZlIChgb3BhbS1mdWxsLSoudGFyLmd6JykgaXMgbm93IHJlcHJv
ZHVjaWJsZQ0KICDigKIgT3BlbkJTRCBiaW5hcnkgaXMgbm93IGEgZnVsbCBzdGF0aWMgYmluYXJ5
DQoNCiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbb2ZmaWNpYWwgb3BhbSAyLjUuMCBhbm5v
dW5jZW1lbnQgYmxvZ10gYW5kDQogIFtmdWxsIHJlbGVhc2Ugbm90ZXMgb24gR2l0SHViXS4NCg0K
ICAqb3BhbSBNYWludGFpbmVkIGJ5KjogUmFqYSBCb3VqYmVsIChAcmpib3UsIE9DYW1sUHJvKSwg
S2F0ZSBEZXBsYWl4DQogICAoQGtpdC10eS1rYXRlLCBBaHJlZnMpLCBEYXZpZCBBbGxzb3BwIChA
ZHJhMjcsIFRhcmlkZXMpDQoNCg0KICBbb3BhbSAyLjUuMF0gPGh0dHBzOi8vb2NhbWwub3JnL2No
YW5nZWxvZy8yMDI1LTExLTI3LW9wYW0tMi41LjA+DQoNCiAgW29mZmljaWFsIG9wYW0gMi41LjAg
YW5ub3VuY2VtZW50IGJsb2ddDQogIDxodHRwczovL29wYW0ub2NhbWwub3JnL2Jsb2cvb3BhbS0y
LTUtMC8+DQoNCiAgW2Z1bGwgcmVsZWFzZSBub3RlcyBvbiBHaXRIdWJdDQogIDxodHRwczovL2dp
dGh1Yi5jb20vb2NhbWwvb3BhbS9yZWxlYXNlcy90YWcvMi41LjA+DQoNCg0K4peKIG9wYW0tcHVi
bGlzaA0KDQogIFtvcGFtLXB1Ymxpc2ggMi43LjFdIChOb3ZlbWJlciAxOCwgMjAyNSkgZml4ZXMg
YnVncyByZWxhdGVkIHRvIHRoZQ0KICBHaXRIdWIgQVBJIHRva2VuIHBlcm1pc3Npb25zIGludHJv
ZHVjZWQgaW4gdmVyc2lvbiAyLjcuMC4NCg0KICAqQ2hhbmdlczoqDQoNCiAg4oCiIEFkdmVydGlz
ZSB0aGUgbmVlZCwgYW5kIGNoZWNrLCBmb3IgdGhlIGB3b3JrZmxvdycgc2NvcGUgZm9yIEdpdEh1
Yg0KICAgIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnMNCiAg4oCiIEVuZm9yY2UgdGhlIGdpdCByZW1v
dGUgdXNlZCB0byBwdXNoIGJyYW5jaGVzIHRvIHVzZXJzJyBmb3JrIHRvIGJlDQogICAgdXNlZCBp
bnN0ZWFkIG9mIHRoZSBTU0ggbWV0aG9kDQogIOKAoiBBdm9pZCBwb3RlbnRpYWwgcHJldmlvdXNs
eSB1c2VkIHRva2VucyB3aXRoIHdyb25nIHBlcm1pc3Npb25zIHRvIGJlDQogICAgdXNlZCBpbnN0
ZWFkIG9mIHRoZSBuZXcgb25lDQogIOKAoiBBZGQgc3VwcG9ydCBmb3IgdGhlIG9wYW0gMi41IEFQ
SQ0KDQogICpNYWludGFpbmVkIGJ5KjogUmFqYSBCb3VqYmVsIChAcmpib3UsIE9DYW1sUHJvKSwg
S2F0ZSBEZXBsYWl4DQogICAoQGtpdC10eS1rYXRlLCBBaHJlZnMpDQoNCg0KICBbb3BhbS1wdWJs
aXNoIDIuNy4xXQ0KICA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjUtMTEtMTgtb3Bh
bS1wdWJsaXNoLTIuNy4xPg0KDQoNCuKXiiBvcGFtLXJlcG9zaXRvcnkgQXJjaGl2YWw6IEphbnVh
cnkgMSwgMjAyNg0KDQogIE9uIEphbnVhcnkgMSwgMjAyNiwgdGhlIG9wYW0tcmVwb3NpdG9yeSBj
b21wbGV0ZWQgaXRzIHNjaGVkdWxlZA0KICBhcmNoaXZhbCBydW4sIHJlbW92aW5nICozLDI2NCBw
YWNrYWdlIHZlcnNpb25zKiAoODgxIHVuaXF1ZSBwYWNrYWdlcykNCiAgbWFya2VkIHdpdGggYHgt
bWFpbnRlbmFuY2UtaW50ZW50OiBhcmNoaXZhbCcuIFRoaXMgb25nb2luZyBtYWludGVuYW5jZQ0K
ICBwcm9jZXNzIGhlbHBzIGtlZXAgdGhlIHJlcG9zaXRvcnkgbWFuYWdlYWJsZSBieSByZW1vdmlu
ZyB1bm1haW50YWluZWQNCiAgb3Igb2Jzb2xldGUgcGFja2FnZSB2ZXJzaW9ucy4NCg0KICAqV2hh
dCBUaGlzIE1lYW5zOioNCg0KICDigKIgQXJjaGl2ZWQgcGFja2FnZXMgYXJlIG5vIGxvbmdlciBh
dmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgb3BhbQ0KICAgIHJlcG9zaXRvcnkNCiAg4oCiIENJIHN5
c3RlbXMgYW5kIGxvY2sgZmlsZXMgbWF5IG5lZWQgdXBkYXRlcyBpZiB0aGV5IGRlcGVuZCBvbg0K
ICAgIGFyY2hpdmVkIHZlcnNpb25zDQogIOKAoiBUaGUgYXJjaGl2YWwgaXMgYmFzZWQgb24gbWV0
YWRhdGEgZXhwbGljaXRseSBzZXQgYnkgcGFja2FnZQ0KICAgIG1haW50YWluZXJzDQoNCiAgKkJh
Y2tncm91bmQ6Kg0KDQogIFRoZSBhcmNoaXZhbCBwcm9jZXNzIHdhcyBhbm5vdW5jZWQgYnkgSGFu
bmVzIE1laG5lcnQgaW4gRGVjZW1iZXIgMjAyNQ0KICAoc2VlIHRoZSBbRGlzY3VzcyBhbm5vdW5j
ZW1lbnRdKSwgZ2l2aW5nIHBhY2thZ2UgbWFpbnRhaW5lcnMgYW5kIHVzZXJzDQogIHRpbWUgdG8g
cHJlcGFyZS4gUGFja2FnZXMgY2FuIGJlIHJlc3RvcmVkIGZyb20gYXJjaGl2YWwgYnkgbWFpbnRh
aW5lcnMNCiAgdXBvbiByZXF1ZXN0Lg0KDQogIFRoaXMgbWFpbnRlbmFuY2UgcHJhY3RpY2UgZW5z
dXJlcyB0aGUgb3BhbSByZXBvc2l0b3J5IHJlbWFpbnMNCiAgc3VzdGFpbmFibGUgYW5kIGZvY3Vz
ZWQgb24gYWN0aXZlbHkgbWFpbnRhaW5lZCBwYWNrYWdlcy4NCg0KDQogIFtEaXNjdXNzIGFubm91
bmNlbWVudF0NCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vcGFtLXJlcG9zaXRvcnkt
YXJjaGl2YWwtbmV4dC1ydW4tc2NoZWR1bGVkLTIwMjYtMDEtMDEvMTc1ODc+DQoNCg0K4peKIGR1
bmUtcmVsZWFzZQ0KDQogIFtkdW5lLXJlbGVhc2UgMi4yLjBdIChKYW51YXJ5IDI5LCAyMDI2KSBi
cmluZ3MgZnVsbCBjb21wYXRpYmlsaXR5IHdpdGgNCiAgY21kbGluZXIgMi4wLjAsIGNvbnRpbnVp
bmcgdGhlIGVjb3N5c3RlbS13aWRlIG1pZ3JhdGlvbiB0aGF0IGJlZ2FuDQogIHdpdGggb3BhbSAy
LjUuMCdzIHJlbW92YWwgb2YgdGhlIGNtZGxpbmVyIGRlcGVuZGVuY3kuDQoNCiAgKldoeSBUaGlz
IE1hdHRlcnM6Kg0KDQogIGNtZGxpbmVyIDIuMC4wIGludHJvZHVjZWQgc3RyaWN0ZXIgcmVxdWly
ZW1lbnRzIHRoYXQgaW1wcm92ZSBDTEkNCiAgcmVsaWFiaWxpdHkgYnV0IHByZXZlbnQgY28taW5z
dGFsbGFiaWxpdHkgd2l0aCBjbWRsaW5lciAxLnguIEZvbGxvd2luZw0KICBvcGFtIDIuNS4wJ3Mg
bGVhZCBpbiByZW1vdmluZyB0aGlzIGNvbmZsaWN0LCBkdW5lLXJlbGVhc2UgMi4yLjANCiAgdXBk
YXRlcyB0byB1c2UgY21kbGluZXIgMi4wLjAgZXhjbHVzaXZlbHkuIFRoaXMgY29vcmRpbmF0ZWQg
ZWZmb3J0DQogIGFjcm9zcyB0aGUgcGxhdGZvcm0gdG9vbHMgZW5hYmxlcyB1c2VycyB0byB1cGdy
YWRlIHdpdGhvdXQNCiAgZW5jb3VudGVyaW5nIGRlcGVuZGVuY3kgY29uZmxpY3RzLg0KDQogICpJ
bXBvcnRhbnQgQ2hhbmdlczoqDQoNCiAg4oCiICpCcmVha2luZyo6IEZvbGxvd2luZyBjbWRsaW5l
ciAyLjAncyBzdHJpY3RlciByZXF1aXJlbWVudHMsDQogICAgIHByZWZpeC1tYXRjaGluZyBmb3Ig
Y29tbWFuZCBvcHRpb25zIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQNCiAg4oCiIFVzZXJzIG11c3Qg
bm93IHByb3ZpZGUgdGhlIGZ1bGwgd29yZGluZyBmb3IgYWxsIGZsYWdzIChmb3IgZXhhbXBsZSwN
CiAgICBgLS1za2lwLXRlc3RzJyBpbnN0ZWFkIG9mIGAtLXNraXAtdGVzdCcpDQogIOKAoiBUaGlz
IGNoYW5nZSBlbnN1cmVzIGNvbXBhdGliaWxpdHkgd2l0aCBjbWRsaW5lciAyLjAuMCBhbmQgYWxp
Z25zDQogICAgd2l0aCBtb2Rlcm4gQ0xJIGJlc3QgcHJhY3RpY2VzDQogIOKAoiBJZiB5b3UgaGF2
ZSBhdXRvbWF0aW9uIHNjcmlwdHMgdXNpbmcgc2hvcnRlbmVkIGZsYWdzLCB1cGRhdGUgdGhlbQ0K
ICAgIGJlZm9yZSB1cGdyYWRpbmcNCg0KICBGb3IgdGVjaG5pY2FsIGRldGFpbHMsIHNlZSB0aGUg
W2NtZGxpbmVyIDIuMC4wIGRvY3VtZW50YXRpb25dIGFuZCB0aGUNCiAgW2R1bmUtcmVsZWFzZSBQ
UiAjNTEyXS4NCg0KICAqTWFpbnRhaW5lZCBieSo6IFRhcmlkZXMNCg0KDQogIFtkdW5lLXJlbGVh
c2UgMi4yLjBdDQogIDxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvZHVuZS1yZWxlYXNlLzIw
MjYtMDEtMjktZHVuZS1yZWxlYXNlLTIuMi4wPg0KDQogIFtjbWRsaW5lciAyLjAuMCBkb2N1bWVu
dGF0aW9uXQ0KICA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvY21kbGluZXIvZG9jL0Nt
ZGxpbmVyPg0KDQogIFtkdW5lLXJlbGVhc2UgUFIgIzUxMl0NCiAgPGh0dHBzOi8vZ2l0aHViLmNv
bS90YXJpZGVzL2R1bmUtcmVsZWFzZS9wdWxsLzUxMj4NCg0KDQpFZGl0b3IgVG9vbHMNCuKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogICpSb2FkbWFwOiBbRWRpdCAvIChX
MTkpIE5hdmlnYXRlIENvZGVdKg0KDQoNCltFZGl0IC8gKFcxOSkgTmF2aWdhdGUgQ29kZV0NCjxo
dHRwczovL29jYW1sLm9yZy90b29scy9wbGF0Zm9ybS1yb2FkbWFwI3cxOS1uYXZpZ2F0ZS1jb2Rl
Pg0KDQril4ogT0NhbWwtTFNQIFNlcnZlcg0KDQogIFtPQ2FtbC1MU1AgMS4yNS4wXSAoRGVjZW1i
ZXIgMjAsIDIwMjUpIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgYC5tbHgnDQogIGZpbGVzIGFuZCBu
ZXcgY3VzdG9tIHJlcXVlc3RzLg0KDQogICpGZWF0dXJlczoqDQoNCiAg4oCiICpgLm1seCcgU3Vw
cG9ydCo6IEFkZGVkIHN1cHBvcnQgZm9yIGAubWx4JyBmaWxlcywgaW5jbHVkaW5nDQogICAgIGRp
YWdub3N0aWNzLCBjb2RlIGFjdGlvbnMsIGhvdmVyLCBhbmQgZm9ybWF0dGluZyB2aWENCiAgICAg
YG9jYW1sZm9ybWF0LW1seCcNCiAg4oCiICpOZXcgQ3VzdG9tIFJlcXVlc3RzKjogQWRkZWQgYHR5
cGVFeHByZXNzaW9uJywgYGxvY2F0ZScsIGFuZA0KICAgICBgcGhyYXNlJyByZXF1ZXN0cyB0byB0
aGUgc2VydmVyDQogIOKAoiAqQ29kZS1MZW5zIENvbmZpZ3VyYXRpb24qOiBDb2RlLWxlbnMgZm9y
IG5lc3RlZCBgbGV0JyBiaW5kaW5ncyBpcw0KICAgICBub3cgY29uZmlndXJhYmxlDQoNCiAgKkZp
eGVzOioNCg0KICDigKIgVGhlIHNlcnZlciBub3cgZmFsbHMgYmFjayB0byBgLm1lcmxpbicgY29u
ZmlndXJhdGlvbiBpZiBhDQogICAgYGR1bmUtcHJvamVjdCcgZmlsZSBpcyBtaXNzaW5nLCBwcm92
aWRlZCBbZG90LW1lcmxpbi1yZWFkZXJdIGlzDQogICAgaW5zdGFsbGVkDQogIOKAoiBJbXByb3Zl
ZCBwcmVjaXNpb24gb2YgdGltZXN0YW1wcyBmb3IgY29sbGVjdGVkIG1ldHJpY3MNCg0KDQogIFtP
Q2FtbC1MU1AgMS4yNS4wXQ0KICA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjUtMTIt
MjAtb2NhbWwtbHNwLTEtMjUtMD4NCg0KICBbZG90LW1lcmxpbi1yZWFkZXJdIDxodHRwczovL2dp
dGh1Yi5jb20vb2NhbWwvbWVybGluPg0KDQoNCuKXiiBNZXJsaW4NCg0KICBbTWVybGluIDUuNi4x
LTUwNF0gKERlY2VtYmVyIDIwLCAyMDI1KSBicmluZ3MgcGVyZm9ybWFuY2UNCiAgb3B0aW1pemF0
aW9ucyBhbmQgaW1wcm92ZWQgc3RhYmlsaXR5Lg0KDQogICpLZXkgSW1wcm92ZW1lbnRzOioNCg0K
ICDigKIgKlNtYXJ0ZXIgU2lnbmF0dXJlIEhlbHAqOiBOb3cgdHJpZ2dlcnMgY29ycmVjdGx5IG9u
IHVuZmluaXNoZWQgYGxldA0KICAgICAuLi4gaW4nIGJpbmRpbmdzIGFuZCBubyBsb25nZXIgYXBw
ZWFycyByZWR1bmRhbnRseSBvbiBmdW5jdGlvbg0KICAgICBuYW1lcw0KICDigKIgKk1vcmUgUmVs
aWFibGUgQ29tcGxldGlvbio6IEZpeGVkIGlzc3VlcyB3aXRoIGNvbXBsZXRpb24gZm9yIGlubGlu
ZWQNCiAgICAgcmVjb3JkIGxhYmVscw0KICDigKIgKkltcHJvdmVkIFBlcmZvcm1hbmNlKjogT3B0
aW1pemVkIGJ1ZmZlciBpbmRleGluZyBhbmQgcGF0aA0KICAgICBjYWxjdWxhdGlvbnMNCiAg4oCi
ICpCdWcgRml4ZXMqOiBSZXNvbHZlZCBhIGJ1ZyB3aGVyZSB0aGUgYGRvY3VtZW50JyBjb21tYW5k
DQogICAgIGNvbmNhdGVuYXRlZCBsYWJlbHMgYW5kIHZhcmlhbnRzIGluY29ycmVjdGx5DQoNCiAg
Kk9DYW1sIExTUCBTZXJ2ZXIgbWFpbnRhaW5lZCBieSo6IFVseXNzZSBHw6lyYXJkIChAdm9vZG9v
cywgVGFyaWRlcyksDQogICBYYXZpZXIgVmFuIGRlIFdvZXN0eW5lIChAeHZ3LCBUYXJpZGVzKSwg
UnVkaSBHcmluYmVyZyAoQHJncmluYmVyZywNCiAgIEphbmUgU3RyZWV0KQ0KDQogICpNZXJsaW4g
bWFpbnRhaW5lZCBieSo6IFVseXNzZSBHw6lyYXJkIChAdm9vZG9vcywgVGFyaWRlcyksIFhhdmll
ciBWYW4NCiAgIGRlIFdvZXN0eW5lIChAeHZ3LCBUYXJpZGVzKSwgTXVsdWggR29kc29uIChAUGl6
aWVEdXN0LCBUYXJpZGVzKQ0KDQoNCiAgW01lcmxpbiA1LjYuMS01MDRdDQogIDxodHRwczovL29j
YW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMi0yMC1tZXJsaW4tdjUtNi0xLTUwND4NCg0KDQril4og
T0NhbWwtZWdsb3QNCg0KICBXZSBoYXZlIGRyYXN0aWNhbGx5IG1vZGlmaWVkIHRoZSBgeHJlZicg
YmFja2VuZCAoYWxsb3dpbmcgbmF2aWdhdGlvbg0KICBmcm9tIGRlZmluaXRpb24gdG8gZGVmaW5p
dGlvbikgdG8gbWFrZSBpdCBtb3JlIHN1aXRhYmxlIGZvciBPQ2FtbC4NCg0KICBJbiBhZGRpdGlv
biwgd2UgYWRkZWQgdGhlIGFiaWxpdHkgdG8gYW5ub3RhdGUgdGhlIHR5cGUgb2YgYW4gZW5jbG9z
aW5nDQogIGFjdGl2ZV8gKHVzZWQgd2l0aCB0aGUgYG9jYW1sLWVnbG90LXR5cGUtZW5jbG9zaW5n
JyBjb21tYW5kKSBvciBzaW1wbHkNCiAgdG8gdHlwZSB0aGUgc2VsZWN0aW9uLg0KDQogIFRoZXNl
IHVwZGF0ZXMgaGF2ZSBiZWVuIG1lcmdlZCBpbnRvIGBtYWluJywgbWFraW5nIHRoZW0gYXZhaWxh
YmxlIHZpYQ0KICBhIE1FTFBBIHVwZGF0ZS4NCg0KICAqb2NhbWwtZWdsb3QgbWFpbnRhaW5lZCBi
eSo6IFhhdmllciBWYW4gZGUgV29lc3R5bmUgKEB4dncsIFRhcmlkZXMpDQoNCg0KUGxhdGZvcm0g
SW5mcmFzdHJ1Y3R1cmUNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQril4ogT0NhbWwgSW5mcmFzdHJ1Y3R1cmU6
IEhvdyB0aGUgb3BhbS1yZXBvc2l0b3J5IFdvcmtzDQoNCiAgVGhlIFtOb3ZlbWJlciA1LCAyMDI1
IGFydGljbGUgb24gdGhlIG9wYW0tcmVwb3NpdG9yeV0gcHJvdmlkZXMgYW4NCiAgaW4tZGVwdGgg
bG9vayBhdCB0aGlzIGNyaXRpY2FsIHBpZWNlIG9mIE9DYW1sIGluZnJhc3RydWN0dXJlLiBUaGUg
b3BhbQ0KICByZXBvc2l0b3J5IHNlcnZlcyBhcyB0aGUgY2VudHJhbCBwYWNrYWdlIHJlZ2lzdHJ5
IGZvciB0aGUgT0NhbWwNCiAgZWNvc3lzdGVtLCBob3N0aW5nIG92ZXIgNCw1MDAgcGFja2FnZXMu
IEl0IHJlbGllcyBvbiBkZWRpY2F0ZWQNCiAgdm9sdW50ZWVyIG1haW50YWluZXJzIHdobyByZXZp
ZXcgZXZlcnkgc3VibWlzc2lvbi4NCg0KICDigJQNCg0KICBBcyBhbHdheXMsIHdlIGVuY291cmFn
ZSBmZWVkYmFjayBhbmQgY29udHJpYnV0aW9ucyBmcm9tIHRoZSBjb21tdW5pdHkNCiAgYXMgd2Ug
Y29udGludWUgdG8gaW1wcm92ZSB0aGUgT0NhbWwgUGxhdGZvcm0gZWNvc3lzdGVtLg0KDQoNCiAg
W05vdmVtYmVyIDUsIDIwMjUgYXJ0aWNsZSBvbiB0aGUgb3BhbS1yZXBvc2l0b3J5XQ0KICA8aHR0
cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjUtMTEtMDUtaG93LXRoZS1vcGFtLXJlcG9zaXRv
cnktd29ya3M+DQoNCg0KQW5ub3VuY2luZyB0aGUgZmlyc3QgcmVsZWFzZSBvZiBBbGljZSwgYSBy
YWRpY2FsIE9DYW1sIGJ1aWxkIHN5c3RlbQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm5vdW5jaW5n
LXRoZS1maXJzdC1yZWxlYXNlLW9mLWFsaWNlLWEtcmFkaWNhbC1vY2FtbC1idWlsZC1zeXN0ZW0v
MTc0NzIvNDU+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgU3RldmUgU2hlcnJhdHQgYW5u
b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBBbm5vdW5jaW5nIHRo
ZSByZWxlYXNlIG9mIFtBbGljZSB2MC41LjBdIHdoaWNoIGludHJvZHVjZXMgcGFyYWxsZWwNCiAg
YnVpbGRzLg0KDQoNCltBbGljZSB2MC41LjBdIDxodHRwczovL3d3dy5hbGljZWNhbWwub3JnL2Js
b2cvYWxpY2UtdjAtNS0wLz4NCg0KDQptbmV0LCBhIG5ldyBUQ1AvSVAgc3RhY2sgZm9yIHVuaWtl
cm5lbHMgaW4gT0NhbWwNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp
dmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1uZXQtYS1uZXctdGNwLWlw
LXN0YWNrLWZvci11bmlrZXJuZWxzLWluLW9jYW1sLzE3ODUxLzE+DQoNCg0KQ2FsYXNjaWJldHRh
IFJvbWFpbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkg
YW0gcGxlYXNlZCB0byBhbm5vdW5jZSBhIHNlcmllcyBvZiByZWxlYXNlcyBmb3IgZGV2ZWxvcGlu
Zw0KICB1bmlrZXJuZWxzIHdpdGggT0NhbWwgNSBhbmQgW01pb3VdLiBBZnRlciBleHRlbnNpdmUg
dGVzdGluZywgd2UgYXJlDQogIG5vdyBhYmxlIHRvIG9mZmVyIGEgbmV3IFRDUC9JUHY0IGFuZCBJ
UHY2IHN0YWNrIGluIE9DYW1sIHRoYXQgYWltcyB0bw0KICByZXBsYWNlIFttaXJhZ2UtdGNwaXBd
IGFuZCBwYXZlIHRoZSB3YXkgZm9yIGRpcmVjdC1zdHlsZSB1bmlrZXJuZWwNCiAgZGV2ZWxvcG1l
bnQuIEJlbG93IGlzIGFuIG92ZXJ2aWV3IG9mIHRoZSBsaWJyYXJpZXMgd2UgaGF2ZSBidWlsdCB0
bw0KICBtYWtlIHRoaXMgcG9zc2libGUuDQoNCg0KW01pb3VdIDxodHRwczovL2dpdGh1Yi5jb20v
cm9idXItY29vcC9taW91Pg0KDQpbbWlyYWdlLXRjcGlwXSA8aHR0cHM6Ly9naXRodWIuY29tL21p
cmFnZS9taXJhZ2UtdGNwaXA+DQoNCm1rZXJuZWwNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog
IGBta2VybmVsJyBpcyBhIHNtYWxsIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB0aGUgZXNzZW50aWFs
cyBmb3INCiAgZGV2ZWxvcGluZyBhIHVuaWtlcm5lbCB0YXJnZXRpbmcgW1NvbG81XSBvciBbVW5p
a3JhZnRdLiBJdHMgcHVycG9zZSBpcw0KICB0byBleHBvc2UgaHlwZXJjYWxscyAodGhlIHVuaWtl
cm5lbCBlcXVpdmFsZW50IG9mIHN5c2NhbGxzKSBzbyB0aGF0DQogIHlvdXIgYXBwbGljYXRpb24g
Y2FuIGludGVyYWN0IHdpdGggbmV0d29yayBhbmQgYmxvY2sgZGV2aWNlcy4NCg0KICBXZSByZWNv
bW1lbmQgcmVhZGluZyB0aGUgYG1rZXJuZWwnIFtkb2N1bWVudGF0aW9uXSB0byB1bmRlcnN0YW5k
IHRoZQ0KICBrZXkgY29uY2VwdHMgYmVoaW5kIHVuaWtlcm5lbHMgKGh5cGVyY2FsbHMsIGRldmlj
ZXMsIHRlbmRlcnMsDQogIGV0Yy4pLiBUaGUgW3NsaWRlc10gd2UgcHJlc2VudGVkIGF0IHRoZSBs
YXN0IFtNaXJhZ2VPUyByZXRyZWF0XSBhcmUNCiAgYWxzbyBoZWxwZnVsIGZvciB1bmRlcnN0YW5k
aW5nIG91ciBuZXcgd29ya2Zsb3cuIENvbXBpbGluZyBhIHVuaWtlcm5lbA0KICBub3cgb25seSBy
ZXF1aXJlcyBgZHVuZScgYW5kIHZlbmRvcmVkIGxpYnJhcmllcy4gV2UgaGF2ZSB0aGVyZWZvcmUN
CiAgY2hvc2VuIG5vdCB0byByZXNvbHZlIGRlcGVuZGVuY2llcyBhdXRvbWF0aWNhbGx5IChhcyBb
b3BhbS1tb25vcmVwb10NCiAgZGlkKSBvciB0byBpbXBvc2UgdGhlbSAoYXMgdGhlIGBtaXJhZ2Un
IHRvb2wgZG9lcyksIGdpdmluZyBkZXZlbG9wZXJzDQogIGZ1bGwgZnJlZWRvbSB0byBidWlsZCB0
aGVpciB1bmlrZXJuZWxzIGFzIHRoZXkgc2VlIGZpdC4gSW4gcGFydGljdWxhciwNCiAgdGhpcyBt
YWtlcyBpdCBzdHJhaWdodGZvcndhcmQgdG8gdXNlIHBweCByZXdyaXRlcnMsIHdoaWNoIHdhcw0K
ICBkaWZmaWN1bHQgb3IgaW1wb3NzaWJsZSB3aXRoIHRoZSBgbWlyYWdlJyB0b29sLg0KDQoNCltT
b2xvNV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9zb2xvNS9zb2xvNT4NCg0KW1VuaWtyYWZ0XSA8aHR0
cHM6Ly91bmlrcmFmdC5vcmcvPg0KDQpbZG9jdW1lbnRhdGlvbl0NCjxodHRwczovL3JvYnVyLWNv
b3AuZ2l0aHViLmlvL21rZXJuZWwvbG9jYWwvbWtlcm5lbC9Na2VybmVsL2luZGV4Lmh0bWw+DQoN
CltzbGlkZXNdDQo8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvbWtlcm5lbC9ibG9iL21h
aW4vc2xpZGVzL3JldHJlYXQubWQ+DQoNCltNaXJhZ2VPUyByZXRyZWF0XSA8aHR0cHM6Ly9yZXRy
ZWF0Lm1pcmFnZW9zLm9yZy8+DQoNCltvcGFtLW1vbm9yZXBvXSA8aHR0cHM6Ly9naXRodWIuY29t
L3RhcmlkZXMvb3BhbS1tb25vcmVwbz4NCg0K4peKIEEgbmV3IHdvcmtmbG93IGFuZCB0YXJnZXRz
DQoNCiAgVGhpcyByZWxlYXNlIGlzIGV4cGVyaW1lbnRhbDogWGVuIGlzIG5vdCB5ZXQgc3VwcG9y
dGVkLCBhbmQgVW5pa3JhZnQNCiAgc3VwcG9ydCBpcyBwYXJ0aWFsLiBIb3dldmVyLCBib3RoIHBs
YXRmb3JtcyBhcmUgb24gb3VyIHJvYWRtYXAsIHNvIGlmDQogIHlvdSBhcmUgaW50ZXJlc3RlZCBp
biB0aGVtLCBwbGVhc2UgbGV0IHVzIGtub3chIFdlIGFyZSBhbHNvIGRldmVsb3BpbmcNCiAgdG9v
bGluZyB0byBzdHJlYW1saW5lIHRoZSB3b3JrZmxvdywgd2l0aCB0aGUgZ3VpZGluZyBwcmluY2lw
bGUgdGhhdA0KICB0aGVzZSB0b29scyBzaG91bGQgbmV2ZXIgZGljdGF0ZSB3aGljaCBkZXBlbmRl
bmNpZXMgeW91ciB1bmlrZXJuZWwNCiAgdXNlcyBvciB3aGljaCBidWlsZCBzeXN0ZW0geW91IGNo
b29zZS4NCg0KDQptbmV0DQrilYzilYzilYzilYwNCg0KICBgbW5ldCcgaXMgdGhlIGNlbnRlcnBp
ZWNlIG9mIHRoaXMgcmVsZWFzZS4gSXQgaXMgZGVzaWduZWQgdG8gcmVwbGFjZQ0KICAoYW5kIGlt
cHJvdmUgdXBvbikgW21pcmFnZS10Y3BpcF0gYnkgb2ZmZXJpbmcgYSBkaXJlY3Qtc3R5bGUgQVBJ
IGJ1aWx0DQogIG9uIGVmZmVjdHMuIFRoZSBBUEkgZGVsaWJlcmF0ZWx5IG1pcnJvcnMgdGhlIGBV
bml4JyBzb2NrZXQgaW50ZXJmYWNlOg0KICBgY29ubmVjdCcsIGBsaXN0ZW4nLCBgYWNjZXB0Jywg
YHJlYWQnLCBgd3JpdGUnLCBhbmQgYGNsb3NlJyBhbGwgYmVoYXZlDQogIHRoZSB3YXkgeW91IHdv
dWxkIGV4cGVjdC4NCg0KICBIZXJlIGlzIGEgc21hbGwgZXhhbXBsZSBvZiBhbiBlY2hvIHNlcnZl
cjoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgcnVuIChpcHY0LCBnYXRld2F5LCBpcHY2
KSA9DQogIOKUgiAgIE1rZXJuZWwuKHJ1biBbIHJuZzsgTW5ldC5zdGFjayB+bmFtZToic2Vydmlj
ZSIgP2dhdGV3YXkgfmlwdjYgaXB2NCBdKQ0KICDilIIgICBAQCBmdW4gcm5nIChkYWVtb24sIHRj
cCwgdWRwKSAtPg0KICDilIIgICBsZXRAICgpID0gZnVuICgpIC0+IE1uZXQua2lsbCBkYWVtb24g
aW4NCiAg4pSCICAgbGV0QCAoKSA9IGZ1biAoKSAtPiBNaXJhZ2VfY3J5cHRvX3JuZ19ta2VybmVs
LmtpbGwgcm5nIGluDQogIOKUgiAgIGxldCBsaXN0ZW4gPSBNbmV0LlRDUC5saXN0ZW4gdGNwIDkw
MDAgaW4NCiAg4pSCICAgbGV0IGZsb3cgPSBNbmV0LlRDUC5hY2NlcHQgdGNwIGxpc3RlbiBpbg0K
ICDilIIgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIDQwOTYgaW4NCiAg4pSCICAgbGV0IHJlYyBl
Y2hvICgpID0NCiAg4pSCICAgICBsZXQgbGVuID0gTW5ldC5UQ1AucmVhZCBmbG93IGJ1ZiBpbg0K
ICDilIIgICAgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbg0KICDilIIgICAgICAgTW5ldC5UQ1Aud3Jp
dGUgZmxvdyAoQnl0ZXMuc3ViX3N0cmluZyBidWYgMCBsZW4pOw0KICDilIIgICAgICAgZWNobyAo
KQ0KICDilIIgICAgIGVuZA0KICDilIIgICBpbg0KICDilIIgICBsZXRAICgpID0gZnVuICgpIC0+
IE1uZXQuVENQLmNsb3NlIGZsb3cgaW4NCiAg4pSCICAgZWNobyAoKQ0KICDilJTilIDilIDilIDi
lIANCg0KICBUTFMgc3VwcG9ydCAodmlhIFtvY2FtbC10bHNdKSBpcyBhbHJlYWR5IGF2YWlsYWJs
ZSwgYWxsb3dpbmcgeW91IHRvDQogIGVzdGFibGlzaCBzZWN1cmUgY29ubmVjdGlvbnMgd2l0aCB5
b3VyIHVuaWtlcm5lbC4gRE5TIHJlc29sdXRpb24gKHZpYQ0KICBbb2NhbWwtZG5zXSkgYW5kIHRo
ZSBbSGFwcHkgRXllYmFsbHNdIGFsZ29yaXRobSBhcmUgYWxzbyBpbmNsdWRlZCwgc28NCiAgdGhh
dCBhIHVuaWtlcm5lbCBjYW4gcmVzb2x2ZSBob3N0bmFtZXMgYW5kIGNvbm5lY3QgdG8gcmVtb3Rl
IHNlcnZpY2VzDQogIG92ZXIgYm90aCBJUHY0IGFuZCBJUHY2Lg0KDQogIEEgW3Nob3J0IHR1dG9y
aWFsXSB3YWxrcyB5b3UgdGhyb3VnaCBjcmVhdGluZyBhbiBlY2hvIHNlcnZlciBhcyBhDQogIHVu
aWtlcm5lbCwgc2ltaWxhciB0byB3aGF0IHdlIFthbHJlYWR5IG9mZmVyXSBmb3IgTWlvdS4gRm9y
IHRoZQ0KICBjdXJpb3VzLCBhbiBhcnRpY2xlIGFib3V0IElQdjQgYW5kIE1pb3UgaXMgYXZhaWxh
YmxlIFtoZXJlXS4NCg0KICBCZXlvbmQgdGhlIG1vdmUgdG8gZWZmZWN0cyBmb3IgYWxsIHNjaGVk
dWxpbmcsIEkgd291bGQgbGlrZSB0byBnaXZlDQogIHNwZWNpYWwgdGhhbmtzIHRvOg0KICDigKIg
RWR3aW4gVMO2csO2ayBmb3IgcHJvcG9zaW5nIGZpeGVzIHRvIHByZXZlbnQgZGVuaWFsLW9mLXNl
cnZpY2UNCiAgICBhdHRhY2tzLCB3aGljaCBoYXZlIGJlZW4gaW50ZWdyYXRlZCBpbnRvIGBtbmV0
JyAoaW4gcGFydGljdWxhciBmb3INCiAgICBbQVJQXSkuDQogIOKAoiBOaWNvbGFzIE9qZWRhIELD
pHIgZm9yIGNvbnRyaWJ1dGluZyBhbiBJUHY2IGltcGxlbWVudGF0aW9uIHRoYXQgd2UNCiAgICBh
ZG9wdGVkIGFuZCBpbXByb3ZlZCAoY2FjaGVzLCBwYWNrZXQgZnJhZ21lbnRhdGlvbiBhbmQgcmVh
c3NlbWJseSwNCiAgICBldGMuKQ0KICDigKIgUmV5bmlyIGZvciBwYXRpZW50bHkgZGVidWdnaW5n
IFBDQVAgdHJhY2VzDQogIOKAoiBIYW5uZXMgZm9yIHNoYXJpbmcgaGlzIGRlZXAga25vd2xlZGdl
IG9mIHRoZSBUQ1AgcHJvdG9jb2wgYW5kIGl0cw0KICAgIGludGVyYWN0aW9ucyB3aXRoIElQdjQg
YW5kIElQdjYNCg0KICBBcyB3ZWxsIGFzIG90aGVycyB3aG8gcGFydGljaXBhdGVkIGluIHRoZSBk
ZXZlbG9wbWVudCBvZiBgbW5ldCcgaW4gb25lDQogIHdheSBvciBhbm90aGVyLg0KDQoNClttaXJh
Z2UtdGNwaXBdIDxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS10Y3BpcD4NCg0KW29j
YW1sLXRsc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJsZWZ0L29jYW1sLXRscz4NCg0KW29jYW1s
LWRuc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2Uvb2NhbWwtZG5zPg0KDQpbSGFwcHkgRXll
YmFsbHNdIDxodHRwczovL2dpdGh1Yi5jb20vcm9idXItY29vcC9oYXBweS1leWViYWxscz4NCg0K
W3Nob3J0IHR1dG9yaWFsXSA8aHR0cHM6Ly9yb2J1ci1jb29wLmdpdGh1Yi5pby9tbmV0Lz4NCg0K
W2FscmVhZHkgb2ZmZXJdIDxodHRwczovL3JvYnVyLWNvb3AuZ2l0aHViLmlvL21pb3UvZWNoby5o
dG1sPg0KDQpbaGVyZV0gPGh0dHBzOi8vYmxvZy5yb2J1ci5jb29wL2FydGljbGVzL3V0Y3BfYW5k
X2VmZmVjdHMuaHRtbD4NCg0KW0FSUF0gPGh0dHBzOi8vb3N2LmRldi92dWxuZXJhYmlsaXR5L09T
RUMtMjAyNi0wMj4NCg0K4peKIERldmVsb3BpbmcgYW5kIGRlcGxveWluZyB1bmlrZXJuZWxzDQoN
CiAgVGhpcyBsaWJyYXJ5IGFsc28gbWFya3MgYSB0dXJuaW5nIHBvaW50IGluIG91ciBhcHByb2Fj
aCB0bw0KICB1bmlrZXJuZWxzLiBXZSBubyBsb25nZXIgdHJlYXQgYSByZWd1bGFyIE9DYW1sIGFw
cGxpY2F0aW9uIGFzDQogIHNvbWV0aGluZyB0aGF0IGNhbiBiZSB0cmFuc3BhcmVudGx5IHR1cm5l
ZCBpbnRvIGENCiAgdW5pa2VybmVsLiBEZXZlbG9waW5nIGEgdW5pa2VybmVsIG5vdyBtZWFucyBk
ZXZlbG9waW5nIGEgdW5pa2VybmVsDQogIGZyb20gdGhlIHN0YXJ0LiBJbiBvdXIgZXhwZXJpZW5j
ZSwgdHJ5aW5nIHRvIHJldHJvZml0IGFuIGV4aXN0aW5nDQogIGFwcGxpY2F0aW9uIGludG8gYSB1
bmlrZXJuZWwgd2FzIG5laXRoZXIgcHJhY3RpY2FsIG5vciB3b3J0aHdoaWxlLg0KDQogIE91ciB0
dXRvcmlhbCB0aGVyZWZvcmUgY292ZXJzIGJvdGggdGhlIGRldmVsb3BtZW50IGFuZCBkZXBsb3lt
ZW50IG9mDQogIHVuaWtlcm5lbHMuIE9uIHRoZSBkZXBsb3ltZW50IHNpZGUsIHdlIGFsc28gcmVj
b21tZW5kIGV4cGxvcmluZw0KICBbQWxiYXRyb3NzXS4NCg0KDQogIFtBbGJhdHJvc3NdIDxodHRw
czovL2dpdGh1Yi5jb20vcm9idXItY29vcC9hbGJhdHJvc3M+DQoNCg0KdXRjcA0K4pWM4pWM4pWM
4pWMDQoNCiAgW2B1dGNwJ10gaXMgYSBwdXJlIE9DYW1sIGltcGxlbWVudGF0aW9uIG9mIHRoZSBU
Q1AgcHJvdG9jb2wsIHVzZWQNCiAgaW50ZXJuYWxseSBieSBgbW5ldCcgdG8gaGFuZGxlIFRDUCBj
b25uZWN0aW9ucy4gVGhlIGltcGxlbWVudGF0aW9uIGlzDQogIGJhc2VkIG9uIGEgc3RhdGUgbWFj
aGluZSBhbmQgcGVyZm9ybXMgbm8gSS9PIGl0c2VsZiwgbWFraW5nIGl0IGVhc3kgdG8NCiAgdGVz
dCBhbmQgcmVhc29uIGFib3V0Lg0KDQogIGB1dGNwJyBjb3ZlcnMgdGhlIGZ1bGwgVENQIGxpZmVj
eWNsZTogdGhlIHRocmVlLXdheSBoYW5kc2hha2UsDQogIHJlbGlhYmxlIGluLW9yZGVyIGRhdGEg
ZGVsaXZlcnkgd2l0aCByZXRyYW5zbWlzc2lvbnMsIGZsb3cgY29udHJvbCwNCiAgY29uZ2VzdGlv
biBjb250cm9sLCBhbmQgY29ubmVjdGlvbiB0ZWFyZG93bi4gSXQgaGFzIGJlZW4gdGVzdGVkDQog
IGV4dGVuc2l2ZWx5IHRocm91Z2ggb3VyIGVuZC10by1lbmQgdW5pa2VybmVsIHRlc3RzIChhIHNp
bXBsZSBbZWNob10NCiAgc2VydmVyIGFuZCBjbGllbnQsIGFuZCBhIFtETlMgcmVzb2x2ZXJdKS4N
Cg0KDQpbYHV0Y3AnXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvdXRjcD4NCg0KW2Vj
aG9dIDxodHRwczovL2dpdGh1Yi5jb20vcm9idXItY29vcC9tbmV0L3RyZWUvbWFpbi91bmlrZXJu
ZWxzL2VjaG8+DQoNCltETlMgcmVzb2x2ZXJdDQo8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNv
b3AvbW5ldC90cmVlL21haW4vdW5pa2VybmVscy9yZXNvbHZlcj4NCg0K4peKIFVuaWtlcm5lbHMg
YW5kIHByb29mcw0KDQogIGB1dGNwJyBhbHNvIHJlZmxlY3RzIG91ciBhbWJpdGlvbiB0byBpbmNv
cnBvcmF0ZSwgYXMgdGltZSBwZXJtaXRzLA0KICBwcm9vZi1iYXNlZCBpbXBsZW1lbnRhdGlvbnMu
IE90aGVyIGV4YW1wbGVzIGluY2x1ZGU6DQogIOKAoiBtaW91IHdpdGggaXRzIHByaW9yaXR5IHF1
ZXVlIChzZWUgdGhlIFtWT0NBTF0gcHJvamVjdCkNCiAg4oCiIG1pcmFnZS1jcnlwdG8gd2l0aCBj
ZXJ0YWluIGNyeXB0b2dyYXBoaWMgcHJpbWl0aXZlcyAoc2VlIHRoZSBbZmlhdF0NCiAgICBwcm9q
ZWN0KQ0KICDigKIgYW5kIG5vdyB1dGNwIChzZWUgW25ldHNlbV0pDQoNCiAgVGhpcyBlZmZvcnQg
aXMgc3RpbGwgaW4gaXRzIGVhcmx5IHN0YWdlcywgYnV0IHdlIHdlbGNvbWUgaW1wcm92ZW1lbnRz
DQogIGFuZCBjb2xsYWJvcmF0aW9ucyBpbiB0aGlzIGFyZWEuDQoNCg0KICBbVk9DQUxdIDxodHRw
czovL2lucmlhLmhhbC5zY2llbmNlL2hhbC0wMTU2MTA5ND4NCg0KICBbZmlhdF0gPGh0dHBzOi8v
Z2l0aHViLmNvbS9taXQtcGx2L2ZpYXQtY3J5cHRvPg0KDQogIFtuZXRzZW1dIDxodHRwczovL3d3
dy5jbC5jYW0uYWMudWsvfnBlczIwL05ldHNlbS8+DQoNCg0KbWh0dHANCuKVjOKVjOKVjOKVjOKV
jA0KDQogIFRvIHJlYWNoIGEgd2lkZXIgYXVkaWVuY2UsIHdlIGFsc28gcHJvdmlkZSBhbiBIVFRQ
IHByb3RvY29sDQogIGltcGxlbWVudGF0aW9uIGZvciB1bmlrZXJuZWxzLCBidWlsZGluZyBvbiB0
aGUgd29yayB3ZSBzdGFydGVkIChhbmQNCiAgY3VycmVudGx5IHVzZSBpbiBwcm9kdWN0aW9uKSB3
aXRoIFtodHRwY2F0c10uDQoNCiAgYG1odHRwJyBpcyBlc3NlbnRpYWxseSBhIHVuaWtlcm5lbC1v
cmllbnRlZCBjb3VudGVycGFydCB0byBgaHR0cGNhdHMnLA0KICB1c2luZyBbb2NhbWwtaDFdIGFu
ZCBbb2NhbWwtaDJdIGFzIGl0cyBIVFRQLzEuMSBhbmQgSDIgYmFja2VuZHMuDQoNCg0KW2h0dHBj
YXRzXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvaHR0cGNhdHM+DQoNCltvY2FtbC1o
MV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL29jYW1sLWgxPg0KDQpbb2NhbWwtaDJd
IDxodHRwczovL2dpdGh1Yi5jb20vYW5tb250ZWlyby9vY2FtbC1oMj4NCg0K4peKIEVjb3N5c3Rl
bSBhbmQgY29tcG9zYWJpbGl0eQ0KDQogIEFsdGhvdWdoIGBtaHR0cCcgaXMgYSBzbWFsbCBwcm9q
ZWN0LCBpdCBpbGx1c3RyYXRlcyBhIGJyb2FkZXINCiAgcHJpbmNpcGxlIGJlaGluZCBvdXIgY29v
cGVyYXRpdmUncyBhcHByb2FjaCB0byBsaWJyYXJ5IGRldmVsb3BtZW50LiBBcw0KICB3ZSBoYXZl
IFtzdGF0ZWQgYmVmb3JlXSwgZXZlcnl0aGluZyB3ZSBidWlsZCBpcyBkZXNpZ25lZCB0byBiZQ0K
ICByZXVzYWJsZSB3aXRoIHNjaGVkdWxlcnMgb3RoZXIgdGhhbiBNaW91IGFuZCBpbiBjb250ZXh0
cyBvdGhlciB0aGFuDQogIHVuaWtlcm5lbHMuIFJlZ2FyZGxlc3Mgb2Ygd2hpY2ggc2NoZWR1bGVy
IG9uZSBwcmVmZXJzLCB3ZSBiZWxpZXZlIGluIGENCiAgcHJhZ21hdGljLCBjb29wZXJhdGl2ZSBh
cHByb2FjaCB0byBjb250cmlidXRpbmcgdG8gdGhlIGNvbW11bml0eS4NCg0KICBPdXIgcHJpbWFy
eSBmb2N1cyByZW1haW5zIHVuaWtlcm5lbCBkZXZlbG9wbWVudCwgYnV0IHllYXJzIG9mDQogIGV4
cGVyaWVuY2UgYnVpbGRpbmcgcHJvdG9jb2wgYW5kIGZvcm1hdCBsaWJyYXJpZXMgaGF2ZSB0YXVn
aHQgdXMgdGhhdA0KICBrZWVwaW5nIHRoZW0gc2NoZWR1bGVyLWFnbm9zdGljIGlzIGluIGV2ZXJ5
b25lJ3MgYmVzdCBpbnRlcmVzdCwgZm9yDQogIG1haW50YWluYWJpbGl0eSwgdGVzdGFiaWxpdHks
IGFuZCByZWxpYWJpbGl0eSBhbGlrZS4gV2hlcmV2ZXINCiAgcG9zc2libGUsIHlvdSB3aWxsIGZp
bmQgYSBnZW5lcmFsLXB1cnBvc2UgbGlicmFyeSBhbG9uZ3NpZGUgaXRzDQogIHVuaWtlcm5lbCBj
b3VudGVycGFydDogYGh0dHBjYXRzJyBhbmQgYG1odHRwJyBhcmUgb25lIHN1Y2ggcGFpci4NCg0K
DQogIFtzdGF0ZWQgYmVmb3JlXQ0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29uLWNv
bmN1cnJlbmN5LW1vZGVscy8xNTg5OS8xMz91PWRpbm9zYXVyZT4NCg0KDQpWaWZ1DQrilYzilYzi
lYzilYwNCg0KICBBcyBbcHJldmlvdXNseSBhbm5vdW5jZWRdLCB3ZSBoYXZlIGRldmVsb3BlZCBh
IHdlYiBmcmFtZXdvcmsgZm9yIE9DYW1sDQogIDUgY2FsbGVkIFt2aWZdLCB3aGljaCB3ZSB1c2Ug
aW4gcHJvZHVjdGlvbiBmb3Igb3VyIFtidWlsZHMucm9idXIuY29vcF0NCiAgd2Vic2l0ZSAod2Ug
cmVjb21tZW5kIHRoZSBbdHV0b3JpYWxdIHByZXNlbnRlZCBhdCBbRlVOIE9DYW1sXSAyMDI1KS4N
Cg0KICBgdmlmJyBub3cgaGFzIGEgdW5pa2VybmVsIHZhcmlhbnQ6IGB2aWZ1Jy4gSXQgb2ZmZXJz
IG5lYXJseSB0aGUgc2FtZQ0KICBpbnRlcmZhY2UgYXMgYHZpZicgKGV4Y2VwdCBmb3Igc3RhdGlj
IGZpbGUgbWFuYWdlbWVudCksIG1ha2luZyBpdA0KICBwb3NzaWJsZSB0byBidWlsZCB3ZWJzaXRl
cyBlbnRpcmVseSBpbiBPQ2FtbC4gSGVyZSBpcyBhIHNtYWxsDQogIHVuaWtlcm5lbCB0aGF0IGRp
c3BsYXlzICJIZWxsbyBXb3JsZCEiOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbGV0IGhl
bGxvX3dvcmxkIHJlcSBfc2VydmVyICgpID0NCiAg4pSCICAgbGV0IG9wZW4gVmlmdS5SZXNwb25z
ZS5TeW50YXggaW4NCiAg4pSCICAgbGV0KiAoKSA9IFZpZnUuUmVzcG9uc2Uud2l0aF90ZXh0IHJl
cSAiSGVsbG8gV29ybGQhXG4iIGluDQogIOKUgiAgIFZpZnUuUmVzcG9uc2UucmVzcG9uZCBgT0sN
CiAg4pSCIA0KICDilIIgbGV0IHJ1biAoaXB2NCwgZ2F0ZXdheSwgaXB2NikgPQ0KICDilIIgICBN
a2VybmVsLihydW4gWyBybmc7IE1uZXQuc3RhY2sgfm5hbWU6InNlcnZpY2UiID9nYXRld2F5IH5p
cHY2IGlwdjQgXSkNCiAg4pSCICAgQEAgZnVuIHJuZyAoZGFlbW9uLCB0Y3AsIHVkcCkgLT4NCiAg
4pSCICAgbGV0QCAoKSA9IGZ1biAoKSAtPiBNbmV0LmtpbGwgZGFlbW9uIGluDQogIOKUgiAgIGxl
dEAgKCkgPSBmdW4gKCkgLT4gTWlyYWdlX2NyeXB0b19ybmdfbWtlcm5lbC5raWxsIHJuZyBpbg0K
ICDilIIgICBsZXQgY2ZnID0gVmlmdS5Db25maWcudiA4MCBpbg0KICDilIIgICBsZXQgcm91dGVz
ID0gVmlmdS5bIGdldCAocmVsIC8/PyBhbnkpIC0tPiBoZWxsb193b3JsZCBdIGluDQogIOKUgiAg
IFZpZnUucnVuIH5jZmcgdGNwIHJvdXRlcyAoKQ0KICDilJTilIDilIDilIDilIANCg0KICAqZGlz
Y2xhaW1lcio6IElmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBgdmlmdScsIHBsZWFzZSBub3RlIHRo
YXQNCiAgIGFsdGhvdWdoIGEgcmVjZW50IHJlbGVhc2UgaGFzIGJlZW4gbWFkZSwgb25lIGZpbmFs
IGZpeCBpcyBzdGlsbA0KICAgbmVlZGVkIHRvIGNvbXBpbGUgYSB1bmlrZXJuZWwgd2l0aCB0aGlz
IGxpYnJhcnkgKHRvIGF2b2lkIHB1bGxpbmcgaW4NCiAgIHRoZSBgdW5peCcgbW9kdWxlKS4gV2Ug
cmVjb21tZW5kIHBpbm5pbmcgYHZpZnUnIGZvciBub3cuDQoNCg0KW3ByZXZpb3VzbHkgYW5ub3Vu
Y2VkXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4taHR0cGNhdHMtb2NhbWwtaDEt
dmlmLWh1cmwtYS13ZWJzdGFjay1mb3Itb2NhbWwtNS8xNzEwND4NCg0KW3ZpZl0gPGh0dHBzOi8v
Z2l0aHViLmNvbS9yb2J1ci1jb29wL3ZpZj4NCg0KW2J1aWxkcy5yb2J1ci5jb29wXSA8aHR0cHM6
Ly9idWlsZHMucm9idXIuY29vcD4NCg0KW3R1dG9yaWFsXSA8aHR0cHM6Ly9yb2J1ci1jb29wLmdp
dGh1Yi5pby92aWYvPg0KDQpbRlVOIE9DYW1sXSA8aHR0cHM6Ly9mdW4tb2NhbWwuY29tPg0KDQoN
ClVuaWtlcm5lbHMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEJlaGluZCBh
bGwgdGhlc2UgbGlicmFyaWVzLCB0aGVyZSBhcmUgY29uY3JldGUgcHJvamVjdHMgdGhhdCB3ZSB3
b3VsZA0KICBsaWtlIHRvIHNoYXJlIHdpdGggeW91Og0KICDigKIgT3VyIFtgaW1tdXRhYmxlJ10g
dW5pa2VybmVsLCBhIHdlYiBzZXJ2ZXIgZm9yIHN0YXRpYyBmaWxlcyAod2hpY2gNCiAgICBjYW4g
YmUgZ2VuZXJhdGVkLCBmb3IgZXhhbXBsZSwgd2l0aCBbWU9DYW1sXSkuDQogIOKAoiBBIEROUyBy
ZXNvbHZlciB1bmlrZXJuZWw6IFtgcGFnZWphdW5lJ10NCiAg4oCiIEEgc21hbGwgc2VhcmNoIGVu
Z2luZSBmb3IgZW1haWxzIGZyb20gYW4gYXJjaGl2ZSBzdWNoIGFzIHRoZQ0KICAgIGNhbWwtbGlz
dDogW2BibGFtZSddLiBNb3JlIGRldGFpbHMgYXJlIGF2YWlsYWJsZSBbaGVyZV0uDQoNCg0KW2Bp
bW11dGFibGUnXSA8aHR0cHM6Ly9naXRodWIuY29tL2Rpbm9zYXVyZS9pbW11YWJsZT4NCg0KW1lP
Q2FtbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS94aHRtbGJvaS95b2NhbWw+DQoNCltgcGFnZWphdW5l
J10gPGh0dHBzOi8vZ2l0aHViLmNvbS9kaW5vc2F1cmUvcGFnZWphdW5lPg0KDQpbYGJsYW1lJ10g
PGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL2JsYW1lPg0KDQpbaGVyZV0NCjxodHRwczov
L2Jsb2cucm9idXIuY29vcC9hcnRpY2xlcy8yMDI1LTA0LTEyLXB0dC1zZWFyY2gtd2ViYXBwLmh0
bWw+DQoNCg0KQ29uY2x1c2lvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg
QWZ0ZXIgc2V2ZXJhbCB5ZWFycyBvZiB3b3JrLCB3ZSBhcmUgbm93IGFibGUgdG8gZGV2ZWxvcCB1
bmlrZXJuZWxzDQogIHdpdGggT0NhbWwgNSBpbiBlYXJuZXN0LiBXZSBob3BlIHRoYXQgb3VyIG5l
dyB3b3JrZmxvdyB3aWxsIGJlIG9mDQogIGludGVyZXN0IHRvIHRoZSBjb21tdW5pdHkgYW5kIHRo
YXQgdGhlc2UgbGlicmFyaWVzIHdpbGwgYmUgYSB1c2VmdWwNCiAgY29udHJpYnV0aW9uIHRvIHRo
ZSBPQ2FtbCBlY29zeXN0ZW0uDQoNCiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gdHJ5IGl0IG91dCwg
d2UgcmVjb21tZW5kIHN0YXJ0aW5nIHdpdGggdGhlIFttbmV0DQogIHR1dG9yaWFsXSBhbmQgdGhl
IFtta2VybmVsIGRvY3VtZW50YXRpb25dLiBGZWVsIGZyZWUgdG8gb3BlbiBpc3N1ZXMgb3INCiAg
cmVhY2ggb3V0IHRvIHVzIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMhDQoNCg0KW21uZXQgdHV0
b3JpYWxdIDxodHRwczovL3JvYnVyLWNvb3AuZ2l0aHViLmlvL21uZXQvPg0KDQpbbWtlcm5lbCBk
b2N1bWVudGF0aW9uXQ0KPGh0dHBzOi8vcm9idXItY29vcC5naXRodWIuaW8vbWtlcm5lbC9sb2Nh
bC9ta2VybmVsL01rZXJuZWwvaW5kZXguaHRtbD4NCg0KDQpFeHBlcmltZW50OiBmb3JtYXQtbGlu
ZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v
cmcvdC9hbm4tZXhwZXJpbWVudC1mb3JtYXQtbGluZS8xNzg1NC8xPg0KDQoNCkVtaWxlIFRyb3Rp
Z25vbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgbWFkZSB0aGlzIGxpdHRs
ZSBleHBlcmltZW50IGEgd2hpbGUgYmFjazoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9haHJlZnMv
Zm9ybWF0LWxpbmU+DQoNCiAgVGhlIGlkZWEgaXMgdG8gcHJvdmlkZSBhIGNvbXBsZW1lbnQgdG8g
b2NwLWluZGVudCB0byBkZWNpZGUgd2hpY2gNCiAgdG9rZW4gc2hvdWxkIGJlIHNlcGFyYXRlZCBi
eSB3aGl0ZXNwYWNlIGFuZCB3aGljaCBzaG91bGQgbm90LiBGb3Igbm93DQogIGl0IGlzIGJhc2Vk
IG9ubHkgb24gbGV4aW5nIGluZm9ybWF0aW9uLCB3aGljaCBtYWtlIHRoZSBjb2RlIHNpbXBsZSBi
dXQNCiAgYWxzbyBkb2VzIG5vdCBhbHdheXMgcHJvdmlkZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8g
aGF2ZSBhIG5pY2UNCiAgZm9ybWF0dGluZy4NCg0KICBBbiBpZGVhIG9mIHRoZSBvdXRwdXQgY2Fu
IGJlIHJlYWQgaGVyZToNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9haHJlZnMvZm9ybWF0LWxpbmUv
YmxvYi9tYXN0ZXIvdGVzdC9ydW4udD4NCg0KICBUaGUgcHJvamVjdCBpdHNlbGYgaXMgZm9ybWF0
dGVkIHdpdGggb2NhbWxmb3JtYXQsIGFuZCBpbiB0aGUgdGhlcmUgaXMNCiAgYSBkaWZmIG9mIHdo
YXQgdGhpcyBjaGFuZ2VzIGNvbXBhcmVkIHRvIG9jYW1sZm9ybWF0LCBvbiB0aGUgbWFpbg0KICBz
b3VyY2UgZmlsZS4NCg0KICBJIHRoaW5rIHRoaXMgYXBwcm9hY2ggY291bGQgYmUgaW1wcm92ZWQg
YnkgaGF2aW5nIGEgaHlicmlkIGFzdC10b2tlbg0KICBzdHJlYW0gZGF0YXN0cnVjdHVyZS4gU29t
ZXRoaW5nIHdoZXJlIHlvdSB3b3JrIG9uIGEgc3RyZWFtIG9mIHRva2VuDQogIGJ1dCB5b3UgY2Fu
IHF1ZXJ5IHRoZSBBU1QgY29udGV4dCBvZiBhIGdpdmVuIHRva2VuLg0KDQogIFdoYXQgZG8geW91
IHRoaW5rID8NCg0KDQpDYW1sIGluIHRoZSBDYXBpdGFsIC0gUmVnaXN0cmF0aW9ucyBPcGVuIQ0K
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h
bm4tY2FtbC1pbi10aGUtY2FwaXRhbC1yZWdpc3RyYXRpb25zLW9wZW4vMTc3NzYvNj4NCg0KDQpD
b250aW51aW5nIHRoaXMgdGhyZWFkLCBTYWNoYSBBeW91biBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgA0KDQogIEFuZCBoZXJlIGlzIHRoZSBbbGluayB0byB0aGUgcmVjb3JkaW5nXSEN
Cg0KICBXZSdkIGxpa2UgdG8gdGhhbmsgb3VyIHNwZWFrZXJzIEplcmVteSBhbmQgTmljayBhZ2Fp
biwgYXMgd2VsbCBhcyB0aGUNCiAgfjMwIGF0dGVuZGVlcyB0byB0aGUgbWVldHVwISBJdCB3YXMg
Z3JlYXQgaGF2aW5nIHlvdSwgYW5kIHdlIGhvcGUgdG8NCiAgc2VlIHlvdSBhZ2FpbiBuZXh0IHRp
bWUgOikNCg0KDQpbbGluayB0byB0aGUgcmVjb3JkaW5nXSA8aHR0cHM6Ly93d3cueW91dHViZS5j
b20vd2F0Y2g/dj02Q005SjJDNThkZz4NCg0KDQpFeHBlcmltZW50YWwgdG9vbHMgZm9yIG1pZ3Jh
dGluZyBmcm9tIEx3dCB0byBFaW8NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog
IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWV4cGVyaW1lbnRh
bC10b29scy1mb3ItbWlncmF0aW5nLWZyb20tbHd0LXRvLWVpby8xNzg1NS8xPg0KDQoNCkp1bGVz
IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
DQoNCiAgV2UgZGV2ZWxvcGVkIHRvb2xzIHRvIGhlbHAgdXMgbWlncmF0ZSBPY3NpZ2VuIGxpYnJh
cmllcyBhbmQNCiAgYXBwbGljYXRpb25zIHRvIGRpcmVjdC1zdHlsZSBjb25jdXJyZW5jeSBhbmQg
d2UgYXJlIGhhcHB5IHRvIHNoYXJlDQogIHRoZW0uDQoNCiAgVGhlcmUgYXJlIDQgaW5kZXBlbmRl
bnQgdG9vbHMgZm9yIGRpZmZlcmVudCBwdXJwb3NlczoNCg0KICDigKIgUmVwbGFjaW5nIGV2ZXJ5
IHVzZXMgb2YgYGx3dF9wcHgnIHdpdGggYEx3dCcgZnVuY3Rpb24gY2FsbHMNCiAgICAoZS5nLiBy
ZXBsYWNpbmcgYGxldCVsd3QgLi4uIGluJyB3aXRoIGBsZXQqIC4uLiBpbicpLiAgVGhpcyBpcw0K
ICAgIHB1cmVseSBzeW50YWN0aWMgYW5kIGFsbG93cyB5b3UgdG8gZWFzaWx5IHJlbW92ZSBhIFBQ
WC4gSXQgaGFuZGxlcw0KICAgIGluc2VydGluZyBgb3BlbiBMd3QuU3ludGF4JyBhdCB0aGUgdG9w
IG9mIHRoZSBmaWxlLg0KDQogIOKAoiBXYXJuaW5nIGFib3V0IG9jY3VycmVuY2VzIG9mIGBsZXQg
XyA9IC4uLicgYW5kIGBpZ25vcmUgLi4uJywgd2hpY2gNCiAgICBtYWtlIHRoZSBuZXh0IHRvb2xz
IGxlc3MgcmVsaWFibGUuICBUaGVzZSBhcmUgY2FsbGVkIOKAnGltcGxpY2l0IGZvcmvigJ0NCiAg
ICBiZWNhdXNlIGNvZGUgcnVuIGNvbmN1cnJlbnRseSBpZiB0aGUgaWdub3JlZCB2YWx1ZSBpcyBh
biBMd3QNCiAgICB0aHJlYWQuIFRoaXMgcmVxdWlyZXMgYW4gZXhwbGljaXQgY2FsbCB0byBgRmli
ZXIuZm9yaycgd2l0aCBFaW8uDQoNCiAg4oCiIE1pZ3JhdGluZyB1c2VzIG9mIGBMd3RfbG9nJyB0
byBgTG9ncycuICBJdCB3YXMgdXNlZCBvbg0KICAgIFtvY3NpZ2Vuc2VydmVyXSBmb3IgZXhhbXBs
ZS4gIEF0IHRoaXMgcG9pbnQgd2UgZ2VuZXJhdGUgY29kZSB3b3JraW5nDQogICAgYXMgYmVmb3Jl
IGFuZCBkaWQgbm90IGludHJvZHVjZSBhIGRlcGVuZGVuY3kgb24gRWlvLg0KDQogIOKAoiBNaWdy
YXRpbmcgdXNlcyBvZiBgTHd0JyB0byBgRWlvJy4gSXQgcmV3cml0ZXMgY29kZSB3cml0dGVuIGlu
DQogICAgbW9uYWRpYyBzdHlsZSBpbnRvIGRpcmVjdC1zdHlsZSwgZm9yIGV4YW1wbGUgdGhpcyBj
b2RlOg0KDQogICAg4pSM4pSA4pSA4pSA4pSADQogICAg4pSCIGxldCBfID0NCiAgICDilIIgICBs
ZXQqIHggPSBmIDEgaW4NCiAgICDilIIgICBsZXQrIHkgPSBmIDIgaW4NCiAgICDilIIgICBMd3Qu
YmluZCAoZiAzKSAoZnVuIHogLT4NCiAgICDilIIgICAgIEx3dC5yZXR1cm4gKHggKyB5ICsgeikp
DQogICAg4pSU4pSA4pSA4pSA4pSADQoNCiAgICBpcyByZXdyaXR0ZW4gdG86DQoNCiAgICDilIzi
lIDilIDilIDilIANCiAgICDilIIgbGV0IF8gPQ0KICAgIOKUgiAgIGxldCB4ID0gZiAxIGluDQog
ICAg4pSCICAgbGV0IHkgPSBmIDIgaW4NCiAgICDilIIgICBsZXQgeiA9IGYgMyBpbg0KICAgIOKU
giAgIHggKyB5ICsgeg0KICAgIOKUlOKUgOKUgOKUgOKUgA0KDQogICAgSXQgYWxzbyByZXdyaXRl
IGBMd3QnIGZ1bmN0aW9uIGNhbGxzIHRvIHRoZWlyIGVxdWl2YWxlbnQgaW4gYEVpbycNCiAgICBh
bmQgaGFuZGxlcyBtYW55IElPIG9wZXJhdGlvbnMuDQoNCiAgICBVbmZvcnR1bmF0ZWx5LCB0aGlz
IHRvb2wgZG9lc27igJl0IGdlbmVyYXRlIGZ1bGx5IGVxdWl2YWxlbnQgY29kZSBhbmQNCiAgICBy
ZXF1aXJlcyBtYW51YWwgbW9kaWZpY2F0aW9ucy4gQ29tbWVudHMgYXJlIGluc2VydGVkIGluIG1h
bnkgcGxhY2VzDQogICAgd2hlcmUgaW50ZXJ2ZW50aW9uIGlzIG5lZWRlZC4NCg0KICAgIEFuIGV4
YW1wbGUgb2YgZ2VuZXJhdGVkIGluY29ycmVjdCBjb2RlIGlzOg0KDQogICAg4pSM4pSA4pSA4pSA
4pSADQogICAg4pSCIGxldCBfID0NCiAgICDilIIgICBsZXQgYSA9IG9wZXJhdGlvbl8xICgpIGlu
DQogICAg4pSCICAgbGV0KiBiID0gb3BlcmF0aW9uXzIgKCkgaW4NCiAgICDilIIgICBsZXQqIGEg
PSBhIGluDQogICAg4pSCICAgTHd0LnJldHVybiAoYSArIGIpDQogICAg4pSU4pSA4pSA4pSA4pSA
DQoNCiAgICB3aGljaCBpcyByZXdyaXR0ZW4gaW50bzoNCg0KICAgIOKUjOKUgOKUgOKUgOKUgA0K
ICAgIOKUgiBsZXQgXyA9DQogICAg4pSCICAgbGV0IGEgPSBvcGVyYXRpb25fMSAoKSBpbg0KICAg
IOKUgiAgIGxldCBiID0gb3BlcmF0aW9uXzIgKCkgaW4NCiAgICDilIIgICBsZXQgYSA9IGEgaW4N
CiAgICDilIIgICBhICsgYg0KICAgIOKUlOKUgOKUgOKUgOKUgA0KDQogICAgVGhpcyBpcyBpbmNv
cnJlY3QgYmVjYXVzZSBgb3BlcmF0aW9uXzEnIGFuZCBgb3BlcmF0aW9uXzInIGFyZSBub3cNCiAg
ICBzZXF1ZW50aWFsIGJ1dCB3ZXJlIGNvbmN1cnJlbnQgYmVmb3JlLiBUaGlzIGlzIGEgY2FzZSBv
ZiBhbiBpbXBsaWNpdA0KICAgIGZvcmsgdGhhdCBjYW5ub3QgZWFzaWx5IGJlIGRldGVjdGVkLiBU
aGUgY29ycmVjdCB0cmFuc2Zvcm1hdGlvbg0KICAgIHdvdWxkIGJlOg0KDQogICAg4pSM4pSA4pSA
4pSA4pSADQogICAg4pSCIGxldCBfID0NCiAgICDilIIgICBsZXQgYSwgYiA9IEVpby5GaWJlci5w
YWlyIG9wZXJhdGlvbl8xIG9wZXJhdGlvbl8yIGluDQogICAg4pSCICAgYSArIGINCiAgICDilJTi
lIDilIDilIDilIANCg0KICAgIFdlIGNvdWxkIGFjaGlldmUgdGhlIG1pZ3JhdGlvbiBvbiBbZWxp
b21dIGFuZCBbb2NzaWdlbnNlcnZlcl0NCg0KICBBbGwgdGhlIHRvb2xzIHVzZSBPQ2FtbGZvcm1h
dCB1bmRlciB0aGUgaG9vZCB0byBnZW5lcmF0ZSB0aGUNCiAgY29kZS4gVGhpcyBoYXMgdGhlIGlu
Y29udmVuaWVudCBvZiBlbmZvcmNpbmcgdGhlIHVzZSBvZiBPQ2FtbGZvcm1hdA0KICBiZWZvcmUg
dXNpbmcgdGhlbSBhcyB0aGV5IHdpbGwgcmVmb3JtYXQgdGhlIGVudGlyZSBjb2RlYmFzZS4NCg0K
ICBUaGUgbGFzdCB0d28gdG9vbHMgdXNlIE1lcmxpbiB1bmRlciB0aGUgaG9vZCB0byBsb2NhdGUg
dXNlcyBvZiBgTHd0Jw0KICBmdW5jdGlvbnMgaW4gdGhlIHNvdXJjZSBmaWxlcy4gVGhpcyB3b3Jr
cyBieSByZWFkaW5nIE1lcmxpbuKAmXMNCiAgb2NhbWwtaW5kZXggZmlsZXMgYnVpbHQgYnkgRHVu
ZSB0byBleHRyYWN0IHRoZSBsb2NhdGlvbiBpbiB0aGUgc291cmNlDQogIGZpbGVzIHRoYXQgd2Ug
bmVlZC4NCg0KICBDdXJyZW50bHksIGl0IG9ubHkgc3VwcG9ydHMgRWlvIGFzIGEgYmFja2VuZCBi
dXQgY2FuIGVhc2lseSBiZQ0KICBbYWRhcHRlZF0gdG8gb3RoZXIgZGlyZWN0LXN0eWxlIGNvbmN1
cnJlbmN5IGxpYnJhcmllcy4NCg0KICBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgdGhhbmtz
IHRvIHRoZSBzdXBwb3J0IG9mIHRoZSBbTkdJIFplcm8NCiAgQ29yZSBmdW5kXSB0aHJvdWdoIHRo
ZSBbTmxuZXQgZm91bmRhdGlvbl0sIGFuZCBpcyBwZXJmb21lZCBieQ0KICBbVGFyaWRlc10uDQoN
Cg0KW29jc2lnZW5zZXJ2ZXJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9vY3NpZ2Vuc2Vy
dmVyL3B1bGwvMjU2Pg0KDQpbZWxpb21dIDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9lbGlv
bS9wdWxsLzg0Nj4NCg0KW29jc2lnZW5zZXJ2ZXJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdl
bi9vY3NpZ2Vuc2VydmVyL3B1bGwvMjY5Pg0KDQpbYWRhcHRlZF0NCjxodHRwczovL2dpdGh1Yi5j
b20vdGFyaWRlcy9jaWFvLWx3dC9ibG9iL21haW4vYmluL2NpYW9fbHd0L3RvX2RpcmVjdF9zdHls
ZS9jb25jdXJyZW5jeV9iYWNrZW5kLm1sPg0KDQpbTkdJIFplcm8gQ29yZSBmdW5kXSA8aHR0cHM6
Ly9ubG5ldC5ubC90aGVtYS9OR0laZXJvQ29yZS5odG1sPg0KDQpbTmxuZXQgZm91bmRhdGlvbl0g
PGh0dHBzOi8vbmxuZXQubmwvPg0KDQpbVGFyaWRlc10gPGh0dHBzOi8vdGFyaWRlcy5jb20vPg0K
DQoNCkZpcnN0IGFscGhhIHJlbGVhc2Ugb2YgT0NhbWwgNS41LjANCuKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp
c2N1c3Mub2NhbWwub3JnL3QvZmlyc3QtYWxwaGEtcmVsZWFzZS1vZi1vY2FtbC01LTUtMC8xNzg1
Ni8xPg0KDQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEZvdXIgbW9udGhzIGFmdGVyIHRo
ZSByZWxlYXNlIG9mIE9DYW1sIDUuNC4wLCB0aGUgc2V0IG9mIG5ldyBmZWF0dXJlcw0KICBmb3Ig
dGhlIGZ1dHVyZSB2ZXJzaW9uIDUuNS4wIG9mIE9DYW1sIGhhcyBiZWVuIGZyb3plbi4gV2UgYXJl
IHRodXMNCiAgaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IGFscGhhIHJlbGVhc2UgZm9yIE9D
YW1sIDUuNS4wLg0KDQogIFRoaXMgYWxwaGEgdmVyc2lvbiBpcyBoZXJlIHRvIGhlbHAgZmVsbG93
IGhhY2tlcnMgam9pbiB1cyBlYXJseSBpbiBvdXINCiAgYnVnIGh1bnRpbmcgYW5kIG9wYW0gZWNv
c3lzdGVtIGZpeGluZyBmdW4gKHNlZSBiZWxvdyBmb3IgdGhlDQogIGluc3RhbGxhdGlvbiBpbnN0
cnVjdGlvbnMpLiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWxlYXNlIHByb2Nlc3MNCiAg
aXMgYXZhaWxhYmxlIGF0DQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi90
cnVuay9yZWxlYXNlLWluZm8vaW50cm9kdWN0aW9uLm1kPi4NCg0KICBUaGUgcHJvZ3Jlc3Mgb24g
c3RhYmlsaXNpbmcgdGhlIGVjb3N5c3RlbSBpcyB0cmFja2VkIG9uIHRoZSBbb3BhbQ0KICByZWFk
aW5lc3MgZm9yIDUuNS4wIG1ldGEtaXNzdWVdIC4NCg0KICBUaGVyZSBpcyBhbHNvIGEgY29tcGFu
aW9uIGFscGhhIG9wYW0gcmVwb3NpdG9yeSBhdmFpbGFibGUgZm9yIHRoaXMNCiAgYWxwaGEgcmVs
ZWFzZQ0KICDilIzilIDilIDilIDilIANCiAg4pSCICQgb3BhbSByZXBvIGFkZCBhbHBoYSBnaXQr
aHR0cHM6Ly9naXRodWIuY29tL2tpdC10eS1rYXRlL29wYW0tYWxwaGEtcmVwb3NpdG9yeS5naXQN
CiAg4pSU4pSA4pSA4pSA4pSADQogIHdoaWNoIGNvbnRhaW5zIGluLXByb2dyZXNzIGFscGhhIHJl
bGVhc2VzIG9mIG9wYW0gcGFja2FnZXMgdGhhdCBhcmUNCiAgYmVpbmcgdXBkYXRlZCBmb3IgT0Nh
bWwgNS41LjAgLg0KDQogIFRoZSBmdWxsIHJlbGVhc2UgaXMgZXhwZWN0ZWQgYmV0d2VlbiBNYXkg
YW5kIEp1bmUuIFRoZXJlIGFyZSBtb3JlDQogIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUg
W3Byb3NwZWN0aXZlIHJlbGVhc2UgY2FsZW5kYXJdLg0KDQogIElmIHlvdSBmaW5kIGFueSBidWdz
LCBwbGVhc2UgcmVwb3J0IHRoZW0gb24gdGhlIFtPQ2FtbCdzIGlzc3VlDQogIHRyYWNrZXJdLg0K
DQogIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgb25nb2luZyBsaXN0IG9mIG5ldyBmZWF0
dXJlcyBhbmQgYnVnDQogIGZpeGVzLCB0aGUgdXBkYXRlZCBbY2hhbmdlIGxvZyBmb3IgT0NhbWwg
NS41LjAgaXMgYXZhaWxhYmxlIG9uDQogIEdpdEh1Yl0uDQoNCiAgSGFwcHkgaGFja2luZywgRmxv
cmlhbiBBbmdlbGV0dGkgZm9yIHRoZSBPQ2FtbCB0ZWFtDQoNCg0KW29wYW0gcmVhZGluZXNzIGZv
ciA1LjUuMCBtZXRhLWlzc3VlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9z
aXRvcnkvaXNzdWVzLzI5NDYzPg0KDQpbcHJvc3BlY3RpdmUgcmVsZWFzZSBjYWxlbmRhcl0NCjxo
dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi90cnVuay9yZWxlYXNlLWluZm8vY2Fs
ZW5kYXIubWQ+DQoNCltPQ2FtbCdzIGlzc3VlIHRyYWNrZXJdIDxodHRwczovL2dpdGh1Yi5jb20v
b2NhbWwvb2NhbWwvaXNzdWVzPg0KDQpbY2hhbmdlIGxvZyBmb3IgT0NhbWwgNS41LjAgaXMgYXZh
aWxhYmxlIG9uIEdpdEh1Yl0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi81
LjUvQ2hhbmdlcz4NCg0KSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucw0K4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWMDQoNCiAgVGhlIGJhc2UgY29tcGlsZXIgY2FuIGJlIGluc3RhbGxlZCBhcyBhbiBvcGFtIHN3
aXRjaCB3aXRoIHRoZQ0KICBmb2xsb3dpbmcgY29tbWFuZHMgb24gb3BhbSAyLjEgYW5kIGxhdGVy
Og0KDQogIG9wYW0gdXBkYXRlIG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjUuMH5hbHBoYTENCg0KICBU
aGUgc291cmNlIGNvZGUgZm9yIHRoZSBhbHBoYSBpcyBhbHNvIGF2YWlsYWJsZSBhdCB0aGVzZSBh
ZGRyZXNzZXM6DQoNCiAg4oCiIEdpdEh1YjogPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft
bC9hcmNoaXZlLzUuNS4wLWFscGhhMS50YXIuZ3o+DQogIOKAoiBPQ2FtbCBhcmNoaXZlcyBhdCBJ
bnJpYToNCiAgICA8aHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1sLTUuNS9v
Y2FtbC01LjUuMH5hbHBoYTEudGFyLmd6Pg0KDQoNCkZpbmUtVHVuZWQgQ29tcGlsZXIgQ29uZmln
dXJhdGlvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg
SWYgeW91IHdhbnQgdG8gdHdlYWsgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBpbGVyLCB5
b3UgY2FuIHN3aXRjaA0KICB0byB0aGUgb3B0aW9uIHZhcmlhbnQgd2l0aDoNCg0KICDilIzilIDi
lIDilIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgPHN3
aXRjaF9uYW1lPiBvY2FtbC12YXJpYW50cy41LjUuMH5hbHBoYTErb3B0aW9ucyA8b3B0aW9uX2xp
c3Q+DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIHdoZXJlIGBvcHRpb25fbGlzdCcgaXMgYSBzcGFj
ZSBzZXBhcmF0ZWQgbGlzdCBvZiBgb2NhbWwtb3B0aW9uLSonDQogIHBhY2thZ2VzLiBGb3IgaW5z
dGFuY2UsIGZvciBhIGZsYW1iZGEgYW5kIG5vLWZsYXQtZmxvYXQtYXJyYXkgc3dpdGNoOg0KICDi
lIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjUuMH5hbHBoYTErZmxh
bWJkYStuZmZhIG9jYW1sLXZhcmlhbnRzLjUuNS4wfmFscGhhMStvcHRpb25zIG9jYW1sLW9wdGlv
bi1mbGFtYmRhIG9jYW1sLW9wdGlvbi1uby1mbGF0LWZsb2F0LWFycmF5DQogIOKUlOKUgOKUgOKU
gOKUgA0KDQogIEFsbCBhdmFpbGFibGUgb3B0aW9ucyBjYW4gYmUgbGlzdGVkIHdpdGggYG9wYW0g
c2VhcmNoIG9jYW1sLW9wdGlvbicuDQoNCg0KTm90SW5yaWFDYW1sX1N0ZC5XZW52QDAuMS4wIC0g
Y3JlYXRlIFdpbmRvd3MgZW52cyBvbiBtYWNPUyBbZGswXQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbm90aW5y
aWFjYW1sLXN0ZC13ZW52LTAtMS0wLWNyZWF0ZS13aW5kb3dzLWVudnMtb24tbWFjb3MtZGswLzE3
ODU4LzE+DQoNCg0KamJlY2tmb3JkIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUg
dG8gYW5ub3VuY2UgdGhlIGZvbGxvd2luZyBwYWNrYWdlIGZvciBbdGhlIGRrMCBidWlsZA0KICBz
eXN0ZW1dIHRoYXQgY3JlYXRlcyBhIFdpbmRvd3MgZW52aXJvbm1lbnQgKCJ3ZW52IikgdXNpbmcg
YSBjdXN0b20NCiAgV2luZSBidWlsZCBmb3IgbWFjT1M6DQoNCiAg4oCiIFtOb3RJbnJpYUNhbWxf
U3RkLldlbnZAMC4xLjBdDQoNCiAgSGVyZSBpcyBhIHNhbXBsZSBzZXNzaW9uOg0KDQogIOKUjOKU
gOKUgOKUgOKUgA0KICDilIIgIyBTaW1wbGVzdCB3YXkgdG8gaW5zdGFsbCBkazAgdG9kYXkuIFVz
ZSB+Z2l0IHB1bGx+IGlmIGV4aXN0cyBhbHJlYWR5LiANCiAg4pSCICQgZ2l0IGNsb25lIC0tYnJh
bmNoIFYyXzUgaHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9kay5naXQgZGtzcmMNCiAg4pSCIA0K
ICDilIIgIyBDbGVhciBvdXQgZGF0YSwgY2FjaGUgYW5kIGludGVybWVkaWF0ZSBmaWxlcyBmcm9t
IGFueSBwcmlvcg0KICDilIIgIyBleHBlcmltZW50cyAoZnJvbSB0aGUgIi0tdHJpYWwiIG9wdGlv
biBzZWVuIGluIFtBTk5dIHBvc3RzKQ0KICDilIIgJCBybSAtcmYgdC8NCiAg4pSCIA0KICDilIIg
IyBXaXRoIHRoZSBkZWZhdWx0IEx1YSBydWxlcyAoIi1JIGRrc3JjL2V0Yy9kay92IiksIHJ1biB0
aGUNCiAg4pSCICMgT0NhbWwgV2luZG93cyBlbnZpcm9ubWVudCBjcmVhdGlvbiBydWxlICgicnVu
DQogIOKUgiAjIE5vdElucmlhQ2FtbF9TdGQuV2Vudi5DcmVhdGVAMC4xLjAiKS4gVGVsbCB0aGUg
cnVsZSB0byBjcmVhdGUgdGhlDQogIOKUgiAjIHdlbnYgYXQgdGFyZ2V0L215LXdlbnYvICgiZGly
PS4uLiIpIGFuZCBtYWtlIGEgbW91bnQNCiAg4pSCICMgKCJtb3VudFtdPS4uLiIpIGluc2lkZSB0
aGUgd2VudiB3aGVyZSB0aGUgVW5peCBkaXJlY3RvcnkgJFBXRCBpcw0KICDilIIgIyBtYXBwZWQg
dG8gV2luZG93cyBNOlxwcm9qZWN0LiBEZXBlbmRpbmcgb24gSW50ZXJuZXQsIGV4cGVjdCAzLTQN
CiAg4pSCICMgbWludXRlcyBmb3IgYSBzaW5nbGUtdGhyZWFkZWQgZG93bmxvYWQgb2YgYXJ0aWZh
Y3RzICg1ODFNQikuDQogIOKUgiAkIGRrc3JjL2RrMCAtLXRyaWFsIC1JIGRrc3JjL2V0Yy9kay92
IFwNCiAg4pSCICAgICBydW4gTm90SW5yaWFDYW1sX1N0ZC5XZW52LkNyZWF0ZUAwLjEuMCBcDQog
IOKUgiAgICAgZGlyPSRQV0QvdGFyZ2V0L215LXdlbnYgXA0KICDilIIgICAgICJtb3VudFtdPXR5
cGU9YmluZCxzcmM9JFBXRCxkc3Q9TTovcHJvamVjdCINCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg
4pSM4pSA4pSA4pSA4pSADQogIOKUgiAjIFRoZW4gZW50ZXIgdGhlIHdlbnYgYnkgcnVubmluZyBD
b21tYW5kIFByb21wdCAoImNtZC5leGUiKS4gVHVybg0KICDilIIgIyBvZmYgV2luZSBkZWJ1ZyBt
ZXNzYWdlcyAoIldJTkVERUJVRz0tYWxsIikuIFJlbWVtYmVyIHRoYXQNCiAg4pSCICMgQ3RybC1a
IGlzIHRoZSBXaW5kb3dzIGVxdWl2YWxlbnQgb2YgQ3RybC1EIChFT0YpIGluIFVuaXguDQogIOKU
giAkIFdJTkVERUJVRz0tYWxsIHRhcmdldC9teS13ZW52L2Jpbi9lbnRlciBjbWQuZXhlDQogIOKU
giANCiAg4pSCIE1pY3Jvc29mdCBXaW5kb3dzIDEwLjAuMTkwNDUNCiAg4pSCIFo6XD4gb2NhbWxv
cHQgLWNvbmZpZw0KICDilIIgWjpcPiBnY2MgLS12ZXJzaW9uDQogIOKUgiBaOlw+IGRpciBNOg0K
ICDilIIgMDIvMjcvMjAyNiAxMDoyNCBBTSA8RElSPiBwcm9qZWN0DQogIOKUgiBaOlw+IG9jYW1s
DQogIOKUgiBPQ2FtbCB2ZXJzaW9uIDUuNC4xDQogIOKUgiANCiAg4pSCIEVudGVyICNoZWxwOzsg
Zm9yIGhlbHAuDQogIOKUgiANCiAg4pSCICMgMSsxIDs7DQogIOKUgiAtIDogaW50ID0gMg0KICDi
lIIgDQogIOKUgiAjIF5aDQogIOKUgiANCiAg4pSCIFo6XD4gZWNobyBsZXQgKCkgPSBwcmludF9l
bmRsaW5lICJhYmN4eXoiID4gbGV0dGVycy5tbA0KICDilIIgWjpcPiBvY2FtbG9wdCAtbyBsZXR0
ZXJzLmV4ZSBsZXR0ZXJzLm1sDQogIOKUgiBaOlw+IC5cbGV0dGVycy5leGUNCiAg4pSCIGFiY3h5
eg0KICDilIIgWjpcPiBleGl0DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIERldGFpbHM6DQoNCiAg
4oCiIE1pbkdXIHdpdGggVUNSVCBXaW5kb3dzIEFQSSBhbmQgTExWTSB0b29sY2hhaW4gKGxsdm0t
bWluZ3cpIGZvciBXaW5lDQogICAgb24gdGhlIGhvc3QgKG1hY09TKS4gWDExIGhhcyBiZWVuIGRp
c2FibGVkLg0KICDigKIgTWluR1cgd2l0aCBNU1ZDUlQgV2luZG93cyBBUEkgYW5kIEdOVSBjb21w
aWxlciBhbmQgQnVzeUJveCBiaW5hcmllcw0KICAgICh3NjRkZXZraXQpIGluc2lkZSBXaW5kb3dz
IGd1ZXN0Lg0KICDigKIgV2luZSBoYXMgZ29vZCBzdXBwb3J0IGZvciBwcm9ncmFtcyB0aGF0IHVz
ZSBXaW5kb3dzIGNvbnZlbnRpb25zDQogICAgKE1TVkMsIFdpbmRvd3MgQVBJIHJhdGhlciB0aGFu
IGBzeXNjYWxsJywgZXRjKS4gQnV0IHRoZXJlIGFyZQ0KICAgIGltcG9ydGFudCBwcm9ncmFtcyB0
aGF0IHdvbid0IHdvcmsgY29ycmVjdGx5IHRvZGF5OiBNU1lTMi9DeWd3aW4sDQogICAgUnVzdCB1
dXRpbHMuDQoNCiAgRW5qb3khIOKAk2pvbmFoDQoNCg0KW3RoZSBkazAgYnVpbGQgc3lzdGVtXQ0K
PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdGhlLWRrMC1idWlsZC1zeXN0ZW0vMTc3
MDk+DQoNCltOb3RJbnJpYUNhbWxfU3RkLldlbnZAMC4xLjBdDQo8aHR0cHM6Ly9naXRodWIuY29t
L2Rpc2t1di9kay9ibG9iL2EyOWU5ZGEzZjMwZGY0MWZhM2NmYzg1NWIzMjNmZGNkYTZhMTA2YzIv
ZXRjL2RrL3YvTm90SW5yaWFDYW1sX1N0ZC9XZW52LnZhbHVlcy5sdWE+DQoNCg0KUnVubmluZyBS
ZWFsIERvY2tlciBDb250YWluZXJzIGluIE9DYW1sIFRlc3RzDQrilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ydW5u
aW5nLXJlYWwtZG9ja2VyLWNvbnRhaW5lcnMtaW4tb2NhbWwtdGVzdHMvMTc4NTkvMT4NCg0KDQpT
YWNoaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIANCg0KICBIaSBldmVyeW9uZSwNCg0KICBJ4oCZdmUgYmVlbiB3b3JraW5nIG9uIGEg
cHJvamVjdCBjYWxsZWQgKlt0ZXN0Y29udGFpbmVycy1vY2FtbF0qLCB3aGljaA0KICBicmluZ3Mg
VGVzdGNvbnRhaW5lcnMgc3R5bGUgaW50ZWdyYXRpb24gdGVzdGluZyB0byBPQ2FtbC4NCg0KICBU
aGUgaWRlYSBpcyBzaW1wbGU6DQoNCiAgICAgICAgSW5zdGVhZCBvZiBtb2NraW5nIGluZnJhc3Ry
dWN0dXJlIChQb3N0Z3JlcywgUmVkaXMsIEthZmthLA0KICAgICAgICBldGMuKSwgc3RhcnQgcmVh
bCBEb2NrZXIgY29udGFpbmVycyBpbnNpZGUgeW91ciB0ZXN0IHN1aXRlDQogICAgICAgIGFuZCB0
ZWFyIHRoZW0gZG93biBhdXRvbWF0aWNhbGx5Lg0KDQogIOKAlA0KDQoNClt0ZXN0Y29udGFpbmVy
cy1vY2FtbF0NCjxodHRwczovL2dpdGh1Yi5jb20vYmVub2Rpd2FsL3Rlc3Rjb250YWluZXJzLW9j
YW1sPg0KDQpXaHk/DQrilYzilYzilYzilYwNCg0KICBJbiBtYW55IE9DYW1sIHByb2plY3RzLCBp
bnRlZ3JhdGlvbiB0ZXN0cyBlaXRoZXI6DQoNCiAg4oCiIFJlbHkgb24gbW9ja3MNCg0KICDigKIg
RGVwZW5kIG9uIGdsb2JhbGx5IHJ1bm5pbmcgc2VydmljZXMNCg0KICDigKIgT3IgYXJlIHNraXBw
ZWQgZW50aXJlbHkgaW4gQ0kNCg0KICBNb2NrcyBhcmUgdXNlZnVsLCBidXQgdGhleSBkb27igJl0
IGNhdGNoIGlzc3VlcyBsaWtlOg0KDQogIOKAoiBTY2hlbWEgbWlzbWF0Y2hlcw0KDQogIOKAoiBD
b25uZWN0aW9uIHBvb2wgYmVoYXZpb3INCg0KICDigKIgUmVhbCBuZXR3b3JraW5nIGZhaWx1cmVz
DQoNCiAg4oCiIFN0YXJ0dXAgdGltaW5nIHByb2JsZW1zDQoNCiAg4oCiIE1pZ3JhdGlvbiBpc3N1
ZXMNCg0KICBTcGlubmluZyB1cCBkaXNwb3NhYmxlIGNvbnRhaW5lcnMgcGVyIHRlc3QgZ2l2ZXMg
dXM6DQoNCiAg4oCiIElzb2xhdGVkIHRlc3QgZW52aXJvbm1lbnRzDQoNCiAg4oCiIE5vIHNoYXJl
ZCBnbG9iYWwgc3RhdGUNCg0KICDigKIgQ0kgcmVwcm9kdWNpYmlsaXR5DQoNCiAg4oCiIFJlYWwg
aW5mcmFzdHJ1Y3R1cmUgYmVoYXZpb3INCg0KDQpDdXJyZW50IFN0YXR1cw0K4pWM4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIHByb2plY3QgaXMgY3VycmVu
dGx5IGluY3ViYXRpbmcgdW5kZXIgdGhlIERvY2tlciBvcmdhbml6YXRpb24uDQoNCiAgSeKAmW0g
c3RpbGwgYWN0aXZlbHkgc2hhcGluZyB0aGUgQVBJIGFuZCB3b3VsZCByZWFsbHkgYXBwcmVjaWF0
ZQ0KICBmZWVkYmFjayBmcm9tIHRoZSBPQ2FtbCBjb21tdW5pdHkgb246DQoNCiAg4oCiIEFQSSBl
cmdvbm9taWNzDQoNCiAg4oCiIFByZWJ1aWx0IG1vZHVsZXMgKFBvc3RncmVzLCBSZWRpcywgZXRj
LikNCg0KICDigKIgVGVzdGluZyBiZXN0IHByYWN0aWNlcyBpbiBPQ2FtbA0KDQogIElmIGFueW9u
ZSBoZXJlIGhhcyBleHBlcmllbmNlIHdpdGggaW50ZWdyYXRpb24gdGVzdGluZyBwYXR0ZXJucyBp
bg0KICBPQ2FtbCwgSeKAmWQgbG92ZSB0byBoZWFyIHRob3VnaHRzLg0KDQogIFRoYW5rcyENCg0K
DQpJIHdyb3RlIGEgRFNMIGZvciBBSSBwZXJzb25hbGl0aWVzIGluIE9DYW1sDQrilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ktd3Jv
dGUtYS1kc2wtZm9yLWFpLXBlcnNvbmFsaXRpZXMtaW4tb2NhbWwvMTc4NjAvMT4NCg0KDQpHcmlm
ZmluIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSADQoNCiAgSGkgZ3V5cywNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL0dyaWZmaW5D
YW5Db2RlL0NhbGxvc3VtPg0KDQogIDxodHRwczovL3B5cGkub3JnL3Byb2plY3QvY2FsbG9zdW0t
ZHNsLz4NCg0KICBJIHdhbnRlZCBhIG1vcmUgZGV0ZXJtaW5pc3RpYyB3YXkgdG8gY3JlYXRlIHBl
cnNvbmFsaXRpZXMgZm9yIG15IEFJDQogIGFnZW50cyB0aGF0IHdhcyBjb25zaXN0ZW50IGluIHBy
b2R1Y3Rpb24uIFRoZSBpbnRlcmVzdGluZyBjYXRjaCBiZWluZw0KICB0aGF0IHRoZSBjb21waWxl
ciBoYWQgdG8gb3V0cHV0IGEgcHJvbXB0LCBhbmQgaXQgbmVlZGVkIHRvIGJlDQogIGFjY2Vzc2li
bGUgZm9yIGFnZW50cyBpbiBQeXRob24uIFRoZSBzb2x1dGlvbiB3YXMgdGhpcyBEU0wsIGEgZm9y
bWF0DQogIGZvciB3cml0aW5nIGRldGVybWluaXN0aWMgY2F0ZWdvcmllcyAoc2ltaWxhciB0byBZ
QU1MKSB0aGF0IGNvbXBpbGUgdG8NCiAgYSBwcm9tcHQgaW5qZWN0YWJsZSBpbnRvIExhbmdjaGFp
biBhZ2VudHMuIE9DYW1sIHdhcyB0aGUgbmF0dXJhbA0KICBjaG9pY2UgZHVlIHRvIGl0cyBwZXJm
b3JtYW5jZSBhbmQgcHJvdmVuIGNhcGFiaWxpdGllcyB0byBob3N0DQogIGNvbXBpbGVycyAoUnVz
dCBvYnYpLiBMb29raW5nIGZvciBiZXRhIHRlc3RlcnMgYW5kIGFueSBmZWVkYmFjayBpcw0KICB3
ZWxjb21lIQ0KDQoNCk91dHJlYWNoeSBNYXkgMjAyNg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlz
Y3Vzcy5vY2FtbC5vcmcvdC9vdXRyZWFjaHktbWF5LTIwMjYvMTc4NjMvMT4NCg0KDQpQYXRyaWNr
IEZlcnJpcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlbGxvIGV2ZXJ5b25lLA0K
DQogIFRoZSBPQ2FtbCBjb21tdW5pdHkgaGFzIHNpZ25lZCB1cCB0byBPdXRyZWFjaHkgTWF5IDIw
MjYgKHNlZSBbcGFzdF0NCiAgW3Bvc3RzXSkhDQoNCiAgICAgICAgKldoYXQgaXMgT3V0cmVhY2h5
PyoNCg0KICAgICAgICBPdXRyZWFjaHkgaXMgYSBwYWlkLCByZW1vdGUgaW50ZXJuc2hpcCBwcm9n
cmFtLiBPdXRyZWFjaHkNCiAgICAgICAgcHJvbW90ZXMgZGl2ZXJzaXR5IGluIG9wZW4gc291cmNl
IGFuZCBvcGVuIHNjaWVuY2UuIE91cg0KICAgICAgICBpbnRlcm5zaGlwcyBhcmUgZm9yIHBlb3Bs
ZSB3aG8gZmFjZSB1bmRlci1yZXByZXNlbnRhdGlvbiwNCiAgICAgICAgYW5kIGRpc2NyaW1pbmF0
aW9uIG9yIHN5c3RlbWljIGJpYXMgaW4gdGhlIHRlY2hub2xvZ3kNCiAgICAgICAgaW5kdXN0cnkg
b2YgdGhlaXIgY291bnRyeS4NCg0KICBUaGUgY3VycmVudCByb3VuZCBpcyBzdGlsbCBvbmdvaW5n
IHdpdGggaW50ZXJucyBtYWtpbmcgZ3JlYXQgcHJvZ3Jlc3MNCiAgd2l0aCBAdG1hdHRpbyBvbiBb
UmF2ZW5dLCB3aXRoIEB4dncgb24gW1lPQ2FtbF0gYW5kIHdpdGggbXlzZWxmIG9uDQogIFtvY2Ft
bC10aWZmXS4NCg0KDQpbcGFzdF0gPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vdXRyZWFj
aHktZGVjZW1iZXItMjAyNC1yb3VuZD4NCg0KW3Bvc3RzXSA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s
Lm9yZy90L291dHJlYWNoeS1qdW5lLTIwMjU+DQoNCltSYXZlbl0gPGh0dHBzOi8vcmF2ZW4tbWwu
ZGV2Lz4NCg0KW1lPQ2FtbF0gPGh0dHBzOi8veW9jYW1sLmdpdGh1Yi5pby9kb2MveW9jYW1sL2lu
ZGV4Lmh0bWw+DQoNCltvY2FtbC10aWZmXSA8aHR0cHM6Ly9naXRodWIuY29tL2dlb2NhbWwvb2Nh
bWwtdGlmZi8+DQoNCkltcG9ydGFudCBEYXRlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgRm9yIHRoaXMgbmV4dCByb3VuZCwgdGhlIGltcG9ydGFu
dCBkYXRlcyBhcmUgYXMgZm9sbG93cyAodGhlc2UgYXJlDQogIGFsd2F5cyBzdWJqZWN0IHRvIHNv
bWUgY2hhbmdlKToNCg0KICDigKIgTWFyIDEgLSBDb21tdW5pdHkgc2lnbiB1cCBkZWFkbGluZSA6
d2hpdGVfY2hlY2tfbWFyazoNCiAg4oCiIE1hciAxNCAtIFtNZW50b3IgU2lnbnVwXQ0KICDigKIg
TWFyIDE3IHRvIEFwciAxNSAtIENvbnRyaWJ1dGlvbiBwZXJpb2QNCiAg4oCiIE1heSAxOCB0byBB
dWcgMTcgLSBJbnRlcm5zaGlwIHBlcmlvZA0KDQogICpPdXIgbmV4dCBkZWFkbGluZSBpcyBmb3Ig
bWVudG9ycyB0byBzaWduIHVwIHRvIHRoZSBPQ2FtbCBjb21tdW5pdHkqDQogICB3aXRoIGEgcHJv
amVjdCBpZGVhLiBQbGVhc2UgZG8gY29uc2lkZXIgYmVpbmcgYW4gT3V0cmVhY2h5IG1lbnRvci4g
SWYNCiAgIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb3IgaWRlYXMgeW91IGNhbiBhbHdheXMgcmVh
Y2ggb3V0IHRvIG1lDQogICBkaXJlY3RseS4gSWYgeW91IG5lZWQgYSByZWZyZXNoZXIgb2YgcGFz
dCBwcm9qZWN0cywgdGhlcmXigJlzIGENCiAgIGRlZGljYXRlZCBwYWdlIG9uIHRoZSBPQ2FtbCB3
ZWJzaXRlOiBbT0NhbWwgT3V0cmVhY2h5DQogICBJbnRlcm5zaGlwc10uIEZlZWwgZnJlZSB0byBk
aXNjdXNzIGlkZWFzIG9uIHRoaXMgdGhyZWFkIHRvbyENCg0KICBUaGUgT0NhbWwgY29tbXVuaXR5
IGlzIGN1cnJlbnRseSBhYmxlIHRvIGZpbmFuY2lhbGx5IHN1cHBvcnQgT3V0cmVhY2h5DQogIGlu
dGVybnNoaXBzIHRoYW5rcyB0byB0aGUgZ2VuZXJvdXMgc3VwcG9ydCBvZiBbVGFyaWRlc10gYW5k
DQogIFtKYW5lc3RyZWV0XS4gVGhpcyBpbmNsdWRlcyBiZWluZyBhYmxlIHRvIGZ1bmQgbWVudG9y
cyBhcyB3ZWxsLg0KDQogIFRoYW5rcyEgOmNhbWVsOg0KDQoNCltNZW50b3IgU2lnbnVwXSA8aHR0
cHM6Ly93d3cub3V0cmVhY2h5Lm9yZy9jb21tdW5pdGllcy9jZnAvb2NhbWwvPg0KDQpbT0NhbWwg
T3V0cmVhY2h5IEludGVybnNoaXBzXSA8aHR0cHM6Ly9vY2FtbC5vcmcvb3V0cmVhY2h5Pg0KDQpb
VGFyaWRlc10gPGh0dHBzOi8vdGFyaWRlcy5jb20+DQoNCltKYW5lc3RyZWV0XSA8aHR0cHM6Ly93
d3cuamFuZXN0cmVldC5jb20+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN
CiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2Fn
ZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUg
YXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlv
dSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vi
c2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltz
ZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+
DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0K
W1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv
Y3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBh
L2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBv
bW1lLm5ldC8+DQoNCg==
--=-=-=
Content-Type: text/html; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
<?xml version=3D"1.0" encoding=3D"utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml" lang=3D"en" xml:lang=3D"en">
<head>
<!-- 2026-03-03 Tue 14:54 -->
<meta http-equiv=3D"Content-Type" content=3D"text/html;charset=3Dutf-8" />
<meta name=3D"viewport" content=3D"width=3Ddevice-width, initial-scale=3D1"=
/>
<title>OCaml Weekly News</title>
<meta name=3D"generator" content=3D"Org Mode" />
<style type=3D"text/css">
#content { max-width: 60em; margin: auto; }
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #e6e6e6;
border-radius: 3px;
background-color: #f2f2f2;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: auto;
}
pre.src:before {
display: none;
position: absolute;
top: -8px;
right: 12px;
padding: 3px;
color: #555;
background-color: #f2f2f299;
}
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-authinfo::before { content: 'Authinfo'; }
pre.src-c:before { content: 'C'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'JavaScript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
<style type=3D"text/css">#table-of-contents h2 { display: none } .title { d=
isplay: none } .authorname { text-align: right }</style>
<style type=3D"text/css">.outline-2 {border-top: 1px solid black;}</style>
</head>
<body>
<div id=3D"content" class=3D"content">
<h1 class=3D"title">OCaml Weekly News</h1>
<p>
<a href=3D"https://alan.petitepomme.net/cwn/2026.02.24.html">Previous Week<=
/a> <a href=3D"https://alan.petitepomme.net/cwn/index.html">Up</a> <a href=
=3D"https://alan.petitepomme.net/cwn/2026.03.10.html">Next Week</a>
</p>
<p>
Hello
</p>
<p>
Here is the latest OCaml Weekly News, for the week of February 24 to March =
03, 2026.
</p>
<div id=3D"table-of-contents" role=3D"doc-toc">
<h2>Table of Contents</h2>
<div id=3D"text-table-of-contents" role=3D"doc-toc">
<ul>
<li><a href=3D"#1">Lwt.6.1.0, Lwt_ppx.6.1.0</a></li>
<li><a href=3D"#2">OCaml Platform Newsletter: November 2025 to January 2026=
</a></li>
<li><a href=3D"#3">Announcing the first release of Alice, a radical OCaml b=
uild system</a></li>
<li><a href=3D"#4">mnet, a new TCP/IP stack for unikernels in OCaml</a></li>
<li><a href=3D"#5">Experiment: format-line</a></li>
<li><a href=3D"#6">Caml in the Capital - Registrations Open!</a></li>
<li><a href=3D"#7">Experimental tools for migrating from Lwt to Eio</a></li>
<li><a href=3D"#8">First alpha release of OCaml 5.5.0</a></li>
<li><a href=3D"#9">[email protected] - create Windows envs on mac=
OS [dk0]</a></li>
<li><a href=3D"#10">Running Real Docker Containers in OCaml Tests</a></li>
<li><a href=3D"#11">I wrote a DSL for AI personalities in OCaml</a></li>
<li><a href=3D"#12">Outreachy May 2026</a></li>
<li><a href=3D"#org2b2f5f1">Old CWN</a></li>
</ul>
</div>
</div>
<div id=3D"outline-container-1" class=3D"outline-2">
<h2 id=3D"1">Lwt.6.1.0, Lwt_ppx.6.1.0</h2>
<div class=3D"outline-text-2" id=3D"text-1">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-lwt-6-1-0-lwt-ppx-6-1-0=
/17770/2">https://discuss.ocaml.org/t/ann-lwt-6-1-0-lwt-ppx-6-1-0/17770/2</=
a>
</p>
</div>
<div id=3D"outline-container-org1abc93d" class=3D"outline-3">
<h3 id=3D"org1abc93d">Continuing this thread, Rapha=C3=ABl Proust announced=
</h3>
<div class=3D"outline-text-3" id=3D"text-org1abc93d">
<p>
Lwt.6.1.1 has been released. It contains a fix to support build with OCaml.=
5.5. Thanks to @kit-ty-kate for the contribution.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-2" class=3D"outline-2">
<h2 id=3D"2">OCaml Platform Newsletter: November 2025 to January 2026</h2>
<div class=3D"outline-text-2" id=3D"text-2">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ocaml-platform-newsletter-n=
ovember-2025-to-january-2026/17845/1">https://discuss.ocaml.org/t/ocaml-pla=
tform-newsletter-november-2025-to-january-2026/17845/1</a>
</p>
</div>
<div id=3D"outline-container-org0598b11" class=3D"outline-3">
<h3 id=3D"org0598b11">Sabine Schmaltz announced</h3>
<div class=3D"outline-text-3" id=3D"text-org0598b11">
<p>
Welcome to the seventeenth edition of the OCaml Platform newsletter!
</p>
<p>
In this November 2025 to January 2026 edition, we are excited to bring you =
the latest on the OCaml Platform, continuing our tradition of highlighting =
recent developments as seen in <a href=3D"https://discuss.ocaml.org/tag/pla=
tform-newsletter">previous editions</a>. To understand the direction we're =
headed, especially regarding development workflows and user experience impr=
ovements, check out our <a href=3D"https://ocaml.org/docs/platform-roadmap"=
>roadmap</a>.
</p>
<p>
You can <a href=3D"https://www.linkedin.com/newsletters/ocaml-platform-news=
letter-7305270694567661568/">subscribe to this newsletter on LinkedIn</a>!
</p>
<p>
<b>Highlights:</b>
</p>
<ul class=3D"org-ul">
<li><b>opam 2.5.0 Released</b>: Major release featuring incremental opam fi=
le loading for up to 70% faster <code>opam update</code>, improved shell in=
tegration, and better macOS sandbox support</li>
<li><b>Relocatable OCaml Merged</b>: The final piece of the relocatable OCa=
ml puzzle was merged in December, enabling opam to clone switches instead o=
f recompiling them. This will be available in the first alpha release of OC=
aml 5.5</li>
<li><b>Dune 3.21.0</b>: Large release with dozens of fixes, improvements, a=
nd new features including OxCaml compiler support and copy-on-write file op=
erations</li>
<li><b>Enhanced Editor Support</b>: OCaml-LSP 1.25.0 adds <code>.mlx</code>=
file support with formatting, diagnostics, and code actions, plus new cust=
om requests</li>
<li><b>Merlin 5.6.1-504</b>: Performance optimizations, smarter signature h=
elp, and fixed completion for inlined record labels</li>
<li><b>opam-publish 2.7.1</b>: Fixes for GitHub API token permissions</li>
<li><b>dune-release 2.2.0</b>: Full compatibility with cmdliner 2.0.0</li>
<li><b>opam-repository Archival</b>: January 1, 2026 archival run removed 3=
,264 package versions to maintain repository sustainability</li>
</ul>
<p>
<b>Backstage OCaml:</b>
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://ocaml.org/backstage/2025-11-05-how-the-opam-reposito=
ry-works">OCaml Infrastructure: How the opam-repository Works</a> (Nov 5, 2=
025)</li>
</ul>
<p>
<b>Stable Releases:</b>
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://ocaml.org/changelog/2025-11-18-opam-publish-2.7.1">o=
pam-publish 2.7.1</a> (Nov 18, 2025)</li>
<li><a href=3D"https://ocaml.org/changelog/2025-11-27-opam-2.5.0">opam 2.5.=
0</a> (Nov 27, 2025)</li>
<li><a href=3D"https://ocaml.org/changelog/2025-12-20-merlin-v5-6-1-504">Me=
rlin 5.6.1-504</a> (Dec 20, 2025)</li>
<li><a href=3D"https://ocaml.org/changelog/2025-12-20-ocaml-lsp-1-25-0">OCa=
ml-LSP 1.25.0</a> (Dec 20, 2025)</li>
<li><a href=3D"https://ocaml.org/changelog/2026-01-16-dune-3-21-0">Dune 3.2=
1.0</a> (Jan 16, 2026)</li>
<li><a href=3D"https://ocaml.org/changelog/dune-release/2026-01-29-dune-rel=
ease-2.2.0">dune-release 2.2.0</a> (Jan 29, 2026)</li>
</ul>
<p>
<b>Unstable Releases:</b>
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://ocaml.org/changelog/2025-11-20-opam-2-5-0-rc1">opam =
2.5.0~rc1</a> (Nov 20, 2025)</li>
<li><a href=3D"https://ocaml.org/changelog/2025-11-10-opam-2-5-0-beta1">opa=
m 2.5.0~beta1</a> (Nov 10, 2025)</li>
</ul>
</div>
<div id=3D"outline-container-orgc4e9c25" class=3D"outline-4">
<h4 id=3D"orgc4e9c25">OCaml Compiler</h4>
<div class=3D"outline-text-4" id=3D"text-orgc4e9c25">
</div>
<ul class=3D"org-ul">
<li><a id=3D"org48d8650"></a>Relocatable OCaml Merged<br />
<div class=3D"outline-text-5" id=3D"text-org48d8650">
<p>
In December 2025, the final piece of the <a href=3D"https://www.dra27.uk/bl=
og/platform/2025/12/17/its-merged.html">Relocatable OCaml</a> puzzle was me=
rged, enabling opam to clone switches instead of recompiling them. This fea=
ture will be available in the first alpha release of OCaml 5.5.
</p>
<p>
<b>What Relocatable OCaml Enables:</b>
</p>
<p>
This feature allows the OCaml compiler and its associated tools to be moved=
to different filesystem locations after installation without breaking func=
tionality. Key benefits include:
</p>
<ul class=3D"org-ul">
<li>Binary distributions that work regardless of installation path</li>
<li>Improved flexibility for package managers organizing OCaml installation=
s</li>
<li>Bundling of specific OCaml versions by developer tools without path con=
flicts</li>
<li>Simplified cross-platform distribution</li>
</ul>
<p>
The implementation is the culmination of work by David Allsopp, with review=
from Samuel Hym, Jonah Beckford, and others. See the <a href=3D"https://di=
scuss.ocaml.org/t/relocatable-ocaml/17253">announcement on Discuss</a> and =
the <a href=3D"https://github.com/ocaml/ocaml/pull/14243">merged PRs</a> (<=
a href=3D"https://github.com/ocaml/ocaml/pull/14244">#14244</a>, <a href=3D=
"https://github.com/ocaml/ocaml/pull/14245">#14245</a>, <a href=3D"https://=
github.com/ocaml/ocaml/pull/14246">#14246</a>, <a href=3D"https://github.co=
m/ocaml/ocaml/pull/14247">#14247</a>) for technical details.
</p>
</div>
</li>
</ul>
</div>
<div id=3D"outline-container-org85c0a7d" class=3D"outline-4">
<h4 id=3D"org85c0a7d">Build System</h4>
<div class=3D"outline-text-4" id=3D"text-org85c0a7d">
</div>
<ul class=3D"org-ul">
<li><a id=3D"org20cdda4"></a>Dune<br />
<div class=3D"outline-text-5" id=3D"text-org20cdda4">
<p>
<a href=3D"https://ocaml.org/changelog/2026-01-16-dune-3-21-0">Dune 3.21.0<=
/a> (January 16, 2026) is a large release including dozens of fixes, improv=
ements, and additions from many contributors.
</p>
<p>
<b>Notable Additions:</b>
</p>
<ul class=3D"org-ul">
<li>(Experimental): <code>library_parameter</code> stanza for the OxCaml co=
mpiler</li>
<li>Copy-on-write (COW) when copying files on supporting filesystems (Btrfs=
, ZFS, XFS) under Linux</li>
<li>Support for Tangled ATproto-based code repositories</li>
<li>New <code>(dir ..)</code> field on packages to filter stanzas with <cod=
e>--only-packages</code></li>
<li><code>dune promotion show</code> command to preview corrected files</li>
<li>New <code>(lang rocq)</code> build mode for Rocq 9.0 and later</li>
<li>Support for instantiating OxCaml parameterised libraries</li>
<li><code>dune describe tests</code> to list tests in the workspace</li>
<li>Horizontal scrolling in TUI</li>
<li>Support for expanding variables in <code>(promote (into ..))</code></li>
</ul>
<p>
<b>Notable Fixes:</b>
</p>
<ul class=3D"org-ul">
<li>Fixed <code>include_subdirs qualified</code> picking the furthest modul=
e instead of the closest</li>
<li>Improved error messages for invalid version formats with non-ASCII char=
acters</li>
<li>Fixed crash when running <code>dune build @check</code> on libraries wi=
th virtual modules</li>
<li>Allow <code>$ dune init</code> to work on absolute paths</li>
<li>Stop hiding the <code>root_module</code> from the include path</li>
</ul>
<p>
For the complete list of changes, see the <a href=3D"https://github.com/oca=
ml/dune/releases/tag/3.21.0">full release on GitHub</a>.
</p>
<p>
<b>Dune Maintained by</b>: Rudi Grinberg (@rgrinberg, Jane Street), Nicol=
=C3=A1s Ojeda B=C3=A4r (@nojb, LexiFi), Marek Kubica (@Leonidas-from-XIV, T=
arides), Ali Caglayan (@Alizter, Tarides), Stephen Sherratt (@gridbugs, Tar=
ides), Antonio Nuno Monteiro (@anmonteiro), Sudha Parimala (@Sudha247, Tari=
des), Ambre Suhamy (@ElectreAAS, Tarides), Puneeth Chaganti (@punchagan, Ta=
rides)
</p>
</div>
</li>
</ul>
</div>
<div id=3D"outline-container-org1814aef" class=3D"outline-4">
<h4 id=3D"org1814aef">Package Management</h4>
<div class=3D"outline-text-4" id=3D"text-org1814aef">
</div>
<ul class=3D"org-ul">
<li><a id=3D"org8fc79a5"></a>opam<br />
<div class=3D"outline-text-5" id=3D"text-org8fc79a5">
<p>
<a href=3D"https://ocaml.org/changelog/2025-11-27-opam-2.5.0">opam 2.5.0</a=
> (November 27, 2025) is a major release with significant performance and u=
sability improvements.
</p>
<p>
<b>Key Features:</b>
</p>
<ul class=3D"org-ul">
<li><b>Massive speedup for <code>opam update</code></b>: Thanks to @arozovy=
k, opam update now loads opam files incrementally, only parsing files that =
have changed since the last update. For typical small diffs, this means ope=
rations that took seconds now complete in milliseconds</li>
<li><b>Improved shell integration</b>: Fixed issues where parts of a previo=
us environment were kept in the current environment, causing various proble=
ms</li>
<li><b>Changed default shell integration file</b>: Now writes to <code>.bas=
hrc</code> instead of <code>.profile</code> when bash is detected, preventi=
ng infinite loop issues</li>
<li><b>AppArmor profile</b>: The install script now installs an appropriate=
apparmor profile on systems configured with apparmor (enabled by default o=
n Ubuntu)</li>
<li><b>macOS sandbox improvements</b>: Allow writing to <code>/var/folders/=
</code> and <code>/var/db/mds/</code> directories as required by some macOS=
core tools</li>
</ul>
<p>
<b>Build Changes:</b>
</p>
<ul class=3D"org-ul">
<li><b>Ecosystem cmdliner 2.0.0 compatibility</b>: opam no longer depends o=
n <code>cmdliner</code>, removing a key blocker that prevented cmdliner 1.x=
and 2.0.0 from being co-installable. This change enables ecosystem-wide mi=
gration to cmdliner 2.0.0</li>
<li>OCaml 5.5 (trunk) support when using dune's dev profile</li>
<li>The release archive (<code>opam-full-*.tar.gz</code>) is now reproducib=
le</li>
<li>OpenBSD binary is now a full static binary</li>
</ul>
<p>
For more details, see the <a href=3D"https://opam.ocaml.org/blog/opam-2-5-0=
/">official opam 2.5.0 announcement blog</a> and <a href=3D"https://github.=
com/ocaml/opam/releases/tag/2.5.0">full release notes on GitHub</a>.
</p>
<p>
<b>opam Maintained by</b>: Raja Boujbel (@rjbou, OCamlPro), Kate Deplaix (@=
kit-ty-kate, Ahrefs), David Allsopp (@dra27, Tarides)
</p>
</div>
</li>
<li><a id=3D"org2f25e7b"></a>opam-publish<br />
<div class=3D"outline-text-5" id=3D"text-org2f25e7b">
<p>
<a href=3D"https://ocaml.org/changelog/2025-11-18-opam-publish-2.7.1">opam-=
publish 2.7.1</a> (November 18, 2025) fixes bugs related to the GitHub API =
token permissions introduced in version 2.7.0.
</p>
<p>
<b>Changes:</b>
</p>
<ul class=3D"org-ul">
<li>Advertise the need, and check, for the <code>workflow</code> scope for =
GitHub personal access tokens</li>
<li>Enforce the git remote used to push branches to users' fork to be used =
instead of the SSH method</li>
<li>Avoid potential previously used tokens with wrong permissions to be use=
d instead of the new one</li>
<li>Add support for the opam 2.5 API</li>
</ul>
<p>
<b>Maintained by</b>: Raja Boujbel (@rjbou, OCamlPro), Kate Deplaix (@kit-t=
y-kate, Ahrefs)
</p>
</div>
</li>
<li><a id=3D"org8ad97f9"></a>opam-repository Archival: January 1, 2026<br />
<div class=3D"outline-text-5" id=3D"text-org8ad97f9">
<p>
On January 1, 2026, the opam-repository completed its scheduled archival ru=
n, removing <b>3,264 package versions</b> (881 unique packages) marked with=
<code>x-maintenance-intent: archival</code>. This ongoing maintenance proc=
ess helps keep the repository manageable by removing unmaintained or obsole=
te package versions.
</p>
<p>
<b>What This Means:</b>
</p>
<ul class=3D"org-ul">
<li>Archived packages are no longer available in the default opam repositor=
y</li>
<li>CI systems and lock files may need updates if they depend on archived v=
ersions</li>
<li>The archival is based on metadata explicitly set by package maintainers=
</li>
</ul>
<p>
<b>Background:</b>
</p>
<p>
The archival process was announced by Hannes Mehnert in December 2025 (see =
the <a href=3D"https://discuss.ocaml.org/t/opam-repository-archival-next-ru=
n-scheduled-2026-01-01/17587">Discuss announcement</a>), giving package mai=
ntainers and users time to prepare. Packages can be restored from archival =
by maintainers upon request.
</p>
<p>
This maintenance practice ensures the opam repository remains sustainable a=
nd focused on actively maintained packages.
</p>
</div>
</li>
<li><a id=3D"orgb28f722"></a>dune-release<br />
<div class=3D"outline-text-5" id=3D"text-orgb28f722">
<p>
<a href=3D"https://ocaml.org/changelog/dune-release/2026-01-29-dune-release=
-2.2.0">dune-release 2.2.0</a> (January 29, 2026) brings full compatibility=
with cmdliner 2.0.0, continuing the ecosystem-wide migration that began wi=
th opam 2.5.0's removal of the cmdliner dependency.
</p>
<p>
<b>Why This Matters:</b>
</p>
<p>
cmdliner 2.0.0 introduced stricter requirements that improve CLI reliabilit=
y but prevent co-installability with cmdliner 1.x. Following opam 2.5.0's l=
ead in removing this conflict, dune-release 2.2.0 updates to use cmdliner 2=
.0.0 exclusively. This coordinated effort across the platform tools enables=
users to upgrade without encountering dependency conflicts.
</p>
<p>
<b>Important Changes:</b>
</p>
<ul class=3D"org-ul">
<li><b>Breaking</b>: Following cmdliner 2.0's stricter requirements, prefix=
-matching for command options is no longer supported</li>
<li>Users must now provide the full wording for all flags (for example, <co=
de>--skip-tests</code> instead of <code>--skip-test</code>)</li>
<li>This change ensures compatibility with cmdliner 2.0.0 and aligns with m=
odern CLI best practices</li>
<li>If you have automation scripts using shortened flags, update them befor=
e upgrading</li>
</ul>
<p>
For technical details, see the <a href=3D"https://erratique.ch/software/cmd=
liner/doc/Cmdliner">cmdliner 2.0.0 documentation</a> and the <a href=3D"htt=
ps://github.com/tarides/dune-release/pull/512">dune-release PR #512</a>.
</p>
<p>
<b>Maintained by</b>: Tarides
</p>
</div>
</li>
</ul>
</div>
<div id=3D"outline-container-org9cd85f4" class=3D"outline-4">
<h4 id=3D"org9cd85f4">Editor Tools</h4>
<div class=3D"outline-text-4" id=3D"text-org9cd85f4">
<p>
<b>Roadmap: <a href=3D"https://ocaml.org/tools/platform-roadmap#w19-navigat=
e-code">Edit / (W19) Navigate Code</a></b>
</p>
</div>
<ul class=3D"org-ul">
<li><a id=3D"org8f87367"></a>OCaml-LSP Server<br />
<div class=3D"outline-text-5" id=3D"text-org8f87367">
<p>
<a href=3D"https://ocaml.org/changelog/2025-12-20-ocaml-lsp-1-25-0">OCaml-L=
SP 1.25.0</a> (December 20, 2025) introduces support for <code>.mlx</code> =
files and new custom requests.
</p>
<p>
<b>Features:</b>
</p>
<ul class=3D"org-ul">
<li><b><code>.mlx</code> Support</b>: Added support for <code>.mlx</code> f=
iles, including diagnostics, code actions, hover, and formatting via <code>=
ocamlformat-mlx</code></li>
<li><b>New Custom Requests</b>: Added <code>typeExpression</code>, <code>lo=
cate</code>, and <code>phrase</code> requests to the server</li>
<li><b>Code-Lens Configuration</b>: Code-lens for nested <code>let</code> b=
indings is now configurable</li>
</ul>
<p>
<b>Fixes:</b>
</p>
<ul class=3D"org-ul">
<li>The server now falls back to <code>.merlin</code> configuration if a <c=
ode>dune-project</code> file is missing, provided <a href=3D"https://github=
.com/ocaml/merlin">dot-merlin-reader</a> is installed</li>
<li>Improved precision of timestamps for collected metrics</li>
</ul>
</div>
</li>
<li><a id=3D"orgcb0e04e"></a>Merlin<br />
<div class=3D"outline-text-5" id=3D"text-orgcb0e04e">
<p>
<a href=3D"https://ocaml.org/changelog/2025-12-20-merlin-v5-6-1-504">Merlin=
5.6.1-504</a> (December 20, 2025) brings performance optimizations and imp=
roved stability.
</p>
<p>
<b>Key Improvements:</b>
</p>
<ul class=3D"org-ul">
<li><b>Smarter Signature Help</b>: Now triggers correctly on unfinished <co=
de>let ... in</code> bindings and no longer appears redundantly on function=
names</li>
<li><b>More Reliable Completion</b>: Fixed issues with completion for inlin=
ed record labels</li>
<li><b>Improved Performance</b>: Optimized buffer indexing and path calcula=
tions</li>
<li><b>Bug Fixes</b>: Resolved a bug where the <code>document</code> comman=
d concatenated labels and variants incorrectly</li>
</ul>
<p>
<b>OCaml LSP Server maintained by</b>: Ulysse G=C3=A9rard (@voodoos, Taride=
s), Xavier Van de Woestyne (@xvw, Tarides), Rudi Grinberg (@rgrinberg, Jane=
Street)
</p>
<p>
<b>Merlin maintained by</b>: Ulysse G=C3=A9rard (@voodoos, Tarides), Xavier=
Van de Woestyne (@xvw, Tarides), Muluh Godson (@PizieDust, Tarides)
</p>
</div>
</li>
<li><a id=3D"orgac7ccb9"></a>OCaml-eglot<br />
<div class=3D"outline-text-5" id=3D"text-orgac7ccb9">
<p>
We have drastically modified the <code>xref</code> backend (allowing naviga=
tion from definition to definition) to make it more suitable for OCaml.
</p>
<p>
In addition, we added the ability to annotate the type of an enclosing acti=
ve_ (used with the <code>ocaml-eglot-type-enclosing</code> command) or simp=
ly to type the selection.
</p>
<p>
These updates have been merged into <code>main</code>, making them availabl=
e via a MELPA update.
</p>
<p>
<b>ocaml-eglot maintained by</b>: Xavier Van de Woestyne (@xvw, Tarides)
</p>
</div>
</li>
</ul>
</div>
<div id=3D"outline-container-org1d51332" class=3D"outline-4">
<h4 id=3D"org1d51332">Platform Infrastructure</h4>
<div class=3D"outline-text-4" id=3D"text-org1d51332">
</div>
<ul class=3D"org-ul">
<li><a id=3D"org4ec4c4a"></a>OCaml Infrastructure: How the opam-repository =
Works<br />
<div class=3D"outline-text-5" id=3D"text-org4ec4c4a">
<p>
The <a href=3D"https://ocaml.org/changelog/2025-11-05-how-the-opam-reposito=
ry-works">November 5, 2025 article on the opam-repository</a> provides an i=
n-depth look at this critical piece of OCaml infrastructure. The opam repos=
itory serves as the central package registry for the OCaml ecosystem, hosti=
ng over 4,500 packages. It relies on dedicated volunteer maintainers who re=
view every submission.
</p>
<p>
—
</p>
<p>
As always, we encourage feedback and contributions from the community as we=
continue to improve the OCaml Platform ecosystem.
</p>
</div>
</li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-3" class=3D"outline-2">
<h2 id=3D"3">Announcing the first release of Alice, a radical OCaml build s=
ystem</h2>
<div class=3D"outline-text-2" id=3D"text-3">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/announcing-the-first-releas=
e-of-alice-a-radical-ocaml-build-system/17472/45">https://discuss.ocaml.org=
/t/announcing-the-first-release-of-alice-a-radical-ocaml-build-system/17472=
/45</a>
</p>
</div>
<div id=3D"outline-container-org3121242" class=3D"outline-3">
<h3 id=3D"org3121242">Continuing this thread, Steve Sherratt announced</h3>
<div class=3D"outline-text-3" id=3D"text-org3121242">
<p>
Announcing the release of <a href=3D"https://www.alicecaml.org/blog/alice-v=
0-5-0/">Alice v0.5.0</a> which introduces parallel builds.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-4" class=3D"outline-2">
<h2 id=3D"4">mnet, a new TCP/IP stack for unikernels in OCaml</h2>
<div class=3D"outline-text-2" id=3D"text-4">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-mnet-a-new-tcp-ip-stack=
-for-unikernels-in-ocaml/17851/1">https://discuss.ocaml.org/t/ann-mnet-a-ne=
w-tcp-ip-stack-for-unikernels-in-ocaml/17851/1</a>
</p>
</div>
<div id=3D"outline-container-org094ec1e" class=3D"outline-3">
<h3 id=3D"org094ec1e">Calascibetta Romain announced</h3>
<div class=3D"outline-text-3" id=3D"text-org094ec1e">
<p>
I am pleased to announce a series of releases for developing unikernels wit=
h OCaml 5 and <a href=3D"https://github.com/robur-coop/miou">Miou</a>. Afte=
r extensive testing, we are now able to offer a new TCP/IPv4 and IPv6 stack=
in OCaml that aims to replace <a href=3D"https://github.com/mirage/mirage-=
tcpip">mirage-tcpip</a> and pave the way for direct-style unikernel develop=
ment. Below is an overview of the libraries we have built to make this poss=
ible.
</p>
</div>
<div id=3D"outline-container-orge5ef605" class=3D"outline-4">
<h4 id=3D"orge5ef605">mkernel</h4>
<div class=3D"outline-text-4" id=3D"text-orge5ef605">
<p>
<code>mkernel</code> is a small library that provides the essentials for de=
veloping a unikernel targeting <a href=3D"https://github.com/solo5/solo5">S=
olo5</a> or <a href=3D"https://unikraft.org/">Unikraft</a>. Its purpose is =
to expose hypercalls (the unikernel equivalent of syscalls) so that your ap=
plication can interact with network and block devices.
</p>
<p>
We recommend reading the <code>mkernel</code> <a href=3D"https://robur-coop=
.github.io/mkernel/local/mkernel/Mkernel/index.html">documentation</a> to u=
nderstand the key concepts behind unikernels (hypercalls, devices, tenders,=
etc.). The <a href=3D"https://github.com/robur-coop/mkernel/blob/main/slid=
es/retreat.md">slides</a> we presented at the last <a href=3D"https://retre=
at.mirageos.org/">MirageOS retreat</a> are also helpful for understanding o=
ur new workflow. Compiling a unikernel now only requires <code>dune</code> =
and vendored libraries. We have therefore chosen not to resolve dependencie=
s automatically (as <a href=3D"https://github.com/tarides/opam-monorepo">op=
am-monorepo</a> did) or to impose them (as the <code>mirage</code> tool doe=
s), giving developers full freedom to build their unikernels as they see fi=
t. In particular, this makes it straightforward to use ppx rewriters, which=
was difficult or impossible with the <code>mirage</code> tool.
</p>
</div>
<ul class=3D"org-ul">
<li><a id=3D"org7dded92"></a>A new workflow and targets<br />
<div class=3D"outline-text-5" id=3D"text-org7dded92">
<p>
This release is experimental: Xen is not yet supported, and Unikraft suppor=
t is partial. However, both platforms are on our roadmap, so if you are int=
erested in them, please let us know! We are also developing tooling to stre=
amline the workflow, with the guiding principle that these tools should nev=
er dictate which dependencies your unikernel uses or which build system you=
choose.
</p>
</div>
</li>
</ul>
</div>
<div id=3D"outline-container-orga286889" class=3D"outline-4">
<h4 id=3D"orga286889">mnet</h4>
<div class=3D"outline-text-4" id=3D"text-orga286889">
<p>
<code>mnet</code> is the centerpiece of this release. It is designed to rep=
lace (and improve upon) <a href=3D"https://github.com/mirage/mirage-tcpip">=
mirage-tcpip</a> by offering a direct-style API built on effects. The API d=
eliberately mirrors the <code>Unix</code> socket interface: <code>connect</=
code>, <code>listen</code>, <code>accept</code>, <code>read</code>, <code>w=
rite</code>, and <code>close</code> all behave the way you would expect.
</p>
<p>
Here is a small example of an echo server:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #a7601f;">run</span> (<span sty=
le=3D"color: #007a9f;">ipv4</span>, <span style=3D"color: #007a9f;">gateway=
</span>, <span style=3D"color: #007a9f;">ipv6</span>) =3D
<span style=3D"color: #557400; font-weight: bold;">Mkernel.</span>(run [ =
rng; <span style=3D"color: #557400; font-weight: bold;">Mnet.</span>stack <=
span style=3D"color: #444fcf; font-weight: bold;">~name</span>:<span style=
=3D"color: #ca3400;">"service"</span> ?gateway ~ipv6 ipv4 ])
<span style=3D"color: #9f0d0f;">@@</span> <span style=3D"color: #006f00; =
font-weight: bold;">fun</span> <span style=3D"color: #007a9f;">rng</span> (=
<span style=3D"color: #007a9f;">daemon</span>, <span style=3D"color: #007a9=
f;">tcp</span>, <span style=3D"color: #007a9f;">udp</span>) ->
<span style=3D"color: #242521; font-weight: bold;">let@</span> () =3D <sp=
an style=3D"color: #006f00; font-weight: bold;">fun</span> () -> <span s=
tyle=3D"color: #557400; font-weight: bold;">Mnet.</span>kill daemon <span s=
tyle=3D"color: #242521; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let@</span> () =3D <sp=
an style=3D"color: #006f00; font-weight: bold;">fun</span> () -> <span s=
tyle=3D"color: #557400; font-weight: bold;">Mirage_crypto_rng_mkernel.</spa=
n>kill rng <span style=3D"color: #242521; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">listen</span> =3D <span style=3D"color: #557400; font-=
weight: bold;">Mnet.TCP.</span>listen tcp 9000 <span style=3D"color: #24252=
1; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">flow</span> =3D <span style=3D"color: #557400; font-we=
ight: bold;">Mnet.TCP.</span>accept tcp listen <span style=3D"color: #24252=
1; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">buf</span> =3D <span style=3D"color: #557400; font-wei=
ght: bold;">Bytes.</span>create 4096 <span style=3D"color: #242521; font-we=
ight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #242521; font-weight: bold;">rec</span> <span style=3D"color: #a=
7601f;">echo</span> () =3D
<span style=3D"color: #242521; font-weight: bold;">let</span> <span sty=
le=3D"color: #007a9f;">len</span> =3D <span style=3D"color: #557400; font-w=
eight: bold;">Mnet.TCP.</span>read flow buf <span style=3D"color: #242521; =
font-weight: bold;">in</span>
<span style=3D"color: #006f00; font-weight: bold;">if</span> len > 0=
<span style=3D"color: #006f00; font-weight: bold;">then</span> <span style=
=3D"color: #242521; font-weight: bold;">begin</span>
<span style=3D"color: #557400; font-weight: bold;">Mnet.TCP.</span>wr=
ite flow (<span style=3D"color: #557400; font-weight: bold;">Bytes.</span>s=
ub_string buf 0 len);
echo ()
<span style=3D"color: #242521; font-weight: bold;">end</span>
<span style=3D"color: #242521; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let@</span> () =3D <sp=
an style=3D"color: #006f00; font-weight: bold;">fun</span> () -> <span s=
tyle=3D"color: #557400; font-weight: bold;">Mnet.TCP.</span>close flow <spa=
n style=3D"color: #242521; font-weight: bold;">in</span>
echo ()
</code></pre>
</div>
<p>
TLS support (via <a href=3D"https://github.com/mirleft/ocaml-tls">ocaml-tls=
</a>) is already available, allowing you to establish secure connections wi=
th your unikernel. DNS resolution (via <a href=3D"https://github.com/mirage=
/ocaml-dns">ocaml-dns</a>) and the <a href=3D"https://github.com/robur-coop=
/happy-eyeballs">Happy Eyeballs</a> algorithm are also included, so that a =
unikernel can resolve hostnames and connect to remote services over both IP=
v4 and IPv6.
</p>
<p>
A <a href=3D"https://robur-coop.github.io/mnet/">short tutorial</a> walks y=
ou through creating an echo server as a unikernel, similar to what we <a hr=
ef=3D"https://robur-coop.github.io/miou/echo.html">already offer</a> for Mi=
ou. For the curious, an article about IPv4 and Miou is available <a href=3D=
"https://blog.robur.coop/articles/utcp_and_effects.html">here</a>.
</p>
<p>
Beyond the move to effects for all scheduling, I would like to give special=
thanks to:
</p>
<ul class=3D"org-ul">
<li>Edwin T=C3=B6r=C3=B6k for proposing fixes to prevent denial-of-service =
attacks, which
have been integrated into <code>mnet</code> (in particular for <a href=3D"h=
ttps://osv.dev/vulnerability/OSEC-2026-02">ARP</a>).</li>
<li>Nicolas Ojeda B=C3=A4r for contributing an IPv6 implementation that we =
adopted and
improved (caches, packet fragmentation and reassembly, etc.)</li>
<li>Reynir for patiently debugging PCAP traces</li>
<li>Hannes for sharing his deep knowledge of the TCP protocol and its
interactions with IPv4 and IPv6</li>
</ul>
<p>
As well as others who participated in the development of <code>mnet</code> =
in one way or another.
</p>
</div>
<ul class=3D"org-ul">
<li><a id=3D"orgcb75139"></a>Developing and deploying unikernels<br />
<div class=3D"outline-text-5" id=3D"text-orgcb75139">
<p>
This library also marks a turning point in our approach to unikernels. We n=
o longer treat a regular OCaml application as something that can be transpa=
rently turned into a unikernel. Developing a unikernel now means developing=
a unikernel from the start. In our experience, trying to retrofit an exist=
ing application into a unikernel was neither practical nor worthwhile.
</p>
<p>
Our tutorial therefore covers both the development and deployment of uniker=
nels. On the deployment side, we also recommend exploring <a href=3D"https:=
//github.com/robur-coop/albatross">Albatross</a>.
</p>
</div>
</li>
</ul>
</div>
<div id=3D"outline-container-orga356b60" class=3D"outline-4">
<h4 id=3D"orga356b60">utcp</h4>
<div class=3D"outline-text-4" id=3D"text-orga356b60">
<p>
<a href=3D"https://github.com/robur-coop/utcp"><code>utcp</code></a> is a p=
ure OCaml implementation of the TCP protocol, used internally by <code>mnet=
</code> to handle TCP connections. The implementation is based on a state m=
achine and performs no I/O itself, making it easy to test and reason about.
</p>
<p>
<code>utcp</code> covers the full TCP lifecycle: the three-way handshake, r=
eliable in-order data delivery with retransmissions, flow control, congesti=
on control, and connection teardown. It has been tested extensively through=
our end-to-end unikernel tests (a simple <a href=3D"https://github.com/rob=
ur-coop/mnet/tree/main/unikernels/echo">echo</a> server and client, and a <=
a href=3D"https://github.com/robur-coop/mnet/tree/main/unikernels/resolver"=
>DNS resolver</a>).
</p>
</div>
<ul class=3D"org-ul">
<li><a id=3D"orgd0e2bbe"></a>Unikernels and proofs<br />
<div class=3D"outline-text-5" id=3D"text-orgd0e2bbe">
<p>
<code>utcp</code> also reflects our ambition to incorporate, as time permit=
s, proof-based implementations. Other examples include:
</p>
<ul class=3D"org-ul">
<li>miou with its priority queue (see the <a href=3D"https://inria.hal.scie=
nce/hal-01561094">VOCAL</a> project)</li>
<li>mirage-crypto with certain cryptographic primitives (see the <a href=3D=
"https://github.com/mit-plv/fiat-crypto">fiat</a> project)</li>
<li>and now utcp (see <a href=3D"https://www.cl.cam.ac.uk/~pes20/Netsem/">n=
etsem</a>)</li>
</ul>
<p>
This effort is still in its early stages, but we welcome improvements and c=
ollaborations in this area.
</p>
</div>
</li>
</ul>
</div>
<div id=3D"outline-container-org79c5907" class=3D"outline-4">
<h4 id=3D"org79c5907">mhttp</h4>
<div class=3D"outline-text-4" id=3D"text-org79c5907">
<p>
To reach a wider audience, we also provide an HTTP protocol implementation =
for unikernels, building on the work we started (and currently use in produ=
ction) with <a href=3D"https://github.com/robur-coop/httpcats">httpcats</a>.
</p>
<p>
<code>mhttp</code> is essentially a unikernel-oriented counterpart to <code=
>httpcats</code>, using <a href=3D"https://github.com/robur-coop/ocaml-h1">=
ocaml-h1</a> and <a href=3D"https://github.com/anmonteiro/ocaml-h2">ocaml-h=
2</a> as its HTTP/1.1 and H2 backends.
</p>
</div>
<ul class=3D"org-ul">
<li><a id=3D"org3cfe51b"></a>Ecosystem and composability<br />
<div class=3D"outline-text-5" id=3D"text-org3cfe51b">
<p>
Although <code>mhttp</code> is a small project, it illustrates a broader pr=
inciple behind our cooperative's approach to library development. As we hav=
e <a href=3D"https://discuss.ocaml.org/t/on-concurrency-models/15899/13?u=
=3Ddinosaure">stated before</a>, everything we build is designed to be reus=
able with schedulers other than Miou and in contexts other than unikernels.=
Regardless of which scheduler one prefers, we believe in a pragmatic, coop=
erative approach to contributing to the community.
</p>
<p>
Our primary focus remains unikernel development, but years of experience bu=
ilding protocol and format libraries have taught us that keeping them sched=
uler-agnostic is in everyone's best interest, for maintainability, testabil=
ity, and reliability alike. Wherever possible, you will find a general-purp=
ose library alongside its unikernel counterpart: <code>httpcats</code> and =
<code>mhttp</code> are one such pair.
</p>
</div>
</li>
</ul>
</div>
<div id=3D"outline-container-org64c4717" class=3D"outline-4">
<h4 id=3D"org64c4717">Vifu</h4>
<div class=3D"outline-text-4" id=3D"text-org64c4717">
<p>
As <a href=3D"https://discuss.ocaml.org/t/ann-httpcats-ocaml-h1-vif-hurl-a-=
webstack-for-ocaml-5/17104">previously announced</a>, we have developed a w=
eb framework for OCaml 5 called <a href=3D"https://github.com/robur-coop/vi=
f">vif</a>, which we use in production for our <a href=3D"https://builds.ro=
bur.coop">builds.robur.coop</a> website (we recommend the <a href=3D"https:=
//robur-coop.github.io/vif/">tutorial</a> presented at <a href=3D"https://f=
un-ocaml.com">FUN OCaml</a> 2025).
</p>
<p>
<code>vif</code> now has a unikernel variant: <code>vifu</code>. It offers =
nearly the same interface as <code>vif</code> (except for static file manag=
ement), making it possible to build websites entirely in OCaml. Here is a s=
mall unikernel that displays "Hello World!":
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #a7601f;">hello_world</span> <s=
pan style=3D"color: #007a9f;">req</span> <span style=3D"color: #007a9f;">_s=
erver</span> () =3D
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #242521; font-weight: bold;">open </span><span style=3D"color: #=
557400; font-weight: bold;">Vifu.Response.Syntax</span> <span style=3D"colo=
r: #242521; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let*</span> () =3D <sp=
an style=3D"color: #557400; font-weight: bold;">Vifu.Response.</span>with_t=
ext req <span style=3D"color: #ca3400;">"Hello World!\n"</span> <span style=
=3D"color: #242521; font-weight: bold;">in</span>
<span style=3D"color: #557400; font-weight: bold;">Vifu.Response.</span>r=
espond <span style=3D"color: #242521;">`OK</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #a7601f;">run</span> (<span style=3D"color: #007a9f;">ipv4</span=
>, <span style=3D"color: #007a9f;">gateway</span>, <span style=3D"color: #0=
07a9f;">ipv6</span>) =3D
<span style=3D"color: #557400; font-weight: bold;">Mkernel.</span>(run [ =
rng; <span style=3D"color: #557400; font-weight: bold;">Mnet.</span>stack <=
span style=3D"color: #444fcf; font-weight: bold;">~name</span>:<span style=
=3D"color: #ca3400;">"service"</span> ?gateway ~ipv6 ipv4 ])
<span style=3D"color: #9f0d0f;">@@</span> <span style=3D"color: #006f00; =
font-weight: bold;">fun</span> <span style=3D"color: #007a9f;">rng</span> (=
<span style=3D"color: #007a9f;">daemon</span>, <span style=3D"color: #007a9=
f;">tcp</span>, <span style=3D"color: #007a9f;">udp</span>) ->
<span style=3D"color: #242521; font-weight: bold;">let@</span> () =3D <sp=
an style=3D"color: #006f00; font-weight: bold;">fun</span> () -> <span s=
tyle=3D"color: #557400; font-weight: bold;">Mnet.</span>kill daemon <span s=
tyle=3D"color: #242521; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let@</span> () =3D <sp=
an style=3D"color: #006f00; font-weight: bold;">fun</span> () -> <span s=
tyle=3D"color: #557400; font-weight: bold;">Mirage_crypto_rng_mkernel.</spa=
n>kill rng <span style=3D"color: #242521; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">cfg</span> =3D <span style=3D"color: #557400; font-wei=
ght: bold;">Vifu.Config.</span>v 80 <span style=3D"color: #242521; font-wei=
ght: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">routes</span> =3D <span style=3D"color: #557400; font-=
weight: bold;">Vifu.</span>[ get (rel /<span style=3D"color: #9f0d0f;">??</=
span> any) --> hello_world ] <span style=3D"color: #242521; font-weight:=
bold;">in</span>
<span style=3D"color: #557400; font-weight: bold;">Vifu.</span>run ~cfg t=
cp routes ()
</code></pre>
</div>
<p>
<b>disclaimer</b>: If you would like to use <code>vifu</code>, please note =
that although a recent release has been made, one final fix is still needed=
to compile a unikernel with this library (to avoid pulling in the <code>un=
ix</code> module). We recommend pinning <code>vifu</code> for now.
</p>
</div>
</div>
<div id=3D"outline-container-org0e2fa28" class=3D"outline-4">
<h4 id=3D"org0e2fa28">Unikernels</h4>
<div class=3D"outline-text-4" id=3D"text-org0e2fa28">
<p>
Behind all these libraries, there are concrete projects that we would like =
to share with you:
</p>
<ul class=3D"org-ul">
<li>Our <a href=3D"https://github.com/dinosaure/immuable"><code>immutable</=
code></a> unikernel, a web server for static files (which can be generated,=
for example, with <a href=3D"https://github.com/xhtmlboi/yocaml">YOCaml</a=
>).</li>
<li>A DNS resolver unikernel: <a href=3D"https://github.com/dinosaure/pagej=
aune"><code>pagejaune</code></a></li>
<li>A small search engine for emails from an archive such as the caml-list:=
<a href=3D"https://github.com/robur-coop/blame"><code>blame</code></a>. Mo=
re details are available <a href=3D"https://blog.robur.coop/articles/2025-0=
4-12-ptt-search-webapp.html">here</a>.</li>
</ul>
</div>
</div>
<div id=3D"outline-container-org70bd2e5" class=3D"outline-4">
<h4 id=3D"org70bd2e5">Conclusion</h4>
<div class=3D"outline-text-4" id=3D"text-org70bd2e5">
<p>
After several years of work, we are now able to develop unikernels with OCa=
ml 5 in earnest. We hope that our new workflow will be of interest to the c=
ommunity and that these libraries will be a useful contribution to the OCam=
l ecosystem.
</p>
<p>
If you would like to try it out, we recommend starting with the <a href=3D"=
https://robur-coop.github.io/mnet/">mnet tutorial</a> and the <a href=3D"ht=
tps://robur-coop.github.io/mkernel/local/mkernel/Mkernel/index.html">mkerne=
l documentation</a>. Feel free to open issues or reach out to us if you hav=
e any questions!
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-5" class=3D"outline-2">
<h2 id=3D"5">Experiment: format-line</h2>
<div class=3D"outline-text-2" id=3D"text-5">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-experiment-format-line/=
17854/1">https://discuss.ocaml.org/t/ann-experiment-format-line/17854/1</a>
</p>
</div>
<div id=3D"outline-container-org85a5ab3" class=3D"outline-3">
<h3 id=3D"org85a5ab3">Emile Trotignon announced</h3>
<div class=3D"outline-text-3" id=3D"text-org85a5ab3">
<p>
I made this little experiment a while back: <a href=3D"https://github.com/a=
hrefs/format-line">https://github.com/ahrefs/format-line</a>
</p>
<p>
The idea is to provide a complement to ocp-indent to decide which token sho=
uld be separated by whitespace and which should not. For now it is based on=
ly on lexing information, which make the code simple but also does not alwa=
ys provide enough information to have a nice formatting.
</p>
<p>
An idea of the output can be read here: <a href=3D"https://github.com/ahref=
s/format-line/blob/master/test/run.t">https://github.com/ahrefs/format-line=
/blob/master/test/run.t</a>
</p>
<p>
The project itself is formatted with ocamlformat, and in the there is a dif=
f of what this changes compared to ocamlformat, on the main source file.
</p>
<p>
I think this approach could be improved by having a hybrid ast-token stream=
datastructure. Something where you work on a stream of token but you can q=
uery the AST context of a given token.
</p>
<p>
What do you think ?
</p>
</div>
</div>
</div>
<div id=3D"outline-container-6" class=3D"outline-2">
<h2 id=3D"6">Caml in the Capital - Registrations Open!</h2>
<div class=3D"outline-text-2" id=3D"text-6">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-caml-in-the-capital-reg=
istrations-open/17776/6">https://discuss.ocaml.org/t/ann-caml-in-the-capita=
l-registrations-open/17776/6</a>
</p>
</div>
<div id=3D"outline-container-orgf05f5c3" class=3D"outline-3">
<h3 id=3D"orgf05f5c3">Continuing this thread, Sacha Ayoun announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgf05f5c3">
<p>
And here is the <a href=3D"https://www.youtube.com/watch?v=3D6CM9J2C58dg">l=
ink to the recording</a>!
</p>
<p>
We'd like to thank our speakers Jeremy and Nick again, as well as the ~30 a=
ttendees to the meetup! It was great having you, and we hope to see you aga=
in next time :)
</p>
</div>
</div>
</div>
<div id=3D"outline-container-7" class=3D"outline-2">
<h2 id=3D"7">Experimental tools for migrating from Lwt to Eio</h2>
<div class=3D"outline-text-2" id=3D"text-7">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-experimental-tools-for-=
migrating-from-lwt-to-eio/17855/1">https://discuss.ocaml.org/t/ann-experime=
ntal-tools-for-migrating-from-lwt-to-eio/17855/1</a>
</p>
</div>
<div id=3D"outline-container-org2db7897" class=3D"outline-3">
<h3 id=3D"org2db7897">Jules announced</h3>
<div class=3D"outline-text-3" id=3D"text-org2db7897">
<p>
We developed tools to help us migrate Ocsigen libraries and applications to=
direct-style concurrency and we are happy to share them.
</p>
<p>
There are 4 independent tools for different purposes:
</p>
<ul class=3D"org-ul">
<li>Replacing every uses of <code>lwt_ppx</code> with <code>Lwt</code> func=
tion calls (e.g. replacing <code>let%lwt ... in</code> with <code>let* ... =
in</code>).
This is purely syntactic and allows you to easily remove a PPX. It handles =
inserting <code>open Lwt.Syntax</code> at the top of the file.</li>
<li>Warning about occurrences of <code>let _ =3D ...</code> and <code>ignor=
e ...</code>, which make the next tools less reliable.
These are called =E2=80=9Cimplicit fork=E2=80=9D because code run concurren=
tly if the ignored value is an Lwt thread. This requires an explicit call t=
o <code>Fiber.fork</code> with Eio.</li>
<li>Migrating uses of <code>Lwt_log</code> to <code>Logs</code>.
It was used on <a href=3D"https://github.com/ocsigen/ocsigenserver/pull/256=
">ocsigenserver</a> for example.
At this point we generate code working as before and did not introduce a de=
pendency on Eio.</li>
<li><p>
Migrating uses of <code>Lwt</code> to <code>Eio</code>. It rewrites code wr=
itten in monadic style into direct-style, for example this code:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #007a9f;">_</span> =3D
<span style=3D"color: #242521; font-weight: bold;">let*</span> <span styl=
e=3D"color: #007a9f;">x</span> =3D f 1 <span style=3D"color: #242521; font-=
weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let+</span> <span styl=
e=3D"color: #007a9f;">y</span> =3D f 2 <span style=3D"color: #242521; font-=
weight: bold;">in</span>
<span style=3D"color: #557400; font-weight: bold;">Lwt.</span>bind (f 3) =
(<span style=3D"color: #006f00; font-weight: bold;">fun</span> <span style=
=3D"color: #007a9f;">z</span> ->
<span style=3D"color: #557400; font-weight: bold;">Lwt.</span>return (x=
+ y + z))
</code></pre>
</div>
<p>
is rewritten to:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #007a9f;">_</span> =3D
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">x</span> =3D f 1 <span style=3D"color: #242521; font-w=
eight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">y</span> =3D f 2 <span style=3D"color: #242521; font-w=
eight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">z</span> =3D f 3 <span style=3D"color: #242521; font-w=
eight: bold;">in</span>
x + y + z
</code></pre>
</div>
<p>
It also rewrite <code>Lwt</code> function calls to their equivalent in <cod=
e>Eio</code> and handles many IO operations.
</p>
<p>
Unfortunately, this tool doesn=E2=80=99t generate fully equivalent code and=
requires manual modifications. Comments are inserted in many places where =
intervention is needed.
</p>
<p>
An example of generated incorrect code is:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #007a9f;">_</span> =3D
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">a</span> =3D operation_1 () <span style=3D"color: #242=
521; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let*</span> <span styl=
e=3D"color: #007a9f;">b</span> =3D operation_2 () <span style=3D"color: #24=
2521; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let*</span> <span styl=
e=3D"color: #007a9f;">a</span> =3D a <span style=3D"color: #242521; font-we=
ight: bold;">in</span>
<span style=3D"color: #557400; font-weight: bold;">Lwt.</span>return (a +=
b)
</code></pre>
</div>
<p>
which is rewritten into:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #007a9f;">_</span> =3D
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">a</span> =3D operation_1 () <span style=3D"color: #242=
521; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">b</span> =3D operation_2 () <span style=3D"color: #242=
521; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">a</span> =3D a <span style=3D"color: #242521; font-wei=
ght: bold;">in</span>
a + b
</code></pre>
</div>
<p>
This is incorrect because <code>operation_1</code> and <code>operation_2</c=
ode> are now sequential but were concurrent before. This is a case of an im=
plicit fork that cannot easily be detected. The correct transformation woul=
d be:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #007a9f;">_</span> =3D
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">a</span>, <span style=3D"color: #007a9f;">b</span> =3D=
<span style=3D"color: #557400; font-weight: bold;">Eio.Fiber.</span>pair o=
peration_1 operation_2 <span style=3D"color: #242521; font-weight: bold;">i=
n</span>
a + b
</code></pre>
</div>
<p>
We could achieve the migration on <a href=3D"https://github.com/ocsigen/eli=
om/pull/846">eliom</a> and <a href=3D"https://github.com/ocsigen/ocsigenser=
ver/pull/269">ocsigenserver</a>
</p></li>
</ul>
<p>
All the tools use OCamlformat under the hood to generate the code. This has=
the inconvenient of enforcing the use of OCamlformat before using them as =
they will reformat the entire codebase.
</p>
<p>
The last two tools use Merlin under the hood to locate uses of <code>Lwt</c=
ode> functions in the source files. This works by reading Merlin=E2=80=99s =
ocaml-index files built by Dune to extract the location in the source files=
that we need.
</p>
<p>
Currently, it only supports Eio as a backend but can easily be <a href=3D"h=
ttps://github.com/tarides/ciao-lwt/blob/main/bin/ciao_lwt/to_direct_style/c=
oncurrency_backend.ml">adapted</a> to other direct-style concurrency librar=
ies.
</p>
<p>
This work was made possible thanks to the support of the <a href=3D"https:/=
/nlnet.nl/thema/NGIZeroCore.html">NGI Zero Core fund</a> through the <a hre=
f=3D"https://nlnet.nl/">Nlnet foundation</a>, and is perfomed by <a href=3D=
"https://tarides.com/">Tarides</a>.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-8" class=3D"outline-2">
<h2 id=3D"8">First alpha release of OCaml 5.5.0</h2>
<div class=3D"outline-text-2" id=3D"text-8">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/first-alpha-release-of-ocam=
l-5-5-0/17856/1">https://discuss.ocaml.org/t/first-alpha-release-of-ocaml-5=
-5-0/17856/1</a>
</p>
</div>
<div id=3D"outline-container-orgedab093" class=3D"outline-3">
<h3 id=3D"orgedab093">octachron announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgedab093">
<p>
Four months after the release of OCaml 5.4.0, the set of new features for t=
he future version 5.5.0 of OCaml has been frozen. We are thus happy to anno=
unce the first alpha release for OCaml 5.5.0.
</p>
<p>
This alpha version is here to help fellow hackers join us early in our bug =
hunting and opam ecosystem fixing fun (see below for the installation instr=
uctions). More information about the release process is available at <a hre=
f=3D"https://github.com/ocaml/ocaml/blob/trunk/release-info/introduction.md=
">https://github.com/ocaml/ocaml/blob/trunk/release-info/introduction.md</a=
>.
</p>
<p>
The progress on stabilising the ecosystem is tracked on the <a href=3D"http=
s://github.com/ocaml/opam-repository/issues/29463">opam readiness for 5.5.0=
meta-issue</a> .
</p>
<p>
There is also a companion alpha opam repository available for this alpha re=
lease
</p>
<pre class=3D"example" id=3D"orgeb00e46">
$ opam repo add alpha git+https://github.com/kit-ty-kate/opam-alpha-reposit=
ory.git
</pre>
<p>
which contains in-progress alpha releases of opam packages that are being u=
pdated for
OCaml 5.5.0 .
</p>
<p>
The full release is expected between May and June. There are more informati=
on available in the <a href=3D"https://github.com/ocaml/ocaml/blob/trunk/re=
lease-info/calendar.md">prospective release calendar</a>.
</p>
<p>
If you find any bugs, please report them on the <a href=3D"https://github.c=
om/ocaml/ocaml/issues">OCaml's issue tracker</a>.
</p>
<p>
If you are interested in the ongoing list of new features and bug fixes, the
updated <a href=3D"https://github.com/ocaml/ocaml/blob/5.5/Changes">change =
log for OCaml 5.5.0 is available on GitHub</a>.
</p>
<p>
Happy hacking,
Florian Angeletti for the OCaml team
</p>
</div>
<div id=3D"outline-container-orge1459dd" class=3D"outline-4">
<h4 id=3D"orge1459dd">Installation Instructions</h4>
<div class=3D"outline-text-4" id=3D"text-orge1459dd">
<p>
The base compiler can be installed as an opam switch with the following com=
mands
on opam 2.1 and later:
</p>
<p>
opam update
opam switch create 5.5.0~alpha1
</p>
<p>
The source code for the alpha is also available at these addresses:
</p>
<ul class=3D"org-ul">
<li>GitHub: <a href=3D"https://github.com/ocaml/ocaml/archive/5.5.0-alpha1.=
tar.gz">https://github.com/ocaml/ocaml/archive/5.5.0-alpha1.tar.gz</a></li>
<li>OCaml archives at Inria: <a href=3D"https://caml.inria.fr/pub/distrib/o=
caml-5.5/ocaml-5.5.0~alpha1.tar.gz">https://caml.inria.fr/pub/distrib/ocaml=
-5.5/ocaml-5.5.0~alpha1.tar.gz</a></li>
</ul>
</div>
</div>
<div id=3D"outline-container-org590e3c7" class=3D"outline-4">
<h4 id=3D"org590e3c7">Fine-Tuned Compiler Configuration</h4>
<div class=3D"outline-text-4" id=3D"text-org590e3c7">
<p>
If you want to tweak the configuration of the compiler, you can switch to t=
he option variant with:
</p>
<pre class=3D"example" id=3D"orge962fb0">
opam update
opam switch create <switch_name> ocaml-variants.5.5.0~alpha1+options =
<option_list>
</pre>
<p>
where <code>option_list</code> is a space separated list of <code>ocaml-opt=
ion-*</code> packages. For instance, for a flambda and no-flat-float-array =
switch:
</p>
<pre class=3D"example" id=3D"orgdcbff58">
opam switch create 5.5.0~alpha1+flambda+nffa ocaml-variants.5.5.0~alpha1+op=
tions ocaml-option-flambda ocaml-option-no-flat-float-array
</pre>
<p>
All available options can be listed with <code>opam search ocaml-option</co=
de>.
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-9" class=3D"outline-2">
<h2 id=3D"9">[email protected] - create Windows envs on macOS [dk=
0]</h2>
<div class=3D"outline-text-2" id=3D"text-9">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-notinriacaml-std-wenv-0=
-1-0-create-windows-envs-on-macos-dk0/17858/1">https://discuss.ocaml.org/t/=
ann-notinriacaml-std-wenv-0-1-0-create-windows-envs-on-macos-dk0/17858/1</a>
</p>
</div>
<div id=3D"outline-container-org72eb05b" class=3D"outline-3">
<h3 id=3D"org72eb05b">jbeckford announced</h3>
<div class=3D"outline-text-3" id=3D"text-org72eb05b">
<p>
It is my pleasure to announce the following package for <a href=3D"https://=
discuss.ocaml.org/t/ann-the-dk0-build-system/17709">the dk0 build system</a=
> that creates a Windows environment ("wenv") using a custom Wine build for=
macOS:
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/diskuv/dk/blob/a29e9da3f30df41fa3cfc855b3=
23fdcda6a106c2/etc/dk/v/NotInriaCaml_Std/Wenv.values.lua">NotInriaCaml_Std.=
[email protected]</a></li>
</ul>
<p>
Here is a sample session:
</p>
<pre class=3D"example" id=3D"orgbc33cba">
# Simplest way to install dk0 today. Use ~git pull~ if exists already.=20
$ git clone --branch V2_5 https://github.com/diskuv/dk.git dksrc
# Clear out data, cache and intermediate files from any prior
# experiments (from the "--trial" option seen in [ANN] posts)
$ rm -rf t/
# With the default Lua rules ("-I dksrc/etc/dk/v"), run the
# OCaml Windows environment creation rule ("run
# [email protected]"). Tell the rule to create the
# wenv at target/my-wenv/ ("dir=3D...") and make a mount
# ("mount[]=3D...") inside the wenv where the Unix directory $PWD is
# mapped to Windows M:\project. Depending on Internet, expect 3-4
# minutes for a single-threaded download of artifacts (581MB).
$ dksrc/dk0 --trial -I dksrc/etc/dk/v \
run [email protected] \
dir=3D$PWD/target/my-wenv \
"mount[]=3Dtype=3Dbind,src=3D$PWD,dst=3DM:/project"
</pre>
<pre class=3D"example" id=3D"orgf7b8f96">
# Then enter the wenv by running Command Prompt ("cmd.exe"). Turn
# off Wine debug messages ("WINEDEBUG=3D-all"). Remember that
# Ctrl-Z is the Windows equivalent of Ctrl-D (EOF) in Unix.
$ WINEDEBUG=3D-all target/my-wenv/bin/enter cmd.exe
Microsoft Windows 10.0.19045
Z:\> ocamlopt -config
Z:\> gcc --version
Z:\> dir M:
02/27/2026 10:24 AM <DIR> project
Z:\> ocaml
OCaml version 5.4.1
Enter #help;; for help.
# 1+1 ;;
- : int =3D 2
# ^Z
Z:\> echo let () =3D print_endline "abcxyz" > letters.ml
Z:\> ocamlopt -o letters.exe letters.ml
Z:\> .\letters.exe
abcxyz
Z:\> exit
</pre>
<p>
Details:
</p>
<ul class=3D"org-ul">
<li>MinGW with UCRT Windows API and LLVM toolchain (llvm-mingw) for Wine on=
the host (macOS). X11 has been disabled.</li>
<li>MinGW with MSVCRT Windows API and GNU compiler and BusyBox binaries (w6=
4devkit) inside Windows guest.</li>
<li>Wine has good support for programs that use Windows conventions (MSVC, =
Windows API rather than <code>syscall</code>, etc). But there are important=
programs that won't work correctly today: MSYS2/Cygwin, Rust uutils.</li>
</ul>
<p>
Enjoy! –jonah
</p>
</div>
</div>
</div>
<div id=3D"outline-container-10" class=3D"outline-2">
<h2 id=3D"10">Running Real Docker Containers in OCaml Tests</h2>
<div class=3D"outline-text-2" id=3D"text-10">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-running-real-docker-con=
tainers-in-ocaml-tests/17859/1">https://discuss.ocaml.org/t/ann-running-rea=
l-docker-containers-in-ocaml-tests/17859/1</a>
</p>
</div>
<div id=3D"outline-container-orgc702b87" class=3D"outline-3">
<h3 id=3D"orgc702b87">Sachin announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgc702b87">
<p>
Hi everyone,
</p>
<p>
I=E2=80=99ve been working on a project called <b><a href=3D"https://github.=
com/benodiwal/testcontainers-ocaml">testcontainers-ocaml</a></b>, which bri=
ngs Testcontainers style integration testing to OCaml.
</p>
<p>
The idea is simple:
</p>
<blockquote>
<p>
Instead of mocking infrastructure (Postgres, Redis, Kafka, etc.), start rea=
l Docker containers inside your test suite and tear them down automatically.
</p>
</blockquote>
<p>
—
</p>
</div>
<div id=3D"outline-container-orgbe2201f" class=3D"outline-4">
<h4 id=3D"orgbe2201f">Why?</h4>
<div class=3D"outline-text-4" id=3D"text-orgbe2201f">
<p>
In many OCaml projects, integration tests either:
</p>
<ul class=3D"org-ul">
<li>Rely on mocks</li>
<li>Depend on globally running services</li>
<li>Or are skipped entirely in CI</li>
</ul>
<p>
Mocks are useful, but they don=E2=80=99t catch issues like:
</p>
<ul class=3D"org-ul">
<li>Schema mismatches</li>
<li>Connection pool behavior</li>
<li>Real networking failures</li>
<li>Startup timing problems</li>
<li>Migration issues</li>
</ul>
<p>
Spinning up disposable containers per test gives us:
</p>
<ul class=3D"org-ul">
<li>Isolated test environments</li>
<li>No shared global state</li>
<li>CI reproducibility</li>
<li>Real infrastructure behavior</li>
</ul>
</div>
</div>
<div id=3D"outline-container-orge3c2bba" class=3D"outline-4">
<h4 id=3D"orge3c2bba">Current Status</h4>
<div class=3D"outline-text-4" id=3D"text-orge3c2bba">
<p>
The project is currently incubating under the Docker organization.
</p>
<p>
I=E2=80=99m still actively shaping the API and would really appreciate feed=
back from the OCaml community on:
</p>
<ul class=3D"org-ul">
<li>API ergonomics</li>
<li>Prebuilt modules (Postgres, Redis, etc.)</li>
<li>Testing best practices in OCaml</li>
</ul>
<p>
If anyone here has experience with integration testing patterns in OCaml, I=
=E2=80=99d love to hear thoughts.
</p>
<p>
Thanks!
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-11" class=3D"outline-2">
<h2 id=3D"11">I wrote a DSL for AI personalities in OCaml</h2>
<div class=3D"outline-text-2" id=3D"text-11">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/i-wrote-a-dsl-for-ai-person=
alities-in-ocaml/17860/1">https://discuss.ocaml.org/t/i-wrote-a-dsl-for-ai-=
personalities-in-ocaml/17860/1</a>
</p>
</div>
<div id=3D"outline-container-org7be2e9c" class=3D"outline-3">
<h3 id=3D"org7be2e9c">Griffin announced</h3>
<div class=3D"outline-text-3" id=3D"text-org7be2e9c">
<p>
Hi guys,
</p>
<p>
<a href=3D"https://github.com/GriffinCanCode/Callosum">https://github.com/G=
riffinCanCode/Callosum</a>
</p>
<p>
<a href=3D"https://pypi.org/project/callosum-dsl/">https://pypi.org/project=
/callosum-dsl/</a>
</p>
<p>
I wanted a more deterministic way to create personalities for my AI agents =
that was consistent in production. The interesting catch being that the com=
piler had to output a prompt, and it needed to be accessible for agents in =
Python. The solution was this DSL, a format for writing deterministic categ=
ories (similar to YAML) that compile to a prompt injectable into Langchain =
agents. OCaml was the natural choice due to its performance and proven capa=
bilities to host compilers (Rust obv). Looking for beta testers and any fee=
dback is welcome!
</p>
</div>
</div>
</div>
<div id=3D"outline-container-12" class=3D"outline-2">
<h2 id=3D"12">Outreachy May 2026</h2>
<div class=3D"outline-text-2" id=3D"text-12">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/outreachy-may-2026/17863/1"=
>https://discuss.ocaml.org/t/outreachy-may-2026/17863/1</a>
</p>
</div>
<div id=3D"outline-container-org561947a" class=3D"outline-3">
<h3 id=3D"org561947a">Patrick Ferris announced</h3>
<div class=3D"outline-text-3" id=3D"text-org561947a">
<p>
Hello everyone,
</p>
<p>
The OCaml community has signed up to Outreachy May 2026 (see <a href=3D"htt=
ps://discuss.ocaml.org/t/outreachy-december-2024-round">past</a> <a href=3D=
"https://discuss.ocaml.org/t/outreachy-june-2025">posts</a>)!
</p>
<blockquote>
<p>
<b>What is Outreachy?</b>
</p>
<p>
Outreachy is a paid, remote internship program. Outreachy promotes diversit=
y in open source and open science. Our internships are for people who face =
under-representation, and discrimination or systemic bias in the technology=
industry of their country.
</p>
</blockquote>
<p>
The current round is still ongoing with interns making great progress with =
@tmattio on <a href=3D"https://raven-ml.dev/">Raven</a>, with @xvw on <a hr=
ef=3D"https://yocaml.github.io/doc/yocaml/index.html">YOCaml</a> and with m=
yself on <a href=3D"https://github.com/geocaml/ocaml-tiff/">ocaml-tiff</a>.
</p>
</div>
<div id=3D"outline-container-org4bb99bc" class=3D"outline-4">
<h4 id=3D"org4bb99bc">Important Dates</h4>
<div class=3D"outline-text-4" id=3D"text-org4bb99bc">
<p>
For this next round, the important dates are as follows (these are always s=
ubject to some change):
</p>
<ul class=3D"org-ul">
<li>Mar 1 - Community sign up deadline :white_check_mark:</li>
<li>Mar 14 - <a href=3D"https://www.outreachy.org/communities/cfp/ocaml/">M=
entor Signup</a></li>
<li>Mar 17 to Apr 15 - Contribution period</li>
<li>May 18 to Aug 17 - Internship period</li>
</ul>
<p>
<b>Our next deadline is for mentors to sign up to the OCaml community</b> w=
ith a project idea. Please do consider being an Outreachy mentor. If you ha=
ve any questions or ideas you can always reach out to me directly. If you n=
eed a refresher of past projects, there=E2=80=99s a dedicated page on the O=
Caml website: <a href=3D"https://ocaml.org/outreachy">OCaml Outreachy Inter=
nships</a>. Feel free to discuss ideas on this thread too!=20
</p>
<p>
The OCaml community is currently able to financially support Outreachy inte=
rnships thanks to the generous support of <a href=3D"https://tarides.com">T=
arides</a> and <a href=3D"https://www.janestreet.com">Janestreet</a>. This =
includes being able to fund mentors as well.
</p>
<p>
Thanks! :camel:
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-org2b2f5f1" class=3D"outline-2">
<h2 id=3D"org2b2f5f1">Old CWN</h2>
<div class=3D"outline-text-2" id=3D"text-org2b2f5f1">
<p>
If you happen to miss a CWN, you can <a href=3D"mailto:alan.schmitt@polytec=
hnique.org">send me a message</a> and I'll mail it to you, or go take a loo=
k at <a href=3D"https://alan.petitepomme.net/cwn/">the archive</a> or the <=
a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive=
s</a>.
</p>
<p>
If you also wish to receive it every week by mail, you may subscribe to the=
<a href=3D"https://sympa.inria.fr/sympa/info/caml-list">caml-list</a>.
</p>
<div class=3D"authorname" id=3D"orgb603ad7">
<p>
<a href=3D"https://alan.petitepomme.net/">Alan Schmitt</a>
</p>
</div>
</div>
</div>
</div>
</body>
</html>
--=-=-=--