From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=IRd5YoWO; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=hdlrKxO6; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id B57AB4003C for ; Tue, 28 Jan 2025 13:24:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=DF0ImG5ugWWdtZPx+L8J8dteqTTPPA7KwZy/a2ZMIsU=; b=IRd5YoWOXrFiujY+L6YC148fqCofHzVAgbBa7ZLmRREwAuhMe8dhyKvc 6ogAfymREGZ0ZmEN6Z2Vc+j+xEvz2EDo+gcpj2t8W51OkgHPlVtTU3egx nPVx5cx5ffVebOvSaIRxCh3JeDwf0eH0p5SfvAnB8TMSs/0rFLNGmUY2S 4=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.13,241,1732575600"; d="scan'208,217";a="205377445" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 28 Jan 2025 14:24:39 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 837DBE00B7; Tue, 28 Jan 2025 14:24:39 +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 396FBE00A5 for ; Tue, 28 Jan 2025 14:24:33 +0100 (CET) IronPort-SDR: 6798da8f_7BKMba8aClt6e8M64iXVYQWY8pPL+vqZDLAzcunPxKq0jcN TIpRVqGFIjc5F/QZRmQD+TfRIzPFKD6RManM7NA== X-IPAS-Result: =?us-ascii?q?A0FNFABT2ZhngSIeaIFaglwCgT9bDRsZAWNVBTMHCEgDh?= =?us-ascii?q?FODTwmOGDNjkDeKeIJ7AxgWIxQBAwENLgEFDQECBAEBAwECAYIMgi5ABAICF?= =?us-ascii?q?opfAh8GAQQzBg4BAgQBAQEBAwIDAQEBAQEBEAEBBQEBAQIBAQIEBgECEAEBP?= =?us-ascii?q?QVJhXsNSQEBAQEBAQEBBQSBa1FUHV4DAwEDBQEGAS8BAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAggEAQcHBAcXBAENHEABC?= =?us-ascii?q?AoTAQEpBQEBCBgjAxAEAQYDAgQNATUDARMBEhQFAQICAYILFEWCH0UDBAEMB?= =?us-ascii?q?pgwmzsQeoEygQGCDAEBBoEIPgICBAEJAwEOCSbaBoFkCYEwGIVrgkkaASpIa?= =?us-ascii?q?gKESAmEMycPgVVEgRWCKEoHb4I/FgwBAQEBARdEOScBAQIGRQmDJYJpghwXS?= =?us-ascii?q?3p+gQdeexGBbIRoEoIVHlqBH25PHR0vRoEPVIEvgVyDCz0BgRASiTiBRyIDJ?= =?us-ascii?q?jMsAVUTFwsHBWGBEAMrNjGBSXs5gg5pSTcCDQI1gh4kWIIrgx+BPYRFhFOFX?= =?us-ascii?q?YIUghGGMR1AAwttPTcUG50TCTU2ATyCexUfBw4KAS0GAg8DAxQTAyABLQETC?= =?us-ascii?q?A4CBRsCLgMFBR4KBwUHAwUTEAIIDQ4bAQINGQUBCQINFRgDghCFR4puDBAYK?= =?us-ascii?q?gJ1nGqUVTQHhB6BXQYMiEg9gSSSJINXhASBV4svhwCSSSKYWiKCNoclgSUJg?= =?us-ascii?q?W9qlScmBgQcGWKEO4F9JDxvARoDAwkHMxowQ4JnCQkNMBwPileHRIEBPYEmg?= =?us-ascii?q?XQ7gSjDMwJCNQEBAQEPKQIHAQoBAQMJhUUdAQFpZYE2ghduhCxuXQEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:aH8TpKwFBR2QRRyXLch6t+eawirEfRIJ4+MujC+fZmUNrF6WrkUDn 2UXCm6PM/jfZTOjL90iYYjk/RhSuZ7SzYAyT1c//FhgHilAwSbnLYTAfx2oZ0t+DeWaERk5t 51GAjXkBJppJpMJjk71atANlVEliefSAOCU5NfsYkhZXRVjRDoqlSVtkus4hp8AqdWiCmthg /uryyHkEAHjgmUc3l48sfrZ9Us25qSq4lv0g3RnDRx1lA+G/5UqJMlHTU2BByOQapVZGOe8W 9HCwNmRlo8O10pF5nuNy94XQ2VSKlLgFVDmZkl+B8BOtiN/Shkaic7XAhazhXB/0F1ll/gpo DlEWAfZpQ0BZsUgk8xFO/VU/r0X0QSrN9YrLFDm2fF/wXEqfFO05sdxFm9qY7Em2eN6K2UW6 8wdeREkO0Xra+KemNpXS8Fplp1lNM7vLZ8SsXFmzCjEALAhW5+rr6fivIUJmm5o2oYVRbCFO 6L1ahI3BPjESyZ1AQ9CCKtilbKVuyzndDlJtF+epaw2+nXeigtr3+3kNNPTPMeBRcBUglqwr GXb+W/0GVcfaMzZziCKmp6prrWXwHikB9lDTNVU8NZPjGSDx14eESEobhihrPK+pk3mes9Af hl8Fi0G9vVuqhf0FrERRSaQq3eBulsYWsFMO/Yr7RmEjKvS+QeQQGYeJgOtc/QjpJZwXTsux 0OElNPvBCVyvfuSU331GqqoQS2aYQ0nMnUsOXE4cygA7vPn+J8Di0PuZ4M2eEKqteHdFTb1y jGMiSExgbQPkMIGv5lXG3ic3FpAQbCSHmYIChXrY46z0u9uTKCfD7FEBHDe/a8GNIGdX0WMt 3gCmtGD4aYJF57leM2xrAclQurBCxWtaWO0bbtT838JrWXFF5mLJ9A43d2GDB01WvvogBewC KMphStf5YVIIFyhZrJtboS6BqwClPe7RYy9DK+LPooeM/CdkTNrGgkyOyZ8OEixzyARfV0XY v93jO7yUCtBV8yLMhLsH7lGuVPU+szO7TiOGc6gkEzPPUu2aXWSTbpNKFyKf/w056OCoRzI/ p5SL9CB031ivB7WP0HqHXooBQlSdxATXMmuw+QOL77rH+aTMDtwYxMn6elwI9Q990mU/8+Ul kyAtrhwkwqm3SSZdFnQMRiOqtrHBP5CkJ7yBgR0VX7A5pTpSd/HAH43JspvL4o0vvdu1+B1R PQjcsCNSKYHADfe9jhXKdG3oIV+fV75zUiDLgi0UggZJpRAfg3u/sO7Xw3N8CJVMDG7m/Fjq JKd1yTaY6E5eSJcMOjsZsiSkmyB5UompLoqXm/jAMViR0H3wY07dw3zlqAWJu8PGzXixxyb9 QecWikFlLPzsaswqIHErv2apIKiEs9VPElTL0/E55mYaAjY+WuCx9dbceCqJDryakL9yJ+AV 850kc7uEaQgsg5RkoxeF71L8/oP1+H3reUH8jU+TWT5UVu7L5hBfF+E5JBrnY9QzOZ7vQCWZ Bq+yuNCM+/UBPK/QU8jHyt7XOGtzvpOpyLz684yK0DE5CNa2rqLfEFRHhuUghxmM7pHH9I58 NglpfIpxVSzujgyPvaCqxJkxWCGA3gDcqcg77UxIovgjCg1wVBjP73YLALL46+0VtYdCXlyf weoh5fDiY9MmWvEUX44TkbW0cRn2J8hhRFtzX05HWqvpObrvPEM8SN0zSUWVSVQlxVO7PJyM DNkNmpzPqS/wA1rj8liAUGpQl1kP0CG8Bbhllcmqm/QYBSwXVzzKEk4aPe/7WEC0mdmZjMA1 qqp+GXkdjfLfc/KwSo5X3B+mcHjVdBc8g7jmtitOtasRr0WQGPCrPe1RGwqrxDHP5sAtHffr 7M3wNcqOLzJCyEAhoYaVa+Y7O00YzKZLjVgRfpBwvs4LVvEcmvv5QnUelGDQeITFfnk6kTiN tdPIPhIXBGA1CqjiDAXKKoPAr1sls4S+9swVeL3FFECroeggGJlgLDI+gj6oV0bcdFkvMI+C 4HWLhapMGibg1lKkG7s8uhAHEeFYuc/WQ6t59Dtrd01FK8Cvtp8LmA08L+/5EuOPCVdohm7g QLkZo3t9dJE97hCpYXXP594N12GEu+rDOWs2yKvgutKduLKYJvvtRtKi1zJPDZ2HLo2WvZon +6d7dLY4kHMk+suWFDnn72ERrh79OSpfe9tKsmsBmJrrSiDf87N4hU45GGzL6JSou5d/sWKQ wiZatO6UNwoB+dm23xebhZBHyYnC6jYarnqoQW/pa+uDicx/BPmLtT901PUdkBeKzE1PqPhB j/Ou/qB4s5SqKJODkQmA9BkG5pJH0/xa5A5dtHetSiqMUfwuwms4oDdrBsH7S3HLlKmE8ygu JLMeUXYRSSI4arNyIlUjpx2shgpF01CuOgXfH8G2ttImju/XX8nL+McDM08MatqsBfOjbP2W DKcS1EZK3TNbWwRO1G0qtHuRRyWCeEyK8/0bG5htV+dbyCtQpiMGv19/yNn+G17YSbn0PrhE 9wF53nsJVKk9/mFnwrICiCT2o+LB882x07kPWj4g5W0GxEaEKkH33xnHRNQWGrACc6leIDjO z0uXW4dKK2kYReZLCqiUyc99NIlUPfHxTI1ayyC25Da55Xdy/dPoBE6E/+myaUNNazmO5ZXL U4ahAKxD6S+wnsXqLcksNIvgLZpBLSMBMfSwGoPg+ENt/nY11nL9P/uUcbCoA/ONeKf/57ge uGQ3kUD IronPort-HdrOrdr: A9a23:nJRbx6qP7aRlQDkgKKbdlOcaV5oGeYIsimQD101hICG9E/bo7v xG+c5w6faaskdyZJhNo6HiBEDiexPhHPxOkO0s1N6ZNWGMhILCFvAE0WKN+UyHJwTOssBYkY hte7VjE9HrZGIK6PrS0U2XF5IPzrC8n5xARt2z856ud2xXgm1bgTuRwzz7LnFL X-Talos-CUID: 9a23:4J7m4WNw10InZe5DAAxV61Q6Rp4ZTF7YwV3Ue1GIDDdIYejA X-Talos-MUID: 9a23:fa28RAaSqUhuxOBTkjPVlDBQOd5U3Z/tEk0GlrkF4+iZKnkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.13,241,1732575600"; d="scan'208,217";a="205377390" X-MGA-submission: =?us-ascii?q?MDFRqbQrN6TJMHteUAU6THQkrl1fC3nMVGdxUG?= =?us-ascii?q?ax1qZahST8qW0pKHkrxEoNh3f+ho+bYKknnuvr4t1i1Sr86CEH1TnVZC?= =?us-ascii?q?KQevMYnNBvwMIxxmc3UvpuUjR4vvaTd2zl0p6l/SmS8sxGVwraY5t2yQ?= =?us-ascii?q?miBdRrx/vd3zNx+WT+3hKwdw=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; 28 Jan 2025 14:24:31 +0100 Received: from TM.local (unknown [185.252.130.169]) (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 039F9564A98; Tue, 28 Jan 2025 14:24:29 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1738070670; bh=XLVhFqAGuruWDyf1T/xx22RouhVoq1SEgZsczs/nqms=; h=From:To:Subject:Date:Message-ID; b=hdlrKxO6gwbnIqB+FAs4fLD+45PKN72KSAlkttekz+3RZ2j+AfPF+zFdWLXoQJrqG EAuKqOUJDgHe7UMjGtpZ++gppnBPTxNmnnVDpkCoAIJBYQM96E89ftSBHHU9xOPi34 5c+eFTF9114QHc1ppMwqED7XnV8evOPL6JbqSAy4= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 28 Jan 2025 14:24:23 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 28 14:24:31 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.455807, queueID=BBE83564A99 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: 19258 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 ZWsgb2YgSmFudWFyeSAyMSB0byAyOCwNCjIwMjUuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KR29vZ2xl IFN1bW1lciBvZiBDb2RlDQpNZXJsaW4gYW5kIE9DYW1sLUxTUCBzdXBwb3J0IGV4cGVyaW1lbnRh bCBwcm9qZWN0LXdpZGUgcmVuYW1pbmcNCnFjaGVjay1saW4gYW5kIHFjaGVjay1zdG0gMC4yDQpE dW5lIDMuMTcNCk9kb2MgMyBCZXRhIFJlbGVhc2UNCjIwMjQgYXQgT0NhbWxQcm8NCk9sZCBDV04N Cg0KDQpHb29nbGUgU3VtbWVyIG9mIENvZGUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvZ29vZ2xlLXN1bW1lci1vZi1jb2RlLzMxOTYvMTI+DQoNCg0K QW50b24gS29jaGtvdiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lISBJ ZiB5b3UgcGxhbiB0byBhcHBseSB0aGlzIHllYXIgZm9yIHRoZSBHb29nbGUgU3VtbWVyIG9mDQog IENvZGUsIGl0IHN0YXJ0cyBvbiBKYW51YXJ5IDI3IGFuZCBlbmRzIG9uIEZlYnJ1cmFyeSAxMToN CiAgPGh0dHBzOi8vb3BlbnNvdXJjZS5nb29nbGVibG9nLmNvbS8yMDI1LzAxL2dvb2dsZS1zdW1t ZXItb2YtY29kZS0yMDI1LWlzLWhlcmUuaHRtbD4NCg0KDQpNZXJsaW4gYW5kIE9DYW1sLUxTUCBz dXBwb3J0IGV4cGVyaW1lbnRhbCBwcm9qZWN0LXdpZGUgcmVuYW1pbmcNCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1l cmxpbi1hbmQtb2NhbWwtbHNwLXN1cHBvcnQtZXhwZXJpbWVudGFsLXByb2plY3Qtd2lkZS1yZW5h bWluZy8xNjAwOC8xPg0KDQoNCnZkcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gZGVsaWdodGVkIHRvIGFubm91bmNlIHRoYXQgdGhl IGxhdGVzdCByZWxlYXNlcyBvZiBNZXJsaW4NCiAgKGA1LjQuMS01MDMnKSBhbmQgT0NhbWwtTFNQ IChgMS4yMi4wJykgZm9yIE9DYW1sIDUuMyBwcm92aWRlDQogIGV4cGVyaW1lbnRhbCBzdXBwb3J0 IGZvciBfcHJvamVjdC13aWRlXyByZW5hbWluZyBvZiBzeW1ib2xzLg0KDQogIFVzZXJzIG9mIFt2 c2NvZGUtb2NhbWwtcGxhdGZvcm1dLCBbb2NhbWwtZWdsb3RdIG9yIGFueSBnZW5lcmljIExTUA0K ICBjbGllbnQgY2FuIGV4cGVyaW1lbnQgd2l0aCB0aGUgbmV3IGZlYXR1cmUgcmlnaHQgbm93IHZp YSB0aGUgc3RhbmRhcmQNCiAgYFJlbmFtZScgZmVhdHVyZSBvZiB0aGVpciBmYXZvcml0ZSBlZGl0 b3JzLiAoVGhpcyBpcyBub3QgZW5hYmxlZCBpbg0KICB0aGUgc3RhbmRhcmQgRW1hY3MgYW5kIFZp bSBtb2RlcyB5ZXQuKQ0KDQogIEFsbCBwcm9qZWN0LXdpZGUgZmVhdHVyZXMgcmVxdWlyZSBbdGhl IGluZGV4ZXJdIHRvIGJlIGluc3RhbGxlZCBhbmQgYW4NCiAgdXAtdG8gZGF0ZSBpbmRleCBidWls dCB3aXRoIGBkdW5lIGJ1aWxkIEBvY2FtbC1pbmRleCAtLXdhdGNoJyAod2Ugb25seQ0KICBzaGlw IHJ1bGVzIGZvciBEdW5lLCBidXQgdGhlIGluZGV4ZXIgaXRzZWxmIGlzIGFnbm9zdGljKS4NCg0K ICBUaGlzIGlzIGEgY29tcGxleCBmZWF0dXJlIGluIGFuIGV4cGVyaW1lbnRhbCBzdGF0ZSwgcGxl YXNlIHJlcG9ydCBhbnkNCiAgaXNzdWUgeW91IG1pZ2h0IGVuY291bnRlciB0byBbTWVybGluJ3Mg aXNzdWUgdHJhY2tlcl0uDQoNCiAgPGh0dHBzOi8vdXMxLmRpc2NvdXJzZS1jZG4uY29tL2ZsZXgw MjAvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC9hL2ExYmY4YmU0MjdkYTlmMTFkMmU2NTcxN2Vi MDEwMDc3OGVlYzlhYzMuZ2lmPg0KDQogICpDb21wbGV0ZSBjaGFuZ2Vsb2cqDQoNCg0KW3ZzY29k ZS1vY2FtbC1wbGF0Zm9ybV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWxsYWJzL3ZzY29kZS1v Y2FtbC1wbGF0Zm9ybS8+DQoNCltvY2FtbC1lZ2xvdF0NCjxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLXJlbGVhc2Utb2Ytb2NhbWwtZWdsb3QtMS0wLTAvMTU5Nzg+DQoNClt0aGUgaW5k ZXhlcl0gPGh0dHBzOi8vb2NhbWwub3JnL3Avb2NhbWwtaW5kZXgvbGF0ZXN0Pg0KDQpbTWVybGlu J3MgaXNzdWUgdHJhY2tlcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vaXNzdWVz Pg0KDQptZXJsaW4gNS40LjENCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K DQogIOKBgyBtZXJsaW4gYmluYXJ5DQogICAg4oCiIFN1cHBvcnQgZm9yIE9DYW1sIDUuMw0KICAg IOKAoiBVc2UgbmV3IDUuMyBmZWF0dXJlcyB0byBpbXByb3ZlIGxvY2F0ZSBiZWhhdmlvciBpbiBz b21lDQogICAgICBjYXNlcy4gTWVybGluIG5vIGxvbmdlciBjb25mdXNlcyB1aWRzIGZyb20gaW50 ZXJmYWNlcyBhbmQNCiAgICAgIGltcGxlbWVudGF0aW9ucy4gKCMxODU3KQ0KICAgIOKAoiBQZXJm b3JtIGxlc3MgbWVyZ2VzIGluIHRoZSBpbmRleGVyICgjMTg4MSkNCiAgICDigKIgQWRkIGluaXRp YWwgc3VwcG9ydCBmb3IgcHJvamVjdC13aWRlIHJlbmFtaW5nOiBvY2N1cnJlbmNlcyBjYW4gbm93 DQogICAgICByZXR1cm4gYWxsIHVzYWdlcyBvZiBhbGwgcmVsYXRlZCBkZWZpbml0aW9ucy4gKCMx ODc3KQ0KICDigYMgb2NhbWwtaW5kZXgNCiAgICDigKIgQnVtcCBtYWdpYyBudW1iZXIgYWZ0ZXIg aW5kZXggZmlsZSBmb3JtYXQgY2hhbmdlICgjMTg4NikNCiAg4oGDIHZpbSBwbHVnaW4NCiAgICDi gKIgQWRkZWQgc3VwcG9ydCBmb3Igc2VhcmNoLWJ5LXR5cGUgKCMxODQ2KSBUaGlzIGlzIGV4cG9z ZWQgdGhyb3VnaA0KICAgICAgdGhlIGV4aXN0aW5nIGA6TWVybGluU2VhcmNoJyBjb21tYW5kLCB0 aGF0IHN3aXRjaGVzIGJldHdlZW4NCiAgICAgIHNlYXJjaC1ieS10eXBlIGFuZCBwb2xhcml0eSBz ZWFyY2ggZGVwZW5kaW5nIG9uIHRoZSBmaXJzdA0KICAgICAgY2hhcmFjdGVyIG9mIHRoZSBxdWVy eS4NCg0KDQpPY2FtbC1MU1AgMS4yMi4wDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICDigKIgRW5hYmxlIGV4cGVyaW1lbnRhbCBwcm9qZWN0LXdp ZGUgcmVuYW1pbmcgb2YgaWRlbnRpZmllcnMgKCMxNDMxKQ0KDQoNCnFjaGVjay1saW4gYW5kIHFj aGVjay1zdG0gMC4yDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1xY2hlY2stbGluLWFuZC1xY2hl Y2stc3RtLTAtMi8xMjMwMS81Pg0KDQoNCkphbiBNaWR0Z2FhcmQgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBWZXJzaW9uIDAuNyBvZiBgcWNoZWNrLWxpbicsIGBxY2hlY2stc3RtJywgYW5k DQogIGBxY2hlY2stbXVsdGljb3JldGVzdHMtdXRpbCcgaXMgbm93IGF2YWlsYWJsZSBvbiB0aGUg b3BhbSByZXBvc2l0b3J5Og0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9t dWx0aWNvcmV0ZXN0cy9yZWxlYXNlcy90YWcvMC43Pg0KDQogIFRoaXMgcmVsZWFzZSBjb250YWlu cyB0d28gY29udHJpYnV0aW9ucyBmcm9tIEBwb2x5dHlwaWMsIGluY2wuIGFuDQogIGBTVE0nIGZl YXR1cmUgdG8gaGVscCB0ZXN0aW5nIG9mIH5jbWR+cyB0aGF0IG1heSByYWlzZSBhbiBlZmZlY3Q6 DQoNCiAg4oCiIFsjNTA5XTogQ2hhbmdlL0ZpeCB0byB1c2UgYSBzeW1tZXRyaWMgYmFycmllciB0 byBzeW5jaHJvbml6ZSBkb21haW5zDQogIOKAoiBbIzUxMV06IEludHJvZHVjZSBleHRlbmRlZCBz cGVjcyB0byBhbGxvdyB3cmFwcGluZyBjb21tYW5kIHNlcXVlbmNlcw0KICDigKIgWyM1MTddOiBB ZGQgYExpbicgY29tYmluYXRvcnMgYHNlcV9zbWFsbCcsIGBhcnJheV9zbWFsbCcsIGFuZA0KICAg IGBsaXN0X3NtYWxsJw0KDQogIEhhcHB5IHRlc3RpbmchIDpzbWlsZXk6DQoNCg0KWyM1MDldIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL211bHRpY29yZXRlc3RzL3B1bGwvNTA5 Pg0KDQpbIzUxMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvbXVsdGljb3Jl dGVzdHMvcHVsbC81MTE+DQoNClsjNTE3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRp Y29yZS9tdWx0aWNvcmV0ZXN0cy9wdWxsLzUxNz4NCg0KDQpEdW5lIDMuMTcNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLWR1bmUtMy0xNy8xNTc3MC81Pg0KDQoNCkV0aWVubmUgTWFyYWlzIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhlIER1bmUgdGVhbSBpcyByZWxlYXNpbmcgRHVuZSBgMy4x Ny4yJyEgOndyZW5jaDoNCg0KICBUaGlzIHBhdGNoIHJlbGVhc2UgaW5jbHVkZXMgc29tZSBidWcg Zml4ZXMuIEl0IG1vc3RseSBicmluZ3Mgc29tZQ0KICBmaXhlcyBmb3IgTWVsYW5nZSBhbmQgV2Fz bV9vZl9vY2FtbC4gSXQgYWxzbyBmaXhlcyBhIGJ1ZyB0aGF0IHByZXZlbnRzDQogIHRoZSBleHBl cmltZW50YWwgZmVhdHVyZSwgcGFja2FnZSBtYW5hZ2VtZW50LCB0byBidWlsZCB3aXRoDQogIGBv Y2FtbC41LjMuMCcuDQoNCiAgSWYgeW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIHJl bGVhc2UsIHlvdSBjYW4gcmVwb3J0IGl0IG9uIHRoZQ0KICBbb2NhbWwvZHVuZV0gcmVwb3NpdG9y eS4NCg0KDQpbb2NhbWwvZHVuZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vl cz4NCg0KQ2hhbmdlbG9nDQrilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K4peKIEZpeGVk DQoNCiAg4oCiIEZpeCBhIGNyYXNoIGluIHRoZSBNZWxhbmdlIHJ1bGVzIHRoYXQgd291bGQgcHJl dmVudCBjb21waWxpbmcgcHVibGljDQogICAgbGlicmFyeSBpbXBsZW1lbnRhdGlvbnMgb2Ygdmly dHVhbCBsaWJyYXJpZXMuIChAYW1vbnRlaXJvLCAjMTEyNDgpDQogICAg4oCiIFBhc3MgYG1lbGFu Z2UuZW1pdCcncyBgY29tcGlsZV9mbGFncycgdG8gdGhlIEpTIGVtaXNzaW9uDQogICAgICBwaGFz ZS4gKEBhbW9udGVpcm8sICMxMTI1MikNCiAg4oCiIERpc2FsbG93IHByaXZhdGUgaW1wbGVtZW50 YXRpb25zIG9mIHB1YmxpYyB2aXJ0dWFsIGxpYnMgaW4gYG1lbGFuZ2UnDQogICAgbW9kZS4gKEBh bW9udGVpcm8sICMxMTI1MykNCiAg4oCiIFdhc21fb2Zfb2NhbWw6IGZpeCB0aGUgZXhlY3V0aW9u IG9mIHRlc3RzIGluIGEgc2FuZGJveC4gICgjMTEzMDQsDQogICAgQHZvdWlsbG9uKQ0KDQoNCk9k b2MgMyBCZXRhIFJlbGVhc2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLW9kb2MtMy1iZXRhLXJlbGVhc2UvMTYwNDMvMT4NCg0KDQpKb24gTHVkbGFtIGFu bm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgT24gYmVoYWxmIG9mIHRoZSBvZG9jIHRlYW0sIEknbSB0aHJpbGxl ZCB0aGUgYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YNCiAgb2RvYyAzLjAuMCBiZXRhIDEhDQoNCiAg VGhpcyByZWxlYXNlIGhhcyBiZWVuIGNvb2tpbmcgZm9yIGEgbG9uZyB0aW1lIC0gaXQncyBiZWVu IG1vcmUgdGhhbiBhDQogIHllYXIgc2luY2Ugb2RvYyAyLjQgbGFuZGVkLCBhbmQgYSBodWdlIGFt b3VudCBvZiB3b3JrIGhhcyBnb25lIGludG8NCiAgdGhpcy4gVGhhbmtzIHRvIHRoZSBtYW55IG90 aGVycyB3aG8gY29udHJpYnV0ZWQsIGVpdGhlciBieSBjb2RlIG9yIGJ5DQogIGNvbW1lbnRzOiBA anVsb28sIEBwYW5nbGVzZCwgQEVtaWxlVHJvdGlnbm9uLCBAZ3BldGlvdCwgQHRyZWZpcywNCiAg QHNhYmluZSwgQGRidWVuemxpLCBAeWF3YXJhbWluLCBhbmQgbW9yZS4NCg0KICBXaXRoIHRoaXMg cmVsZWFzZSB3ZSdyZSBpbmNsdWRpbmcgYSBkcml2ZXIgdGhhdCBrbm93cyBob3cgdG8gdXNlIGFs bA0KICBvZiB0aGUgZXhjaXRpbmcgbmV3IGZlYXR1cmVzIG9mIG9kb2MuIFRoaXMgZHJpdmVyIGhh cyBiZWVuIHVzZWQgdG8NCiAgY3JlYXRlIHRoZSBbZG9jcyBzaXRlIGZvciB0aGUgdmFyaW91cyBv ZG9jIHRvb2xzXS4NCg0KICBIZXJlIGFyZSBhIHNlbGVjdGVkIHNldCBvZiBmZWF0dXJlczoNCg0K ICDigKIgOmRyb3BsZXQ6IFJlbmRlcmVkIHNvdXJjZSEgSnVtcCBmcm9tIGFueSBpdGVtIGluIHRo ZSBkb2N1bWVudGF0aW9uDQogICAgc3RyYWlnaHQgdG8gaXRzIHJlbmRlcmVkIHNvdXJjZTsgbm8g bWF0dGVyIGhvdyBtdWNoIG9mIE9DYW1sJ3MNCiAgICBjb21wbGV4IG1vZHVsZSBzeXN0ZW0geW91 IGFyZSB1c2luZy4NCiAg4oCiIDptYWc6IFNlYXJjaCBieSB0eXBlISBPdXIgZGV0ZWN0aXZlIHNo ZXJsb2RvYyB3aWxsIGZpbmQgeW91ciBsb3N0DQogICAgdmFsdWUgZ2l2ZW4gaXRzIHR5cGUuDQog IOKAoiA6d2FybmluZzogQ29udmVuaWVudCB3YXJuaW5ncyEgV2FybmluZ3MgYXJlIG5vdyBjbGVh cmx5IHZpc2libGUgYW5kDQogICAgdXNlZnVsLCBubyBsb25nZXIgYnVyaWVkIGFtb25nIHlvdXIg ZGVwZW5kZW5jaWVz4oCZIHdhcm5pbmdzLg0KICDigKIgOmFycm93X2hlYWRpbmdfdXA6IFNlbGYg aG9zdCB5b3VyIGRvY3VtZW50YXRpb24sIGJ1dCBbbGluayB0bw0KICAgIG9jYW1sLm9yZ10gZm9y IHlvdXIgZGVwZW5kZW5jaWVzLg0KICDigKIgOjEwMDogTW9yZSBzaWRlYmFycyEgT2RvYyAzIGZl YXR1cmVzIGEgW2dsb2JhbCBzaWRlYmFyXSwgYWxsb3dpbmcNCiAgICB5b3UgdG8gZGlzY292ZXIg dGhlIG1vc3QgaGlkZGVuIGNvcm5lciBvZiB1bmRlcmdyb3VuZCBkb2N1bWVudGF0aW9uLg0KICDi gKIgOmV4cGxvZGluZ19oZWFkOiBJbWFnZSBzdXBwb3J0ISBUaGlzIGN1dHRpbmctZWRnZSBmZWF0 dXJlIG5vdyBhbGxvd3MNCiAgICB5b3UgdG8gW2FkZCBpbWFnZXNdIHRvIHlvdXIgZG9jdW1lbnRh dGlvbi4gVmlkZW8gYW5kIGF1ZGlvIGNvbWUgZm9yDQogICAgZnJlZS4NCiAg4oCiIDpzcGlkZXJf d2ViOiBbRnVsbHkgY3Jvc3MtcGFja2FnZSBsaW5rc10hIFRoZSBPQ2FtbCBkb2NzIGFyZSBub3cg YQ0KICAgIHRydWUgc3BpZGVyIHdlYi4gUHJlcGFyZSB0byBjYXRjaCBidWdzLCBhbmQgZWF0IHRo ZW0uDQogIOKAoiA6Y29wOiBIaWVyYXJjaGljYWwgZG9jdW1lbnRhdGlvbiBwYWdlcyEgV2UgdXNl IGEgbW9kdWxhcg0KICAgIGxhbmd1YWdlLiBXZSBkb24ndCB3YW50IGEgZmxhdCBuYW1lc3BhY2Ug Zm9yIHBhZ2VzLg0KICDigKIgOmJ1aWxkaW5nX2NvbnN0cnVjdGlvbjogVGhlIGJ1aWxkIGRlcGVu ZGVuY2llcyBhcmUgZnJpZW5kbGllciB3aXRoDQogICAgaW5jcmVtZW50YWwgYnVpbGQgc3lzdGVt cywgYWxsb3dpbmcgYmV0dGVyIHNoYXJlZCBidWlsZCBjYWNoZXMuDQogIOKAoiA6aGVhcnQ6IFF1 YWxpdHkgb2YgbGlmZSBpbXByb3ZlbWVudHMhIE1hbnkgaW1wcm92ZW1lbnRzIGhhdmUgYmVlbg0K ICAgIHBpbGluZyB1cCBzaW5jZSB3ZSBzdGFydGVkIG9kb2MgMy4gRm9yIGluc3RhbmNlOiBgQWRk IGNsb2NrIGVtb2ppDQogICAgYmVmb3JlIEBzaW5jZSB0YWcgKEB5YXdhcmFtaW4sICMxMDg5KSch DQoNCiAgTW9yZSBleHBsYW5hdGlvbiBvZiB0aGVzZSBmZWF0dXJlcyBpcyBhdmFpbGFibGUgYXQg dGhlIG9kb2Mgc2l0ZSwNCiAgd2hlcmUgd2UgaGF2ZSBkb2N1bWVudGF0aW9uIFtmb3IgYXV0aG9y c10sIGZvciBbdXNlcnMgb2YNCiAgYG9kb2NfZHJpdmVyJ10sIGEgW2NoZWF0c2hlZXRdLCBhbmQg W2RpZmZlcmVuY2VzIGZyb20gb2NhbWxkb2NdLg0KDQoNCltkb2NzIHNpdGUgZm9yIHRoZSB2YXJp b3VzIG9kb2MgdG9vbHNdIDxodHRwczovL29jYW1sLmdpdGh1Yi5pby9vZG9jLz4NCg0KW2xpbmsg dG8gb2NhbWwub3JnXQ0KPGh0dHBzOi8vb2NhbWwuZ2l0aHViLmlvL29kb2Mvb2RvYy1kcml2ZXIv I3JlbWFwcGluZy1kZXBlbmRlbmNpZXM+DQoNCltnbG9iYWwgc2lkZWJhcl0NCjxodHRwczovL29j YW1sLmdpdGh1Yi5pby9vZG9jL29kb2Mvb2RvY19mb3JfYXV0aG9ycy5odG1sI3BhZ2UtdGFncz4N Cg0KW2FkZCBpbWFnZXNdDQo8aHR0cHM6Ly9vY2FtbC5naXRodWIuaW8vb2RvYy9vZG9jL29kb2Nf Zm9yX2F1dGhvcnMuaHRtbCNtZWRpYT4NCg0KW0Z1bGx5IGNyb3NzLXBhY2thZ2UgbGlua3NdDQo8 aHR0cHM6Ly9vY2FtbC5naXRodWIuaW8vb2RvYy9vZG9jL29kb2NfZm9yX2F1dGhvcnMuaHRtbCNs aW5rc19hbmRfcmVmZXJlbmNlcz4NCg0KW2ZvciBhdXRob3JzXSA8aHR0cHM6Ly9vY2FtbC5naXRo dWIuaW8vb2RvYy9vZG9jL29kb2NfZm9yX2F1dGhvcnMuaHRtbD4NCg0KW3VzZXJzIG9mIGBvZG9j X2RyaXZlciddDQo8aHR0cHM6Ly9vY2FtbC5naXRodWIuaW8vb2RvYy9vZG9jLWRyaXZlci9pbmRl eC5odG1sPg0KDQpbY2hlYXRzaGVldF0gPGh0dHBzOi8vb2NhbWwuZ2l0aHViLmlvL29kb2Mvb2Rv Yy9jaGVhdHNoZWV0Lmh0bWw+DQoNCltkaWZmZXJlbmNlcyBmcm9tIG9jYW1sZG9jXQ0KPGh0dHBz Oi8vb2NhbWwuZ2l0aHViLmlvL29kb2Mvb2RvYy9vY2FtbGRvY19kaWZmZXJlbmNlcy5odG1sPg0K DQpIb3cgY2FuIHlvdSBoZWxwPw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWMDQoNCiAgV2UgbmVlZCB5b3VyIGZlZWRiYWNrLCBib3RoIGFzIGF1dGhv cnMgYW5kIGFzIHVzZXJzIG9mIGRvY3VtZW50YXRpb24hDQogIFRyeSB0aGluZ3Mgb3V0IHVzaW5n IHRoZSBuZXcgZHJpdmVyOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgJCBvcGFtIGluc3Rh bGwgb2RvYy1kcml2ZXIgICAgIyBkb24ndCBmb3JnZXQgdG8gfm9wYW0gdXBkYXRlfg0KICDilIIg JCBvZG9jX2RyaXZlciA8cGFja2FnZSBsaXN0PiAgIyBGb3IgaW5zdGFuY2U6IH4kIG9kb2NfZHJp dmVyIGJyciBvZG9jfg0KICDilIIgJCAkWU9VUl9CUk9XU0VSIF9odG1sL2luZGV4Lmh0bWwNCiAg 4pSU4pSA4pSA4pSA4pSADQoNCiAgTWFueSBvZiB0aG9zZSBmZWF0dXJlcycgaW1wbGVtZW50YXRp b25zIGFyZSBub3Qgc2V0IGluIHN0b25lLCBidXQNCiAgZmlyc3QgdmVyc2lvbnMuIFBsZWFzZSBs ZWF2ZSBjb21tZW50cywgZWl0aGVyIGluIHRoaXMgdGhyZWFkIG9yIGFzDQogIGlzc3VlcyBpbiB0 aGUgcmVwb3NpdG9yeS4NCg0KICBTbywgbmF2aWdhdGUgYWxyZWFkeSB3cml0dGVuIGRvY3VtZW50 YXRpb24sIGFuZCB1cGRhdGUgeW91ciBvd24gZG9jcw0KICB0byB1c2UgdGhlIG5ldyBmZWF0dXJl cyENCg0KDQoyMDI0IGF0IE9DYW1sUHJvDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90LzIwMjQtYXQtb2NhbWxwcm8vMTYwNDYvMT4NCg0KDQpPQ2FtbFBybyBhbm5vdW5jZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog ICoyMDI0IGF0IE9DYW1sUHJvKg0KDQogIEF0IE9DYW1sUHJvLCB3ZSBsaWtlIHRvIHNvbHZlIGlz c3VlcyB0aGF0IGhhdmUgYW4gaW1wYWN0IGluIHRoZSByZWFsDQogIHdvcmxkLCBzbyB3ZSBmb2N1 cyBtb3N0IG9mIG91ciBlZmZvcnRzIG9uIHByb2plY3RzIHRoYXQgb3VyIGN1c3RvbWVycw0KICBi cmluZyBmcm9tIHRoZWlyIGRvbWFpbnMuIFdlIG9mdGVuIGxpa2UgdG8gd29yayBpbiB0aGUgc2hh ZG93cywNCiAgZm9jdXNpbmcgb24gdGhlIGhhcmRlc3QgdGFza3MuIEZhYnJpY2UsIE9DYW1sUHJv 4oCZcyBmb3VuZGVyLCB1c2VkIHRvDQogIHNheSB0aGF0IHdlIGFyZSB0aGUgQ29tbWFuZG9zIG9m IE9DYW1sIChhbmQgbm93IG9mIFJ1c3QgdG9vKSwgYSB0ZWFtDQogIG9mIGhpZ2hseSBza2lsbGVk IHByb2Zlc3Npb25hbHMganVtcGluZyBpbnRvIHRoZSBtb3N0IGRlbWFuZGluZw0KICBwcm9qZWN0 cy4gVGhhdCBhYmlsaXR5IHdhcyBpbGx1c3RyYXRlZCBzZXZlcmFsIHRpbWVzIGluIHRoZSBwYXN0 LCBmcm9tDQogIHRoZSBiaXJ0aCBvZiBPcGFtLCB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIEZsYW1i ZGEgY29tcGlsZXJzIGZvciBKYW5lDQogIFN0cmVldCwgdGhlIGRlc2lnbiBhbmQgZGV2ZWxvcG1l bnQgb2YgdGhlIFRlem9zIHByb3RvdHlwZSBhbmQgSUNPDQogIHBsYXRmb3JtLCB0byB0aGUgYWR2 ZW50dXJvdXMgZXh0ZW5zaW9uIG9mIHRoZSBHbnVDT0JPTCBvcGVuLXNvdXJjZQ0KICBjb21waWxl ciBmb3IgRnJlbmNoIERHRmlQLCBldmVuIHRoZSBwb3J0IG9mIEZsb3cgYW5kIEhhY2sgdG8gV2lu ZG93cw0KICBmb3IgTWV0YS4gT2YgY291cnNlLCB3ZSBhcmUgYWx3YXlzIGhhcHB5IHRvIGJlIGVu dHJ1c3RlZCB3aXRoIG1vcmUNCiAgY29tbW9uIHByb2plY3RzIGFuZCB0YXNrcyBhbHNvLCBidWls ZGluZyBhIHRlYW0gYW5kIHRyYWluaW5nIHRoZQ0KICB0YWxlbnRzIHJlcXVpcmVkIHRvIG1hc3Rl ciBhbGwgdGFza3MsIGZyb20gdGhlIHNpbXBsZXN0IHRvIHRoZSBoYXJkZXN0DQogIG9uZXMuIEFu ZCB0aGUgaGFyZGVzdCBvbmVzIGFyZSBvZnRlbiBoaWRkZW4gaW4gdGhlIG1pZGRsZSBvZiB0aGUN CiAgc2ltcGxlc3Qgb25lcywgdG9vLg0KDQogIFRoZSBPQ2FtbCBsYW5ndWFnZSBpcyB0aGUgZ3Jl YXRlc3QgdG9vbCBhdCBoYW5kIHRvIGZ1bGZpbCBvdXINCiAgbWlzc2lvbnMsIGFuZCB3ZSB0cnkg dG8gY29udHJpYnV0ZSBiYWNrIHRvIHRoZSBPQ2FtbCBlY29zeXN0ZW0gd2hlbg0KICBwb3NzaWJs ZS4gV2UgYXJlIGFsd2F5cyBhdHRyYWN0ZWQgdG8gaXNzdWVzIG1ldCBieSBPQ2FtbCBpbmR1c3Ry aWFsDQogIHVzZXJzLCBhcyBpdCBnaXZlcyB1cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGlyZWN0bHkg d29yayBmb3IgdGhlIE9DYW1sDQogIGNvbW11bml0eS4gV291bGQgeW91IGJlIGhhdmluZyBzdWNo IGlzc3VlcywgZG8gbm90IGhlc2l0YXRlIHRvIGNvbnRhY3QNCiAgdXMgYW5kIGRpc2N1c3Mgd2hh dCB3ZSBjYW4gZG8gZm9yIHlvdSENCg0KICBUaGUgYmVnaW5uaW5nIG9mIGEgbmV3IHllYXIgaXMg YWx3YXlzIGEgZ29vZCB0aW1lIHRvIGxvb2sgYmFjayBhdCB0aGUNCiAgcHJldmlvdXMgeWVhciwg YW5kIHNlZSB3aGF0IHdlIGhhdmUgYWNoaWV2ZWQgd2l0aCBPQ2FtbCwgYW5kIHNvbWV0aW1lcw0K ICBmb3IgT0NhbWwsIGluIDIwMjQuDQoNCg0KQ29udHJpYnV0aW9ucyB0byB0aGUgT0NhbWwgZWNv c3lzdGVtDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0K4peKIFNoYXJpbmcgS25vd2xlZGdlDQoNCiAgSW4gMjAyNCwgd2UgbWFkZSBlZmZvcnRz IHRvIGRlZGljYXRlIG1vcmUgdGltZSB0byB3cml0ZSBibG9nIHBvc3RzIHRvDQogIHNoYXJlIG91 ciBrbm93bGVkZ2Ugb24gdGhlIE9DYW1sIHRvb2xzIHdlIHdvcmsgb24sIHNvIHRoYXQgT0NhbWwN CiAgZGV2ZWxvcGVycyBjYW4gdXNlIHRoaXMga25vd2xlZGdlIGluIHRoZWlyIGRhaWx5IHRhc2tz LiBXZSB3cm90ZSBhDQogIHNlcmllcyBvZiBhcnRpY2xlcyBvbiBtYXN0ZXJpbmcgT3BhbSBmcm9t IHRoZSBncm91bmQgdXAgKCBbT3BhbSAxMDE6DQogIFRoZSBGaXJzdCBTdGVwc10sIFtPcGFtIDEw MjogUGlubmluZyBQYWNrYWdlc10pLCBvbiB0aGUgaW50ZXJuYWxzIG9mDQogIHRoZSBGbGFtYmRh MiBjb21waWxlciAoIFtCZWhpbmQgdGhlIFNjZW5lcyBvZiB0aGUgT0NhbWwgT3B0aW1pc2luZw0K ICBDb21waWxlciBGbGFtYmRhMjogSW50cm9kdWN0aW9uIGFuZCBSb2FkbWFwXSwgW0ZsYW1iZGEy IEVwLiAyOg0KICBMb29waWZ5aW5nIFRhaWwtUmVjdXJzaXZlIEZ1bmN0aW9uc10sIFtGbGFtYmRh MiBFcC4gMzogU3BlY3VsYXRpdmUNCiAgSW5saW5pbmddICkgYW5kIG9uZSBvbiBPQ2FtbCBiYWNr dHJhY2VzICggW09DYW1sIEJhY2t0cmFjZXMgb24NCiAgVW5jYXVnaHQgRXhjZXB0aW9uc10gKS4g TW9yZSBhcmUgY29taW5nIQ0KDQogIE9mIGNvdXJzZSwgaWYgeW91IGFyZSBub3QgcGF0aWVudCBl bm91Z2ggdG8gd2FpdCBmb3Igb3VyIG5leHQNCiAgYXJ0aWNsZXMsIHlvdSBtYXkgcmVnaXN0ZXIg Zm9yIG9uZSBvZiBbb3VyIHRyYWluaW5nc10gLCB3ZSBoYXZlIFtPQ2FtbA0KICBCZWdpbm5lcl0g LCBbT0NhbWwgRXhwZXJ0XSAsIFtNYXN0ZXJpbmcgT3BhbV0gLCBbT0NhbWwgQ29kZQ0KICBPcHRp bWl6YXRpb25dIGFuZCB3ZSBjYW4gYnVpbGQgbmV3IG9uZXMgb24gZGVtYW5kLiBUbyBiZSBob25l c3QsIGluDQogIDIwMjQsIHdlIHJlY2VpdmVkIG1hbnkgbW9yZSByZXF1ZXN0cyBmb3Igb3VyIHNl c3Npb25zIG9uIFJ1c3QNCiAgKEJlZ2lubmVyLCBFeHBlcnQgYW5kIEVtYmVkZGVkKSB0aGFuIGZv ciBPQ2FtbCwgYnV0IG1vcmUgZm9yIE9DYW1sDQogIG9uZXMgdGhhbiBmb3IgQ09CT0wgb25lcyDw n5mCDQoNCg0KICBbT3BhbSAxMDE6IFRoZSBGaXJzdCBTdGVwc10NCiAgPGh0dHBzOi8vb2NhbWxw cm8uY29tL2ZyL2Jsb2cvMjAyNF8wMV8yM19vcGFtXzEwMV90aGVfZmlyc3Rfc3RlcHM+DQoNCiAg W09wYW0gMTAyOiBQaW5uaW5nIFBhY2thZ2VzXQ0KICA8aHR0cHM6Ly9vY2FtbHByby5jb20vZnIv YmxvZy8yMDI0XzAzXzI1X29wYW1fMTAyX3Bpbm5pbmdfcGFja2FnZXM+DQoNCiAgW0JlaGluZCB0 aGUgU2NlbmVzIG9mIHRoZSBPQ2FtbCBPcHRpbWlzaW5nIENvbXBpbGVyIEZsYW1iZGEyOg0KICBJ bnRyb2R1Y3Rpb24gYW5kIFJvYWRtYXBdDQogIDxodHRwczovL29jYW1scHJvLmNvbS9mci9ibG9n LzIwMjRfMDNfMThfdGhlX2ZsYW1iZGEyX3NuaXBwZXRzXzA+DQoNCiAgW0ZsYW1iZGEyIEVwLiAy OiBMb29waWZ5aW5nIFRhaWwtUmVjdXJzaXZlIEZ1bmN0aW9uc10NCiAgPGh0dHBzOi8vb2NhbWxw cm8uY29tL2ZyL2Jsb2cvMjAyNF8wNV8wN190aGVfZmxhbWJkYTJfc25pcHBldHNfMj4NCg0KICBb RmxhbWJkYTIgRXAuIDM6IFNwZWN1bGF0aXZlIElubGluaW5nXQ0KICA8aHR0cHM6Ly9vY2FtbHBy by5jb20vZnIvYmxvZy8yMDI0XzA4XzA5X3RoZV9mbGFtYmRhMl9zbmlwcGV0c18zPg0KDQogIFtP Q2FtbCBCYWNrdHJhY2VzIG9uIFVuY2F1Z2h0IEV4Y2VwdGlvbnNdDQogIDxodHRwczovL29jYW1s cHJvLmNvbS9mci9ibG9nLzIwMjRfMDRfMjVfb2NhbWxfYmFja3RyYWNlc19vbl91bmNhdWdodF9l eGNlcHRpb25zPg0KDQogIFtvdXIgdHJhaW5pbmdzXSA8aHR0cHM6Ly90cmFpbmluZy5vY2FtbHBy by5jb20+DQoNCiAgW09DYW1sIEJlZ2lubmVyXQ0KICA8aHR0cHM6Ly90cmFpbmluZy5vY2FtbHBy by5jb20vZW4vZm9ybWF0aW9uLW9jYW1sLWRlYnV0YW50LTIwMjIuaHRtbD4NCg0KICBbT0NhbWwg RXhwZXJ0XQ0KICA8aHR0cHM6Ly90cmFpbmluZy5vY2FtbHByby5jb20vZW4vZm9ybWF0aW9uLW9j YW1sLWV4cGVydC0yMDIyLmh0bWw+DQoNCiAgW01hc3RlcmluZyBPcGFtXQ0KICA8aHR0cHM6Ly90 cmFpbmluZy5vY2FtbHByby5jb20vZW4vZm9ybWF0aW9uLW1hc3RlcmluZy1vcGFtLTIwMjIuaHRt bD4NCg0KICBbT0NhbWwgQ29kZSBPcHRpbWl6YXRpb25dDQogIDxodHRwczovL3RyYWluaW5nLm9j YW1scHJvLmNvbS9lbi9mb3JtYXRpb24tb2NhbWwtb3B0aW1pc2F0aW9uLTIwMjIuaHRtbD4NCg0K DQril4ogT3BhbSwgTWFpbnRlbmFuY2UgYW5kIEV2b2x1dGlvbg0KDQogIFNpbmNlIHdlIGNyZWF0 ZWQgT3BhbSBpbiAyMDEyLCB3ZSBoYXZlIGFsd2F5cyBoYWQgYXQgbGVhc3Qgb25lIGZ1bGwNCiAg dGltZSBlbmdpbmVlciBpbiB0aGUgT3BhbSB0ZWFtLCB0byBtYWludGFpbiBpdCwgYWRkIG5ldyBm ZWF0dXJlcyBhbmQNCiAgcmV2aWV3IGNvbnRyaWJ1dGlvbnMgYnkgb3RoZXIgbWVtYmVycy4gVGhp cyB3YXMgbWFkZSBwb3NzaWJsZSB0aGFua3MNCiAgdG8gYSBwYXJ0bmVyc2hpcCB3aXRoIEphbmUg U3RyZWV0LCBhbmQsIHNpbmNlIDIwMjQsIHRvIGEgcGFydG5lcnNoaXANCiAgd2l0aCBUYXJpZGVz Lg0KDQogIEluIDIwMjQsIG9wYW0gaGFkIHR3byBtYWpvciByZWxlYXNlcywgW29wYW0gMi4zLjAg cmVsZWFzZSFdIGFuZCBbb3BhbQ0KICAyLjIuMCByZWxlYXNlIV0gLiBUaGUgbW9zdCBncm91bmQt YnJlYWtpbmcgY2hhbmdlIGlzIHRoZSAqb2ZmaWNpYWwNCiAgbmF0aXZlIHN1cHBvcnQgZm9yIFdp bmRvd3MqLCB3aXRoIGFjY2VzcyB0byBlaXRoZXIgbWluZ3ctdzY0IGdjYw0KICBjb21waWxlcnMg b3IgVmlzdWFsIFN0dWRpbyBNU1ZDIGNvbXBpbGVycyB3aXRoIGF1dG9tYXRpYw0KICBkZXRlY3Rp b24uIFRoaXMgbmF0aXZlIHN1cHBvcnQgaXMgdHJlbWVuZG91cyBuZXdzIGZvciBPQ2FtbCBhZG9w dGlvbg0KICBpbiBnZW5lcmFsLCBhbmQgaXQgd2FzIGJ1aWx0IHRoYW5rcyB0byBhIGxvdCBvZiB3 b3JrIGZyb20gYWxsIHRoZQ0KICBjb21tdW5pdHksIGVzcGVjaWFsbHkgb24gdGhlIG9wYW0tcmVw b3NpdG9yeSBhbmQgcGFja2FnZXMuIEFuDQogIGludGVyZXN0aW5nIG5leHQgc3RlcCB0byBjb25z aWRlciBmb3IgT0NhbWwgb24gV2luZG93cyB3b3VsZCBiZSB0bw0KICBoYXZlIGEgc2luZ2xlIE9D YW1sIHRvb2xjaGFpbiBmb3IgYWxsIFdpbmRvd3MgY29tcGlsZXJzLCB1c2luZyBhbg0KICBpbnRl Z3JhdGVkIGFzc2VtYmxlciBmb3IgeDg2L3g2NCB3aXRoIGVsZi9jb2ZmIHN1cHBvcnQsIHNvbWV0 aGluZyB0aGF0DQogIHdlIGhhZCBpbXBsZW1lbnRlZCBhbmQgdGVzdGVkIGluIE9jcFdpbiBhIGxv bmcgdGltZSBhZ28uDQoNCiAgQW1vbmcgbWFueSBmaXhlcyBhbmQgdXBkYXRlcywgdGhlcmUgaXMg dGhlIGFkZGl0aW9uIG9mIG9wYW0gdHJlZQ0KICA8cGFja2FnZT4gdG8gZ2V0IGEgbmljZSBkaXNw bGF5IG9mIHRoZSBkZXBlbmRlbmNpZXMgb2YgYW4gaW5zdGFsbGVkDQogIHBhY2thZ2UsIGBvcGFt IHBpbiDigJNyZWN1cnNpdmUnIHRvIGxvb2sgZGVlcGVyIGludG8gc3ViLWRpcmVjdG9yaWVzDQog IHdoZW4gc2VhcmNoaW5nIGZvciBvcGFtIGZpbGVzIGFuZCBtYW55IG1vcmUgc21hbGwgaW1wcm92 ZW1lbnRzLiBDaGVjaw0KICB0aGUgYmxvZyBwb3N0cyBmb3IgbW9yZSBkZXRhaWxzICENCg0KDQog IFtvcGFtIDIuMy4wIHJlbGVhc2UhXQ0KICA8aHR0cHM6Ly9vY2FtbHByby5jb20vZnIvYmxvZy8y MDI0XzExXzEzX29wYW1fMl8zXzBfcmVsZWFzZXM+DQoNCiAgW29wYW0gMi4yLjAgcmVsZWFzZSFd DQogIDxodHRwczovL29jYW1scHJvLmNvbS9mci9ibG9nLzIwMjRfMDdfMDFfb3BhbV8yXzJfMF9y ZWxlYXNlcz4NCg0KDQril4ogV29yayBvbiB0aGUgT0NhbWwgQ29tcGlsZXINCg0KICBXZSBoYXZl IGhhZCBhIGxvbmcgcGFydG5lcnNoaXAgd2l0aCBKYW5lIFN0cmVldCB0byBpbXByb3ZlIHRoZQ0K ICBwZXJmb3JtYW5jZSBvZiB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIE9DYW1sIGNvbXBpbGVy LiBUaGUgZmlyc3QNCiAgb3V0Y29tZSBvZiB0aGlzIHdvcmsgd2FzIHRoZSBGbGFtYmRhIGJhY2tl bmQsIHdoaWNoIHdhcyBtZXJnZWQgaW50bw0KICBPQ2FtbCA0LjAzIGluIDIwMTYuIFNpbmNlIHRo ZW4sIHdlIGhhdmUgc3RhcnRlZCBhIG5ldyBiYWNrZW5kLA0KICBbRmxhbWJkYTJdICwgdGhhdCBp cyBpbmNsdWRlZCBpbiB0aGUgSmFuZSBTdHJlZXQgT0NhbWwgY29tcGlsZXIuDQoNCiAgSW4gMjAy NCwgb3VyIHRlYW0gZm9jdXNlZCBpdHMgZWZmb3J0cyBvbiBzZXZlcmFsIG5ldyBvcHRpbWl6YXRp b25zLA0KICBsaWtlIG1hdGNoIGluIG1hdGNoIChzaW1wbGlmeSBwYXR0ZXJuLW1hdGNoaW5nIGFw cGVhcmluZyBpbiBhbm90aGVyDQogIHBhdHRlcm4tbWF0Y2hpbmcgYWZ0ZXIgaW5saW5pbmcpLCB1 bmJveCBmcmVlIHZhcnMgb2YgY2xvc3VyZXMNCiAgKHNob3J0Y3V0IGNoYWlucyBvZiBwb2ludGVy cyBzdG9yZWQgaW4gY2xvc3VyZXMpIG9yIHRoZSByZWFwZXIgKGRvIG5vdA0KICBhbGxvY2F0ZSB1 bnVzZWQgZmllbGRzIG9mIGJsb2NrcykuIFN1Y2ggb3B0aW1pemF0aW9ucyBhcmUgb2Z0ZW4gbXVj aA0KICBtb3JlIGNvbXBsZXggdGhhbiB5b3Ugd291bGQgdGhpbmssIGFzIGd1YXJhbnRlZWluZyB0 aGF0IHRoZXkgY2FuIGJlDQogIGFwcGxpZWQgc2FmZWx5IGlzIG5vdCBvYnZpb3VzLCByZXF1aXJp bmcgZXNjYXBlIGFuYWx5c2lzIGFuZCBvdGhlcg0KICBjaGVja3MuIFdlIHdlcmUgYWxzbyB2ZXJ5 IGFjdGl2ZSBhdCBoZWxwaW5nIHRoZSBjb21waWxlciB0ZWFtIGF0IEphbmUNCiAgU3RyZWV0IGJ5 IHJldmlld2luZyB0aGVpciBjb2RlIGFuZCBhZGFwdGluZyBvdXIgYmFja2VuZCB0byB0aGVpcg0K ICBuZWVkcy4gSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgc3ViamVjdCwgcmVhZCBvdXIg YmxvZyBzZXJpZXMgb24NCiAgdGhlIHRvcGljIHRoYXQgd2FzIG1lbnRpb25lZCBlYXJsaWVyLg0K DQogIEluIDIwMjQsIHdlIGFsc28gaGFkIGFuIGludGVybiB3b3JraW5nIG9uICptb2R1bGFyIGV4 cGxpY2l0cyosIGFuDQogIGV4dGVuc2lvbiBvZiBPQ2FtbCBmaXJzdC1jbGFzcyBtb2R1bGVzIHdp dGggbW9kdWxlLWRlcGVuZGVudA0KICBmdW5jdGlvbnMsIGZ1bmN0aW9ucyB0YWtpbmcgZmlyc3Qt Y2xhc3MgbW9kdWxlcyBhcyBhcmd1bWVudHMuIFRoaXMNCiAgd29yayBjYW4gYmUgc2VlbiBhcyBh IGZpcnN0IHN0ZXAgdG93YXJkcyBtb2R1bGFyIGltcGxpY2l0cywgYW5kIHdhcw0KICBwcmVzZW50 ZWQgW2F0IHRoZSBPQ2FtbCB3b3Jrc2hvcF0gd2l0aCBEaWRpZXIgUsOpbXkuIFRoZSBbbWFpbg0K ICBwdWxsLXJlcXVlc3RdIGlzIHN0aWxsIHVuZGVyIHJldmlldywgd2hpbGUgb3RoZXIgc21hbGxl ciBvbmVzIGhhdmUNCiAgYWxyZWFkeSBiZWVuIG1lcmdlZCwgbGVhZGluZyB0byBpbnRlcmVzdGlu ZyBleHRlbnNpb25zIGluc2lkZSB0aGUNCiAgY29tcGlsZXIgc3VjaCBhcyBuZXcgZm9ybXMgb2Yg ZGVwZW5kZW50IHR5cGVzLg0KDQoNCiAgW0ZsYW1iZGEyXSA8aHR0cHM6Ly9naXRodWIuY29tL29j YW1sLWZsYW1iZGEvZmxhbWJkYS1iYWNrZW5kPg0KDQogIFthdCB0aGUgT0NhbWwgd29ya3Nob3Bd DQogIDxodHRwczovL2ljZnAyNC5zaWdwbGFuLm9yZy9kZXRhaWxzL29jYW1sLTIwMjQtcGFwZXJz LzEvT24tdGhlLWRlc2lnbi1hbmQtaW1wbGVtZW50YXRpb24tb2YtTW9kdWxhci1FeHBsaWNpdHM+ DQoNCiAgW21haW4gcHVsbC1yZXF1ZXN0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s L3B1bGwvMTMyNzU+DQoNCg0K4peKIE9wdGltaXppbmcgR2VuZXdlYiwgYSBXZWJzZXJ2ZXIgZm9y IEdlbmVhbG9neQ0KDQogIExhc3QgeWVhciwgd2UgYWxzbyBzdGFydGVkIHdvcmtpbmcgb24gW0dl bmV3ZWJdLCBhIHdlYnNlcnZlciBpbiBPQ2FtbA0KICB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgZmFt aWx5IHRyZWVzIGJ5IGdlbmVhbG9naXN0cy4gR2VuZXdlYiBpcyBhIHZlcnkNCiAgb2xkIHBpZWNl IG9mIE9DYW1sLCBpbml0aWFsbHkgd3JpdHRlbiBhcm91bmQgMTk5NiBieSBEYW5pZWwgRGUNCiAg UmF1Z2xhdWRyZSBhdCBJbnJpYS4gSXQgaXMgdXNlZCBib3RoIGJ5IFtHZW5lYW5ldF0gLCBhIGdl bmVhbG9neQ0KICBjb21wYW55IHJlY2VudGx5IGFjcXVpcmVkIGJ5IEFuY2VzdHJ5LCBhbmQgdGhl IFtSb2dsbyBhc3NvY2lhdGlvbl0sIGENCiAgRnJlbmNoIGFzc29jaWF0aW9uIHRoYXQgYWRtaW5p c3RyYXRlcyBhIHNpbmdsZSBmYW1pbHkgdHJlZSBvZiBtb3JlDQogIHRoYW4gMTAgbWlsbGlvbiBw ZXJzb25zLiBPbmUgb2YgdGhlIGlzc3VlcyBmYWNlZCBieSB0aGUgUm9nbG8NCiAgYXNzb2NpYXRp b24gd2FzIHRoYXQgdGhlaXIgYnJhbmNoIG9mIHRoZSBzb2Z0d2FyZSBoYWQgZGl2ZXJnZWQgZnJv bQ0KICB0aGUgb2ZmaWNpYWwgb25lIG1haW50YWluZWQgYnkgR2VuZWFuZXQsIGFzIFJvZ2xvIGhh ZCB0byB1c2Ugc3BlY2lmaWMNCiAgZmVhdHVyZXMgb24gdGhlaXIgYnJhbmNoIHRvIGNvcGUgd2l0 aCB0aGUgaHVnZSBzaXplIG9mIHRoZWlyIHVuaXF1ZQ0KICBmYW1pbHkgdHJlZS4gV2UgaGVscGVk IHRoZW0gYnkgb3B0aW1pemluZyB0aGUgb2ZmaWNpYWwgYnJhbmNoLCBzbyB0aGF0DQogIGl0IGNv dWxkIGhvc3QgdGhlIHRyZWUgd2hpbGUgcHJvdmlkaW5nIHRoZSBzYW1lIGxhdGVuY2llcyBmb3Ig cmVxdWVzdHMNCiAgYXMgYmVmb3JlLiBJdCByZXF1aXJlZCBvcHRpbWl6aW5nIHRoZSByZXByZXNl bnRhdGlvbiBvZiBzdG9yZWQgZGF0YQ0KICAoYm90aCBpbiBPQ2FtbCBhbmQgb24gZGlzayksIGhv dyBpdCB3YXMgYWNjZXNzZWQgdGhyb3VnaCBzeXN0ZW0gY2FsbHMsDQogIGFuZCBhIGdvb2QgdW5k ZXJzdGFuZGluZyBvZiB0aGUgY29tcGxleCBhbGdvcml0aG1zIHVzZWQgYnkgR2VuZXdlYiwNCiAg dHlwaWNhbGx5IHRvIHRyYXZlcnNlIGZhbWlseSBtZW1iZXJzIHVzaW5nIHZhcmlvdXMgcmVsYXRp b25zaGlwcy4NCg0KDQogIFtHZW5ld2ViXSA8aHR0cHM6Ly9naXRodWIuY29tL2dlbmV3ZWIvZ2Vu ZXdlYj4NCg0KICBbR2VuZWFuZXRdIDxodHRwczovL2VuLmdlbmVhbmV0Lm9yZy9sZWdhbC9nZW5l YW5ldC8+DQoNCiAgW1JvZ2xvIGFzc29jaWF0aW9uXSA8aHR0cHM6Ly9hc3NvLnJvZ2xvLmV1L3Bh Z2UvMzUwNzk1LWFjY3VlaWw+DQoNCg0KQ29udHJpYnV0aW9ucyB0byBvdGhlciBsYW5ndWFnZXMN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQril4ogQ29tcGlsaW5n IHRvIFdhc20gYW5kIFdhc20gU3ltYm9saWMgRXhlY3V0aW9uDQoNCiAgU2luY2UgMjAyMSwgT0Nh bWxQcm8gaGFzIGFjdGl2ZWx5IGNvbnRyaWJ1dGVkIHRvIHRoZSBXM0MncyBlZmZvcnRzIG9uDQog IGJyaW5naW5nIGEgZGVkaWNhdGVkIEdhcmJhZ2UgQ29sbGVjdG9yIHRvIFdlYkFzc2VtYmx5IC0g YW4gZXNzZW50aWFsDQogIGZlYXR1cmUgdGhhdCBoYXMgbm93IGJlY29tZSByZWFsaXR5IHdpdGgg dGhlIGluY3JlYXNlZCB1c2Ugb2YgV2FzbQ0KICAoU2VlIFtIb3cgUHJpbWUgVmlkZW8gdXBkYXRl cyBpdHMgYXBwIGZvciBtb3JlIHRoYW4gOCwwMDAgZGV2aWNlDQogIHR5cGVzXSBvciBbSW50cm9k dWNpbmcgdGhlIERpc25leSsgQXBwbGljYXRpb24gRGV2ZWxvcG1lbnQgS2l0IChBREspXQ0KICAp Lg0KDQogIE91ciB3b3JrIGVuc3VyZWQgdGhlIG9mZmljaWFsIFtXYXNtR0MgcHJvcG9zYWxdIHJl bWFpbmVkIGZ1bGx5DQogIGNvbXBhdGlibGUgd2l0aCB0aGUgbmVlZHMgb2YgT0NhbWwuICBDcnVj aWFsIHRvIHRoaXMgc3VjY2VzcyB3YXMNCiAgW1dhc29jYW1sXSwgb3VyIEZsYW1iZGEtYmFzZWQg YmFja2VuZCB0YXJnZXRpbmcgV2ViQXNzZW1ibHksIHdoaWNoDQogIGhlbHBlZCBkcml2ZSB0aGUg cHJvcG9zYWwncyByZWxlYXNlIGFuZCBzdWJzZXF1ZW50IGltcGxlbWVudGF0aW9uIGluDQogIDIw MjMgYWNyb3NzIGFsbCBtYWpvciBicm93c2Vycy4NCg0KICBPbmUgb2Ygb3VyIGJpZ2dlc3QgY29u dHJpYnV0b3JzIHRvIHRoaXMgd29yaywgTMOpbyBBbmRyw6hzIFtkZWZlbmRlZCBoaXMNCiAgUGhE IGF0IHRoZSBlbmQgb2YgMjAyNF0uIFRoZSB0b3BpYyB3YXMgYWJvdXQgY29tcGlsaW5nIE9DYW1s IHRvIFdhc20NCiAgYnV0IGFsc28gYWJvdXQgYW5vdGhlciBbdG9vbCBuYW1lZCBPd2ldLCBkZXZl bG9wZWQgaW4gY2xvc2UNCiAgY29sbGFib3JhdGlvbiB3aXRoIHRoZSBVbml2ZXJzaXR5IG9mIExp c2JvYS4gT3JpZ2luYWxseSBkZXZlbG9wZWQgYXMgYQ0KICAiV2FzbSBTd2lzc2tuaWZlIiwgT3dp IGhhcyBldm9sdmVkIGludG8gYSBtdWx0aS1jb3JlLCBtdWx0aS1zb2x2ZXIsDQogIGNyb3NzLWxh bmd1YWdlIHN5bWJvbGljIGVuZ2luZS4gSXRzIGNhcGFiaWxpdGllcyBpbmNsdWRlOg0KICDigKIg YXV0b21hdGVkLCBzb3VuZCwgYW5kIHBhcnRpYWxseS1jb3JyZWN0IGJ1Zy1maW5kaW5nIChhbW91 bnRpbmcgdG8gYQ0KICAgIHByb29mKTsNCiAg4oCiIHNvbHZlci1haWRlZCBwcm9ncmFtbWluZyAo dGhpbmsgb2YgUm9zZXR0ZSBmb3IgUm9ja2V0LCBidXQgZm9yIGFueQ0KICAgIGxhbmd1YWdlKTsN CiAg4oCiIGVmZmljaWVudCB0ZXN0LWNhc2UgZ2VuZXJhdGlvbi4NCg0KICBMb29raW5nIGFoZWFk LCB3ZSBhcmUgZXhjaXRlZCB0byBjb21iaW5lIFdhc29jYW1sIGFuZCBPd2ksIGFpbWluZyB0bw0K ICAqcGVyZm9ybSBzeW1ib2xpYyBleGVjdXRpb24gb2YgT0NhbWwqIHByb2dyYW1zLCBhbmQgZXZl biB0aG9zZSB3aXRoDQogIHN1YnN0YW50aWFsIEMgY29tcG9uZW50cyEgV2UndmUgYWxyZWFkeSBh cHBsaWVkIHRoZXNlIHRlY2huaXF1ZXMNCiAgc3VjY2Vzc2Z1bGx5IHRvIFJ1c3QsIHVuY292ZXJp bmcgYSBzdWJ0bGUgYnVnIGluIHRoZSBbUnVzdCBzdGFuZGFyZA0KICBsaWJyYXJ5XS4gSWYgeW91 IHdhbnQgdG8ga25vdyBtb3JlIGFib3V0IGl0LCBoYXZlIGEgbG9vayBhdCBvdXINCiAgW2pvdXJu YWwgYXJ0aWNsZV0uDQoNCiAgU29tZSBvZiB0aGlzIHdvcmsgd2FzIGZ1bmRlZCBieSBOR0kvTkxu ZXQuDQoNCg0KICBbSG93IFByaW1lIFZpZGVvIHVwZGF0ZXMgaXRzIGFwcCBmb3IgbW9yZSB0aGFu IDgsMDAwIGRldmljZSB0eXBlc10NCiAgPGh0dHBzOi8vd3d3LmFtYXpvbi5zY2llbmNlL2Jsb2cv aG93LXByaW1lLXZpZGVvLXVwZGF0ZXMtaXRzLWFwcC1mb3ItbW9yZS10aGFuLTgtMDAwLWRldmlj ZS10eXBlcz4NCg0KICBbSW50cm9kdWNpbmcgdGhlIERpc25leSsgQXBwbGljYXRpb24gRGV2ZWxv cG1lbnQgS2l0IChBREspXQ0KICA8aHR0cHM6Ly9tZWRpdW0uY29tL2Rpc25leS1zdHJlYW1pbmcv aW50cm9kdWNpbmctdGhlLWRpc25leS1hcHBsaWNhdGlvbi1kZXZlbG9wbWVudC1raXQtYWRrLWFk ODVjYTEzOTA3Mz4NCg0KICBbV2FzbUdDIHByb3Bvc2FsXSA8aHR0cHM6Ly9naXRodWIuY29tL1dl YkFzc2VtYmx5L2djPg0KDQogIFtXYXNvY2FtbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9PQ2FtbFBy by93YXNvY2FtbD4NCg0KICBbZGVmZW5kZWQgaGlzIFBoRCBhdCB0aGUgZW5kIG9mIDIwMjRdIDxo dHRwczovL3RoZXNlcy5mci9zMzQwNjE1Pg0KDQogIFt0b29sIG5hbWVkIE93aV0gPGh0dHBzOi8v Z2l0aHViLmNvbS9PQ2FtbFByby9vd2k+DQoNCiAgW1J1c3Qgc3RhbmRhcmQgbGlicmFyeV0NCiAg PGh0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvcnVzdC9wdWxsLzEyOTMyMT4NCg0KICBbam91 cm5hbCBhcnRpY2xlXSA8aHR0cHM6Ly9hcnhpdi5vcmcvcGRmLzI0MTIuMDYzOTE+DQoNCg0K4peK IEZyb20gTmlhZ2FyYSB0byBLb3BlaywgYSBmb290IGluIHRoZSBDaW5lbWEgaW5kdXN0cnkNCg0K ICAyMDI0IHdhcyBhbHNvIGEgbmV3IGFkdmVudHVyZSBpbiBlbnRyZXByZW5ldXJzaGlwIGZvciBP Q2FtbFByby4gSW4NCiAgMjAyMywgd2UgW3dvbiBhIGdyYW50XSBmcm9tIHRoZSBDTkMsIHRoZSBG cmVuY2ggQ2VudGVyIGZvciB0aGUgQ2luZW1hDQogIGluZHVzdHJ5LCB0byB3b3JrIHdpdGggQW50 b2luZSBEZXZ1bGRlciBhbmQgRGVuaXMgTcOpcmlnb3V4IG9uIHRoZQ0KICBkZXNpZ24gb2YgYSAq RFNMIGZvciBtb3ZpZSBwcm9kdWNlcnMqLiBJbmRlZWQsIGRpc3RyaWJ1dGluZyBlYXJuaW5ncw0K ICBpcyBvbmUgb2YgdGhlIG1vc3QgY29tcGxleCB0YXNrcyB0aGF0IGEgcHJvZHVjZXIgbXVzdCBk byBhZnRlciBhIG1vdmllDQogIGlzIHJlbGVhc2VkLCBtb3N0bHkgYmVjYXVzZSBvZiB0aGUgY29t cGxleGl0eSBvZiBjb250cmFjdHMuIFNvIHdlDQogIGRlc2lnbmVkIGEgRFNMLCBpbml0aWFsbHkg Y2FsbGVkIE5pYWdhcmEsIHRoYXQgaXMgY2xvc2UgZW5vdWdoIHRvDQogIGNvbnRyYWN0cyB0byBi ZSBzaW1wbGUgdG8gd3JpdGUsIGFuZCBhdXRvbWF0aWNhbGx5IGNvbXB1dGVzIHRoZSBleGFjdA0K ICBkaXN0cmlidXRpb24gb2YgZWFybmluZ3MgZHVyaW5nIHRoZSBlbnRpcmUgbGlmZSBvZiB0aGUg bW92aWUuDQoNCiAgSW4gMjAyNCwgd2UgZGVjaWRlZCB0byBjcmVhdGUgdGhlIFtLb3BlayBjb21w YW55XSB3aXRoIEFudG9pbmUgYW5kDQogIERlbmlzLCB0byBjb21tZXJjaWFsaXplIHRoaXMgcHJv ZHVjdC4gVGhlIERTTCBpdHNlbGYgaXMgaGlkZGVuIGJlaGluZA0KICBhIG5vLWNvZGUgaW50ZXJm YWNlIHRoYXQgbWFrZXMgYWxsIGludGVyYWN0aW9ucyB3aXRoIHRoZSBzb2Z0d2FyZSBlYXN5DQog IGFuZCBpbnR1aXRpdmUgZm9yIHByb2R1Y2VycywgYW5kIHRoZSB0b29sIGNhbiBkZWFsIHdpdGgg Y29tcGxleA0KICBjb250cmFjdHMgdGhhdCBubyBvdGhlciBzb2Z0d2FyZSBvbiB0aGUgbWFya2V0 IGNhbiBkZWFsIHdpdGguIEZvcg0KICBGcmVuY2ggc3BlYWtlcnMsIHRoZSB0b29sIHdhcyByZWNl bnRseSBbcHJlc2VudGVkIGF0IGEgQ05DIGV2ZW50XSAuDQoNCg0KICBbd29uIGEgZ3JhbnRdDQog IDxodHRwczovL3d3dy5jbmMuZnIvcHJvZmVzc2lvbm5lbHMvYWN0dWFsaXRlcy9yZXN1bHRhdHMt ZGUtbGFwcGVsLWEtcHJvamV0cy0tLXRyYW5zcGFyZW5jZS1kZS1sYS1yZW1vbnRlZS1kZS1yZWNl dHRlcy1kYW5zLWxlLXNlY3RldXItY2luZW1hLWV0LWF1ZGlvdmlzdWVsXzE5MzExODI+DQoNCiAg W0tvcGVrIGNvbXBhbnldIDxodHRwczovL2tvcGVrLmZyPg0KDQogIFtwcmVzZW50ZWQgYXQgYSBD TkMgZXZlbnRdDQogIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTZRM1k3U05URG1n Pg0KDQoNCuKXiiBTdXBlckJPTCwgYSBwb3dlcmZ1bCBMU1AgZm9yIENPQk9MIGFuZCBWaXN1YWwg U3R1ZGlvIENvZGUNCg0KICBGb3IgYSBmZXcgeWVhcnMgbm93LCBPQ2FtbFBybyBoYXMgYmVlbiBb aW52b2x2ZWQgaW4gdGhlIENPQk9MDQogIGVjb3N5c3RlbV0sIG1vc3RseSB0byBoZWxwIHRoZSBG cmVuY2ggdGF4IGFkbWluaXN0cmF0aW9uIHRvIGRlYWwgd2l0aA0KICB0aGUgbWlncmF0aW9uIG9m IENPQk9MIGNvZGUgZnJvbSBsZWdhY3kgc3lzdGVtcyAoR0NPUyBtYWluZnJhbWVzIGZyb20NCiAg dGhlIDgwcykgdG8gQ2xvdWQtYmFzZWQgcGxhdGZvcm1zLiBNb3N0IG9mIG91ciB3b3JrIHdhcyB0 byBleHRlbmQgdGhlDQogIFtmcmVlIG9wZW4tc291cmNlIEdudUNPQk9MIGNvbXBpbGVyXSBmb3Ig dGhlIG5lZWRzIG9mIHRoZQ0KICBhcHBsaWNhdGlvbi4gTW9yZW92ZXIsIHdlIHNwZW50IHNvbWUg dGltZSBjcmVhdGluZyBhbiAqT0NhbWwgZnJhbWV3b3JrDQogIGZvciBDT0JPTCogdG8gYmV0dGVy IHVuZGVyc3RhbmQgdGhpcyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gV2UgcmVsZWFzZWQNCiAgYSBs YXJnZSBwYXJ0IG9mIHRoaXMgd29yayBhcyBhbiBvcGVuLXNvdXJjZSBleHRlbnNpb24gZm9yIFZp c3VhbA0KICBTdHVkaW8gQ29kZSBjYWxsZWQgW1N1cGVyQk9MIFN0dWRpbyBPU1NdLiBCYWNrZWQg Ynkgb3VyIHBvd2VyZnVsIExTUA0KICBzZXJ2ZXIsIHRoaXMgZXh0ZW5zaW9uIGVtcG93ZXJzIGl0 cyB1c2VycyB3aXRoIGFsbCB0aGUgZmVhdHVyZXMgdGhhdA0KICBkZXZlbG9wZXJzIGV4cGVjdCBm cm9tIGEgbW9kZXJuIGVkaXRvciBmb3IgZWRpdGluZyBhbmQgbmF2aWdhdGluZw0KICBDT0JPTCBj b2RlLg0KDQogIEluIDIwMjQsIHdlIGltcHJvdmVkIHRoZSBwYXJzZXIgdG8gc3VwcG9ydCBhIGxh cmdlciBwYXJ0IG9mIHRoZSBDT0JPTA0KICBsYW5ndWFnZSwgd2UgYWRkZWQgYSBwb3dlcmZ1bCBp bmRlbnRvciBvZiBjb2RlLCBwb3dlcmZ1bCBjb2RlDQogIGNvbXBsZXRpb24gZmVhdHVyZXMgZGVy aXZlZCBkaXJlY3RseSBmcm9tIHRoZSBDT0JPTCBncmFtbWFyICh1c2luZyB0aGUNCiAgcmVjZW50 bHkgYWRkZWQgZmVhdHVyZXMgaW4gTWVuaGlyKSwgYXMgd2VsbCBhcyB2YXJpb3VzIHdheXMgdG8g ZGlzcGxheQ0KICB0aGUgY29udHJvbC1mbG93IGdyYXBoIG9mIHByb2dyYW1zIDsgdGhlIGxhdHRl ciBiZWluZyBwYXJ0aWN1bGFybHkNCiAgdXNlZnVsIHdoZW4geW91ciBqb2IgaXMgdG8gbmF2aWdh dGUgYW5kIG1vZGlmeSBjb2RlIHdyaXR0ZW4gbWFueQ0KICBkZWNhZGVzIGFnby4gV2UgYnVpbHQg YW4gZW50aXJlIENJL0NEIHN5c3RlbSBmb3IgU3VwZXJCT0wgdGhhdA0KICBhdXRvbWF0aWNhbGx5 IHJlbGVhc2VzIGNyb3NzLWNvbXBpbGVkLCBzdGF0aWNhbGx5IGxpbmtlZCBiaW5hcmllcyBmb3IN CiAgTGludXgsIFdpbmRvd3MgYW5kIE1hY09TLg0KDQoNCiAgW2ludm9sdmVkIGluIHRoZSBDT0JP TCBlY29zeXN0ZW1dIDxodHRwczovL3N1cGVyYm9sLmV1Pg0KDQogIFtmcmVlIG9wZW4tc291cmNl IEdudUNPQk9MIGNvbXBpbGVyXQ0KICA8aHR0cHM6Ly9nbnVjb2JvbC5zb3VyY2Vmb3JnZS5pby8+ DQoNCiAgW1N1cGVyQk9MIFN0dWRpbyBPU1NdDQogIDxodHRwczovL2dpdGh1Yi5jb20vT0NhbWxQ cm8vc3VwZXJib2wtc3R1ZGlvLW9zcz4NCg0KDQril4ogTWxhbmcgdXNlZCBhdCB0aGUgREdGaVAN Cg0KICBXZSBoYXZlIGFsc28gYmVlbiBpbnZvbHZlZCBmb3Igc29tZSB0aW1lIG5vdyBpbiB0aGUg YWRhcHRhdGlvbiBvZiB0aGUNCiAgW01sYW5nIGNvbXBpbGVyXSB0byByZXBsYWNlIHRoZSBkZXBy ZWNhdGVkIHRvb2xpbmcgb2YgdGhlIERHRmlQDQogIChGcmVuY2ggUHVibGljIEZpbmFuY2VzIERp cmVjdG9yYXRlKSB0byBjb21wdXRlIHRoZSBGcmVuY2ggSW5jb21lIFRheC4NCg0KICAyMDI0IHdh cyBhbiBpbXBvcnRhbnQgbWlsZXN0b25lIGZvciB0aGUgcHJvamVjdCwgYXMgTWxhbmcgd2FzIHVz ZWQgZm9yDQogIHRoZSAqZmlyc3QgdGltZSBpbiBwcm9kdWN0aW9uKi4gSXQgbWVhbnMgdGhhdCB3 ZSB3ZXJlIGFibGUgdG8gY29tcHV0ZQ0KICB0aGUgZXhhY3Qgc2FtZSByZXN1bHRzLCB3aXRoIGNv bXBhcmFibGUgcGVyZm9ybWFuY2UuIE1vcmVvdmVyLCBhcyB0aGUNCiAgZm9ybWVyIGNvbXBpbGVy IHVzZWQgdG8gc3VmZmVyIGZyb20gb3ZlcmZsb3dzIHRoYXQgcmVxdWlyZSBtYW51YWwNCiAgaW5z cGVjdGlvbnMgYW5kIHJlLWV2YWx1YXRpb25zLCB0aGUgbmV3IGNvbXBpbGVyIGFscmVhZHkgcHJv dmlkZXMNCiAgYmVuZWZpdHMgZm9yIERHRmlQLiBXZSBhcmUgbm93IGludm9sdmVkIGluIGltcHJv dmluZyBNbGFuZyB0byBoYW5kbGUNCiAgbXVsdGkteWVhciBjb21wdXRhdGlvbnMsIHNvbWV0aGlu ZyB0aGF0IHVzZWQgdG8gYmUgcGVyZm9ybWVkIHVzaW5nDQogIGhhcmRseSBtYWludGFpbmFibGUg Ym9pbGVycGxhdGUgaW4gQywgYW5kIGluIGltcHJvdmluZyB0aGUgZ2VuZXJhbA0KICBlbnZpcm9u bWVudCBhcm91bmQgdGhlIGNvbXBpbGVyLCB3aXRoIENJL0NEIGFuZCBjb2RlLW5hdmlnYXRpb24g dG9vbHMuDQoNCg0KICBbTWxhbmcgY29tcGlsZXJdIDxodHRwczovL2dpdGh1Yi5jb20vTUxhbmd1 YWdlL21sYW5nPg0KDQoNCkZvcm1hbCBtZXRob2RzDQrilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0K4peKIFRoZSBBbHQtRXJnbyBTTVQgU29sdmVyDQoNCiAgT0Nh bWxQcm8gaGFzIGJlZW4gZGV2ZWxvcGluZyB0aGUgW0FsdC1FcmdvIFNNVCBzb2x2ZXJdIHNpbmNl DQogIDIwMTEuIEFsdC1FcmdvIGlzIHVzdWFsbHkgdXNlZCBiZWhpbmQgY29kZSB2ZXJpZmljYXRp b24gZnJhbWV3b3Jrcw0KICBzdWNoIGFzIFtXaHkzXSAsIFtGcmFtYS1DXSAsIFtUSVMgQW5hbHl6 ZXJdIG9yIFtBZGFjb3JlIFNwYXJrXSAsIHdlDQogIG1haW50YWluIGEgY2xvc2UgcmVsYXRpb25z aGlwIHdpdGggaXRzIGluZHVzdHJpYWwgdXNlcnMgdGhyb3VnaCB0aGUNCiAgW0FsdC1FcmdvIFVz ZXJz4oCZIENsdWJdIHdobyBoYXZlIGFjY2VzcyB0byB0aGUgbW9zdCByZWNlbnQgZmVhdHVyZXMN CiAgYWhlYWQgb2YgdGltZS4gQ3VycmVudCBtZW1iZXJzIGFyZSBbQWRhY29yZV0gLCBbVHJ1c3Qg aW4gU29mdF0gLA0KICBbVGhhbGVzXSAsIFtNRVJDRV0gYW5kIFtDRUEgTGlzdF0gLg0KDQogIElu IDIwMjQsIHdlIHJlbGVhc2VkIGEgYnJhbmQgbmV3IHZlcnNpb24sIFtBbHQtRXJnbyAyLjZdIC4g VGhlDQogIGhpZ2hsaWdodHMgYXJlIGEgYmV0dGVyIHN1cHBvcnQgZm9yIGJpdC12ZWN0b3JzLCBt b2RlbCBnZW5lcmF0aW9uIGZvcg0KICBhbGdlYnJhaWMgZGF0YSB0eXBlcywgb3B0aW1pemF0aW9u IG9mIChtYXhpbWl6ZSkgYW5kIChtaW5pbWl6ZSksIEZQQQ0KICBzdXBwb3J0LCBhbmQgbWFueSBv dGhlciBmZWF0dXJlcyBhbmQgYnVnIGZpeGVzLiBQYXJ0IG9mIHRoaXMgd29yayB3YXMNCiAgYWxz byBmdW5kZWQgYnkgdGhlIFtEZWN5c2lmIGNvbGxhYm9yYXRpdmUgcHJvamVjdF0gd2hlcmUgd2Ug dHJ5IHRvDQogIGltcHJvdmUgQWx0LUVyZ28gZm9yIHVzZSB3aXRoIHRoZSBbQ3JldXNvdCBSdXN0 IFZlcmlmaWVyXSAuDQoNCg0KICBbQWx0LUVyZ28gU01UIHNvbHZlcl0gPGh0dHBzOi8vYWx0LWVy Z28ub2NhbWxwcm8uY29tLz4NCg0KICBbV2h5M10gPGh0dHBzOi8vd3d3LndoeTMub3JnLz4NCg0K ICBbRnJhbWEtQ10gPGh0dHBzOi8vZnJhbWEtYy5jb20vPg0KDQogIFtUSVMgQW5hbHl6ZXJdIDxo dHRwczovL3d3dy50cnVzdC1pbi1zb2Z0LmNvbS90cnVzdGluc29mdC1hbmFseXplcj4NCg0KICBb QWRhY29yZSBTcGFya10gPGh0dHBzOi8vd3d3LmFkYWNvcmUuY29tL2Fib3V0LXNwYXJrPg0KDQog IFtBbHQtRXJnbyBVc2Vyc+KAmSBDbHViXSA8aHR0cHM6Ly9hbHQtZXJnby5vY2FtbHByby5jb20v I2NsdWI+DQoNCiAgW0FkYWNvcmVdIDxodHRwczovL3d3dy5hZGFjb3JlLmNvbS8+DQoNCiAgW1Ry dXN0IGluIFNvZnRdIDxodHRwczovL3d3dy50cnVzdC1pbi1zb2Z0LmNvbS8+DQoNCiAgW1RoYWxl c10NCiAgPGh0dHBzOi8vd3d3LnRoYWxlc2dyb3VwLmNvbS9mci9nbG9iYWwvaW5ub3ZhdGlvbi9y ZWNoZXJjaGUtdGVjaG5vbG9naWU+DQoNCiAgW01FUkNFXSA8aHR0cHM6Ly93d3cubWl0c3ViaXNo aWVsZWN0cmljLXJjZS5ldS8+DQoNCiAgW0NFQSBMaXN0XSA8aHR0cHM6Ly9saXN0LmNlYS5mci9m ci8+DQoNCiAgW0FsdC1FcmdvIDIuNl0NCiAgPGh0dHBzOi8vb2NhbWxwcm8uY29tL2Jsb2cvMjAy NF8wOV8wMV9hbHRfZXJnb18yXzZfMF9yZWxlYXNlZC8+DQoNCiAgW0RlY3lzaWYgY29sbGFib3Jh dGl2ZSBwcm9qZWN0XSA8aHR0cHM6Ly9kZWN5c2lmLmZyL2ZyLz4NCg0KICBbQ3JldXNvdCBSdXN0 IFZlcmlmaWVyXSA8aHR0cHM6Ly9naXRodWIuY29tL2NyZXVzb3QtcnMvY3JldXNvdD4NCg0KDQri l4ogRUFMNisgQ2VydGlmaWNhdGlvbg0KDQogIEluIDIwMjQsIHdlIGhhdmUgYWdhaW4gYmVlbiBp bnZvbHZlZCBpbiBhIGhpZ2ggbGV2ZWwgc29mdHdhcmUNCiAgY2VydGlmaWNhdGlvbiBwcm9jZXNz IChbQ29tbW9uIENyaXRlcmlhIEVBTDYrXSApIHdoZXJlIHdlIHN1Y2Nlc3NmdWxseQ0KICBwcm92 ZWQgb3VyIGNhcGFjaXR5IHRvIGZvcm1hbGl6ZSBzZWN1cml0eSBwb2xpY2llcyBvbiBsb3cgbGV2 ZWwgY29kZQ0KICBmb3IgdmVyeSBpbXBvcnRhbnQgY3VzdG9tZXJzLCB1c2luZyB0aGUgQ29xIHBy b29mIGFzc2lzdGFudC4NCg0KDQogIFtDb21tb24gQ3JpdGVyaWEgRUFMNitdIDxodHRwczovL2Nv bW1vbmNyaXRlcmlhcG9ydGFsLm9yZy9pbmRleC5jZm0+DQoNCg0K4peKIFRhbWluZyBUZXN0IEdl bmVyYXRvcnMgZm9yIEMgd2l0aCBTZWFDb3JhbA0KDQogIFdyaXRpbmcgdW5pdCB0ZXN0cyBpcyBh IHZlcnkgZ29vZCBwcmFjdGljZSwgcGFydGljdWxhcmx5IHdoZW4gdXNpbmcgYQ0KICB3ZWFrbHkt dHlwZWQgbGFuZ3VhZ2UgbGlrZSBDLiBZZXQsIGl0IGlzIGFsc28gYSBjdW1iZXJzb21lIHRhc2ss DQogIGVzcGVjaWFsbHkgd2hlbiB0aGUgZ29hbCBpcyB0byByZWFjaCAxMDAlIGNvdmVyYWdlIG9m IHRoZQ0KICBjb2RlLiBGb3J0dW5hdGVseSwgcGFydCBvZiB0aGlzIHRhc2sgY2FuIGJlIGF1dG9t YXRlZCBieSB0ZXN0DQogIGdlbmVyYXRpb24gdG9vbHMsIGJhc2VkIG9uIGZ1enppbmcsIHN5bWJv bGljIGV4ZWN1dGlvbiwgYW5kIG90aGVyIGNvZGUNCiAgYW5hbHlzaXMgdGVjaG5pcXVlcy4gRWFj aCBvZiB0aGVzZSB0ZWNobmlxdWVzIGhhcyBpdHMgb3duIHN0cmVuZ3Rocw0KICBhbmQgd2Vha25l c3NlcyAoaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UsIG51bWJlciBvZiBnZW5lcmF0ZWQgdGVzdHMs IG9yDQogIHRhcmdldGVkIGNvdmVyYWdlIGNyaXRlcmlhKSwgc28gbXVjaCBzbyB0aGF0IGl0IG9m dGVuIGJlY29tZXMNCiAgbmVjZXNzYXJ5IHRvIGNvbWJpbmUgdGhlbSBpbiBvcmRlciB0byBhY2hp ZXZlIGdvb2QgcmVzdWx0cyBvbg0KICByZWFsaXN0aWMgc291cmNlIGNvZGUuIE1vcmVvdmVyLCB0 aGVzZSB0b29scyBhcmUgb2Z0ZW4gaGFyZCB0bw0KICB1bmRlcnN0YW5kIGFuZCBjb25maWd1cmUg cHJvcGVybHkgZm9yIGEgcHJvamVjdC4NCg0KICBJbiAyMDI0LCBmb2xsb3dpbmcgcHJldmlvdXMg ZXhwZXJpbWVudGF0aW9ucyAoc2VlIFvigJxBbiBFZmZpY2llbnQNCiAgQmxhY2stQm94IFN1cHBv cnQgb2YgQWR2YW5jZWQgQ292ZXJhZ2UgQ3JpdGVyaWEgZm9yIEtsZWXigJ1dICksIHdlDQogIHN0 YXJ0ZWQgd29ya2luZyBvbiBTZWFjb3JhbCwgYSB0b29sIHRoYXQgKmF1dG9tYXRlcyB0aGUgZ2Vu ZXJhdGlvbiBvZg0KICB1bml0IHRlc3RzIGZvciBDKi4gU2VhY29yYWwgcmVsaWVzIG9uIGEgdW5p ZmllZCBkZWZpbml0aW9uIG9mIGNvdmVyYWdlDQogIGNyaXRlcmlhIHRoYXQgaXMgYmFzZWQgb24g dGhlIG5vdGlvbiBvZiBjb3ZlcmFnZSBsYWJlbHMsIGFuZCBpcyBhYmxlDQogIHRvIGxldmVyYWdl IHRoZSBhYmlsaXRpZXMgb2YgbWFueSBleGlzdGluZyB0ZXN0IGdlbmVyYXRpb24gdGVjaG5pcXVl cw0KICBieSBjYXJlZnVsbHkgb3JjaGVzdHJhdGluZyB0aGUgdG9vbHMgdG8gYWNoaWV2ZSBoaWdo IGNvdmVyYWdlIHdpdGggYXMNCiAgZmV3IHRlc3RzIGFzIHBvc3NpYmxlLiBTZWFjb3JhbCBsZXZl cmFnZXMgRnJhbWFDL0xUZXN0DQogIDxodHRwczovL3d3dy5mcmFtYS1jLmNvbS9mYy1wbHVnaW5z L2x0ZXN0Lmh0bWw+IHRvIGF1dG9tYXRpY2FsbHkNCiAgYW5ub3RhdGUgdGhlIGNvZGUgd2l0aCBj b3ZlcmFnZSBsYWJlbHMuIEl0IGN1cnJlbnRseSBzdXBwb3J0cw0KICBbbGliZnV6emVyXSAsIFtL bGVlXSwgYW5kIFtDQk1DXSAuIFNlYWNvcmFsIGNhbiBhbHNvIGRldGVjdA0KICB1bnJlYWNoYWJs ZSBjb2RlIHVzaW5nIFtMVW5jb3ZdLCBhbmQgcmVwb3J0cyBwb3RlbnRpYWwgcnVudGltZSBlcnJv cnMuDQoNCg0KICBb4oCcQW4gRWZmaWNpZW50IEJsYWNrLUJveCBTdXBwb3J0IG9mIEFkdmFuY2Vk IENvdmVyYWdlIENyaXRlcmlhIGZvcg0KICBLbGVl4oCdXSA8aHR0cHM6Ly9kbC5hY20ub3JnL2Rv aS9hYnMvMTAuMTE0NS8zNTU1Nzc2LjM1Nzc3MTM+DQoNCiAgW2xpYmZ1enplcl0gPGh0dHBzOi8v bGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbD4NCg0KICBbS2xlZV0gPGh0dHBzOi8va2xlZS1z ZS5vcmcvPg0KDQogIFtDQk1DXSA8aHR0cHM6Ly93d3cuY3Byb3Zlci5vcmcvY2JtYy8+DQoNCiAg W0xVbmNvdl0gPGh0dHBzOi8vZ2l0LmZyYW1hLWMuY29tL3B1Yi9sdGVzdC9sdW5jb3Y+DQoNCg0K QSBsb25nIHRpbWUgYWdvDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICBJZiB5b3UgaGF2ZSBuZXZlciBoZWFyZCBvZiBPQ2FtbFBybywgaGVyZSBhcmUg YSBmZXcgZXhhbXBsZXMgb2YNCiAgcHJvamVjdHMgdGhhdCB3ZSBjb250cmlidXRlZCB0byB0aGUg T0NhbWwgZWNvc3lzdGVtLCBzaW5jZSB0aGUNCiAgY3JlYXRpb24gb2YgT0NhbWxQcm8gaW4gMjAx MS4NCg0KICDigKIgYG9wYW0nICgqKTogcHJvYmFibHkgdGhlIG1vc3QgcG93ZXJmdWwgcGFja2Fn ZSBtYW5hZ2VyIGluIHRlcm1zIG9mDQogICAgY29uc3RyYWludHMgb3B0aW1pemF0aW9uLCB0aGFu a3MgdG8gdGhlIHdvcmsgb24gQ1VERiBieSBSb2JlcnRvIERpDQogICAgQ29zbW8ncyB0ZWFtLiBO b3cgdGhlIG9mZmljaWFsIHBhY2thZ2UgbWFuYWdlciBvZiBPQ2FtbC4NCiAg4oCiIGBmbGFtYmRh MScgYW5kIGBmbGFtYmRhMicgKCopOiBhIGJhY2tlbmQgZm9yIHRoZSBuYXRpdmUgY29tcGlsZXIN CiAgICB3aXRoIG11bHRpcGxlIGFkZGl0aW9ubmFsIG9wdGltaXphdGlvbiBwYXNzZXMuIEZsYW1i ZGExIHdhcyBtZXJnZWQNCiAgICBpbnRvIHRoZSBvZmZpY2lhbCBPQ2FtbCBjb21waWxlciwgd2hp bGUgRmxhbWJkYTIgaXMgaW50ZWdyYXRlZCBpbg0KICAgIHRoZSBKYW5lIFN0cmVldCBPQ2FtbCBj b21waWxlci4NCiAg4oCiIGBvY3AtaW5kZW50JyAoKik6IGEgdG9vbCB0byBhdXRvbWF0aWNhbGx5 IGluZGVudCBPQ2FtbCBjb2RlIGluDQogICAgZWRpdG9ycywgd2l0aCBtb2RlcyBmb3IgRW1hY3Ms IFZpLCBWc2NvZGUsIGV0Yy4gd2l0aCBwZXItcHJvamVjdA0KICAgIGNvbmZpZ3VyYXRpb24uIEEg bXVzdC11c2UgZm9yIGNvbGxhYm9yYXRpdmUgZWRpdGlvbiBpbnN0ZWFkIG9mDQogICAgb2NhbWxm b3JtYXQuDQogIOKAoiBgb2NwLWluZGV4JyAoKik6IGEgdG9vbCB0byBsb29rdXAgdHlwZXMgYW5k IGRlZmluaXRpb25zIGluIGFuIE9DYW1sDQogICAgcHJvamVjdCwgd2l0aCBtb2RlcyBmb3IgRW1h Y3MsIFZpLCBldGMuIGJhc2VkIG9uIGNtdCBmaWxlcy4NCiAg4oCiIGBvY3AtbWVtcHJvZic6IHRo ZSBtb3N0IHBvd2VyZnVsIG1lbW9yeSBwcm9maWxlciBmb3IgT0NhbWwgdG8gZXZlcg0KICAgIGV4 aXN0LiBXaXRoIGFsbW9zdCBubyBpbXBhY3Qgb24gcnVudGltZSBwZXJmb3JtYW5jZSwgaXQgd2Fz IGFibGUgdG8NCiAgICBkdW1wIGNvbXByZXNzZWQgbWVtb3J5IGR1bXBzIG9mIHRoZSBPQ2FtbCBo ZWFwIHdpdGggZnVsbCB0eXBlDQogICAgaW5mb3JtYXRpb24uDQogIOKAoiBgb2NwLWJ1aWxkJyA6 IHRoZSBmaXJzdCBjb21wb3NhYmxlIGJ1aWxkIHRvb2wgZm9yIE9DYW1sIGJlZm9yZSBkdW5lLA0K ICAgIGl0IHdhcyBhYmxlIHRvIGJ1aWxkIGFueSBPQ2FtbCBwcm9qZWN0IHdpdGggZnVsbCBwYXJh bGxlbGlzbS4gSXQNCiAgICBzdXBwb3J0ZWQgYWRkaXRpb25hbCBsYW5ndWFnZXMgdG8gYnVpbGQg Y3Jvc3MtbGFuZ3VhZ2UgcHJvamVjdHMuDQogIOKAoiBgb2NwLXdpbicgOiBhIGZ1bGwgT0NhbWwg ZGlzdHJpYnV0aW9uIGZvciBXaW5kb3dzLCBjb21pbmcgd2l0aCBhDQogICAgc2ltcGxlIGdyYXBo aWNhbCBpbnN0YWxsZXIuIEl0cyBjb21waWxlciBjb3VsZCBiZSBjb25maWd1cmVkIHRvDQogICAg dGFyZ2V0IGFueSBXaW5kb3dzIEMgdG9vbGNoYWluLCBzdWNoIGFzIE1pbkdXLCBNU1ZDIG9yIEN5 Z3dpbiwgYW5kDQogICAgZW52aXJvbm1lbnQsIHN1Y2ggYXMgTXN5cywgQ3lnd2luIGFuZCBXaW5k b3dzIHNoZWxscywgdGhhbmtzIHRvIHRoZQ0KICAgIHVzZSBvZiBhbiBpbnRlZ3JhdGVkIHg4Ni82 NCBhbmQgZWxmL2NvZmYgYXNzZW1ibGVyIGluIE9DYW1sLg0KDQogICgqKSB0aGFua3MgdG8gZnVu ZGluZyBieSBKYW5lIFN0cmVldA0KDQoNCllvdXIgUHJvamVjdCwgb3VyIEV4cGVydGlzZQ0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSWYgeW91J3JlIGxvb2tpbmcgdG8gbGV2ZXJhZ2Ug dGhlIHBvd2VyIGFuZCBmbGV4aWJpbGl0eSBvZiBPQ2FtbCBmb3INCiAgeW91ciBwcm9qZWN0cywg d2XigJlkIGxvdmUgdG8gY29sbGFib3JhdGUgd2l0aCB5b3UuIEF0IE9DYW1sUHJvLCB3ZQ0KICBi cmluZyB5ZWFycyBvZiBleHBlcnRpc2UsIGlubm92YXRpb24sIGFuZCBhIGRlZXAgY29tbWl0bWVu dCB0bw0KICBlbmhhbmNpbmcgdGhlIE9DYW1sIGVjb3N5c3RlbS4gV2hldGhlciB5b3UgbmVlZCBz dXBwb3J0IHdpdGggY3VzdG9tDQogIGRldmVsb3BtZW50LCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRp b24sIHRvb2xpbmcsIG9yIGFueXRoaW5nIGluDQogIGJldHdlZW4sIHdlIGFyZSBoZXJlIHRvIGhl bHAuDQoNCiAgTGV0J3MgYnVpbGQgc29tZXRoaW5nIGdyZWF0IHRvZ2V0aGVy4oCUcmVhY2ggb3V0 IHRvIHVzIHRvZGF5IHRvIGRpc2N1c3MNCiAgeW91ciBwcm9qZWN0IQ0KDQoNCk9sZCBDV04NCuKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91 IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBn byB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQog IGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2Vl ayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAg W0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2ht aXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0 aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczov L2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6 Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0g PGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= 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 January 21 to 28, 202= 5.

Google Summer of Code

Anton Kochkov announced

Hi everyone! If you plan to apply this year for the Google Summer of Code, = it starts on January 27 and ends on Februrary 11: https:= //opensource.googleblog.com/2025/01/google-summer-of-code-2025-is-here.html=

Merlin and OCaml-LSP support experimental project-wide renamin= g

vds announced

I am delighted to announce that the latest releases of Merlin (5.4.1-= 503) and OCaml-LSP (1.22.0) for OCaml 5.3 provide exper= imental support for project-wide renaming = of symbols.=20

Users of vs= code-ocaml-platform, ocaml-eglot or any generic LSP client can = experiment with the new feature right now via the standard Rename feature of their favorite editors. (This is not enabled in the standard= Emacs and Vim modes yet.)

All project-wide features require the indexer to be installed and an up-to date index built wit= h dune build @ocaml-index --watch (we only ship rules for Dune= , but the indexer itself is agnostic).

This is a complex feature in an experimental state, please report any issue= you might encounter to = Merlin's issue tracker.=20

3D"a1bf8be427da9f11=

Complete changelog

merlin 5.4.1

  • merlin binary
    • Support for OCaml 5.3
    • Use new 5.3 features to improve locate behavior in some cases. Merlin no longer confuses uids from interfaces and implementations. (#1857)
    • Perform less merges in the indexer (#1881)
    • Add initial support for project-wide renaming: occurrences can now retu= rn all usages of all related definitions. (#1877)
  • ocaml-index
    • Bump magic number after index file format change (#1886)
  • vim plugin
    • Added support for search-by-type (#1846) This is exposed through the existing :MerlinSearch command, th= at switches between search-by-type and polarity search depending on the first character of the query.

Ocaml-LSP 1.22.0

  • Enable experimental project-wide renaming of identifiers (#1431)

qcheck-lin and qcheck-stm 0.2

Jan Midtgaard announced

Version 0.7 of qcheck-lin, qcheck-stm, and = qcheck-multicoretests-util is now available on the opam repository: = https://github.com/ocaml-multicore/multicoretests/releases/tag/0.7

This release contains two contributions from @polytypic, incl. an STM= feature to help testing of ~cmd~s that may raise an effect:

  • = #509: Change/Fix to use a symmetric barrier to synchronize domains
  • = #511: Introduce extended specs to allow wrapping command sequences
  • = #517: Add Lin combinators seq_small, ar= ray_small, and list_small

Happy testing! :smiley:

Dune 3.17

Etienne Marais announced

The Dune team is releasing Dune 3.17.2! :wrench:=20

This patch release includes some bug fixes. It mostly brings some fixes for= Melange and Wasm_of_ocaml. It also fixes a bug that prevents the experimen= tal feature, package management, to build with ocaml.5.3.0.

If you encounter a problem with this release, you can report it on the ocaml/dune repository.

Changelog

  • Fixed
    • Fix a crash in the Melange rules that would prevent compiling public li= brary implementations of virtual libraries. (@amonteiro, #11248)
      • Pass melange.emit's compile_flags to the JS e= mission phase. (@amonteiro, #11252)
    • Disallow private implementations of public virtual libs in melang= e mode. (@amonteiro, #11253)
    • Wasm_of_ocaml: fix the execution of tests in a sandbox. (#11304, @voui= llon)

Odoc 3 Beta Release

Jon Ludlam announced

On behalf of the odoc team, I'm thrilled the announce the release of odoc 3= .0.0 beta 1!

This release has been cooking for a long time - it's been more than a year = since odoc 2.4 landed, and a huge amount of work has gone into this. Thanks= to the many others who contributed, either by code or by comments: @juloo,= @panglesd, @EmileTrotignon, @gpetiot, @trefis, @sabine, @dbuenzli, @yawara= min, and more.

With this release we're including a driver that knows how to use all of the= exciting new features of odoc. This driver has been used to create the docs site for the various odoc tools= .

Here are a selected set of features:

  • :droplet: Rendered source! Jump from any item in the documentation stra= ight to its rendered source; no matter how much of OCaml's complex module s= ystem you are using.
  • :mag: Search by type! Our detective sherlodoc will find your lost value= given its type.
  • :warning: Convenient warnings! Warnings are now clearly visible and use= ful, no longer buried among your dependencies=E2=80=99 warnings.
  • :arrow_heading_up: Self host your documentation, but link to ocaml.or= g for your dependencies.
  • :100: More sidebars! Odoc 3 features a global sidebar, allowing = you to discover the most hidden corner of underground documentation.
  • :exploding_head: Image support! This cutting-edge feature now allows yo= u to add images to your documentation. Video and audio come for free.
  • :spider_web: Fully cross-package links! The OCaml doc= s are now a true spider web. Prepare to catch bugs, and eat them.
  • :cop: Hierarchical documentation pages! We use a modular language. We d= on't want a flat namespace for pages.
  • :building_construction: The build dependencies are friendlier with incr= emental build systems, allowing better shared build caches.
  • :heart: Quality of life improvements! Many improvements have been pili= ng up since we started odoc 3. For instance: Add clock emoji before @= since tag (@yawaramin, #1089)!

More explanation of these features is available at the odoc site, where we = have documentation for authors, for users of odoc_driver, a cheatsheet, and differen= ces from ocamldoc.

How can you help?

We need your feedback, both as authors and as users of documentation! Try t= hings out using the new driver:

$ opam install odoc-driver    # don't forget to ~opam update~
$ odoc_driver <package list>  # For instance: ~$ odoc_driver brr odoc~
$ $YOUR_BROWSER _html/index.html

Many of those features' implementations are not set in stone, but first ver= sions. Please leave comments, either in this thread or as issues in the rep= ository.

So, navigate already written documentation, and update your own docs to use= the new features!

2024 at OCamlPro

OCamlPro announced

2024 at OCamlPro

At OCamlPro, we like to solve issues that have an impact in the real world,= so we focus most of our efforts on projects that our customers bring from = their domains. We often like to work in the shadows, focusing on the hardes= t tasks. Fabrice, OCamlPro=E2=80=99s founder, used to say that we are the C= ommandos of OCaml (and now of Rust too), a team of highly skilled professio= nals jumping into the most demanding projects. That ability was illustrated= several times in the past, from the birth of Opam, the development of the = Flambda compilers for Jane Street, the design and development of the Tezos = prototype and ICO platform, to the adventurous extension of the GnuCOBOL op= en-source compiler for French DGFiP, even the port of Flow and Hack to Wind= ows for Meta. Of course, we are always happy to be entrusted with more comm= on projects and tasks also, building a team and training the talents requir= ed to master all tasks, from the simplest to the hardest ones. And the hard= est ones are often hidden in the middle of the simplest ones, too.

The OCaml language is the greatest tool at hand to fulfil our missions, and= we try to contribute back to the OCaml ecosystem when possible. We are alw= ays attracted to issues met by OCaml industrial users, as it gives us the o= pportunity to directly work for the OCaml community. Would you be having su= ch issues, do not hesitate to contact us and discuss what we can do for you!

The beginning of a new year is always a good time to look back at the previ= ous year, and see what we have achieved with OCaml, and sometimes for OCaml= , in 2024.

Contributions to the OCaml ecosystem

  • Sharing Knowledge

    In 2024, we made efforts to dedicate more time to write blog posts to share= our knowledge on the OCaml tools we work on, so that OCaml developers can = use this knowledge in their daily tasks. We wrote a series of articles on m= astering Opam from the ground up ( Opam 101: The First Steps, Opam= 102: Pinning Packages), on the internals of the Flambda2 compiler ( B= ehind the Scenes of the OCaml Optimising Compiler Flambda2: Introduction an= d Roadmap, Flambda2 Ep. 2: Loopifying Tail-Recursive Functions, F= lambda2 Ep. 3: Speculative Inlining ) and one on OCaml backtraces ( OCaml Backtraces on Uncaught Exceptions ). More are comin= g!

    Of course, if you are not patient enough to wait for our next articles, you= may register for one of our trai= nings , we have OCaml Beginner , OCaml Expert , Ma= stering Opam , OCaml Code Optimization and we can build ne= w ones on demand. To be honest, in 2024, we received many more requests for= our sessions on Rust (Beginner, Expert and Embedded) than for OCaml, but m= ore for OCaml ones than for COBOL ones =F0=9F=99=82

  • Opam, Maintenance and Evolution

    Since we created Opam in 2012, we have always had at least one full time en= gineer in the Opam team, to maintain it, add new features and review contri= butions by other members. This was made possible thanks to a partnership wi= th Jane Street, and, since 2024, to a partnership with Tarides.

    In 2024, opam had two major releases, opam 2.3.0 release! and opam 2.2.0 rele= ase! . The most ground-breaking change is the official native suppor= t for Windows, with access to either mingw-w64 gcc compilers or Visual = Studio MSVC compilers with automatic detection. This native support is trem= endous news for OCaml adoption in general, and it was built thanks to a lot= of work from all the community, especially on the opam-repository and pack= ages. An interesting next step to consider for OCaml on Windows would be to= have a single OCaml toolchain for all Windows compilers, using an integrat= ed assembler for x86/x64 with elf/coff support, something that we had imple= mented and tested in OcpWin a long time ago.

    Among many fixes and updates, there is the addition of opam tree <packag= e> to get a nice display of the dependencies of an installed package, opam pin =E2=80=93recursive to look deeper into sub-directories = when searching for opam files and many more small improvements. Check the b= log posts for more details !

  • Work on the OCaml Compiler

    We have had a long partnership with Jane Street to improve the performance = of the code generated by the OCaml compiler. The first outcome of this work= was the Flambda backend, which was merged into OCaml 4.03 in 2016. Since t= hen, we have started a new backend, Flambda2 , that is included in the Jane Street OC= aml compiler.

    In 2024, our team focused its efforts on several new optimizations, like ma= tch in match (simplify pattern-matching appearing in another pattern-matchi= ng after inlining), unbox free vars of closures (shortcut chains of pointer= s stored in closures) or the reaper (do not allocate unused fields of block= s). Such optimizations are often much more complex than you would think, as= guaranteeing that they can be applied safely is not obvious, requiring esc= ape analysis and other checks. We were also very active at helping the comp= iler team at Jane Street by reviewing their code and adapting our backend t= o their needs. If you are interested in this subject, read our blog series = on the topic that was mentioned earlier.

    In 2024, we also had an intern working on modular explicits, an exte= nsion of OCaml first-class modules with module-dependent functions, functio= ns taking first-class modules as arguments. This work can be seen as a firs= t step towards modular implicits, and was presented at the OCaml workshop with Didier R=C3=A9my. The= main pull-request is still under review, while other smaller ones have already been merged,= leading to interesting extensions inside the compiler such as new forms of= dependent types.

  • Optimizing Geneweb, a Webserver for Genealogy<= br />

    Last year, we also started working on Geneweb, a webserver in OCaml that is used to store family tr= ees by genealogists. Geneweb is a very old piece of OCaml, initially writte= n around 1996 by Daniel De Rauglaudre at Inria. It is used both by Geneanet , a genealogy com= pany recently acquired by Ancestry, and the Roglo association, a French association that adm= inistrates a single family tree of more than 10 million persons. One of the= issues faced by the Roglo association was that their branch of the softwar= e had diverged from the official one maintained by Geneanet, as Roglo had t= o use specific features on their branch to cope with the huge size of their= unique family tree. We helped them by optimizing the official branch, so t= hat it could host the tree while providing the same latencies for requests = as before. It required optimizing the representation of stored data (both i= n OCaml and on disk), how it was accessed through system calls, and a good = understanding of the complex algorithms used by Geneweb, typically to trave= rse family members using various relationships.

Contributions to other languages

  • Compiling to Wasm and Wasm Symbolic Execution<= br />

    Since 2021, OCamlPro has actively contributed to the W3C's efforts on bring= ing a dedicated Garbage Collector to WebAssembly - an essential feature tha= t has now become reality with the increased use of Wasm (See How Prime Video updates its app for more than 8,000 dev= ice types or Introducing the D= isney+ Application Development Kit (ADK) ).

    Our work ensured the official WasmGC proposal remained fully compatible with the needs of OCaml. Crucial to this success was Wasocaml, our Flambda-based backend targeting WebAssembly, which help= ed drive the proposal's release and subsequent implementation in 2023 acros= s all major browsers.

    One of our biggest contributors to this work, L=C3=A9o Andr=C3=A8s defended his PhD at the end of 2024. The= topic was about compiling OCaml to Wasm but also about another tool named Owi, developed in close col= laboration with the University of Lisboa. Originally developed as a "Wasm S= wissknife", Owi has evolved into a multi-core, multi-solver, cross-language= symbolic engine. Its capabilities include:

    • automated, sound, and partially-correct bug-finding (amounting to a pro= of);
    • solver-aided programming (think of Rosette for Rocket, but for any lang= uage);
    • efficient test-case generation.

    Looking ahead, we are excited to combine Wasocaml and Owi, aiming to per= form symbolic execution of OCaml programs, and even those with substant= ial C components! We've already applied these techniques successfully to Ru= st, uncovering a subtle bug in the Rust standard library. If you want to know more about= it, have a look at our journa= l article.

    Some of this work was funded by NGI/NLnet.

  • From Niagara to Kopek, a foot in the Cinema in= dustry

    2024 was also a new adventure in entrepreneurship for OCamlPro. In 2023, we= won a grant from the CNC, the French Center f= or the Cinema industry, to work with Antoine Devulder and Denis M=C3=A9rigo= ux on the design of a DSL for movie producers. Indeed, distributing = earnings is one of the most complex tasks that a producer must do after a m= ovie is released, mostly because of the complexity of contracts. So we desi= gned a DSL, initially called Niagara, that is close enough to contracts to = be simple to write, and automatically computes the exact distribution of ea= rnings during the entire life of the movie.

    In 2024, we decided to create the Kopek compa= ny with Antoine and Denis, to commercialize this product. The DSL itsel= f is hidden behind a no-code interface that makes all interactions with the= software easy and intuitive for producers, and the tool can deal with comp= lex contracts that no other software on the market can deal with. For Frenc= h speakers, the tool was recently presented at a CNC event .

  • SuperBOL, a powerful LSP for COBOL and Visual = Studio Code

    For a few years now, OCamlPro has been invo= lved in the COBOL ecosystem, mostly to help the French tax administrati= on to deal with the migration of COBOL code from legacy systems (GCOS mainf= rames from the 80s) to Cloud-based platforms. Most of our work was to exten= d the free open-source GnuCOBO= L compiler for the needs of the application. Moreover, we spent some ti= me creating an OCaml framework for COBOL to better understand this p= rogramming language. We released a large part of this work as an open-sourc= e extension for Visual Studio Code called SuperBOL Studio OSS. Backed by our powerful = LSP server, this extension empowers its users with all the features that de= velopers expect from a modern editor for editing and navigating COBOL code.

    In 2024, we improved the parser to support a larger part of the COBOL langu= age, we added a powerful indentor of code, powerful code completion feature= s derived directly from the COBOL grammar (using the recently added feature= s in Menhir), as well as various ways to display the control-flow graph of = programs ; the latter being particularly useful when your job is to navigat= e and modify code written many decades ago. We built an entire CI/CD system= for SuperBOL that automatically releases cross-compiled, statically linked= binaries for Linux, Windows and MacOS.

  • Mlang used at the DGFiP

    We have also been involved for some time now in the adaptation of the Mlang compiler to replace the= deprecated tooling of the DGFiP (French Public Finances Directorate) to co= mpute the French Income Tax.

    2024 was an important milestone for the project, as Mlang was used for the = first time in production. It means that we were able to compute the = exact same results, with comparable performance. Moreover, as the former co= mpiler used to suffer from overflows that require manual inspections and re= -evaluations, the new compiler already provides benefits for DGFiP. We are = now involved in improving Mlang to handle multi-year computations, somethin= g that used to be performed using hardly maintainable boilerplate in C, and= in improving the general environment around the compiler, with CI/CD and c= ode-navigation tools.

Formal methods

  • The Alt-Ergo SMT Solver

    OCamlPro has been developing the Alt-Ergo SMT solver since 2011. Alt-Ergo is usually used behind code v= erification frameworks such as Why3 ,= Frama-C , TIS Analyzer or Adacore Spark , we maintain a close relati= onship with its industrial users through the Alt-Ergo Users=E2=80=99 Club who have access to the m= ost recent features ahead of time. Current members are Adacore , T= rust in Soft , Thales , MERCE and CEA List<= /a> .

    In 2024, we released a brand new version, Alt-Ergo 2.6 . The highlights = are a better support for bit-vectors, model generation for algebraic data t= ypes, optimization of (maximize) and (minimize), FPA support, and many othe= r features and bug fixes. Part of this work was also funded by the Decysif collaborative project where we try = to improve Alt-Ergo for use with the Creusot Rust Verifier .

  • EAL6+ Certification

    In 2024, we have again been involved in a high level software certification= process (Common Cri= teria EAL6+ ) where we successfully proved our capacity to formalize se= curity policies on low level code for very important customers, using the C= oq proof assistant.

  • Taming Test Generators for C with SeaCoral

    Writing unit tests is a very good practice, particularly when using a weakl= y-typed language like C. Yet, it is also a cumbersome task, especially when= the goal is to reach 100% coverage of the code. Fortunately, part of this = task can be automated by test generation tools, based on fuzzing, symbolic = execution, and other code analysis techniques. Each of these techniques has= its own strengths and weaknesses (in terms of performance, number of gener= ated tests, or targeted coverage criteria), so much so that it often become= s necessary to combine them in order to achieve good results on realistic s= ource code. Moreover, these tools are often hard to understand and configur= e properly for a project.

    In 2024, following previous experimentations (see =E2=80=9CAn Efficient Black-Box Suppo= rt of Advanced Coverage Criteria for Klee=E2=80=9D ), we started workin= g on Seacoral, a tool that automates the generation of unit tests for C<= /b>. Seacoral relies on a unified definition of coverage criteria that is b= ased on the notion of coverage labels, and is able to leverage the abilitie= s of many existing test generation techniques by carefully orchestrating th= e tools to achieve high coverage with as few tests as possible. Seacoral le= verages FramaC/LTest https://www.frama-c.com/fc-plugins/ltest.html to automatically anno= tate the code with coverage labels. It currently supports libfuzzer , Klee, and CBMC . Se= acoral can also detect unreachable code using LUncov, and reports potential runtime errors.

A long time ago

If you have never heard of OCamlPro, here are a few examples of projects th= at we contributed to the OCaml ecosystem, since the creation of OCamlPro in= 2011.

  • opam (*): probably the most powerful package manager in te= rms of constraints optimization, thanks to the work on CUDF by Roberto Di C= osmo's team. Now the official package manager of OCaml.
  • flambda1 and flambda2 (*): a backend for the = native compiler with multiple additionnal optimization passes. Flambda1 was= merged into the official OCaml compiler, while Flambda2 is integrated in = the Jane Street OCaml compiler.
  • ocp-indent (*): a tool to automatically indent OCaml code = in editors, with modes for Emacs, Vi, Vscode, etc. with per-project configu= ration. A must-use for collaborative edition instead of ocamlformat.
  • ocp-index (*): a tool to lookup types and definitions in a= n OCaml project, with modes for Emacs, Vi, etc. based on cmt files.
  • ocp-memprof: the most powerful memory profiler for OCaml t= o ever exist. With almost no impact on runtime performance, it was able to = dump compressed memory dumps of the OCaml heap with full type information.<= /li>
  • ocp-build : the first composable build tool for OCaml befo= re dune, it was able to build any OCaml project with full parallelism. It s= upported additional languages to build cross-language projects.
  • ocp-win : a full OCaml distribution for Windows, coming wi= th a simple graphical installer. Its compiler could be configured to target= any Windows C toolchain, such as MinGW, MSVC or Cygwin, and environment, s= uch as Msys, Cygwin and Windows shells, thanks to the use of an integrated = x86/64 and elf/coff assembler in OCaml.

(*) thanks to funding by Jane Street

Your Project, our Expertise

If you're looking to leverage the power and flexibility of OCaml for your p= rojects, we=E2=80=99d love to collaborate with you. At OCamlPro, we bring y= ears of expertise, innovation, and a deep commitment to enhancing the OCaml= ecosystem. Whether you need support with custom development, performance o= ptimization, tooling, or anything in between, we are here to help.

Let's build something great together=E2=80=94reach out to us today to discu= ss your project!

Old CWN

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

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

--=-=-=--