From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Artur Malabarba Newsgroups: gmane.emacs.devel Subject: [Proposed Minor-mode] Speed of thought Lisp (was: Abbrevs for the most frequent elisp symbols) Date: Sat, 24 Jan 2015 14:38:53 -0200 Message-ID: Reply-To: bruce.connor.am@gmail.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=e89a8f83a88372e124050d688a79 X-Trace: ger.gmane.org 1422117546 23070 80.91.229.3 (24 Jan 2015 16:39:06 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 24 Jan 2015 16:39:06 +0000 (UTC) To: emacs-devel Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Jan 24 17:39:05 2015 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 1YF3jl-0004KE-CC for ged-emacs-devel@m.gmane.org; Sat, 24 Jan 2015 17:39:05 +0100 Original-Received: from localhost ([::1]:35442 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YF3jk-0003N3-PW for ged-emacs-devel@m.gmane.org; Sat, 24 Jan 2015 11:39:04 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:50124) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YF3jd-0003LI-U8 for emacs-devel@gnu.org; Sat, 24 Jan 2015 11:39:00 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YF3ja-0001iE-Vo for emacs-devel@gnu.org; Sat, 24 Jan 2015 11:38:57 -0500 Original-Received: from mail-ob0-x229.google.com ([2607:f8b0:4003:c01::229]:34781) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YF3ja-0001i6-NB for emacs-devel@gnu.org; Sat, 24 Jan 2015 11:38:54 -0500 Original-Received: by mail-ob0-f169.google.com with SMTP id va8so2314894obc.0 for ; Sat, 24 Jan 2015 08:38:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:sender:date:message-id:subject:from:to :content-type; bh=s589PYaRRv2D90IzU6+eOC4mqCOn9gT+IKftAOvoSGQ=; b=gOc8B6WjCpBvZDYrWIyTd21hdzHf9iKvIVTlXd0OOhk6oJqjd+GwioExAUs1CP9Ilz oJC5kiUT2hGzVpPNvk04KJbwvmK/Asqyj2WH1aGt2WVwmknMZJLDqE9sUoTETHJQclve h/UXC/IjIRBxNd36rIbubzNHjeHsX7GjJwTPFeo9+NQ3atqfn1gUakWIcrVj2bBZaFNY t92piMory6yrkKxaBp3LHPxZ29hYGcf1iRmf2q6SjbSo0FhrWbUnMgTznDlEh6OqMyOg kj2kdYijygFxqmm5p1nVL7TuFy6oMruFgk6fmlREWG2huxdVgPOxFbku8XZBQ6zilgKb S3Ig== X-Received: by 10.182.20.242 with SMTP id q18mr8030018obe.84.1422117534062; Sat, 24 Jan 2015 08:38:54 -0800 (PST) Original-Received: by 10.76.125.1 with HTTP; Sat, 24 Jan 2015 08:38:53 -0800 (PST) X-Google-Sender-Auth: 7duKURS-ROHrK65o72zuTwWPIhA X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4003:c01::229 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:181726 Archived-At: --e89a8f83a88372e124050d688a79 Content-Type: multipart/alternative; boundary=e89a8f83a88372e11a050d688a77 --e89a8f83a88372e11a050d688a77 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable For a while now, I've been using a system that leads to very fluid elisp coding. The focus is on writing lisp as fast as you can think of it, without being slowed down by your typing speed. Thus the name: Speed-of-thought Lisp. I've packaged it into a minor mode, which I'm proposing for inclusion into Emacs. I really can't overstate how much I've come to like this little mode, so hopefully some here will find it useful too. The mode is quite simple, and is composed of two parts: Abbrevs A large number of abbrevs, almost identical to what was discussed back in December on a thread in help-emacs. These abbrevs expand function initials to their name. The actual abbrevs are completely arbitrary (I added them as I ran into them), so I'm perfectly open to changing them based on general usage frequency. A few examples (currently they are 96 in total): - =E2=80=9Cwcb=E2=80=9D -> =E2=80=9Cwith-current-buffer=E2=80=9D - =E2=80=9Ci=E2=80=9D -> =E2=80=9Cinsert=E2=80=9D - =E2=80=9Cr=E2=80=9D -> =E2=80=9Crequire '=E2=80=9D - =E2=80=9Ca=E2=80=9D -> =E2=80=9Cand=E2=80=9D However, these are defined in a way such that they ONLY expand in a place where you would use a function, so hitting SPC after =E2=80=9C(r=E2=80=9D e= xpands to =E2=80=9C(require '=E2=80=9D, but hitting SPC after =E2=80=9C(delete-region= r=E2=80=9D will NOT expand the `r', because that's obviously not a function. Furtheromre, =E2=80=9C#'r=E2=80=9D will expand to =E2=80=9C#'require=E2=80= =9D (note how it ommits that extra quote, since it would be useless here). Commands It also defines 4 commands, which really fit into this =E2=80=9Cfollow the thought-flow=E2=80=9D way of writing. The bindings are as follows, I unders= tand these don't fully adhere to conventions, and I'd appreaciate suggestions on better bindings. - M-RET :: Break line, and insert =E2=80=9C()=E2=80=9D with point in the= middle. - C-RET :: Do `forward-up-list', then do M-RET. Hitting RET followed by a `(' was one of the most common key sequences for me while writing elisp, so giving it a quick-to-hit key was a significant improvement. - C-c f :: Find function under point. If it is not defined, create a definition for it below the current function and leave point inside. - C-c v :: Same, but for variable. With these commands, you just write your code as you think of it. Once you hit a =E2=80=9Cstop-point=E2=80=9D of sorts in your tought flow, you hit C-= c f/v on any undefined functions/variables, write their definitions, and hit C-u C-SPC to go back to the main function. Small Example With the above (assuming you use something like paredit or electric-pair-mode), if you write: ( w t b M-RET i SPC text You get (with-temp-buffer (insert text)) Cheers to all, and please let me hear your thoughts! Artur --e89a8f83a88372e11a050d688a77 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

For a while now, I've been using a system that lead= s to very fluid elisp coding. The focus is on writing lisp as fast as you can think of it, = without being slowed down by your typing speed.
Thus the name: Speed-of-thought Lisp.

I've packaged it into a minor mode, which I'm proposing for incl= usion into Emacs. I really can't overstate how much I've come to like thi= s little mode, so hopefully some here will find it useful too.

The mode is quite simple, and is composed of two parts:

Abbrevs

A large number of abbrevs, almost identical to what was discussed back in December on a thread in help-emacs. These abbrevs expand function initials to their name. The actual abbrevs are completely arbitrary (I adde= d them as I ran into them), so I'm perfectly open to changing them base= d on general usage frequency.

A few examples (currently they are = 96 in total):

  • =E2=80=9Cwcb=E2=80=9D -> =E2=80=9Cwith-current-buffer=E2=80=9D
  • =E2=80=9Ci=E2=80=9D -> =E2=80=9Cinsert=E2=80=9D
  • =E2=80=9Cr=E2=80=9D -> =E2=80=9Crequire '=E2=80=9D
  • =E2=80=9Ca=E2=80=9D -> =E2=80=9Cand=E2=80=9D

However, these are defined in a way such that they ONLY expand in a place where you would use a function, so hitting SPC after =E2=80=9C(r=E2= =80=9D expands to =E2=80=9C(require '=E2=80=9D, but hitting SPC after =E2=80= =9C(delete-region r=E2=80=9D will NOT expand the `r', because that's obviously not a function.

Furtheromre, =E2=80=9C#'r=E2=80=9D will expand to =E2=80=9C#'r= equire=E2=80=9D (note how it ommits that extra quote, since it would be useless here).

Commands

It also defines 4 commands, which really fit into this =E2=80=9Cfollow t= he thought-flow=E2=80=9D way of writing. The bindings are as follows, I understand these don't fully adhere to conventions, and I'd appreaciate suggestions on better bindings.

  • M-RET :: Break line, and insert =E2=80=9C()=E2=80=9D with point in the = middle.
  • C-RET :: Do `forward-up-list', then do M-RET.

Hitting RET followed by a `(' was one of the most common key sequenc= es for me while writing elisp, so giving it a quick-to-hit key was a significant improvement.

  • C-c f :: Find function under point. If it is not defined, create a definition for it below the current function and leave point inside.
  • C-c v :: Same, but for variable.

With these commands, you just write your code as you think of it. Once you hit a =E2=80=9Cstop-point=E2=80=9D of sorts in your tought flow, you hi= t C-c f/v on any undefined functions/variables, write their definitions, and hit C-u C-SPC to go back to the main function.

Small Example

With the above (assuming you use something like paredit or electric-pair-mode), if you write:

    ( w t b M-RET i SPC text

You get

    (with-temp-buffer
      (insert text))



C= heers to all, and please let me hear your thoughts!
Artur
--e89a8f83a88372e11a050d688a77-- --e89a8f83a88372e124050d688a79 Content-Type: text/x-emacs-lisp; charset=US-ASCII; name="sotlisp.el" Content-Disposition: attachment; filename="sotlisp.el" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i5b7w3h00 Ozs7IHNvdGxpc3AuZWwgLS0tIFdyaXRlIGxpc3AgYXQgdGhlIHNwZWVkIG9mIHRob3VnaHQuICAt Ki0gbGV4aWNhbC1iaW5kaW5nOiB0OyAtKi0NCg0KOzsgQ29weXJpZ2h0IChDKSAyMDE0IEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KDQo7OyBBdXRob3I6IEFydHVyIE1hbGFiYXJiYSAg PGJydWNlLmNvbm5vci5hbUBnbWFpbC5jb20+DQo7OyBLZXl3b3JkczogY29udmVuaWVuY2UsIGxp c3ANCjs7IFBhY2thZ2UtUmVxdWlyZXM6ICgoZW1hY3MgIjI0LjEiKSkNCg0KOzsgVGhpcyBwcm9n cmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2Rp ZnkNCjs7IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgYXMgcHVibGlzaGVkIGJ5DQo7OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRo ZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcg0KOzsgKGF0IHlvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4NCg0KOzsgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQo7OyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KOzsgTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KOzsgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCg0KOzsgWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCjs7 IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9y Zy9saWNlbnNlcy8+Lg0KDQo7OzsgQ29tbWVudGFyeToNCjs7DQo7OyBUaGlzIGRlZmluZXMgYSBu ZXcgZ2xvYmFsIG1pbm9yLW1vZGUgYHNwZWVkLW9mLXRob3VnaHQtbW9kZScsIHdoaWNoDQo7OyBh Y3RpdmF0ZXMgbG9jYWxseSBvbiBhbnkgc3VwcG9ydGVkIGJ1ZmZlci4gIEN1cnJlbnRseSwgb25s eQ0KOzsgYGVtYWNzLWxpc3AtbW9kZScgYnVmZmVycyBhcmUgc3VwcG9ydGVkLg0KOzsNCjs7IFRo ZSBtb2RlIGlzIHF1aXRlIHNpbXBsZSwgYW5kIGlzIGNvbXBvc2VkIG9mIHR3byBwYXJ0czoNCjs7 DQo7OzsgQWJicmV2cw0KOzsNCjs7IEEgbGFyZ2UgbnVtYmVyIG9mIGFiYnJldnMgd2hpY2ggZXhw YW5kIGZ1bmN0aW9uDQo7OyBpbml0aWFscyB0byB0aGVpciBuYW1lLiAgQSBmZXcgZXhhbXBsZXM6 DQo7OyANCjs7IC0gd2NiIC0+IHdpdGgtY3VycmVudC1idWZmZXINCjs7IC0gaSAtPiBpbnNlcnQN Cjs7IC0gciAtPiByZXF1aXJlICcNCjs7IC0gYSAtPiBhbmQNCjs7IA0KOzsgSG93ZXZlciwgdGhl c2UgYXJlIGRlZmluZWQgaW4gYSB3YXkgc3VjaCB0aGF0IHRoZXkgT05MWSBleHBhbmQgaW4gYQ0K OzsgcGxhY2Ugd2hlcmUgeW91IHdvdWxkIHVzZSBhIGZ1bmN0aW9uLCBzbyBoaXR0aW5nIFNQQyBh ZnRlciAiKHIiDQo7OyBleHBhbmRzIHRvICIocmVxdWlyZSAnIiwgYnV0IGhpdHRpbmcgU1BDIGFm dGVyICIoZGVsZXRlLXJlZ2lvbiByIiB3aWxsDQo7OyBOT1QgZXhwYW5kIHRoZSBgcicsIGJlY2F1 c2UgdGhhdCdzIG9idmlvdXNseSBub3QgYSBmdW5jdGlvbi4NCjs7IEZ1cnRoZXJvbXJlLCAiIydy IiB3aWxsIGV4cGFuZCB0byAiIydyZXF1aXJlIiAobm90ZSBob3cgaXQgb21taXRzIHRoYXQNCjs7 IGV4dHJhIHF1b3RlLCBzaW5jZSBpdCB3b3VsZCBiZSB1c2VsZXNzIGhlcmUpLg0KOzsNCjs7OyBD b21tYW5kcw0KOzsNCjs7IEl0IGFsc28gZGVmaW5lcyA0IGNvbW1hbmRzLCB3aGljaCByZWFsbHkg Zml0IGludG8gdGhpcyAiZm9sbG93IHRoZQ0KOzsgdGhvdWdodC1mbG93IiB3YXkgb2Ygd3JpdGlu Zy4gIFRoZSBiaW5kaW5ncyBhcmUgYXMgZm9sbG93cywgSQ0KOzsgdW5kZXJzdGFuZCB0aGVzZSBk b24ndCBmdWxseSBhZGhlcmUgdG8gY29udmVudGlvbnMsIGFuZCBJJ2QNCjs7IGFwcHJlYWNpYXRl IHN1Z2dlc3Rpb25zIG9uIGJldHRlciBiaW5kaW5ncy4NCjs7IA0KOzsgLSBNLVJFVCA6OiBCcmVh ayBsaW5lLCBhbmQgaW5zZXJ0ICIoKSIgd2l0aCBwb2ludCBpbiB0aGUgbWlkZGxlLg0KOzsgLSBD LVJFVCA6OiBEbyBgZm9yd2FyZC11cC1saXN0JywgdGhlbiBkbyBNLVJFVC4NCjs7IA0KOzsgSGl0 dGluZyBSRVQgZm9sbG93ZWQgYnkgYSBgKCcgd2FzIG9uZSBvZiB0aGUgbW9zdCBjb21tb24ga2V5 IHNlcXVlbmNlcw0KOzsgZm9yIG1lIHdoaWxlIHdyaXRpbmcgZWxpc3AsIHNvIGdpdmluZyBpdCBh IHF1aWNrLXRvLWhpdCBrZXkgd2FzIGENCjs7IHNpZ25pZmljYW50IGltcHJvdmVtZW50Lg0KOzsg DQo7OyAtIEMtYyBmIDo6IEZpbmQgZnVuY3Rpb24gdW5kZXIgcG9pbnQuICBJZiBpdCBpcyBub3Qg ZGVmaW5lZCwgY3JlYXRlIGENCjs7IGRlZmluaXRpb24gZm9yIGl0IGJlbG93IHRoZSBjdXJyZW50 IGZ1bmN0aW9uIGFuZCBsZWF2ZSBwb2ludCBpbnNpZGUuDQo7OyAtIEMtYyB2IDo6IFNhbWUsIGJ1 dCBmb3IgdmFyaWFibGUuDQo7OyANCjs7IFdpdGggdGhlc2UgY29tbWFuZHMsIHlvdSBqdXN0IHdy aXRlIHlvdXIgY29kZSBhcyB5b3UgdGhpbmsgb2YgaXQuICBPbmNlDQo7OyB5b3UgaGl0IGEgInN0 b3AtcG9pbnQiIG9mIHNvcnRzIGluIHlvdXIgdG91Z2h0IGZsb3csIHlvdSBoaXQgYEMtYyBmL3Zg DQo7OyBvbiBhbnkgdW5kZWZpbmVkIGZ1bmN0aW9ucy92YXJpYWJsZXMsIHdyaXRlIHRoZWlyIGRl ZmluaXRpb25zLCBhbmQgaGl0DQo7OyBgQy11IEMtU1BDYCB0byBnbyBiYWNrIHRvIHRoZSBtYWlu IGZ1bmN0aW9uLg0KOzsgDQo7OzsgU21hbGwgRXhhbXBsZQ0KOzsNCjs7IFdpdGggdGhlIGFib3Zl IChhc3N1bWluZyB5b3UgdXNlIHNvbWV0aGluZyBsaWtlIHBhcmVkaXQgb3INCjs7IGVsZWN0cmlj LXBhaXItbW9kZSksIGlmIHlvdSB3cml0ZToNCjs7DQo7OyAgICggdyB0IGIgTS1SRVQgaSBTUEMg dGV4dA0KOzsgDQo7OyBZb3UgZ2V0DQo7OyANCjs7ICAgKHdpdGgtdGVtcC1idWZmZXIgKGluc2Vy dCB0ZXh0KSkNCg0KDA0KOzs7IENvZGU6DQooZXZhbC13aGVuLWNvbXBpbGUNCiAgKHJlcXVpcmUg J3N1YnIteCkpDQoNCjs7OyBQcmVkaWNhdGVzDQooZGVmdW4gc290bGlzcC0tYXV0by1wYWlyZWQt cCAoKQ0KICAiTm9uLW5pbCBpZiB0aGlzIGJ1ZmZlciBhdXRvLWluc2VydHMgcGFyZW50aGVzZXMu Ig0KICAob3IgKGJvdW5kLWFuZC10cnVlLXAgZWxlY3RyaWMtcGFpci1tb2RlKQ0KICAgICAgKGJv dW5kLWFuZC10cnVlLXAgcGFyZWRpdC1tb2RlKQ0KICAgICAgKGJvdW5kLWFuZC10cnVlLXAgc21h cnRwYXJlbnMtbW9kZSkpKQ0KDQooZGVmdW4gc290bGlzcC0tZnVuY3Rpb24tZm9ybS1wICgpDQog ICJOb24tbmlsIGlmIHBvaW50IGlzIGF0IHRoZSBzdGFydCBvZiBhIHNleHAuDQpTcGVjaWFsbHks IGF2b2lkcyBtYXRjaGluZyBpbnNpZGUgYXJndW1lbnQgbGlzdHMuIg0KICAoYW5kIChlcSAoY2hh ci1iZWZvcmUpID9cKCkNCiAgICAgICAobm90IChsb29raW5nLWJhY2sgIihcXChkZWZ1blxccy0r LipcXHxsYW1iZGFcXHMtK1xcKSgiKSkNCiAgICAgICAobm90IChzdHJpbmctbWF0Y2ggKHJ4IChz eW50YXggc3ltYm9sKSkgKHN0cmluZyBsYXN0LWNvbW1hbmQtZXZlbnQpKSkpKQ0KDQooZGVmdW4g c290bGlzcC0tZnVuY3Rpb24tcXVvdGUtcCAoKQ0KICAiTm9uLW5pbCBpZiBwb2ludCBpcyBhdCBh IHNoYXJwLXF1b3RlLiINCiAgKGxvb2tpbmctYmFjayAiIyciKSkNCg0KKGRlZnVuIHNvdGxpc3At LWZ1bmN0aW9uLXAgKCkNCiAgIk5vbi1uaWwgaWYgcG9pbnQgaXMgYXQgcmVhc29uYWJsZSBwbGFj ZSBmb3IgYSBmdW5jdGlvbiBuYW1lLg0KUmV0dXJucyBub24tbmlsIGlmLCBhZnRlciBtb3Zpbmcg YmFja3dhcmRzIGJ5IGEgc2V4cCwgZWl0aGVyDQpgc290bGlzcC0tZnVuY3Rpb24tZm9ybS1wJyBv ciBgc290bGlzcC0tZnVuY3Rpb24tcXVvdGUtcCcgcmV0dXJuDQpub24tbmlsLiINCiAgKHNhdmUt ZXhjdXJzaW9uDQogICAgKGlnbm9yZS1lcnJvcnMNCiAgICAgIChza2lwLWNoYXJzLWJhY2t3YXJk IChyeCBhbG51bSkpDQogICAgICAob3IgKHNvdGxpc3AtLWZ1bmN0aW9uLWZvcm0tcCkNCiAgICAg ICAgICAoc290bGlzcC0tZnVuY3Rpb24tcXVvdGUtcCkpKSkpDQoNCihkZWZ1biBzb3RsaXNwLS13 aGl0ZXNwYWNlLXAgKCkNCiAgIk5vbi1uaWwgaWYgY3VycmVudCBgc2VsZi1pbnNlcnQnZWQgY2hh ciBpcyB3aGl0ZXNwYWNlLiINCiAgKGlnbm9yZS1lcnJvcnMNCiAgICAoc3RyaW5nLW1hdGNoIChy eCBzcGFjZSkgKHN0cmluZyBsYXN0LWNvbW1hbmQtZXZlbnQpKSkpDQoNCgwNCjs7OyBFeHBhbnNp b24gbG9naWMNCihkZWZ2YXIgc290bGlzcC0tbmVlZHMtbW92aW5nIG5pbA0KICAiV2lsbCBgc290 bGlzcC0tbW92ZS10by0kJyBtb3ZlIHBvaW50IGFmdGVyIGluc2VydGlvbj8iKQ0KDQooZGVmdW4g c290bGlzcC0tbW92ZS10by0kICgpDQogICJNb3ZlIGJhY2t3YXJkcyB1bnRpbCBgJCcgYW5kIGRl bGV0ZSBpdC4NClBvaW50IGlzIGxlZnQgd2hlcmUgdGhlIGAkJyBjaGFyIHdhcy4gIERvZXMgbm90 aGluZyBpZiB2YXJpYWJsZQ0KYHNvdGxpc3AtbW9kZScgaXMgbmlsLiINCiAgKHdoZW4gKGJvdW5k LWFuZC10cnVlLXAgc3BlZWQtb2YtdGhvdWdodC1tb2RlKQ0KICAgICh3aGVuIHNvdGxpc3AtLW5l ZWRzLW1vdmluZw0KICAgICAgKHNldHEgc290bGlzcC0tbmVlZHMtbW92aW5nIG5pbCkNCiAgICAg IChza2lwLWNoYXJzLWJhY2t3YXJkICJeXFwkIikNCiAgICAgIChkZWxldGUtY2hhciAtMSkpKSkN Cg0KKGFkZC1ob29rICdwb3N0LWNvbW1hbmQtaG9vayAjJ3NvdGxpc3AtLW1vdmUtdG8tJCAnYXBw ZW5kKQ0KDQooZGVmdW4gc290bGlzcC0tbWF5YmUtc2tpcC1jbG9zaW5nLXBhcmVuICgpDQogICJN b3ZlIHBhc3QgYCknIGlmIHZhcmlhYmxlIGBlbGVjdHJpYy1wYWlyLW1vZGUnIGlzIGVuYWJsZWQu Ig0KICAod2hlbiAoYW5kIChjaGFyLWFmdGVyID9cKSkNCiAgICAgICAgICAgICAoc290bGlzcC0t YXV0by1wYWlyZWQtcCkpDQogICAgKGZvcndhcmQtY2hhciAxKSkpDQoNCihkZWZ2YXIgc290bGlz cC0tZnVuY3Rpb24tdGFibGUgKG1ha2UtaGFzaC10YWJsZSA6dGVzdCAjJ2VxdWFsKQ0KICAiVGFi bGUgd2hlcmUgZnVuY3Rpb24gYWJicmV2IGV4cGFuc2lvbnMgYXJlIHN0b3JlZC4iKQ0KDQooZGVm dW4gc290bGlzcC0tZXhwYW5kLWZ1bmN0aW9uICgpDQogICJFeHBhbmQgdGhlIGZ1bmN0aW9uIGFi YnJldiBiZWZvcmUgcG9pbnQuDQpTZWUgYHNvdGxpc3AtZGVmaW5lLWZ1bmN0aW9uLWFiYnJldicu Ig0KICAobGV0ICgociAocG9pbnQpKSkNCiAgICAoc2tpcC1jaGFycy1iYWNrd2FyZCAocnggYWxu dW0pKQ0KICAgIChsZXQqICgobmFtZSAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpIHIpKQ0KICAg ICAgICAgICAoZXhwYW5zaW9uIChnZXRoYXNoIG5hbWUgc290bGlzcC0tZnVuY3Rpb24tdGFibGUp KSkNCiAgICAgIChkZWxldGUtcmVnaW9uIChwb2ludCkgcikNCiAgICAgIChpZiAoc290bGlzcC0t ZnVuY3Rpb24tcXVvdGUtcCkNCiAgICAgICAgICA7OyBBZnRlciAjJyB1c2UgdGhlIHNpbXBsZSBl eHBhbnNpb24uDQogICAgICAgICAgKGluc2VydCAoc290bGlzcC0tc2ltcGxpZnktZnVuY3Rpb24t ZXhwYW5zaW9uIGV4cGFuc2lvbikpDQogICAgICAgIDs7IEluc2lkZSBhIGZvcm0sIHVzZSB0aGUg ZnVsbCBleHBhbnNpb24uDQogICAgICAgIChpbnNlcnQgZXhwYW5zaW9uKQ0KICAgICAgICAod2hl biAoc3RyaW5nLW1hdGNoICJcXCQiIGV4cGFuc2lvbikNCiAgICAgICAgICAoc2V0cSBzb3RsaXNw LS1uZWVkcy1tb3ZpbmcgdCkpKSkNCiAgICA7OyBJbmZvcm0gYGV4cGFuZC1hYmJyZXYnIHRoYXQg YHNlbGYtaW5zZXJ0LWNvbW1hbmQnIHNob3VsZCBub3QNCiAgICA7OyB0cmlnZ2VyLCBieSByZXR1 cm5pbmcgbm9uLW5pbCBvbiBTUEMuDQogICAgKHdoZW4gKHNvdGxpc3AtLXdoaXRlc3BhY2UtcCkN CiAgICAgIDs7IEFuZCBtYXliZSBtb3ZlIG91dCBvZiBjbG9zaW5nIHBhcmVuIGlmIGV4cGFuc2lv biBlbmRzIHdpdGggJC4NCiAgICAgICh3aGVuIChlcSAoY2hhci1iZWZvcmUpID8kKQ0KICAgICAg ICAoZGVsZXRlLWNoYXIgLTEpDQogICAgICAgIChzZXRxIHNvdGxpc3AtLW5lZWRzLW1vdmluZyBu aWwpDQogICAgICAgIChzb3RsaXNwLS1tYXliZS1za2lwLWNsb3NpbmctcGFyZW4pKQ0KICAgICAg dCkpKQ0KDQoocHV0ICdzb3RsaXNwLS1leHBhbmQtZnVuY3Rpb24gJ25vLXNlbGYtaW5zZXJ0IHQp DQoNCihkZWZ1biBzb3RsaXNwLS1zaW1wbGlmeS1mdW5jdGlvbi1leHBhbnNpb24gKGV4cGFuc2lv bikNCiAgIlRha2UgYSBzdWJzdHJpbmcgb2YgRVhQQU5TSU9OIHVwIHRvIGZpcnN0IHNwYWNlLg0K VGhlIHNwYWNlIGNoYXIgaXMgbm90IGluY2x1ZGVkLiAgQW55IFwiJFwiIGFyZSBhbHNvIHJlbW92 ZWQuIg0KICAocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nDQogICAiXFwkIiAiIg0KICAgKHN1YnN0 cmluZyBleHBhbnNpb24gMCAoc3RyaW5nLW1hdGNoICIgIiBleHBhbnNpb24pKSkpDQoNCgwNCjs7 OyBBYmJyZXYgZGVmaW5pdGlvbnMNCihkZWZjb25zdCBzb3RsaXNwLS1kZWZhdWx0LWZ1bmN0aW9u LWFiYnJldnMNCiAgJygNCiAgICAoImEiIC4gImFuZCAiKQ0KICAgICgiYWgiIC4gImFkZC1ob29r ICciKQ0KICAgICgiYXRsIiAuICJhZGQtdG8tbGlzdCAnIikNCiAgICAoImJiIiAuICJidXJ5LWJ1 ZmZlciIpDQogICAgKCJiYyIgLiAiZm9yd2FyZC1jaGFyIC0xIikNCiAgICAoImJmbiIgLiAiYnVm ZmVyLWZpbGUtbmFtZSIpDQogICAgKCJibiIgLiAiYnVmZmVyLW5hbWUiKQ0KICAgICgiYmwiIC4g ImJ1ZmZlci1saXN0JCIpDQogICAgKCJib2QiIC4gImJlZ2lubmluZy1vZi1kZWZ1biIpDQogICAg KCJicCIgLiAiYm91bmRwICciKQ0KICAgICgiYnMiIC4gImJ1ZmZlci1zdHJpbmckIikNCiAgICAo ImJzcyIgLiAiYnVmZmVyLXN1YnN0cmluZyAiKQ0KICAgICgiYnciIC4gImZvcndhcmQtd29yZCAt MSIpDQogICAgKCJjIiAuICJjb25jYXQgIikNCiAgICAoImNhIiAuICJjaGFyLWFmdGVyJCIpDQog ICAgKCJjYyIgLiAiY29uZGl0aW9uLWNhc2UgZXJcbiRcbihlcnJvciBuaWwpIikNCiAgICAoImNp IiAuICJjYWxsLWludGVyYWN0aXZlbHkgIikNCiAgICAoImNpcCIgLiAiY2FsbGVkLWludGVyYWN0 aXZlbHktcCAnYW55IikNCiAgICAoImNzdiIgLiAiY3VzdG9taXplLXNhdmUtdmFyaWFibGUgJyIp DQogICAgKCJkIiAuICJkZWxldGUtY2hhciAxIikNCiAgICAoImRmIiAuICJkZWxldGUtZmlsZSAi KQ0KICAgICgiZGwiIC4gImRvbGlzdCAoaXQgJCkiKQ0KICAgICgiZGsiIC4gImRlZmluZS1rZXkg IikNCiAgICAoImRtcCIgLiAiZGVyaXZlZC1tb2RlLXAgJyIpDQogICAgKCJkciIgLiAiZGVsZXRl LXJlZ2lvbiAiKQ0KICAgICgiZSIgLiAiZXJyb3IgXCIkXCIiKQ0KICAgICgiZWZuIiAuICJleHBh bmQtZmlsZS1uYW1lICIpDQogICAgKCJmIiAuICJmb3JtYXQgXCIkXCIiKQ0KICAgICgiZmIiIC4g ImZib3VuZHAgJyIpDQogICAgKCJmYnAiIC4gImZib3VuZHAgJyIpDQogICAgKCJmYyIgLiAiZm9y d2FyZC1jaGFyIDEiKQ0KICAgICgiZmYiIC4gImZpbmQtZmlsZSAiKQ0KICAgICgiZmwiIC4gImZv cndhcmQtbGluZSAxIikNCiAgICAoImZwIiAuICJmdW5jdGlvbnAgIikNCiAgICAoImZycCIgLiAi ZmlsZS1yZWFkYWJsZS1wICIpDQogICAgKCJmcyIgLiAiZm9yd2FyZC1zZXhwIDEiKQ0KICAgICgi ZnciIC4gImZvcndhcmQtd29yZCAxIikNCiAgICAoImciIC4gImdvdG8tY2hhciAiKQ0KICAgICgi Z2MiIC4gImdvdG8tY2hhciAiKQ0KICAgICgiZ3NrIiAuICJnbG9iYWwtc2V0LWtleSAiKQ0KICAg ICgiaSIgLiAiaW5zZXJ0ICIpDQogICAgKCJpZSIgLiAiaWdub3JlLWVycm9ycyAiKQ0KICAgICgi ayIgLiAia2JkIFwiJFwiIikNCiAgICAoImtiIiAuICJraWxsLWJ1ZmZlciIpDQogICAgKCJsIiAu ICJsYW1iZGEgKCQpIikNCiAgICAoImxhIiAuICJsb29raW5nLWF0IFwiJFwiIikNCiAgICAoImxh cCIgLiAibG9va2luZy1hdC1wIFwiJFwiIikNCiAgICAoImxiIiAuICJsb29raW5nLWJhY2sgXCIk XCIiKQ0KICAgICgibGV0IiAuICJsZXQgKCgkKSkiKQ0KICAgICgibHAiIC4gImxpc3RwICIpDQog ICAgKCJtIiAuICJtZXNzYWdlIFwiJCVzXCIiKQ0KICAgICgibWIiIC4gIm1hdGNoLWJlZ2lubmlu ZyAwIikNCiAgICAoIm1lIiAuICJtYXRjaC1lbmQgMCIpDQogICAgKCJtcyIgLiAibWF0Y2gtc3Ry aW5nIDAiKQ0KICAgICgibXNucCIgLiAibWF0Y2gtc3RyaW5nLW5vLXByb3BlcnRpZXMgMCIpDQog ICAgKCJuIiAuICJub3QgIikNCiAgICAoIm5sIiAuICJmb3J3YXJkLWxpbmUgMSIpDQogICAgKCJu cCIgLiAibnVtYmVycCAiKQ0KICAgICgib3ciIC4gIm90aGVyLXdpbmRvdyAxIikNCiAgICAoInAi IC4gInBvaW50JCIpDQogICAgKCJwYSIgLiAicG9pbnQtbWF4JCIpDQogICAgKCJwaSIgLiAicG9p bnQtbWluJCIpDQogICAgKCJyIiAuICJyZXF1aXJlICciKQ0KICAgICgicmgiIC4gInJlbW92ZS1o b29rICciKQ0KICAgICgicm0iIC4gInJlcGxhY2UtbWF0Y2ggXCIkXCIiKQ0KICAgICgicnEiIC4g InJlZ2V4cC1xdW90ZSBcIiRcIiIpDQogICAgKCJycmlzIiAuICJyZXBsYWNlLXJlZ2V4cC1pbi1z dHJpbmcgIikNCiAgICAoInJycyIgLiAicmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nICIpDQogICAg KCJycyIgLiAid2hpbGUgKHNlYXJjaC1mb3J3YXJkICQgbmlsIHQpXG4ocmVwbGFjZS1tYXRjaCBc IlwiKSBuaWwgdCkiKQ0KICAgICgicyIgLiAic2V0cSAiKQ0KICAgICgicz0iIC4gInN0cmluZz0g IikNCiAgICAoInNiIiAuICJzZWFyY2gtYmFja3dhcmQgXCIkXCIiKQ0KICAgICgic2JyIiAuICJz ZWFyY2gtYmFja3dhcmQtcmVnZXhwIFwiJFwiIikNCiAgICAoInNjYiIgLiAic2tpcC1jaGFycy1i YWNrd2FyZCBcIiRcclxuWzpibGFuazpdXCIiKQ0KICAgICgic2NmIiAuICJza2lwLWNoYXJzLWZv cndhcmQgXCIkXHJcbls6Ymxhbms6XVwiIikNCiAgICAoInNlIiAuICJzYXZlLWV4Y3Vyc2lvbiIp DQogICAgKCJzZiIgLiAic2VhcmNoLWZvcndhcmQgXCIkXCIiKQ0KICAgICgic2ZyIiAuICJzZWFy Y2gtZm9yd2FyZC1yZWdleHAgXCIkXCIiKQ0KICAgICgic20iIC4gInN0cmluZy1tYXRjaCBcIiRc IiIpDQogICAgKCJzbWQiIC4gInNhdmUtbWF0Y2gtZGF0YSIpDQogICAgKCJzbiIgLiAic3ltYm9s LW5hbWUgIikNCiAgICAoInNwIiAuICJzdHJpbmdwICIpDQogICAgKCJzciIgLiAic2F2ZS1yZXN0 cmljdGlvbiIpDQogICAgKCJzcyIgLiAic3Vic3RyaW5nICIpDQogICAgKCJzdGIiIC4gInN3aXRj aC10by1idWZmZXIgIikNCiAgICAoInN3IiAuICJzZWxlY3Qtd2luZG93ICIpDQogICAgKCJ0YXAi IC4gInRoaW5nLWF0LXBvaW50ICdzeW1ib2wiKQ0KICAgICgidSIgLiAidW5sZXNzICIpDQogICAg KCJ1cCIgLiAidW53aW5kLXByb3RlY3QgIikNCiAgICAoInciIC4gIndoZW4gIikNCiAgICAoIndj YiIgLiAid2l0aC1jdXJyZW50LWJ1ZmZlciAiKQ0KICAgICgid2YiIC4gIndyaXRlLWZpbGUgIikN CiAgICAoIndoIiAuICJ3aGlsZSAiKQ0KICAgICgid2wiIC4gIndpbmRvdy1saXN0IG5pbCAnbm9t aW5pYnVmZmVyIikNCiAgICAoInd0YiIgLiAid2l0aC10ZW1wLWJ1ZmZlciIpDQogICAgKCJ3dGYi IC4gIndpdGgtdGVtcC1maWxlIikNCiAgICApDQogICJBbGlzdCBvZiAoQUJCUkVWIC4gRVhQQU5T SU9OKSB1c2VkIGJ5IGBzb3RsaXNwJy4iKQ0KDQooZGVmdW4gc290bGlzcC1kZWZpbmUtZnVuY3Rp b24tYWJicmV2IChuYW1lIGV4cGFuc2lvbikNCiAgIkRlZmluZSBhIGZ1bmN0aW9uIGFiYnJldiBl eHBhbmRpbmcgTkFNRSB0byBFWFBBTlNJT04uDQpUaGlzIGFiYnJldiB3aWxsIG9ubHkgYmUgZXhw YW5kZWQgaW4gcGxhY2VzIHdoZXJlIGEgZnVuY3Rpb24gbmFtZSBpcw0Kc2Vuc2libGUuICBSb3Vn aGx5LCB0aGlzIGlzIHJpZ2h0IGFmdGVyIGEgYCgnIG9yIGEgYCMnJy4NCg0KSWYgRVhQQU5TSU9O IGlzIGFueSBzdHJpbmcsIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSB0aGUganVzdCB0aGUNCm5hbWUg b2YgYSBmdW5jdGlvbi4gIEluIHBhcnRpY3VsYXI6DQogIC0gaWYgaXQgY29udGFpbnMgYSBgJCcs IHRoaXMgY2hhciB3aWxsIG5vdCBiZSBpbnNlcnRlZCBhbmQNCiAgICBwb2ludCB3aWxsIGJlIG1v dmVkIHRvIGl0cyBwb3NpdGlvbiBhZnRlciBleHBhbnNpb24uDQogIC0gaWYgaXQgY29udGFpbnMg YSBzcGFjZSwgb25seSBhIHN1YnN0cmluZyBvZiBpdCB1cCB0byB0aGUNCmZpcnN0IHNwYWNlIGlz IGluc2VydGVkIHdoZW4gZXhwYW5kaW5nIGFmdGVyIGEgYCMnJyAodGhpcyBpcyBkb25lDQpieSBk ZWZpbmluZyB0d28gZGlmZmVyZW50IGFiYnJldnMpLg0KDQpGb3IgaW5zdGFuY2UsIGlmIG9uZSBk ZWZpbmVzDQogICAoc290bGlzcC1kZWZpbmUtZnVuY3Rpb24tYWJicmV2IFwiZFwiIFwiZGVsZXRl LWNoYXIgMVwiKQ0KDQp0aGVuIHRyaWdnZXJpbmcgYGV4cGFuZC1hYmJyZXYnIGFmdGVyIFwiZFwi IGV4cGFuZHMgaW4gdGhlDQpmb2xsb3dpbmcgd2F5Og0KICAgKGQgICAgPT4gKGRlbGV0ZS1jaGFy IDENCiAgICMnZCAgID0+ICMnZGVsZXRlLWNoYXIiDQogIChkZWZpbmUtYWJicmV2IGVtYWNzLWxp c3AtbW9kZS1hYmJyZXYtdGFibGUNCiAgICBuYW1lIHQgIydzb3RsaXNwLS1leHBhbmQtZnVuY3Rp b24NCiAgICA7OyBEb24ndCBvdmVycmlkZSB1c2VyIGFiYnJldnMNCiAgICA6c3lzdGVtIHQNCiAg ICA7OyBPbmx5IGV4cGFuZCBpbiBmdW5jdGlvbiBwbGFjZXMuDQogICAgOmVuYWJsZS1mdW5jdGlv biAjJ3NvdGxpc3AtLWZ1bmN0aW9uLXApDQogIChwdXRoYXNoIG5hbWUgZXhwYW5zaW9uIHNvdGxp c3AtLWZ1bmN0aW9uLXRhYmxlKSkNCg0KKGRlZnVuIHNvdGxpc3AtZXJhc2UtYWxsLWFiYnJldnMg KCkNCiAgIlVuZGVmaW5lIGFsbCBhYmJyZXZzIGRlZmluZWQgYnkgYHNvdGxpc3AnLiINCiAgKGlu dGVyYWN0aXZlKQ0KICAobWFwaGFzaCAobGFtYmRhICh4IF8pIChkZWZpbmUtYWJicmV2IGVtYWNz LWxpc3AtbW9kZS1hYmJyZXYtdGFibGUgeCBuaWwpKQ0KICAgICAgICAgICBzb3RsaXNwLS1mdW5j dGlvbi10YWJsZSkpDQoNCihkZWZ1biBzb3RsaXNwLWRlZmluZS1hbGwtYWJicmV2cyAoKQ0KICAi RGVmaW5lIGFsbCBhYmJyZXZzIGluIGBzb3RsaXNwLS1kZWZhdWx0LWZ1bmN0aW9uLWFiYnJldnMn LiINCiAgKGludGVyYWN0aXZlKQ0KICAobWFwYyAobGFtYmRhICh4KSAoc290bGlzcC1kZWZpbmUt ZnVuY3Rpb24tYWJicmV2IChjYXIgeCkgKGNkciB4KSkpDQogICAgc290bGlzcC0tZGVmYXVsdC1m dW5jdGlvbi1hYmJyZXZzKSkNCg0KDA0KOzs7IFRoZSBtaW5vci1tb2RlDQo7OzsjIyNhdXRvbG9h ZA0KKGRlZmluZS1taW5vci1tb2RlIHNwZWVkLW9mLXRob3VnaHQtbW9kZSBuaWwgbmlsIG5pbCBu aWwNCiAgOmdsb2JhbCB0DQogIChpZiBzcGVlZC1vZi10aG91Z2h0LW1vZGUNCiAgICAgIChwcm9n bg0KICAgICAgICAoYWRkLWhvb2sgJ2VtYWNzLWxpc3AtbW9kZS1ob29rICMnc3BlZWQtb2YtdGhv dWdodC0tbGlzcC1tb2RlKQ0KICAgICAgICAoc290bGlzcC1kZWZpbmUtYWxsLWFiYnJldnMpDQog ICAgICAgIChtYXBjIChsYW1iZGEgKGIpDQogICAgICAgICAgICAgICAgKHdpdGgtY3VycmVudC1i dWZmZXIgYg0KICAgICAgICAgICAgICAgICAgKHdoZW4gKGRlcml2ZWQtbW9kZS1wICdlbWFjcy1s aXNwLW1vZGUpDQogICAgICAgICAgICAgICAgICAgIChzcGVlZC1vZi10aG91Z2h0LS1saXNwLW1v ZGUgMSkpKSkNCiAgICAgICAgICAoYnVmZmVyLWxpc3QpKSkNCiAgICAocmVtb3ZlLWhvb2sgJ2Vt YWNzLWxpc3AtbW9kZS1ob29rICMnc3BlZWQtb2YtdGhvdWdodC0tbGlzcC1tb2RlKQ0KICAgIChz b3RsaXNwLWVyYXNlLWFsbC1hYmJyZXZzKQ0KICAgIChtYXBjIChsYW1iZGEgKGIpDQogICAgICAg ICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBiDQogICAgICAgICAgICAgICh3aGVuIChkZXJpdmVk LW1vZGUtcCAnZW1hY3MtbGlzcC1tb2RlKQ0KICAgICAgICAgICAgICAgIChzcGVlZC1vZi10aG91 Z2h0LS1saXNwLW1vZGUgLTEpKSkpDQogICAgICAoYnVmZmVyLWxpc3QpKSkpDQoNCihkZWZpbmUt bWlub3ItbW9kZSBzcGVlZC1vZi10aG91Z2h0LS1saXNwLW1vZGUgbmlsIG5pbCAiIFNvVCINCiAg JygoW00tcmV0dXJuXSAuIHNvdGxpc3AtbmV3bGluZS1hbmQtcGFyZW50aGVzZXMpDQogICAgKFtD LXJldHVybl0gLiBzb3RsaXNwLWRvd25saXN0LW5ld2xpbmUtYW5kLXBhcmVudGhlc2VzKQ0KICAg ICgiXEMtY2YiICAgIC4gc290bGlzcC1maW5kLW9yLWRlZmluZS1mdW5jdGlvbikNCiAgICAoIlxD LWN2IiAgICAuIHNvdGxpc3AtZmluZC1vci1kZWZpbmUtdmFyaWFibGUpKSkNCg0KDA0KOzs7IENv bW1hbmRzDQooZGVmdW4gc290bGlzcC1uZXdsaW5lLWFuZC1wYXJlbnRoZXNlcyAoKQ0KICAiYG5l d2xpbmUtYW5kLWluZGVudCcgdGhlbiBpbnNlcnQgYSBwYWlyIG9mIHBhcmVudGhlc2VzLiINCiAg KGludGVyYWN0aXZlKQ0KICAocG9pbnQpDQogIChpZ25vcmUtZXJyb3JzDQogICAgKGV4cGFuZC1h YmJyZXYpKQ0KICAobmV3bGluZS1hbmQtaW5kZW50KQ0KICAoaW5zZXJ0ICIoKSIpDQogIChmb3J3 YXJkLWNoYXIgLTEpKQ0KDQooZGVmdW4gc290bGlzcC1kb3dubGlzdC1uZXdsaW5lLWFuZC1wYXJl bnRoZXNlcyAoKQ0KICAiYHVwLWxpc3QnLCBgbmV3bGluZS1hbmQtaW5kZW50JywgdGhlbiBpbnNl cnQgYSBwYXJlbnRoZXNlcyBwYWlyLiINCiAgKGludGVyYWN0aXZlKQ0KICAoaWdub3JlLWVycm9y cw0KICAgIChleHBhbmQtYWJicmV2KSkNCiAgKHVwLWxpc3QpDQogIChuZXdsaW5lLWFuZC1pbmRl bnQpDQogIChpbnNlcnQgIigpIikNCiAgKGZvcndhcmQtY2hhciAtMSkpDQoNCihkZWZ1biBzb3Rs aXNwLS1maW5kLWluLWJ1ZmZlciAociBzKQ0KICAiRmluZCB0aGUgc3RyaW5nIChjb25jYXQgUiAo cmVnZXhwLXF1b3RlIFMpKSBzb21ld2hlcmUgaW4gdGhpcyBidWZmZXIuIg0KICAobGV0ICgobCAo c2F2ZS1leGN1cnNpb24NCiAgICAgICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQ0KICAg ICAgICAgICAgIChzYXZlLW1hdGNoLWRhdGENCiAgICAgICAgICAgICAgICh3aGVuIChzZWFyY2gt Zm9yd2FyZC1yZWdleHAgKGNvbmNhdCByIChyZWdleHAtcXVvdGUgcykgIlxcXz4iKQ0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwgOm5vZXJyb3IpDQogICAg ICAgICAgICAgICAgIChtYXRjaC1iZWdpbm5pbmcgMCkpKSkpKQ0KICAgICh3aGVuIGwNCiAgICAg IChwdXNoLW1hcmspDQogICAgICAoZ290by1jaGFyIGwpDQogICAgICBsKSkpDQoNCihkZWZ1biBz b3RsaXNwLWZpbmQtb3ItZGVmaW5lLWZ1bmN0aW9uICgmb3B0aW9uYWwgcHJlZml4KQ0KICAiSWYg c3ltYm9sIHVuZGVyIHBvaW50IGlzIGEgZGVmaW5lZCBmdW5jdGlvbiwgZ28gdG8gaXQsIG90aGVy d2lzZSBkZWZpbmUgaXQuDQpFc3NlbnRpYWxseSBgZmluZC1mdW5jdGlvbicgb24gc3Rlcm9pZHMu DQoNCklmIHlvdSB3cml0ZSBpbiB5b3VyIGNvZGUgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB5b3Ug aGF2ZW4ndA0KZGVmaW5lZCB5ZXQsIGp1c3QgcGxhY2UgcG9pbnQgb24gaXRzIG5hbWUgYW5kIGhp dCBcXFtzb3RsaXNwLWZpbmQtb3ItZGVmaW5lLWZ1bmN0aW9uXQ0KYW5kIGEgZGVmdW4gd2lsbCBi ZSBpbnNlcnRlZCB3aXRoIHBvaW50IGluc2lkZSBpdC4gIEFmdGVyIHRoYXQsDQp5b3UgY2FuIGp1 c3QgaGl0IGBwb3AtbWFyaycgdG8gZ28gYmFjayB0byB3aGVyZSB5b3Ugd2VyZS4NCldpdGggYSBQ UkVGSVggYXJndW1lbnQsIGNyZWF0ZXMgYSBgZGVmbWFjcm8nIGluc3RlYWQuDQoNCklmIHRoZSBm dW5jdGlvbiB1bmRlciBwb2ludCBpcyBhbHJlYWR5IGRlZmluZWQgdGhpcyBqdXN0IGNhbGxzDQpg ZmluZC1mdW5jdGlvbicsIHdpdGggb25lIGV4Y2VwdGlvbjoNCiAgICBpZiB0aGVyZSdzIGEgZGVm dW4gKG9yIGVxdWl2YWxlbnQpIGZvciB0aGlzIGZ1bmN0aW9uIGluIHRoZQ0KICAgIGN1cnJlbnQg YnVmZmVyLCB3ZSBnbyB0byB0aGF0IGV2ZW4gaWYgaXQncyBub3Qgd2hlcmUgdGhlDQogICAgZ2xv YmFsIGRlZmluaXRpb24gY29tZXMgZnJvbSAodGhpcyBpcyB1c2VmdWwgaWYgeW91J3JlDQogICAg d3JpdGluZyBhbiBFbWFjcyBwYWNrYWdlIHRoYXQgYWxzbyBoYXBwZW5zIHRvIGJlIGluc3RhbGxl ZA0KICAgIHRocm91Z2ggcGFja2FnZS5lbCkuDQoNCldpdGggYSBwcmVmaXggYXJndW1lbnQsIGRl ZmluZXMgYSBgZGVmbWFjcm8nIGluc3RlYWQgb2YgYSBgZGVmdW4nLiINCiAgKGludGVyYWN0aXZl ICJQIikNCiAgKGxldCAoKG5hbWUgKHNvdGxpc3AtLWZ1bmN0aW9uLWF0LXBvaW50KSkpDQogICAg KHVubGVzcyAoYW5kIG5hbWUgKHNvdGxpc3AtLWZpbmQtaW4tYnVmZmVyICIoZGVmXFwodW5cXHxt YWNyb1xcfGFsaWFzXFwpICIgbmFtZSkpDQogICAgICAobGV0ICgobmFtZS1zIChpbnRlcm4tc29m dCBuYW1lKSkpDQogICAgICAgIChpZiAoZmJvdW5kcCBuYW1lLXMpDQogICAgICAgICAgICAoZmlu ZC1mdW5jdGlvbiBuYW1lLXMpDQogICAgICAgICAgKHB1c2gtbWFyaykNCiAgICAgICAgICAoZW5k LW9mLWRlZnVuKQ0KICAgICAgICAgIChpbnNlcnQgIlxuKGRlZiIgKGlmIHByZWZpeCAibWFjcm8i ICJ1biIpDQogICAgICAgICAgICAgICAgICAiICIgbmFtZSAiICgiKQ0KICAgICAgICAgIChzYXZl LWV4Y3Vyc2lvbiAoaW5zZXJ0ICIpXG4gIFwiXCJcbiAgKVxuIikpKSkpKSkNCg0KKGRlZnVuIHNv dGxpc3AtLWZ1bmN0aW9uLWF0LXBvaW50ICgpDQogICJSZXR1cm4gbmFtZSBvZiBgZnVuY3Rpb24t Y2FsbGVkLWF0LXBvaW50Jy4iDQogIChpZiAoc2F2ZS1leGN1cnNpb24NCiAgICAgICAgKGlnbm9y ZS1lcnJvcnMgKGZvcndhcmQtc2V4cCAtMSkNCiAgICAgICAgICAgICAgICAgICAgICAgKGxvb2tp bmctYXQtcCAiIyciKSkpDQogICAgICAodGhpbmctYXQtcG9pbnQgJ3N5bWJvbCkNCiAgICAoaWYt bGV0ICgoZmNhcCAoZnVuY3Rpb24tY2FsbGVkLWF0LXBvaW50KSkpDQogICAgICAgIChzeW1ib2wt bmFtZSBmY2FwKQ0KICAgICAgKHRoaW5nLWF0LXBvaW50ICdzeW1ib2wpKSkpDQoNCihkZWZ1biBz b3RsaXNwLWZpbmQtb3ItZGVmaW5lLXZhcmlhYmxlICgmb3B0aW9uYWwgcHJlZml4KQ0KICAiSWYg c3ltYm9sIHVuZGVyIHBvaW50IGlzIGEgZGVmaW5lZCB2YXJpYWJsZSwgZ28gdG8gaXQsIG90aGVy d2lzZSBkZWZpbmUgaXQuDQpFc3NlbnRpYWxseSBgZmluZC12YXJpYWJsZScgb24gc3Rlcm9pZHMu DQoNCklmIHlvdSB3cml0ZSBpbiB5b3VyIGNvZGUgdGhlIG5hbWUgb2YgYSB2YXJpYWJsZSB5b3Ug aGF2ZW4ndA0KZGVmaW5lZCB5ZXQsIHBsYWNlIHBvaW50IG9uIGl0cyBuYW1lIGFuZCBoaXQgXFxb c290bGlzcC1maW5kLW9yLWRlZmluZS12YXJpYWJsZV0NCmFuZCBhIGBkZWZjdXN0b20nIHdpbGwg YmUgY3JlYXRlZCB3aXRoIHBvaW50IGluc2lkZS4gIEFmdGVyIHRoYXQsDQp5b3UgY2FuIGp1c3Qg YHBvcC1tYXJrJyB0byBnbyBiYWNrIHRvIHdoZXJlIHlvdSB3ZXJlLiAgV2l0aCBhDQpQUkVGSVgg YXJndW1lbnQsIGNyZWF0ZXMgYSBgZGVmdmFyJyBpbnN0ZWFkLg0KDQpJZiB0aGUgdmFyaWFibGUg dW5kZXIgcG9pbnQgaXMgYWxyZWFkeSBkZWZpbmVkIHRoaXMganVzdCBjYWxscw0KYGZpbmQtdmFy aWFibGUnLCB3aXRoIG9uZSBleGNlcHRpb246DQogICAgaWYgdGhlcmUncyBhIGRlZnZhciAob3Ig ZXF1aXZhbGVudCkgZm9yIHRoaXMgdmFyaWFibGUgaW4gdGhlDQogICAgY3VycmVudCBidWZmZXIs IHdlIGdvIHRvIHRoYXQgZXZlbiBpZiBpdCdzIG5vdCB3aGVyZSB0aGUNCiAgICBnbG9iYWwgZGVm aW5pdGlvbiBjb21lcyBmcm9tICh0aGlzIGlzIHVzZWZ1bCBpZiB5b3UncmUNCiAgICB3cml0aW5n IGFuIEVtYWNzIHBhY2thZ2UgdGhhdCBhbHNvIGhhcHBlbnMgdG8gYmUgaW5zdGFsbGVkDQogICAg dGhyb3VnaCBwYWNrYWdlLmVsKS4NCg0KV2l0aCBhIHByZWZpeCBhcmd1bWVudCwgZGVmaW5lcyBh IGBkZWZ2YXInIGluc3RlYWQgb2YgYSBgZGVmY3VzdG9tJy4iDQogIChpbnRlcmFjdGl2ZSAiUCIp DQogIChsZXQgKChuYW1lIChzeW1ib2wtbmFtZSAodmFyaWFibGUtYXQtcG9pbnQgdCkpKSkNCiAg ICAodW5sZXNzIChzb3RsaXNwLS1maW5kLWluLWJ1ZmZlciAiKGRlZlxcKGN1c3RvbVxcfGNvbnN0 XFx8dmFyXFwpICIgbmFtZSkNCiAgICAgICh1bmxlc3MgKGFuZCAoc3ltYm9scCAodmFyaWFibGUt YXQtcG9pbnQpKQ0KICAgICAgICAgICAgICAgICAgIChpZ25vcmUtZXJyb3JzIChmaW5kLXZhcmlh YmxlICh2YXJpYWJsZS1hdC1wb2ludCkpIHQpKQ0KICAgICAgICAocHVzaC1tYXJrKQ0KICAgICAg ICAobGV0ICgobmFtZSAodGhpbmctYXQtcG9pbnQgJ3N5bWJvbCkpKQ0KICAgICAgICAgIChiZWdp bm5pbmctb2YtZGVmdW4pDQogICAgICAgICAgKHdoZW4gKGxvb2tpbmctYmFjayAiXjs7OyMjI2F1 dG9sb2FkXFxzLSpcbiIpDQogICAgICAgICAgICAoZm9yd2FyZC1saW5lIC0xKSkNCiAgICAgICAg ICAoaW5zZXJ0ICIoZGVmIiAoaWYgcHJlZml4ICJ2YXIiICJjdXN0b20iKQ0KICAgICAgICAgICAg ICAgICAgIiAiIG5hbWUgIiB0IikNCiAgICAgICAgICAoc2F2ZS1leGN1cnNpb24NCiAgICAgICAg ICAgIChpbnNlcnQgIlxuICBcIlwiXG4gIDp0eXBlICdib29sZWFuKVxuXG4iKSkpKSkpKQ0KDQoo cHJvdmlkZSAnc290bGlzcCkNCjs7OyBzb3RsaXNwLmVsIGVuZHMgaGVyZQ0KDQo= --e89a8f83a88372e124050d688a79--