From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matt Price Subject: Re: overlay showing computed value of macro? Date: Fri, 23 Nov 2018 04:08:05 -0500 Message-ID: References: Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="000000000000ab2971057b5150c4" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:54020) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gQ7RJ-0003Iy-U9 for emacs-orgmode@gnu.org; Fri, 23 Nov 2018 04:07:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gQ7RI-0007cw-4Q for emacs-orgmode@gnu.org; Fri, 23 Nov 2018 04:07:53 -0500 Received: from mail-it1-x12c.google.com ([2607:f8b0:4864:20::12c]:55712) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gQ7RH-0007C8-Ok for emacs-orgmode@gnu.org; Fri, 23 Nov 2018 04:07:52 -0500 Received: by mail-it1-x12c.google.com with SMTP id o19so17445567itg.5 for ; Fri, 23 Nov 2018 01:07:40 -0800 (PST) In-Reply-To: List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: emacs-orgmode@gnu.org --000000000000ab2971057b5150c4 Content-Type: text/plain; charset="UTF-8" OH man, I know this is a lot of replies to my own thread. Sorry for the noise. I just wanted to point out something I somehow failed to see as I was pretending to cook Thanksgiving dinner while working on this project (!!) -- my code does just fine producing overlays, which might be useful to some people, but it does not really help with my own need, which is to calculate timestamp values based on the position of the macro call in the buffer. That's because I'm using a function that searches backwards for previous timestames, and the overlays are of course *not part of the buffer string*, so they don't get picked up by regexp-search-backward. To fix this I replaced my original function with a group of functions that searches the buffer string *and* the overlays, looking for a timestamp regep. For the overlays, I endedu p writing a recursive function cause I oculdn't think howelse to do it. This is all much more verbose than my original function and I think pretty inelegant but I would be interested to hear what others htink. Here's the original function, which doesn't look for overlays: (defun get-ts+7 (&optional weekly-times) "Return a string of the form <%Y-%m-d %a> where the date elements are 7 days later than the (n - WEEKLY-TIMES timestamp) in the buffer. That is, if WEEKLY-TIMES is nil or 1, return a date one week later than the *PREVIOUS* timestamp. If WEEKLY-TIMES is 2, return a time one week later than the *SECOND-TO-LAST* timestamp above the previous location. If there are not enough timestamps, right now it returns the last found timestamp. " (interactive) (setq weekly-times (or weekly-times 1)) (defun ts-search () (save-match-data (goto-char (re-search-backward (org-re-timestamp 'all) nil t)) (let ((thismatch (match-string 0))) (message "match: %s" thismatch) thismatch))) (let* (r (base-date (save-excursion (cl-dotimes (time weekly-times r) (condition-case nil (progn (setq r (or (ts-search) r)) (message "r is %s" r)) (error (message "Drat, there were %s timestamps, using the last one I found." (if (= 0 time) "no" time)) (return r)))))) (result nil)) (message "base-time is %s" base-date) (if base-date (format-time-string "<%Y-%m-%d %a>" (time-add (date-to-time base-date) (days-to-time (1+ 7)))) "NO PREVIOUS TIMESTAMP") )) ------------------------- and here are the several functions I felt I needed to solve the problem of searching in 2 dimmensions: (defun ts-search-both () (save-match-data (let* ((bufts (save-match-data (set-match-data nil) (save-excursion (re-search-backward (org-re-timestamp 'all) nil t) (if (match-beginning 0) `(,(match-beginning 0) ,(match-string 0)) nil)))) (ovts (save-match-data (save-excursion (ts-search-ov))))) (cond ((and bufts ovts) (if (> (car bufts) (car ovts)) (goto-char (car bufts)) (cadr bufts) (cadr ovts))) (bufts (goto-char (car bufts)) (cadr bufts)) (ovts (goto-char (car ovts)) (cadr ovts)) (t (goto-char (point-min)) nil) ) ))) (defun ts-search-ov () (let* ((ovend (previous-single-char-property-change (point) 'macro-ov-p)) (ovs (overlays-at ovend)) (m (cl-loop for o in ovs if (string-match (org-re-timestamp 'all) (overlay-get o 'before-string)) ;;(goto-char (overlay-start o)) return (match-string 0 (overlay-get o 'before-string))))) (cond (m `(,(point) ,m)) ((>= (point-min) ovend ) (goto-char ovend) nil) (t (goto-char ovend) (ts-search-ov)) ))) (defun get-ts+7-inc-ov (&optional weekly-times) "Return a string of the form <%Y-%m-d %a> where the date elements are 7 days later than the (n - WEEKLY-TIMES timestamp) in the buffer. That is, if WEEKLY-TIMES is nil or 1, return a date one week later than the *PREVIOUS* timestamp. If WEEKLY-TIMES is 2, return a time one week later than the *SECOND-TO-LAST* timestamp above the previous location. If there are not enough timestamps, right now it returns the last found timestamp. " (interactive) (setq weekly-times (or weekly-times 1)) (let* (r (base-date (save-excursion (cl-dotimes (time weekly-times r) (condition-case nil (let ((s (ts-search-both))) (if s (setq r s) (message "Drat, there were %s timestamps, using the last one I found." (if (= 0 time) "no" time)) (return r))) ;; (error ;; (message "Drat, there were %s timestamps, using the last one I found." ;; (if (= 0 time) "no" time)) ;; (return r)) )))) (result nil)) (message "base-time is %s" base-date) (if base-date (format-time-string "<%Y-%m-%d %a>" (time-add (date-to-time base-date) (days-to-time (1+ 7)))) "NO PREVIOUS TIMESTAMP") )) ------------------------------- I'd be interested in feedback if others have some interest i nthe problem. --000000000000ab2971057b5150c4 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdj5PSCBtYW4sIEkga25vdyB0aGlzIGlz IGEgbG90IG9mIHJlcGxpZXMgdG8gbXkgb3duIHRocmVhZC7CoCBTb3JyeSBmb3IgdGhlIG5vaXNl LiBJIGp1c3Qgd2FudGVkIHRvIHBvaW50IG91dCBzb21ldGhpbmcgSSBzb21laG93IGZhaWxlZCB0 byBzZWUgYXMgSSB3YXMgcHJldGVuZGluZyB0byBjb29rIFRoYW5rc2dpdmluZyBkaW5uZXIgd2hp bGUgd29ya2luZyBvbiB0aGlzIHByb2plY3QgKCEhKSAtLSBteSBjb2RlIGRvZXMganVzdCBmaW5l IHByb2R1Y2luZyBvdmVybGF5cywgd2hpY2ggbWlnaHQgYmUgdXNlZnVsIHRvIHNvbWUgcGVvcGxl LCBidXQgaXQgZG9lcyBub3QgcmVhbGx5IGhlbHAgd2l0aCBteSBvd24gbmVlZCwgd2hpY2ggaXMg dG8gY2FsY3VsYXRlIHRpbWVzdGFtcCB2YWx1ZXMgYmFzZWQgb24gdGhlIHBvc2l0aW9uIG9mIHRo ZSBtYWNybyBjYWxsIGluIHRoZSBidWZmZXIuwqAgVGhhdCYjMzk7cyBiZWNhdXNlIEkmIzM5O20g dXNpbmcgYSBmdW5jdGlvbiB0aGF0IHNlYXJjaGVzIGJhY2t3YXJkcyBmb3IgcHJldmlvdXMgdGlt ZXN0YW1lcywgYW5kIHRoZSBvdmVybGF5cyBhcmUgb2YgY291cnNlICpub3QgcGFydCBvZiB0aGUg YnVmZmVyIHN0cmluZyosIHNvIHRoZXkgZG9uJiMzOTt0IGdldCBwaWNrZWQgdXAgYnkgcmVnZXhw LXNlYXJjaC1iYWNrd2FyZC7CoCA8YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UbyBmaXgg dGhpcyBJIHJlcGxhY2VkIG15IG9yaWdpbmFsIGZ1bmN0aW9uIHdpdGggYSBncm91cCBvZiBmdW5j dGlvbnMgdGhhdCBzZWFyY2hlcyB0aGUgYnVmZmVyIHN0cmluZyAqYW5kKiB0aGUgb3ZlcmxheXMs IGxvb2tpbmcgZm9yIGEgdGltZXN0YW1wIHJlZ2VwLsKgIEZvciB0aGUgb3ZlcmxheXMsIEkgZW5k ZWR1IHAgd3JpdGluZyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiBjYXVzZSBJIG9jdWxkbiYjMzk7dCB0 aGluayBob3dlbHNlIHRvIGRvIGl0LsKgIDxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PlRo aXMgaXMgYWxsIG11Y2ggbW9yZSB2ZXJib3NlIHRoYW4gbXkgb3JpZ2luYWwgZnVuY3Rpb24gYW5k IEkgdGhpbmsgcHJldHR5IGluZWxlZ2FudCBidXQgSSB3b3VsZCBiZSBpbnRlcmVzdGVkIHRvIGhl YXIgd2hhdCBvdGhlcnMgaHRpbmsuwqAgPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SGVy ZSYjMzk7cyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24sIHdoaWNoIGRvZXNuJiMzOTt0IGxvb2sgZm9y IG92ZXJsYXlzOjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+KGRlZnVuIGdldC10cys3ICgmYW1w O29wdGlvbmFsIHdlZWtseS10aW1lcyk8YnI+wqAgJnF1b3Q7UmV0dXJuIGEgc3RyaW5nIG9mIHRo ZSBmb3JtICZsdDslWS0lbS1kICVhJmd0OyB3aGVyZSB0aGUgZGF0ZTxicj5lbGVtZW50cyBhcmUg NyBkYXlzIGxhdGVyIHRoYW4gdGhlIChuIC0gV0VFS0xZLVRJTUVTIHRpbWVzdGFtcCk8YnI+aW4g dGhlIGJ1ZmZlci4gVGhhdCBpcywgaWYgV0VFS0xZLVRJTUVTIGlzIG5pbCBvciAxLCByZXR1cm4g YTxicj5kYXRlIG9uZSB3ZWVrIGxhdGVyIHRoYW4gdGhlICpQUkVWSU9VUyogdGltZXN0YW1wLiBJ Zjxicj5XRUVLTFktVElNRVMgaXMgMiwgcmV0dXJuIGEgdGltZSBvbmUgd2VlayBsYXRlciB0aGFu IHRoZTxicj4qU0VDT05ELVRPLUxBU1QqIHRpbWVzdGFtcCBhYm92ZSB0aGUgcHJldmlvdXMgbG9j YXRpb24uPGJyPjxicj5JZiB0aGVyZSBhcmUgbm90IGVub3VnaCB0aW1lc3RhbXBzLCByaWdodCBu b3cgaXQgcmV0dXJucyB0aGUgbGFzdDxicj5mb3VuZCB0aW1lc3RhbXAuICZxdW90Ozxicj7CoCAo aW50ZXJhY3RpdmUpPGJyPsKgIChzZXRxIHdlZWtseS10aW1lcyAob3Igd2Vla2x5LXRpbWVzIDEp KTxicj7CoCAoZGVmdW4gdHMtc2VhcmNoICgpPGJyPsKgwqDCoCAoc2F2ZS1tYXRjaC1kYXRhIDxi cj7CoMKgwqDCoMKgIChnb3RvLWNoYXIgKHJlLXNlYXJjaC1iYWNrd2FyZDxicj7CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChvcmctcmUtdGltZXN0YW1wICYjMzk7YWxsKSBuaWwg dCkpPGJyPsKgwqDCoMKgwqAgKGxldCAoKHRoaXNtYXRjaMKgIChtYXRjaC1zdHJpbmcgMCkpKTxi cj7CoMKgwqDCoMKgwqDCoCAobWVzc2FnZSAmcXVvdDttYXRjaDogJXMmcXVvdDsgdGhpc21hdGNo KTxicj7CoMKgwqDCoMKgwqDCoCB0aGlzbWF0Y2gpKSk8YnI+wqAgKGxldCogKHI8YnI+wqDCoMKg wqDCoMKgwqDCoCAoYmFzZS1kYXRlIChzYXZlLWV4Y3Vyc2lvbjxicj7CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChjbC1kb3RpbWVzICh0aW1lIHdlZWtseS10aW1lcyBy KTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoY29uZGl0 aW9uLWNhc2UgbmlsPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKHByb2duIChzZXRxwqAgciAob3IgKHRzLXNlYXJjaCkgcikpPGJyPsKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAobWVzc2FnZSAmcXVvdDtyIGlzICVzJnF1b3Q7IHIpKTxicj7CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGVycm9yPGJyPsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChtZXNzYWdlICZxdW90O0RyYXQs IHRoZXJlIHdlcmUgJXMgdGltZXN0YW1wcywgdXNpbmcgdGhlIGxhc3Qgb25lIEkgZm91bmQuJnF1 b3Q7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIChpZiAoPSAwIHRpbWUpICZxdW90O25vJnF1b3Q7IHRpbWUpKTxi cj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAocmV0 dXJuIHIpKSkpKSk8YnI+PGJyPsKgwqDCoMKgwqDCoMKgIChyZXN1bHQgbmlsKSk8YnI+wqDCoMKg IChtZXNzYWdlICZxdW90O2Jhc2UtdGltZSBpcyAlcyZxdW90OyBiYXNlLWRhdGUpPGJyPsKgwqDC oCAoaWYgYmFzZS1kYXRlPGJyPsKgwqDCoMKgwqDCoMKgIChmb3JtYXQtdGltZS1zdHJpbmcgJnF1 b3Q7Jmx0OyVZLSVtLSVkICVhJmd0OyZxdW90Ozxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHRpbWUtYWRkPGJyPsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChkYXRlLXRvLXRpbWUg YmFzZS1kYXRlKSAoZGF5cy10by10aW1lICgxKyA3KSkpKTxicj7CoMKgwqDCoMKgICZxdW90O05P IFBSRVZJT1VTIFRJTUVTVEFNUCZxdW90OykgKSk8YnI+PC9kaXY+PGRpdj4tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5hbmQgaGVyZSBhcmUgdGhlIHNl dmVyYWwgZnVuY3Rpb25zIEkgZmVsdCBJIG5lZWRlZCB0byBzb2x2ZSB0aGUgcHJvYmxlbSBvZiBz ZWFyY2hpbmcgaW4gMiBkaW1tZW5zaW9uczo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj48 L2Rpdj48ZGl2PihkZWZ1biB0cy1zZWFyY2gtYm90aCAoKTxicj7CoCAoc2F2ZS1tYXRjaC1kYXRh PGJyPsKgwqDCoCAobGV0KiAoKGJ1ZnRzPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHNhdmUt bWF0Y2gtZGF0YTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoc2V0LW1hdGNoLWRhdGEg bmlsKTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoc2F2ZS1leGN1cnNpb24gPGJyPsKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAocmUtc2VhcmNoLWJhY2t3YXJkPGJyPsKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChvcmctcmUtdGltZXN0YW1wICYjMzk7YWxsKSBu aWwgdCk8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChpZiAobWF0Y2gtYmVnaW5u aW5nIDApPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGAoLChtYXRj aC1iZWdpbm5pbmcgMCkgLChtYXRjaC1zdHJpbmcgMCkpPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgbmlsKSkpKTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoCAob3Z0cyAoc2F2 ZS1tYXRjaC1kYXRhIChzYXZlLWV4Y3Vyc2lvbsKgICh0cy1zZWFyY2gtb3YpKSkpKTxicj7CoMKg wqDCoMKgIChjb25kPGJyPsKgwqDCoMKgwqDCoCAoKGFuZCBidWZ0cyBvdnRzKTxicj7CoMKgwqDC oMKgwqDCoCAoaWYgKCZndDsgKGNhciBidWZ0cykgKGNhciBvdnRzKSk8YnI+wqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAoZ290by1jaGFyIChjYXIgYnVmdHMpKTxicj7CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIChjYWRyIGJ1ZnRzKTxicj7CoMKgwqDCoMKgwqDCoMKgwqAgKGNhZHIgb3Z0cykpKTxicj7C oMKgwqDCoMKgwqAgKGJ1ZnRzPGJyPsKgwqDCoMKgwqDCoMKgIChnb3RvLWNoYXIgKGNhciBidWZ0 cykpPGJyPsKgwqDCoMKgwqDCoMKgIChjYWRyIGJ1ZnRzKSk8YnI+wqDCoMKgwqDCoMKgIChvdnRz PGJyPsKgwqDCoMKgwqDCoMKgIChnb3RvLWNoYXIgKGNhciBvdnRzKSk8YnI+wqDCoMKgwqDCoMKg wqAgKGNhZHIgb3Z0cykpPGJyPsKgwqDCoMKgwqDCoCAodDxicj7CoMKgwqDCoMKgwqDCoCAoZ290 by1jaGFyIChwb2ludC1taW4pKSBuaWwpPGJyPsKgwqDCoMKgwqDCoCApPGJyPsKgwqDCoMKgwqAg KSkpPGJyPjxicj4oZGVmdW4gdHMtc2VhcmNoLW92ICgpPGJyPsKgIChsZXQqICgob3ZlbmTCoMKg IChwcmV2aW91cy1zaW5nbGUtY2hhci1wcm9wZXJ0eS1jaGFuZ2UgKHBvaW50KSAmIzM5O21hY3Jv LW92LXApKTxicj7CoMKgwqDCoMKgwqDCoMKgIChvdnMgKG92ZXJsYXlzLWF0IG92ZW5kKSk8YnI+ wqDCoMKgwqDCoMKgwqDCoCAobcKgIChjbC1sb29wIGZvciBvIGluIG92czxicj7CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHN0cmluZy1tYXRjaCAob3JnLXJl LXRpbWVzdGFtcCAmIzM5O2FsbCkgKG92ZXJsYXktZ2V0IG8gJiMzOTtiZWZvcmUtc3RyaW5nKSk8 YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDs7KGdvdG8tY2hh ciAob3ZlcmxheS1zdGFydCBvKSk8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHJldHVybiAobWF0Y2gtc3RyaW5nIDAgKG92ZXJsYXktZ2V0IG8gJiMzOTtiZWZv cmUtc3RyaW5nKSkpKSk8YnI+wqDCoMKgIChjb25kPGJyPsKgwqDCoMKgIChtIGAoLChwb2ludCkg LG0pKTxicj7CoMKgwqDCoCAoKCZndDs9IChwb2ludC1taW4pIG92ZW5kICk8YnI+wqDCoMKgwqDC oCAoZ290by1jaGFyIG92ZW5kKTxicj7CoMKgwqDCoMKgIG5pbCk8YnI+wqDCoMKgwqAgKHQ8YnI+ wqDCoMKgwqDCoCAoZ290by1jaGFyIG92ZW5kKTxicj7CoMKgwqDCoMKgICh0cy1zZWFyY2gtb3Yp KTxicj7CoMKgwqDCoMKgICkpKTxicj48YnI+KGRlZnVuIGdldC10cys3LWluYy1vdiAoJmFtcDtv cHRpb25hbCB3ZWVrbHktdGltZXMpPGJyPsKgICZxdW90O1JldHVybiBhIHN0cmluZyBvZiB0aGUg Zm9ybSAmbHQ7JVktJW0tZCAlYSZndDsgd2hlcmUgdGhlIGRhdGU8YnI+ZWxlbWVudHMgYXJlIDcg ZGF5cyBsYXRlciB0aGFuIHRoZSAobiAtIFdFRUtMWS1USU1FUyB0aW1lc3RhbXApPGJyPmluIHRo ZSBidWZmZXIuIFRoYXQgaXMsIGlmIFdFRUtMWS1USU1FUyBpcyBuaWwgb3IgMSwgcmV0dXJuIGE8 YnI+ZGF0ZSBvbmUgd2VlayBsYXRlciB0aGFuIHRoZSAqUFJFVklPVVMqIHRpbWVzdGFtcC4gSWY8 YnI+V0VFS0xZLVRJTUVTIGlzIDIsIHJldHVybiBhIHRpbWUgb25lIHdlZWsgbGF0ZXIgdGhhbiB0 aGU8YnI+KlNFQ09ORC1UTy1MQVNUKiB0aW1lc3RhbXAgYWJvdmUgdGhlIHByZXZpb3VzIGxvY2F0 aW9uLjxicj48YnI+SWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggdGltZXN0YW1wcywgcmlnaHQgbm93 IGl0IHJldHVybnMgdGhlIGxhc3Q8YnI+Zm91bmQgdGltZXN0YW1wLiAmcXVvdDs8YnI+wqAgKGlu dGVyYWN0aXZlKTxicj7CoCAoc2V0cSB3ZWVrbHktdGltZXMgKG9yIHdlZWtseS10aW1lcyAxKSk8 YnI+wqAgPGJyPsKgIChsZXQqIChyPGJyPsKgwqDCoMKgwqDCoMKgwqAgKGJhc2UtZGF0ZSAoc2F2 ZS1leGN1cnNpb248YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAo Y2wtZG90aW1lcyAodGltZSB3ZWVrbHktdGltZXMgcik8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGNvbmRpdGlvbi1jYXNlIG5pbDxicj7CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChsZXQgKChzICh0cy1z ZWFyY2gtYm90aCkpKTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAoaWYgczxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChzZXRxIHIgcyk8YnI+wqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChtZXNz YWdlICZxdW90O0RyYXQsIHRoZXJlIHdlcmUgJXMgdGltZXN0YW1wcywgdXNpbmcgdGhlIGxhc3Qg b25lIEkgZm91bmQuJnF1b3Q7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoaWYgKD0gMCB0aW1l KSAmcXVvdDtubyZxdW90OyB0aW1lKSk8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChyZXR1cm4gcikpKTxicj7CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgPGJyPsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA7OyAoZXJyb3I8YnI+wqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDs7wqAgKG1lc3NhZ2UgJnF1 b3Q7RHJhdCwgdGhlcmUgd2VyZSAlcyB0aW1lc3RhbXBzLCB1c2luZyB0aGUgbGFzdCBvbmUgSSBm b3VuZC4mcXVvdDs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIDs7wqDCoMKgwqDCoMKgwqDCoMKgwqAgKGlmICg9IDAgdGltZSkgJnF1b3Q7bm8mcXVv dDsgdGltZSkpPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCA7O8KgIChyZXR1cm4gcikpPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCApKSkpPGJyPjxicj7CoMKgwqDCoMKgwqDCoCAocmVzdWx0IG5pbCkp PGJyPsKgwqDCoCAobWVzc2FnZSAmcXVvdDtiYXNlLXRpbWUgaXMgJXMmcXVvdDsgYmFzZS1kYXRl KTxicj7CoMKgwqAgKGlmIGJhc2UtZGF0ZTxicj7CoMKgwqDCoMKgwqDCoCAoZm9ybWF0LXRpbWUt c3RyaW5nICZxdW90OyZsdDslWS0lbS0lZCAlYSZndDsmcXVvdDs8YnI+wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh0aW1lLWFkZDxicj7CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoZGF0 ZS10by10aW1lIGJhc2UtZGF0ZSkgKGRheXMtdG8tdGltZSAoMSsgNykpKSk8YnI+wqDCoMKgwqDC oCAmcXVvdDtOTyBQUkVWSU9VUyBUSU1FU1RBTVAmcXVvdDspICkpPGJyPjxicj48L2Rpdj48ZGl2 Pjxicj48L2Rpdj48ZGl2Pi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L2Rpdj48ZGl2 Pjxicj48L2Rpdj48ZGl2PkkmIzM5O2QgYmUgaW50ZXJlc3RlZCBpbiBmZWVkYmFjayBpZiBvdGhl cnMgaGF2ZSBzb21lIGludGVyZXN0IGkgbnRoZSBwcm9ibGVtLiA8YnI+PC9kaXY+PGRpdj48YnI+ PC9kaXY+PC9kaXY+PGJyPjwvZGl2Pg0K --000000000000ab2971057b5150c4--