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: Character group folding in searches Date: Fri, 6 Feb 2015 11:04:03 -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=001a113d5b7c14faa2050e6b0e21 X-Trace: ger.gmane.org 1423227860 18805 80.91.229.3 (6 Feb 2015 13:04:20 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 6 Feb 2015 13:04:20 +0000 (UTC) To: emacs-devel Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Feb 06 14:04:19 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 1YJiZx-0004vl-Ir for ged-emacs-devel@m.gmane.org; Fri, 06 Feb 2015 14:04:13 +0100 Original-Received: from localhost ([::1]:48169 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJiZw-0000Yd-W8 for ged-emacs-devel@m.gmane.org; Fri, 06 Feb 2015 08:04:13 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:48514) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJiZr-0000WB-9v for emacs-devel@gnu.org; Fri, 06 Feb 2015 08:04:09 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YJiZo-0007hA-SB for emacs-devel@gnu.org; Fri, 06 Feb 2015 08:04:07 -0500 Original-Received: from mail-ob0-x233.google.com ([2607:f8b0:4003:c01::233]:49813) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YJiZo-0007gy-Ie for emacs-devel@gnu.org; Fri, 06 Feb 2015 08:04:04 -0500 Original-Received: by mail-ob0-f179.google.com with SMTP id wp4so12997402obc.10 for ; Fri, 06 Feb 2015 05:04:04 -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=Jkd7fYSMu9IyC+7u16Hdw/yMSPJSc3MXO/kmPHoVsG4=; b=0mehqMO0Eo8JNxcmSqxL9AFJHoWxXfCM/8GqSNFj2ZN9Ipz5IH81w+hCFTbYmUxAP2 tQWK35w0xtkP30C886BIx2YYcIlGtvNAcabZWLo4a/x+0AlCn6Tapo77hkYAU4zvkCxJ ibQzRZUzI5dEGOBKe6xJPoqYGZvBxFlOH+8isVv8LyhD8a1L/Hmv/JpXtq8TzPA/S8oa d5ODlJxNO7gAHZLqhPMMjrX9670+4yP4bSutrr5baI3uL+oqHVtyvD6F7pkHbSW2VSxo 7MWfFCkDCBtQyis3X7ItBvsiIyezWw3hYKnIe1pd0EUPCWRvuloRgnWJjaO1UcvahlOn Xw7w== X-Received: by 10.202.218.135 with SMTP id r129mr2305891oig.26.1423227844089; Fri, 06 Feb 2015 05:04:04 -0800 (PST) Original-Received: by 10.76.125.1 with HTTP; Fri, 6 Feb 2015 05:04:03 -0800 (PST) X-Google-Sender-Auth: hGtDxTYnlQ8EX0mzxUeyWloTDPo X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4003:c01::233 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:182521 Archived-At: --001a113d5b7c14faa2050e6b0e21 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable This is a follow up on a previous discussion regarding Single quotes in Inf= o. I've been looking into ways of having the search functions fold similar characters together. There are a few goals which I'm listing above to facilitate comparision of possible approaches. Feel free to mention other highly-important goals, but please don't go into high-level abstractions (such as letting the user define groups), these can always be done and are not relevant to this discussion. 1. Follow the `decomposition' char property. For instance, the character "a" in the search string would match any one of "a=C3=A3=C3=A1= =C3=A2" (and so on). This is easy to do, and one of the patches below already shows how. Note that this won't handle symbols that are actually composed of multiple characters. 2. Follow an intuitive sense of similarity which is not defined in the unicode standard. For instance, an ascii single quote in the search string should match any type of single quote (there are about a dozen that I know of). 3. Ignore modifier (non-spacing) characters. Another way of writing "=C3=A1" is to write "a" followed by a special non-spacing accute. This kind of thing (a symbol composed of multiple characters) is not handled by item 1, so I'm listing as a separate point. 4. Perform the conversion two-ways. That is, item 1 should work even if the search contained "=C3=A1" instead of "a". Item 2 should match an ascii quote if the search string contains a curly quote. This is mostly useful when the user copies a fancy string from somewhere and pastes it into the search field. 5. It should work for any searching, not just isearch. Goals 1, 2, and 3 are the most important (in my opinion). Goals 1 and 2 are achieved by all of the patches below, while the others va= ry. ----------------------------------------------------------- Below, I'm attaching 3 patches, they each represent a different way of achieving part of the above. * group-folding-with-regexp-lisp.patch This one takes each input character and either keeps it verbatim or transform it into a regexp which matches the entire group that this character represents. It is implemented in isearch. + It trivially handles goals 1, 2 and 3. Because regexps are quite versatile, it is the only solution that handles item 3 (it allows each character to match more than a single character). + Goal 4 can be achieved with a bit more work (the input just needs to be normalized before turning it into a regexp). - It is slower than the options below, but it should be fast enough for ise= arch. - Goal 5 would take a lot more work. This character parsing would have to be added to each of search functions (not to mention it might be too slow for lisp-code searches). (Note that the attached patch doesn't actually do item 1. That is NOT a limitation, it can do item 1 quite trivially. I simply haven't done it yet.) * group-folding-with-case-table-lisp.patch This patch is entirely in elisp. I've put it all inside `isearch.el' for now, for the sake of simplicity, but it's not restricted to isearch. It creates a new case-table which performs group folding by borrowing the case-folding machinery, so it is very fast. Then, group folding can be achieved by running the search inside a `with-group-folding` macro. There's also an example implementation which turns it on for isearch by default. + It immediately satisfies items 1, 2, 4, and 5. + It is very fast. - It has no simple way of achieving item 3. (Note that the attached patch doesn't actually do item 2. That is NOT a limitation, it can do item 2 quite trivially. I simply haven't done it yet.) * group-folding-with-case-table-C.patch This patch defines a new char-table and uses it instead of case_canon_table when the group-fold-search variable is non-nil. This shares the advantages and disadvantages of the lisp patch above but, in addition: + You don't need a `with-group-folding' macro, all you need is to (let ((group-fold-search t)) ...) around the search which is more in terms with how case-folding works. - If the user decides to set `group-fold-search' to t, this can break existing code (a disadvantage that the lisp version above does not have). - It adds two extra fields to every buffer object (the boolean variable and the char table). (Note that compiling this last patch gives a crashing executable for me. I'm just putting it here to showcase the option.) --------------------- My question is: Do any of these options seem good enough? Which would you all like to explo= re? I like the second one best, but goal 3 is quite important. --001a113d5b7c14faa2050e6b0e21 Content-Type: text/x-patch; charset=US-ASCII; name="group-folding-with-case-table-C.patch" Content-Disposition: attachment; filename="group-folding-with-case-table-C.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i5tifuv60 RnJvbSBkNDlkMDNhYmRiYjFiZGI4OTJhMzIyZWQ2ZDllMjU2NDhlZGMzYjU2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBcnR1ciBNYWxhYmFyYmEgPGJydWNlLmNvbm5vci5hbUBnbWFp bC5jb20+CkRhdGU6IFRodSwgNSBGZWIgMjAxNSAyMjo1MDo1MiAtMDIwMApTdWJqZWN0OiBbUEFU Q0hdIGhpCgotLS0KIHNyYy9idWZmZXIuYyAgfCAxOCArKysrKysrKysrKysrKysrKysKIHNyYy9i dWZmZXIuaCAgfCAgOSArKysrKysrKysKIHNyYy9jYXNldGFiLmMgfCAgNyArKysrKysrCiBzcmMv ZWRpdGZucy5jIHwgIDYgKysrKy0tCiBzcmMvc2VhcmNoLmMgIHwgMjcgKysrKysrKysrKysrKysr KystLS0tLS0tLS0tCiA1IGZpbGVzIGNoYW5nZWQsIDU1IGluc2VydGlvbnMoKyksIDEyIGRlbGV0 aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9idWZmZXIuYyBiL3NyYy9idWZmZXIuYwppbmRleCA2 N2VkYTNlLi43MTYwODUwIDEwMDY0NAotLS0gYS9zcmMvYnVmZmVyLmMKKysrIGIvc3JjL2J1ZmZl ci5jCkBAIC0xODIsNiArMTgyLDExIEBAIGJzZXRfY2FzZV9mb2xkX3NlYXJjaCAoc3RydWN0IGJ1 ZmZlciAqYiwgTGlzcF9PYmplY3QgdmFsKQogICBiLT5JTlRFUk5BTF9GSUVMRCAoY2FzZV9mb2xk X3NlYXJjaCkgPSB2YWw7CiB9CiBzdGF0aWMgdm9pZAorYnNldF9ncm91cF9mb2xkX3NlYXJjaCAo c3RydWN0IGJ1ZmZlciAqYiwgTGlzcF9PYmplY3QgdmFsKQoreworICBiLT5JTlRFUk5BTF9GSUVM RCAoZ3JvdXBfZm9sZF9zZWFyY2gpID0gdmFsOworfQorc3RhdGljIHZvaWQKIGJzZXRfY3RsX2Fy cm93IChzdHJ1Y3QgYnVmZmVyICpiLCBMaXNwX09iamVjdCB2YWwpCiB7CiAgIGItPklOVEVSTkFM X0ZJRUxEIChjdGxfYXJyb3cpID0gdmFsOwpAQCAtOTc1LDYgKzk4MCw3IEBAIHJlc2V0X2J1ZmZl cl9sb2NhbF92YXJpYWJsZXMgKHN0cnVjdCBidWZmZXIgKmIsIGJvb2wgcGVybWFuZW50X3RvbykK ICAgYnNldF91cGNhc2VfdGFibGUgKGIsIFhDSEFSX1RBQkxFIChWYXNjaWlfZG93bmNhc2VfdGFi bGUpLT5leHRyYXNbMF0pOwogICBic2V0X2Nhc2VfY2Fub25fdGFibGUgKGIsIFhDSEFSX1RBQkxF IChWYXNjaWlfZG93bmNhc2VfdGFibGUpLT5leHRyYXNbMV0pOwogICBic2V0X2Nhc2VfZXF2X3Rh YmxlIChiLCBYQ0hBUl9UQUJMRSAoVmFzY2lpX2Rvd25jYXNlX3RhYmxlKS0+ZXh0cmFzWzJdKTsK KyAgYnNldF9ncm91cF9jYW5vbl90YWJsZSAoYiwgWENIQVJfVEFCTEUgKFZhc2NpaV9kb3duY2Fz ZV90YWJsZSktPmV4dHJhc1sxXSk7CiAgIGJzZXRfaW52aXNpYmlsaXR5X3NwZWMgKGIsIFF0KTsK IAogICAvKiBSZXNldCBhbGwgKG9yIG1vc3QpIHBlci1idWZmZXIgdmFyaWFibGVzIHRvIHRoZWly IGRlZmF1bHRzLiAgKi8KQEAgLTUwNTMsNiArNTA1OSw3IEBAIGluaXRfYnVmZmVyX29uY2UgKHZv aWQpCiAgIGJzZXRfdXBjYXNlX3RhYmxlICgmYnVmZmVyX2xvY2FsX2ZsYWdzLCBtYWtlX251bWJl ciAoMCkpOwogICBic2V0X2Nhc2VfY2Fub25fdGFibGUgKCZidWZmZXJfbG9jYWxfZmxhZ3MsIG1h a2VfbnVtYmVyICgwKSk7CiAgIGJzZXRfY2FzZV9lcXZfdGFibGUgKCZidWZmZXJfbG9jYWxfZmxh Z3MsIG1ha2VfbnVtYmVyICgwKSk7CisgIGJzZXRfZ3JvdXBfY2Fub25fdGFibGUgKCZidWZmZXJf bG9jYWxfZmxhZ3MsIG1ha2VfbnVtYmVyICgwKSk7CiAgIGJzZXRfbWlub3JfbW9kZXMgKCZidWZm ZXJfbG9jYWxfZmxhZ3MsIG1ha2VfbnVtYmVyICgwKSk7CiAgIGJzZXRfd2lkdGhfdGFibGUgKCZi dWZmZXJfbG9jYWxfZmxhZ3MsIG1ha2VfbnVtYmVyICgwKSk7CiAgIGJzZXRfcHRfbWFya2VyICgm YnVmZmVyX2xvY2FsX2ZsYWdzLCBtYWtlX251bWJlciAoMCkpOwpAQCAtNTA2NSw2ICs1MDcyLDcg QEAgaW5pdF9idWZmZXJfb25jZSAodm9pZCkKICAgWFNFVEZBU1RJTlQgKEJWQVIgKCZidWZmZXJf bG9jYWxfZmxhZ3MsIGFiYnJldl9tb2RlKSwgaWR4KTsgKytpZHg7CiAgIFhTRVRGQVNUSU5UIChC VkFSICgmYnVmZmVyX2xvY2FsX2ZsYWdzLCBvdmVyd3JpdGVfbW9kZSksIGlkeCk7ICsraWR4Owog ICBYU0VURkFTVElOVCAoQlZBUiAoJmJ1ZmZlcl9sb2NhbF9mbGFncywgY2FzZV9mb2xkX3NlYXJj aCksIGlkeCk7ICsraWR4OworICBYU0VURkFTVElOVCAoQlZBUiAoJmJ1ZmZlcl9sb2NhbF9mbGFn cywgZ3JvdXBfZm9sZF9zZWFyY2gpLCBpZHgpOyArK2lkeDsKICAgWFNFVEZBU1RJTlQgKEJWQVIg KCZidWZmZXJfbG9jYWxfZmxhZ3MsIGF1dG9fZmlsbF9mdW5jdGlvbiksIGlkeCk7ICsraWR4Owog ICBYU0VURkFTVElOVCAoQlZBUiAoJmJ1ZmZlcl9sb2NhbF9mbGFncywgc2VsZWN0aXZlX2Rpc3Bs YXkpLCBpZHgpOyArK2lkeDsKICAgWFNFVEZBU1RJTlQgKEJWQVIgKCZidWZmZXJfbG9jYWxfZmxh Z3MsIHNlbGVjdGl2ZV9kaXNwbGF5X2VsbGlwc2VzKSwgaWR4KTsgKytpZHg7CkBAIC01MTQzLDYg KzUxNTEsNyBAQCBpbml0X2J1ZmZlcl9vbmNlICh2b2lkKQogICBic2V0X2FiYnJldl9tb2RlICgm YnVmZmVyX2RlZmF1bHRzLCBRbmlsKTsKICAgYnNldF9vdmVyd3JpdGVfbW9kZSAoJmJ1ZmZlcl9k ZWZhdWx0cywgUW5pbCk7CiAgIGJzZXRfY2FzZV9mb2xkX3NlYXJjaCAoJmJ1ZmZlcl9kZWZhdWx0 cywgUXQpOworICBic2V0X2dyb3VwX2ZvbGRfc2VhcmNoICgmYnVmZmVyX2RlZmF1bHRzLCBRbmls KTsKICAgYnNldF9hdXRvX2ZpbGxfZnVuY3Rpb24gKCZidWZmZXJfZGVmYXVsdHMsIFFuaWwpOwog ICBic2V0X3NlbGVjdGl2ZV9kaXNwbGF5ICgmYnVmZmVyX2RlZmF1bHRzLCBRbmlsKTsKICAgYnNl dF9zZWxlY3RpdmVfZGlzcGxheV9lbGxpcHNlcyAoJmJ1ZmZlcl9kZWZhdWx0cywgUXQpOwpAQCAt NTQ4Niw2ICs1NDk1LDExIEBAIFRoaXMgaXMgdGhlIHNhbWUgYXMgKGRlZmF1bHQtdmFsdWUgJ3Rh Yi13aWR0aCkuICAqLyk7CiAJCQkgIGRvYzogLyogRGVmYXVsdCB2YWx1ZSBvZiBgY2FzZS1mb2xk LXNlYXJjaCcgZm9yIGJ1ZmZlcnMgdGhhdCBkb24ndCBvdmVycmlkZSBpdC4KIFRoaXMgaXMgdGhl IHNhbWUgYXMgKGRlZmF1bHQtdmFsdWUgJ2Nhc2UtZm9sZC1zZWFyY2gpLiAgKi8pOwogCisgIERF RlZBUl9CVUZGRVJfREVGQVVMVFMgKCJkZWZhdWx0LWdyb3VwLWZvbGQtc2VhcmNoIiwKKwkJCSAg Z3JvdXBfZm9sZF9zZWFyY2gsCisJCQkgIGRvYzogLyogRGVmYXVsdCB2YWx1ZSBvZiBgZ3JvdXAt Zm9sZC1zZWFyY2gnIGZvciBidWZmZXJzIHRoYXQgZG9uJ3Qgb3ZlcnJpZGUgaXQuCitUaGlzIGlz IHRoZSBzYW1lIGFzIChkZWZhdWx0LXZhbHVlICdncm91cC1mb2xkLXNlYXJjaCkuICAqLyk7CisK ICAgREVGVkFSX0JVRkZFUl9ERUZBVUxUUyAoImRlZmF1bHQtbGVmdC1tYXJnaW4td2lkdGgiLAog CQkJICBsZWZ0X21hcmdpbl9jb2xzLAogCQkJICBkb2M6IC8qIERlZmF1bHQgdmFsdWUgb2YgYGxl ZnQtbWFyZ2luLXdpZHRoJyBmb3IgYnVmZmVycyB0aGF0IGRvbid0IG92ZXJyaWRlIGl0LgpAQCAt NTY1Nyw2ICs1NjcxLDEwIEBAIFVzZSB0aGUgY29tbWFuZCBgYWJicmV2LW1vZGUnIHRvIGNoYW5n ZSB0aGlzIHZhcmlhYmxlLiAgKi8pOwogCQkgICAgIFFuaWwsCiAJCSAgICAgZG9jOiAvKiBOb24t bmlsIGlmIHNlYXJjaGVzIGFuZCBtYXRjaGVzIHNob3VsZCBpZ25vcmUgY2FzZS4gICovKTsKIAor ICBERUZWQVJfUEVSX0JVRkZFUiAoImdyb3VwLWZvbGQtc2VhcmNoIiwgJkJWQVIgKGN1cnJlbnRf YnVmZmVyLCBncm91cF9mb2xkX3NlYXJjaCksCisJCSAgICAgUW5pbCwKKwkJICAgICBkb2M6IC8q IE5vbi1uaWwgaWYgc2VhcmNoZXMgYW5kIG1hdGNoZXMgc2hvdWxkIGlnbm9yZSBjYXNlLiAgKi8p OworCiAgIERFRlZBUl9QRVJfQlVGRkVSICgiZmlsbC1jb2x1bW4iLCAmQlZBUiAoY3VycmVudF9i dWZmZXIsIGZpbGxfY29sdW1uKSwKIAkJICAgICBRaW50ZWdlcnAsCiAJCSAgICAgZG9jOiAvKiBD b2x1bW4gYmV5b25kIHdoaWNoIGF1dG9tYXRpYyBsaW5lLXdyYXBwaW5nIHNob3VsZCBoYXBwZW4u CmRpZmYgLS1naXQgYS9zcmMvYnVmZmVyLmggYi9zcmMvYnVmZmVyLmgKaW5kZXggODE4NTJjYS4u ZmY1NmE4MSAxMDA2NDQKLS0tIGEvc3JjL2J1ZmZlci5oCisrKyBiL3NyYy9idWZmZXIuaApAQCAt NTU4LDYgKzU1OCw3IEBAIHN0cnVjdCBidWZmZXIKICAgLyogdGFiLXdpZHRoIGlzIGJ1ZmZlci1s b2NhbCBzbyB0aGF0IHJlZGlzcGxheSBjYW4gZmluZCBpdAogICAgICBpbiBidWZmZXJzIHRoYXQg YXJlIG5vdCBjdXJyZW50LiAgKi8KICAgTGlzcF9PYmplY3QgSU5URVJOQUxfRklFTEQgKGNhc2Vf Zm9sZF9zZWFyY2gpOworICBMaXNwX09iamVjdCBJTlRFUk5BTF9GSUVMRCAoZ3JvdXBfZm9sZF9z ZWFyY2gpOwogICBMaXNwX09iamVjdCBJTlRFUk5BTF9GSUVMRCAodGFiX3dpZHRoKTsKICAgTGlz cF9PYmplY3QgSU5URVJOQUxfRklFTEQgKGZpbGxfY29sdW1uKTsKICAgTGlzcF9PYmplY3QgSU5U RVJOQUxfRklFTEQgKGxlZnRfbWFyZ2luKTsKQEAgLTU3OCw2ICs1NzksOSBAQCBzdHJ1Y3QgYnVm ZmVyCiAgIC8qIENoYXItdGFibGUgb2YgZXF1aXZhbGVuY2VzIGZvciBjYXNlLWZvbGRpbmcgc2Vh cmNoLiAgKi8KICAgTGlzcF9PYmplY3QgSU5URVJOQUxfRklFTEQgKGNhc2VfZXF2X3RhYmxlKTsK IAorICAvKiBDaGFyLXRhYmxlIGZvciBjb252ZXJzaW9uIGZvciBncm91cC1mb2xkaW5nIHNlYXJj aC4gICovCisgIExpc3BfT2JqZWN0IElOVEVSTkFMX0ZJRUxEIChncm91cF9jYW5vbl90YWJsZSk7 CisKICAgLyogTm9uLW5pbCBtZWFucyBkbyBub3QgZGlzcGxheSBjb250aW51YXRpb24gbGluZXMu ICAqLwogICBMaXNwX09iamVjdCBJTlRFUk5BTF9GSUVMRCAodHJ1bmNhdGVfbGluZXMpOwogCkBA IC04OTksNiArOTAzLDExIEBAIGJzZXRfY2FzZV9lcXZfdGFibGUgKHN0cnVjdCBidWZmZXIgKmIs IExpc3BfT2JqZWN0IHZhbCkKICAgYi0+SU5URVJOQUxfRklFTEQgKGNhc2VfZXF2X3RhYmxlKSA9 IHZhbDsKIH0KIElOTElORSB2b2lkCitic2V0X2dyb3VwX2Nhbm9uX3RhYmxlIChzdHJ1Y3QgYnVm ZmVyICpiLCBMaXNwX09iamVjdCB2YWwpCit7CisgIGItPklOVEVSTkFMX0ZJRUxEIChncm91cF9j YW5vbl90YWJsZSkgPSB2YWw7Cit9CitJTkxJTkUgdm9pZAogYnNldF9kaXJlY3RvcnkgKHN0cnVj dCBidWZmZXIgKmIsIExpc3BfT2JqZWN0IHZhbCkKIHsKICAgYi0+SU5URVJOQUxfRklFTEQgKGRp cmVjdG9yeSkgPSB2YWw7CmRpZmYgLS1naXQgYS9zcmMvY2FzZXRhYi5jIGIvc3JjL2Nhc2V0YWIu YwppbmRleCBiMDg2YWJjLi44MWE2NDc2IDEwMDY0NAotLS0gYS9zcmMvY2FzZXRhYi5jCisrKyBi L3NyYy9jYXNldGFiLmMKQEAgLTYzLDYgKzYzLDEzIEBAIGNoZWNrX2Nhc2VfdGFibGUgKExpc3Bf T2JqZWN0IG9iaikKICAgcmV0dXJuIChvYmopOwogfQogCitERUZVTiAoImN1cnJlbnQtZ3JvdXAt dGFibGUiLCBGY3VycmVudF9ncm91cF90YWJsZSwgU2N1cnJlbnRfZ3JvdXBfdGFibGUsIDAsIDAs IDAsCisgICAgICAgZG9jOiAvKiBSZXR1cm4gdGhlIGdyb3VwIHRhYmxlIG9mIHRoZSBjdXJyZW50 IGJ1ZmZlci4gICovKQorICAodm9pZCkKK3sKKyAgcmV0dXJuIEJWQVIgKGN1cnJlbnRfYnVmZmVy LCBncm91cF9jYW5vbl90YWJsZSk7Cit9CisKIERFRlVOICgiY3VycmVudC1jYXNlLXRhYmxlIiwg RmN1cnJlbnRfY2FzZV90YWJsZSwgU2N1cnJlbnRfY2FzZV90YWJsZSwgMCwgMCwgMCwKICAgICAg ICBkb2M6IC8qIFJldHVybiB0aGUgY2FzZSB0YWJsZSBvZiB0aGUgY3VycmVudCBidWZmZXIuICAq LykKICAgKHZvaWQpCmRpZmYgLS1naXQgYS9zcmMvZWRpdGZucy5jIGIvc3JjL2VkaXRmbnMuYwpp bmRleCA3MDI2Y2NjLi45ZmU2YmM2IDEwMDY0NAotLS0gYS9zcmMvZWRpdGZucy5jCisrKyBiL3Ny Yy9lZGl0Zm5zLmMKQEAgLTI4MDUsOCArMjgwNSwxMCBAQCBkZXRlcm1pbmVzIHdoZXRoZXIgY2Fz ZSBpcyBzaWduaWZpY2FudCBvciBpZ25vcmVkLiAgKi8pCiAgIHJlZ2lzdGVyIEVNQUNTX0lOVCBi ZWdwMSwgZW5kcDEsIGJlZ3AyLCBlbmRwMiwgdGVtcDsKICAgcmVnaXN0ZXIgc3RydWN0IGJ1ZmZl ciAqYnAxLCAqYnAyOwogICByZWdpc3RlciBMaXNwX09iamVjdCB0cnQKLSAgICA9ICghTklMUCAo QlZBUiAoY3VycmVudF9idWZmZXIsIGNhc2VfZm9sZF9zZWFyY2gpKQotICAgICAgID8gQlZBUiAo Y3VycmVudF9idWZmZXIsIGNhc2VfY2Fub25fdGFibGUpIDogUW5pbCk7CisgICAgPSAoIU5JTFAg KEJWQVIgKGN1cnJlbnRfYnVmZmVyLCBncm91cF9mb2xkX3NlYXJjaCkpCisgICAgICAgPyBCVkFS IChjdXJyZW50X2J1ZmZlciwgZ3JvdXBfY2Fub25fdGFibGUpIDoKKyAgICAgICAoIU5JTFAgKEJW QVIgKGN1cnJlbnRfYnVmZmVyLCBjYXNlX2ZvbGRfc2VhcmNoKSkKKyAgICAgICAgPyBCVkFSIChj dXJyZW50X2J1ZmZlciwgY2FzZV9jYW5vbl90YWJsZSkgOiBRbmlsKSk7CiAgIHB0cmRpZmZfdCBj aGFycyA9IDA7CiAgIHB0cmRpZmZfdCBpMSwgaTIsIGkxX2J5dGUsIGkyX2J5dGU7CiAKZGlmZiAt LWdpdCBhL3NyYy9zZWFyY2guYyBiL3NyYy9zZWFyY2guYwppbmRleCBlOTYxNzk4Li4wMzdmNDA5 IDEwMDY0NAotLS0gYS9zcmMvc2VhcmNoLmMKKysrIGIvc3JjL3NlYXJjaC5jCkBAIC0yODEsOCAr MjgxLDEwIEBAIGxvb2tpbmdfYXRfMSAoTGlzcF9PYmplY3Qgc3RyaW5nLCBib29sIHBvc2l4KQog ICBidWZwID0gY29tcGlsZV9wYXR0ZXJuIChzdHJpbmcsCiAJCQkgIChOSUxQIChWaW5oaWJpdF9j aGFuZ2luZ19tYXRjaF9kYXRhKQogCQkJICAgPyAmc2VhcmNoX3JlZ3MgOiBOVUxMKSwKLQkJCSAg KCFOSUxQIChCVkFSIChjdXJyZW50X2J1ZmZlciwgY2FzZV9mb2xkX3NlYXJjaCkpCi0JCQkgICA/ IEJWQVIgKGN1cnJlbnRfYnVmZmVyLCBjYXNlX2Nhbm9uX3RhYmxlKSA6IFFuaWwpLAorCQkJICAo IU5JTFAgKEJWQVIgKGN1cnJlbnRfYnVmZmVyLCBncm91cF9mb2xkX3NlYXJjaCkpCisJCQkgICA/ IEJWQVIgKGN1cnJlbnRfYnVmZmVyLCBncm91cF9jYW5vbl90YWJsZSkgOgorICAgICAgICAgICAg ICAgICAgICAgICAgICAgKCFOSUxQIChCVkFSIChjdXJyZW50X2J1ZmZlciwgY2FzZV9mb2xkX3Nl YXJjaCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBCVkFSIChjdXJyZW50X2J1ZmZl ciwgY2FzZV9jYW5vbl90YWJsZSkgOiBRbmlsKSksCiAJCQkgIHBvc2l4LAogCQkJICAhTklMUCAo QlZBUiAoY3VycmVudF9idWZmZXIsIGVuYWJsZV9tdWx0aWJ5dGVfY2hhcmFjdGVycykpKTsKIApA QCAtMzk2LDggKzM5OCwxMCBAQCBzdHJpbmdfbWF0Y2hfMSAoTGlzcF9PYmplY3QgcmVnZXhwLCBM aXNwX09iamVjdCBzdHJpbmcsIExpc3BfT2JqZWN0IHN0YXJ0LAogICBidWZwID0gY29tcGlsZV9w YXR0ZXJuIChyZWdleHAsCiAJCQkgIChOSUxQIChWaW5oaWJpdF9jaGFuZ2luZ19tYXRjaF9kYXRh KQogCQkJICAgPyAmc2VhcmNoX3JlZ3MgOiBOVUxMKSwKLQkJCSAgKCFOSUxQIChCVkFSIChjdXJy ZW50X2J1ZmZlciwgY2FzZV9mb2xkX3NlYXJjaCkpCi0JCQkgICA/IEJWQVIgKGN1cnJlbnRfYnVm ZmVyLCBjYXNlX2Nhbm9uX3RhYmxlKSA6IFFuaWwpLAorCQkJICAoIU5JTFAgKEJWQVIgKGN1cnJl bnRfYnVmZmVyLCBncm91cF9mb2xkX3NlYXJjaCkpCisJCQkgICA/IEJWQVIgKGN1cnJlbnRfYnVm ZmVyLCBncm91cF9jYW5vbl90YWJsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFO SUxQIChCVkFSIChjdXJyZW50X2J1ZmZlciwgY2FzZV9mb2xkX3NlYXJjaCkpCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgPyBCVkFSIChjdXJyZW50X2J1ZmZlciwgY2FzZV9jYW5vbl90YWJs ZSkgOiBRbmlsKSksCiAJCQkgIHBvc2l4LAogCQkJICBTVFJJTkdfTVVMVElCWVRFIChzdHJpbmcp KTsKICAgaW1tZWRpYXRlX3F1aXQgPSAxOwpAQCAtMTA1MiwxMiArMTA1NiwxNSBAQCBzZWFyY2hf Y29tbWFuZCAoTGlzcF9PYmplY3Qgc3RyaW5nLCBMaXNwX09iamVjdCBib3VuZCwgTGlzcF9PYmpl Y3Qgbm9lcnJvciwKIAkJCSBCVkFSIChjdXJyZW50X2J1ZmZlciwgY2FzZV9lcXZfdGFibGUpKTsK IAogICBucCA9IHNlYXJjaF9idWZmZXIgKHN0cmluZywgUFQsIFBUX0JZVEUsIGxpbSwgbGltX2J5 dGUsIG4sIFJFLAotCQkgICAgICAoIU5JTFAgKEJWQVIgKGN1cnJlbnRfYnVmZmVyLCBjYXNlX2Zv bGRfc2VhcmNoKSkKLQkJICAgICAgID8gQlZBUiAoY3VycmVudF9idWZmZXIsIGNhc2VfY2Fub25f dGFibGUpCi0JCSAgICAgICA6IFFuaWwpLAotCQkgICAgICAoIU5JTFAgKEJWQVIgKGN1cnJlbnRf YnVmZmVyLCBjYXNlX2ZvbGRfc2VhcmNoKSkKLQkJICAgICAgID8gQlZBUiAoY3VycmVudF9idWZm ZXIsIGNhc2VfZXF2X3RhYmxlKQotCQkgICAgICAgOiBRbmlsKSwKKyAgICAgICAgICAgICAgICAg ICAgICAoIU5JTFAgKEJWQVIgKGN1cnJlbnRfYnVmZmVyLCBncm91cF9mb2xkX3NlYXJjaCkpCisg ICAgICAgICAgICAgICAgICAgICAgID8gQlZBUiAoY3VycmVudF9idWZmZXIsIGdyb3VwX2Nhbm9u X3RhYmxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICghTklMUCAoQlZBUiAoY3VycmVudF9i dWZmZXIsIGNhc2VfZm9sZF9zZWFyY2gpKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBCVkFS IChjdXJyZW50X2J1ZmZlciwgY2FzZV9jYW5vbl90YWJsZSkgOiBRbmlsKSksCisgICAgICAgICAg ICAgICAgICAgICAgKCFOSUxQIChCVkFSIChjdXJyZW50X2J1ZmZlciwgZ3JvdXBfZm9sZF9zZWFy Y2gpKQorICAgICAgICAgICAgICAgICAgICAgICA/IFFuaWwgOgorICAgICAgICAgICAgICAgICAg ICAgICAoIU5JTFAgKEJWQVIgKGN1cnJlbnRfYnVmZmVyLCBjYXNlX2ZvbGRfc2VhcmNoKSkKKyAg ICAgICAgICAgICAgICAgICAgICAgID8gQlZBUiAoY3VycmVudF9idWZmZXIsIGNhc2VfZXF2X3Rh YmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBRbmlsKSksCiAJCSAgICAgIHBvc2l4KTsK ICAgaWYgKG5wIDw9IDApCiAgICAgewotLSAKMi4yLjIKCg== --001a113d5b7c14faa2050e6b0e21 Content-Type: text/x-patch; charset=UTF-8; name="group-folding-with-regexp-lisp.patch" Content-Disposition: attachment; filename="group-folding-with-regexp-lisp.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i5tifuw42 RnJvbSBmNjdhZTdlZDUzZTZhOTBjZjRmOTdhYzFiYmE5NDk4YjVkNThlNmRjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBcnR1ciBNYWxhYmFyYmEgPGJydWNlLmNvbm5vci5hbUBnbWFp bC5jb20+CkRhdGU6IFR1ZSwgMjcgSmFuIDIwMTUgMTQ6MDg6MDEgLTAyMDAKU3ViamVjdDogW1BB VENIXSAoaXNlYXJjaC1zZWFyY2gtZnVuLWRlZmF1bHQpOiBJbXBsZW1lbnQgZ3JvdXAgZm9sZGlu ZyBpbgogaXNlYXJjaC4KClVzZSBgaXNlYXJjaC1mb2xkLWdyb3VwcycsIGBpc2VhcmNoLWdyb3Vw cy1hbGlzdCcsIGFuZApgaXNlYXJjaC0tcmVwbGFjZS1ncm91cHMtaW4tc3RyaW5nJy4KLS0tCiBs aXNwL2lzZWFyY2guZWwgfCAzNyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr CiAxIGZpbGUgY2hhbmdlZCwgMzcgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL2xpc3AvaXNl YXJjaC5lbCBiL2xpc3AvaXNlYXJjaC5lbAppbmRleCA5OWNhNzNmLi5hY2NmYjcyIDEwMDY0NAot LS0gYS9saXNwL2lzZWFyY2guZWwKKysrIGIvbGlzcC9pc2VhcmNoLmVsCkBAIC01OCw2ICs1OCw3 IEBACiA7OzsgQ29kZToKIAogKGV2YWwtd2hlbi1jb21waWxlIChyZXF1aXJlICdjbC1saWIpKQor KGV2YWwtd2hlbi1jb21waWxlIChyZXF1aXJlICdzdWJyLXgpKQogDAogOzsgU29tZSBhZGRpdGlv bmFsIG9wdGlvbnMgYW5kIGNvbnN0YW50cy4KIApAQCAtMjcyLDYgKzI3MywyMyBAQCBEZWZhdWx0 IHZhbHVlLCBuaWwsIG1lYW5zIGVkaXQgdGhlIHN0cmluZyBpbnN0ZWFkLiIKICAgOnZlcnNpb24g IjIzLjEiCiAgIDpncm91cCAnaXNlYXJjaCkKIAorKGRlZmN1c3RvbSBpc2VhcmNoLWZvbGQtZ3Jv dXBzIHQKKyAgIldoZXRoZXIgcmVndWxhciBpc2VhcmNoIHNob3VsZCBkbyBncm91cCBmb2xkaW5n LgorVGhpcyBtZWFucyBzb21lIGNoYXJhY3RlcnMgd2lsbCBtYXRjaCBlbnRpcmUgZ3JvdXBzIG9m IGNoYXJhY3RlcywKK3N1Y2ggYXMgXCIgbWF0Y2hpbmcg4oCdLCBmb3IgaW5zdGFuY2UuIgorICA6 dHlwZSAnYm9vbGVhbgorICA6Z3JvdXAgJ2lzZWFyY2gKKyAgOnZlcnNpb24gIjI1LjEiKQorCiso ZGVmdmFyIGlzZWFyY2gtZ3JvdXBzLWFsaXN0CisgIDs7IEZJWE1FOiBBZGQgYWxsIHRoZSBsYXRp biBhY2NlbnRlZCBsZXR0ZXJzIGxpa2Ugw4MuCisgICcoKD9cIiAuICJbXCLvvILigJzigJ3igJ3i gJ7iuYLjgJ7igJ/igJ/inZ7inZ3inaDigJzigJ7jgJ3jgJ/wn5m38J+ZtvCfmbjina7ina/Cq8K7 4oC54oC686CAol0iKQorICAgICg/JyAuICJbYCfinZ/inZvinZzigJjigJnigJnigJrigJvigJvi gJrigJjzoICi4p2u4p2vwqvCu+KAueKAul0iKQorICAgIDs7IGBpc2VhcmNoLWZvbGQtZ3JvdXBz JyBkb2Vzbid0IGludGVyYWN0IHdpdGgKKyAgICA7OyBgaXNlYXJjaC1sYXgtd2hpdGVzcGFjZScg eWV0LiAgU28gd2UgbmVlZCB0byBhZGQgdGhpcyBoZXJlLgorICAgICg/XHMgLiAiWyAJXHJcbl0r IikpCisgICJBbGlzdCBvZiBncm91cHMgdG8gdXNlIHdoZW4gYGlzZWFyY2gtZm9sZC1ncm91cHMn IGlzIG5vbi1uaWwuIikKKwogKGRlZmN1c3RvbSBpc2VhcmNoLWxhenktaGlnaGxpZ2h0IHQKICAg IkNvbnRyb2xzIHRoZSBsYXp5LWhpZ2hsaWdodGluZyBkdXJpbmcgaW5jcmVtZW50YWwgc2VhcmNo LgogV2hlbiBub24tbmlsLCBhbGwgdGV4dCBpbiB0aGUgYnVmZmVyIG1hdGNoaW5nIHRoZSBjdXJy ZW50IHNlYXJjaApAQCAtMjU2NSw2ICsyNTgzLDE4IEBAIHNlYXJjaCBmb3IgdGhlIGZpcnN0IG9j Y3VycmVuY2Ugb2YgU1RSSU5HIG9yIGl0cyB0cmFuc2xhdGlvbi4iKQogQ2FuIGJlIGNoYW5nZWQg dmlhIGBpc2VhcmNoLXNlYXJjaC1mdW4tZnVuY3Rpb24nIGZvciBzcGVjaWFsIG5lZWRzLiIKICAg KGZ1bmNhbGwgKG9yIGlzZWFyY2gtc2VhcmNoLWZ1bi1mdW5jdGlvbiAnaXNlYXJjaC1zZWFyY2gt ZnVuLWRlZmF1bHQpKSkKIAorKGRlZnVuIGlzZWFyY2gtLXJlcGxhY2UtZ3JvdXBzLWluLXN0cmlu ZyAoc3RyaW5nKQorICAiUmV0dXJuIGEgZ3JvdXAtZm9sZGVkIHJlZ2V4cCB2ZXJzaW9uIG9mIFNU UklORy4KK0FueSBjaGFyYWN0ZXIgdGhhdCBoYXMgYW4gZW50cnkgaW4gYGlzZWFyY2gtZ3JvdXBz LWFsaXN0JyBpcworcmVwbGFjZWQgd2l0aCB0aGUgY2RyIG9mIHRoYXQgZW50cnkgKHdoaWNoIHNo b3VsZCBiZSBhIHJlZ2V4cCkuCitPdGhlciBjaGFyYWN0ZXJzIGFyZSBgcmVnZXhwLXF1b3RlJ2Qu IgorICAoYXBwbHkgIydjb25jYXQKKyAgICAobWFwY2FyIChsYW1iZGEgKGMpCisgICAgICAgICAg ICAgIChpZi1sZXQgKChlbnRyeSAoYXNzcSBjIGlzZWFyY2gtZ3JvdXBzLWFsaXN0KSkpCisgICAg ICAgICAgICAgICAgICAoY2RyIGVudHJ5KQorICAgICAgICAgICAgICAgIChyZWdleHAtcXVvdGUg KHN0cmluZyBjKSkpKQorICAgICAgc3RyaW5nKSkpCisKIChkZWZ1biBpc2VhcmNoLXNlYXJjaC1m dW4tZGVmYXVsdCAoKQogICAiUmV0dXJuIGRlZmF1bHQgZnVuY3Rpb25zIHRvIHVzZSBmb3IgdGhl IHNlYXJjaC4iCiAgIChjb25kCkBAIC0yNTkxLDYgKzI2MjEsMTMgQEAgQ2FuIGJlIGNoYW5nZWQg dmlhIGBpc2VhcmNoLXNlYXJjaC1mdW4tZnVuY3Rpb24nIGZvciBzcGVjaWFsIG5lZWRzLiIKICAg ICAgICdyZS1zZWFyY2gtYmFja3dhcmQtbGF4LXdoaXRlc3BhY2UpKQogICAgKGlzZWFyY2gtcmVn ZXhwCiAgICAgKGlmIGlzZWFyY2gtZm9yd2FyZCAncmUtc2VhcmNoLWZvcndhcmQgJ3JlLXNlYXJj aC1iYWNrd2FyZCkpCisgICA7OyBgaXNlYXJjaC1yZWdleHAnIGlzIGVzc2VudGlhbGx5IGEgc3Vw ZXJzZXQgb2YKKyAgIDs7IGBpc2VhcmNoLWZvbGQtZ3JvdXBzJy4gIFNvIGZvbGQtZ3JvdXBzIGNv bWVzIGFmdGVyIGl0LgorICAgKGlzZWFyY2gtZm9sZC1ncm91cHMKKyAgICAobGFtYmRhIChzdHJp bmcgJm9wdGlvbmFsIGJvdW5kIG5vZXJyb3IgY291bnQpCisgICAgICAoZnVuY2FsbCAoaWYgaXNl YXJjaC1mb3J3YXJkICMncmUtc2VhcmNoLWZvcndhcmQgIydyZS1zZWFyY2gtYmFja3dhcmQpCisg ICAgICAgIChpc2VhcmNoLS1yZXBsYWNlLWdyb3Vwcy1pbi1zdHJpbmcgc3RyaW5nKQorICAgICAg ICBib3VuZCBub2Vycm9yIGNvdW50KSkpCiAgICAoKGFuZCBpc2VhcmNoLWxheC13aGl0ZXNwYWNl IHNlYXJjaC13aGl0ZXNwYWNlLXJlZ2V4cCkKICAgICAoaWYgaXNlYXJjaC1mb3J3YXJkCiAJJ3Nl YXJjaC1mb3J3YXJkLWxheC13aGl0ZXNwYWNlCi0tIAoyLjIuMgoK --001a113d5b7c14faa2050e6b0e21 Content-Type: text/x-patch; charset=UTF-8; name="group-folding-with-case-table-lisp.patch" Content-Disposition: attachment; filename="group-folding-with-case-table-lisp.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i5tkatq12 RnJvbSA4ZjRiZTI3ZGNhNzE0YjE2ODQxNDE3MWJkZTNlZWVlOWZlZmM0NGU5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBcnR1ciBNYWxhYmFyYmEgPGJydWNlLmNvbm5vci5hbUBnbWFp bC5jb20+CkRhdGU6IFR1ZSwgMjcgSmFuIDIwMTUgMTQ6MDg6MDEgLTAyMDAKU3ViamVjdDogW1BB VENIXSAoaXNlYXJjaC1zZWFyY2gtZnVuLWRlZmF1bHQpOiBJbXBsZW1lbnQgZ3JvdXAgZm9sZGlu ZyBpbgogaXNlYXJjaC4KCihpc2VhcmNoLWZvbGQtZ3JvdXBzIGdyb3VwLWZvbGQtdGFibGUpOiBO ZXcgdmFyaWFibGVzLgoKV2hlbiBgaXNlYXJjaC1mb2xkLWdyb3VwcycgaXMgbm9uLW5pbCBgZ3Jv dXAtZm9sZC10YWJsZScgaXMgdXNlZCBhcyB0aGUKY2FzZSB0YWJsZS4KLS0tCiBsaXNwL2lzZWFy Y2guZWwgfCAzOCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMSBmaWxl IGNoYW5nZWQsIDM4IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9saXNwL2lzZWFyY2guZWwg Yi9saXNwL2lzZWFyY2guZWwKaW5kZXggOTljYTczZi4uN2Q1NjhkZCAxMDA2NDQKLS0tIGEvbGlz cC9pc2VhcmNoLmVsCisrKyBiL2xpc3AvaXNlYXJjaC5lbApAQCAtMjcyLDYgKzI3MiwzOCBAQCBE ZWZhdWx0IHZhbHVlLCBuaWwsIG1lYW5zIGVkaXQgdGhlIHN0cmluZyBpbnN0ZWFkLiIKICAgOnZl cnNpb24gIjIzLjEiCiAgIDpncm91cCAnaXNlYXJjaCkKIAorKGRlZmN1c3RvbSBpc2VhcmNoLWZv bGQtZ3JvdXBzIHQKKyAgIldoZXRoZXIgcmVndWxhciBpc2VhcmNoIHNob3VsZCBkbyBncm91cCBm b2xkaW5nLgorVGhpcyBtZWFucyBzb21lIGNoYXJhY3RlcnMgd2lsbCBtYXRjaCBlbnRpcmUgZ3Jv dXBzIG9mIGNoYXJhY3RlcywKK3N1Y2ggYXMgXCIgbWF0Y2hpbmcg4oCdLCBmb3IgaW5zdGFuY2Uu IgorICA6dHlwZSAnYm9vbGVhbgorICA6Z3JvdXAgJ2lzZWFyY2gKKyAgOnZlcnNpb24gIjI1LjEi KQorCisoZGVmdmFyIGdyb3VwLWZvbGQtdGFibGUKKyAgKGV2YWwtd2hlbi1jb21waWxlCisgICAg KGxldCAoKHRhYmxlIChtYWtlLWNoYXItdGFibGUgJ2Nhc2UtdGFibGUpKQorICAgICAgICAgIChl cSAobWFrZS1jaGFyLXRhYmxlICdlcXVpdikpKQorICAgICAgKHJlcXVpcmUgJ3N1YnIteCkKKyAg ICAgIDs7IEJ1aWxkIHRoZSBncm91cCB0YWJsZS4KKyAgICAgIChkb3RpbWVzIChpIChsZW5ndGgg ZXEpKQorICAgICAgICAod2hlbi1sZXQgKChkIChnZXQtY2hhci1jb2RlLXByb3BlcnR5IGkgJ2Rl Y29tcG9zaXRpb24pKQorICAgICAgICAgICAgICAgICAgIChrIChjYXItc2FmZSBkKSkpCisgICAg ICAgICAgKHVubGVzcyAoZXEgaSBrKQorICAgICAgICAgICAgKGFzZXQgZXEgaSAoaWYgKGNoYXJh Y3RlcnAgaykgayAoY2FkciBkKSkpKSkpCisgICAgICA7OyBQdXQgaXQgaW4gdGhlIHJpZ2h0IHBs YWNlLgorICAgICAgKHNldC1jaGFyLXRhYmxlLWV4dHJhLXNsb3QgdGFibGUgMSBlcSkKKyAgICAg IHRhYmxlKSkKKyAgIlVzZWQgZm9yIGZvbGRpbmcgY2hhcmFjdGVycyBvZiB0aGUgc2FtZSBncm91 cCBkdXJpbmcgc2VhcmNoLiIpCisKKyhkZWZtYWNybyB3aXRoLWdyb3VwLWZvbGRpbmcgKCZyZXN0 IGJvZHkpCisgICJFeGVjdXRlIEJPRFkgd2l0aCBjaGFyYWN0ZXItZ3JvdXAgZm9sZGluZyB0dXJu ZWQgb24uCitUaGlzIHNldHMgYGdyb3VwLWZvbGQtdGFibGUnIGFzIHRoZSBjYXNlLXRhYmxlIGR1 cmluZyB0aGUKK2V4ZWN1dGlvbiBvZiBCT0RZLiIKKyAgYChsZXQgKChjYXNlLWZvbGQtc2VhcmNo IHQpKQorICAgICAod2l0aC1jYXNlLXRhYmxlIGdyb3VwLWZvbGQtdGFibGUKKyAgICAgICAsQGJv ZHkpKSkKKwogKGRlZmN1c3RvbSBpc2VhcmNoLWxhenktaGlnaGxpZ2h0IHQKICAgIkNvbnRyb2xz IHRoZSBsYXp5LWhpZ2hsaWdodGluZyBkdXJpbmcgaW5jcmVtZW50YWwgc2VhcmNoLgogV2hlbiBu b24tbmlsLCBhbGwgdGV4dCBpbiB0aGUgYnVmZmVyIG1hdGNoaW5nIHRoZSBjdXJyZW50IHNlYXJj aApAQCAtMjU2OCw2ICsyNjAwLDEyIEBAIENhbiBiZSBjaGFuZ2VkIHZpYSBgaXNlYXJjaC1zZWFy Y2gtZnVuLWZ1bmN0aW9uJyBmb3Igc3BlY2lhbCBuZWVkcy4iCiAoZGVmdW4gaXNlYXJjaC1zZWFy Y2gtZnVuLWRlZmF1bHQgKCkKICAgIlJldHVybiBkZWZhdWx0IGZ1bmN0aW9ucyB0byB1c2UgZm9y IHRoZSBzZWFyY2guIgogICAoY29uZAorICAgKGlzZWFyY2gtZm9sZC1ncm91cHMKKyAgICAobGFt YmRhICgmcmVzdCBhcmdzKQorICAgICAgKGxldCogKChpc2VhcmNoLWZvbGQtZ3JvdXBzIG5pbCkK KyAgICAgICAgICAgICAoZnVuY3Rpb24gKGlzZWFyY2gtc2VhcmNoLWZ1bi1kZWZhdWx0KSkpCisg ICAgICAgICh3aXRoLWdyb3VwLWZvbGRpbmcKKyAgICAgICAgIChhcHBseSBmdW5jdGlvbiBhcmdz KSkpKSkKICAgIChpc2VhcmNoLXdvcmQKICAgICAobGFtYmRhIChzdHJpbmcgJm9wdGlvbmFsIGJv dW5kIG5vZXJyb3IgY291bnQpCiAgICAgICA7OyBVc2UgbGF4IHZlcnNpb25zIHRvIG5vdCBmYWls IGF0IHRoZSBlbmQgb2YgdGhlIHdvcmQgd2hpbGUKLS0gCjIuMi4yCgo= --001a113d5b7c14faa2050e6b0e21--