redesign of system.db
authorVolker Birk <vb@pep-project.org>
Sun, 21 Feb 2016 21:44:32 +0100
changeset 4577802147af797
parent 456 59be449d1aca
child 458 72b4da3d4e2d
redesign of system.db
.hgignore
db/create_system_db.sql
db/sort.py
src/pEpEngine.c
test/Makefile
test/msg4.asc
     1.1 --- a/.hgignore	Sun Feb 21 21:17:31 2016 +0100
     1.2 +++ b/.hgignore	Sun Feb 21 21:44:32 2016 +0100
     1.3 @@ -13,6 +13,8 @@
     1.4  Release
     1.5  *.lib
     1.6  *.obj
     1.7 +.DS_Store
     1.8 +ws
     1.9  build-android/pEpEngine-android-1.zip
    1.10  build-android/third-party
    1.11  build-android/pEpEngine-android-1
     2.1 --- a/db/create_system_db.sql	Sun Feb 21 21:17:31 2016 +0100
     2.2 +++ b/db/create_system_db.sql	Sun Feb 21 21:44:32 2016 +0100
     2.3 @@ -1,17 +1,36 @@
     2.4 +-- DDL
     2.5 +
     2.6 +CREATE TABLE i18n_language (
     2.7 +    lang text primary key,
     2.8 +    name text
     2.9 +);
    2.10 +
    2.11  CREATE TABLE wordlist (
    2.12 -   lang text,
    2.13 -   id integer,
    2.14 -   word text,
    2.15 -   entropy integer
    2.16 +    lang text
    2.17 +        references i18n_language (lang),
    2.18 +    id integer,
    2.19 +    word text,
    2.20 +    entropy integer
    2.21  );
    2.22  
    2.23  CREATE UNIQUE INDEX wordlist_pk on wordlist (lang, id);
    2.24  
    2.25 -CREATE TABLE i18n (
    2.26 -    lang text primary key,
    2.27 +CREATE TABLE i18n_token (
    2.28 +    lang text
    2.29 +        references i18n_language (lang),
    2.30 +    id integer,
    2.31      phrase text
    2.32  );
    2.33  
    2.34 -INSERT INTO i18n VALUES ('en', 'I want to have this conversation in English language');
    2.35 -INSERT INTO i18n VALUES ('de', 'Ich möchte diese Unterhaltung auf Deutsch führen');
    2.36 +CREATE UNIQUE INDEX i18n_token_pk on i18n_token (lang, id);
    2.37 +
    2.38 +-- DML
    2.39 +
    2.40 +INSERT INTO i18n_language VALUES ('en', 'English');
    2.41 +INSERT INTO i18n_token VALUES ('en', 1, 'I want to have this conversation in English language');
    2.42 +
    2.43 +INSERT INTO i18n_language VALUES ('de', 'Deutsch');
    2.44 +INSERT INTO i18n_token VALUES ('de', 1, 'Ich möchte dieses Gespräch auf Deutsch führen');
    2.45 +
    2.46  -- add more languages here
    2.47 +
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/db/sort.py	Sun Feb 21 21:44:32 2016 +0100
     3.3 @@ -0,0 +1,74 @@
     3.4 +#! /usr/bin/env python3
     3.5 +
     3.6 +from argparse import ArgumentParser
     3.7 +from fileinput import FileInput, hook_encoded
     3.8 +import re, itertools, sys
     3.9 +
    3.10 +try:
    3.11 +    from math import log2
    3.12 +except:
    3.13 +    from math import log
    3.14 +    def log2(x): return log(x) / log(2)
    3.15 +
    3.16 +word = re.compile(r"(\S*?)(/|\s.*|$)")
    3.17 +unwanted = re.compile(r"(^\d|[^']*')")
    3.18 +space = re.compile(r'^\s')
    3.19 +
    3.20 +p = ArgumentParser(description="create dictionary csv out of hunspell data")
    3.21 +p.add_argument('--hunspell', '-H', type=str, default="/usr/share/hunspell",
    3.22 +    help='directory where hunspell dictionary files reside (default: /usr/share/hunspell)')
    3.23 +p.add_argument('--lang', '-l', type=str, default="en_US",
    3.24 +    help='use dictionary for language LANG (default: en_US)')
    3.25 +p.add_argument('--encoding', '-e', type=str, default="utf-8",
    3.26 +    help='file encoding (default: utf-8)')
    3.27 +p.add_argument('--full', '-f', action='store_true',
    3.28 +    help="full list - don't reduce to 65536 words")
    3.29 +
    3.30 +args = p.parse_args()
    3.31 +
    3.32 +try:
    3.33 +    from icu import UnicodeString, Locale
    3.34 +except ImportError:
    3.35 +    print("warning: PyICU not installed, using fallback", file=sys.stderr)
    3.36 +    def upper(x):
    3.37 +        return x.upper();
    3.38 +else:
    3.39 +    locale = Locale(args.lang)
    3.40 +    def upper(x):
    3.41 +        u = UnicodeString(x)
    3.42 +        return str(u.toUpper(locale))
    3.43 +
    3.44 +_all = (
    3.45 +    upper(word.match(line).group(1))
    3.46 +        for line in FileInput(
    3.47 +                args.hunspell + "/" + args.lang + ".dic",
    3.48 +                openhook=hook_encoded(args.encoding)
    3.49 +            )
    3.50 +        if not space.match(line)
    3.51 +)
    3.52 +_words = [w for w in _all if len(w) > 2 and not unwanted.match(w)]
    3.53 +_words.sort()
    3.54 +_words = [w for w, g in itertools.groupby(_words)]
    3.55 +
    3.56 +if not args.full:
    3.57 +    while len(_words) > 65536 * 2:
    3.58 +        _words = _words[::2]
    3.59 +
    3.60 +if len(_words) > 65536:
    3.61 +    if not args.full:
    3.62 +        _words = _words[:65536]
    3.63 +elif len(_words) < 65536:
    3.64 +    sys.stderr.write(
    3.65 +            "warning for {}: only {:.2f} bit in wordlist, that makes {:.2f} bit for 5 words\n".format(
    3.66 +                    args.lang,
    3.67 +                    log2(len(_words)),
    3.68 +                    log2(len(_words))*5
    3.69 +                )
    3.70 +        )
    3.71 +    _words.extend(_words[:65536-len(_words)])
    3.72 +
    3.73 +if not args.full:
    3.74 +    assert len(_words) == 65536, "lenght is {}".format(len(_words))
    3.75 +
    3.76 +for i, w in enumerate(_words):
    3.77 +    print("{l},{i},{w},0".format(l=args.lang[:2], i=i, w=w))
     4.1 --- a/src/pEpEngine.c	Sun Feb 21 21:17:31 2016 +0100
     4.2 +++ b/src/pEpEngine.c	Sun Feb 21 21:44:32 2016 +0100
     4.3 @@ -205,9 +205,11 @@
     4.4  
     4.5          sql_least_trust = "select min(comm_type) from trust where pgp_keypair_fpr = ?1 ;";
     4.6  
     4.7 -        sql_mark_as_compromized = "update trust not indexed set comm_type = 15 where pgp_keypair_fpr = ?1 ;";
     4.8 +        sql_mark_as_compromized = "update trust not indexed set comm_type = 15"
     4.9 +                                  " where pgp_keypair_fpr = ?1 ;";
    4.10  
    4.11 -        sql_crashdump = "select timestamp, title, entity, description, comment from log order by timestamp desc limit ?1 ;";
    4.12 +        sql_crashdump = "select timestamp, title, entity, description, comment"
    4.13 +                        " from log order by timestamp desc limit ?1 ;";
    4.14      }
    4.15  
    4.16      int_result = sqlite3_prepare_v2(_session->db, sql_log, (int)strlen(sql_log),
     5.1 --- a/test/Makefile	Sun Feb 21 21:17:31 2016 +0100
     5.2 +++ b/test/Makefile	Sun Feb 21 21:44:32 2016 +0100
     5.3 @@ -23,6 +23,7 @@
     5.4  
     5.5  clean:
     5.6  	rm -f *.o $(TARGET) *.a *~ $(UNIT_TESTS) pep_Dokument_Titel.pdf
     5.7 +	rm -Rf *.dSYM
     5.8  
     5.9  test: pEpEngineTest
    5.10  	LD_LIBRARY_PATH=~/lib:../src ./pEpEngineTest
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/test/msg4.asc	Sun Feb 21 21:44:32 2016 +0100
     6.3 @@ -0,0 +1,172 @@
     6.4 +From: Outlook Test <outlooktest@dingens.org>
     6.5 +To: Volker Birk <vb@dingens.org>
     6.6 +Subject: pEp
     6.7 +X-pEp-Version: 1.0
     6.8 +MIME-Version: 1.0
     6.9 +Content-Type: multipart/encrypted; boundary="74b0dc5119495cff2ae8944a625558ec"; 
    6.10 + protocol="application/pgp-encrypted"
    6.11 +
    6.12 +--74b0dc5119495cff2ae8944a625558ec
    6.13 +Content-Type: application/pgp-encrypted
    6.14 +
    6.15 +Version: 1
    6.16 +--74b0dc5119495cff2ae8944a625558ec
    6.17 +Content-Type: application/octet-stream
    6.18 +Content-Transfer-Encoding: 7bit
    6.19 +Content-Disposition: inline; filename="msg.asc"
    6.20 +
    6.21 +-----BEGIN PGP MESSAGE-----
    6.22 +
    6.23 +hQIMA0v8ThRgMMUcAQ/+PGzJ+Z4TXXVbDPxtEyEKOZR0Im5U9CzAP0kvA3uOmzii
    6.24 +mzgLKGOeSkdCUwm7V6+Gb7Eu2RafJf9z3qvuhaEYpr2eKQOB0ahs2/8PBd0hY3Zl
    6.25 +qNJIkkm5QZV4dv0RBmX/L3y1dEsehkBA2h06j5ROGGR2erF+kTjusUzy/ZWuMzph
    6.26 +L50yOZRc0PbJ4tedt7GwtcVYSLODJw5YYhXvgJblAgg/zUF8d2IetcHmvdotsPfI
    6.27 +PbvOncIXGU8HJBSIEgvHQvYcJaRkSPGws7yuo8wIWCahoNpUB0LxPJ+fP+UrV2tu
    6.28 +9hdpT0RvM8H52DxpA4iRVOwOSiC++hy5KajtBvua22KTOIMTyULHLUlRQti6pLgW
    6.29 +TGwupSbmrab90aU8cL+9FhmVrT5CiOdGRF6dVsJRuLcPgR/Thx7WrZQfltBaH/JV
    6.30 +wb8X1fKW+y/MLmL2IazWDkJ8OAKLm/jxJ4QNC1Bz6ohNMj77nRYlUikFDQKngfqi
    6.31 +IVzJxqQefsfqeWKgXUu3pJQpQN1Dxn3cY8FnZa0UfekTrvRaXSo3T+U2iZjfnB9z
    6.32 +oCX9nEly3VQim3ITXS8OidLLZDkEecFElYKO/hhcc8Nh2q0Sq1zsn83AojWLa0pP
    6.33 +3z6kMdU64FzTq5WXFTX43wDsGmcWzlvPr+b7aeBK6ES+nQ56eyylKTb4cRlxKZWF
    6.34 +AgwDG1JJ1ISHNiMBEACBn+YXFW++NUQz9eyQXi7Intxiqu/fUM4Tlg6OHK5TXQGI
    6.35 +OE8ygxQDTqNTVjDPesQnfuuvTDWOUGWh6tD92SQhsRVUQW+RX6WyhhqDcUzeyDZN
    6.36 +7mHmCPFaVbxH1YPKYN4JRg6P/GiOjm6rDIUGbZRVeTeK3CrTN8msceOaQsTOJma1
    6.37 +0pvgUJgho1sD9nQXrwCGDMhUjeEPvgIAlCYZsyN04WrxmIZBGzR8Is0mpS3+ij+n
    6.38 ++0truPG7phjVDG+c51lb9HXj8/6hX6PqaJ5XGraGuI4q/9F1lq2tVgXf+NO2WNRi
    6.39 +u7bXxJt6OsGtpOUHiN18QDAOXW7/PPKFSlpsz/K+n7QH1tDjY37lTliJxk20t387
    6.40 +Z7Fl4NPhCe1hBcl8LQD0mt0/O8S7NwozmOJ9dxZTiZnVSqAPudQpOxnMvd4Q7sdz
    6.41 +vvWftguPaMPetXUkYQ5SU69wvT2gqdQasngoLNrDJ6UhXkLnd8/Y0DGmsfleNUpg
    6.42 +Y+0658dKtyIxxLBA8ChyB6wpICXnYb/Rat0QE4lAAmQ033+zeFP28iNNZuFMTvQj
    6.43 +NdAi6/VSCE7Sx/27O5uWBo8eSMy+DFFAhTsJjsxzkxc1Q79W6/TxVEUjFuLWx/6H
    6.44 +le6Js+fPFdyywJqtXi/GU34Kh8GZhjmTc5OWc6+6pKHKN0A53E9OqNqKSLF2B9Ls
    6.45 +AVS+KYn1m6HAMEfpl1rJeoXgOSjGTgaZBckma7aRRI4zDuJZt7HkoiiCy4msQ7lf
    6.46 +hP4OYGP8I8iugo57pAUv6cN7DR0A5qvbLMsKFbvyxLoptyV5Mc9tYYiT3RahhmhF
    6.47 +07q1YAlwDxOel20XwER6dTlSgc58azhzJr03YrgnXaP5zwkyNZr0ZBtxLIQcJnDy
    6.48 +woHTXjh2onl6jwWubFCR9fPenkgYG/75AEEnH6eFIr8CnigJphofT6Ysbaag3K40
    6.49 +CNTAtVcTDaFwRFnTL2CaOms0c/TRxzV63LEzpapf3EyoSjrbe3jgPa2SV/wkBCYo
    6.50 +jgek5Qsvh58fpEPn/VCnrWtNrnGtzCVYUiVl8vbEzrXBzB7ibwtM35wsarNI+5M/
    6.51 +gByAbuE+Ex6U3vz1rdvYEU3sB2XmRmITDZgHd+T/w7QYMotE2ZhThvQSs1v6jXb9
    6.52 +OnocOSjqic/68XaAR6SiCvtOkA05FRrZzaz11H26kwx0VE5F5zuaXW9r0SN+6cIB
    6.53 +GCWXaWiMXKPRkwbSkdFORl54yo4DppvL2l0JWUsvz7mjZpNL4z7+CjCks6/0cscp
    6.54 +M1bY6pGuSympkNyfIsTIwgs9N2b/cNOSYMXEuaRGoFuXFsiM5sKz7j+W8gCwYWeG
    6.55 +nMwDn/VaF3qdJAR1e3O/XjelxIxIRV6YoUqeFjT6ECTvt81KnI4ovBoixgcue1gV
    6.56 +foRsVD8IGWg/FqC0bGIh53AZEMkIRNzaug8/OJGEu0eJGGcrXFTTJMXIw76cg3e2
    6.57 +058wUcmtGwKIuGM+w633I7lajpwuWw0ctGuqJ1JGP0J+KbOODSaUrauhPL3J8Yx0
    6.58 +t7W1MKoFgCOmouXtR1/Fvo0+NHtGVlAV+D+4RK1K8DrdCZvqIwzQOdWcvr8BOYCD
    6.59 +VFp/Wh6I4GOQTUxq3QARo78cn0nGdfznTPdoCM6WEM7gJDVPl3j9mldQ4PhCOIDr
    6.60 +j8ks8pYxxoHVVwB1XNmGn2LlaKLVebcVCNMR7NWc/VxhJxLtX2OKwzG+kuQrDSKP
    6.61 +a1Jpx2+V8cSAIN6flbab8YivDg48G/qUE0eKIYyKZ5vTu5+IcA5z9b1ANnnk7+x6
    6.62 +8JCWJhdbdGG9gVgR3iWti7V+pHaZ7pBiOlG7RA4x+lrj8uU8pQ0bMUyojeFpEJx0
    6.63 +/+oKqCo91cC+KixPPMFy1MS3tZbF//IrXTHAY3+jo3G8gVGubOtjVd9KcIiBWkZi
    6.64 +FWUFkk09Xv1/Niu85WEV9vlTrLNp3hqExKU96GnSOPFm0vUTDCS9mW5fRtmkE36T
    6.65 +rNx1KuzAq6vusjQUO8veok310jjMqyhusBSsVoB3o0j3rA2g47SmrwVuyz5BeMkm
    6.66 +5BSBBmyz9REzgv75pli8LCeqJ7eVJGqLVHWQmOIXk3+Nzpw0kKozYcs1YDJPTZ4H
    6.67 +ikNUSXjfr0byfsTibU6txR5pNOg+8mLquI+Cr3Le7YouKVVqfMs1FABifRQ5zNiL
    6.68 +hmrGDRGmAirCCMjgVulg0q+al8a8HDAgW5LewvmAwqVN1s3T3L6nkeT76O7qvwPV
    6.69 +ky3/uz7PJb/H30KCGYPrDSeW0bl5+kBXf8+UtkRNFTYYITH3tieH+SkQM+HL8rfO
    6.70 +JiMNGAxESQtdEeouvY9JClmpI8CKEoe7rdE8eXWR0WOv62dq9JHL5E39fw2GzoL0
    6.71 ++ADu3pP47jrYmErCEj5noYCnBj5zZGoAEplfCA7YrYnROuQOpyUmwi86NttmQZph
    6.72 +g3nMEPtfKSX8D+h9lug7+DC9+lSo4QIpJSV0zuN95se63y8Hh65xzvrTWZfiBlKS
    6.73 +TdygRJJO1JyscC7JU8vFuOJ0oXOnZjOco3AkYtCdIdjZxBZK6wihjaWQIz9argyl
    6.74 +//iSol0IGdf0wXUaQUBiTj26bCUMshRgiTXeczHdUTB/QGhJDTdBPN+6f+eVrfCd
    6.75 +dlNPOm4SIuvJr05eKfHUsv7niVcCLxHPKOhkq0rERpsh4qnDpmvPZptM8kOAEpdA
    6.76 +8wz4UbmrAcYvm4srcNPn0wI4UNIZ2b5e6EibIFGewv9nhAon7JjmmEcwaDPcePSX
    6.77 +LuADWWPykTXt2rR/mXZGXkHTd+qgyMs/Xps9JLWiJTcR7tCtyfjhx53HIWj5JLn8
    6.78 +ZBNRIHvlFn/2VGW2hFJOOwdp8hpiV3InjmQucBbDxWVFK621TYsgUt5KI9rW/E+H
    6.79 +e1HbIDc/Dbb9Nkr1ol9262h3SwzWq3OANeDB42HL3WWP2e3ZVkYjBRl3ODKNMnyP
    6.80 +wmxeOID85lmLWFN6FDvzKbXSy6idGHy5NqRs4N4kGYsM+9Wm330hC3p2ZJ5M7DQQ
    6.81 +RaxdsRkEtwee88rJW1raOrC+/R94XTV3mqfRYhT51XO1k+eppsN2qkioLGMbp/17
    6.82 +9KmAUx7vBiuGkhcqShSocCATAyd3NuwKig7Ei9bBA5MNO9t9ybP3sNyOe2PoYShx
    6.83 +7NFuSKxJBViFx0CQpu8HIanzVq896bd8FB4B1dTOI4Nu2U6MJDd7R33kZVSTB3LY
    6.84 +o/U/P+/C6t8LRCs5sb0ElEGZCBXP2UCKq2TODjfagv+1g8l9z7mqGXv1IiithgMK
    6.85 +Un70eINqtMAoHvhrQw+MFMPEsoW+XqvARCQzW3A2smgHbsSaa9Z6Jsz03OQ3MRNY
    6.86 +k9kHAEgu+XSPTKVO1yXagL7P6mijDzW/UAmzi6DOh2ug+S5snn6TLuSswM9HSfJF
    6.87 +zG9ujpRoGNpRTtGsAIM0fa2iYd5chCBQDw03ofVmsFvSfxlnAe15aIBb+wWmCDYO
    6.88 +Pw29FtNT0v05nGXimv1OghBH58Ud5IDRP+TbkejvHP34NzANSdmVO0zS6jqG8gqc
    6.89 +iyN8yyvs9KPO+1Gm4Un7jW0w7FrNma1RVD/I5GzUp8J4zj1fZbQ0V6g1ob1H3sZ3
    6.90 +bqpqBaJCt+o9i9KjpDWjmhfDaU/OFbtHHz7/3KY+uemFFShilbBjCpjo+5LmYVWQ
    6.91 +QjaZmJ1K66Mi5EbgTrFaqjPn5CXf14HItyrHA5UdZKFoKlHtbQI+kowVTUvfpkQZ
    6.92 +jrGlwSUUikILnRmUEybJTQWxIGygvnCwm4p3f84p1IrsaNb8qEvVJ+/l8R3f6/TS
    6.93 +V7khFcVGc1Nx3NULc62fjFHZTP7+uANCCfjfP1QtN2DgVz2glMDOLmUZmCQkb7Er
    6.94 +nZUxjNReQf31u3xkyBK9gxu62ZsKArwg2SLcS7fOz6smq9U87/qd7HIWj7aHJx53
    6.95 +9/zdPHzNVhyPPuWw3Pag03+laUuBFR5wZ+hyn555e3GZE+K6EIylbES0cbXCGZOr
    6.96 +ZcIkrCVijL+VlJDXG5j1IdevvVin5BfOsIWMkKrnuPrSvWnM6SVypDd5XBaOZbgG
    6.97 +nWK5BYvbdyWCKQqoSIdN6h2qGtSmRuu+Ma4LHz5vwHKY2J1gvP8bXxgXebz17Odz
    6.98 +Wh/o7xPBLbadAhUAdXHnahWUvzZ02i0snq42Pxe0OawSJ9e4SybykT/e6+TyaGw8
    6.99 +uN3klfpy+jilThLaqjuiS3gcaNYiX02t5auM6kQuKWBmGozBcIbJx2yMyRSJ1ZSI
   6.100 +Ikv/u2CD9X84XOSmrT1zLrQyJNfmyRyiZHHla9zNaX51oG6DuBuk7zuSJSXbX6g6
   6.101 +3mMV2INzQcIlZ7fnRnqaBWPQTTf/MhZADk8/r6wZYZulbIly7+tPuZhJzVHN4gnZ
   6.102 +VRNM868RJ+LObqCKhibtMa9Fq1vT9FTxZP+WTRXA8pD5WRFzLG8IvVy7HPcG5SE4
   6.103 +ugnt+ScSSpCeBCbQWn7YAW8tu5u4a4YWEwHrYsur7dcR0s4Evz/k5R/1NyqRlA0s
   6.104 +7vBZWIEL+lQQWi7PkZaQUt2I83FUdIkBrENHadG7OkV0Z57Ck2FmCH0PVS6H2vKz
   6.105 +Fzl9gL1SwrOdgjUXMiDv6DpiqNQZhbFV0Zszm+jjaJ1LRqaA1MHoL+dMqq8s1N0x
   6.106 +MMQ18SszTHKa2LyrReBshvpjnfUZQTLNp2A033nb97mmrZ+tigVfUguEbb7sUI76
   6.107 +AnYGDps4RLJh62odiQ3fjIOKrdTdMgoON5RGebgHnRKlU3647NwKEjgO9zpFhAhd
   6.108 +ZRw5IVbEXNfRlFzdsfqrGx5vkZZrNKrd5wXN40GQQ2Kuxf4qviI9Lp0+z7z3nCJI
   6.109 +h6eqGQNn7XyMuSUp9cLEq2eS9Dv3PFZlZY80ygpbsGlV5/pKVZxZAZQVJ2TQ2EYP
   6.110 +osWrsJUJrYlxBoNjI1jZ+0eicBBuAsVxCBZwOxGNwluimjfOb4mcCy2I95zAy6h/
   6.111 +bLgnledQzyz0WYgJfhCmzaHeg0ORtqjSK9X8klpBZrZP0awhl08dOknVR/m3D+Z1
   6.112 +hgaMQhWgdYXfA7ASpjgGAp2Qht/6K1gZmzCKrilAm4nVUdVXISMWFQppol3dRqAK
   6.113 +cy6W3qBitJOxdBYtbaX0JtZlTj2ax5UD9acjbkLnB3JX5ciivN124OhHff8sBUnN
   6.114 +NrAvwZnn1YwPqinNXxslIaEl4vu+YxuCsHK/QhnbLzntf4vBpIFn1htyFCQiAOOa
   6.115 +Z6bCZo3peevgjqoPqkz9lNMNuNNTqP2dezl3rOoxnowLQM9DzzPDeSY/Q+XIspc0
   6.116 +lTrZwPUh67eadDYJQb1trDdSO/VxG+GhliuW3y4dSPSsYcM8MwN/KbrmG1AaHg4M
   6.117 +S8Mhm44suU152fTHgCAsp24fbdql5cxez390W6iEyv+ll9PCaBqKmZmXByrcjoMn
   6.118 +Peu5t081wfMBiAxjRKRA9jR4UMFjfcGJsRLe0pvCuYOpOZoZRXejjk57vZP2dDa9
   6.119 +KK1cxeBiKTaB/iVwdEkH0wR8Ub8NS+4i9o4y7cXMD5+TyaCcb64wAWfm3v4g1u7b
   6.120 +3cCKwQ7YG4Xro64v79YUJDK4m9F7LQySCA44Cl4RoL5i4OILObFaujQpajxsW2jY
   6.121 +GKLBcmWUamVYNi1rTKRTdmmJ0y7P1TJ0TTT5GNe9IyTll0zBZ0bx4JmxfTVLWLoK
   6.122 +6AFopQ6dTMYWAXyxxwoMU5i+09AvsapeF/pOM34TYGYF91XDaHEjqaLrF2SRAc+a
   6.123 +PzwdxKzNFThpwaAoZNWDG6/WrX8InKmGrkqowDlnOU2k3ng9r/+y1sqMNxm5hFpJ
   6.124 +X1mKFatZE0PeLROMp9hoM8U90A/JP9GQRbEnQiPbBg2Zf7GDOp7Vea6kRz96XmAk
   6.125 +cLFTa/zTCPd4DXXw92DOWtzXIOOvyzmwUDzOmYhPZlYc45Ouz6W/f24W47l1ovdO
   6.126 +oAtUH5AV/+wo9o0rkWM49B/opGjws1Om2EOH/+YSJcHdnxXPP96nbB6V6tWwyi4R
   6.127 +w4fJvihwtZNtsMoDEFJ2q2tDp3rP6TqBCazHLExEhX2RtN7Xqow/y2GADdL/WSdY
   6.128 +Porloo4KreO4R0HcbvJpOP5gUjxtYePH82r1sU0093q8XEnYPEBnElF/njoL3jZc
   6.129 +dhD8q5UdimO3rUzt1ojYSQdpfoOYd3KMcePyJoPf/WibptlPG2XG/amtKML0aDFm
   6.130 +BIbvq6bzJxw+eBikLBU58+pqUhPXF9rniA3tn0dS5D2u9QwAKWXLD9i5HfliUhxc
   6.131 +0Mb2HDufTqGwFVLg3zMql8HPAnIiVVCTKgUZTUWXrWic/Zc9fJC8S+u3DLtLVITL
   6.132 +kTNFw1JXdNiliYwH+XoAFPoETyjdJ7Cyur/5jkE/1/7Q783pgWAJrldl+KQ9CsBi
   6.133 +N8IycqYwZq1E6DLXtSbK00uLcYlHBrdNdTo8t5bjLL3iE3NgfDA375jR/ES3GyFT
   6.134 +drV03QwXf/lAHRywlaEjPkvQTAnpJeqVPsZZrpPTDqPE2hpOq1aKBVxlImB2D0/v
   6.135 +c/mwK3GrBhmxvCRou+Z/RSzpYK5RCPdJK8hgriA7VfT5vQsWN2RGUiXxCoBxikWj
   6.136 +zp8ClcxaDp/7DabvR1gmiNmsroAyUCTQNlioPE/FYCXVW6CTmgyPIV3GbxTxIFtX
   6.137 +bwollEayj79NLVkphR/qyy0J66qPvyBmNfVH9UNryEhLuhiR5ZVinEPgEuBxgbDn
   6.138 +jif1p4BAW9nVXJNfXEh7eWWDiEjSj6OZtiHABIBW0bCtr37B/tvMenqcpBk+zPBF
   6.139 +0tzizDMuHoEfNsatyMarUuJiH96pkisQgTXZ9VGbx8gw1G8fTJPDFa2UciHPEawL
   6.140 +IpjReWclDpoVtsU5NVZRFJvUdv6VtBAZpY2eKIXQ4vrRDv7rW303jqf/+H2oiQav
   6.141 +Bx2UR3HixlZffE0sUmga8kOpQWaCIOCrrk43IhFqXEC1ivXZb2M25u95EEX8p0cM
   6.142 +bzEblS5eHj3UIRvBsgOtKGSnIaCBwIjllRl8nT+AYV8HZrXORyAHC2Jfyi7Ov8TJ
   6.143 +1meGe+EJU9ERoiXYtgT/a1s14BHMODb84DsC8gfSpbRm02WE3rrQV7W6nucPX7G7
   6.144 +cNT2Kr1Y0+PEY9dITVPahnYChDPw1G7JzMQkPhg6BmXnKU1+mBwrTYjrZFyH0XDp
   6.145 +sM6GKwboLbjGS5DURRZgyWguYrDF9LSBi4mFPk1DqfewGFt/nE1TcWMB3fCVOnw1
   6.146 +L3zAIAZalyKLYToTwdZ6P94djU565CT+jldxWBX1zxHA+9xPy+vjyagWG+47caHG
   6.147 +xonCZJpA3jxzpyPJ2ZqFmPhiXTiXd9PmNxnUzsOgloNAcFPNLDufoAY69XlrPEr0
   6.148 +HhkCV3FamCizZVwWhaBS157YkucsGc4/pJlg5w+lLPhjtzkEn9FgvprUXw3gnHlA
   6.149 +a5jZekDRvfjRRo5sXd1ScCZp5+pC5QSiBExQgTXIeLnGlR+ZhhCYXrlg7u+smfON
   6.150 +GnVXEuYopH1wS2PbGDklTbGySK73Epmq6p5XjYvTVkj8Pcm7FxMkwV8qDkvHsntf
   6.151 +Kb5t8Nawb2Wwu2g/rMN/Dq5uNyMR6fQQ/ucOmu9k2hQ26RSZkTB7/2CStHAikcCi
   6.152 +C2IVDsN9LEJ2Orxfupju+0SDpHKesY+rM/KVkYmuEcE387VjoNXQJZwXF90UM36j
   6.153 +vHXfug0mg0DOT5K+qalcu6dDJIBScJFq+TuUdFa5WMuziEi36/tmx/Uyq6/qh9E+
   6.154 +koKuer1w0KWqt4rPD5x9Im+cvkhdvdT9o1o3OGsXaDlXWAOvEIQtjZvY6bitcqQO
   6.155 +iVL+TZPlb778SxQrZtHcNAXjq0ikvx7OfjA9gaHdKMgMjEp12oryvprnzaY1NGJc
   6.156 +yyBj/qn/i7rZx1bToUPDHxPqceHJrCCrIhuzER4zhmRszUUOUabEAEIjwfY0Aqic
   6.157 +kVqXOZVH/rxLdUeP3Bai1C1Kii3DelAc2mBBSNT0xaLMHIaiQccjL408ctvz67Kk
   6.158 +uQ33rDwhMm5znBCwDnXOwSAoqX9JoyfoqI/6QBYnOUhqSage+2G95i9OAe8QJ0mT
   6.159 +wZYT9NOonVWmBJD2329ze5JNpRbtxoSpPbHp6oRZ44pa1zTnHlRpSEL82oq6u1/U
   6.160 +GnfwvWiDgk0AQyk9a60hhZf/Wc/Gya6z0dRN98Fr9xjbeqsn5wZwrWV0EmWKKU9k
   6.161 +ZCU8AyvTAaxrxzGh6d2HgBRuJz2vFUxX9JX3ulmOR6yPUmm6I2p7xKSZMxy9pASH
   6.162 +tg+/vi+R3gwu1ISDeRSnRIc1oxnoPqt5smgV0cDD8rxB4WmJjBGTHus/mFToNomB
   6.163 +gJt6KdfJy3TRFuBBp7f9dm2XeqgVoJjSJIFZrA0fseWw56G5CxA5FxlOSUb8lx22
   6.164 +9XxHRCzeBLfjJBy0NRWlT38vl7+TaRZjwlWiMOU+vXTKqnJYGqnap3Dw1j33Q9BP
   6.165 +Se12IRoCWcAAmiAfd5x9nIhCOXy11ldhjsVGuOrwAFU4Uqxhbwo=
   6.166 +=R4JX
   6.167 +-----END PGP MESSAGE-----
   6.168 +YAW8tu5u4a4YWEwHrYsur7dcR0s4Evz/k5R/1NyqRlA0s
   6.169 +7vBZWIEL+lQQWi7PkZaQUt2I83FUdIkBrENHadG7OkV0Z57Ck2FmCH0PVS6H2vKz
   6.170 +Fzl9gL1SwrOdgjUXMiDv6DpiqNQZhbFV0Zszm+jjaJ1LRqaA1MHoL+dMqq8s1N0x
   6.171 +MMQ18SszTHKa2LyrReBshvpjnfUZQTLNp2A033nb97mmrZ+tigVfUguEbb7sUI76
   6.172 +AnYGDps4RLJh62odiQ3fjIOKrdTdMgoON5RGebgHnRKlU3647NwKEjgO9zpFhAhd
   6.173 +ZRw5IVbEXNfRlFzdsfqrGx5vkZZrNKrd5wXN40GQQ2Kuxf4qviI9Lp0+z7z3nCJI
   6.174 +h6eqGQNn7XyMu
   6.175 +--74b0dc5119495cff2ae8944a625558ec--