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 36FE45D5 for ; Tue, 1 Mar 2022 13:54:21 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.90,146,1643670000"; d="scan'208,217";a="23817880" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 01 Mar 2022 14:54:20 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 25A88E0AC0; Tue, 1 Mar 2022 14:54:20 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id B7ED6E037F for ; Tue, 1 Mar 2022 14:54:15 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=NG7r=TM=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org IronPort-SDR: mh2cnjzAZ6L6Bn/+navqHmK2hC0CKpYYc/E92datZAaR3x7A8yh2wXFyS0iNDzIgL5sHnVeI1K Bmc4wT9xcq8dMYrXI/el/80Qvoe5W3UfuBZkFdqZlSaiqBDbT6y9OwLiwJ6FNKScMJd2hCFr65 ddId5y6iXtRGD9jk0uWormLIegWDj/Ovu+2CWIozEGnfClbf8ytZdvPhOPW/DZ8TlwG3uFLKq5 M/QHTvstZ9/Jln95ZwMsllVWyulgqYmx0geuBilBxVlDnxoIDy2koEeUIW7LO1z8GuMo/DmJjZ 18xorcKfk1Hbp/zW40FI6o9W X-IPAS-Result: =?us-ascii?q?A0C3AgAcJR5ihyIeaIFagmWBH1kGKBkBXgZSBRYVBwhEh?= =?us-ascii?q?FSJBogRgRaINoZ1iB2EFoERA08QAQMBDSoBDgUBAgQBAYISgnUCF4N7Ah4GA?= =?us-ascii?q?QUzEwECBAEBAQEDAgMBAQEBAQEDAQEFAQEBAgEBAgMEARMBAQEBDQsJBQgMB?= =?us-ascii?q?RAOBTxkZASBSwSBdAs0DUABEAGBYwwMAwODdwEWAgEIBAY+AiUjAwkLAQYDA?= =?us-ascii?q?gQNARcBFAoXARIUBgKCChVJAYMWBAEKkjOaXYEvfzKBAYNPAQMDAgsDAQ4JJ?= =?us-ascii?q?oNzgRJSDQIUgQIXAYYRVUoBgwEJhAYCJxCBVUSBFYE8bUoHboFQND0LFwEBA?= =?us-ascii?q?QEBgRYICQEBEQIBBgsJDy0JglkXgk4ElQIOHxAJBi4rCRoOGRIEAQEXCQEOF?= =?us-ascii?q?woGAhkCCAoLAQccDgsHBgQHAx4sBQMBAgIFBAYpkXQQAgwDIAcDkHqHHIIVR?= =?us-ascii?q?49LgXEZYTQHg0uBOgYLiCKBHYxziCGDc4FOkTmDQI1rIZYzIIIphXN8CIEHC?= =?us-ascii?q?YJDiSWLBgglAYUKgU4qgQ4/HgwHMxowQ4I1ATMJRQEDAg0BAgIDAQIBAgkBA?= =?us-ascii?q?QJTAY1SAxaDKCiBa3QFgTw5O4JmgmVANAIBATQCBgEKAQEDCYVjAQEFEwsBP?= =?us-ascii?q?4ERiVwCAiSCIAEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 w== IronPort-HdrOrdr: A9a23:z2+G1KN6HO/3JcBcTsajsMiBIKoaSvp037BL7SBMoHNuHfBw+/ rFoB15737JYVQqNk3I8OroUMK9qBjnmaKdj7N9AZ6SGCHY/EGoIIth4YaK+UyCJwTOsshH2+ NFe6h6YeeAaGSSYPyKgjWFLw== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.90,146,1643670000"; d="scan'208,217";a="23817853" X-MGA-submission: =?us-ascii?q?MDE+DSJknYdRjUrVWLWp1ww1+xXHm2sEGUExV9?= =?us-ascii?q?eNnviHt8KEJXzRVZKqlwjZLMecM+EBLXZ8tK4xgLkRHA/ZJ+4cidkJEf?= =?us-ascii?q?OLCyZt7MeOuhzPaiSJOUFpIFln8LWP3qgsIAjjKIA8ebN+ArWHMkTb3M?= =?us-ascii?q?9xVGFNsEO1FXN01dnBauP53Q=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2022 14:54:14 +0100 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 6697F5672CC; Tue, 1 Mar 2022 14:54:13 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 01 Mar 2022 14:54:12 +0100 Message-ID: <87y21tg4mz.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 1 14:54:14 2022 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.296498, queueID=1F6175672E0 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: 18710 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: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRmVicnVhcnkgMjIgdG8NCk1hcmNoIDAxLCAyMDIyLg0KDQpUYWJsZSBvZiBDb250ZW50 cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CmRhdGEtZW5jb2RpbmcuMC41IHJlbGVhc2UNClR1dG9yaWFsOiBSb2d1ZWxpa2Ugd2l0aCBlZmZl Y3QgaGFuZGxlcnMNCkZvciBEaXZlcnNpdHkgYW5kIHRoZSBPQ2FtbCBDb21tdW5pdHk6IE91dHJl YWNoeSBTdW1tZXIgMjAyMg0KQm9ndWUsIHRoZSBPQ2FtbCBHVUkNCkZyaWRheSAwMy8wNCBJbnRl cm4gcHJlc2VudGF0aW9ucyDigJMgb3BlbiBhdHRlbmRhbmNlIQ0KQWZmZWN0OiBDb21wb3NhYmxl IGNvbmN1cnJlbmN5IHByaW1pdGl2ZXMgZm9yIE9DYW1sIDUuMA0KU2VnZmF1bHQgU3lzdGVtcyBK b2lucyBUYXJpZGVzDQpPQ2FtbCBVc2VyIFN1cnZleSAyMDIyDQpPbGQgQ1dODQoNCg0KZGF0YS1l bmNvZGluZy4wLjUgcmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZGF0YS1lbmNvZGluZy0wLTUtcmVsZWFz ZS85NDIwLzE+DQoNCg0KUmFwaGHDq2wgUHJvdXN0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgT24gYmVoYWxmIG9mIFtOb21hZGljIExhYnNdLCBJJ20gaGFwcHkgdG8gYW5ub3VuY2Ug dGhlIHJlbGVhc2Ugb2YNCiAgZGF0YS1lbmNvZGluZyB2ZXJzaW9uIDAuNS4NCg0KICBUaGlzIG5l dyB2ZXJzaW9uIGJyaW5ncyBzZXZlcmFsIGJ1ZyBmaXhlcywgc29tZSBpbmNyZWFzZWQgdGVzdA0K ICBjb3ZlcmFnZSwgbWlub3IgaW1wcm92ZW1lbnRzIGluIHRoZSBBUEksIGFuZCBhIG1ham9yIG5l dyBmZWF0dXJlOg0KDQoNCltOb21hZGljIExhYnNdIDxodHRwczovL3d3dy5ub21hZGljLWxhYnMu Y29tLz4NCg0KQ29tcGFjdCBlbmNvZGluZ3M6IHN1Yi1ieXRlIHRhZyBzaXplcw0K4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhpcyBu ZXcgdmVyc2lvbiBwcm92aWRlcyBhIG5ldyBzZXQgb2YgY29tYmluYXRvcnMgZm9yIF9jb21wYWN0 Xw0KICBlbmNvZGluZ3MuIFRoZXNlIGNvbXBhY3QgZW5jb2RpbmdzIHdpbGwgaGFuZGxlIGFsbCB0 aGUgdmVyYm9zZSBhbmQNCiAgZXJyb3ItcHJvbmUgYml0LXR3aWRsaW5nIHByb2Nlc3MgbmVlZGVk IHRvIGNvbWJpbmUgbXVsdGlwbGUgc3ViLWJ5dGUNCiAgZGlzY3JpbWluYXRvcnMgaW50byBhIHNp bmdsZSBieXRlLXNpemUgb25lLg0KDQogIEUuZy4sIHRoZSBlbmNvZGluZyBgbGV0IGUxID0gZWl0 aGVyIChlaXRoZXIgYm9vbCB1bml0KSAob3B0aW9uIGJvb2wpJw0KICB1c2VzIHRocmVlIGJpdHMg aW4gdGhlIHNoYXJlZCB0YWcgYW5kIHplcm8gYnl0ZXMgYWZ0ZXIgdGhhdDsgdGhlDQogIGVuY29k aW5nIGBsZXQgZTIgPSBlaXRoZXIgaW50MzIgaW50NjQnIHVzZXMgb25lIGJpdCBpbiB0aGUgc2hh cmVkIHRhZw0KICBhbmQgZWl0aGVyIDQgb3IgOCBieXRlcyB0byByZXByZXNlbnQgdGhlIGludGVn ZXI7IHRoZSBwcm9kdWN0IGVuY29kaW5nDQogIGBsZXQgZWUgPSB0dXAyIGUxIGUyJyB1c2VzIGZv dXIgKDMgKyAxKSBiaXRzIGluIHRoZSBzaGFyZWQgdGFnIGFuZA0KICBlaXRoZXIgNCBvciA4IGJ5 dGVzIHRvIHJlcHJlc2VudCB0aGUgaW50ZWdlciBvZiBgZTInLg0KDQoNCkhvdyB0byBnZXQNCuKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBjb2RlIGlzIGF2YWlsYWJsZSB1 bmRlciBNSVQgbGljZW5zZSBvbg0KICA8aHR0cHM6Ly9naXRsYWIuY29tL25vbWFkaWMtbGFicy9k YXRhLWVuY29kaW5nPi4NCg0KICBJdCBjYW4gYmUgaW5zdGFsbGVkIHZpYSBgb3BhbScuDQoNCg0K RGFyaW8gVGVpeGVpcmEgYXNrZWQgYW5kIFJhcGhhw6tsIFByb3VzdCByZXBsaWVkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICAgICAgICBIaSBAcmFwaGFlbC1wcm91c3QhIEkgaGF2 ZSBhIHF1ZXN0aW9uIHJlZ2FyZGluZyB0aGUNCiAgICAgICAgY29ubmVjdGlvbiBiZXR3ZWVuIGBk YXRhLWVuY29kaW5nJyBhbmQNCiAgICAgICAgYGpzb24tZGF0YS1lbmNvZGluZycsIGFsc28gZGV2 ZWxvcGVkIGF0IE5vbWFkaWMgTGFicy4gVGhlDQogICAgICAgIGxhdHRlciBzZWVtcyB0aWVkIHRv IEpTT04sIHdoZXJlYXMgdGhlIGZvcm1lciBpcyBtb3JlDQogICAgICAgIGZsZXhpYmxlLCBzdXBw b3J0aW5nIGFsc28gYmluYXJ5IGVuY29kaW5ncy4gSG93ZXZlciwgc2luY2UNCiAgICAgICAgYGRh dGEtZW5jb2RpbmcnIGFsc28gc3VwcG9ydHMgSlNPTiwgZG9lc24ndCBpdCBzdWJzdW1lDQogICAg ICAgIGBqc29uLWRhdGEtZW5jb2RpbmcnIGNvbXBsZXRlbHk/DQoNCiAgVGhlIGBkYXRhLWVuY29k aW5nJyBsaWJyYXJ5IHVzZXMgYGpzb24tZGF0YS1lbmNvZGluZycgZm9yIGl0cyBKU09ODQogIGJh Y2tlbmQuIEl0IGRlbGVnYXRlcyBjb252ZXJzaW9uIGZyb20gT0NhbWwgdmFsdWVzIGludG8gYW5k IGZyb20gSlNPTg0KICB0byB0aGUgcHJpbWl0aXZlcyBwcm92aWRlZCBpbiB0aGUgaW50ZXJmYWNl IG9mIGBqc29uLWRhdGEtZW5jb2RpbmcnLg0KDQogIEluIGEgd2F5LCB5ZXMsIGFzIGFuIGVuZC11 c2VyIHlvdSBkb24ndCBuZWVkIHRvIHVzZQ0KICBganNvbi1kYXRhLWVuY29kaW5nJyBkaXJlY3Rs eSBiZWNhdXNlIHlvdSBjYW4gdXNlIHRoZSBgSnNvbicgbW9kdWxlIG9mDQogIGBkYXRhLWVuY29k aW5nJyBpbnN0ZWFkLiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgcmVhc29ucyB3aHkgeW91DQog IG1pZ2h0IGFkZCBganNvbi1kYXRhLWVuY29kaW5nJyBhcyBhIChub24tdHJhbnNpdGl2ZSkgZGVw ZW5kZW5jeSB0bw0KICB5b3VyIHByb2plY3QgYW5kIHVzZSBpdCBkaXJlY3RseSBpbiB5b3VyIGNv ZGU6DQoNCiAg4oCiIFlvdSB3YW50IHRvIGtlZXAgdGhlIGRlcGVuZGVuY3kgc2V0IGFuZCB0aGUg bnVtYmVyIG9mIGFic3RyYWN0aW9uDQogICAgbGF5ZXJzIGFzIHNtYWxsIGFzIHBvc3NpYmxlLiBF LmcuLCBpbiBvcmRlciB0byByZWR1Y2UgYmluYXJ5IHNpemUuDQogIOKAoiBZb3Ugd2FudCBzb21l IHN0YXRpYyBndWFyYW50ZWVzIHRoYXQgc29tZSBlbmNvZGluZ3MgYXJlIG9ubHkgZXZlcnkNCiAg ICB1c2VkIGZvciBKU09OLiBFLmcuLCBpbiB5b3VyIGxvZ2dpbmcgc3lzdGVtLg0KICDigKIgWW91 IG5lZWQgdG8gZGVmaW5lIGEgSlNPTiBlbmNvZGluZyB3aGljaCBpcyByZWplY3RlZCBieQ0KICAg IGBkYXRhLWVuY29kaW5nJyBvbiBncm91bmRzIHRoYXQgaXQgaXMgaW52YWxpZCBpbiBiaW5hcnku IE5vdGUgdGhhdA0KICAgIOKAoiBUaGlzIGlzIHZlcnkgc3BlY2lmaWMgdG8gc29tZSBjb21iaW5h dG9ycyBidXQgYmFzaWNhbGx5IHNvbWUNCiAgICAgIGNvbWJpbmF0b3JzIHdpbGwgcmVqZWN0IHRo ZWlyIGlucHV0cyAocmFpc2UgYEludmFsaWRfYXJndW1lbnQnKQ0KICAgICAgYmVjYXVzZSB1c2lu ZyB0aGUgc2VyaWFsaXNlciB3b3VsZCBsZWFkIHRvIHVuZGVjb2RhYmxlIGRhdGEuIE1vc3QNCiAg ICAgIHR5cGljYWxseSwgdGhpcyBoYXBwZW5zIGlmIHlvdSB0cnkgdG8gY29uY2F0ZW5hdGUgdHdv IGZpZWxkcyBvZg0KICAgICAgdW5rbm93biBsZW5ndGguIERlY29kaW5nIHRoZSByZXN1bHQgYmVj b21lcyBhIGd1ZXNzaW5nIGdhbWUgYXMgdG8NCiAgICAgIHdlcmUgb25lIGZpZWxkIHN0b3BzIGFu ZCB3aGVyZSB0aGUgbmV4dCBiZWdpbnMuIFRoZXNlIGNvdWxkIGVhc2lseQ0KICAgICAgYmUgcmVw cmVzZW50ZWQgYXMgYW4gYXJyYXkgaW4gSlNPTiB3aGljaCBpbmNsdWRlcyBhbGwgdGhlDQogICAg ICBkZWxpbWl0ZXJzIHlvdSBuZWVkIHRvIGRlY29kZSBpdC4NCiAgICDigKIgVGhlcmUgYXJlIG90 aGVyIHdvcmthcm91bmRzIChlLmcuLCBwcmVmaXhpbmcgdGhlIGZpZWxkcyB3aXRoIGENCiAgICAg IGxlbmd0aCBmaWVsZCksIGJ1dCBnb2luZyBmb3IgdGhlIEpTT04gZW5jb2RpbmcgZGlyZWN0bHkg aXMgYSB2YWxpZA0KICAgICAgYXBwcm9hY2ggaWYgeW91IG9ubHkgbmVlZCBKU09OLg0KDQoNClJh cGhhw6tsIFByb3VzdCBsYXRlciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIFZlcnNpb24gMC41LjEgb2YgdGhlIGRhdGEtZW5jb2RpbmcgaGFzIGp1c3Qg YmVlbiByZWxlYXNlZC4NCg0KICBUaGlzIGlzIGEgYnVnZml4IHJlbGVhc2UgbWFraW5nIG9uZSBv ZiB0aGUgbGlicmFyeSdzIGludGVybmFsIGNoZWNrcw0KICBtb3JlIHBlcm1pc3NpdmUuIFdpdGhv dXQgdGhpcyBmaXggKGkuZS4sIHVzaW5nIHZlcnNpb24gMC41KSwgc29tZQ0KICB2YWxpZCBlbmNv ZGluZ3MgYXJlIHJlamVjdGVkIChyYWlzaW5nIGBJbnZhbGlkX2FyZ3VtZW50JykgYnkgdGhlDQog IGxpYnJhcnkuDQoNCiAgWW91IGNhbiB1cGRhdGUgdmlhIG9wYW06IGBvcGFtIGluc3RhbGwgZGF0 YS1lbmNvZGluZy4wLjUuMScNCg0KDQpUdXRvcmlhbDogUm9ndWVsaWtlIHdpdGggZWZmZWN0IGhh bmRsZXJzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L3R1dG9yaWFsLXJvZ3VlbGlrZS13aXRoLWVmZmVjdC1oYW5kbGVycy85NDIyLzE+DQoNCg0K YXJ0LXcgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBUaGUgcmVjZW50IGNvbnZlcnNhdGlvbnMgYWJvdXQgW2BlaW8nIDAuMV0gYW5k IFthZ25vc3RpYyBibG9ja2luZ10NCiAgaGF2ZSBtYWRlIG1lIHZlcnkgY3VyaW91cyBhYm91dCBl ZmZlY3QgaGFuZGxlcnMuIFRoZSBtdWx0aWNvcmUgdGVhbQ0KICBoYXMgZG9uZSBhbiBbYXdlc29t ZV0gam9iIHdpdGggdGhlaXIgW3R1dG9yaWFsc10sIFtleGFtcGxlc10gYW5kDQogIFt0YWxrc10s IGJ1dCB0aGUgbGF5bWVuIGhhdmUgYmVlbiB0b28gcXVpZXQgZm9yIHN1Y2ggYW4gZXhjaXRpbmcN CiAgZmVhdHVyZSEgV2hlcmUgYXJlIGFsbCB0aGUgYmxvZyBwb3N0cyBhYm91dCBob3cgInlvdSBj b3VsZCBoYXZlDQogIGludmVudGVkIGFsZ2VicmFpYyBlZmZlY3RzIiBhbmQgIm9uZS1zaG90IGNv bnRpbnVhdGlvbnMgYXJlIGxpa2UNCiAgc3BhZ2hldHRpIj8NCg0KICBJbiBhbnkgY2FzZSwgSSdt IGhvcGluZyB0byB0ZWFzZSBzb21lIG9mIHlvdSBpbnRvIHRyeWluZyB0aGVtIG91dCB3aXRoDQog IFthIHNpbXBsZSB0dXRvcmlhbCBhYm91dCBwcm9ncmFtbWluZyBhIHJvZ3VlbGlrZSB3aXRoIGVm ZmVjdCBoYW5kbGVyc10NCiAgOikNCg0KICBUaGVyZSdzIG5vdGhpbmcgbmV3IGhlcmUgYmVzaWRl cyB0aGUgZnVuIHVzZS1jYXNlISBTbyBpZiB5b3UgYWxyZWFkeQ0KICBoYXZlIGFuIGludHVpdGl2 ZSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzeW50YXggYW5kIG1vdGl2YXRpb25zLCB5b3UgbWF5DQog IGJlIG1vcmUgaW50ZXJlc3RlZCBieSBbYSBkZWVwZXIgbG9vayBhdCB0aGUgc2NvcGUgb2YgZWZm ZWN0IGhhbmRsZXJzXQ0KICDigJMgYW5kIGEgc29mdCBpbnRyb2R1Y3Rpb24gdG8gc29tZSBsZXNz IGNvbW1vbiBmZWF0dXJlcyBvZiB0aGUgdHlwZQ0KICBzeXN0ZW0uIC8odGhpcyBsaW5rIHdhcyBw cmV2aW91c2x5IHBvc3RlZCBkZWVwIGludG8gdGhlIGBlaW8nIHRocmVhZCkvDQoNCiAgSSB3b3Vs ZCBiZSBncmF0ZWZ1bCBpZiB5b3Ugc3BvdCBhbnkgbWlzdGFrZSEgSSdtIGFsc28gY3VyaW91cyBv ZiBvdGhlcg0KICBmdW4gYXBwbGljYXRpb25zIGZvciBlZmZlY3QgaGFuZGxlcnPigKYgYW5kIGlm IHlvdSBmZWVsIGxpa2Ugc2hhcmluZw0KICB5b3VyIG93biBzdXJwcmlzZXMgYW5kIGRpc2NvdmVy aWVzLCBJIGJlbGlldmUgaXQgY291bGQgcmVhbGx5IGhlbHANCiAgb3RoZXJzIGxlYXJuIGZhc3Rl ciA6KQ0KDQoNCltgZWlvJyAwLjFdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Vpby0w LTEtZWZmZWN0cy1iYXNlZC1kaXJlY3Qtc3R5bGUtaW8tZm9yLW9jYW1sLTUvOTI5OC85Nz4NCg0K W2Fnbm9zdGljIGJsb2NraW5nXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ob3ctdG8t YmxvY2staW4tYW4tYWdub3N0aWMtd2F5LzkzNjgvNTE+DQoNClthd2Vzb21lXSA8aHR0cHM6Ly9n aXRodWIuY29tL3BhdHJpY29mZXJyaXMvYXdlc29tZS1tdWx0aWNvcmUtb2NhbWw+DQoNClt0dXRv cmlhbHNdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWxsYWJzL29jYW1sLWVmZmVjdHMtdHV0b3Jp YWw+DQoNCltleGFtcGxlc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvZWZm ZWN0cy1leGFtcGxlcz4NCg0KW3RhbGtzXQ0KPGh0dHBzOi8vd2F0Y2gub2NhbWwub3JnL3ZpZGVv cy93YXRjaC83NGVjZTBhOC0zODBmLTRlMmEtYmVmNS1jNmJiOTA5MmJlODk+DQoNClthIHNpbXBs ZSB0dXRvcmlhbCBhYm91dCBwcm9ncmFtbWluZyBhIHJvZ3VlbGlrZSB3aXRoIGVmZmVjdCBoYW5k bGVyc10NCjxodHRwczovL2hhY2ttZC5pby9AeUZfbnRVaG1SdktVdDE1ZzdtMXVHdy9CSkJaN1RN ZXE+DQoNClthIGRlZXBlciBsb29rIGF0IHRoZSBzY29wZSBvZiBlZmZlY3QgaGFuZGxlcnNdDQo8 aHR0cHM6Ly9oYWNrbWQuaW8vQHlGX250VWhtUnZLVXQxNWc3bTF1R3cvQmstNU5YaDE1Pg0KDQoN CktpcmFuIEdvcGluYXRoYW4gdGhlbiBzYWlkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBH cmVhdCBibG9nIHBvc3QhIFRoYXQgc2VlbXMgbGlrZSBhIHZlcnkgZWxlZ2FudCBpbXBsZW1lbnRh dGlvbiENCg0KICBGdW5ueSB5b3Ugc2hvdWxkIG1ha2UgYSByb3VnZWxpa2UgOnNtaWxleTogLCBJ IGd1ZXNzIGVmZmVjdCBoYW5kbGVycyArDQogIGdhbWVzIG1pZ2h0IGJlIHBvcHVsYXIgZm9yIGdh bWVzLCBiZWNhdXNlIEkgYWxzbyBoYWQgYSBibG9nIHBvc3QgYWJvdXQNCiAgZWZmZWN0IGhhbmRs ZXJzIGFuZCB0aGVpciBhcHBsaWNhdGlvbnMsIGluIHBhcnRpY3VsYXIgZm9yIGdhbWVzLA0KICBh bHRob3VnaCBpbiBteSBjYXNlIGl0IHdhcyBmb3IgYW5pbWF0aW9uczoNCg0KICA8aHR0cHM6Ly9n b3BpYW5kY29kZS51ay9sb2dzL2xvZy1ieWUtYnllLW1vbmFkcy1hbGdlYnJhaWMtZWZmZWN0cy5o dG1sPg0KDQoNCmdhc2NoZSBhbHNvIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE5vdGU6IHRoZSAidXBzdHJlYW0i IHN0YXR1cyBvZiBlZmZlY3QgaGFuZGxlcnMgaXMgYSBsaXR0bGUNCiAgdW5jZXJ0YWluL2NvbmZ1 c2luZyByaWdodCBub3cuIFlvdXIgYmxvZyBwb3N0IChJIGRpZG4ndCBnZXQgYSBjaGFuY2UNCiAg dG8gcmVhZCBpdCB5ZXQsIGJ1dCBpdCBzb3VuZHMgdmVyeSBuaWNlISkgdXNlcyB0aGUgZXhwZXJp bWVudGFsIHN5bnRheA0KICBvZiBtdWx0aWNvcmUtNC4xMitlZmZlY3RzLCBidXQgdGhhdCBzeW50 YXggd2FzIGludGVudGlvbmFsbHkgL25vdC8NCiAgdXBzdHJlYW1lZCwgYW5kIGl0IHdpbGwgL25v dC8gYmUgcGFydCBvZiBPQ2FtbCA1LjAuDQoNCiAgSSB0aGluayB0aGVyZSBpcyBhIHJpc2sgb2Yg Y29uZnVzaW9uIGJlY2F1c2UgdGhlIGNvbW11bml0eSBpcyBhd2FyZQ0KICB0aGF0IE11bHRpY29y ZSBPQ2FtbCBoYXMgZWZmZWN0IGhhbmRsZXJzLCBhbmQgYWxzbyB0aGF0IE11bHRpY29yZQ0KICBP Q2FtbCBoYXMgYmVlbiBtZXJnZWQgdXBzdHJlYW0uIFNvIGl0IGNhbiBiZSB0ZW1wdGluZyB0byBi ZWxpZXZlIHRoYXQNCiAgdGhlIHVwY29taW5nIE9DYW1sIHJlbGVhc2UgKG9yIG1heWJlIG9uZSBv ciB0d28gcmVsZWFzZXMgYWZ0ZXIgdGhhdCwNCiAgd2Ugc2FpZCB0aGUgZmlyc3QgTXVsdGljb3Jl IHJlbGVhc2Ugd291bGQgYmUgbW9yZSBsaWtlIGEgcHJldmlldykgd2lsbA0KICBzdXBwb3J0IGVm ZmVjdCBoYW5kbGVycyBhcyBhIGxhbmd1YWdlIGZlYXR1cmUuIEl0IHdpbGwgbm90ISBFZmZlY3Rz IGFzDQogIGEgbGFuZ3VhZ2UgZmVhdHVyZSB3ZXJlIHJlbW92ZWQgZnJvbSBNdWx0aWNvcmUgT0Nh bWwgYmVmb3JlIHRoZQ0KICB1cHN0cmVhbSBtZXJnZS4gQW5kIC9ubyBvbmUga25vd3MvIGlmL3do ZW4gdGhleSB3aWxsIGJlIHN1cHBvcnRlZA0KICB1cHN0cmVhbS4NCg0KICBTbzogSSB0aGluayB0 aGF0IHlvdXIgYmxvZyBwb3N0cyBvbiB1c2luZyBlZmZlY3QgaGFuZGxlcnMgY291bGQgaGF2ZQ0K ICBzb21ld2hlcmUgYSBzaG9ydCBtZW50aW9uIHRoYXQgdGhlIGNvZGUgaXMgdXNpbmcgYW4gZXhw ZXJpbWVudGFsDQogIGV4dGVuc2lvbiBvZiBPQ2FtbCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkg dGhlIHVwc3RyZWFtDQogIGltcGxlbWVudGF0aW9uLg0KDQoNCiAgVGhlIHJlYXNvbmluZyBmb3Ig dGhpcyBjaG9pY2UgaXMgdGhhdCB3ZSB3YW50IHRvIGdpdmUgYSBjaGFuY2UgdG8gYQ0KICB0eXBl IHN5c3RlbSBmb3IgZWZmZWN0IGhhbmRsZXJzLCBidXQgdGhhdCBzdGlsbCBuZWVkIHF1aXRlIGEg Yml0IG1vcmUNCiAgdGltZSB0aGFuIHRoZSBNdWx0aWNvcmUgcnVudGltZSBpdHNlbGYuIFdlIGRv bid0IHdhbnQgdG8gZW5jb3VyYWdlIHRoZQ0KICBlY29zeXN0ZW0gdG8gcmVseSBvbiB1bnR5cGVk IGVmZmVjdHMsIGlmIGl0IG1lYW5zIGEgbG90IG9mIHBhaW4NCiAgdXBncmFkaW5nIHRvIHR5cGVk IGVmZmVjdHMgbGF0ZXIgKG9yIHJpc2sgaGF2aW5nIHRvIHN1cHBvcnQgYm90aCkuDQoNCiAgNS4w IG9ubHkgY29udGFpbnMgYmFzaWMgc3VwcG9ydCBmb3IgZWZmZWN0IGhhbmRsZXJzIGFzIGEgL3J1 bnRpbWUNCiAgcHJpbWl0aXZlLywgYnV0IGRvcyAvbm90LyBzdXBwb3J0IGhhbmRsZXJzIGFzIGEg L2xhbmd1YWdlIGZlYXR1cmUvLiBJDQogIHRoaW5rIHRoZXkgc2hvdWxkIGJlIGNvbnNpZGVyZWQg ZXhwZXJpbWVudGFsOiB5b3UgY2FuIHJlbHkgb24gdGhlbSBmb3INCiAgdGhlaXIgaW50ZW5kZWQg cHVycG9zZSBvZiBleHBvc2luZyBhIGZsZXhpYmxlIGludGVyZmFjZSBmb3IgY29uY3VycmVudA0K ICBmaWJlcnMsIGJ1dCB1c2VzIGJleW9uZCB0aGF0IG1heSBicmVhayBpbiB0aGUgZnV0dXJlLg0K DQogIFNvLCBpbiBhIHNlbnNlLCB3ZSBkb24ndCB3YW50IHBlb3BsZSB0byB1c2UgdGhlbS4gSXQn cyBvZiBjb3Vyc2UgZmluZQ0KICB0byB1c2UgZXhwZXJpbWVudGFsIGZlYXR1cmVzIGZyb20gZXhw ZXJpbWVudGFsIGZvcmtzIG9mIHRoZSBPQ2FtbA0KICBjb21waWxlciAoZWZmZWN0IGhhbmRsZXJz LCBtb2R1bGFyIGltcGxpY2l0cyBvciBleHBsaWNpdHMsIHJ1bnRpbWUNCiAgdHlwZSByZXByZXNl bnRhdGlvbnMgYW5kIHdoYXQgbm90KSwgYW5kIHRoZSBwZW9wbGUgd29ya2luZyBvbiB0aGVzZQ0K ICBleHBlcmltZW50YWwgZmVhdHVyZXMgZG8gYmVuZWZpdCBmcm9tIG90aGVyIHBlb3BsZSB0cnlp bmcgdGhlbSBhbmQNCiAgZ2l2aW5nIHRoZW0gZmVlZGJhY2suIEJ1dCB3ZSBkb24ndCB3YW50IHBl b3BsZSB0byBkZXBlbmQgb24gaXQgL2luDQogIHByb2R1Y3Rpb24vLCB3aGF0ZXZlciB0aGF0IG1l YW5zLiAoRm9yIGV4YW1wbGUsIGNvZGUgdXNpbmcgaXQgaXMNCiAgbGlrZWx5IHRvIGdldCBzdHVj ayBvbiA0LjEyIGZvcmV2ZXIgYW5kIG5ldmVyIHNlZSBhbiB1cGdyYWRlIHRvDQogIHVwY29taW5n IE9DYW1sIHZlcnNpb25zLCBhbHRob3VnaCBvZiBjb3Vyc2UgcGVvcGxlIGNvdWxkIGNob29zZSB0 bw0KICBwb3J0IHRoZSBleHBlcmltZW50YWwgYnJhbmNoIGZvcndhcmQuKQ0KDQoNCkZvciBEaXZl cnNpdHkgYW5kIHRoZSBPQ2FtbCBDb21tdW5pdHk6IE91dHJlYWNoeSBTdW1tZXIgMjAyMg0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9mb3It ZGl2ZXJzaXR5LWFuZC10aGUtb2NhbWwtY29tbXVuaXR5LW91dHJlYWNoeS1zdW1tZXItMjAyMi85 MjM0LzQ+DQoNCg0KU29uamEgSGVpbnplIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSnVzdCBp biBjYXNlIGFueW9uZSBpcyBhY3R1YWxseSBpbnRlcmVzdGVkIGluIHRoaXM6IHRoZSBwcm9qZWN0 DQogIHN1Ym1pc3Npb24gZGVhZGxpbmUgaGFzIGJlZW4gZXh0ZW5kZWQgZnJvbSBNYXJjaCA0dGgg dG8gTWFyY2ggMjNyZC4gU28NCiAgdGhlIHVwZGF0ZWQgdGltZWxpbmUgbm93IGxvb2tzIGFzIGZv bGxvd3M6DQoNCiAgPGh0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFuZGFyZDExL3Vw bG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvNS81MzRjYTlhMDhiY2UxMGYxMzUzMGU2Yzk4ZWFlMTc5 N2ZkZjEzZTUyLnBuZz4NCg0KICB3aGVyZSAyLiBhbmQgMy4gcHJvYmFibHkgbmVlZCB0byBiZSBk b25lIGEgYml0IGluIHBhcmFsbGVsLg0KDQoNCkJvZ3VlLCB0aGUgT0NhbWwgR1VJDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ib2d1ZS10aGUtb2Nh bWwtZ3VpLzkwOTkvMjM+DQoNCg0Kc2FuZXR0ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpLCBzb21lIG5ldyBkZXZl bG9wbWVudHMuIEkgaGF2ZSBpbXBsZW1lbnRlZCBhIG5ldyBgU2RsX2FyZWEnIHdpZGdldA0KICB3 aGVyZSBvbmUgY2FuIGNvbnZlbmllbnRseSBpc3N1ZSBhbnkgU0RMIGZ1bmN0aW9uIChmcm9tIHRo ZSBTREwNCiAgUmVuZGVyZXIgQVBJKS4NCg0KICBIZXJlIGlzIChiZWxvdykgdGhlIG5ldyAnbGFi ZWxsZWQgZ3JhcGgnIGV4YW1wbGUuIEluIHRoaXMgZXhhbXBsZSBJIGFtDQogIHVzaW5nIHJlZ3Vs YXIgImxhYmVsIiB3aWRnZXRzIGZvciBjcmVhdGluZyB0aGUgbm9kZXMsIGFuZCBJIGFtIHVzaW5n DQogIGFuIFNkbF9hcmVhIGZvciBkcmF3aW5nIHRoZSBsaW5lcy4NCg0KICBUaGUgbmljZSB0aGlu Z3MgZm9yIGxhYmVscyB0byBiZSByZWd1bGFyIHdpZGdldHMgaXMgdGhhdCBvbmUgY2FuIGNsaWNr DQogIG9uIHRoZW0uIFRvIGRlbW9uc3RyYXRlIHRoaXMsIGluIHRoaXMgZXhhbXBsZSB0aGV5IHJl YWN0IHRvIGEgY2xpY2sgYnkNCiAganVtcGluZyB0byBhbm90aGVyIHJhbmRvbSBsb2NhdGlvbiAo d2l0aCBhbmltYXRpb24pLg0KDQogIDxodHRwczovL2F3czEuZGlzY291cnNlLWNkbi5jb20vc3Rh bmRhcmQxMS91cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC9mL2Y5NTc1ODM4YTdlNWVhNGM1ODQ4 NWI5NTVlOTZmN2M5YmJkYTM4NGZfMl8xMjY2eDEwMDAucG5nPg0KDQogIDxodHRwczovL2F3czEu ZGlzY291cnNlLWNkbi5jb20vc3RhbmRhcmQxMS91cGxvYWRzL29jYW1sL29yaWdpbmFsLzJYL2Qv ZDY5NThlMjY2ZjI3YTU1N2M1YzhkOGQzNzA5OWQ1MzJlYWNmMmMxYy5naWY+DQoNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiBvcGVuIEJvZ3VlDQogIOKUgiBtb2R1bGUgVyA9IFdpZGdldA0KICDi lIIgbW9kdWxlIEwgPSBMYXlvdXQNCiAg4pSCIA0KICDilIIgbGV0IG4gPSAxNSAoKiBudW1iZXIg b2YgZGlzY3MgKikNCiAg4pSCIGxldCByYWRpdXMgPSAyMA0KICDilIIgbGV0IHdpZHRoID0gODAw DQogIOKUgiBsZXQgaGVpZ2h0ID0gNjAwDQogIOKUgiANCiAg4pSCIGxldCBjID0gRHJhdy5maW5k X2NvbG9yICIjZTViOTJjIg0KICDilIIgbGV0IGNiID0gRHJhdy5maW5kX2NvbG9yICIjN2I2YjM1 Ig0KICDilIIgbGV0IGRpc2Nfc3R5bGUgPSBTdHlsZS4oDQogIOKUgiAgICAgY3JlYXRlIH5ib3Jk ZXI6KA0KICDilIIgICAgICAgbWtfYm9yZGVyIH5yYWRpdXMgKG1rX2xpbmUgfmNvbG9yOkRyYXcu KG9wYXF1ZSBjKSB+d2lkdGg6MSB+c3R5bGU6U29saWQgKCkpKQ0KICDilIIgICAgICAgfmJhY2tn cm91bmQ6KGNvbG9yX2JnIERyYXcuKG9wYXF1ZSBjYikpICgpKQ0KICDilIIgDQogIOKUgiBsZXQg YmFja2dyb3VuZCA9IEwuc3R5bGVfYmcgU3R5bGUuKA0KICDilIIgICAgIG9mX2JnIChncmFkaWVu dCB+YW5nbGU6NDUuIERyYXcuW29wYXF1ZSBncmV5OyBvcGFxdWUgYmxhY2tdKSkNCiAg4pSCIA0K ICDilIIgbGV0IGZnID0gRHJhdy4ob3BhcXVlIHdoaXRlKQ0KICDilIIgDQogIOKUgiBsZXQgY3Jl YXRlX2Rpc2MgaSAoeCx5KSA9DQogIOKUgiAgIGxldCB3ID0gMipyYWRpdXMgKyAxIGluDQogIOKU giAgIGxldCBiZyA9IEJveC5jcmVhdGUgfnN0eWxlOmRpc2Nfc3R5bGUgfndpZHRoOncgfmhlaWdo dDp3ICgpIGluDQogIOKUgiAgIFcubGFiZWwgfmZnIChzdHJpbmdfb2ZfaW50IGkpDQogIOKUgiAg IHw+IEwucmVzaWRlbnQgfmJhY2tncm91bmQ6KEwuYm94X2JnIGJnKSB+eDooeC1yYWRpdXMpIH55 Oih5LXJhZGl1cykgfncgfmg6dw0KICDilIIgDQogIOKUgiBsZXQgbW92ZV9kaXNjICh4LHkpIGQg PQ0KICDilIIgICBsZXQgKHgwLCB5MCkgPSBMLnhwb3MgZCwgTC55cG9zIGQgaW4NCiAg4pSCICAg TC5hbmltYXRlX3ggZCAoQXZhci5mcm9tdG8geDAgeCk7DQogIOKUgiAgIEwuYW5pbWF0ZV95IGQg KEF2YXIuZnJvbXRvIHkwIHkpDQogIOKUgiANCiAg4pSCIGxldCByYW5kb21fY2VudGVyIF8gPQ0K ICDilIIgICByYWRpdXMgKyBSYW5kb20uaW50ICh3aWR0aCAtIDIqcmFkaXVzKSwNCiAg4pSCICAg cmFkaXVzICsgUmFuZG9tLmludCAoaGVpZ2h0IC0gMipyYWRpdXMpDQogIOKUgiANCiAg4pSCIGxl dCBhcmVhID0NCiAg4pSCICAgbGV0IHNkbHcgPSBXLnNkbF9hcmVhIH53OndpZHRoIH5oOmhlaWdo dCAoKSBpbg0KICDilIIgICBsZXQgc2RsYSA9IFcuZ2V0X3NkbF9hcmVhIHNkbHcgaW4NCiAg4pSC ICAgbGV0IGNlbnRlcnMgPSBBcnJheS5pbml0IG4gcmFuZG9tX2NlbnRlciBpbg0KICDilIIgICBs ZXQgY29sb3IgPSBEcmF3LihvcGFxdWUgZ3JleSkgaW4NCiAg4pSCICAgbGV0IGRyYXdfbGluZXMg cmVuZGVyZXIgPSBsZXQgb3BlbiBEcmF3IGluDQogIOKUgiAgICAgZm9yIGkgPSAwIHRvIG4gLSAy IGRvDQogIOKUgiAgICAgICBsZXQgeDAsIHkwID0gdG9fcGl4ZWxzIGNlbnRlcnMuKGkpIGluDQog IOKUgiAgICAgICBsZXQgeDEsIHkxID0gdG9fcGl4ZWxzIGNlbnRlcnMuKGkrMSkgaW4NCiAg4pSC ICAgICAgIGxpbmUgcmVuZGVyZXIgfmNvbG9yIH50aGljazo2IH54MCB+eTAgfngxIH55MQ0KICDi lIIgICAgIGRvbmUgaW4NCiAg4pSCICAgU2RsX2FyZWEuYWRkIHNkbGEgZHJhd19saW5lczsNCiAg 4pSCICAgbGV0IGRpc2NzID0gQXJyYXkubWFwaSBjcmVhdGVfZGlzYyBjZW50ZXJzIHw+IEFycmF5 LnRvX2xpc3QgaW4NCiAg4pSCICAgKCogbW92ZSB0aGUgZGlzYyB3aGVuIGNsaWNrIG9uIGl0ICop DQogIOKUgiAgIExpc3QuaXRlcmkgKGZ1biBpIGQgLT4NCiAg4pSCICAgICAgIFcub25fY2xpY2sg fmNsaWNrOihmdW4gXyAtPg0KICDilIIgCSAgY2VudGVycy4oaSkgPC0gcmFuZG9tX2NlbnRlciAw Ow0KICDilIIgCSAgU2RsX2FyZWEudXBkYXRlIHNkbGE7DQogIOKUgiAJICBsZXQgeCx5ID0gY2Vu dGVycy4oaSkgaW4NCiAg4pSCIAkgIG1vdmVfZGlzYyAoeCAtIHJhZGl1cywgeSAtIHJhZGl1cykg ZCkgKEwud2lkZ2V0IGQpKQ0KICDilIIgICAgIGRpc2NzOw0KICDilIIgICBMLnN1cGVycG9zZSB+ dzp3aWR0aCB+aDpoZWlnaHQgfmJhY2tncm91bmQgKEwucmVzaWRlbnQgc2RsdyA6OiBkaXNjcykN CiAg4pSCIA0KICDilIIgbGV0IGJvYXJkID0gQm9ndWUubWFrZSBbXSBbYXJlYV0NCiAg4pSCIA0K ICDilIIgbGV0ICgpID0gQm9ndWUucnVuIGJvYXJkDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCkZy aWRheSAwMy8wNCBJbnRlcm4gcHJlc2VudGF0aW9ucyDigJMgb3BlbiBhdHRlbmRhbmNlIQ0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9mcmlkYXktMDMtMDQtaW50ZXJuLXByZXNlbnRh dGlvbnMtb3Blbi1hdHRlbmRhbmNlLzk0MjkvMT4NCg0KDQpBeWEgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGlzIGlzIEF5YSwgb25lIG9m IHRoZSB0aHJlZSBbT3V0cmVhY2h5XSBpbnRlcm5zIHdvcmtpbmcgb24gT0NhbWwNCiAgdGhpcyB3 aW50ZXIgOmNhbWVsOiBBZnRlciAzIHZlcnkgZmFzdCBtb250aHMsIG91ciBpbnRlcm5zaGlwcyBh cmUNCiAgYWxyZWFkeSBjb21pbmcgdG8gYSBjbG9zZS4gV2UgaGF2ZSBoYWQgc3VjaCBhIGdyZWF0 IHRpbWUgd29ya2luZyBvbg0KICBvdXIgcHJvamVjdHMgYW5kIGxlYXJuaW5nIE9DYW1sIHRoYXQg d2Ugd2FudCB0byBob2xkIGFuIGV2ZW50IHRvIG1hcmsNCiAgdGhlIGVuZCBvZiB0aGUgaW50ZXJu c2hpcHMsIGFuZCB3ZSBkZWNpZGVkIHRvIG9wZW4gaXQgdXAgdG8gdGhlDQogIGNvbW11bml0eSA6 dGFkYToNCg0KICBBcyB5b3UgbWlnaHQgaGF2ZSBzZWVuIGluIHRoZSBbaW5pdGlhbCBhbm5vdW5j ZW1lbnRdLCBAcGl0YWcNCiAgQHNob25mZWRlciBAZ3MwNTEwIEB0bWF0dGlvIGFuZCBAcGtlbCBh bGwgdm9sdW50ZWVyZWQgdG8gbWVudG9yIHVzDQogIGZyb20gRGVjZW1iZXIgMjAyMSB0byBub3cu IFRoYW5rIHlvdSBhbGwgc28gc28gbXVjaCBmb3IgbWVudG9yaW5nIHVzDQogIGFuZCBpbnRyb2R1 Y2luZyB1cyB0byBPQ2FtbCA6aGVhcnQ6IDpmaXJlOiBJdCdzIGJlZW4gc3VjaCBhbiBlbmpveWFi bGUNCiAgZXhwZXJpZW5jZSENCg0KICBXZSBhcmUgaW52aXRpbmcgYW55b25lIHdobyBpcyBpbnRl cmVzdGVkIHRvIGF0dGVuZCBhIHZpcnR1YWwgc2Vzc2lvbg0KICBvZiAzIHNob3J0IHByZXNlbnRh dGlvbnMgb24gKkZyaWRheSwgTWFyY2ggNHRoLCA0LTVwbSBDRVQqICh3ZSB3aWxsDQogIHBvc3Qg dGhlIGxpbmsgdG8gam9pbiBvbiBUaHVyc2RheSkuIFRoZXJlIHdpbGwgYmUgdGltZSBmb3IgUSZB IGFmdGVyDQogIGVhY2ggcHJlc2VudGF0aW9uLCBhbmQgdGhlIHdob2xlIHNlc3Npb24gd2lsbCBi ZSByZWNvcmRlZCBhbmQgcG9zdGVkDQogIG9ubGluZSBzaG9ydGx5IGFmdGVyIGFzIHdlbGwuDQoN CiAg4oCiIEBheWM5IHdpbGwgcHJlc2VudCBvbiB1cGRhdGluZyBhIHN0YW5kYXJkIFBQWCBkZXJp dmVyIChtZW50b3JzOg0KICAgIEBwaXRhZyBAc2hvbmZlZGVyKQ0KICDigKIgQFNheVNheW8gd2ls bCBwcmVzZW50IG9uIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIG90aGVyIHVwZGF0ZXMgdG8NCiAg ICB0aGUgdnNjb2RlIGV4dGVuc2lvbiAobWVudG9yczogQHRtYXR0aW8gQGdzMDUxMCkNCiAg4oCi IEBKaWFlSyB3aWxsIHByZXNlbnQgb24gYnVpbGRpbmcgYSBiYXNpYyBtb25pdG9yaW5nIGRhc2hi b2FyZCBmb3INCiAgICBbb2NhbWwub3JnXSAobWVudG9yczogQHRtYXR0aW8pDQoNCiAgV2UgaG9w ZSB5b3UgY2FuIG1ha2UgaXQhDQoNCiAgLUBheWM5IEBTYXlTYXlvIEBKaWFlSw0KDQoNCltPdXRy ZWFjaHldIDxodHRwczovL291dHJlYWNoeS5vcmcvPg0KDQpbaW5pdGlhbCBhbm5vdW5jZW1lbnRd DQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubm91bmNpbmctb3VyLW5ldy1vdXRyZWFj aHktaW50ZXJucy84OTMyPg0KDQpbb2NhbWwub3JnXSA8aHR0cDovL29jYW1sLm9yZy8+DQoNCg0K QWZmZWN0OiBDb21wb3NhYmxlIGNvbmN1cnJlbmN5IHByaW1pdGl2ZXMgZm9yIE9DYW1sIDUuMA0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hZmZlY3QtY29tcG9zYWJs ZS1jb25jdXJyZW5jeS1wcmltaXRpdmVzLWZvci1vY2FtbC01LTAvOTQzMC8xPg0KDQoNCkRhbmll bCBCw7xuemxpIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBsb29rZWQgYSBiaXQgaW50 byB0aGUga2luZCBvZiBmaWJlciBhYnN0cmFjdGlvbiBhbmQgY29uY3VycmVuY3kNCiAgc3RydWN0 dXJlIEkgd291bGQgbGlrZSB0byB1c2Ugd2l0aCB0aGUgbmV3IHRvb2xzIE9DYW1sIDUuMCBpcyBn b2luZyB0bw0KICBvZmZlci4gIFlvdSBjYW4gZmluZCBzb21lIHJlc3VsdHMgaW4gYWZmZWN0J3Mg W2BGaWJlciddIG1vZHVsZS4NCg0KICBUaGlzIGZpYmVyIGFic3RyYWN0aW9uIHN1cHBvcnRzIHRl cm1pbmF0aW5nIGJ5IHJldHVybmluZyB2YWx1ZXMgb3INCiAgYWJub3JtYWxseSAoYnkgYWJvcnRp bmcgb3IgdmlhIGEgc3B1cmlvdXMgZXhjZXB0aW9uKS4gVGVybWluYXRpb24gb2YgYQ0KICBmaWJl ciBpcyBhbGlnbmVkIG9uIGZ1bmN0aW9uIHNjb3BlczogYWxsIHRoZSBmaWJlcnMgc3Bhd24gYnkg YSBmaWJlcg0KICBmdW5jdGlvbiBoYXZlIHRvIHRlcm1pbmF0ZSBpbiBvcmRlciBmb3IgaXQgdG8g dGVybWluYXRlLg0KDQogIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3VyIGZpYmVyIHJldHVybnMgYSB2 YWx1ZSBpdCB3YWl0cyBmb3IgaXRzIHNwYXducw0KICB0byB0ZXJtaW5hdGUgKGluIGFueSB3YXkp IGJlZm9yZSByZXR1cm5pbmcgdGhlIHZhbHVlLiBBbmQgaWYgeW91cg0KICBmaWJlciByZXR1cm5z IGFibm9ybWFsbHkgKHVuY2F1Z2h0IGVjZXB0aW9uIG9yIGV4cGxpY2l0IGFib3J0KSBpdA0KICBm aXJzdCBhYm9ydHMgYWxsIGl0cyBub24tdGVybWluYXRlZCBzcGF3bnMgYmVmb3JlIHJldHVybmlu ZyBhYm5vcm1hbGx5DQogIOKAkyB0aGlzIHByb3ZpZGVzIGFmZmVjdCdzIG5vdGlvbiBvZiBjYW5j ZWxsYXRpb24uDQoNCiAgRXhwbGljaXQgZmliZXIgYWJvcnRzIHJhaXNlIHRoZSBgQWJvcnQnIGV4 Y2VwdGlvbiBpbiBmaWJlcnMuIENvbWJpbmVkDQogIHdpdGggYSBkaXNjaXBsaW5lZCB1c2Ugb2Yg YEZ1bi5wcm90ZWN0JyBhbmQgYW4gb3B0aW9uYWwgYGZpbmFsbHknDQogIGhhbmRsZXIgc3BlY2lm aWVkIGF0IGZpYmVyIHNwYXduLCB0aGlzIGxldHMgdGhlbSByZWxlYXNlIHRoZQ0KICByZXNzb3Vy Y2VzIHRoZXkgbWF5IGhvbGQgd2hlbiBpdCdzIHRpbWUgdG8gc2F5IGdvb2RieWUuDQoNCiAgVGhl IG1vZHVsZSBhbHNvIHByb3ZpZGVzIGEgZ2VuZXJpYyB3YXkgb2YgYmxvY2tpbmcgYW5kIHVuYmxv Y2tpbmcNCiAgZmliZXJzIHRoYXQgeW91IGNhbiB1c2UgdG8gaW50ZXJmYWNlIHdpdGggeW91ciBm YXZvdXJpdGUgZXZlbnQNCiAgbG9vcC4gSXQgZG9lcyBzbyB3aXRob3V0IHJlcXVpcmluZyB0byBm aWRkbGUgd2l0aCBlZmZlY3RzLCB5b3UganVzdA0KICBuZWVkIHRvIG1ha2UganVkaWNpb3VzIHVz ZSBvZiBbYEZpYmVyLmJsb2NrJ10gYW5kIHByb3ZpZGUgYSBzdWl0YWJsZQ0KICBmdW5jdGlvbiB0 byBgRmliZXIucnVuJydzIGJ1aWx0LWluIHNjaGVkdWxlciB0byBsZXQgaXQga25vdyBhYm91dA0K ICBmaWJlcnMgdGhhdCBjYW4gYmUgdW5ibG9ja2VkLg0KDQogIEEgZ3JhYiBiYWcgb2YgY29tbWVu dHM6DQoNCiAgMS4gVGhlIGZpcnN0IGdvYWwgb2YgYWZmZWN0IGlzIHRvIHNlZWsgYSBjb25jdXJy ZW5jeSBhbmQgYWJvcnQNCiAgICAgc3RydWN0dXJlIHRoYXQgYXJlIGVhc3kgdG8gdW5kZXJzdGFu ZCwgdXNlIGFuZCBjb21wb3NlIHdpdGggZXZlbnQNCiAgICAgbG9vcHMuIFJpZ2h0IG5vdyBzb21l IGVmZmljaWVuY3kgYW5kIGltcGxlbWVudGF0aW9uIGFzcGVjdHMgbmVlZCB0bw0KICAgICBiZSBp bXByb3ZlZC4gVGhpcyB3aWxsIGxpa2VseSBjaGFuZ2UgdGhlIGV4cG9zZWQgc2V0IG9mIHByaW1p dGl2ZQ0KICAgICBlZmZlY3RzIHdoaWNoIGRvZXNuJ3QgZmVlbCBleGFjdGx5IHJpZ2h0IHlldCAo aWYgeW91IHdhbnQgdG8gYnVpbGQNCiAgICAgeW91ciBvd24gc2NoZWR1bGVyKS4NCg0KICAyLiBJ IHVzZSBhYm9ydCByYXRoZXIgdGhhbiBjYW5jZWwgdGVybWlub2xvZ3kuIEZyb20gbXkgbm9uLW5h dGl2ZQ0KICAgICBlbmdsaXNoIHNwZWFrZXIgcGVyc3BlY3RpdmUsIGNhbmNlbGxpbmcgaXMgbW9y ZSBhYm91dCBub3QgZG9pbmcNCiAgICAgc29tZXRoaW5nIHRoYXQgd2FzIHBsYW5uZWQgYnV0IGRp ZG4ndCBoYXBwZW4geWV0LiBBYm9ydGluZyBpcyBtb3JlDQogICAgIGFib3V0IHN0b3BwaW5nIHNv bWV0aGluZyB0aGF0IGlzIGdvaW5nIG9uLiBJdCBhbHNvIG1lbGRzIGJldHRlcg0KICAgICB3aXRo IHRoZSB1bmNhdWdodCBleGNlcHRpb24gY2FzZS4NCg0KICAzLiBTYXkgbm8gdG8gYHVuaXQnIHNv dXBzISBMZXQgZmliZXJzIHJldHVybiB2YWx1ZXMuDQoNCiAgNC4gQXQgdGhhdCBwb2ludCBJIGRv bid0IGZlZWwgdGhlIG5lZWQgdG8gYWRkIGEgcHJvbWlzZS9mdXR1cmUNCiAgICAgYWJzdHJhY3Rp b24gdG8gdGhlIHRvb2xib3guIFRoZSB3aG9sZSBwb2ludCBvZiBkaXJlY3Qgc3R5bGUgaXMgdG8N CiAgICAgZ2V0IHJpZCBvZiB0aGlzIGFzeW5jIG1hZG5lc3MuDQoNCiAgNS4gVGhlcmUncyBubyBz eW5jaHJvbmlzYXRpb24gc3RydWN0dXJlIHlldC4gU2VtYXBob3JlcyBhcmUgYWx3YXlzDQogICAg IHVzZWZ1bCBmb3IgdGhyb3R0bGluZyBzbyBJJ2xsIGNlcnRhaW5seSBhZGQgdGhhdCBhdCBzb21l IHBvaW50IG9yIGENCiAgICAgbW9yZSBmdW5kYW1lbnRhbCBwcmltaXRpdmUgbGlrZSBhbiBtdmFy Lg0KDQogIDYuIFRoZSBbYEZ1bml4J10gbW9kdWxlIGhhcyBhIGZldyBmaWJlciBmcmllbmRseSBg VW5peCcgbW9kdWxlDQogICAgIGZ1bmN0aW9ucyBmb3IgcGxheWluZyB3aXRoIHRpbWVycyBhbmQg dGhlIG5ldHdvcmssIHNlZSBbYHBpbmcubWwnXQ0KICAgICBmb3IgYW4gZXhhbXBsZSBvZiB1c2Uu IEluIHByYWN0aWNlIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gdXNlDQogICAgIHNvbWV0aGluZyBl bHNlIHRoYW4gYHNlbGVjdCgyKScgdGhvdWdoLiBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIG9uZQ0K ICAgICBjb3VsZCBnbyBhYm91dCB0aGlzLCBzZWUgZm9yIGV4YW1wbGUgcG9pbnQgNi4gaW4gdGhl c2UgW2Rlc2lnbg0KICAgICBub3Rlc10uDQoNCiAgNy4gVGhlIFtgbW91c2UubWwnXSBoYXMgYSBi YXNpYyBleGFtcGxlIG9uIGhvdyB0byBpbnRlcmZhY2Ugd2l0aCB0aGUNCiAgICAgU0RMIGV2ZW50 IGxvb3Agd2hpY2ggcHJvdmlkZXMgYW5vdGhlciBleGFtcGxlIG9uIGhvdyBvbmUgZ29lcyB0bw0K ICAgICBpbnRlcmZhY2UgYEZpYmVyJyB3aXRoIGV2ZW50IGxvb3BzLg0KDQogIEknbSBub3QgZnVs bHkgY29udmluY2VkIGJ5IGV2ZXJ5dGhpbmcgeWV0LiBJdCB3aWxsIGNlcnRhaW5seSBuZWVkIG9u ZQ0KICBvciB0d28gbW9yZSBkZXNpZ24gcm91bmRzLiBJZiB5b3UgdHJ5IGl0LCBmZWVsIGZyZWUg dG8gY29tbWVudCBvciBtYWtlDQogIHN1Z2dlc3Rpb25zIG9uIHRoZSBpc3N1ZSB0cmFja2VyLg0K DQogIEhvbWUgcGFnZTogPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2FmZmVjdD4NCg0K ICBBUEkgZG9jczogPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2FmZmVjdC9kb2MvPiAo b3IgYG9kaWcgZG9jDQogIGFmZmVjdCcpDQoNCiAgSW5zdGFsbDoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgNS4wLjArdHJ1bmsNCiAg4pSCIG9wYW0gcGluIGFk ZCBodHRwczovL2VycmF0aXF1ZS5jaC9yZXBvcy9hZmZlY3QuZ2l0DQogIOKUlOKUgOKUgOKUgOKU gA0KDQoNCltgRmliZXInXSA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvYWZmZWN0L2Rv Yy9GaWJlci9pbmRleC5odG1sPg0KDQpbYEZpYmVyLmJsb2NrJ10NCjxodHRwczovL2VycmF0aXF1 ZS5jaC9zb2Z0d2FyZS9hZmZlY3QvZG9jL0ZpYmVyL2luZGV4Lmh0bWwjdmFsLWJsb2NrPg0KDQpb YEZ1bml4J10gPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2FmZmVjdC9kb2MvRnVuaXgv aW5kZXguaHRtbD4NCg0KW2BwaW5nLm1sJ10NCjxodHRwczovL2dpdGh1Yi5jb20vZGJ1ZW56bGkv YWZmZWN0L2Jsb2IvbWFzdGVyL3Rlc3QvcGluZy5tbD4NCg0KW2Rlc2lnbiBub3Rlc10NCjxodHRw czovL2dpdGh1Yi5jb20vZGJ1ZW56bGkvYWZmZWN0L2Jsb2IvbWFzdGVyL0RFU0lHTi5tZD4NCg0K W2Btb3VzZS5tbCddDQo8aHR0cHM6Ly9naXRodWIuY29tL2RidWVuemxpL2FmZmVjdC9ibG9iL21h c3Rlci90ZXN0L21vdXNlLm1sPg0KDQoNClNlZ2ZhdWx0IFN5c3RlbXMgSm9pbnMgVGFyaWRlcw0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zZWdmYXVsdC1zeXN0ZW1zLWpvaW5zLXRhcmlkZXMvOTQz MS8xPg0KDQoNClRob21hcyBHYXphZ25haXJlIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgQGtheWNlZXNyayBhbmQgSSBhcmUgZGVsaWdodGVkIHRvIGFubm91bmNlIHRo YXQgU2VnZmF1bHQgU3lzdGVtcywgYQ0KICBzcGlub3V0IGZyb20gSUlULU1hZHJhcywgaXMgam9p bmluZyBUYXJpZGVzLiAgVGFyaWRlcyBoYXMgd29ya2VkDQogIGNsb3NlbHkgd2l0aCBTZWdmYXVs dCBTeXN0ZW1zIG92ZXIgdGhlIGxhc3QgY291cGxlIG9mIHllYXJzLCBtb3N0DQogIG5vdGFibHkg b24gdGhlIGF3YXJkLXdpbm5pbmcgTXVsdGljb3JlIE9DYW1sIHByb2plY3QgYW5kIHRoZQ0KICB1 cHN0cmVhbWluZyBwbGFucyBmb3IgT0NhbWwgNS4wLiBUaGlzIGFsbGlhbmNlIGZ1cnRoZXJzIHRo ZSBnb2FscyBvZg0KICBUYXJpZGVzLCBicmluZ2luZyB0aGUgY29tcGlsZXIgYW5kIGJlbmNobWFy a2luZyBleHBlcnRpc2Ugb2YgdGhlDQogIFNlZ2ZhdWx0IHRlYW0gZGlyZWN0bHkgaW50byB0aGUg VGFyaWRlcyBvcmdhbmlzYXRpb24sIHdoZXJlIGl0IGNhbiBiZQ0KICBjb21tZXJjaWFsbHkgZnVu ZGVkIGFuZCBzdXBwb3J0ZWQuDQoNCiAgQWxsIG9mIFNlZ2ZhdWx0IFN5c3RlbXPigJkgZXhpc3Rp bmcgcmVzcG9uc2liaWxpdGllcyBhbmQgb3Blbi1zb3VyY2UNCiAgY29tbWl0bWVudHMgd2lsbCBt aWdyYXRlIG92ZXIgdG8gVGFyaWRlcywgd2hlcmUgd29yayB3aWxsIGNvbnRpbnVlDQogIHRvd2Fy ZHMgdGhlIHRocmVlIG1haW4gb2JqZWN0aXZlcyBpbiAyMDIyOg0KDQogIOKAoiBSZWxlYXNpbmcg T0NhbWwgNS4wIHdpdGggc3VwcG9ydCBmb3IgZG9tYWlucyBhbmQgZWZmZWN0IGhhbmRsZXJzDQog IOKAoiBTdXBwb3J0aW5nIHRoZSBlY29zeXN0ZW0gdG8gbWlncmF0ZSB0aGUgT0NhbWwgY29tbXVu aXR5IG92ZXIgdG8NCiAgICBPQ2FtbCA1LjANCiAg4oCiIEltcHJvdmluZyBkZXZlbG9wZXIgcHJv ZHVjdGl2aXR5IGZvciBPQ2FtbCA1LjAgYnkgcmVsZWFzaW5nIHRoZSBiZXN0DQogICAgcGxhdGZv cm0gdG9vbHMNCg0KICBUaGlzIGFsbGlhbmNlIHdpbGwgY29tcGxlbWVudCB0aGUgY29tbWVyY2lh bCBvZmZlcmluZ3Mgb2YgVGFyaWRlcyDigJMNCiAgYWxyZWFkeSBzdHJlbmd0aGVuZWQgYnkgdGhl IGludGVncmF0aW9uIG9mIFtPQ2FtbCBMYWJzXSDigJMgYW5kDQogIGNvbnRyaWJ1dGUgdG8gVGFy aWRlc+KAmSBtaXNzaW9uOiBlbXBvd2VyaW5nIGRldmVsb3BlcnMsIGNvbW11bml0aWVzLA0KICBh bmQgb3JnYW5pc2F0aW9ucyB0byBhZG9wdCBPQ2FtbCBhcyB0aGVpciBwcmltYXJ5IHByb2dyYW1t aW5nDQogIGV4cGVyaWVuY2UgYnkgcHJvdmlkaW5nIHRyYWluaW5nLCBleHBlcnRpc2UsIGFuZCBk ZXZlbG9wbWVudCBzZXJ2aWNlcw0KICBhcm91bmQgdGhlIE9DYW1sIGxhbmd1YWdlLg0KDQogIFJl YWQgdGhlIGZ1bGwgYW5ub3VuY2VtZW50IFtoZXJlXSwgaW5jbHVkaW5nIGRldGFpbHMgb2Ygb3Vy IGdvYWxzIGFuZA0KICB0aGUgZm9jdXMgZm9yIDIwMjIuIFRoaXMgYWxsaWFuY2UgYnJpbmdzIHRo ZSBoZWFkY291bnQgb2YgVGFyaWRlcyB1cA0KICB0byA2MCsgcGVvcGxlLCBhbGwgd29ya2luZyB0 b3dhcmRzIG1ha2luZyBPQ2FtbCB0aGUgYmVzdCBsYW5ndWFnZSBmb3INCiAgYW55IGFuZCBldmVy eSBwcm9qZWN0LiBKb2luIG91ciB0ZWFtIGFuZCByZWFjaCBvdXQgZm9yIGNvbW1lcmNpYWwNCiAg c2VydmljZXMgYXQgW2h0dHBzOi8vdGFyaWRlcy5jb20vXS4NCg0KDQpbT0NhbWwgTGFic10gPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1sYWJzLWpvaW5zLXRhcmlkZXMvOTIyOT4N Cg0KW2hlcmVdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjItMDMtMDEtc2VnZmF1bHQt c3lzdGVtcy1qb2lucy10YXJpZGVzPg0KDQpbaHR0cHM6Ly90YXJpZGVzLmNvbS9dIDxodHRwczov L3RhcmlkZXMuY29tLz4NCg0KDQpPQ2FtbCBVc2VyIFN1cnZleSAyMDIyDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbC11c2Vy LXN1cnZleS0yMDIyLzk0MzMvMT4NCg0KDQpLaW0gTmd1eeG7hW4gYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICB3ZSBhcmUgZGVsaWdodGVkIHRvIGFubm91bmNlIHRoZSBbT0NhbWwgVXNlciBTdXJ2ZXkgMjAy Ml0uIFdpdGggdGhpcw0KICBzdXJ2ZXksIHRoZSBPQ1NGIGlzIHRyeWluZyB0byBnZXQgYSBiZXR0 ZXIgcGljdHVyZSBvZiB0aGUgT0NhbWwNCiAgY29tbXVuaXR5IGFuZCBpdHMgbmVlZHMuIEl0IHdv dWxkIGJlIHZlcnkgaGVscGZ1bCBpZiB5b3UgY291bGQgdGFrZSBhDQogIGZldyBtaW51dGVzICgx MCB0byAxNSkgdG8gZmlsbCB0aGUgc3VydmV5IGFuZCBzaGFyZSBpdCB3aXRoIG90aGVyDQogIE9D YW1sIHByb2dyYW1tZXJzLg0KDQogIFtodHRwczovL2Zvcm1zLmdsZS9vS3kySm96MWNaaENQTnRm Nl0NCg0KICBUaGUgc3VydmV5IGlzIHJ1biBieSB0aGUgW09DYW1sIFNvZnR3YXJlIEZvdW5kYXRp b25dLiBJdCBidWlsZHMgb24NCiAgW3RoZSBwcmV2aW91cyBpdGVyYXRpb25dIGlzc3VlZCBpbiAy MDIwLiBUaGUgcmVzdWx0cyB3aWxsIGJlIHB1Ymxpc2hlZA0KICBoZXJlIG9uIGRpc2N1c3MgYW5k IG9uIHRoZSBbd2Vic2l0ZSBvZiB0aGUgT0NTRl0uIFdlIHdvdWxkIGxpa2UgdG8NCiAgcGFydGlj dWxhcmx5IHRoYW5rIEBjanIgZm9yIGhpcyBoZWxwIGFzIHdlbGwgYXMgZXZlcnlvbmUgd2hvIGNv bW1lbnRlZA0KICBvbiB0aGUgcHJldmlvdXMgc3VydmV5LiBXZSB0cmllZCBvdXIgYmVzdCB0byB0 YWtlIGFsbCByZW1hcmtzIGludG8NCiAgYWNjb3VudCBidXQgc3VyZWx5IG1pc3NlZCBzb21ldGhp bmcuIERvbid0IGhlc2l0YXRlIHRvIGdpdmUgdXMgeW91cg0KICBmZWVkYmFjayAoeW91IGNhbiBw b3N0IGhlcmUgb3Igc2VuZCBtZSBhIG1lc3NhZ2UvZW1haWwpLg0KDQogIFRoZSBzdXJ2ZXkgd2ls bCByZW1haW4gb3BlbmVkIHVudGlsIE1hcmNoIDExdGggMjAyMiAoQU9FKS4NCg0KDQpbT0NhbWwg VXNlciBTdXJ2ZXkgMjAyMl0gPGh0dHBzOi8vZm9ybXMuZ2xlL29LeTJKb3oxY1poQ1BOdGY2Pg0K DQpbaHR0cHM6Ly9mb3Jtcy5nbGUvb0t5MkpvejFjWmhDUE50ZjZdDQo8aHR0cHM6Ly9mb3Jtcy5n bGUvb0t5MkpvejFjWmhDUE50ZjY+DQoNCltPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uXSA8aHR0 cHM6Ly9vY2FtbC1zZi5vcmcvPg0KDQpbdGhlIHByZXZpb3VzIGl0ZXJhdGlvbl0NCjxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sLXVzZXItc3VydmV5LTIwMjAvNjYyND4NCg0K W3dlYnNpdGUgb2YgdGhlIE9DU0ZdIDxodHRwczovL29jYW1sLXNmLm9yZy8+DQoNCg0KT2xkIENX Tg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dO LCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3Us IG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0 aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVy eSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFu IFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBw b2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBv bW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5p ZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxo dHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= 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 February 22 to March = 01, 2022.

data-encoding.0.5 release

Rapha=C3=ABl Proust announced

On behalf of Nomadic Labs, I'= m happy to announce the release of data-encoding version 0.5.

This new version brings several bug fixes, some increased test coverage, mi= nor improvements in the API, and a major new feature:

Compact encodings: sub-byte tag sizes

This new version provides a new set of combinators for compact encodings. These compact encodings will handle all the verbose and error-prone bit-twidling process needed to combine multiple= sub-byte discriminators into a single byte-size one.

E.g., the encoding let e1 =3D either (either bool unit) (option bool)= uses three bits in the shared tag and zero bytes after that; the encoding let e2 =3D either int32 int64 uses one bit in the= shared tag and either 4 or 8 bytes to represent the integer; the product encoding let ee =3D tup2 e1 e2 uses four (3 + 1) b= its in the shared tag and either 4 or 8 bytes to represent the integer of e2.

How to get

The code is available under MIT license on https://gitlab.com/nomadic-labs/data-encoding.

It can be installed via opam.

Dario Teixeira asked and Rapha=C3=ABl Proust replied<= /h3>

Hi @raphael-proust! I have a question regarding the connection between data-encoding and json-data-encoding, also developed at Nomadic Labs. The latter seems tied to JSON, whereas the forme= r is more flexible, supporting also binary encodings. However, since data-encoding also supports JSON, do= esn't it subsume json-data-encoding completely?

The data-encoding library uses json-data-encoding= for its JSON backend. It delegates conversion from OCaml values into and from JSON to the primitives provided in the interface of jso= n-data-encoding.

In a way, yes, as an end-user you don't need to use json-data-encodin= g directly because you can use the Json module of data-encoding instead. There are three possible reas= ons why you might add json-data-encoding as a (non-transitive) dependency to your project and use it directly in your cod= e:

  • You want to keep the dependency set and the number of abstraction layer= s as small as possible. E.g., in order to reduce binary size.
  • You want some static guarantees that some encodings are only every used= for JSON. E.g., in your logging system.
  • You need to define a JSON encoding which is rejected by data-enco= ding on grounds that it is invalid in binary. Note that
    • This is very specific to some combinators but basically some combinator= s will reject their inputs (raise Invalid_argument) because us= ing the serialiser would lead to undecodable data. Most typically, this hap= pens if you try to concatenate two fields of unknown length. Decoding the r= esult becomes a guessing game as to were one field stops and where the next= begins. These could easily be represented as an array in JSON which includ= es all the delimiters you need to decode it.
    • There are other workarounds (e.g., prefixing the fields with a length f= ield), but going for the JSON encoding directly is a valid approach if you = only need JSON.

Rapha=C3=ABl Proust later announced

Version 0.5.1 of the data-encoding has just been released.

This is a bugfix release making one of the library's internal checks more p= ermissive. Without this fix (i.e., using version 0.5), some valid encodings are rejected (raising Invalid_argu= ment) by the library.

You can update via opam: opam install data-encoding.0.5.1

Tutorial: Roguelike with effect handlers

art-w announced

The recent conversations about eio 0.1 and agnostic blocking have made me very curious about effect handlers. The multicore team has done an awesome job with their tutor= ials, examples and talks, but the laymen have been too quiet for such an exciting feature! Where are all the blog posts about how = "you could have invented algebraic effects" and "one-shot continuations are like spaghetti"?

In any case, I'm hoping to tease some of you into trying them out with a simple tutori= al about programming a roguelike with effect handlers :)

There's nothing new here besides the fun use-case! So if you already have a= n intuitive understanding of the syntax and motivations, you may be more interested by a deeper look at the scope of effect handlers – and a soft introduction to some less common features of the type system. (this link was previously posted deep into = the eio thread)

I would be grateful if you spot any mistake! I'm also curious of other fun = applications for effect handlers… and if you feel like sharing your own surprises and discoveries, I believe it coul= d really help others learn faster :)

Kiran Gopinathan then said

Great blog post! That seems like a very elegant implementation!

Funny you should make a rougelike :smiley: , I guess effect handlers + game= s might be popular for games, because I also had a blog post about effect handlers and their applications, in parti= cular for games, although in my case it was for animations:

https://gopiandcode.uk/logs/log-bye-bye-monads-algebraic-effects.htm= l

gasche also replied

Note: the "upstream" status of effect handlers is a little uncertain/confus= ing right now. Your blog post (I didn't get a chance to read it yet, but it sounds very nice!) uses the experimenta= l syntax of multicore-4.12+effects, but that syntax was intentionally not upstreamed, and it will not= be part of OCaml 5.0.

I think there is a risk of confusion because the community is aware that Mu= lticore OCaml has effect handlers, and also that Multicore OCaml has been merged upstream. So it can be tempting t= o believe that the upcoming OCaml release (or maybe one or two releases after that, we said the first Multicore relea= se would be more like a preview) will support effect handlers as a language feature. It will not! Effects as a la= nguage feature were removed from Multicore OCaml before the upstream merge. And no one knows if/when they will = be supported upstream.

So: I think that your blog posts on using effect handlers could have somewh= ere a short mention that the code is using an experimental extension of OCaml that is not supported by the upstream im= plementation.

The reasoning for this choice is that we want to give a chance to a type sy= stem for effect handlers, but that still need quite a bit more time than the Multicore runtime itself. We don't want= to encourage the ecosystem to rely on untyped effects, if it means a lot of pain upgrading to typed effects later= (or risk having to support both).

5.0 only contains basic support for effect handlers as a runtime primiti= ve, but dos not support handlers as a language feature. I think they should be considered experimental: yo= u can rely on them for their intended purpose of exposing a flexible interface for concurrent fibers, but uses beyond tha= t may break in the future.

So, in a sense, we don't want people to use them. It's of course fine to us= e experimental features from experimental forks of the OCaml compiler (effect handlers, modular implicits or explicit= s, runtime type representations and what not), and the people working on these experimental features do benefit from= other people trying them and giving them feedback. But we don't want people to depend on it in production, wh= atever that means. (For example, code using it is likely to get stuck on 4.12 forever and never see an upgrade to upcoming= OCaml versions, although of course people could choose to port the experimental branch forward.)

For Diversity and the OCaml Community: Outreachy Summer 2022

Sonja Heinze announced

Just in case anyone is actually interested in this: the project submission = deadline has been extended from March 4th to March 23rd. So the updated timeline now looks as follows:

3D"534ca9a08bce=

where 2. and 3. probably need to be done a bit in parallel.

Bogue, the OCaml GUI

sanette announced

Hi, some new developments. I have implemented a new Sdl_area w= idget where one can conveniently issue any SDL function (from the SDL Renderer API).

Here is (below) the new 'labelled graph' example. In this example I am usin= g regular "label" widgets for creating the nodes, and I am using an Sdl_area for drawing the lines.

The nice things for labels to be regular widgets is that one can click on t= hem. To demonstrate this, in this example they react to a click by jumping to another random location (with animation= ).

3D=

3D"d6958e266f27=

open Bogue
module W =3D Widget
module L =3D Layout

let n =3D 15 (* number of discs *)
let radius =3D 20
let width =3D 800
let height =3D 600

let c =3D Draw.find_color "#e5b92c"
let cb =3D Draw.find_color "#7b6b35"
let disc_style =3D =
Style.(
    create ~border:(
      mk_border ~radius (mk_line ~color:Draw.(opaque c) ~width:1 ~style:Solid =
()))
      ~background:(color_bg Draw.(opaque cb)) ())

let background =3D =
L.style_bg Style.(
    of_bg (gradient ~angle:45. Draw.[opaque grey; opaque black]))

let fg =3D Draw.(opaque white)

let create_disc i (x,y) =3D
  let w =3D 2*radius + 1 in
  let bg =3D Box.create ~style:disc_style ~width:w ~he=
ight:w () in
  W.label ~fg (string_of_int i)
  |> L.resident ~background:(<=
span style=3D"color: #228b22;">L.box_bg bg) ~x:(x-radius) ~y:(y-r=
adius) ~w ~h:w

let move_disc (x,y) d =3D
  let (x0, y0)=
 =3D L.xpos d, L.ypos d in
  L.animate_x d (Avar.fromto x0 x);
  L.animate_y d (Avar.fromto y0 y)

let random_center _=
 =3D
  radius + Random.int (width - 2*rad=
ius),
  radius + Random.int (height - 2*ra=
dius)

let area =3D
  let sdlw =3D W.sdl_area ~w:width ~h:height () in
  let sdla =3D W.get_sdl_area sdlw in<=
/span>
  let centers =3D Arr=
ay.init n random_center in
  let color =3D Draw.=
(opaque grey) in<=
/span>
  let draw_lines rend=
erer =3D let open Draw in
    for i =3D 0 to n - 2 do
      let x0, y0 =3D to_pixels centers.(i) in
      let x1, y1 =3D to_pixels centers.(i+1) in
      line renderer ~color ~thick:6 =
~x0 ~y0 ~x1 ~y1
    done in
  Sdl_area.add sdla draw_lines;
  let discs =3D Array=
.mapi create_disc centers |> Array.to_list in
  (* move the disc when click on it *)
  List.iteri (fun i d ->
      W.on_click ~click:(fun _ ->
          centers.(i) <- random_center 0;
          Sdl_area.update sdla;
          let x,y =3D centers.(i) in
          move_disc (x - radius, y - radius) d) (L.widget d))
    discs;
  L.superpose ~w:width ~h:height =
~background (L.resident sdlw :: discs)

let board =3D Bogue=
.make []<=
/span> [area]

let () =3D Bogue.run board

Friday 03/04 Intern presentations – open attendance!

Aya announced

This is Aya, one of the three Outreachy<= /a> interns working on OCaml this winter :camel: After 3 very fast months, our internships are already coming to a close. We have = had such a great time working on our projects and learning OCaml that we want to hold an event to mark the end o= f the internships, and we decided to open it up to the community :tada:

As you might have seen in the initial announcement, @pitag @shonfeder @gs0510 @tmattio and @pkel all volunteered to mentor us from December 2021 to now. = Thank you all so so much for mentoring us and introducing us to OCaml :heart: :fire: It's been such an enjoyable expe= rience!

We are inviting anyone who is interested to attend a virtual session of 3 s= hort presentations on Friday, March 4th, 4-5pm CET (we will post the link to join on Thursday). There will be ti= me for Q&A after each presentation, and the whole session will be recorded and posted online shortly after as well.

  • @ayc9 will present on updating a standard PPX deriver (mentors: @pitag = @shonfeder)
  • @SaySayo will present on syntax highlighting and other updates to the v= scode extension (mentors: @tmattio @gs0510)
  • @JiaeK will present on building a basic monitoring dashboard for ocaml.org (mentors: @tmattio)

We hope you can make it!

-@ayc9 @SaySayo @JiaeK

Affect: Composable concurrency primitives for OCaml 5.0

Daniel B=C3=BCnzli announced

I looked a bit into the kind of fiber abstraction and concurrency structure= I would like to use with the new tools OCaml 5.0 is going to offer. You can find some results in affect's Fiber module.

This fiber abstraction supports terminating by returning values or abnormal= ly (by aborting or via a spurious exception). Termination of a fiber is aligned on function scopes: all the f= ibers spawn by a fiber function have to terminate in order for it to terminate.

This means that if your fiber returns a value it waits for its spawns to te= rminate (in any way) before returning the value. And if your fiber returns abnormally (uncaught eception or explicit = abort) it first aborts all its non-terminated spawns before returning abnormally =E2=80=93 this provides a= ffect's notion of cancellation.

Explicit fiber aborts raise the Abort exception in fibers. Com= bined with a disciplined use of Fun.protect and an optional finally handler specified at fiber spawn, this lets t= hem release the ressources they may hold when it's time to say goodbye.

The module also provides a generic way of blocking and unblocking fibers th= at you can use to interface with your favourite event loop. It does so without requiring to fiddle with effects, = you just need to make judicious use of Fiber.block and provide a suitable function to Fiber.run's built-in scheduler to let it know about fibers = that can be unblocked.

A grab bag of comments:

  1. The first goal of affect is to seek a concurrency and abort structure t= hat are easy to understand, use and compose with event loops. Right now som= e efficiency and implementation aspects need to be improved. This will like= ly change the exposed set of primitive effects which doesn't feel exactly r= ight yet (if you want to build your own scheduler).
  2. I use abort rather than cancel terminology. From my non-native english = speaker perspective, cancelling is more about not doing something that was = planned but didn't happen yet. Aborting is more about stopping something th= at is going on. It also melds better with the uncaught exception case.
  3. Say no to unit soups! Let fibers return values.
  4. At that point I don't feel the need to add a promise/future abstraction= to the toolbox. The whole point of direct style is to get rid of this asyn= c madness.
  5. There's no synchronisation structure yet. Semaphores are always useful = for throttling so I'll certainly add that at some point or a more fundament= al primitive like an mvar.
  6. The Funix module has a few fiber friendly Unix= module functions for playing with timers and the network, see ping.ml for an example of use. In practice you want to be able to use som= ething else than select(2) though. There are various ways one = could go about this, see for example point 6. in these design notes.
  7. The mouse.ml has a basic example on how to interface wit= h the SDL event loop which provides another example on how one goes to inte= rface Fiber with event loops.

I'm not fully convinced by everything yet. It will certainly need one or tw= o more design rounds. If you try it, feel free to comment or make suggestio= ns on the issue tracker.

Home page: https://erratiq= ue.ch/software/affect

API docs: https://err= atique.ch/software/affect/doc/ (or odig doc affect)

Install:

opam switch create 5.0.0+trunk
opam pin add https://erratique.ch/repos/affect.git

Segfault Systems Joins Tarides

Thomas Gazagnaire announced

@kayceesrk and I are delighted to announce that Segfault Systems, a spinout= from IIT-Madras, is joining Tarides. Tarides has worked closely with Segfault Systems over the last couple of ye= ars, most notably on the award-winning Multicore OCaml project and the upstreaming plans for OCaml 5.0. This allia= nce furthers the goals of Tarides, bringing the compiler and benchmarking expertise of the Segfault team direc= tly into the Tarides organisation, where it can be commercially funded and supported.

All of Segfault Systems=E2=80=99 existing responsibilities and open-source = commitments will migrate over to Tarides, where work will continue towards the three main objectives in 2022:

  • Releasing OCaml 5.0 with support for domains and effect handlers
  • Supporting the ecosystem to migrate the OCaml community over to OCaml 5= .0
  • Improving developer productivity for OCaml 5.0 by releasing the best pl= atform tools

This alliance will complement the commercial offerings of Tarides – = already strengthened by the integration of OCaml= Labs – and contribute to Tarides=E2=80=99 mission: empowering developers, communities, and organisations to adopt OCaml as the= ir primary programming experience by providing training, expertise, and development services around the OCaml la= nguage.

Read the full announcement here, including details of our goals and the focus for 2022. This alliance brings the headc= ount of Tarides up to 60+ people, all working towards making OCaml the best language for any and every project. J= oin our team and reach out for commercial services at https://tarides.com/.

OCaml User Survey 2022

Kim Nguy=E1=BB=85n announced

we are delighted to announce the OCaml User Survey 2022. With this survey, the OCSF is trying to get a better picture of the OCaml community and its needs= . It would be very helpful if you could take a few minutes (10 to 15) to fill the survey and share it with other OC= aml programmers.

https://forms.gle/oKy2Joz1c= ZhCPNtf6

The survey is run by the OCaml Software F= oundation. It builds on the previous iteration issued in 2020. The results will be published here on discuss and on the website of th= e OCSF. We would like to particularly thank @cjr for his help as well as everyone who commented on the previous survey. We t= ried our best to take all remarks into account but surely missed something. Don't hesitate to give us your feedbac= k (you can post here or send me a message/email).

The survey will remain opened until March 11th 2022 (AOE).

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 online.

--=-=-=--