From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Leo Stein Newsgroups: gmane.emacs.auctex.devel,gmane.emacs.devel Subject: Adding a feature to ffap (find-file-at-point) in LaTeX-mode Date: Fri, 29 Nov 2024 22:09:03 -0600 Message-ID: Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="000000000000c284020628197a09" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="30472"; mail-complaints-to="usenet@ciao.gmane.io" To: auctex-devel@gnu.org, emacs-devel@gnu.org Original-X-From: auctex-devel-bounces+gead-auctex-devel=m.gmane-mx.org@gnu.org Sat Nov 30 05:09:35 2024 Return-path: Envelope-to: gead-auctex-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1tHEnW-0007pD-BZ for gead-auctex-devel@m.gmane-mx.org; Sat, 30 Nov 2024 05:09:34 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tHEnM-0002v2-MU; Fri, 29 Nov 2024 23:09:24 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tHEnL-0002up-LD; Fri, 29 Nov 2024 23:09:23 -0500 Original-Received: from mail-yw1-x1135.google.com ([2607:f8b0:4864:20::1135]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tHEnJ-0001gB-QF; Fri, 29 Nov 2024 23:09:23 -0500 Original-Received: by mail-yw1-x1135.google.com with SMTP id 00721157ae682-6ef0c64d75cso27187617b3.2; Fri, 29 Nov 2024 20:09:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1732939759; x=1733544559; darn=gnu.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=AdJJCKciX5GGg5Ru+6RqYE4qvq/Dn36IB1QvfFc0iYY=; b=NjcsB1rEcX+vLw8Cmo6S1vE/gH86vNTBYbBQqYKjgzXGGEuaaVLsCbn1ntBqV75hQo ukE4PTl1Zq/mRB12xguHUAzRexDsnwyjnOOkaZ2IAzpPb8otpu1/k8WhVRn7Nb8kgh85 mVDQmFTlcXppNZ942uO+llxUJOnQmwPndBsygmtRuYDav+nsFS0bJiKIh+JQ/HLVnZaT shC+X5m0Yg1J71xMoA7t2gRBJLRZ+YQe4PtW4i7K79mjblwEZwYkITKHrmOrIc6X2cyt CnUBdiWKmcDa2Mdg2r2oKaSgIRFHJ0kyoFG711RCn16dG7uvF0uJwrnu6i19Q/mNBqnR 2jRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732939759; x=1733544559; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=AdJJCKciX5GGg5Ru+6RqYE4qvq/Dn36IB1QvfFc0iYY=; b=JPnYXbRbDc4kVubXniwnYARqST/obh1JZgfKmlRFamQ9G4mLb+PTj3IORQ4D7gumYk LwkG+0FX8hRyKvR5y+wQOzR6+oJDOW1qd4+AUzzaapylvSBdbm6KAnlCbhQlkYxZ04c5 Jjh9kKuZIQCtRFhxDA46F/Jo6rns32fdi4zNHUIIUdFbDwxa0tn6Sh2+wxysGhZfvHqu fFGOm2IDGUY4rGVxGa6zKmq7CFdjSIQXP5n1Eti25a9av/gWo/93LbwoWyiplAMf3T1A BQLQinh/WfZM3T/1ceH3utBTbsz/mbjQGGN94BI+adA6nLptS3rKZfXd4u5Xa6r/YbAQ qzVQ== X-Forwarded-Encrypted: i=1; AJvYcCXzcoiy6A5v/SWyjOYhKk8n8Nscbuxgu20LC87TJoh11+3j0KRZ4Mpcm2DnkQusLEhndHRCQ6GgO7hcsw==@gnu.org X-Gm-Message-State: AOJu0YzYHPbXqCkWBL6NytNm9tY2wvD2/7mXKPaq190gduaX7ZMQl+Kf xW39G5Qpc58zapEjRrNi2hok++eJdQ9ugc2gHADpLAElcyV0QlvR0kg/B11JKFCc5qp6IVgiYlj doC0Ew1wbPzhwiTVGA6OruQqvS7IvakCQ X-Gm-Gg: ASbGncvEMpLk6NuX5glExaEbW7I15tO7zlWT6lSOBkyFJKSK2GxSk/73zeOkps3a9kr FRkPfozAcckWB2gDJvgVyUT1ZwifEIQ0= X-Google-Smtp-Source: AGHT+IEQVkTtrB6JvRraMve4mp5XoNIhoQ3g65EANXwh8VJ2lDDqNnNSmhMapWv/oqJKvSPffGPlHPEvrA6/KJgKCVw= X-Received: by 2002:a05:690c:9c08:b0:6ef:4ed2:7dfe with SMTP id 00721157ae682-6ef4ed381ecmr91843767b3.31.1732939759121; Fri, 29 Nov 2024 20:09:19 -0800 (PST) Received-SPF: pass client-ip=2607:f8b0:4864:20::1135; envelope-from=leo.stein@gmail.com; helo=mail-yw1-x1135.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: auctex-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Discussion list for AUCTeX developers List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: auctex-devel-bounces+gead-auctex-devel=m.gmane-mx.org@gnu.org Original-Sender: auctex-devel-bounces+gead-auctex-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.auctex.devel:8043 gmane.emacs.devel:325866 Archived-At: --000000000000c284020628197a09 Content-Type: text/plain; charset="UTF-8" Hi all, I have a feature that I got working with my very rudimentary elisp, and would consider submitting it as a patch, but I suspect it needs some work before it can be accepted (as I said, my elisp is very basic). I would like ffap to parse some extra path info out of my LaTeX buffer, and use that extra path to search for a file within an \input{othertexfile} command. This extra path info is in a form like the \graphicspath command of graphicx, or equivalently the TeX internal macro \input@path. But, there needs to be a separation between the duties of ffap and the duties of any AUCTeX style-specific code. Probably there is a better solution than the following, but here is what I thought of. AUCTeX is responsible for some LaTeX-parse-extra-path function, which can e.g. check the contents of TeX-active-styles and call style-specific functions. Meanwhile ffap-latex-mode needs to be generalized to potentially call such an AUCTeX function, if it exists. Example: (defun ffap-latex-mode (name) > "`ffap' function suitable for latex buffers. > This uses the program kpsewhich if available. In this case, the > variable `ffap-latex-guess-rules' is used for building a filename > out of NAME." > (let ((extra-path (if (fboundp 'LaTeX-parse-extra-path) > (LaTeX-parse-extra-path) > '()))) > (cond ((file-exists-p name) > name) > ((not (executable-find "kpsewhich")) > (ffap-tex-init) > (ffap-locate-file name '(".cls" ".sty" ".tex" "") > (append extra-path ffap-tex-path))) > (t > (let ((curbuf (current-buffer)) > (guess-rules ffap-latex-guess-rules) > (preferred-suffix-rules '(("input" . ".tex") > ("include" . ".tex") > ("usepackage" . ".sty") > ("RequirePackageWithOptions" . > ".sty") > ("RequirePackage" . ".sty") > ("documentclass" . ".cls") > ("documentstyle" . ".cls") > ("LoadClass" . ".cls") > ("LoadClassWithOptions" . > ".cls") > ("bibliography" . ".bib") > ("addbibresource" . "")))) > ;; We now add preferred suffix in front of suffixes. > (when > ;; The condition is essentially: > ;; (assoc (TeX-current-macro) > ;; (mapcar 'car preferred-suffix-rules)) > ;; but (TeX-current-macro) can take time, so we just > ;; check if one of the `car' in preferred-suffix-rules > ;; is found before point on the current line. It > ;; should cover most cases. > (save-excursion > (re-search-backward (regexp-opt > (mapcar 'car > preferred-suffix-rules)) > (line-beginning-position) > t)) > (push (cons "" (cdr (assoc (match-string 0) ; i.e. > "(TeX-current-macro)" > preferred-suffix-rules))) > guess-rules)) > (with-temp-buffer > (let ((process-environment (buffer-local-value > 'process-environment curbuf)) > (exec-path (buffer-local-value 'exec-path curbuf)) > (extra-path-string (mapconcat 'identity extra-path > ":")) > (args (mapcar (lambda (rule) > (concat (car rule) name (cdr rule))) > guess-rules))) > (apply #'call-process "kpsewhich" nil t nil args) > (if (not (string= "" extra-path-string)) > (apply #'call-process "kpsewhich" nil t nil "-path" > extra-path-string args))) > (when (< (point-min) (point-max)) > (buffer-substring (goto-char (point-min)) > (line-end-position))))))))) The function LaTeX-parse-extra-path returns a list of strings, which are used in the two possible search methods (without or with kpsewhich). If using kpsewhich, we have to call it once for searching system default paths (e.g. for installed style or class files), and a second time for searching user's extra paths as parsed out of the their buffer (the call-process is skipped if there are no extra paths). My main question is how this should be made more idiomatic for potential inclusion in ffap.el; and if there is a better way for ffap.el and AUCTeX to cooperate with each other. Thanks in advance, Leo --000000000000c284020628197a09 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+SGkgYWxsLDxkaXY+PGJyPjwvZGl2PjxkaXY+SSBoYXZlIGEgZmVhdHVy ZSB0aGF0IEkgZ290IHdvcmtpbmcgd2l0aCBteSB2ZXJ5IHJ1ZGltZW50YXJ5IGVsaXNwLCBhbmQg d291bGQgY29uc2lkZXIgc3VibWl0dGluZyBpdCBhcyBhIHBhdGNoLCBidXQgSSBzdXNwZWN0IGl0 IG5lZWRzIHNvbWUgd29yayBiZWZvcmUgaXQgY2FuIGJlIGFjY2VwdGVkIChhcyBJIHNhaWQsIG15 IGVsaXNwIGlzIHZlcnkgYmFzaWMpLiBJIHdvdWxkIGxpa2UgZmZhcCB0byBwYXJzZSBzb21lIGV4 dHJhIHBhdGggaW5mbyBvdXQgb2YgbXkgTGFUZVggYnVmZmVyLCBhbmQgdXNlIHRoYXQgZXh0cmEg cGF0aCB0byBzZWFyY2ggZm9yIGEgZmlsZSB3aXRoaW4gYW4gXGlucHV0e290aGVydGV4ZmlsZX0g Y29tbWFuZC4gVGhpcyBleHRyYSBwYXRoIGluZm8gaXMgaW4gYSBmb3JtIGxpa2UgdGhlIFxncmFw aGljc3BhdGggY29tbWFuZCBvZiBncmFwaGljeCwgb3IgZXF1aXZhbGVudGx5IHRoZSBUZVggaW50 ZXJuYWwgbWFjcm8gXGlucHV0QHBhdGguPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5CdXQsIHRo ZXJlIG5lZWRzIHRvIGJlIGEgc2VwYXJhdGlvbiBiZXR3ZWVuIHRoZSBkdXRpZXMgb2YgZmZhcCBh bmQgdGhlIGR1dGllcyBvZiBhbnkgQVVDVGVYIHN0eWxlLXNwZWNpZmljIGNvZGUuIFByb2JhYmx5 IHRoZXJlIGlzIGEgYmV0dGVyIHNvbHV0aW9uIHRoYW4gdGhlIGZvbGxvd2luZywgYnV0IGhlcmUg aXMgd2hhdCBJIHRob3VnaHQgb2YuIEFVQ1RlWCBpcyByZXNwb25zaWJsZSBmb3Igc29tZSBMYVRl WC1wYXJzZS1leHRyYS1wYXRoIGZ1bmN0aW9uLCB3aGljaCBjYW4gZS5nLiBjaGVjayB0aGUgY29u dGVudHMgb2YgVGVYLWFjdGl2ZS1zdHlsZXMgYW5kIGNhbGwgc3R5bGUtc3BlY2lmaWMgZnVuY3Rp b25zLiBNZWFud2hpbGUgZmZhcC1sYXRleC1tb2RlIG5lZWRzIHRvIGJlIGdlbmVyYWxpemVkIHRv IHBvdGVudGlhbGx5IGNhbGwgc3VjaCBhbiBBVUNUZVggZnVuY3Rpb24sIGlmIGl0IGV4aXN0cy4g RXhhbXBsZTo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48YmxvY2txdW90ZSBjbGFzcz0iZ21haWxfcXVv dGUiIHN0eWxlPSJtYXJnaW46MHB4IDBweCAwcHggMC44ZXg7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlk IHJnYigyMDQsMjA0LDIwNCk7cGFkZGluZy1sZWZ0OjFleCI+PGZvbnQgZmFjZT0ibW9ub3NwYWNl Ij4oZGVmdW4gZmZhcC1sYXRleC1tb2RlIChuYW1lKTxicj7CoCAmcXVvdDtgZmZhcCYjMzk7IGZ1 bmN0aW9uIHN1aXRhYmxlIGZvciBsYXRleCBidWZmZXJzLjxicj5UaGlzIHVzZXMgdGhlIHByb2dy YW0ga3BzZXdoaWNoIGlmIGF2YWlsYWJsZS7CoCBJbiB0aGlzIGNhc2UsIHRoZTxicj52YXJpYWJs ZSBgZmZhcC1sYXRleC1ndWVzcy1ydWxlcyYjMzk7IGlzIHVzZWQgZm9yIGJ1aWxkaW5nIGEgZmls ZW5hbWU8YnI+b3V0IG9mIE5BTUUuJnF1b3Q7PGJyPsKgIChsZXQgKChleHRyYS1wYXRoIChpZiAo ZmJvdW5kcCAmIzM5O0xhVGVYLXBhcnNlLWV4dHJhLXBhdGgpPGJyPsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIChMYVRlWC1wYXJzZS1leHRyYS1wYXRoKTxicj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAmIzM5OygpKSkpPGJyPsKgIMKgIChjb25kICgoZmlsZS1l eGlzdHMtcCBuYW1lKTxicj7CoCDCoCDCoCDCoCDCoCDCoG5hbWUpPGJyPsKgIMKgIMKgIMKgIMKg ICgobm90IChleGVjdXRhYmxlLWZpbmQgJnF1b3Q7a3BzZXdoaWNoJnF1b3Q7KSk8YnI+wqAgwqAg wqAgwqAgwqAgwqAoZmZhcC10ZXgtaW5pdCk8YnI+wqAgwqAgwqAgwqAgwqAgwqAoZmZhcC1sb2Nh dGUtZmlsZSBuYW1lICYjMzk7KCZxdW90Oy5jbHMmcXVvdDsgJnF1b3Q7LnN0eSZxdW90OyAmcXVv dDsudGV4JnF1b3Q7ICZxdW90OyZxdW90Oyk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAoYXBwZW5kIGV4dHJhLXBhdGggZmZhcC10ZXgtcGF0aCkpKTxicj7C oCDCoCDCoCDCoCDCoCAodDxicj7CoCDCoCDCoCDCoCDCoCDCoChsZXQgKChjdXJidWYgKGN1cnJl bnQtYnVmZmVyKSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoZ3Vlc3MtcnVsZXMgZmZh cC1sYXRleC1ndWVzcy1ydWxlcyk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAocHJlZmVy cmVkLXN1ZmZpeC1ydWxlcyAmIzM5OygoJnF1b3Q7aW5wdXQmcXVvdDsgLiAmcXVvdDsudGV4JnF1 b3Q7KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCgmcXVvdDtpbmNsdWRlJnF1b3Q7IC4gJnF1b3Q7LnRleCZxdW90Oyk8 YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAoJnF1b3Q7dXNlcGFja2FnZSZxdW90OyAuICZxdW90Oy5zdHkmcXVvdDspPGJy PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgKCZxdW90O1JlcXVpcmVQYWNrYWdlV2l0aE9wdGlvbnMmcXVvdDsgLiAmcXVvdDsu c3R5JnF1b3Q7KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCgmcXVvdDtSZXF1aXJlUGFja2FnZSZxdW90OyAuICZxdW90 Oy5zdHkmcXVvdDspPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKCZxdW90O2RvY3VtZW50Y2xhc3MmcXVvdDsgLiAmcXVv dDsuY2xzJnF1b3Q7KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCgmcXVvdDtkb2N1bWVudHN0eWxlJnF1b3Q7IC4gJnF1 b3Q7LmNscyZxdW90Oyk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoJnF1b3Q7TG9hZENsYXNzJnF1b3Q7IC4gJnF1b3Q7 LmNscyZxdW90Oyk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoJnF1b3Q7TG9hZENsYXNzV2l0aE9wdGlvbnMmcXVvdDsg LiAmcXVvdDsuY2xzJnF1b3Q7KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCgmcXVvdDtiaWJsaW9ncmFwaHkmcXVvdDsg LiAmcXVvdDsuYmliJnF1b3Q7KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCgmcXVvdDthZGRiaWJyZXNvdXJjZSZxdW90 OyAuICZxdW90OyZxdW90OykpKSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqA7OyBXZSBub3cgYWRk IHByZWZlcnJlZCBzdWZmaXggaW4gZnJvbnQgb2Ygc3VmZml4ZXMuPGJyPsKgIMKgIMKgIMKgIMKg IMKgIMKgKHdoZW48YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA7OyBUaGUgY29uZGl0aW9u IGlzIGVzc2VudGlhbGx5Ojxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDs7IChhc3NvYyAo VGVYLWN1cnJlbnQtbWFjcm8pPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOzsgwqAgwqAg wqAgwqAobWFwY2FyICYjMzk7Y2FyIHByZWZlcnJlZC1zdWZmaXgtcnVsZXMpKTxicj7CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoDs7IGJ1dCAoVGVYLWN1cnJlbnQtbWFjcm8pIGNhbiB0YWtlIHRp bWUsIHNvIHdlIGp1c3Q8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA7OyBjaGVjayBpZiBv bmUgb2YgdGhlIGBjYXImIzM5OyBpbiBwcmVmZXJyZWQtc3VmZml4LXJ1bGVzPGJyPsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgOzsgaXMgZm91bmQgYmVmb3JlIHBvaW50IG9uIHRoZSBjdXJyZW50 IGxpbmUuwqAgSXQ8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA7OyBzaG91bGQgY292ZXIg bW9zdCBjYXNlcy48YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoc2F2ZS1leGN1cnNpb248 YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAocmUtc2VhcmNoLWJhY2t3YXJkIChyZWdl eHAtb3B0PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIChtYXBjYXIgJiMzOTtjYXIgcHJlZmVycmVkLXN1ZmZpeC1ydWxlcykpPGJy PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgKGxpbmUtYmVnaW5uaW5nLXBvc2l0aW9uKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHQpKTxicj7CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoChwdXNoIChjb25zICZxdW90OyZxdW90OyAoY2RyIChhc3NvYyAobWF0Y2gtc3RyaW5n IDApIDsgaS5lLiAmcXVvdDsoVGVYLWN1cnJlbnQtbWFjcm8pJnF1b3Q7PGJyPsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHByZWZl cnJlZC1zdWZmaXgtcnVsZXMpKSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBn dWVzcy1ydWxlcykpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgKHdpdGgtdGVtcC1idWZmZXI8YnI+ wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAobGV0ICgocHJvY2Vzcy1lbnZpcm9ubWVudCAoYnVmZmVy LWxvY2FsLXZhbHVlPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICYjMzk7cHJvY2Vzcy1lbnZpcm9ubWVudCBjdXJidWYp KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoZXhlYy1wYXRoIChidWZmZXIt bG9jYWwtdmFsdWUgJiMzOTtleGVjLXBhdGggY3VyYnVmKSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgKGV4dHJhLXBhdGgtc3RyaW5nIChtYXBjb25jYXQgJiMzOTtpZGVudGl0 eSBleHRyYS1wYXRoICZxdW90OzomcXVvdDspKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCAoYXJncyAobWFwY2FyIChsYW1iZGEgKHJ1bGUpPGJyPsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIChjb25jYXQgKGNhciBydWxl KSBuYW1lIChjZHIgcnVsZSkpKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBndWVzcy1ydWxlcykpKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoChhcHBseSAjJiMzOTtjYWxsLXByb2Nlc3MgJnF1b3Q7a3BzZXdoaWNoJnF1b3Q7IG5p bCB0IG5pbCBhcmdzKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChpZiAobm90IChzdHJp bmc9ICZxdW90OyZxdW90OyBleHRyYS1wYXRoLXN0cmluZykpPGJyPsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgKGFwcGx5ICMmIzM5O2NhbGwtcHJvY2VzcyAmcXVvdDtrcHNld2hpY2gm cXVvdDsgbmlsIHQgbmlsICZxdW90Oy1wYXRoJnF1b3Q7IGV4dHJhLXBhdGgtc3RyaW5nIGFyZ3Mp KSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAod2hlbiAoJmx0OyAocG9pbnQtbWluKSAocG9p bnQtbWF4KSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoYnVmZmVyLXN1YnN0cmluZyAo Z290by1jaGFyIChwb2ludC1taW4pKSAobGluZS1lbmQtcG9zaXRpb24pKSkpKSkpKSk8L2ZvbnQ+ PC9ibG9ja3F1b3RlPjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhlIGZ1bmN0aW9uwqBMYVRlWC1wYXJz ZS1leHRyYS1wYXRoIHJldHVybnMgYSBsaXN0IG9mIHN0cmluZ3MsIHdoaWNoIGFyZSB1c2VkIGlu IHRoZSB0d28gcG9zc2libGUgc2VhcmNowqBtZXRob2RzICh3aXRob3V0IG9yIHdpdGgga3BzZXdo aWNoKS4gSWYgdXNpbmcga3BzZXdoaWNoLCB3ZSBoYXZlIHRvIGNhbGwgaXQgb25jZSBmb3Igc2Vh cmNoaW5nIHN5c3RlbSBkZWZhdWx0IHBhdGhzIChlLmcuIGZvciBpbnN0YWxsZWQgc3R5bGUgb3Ig Y2xhc3MgZmlsZXMpLCBhbmQgYSBzZWNvbmQgdGltZSBmb3Igc2VhcmNoaW5nIHVzZXImIzM5O3PC oGV4dHJhIHBhdGhzIGFzIHBhcnNlZCBvdXQgb2YgdGhlIHRoZWlyIGJ1ZmZlciAodGhlIGNhbGwt cHJvY2VzcyBpcyBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyBleHRyYSBwYXRocykuPC9kaXY+PGRp dj48YnI+PC9kaXY+PGRpdj5NeSBtYWluIHF1ZXN0aW9uIGlzIGhvdyB0aGlzIHNob3VsZCBiZSBt YWRlIG1vcmUgaWRpb21hdGljIGZvciBwb3RlbnRpYWwgaW5jbHVzaW9uIGluIGZmYXAuZWw7IGFu ZCBpZiB0aGVyZSBpcyBhIGJldHRlciB3YXkgZm9yIGZmYXAuZWwgYW5kIEFVQ1RlWCB0byBjb29w ZXJhdGUgd2l0aCBlYWNoIG90aGVyLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhhbmtzIGlu IGFkdmFuY2UsPC9kaXY+PGRpdj5MZW88L2Rpdj48L2Rpdj4NCg== --000000000000c284020628197a09--