From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id KAA03605; Wed, 26 Mar 2003 10:28:53 +0100 (MET) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id KAA03945 for ; Wed, 26 Mar 2003 10:28:51 +0100 (MET) Received: from lri.lri.fr (lri.lri.fr [129.175.15.1]) by concorde.inria.fr (8.11.1/8.11.1) with ESMTP id h2Q9Sof29488 for ; Wed, 26 Mar 2003 10:28:50 +0100 (MET) Received: from serveur-mail.lri.fr (serveur-mail [129.175.8.90]) by lri.lri.fr (8.11.6/jtpda-5.3.2) with ESMTP id h2Q9DHj24416 ; Wed, 26 Mar 2003 10:13:17 +0100 (MET) Received: from serveur-demons (mail@serveur-demons [129.175.8.130]) by serveur-mail.lri.fr (8.11.6/jtpda-5.3.2) with ESMTP id h2Q9DGx23478 ; Wed, 26 Mar 2003 10:13:16 +0100 (MET) Received: from marche by serveur-demons with local (Exim 3.35 #1 (Debian)) id 18y6yC-0007C5-00; Wed, 26 Mar 2003 10:13:16 +0100 From: Claude Marche MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="2rJAoM+0X1" Content-Transfer-Encoding: 7bit Message-ID: <16001.28460.565246.171214@mailhost.lri.fr> Date: Wed, 26 Mar 2003 10:13:16 +0100 To: Jean-Christophe.Filliatre@lri.fr (Jean-Christophe Filliatre) Cc: David Brown , Caml List Subject: Re: [Caml-list] Recursive types and functors. In-Reply-To: <16001.25577.356783.999902@gargle.gargle.HOWL> References: <20030326062854.GA15098@opus.davidb.org> <16001.25577.356783.999902@gargle.gargle.HOWL> X-Mailer: VM 7.03 under Emacs 20.7.2 X-MailScanner: Found to be clean X-Spam: no; 0.00; lri:01 caml-list:01 functors:01 filliatre:01 foo:01 struct:01 hash-consing:01 tagging:01 filliatr:01 paris-sud:01 phoneto:01 91405:01 orsay:01 faxto:01 regexp:01 X-Attachments: type="application/octet-stream" name="inttagset.mli" type="application/octet-stream" name="inttagset.ml" type="application/octet-stream" name="foo.mli" type="application/octet-stream" name="foo.ml" type="application/octet-stream" name="test.ml" Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk --2rJAoM+0X1 Content-Type: text/plain; charset=iso-8859-1 Content-Description: message body and .signature Content-Transfer-Encoding: 8bit >>>>> "JCF" == Jean-Christophe Filliatre writes: JCF> David Brown writes: >> I have a recursive type where I'd like one of the constructors of the >> type to contain a set of the type (or something like set). However, I >> can't figure out how to represent this. >> >> For example: >> >> type foo = >> | Integer of int >> | String of string >> | Set of FooSet >> >> module FooSet = Set.Make (struct type t = foo let compare = compare end) >> >> but this obviously doesn't work. JCF> There is (at least) another solution: to use a set implementation JCF> where comparison does not require a comparison of elements. This is JCF> possible if, for instance, you are performing hash-consing on type foo JCF> (which result in tagging foo values with integers, then used in the JCF> comparison). This solution is used in Claude Marché's regexp library JCF> (http://www.lri.fr/~marche/regexp/) and uses a hash-consing technique JCF> available here: http://www.lri.fr/~filliatr/software.en.html Please find below a solution to your problem using this last solution. In fact this is independant of hash-consing, only tagging values with unique integers is important. hash-consing can be added if wanted. I hope my files are self-explanatory, but otherwise please ask me if you need help. The module Inttagset is a variant of patricia trees borrowed from JCF. The module Foo is what you are looking for, and test.ml is a example of use. JCF> Hope this helps, Me too ! -- | Claude Marché | mailto:Claude.Marche@lri.fr | | LRI - Bât. 490 | http://www.lri.fr/~marche/ | | Université de Paris-Sud | phoneto: +33 1 69 15 64 85 | | F-91405 ORSAY Cedex | faxto: +33 1 69 15 65 86 | --2rJAoM+0X1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="inttagset.mli" Content-Transfer-Encoding: base64 KCoKICogUHRzZXQ6IFNldHMgb2YgaW50ZWdlcnMgaW1wbGVtZW50ZWQgYXMgUGF0cmljaWEgdHJl ZXMuCiAqIENvcHlyaWdodCAoQykgMjAwMCBKZWFuLUNocmlzdG9waGUgRklMTElBVFJFCiAqIAog KiBUaGlzIHNvZnR3YXJlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBH ZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqIAogKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICogCiAqIFNl ZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1v cmUgZGV0YWlscwogKiAoZW5jbG9zZWQgaW4gdGhlIGZpbGUgTEdQTCkuCiAqKQoKKCppICRJZDog aW50dGFnc2V0Lm1saSx2IDEuMSAyMDAzLzAzLzA3IDE0OjA0OjAxIG1hcmNoZSBFeHAgJCBpKikK CigqcyBTZXRzIG9mIGludGVnZXJzIGltcGxlbWVudGVkIGFzIFBhdHJpY2lhIHRyZWVzLiAgVGhl IGZvbGxvd2luZwogICAgc2lnbmF0dXJlIGlzIGV4YWN0bHkgW1NldC5TIHdpdGggdHlwZSBlbHQg PSBpbnRdLCB3aXRoIHRoZSBzYW1lCiAgICBzcGVjaWZpY2F0aW9ucy4gVGhpcyBpcyBhIHB1cmVs eSBmdW5jdGlvbmFsIGRhdGEtc3RydWN0dXJlLiBUaGUKICAgIHBlcmZvcm1hbmNlcyBhcmUgYWx3 YXlzIGJldHRlciB0aGFuIHRoZSBzdGFuZGFyZCBsaWJyYXJ5J3MgbW9kdWxlCiAgICBbU2V0XSwg ZXhjZXB0IGZvciBsaW5lYXIgaW5zZXJ0aW9uIChidWlsZGluZyBhIHNldCBieSBpbnNlcnRpb24g b2YKICAgIGNvbnNlY3V0aXZlIGludGVnZXJzKS4gKikKCnR5cGUgJ2EgdAoKdmFsIGVtcHR5IDog J2EgdAoKdmFsIGlzX2VtcHR5IDogJ2EgdCAtPiBib29sCgp2YWwgbWVtIDogaW50IC0+ICdhIHQg LT4gYm9vbAoKdmFsIGFkZCA6IGludCAtPiAnYSAtPiAnYSB0IC0+ICdhIHQKCnZhbCBzaW5nbGV0 b24gOiBpbnQgLT4gJ2EgLT4gJ2EgdAoKdmFsIHJlbW92ZSA6IGludCAtPiAnYSB0IC0+ICdhIHQK CnZhbCB1bmlvbiA6ICdhIHQgLT4gJ2EgdCAtPiAnYSB0Cgp2YWwgc3Vic2V0IDogJ2EgdCAtPiAn YSB0IC0+IGJvb2wKCnZhbCBpbnRlciA6ICdhIHQgLT4gJ2EgdCAtPiAnYSB0Cgp2YWwgZGlmZiA6 ICdhIHQgLT4gJ2EgdCAtPiAnYSB0Cgp2YWwgZXF1YWwgOiAnYSB0IC0+ICdhIHQgLT4gYm9vbAoK dmFsIGNvbXBhcmUgOiAnYSB0IC0+ICdhIHQgLT4gaW50Cgp2YWwgZWxlbWVudHMgOiAnYSB0IC0+ ICdhIGxpc3QKCnZhbCBjaG9vc2UgOiAnYSB0IC0+ICdhIAoKdmFsIGNhcmRpbmFsIDogJ2EgdCAt PiBpbnQKCnZhbCBpdGVyIDogKCdhIC0+IHVuaXQpIC0+ICdhIHQgLT4gdW5pdAoKdmFsIGZvbGQg OiAoJ2EgLT4gJ2IgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgLT4gJ2IKCnZhbCBmb3JfYWxsIDogKCdh IC0+IGJvb2wpIC0+ICdhIHQgLT4gYm9vbAoKdmFsIGV4aXN0cyA6ICgnYSAtPiBib29sKSAtPiAn YSB0IC0+IGJvb2wKCnZhbCBmaWx0ZXIgOiAoJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiAnYSB0Cgp2 YWwgcGFydGl0aW9uIDogKCdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gJ2EgdCAqICdhIHQKCigqcyBB ZGRpdGlvbmFsIGZ1bmN0aW9ucyBub3QgYXBwZWFyaW5nIGluIHRoZSBzaWduYXR1cmUgW1NldC5T XSBmcm9tIG9jYW1sCiAgICBzdGFuZGFyZCBsaWJyYXJ5LiAqKQoKKCogW2ludGVyc2VjdCB1IHZd IGRldGVybWluZXMgaWYgc2V0cyBbdV0gYW5kIFt2XSBoYXZlIGEgbm9uLWVtcHR5IAogICBpbnRl cnNlY3Rpb24uICopIAoKdmFsIGludGVyc2VjdCA6ICdhIHQgLT4gJ2EgdCAtPiBib29sCg== --2rJAoM+0X1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="inttagset.ml" Content-Transfer-Encoding: base64 KCoKICogUHRzZXQ6IFNldHMgb2YgaW50ZWdlcnMgaW1wbGVtZW50ZWQgYXMgUGF0cmljaWEgdHJl ZXMuCiAqIENvcHlyaWdodCAoQykgMjAwMCBKZWFuLUNocmlzdG9waGUgRklMTElBVFJFCiAqIAog KiBUaGlzIHNvZnR3YXJlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBH ZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqIAogKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICogCiAqIFNl ZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1v cmUgZGV0YWlscwogKiAoZW5jbG9zZWQgaW4gdGhlIGZpbGUgTEdQTCkuCiAqKQoKKCppICRJZDog aW50dGFnc2V0Lm1sLHYgMS4xIDIwMDMvMDMvMDcgMTQ6MDQ6MDEgbWFyY2hlIEV4cCAkIGkqKQoK KCpzIFNldHMgb2YgaW50ZWdlcnMgaW1wbGVtZW50ZWQgYXMgUGF0cmljaWEgdHJlZXMsIGZvbGxv d2luZyBDaHJpcwogICAgT2thc2FraSBhbmQgQW5kcmV3IEdpbGwncyBwYXBlciB7XGVtIEZhc3Qg TWVyZ2VhYmxlIEludGVnZXIgTWFwc30KICAgICh7XHR0XHNtYWxsIGh0dHA6Ly93d3cuY3MuY29s dW1iaWEuZWR1L1x+e31jZG8vcGFwZXJzLmh0bWxcI21sOThtYXBzfSkuCiAgICBQYXRyaWNpYSB0 cmVlcyBwcm92aWRlIGZhc3RlciBvcGVyYXRpb25zIHRoYW4gc3RhbmRhcmQgbGlicmFyeSdzCiAg ICBtb2R1bGUgW1NldF0sIGFuZCBlc3BlY2lhbGx5IHZlcnkgZmFzdCBbdW5pb25dLCBbc3Vic2V0 XSwgW2ludGVyXQogICAgYW5kIFtkaWZmXSBvcGVyYXRpb25zLiAqKQoKKCpzIFRoZSBpZGVhIGJl aGluZCBQYXRyaWNpYSB0cmVlcyBpcyB0byBidWlsZCBhIHtcZW0gdHJpZX0gb24gdGhlCiAgICBi aW5hcnkgZGlnaXRzIG9mIHRoZSBlbGVtZW50cywgYW5kIHRvIGNvbXBhY3QgdGhlIHJlcHJlc2Vu dGF0aW9uCiAgICBieSBicmFuY2hpbmcgb25seSBvbmUgdGhlIHJlbGV2YW50IGJpdHMgKGkuZS4g dGhlIG9uZXMgZm9yIHdoaWNoCiAgICB0aGVyZSBpcyBhdCBsZWFzdCBvbiBlbGVtZW50IGluIGVh Y2ggc3VidHJlZSkuIFdlIGltcGxlbWVudCBoZXJlCiAgICB7XGVtIGxpdHRsZS1lbmRpYW59IFBh dHJpY2lhIHRyZWVzOiBiaXRzIGFyZSBwcm9jZXNzZWQgZnJvbQogICAgbGVhc3Qtc2lnbmlmaWNh bnQgdG8gbW9zdC1zaWduaWZpY2FudC4gVGhlIHRyaWUgaXMgaW1wbGVtZW50ZWQgYnkKICAgIHRo ZSBmb2xsb3dpbmcgdHlwZSBbdF0uIFtFbXB0eV0gc3RhbmRzIGZvciB0aGUgZW1wdHkgdHJpZSwg YW5kCiAgICBbTGVhZiBrXSBmb3IgdGhlIHNpbmdsZXRvbiBba10uIChOb3RlIHRoYXQgW2tdIGlz IHRoZSBhY3R1YWwKICAgIGVsZW1lbnQuKSBbQnJhbmNoIChtLHAsbCxyKV0gcmVwcmVzZW50cyBh IGJyYW5jaGluZywgd2hlcmUgW3BdIGlzCiAgICB0aGUgcHJlZml4IChmcm9tIHRoZSByb290IG9m IHRoZSB0cmllKSBhbmQgW21dIGlzIHRoZSBicmFuY2hpbmcKICAgIGJpdCAoYSBwb3dlciBvZiAy KS4gW2xdIGFuZCBbcl0gY29udGFpbiB0aGUgc3Vic2V0cyBmb3Igd2hpY2ggdGhlCiAgICBicmFu Y2hpbmcgYml0IGlzIHJlc3BlY3RpdmVseSAwIGFuZCAxLiBJbnZhcmlhbnQ6IHRoZSB0cmVlcyBb bF0KICAgIGFuZCBbcl0gYXJlIG5vdCBlbXB0eS4gKikKCnR5cGUgJ2EgdCA9CiAgfCBFbXB0eQog IHwgTGVhZiBvZiBpbnQgKiAnYQogIHwgQnJhbmNoIG9mIGludCAqIGludCAqICdhIHQgKiAnYSB0 CgooKnMgRXhhbXBsZTogdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZXQgJFx7MSw0LDVcfSQg aXMKICAgICQkXG1hdGh0dHtCcmFuY2h+KDAsfjEsfkxlYWZ+NCx+QnJhbmNofigxLH40LH5MZWFm fjEsfkxlYWZ+NSkpfSQkCiAgICBUaGUgZmlyc3QgYnJhbmNoaW5nIGJpdCBpcyB0aGUgYml0IDAg KGFuZCB0aGUgY29ycmVzcG9uZGluZyBwcmVmaXgKICAgIGlzIFswYjBdLCBub3Qgb2YgdXNlIGhl cmUpLCB3aXRoICRcezRcfSQgb24gdGhlIGxlZnQgYW5kICRcezEsNVx9JCBvbiB0aGUKICAgIHJp Z2h0LiBUaGVuIHRoZSByaWdodCBzdWJ0cmVlIGJyYW5jaGVzIG9uIGJpdCAyIChhbmQgc28gaGFz IGEgYnJhbmNoaW5nIAogICAgdmFsdWUgb2YgJDJeMiA9IDQkKSwgd2l0aCBwcmVmaXggWzBiMDEg PSAxXS4gKikKCigqcyBFbXB0eSBzZXQgYW5kIHNpbmdsZXRvbnMuICopCgpsZXQgZW1wdHkgPSBF bXB0eQoKbGV0IGlzX2VtcHR5ID0gZnVuY3Rpb24gRW1wdHkgLT4gdHJ1ZSB8IF8gLT4gZmFsc2UK CmxldCBzaW5nbGV0b24gayBlICA9IExlYWYoayxlKQoKKCpzIFRlc3RpbmcgdGhlIG9jY3VycmVu Y2Ugb2YgYSB2YWx1ZSBpcyBzaW1pbGFyIHRvIHRoZSBzZWFyY2ggaW4gYQogICAgYmluYXJ5IHNl YXJjaCB0cmVlLCB3aGVyZSB0aGUgYnJhbmNoaW5nIGJpdCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUK ICAgIGFwcHJvcHJpYXRlIHN1YnRyZWUuICopCgpsZXQgemVyb19iaXQgayBtID0gKGsgbGFuZCBt KSA9PSAwCgpsZXQgcmVjIG1lbSBrID0gZnVuY3Rpb24KICB8IEVtcHR5IC0+IGZhbHNlCiAgfCBM ZWFmKGosXykgLT4gayA9PSBqCiAgfCBCcmFuY2ggKF8sIG0sIGwsIHIpIC0+IG1lbSBrIChpZiB6 ZXJvX2JpdCBrIG0gdGhlbiBsIGVsc2UgcikKCigqcyBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbiBb am9pbl0gd2lsbCBiZSB1c2VkIGluIGJvdGggaW5zZXJ0aW9uIGFuZAogICAgdW5pb24uIEdpdmVu IHR3byBub24tZW1wdHkgdHJlZXMgW3QwXSBhbmQgW3QxXSB3aXRoIGxvbmdlc3QgY29tbW9uCiAg ICBwcmVmaXhlcyBbcDBdIGFuZCBbcDFdIHJlc3BlY3RpdmVseSwgd2hpY2ggYXJlIHN1cHBvc2Vk IHRvCiAgICBkaXNhZ3JlZSwgaXQgY3JlYXRlcyB0aGUgdW5pb24gb2YgW3QwXSBhbmQgW3QxXS4g Rm9yIHRoaXMsIGl0CiAgICBjb21wdXRlcyB0aGUgZmlyc3QgYml0IFttXSB3aGVyZSBbcDBdIGFu ZCBbcDFdIGRpc2FncmVlIGFuZCBjcmVhdGUKICAgIGEgYnJhbmNoaW5nIG5vZGUgb24gdGhhdCBi aXQuIERlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhhdCBiaXQKICAgIGluIFtwMF0sIFt0MF0g d2lsbCBiZSB0aGUgbGVmdCBzdWJ0cmVlIGFuZCBbdDFdIHRoZSByaWdodCBvbmUsIG9yCiAgICB0 aGUgY29udmVyc2UuIENvbXB1dGluZyB0aGUgZmlyc3QgYnJhbmNoaW5nIGJpdCBvZiBbcDBdIGFu ZCBbcDFdCiAgICB1c2VzIGEgbmljZSBwcm9wZXJ0eSBvZiB0d29zLWNvbXBsZW1lbnQgcmVwcmVz ZW50YXRpb24gb2YgaW50ZWdlcnMuICopCgpsZXQgbG93ZXN0X2JpdCB4ID0geCBsYW5kICgteCkK CmxldCBicmFuY2hpbmdfYml0IHAwIHAxID0gbG93ZXN0X2JpdCAocDAgbHhvciBwMSkKCmxldCBt YXNrIHAgbSA9IHAgbGFuZCAobS0xKQoKbGV0IGpvaW4gKHAwLHQwLHAxLHQxKSA9CiAgbGV0IG0g PSBicmFuY2hpbmdfYml0IHAwIHAxIGluCiAgaWYgemVyb19iaXQgcDAgbSB0aGVuIAogICAgQnJh bmNoIChtYXNrIHAwIG0sIG0sIHQwLCB0MSkKICBlbHNlIAogICAgQnJhbmNoIChtYXNrIHAwIG0s IG0sIHQxLCB0MCkKCigqcyBUaGVuIHRoZSBpbnNlcnRpb24gb2YgdmFsdWUgW2tdIGluIHNldCBb dF0gaXMgZWFzaWx5IGltcGxlbWVudGVkCiAgICB1c2luZyBbam9pbl0uICBJbnNlcnRpb24gaW4g YSBzaW5nbGV0b24gaXMganVzdCB0aGUgaWRlbnRpdHkgb3IgYQogICAgY2FsbCB0byBbam9pbl0s IGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgW2tdLiAgV2hlbiBpbnNlcnRpbmcgaW4KICAgIGEg YnJhbmNoaW5nIHRyZWUsIHdlIGZpcnN0IGNoZWNrIGlmIHRoZSB2YWx1ZSB0byBpbnNlcnQgW2td CiAgICBtYXRjaGVzIHRoZSBwcmVmaXggW3BdOiBpZiBub3QsIFtqb2luXSB3aWxsIHRha2UgY2Fy ZSBvZiBjcmVhdGluZwogICAgdGhlIGFib3ZlIGJyYW5jaGluZzsgaWYgc28sIHdlIGp1c3QgaW5z ZXJ0IFtrXSBpbiB0aGUgYXBwcm9wcmlhdGUKICAgIHN1YnRyZWUsIGRlcGVuZGluZyBvZiB0aGUg YnJhbmNoaW5nIGJpdC4gKikKCmxldCBtYXRjaF9wcmVmaXggayBwIG0gPSAobWFzayBrIG0pID09 IHAKCmxldCByZWMgaW5zIGUgayA9IGZ1bmN0aW9uCiAgfCBFbXB0eSAtPiBMZWFmIChrLGUpCiAg fCBMZWFmKGosXykgYXMgdCAtPiAKICAgICAgaWYgaiA9PSBrIHRoZW4gdCBlbHNlIGpvaW4gKGss IExlYWYgKGssZSksIGosIHQpCiAgfCBCcmFuY2ggKHAsbSx0MCx0MSkgYXMgdCAtPgogICAgICBp ZiBtYXRjaF9wcmVmaXggayBwIG0gdGhlbgoJaWYgemVyb19iaXQgayBtIHRoZW4gCgkgIEJyYW5j aCAocCwgbSwgaW5zIGUgayB0MCwgdDEpCgllbHNlCgkgIEJyYW5jaCAocCwgbSwgdDAsIGlucyBl IGsgdDEpCiAgICAgIGVsc2UKCWpvaW4gKGssIExlYWYgKGssZSksIHAsIHQpCgpsZXQgYWRkIGsg ZSB0ID0gaW5zIGUgayB0CgooKnMgVGhlIGNvZGUgdG8gcmVtb3ZlIGFuIGVsZW1lbnQgaXMgYmFz aWNhbGx5IHNpbWlsYXIgdG8gdGhlIGNvZGUgb2YKICAgIGluc2VydGlvbi4gQnV0IHNpbmNlIHdl IGhhdmUgdG8gbWFpbnRhaW4gdGhlIGludmFyaWFudCB0aGF0IGJvdGgKICAgIHN1YnRyZWVzIG9m IGEgW0JyYW5jaF0gbm9kZSBhcmUgbm9uLWVtcHR5LCB3ZSB1c2UgaGVyZSB0aGUgCiAgICBgYHNt YXJ0IGNvbnN0cnVjdG9yJycgW2JyYW5jaF0gaW5zdGVhZCBvZiBbQnJhbmNoXS4gKikKCmxldCBi cmFuY2ggPSBmdW5jdGlvbgogIHwgKF8sXyxFbXB0eSx0KSAtPiB0CiAgfCAoXyxfLHQsRW1wdHkp IC0+IHQKICB8IChwLG0sdDAsdDEpICAgLT4gQnJhbmNoIChwLG0sdDAsdDEpCgpsZXQgcmVjIHJt diBrID0gZnVuY3Rpb24KICB8IEVtcHR5IC0+IEVtcHR5CiAgfCBMZWFmKGosXykgYXMgdCAtPiBp ZiBrID09IGogdGhlbiBFbXB0eSBlbHNlIHQKICB8IEJyYW5jaCAocCxtLHQwLHQxKSBhcyB0IC0+ IAogICAgICBpZiBtYXRjaF9wcmVmaXggayBwIG0gdGhlbgoJaWYgemVyb19iaXQgayBtIHRoZW4K CSAgYnJhbmNoIChwLCBtLCBybXYgayB0MCwgdDEpCgllbHNlCgkgIGJyYW5jaCAocCwgbSwgdDAs IHJtdiBrIHQxKQogICAgICBlbHNlCgl0CgpsZXQgcmVtb3ZlIGsgdCA9IHJtdiBrIHQKCigqcyBP bmUgbmljZSBwcm9wZXJ0eSBvZiBQYXRyaWNpYSB0cmVlcyBpcyB0byBzdXBwb3J0IGEgZmFzdCB1 bmlvbgogICAgb3BlcmF0aW9uIChhbmQgYWxzbyBmYXN0IHN1YnNldCwgZGlmZmVyZW5jZSBhbmQg aW50ZXJzZWN0aW9uCiAgICBvcGVyYXRpb25zKS4gV2hlbiBtZXJnaW5nIHR3byBicmFuY2hpbmcg dHJlZXMgd2UgZXhhbWluZSB0aGUKICAgIGZvbGxvd2luZyBmb3VyIGNhc2VzOiAoMSkgdGhlIHRy ZWVzIGhhdmUgZXhhY3RseSB0aGUgc2FtZQogICAgcHJlZml4OyAoMi8zKSBvbmUgcHJlZml4IGNv bnRhaW5zIHRoZSBvdGhlciBvbmU7IGFuZCAoNCkgdGhlCiAgICBwcmVmaXhlcyBkaXNhZ3JlZS4g SW4gY2FzZXMgKDEpLCAoMikgYW5kICgzKSB0aGUgcmVjdXJzaW9uIGlzCiAgICBpbW1lZGlhdGU7 IGluIGNhc2UgKDQpIHRoZSBmdW5jdGlvbiBbam9pbl0gY3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUK ICAgIGJyYW5jaGluZy4gKikKCmxldCByZWMgbWVyZ2UgPSBmdW5jdGlvbgogIHwgRW1wdHksIHQg IC0+IHQKICB8IHQsIEVtcHR5ICAtPiB0CiAgfCBMZWFmKGssZSksIHQgLT4gYWRkIGsgZSB0CiAg fCB0LCBMZWFmKGssZSkgLT4gYWRkIGsgZSB0CiAgfCAoQnJhbmNoIChwLG0sczAsczEpIGFzIHMp LCAoQnJhbmNoIChxLG4sdDAsdDEpIGFzIHQpIC0+CiAgICAgIGlmIG0gPT0gbiAmJiBtYXRjaF9w cmVmaXggcSBwIG0gdGhlbgoJKCogVGhlIHRyZWVzIGhhdmUgdGhlIHNhbWUgcHJlZml4LiBNZXJn ZSB0aGUgc3VidHJlZXMuICopCglCcmFuY2ggKHAsIG0sIG1lcmdlIChzMCx0MCksIG1lcmdlIChz MSx0MSkpCiAgICAgIGVsc2UgaWYgbSA8IG4gJiYgbWF0Y2hfcHJlZml4IHEgcCBtIHRoZW4KCSgq IFtxXSBjb250YWlucyBbcF0uIE1lcmdlIFt0XSB3aXRoIGEgc3VidHJlZSBvZiBbc10uICopCglp ZiB6ZXJvX2JpdCBxIG0gdGhlbiAKCSAgQnJhbmNoIChwLCBtLCBtZXJnZSAoczAsdCksIHMxKQog ICAgICAgIGVsc2UgCgkgIEJyYW5jaCAocCwgbSwgczAsIG1lcmdlIChzMSx0KSkKICAgICAgZWxz ZSBpZiBtID4gbiAmJiBtYXRjaF9wcmVmaXggcCBxIG4gdGhlbgoJKCogW3BdIGNvbnRhaW5zIFtx XS4gTWVyZ2UgW3NdIHdpdGggYSBzdWJ0cmVlIG9mIFt0XS4gKikKCWlmIHplcm9fYml0IHAgbiB0 aGVuCgkgIEJyYW5jaCAocSwgbiwgbWVyZ2UgKHMsdDApLCB0MSkKCWVsc2UKCSAgQnJhbmNoIChx LCBuLCB0MCwgbWVyZ2UgKHMsdDEpKQogICAgICBlbHNlCgkoKiBUaGUgcHJlZml4ZXMgZGlzYWdy ZWUuICopCglqb2luIChwLCBzLCBxLCB0KQoKbGV0IHVuaW9uIHMgdCA9IG1lcmdlIChzLHQpCgoo KnMgV2hlbiBjaGVja2luZyBpZiBbczFdIGlzIGEgc3Vic2V0IG9mIFtzMl0gb25seSB0d28gb2Yg dGhlIGFib3ZlCiAgICBmb3VyIGNhc2VzIGFyZSByZWxldmFudDogd2hlbiB0aGUgcHJlZml4ZXMg YXJlIHRoZSBzYW1lIGFuZCB3aGVuIHRoZQogICAgcHJlZml4IG9mIFtzMV0gY29udGFpbnMgdGhl IG9uZSBvZiBbczJdLCBhbmQgdGhlbiB0aGUgcmVjdXJzaW9uIGlzCiAgICBvYnZpb3VzLiBJbiB0 aGUgb3RoZXIgdHdvIGNhc2VzLCB0aGUgcmVzdWx0IGlzIFtmYWxzZV0uICopCgpsZXQgcmVjIHN1 YnNldCBzMSBzMiA9IG1hdGNoIChzMSxzMikgd2l0aAogIHwgRW1wdHksIF8gLT4gdHJ1ZQogIHwg XywgRW1wdHkgLT4gZmFsc2UKICB8IExlYWYoazEsXyksIF8gLT4gbWVtIGsxIHMyCiAgfCBCcmFu Y2ggXywgTGVhZiBfIC0+IGZhbHNlCiAgfCBCcmFuY2ggKHAxLG0xLGwxLHIxKSwgQnJhbmNoIChw MixtMixsMixyMikgLT4KICAgICAgaWYgbTEgPT0gbTIgJiYgcDEgPT0gcDIgdGhlbgoJc3Vic2V0 IGwxIGwyICYmIHN1YnNldCByMSByMgogICAgICBlbHNlIGlmIG0xID4gbTIgJiYgbWF0Y2hfcHJl Zml4IHAxIHAyIG0yIHRoZW4KCWlmIHplcm9fYml0IHAxIG0yIHRoZW4gCgkgIHN1YnNldCBsMSBs MiAmJiBzdWJzZXQgcjEgbDIKCWVsc2UgCgkgIHN1YnNldCBsMSByMiAmJiBzdWJzZXQgcjEgcjIK ICAgICAgZWxzZQoJZmFsc2UKCigqcyBUbyBjb21wdXRlIHRoZSBpbnRlcnNlY3Rpb24gYW5kIHRo ZSBkaWZmZXJlbmNlIG9mIHR3byBzZXRzLCB3ZQogICAgc3RpbGwgZXhhbWluZSB0aGUgc2FtZSBm b3VyIGNhc2VzIGFzIGluIFttZXJnZV0uIFRoZSByZWN1cnNpb24gaXMKICAgIHRoZW4gb2J2aW91 cy4gKikKCmxldCByZWMgaW50ZXIgczEgczIgPSBtYXRjaCAoczEsczIpIHdpdGgKICB8IEVtcHR5 LCBfIC0+IEVtcHR5CiAgfCBfLCBFbXB0eSAtPiBFbXB0eQogIHwgTGVhZihrMSxfKSwgXyAtPiBp ZiBtZW0gazEgczIgdGhlbiBzMSBlbHNlIEVtcHR5CiAgfCBfLCBMZWFmKGsyLF8pIC0+IGlmIG1l bSBrMiBzMSB0aGVuIHMyIGVsc2UgRW1wdHkKICB8IEJyYW5jaCAocDEsbTEsbDEscjEpLCBCcmFu Y2ggKHAyLG0yLGwyLHIyKSAtPgogICAgICBpZiBtMSA9PSBtMiAmJiBwMSA9PSBwMiB0aGVuIAoJ bWVyZ2UgKGludGVyIGwxIGwyLCBpbnRlciByMSByMikKICAgICAgZWxzZSBpZiBtMSA8IG0yICYm IG1hdGNoX3ByZWZpeCBwMiBwMSBtMSB0aGVuCglpbnRlciAoaWYgemVyb19iaXQgcDIgbTEgdGhl biBsMSBlbHNlIHIxKSBzMgogICAgICBlbHNlIGlmIG0xID4gbTIgJiYgbWF0Y2hfcHJlZml4IHAx IHAyIG0yIHRoZW4KCWludGVyIHMxIChpZiB6ZXJvX2JpdCBwMSBtMiB0aGVuIGwyIGVsc2UgcjIp CiAgICAgIGVsc2UKCUVtcHR5CgpsZXQgcmVjIGRpZmYgczEgczIgPSBtYXRjaCAoczEsczIpIHdp dGgKICB8IEVtcHR5LCBfIC0+IEVtcHR5CiAgfCBfLCBFbXB0eSAtPiBzMQogIHwgTGVhZihrMSxf KSwgXyAtPiBpZiBtZW0gazEgczIgdGhlbiBFbXB0eSBlbHNlIHMxCiAgfCBfLCBMZWFmKGsyLF8p IC0+IHJlbW92ZSBrMiBzMQogIHwgQnJhbmNoIChwMSxtMSxsMSxyMSksIEJyYW5jaCAocDIsbTIs bDIscjIpIC0+CiAgICAgIGlmIG0xID09IG0yICYmIHAxID09IHAyIHRoZW4KCW1lcmdlIChkaWZm IGwxIGwyLCBkaWZmIHIxIHIyKQogICAgICBlbHNlIGlmIG0xIDwgbTIgJiYgbWF0Y2hfcHJlZml4 IHAyIHAxIG0xIHRoZW4KCWlmIHplcm9fYml0IHAyIG0xIHRoZW4gCgkgIG1lcmdlIChkaWZmIGwx IHMyLCByMSkgCgllbHNlIAoJICBtZXJnZSAobDEsIGRpZmYgcjEgczIpCiAgICAgIGVsc2UgaWYg bTEgPiBtMiAmJiBtYXRjaF9wcmVmaXggcDEgcDIgbTIgdGhlbgoJaWYgemVyb19iaXQgcDEgbTIg dGhlbiBkaWZmIHMxIGwyIGVsc2UgZGlmZiBzMSByMgogICAgICBlbHNlCglzMQoKKCpzIEFsbCB0 aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgKFtjYXJkaW5hbF0sIFtpdGVyXSwgW2ZvbGRdLCBbZm9y X2FsbF0sCiAgICBbZXhpc3RzXSwgW2ZpbHRlcl0sIFtwYXJ0aXRpb25dLCBbY2hvb3NlXSwgW2Vs ZW1lbnRzXSkgYXJlCiAgICBpbXBsZW1lbnRlZCBhcyBmb3IgYW55IG90aGVyIGtpbmQgb2YgYmlu YXJ5IHRyZWVzLiAqKQoKbGV0IHJlYyBjYXJkaW5hbCA9IGZ1bmN0aW9uCiAgfCBFbXB0eSAtPiAw CiAgfCBMZWFmIF8gLT4gMQogIHwgQnJhbmNoIChfLF8sdDAsdDEpIC0+IGNhcmRpbmFsIHQwICsg Y2FyZGluYWwgdDEKOzsKCmxldCByZWMgaXRlciBmID0gZnVuY3Rpb24KICB8IEVtcHR5IC0+ICgp CiAgfCBMZWFmKF8sZSkgLT4gZiBlCiAgfCBCcmFuY2ggKF8sXyx0MCx0MSkgLT4gaXRlciBmIHQw OyBpdGVyIGYgdDEKOzsKICAgICAgCmxldCByZWMgZm9sZCBmIHMgYWNjdSA9IG1hdGNoIHMgd2l0 aAogIHwgRW1wdHkgLT4gYWNjdQogIHwgTGVhZihfLGUpIC0+IGYgZSBhY2N1CiAgfCBCcmFuY2gg KF8sXyx0MCx0MSkgLT4gZm9sZCBmIHQwIChmb2xkIGYgdDEgYWNjdSkKOzsKCmxldCByZWMgZm9y X2FsbCBwID0gZnVuY3Rpb24KICB8IEVtcHR5IC0+IHRydWUKICB8IExlYWYoXyxlKSAtPiBwIGUK ICB8IEJyYW5jaCAoXyxfLHQwLHQxKSAtPiBmb3JfYWxsIHAgdDAgJiYgZm9yX2FsbCBwIHQxCjs7 CgpsZXQgcmVjIGV4aXN0cyBwID0gZnVuY3Rpb24KICB8IEVtcHR5IC0+IGZhbHNlCiAgfCBMZWFm KF8sZSkgLT4gcCBlCiAgfCBCcmFuY2ggKF8sXyx0MCx0MSkgLT4gZXhpc3RzIHAgdDAgfHwgZXhp c3RzIHAgdDEKOzsKCmxldCBmaWx0ZXIgcCBzID0gCiAgbGV0IHJlYyBmaWx0IGFjYyA9IGZ1bmN0 aW9uCiAgICB8IEVtcHR5IC0+IGFjYwogICAgfCBMZWFmKGssZSkgLT4gaWYgcCBlIHRoZW4gYWRk IGsgZSBhY2MgZWxzZSBhY2MKICAgIHwgQnJhbmNoIChfLF8sdDAsdDEpIC0+IGZpbHQgKGZpbHQg YWNjIHQwKSB0MQogIGluCiAgZmlsdCBFbXB0eSBzCjs7CgpsZXQgcGFydGl0aW9uIHAgcyA9CiAg bGV0IHJlYyBwYXJ0ICh0LGYgYXMgYWNjKSA9IGZ1bmN0aW9uCiAgICB8IEVtcHR5IC0+IGFjYwog ICAgfCBMZWFmKGssZSkgLT4gaWYgcCBlIHRoZW4gKGFkZCBrIGUgdCwgZikgZWxzZSAodCwgYWRk IGsgZSBmKQogICAgfCBCcmFuY2ggKF8sXyx0MCx0MSkgLT4gcGFydCAocGFydCBhY2MgdDApIHQx CiAgaW4KICBwYXJ0IChFbXB0eSwgRW1wdHkpIHMKOzsKCmxldCByZWMgY2hvb3NlID0gZnVuY3Rp b24KICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZAogIHwgTGVhZihfLGUpIC0+IGUKICB8IEJy YW5jaCAoXywgXyx0MCxfKSAtPiBjaG9vc2UgdDAgICAoKiB3ZSBrbm93IHRoYXQgW3QwXSBpcyBu b24tZW1wdHkgKikKOzsKCmxldCBlbGVtZW50cyBzID0KICBsZXQgcmVjIGVsZW1lbnRzX2F1eCBh Y2MgPSBmdW5jdGlvbgogICAgfCBFbXB0eSAtPiBhY2MKICAgIHwgTGVhZihfLGUpIC0+IGUgOjog YWNjCiAgICB8IEJyYW5jaCAoXyxfLGwscikgLT4gZWxlbWVudHNfYXV4IChlbGVtZW50c19hdXgg YWNjIGwpIHIKICBpbgogIGVsZW1lbnRzX2F1eCBbXSBzCjs7CgooKnMgQW5vdGhlciBuaWNlIHBy b3BlcnR5IG9mIFBhdHJpY2lhIHRyZWVzIGlzIHRvIGJlIGluZGVwZW5kZW50IG9mIHRoZQogICAg b3JkZXIgb2YgaW5zZXJ0aW9uLiBBcyBhIGNvbnNlcXVlbmNlLCB0d28gUGF0cmljaWEgdHJlZXMg aGF2ZSB0aGUKICAgIHNhbWUgZWxlbWVudHMgaWYgYW5kIG9ubHkgaWYgdGhleSBhcmUgc3RydWN0 dXJhbGx5IGVxdWFsLiAqKQoKbGV0IGVxdWFsID0gKD0pCgpsZXQgY29tcGFyZSA9IGNvbXBhcmUK CgooKnMgQWRkaXRpb25hbCBmdW5jdGlvbnMgdy5yLnQgdG8gW1NldC5TXS4gKikKCmxldCByZWMg aW50ZXJzZWN0IHMxIHMyID0gbWF0Y2ggKHMxLHMyKSB3aXRoCiAgfCBFbXB0eSwgXyAtPiBmYWxz ZQogIHwgXywgRW1wdHkgLT4gZmFsc2UKICB8IExlYWYoazEsXyksIF8gLT4gbWVtIGsxIHMyCiAg fCBfLCBMZWFmKGsyLF8pIC0+IG1lbSBrMiBzMQogIHwgQnJhbmNoIChwMSxtMSxsMSxyMSksIEJy YW5jaCAocDIsbTIsbDIscjIpIC0+CiAgICAgIGlmIG0xID09IG0yICYmIHAxID09IHAyIHRoZW4K ICAgICAgICBpbnRlcnNlY3QgbDEgbDIgfHwgaW50ZXJzZWN0IHIxIHIyCiAgICAgIGVsc2UgaWYg bTEgPCBtMiAmJiBtYXRjaF9wcmVmaXggcDIgcDEgbTEgdGhlbgogICAgICAgIGludGVyc2VjdCAo aWYgemVyb19iaXQgcDIgbTEgdGhlbiBsMSBlbHNlIHIxKSBzMgogICAgICBlbHNlIGlmIG0xID4g bTIgJiYgbWF0Y2hfcHJlZml4IHAxIHAyIG0yIHRoZW4KICAgICAgICBpbnRlcnNlY3QgczEgKGlm IHplcm9fYml0IHAxIG0yIHRoZW4gbDIgZWxzZSByMikKICAgICAgZWxzZQogICAgICAgIGZhbHNl Cg== --2rJAoM+0X1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="foo.mli" Content-Transfer-Encoding: base64 dHlwZSBmb287OwoKdHlwZSBmb29fbm9kZSA9IAogIHwgSW50ZWdlciBvZiBpbnQgCiAgfCBTdHJp bmcgb2Ygc3RyaW5nIAogIHwgU2V0IG9mIGZvbyBJbnR0YWdzZXQudAoKdHlwZSBmb29fc2V0ID0g Zm9vIEludHRhZ3NldC50Cgp2YWwgZm9vX25vZGUgOiBmb28gLT4gZm9vX25vZGU7Owp2YWwgZm9v X2ludCA6IGludCAtPiBmb28KdmFsIGZvb19zdHJpbmcgOiBzdHJpbmcgLT4gZm9vCnZhbCBmb29f c2V0IDogZm9vX3NldCAtPiBmb28KdmFsIGZvb19hZGQgOiBmb28gLT4gZm9vX3NldCAtPiBmb29f c2V0CnZhbCBmb29fbWVtIDogZm9vIC0+IGZvb19zZXQgLT4gYm9vbAo= --2rJAoM+0X1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="foo.ml" Content-Transfer-Encoding: base64 CnR5cGUgZm9vID0KICB7CiAgICBmb29fdGFnIDogaW50OwogICAgZm9vX3ZhbCA6IGZvb19ub2Rl CiAgfSAKCmFuZCBmb29fbm9kZSA9CiAgIHwgSW50ZWdlciBvZiBpbnQKICAgfCBTdHJpbmcgb2Yg c3RyaW5nCiAgIHwgU2V0IG9mIGZvbyBJbnR0YWdzZXQudAogCnR5cGUgZm9vX3NldCA9IGZvbyBJ bnR0YWdzZXQudDs7CgpsZXQgZm9vX25vZGUgZiA9IGYuZm9vX3ZhbAogCmxldCB0YWdfY291bnRl ciA9IHJlZiAwCgpsZXQgZm9vX2ludCBpID0KICBpbmNyIHRhZ19jb3VudGVyOwogIHsgZm9vX3Rh ZyA9ICF0YWdfY291bnRlcjsgZm9vX3ZhbCA9IEludGVnZXIgaSB9CgpsZXQgZm9vX3N0cmluZyBz ID0KICBpbmNyIHRhZ19jb3VudGVyOwogIHsgZm9vX3RhZyA9ICF0YWdfY291bnRlcjsgZm9vX3Zh bCA9IFN0cmluZyBzIH0KCmxldCBmb29fc2V0IHMgPQogIGluY3IgdGFnX2NvdW50ZXI7CiAgeyBm b29fdGFnID0gIXRhZ19jb3VudGVyOyBmb29fdmFsID0gU2V0IHMgfQoKbGV0IGZvb19hZGQgZiBz ID0gSW50dGFnc2V0LmFkZCBmLmZvb190YWcgZiBzOzsKCmxldCBmb29fbWVtIGYgcyA9IEludHRh Z3NldC5tZW0gZi5mb29fdGFnIHM7OwoKCg== --2rJAoM+0X1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="test.ml" Content-Transfer-Encoding: base64 CiNsb2FkICJpbnR0YWdzZXQuY21vIjs7CiNsb2FkICJmb28uY21vIjs7CgpvcGVuIEZvbzs7Cgps ZXQgdjEgPSAKICBmb29fc2V0IAogICAgKGZvb19hZGQgKGZvb19pbnQgNCkgCiAgICAgICAoZm9v X2FkZCAoZm9vX3N0cmluZyAiaGVsbG8iKSAKCSAgSW50dGFnc2V0LmVtcHR5KSk7OwoKbGV0IHYy ID0gCiAgZm9vX3NldCAKICAgIChmb29fYWRkIChmb29fc3RyaW5nICJ3b3JsZCIpIAogICAgICAg KGZvb19hZGQgdjEgSW50dGFnc2V0LmVtcHR5KSk7OwoKbGV0IHJlYyBhbGxfc3RyaW5ncyBmb28g YWNjID0KICBtYXRjaCBmb29fbm9kZSBmb28gd2l0aAogICAgfCBJbnRlZ2VyIF8gLT4gYWNjCiAg ICB8IFN0cmluZyBzIC0+IHM6OmFjYwogICAgfCBTZXQgcyAtPiBJbnR0YWdzZXQuZm9sZCBhbGxf c3RyaW5ncyBzIGFjYwo7OwoKYWxsX3N0cmluZyB2Mjs7Cg== --2rJAoM+0X1-- ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners