From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Danie Roux Newsgroups: gmane.emacs.devel Subject: Re: Updated eudcb-mab.el Date: Wed, 18 Feb 2015 21:56:16 +0200 Message-ID: References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1424289919 3904 80.91.229.3 (18 Feb 2015 20:05:19 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 18 Feb 2015 20:05:19 +0000 (UTC) Cc: John Wiegley , emacs-devel@gnu.org To: Thomas Fitzsimmons Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Feb 18 21:05:11 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 1YOArt-0007Xf-Tw for ged-emacs-devel@m.gmane.org; Wed, 18 Feb 2015 21:05:10 +0100 Original-Received: from localhost ([::1]:52694 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YOArs-0003HL-Vc for ged-emacs-devel@m.gmane.org; Wed, 18 Feb 2015 15:05:08 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:45626) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YOArX-0003Gx-MQ for emacs-devel@gnu.org; Wed, 18 Feb 2015 15:04:48 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YOArT-0004m5-JH for emacs-devel@gnu.org; Wed, 18 Feb 2015 15:04:47 -0500 Original-Received: from mail-we0-f179.google.com ([74.125.82.179]:38651) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YOArT-0004le-3i for emacs-devel@gnu.org; Wed, 18 Feb 2015 15:04:43 -0500 Original-Received: by wesw55 with SMTP id w55so3343178wes.5 for ; Wed, 18 Feb 2015 12:04:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=danieroux.com; s=google; h=sender:references:from:to:cc:subject:in-reply-to:date:message-id :mime-version:content-type; bh=G0n0ltWBtD5nVPfE8NJvuOc4sO3p6EbejyJVLNkBIXA=; b=eqbrrkcjp0TJLXLrkWJhxt3s5uXaR36ONPve4Aca9tADB2qeCmVmlvRqD2ulMbLsNC 3tuEh6GO3s7Einh4FR1pnYosgQ13eRf/WwL12pRvwYEElOJ4dUEV18kgkp/VbWu7T5/A yimL/YFk0Tr7D/unySbiE3t+Gu+RDjFPOjWnw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:references:from:to:cc:subject:in-reply-to :date:message-id:mime-version:content-type; bh=G0n0ltWBtD5nVPfE8NJvuOc4sO3p6EbejyJVLNkBIXA=; b=i7P5PXXcYgX+nB6w6JX4Fmzmb9v9tlAtf+M7wHe8XWESQfrPep4ZaCeR9wYmM0odBa eOrGmLLNwbHh3fd7oBVYx7s2TNRFLblYgc8Aso94Uaj1Gjy2mqNfstdXwU77EMc5w8YD GV+3rDC2aBnn8pKher1mrw0oA7vhj1AtHoYQm5GEKTGAuWwkDQKDt5R5sqJ0iwLjDhZJ zAh6Rce/Bh6l+2BPZBPVc5oV4C7l1AM6Zx9Cagn+gyXm3AQh3fpp2vrbrbxGTfvGj4tM Q7hjdtXKbLgcS/WJKBeBOQxiVXBWdVTE8F+jAs7nJq4zR8VYssr2C5bcJQha5OxXMU7p E4oQ== X-Gm-Message-State: ALoCoQkNOUKHE8DN/X8zrMihC7zEKd56wdOaBt64FCy41RYVkk71OudP1/Mg/VkZiraOYlOd+WCu X-Received: by 10.194.71.175 with SMTP id w15mr2135841wju.16.1424289392059; Wed, 18 Feb 2015 11:56:32 -0800 (PST) Original-Received: from danie-notebook.local (196-215-180-60.dynamic.isadsl.co.za. [196.215.180.60]) by mx.google.com with ESMTPSA id dj5sm34097942wjb.28.2015.02.18.11.56.28 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 18 Feb 2015 11:56:31 -0800 (PST) In-reply-to: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 74.125.82.179 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:183270 Archived-At: --=-=-= Content-Type: text/plain Hi Thomas, Please find attached a new version and a sql file. Thomas Fitzsimmons writes: > Danie Roux writes: >> I've updated eudcb-mab.el to directly query the contacts database, >> instead of using an external application. > > It looks like you're still relying on an external application, sqlite3, > instead of "contacts", right? Yes, thank you for picking that up. By external I meant "no additional software". > It probably makes sense to change eudcb-mab in the way you're > suggesting rather than providing a new backend eudcb-mab-sqlite, > right? Yes. > Is this patch backward compatible with the "contacts" format? If not, > do you have a sense for how common the "contacts" format is these > days? Would it make sense to obsolete the contacts format and support > only the sqlite3 format in Emacs 25? That would be my suggestion. I have no feel for how many people use the "contacts" external application. This should be a seamless change because it was never possible to set the location or the format to the "contacts" application >> Please find the changed version attached. > > Are you able to provide a test database file with example data and a > test procedure for using it for completion? That would be a useful > addition. I haven't been able to test the MAB backend myself because I > don't have access to a Mac OS or GNUstep system. Please find attached an anonymized and stripped contacts.sql file to be used: $ sqlite3 /tmp/test-contacts.db < contacts.sql And: (setq eudc-contacts-file "/tmp/test-contacts.db") (eudc-set-server "dummy" 'mab t) In a scratch buffer: (eudc-mab-sqlite3-dump-mac-addressbook) Searching for "Richard" or "Anton" should be interesting: (eudc-query-form) > Do you have a copyright assignment on file? No. I'm not in the US. Do I just email copyright-clerk@ ? -- Danie Roux --=-=-= Content-Type: application/emacs-lisp Content-Disposition: attachment; filename=eudcb-mab.el Content-Transfer-Encoding: quoted-printable ;;; eudcb-mab.el --- Emacs Unified Directory Client - AddressBook backend ;; Copyright (C) 2003-2015 Free Software Foundation, Inc. ;; Author: John Wiegley ;; Maintainer: emacs-devel@gnu.org ;; Keywords: comm ;; Package: eudc ;; This file is part of GNU Emacs. ;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs. If not, see . ;;; Commentary: ;; This library provides an interface to use the Mac's AddressBook, ;; by querying the database using sqlite3. No additional software ;; need to be installed as sqlite3 is a standard command on the ;; latest versions of OSX. ;;; Code: (require 'eudc) (require 'executable) ;;{{{ Internal cooking (defvar eudc-mab-conversion-alist nil) (defvar eudc-buffer-time nil) (defvar eudc-contacts-file "~/Library/Application Support/AddressBook/AddressBook-v22.abcddb" "This is the location for the 'Local' addressbook on Mavericks. To test if the location is correct, invoke '(eudc-mab-sqlite3-dump-mac-addressbook). If you have a remote source (like Google), find the right file in: ~/Library/Application Support/AddressBook/Sources") (eudc-protocol-set 'eudc-query-function 'eudc-mab-query-internal 'mab) (eudc-protocol-set 'eudc-list-attributes-function nil 'mab) (eudc-protocol-set 'eudc-mab-conversion-alist nil 'mab) (eudc-protocol-set 'eudc-protocol-has-default-query-attributes nil 'mab) (defun eudc-mab-sqlite3-dump-mac-addressbook () "Return a colon separated list. The format is: LastName:FirstName:Phone:Email" (interactive) (let ((sqlite-db (expand-file-name eudc-contacts-file))) (unless (and sqlite-db (file-readable-p sqlite-db)) (error "Cannot read sqlite database: %s" sqlite-db)) (call-process (executable-find "sqlite3") nil t nil "-separator" ":" sqlite-db "select p.ZLASTNAME, p.ZFIRSTNAME, n.ZFULLNUMBER, e.ZADDRESSNORMALIZED FROM ZABCDRECORD as p, ZABCDEMAILADDRESS as e, ZABCDPHONENUMBER as n WHERE (e.ZOWNER =3D p.Z_PK) AND (n.ZOWNER =3D p.Z_PK);")= )) (defun eudc-mab-query-internal (query &optional return-attrs) "Query MAB with QUERY. QUERY is a list of cons cells (ATTR . VALUE) where ATTRs should be valid MAB attribute names. RETURN-ATTRS is a list of attributes to return, defaulting to `eudc-default-return-attributes'." (let ((mab-buffer (get-buffer-create " *mab contacts*")) (modified (nth 5 (file-attributes eudc-contacts-file))) result) (with-current-buffer mab-buffer (make-local-variable 'eudc-buffer-time) (goto-char (point-min)) (when (or (eobp) (time-less-p eudc-buffer-time modified)) (erase-buffer) (eudc-mab-sqlite3-dump-mac-addressbook) (setq eudc-buffer-time modified)) (goto-char (point-min)) (while (not (eobp)) (let* ((args (split-string (buffer-substring (point) (line-end-position)) "\\s-*:\\s-*")) (lastname (nth 0 args)) (firstname (nth 1 args)) (phone (nth 2 args)) (mail (nth 3 args)) (matched t)) (if (string-match "\\s-+\\'" mail) (setq mail (replace-match "" nil nil mail))) (dolist (term query) (cond ((eq (car term) 'name) (unless (string-match (cdr term) (concat firstname " " lastname)) (setq matched nil))) ((eq (car term) 'email) (unless (string=3D (cdr term) mail) (setq matched nil))) ((eq (car term) 'phone)))) (when matched (setq result (cons `((firstname . ,firstname) (lastname . ,lastname) (name . ,(concat firstname " " lastname)) (phone . ,phone) (email . ,mail)) result)))) (forward-line))) (if (null return-attrs) result (let (eudc-result) (dolist (entry result) (let (entry-attrs abort) (dolist (attr entry) (when (memq (car attr) return-attrs) (if (=3D (length (cdr attr)) 0) (setq abort t) (setq entry-attrs (cons attr entry-attrs))))) (if (and entry-attrs (not abort)) (setq eudc-result (cons entry-attrs eudc-result))))) eudc-result)))) ;;}}} ;;{{{ High-level interfaces (interactive functions) (defun eudc-mab-set-server (dummy) "Set the EUDC server to MAB." (interactive) (eudc-set-server dummy 'mab) (message "MAB server selected")) ;;}}} (eudc-register-protocol 'mab) (provide 'eudcb-mab) ;;; eudcb-mab.el ends here --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=contacts.sql Content-Transfer-Encoding: base64 UFJBR01BIGZvcmVpZ25fa2V5cz1PRkY7CkJFR0lOIFRSQU5TQUNUSU9OOwpDUkVBVEUgVEFCTEUg WkFCQ0RSRUNPUkQgKCBaX1BLIElOVEVHRVIgUFJJTUFSWSBLRVksIFpfRU5UIElOVEVHRVIsIFpf T1BUIElOVEVHRVIsIFpDUkVBVElPTkRBVEVZRUFSIElOVEVHRVIsIFpESVNQTEFZRkxBR1MgSU5U RUdFUiwgWk1PRElGSUNBVElPTkRBVEVZRUFSIElOVEVHRVIsIFpBRERSRVNTQk9PS1NPVVJDRSBJ TlRFR0VSLCBaSVNBTEwgSU5URUdFUiwgWklORk8gSU5URUdFUiwgWk1FIElOVEVHRVIsIFoyMV9N RSBJTlRFR0VSLCBaQklSVEhEQVlZRUFSIElOVEVHRVIsIFpQUkVGRVJSRURGT1JMSU5LTkFNRSBJ TlRFR0VSLCBaUFJFRkVSUkVERk9STElOS1BIT1RPIElOVEVHRVIsIFpQUklWQUNZRkxBR1MgSU5U RUdFUiwgWkFERFJFU1NCT09LU09VUkNFMSBJTlRFR0VSLCBaQ09OVEFDVElOREVYIElOVEVHRVIs IFpMVU5BUkJJUlRIREFZQ09NUE9ORU5UUyBJTlRFR0VSLCBaTk9URSBJTlRFR0VSLCBaU09VUkNF V0hFUkVDT05UQUNUSVNNRSBJTlRFR0VSLCBaQVNTSVNUQU5UU1lOQ0FOQ0hPUiBJTlRFR0VSLCBa U0hBUkVDT1VOVCBJTlRFR0VSLCBaU1lOQ0NPVU5UIElOVEVHRVIsIFpWRVJTSU9OIElOVEVHRVIs IFpBRERSRVNTQk9PS1NPVVJDRTIgSU5URUdFUiwgWkNSRUFUSU9OREFURSBUSU1FU1RBTVAsIFpD UkVBVElPTkRBVEVZRUFSTEVTUyBGTE9BVCwgWk1PRElGSUNBVElPTkRBVEUgVElNRVNUQU1QLCBa TU9ESUZJQ0FUSU9OREFURVlFQVJMRVNTIEZMT0FULCBaQklSVEhEQVkgVElNRVNUQU1QLCBaQklS VEhEQVlZRUFSTEVTUyBGTE9BVCwgWlVOSVFVRUlEIFZBUkNIQVIsIFpOQU1FIFZBUkNIQVIsIFpO QU1FTk9STUFMSVpFRCBWQVJDSEFSLCBaVE1QUkVNT1RFTE9DQVRJT04gVkFSQ0hBUiwgWk5BTUUx IFZBUkNIQVIsIFpSRU1PVEVMT0NBVElPTiBWQVJDSEFSLCBaU0VSSUFMTlVNQkVSIFZBUkNIQVIs IFpERVBBUlRNRU5UIFZBUkNIQVIsIFpGSVJTVE5BTUUgVkFSQ0hBUiwgWklERU5USVRZVU5JUVVF SUQgVkFSQ0hBUiwgWklNQUdFUkVGRVJFTkNFIFZBUkNIQVIsIFpKT0JUSVRMRSBWQVJDSEFSLCBa TEFTVE5BTUUgVkFSQ0hBUiwgWkxJTktJRCBWQVJDSEFSLCBaTUFJREVOTkFNRSBWQVJDSEFSLCBa TUlERExFTkFNRSBWQVJDSEFSLCBaTklDS05BTUUgVkFSQ0hBUiwgWk9SR0FOSVpBVElPTiBWQVJD SEFSLCBaUEhPTkVNRURBVEEgVkFSQ0hBUiwgWlBIT05FVElDRklSU1ROQU1FIFZBUkNIQVIsIFpQ SE9ORVRJQ0xBU1ROQU1FIFZBUkNIQVIsIFpQSE9ORVRJQ01JRERMRU5BTUUgVkFSQ0hBUiwgWlNP UlRJTkdGSVJTVE5BTUUgVkFSQ0hBUiwgWlNPUlRJTkdMQVNUTkFNRSBWQVJDSEFSLCBaU1VGRklY IFZBUkNIQVIsIFpUSVRMRSBWQVJDSEFSLCBaVE1QSE9NRVBBR0UgVkFSQ0hBUiwgWkFTU0lTVEFO VFZBTElESVRZIFZBUkNIQVIsIFpDUkVBVEVEVkVSU0lPTiBWQVJDSEFSLCBaTEFTVERPVE1BQ0FD Q09VTlQgVkFSQ0hBUiwgWkxBU1RTQVZFRFZFUlNJT04gVkFSQ0hBUiwgWlNZTkNBTkNIT1IgVkFS Q0hBUiwgWk1PRElGSUVEVU5JUVVFSURTREFUQSBCTE9CLCBaU0VBUkNIRUxFTUVOVERBVEEgQkxP QiApOwpJTlNFUlQgSU5UTyBaQUJDRFJFQ09SRCBWQUxVRVMoMSwyMSwzNiwyMDExLDAsMjAxMyxO VUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCwwLDAsTlVMTCxOVUxMLDEsTlVMTCxOVUxMLDMs TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLDM0NTM3MzQ4NS45MDQzMTMsMjk4NDA2ODUuOTA0MzEz LDQwNjA1OTAyMC4zMTU2ODksMjczNjc4MjAuMzE1Njg5LE5VTEwsTlVMTCwnMDAwMDAwMDAtMDAw MC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwOkFCUGVyc29uJyxOVUxMLE5VTEwsTlVMTCxOVUxMLE5V TEwsTlVMTCxOVUxMLCdEYW5pZScsTlVMTCxOVUxMLE5VTEwsJ1JvdXgnLDAwMDAwMDAwLTAwMDAt MDAwMC0wMDAwLTAwMDAwMDAwMDAwMCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxM LE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxO VUxMLE5VTEwpOwpJTlNFUlQgSU5UTyBaQUJDRFJFQ09SRCBWQUxVRVMoMjAsMjEsNCwyMDExLDAs MjAxMyxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCwwLDAsTlVMTCxOVUxMLDQyOCxOVUxM LDMwLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLDM0NTQxNTM2MS42MzEzNTEsMjk4ODI1 NjEuNjMxMzUxLDQwNjA1OTAyNi41NTc0NzIsMjczNjc4MjYuNTU3NDcyLE5VTEwsTlVMTCwnMDAw MDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwOkFCUGVyc29uJyxOVUxMLE5VTEwsTlVM TCxOVUxMLE5VTEwsTlVMTCxOVUxMLCdDaGVyeWwnLE5VTEwsTlVMTCxOVUxMLCd2YW4gZGVyIE1l cndlJywwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAsTlVMTCxOVUxMLE5VTEws TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5V TEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKSU5TRVJUIElOVE8gWkFCQ0RSRUNPUkQgVkFM VUVTKDIxLDIxLDYsMjAxMSwwLDIwMTMsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsMCww LE5VTEwsTlVMTCwxOTcsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLDM0 NTQxNTM2MS42MzM5NDUsMjk4ODI1NjEuNjMzOTQ1LDQwNjA1OTAxNy4xMDU0MDQsMjczNjc4MTcu MTA1NDA0LE5VTEwsTlVMTCwnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwOkFC UGVyc29uJyxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLCdBbnRvbicsTlVMTCxO VUxMLCdDVE8nLCdTbWl0JywwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAsTlVM TCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEws TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKSU5TRVJUIElOVE8gWkFC Q0RSRUNPUkQgVkFMVUVTKDMyLDIxLDgsMjAxMSwwLDIwMTMsTlVMTCxOVUxMLE5VTEwsTlVMTCxO VUxMLE5VTEwsMCwwLE5VTEwsTlVMTCw0NzMsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEws TlVMTCxOVUxMLDM0NTQxNTM2MS42NjYxNDEsMjk4ODI1NjEuNjY2MTQxLDQwNjA1OTAyNi41NTc0 NzIsMjczNjc4MjYuNTU3NDcyLE5VTEwsTlVMTCwnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAw MDAwMDAwMDAwOkFCUGVyc29uJyxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLCdS aWNoYXJkJyxOVUxMLE5VTEwsJ0ZvdW5kaW5nIE1lbWJlcicsJ0xvb3RzJywwMDAwMDAwMC0wMDAw LTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVM TCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEws TlVMTCxOVUxMKTsKSU5TRVJUIElOVE8gWkFCQ0RSRUNPUkQgVkFMVUVTKDQyLDIxLDEzLDIwMTEs MCwyMDEzLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLDAsMCxOVUxMLE5VTEwsMTc1LE5V TEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCwzNDU0MTUzNjEuNjkyOTc0LDI5 ODgyNTYxLjY5Mjk3NCw0MDYwNTkwMjYuNTU3NDcyLDI3MzY3ODI2LjU1NzQ3MixOVUxMLE5VTEws JzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMDpBQlBlcnNvbicsTlVMTCxOVUxM LE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCwnTmljb2xlJyxOVUxMLE5VTEwsTlVMTCwnS2lkbWFu JywwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAsTlVMTCxOVUxMLE5VTEwsTlVM TCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEws TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKSU5TRVJUIElOVE8gWkFCQ0RSRUNPUkQgVkFMVUVT KDQzLDIxLDYsMjAxMSwwLDIwMTMsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsMCwwLE5V TEwsTlVMTCw0NDYsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLDM0NTQx NTM2MS42OTcxNywyOTg4MjU2MS42OTcxNyw0MDYwNTkwMTUuMzE4MzU1LDI3MzY3ODE1LjMxODM1 NSxOVUxMLE5VTEwsJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMDpBQlBlcnNv bicsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCwnUnVkaScsTlVMTCxOVUxMLCdP d25lcicsJ0JyaXNjbycsMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwLE5VTEws TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5V TEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CklOU0VSVCBJTlRPIFpBQkNE UkVDT1JEIFZBTFVFUygxMDAsMjEsMTAsMjAxMSwwLDIwMTMsTlVMTCxOVUxMLE5VTEwsTlVMTCxO VUxMLE5VTEwsMCwwLE5VTEwsTlVMTCwxMjIsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEws TlVMTCxOVUxMLDM0NTQxNTM2MS44NDk1ODYsMjk4ODI1NjEuODQ5NTg2LDQwNjA1OTAxNS4zMTgz NTUsMjczNjc4MTUuMzE4MzU1LE5VTEwsTlVMTCwnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAw MDAwMDAwMDAwOkFCUGVyc29uJyxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLCdN YXJpdXMnLE5VTEwsTlVMTCxOVUxMLCdMdWRpa2tlJywwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0w MDAwMDAwMDAwMDAsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEws TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsK SU5TRVJUIElOVE8gWkFCQ0RSRUNPUkQgVkFMVUVTKDEwMiwyMSw0LDIwMTEsMCwyMDEzLE5VTEws TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLDAsMCxOVUxMLE5VTEwsNTEzLE5VTEwsTlVMTCxOVUxM LE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCwzNDU0MTUzNjEuODU0ODUyLDI5ODgyNTYxLjg1NDg1 Miw0MDYwNTkwMTcuMTA1NDA0LDI3MzY3ODE3LjEwNTQwNCxOVUxMLE5VTEwsJzAwMDAwMDAwLTAw MDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMDpBQlBlcnNvbicsTlVMTCxOVUxMLE5VTEwsTlVMTCxO VUxMLE5VTEwsTlVMTCwnTWFydGluJyxOVUxMLE5VTEwsTlVMTCwnTmVsJywwMDAwMDAwMC0wMDAw LTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVM TCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEws TlVMTCxOVUxMKTsKQ1JFQVRFIFRBQkxFIFpBQkNERU1BSUxBRERSRVNTICggWl9QSyBJTlRFR0VS IFBSSU1BUlkgS0VZLCBaX0VOVCBJTlRFR0VSLCBaX09QVCBJTlRFR0VSLCBaSVNQUklNQVJZIElO VEVHRVIsIFpJU1BSSVZBVEUgSU5URUdFUiwgWk9SREVSSU5HSU5ERVggSU5URUdFUiwgWk9XTkVS IElOVEVHRVIsIFoyMV9PV05FUiBJTlRFR0VSLCBaQUREUkVTUyBWQVJDSEFSLCBaQUREUkVTU05P Uk1BTElaRUQgVkFSQ0hBUiwgWkxBQkVMIFZBUkNIQVIsIFpVTklRVUVJRCBWQVJDSEFSICk7CklO U0VSVCBJTlRPIFpBQkNERU1BSUxBRERSRVNTIFZBTFVFUyg3MzUsMTAsMSwxLE5VTEwsMCw0Miwy MSwnbmljb2xlLmtpZG1hbkBleGFtcGxlLmNvbScsJ25pY29sZS5raWRtYW5AZXhhbXBsZS5jb20n LCdfJCE8T3RoZXI+ISRfJywwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApOwpJ TlNFUlQgSU5UTyBaQUJDREVNQUlMQUREUkVTUyBWQUxVRVMoNzU1LDEwLDEsMSxOVUxMLDAsNDMs MjEsJ3J1ZGlAZXhhbXBsZS5jb20nLCdydWRpQGV4YW1wbGUuY29tJywnXyQhPE90aGVyPiEkXycs MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKTsKSU5TRVJUIElOVE8gWkFCQ0RF TUFJTEFERFJFU1MgVkFMVUVTKDg1OCwxMCwxLDAsTlVMTCwxLDQzLDIxLCdydWRpLmJyaXNjb0Bl eGFtcGxlLmNvbScsJ3J1ZGkuYnJpc2NvQGV4YW1wbGUuY29tJywnXyQhPE90aGVyPiEkXycsMDAw MDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKTsKSU5TRVJUIElOVE8gWkFCQ0RFTUFJ TEFERFJFU1MgVkFMVUVTKDk3MiwxMCwxLDAsTlVMTCwyLDQzLDIxLCdydWRpQGV4YW1wbGUubmV0 JywncnVkaUBleGFtcGxlLm5ldCcsJ18kITxPdGhlcj4hJF8nLDAwMDAwMDAwLTAwMDAtMDAwMC0w MDAwLTAwMDAwMDAwMDAwMCk7CklOU0VSVCBJTlRPIFpBQkNERU1BSUxBRERSRVNTIFZBTFVFUygx MDA0LDEwLDEsMSxOVUxMLDAsMzIsMjEsJ3JpY2hhcmRAZXhhbXBsZS5jb20nLCdyaWNoYXJkQGV4 YW1wbGUuY29tJywnXyQhPE90aGVyPiEkXycsMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAw MDAwMDAwKTsKSU5TRVJUIElOVE8gWkFCQ0RFTUFJTEFERFJFU1MgVkFMVUVTKDEwMjEsMTAsMSwx LE5VTEwsMCwyMCwyMSwnY2hlcnlsQGV4YW1wbGUuY29tJywnY2hlcnlsQGV4YW1wbGUuY29tJywn XyQhPE90aGVyPiEkXycsMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKTsKSU5T RVJUIElOVE8gWkFCQ0RFTUFJTEFERFJFU1MgVkFMVUVTKDEwNTcsMTAsMSwwLE5VTEwsMSwxMDIs MjEsJ21uQGV4YW1wbGUuY29tJywnbW5AZXhhbXBsZS5jb20nLCdfJCE8SG9tZT4hJF8nLDAwMDAw MDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCk7CklOU0VSVCBJTlRPIFpBQkNERU1BSUxB RERSRVNTIFZBTFVFUygxMTU1LDEwLDEsMSxOVUxMLDAsMTAyLDIxLCdtYXJ0aW5AZXhhbXBsZS5j b20nLCdtYXJ0aW5AZXhhbXBsZS5jb20nLCdfJCE8T3RoZXI+ISRfJywwMDAwMDAwMC0wMDAwLTAw MDAtMDAwMC0wMDAwMDAwMDAwMDApOwpJTlNFUlQgSU5UTyBaQUJDREVNQUlMQUREUkVTUyBWQUxV RVMoMTM2OSwxMCwxLDEsTlVMTCwwLDEwMCwyMSwnbWFyaXVzQGV4YW1wbGUuY29tJywnbWFyaXVz QGV4YW1wbGUuY29tJywnXyQhPE90aGVyPiEkXycsMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAw MDAwMDAwMDAwKTsKSU5TRVJUIElOVE8gWkFCQ0RFTUFJTEFERFJFU1MgVkFMVUVTKDEzNzksMTAs MSwwLE5VTEwsMiwxLDIxLCdkYW5pZUBleGFtcGxlLm5ldCcsJ2RhbmllQGV4YW1wbGUubmV0Jywn XyQhPE90aGVyPiEkXycsMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKTsKSU5T RVJUIElOVE8gWkFCQ0RFTUFJTEFERFJFU1MgVkFMVUVTKDEzODEsMTAsMSwwLE5VTEwsMSwxLDIx LCdhY2NvdW50cytnbnVAZXhhbXBsZS5jb20nLCdhY2NvdW50cytnbnVAZXhhbXBsZS5jb20nLCdf JCE8T3RoZXI+ISRfJywwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApOwpJTlNF UlQgSU5UTyBaQUJDREVNQUlMQUREUkVTUyBWQUxVRVMoMTM4MiwxMCwxLDAsTlVMTCwzLDEsMjEs J2FjY291bnRzK3NhdmFubmFoQGV4YW1wbGUuY29tJywnYWNjb3VudHMrc2F2YW5uYWhAZXhhbXBs ZS5jb20nLCdfJCE8T3RoZXI+ISRfJywwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAw MDApOwpJTlNFUlQgSU5UTyBaQUJDREVNQUlMQUREUkVTUyBWQUxVRVMoMTM4MywxMCwxLDEsTlVM TCwwLDEsMjEsJ2RhbmllQGV4YW1wbGUuY29tJywnZGFuaWVAZXhhbXBsZS5jb20nLCdfJCE8SG9t ZT4hJF8nLDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCk7CklOU0VSVCBJTlRP IFpBQkNERU1BSUxBRERSRVNTIFZBTFVFUygxNTQ1LDEwLDEsMCxOVUxMLDIsMjEsMjEsJ2FudG9u QGV4YW1wbGUuY29tJywnYW50b25AZXhhbXBsZS5jb20nLCdfJCE8T3RoZXI+ISRfJywwMDAwMDAw MC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApOwpJTlNFUlQgSU5UTyBaQUJDREVNQUlMQURE UkVTUyBWQUxVRVMoMTU0NywxMCwxLDEsTlVMTCwwLDIxLDIxLCdhc0BleGFtcGxlLm5ldCcsJ2Fz QGV4YW1wbGUubmV0JywnXyQhPE90aGVyPiEkXycsMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAw MDAwMDAwMDAwKTsKSU5TRVJUIElOVE8gWkFCQ0RFTUFJTEFERFJFU1MgVkFMVUVTKDE1NDgsMTAs MSwwLE5VTEwsMywyMSwyMSwnYW50b24uc21pdEBleGFtcGxlLmNvbScsJ2FudG9uLnNtaXRAZXhh bXBsZS5jb20nLCdfJCE8T3RoZXI+ISRfJywwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAw MDAwMDApOwpJTlNFUlQgSU5UTyBaQUJDREVNQUlMQUREUkVTUyBWQUxVRVMoMTU2MCwxMCwxLDAs TlVMTCwxLDIxLDIxLCdhbnRvbkBleGFtcGxlLm5ldCcsJ2FudG9uQGV4YW1wbGUubmV0JywnXyQh PE90aGVyPiEkXycsMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKTsKQ1JFQVRF IFRBQkxFIFpBQkNEUEhPTkVOVU1CRVIgKCBaX1BLIElOVEVHRVIgUFJJTUFSWSBLRVksIFpfRU5U IElOVEVHRVIsIFpfT1BUIElOVEVHRVIsIFpJU1BSSU1BUlkgSU5URUdFUiwgWklTUFJJVkFURSBJ TlRFR0VSLCBaT1JERVJJTkdJTkRFWCBJTlRFR0VSLCBaT1dORVIgSU5URUdFUiwgWjIxX09XTkVS IElOVEVHRVIsIFpBUkVBQ09ERSBWQVJDSEFSLCBaQ09VTlRSWUNPREUgVkFSQ0hBUiwgWkVYVEVO U0lPTiBWQVJDSEFSLCBaRlVMTE5VTUJFUiBWQVJDSEFSLCBaTEFCRUwgVkFSQ0hBUiwgWkxPQ0FM TlVNQkVSIFZBUkNIQVIsIFpVTklRVUVJRCBWQVJDSEFSICk7CklOU0VSVCBJTlRPIFpBQkNEUEhP TkVOVU1CRVIgVkFMVUVTKDUyNSwxMywxLDAsTlVMTCwxLDIwLDIxLE5VTEwsTlVMTCxOVUxMLCcw MTEgMTIzIDQ1NjAnLCdfJCE8TW9iaWxlPiEkXycsTlVMTCwwMDAwMDAwMC0wMDAwLTAwMDAtMDAw MC0wMDAwMDAwMDAwMDApOwpJTlNFUlQgSU5UTyBaQUJDRFBIT05FTlVNQkVSIFZBTFVFUyg1NDMs MTMsMSwxLE5VTEwsMCwyMCwyMSxOVUxMLE5VTEwsTlVMTCwnMDExIDEyMyA0NTYxJywnXyQhPEhv bWU+ISRfJyxOVUxMLDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCk7CklOU0VS VCBJTlRPIFpBQkNEUEhPTkVOVU1CRVIgVkFMVUVTKDU1MiwxMywxLDEsTlVMTCwwLDIxLDIxLE5V TEwsTlVMTCxOVUxMLCcwMTEgMzIxIDk4NzYnLCdfJCE8TW9iaWxlPiEkXycsTlVMTCwwMDAwMDAw MC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApOwpJTlNFUlQgSU5UTyBaQUJDRFBIT05FTlVN QkVSIFZBTFVFUyg1NjAsMTMsMSwwLE5VTEwsMSwxLDIxLE5VTEwsTlVMTCxOVUxMLCcwMTEgMTIz IDQ1NjInLCdfJCE8TW9iaWxlPiEkXycsTlVMTCwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAw MDAwMDAwMDApOwpJTlNFUlQgSU5UTyBaQUJDRFBIT05FTlVNQkVSIFZBTFVFUyg1NjcsMTMsMSwx LE5VTEwsMCwxMDAsMjEsTlVMTCxOVUxMLE5VTEwsJzAxMSAxMjMgNDU2MycsJ18kITxNb2JpbGU+ ISRfJyxOVUxMLDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCk7CklOU0VSVCBJ TlRPIFpBQkNEUEhPTkVOVU1CRVIgVkFMVUVTKDU5MywxMywxLDEsTlVMTCwwLDQzLDIxLE5VTEws TlVMTCxOVUxMLCcwMTEgMTIzIDQ1NjQnLCdfJCE8TW9iaWxlPiEkXycsTlVMTCwwMDAwMDAwMC0w MDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApOwpJTlNFUlQgSU5UTyBaQUJDRFBIT05FTlVNQkVS IFZBTFVFUyg1OTQsMTMsMSwwLE5VTEwsMiwyMCwyMSxOVUxMLE5VTEwsTlVMTCwnMDExIDEyMyA0 NTY1JywnXyQhPEhvbWVGQVg+ISRfJyxOVUxMLDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAw MDAwMDAwMCk7CklOU0VSVCBJTlRPIFpBQkNEUEhPTkVOVU1CRVIgVkFMVUVTKDYwNCwxMywxLDEs TlVMTCwwLDEsMjEsTlVMTCxOVUxMLE5VTEwsJzAxMSAxMjMgNDU2NicsJ18kITxIb21lPiEkXycs TlVMTCwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApOwpJTlNFUlQgSU5UTyBa QUJDRFBIT05FTlVNQkVSIFZBTFVFUyg2MTMsMTMsMSwxLE5VTEwsMCw0MiwyMSxOVUxMLE5VTEws TlVMTCwnMDExIDEyMyA0NTY3JywnXyQhPE1vYmlsZT4hJF8nLE5VTEwsMDAwMDAwMDAtMDAwMC0w MDAwLTAwMDAtMDAwMDAwMDAwMDAwKTsKSU5TRVJUIElOVE8gWkFCQ0RQSE9ORU5VTUJFUiBWQUxV RVMoNjE5LDEzLDEsMCxOVUxMLDEsMTAyLDIxLE5VTEwsTlVMTCxOVUxMLCcwMTEgMTIzIDQ1Njgn LCdfJCE8V29yaz4hJF8nLE5VTEwsMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAw KTsKSU5TRVJUIElOVE8gWkFCQ0RQSE9ORU5VTUJFUiBWQUxVRVMoNjQzLDEzLDEsMSxOVUxMLDAs MzIsMjEsTlVMTCxOVUxMLE5VTEwsJzAxMSAxMjMgNDU2OScsJ18kITxNb2JpbGU+ISRfJyxOVUxM LDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCk7CklOU0VSVCBJTlRPIFpBQkNE UEhPTkVOVU1CRVIgVkFMVUVTKDc0NSwxMywxLDEsTlVMTCwwLDEwMiwyMSxOVUxMLE5VTEwsTlVM TCwnMDExIDEyMyA0NTcwJywnXyQhPE1vYmlsZT4hJF8nLE5VTEwsMDAwMDAwMDAtMDAwMC0wMDAw LTAwMDAtMDAwMDAwMDAwMDAwKTsKSU5TRVJUIElOVE8gWkFCQ0RQSE9ORU5VTUJFUiBWQUxVRVMo NzYxLDEzLDEsMCxOVUxMLDEsNDIsMjEsTlVMTCxOVUxMLE5VTEwsJzAxMSAxMjMgNDU3MScsJ18k ITxXb3JrPiEkXycsTlVMTCwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApOwpJ TlNFUlQgSU5UTyBaQUJDRFBIT05FTlVNQkVSIFZBTFVFUyg5NjQsMTMsMSxOVUxMLE5VTEwsMiwx LDIxLE5VTEwsTlVMTCxOVUxMLCcwMTEgMTIzIDQ1NzInLCdfJCE8SG9tZUZBWD4hJF8nLE5VTEws MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKTsKQ09NTUlUOwo= --=-=-=--