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=OqFZQsxA; 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]) by plum.tunbury.org (Postfix) with ESMTP id 1555940098 for ; Tue, 4 Aug 2026 07:44:41 +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=5y1P7vbyICFYJrryyELxMwwz64i/0lOX09kQHFzKOws=; b=OqFZQsxAk85rZe0ejYFCE0qFXJT2lS0O7I4L7j3k/vVRcB9rZPqtSknM occx+ur8mfHjfewkk6lH/16j+zRQoDyP/DXJP+J3eVKcHvSB8oG2ow2T+ 0jJ9Nx40ReP/KQ1SfwVMBXkV87elNAGGvnvXUSaSDnPV/4u49tQuKykAS Q=; X-CSE-ConnectionGUID: IHnwlw2qSvSkwrdG5Ml3qw== X-CSE-MsgGUID: lXUZaISSRiWtZhzwFj1lOw== 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.25,204,1779141600"; d="asc'?scan'208,217";a="288998789" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 04 Aug 2026 09:44:38 +0200 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 3C588817B8; Tue, 4 Aug 2026 09:44:38 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id DDF728037D for ; Tue, 4 Aug 2026 09:44:30 +0200 (CEST) X-CSE-ConnectionGUID: LDNDWxnMSRmZNrzsqftxZQ== X-CSE-MsgGUID: VAbtGymWTOm66g5KJuG+OQ== IronPort-SDR: 6a71985c_tZtLpe6dGSo4apjSvmFMOAAmJN9cCKSgwcBQVH88pB/A9ML xDCvcynjX3aucx8e3cGjVJ+CbF1LN7NYLEWZo8Q== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0FhAwAUl3FqjyIeaIFaFoQAWykbAW5fGRoHCEmEHDyDT?= =?us-ascii?q?44kgRaBKgGPDIp8gWmBKxYhAg4HAQMBCAUuARsEAQIEAQEBAgECAYILgnMCF?= =?us-ascii?q?o1SAh8GAQQ0EwECBAMCAwEBAQEBAQEBAQEBCwEBAQQBAQECAQECBAMBAQEBA?= =?us-ascii?q?hABAQEBAQE5BUmGTw2CRRk4Ux5gBAMGBwEBAQEBAQEBAQIBAQEiAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIECAEOCxpdD?= =?us-ascii?q?gEIChMBASsFCBgUDwMUAQYDAgQNATUDFAESGgEDggxYAYIiAlADBQwGolObR?= =?us-ascii?q?HqBMoEBggwBAQaBCD4DAg0DDy/aGIFgCQmBNRiBWIQZglAPDQEqSWoCAQKEU?= =?us-ascii?q?AmEOCcPgVVEgRU1YoESSgdvgUEBgQgXAgEBgSQRBAMBAQIGAkMJgyWCaoIme?= =?us-ascii?q?hIbgVcGUBwFGSWBYRqDA4EsgmiGGoJCLAFVExcLBwVegQgDKi8tbjIdgSM+F?= =?us-ascii?q?zVYGwcFgR2BKyyEUyMZNnyBL3VKdS1qEheBGoMVAoJ6QwttPTcUGYxjECENg?= =?us-ascii?q?TpJGSCBUiUOCxQZCA4eECMBBhQOBQEHAwkIDgIgAiwBAQgOFQoMBwMVBBEMD?= =?us-ascii?q?gkCAQEBFgIBAiQGCwsBHQINAgOSSwwQGIEhjmahc4EKNAeEIIFgBgyJCYEmj?= =?us-ascii?q?jSDfINXhARNgQqFQIV9hwORamcimGYjgjaHKF1JCQeBaGuVJBAsCAsDgQWEP?= =?us-ascii?q?oF/I0liARsCDAczGjBDDQQIgk4JRxwPhHeJMwMWgRQBAgyCPRBxPYECJIEjU?= =?us-ascii?q?TtaJ8YHQjUCAQE7BwIHAQELAQOFawEBjAYBJwQIgUQIAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:i/dquK639/BzEYzryQPXwOrXdLJyesId70hD6qkoc20tTiSZ// rOoB1p726NtN9xYgBdpTnuAtjkfZqxz/FICMwqTNGftWrdyRSVxeNZnO/fKlTbckWUnIMw6U 4jSdkYNDSaNzhHZLPBkWuF+qEbsbq6Gc6T69s2hE0dNj2CI5sQlTuRJDzrb3FLeA== X-Talos-CUID: 9a23:WQ9F7GwpCCIH7xJLNXkmBgUwNuYJTW3b6UzqJn2eE3RyUbOJWW2prfY= X-Talos-MUID: 9a23:1kV38QZa0zg1xuBTiRbmmB5zMfhUxKHwVk9QsrcblIqjDHkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.25,204,1779141600"; d="asc'?scan'208,217";a="153577677" X-URL-ContentFilter: X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-MGA-submission: =?us-ascii?q?MDGdp8Q9BKinfQJQopk3MWUyFfGHwpqaaWxhZD?= =?us-ascii?q?cMcIhl3+dh8W/COF0Fce/lZB7vtAnj6iCmLGzqK+RV/QUldIoRbl7Jw2?= =?us-ascii?q?3N4W3Funil8wIskwVrZivzVszxnC6WlKcwQdDvyF6X+T6aE4UhBkdQvZ?= =?us-ascii?q?FkEUHdwITewXhi+FPhiAsacA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 09:44:29 +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 5203D1A3EC; Tue, 4 Aug 2026 09:44:27 +0200 (CEST) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 04 Aug 2026 09:44:24 +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 Aug 4 09:44:27 2026 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.300830, queueID=861141A3F3 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: 19557 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 ZWsgb2YgSnVseSAyOCB0byBBdWd1c3QNCjA0LCAyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNClNR TGl0ZSByZXdyaXR0ZW4gaW4gUHVyZSBPQ2FtbCB3aXRoIENsYXVkZSBDb2RlIGZvciB1c2UgaW4g TWlyYWdlIFVuaWtlcm5lbHMNCk5ldyBvcGFtIHBhY2thZ2VzIGF2YWlsYWJsZSA6IENhbWxTdXJm IGFuZCBHbGVzMw0KYmNmZywgYSBCb3JpbmdseSBTaW1wbGUgQ29uRmlHdXJhdGlvbiBmb3JtYXQN CkludHJvY2FtbCAoYWxwaGEpOiBQb2x5bW9ycGhpYyBQcmludGluZyBhbmQgSW50cm9zcGVjdGlv biBmb3IgT0NhbWwNCkxlYXJuaW5ncyBmcm9tIGJlbmNobWFya2luZyBPeENhbWwtZmxhdm91cmVk IFNXQVIgbWVtY2hyDQpPQ2FtbCBSdW50aW1lIE1lZXRpbmc6IE1vbiwgSnVseSA2IEAgMTA6MDAg VVRDICgxMDowMCBMb25kb24vQ2FtYnJpZGdlLCAxMTowMCBQYXJpcywgN3BtIFN5ZG5leSkNCk9s ZCBDV04NCg0KDQpTUUxpdGUgcmV3cml0dGVuIGluIFB1cmUgT0NhbWwgd2l0aCBDbGF1ZGUgQ29k ZSBmb3IgdXNlIGluIE1pcmFnZSBVbmlrZXJuZWxzDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3NxbGl0ZS1yZXdyaXR0ZW4taW4tcHVyZS1vY2FtbC13aXRo LWNsYXVkZS1jb2RlLWZvci11c2UtaW4tbWlyYWdlLXVuaWtlcm5lbHMvMTg0MDEvMT4NCg0KDQpU ZWogUG9jaGlyYWp1IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgYWxsLA0KDQogIEZv ciBhbiBpbnRlcm5hbCBwcm9qZWN0LCBJIHJlY2VudGx5IHBvcnRlZCBTUUxpdGUgdG8gcHVyZSBP Q2FtbCBmb3INCiAgdXNlIHdpdGhpbiBNaXJhZ2UuIFBsZWFzZSBmaW5kIHRoZSBbcmVwbyBoZXJl XS4gUGxlYXNlIG5vdGUgdGhpcyBpcw0KICAqQUkgZ2VuZXJhdGVkKiBjb2RlIC0gSSBkZXNpZ25l ZCBhbmQgc2V0IHVwIHRoZSB0ZXN0IGhhcm5lc3MgKEplcHNlbiArDQogIFNRTGl0ZSBwYXJpdHkp IGJ1dCBkaWRuJ3Qgd3JpdGUgYW55IG9mIHRoZSBjb2RlLg0KDQogIEJleW9uZCBzdGFuZGFyZCBy ZWxhdGlvbmFsIHRhYmxlcywgdGhlcmUncyBmbGVkZ2xpbmcgc3VwcG9ydCBmb3INCiAgY29sdW1u IG9yaWVudGVkIHRhYmxlcyB0byB1c2UgaW4gT0xBUCB0eXBlIHF1ZXJpZXMuIFdoaWxlIGFscmVh ZHkNCiAgZmFpcmx5IGNhcGFibGUsIEkgZXhwZWN0IHRoaXMgd2lsbCBzZWUgbW9yZSBjb21taXRz IGFzIEkgbWFrZSBwcm9ncmVzcw0KICBvbiB0aGUgbGFyZ2VyIHByb2plY3QuDQoNCiAgVGhlIGxh cmdlciBnb2FsIGlzIGEgZnVsbC1mbGVkZ2VkIElvVCBiYXNlZCB3b3JrZmxvdyBmcmFtZXdvcmsg SSBhbQ0KICBidWlsZGluZyBmb3IgdXNlIGF0IG15IGNvbXBhbnksIElvVFJlYWR5LmNvbS4gT3Vy IGN1cnJlbnQgZnJhbWV3b3JrIGlzDQogIEpTIGJhc2VkIGFuZCB1c2VzIFNRTGl0ZSArIFBhcnF1 ZXQgYXMgREJzLiBJIHdhbnRlZCBzb21ldGhpbmcgc2ltaWxhcg0KICBidXQgc3VpdGFibGUgZm9y IHJ1bm5pbmcgd2l0aGluIE1pcmFnZSB0byBtZWV0IHNvbWUgc2VjdXJpdHkgYW5kDQogIGlzb2xh dGlvbiBkZW5zaXR5IHJlcXVpcmVtZW50cy4gVGhhdCBmcmFtZXdvcmsgaXMgV0lQIGFuZCBtYXkg bm90IGJlDQogIHJlbGVhc2VkIHB1YmxpY2x5Lg0KDQogIEhvcGUgdGhpcyBpcyB1c2VmdWwgdG8g c29tZW9uZSBlbHNlIHRvby4gRmVlbCBmcmVlIHRvIGZpbGUgZmVhdHVyZQ0KICByZXF1ZXN0cyBh bmQgaXNzdWVzLg0KDQogIFRlag0KDQoNCltyZXBvIGhlcmVdIDxodHRwczovL2dpdGh1Yi5jb20v dGVqcG9jaGlyYWp1L2dyYW5hcnk+DQoNCg0KTmV3IG9wYW0gcGFja2FnZXMgYXZhaWxhYmxlIDog Q2FtbFN1cmYgYW5kIEdsZXMzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L25ldy1vcGFtLXBhY2thZ2Vz LWF2YWlsYWJsZS1jYW1sc3VyZi1nbGVzMy8xODQwNC8xPg0KDQoNCkNocmlzdG9waGUgUmFmZmFs bGkgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBEZWFyIENh bWxlcnMsDQoNCiAgSSBhbSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSBsYXRlc3QgdmVyc2lvbiBv ZiAqR2xlczMqIGFuZCBhIG5ldw0KICBhdmFpbGFibGUgc29mdHdhcmUgKkNhbWxTdXJmKg0KDQoN CkNhbWxTdXJmLjEuMA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg PGh0dHBzOi8vZ2l0aHViLmNvbS9jcmFmZi9DYW1sU3VyZj4NCg0KICBDYW1sU3VyZiBpcyBhIHNv ZnR3YXJlIHdyaXR0ZW4gdXNpbmcgR2xlczMgdGhhdCBhbGxvd3MgdmlzdWFsaXphdGlvbg0KICBv ZiBpbXBsaWNpdCBzdXJmYWNlcyBhbmQgY3VydmVzLiBZb3Ugd3JpdGUgYSBzbWFsbCBzY3JpcHQg ZGVmaW5pbmcNCiAgeW91ciBzdXJmYWNlcyBhbmQgY3VydmVzLCB0aGVuIHJ1biBvbmUgb3IgbW9y ZSBzY3JpcHRzIHdpdGgNCiAgYENhbWxTdXJmX3gxMSBzY3JpcHQnIG9yIGBDYW1sU3VyZl93YXls YW5kIHNjcmlwdCcuDQoNCiAgVG8gaW5zdGFsbCwgYG9wYW0gaW5zdGFsbCBDYW1sU3VyZl94MTEn IG9yIGBvcGFtIGluc3RhbGwNCiAgQ2FtbFN1cmZfd2F5bGFuZCcgc2hvdWxkIHdvcmsgKGFmdGVy IGBvcGFtIHVwZGF0ZScpLg0KDQogIFNlZSA8aHR0cHM6Ly9yYWZmYWxsaS5ldS9DYW1sU3VyZj4g Zm9yIHRoZSBkb2N1bWVudGF0aW9uIGFuZCBhIG5pY2UNCiAgdmlkZW8uDQoNCg0KR2xlczMuMjAy NjA3MjUNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIDxo dHRwczovL2dpdGh1Yi5jb20vY3JhZmYvZ2xlczM+DQoNCiAgR2xlczMgaXMgYW4gaW50ZXJmYWNl IHRvIG9wZW4gR0xFUzMuMiBhbmQgRUdMIHRvIGRvIGdyYXBoaWMNCiAgcHJvZ3JhbW1pbmcuIFRo ZSBtYWluIG5vdmVsdHkgY29tcGFyZWQgdG8gdGhlIHByZXZpb3VzIHZlcnNpb24gZnJvbQ0KICAy MDE2IGFyZToNCg0KICDigKIgU3VwcG9ydCBmb3IgdHdvIGJhY2tlbmRzIDogeDExIGFuZCB3YXls YW5kLiB3aW5kb3dzICh3Z2wpIGFuZCBtYWNvcw0KICAgIChjb2NvYSkgYmFja2VuZHMgYXJlIHBs YW5uZWQsIHZvbHVudGVlcnMgYXJlIHdlbGNvbWUuDQogIOKAoiBTdXBwb3J0IGZvciBhIGxvdCBv ZiBhcmNoaXRlY3R1cmVzIDogYWxsIHRoZSBhcmNoaXRlY3R1cmVzIHByb3ZpZGVkDQogICAgYnkg dGhlIG9wYW0tY2kgaW5jbHVkaW5nIGZyZWVic2QgYW5kIG1hY29zIHVzaW5nIHF1YXJ0enggYXMg WCBzZXJ2ZXINCiAgICBzaG91bGQgd29yay4gIE9uZSBleGNlcHRpb24gaXMgd2luMzIsIGJ1dCBh Y3R1YWxseSBpdCBzaG91bGQgYnVpbGQNCiAgICB1c2luZyB4MTEgdG9vLiBJZiBJIGEgdm9sdW50 ZWVyIGNhbiBnaXZlIGl0IGEgdHJ5IGFuZCB0ZWxsIG1lIHRoZQ0KICAgIG1zeXMyIG9yIGN5Z3dp biBwYWNrYWdlIGxpc3QsIEkgd291bGQgZG8gYW4gdXBkYXRlLiAgQWx0aG91Z2ggaXQNCiAgICBj b21waWxlcyBvbiBvcGFtLWNpLCB0aGVyZSBtaWdodCBiZSBidWdzIHdoZW4gcnVubmluZyB0aGUN CiAgICBleGFtcGxlcy4gQnVnIHJlcG9ydCBhcmUgd2VsY29tZSENCiAg4oCiIE11bHRpcGxlIHdp bmRvdyA6IHRoZSBuZXcgdmVyc2lvbiBjYW4gaGFuZGxlIHNldmVyYWwgd2luZG93cy4gVGhlDQog ICAgc2ltcGxlc3Qgc29sdXRpb24gaW4gdGhhdCBjYXNlIGlzIHRvIHJ1biBlYWNoIGV2ZW50LWxv b3AgaW4gaXRzIG93bg0KICAgIGRvbWFpbiAoc2VlIGV4YW1wbGVzL3dpbmRvd3MpLiBUaGlzIGlz IG9ubHkgYmVjYXVzZSBvZiB0aGF0IGV4YW1wbGUNCiAgICB0aGF0IHdlIHJlcXVpcmUgT0NhbWwg NS4gQ29tcGlsYXRpb24gZnJvbSBzb3VyY2Ugc2hvdWxkIHdvcmsgb24NCiAgICBPQ2FtbCA0LjE0 IHRvbyBleGNlcHQgZm9yIHRoYXQgZXhhbXBsZS4NCiAg4oCiIEJhc2ljIHN1cHBvcnQgdG8gbG9h ZCBhIGZvbnQgYW5kIGNvbnZlcnQgYSB0ZXh0IHRvIGEgdGV4dHVyZS4NCiAg4oCiIENsZWFuZWQg LyBleHRlbmRlZCBleGFtcGxlcywgZm9yIGluc3RhbmNlIGEgbmV3IGV4YW1wbGUgc2hvd3MgaG93 IHRvDQogICAgd3JpdGUgYSBzaGFkZXIgdG8gZ2V0IHRoZSAzRCBjb29yZGluYXRlcyBvZiBhIGNs aWNrZWQgcGl4ZWwNCiAgICAoYWxsb3dpbmcgZm9yIHByZWNpc2Ugb2JqZWN0IG1vdmVtZW50IHVz aW5nIHRoZSBtb3VzZSkNCg0KDQpiY2ZnLCBhIEJvcmluZ2x5IFNpbXBsZSBDb25GaUd1cmF0aW9u IGZvcm1hdA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tYmNmZy1hLWJvcmluZ2x5LXNpbXBsZS1jb25maWd1cmF0aW9u LWZvcm1hdC8xODQwNS8xPg0KDQoNCkNhbGFzY2liZXR0YSBSb21haW4gYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIGFtIHBsZWFzZWQgdG8gYW5ub3VuY2Ug dGhlIGZpcnN0IHJlbGVhc2Ugb2YgW2BiY2ZnJ10sIGEgdG9vbCBhbmQNCiAgbGlicmFyeSBmb3Ig bWFuaXB1bGF0aW5nIGFuZCBnZW5lcmF0aW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdGhlDQog IFtTaW1wbGUgQ29uRmlHdXJhdGlvbiBmaWxlIGZvcm1hdF0gKEIgc3RhbmRzIGZvciDigJxib3Jp bmdseeKAnSkuIFRoZQ0KICBgYmNmZycgcHJvamVjdCBzdGVtcyBmcm9tIEzDqW8gQW5kcsOoc+KA mXMgKEBhbmNvbGllKSBbc2NmZ10gcHJvamVjdCAoc2VlDQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2Ytc2NmZy85MjQ5PiksIGJ1dA0KICBhaW1zIHRv IGdvIGEgc3RlcCBmdXJ0aGVyOg0KICDigKIgaXQgZXh0ZW5kcyB0aGUgc3ludGF4IHNvIHRoYXQg bm9uLVVURi04IHN0cmluZ3MgYXJlIGFjY2VwdGVkIGluIGENCiAgICBmb3JtIHNpbWlsYXIgdG8g dGhhdCBzcGVjaWZpZWQgaW4gUkZDODIyIChpbmNsdWRpbmcNCiAgICBfZm9sZGluZy13aGl0ZXNw YWNlXykNCiAg4oCiIHRoZSBkZXBlbmRlbmN5IHNldCBoYXMgYWxzbyBiZWVuIHJlZHVjZWQgdG8g dXNlIG9ubHkgYG9jYW1sbGV4Jw0KICAgIGluc3RlYWQgb2YgYHNlZGxleCcsIHdoaWNoIGlzIHBl cmZlY3RseSBjYXBhYmxlIG9mIGhhbmRsaW5nIFVURi04DQogICAgc3RyaW5ncw0KICDigKIgdGhl IGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBhIGBiY2ZndCcgbGlicmFyeSBiYXNlZCBvbiBAZGJ1ZW56 bGnigJlzDQogICAgW2pzb250XSBkZXNpZ24gYW5kIGEgZHJhZnQgaW1wbGVtZW50YXRpb24gb2Yg QHN3cnVwIG9uIGBzY2ZnJw0KICDigKIgdGhlIHRvb2wgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gaW5j bHVkZSBhIGxpbnRlciAoYWxsb3dpbmcNCiAgICBjb25maWd1cmF0aW9uIGZpbGVzIHRvIGJlIHJl Zm9ybWF0dGVkKSBhcyB3ZWxsIGFzIGEgImBqcSctc3R5bGUiDQogICAgcXVlcnkgdG9vbCB0byBl eHRyYWN0IGluZm9ybWF0aW9uIGZyb20gYW4gZXhwcmVzc2lvbiBhbmQgYQ0KICAgIGNvbmZpZ3Vy YXRpb24gZmlsZQ0KICDigKIgdGhlIGFiaWxpdHkgdG8gc3RyZWFtIHNlcmlhbGlzYXRpb24gYW5k IGRlc2VyaWFsaXNhdGlvbiAoYXMgY2FuIGJlDQogICAgZG9uZSB3aXRoIFhNTCBhbmQgdGhlIFNB WCBtb2RlbCkNCg0KICBUaGUgdG9vbHMgYXJlIGFsc28gYXZhaWxhYmxlIG9uIG91ciBhcHQucm9i dXIuY29vcCByZXBvc2l0b3J5IHZpYSBbb3VyDQogIHJlcHJvZHVjaWJsZSBpbmZyYXN0cnVjdHVy ZV06DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgJCBjdXJsIC1mc1NMIGh0dHBzOi8vYXB0LnJv YnVyLmNvb3AvZ3BnLnB1YiB8IGdwZyAtLWRlYXJtb3IgPiAvdXNyL3NoYXJlL2tleXJpbmdzL2Fw dC5yb2J1ci5jb29wLmdwZw0KICDilIIgJCBlY2hvICJkZWIgW3NpZ25lZC1ieT0vdXNyL3NoYXJl L2tleXJpbmdzL2FwdC5yb2J1ci5jb29wLmdwZ10gaHR0cHM6Ly9hcHQucm9idXIuY29vcCBkZWJp YW4tMTMgbWFpbiIgXA0KICDilIIgICB8IHN1ZG8gdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5k L3JvYnVyLmxpc3QNCiAg4pSCICQgc3VkbyBhcHQgdXBkYXRlDQogIOKUgiAkIHN1ZG8gYXB0IGlu c3RhbGwgYmNmZw0KICDilJTilIDilIDilIDilIANCg0KICBXZSByZWNvbW1lbmQgcmVhZGluZyB0 aGUgW2JjZmcgZG9jdW1lbnRhdGlvbl0gdG8gbGVhcm4gbW9yZSBhYm91dCB0aGlzDQogIGZvcm1h dCwgdGhlc2UgbGlicmFyaWVzIGFuZCB0aGVzZSB0b29scywgaW4gdGhlIGhvcGUgdGhhdCB3ZSBt aWdodA0KICBhbHNvIHJlc29sdmUgb3IgZnVydGhlciBjb21wbGljYXRlIHRoZSBleGlzdGVudGlh bCBxdWVzdGlvbnMgcmVnYXJkaW5nDQogIHRoZSB3b3JsZOKAmXMgYmVzdCBjb25maWd1cmF0aW9u IGZvcm1hdC4NCg0KICA8aHR0cHM6Ly91czEuZGlzY291cnNlLWNkbi5jb20vZmxleDAyMC91cGxv YWRzL29jYW1sL29yaWdpbmFsLzJYL2EvYTJkNWExNzUxY2Y5NjcxMTRiMzZhMjVjZTczYWI0Zjg2 MDUwZTY4Yy5wbmc+DQoNCg0KW2BiY2ZnJ10gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29w L2JjZmc+DQoNCltTaW1wbGUgQ29uRmlHdXJhdGlvbiBmaWxlIGZvcm1hdF0gPGh0dHBzOi8vZ2l0 LnNyLmh0L35lbWVyc2lvbi9zY2ZnPg0KDQpbc2NmZ10gPGh0dHBzOi8vZm9yZ2Uua3VtaWtvZGUu b3JnL2t1bWlrb2RlL3NjZmc+DQoNCltqc29udF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kYnVlbnps aS9qc29udD4NCg0KW291ciByZXByb2R1Y2libGUgaW5mcmFzdHJ1Y3R1cmVdIDxodHRwczovL2J1 aWxkZXIucm9idXIuY29vcD4NCg0KW2JjZmcgZG9jdW1lbnRhdGlvbl0gPGh0dHBzOi8vZG9jcy5v c2F1LnJlL2xvY2FsL2JjZmcvQmNmZy9pbmRleC5odG1sPg0KDQoNCkludHJvY2FtbCAoYWxwaGEp OiBQb2x5bW9ycGhpYyBQcmludGluZyBhbmQgSW50cm9zcGVjdGlvbiBmb3IgT0NhbWwNCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLWludHJvY2FtbC1hbHBoYS1wb2x5bW9ycGhpYy1wcmludGluZy1h bmQtaW50cm9zcGVjdGlvbi1mb3Itb2NhbWwvMTg0MDcvMT4NCg0KDQpGcsOpZMOpcmljIEJvdXIg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgZXhjaXRlZCB0byBzaGFyZSBhbiBh bHBoYSBwcmV2aWV3IG9mICpJbnRyb2NhbWwqLCBhbiBleHRlbnNpb24NCiAgb2YgT0NhbWwgNS41 LjAgdGhhdCBicmluZ3MgdGhlIHBvd2VyIG9mIHRvcGxldmVsLXN0eWxlIGludHJvc3BlY3Rpb24N CiAgZGlyZWN0bHkgaW50byB1c2VyIHByb2dyYW1zLg0KDQoNCldoYXQgaXMgSW50cm9jYW1sPw0K 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAgVGhlIE9DYW1sIHRvcGxldmVsIGhhcyBsb25nIGJlZW4gYWJsZSB0byBwcmludCBhcmJpdHJh cnkgdmFsdWVzDQogIHdpdGhvdXQgcmVxdWlyaW5nIGV4cGxpY2l0IHByaW50ZXIgZnVuY3Rpb25z LiBIb3dldmVyLCB0aGlzIGNhcGFiaWxpdHkNCiAgd2FzIGludGVybmFsIHRvIHRoZSB0b3BsZXZl bC4gKkludHJvY2FtbCogYnJpbmdzIHRoaXMgbWFjaGluZXJ5IGludG8NCiAgdGhlIHN0YW5kYXJk IGxpYnJhcnksIGVuYWJsaW5nIHBvbHltb3JwaGljIHByaW50aW5nIGFuZCBzdHJ1Y3R1cmFsDQog IGludHJvc3BlY3Rpb24gb2YgdmFsdWVzIG9mIGFueSB0eXBlLg0KDQogIEJ5IHJlY292ZXJpbmcg c3RydWN0dXJlIGZyb20gbWV0YWRhdGEgZW1iZWRkZWQgaW4gY29tcGlsZWQgY29kZSwNCiAgSW50 cm9jYW1sIGFsbG93cyB5b3UgdG8gaW5zcGVjdCBjb21wbGV4IGRhdGEgc3RydWN0dXJlcywgZXZl biB0aG9zZQ0KICBoaWRkZW4gYmVoaW5kIGFic3RyYWN0aW9uIGJhcnJpZXJzLCB3aXRob3V0IHdy aXRpbmcgdGVkaW91cyBgcHAnDQogIGZ1bmN0aW9ucy4NCg0KDQrwn5qAIEhvdyB0byBUcnkgSXQN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIElu dHJvY2FtbCBpcyBhdmFpbGFibGUgdmlhIG9wYW0uIFRoZSByZWNvbW1lbmRlZCB3YXkgdG8gdGVz dCB0aGUgYWxwaGENCiAgdmVyc2lvbiBpcyB0byBjcmVhdGUgYSBzcGVjaWZpYyBzd2l0Y2g6DQoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgNS41LjAraW50cm9j YW1sDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCuKXiiBLZXkgQ2FwYWJpbGl0aWVzOg0KDQogIOKA oiBQb2x5bW9ycGhpYyBwcmludGluZzogUHJpbnQgYW55IHZhbHVlIHJlZ2FyZGxlc3Mgb2YgaXRz IHR5cGUsDQogICAgaW5jbHVkaW5nIGFic3RyYWN0IHR5cGVzLg0KICDigKIgRnVsbHkgaW50ZWdy YXRlZCB3aXRoIHRoZSB0b3BsZXZlbCwgdGhlIGRlYnVnZ2VyLCB0aGUNCiAgICBieXRlY29kZS9u YXRpdmUgY29tcGlsZXJzLCBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBkeW5hbWljIGxpbmtlcnMuDQoN Cg0K4peKIENvZGUgRXhhbXBsZXMNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wZW4gSW50 cm9zcGVjdC5QcmludA0KICDilIIgDQogIOKUgiAoKiAxLiBTaW1wbGUgcG9seW1vcnBoaWMgcHJp bnRpbmcgKikNCiAg4pSCIHR5cGUgY29uZmlnID0geyBob3N0IDogc3RyaW5nOyBwb3J0IDogaW50 OyBkZWJ1ZyA6IGJvb2wgfQ0KICDilIIgcHJpbnRfYW55X2VuZGxpbmUgeyBob3N0ID0gImxvY2Fs aG9zdCI7IHBvcnQgPSA4MDgwOyBkZWJ1ZyA9IHRydWUgfTs7DQogIOKUgiAoKiBPdXRwdXQ6IHto b3N0ID0gImxvY2FsaG9zdCI7IHBvcnQgPSA4MDgwOyBkZWJ1ZyA9IHRydWV9ICopDQogIOKUgiAN CiAg4pSCICgqIDIuIEJyZWFraW5nIHRocm91Z2ggYWJzdHJhY3Rpb24gKikNCiAg4pSCIG1vZHVs ZSBNID0gTWFwLk1ha2UoSW50KQ0KICDilIIgcHJpbnRfYW55X2VuZGxpbmUgKE0ub2ZfbGlzdCBb MSwgIm9uZSI7IDIsICJ0d28iXSk7Ow0KICDilIIgKCogT3V0cHV0OiBOb2RlIHtsID0gRW1wdHk7 IHYgPSAxOyBkID0gIm9uZSI7IHIgPSBOb2RlIHtsID0gRW1wdHk7IHYgPSAyOyBkID0gInR3byI7 IHIgPSBFbXB0eTsgaCA9IDF9OyBoID0gMn0gKikNCiAg4pSCIA0KICDilIIgKCogMy4gUXVpY2sg J24nIERpcnR5IHByaW50aW5nIHdpdGggSW50cm9zcGVjdC5QICopDQogIOKUgiBvcGVuIEludHJv c3BlY3QuUA0KICDilIIgbGV0IG1vbnRoID0gIkF1Z3VzdCINCiAg4pSCIGxldCB5ZWFyID0gMjAy Ng0KICDilIIgbGV0ICgpID0gcHJpbnRsbiBbIldlbGNvbWUgdG8gIjsgbW9udGg7ICIgIjsgeWVh cjsgIiEiXQ0KICDilIIgKCogT3V0cHV0OiBXZWxjb21lIHRvIEF1Z3VzdCAyMDI2ISAqKQ0KICDi lJTilIDilIDilIDilIANCg0KICDigJQNCg0KDQrwn5ugIEhvdyBpdCBXb3Jrcw0K4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSW50cm9jYW1sIGltcGxlbWVu dHMgYSBwcm9iYWJpbGlzdGljIG1ldGFkYXRhIHJlY292ZXJ5IHNjaGVtZSBkZXNpZ25lZA0KICBm b3IgaGlnaCBwZXJmb3JtYW5jZToNCg0KICAxLiAqUmVzZXJ2ZWQgYml0czoqIEl0IHN0b3JlcyBh ICJ0YWciIGluIHRoZSByZXNlcnZlZCBoZWFkZXIgYml0cyBvZg0KICAgICAgT0NhbWwgb2JqZWN0 cy4NCiAgMi4gKkluZGV4OiogQSBzaWRlLWRhdGFiYXNlIChgSW50cm9zcGVjdC5JbmRleC50Jykg bWFwcyB0aGVzZSB0YWdzIHRvDQogICAgICBhICpkZXNjcmlwdG9yKiAoYEludHJvc3BlY3QuRGVz Yy50JyksIHdoaWNoIGRlc2NyaWJlcyB0aGUNCiAgICAgIHN5bnRhY3RpYyByZXByZXNlbnRhdGlv biBvZiB0aGUgdmFsdWUuDQogIDMuICpaZXJvIG92ZXJoZWFkOiogVGhlIGNvbXBpbGF0aW9uIHNj aGVtZSBpcyBkZXNpZ25lZCBzbyB0aGF0DQogICAgICBvdmVyaGVhZCBpcyBuZWdsaWdpYmxlIGlu IGJ5dGVjb2RlIGFuZCB2aXJ0dWFsbHkgbm9uZXhpc3RlbnQgaW4NCiAgICAgIG5hdGl2ZSBtb2Rl Lg0KDQoNCuKXiiBUaGUgW2BJbnRyb3NwZWN0J10gQVBJDQoNCiAgVGhlIG5ldyBgSW50cm9zcGVj dCcgbW9kdWxlIHByb3ZpZGVzIHNldmVyYWwgbGF5ZXJzIG9mIGFjY2VzczoNCg0KICAqTG93LWxl dmVsIChmb3IgdG9vbCBhdXRob3JzKToqDQoNCiAg4oCiIGBEZXNjJzogVGhlIHJlcHJlc2VudGF0 aW9uIG9mIHN0cnVjdHVyYWwgZGVzY3JpcHRvcnMuDQogIOKAoiBgSW5kZXgnOiBUaGUgbWFwcGlu ZyBmcm9tIG9iamVjdCBoZWFkZXJzIHRvIGRlc2NyaXB0b3JzLg0KICDigKIgYER5bic6IEEgZHlu YW1pYyB2aWV3IG9mIE9DYW1sIG9iamVjdHMgZ3VpZGVkIGJ5IGRlc2NyaXB0b3JzLA0KICAgIGFs bG93aW5nIGZvciBwcm9ncmFtbWF0aWMgdHJhdmVyc2FsIChpZGVhbCBmb3IgY3VzdG9tIGRlYnVn IHRvb2xzKS4NCg0KICAqSGlnaC1sZXZlbCAoZm9yIGdlbmVyYWwgdXNlKToqDQoNCiAg4oCiIGBQ cmludCc6IEEgYEZvcm1hdCctYmFzZWQgcG9seW1vcnBoaWMgcHJpbnRpbmcgQVBJLg0KICDigKIg YFAnOiBBIGNvbnZlbmllbmNlIG1vZHVsZSBmb3IgInF1aWNrIGFuZCBkaXJ0eSIgZ2VuZXJpYyBw cmludGluZy4NCg0KICDigJQNCg0KDQogIFtgSW50cm9zcGVjdCddDQogIDxodHRwczovL2dpdGh1 Yi5jb20vbGV0LWRlZi9vY2FtbC9ibG9iL2ludHJvY2FtbC01NTAvc3RkbGliL2ludHJvc3BlY3Qu bWxpPg0KDQoNCvCflI0gSW50ZWdyYXRpb24gd2l0aCBleGlzdGluZyBwcmludGVycw0K4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgUHJl dmlvdXNseSwgcHJpbnRpbmcgYW4gb3BhcXVlIHR5cGUgaW4gdGhlIHRvcGxldmVsIG9yIHRoZSBk ZWJ1Z2dlcg0KICB3b3VsZCBzaW1wbHkgcmVzdWx0IGluIGA8YWJzdHI+Jy4gTm93LCB0aGVzZSB0 b29scyB1c2UgdHlwZS1kaXJlY3RlZA0KICBwcmludGluZyBieSBkZWZhdWx0IGJ1dCBzZWFtbGVz c2x5IHN3aXRjaCB0byB0YWctYmFzZWQgcHJpbnRpbmcgd2hlbg0KICBlbmNvdW50ZXJpbmcgb3Bh cXVlIGNvbnN0cnVjdGlvbnMuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAjIGxldCBoID0g SGFzaHRibC5jcmVhdGUgMzs7DQogIOKUgiB2YWwgaCA6ICgnX3dlYWszLCAnX3dlYWs0KSBIYXNo dGJsLnQgPQ0KICDilIIgICA8YWJzdHI+DQogIOKUgiAgICAge3NpemUgPSAwOyBkYXRhID0gKDAs IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApOw0KICDilIIgICAg ICBzZWVkID0gMDsgaW5pdGlhbF9zaXplID0gMTZ9DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIOKA lA0KDQoNCuKaoO+4jyBMaW1pdGF0aW9ucyAmIEN1cnJlbnQgU3RhdHVzIChBbHBoYSkNCuKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IEFzIHRoaXMgaXMgYW4gYWxwaGEgcmVsZWFzZSwgdGhlcmUgYXJlIHNldmVyYWwga25vd24gbGlt aXRhdGlvbnMuIFNvbWUNCiAgYXJlIHRlbXBvcmFyeSwgd2hpbGUgb3RoZXJzIGFyZSBpbmhlcmVu dCB0byB0aGUgZGVzaWduOg0KDQogIOKAoiAqQXJjaGl0ZWN0dXJlICYgQ29tcGlsZXI6Kg0KICAg IOKAoyBEb2VzIG5vdCBzdXBwb3J0IDMyLWJpdCBhcmNoaXRlY3R1cmVzLiAoVGVzdGVkIG9uIHg4 Nl82NCBhbmQNCiAgICAgIGFybTY0KS4NCiAgICDigKMgTm90IGNvbXBhdGlibGUgd2l0aCBGbGFt YmRhLg0KICAgIOKAoyBganNfb2Zfb2NhbWwnIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZCAodGhv dWdoIGEgZml4IGlzDQogICAgICBzdHJhaWdodGZvcndhcmQpLg0KICDigKIgKk1ldGFkYXRhIENv bnN0cmFpbnRzOioNCiAgICDigKMgKkNvbnN0YW50czoqIER1ZSB0byBsaW1pdGVkIHNwYWNlIGZv ciBtZXRhZGF0YSwgc29tZSBjb25zdGFudHMNCiAgICAgICBjYW5ub3QgYmUgcHJpbnRlZCAoZS5n LiwgYHByaW50X2FueSBOb25lJyBtYXkgcHJpbnQgYDAnLCBidXQNCiAgICAgICBgcHJpbnRsbiBb Tm9uZV0nIHdpbGwgbGlrZWx5IHN1Y2NlZWQgYmVjYXVzZSB0aGUgbGlzdCB3cmFwcGVyDQogICAg ICAgcHJvdmlkZXMgbWV0YWRhdGEpLg0KICAgIOKAoyAqUG9seS12YXJpYW50czoqIFRoZXNlIGFy ZSBhcHByb3hpbWF0ZWQgKGUuZy4sIGBwcmludF9hbnkgYEEnIG1heQ0KICAgICAgIHByaW50IGA2 NSBvciBgQScpLg0KICAgIOKAoyAqRkZJOiogVmFsdWVzIG9yaWdpbmF0aW5nIGZyb20gdGhlIEZG SSBhcmUgbm90IHRhZ2dlZCBhbmQgd2lsbCBiZQ0KICAgICAgIHByaW50ZWQgYXMgcmF3IHR1cGxl cy92YWx1ZXMgdW5sZXNzIHdyYXBwZWQgaW4gYSB0YWdnZWQNCiAgICAgICBzdHJ1Y3R1cmUuIChO b3RlOiBGRkkgY29tcGF0aWJpbGl0eSBpcyBlbnRpcmVseSBwcmVzZXJ2ZWQpLg0KICDigKIgKk1h cnNoYWxsaW5nOiogVGFncyBhcmUgbm90IHByZXNlcnZlZCBkdXJpbmcgbWFyc2hhbGxpbmcgYnkN CiAgICAgZGVmYXVsdC4gVG8gcHJlc2VydmUgdGhlbSwgeW91IG11c3Qgb3B0LWluIHVzaW5nIHRo ZQ0KICAgICBgUmVzZXJ2ZWRfYml0cycgZmxhZzoNCg0KICAgIOKUjOKUgOKUgOKUgOKUgA0KICAg IOKUgiBsZXQgcm91bmR0cmlwIGZsYWdzIHggPSBNYXJzaGFsLmZyb21fc3RyaW5nIChNYXJzaGFs LnRvX3N0cmluZyB4IGZsYWdzKSAwOzsNCiAgICDilIIgcHJpbnRsbiBbcm91bmR0cmlwIFtSZXNl cnZlZF9iaXRzXSAocmVmIDEpXTs7ICgqIE91dHB1dDoge2NvbnRlbnRzID0gMX0gKikNCiAgICDi lJTilIDilIDilIDilIANCiAg4oCiICpPYmplY3QgU2l6ZToqIEJ5IHJlc2VydmluZyAyMiBiaXRz IGZvciBtZXRhZGF0YSwgdGhlIG1heGltdW0gbGVuZ3RoDQogICAgIGZvciBhcnJheXMgaXMgXH40 IGJpbGxpb24gZWxlbWVudHMgYW5kIGZvciBzdHJpbmdzIGlzIDMyR0IuDQoNCiAg4oCUDQoNCiAg KkFja25vd2xlZGdlbWVudHM6KiBUaGlzIHdvcmsgaXMgZnVuZGVkIGJ5IHRoZSBbQWhyZWZzIEdy YW50IFByb2dyYW0NCiAgZm9yIE9DYW1sXS4NCg0KICBLdWRvcyB0byDDh2HEn2RhxZ8gQm96bWFu IGV0IGFsLiBmb3IgdGhlIG9yaWdpbmFsIHdvcmsgb24gYG9jcC1tZW1wcm9mJywNCiAgd2hpY2gg cHJvdmlkZWQgdGhlIGlkZWEgYW5kIGluZnJhc3RydWN0dXJlIGZvciByZXB1cnBvc2luZyBoZWFk ZXINCiAgYml0cywgYW5kIG1hbnkgdGhhbmtzIHRvIHRoZSBtYWludGFpbmVycyB3aG8gaGF2ZSBw cmVzZXJ2ZWQgdGhpcw0KICBjYXBhYmlsaXR5Lg0KDQogIPCfpJYgKk5vdGU6KiBObyByb2JvdHMg d2VyZSBoYXJtZWQgZHVyaW5nIHRoZSBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uDQogIG9mIHRo aXMgZmVhdHVyZSwgdGhvdWdoIHRoZWlyIGhlbHAgd2FzIHNvbGljaXRlZCBmb3IgdGVzdGluZyBh bmQNCiAgcHJvb2YtcmVhZGluZy4NCg0KDQpbQWhyZWZzIEdyYW50IFByb2dyYW0gZm9yIE9DYW1s XQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9haHJlZnMtZ3JhbnQtcHJvZ3JhbS1mb3It b2NhbWw+DQoNCg0KTGVhcm5pbmdzIGZyb20gYmVuY2htYXJraW5nIE94Q2FtbC1mbGF2b3VyZWQg U1dBUiBtZW1jaHINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv bGVhcm5pbmdzLWZyb20tYmVuY2htYXJraW5nLW94Y2FtbC1mbGF2b3VyZWQtc3dhci1tZW1jaHIv MTg0MTEvMT4NCg0KDQpLZWl0aCBkaXNjdXNzZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIC9FZGl0b3LigJlzIG5vdGU6IHRoZXJlIHdlcmUgbWFu eSBsb25nIHJlcGxpZXMgdG8gdGhpcyBwb3N0LCBwbGVhc2UNCiAgZm9sbG93IHRoZSBsaW5rIGFi b3ZlIGZvciB0aGUgZnVsbCBkaXNjdXNzaW9uLi8NCg0KICBIaSBldmVyeW9uZSwganVzdCB3YW50 ZWQgdG8gc2hhcmUgYSBiZW5jaG1hcmtpbmcgcHJvamVjdCB0aGF0IEkgaGFkDQogIGNyZWF0ZWQg b3ZlciB0aGUgcGFzdCBmZXcgZGF5cyBmb3IgdGVzdGluZyBvdXQgT3hDYW1sOg0KDQogIDxodHRw czovL2dpdGh1Yi5jb20vS2lDaGphbmcvbWwtbWVtY2hyPg0KDQogIEkgY29tZSBmcm9tIDEwKyB5 ZWFycyBvZiBSdXN0LCBzdGFydGVkIGhhY2tpbmcgb24gaXQgd2hlbiBpdCBzdGlsbCBoYWQNCiAg dGhlIFJ1YnktaW5zcGlyZWQgY2xvc3VyZSBzeW50YXggd2hlcmUgcGFyYW1ldGVycyBkZW5vdGVk IGJ5IHRoZSB0d28NCiAgcGlwZXMgYXJlIHdyaXR0ZW4gaW5zaWRlIG9mIHRoZSBibG9jayBpbnN0 ZWFkIG9mIG91dHNpZGUgb2YgaXQNCiAgKGkuZS4gYHt8YXJnfCBzdGF0ZW1lbnRzO30nIGluc3Rl YWQgb2YgYHxhcmd8IHsgc3RhdGVtZW50czsNCiAgfScpLiBDZXJ0YWlubHkgbm90IHRoZSBlYXJs aWVzdCBiYXRjaCwgYnV0IGVhcmx5IGVub3VnaCB0byBrbm93IHRoYXQNCiAgYmVmb3JlIFJ1c3Qg d2FzIHNlbGYtaG9zdGVkLCB0aGUgY29tcGlsZXIgd2FzIHdyaXR0ZW4gaW4gT0NhbWwsIHdoaWNo DQogIGlzIHdoeSBJJ20gcmVhbGx5IGludGVyZXN0ZWQgaW4gc2VlaW5nIGhvdyBPQ2FtbCBpcyAi bGVhcm5pbmcgZnJvbSBpdHMNCiAgY2hpbGQiLiBJIGhhZCBhIGJyaWVmIHN0aW50IGluIHdyaXRp bmcgT0NhbWwgYXQgYSBzdGFydHVwLCBidXQgdGhhdA0KICB3YXMgdG9vIHNob3J0IG9mIGEgdGlt ZSB0byBjb25zaWRlciBteXNlbGYgZmFtaWxpYXIgd2l0aCBpdC4NCg0KICBUaGUgUkVBRE1FLm1k IG9mIHRoZSByZXBvIGRvZXMgYSBmYWlybHkgZ29vZCBqb2IgaW4gZXhwbGFpbmluZyB0aGUNCiAg aW50cmljYXRlIGRldGFpbHMsIGFuZCBhZG1pdHRlZGx5IEFJIHdhcyB1c2VkIHRvIHdyaXRlIGl0 LCBidXQgd2hhdCBBSQ0KICBjYW5ub3QgdGVsbCB5b3UgaXMgdGhlIGV4cGVyaWVuY2Ugb2Ygd3Jp dGluZyBpdC4gWWVzLCBJIHVzZWQgQUksIGJ1dA0KICBubywgSSBkaWQgbm90IGxldCBpdCB3cml0 ZSBldmVyeXRoaW5nLCBiZWNhdXNlIG9uZSBvZiB0aGUgYWltcyBvZiB0aGlzDQogIGV4ZXJjaXNl IGlzIHRvIGhlbHAgbWUgbGVhcm4gYm90aCBPQ2FtbCBhbmQgT3hDYW1sLg0KDQogIExldCdzIGdv IHRocm91Z2ggdGhlIGdvb2QsIHRoZSBiYWQgYW5kIHRoZSB1Z2x5IHBhcnRzIG9mIGNvZGluZyBp bg0KICBPeENhbWwuIEJlYXIgaW4gbWluZCB0aGF0IHNvbWUgb2YgdGhlc2UgcG9pbnRzIGFyZSBk dWUgdG8gbWUgYmVpbmcgYW4NCiAgT0NhbWwgbm9vYiBhbmQgYW0gc3RpbGwgbGVhcm5pbmcgdGhp bmdzIGFib3V0IHRoZSBsYW5ndWFnZS4NCg0KDQpUaGUgR29vZA0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCiAgKlRoZSBjb25jaXNlbmVzcyBhbmQgdGhlIGNvbXBpbGUtdGltZXMqLiBJJ20g YWJzb2x1dGVseSBmbG9vcmVkIGJ5DQogICBqdXN0IGhvdyBlbGVnYW50IGlkaW9tYXRpYyBPQ2Ft bCBzb3VyY2UgY29kZSBsb29rcy4gRXZlcnl0aGluZyBqdXN0DQogICB3b3JrcyB3aXRob3V0IG11 Y2ggY2VyZW1vbnk6IG5vIGJyYWNlcyBub3IgYnJhY2tldHMsIG5vIHJhbmRvbSBgZm4nDQogICBr ZXl3b3JkcywgYW5kIG1vc3QgaW1wb3J0YW50bHkgbm8gY3J1ZnQgdGhhdCBnZXRzIGluIHRoZSB3 YXkg4oCTIHlvdQ0KICAganVzdCBgbGV0IHRoZXJlID0gbGlnaHQnLCBhbmQgYHRoZXJlJyB3YXMg YGxpZ2h0Jy4gTm90IG9ubHkgdGhhdCwgdGhlDQogICBjb21waWxlLXZlcmlmeS1yZXdyaXRlIGxv b3AgaXMgcXVpdGUgZmFzdCwgcHJlY2lzZWx5IGJlY2F1c2UgY29tcGlsZQ0KICAgdGltZXMgYXJl IGFtYXppbmdseSBmYXN0LCBzbyBmYXN0IHRoYXQgZXZlbiBgdXRvcCcgZXhpc3RzIGFzIGEgUkVQ TCwNCiAgIGFsbG93aW5nIG1lIHRvIHRlc3QgaWRlYXMgb3V0IGJlZm9yZSBjb21taXR0aW5nIHRv IHRoZW0uIFRoZXNlIGFyZW4ndA0KICAgdGhpbmdzIHRoYXQgYSBSdXN0YWNlYW4gaXMgdXNlZCB0 bzogbm9ybWFsbHkgd2hhdCBoYXBwZW5zIGlzIHRoYXQNCiAgIHdoZW5ldmVyIEkgZW5jb3VudGVy IGEgbmV3IGNyYXRlLCBJIHJlbHkgb24gZG9jcy5ycyBmb3IgZG9jdW1lbnRhdGlvbg0KICAgYWJv dXQgdGhlIGZlYXR1cmVzIGNvbWluZyBmcm9tIHRoZSBjcmF0ZSwgb3Igc3BlbmQgdGltZSBjcmVh dGluZyBhDQogICBuZXcgdW5pdCB0ZXN0IGFuZCBjb21waWxpbmcgaXQgdG8gc2VlIGhvdyBpdCB3 b3Jrcy4gSSBjYW4gcmVhbGx5IG5vdw0KICAgc2VlIHdoeSBPQ2FtbCBkZXZlbG9wZXJzIHdvdWxk IHdhbnQgdG8gY29udGludWUgd3JpdGluZyBPQ2FtbCBkZXNwaXRlDQogICBpdCBub3QgYmVpbmcg b25lIG9mIHRoZSBtb3N0IHBvcHVsYXIgbGFuZ3VhZ2VzIG91dCB0aGVyZS4NCg0KICAqRHVuZSou IFRoaXMgc29ydCBvZiB0aWVzIGJhY2sgaW50byB0aGUgcHJldmlvdXMgcG9pbnQgb24gY29uY2lz ZW5lc3M6DQogICBidWlsZCBjb25maWd1cmF0aW9uIGlzIHJlYWxseSBqdXN0IHR1cGxlcy9zLWV4 cHJlc3Npb25zLiBXaGlsZSBJIGNhbg0KICAgc3RpbGwgcHJldHR5IG11Y2ggYWNoaWV2ZSB0aGUg c2FtZSBlZmZlY3RzIGluIFJ1c3Qgd2l0aCBgQ2FyZ28udG9tbCcsDQogICBldmVyeXRoaW5nIGJl aW5nIHMtZXhwcmVzc2lvbnMgaW4gZHVuZSBtZWFucyB0aGF0IHRoZXJlIHJlYWxseSBpc24ndA0K ICAgbXVjaCBvdmVyaGVhZC4gSSBub3cgY29tZSB0byB0aGluayBvZiB0aGlzIHN0eWxlIGFzICpt aW5pbWFsbHkgeWV0DQogICBzdWZmaWNpZW50bHkgY29uY2lzZSosIGUuZy4gdGhlIGJyYWNrZXRz IGluIGFuIHMtZXhwcmVzc2lvbiBpcyB0aGUNCiAgIG1pbmltYWwgc3RydWN0dXJlIGFyb3VuZCBk YXRhLCBhbmQgc2VtYW50aWNzIHNpbXBseSBqdXN0IGZhbGwgb3V0DQogICBmcm9tIHdoYXQgeW91 IHB1dCBiZXR3ZWVuIHRoZSBicmFja2V0cy4gSW50ZWdyYXRpb24gd2l0aCBDIGlzIHByZXR0eQ0K ICAgc2VhbWxlc3MgYXMgd2VsbCwgYWxvbmcgd2l0aCBSdXN0LCB0aG91Z2ggdGhlIGxhdHRlciBz dGlsbCByZXF1aXJlcw0KICAgdGVhY2hpbmcgZHVuZSB0byB1c2UgY2FyZ28sIHdoaWNoIGRvZXNu J3QgcmVhbGx5IHN0cmlrZSBtZSBhcw0KICAgc3VycHJpc2luZyBhcyBDIGlzIG11Y2ggbW9yZSB3 ZWxsLWVzdGFibGlzaGVkIGFzIHRoZSBsaW5ndWEgZnJhbmNhIGluDQogICBzeXN0ZW1zIHByb2dy YW1taW5nLg0KDQogICpgW0BAemVyb19hbGxvY10nKi4gVGhpcyBpcyB3aGF0IE94Q2FtbCBicmlu Z3MgdG8gdGhlIHRhYmxlIGFuZCBpdA0KICAgZGVsaXZlcnMgcmlnaHQgYXdheSDigJMgbWFyayB5 b3VyIGB2YWx+cyB3aXRoIGl0IGluIHlvdXIgaW50ZXJmYWNlDQogICBkZWZpbml0aW9ucywgYW5k IGl0J2xsIGltbWVkaWF0ZWx5IHRyeSBhbmQgY2F0Y2ggYW55IHBvc3NpYmxlDQogICBhbGxvY2F0 aW9ucyB0aGF0IHlvdSBtYWtlIHdpdGhpbiB5b3VyIGZ1bmN0aW9uLiBJJ20gdXNlZCB0byB6ZXJv LWNvc3QNCiAgIGFic3RyYWN0aW9ucyBzbyBiZWluZyBtYWRlIGF3YXJlIHRoYXQgc29tZSBsYW5n dWFnZSBmZWF0dXJlcyBhcmVuJ3QNCiAgIGZyZWUgaW4gdGVybXMgb2YgYWxsb2NhdGlvbnMgd2Fz IHF1aXRlIG5ldyB0byBtZSAoSSdtIGxvb2tpbmcgYXQgeW91LA0KICAgfm9wdGlvbicpLiBJdCBt YWtlcyBzZW5zZSB1cG9uIGNsb3NlciBpbnNwZWN0aW9uLCBidXQgdGhlIGluaXRpYWwNCiAgIHN1 cnByaXNlIGlzIHN0aWxsIHRoZXJlIOKAkyBJIGd1ZXNzIEknbSBqdXN0IHJlYWxseSBub3QgdXNl ZCB0bw0KICAgdGhpbmtpbmcgdGhhdCBuaWNlIGxhbmd1YWdlIGZlYXR1cmVzIGhhdmUgbm9uLXRy aXZpYWwgY29zdHMNCiAgIGFzc29jaWF0ZWQgd2l0aCB0aGVtLiBBbnl3YXksIHRoZSBhbm5vdGF0 aW9uIGNlcnRhaW5seSB0b29rIGEgcGFnZQ0KICAgZnJvbSBSdXN0LCB3aGVyZSB0aGUgY2hlY2sg aGFwcGVucyAqYWxsIGF0IGNvbXBpbGF0aW9uIHRpbWUqLCBzbyBjb2RlDQogICB0aGF0IGNvbXBp bGVzIHdpdGggdGhhdCBhbm5vdGF0aW9uIGlzIGd1YXJhbnRlZWQgbm90IHRvIGFsbG9jYXRlDQog ICBhbnl0aGluZyBieSB0aGUgY29tcGlsZXIuIEkgbG92ZSBteSBwYXJlbnRzLg0KDQogICpNdXRh YmxlIGxvY2FsIHZhcmlhYmxlcyouIEkga25vdyBlbm91Z2ggT0NhbWwgdG8ga25vdyB0aGF0IHRo ZQ0KICAgc3RhbmRhcmQgd2F5IGlzIHRvIHVzZSBgJ2EgcmVmJywgYnV0IHNlZWluZyBob3cgYG11 dGFibGUnIGp1c3Qgd29ya3MNCiAgIGV4YWN0bHkgdGhlIHdheSBJIHRob3VnaHQgd2l0aG91dCBt dWNoIGZhbmZhcmUgd2FzIHF1aXRlIG5pY2UuIEl0DQogICBhbHNvIGRvZXNuJ3QgcmVxdWlyZSB1 c2luZyB0aGUgYCEnIHByZWZpeCB3aGVuICJkZXJlZmVyZW5jaW5nIiB0aGUNCiAgIHZhcmlhYmxl IHRvIHJlYWQgaXRzIHZhbHVlOyB0aGUgb25seSBkb3duc2lkZSBpcyB0aGF0IGl0IHN0aWxsIGRv ZXMNCiAgIHJlcXVpcmUgYDwtJyBmb3IgYXNzaWdubWVudC4gVGhhdCdzIGluZXZpdGFibGUsIHNp bmNlIGA9JyBoYXMgYmVlbg0KICAgb3ZlcmxvYWRlZCB3aXRoIHRvbyBtdWNoIG1lYW5pbmc7IGlu IGZhY3QsIHRoZSBvZGQgb25lIG91dCBoZXJlIGlzDQogICBsb2dpY2FsIGVxdWFsaXR5LCBzaW5j ZSBsZXQtYmluZGluZ3MgYW5kIHJlY29yZCBmaWVsZHMgYXJlIGFyZ3VhYmx5DQogICBib3RoIGlu IHRoZSBzYW1lIGNhdGVnb3J5IG9mIGFzc2lnbm1lbnQgb3BlcmF0b3JzLg0KDQogICpVbmJveGVk IHR1cGxlcyBhbmQgcmVjb3JkcyouIFRoZXkganVzdCB3b3JrIGFzIGV4cGVjdGVkLCBldmVuIGlu DQogICBwYXR0ZXJucy4gWW91IHJlYWxseSBqdXN0IG5lZWQgdG8gcHJlZml4IGV2ZXJ5dGhpbmcg d2l0aCBgIycsIGFuZA0KICAgaXQnbGwgd29yaywgZS5nLiB0aGUgY29tbW9uIHBhdHRlcm4gdGhh dCBJIG9mdGVuIHVzZSBpbiBSdXN0IHdoZW4gSQ0KICAgbmVlZCB0byByZXR1cm4gb3IgYmluZCB0 d28gb3IgbW9yZSB2YWx1ZXMgYXQgdGhlIHNhbWUgdGltZSBpcyB0byB1c2UNCiAgIHR1cGxlcywg YW5kIGluIE94Q2FtbCBpdCdzIHByZXR0eSBtdWNoIHRoZSBzYW1lOg0KDQogIOKUjOKUgOKUgOKU gOKUgA0KICDilIIgbGV0ICMoYSwgYikgPSBpZiBjb25kIHRoZW4gIygjOEwsIGZvbykgZWxzZSAj KCMzTCwgYmFyKQ0KICDilJTilIDilIDilIDilIANCg0KICAqQXV0b21hdGljIGJ5dGUgYWxpZ25t ZW50Ki4gT0NhbWwgc3RyaW5ncyBhbmQgYnl0ZSBhcnJheXMgYXJlDQogICBhdXRvbWF0aWNhbGx5 IGFsaWduZWQgdG8gYSB3aG9sZSBudW1iZXIgb2Ygd29yZHMsIHNvIEkgbmV2ZXIgbmVlZCB0bw0K ICAgd29ycnkgYWJvdXQgbWlzYWxpZ25tZW50IHdoZW4gcmVhZGluZyB0aGUgZmluYWwgcGFydGlh bCB3b3JkLCBub3INCiAgIHJlcXVpcmluZyBhIHByb2xvZ3VlIHRvIGZpcnN0IGFkdmFuY2UgYnl0 ZXMgc28gdGhhdCBpdCBsYW5kcyBvbiBhDQogICB3b3JkIGJvdW5kYXJ5Lg0KDQoNClRoZSBCYWQN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogICpGdW5jdGlvbmFsaXR5IGluY29tcGxldGVuZXNz Ki4gVGhpcyBtYXkganVzdCBiZSBhIHJlc3VsdCBvZiBPeENhbWwNCiAgIHN0aWxsIGJlaW5nIGEg ZmFpcmx5IG5ldyBsYW5ndWFnZSBleHRlbnNpb24sIGJ1dCBzb21lIGJhc2ljDQogICBvcGVyYXRp b25zIGp1c3QgYXJlbid0IHRoZXJlIHdoZW4gSSByZWFjaCBvdXQgZm9yIHRoZW0gZHVyaW5nDQog ICBkZXZlbG9wbWVudCDigJMgbG9naWNhbCBpbmZpeCBvcGVyYXRvcnMsIGJpdCBzaGlmdGluZywg YW5kIGV2ZW4NCiAgIGNvbXBhcmlzb24gaW5maXggb3BlcmF0b3JzLiBTb21lIG9mIHRoZW0gYXJl IG5vdCBldmVuIGluIHN0ZGxpYiBhdA0KICAgYWxsLCBidXQgcmF0aGVyIHBhcnQgb2YgdGhlIGNv bXBpbGVyIGludHJpbnNpY3Mg4oCTIEkgaGFkIHRvIGRpZw0KICAgYEJ5dGVzLnVuc2FmZV9nZXRf aW42NF9uZV9pbmRleGVkX2J5X2ludDY0JyBvdXQgZnJvbSB0aGUgY29tcGlsZXINCiAgIHNvdXJj ZSBjb2RlIGluIG9yZGVyIHRvIGtub3cgdGhhdCBzdWNoIGZ1bmN0aW9uYWxpdGllcyBldmVuIGV4 aXN0ZWQsDQogICBhbmQgYW4gdW5zYWZlIGxvYWQgZm9yIHVuc2lnbmVkIGBpbnQ4JyBjdXJyZW50 bHkgZG9lc24ndCBleGlzdCBldmVuDQogICBhcyBhbiBpbnRyaW5zaWMgYW55d2hlcmUuIE9uIHRo ZSBvdGhlciBoYW5kLCBJIGdldCB3aHkgdGhlDQogICBwb2x5bW9ycGhpYyBpbmZpeCBvcGVyYXRv cnMgZG9uJ3Qgd29yayDigJMgYCdhJyBoYXMgdGhlIGB2YWx1ZScgbGF5b3V0LA0KICAgYW5kIGBp bnQ2NCMnIGhhcyBgYml0czY0JywgYW5kIHN0cnVjdHVyYWwgY29tcGFyaXNvbiBiZXR3ZWVuIHRo ZSB0d28NCiAgIGp1c3Qgd291bGRuJ3Qgd29yay4gSXQgd291bGQgYmUgc28gZ3JlYXQgaWYgdGhl IHBvbHltb3JwaGljIG9wZXJhdG9ycw0KICAgYWxzbyBpZ25vcmVzIHRoZSBsYXlvdXQgdGhhdCB0 aGUgYXJndW1lbnRzIGhhdmUgYXMgbG9uZyBhcyB0aGV5DQogICBtYXRjaC4NCg0KICAqUGVyZm9y bWFuY2UgaW1wYWN0cyBvbiBjZXJ0YWluIGZ1bmN0aW9ucyouIFNwZWNpZmljYWxseSwgdGhlIG9u ZXMNCiAgIHRoYXQgbWl4LWFuZC1tYXRjaCBwYXJhbWV0ZXJzIHdpdGggdGhlaXIgYm94ZWQgYW5k IHVuYm94ZWQNCiAgIGNvdW50ZXJwYXJ0cy4gVGhpcyBtYXkgbm90IGFjdHVhbGx5IGFmZmVjdCBh bnl0aGluZywgYnV0IEkndmUgYmVlbg0KICAgbGllZCB0byBieSBDbGF1ZGUgc28gbWFueSB0aW1l cyB0aGF0IEkgaGF2ZSB0byBwdXQgdGhpcyB1cCwgYmVjYXVzZQ0KICAgaW50dWl0aXZlbHkgc3Bl YWtpbmcsIHVuYm94aW5nIGFuZCBlc3BlY2lhbGx5IGJveGluZyBoYXMgYQ0KICAgbm9uLW5lZ2xp Z2libGUgY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlbSwgYW5kDQogICBlLmcuIGBJbnQ2NF91LnNo aWZ0X3tsZWZ0LHJpZ2h0fScgcmVxdWlyZXMgbWUgdG8gdXNlIGFuIHVuYm94ZWQgMm5kDQogICBh cmd1bWVudCB0byBpbmRpY2F0ZSBob3cgbWFueSBiaXRzIEkgd2FudCB0byBzaGlmdCBieS4gSSd2 ZSBiZWVuIHRvbGQNCiAgIHRoYXQgYm94aW5nIGZvciBjb21wYXJpc29uIHVzaW5nIGBJbnQ2NF91 LmNvbXBhcmUnIGRvZXNuJ3QgYWxsb2NhdGUNCiAgIGFueXRoaW5nIGRlc3BpdGUgaGF2aW5nIHRv IGNvbXBhcmUgdGhlIHJlc3VsdGluZyBib3hlZCBpbnRlZ2VyLCBhbmQNCiAgIENsYXVkZSBzYXlz IHRoZSBkaXNhc3NlbWJseSBmcm9tIGBtZW1jaHIuYScgcHJvdmVzIGl0Og0KDQogIOKUjOKUgOKU gOKUgOKUgA0KICDilIIgSW50NjRfdS4oY29tcGFyZSAoKHRvX2ludCBpKSArIDgpIG4gPCAwKQ0K ICDilIIgLS0tDQogIOKUgiAyMmE6ICBsZWEgICAgMHgxMSglcmJ4LCVyYngsMSksJXIxMiAgIDsg MmkgKyAxNywgaS5lLiB0YWdnZWQoaSArIDgpDQogIOKUgiAyMmY6ICBjbXAgICAgJXJkaSwlcjEy ICAgICAgICAgICAgICAgIDsgdnMgdGFnZ2VkIG4NCiAg4pSCIDIzMjogIGpnICAgICAyODANCiAg 4pSU4pSA4pSA4pSA4pSADQoNCiAgSSByZWFsbHkgY2FuJ3Qga25vdyBmb3Igc3VyZSB3aGV0aGVy IHRoaXMgaXMgZXZlcnkgaW5zdHJ1Y3Rpb24gZW1pdHRlZA0KICBieSB0aGUgZXhwcmVzc2lvbiBz aW5jZSBgaScgb3JpZ2luYWxseSB3YXMgYW4gdW5ib3hlZCBpbnRlZ2VyLCBhbmQNCiAgQ2xhdWRl IG1heSBiZSBtaXNzaW5nIHRoZSBjb250ZXh0IHdoZXJlIGBpJyBpcyBiZWluZyByZXRhZ2dlZC9y ZWJveGVkDQogIGFnYWluIGp1c3QgdG8gbWFrZSB0aGlzIGNvbXBhcmlzb24uDQoNCiAgVGhlIHVu Ym94ZWQgdmFyaWFudCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6DQoNCiAg4pSM4pSA4pSA4pSA 4pSADQogIOKUgiBJbnQ2NF91Lihjb21wYXJlIChpICsgIzMyTCkgKG9mX2ludCBuKSA8IDApDQog IOKUgiAtLS0NCiAg4pSCIDEwMTogIGxlYSAgICAweDIwKCVyYngpLCVyMTIgICAgICA7IGkgKyAz Mg0KICDilIIgMTA5OiAgY21wICAgICVyc2ksJXIxMiAgICAgICAgICAgIDsgdnMgbiwgcHJlLXVu dGFnZ2VkIGF0IDB4ZDcNCiAg4pSCIDEwYzogIGpnICAgICAyMjQNCiAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgVGFrZW4gYXQgZmFjZSB2YWx1ZSwgYm90aCBnZW5lcmF0ZSB0aGUgc2FtZSBudW1iZXIg b2YgaW5zdHJ1Y3Rpb25zIGFuZA0KICBhbGwgYnV0IHRoZSBwYXJhbWV0ZXJzIGFyZSBpZGVudGlj YWwsIHNvIGlmIHRoZXJlJ3MgYW55dGhpbmcgdGhhdCdzDQogIGRpZmZlcmVudCwgaXQgaGFzIHRv IGJlIHRoZSBoaWRkZW4gY29zdHMgb2YgdGhlIHBhcmFtZXRlcnMgYmVpbmcNCiAgcGFzc2VkIHRv IHRoZXNlIGluc3RydWN0aW9ucy4gVGhpcyBiaXQgbWF0dGVycywgYmVjYXVzZSBpdCdzIGluIHRo ZQ0KICBob3QgbG9vcCBleGVjdXRpb24gcGF0aCwgYW5kIGV2ZXJ5IGluc3RydWN0aW9uIG9yIG5h bm9zZWNvbmQgd2Ugc2F2ZQ0KICBoZXJlIGNhbiBzY2FsZSB1cCB0byBtaWNybyBvciBldmVuIG1p bGxpc2Vjb25kcyBzYXZlZC4NCg0KICAqRXJnb25vbWljcyouIFRoaXMgY3V0cyBib3RoIHdheXMs IEkgcmVhbGx5IGxpa2UgdGhlIGxvY2FsaXplZCBpbXBvcnRzDQogICB0aGF0IEkgc2hvd2Nhc2Vk IGFib3ZlIHdpdGggYEludDY0X3UuKGV4cHJlc3Npb24pJyBpbnN0ZWFkIG9mIHRhZ2dpbmcNCiAg IGVhY2ggZnVuY3Rpb24gcmVwZWF0ZWRseSwgYnV0IGRvaW5nIGl0IG92ZXIgYW5kIG92ZXIgYWdh aW4gZ2V0cw0KICAgcmVwZXRpdGl2ZS4gSSBjb3VsZCBpbmRlZWQgdXNlIGEgbG9jYWwgaW1wb3J0 IGJ5IGRvaW5nIGBsZXQgb3Blbg0KICAgSW50NjRfdSBpbicsIGhvd2V2ZXIgdGhlcmUgYXJlIHRp bWVzIHdoZXJlIHRoaXMgZG9lc24ndCB3b3JrIGFzDQogICBleHBlY3RlZCwgZXNwZWNpYWxseSB3 aGVuIEkgaGF2ZSB0byBkZWFsIHdpdGggYm94ZWQgaW50ZWdlcnMgb2YNCiAgIHZhcnlpbmcgc2l6 ZXMgYXMgd2VsbCwgbGlrZSB0aGUgYWZvcmVtZW50aW9uZWQgYGludCcuIEkgZG9uJ3QgdGhpbmsN CiAgIHRoaXMgaXMgYSBwcm9ibGVtIHRoYXQgY2FuIGJlIHNvbHZlZCBnZW5lcmFsbHkgdW5sZXNz IHdlIHNvbHZlIHRoZQ0KICAgcHJvYmxlbSBvZiBwb2x5bW9ycGhpYyBsYXlvdXRzLCBzbyBJJ2Qg c3RpbGwgbGlzdCB0aGlzIGFzIGEgcGFpbg0KICAgcG9pbnQuDQoNCg0KVGhlIHVnbHkNCuKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogICpObyBjb250aW51ZXMvYnJlYWtzL2Vhcmx5IHJldHVy bnMqLiBUaGlzIGlzIHN0YXJ0aW5nIHRvIGdldCByZWFsbHkNCiAgIHVnbHkg4oCTIHdoaWxlIEkg dW5kZXJzdGFuZCB0aGUgYXJndW1lbnQgZnJvbSBmdW5jdGlvbmFsIHByb2dyYW1tZXJzDQogICB0 aGF0IGltcGVyYXRpdmUgY29kZSBjYW4gdXN1YWxseSBiZSByZXdyaXR0ZW4gaW4gYSBwdXJlciBm dW5jdGlvbmFsDQogICBzdHlsZSB3aXRob3V0IG11dGF0aW9uLCB3ZSdyZSBub3cgaW4gc3lzdGVt cyBwcm9ncmFtbWluZyBsYW5kLCBhbmQNCiAgIGV2ZXJ5IGluc3RydWN0aW9uIGVtaXR0ZWQgY291 bnRzLCBhbmQgbm90IGJlaW5nIGFibGUgdG8gZGlyZWN0bHkganVtcA0KICAgdG8gd2hlcmUgSSB3 YW50IHVzaW5nIGNvbnRpbnVlcywgYnJlYWtzIG9yIHJldHVybnMgaXMgYSBodWdlIGhvbGUgaW4N CiAgIG15IHJlcGVydG9pcmUuIFRha2UgZm9yIGV4YW1wbGUsIHRoZSBjb2RlIHRoYXQgSSBoYWQg dG8gdXNlIHRvIGZvcmNlDQogICBhbiBlYXJseSBleGl0IGluIHRoZSBsb29wOg0KDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgIHdoaWxlIEludDY0X3UuKGkgKyAjOEwgPD0gbjY0KSBkbw0KICDi lIIgICBsZXQgciA9IHN3YXJfcmF3IChCeXRlcy51bnNhZmVfZ2V0X2ludDY0X25lX2luZGV4ZWRf YnlfaW50NjQgcyBpKSBpbg0KICDilIIgICBpZiBub3QgSW50NjRfdS4ociBsYW5kIG1hc2sgPSAj MEwpIHRoZW4gKA0KICDilIIgICAgIGhpdCA8LSBpOw0KICDilIIgICAgIGkgPC0gbjY0KQ0KICDi lIIgICBlbHNlIGkgPC0gSW50NjRfdS4oaSArICM4TCkNCiAg4pSCIGRvbmUNCiAg4pSU4pSA4pSA 4pSA4pSADQoNCiAgU2VlIHdoYXQgSSBkaWQgaGVyZT8gSSBlc3NlbnRpYWxseSBoYXZlIHRvIGFz c2lnbiBgbjY0JyB0byBgaScgc28gdGhhdA0KICB0aGUgbG9vcCBjb25kaXRpb24gZmFpbHMganVz dCB0byAiYnJlYWsiIGZyb20gdGhlIGxvb3AuIEFuZCB3ZSdyZSBub3QNCiAgZG9uZSBoZXJlIGVp dGhlciwgYmVjYXVzZSBgaScgZGVub3RlcyB0aGUgb2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0DQog IHJlYWRpbmcgYnl0ZXMsIHNvIGEgbGF0ZXIgbG9vcCBuZWVkcyBpdCB0byBiZSBwcmVzZXJ2ZWQ6 DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBpZiBJbnQ2NF91LihoaXQgPj0gIzBMKSB0aGVu IGkgPC0gaGl0Ow0KICDilJTilIDilIDilIDilIANCg0KICBJIGdvdCBsdWNreSBoZXJlIGJlY2F1 c2UgSSBhbSBhYmxlIHRvIHJlY292ZXIgYGknIHF1aXRlIGVhc2lseSBhcyBJJ3ZlDQogIGFzc2ln bmVkIGl0IHRvIGBoaXQnLCBidXQgb25lIGNhbiBlYXNpbHkgaW1hZ2luZSB0aGF0IHlvdSBjYW4n dCBiZSBhcw0KICBsdWNreSB3aXRoIG90aGVyIGxvb3BzLiBZb3UgbWF5IGhhdmUgdG8ga2VlcCBz cGFyZSB2YXJpYWJsZXMgYXJvdW5kDQogIGp1c3QgdG8gc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBs b29wIHdoZW4geW91IGJyZWFrIGl0LCBqdXN0IHRvDQogIHByZXNlcnZlIGl0IGFuZCB1c2UgaXQg b24gc3Vic2VxdWVudCBjb2RlIHBhdGhzLiBHcmFudGVkLCB0aGlzIG1heSBub3QNCiAgYmUgYXMg bXVjaCBvZiBhIHByb2JsZW0gYXMgSSBtYWtlIGl0IHRvIGJlLCBzaW5jZSBpdCdzIG5vdCBvbiB0 aGUgaG90DQogIGV4ZWN1dGlvbiBwYXRoIGJ1dCByYXRoZXIgZG9uZSBhdCBtb3N0IG9uY2UgZXZl cnkgbG9vcCwgYnV0IGBjb250aW51ZScNCiAgaXMgY2VydGFpbmx5IG5vdCB0aGUgY2FzZS4gSSBn dWVzcyBpbiBhIHByb3BlciBUQ08nZCByZWN1cnNpdmUNCiAgZnVuY3Rpb24sIGNhbGxpbmcgdGhl IGZ1bmN0aW9uIGFnYWluIHdpdGggbmV3IHBhcmFtZXRlcnMgd291bGQgYmUNCiAgZXF1aXZhbGVu dCB0byBhIGNvbnRpbnVlLCBidXQgSSBoYXZlbid0IHRlc3RlZCBpdCBvdXQgZW5vdWdoIHlldCB0 bw0KICByZWFsbHkgY29uY2x1ZGUgdGhhdCBUQ08gaXMgYXMgZmFzdCBhcyBhbiBpbXBlcmF0aXZl IGxvb3AuDQoNCiAgKkF0dHJpYnV0ZXMgY2FuIGJlIHRyaXZpYWxseSBkZWZlYXRlZCouIE5vdCBh biBPeENhbWwgcHJvYmxlbSBwZXIgc2UsDQogICBidXQgSSBhY2NpZGVudGFsbHkgZGVmZWF0ZWQg dGhlIHVzYWdlIG9mIGBbQGlubGluZSBhbHdheXNdJyBpbiB0aGUNCiAgIGlkaW9tYXRpYyBNTCBm bGF2b3VyIG9mIG1lbWNociBiZWNhdXNlIHRoZSBmdW5jdGlvbiBJJ20gYW5ub3RhdGluZw0KICAg Y2FwdHVyZXMgYSB2YXJpYWJsZSBmcm9tIHRoZSBlbnZpcm9ubWVudDoNCg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIGxldFtAaW5saW5lIGFsd2F5c10gc3dhcl9yYXcgdyA9DQogIOKUgiAgIGxl dCB3ID0gSW50NjRfdS4odyBseG9yIGNzKSBpbg0KICDilIIgICBJbnQ2NF91LigodyAtIG9uZXMp IGxhbmQgbG9nbm90IHcpDQogIOKUgiBpbg0KICDilJTilIDilIDilIDilIANCg0KICBCb3RoIGBj cycgYW5kIGBvbmVzJyBhcmVuJ3QgcGFzc2VkIGluIGFzIHBhcmFtZXRlcnMsIHNvIG5vdyBgc3dh cl9yYXcnDQogIGJlY29tZXMgYSByZWFsIGZ1bmN0aW9uIHRoYXQgZ2V0cyBhbGxvY2F0ZWQgKm9u IHRoZSBzdGFjayosIHdoaWNoDQogIG1lYW5zIGJvdGggYFtAQHplcm9fYWxsb2NdJyBhbmQgdGhl IGJlbmNobWFyaydzIGBtV2QvUnVuJyBkaWRuJ3QgY2F0Y2gNCiAgaXQsIGFzIHRoZXkgbWVhc3Vy ZSAqaGVhcCBhbGxvY2F0aW9ucyouIFVuZm9ydHVuYXRlbHksIGV2ZW4gc3RhY2sNCiAgYWxsb2Nh dGlvbnMgc3RpbGwgY29zdCBwZXJmb3JtYW5jZSwgYmVjYXVzZSBjYWxsaW5nIGZ1bmN0aW9ucyBh cmUgbm90DQogIGZyZWUgYW5kIHJlcXVpcmVzIHNldHRpbmcgdXAgdGhlIGNhbGwgZnJhbWUsIGxv YWRpbmcgdGhlIGVudmlyb25tZW50DQogIHZhcmlhYmxlcyBmcm9tIG1lbW9yeSwgc2F2aW5nIHRo ZSBjb250ZXh0IGluIHRoZSBjYWxsZWUsIGFuZCBjbGVhbmluZw0KICB1cCBiZWZvcmUgcmV0dXJu aW5nIHRvIHRoZSBjYWxsZWUsIG5vbmUgb2Ygd2hpY2ggYXJlIHRyaXZpYWwgY29zdHMNCiAgdGhh dCBjYW4gZWFzaWx5IGJlIGVsaW1pbmF0ZWQuDQoNCiAgQWRtaXR0ZWRseSwgdGhpcyB3YXMgbXkg cGVyc29uYWwgc2tpbGwgaXNzdWUgZm9yIG5vdCBiZWluZyB3ZWxsLXZlcnNlZA0KICBlbm91Z2gg aW4gT0NhbWwsIEkganVzdCBoYXZlIGEgZmVlbGluZyB0aGF0IHRoZSBjb21waWxlciBzaG91bGQg aGF2ZQ0KICBhdCBsZWFzdCB3YXJuZWQgbWUgdGhhdCBpdCBpc24ndCBpbmxpbmluZyB0aGUgZnVu Y3Rpb24gYXMgSSB0b2xkIGl0IHRvDQogIGR1ZSB0byBjYXB0dXJlZCB2YXJpYWJsZXMuIEZpeGlu ZyB0aGlzIGJ1ZyBpbW1lZGlhdGVseSBicm91Z2h0IHRoZSBNTA0KICBmdW5jdGlvbmFsIHN0eWxl IG1lbWNociBpbXBsZW1lbnRhdGlvbiBkb3duIHRvIHRoZSBzYW1lIHNwZWVkIGFzIHRoZQ0KICBp bXBlcmF0aXZlIE1MIHN0eWxlIG1lbWNociwgYW5kIG1heWJlIGV2ZW4gMS0yJSBmYXN0ZXIgYmFz ZWQgb24NCiAgYmVuY2htYXJrcy4NCg0KDQpDbG9zaW5nIHRob3VnaHRzDQrilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBMZXQncyBwdXQgaW50byBw ZXJzcGVjdGl2ZSBhYm91dCB0aGUgbnVtYmVyczogT0NhbWwncyBgQnl0ZS5pbmRleCcgaXMNCiAg YWJvdXQgMTB4IHNsb3dlciB0aGFuIHRoZSBSdXN0L0MgZXF1aXZhbGVudCwgd2hlcmVhcyBPeENh bWwgbWFuYWdlZCB0bw0KICBnZXQgaXQgZG93biB0byBhYm91dCBvbmx5IDEuM3ggc2xvd2VyLiBU aGlzIG1hZ25pdHVkZSBvZiBkaWZmZXJlbmNlIGlzDQogIGEgaHVnZSB3aW4hIFdpdGggT3hDYW1s IGFzIGEgbGFuZ3VhZ2UgZXh0ZW5zaW9uIHRoYXQgbWF5IGhhdmUgaXRzDQogIGZlYXR1cmVzIHVw c3RyZWFtZWQsIE9DYW1sIGNhbiBub3cgaGF2ZSBpdHMgc3lzdGVtJ3Mgc2xpY2Ugb2YgdGhlIGNh a2UNCiAgYW5kIGVhdCBpdCB0b28gYnkgYmVpbmcgaW4gdGhlIHNhbWUgb3JkZXIgb2YgbWFnbml0 dWRlIGFzIEMvUnVzdC4gSSdkDQogIHNheSB0aGF0IE94Q2FtbCBoYXMgY29tcGxldGVseSBqdXN0 aWZpZWQgaXRzIHJhaXNvbiBkJ8OqdHJlLCBlc3BlY2lhbGx5DQogIG9uIHRoZSBwYXJ0IHdoZXJl IG9uZSBjYW4gd3JpdGUgaWRpb21hdGljLWlzaCBPQ2FtbCBzeW50YXggc3ByaW5rbGVkDQogIHdp dGggdW5ib3hlZCBpbnRlZ2VycyBhbmQgc3RpbGwgZ2V0IHBlcmZvcm1hbmNlIGNsb3NlIHRvIGJh cmUgbWV0YWwuDQoNCiAgSSB0aGluayBpdCdzIGFsc28gZ29vZCB0byBhZGRyZXNzIHRoZSBmcmlj dGlvbiBwb2ludHMgd2hpbGUgZGV2ZWxvcGluZw0KICBpbiBPeENhbWwg4oCTIHdoaWxlIHdyaXRp bmcgdGhpcyBwb3N0LCBJJ3ZlIGFsc28gdHJpZWQgdG8gd3JpdGUgYQ0KICBsYXJnZWx5IHNhZmUs IGlkaW9tYXRpYyBSdXN0IHZlcnNpb24gb2YgbWVtY2hyLCBhbmQgdGhhdCBhbG9uZSBpcw0KICBh bHJlYWR5IGFib3V0IDEwJSBmYXN0ZXIgdGhhbiB0aGUgT3hDYW1sIGVxdWl2YWxlbnQuIFdoYXQg SSB3YW50ZWQgdG8NCiAgYnJpbmcgdXAgaGVyZSBpc24ndCBteSB2YXJ5aW5nIHNraWxsIGxldmVs cyBpbiB0aGVzZSB0d28gbGFuZ3VhZ2VzDQogIChhbHRob3VnaCBpdCBtYXkgaGF2ZSBpbmRlZWQg cGxheWVkIGEgZmFjdG9yKSwgYnV0IHJhdGhlciAqaG93IHRoZQ0KICBwcm9ncmFtbWluZyBsYW5n dWFnZSdzIHBoaWxvc29waHkgZ3VpZGVzIHRoZSB3YXkgeW91IHRoaW5rKi4gSWYgeW91J3ZlDQog IGhlYXJkIG9mIGxpbmd1aXN0aWMgcmVsYXRpdmVseSBvciB0aGUgb2xkZXIgU2FwaXItV2hvcmYg aHlwb3RoZXNpcyBpbg0KICBsaW5ndWlzdGljcywgdGhpcyBpcyBleGFjdGx5IHRoYXQsIGFwcGxp ZWQgdG8gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIOKAkw0KICBSdXN0IGlzIGZ1bmRhbWVudGFsbHkg YWJvdXQgYnVpbGRpbmcgc2FmZSwgcm9idXN0IGFuZCBlZmZpY2llbnQNCiAgc29mdHdhcmUsIHNv IHRoZSBsYW5ndWFnZSBmZWF0dXJlcyBzdWNoIGFzIHplcm8tY29zdCBhYnN0cmFjdGlvbnMsDQog IGhvcnJlbmRvdXNseSBsb25nIGNvbXBpbGUgdGltZXMsIGJsb2F0ZWQgY29tcGlsZXIgZXJyb3Ig bWVzc2FnZXMgaXMNCiAgZGVzaWduZWQgZXhhY3RseSBmb3IgeW91IHRvIHdyaXRlIGNvZGUgdGhh dCdzIGdvaW5nIHRvIGJlIHNhZmUgYW5kDQogIGZhc3QgYnkgZGVmYXVsdC4NCg0KICBPQ2FtbCBp cyBub3QgdGhhdCwgYW5kIGl0IGRvZXNuJ3QgaGF2ZSB0byBwcmV0ZW5kIHRvIGJlIHNvbWV0aGlu ZyBpdA0KICBpc24ndCBlaXRoZXIsIGJlY2F1c2UgaXQgYWxzbyBoYXMgYWR2YW50YWdlcyBvdmVy IFJ1c3QgdGhhdCBpcyBoYXJkIHRvDQogIHJlcGxpY2F0ZSB0aGVyZSDigJMgZmFzdCBjb21waWxl IHRpbWVzLCBsYXlvdXRzIHRoYXQgYXJlIHNvIHVuaWZvcm0gdG8NCiAgdGhlIHBvaW50IHdoZXJl IHlvdSByZWFsbHkgZG9uJ3QgdGhpbmsgYWJvdXQgdGhlbSwgdGFpbC1jYWxsDQogIG9wdGltaXph dGlvbnMgdGhhdCBicmluZ3MgbG9vcHMvcmVjdXJzaW9ucyBjbG9zZSB0byBiYXJlLW1ldGFsIHNw ZWVkLA0KICBhbmQgYSByaWNoZXIgdHlwZSBzeXN0ZW0gdGhhdCBzdXBwb3J0cyBHQURUcyBhbmQg bW9uYWRzLCBhbmQgbGV0J3Mgbm90DQogIGZvcmdldCDigJMgd2l0aG91dCBPQ2FtbCwgdGhlcmUg d291bGRuJ3QgYmUgUnVzdC4gVGhlcmUncyBjbGVhcmx5IHN0aWxsDQogIGEgbG90IHRoYXQgT0Nh bWwgY2FuIG9mZmVyIHRvIHRoZSB3b3JsZCwgYW5kIHdlIChiYXNpY2FsbHkganVzdCBtZSkNCiAg c3RpbGwgaGF2ZW4ndCBzZWVuIGFsbCBpdCBoYXMgdG8gb2ZmZXIgeWV0Lg0KDQogIFRoZSBwYWlu IHBvaW50cyB0aGF0IEkndmUgbGlzdGVkIGFyZSBtb3N0bHkgYmVjYXVzZSBPeENhbWwgaXMNCiAg b3N0ZW5zaWJseSB3cml0dGVuIGZvciBzeXN0ZW1zIHByb2dyYW1tZXJzIHRvIHdyaXRlIGVmZmlj aWVudCBjb2RlLA0KICBhbmQgdGhlIHN5bnRheC90b29saW5nIHJpZ2h0IG5vdyBzaW1wbHkgZG9l c24ndCBleGFjdGx5IHN1cHBvcnQgdGhvc2UNCiAgZ29hbHMganVzdCB5ZXQuIE1ha2luZyBpdCBy dW4gZmFzdGVyIGlzIGdyZWF0OyBhbGxvd2luZyBhbnlvbmUgdG8NCiAgZWFzaWx5IHdyaXRlIHBy b2dyYW1zIHRoYXQgYXJlIGJ5IGRlZmF1bHQgcnVubmluZyBlZmZpY2llbnRseSBpcw0KICBhd2Vz b21lLg0KDQoNCldoYXQncyBuZXh0DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwN Cg0KICBPeENhbWwgaGFzIFNJTUQgc3VwcG9ydCB2aWEgYG94Y2FtbF9zaW1kJywgc28gdGhhdCdz IHRoZSBuYXR1cmFsIG5leHQNCiAgc3RlcCB0byB0ZXN0IGFuZCBzZWUgaG93IGl0IGZhcmVzIHdo ZW4gY29tcGFyZWQgd2l0aCB0aGUgb3B0aW1pemVkIEMNCiAgYW5kIFJ1c3QgdmVyc2lvbnMsIHRo ZSBsYXR0ZXIgcHJvdmlkZWQgYnkgQnVybnRTdXNoaSdzIFtgbWVtY2hyJw0KICBjcmF0ZV0gKHll cywgaXQncyBoaXMgcmVhbCB1c2VybmFtZSkuIEFmdGVyIHRoYXQsIEknbSBsb29raW5nIHRvIHNl ZQ0KICBpZiBJIGNhbiBwb3J0IHNvbWUgc21hbGwgYW5kIHNlbGYtY29udGFpbmVkIFJ1c3QgY3Jh dGVzIG92ZXIgdG8gT3hDYW1sDQogIGFuZCBjb250aW51ZSBleHBlcmltZW50aW5nIG9uIHRoZSBw ZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MuIEJlYXIgaW4NCiAgbWluZCB0aGF0IGBtZW1jaHIn IGlzIGEgY29uc3RyYWluZWQgZXhhbXBsZSBvcGVyYXRpbmcgd2l0aCBvbmx5IHRoZQ0KICBpbnB1 dCBhcmd1bWVudHM7IGl0J2xsIGJlIGludGVyZXN0aW5nIHRvIHNlZSBob3cgaXQgd29ya3Mgd2l0 aCBzeXN0ZW1zDQogIHRoYXQgcmVxdWlyZSBzdG9yYWdlIGFuZCBtZW1vcnkgb3ZlciB0aW1lLg0K DQoNCltgbWVtY2hyJyBjcmF0ZV0gPGh0dHBzOi8vY3JhdGVzLmlvL2NyYXRlcy9tZW1jaHI+DQoN Cg0KT0NhbWwgUnVudGltZSBNZWV0aW5nOiBNb24sIEp1bHkgNiBAIDEwOjAwIFVUQyAoMTA6MDAg TG9uZG9uL0NhbWJyaWRnZSwgMTE6MDAgUGFyaXMsIDdwbSBTeWRuZXkpDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXJ1bnRpbWUtbWVldGlu Zy1tb24tanVseS02LTEwLTAwLXV0Yy0xMC0wMC1sb25kb24tY2FtYnJpZGdlLTExLTAwLXBhcmlz LTdwbS1zeWRuZXkvMTgzMTIvNj4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhyZWFkLCBUaW0gTWNH aWxjaHJpc3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBUaGFuayB5b3UgZm9yIHRoZSBjb3JyZWN0IEBraXQtdHkta2F0ZSBJJ2xsIHBvc3QgdGhlIG5v dGljZSBhIGJpdA0KICBlYXJsaWVyIGZvciBuZXh0IG1vbnRoLiBUaGUgbm90ZXMgYXJlIGF2YWls YWJsZSBvbg0KICA8aHR0cHM6Ly9oYWNrbWQuaW8vQ3dqN2xXanVSbEtFcjhIOEY2d3BSdz92aWV3 I0FnZW5kYS1JdGVtcy1mb3ItbWVldGluZy1vbi1BdWd1c3QtM3JkLTIwMjY+DQoNCiAgVGhlIG5l eHQgZWRpdGlvbiB3aWxsIGJlIE1vbmRheSBPY3RvYmVyIDV0aCBhdCB0aGUgc2FtZSB0aW1lLg0K DQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8g bWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAg aXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNT IGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2Vp dmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2Nh bWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxt YWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxo dHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJj aGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2Ft bC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0K W0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --==-=-= 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 July 28 to August 04,= 2026.

SQLite rewritten in Pure OCaml with Claude Code for use in Mir= age Unikernels

Tej Pochiraju announced

Hi all,

For an internal project, I recently ported SQLite to pure OCaml for use wit= hin Mirage. Please find the repo here. Please note this is AI generated code - I design= ed and set up the test harness (Jepsen + SQLite parity) but didn't write an= y of the code.=20

Beyond standard relational tables, there's fledgling support for column ori= ented tables to use in OLAP type queries. While already fairly capable, I e= xpect this will see more commits as I make progress on the larger project.

The larger goal is a full-fledged IoT based workflow framework I am buildin= g for use at my company, IoTReady.com. Our current framework is JS based an= d uses SQLite + Parquet as DBs. I wanted something similar but suitable for= running within Mirage to meet some security and isolation density requirem= ents. That framework is WIP and may not be released publicly.

Hope this is useful to someone else too. Feel free to file feature requests= and issues.=20

Tej

New opam packages available : CamlSurf and Gles3

Christophe Raffalli announced

Dear Camlers,

I am pleased to announce the latest version of Gles3 and a new avail= able software CamlSurf

CamlSurf.1.0

https://github.com/craff/Caml= Surf

CamlSurf is a software written using Gles3 that allows visualization of imp= licit surfaces and curves. You write a small script defining your surfaces = and curves, then run one or more scripts with CamlSurf_x11 script or CamlSurf_wayland script.=20

To install, opam install CamlSurf_x11 or opam install C= amlSurf_wayland should work (after opam update).

See https://raffalli.eu/CamlSurf for the documentation and a nice video.

bcfg, a Boringly Simple ConFiGuration format

Calascibetta Romain announced

I am pleased to announce the first release of bcfg, a tool and library for manipulatin= g and generating configuration files in the Simple ConFiGuration file format (B stands for =E2=80=9Cb= oringly=E2=80=9D). The bcfg project stems from L=C3=A9o Andr= =C3=A8s=E2=80=99s (@ancolie) scfg project (see https://discuss.ocaml.org/t/ann-first-release-of-s= cfg/9249), but aims to go a step further:

  • it extends the syntax so that non-UTF-8 strings are accepted in a form = similar to that specified in RFC822 (including fo= lding-whitespace)
  • the dependency set has also been reduced to use only ocamllex instead of sedlex, which is perfectly capable of handling = UTF-8 strings
  • the distribution includes a bcfgt library based on @dbuenz= li=E2=80=99s jsont design= and a draft implementation of @swrup on scfg
  • the tool has been extended to include a linter (allowing configuration = files to be reformatted) as well as a "jq-style" query tool to= extract information from an expression and a configuration file
  • the ability to stream serialisation and deserialisation (as can be done= with XML and the SAX model)

The tools are also available on our apt.robur.coop repository via our reproducible infrastructure:

$ curl -fsSL https://apt.robur.coop/gpg.pub | gpg --dearmor > /usr/share=
/keyrings/apt.robur.coop.gpg
$ echo "deb [signed-by=3D/usr/share/keyrings/apt.robur.coop.gpg] https://ap=
t.robur.coop debian-13 main" \
  | sudo tee /etc/apt/sources.list.d/robur.list
$ sudo apt update
$ sudo apt install bcfg

We recommend reading the bcfg documentation to learn more about this format, these lib= raries and these tools, in the hope that we might also resolve or further c= omplicate the existential questions regarding the world=E2=80=99s best conf= iguration format.

3D"a2d5a1751cf96711=

Introcaml (alpha): Polymorphic Printing and Introspection for = OCaml

Fr=C3=A9d=C3=A9ric Bour announced

We are excited to share an alpha preview of Introcaml, an extension = of OCaml 5.5.0 that brings the power of toplevel-style introspection direct= ly into user programs.

What is Introcaml?

The OCaml toplevel has long been able to print arbitrary values without req= uiring explicit printer functions. However, this capability was internal to= the toplevel. Introcaml brings this machinery into the standard lib= rary, enabling polymorphic printing and structural introspection of values = of any type.

By recovering structure from metadata embedded in compiled code, Introcaml = allows you to inspect complex data structures, even those hidden behind abs= traction barriers, without writing tedious pp functions.

=F0=9F=9A=80 How to Try It

Introcaml is available via opam. The recommended way to test the alpha vers= ion is to create a specific switch:

opam switch create 5.5.0+introcaml
  • Key Capabilities:
    • Polymorphic printing: Print any value regardless of its type, including= abstract types.
    • Fully integrated with the toplevel, the debugger, the bytecode/native c= ompilers, and their respective dynamic linkers.
  • Code Examples
    open I=
    ntrospect.Print
    
    (* 1. Simple polymorphic printing *)
    type config =3D { host : string; =
    port : int; debug : bool }
    print_any_endline { host =3D "localhost"; port =3D 8080; debug =3D true =
    };;
    (* Output: {host =3D "localhost"; por=
    t =3D 8080; debug =3D true} *)
    
    (* 2. Breaking through abstraction *)
    module M =3D Map.Make(Int)
    print_any_endline (M.of_list [1, "one"; 2, "two"]);;
    (* Output: Node {l =3D Empty; v =3D 1=
    ; d =3D "one"; r =3D Node {l =3D Empty; v =3D 2; d =3D "two"; r =3D Empty; =
    h =3D 1}; h =3D 2}(* 3. Quick 'n' Dirty printing with I=
    ntrospect.P *)
    open Introspect.P
    let month =3D "Augu=
    st"
    let year =3D 2026
    let () =3D printl=
    n ["Welcome to "; month; " "; year; "!"<=
    /span>]
    (* Output: Welcome to August 2026! *)
    

=F0=9F=9B=A0 How it Works

Introcaml implements a probabilistic metadata recovery scheme designed for = high performance:

  1. Reserved bits: It stores a "tag" in the reserved header bits of = OCaml objects.
  2. Index: A side-database (Introspect.Index.t) maps th= ese tags to a descriptor (Introspect.Desc.t), which des= cribes the syntactic representation of the value.
  3. Zero overhead: The compilation scheme is designed so that overhe= ad is negligible in bytecode and virtually nonexistent in native mode.
  • The Introspect API=

    The new Introspect module provides several layers of access:

    Low-level (for tool authors):

    • Desc: The representation of structural descriptors.
    • Index: The mapping from object headers to descriptors.
    • Dyn: A dynamic view of OCaml objects guided by descriptors= , allowing for programmatic traversal (ideal for custom debug tools).

    High-level (for general use):

    • Print: A Format-based polymorphic printing AP= I.
    • P: A convenience module for "quick and dirty" generic prin= ting.

=F0=9F=94=8D Integration with existing printers

Previously, printing an opaque type in the toplevel or the debugger would s= imply result in <abstr>. Now, these tools use type-direc= ted printing by default but seamlessly switch to tag-based printing when en= countering opaque constructions.

# let h =3D Hashtbl.create 3;;
val h : ('_weak3, '_weak4) Hashtbl.t =3D
  <abstr>
    {size =3D 0; data =3D (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     seed =3D 0; initial_size =3D 16}

=E2=9A=A0=EF=B8=8F Limitations & Current Status (= Alpha)

As this is an alpha release, there are several known limitations. Some are = temporary, while others are inherent to the design:

  • Architecture & Compiler:
    • Does not support 32-bit architectures. (Tested on x86_64 and arm64).
    • Not compatible with Flambda.
    • js_of_ocaml is currently unsupported (though a fix is stra= ightforward).
  • Metadata Constraints:
    • Constants: Due to limited space for metadata, some constants can= not be printed (e.g., print_any None may print 0,= but println [None] will likely succeed because the list wrapp= er provides metadata).
    • Poly-variants: These are approximated (e.g., print_any `A<= /code> may print 65 or `A).
    • FFI: Values originating from the FFI are not tagged and will be = printed as raw tuples/values unless wrapped in a tagged structure. (Note: F= FI compatibility is entirely preserved).
  • Marshalling: Tags are not preserved during marshalling by default. T= o preserve them, you must opt-in using the Reserved_bits flag:

    let roundtrip flags x<=
    /span> =3D Marshal.from_string (Marshal.<=
    /span>to_string x flags) 0;;
    println [roundtrip [Reserved_bits] (=
    ref 1)];; (* Outp=
    ut: {contents =3D 1} *)
    
  • Object Size: By reserving 22 bits for metadata, the maximum leng= th for arrays is \~4 billion elements and for strings is 32GB.

Acknowledgements: This work is funded by the Ahrefs Grant Program for OCaml.

Kudos to =C3=87a=C4=9Fda=C5=9F Bozman et al. for the original work on ocp-memprof, which provided the idea and infrastructure for repurpo= sing header bits, and many thanks to the maintainers who have preserved thi= s capability.

=F0=9F=A4=96 Note: No robots were harmed during the design and imple= mentation of this feature, though their help was solicited for testing and = proof-reading.

Learnings from benchmarking OxCaml-flavoured SWAR memchr

Keith discussed

Editor=E2=80=99s note: there were many long replies to this post, please= follow the link above for the full discussion.

Hi everyone, just wanted to share a benchmarking project that I had created= over the past few days for testing out OxCaml:

https://github.com/KiChja= ng/ml-memchr

I come from 10+ years of Rust, started hacking on it when it still had the = Ruby-inspired closure syntax where parameters denoted by the two pipes are = written inside of the block instead of outside of it (i.e. {|arg| sta= tements;} instead of |arg| { statements; }). Certainly = not the earliest batch, but early enough to know that before Rust was self-= hosted, the compiler was written in OCaml, which is why I'm really interest= ed in seeing how OCaml is "learning from its child". I had a brief stint in= writing OCaml at a startup, but that was too short of a time to consider m= yself familiar with it.

The README.md of the repo does a fairly good job in explaining the intricat= e details, and admittedly AI was used to write it, but what AI cannot tell = you is the experience of writing it. Yes, I used AI, but no, I did not let = it write everything, because one of the aims of this exercise is to help me= learn both OCaml and OxCaml.

Let's go through the good, the bad and the ugly parts of coding in OxCaml. = Bear in mind that some of these points are due to me being an OCaml noob an= d am still learning things about the language.

The Good

The conciseness and the compile-times. I'm absolutely floored by jus= t how elegant idiomatic OCaml source code looks. Everything just works with= out much ceremony: no braces nor brackets, no random fn keywor= ds, and most importantly no cruft that gets in the way – you just let there =3D light, and there was light. Not only that, the compile-verify-rewrite loop is quite fast, precisely = because compile times are amazingly fast, so fast that even utop exists as a REPL, allowing me to test ideas out before committing to the= m. These aren't things that a Rustacean is used to: normally what happens i= s that whenever I encounter a new crate, I rely on docs.rs for documentatio= n about the features coming from the crate, or spend time creating a new un= it test and compiling it to see how it works. I can really now see why OCam= l developers would want to continue writing OCaml despite it not being one = of the most popular languages out there.

Dune. This sort of ties back into the previous point on conciseness:= build configuration is really just tuples/s-expressions. While I can still= pretty much achieve the same effects in Rust with Cargo.toml,= everything being s-expressions in dune means that there really isn't much = overhead. I now come to think of this style as minimally yet sufficientl= y concise, e.g. the brackets in an s-expression is the minimal structur= e around data, and semantics simply just fall out from what you put between= the brackets. Integration with C is pretty seamless as well, along with Ru= st, though the latter still requires teaching dune to use cargo, which does= n't really strike me as surprising as C is much more well-established as th= e lingua franca in systems programming.

[@@zero_alloc]. This is what OxCaml brings to the table= and it delivers right away – mark your val~s with it in your i= nterface definitions, and it'll immediately try and catch any possible allo= cations that you make within your function. I'm used to zero-cost abstracti= ons so being made aware that some language features aren't free in terms of= allocations was quite new to me (I'm looking at you, ~option). It m= akes sense upon closer inspection, but the initial surprise is still there = – I guess I'm just really not used to thinking that nice language fea= tures have non-trivial costs associated with them. Anyway, the annotation c= ertainly took a page from Rust, where the check happens all at compilati= on time, so code that compiles with that annotation is guaranteed not t= o allocate anything by the compiler. I love my parents.

Mutable local variables. I know enough OCaml to know that the standa= rd way is to use 'a ref, but seeing how mutable j= ust works exactly the way I thought without much fanfare was quite nice. It= also doesn't require using the ! prefix when "dereferencing" = the variable to read its value; the only downside is that it still does req= uire <- for assignment. That's inevitable, since =3D<= /code> has been overloaded with too much meaning; in fact, the odd one out = here is logical equality, since let-bindings and record fields are arguably= both in the same category of assignment operators.

Unboxed tuples and records. They just work as expected, even in patt= erns. You really just need to prefix everything with #, and it= 'll work, e.g. the common pattern that I often use in Rust when I need to r= eturn or bind two or more values at the same time is to use tuples, and in = OxCaml it's pretty much the same:

let #(a, b) =3D if cond then #(#8L, foo) else #(#3L, bar)

Automatic byte alignment. OCaml strings and byte arrays are automati= cally aligned to a whole number of words, so I never need to worry about mi= salignment when reading the final partial word, nor requiring a prologue to= first advance bytes so that it lands on a word boundary.

The Bad

Functionality incompleteness. This may just be a result of OxCaml st= ill being a fairly new language extension, but some basic operations just a= ren't there when I reach out for them during development – logical in= fix operators, bit shifting, and even comparison infix operators. Some of t= hem are not even in stdlib at all, but rather part of the compiler intrinsi= cs – I had to dig Bytes.unsafe_get_in64_ne_indexed_by_int64 out from the compiler source code in order to know that such functional= ities even existed, and an unsafe load for unsigned int8 curre= ntly doesn't exist even as an intrinsic anywhere. On the other hand, I get = why the polymorphic infix operators don't work – 'a has = the value layout, and int64# has bits64, and structural comparison between the two just wouldn't work. It would= be so great if the polymorphic operators also ignores the layout that the = arguments have as long as they match.

Performance impacts on certain functions. Specifically, the ones tha= t mix-and-match parameters with their boxed and unboxed counterparts. This = may not actually affect anything, but I've been lied to by Claude so many t= imes that I have to put this up, because intuitively speaking, unboxing and= especially boxing has a non-negligible cost associated with them, and e.g.= Int64_u.shift_{left,right} requires me to use an unboxed 2nd = argument to indicate how many bits I want to shift by. I've been told that = boxing for comparison using Int64_u.compare doesn't allocate a= nything despite having to compare the resulting boxed integer, and Claude s= ays the disassembly from memchr.a proves it:

Int64_u.(compare ((to_int i) + 8) n < 0)
=2D--
22a:  lea    0x11(%rbx,%rbx,1),%r12   ; 2i + 17, i.e. tagged(i + 8)
22f:  cmp    %rdi,%r12                ; vs tagged n
232:  jg     280

I really can't know for sure whether this is every instruction emitted by t= he expression since i originally was an unboxed integer, and C= laude may be missing the context where i is being retagged/reb= oxed again just to make this comparison.

The unboxed variant looks like the following:

Int64_u.(compare (i + #32L) (of_int n) < 0)
=2D--
101:  lea    0x20(%rbx),%r12      ; i + 32
109:  cmp    %rsi,%r12            ; vs n, pre-untagged at 0xd7
10c:  jg     224

Taken at face value, both generate the same number of instructions and all = but the parameters are identical, so if there's anything that's different, = it has to be the hidden costs of the parameters being passed to these instr= uctions. This bit matters, because it's in the hot loop execution path, and= every instruction or nanosecond we save here can scale up to micro or even= milliseconds saved.

Ergonomics. This cuts both ways, I really like the localized imports= that I showcased above with Int64_u.(expression) instead of t= agging each function repeatedly, but doing it over and over again gets repe= titive. I could indeed use a local import by doing let open Int64_u i= n, however there are times where this doesn't work as expected, espe= cially when I have to deal with boxed integers of varying sizes as well, li= ke the aforementioned int. I don't think this is a problem tha= t can be solved generally unless we solve the problem of polymorphic layout= s, so I'd still list this as a pain point.

The ugly

No continues/breaks/early returns. This is starting to get really ug= ly – while I understand the argument from functional programmers that= imperative code can usually be rewritten in a purer functional style witho= ut mutation, we're now in systems programming land, and every instruction e= mitted counts, and not being able to directly jump to where I want using co= ntinues, breaks or returns is a huge hole in my repertoire. Take for exampl= e, the code that I had to use to force an early exit in the loop:

 while Int64_u.(i + #8L <=3D n64) do
  let r =3D swar_raw (Bytes.unsafe_get_int64_ne_indexed_by_int64 s i) in
  if not Int64_u.(r land mask =3D #0L) then (
    hit <- i;
    i <- n64)
  else i <- Int64_u.(i + #8L)
done

See what I did here? I essentially have to assign n64 to i so that the loop condition fails just to "break" from the loop. A= nd we're not done here either, because i denotes the offset at= which to start reading bytes, so a later loop needs it to be preserved:

if Int=
64_u.(hit >=3D #0L) then i <- hit;

I got lucky here because I am able to recover i quite easily a= s I've assigned it to hit, but one can easily imagine that you= can't be as lucky with other loops. You may have to keep spare variables a= round just to store the state of the loop when you break it, just to preser= ve it and use it on subsequent code paths. Granted, this may not be as much= of a problem as I make it to be, since it's not on the hot execution path = but rather done at most once every loop, but continue is certa= inly not the case. I guess in a proper TCO'd recursive function, calling th= e function again with new parameters would be equivalent to a continue, but= I haven't tested it out enough yet to really conclude that TCO is as fast = as an imperative loop.

Attributes can be trivially defeated. Not an OxCaml problem per se, = but I accidentally defeated the usage of [@inline always] in t= he idiomatic ML flavour of memchr because the function I'm annotating captu= res a variable from the environment:

let[@inline always] swar_raw w =3D
  let w =3D Int64_u.(w lxor cs)=
 in
  Int64_u.((w - o=
nes) land lognot w)
in

Both cs and ones aren't passed in as parameters, = so now swar_raw becomes a real function that gets allocated on the stack, which means both [@@zero_alloc] and the ben= chmark's mWd/Run didn't catch it, as they measure heap allo= cations. Unfortunately, even stack allocations still cost performance, = because calling functions are not free and requires setting up the call fra= me, loading the environment variables from memory, saving the context in th= e callee, and cleaning up before returning to the callee, none of which are= trivial costs that can easily be eliminated.

Admittedly, this was my personal skill issue for not being well-versed enou= gh in OCaml, I just have a feeling that the compiler should have at least w= arned me that it isn't inlining the function as I told it to due to capture= d variables. Fixing this bug immediately brought the ML functional style me= mchr implementation down to the same speed as the imperative ML style memch= r, and maybe even 1-2% faster based on benchmarks.

Closing thoughts

Let's put into perspective about the numbers: OCaml's Byte.index is about 10x slower than the Rust/C equivalent, whereas OxCaml managed t= o get it down to about only 1.3x slower. This magnitude of difference is a = huge win! With OxCaml as a language extension that may have its features up= streamed, OCaml can now have its system's slice of the cake and eat it too = by being in the same order of magnitude as C/Rust. I'd say that OxCaml has = completely justified its raison d'=C3=AAtre, especially on the part where o= ne can write idiomatic-ish OCaml syntax sprinkled with unboxed integers and= still get performance close to bare metal.

I think it's also good to address the friction points while developing in O= xCaml – while writing this post, I've also tried to write a largely s= afe, idiomatic Rust version of memchr, and that alone is already about 10% = faster than the OxCaml equivalent. What I wanted to bring up here isn't my = varying skill levels in these two languages (although it may have indeed pl= ayed a factor), but rather how the programming language's philosophy gui= des the way you think. If you've heard of linguistic relatively or the = older Sapir-Whorf hypothesis in linguistics, this is exactly that, applied = to programming languages – Rust is fundamentally about building safe,= robust and efficient software, so the language features such as zero-cost = abstractions, horrendously long compile times, bloated compiler error messa= ges is designed exactly for you to write code that's going to be safe and f= ast by default.

OCaml is not that, and it doesn't have to pretend to be something it isn't = either, because it also has advantages over Rust that is hard to replicate = there – fast compile times, layouts that are so uniform to the point = where you really don't think about them, tail-call optimizations that bring= s loops/recursions close to bare-metal speed, and a richer type system that= supports GADTs and monads, and let's not forget – without OCaml, the= re wouldn't be Rust. There's clearly still a lot that OCaml can offer to th= e world, and we (basically just me) still haven't seen all it has to offer = yet.

The pain points that I've listed are mostly because OxCaml is ostensibly wr= itten for systems programmers to write efficient code, and the syntax/tooli= ng right now simply doesn't exactly support those goals just yet. Making it= run faster is great; allowing anyone to easily write programs that are by = default running efficiently is awesome.

What's next

OxCaml has SIMD support via oxcaml_simd, so that's the natural= next step to test and see how it fares when compared with the optimized C = and Rust versions, the latter provided by BurntSushi's memchr crate (yes, it's his real u= sername). After that, I'm looking to see if I can port some small and self-= contained Rust crates over to OxCaml and continue experimenting on the perf= ormance characteristics. Bear in mind that memchr is a constra= ined example operating with only the input arguments; it'll be interesting = to see how it works with systems that require storage and memory over time.

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

Continuing this thread, Tim McGilchrist announced

Thank you for the correct @kit-ty-kate I'll post the notice a bit earlier f= or next month. The notes are available on https:= //hackmd.io/Cwj7lWjuRlKEr8H8F6wpRw?view#Agenda-Items-for-meeting-on-August-= 3rd-2026

The next edition will be Monday October 5th at the same time.

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/BsSVW56ZmGBA0KO07S5ccFAmpxmFgbFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmcACgkQBA0KO07S5cfwqwf/TvnWvVxUChpYlbtCfwVX1DSyKxz/FkXHP0Wj9d06 g/uHVLwL1KkKaT0Fcr5+vG/EXKf903i28INIj4/Z/LGU0uUPBfDncPnRMUnHGDgz UqJidrTEcbptngoaoxIuKdzNsJEaVN2N0wKEvAKQctcLxMwng4soe0rdMQZxkzjJ 0oBmdBfKawpV8f0600M5fs5W5mzKd3v9HkIiYAEYvSzAFJ8nrEeJxzjJofr90nTj AOViMqDhSZDL5/Dn1F1LI9W+znITh/7xVuyNvng1/8v/CvkmNiy2a6beMe50ZTc3 McIIdCJ2xC/MrKbMgkgbJ+065yrtATMnMaleU1yNyUR4XA== =Iu/n -----END PGP SIGNATURE----- --===-=-=--