From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=TXwF0Tja; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id BD5E64008C for ; Tue, 30 Jun 2026 13:25:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=kDYQa6ZIJMRiULhfqGWDjRbizMPBQlM6sE31wTN1BeY=; b=TXwF0TjaTt1iJZTwpoaRlrOnXH5WsFPqYHpe+C7TVA+eW11fB7or0u7i 5vCuG04SLLkp6uvl/iGMZlRvy3xD5KJtkOMItwUU/Gc1zReqPE+47RsPq lBUhG1Vex1kIcWlZOMQkcN85owqSjKxLr/Q+p1URSok5qWcMqb6GgnHSS Y=; X-CSE-ConnectionGUID: ZO+sJbbZTBuW//wuSaSTYA== X-CSE-MsgGUID: YrGlXjlAT8+xZUv6ckWVjg== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.24,234,1774306800"; d="asc'?scan'208,217";a="284184913" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 30 Jun 2026 15:25:33 +0200 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 3166D816DF; Tue, 30 Jun 2026 15:25:33 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 27D4381992 for ; Tue, 30 Jun 2026 15:25:26 +0200 (CEST) X-CSE-ConnectionGUID: dMz2TmqwThOfIh1XpOqMFQ== X-CSE-MsgGUID: rBcYB8+gQv2/VRk1H9AyVw== IronPort-SDR: 6a43c3c4_RGDStx9jtwAYkx4TfQNvI14+RsPVSo3Ct/cScMKM9/ttaPF H4QnBSgCFlx0sawmA4OdpcXob0Si9Iw01qNR//Q== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0ElBwBmw0NqjyIeaIFQChaEAIEEGwFuXzMHCEmEHDyDT?= =?us-ascii?q?4U1iHCBFpA3gjyHMIEQDYFcgUEhAg0BBwEDAQgFLgEbBAECBAEBAQIBAgGCC?= =?us-ascii?q?4J0AhaNNgIfBgEENBMBAgQDAgMBAQEBAQEBAQEBAQsBAQEEAQEBAgEBAgQDA?= =?us-ascii?q?QEBAQIQAQEBAQEBOQVJhk8NgkUZOFMedAEBAQEBAQEBAQEBAQEBIgEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECBAQEAREiA?= =?us-ascii?q?SoBMQ4BCAQGEwEBJhIYIwMUAQYDAgQNATUXARIUBoJoAYIiAk8DBQwGm1ibR?= =?us-ascii?q?Hp/M4EBggwBAQaBCD4CAQQLAwEOCSbaFoFgCQmBTYFYhBmCTg8NASpJagIBA?= =?us-ascii?q?oRPCYQ4Jw+BVUSBFAE1gXRKB2+CVQwBAQEBGERIBQEHAwUCAgEIEg8kCYMlg?= =?us-ascii?q?mqCERWBDIJoawUZASZ/YoNNgWCFZ4JCLAFVExcLBwVegQgDKi8tbjIdgSM+F?= =?us-ascii?q?zRYGwcFgR2Ba4EDhHojHwM5f4EwdVhmFTA1gQMSHgqBUjADC209NxQbi0sQI?= =?us-ascii?q?Q2BLUoZFw+BSiYOCy0GFycTAxAYBwIKARsOAhcLLggFCRUKDAoCEyEJBQkWB?= =?us-ascii?q?QEEKgUGAgkCKwKSTgoCJAEBAhwOA49bjhmTWYEKNAeEIIFgBgyIH2qBJotmh?= =?us-ascii?q?kqDV4QEhxeFfZlUIphmI4I2hyhdSQlggXqVJBAmBgcMDYU4gX8jSSM/AR0MB?= =?us-ascii?q?zMaMEMNDIIaAQEBMQlHHA9Xh0qGDBaDYEFAPYEMGoF0O4EoxWVCNQEBAQE7B?= =?us-ascii?q?wIEAwEMBIVrAQGMBgQNFwyBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:oB+MNK4eUnlqc0wh4QPXwPfXdLJyesId70hD6qkRc202TiX8ra rCoB11737JYVoqNE3I+urwW5VoI0m9yXcd2+B4VotKNzOJhILHFu5fxLqn6wKlMSzz/OxQ2M 5bAs1DIey1K0N1yeLz4AzQKadG/DBrytHNudvj X-Talos-CUID: 9a23:mHwArWEpBKl55r00qmJr0VxOJsU8bUHd63nxIxaIEUFwbZOsHAo= X-Talos-MUID: 9a23:gU/cdQmvLxpiv3mgrkXgdnp4HsxZyfTtB3kTy9I4gcrdFX1ZKgmC2WE= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.24,234,1774306800"; d="asc'?scan'208,217";a="284184797" X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-MGA-submission: =?us-ascii?q?MDEuFVjg4urPNJ4Qe7mzPNK0IAUAYsv/HKgk3T?= =?us-ascii?q?1F5pNCsurhUzGfBXDNnumR5Ab7bhHsUZHd7FFRzfHa1A9LcisxhfG5kg?= =?us-ascii?q?O4xpU96zRF2fYemt9TzPpdSmT54mDYZsBAlmba8tBbrO7ZSNYgha/UNR?= =?us-ascii?q?5I2uSVvATsuYgs4oZWk/9vAw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Jun 2026 15:25:24 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id E1C311A5F8; Tue, 30 Jun 2026 15:25:23 +0200 (CEST) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 30 Jun 2026 15:25:21 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 30 15:25:24 2026 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499997, queueID=3EB121A60A X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19540 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAyMyB0byAzMCwNCjIwMjYuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KTmV3IHJlbGVh c2Ugb2YgU2VrDQpKc19vZl9vY2FtbCAvIFdhc21fb2Zfb2NhbWwgNi40DQpPY3NpcGVyc2lzdCAy LjEuMDogdHlwZS1zYWZlIHBlcnNpc3RlbnQgcmVmZXJlbmNlcyB3aXRoIERlcml2aW5nDQpNb2R1 bGFyIGV4cGxpY2l0cyBpbiBwcmUtT0NhbWwgNS41DQpMUmdyZXAgMC45OiBCZXR0ZXIgc3ludGF4 IGVycm9ycyBmb3IgT0NhbWwgYW5kIE1lbmhpcg0KU3RhdGljIEFuYWx5c2lzIGZvciBPQ2FtbA0K bmV3IHJlbGVhc2VzOiBNZXJsaW4gNS44IGFuZCBPQ2FtbC1MU1AgMS4yNy4wIHdpdGggc3VwcG9y dCBmb3IgT0NhbWwgNS41DQpkdXJhcyAyLjEuMSDigJQgZGFpbHkgbm90ZXMgYXMgcGxhaW4gdGV4 dCBmaWxlcw0KU29mdHdhcmUgRW5naW5lZXIgYXQgTGV4aUZpIChQYXJpcykNCk93ZWJ2aWV3IDog T0NhbWwgYmluZGluZyB0byB0aGUgd2VidmlldyBsaWJyYXJ5DQpPQ2FtbCBSdW50aW1lIE1lZXRp bmc6IE1vbiwgSnVseSA2IEAgMTA6MDAgVVRDICgxMDowMCBMb25kb24vQ2FtYnJpZGdlLCAxMTow MCBQYXJpcywgN3BtIFN5ZG5leSkNCk9sZCBDV04NCg0KDQpOZXcgcmVsZWFzZSBvZiBTZWsNCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbmV3LXJlbGVhc2Utb2Ytc2Vr LzE4MjgxLzE+DQoNCg0KRnJhbsOnb2lzIFBvdHRpZXIgYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBXZSBhcmUgcGxlYXNlZCB0byBhbm5vdW5jZSBhIG5ldyByZWxlYXNlIG9m IFtTZWtdLCBhIGxpYnJhcnkgdGhhdA0KICBvZmZlcnMgZWZmaWNpZW50IGVwaGVtZXJhbCAobXV0 YWJsZSkgYW5kIHBlcnNpc3RlbnQgKGltbXV0YWJsZSkNCiAgL3NlcXVlbmNlLyBkYXRhIHN0cnVj dHVyZXMsIHBsdXMgZWZmaWNpZW50IGNvbnZlcnNpb25zIGJldHdlZW4gdGhlc2UNCiAgdHdvIGZv cm1zLg0KDQogIFRoaXMgbmV3IHJlbGVhc2UgaW50cm9kdWNlcyBvcHRpbWl6YXRpb25zIHRoYXQg c3BlZWQgdXAgc2V2ZXJhbA0KICBvcGVyYXRpb25zLCBpbmNsdWRpbmcgcmFuZG9tIGFjY2VzcyAo YGdldCcsIGBzZXQnKSwgc3BsaXR0aW5nLCBhbmQNCiAgY29uY2F0ZW5hdGlvbi4gRm9yIGRldGFp bHMsIHBsZWFzZSBzZWUgdGhlIFtjaGFuZ2UgbG9nXS4NCg0KICDilIzilIDilIDilIDilIANCiAg 4pSCIG9wYW0gdXBkYXRlICYmIG9wYW0gaW5zdGFsbCBzZWsNCiAg4pSU4pSA4pSA4pSA4pSADQoN CiAgSGFwcHkgaGFja2luZywgQXJ0aHVyIENoYXJndcOpcmF1ZCAmIEZyYW7Dp29pcyBQb3R0aWVy Lg0KDQoNCltTZWtdIDxodHRwczovL2dpdGxhYi5pbnJpYS5mci9mcG90dGllci9zZWs+DQoNCltj aGFuZ2UgbG9nXQ0KPGh0dHBzOi8vZ2l0bGFiLmlucmlhLmZyL2Zwb3R0aWVyL3Nlay8tL2Jsb2Iv bWFzdGVyL0NIQU5HRVMubWQ/cmVmX3R5cGU9aGVhZHM+DQoNCg0KRnJhbsOnb2lzIFBvdHRpZXIg bGF0ZXIgYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIExldCBtZSBhZGQg dGhpcyBsaW5rIHRvIFt0aGUgZG9jdW1lbnRhdGlvbl0uDQoNCg0KW3RoZSBkb2N1bWVudGF0aW9u XQ0KPGh0dHBzOi8vY2FtYml1bS5pbnJpYS5mci9+ZnBvdHRpZXIvc2VrL2RvYy9zZWsvU2VrLz4N Cg0KDQpKc19vZl9vY2FtbCAvIFdhc21fb2Zfb2NhbWwgNi40DQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1qcy1vZi1vY2FtbC13YXNtLW9mLW9jYW1sLTYtNC8xODI4Mi8xPg0KDQoNCkho dWdvIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgSSdtIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIGpvaW50IHJlbGVhc2Ugb2YgKmpz X29mX29jYW1sKiBhbmQNCiAgKndhc21fb2Zfb2NhbWwgNi40LjAqLg0KDQogIEpzX29mX29jYW1s IGlzIGEgY29tcGlsZXIgZnJvbSBPQ2FtbCBieXRlY29kZSB0byBKYXZhU2NyaXB0LiBJdCBtYWtl cw0KICBpdCBwb3NzaWJsZSB0byBydW4gcHVyZSBPQ2FtbCBwcm9ncmFtcyBpbiBKYXZhU2NyaXB0 IGVudmlyb25tZW50cyBsaWtlDQogIGJyb3dzZXJzIGFuZCBOb2RlLmpzLg0KDQogIFdhc21fb2Zf b2NhbWwgaXMgYSBjb21waWxlciBmcm9tIE9DYW1sIGJ5dGVjb2RlIHRvIFdlYkFzc2VtYmx5LiBJ dCBpcw0KICBoaWdobHkgY29tcGF0aWJsZSB3aXRoIGpzX29mX29jYW1sLCBzbyB5b3UgY2FuIGNv bXBpbGUgeW91ciBwcm9ncmFtcw0KICB3aXRoIHdhc21fb2Zfb2NhbWwgaW5zdGVhZCBvZiBqc19v Zl9vY2FtbCBhbmQgZXhwZXJpZW5jZSBvdmVyYWxsDQogIGJldHRlciBwZXJmb3JtYW5jZS4NCg0K ICBNb3N0IHNpZ25pZmljYW50IGNoYW5nZXMgc2luY2UgdmVyc2lvbiA2LjM6DQoNCg0KVG9vbGNo YWluDQrilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgKk9DYW1sIDUuNS4wIHN1 cHBvcnQqLg0KICDigKIgKk94Q2FtbCBzdXBwb3J0Ki4NCg0KDQp3YXNtX29mX29jYW1sDQrilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgKldBU0kgMC4xIHN1 cHBvcnQqIOKAlCB0YXJnZXQgc3RhbmRhbG9uZSBXQVNJIHJ1bnRpbWVzICh3YXNtdGltZSBhbmQN CiAgICAgZnJpZW5kcyksIG5vIEphdmFTY3JpcHQgaG9zdCByZXF1aXJlZC4NCiAg4oCiICpEeW5s aW5rIGFuZCB0b3BsZXZlbCBzdXBwb3J0KiDigJQgdGhlIE9DYW1sIHRvcGxldmVsIG5vdyBydW5z IG9uIHRoZQ0KICAgICBXYXNtIGJhY2tlbmQuDQogIOKAoiBBbiAqYWx0ZXJuYXRpdmUgZWZmZWN0 cyBiYWNrZW5kKiBiYXNlZCBvbiB0aGUgW1N0YWNrIFN3aXRjaGluZw0KICAgIHByb3Bvc2FsXS4N CiAg4oCiICpQdXJlLVdhc20genN0ZCBhbmQgQkxBS0UyYiog4oCUIHVubWFyc2hhbGxpbmcgY29t cHJlc3NlZCB2YWx1ZXMgYW5kDQogICAgIGBEaWdlc3QuQkxBS0UyezUxMiwyNTYsMTI4fScgbm8g bG9uZ2VyIG5lZWQgdGhlIEphdmFTY3JpcHQgc2hpbXMsDQogICAgIHNvIHRoZXkgd29yayB1bmRl ciBXQVNJIHRvby4NCiAg4oCiIFRoZSBsZWdhY3kgYG51bScgbGlicmFyeSBub3cgd29ya3Mgb24g V2FzbSAodGhlIGBuYXQnIHByaW1pdGl2ZXMNCiAgICB3ZXJlIG5vLW9wIHN0dWJzKS4NCg0KDQpb U3RhY2sgU3dpdGNoaW5nIHByb3Bvc2FsXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJs eS9zdGFjay1zd2l0Y2hpbmc+DQoNCg0KTGlicmFyeSDigJQgbmV3IHdlYiBBUElzDQrilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICDigKIgKmBQcm9taXNlJyBtb2R1bGUqIOKAlCB0eXBlLXNhZmUgYmluZGluZ3MgdG8g SlMgcHJvbWlzZXMsIHdpdGggKkx3dA0KICAgICBpbnRlcm9wKiAoYEpzX29mX29jYW1sX2x3dC5Q cm9taXNlLnt0b19sd3Qsb2ZfbHd0fScpIGFuZA0KICAgICBQcm9taXNlLXR5cGVkIGBEb21faHRt bCcgYmluZGluZ3MuDQogIOKAoiAqYEZldGNoJyArIGBBYm9ydCcgbW9kdWxlcyog4oCUIHRoZSBG ZXRjaCBBUEkgd2l0aCB0eXBlZA0KICAgICBgQWJvcnRDb250cm9sbGVyfi9+QWJvcnRTaWduYWwn IGNhbmNlbGxhdGlvbi4NCiAg4oCiICpgRG9tX3N2ZycgYWxpZ25lZCB3aXRoIFNWRyAyKiwgdGhl ICpwb3BvdmVyIEFQSSosDQogICAgICpgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQnKiwgYSBuZXcg KmBQZXJmb3JtYW5jZScgbW9kdWxlKiwNCiAgICAgYWRkaXRpb25hbCBgQ29uc29sZScgYmluZGlu Z3MsIGFuZCBtYW55IG1vcmUgYERvbV9odG1sJyBiaW5kaW5ncy4NCg0KDQpCdWcgZml4ZXMNCuKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBBIGxhcmdlIG51bWJlciBvZiBidWcg Zml4ZXMgYWNyb3NzIHRoZSBjb21waWxlciwgcnVudGltZSwgbGlicmFyeQ0KICAgIGJpbmRpbmdz LCBhbmQgUFBYLg0KDQoNCuKaoO+4jyBCcmVha2luZyBjaGFuZ2VzDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBBIGZldyBjaGFuZ2Vz IGFyZSBzb3VyY2UtaW5jb21wYXRpYmxlIOKAlCBtb3N0bHkgdG8gZml4IGluY29ycmVjdA0KICBi aW5kaW5ncyBhbmQgYmVoYXZpb3Ig4oCUIGFuZCBtYXkgcmVxdWlyZSB1cGRhdGluZyBleGlzdGlu ZyBjb2RlLiBTZWUNCiAgdGhlIFttaWdyYXRpb24gZ3VpZGVdLg0KDQogIFNlZSB0aGUgW2RvY3Vt ZW50YXRpb25dIGFuZCB0aGUgW2Z1bGwgY2hhbmdlbG9nXS4NCg0KDQpbbWlncmF0aW9uIGd1aWRl XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY3NpZ2VuL2pzX29mX29jYW1sL3dpa2kvVXBncmFkZS1m cm9tLTYuMy4wLXRvLTYuNC4wPg0KDQpbZG9jdW1lbnRhdGlvbl0gPGh0dHBzOi8vb2NzaWdlbi5v cmcvanNfb2Zfb2NhbWwvPg0KDQpbZnVsbCBjaGFuZ2Vsb2ddDQo8aHR0cHM6Ly9naXRodWIuY29t L29jc2lnZW4vanNfb2Zfb2NhbWwvYmxvYi9tYXN0ZXIvQ0hBTkdFUy5tZD4NCg0KDQpWaW5jZW50 IEJhbGF0IHRoZW4gYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlIHJlbGVhc2VkIEVsaW9t IDEyLjEgYXQgdGhlIHNhbWUgdGltZSwgYnJpbmdpbmcgY29tcGF0aWJpbGl0eSB3aXRoDQogIGJv dGgganNfb2Zfb2NhbWwgNi40IGFuZCBPQ2FtbCA1LjUuDQoNCg0KT2NzaXBlcnNpc3QgMi4xLjA6 IHR5cGUtc2FmZSBwZXJzaXN0ZW50IHJlZmVyZW5jZXMgd2l0aCBEZXJpdmluZw0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tb2NzaXBlcnNpc3QtMi0xLTAtdHlwZS1zYWZlLXBlcnNpc3RlbnQtcmVmZXJlbmNlcy13 aXRoLWRlcml2aW5nLzE4MjgzLzE+DQoNCg0KVmluY2VudCBCYWxhdCBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIFtPY3NpcGVyc2lzdF0gMi4xLjAgaXMgb3V0LiBQZXJzaXN0ZW50IHJlZmVy ZW5jZXMsIHN0b3JlcyBhbmQgdGFibGVzDQogIGNhbiBub3cgYmUgc2VyaWFsaXNlZCB3aXRoIGBE ZXJpdmluZ19Kc29uJyBpbnN0ZWFkIG9mIGBNYXJzaGFsJzogdGhlDQogIGRhdGEgaXMgaHVtYW4t cmVhZGFibGUgaW4gdGhlIGRhdGFiYXNlIGFuZCBzdGFibGUgYWNyb3NzIE9DYW1sDQogIHZlcnNp b25zLiBUaGUgbmV3IEFQSSBpcyBmdWxseSBiYWNrd2FyZCBjb21wYXRpYmxlLCBhbmQgT2NzaXBl cnNpc3QNCiAgd29ya3MgYXMgYSBzdGFuZGFsb25lIGxpYnJhcnkgZm9yIGFueSBPQ2FtbCBwcm9n cmFtIChubyBFbGlvbSBvcg0KICBPY3NpZ2VuIFNlcnZlciByZXF1aXJlZCkuDQoNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiB0eXBlIHVzZXIgPSB7IG5hbWUgOiBzdHJpbmc7IGFnZSA6IGludCB9 IFtAQGRlcml2aW5nIGpzb25dDQogIOKUgiANCiAg4pSCICgqIGEgcGVyc2lzdGVudCByZWZlcmVu Y2UsIHN0b3JlZCBhcyByZWFkYWJsZSBKU09OICopDQogIOKUgiBsZXQgdmlzaXRzID0gT2NzaXBl cnNpc3QuUmVmX2pzb24ucmVmIH5wZXJzaXN0ZW50OiJ2aXNpdHMiIFslanNvbjogaW50XSAwDQog IOKUgiANCiAg4pSCIGxldCBjb3VudF92aXNpdCAoKSA9DQogIOKUgiAgIGxldCVsd3QgbiA9IE9j c2lwZXJzaXN0LlJlZl9qc29uLmdldCB2aXNpdHMgaW4NCiAg4pSCICAgT2NzaXBlcnNpc3QuUmVm X2pzb24uc2V0IHZpc2l0cyAobiArIDEpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEZ1bGwgYW5u b3VuY2VtZW50Og0KICA8aHR0cHM6Ly9vY3NpZ2VuLm9yZy9ibG9nL3Bvc3RzL29jc2lwZXJzaXN0 LTIuMS4wLmh0bWw+DQoNCg0KW09jc2lwZXJzaXN0XSA8aHR0cHM6Ly9vY3NpZ2VuLm9yZy9vY3Np cGVyc2lzdC8+DQoNCg0KTW9kdWxhciBleHBsaWNpdHMgaW4gcHJlLU9DYW1sIDUuNQ0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vaW5ib3guY2kuZGV2L2NhbWwtbGlzdC82ZDVmMTE1Yy04NjZkLTRjYzAtYTEwMi03 MzY1Nzc3OGEwZTJAaW5yaWEuZnIvVC8+DQoNCg0Kb2xlZyBzYWlkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBPbmUgb2YgdGhlIG5vdGFibGUgZmVhdHVyZXMgb2YgdGhlIGp1c3Qg YW5ub3VuY2VkIE9DYW1sIDUuNSBhcmUNCiAgbW9kdWxlLWRlcGVuZGVudCBmdW5jdGlvbnMsIGEu ay5hLiBtb2R1bGFyIGV4cGxpY2l0cy4gSXQgaXMgYSB3ZWxjb21lDQogIGFkZGl0aW9uOiBpdCBs ZXRzIHVzIGV4cHJlc3MgaGlnaGVyLXJhbmtlZCB0eXBlcyBpbiB0aGUgc2ltcGxlc3Qgd2F5LA0K ICBhbmQgaXMgcGFydGljdWxhcmx5IGdvb2QgZm9yIHR5cGVkIHRhZ2xlc3MtZmluYWwgY29kZS4N Cg0KICBJdCBzaG91bGQgYmUgbWVudGlvbmVkIGhvd2V2ZXIgdGhhdCBtb2R1bGFyIGV4cGxpY2l0 cyBjb3VsZCBiZSBkb25lDQogIGJlZm9yZSwgd2l0aCBsaXR0bGUgb3Igbm8gaGFzc2xlLiBQZXJo YXBzIHRoZXJlIGlzIG1lcml0IHRvIHJlbWluZCBvZg0KICB0aGF0IG9sZCB0cmlja37igJMgZXNw ZWNpYWxseSBiZWNhdXNlIGl0IHdvcmtzIGFsc28gd2l0aCBzdGF0aWNhbGx5DQogIHVua25vd24g bW9kdWxlcyAod2hpY2ggYXJlIG91dCBvZiBzY29wZSBmb3IgT0NhbWwgNS41IG1vZHVsYXINCiAg ZXhwbGljaXRzKS4NCg0KICBBcyB0aGUgcnVubmluZyBleGFtcGxlIHdlIHJlLXVzZSB0aGUgcHJl dHR5LXByaW50aW5nIGV4YW1wbGUgaW4gdGhlDQogIE9DYW1sIDUuNSBhbm5vdW5jZW1lbnQgKGhl cmVhZnRlciwgQW5uNTUpLg0KDQogIFdlIHN0YXJ0IGhvd2V2ZXIgd2l0aCBhIHNpbXBsZXIgZXhh bXBsZTogcHJldHR5LXByaW50aW5nIGEgc2V0DQogIGdlbmVyYXRlZCBieSB0aGUgYFNldC5NYWtl JyBmdW5jdG9yLiBUaGUgZXhhbXBsZSBmb2xsb3dzIHRoZSBwYXR0ZXJuDQogIG9mIHRoZSBwcF9t YXAgZnVuY3Rpb24gZnJvbSBBbm41NS4gSXQgaXMgc2ltcGxlciB0aGFuIHByaW50aW5nIGEgbWFw DQogIGJlY2F1c2UgaXQgaW52b2x2ZXMgbm8gaGlnaGVyLXJhbmsgdHlwZXMuDQoNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiBsZXQgcHBfc2V0ICh0eXBlIGEgcykgDQogIOKUgiAgICAgICAobW9k dWxlIE06IFNldC5TIHdpdGggdHlwZSBlbHQgPSBhIGFuZCB0eXBlIHQgPSBzKSANCiAg4pSCICAg ICAgIChwcF9lbHQ6Rm9ybWF0LmZvcm1hdHRlci0+YS0+dW5pdCkgKHBwZjpGb3JtYXQuZm9ybWF0 dGVyKSAoc2V0OnMpID0gDQogIOKUgiAgIGlmIE0uaXNfZW1wdHkgc2V0IHRoZW4gRm9ybWF0LmZw cmludGYgcHBmICLDuCIgZWxzZSANCiAg4pSCICAgbGV0IHBwX3NlcCBwcGYgKCkgPSBGb3JtYXQu ZnByaW50ZiBwcGYgIixAICIgaW4gDQogIOKUgiAgIEZvcm1hdC5mcHJpbnRmIHBwZiAiQFt7QCAl YUAgfUBdIiANCiAg4pSCICAgICAoRm9ybWF0LnBwX3ByaW50X3NlcSB+cHBfc2VwIHBwX2VsdCkg KE0udG9fc2VxIHNldCkgDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEl0IGlzIGFsbW9zdCBsaXRl cmFsbHkgdGhlIHBwX21hcCBleGFtcGxlIGZyb20gQW5uNTUsIHdpdGggc2V0DQogIHN1YnN0aXR1 dGVkIGZvciBtYXAuIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdHlwZSBhbm5vdGF0aW9ucy4gVGhp cyBpcw0KICBub3QgYSBidWc6IEkgaW5zaXN0IG9uIHdyaXRpbmcgc2lnbmF0dXJlcyBvciBleHBs aWNpdCB0eXBlIGFubm90YXRpb25zDQogIGZvciBhbGwgdG9wLWxldmVsIGRlZmluaXRpb25zIChl eGNlcHQsIHBlcmhhcHMsIHRoZSBtb3N0IHRyaXZpYWwpLg0KDQogIFRoZSBhbm5vdGF0aW9ucyBj b3VsZCBiZSBzaW1wbGlmaWVkIGlmIHdlIGludHJvZHVjZQ0KDQogIOKUjOKUgOKUgOKUgOKUgA0K ICDilIIgdHlwZSAoJ2UsJ3MpIHNldCA9IChtb2R1bGUgU2V0LlMgd2l0aCB0eXBlIGVsdCA9ICdl IGFuZCB0eXBlIHQgPSAncykNCiAg4pSCIHR5cGUgJ2EgcHJpbnRlciA9IEZvcm1hdC5mb3JtYXR0 ZXItPidhLT51bml0DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZSBleGFtcGxlIHRoZW4gcmVh ZHMNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBwcF9zZXQgOiB0eXBlIGUgcy4gKGUs cykgc2V0IC0+IGUgcHJpbnRlciAtPiBzIHByaW50ZXIgPSANCiAg4pSCICAgZnVuIChtb2R1bGUg TSkgcHBfZWx0IHBwZiBzZXQgLT4gKCogLi4uIGFzIGJlZm9yZSAuLi4gKikNCiAg4pSU4pSA4pSA 4pSA4pSADQoNCiAgVGhlIHNpZ25hdHVyZSB0ZWxscyBhdCBhIGdsYW5jZSB3aGF0IHBwX3NldCBp cyBkb2luZyAod2hpY2ggaXMgb25lIG9mDQogIHRoZSBiZW5lZml0cyBvZiBzaWduYXR1cmVzOiBp dCBpcyBub3QganVzdCBmb3IsIGFuZCBub3QgbWFpbmx5IGZvciwNCiAgdGhlIGNvbXBpbGVyLikN Cg0KICBXZSBjYW4gdXNlIHBwX3NldCBqdXN0IGxpa2UgcHBfbWFwIHdhcyB1c2VkIGluIHRoZSBB bm41NSBleGFtcGxlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbW9kdWxlIFN0cmluZ19z ZXQgPSBTZXQuTWFrZShTdHJpbmcpIA0KICDilIIgDQogIOKUgiBsZXQgKCkgPSANCiAg4pSCICAg bGV0IG0gPSBTdHJpbmdfc2V0Lm9mX2xpc3QgWyJaZXJvIjsgIlplcm8iOyAiT25lIjsgIlVuIl0g aW4gDQogIOKUgiAgIGxldCBwcF9zdHIgPSBGb3JtYXQucHBfcHJpbnRfc3RyaW5nIGluIA0KICDi lIIgICBGb3JtYXQucHJpbnRmICIlYUAuIiAocHBfc2V0IChtb2R1bGUgU3RyaW5nX3NldCkgcHBf c3RyKSBtIA0KICDilJTilIDilIDilIDilIANCg0KICBPdXIgcmVuZGl0aW9uIG9mIG1vZHVsYXIg ZXhwbGljaXRzIGV4dGVuZHMgYmV5b25kIHN0YXRpY2FsbHkga25vd24NCiAgbW9kdWxlcyBsaWtl IFN0cmluZ19zZXQuIEZvciBleGFtcGxlLA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKCog QWJzdHJhY3Qgc2V0IG9mIGVsZW1lbnRzIG9mIHR5cGVzICdlLiBUaGUgaW1wbGVtZW50YXRpb24g aXMgYWJzdHJhY3QgKikNCiAg4pSCIA0KICDilIIgdHlwZSAnZSBhc2V0ID0gKG1vZHVsZSBTZXQu UyB3aXRoIHR5cGUgZWx0ID0gJ2UpDQogIOKUgiANCiAg4pSCIGxldCBmIDogdW5pdCAtPiBpbnQg YXNldCA9IGZ1biAoKSAtPiANCiAg4pSCICAgaWYgUmFuZG9tLmJvb2wgKCkgdGhlbiANCiAg4pSC ICAgICAobW9kdWxlIFNldC5NYWtlKEludCkpIA0KICDilIIgICBlbHNlIA0KICDilIIgICAgICht b2R1bGUgU2V0Lk1ha2Uoc3RydWN0IHR5cGUgdCA9IGludCANCiAg4pSCICAgICAgIGxldCBjb21w YXJlIHggeSA9IC0gSW50LmNvbXBhcmUgeCB5IGVuZCkpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQog IFRoZSBmdW5jdGlvbiBmIHJhbmRvbWx5IHJldHVybnMgb25lIG9mIHR3byBkaXN0aW5jdCBTZXQN CiAgaW1wbGVtZW50YXRpb25zICh0aGUgU2V0LnQgdHlwZXMgYXJlIG5vdCBjb21wYXRpYmxlKS4g QXMgYW4NCiAgYXBwbGljYXRpb24sIHdlIHByaW50IGEgbGlzdCBvZiBpbnRlZ2VycyBhcyBhIHNl dCAoYXV0b21hdGljYWxseQ0KICBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzKToNCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBwcmludF9hc19zZXQgOiB0eXBlIGEuIGEgYXNl dCAtPiBhIHByaW50ZXIgLT4gYSBsaXN0IHByaW50ZXIgID0gDQogIOKUgiAgIGZ1biAobW9kdWxl IE0pIHBwIHBwZiBsc3QgLT4gDQogIOKUgiAgICAgcHBfc2V0IChtb2R1bGUgTSkgcHAgcHBmIChN Lm9mX2xpc3QgbHN0KQ0KICDilIIgDQogIOKUgiBsZXQgXyA9IEZvcm1hdC5wcmludGYgIiVhQC4i IA0KICDilIIgICAgIChwcmludF9hc19zZXQgKGYgKCkpIEZvcm1hdC5wcF9wcmludF9pbnQpIFsx OzI7MzsxXQ0KICDilJTilIDilIDilIDilIANCg0KICBUaGUgcmVzdWx0IGlzIGluZGVlZCBlaXRo ZXIgInsgMSwgMiwgMyB9IiBvciAieyAzLCAyLCAxIH0iLCBkZXBlbmRpbmcNCiAgb24gaG93IGRp ZSBpcyBjYXN0Lg0KDQogIExldCB1cyBub3cgdGFja2xlIHRoZSBwcF9tYXAgZXhhbXBsZSBmcm9t IEFubjU1LiBJdCBpcyBjaGFsbGVuZ2luZw0KICBiZWNhdXNlIG9mIHRoZSBoaWdoZXItcmFuayB0 eXBlIG9mIHRoZSBtYXAgdHlwZSAnYSBNYXAuUy50Lg0KDQogIEl0IGlzIHRlbXB0aW5nIHRvIGRl ZmluZSB0aGUgbW9kdWxlIHR5cGUgYXMNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHR5cGUg KCdrLCd2LCdtKSBtYXAgPSANCiAg4pSCICAgICAobW9kdWxlIE1hcC5TIHdpdGggdHlwZSBrZXkg PSAnayBhbmQgdHlwZSAnYSB0ID0gJ20gY29uc3RyYWludCAnYSA9ICd2KQ0KICDilJTilIDilIDi lIDilIANCg0KICBBbGFzLCBpdCBkb2Vzbid0IHdvcms6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiAyIHwgICAgIChtb2R1bGUgTWFwLlMgd2l0aCB0eXBlIGtleSA9ICdrIGFuZCB0eXBlICdh IHQgPSAnbSBjb25zdHJhaW50ICdhID0gJ3YpDQogIOKUgiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4N CiAg4pSCIEVycm9yOiBTeW50YXggZXJyb3I6IGludmFsaWQgcGFja2FnZSB0eXBlOiBwYXJhbWV0 cml6ZWQgdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgUGFj a2FnZSB0eXBlcyBhbmQgdGhlaXIgYHdpdGgnIGNvbnN0cmFpbnRzIGNvbWUgd2l0aCBtYW55DQog IHJlc3RyaWN0aW9ucywgd2hpY2ggaXMgZGVlcGx5IHVuZm9ydHVuYXRlLg0KDQogIFdlIGhhdmUg dG8gcmVzb3J0IHRvIGFuIGVuY29kaW5nOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbW9k dWxlIHR5cGUgbWFwcyA9IHNpZw0KICDilIIgICBpbmNsdWRlIE1hcC5TDQogIOKUgiAgIHR5cGUg dg0KICDilIIgICB0eXBlIG10DQogIOKUgiAgIHZhbCBvZl9tdCA6IG10IC0+IHYgdA0KICDilIIg ICB2YWwgdG9fbXQgOiB2IHQgLT4gbXQgDQogIOKUgiBlbmQNCiAg4pSCIHR5cGUgKCdrLCd2LCdt KSBtYXAgPSANCiAg4pSCICAgICAobW9kdWxlIG1hcHMgd2l0aCB0eXBlIGtleSA9ICdrIGFuZCB0 eXBlIHYgPSAndiBhbmQgdHlwZSBtdCA9ICdtKQ0KICDilJTilIDilIDilIDilIANCg0KICBPbmUg c2hvdWxkIG1lbnRpb24gdGhhdCB0aGlzIGlzIGEgc3RyaWN0bHkgbW9yZSBnZW5lcmFsIHR5cGUg b2YgbWFwczoNCiAgaXQgc3VwcG9ydHMgc3BlY2lhbGl6ZWQgaW1wbGVtZW50YXRpb25zIGZvciBw YXJ0aWN1bGFyIGNvbWJpbmF0aW9uIG9mDQogIGtleXMgYW5kIHZhbHVlcyAoZS5nLiwgaWYgJ3Yg aXMgYm9vbCwgd2UgY2FuIHVzZSBTZXQgYXMgdGhlIHVuZGVybHlpbmcNCiAgc3RydWN0dXJlLikN Cg0KICBUaGUgcHJldHR5LXByaW50ZXIgb2YgbWFwcyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgQW5u NTUsIHdpdGggdHdvDQogIGFkZGl0aW9uczogdHdvIG9jY3VycmVuY2VzIG9mIE0ub2ZfdC4NCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBwcF9tYXAgOiB0eXBlIGsgdiBtLiAoayx2LG0p IG1hcCAtPiBrIHByaW50ZXIgLT4gdiBwcmludGVyIC0+IG0gcHJpbnRlciA9IA0KICDilIIgICAg IGZ1biAobW9kdWxlIE0pIHBwX2tleSBwcF92IHBwZiBzZXQgLT4gDQogIOKUgiAgIGlmIE0uaXNf ZW1wdHkgKE0ub2ZfbXQgc2V0KSB0aGVuIEZvcm1hdC5mcHJpbnRmIHBwZiAiw7giIGVsc2UgDQog IOKUgiAgIGxldCBwcF9zZXAgcHBmICgpID0gRm9ybWF0LmZwcmludGYgcHBmICIsQCAiIGluIA0K ICDilIIgICBsZXQgcHBfYmluZGluZyBwcGYgKGssdikgPSBGb3JtYXQuZnByaW50ZiBwcGYgIkBb JWFAID1AICVhQF0iIHBwX2tleSBrIHBwX3YgdiANCiAg4pSCICAgaW4gDQogIOKUgiAgIEZvcm1h dC5mcHJpbnRmIHBwZiAiQFt7QCAlYUAgfUBdIiANCiAg4pSCICAgICAoRm9ybWF0LnBwX3ByaW50 X3NlcSB+cHBfc2VwIHBwX2JpbmRpbmcpIChNLnRvX3NlcSAoTS5vZl9tdCBzZXQpKSANCiAg4pSU 4pSA4pSA4pSA4pSADQoNCiAgSXQgYXBwbGllcyB0byBzdGF0aWNhbGx5ICp1bmtub3duKiBtb2R1 bGVzIGhvd2V2ZXIsIHVubGlrZSBwcF9tYXAgaW4NCiAgQW5uNTUNCg0KICDilIzilIDilIDilIDi lIANCiAg4pSCIHR5cGUgKCdrLCd2KSBhbWFwID0gKG1vZHVsZSBtYXBzIHdpdGggdHlwZSBrZXkg PSAnayBhbmQgdHlwZSB2ID0gJ3YpDQogIOKUgiANCiAg4pSCIGxldCBzdHJpbmdfbWFwIDogdHlw ZSBhLiB1bml0IC0+IChzdHJpbmcsYSkgYW1hcCA9IGZ1biAoKSAtPiANCiAg4pSCICAgKG1vZHVs ZSBzdHJ1Y3QNCiAg4pSCICAgICBpbmNsdWRlIE1hcC5NYWtlKFN0cmluZykgDQogIOKUgiAgICAg dHlwZSB2ID0gYQ0KICDilIIgICAgIHR5cGUgbXQgPSB2IHQNCiAg4pSCICAgICBsZXQgb2ZfbXQg PSBGdW4uaWQNCiAg4pSCICAgICBsZXQgdG9fbXQgPSBGdW4uaWQNCiAg4pSCICAgZW5kKQ0KICDi lIIgDQogIOKUgiBsZXQgKCkgPSANCiAg4pSCICAgbGV0IG1kID0gc3RyaW5nX21hcCAoKSBpbg0K ICDilIIgICBsZXQgbW9kdWxlIE0gPSAodmFsIChtZCA6IChzdHJpbmcsaW50KSBhbWFwKSkgaW4N CiAg4pSCICAgbGV0IG0gPSBNLm9mX2xpc3QgWyJaZXJvIiwgMDsgIk9uZSIsIDFdIGluIA0KICDi lIIgICBsZXQgcHBfc3RyID0gRm9ybWF0LnBwX3ByaW50X2ludCBpbiANCiAg4pSCICAgRm9ybWF0 LnByaW50ZiAiJWFALiIgDQogIOKUgiAgICAgKHBwX21hcCAobW9kdWxlIE0pIEZvcm1hdC5wcF9w cmludF9zdHJpbmcgcHBfc3RyKSAoTS50b19tdCBtKQ0KICDilJTilIDilIDilIDilIANCg0KICBJ IHNob3VsZCBtZW50aW9uIHRoYXQgdGhlIGZ1bmN0aW9ucyBsaWtlIHRvX210IGNvbWUgbmF0dXJh bGx5IGluIGNhc2UNCiAgb2YgdGFnbGVzcy1maW5hbCBpbnRlcnByZXRlcnM6IHRoZXNlIGFyZSB0 aGUgb2JzZXJ2YXRpb24gZnVuY3Rpb25zLg0KICBGb3IgZXhhbXBsZToNCg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIG1vZHVsZSB0eXBlIGxjID0gc2lnDQogIOKUgiAgIHR5cGUgJ2EgcmVwcg0K ICDilIIgICB2YWwgaW50IDogaW50IC0+IGludCByZXByDQogIOKUgiAgIHZhbCBsYW0gIDogKCdh IHJlcHIgLT4gJ2IgcmVwcikgLT4gKCdhIC0+ICdiKSByZXByDQogIOKUgiAgIHZhbCBhcHAgOiAo J2EgLT4gJ2IpIHJlcHIgLT4gKCdhIHJlcHIgLT4gJ2IgcmVwcikNCiAg4pSCICAgdHlwZSBvYnN0 DQogIOKUgiAgIHR5cGUgb2JzDQogIOKUgiAgIHZhbCBvYnNlcnZlIDogb2JzdCByZXByIC0+IG9i cw0KICDilIIgZW5kDQogIOKUgiANCiAg4pSCIHR5cGUgKCdhLCdvYnMpIGxjID0gKG1vZHVsZSAo bGMgd2l0aCB0eXBlIG9icyA9ICdvYnMgYW5kIHR5cGUgb2JzdCA9ICdhKSkNCiAg4pSCIA0KICDi lIIgbGV0IGV4MSA6IHR5cGUgb2JzLiAoaW50LG9icykgbGMgLT4gb2JzID0gZnVuIChtb2R1bGUg TSkgLT4gbGV0IG9wZW4gTSBpbg0KICDilIIgICBsZXQgdDEgPSBhcHAgKGxhbSAoZnVuIHggLT4g eCkpIChpbnQgMSkNCiAg4pSCICAgaW4gb2JzZXJ2ZSB0MQ0KICDilJTilIDilIDilIDilIANCg0K ICBJbiBjb25jbHVzaW9uLCBpdCB3b3VsZCBiZSBncmVhdCBpZiBvbmUgZGF5IHRoZSByZXN0cmlj dGlvbnMgb24NCiAgcGFja2FnZSB0eXBlcyB3ZXJlIHJlbGF4ZWQuDQoNCg0KT2xpdmllciBOaWNv bGUgYXNrZWQgYW5kIFNhbXVlbCBWaXZpZW4gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgICAgICAgVGhhbmtzIGZvciBwb2ludGluZyB0aGlzIG91dC4gRG9lcyB0aGlzIG1l YW4gdGhhdCBtb2R1bGFyDQogICAgICAgIGV4cGxpY2l0cywgc3RyaWN0bHkgc3BlYWtpbmcsIGJy aW5nIG5vIGFkZGl0aW9uYWwNCiAgICAgICAgZXhwcmVzc2l2aXR5IGJ1dCBvbmx5IGEgc2ltcGxl ciB3YXkgdG8gZG8gdGhlc2UgdGhpbmdzPyBPcg0KICAgICAgICBhcmUgdGhlcmUgcHJvZ3JhbXMg dGhhdCBjb3VsZCBiZSBleHByZXNzZWQgd2l0aCBtb2R1bGFyDQogICAgICAgIGV4cGxpY2l0cyBi dXQgbm90IHdpdGggY29uc3RyYWluZWQgbW9kdWxlIHR5cGVzPw0KDQogIEluZGVlZC4gTW9kdWxh ciBleHBsaWNpdCBkb2VzIG5vdCBhZGQgYW55IGV4cHJlc3NpdmVuZXNzIHRvIHRoZQ0KICBsYW5n dWFnZSAoYW5kIGRvZXMgbm90IGltcGFjdCB0aGUgc291bmRuZXNzIG9mIHRoZSB0eXBlIHN5c3Rl bSkuIEV2ZXJ5DQogIHByb2dyYW0gdGhhdCBjYW4gYmUgd3JpdHRlbiB1c2luZyBtb2R1bGFyIGV4 cGxpY2l0cyBjb3VsZCBoYXZlIGJlZW4NCiAgd3JpdHRlbiB3aXRoIGEgZnVuY3RvciBlbmNvZGVk IGFzIGEgZmlyc3QtY2xhc3MgbW9kdWxlLg0KDQogIFdlIHByZXNlbnRlZCB0aGlzIGVuY29kaW5n IGluIHNlY3Rpb24gMS41IG9mIHRoaXMgcGFwZXIgYWJvdXQgbW9kdWxhcg0KICBleHBsaWNpdHMg OiA8aHR0cHM6Ly9oYWwuc2NpZW5jZS9oYWwtMDU0MjgxMzYvZG9jdW1lbnQ+DQoNCg0KTFJncmVw IDAuOTogQmV0dGVyIHN5bnRheCBlcnJvcnMgZm9yIE9DYW1sIGFuZCBNZW5oaXINCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbHJncmVwLTAtOS1iZXR0ZXItc3ludGF4LWVycm9y cy1mb3Itb2NhbWwtYW5kLW1lbmhpci8xODI4Ni8xPg0KDQoNCkZyw6lkw6lyaWMgQm91ciBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lLA0KDQogIEkndmUganVzdCByZWxl YXNlZCAqTFJncmVwIDAuOSosIGEgdG9vbCB0byBjdXN0b21pemUgdGhlIGVycm9yDQogIG1lc3Nh Z2VzIG9mIE1lbmhpci1nZW5lcmF0ZWQgTFIgcGFyc2VycyBieSByZWFzb25pbmcgYWJvdXQgZmFp bHVyZQ0KICBwYXRocy4NCg0KICBUaGUgZ29hbCBpcyB0byBtb3ZlIGZyb20gZ2VuZXJpYyAiU3lu dGF4IGVycm9yIGF0IGxpbmUgWCIgbWVzc2FnZXMgdG8NCiAgbW9yZSBpbnR1aXRpdmUgZGlhZ25v c3RpY3MgdGhhdCBwb2ludCB0byB0aGUgYWN0dWFsIHJvb3QgY2F1c2UuIEZvcg0KICBleGFtcGxl LCBpZiB5b3UgYWNjaWRlbnRhbGx5IHB1dCBhIHNlbWljb2xvbiBpbiBhIGxvY2FsLWxldCBjaGFp bjoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCB4ID0gNTsNCiAg4pSCIA0KICDilIIg bGV0IHkgPSA2DQogIOKUgiANCiAg4pSCIGxldCB6ID0gNw0KICDilIIgXl5eDQogIOKUgiBFcnJv cjogRXhwZWN0aW5nICdpbicgdG8gY29tcGxldGUgbG9jYWwtbGV0IGJpbmRpbmcuIA0KICDilIIg SGludDogdGhpcyBtaWdodCBiZSBkdWUgdG8gdGhlIHNlbWljb2xvbiBsaW5lIDEsIGNoYXJhY3Rl ciA5DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFdpdGhvdXQgTFJncmVwLCBPQ2FtbCB0eXBpY2Fs bHkgcmVwb3J0cyBvbmx5IGEgc3ludGF4IGVycm9yIG9uIHRoZQ0KICBzdWJzZXF1ZW50IGBsZXQn IGJpbmRpbmcuIFRoZSBjdXN0b21pemVkIHBhcnNlciBjYW4gaWRlbnRpZnkgdGhhdCB0aGUNCiAg c2VtaWNvbG9uIGlzIHRoZSBsaWtlbHkgY3VscHJpdC4NCg0KICAqSG93IHlvdSBjYW4gaGVscCAo ZmVlZGJhY2sgd2FudGVkISkqDQoNCiAgSSBhbSBsb29raW5nIGZvciB1c2VycyB0byBoZWxwIHN0 cmVzcy10ZXN0IHRoZSBjdXJyZW50IHNwZWNpZmljYXRpb25zDQogIGFuZCBpZGVudGlmeSB3aGVy ZSBlcnJvciBtZXNzYWdlcyBhcmUgc3RpbGwgbGFja2luZy4NCg0KICAxLiAqSWYgeW91IHVzZSBP Q2FtbDoqIEkndmUgcGF0Y2hlZCB0aGUgY29tcGlsZXIgdG8gdXNlIExSZ3JlcC4gUGxlYXNlDQog ICAgIHRyeSBpdCB2aWEgb3BhbTogYG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjQuMStscmdyZXAnICpQ bGVhc2UgcmVwb3J0DQogICAgIGNhc2VzIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlcyBhcmUgY29u ZnVzaW5nIG9yIHdoZXJlIHlvdSB3b3VsZA0KICAgICBsaWtlIHRvIHNlZSBhIG1vcmUgaGVscGZ1 bCBoaW50LioNCg0KICAyLiAqSWYgeW91IHVzZSBNZW5oaXI6KiBHaXZlIExSZ3JlcCBhIHRyeSBv biB5b3VyIG93biBncmFtbWFycyBpZiB5b3UNCiAgICAgIHdhbnQgdG8gY3VzdG9taXplIGVycm9y IG1lc3NhZ2VzLg0KDQogICAgIOKAoyBbR2VuZXJhbCBFeGFtcGxlc10NCiAgICAg4oCjIFtPQ2Ft bCBFcnJvciBTcGVjaWZpY2F0aW9uc10NCg0KICBJbnRlZ3JhdGlvbiB3aXRoIE1lcmxpbiBpcyBh bHNvIGNvbWluZyBzb29uIChbUFIgIzIwNzJdKS4NCg0KICBIdWdlIHRoYW5rcyB0byBAZnBvdHRp ZXIsIEBqbWlkLCBUYXJpZGVzLCBhbmQgSmFuZSBTdHJlZXQgZm9yIHRoZWlyDQogIHN1cHBvcnQu DQoNCiAgSGFwcHkgdGVzdGluZyENCg0KDQpbR2VuZXJhbCBFeGFtcGxlc10gPGh0dHBzOi8vZ2l0 aHViLmNvbS9mcG90dGllci9scmdyZXAtZXhhbXBsZT4NCg0KW09DYW1sIEVycm9yIFNwZWNpZmlj YXRpb25zXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9sZXQtZGVmL2xyZ3JlcC9ibG9iL21haW4vZXhh bXBsZXMvb2NhbWwvcGFyc2VyL2Vycm9ycy5scmdyZXA+DQoNCltQUiAjMjA3Ml0gPGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vcHVsbC8yMDcyPg0KDQoNClN0YXRpYyBBbmFseXNpcyBm b3IgT0NhbWwNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYmxvZy1zdGF0aWMtYW5hbHlzaXMtZm9yLW9jYW1sLzE4Mjg3LzE+ DQoNCg0KZmFudGF6aW8gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBhbGwsDQoNCiAgSSB3cm90ZSBhIHNob3J0 IChhbmQgc2xpZ2h0bHkgb3BpbmlvbmF0ZWQpIHBpZWNlIG9uIHRoZSBzdGF0ZSBvZg0KICBzdGF0 aWMgYW5hbHlzaXMgdG9vbGluZyBmb3IgT0NhbWwuICBUaGUgZ29hbCBpcyB0byBwcm92aWRlIGFu IG92ZXJ2aWV3DQogIG9mIGF2YWlsYWJsZSB0b29scywgd29ya3MgaW4gcHJvZ3Jlc3MsIGFuZCBt aXNzaW5nIHBpZWNlcy4gTGV0IG1lIGtub3cNCiAgaWYgdGhlcmUgaXMgYSBzdGF0aWMgYW5hbHlz aXMgdG9vbCB5b3UgdXNlIHRoYXQgaXMgbm90IG1lbnRpb25lZCwgb3INCiAgaWYgeW91IHdpc2gg b25lIGV4aXN0ZWQuDQoNCiAgVGhhbmtzIQ0KDQogIDxodHRwczovL2ZhbnRhemlvLmV1L2FydGlj bGVzL3N0YXRpY19hbmFseXNpc19vY2FtbC5odG1sPg0KDQoNCm5ldyByZWxlYXNlczogTWVybGlu IDUuOCBhbmQgT0NhbWwtTFNQIDEuMjcuMCB3aXRoIHN1cHBvcnQgZm9yIE9DYW1sIDUuNQ0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbmV3LXJlbGVhc2VzLW1lcmxpbi01 LTgtYW5kLW9jYW1sLWxzcC0xLTI3LTAtd2l0aC1zdXBwb3J0LWZvci1vY2FtbC01LTUvMTgyOTMv MT4NCg0KDQp2ZHMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBJIGFtIGdsYWQgdG8gYW5ub3VuY2UgbmV3IHJlbGVhc2VzIG9mIE1lcmxpbiBh bmQgT0NhbWwtTFNQIPCfp5kgIQ0KDQogIE1lcmxpbiBpcyBhbiBlZGl0b3Igc2VydmljZSB0aGF0 IHByb3ZpZGVzIG1vZGVybiBJREUgZmVhdHVyZXMgZm9yDQogIE9DYW1sIGFuZCBPQ2FtbC1MU1Ag aXMgYSBmcm9udGVuZCBmb3IgTWVybGluIHRoYXQgc3BlYWtzIHdpdGggTFNQDQogIGNsaWVudHMu DQoNCiAgVGhlcmUgYXJlIGEgZmV3IGJ1ZyBmaXhlcyBpbiB0aGVzZSBidXQgdGhlIG1haW4gZmVh dHVyZSBpcyB0aGUgc3RhYmxlDQogIHN1cHBvcnQgZm9yIE9DYW1sIDUuNS4NCg0KICBGdWxsIGNo YW5nZWxvZ3M6DQogIOKAoiA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL21lcmxpbi9ibG9iL21h aW4vQ0hBTkdFUy5tZCNtZXJsaW4tNTg+DQogIOKAoiA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sLWxzcC9ibG9iL21hc3Rlci9DSEFOR0VTLm1kIzEyNzA+DQoNCg0KZHVyYXMgMi4xLjEg 4oCUIGRhaWx5IG5vdGVzIGFzIHBsYWluIHRleHQgZmlsZXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1cmFz LTItMS0xLWRhaWx5LW5vdGVzLWFzLXBsYWluLXRleHQtZmlsZXMvMTgyOTkvMT4NCg0KDQpTZXJn aXkgRHVyYXMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICAqZHVyYXMqIGlzIGEgY29tbWFuZC1s aW5lIHRvb2wgZm9yIGRhaWx5IG5vdGVzIHN0b3JlZCBhcyBwbGFpbiB0ZXh0DQogICBmaWxlcyAo YFlZWVkvTU0vWVlZWS1NTS1ERC5kbicpLiBObyBkYXRhYmFzZSwgbm8gZGFlbW9uLCBubw0KICAg YmFja2dyb3VuZCBzZXJ2aWNlcy4NCg0KICB2Mi4xLjEgYWRkcyBgZHVyYXMgYnVpbGQnLCB3aGlj aCBjb252ZXJ0cyBhIG5vdGUgY29sbGVjdGlvbiB0byBhDQogIHN0YXRpYyBIVE1MIHdlYnNpdGUu IDcsMzAwIG5vdGVzIGluIFx+MjIwbXMsIHNpbmdsZS10aHJlYWRlZCwgbm8NCiAgY2FjaGluZy4g Tm90ZXMgdXNlIFtzaWdsaW5lXSBmb3JtYXQg4oCUIGEgcGxhaW4tdGV4dCBzdHJ1Y3R1cmVkIG5v dGF0aW9uDQogIHdoZXJlIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBvZiBlYWNoIGxpbmUgZGVjbGFy ZXMgaXRzIHR5cGUuDQoNCiAg4oCiIFNvdXJjZTogPGh0dHBzOi8vY29kZWJlcmcub3JnL2R1cmFz L2R1cmFzPg0KICDigKIgSW5zdGFsbDogYG9wYW0gaW5zdGFsbCBkdXJhcycNCiAg4oCiIE1hbiBw YWdlOiBgbWFuIGR1cmFzJw0KDQoNCltzaWdsaW5lXSA8aHR0cHM6Ly9jb2RlYmVyZy5vcmcvZHVy YXMvc2lnbGluZT4NCg0KDQpTb2Z0d2FyZSBFbmdpbmVlciBhdCBMZXhpRmkgKFBhcmlzKQ0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2 ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9qb2Itc29mdHdhcmUtZW5naW5lZXIt YXQtbGV4aWZpLXBhcmlzLzE4MzA0LzE+DQoNCg0KTmljb2xhcyBPamVkYSBCYXIgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBEZWFyIGFsbCwNCg0KICBbTGV4aUZpXSBp cyBoaXJpbmchIFdlIGFyZSBsb29raW5nIGZvciBhIGZ1bGwtdGltZSBTb2Z0d2FyZSBFbmdpbmVl cg0KICB0byBqb2luIG91ciBjb3JlIGRldmVsb3BtZW50IHRlYW0uDQoNCiAgV2UgYXJlIHBhcnRp Y3VsYXJseSBpbnRlcmVzdGVkIGluIGNhbmRpZGF0ZXMgd2l0aCBhIHN0cm9uZyBwcm9ncmFtbWlu Zw0KICBiYWNrZ3JvdW5kLCBmb3IgZXhhbXBsZSB0aHJvdWdoIHByZXZpb3VzIGluZHVzdHJpYWwg ZXhwZXJpZW5jZSwNCiAgY29udHJpYnV0aW9ucyB0byBvcGVuLXNvdXJjZSBwcm9qZWN0cywgb3Ig c3Vic3RhbnRpYWwgcGVyc29uYWwNCiAgcHJvamVjdHMuDQoNCiAgTGV4aUZpIGhhcyBiZWVuIHVz aW5nIE9DYW1sIGZvciBtb3JlIHRoYW4gMjUgeWVhcnPigJR3ZSB3ZXJlIHRoZSBmaXJzdA0KICBz b2Z0d2FyZSBjb21wYW55IHRvIGJ1aWxkIG91ciBwcm9kdWN0cyBvbiBPQ2FtbOKAlGFuZCB3ZSBz dGlsbCBpbXBsZW1lbnQNCiAgdGhlIHZhc3QgbWFqb3JpdHkgb2Ygb3VyIHN0YWNrIGluIE9DYW1s LiBJZiB5b3UncmUgZXhjaXRlZCBhYm91dCB1c2luZw0KICBPQ2FtbCB0byBzb2x2ZSByZWFsLXdv cmxkIGluZHVzdHJpYWwgcHJvYmxlbXMsIHdlIHdvdWxkIGxvdmUgdG8gaGVhcg0KICBmcm9tIHlv dS4NCg0KICA8aHR0cHM6Ly93d3cubGV4aWZpLmNvbS9jYXJlZXJzL3NvZnR3YXJlX2VuZ2luZWVy Lz4NCg0KICBXb3JrIGF0IExleGlGaSBzcGFucyBhIHdpZGUgcmFuZ2Ugb2YgcHJvamVjdHMgYWNy b3NzIG11bHRpcGxlDQogIGRvbWFpbnMuIFdlIGFsc28gcmVtYWluIGFjdGl2ZWx5IGVuZ2FnZWQg d2l0aCB0aGUgT0NhbWwgY29tbXVuaXR5IGFuZA0KICBzdHJpdmUgdG8gZ2l2ZSBiYWNrIGluIHZh cmlvdXMgd2F5cywgaW5jbHVkaW5nIGZ1bmRpbmcgY29tbXVuaXR5DQogIHByb2plY3RzLCBoZWxw aW5nIG1haW50YWluIHRoZSBPQ2FtbCBjb21waWxlciBhbmQgb3RoZXIgb3Blbi1zb3VyY2UNCiAg cHJvamVjdHMsIGFuZCBwYXJ0aWNpcGF0aW5nIGluIGNvbmZlcmVuY2VzLg0KDQogIElmIHlvdSBo YXZlIGFueSBxdWVzdGlvbnMsIHBsZWFzZSBkb24ndCBoZXNpdGF0ZSB0byByZWFjaCBvdXQgdG8g bWUsDQogIGVpdGhlciBoZXJlIG9yIHByaXZhdGVseS4NCg0KICBDaGVlcnMsIE5pY29sYXMNCg0K DQpbTGV4aUZpXSA8aHR0cHM6Ly93d3cubGV4aWZpLmNvbS8+DQoNCg0KT3dlYnZpZXcgOiBPQ2Ft bCBiaW5kaW5nIHRvIHRoZSB3ZWJ2aWV3IGxpYnJhcnkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3dlYnZp ZXctb2NhbWwtYmluZGluZy10by10aGUtd2Vidmlldy1saWJyYXJ5LzE4MzA1LzE+DQoNCg0KS29y a29ycmFuIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgZXZlcnlvbmUhIPCfkYsNCg0KICBJJ2QgbGlrZSB0 byBzaGFyZSBhIHNtYWxsIHByb2plY3QgSSd2ZSBiZWVuIHdvcmtpbmcgb246ICpvd2Vidmlldyos IGENCiAgc2V0IG9mIE9DYW1sIGJpbmRpbmdzIGZvciBbd2Vidmlld10uDQoNCg0KW3dlYnZpZXdd IDxodHRwczovL2dpdGh1Yi5jb20vd2Vidmlldy93ZWJ2aWV3Pg0KDQpXaGF0IGlzIHdlYnZpZXc/ DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBb d2Vidmlld10gaXMgYSB0aW55LCBjcm9zcy1wbGF0Zm9ybSBsaWJyYXJ5IGZvciBidWlsZGluZyBk ZXNrdG9wIEdVSXMNCiAgdXNpbmcgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBidWlsdC1pbiB3ZWIg ZW5naW5lIOKAlCBXZWJLaXQgb24gbWFjT1MsDQogIFdlYktpdEdUSyBvbiBMaW51eCwgYW5kIFdl YlZpZXcyIG9uIFdpbmRvd3MuIEluc3RlYWQgb2Ygc2hpcHBpbmcgYQ0KICB3aG9sZSBicm93c2Vy IGxpa2UgRWxlY3Ryb24sIHlvdSByZXVzZSB0aGUgc3lzdGVtIG9uZSwgc28geW91ciBhcHBzDQog IHN0YXkgc21hbGwuIFlvdSBjcmVhdGUgYSB3aW5kb3csIHBvaW50IGl0IGF0IHNvbWUgSFRNTCAo b3IgYSBVUkwpLCBhbmQNCiAgeW91IGNhbiBjYWxsIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhl IHBhZ2UncyBKYXZhU2NyaXB0IGFuZCB5b3VyDQogIGhvc3QgbGFuZ3VhZ2UuDQoNCg0KW3dlYnZp ZXddIDxodHRwczovL2dpdGh1Yi5jb20vd2Vidmlldy93ZWJ2aWV3Pg0KDQoNClRoZSBnYXAgb3dl YnZpZXcgZmlsbHMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdoYXQgbWFrZXMgd2VidmlldyByZWFsbHkgYXBw ZWFsaW5nIGlzIGl0cyBlY29zeXN0ZW06IGl0IGFscmVhZHkgaGFzDQogIGJpbmRpbmdzIGluIGEg KmxvdCogb2YgbGFuZ3VhZ2VzIOKAlCBHbyAodGhlIHJlZmVyZW5jZSBvbmUpLCBSdXN0LA0KICBQ eXRob24sIEMjLCBOaW0sIFppZywgYW5kIG1hbnkgbW9yZS4gQXMgZmFyIGFzIEkgY291bGQgdGVs bCwgdGhvdWdoLA0KICB0aGVyZSB3YXNuJ3Qgb25lIGZvciAqT0NhbWwqLg0KDQogIG93ZWJ2aWV3 IGlzIGFuIGF0dGVtcHQgdG8gZmlsbCB0aGF0IGdhcDogYSB0aGluIGJpbmRpbmcgdGhhdCBsZXRz IHlvdQ0KICBkcml2ZSB3ZWJ2aWV3IGRpcmVjdGx5IGZyb20gT0NhbWwsIHdpdGggYSBuYXRpdmUg YnJpZGdlIGJldHdlZW4gdGhlDQogIHBhZ2UncyBKYXZhU2NyaXB0IGFuZCB5b3VyIE9DYW1sIGZ1 bmN0aW9ucy4NCg0KDQpXaGF0IGl0IGxvb2tzIGxpa2UNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEEgY29tcGxldGUgYXBwIGlzIGFi b3V0IHRlbiBsaW5lczoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCAoKSA9DQogIOKU giAgIGxldCB3ID0gV2Vidmlldy5jcmVhdGUgKCkgaW4NCiAg4pSCICAgV2Vidmlldy5zZXRfdGl0 bGUgdyAiTXkgZmlyc3Qgb3dlYnZpZXcgYXBwIjsNCiAg4pSCICAgV2Vidmlldy5zZXRfc2l6ZSB3 IFx+d2lkdGg6NDgwIFx+aGVpZ2h0OjMyMCBXZWJ2aWV3LkhpbnRfbm9uZTsNCiAg4pSCICAgV2Vi dmlldy5zZXRfaHRtbCB3DQogIOKUgiAgIHt8PCFkb2N0eXBlIGh0bWw+DQogIOKUgiAgICAgICA8 aHRtbD48Ym9keSBzdHlsZT0iZm9udC1mYW1pbHk6IHN5c3RlbS11aTsgdGV4dC1hbGlnbjogY2Vu dGVyIj4NCiAg4pSCICAgICAgICAgPGgxPkhlbGxvIGZyb20gT0NhbWwg8J+RizwvaDE+DQogIOKU giAgICAgICA8L2JvZHk+PC9odG1sPnx9Ow0KICDilIIgICBXZWJ2aWV3LnJ1biB3Ow0KICDilIIg ICBXZWJ2aWV3LmRlc3Ryb3kgdw0KICDilJTilIDilIDilIDilIANCg0KICBBbmQgeW91IGNhbiBl eHBvc2UgT0NhbWwgZnVuY3Rpb25zIHRvIHRoZSBwYWdlIOKAlCBoZXJlIGB3aW5kb3cuYWRkKGEs DQogIGIpJyByZXR1cm5zIGEgSmF2YVNjcmlwdCBQcm9taXNlIHJlc29sdmVkIGZyb20gT0NhbWw6 DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBXZWJ2aWV3LmJpbmQgdyAiYWRkIiAoZnVuIGlk IHJlcSAtPg0KICDilIIgICBsZXQgcmVzdWx0ID0NCiAg4pSCICAgbWF0Y2ggU2NhbmYuc3NjYW5m X29wdCByZXEgIlxbJWQsJWRcXSIgKGZ1biBhIGIgLT4gYSArIGIpIHdpdGgNCiAg4pSCICAgfCBT b21lIG4gLT4gc3RyaW5nX29mX2ludCBuDQogIOKUgiAgIHwgTm9uZSAtPiAibnVsbCINCiAg4pSC ICAgaW4NCiAg4pSCICAgV2Vidmlldy5yZXR1cm4gdyBpZCBcfmVycm9yOmZhbHNlIFx+cmVzdWx0 KQ0KICDilJTilIDilIDilIDilIANCg0KDQpUcnkgaXQNCuKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IOKUjOKUgOKUgOKUgOKUgA0KICDilIIgIyBSdW4gdGhlIGJ1bmRsZWQgZXhhbXBsZQ0KICDilIIg Z2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9rb3Jrb3JyYW4vb3dlYnZpZXcuZ2l0DQogIOKU giBjZCBvd2Vidmlldw0KICDilIIgZHVuZSBleGVjIGV4YW1wbGVzL2hlbGxvd3YuZXhlDQogIOKU giANCiAg4pSCICMgT3IgcGluIGl0IGludG8geW91ciBvd24gcHJvamVjdA0KICDilIIgb3BhbSBw aW4gYWRkIG93ZWJ2aWV3IGh0dHBzOi8vZ2l0aHViLmNvbS9rb3Jrb3JyYW4vb3dlYnZpZXcuZ2l0 DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZW4ganVzdCBhZGQgYChsaWJyYXJpZXMgb3dlYnZp ZXcud2VidmlldyknIHRvIHlvdXIgZHVuZSBmaWxlLiBUaGUNCiAgYHdlYnZpZXcuaCcgaGVhZGVy IGlzIHZlbmRvcmVkLCBhbmQgdGhlIHBsYXRmb3JtLXNwZWNpZmljIEMrKyBmbGFncw0KICBhcmUg ZGV0ZWN0ZWQgYXQgYnVpbGQgdGltZSAodmlhIGBwa2ctY29uZmlnJyBvbiBMaW51eCksIHNvIHRo ZXJlJ3MNCiAgbm90aGluZyB0byB3aXJlIHVwIGJ5IGhhbmQuDQoNCg0KSG9uZXN0IHN0YXR1cyAm IGEgcmVxdWVzdA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhpcyBpcyBhICpjb21wYWN0IGJp bmRpbmcgLyBzdGFydGluZyBwb2ludCosIG5vdCBhIGNvbXBsZXRlIGxpYnJhcnkNCiAgeWV0OiBz b21lIHBpZWNlcyAoYHVuYmluZCcsIGBkaXNwYXRjaCcsIGZ1bGwgYmluZGluZyBtZW1vcnkNCiAg bWFuYWdlbWVudCkgYXJlIGludGVudGlvbmFsbHkgbGVmdCBvdXQgZm9yIG5vdy4NCg0KICBJdCdz IGFsc28gZGV2ZWxvcGVkIGFuZCB0ZXN0ZWQgbWFpbmx5IG9uICoqbWFjT1MqKi4gSSdkIGxvdmUg ZmVlZGJhY2sNCiAgZnJvbSBwZW9wbGUgcnVubmluZyBpdCBvbiAqKkxpbnV4IGRpc3RyaWJ1dGlv bnMqKiDigJQgZG9lcyBpdCBjb21waWxlLA0KICBkbyB0aGUgb3BhbSBgZGVwZXh0cycgcmVzb2x2 ZSwgZG9lcyB0aGUgYHdlYmtpdDJndGstNC4xJyBiYWNrZW5kDQogIGJlaGF2ZSBvbiB5b3VyIGRp c3Rybz8NCg0KICBJc3N1ZXMgYW5kIFBScyBhcmUgdmVyeSB3ZWxjb21lLg0KDQogIFJlcG9zaXRv cnk6IDxodHRwczovL2dpdGh1Yi5jb20va29ya29ycmFuL293ZWJ2aWV3Pg0KDQogIFRoYW5rcyBm b3IgcmVhZGluZyDigJQgaGFwcHkgdG8gaGVhciB0aG91Z2h0cywgc3VnZ2VzdGlvbnMsIGFuZA0K ICBlc3BlY2lhbGx5IExpbnV4IGJ1aWxkIHJlcG9ydHMhDQoNCg0KT0NhbWwgUnVudGltZSBNZWV0 aW5nOiBNb24sIEp1bHkgNiBAIDEwOjAwIFVUQyAoMTA6MDAgTG9uZG9uL0NhbWJyaWRnZSwgMTE6 MDAgUGFyaXMsIDdwbSBTeWRuZXkpDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L29jYW1sLXJ1bnRpbWUtbWVldGluZy1tb24tanVseS02LTEwLTAwLXV0 Yy0xMC0wMC1sb25kb24tY2FtYnJpZGdlLTExLTAwLXBhcmlzLTdwbS1zeWRuZXkvMTgzMTIvMT4N Cg0KDQpUaW0gTWNHaWxjaHJpc3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGUgbmV4dCBPQ2FtbCBSdW50aW1lIE1lZXRpbmcgaXMgTW9uZGF5IEp1bHkgNnRoICgyMDI2LTA3 LTA2KSBhdA0KICAxMDowMCBVVEMgKDEwOjAwIExvbmRvbi9DYW1icmlkZ2UsIDExOjAwIFBhcmlz LCA3cG0gU3lkbmV5KS4gVGhlDQogIGFnZW5kYSBub3RlcyBhcmUgaGVyZSA8aHR0cHM6Ly9oYWNr bWQuaW8vQHRtY2dpbGNocmlzdC9TMVJ0T2J2V0dlPg0KICBlbWFpbCB0aW1AdGFyaWRlcy5jb20g aWYgeW91IHdhbnQgYSBjYWxlbmRhciBpbnZpdGUuDQoNCiAgQXBwcm94aW1hdGVseSBldmVyeSBt b250aCB3ZSBoYXZlIGFuIGluZm9ybWFsIG1lZXRpbmcgYmV0d2VlbiBPQ2FtbA0KICBkZXZlbG9w ZXJzIHdpdGggYSBmb2N1cyBvbiB0aGUgbGFuZ3VhZ2UgcnVudGltZS9nYXJiYWdlIGNvbGxlY3Rv ci4gVGhlDQogIG1lZXRpbmdzIGFyZSBmb3Igc2hhcmluZyB1bmRlcnN0YW5kaW5nIGFuZCBpZGVh cywgbm90IGZvciBmb3JtYWwNCiAgcGxhbm5pbmcgcHVycG9zZXMuIFRoZXkgYXJlIG9wZW4gdG8g YW55IGludGVyZXN0ZWQgZGV2ZWxvcGVyLg0KDQogIFByZXZpb3VzIG1lZXRpbmcgbm90ZXMgYXZh aWxhYmxlIGluDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvc3Vic3lzdGVtLW1lZXRpbmdz Pg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4g dG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwN CiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBb UlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJl Y2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUg W2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2Vd IDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVd IDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUg YXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpb Y2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4N Cg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of June 23 to 30, 2026.

New release of Sek

Fran=C3=A7ois Pottier announced

We are pleased to announce a new release of Sek, a library that offers efficient ephemeral (mutab= le) and persistent (immutable) sequence data structures, plus effici= ent conversions between these two forms.

This new release introduces optimizations that speed up several operations,= including random access (get, set), splitting, a= nd concatenation. For details, please see the change log.

opam update && opam install sek

Happy hacking, Arthur Chargu=C3=A9raud & Fran=C3=A7ois Pottier.

Js_of_ocaml / Wasm_of_ocaml 6.4

Hhugo announced

I'm pleased to announce the joint release of js_of_ocaml and wasm= _of_ocaml 6.4.0.

Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes it po= ssible to run pure OCaml programs in JavaScript environments like browsers = and Node.js.

Wasm_of_ocaml is a compiler from OCaml bytecode to WebAssembly. It is highl= y compatible with js_of_ocaml, so you can compile your programs with wasm_o= f_ocaml instead of js_of_ocaml and experience overall better performance.

Most significant changes since version 6.3:

Toolchain

  • OCaml 5.5.0 support.
  • OxCaml support.

wasm_of_ocaml

  • WASI 0.1 support =E2=80=94 target standalone WASI runtimes (wasm= time and friends), no JavaScript host required.
  • Dynlink and toplevel support =E2=80=94 the OCaml toplevel now ru= ns on the Wasm backend.
  • An alternative effects backend based on the Stack Switching proposal.
  • Pure-Wasm zstd and BLAKE2b =E2=80=94 unmarshalling compressed va= lues and Digest.BLAKE2{512,256,128} no longer need the JavaScr= ipt shims, so they work under WASI too.
  • The legacy num library now works on Wasm (the nat primitives were no-op stubs).

Library =E2=80=94 new web APIs

  • Promise module =E2=80=94 type-safe bindings to JS p= romises, with Lwt interop (Js_of_ocaml_lwt.Promise.{to_lwt,of_= lwt}) and Promise-typed Dom_html bindings.
  • Fetch + Abort modules =E2=80=94 the Fe= tch API with typed AbortController~/~AbortSignal cancellation.=
  • Dom_svg aligned with SVG 2, the popover API,= Intl.RelativeTimeFormat, a new Performance module, additional Console bindings, and many more Dom_html bindings.

Bug fixes

  • A large number of bug fixes across the compiler, runtime, library bindi= ngs, and PPX.

=E2=9A=A0=EF=B8=8F Breaking changes

A few changes are source-incompatible =E2=80=94 mostly to fix incorrect bin= dings and behavior =E2=80=94 and may require updating existing code. See th= e migration guide.

See the documentation and = the full changelog.

Vincent Balat then added

We released Eliom 12.1 at the same time, bringing compatibility with both j= s_of_ocaml 6.4 and OCaml 5.5.

Ocsipersist 2.1.0: type-safe persistent references with Derivi= ng

Vincent Balat announced

Ocsipersist 2.1.0 is out. = Persistent references, stores and tables can now be serialised with D= eriving_Json instead of Marshal: the data is human-read= able in the database and stable across OCaml versions. The new API is fully= backward compatible, and Ocsipersist works as a standalone library for any= OCaml program (no Eliom or Ocsigen Server required).

type u=
ser =3D { name : string; age : int } [@@deriving json]

(* a persistent reference, stored as =
readable JSON *)=

let visits =3D Ocsipersist.Ref_json.ref ~persistent:"visits" [%json: int=
] 0

let count_visit () =3D
  let%lwt n =
=3D Ocsipersist.Ref_json=
.get visits in
  Ocsipersist.Ref_json.<=
/span>set visits (n + 1)

Full announcement: https://ocsigen.org/blog/posts/ocsipersist-2.1.0.html

Modular explicits in pre-OCaml 5.5

oleg said

One of the notable features of the just announced OCaml 5.5 are module-dependent functions, a.k.a. modular explicits. It is a welcome addition: it lets us express higher-ranked types in the simplest way, and is particularly good for typed tagless-final code.

It should be mentioned however that modular explicits could be done before, with little or no hassle. Perhaps there is merit to remind of that old trick~– especially because it works also with statically unknown modu= les (which are out of scope for OCaml 5.5 modular explicits).

As the running example we re-use the pretty-printing example in the OCaml 5.5 announcement (hereafter, Ann55).

We start however with a simpler example: pretty-printing a set=20 generated by the Set.Make functor. The example follows the=20 pattern of the pp_map function from Ann55. It is simpler than=20 printing a map because it involves no higher-rank types.

let pp_set (type a s)=20
      (module M: Set.S with type elt =3D a and type t =3D s)=20
      (pp_elt:Format.formatter->a->unit) (ppf:Format.formatter) (set=
:s) =3D=20
  if M.is_empty set then Format.fprintf ppf "ø" else=20
  let pp_sep ppf () =3D Format.=
fprintf ppf ",@ " in=20
  Format.fprintf =
ppf "@[{@ %a@ }@]"=20
    (Format.pp_pr=
int_seq ~pp_sep pp_elt) (M.to_seq set)=20

It is almost literally the pp_map example from Ann55, with set substituted for map. The main difference is type annotations. This is not a bug: I insist on writing signatures or explicit type annotations for all top-level definitions (except, perhaps, the most trivial).

The annotations could be simplified if we introduce

type (=
'e,'s) set =3D (m=
odule Set.=
S with type elt =3D 'e and type t =3D 's)
type 'a printer =3D Format.formatter->'a->=
unit

The example then reads

let pp_set : type e s. (e,s) set -> e printer -> s printer =3D=
=20
  fun (module M) pp=
_elt ppf set -> (* ... as =
before ... *)

The signature tells at a glance what pp_set is doing (which is one of the benefits of signatures: it is not just for, and not mainly for, the compiler.)

We can use pp_set just like pp_map was used in the Ann55 example:

module String_set =3D S=
et.Make(String)=20

let () =3D=20
  let m =3D String_set.of_list ["Zero"=
; "Zero"; "One"; "Un"] in=20
  let pp_str =3D Format.pp_print_string in=20
  Format.printf <=
span style=3D"color: #ca3400;">"%a@." (pp_set (module String_set) pp_str) m=20

Our rendition of modular explicits extends beyond statically known modules like String_set. For example,

(* A=
bstract set of elements of types 'e. The implementation is abstract<=
span style=3D"color: #8f6f4a; font-style: italic;"> *)

type 'e aset =3D (module Set.S with type elt =3D 'e)

let f : unit -> int aset =3D fun () ->=20
  if Random.bool () then=20
    (module Set.Make(Int))=20
  else=20
    (module Set.Make(type t =3D int=20
      let compare x y =3D - Int.compare x y end))

The function f randomly returns one of two distinct Set implementations (the Set.t types are not compatible). As an application, we print a list of integers as a set (automatically sorting and removing duplicates):

let print_as_set :=
 type a. a aset -> a printer -> a list printer  =3D=20
  fun (module M) pp=
 ppf lst ->=20
    pp_set (module M) pp ppf (M.of_list lst)

let _ =3D Format.printf "%a@."=20
    (print_as_set (f ()) Format.pp_print_int) [1;2;3;1]

The result is indeed either "{ 1, 2, 3 }" or "{ 3, 2, 1 }", depending on how die is cast.

Let us now tackle the pp_map example from Ann55. It is challenging because of the higher-rank type of the map type 'a Map.S.t.

It is tempting to define the module type as

type (=
'k,'v,'m) map =3D=20
    (module Map.S w=
ith type key =3D 'k and type 'a t =3D 'm constraint 'a =3D 'v)

Alas, it doesn't work:

2 |     (module Map.S with type key =3D 'k and type 'a t =3D 'm constraint =
'a =3D 'v)
                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=
^^^
Error: Syntax error: invalid package type: parametrized types are not suppo=
rted

Package types and their with constraints come with many restri= ctions, which is deeply unfortunate.

We have to resort to an encoding:

module type maps =3D si=
g
  include Map.S
  type v
  type mt
  val of_mt : mt -> v t
  val to_mt : v t -> mt=20
end
type ('k,'v,'m) map =3D=20
    (module maps =
with type key =3D 'k and type v =3D 'v and type mt =3D 'm)

One should mention that this is a strictly more general type of maps: it supports specialized implementations for particular combination of keys and values (e.g., if 'v is bool, we can use Set as the underlying structure.)

The pretty-printer of maps is the same as in the Ann55, with two additions: two occurrences of M.of_t.

let pp_map : type k v m. (k,v,m) map -> k printer -> v printer -> m=
 printer =3D=20
    fun (module M) =
pp_key pp_v ppf set ->=
=20
  if M.is_empty (M.of_mt set) then Format.fprintf ppf  else=20
  let pp_sep ppf () =3D Format.=
fprintf ppf ",@ " in=20
  let pp_binding ppf<=
/span> (k,v) =3D Form=
at.fprintf ppf "@[%a@ =3D@ %a@]" pp_key k pp_v v=20
  in=20
  Format.fprintf =
ppf "@[{@ %a@ }@]"=20
    (Format.pp_pr=
int_seq ~pp_sep pp_binding) (M.to_seq (M.=
of_mt set))=20

It applies to statically unknown modules however, unlike pp_map in A= nn55

type (=
'k,'v) amap =3D (=
module maps with =
type key =
=3D 'k and type <=
span style=3D"color: #444fcf; font-weight: bold;">v =3D 'v)

let string_map : =
type a. unit ->=
; (string,a) amap =3D fun () ->=20
  (module struct
    include Map.Make(String)=20
    type v =3D a
    type mt =3D v t
    let of_mt =3D Fun.id
    let to_mt =3D Fun.id
  end)

let () =3D=20
  let md =3D string_map () in
  let module M =3D (val (md : (string,int) amap)) in
  let m =3D M.of_list ["Zero", =
0; "One", 1] in=20
  let pp_str =3D Format.pp_print_int in=20
  Format.printf <=
span style=3D"color: #ca3400;">"%a@."=20
    (pp_map (module M) Format.pp_print_string pp_st=
r) (M.to_mt m)

I should mention that the functions like to_mt come naturally in case of tagless-final interpreters: these are the observation functions. For example:

module type lc =3D sig<=
/span>
  type 'a repr
  val int : int -> int repr
  val lam  : ('a repr -> 'b repr) -> ('a -> =
'b) repr
  val app : ('a -> 'b) repr -> ('a repr -> '=
b repr)
  type obst
  type obs
  val observe : obst repr -> obs
end

type ('a,'obs) lc =3D (module (lc with type obs =3D 'obs and type obst =3D 'a))

let ex1 : type obs. (int,obs) lc -=
> obs =3D fun<=
/span> (module M) -> let open M in
  let t1 =3D app (lam (fun x -&=
gt; x)) (int 1)
  in observe t1

In conclusion, it would be great if one day the restrictions on package types were relaxed.

Olivier Nicole asked and Samuel Vivien replied

Thanks for pointing this out. Does this mean that modular explicits,=20 strictly speaking, bring no additional expressivity but only a simpler=20 way to do these things? Or are there programs that could be expressed=20 with modular explicits but not with constrained module types?

Indeed. Modular explicit does not add any expressiveness to the language=20 (and does not impact the soundness of the type system). Every program=20 that can be written using modular explicits could have been written with=20 a functor encoded as a first-class module.

We presented this encoding in section 1.5 of this paper about modular=20 explicits : https://h= al.science/hal-05428136/document

LRgrep 0.9: Better syntax errors for OCaml and Menhir

Fr=C3=A9d=C3=A9ric Bour announced

Hi everyone,

I've just released LRgrep 0.9, a tool to customize the error message= s of Menhir-generated LR parsers by reasoning about failure paths.

The goal is to move from generic "Syntax error at line X" messages to more = intuitive diagnostics that point to the actual root cause. For example, if = you accidentally put a semicolon in a local-let chain:

let x =3D 5;

let y =3D 6

let z =3D 7
^^^
Error: Expecting 'in' to complete local-binding.=20
Hint: this might be due to the semicolon line 1, cha=
racter 9

Without LRgrep, OCaml typically reports only a syntax error on the subseque= nt let binding. The customized parser can identify that the se= micolon is the likely culprit.

How you can help (feedback wanted!)

I am looking for users to help stress-test the current specifications and i= dentify where error messages are still lacking.

  1. If you use OCaml: I've patched the compiler to use LRgrep. Pleas= e try it via opam: opam switch create 5.4.1+lrgrep Please report cases where the error messages are confusing or where you = would like to see a more helpful hint.
  2. If you use Menhir: Give LRgrep a try on your own grammars if you= want to customize error messages.

Integration with Merlin is also coming soon (PR #2072).

Huge thanks to @fpottier, @jmid, Tarides, and Jane Street for their support.

Happy testing!

Static Analysis for OCaml

fantazio announced

Hi all,

I wrote a short (and slightly opinionated) piece on the state of static ana= lysis tooling for OCaml. The goal is to provide an overview of available tools, works in progress, a= nd missing pieces. Let me know if there is a static analysis tool you use t= hat is not mentioned, or if you wish one existed.

Thanks!

https:/= /fantazio.eu/articles/static_analysis_ocaml.html

new releases: Merlin 5.8 and OCaml-LSP 1.27.0 with support for= OCaml 5.5

vds announced

I am glad to announce new releases of Merlin and OCaml-LSP =F0=9F=A7=99 !

Merlin is an editor service that provides modern IDE features for OCaml and= OCaml-LSP is a frontend for Merlin that speaks with LSP clients.

There are a few bug fixes in these but the main feature is the stable suppo= rt for OCaml 5.5.

Full changelogs:=20

duras 2.1.1 =E2=80=94 daily notes as plain text files

Sergiy Duras announced

duras is a command-line tool for daily notes stored as plain text fi= les (YYYY/MM/YYYY-MM-DD.dn). No database, no daemon, no backgr= ound services.

v2.1.1 adds duras build, which converts a note collection to a= static HTML website. 7,300 notes in \~220ms, single-threaded, no caching. = Notes use sigline format= =E2=80=94 a plain-text structured notation where the leading character of = each line declares its type.

Software Engineer at LexiFi (Paris)

Nicolas Ojeda Bar announced

Dear all,

LexiFi is hiring! We are looking fo= r a full-time Software Engineer to join our core development team.

We are particularly interested in candidates with a strong programming back= ground, for example through previous industrial experience, contributions t= o open-source projects, or substantial personal projects.

LexiFi has been using OCaml for more than 25 years=E2=80=94we were the firs= t software company to build our products on OCaml=E2=80=94and we still impl= ement the vast majority of our stack in OCaml. If you're excited about usin= g OCaml to solve real-world industrial problems, we would love to hear from= you.

https://www.l= exifi.com/careers/software_engineer/

Work at LexiFi spans a wide range of projects across multiple domains. We a= lso remain actively engaged with the OCaml community and strive to give bac= k in various ways, including funding community projects, helping maintain t= he OCaml compiler and other open-source projects, and participating in conf= erences.

If you have any questions, please don't hesitate to reach out to me, either= here or privately.

Cheers, Nicolas

Owebview : OCaml binding to the webview library

Korkorran announced

Hi everyone! =F0=9F=91=8B

I'd like to share a small project I've been working on: owebview, a = set of OCaml bindings for we= bview.

What is webview?

webview is a tiny, cross= -platform library for building desktop GUIs using the operating system's bu= ilt-in web engine =E2=80=94 WebKit on macOS, WebKitGTK on Linux, and WebVie= w2 on Windows. Instead of shipping a whole browser like Electron, you reuse= the system one, so your apps stay small. You create a window, point it at = some HTML (or a URL), and you can call back and forth between the page's Ja= vaScript and your host language.

The gap owebview fills

What makes webview really appealing is its ecosystem: it already has bindin= gs in a lot of languages =E2=80=94 Go (the reference one), Rust, Pyt= hon, C#, Nim, Zig, and many more. As far as I could tell, though, there was= n't one for OCaml.

owebview is an attempt to fill that gap: a thin binding that lets you drive= webview directly from OCaml, with a native bridge between the page's JavaS= cript and your OCaml functions.

What it looks like

A complete app is about ten lines:

let () =3D
  let w =3D Webview.create () in
  Webview.set_tit=
le w "My first owebview app";
  Webview.set_siz=
e w \~width:480 \=
~height:320 Webview.Hint_none;
  Webview.set_htm=
l w
  {|<!doctype html>
      <html><body style=3D"font-fa=
mily: system-ui; text-align: center">
        <h1>Hello from OCaml 👋=
;</h1>
      </body></html>|};
  Webview.run w;
  Webview.destroy=
 w

And you can expose OCaml functions to the page =E2=80=94 here window.= add(a, b) returns a JavaScript Promise resolved from OCaml:

Webview.bind w "add" (fun id req=
 ->
  let result =3D
  match Scanf.sscanf_opt req "\[%d,%d\]" (fun a =
b -> a + b) with
  | Some n -> string_of_int n
  | None -> "null"
  in
  Webview.return =
w id \~error:false \~result)

Try it

# Ru=
n the bundled example
git clone https://github.com/korkorran/owebview.git
cd owebview
dune exec examples/hellowv.exe

# Or pin it into your own project
opam pin add owebview https://github.com/korkorran/owebview.git

Then just add (libraries owebview.webview) to your dune file. = The webview.h header is vendored, and the platform-specific C+= + flags are detected at build time (via pkg-config on Linux), = so there's nothing to wire up by hand.

Honest status & a request

This is a compact binding / starting point, not a complete library y= et: some pieces (unbind, dispatch, full binding memor= y management) are intentionally left out for now.

It's also developed and tested mainly on macOS. I'd love feed= back from people running it on Linux distributions =E2=80=94 = does it compile, do the opam depexts resolve, does the w= ebkit2gtk-4.1 backend behave on your distro?

Issues and PRs are very welcome.

Repository: https://githu= b.com/korkorran/owebview

Thanks for reading =E2=80=94 happy to hear thoughts, suggestions, and espec= ially Linux build reports!

OCaml Runtime Meeting: Mon, July 6 @ 10:00 UTC (10:00 London/= Cambridge, 11:00 Paris, 7pm Sydney)

Tim McGilchrist announced

The next OCaml Runtime Meeting is Monday July 6th (2026-07-06) at 10:00 UTC= (10:00 London/Cambridge, 11:00 Paris, 7pm Sydney). The agenda notes are he= re https://hackmd.io= /@tmcgilchrist/S1RtObvWGe email tim@tarides.com if you want a calendar = invite.

Approximately every month we have an informal meeting between OCaml develop= ers with a focus on the language runtime/garbage collector. The meetings ar= e for sharing understanding and ideas, not for formal planning purposes. Th= ey are open to any interested developer.

Previous meeting notes available in https://github.com/ocaml/subsystem-meetings

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmpDw8EbFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmcACgkQBA0KO07S5cc8tAf+MJGm8rY29TpInnF601tWdXa3xzrMPABHX3JY3YZi HjFaZ3ZD4YmrNiN8BnqC3SV/mbbCvMVqsGwrPtbkRwfCL4L9wjF3anpaadhWoks6 TpytkkSdJyjIFSevhYIRUV44wLBH6dWWeeNyZdoUEEetF7W7+kvbYUqooTtuCHV7 s1I67lY54Qg3+E9XK7OEcgjpbsHwQpqnHkv2g20fmk8cauo8yZBfeUWdt0aT1ftz CYumyVJ33lfBQYrYGd0ocgtteVnsuW+xg6+135NKRYAlI/4cuyO7/U+ASW/KLKBd DDw+tidF77U2BaclnmLfXcyDvHMt2t2PlRu7Ey4Z6TlODQ== =5VYK -----END PGP SIGNATURE----- --===-=-=--