From f548a0a1e24b0236275dd5d7e2523645cf649304 Mon Sep 17 00:00:00 2001 From: TLINDEN Date: Fri, 10 Feb 2012 20:24:51 +0100 Subject: [PATCH] - --- 0x49/CVS/Entries | 3 - 0x49/CVS/Repository | 1 - 0x49/CVS/Root | 1 - 0x49/contents/CVS/Entries | 14 - 0x49/contents/CVS/Repository | 1 - 0x49/contents/CVS/Root | 1 - 0x49/contents/about | 13 - 0x49/contents/changelog | 294 ------ 0x49/contents/cvs | 20 - 0x49/contents/deutsch | 19 - 0x49/contents/download | 17 - 0x49/contents/index | 49 - 0x49/contents/installation | 42 - 0x49/contents/license | 342 ------ 0x49/contents/menu | 19 - 0x49/contents/screenshots | 16 - 0x49/contents/upgrade | 45 - 0x49/contents/usage | 350 ------- 0x49/contents/version | 1 - 0x49/images/CVS/Entries | 14 - 0x49/images/CVS/Repository | 1 - 0x49/images/CVS/Root | 1 - 0x49/images/anybrow.gif | Bin 1286 -> 0 bytes 0x49/images/button.gif | Bin 948 -> 0 bytes 0x49/images/gproc.jpg | Bin 72417 -> 0 bytes 0x49/images/linux.gif | Bin 1770 -> 0 bytes 0x49/images/msfree.gif | Bin 1654 -> 0 bytes 0x49/images/note-be.jpg | Bin 227425 -> 0 bytes 0x49/images/note-linux.gif | Bin 7387 -> 0 bytes 0x49/images/note-win32.gif | Bin 7627 -> 0 bytes 0x49/images/note.jpg | Bin 1202 -> 0 bytes 0x49/images/note_be_small.png | Bin 23865 -> 0 bytes 0x49/images/note_linux_small.png | Bin 997 -> 0 bytes 0x49/images/note_win32_small.png | Bin 1167 -> 0 bytes 0x49/images/notes.png | Bin 760 -> 0 bytes 0x49/index.html | 86 -- CVS/Entries | 11 +- Changelog | 3 + Makefile.PL | 2 +- NOTEDB.pm | 95 +- NOTEDB/CVS/Entries | 6 +- NOTEDB/binary.pm | 417 ++++---- NOTEDB/dbm.pm | 197 ++-- NOTEDB/mysql.pm | 381 +++---- README | 10 +- Tools.pm | 330 ++++++ VERSION | 2 +- bin/CVS/Entries | 2 +- bin/note | 56 +- config/CVS/Entries | 2 +- config/noterc | 6 +- note | 1642 ----------------------------- note-1.0.7/Changelog | 277 ----- note-1.0.7/Makefile.PL | 108 -- note-1.0.7/NOTEDB/README | 7 - note-1.0.7/NOTEDB/binary.pm | 388 ------- note-1.0.7/NOTEDB/dbm.pm | 261 ----- note-1.0.7/NOTEDB/mysql.pm | 349 ------- note-1.0.7/README | 517 ---------- note-1.0.7/UPGRADE | 73 -- note-1.0.7/VERSION | 1 - note-1.0.7/bin/note | 1662 ------------------------------ note-1.0.7/config/noterc | 148 --- note-1.0.7/mysql/README | 62 -- note-1.0.7/mysql/install.sh | 33 - note-1.0.7/mysql/permissions | 2 - note-1.0.7/mysql/sql | 8 - note-1.0.7/note | 1639 ----------------------------- note-1.0.7/stresstest.sh | 55 - note.1 | 7 +- 70 files changed, 973 insertions(+), 9136 deletions(-) delete mode 100644 0x49/CVS/Entries delete mode 100644 0x49/CVS/Repository delete mode 100644 0x49/CVS/Root delete mode 100644 0x49/contents/CVS/Entries delete mode 100644 0x49/contents/CVS/Repository delete mode 100644 0x49/contents/CVS/Root delete mode 100644 0x49/contents/about delete mode 100644 0x49/contents/changelog delete mode 100644 0x49/contents/cvs delete mode 100644 0x49/contents/deutsch delete mode 100644 0x49/contents/download delete mode 100644 0x49/contents/index delete mode 100644 0x49/contents/installation delete mode 100644 0x49/contents/license delete mode 100644 0x49/contents/menu delete mode 100644 0x49/contents/screenshots delete mode 100644 0x49/contents/upgrade delete mode 100644 0x49/contents/usage delete mode 100644 0x49/contents/version delete mode 100644 0x49/images/CVS/Entries delete mode 100644 0x49/images/CVS/Repository delete mode 100644 0x49/images/CVS/Root delete mode 100644 0x49/images/anybrow.gif delete mode 100644 0x49/images/button.gif delete mode 100644 0x49/images/gproc.jpg delete mode 100644 0x49/images/linux.gif delete mode 100644 0x49/images/msfree.gif delete mode 100644 0x49/images/note-be.jpg delete mode 100644 0x49/images/note-linux.gif delete mode 100644 0x49/images/note-win32.gif delete mode 100644 0x49/images/note.jpg delete mode 100644 0x49/images/note_be_small.png delete mode 100644 0x49/images/note_linux_small.png delete mode 100644 0x49/images/note_win32_small.png delete mode 100644 0x49/images/notes.png delete mode 100644 0x49/index.html create mode 100644 Tools.pm delete mode 100755 note delete mode 100644 note-1.0.7/Changelog delete mode 100644 note-1.0.7/Makefile.PL delete mode 100644 note-1.0.7/NOTEDB/README delete mode 100644 note-1.0.7/NOTEDB/binary.pm delete mode 100644 note-1.0.7/NOTEDB/dbm.pm delete mode 100644 note-1.0.7/NOTEDB/mysql.pm delete mode 100644 note-1.0.7/README delete mode 100644 note-1.0.7/UPGRADE delete mode 100644 note-1.0.7/VERSION delete mode 100755 note-1.0.7/bin/note delete mode 100644 note-1.0.7/config/noterc delete mode 100644 note-1.0.7/mysql/README delete mode 100755 note-1.0.7/mysql/install.sh delete mode 100644 note-1.0.7/mysql/permissions delete mode 100644 note-1.0.7/mysql/sql delete mode 100755 note-1.0.7/note delete mode 100755 note-1.0.7/stresstest.sh diff --git a/0x49/CVS/Entries b/0x49/CVS/Entries deleted file mode 100644 index db015e8..0000000 --- a/0x49/CVS/Entries +++ /dev/null @@ -1,3 +0,0 @@ -/index.html/1.1.1.1/Sat Jul 1 14:40:50 2000// -D/contents//// -D/images//// diff --git a/0x49/CVS/Repository b/0x49/CVS/Repository deleted file mode 100644 index ee4a33e..0000000 --- a/0x49/CVS/Repository +++ /dev/null @@ -1 +0,0 @@ -NOTE/0x49 diff --git a/0x49/CVS/Root b/0x49/CVS/Root deleted file mode 100644 index 9c415c0..0000000 --- a/0x49/CVS/Root +++ /dev/null @@ -1 +0,0 @@ -zarahg@cvs.htnews.sourceforge.net:/cvsroot/htnews diff --git a/0x49/contents/CVS/Entries b/0x49/contents/CVS/Entries deleted file mode 100644 index 861a20b..0000000 --- a/0x49/contents/CVS/Entries +++ /dev/null @@ -1,14 +0,0 @@ -/about/1.1.1.1/Sat Jul 1 14:40:50 2000// -/deutsch/1.1.1.1/Sat Jul 1 14:40:50 2000// -/index/1.1.1.1/Sat Jul 1 14:40:50 2000// -/installation/1.1.1.1/Sat Jul 1 14:40:50 2000// -/license/1.1.1.1/Sat Jul 1 14:40:50 2000// -/screenshots/1.1.1.1/Sat Jul 1 14:40:50 2000// -/upgrade/1.1.1.1/Sat Jul 1 14:40:50 2000// -/usage/1.1.1.1/Sat Jul 1 14:40:50 2000// -/cvs/1.2/Sat Jul 1 14:55:31 2000// -/menu/1.2/Sat Jul 1 14:58:41 2000// -/changelog/1.2/Sun Jul 9 22:16:25 2000// -/version/1.2/Sun Jul 9 22:16:43 2000// -/download/1.4/Sun Jul 9 23:03:12 2000// -D diff --git a/0x49/contents/CVS/Repository b/0x49/contents/CVS/Repository deleted file mode 100644 index 67873a3..0000000 --- a/0x49/contents/CVS/Repository +++ /dev/null @@ -1 +0,0 @@ -NOTE/0x49/contents diff --git a/0x49/contents/CVS/Root b/0x49/contents/CVS/Root deleted file mode 100644 index 9c415c0..0000000 --- a/0x49/contents/CVS/Root +++ /dev/null @@ -1 +0,0 @@ -zarahg@cvs.htnews.sourceforge.net:/cvsroot/htnews diff --git a/0x49/contents/about b/0x49/contents/about deleted file mode 100644 index 484ea34..0000000 --- a/0x49/contents/about +++ /dev/null @@ -1,13 +0,0 @@ -

about note and this page

-

-The author of note is Thomas Linden. if you have any questions, suggestions, votes or even flames, please feel free to -send me an E-mail! -

-This page is hosted by ConSol* GmbH, Germany - THANKS A LOT! -

-Powered by ePerl and vi. -

- -

-Logo created with:
- diff --git a/0x49/contents/changelog b/0x49/contents/changelog deleted file mode 100644 index e603761..0000000 --- a/0x49/contents/changelog +++ /dev/null @@ -1,294 +0,0 @@ -

changelog

- -
- -
-

















- -0.1: -INITIAL RELEASE. - - diff --git a/0x49/contents/cvs b/0x49/contents/cvs deleted file mode 100644 index 7247410..0000000 --- a/0x49/contents/cvs +++ /dev/null @@ -1,20 +0,0 @@ -

CVS

-

- -The whole note source tree is now maintained via CVS at sourceforge.net. - -You can browse the repository via the web: -
-http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/NOTE/?cvsroot=htnews. - -

- -Or you can use the cvs command: -
-

-cvs -d:pserver:anonymous@cvs.htnews.sourceforge.net:/cvsroot/htnews login 
-
-cvs -z3 -d:pserver:anonymous@cvs.htnews.sourceforge.net:/cvsroot/htnews co NOTE
-
-
-When prompted for a password for anonymous, simply press the Enter key. diff --git a/0x49/contents/deutsch b/0x49/contents/deutsch deleted file mode 100644 index b2e9a46..0000000 --- a/0x49/contents/deutsch +++ /dev/null @@ -1,19 +0,0 @@ -

Hinweise für deutsche Besucher

-note ist ein Konsolenprogram, mit dem man einfach Notizen verwalten - kann, ähnlich wie bei "knotes". Es ist in Perl geschrieben. Note - verwendet externe (mitgelieferte!) Module als Speicher-Backend, um - die Daten zu speichern. Momentan ist ein mysql-Modul dabei, sowie - ein "binary"-Modul, note's eigenes Datenformat und seit 1.0.5 auch ein - DBM modul. Das mysql Modul verwendet Perls Standard Modul DBI - und ist damit für alle gängigen DBMS verwendbar. - Seit Version 1.0.0 wird Verschlüsselung unterstützt(IDEA oder DES), - man kann also durchaus auch sensible Daten speichern. -

-Die Dokumentation für note liegt leider nur in englisch vor. Trotzdem müssen Deutsche -nicht ganz leer ausgehen :-) -

-Hannes Lau hat auf seiner Homepage eine kurze Beschreibung bereitgestellt (Tausend Dank!). -

-Eine ausführliche Beschreibung des Programmes ist ausserdem im -LinuxMagazin 5/2000 S. 106 erschienen (allerdings basierend auf einer -älteren Version...)!
*stolzsei* ;-) diff --git a/0x49/contents/download b/0x49/contents/download deleted file mode 100644 index 609781f..0000000 --- a/0x49/contents/download +++ /dev/null @@ -1,17 +0,0 @@ -

downloads

-

-Here you can find the note package for free download. Follow the installation instructions in the -README file provided with the package or read the online version. -

- newest: note-1.0.8.tar.gz
- note-1.0.7.tar.gz
- note-1.0.6.tar.gz
- note-1.0.5.tar.gz
- read the README
- read the Changelog
- -


-If you encounter any problems with the site above, try to use one of the following mirrors:

-ftp://www.0x49.org/pub/scip/note/ -
-http://sourceforge.net/project/filelist.php?group_id=656 diff --git a/0x49/contents/index b/0x49/contents/index deleted file mode 100644 index 29e5fbb..0000000 --- a/0x49/contents/index +++ /dev/null @@ -1,49 +0,0 @@ -

welcome to the homepage of note by Thomas Linden

-note is a small console program written in perl, which allows -you to manage notes similar to programs like "knotes" from -commandline. Note can use different database-backends for -notes-storage. It ships with a DBI-based mysql-module(which -can also be used for other by DBI supported DBMS) and another -module, which uses a binary file for storage and a DBM module.
-Note supports since version 1.0.0 encryption(IDEA or DES)!

-Here is a brief list of it's features: - -

- -

- note is released under the terms of the Gnu Public License(GPL) - and is therefore free Software. diff --git a/0x49/contents/installation b/0x49/contents/installation deleted file mode 100644 index c4e43bc..0000000 --- a/0x49/contents/installation +++ /dev/null @@ -1,42 +0,0 @@ -

installation of note

-

- Unpack the tar-ball and issue the command:
- $ perl Makefile.PL
- It will ask you a few questions about file destinations. - The script will find itself the proper destinations for - the files. So, if you agree with it, simply press ENTER. - However, you may decide to use other destinations. In this - case, enter it, when asked. This maybe usefull, if you are - installing it in your ome-directory and if you are not root! -

- For installation instructions for the mysql database installation - see mysql/README. -

- If want to use another SQL database, i.e. postgresql then set - the option "DbDriver" to the name of the responding DBI-driver - and create a symlink of this name like this: -
/usr/lib/perl5/siteperl/NOTEDB $ ln -s mysql.pm oracle.pm -
The functionality is the same, but not the name! -

- The default binary file backend does not need any special installation - procedure, you need only to spceify a filename in your config file. -

- The DBM backend(NOTEDB::dbm) requires the existence of a directory, - which you must specify in your config using the option "DbName". -

- - -Configuration - - This version of note doesn't neccessarily need - a configuration file. But you can have one and change - some default values. Take a look to the file config/noterc - provided with this tarball. There are detailed instructions - about every available parameter. -
Simply copy this file into your home-directory and name it - .noterc - If you decide not to use the default database backend (a binary - file), you will *need* a configuration! - - - diff --git a/0x49/contents/license b/0x49/contents/license deleted file mode 100644 index 3f49b1b..0000000 --- a/0x49/contents/license +++ /dev/null @@ -1,342 +0,0 @@ -

                    
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                            NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    
-    Copyright (C) 19yy  
-
-    This program 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 2 of the License, or
-    (at your option) any later version.
-
-    This program 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 this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) 19yy name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  , 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
-
diff --git a/0x49/contents/menu b/0x49/contents/menu deleted file mode 100644 index c3a3630..0000000 --- a/0x49/contents/menu +++ /dev/null @@ -1,19 +0,0 @@ - -
home

installation

usage

upgrade

changelog

download

license

cvs

screenshots

deutsch

about

-


-
last updated 02.07.2000 -

-best viewed with any browser -

- diff --git a/0x49/contents/screenshots b/0x49/contents/screenshots deleted file mode 100644 index 3329a3d..0000000 --- a/0x49/contents/screenshots +++ /dev/null @@ -1,16 +0,0 @@ -

screenshots

- -Yes there are also screenshots of note available :-) -
-Simply click on a tumbnail to enlarge the image! -

- Linux -
-

- Win32 -
-

- BeOS -
-

-and finally here a desktop of a user with note running. diff --git a/0x49/contents/upgrade b/0x49/contents/upgrade deleted file mode 100644 index 2158119..0000000 --- a/0x49/contents/upgrade +++ /dev/null @@ -1,45 +0,0 @@ -

upgrade from previous version of note to 1.0.x

-

-In any case: BACKUP your existing note database!!!!!!! -The format has not changed, but some default values -(see the new config file-sample). Use this command -to save your note database with your *old* version -of note:
- "note -D"
-This works with both the mysql and the binary version. -

-You need to reedit your configfile. Please refer to the -sample config in config/noterc. -

-


-

-This version of note has now encryption support build in. -If you decide to use it, you need to re-initialize your -note database. That's why, because your current database -is unencrypted and *if* you want to secure your data, you -need to secure everything. That means, your existing data -must be encrypted before you can use this new capability! -

-Follow this steps: -

-From now on, your data is encrypted. You will need the passphrase -you set above for decrypting it! So - don't forget it! - - diff --git a/0x49/contents/usage b/0x49/contents/usage deleted file mode 100644 index 821d26d..0000000 --- a/0x49/contents/usage +++ /dev/null @@ -1,350 +0,0 @@ -

usage of note

-

-1. Description

-2. Topics

-3. Formatting of note-text

-4. Scripting

-5. Binary DB

-6. Mysql DB

-7. Dump Format

-8. Security

-


-

- -

Decription

- - If you don't know, how to run note, try "note -h" first. - It will tell you all available commandline options. -

- To create a new note, simply run "note". You can enter - the note (the length is by default limited to 4096 bytes, - which you can change from your config file if you are using - the binary backend, therwise there is no limitation). - End by typing a . on a line itself. note will tell you the - number of the note. -

- If you want to view the note, type "note 1", if the notenumber - was 1. -

- If you want to get an overview of all notes, type "note -l". - You will get a list of all notes, containing the number, - the first line and the creation date. If topic-support is - turned on (which is by default), then all subtopics under the - current topic will be displayed first. -
If you want to get a listing of all - If you want to see the timestamps, use "-L" instead of "-l". - Read more about topics below in the section "Topics". - You can also specify the topic which notes you want to see: - "-l mytopic" does the trick. -
Additional, you might want to get an overview of your topic- - strcture. You can use the command "-t" in this case, which - will display a tree-view of your tpic-structure. You can - use the command "-T" if you want to see the notes under each - topic too. "-T" will also show the number of each note. -

- To edit a certain note, type "note -e 1". It will invoke your - editor (vi or pico). You can edit it, after saving, note - will store the changed note to the database. -

- Of course you can drop a certain note: "note -d 1" deletes - note number 1. If a note in the middle or the beginning of - the database will be deleted, note will recount the other - existent notes. For example there are 3 notes, number 1, 2 - and 3. If you delete number 2, then number 3 will become - number 2. -
You can also make use of the extended delete-syntax: - To delete note 1 and 2, use "-d 1,2" - To delete note 1,2 and 3, use "-d 1-3". -

- If you cannot remember, which note you are looking for, you - can use the search capability of note: "note -s ". - note will search the whole note database case insensitive for - an occurence of this string and tell you the number and first- - line it have. -

- Instead of using note from the commandline you can use the - interactive mode. Run note with "note -i". If you need assistance - type "?" or "h" at the ">" prompt. The interactive mode - provides you the most functions of note. -

- You can also dump the contents of your note-database into a - ASCII-textfile(-D). You can use this file later to import it into - your note-database(-I). This is usefull, if you want quickly trans- - fer your notes from one host to another (i.e. you could mail - your note-dump form your office to home and import it there - for further use). -
The dumps from the two versions of note are in the same format. - Using dumps it is also possible to reinitialize your database. You - can use the "-o" switch whcih causes note to overwrite your existing - database. This is very handy if you changed heavily your config. And - it is required, if you changed: encryption, db-driver, (binary-format) - and the password. You can use the following command for reinitializing: -
$ note -D - | note -o -I - -
What the hell, does it?! Step by step: -

- Before you use the "-o" switch, I consider yuo to make a backup! - -

- -top

-

Topics

- - If topic-support is turned on (which is by default), the various - notes are sorted under various topics. There is no special database - field for the topic. Instead the topic will be stored right in the - note. -
If the first line of your note contains some text bordered by slashes - (or whatever you prefer, set "TopicSeparator" in your config! default is slash), - then note will consider it as the topic of this certain note. For examle: -
/TodoList/ -
If you are using topics, no data after the topic is allowed, if there - is any text, note will consider it as a subtopic! Therefore, don't for- - get to put a newline after the topic-line. -

- If you are in interactive mode, you can "cd" to a different note simply - by typing it's name at the command-prompt, or you can use the well-known - syntax "cd topic". -
The list-command will only show you notes under this topic. If you create - a new note, it will automagically inserted under the current topic (note - will prepend the string "/topicname/" to the text of your note). -

- You can create at any time from any point a new topic. Just create a new - note and type the name of the new topic bordered by slashes (or TopicSeparator) - at the first line of this note. After saving, there will be available a - new topic with one note in it. -

- You can create as many subtopics as you like, the format is similar to a - filesystem-path. An example, say, you want to create such a structure: -

-

        
-        (root - top level)
-        |
-        |----test
-        |      |----subtopic
-        |      |       |--note 1
-        |      |       |--note 2
-        |      |
-        |      |--note 4  
-        |
-        |--note 3
-
-

- Then you may create those 4 new notes: -
-

-        --- snip ---
-        /test/subtopic/
-        note 1
-        --- snip ---
-        /test/subtopic/
-        note 2
-        --- snip ---
-        note 3
-        --- snip ---
-        /test/
-        note 4
-        --- snip ---             
-

- I hope, you got the point ;-) -

- - - If a note does not contain the "magic" /topic/ construction on the first - line, it will be listed under the "root" of note, that is the point you are - at the startup of note. -

- You can subsequently move a note without a topic to a certain topic. Simply - edit it and insert at the first line the above mentioned construction. -

- Note: Please don't forget the prepending and appending a slash of a topic. - You will get strange results without it! - - -

- -top

-

Formatting of notes

- - Another very nice feature is the possibility to format the note-text (as much as - shell allows it). First, you can use the note-internal "magic-strings" for color- - izing. Those strings looks much like HTML: -i
"here is a green line of text no more green." - As you see, the beginning of another color starts with a tag(kinda) of the color - and ens with an end tag . -

- The following colors are available: - black, red, green, yellow, blue, magenta, cyan and white. -

- Beside colorizing text, you can also create bold or underlined text! If you decide - to use this (additional) feature, you need to set the Config-Option "FormatNotes" - to 1 which turns it on. -
Usage is very straightforward, if a word (a word is defined as some text with at least - one space surrounded) is between a magic mark-character. Here are the available - things, you can do: -

-                bold:           **word**
-                underlined:     __word__
-                inverse:        {{word}}
-
- The text will be formatted using the actually note-color. -

- - -top

-

Scripting

- - Since version 1.0.3 there are some additions which allows you to use note in - scripts, without user-interaction. You might run a special script as cronjob, - which adds a note under a certain topic every week. Or the like. -

- Here are the possibilies you have: -

- You can add a new note through a pipe, another commands output becomes - note's input: -
$ cat /var/spool/news/daily | note - -
This command adds the content of a file "daily" as a new note. Note the dash. - it stands for "Standard Input". Note will be completely silent and it will not - ask for something. -

- Suppose you are using encryption. You might wonder, how note will get your - passphrase? The solution: You need to set up an environment variable which - contains the password: -
$ export NOTE_PASSWD=secret -
If the variable is present, note will not ask you for a passphrase! -

- Another thingy you might find useful is the -r (--raw) command-line flag. This - turns note into raw mode , which means it will only print the - data without any formatting. Raw mode is available for list and display, - since it makes no sense, interactive mode doe not support raw mode. -

- - - -top

-

Format of the notedb (binary backend)

- - The database where the notes are stored is a binary fixed record length file - of the following format: - It consists of three fixed length fields per entry. The fields - have the following types: - - You can change the sizes of the fields "Note" and "Time" in - the configfile "~/.noterc". If it does not exist, the above - defaults will be used. -
If the data to be stored is smaller then the size of the field, - it will be filled with ZERO's ("\0"). The Note and the Time - fields will be uuencoded before storage. Of course, this is - no security, never mind... - -

- -top

-

The note-database (mysql backend)

- - The sql-database for the mysql version has the following design: -
-        +--------+---------+------+-----+---------+----------------+
-        | Field  | Type    | Null | Key | Default | Extra          |
-        +--------+---------+------+-----+---------+----------------+
-        | number | int(10) |      | PRI | 0       | auto_increment |
-        | note   | text    | YES  |     | NULL    |                |
-        | date   | text    | YES  |     | NULL    |                |
-        +--------+---------+------+-----+---------+----------------+
-
- -

- -top

-

Format of the ASCII-dump file (note -D)

- - The dump of a note-database (if you use note -D) has the following - format: -
        
-        --- snip ---
-        Number: 1
-        Timestamp: 14.01.2000 00:25:01
-        This is a sample text
-        in a sample note.
-
-        Number: 2
-        Timestamp: 14.01.2000 02:37:40
-        And this is another sample
-        of a note.
-        --- snip ---
-
-

You can reimport a dump into your note-database with "note -I " - Existing notes will not overwritten, note will append the imported - data to your note-database. -

- - -top

-

Security

- - If you are using the MySQL driver, refer to the mysql - manual for more informations about security of mysql databases: - http://www.mysql.org/Manual_chapter/manual_Privilege_system.html -

- If you are using notes proprietary binary driver, then - the permission 0600 of the file "~/.notedb" is strongly required! -

- Additional, you can turn on encryption from the config file. - Simply set UseEncryption to 1. Please note, that you need - to decide, if you want to use encryption before the first use - of note! If have already a note database and want to "migrate" - to encryption, I suggest you to follow the directions in the - file UPGRADE! -

- You can choose from different encryption algorythms. The default - is IDEA, but DES or BLOWFISH is also possible. You need to have - installed the following additional perl-modules on your system: -

- After turning on encryption, note will ask you for a passphrase - everytime it runs! It will *not* store this passphrase! - So, don't forget it! Be careful! -

- Once note have encrypted some data using this passphrase, you - cannot simply switch to another passphrase, because all data - within the database needs to be encrypted using the same passphrase! - If you want to change the passphrase for any reason, please read - the file UPGRADE and follow it's directions! -
Someday I will add a "change passwd" function, which will do all - these things for you. Someday, I said... - For now you can use the "re-initialze database" functionality, mentioned - earlier in the "Usage" section (at the end of the section). -

- Note: To make sure, the encrypted data can be stored properly, - it will be uuencoded after encryption. -

- Note: *If* you forgot your passphrase and *if* you don't have - a backup of your database without encryption, PLEASE - don't bother me with "helpme" emails! If you don't know - the phrase, then the data can't be decrypted. Even if it - is possible - I am not responsible for that! -

- Note: How does note know, if the passphrase was incorrect? It uses the - specified phrase and encodes at least one note (the first one) - and checks if the decrypted timestamp field matches the following - expression: "^\d+\.\d+". Translated from perl to human: - the timestamp must begin with minimum one digit (possibly more), - followed by one dot, followed by minimum one digit (possibly more). - Chances are bad, that a wrong passphrase will cause a timestamp - matching the rule above. If you have other experiences, please - drop me a mail! diff --git a/0x49/contents/version b/0x49/contents/version deleted file mode 100644 index b0f3d96..0000000 --- a/0x49/contents/version +++ /dev/null @@ -1 +0,0 @@ -1.0.8 diff --git a/0x49/images/CVS/Entries b/0x49/images/CVS/Entries deleted file mode 100644 index a2d8974..0000000 --- a/0x49/images/CVS/Entries +++ /dev/null @@ -1,14 +0,0 @@ -/anybrow.gif/1.1.1.1/Sat Jul 1 14:40:51 2000// -/button.gif/1.1.1.1/Sat Jul 1 14:40:51 2000// -/gproc.jpg/1.1.1.1/Sat Jul 1 14:40:51 2000// -/linux.gif/1.1.1.1/Sat Jul 1 14:40:51 2000// -/msfree.gif/1.1.1.1/Sat Jul 1 14:40:51 2000// -/note-be.jpg/1.1.1.1/Sat Jul 1 14:40:52 2000// -/note-linux.gif/1.1.1.1/Sat Jul 1 14:40:51 2000// -/note-win32.gif/1.1.1.1/Sat Jul 1 14:40:51 2000// -/note.jpg/1.1.1.1/Sat Jul 1 14:40:52 2000// -/note_be_small.png/1.1.1.1/Sat Jul 1 14:40:51 2000// -/note_linux_small.png/1.1.1.1/Sat Jul 1 14:40:51 2000// -/note_win32_small.png/1.1.1.1/Sat Jul 1 14:40:51 2000// -/notes.png/1.1.1.1/Sat Jul 1 14:40:51 2000// -D diff --git a/0x49/images/CVS/Repository b/0x49/images/CVS/Repository deleted file mode 100644 index 45ba545..0000000 --- a/0x49/images/CVS/Repository +++ /dev/null @@ -1 +0,0 @@ -NOTE/0x49/images diff --git a/0x49/images/CVS/Root b/0x49/images/CVS/Root deleted file mode 100644 index 9c415c0..0000000 --- a/0x49/images/CVS/Root +++ /dev/null @@ -1 +0,0 @@ -zarahg@cvs.htnews.sourceforge.net:/cvsroot/htnews diff --git a/0x49/images/anybrow.gif b/0x49/images/anybrow.gif deleted file mode 100644 index d7c0e0ed88252e7064a94df2b20054f2128255d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1286 zcmb7@?NibR0DyllyeWqhMG&&W6htLbvs?CJ{LE7#BQjP<(?J2^)MfM{nl{8tpbfDy zY-fhS(jv_+aqHF=#58f!b7n5L>V#^iU6yTmrIl{|346XjAD$0S=BA9*DKasz6qo^k z(a}+-)9G+H8XG+pi^XU(YBZX{!a}9eke%Hi5?x76ZOP2^vRHQ*j0+%m35M^0;9C-D zj?I3bl{KqWj%hRtM~)1fIrDDFV0e4}{5!S!zC`kx&tF)zYL-qPjf(0`N%>JIv4^;+T4H0bLeLlpz5&6UoE!u}m`o;tKmh(f><`L^7A|Jq1xR^pT3w%A?JY`z zhi>6%nlMR?md>S<#12e4e{RBAgf--@8n=u`wx zl`*PMGNPjO+Ht#A5SUuITj;XS4{pVTb9vIKot_%~smZkdu7V$I0vkV9oM3E#;y-Py zBJ&3+g={gdC=vTLtpg?2R=AgOo5`x3`t{QoqXeo5>ZlnVYPu-Cpgr5L6SgsA_jQt1eccB~6c4 zRlg4UW8=xao88rzfM*-TV@ImgvkNI&E;LpDXbFU0SF*V3_hR>0T1*jkK-Lg0lBM;W z+84RrHBa*UYU#&Vetq<5mERB@7==UlonrA-=ymb&ntKlkRFa-RBP!j3EVD{Pfe zH|unT@~#eFVgwthvLeHi2#l)iNuyzS;;HDP!S8(zk+-c6OJXR^a*D`mKoR5_4x~xZ z>BiCRz(X=kC4Gij9Bi(_M%+7rVDDa%Z`nf7CL@Z_5r3hA^w{rM{+c2b9tX(cg!@-Q zI-{rxl65Tt2d@)yKcQ9tX={k>`SoCU0ZA9gAi4Cb&Lxj`qKF56$&QS5$_F+FYKFOd z<`d?20Wsb+aKK#*k8H-rtJ??83UDAQ^rv(Z z6g+;|1-+T8<@Roc71_`v-E68%pWGIVW1SizfK0124II>_H<#tM4b7BKIj5TY(Mczz zhl56#TwTcvO8g7A$_oL`x(kRRNmkkgYB8UMXrT3X6c%l4P-R;blws)C{- a&Yr!+EAk7Jr3K|OwVb0mP+SB6YySl@6!3ol diff --git a/0x49/images/button.gif b/0x49/images/button.gif deleted file mode 100644 index 244ed012286b28039ba5976c9aa44ac86610c305..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmZ?wbhEHb6k!lz_|Cu}At9luscC3vXlZHbqn{Gh7mC1_lcp8XH$}Fp3yBJWy<86O@YC5YgDc#Kt3) X;L2Il%*rO9G=-&m%le}Y3=Gx)D~bmo diff --git a/0x49/images/gproc.jpg b/0x49/images/gproc.jpg deleted file mode 100644 index 1b8730ce90c81c9d04e562142c079d37d38f6dd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72417 zcmeEtWmFtZx9;E&+;xy(f#3|T1HoNG(BSS2?gV!U?he7-JrEMy-Q7d*0J%fn@0@kc z&$G_G_t)3cYjw};s@hLI&#v8F)zg0#{%ioSWF=)J0WdHC01Wg4__GWU2OuLNA|WCm zBOxK7pdi0O!$U_yMMWdV!NtS_l2DKXNyx}3X;|nfUo%mYk-gzzU}9qjfj|`Wd_ue& zf-IaMj+aJYP*70NP|=9c(TO;y$f!8}$J?JC05&qL791rU%xeHFHVhm#%%1@O85Ac1 z%nRKA++bkg;1Lj!kfBx!EC37~EF2sH0vawl5-cJdv>?=qjetXih|7-m8muyjPhglh zMa{vfuHonu5TEpU8i@wP#Vw}k?BW`fkeruaP+Q+XEB;PZ&B)jU68NdEmr$Z_W^-#h zxR6fL)U5vkIi!dO>WLVN;br?z6i{5Sa0u{F6ALz!Nhk^=co>9#nV}|ZcpNHrRa`uL zaD3h*f{LLd2WLR<=Ea{S02&+=BsLs2Km^cq#Dt5sP?=duBsn(3bmzlam|Txh;1NGa zz?)!}PMRP?v*&o>QYjCI*28YY&#=?mWS5(Mx5-k{|0c+3FJ|McC{=$1pB)|imoV^EM#D{ zc{;DR$+r$kSRtMizJFMlb00kYbCQoElETC3v`Pb5)jPv zK!Uh+XJytyM$a=^&^IYB9f50}fJb7axccAEiz4q2yp06@bwtOwX>vQVhr8pzqynDW zoX@NwU6_!Iji3KEc{0fR8TKDXkigR7dRYhN#y7!FZjJTbYVH)haUQ55-KUAyzM+HE z|2k4moLigw7GH=2QC?!N&5b=NZ1^F9cbK040GgC$A1H`o{^KM_{NDio&EVfy{C5og zdyxDq-TXVv{5w(qb4B?dTuD@eOq;B1^lFFewMYx_>bhB-4dK{aT={wWd}di4n$(U2 z0C&Qyv?f#DaZRe(t=B>;`CcDn-a3V+qh{&>{aY_696gc*6h28r4~1WL=JPR1NYS1L zra0J~EOHo(xoAIvzy}NNi{>Z#)D4YZ!~q1VT}B_xD9|sZXrj6KB!RyrZnyBHBuKN-Gi^9<&%YZK6#Q zrR_6YYRIaQ!gZgS8ynoCF0hWM;0f-{p`Ch1`oS8=I~?R9abu9%LaxzZ22K8E7laaG8)%=80>6r!WESl9>ZkA z;+`PDeM6%qAQzCTOOWVi*(JTq$0dYL!%>eDkd`IrsL@YmKNB|;8mBw$6$j$3ZI?lc zSYq09EE!wXG%MYq!?Md^<+z(`^6lwkDsj^(~Gm#10wH!UsavN--T?F$>DL!`R%md z$`Q6_5;ubZj!Wp19f5Va634~^9jS`y2xIi;sc#RpaPa5x(bk!d1?g#i=N zV4F=M(LVr}39r?xNbas`V~6yR-f#h!g0#`Gg(G?PmZlwDIAiOeYX3@d72nTaw>f_( zH9^$UAFU!7*dENd>(s)DenWbsM~|4M?cDU|NcY$#HCQ~l5;|BvFE{_bumX9PeU(x1xvg4 zg*%@+V8RAY6eF>fS40wD{M^j-%})Qtn;cx4+jW=+D50=vtmWK9jV2CR9Z69>mA-uso)QDQgskd4Sd!h7zq%V+Q~Ti1uS zbtj)0ozd0P9Omle2ZP|5r|-Q(WQ?I}BPaTh2u@&flec1IvReAxE(>XMOTXe`nbw3T z)nb%bzGjW7mwX-K;w{~WoS2DCbuQ-80c*I+bFGC!o4h!Ab33hHyv>5IrDNO(TT;bO z=R>-y$RFLJN+Zs5s>dlCLIQrZ~>z zdewBielS!gzcDvb+}+eKR`y!V3h&5Ub-kXl&r}v^b$?&xA`CSOqN-M^Bn`RROcI`bE12XafHt>aiqu(fqOc45=!c`IR!#8-;4_1HW=DEtir)3r z+(>_KGrM@=_mc2e;?l0%-!eQ8lyRF224ypFk4!${7!<(|S>SW6-?%(I*M*#SVkqc{ zg!Wktgue-d2SS3-t~r9%YH!}uujn75mD29;nwK?@U&q#xg`!<^|FsO1|pgLRy@ zw?xce;R3Vgztp)Y`>>F1QL}6rGU4R{bsM#FhhyJC1>X^g`Hwr=9e4Y(zfQni7 zFz}C&=-p#Sn4UvBMLR@}o1rf*z9Qa1d_f`kOGmIM_ZZ}eEw)IV#wQ9p?ru=@H?hOY zmjOQLeP|n~d&u-J4JQ5VQX=|czlF~+MZ%ZxaneZI_4a}*%AEMkru$`aC_mWWYR=V4 zg2aFMs6O2&lz0SFwtph{9T+>W7mQ4(KK zRVsj$fj)qKjt6WpZ8$fL4i&>!)}A)^S{SO?J!AJ9w_vKQuLxB#U?_MfVwquwKLE8- zpF@g-@^ih-TO8sQepyuSt zA2TL2nC6ROht+SNB-fVouCK;~W(X0u5W3v{3O=m>cC_IST8qDDEMagsoFproJG{lx z*_jb8QT{z8LJOLni1gi`csbSBm0bEM^Sy%#p-V}8sP#&CmC08Y9z+f;ILGo;UOf;3 zPR%ADZw1>-Pp< z(6Z9!H;>>6U&Rh%>U6ng>1z=J0opZn6yFWpEA%4Qe2byRtWd4GRV zn8ojM`v)10Syvfa@*&t7B60W%(^G1vXm#?R1{hP5_r>p~qe?0fvR3h*KmMi6rgJnn z?{dm;vZ1vSVP+C0Z2-XQNaHU^tGO1_7~c?;`~}5^jTkb-2|zJ7 znrjkC6oc$A3)SLc`>i(F-YbiG5UIa(GhEW|&@!|$@7VZ?g8uA-Rp>=3ojQIFaVR6N z7HN*kjbYK|HDwtazoZz+f1-J?>Q zj?B7bV`Qg>WcPX{S9WW0Y$#Ga(ztmDf21K5ndBel_CG<@Zbh%bCgUV_aRB4jc;2AT zFvpx?=2DX78oU>X)n4d3dMgnBjvX_@4Q&@m>D_luhw11$i(2l|ySs9W`9b~wigSO~d#i49t3)SSvJDF5jkux* zhH~|7L{CmsYx>ZUPx^vown!I(GS9lNW`w!z!(~=&?Yr_`D$Up|D2VUGq@}vV#*R0} z4{ohFXOzMzI+F>x#!uwCxLnQ-QP38n(T4OPVy@?ti5@wUFTE0)drl7>9R0~4P+{+L zjTxP>m7?^mX8I8}j-sNu7BLjFDG8KK)fvVY6p8!$8YwDcD~{br#P6@egHbw)!&e4a zYXcz}m`K{Mz_$c9l>1&4ekp&=;t{Y=WZm;-cSVyV-U3sg0)rjmg;J6e)b^~wRaH0f zM5oSiTJqowI-5n?{f5S~AkfzO)P(zD7Xv*+q~vcKi}@)i)%k&S=?TfQo?**ON;{`^ zW-Yp;*p7K*VsZWA{qa+tk6E2zZ0%p3gkI3cuPPlLc-ySwG_4{48wv}B8_-VV*`}JK zf%Kh=3qcfZIn&DS!@jhvkW5~6<-0{+T5BRp$&Q4Cb>sS4DqA9g9ha1cegP~~GOcXR zi92XXdI;v_3^|8Eg!VhN*o~y@TXQ2hwKOW&gp@3ht;pN@0C%K<(%doLJdy4RXv+*d zZ3feSJK>^^=kC#OiI${3<`~GKdypN;$e4#QdeXOuj_^Sm_v$x%)lw()ZCv5kE(~!!sNUYs+cX!wNxej zjrWpCKD}9Cd|iirO5knUyTYu==j@FdATu4UnC?_?7%cBT(qW4&J7Ns>c5c)w^F7bB=hS&e7W%&~xc@ zM`dQQlQB|rD`&>Z;wC^1{9M3krw~%ga4Yrj6*DSjD}hWjXA@7D!#+X>ug>tgp`tV- zf^ulB&x(2aYjmUW5*e>cFhgJ}>LtINPt4c=5nV?%7wDz96e|?+assqod%7y9u;?e+ ziA;MDnI(hJ8MK&px6Wk*1u@T8+OyE>2u$b+a|(CDBH@fq9!-DqY+rc?2RzgQYhr1Izv4)JeY;P za9jpjaDRr8+0t1^Ox#?HFWP(z62NkLZ28A5jX&V`>TkmbjKELR3UYW2GtoZkA#bGU zEk`zngjYa&wL|*VAGqt}=`r(5E6R(COoap$liy#uW>#3Va>MR}CxTE@a^#`G2pt&A z!fAg+Iv`=Yr}-S6SAxi6%2x&_af0!wX^enc#nCH<(!cnXaD=S*u_#p4TV~<(zupzK ze7MAKFCSIc*`{JZF3G=vS>b4)0(}`7`&#J0fY-GArGWCga2+q^{nJ1Ff{Yfz_QfRp z0ce>UMMW4s;v}w}oPZ;&Vv9?CpY0>wBj9^w&h6!6Kzgi;;(##p;soii4TtbZI0e?0 zWg(X6-vay(hOmuoxnN|}myH~=TWOzkCQL5T#BRpLw+rtYLPEN3So3~Pd23H$9vsS| z@cV*@0|PsCSCpViI2s9P= z#OdULYHEp=yxEG;#=nE=*b21T;pj|hmJ&moH*87tzDg2?R+d?*0Iw^F`JU5%t+csC zeBL6uX<1edqHj%&l&DvBKNMzW+q|BilZ81}fR-2{jYQXQ<34Lc>kobJ$MCo3XxyDE zH2?7O!&EytYzzOocUFVF3Am<$mrT;IennaCaI|4#lJ~RDTie;;L^RvxuV?Mb9wW!v zssWS((#?e+|97+w_}7~Sg(J{pb}N8QHzO`hW?9Le>0;-I9~?2tUu3_(g& z^>*bRFpMLFFbuo!FLBZi74IAqf(D0wS{t;m1B49*1i4dPY0l8>MkIVZ;HvB&D8KQV zQB5cn7Z-AAg3Ik~!cKre5qd9*vV*WLy z>^}dfEf60D6h9EO$suSAK^(&N7RRc6&Ug;j^XF=nVi{m@kG?&aLF);N-eE)XH%YjLuZ%Z3i5Clf7oGm%hl3wb%(o)-afJ?EjfF}? zVnzA^XilJVu0xuUU0BjHvUQSdLR!&G{W~8=X! zQOOJ>I^XmATT7B-YXRr+2$h+@7DgF}8LV1S! z7lq4Ne<_J=d*V8dhpc}JDnzF&m1Ygqe_OCsck^rR-b_r6edz*wd$j(vu@Gid;?|TK zY~?R*-37<^N@nY*1YI~IQGqVR{uNZn#WYBF;MenO0|v?05wf1f?Zh;t*7`$yX~QT_OHj)YDk zG-7n_w_|(MaC>LHY2)R(+=VXPnocVh4SV!xJ(nU?G&&)NN@DJWmFz14+AF1CKjV$= zFK?$9k7yx+fk^BL$#FwMMWYx^pZq1hKClQmbetO-;o5SOPwh7?VBl=*X>Wv)NnuH0 z@e>x3G15DhefhoTfh>4zuYgDzkF5I~Dsn7d-G?GlzR}t-AbRH<31I5q! zU(VBZD0gr4;};Z(ndnGTjlIAA?B@#w*?yn=_)VMoBMt9jbLTHyH!Nn4e$zmZ-&Sryx+4&s z+G%a(r(YaBN#f(o+U@|!++}(@S6;4JtSCb06a>EWN7x_0tG~LFevh$3T>V%G0no=vdiZMF*4e{!&Ozz(fDKMgDOfIH{2)1h9?V_`BC8tVLkR?I zQ&Vggr$kj9EF9o=kX{n|2@=;58OdZyXznd}&NTi@fKc_84Y!tl>8^)*7_;CuG8xv=q)U{GG}cRm+*sYVUjjnDoSk(UhVl5wi8`q>Jf$OCfKxBnk%EoUmr+ zwDdQ9xgX~P!<-q_KUtlCCApa-Su0k5gT>yFp*yAgCH#3KPK1kfeYFEZ(-D?H+KY7aqNlJef#v^)%1B$voCKbDBY(aByZ~}Qm#e) zMP#UgS-pkN+STWaJGmpf@E6@JsYgN687pt!x8V8xBXQQbO3r%uqp^1q(Px~N-ZuwK zB6%*A8LoZIeq0&X)fyOM%5mW2iuDJ{d&ZR(Z>P?&U3_MQF$W80CQja#pXMLlV9!eR zqj*j z2S2z4X=r5ejx9AFs1y2nF*G>Nj#i23ZYQ>8x+Fs$x#G_1tMdMK zjaiFZjFfxNm-vj^0EI?f`}vO3A{v%C3h`XP52@qkjh->UnNmp?yc%Zk^}m`D8` zQ?F9xgBMnb1UcIuW8Uw1@O~k2M=@=V^h^jsEG(#s$mf~iJE7}6wR-sBe1`VZ_ndYmCnERH%Sz+^Gy#(u^MvTbggDY`H# zH?x$4+Nwnbe%>+&tAXqC6D5MiXak+0~y(z;L+rMO2H0c>nx784DD0ft8TeY&I(M#;^{ z-QU&6_ZsogiV73*&C~Q~cAIMmEMWWAqY)Fq8xt~zltsxs0EyKN<;w@%CiILY7~n(^ z?7i77k`z-p?BuYfnON zeEOrWXC;1=RqmVJ!t(jNZ5(EO4+t1(f$clHaA6>W(?UIC?!jOz9bkZI`fxrcda8s! z)8@&3eG<^OH`s&WUx+?p>w~9TmHNcgwV`Nh%D%BE(E$VZLmQb|4@@AgXgrr{RhDXR zsqkdd`#}~l&|be6A&}{KkyA3k_O3yNWA5aPokM=)xyMVX=MY=tT272wz^ zDDek?Qw@Z?ZGg3osll>7^xm|Yw>(0onP#Vfs|u>r{0jaNnt&`=EG(jH;)-TC{PMh^V$k^#is63= zYMW_Q=xT`PAAn|Tt)elDh2R7LfanhZXaQg`xduK&8Jd&12u-I5aybmCpeeb0#>WiI zaJpPb2T(IbVOnd??bPyxvm~cykOcw#xnD?Hudpin@r;`yaH#4D?6pSC?ajbJUPK+gOVSxYr4`~i4=nlRAU_Bn^1A)Ay<4JzV)-MNmP8rVtJFfVY>{D zN|3z`WvG#GM9m*S<0I>hd9|AUhgu2=Ex)B_!rz?pWw}_NDF64ni*LlZ34w-qH$-Y4 zx+XAJ@%Ou)C~(I9<@*GfsWOmo)YuHvvK$?lAbqstEF7qrgI0@qH!Hg(NuiF3KK%y( zmgJ1?IW)mmm%JboWp?KgJ&Gu`sJZ`g3=@)#yv`ImLSe>zAIp}pG^EH+w|V!O{Pm(6 z_H50N^<_HW$8BHI!Db$e$mL~qc9IXZO7YivLYzFG@j+bd1IqzvV;le$7n1DHsIHm> zrv#*&A5?^ZAbd=gvM&kNvIa1wzgiLmN5|ll$tGO5-|)-logfVE_auw}X+0(uW$!I5 zEqD5eMwczO2iAUJ+tE^6Q92iKJ8}RP_IToufcvnz8z8ooSDvp*I`4ES6ll19&Vb3! zM;E*8>7oKf9k4>Vau4P*J0|lnMn`{)8CNCYChyQ#rw+N@EBb2ObBVgcEKSGl%|#tOT;Lw9{7o?M&Pq{&dM99SNw?S z|F+AWG#CTN$tblz3g>n6S`yA}ckqD%Yh#C-Ra!ewFm5H~j0I11>!Z~#g-UBe@)|XfXT|yX}?!dfj0XVo^i_OUML$3 zaa^R0&s?t``x_y%scc7!RlSVos&J78Dwa;GZ0yzI@2vJLI^-GHD0&*#HV_ z4}VFymH@N*Dtd=KhSZ=%wLP2#VOjkK64@ckbMCogq(Yx??G!eyq;3iY_(G7hCjF5p zKz>$JKkOp0dxf@c9EAw@bHBNc8!CK!oxFD=Y;iUdWPZ^eIrZ$g`bA|w%pUlPbb<&* z$P@vtK2`I*cQNY#`tjAH72U}*9t=xy%ki2(qYYP~l^nS7YL@-%nVQuO0r9=po!;_g zY2$TA%&8)j4>AVS%7Js>QUj{YOa^bsg6FCQN6h%N0KS5;tKZTbV`H1f`f?=_J8o72YkgI|>eB_I6iW^LRcbvG7vKa}uUAb; z{@3>fzf}bQeKN$B%(qgmmDbp$(xhqoa)(~IBLaNEX6QQw;IcK5#y5*AR7>0$YW*)w zz_0=wFS3(zb(ERJ(AI9*`nJ$%L+2@$(x0;X(n+m!R{R*xW~(V-cIR98e_Qb!7byB4 zZyz256>Ir2_jZ=JTN9vHKvc6Imz{bj= zv&pzk>*cRH18#jtW%(xe{hmBa(YbTxt<6^%=S(}9af$MSpG2$Nyhmlfx_Bw=>8;Z_ zq^MXi9p-kwwn}`P&;|WkBjjlgx_#~Z2e5Q4vY!t|9Pq(6`~$GQGdLO7FYc)SZ>dp~ z3iWWp+xLF)R_0*SP zrdq?ja(;7-t{WTmI<)cnx(s3t7$Z#F9!p40$SFC{KwLsa?RVBHSw{rpVZP00KuDYx z$uF-x*cJQ9Uc^$LyIg>Dn=u9XrNuHe8T9`kqVup?$4FY&q`agM?78G!z>`8k6P$G@ z{7r-OD#$?<(ZsHlG@&QdN;a92S4To`Z>h+ni~J2!X2rginR1uW6ibSfz}q_)yaZ9{ z&ND0?cfCJ=cMn#X{K3E4WT{H8v$1j;rL?>faVDf^7 zK4o1@Vvtso;jNDK-*Jbe-pMOa9Hcue(c^gFvt1yk2hwd{QTvDatk9mFqVW8Jwuv%? zkq5WOZ!3~-Z}fS=6yTbq-h+9NQN0C*S$aizhIMz5>G+)xbuDKonBLjKPFSUQIyQ~R zU?65+S-USH{h3H-As`5t2R9Dh?vvc+b%gv96+Xkw3Z3wW$t@<>a#J`_;xz@JlSO1y zWKDZvfwo-$o-~9Pig@M}`4->N-jSE}r5fHjN4KI2wRqxsVV$sqSIxyF_dn3xPzJTn z&}g06USAa1afR+)Nh1aMVx4gNvzg`>(~w$Yok+7Ck@fE~8s9?8hA*5VdypG}4{?L( z-7JtNFT9))c$_UzbrJBX9A`WtT^?oWHfNX#LF#*tFkuE)lu_FaueV1a&zZDDPnh7) zA^2aR%Ap_*AjZ z;%rB-7eEOGBasAqBjk+OiI}j^)jo%zgHSlk*jH*H$_9Ikww^o+(?6+O8+hpBrnR79 zvnqmvj3FfMi*@+Kt8{ispa(>%{0a6{LQna4u$W}2s9A_Gb;Nq=wW zM)!Q5`_LQU)dgnzr(44$m>ws_kARsoorRFi1?SOVbYA+GMIKRN+Y=HOls+gQ zfSO-8NT`Z<`>1(i&MH&O!JiaP6nsg=;5a7L9G<0JDZ`AfG@DbGk2l5DK7`J8d_Ov! zWVV(wPD`e0ZYIdt#ed9(C$%zn!?Zw*NoZg)cr?dBhQ_URlaUJ- z8|{Kp6cJ1ssoqJ~Ol$3KK=DP3br!M5Al-o-gvH7fF-|iAU9&ZRHp?*ntdz3u^-0R= z|9UrA&9o4kUmrh#Wp>*BZ(~4wx&iqY>-< zD)+5e=9=#g-|U;%vUn9ZSZlM$Gy`yJts>gOO;%LqT8jpU5~V>meW}fFD_xSm|6YYv z=C*KXlN`t0_I;nieoEDMDR}WV>0Avz64s6a^^oFwjTT#abK83!$99`&4mMMPALn|b ze1Zq_dIE1_7$93%V#8*vaf*W`7!4-83404x62Z}D%vJuR#~_; zMah_eMg&*hnox|GV7||FK=ck26Ko`xq;U?GsZDr$OZZ@HOM>@$q^R~zd9=~olsT_Z zh*0xqIlb?m>|aR{3gS$EL=uyX-gasipHLR$t803E6^YXBD6foB+IX~=6i`$=TsdgT zc1Rl)_Gygro9+-)n1?dk!g%)*%EgI2Yl%mO;DMI4eT}%)vce5L>@AvT># z_XjEF+@#dKIMeTS`c)J~CLP;-0sY6KhQ^YkvyFM<*3q9DK9V+zI~td0BXd(9e8K!} z(Dw&m=6TJvn}L0$5&BfU=~pl0nGS<2_P^heqz)=>z-IDf?3&m1(3QS;%b~wN%n00S zBp)Oj%yz=#+pSKGvcU;Dwr)M5z#hq_Gg#VpRDZhOEfOKhFEu{0WPJUxeVsIY(t$;q z(n?(`!;z#_-?)$&gC^?N0Ow#F7(zk_y^rn#`EJ5{o|N#xtQq4W*dE!I))`9cTf zuMu-obsrql8LhNPmYcM-OB7M70EU*)F(X?WBqTs*$Gq=ABYCp9llF`9d7`fpf;FS< zUNRP5IbJ}Clk-<&IS60BSgw;(MNGFePW}KC7qHhz50g^sUL2C?!lfbvW#qZZAmo)P zgsIMjZ3}>yP&_QZxBnwr)alTl3j|xvA5T}kJma!WV)`68shlw}ZC;)UMZ7(O#LQ9T89vlfO3XOH& zsws8&hGKJPpjYGyU-76s`m~-dmI&9Ct^dVQI@qI?hnBCh1%Mh%%?mf}fc2gSu0(=! zi1$jz|5(O*F~|k+p;&j1AL9+sNY0xK+u7O*H^ch)D^VBN~ARyg$pjl-2x9b(>;`yf*Y*; zWg_ekIv`AhX^y~E$T7o)u0snlv5}oj>sB(GTXYNE_LrXG2}#|vN_Dd{dyN)&7?L|B z(F4h5mgBATDH#$3N8%Z!}1e2G!cS$YLgAG1nIaSLrzPR-)5| zYjbampnFTDA`aRX5Ra`vF(h1x^#zQT7sTzb`tmgbFBXN!@O0Lg4G}g6rpU~vuxnml`+^dfkbAy;Gj>gU50Gy$oKX^VyDzvJ5qeiL;!)-Ny-pACiTZ zkmz7r)SYZb?ZppF^&_vt>LRqI8d7)sgc)QUZ1W-6C>T5h#4=QqA$#-+>QR=qKSG;Y znJ8=u2595Y3rlTDOG-@C!u)M))8FV3#qG_0z1-b1`;i9;7}1lteAlc0-QCK{N&1Lx zR`xNV=@;-PY3{zDM-Kl6U$zp^cf}wD(n{v#=OejtyrXrs5#BH^t?nw zq<8R&?v$asZh+&4mJikBo})UG^7nbPlfv{!e66|?-{AdS=*19*6vA2%H{psbJnE(J z@ff%bD`H-C?&2%H-;bRV={zm-E!m!i&k|u z51nNE0eF211y;{oGX92KIy5dF^SmL6$$mrGUNitt^t4tb()+ga45t}b`C!HW>sT$g zVlUnvQ`L)Q;=*O~D_D+Lk4GM;UJ{L%1!zYHI$JHMla7dDrOtX?;+jqeJyHnRM z@V(axt(}0j;5EL-9{>hHt6^t_y~&05Xzl`>7nDMFMFCxVE5-}{uWaIu-=EVNe?1d1 zXBdQHAkQ{!h@rV{f8JS4(%61vlegmw3w17gTRA%%xLivTlyv7#S3kbz-m+yE1iV|L z%1D#ZN0J8hz8PW%K=P|^>lW!5Sh!h)P)7K&;``P}U2+F`uRlH`=<}Z|;(OE*s&@!` zzs@(;?wwL;99&ykx3F-8-LJq~6{66OY-j8 zh>g&JkYE;UAg8B8y+T_M#hZZmb8kJaWJA4Q6DzQ+Z_9Tajis69=P+KpB9Sg!`sH!t zfjgf`w`uxqdYU8Sp(9|A=s2qlN0Nkm0!|#>MEiqeC4Dwzvgv?iYZUlJ*3q2*bhZeI zGsH#%gZyASqN;V~)CJQUGrlN+A5n54oY;kOVBXnjkDvb(CXekjx}c~(4a}_ZZsx4e zR!AP*_l$3a3M&nnY(tI&QFl=ypvf=|!spcV#3YLS@`TyKQ()qCm3Vs zyc$259G~*W(m1SMd#zhghJQk$J-X-Hy&m*c`wJLAg6IS~fE&mSyOZ&my4nsoN>~4R z3OVbeOmkKG2CHK(mF#Bf!a)IAy}$4jJR0KMtY8Z01214zjeJWMiR(;=p+%mf9dDoz zosX5Mvw@za;Abp^8k6tc+v9urnJbs^&o#Rv?>3u8SU|!{=!24vO=y(v;8|(nq(jo- zMCoB;I6}h|LTA>#YY$&9H54lyjd5};WmWzL&eAe3NytoHGGn4@}q8o>HQH1Q& zr-D2-ZvbqGRZSbId(xuZkgKjp!enFa`!(pRGFsu!_@vt&mhC`$z^u`$Ob37mTCxxX%*r@;ZV0WB9%Lg$HPH~@3&7iJW|-o+lOfci z)AihmU~t*KTvmCiJNSQiBlu` zAsb3-BR%8bg2#e)`X7Lf6?#V%{g}Xtw6S~CFI`>5bO)`F5>oDaF|aSe7b}Gu-ZhZw z@6%H5r6F=AzbY|TDO6{@;tm1|#=+kEfSuT5TLz$7jD-hU;KSq04C%OWc#9=*V+|QD zkaRTMIHnnPy~v2WgtRM(gW{)xrlBhC>mf0AT9<%nW@5NEbaMn`${PQ58EHP*Mru-%;-)+JdF1-Y0-g%_f4>9& z=C>^2mJB4t2ZPyf4bYW3FUtDz3>!txc^c@N`zy%iNM4zug-Ky_tAe8p>Dj!eZ7wkYVuce{ zbBlQ_*n`5pvYp--d}Rd*flY6Y6#{eXA5|b868;r+$btk0^;?tjQ1_d`gVd8VOAF`J zEijUJIycs4DKk7)5JfjnINRzo$z7WIp2S;>D+SbbhVa6g0XSpl3hhI(zD+OgZN>ub zr8zJ&x=RwKErK50k!6ALZHUpm&<6TJdLmtKIO9 zrEgL1I8{$)@0fFcmKzezhIlw5p-mMESxkI`?l0ots~C=6MxqS>Y7T1Dr+k*4+@F>y)` zqBiz$7OyOY4{-F&z|>-DV`2>X)OrG>^8FPD!;sJFW%M5u~;hSIrbhH-H7rYmAP`fEse zdxo1Hj7`TYHsjv~5$olwmq}?hMSXAfxgft%zeUIgd^$`Yo%;q#UycS@9I7_y^ zz}hD-!Q_(?(}&`}{phDmzT|A=ZW}hYU6O}j)Ndq8!axpoJcKS^Kh4C@bGqNo^&&>bN!_Kv@;s-d|m-Q$*RUW(Lb(6w7WNWnP0k!T67!q(yDh11uwCI{nHl zsgx-~KUhycA(LN#>5Ja>i(gsJ=;A&7xURSLd!>f^17X>S7anW)3)3mn`9OSb9I%H0 z2>;1r`AYln9VXqm?IQ`LsP=}=M-nkZvR{u&0Avfg)7??UaNu?X>Bmc z6{T5dL;i}wwW1Bqy2@Rjd-zSQ6|!xra~r>^DeZjcBYl~?QKF*hQv3h&N;=k*L=R8$lBJ)^+rX?9-Q~||5skm^ zwW+dtf4+l>py#zP>B=RqJMz8Z5c>nz z*8KVhu=(M$*1N>@U2pNFfHm2P+~6xM6IfRnRATLZj}WyaqTtcf*{=vTl1R?U!^}SMKta z#M3R|x$*$-2tsgCMw-O^J=(f{^RpX&n8CxV+VEzKBIgVs05`N<4e9ym21)Ud3$A|V3Q;(Hex?X{alC$ZwV;MNl86#9YMX1$ z_d^(F>Vn;Z!Lg1GK`e41O}#w{x>&B!&TUt++BSCYVWLi1{ttC;0Tf5K_5BX+5`w$C zI|O%v1_?Gm(BP6mgS!rH86>zRxNC5C_uzv|2oMO6JIQn8Id9$XtvYq9Zq--SH8nlm zvwQE|)xFnV>%V@RfpgNrnxu?{N?M*7q9-!_!L%a>IU_rO&%=ffIjb+dp^0$pJtiM< zReufXgLoDM?cjspPj9j)i)_AC)pz@dA>>wPh%ph>^~)>B$JpBaA`2F0qFVnJy&*Cg zh0&Riu8KEZgdqT>M|2AJYouS0uR9cgoZd$(gi(uxmy#ldMHde0%`MFJDzL~>kAgVu zvw9vWYxF*j+l8P|n+um7)SK=x)8gy*_h-vig&kSH+Ib)Q!+YjF{h%Qb5nc^aWHC&; z68DL^3%_}EJSZ3C=b@S)_rl$YB)GZ5u_Z6?s$+wik&MiWh{9LX5+Y`Eq)v6#p>Qu| zzH6N;_{8#lZGOR(XtqeCCixgvMn>2Ddn)(GDC3A7>g9>N#h&YC3lX3fZVnV4rWYc{ z${jG2|6PyAC~stLY=`d%s{!U40KBBZDh+f@Ce0lHLQaSYA=imIe#X$7yA7xJpmm3| zwZozxOhi~XDqe`h+sS0)*pzNh?_;NTkb1Kt)_zL#H(~^JoL7waJY3M^_n91Udo%Kq zqVdB&S{>jwkDp*u-Pt?IjzjIZ+yVh`u1%WKF>4QRP;eh4)kVM5u(4d`qjn&F9GGY_ zJn0Jg#JJe29Vyq|{`=8|8qqZ@?nn;Gf z&r^SgPkv9|6F)I+2(j7pcgo|RxHdfDFD5mC*F-lQ$F`LPJ(=m*c};53n6lEbhZDJo zaZNW&-`H&{=x)VUOL7`x&OkWgUD$>EX$i{B6nW)f$g2sRxpCV+PPb)Y` zLC>qCbjx?yOUpqf7K{*F@>L*kw6rslby%KW;(aU46V=o8bNUp4w$?gN9bWR2SnkHX zblSbe>0_#A$@ET%OARXBhyrObg3dU6fyalpj-J^5H_>V8txLZE56psZqb}inih%wH z-M;|vSLaC>u^GlXVc*1t>)hiRWiT4jVwVz7Fjj*%`i!(Za@8=e!QsLo`@F(uCW9yf zH45G1W8~{QIo>;v)wIrWsK?3Et`5%AV%cwL8LG#B=fyW$v>=Z4>QEyfAVAnDE)LH( z_{3(4N;dcs09PX!zMG^>F0%$)mmaP6I_#(jpUT`=fG)VL`6nKS;vWi**xjdTznVKq zRg*nWVs<^Ggz5vA(CxF~*wO|iROgAY`Lx4z93J^=XWQ65V$*K-IQns+N=BJ3XIZ4| ze80H02>4Lz{n6dCrG5OX^15=>_WG$SdFW&h$v3&d0e)Lkg`>#O3soA6Cem|y%OswO zHu>-~_F73{4(b}eUjU6dr#;=9#Ei(vcEvmEvW(ri%-wVG7rji&#C@S<#_)#6Y;E2un~ljWPZBBA3Iu_3L2);i0y&BDVK@A{BD;+XjcLAk z?^Q)rxe~QcDQQ~cK2)PbX1DQ(w0Q6HA`F;$Tp6P6S7T$jH{{OhsawZ;-zk@y%szdM zpPQAymBf#~dGIg(a1r#QXnV+5Oh{$+T#}`;r2ZG6Y3G`MG8Ctu?(qv%S+Os*KZ{rG z^Io?OiK}nUWv7y-KOWWiwh%6regT{Zk8D4pQbn7vhhD66X|z9N9{FhetE(heFYh65 zdr-F1V`%;=pYcBD|NZ(JSTo;$P7eS7dHFWA_*G12$LbbWOd+IRnsAnNI0E59uq()L z@OhC4;g!Pos*Loh0P3kl-?+=y&Bn#8E{gi=+EpP(qAG%p@~;p3pjUTJ(Zz3L+QhHn zK;b7p5PktZkNyI%=Pj?j13HPx`e`6)y_$!Z+d|!@zl<$CbWd2|%&tbr>{CZP9~NSB zH0TWzE5SA!Z;wS5efU&-=ezdThR19n|OkO zF81R*6)^qU*|6r%zB|D4)tBG<(ug&K>|EgPWs{jjD?vd~GG=Ig$tO@Y|8*q@JPA>d zl*JF*=2jWPgx^ihMdvY=6X~hMxF&&Vu1Q%ajlx_MhS_P_P8eWSFMzV&k|HBbBv0^umrDm zWOAlNIfKAnn?)93=Q9NyP%_t}m!zBWQ%WXi)L=Zb`nJ~Al_-WNa7HyZQA{S5GKJnF zn%IR9dWz1qd&7L9yis!;W*S-U@p==?(4oNal-1Lb3+Q|vIvq!Ve{*AI=1E(>daEb< zXxve@gHR##xKNE?ni^q;70)BunvdrPLEi5}k96Gh(g$}RM~$wlV8^Gfu7rdxRPPg4 zez6dWXbo{A4lmB9ITm9QxCmbjz`=FSVrP0YzX09t3W#vFv+X{Xu5&e7y>C91ZpE}r zdK>w*K-Bgb@Sz5W?Cv^ht^8b9?P<{24peP;;o$20*yf|@grXoB5WX=+-74-VCb61E z+#v{i*|NBGl8wZFN8ZKW8M+PRQ(J&%$7DE1y`}>hYoyI<n?dWwN*yh~yOXdT!NKt6Piq)1nsL%-I1izrvu$FmG%Z46mnENTe85Io;oHT( z02V?G*gb3?(tb2O3-~Z-ht=Kce14I<*E;g&qy2Cn0|99V694Zu)2@9%o#)(wAd zvSSewaJsruQquErgbH!~>I=K7zcmlI#Wg@0C9mKzx3{!ATl`!>{M#glaehfsQgjZJ z{3pAWi=l~&a0JTs84cu*uE3n692{{2-IA~zna?ETpREm;Kor{KihKjPY0u54W;m&w zZIRxWdz<8ey)#K9IhEIH(cXw=Ugr8wPNEA_aV#(B2f*?oYEP1dZkAz_gs2ld8} z@&uS1`-4nPub5KWVWWYpPpZyM6Q>{KlQ&6J4J`SwjQ&#GhWfwq3?X$p>iRiRffw6w zAi{66% zk^_9r^^M}wpsT?pX+;URZo=ttgTi`aVXMQW2*U}FeB4uOoyfk4k6(50kdgQD);DO+ zrg_Ew7a;H#U?}Tr0(+d}&x6HJEx!PFL^b^B82C5CsmsR4#%||&_s|8k>Pt`GU`yv; z0KTseC{J=ByF@g<0Q-KTcPLNtr#OxcqH)0x;^!Tv#~%#@dj~1Lp(N%~-u?Im(1ewq z@DNOi^z#5_#KE?hWy?-8r_e@hJI_y#pku}*uc14H5idu{r`}%xTG$^`zdTF^Tu|K+ z)dm}CwcBMM{Q>~*hZ`w5{iS(>{O{_2!bTffjT<6{r>HMCu+wUioD3E5E3nnC11kM2 zS8*tuhghI-v#YKm$GOWUgeQykb!Fj3$u zbs5>9?JvOZBJ12-UX6$}ZvX4r;!iy$UXF@?s_1fu0K4T^ioXCbxYe#n_dh!KpRM`X zDfO)$=qT_D&=s(&?mR@ODERo@etzwD)0ZGBVbMO8BPW&DmH#T6^E^Qn4C_muzivf> zZ}6_8-%^O|q(|`sIU4TjsQ~8vV~U zohAu|bi;?jm7DE0zu?}j9))SM`r9=v^8wT|r+2kE$nkynZDy`D!mt~9I8XKIU8Ys1 zk7K~i$(OP)ke*T~4dBm)Q1F*y@?Dnt3kuKLr;1~RKYBRU!e>#z0V%&nYQ1NU)%Te& zcj_;|lsDjier zj;HegzO*g$$$^?Rc!I#=?K5Aa%+(@aO%bWpY7|DG^MvcE$q>H@n}85TA+-dZMow%y zI3Qqj+nAsA^K16vYu41%a?2XdXy9omGexn;sRi8}V-J=w|sbAQEdfUS3jCnPvxJjTl5IS?6i6l*O!wx`~7) zPNX!%#wq|8+OkkvzGE%NCY+*Mjo^rekoQ>?46@m{5*x`!%+Be_3{l56dZI(xjJxax z1sV67L{@M&K}7HQ-Uv3kXxPhvXBCmCtrd=fTG&xN3d_t9!s>N59Lry;Y;6Y*k4(6S zTVd>T&>p&hYQIECE7K#!Y-}NThJF36)?=LhykGhV7ENYTP^VFe=*AZyaOa&sDB&2H znt2x$zJ9^d)ku zgngxhjMj0oQxfEDu|=Hs^+k2D^T9AvimT977-E-c{uVW%5E_ZL>dyGbZ|Hhz>XHFX zx9G@e5u$4t%}hj(7n=~)GE%3vi&ZqQqN7z82}~0-m5>@x!i$u?IiXf#qlM=~?kB6N zSqAiZ^~VFSwSwXWo%NfUtKrXD#FZ%oxSyWAb>C$%5@2(Ge!Q5Fn;15+&=+H%@DNMl z+#5;3vid_wlHIgm0>4+BnuyQMevBD6ozi7%+VOdpI0Y+@u7cvYm@o)CT4DUxVD?JzIj-zA!ZtK@1sH##FgIaAM6^cL;p{Wk(x+zz>OH?E))U)TC`jG#7^ zd)|*b{`BMnwD-h2pj8I#9BFtV-IuZ&##eTt5pBKMWnq#&5!y=X#f^0LDZ?&r#{}?E z7RLfMU$c}^DXL(4Ml14`)mcUE!R6Mev@vhagfQV2N2^u28<8#*l>{Yqz8-}b)J0S) z$e%4`CQBGufreaa?CZ={tS{kS?L{LG33TgQx*YUxoyO*Q zx^SgvUvj&nvi&`FVn6yH$~t~{+|d8IU5(e?{Q@v83sarys!T2BI3{#TQXiLf!Mu&- z(u=(X6*Fm?AbNWY0S$T)MAv47a-S@5Sj=L{g{84Ek}<09ilXa6Yf12Cu2goEl>NEk zEs8P1Fye8)(`L_{^ZnK%oLNg(um(XxQ0BDcam05-QX83Fk5zl)y6?Qa5Cs0BkQb1L zV(OhY3gP>=vvL%2FmmS$_T+&TMiGHKb=CpSYlPBgS~+`js!GN*9SVx-h8&6F6BQE6)3sHb*if5F=(CPOJbd{=17kM_j*gMgH2$SvUuOC@oH07% zS3B43Eaboo6}3PLG*Th($SIDr)W!bD>IDldx4$$*MJ;*V#~AUl*;FPk>D2WL;=nVX zvLT1hO&T)j%icXB3NLu*f^D7j3=cU{Z(GqqB6mt(o-DNC)Fba)X?hFt)U6y~elmCiMCo+~zOk74W@)k&X&O00`P4;) zp4GKdWec@Prk-F0_=5)3uM(0*J&FC3i1kZwQ;7v$Yn4;q@o}&nD!#xcfQ-u{`RkX( z7aOKD$ilv}l5j4PU8tH7wPuBnjJkcNuK2&KV@G3GZ%rbeT{t{?9+wf>8Ko|?ZZ|#{ z#^Wuy@zFsL%{>W2uT8R74^RI_^k@?6=!P6WH{DI$^mOMmpV$dip<0ee>F#G}(fh z5WAV3LYbmS_YZWmxEpR8BPkEzrravl5cWwVS_7o?IU1Td9x(PG~$JeB$IA z?QrmzIYm&z^|5%TJzFilDFDVA+p*kNCeOd@s3PZ_bsv66W+^Yf!R|z7!34DrkZx|T zg8Hv9gmz7}+m^}`rl6B5bjx%fS^PZ(3XF2UBXa6tuaH}}eyF__h4U{-wOy*@T}U3H z{<$6eBz_fLwG>e9fxESK&~UF=Q&xU_lZo2Tycf-?43Tqip^s}zxd%QcDGsW+l|e`` znn)p=w|u8}JXPoM7RUjkwgw#P7WMFau;4fgh2Qy6WW4;qTY%OpBA_}3QQP_WAuz~1 zL|0btiX0{t@I26Fw#PPP4Vfp4-VED+J-CYdVssEFKrvDJXq4KKc6ZwF3$R-IR7_xGZ+Ld;y6va_`#|=;58zYK z{&Q%+{*!GnmLY6jakMe&Ohh~T=ZEo9&$CY))9kQNIpPq#OJ^uOkHJC{e$5NMyAeGQ zP&WQ^aE<+rr!bHO=0lm;rNdC-Y!X5AE_{otBpaAuo1Znb(C@jFYNWDndy~LCHee&5{LaA(pTxm& zCi9(FZqlMqtr2iF?^*N3cG0kZD8U9hJG`4&mlt|EHQ;L=x3Fnu7d0?g5#vBcmLS{S zRpoh|WLA-By}oC5K`8NG}inw(Gf==BVY56F|LT@@I;X2-lLv&J;?)Y5!%SB$wDK*T-*u$w5!^ zIvrTv`^&z+0Lgz|IfWE94Kv8iqFaRY$x{i&#eFGw!*A;e@LTM23~P2iW))N^^@Uwa{~2Actg8R9wNQ3PPst(OW_oO z+cSOl12bbkfGSRxd9(xfM!J}>E@U)7vME8E0l@^TB8gbRB! zZu(zg6uJ61s6Vd5W0^E?N|T-=&!l7GbkOLH|1r_zkI-$`uiwV=yx*SLA;h5O8*SC~o zI1XnARKbciFr;*t?w2QjD;{l{2Dk86nVJ-?s=jU}hA4j%A{Sj_6Y>uZ%I}pRXp&r! zRb4N&*W*z0W4J0&8XYrdu_`0ZH2bY^aZr28Pl?>leT{a~c0|w43m@oPjaK9*0;wg) zQv_{)Zpk~rKGYp0rPCPOfWs2^tZdZXedold)TC;)> zy8I639^qdm7~C~z!9|B&X42E>9^V#mqXA7W7hk}19t)o59s77A$$R{BS3&T5oSRu?N9a(3&XbEeArz;)^Ur4A*KA9Ut507l(FM`K1X` zhkIqduaMCVJto;5e8Gv`iyTpX4Y{qSV$&|D?v}_wPAmwcepX>|j)?jkR?KA%6LI=$ z+e^8;!r3Q0@a)b5X5(1&-|g5B-wc)+N4#Fp<+YQR%}gES#`YD_r*uwernG>Z*@`(1 zY$6w&mwmxsD_$W08^aboP{Y^F$e}V&#=aQjE2qE^q6eIP5Suw|foF%xaAX(=*4bZ_ zE7u5)cg7@G;fX9uxq?EZ<~QDY3Ii;M$g$t3z`0-zo!}5yjpMxWeAyLa!(7fye3?-< zszDd(+VBAgRkB30Pa8z@qOHXNt$B%nCXR5 z1AnTqQ5%7ZZkxm!k9eIDc(*2dGNZr94PF%a?#p2*IHZ_jH*A_EQ{Gf zK?Apc=QNNo12p!npzTLd0MZL?CcOyh4esi>Nlw){V`Z@hPgax_M!Qnv`)ntva0B-_ z*9Tz$mUKiQrQJsO+wqsf6wkL4#}WI!VPq(6Iw& zO+TdIyAQYD%Q2i_~qzIQmj*532 z3}Xg;81F2|&UYTtU{H_+_warDSa7 zG-y?b4uJ`&ciQ+~Q~eZ@JK{UU{+QFdmA4}LI4kS?Tye)(Br#2Fv%0zj#gW1t{4nI7 zg5Rk`T*(!>Sv?wjb|+g@SNENpKgq9x5J_Unk-&*2OjkBiW`vd&e9{OQ zDd49Shu0tNd5H6~I&<*M;xd|Ic@CI9~D>cx%tlTTM|~vLZUn(9VH1H2v;9|E(q& zSBxWt#H{X?{#}}C5lWso9r3?MX477_k1XI;*$%3@t6>U(juYFsiAg^ z$f8pPGs$y@b9khfVRT@Nk$)r_@qij*i;HAo=7#EEo=jJ{M%NGZSKe^qkmxL}rz{Ef0}l!Xb_P z`MH@pS$Ipz4R*W^>N4C^(a6+Kuox>PlB$3iDt$l}k{$?aSWBQE^5S*M_JsTDrfJJAJeZ_lTs@(uHusyGD20m#%aTi2+HgF+UVx@5nGypj-m&606v-cN3Q#!#Xyv0-hmaND!246m6e_3s$pFsL~&zPp%~xv{=`*wGqQ=8h$3NiVbZ4h#H$U zA8c+m?8+u5=YO@ZiGSUYG_Q0gySv*GqSTb}(#op-5ELnaO}O2#^7l*=VL=J-jQI4t zZf}mF3ZqPK_9}FeL*4v(EPV^5JE}z)mx(y>9U1;olB>( zWwJuwNed}nF#t3{I4c+9BLJbR(EYUgSxn5=73t@n(FCt&fkm6D|W7$yK&xy72Y)PBcc5%S_3BllHGSfiPz45~`jGP^L-M$eHD7Kr79g0l2k zEkYhpaTpg)F%nn!ZfVtqdP5n+kZEb-8%5EF!`kh`NL*tXx{rv znT`mPy6V3Jr`RK!Q=4AvdR|bV%jjwo?Nmaa(bE)LkoznR^0Vb-r6zZ#pHm-09WHu49kGr()U{e8 zr*-7QS-97SQhGO#3DpZjhcQq;JK$G!m74V245xg66Y>v-s(2CkXeg^GV(&w8m}xt{ z$#pIK3{nlnot>VUK|!~(F~b(}I1Or&AfwGsg46`1@?WY?ch^=6`wQ^m3dA}%*b`4J z@aqfYcOfCT91-fEhfixq1<@go+{-F z{z`iIH+o&p0Q4qy!nPLSUQ{bs{UaD2+qE`JSg!XSdJGK`4G{z4B97y^d8Ti>mO$g7 zYU&0)Uh6B@xk3w&9f2CR}{H&@n(|L2Y4XZ1!>X!C&3mPONBpX<2!Zn>rH{S42ma zsabAwW4ID}VCBQ*6c>s&eoRZ_5xBedFWP$0B!cEAvWS&?HgzFF((*IMbvLBi3zk!c zaSm8sm=^EgqBK^Fu{r)FS$#-9mP_JFAUb8wx(qTQaEXo&;t=>0my(-YvLh9e6Kg%R2;bc;LKFt8Ge?L``Ne5+pI`oa z1GO_?_~y@Z{9OQ=Y0g!TL*f40TvZa?SAJ_CA^o8hOGcU)85-&M;B4ux@*9k>{x|#ld)h8@|s_ z#1`j*qw&%f%T|!Z$lS3ThB#-`&g?20&X-w@p|+r}`}~o5Y#lj|Iu-%cExcqnsPjyJ zkBG8W^PP=uFq}647mPJP6#D{p!An?FGlxDooSSWc8@Z+PMVqprhot7R`U+7#SG# zy;=DMI9(3VM#oP4Czs-%Y>98KulX6mNXOmj??|s&?-h4Le5R=W-2x0{+WxWK&7Wil!_X7#6t=@u3`38uJKkH z;s1j&-C~1OB=Gq{VSqq+!4b=jtHlwmeFQEvPzEIitRAhuCq#Wb@2;|_; z@XGIp7N$aGNJ(VK!$q({%ldl;4nZMSPHhG3RF~t2i;p8^81A1!2C(P;)e;@C@??Q= zRi?8byw@{I>#Q`00ZO>4>P_eh?E;NH&Rgio_GJU%`CMPnWsP3C?{Po=koJyqYJAnw zBrdP#XvG9uA}2_R?GSaL9ETY9B}{?;k9KCVmf!Bn z?^3+4{6u+)3%( zfyd|r9u*`u5}_wn28wQ%!>S`4IqTwfi5mb57cai3k}E16*pnZz>7J>i2*`PUr%U71 z;NsQ25@(mU{IQq?u8KD~SaN#KY5X+8>EZ7vQXvIsckC<|V(bZoFXR!)#S<XuJ(U*2c?238U2ao19*p<(-!TMm-0 zjvqgs^G2+k&CzpJk4^n~>5vEulh?>BnwzX%0=v$09mZMjY1ZqW&ydJ<29PT<> zkw4QEX@nm(*{|aWjufLn*F@_Gn-chD?Ww88*;WasMVvK-My_MswMJc!?e)VB-)v=l z9nH)eMKei5)U8HJl4YS=X45%ez!NX#2$u~Fhj6>trDJ#-2Gd_jCC}Y&o}=zr8ErDZ zy!^-X4fOBno8HO=MUC)bX93pl@C*2V3BQcMqAjKOyRcx({GaH{XemM~_|HE2)fmg+ zZgxeB1x7{B4UzVwnh_e~D}~wX+Xut4*NdHT`HVc1puezKje!jP<**e4l3f)I_tVKJ z)u?AzQE4kG;<3BSU0)_Fc57fJzi`>!-mkq293!jZkE=otYCh!<=Y#eiehrZ$Ul?Sh z5yNtbqt4{7RkSzjTJ838$OtFWjdV~`phyPk>MFj%kn3t<%drH&yd|Xvy6bfjSQSN| zmro?I<3Z%p5-B;VgU*`pgXNuZHMnb0{#VV5&`e4!ENg~YE}A#Q=yB6?AOk0uzQ_id*U}C zJ||hSXY*roq8{7$IKH&#_udpQ3=bg7hAJzYQ2r)kX-sdzZPK&+Pg*eQs{wy(a5)K` zrREST37zrt+gb_1hDsDY>)06g1OYZkZzHcwSxqVHx@xbn)V=Uq`*pEIH2NH6PH3PK z_J{o2wp+7-z9svudg2tX4TcyEjR-{!2e;`A+g*>$CM9yHSoK>G6I2mJz&c<|)+N~3 z?b|v(vu)EyQv92sX*W#!K_oVEF8@>#XW`X&EzL!E&S04fWkj1#W-0aa!f7m>!6NS> zYoTx4TS~&_o?u8nm-z>pXiO*wTkG(zM|j*mci+2%xQtSS0ak*RQNN1^wCy zrHz|CD2dVXi#hK{VN5~M$e4Geua4z5`pxqDa)b`V(G~cK;1(Bxqk3%=FGK^J7)$uD za%mRxOXve&C%NA_%sRe@w~vC~)E8aD)&0E!Adfaxi%<=9FSDUQezEA~x=@Xw?H3up z&sgzcNPH2R$*!`him&%NqT+fFR3b+BdmhP(Z`c|UR6;9kp=5yR#eO8c|0A|feHJp_ z8B!JP9^V*TSKZ3kW+-X|V=yj3{ti3T1OCMuEAY= zzZ07>PWeFYCJj@0KIMiC)QggaTwIL)`(SjAUK?qKIh~t}KH(qyveifAh2Kcc{3$Ir z`d!aBuPO+S-@UOFZPOAqKt#aKt!^OTp|?|2L--EkOUgNjU@;?xIee6cGpUP;I{iAvx_&Eyc;J zx;5OYok;bTB2~$1z!sgV5HfOmf7oXua6w(Nc7*FZWSb@0#BrjuCK&Whe_9)Ea4NHR z?e%wYiESAU5_%(JfV5G|93WjZJVWTyyN$m6t!5t>@leo7B6Oo)xb3=GomBWm@hvke zCTD0eBremKKdK{&Dtsz%tX^kLGKnI3CtMG2dQh{#FFvU0Rxt?4V{4A&bf_$TEwg0% z70j^a&b54|NM@|nBj<=kw82+qLXx$LZSOcc^U2(NeG;~=2s@u?s{j(|W1$1_XE*HV zO7Y_+*SWO4sBe~BLjq&!QpOpWtyuj<9B6kopZEhKoGpvUIUR@gIU!l$N+RBwj2W z*-e{Ls^HZmUs-le*GeV@huF)g+QTflvCEtU1 zCPhAPn;?fKAX|gwBRwJrO3OY+Cy~B=T~pJwu+Q}VMnjKm%vD06K8bof{e_aP5a=5~ zw%Lor!k1YBq&s1*e|hFVxy=nRqcGr2m&m*9Ase<%+gl*tu$dndB;7;AFzmL!#MHq2 z6jvyV%%DM+=e|81$8Ns@?7GFqv8}Uo?{68WZ^-++Ko*QAA(1#(_h67n%*bM-szBY=~#&Y?!sLA0}R$t|&8+gO>LeGE9*HC$+4C{o{M z4yav(qF57+@VjE#ljK?XWHHNDkHAIh4AA-XRk)@^W}Ni0z~k{HI2rqb8?`8aPVl!= z`C~0}m1HEVm@3%C?mDvAJjx8duF{N-$KLFqtM*&*N?$elz_q;Y_U)6NQ;!$XTg}<{ zyu3LsP$@Rr@aHy&SHwFn7L_=;iW8GmEfc!7-W;t{sTiMy!c_6<*=*6h9wo$Skns1N zGB+wnNOBe7DAj56!)^A4D(mJw7*W*wh#0(!qDx~6O;o+r%Z#Ot>?sX=E%jHOL_{?g z4TUYCqFqXlToyiwxz%n)qd`unbtVF&*Htg_SJB2Pv@e!v{3wvgj~-HI&{!Gm8M5QS zl@>8dSBya%>-O~t-+qE^F2}502AUFjjy|jB2Y=WX8X{hb-R(FXTTP4sY z*NlMxqut65r(fXVcQ4jqjBhrq7hp{GLXbt7TML8ywnqgcs92x)LcQI)#H)^c|#am99A0^r$n2YSen(gkH516>B!6a zYRX&DEW*Mgd`67SDf!fIW|vHhh1afpOvS8P2|9^!*}Cn?wxq8h`6~N_2P$v&bGugd zpVjDJQkLlWSBxzDZNe1cz$wT?MfLdGv7znoe-^yCt7}IMT2$V^n0z*WAbnOk!93g= z-+pHulWtj*BekLj8?zr@XjV#R>i1?&wPxP+EgOPBRQD?G~DaH zogBW1vOnd}j1!@M){Rx@FQf3fiKi{fwy|}M{j;R4Z8@`5Svh~4^@Tjy#Yi%2Jqu|D zFytbHeUqO)ZCerM$TNSB3{Gi~P?fEtb9j$3@xLATQH2reH=fWE^IDgWY+8md#4o>s@^e_*k|3;6154N z)!lkf+8BCQVz$^v+SUk42QUO-&!w_Uxim(%jW@g;_7&4K5HXmj9?SFXFEr+i^U%9E zV4)98^jV{Jx@dcfqU*nS5LC{%B4ctzma%YUQseZqRBn7${!88M~fX(XOl+;WwT1?A|tTMoCP2VLXcC!bN_(qEtFgusA-- zR|p2r44<2J;gyH6HSNSFrYPeoQ?9!6@3EAn6TeDOBK2;6S;$_>@PNI?n)qRGnCZR5>y~Ipz z(8+r+r>pYVEwN*+DA@Yl6V?9%@&~(|F87ounV;>@d2!n9IM!4B-e(PAjEf_UG5@r2 zgl;$DUb`~ISvhf=wYdAkRtln+cMCN_^lO(Y#4iTcp1aO(!rD|0xzF%5O8lzELVFg` zFXH&DD)c*csQtUMPG%nLd2JVDSoy>2-)C2+sV_B*=+oU26dNH>kqM%MSve9qJLVth zy#a{o>SWq-zE|6@Mm4P4$B7tn9OqTx2)e-3UwD{tcNZ7@zA)%$+jH!BEjLkGiN?Kp zMF=hwcu{LHDG*AAVHZNzS*~s0%0;;6glQ+5W+H6N5H|4AmYm}qSMD*&8tX9^WYcy= zM{Dd&WqCSVAuWV1MW4u?6SCw}%9f>-D;y`y;%rKvTqAFwJ3>O7l=dq16w~_jl1RAO zurG1e3F%eE0PB@_0d}di!oEm0LEv#`fZ@6)g{>`BXE2)Zer4=a5n_@i)mQG4)w}tC zJ3W$bQbN7Qj>NH8S)Z}qxVT{9O|SGl_v4spJy9Vq4Iz)fNs69QC8tYyi7{-?Cvpdv zp>Y}O`}zXHyA(mG=qyFd-$$W7I`{SbAVKfHoXKWdT|H^k{=*0mTcz>!mtNHVV+B-2 zC>j;9=k6;l5ZdJ^y+hq`LD9Jtet$>~SG}q2=!i?NQ$OHvRvh7F_4Vy~40Jddmc;^2 z&h!_Y4OVsmvg*GL2MWgNLmRK-gNkYm_8vAB+HXZxzBlJEs8i}szk$F=`v+*W(FSzB zi9C~0%R3+ln#E@$*Exr6t~m|E(nD^?%-#Zrq$x8U>18_mtRY%#A@>M4P+3!D)gPsG zOvAHL-CE*xv1gqImbuxnU@#{r%fbZ!*SC&v0rAWJl$+Wt=B4wU)3!LZ9t@sNJKF9| zSMe^0Glk|f6t0l!mot3|hY%mJ@}3vj1AIToXJ%Xql44u{y^AVK26%unM0$d2EKZ3^%@Rsf|b=6A(rw;+#^} zeSM?Cp`vm}w-YIFXR%I1#w{U5Mwj_kWSne*oa4QrDj&fp|J+<^u=t6Z&(bpQ#z|ss z=E@C+%LVRhe-SNa!2-zP|C4jw7VmQIJ6WP1xL=>;8H_1_mitTicGk;uSj- zAgrHgxu%Gd+xMZlkGbq<%RXe4LQX9)ZzX0aq$2884=buWPQ{e$V7s3xx?k7u0=PQM zH)e;#LUI?l$4>NCaQ9rKzkHu4Y+GQy-bL4(xUTwiUAqohLnYJD7tC<()|=fy-7@Z4 z7kDL(>Q>|MM6xclAdy5gbh-)|RG1ms7#zB!ldt!;%~5GSKHgY=O(y?Jg@JrdXJ%$- z`?lu?L?23IOYoMbJQ)*h8L;V}xgiq!KIbhtyX}WY~6UbpM zo1hhglWUn0kMFiM=g3j)64ew`Xhj17$p@0UG0koL@Y6ZT$&b#l)!!FSQhpBHZwXDq zRhp`ASvVSV?ALce?hR6FsF$XsP$Zx`iUfUS0PcI6eB(5JGu_h#SZFBdno=94|61*M zTBaG1#;?!VaE9HAl7zMx?PAkJMh^-?%wgr;hQS82s~sDeY)~c7R=^VbdyIdxRw^2j z0xr}g7T;%TqQtzb`(Hxs?n1<$oO``l9#;PW0QJ+&jvNs6tc@QZ3Xv!$Qd8l71u&%} zUkH|Jq3elNNncQ*35RqgNx5Bm+r3+>Y?v`(J9op4W-$&F4EDAxNm8-|pO>V(jcu8P z!dCqjhDQ}gGBYQm5@c61q0^PtHKcfEVJf30sNa{1(szjFdgYCE1(wCC7irD>11kq5 zI?TSwgCsUcyk&4?(0q~B#2hGv;IJxWJSYXQp0X`B%M=hKGLq%1p?DO)dVXM=hl{+z zYcT>mPJ*s*qfJq;FD!k{Z}x^s`wbH-*sHyeN=0^Hso#3@lM&ml+Oh`JX)gE1yA>V^ z1FBAAq#O2R4r3loj63qy@z~}0?nW#%gsAjxGqZj7KD$YJAIPCuUF|5sdsxHcu*{hW zm_{e0_2t_SM7A!$LiNEik@YcbmEf?Z7R{uAOk9mH#8{+hyAPed{!L+YF*#_q)d+cX z3YRU$c?ZmtNb;eTX=qAg$;eygs4{oKkp7-A8=6{LwsyOw!e}?Qh5O#Lu0=99!ub& z2+(Xa5vF%*OyKG|Q?$>%Ircp0%hW%M7QV%C<+pn;dBUnB`r#-r16{Fs~6FJV>p z&22J%KjKA1&IzCYwm*X8P~zdi(3!QL%kPnfa`-D@h_*BdsI}o$W=qHGO#({2D8rvC zDn3HKhRz&)0cnLlZ+#6h#_1DtwE(D7M|B?}=S4n`^KtG+z<0Yy6Ol`a;b^5cG^mN) zac;EdA>~UoHnzS7D|bLpc66ys+0>IVeQ+T>B>xX{ZyD8A`>p+k;st_xpitb4dy5oz zw?Kga1%d}Hw8fnO!L_)%YoWM%aVQ!biWI3mCw-p%-*U#g&p7*i$2jAB$w)F*a<4Vl z%DwK)Ij`#%RhJxp4j-T}l@-?v^z>p|)6iIc!ajggEYU49?^#T`CE$aF z{^p^f#gOYLT{QKVG0+n!ZPl+lnaakyC@R*$$%?s?a=`zXZ{ac&dk<3Beeyw{9m9HZ2 z1YdL3dpDS@VM@)P@AL#cY{ zm_iyU(L9jhSr%J}wO^xfC+v2wup|X$0R=HgHhSir#Ljnmph?Zjuo`}B_24Bh&u|Cd$al(PRzs)SjjS+XX&D?NIWZO6965AE62nykgtyA0qojzc$34(x7 zC=}VKkx5Y5f61{EoUFl~DKjJ{DmRbLx@nvhZmPWIAp~3HDMO89g2kt02IMdtH3K0X z>uzyBaNQ9&@QijcF^fByIny|2W%F%I3aiP+jGB?DM~js+6&6LsyN?Y8Wt{g=iixm7 zVW||?&2^9OYuF;UeXps$A5(qJR}pq9zVUdjsDv9SWk=$uoRHvg*NdddY_BMC zC=RZ1bl0M%6f|cfO@}}oLBD2UIY|YpS<8faw9Chdk~qsBl~s&89Mh>Eh*#UgvKZs`Tix1Rzyt6QE1yTR zDp@>g_*d!^^2FqN$_JA=AF1~UZJZO+T7_%Y>#jXg6YVJCC{lRoS0$A6J_(_S7tCe6 z$RwXJTbLI`JulC;KfUN@tgsqa+vlL2v5tlpQItoC@_#fiqWXgx(lQ7`MT?Ot&=y}+ z8p^oZ^NNC0g~4#)xTXuBTtSNZ|Avd2l5Wf z;#Ylj)S~)!ESO_ew;>E}?R2F@H$PhO8W!*i^HstnCoSLJe|mA!*Z0;&J~Zw&Zm|Y* zIqL9XcC_Th2S;g6`_hxh7CUeleiMkxSo=2e>EL-QNwr4ECxeJ+)$f_nbFZDwGxM6-2aG9}g@mhNyu-rP zfaa->HSUa^DlrP+@A*KdrfVv^5#-1gn!6Q9hPmmRcnuw1Vz2i&Nmal7Nu{&y_qJVP z9X%_LdFi?Ka5WK=qLJJ1207(A5t?JPwf>zL{Qm92uq&~bYp(RNp75Q6u4VHn=C)jf z%8|(dZdjYhlZbvD9c-BC(APfQmC1JRp^-0UO!;i|wo=JLohGN4827261F6Jvxzn2Mv-ck{1 zk}Q!>O+AmTS=%T6p7qLX;T1KU`6-iSE^^2op()s@shN*QlnYO?-Hb@zxI*JXTR^Or zv^f;uE`ZMAp6&XIOMYF^n&yGtlcA0F#WUIVklni7bQ`fyvTsD61WoVT<oJd;AM@7lw3F_6z{Sb;wqt^B7wkD)%g%Cq)G zQNn@h9pgB2kf%@+Z%~Txedt#KlVuwl!!IK$mN2y%CY~0ngWBpUw_{dlfiHH9)}iTr zH6GVaq${#C_i;u^u&>8K+}fzAG7z)m3>Kbuc~Xz2$y1k``!RsNCED?)CWj4#0E00$ zSwxJPb^2{#T^V}z4^V_QcrkO>IY)$p+4HNE)l>*!W^UCGh?!iF!f$=Mmq?)o%>g=! zok?e?k(mG?`&PG;5}Q)5X;(>TnW^%s4XWazv0`uYuX&QydrDhGIaW_!9z%Pscg$P5 zIK!cMQ=u}*>r2ialuX*a*_(YVb&g;O)FKYyEy=c$w+r+9;-h?cl%N7hT&mX|zLpkUzI>lp z;k}=j`LO*7U0#{l;*bC+B0&ac36(4=r!tlGY9C>mWD*OO17U<{kRcUYxIPY4tiBS| zY6?=c6O^q`OM>*~jYC|L*OCS?Qro)`tH=$UxZwzLUbP#BnoBE75`g^Hu`uzw`idbL zv>v&rb1Y-P7ANB`h_?2CyXpOHRI&!yoNjx@2asQEq9Di9*PT;=7WmeZ;Nz_m;Ym=- zCZ6RrefK}hxuZ(sq0f{0gc8ab)YP<}iU(kUlQ#!)%5(q{*U7W9A2EEZ-C8H?35Ne? zsj7b$)rC|*u7gboIi7$L7pc>bUp+kOV zSoVwpkA-V}(Ul%u7ZcL7$6sZ+HB3e)BkS#B{AVjlUma^v@037_pg2O`e16bqu{dT- zo4sAgx}I@9VVJOK01Bm8+$PmC?fJ(&uo!h0otlF4*M-@IdFOV6@z;8uNk*f-a<6O; zI#pd#*|R+7%_DCB`@~p|otHQ1kW83S(S62d?GL^jO0C_T^W!`!b2aLqz`I={aB3=` zF7yG zX;js*slh7UE6<-L!M&*Bt|=$#3DdgkDCeKhL{38nK}DVkA$-tAx|rc8xc58c!W(8y z%NtS8gzEpOs8pC~Ua}53%hIe7ygx=7d7B-yEd2#=8ULQH?HTzmK-<4T*7E3&MNd$b zl@r~+O=cvD3p*0mq7Ygr9uogDJ?D5PeeZe72a6|k390G(s;QtJEFn z%Xb7P1@OC#bp4DCejTom{`H#Vmy^dw(ocif9<=E>!n*v$t*F(-!P8Zm3P#A=tN03McnBJ!B{E68II|4JPiGN9y;?tT+%%aY)k+#DgoNC*xF5E=$(fvBi zJPzdS5_4SCCjxiURaG2+IRdFE7H)E}89eutY54Ie*~Y8bF0jq-%#)H}^gl#|yT|SU zavx}iIbVOEq;jET_29@-X~(yf@@R)oi53r}5xj^Mrb+mz1?75HF=FyceauI%Z9%^w z)%=G|NYX+V;6ON3QdoShKg4SxkS_E;By-@mc1t_y-aLA0W)T(;Izf)3ZU5rf?w|Qn zzAz>MioHle`8JrZ?Ll=cAAQwe4tOb~G}yuNeRRPel*(gu@dro8$>Hpn_}Ztq>c-8}nSCz? zUX19pw-qW(zGQft$d*u=Sze8K&fBOkWtc|m3)rc{e2HK4g=Ru#fsVzYzo;=&td-{m z-OS5TQ41|AoUXop;sxhDw_J9p~})LX(JLNl1l_ zXsXe33ZeedRWQ@!vk7{1=4|r?b^C}pY{IjnZ{m~{) zYer7?*fK*(#FVZNp95bfC$(F8&OG@go~w)8Tl4di*1xoxgt;9)dH(c?wk*VixxN!N zA=&TC(&D@^q)91mQ?;h3(~_s9d@amWkz+s#!Yd4>c)j_^X^B$!E6mmX@r~pnGBydFK)qfOcvkaTNNI`}rV#eYuT6GYA9eM^GTFx)x+h&> z>1bnfXPVAZ$Mf%icOwTMRk6DeVDpG3#G9X2dtU>ronY9dwVCmV$I*T)a6xvzF^6>* zCvIWZO*~R-6cpJP$uHmJn@~_*Wy=GkqthX7$)2wtyheIH4Ba%$w(M|qd|F%xrBmtS z8T|XyBYc>>wowfnTCU0M<-e5)zZi;elQh`pm6Oe)X6h&~C$;8w#u+hkV#k!`4lIP^ zmSDf6>&U_{&G=>U9#A!dnPi%$VIYT2c7a2z+U}1oOZ`hwE zt`Hz@0Pb5t)Uz}`k#$2kPTM5Bh$Q)O7ND~ZuP0f<`Mx(em9X6b$_Ih@h^(&n-4@@M z2%0F4Jx<>Wo2yS@6%7}k?eYE!Hl_AB*&jPtM-M16!J3AxO4!H$&YtFAEQ-Zjjo3my zsKr+f^W*S$d6f8FzC&&!4xVNtXJyBh!j1S>hHemQ;U9)*Vo31yoS@If%9v_P;5iHD zf(s1@^B=bVK0yd!to}1W1Qo^=93%#ycnS*K&jv~N-3rHs(rB%!4u5~&trY1e>A!SD zRZR$m`R4^5`&t}9_tyHrk1GjhFi59>5n2mPR+;%r&8 zJ&6N3%vxBoL_5>d*NQuHNEq+pK8-`(A&r~rQ0jV{zr#HGIP3S_9#!4H0L8Mz|6)Sn zg3;;R#EPfDlVYK`|EJ1L9pxo4{y;_8$dIWbc5C()uk7xisl8Qwy~s`mm)Xa_cy)!+ z4VoaEzJaIbUbyu5sGsl7J7uNk5kjtOAy85C>mcZo- z>m_q;_RwMjdp3wlzU#W!GuB5_d#H^f!j|{I`{oN)`ajgd|9Pd*hA+PBy~*G1C>G&e zOD>#;`Kyo99r>l6N4u?aRxq0L$2H)*u7HKDF45=v(}Ee!jt=;BU(TGsihe=o+tuPJ zpLn^w{cZJ2*oHM~w+^=Jv%di9PDVXn{sORvH0)!2 ze{so_LVM!sRwL$&1c@y;>HGztN0}SG?Ebx-dgB~@FQ@hJk`8vL!~Pfg+lV&r+~P)K6&5fdi8_+;^Df9ZQ%Wl8- zEcz0^E4sn;LDDb6Q{M??==gUSbAHXdfm(O}{1Z~z^Rg43yZ48gjx_HwHyipdt_g33 z2K|5i1-Obted;^Jy8HK^?P$dIGFoUIaYP?vcdzw${!BqsFufOO=jO7)WLK#4?IB(fTV`5Gv)=j0l)y|0vAj8n}m; zbCQkEa-kFXSgBLPJ-gaeN&&0cFx9r1KRpMHsg8*%aL+8hv@R1|P~ncZ!m#}V1i8+! zBnWbUI*=lCuR&nPNNzKO%zer;?FJlkS)at39&dpoAS$X?M@Y}EE_F>Epm&m}1%$mpYWx|uFR z)kG_DRn}dG8#(ygS=wz9Y^65+<7!-5*8g4RCmTJP^l7b&yEN-9ulhGoh504-Wby^< zbsHhf)qh_+;4HWYNUox!p{J#RwZoa^ib3e<-Q*l=JEo|{ABWCU?JR86`yV3P!p_}P z55}B_0dM|+0|LP>+EPp#s{K>C6f0pHIGo+zuwM}Y$#dB)mL&O8TX8gN-wslVcAYw4f9I?_ zo92L0h{z+!d&S4jZ?xsR?5~}4)-qsyuDLI43}^(jm6qb4oof=H;;?~>Jkm65p#<=1 z-1C4{rRZBqNdzURF`cARJy=_=7+%>Odfq4<3opTgoIIie+cUL3a*7)0zvp3V+6l={ zBK-73hj~BobwFI|+I0$?L`1E=wUPI>d1?&H8qI6o(f*lgd2y=mjz2QVkAqaabG$y5 z#|vJ?6Bk%_ZJrD!pKGZI=$|b5aaANZMP>dm>0%5hV`a=xBovlEL*>XIer$0kp429x z4L0`x%ZRf6ddZO=0xYRcZ6Fz%WQFD&F}BBTq!g`WL;}6F1&MIm%}Fa9#iI7VHKvG_ zr4Lulp`VTcO{)5PtANDP%{7zS!);>99>SR+?oQSAt(Y>F_v{q@;<6LwnI%3`yAv>O zwRII26MBIh@qty;!mJ|iiBj@kfPnHWJ$@_NBk6!a>__XQn3josqOQfGx$Xw6_o>J+ zpNz(J?Dp2~tL!czLr8QuoO(rx%&oElc!F&N$(SfM_A}k$6U2c?(BcW+NkmieKPGU?eu^BCK-8Q zHg#K37K<)6{vpOIJG`*CK2$((&O|1lGr`T*7lDSgX#yl2Y)j~S3g z3mf$b0@dP)$*s`S{>=jC!~cpNvqH176ChwWcAMJCQD1+oJuQoAwtiGv?e5+#IWl}` zjbG*Aqf{qWY%XHz7lx@H7eGLq+TPi_gx^w+R`}{sanueuEt_~rKY;?wE|5}QN3wzr ze>#`lTD<6OulJRFavQdbC-*_y&Cl?3ZIRHy?h@h-Q32=+Nw5mzDnNEZp{i0g#40%% zhRV4wBotx4+4941OOVM~oivO*yfhKkuuE>Ap284_g=D-5kc*bFp94ti$-ezNzNL7)lAUacw zAu3UcRGyj^05zTA2A~I`sr?Uiz0B&tP72u-I3*B{JvXOVAOIO_F}$Q`#^f<-o<1(* zGGcRi6k|~;jWd?YwbO&>lxN9CNu}!DnP1eKt=@( zBRunLB^^>5d#}juNQvbSUf6=>G5Xu}*7*GuR%Ioh4&%U6WnFWcf)n_%+x=WwZ7`Ua z)cT1B&~fg}PGHQm{b&cpd~-Z0vn&a#4aizH6I^};8HmgjwFD!9K*}+Rv~6RXu2_}u zIjLDQ1Tv`99csp!y=Lo*=SHW>ss0$Apn2?le!Tz1w2=vaf@I`KO+F^z(0>#VEJWFX z^EFl#>=9g3gK%{2N2W?}$g6#Vif3e_S8drqN5&M^(tbeVuI7C!)eYDgh%brOD zs20z^yn9|=>lFG-@&$kIOIg2Z)W1uL`qRThtA12fzQj)Tjqe(n`h=!olQCY7W=OF< z6&7%DuD;Cx$C)b$n8VI~=EGS=#Ust=7w~OAKCZbzH;RS>=@pw8 zyu~}?gjIwYr_|IIM_dpnnW{jiTv8b~yD{^+@~tHBVeZjw@EqDk`_#t91K!Okms&b;BvrPss@FIQ;jtof{Qx})y&g~c?fh1`^Q>6Dl_c0Hdp&j>}PBllsZJcVkW z4EBnV;tsckq=+=M+Hw4$3Pl4EMB=$qFb9VtXi;?&#mg`SdIy6|J%+slkLu~_YYX~L zILkL=buDu)1?-p4)~j7Wjv;}B5|r@9Ns-+tb7o^N3?EM+{mY(!<6sj~S%Ef+_V0vJ zvJAP*eg20!-n=<;dq2Yq=X9>8O zo~#Mkf=&9BstsBm0=DL@>7Fbm1~YT^n~=T_6Y?@{it`^GK%)Bf)C~(1Bc9jwt}m=A zr35Y2dADQduryfKRA_JBrf?Z z?h+>hUH+vjLw8GaLtCKomUBgo8~B-s2);yu00%XbB0M;+k(H!EQd5w3=6Jg4BTWF$}VU;te7>;f#>G(qH{UDDf($4R7lY*sNyQ7`2E|nM8iUo{(wN;N4hIJF;Cd&+j{CS+^JO#SbT9xE* z?Y<=vb;@|S_=miAN7*Gfm&qIil^MkKpS>k7rHvsl@DVxhc(me6c8fr!qFib?s39kL z;e$2xk7eEh=%ostEDB5i?KPm00*CIvjPGnSMTt=966|14nw&@Y0Se7*juF5*`-A1>Evd*gnt0glKgOSi7#~Ex zj-Uuu##qzF%WkTKEkkg0(0IOA zji<|OG5c={xq)VSp_b+q>JAII!)l)L!?&m8l`v)>Vv?bCG11yJTP>*e4iKn0(82o) zAZt_~VDMG?%m(hFs~A4Q1h=oCc|{hRn74ZB_Vo80vvXJ<@;0-?G(Pd1gBu}z{*Knj zW7k6|Gw41|GEPt5DVKcg=!rbpwC5Crz03@szdhNDm(aQ#@o1x2_a}`*2*gu_JHA!{{skaP7s*JDhuI0d1RGyc=z*BH<6uK~Tyg7jl2SZZ z3-fZ{D@tgFb>*2CCR`MUz;r%XZMZZb`LGW^H31P|?z(*`y&SveyT!b+{y91!PPS2IUzWSLnzanY}Ur33o ztBby@tal?^K08zQCN)prA9UT`+j?KI;(Ycl`F4nqv;dzm%m_$Te%I-*mlM2%4v9v2 z4y>)Vm_HF-5@F=<8f{gPjeO>aOkE>Kb@o@bHuItSQzkcbU-XMMI|sds2@Nz}XBZGu za1Nqs9z8B~b@cJz>NopQIdF)gw-~nD!>W5bgWcbM0pbWK5=X{M#+=*=`s=^Oso_QM zC^?89n>;fEm}&bu>c_Kg#Q?TK@VCiNEqMo>-@(;47w|bhZsDUiEq1rn5m};DU@~Jg zA8>9FHQhip0j#r1=E>*qo;duzOHwz~y|N~w^q1ipUQTrsMMK;JmB5z>A_;8>h_hq& z&Pdm}SkPbZN0P+`kQe*j`?gvR?AITm(4+;p`9tnD_hY*=-K|X$ZDw+dKIrHtM>*KG zHoM@Q3*90BRHi$wGbprM_i!x+{N(-Fu%mp4VH)v<#gosdI9>Py15;ONL#c9xs^fp1 zp{yJXT~Qk>Hm_PQu~p=BS32Pl-k?CC)xDQ>vI%acU(J40xG4O7jS7@|J%FGdx`x8H z7}o!1e|h|%upP7kQHtlcu8z>J(a7aaiiLPJ(Po$DJMz7#=9YC^`-NZ`S@=3@S9Ui_ z;E38)RXS0zB zbL%7f(FMetH;Yq@8e~}($1TG3YFg+l0o7?jjjstUV`DbzMOgz{#tss;t(WZj*BXB$ zYQOmLhf%4__&+L5|8GxcDcTnsI^RZ7Sn|rhoix(4vAt;jyuKmouKy^oBq#{tMrOr? z4A`fCSEW9;DdBTpNYmoz*)I+VrjVYa<vkSzRM-eVv6yKa9%`4q6XE;l2T|qmVT2yc(J3oW8zYX}Cz5^nBA0 z)eNu7q_dP1X;uem3py9Z6eM?fJp8qA(Ic57Kzr-AVN+azh&oEz50BKIc_z>OVNh{@ z{|N#1O}w2O;9ws}+qjBaqxUzxolrP)KhK+id0eNT6l3hSKNek(SHnosVtN`alGc6U zMgWy*XU+w%rA0}dN0ejOkermJ9_7nxbluMs;9BQ|eN|nd0U=429-(Kdfu-GKF+7R1 z3H}>`6>&sArnG|j%Vq#|j7O7Dc7DOq^HtYetZlO7gaw1Cl{+|;DW2V_#yN_w=aED( z0mZcPhR@yaZMAWSwySCh@i4=8bTaeK>$&$yVEM1AW z9}6v)$;rIwUC;K|$;rZZlfnLv8opq1Vdr%YkMA?*mlkK%P^xIru3Dw z<5(|KU5fN7j4jI58h1@tH22HqUw{dY5=Zsn$?vWQj|1msJhkTt+XU-hYg zT(U*N<4>~WA5pHP&F+wgaLCJ#W?!{BF;94L%9E1vkh zxnm~ig&aGF)N{+t0YX7N=+$7(QbK;?oM7npZ+o0T6`2=-y1uEm%zJHq+wy8V)XTx6 z6{YpvMhacq8vFW&H}6L{%S-Z~^p;D>OOoR&k*ut<4{zW;i)LiG^2k~6JAe$PX=<+mdJ+d^3}C@QDh$8|If9mPwfrw%euRk`=*AH!?UBdHVsd|*+MLr9uOFWK$+8Qf@&$u>7T=dXWys?)(~_+?*03w!MJRJL;L z2s9(EFmg1qxABduiJT@^s=s2Gr*u$>~ zsLzkylXD)f3>qG$)%@B<+tiaM^cR5klKtmbQCu^+Rp&C<6cN&HY*B{W>nHc*(WXAS zy8T3+y6w$!PW7NXAqoc{EI0wD4}mZ1C@uY=F)~7UegL$D7cAH+7u>B*4trz8^q9+%BxOc{mc6K+~HeY>F`wC{= z#JXcGo`lkVuyf3or=j7sDP)t)TSzAQ9}-6X`|Qwvmq+@ytWo)xyV$AM<{uYJs=r+< zD-sl0aewRnNgII`TKbP&e5}9Hqu9dGbP}>tK$|3wyh!!yF1kfVR3&B>+sh~An9@L4e;h- zwiy%LX;DNJ<4j2nPSa(3y=cu?`Ua1o*bm?C#wB}+n)@$+Ks!&M@a-h53%|#EF^aYX z{#a%r?lU%;25?rAq|fKG@NDnma0gbdQikHgkG|`if@fC5v|2e^v_cu^QHS1~aZSbs zwj$@%HFiu!?)tXOA%ZdBc{YkvimaGm6$!+C!?m++!z)5E3Qa>;l_2{oeg{gm!km{Q70FK)-#2n(Lf4uBw_Z%k2Wa#;=c1zRyP6xl;vu;l1pS_vvOT zyQDcPN}ShK=#KVPqZXuE9HC|U!n5)WIL+8;Y&*u2=!MidIu%_l_en^%Abfl(x>n|s z5R}gRSx{%x%+$`Nxq&8pehg<_Q3l^m??6+rsm)O^Z7q7coV^|_iMKL*!B72xf)1~E znhIJ@Gg@xW%!3bAnHc(b=KY#(BZ3m!hZp7yc@^Cb>si?Ve9v5giWGA8vmXd%zJh9d$qIH&@XyBbP)b z&VHt$#64yn#fh8a59cC!S&b#bG&XdAow?i7Sa;=IKKRMmO#MDbDsRk&8>aU3bJ+S9 zDSGiP0ALv_tjf~0Ld@+)WmodCJp|s6Yr@ZopEx$$F(+{g#MX2T!Z5h;@=8ZecjVSI zM2ppxXMT^iQ}l8#VGJD^7P1)l+9TR)#IX5L*k`kz`Tgkxl}KuEW-gRJI}$K+&1%@D z<%VUXVgrQ%bZ?PLD>FN(SW%i zCre537xjm%4k1Ouq;8hd{a~!i)n6=E*ZPU$MueQz{XpK+=kYKd5P5dqsP<(yX`P6x zkWYqqSX`UkSD_nmPdn5pmmF?G!ReC3S|{({f27-EKr)Beb6j@uH|&sO=GTw>n$Xpt z-4Cesl83#9no(In&ANe%Eu+&|-;KMa73>zQ8uS)F&o)R%q zj(5p4)y3@bPoejbK8Vb%`QKmrfBJWY(tGK#@_OsF7bFoy&FiHJq_QJDog&)9vO2SZ z9D=ApFuVHtHnyTq%!6x9zM(12zLayAhb0gn-^d&jcw3j|FYLOo(ot?$AGYNQ(|pAl%R(*h2P)#afGM- z1-OtB9hMxGEe%zMN&kFH8NW`68Es%7U*~I%PqZ{|w3SREQ6i6#D8eQXZXab+gw+<& z-oowPL!8Ir-BbfdJlcE}(Y^Qax6>BD`}~XA&;IkGoEiOoWFD)yHkFDh{BP~254blbNeiael+4jCSQ{MUd9oj&cMs8hm^=O6YXUQ!KTV~f{QboUpDipbH_I&Ijhi@ApvfAbLj40IyV0Ohr} zqet;13B^)}3}=e1$Ke1WiXRPwuKNiur>;oxHGF>b121c?w0T%yj+OTPX6!%&uK1;R zrufdLFM;QRI}I2wtl=R>xnsB_SnR}MKZ&ION{Ng9w4vh`8H9q)4rapjtl?TPDrm#0Rybam}s*p67?31v8h1w?X740TTjB&qZ+dAQw!L zE^w@YKxcomVEih@oFr$`5*U+>8-Fu@;n&WsG-0MDT zA`ORtSHXtguLfT18t`N7=ap0bI{FKcS4cgy<=KE!!Q=~Mpy;B_%Y1Wx==N|@$ww}P z($dqp{ov0-O7*!y>BJ5{uz=O8q7zgcqaXoQw(x2zd-om!ytVW1C!7^<^;cFE?D;TS zVOu(NZrCUR(7y1&qr8$ z5S?p(pCF<`u%!Syqcsun3j+qaK-=}pV@{Ch&dMiCSPUq#=O`)P)SZQ4v&DN4rLKh5 zxB6TB5K5eGUq}csIb%pD;CVWBQfTFTuFqUwGC;a5%Y^1>TH^ZQN%gk!&OxxL6W~yJ zw#x;@{(6iZA!7I?NHf2*G_|2ejcI zF9xbgi$ZC!E^R}KaadAIU$4c0A3u11ayTuvpF<>Vo}Oy;tuHRVyd9?H!?+`^6QWh8 z5uyiRH#L0Gc6Nye7`ZJ`L_T@HHUF-Qp;f-w*N`h>``dzWiD`hGQNQZ1wY4sP`SGww z3}eOLBHP=PACFtjj1spyt|Cr1C9x=j=d=ag?sU-g*t10u1`Xk=Za;#-u-CCLAs6Hp zXrNqkLZ2=h@z@RpTsP8Ce_Hm;Lc(Erd5`)jK~$i4bru(|dFKv393U;U_#*srbGD7>RVpIoTT>6<{GWU29ifd=UpyB4__T56aJ zsueg9i4M-F_AnCHiCCD9oQyKEbg3>V&r|`@^6p_EpA2Vgi3eKs`6Kh+#{AwNMt0mIN;KA@tlA4@8DvpVUk(0LOIE0608f&i` zo!SJuo0Q?>tj~I`l|DD|E^K4+SCKnGjr8sl8%U*=GmMY7Z!^)PKQd}bdk;c{lB=e5 z^deO7o!Y3gceMfSGmc7RbSzlXD$!AX+(|9URjW^(UX}XoJQV(y)cZzqSb8pr~WV`xyVU-J*b zX}*aU`Kx90t?7lHF7PX93C#_rx8N4r1%&N|KUxfbMB_xm{mF9Xv`}FG;FCLczdmz+ z=x1{NiDPQKT{ePD6=agHir1<$w~?n`+|E&>3w@GCtj9cF{w$kD z_4|YEMq2NZc>PDC_6s;g6IK(YSeh6C+D_L6eqSX=z4z2H-9TJzMXu`P5A*I)|Kf2< z(By%1{0NqY;45)PFR^{@Z=H;zM_Z{rSD75@+G9@>CttJrH?+04o2QfvKU*rs)=`Qb zjO=?|O0I6{ZKgl3hF)tKa2n^pWFgW@Ur_$3>4w~0XOcj@vtvoPY0A?>NLAfz8w#gJ z6Ww-GBDNh`u$tF&pnnEdRrS4_+-nPe%AAD5_ALTzEZ7~W-PH8rq!}B)>x^f!>CDr}jHJwBe1ZB0+ zC7D!!k^l`)JGP14EZ86FN7e(>I_PY{-sAXjgmC4Jj9Ldu4B`Rex$;kN zz0YkPe#O3%T)b3YXAVDf`m!!!3-|WWlJKH&jeiA^)MQquD$dq_OE%Caj+GOCsKY5Q z_nAanUs}MF8Ye1-Ac$IACovgk+2~;P48{qLKuDn#H$#WG zOg;j! zmse0Jnd_;%u16$)-)@W-ymYn9m2z{98&%LB&aLYCC|!kzb*$dSDMT%WZz~?@B6R3+?B;?kmv<@UDl-TZ+n}0f^`F zZbj+T{Z>#{PL2I2D6~tu-z<${pOQ(|ZGPGpJhc(Oo*A;#@a@Gxfh@)USBt9AkZ{h; z>eH4>4<4~U2^e0l9*izLW`jF*?qoZ|h&97Tt?%lgoO%ZJ&MPy*qmurER=KWDcA4ljrD z=;7}&Ro0R^BlS^rhhHb;s%PZJqV`Lmpyl*C>Acjmh_;8Uxb!7D%plg$UsqNQ`t!Pt zWW`<@>elv8o#kQbeYimT?)9}tE56{<(Q9<9Z?>HAo{Lig=K z1tVRD$hl|hVHW{#HvqP9kLnU><**#aTW+I8)y6wTKisZhY~!@g_d|Y<8|x#fd8ByD z@<|p(mhCp}nt<_Ld*%x8?Gwh3d7uNi!8>f>1EHqufo!t6g5V-3Y^_ zahT6Fn8Sxu>)y3ZGpcjY;z8iJ=CmfX1=K5D%;FEDGcBuO#DnZs$>Usl5uuT9T<_a zbzRZ@Q3HjUfBD_8MO69wiEtsmR94`VFIwa`yqW9@Z$-ZQD33rkTZQ29O5rixw&DOGIGM$=hnUi%UL5l!-Nh@BK%;vUlAC-LBRABg+TN7`#=W<>}Xg4yQ+^xGBA2 zf_ev$3_(MK#(f{IPUD}<{f;CudN!t6QihTYHK3$Dsq#br?C#f`>Ih0WLQmFAX6!Ju z$)#drHID+>s78Mx$=hyjtuTVkRVC@@);f-LTtn?}P?}j}pv0ukm?$3S$JgD&M^8ZK zZ-QZm&}97P^Lz4ra{71m#I%p5E&K(0+2UIO36+V&HMOv8>lgxC8v%Voy^acegiu7C z=>Qa#PNGnQ1BsV=%~vwuK&zvqL-3Li9?;PD^|oVHnILlJ7)O?m;r-R$v1H8_9*+Gd zs#03^1guOfm?E@hk@^iH<6IoE8XNpmZdR;Db+oB3!p_pnz!v;XZR+q;rpS2#W6OO~ zd9Hrua7pw`MTsd(KrjpqdK@CO{qloi&As?<-HxaJ5GVJ{mO8A5Qwcd2s>S!T4}m}I zv*`NTg2uODjE5gr|AE=k+(I{^}*H zAwF0Lf*PK8lt;1-O$cQtN88xH04gt$uNFJMDW8gMt~bIz2)^GeDRlGn$hs`^d0;Z6 zn{)?0Z@@p;9*i&@hJM!i3-HFOuYd5tzZ)eAcr!Bs#_fpVa3v%EzuJ4tx44>R4|E6` z+#xu@9Rdsv0fJj_hrrYDB@`F;Gk6Q!i9O;I&ix9ZD(jbwZHLO)mAshM#&@2e*@lP>rDDDG*EEF z&!j60uQ{G28H9sA5u}(p8%1MCF7Bg4d7@h%z95bd*KU0^u5FgK9^Ubn(b*WbcC-l; z-|Y=crg}nGcdMy+Uo-~Nd(_6#xN8^qxrM$Z);}nDs`eL`6kEaWQ#U-6BHAf|e?&xK z*7j06Q>og?k0H{KiYGY0!{?giOv2U9R^iR~HH3v+@!|pna?l^^swMva zN&bILmK+o}YMx{@WvpXDZD^1~6IZH9;-urYWrkeV^V(*CXV|s<*@r6B{TGy1*w=7g zFA%D?CzY`ThrnJ&)Rx9?Ufv;L4iqC!?1(V#oyZ{Bipbnb5|it0H#Ha5k=?Kv!vy4_ zEHkpS%&9rqqcm-bd>5;6%SJddCTmA~+y&(@g9*D&QW>bY6RYMnOto8*cQaux=#Qrl z!{D!WGgfaO&qQ&HF_chsKO3aEHg15rvWg@^Hf_Gko`WTAz8g?wpcxuZGWZF#kI%kh z%~e(QSmz7hZgM4roZ4xu=`1Y~X&syx^P&qMpHM-wY1D=QtJ<2;qWq@jX2oRn71?|9 zoNQALh6o&^ISEXx&n?5(4aMpkxxGY@3!GSb<;1AO-!$bPGcs!$*vV|vP4>>g^}ywc zjCBvxqiq&@7RvZiYN^|o0)jQvyQZuOn>nI+;G~p7lx-$EDlws782V|<0v<0e?#i;p zV^Ix>lLTy|c{}%aBx*dVfWa#;q3DlM8QSpA$0UYSy~1{~wv?Gt6qU}*l|8)pX!i$@ z|4VroEn6h16Xx_rxN(qZnK8<-dskbz#D_`4av{RJICX(pjg~m8K^N)>!w}vbpCMO6 zq*)QIgV^pINBPQW74CJcbP(4bUoDGE&F^vQ#U;L4I6tTy?XaIKlC|pH!*(s1eEF6U z2|FJzzOIe&)odRU7k!gYHjeb8)N*0_vg`c^0O<^kpSxxH66``Y*=_g1+$5^4jpwlc zAPN0G%pAsUfYLI;K5iYK$w9vA<6#aoUN_A^`O0y*J}ePy(!fwE;poQ8cs!pmXw@oJ zR1&X#4_<;vF~T4jFXeR?jHMgC-M?rp*VS^-hwlalA8ODTjpLxCDq?{mYC*;9waX|1 zhay&=#98H(JlA@TQahHLv&=6~L`^|)v>c+e-QaW+9i`5b=iw@6sG9%*{5iMuU1Z4G ze7|wgfog5qa))}R)J)KO4pKBYBVG!~iU&brmmt{Lo(kA1=drUYBa0?M>Z9$B_@XAB zYgbaK`>okpj`>JA)*h0G^xwEiRFsy_hzZx?-wJ8n+3yj&BaI!N+rF;?CMI6yE$ zd4Ksn#-K2}tWDVa6FAM9W9HMz_sCQe^Fhn0AS^3qN+VUPS5-YuMP+TpjxfohAN9b} z$E9VW#oEgOElsQ)wt*?_!)X4PgQXjVKD%YTLn&=_SHk%5hlXC&fJ`21-Hz&T;h`Nu z7DY`3>Em^xL?sD6O9|Q}pulVrUV2Ti)b8|vCX z6ytn36I%!Mv?!iYiVjjl+X)ASs&&rnel#gRud}4^8Hy7x+~N|?;asn8u@@$w9Zam# z9M*1wz)1EBRn_aZ{Y7c*l$jP~uM00)sD{NRCk6Tbi9rYkaY1cqxvR^RY-z!qkAB`` zfjmX~{mmU`{6|yWC8WYQpA#dE>VFk_ipe&@kjQJXP-YwwayS8Ce>Aktvu_PX%IUWW zGV$`%aA)Yz(`W1qe(GOGH8+2f&-*G9HW)f%O{GT>EGnTqLLQYRd165f_siu`2Z0H6 zt?%J9v+QA8%+dhniGWlecW5&&VC|^In`C5b=**mI1;-Gr>PZZdNV(3~9irwwBoR`q z-7m~1bFV#ahAUo;(O#C9-%Ir8^j7thX-A2MY)>mSCe(JXco<$2%8Sp{G;J4?p_IUA zkn&j~t%DZNetcPLjo`@lkw0IyiW?+SBG8j3Sb}0StLb!1@s+Xe8ExF$Dq5^4f6>QH zIovXRFxI>q?9b^4Y9XK@`~yI6eZ+4d`isw8VP;RnoCbx=E~%Z-p2{pm2{kqSqRMAq zA-KSaOVYC*!iaHmVx0^m!LTe6$j)r+!k@RizXP2qRjrNkR9U+c{qH6RkFGBb#$)thUp)a0a zw?zj-j0#T@o8_55;&==(qE01R%k0mB3+J!AVvnMY(zF&1=!P%3EB-W(-KwsvYl+SY zs&XxC>zzYnQz|CYX`W>M6>|0M2)Hbi4E{lOvtx^k?=vS$2|{k~gkeqp56M$CKvdaQ zr0d>aZAt}2_WS%##Q(@+ssf{xx&#Rb#K_`X%iTuHxA!)}e*G7+XJXNm3YYFi=MZ(9 ze?_*)Uq;~m7oU)BHFzHSNI!v38JztUF7{c|AMqcwPxhLXJV%7aJJCj&A$p=w{6+{b zCPSz{nAL*U%(sXNl0PoUN_`AXp) z4ytj4)?Z%!!CEcl%Tz&)g^*GTBghEE@1k|d3H=xDs;)7PvJJAUZ5;v!&W8q*tRb@U z{{vs$%FW=o=DhuB>UbiaC*U0;thqQ|=BTw+)T{b!YHoF^`gJR@0S8){w9(E#{@*Z? z3{|}+y1CH`Mp$r!%HE*aYSwdM6;?uRl`EZTWAg?alttI-y7yH%@Q(SV&@KGwu+?mbl8dea4PQi=IFpFPRY8FIs{zETXZ|R#;?^IE>k#PsAP}{FhF2mj zw5BNhYuL|ogXcPA1*h-iI-C}v zJR_kHPivl%%|NruFg-zYn;JK#V|-s#k>M8R`I9*`wX9)9o!3v#{4Go9hyUtf37O@Z z$5(4_k<1qFuYx}ymVvMJ7GO@=m_nAPb1-bsBM3o=;zKE;VGY+e;!|n&&mF6Uw9wV8 ze26!%(^G){7x9oKOYzYVF}03 zI&6~(fE1|*SUNhuIZHBKy zrQ|_0^IO(w!i4w)Q#w0xXYg{>PK#dAm*RvxtJp$s&7_7m7Bt!j`A>a5`-qJ)!+5|} z1n!bIiCG6p)2wQv6e=5+y=BP^rar=C=yKAQ<39lC z-K)5JUvI9uKLEc=cWI&tO7wfnZCZ9|;sk-drz2ybXF=!cktV}U^UFu6j;%QBkvq_D zULiWQv{&ZVIx5F5#Mt)vOSVj{Y{P9mlJcz4H-UZ&3ekxGKVm5lgY)bBy;|>0 zjSNvoJ@u9$U~>*clj|HY1DDNG;_r}LE=-64y-v34?>=bq0kka_tUB{{{{RAZ=DeTe zfBRHfb!|b|s1NVhsm(ImLYBqtx)zCSaiMS!W72IyJs&bAb%USvWO*RPO9;3Uvcu!l zW_utdO~^23!*ocq$l;X&C7PGeuSs&u+8;;cChUGgYEiWs+;aM^6jf}nlOHmw9AZ_W z*c`rDhXD|1Kdz3vX?P4L`soDwb3x--d}cg5vpZ9#`;gQKebnQ_c!F@*kc<%8!j-5Y%-W{RzRCge3okr7)kn0aI1^&YRJUlf~qNtkIdXnEe zOf#?z0%96L^wn6wZLa@lg_Ok5W1o(yRe$H~?p3nit~Ouj*#+g95N@6~ld=|R>;w#M z77V&1#ZNSJ33OGs&w6(?P_BeXEl?L(NZOj|OWs%;?>k!c#=gT#?9=$vA3}Xst;c;< zh#t}7!5f-2Kj_U2>6eh8LSoic8k0`xTeSz@C%srEXQfUlP_i(xMD|B9dg{#xH$|C~ zMI%s>`~X&4K6t|bc@ugW^Rbt?KG7Jt+YI$NfaTDHqH@JHI^fH|41c9u>J|M5@CT4F zUU|+<8c%R!*M_C9z%Y8ei!lQFkn1^o(6~q`IeoLRJymy#+pt`L8clo+j3!hYt z{1qK@bPLU+hrV{a&~EG+rjJkIeM2@;K*le7n4ecC|0n)e5hdXc+Vrkldjo~50Qf3onj;;E^XI+Tk3#uc5+HEu7c*{ zQcV7G`cC6Fiz(6xFRo!pmQua!Ah-MdzXi^>m~*Rc>;ti2$+;qS78UJjM7&nhpA5iO zHtn{Z>PP&?BUWyNB!yg*z1@%g@qJvi<|MZN){dxuCcNz|1)7S&3%@4t_bV*(pDd%J-s(+*CnzRI_e=sSngF*#PRqsCQ&%CYlf!o zB!}`Hb!M0mC_*R-;j{m%R9vs`KV^NONlOc&r7-v0q-2Dof-_42r(lW@g$ncYh3rfX z(S-i3ApfCizs3dVw#B4{dTSsNz9GQCi3eB#jMPZWb^IXyadXOdVl9}98V_hnsCfT% z3}Dt-eQ9ao)7ko3+NcQo`~ty7K0b6i?|(-5pK94-%~ePTNe*+N-SNgAV+li~!zVhx z`-CtwHlwwjvx7hu<&TKU@?XDGU5<{gvoNcSJU!|__Ko+;6{B@g4pUnSYnY@-mIp8Q z_KzyhjU#Q71`Da#Quwt0E+lSTs(P@5f}&!OvXYzv@@nSAcB-BO=RGm7zI$O{>!=|T z7Ri|dJL##{6WzV|ziLN;gEZ1hkJOIlQj|>algM99fKUIgU-J;6>K#89{rhUn%#??8 zjCT)26Au6D=%!IP(F#hvMENlB?VdHh&TO6{p9vrS*R`$Z|1I|>6aP8D6U!Al`7tae zsumg|@PDh-e+vAbrsyV>`{?JXbVJzfEy4a-tTbz{1 zB_`+|kqgMZoaVYF-aTb?2$e(p*)tq9L|t{J&PG3;^AVhsZfS)7y5*y{tlxw0)!^#) z>S^o)V{o-7Jj_rH3e~68YXz7DgVwxlR^$%s@|Lf5>-4xWZ`HN+YlXK4b{13og z{{lsL@*gtO8}PU1i7yzzquM)Z?U3E9(5Ja;F&%s~r$zz7pqxX`?zfJ*E`QcXvtQ6p zcO!2Iz57*Fh&($*PS^9Pq2I-uT?pWkyMFM%Q~g6oWwS0pap*t@d->}@9KtU_K_M@2 zq67*Jr|B{aBsr8Q`@gD>Itz>D+6cT=pb7FT2%{5uyZrc z@Ok2Q+P9lKTg1MdpM?X~*ojx)Zx#k-6T2o|EIG^_4eUKD!g#&3jqb{lk+aSDz`~(( z>SE|l;QJYyPcfA74|mQPs{lkaiR?pE;ycaKi_V-#JSk+ruAxuJ(W(TZZh)4Oi8y(Oik zX=frt&mmf43%q*0dNk|0oxqucFH_t@r?02#6#C=+tYqA-;w&?5FGd$DgQUA{n;!Gx zNL<%*y;4%|lgeB#a!qpZG~#qli7Ek@3SXzNzPXk+F}&}wbKU(rc&w%jEI zZ&57`LR&Wu?aT-^SL)EO&L~V>)XfjGvI5VUVZ&xw`DYeYWIB+YyW?HivlfB(ct;eF zYNXaMDM5XPH*WG%g70Y=-eWH{e5YeWWSH zu_#jOm0}=xb2sm3JW>aK+BKkMdCAx;JSB-E2w@#sRi`j2vm%qd`|Wsj9WrI^c>`Np zyU6$cvqvhM;OR6u5mXJls(km+?uT%NS@5y;d2F>W&d*(qAkN?&2lc5rpa&1hETaQE zgCoXvlcM9)=Z2rvPQ4noIe zbE>H>>Gt(rGF9D|;_C7Su~AVKlK2{8JW%evADZ4O?^`au2S0B+ zIya5?ciFzOgUCg zNzVD@Q1^-%IvfUnIXGA$knu~b3Vy{Qvc!+04_#SV8IZOxu>}@1R+>4dLEFHKfZ4~~ z#@WB8yQBO8P}!&KTY_tKrYU;GWHYEnL8+TJ3ZIZvqZWev?WG5@VpjYw!v6q>L36u} zt-{8YM$jjp(5Xzgu=*^U=E2i5+V?v({rEv|gfL z{XEZIQNr43d*k?IhO2b45u}cD+m66j(mW0-NbvZb$+DLHs|U-Kbh|_3wW6A^y8PAf zR&1U4nA4-0$&LCG|Ra6T0-PjD_3GZoZ1YQjL9uHzMLEwOZh2e)#*uw4{wezw~}#{|cAC5P!S zoqvi;L{C+_m}E^tKr8KNA9Y z^2BeT`t(=o9*ff#iX&Oqa*ET^c(mCEOhw?!{UII;=2jKw1V037Mtyx5ppD~!GSE9A~+m}|DIQ9O;K zl6a^;4Vdq_Rbk?C?&%=UpuZn2)+WD$l_YW5hC!vx@8v7XWP9jC(?Q1}INicee-Nuews{ft@m64H- zKg&^YrB+;vl30}5AT}pkUE6yEPse)d8%TPtneO6I;}h-yl_onKjU!EL6|!@PJ25Qi zgMqOg8_Yy8V^(3$^azQ~lnzQa$Pb=tN3)DenYCepnku_Naa$vkaDP)qjAJrlV=`R|Hz>m#$VOqCMZf@mTtx^D|$6s`LOn#TM-W0s=Y+Y0zS)EpdeLKB0+yA(t zpl~5~X?fvgzjR-JOpAO_) zJN&#-p(W9)WR&M5$@o=K2S)Kz0`h!Ng+a>i9yk z2WiBl6?JMwNL}oYmv45&%1I9xT*x|8fe{-EHv9ws)bel?8_EaBCae z+~ui>iYgg-Y7+TH7)6tKvc*QE?k_lMGcLkDWzvsPAoLYssVf?&Is^s5&nXK^z@1n- z;-M(CRUa%oKX@07Uz%}ec!IedPx5C-9rgLtHTLG1J@5x0-~7Jo*YDS}P29M_M>p># zxl1$pi`w^wVOoq98g$u&_(Mg-V+Vr?j-fG!n|d#YYpAFOTr_Y63*Zl>Rk11Q=4I50 zwGN-ZjC&cMdoX{h~TOH7`z_@+mJ% z3cwq_)IX?vk+TDI#OyoC^_N!;ms6w6S?8JInKEKkZp&xeb{OP;ES7@JxY{q2871$j z5j<6hl7mSwzKx2!PW>Ter3tm}*o}f2Zr51_j+|5)F{z#5<(lOfI-9}mrDXxWI~=21%1?L>Sv`|gas{4KMiN$MdbFmIgJeF z^mmfBfuMxiUtWnA`xw&i(Z>sS?OLw|3Dzp5Z};PcLABcx+C+cuguc=r_+_R95+7Ia5y9sCacDTB~?aFrA>E!mAEE} zwYBx1gz2%4+iK06E=@-drEheSntD!u022fSo3XP#8uZ#}lY4&voI?H7DGX@8Kz);! z(s`F9Z*0vC>7Ay8YaS!nG!>0?q&Pwl@4IxJjfR)X9{{%hZjr6lRoR*ZP7wz(j@zDU zbWwB?mq0*St15-jS}0HPBsbcI)hU>mJb>0o`0$YVC{2kF5{3gguA z{DcoAizcY9sTQJ*Fej)btgJoSz$s-v<#34riLN-fu}7^#U%GH@^7wH9tnZ)gVSL3a zfE>9c11OAqrEJ!Z#ilNDrjy9#{P4$Mna^Vx-h)IMPnA1mHi4rm?< zaDKN%uPwFCi?!|TM_ubA^Ef*FZmf5#v|2kYr_L|IjG11@BFk=>yp(G9uYbtzQ@E5Q z9T}cET$dWr-6m;^*q%2Hmk7z;nO<8NH4|bJ>d#T;3j-Cq$_+L|?JqnC{1WOfxKOp# zxQCo5aRV%3HcgHvbteA+_!fDnyi)WA)D6)aqtcS%+?N*pwRENq0oK;ccv3L(0j66& z?k9$I)6N{-l8K>x1q5W^5bs+hwmDR>WhRh!z1dA?8WdW|rhjY5W%csfmfIC6Xok!Tr>93L$v>GBBS$Pa%wmt_>1C*b-WwCW`Z;rZHj$BTjPBtJpIidv~-aCt-vh8tOgr%@B_ztkv-#J zQYKM)b`(Y#qsYRXH4Tkm+TXA7#>`X7>c8|ERmNk_S?ne$XRuNyP*89`6p<1Ayv5XD z1)wW5Xe7GeK$ZJz;eHvoraQ3AWU^|a6eZ4Bt0HfLo1_F!T)WTLoad)w4s0rn(Dr>S z^3YRgjS+|nowUu@shuQGy;rjgAWqu@Ud;EgN~rFfR|nu#=Vb`Dp!n6a=C+1MHpjL! z#9JeZ`!Xo9PjpA{Amxn>9^B>!`LZ}>?DH?xGe-FelR2-N2_$IfN1un0>n#& zuVpyl**|^cU44qxPgK)`2dRnmQ3?IFta~8EPjlu+hqpbKpgb#D-XQl47OTMGGU@8TT6ImO?k#hB`lx3zbaIJ=jNwHX+8X_VTSE(YHZ*`C^*lZjGCBcigo^I0!lfkboXWK2kU=-+o3hc(LwIjhoM zf?g(dRn+p-5cm=jU5Wv<#%{dj-0Df1jL5>d{Yn#1dhWmbpp*qKy~DMt>QH6v`gQ4( zSsp$J>c4BYwzNz0F1)}c{4w{npF$hBee3z$+7stP(#xQ2_+ET)!SL(uQr3i_TY^SG ziy%3SY<2YgLTmTF>-DN7wCx0lUh zH(8thrdGw=IfzkClV|!p4lE_;u$>L!da2aWbtj%JBZgCdiwmVHD#MPG;M-Uj^r~Y1 zeI!Jjj1;|X*k!|-YWZz*+rD-CoGj^}cGP}`-FUZHFIo48sI9yqMcOu~G8y<{wUvkx z{Q;DUKwdk~nK8KO+XZmqwVz$(F6SBJlBZ^4o<+*a4RUQp3Ue`L*~df*IiH^6{WW`` zAJ%*4UyZXmrj}UC72A(a*;q6dx6@mqgJ=G-`Oby&O1ZeO+t@!I9c$#$q&A?qA`$iH zR{eI0Y@+kHr#<5RFB7!sae{pq{iuQ)66a`GP{ck>ph06OYlJ#fN2go=le&5XiA#zT zp3n`a{q5N6V)wd(kCWk!7embo^nuf>d-fAS!{|E?UN4a}E#8z>#!pB*Rp&>LyYa8i z$_8DOV-iLhW_NjM`B*)>AGt5h&W=-NbF9Xm47u^5c0UgF&Y*jH$a?f(YDuLY--J$B3l~Ir#c;$dFj_|_xvcA)*8{O3Ykl?6Oun5 zN7$L6wziP>kzTBfHVg<#q>#`WrQxrO0+m5>-+o#Fz}yKt**??XC^wK2w;-fp*UE*~b-(;$78N zr@1(O6{Wd80>(pL)`JtFh*_J&5%VP3!2mcyie7@9L5_OX<1yGj0D{3}+^QrBJX$Ba z81WNk5Ti%;)U)}saQLj)4?d2yUUpty{`+I3=x+lqWukIFl)04-MjkWAzioTA-0Bdb zSWgvv8C4v10GrX(3~xIknIzF^l1Gs6NCLYgV2_@WLiuo4S{aC?nCRk>L3L6fyPd&z zGu+LYgYs}&#CSq}UeT=WoOu=pz@~!6HmQloV5SVf*0zHrr5V!+r;sm zfpZZn&{F3^bTIdF1zY;FoX&Tq`rCQ#LaXg4#w6EHE^!c9LwZ1Y&+&<_9;=Tt>6xZa z2U6r9>oOfZX*f{FczTU1&Y&(1rN2I9c-Lp=0i`7&?t|mmxNbL7#yjhr;MLb#6Pdck zK+J{p&+Eh;iG~TfwItAmU4k#muB;C*pO3@bILw+`_Qo1} zsEO<6HB7h^RB2OV2Z(e`ED3YX-!1Fy_7$Cl+g|Zj@@lt1M^_RICqoa~TO=ue?T-R- zL3ezo-Wh<4gD1(N-qKn1)phdZ*|_NMjGeVDbQ(`m;y-d{!nO4Ua9{2g10o&^zzT7h zVgkUCUMkt2)D8mx8L8IwA?qAHeP5t;L7zcUPfdn++f^OU+EU#hf_;r+7P~P4pA!5# z@ML`Slo-ohf_{0T*IV1HOBo3LvC7GWF)N|jTUfRDRh{++pLA_RBZ0Q&dK8PsV5c1V z?vk!Ce>w}XfbO>tIb|G!Lz`hHungyp1mS}dQgS%y&mtzvY!2p+7f!K`+FM{Lnl&8{ zoT77;-+|!5Mh8a~dvC0o3D6y4?PUv3R2fwj@yD@doQ1Ptx14fDdr~G6_$Tf~yel5u zM*^wa?Kh1@Z9m>3dY)dpr%pfj5vM0x_CgMjn4XlQqS8X;{coQG5aTh+ zAfcZ|rB0t3@PGs<_!=Wg#_)U^IyU_Y}b1tb6PZL zki#BVd49oGgWP{Vn5`8CgD|{`V|%-)uOX7rDpvdw9jbNnW>DAX^+Y3G{fCIfF)0q##weq*E)nqijKJ65!Dc`2w$?7Uw3Gq8@9rfdBYPAEaO+0`i*FW$ zb^FZ!eusPp-894t5ix9p{=-&KSzXq93*tD0{RGaLwk^$^Ou3=$1>B(!5~y$IYLjZ9 zIgzNW90{1(VdSw*K?Xcum}Zme5q9_3di`{zPk~6nVTy*I+VG1(7Fx%`ev@YLj1Fxy zLQKDs+2x|2jtUFcH7E=6xm>IpJ4uY$*_2Xc2;| zHhy+M9xy3OgFX2pMSu!B$|!1#Dsb47qp80@YG4aewTIWb=S2APXGFKaD8%1>YgQTL zw6r#8(sq9O=rj&aA7&+zqDpR+N8dym*!bmItU2mC3ir6#B4D5?*0vT{v2v*TP@EQ3 zajbakRtB{n__O!us~8CB`+g5m*rPE=4CA|jdJftK3kb2%trn(LLBvzm-W0SJ=7%WQ z;DwGe1CZRBmL%8r-_SYa?Hml&Gf+LFV|SYK94X~=Ir-)OnkH#p@_ALM-I5Cj7z4uy zWJ?`QC_Gk!7>AM1-&O6W__>sDwX}D?({WuKX;ziMprJ{dXP{;~tC*)wG?Rv^RaSX( zGVF)Nc{DdclHa=zEv=D8#WS2K{7X!swF6GEgDQP*pf7SJe!6U;_1$|One@6&&yFgL z>SDR>cs;kL>YcV+td9c)Ve7`U(mYa+Kb8bZZH;z@R>NK%;Mo{>hDVA$RJ~7U`8tMM zmU<8|FI8W&jWJryd2W^awBKUDVgRYWqnM*^7lHF&!lkUSHB4}*!pnmqTV;Zi#(LF&i2 z_b{^G0IWLEpWuN8hmk8=jEAaQsC^8@oFZJ)bB3rTiK%NydCqt=OtZyoNBq3Dc_?Y) zRlUa+m-Ldm5U)`0y7Vw85Fm3xoCIuW@s-bsw*ydUuOU5rXThbw-T*Q2Pf4||u$4pw&ci#VGS<#@dIT79Lp(}I+S;1APIFVe zqOv0vyl$mA##ds<29eg|5Up#&S*1F^HoNKTCPU$=89J*BwzUV&LK1bkDN zAAEO>(~Mi@2UlgCI?=y6p%b3H&{Vk#P28pi40=&xopp_={rJ#1u1tEY|K?ipLZCE8 zkM2zL>lzz>YBDihj)XjPKFsYBx3Su?eY(PlmCu<((cWQaihw=t9Mv&ZE_hH|E^wY8 zE!FNsm|3NXFh3L!WD1FdTO$}_F4h9fng*eu8Ger>MrA34GD*GHerOi(a)(5T` z*5h0UhE@(WhISJxVU{O=orRXofS%mm!ruI!W`v>)0ei*Pd@!~yX-O-6*W#T}a}^E* z1~SC7#evHG@vi6*MkXRijNC}*2q!hdhZp^|n!gbr&p_Ttn_-@};{W&7A1sLQCy$G5lz88~rZNj|QW5qv}!_B=C9nQJp7A;!T+??}9c;n(s8QJQExADhzz!q%Kb`V1pEXI2<$3@04cM z<$pgEg9@!|u!;c89FkxJc-~aAix#w+oXx9z`Er=NVM6jfZK2E=%jJ#7knJ^`N^sJU z86Wv_+nJ>Rq{n)Xuwh^Z;JA280Bpf!5b@3y<0GsfT0?vX;ASv?wtIZS-l0C#2WPV@Vt^CM}HB08=b2|GacBucFP$)M10cf zjksPUDgY&L5RV>G)h}}G-o&O#zzg?Pw1EsqoFPIa!rb~r{}6#GmW#$OBdMC*AhN*0 z^%4bA|FTSZc0urw_TlU7k{(ZJ4D z-H-_NhnR19X_fPKR#l`#7mm8#M?5laxZ#?eQ%EXmAoa(2_)d63^dOW@2KBIQ+mf6x z1iF)D_KoF$5Ws2P=8CLdo;i6mS}rG(0oBZhFQBj7`g&0Xy-k21M{yk3p^q;) zE==vXl}qw{J>n0tjg>|btc~3oE#PCwc+rDCU>ItEp=e+X>`%*WvO`5j*_x$NwlO?^ zyVHu`3(U8)lJ~*{2vq2f^q+~cbdaXZ8=K|UU~X6DoO_j~F<8|jv&EH6<^ zzl3Stc!#y`#7W2M%@aos2ccdJT5(LUzx29FIEzfXRW(5d!tM7$yUu* z*xY!-uI)`WR#6?*HWWYAc&dH-v3PXJh6z7-j#jDp`H21|N1&H~pf)G!Owd2=!fiCS zu%j)bKcVi^F)B%&tfz2JTaAOO+$}@*-|A-tz>i)X_okc+Q4!BAKWisT*;aywMQ{z% zKnc)o=|abg56$j$p5?wC9tya>s1UT^oomqKyZXVy@)rY8|MQeq1Qvhcolwx93@O($wix%!0m)wbrHXGdEH7tTo z{Cn$rh9J|MwBAFFf;=fM#A%N3*|p!_!|tK^k_lE#=zi__P`8HF{n6nPwB6nsWtX6xslfML-7MET ze}9zf=tg_qss1H&nTvpOG5J)h4hj9a%y+MUE1!4kdNC6L4A&np=pb2+;jl>O0F-|Gv>V@l>h$w^J?x(%E6z|2|iEBf8asP=%~0swT&Ii!R6|dMzv% z=(92J1DQTUbU!Xn&XY=gNNMP$c;|Y-via9vuOT8xQT;U*R-fp3Ee1Pk+tWLuIt$`& z@(YUU&A&xPg6IRZroT<&_!8@&2crJU6O#XKc1O_}^2+m=zZ6KucN9IFohA_SuLtA^ zs819(hX>Jy|Mx%yVSk0*eT9%p?HkHDnBo;%U@7NKACjI1>02xO(gjIc#a883VN4hf z^*uIr`jH2p(R|bq6NoEM9;km<{I>oYsvGjHzv&_|T5lV|EDU!Ls#p{q#I^2YXlZHZ zk{+QBL2kYwhp9De`QpGfh&4vAW!>UqI8j#V-%OGlmpGa5DW3;9vTuJ3<=iq8N(5aq lv7Yb8zfj)vvXW|cR03yIf|}fh?SFIwh?u3w5rqFN|36ICAZ`Ev diff --git a/0x49/images/linux.gif b/0x49/images/linux.gif deleted file mode 100644 index afa21e0ac94b4dcd589ebca965902f297352b7c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1770 zcmbVLjZ;)r6yIHT`B)MjxPndEJd|CZeYrWJ3q~!5@^;m{fWn0cp9FX@&}$8K$v*gI zEz%b<@i4?Epps^T6$68PtY!r@DJqhr7AO@pHlmJ_eQ4*c^$+y+&Dnd-`JLZ6_jh)a zTuU6WYvOhBx(VIC565vl&kKTJx7!^KhbW2&A&fC0gi^{F^LRY6EGvqls%m?Cdv|wt zZ*T9JGiS!e#%}u_1~@_#StgRCDhfu3f$Q;5a3Kg>qA2h@0~dn83;>KNLPQi9LKLia z5E(`ktb{2>1P%nsfdmr_c!(nkmO>*Bg_HvAFxFt0N{DCxI3o&{LKZNXNH7Vwm=Z*^ zIHH;>GT+1sFaVFL01IP8ff6WGA*f9(2s~rpLJ*_?0HzcXC})Uj3?kKDL?~EHfSE~( z>LCDTA^{9YKp`R%h6OuMm?SuO3e&^;exThrru;-T|*b7!@3L9^wu==nm?G z;)F3+jJ6(!gNK7=9fU&A!2_@0fE7U}SPmf!cIewA&}pPZV!%bAnM4&?B^X>gT!l(Z z@qp_S18bU5O();Ad?PBdLL{OpDn^h7utFuOY78JVhN+pvRF8T`SBCHC3YP|HK^31i znn-Z5`js;#S%rB z01{yeRz&~(ivQ1d)J>zW>;cVc{|Q~-ZJl4>G_gZHToE|=zO3GkU7yu(Gu=(%o2t$) zz`pJgUTsM#H-#^gog?La+ibIHS4!%|q?*X2mL}J=Hn(9;SalQnVDItZ$ zHuG~?I__37BG(@^7(%kzRqy3QV{TEzD=h52QgfK`?OJ)l?*58fc=g>?qY} z^dDql^_G?H!KWgS6@aHO+Lf0TK%H)NzI=;tNmg&X~L$K)g&X)Km= zT|0!tTUOWo*+#3;1oV9bwofkQ7uCk&W|e#p-FM*P0!YLWG+XTrq=a@E?1qq_~J z&Km2Al)53T51mKl%ILbasP@q(CbDb&J7%NmL)Rm{X~iui`kkh#e0k^J`uqAz1EbK0 zv*TcTPM$MjVBen8Ww&oSnRFW&u?ShV z88Rl?T2I~jy}dR#toX2gRaxFeS6wU`bY^XIbMKgf(yU#pMxOu0#m&ppZQT5FV130F z_d5lhgPkP>F8}uY_nbFg`*x?xQrk5|`ch()gO4QlBfrTX=BN1CqL3~_x#C}tdLx-S zGrf5=2lmI!9eAkpZub|niw8fBxp(VZnT~O1Y|lcj;mXy#*7A>nmf)P`vis4ofUx27 ziyn5{vkh5m8fNP4rz*LOYt!SJj;%AC9$0J}8F*krR>)iLH`~rH;|lv{L^qy_TmP=m z5N?@bFcxRuNZHcSC;OW|4Ap;Fr|B`wI{PWLZ5ii+Kf`W zrbp-QztK0^{dk@0Tz{AOS6AB7pJw0cIAD%)X8jz}H>ss#`=9xRmu5WshDt^0|`5FC`{MB`KH9@$*v+hZaPq6~%wjcA$ZqivHf6^Je|%Rm*gF>hcvXZ^{z3 ze_&gB|I*RHW%dpxKu4yiH+%EnO|!O{^Z8_~)dw!#zv(G?h@iz|^J z4}}UI46zUt3M$+NjwWENmMH}sDY77$;2I>ri2{e)k|Gdp^H11&zpp+oKCeE>H}=@k z@Q5$dfgi8|Kv5I`N&r+a3?m4_7iXbSG1n>90!2c<*@16Ya3-&AuP!8U4-7NzbSv&Zt z!`;_~01goA;(BfjR(c#f^Za-ccSy^Psc>67-!^h(Z&bZxpPp|mOHF-G-Lylj}%G%hh);H*8 z0i)(ya>7^sL&fCySFP!T<($syhN7NVlWanq3eAR`GI9$g#y20WR=9;Zb!L1V`Qg&j z>dN@)FW&ku-@bnSH4|$5+l9R+y=Ar0Uy(jrR_Q|7yG-{zU)Y&By`od?m*17=&Y9Pm z42p@0kyy)v$Qw&#V>xDP-qU%8s{@)C+Z6BEe5s}g+#@)wdw(*4OVeUO%th~nfBZzy zR%l&Hs$tcg6^2d-D+1=a(=P3Mfx1e3J=AI%oDmAq-GNEX@abKBm~f!0TUY^)BsMtn zfO{>C;sTVx&PJ2yNsXUDG^f!rU*P5FMgw-NKnTEGHKcL}uZ7SPEXCG(Q+MOs` z%V@|g4TbHJQyhRZo2xeI*yv0#mh3rYYDngvYpnxmGcOyCZzV@F=$kR9);0RpBJ*?M z69voZ+#)0jZ@aZyRCs`TtP_2|)rvCcO`MLOn(LqG(I%Rj0L;yUz`4&E6r+ga$)%pb zE&2d6!yn~|#t(&d>B9524FI}^(?J`QEiUMOIr^vrqCYyZujM?S4?831xptHZrZTk| zV)ZGEt?A!?^_#!S@!lPrdtJS4MU4wlP7^!`vvXV@Gi)tqwxgv}{hb4&xPuz)T;XT; z4%IrEhJvn2I${ew!T6nJPkt^|`dG}t10TE%0c1h&o@V#$qRgH%o>kHJFUY-5{l4p> z_a4Y2cvCx?Ry1`RVzZV9>ZKu-`FCMX>esB@*EG=`W?5#K$QR=!{unOWE&#}IRp_t> z>!jW3YoSE>0?Hg7=5=?PU(Fx$N|V&sdkz1wz`XpcPk(%Pb~hidCPx>D>x(x#?ytS{ZeLk{t^e7wzQij}*jVN~tKL|VAD-JFP4<3~C`F@zBmV+VCF!aF diff --git a/0x49/images/note-be.jpg b/0x49/images/note-be.jpg deleted file mode 100644 index 94d58805cc14ee65e435a4fce7bd88335c2ec630..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227425 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

  • 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 R&97~4u7u6p<<$Q=_Ft>EB>?~c diff --git a/0x49/images/note-linux.gif b/0x49/images/note-linux.gif deleted file mode 100644 index acdfdba092ef29204073a22b2e486d120eca7fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7387 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 NhE=R%EolS*06U)0EHMB8 diff --git a/0x49/images/note-win32.gif b/0x49/images/note-win32.gif deleted file mode 100644 index 3c379a36a112b877065d6fea84401adc131725f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7627 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 SO)o~TpoX9+3m_ck|2F|i!sMm^ diff --git a/0x49/images/note_be_small.png b/0x49/images/note_be_small.png deleted file mode 100644 index b7ee8d11afe8ea7d5aa40e2b02f10ac6d7512faa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23865 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 M07*qoM6N<$g8UeBxc~qF diff --git a/0x49/images/note_linux_small.png b/0x49/images/note_linux_small.png deleted file mode 100644 index f42b78f516feb6e47c3b9a680efff4c587b40426..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 997 zcmVlp>nVGV(vH$?h%>d2z zObG4(00U`BL_t(|ob8>9mf|1`KnYvHoLi2JENue;5J~Zh8Y7p z_K!q>Vhvb;?J)uNrCdJpB`d)0JYTQPzO3C0Y{nE3fc%r%T^b+D5oR_?1ng$5i6SK; zrMZwp02mT@aC0~SW1jZ8hhg`4#)#|~iP()|KnF{N8%u;6ON1Lsgd0i3P#rV4ku5{z z>8<cQr(7zj6_9x2PnMv|H0ctn!8&k-T1S>GM60EjdixO^OKaq~?L0t15Shs9=e3 zV~KD>nTTV;Wf29a5@{o9@-I2pFwNB``FZE+MNIN&n@+sU2Tx$(MiE0J0!>6rx%wp6 zL{y+m_-EfNCKR6^0%<#|RR-QeWoCarR4^7O>~w#z0qL6yrfRM#6Bg2+abJ zE9)x)6LgOeiL4LkxUodIu|&9`O2m)3X1>WfqKRjis8q{C=Gmm$4^>@W(>?iGB}MDV zy21kHYeCA_B8g|DGPTWDJIwd;Bwq_N*z$h(NWK;ksSN>7cB=tjlgHXrK-2E?c?R9A zltsX~_Q@`Ys7cOL!4l!d65+;}9VC<_qCiDe*HXa};l>i-1{HDSTHFhAD-z!uluKds z5pij`^r7EZP&q~lE;L`6$Oul;waSM9t%wX0l@Srm65+-Y;l_Bbg=bo_j_%#LR$c%< zTNXnX5tjoYTSPRo_ah=%BHU0pMnrScwPd|>pNimjtwKdaqgn(z)XDswz^&Vzh&VI} zZF(uoRP3{^L5G$LGY&u zF-AnOM7W_+#7)-3a3s~#$pZQ7L!lxCH6o(<=d8D3GG&Buq^5%%=Y`_L%8;j!@im#I zaFD6rd8M2($`BFF65+-Y;Rc&&7yjY|5;lJm`%aPX&gi*8L`~OH!PfnQ7`glfy;zQk TGnK=i00000NkvXXu0mjfhzZLO diff --git a/0x49/images/note_win32_small.png b/0x49/images/note_win32_small.png deleted file mode 100644 index ea3a86d2ad13eddbd404357f31d83d379436a7c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1167 zcmV;A1aSL_P)SJ8YQxF${xClwGixDCa3_vE+nzX3` zM4*V>G<^gh5_CadLiD~8AOXxM2O9!1jT%ILc6s)Aj1L1MOAb|m)Bu7Z$P|{yBb)M*MTV8WhGiP$YPoV12H91K(M5vL!b`=@OT$eq~$?U z;za-s0~|U)@&jD2w%SN(BhF9LuI70?Rx*$L|ROOR` zt4~1gueLxU{}t#_UAvzWa&rx^7LnUAD0E%%@tdpW$e)3HA39ZS5!Cuvw!IH9PIS?P1bmc=?{Ow0U z_TN^YI!JBmAhoH3)TXvTPK^CR@PC<32C*YQ9saLT5Jh=W);D=~?4?IhZlDfQo3^e+ z+0qGJ*X2H4ixTJdQD8T3V=HU)hD^6ghKRSVMFIb{?bO#!880XgLL7GM#xs!km$w)M>0RWfo+Ez$%8aM2 zHd5M%Gt@z9Q+nZ9?DYaaEvM*5aHH&k0U9)+QR&jLhTNNTYvaNHUQQFk1rhbAtu|8H zh%?lqD7C3AkZcsipTpDi3$^aX2i-52-q#Kv$ei%E+ImQ2WJjcP54KDU%xWxr%T!{U z`jYaSse{y}4pN&sNNw7>q+DOKTRJY~$453P<=z9tmt4kU18y}-%E8V@5Bd#tEh%Sj h*bmZ%=3#C`{{b)Dg|pat4tQ6_S6z z2dBHJQ`sDrg1;VqG{^03B6%L~{hkls?>UDba?ar_iq3>`3J@axF9;D4ad`M;W|nlK zi=Lh*wY61@vEt%lLyefSF-RZ=2Yann3lRbEqaz*&c#~~O+0S6B_^6L2f_S|z=I5uZ zRto@d&N+ur=ra+HjPxf13d;D@l0h^??Ck8+G|g(YaDK!&5aI0Xm+WlC;kZFWcKbD( z&6Y}e@YpXr>a9j15s&9?S65p>!TCTSl#`QPS!rjC$+8>>gzD;?L})f!bQA;7*47px zdOUTiTJ3h%m`t)POD2a?av~ny&8#eCa`JfWRKmo7Vd0bpk4&Ct->q&OUo98W|yGelfj`Gkl>#2Aw# zsj$#?aB$ey_f*_!QrXhd4gkjM7ocG9b!ll408C6wZ*T9$<9kkL1rZ5Qd3o8|TBM}p zmi{5*|5SZ_y{3H~7 - - - - - - - - www.0x49.org - the note homepage (<? print $src ?>) - - - -
    - - - - -
    - - - - - - - - -
    - note - ; - close VERSION; - chomp $version; - print $version; - ?> - homepage -
    - - ; - close MENU; - foreach (@menu) { - if(/\Q$me\E/) { - print "$_"; - } - else { - print; - } - } - ?> - -

     

    -
    - - - - -
    -; - print @lines; - close SRC; -?> -
    -
    -
    -

    - - diff --git a/CVS/Entries b/CVS/Entries index 1cfbb0e..f831dbf 100644 --- a/CVS/Entries +++ b/CVS/Entries @@ -1,12 +1,15 @@ -/Makefile.PL/1.1.1.1/Sat Jul 1 14:40:50 2000// +/Makefile.PL/1.2/Thu Aug 10 09:21:56 2000// /UPGRADE/1.1.1.1/Sat Jul 1 14:40:50 2000// /note/1.1.1.1/Sat Jul 1 14:40:50 2000// +/note.1/1.1/Thu Aug 10 09:23:02 2000// +/note.pod/1.1/Thu Aug 10 09:23:02 2000// /stresstest.sh/1.1.1.1/Sat Jul 1 14:40:50 2000// D/0x49//// D/NOTEDB//// D/bin//// D/config//// D/mysql//// -/Changelog/1.2/Sun Jul 9 22:08:40 2000// -/VERSION/1.2/Sun Jul 9 22:10:55 2000// -/README/1.2/Sun Jul 9 22:37:00 2000// +/Changelog/1.4/Fri Aug 11 00:03:46 2000// +/NOTEDB.pm/1.2/Fri Aug 11 00:05:58 2000// +/README/1.4/Fri Aug 11 00:03:51 2000// +/VERSION/1.3/Fri Aug 11 00:03:51 2000// diff --git a/Changelog b/Changelog index d90fe3e..3e1b75b 100644 --- a/Changelog +++ b/Changelog @@ -29,6 +29,9 @@ CHANGED: use "unshift" instead of push to add $libpath to @INC. ADDED: a new feature, Caching of notes. supported by binary.pm and mysql.pm. To turn it on, one need to set "Cache" in the config to a true value. +CHANGED: oop-ized and re-indented the modules dbm.pm, mysql.pm and + binary.pm. +ADDED: You can now specify a port for the mysql backend ("DbPort"). ================================================================================ diff --git a/Makefile.PL b/Makefile.PL index 1f1d904..d680609 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -2,7 +2,7 @@ # NOTEDB::mysql and NOTEDB::binary are internals # of note. # -# $Id: Makefile.PL,v 1.1.1.1 2000/07/01 14:40:50 zarahg Exp $ +# $Id: Makefile.PL,v 1.2 2000/08/10 09:21:56 zarahg Exp $ # # check for the existence of optional modules: sub chk_mod diff --git a/NOTEDB.pm b/NOTEDB.pm index c8ee73b..17a2111 100644 --- a/NOTEDB.pm +++ b/NOTEDB.pm @@ -2,7 +2,7 @@ # this is a generic module, used by note database # backend modules. # -# $Id$ +# $Id: NOTEDB.pm,v 1.2 2000/08/11 00:05:58 zarahg Exp $ # # Copyright (c) 2000 Thomas Linden @@ -10,36 +10,40 @@ package NOTEDB; BEGIN { - # make sure, it works, otherwise encryption - # is not supported on this system! - eval { require Crypt::CBC; }; - if($@) { - $NOTEDB::crypt_supported = 0; - } - else { - $NOTEDB::crypt_supported = 1; - } + # make sure, it works, otherwise encryption + # is not supported on this system! + eval { require Crypt::CBC; }; + if($@) { + $NOTEDB::crypt_supported = 0; + } + else { + $NOTEDB::crypt_supported = 1; + } } sub no_crypt { - $NOTEDB::crypt_supported = 0; + $NOTEDB::crypt_supported = 0; } sub use_crypt { - my($this,$key,$method) = @_; - if($NOTEDB::crypt_supported == 1) { - eval { - $cipher = new Crypt::CBC($key, $method); - }; - if($@) { - $NOTEDB::crypt_supported == 0; - } + my($this,$key,$method) = @_; + my($cipher); + if($NOTEDB::crypt_supported == 1) { + eval { + $cipher = new Crypt::CBC($key, $method); + }; + if($@) { + $NOTEDB::crypt_supported == 0; } - else{ - print "warning: Crypt::CBC not supported by system!\n"; + else { + $this->{cipher} = $cipher; } + } + else{ + print "warning: Crypt::CBC not supported by system!\n"; + } } @@ -150,7 +154,10 @@ sub generate_search { $string =~ s/\/\s*(?!and|or)/\//g; + #my $res = qq(\$match = 1 if($string);); return qq(\$match = 1 if($string);); + #print $res . "\n"; + #return $res; } sub check_or { @@ -179,25 +186,49 @@ sub check_exact { # my($this, $str) = @_; - my %globs = ( - '*' => '.*', - '?' => '.', - '[' => '[', - ']' => ']', - '+' => '\+', - '.' => '\.', - '$' => '\$', - '@' => '\@', + my %wildcards = ( + '*' => '.*', + '?' => '.', + '[' => '[', + ']' => ']', + '+' => '\+', + '.' => '\.', + '$' => '\$', + '@' => '\@', + '/' => '\/', + '|' => '\|', + '}' => '\}', + '{' => '\{', ); + my %escapes = ( + '*' => '\*', + '?' => '\?', + '[' => '[', + ']' => ']', + '+' => '\+', + '.' => '\.', + '$' => '\$', + '@' => '\@', + '(' => '\(', + ')' => '\)', + '/' => '\/', + '|' => '\|', + '}' => '\}', + '{' => '\{', + ); + # mask backslash $str =~ s/\\/\\\\/g; + if ($str =~ /^"/ && $str =~ /"$/) { # mask bracket-constructs - $str =~ s/(\(|\))/\\$1/g; + $str =~ s/(.)/$escapes{$1} || "$1"/ge; + } + else { + $str =~ s/(.)/$wildcards{$1} || "$1"/ge; } - $str =~ s/(.)/$globs{$1} || "$1"/ge; $str =~ s/^"//; $str =~ s/"$//; diff --git a/NOTEDB/CVS/Entries b/NOTEDB/CVS/Entries index 1a34910..ff2a28f 100644 --- a/NOTEDB/CVS/Entries +++ b/NOTEDB/CVS/Entries @@ -1,5 +1,5 @@ /README/1.1.1.1/Sat Jul 1 14:40:52 2000// -/binary.pm/1.1.1.1/Sat Jul 1 14:40:52 2000// -/dbm.pm/1.1.1.1/Sat Jul 1 14:40:52 2000// -/mysql.pm/1.1.1.1/Sat Jul 1 14:40:52 2000// +/binary.pm/1.3/Fri Aug 11 00:05:58 2000// +/dbm.pm/1.3/Fri Aug 11 00:05:58 2000// +/mysql.pm/1.3/Fri Aug 11 00:05:58 2000// D diff --git a/NOTEDB/binary.pm b/NOTEDB/binary.pm index 003239e..d56d4f0 100644 --- a/NOTEDB/binary.pm +++ b/NOTEDB/binary.pm @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $Id: binary.pm,v 1.1.1.1 2000/07/01 14:40:52 zarahg Exp $ +# $Id: binary.pm,v 1.3 2000/08/11 00:05:58 zarahg Exp $ # Perl module for note # binary database backend. see docu: perldoc NOTEDB::binary # @@ -14,185 +14,179 @@ use NOTEDB; use Fcntl qw(LOCK_EX LOCK_UN); -# Globals: -my ($NOTEDB, $sizeof, $typedef,$version); -my ($cipher); - -$version = "(NOTEDB::binary, 1.6)"; - sub new { - my($this, $dbdriver, $dbname, $MAX_NOTE, $MAX_TIME) = @_; + my($this, $dbdriver, $dbname, $MAX_NOTE, $MAX_TIME) = @_; - my $class = ref($this) || $this; - my $self = {}; - bless($self,$class); - $NOTEDB = $dbname; + my $class = ref($this) || $this; + my $self = {}; + bless($self,$class); - if(! -e $NOTEDB) - { - open(TT,">$NOTEDB") or die "Could not create $NOTEDB: $!\n"; - close (TT); - } - elsif(! -w $NOTEDB) - { - print "$NOTEDB is not writable!\n"; - exit(1); - } + if(! -e $dbname) { + open(TT,">$dbname") or die "Could not create $dbname: $!\n"; + close (TT); + } + elsif(! -w $dbname) { + print "$dbname is not writable!\n"; + exit(1); + } - my $TYPEDEF = "i a$MAX_NOTE a$MAX_TIME"; - my $SIZEOF = length pack($TYPEDEF, () ); + $self->{version} = "(NOTEDB::binary, 1.7)"; + $self->{NOTEDB} = $dbname; + my $TYPEDEF = "i a$MAX_NOTE a$MAX_TIME"; + my $SIZEOF = length pack($TYPEDEF, () ); - $sizeof = $SIZEOF; - $typedef = $TYPEDEF; + $self->{sizeof} = $SIZEOF; + $self->{typedef} = $TYPEDEF; - return $self; + return $self; } sub DESTROY { - # clean the desk! + # clean the desk! } sub version { - return $version; + my $this = shift; + return $this->{version}; } sub set_del_all { - unlink $NOTEDB; - open(TT,">$NOTEDB") or die "Could not create $NOTEDB: $!\n"; - close (TT); + my $this = shift; + unlink $this->{NOTEDB}; + open(TT,">$this->{NOTEDB}") or die "Could not create $this->{NOTEDB}: $!\n"; + close (TT); } sub get_single { - my($this, $num) = @_; - my($address, $note, $date, $buffer, $n, $t, $buffer, ); + my($this, $num) = @_; + my($address, $note, $date, $buffer, $n, $t, $buffer, ); - open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; + open NOTE, "+<$this->{NOTEDB}" or die "could not open $this->{NOTEDB}\n"; + flock NOTE, LOCK_EX; - $address = ($num-1) * $sizeof; - seek(NOTE, $address, IO::Seekable::SEEK_SET); - read(NOTE, $buffer, $sizeof); - ($num, $n, $t) = unpack($typedef, $buffer); + $address = ($num-1) * $this->{sizeof}; + seek(NOTE, $address, IO::Seekable::SEEK_SET); + read(NOTE, $buffer, $this->{sizeof}); + ($num, $n, $t) = unpack($this->{typedef}, $buffer); - $note = ude($n); - $date = ude($t); + $note = $this->ude($n); + $date = $this->ude($t); - flock NOTE, LOCK_UN; - close NOTE; + flock NOTE, LOCK_UN; + close NOTE; - return $note, $date; + return $note, $date; } sub get_all { - my $this = shift; - my($num, $note, $date, %res); + my $this = shift; + my($num, $note, $date, %res); - if ($this->unchanged) { - return %{$this->{cache}}; - } - open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - my($buffer, $t, $n); - seek(NOTE, 0, 0); # START FROM BEGINNING - while(read(NOTE, $buffer, $sizeof)) { - ($num, $note, $date) = unpack($typedef, $buffer); - $t = ude($date); - $n = ude($note); - $res{$num}->{'note'} = $n; - $res{$num}->{'date'} = $t; - } - flock NOTE, LOCK_UN; - close NOTE; + if ($this->unchanged) { + return %{$this->{cache}}; + } + open NOTE, "+<$this->{NOTEDB}" or die "could not open $this->{NOTEDB}\n"; + flock NOTE, LOCK_EX; + my($buffer, $t, $n); + seek(NOTE, 0, 0); # START FROM BEGINNING + while(read(NOTE, $buffer, $this->{sizeof})) { + ($num, $note, $date) = unpack($this->{typedef}, $buffer); + $t = $this->ude($date); + $n = $this->ude($note); + $res{$num}->{'note'} = $n; + $res{$num}->{'date'} = $t; + } + flock NOTE, LOCK_UN; + close NOTE; - $this->cache(%res); - return %res; + $this->cache(%res); + return %res; } sub get_nextnum { - my $this = shift; - my($num, $te, $me, $buffer); + my $this = shift; + my($num, $te, $me, $buffer); - if ($this->unchanged) { - $num = 1; - foreach (keys %{$this->{cache}}) { - $num++; - } - return $num; + if ($this->unchanged) { + $num = 1; + foreach (keys %{$this->{cache}}) { + $num++; } - open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - - seek(NOTE, 0, 0); # START FROM BEGINNING - while(read(NOTE, $buffer, $sizeof)) { - ($num, $te, $me) = unpack($typedef, $buffer); - } - $num += 1; - flock NOTE, LOCK_UN; - close NOTE; - return $num; + } + open NOTE, "+<$this->{NOTEDB}" or die "could not open $this->{NOTEDB}\n"; + flock NOTE, LOCK_EX; + + seek(NOTE, 0, 0); # START FROM BEGINNING + while(read(NOTE, $buffer, $this->{sizeof})) { + ($num, $te, $me) = unpack($this->{typedef}, $buffer); + } + $num += 1; + flock NOTE, LOCK_UN; + close NOTE; + + return $num; } sub get_search { - my($this, $searchstring) = @_; - my($buffer, $num, $note, $date, %res, $t, $n, $match); + my($this, $searchstring) = @_; + my($buffer, $num, $note, $date, %res, $t, $n, $match); - my $regex = $this->generate_search($searchstring); - eval $regex; - if ($@) { - print "invalid expression: \"$searchstring\"!\n"; - return; - } - $match = 0; + my $regex = $this->generate_search($searchstring); + eval $regex; + if ($@) { + print "invalid expression: \"$searchstring\"!\n"; + return; + } + $match = 0; - if ($this->unchanged) { - foreach my $num (keys %{$this->{cache}}) { - $_ = $this->{cache}{$num}->{note}; - eval $regex; - if ($match) { - $res{$num}->{note} = $this->{cache}{$num}->{note}; - $res{$num}->{date} = $this->{cache}{$num}->{date} - } - $match = 0; + if ($this->unchanged) { + foreach my $num (keys %{$this->{cache}}) { + $_ = $this->{cache}{$num}->{note}; + eval $regex; + if ($match) { + $res{$num}->{note} = $this->{cache}{$num}->{note}; + $res{$num}->{date} = $this->{cache}{$num}->{date} } - return %res; + $match = 0; } - - open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - - seek(NOTE, 0, 0); # START FROM BEGINNING - while(read(NOTE, $buffer, $sizeof)) - { - ($num, $note, $date) = unpack($typedef, $buffer); - $n = ude($note); - $t = ude($date); - $_ = $n; - eval $regex; - if($match) - { - $res{$num}->{'note'} = $n; - $res{$num}->{'date'} = $t; - } - $match = 0; - } - flock NOTE, LOCK_UN; - close NOTE; - return %res; + } + + open NOTE, "+<$this->{NOTEDB}" or die "could not open $this->{NOTEDB}\n"; + flock NOTE, LOCK_EX; + + seek(NOTE, 0, 0); # START FROM BEGINNING + while(read(NOTE, $buffer, $this->{sizeof})) { + ($num, $note, $date) = unpack($this->{typedef}, $buffer); + $n = $this->ude($note); + $t = $this->ude($date); + $_ = $n; + eval $regex; + if($match) + { + $res{$num}->{'note'} = $n; + $res{$num}->{'date'} = $t; + } + $match = 0; + } + flock NOTE, LOCK_UN; + close NOTE; + + return %res; } @@ -200,132 +194,135 @@ sub get_search sub set_edit { - my($this, $num, $note, $date) = @_; - my $address = ($num -1 ) * $sizeof; + my($this, $num, $note, $date) = @_; + my $address = ($num -1 ) * $this->{sizeof}; - open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; + open NOTE, "+<$this->{NOTEDB}" or die "could not open $this->{NOTEDB}\n"; + flock NOTE, LOCK_EX; - seek(NOTE, $address, IO::Seekable::SEEK_SET); - my $n = uen($note); - my $t = uen($date); + seek(NOTE, $address, IO::Seekable::SEEK_SET); + my $n = $this->uen($note); + my $t = $this->uen($date); - my $buffer = pack($typedef, $num, $n, $t); - print NOTE $buffer; + my $buffer = pack($this->{typedef}, $num, $n, $t); + print NOTE $buffer; - flock NOTE, LOCK_UN; - close NOTE; + flock NOTE, LOCK_UN; + close NOTE; - $this->changed; + $this->changed; } sub set_new { - my($this, $num, $note, $date) = @_; - open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; + my($this, $num, $note, $date) = @_; + open NOTE, "+<$this->{NOTEDB}" or die "could not open $this->{NOTEDB}\n"; + flock NOTE, LOCK_EX; - seek(NOTE, 0, IO::Seekable::SEEK_END); # APPEND - my $n = uen($note); - my $t = uen($date); - my $buffer = pack($typedef, $num, $n, $t); - print NOTE $buffer; + seek(NOTE, 0, IO::Seekable::SEEK_END); # APPEND + my $n = $this->uen($note); + my $t = $this->uen($date); + my $buffer = pack($this->{typedef}, $num, $n, $t); + print NOTE $buffer; - flock NOTE, LOCK_UN; - close NOTE; + flock NOTE, LOCK_UN; + close NOTE; - $this->changed; + $this->changed; } sub set_del { - my($this, $num) = @_; - my(%orig, $note, $date, $T, $setnum, $buffer, $n, $N, $t); + my($this, $num) = @_; + my(%orig, $note, $date, $T, $setnum, $buffer, $n, $N, $t); - $setnum = 1; + $setnum = 1; - %orig = $this->get_all(); - return "ERROR" if (! exists $orig{$num}); + %orig = $this->get_all(); + return "ERROR" if (! exists $orig{$num}); - delete $orig{$num}; + delete $orig{$num}; - # overwrite, but keep number! - open NOTE, ">$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - seek(NOTE, 0, 0); # START FROM BEGINNING - foreach $N (keys %orig) { - $n = uen($orig{$N}->{'note'}); - $t = uen($orig{$N}->{'date'}); - $buffer = pack( $typedef, $N, $n, $t); # keep orig number, note have to call recount! - print NOTE $buffer; - seek(NOTE, 0, IO::Seekable::SEEK_END); - $setnum++; - } - flock NOTE, LOCK_UN; - close NOTE; + # overwrite, but keep number! + open NOTE, ">$this->{NOTEDB}" or die "could not open $this->{NOTEDB}\n"; + flock NOTE, LOCK_EX; + seek(NOTE, 0, 0); # START FROM BEGINNING + foreach $N (keys %orig) { + $n = $this->uen($orig{$N}->{'note'}); + $t = $this->uen($orig{$N}->{'date'}); + $buffer = pack( $this->{typedef}, $N, $n, $t); + # keep orig number, note have to call recount! + print NOTE $buffer; + seek(NOTE, 0, IO::Seekable::SEEK_END); + $setnum++; + } + flock NOTE, LOCK_UN; + close NOTE; - $this->changed; + $this->changed; - return; + return; } sub set_recountnums { - my($this) = @_; - my(%orig, $note, $date, $T, $setnum, $buffer, $n, $N, $t); + my($this) = @_; + my(%orig, $note, $date, $T, $setnum, $buffer, $n, $N, $t); - $setnum = 1; - %orig = $this->get_all(); + $setnum = 1; + %orig = $this->get_all(); - open NOTE, ">$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - seek(NOTE, 0, 0); # START FROM BEGINNING + open NOTE, ">$this->{NOTEDB}" or die "could not open $this->{NOTEDB}\n"; + flock NOTE, LOCK_EX; + seek(NOTE, 0, 0); # START FROM BEGINNING - foreach $N (sort {$a <=> $b} keys %orig) { - $n = uen($orig{$N}->{'note'}); - $t = uen($orig{$N}->{'date'}); - $buffer = pack( $typedef, $setnum, $n, $t); - print NOTE $buffer; - seek(NOTE, 0, IO::Seekable::SEEK_END); - $setnum++; - } - flock NOTE, LOCK_UN; - close NOTE; + foreach $N (sort {$a <=> $b} keys %orig) { + $n = $this->uen($orig{$N}->{'note'}); + $t = $this->uen($orig{$N}->{'date'}); + $buffer = pack( $this->{typedef}, $setnum, $n, $t); + print NOTE $buffer; + seek(NOTE, 0, IO::Seekable::SEEK_END); + $setnum++; + } + flock NOTE, LOCK_UN; + close NOTE; - $this->changed; + $this->changed; - return; + return; } sub uen { - my($T); - if($NOTEDB::crypt_supported == 1) { - eval { - $T = pack("u", $cipher->encrypt($_[0])); - }; - } - else { - $T = pack("u", $_[0]); - } - chomp $T; - return $T; + my $this = shift; + my($T); + if($NOTEDB::crypt_supported == 1) { + eval { + $T = pack("u", $this->{cipher}->encrypt($_[0])); + }; + } + else { + $T = pack("u", $_[0]); + } + chomp $T; + return $T; } sub ude { - my($T); - if($NOTEDB::crypt_supported == 1) { - eval { - $T = $cipher->decrypt(unpack("u",$_[0])); - }; - } - else { - $T = unpack("u", $_[0]); - } - return $T; + my $this = shift; + my($T); + if($NOTEDB::crypt_supported == 1) { + eval { + $T = $this->{cipher}->decrypt(unpack("u",$_[0])); + }; + } + else { + $T = unpack("u", $_[0]); + } + return $T; } diff --git a/NOTEDB/dbm.pm b/NOTEDB/dbm.pm index 74b051f..c119ac9 100644 --- a/NOTEDB/dbm.pm +++ b/NOTEDB/dbm.pm @@ -1,180 +1,187 @@ #!/usr/bin/perl -# $Id: dbm.pm,v 1.1.1.1 2000/07/01 14:40:52 zarahg Exp $ +# $Id: dbm.pm,v 1.3 2000/08/11 00:05:58 zarahg Exp $ # Perl module for note # DBM database backend. see docu: perldoc NOTEDB::dbm # +package NOTEDB; + use DB_File; -#use Data::Dumper; +use Data::Dumper; use NOTEDB; use strict; -package NOTEDB; + # Globals: -my ($dbm_dir, $notefile, $timefile, $version, $cipher, %note, %date); -$notefile = "note.dbm"; -$timefile = "date.dbm"; +my (%note, %date); -$version = "(NOTEDB::dbm, 1.1)"; sub new { - my($this, $dbdriver, $dbm_dir) = @_; - my $class = ref($this) || $this; - my $self = {}; - bless($self,$class); + my($this, $dbdriver, $dbm_dir) = @_; + my $class = ref($this) || $this; + my $self = {}; + bless($self,$class); - tie %note, "DB_File", "$dbm_dir/$notefile" || die $!; - tie %date, "DB_File", "$dbm_dir/$timefile" || die $!; + my $notefile = "note.dbm"; + my $timefile = "date.dbm"; + $self->{version} = "(NOTEDB::dbm, 1.2)"; - return $self; + tie %note, "DB_File", "$dbm_dir/$notefile" || die $!; + tie %date, "DB_File", "$dbm_dir/$timefile" || die $!; + + return $self; } sub DESTROY { - # clean the desk! - untie %note, %date; + # clean the desk! + untie %note, %date; } sub version { - return $version; + my $this = shift; + return $this->{version}; } -sub get_single +sub get_single { - my($this, $num) = @_; - my($note, $date); - return ude ($note{$num}), ude($date{$num}); + my($this, $num) = @_; + my($note, $date); + return $this->ude ($note{$num}), $this->ude($date{$num}); } sub get_all { - my($this, $num, $note, $date, %res, $real); - foreach $num (sort {$a <=> $b} keys %date) { - $res{$num}->{'note'} = ude($note{$num}); - $res{$num}->{'date'} = ude($date{$num}); - } - return %res; + my $this = shift; + my($num, $note, $date, %res, $real); + foreach $num (sort {$a <=> $b} keys %date) { + $res{$num}->{'note'} = $this->ude($note{$num}); + $res{$num}->{'date'} = $this->ude($date{$num}); + } + return %res; } sub get_nextnum { - my($this, $num); - foreach (sort {$a <=> $b} keys %date) { - $num = $_; - } - $num++; - return $num; + my($this, $num); + foreach (sort {$a <=> $b} keys %date) { + $num = $_; + } + $num++; + return $num; } sub get_search { - my($this, $searchstring) = @_; - my($num, $note, $date, %res, $match); + my($this, $searchstring) = @_; + my($num, $note, $date, %res, $match); - my $regex = $this->generate_search($searchstring); + my $regex = $this->generate_search($searchstring); + eval $regex; + if ($@) { + print "invalid expression: \"$searchstring\"!\n"; + return; + } + $match = 0; + foreach $num (sort {$a <=> $b} keys %date) { + $_ = $this->ude($note{$num}); eval $regex; - if ($@) { - print "invalid expression: \"$searchstring\"!\n"; - return; + if ($match) { + $res{$num}->{'note'} = $this->ude($note{$num}); + $res{$num}->{'date'} = $this->ude($date{$num}); } $match = 0; - foreach $num (sort {$a <=> $b} keys %date) { - $_ = ude($note{$num}); - eval $regex; - if ($match) { - $res{$num}->{'note'} = ude($note{$num}); - $res{$num}->{'date'} = ude($date{$num}); - } - $match = 0; - } + } - return %res; + return %res; } sub set_recountnums { - my $this = shift; - my(%Note, %Date, $num, $setnum); - $setnum = 1; - foreach $num (sort {$a <=> $b} keys %note) { - $Note{$setnum} = $note{$num}; - $Date{$setnum} = $date{$num}; - $setnum++; - } - %note = %Note; - %date = %Date; + my $this = shift; + my(%Note, %Date, $num, $setnum); + $setnum = 1; + foreach $num (sort {$a <=> $b} keys %note) { + $Note{$setnum} = $note{$num}; + $Date{$setnum} = $date{$num}; + $setnum++; + } + %note = %Note; + %date = %Date; } sub set_edit { - my($this, $num, $note, $date) = @_; - $note{$num} = uen($note); - $date{$num} = uen($date); + my($this, $num, $note, $date) = @_; + $note{$num} = $this->uen($note); + $date{$num} = $this->uen($date); } sub set_new { - my($this, $num, $note, $date) = @_; - $this->set_edit($num, $note, $date); # just the same thing + my($this, $num, $note, $date) = @_; + $this->set_edit($num, $note, $date); # just the same thing } sub set_del { - my($this, $num) = @_; - my($note, $date, $T); - ($note, $date) = $this->get_single($num); - return "ERROR" if ($date !~ /^\d/); - delete $note{$num}; - delete $date{$num}; + my($this, $num) = @_; + my($note, $date, $T); + ($note, $date) = $this->get_single($num); + return "ERROR" if ($date !~ /^\d/); + delete $note{$num}; + delete $date{$num}; } sub set_del_all { - my($this) = @_; - %note = (); - %date = (); - return; + my($this) = @_; + %note = (); + %date = (); + return; } sub uen { - my($T); - if($NOTEDB::crypt_supported == 1) { - eval { - $T = pack("u", $cipher->encrypt($_[0])); - }; - } - else { - $T = $_[0]; - } - chomp $T; - return $T; + my $this = shift; + my($T); + if($NOTEDB::crypt_supported == 1) { + eval { + $T = pack("u", $this->{cipher}->encrypt($_[0])); + }; + } + else { + $T = $_[0]; + } + chomp $T; + return $T; } sub ude { - my($T); - if($NOTEDB::crypt_supported == 1) { - eval { - $T = $cipher->decrypt(unpack("u",$_[0])) - }; - return $T; - } - else { - return $_[0]; - } + my $this = shift; + my($T); + if($NOTEDB::crypt_supported == 1) { + eval { + $T = $this->{cipher}->decrypt(unpack("u",$_[0])) + }; + return $T; + } + else { + return $_[0]; + } } diff --git a/NOTEDB/mysql.pm b/NOTEDB/mysql.pm index e9c7288..a445a54 100644 --- a/NOTEDB/mysql.pm +++ b/NOTEDB/mysql.pm @@ -1,174 +1,192 @@ #!/usr/bin/perl -# $Id: mysql.pm,v 1.1.1.1 2000/07/01 14:40:52 zarahg Exp $ +# $Id: mysql.pm,v 1.3 2000/08/11 00:05:58 zarahg Exp $ # Perl module for note -# mysql database backend. see docu: perldoc NOTEDB::binary +# mysql database backend. see docu: perldoc NOTEDB::mysql # + +package NOTEDB; + + use DBI; use strict; use Data::Dumper; use NOTEDB; -package NOTEDB; -# Globals: -my ($DB, $table, $fnum, $fnote, $fdate, $version, $cipher); -$table = "note"; -$fnum = "number"; -$fnote = "note"; -$fdate = "date"; -$version = "(NOTEDB::mysql, 1.4)"; - -# prepare some std statements... ##################################################################### -my $sql_getsingle = "SELECT $fnote,$fdate FROM $table WHERE $fnum = ?"; -my $sql_all = "SELECT $fnum,$fnote,$fdate FROM $table"; -my $sql_nextnum = "SELECT max($fnum) FROM $table"; -my $sql_incrnum = "SELECT $fnum FROM $table ORDER BY $fnum"; - -my $sql_setnum = "UPDATE $table SET $fnum = ? WHERE $fnum = ?"; -my $sql_edit = "UPDATE $table SET $fnote = ?, $fdate = ? WHERE $fnum = ?"; - -my $sql_insertnew = "INSERT INTO $table VALUES (?, ?, ?)"; - -my $sql_del = "DELETE FROM $table WHERE $fnum = ?"; -my $sql_del_all = "DELETE FROM $table"; -###################################################################################################### sub new { - # no prototype, because of the bin-version, which takes only a filename! - my($this, $dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd) = @_; + # no prototype, because of the bin-version, which takes only a filename! - my $class = ref($this) || $this; - my $self = {}; - bless($self,$class); - my $database = "DBI:$dbdriver:$dbname;host=$dbhost"; + my($this, $dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, + $table, $fnum, $fnote, $fdate, $dbport) = @_; - $DB = DBI->connect($database, $dbuser, $dbpasswd) || die DBI->errstr(); - return $self; + my $class = ref($this) || $this; + my $self = {}; + bless($self,$class); + + my $database; + if ($dbport) { + $database = "DBI:$dbdriver:$dbname;host=$dbhost:$dbport"; + } + else { + $database = "DBI:$dbdriver:$dbname;host=$dbhost"; + } + + $self->{version} = "(NOTEDB::mysql, 1.5)"; + $self->{table} = $table; + + $self->{sql_getsingle} = "SELECT $fnote,$fdate FROM $self->{table} WHERE $fnum = ?"; + $self->{sql_all} = "SELECT $fnum,$fnote,$fdate FROM $self->{table}"; + $self->{sql_nextnum} = "SELECT max($fnum) FROM $self->{table}"; + $self->{sql_incrnum} = "SELECT $fnum FROM $self->{table} ORDER BY $fnum"; + $self->{sql_setnum} = "UPDATE $self->{table} SET $fnum = ? WHERE $fnum = ?"; + $self->{sql_edit} = "UPDATE $self->{table} SET $fnote = ?,$fdate = ? WHERE $fnum = ?"; + $self->{sql_insertnew} = "INSERT INTO $self->{table} VALUES (?, ?, ?)"; + $self->{sql_del} = "DELETE FROM $self->{table} WHERE $fnum = ?"; + $self->{sql_del_all} = "DELETE FROM $self->{table}"; + + $self->{DB} = DBI->connect($database, $dbuser, $dbpasswd) or die DBI->errstr(); + + return $self; } sub DESTROY { - # clean the desk! + # clean the desk! + my $this = shift; + $this->{DB}->disconnect; } sub lock { - my($this) = @_; - # LOCK the database! - my $lock = $DB->prepare("LOCK TABLES $table WRITE") || die $DB->errstr(); - $lock->execute() || die $DB->errstr(); + my($this) = @_; + # LOCK the database! + my $lock = $this->{DB}->prepare("LOCK TABLES $this->{table} WRITE") + || die $this->{DB}->errstr(); + $lock->execute() || die $this->{DB}->errstr(); } sub unlock { - my($this) = @_; - my $unlock = $DB->prepare("UNLOCK TABLES") || die $DB->errstr; - $unlock->execute() || die $DB->errstr(); - $DB->disconnect || die $DB->errstr; + my($this) = @_; + my $unlock = $this->{DB}->prepare("UNLOCK TABLES") || die $this->{DB}->errstr; + $unlock->execute() || die $this->{DB}->errstr(); } sub version { - return $version; + my $this = shift; + return $this->{version}; } sub get_single { - my($this, $num) = @_; + my($this, $num) = @_; - my($note, $date); - my $statement = $DB->prepare($sql_getsingle) || die $DB->errstr(); + my($note, $date); + my $statement = $this->{DB}->prepare($this->{sql_getsingle}) || die $this->{DB}->errstr(); - $statement->execute($num) || die $DB->errstr(); - $statement->bind_columns(undef, \($note, $date)) || die $DB->errstr(); + $statement->execute($num) || die $this->{DB}->errstr(); + $statement->bind_columns(undef, \($note, $date)) || die $this->{DB}->errstr(); - while($statement->fetch) { - return ude($note), ude($date); - } + while($statement->fetch) { + return $this->ude($note), $this->ude($date); + } } sub get_all { - my $this = shift; - my($num, $note, $date, %res); + my $this = shift; + my($num, $note, $date, %res); - if ($this->unchanged) { - return %{$this->{cache}}; - } + if ($this->unchanged) { + return %{$this->{cache}}; + } - my $statement = $DB->prepare($sql_all) || die $DB->errstr(); + my $statement = $this->{DB}->prepare($this->{sql_all}) or die $this->{DB}->errstr(); - $statement->execute || die $DB->errstr(); - $statement->bind_columns(undef, \($num, $note, $date)) || die $DB->errstr(); + $statement->execute or die $this->{DB}->errstr(); + $statement->bind_columns(undef, \($num, $note, $date)) or die $this->{DB}->errstr(); - while($statement->fetch) { - $res{$num}->{'note'} = ude($note); - $res{$num}->{'date'} = ude($date); - } + while($statement->fetch) { + $res{$num}->{'note'} = $this->ude($note); + $res{$num}->{'date'} = $this->ude($date); + } - $this->cache(%res); - return %res; + $this->cache(%res); + return %res; } sub get_nextnum { - my($this, $num); - if ($this->unchanged) { - $num = 1; - foreach (keys %{$this->{cache}}) { - $num++; - } - return $num; + my $this = shift; + my($num); + if ($this->unchanged) { + $num = 1; + foreach (keys %{$this->{cache}}) { + $num++; } + return $num; + } - my $statement = $DB->prepare($sql_nextnum) || die $DB->errstr(); + my $statement = $this->{DB}->prepare($this->{sql_nextnum}) || die $this->{DB}->errstr(); - $statement->execute || die $DB->errstr(); - $statement->bind_columns(undef, \($num)) || die $DB->errstr(); + $statement->execute || die $this->{DB}->errstr(); + $statement->bind_columns(undef, \($num)) || die $this->{DB}->errstr(); - while($statement->fetch) { - return $num+1; - } + while($statement->fetch) { + return $num+1; + } } sub get_search { - my($this, $searchstring) = @_; - my($num, $note, $date, %res, $match); + my($this, $searchstring) = @_; + my($num, $note, $date, %res, $match, $use_cache); - my $regex = $this->generate_search($searchstring); + my $regex = $this->generate_search($searchstring); + eval $regex; + if ($@) { + print "invalid expression: \"$searchstring\"!\n"; + return; + } + $match = 0; + + if ($this->unchanged) { + foreach my $num (keys %{$this->{cache}}) { + $_ = $this->{cache}{$num}->{note}; + eval $regex; + if ($match) { + $res{$num}->{note} = $this->{cache}{$num}->{note}; + $res{$num}->{date} = $this->{cache}{$num}->{date} + } + $match = 0; + } + return %res; + } + + my $statement = $this->{DB}->prepare($this->{sql_all}) or die $this->{DB}->errstr(); + + $statement->execute or die $this->{DB}->errstr(); + $statement->bind_columns(undef, \($num, $note, $date)) or die $this->{DB}->errstr(); + + while($statement->fetch) { + $note = $this->ude($note); + $date = $this->ude($date); + $_ = $note; eval $regex; - if ($@) { - print "invalid expression: \"$searchstring\"!\n"; - return; - } - $match = 0; - - my %data; - if ($this->unchanged) { - %data = %{$this->{cache}}; - } - else { - %data = $this->get_all(); - } - foreach $num (sort { $a <=> $b } keys %data) { - $note = ude($data{$num}->{'note'}); - $date = ude($data{$num}->{'date'}); - $_ = $note; - eval $regex; - if($match) { + if($match) { $res{$num}->{'note'} = $note; $res{$num}->{'date'} = $date; - } - $match = 0; } - - return %res; + $match = 0; + } + return %res; } @@ -176,116 +194,119 @@ sub get_search sub set_edit { - my($this, $num, $note, $date) = @_; + my($this, $num, $note, $date) = @_; - $this->lock; - my $statement = $DB->prepare($sql_edit) || die $DB->errstr(); - $note =~ s/'/\'/g; - $note =~ s/\\/\\\\/g; - $statement->execute(uen($note), uen($date), $num) || die $DB->errstr(); - $this->unlock; - $this->changed; + $this->lock; + my $statement = $this->{DB}->prepare($this->{sql_edit}) or die $this->{DB}->errstr(); + $note =~ s/'/\'/g; + $note =~ s/\\/\\\\/g; + $statement->execute($this->uen($note), $this->uen($date), $num) + or die $this->{DB}->errstr(); + $this->unlock; + $this->changed; } sub set_new { - my($this, $num, $note, $date) = @_; - $this->lock; - my $statement = $DB->prepare($sql_insertnew) || die $DB->errstr(); + my($this, $num, $note, $date) = @_; + $this->lock; + my $statement = $this->{DB}->prepare($this->{sql_insertnew}) || die $this->{DB}->errstr(); - $note =~ s/'/\'/g; - $note =~ s/\\/\\\\/g; - $statement->execute($num, uen($note), uen($date)) || die $DB->errstr(); - $this->unlock; - $this->changed; + $note =~ s/'/\'/g; + $note =~ s/\\/\\\\/g; + $statement->execute($num, $this->uen($note), $this->uen($date)) || die $this->{DB}->errstr(); + $this->unlock; + $this->changed; } sub set_del { - my($this, $num) = @_; - my($note, $date, $T); + my($this, $num) = @_; + my($note, $date, $T); - $this->lock; - ($note, $date) = $this->get_single($num); + $this->lock; + ($note, $date) = $this->get_single($num); - return "ERROR" if ($date !~ /^\d/); + return "ERROR" if ($date !~ /^\d/); - # delete record! - my $statement = $DB->prepare($sql_del) || die $DB->errstr(); - $statement->execute($num) || die $DB->errstr(); - $this->unlock; - $this->changed; - return; + # delete record! + my $statement = $this->{DB}->prepare($this->{sql_del}) || die $this->{DB}->errstr(); + $statement->execute($num) || die $this->{DB}->errstr(); + $this->unlock; + $this->changed; + return; } sub set_del_all { - my($this) = @_; - $this->lock; - my $statement = $DB->prepare($sql_del_all) || die $DB->errstr(); - $statement->execute() || die $DB->errstr(); - $this->unlock; - $this->changed; - return; + my($this) = @_; + $this->lock; + my $statement = $this->{DB}->prepare($this->{sql_del_all}) || die $this->{DB}->errstr(); + $statement->execute() || die $this->{DB}->errstr(); + $this->unlock; + $this->changed; + return; } sub set_recountnums { - my $this = shift; + my $this = shift; - $this->lock; + $this->lock; - my(@count, $i, $num, $setnum, $pos); - $setnum = 1; - $pos=0; $i=0; @count = (); + my(@count, $i, $num, $setnum, $pos); + $setnum = 1; + $pos=0; $i=0; @count = (); - my $statement = $DB->prepare($sql_incrnum) || die $DB->errstr(); - $statement->execute || die $DB->errstr(); - $statement->bind_columns(undef, \($num)) || die $DB->errstr(); - # store real id's in an array! - while($statement->fetch) { - $count[$i] = $num; - $i++; - } - # now recount them! - my $sub_statement = $DB->prepare($sql_setnum) || die $DB->errstr(); - for($pos=0;$pos<$i;$pos++) { - $setnum = $pos +1; - $sub_statement->execute($setnum,$count[$pos]) || die $DB->errstr(); - } - $this->unlock; - $this->changed; + my $statement = $this->{DB}->prepare($this->{sql_incrnum}) || die $this->{DB}->errstr(); + $statement->execute || die $this->{DB}->errstr(); + $statement->bind_columns(undef, \($num)) || die $this->{DB}->errstr(); + # store real id's in an array! + while($statement->fetch) { + $count[$i] = $num; + $i++; + } + # now recount them! + my $sub_statement = $this->{DB}->prepare($this->{sql_setnum}) || die $this->{DB}->errstr(); + for($pos=0;$pos<$i;$pos++) { + $setnum = $pos +1; + $sub_statement->execute($setnum,$count[$pos]) || die $this->{DB}->errstr(); + } + $this->unlock; + $this->changed; } sub uen { - my($T); - if($NOTEDB::crypt_supported == 1) { - eval { - $T = pack("u", $cipher->encrypt($_[0])); - }; - } - else { - $T = $_[0]; - } - chomp $T; - return $T; + my $this = shift; + my($T); + if($NOTEDB::crypt_supported == 1) { + eval { + $T = pack("u", $this->{cipher}->encrypt($_[0])); + }; + } + else { + $T = $_[0]; + } + chomp $T; + return $T; } sub ude { - my($T); - if($NOTEDB::crypt_supported == 1) { - eval { - $T = $cipher->decrypt(unpack("u",$_[0])) - }; - return $T; - } - else { - return $_[0]; - } + my $this = shift; + my($T); + if($NOTEDB::crypt_supported == 1) { + eval { + $T = $this->{cipher}->decrypt(unpack("u",$_[0])) + }; + return $T; + } + else { + return $_[0]; + } } 1; # keep this! diff --git a/README b/README index d512583..029ec6c 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -note 1.0.9 by Thomas Linden, 08/08/2000 +note 1.1.0 by Thomas Linden, 12/08/2000 ======================================= Introduction @@ -199,10 +199,12 @@ Usage or: - $ note -s "(mike OR arnold) AND (jackson OR schwarzenegger)" + $ note -s "(mike OR ar??ld) AND (jackson OR schwarzen*)" If note finds a note, which first line is a topic, then it will display it's second line. + If you want to search for ? or * then you have to surround the + searchstring with apostrophs (""). These rules apply for the interactive search too. Instead of using note from the commandline you can use the @@ -218,7 +220,7 @@ Usage for further use). The dumps from the two versions of note are in the same format. Using dumps it is also possible to reinitialize your database. You - can use the "-o" switch whcih causes note to overwrite your existing + can use the "-o" switch which causes note to overwrite your existing database. This is very handy if you changed heavily your config. And it is required, if you changed: encryption, db-driver, (binary-format) and the password. You can use the following command for reinitializing: @@ -595,4 +597,4 @@ Contributors / Credits Last changed ============ - 08/08/2000 + 12/08/2000 diff --git a/Tools.pm b/Tools.pm new file mode 100644 index 0000000..d84681a --- /dev/null +++ b/Tools.pm @@ -0,0 +1,330 @@ +#!/usr/bin/perl -w +# +# generic tool functions +# +# Copyright (c) 2000 ConSol* GmbH, Munich. +# All Rights Reserved. Unauthorized use forbidden. +# +# $Id: Tools.pm,v 1.11 2000/08/04 17:41:40 tom Exp $ +package Consol::Util::Tools; + +use Exporter (); +use strict; +use Carp qw(cluck); +use FileHandle (); +use Date::Manip; +use Data::Dumper; +use vars qw(@ISA @EXPORT @EXPORT_OK @EXPORT_TAGS $DEBUG); + +@ISA=qw(Exporter); +# auto export subs +@EXPORT=qw(getyesterdate debug generate_regex crypt_data); +@EXPORT_OK=qw(); +@EXPORT_TAGS=(); + + +=head1 NAME + +Tools - general utilitiy package, no OOP. + +=head1 SYNOPSIS + +use Tools qw (getyesterdate debug); + + +=head1 SUB getyesterdate + + my $onedayago = getyesterdate(); + +returns the date one day ago in the following format: YYYYMMDD + +=cut + +sub getyesterdate +{ + my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); + my($lastmonth, $lastyear); + $year += 1900; + $mon += 1; + + if ($mon == 1) { + $lastmonth = 12; + $lastyear = $year - 1; + } + else { + $lastmonth = $mon - 1; + $lastyear = $year; + } + my @DAYS_IN_MONTH = qw(0 31 28 31 30 31 30 31 31 30 31 30 31); + my ($day,@days); + if ((($year % 4) == 0) && ((($year % 100) != 0) || (($year % 400) == 0))) { + $DAYS_IN_MONTH[2]++; + } + + if ($mday == 1) { + $mday = $DAYS_IN_MONTH[$lastmonth]; + $year = $lastyear; + $mon = $lastmonth; + } + else { + $mday--; + } + $mon =~ s/^(\d)$/0$1/; + $hour =~ s/^(\d)$/0$1/; + $min =~ s/^(\d)$/0$1/; + $sec =~ s/^(\d)$/0$1/; + $mday =~ s/^(\d)$/0$1/; + return "$year$mon$mday"; +} + + +=head1 SUB debug + + BEGIN { $DEBUG = 1; } + debug("some odd errors occured"); + +prints the given message to STDERR if $DEBUG is true (1). +It adds the packagename and the linenumber of the caller to the output. + +=cut + +sub debug { + my(@msg) = @_; + return if(!$DEBUG); + my($package, $filename, $line) = caller; + print "$package $line: @msg\n"; +} + + + + + +=head1 SUB generate_regex + +This subroutine generates valid perlcode based on userinput +for further validation using B. You can catch exceptions +using the B<$@> variable. A user supplied expression an contain +AND, OR, brackets (), wildcards (* for any characters, ? for one character), +or even valid perl regex(in this special case, it will not transformed +in any way). See below for example usage! + + $code = generate_regex( + -string => "(max AND moritz) OR (tina AND ute)", + -case => 1, + -if => 1, + ); + +If you set B<-if> to B<1> the following output will be created: + + $match = 1 if( (/max/i and /moritz/i ) or (/tina/i and /ute/i ) ); + +otherwise you will only get a code fragment: + + (/max/i and /moritz/i ) or (/tina/i and /ute/i ) + +If you set B<-case> to B<1>, the code will search case sensitive. + +If B<-string> is empty, "/^/" will be returned. + +Sample usage: + + #!/usr/bin/perl + use Tools qw(generate_regex); + my $match = undef; + my $input = <>; + chomp $input; + my $regex = generate_regex(-string => $input, -if => 1); + eval $regex; + if ($@) { + die "invalid expression: $@\n"; + } + open FILE, ") { + eval $regex; + if ($match) { + print "$. matched the expression \"$input\"\n"; + } + } + close FILE; + +Allowed expressions: + + "Hans Wurst" # exact match + max AND moritz # AND + max OR moritz # OR + (max AND moritz) OR tina # combined with () + ((max AND moritz) AND tina) OR (hans AND mike) # more complicated with () + (*aol.com OR *gmx.de) AND (*free* OR *money*) # slightly more complicated with wildcards + /^[a-zA-Z]+?.*\d{4}$/ # yes, a user can also supply a regex! + +=cut + + +sub generate_regex { + # + # interface sub for generate_search() + # + my %params = @_; + my($result); + $result = &generate_search($params{-string}, $params{-case}); + if ($params{-if}) { + $result = qq(\$match = 1 if($result);); + } + return $result; +} + + + +sub generate_search { + # + # get user input and create perlcode ready for eval + # sample input: + # "ann.a OR eg???on AND u*do$" + # resulting output: + # "$match = $_ if(/ann\.a/i or /eg...on/i and /u.*do\$/i ); + # + my($string,$case) = @_; + + if ($string =~ /^\/.+?\/$/) { + return $string; + } + elsif (!$string) { + return "/^/"; + } + + # per default case sensitive + $case = ($case ? "" : "i"); + + # we will get a / in front of the first word too! + $string = " " . $string . " "; + + # check for apostrophs + $string =~ s/(?<=\s)(\(??)("[^"]+"|\S+)(\)??)(?=\s)/$1 . &check_exact($2) . $3/ge; + + # remove odd spaces infront of and after »and« and »or« + $string =~ s/\s\s*(AND|OR)\s\s*/ $1 /g; + + # remove odd spaces infront of »(« and after »)« + $string =~ s/(\s*\()/\(/g; + $string =~ s/(\)\s*)/\)/g; + + # remove first and last space so it will not masked! + $string =~ s/^\s//; + $string =~ s/\s$//; + + # mask spaces if not infront of or after »and« and »or« + $string =~ s/(? '.*', + '?' => '.', + '[' => '[', + ']' => ']', + '+' => '\+', + '.' => '\.', + '$' => '\$', + '@' => '\@', + ); + + # mask backslash + $str =~ s/\\/\\\\/g; + + if ($str =~ /^"/ && $str =~ /"$/) { + # mask bracket-constructs + $str =~ s/(\(|\))/\\$1/g; + } + $str =~ s/(.)/$globs{$1} || "$1"/ge; + + $str =~ s/^"//; + $str =~ s/"$//; + + # mask spaces + $str =~ s/\s/\\s/g; + return $str; +} + + + + + + + + +sub crypt_data { + # + # enrypt a passwd + # + my($cleartext) = @_; + debug("\"$cleartext\""); + return if(!$cleartext); + + # create a random salt + my @range=('0'..'9','a'..'z','A'..'Z'); + + my $salt=$range[rand(int($#range)+1)] . $range[rand(int($#range)+1)]; + + return crypt($cleartext, "$salt"); +} + + + +=head1 AUTHOR + +Thomas Linden + +=cut + +1; + +# Local Variables: *** +# perl-master-file: ../../webmin/index.pl *** +# End: *** diff --git a/VERSION b/VERSION index b0f3d96..9084fa2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.8 +1.1.0 diff --git a/bin/CVS/Entries b/bin/CVS/Entries index bee8630..7c503d5 100644 --- a/bin/CVS/Entries +++ b/bin/CVS/Entries @@ -1,2 +1,2 @@ -/note/1.3/Fri Jul 21 06:41:25 2000// +/note/1.5/Fri Aug 11 00:05:58 2000// D diff --git a/bin/note b/bin/note index 9aa51ee..b66f045 100755 --- a/bin/note +++ b/bin/note @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $Id: note,v 1.3 2000/07/21 06:41:25 zarahg Exp $ +# $Id: note,v 1.5 2000/08/11 00:05:58 zarahg Exp $ # # # note - console notes management with database and encryption support. @@ -79,7 +79,7 @@ my ( # # db specifics from .noterc # - $db, $dbname, $dbhost, $dbuser, $dbpasswd, $encrypt_passwd, $clearstring, + $db, $dbname, $dbhost, $dbport, $dbuser, $dbpasswd, $encrypt_passwd, $clearstring, $table, $fnum, $fnote, $fdate, $date, $dbdriver, $libpath, # @@ -127,14 +127,17 @@ $TIME_COLOR = "black"; $TOPIC_COLOR = "BLACK"; $TOPIC = 1; $TopicSep = '/'; -$version = "1.0.9"; +$version = "1.1.0"; if ($TOPIC) { $CurDepth = 1; # the current depth inside the topic "directory" structure... } $USE_CRYPT = "NO"; $TempDir = "/tmp"; - - +# mysql stuff +$table = "note"; +$fnote = "note"; +$fdate = "date"; +$fnum = "number"; # # process command line args @@ -302,6 +305,12 @@ elsif ($opt_c) { exit(1); } +# directly jump to encrypt, 'cause this sub does +# not require a database connection +if ($mode eq "encrypt_passwd") { + &encrypt_passwd; + exit; +} # Always interactive? if ($ALWAYS_INT eq "YES" && $mode ne "dump" && $mode ne "import") { @@ -331,8 +340,8 @@ elsif ($dbdriver eq "mysql") { # do the new() later because of the encrypted password! eval { require "NOTEDB/mysql.pm"; - #$db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); }; + die $@ if($@); } else { eval { @@ -395,7 +404,8 @@ if ($USE_CRYPT eq "YES" && $NOTEDB::crypt_supported == 1) { my $cipher = new Crypt::CBC($key, $CRYPT_METHOD); # decrypt the dbpasswd, if it's encrypted! my $dbpasswd = $cipher->decrypt(unpack("u",$dbpasswd)) if($encrypt_passwd); - $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); + $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, + $dbpasswd, $table, $fnum, $fnote, $fdate, $dbport); }; die "Could not connect do db: $@!\n" if($@); } @@ -408,18 +418,22 @@ if ($USE_CRYPT eq "YES" && $NOTEDB::crypt_supported == 1) { print "access denied.\n"; # decrypted $date is not a number! exit(1); } - } #else empty! + } #else empty database! } else { - $db->no_crypt; - # does: NOTEDB::crypt_supported = 0; - my ($cnote, $cdate) = $db->get_single(1); - if ($cdate ne "") { - if ($cdate !~ /^\d+\.\d+?/) { - print "$NOTEDB seems to be encrypted!\n"; - exit(1); + if ($dbdriver eq "mysql") { + $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, + $dbpasswd, $table, $fnum, $fnote, $fdate, $dbport); + } + $db->no_crypt; + # does: NOTEDB::crypt_supported = 0; + my ($cnote, $cdate) = $db->get_single(1); + if ($cdate ne "") { + if ($cdate !~ /^\d+\.\d+?/) { + print "$NOTEDB seems to be encrypted!\n"; + exit(1); + } } - } } @@ -464,9 +478,6 @@ elsif ($mode eq "import") { elsif ($mode eq "interactive") { &interactive; } -elsif ($mode eq "encrypt_passwd") { - &encrypt_passwd; -} else { #undefined :-( } @@ -1454,6 +1465,7 @@ sub getconfig $libpath = $value if (/^LibPath/); $dbdriver = $value if (/^DbDriver/); $dbhost = $value if (/^DbHost/); + $dbport = $value if (/^DbPort/); $dbuser = $value if (/^DbUser/); $dbpasswd = $value if (/^DbPasswd/); $encrypt_passwd = $value if (/^encrypt_passwd/); @@ -1508,6 +1520,12 @@ sub getconfig __END__ # # $Log: note,v $ +# Revision 1.5 2000/08/11 00:05:58 zarahg +# 1.1.0 beta2 ready for testing +# +# Revision 1.4 2000/08/10 09:21:56 zarahg +# ready for 1.1.0 shipping, lots of changes/additions, see Changelog +# # Revision 1.3 2000/07/21 06:41:25 zarahg # 638: precedence bug fixed # diff --git a/config/CVS/Entries b/config/CVS/Entries index 1155b76..2f7c03f 100644 --- a/config/CVS/Entries +++ b/config/CVS/Entries @@ -1,2 +1,2 @@ -/noterc/1.3/Sun Jul 9 22:37:15 2000// +/noterc/1.5/Fri Aug 11 00:04:03 2000// D diff --git a/config/noterc b/config/noterc index dcf1adb..6c77987 100644 --- a/config/noterc +++ b/config/noterc @@ -1,4 +1,4 @@ -# 1.0.8 -*- sh -*- +# 1.1.0 -*- sh -*- # This is a sample config for the note script # There are useful defaults set in note itself. # @@ -35,6 +35,7 @@ DbDriver binary # backend specific settings for sql backend #DbHost localhost +#DbPort #DbUser you #DbPasswd #DbName mynotes @@ -164,6 +165,9 @@ ShortCd 0 # this is currently only supported by the binary and the mysql backends # set it to 1 to turn it on, the default is 0 (off) Cache 0 + + + # That's all about it for now. # If you still have any questiosn, please feel free to contact # me by email: Thomas Linden diff --git a/note b/note deleted file mode 100755 index 5107e58..0000000 --- a/note +++ /dev/null @@ -1,1642 +0,0 @@ -#!/usr/bin/perl -# $Id: note,v 1.1.1.1 2000/07/01 14:40:50 zarahg Exp $ -# -# -# note - console notes management with database and encryption support. -# Copyright (C) 1999-2000 Thomas Linden (see README for details!) -# -# This program 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 2 -# of the License, or (at your option) any later version. -# -# This program 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 this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# - Thomas Linden -# -# latest version on: -# http://www.daemon.de/software.html -# ftp://www.0x49.org/pub/scip/note/ -# - -use strict; -#use Data::Dumper; -use Getopt::Long; - -# -# prototypes -# -sub usage; # print usage message for us thumb userz :-) -sub find_editor; # returns an external editor for use -sub output; # used by &list and &display -sub C; # print colourized -sub num_bereich; # returns array from "1-4" (1,2,3,4) -sub getdate; # return pretty formatted day -sub new; # crate new note -sub edit; # edit a note -sub del; # delete a note -sub display; # display one or more notes -sub list; # note-listing -sub help; # interactive help screen -sub import; # import from notedb-dump -sub display_tree; # show nice tree-view -sub tree; # build the tree -sub print_tree; # print the tree, contributed by Jens Heunemann . THX! - - -# -# globals -# -my ( - # - # commandline options - # - $opt_, $opt_i, $opt_r, $opt_e, $opt_d, - $opt_s, $opt_t, $opt_T, $opt_l, $opt_L, - $opt_D, $opt_I, $opt_o, $opt_h, $opt_n, $opt_v, - - # - # set from commandline (or interactive) - # - $number, $searchstring, $dump_file, $ImportType, $NewType, $Raw, - - # - # options from config file .noterc - # - $maxlen, $timelen, $TOPIC, $NOTEDB, $MAX_TIME, $PreferredEditor, - $ALWAYS_INT, $KEEP_TIMESTAMP, $COLOR, $ALWAYS_EDIT, $HOME, $FormatText, - $BORDER_COLOR, $NOTE_COLOR, $NUM_COLOR, $TOPIC_COLOR, $MAX_NOTE, - $USE_CRYPT, $CRYPT_METHOD, $TopicSep, $DEFAULT_LIST, $TIME_COLOR, - - # - # db specifics from .noterc - # - $db, $dbname, $dbhost, $dbuser, $dbpasswd, - $table, $fnum, $fnote, $fdate, $date, $dbdriver, $libpath, - - # - # processed colors - # - $BORDERC, $_BORDERC, $NOTEC, $NUMC, $_NUMC, $_NOTEC, $TIMEC, - $_TIMEC, $TOPICC, $_TOPICC, - - # - # config presets - # - $DEFAULTDBNAME, $USER, $PATH, $CONF, - - # - # internals - # - $TYPE, $mode, $NoteKey, - $version, $number, $CurTopic, $CurDepth, $WantTopic, - $sizeof, %TP, $TreeType, $ListType, $SetTitle, - @ArgTopics, $key, $typedef, @NumBlock, $has_nothing, - ); - - -# -# DEFAULTS, allows one to use note without a config -# don't change them, instead use the config file! -# -$maxlen = 30; -$timelen = 22; -$date = &getdate; -$USER = getlogin || getpwuid($<); -chomp $USER; -$HOME = $ENV{'HOME'}; -$CONF = $HOME . "/.noterc"; -$dbdriver = "binary"; -$libpath = "/usr/local/lib"; -$NOTEDB = $HOME . "/.notedb"; -$MAX_NOTE = 4096; -$MAX_TIME = 64; -$COLOR = "YES"; -$BORDER_COLOR = "BLACK"; -$NUM_COLOR = "blue"; -$NOTE_COLOR = "green"; -$TIME_COLOR = "black"; -$TOPIC_COLOR = "BLACK"; -$TOPIC = 1; -$TopicSep = '/'; -$version = "1.0.6"; -if($TOPIC) -{ - $CurDepth = 1; # the current depth inside the topic "directory" structure... -} -$USE_CRYPT = "NO"; - - - - -# -# process command line args -# -if($ARGV[0] eq "") -{ - $mode = "new"; -} -elsif($#ARGV == 0 && $ARGV[0] eq "-") { - $mode = "new"; - $NewType = 1; # read from STDIN until EOF - shift; - undef $has_nothing; -} -else -{ - Getopt::Long::Configure( qw(no_ignore_case)); - GetOptions ( - "interactive|i!" => \$opt_i, # no arg - "raw|r!" => \$opt_r, # no arg - "edit|e=i" => \$opt_e, # integer, required - "delete|d=s" => \$opt_d, # integer, required - "search|s=s" => \$opt_s, # string, required - "tree|topic|t!" => \$opt_t, # no arg - "long_tree|T!" => \$opt_T, # no arg - "list|l:s" => \$opt_l, # string, optional - "long_list|L:s" => \$opt_L, # string, optional - "dump|D:s" => \$opt_D, # string, optional - "import|I:s" => \$opt_I, # string, optional - "overwrite|o!" => \$opt_o, # no arg - "help|h|?!" => \$opt_h, # no arg - "version|v!" => \$opt_v # no arg - ); - $opt_n = shift; # after that @ARGV contains eventually - # a note-number - # $opt_ is a single dash, in case of existence! - # - # determine mode - # - if($opt_i) { - $mode = "interactive"; - } - elsif(defined $opt_l || defined $opt_L) { - $mode = "list"; - if(defined $opt_l) { - @ArgTopics = split /$TopicSep/, $opt_l; - } - else { - $ListType = "LONG"; - @ArgTopics = split /$TopicSep/, $opt_L; - } - $CurDepth += $#ArgTopics + 1 if($opt_l || $opt_L); - $CurTopic = $ArgTopics[$#ArgTopics]; # use the last element everytime... - } - elsif($opt_t || $opt_T) { - $mode = "tree"; - $TreeType = "LONG" if($opt_T); - } - elsif(defined $opt_s) { - $mode = "search"; - $searchstring = $opt_s; - } - elsif($opt_e) { - $mode = "edit"; - $number = $opt_e; - } - elsif($opt_d) { - $mode = "delete"; - $number = $opt_d; - } - elsif(defined $opt_D) { - $mode = "dump"; - if(!$opt_) { - if($opt_D ne "") { - $dump_file = $opt_D; - } - else { - $dump_file = "note.dump.$$"; - print "no dumpfile specified, using $dump_file.\n"; - } - } - else { - $dump_file = "-"; # use STDIN - } - } - elsif(defined $opt_I) { - $mode = "import"; - if(!$opt_) { - if($opt_I ne "") { - $dump_file = $opt_I; - } - else { - print "Import-error! No dump_file specified!\n"; - exit(1); - } - } - else { - $dump_file = "-"; - } - } - elsif($opt_v) { - print "This is note $version by Thomas Linden .\n"; - exit(0); - } - elsif($opt_h) { - &usage; - } - else { - $has_nothing = 1; - } - ### determine generic options - if($opt_n =~ /^[\d+\-?\,*]+$/) { - # first arg is a digit! - if($mode eq "") { - $number = $opt_n; - $mode = "display"; - undef $has_nothing; - } - else { - print "mode <$mode> does not take a numerical argument!\n"; - exit(1); - } - } - elsif($opt_n ne "") { - print "Unknown option: $opt_n\n"; - &usage; - } - if($opt_r) { - $Raw = 1; - } - if($opt_o) { - $ImportType = "overwrite"; - if(!$opt_I) { - print "--overwrite is only suitable for use with --import!\n"; - exit(1); - } - } - ##### -} -if($has_nothing && $mode eq "") -{ - &usage; -} - - -# read the configfile. -if(-e $CONF) -{ - &getconfig($CONF); -} - - -# Always interactive? -if($ALWAYS_INT eq "YES" && $mode ne "dump" && $mode ne "import") -{ - $mode = "interactive"; -} - -# OK ... Long-Listing shall be default ... You wanted it!!! -if($DEFAULT_LIST eq "LONG") -{ - # takes only precedence in commandline mode - $ListType="LONG"; -} - - - -# *if* loading of the config was successful, try to load the -# configured database backend. Currently supported: mysql and binary. -push @INC, $libpath; -#if($dbdriver eq "mysql") { -# eval { -# require NOTEDB::mysql; -# $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); -# } -#} -if($dbdriver eq "binary") { - eval { - require NOTEDB::binary; - $db = new NOTEDB($dbdriver, $NOTEDB, $MAX_NOTE, $MAX_TIME, $dbdriver); - } -} -else { - eval { - require "NOTEDB/$dbdriver.pm"; - $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); - }; -} -if($@) { - print "Unsupported database backend: NOTEDB::$dbdriver!\n"; - print "The following error has occured:\n------------------------\n" . $@ . "\n------------------------\n"; - exit 1; -} - -# add the backend version to the note version: -$version .= " " . $db->version(); - -# calculate some constants... -$BORDERC = "<$BORDER_COLOR>"; -$_BORDERC = ""; -$NUMC = "<$NUM_COLOR>"; -$_NUMC = ""; -$NOTEC = "<$NOTE_COLOR>"; -$_NOTEC = ""; -$TIMEC = "<$TIME_COLOR>"; -$_TIMEC = ""; -$TOPICC = "<$TOPIC_COLOR>"; -$_TOPICC = ""; - -$NoteKey = $TopicSep . "notes" . $TopicSep; - - -if($ListType ne "LONG" && $mode ne "interactive") -{ - #$maxlen += $timelen; # no time will be displayed! -} - - -# check if the user wants to use encryption: -if($USE_CRYPT eq "YES" && $NOTEDB::crypt_supported == 1) { - if($CRYPT_METHOD eq "") { - $CRYPT_METHOD = "Crypt::IDEA"; - } - if(!exists $ENV{'NOTE_PASSWD'}) { - print "password: "; - eval { - local($|) = 1; - local(*TTY); - open(TTY,"/dev/tty"); - system ("stty -echo ); - print STDERR "\r\n"; - system ("stty echo ; - } - } - else { - $key = $ENV{'NOTE_PASSWD'}; - } - chomp $key; - $db->use_crypt($key,$CRYPT_METHOD); - undef $key; - # verify correctness of passwd - my ($cnote, $cdate) = $db->get_single(1); - if($cdate ne "") { - if($cdate !~ /^\d+\.\d+?/) { - print "access denied.\n"; # decrypted $date is not a number! - exit(1); - } - } #else empty! -} -else { - $db->no_crypt; - # does: NOTEDB::crypt_supported = 0; - my ($cnote, $cdate) = $db->get_single(1); - if($cdate ne "") { - if($cdate !~ /^\d+\.\d+?/) { - print "$NOTEDB seems to be encrypted!\n"; - exit(1); - } - } -} - -# main loop: ############### -if($mode eq "display") -{ - &display; -} -elsif($mode eq "search") -{ - &search; -} -elsif($mode eq "list") -{ - &list; -} -elsif($mode eq "tree") -{ - &display_tree; -} -elsif($mode eq "new") -{ - &new; -} -elsif($mode eq "delete") -{ - del; -} -elsif($mode eq "edit") -{ - &edit; -} -elsif($mode eq "dump") -{ - &dump; -} -elsif($mode eq "import") -{ - &import; -} -elsif($mode eq "interactive") -{ - &interactive; -} -else -{ - #undefined :-( -} - - -exit(0); -################## EOP ################ - - - -############################### DISPLAY ################################## -sub display -{ - my($N,$match,$note,$date,$num); - # display a certain note - print "\n"; - &num_bereich; # get @NumBlock from $numer - foreach $N (@NumBlock) - { - ($note, $date) = $db->get_single($N); - if($note) - { - if($Raw) { - print "$N\n$date\n$note\n\n"; - } - else { - output($N, $note, $date, "SINGLE"); - print "\n"; - } - $match = 1; - } - } - if(!$match) - { - print "no note with that number found!\n"; - } -} -############################### SEARCH ################################## -sub search -{ - my($n,$match,$note,$date,$num,%res); - if($searchstring eq "") - { - print "No searchstring specified!\n"; - } - else { - print "searching the database $dbname for \"$searchstring\"...\n\n"; - - %res = $db->get_search($searchstring); - - foreach $num (sort { $a <=> $b } keys %res) - { - output($num, $res{$num}->{'note'}, $res{$num}->{'date'}); - $match = 1; - } - if(!$match) - { - print "no matching note found!\n"; - } - print "\n"; - } -} - - -############################### LIST ################################## -sub list -{ - my(@topic,@RealTopic, $i,$t,$n,$num,@CurItem,$top,$in,%res); - if($mode ne "interactive" && !$Raw) - { - print "\nList of all existing notes:\n\n"; - } - else { - print "\n"; - } - - # list all available notes (number and firstline) - %res = $db->get_all(); - - if($TOPIC) - { - undef %TP; - } - - foreach $num (sort { $a <=> $b } keys %res) - { - $n = $res{$num}->{'note'}; - $t = $res{$num}->{'date'}; - if($TOPIC) - { - # this allows us to have multiple topics (subtopics!) - my ($firstline,$dummy) = split /\n/, $n, 2; - if($firstline =~ /^($TopicSep)/) - { - @topic = split(/$TopicSep/,$firstline); - } - else - { - @topic = (); - } - # looks like: "\topic\" - # collect a list of topics under the current topic - if($topic[$CurDepth-1] eq $CurTopic && $topic[$CurDepth] ne "") - { - if(exists $TP{$topic[$CurDepth]}) - { - $TP{$topic[$CurDepth]}++; - } - else - { - # only if the next item *is* a topic! - $TP{$topic[$CurDepth]} = 1 if(($CurDepth) <= $#topic); - } - } - elsif($topic[$CurDepth-1] eq $CurTopic || ($topic[$CurDepth] eq "" && $CurDepth ==1)) - { - # cut the topic off the note-text - if($n =~ /^($TopicSep)/) - { - $CurItem[$i]->{'note'} = $dummy; - } - else - { - $CurItem[$i]->{'note'} = $n; - } - # save for later output() call - $CurItem[$i]->{'num'} = $num; - $CurItem[$i]->{'time'} = $t; - $i++; - # use this note for building the $PATH! - if($RealTopic[0] eq "") - { - @RealTopic = @topic; - } - } - } - else - { - output($num, $n, $t); - } - } - if($TOPIC) - { - if($CurTopic ne "") - { - undef $PATH; - foreach (@RealTopic) - { - $PATH .= $_ . $TopicSep; - last if($_ eq $CurTopic); - } - } - else - { - $PATH = $TopicSep; - } - - # we are at top level, print a list of topics... - foreach $top (sort(keys %TP)) - { - output("-", " => ". $top . "$TopicSep ($TP{$top} notes)", - " Sub Topic "); - } - #print Dumper(@CurItem); - for($in=0;$in<$i;$in++) - { - output( $CurItem[$in]->{'num'}, - $CurItem[$in]->{'note'}, - $CurItem[$in]->{'time'} ); - } - } - - print "\n"; -} - -############################### NEW ################################## -sub new -{ - my($TEMP,$editor, $date, $note, $WARN, $c, $line, $num, @topic); - $date = &getdate; - if($ALWAYS_EDIT eq "YES") - { - $TEMP = "/tmp/note.$$"; - # let the user edit it... - $editor = &find_editor; - if($editor) - { - system $editor, $TEMP; - } - else - { - print "Could not find an editor to use!\n"; - exit(0); - } - # read it in ($note) - $note = ""; - open E, "<$TEMP" or $WARN = 1; - if($WARN) - { - print "...edit process interupted! No note has been saved.\n"; - undef $WARN; - return; - } - $c = 0; - while() - { - $note = $note . $_; - } - chomp $note; - close E; - # privacy! - unlink $TEMP; - } - else - { - $note = ""; - $line = ""; - # create a new note - if($NewType) - { - # be silent! read from STDIN until EOF. - while () { $note .= $_; } - } - else - { - print "enter the text of the note, end with .\n"; - do - { - $line = ; - $note = $note . $line; - } until $line eq ".\n"; - # remove the . ! - chop $note; - chop $note; - } - } - - # since we have not number, look for the next available: - $number = $db->get_nextnum(); - if($TOPIC && $CurTopic ne "") - { - @topic = split(/$TopicSep/,$note); - if($topic[1] eq "") - { - $note = $PATH . "\n$note"; - } - } - - - $db->set_new($number,$note,$date); - - # everything ok until here! - print "note stored. it has been assigned the number $number.\n\n"; -} - - -############################### DELETE ################################## -sub del -{ - my($i,@count, $setnum, $pos, $ERR); - # delete a note - &num_bereich; # get @NumBlock from $number - foreach $_ (@NumBlock) - { - $ERR = $db->set_del($_); - if($ERR) - { - print "no note with number $_ found!\n"; - } - else - { - print "note number $_ has been deleted.\n"; - } - } - # recount the notenumbers: - $db->set_recountnums(); - - @NumBlock = (); -} - -############################### EDIT ################################## -sub edit -{ - my($keeptime, $date, $editor, $TEMP, $note, $t, $num, $match); - # edit a note - $date = &getdate; - ($note, $keeptime) = $db->get_single($number); - if($keeptime eq "") - { - print "no note with that number found!\n\n"; - exit(0) if($mode ne "interactive"); - } - $TEMP = "/tmp/note.$USER.$$"; - open NOTE,">$TEMP" or die "Could not open $TEMP\n"; - select NOTE; - - print $note; - close NOTE; - select STDOUT; - $editor = &find_editor; - if($editor) - { - system $editor, $TEMP; - } - else - { - print "Could not find an editor to use!\n"; - exit(0); - } - $note = ""; - open NOTE,"<$TEMP" or die "Could not open $TEMP\n"; - - while() - { - $note = $note . $_; - } - chomp $note; - close NOTE; - - unlink $TEMP; - - if($KEEP_TIMESTAMP eq "YES") - { - $t = $keeptime; - } - else - { - $t = $date; - } - - # we got it, now save to db - $db->set_edit($number, $note, $t); - - print "note number $number has been changed.\n"; -} - - -sub dump -{ - my(%res, $num, $DUMP); - # $dump_file - if($dump_file eq "-") { - $DUMP = *STDOUT; - } - else { - open (DUMPFILE, ">$dump_file") or die "could not open $dump_file\n"; - $DUMP = *DUMPFILE; - } - select $DUMP; - %res = $db->get_all(); - foreach $num (sort { $a <=> $b } keys %res) - { - print STDOUT "dumping note number $num to $dump_file\n" if($dump_file ne "-"); - print "Number: $num\n" - ."Timestamp: $res{$num}->{'date'}\n" - ."$res{$num}->{'note'}\n"; - } - print "\n"; - close(DUMP); - select STDOUT; -} - -sub import -{ - my($num, $start, $complete, $dummi, $note, $date, $time, $number, $stdin, $DUMP); - # open $dump_file and import it into the notedb - $stdin = 1 if($dump_file eq "-"); - if($stdin) { - $DUMP = *STDIN; - } - else { - open (DUMPFILE, "<$dump_file") or die "could not open $dump_file\n"; - $DUMP = *DUMPFILE; - } - $db->set_del_all() if($ImportType ne ""); - $complete=0; - $start = 0; - while(<$DUMP>) - { - chomp $_; - if($_ =~ /^Number:\s\d+/) - { - if($start == 0) - { - # we have no previous record - ($dummi,$number) = split(/\s/,$_); - $start = 1; - } - else - { - # we got a complete record, save it! - $number = $db->get_nextnum(); - $db->set_new($number,$note, $date); - print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); - $complete = 0; - $note = ""; - $date = ""; - ($dummi,$number) = split(/\s/,$_); - } - } - elsif($_ =~ /^Timestamp:\s\d+/ && $complete == 0) - { - ($dummi,$date,$time) = split(/\s/,$_); - $date = "$date $time"; - $complete = 1; - } - else - { - $note .= $_ . "\n"; - } - } - if($note ne "" && $date ne "") - { - # the last record, if existent - $number = $db->get_nextnum(); - $db->set_new($number,$note, $date); - print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); - } -} - - - -sub interactive -{ - my($B, $BB, $menu, $char, @LastTopic, $Channel); - $Channel = $|; - # create menu: - $B = ""; - $BB = ""; - $menu = "[" . $B . "L" . $BB . "-List "; - if($TOPIC) { - $menu .= $B . "T" . $BB . "-Topics "; - } - $menu .= $B . "N" . $BB . "-New " - . $B . "D" . $BB . "-Delete " - . $B . "S" . $BB . "-Search " - . $B . "E" . $BB . "-Edit " - . $B . "?" . $BB . "-Help " - . $B . "Q" . $BB . "-Quit] "; # $CurTopic will be empty if $TOPIC is off! - # per default let's list all the stuff: - # Initially do a list command! - $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; - &list; - - for(;;) - { - $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; - undef $SetTitle; - if($CurDepth > 2) - { - print C $menu . $TOPICC . "../" . $CurTopic . $_TOPICC . ">"; - } - else - { - print C $menu . $TOPICC . $CurTopic . $_TOPICC . ">"; - } - - # endless until user press "Q" or "q"! - $char = ; - #$char = $term->readline(''); - chomp $char; - if($char =~ /^\d+\s*[\di*?,*?\-*?]*$/) - { - $ListType = ""; #overrun - # display notes - $number = $char; - &display; - } - elsif($char =~ /^n$/i) - { - # create a new one - &new; - } - elsif($char =~ /^$/) - { - &list; - } - elsif($char =~ /^l$/) - { - $ListType = ""; - &list; - } - elsif($char =~ /^L$/) - { - $ListType = "LONG"; - &list; - undef $SetTitle; - } - elsif($char =~ /^h$/i || $char =~ /^\?/) - { - # zu dumm der Mensch ;-) - &help; - } - elsif($char =~ /^d\s+([\d*?,*?\-*?]*)$/i) - { - # delete one! - $number = $1; - &del; - } - elsif($char =~ /^d$/i) - { - # we have to ask her: - print "enter number(s) of note(s) you want to delete: "; - $char = ; - chomp $char; - $number = $char; - &del; - } - elsif($char =~ /^e\s+(\d+\-*\,*\d*)/i) - { - # edit one! - $number = $1; - &edit; - } - elsif($char =~ /^e$/i) - { - # we have to ask her: - print "enter number of the note you want to edit: "; - $char = ; - chomp $char; - $number = $char; - &edit; - } - elsif($char =~ /^s\s+/i) - { - # she want's to search - $searchstring = $'; - chomp $searchstring; - &search; - } - elsif($char =~ /^s$/i) - { - # we have to ask her: - print "enter the string you want to search for: "; - $char = ; - chomp $char; - $char =~ s/^\n//; - $searchstring = $char; - &search; - } - elsif($char =~ /^q$/i) - { - # schade!!! - $| = $Channel; - print "\n\ngood bye!\n"; - exit(0); - } - elsif($char =~ /^t$/) - { - $TreeType = ""; - &display_tree; - } - elsif($char =~ /^T$/) - { - $TreeType = "LONG"; - &display_tree; - $TreeType = ""; - } - elsif($char =~ /^\.\.$/ || $char =~ /^cd\s*\.\.$/) - { - $CurDepth-- if ($CurDepth > 1); - $CurTopic = $LastTopic[$CurDepth]; - &list; - } - elsif($char =~ /^l\s+(\w+)$/) - { - # list - $WantTopic = $1; - if(exists $TP{$WantTopic}) - { - my %SaveTP = %TP; - $LastTopic[$CurDepth] = $CurTopic; - $CurTopic = $1; - $CurDepth++; - - &list; - - $CurTopic = $LastTopic[$CurDepth]; - $CurDepth--; - %TP = %SaveTP; - } - else - { - print "\nunknown command!\n"; - } - } - else - { - # unknown - my $unchar = $char; - $unchar =~ s/^cd //; # you may use cd now! - if(exists $TP{$char} || exists $TP{$unchar}) - { - $char = $unchar if(exists $TP{$unchar}); - $LastTopic[$CurDepth] = $CurTopic; - $CurTopic = $char; - $CurDepth++; - &list; - } - else - { - print "\nunknown command!\n"; - } - undef $unchar; - } - } -} - - - -sub usage -{ -print qq~This is the program note $version by Thomas Linden (c) 1999-2000. -It comes with absolutely NO WARRANTY. It is distributed under the -terms of the GNU General Public License. Use it at your own risk :-) -Usage: note [ options ] [ number [,number...]] -Options: --h --help displays this help screen --v --version displays the version number --l --list [] lists all existing notes If no topic were specified, - it will display a list of all existing topics. --L --longlist [] the same as -l but prints also the timestamp --t --topic prints a list of all topics as a tree. --T --longtopc prints the topic-tree with the notes under each topic --s --search searches for trough the notes database --e --edit edit note with --d --delete delete note with --D --Dump [ | -] dumps the notes to the textfile . if is simply - a "-" it will printed out to standard output. --I --Import | - imports a previously dumped textfile into the - note-database. Data will be appended by default. - You can also specify a dash "note -I -" instead of a , - which causes note, silently to read in a dump from STDIN. --o --overwrite only suitable for use with --Import. Overwrites an - existing notedb. --r --raw raw mode, output will not be formatted. Works not in interactive - mode, only on cmd-line for list and display. --i --interactive interactive mode -- if you run note only with one dash: "note -", then it will - read in a new note from STDIN until EOF, this makes it - possible to pipe text into a new note. - - o if you specify only a number (i.e. "note 4"), then the note with that - number will be displayed. - o you can specify more then one number for delete and display, for example: - "note -d 3,4" deletes #3 and #4. "note 5-7" displays #5, #6 and #7. - o if you run note without any parameter and if "AlwaysInteractive" in the config - set off, then note will create a new note and prompt you for new text. - o If it finds \~/.noterc, it will process it. Refer to the manpage for more - informations about the configuration. - o In interactive mode you can get help at any time by typing "?" or "h" at - the prompt. - o If encryption support is turned on, note will ask you for a passphrase every - time it runs. You can avoid this behavior by setting the environment-variable - \$NOTE_PASSWD. You will need this for example, if you call note from a script. -~; - #my ($package, $filename, $line) = caller; - #print "called from line $line\n"; - exit 1; -} - -sub find_editor { - return $PreferredEditor || $ENV{"VISUAL"} || $ENV{"EDITOR"} || "vim" || "vi" || "pico"; -} - -#/ - -sub format { - # make text bold/underlined/inverse using current $NOTEC - # s/\[([^]]*)\]/$param{$1}/g; - my($note) = @_; - if($FormatText) { - my $BN = uc($NOTEC); - my $_BN = uc($_NOTEC); - my $UN = $NOTEC; - $UN =~ s/<(.*)>/<$1_>/; - my $_UN = $UN; - $_UN =~ s/<(.*)>/<\/$1>/; - my $IN = $NOTEC; my $_IN = $_NOTEC; - $IN =~ s/<(.*)>/<$1I>/; - $_IN =~ s/<(.*)>/<$1I>/; - #$note =~ s/ (\*)(.+)(\*) / $BN$2$_BN /g; - #$note =~ s/ (_)(.+)(_) / $UN$2$_UN /g; - #$note =~ s/ (\/)(.+)(\/) / $IN$2$_IN /g; - $note =~ s/\*\*([^\*^\*]*)\*\*/$BN$1$_BN/g; - $note =~ s/__([^_^_]*)__/$UN$1$_UN/g; - $note =~ s/{{([^}^}]*)}}/$IN$1$_IN/g; - } - $note =~ s/(<\/.*>)/$1$NOTEC/g; - $note; -} - -sub output -{ - my($SSS, $LINE, $num, $note, $time, $TYPE, $L, $LONGSPC, $R, $PathLen, $SP, $title, $CUTSPACE, - $len, $diff, $Space, $nlen, $txtlen); - ($num, $note, $time, $TYPE) = @_; - $txtlen = ($ListType eq "LONG") ? $maxlen : $timelen + $maxlen; - - $note = &format($note); - - $SSS = "-" x ($maxlen + 31); - - $nlen = length("$num"); - $LINE = "$BORDERC $SSS $_BORDERC\n"; - $L = $BORDERC . "[" . $_BORDERC; - $LONGSPC = " " x (26 - $nlen); - $R = $BORDERC . "]" . $_BORDERC; - $PathLen = length($PATH); # will be ZERO, if not in TOPIC mode! - if($TYPE ne "SINGLE") - { - if(!$SetTitle) - { - $SP = ""; - # print only if it is the first line! - $SP = " " x ($maxlen - 2 - $PathLen); - if(!$Raw) { - # no title in raw-mode! - print C $LINE; - - print C "$L $NUMC#$_NUMC "; - if($ListType eq "LONG") - { - print C " $TIMEC" . "creation date$_TIMEC "; - } - else - { - print $LONGSPC; - } - if($TOPIC) - { - print C $TOPICC . "$PATH $_TOPICC$SP$R\n"; - } - else - { - print C $NOTEC . "note$_NOTEC$SP$R\n"; - } - - print C $LINE; - } - $SetTitle = 1; - } - $title = ""; - $CUTSPACE = " " x $txtlen; - $note =~ s/\n/$CUTSPACE/g; - $len = length($note); - if($len < ($txtlen - 2 - $nlen)) - { - $diff = $txtlen - $len; - $Space = " " x $diff; - if(!$Raw) { - if($num eq "-") - { - $title = $BORDERC . $TOPICC . "\"" . $note . "\"" . $_TOPICC . $Space . "$_BORDERC"; - } - else - { - $title = $BORDERC . $NOTEC . "\"" . $note . "\"" . $_NOTEC . $Space . "$_BORDERC"; - } - } - else { - $title = $note; - } - } - else - { - $title = substr($note,0,($txtlen - 2 - $nlen)); - if(!$Raw) { - $title = $BORDERC . $NOTEC . "\"" . $title . "...\"$_NOTEC$_BORDERC"; - } - } - if($Raw) { - print "$num "; - print "$time " if($ListType eq "LONG"); - if($title =~ /^ => (.*)$TopicSep (.*)$/) { - $title = "$1$TopicSep $2"; # seems to be a topic! - } - print "$title\n"; - } - else { - # $title should now look as: "A sample note " - print C "$L $NUMC$num$_NUMC $R"; - if($ListType eq "LONG") - { - print C "$L$TIMEC" . $time . " $_TIMEC$R"; - } - print C "$L $NOTEC" . $title . "$_NOTEC $R\n"; - print C $LINE; - } - } - else - { - # we will not reach this in raw-mode, therefore no decision here! - chomp $note; - $Space = " " x (($maxlen + $timelen) - 16); - print C $LINE; - print C "$L $NUMC$num$_NUMC $R$L$TIMEC$time$_TIMEC $Space$R\n"; - print C $LINE; - print C $NOTEC . $note . $_NOTEC . "\n"; - print C $LINE; - } - -} - - - -sub C -{ - my(%Color, $default, $S, $Col, $NC, $T); - # \033[1m%30s\033[0m - %Color = ( 'black' => '0;30', - 'red' => '0;31', - 'green' => '0;32', - 'yellow' => '0;33', - 'blue' => '0;34', - 'magenta' => '0;35', - 'cyan' => '0;36', - 'white' => '0;37', - 'B' => '1;30', - 'BLACK' => '1;30', - 'RED' => '1;31', - 'GREEN' => '1;32', - 'YELLOW' => '1;33', - 'BLUE' => '1;34', - 'MAGENTA' => '1;35', - 'CYAN' => '1;36', - 'WHITE' => '1;37', - 'black_' => '4;30', - 'red_' => '4;31', - 'green_' => '4;32', - 'yellow_' => '4;33', - 'blue_' => '4;34', - 'magenta_' => '4;35', - 'cyan_' => '4;36', - 'white_' => '4;37', - 'blackI' => '7;30', - 'redI' => '7;31', - 'greenI' => '7;32', - 'yellowI' => '7;33', - 'blueI' => '7;34', - 'magentaI' => '7;35', - 'cyanI' => '7;36', - 'whiteI' => '7;37' - ); - $default = "\033[0m"; - $S = $_[0]; - foreach $Col (%Color) - { - if ($S =~ /<$Col>/g) - { - if($COLOR ne "NO") - { - $NC = "\033[" . $Color{$Col} . "m"; - $S =~ s/<$Col>/$NC/g; - $S =~ s/<\/$Col>/$default/g; - } - else - { - $S =~ s/<$Col>//g; - $S =~ s/<\/$Col>//g; - } - } - } - return $S; -} - - - -sub num_bereich -{ - my($m,@LR,@Sorted_LR,$i); - # $number is the one we want to delete! - # But does it contain kommas? - @NumBlock = (); #reset - $m = 0; - if($number =~ /\,/) - { - # accept -d 3,4,7 - @NumBlock = split(/\,/,$number); - } - elsif($number =~ /^\d+\-\d+$/) - { - # accept -d 3-9 - @LR = split(/\-/,$number); - @Sorted_LR = (); - - if($LR[0] > $LR[1]) - { - @Sorted_LR = ($LR[1], $LR[0]); - } - elsif($LR[0] == $LR[1]) - { - # 0 and 1 are the same - @Sorted_LR = ($LR[0], $LR[1]); - } - else - { - @Sorted_LR = ($LR[0], $LR[1]); - } - - for($i=$Sorted_LR[0]; $i<=$Sorted_LR[1]; $i++) - { - # from 3-6 create @NumBlock (3,4,5,6) - $NumBlock[$m] = $i; - $m++; - } - } - else - { - @NumBlock = ($number); - } - -} - -sub getdate -{ - my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); - $year += 1900; - $mon += 1; - $mon =~ s/^(\d)$/0$1/; - $hour =~ s/^(\d)$/0$1/; - $min =~ s/^(\d)$/0$1/; - $sec =~ s/^(\d)$/0$1/; - $mday =~ s/^(\d)$/0$1/; - return "$mday.$mon.$year $hour:$min:$sec"; -} - - -sub help -{ -my $B = ""; -my $BB = ""; -my($S, $L, $T, $Q, $H, $N, $D, $E); -$L = $B . "L" . $BB . $NOTEC; -$T = $B . "T" . $BB . $NOTEC; -$Q = $B . "Q" . $BB . $NOTEC; -$H = $B . "?" . $BB . $NOTEC; -$N = $B . "N" . $BB . $NOTEC; -$D = $B . "D" . $BB . $NOTEC; -$E = $B . "E" . $BB . $NOTEC; -$S = $B . "S" . $BB . $NOTEC; - -print C qq~$BORDERC -----------------------------------------------------------------------$_BORDERC $TOPICC -HELP for interactive note $version -$_TOPICC $NOTEC -The following commands are available: -$L List notes. L=long, with timestamp and l=short without timestamp. - You can also just hit for short list. - If you specify a subtopic, then list will display it's contents, - i.e.: "l mytopic" will dislpay notes under mytopic. -$N Create a new note. -$D Delete a note. You can either hit "d 1" or "d 1-4" or just hit "d". - If you don't specify a number, you will be asked for. -$S Search trough the notes database. Usage is similar to Delete, use - a string instead of a number to search for. -$E Edit a note. Usage is similar to Delete but you can only edit note - a time. -$H This help screen. -$Q Exit the program.~; -if($TOPIC) -{ -print C qq~ -$T print a list of all existing topics as a tree. T prints the tree - with all notes under each topic. - - You can change the actual topic by simply typing it's name or by using - the command "cd", i.e. "cd mytopic". You can create a new topic by creating - a new note, the first line must be the topic borderd by slashes, i.e.: - "/newtopic/". The slash is the default topic-sepearator, but you can over- - ride this in the config! If you type just ".." instead of a topic, you will - go one step back in your topic-structure. -~; -} -print C qq~ -$NOTEC -All commands except the List and Topic commands are case insensitive. $_NOTEC $BORDERC -----------------------------------------------------------------------$_BORDERC -~; -} - - -sub display_tree { - # displays a tree of all topics - my(%TREE, %res, $n, $t, $num, @nodes, $firstline, $text, $untext); - %res = $db->get_all(); - foreach $num (keys %res) - { - $n = $res{$num}->{'note'}; - $t = $res{$num}->{'date'}; - # this allows us to have multiple topics (subtopics!) - my ($firstline,$text,$untext) = split /\n/, $n, 3; - if($firstline =~ /^($TopicSep)/) - { - $firstline =~ s/($TopicSep)*$//; #remove TopicSepatator - @nodes = split(/$TopicSep/,$firstline); - } - else - { - @nodes = ();("$TopicSep"); - $text = $firstline; - } - &tree($num, $text, \%TREE, @nodes); - } - #return if ($num == 0); - # now that we have build our tree (in %TREE) go on t display it: - print C $BORDERC . "\n[" . $TopicSep . $BORDERC . "]\n"; - &print_tree(\%{$TREE{''}},"") if(%TREE); - print C $BORDERC . $_BORDERC . "\n"; -} - - -sub tree { - my($num, $text, $LocalTree, $node, @nodes) = @_; - if(@nodes) { - if(! exists $LocalTree->{$node}->{$NoteKey}) { - $LocalTree->{$node}->{$NoteKey} = []; - } - &tree($num, $text, $LocalTree->{$node}, @nodes); - } - else { - if(length($text) > ($maxlen - 5)) { - $text = substr($text, 0, ($maxlen -5)); - } - $text = $text . " (" . $NUMC . "#" . $num . $_NUMC . $NOTEC . ")" . $_NOTEC if($text ne ""); - push @{$LocalTree->{$node}->{$NoteKey}}, $text; - } -} - - -sub print_tree { - # thanks to Jens for his hints and this sub! - my $hashref=shift; - my $prefix=shift; - my @notes=@{$hashref->{$NoteKey}}; - my @subnotes=sort grep { ! /^$NoteKey$/ } keys %$hashref; - if($TreeType eq "LONG") { - for my $note (@notes) { - if($note ne "") { - print C $BORDERC ;# . $prefix. "|\n"; - print C "$prefix+---<" . $NOTEC . $note . $BORDERC . ">" . $_NOTEC . "\n"; - } - } - } - for my $index (0..$#subnotes) { - print C $BORDERC . $prefix. "|\n"; - print C "$prefix+---[" . $TOPICC . $subnotes[$index] . $BORDERC . "]\n"; - &print_tree($hashref->{$subnotes[$index]},($index == $#subnotes?"$prefix ":"$prefix| ")); - } -} - - -sub getconfig -{ - my($configfile) = @_; - my ($home, $value, $option); - # checks are already done, so trust myself and just open it! - open CONFIG, "<$configfile" || die $!; - while() { - chomp; - next if(/^\s*$/ || /^\s*#/); - my ($option,$value) = split /\s\s*=?\s*/, $_, 2; - $value =~ s/\s*$//; - $home = $value if (/^Home/); - $libpath = $value if (/^LibPath/); - $dbdriver = $value if (/^DbDriver/); - $dbhost = $value if (/^DbHost/); - $dbuser = $value if (/^DbUser/); - $dbpasswd = $value if (/^DbPasswd/); - $dbname = $value if (/^DbName/); - $table = $value if (/^DbTable/); - $fnum = $value if (/^FieldNumber/); - $fnote = $value if (/^FieldNote/); - $fdate = $value if (/^FieldDate/); - $NOTEDB = $value if (/^NoteDb/); - $MAX_NOTE = $value if (/^MaxNoteByte/); - $MAX_TIME = $value if (/^MaxTimeByte/); - $CRYPT_METHOD = $value if (/^CryptMethod/); - $USE_CRYPT = "YES" if (/^UseEncryption/ && $value == 1); - $USE_CRYPT = undef if (/^UseEncryption/ && $value == 0); - $ALWAYS_INT = "YES" if (/^AlwaysInteractive/ && $value == 1); - $ALWAYS_INT = undef if (/^AlwaysInteractive/ && $value == 0); - $DEFAULT_LIST = "LONG" if (/^DefaultLong/ && $value == 1); - $DEFAULT_LIST = undef if (/^DefaultLong/ && $value == 0); - $ALWAYS_EDIT = "YES" if (/^AlwaysEditor/ && $value == 1); - $ALWAYS_EDIT = undef if (/^AlwaysEditor/ && $value == 0); - $KEEP_TIMESTAMP = "YES" if (/^KeepTimeStamp/ && $value == 1); - $KEEP_TIMESTAMP = undef if (/^KeepTimeStamp/ && $value == 0); - $COLOR = "YES" if (/^UseColors/ && $value == 1); - $COLOR = "NO" if (/^UseColors/ && $value == 0); - $TopicSep = $value if (/^TopicSeparator/); - $maxlen = $value if (/^MaxLen/); - $BORDER_COLOR = $value if (/^BorderColor/); - $NUM_COLOR = $value if (/^NumberColor/); - $NOTE_COLOR = $value if(/^NoteColor/); - $TIME_COLOR = $value if (/^TimeColor/); - $TOPIC_COLOR = $value if (/^TopicColor/); - $PreferredEditor = $value if (/^PreferredEditor/); - $FormatText = $value if (/^FormatText/); - } - chomp $home; - $home =~ s/\/*$//; # cut eventually / at the end - $HOME = eval($home); - if($NOTEDB =~ /^(~\/)(.*)$/) { - $NOTEDB = "/home/" . $USER . "/" . $2; - } - $libpath =~ s/\/*$//; - - close CONFIG; -} - - - - -__END__ -# -# $Log: note,v $ -# Revision 1.1.1.1 2000/07/01 14:40:50 zarahg -# initial import -# -# Revision 1.27 2000/05/16 23:51:35 thomas -# fixed many option-parsing related bugd! -# -# Revision 1.26 2000/05/13 01:05:17 thomas -# changed config format and fixed some bugs -# as well as some other additions... -# -# Revision 1.25 2000/05/11 23:42:43 thomas -# --tree changed to --topic -# -# Revision 1.24 2000/05/10 22:59:44 thomas -# updated usage to reflect --raw and build it into output -# and display subs. -# -# Revision 1.23 2000/05/10 22:19:04 thomas -# changed to Getopt::Long, added --raw -# -# Revision 1.22 2000/05/01 18:51:40 thomas -# added "-" to sub dump -# -# Revision 1.21 2000/05/01 00:17:27 thomas -# *** empty log message *** -# -# Revision 1.20 2000/04/30 23:31:38 thomas -# added -o and coloured sub help. -# -# Revision 1.19 2000/04/30 16:07:23 thomas -# *** empty log message *** -# -# Revision 1.18 2000/04/30 14:58:21 thomas -# updated the usage and help subs -# -# Revision 1.17 2000/04/30 14:44:38 thomas -# added colors to the tree functions -# -# Revision 1.16 2000/04/30 14:28:38 thomas -# added the t command, which displays a topic-tree. -# and enhanced the list command in interactive mode -# -# Revision 1.15 2000/03/19 23:41:04 thomas -# changed set_del, now no extra TEMP file is required! -# instead I get it from $this->get_all() ! -# Revision 1.14 2000/03/19 22:51:49 thomas -# Bug in NOTEDB::binary fixed, recount of nubers was -# incorrect. -# -# Revision 1.13 2000/03/19 11:53:32 thomas -# edit bug fixed (ude => uen) -# -# Revision 1.12 2000/03/19 03:06:51 thomas -# backend support completed. -# mysql and binary backends now excluded in separate files -# -# Revision 1.11 2000/03/18 00:16:47 thomas -# added NOTEDB::mysql and changed note to work with that. -# thus, from now on there is only one script to maintain and -# it is possible to provide more bacjends as well as making -# additional scripts upon them, i.e. cgi script... -# -# Revision 1.8 2000/03/13 22:48:43 thomas -# small width bug fixed -# -# Revision 1.7 2000/03/08 23:11:19 tom -# added cd -# -# Revision 1.6 2000/03/08 22:50:41 tom -# Added the $KEEP_TIMESTAMP option and fixed a bug regarding topic names -# and invalid resolution of them in case it started with "1 name". -# -# Revision 1.5 2000/02/25 20:59:30 tom -# corrected small timestamp problem in &edit and &new -# -# Revision 1.4 2000/02/25 13:24:11 tom -# fixed a small bug, that caused to use the last line for a note title instead the 2nd. -# -# Revision 1.3 2000/02/25 11:28:53 tom -# all changes from bin version applied to sql version diff --git a/note-1.0.7/Changelog b/note-1.0.7/Changelog deleted file mode 100644 index abc280d..0000000 --- a/note-1.0.7/Changelog +++ /dev/null @@ -1,277 +0,0 @@ -================================================================================== - -1.0.7: -FIXED: there was a bug in the search expression, use now \Q and \E. -ADDED: --config allows one to use another config than the default. - -================================================================================== - -1.0.6: -FIXED: there were some odd bugs in commandline parsing, some options were unavailable. -FIXED: Forgot "PreferredEditor" config-option in the new config format. -FIXED: the interactive "cd .." command has ignored the presence of a - "DefaultLong" setting(and search too)... thx to Peter. -CHANGED: Optimized a little bit the output routine, now it is better to read. -ADDED: sub format and appropriate config-option for text formatting capabilities. -CHANGED: changed getconfig regexp, which allows now also to use Option = Param. -FIXED: was not possible to override config-options, which are set by default to - something. -ADDED: note chacks now, if a database os actually really encrypted and exits with - an error if it s and the user turned off encryption. This protects her from - destroying it's own database .. - -================================================================================== - -1.0.5: -FIXED: the T (and t respectively) printed nothing out since 1.0.3! It does - it now again... -ADDED: a new database backend added, NOTEDB::dbm, which uses DBM files for - storage. -FIXED: &display-tree returns now, if there is no note, otherwise it - would die because of an undefined refernce. -CHANGED: Changed the config file format completely. It is now no more a perl - file, instead it is a simple plain text file which note parses. -CHANGED: Changed the way, note loads it database backend. It uses now the - $dbdriver variable as module-name, which makes it possible easily - to write your own backend without the need to change note itself. -FIXED: Removed Getopt::Long option "bundling", causes errors with perl - 5.6.0 and is not senceful. -FIXED: Added the Getopt::Long option "no_ignore_case". In 1.0.4 options - were case insensitive causing -i to be interpreted as --import - instead of --interactive ;-((( -ADDED: a new config option $DEFAULT_LIST, which causes note, \ - if turned to "LONG", to use long-listing as default. | - But it will still be able to use short-listing if you | - explicit specify that. | submitted by -FIXED: sub search prints now an appropriate error-message in |==> Peter Palmreuther - case no searchstring was given instead of jumping to | thanks a lot! - usage. | -CHANGED: Changed the text in the interactive help to reflect | - changes of verion 1.0.3 (t and T). / - -================================================================================== - -1.0.4: -CHANGED: Moved from @ARGV-parsing to Getopt::Long, adding options is now - much easier and I do now understand my own code ;-) -ADDED: --raw, the "Raw Mode", which turns off any formatting of output. - -================================================================================== - -1.0.3: -ADDED: "-" works also for --dump, but in the other direction. It causes - note to dump to standard output instead into a file. -ADDED: you can specify - as filename for use with --import and if you want - to create a new note. "-" stands for standardinput and it allows you - tp pipe another commands output to note! -ADDED: you can now use an environment variable for the passphrase (when using - encryption). If it is presen, note will not ask for a passphrase. This - is very usefull in comination with the addition above, for use in - scripts. -CHANGED: the interactive help screen is now coloured. -ADDED: -o commandline switch, which causes note to overwrite an existing - database when importing data from a previous dump. Very handy if - you want to re-initialize your db, i.e. if you changed the format. -ADDED: the long-tree-view (-T) displays now also the note-number of each - note. - -================================================================================== - -1.0.2: -ADDED: Topic-Tree overview command (-t or -T). -ADDED: Enhanced list command in interactive mode, you can now specify - a topic which notes you want to see. -CHANGED: updated the help and usage sections to reflect the additions above. - -================================================================================== - -1.0.1: -FIXED: fixed bug in NOTEDB::mysql, which caused note t store NULL values - in db, if encryption was off. A really dump failure :-( - -================================================================================== - -1.0.0: -CHANGED: removed install.sh. use now a Makefile for installation. -ADDED: Encryption support. Note can now encrypt notes using IDEA - or DES as encryption-protocols(symetric). - -================================================================================== - -0.9: -FIXED: There were many new bugs after my last changes *grrrrr*. fixed. - Works now properly, with both backends! -FIXED: and another bug: recounting of numbers did not take care about - the existing order! If you deleted note #12, then note #13 became - not neccessarily #12! Instead it becames any other number (kind of - randomly...). -CHANGED: NOTEDB::binary set_del function changed, it does no more require - a temporary file for number recount. Instead it uses get_all and - stores all notes in RAM and then rewrites the database. -FIXED: fixed the set_new call within note. It used 0 as the first param - (number) which is not useful since we dont have support for auto- - increment from all database backends. -FIXED: fixed the function set_recountnum in NITEDB::mysql, it was also - incorrect :-((( 0.8 seemed to be a very bad early alpha........... -FIXED: there was a bug in NOTEDB::binary which caused not to recount note - numbers after deleting one :-( - - -================================================================================== - -0.8: -ADDED: NOTEDB::binary. so now 0.8 is ready for shipping ! -FIXED: regexp bug fixed. It was only possible to delete 2 items together - separated by comma ("d 1,2,3,4" deleted only 1,2!). -ADDED: Some new config options which reflects the new module structure. - So you can change your database backend without the need to - replace the note script itself. -FIXED: the previously added feature "cd " didn't really work :-( -ADDED: NOTEDB::mysql added. Perlmodule, which I will use within - note from now on instead of buildin functions for accessing the - database. From now on I only need to maintain one version of - note, since the module interface will be identical between the - bin and sql version. -CHANGED: The SQL code does not use Mysql.pm anymore. Instead it is coded - using the more portable DBI module. This allows one easily to - switch to anther database, which is supported by DBI. -CHANGED: Locking. The db-table will now be locked before note accesses it. -FIXED: width of listings is now always the same independent of the string- - length of a certain note. - - -================================================================================== - -0.7: -ADDED: one can now use the unix-like "cd" command to change to another - topic, thus use "cd topicname" instead just typing "topicname"! -FIXED: there was a smal regex bug which maked it impossible to use such - topics: "4 test", in such a case note just displayed note number 4 - instead of cd'ing to topic "4 test". -ADDED: a new config option "$KEEP_TIMESTAMP" allows a user to disable - note's default behavior of updating the timestamp of a note after - editing it. - - - -================================================================================== - - -0.6: -FIXED: oops - the new suptopic feature confused the commandline-mode of - note! quickly corrected! so subtopics also available from command- - line. -FIXED: a small bug fiyed, it was impossible to use -D or -I from command- - line, if $ALWAYS_INT was turned on, now it is. -FIXED: fixed problem with local/global variable $time, which confused - the script under certain circumstances, now $time is no more global, - it will be read in (using &getdate) locally by &new and &edit. -CHANGED: The Topic separator is no longer hardcoded, one can customize - it using the $TopicSep variable, the default is now /, the backslash - will no mor work! -CHANGED: use perl buildin localtime() function instead of - GNU date, which is possibly not installed on every target - system (i.e. win32), therefore better portability! -CHANGED: use now the strict module -ADDED: Support for subtopics added (and sub-sub-..-topics). -CHANGED: Removed the "T" command, it is now obsolete. -CHANGED: behavior of list command changed, now shows topics as well as - notes under the current topic(if there are some). -CHANGED: The ".." command takes you now one level higher in your topic- - structure. -ADDED: A new config option $PreferredEditor, which you can use to - specify your own choice of editor. -FIXED: A bug at line 769 causing single note where smaller than note- - listings - - - -================================================================================== - - - -0.5: -ADDED: Topic support(requested). You can sort the various notes under - different topics now. -FIXED: There was another bug, which caused the list command to display - the notes with a too high value of $maxlen. - - - -================================================================================== - - - -0.4.2: -ADDED: If run in interactive mode, note will at first do a list command. -FIXED: A bug caused note to save bogus timestamps after editing a note. -CHANGED: It does no more print 3 newlines before the menu in interactive mode. -FIXED: Some more vars will be resetted during each loop in interactive mode. - $ListType. - - - -================================================================================== - - - -0.4.1: -ADDED: The install.sh script for the mysql version is no able to install the - required Mysql module directly from CPAN, thanks to David A. Bandel! -FIXED: The mysql version did not display notes (i.e.: "note 3" did nothing) -CHANGED: Again, the sql-format of the mysql database has been changed. Now - there are only 3 fields, the number filed is the primary key, the id - field in previous versions was a waste of diskspace... -CHANGED: The format of the dump-output has been changed. -ADDED: It is now possible to import previously dumped notes into the notedb - (dumps from both versions are compatible with each other) -FIXED: the function num_bereich() had a bug, which caused ot to ignore under - some circumstances one number (i.e. "note -d 4-13" did nothing). - - - -================================================================================== - - - -0.4: -CHANGED: ok, mysql support is back again (upon requests). therefore there - are two different version of the script in the same time with - the same features, one for mysql and the other one for the binary - database. -ADDED: Dump to textfile capability. Later on I want to dump it into a - palm readable format, any help is welcome! -ADDED: interactive mode. -CHANGED: Better modularity, better code. -CHANGED: note can now run without the need of a config file. If does not - exist, it will try to work with default values. -ADDED: sub num_bereich(), which allows one to specify more then one - number for deletion or displaying (i.e.: "-d 1,4,7" or "-d 4-9") - - - -================================================================================== - - - -0.3: -CHANGED: it uses no more a mysql database, but a binary file instead. - This is much faster! -ADDED: note can display the notes with colors, it is turned off by default - - -================================================================================== - - -0.2: -FIXED: now any occurence of ' will be masked with \' before storage - to the mysql database. -FIXED: now numbers of notes will be recounted, if one delete one note, - so the list of notes will everytime start with 1,2,3,... -CHANGED: the look of the list output has been changed, similar to a table - - -================================================================================== - -0.1: -INITIAL RELEASE. diff --git a/note-1.0.7/Makefile.PL b/note-1.0.7/Makefile.PL deleted file mode 100644 index cc0d712..0000000 --- a/note-1.0.7/Makefile.PL +++ /dev/null @@ -1,108 +0,0 @@ -# does not use ExtUtils::MakeMaker, because -# NOTEDB::mysql and NOTEDB::binary are internals -# of note. -# -# $Id: Makefile.PL,v 1.1 2000/04/17 17:38:49 thomas Exp thomas $ -# -# check for the existence of optional modules: -sub chk_mod -{ - my($mod, $msg) = @_; - print "<====\tchecking $mod \t====>\n"; - eval { - $mod .= ".pm"; - $mod =~ s/::/\//g; - require $mod; - }; - if($@) { - print $msg; - } - else { - print " ... installed.\n"; - } - print "\n"; -} - -&chk_mod( - "Getopt::Long", - "WARNING: Getopt::Long seems not to be installed on your system!\n" - ."But it is strongly required in order to run note!\n" - ); - -&chk_mod( - "DB_File", - "WARNING: DB_File seems not to be installed on your system!\n" - ."It is required, if you want to use the DBM backend.\n" - ); - - -&chk_mod( - "DBI", - " WARNING: module DBI is not installed on your system.\n" - ." It is required, if you want to use a SQL database with\n" - ."note.\n" - ); - -&chk_mod( - "Crypt::IDEA", - " WARNING: module Crypt::IDEA is not installed on your system.\n" - ." It is required, if you want to encrypt your data using IDEA.\n" - ); - -&chk_mod( - "Crypt::DES", - " WARNING: module Crypt::DES is not installed on your system.\n" - ." It is required, if you want to encrypt your data using DES.\n" - ); - -&chk_mod( - "Crypt::CBC", - " WARNING: module Crypt::CBC is not installed on your system.\n" - ." It is required, if you want to encrypt your data using CBC.\n" - ); - -&chk_mod( - "MD5", - " WARNING: module MD5 is not installed on your system.\n" - ." It is required by Crypt::CBC.\n" - ); - -foreach $dir (@INC) { - if($dir =~ /site_perl/) - { $LIBDIR = $dir; last; } -} -print "directory, where to install libs [$LIBDIR]: "; -$input = <>; -chomp $input; -$LIBDIR = $input if($input ne ""); - -$BINDIR = "/usr/local/bin"; -print "directory, where to install note [$BINDIR]: "; -$input = <>; -chomp $input; -$BINDIR = $input if($input ne ""); - -$install = `which install`; - -open M, "> Makefile" || die $!; -print M qq~BIN = bin/note -LIBS = NOTEDB/mysql.pm NOTEDB/binary.pm NOTEDB/dbm.pm -INSTBIN = $BINDIR -INSTLIB = $LIBDIR -INSTALL = $install -all: - \@echo "done. Type make install.\\n" - -install: - \$(INSTALL) -d -m 755 \$(INSTLIB)/NOTEDB - \$(INSTALL) -m 755 \$(LIBS) \$(INSTLIB)/NOTEDB - \$(INSTALL) -m 755 \$(BIN) \$(INSTBIN) -~; - -print "Type \"make install\" to install all files.\n\n"; -print "Please note: You may also copy the file \"config/noterc\" to\n" - ."your home: \"cp config/noterc ~/.noterc\". Don't forget to edit\n" - ."your config-file. Read the README for more informations on this\n" - ."topic.\n" - ."Thanks for choosing \"note\"! You are helping to keep the \n" - ."OpenSource idea alive! Enjoy and tell me, what you think!\n\n"; diff --git a/note-1.0.7/NOTEDB/README b/note-1.0.7/NOTEDB/README deleted file mode 100644 index 447198c..0000000 --- a/note-1.0.7/NOTEDB/README +++ /dev/null @@ -1,7 +0,0 @@ -perl modules for note used as database backends. -the install.sh script will install both of them, -although you may only need one backend. Perhaps -other users on your system have oter ideas in mind... - -Therefore, please ignore these file. There is nothing -to edit or to do. Simply leave this directory :-) diff --git a/note-1.0.7/NOTEDB/binary.pm b/note-1.0.7/NOTEDB/binary.pm deleted file mode 100644 index fac520b..0000000 --- a/note-1.0.7/NOTEDB/binary.pm +++ /dev/null @@ -1,388 +0,0 @@ -#!/usr/bin/perl -# $Id: binary.pm,v 1.6 2000/06/25 19:48:00 scip Exp scip $ -# Perl module for note -# binary database backend. see docu: perldoc NOTEDB::binary -# -use strict; -use Data::Dumper; -use IO::Seekable; - -package NOTEDB; -use Fcntl qw(LOCK_EX LOCK_UN); -BEGIN { - # make sure, it works, although encryption - # not supported on this system! - eval { require Crypt::CBC; }; - if($@) { - $NOTEDB::crypt_supported = 0; - } - else { - $NOTEDB::crypt_supported = 1; - } -} - -# Globals: -my ($NOTEDB, $sizeof, $typedef,$version); -my ($cipher); - -$version = "(NOTEDB::binary, 1.6)"; - - -sub new -{ - my($this, $dbdriver, $dbname, $MAX_NOTE, $MAX_TIME) = @_; - - my $class = ref($this) || $this; - my $self = {}; - bless($self,$class); - $NOTEDB = $dbname; - - if(! -e $NOTEDB) - { - open(TT,">$NOTEDB") or die "Could not create $NOTEDB: $!\n"; - close (TT); - } - elsif(! -w $NOTEDB) - { - print "$NOTEDB is not writable!\n"; - exit(1); - } - - - my $TYPEDEF = "i a$MAX_NOTE a$MAX_TIME"; - my $SIZEOF = length pack($TYPEDEF, () ); - - $sizeof = $SIZEOF; - $typedef = $TYPEDEF; - return $self; -} - - -sub DESTROY -{ - # clean the desk! -} - -sub version { - return $version; -} - -sub no_crypt { - $NOTEDB::crypt_supported = 0; -} - -sub use_crypt { - my($this,$key,$method) = @_; - if($NOTEDB::crypt_supported == 1) { - eval { - $cipher = new Crypt::CBC($key, $method); - }; - if($@) { - $NOTEDB::crypt_supported == 0; - } - } - else{ - print "warning: Crypt::CBC not supported by system!\n"; - } -} - -sub set_del_all -{ - unlink $NOTEDB; - open(TT,">$NOTEDB") or die "Could not create $NOTEDB: $!\n"; - close (TT); -} - - -sub get_single -{ - my($this, $num) = @_; - my($address, $note, $date, $buffer, $n, $t, $buffer, ); - - open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - - $address = ($num-1) * $sizeof; - seek(NOTE, $address, IO::Seekable::SEEK_SET); - read(NOTE, $buffer, $sizeof); - ($num, $n, $t) = unpack($typedef, $buffer); - - $note = ude($n); - $date = ude($t); - - flock NOTE, LOCK_UN; - close NOTE; - - return $note, $date; -} - - -sub get_all -{ - my($this, $num, $note, $date, %res); - - open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - my($buffer, $t, $n); - seek(NOTE, 0, 0); # START FROM BEGINNING - while(read(NOTE, $buffer, $sizeof)) { - ($num, $note, $date) = unpack($typedef, $buffer); - $t = ude($date); - $n = ude($note); - $res{$num}->{'note'} = $n; - $res{$num}->{'date'} = $t; - } - flock NOTE, LOCK_UN; - close NOTE; - - return %res; -} - - -sub get_nextnum -{ - my($this, $num, $te, $me, $buffer); - - open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - - seek(NOTE, 0, 0); # START FROM BEGINNING - while(read(NOTE, $buffer, $sizeof)) { - ($num, $te, $me) = unpack($typedef, $buffer); - } - $num += 1; - flock NOTE, LOCK_UN; - close NOTE; - - return $num; -} - -sub get_search -{ - my($this, $searchstring) = @_; - my($buffer, $num, $note, $date, %res, $t, $n); - - open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - - seek(NOTE, 0, 0); # START FROM BEGINNING - while(read(NOTE, $buffer, $sizeof)) - { - ($num, $note, $date) = unpack($typedef, $buffer); - $n = ude($note); - $t = ude($date); - if($n =~ /\Q$searchstring\E/i) - { - $res{$num}->{'note'} = $n; - $res{$num}->{'date'} = $t; - } - } - flock NOTE, LOCK_UN; - close NOTE; - - return %res; -} - - - - -sub set_edit -{ - my($this, $num, $note, $date) = @_; - my $address = ($num -1 ) * $sizeof; - - open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - - seek(NOTE, $address, IO::Seekable::SEEK_SET); - my $n = uen($note); - my $t = uen($date); - - my $buffer = pack($typedef, $num, $n, $t); - print NOTE $buffer; - - flock NOTE, LOCK_UN; - close NOTE; -} - - -sub set_new -{ - my($this, $num, $note, $date) = @_; - open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - - seek(NOTE, 0, IO::Seekable::SEEK_END); # APPEND - my $n = uen($note); - my $t = uen($date); - my $buffer = pack($typedef, $num, $n, $t); - print NOTE $buffer; - - flock NOTE, LOCK_UN; - close NOTE; -} - - -sub set_del -{ - my($this, $num) = @_; - my(%orig, $note, $date, $T, $setnum, $buffer, $n, $N, $t); - - $setnum = 1; - - %orig = $this->get_all(); - return "ERROR" if (! exists $orig{$num}); - - delete $orig{$num}; - - # overwrite, but keep number! - open NOTE, ">$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - seek(NOTE, 0, 0); # START FROM BEGINNING - foreach $N (keys %orig) { - $n = uen($orig{$N}->{'note'}); - $t = uen($orig{$N}->{'date'}); - $buffer = pack( $typedef, $N, $n, $t); # keep orig number, note have to call recount! - print NOTE $buffer; - seek(NOTE, 0, IO::Seekable::SEEK_END); - $setnum++; - } - flock NOTE, LOCK_UN; - close NOTE; - return; -} - -sub set_recountnums -{ - my($this) = @_; - my(%orig, $note, $date, $T, $setnum, $buffer, $n, $N, $t); - - $setnum = 1; - %orig = $this->get_all(); - - open NOTE, ">$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - seek(NOTE, 0, 0); # START FROM BEGINNING - - foreach $N (sort {$a <=> $b} keys %orig) { - $n = uen($orig{$N}->{'note'}); - $t = uen($orig{$N}->{'date'}); - $buffer = pack( $typedef, $setnum, $n, $t); - print NOTE $buffer; - seek(NOTE, 0, IO::Seekable::SEEK_END); - $setnum++; - } - flock NOTE, LOCK_UN; - close NOTE; - return; -} - -sub uen -{ - my($T); - if($NOTEDB::crypt_supported == 1) { - eval { - $T = pack("u", $cipher->encrypt($_[0])); - }; - } - else { - $T = pack("u", $_[0]); - } - chomp $T; - return $T; -} - -sub ude -{ - my($T); - if($NOTEDB::crypt_supported == 1) { - eval { - $T = $cipher->decrypt(unpack("u",$_[0])); - }; - } - else { - $T = unpack("u", $_[0]); - } - return $T; -} - -1; # keep this! - -__END__ - -=head1 NAME - -NOTEDB::binary - module lib for accessing a notedb from perl - -=head1 SYNOPSIS - - # include the module - use NOTEDB; - - # create a new NOTEDB object - $db = new NOTEDB("binary", "/home/tom/.notedb", 4096, 24); - - # decide to use encryption - # $key is the cipher to use for encryption - # $method must be either Crypt::IDEA or Crypt::DES - # you need Crypt::CBC, Crypt::IDEA and Crypt::DES to have installed. - $db->use_crypt($key,$method); - - # do not use encryption - # this is the default - $db->no_crypt; - - # get a single note - ($note, $date) = $db->get_single(1); - - # search for a certain note - %matching_notes = $db->get_search("somewhat"); - # format of returned hash: - #$matching_notes{$numberofnote}->{'note' => 'something', 'date' => '23.12.2000 10:33:02'} - - # get all existing notes - %all_notes = $db->get_all(); - # format of returnes hash like the one from get_search above - - # get the next noteid available - $next_num = $db->get_nextnum(); - - # modify a certain note - $db->set_edit(1, "any text", "23.12.2000 10:33:02"); - - # create a new note - $db->set_new(5, "any new text", "23.12.2000 10:33:02"); - - # delete a certain note - $db->set_del(5); - - # turn on encryption. CryptMethod must be IDEA, DES or BLOWFISH - $db->use_crypt("passphrase", "CryptMethod"); - - # turn off encryption. This is the default. - $db->no_crypt(); - - -=head1 DESCRIPTION - -You can use this module for accessing a note database. There are currently -two versions of this module, one version for a SQL database and one for a -binary file (note's own database-format). -However, both versions provides identical interfaces, which means, you do -not need to change your code, if you want to switch to another database format. - -Currently, NOTEDB module is only used by note itself. But feel free to use it -within your own project! Perhaps someone want to implement a webinterface to -note... - -=head1 USAGE - -please see the section SYNOPSIS, it says it all. - -=head1 AUTHOR - -Thomas Linden . - - - -=cut diff --git a/note-1.0.7/NOTEDB/dbm.pm b/note-1.0.7/NOTEDB/dbm.pm deleted file mode 100644 index cfdc0ba..0000000 --- a/note-1.0.7/NOTEDB/dbm.pm +++ /dev/null @@ -1,261 +0,0 @@ -#!/usr/bin/perl -# $Id: dbm.pm,v 1.2 2000/06/25 19:51:11 scip Exp scip $ -# Perl module for note -# DBM database backend. see docu: perldoc NOTEDB::dbm -# - -use DB_File; -#use Data::Dumper; -use strict; -package NOTEDB; - -BEGIN { - # make sure, it works, although encryption - # not supported on this system! - eval { require Crypt::CBC; }; - if($@) { - $NOTEDB::crypt_supported = 0; - } - else { - $NOTEDB::crypt_supported = 1; - } -} - -# Globals: -my ($dbm_dir, $notefile, $timefile, $version, $cipher, %note, %date); -$notefile = "note.dbm"; -$timefile = "date.dbm"; - -$version = "(NOTEDB::dbm, 1.1)"; - -sub new -{ - my($this, $dbdriver, $dbm_dir) = @_; - my $class = ref($this) || $this; - my $self = {}; - bless($self,$class); - - tie %note, "DB_File", "$dbm_dir/$notefile" || die $!; - tie %date, "DB_File", "$dbm_dir/$timefile" || die $!; - - return $self; -} - - -sub DESTROY -{ - # clean the desk! - untie %note, %date; -} - -sub version { - return $version; -} - -sub no_crypt { - $NOTEDB::crypt_supported = 0; -} - -sub use_crypt { - my($this, $key, $method) = @_; - if($NOTEDB::crypt_supported == 1) { - eval { - $cipher = new Crypt::CBC($key, $method); - }; - if($@) { - $NOTEDB::crypt_supported == 0; - } - } - else{ - print "warning: Crypt::CBC not supported by system!\n"; - } -} - - -sub get_single -{ - my($this, $num) = @_; - my($note, $date); - return ude ($note{$num}), ude($date{$num}); -} - - -sub get_all -{ - my($this, $num, $note, $date, %res, $real); - foreach $num (sort {$a <=> $b} keys %date) { - $res{$num}->{'note'} = ude($note{$num}); - $res{$num}->{'date'} = ude($date{$num}); - } - return %res; -} - - -sub get_nextnum -{ - my($this, $num); - foreach (sort {$a <=> $b} keys %date) { - $num = $_; - } - $num++; - return $num; -} - -sub get_search -{ - my($this, $searchstring) = @_; - my($num, $note, $date, %res); - - foreach $num (sort {$a <=> $b} keys %date) { - if (ude($note{$num}) =~ /\Q$searchstring\E/i) { - $res{$num}->{'note'} = ude($note{$num}); - $res{$num}->{'date'} = ude($date{$num}); - } - } - - return %res; -} - - - -sub set_recountnums -{ - my $this = shift; - my(%Note, %Date, $num, $setnum); - $setnum = 1; - foreach $num (sort {$a <=> $b} keys %note) { - $Note{$setnum} = $note{$num}; - $Date{$setnum} = $date{$num}; - $setnum++; - } - %note = %Note; - %date = %Date; -} - - - -sub set_edit -{ - my($this, $num, $note, $date) = @_; - $note{$num} = uen($note); - $date{$num} = uen($date); -} - - -sub set_new -{ - my($this, $num, $note, $date) = @_; - $this->set_edit($num, $note, $date); # just the same thing -} - - -sub set_del -{ - my($this, $num) = @_; - my($note, $date, $T); - ($note, $date) = $this->get_single($num); - return "ERROR" if ($date !~ /^\d/); - delete $note{$num}; - delete $date{$num}; -} - -sub set_del_all -{ - my($this) = @_; - %note = (); - %date = (); - return; -} - -sub uen -{ - my($T); - if($NOTEDB::crypt_supported == 1) { - eval { - $T = pack("u", $cipher->encrypt($_[0])); - }; - } - else { - $T = $_[0]; - } - chomp $T; - return $T; -} - -sub ude -{ - my($T); - if($NOTEDB::crypt_supported == 1) { - eval { - $T = $cipher->decrypt(unpack("u",$_[0])) - }; - return $T; - } - else { - return $_[0]; - } -} - -1; # keep this! - -__END__ - -=head1 NAME - -NOTEDB::dbm - module lib for accessing a notedb from perl - -=head1 SYNOPSIS - - # include the module - use NOTEDB; - - # create a new NOTEDB object (the last 4 params are db table/field names) - $db = new NOTEDB("mysql","note","/home/user/.notedb/"); - - # get a single note - ($note, $date) = $db->get_single(1); - - # search for a certain note - %matching_notes = $db->get_search("somewhat"); - # format of returned hash: - #$matching_notes{$numberofnote}->{'note' => 'something', 'date' => '23.12.2000 10:33:02'} - - # get all existing notes - %all_notes = $db->get_all(); - # format of returnes hash like the one from get_search above - - # get the next noteid available - $next_num = $db->get_nextnum(); - - # recount all noteids starting by 1 (usefull after deleting one!) - $db->set_recountnums(); - - # modify a certain note - $db->set_edit(1, "any text", "23.12.2000 10:33:02"); - - # create a new note - $db->set_new(5, "any new text", "23.12.2000 10:33:02"); - - # delete a certain note - $db->set_del(5); - -=head1 DESCRIPTION - -You can use this module for accessing a note database. This is the dbm module. -It uses the DB_FILE module to store it's data and it uses DBM files for tis purpose. - -Currently, NOTEDB module is only used by note itself. But feel free to use it -within your own project! Perhaps someone want to implement a webinterface to -note... - -=head1 USAGE - -please see the section SYNOPSIS, it says it all. - -=head1 AUTHOR - -Thomas Linden . - - - -=cut diff --git a/note-1.0.7/NOTEDB/mysql.pm b/note-1.0.7/NOTEDB/mysql.pm deleted file mode 100644 index 9c47509..0000000 --- a/note-1.0.7/NOTEDB/mysql.pm +++ /dev/null @@ -1,349 +0,0 @@ -#!/usr/bin/perl -# $Id: mysql.pm,v 1.5 2000/06/25 19:50:43 scip Exp scip $ -# Perl module for note -# mysql database backend. see docu: perldoc NOTEDB::binary -# - -use DBI; -use strict; -use Data::Dumper; - -package NOTEDB; - -BEGIN { - # make sure, it works, although encryption - # not supported on this system! - eval { require Crypt::CBC; }; - if($@) { - $NOTEDB::crypt_supported = 0; - } - else { - $NOTEDB::crypt_supported = 1; - } -} - -# Globals: -my ($DB, $table, $fnum, $fnote, $fdate, $version, $cipher); -$table = "note"; -$fnum = "number"; -$fnote = "note"; -$fdate = "date"; -$version = "(NOTEDB::mysql, 1.4)"; - -# prepare some std statements... ##################################################################### -my $sql_getsingle = "SELECT $fnote,$fdate FROM $table WHERE $fnum = ?"; -my $sql_all = "SELECT $fnum,$fnote,$fdate FROM $table"; -my $sql_nextnum = "SELECT max($fnum) FROM $table"; -my $sql_incrnum = "SELECT $fnum FROM $table ORDER BY $fnum"; -my $sql_search = "SELECT DISTINCT $fnum,$fnote,$fdate FROM $table WHERE $fnote LIKE ?"; - -my $sql_setnum = "UPDATE $table SET $fnum = ? WHERE $fnum = ?"; -my $sql_edit = "UPDATE $table SET $fnote = ?, $fdate = ? WHERE $fnum = ?"; - -my $sql_insertnew = "INSERT INTO $table VALUES (?, ?, ?)"; - -my $sql_del = "DELETE FROM $table WHERE $fnum = ?"; -my $sql_del_all = "DELETE FROM $table"; -###################################################################################################### - -sub new -{ - # no prototype, because of the bin-version, which takes only a filename! - my($this, $dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd) = @_; - - my $class = ref($this) || $this; - my $self = {}; - bless($self,$class); - my $database = "DBI:$dbdriver:$dbname;host=$dbhost"; - - $DB = DBI->connect($database, $dbuser, $dbpasswd) || die DBI->errstr(); - - # LOCK the database! - my $lock = $DB->prepare("LOCK TABLES $table WRITE") || die $DB->errstr(); - $lock->execute() || die $DB->errstr(); - - return $self; -} - - -sub DESTROY -{ - # clean the desk! - my $unlock = $DB->prepare("UNLOCK TABLES") || die $DB->errstr; - $unlock->execute() || die $DB->errstr(); - $DB->disconnect || die $DB->errstr; -} - -sub version { - return $version; -} - -sub no_crypt { - $NOTEDB::crypt_supported = 0; -} - -sub use_crypt { - my($this, $key, $method) = @_; - if($NOTEDB::crypt_supported == 1) { - eval { - $cipher = new Crypt::CBC($key, $method); - }; - if($@) { - $NOTEDB::crypt_supported == 0; - } - } - else{ - print "warning: Crypt::CBC not supported by system!\n"; - } -} - -sub get_single -{ - my($this, $num) = @_; - my($note, $date); - my $statement = $DB->prepare($sql_getsingle) || die $DB->errstr(); - - $statement->execute($num) || die $DB->errstr(); - $statement->bind_columns(undef, \($note, $date)) || die $DB->errstr(); - - while($statement->fetch) { - return ude($note), ude($date); - } -} - - -sub get_all -{ - my($this, $num, $note, $date, %res); - my $statement = $DB->prepare($sql_all) || die $DB->errstr(); - - $statement->execute || die $DB->errstr(); - $statement->bind_columns(undef, \($num, $note, $date)) || die $DB->errstr(); - - while($statement->fetch) { - $res{$num}->{'note'} = ude($note); - $res{$num}->{'date'} = ude($date); - } - return %res; -} - - -sub get_nextnum -{ - my($this, $num); - my $statement = $DB->prepare($sql_nextnum) || die $DB->errstr(); - - $statement->execute || die $DB->errstr(); - $statement->bind_columns(undef, \($num)) || die $DB->errstr(); - - while($statement->fetch) { - return $num+1; - } -} - -sub get_search -{ - my($this, $searchstring) = @_; - my($num, $note, $date, %res); - if($NOTEDB::crypt_supported != 1) { - $searchstring = "\%$searchstring\%"; - my $statement = $DB->prepare($sql_search) || die $DB->errstr(); - $statement->execute($searchstring) || die $DB->errstr(); - $statement->bind_columns(undef, \($num, $note, $date)) - || die $DB->errstr(); - while($statement->fetch) { - $res{$num}->{'note'} = $note; - $res{$num}->{'date'} = $date; - } - } - else { - my %res = $this->get_all(); - foreach $num (sort { $a <=> $b } keys %res) { - $note = ude($res{$num}->{'note'}); - $date = ude($res{$num}->{'date'}); - if($note =~ /\Q$searchstring\E/i) - { - $res{$num}->{'note'} = $note; - $res{$num}->{'date'} = $date; - } - } - } - return %res; -} - - - - -sub set_edit -{ - my($this, $num, $note, $date) = @_; - - my $statement = $DB->prepare($sql_edit) || die $DB->errstr(); - - $note =~ s/'/\'/g; - $note =~ s/\\/\\\\/g; - $statement->execute(uen($note), uen($date), $num) || die $DB->errstr(); -} - - -sub set_new -{ - my($this, $num, $note, $date) = @_; - - my $statement = $DB->prepare($sql_insertnew) || die $DB->errstr(); - - $note =~ s/'/\'/g; - $note =~ s/\\/\\\\/g; - $statement->execute($num, uen($note), uen($date)) || die $DB->errstr(); -} - - -sub set_del -{ - my($this, $num) = @_; - my($note, $date, $T); - - ($note, $date) = $this->get_single($num); - - return "ERROR" if ($date !~ /^\d/); - - # delete record! - my $statement = $DB->prepare($sql_del) || die $DB->errstr(); - $statement->execute($num) || die $DB->errstr(); - return; -} - - -sub set_del_all -{ - my($this) = @_; - my $statement = $DB->prepare($sql_del_all) || die $DB->errstr(); - $statement->execute() || die $DB->errstr(); - return; -} - -sub set_recountnums -{ - my $this = shift; - my(@count, $i, $num, $setnum, $pos); - $setnum = 1; - $pos=0; $i=0; @count = (); - - my $statement = $DB->prepare($sql_incrnum) || die $DB->errstr(); - $statement->execute || die $DB->errstr(); - $statement->bind_columns(undef, \($num)) || die $DB->errstr(); - # store real id's in an array! - while($statement->fetch) { - $count[$i] = $num; - $i++; - } - - # now recount them! - my $sub_statement = $DB->prepare($sql_setnum) || die $DB->errstr(); - for($pos=0;$pos<$i;$pos++) { - $setnum = $pos +1; - $sub_statement->execute($setnum,$count[$pos]) || die $DB->errstr(); - } -} - -sub uen -{ - my($T); - if($NOTEDB::crypt_supported == 1) { - eval { - $T = pack("u", $cipher->encrypt($_[0])); - }; - } - else { - $T = $_[0]; - } - chomp $T; - return $T; -} - -sub ude -{ - my($T); - if($NOTEDB::crypt_supported == 1) { - eval { - $T = $cipher->decrypt(unpack("u",$_[0])) - }; - return $T; - } - else { - return $_[0]; - } -} - -1; # keep this! - -__END__ - -=head1 NAME - -NOTEDB::mysql - module lib for accessing a notedb from perl - -=head1 SYNOPSIS - - # include the module - use NOTEDB; - - # create a new NOTEDB object (the last 4 params are db table/field names) - $db = new NOTEDB("mysql","note","localhost","username","password","note","number","note","date"); - - # get a single note - ($note, $date) = $db->get_single(1); - - # search for a certain note - %matching_notes = $db->get_search("somewhat"); - # format of returned hash: - #$matching_notes{$numberofnote}->{'note' => 'something', 'date' => '23.12.2000 10:33:02'} - - # get all existing notes - %all_notes = $db->get_all(); - # format of returnes hash like the one from get_search above - - # get the next noteid available - $next_num = $db->get_nextnum(); - - # recount all noteids starting by 1 (usefull after deleting one!) - $db->set_recountnums(); - - # modify a certain note - $db->set_edit(1, "any text", "23.12.2000 10:33:02"); - - # create a new note - $db->set_new(5, "any new text", "23.12.2000 10:33:02"); - - # delete a certain note - $db->set_del(5); - - # turn on encryption. CryptMethod must be IDEA, DES or BLOWFISH - $db->use_crypt("passphrase", "CryptMethod"); - - # turn off encryption. This is the default. - $db->no_crypt(); - -=head1 DESCRIPTION - -You can use this module for accessing a note database. There are currently -two versions of this module, one version for a SQL database and one for a -binary file (note's own database-format). -However, both versions provides identical interfaces, which means, you do -not need to change your code, if you want to switch to another database format. - -Currently, NOTEDB module is only used by note itself. But feel free to use it -within your own project! Perhaps someone want to implement a webinterface to -note... - -=head1 USAGE - -please see the section SYNOPSIS, it says it all. - -=head1 AUTHOR - -Thomas Linden . - - - -=cut diff --git a/note-1.0.7/README b/note-1.0.7/README deleted file mode 100644 index 06a62fb..0000000 --- a/note-1.0.7/README +++ /dev/null @@ -1,517 +0,0 @@ -note 1.0.7 by Thomas Linden, 27/06/2000 -======================================= - -Introduction -============ - - This is a small console program written in - perl, which allows you to manage notes similar - to programs like "knotes" from commandline. - - There are currently three different database backends, - which you can use with note: - o NOTEDB::binary - this is the default backend - and uses a binary file to store your notes. - o NOTEDB::mysql - this backend uses a mysql - database to store your notes. You can switch - easily to another DBMS since this module uses - the Perl standard module "DBI" for database- - access. See below for more info on this topic! - o NOTEDB::dbm - this module uses two DBM files - for data storage and requires the module DB_FILE, - which is part of the perl standard distribution. - See below for more details about the DBM module. - - - -Where to get? -============= - - By now at - http://www.daemon.de/software.html - or - ftp://www.0c49.org/pub/scip/note/ - - You may also try your nearest tucows mirror. - - - - -Features -======== - - o Three different database backends, mysql(DBI), dbm, binary(bin file). - o Commandline interface using the standard perl module - Getopt::Long, which allows you to use short or long - command-line options. - o Interactive interface(pure ascii), the following functions - are available in interactive mode: list, display, topic, - delete, edit, help. - o Highly confiurable using a perlish configfile ~/.noterc. - although it is configurable it is not required, note can - run without a configfile using useful default presets. - o Colourized output is supported using ASCII Escape-Sequences. - o The user can customize the color for each item. - o Data can be stored in various different database backends, - since all database access is excluded from the program itself - in perl modules. - o Notes can be deleted, edited and you can search trough your notes. - o Notes can be categorized. Each category(topic) can contain multiple - notes and even more sup-topics. There is no limitation about - sub topics. - o You can view all notes in a list and it is possible only to view - notes under a certain topic. - o There is a tree-view, which allows you to get an overview of your - topic-hierarchy. - o Notes can be encrypted using DES or IDEA algorythms and Crypt::CBC. - o You can dump the contents of your note database into a plain text - file, which can later be imported. Imports can be appended or it can - overwrite an existing database (-o). - o Note has scripting capabilities, you can create a new note by piping - another commands output to note, you can also import a notedump from - stdin as well es duming to stdout instead a file. Additional, there - is an option --raw available, which prints everything out completely - without formatting. - o It can be installed without root-privileges. - o Last, a while ago a user stated: "... it simply does, what it says ..." - - - - - -Requirements -============ - - You need the following things: - o perl installed (5.004x) - o The module IO::Seekable and Fcntl, which should be - already installed with your perl distributuion if - you want to use the binary database backend. - o DBI module and DBI::mysql if you want to use the - mysql database backend. - o The module DB_FILE if you want to use the DBM module. - o Getopt::Long (part of perl std ditribution) - - - -Installation -============ - - Unpack the tar-ball and issue the command: - $ perl Makefile.PL - It will ask you a few questions about file destinations. - The script will find itself the proper destinations for - the files. So, if you agree with it, simply press ENTER. - However, you may decide to use other destinations. In this - case, enter it, when asked. This maybe usefull, if you are - installing it in your ome-directory and if you are not root! - - For installation instructions for the mysql database installation - see mysql/README. - - If want to use another SQL database, i.e. postgresql then set - the option "DbDriver" to the name of the responding DBI-driver - and create a symlink of this name like this: - /usr/lib/perl5/siteperl/NOTEDB $ ln -s mysql.pm oracle.pm - The functionality is the same, but not the name! - - The default binary file backend does not need any special installation - procedure, you need only to spceify a filename in your config file. - - The DBM backend(NOTEDB::dbm) requires the existence of a directory, - which you must specify in your config using the option "DbName". - - - -Configuration -============= - - This version of note doesn't neccessarily need - a configuration file. But you can have one and change - some default values. Take a look to the file config/noterc - provided with this tarball. There are detailed instructions - about every available parameter. - Simply copy this file into your home-directory and name it - .noterc - If you decide not to use the default database backend (a binary - file), you will *need* a configuration! - - - -Usage -===== - - If you don't know, how to run note, try "note -h" first. - It will tell you all available commandline options. - - To create a new note, simply run "note". You can enter - the note (the length is by default limited to 4096 bytes, - which you can change from your config file if you are using - the binary backend, therwise there is no limitation). - End by typing a . on a line itself. note will tell you the - number of the note. - - If you want to view the note, type "note 1", if the notenumber - was 1. - - If you want to get an overview of all notes, type "note -l". - You will get a list of all notes, containing the number, - the first line and the creation date. If topic-support is - turned on (which is by default), then all subtopics under the - current topic will be displayed first. - If you want to get a listing of all - If you want to see the timestamps, use "-L" instead of "-l". - Read more about topics below in the section "Topics". - You can also specify the topic which notes you want to see: - "-l mytopic" does the trick. - Additional, you might want to get an overview of your topic- - strcture. You can use the command "-t" in this case, which - will display a tree-view of your tpic-structure. You can - use the command "-T" if you want to see the notes under each - topic too. "-T" will also show the number of each note. - - To edit a certain note, type "note -e 1". It will invoke your - editor (vi or pico). You can edit it, after saving, note - will store the changed note to the database. - - Of course you can drop a certain note: "note -d 1" deletes - note number 1. If a note in the middle or the beginning of - the database will be deleted, note will recount the other - existent notes. For example there are 3 notes, number 1, 2 - and 3. If you delete number 2, then number 3 will become - number 2. - You can also make use of the extended delete-syntax: - To delete note 1 and 2, use "-d 1,2" - To delete note 1,2 and 3, use "-d 1-3". - - If you cannot remember, which note you are looking for, you - can use the search capability of note: "note -s ". - note will search the whole note database case insensitive for - an occurence of this string and tell you the number and first- - line it have. - - Instead of using note from the commandline you can use the - interactive mode. Run note with "note -i". If you need assistance - type "?" or "h" at the ">" prompt. The interactive mode - provides you the most functions of note. - - You can also dump the contents of your note-database into a - ASCII-textfile(-D). You can use this file later to import it into - your note-database(-I). This is usefull, if you want quickly trans- - fer your notes from one host to another (i.e. you could mail - your note-dump form your office to home and import it there - for further use). - The dumps from the two versions of note are in the same format. - Using dumps it is also possible to reinitialize your database. You - can use the "-o" switch whcih causes note to overwrite your existing - database. This is very handy if you changed heavily your config. And - it is required, if you changed: encryption, db-driver, (binary-format) - and the password. You can use the following command for reinitializing: - $ note -D - | note -o -I - - What the hell, does it?! Step by step: - o "note -D -" creates a note-database dump and prints it out - to stantdard output. - o "|" this is the shell's pipe command. It takes the output - of the left program and gives it to the right program as standard - input. - o "note -o -I -" imports a note-database dump from standard input - and overwrites an existing database. - Before you use the "-o" switch, I consider yuo to make a backup! - - - - -Topics -====== - - If topic-support is turned on (which is by default), the various - notes are sorted under various topics. There is no special database - field for the topic. Instead the topic will be stored right in the - note. - If the first line of your note contains some text bordered by slashes - (or whatever you prefer, set "TopicSeparator" in your config! default is slash), - then note will consider it as the topic of this certain note. For examle: - /TodoList/ - If you are using topics, no data after the topic is allowed, if there - is any text, note will consider it as a subtopic! Therefore, don't for- - get to put a newline after the topic-line. - - If you are in interactive mode, you can "cd" to a different note simply - by typing it's name at the command-prompt, or you can use the well-known - syntax "cd topic". - The list-command will only show you notes under this topic. If you create - a new note, it will automagically inserted under the current topic (note - will prepend the string "/topicname/" to the text of your note). - - You can create at any time from any point a new topic. Just create a new - note and type the name of the new topic bordered by slashes (or TopicSeparator) - at the first line of this note. After saving, there will be available a - new topic with one note in it. - - You can create as many subtopics as you like, the format is similar to a - filesystem-path. An example, say, you want to create such a structure: - - (root - top level) - | - |----test - | |----subtopic - | | |--note 1 - | | |--note 2 - | | - | |--note 4 - | - |--note 3 - - Then you may create those 4 new notes: - --- snip --- - /test/subtopic/ - note 1 - --- snip --- - /test/subtopic/ - note 2 - --- snip --- - note 3 - --- snip --- - /test/ - note 4 - --- snip --- - - I hope, you got the point ;-) - - - - If a note does not contain the "magic" /topic/ construction on the first - line, it will be listed under the "root" of note, that is the point you are - at the startup of note. - - You can subsequently move a note without a topic to a certain topic. Simply - edit it and insert at the first line the above mentioned construction. - - Note: Please don't forget the prepending and appending a slash of a topic. - You will get strange results without it! - - - - -Formatting of notes -=================== - - Another very nice feature is the possibility to format the note-text (as much as - shell allows it). First, you can use the note-internal "magic-strings" for color- - izing. Those strings looks much like HTML: - "here is a green line of text no more green." - As you see, the beginning of another color starts with a tag(kinda) of the color - and ens with an end tag . - - The following colors are available: - black, red, green, yellow, blue, magenta, cyan and white. - - Beside colorizing text, you can also create bold or underlined text! If you decide - to use this (additional) feature, you need to set the Config-Option "FormatNotes" - to 1 which turns it on. - Usage is very straightforward, if a word (a word is defined as some text with at least - one space surrounded) is between a magic mark-character. Here are the available - things, you can do: - - bold: **word** - underlined: __word__ - inverse: {{word}} - - The text will be formatted using the actually note-color. - - - - -Scripting -========= - - Since version 1.0.3 there are some additions which allows you to use note in - scripts, without user-interaction. You might run a special script as cronjob, - which adds a note under a certain topic every week. Or the like. - - Here are the possibilies you have: - - You can add a new note through a pipe, another commands output becomes - note's input: - $ cat /var/spool/news/daily | note - - This command adds the content of a file "daily" as a new note. Note the dash. - it stands for "Standard Input". Note will be completely silent and it will not - ask for something. - - Suppose you are using encryption. You might wonder, how note will get your - passphrase? The solution: You need to set up an environment variable which - contains the password: - $ export NOTE_PASSWD=secret - If the variable is present, note will not ask you for a passphrase! - - Another thingy you might find useful is the -r (--raw) command-line flag. This - turns note into raw mode , which means it will only print the - data without any formatting. Raw mode is available for list and display, - since it makes no sense, interactive mode doe not support raw mode. - - - - - -Format of the notedb (binary backend) -===================================== - - The database where the notes are stored is a binary fixed record length file - of the following format: - It consists of three fixed length fields per entry. The fields - have the following types: - o Number: Integer (1 byte) - o Note: String (default 1024 bytes) - o Time: String (default 64 bytes) - You can change the sizes of the fields "Note" and "Time" in - the configfile "~/.noterc". If it does not exist, the above - defaults will be used. - If the data to be stored is smaller then the size of the field, - it will be filled with ZERO's ("\0"). The Note and the Time - fields will be uuencoded before storage. Of course, this is - no security, never mind... - - - -The note-database (mysql backend) -================================= - - The sql-database for the mysql version has the following design: - +--------+---------+------+-----+---------+----------------+ - | Field | Type | Null | Key | Default | Extra | - +--------+---------+------+-----+---------+----------------+ - | number | int(10) | | PRI | 0 | auto_increment | - | note | text | YES | | NULL | | - | date | text | YES | | NULL | | - +--------+---------+------+-----+---------+----------------+ - - - -Format of the ASCII-dump file (note -D) -======================================= - - The dump of a note-database (if you use note -D) has the following - format: - - --- snip --- - Number: 1 - Timestamp: 14.01.2000 00:25:01 - This is a sample text - in a sample note. - - Number: 2 - Timestamp: 14.01.2000 02:37:40 - And this is another sample - of a note. - --- snip --- - - You can reimport a dump into your note-database with "note -I " - Existing notes will not overwritten, note will append the imported - data to your note-database. - - - - -Security -======== - - If you are using the MySQL driver, refer to the mysql - manual for more informations about security of mysql databases: - http://www.mysql.org/Manual_chapter/manual_Privilege_system.html - - If you are using notes proprietary binary driver, then - the permission 0600 of the file "~/.notedb" is strongly required! - - Additional, you can turn on encryption from the config file. - Simply set UseEncryption to 1. Please note, that you need - to decide, if you want to use encryption before the first use - of note! If have already a note database and want to "migrate" - to encryption, I suggest you to follow the directions in the - file UPGRADE! - - You can choose from different encryption algorythms. The default - is IDEA, but DES or BLOWFISH is also possible. You need to have - installed the following additional perl-modules on your system: - MD5 - Crypt::IDEA - Crypt::DES - Crypt::CBC - - After turning on encryption, note will ask you for a passphrase - everytime it runs! It will *not* store this passphrase! - So, don't forget it! Be careful! - - Once note have encrypted some data using this passphrase, you - cannot simply switch to another passphrase, because all data - within the database needs to be encrypted using the same passphrase! - If you want to change the passphrase for any reason, please read - the file UPGRADE and follow it's directions! - Someday I will add a "change passwd" function, which will do all - these things for you. Someday, I said... - For now you can use the "re-initialze database" functionality, mentioned - earlier in the "Usage" section (at the end of the section). - - Note: To make sure, the encrypted data can be stored properly, - it will be uuencoded after encryption. - - Note: *If* you forgot your passphrase and *if* you don't have - a backup of your database without encryption, PLEASE - don't bother me with "helpme" emails! If you don't know - the phrase, then the data can't be decrypted. Even if it - is possible - I am not responsible for that! - - Note: How does note know, if the passphrase was incorrect? It uses the - specified phrase and encodes at least one note (the first one) - and checks if the decrypted timestamp field matches the following - expression: "^\d+\.\d+". Translated from perl to human: - the timestamp must begin with minimum one digit (possibly more), - followed by one dot, followed by minimum one digit (possibly more). - Chances are bad, that a wrong passphrase will cause a timestamp - matching the rule above. If you have other experiences, please - drop me a mail! - - -Comments -======== - - You can send any comments to Thomas Linden . - If you find a bug or if you have a suggestion for improvement of the script - feel free to send me a patch ;-) - - - -License -======= - - This script comes with absolutely NO WARRANTY. It is distributed under the - terms of the GNU General Public License. Use it at your own risk :-) - You can read the complete GPL at: http://www.gnu.org/copyleft/gpl.html - - - -Author and Copyright -==================== - - The author is Thomas Linden. - note is Copyright of Thomas Linden. - - - - -Contributors / Credits -====================== - - Shouts to those guys who helped me to enhance note: THANKS A LOT! - - Jens Heunemann - sub tree. - Peter Palmreuther - various additions. - - And many other people who sended bug reports, feature requests. If you feel that - I forgot your name in this list, then please send me an email and I'll add you. - - - -Last changed -============ - - 27/06/2000 diff --git a/note-1.0.7/UPGRADE b/note-1.0.7/UPGRADE deleted file mode 100644 index 32611ee..0000000 --- a/note-1.0.7/UPGRADE +++ /dev/null @@ -1,73 +0,0 @@ -1.0.5 important note upgrade information -======================================== - -If you are upgrading from previous versions of note, you -will need to create a new config file, since the format of -that file has completely changed! - -Take a look at the sample in config/noterc for details. - -note will NOT work with an existing database and an old config. -You have to create a new config based on your old settings. - - -Please don't forget to make a backup of your database before -upgrading! I am not responsible for data loss! - -I told ya... - - - - - -Thomas Linden -READ THIS FILE, IF YOU ARE UPGRADING FROM 0.9 TO 1.0.x -====================================================== - - -In any case: BACKUP your existing note database!!!!!!! -The format has not changed, but some default values -(see the new config file-sample). Use this command -to save your note database with your *old* version -of note: - "note -D" -This works with both the mysql and the binary version. - -You need to reedit your configfile. Please refer to the -sample config in config/noterc. - -====================================================== - -This version of note has now encryption support build in. -If you decide to use it, you need to re-initialize your -note database. That's why, because your current database -is unencrypted and *if* you want to secure your data, you -need to secure everything. That means, your existing data -must be encrypted before you can use this new capability! - -Follow this steps: - o backup existing db: - $ note -D - o backup the db: - $ cp .notedb .notedb.save - or (for mysql users!): - $ cp -r /usr/local/mysql/data/notedb ~/notedb.mysql.save - o go into note and delete all existing notes: - $ note -d 1-20 (or however) - o now upgrade your note installation: - $ perl Makefile.PL; make install - o re-configure note. Turn $USE_CRYPT on by setting it - to "YES". - o re-initialize your database: - $ note -I note.dump.2323 (or whatever) - note will prompt you for a passphrase. It will be used - by Crypt::CBC for encrypting your data. -From now on, your data is encrypted. You will need the passphrase -you set above for decrypting it! So - don't forget it! - -====================================================== - -AGAIN: YOU HAVE BEEN WARNED! DO NOT UPGRADE WITHOUT MADE A - BACKUP OF YOUR DATABASE! I AM NOT RESPONSIBLE IF YOU - LOOSE DATA! - diff --git a/note-1.0.7/VERSION b/note-1.0.7/VERSION deleted file mode 100644 index af0b7dd..0000000 --- a/note-1.0.7/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.0.6 diff --git a/note-1.0.7/bin/note b/note-1.0.7/bin/note deleted file mode 100755 index 1c2e56a..0000000 --- a/note-1.0.7/bin/note +++ /dev/null @@ -1,1662 +0,0 @@ -#!/usr/bin/perl -# $Id: note,v 1.29 2000/06/25 20:13:23 scip Exp scip $ -# -# -# note - console notes management with database and encryption support. -# Copyright (C) 1999-2000 Thomas Linden (see README for details!) -# -# This program 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 2 -# of the License, or (at your option) any later version. -# -# This program 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 this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# - Thomas Linden -# -# latest version on: -# http://www.daemon.de/software.html -# ftp://www.0x49.org/pub/scip/note/ -# - -use strict; -#use Data::Dumper; -use Getopt::Long; - -# -# prototypes -# -sub usage; # print usage message for us thumb userz :-) -sub find_editor; # returns an external editor for use -sub output; # used by &list and &display -sub C; # print colourized -sub num_bereich; # returns array from "1-4" (1,2,3,4) -sub getdate; # return pretty formatted day -sub new; # crate new note -sub edit; # edit a note -sub del; # delete a note -sub display; # display one or more notes -sub list; # note-listing -sub help; # interactive help screen -sub import; # import from notedb-dump -sub display_tree; # show nice tree-view -sub tree; # build the tree -sub print_tree; # print the tree, contributed by Jens Heunemann . THX! - - -# -# globals -# -my ( - # - # commandline options - # - $opt_, $opt_i, $opt_r, $opt_e, $opt_d, - $opt_s, $opt_t, $opt_T, $opt_l, $opt_L, $opt_c, - $opt_D, $opt_I, $opt_o, $opt_h, $opt_n, $opt_v, - - # - # set from commandline (or interactive) - # - $number, $searchstring, $dump_file, $ImportType, $NewType, $Raw, - - # - # options from config file .noterc - # - $maxlen, $timelen, $TOPIC, $NOTEDB, $MAX_TIME, $PreferredEditor, - $ALWAYS_INT, $KEEP_TIMESTAMP, $COLOR, $ALWAYS_EDIT, $HOME, $FormatText, - $BORDER_COLOR, $NOTE_COLOR, $NUM_COLOR, $TOPIC_COLOR, $MAX_NOTE, - $USE_CRYPT, $CRYPT_METHOD, $TopicSep, $DEFAULT_LIST, $TIME_COLOR, - - # - # db specifics from .noterc - # - $db, $dbname, $dbhost, $dbuser, $dbpasswd, - $table, $fnum, $fnote, $fdate, $date, $dbdriver, $libpath, - - # - # processed colors - # - $BORDERC, $_BORDERC, $NOTEC, $NUMC, $_NUMC, $_NOTEC, $TIMEC, - $_TIMEC, $TOPICC, $_TOPICC, - - # - # config presets - # - $DEFAULTDBNAME, $USER, $PATH, $CONF, - - # - # internals - # - $TYPE, $mode, $NoteKey, - $version, $number, $CurTopic, $CurDepth, $WantTopic, - $sizeof, %TP, $TreeType, $ListType, $SetTitle, - @ArgTopics, $key, $typedef, @NumBlock, $has_nothing, - ); - - -# -# DEFAULTS, allows one to use note without a config -# don't change them, instead use the config file! -# -$maxlen = 30; -$timelen = 22; -$date = &getdate; -$USER = getlogin || getpwuid($<); -chomp $USER; -$HOME = $ENV{'HOME'}; -$CONF = $HOME . "/.noterc"; -$dbdriver = "binary"; -$libpath = "/usr/local/lib"; -$NOTEDB = $HOME . "/.notedb"; -$MAX_NOTE = 4096; -$MAX_TIME = 64; -$COLOR = "YES"; -$BORDER_COLOR = "BLACK"; -$NUM_COLOR = "blue"; -$NOTE_COLOR = "green"; -$TIME_COLOR = "black"; -$TOPIC_COLOR = "BLACK"; -$TOPIC = 1; -$TopicSep = '/'; -$version = "1.0.7"; -if($TOPIC) -{ - $CurDepth = 1; # the current depth inside the topic "directory" structure... -} -$USE_CRYPT = "NO"; - - - - -# -# process command line args -# -if($ARGV[0] eq "") -{ - $mode = "new"; -} -elsif($#ARGV == 0 && $ARGV[0] eq "-") { - $mode = "new"; - $NewType = 1; # read from STDIN until EOF - shift; - undef $has_nothing; -} -else -{ - Getopt::Long::Configure( qw(no_ignore_case)); - GetOptions ( - "interactive|i!" => \$opt_i, # no arg - "config|c=s" => \$opt_c, # string, required - "raw|r!" => \$opt_r, # no arg - "edit|e=i" => \$opt_e, # integer, required - "delete|d=s" => \$opt_d, # integer, required - "search|s=s" => \$opt_s, # string, required - "tree|topic|t!" => \$opt_t, # no arg - "longtopic|T!" => \$opt_T, # no arg - "list|l:s" => \$opt_l, # string, optional - "longlist|L:s" => \$opt_L, # string, optional - "dump||Dump|D:s" => \$opt_D, # string, optional - "import|Import|I:s" => \$opt_I, # string, optional - "overwrite|o!" => \$opt_o, # no arg - "help|h|?!" => \$opt_h, # no arg - "version|v!" => \$opt_v # no arg - ); - $opt_n = shift; # after that @ARGV contains eventually - # a note-number - # $opt_ is a single dash, in case of existence! - # - # determine mode - # - if($opt_i) { - $mode = "interactive"; - } - elsif(defined $opt_l || defined $opt_L) { - $mode = "list"; - if(defined $opt_l) { - @ArgTopics = split /$TopicSep/, $opt_l; - } - else { - $ListType = "LONG"; - @ArgTopics = split /$TopicSep/, $opt_L; - } - $CurDepth += $#ArgTopics + 1 if($opt_l || $opt_L); - $CurTopic = $ArgTopics[$#ArgTopics]; # use the last element everytime... - } - elsif($opt_t || $opt_T) { - $mode = "tree"; - $TreeType = "LONG" if($opt_T); - } - elsif(defined $opt_s) { - $mode = "search"; - $searchstring = $opt_s; - } - elsif($opt_e) { - $mode = "edit"; - $number = $opt_e; - } - elsif($opt_d) { - $mode = "delete"; - $number = $opt_d; - } - elsif(defined $opt_D) { - $mode = "dump"; - if(!$opt_) { - if($opt_D ne "") { - $dump_file = $opt_D; - } - else { - $dump_file = "note.dump.$$"; - print "no dumpfile specified, using $dump_file.\n"; - } - } - else { - $dump_file = "-"; # use STDIN - } - } - elsif(defined $opt_I) { - $mode = "import"; - if(!$opt_) { - if($opt_I ne "") { - $dump_file = $opt_I; - } - else { - print "Import-error! No dump_file specified!\n"; - exit(1); - } - } - else { - $dump_file = "-"; - } - } - elsif($opt_v) { - print "This is note $version by Thomas Linden .\n"; - exit(0); - } - elsif($opt_h) { - &usage; - } - else { - if($opt_c && $mode eq "" && !$opt_n) { - $mode = "new"; - } - elsif($opt_c && $mode eq "") { - $mode = ""; # huh?! - } - else { - $has_nothing = 1; - } - } - ### determine generic options - if($opt_n =~ /^[\d+\-?\,*]+$/) { - # first arg is a digit! - if($mode eq "") { - $number = $opt_n; - $mode = "display"; - undef $has_nothing; - } - else { - print "mode <$mode> does not take a numerical argument!\n"; - exit(1); - } - } - elsif($opt_n ne "") { - print "Unknown option: $opt_n\n"; - &usage; - } - if($opt_r) { - $Raw = 1; - } - if($opt_o) { - $ImportType = "overwrite"; - if(!$opt_I) { - print "--overwrite is only suitable for use with --import!\n"; - exit(1); - } - } - ##### -} -if($has_nothing && $mode eq "") -{ - &usage; -} - - -# read the configfile. -$CONF = $opt_c if($opt_c); # if given by commandline, use this. -if(-e $CONF) -{ - &getconfig($CONF); -} -elsif($opt_c) { - # only wrong, if specified by commandline! else use default values! - print STDERR "Could not open \"$CONF\": file does not exist or permission denied!\n"; - exit(1); -} - - -# Always interactive? -if($ALWAYS_INT eq "YES" && $mode ne "dump" && $mode ne "import") -{ - $mode = "interactive"; -} - -# OK ... Long-Listing shall be default ... You wanted it!!! -if($DEFAULT_LIST eq "LONG") -{ - # takes only precedence in commandline mode - $ListType="LONG"; -} - - - -# *if* loading of the config was successful, try to load the -# configured database backend. Currently supported: mysql and binary. -push @INC, $libpath; -#if($dbdriver eq "mysql") { -# eval { -# require NOTEDB::mysql; -# $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); -# } -#} -if($dbdriver eq "binary") { - eval { - require NOTEDB::binary; - $db = new NOTEDB($dbdriver, $NOTEDB, $MAX_NOTE, $MAX_TIME, $dbdriver); - } -} -else { - eval { - require "NOTEDB/$dbdriver.pm"; - $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); - }; -} -if($@) { - print "Unsupported database backend: NOTEDB::$dbdriver!\n"; - print "The following error has occured:\n------------------------\n" . $@ . "\n------------------------\n"; - exit 1; -} - -# add the backend version to the note version: -$version .= " " . $db->version(); - -# calculate some constants... -$BORDERC = "<$BORDER_COLOR>"; -$_BORDERC = ""; -$NUMC = "<$NUM_COLOR>"; -$_NUMC = ""; -$NOTEC = "<$NOTE_COLOR>"; -$_NOTEC = ""; -$TIMEC = "<$TIME_COLOR>"; -$_TIMEC = ""; -$TOPICC = "<$TOPIC_COLOR>"; -$_TOPICC = ""; - -$NoteKey = $TopicSep . "notes" . $TopicSep; - - -if($ListType ne "LONG" && $mode ne "interactive") -{ - #$maxlen += $timelen; # no time will be displayed! -} - - -# check if the user wants to use encryption: -if($USE_CRYPT eq "YES" && $NOTEDB::crypt_supported == 1) { - if($CRYPT_METHOD eq "") { - $CRYPT_METHOD = "Crypt::IDEA"; - } - if(!exists $ENV{'NOTE_PASSWD'}) { - print "password: "; - eval { - local($|) = 1; - local(*TTY); - open(TTY,"/dev/tty"); - system ("stty -echo ); - print STDERR "\r\n"; - system ("stty echo ; - } - } - else { - $key = $ENV{'NOTE_PASSWD'}; - } - chomp $key; - $db->use_crypt($key,$CRYPT_METHOD); - undef $key; - # verify correctness of passwd - my ($cnote, $cdate) = $db->get_single(1); - if($cdate ne "") { - if($cdate !~ /^\d+\.\d+?/) { - print "access denied.\n"; # decrypted $date is not a number! - exit(1); - } - } #else empty! -} -else { - $db->no_crypt; - # does: NOTEDB::crypt_supported = 0; - my ($cnote, $cdate) = $db->get_single(1); - if($cdate ne "") { - if($cdate !~ /^\d+\.\d+?/) { - print "$NOTEDB seems to be encrypted!\n"; - exit(1); - } - } -} - -# main loop: ############### -if($mode eq "display") -{ - &display; -} -elsif($mode eq "search") -{ - &search; -} -elsif($mode eq "list") -{ - &list; -} -elsif($mode eq "tree") -{ - &display_tree; -} -elsif($mode eq "new") -{ - &new; -} -elsif($mode eq "delete") -{ - del; -} -elsif($mode eq "edit") -{ - &edit; -} -elsif($mode eq "dump") -{ - &dump; -} -elsif($mode eq "import") -{ - &import; -} -elsif($mode eq "interactive") -{ - &interactive; -} -else -{ - #undefined :-( -} - - -exit(0); -################## EOP ################ - - - -############################### DISPLAY ################################## -sub display -{ - my($N,$match,$note,$date,$num); - # display a certain note - print "\n"; - &num_bereich; # get @NumBlock from $numer - foreach $N (@NumBlock) - { - ($note, $date) = $db->get_single($N); - if($note) - { - if($Raw) { - print "$N\n$date\n$note\n\n"; - } - else { - output($N, $note, $date, "SINGLE"); - print "\n"; - } - $match = 1; - } - } - if(!$match) - { - print "no note with that number found!\n"; - } -} -############################### SEARCH ################################## -sub search -{ - my($n,$match,$note,$date,$num,%res); - if($searchstring eq "") - { - print "No searchstring specified!\n"; - } - else { - print "searching the database $dbname for \"$searchstring\"...\n\n"; - - %res = $db->get_search($searchstring); - - foreach $num (sort { $a <=> $b } keys %res) - { - output($num, $res{$num}->{'note'}, $res{$num}->{'date'}); - $match = 1; - } - if(!$match) - { - print "no matching note found!\n"; - } - print "\n"; - } -} - - -############################### LIST ################################## -sub list -{ - my(@topic,@RealTopic, $i,$t,$n,$num,@CurItem,$top,$in,%res); - if($mode ne "interactive" && !$Raw) - { - print "\nList of all existing notes:\n\n"; - } - else { - print "\n"; - } - - # list all available notes (number and firstline) - %res = $db->get_all(); - - if($TOPIC) - { - undef %TP; - } - - foreach $num (sort { $a <=> $b } keys %res) - { - $n = $res{$num}->{'note'}; - $t = $res{$num}->{'date'}; - if($TOPIC) - { - # this allows us to have multiple topics (subtopics!) - my ($firstline,$dummy) = split /\n/, $n, 2; - if($firstline =~ /^($TopicSep)/) - { - @topic = split(/$TopicSep/,$firstline); - } - else - { - @topic = (); - } - # looks like: "\topic\" - # collect a list of topics under the current topic - if($topic[$CurDepth-1] eq $CurTopic && $topic[$CurDepth] ne "") - { - if(exists $TP{$topic[$CurDepth]}) - { - $TP{$topic[$CurDepth]}++; - } - else - { - # only if the next item *is* a topic! - $TP{$topic[$CurDepth]} = 1 if(($CurDepth) <= $#topic); - } - } - elsif($topic[$CurDepth-1] eq $CurTopic || ($topic[$CurDepth] eq "" && $CurDepth ==1)) - { - # cut the topic off the note-text - if($n =~ /^($TopicSep)/) - { - $CurItem[$i]->{'note'} = $dummy; - } - else - { - $CurItem[$i]->{'note'} = $n; - } - # save for later output() call - $CurItem[$i]->{'num'} = $num; - $CurItem[$i]->{'time'} = $t; - $i++; - # use this note for building the $PATH! - if($RealTopic[0] eq "") - { - @RealTopic = @topic; - } - } - } - else - { - output($num, $n, $t); - } - } - if($TOPIC) - { - if($CurTopic ne "") - { - undef $PATH; - foreach (@RealTopic) - { - $PATH .= $_ . $TopicSep; - last if($_ eq $CurTopic); - } - } - else - { - $PATH = $TopicSep; - } - - # we are at top level, print a list of topics... - foreach $top (sort(keys %TP)) - { - output("-", " => ". $top . "$TopicSep ($TP{$top} notes)", - " Sub Topic "); - } - #print Dumper(@CurItem); - for($in=0;$in<$i;$in++) - { - output( $CurItem[$in]->{'num'}, - $CurItem[$in]->{'note'}, - $CurItem[$in]->{'time'} ); - } - } - - print "\n"; -} - -############################### NEW ################################## -sub new -{ - my($TEMP,$editor, $date, $note, $WARN, $c, $line, $num, @topic); - $date = &getdate; - if($ALWAYS_EDIT eq "YES") - { - $TEMP = "/tmp/note.$$"; - # let the user edit it... - $editor = &find_editor; - if($editor) - { - system $editor, $TEMP; - } - else - { - print "Could not find an editor to use!\n"; - exit(0); - } - # read it in ($note) - $note = ""; - open E, "<$TEMP" or $WARN = 1; - if($WARN) - { - print "...edit process interupted! No note has been saved.\n"; - undef $WARN; - return; - } - $c = 0; - while() - { - $note = $note . $_; - } - chomp $note; - close E; - # privacy! - unlink $TEMP; - } - else - { - $note = ""; - $line = ""; - # create a new note - if($NewType) - { - # be silent! read from STDIN until EOF. - while () { $note .= $_; } - } - else - { - print "enter the text of the note, end with .\n"; - do - { - $line = ; - $note = $note . $line; - } until $line eq ".\n"; - # remove the . ! - chop $note; - chop $note; - } - } - - # since we have not number, look for the next available: - $number = $db->get_nextnum(); - if($TOPIC && $CurTopic ne "") - { - @topic = split(/$TopicSep/,$note); - if($topic[1] eq "") - { - $note = $PATH . "\n$note"; - } - } - - - $db->set_new($number,$note,$date); - - # everything ok until here! - print "note stored. it has been assigned the number $number.\n\n"; -} - - -############################### DELETE ################################## -sub del -{ - my($i,@count, $setnum, $pos, $ERR); - # delete a note - &num_bereich; # get @NumBlock from $number - foreach $_ (@NumBlock) - { - $ERR = $db->set_del($_); - if($ERR) - { - print "no note with number $_ found!\n"; - } - else - { - print "note number $_ has been deleted.\n"; - } - } - # recount the notenumbers: - $db->set_recountnums(); - - @NumBlock = (); -} - -############################### EDIT ################################## -sub edit -{ - my($keeptime, $date, $editor, $TEMP, $note, $t, $num, $match); - # edit a note - $date = &getdate; - ($note, $keeptime) = $db->get_single($number); - if($keeptime eq "") - { - print "no note with that number found!\n\n"; - exit(0) if($mode ne "interactive"); - } - $TEMP = "/tmp/note.$USER.$$"; - open NOTE,">$TEMP" or die "Could not open $TEMP\n"; - select NOTE; - - print $note; - close NOTE; - select STDOUT; - $editor = &find_editor; - if($editor) - { - system $editor, $TEMP; - } - else - { - print "Could not find an editor to use!\n"; - exit(0); - } - $note = ""; - open NOTE,"<$TEMP" or die "Could not open $TEMP\n"; - - while() - { - $note = $note . $_; - } - chomp $note; - close NOTE; - - unlink $TEMP; - - if($KEEP_TIMESTAMP eq "YES") - { - $t = $keeptime; - } - else - { - $t = $date; - } - - # we got it, now save to db - $db->set_edit($number, $note, $t); - - print "note number $number has been changed.\n"; -} - - -sub dump -{ - my(%res, $num, $DUMP); - # $dump_file - if($dump_file eq "-") { - $DUMP = *STDOUT; - } - else { - open (DUMPFILE, ">$dump_file") or die "could not open $dump_file\n"; - $DUMP = *DUMPFILE; - } - select $DUMP; - %res = $db->get_all(); - foreach $num (sort { $a <=> $b } keys %res) - { - print STDOUT "dumping note number $num to $dump_file\n" if($dump_file ne "-"); - print "Number: $num\n" - ."Timestamp: $res{$num}->{'date'}\n" - ."$res{$num}->{'note'}\n"; - } - print "\n"; - close(DUMP); - select STDOUT; -} - -sub import -{ - my($num, $start, $complete, $dummi, $note, $date, $time, $number, $stdin, $DUMP); - # open $dump_file and import it into the notedb - $stdin = 1 if($dump_file eq "-"); - if($stdin) { - $DUMP = *STDIN; - } - else { - open (DUMPFILE, "<$dump_file") or die "could not open $dump_file\n"; - $DUMP = *DUMPFILE; - } - $db->set_del_all() if($ImportType ne ""); - $complete=0; - $start = 0; - while(<$DUMP>) - { - chomp $_; - if($_ =~ /^Number:\s\d+/) - { - if($start == 0) - { - # we have no previous record - ($dummi,$number) = split(/\s/,$_); - $start = 1; - } - else - { - # we got a complete record, save it! - $number = $db->get_nextnum(); - $db->set_new($number,$note, $date); - print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); - $complete = 0; - $note = ""; - $date = ""; - ($dummi,$number) = split(/\s/,$_); - } - } - elsif($_ =~ /^Timestamp:\s\d+/ && $complete == 0) - { - ($dummi,$date,$time) = split(/\s/,$_); - $date = "$date $time"; - $complete = 1; - } - else - { - $note .= $_ . "\n"; - } - } - if($note ne "" && $date ne "") - { - # the last record, if existent - $number = $db->get_nextnum(); - $db->set_new($number,$note, $date); - print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); - } -} - - - -sub interactive -{ - my($B, $BB, $menu, $char, @LastTopic, $Channel); - $Channel = $|; - # create menu: - $B = ""; - $BB = ""; - $menu = "[" . $B . "L" . $BB . "-List "; - if($TOPIC) { - $menu .= $B . "T" . $BB . "-Topics "; - } - $menu .= $B . "N" . $BB . "-New " - . $B . "D" . $BB . "-Delete " - . $B . "S" . $BB . "-Search " - . $B . "E" . $BB . "-Edit " - . $B . "?" . $BB . "-Help " - . $B . "Q" . $BB . "-Quit] "; # $CurTopic will be empty if $TOPIC is off! - # per default let's list all the stuff: - # Initially do a list command! - $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; - &list; - - for(;;) - { - $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; - undef $SetTitle; - if($CurDepth > 2) - { - print C $menu . $TOPICC . "../" . $CurTopic . $_TOPICC . ">"; - } - else - { - print C $menu . $TOPICC . $CurTopic . $_TOPICC . ">"; - } - - # endless until user press "Q" or "q"! - $char = ; - #$char = $term->readline(''); - chomp $char; - if($char =~ /^\d+\s*[\di*?,*?\-*?]*$/) - { - $ListType = ""; #overrun - # display notes - $number = $char; - &display; - } - elsif($char =~ /^n$/i) - { - # create a new one - &new; - } - elsif($char =~ /^$/) - { - &list; - } - elsif($char =~ /^l$/) - { - $ListType = ""; - &list; - } - elsif($char =~ /^L$/) - { - $ListType = "LONG"; - &list; - undef $SetTitle; - } - elsif($char =~ /^h$/i || $char =~ /^\?/) - { - # zu dumm der Mensch ;-) - &help; - } - elsif($char =~ /^d\s+([\d*?,*?\-*?]*)$/i) - { - # delete one! - $number = $1; - &del; - } - elsif($char =~ /^d$/i) - { - # we have to ask her: - print "enter number(s) of note(s) you want to delete: "; - $char = ; - chomp $char; - $number = $char; - &del; - } - elsif($char =~ /^e\s+(\d+\-*\,*\d*)/i) - { - # edit one! - $number = $1; - &edit; - } - elsif($char =~ /^e$/i) - { - # we have to ask her: - print "enter number of the note you want to edit: "; - $char = ; - chomp $char; - $number = $char; - &edit; - } - elsif($char =~ /^s\s+/i) - { - # she want's to search - $searchstring = $'; - chomp $searchstring; - &search; - } - elsif($char =~ /^s$/i) - { - # we have to ask her: - print "enter the string you want to search for: "; - $char = ; - chomp $char; - $char =~ s/^\n//; - $searchstring = $char; - &search; - } - elsif($char =~ /^q$/i) - { - # schade!!! - $| = $Channel; - print "\n\ngood bye!\n"; - exit(0); - } - elsif($char =~ /^t$/) - { - $TreeType = ""; - &display_tree; - } - elsif($char =~ /^T$/) - { - $TreeType = "LONG"; - &display_tree; - $TreeType = ""; - } - elsif($char =~ /^\.\.$/ || $char =~ /^cd\s*\.\.$/) - { - $CurDepth-- if ($CurDepth > 1); - $CurTopic = $LastTopic[$CurDepth]; - &list; - } - elsif($char =~ /^l\s+(\w+)$/) - { - # list - $WantTopic = $1; - if(exists $TP{$WantTopic}) - { - my %SaveTP = %TP; - $LastTopic[$CurDepth] = $CurTopic; - $CurTopic = $1; - $CurDepth++; - - &list; - - $CurTopic = $LastTopic[$CurDepth]; - $CurDepth--; - %TP = %SaveTP; - } - else - { - print "\nunknown command!\n"; - } - } - else - { - # unknown - my $unchar = $char; - $unchar =~ s/^cd //; # you may use cd now! - if(exists $TP{$char} || exists $TP{$unchar}) - { - $char = $unchar if(exists $TP{$unchar}); - $LastTopic[$CurDepth] = $CurTopic; - $CurTopic = $char; - $CurDepth++; - &list; - } - else - { - print "\nunknown command!\n"; - } - undef $unchar; - } - } -} - - - -sub usage -{ -print qq~This is the program note $version by Thomas Linden (c) 1999-2000. -It comes with absolutely NO WARRANTY. It is distributed under the -terms of the GNU General Public License. Use it at your own risk :-) -Usage: note [ options ] [ number [,number...]] -Options: --h --help displays this help screen --v --version displays the version number --c --config use another config file than the default \~/.noterc --l --list [] lists all existing notes If no topic were specified, - it will display a list of all existing topics. --L --longlist [] the same as -l but prints also the timestamp --t --topic prints a list of all topics as a tree. --T --longtopc prints the topic-tree with the notes under each topic --s --search searches for trough the notes database --e --edit edit note with --d --delete delete note with --D --Dump [ | -] dumps the notes to the textfile . if is simply - a "-" it will printed out to standard output. --I --Import | - imports a previously dumped textfile into the - note-database. Data will be appended by default. - You can also specify a dash "note -I -" instead of a , - which causes note, silently to read in a dump from STDIN. --o --overwrite only suitable for use with --Import. Overwrites an - existing notedb. --r --raw raw mode, output will not be formatted. Works not in interactive - mode, only on cmd-line for list and display. --i --interactive interactive mode -- if you run note only with one dash: "note -", then it will - read in a new note from STDIN until EOF, this makes it - possible to pipe text into a new note. - - o if you specify only a number (i.e. "note 4"), then the note with that - number will be displayed. - o you can specify more then one number for delete and display, for example: - "note -d 3,4" deletes #3 and #4. "note 5-7" displays #5, #6 and #7. - o if you run note without any parameter and if "AlwaysInteractive" in the config - set off, then note will create a new note and prompt you for new text. - o If it finds \~/.noterc, it will process it. Refer to the manpage for more - informations about the configuration. - o In interactive mode you can get help at any time by typing "?" or "h" at - the prompt. - o If encryption support is turned on, note will ask you for a passphrase every - time it runs. You can avoid this behavior by setting the environment-variable - \$NOTE_PASSWD. You will need this for example, if you call note from a script. -~; - #my ($package, $filename, $line) = caller; - #print "called from line $line\n"; - exit 1; -} - -sub find_editor { - return $PreferredEditor || $ENV{"VISUAL"} || $ENV{"EDITOR"} || "vim" || "vi" || "pico"; -} - -#/ - -sub format { - # make text bold/underlined/inverse using current $NOTEC - # s/\[([^]]*)\]/$param{$1}/g; - my($note) = @_; - if($FormatText) { - my $BN = uc($NOTEC); - my $_BN = uc($_NOTEC); - my $UN = $NOTEC; - $UN =~ s/<(.*)>/<$1_>/; - my $_UN = $UN; - $_UN =~ s/<(.*)>/<\/$1>/; - my $IN = $NOTEC; my $_IN = $_NOTEC; - $IN =~ s/<(.*)>/<$1I>/; - $_IN =~ s/<(.*)>/<$1I>/; - #$note =~ s/ (\*)(.+)(\*) / $BN$2$_BN /g; - #$note =~ s/ (_)(.+)(_) / $UN$2$_UN /g; - #$note =~ s/ (\/)(.+)(\/) / $IN$2$_IN /g; - $note =~ s/\*\*([^\*^\*]*)\*\*/$BN$1$_BN/g; - $note =~ s/__([^_^_]*)__/$UN$1$_UN/g; - $note =~ s/{{([^}^}]*)}}/$IN$1$_IN/g; - } - $note =~ s/(<\/.*>)/$1$NOTEC/g; - $note; -} - -sub output -{ - my($SSS, $LINE, $num, $note, $time, $TYPE, $L, $LONGSPC, $R, $PathLen, $SP, $title, $CUTSPACE, - $len, $diff, $Space, $nlen, $txtlen); - ($num, $note, $time, $TYPE) = @_; - $txtlen = ($ListType eq "LONG") ? $maxlen : $timelen + $maxlen; - - $note = &format($note); - - $SSS = "-" x ($maxlen + 31); - - $nlen = length("$num"); - $LINE = "$BORDERC $SSS $_BORDERC\n"; - $L = $BORDERC . "[" . $_BORDERC; - $LONGSPC = " " x (26 - $nlen); - $R = $BORDERC . "]" . $_BORDERC; - $PathLen = length($PATH); # will be ZERO, if not in TOPIC mode! - if($TYPE ne "SINGLE") - { - if(!$SetTitle) - { - $SP = ""; - # print only if it is the first line! - $SP = " " x ($maxlen - 2 - $PathLen); - if(!$Raw) { - # no title in raw-mode! - print C $LINE; - - print C "$L $NUMC#$_NUMC "; - if($ListType eq "LONG") - { - print C " $TIMEC" . "creation date$_TIMEC "; - } - else - { - print $LONGSPC; - } - if($TOPIC) - { - print C $TOPICC . "$PATH $_TOPICC$SP$R\n"; - } - else - { - print C $NOTEC . "note$_NOTEC$SP$R\n"; - } - - print C $LINE; - } - $SetTitle = 1; - } - $title = ""; - $CUTSPACE = " " x $txtlen; - $note =~ s/\n/$CUTSPACE/g; - $len = length($note); - if($len < ($txtlen - 2 - $nlen)) - { - $diff = $txtlen - $len; - $Space = " " x $diff; - if(!$Raw) { - if($num eq "-") - { - $title = $BORDERC . $TOPICC . "\"" . $note . "\"" . $_TOPICC . $Space . "$_BORDERC"; - } - else - { - $title = $BORDERC . $NOTEC . "\"" . $note . "\"" . $_NOTEC . $Space . "$_BORDERC"; - } - } - else { - $title = $note; - } - } - else - { - $title = substr($note,0,($txtlen - 2 - $nlen)); - if(!$Raw) { - $title = $BORDERC . $NOTEC . "\"" . $title . "...\"$_NOTEC$_BORDERC"; - } - } - if($Raw) { - print "$num "; - print "$time " if($ListType eq "LONG"); - if($title =~ /^ => (.*)$TopicSep (.*)$/) { - $title = "$1$TopicSep $2"; # seems to be a topic! - } - print "$title\n"; - } - else { - # $title should now look as: "A sample note " - print C "$L $NUMC$num$_NUMC $R"; - if($ListType eq "LONG") - { - print C "$L$TIMEC" . $time . " $_TIMEC$R"; - } - print C "$L $NOTEC" . $title . "$_NOTEC $R\n"; - print C $LINE; - } - } - else - { - # we will not reach this in raw-mode, therefore no decision here! - chomp $note; - $Space = " " x (($maxlen + $timelen) - 16); - print C $LINE; - print C "$L $NUMC$num$_NUMC $R$L$TIMEC$time$_TIMEC $Space$R\n"; - print C $LINE; - print C $NOTEC . $note . $_NOTEC . "\n"; - print C $LINE; - } - -} - - - -sub C -{ - my(%Color, $default, $S, $Col, $NC, $T); - # \033[1m%30s\033[0m - %Color = ( 'black' => '0;30', - 'red' => '0;31', - 'green' => '0;32', - 'yellow' => '0;33', - 'blue' => '0;34', - 'magenta' => '0;35', - 'cyan' => '0;36', - 'white' => '0;37', - 'B' => '1;30', - 'BLACK' => '1;30', - 'RED' => '1;31', - 'GREEN' => '1;32', - 'YELLOW' => '1;33', - 'BLUE' => '1;34', - 'MAGENTA' => '1;35', - 'CYAN' => '1;36', - 'WHITE' => '1;37', - 'black_' => '4;30', - 'red_' => '4;31', - 'green_' => '4;32', - 'yellow_' => '4;33', - 'blue_' => '4;34', - 'magenta_' => '4;35', - 'cyan_' => '4;36', - 'white_' => '4;37', - 'blackI' => '7;30', - 'redI' => '7;31', - 'greenI' => '7;32', - 'yellowI' => '7;33', - 'blueI' => '7;34', - 'magentaI' => '7;35', - 'cyanI' => '7;36', - 'whiteI' => '7;37' - ); - $default = "\033[0m"; - $S = $_[0]; - foreach $Col (%Color) - { - if ($S =~ /<$Col>/g) - { - if($COLOR ne "NO") - { - $NC = "\033[" . $Color{$Col} . "m"; - $S =~ s/<$Col>/$NC/g; - $S =~ s/<\/$Col>/$default/g; - } - else - { - $S =~ s/<$Col>//g; - $S =~ s/<\/$Col>//g; - } - } - } - return $S; -} - - - -sub num_bereich -{ - my($m,@LR,@Sorted_LR,$i); - # $number is the one we want to delete! - # But does it contain kommas? - @NumBlock = (); #reset - $m = 0; - if($number =~ /\,/) - { - # accept -d 3,4,7 - @NumBlock = split(/\,/,$number); - } - elsif($number =~ /^\d+\-\d+$/) - { - # accept -d 3-9 - @LR = split(/\-/,$number); - @Sorted_LR = (); - - if($LR[0] > $LR[1]) - { - @Sorted_LR = ($LR[1], $LR[0]); - } - elsif($LR[0] == $LR[1]) - { - # 0 and 1 are the same - @Sorted_LR = ($LR[0], $LR[1]); - } - else - { - @Sorted_LR = ($LR[0], $LR[1]); - } - - for($i=$Sorted_LR[0]; $i<=$Sorted_LR[1]; $i++) - { - # from 3-6 create @NumBlock (3,4,5,6) - $NumBlock[$m] = $i; - $m++; - } - } - else - { - @NumBlock = ($number); - } - -} - -sub getdate -{ - my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); - $year += 1900; - $mon += 1; - $mon =~ s/^(\d)$/0$1/; - $hour =~ s/^(\d)$/0$1/; - $min =~ s/^(\d)$/0$1/; - $sec =~ s/^(\d)$/0$1/; - $mday =~ s/^(\d)$/0$1/; - return "$mday.$mon.$year $hour:$min:$sec"; -} - - -sub help -{ -my $B = ""; -my $BB = ""; -my($S, $L, $T, $Q, $H, $N, $D, $E); -$L = $B . "L" . $BB . $NOTEC; -$T = $B . "T" . $BB . $NOTEC; -$Q = $B . "Q" . $BB . $NOTEC; -$H = $B . "?" . $BB . $NOTEC; -$N = $B . "N" . $BB . $NOTEC; -$D = $B . "D" . $BB . $NOTEC; -$E = $B . "E" . $BB . $NOTEC; -$S = $B . "S" . $BB . $NOTEC; - -print C qq~$BORDERC -----------------------------------------------------------------------$_BORDERC $TOPICC -HELP for interactive note $version -$_TOPICC $NOTEC -The following commands are available: -$L List notes. L=long, with timestamp and l=short without timestamp. - You can also just hit for short list. - If you specify a subtopic, then list will display it's contents, - i.e.: "l mytopic" will dislpay notes under mytopic. -$N Create a new note. -$D Delete a note. You can either hit "d 1" or "d 1-4" or just hit "d". - If you don't specify a number, you will be asked for. -$S Search trough the notes database. Usage is similar to Delete, use - a string instead of a number to search for. -$E Edit a note. Usage is similar to Delete but you can only edit note - a time. -$H This help screen. -$Q Exit the program.~; -if($TOPIC) -{ -print C qq~ -$T print a list of all existing topics as a tree. T prints the tree - with all notes under each topic. - - You can change the actual topic by simply typing it's name or by using - the command "cd", i.e. "cd mytopic". You can create a new topic by creating - a new note, the first line must be the topic borderd by slashes, i.e.: - "/newtopic/". The slash is the default topic-sepearator, but you can over- - ride this in the config! If you type just ".." instead of a topic, you will - go one step back in your topic-structure. -~; -} -print C qq~ -$NOTEC -All commands except the List and Topic commands are case insensitive. $_NOTEC $BORDERC -----------------------------------------------------------------------$_BORDERC -~; -} - - -sub display_tree { - # displays a tree of all topics - my(%TREE, %res, $n, $t, $num, @nodes, $firstline, $text, $untext); - %res = $db->get_all(); - foreach $num (keys %res) - { - $n = $res{$num}->{'note'}; - $t = $res{$num}->{'date'}; - # this allows us to have multiple topics (subtopics!) - my ($firstline,$text,$untext) = split /\n/, $n, 3; - if($firstline =~ /^($TopicSep)/) - { - $firstline =~ s/($TopicSep)*$//; #remove TopicSepatator - @nodes = split(/$TopicSep/,$firstline); - } - else - { - @nodes = ();("$TopicSep"); - $text = $firstline; - } - &tree($num, $text, \%TREE, @nodes); - } - #return if ($num == 0); - # now that we have build our tree (in %TREE) go on t display it: - print C $BORDERC . "\n[" . $TopicSep . $BORDERC . "]\n"; - &print_tree(\%{$TREE{''}},"") if(%TREE); - print C $BORDERC . $_BORDERC . "\n"; -} - - -sub tree { - my($num, $text, $LocalTree, $node, @nodes) = @_; - if(@nodes) { - if(! exists $LocalTree->{$node}->{$NoteKey}) { - $LocalTree->{$node}->{$NoteKey} = []; - } - &tree($num, $text, $LocalTree->{$node}, @nodes); - } - else { - if(length($text) > ($maxlen - 5)) { - $text = substr($text, 0, ($maxlen -5)); - } - $text = $text . " (" . $NUMC . "#" . $num . $_NUMC . $NOTEC . ")" . $_NOTEC if($text ne ""); - push @{$LocalTree->{$node}->{$NoteKey}}, $text; - } -} - - -sub print_tree { - # thanks to Jens for his hints and this sub! - my $hashref=shift; - my $prefix=shift; - my @notes=@{$hashref->{$NoteKey}}; - my @subnotes=sort grep { ! /^$NoteKey$/ } keys %$hashref; - if($TreeType eq "LONG") { - for my $note (@notes) { - if($note ne "") { - print C $BORDERC ;# . $prefix. "|\n"; - print C "$prefix+---<" . $NOTEC . $note . $BORDERC . ">" . $_NOTEC . "\n"; - } - } - } - for my $index (0..$#subnotes) { - print C $BORDERC . $prefix. "|\n"; - print C "$prefix+---[" . $TOPICC . $subnotes[$index] . $BORDERC . "]\n"; - &print_tree($hashref->{$subnotes[$index]},($index == $#subnotes?"$prefix ":"$prefix| ")); - } -} - - -sub getconfig -{ - my($configfile) = @_; - my ($home, $value, $option); - # checks are already done, so trust myself and just open it! - open CONFIG, "<$configfile" || die $!; - while() { - chomp; - next if(/^\s*$/ || /^\s*#/); - my ($option,$value) = split /\s\s*=?\s*/, $_, 2; - $value =~ s/\s*$//; - $home = $value if (/^Home/); - $libpath = $value if (/^LibPath/); - $dbdriver = $value if (/^DbDriver/); - $dbhost = $value if (/^DbHost/); - $dbuser = $value if (/^DbUser/); - $dbpasswd = $value if (/^DbPasswd/); - $dbname = $value if (/^DbName/); - $table = $value if (/^DbTable/); - $fnum = $value if (/^FieldNumber/); - $fnote = $value if (/^FieldNote/); - $fdate = $value if (/^FieldDate/); - $NOTEDB = $value if (/^NoteDb/); - $MAX_NOTE = $value if (/^MaxNoteByte/); - $MAX_TIME = $value if (/^MaxTimeByte/); - $CRYPT_METHOD = $value if (/^CryptMethod/); - $USE_CRYPT = "YES" if (/^UseEncryption/ && $value == 1); - $USE_CRYPT = undef if (/^UseEncryption/ && $value == 0); - $ALWAYS_INT = "YES" if (/^AlwaysInteractive/ && $value == 1); - $ALWAYS_INT = undef if (/^AlwaysInteractive/ && $value == 0); - $DEFAULT_LIST = "LONG" if (/^DefaultLong/ && $value == 1); - $DEFAULT_LIST = undef if (/^DefaultLong/ && $value == 0); - $ALWAYS_EDIT = "YES" if (/^AlwaysEditor/ && $value == 1); - $ALWAYS_EDIT = undef if (/^AlwaysEditor/ && $value == 0); - $KEEP_TIMESTAMP = "YES" if (/^KeepTimeStamp/ && $value == 1); - $KEEP_TIMESTAMP = undef if (/^KeepTimeStamp/ && $value == 0); - $COLOR = "YES" if (/^UseColors/ && $value == 1); - $COLOR = "NO" if (/^UseColors/ && $value == 0); - $TopicSep = $value if (/^TopicSeparator/); - $maxlen = $value if (/^MaxLen/); - $BORDER_COLOR = $value if (/^BorderColor/); - $NUM_COLOR = $value if (/^NumberColor/); - $NOTE_COLOR = $value if(/^NoteColor/); - $TIME_COLOR = $value if (/^TimeColor/); - $TOPIC_COLOR = $value if (/^TopicColor/); - $PreferredEditor = $value if (/^PreferredEditor/); - $FormatText = $value if (/^FormatText/); - } - chomp $home; - $home =~ s/\/*$//; # cut eventually / at the end - $HOME = eval($home); - if($NOTEDB =~ /^(~\/)(.*)$/) { - $NOTEDB = "/home/" . $USER . "/" . $2; - } - $libpath =~ s/\/*$//; - - close CONFIG; -} - - - - -__END__ -# -# $Log: note,v $ -# Revision 1.29 2000/06/25 20:13:23 scip -# *** empty log message *** -# -# Revision 1.28 2000/06/25 19:51:51 scip -# changed pattern matching of seraching(\@ ... \E) -# added --config option -# -# Revision 1.27 2000/05/16 23:51:35 thomas -# fixed many option-parsing related bugd! -# -# Revision 1.26 2000/05/13 01:05:17 thomas -# changed config format and fixed some bugs -# as well as some other additions... -# -# Revision 1.25 2000/05/11 23:42:43 thomas -# --tree changed to --topic -# -# Revision 1.24 2000/05/10 22:59:44 thomas -# updated usage to reflect --raw and build it into output -# and display subs. -# -# Revision 1.23 2000/05/10 22:19:04 thomas -# changed to Getopt::Long, added --raw -# -# Revision 1.22 2000/05/01 18:51:40 thomas -# added "-" to sub dump -# -# Revision 1.21 2000/05/01 00:17:27 thomas -# *** empty log message *** -# -# Revision 1.20 2000/04/30 23:31:38 thomas -# added -o and coloured sub help. -# -# Revision 1.19 2000/04/30 16:07:23 thomas -# *** empty log message *** -# -# Revision 1.18 2000/04/30 14:58:21 thomas -# updated the usage and help subs -# -# Revision 1.17 2000/04/30 14:44:38 thomas -# added colors to the tree functions -# -# Revision 1.16 2000/04/30 14:28:38 thomas -# added the t command, which displays a topic-tree. -# and enhanced the list command in interactive mode -# -# Revision 1.15 2000/03/19 23:41:04 thomas -# changed set_del, now no extra TEMP file is required! -# instead I get it from $this->get_all() ! -# Revision 1.14 2000/03/19 22:51:49 thomas -# Bug in NOTEDB::binary fixed, recount of nubers was -# incorrect. -# -# Revision 1.13 2000/03/19 11:53:32 thomas -# edit bug fixed (ude => uen) -# -# Revision 1.12 2000/03/19 03:06:51 thomas -# backend support completed. -# mysql and binary backends now excluded in separate files -# -# Revision 1.11 2000/03/18 00:16:47 thomas -# added NOTEDB::mysql and changed note to work with that. -# thus, from now on there is only one script to maintain and -# it is possible to provide more bacjends as well as making -# additional scripts upon them, i.e. cgi script... -# -# Revision 1.8 2000/03/13 22:48:43 thomas -# small width bug fixed -# -# Revision 1.7 2000/03/08 23:11:19 tom -# added cd -# -# Revision 1.6 2000/03/08 22:50:41 tom -# Added the $KEEP_TIMESTAMP option and fixed a bug regarding topic names -# and invalid resolution of them in case it started with "1 name". -# -# Revision 1.5 2000/02/25 20:59:30 tom -# corrected small timestamp problem in &edit and &new -# -# Revision 1.4 2000/02/25 13:24:11 tom -# fixed a small bug, that caused to use the last line for a note title instead the 2nd. -# -# Revision 1.3 2000/02/25 11:28:53 tom -# all changes from bin version applied to sql version diff --git a/note-1.0.7/config/noterc b/note-1.0.7/config/noterc deleted file mode 100644 index b396d70..0000000 --- a/note-1.0.7/config/noterc +++ /dev/null @@ -1,148 +0,0 @@ -# 1.0.6 -*- sh -*- -# This is a sample config for the note script -# There are useful defaults set in note itself. -# -# Copy it to your $HOME as .noterc -# -# note is Copyright (c) 1999-2000 Thomas Linden. -# You can contact me per email: -# -# comments start with #, empty lines will be ignored. -# 1 turns an option on, 0 turns it off. -# An option consists of an atribute-value pair separated -# by minimum one space (more spaces and/or tabs are allowed) - - -# Your home directory, better do not change it! -# can be an environment variable or a path -Home $ENV{'HOME'} - - -# specify the path, where the NOTEDB lib directory -# resides. This will only used if it is not -# installed inside the perl-lib directory structure! -LibPath /usr/local/lib - - -# you need to decide which database backend you want -# to use. Please refer to the corresponding documentation -# for closer information about the certain backend! -# Currently supported types: "binary", "dbm" or "mysql". -# You must also edit/uncomment one section below for the -# backend you want to use! -DbDriver binary - - -# backend specific settings for sql backend -#DbHost localhost -#DbUser you -#DbPasswd -#DbName mynotes -#DbTable note -#FieldNumber number -#FieldNote note -#FieldDate date -#### specific end ### - - -# backend specific settings for binary(default) backend -NoteDb ~/.notedb -# Define the maximum bytes fields can have in a -# note-entry. Do not change MaxTimeByte to less than 64! - -MaxNoteByte 4096 -MaxTimeByte 64 -#### specific end ### - - -# backend specific settings for DBM backend -# this must be an existing directory! -#DbName /home/you/.notedbm -#### specific end ### - -# You can use encryption with note, that means notes and -# timestamps will be stored encrypted. This is supported -# by every db-backend. -# Set to 1 to turn it on. The Default is 0 (off) -UseEncryption 0 - -# Specify the encryption protocol. The appropriate perl -# module needs to be installed. Possible velues are -# IDEA, DES or BLOWFISH, the default is IDEA. -CryptMethod IDEA - - -# You can run note always in interactive mode by simply -# typing "note". Set this option to 1 to turn it on. -# The default is 0 (off). -AlwaysInteractive 0 - - -# In interactive mode, note issues a list command if you -# simply hit enter. By turning this on, it will issue a -# longlist command instead if you hit just enter. -# The default is 0 (off) -DefaultLong 0 - - - -# You can use an external editor everytime from note instead -# of STDIN for creating new notes. Set to 1 to turn it on. -# The default is 0 (off). -AlwaysEditor 0 - - -# uncomment and edit it, if you want to use another -# editor than the default $EDITOR or as fallback vi. -#PreferredEditor emacs - - -# If you dont prefer that note updates the timestamp of a -# note after editing, turn this on. It will -# keep the original timestamp if this option is set. -# The default is 0(off), to turn it on set to 1. -KeepTimeStamp 0 - - -# You can specify your own topic separator here. -# the default topic separator is a normal slash: "/" -# see README for details about topics! -TopicSeparator / - - -# The maximum width for displaying a note, in CHARS. -# Depends on your screen-size. You can set it to -# "auto", if you wish that note sould determine the -# available size, but it experimental, be aware! -MaxLen 30 - - -# note can use colors for output, set this option to -# 1, if you don't want it, or if your terminal does -# not support it, set to 0. The default is 1 (on). -UseColors 1 - - -# Color-definitions of the various items. Will only -# take effect, if "UseColors" is turned on! -BorderColor BLACK -NumberColor blue -NoteColor green -TimeColor black -TopicColor BLACK -# The following colors are available: -# black, red, green, yellow, blue, magenta, cyan and white. -# for bold color write it uppercase (BLACK will be bold black) -# for underlined color append an underscore (blue_ will be underlined blue) -# for inverted color append an "I" (greenI will be inverted green) - - -# Additional to colors, you can also do a little bit of formatting your -# notes (bold, underlined, italic), see README! -# You need to set this Option to 1, if you decide to make use of this -# capabily -FormatText 1 - -# That's all about it for now. -# If you still have any questiosn, please feel free to contact -# me by email: Thomas Linden diff --git a/note-1.0.7/mysql/README b/note-1.0.7/mysql/README deleted file mode 100644 index 78cc14a..0000000 --- a/note-1.0.7/mysql/README +++ /dev/null @@ -1,62 +0,0 @@ -README for the mysql database installation for note - -Requirements -============ - - You need the following things: - o perl installed (5.004x) - o mysql database installed and running - o Mysql perlmodule (you can find it on - http://www.mysql.org) PLEASE NOTE: - It needs the Module "Mysql". The install.sh - script will install it for you directly from - CPAN if you like. Newer versions - are DBI, which you can also use to access - mysql databases. If you want to use it, you - have to rewrite the program. Please let me - know, if you did it :-) - o permissions to create a new database and - to write data to this database. - - - -Installation -============ - - First, make sure all these things above are ok. - You can use the script "install.sh" to create a new - database and the table structure. You might edit - the script before running it. - - If you are getting trouble, i.e. if you have not the - required permissions to do that, please make sure, - you can. - As user root, you have to give your user the - neccessary permissions. Please refer to the mysql - documentation, how to do that. - After that repeat the step above. - - You can find a sample config file within the subdirectory - "config" named noterc. There are some special values - which you can use to connect to a different database - then the default. - install.sh will create the following database: - name: user_note - Maintable: note - Number: number(int 10) - Note: note(text) - Date: date(text) - - You can use the file "permissions" as a template for - modifying a users permissions to her database. Please - note, that there are different version of mysql out - there with different access privilege systems, which - are not compatible, refer to the documentation shipped - with your mysql installation to learn, how many fields - are available and what they are for. - - You may also take a look to: - http://www.mysql.org/Manual_chapter/manual_Privilege_system.html - - - This should be all. diff --git a/note-1.0.7/mysql/install.sh b/note-1.0.7/mysql/install.sh deleted file mode 100755 index 5bd2b2a..0000000 --- a/note-1.0.7/mysql/install.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh -# installs note -# This is the installer for the mysql version only! - -echo "Welcome to note `cat VERSION` installation." -echo "the install script will ask you a view questions," -echo "make sure to answer them correctly!" -echo - -/bin/echo -n "creating the note database..." -NAME="_note" -DBNAME="$USER$NAME" -echo "DBNAME=$DBNAME" -mysqladmin create $DBNAME -echo "done." -/bin/echo -n "creating the table structure using defaults..." -mysql $DBNAME < sql - -echo "Shall I try to install the required MySQL driver from CPAN?" -read YESNO - -case $YESNO in - "y" | "Y") - if [ $UID != 0 ] ; then - echo "You should be root for that!" - exit - fi - perl -MCPAN -e shell cpan> install mysql - ;; -esac -echo "done." - - diff --git a/note-1.0.7/mysql/permissions b/note-1.0.7/mysql/permissions deleted file mode 100644 index 966d1bf..0000000 --- a/note-1.0.7/mysql/permissions +++ /dev/null @@ -1,2 +0,0 @@ -insert into user values - ('localhost','','','Y','Y','Y','Y','Y','Y','N','N','N','N','N','N','N','Y'); diff --git a/note-1.0.7/mysql/sql b/note-1.0.7/mysql/sql deleted file mode 100644 index 37d6072..0000000 --- a/note-1.0.7/mysql/sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE note ( - number int(10) DEFAULT '0' NOT NULL auto_increment, - note text, - date text, - PRIMARY KEY (number) -); -# sample grant statement: -#GRANT ALL PRIVILEGES ON tom_note TO tom@localhost IDENTIFIED BY 'password'; diff --git a/note-1.0.7/note b/note-1.0.7/note deleted file mode 100755 index db622a5..0000000 --- a/note-1.0.7/note +++ /dev/null @@ -1,1639 +0,0 @@ -#!/usr/bin/perl -# $Id: note,v 1.27 2000/05/16 23:51:35 thomas Exp thomas $ -# -# -# note - console notes management with database and encryption support. -# Copyright (C) 1999-2000 Thomas Linden (see README for details!) -# -# This program 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 2 -# of the License, or (at your option) any later version. -# -# This program 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 this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# - Thomas Linden -# -# latest version on: -# http://www.daemon.de/software.html -# ftp://www.0x49.org/pub/scip/note/ -# - -use strict; -#use Data::Dumper; -use Getopt::Long; - -# -# prototypes -# -sub usage; # print usage message for us thumb userz :-) -sub find_editor; # returns an external editor for use -sub output; # used by &list and &display -sub C; # print colourized -sub num_bereich; # returns array from "1-4" (1,2,3,4) -sub getdate; # return pretty formatted day -sub new; # crate new note -sub edit; # edit a note -sub del; # delete a note -sub display; # display one or more notes -sub list; # note-listing -sub help; # interactive help screen -sub import; # import from notedb-dump -sub display_tree; # show nice tree-view -sub tree; # build the tree -sub print_tree; # print the tree, contributed by Jens Heunemann . THX! - - -# -# globals -# -my ( - # - # commandline options - # - $opt_, $opt_i, $opt_r, $opt_e, $opt_d, - $opt_s, $opt_t, $opt_T, $opt_l, $opt_L, - $opt_D, $opt_I, $opt_o, $opt_h, $opt_n, $opt_v, - - # - # set from commandline (or interactive) - # - $number, $searchstring, $dump_file, $ImportType, $NewType, $Raw, - - # - # options from config file .noterc - # - $maxlen, $timelen, $TOPIC, $NOTEDB, $MAX_TIME, $PreferredEditor, - $ALWAYS_INT, $KEEP_TIMESTAMP, $COLOR, $ALWAYS_EDIT, $HOME, $FormatText, - $BORDER_COLOR, $NOTE_COLOR, $NUM_COLOR, $TOPIC_COLOR, $MAX_NOTE, - $USE_CRYPT, $CRYPT_METHOD, $TopicSep, $DEFAULT_LIST, $TIME_COLOR, - - # - # db specifics from .noterc - # - $db, $dbname, $dbhost, $dbuser, $dbpasswd, - $table, $fnum, $fnote, $fdate, $date, $dbdriver, $libpath, - - # - # processed colors - # - $BORDERC, $_BORDERC, $NOTEC, $NUMC, $_NUMC, $_NOTEC, $TIMEC, - $_TIMEC, $TOPICC, $_TOPICC, - - # - # config presets - # - $DEFAULTDBNAME, $USER, $PATH, $CONF, - - # - # internals - # - $TYPE, $mode, $NoteKey, - $version, $number, $CurTopic, $CurDepth, $WantTopic, - $sizeof, %TP, $TreeType, $ListType, $SetTitle, - @ArgTopics, $key, $typedef, @NumBlock, $has_nothing, - ); - - -# -# DEFAULTS, allows one to use note without a config -# don't change them, instead use the config file! -# -$maxlen = 30; -$timelen = 22; -$date = &getdate; -$USER = getlogin || getpwuid($<); -chomp $USER; -$HOME = $ENV{'HOME'}; -$CONF = $HOME . "/.noterc"; -$dbdriver = "binary"; -$libpath = "/usr/local/lib"; -$NOTEDB = $HOME . "/.notedb"; -$MAX_NOTE = 4096; -$MAX_TIME = 64; -$COLOR = "YES"; -$BORDER_COLOR = "BLACK"; -$NUM_COLOR = "blue"; -$NOTE_COLOR = "green"; -$TIME_COLOR = "black"; -$TOPIC_COLOR = "BLACK"; -$TOPIC = 1; -$TopicSep = '/'; -$version = "1.0.6"; -if($TOPIC) -{ - $CurDepth = 1; # the current depth inside the topic "directory" structure... -} -$USE_CRYPT = "NO"; - - - - -# -# process command line args -# -if($ARGV[0] eq "") -{ - $mode = "new"; -} -elsif($#ARGV == 0 && $ARGV[0] eq "-") { - $mode = "new"; - $NewType = 1; # read from STDIN until EOF - shift; - undef $has_nothing; -} -else -{ - Getopt::Long::Configure( qw(no_ignore_case)); - GetOptions ( - "interactive|i!" => \$opt_i, # no arg - "raw|r!" => \$opt_r, # no arg - "edit|e=i" => \$opt_e, # integer, required - "delete|d=s" => \$opt_d, # integer, required - "search|s=s" => \$opt_s, # string, required - "tree|topic|t!" => \$opt_t, # no arg - "long_tree|T!" => \$opt_T, # no arg - "list|l:s" => \$opt_l, # string, optional - "long_list|L:s" => \$opt_L, # string, optional - "dump|D:s" => \$opt_D, # string, optional - "import|I:s" => \$opt_I, # string, optional - "overwrite|o!" => \$opt_o, # no arg - "help|h|?!" => \$opt_h, # no arg - "version|v!" => \$opt_v # no arg - ); - $opt_n = shift; # after that @ARGV contains eventually - # a note-number - # $opt_ is a single dash, in case of existence! - # - # determine mode - # - if($opt_i) { - $mode = "interactive"; - } - elsif(defined $opt_l || defined $opt_L) { - $mode = "list"; - if(defined $opt_l) { - @ArgTopics = split /$TopicSep/, $opt_l; - } - else { - $ListType = "LONG"; - @ArgTopics = split /$TopicSep/, $opt_L; - } - $CurDepth += $#ArgTopics + 1 if($opt_l || $opt_L); - $CurTopic = $ArgTopics[$#ArgTopics]; # use the last element everytime... - } - elsif($opt_t || $opt_T) { - $mode = "tree"; - $TreeType = "LONG" if($opt_T); - } - elsif(defined $opt_s) { - $mode = "search"; - $searchstring = $opt_s; - } - elsif($opt_e) { - $mode = "edit"; - $number = $opt_e; - } - elsif($opt_d) { - $mode = "delete"; - $number = $opt_d; - } - elsif(defined $opt_D) { - $mode = "dump"; - if(!$opt_) { - if($opt_D ne "") { - $dump_file = $opt_D; - } - else { - $dump_file = "note.dump.$$"; - print "no dumpfile specified, using $dump_file.\n"; - } - } - else { - $dump_file = "-"; # use STDIN - } - } - elsif(defined $opt_I) { - $mode = "import"; - if(!$opt_) { - if($opt_I ne "") { - $dump_file = $opt_I; - } - else { - print "Import-error! No dump_file specified!\n"; - exit(1); - } - } - else { - $dump_file = "-"; - } - } - elsif($opt_v) { - print "This is note $version by Thomas Linden .\n"; - exit(0); - } - elsif($opt_h) { - &usage; - } - else { - $has_nothing = 1; - } - ### determine generic options - if($opt_n =~ /^[\d+\-?\,*]+$/) { - # first arg is a digit! - if($mode eq "") { - $number = $opt_n; - $mode = "display"; - undef $has_nothing; - } - else { - print "mode <$mode> does not take a numerical argument!\n"; - exit(1); - } - } - elsif($opt_n ne "") { - print "Unknown option: $opt_n\n"; - &usage; - } - if($opt_r) { - $Raw = 1; - } - if($opt_o) { - $ImportType = "overwrite"; - if(!$opt_I) { - print "--overwrite is only suitable for use with --import!\n"; - exit(1); - } - } - ##### -} -if($has_nothing && $mode eq "") -{ - &usage; -} - - -# read the configfile. -if(-e $CONF) -{ - &getconfig($CONF); -} - - -# Always interactive? -if($ALWAYS_INT eq "YES" && $mode ne "dump" && $mode ne "import") -{ - $mode = "interactive"; -} - -# OK ... Long-Listing shall be default ... You wanted it!!! -if($DEFAULT_LIST eq "LONG") -{ - # takes only precedence in commandline mode - $ListType="LONG"; -} - - - -# *if* loading of the config was successful, try to load the -# configured database backend. Currently supported: mysql and binary. -push @INC, $libpath; -#if($dbdriver eq "mysql") { -# eval { -# require NOTEDB::mysql; -# $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); -# } -#} -if($dbdriver eq "binary") { - eval { - require NOTEDB::binary; - $db = new NOTEDB($dbdriver, $NOTEDB, $MAX_NOTE, $MAX_TIME, $dbdriver); - } -} -else { - eval { - require "NOTEDB/$dbdriver.pm"; - $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); - }; -} -if($@) { - print "Unsupported database backend: NOTEDB::$dbdriver!\n"; - print "The following error has occured:\n------------------------\n" . $@ . "\n------------------------\n"; - exit 1; -} - -# add the backend version to the note version: -$version .= " " . $db->version(); - -# calculate some constants... -$BORDERC = "<$BORDER_COLOR>"; -$_BORDERC = ""; -$NUMC = "<$NUM_COLOR>"; -$_NUMC = ""; -$NOTEC = "<$NOTE_COLOR>"; -$_NOTEC = ""; -$TIMEC = "<$TIME_COLOR>"; -$_TIMEC = ""; -$TOPICC = "<$TOPIC_COLOR>"; -$_TOPICC = ""; - -$NoteKey = $TopicSep . "notes" . $TopicSep; - - -if($ListType ne "LONG" && $mode ne "interactive") -{ - #$maxlen += $timelen; # no time will be displayed! -} - - -# check if the user wants to use encryption: -if($USE_CRYPT eq "YES" && $NOTEDB::crypt_supported == 1) { - if($CRYPT_METHOD eq "") { - $CRYPT_METHOD = "Crypt::IDEA"; - } - if(!exists $ENV{'NOTE_PASSWD'}) { - print "password: "; - eval { - local($|) = 1; - local(*TTY); - open(TTY,"/dev/tty"); - system ("stty -echo ); - print STDERR "\r\n"; - system ("stty echo ; - } - } - else { - $key = $ENV{'NOTE_PASSWD'}; - } - chomp $key; - $db->use_crypt($key,$CRYPT_METHOD); - undef $key; - # verify correctness of passwd - my ($cnote, $cdate) = $db->get_single(1); - if($cdate ne "") { - if($cdate !~ /^\d+\.\d+?/) { - print "access denied.\n"; # decrypted $date is not a number! - exit(1); - } - } #else empty! -} -else { - $db->no_crypt; - # does: NOTEDB::crypt_supported = 0; - my ($cnote, $cdate) = $db->get_single(1); - if($cdate ne "") { - if($cdate !~ /^\d+\.\d+?/) { - print "$NOTEDB seems to be encrypted!\n"; - exit(1); - } - } -} - -# main loop: ############### -if($mode eq "display") -{ - &display; -} -elsif($mode eq "search") -{ - &search; -} -elsif($mode eq "list") -{ - &list; -} -elsif($mode eq "tree") -{ - &display_tree; -} -elsif($mode eq "new") -{ - &new; -} -elsif($mode eq "delete") -{ - del; -} -elsif($mode eq "edit") -{ - &edit; -} -elsif($mode eq "dump") -{ - &dump; -} -elsif($mode eq "import") -{ - &import; -} -elsif($mode eq "interactive") -{ - &interactive; -} -else -{ - #undefined :-( -} - - -exit(0); -################## EOP ################ - - - -############################### DISPLAY ################################## -sub display -{ - my($N,$match,$note,$date,$num); - # display a certain note - print "\n"; - &num_bereich; # get @NumBlock from $numer - foreach $N (@NumBlock) - { - ($note, $date) = $db->get_single($N); - if($note) - { - if($Raw) { - print "$N\n$date\n$note\n\n"; - } - else { - output($N, $note, $date, "SINGLE"); - print "\n"; - } - $match = 1; - } - } - if(!$match) - { - print "no note with that number found!\n"; - } -} -############################### SEARCH ################################## -sub search -{ - my($n,$match,$note,$date,$num,%res); - if($searchstring eq "") - { - print "No searchstring specified!\n"; - } - else { - print "searching the database $dbname for \"$searchstring\"...\n\n"; - - %res = $db->get_search($searchstring); - - foreach $num (sort { $a <=> $b } keys %res) - { - output($num, $res{$num}->{'note'}, $res{$num}->{'date'}); - $match = 1; - } - if(!$match) - { - print "no matching note found!\n"; - } - print "\n"; - } -} - - -############################### LIST ################################## -sub list -{ - my(@topic,@RealTopic, $i,$t,$n,$num,@CurItem,$top,$in,%res); - if($mode ne "interactive" && !$Raw) - { - print "\nList of all existing notes:\n\n"; - } - else { - print "\n"; - } - - # list all available notes (number and firstline) - %res = $db->get_all(); - - if($TOPIC) - { - undef %TP; - } - - foreach $num (sort { $a <=> $b } keys %res) - { - $n = $res{$num}->{'note'}; - $t = $res{$num}->{'date'}; - if($TOPIC) - { - # this allows us to have multiple topics (subtopics!) - my ($firstline,$dummy) = split /\n/, $n, 2; - if($firstline =~ /^($TopicSep)/) - { - @topic = split(/$TopicSep/,$firstline); - } - else - { - @topic = (); - } - # looks like: "\topic\" - # collect a list of topics under the current topic - if($topic[$CurDepth-1] eq $CurTopic && $topic[$CurDepth] ne "") - { - if(exists $TP{$topic[$CurDepth]}) - { - $TP{$topic[$CurDepth]}++; - } - else - { - # only if the next item *is* a topic! - $TP{$topic[$CurDepth]} = 1 if(($CurDepth) <= $#topic); - } - } - elsif($topic[$CurDepth-1] eq $CurTopic || ($topic[$CurDepth] eq "" && $CurDepth ==1)) - { - # cut the topic off the note-text - if($n =~ /^($TopicSep)/) - { - $CurItem[$i]->{'note'} = $dummy; - } - else - { - $CurItem[$i]->{'note'} = $n; - } - # save for later output() call - $CurItem[$i]->{'num'} = $num; - $CurItem[$i]->{'time'} = $t; - $i++; - # use this note for building the $PATH! - if($RealTopic[0] eq "") - { - @RealTopic = @topic; - } - } - } - else - { - output($num, $n, $t); - } - } - if($TOPIC) - { - if($CurTopic ne "") - { - undef $PATH; - foreach (@RealTopic) - { - $PATH .= $_ . $TopicSep; - last if($_ eq $CurTopic); - } - } - else - { - $PATH = $TopicSep; - } - - # we are at top level, print a list of topics... - foreach $top (sort(keys %TP)) - { - output("-", " => ". $top . "$TopicSep ($TP{$top} notes)", - " Sub Topic "); - } - #print Dumper(@CurItem); - for($in=0;$in<$i;$in++) - { - output( $CurItem[$in]->{'num'}, - $CurItem[$in]->{'note'}, - $CurItem[$in]->{'time'} ); - } - } - - print "\n"; -} - -############################### NEW ################################## -sub new -{ - my($TEMP,$editor, $date, $note, $WARN, $c, $line, $num, @topic); - $date = &getdate; - if($ALWAYS_EDIT eq "YES") - { - $TEMP = "/tmp/note.$$"; - # let the user edit it... - $editor = &find_editor; - if($editor) - { - system $editor, $TEMP; - } - else - { - print "Could not find an editor to use!\n"; - exit(0); - } - # read it in ($note) - $note = ""; - open E, "<$TEMP" or $WARN = 1; - if($WARN) - { - print "...edit process interupted! No note has been saved.\n"; - undef $WARN; - return; - } - $c = 0; - while() - { - $note = $note . $_; - } - chomp $note; - close E; - # privacy! - unlink $TEMP; - } - else - { - $note = ""; - $line = ""; - # create a new note - if($NewType) - { - # be silent! read from STDIN until EOF. - while () { $note .= $_; } - } - else - { - print "enter the text of the note, end with .\n"; - do - { - $line = ; - $note = $note . $line; - } until $line eq ".\n"; - # remove the . ! - chop $note; - chop $note; - } - } - - # since we have not number, look for the next available: - $number = $db->get_nextnum(); - if($TOPIC && $CurTopic ne "") - { - @topic = split(/$TopicSep/,$note); - if($topic[1] eq "") - { - $note = $PATH . "\n$note"; - } - } - - - $db->set_new($number,$note,$date); - - # everything ok until here! - print "note stored. it has been assigned the number $number.\n\n"; -} - - -############################### DELETE ################################## -sub del -{ - my($i,@count, $setnum, $pos, $ERR); - # delete a note - &num_bereich; # get @NumBlock from $number - foreach $_ (@NumBlock) - { - $ERR = $db->set_del($_); - if($ERR) - { - print "no note with number $_ found!\n"; - } - else - { - print "note number $_ has been deleted.\n"; - } - } - # recount the notenumbers: - $db->set_recountnums(); - - @NumBlock = (); -} - -############################### EDIT ################################## -sub edit -{ - my($keeptime, $date, $editor, $TEMP, $note, $t, $num, $match); - # edit a note - $date = &getdate; - ($note, $keeptime) = $db->get_single($number); - if($keeptime eq "") - { - print "no note with that number found!\n\n"; - exit(0) if($mode ne "interactive"); - } - $TEMP = "/tmp/note.$USER.$$"; - open NOTE,">$TEMP" or die "Could not open $TEMP\n"; - select NOTE; - - print $note; - close NOTE; - select STDOUT; - $editor = &find_editor; - if($editor) - { - system $editor, $TEMP; - } - else - { - print "Could not find an editor to use!\n"; - exit(0); - } - $note = ""; - open NOTE,"<$TEMP" or die "Could not open $TEMP\n"; - - while() - { - $note = $note . $_; - } - chomp $note; - close NOTE; - - unlink $TEMP; - - if($KEEP_TIMESTAMP eq "YES") - { - $t = $keeptime; - } - else - { - $t = $date; - } - - # we got it, now save to db - $db->set_edit($number, $note, $t); - - print "note number $number has been changed.\n"; -} - - -sub dump -{ - my(%res, $num, $DUMP); - # $dump_file - if($dump_file eq "-") { - $DUMP = *STDOUT; - } - else { - open (DUMPFILE, ">$dump_file") or die "could not open $dump_file\n"; - $DUMP = *DUMPFILE; - } - select $DUMP; - %res = $db->get_all(); - foreach $num (sort { $a <=> $b } keys %res) - { - print STDOUT "dumping note number $num to $dump_file\n" if($dump_file ne "-"); - print "Number: $num\n" - ."Timestamp: $res{$num}->{'date'}\n" - ."$res{$num}->{'note'}\n"; - } - print "\n"; - close(DUMP); - select STDOUT; -} - -sub import -{ - my($num, $start, $complete, $dummi, $note, $date, $time, $number, $stdin, $DUMP); - # open $dump_file and import it into the notedb - $stdin = 1 if($dump_file eq "-"); - if($stdin) { - $DUMP = *STDIN; - } - else { - open (DUMPFILE, "<$dump_file") or die "could not open $dump_file\n"; - $DUMP = *DUMPFILE; - } - $db->set_del_all() if($ImportType ne ""); - $complete=0; - $start = 0; - while(<$DUMP>) - { - chomp $_; - if($_ =~ /^Number:\s\d+/) - { - if($start == 0) - { - # we have no previous record - ($dummi,$number) = split(/\s/,$_); - $start = 1; - } - else - { - # we got a complete record, save it! - $number = $db->get_nextnum(); - $db->set_new($number,$note, $date); - print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); - $complete = 0; - $note = ""; - $date = ""; - ($dummi,$number) = split(/\s/,$_); - } - } - elsif($_ =~ /^Timestamp:\s\d+/ && $complete == 0) - { - ($dummi,$date,$time) = split(/\s/,$_); - $date = "$date $time"; - $complete = 1; - } - else - { - $note .= $_ . "\n"; - } - } - if($note ne "" && $date ne "") - { - # the last record, if existent - $number = $db->get_nextnum(); - $db->set_new($number,$note, $date); - print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); - } -} - - - -sub interactive -{ - my($B, $BB, $menu, $char, @LastTopic, $Channel); - $Channel = $|; - # create menu: - $B = ""; - $BB = ""; - $menu = "[" . $B . "L" . $BB . "-List "; - if($TOPIC) { - $menu .= $B . "T" . $BB . "-Topics "; - } - $menu .= $B . "N" . $BB . "-New " - . $B . "D" . $BB . "-Delete " - . $B . "S" . $BB . "-Search " - . $B . "E" . $BB . "-Edit " - . $B . "?" . $BB . "-Help " - . $B . "Q" . $BB . "-Quit] "; # $CurTopic will be empty if $TOPIC is off! - # per default let's list all the stuff: - # Initially do a list command! - $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; - &list; - - for(;;) - { - $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; - undef $SetTitle; - if($CurDepth > 2) - { - print C $menu . $TOPICC . "../" . $CurTopic . $_TOPICC . ">"; - } - else - { - print C $menu . $TOPICC . $CurTopic . $_TOPICC . ">"; - } - - # endless until user press "Q" or "q"! - $char = ; - #$char = $term->readline(''); - chomp $char; - if($char =~ /^\d+\s*[\di*?,*?\-*?]*$/) - { - $ListType = ""; #overrun - # display notes - $number = $char; - &display; - } - elsif($char =~ /^n$/i) - { - # create a new one - &new; - } - elsif($char =~ /^$/) - { - &list; - } - elsif($char =~ /^l$/) - { - $ListType = ""; - &list; - } - elsif($char =~ /^L$/) - { - $ListType = "LONG"; - &list; - undef $SetTitle; - } - elsif($char =~ /^h$/i || $char =~ /^\?/) - { - # zu dumm der Mensch ;-) - &help; - } - elsif($char =~ /^d\s+([\d*?,*?\-*?]*)$/i) - { - # delete one! - $number = $1; - &del; - } - elsif($char =~ /^d$/i) - { - # we have to ask her: - print "enter number(s) of note(s) you want to delete: "; - $char = ; - chomp $char; - $number = $char; - &del; - } - elsif($char =~ /^e\s+(\d+\-*\,*\d*)/i) - { - # edit one! - $number = $1; - &edit; - } - elsif($char =~ /^e$/i) - { - # we have to ask her: - print "enter number of the note you want to edit: "; - $char = ; - chomp $char; - $number = $char; - &edit; - } - elsif($char =~ /^s\s+/i) - { - # she want's to search - $searchstring = $'; - chomp $searchstring; - &search; - } - elsif($char =~ /^s$/i) - { - # we have to ask her: - print "enter the string you want to search for: "; - $char = ; - chomp $char; - $char =~ s/^\n//; - $searchstring = $char; - &search; - } - elsif($char =~ /^q$/i) - { - # schade!!! - $| = $Channel; - print "\n\ngood bye!\n"; - exit(0); - } - elsif($char =~ /^t$/) - { - $TreeType = ""; - &display_tree; - } - elsif($char =~ /^T$/) - { - $TreeType = "LONG"; - &display_tree; - $TreeType = ""; - } - elsif($char =~ /^\.\.$/ || $char =~ /^cd\s*\.\.$/) - { - $CurDepth-- if ($CurDepth > 1); - $CurTopic = $LastTopic[$CurDepth]; - &list; - } - elsif($char =~ /^l\s+(\w+)$/) - { - # list - $WantTopic = $1; - if(exists $TP{$WantTopic}) - { - my %SaveTP = %TP; - $LastTopic[$CurDepth] = $CurTopic; - $CurTopic = $1; - $CurDepth++; - - &list; - - $CurTopic = $LastTopic[$CurDepth]; - $CurDepth--; - %TP = %SaveTP; - } - else - { - print "\nunknown command!\n"; - } - } - else - { - # unknown - my $unchar = $char; - $unchar =~ s/^cd //; # you may use cd now! - if(exists $TP{$char} || exists $TP{$unchar}) - { - $char = $unchar if(exists $TP{$unchar}); - $LastTopic[$CurDepth] = $CurTopic; - $CurTopic = $char; - $CurDepth++; - &list; - } - else - { - print "\nunknown command!\n"; - } - undef $unchar; - } - } -} - - - -sub usage -{ -print qq~This is the program note $version by Thomas Linden (c) 1999-2000. -It comes with absolutely NO WARRANTY. It is distributed under the -terms of the GNU General Public License. Use it at your own risk :-) -Usage: note [ options ] [ number [,number...]] -Options: --h --help displays this help screen --v --version displays the version number --l --list [] lists all existing notes If no topic were specified, - it will display a list of all existing topics. --L --longlist [] the same as -l but prints also the timestamp --t --topic prints a list of all topics as a tree. --T --longtopc prints the topic-tree with the notes under each topic --s --search searches for trough the notes database --e --edit edit note with --d --delete delete note with --D --Dump [ | -] dumps the notes to the textfile . if is simply - a "-" it will printed out to standard output. --I --Import | - imports a previously dumped textfile into the - note-database. Data will be appended by default. - You can also specify a dash "note -I -" instead of a , - which causes note, silently to read in a dump from STDIN. --o --overwrite only suitable for use with --Import. Overwrites an - existing notedb. --r --raw raw mode, output will not be formatted. Works not in interactive - mode, only on cmd-line for list and display. --i --interactive interactive mode -- if you run note only with one dash: "note -", then it will - read in a new note from STDIN until EOF, this makes it - possible to pipe text into a new note. - - o if you specify only a number (i.e. "note 4"), then the note with that - number will be displayed. - o you can specify more then one number for delete and display, for example: - "note -d 3,4" deletes #3 and #4. "note 5-7" displays #5, #6 and #7. - o if you run note without any parameter and if "AlwaysInteractive" in the config - set off, then note will create a new note and prompt you for new text. - o If it finds \~/.noterc, it will process it. Refer to the manpage for more - informations about the configuration. - o In interactive mode you can get help at any time by typing "?" or "h" at - the prompt. - o If encryption support is turned on, note will ask you for a passphrase every - time it runs. You can avoid this behavior by setting the environment-variable - \$NOTE_PASSWD. You will need this for example, if you call note from a script. -~; - #my ($package, $filename, $line) = caller; - #print "called from line $line\n"; - exit 1; -} - -sub find_editor { - return $PreferredEditor || $ENV{"VISUAL"} || $ENV{"EDITOR"} || "vim" || "vi" || "pico"; -} - -#/ - -sub format { - # make text bold/underlined/inverse using current $NOTEC - # s/\[([^]]*)\]/$param{$1}/g; - my($note) = @_; - if($FormatText) { - my $BN = uc($NOTEC); - my $_BN = uc($_NOTEC); - my $UN = $NOTEC; - $UN =~ s/<(.*)>/<$1_>/; - my $_UN = $UN; - $_UN =~ s/<(.*)>/<\/$1>/; - my $IN = $NOTEC; my $_IN = $_NOTEC; - $IN =~ s/<(.*)>/<$1I>/; - $_IN =~ s/<(.*)>/<$1I>/; - #$note =~ s/ (\*)(.+)(\*) / $BN$2$_BN /g; - #$note =~ s/ (_)(.+)(_) / $UN$2$_UN /g; - #$note =~ s/ (\/)(.+)(\/) / $IN$2$_IN /g; - $note =~ s/\*\*([^\*^\*]*)\*\*/$BN$1$_BN/g; - $note =~ s/__([^_^_]*)__/$UN$1$_UN/g; - $note =~ s/{{([^}^}]*)}}/$IN$1$_IN/g; - } - $note =~ s/(<\/.*>)/$1$NOTEC/g; - $note; -} - -sub output -{ - my($SSS, $LINE, $num, $note, $time, $TYPE, $L, $LONGSPC, $R, $PathLen, $SP, $title, $CUTSPACE, - $len, $diff, $Space, $nlen, $txtlen); - ($num, $note, $time, $TYPE) = @_; - $txtlen = ($ListType eq "LONG") ? $maxlen : $timelen + $maxlen; - - $note = &format($note); - - $SSS = "-" x ($maxlen + 31); - - $nlen = length("$num"); - $LINE = "$BORDERC $SSS $_BORDERC\n"; - $L = $BORDERC . "[" . $_BORDERC; - $LONGSPC = " " x (26 - $nlen); - $R = $BORDERC . "]" . $_BORDERC; - $PathLen = length($PATH); # will be ZERO, if not in TOPIC mode! - if($TYPE ne "SINGLE") - { - if(!$SetTitle) - { - $SP = ""; - # print only if it is the first line! - $SP = " " x ($maxlen - 2 - $PathLen); - if(!$Raw) { - # no title in raw-mode! - print C $LINE; - - print C "$L $NUMC#$_NUMC "; - if($ListType eq "LONG") - { - print C " $TIMEC" . "creation date$_TIMEC "; - } - else - { - print $LONGSPC; - } - if($TOPIC) - { - print C $TOPICC . "$PATH $_TOPICC$SP$R\n"; - } - else - { - print C $NOTEC . "note$_NOTEC$SP$R\n"; - } - - print C $LINE; - } - $SetTitle = 1; - } - $title = ""; - $CUTSPACE = " " x $txtlen; - $note =~ s/\n/$CUTSPACE/g; - $len = length($note); - if($len < ($txtlen - 2 - $nlen)) - { - $diff = $txtlen - $len; - $Space = " " x $diff; - if(!$Raw) { - if($num eq "-") - { - $title = $BORDERC . $TOPICC . "\"" . $note . "\"" . $_TOPICC . $Space . "$_BORDERC"; - } - else - { - $title = $BORDERC . $NOTEC . "\"" . $note . "\"" . $_NOTEC . $Space . "$_BORDERC"; - } - } - else { - $title = $note; - } - } - else - { - $title = substr($note,0,($txtlen - 2 - $nlen)); - if(!$Raw) { - $title = $BORDERC . $NOTEC . "\"" . $title . "...\"$_NOTEC$_BORDERC"; - } - } - if($Raw) { - print "$num "; - print "$time " if($ListType eq "LONG"); - if($title =~ /^ => (.*)$TopicSep (.*)$/) { - $title = "$1$TopicSep $2"; # seems to be a topic! - } - print "$title\n"; - } - else { - # $title should now look as: "A sample note " - print C "$L $NUMC$num$_NUMC $R"; - if($ListType eq "LONG") - { - print C "$L$TIMEC" . $time . " $_TIMEC$R"; - } - print C "$L $NOTEC" . $title . "$_NOTEC $R\n"; - print C $LINE; - } - } - else - { - # we will not reach this in raw-mode, therefore no decision here! - chomp $note; - $Space = " " x (($maxlen + $timelen) - 16); - print C $LINE; - print C "$L $NUMC$num$_NUMC $R$L$TIMEC$time$_TIMEC $Space$R\n"; - print C $LINE; - print C $NOTEC . $note . $_NOTEC . "\n"; - print C $LINE; - } - -} - - - -sub C -{ - my(%Color, $default, $S, $Col, $NC, $T); - # \033[1m%30s\033[0m - %Color = ( 'black' => '0;30', - 'red' => '0;31', - 'green' => '0;32', - 'yellow' => '0;33', - 'blue' => '0;34', - 'magenta' => '0;35', - 'cyan' => '0;36', - 'white' => '0;37', - 'B' => '1;30', - 'BLACK' => '1;30', - 'RED' => '1;31', - 'GREEN' => '1;32', - 'YELLOW' => '1;33', - 'BLUE' => '1;34', - 'MAGENTA' => '1;35', - 'CYAN' => '1;36', - 'WHITE' => '1;37', - 'black_' => '4;30', - 'red_' => '4;31', - 'green_' => '4;32', - 'yellow_' => '4;33', - 'blue_' => '4;34', - 'magenta_' => '4;35', - 'cyan_' => '4;36', - 'white_' => '4;37', - 'blackI' => '7;30', - 'redI' => '7;31', - 'greenI' => '7;32', - 'yellowI' => '7;33', - 'blueI' => '7;34', - 'magentaI' => '7;35', - 'cyanI' => '7;36', - 'whiteI' => '7;37' - ); - $default = "\033[0m"; - $S = $_[0]; - foreach $Col (%Color) - { - if ($S =~ /<$Col>/g) - { - if($COLOR ne "NO") - { - $NC = "\033[" . $Color{$Col} . "m"; - $S =~ s/<$Col>/$NC/g; - $S =~ s/<\/$Col>/$default/g; - } - else - { - $S =~ s/<$Col>//g; - $S =~ s/<\/$Col>//g; - } - } - } - return $S; -} - - - -sub num_bereich -{ - my($m,@LR,@Sorted_LR,$i); - # $number is the one we want to delete! - # But does it contain kommas? - @NumBlock = (); #reset - $m = 0; - if($number =~ /\,/) - { - # accept -d 3,4,7 - @NumBlock = split(/\,/,$number); - } - elsif($number =~ /^\d+\-\d+$/) - { - # accept -d 3-9 - @LR = split(/\-/,$number); - @Sorted_LR = (); - - if($LR[0] > $LR[1]) - { - @Sorted_LR = ($LR[1], $LR[0]); - } - elsif($LR[0] == $LR[1]) - { - # 0 and 1 are the same - @Sorted_LR = ($LR[0], $LR[1]); - } - else - { - @Sorted_LR = ($LR[0], $LR[1]); - } - - for($i=$Sorted_LR[0]; $i<=$Sorted_LR[1]; $i++) - { - # from 3-6 create @NumBlock (3,4,5,6) - $NumBlock[$m] = $i; - $m++; - } - } - else - { - @NumBlock = ($number); - } - -} - -sub getdate -{ - my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); - $year += 1900; - $mon += 1; - $mon =~ s/^(\d)$/0$1/; - $hour =~ s/^(\d)$/0$1/; - $min =~ s/^(\d)$/0$1/; - $sec =~ s/^(\d)$/0$1/; - $mday =~ s/^(\d)$/0$1/; - return "$mday.$mon.$year $hour:$min:$sec"; -} - - -sub help -{ -my $B = ""; -my $BB = ""; -my($S, $L, $T, $Q, $H, $N, $D, $E); -$L = $B . "L" . $BB . $NOTEC; -$T = $B . "T" . $BB . $NOTEC; -$Q = $B . "Q" . $BB . $NOTEC; -$H = $B . "?" . $BB . $NOTEC; -$N = $B . "N" . $BB . $NOTEC; -$D = $B . "D" . $BB . $NOTEC; -$E = $B . "E" . $BB . $NOTEC; -$S = $B . "S" . $BB . $NOTEC; - -print C qq~$BORDERC -----------------------------------------------------------------------$_BORDERC $TOPICC -HELP for interactive note $version -$_TOPICC $NOTEC -The following commands are available: -$L List notes. L=long, with timestamp and l=short without timestamp. - You can also just hit for short list. - If you specify a subtopic, then list will display it's contents, - i.e.: "l mytopic" will dislpay notes under mytopic. -$N Create a new note. -$D Delete a note. You can either hit "d 1" or "d 1-4" or just hit "d". - If you don't specify a number, you will be asked for. -$S Search trough the notes database. Usage is similar to Delete, use - a string instead of a number to search for. -$E Edit a note. Usage is similar to Delete but you can only edit note - a time. -$H This help screen. -$Q Exit the program.~; -if($TOPIC) -{ -print C qq~ -$T print a list of all existing topics as a tree. T prints the tree - with all notes under each topic. - - You can change the actual topic by simply typing it's name or by using - the command "cd", i.e. "cd mytopic". You can create a new topic by creating - a new note, the first line must be the topic borderd by slashes, i.e.: - "/newtopic/". The slash is the default topic-sepearator, but you can over- - ride this in the config! If you type just ".." instead of a topic, you will - go one step back in your topic-structure. -~; -} -print C qq~ -$NOTEC -All commands except the List and Topic commands are case insensitive. $_NOTEC $BORDERC -----------------------------------------------------------------------$_BORDERC -~; -} - - -sub display_tree { - # displays a tree of all topics - my(%TREE, %res, $n, $t, $num, @nodes, $firstline, $text, $untext); - %res = $db->get_all(); - foreach $num (keys %res) - { - $n = $res{$num}->{'note'}; - $t = $res{$num}->{'date'}; - # this allows us to have multiple topics (subtopics!) - my ($firstline,$text,$untext) = split /\n/, $n, 3; - if($firstline =~ /^($TopicSep)/) - { - $firstline =~ s/($TopicSep)*$//; #remove TopicSepatator - @nodes = split(/$TopicSep/,$firstline); - } - else - { - @nodes = ();("$TopicSep"); - $text = $firstline; - } - &tree($num, $text, \%TREE, @nodes); - } - #return if ($num == 0); - # now that we have build our tree (in %TREE) go on t display it: - print C $BORDERC . "\n[" . $TopicSep . $BORDERC . "]\n"; - &print_tree(\%{$TREE{''}},"") if(%TREE); - print C $BORDERC . $_BORDERC . "\n"; -} - - -sub tree { - my($num, $text, $LocalTree, $node, @nodes) = @_; - if(@nodes) { - if(! exists $LocalTree->{$node}->{$NoteKey}) { - $LocalTree->{$node}->{$NoteKey} = []; - } - &tree($num, $text, $LocalTree->{$node}, @nodes); - } - else { - if(length($text) > ($maxlen - 5)) { - $text = substr($text, 0, ($maxlen -5)); - } - $text = $text . " (" . $NUMC . "#" . $num . $_NUMC . $NOTEC . ")" . $_NOTEC if($text ne ""); - push @{$LocalTree->{$node}->{$NoteKey}}, $text; - } -} - - -sub print_tree { - # thanks to Jens for his hints and this sub! - my $hashref=shift; - my $prefix=shift; - my @notes=@{$hashref->{$NoteKey}}; - my @subnotes=sort grep { ! /^$NoteKey$/ } keys %$hashref; - if($TreeType eq "LONG") { - for my $note (@notes) { - if($note ne "") { - print C $BORDERC ;# . $prefix. "|\n"; - print C "$prefix+---<" . $NOTEC . $note . $BORDERC . ">" . $_NOTEC . "\n"; - } - } - } - for my $index (0..$#subnotes) { - print C $BORDERC . $prefix. "|\n"; - print C "$prefix+---[" . $TOPICC . $subnotes[$index] . $BORDERC . "]\n"; - &print_tree($hashref->{$subnotes[$index]},($index == $#subnotes?"$prefix ":"$prefix| ")); - } -} - - -sub getconfig -{ - my($configfile) = @_; - my ($home, $value, $option); - # checks are already done, so trust myself and just open it! - open CONFIG, "<$configfile" || die $!; - while() { - chomp; - next if(/^\s*$/ || /^\s*#/); - my ($option,$value) = split /\s\s*=?\s*/, $_, 2; - $value =~ s/\s*$//; - $home = $value if (/^Home/); - $libpath = $value if (/^LibPath/); - $dbdriver = $value if (/^DbDriver/); - $dbhost = $value if (/^DbHost/); - $dbuser = $value if (/^DbUser/); - $dbpasswd = $value if (/^DbPasswd/); - $dbname = $value if (/^DbName/); - $table = $value if (/^DbTable/); - $fnum = $value if (/^FieldNumber/); - $fnote = $value if (/^FieldNote/); - $fdate = $value if (/^FieldDate/); - $NOTEDB = $value if (/^NoteDb/); - $MAX_NOTE = $value if (/^MaxNoteByte/); - $MAX_TIME = $value if (/^MaxTimeByte/); - $CRYPT_METHOD = $value if (/^CryptMethod/); - $USE_CRYPT = "YES" if (/^UseEncryption/ && $value == 1); - $USE_CRYPT = undef if (/^UseEncryption/ && $value == 0); - $ALWAYS_INT = "YES" if (/^AlwaysInteractive/ && $value == 1); - $ALWAYS_INT = undef if (/^AlwaysInteractive/ && $value == 0); - $DEFAULT_LIST = "LONG" if (/^DefaultLong/ && $value == 1); - $DEFAULT_LIST = undef if (/^DefaultLong/ && $value == 0); - $ALWAYS_EDIT = "YES" if (/^AlwaysEditor/ && $value == 1); - $ALWAYS_EDIT = undef if (/^AlwaysEditor/ && $value == 0); - $KEEP_TIMESTAMP = "YES" if (/^KeepTimeStamp/ && $value == 1); - $KEEP_TIMESTAMP = undef if (/^KeepTimeStamp/ && $value == 0); - $COLOR = "YES" if (/^UseColors/ && $value == 1); - $COLOR = "NO" if (/^UseColors/ && $value == 0); - $TopicSep = $value if (/^TopicSeparator/); - $maxlen = $value if (/^MaxLen/); - $BORDER_COLOR = $value if (/^BorderColor/); - $NUM_COLOR = $value if (/^NumberColor/); - $NOTE_COLOR = $value if(/^NoteColor/); - $TIME_COLOR = $value if (/^TimeColor/); - $TOPIC_COLOR = $value if (/^TopicColor/); - $PreferredEditor = $value if (/^PreferredEditor/); - $FormatText = $value if (/^FormatText/); - } - chomp $home; - $home =~ s/\/*$//; # cut eventually / at the end - $HOME = eval($home); - if($NOTEDB =~ /^(~\/)(.*)$/) { - $NOTEDB = "/home/" . $USER . "/" . $2; - } - $libpath =~ s/\/*$//; - - close CONFIG; -} - - - - -__END__ -# -# $Log: note,v $ -# Revision 1.27 2000/05/16 23:51:35 thomas -# fixed many option-parsing related bugd! -# -# Revision 1.26 2000/05/13 01:05:17 thomas -# changed config format and fixed some bugs -# as well as some other additions... -# -# Revision 1.25 2000/05/11 23:42:43 thomas -# --tree changed to --topic -# -# Revision 1.24 2000/05/10 22:59:44 thomas -# updated usage to reflect --raw and build it into output -# and display subs. -# -# Revision 1.23 2000/05/10 22:19:04 thomas -# changed to Getopt::Long, added --raw -# -# Revision 1.22 2000/05/01 18:51:40 thomas -# added "-" to sub dump -# -# Revision 1.21 2000/05/01 00:17:27 thomas -# *** empty log message *** -# -# Revision 1.20 2000/04/30 23:31:38 thomas -# added -o and coloured sub help. -# -# Revision 1.19 2000/04/30 16:07:23 thomas -# *** empty log message *** -# -# Revision 1.18 2000/04/30 14:58:21 thomas -# updated the usage and help subs -# -# Revision 1.17 2000/04/30 14:44:38 thomas -# added colors to the tree functions -# -# Revision 1.16 2000/04/30 14:28:38 thomas -# added the t command, which displays a topic-tree. -# and enhanced the list command in interactive mode -# -# Revision 1.15 2000/03/19 23:41:04 thomas -# changed set_del, now no extra TEMP file is required! -# instead I get it from $this->get_all() ! -# Revision 1.14 2000/03/19 22:51:49 thomas -# Bug in NOTEDB::binary fixed, recount of nubers was -# incorrect. -# -# Revision 1.13 2000/03/19 11:53:32 thomas -# edit bug fixed (ude => uen) -# -# Revision 1.12 2000/03/19 03:06:51 thomas -# backend support completed. -# mysql and binary backends now excluded in separate files -# -# Revision 1.11 2000/03/18 00:16:47 thomas -# added NOTEDB::mysql and changed note to work with that. -# thus, from now on there is only one script to maintain and -# it is possible to provide more bacjends as well as making -# additional scripts upon them, i.e. cgi script... -# -# Revision 1.8 2000/03/13 22:48:43 thomas -# small width bug fixed -# -# Revision 1.7 2000/03/08 23:11:19 tom -# added cd -# -# Revision 1.6 2000/03/08 22:50:41 tom -# Added the $KEEP_TIMESTAMP option and fixed a bug regarding topic names -# and invalid resolution of them in case it started with "1 name". -# -# Revision 1.5 2000/02/25 20:59:30 tom -# corrected small timestamp problem in &edit and &new -# -# Revision 1.4 2000/02/25 13:24:11 tom -# fixed a small bug, that caused to use the last line for a note title instead the 2nd. -# -# Revision 1.3 2000/02/25 11:28:53 tom -# all changes from bin version applied to sql version diff --git a/note-1.0.7/stresstest.sh b/note-1.0.7/stresstest.sh deleted file mode 100755 index 4913a02..0000000 --- a/note-1.0.7/stresstest.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -# create notes with topics which then represents the corresponding -# directory structure. Depending on how many files the directory -# contains, the resulting note-database may become very large. -# It will then have thousands of notes! -STARTDIR=$1 -case $STARTDIR in - "") - echo "usage: stresstest.sh " - exit 1 - ;; - *) - LOCPFAD=`echo $STARTDIR | grep "^[a-zA-Z0-9.]"` - case $LOCPFAD in - "") - #echo nix - ;; - *) - STARTDIR=`echo $STARTDIR | sed 's/^\.*//'` - STARTDIR="`pwd`/$STARTDIR" - STARTDIR=`echo $STARTDIR | sed 's/\/\//\//g'` - ;; - esac - ;; -esac - - -stress () -{ - FILES="" - for file in `ls $1|sort` - do - echo "$1/$file" - if [ -d "$1/$file" ] ; then - stress "$1/$file" - else - #echo "$1/" > /tmp/$$ - #echo $file >> /tmp/$$ - #`cat /tmp/$$ | note -` - FILES="$FILES $file" - fi - done - echo "$1/" > /tmp/$$ - echo "$FILES" >> /tmp/$$ - case $FILES in - "") - ;; - *) - RES=`cat /tmp/$$ | note -` - ;; - esac - FILES="" -} - -stress $STARTDIR diff --git a/note.1 b/note.1 index 0c3d567..042a075 100644 --- a/note.1 +++ b/note.1 @@ -1,7 +1,10 @@ .rn '' }` -''' $RCSfile$$Revision$$Date$ +''' $RCSfile: note.1,v $$Revision: 1.1 $$Date: 2000/08/10 09:23:02 $ +''' +''' $Log: note.1,v $ +''' Revision 1.1 2000/08/10 09:23:02 zarahg +''' the new note manpage, source is in perl pod format ''' -''' $Log$ ''' .de Sh .br