From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: thunk2@arcor.de (Thomas Plass) Newsgroups: gmane.emacs.bugs Subject: bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling Date: Mon, 4 Feb 2019 12:48:11 +0100 Message-ID: <23640.9851.562972.730234@AGAME7.local> Reply-To: Thomas Plass Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="MUVMw9xUVK" Content-Transfer-Encoding: 7bit Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="197234"; mail-complaints-to="usenet@blaine.gmane.org" To: 34315@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Feb 04 16:37:46 2019 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gqgJe-000p8j-9p for geb-bug-gnu-emacs@m.gmane.org; Mon, 04 Feb 2019 16:37:46 +0100 Original-Received: from localhost ([127.0.0.1]:44776 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gqgJd-0008Nt-BK for geb-bug-gnu-emacs@m.gmane.org; Mon, 04 Feb 2019 10:37:45 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:34410) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gqgH5-0006oU-09 for bug-gnu-emacs@gnu.org; Mon, 04 Feb 2019 10:35:08 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gqgH4-0001YM-4K for bug-gnu-emacs@gnu.org; Mon, 04 Feb 2019 10:35:06 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:60325) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gqgH4-0001YC-0H for bug-gnu-emacs@gnu.org; Mon, 04 Feb 2019 10:35:06 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1gqgH3-0000av-Qo for bug-gnu-emacs@gnu.org; Mon, 04 Feb 2019 10:35:05 -0500 X-Loop: help-debbugs@gnu.org Resent-From: thunk2@arcor.de (Thomas Plass) Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 04 Feb 2019 15:35:03 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 34315 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.15492944882209 (code B ref -1); Mon, 04 Feb 2019 15:35:03 +0000 Original-Received: (at submit) by debbugs.gnu.org; 4 Feb 2019 15:34:48 +0000 Original-Received: from localhost ([127.0.0.1]:59596 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gqgGl-0000ZT-SU for submit@debbugs.gnu.org; Mon, 04 Feb 2019 10:34:48 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:42094) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gqcjy-0001OO-71 for submit@debbugs.gnu.org; Mon, 04 Feb 2019 06:48:42 -0500 Original-Received: from lists.gnu.org ([209.51.188.17]:60198) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gqcjs-0005eJ-U2 for submit@debbugs.gnu.org; Mon, 04 Feb 2019 06:48:36 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:56445) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gqcjr-0007Tu-GT for bug-gnu-emacs@gnu.org; Mon, 04 Feb 2019 06:48:36 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gqcjo-0005aT-RH for bug-gnu-emacs@gnu.org; Mon, 04 Feb 2019 06:48:34 -0500 Original-Received: from vsmx012.vodafonemail.xion.oxcs.net ([153.92.174.90]:45323) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gqcjl-0005UH-2f for bug-gnu-emacs@gnu.org; Mon, 04 Feb 2019 06:48:30 -0500 Original-Received: from vsmx004.vodafonemail.xion.oxcs.net (unknown [192.168.75.198]) by mta-8-out.mta.xion.oxcs.net (Postfix) with ESMTP id 623E8F34B23; Mon, 4 Feb 2019 11:48:23 +0000 (UTC) Original-Received: from agame7.arcor.de (unknown [2.205.23.198]) by mta-8-out.mta.xion.oxcs.net (Postfix) with ESMTPA id D5B6819AD9A; Mon, 4 Feb 2019 11:48:18 +0000 (UTC) X-VADE-STATUS: LEGIT X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Mailman-Approved-At: Mon, 04 Feb 2019 10:34:39 -0500 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:155079 Archived-At: --MUVMw9xUVK Content-Type: text/plain; charset=us-ascii Content-Description: message body text Content-Transfer-Encoding: 7bit The attached patch contains a fix for what looks like a clerical error in icalendar--decode-isoduration(), test case: P1DT2H. But the real point of this post is to propose a few improvements to handling timezones. I use icalendar.el as a library for dealing with raw VCALENDAR data. Also, I'm on Windows where the OS makes Emacs' timezone handling a bit tricky. Meaning that, unless precautions are taken, datetime conversions by icalendar.el sometimes are incorrect, in particular around DST transitions. Changes in the patch: - add an optional argument to icalendar--decode-isodatetime() which is passed to decode-time(). So, both encode-time() and decode-time() get to have their respective timezones which makes datetime conversions predictable. I know, I could do a (setenv "TZ" (icalendar--convert-tz-offset ...)) before I call icalendar--decode-isodatetime() but that + restoring the environment variable afterwards looks clumsy. - handle RDATE in icalendar--convert-tz-offset() in a rudimentary fashion. RDATE handling is required for those VTIMEZONEs that do not specify RRULE, otherwise there will be no datetime conversions at all. - identify the latest oberservance for DAYLIGHT and STANDARD specifications within one VTIMEZONE, again supporting RDATE. As is, icalendar.el handles multiple such specifications indiscriminately, resulting in conversions that may be relative to a date centuries in the past. The relevance of this change is this: when a VCALENDAR does not contain a VTIMEZONE section or e.g. the popular nonstandard X-WR-TIMEZONE property, my application goes and fetches one from a tzdata database such as tzurl.org. Standard tzurl.org responses contain lots of historical records. Yes, tzurl.org also returns "Outlook-style" VTIMEZONEs which icalendar.el is quite happy with but that doesn't help me with complex VTIMEZONEs contained in incoming VCALENDARs. The patch is not a --git diff. Is that tolerable at all? Best regards Thomas --MUVMw9xUVK Content-Type: application/x-diff; name="icalendar.el.patch" Content-Disposition: attachment; filename="icalendar.el.patch" Content-Transfer-Encoding: base64 LS0tIGljYWxlbmRhci5lbC5vcmlnCTIwMTktMDEtMDcgMTk6NDQ6MDYuOTc1ODgxMjAwICswMTAw CisrKyBpY2FsZW5kYXIuZWwJMjAxOS0wMS0zMSAxNDowNjozNy42MzI0MjI5MDAgKzAxMDAKQEAg LTUyMyw5ICs1MjMsMTAgQEAKICAgKGxldCogKChvZmZzZXR0byAoY2FyIChjZGRyIChhc3NxICdU Wk9GRlNFVFRPIGFsaXN0KSkpKQogCSAob2Zmc2V0ZnJvbSAoY2FyIChjZGRyIChhc3NxICdUWk9G RlNFVEZST00gYWxpc3QpKSkpCiAJIChycnVsZS12YWx1ZSAoY2FyIChjZGRyIChhc3NxICdSUlVM RSBhbGlzdCkpKSkKKyAgICAgICAgIChyZGF0ZS1wIChhbmQgKGFzc3EgJ1JEQVRFIGFsaXN0KSB0 KSkKIAkgKGR0c3RhcnQgKGNhciAoY2RkciAoYXNzcSAnRFRTVEFSVCBhbGlzdCkpKSkKLQkgKG5v LWRzdCAoZXF1YWwgb2Zmc2V0dG8gb2Zmc2V0ZnJvbSkpKQotICAgIDs7IEZJWE1FOiBmb3Igbm93 IHdlIG9ubHkgaGFuZGxlIFJSVUxFIGFuZCBub3QgUkRBVEUgaGVyZS4KKwkgKG5vLWRzdCAob3Ig cmRhdGUtcCAoZXF1YWwgb2Zmc2V0dG8gb2Zmc2V0ZnJvbSkpKSkKKyAgICA7OyBGSVhNRTogdGhl IHByZXNlbmNlIG9mIGFuIFJEQVRFIGlzIGFzc3VtZWQgdG8gZGVub3RlIHRoZSBmaXJzdCBkYXkg b2YgdGhlIHllYXIKICAgICAod2hlbiAoYW5kIG9mZnNldHRvIGR0c3RhcnQgKG9yIHJydWxlLXZh bHVlIG5vLWRzdCkpCiAgICAgICAobGV0KiAoKHJydWxlIChpY2FsZW5kYXItLXNwbGl0LXZhbHVl IHJydWxlLXZhbHVlKSkKIAkgICAgIChmcmVxIChjYWRyIChhc3NxICdGUkVRIHJydWxlKSkpCkBA IC01NjksMTIgKzU3MCwxMyBAQAogCiAoZGVmdW4gaWNhbGVuZGFyLS1wYXJzZS12dGltZXpvbmUg KGFsaXN0KQogICAiVHVybiBhIFZUSU1FWk9ORSBBTElTVCBpbnRvIGEgY29ucyAoSUQgLiBUWi1T VFJJTkcpLgorQ29uc2lkZXIgb25seSB0aGUgbW9zdCByZWNlbnQgZGF0ZSBzcGVjaWZpY2F0aW9u LgogUmV0dXJuIG5pbCBpZiB0aW1lem9uZSBjYW5ub3QgYmUgcGFyc2VkLiIKICAgKGxldCogKCh0 ei1pZCAoaWNhbGVuZGFyLS1jb252ZXJ0LXN0cmluZy1mb3ItaW1wb3J0CiAgICAgICAgICAgICAg ICAgIChpY2FsZW5kYXItLWdldC1ldmVudC1wcm9wZXJ0eSBhbGlzdCAnVFpJRCkpKQotCSAoZGF5 bGlnaHQgKGNhZHIgKGNkYXIgKGljYWxlbmRhci0tZ2V0LWNoaWxkcmVuIGFsaXN0ICdEQVlMSUdI VCkpKSkKKwkgKGRheWxpZ2h0IChjYWRyIChjZGFyIChpY2FsZW5kYXItLWdldC1tb3N0LXJlY2Vu dC1vYnNlcnZhbmNlIGFsaXN0ICdEQVlMSUdIVCkpKSkKIAkgKGRheSAoYW5kIGRheWxpZ2h0IChp Y2FsZW5kYXItLWNvbnZlcnQtdHotb2Zmc2V0IGRheWxpZ2h0IHQpKSkKLQkgKHN0YW5kYXJkIChj YWRyIChjZGFyIChpY2FsZW5kYXItLWdldC1jaGlsZHJlbiBhbGlzdCAnU1RBTkRBUkQpKSkpCisJ IChzdGFuZGFyZCAoY2FkciAoY2RhciAoaWNhbGVuZGFyLS1nZXQtbW9zdC1yZWNlbnQtb2JzZXJ2 YW5jZSBhbGlzdCAnU1RBTkRBUkQpKSkpCiAJIChzdGQgKGFuZCBzdGFuZGFyZCAoaWNhbGVuZGFy LS1jb252ZXJ0LXR6LW9mZnNldCBzdGFuZGFyZCBuaWwpKSkpCiAgICAgKGlmIChhbmQgdHotaWQg c3RkKQogCShjb25zIHR6LWlkCkBAIC01ODMsNiArNTg1LDI5IEBACiAJCQkgICIsIiAoY2RyIGRh eSkgIiwiIChjZHIgc3RkKSkKIAkJKGNhciBzdGQpKSkpKSkKIAorKGRlZnVuIGljYWxlbmRhci0t Z2V0LW1vc3QtcmVjZW50LW9ic2VydmFuY2UgKGFsaXN0IHN1Yi1jb21wKQorICAiUmV0dXJuIHRo ZSBsYXRlc3Qgb2JzZXJ2YW5jZSBmb3IgU1VCLUNPTVAgREFZTElHSFQgb3IgU1RBTkRBUkQuCitB TElTVCBpcyBhIFZUSU1FWk9ORSBwb3RlbnRpYWxseSBjb250YWluaW5nIGhpc3RvcmljYWwgcmVj b3Jkcy4iCis7RklYTUU/OiAibW9zdCByZWNlbnQiIHNob3VsZCBiZSByZWxhdGl2ZSB0byBhIGdp dmVuIGRhdGUKKyAgKGxldCAoKGNvbXBvbmVudHMgKGljYWxlbmRhci0tZ2V0LWNoaWxkcmVuIGFs aXN0IHN1Yi1jb21wKSkpCisgICAgKGxpc3QKKyAgICAgKGNhcgorICAgICAgKHNvcnQgY29tcG9u ZW50cworICAgICAgICAgICAgIycobGFtYmRhIChhIGIpCisgICAgICAgICAgICAgICAgKGxldCog KChnZXQtcmVjZW50IChsYW1iZGEgKG4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKGNhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmV2ZXJz ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvcnQKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVscSBuaWwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwY2FyIChsYW1iZGEgKHApCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQg KG1lbXEgKGNhciBwKSAnKERUU1RBUlQgUkRBVEUpKQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIgKGNkZHIgcCkpKSkKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4pKQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmctbGVzc3ApKSkp KQorICAgICAgICAgICAgICAgICAgICAgICAoYS1yZWNlbnQgKGZ1bmNhbGwgZ2V0LXJlY2VudCAo Y2FyIChjZGRyIGEpKSkpCisgICAgICAgICAgICAgICAgICAgICAgIChiLXJlY2VudCAoZnVuY2Fs bCBnZXQtcmVjZW50IChjYXIgKGNkZHIgYikpKSkpCisgICAgICAgICAgICAgICAgICAoc3RyaW5n LWxlc3NwIGItcmVjZW50IGEtcmVjZW50KSkpKSkpKSkKKwogKGRlZnVuIGljYWxlbmRhci0tY29u dmVydC1hbGwtdGltZXpvbmVzIChpY2FsZW5kYXIpCiAgICJDb252ZXJ0IGFsbCB0aW1lem9uZXMg aW4gdGhlIElDQUxFTkRBUiBpbnRvIGFuIGFsaXN0LgogRWFjaCBlbGVtZW50IG9mIHRoZSBhbGlz dCBpcyBhIGNvbnMgKElEIC4gVFotU1RSSU5HKSwKQEAgLTYwMiwxNSArNjI3LDE4IEBACiAJKGNk ciAoYXNzb2MgaWQgem9uZS1tYXApKSkpKQogCiAoZGVmdW4gaWNhbGVuZGFyLS1kZWNvZGUtaXNv ZGF0ZXRpbWUgKGlzb2RhdGV0aW1lc3RyaW5nICZvcHRpb25hbCBkYXktc2hpZnQKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9uZSkKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291 cmNlLXpvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzdWx0LXpvbmUpCiAgICJSZXR1cm4gSVNPREFURVRJTUVTVFJJTkcgaW4gZm9y bWF0IGxpa2UgYGRlY29kZS10aW1lJy4KIENvbnZlcnRzIGZyb20gSVNPLTg2MDEgdG8gRW1hY3Mg cmVwcmVzZW50YXRpb24uICBJZgogSVNPREFURVRJTUVTVFJJTkcgc3BlY2lmaWVzIFVUQyB0aW1l ICh0cmFpbGluZyBsZXR0ZXIgWikgdGhlCiBkZWNvZGVkIHRpbWUgaXMgZ2l2ZW4gaW4gdGhlIGxv Y2FsIHRpbWUgem9uZSEgIElmIG9wdGlvbmFsCiBwYXJhbWV0ZXIgREFZLVNISUZUIGlzIG5vbi1u aWwgdGhlIHJlc3VsdCBpcyBzaGlmdGVkIGJ5IERBWS1TSElGVAogZGF5cy4KLVpPTkUsIGlmIHBy b3ZpZGVkLCBpcyB0aGUgdGltZXpvbmUsIGluIGFueSBmb3JtYXQgdW5kZXJzdG9vZCBieSBgZW5j b2RlLXRpbWUnLgotCitTT1VSQ0UtWk9ORSwgaWYgcHJvdmlkZWQsIGlzIHRoZSB0aW1lem9uZSBm b3IgZGVjb2RpbmcgdGhlIHRpbWUsCitpbiBhbnkgZm9ybWF0IHVuZGVyc3Rvb2QgYnkgYGVuY29k ZS10aW1lJy4KK1JFU1VMVC1aT05FLCBpZiBwcm92aWRlZCwgaXMgdGhlIHRpbWV6b25lIGZvciBl bmNvZGluZyB0aGUgcmVzdWx0CitpbiBhbnkgZm9ybWF0IHVuZGVyc3Rvb2QgYnkgYGRlY29kZS10 aW1lJy4KIEZJWE1FOiBtdWx0aXBsZSBjb21tYS1zZXBhcmF0ZWQgdmFsdWVzIHNob3VsZCBiZSBh bGxvd2VkISIKICAgKGljYWxlbmRhci0tZG1zZyBpc29kYXRldGltZXN0cmluZykKICAgKGlmIGlz b2RhdGV0aW1lc3RyaW5nCkBAIC02MzEsNyArNjU5LDggQEAKICAgICAgICAgKHdoZW4gKGFuZCAo PiAobGVuZ3RoIGlzb2RhdGV0aW1lc3RyaW5nKSAxNSkKICAgICAgICAgICAgICAgICAgICA7OyBV VEMgc3BlY2lmaWVyIHByZXNlbnQKICAgICAgICAgICAgICAgICAgICAoY2hhci1lcXVhbCA/WiAo YXJlZiBpc29kYXRldGltZXN0cmluZyAxNSkpKQotICAgICAgICAgIChzZXRxIHpvbmUgdCkpCisg ICAgICAgICAgKHNldHEgc291cmNlLXpvbmUgdAorICAgICAgICAgICAgICAgIHJlc3VsdC16b25l IHQpKQogICAgICAgICA7OyBzaGlmdCBpZiBuZWNlc3NhcnkKICAgICAgICAgKGlmIGRheS1zaGlm dAogICAgICAgICAgICAgKGxldCAoKG1keSAoY2FsZW5kYXItZ3JlZ29yaWFuLWZyb20tYWJzb2x1 dGUKQEAgLTY0Miw5ICs2NzEsOCBAQAogICAgICAgICAgICAgICAoc2V0cSBkYXkgICAobnRoIDEg bWR5KSkKICAgICAgICAgICAgICAgKHNldHEgeWVhciAgKG50aCAyIG1keSkpKSkKICAgICAgICAg OzsgY3JlYXRlIHRoZSBkZWNvZGVkIGRhdGUtdGltZQotICAgICAgICA7OyBGSVhNRSE/IQogICAg ICAgICAoY29uZGl0aW9uLWNhc2UgbmlsCi0gICAgICAgICAgICAoZGVjb2RlLXRpbWUgKGVuY29k ZS10aW1lIHNlY29uZCBtaW51dGUgaG91ciBkYXkgbW9udGggeWVhciB6b25lKSkKKyAgICAgICAg ICAgIChkZWNvZGUtdGltZSAoZW5jb2RlLXRpbWUgc2Vjb25kIG1pbnV0ZSBob3VyIGRheSBtb250 aCB5ZWFyIHNvdXJjZS16b25lKSByZXN1bHQtem9uZSkKICAgICAgICAgICAoZXJyb3IKICAgICAg ICAgICAgKG1lc3NhZ2UgIkNhbm5vdCBkZWNvZGUgXCIlc1wiIiBpc29kYXRldGltZXN0cmluZykK ICAgICAgICAgICAgOzsgaG9wZSBmb3IgdGhlIGJlc3QuLi4KQEAgLTY5MCw5ICs3MTgsOSBAQAog ICAgICAgICAgICAgICAoc2V0cSBkYXlzICgxLSBkYXlzKSkpKQogICAgICAgICAgICAoKG1hdGNo LWJlZ2lubmluZyA0KSAgICAgICAgIDtkYXlzIGFuZCB0aW1lCiAgICAgICAgICAgICAoaWYgKG1h dGNoLWJlZ2lubmluZyA1KQotICAgICAgICAgICAgICAgIChzZXRxIGRheXMgKCogNyAocmVhZCAo c3Vic3RyaW5nIGlzb2R1cmF0aW9uc3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKG1hdGNoLWJlZ2lubmluZyA2KQotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1lbmQgNikpKSkpKQorICAg ICAgICAgICAgICAgIChzZXRxIGRheXMgKHJlYWQgKHN1YnN0cmluZyBpc29kdXJhdGlvbnN0cmlu ZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtYmVn aW5uaW5nIDYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICht YXRjaC1lbmQgNikpKSkpCiAgICAgICAgICAgICAoaWYgKG1hdGNoLWJlZ2lubmluZyA3KQogICAg ICAgICAgICAgICAgIChzZXRxIGhvdXJzIChyZWFkIChzdWJzdHJpbmcgaXNvZHVyYXRpb25zdHJp bmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1i ZWdpbm5pbmcgOCkK --MUVMw9xUVK--