From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by c5ff346549e7 (Postfix) with ESMTPS id 83C285D4 for ; Tue, 12 May 2020 07:46:17 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.73,383,1583190000"; d="scan'208,217";a="449250038" Received: from sympa.inria.fr ([193.51.193.213]) by mail2-relais-roc.national.inria.fr with ESMTP; 12 May 2020 09:45:45 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 6DCFC7F491; Tue, 12 May 2020 09:45:45 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 004A87EEE8 for ; Tue, 12 May 2020 09:45:39 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org IronPort-PHdr: =?us-ascii?q?9a23=3ASTpFXhcT/gwfUmUOxNu2dqiulGMj4u6mDksu8pMi?= =?us-ascii?q?zoh2WeGdxc25ZxyN2/xhgRfzUJnB7Loc0qyK6v2mCDVLuMzY+Fk5M7V0Hycfjs?= =?us-ascii?q?sXmwFySOWkMmbcaMDQUiohAc5ZX0Vk9XzoeWJcGcL5ekGA6ibqtW1aFRrwLxd6?= =?us-ascii?q?KfroEYDOkcu3y/qy+5rOaAlUmTaxe7x/IAi2oAnLssQanIRuJrsvxhfUv3BFZ/?= =?us-ascii?q?lYyWR0KFyJgh3y/N2w/Jlt8yRRv/Iu6ctNWrjkcqo7ULJVEi0oP3g668P3uxbD?= =?us-ascii?q?SxCP5mYHXWUNjhVIGQnF4wrkUZr3ryD3q/By2CiePc3xULA0RTGv5LplRRP0lC?= =?us-ascii?q?sKMSMy/2bKhMxtl6JbuAyuqABjw4DaZ4GVMeBxfqLbfdgHQWZMUcJcWylHD4+8?= =?us-ascii?q?bIUPCfQBPedDr4n8vFQOqQWxDhSiBePo0D9Hm2T21rA+3+kvDQ3K2QotFM8Mvn?= =?us-ascii?q?vJttX4LKccX/6owqfGzjvMYO9Z1Czn54TUaB0su+2AUa5yfMfX1EIhFxnFjlKV?= =?us-ascii?q?qYH9Iz6V0v4Cs26G5OR9Se2vi2snqwBtojiz28whjZPGhoYPxVDC7yl525o6Jd?= =?us-ascii?q?29SE56fd6kDIBdtzmdN4tyQsIiX39ntzo6yr0AuJ67ZTUKx4o9yx7YcfyHfJGF?= =?us-ascii?q?7xT+X+mePTl2nmhqeK6jhxms60igzPXxW8m73VpWrCdIjMXBu24T2hDP6MWKRe?= =?us-ascii?q?Zx8luh1zuT1w3e6P1JLE43mKfaJJAswaA8mJUSvEndAyL6hEX4gq+Ye0gi5+Om?= =?us-ascii?q?5ePnYrD8qZ+dMY95khn+Pboymsy+HeQ3LBAOX2+e+eS5yrLv50v5T6tWjvEula?= =?us-ascii?q?nWrIrVJcEfpqKjBA9VyIkj5w6wDzenzNQYnWQHI0lfdB2biIjpPknCIP/5Dfej?= =?us-ascii?q?h1Sjiixky+raMb3mB5XBNmXDn6vhfbZ890FT0gUzzddF651KF74BPer/Wk73tN?= =?us-ascii?q?zCDx82KRa4w+j9CNll2YMeWH6PAq+EMKzJq1OE/P4gI+6JZIMNpjb9KuMl5+P0?= =?us-ascii?q?gn89gl8dYbSp0oYWaHC/BPhpP0KZYX/0jtcOEGcKogo+TPHxh1GYUD5TYG6+X6?= =?us-ascii?q?Mh6TA7DIKmCZ3PRoe3gLyO2iqwA55YZnheB1yRD3vlc5+IV+oQZC+dOMNsnCAI?= =?us-ascii?q?WaKvRoIuzR2jtgz3x6B5Iufb5CEUr4/v2ddv6+HOmhw+6Tp5BNmH3W6XVWF7hG?= =?us-ascii?q?YISic23K9hpUx9zU+O0a13gvBFD9BT//RJUgM6NJ7A0eN1F9DyWgTAfteQVVap?= =?us-ascii?q?XM+qATYrTtI+29MOYkB9FMu+jh3bwiamHbsYm6aWCJAo/a/QxXb8K9pnx3vI26?= =?us-ascii?q?Qtl1wmTdFONW2iiK5/7Q/TB4vRnkuEi6ikaLgQ0TbR9GmB0WaOpllVXQ9uXajd?= =?us-ascii?q?RXAfYU/WrNTl5kzcU7CuCbInMgpYyc6fNKRGcNrpjU9JRPr7ItveZ3i+m2GqCR?= =?us-ascii?q?aT2ryMbI/qe2QB3CXBE0ULiAcT/WuANQciGCihuHjSDDlhGFPgeU/s9vN+qHyj?= =?us-ascii?q?Qk8u0w6Kd1Fh16ay+hMNmfOTUfYT3rYdtCclqjV0B0q90snNC9uAogphZL9Tbc?= =?us-ascii?q?k84FdBz2LZthZyMoauL6B41RYidFE9u1zonV0jDppGucw1qjUswRYkberS20xH?= =?us-ascii?q?PXvQiZvvPJXTK3Lu51auZ7/S3hfZytnAvu8E4fE87lHipx2BF0w48nwh3cMRm3?= =?us-ascii?q?Cb443iCAsJTYm3VVw99gRzo7/dcm8w+tD6z3ppZICwuzmK4NkpAeo51l70dtNW?= =?us-ascii?q?NuWfHw/3EtEGL9CpLP02llOpaBMdIe0U87Q7aZD1P8Ca0bKmab4z1Amtin5Ktd?= =?us-ascii?q?8sixPex29HUufNmq097bSd1wqDWS37iQ7+4MrwhIZPaCpUGzavjy/+C9wIP/Eg?= =?us-ascii?q?TcMwEW6rZvaP6JBmnZe0CixA81qyG14N2MmoYAefKVvn0l8JjBlFkTmcgSK9ig?= =?us-ascii?q?dMvXQpo66YhnecxvS7MgIAPn9XSWJii1b1PIXyiMoVDhGl?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0D8BgCuU7pehyIeaIFmg3WBFgFdVTIsg?= =?us-ascii?q?2RAgV2HJIV5hR+FMpJJA1APAQMBDBgBBQ4BAgQBAYMOgTYCF4F4HQYBBTMTAhA?= =?us-ascii?q?BAQUBAQECAQIDBAETAQEBCgsJCCmFMQgkDII7DAwDA4MgAQoOCQQGOwQBCRwjA?= =?us-ascii?q?wwIAQYDAgQNARcBFAoXARIUBoMMAYJ8BAEKkzSbeX8zhDoBAwMCCwMBDgkmhBG?= =?us-ascii?q?BQA0CE4EWhSyDHYN7D4FMP4ERgmJsgk4OCwEBAQEBGYEGIQEBCE4ZgkWCYASOI?= =?us-ascii?q?y0kaYgziDyCD5AQB4JNfwSGI3WFf4QFhiaCXIEOh1mRdyGPfIcudYE3hVWOI4E?= =?us-ascii?q?/KoFHHgwHMxowIiGCNQEBATEJXw1WjGGCXwEFMBeDT2pUgSaBdTuFRD8zAgEBA?= =?us-ascii?q?TICBgEHAQEDCXUBAQUTCwGLSYIfAQE?= X-IPAS-Result: =?us-ascii?q?A0D8BgCuU7pehyIeaIFmg3WBFgFdVTIsg2RAgV2HJIV5hR+?= =?us-ascii?q?FMpJJA1APAQMBDBgBBQ4BAgQBAYMOgTYCF4F4HQYBBTMTAhABAQUBAQECAQIDB?= =?us-ascii?q?AETAQEBCgsJCCmFMQgkDII7DAwDA4MgAQoOCQQGOwQBCRwjAwwIAQYDAgQNARc?= =?us-ascii?q?BFAoXARIUBoMMAYJ8BAEKkzSbeX8zhDoBAwMCCwMBDgkmhBGBQA0CE4EWhSyDH?= =?us-ascii?q?YN7D4FMP4ERgmJsgk4OCwEBAQEBGYEGIQEBCE4ZgkWCYASOIy0kaYgziDyCD5A?= =?us-ascii?q?QB4JNfwSGI3WFf4QFhiaCXIEOh1mRdyGPfIcudYE3hVWOI4E/KoFHHgwHMxowI?= =?us-ascii?q?iGCNQEBATEJXw1WjGGCXwEFMBeDT2pUgSaBdTuFRD8zAgEBATICBgEHAQEDCXU?= =?us-ascii?q?BAQUTCwGLSYIfAQE?= X-IronPort-AV: E=Sophos;i="5.73,383,1583190000"; d="scan'208,217";a="348368842" X-MGA-submission: =?us-ascii?q?MDHWoUukpS6tm23xTMiglys3FUaZWfIs8B/1Kk?= =?us-ascii?q?FbWrRJAJVfb9ASU2fAuTpfwO0V45Z7uAKhTQ2yhAzvlSSZhKrVNA03VF?= =?us-ascii?q?B6eDfstrajIYUfoHEitbfIAUefmLlwFMowNWsKIs7NNVLjANSyFV3hEi?= =?us-ascii?q?opQ4qmcMWGtgIe+oNKxdsIpg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 May 2020 09:45:29 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (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 17B3F565712; Tue, 12 May 2020 09:45:27 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 12 May 2020 09:45:26 +0200 Message-ID: <87h7wl38bt.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 12 09:45:27 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.072187, queueID=820F45657A7 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: 18137 Errors-to: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWF5IDA1IHRvIDEyLA0KMjAyMC4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpMb29raW5nIGZv ciAibG92ZWx5LCBpZGlvbWF0aWMiIGV4YW1wbGVzIG9mIE9jYW1sIHVzZWQgZm9yIHNoZWxsLXNj cmlwdGluZyBpbiB0aGUgbWFubmVyIG9mIFBlcmwvUHl0aG9uIChidXQgZXNwLiBQZXJsKQ0KQXJl IHRoZXJlIGxlYXJuaW5nIG1hdGVyaWFscyBmb3IgT0NhbWwgZm9yIHRob3NlIHdpdGggbm8gcHJv Z3JhbW1pbmcgZXhwZXJpZW5jZT8NCkR1bmUgbWVldGluZyBub3Rlcw0KT0NhbWwgNC4xMS4wLCBm aXJzdCBhbHBoYSByZWxlYXNlDQpPQ2FtbCBVc2VycyBhbmQgRGV2ZWxvcGVycyBNZWV0aW5nIDIw MjANClZTQ29kZSBQbGF0Zm9ybSBQbHVnaW4gMC41LjANCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBD V04NCg0KDQpMb29raW5nIGZvciAibG92ZWx5LCBpZGlvbWF0aWMiIGV4YW1wbGVzIG9mIE9jYW1s IHVzZWQgZm9yIHNoZWxsLXNjcmlwdGluZyBpbiB0aGUgbWFubmVyIG9mIFBlcmwvUHl0aG9uIChi dXQgZXNwLiBQZXJsKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgW2h0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9sb29raW5nLWZvci1sb3ZlbHktaWRpb21hdGljLWV4YW1wbGVz LW9mLW9jYW1sLXVzZWQtZm9yLXNoZWxsLXNjcmlwdGluZy1pbi10aGUtbWFubmVyLW9mLXBlcmwt cHl0aG9uLWJ1dC1lc3AtcGVybC81NzAzLzEzXQ0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQs IENoZXQgTXVydGh5IHNhaWQgYW5kIEFhcm9uIEwuIFplbmcgcmVwbGllZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgICAgICAg4oCiIG5lZWRzIHRvIGJlIE9jYW1sIGNvZGUsIG5v dCBhbiBpbnRlcnByZXRlci4gSSBtZWFuLCBpZg0KICAgICAgICAgIEnigJltIG5vdCBnb2luZyB0 byB3cml0ZSBpdCBpbiBPY2FtbCwgSSBtaWdodCBhcyB3ZWxsDQogICAgICAgICAgd3JpdGUgaW4g UGVybCwgeWVzPw0KDQogIEkgdGhpbmsgc2hleHAgbWlnaHQgZGVzZXJ2ZSBhbm90aGVyIGxvb2su ICBJdCdzIG5vdCBhbiBpbnRlcnByZXRlciBmb3INCiAgYSBzZXhwLWJhc2VkIHNoZWxsIGxhbmd1 YWdlLCBhcyBpdHMgbmFtZSBtaWdodCB1bmZvcnR1bmF0ZWx5DQogIGRlY2VpdmluZ2x5IHN1Z2dl c3QuICBJdCdzIHJlYWxseSBhIERTTCBmb3IgY29uc3RydWN0aW5nIHNoZWxsDQogIHBpcGVsaW5l cyB1c2luZyBhIGAnYSBQcm9jZXNzLnQnIG1vbmFkLiAgVGhlIHMtZXhwcmVzc2lvbiBwYXJ0IGlz DQogIGFkdmVydGlzaW5nIHRoYXQgeW91IGNhbiBkZWJ1ZyBhbmQgdHJhY2UgdGhlIGFjdGlvbnMg cGVyZm9ybWVkIHVzaW5nDQogIHMtZXhwcmVzc2lvbnMuDQoNCiAgICAgICAgVGhlIHNlY29uZC1t b3N0LWltcG9ydGFudCBwYXJ0IG9mIFBlcmwvQmFzaCBzY3JpcHRpbmcgaXMNCiAgICAgICAgc3Ry aW5nLWhhbmRsaW5nLiBBbmQgaXTigJlzIGNlcnRhaW5seSB0aGUgcGFydCBvZiBPY2FtbA0KICAg ICAgICB0aGF04oCZcyBtb3N0IHBhaW5mdWwgd2hlbiB3cml0aW5nIHNjcmlwdHMuIExldOKAmXMg c3RpcHVsYXRlDQogICAgICAgIHRoYXQgdGhlcmUgYXJlIG5pY2UgbGlicmFyaWVzIHRvIG1ha2Ug dGhpcyBlYXN5LiBJ4oCZbSBhbg0KICAgICAgICBPY2FtbCBiaWdvdCwgSSBoYXZlIHRvIGJlbGll dmUgdGhpcyBhbnl3YXkgKmdyaW4qIC4gVGhpcw0KICAgICAgICBsaWJyYXJ5IGRvZXNu4oCZdCBz ZWVtIHRvIHVzZSAnZW0sIG5vciBjaG9vc2UvcHJvbW90ZSBhDQogICAgICAgIHBhcnRpY3VsYXIg c2V0IG9mIHN1Y2ggbGlicmFyaWVzLg0KDQogIEkndmUgZm91bmQgW0Jhc2VdIHBsdXMgW1JlXSB0 byBiZSBzdWZmaWNpZW50IGZvciBtb3N0IG9mIG15DQogIHN0cmluZy1tYW5pcHVsYXRpb24gbmVl ZHMuICBJdCdzIG5ldmVyIGdvaW5nIHRvIGJlIGFzIGNvbmNpc2UgYXMNCiAgUGVybCdzIGJ1aWx0 LWluICJtYWdpYyIgc3VwcG9ydCBmb3IgcmVnZXhwcywgYnV0IHlvdSBnYWluIGV4cGxpY2l0bmVz cw0KICBhbmQgY2xhcml0eSwgd2hpY2ggaXMgcGFydCBvZiB0aGUgYmVuZWZpdCBvZiBPQ2FtbCBh bnl3YXkuDQoNCg0KW0Jhc2VdIGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L2Jhc2UvDQoN CltSZV0gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLXJlDQoNCg0KQ2hldCBNdXJ0aHkg c2FpZCBhbmQgRG9ubiBDYXZlIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICAgICAgIEl04oCZcyBub3QgYXMgdHJp dmlhbCBpbiBPY2FtbCwgZm9yIG1hbnkgY29tcGxpY2F0ZWQgcmVhc29ucw0KICAgICAgICB0aGF0 IGJvaWwgZG93biB0byDigJxnZWUsIHN0cmluZy1oYW5kbGluZyBpcyBhIFBJVEHigJ0uDQoNCiAg UmVhbGx5PyAgaGFkbid0IG5vdGljZWQuICBIYSBoYS4NCg0KICBJIGNvdWxkIG5ldmVyIHJlYWxs eSBnZXQgdXJnZSBmb3IgUGVybCwgYnV0IEkgdXNlIGl0cyBhbmNlc3RvciBhd2sgYQ0KICBsb3Qs IGFuZCBJJ20gdHJ5aW5nIG91dCBzb21lIGF3ay1saWtlIHNpbXBsZSBzdHJpbmcgZnVuY3Rpb25z LCBsaWtlDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgc3RybGVuID0gU3RyaW5nLmxl bmd0aA0KICDilIIgbGV0IHN1YiBzIGkgbiA9IGxldCBiID0gc3RybGVuIHMNCiAg4pSCICAgICAg aW4gaWYgaSA8IGINCiAg4pSCIAkgdGhlbiBsZXQgbiA9IG1pbiBuIChiIC0gaSkNCiAg4pSCIAkg aW4gU3RyaW5nLnN1YiBzIGkgbg0KICDilIIgICAgIGVsc2UgIiINCiAg4pSCICgqIHN1YnN0cmlu ZyB0byBlbmQgb2YgbGluZSAqKQ0KICDilIIgbGV0IHN1YnN0ciBhIGkgPSBpZiBpIDwgc3RybGVu IGENCiAg4pSCICAgICAgdGhlbiBTdHJpbmcuc3ViIGEgaSAoKHN0cmxlbiBhKSAtIGkpDQogIOKU giAgICAgIGVsc2UgIiINCiAg4pSCIGxldCBtYXRjaHJlIHQgcyA9IHRyeQ0KICDilIIgICAgICBT dHIuc2VhcmNoX2ZvcndhcmQgdCBzIDANCiAg4pSCICAgICAgd2l0aCB8IE5vdF9mb3VuZCAtPiAt MQ0KICDilJTilIDilIDilIDilIANCg0KICBldGMuDQoNCiAgU28gIm9wZW4gQXdrIiBnZXRzIG1l IGEgaGFuZGZ1bCBvZiBtb3JlIGJhc2ljIHZhcmlhdGlvbnMgb24gY29tbW9uDQogIHN0cmluZyBm dW5jdGlvbnMsIHdpdGggbGVzcyBlbGFib3JhdGUgcGFyYW1ldGVycywgbm8gbm9ybWFsDQogIGV4 Y2VwdGlvbnMsIGV0Yy4gIEluY2x1ZGluZyBhIGxpbmUgYnkgbGluZSBmaWxlIHByb2Nlc3Npbmcg ZnVuY3Rpb24uDQogIEkgaGF2ZSBqdXN0IG5ld2x5IHN0YXJ0ZWQgb24gdGhpcyBhbmQgaGF2ZW4n dCB1c2VkIGl0IGV4dGVuc2l2ZWx5LCBidXQNCiAgaXQgc2VlbXMgZmFpcmx5IHByb21pc2luZy4g IE5vIHdhY2t5IHN5bnRheCBvciBoeXBlciBpbnRlbGxpZ2VudA0KICBzdHJpbmcgcHJvY2Vzc2lu Zywgbm8gcGFja2FnZXMsIGp1c3QgYSBmZXcgZG96ZW4gbGluZXMgb2YgY2hlYXRlcg0KICBmdW5j dGlvbnMuDQoNCiAgIkF3ayIgaXMgYSBtaXNub21lciwgaW4gdGhhdCB0aGVyZSdzIGxpdHRsZSBj b3JyZXNwb25kZW5jZSBiZXR3ZWVuDQogIHRoaXMgYW5kIGF3aywgaXQgd2FzIGp1c3Qgd2hhdCBp bnNwaXJlZCBtZSB0byB0cnkgaXQuDQoNCg0KUmFwaGHDq2wgUHJvdXN0IHNhaWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkg ZG9uJ3QgdGhpbmsgaXQncyBsb3ZlbHkgYW5kIEkgaGF2ZSBubyBpZGVhIGlmIGl0IGlzIGlkaW9t YXRpYywgYnV0IEkNCiAgbWFkZSBhIGZldyBzY3JpcHRzIG9mIG15IG93biBpbiBPQ2FtbCB1c2lu ZyB0aGUgc2FtZSBsaWJyYXJ5IHRoYXQNCiAgb3RoZXIgbWVudGlvbmVkOiBgYm9zJw0KDQogIOKA oiBbdHlwZXBhc3NdIHVzZXMgYHhkb3Rvb2wnIHRvIHR5cGUgcGFzc3dvcmRzIGZyb20gdGhlIGBw YXNzd29yZCcNCiAgICBwYXNzd29yZCBtYW5hZ2VyDQogIOKAoiBbY29ubl0gd3JhcHMgYHdwYV9z dXBwbGljYW50JywgYGRoY3BjZCcsIGBpcCcsIGFuZCBvdGhlciBuZXR3b3JrDQogICAgbWFuYWdl bWVudCBDTEkNCiAg4oCiIFtsYXB0b3Atc3RhdHVzXSBmZXRjaGVzIHN0YXR1cyBpbmZvcm1hdGlv biBmb3IgbGFwdG9wcyAoZS5nLiwNCiAgICBiYXR0ZXJ5IGxldmVsKSBhbmQgcHJpbnRzIGl0IGlu IGEgbmljZWx5IGZvcm1hdHRlZCBmb3JtDQogIOKAoiBbYmFrZWxpdGVdIGluY3JlYXNlcyBvciBk ZWNyZWFzZXMgc2NyZWVuIGJyaWdodG5lc3MNCg0KDQpbdHlwZXBhc3NdIGh0dHBzOi8vZ2l0bGFi LmNvbS9yYXBoYWVsLXByb3VzdC90eXBlcGFzcw0KDQpbY29ubl0gaHR0cHM6Ly9naXRsYWIuY29t L3JhcGhhZWwtcHJvdXN0L2Nvbm4NCg0KW2xhcHRvcC1zdGF0dXNdIGh0dHBzOi8vZ2l0bGFiLmNv bS9yYXBoYWVsLXByb3VzdC9sYXB0b3Atc3RhdHVzDQoNCltiYWtlbGl0ZV0gaHR0cHM6Ly9naXRs YWIuY29tL3JhcGhhZWwtcHJvdXN0L2Jha2VsaXRlDQoNCg0KVmFzaWxlIFJvdGFydSBhbHNvIHNh aWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIFtodHRwczovL2dpdGh1Yi5jb20vaGFtbWVybGFiL2dlbnNw aW9dDQoNCg0KR2FicmllbCBSYWRhbm5lIGFsc28gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgSSBoYXZlIG5vIHBhcnRpY3VsYXIgb3BpbmlvbiBhYm91dCB0aGUgcmVzdCwgYnV0IGF0IGxl YXN0IG9uIHRoZSByZWdleA0KICBzaWRlLCB0aGlzIG1pZ2h0IGJlIG9mIGludGVyZXN0Og0KICBb aHR0cHM6Ly9naXRodWIuY29tL3BhdXJrZWRhbC9wcHhfcmVnZXhwXQ0KDQogIElmIHRoYXQncyBz dGlsbCBub3QgZ29vZCBlbm91Z2gsIEkgd291bGQgYmUgdmVyeSBpbnRlcmVzdGVkIGJ5DQogIHN1 Z2dlc3Rpb25zIG9uIGhvdyB0byBtYWtlIGl0IG1vcmUgY29udmVuaWVudC4gOikNCg0KDQpPQ2Ft bFVzZXIgcHJvcG9zZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEknbSBub3Qgc3VyZSBhYm91dCBpZGlvbWF0aWMsIGJ1dCBJIGRv IGhhdmUgYSB1dG9wIGNvbmZpZyB0aGF0IEkgdXNlDQogIHRvIGRvIHNvbWUgb25lLW9mZiBzY3Jp cHRpbmcgaW4gT0NhbWwgdGhhdCB1c2VzIGBzaGV4cCcNCg0KICDilIzilIDilIDilIDilIANCiAg 4pSCICN1c2UgInRvcGZpbmQiDQogIOKUgiAjd2FybmluZ3MgIithIg0KICDilIIgI3RocmVhZA0K ICDilIIgI3JlcXVpcmUgInBweF9qYW5lLGNvcmUiDQogIOKUgiAjcmVxdWlyZSAic2hleHAucHJv Y2VzcyINCiAg4pSCICNyZXF1aXJlICJsYW1iZGFzb3VwIg0KICDilIIgbW9kdWxlIExpc3QnID0g TGlzdA0KICDilIIgb3BlbiBTaGV4cF9wcm9jZXNzDQogIOKUgiBvcGVuIFNoZXhwX3Byb2Nlc3Mu SW5maXgNCiAg4pSCIG9wZW4gQ29yZQ0KICDilIIgDQogIOKUgiBtb2R1bGUgSHRtbCA9IHN0cnVj dA0KICDilIIgICAgIGluY2x1ZGUgU291cA0KICDilIIgDQogIOKUgiAgICAgbGV0IG9mX3N0cmlu ZyA9IHBhcnNlDQogIOKUgiBlbmQNCiAg4pSCIA0KICDilIIgbGV0IHJlYWRfbGluZXMgY21kID0N CiAg4pSCICAgICBldmFsIChjYWxsIGNtZCB8LSByZWFkX2FsbCkNCiAg4pSCIDs7DQogIOKUgiAN CiAg4pSCIGxldCB3Z2V0IHVybCA9DQogIOKUgiAgICAgcmVhZF9saW5lcyBbIndnZXQiOyAiLU8i OyAiLSI7IHVybF0NCiAg4pSCIDs7DQogIOKUgiANCiAg4pSCIGxldCBjaHJvbWVfY3VybCB1cmwg PQ0KICDilIIgICAgIHJlYWRfbGluZXMgWyJjdXJsIjsgIi1rIjsgIi1zQSI7ICJDaHJvbWUiOyAi LUwiOyB1cmw7ICItbyI7ICItIl0NCiAg4pSCIDs7DQogIOKUgiANCiAg4pSCIGxldCBzcGxpdF9s aW5lcyA9IFN0cmluZy5zcGxpdCB+b246J1xuJw0KICDilIIgbGV0IGZpbHRlcl9saW5lcyBzdWJz dHJpbmcgPSBMaXN0LmZpbHRlciB+ZjpTdHJpbmcuKGlzX3N1YnN0cmluZyB+c3Vic3RyaW5nKQ0K ICDilIIgbGV0IHRvX2h0bWwgPSBIdG1sLm9mX3N0cmluZw0KICDilIIgbGV0IGZpbmRfaHRtbCBw YXQgaHRtbCA9IEh0bWwuKGh0bWwgJCQgcGF0KQ0KICDilIIgDQogIOKUgiBsZXQgKCUpID0gRm4u Y29tcG9zZQ0KICDilJTilIDilIDilIDilIANCg0KICBUaGVuIGEgc2ltcGxlIHNjcmlwdCBjYWxs ZWQgYHNoZXhwJyBpbiBteSBwYXRoOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHV0b3AgLWlu aXQgfi9iaW4vb2NhbWwtc2hleHAtY29uZmlnDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEkgYWRk IGxpdHRsZSBoZWxwZXIgZnVuY3Rpb25zIGFzIEkgY29tZSB1cG9uIHRoZW0uIEkgZmluZCBpdCdz IG11Y2gNCiAgZWFzaWVyIHRvIHRyYW5zaXRpb24gdG8gYSBmaWxlLCBvciBmdWxsIHByb2dyYW0g d2hlbiBJIG5lZWQNCiAgaXQuIEV4YW1wbGUgcHJvZ3JhbToNCg0KICDilIzilIDilIDilIDilIAN CiAg4pSCIHV0b3AgIyByZWFkX2xpbmVzIFsic2Vuc29ycyJdIHw+IHNwbGl0X2xpbmVzIHw+IGZp bHRlcl9saW5lcyAiQ29yZSAwIjs7DQogIOKUgiAtIDogc3RyaW5nIGxpc3QgPQ0KICDilIIgWyJD b3JlIDA6ICAgICAgICArNjMuMMKwQyAgKGhpZ2ggPSArODQuMMKwQywgY3JpdCA9ICsxMDAuMMKw QykiXQ0KICDilJTilIDilIDilIDilIANCg0KDQpBbnRvbiBLb2Noa292IHNhaWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE5vdCBl eGFjdGx5IE9DYW1sLCBidXQgY2FuIGJlIG1hZGUgd2l0aCB0aGUgT0NhbWwgc3ludGF4IGFzIHdl bGwgLSBzZWUNCiAgW0JBVFNIXS4NCg0KDQpbQkFUU0hdIGh0dHBzOi8vZ2l0aHViLmNvbS9iYXRz aC1kZXYtdGVhbS9CYXRzaA0KDQoNCkJpa2FsIExlbSBhbHNvIHNhaWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkganVzdCBm b3VuZCB0aGlzIC0gW2h0dHBzOi8vZ2l0aHViLmNvbS9TaGFtb1gvY2FzaF0uIEBDaGV0X011cnRo eQ0KICBUaGlzIG1heSBiZSB0aGUgY2xvc2VzdCB0byBvY2FtbCBzaGVsbCBzY3JpcHRpbmcgZXhw ZXJpZW5jZSByZSBwZXJsLg0KDQoNCkFyZSB0aGVyZSBsZWFybmluZyBtYXRlcmlhbHMgZm9yIE9D YW1sIGZvciB0aG9zZSB3aXRoIG5vIHByb2dyYW1taW5nIGV4cGVyaWVuY2U/DQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2FyZS10aGVy ZS1sZWFybmluZy1tYXRlcmlhbHMtZm9yLW9jYW1sLWZvci10aG9zZS13aXRoLW5vLXByb2dyYW1t aW5nLWV4cGVyaWVuY2UvNTY4NC85XQ0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWFkLCBMdWNf TUwgc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgQmVmb3JlIHN0dWR5aW5nIG1vcmUgY29tcGxleCBib29rcywgaXQncyBhIGdvb2Qg aWRlYSB0byBmaXJzdCBnZXQgYW4NCiAgb3ZlcnZpZXcuDQoNCiAgW09DYW1sIGZvciB0aGUgU2tl cHRpY2FsIC8gT0NhbWwgaW4gYSBOdXRzaGVsbF0gOiB0aGUgdGl0bGUgaXMgZnVubnk7DQogIGl0 cyBtYWluIGFkdmFudGFnZSBpcyB0aGF0IGl0IGNvdmVycyBtb3N0IE9DYW1sIGNvbmNlcHRzIGlu ICoyMSBzaG9ydA0KICBzZWN0aW9ucyogd2hlcmUgeW91IGNhbiBleHBlcmltZW50IGJ5IHlvdXJz ZWxmIG9uIHNpbXBsZSBidXQgZXNzZW50aWFsDQogIHRoaW5ncy4NCg0KICBUaGUgYm9va3MvY291 cnNlcyBhbHJlYWR5IG1lbnRpb25lZCBhcmUgbmljZS4gWW91IGNhbiBhbHNvIGNvbnNpZGVyDQog IHRoaXMgb25lIHRoYXQgb2ZmZXJzIG1hbnkgZXhhbXBsZXMvZXhlcmNpc2VzIGFuZCBhbHNvIGEg Z29vZCBvdmVydmlldzoNCiAgW0RldmVsb3BpbmcgQXBwbGljYXRpb25zIFdpdGggT2JqZWN0aXZl IENhbWxdLg0KDQogIExFIExBTkdBR0UgQ0FNTCBtZW50aW9uZWQgYnkgQG5vamIgaXMgYW4gZXhj ZWxsZW50IGJvb2suIFdyaXR0ZW4gaW4NCiAgQ2FtbCBMaWdodCwgaXQncyBlYXN5IHRvIHR1cm4g aXQgYnkgeW91cnNlbGYgaW50byBPQ2FtbC4gSXQgb2ZmZXJzIGENCiAgZ3JlYXQgY2hhbmNlIHRv IGxlYXJuIGhvdyB0byBkbyBhIGxvdCBvZiB0aGluZ3MgaW4gKnB1cmUqIENhbWwgd2l0aA0KICBv bmx5IHN0ZGxpYiBhbmQgYSBzaW1wbGUgc3ludGF4IGV4dGVuc2lvbiBzeXN0ZW0gKHVzZSBjYW1s cDUgKGkuZS4gdGhlDQogICJnZW51aW5lIGNhbWxwNCIpIHRoYXQgaXMgZmluZSBmb3IgdGhhdC4g SXQgd29ya3Mgb3V0IG9mIHRoZSBib3ggdG8NCiAgZGVhbCB3aXRoIHN0cmVhbXMgYW5kIGl0J3Mg YSBjaGFuY2UgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGENCiAgTEwoMSkvcmVjdXJzaXZlIGRlc2Nl bnQgcGFyc2VyKS4NCg0KDQpbT0NhbWwgZm9yIHRoZSBTa2VwdGljYWwgLyBPQ2FtbCBpbiBhIE51 dHNoZWxsXQ0KaHR0cHM6Ly93d3cyLmxpYi51Y2hpY2Fnby5lZHUva2VpdGgvb2NhbWwtY2xhc3Mv Y2xhc3MtMDEuaHRtbA0KDQpbRGV2ZWxvcGluZyBBcHBsaWNhdGlvbnMgV2l0aCBPYmplY3RpdmUg Q2FtbF0NCmh0dHBzOi8vY2FtbC5pbnJpYS5mci9wdWIvZG9jcy9vcmVpbGx5LWJvb2svDQoNCg0K RHVuZSBtZWV0aW5nIG5vdGVzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiBbaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2R1bmUtbWVldGluZy1ub3Rlcy81NzEwLzFdDQoNCg0KSsOpcsOpbWllIERpbWlubyBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkganVzdCB3YW50ZWQgdG8gcHVibGljaXNlIHRo YXQgd2UgYXJlIG5vdyBwdWJsaXNoaW5nIHRoZSBub3RlcyBmcm9tDQogIG91ciBEdW5lIG1lZXRp bmdzIG9uIHRoZSB3aWtpOg0KDQogIFtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS93aWtp XQ0KDQogIFRoZXNlIG1lZXRpbmdzIGhhcHBlbiB2aWEgdmlkZW8tY29uZmVyZW5jZSBldmVyeSB0 d28gd2Vla3MuIElmIHlvdSBhcmUNCiAgaW50ZXJlc3RlZCBpbiBmb2xsb3dpbmcgdGhlIGRldmVs b3BtZW50IG9mIER1bmUgbW9yZSBjbG9zZWx5LCB0aGlzIGlzDQogIGdvb2QgcGxhY2UgdG8gbG9v ayBhdC4NCg0KDQpPQ2FtbCA0LjExLjAsIGZpcnN0IGFscGhhIHJlbGVhc2UNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIFtodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNC0xMS0wLWZpcnN0LWFscGhhLXJlbGVhc2UvNTcx Ni8xXQ0KDQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSBzZXQgb2YgbmV3IGZlYXR1 cmVzIGZvciB0aGUgZnV0dXJlIHZlcnNpb24gNC4xMS4wIG9mIE9DYW1sIGhhcw0KICBiZWVuIGZy b3plbi4gIEluIHRoZSBuZXh0IGZldyBtb250aHMsIHRoZSBPQ2FtbCBjb21waWxlciB0ZWFtIGlz DQogIGZvY3VzaW5nIG9uIGJ1ZyBodW50aW5nIGFuZCBmaXhpbmcuDQoNCiAgRm9yIHRoaXMgcmVs ZWFzZSBjeWNsZSwgd2UgaGF2ZSBkZWNpZGVkIHRvIHRlc3QgcHVibGlzaGluZyByZWd1bGFybHkN CiAgYWxwaGEgdmVyc2lvbnMgb2YgT0NhbWwgNC4xMS4wIGluIG9yZGVyIHRvIGhlbHAgZmVsbG93 IGhhY2tlcnMgam9pbiB1cw0KICBlYXJseSBpbiBvdXIgYnVnIGh1bnRpbmcgYW5kIG9wYW0gZWNv c3lzdGVtIGZpeGluZyBmdW4uICBPbmNlIHRoZSBvcGFtDQogIGVjb3N5c3RlbSBpcyBpbiBzaGFw ZSwgdGhlc2UgYWxwaGEgcmVsZWFzZXMgd2lsbCBtb3JwaCBpbnRvIHRoZSB1c3VhbA0KICBiZXRh IGFuZCByZWxlYXNlIGNhbmRpZGF0ZSByZWxlYXNlcy4NCg0KICBJZiB5b3UgZmluZCBhbnkgYnVn cywgcGxlYXNlIHJlcG9ydCB0aGVtIGhlcmU6DQogICBbaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sL2lzc3Vlc10NCg0KICBUaGUgY29tcGlsZXIgY2FuIGJlIGluc3RhbGxlZCBhcyBhbiBP UEFNIHN3aXRjaCB3aXRoIG9uZSBvZiB0aGUNCiAgZm9sbG93aW5nIGNvbW1hbmRzDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgb3BhbSBzd2l0Y2ggY3JlYXRlIG9jYW1sLXZhcmlhbnRzLjQuMTEu MCthbHBoYTEgLS1yZXBvc2l0b3JpZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwtYmV0YS1yZXBvc2l0b3J5LmdpdA0KICDilJTilIDilIDilIDilIANCiAg b3INCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgb2NhbWwtdmFy aWFudHMuNC4xMS4wK2FscGhhMStWQVJJQU5UIC0tcmVwb3NpdG9yaWVzPWRlZmF1bHQsYmV0YT1n aXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJldGEtcmVwb3NpdG9yeS5naXQNCiAg 4pSU4pSA4pSA4pSA4pSADQogIHdoZXJlIHlvdSByZXBsYWNlIFZBUklBTlQgd2l0aCBvbmUgb2Yg dGhlc2U6IGFmbCwgZmxhbWJkYSwgZnAsDQogIGZwK2ZsYW1iZGENCg0KICBUaGUgc291cmNlIGNv ZGUgZm9yIHRoZSBhbHBoYSBpcyBhbHNvIGF2YWlsYWJsZSBhdCB0aGVzZSBhZGRyZXNzZXM6DQoN CiAgW2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQuMTEuMCthbHBoYTEu dGFyLmd6XQ0KICBbaHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1sLTQuMTEv b2NhbWwtNC4xMS4wK2FscGhhMS50YXIuZ3pdDQoNCiAgSWYgeW91IGFyZSBpbnRlcmVzdGVkIGJ5 IHRoZSBvbmdvaW5nIGxpc3Qgb2YgbmV3IGZlYXR1cmVzIGFuZCBmaXhlZA0KICBidWdzLCB0aGUg dXBkYXRlZCBjaGFuZ2UgbG9nIGZvciBPQ2FtbCA0LjExLjAgaXMgYXZhaWxhYmxlIGF0Og0KDQog IFtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi80LjExL0NoYW5nZXNdDQoNCg0K T0NhbWwgVXNlcnMgYW5kIERldmVsb3BlcnMgTWVldGluZyAyMDIwDQrilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICBbaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXVzZXJzLWFuZC1kZXZlbG9w ZXJzLW1lZXRpbmctMjAyMC81NDU0LzJdDQoNCg0KSXZhbiBHb3RvdmNoaXRzIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRHVlIHRvIHRoZSBtdWx0aXBsZSByZXF1ZXN0cyBhbmQg c2luY2UgSUNGUCB3aWxsIGJlIG5vdyBvZmZpY2lhbGx5DQogIGhlbGQgb25saW5lIHdpdGggYSBz aWduaWZpY2FudGx5IHJlZHVjZWQgZmVlLCB3ZSBkZWNpZGVkIHRvIGV4dGVuZCB0aGUNCiAgc3Vi bWlzc2lvbiBkZWFkbGluZSB0aWxsIHRoZSBlbmQgb2YgdGhpcyBtb250aC4gV2UgYXJlIGhvcGlu ZyB0bw0KICBhdHRyYWN0IGEgbGFyZ2VyIGFuZCBtb3JlIGRpdmVyc2UgYXVkaWVuY2UgdGhpcyB5 ZWFyLCBnaXZlbiB0aGF0IHRoZQ0KICBuZXcgZm9ybWF0IGlzIG1vcmUgYWNjZXNzaWJsZSBib3Ro IHRyYXZlbC13aXNlIGFuZCBmaW5hbmNpYWxseS4NCg0KICBQbGVhc2UsIHNoYXJlIHRoZSBuZXdz IHdpZGVseSENCg0KDQpJbXBvcnRhbnQgRGF0ZXMgKHVwZGF0ZWQpDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICDigKIgVGFsayBwcm9wb3NhbCBzdWJtaXNzaW9uIGRlYWRsaW5lOiBNYXkgMjl0aCwg MjAyMCwgQW9FDQogIOKAoiBBdXRob3IgTm90aWZpY2F0aW9uOiBKdWx5IDE3dGgsIDIwMjANCiAg 4oCiIE9DYW1sIFdvcmtzaG9wOiBBdWd1c3QgMjh0aCwgMjAyMA0KDQoNClZTQ29kZSBQbGF0Zm9y bSBQbHVnaW4gMC41LjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIFtodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXZzY29kZS1wbGF0Zm9ybS1wbHVn aW4tMC01LTAvNTc1Mi8xXQ0KDQoNClJ1ZGkgR3JpbmJlcmcgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBUaGlzIHJlbGVhc2UgY29udGFpbnMgYSBjb3VwbGUgb2YgbWFqb3IgaW1wcm92ZW1l bnRzOg0KDQogIOKAoiBTeW50YXggaGlnaGxpZ2h0aW5nIGlzIHZhc3RseSBpbXByb3ZlZC4gVGhl cmUncyBub3cgaGlnaGxpZ2h0aW5nIGZvcg0KICAgIG1hbnkgbW9yZSBmaWxldHlwZXMsIGFuZCB0 aGUgY29yZSBoaWdobGlnaHRpbmcgZm9yIE9DYW1sIGlzIGZhciBtb3JlDQogICAgYWNjdXJhdGUu DQogIOKAoiBUaGVyZSdzIGludGVncmF0aW9uIHdpdGggcGFja2FnZSBtYW5hZ2VycyBzdWNoIGFz IG9wYW0gYW5kIGVzeS4gT25lDQogICAgbWF5IG5vdyBleHBsaWNpdGx5IHVzZSB0aGVtIHRvIGV4 cGxpY2l0bHkgc2VsZWN0IHRoZSBzYW5kYm94IHRoYXQNCiAgICBjb250YWlucyB0aGUgbHNwIHNl cnZlciBhbmQgcmVsYXRlZCB0b29scy4NCg0KICBVbmRlciB0aGUgaG9vZCwgdGhlIGVudGlyZSBw bHVnaW4gd2FzIHJld3JpdHRlbiBmcm9tIHR5cGVzY3JpcHQgdG8NCiAgT0NhbWwgKGJ1Y2tsZXNj cmlwdCkuIFRoaXMgc2hvdWxkIGhvcGVmdWxseSBtYWtlIGNvbnRyaWJ1dGlvbiBtb3JlDQogIGFj Y2Vzc2libGUgdG8gT0NhbWwgaGFja2Vycy4NCg0KICBJJ2QgbGlrZSB0byB0aGFuayBAcnVzdHlr ZXksIEBtbnhuLCBAcHJvbWV0aGVhbnNhY3JpZmljZSwgYW5kIEBpbWJza3kNCiAgZm9yIHRoZWly IGNvbnRyaWJ1dGlvbnMgdG8gdGhpcyByZWxlYXNlLiBUaGVpciBoZWxwIGlzIHRoZSByZWFzb24g Zm9yDQogIHRoaXMgdmFzdGx5IGltcHJvdmVkIHZlcnNpb24gb2YgdGhlIHBsdWdpbi4NCg0KICBB cyB1c3VhbCwgdGhlIHBsdWdpbiBpcyBhdmFpbGFibGUgZGlyZWN0bHkgdXNpbmcgdnNjb2RlJ3Mg ZXh0ZW5zaW9uDQogIG1hcmtldCBwbGFjZS4gSSdsbCBsZWF2ZSBhIGxpbmsgdG8gdGhlIHBsdWdp biBbaGVyZV0gdG8gYXZvaWQNCiAgY29uZnVzaW9uIHdpdGggdGhlIG1hbnkgb3RoZXIgT0NhbWwg cGx1Z2lucyBhdmFpbGFibGUuDQoNCiAgUGxlYXNlIHJlcG9ydCBhbnkgaXNzdWVzIG9uIHRoZSBb YnVnIHRyYWNrZXJdDQoNCg0KW2hlcmVdDQpodHRwczovL21hcmtldHBsYWNlLnZpc3VhbHN0dWRp by5jb20vaXRlbXM/aXRlbU5hbWU9b2NhbWxsYWJzLm9jYW1sLXBsYXRmb3JtDQoNCltidWcgdHJh Y2tlcl0gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sbGFicy92c2NvZGUtb2NhbWwtcGxhdGZvcm0v aXNzdWVzDQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sY29yZSBwbGFuZXQgYmxvZw0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBhcmUgbGlua3MgZnJv bSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW09DYW1sIFBsYW5ldF0uDQoNCiAg4oCi IFtPY3NpZ2VuIFN0YXJ0IDIuMTggcmVsZWFzZWRdDQogIOKAoiBbT2NzaWdlbiBUb29sa2l0IDIu NyB3aXRoIG5ldyB3aWRnZXQgT3RfdG9uZ3VlXQ0KDQoNCltPQ2FtbCBQbGFuZXRdIGh0dHA6Ly9v Y2FtbC5vcmcvY29tbXVuaXR5L3BsYW5ldC8NCg0KW09jc2lnZW4gU3RhcnQgMi4xOCByZWxlYXNl ZF0NCmh0dHBzOi8vb2NzaWdlbi5naXRodWIuaW8vYmxvZy8yMDIwLzA1LzA1L29zLw0KDQpbT2Nz aWdlbiBUb29sa2l0IDIuNyB3aXRoIG5ldyB3aWRnZXQgT3RfdG9uZ3VlXQ0KaHR0cHM6Ly9vY3Np Z2VuLmdpdGh1Yi5pby9ibG9nLzIwMjAvMDUvMDQvb3QvDQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtz ZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2Ug YSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2 ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1h aWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoN Cg0KW3NlbmQgbWUgYSBtZXNzYWdlXSBtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUu b3JnDQoNClt0aGUgYXJjaGl2ZV0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8NCg0K W1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3 bi9jd24ucnNzDQoNCltvbmxpbmVdIGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2Ft bC1uZXdzLXdlZWtseS8NCg0KW0FsYW4gU2NobWl0dF0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUu bmV0Lw0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of May 05 to 12, 2020.

Looking for "lovely, idiomatic" examp= les of Ocaml used for shell-scripting in the manner of Perl/Python (but esp= . Perl)

Continuing this thread, Chet Murthy said and Aaron L.= Zeng replied

  • needs to be Ocaml code, not an interpreter. I mean, if I=E2=80=99m not = going to write it in Ocaml, I might as well write in Perl, yes?

I think shexp might deserve another look. It's not an interpreter for a se= xp-based shell language, as its name might unfortunately deceivingly suggest. It's really a DSL for constructing shel= l pipelines using a 'a Process.t monad. The s-expression part is advertising that you can debug and trace the actio= ns performed using s-expressions.

The second-most-important part of Perl/Bash scripting is string-handling. A= nd it=E2=80=99s certainly the part of Ocaml that=E2=80=99s most painful when writing scripts. Let=E2=80=99s stipulate that there are n= ice libraries to make this easy. I=E2=80=99m an Ocaml bigot, I have to believe this anyway grin . This library doesn=E2=80= =99t seem to use 'em, nor choose/promote a particular set of such libraries.

I've found Base plus Re to be sufficient for most of my string-manipulation needs. It's never going to be as concis= e as Perl's built-in "magic" support for regexps, but you gain explicitness and clarity, which is part of the benefi= t of OCaml anyway.

Chet Murthy said and Donn Cave replied

It=E2=80=99s not as trivial in Ocaml, for many complicated reasons that boi= l down to =E2=80=9Cgee, string-handling is a PITA=E2=80=9D.

Really? hadn't noticed. Ha ha.

I could never really get urge for Perl, but I use its ancestor awk a lot, a= nd I'm trying out some awk-like simple string functions, like

let strlen =3D String.length
let sub s i n =3D let b =3D strlen s
     in if i < b
         then let n =3D min n (b - i)
         in String.sub s i n
    else ""
(* s=
ubstring to end of line *)
let substr a=
 i =3D if i < strlen a
     then String.sub a i ((strlen a) - i)
     else ""
let matchre t s =3D try
     Str.search_forward t s 0
     with | Not_found -> -1

etc.

So "open Awk" gets me a handful of more basic variations on common string f= unctions, with less elaborate parameters, no normal exceptions, etc. Including a line by line file processing functi= on. I have just newly started on this and haven't used it extensively, but it seems fairly promising. No wacky synta= x or hyper intelligent string processing, no packages, just a few dozen lines of cheater functions.

"Awk" is a misnomer, in that there's little correspondence between this and= awk, it was just what inspired me to try it.

Rapha=C3=ABl Proust said

I don't think it's lovely and I have no idea if it is idiomatic, but I made= a few scripts of my own in OCaml using the same library that other mentioned: bos

  • typepass use= s xdotool to type passwords from the password pas= sword manager
  • conn wraps wpa_supplicant, dhcpcd, ip, and other net= work management CLI
  • laptop-stat= us fetches status information for laptops (e.g., battery level) and pri= nts it in a nicely formatted form
  • bakelite inc= reases or decreases screen brightness

Vasile Rotaru also said

Gabriel Radanne also said

I have no particular opinion about the rest, but at least on the regex side= , this might be of interest: https://github.com/paur= kedal/ppx_regexp

If that's still not good enough, I would be very interested by suggestions = on how to make it more convenient. :)

OCamlUser proposed

I'm not sure about idiomatic, but I do have a utop config that I use to do = some one-off scripting in OCaml that uses shexp

#use "topfind"
#warnings "+a"
#thread
#require "ppx_jane,core"
#require "shexp.process"
#require "lambdasoup"
module List' =3D List=

open Shexp_process
open Shexp_process.Infix
open Core

module Html =3D struct
    include Soup

    let of_string =3D parse
end

let read_lines cmd<=
/span> =3D
    eval (call cmd |- read_all)
;;

let wget url=
 =3D
    read_lines ["wget"; "-O"; "-"; url]
;;

let chrome_curl url=
 =3D
    read_lines ["curl"; "-k"; "-sA"; "Chrome"; "-L"; url; "-o"; <=
span style=3D"color: #8b2252;">"-"]
;;

let split_lines =3D String.split ~on:'\n'
let filter_lines su=
bstring =3D List.filter ~f:String=
.(is_substring ~substring)
let to_html =3D Htm=
l.of_string
let find_html pat html =3D Html.(html $$ pat)

let (%) =3D Fn.compose

Then a simple script called shexp in my path:

utop -init ~/bin/ocaml-shexp-config

I add little helper functions as I come upon them. I find it's much easier = to transition to a file, or full program when I need it. Example program:

utop # read_lines ["sensors"] |> split_lines |> filter_lines "Core 0"=
;;
- : string list =3D
["Core 0:        +63.0=C2=B0C  (high =3D +84.0=C2=B0C, crit =3D +100.0=C2=
=B0C)"]

Anton Kochkov said

Not exactly OCaml, but can be made with the OCaml syntax as well - see BATSH.

Bikal Lem also said

I just found this - https://gith= ub.com/ShamoX/cash. @Chet_Murthy This may be the closest to ocaml shell= scripting experience re perl.

Are there learning materials for OCam= l for those with no programming experience?

Continuing this threaad, Luc_ML said

Before studying more complex books, it's a good idea to first get an overvi= ew.

O= Caml for the Skeptical / OCaml in a Nutshell : the title is funny; its main advantage is that it covers most OCaml concepts in= 21 short sections where you can experiment by yourself on simple but essential things.

The books/courses already mentioned are nice. You can also consider this on= e that offers many examples/exercises and also a good overview: Developing Applications With Objective Caml.

LE LANGAGE CAML mentioned by @nojb is an excellent book. Written in Caml Li= ght, it's easy to turn it by yourself into OCaml. It offers a great chance to learn how to do a lot of things in pu= re Caml with only stdlib and a simple syntax extension system (use camlp5 (i.e. the "genuine camlp4") that is fin= e for that. It works out of the box to deal with streams and it's a chance to understand what is a LL(1)/recursive= descent parser).

Dune meeting notes

J=C3=A9r=C3=A9mie Dimino announced

I just wanted to publicise that we are now publishing the notes from our Du= ne meetings on the wiki:

https://github.com/ocaml/dun= e/wiki

These meetings happen via video-conference every two weeks. If you are inte= rested in following the development of Dune more closely, this is good place to look at.

OCaml 4.11.0, first alpha release

octachron announced

The set of new features for the future version 4.11.0 of OCaml has been fro= zen. In the next few months, the OCaml compiler team is focusing on bug hunting = and fixing.

For this release cycle, we have decided to test publishing regularly alpha = versions of OCaml 4.11.0 in order to help fellow hackers join us early in our bug hunting and opam ecosystem fixing f= un. Once the opam ecosystem is in shape, these alpha releases will morph into t= he usual beta and release candidate releases.

If you find any bugs, please report them here: https://github.com/ocaml= /ocaml/issues

The compiler can be installed as an OPAM switch with one of the following c= ommands

opam switch create ocaml-variants.4.11.0+alpha=
1 --repositories=3Ddefault,beta=3Dgi=
t+https://github.com/ocaml/ocaml-beta-repository.git

or

opam switch create ocaml-variants.4.11.0+alpha=
1+VARIANT --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-repository.git

where you replace VARIANT with one of these: afl, flambda, fp, fp+flambda

The source code for the alpha is also available at these addresses:

htt= ps://github.com/ocaml/ocaml/archive/4.11.0+alpha1.tar.gz
https://caml.inria.fr/pub/distrib/ocaml-4.11/ocaml-4.11.0+alpha1.t= ar.gz

If you are interested by the ongoing list of new features and fixed bugs, t= he updated change log for OCaml 4.11.0 is available at:

https://github= .com/ocaml/ocaml/blob/4.11/Changes

OCaml Users and Developers Meeting 20= 20

Ivan Gotovchits announced

Due to the multiple requests and since ICFP will be now officially held onl= ine with a significantly reduced fee, we decided to extend the submission deadline till the end of this month. We ar= e hoping to attract a larger and more diverse audience this year, given that the new format is more accessible bo= th travel-wise and financially.

Please, share the news widely!

Important Dates (updated)

  • Talk proposal submission deadline: May 29th, 2020, AoE
  • Author Notification: July 17th, 2020
  • OCaml Workshop: August 28th, 2020

VSCode Platform Plugin 0.5.0

Rudi Grinberg announced

This release contains a couple of major improvements:

  • Syntax highlighting is vastly improved. There's now highlighting for ma= ny more filetypes, and the core highlighting for OCaml is far more accurate= .
  • There's integration with package managers such as opam and esy. One may= now explicitly use them to explicitly select the sandbox that contains the= lsp server and related tools.

Under the hood, the entire plugin was rewritten from typescript to OCaml (b= ucklescript). This should hopefully make contribution more accessible to OCaml hackers.

I'd like to thank @rustykey, @mnxn, @prometheansacrifice, and @imbsky for t= heir contributions to this release. Their help is the reason for this vastly improved version of the plugin.

As usual, the plugin is available directly using vscode's extension market = place. I'll leave a link to the plugin here to avoid confusion with the many other OCaml plugins available.

Please report any issues on the bug tracker

Other OCaml News

From the ocamlcore planet blog

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 RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=--