From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Klaus-Dieter Bauer Newsgroups: gmane.emacs.devel Subject: Re: Can the byte-compiler check whether functions passed by name are defined? Date: Wed, 7 Aug 2013 13:27:50 +0200 Message-ID: References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=047d7b66fd3bb0f51404e359d681 X-Trace: ger.gmane.org 1375874914 13660 80.91.229.3 (7 Aug 2013 11:28:34 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 7 Aug 2013 11:28:34 +0000 (UTC) Cc: Sebastian Wiesner , emacs-devel@gnu.org To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Aug 07 13:28:37 2013 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1V71uq-0007yR-7w for ged-emacs-devel@m.gmane.org; Wed, 07 Aug 2013 13:28:32 +0200 Original-Received: from localhost ([::1]:59765 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V71up-0008PO-PA for ged-emacs-devel@m.gmane.org; Wed, 07 Aug 2013 07:28:31 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:34226) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V71ui-0008P2-Ew for emacs-devel@gnu.org; Wed, 07 Aug 2013 07:28:28 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V71uf-0006Kj-7z for emacs-devel@gnu.org; Wed, 07 Aug 2013 07:28:24 -0400 Original-Received: from mail-ve0-x22f.google.com ([2607:f8b0:400c:c01::22f]:40181) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V71uf-0006Kb-3t for emacs-devel@gnu.org; Wed, 07 Aug 2013 07:28:21 -0400 Original-Received: by mail-ve0-f175.google.com with SMTP id oy10so1628394veb.34 for ; Wed, 07 Aug 2013 04:28:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=mMd8f1pTpbgDSGZUjFgMWOZgm48Gw9nTXjy+maGB2Ko=; b=RQ6MU+sXob2sDDh39E57dwRG+sOdDWz0+58ROuCAV9d8/XCucA+lc9I7+AlwE6Cwf8 bxuSIHQOeyldQhf+/l2JBXDpig8wxpNNFcBDarXvMAM9kJT55Si8qRt2QGjcNnaOlg8f 6KSJifhrtdO0n7uZKB+nMxp6wwobpK4ryjYFOkv52fDtygHcSvqrdsp77GQClY8lB+Eg lUjyr9J0+fNqNLKwr4Mjgp/rs5BqgkyI23T159KzjN3gdiLUnAW7tUMQsKJGHuRvIkth fKHHOKxkcBC7fXqQjXTsAQm3SS+fOKp7UoDqLlxA/nroOmNQdS+U+6SaaLf5c374BH+p EObg== X-Received: by 10.58.146.196 with SMTP id te4mr22252veb.62.1375874900343; Wed, 07 Aug 2013 04:28:20 -0700 (PDT) Original-Received: by 10.220.38.194 with HTTP; Wed, 7 Aug 2013 04:27:50 -0700 (PDT) In-Reply-To: X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:400c:c01::22f X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:162461 Archived-At: --047d7b66fd3bb0f51404e359d681 Content-Type: text/plain; charset=UTF-8 2013/8/5 Klaus-Dieter Bauer : > 2013/8/5 Stefan Monnier : >>> (mapcar (if flag 'f1 'f2) list) >>> => (mapcar (if flag #'f1 #'f2) list) >> >> No, I definitely don't want to get into such fanciness. >> But I do want compiler warnings if the coder writes >> >> (mapcar (if flag #'f1 #'f2) list) >> >> and `f1' or `f2' are unknown. > > My code does that and indeed that was, what I first implemented. I > then added the second check, where (quote f1) is handled for functions > known to be higher-order. > >>> Shouldn't the markup for user-written functions be a bit easier? >> >> I'm not too worried about it, no. We should instead aim to teach people >> to write #'foo instead of 'foo. > > I am not sure about that... On the one hand, I see your point, since > consistently writing #'function is better for the byte compiler, as in > the (if flag #'f1 #'f2) form; If #'f1 is the standard method people > will write (if flag 'f1 'f2) and not get a warning. > > On the other hand though, subjectively, #'f1 is a huge deal more > visual clutter and somewhat awkward to type (on a German keyboard at > least). Might be just a training effect, but I also feel that the > hash-quote sequence moves the attention away from the function name, > while 'f1 does not (or #f1, '#f1 for that matter, but those are not > elisp). > > - Klaus Made a new version of the patch, were warnings are emitted for registered function arguments. Downside: While educational towards #'FUNCTION notation, it will result in a good deal of warnings all across even included code. I'd say this results in a risk of people ignoring warnings alltogether, including those that likely point out actual errors such as "reference to free variable". For bytecomp.el alone it results in 22 warnings! Advantage would be that using such aggressive "reeducation" the the declare form would be mostly unnecessary. - Klaus --047d7b66fd3bb0f51404e359d681 Content-Type: application/octet-stream; name="bytecomp.el.patch-2" Content-Disposition: attachment; filename="bytecomp.el.patch-2" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hk2gaot20 LS0tIGJ5dGVjb21wLmVsLm9yaWcJMjAxMy0wNy0wMiAyMjoyODozNC45MzY3MzE2MDAgKzAyMDAN CisrKyBieXRlY29tcC5lbAkyMDEzLTA4LTA3IDEzOjE2OjEyLjg0MzQxMjcwMCArMDIwMA0KQEAg LTI4NCw2ICsyODQsOCBAQA0KICAgZnJlZS12YXJzICAgcmVmZXJlbmNlcyB0byB2YXJpYWJsZXMg bm90IGluIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGUuDQogICB1bnJlc29sdmVkICBjYWxscyB0 byB1bmtub3duIGZ1bmN0aW9ucy4NCiAgIGNhbGxhcmdzICAgIGZ1bmN0aW9uIGNhbGxzIHdpdGgg YXJncyB0aGF0IGRvbid0IG1hdGNoIHRoZSBkZWZpbml0aW9uLg0KKyAgZnVuY2FyZ3MgICAgaGln aGVyIG9yZGVyIGZ1bmN0aW9uIGxpa2UgbWFwY2FyIHVzZWQgd2l0aCBmdW5jdGlvbiBhcmd1bWVu dCANCisgICAgICAgICAgICAgIGFzIChxdW90ZSBTWU1CT0wpIHJhdGhlciB0aGFuIChmdW5jdGlv biBTWU1CT0wpDQogICByZWRlZmluZSAgICBmdW5jdGlvbiBuYW1lIHJlZGVmaW5lZCBmcm9tIGEg bWFjcm8gdG8gb3JkaW5hcnkgZnVuY3Rpb24gb3IgdmljZQ0KICAgICAgICAgICAgICAgdmVyc2Es IG9yIHJlZGVmaW5lZCB0byB0YWtlIGEgZGlmZmVyZW50IG51bWJlciBvZiBhcmd1bWVudHMuDQog ICBvYnNvbGV0ZSAgICBvYnNvbGV0ZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucy4NCkBAIC0xNDk2 LDYgKzE0OTgsNyBAQA0KICAgICAgICAgIChieXRlLWNvbXBpbGUtY29uc3QtdmFyaWFibGVzIG5p bCkNCiAgICAgICAgICAoYnl0ZS1jb21waWxlLWZyZWUtcmVmZXJlbmNlcyBuaWwpDQogICAgICAg ICAgKGJ5dGUtY29tcGlsZS1mcmVlLWFzc2lnbm1lbnRzIG5pbCkNCisJIChieXRlLWNvbXBpbGUt LWhpZ2hlci1vcmRlci0tdW5yZXNvbHZlZC1mdW5jdGlvbnMgbmlsKQ0KICAgICAgICAgIDs7DQog ICAgICAgICAgOzsgQ2xvc2Ugb3ZlciB0aGVzZSB2YXJpYWJsZXMgc28gdGhhdCBgYnl0ZS1jb21w aWxlci1vcHRpb25zJw0KICAgICAgICAgIDs7IGNhbiBjaGFuZ2UgdGhlbSBvbiBhIHBlci1maWxl IGJhc2lzLg0KQEAgLTE5MzksNiArMTk0Miw3IEBADQogCTs7IE1ha2Ugd2FybmluZ3MgYWJvdXQg dW5yZXNvbHZlZCBmdW5jdGlvbnMNCiAJOzsgZ2l2ZSB0aGUgZW5kIG9mIHRoZSBmaWxlIGFzIHRo ZWlyIHBvc2l0aW9uLg0KIAkoc2V0cSBieXRlLWNvbXBpbGUtbGFzdC1wb3NpdGlvbiAocG9pbnQt bWF4KSkNCisJKGJ5dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS13YXJuLWFib3V0LXVucmVzb2x2 ZWQtZnVuY3Rpb24tbmFtZXMpDQogCShieXRlLWNvbXBpbGUtd2Fybi1hYm91dC11bnJlc29sdmVk LWZ1bmN0aW9ucykpDQogICAgICAgOzsgRml4IHVwIHRoZSBoZWFkZXIgYXQgdGhlIGZyb250IG9m IHRoZSBvdXRwdXQNCiAgICAgICA7OyBpZiB0aGUgYnVmZmVyIGNvbnRhaW5zIG11bHRpYnl0ZSBj aGFyYWN0ZXJzLg0KQEAgLTI5NjAsNiArMjk2NCw3IEBADQogKGRlZnVuIGJ5dGUtY29tcGlsZS1u b3JtYWwtY2FsbCAoZm9ybSkNCiAgICh3aGVuIChhbmQgKGJ5dGUtY29tcGlsZS13YXJuaW5nLWVu YWJsZWQtcCAnY2FsbGFyZ3MpDQogICAgICAgICAgICAgIChzeW1ib2xwIChjYXIgZm9ybSkpKQ0K KyAgICAoYnl0ZS1jb21waWxlLS1oaWdoZXItb3JkZXItLWNoZWNrLWFyZ3VtZW50cyBmb3JtKQ0K ICAgICAoaWYgKG1lbXEgKGNhciBmb3JtKQ0KICAgICAgICAgICAgICAgJyhjdXN0b20tZGVjbGFy ZS1ncm91cCBjdXN0b20tZGVjbGFyZS12YXJpYWJsZQ0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBjdXN0b20tZGVjbGFyZS1mYWNlKSkNCkBAIC00NjU5LDYgKzQ2NjQsMTc3 IEBADQogCSAgICAgIChpbmRlbnQtdG8gNDApDQogCSAgICAgIChpbnNlcnQgKGludC10by1zdHJp bmcgbikgIlxuIikpKQ0KIAkoc2V0cSBpICgxKyBpKSkpKSkpDQorDQorOzs7OyAoREVDTEFSRSAo SElHSEVSLU9SREVSLUFSR1VNRU5UUykpIEFORCBDSEVDSyBbQkVHSU5OSU5HXSA7Ozs7Ozs7Ow0K Kw0KKyhkZWZ2YXIgYnl0ZS1jb21waWxlLS1oaWdoZXItb3JkZXItLXVucmVzb2x2ZWQtZnVuY3Rp b25zIG5pbA0KKyAgIkEgbGlzdCBvZiBmdW5jdGlvbnMgdGhhdCB3ZXJlIHBhc3NlZCBieSBuYW1l IHRvIGhpZ2hlciBvcmRlciBmdW5jdGlvbnMgYnV0IHdoZXJlIG5vdCBrbm93biB0byBiZSBkZWZp bmVkLg0KKw0KK1VzZWQgZHVyaW5nIGNvbXBpbGF0aW9uIHRvIHJlcG9ydCBmdW5jdGlvbnMgcmVm ZXJyZWQgdG8gYnkgKHF1b3RlDQorU1lNQk9MKSBvciAoZnVuY3Rpb24gU1lNQk9MKSB0aGF0IGFy ZSBub3Qga25vd24gdG8gYmUgZGVmaW5lZC4NCisNCisgU2VlIGFsc28NCitgYnl0ZS1jb21waWxl LS1oaWdoZXItb3JkZXItLXdhcm4tYWJvdXQtdW5yZXNvbHZlZC1mdW5jdGlvbi1uYW1lcycsDQor YGJ5dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS1jaGVjay1hcmd1bWVudHMnLiIpDQorDQorKGRl ZnVuIGJ5dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS13YXJuLWFib3V0LXVucmVzb2x2ZWQtZnVu Y3Rpb24tbmFtZXMgKCkNCisgICJFbWl0IGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gdGhlcmUgYXJl IHVucmVzb2x2ZWQgZnVuY3Rpb24gYSBzeW1ib2xzIHBhc3NlZCB0byBoaWdoZXIgb3JkZXIgZnVu Y3Rpb25zLg0KK1NlZSBhbHNvIGBieXRlLWNvbXBpbGUtLWhpZ2hlci1vcmRlci0tdW5yZXNvbHZl ZC1mdW5jdGlvbnMnLiINCisgIDs7IFRoZSBsb2dpYyBpcyBzaW1pbGlhciB0byBgYnl0ZS1jb21w aWxlLXdhcm4tYWJvdXQtdW5yZXNvbHZlZC1mdW5jdGlvbnMnLg0KKyAgKHdoZW4gKGJ5dGUtY29t cGlsZS13YXJuaW5nLWVuYWJsZWQtcCAndW5yZXNvbHZlZCkNCisgICAgKGxldCAoKGJ5dGUtY29t cGlsZS1jdXJyZW50LWZvcm0gOmVuZCkNCisJICBub3QtZGVmaW5lZC1hdC1ydW50aW1lLW1heWJl LXN5bWJvbC1saXN0DQorCSAgcmVzb2x2ZWQtdG8tZnVuY3Rpb24tbGlzdA0KKwkgIHJlc29sdmVk LXRvLW1hY3JvLWxpc3QNCisJICB1bnJlc29sdmVkLXN5bWJvbC1saXN0KQ0KKyAgICAoZG9saXN0 IChmdW5jdGlvbi1uYW1lIGJ5dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS11bnJlc29sdmVkLWZ1 bmN0aW9ucykNCisgICAgICAoY29uZCAoKGFzc3EgZnVuY3Rpb24tbmFtZSBieXRlLWNvbXBpbGUt ZnVuY3Rpb24tZW52aXJvbm1lbnQpDQorCSAgICAgKHB1c2ggZnVuY3Rpb24tbmFtZSByZXNvbHZl ZC10by1mdW5jdGlvbi1saXN0KSkNCisJICAgICgoYXNzcSBmdW5jdGlvbi1uYW1lIGJ5dGUtY29t cGlsZS1tYWNyby1lbnZpcm9ubWVudCkNCisJICAgICAocHVzaCBmdW5jdGlvbi1uYW1lIHJlc29s dmVkLXRvLW1hY3JvLWxpc3QpKQ0KKwkgICAgKChmYm91bmRwIGZ1bmN0aW9uLW5hbWUpDQorCSAg ICAgKHB1c2ggZnVuY3Rpb24tbmFtZSBub3QtZGVmaW5lZC1hdC1ydW50aW1lLW1heWJlLXN5bWJv bC1saXN0KSkNCisJICAgICh0IChwdXNoIGZ1bmN0aW9uLW5hbWUgdW5yZXNvbHZlZC1zeW1ib2wt bGlzdCkpKSkNCisgICAgKGRvbGlzdCAocmVzb2x2ZWQtbmFtZSByZXNvbHZlZC10by1mdW5jdGlv bi1saXN0KQ0KKyAgICAgIChzZXRxIGJ5dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS11bnJlc29s dmVkLWZ1bmN0aW9ucw0KKwkgICAgKGRlbHEgcmVzb2x2ZWQtbmFtZQ0KKwkJICBieXRlLWNvbXBp bGUtLWhpZ2hlci1vcmRlci0tdW5yZXNvbHZlZC1mdW5jdGlvbnMpKSkNCisgICAgKGJ5dGUtY29t cGlsZS1wcmludC1zeW1zIA0KKyAgICAgIlRoZSBzeW1ib2wgYCVTJyB3YXMgcGFzc2VkIHRvIGEg ZnVuY3Rpb24gYXMgaWYgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiwgYnV0IGlzIGJvdW5kIHRvIGEg bWFjcm8gaW5zdGVhZC4iDQorICAgICAiVGhlIGZvbGxvd2luZyBzeW1ib2xzIHdlcmUgcGFzc2Vk IHRvIGEgZnVuY3Rpb24gYXMgaWYgdGhlIG5hbWVzIGZ1bmN0aW9ucyBidXQgYXJlIGJvdW5kIHRv IG1hY3JvcyBpbnN0ZWFkOiINCisgICAgIHJlc29sdmVkLXRvLW1hY3JvLWxpc3QpDQorICAgIChi eXRlLWNvbXBpbGUtcHJpbnQtc3ltcw0KKyAgICAgIlRoZSBzeW1ib2wgYCVTJyB3YXMgdXNlZCBh cyBmdW5jdGlvbiBuYW1lIGJ1dCB0aGUgZnVuY3Rpb24gaXMgbm90IGtub3duIHRvIGJlIGRlZmlu ZWQuIg0KKyAgICAgIlRoZSBmb2xsb3dpbmcgc3ltYm9scyB3ZXJlIHVzZWQgYXMgZnVuY3Rpb24g bmFtZXMgYnV0IHRoZSBmdW5jdGlvbnMgYXJlIG5vdCBrbm93biB0byBiZSBkZWZpbmVkOiINCisg ICAgIHVucmVzb2x2ZWQtc3ltYm9sLWxpc3QpDQorICAgIChieXRlLWNvbXBpbGUtcHJpbnQtc3lt cw0KKyAgICAgIlRoZSBmdW5jdGlvbiBgJVMnIHdhcyB1c2VkIGFzIGZ1bmN0aW9uIG5hbWUgYnV0 IHRoZSBmdW5jdGlvbiBtaWdodCBub3QgYmUgZGVmaW5lZCBhdCBydW50aW1lLiINCisgICAgICJU aGUgZm9sbG93aW5nIHN5bWJvbHMgd2VyZSB1c2VkIGFzIGZ1bmN0aW9uIG5hbWVzIGJ1dCB0aGUg ZnVuY3Rpb25zIG1pZ2h0IG5vdCBiZSBkZWZpbmVkIGF0IHJ1bnRpbWU6Ig0KKyAgICAgbm90LWRl ZmluZWQtYXQtcnVudGltZS1tYXliZS1zeW1ib2wtbGlzdCkpKSkNCisNCisoZGVmdW4gYnl0ZS1j b21waWxlLS1oaWdoZXItb3JkZXItLWNoZWNrLWFyZ3VtZW50cyAoZm9ybSkNCisgICJPbiBGT1JN LCB3aGljaCBpcyBhIGZ1bmN0aW9uIGNhbGwsIGNoZWNrIHdoZXRoZXIgZnVuY3Rpb25zIHBhc3Nl ZCBieSBuYW1lIGFyZSBrbm93biB0byBiZSBkZWZpbmVkLg0KKw0KK0lmIGEgcGFyYW1ldGVyIGhh cyB0aGUgZm9ybSAoZnVuY3Rpb24gU1lNQk9MKSBvciBpdCBpcyBrbm93biB0bw0KK2JlIGV4cGVj dGVkIHRvIGJlIGEgZnVuY3Rpb24gdGhyb3VnaCB0aGUgYGhpZ2hlci1vcmRlci1hcmd1bWVudHMn DQorcHJvcGVydHkgb2YgdGhlIHN5bWJvbCAoY2FyIEZPUk0pIGFuZCBoYXMgdGhlIGZvcm0gKHF1 b3RlIFNZTUJPTCkNCit3ZSBlaXRoZXIgd2FybiByaWdodCBhd2F5LCBpZiBTWU1CT0wgaXMga25v d24gdG8gYmUgYm91bmQgdG8NCitzb21ldGhpbmcgdGhhdCBjYW5ub3QgYmUgcGFzc2VkIHRvIGhp Z2hlciBvcmRlciBmdW5jdGlvbnMgc3VjaCBhcw0KK3NwZWNpYWwgZm9ybXMgYW5kIG1hY3Jvcy4g SWYgU1lNQk9MJ3MgZnVuY3Rpb24gY2VsbCBpcyBlbXB0eSwgd2UNCitxdWV1ZSB0aGUgc3ltYm9s IGludG8NCitgYnl0ZS1jb21waWxlLS1oaWdoZXItb3JkZXItLXVucmVzb2x2ZWQtZnVuY3Rpb25z JyBmb3IgY2hlY2tpbmcNCithdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBzZWUNCitgYnl0ZS1jb21w aWxlLS1oaWdoZXItb3JkZXItLXdhcm4tYWJvdXQtdW5yZXNvbHZlZC1mdW5jdGlvbi1uYW1lcycu Ig0KKyAgKGxldCAoKGhpZ2hlci1vcmRlci1hcmd1bWVudHMNCisJIChhbmQgKHN5bWJvbHAgKGNh ciBmb3JtKSkNCisJICAgICAgKGdldCAoY2FyIGZvcm0pICdoaWdoZXItb3JkZXItYXJndW1lbnRz KSkpDQorCShwb3MgLTEpKQ0KKyAgICAoZG9saXN0IChzdWJmb3JtIChjZHIgZm9ybSkpDQorICAg ICAgKHNldHEgcG9zICgxKyBwb3MpKQ0KKyAgICAgIDs7IENoZWNrIHdoZW4gc3ViZm9ybSBoYXMg Zm9ybSAoZnVuY3Rpb24gU1lNQk9MKSBvciAocXVvdGUgU1lNQk9MKQ0KKyAgICAgIDs7IGFuZCBw b3NpdGlvbiBtYXRjaGVzIG9uZSBtZW50aW9uZWQgaW4gaGlnaGVyLW9yZGVyLWFyZ3VtZW50cy4N CisgICAgICAod2hlbiAob3IgKGFuZCAobGlzdHAgc3ViZm9ybSkgOzsgY2FzZTogKGZ1bmN0aW9u IFNZTUJPTCkNCisJCSAgICAgKGVxIChjYXIgc3ViZm9ybSkgJ2Z1bmN0aW9uKQ0KKwkJICAgICAo c3ltYm9scCAoY2FyIChjZHIgc3ViZm9ybSkpKQ0KKwkJICAgICAobnVsbCAoY2RyIChjZHIgc3Vi Zm9ybSkpKSkNCisJCShhbmQgKGxpc3RwIHN1YmZvcm0pIDs7IGNhc2U6IChxdW90ZSBTWU1CT0wp DQorCQkgICAgIChlcSAoY2FyIHN1YmZvcm0pICdxdW90ZSkNCisJCSAgICAgKHN5bWJvbHAgKGNh ciAoY2RyIHN1YmZvcm0pKSkNCisJCSAgICAgKG51bGwgKGNkciAoY2RyIHN1YmZvcm0pKSkNCisJ CSAgICAgKG1lbWJlciBwb3MgaGlnaGVyLW9yZGVyLWFyZ3VtZW50cykpKQ0KKwkobGV0ICgoZnVu Y3Rpb24tbmFtZSAoY2FyIChjZHIgc3ViZm9ybSkpKSkNCisJICA7OyBHaXZlIGEgc3R5bGUgd2Fy bmluZyB3aGVuIGZvcm0gKHF1b3RlIGZ1bmN0aW9uKSB3YXMgdXNlZC4NCisJICAod2hlbiAoYW5k IChieXRlLWNvbXBpbGUtd2FybmluZy1lbmFibGVkLXAgJ2Z1bmNhcmdzKQ0KKwkJICAgICAoZXEg KGNhciBzdWJmb3JtKSAncXVvdGUpKQ0KKwkgICAgKGJ5dGUtY29tcGlsZS13YXJuIA0KKwkgICAg ICIlUzogRnVuY3Rpb24gYXJndW1lbnQgc2hvdWxkIGJlIHBhc3NlZCBhcyAjJyVTLCBub3QgJVMi DQorCSAgICAgKGNhciBmb3JtKSAoY2FyIChjZHIgc3ViZm9ybSkpIHN1YmZvcm0pKQ0KKwkgIDs7 IElzIHRoZSBmdW5jdGlvbiBhbHJlYWR5IGRlZmluZWQgb3IgYWxyZWFkeSBrbm93biB0byBiZQ0K KwkgIDs7IGRlZmluZWQgaW4gdGhpcyBmaWxlPyBOb3RlIHRoYXQgbWFjcm9zIGFyZSBub3QgYWxs b3dlZCENCisJICAoY29uZCAoKGFzc3EgZnVuY3Rpb24tbmFtZSBieXRlLWNvbXBpbGUtZnVuY3Rp b24tZW52aXJvbm1lbnQpKSA7OyBEbyBub3RoaW5nLg0KKwkJKChhc3NxIGZ1bmN0aW9uLW5hbWUg Ynl0ZS1jb21waWxlLW1hY3JvLWVudmlyb25tZW50KQ0KKwkJIChieXRlLWNvbXBpbGUtd2FybiAi SW52YWxpZCBhcmd1bWVudCBgJVMnIHRvIGZ1bmN0aW9uIGAlUyc6IE5vdCBhIGZ1bmN0aW9uLiIN CisJCQkJICAgIGZ1bmN0aW9uLW5hbWUgKGNhciBmb3JtKSkpDQorCQkoKGZ1bmN0aW9ucCBmdW5j dGlvbi1uYW1lKSkgOzsgTm8gbm90aGluZywgaXMgb2suDQorCQkoKGZib3VuZHAgZnVuY3Rpb24t bmFtZSkNCisJCSAoYnl0ZS1jb21waWxlLXdhcm4gIkludmFsaWQgYXJndW1lbnQgYCVTJyB0byBm dW5jdGlvbiBgJVMnOiBOb3QgYSBmdW5jdGlvbi4iDQorCQkJCSAgICBmdW5jdGlvbi1uYW1lIChj YXIgZm9ybSkpKQ0KKwkJKHQgOzsgVW5rbm93biBzeW1ib2wNCisJCSAoYWRkLXRvLWxpc3QgJ2J5 dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS11bnJlc29sdmVkLWZ1bmN0aW9ucw0KKwkJCSAgICAg IGZ1bmN0aW9uLW5hbWUpKSkpKSkpKQ0KKw0KKzs7IFBsYWNpbmcgdGhlIGVudHJ5IGluc2lkZSB0 aGUgZGVmaW5pdGlvbiBvZg0KKzs7IGBkZWZ1bi1kZWNsYXJhdGlvbi1hbGlzdCcgZGlyZWN0bHkg Zm9yIHNvbWUgcmVhc29uIGRvZXNuJ3Qgd29yay4NCisoYWRkLXRvLWxpc3QgJ2RlZnVuLWRlY2xh cmF0aW9ucy1hbGlzdA0KKwkgICAgICcoaGlnaGVyLW9yZGVyLWFyZ3VtZW50cyANCisJICAgICAg IGJ5dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS1kZWNsYXJlLWZvcm0taGFuZGxlcikpDQorDQor KGRlZnVuIGJ5dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS1kZWNsYXJlLWZvcm0taGFuZGxlciAo ZiBfYXJncyAmcmVzdCB2YWwpDQorICAiSGFuZGxlciBmb3IgdGhlIChkZWNsYXJlIChoaWdoZXIt b3JkZXItYXJndW1lbnRzIFtOVU0gLi4uXSkpIGZvcm0sIHNlZSBgZGVmdW4tZGVjbGFyYXRpb25z LWFsaXN0Jy4NCisNCitGIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiwgX0FSR1MgdGhlIGZv cm1hbCBwYXJhbWV0ZXIgbGlzdCwNCitWQUwgc2hvdWxkIGJlIChOVU0gLi4pLg0KKw0KK0xJTUlU QVRJT046IFdoZW4gdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIHVzZWQgYmVmb3JlIGl0IHdhcw0KK2Rl ZmluZWQsIGEgY29tcGlsZXIgd2FybmluZyBpcyBlbWl0dGVkIHBvaW50aW5nIG91dCB0aGF0IHBy aW9yDQordXNlIG1pZ2h0IG5vdCBoYXZlIGJlZW4gY2hlY2tlZC4iDQorICA7OyBDaGVjayB0aGF0 IFZBTCBpcyBsaXN0IG9mIGludGVnZXJzLg0KKyAgKGlmIChvciAobm90IChsaXN0cCB2YWwpKQ0K KwkgIChkZWxldGUgbmlsDQorCSAgICAobWFwY2FyIChsYW1iZGEgKGUpIChub3QgKGludGVnZXJw IGUpKSkNCisJICAgICAgdmFsKSkpDQorICAgICAgOzsgV2FybiBhYm91dCBpbnZhbGlkIGBkZWNs YXJlJyBmb3JtDQorICAgICAgKGxldCAoKHdhcm4tdGV4dCANCisJICAgICAoY29uY2F0ICIoZGVj bGFyZSAuLikgZm9ybSAoaGlnaGVyLW9yZGVyLWFyZ3VtZW50cyBbTlVNIC4uXSkgd2l0aCBpbnZh bGlkIGFyZ3VtZW50cyAiDQorCQkgICAgIChtYXBjb25jYXQgKGxhbWJkYSAoZSkgKGZvcm1hdCAi JVMiIGUpKSB2YWwgIiAiKSkpKQ0KKwkoaWYgYnl0ZS1jb21waWxlLWN1cnJlbnQtZmlsZSANCisJ ICAgIChieXRlLWNvbXBpbGUtd2FybiAiJXMiIHdhcm4tdGV4dCkNCisJICAod2FybiAiJXMiIHdh cm4tdGV4dCkpDQorCW5pbCkNCisgICAgOzsgUmV0dXJuIGEgYHB1dCcgZm9ybSwgYnV0IGFsc28g cGVyZm9ybSBpdCBhdCBjb21waWxlIHRpbWUuDQorICAgIDs7IExpbWl0YXRpb246IEFmZmFjdHMg b25seSBoaWdoZXIgb3JkZXIgZnVuY3Rpb25zIGRlZmluZWQgYmVmb3JlDQorICAgIDs7IHRoZWly IGZpcnN0IHVzZS4NCisgICAgKHdoZW4gKGFzc3EgZiBieXRlLWNvbXBpbGUtdW5yZXNvbHZlZC1m dW5jdGlvbnMpDQorICAgICAgKGJ5dGUtY29tcGlsZS13YXJuIA0KKyAgICAgICAiJXMiDQorICAg ICAgIChjb25jYXQgIkhpZ2hlciBvcmRlciBmdW5jdGlvbiAiIChzeW1ib2wtbmFtZSBmKSAiIHdh cyB1c2VkIGJlZm9yZSBpdCB3YXMgZGVmaW5lZC4gIg0KKwkgICAgICAgIkFjdHVhbCBwYXJhbWV0 ZXJzIHdlcmUgbm90IGNoZWNrZWQgZm9yIHZhbGlkaXR5LiIpKSkNCisgICAgKGxpc3QgJ2V2YWwt YW5kLWNvbXBpbGUgDQorCSAgKGxpc3QgJ3B1dCAobGlzdCAncXVvdGUgZikgJydoaWdoZXItb3Jk ZXItYXJndW1lbnRzDQorCQkobGlzdCAncXVvdGUgdmFsKSkpKSkNCisNCis7OyBTZXR0aW5nIHRo ZSBwcm9wZXJ0eSBmb3IgY2VydGFpbiBrbm93biBmdW5jdGlvbnMuDQorDQorKGRlZm1hY3JvIGJ5 dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS1yZWdpc3Rlci1rbm93bi1mdW5jdGlvbnMgKHBvcyAm cmVzdCBzeW1ib2wtbGlzdCkNCisgICJGb3IgZWxlbWVudHMgb2YgU1lNQk9MLUxJU1Qgc2V0IHRo ZSBoaWdoZXItb3JkZXItYXJndW1lbnRzIHByb3BlcnR5IHRvIChQT1MpIHdoZW4gaXQgaXMgbm90 IHlldCBzZXQuDQorDQorT25seSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB1c2UgaW4gYnl0 ZWNvbXAuZWwuIElmIHlvdSB3YW50DQordG8gc2V0IHRoZSBwcm9wZXJ0eSBmb3IgeW91ciBvd24g ZnVuY3Rpb25zIHVzZQ0KK3RoZSAoZGVjbGFyZSAoaGlnaGVyLW9yZGVyIFtOVU0gLi5dKSkgZm9y bS4iDQorICAoZGVjbGFyZSAoaW5kZW50IDEpKQ0KKyAgKGxldCAoZm9ybXMpDQorICAgIChkb2xp c3QgKGZ1bmN0aW9uLW5hbWUgc3ltYm9sLWxpc3QpDQorICAgICAgKHB1c2ggKGxpc3QgJ2lmIChs aXN0ICdub3QgKGxpc3QgJ2dldCAobGlzdCAncXVvdGUgZnVuY3Rpb24tbmFtZSkgJydoaWdoZXIt b3JkZXItYXJndW1lbnRzKSkNCisJCSAgKGxpc3QgJ3B1dCAobGlzdCAncXVvdGUgZnVuY3Rpb24t bmFtZSkgJydoaWdoZXItb3JkZXItYXJndW1lbnRzIA0KKwkJCShsaXN0ICdxdW90ZSAobGlzdCBw b3MpKSkpDQorCSAgICBmb3JtcykpDQorICAgIChjb25zICdwcm9nbiAocmV2ZXJzZSBmb3Jtcykp KSkNCisNCisoYnl0ZS1jb21waWxlLS1oaWdoZXItb3JkZXItLXJlZ2lzdGVyLWtub3duLWZ1bmN0 aW9ucyAwDQorICA7OyBGdW5jdGlvbnMgZGVmaW5lZCBpbiBDLXNvdXJjZS4NCisgIGFwcGx5IGZ1 bmNhbGwgbWFwLWNoYXItdGFibGUgbWFwLWNoYXJzZXQtY2hhcnMgbWFwLWtleW1hcA0KKyAgbWFw LWtleW1hcC1pbnRlcm5hbCBtYXBhdG9tcyBtYXBjIG1hcGNhciBtYXBjb25jYXQgbWFwaGFzaA0K KyAgY2FsbC1pbnRlcmFjdGl2ZWx5DQorICA7OyBGdW5jdGlvbnMgZGVmaW5lZCBpbiBzdGFuZGFy ZCBlbGlzcCBmaWxlcw0KKyAgbWFwLWtleW1hcC1zb3J0ZWQgbWFwLXF1ZXJ5LXJlcGxhY2UtcmVn ZXhwIG1hcC15LW9yLW4tcA0KKyAgOzsgRnJvbSB0aGUgZGVwcmVjYXRlZCBgY2wnDQorICBtYXAg bWFwY2FuIG1hcGNhciogbWFwY29uIG1hcGwgbWFwbGlzdA0KKyAgOzsgTm9uLW9ic29sZXRlIG5v bi1pbnRlcm5hbCBmdW5jdGlvbnMgZnJvbSBgY2wtbGliJw0KKyAgY2wtbWFwIGNsLW1hcGMgY2wt bWFwY2FuIGNsLW1hcGNhciBjbC1tYXBjb24gY2wtbWFwaGFzaCBjbC1tYXBsDQorICBjbC1tYXBs aXN0KQ0KKw0KKzs7OzsgKERFQ0xBUkUgKEhJR0hFUi1PUkRFUi1BUkdVTUVOVFMpKSBBTkQgQ0hF Q0sgW0VORF0gOzs7Ozs7Ozs7Ozs7OzsNCisNCiAMDQogOzsgVG8gYXZvaWQgImxpc3AgbmVzdGlu ZyBleGNlZWRzIG1heC1saXNwLWV2YWwtZGVwdGgiIHdoZW4gYnl0ZWNvbXAgY29tcGlsZXMNCiA7 OyBpdHNlbGYsIGNvbXBpbGUgc29tZSBvZiBpdHMgbW9zdCB1c2VkIHJlY3Vyc2l2ZSBmdW5jdGlv bnMgKGF0IGxvYWQgdGltZSkuDQo= --047d7b66fd3bb0f51404e359d681--