From 21864c3aa836a12b129b2ffcee63c1b3a07f840c Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Fri, 13 Oct 2006 11:01:14 -0400 Subject: [PATCH 01/53] XSLT as a filter and with parameters --- planet/config.py | 2 +- planet/shell/xslt.py | 62 ++++++++++++++++++++++++++------ tests/data/filter/translate.ini | 7 ++++ tests/data/filter/translate.xslt | 20 +++++++++++ tests/test_filter_xslt.py | 25 +++++++++++++ tests/test_filters.py | 2 +- 6 files changed, 106 insertions(+), 12 deletions(-) create mode 100644 tests/data/filter/translate.ini create mode 100644 tests/data/filter/translate.xslt create mode 100644 tests/test_filter_xslt.py diff --git a/planet/config.py b/planet/config.py index cd6a997..99d3cda 100644 --- a/planet/config.py +++ b/planet/config.py @@ -32,7 +32,7 @@ from urlparse import urljoin parser = ConfigParser() -planet_predefined_options = [] +planet_predefined_options = ['filters'] def __init__(): """define the struture of an ini file""" diff --git a/planet/shell/xslt.py b/planet/shell/xslt.py index 593f7b9..ecdd673 100644 --- a/planet/shell/xslt.py +++ b/planet/shell/xslt.py @@ -1,5 +1,19 @@ import os +def quote(string, apos): + """ quote a string so that it can be passed as a parameter """ + if type(string) == unicode: + string=string.encode('utf-8') + if apos.startswith("\\"): string.replace('\\','\\\\') + + if string.find("'")<0: + return "'" + string + "'" + elif string.find("'")<0: + return '"' + string + '"' + else: + # unclear how to quote strings with both types of quotes for libxslt + return "'" + string.replace("'",apos) + "'" + def run(script, doc, output_file=None, options={}): """ process an XSLT stylesheet """ @@ -12,6 +26,22 @@ def run(script, doc, output_file=None, options={}): except: # otherwise, use the command line interface dom = None + + # do it + result = None + if dom: + styledoc = libxml2.parseFile(script) + style = libxslt.parseStylesheetDoc(styledoc) + for key in options.keys(): + options[key] = quote(options[key], apos="\xe2\x80\x99") + output = style.applyStylesheet(dom, options) + if output_file: + style.saveResultToFilename(output_file, output, 0) + else: + result = str(output) + style.freeStylesheet() + output.freeDoc() + elif output_file: import warnings if hasattr(warnings, 'simplefilter'): warnings.simplefilter('ignore', RuntimeWarning) @@ -20,16 +50,28 @@ def run(script, doc, output_file=None, options={}): file.write(doc) file.close() - # do it - if dom: - styledoc = libxml2.parseFile(script) - style = libxslt.parseStylesheetDoc(styledoc) - result = style.applyStylesheet(dom, None) - style.saveResultToFilename(output_file, result, 0) - style.freeStylesheet() - result.freeDoc() + cmdopts = [] + for key,value in options.items(): + cmdopts += ['--stringparam', key, quote(value, apos=r"\'")] + + os.system('xsltproc %s %s %s > %s' % + (script, ' '.join(cmdopts), docfile, output_file)) + os.unlink(docfile) else: - os.system('xsltproc %s %s > %s' % (script, docfile, output_file)) + import sys + from subprocess import Popen, PIPE + + options = sum([['--stringparam', key, value] + for key,value in options.items()], []) + + proc = Popen(['xsltproc'] + options + [script, '-'], + stdin=PIPE, stdout=PIPE, stderr=PIPE) + + result, stderr = proc.communicate(doc) + if stderr: + import planet + planet.logger.error(stderr) if dom: dom.freeDoc() - if docfile: os.unlink(docfile) + + return result diff --git a/tests/data/filter/translate.ini b/tests/data/filter/translate.ini new file mode 100644 index 0000000..0d34e74 --- /dev/null +++ b/tests/data/filter/translate.ini @@ -0,0 +1,7 @@ +[Planet] +filters = translate.xslt +filter_directories = tests/data/filter + +[translate.xslt] +in = aeiou +out = AEIOU diff --git a/tests/data/filter/translate.xslt b/tests/data/filter/translate.xslt new file mode 100644 index 0000000..25968d7 --- /dev/null +++ b/tests/data/filter/translate.xslt @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_filter_xslt.py b/tests/test_filter_xslt.py new file mode 100644 index 0000000..ca7994e --- /dev/null +++ b/tests/test_filter_xslt.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import unittest, xml.dom.minidom +from planet import shell, config, logger + +class XsltFilterTests(unittest.TestCase): + + def test_xslt_filter(self): + config.load('tests/data/filter/translate.ini') + testfile = 'tests/data/filter/category-one.xml' + + input = open(testfile).read() + output = shell.run(config.filters()[0], input, mode="filter") + dom = xml.dom.minidom.parseString(output) + catterm = dom.getElementsByTagName('category')[0].getAttribute('term') + self.assertEqual('OnE', catterm) + +try: + import libxslt +except: + try: + from subprocess import Popen, PIPE + except ImportError: + logger.warn("libxslt is not available => can't test xslt filters") + del XsltFilterTests.test_xslt_filter diff --git a/tests/test_filters.py b/tests/test_filters.py index e8c5633..aac71f2 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -92,6 +92,6 @@ try: del FilterTests.test_xpath_filter except ImportError: - logger.warn("Popen is not available => can't test filters") + logger.warn("Popen is not available => can't test standard filters") for method in dir(FilterTests): if method.startswith('test_'): delattr(FilterTests,method) From 002471fc680c379c22ef6d5e5e7ee552fb91a1f7 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Sat, 14 Oct 2006 09:05:10 -0400 Subject: [PATCH 02/53] Recapture outputs as inputs for tests --- tests/capture.py | 10 ++++++---- tests/data/apply/feed.xml | 2 +- tests/data/config/opml.xml | 4 ++-- tests/data/splice/cache/example.com,3 | 2 +- tests/data/splice/cache/example.com,4 | 2 +- .../cache/planet.intertwingly.net,2006,testfeed1,1 | 2 +- .../cache/planet.intertwingly.net,2006,testfeed1,2 | 2 +- .../cache/planet.intertwingly.net,2006,testfeed1,3 | 2 +- .../cache/planet.intertwingly.net,2006,testfeed1,4 | 2 +- .../cache/planet.intertwingly.net,2006,testfeed2,1 | 2 +- .../cache/planet.intertwingly.net,2006,testfeed2,2 | 2 +- .../cache/planet.intertwingly.net,2006,testfeed2,3 | 2 +- .../cache/planet.intertwingly.net,2006,testfeed2,4 | 2 +- .../cache/planet.intertwingly.net,2006,testfeed3,1 | 2 +- .../cache/planet.intertwingly.net,2006,testfeed3,2 | 2 +- .../cache/sources/tests,data,spider,testfeed0.atom | 2 +- .../cache/sources/tests,data,spider,testfeed1b.atom | 2 +- .../cache/sources/tests,data,spider,testfeed2.atom | 2 +- .../cache/sources/tests,data,spider,testfeed3.rss | 2 +- 19 files changed, 25 insertions(+), 23 deletions(-) diff --git a/tests/capture.py b/tests/capture.py index 09f4558..1e577b6 100755 --- a/tests/capture.py +++ b/tests/capture.py @@ -20,7 +20,8 @@ import planet from planet import spider, config planet.getLogger('CRITICAL') -spider.spiderPlanet('tests/data/spider/config.ini') +config.load('tests/data/spider/config.ini') +spider.spiderPlanet() if os.path.exists('tests/data/splice/cache'): shutil.rmtree('tests/data/splice/cache') shutil.move('tests/work/spider/cache', 'tests/data/splice/cache') @@ -31,7 +32,7 @@ dest1.write(source.read().replace('/work/spider/', '/data/splice/')) dest1.close() source.seek(0) -dest2=open('tests/data/apply/config.ini', 'w') +dest2=open('tests/work/apply_config.ini', 'w') dest2.write(source.read().replace('[Planet]', '''[Planet] output_theme = asf output_dir = tests/work/apply''')) @@ -41,12 +42,13 @@ source.close() # copy splice output to apply input from planet import splice file=open('tests/data/apply/feed.xml', 'w') -data=splice.splice('tests/data/splice/config.ini').toxml('utf-8') +config.load('tests/data/splice/config.ini') +data=splice.splice().toxml('utf-8') file.write(data) file.close() # copy apply output to config/reading-list input -config.load('tests/data/apply/config.ini') +config.load('tests/work/apply_config.ini') splice.apply(data) shutil.move('tests/work/apply/opml.xml', 'tests/data/config') diff --git a/tests/data/apply/feed.xml b/tests/data/apply/feed.xml index 2ffbfa1..367c0df 100644 --- a/tests/data/apply/feed.xml +++ b/tests/data/apply/feed.xml @@ -1,2 +1,2 @@ -test planet2006-08-25T13:41:22ZVenusAnonymous Cowardtag:planet.intertwingly.net,2006:testfeed3/2Venusthe Morning Star2006-08-25T13:41:22ZIt’s just dataSam Rubythree200http://example.com/4Marsthe Red Planet2006-08-25T13:41:22ZIt’s just dataSam Rubythree200tag:planet.intertwingly.net,2006:testfeed1/2Venusthe Jewel of the Sky2006-02-02T00:00:00Z2006-01-02T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zone200tag:planet.intertwingly.net,2006:testfeed2/4Marsthe Red Planet2006-01-04T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Ztwo200tag:planet.intertwingly.net,2006:testfeed1/4Marsthe Red Planet2006-01-04T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zone200tag:planet.intertwingly.net,2006:testfeed2/3Earththe Blue Planet2006-01-03T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Ztwo200tag:planet.intertwingly.net,2006:testfeed1/3Earththe Blue Planet2006-01-03T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zone200http://example.com/3Earththe Blue Planet2006-01-03T00:00:00ZIt’s just dataSam Rubythree200tag:planet.intertwingly.net,2006:testfeed2/2Venusthe Morning Star2006-01-02T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Ztwo200tag:planet.intertwingly.net,2006:testfeed3/1MercuryMessenger of the Roman Gods2006-01-01T00:00:00ZIt’s just dataSam Rubythree200tag:planet.intertwingly.net,2006:testfeed2/1MercuryMessenger of the Roman Gods2006-01-01T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Ztwo200tag:planet.intertwingly.net,2006:testfeed1/1MercuryMessenger of the Roman Gods2006-01-01T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zone200500not foundtag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Ztwo200It’s just dataSam Rubythree200tag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zone200 \ No newline at end of file +test planet2006-10-14T13:02:18ZVenusAnonymous Cowardnot found2006-10-14T13:02:18Zinternal server errornot found500truetag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10two200http://intertwingly.net/code/venus/tests/data/spider/testfeed3.rssthreeIt’s just dataSam Ruby2006-10-14T13:02:18Ztruerss20three200tag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10one200tag:planet.intertwingly.net,2006:testfeed3/2Venusthe Morning Star2006-10-14T13:02:18Zhttp://intertwingly.net/code/venus/tests/data/spider/testfeed3.rssthreeIt’s just dataSam Ruby2006-10-14T13:02:18Zrss20threetrue200http://example.com/4Marsthe Red Planet2006-10-14T13:02:18Zhttp://intertwingly.net/code/venus/tests/data/spider/testfeed3.rssthreeIt’s just dataSam Ruby2006-10-14T13:02:18Zrss20threetrue200tag:planet.intertwingly.net,2006:testfeed1/2Venusthe Jewel of the Sky2006-02-02T00:00:00Z2006-01-02T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10one200tag:planet.intertwingly.net,2006:testfeed2/4Marsthe Red Planet2006-01-04T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10two200tag:planet.intertwingly.net,2006:testfeed1/4Marsthe Red Planet2006-01-04T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10one200tag:planet.intertwingly.net,2006:testfeed2/3Earththe Blue Planet2006-01-03T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10two200tag:planet.intertwingly.net,2006:testfeed1/3Earththe Blue Planet2006-01-03T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10one200http://example.com/3Earththe Blue Planet2006-01-03T00:00:00Zhttp://intertwingly.net/code/venus/tests/data/spider/testfeed3.rssthreeIt’s just dataSam Ruby2006-10-14T13:02:18Zrss20threetrue200tag:planet.intertwingly.net,2006:testfeed2/2Venusthe Morning Star2006-01-02T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10two200tag:planet.intertwingly.net,2006:testfeed3/1MercuryMessenger of the Roman Gods2006-01-01T00:00:00Zhttp://intertwingly.net/code/venus/tests/data/spider/testfeed3.rssthreeIt’s just dataSam Ruby2006-10-14T13:02:18Zrss20threetrue200tag:planet.intertwingly.net,2006:testfeed2/1MercuryMessenger of the Roman Gods2006-01-01T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10two200tag:planet.intertwingly.net,2006:testfeed1/1MercuryMessenger of the Roman Gods2006-01-01T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10one200 \ No newline at end of file diff --git a/tests/data/config/opml.xml b/tests/data/config/opml.xml index 165e160..4384145 100644 --- a/tests/data/config/opml.xml +++ b/tests/data/config/opml.xml @@ -1,8 +1,8 @@ - + test planet - August 25, 2006 01:41 PM + October 14, 2006 01:02 PM Anonymous Coward diff --git a/tests/data/splice/cache/example.com,3 b/tests/data/splice/cache/example.com,3 index fce77be..9342223 100644 --- a/tests/data/splice/cache/example.com,3 +++ b/tests/data/splice/cache/example.com,3 @@ -1,2 +1,2 @@ -http://example.com/3Earththe Blue Planet2006-01-03T00:00:00ZIt’s just dataSam Rubythree200 \ No newline at end of file +http://example.com/3Earththe Blue Planet2006-01-03T00:00:00Zhttp://intertwingly.net/code/venus/tests/data/spider/testfeed3.rssthreeIt’s just dataSam Ruby2006-10-14T13:02:18Zrss20threetrue200 \ No newline at end of file diff --git a/tests/data/splice/cache/example.com,4 b/tests/data/splice/cache/example.com,4 index 2124793..da3332b 100644 --- a/tests/data/splice/cache/example.com,4 +++ b/tests/data/splice/cache/example.com,4 @@ -1,2 +1,2 @@ -http://example.com/4Marsthe Red Planet2006-08-25T13:41:22ZIt’s just dataSam Rubythree200 \ No newline at end of file +http://example.com/4Marsthe Red Planet2006-10-14T13:02:18Zhttp://intertwingly.net/code/venus/tests/data/spider/testfeed3.rssthreeIt’s just dataSam Ruby2006-10-14T13:02:18Zrss20threetrue200 \ No newline at end of file diff --git a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,1 b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,1 index f66cb50..134c07a 100644 --- a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,1 +++ b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,1 @@ -1,2 +1,2 @@ -tag:planet.intertwingly.net,2006:testfeed1/1MercuryMessenger of the Roman Gods2006-01-01T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zone200 \ No newline at end of file +tag:planet.intertwingly.net,2006:testfeed1/1MercuryMessenger of the Roman Gods2006-01-01T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10one200 \ No newline at end of file diff --git a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,2 b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,2 index 5495580..78405e7 100644 --- a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,2 +++ b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,2 @@ -1,2 +1,2 @@ -tag:planet.intertwingly.net,2006:testfeed1/2Venusthe Jewel of the Sky2006-02-02T00:00:00Z2006-01-02T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zone200 \ No newline at end of file +tag:planet.intertwingly.net,2006:testfeed1/2Venusthe Jewel of the Sky2006-02-02T00:00:00Z2006-01-02T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10one200 \ No newline at end of file diff --git a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,3 b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,3 index ab02a18..fb8bd10 100644 --- a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,3 +++ b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,3 @@ -1,2 +1,2 @@ -tag:planet.intertwingly.net,2006:testfeed1/3Earththe Blue Planet2006-01-03T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zone200 \ No newline at end of file +tag:planet.intertwingly.net,2006:testfeed1/3Earththe Blue Planet2006-01-03T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10one200 \ No newline at end of file diff --git a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,4 b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,4 index 2df1c64..f3f3fa0 100644 --- a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,4 +++ b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed1,4 @@ -1,2 +1,2 @@ -tag:planet.intertwingly.net,2006:testfeed1/4Marsthe Red Planet2006-01-04T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zone200 \ No newline at end of file +tag:planet.intertwingly.net,2006:testfeed1/4Marsthe Red Planet2006-01-04T00:00:00Ztag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10one200 \ No newline at end of file diff --git a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,1 b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,1 index 91ece2e..8354498 100644 --- a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,1 +++ b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,1 @@ -1,2 +1,2 @@ -tag:planet.intertwingly.net,2006:testfeed2/1MercuryMessenger of the Roman Gods2006-01-01T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Ztwo200 \ No newline at end of file +tag:planet.intertwingly.net,2006:testfeed2/1MercuryMessenger of the Roman Gods2006-01-01T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10two200 \ No newline at end of file diff --git a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,2 b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,2 index 775e0c1..43516be 100644 --- a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,2 +++ b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,2 @@ -1,2 +1,2 @@ -tag:planet.intertwingly.net,2006:testfeed2/2Venusthe Morning Star2006-01-02T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Ztwo200 \ No newline at end of file +tag:planet.intertwingly.net,2006:testfeed2/2Venusthe Morning Star2006-01-02T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10two200 \ No newline at end of file diff --git a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,3 b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,3 index 2280686..840ddc7 100644 --- a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,3 +++ b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,3 @@ -1,2 +1,2 @@ -tag:planet.intertwingly.net,2006:testfeed2/3Earththe Blue Planet2006-01-03T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Ztwo200 \ No newline at end of file +tag:planet.intertwingly.net,2006:testfeed2/3Earththe Blue Planet2006-01-03T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10two200 \ No newline at end of file diff --git a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,4 b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,4 index 296b19c..05c7917 100644 --- a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,4 +++ b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed2,4 @@ -1,2 +1,2 @@ -tag:planet.intertwingly.net,2006:testfeed2/4Marsthe Red Planet2006-01-04T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Ztwo200 \ No newline at end of file +tag:planet.intertwingly.net,2006:testfeed2/4Marsthe Red Planet2006-01-04T00:00:00Ztag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10two200 \ No newline at end of file diff --git a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed3,1 b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed3,1 index 945f7a3..5cd6f27 100644 --- a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed3,1 +++ b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed3,1 @@ -1,2 +1,2 @@ -tag:planet.intertwingly.net,2006:testfeed3/1MercuryMessenger of the Roman Gods2006-01-01T00:00:00ZIt’s just dataSam Rubythree200 \ No newline at end of file +tag:planet.intertwingly.net,2006:testfeed3/1MercuryMessenger of the Roman Gods2006-01-01T00:00:00Zhttp://intertwingly.net/code/venus/tests/data/spider/testfeed3.rssthreeIt’s just dataSam Ruby2006-10-14T13:02:18Zrss20threetrue200 \ No newline at end of file diff --git a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed3,2 b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed3,2 index 040da55..06ab416 100644 --- a/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed3,2 +++ b/tests/data/splice/cache/planet.intertwingly.net,2006,testfeed3,2 @@ -1,2 +1,2 @@ -tag:planet.intertwingly.net,2006:testfeed3/2Venusthe Morning Star2006-08-25T13:41:22ZIt’s just dataSam Rubythree200 \ No newline at end of file +tag:planet.intertwingly.net,2006:testfeed3/2Venusthe Morning Star2006-10-14T13:02:18Zhttp://intertwingly.net/code/venus/tests/data/spider/testfeed3.rssthreeIt’s just dataSam Ruby2006-10-14T13:02:18Zrss20threetrue200 \ No newline at end of file diff --git a/tests/data/splice/cache/sources/tests,data,spider,testfeed0.atom b/tests/data/splice/cache/sources/tests,data,spider,testfeed0.atom index 1894ca0..88cc417 100644 --- a/tests/data/splice/cache/sources/tests,data,spider,testfeed0.atom +++ b/tests/data/splice/cache/sources/tests,data,spider,testfeed0.atom @@ -1,2 +1,2 @@ -not found500 \ No newline at end of file +not found2006-10-14T13:02:18Zinternal server errortrue500not found \ No newline at end of file diff --git a/tests/data/splice/cache/sources/tests,data,spider,testfeed1b.atom b/tests/data/splice/cache/sources/tests,data,spider,testfeed1b.atom index 4cb2399..0c48d28 100644 --- a/tests/data/splice/cache/sources/tests,data,spider,testfeed1b.atom +++ b/tests/data/splice/cache/sources/tests,data,spider,testfeed1b.atom @@ -1,2 +1,2 @@ -tag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zone200 \ No newline at end of file +tag:planet.intertwingly.net,2006:testfeed1Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10one200 \ No newline at end of file diff --git a/tests/data/splice/cache/sources/tests,data,spider,testfeed2.atom b/tests/data/splice/cache/sources/tests,data,spider,testfeed2.atom index fa8f900..e9fcc3d 100644 --- a/tests/data/splice/cache/sources/tests,data,spider,testfeed2.atom +++ b/tests/data/splice/cache/sources/tests,data,spider,testfeed2.atom @@ -1,2 +1,2 @@ -tag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Ztwo200 \ No newline at end of file +tag:planet.intertwingly.net,2006:testfeed2Sam Rubyrubys@intertwingly.nethttp://www.intertwingly.net/blog/It’s just dataSam Ruby2006-06-17T00:15:18Zfalseatom10two200 \ No newline at end of file diff --git a/tests/data/splice/cache/sources/tests,data,spider,testfeed3.rss b/tests/data/splice/cache/sources/tests,data,spider,testfeed3.rss index 01432d4..809df94 100644 --- a/tests/data/splice/cache/sources/tests,data,spider,testfeed3.rss +++ b/tests/data/splice/cache/sources/tests,data,spider,testfeed3.rss @@ -1,2 +1,2 @@ -It’s just dataSam Rubythree200 \ No newline at end of file +http://intertwingly.net/code/venus/tests/data/spider/testfeed3.rssthreeIt’s just dataSam Ruby2006-10-14T13:02:18Zrss20threetrue200 \ No newline at end of file From 46ca6cd4f4ac8a788c7b6f49def013e0172e5cef Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Mon, 16 Oct 2006 14:27:21 -0400 Subject: [PATCH 03/53] id index --- planet/idindex.py | 72 +++++++++++++++++++++++++++++++++++++++++++ planet/spider.py | 10 ++++++ planet/splice.py | 6 ++++ tests/test_idindex.py | 58 ++++++++++++++++++++++++++++++++++ 4 files changed, 146 insertions(+) create mode 100644 planet/idindex.py create mode 100644 tests/test_idindex.py diff --git a/planet/idindex.py b/planet/idindex.py new file mode 100644 index 0000000..2a3685f --- /dev/null +++ b/planet/idindex.py @@ -0,0 +1,72 @@ +from glob import glob +import os, sys, dbhash + +if __name__ == '__main__': + rootdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + sys.path.insert(0, rootdir) + +from planet.spider import filename +from planet import config + +def open(): + cache = config.cache_directory() + index=os.path.join(cache,'index') + if not os.path.exists(index): return None + return dbhash.open(filename(index, 'id'),'w') + +def destroy(): + from planet import logger as log + cache = config.cache_directory() + index=os.path.join(cache,'index') + if not os.path.exists(index): return None + idindex = filename(index, 'id') + if os.path.exists(idindex): os.unlink(idindex) + os.removedirs(index) + log.info(idindex + " deleted") + +def create(): + import libxml2 + from planet import logger as log + cache = config.cache_directory() + index=os.path.join(cache,'index') + if not os.path.exists(index): os.makedirs(index) + index = dbhash.open(filename(index, 'id'),'c') + + for file in glob(cache+"/*"): + if not os.path.isdir(file): + try: + doc = libxml2.parseFile(file) + ctxt = doc.xpathNewContext() + ctxt.xpathRegisterNs('atom','http://www.w3.org/2005/Atom') + entry = ctxt.xpathEval('/atom:entry/atom:id') + source = ctxt.xpathEval('/atom:entry/atom:source/atom:id') + if entry and source: + index[filename('',entry[0].content)] = source[0].content + doc.freeDoc() + except: + log.error(file) + + log.info(str(len(index.keys())) + " entries indexed") + index.close() + + return open() + +if __name__ == '__main__': + if len(sys.argv) < 2: + print 'Usage: %s [-c|-d]' % sys.argv[0] + sys.exit(1) + + config.load(sys.argv[1]) + + if len(sys.argv) > 2 and sys.argv[2] == '-c': + create() + elif len(sys.argv) > 2 and sys.argv[2] == '-d': + destroy() + else: + from planet import logger as log + index = open() + if index: + log.info(str(len(index.keys())) + " entries indexed") + index.close() + else: + log.info("no entries indexed") diff --git a/planet/spider.py b/planet/spider.py index 0cd5523..42131ae 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -196,6 +196,9 @@ def spiderFeed(feed): # perform user configured scrub operations on the data scrub(feed, data) + from planet import idindex + index = idindex.open() + # write each entry to the cache cache = config.cache_directory() for entry in data.entries: @@ -234,6 +237,13 @@ def spiderFeed(feed): write(output, cache_file) os.utime(cache_file, (mtime, mtime)) + # optionally index + if index != None: + index[filename('', entry.id)] = \ + data.feed.get('id', data.feed.get('link',None)) + + if index: index.close() + # identify inactive feeds if config.activity_threshold(feed): updated = [entry.updated_parsed for entry in data.entries diff --git a/planet/splice.py b/planet/splice.py index ddb11ed..015b4cd 100644 --- a/planet/splice.py +++ b/planet/splice.py @@ -4,6 +4,7 @@ from xml.dom import minidom import planet, config, feedparser, reconstitute, shell from reconstitute import createTextElement, date from spider import filename +from planet import idindex def splice(): """ Splice together a planet from a cache of entries """ @@ -62,9 +63,12 @@ def splice(): reconstitute.source(xdoc.documentElement, data.feed, None, None) feed.appendChild(xdoc.documentElement) + index = idindex.open() + # insert entry information items = 0 for mtime,file in dir: + if index and index[file.split('/')[-1]] not in sub_ids: continue try: entry=minidom.parse(file) @@ -83,6 +87,8 @@ def splice(): except: log.error("Error parsing %s", file) + if index: index.close() + return doc def apply(doc): diff --git a/tests/test_idindex.py b/tests/test_idindex.py new file mode 100644 index 0000000..dda08d6 --- /dev/null +++ b/tests/test_idindex.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +import unittest +from planet import idindex, config, logger + +class idIndexTest(unittest.TestCase): + + def tearDown(self): + idindex.destroy() + + def test_index_spider(self): + import test_spider + config.load(test_spider.configfile) + + index = idindex.create() + self.assertEqual(0, len(index)) + index.close() + + from planet.spider import spiderPlanet + try: + spiderPlanet() + + index = idindex.open() + self.assertEqual(12, len(index)) + self.assertEqual('tag:planet.intertwingly.net,2006:testfeed1', index['planet.intertwingly.net,2006,testfeed1,1']) + self.assertEqual('http://intertwingly.net/code/venus/tests/data/spider/testfeed3.rss', index['planet.intertwingly.net,2006,testfeed3,1']) + index.close() + finally: + import os, shutil + shutil.rmtree(test_spider.workdir) + os.removedirs(os.path.split(test_spider.workdir)[0]) + + def test_index_splice(self): + import test_splice + config.load(test_splice.configfile) + index = idindex.create() + + self.assertEqual(12, len(index)) + self.assertEqual('tag:planet.intertwingly.net,2006:testfeed1', index['planet.intertwingly.net,2006,testfeed1,1']) + self.assertEqual('http://intertwingly.net/code/venus/tests/data/spider/testfeed3.rss', index['planet.intertwingly.net,2006,testfeed3,1']) + + for key,value in index.items(): + if value.find('testfeed2')>0: index[key] = value[::-1] + index.close() + + from planet.splice import splice + doc = splice() + + self.assertEqual(8,len(doc.getElementsByTagName('entry'))) + self.assertEqual(4,len(doc.getElementsByTagName('planet:source'))) + self.assertEqual(12,len(doc.getElementsByTagName('planet:name'))) + +try: + import libxml2 +except ImportError: + logger.warn("libxml2 is not available => can't test id index") + for method in dir(idIndexTest): + if method.startswith('test_'): delattr(idIndexTest,method) From c684e112e6c5cee90fad27e4c464550e70c857f8 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Mon, 16 Oct 2006 15:59:52 -0400 Subject: [PATCH 04/53] Check for dbhash before testing id indexes --- tests/test_idindex.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_idindex.py b/tests/test_idindex.py index dda08d6..b88d1ea 100644 --- a/tests/test_idindex.py +++ b/tests/test_idindex.py @@ -51,8 +51,11 @@ class idIndexTest(unittest.TestCase): self.assertEqual(12,len(doc.getElementsByTagName('planet:name'))) try: + module = 'dbhash' + import dbhash + module = 'libxml2' import libxml2 except ImportError: - logger.warn("libxml2 is not available => can't test id index") + logger.warn(module + " is not available => can't test id index") for method in dir(idIndexTest): if method.startswith('test_'): delattr(idIndexTest,method) From 5966c45bce5dc2b3485541134ce96dbd9682b673 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Mon, 16 Oct 2006 16:46:40 -0400 Subject: [PATCH 05/53] Initial pass at documentation --- docs/config.html | 116 +++++++++++++++++++++++++++++++++++++ docs/docs.css | 106 ++++++++++++++++++++++++++++++++++ docs/docs.js | 53 +++++++++++++++++ docs/filters.html | 61 ++++++++++++++++++++ docs/img/shadow.gif | Bin 0 -> 4363 bytes docs/img/shadow2.gif | Bin 0 -> 4043 bytes docs/img/shadowAlpha.png | Bin 0 -> 3403 bytes docs/index.html | 42 ++++++++++++++ docs/migration.html | 21 +++++++ docs/normalization.html | 87 ++++++++++++++++++++++++++++ docs/templates.html | 121 +++++++++++++++++++++++++++++++++++++++ 11 files changed, 607 insertions(+) create mode 100644 docs/config.html create mode 100644 docs/docs.css create mode 100644 docs/docs.js create mode 100644 docs/filters.html create mode 100644 docs/img/shadow.gif create mode 100644 docs/img/shadow2.gif create mode 100644 docs/img/shadowAlpha.png create mode 100644 docs/index.html create mode 100644 docs/migration.html create mode 100644 docs/normalization.html create mode 100644 docs/templates.html diff --git a/docs/config.html b/docs/config.html new file mode 100644 index 0000000..9370ee8 --- /dev/null +++ b/docs/config.html @@ -0,0 +1,116 @@ + + + + +Venus Configuration + + + +

Configuration

+

Configuration files are in ConfigParser format which basically means the same +format as INI files, i.e., they consist of a series of +[sections], in square brackets, with each section containing a +list of name:value pairs (or name=value pairs, if +you prefer).

+

You are welcome to place your entire configuration into one file. +Alternately, you may factor out the templating into a "theme", and +the list of subscriptions into one or more "reading lists".

+

[planet]

+

This is the only required section, which is a bit odd as none of the +parameters listed below are required. Even so, you really do want to +provide many of these, especially ones that identify your planet and +either (or both) of template_files and theme.

+

Below is a complete list of predefined planet configuration parameters, +including ones not (yet) implemented by Venus and ones that +are either new or implemented differently by Venus.

+
+
+
name
+
Your planet's name
+
link
+
Link to the main page
+
owner_name
+
Your name
+
owner_email
+
Your e-mail address
+
cache_directory
+
Where cached feeds are stored
+
log_level
+
One of DEBUG, INFO, WARNING, ERROR or CRITICAL
+
output_theme
+
Directory containing a config.ini file which is merged +with this one. This is typically used to specify templating and bill of +material information.
+
output_dir
+
Directory to place output files
+
items_per_page
+
How many items to put on each page. Whereas Planet 2.0 allows this to +be overridden on a per template basis, Venus currently takes the maximum value +for this across all templates.
+
days_per_page
+
How many complete days of posts to put on each page This is the absolute, hard limit (over the item limit)
+
date_format
+
strftime format for the default 'date' template variable
+
new_date_format
+
strftime format for the 'new_date' template variable only applies to htmltmpl templates
+
encoding
+
Output encoding for the file, Python 2.3+ users can use the special "xml" value to output ASCII with XML character references
+
locale
+
Locale to use for (e.g.) strings in dates, default is taken from your system
+
feed_timeout
+
Number of seconds to wait for any given feed
+
new_feed_items
+
Number of items to take from new feeds
+
activity_threshold
+
If non-zero, all feeds which have not been updated in the indicated +number of days will be marked as inactive
+
template_files
+
Space-separated list of output template files
+
template_directories
+
Space-separated list of directories in which template_files +can be found
+
bill_of_materials
+
Space-separated list of files to be copied as is directly from the template_directories to the output_dir
+
filters
+
Space-separated list of filters to apply to each entry
+
+
+ +

[DEFAULT]

+

Values placed in this section are used as default values for all sections. +While it is true that few values make sense in all sections; in most cases +unused parameters cause few problems.

+ +

[subscription]

+

All sections other than planet, DEFAULT, or are +named in [planet]'s filters or +templatefiles parameters +are treated as subscriptions and typically take the form of a +URI.

+

Parameters placed in this section are passed to templates. While +you are free to include as few or as many parameters as you like, most of +the predefined themes presume that at least name is defined.

+

The content_type parameter can be defined to indicate that +this subscription is a reading list, i.e., is an external list +of subscriptions. At the moment, two formats of reading lists are supported: +opml and foaf. In the future, support for formats +like xoxo could be added.

+

Normalization overrides can +also be defined here.

+ +

[template]

+

Sections which are listed in [planet] template_files are +processed as templates. With Planet 2.0, +it is possible to override parameters like items_per_page +on a per template basis, but at the current time Planet Venus doesn't +implement this.

+ +

[filter]

+

Sections which are listed in [planet] filters are +processed as filters.

+

Parameters which are listed in this section are passed to the filter +in a language specific manner. Given the way defaults work, filters +should be prepared to ignore parameters that they didn't expect.

+ + diff --git a/docs/docs.css b/docs/docs.css new file mode 100644 index 0000000..c5a1baf --- /dev/null +++ b/docs/docs.css @@ -0,0 +1,106 @@ +body { + background-color: #fff; + color: #333; + font-family: 'Lucida Grande', Verdana, Geneva, Lucida, Helvetica, sans-serif; + font-size: small; + margin: 40px; + padding: 0; +} + +a:link, a:visited { + background-color: transparent; + color: #333; + text-decoration: none !important; + border-bottom: 1px dotted #333 !important; + text-decoration: underline; + border-bottom: 0; +} + +a:hover { + background-color: transparent; + color: #993344; + text-decoration: none !important; + text-decoration: underline; + border-bottom: 1px dotted #993344 !important; + border-bottom: 0; +} + +code { + color: green; + font-size: large +} + +h1 { + margin: 8px 0 10px 20px; + padding: 0; + font-variant: small-caps; + letter-spacing: 0.1em; + font-family: "Book Antiqua", Georgia, Palatino, Times, "Times New Roman", serif; +} + +h2 { + clear: both; +} + +ul.outer > li { + margin: 14px 0 10px 0; +} + +.z { + float:left; + background: url(img/shadowAlpha.png) no-repeat bottom right !important; + background: url(img/shadow.gif) no-repeat bottom right; + margin: -15px 0 20px -15px !important; +} + +.z p { + margin: 14px 0 10px 15px !important; +} + +.z .sectionInner { + width: 730px; + background: none !important; + background: url(img/shadow2.gif) no-repeat left top; + padding: 0 !important; + padding: 0 6px 6px 10; + } + +.z .sectionInner .sectionInner2 { + background-color: #fff; + border: 1px solid #a9a9a9; + padding: 4px; + margin: -6px 6px 6px -6px !important; + margin: 0; +} + +ins { + color: magenta; + text-decoration: none; +} + +dl.compact { + margin-bottom: 1em; + margin-top: 1em; +} + +dl.code > dt { + font-family: mono; +} + +dl.compact > dt { + float: left; + margin-bottom: 0; + padding-right: 8px; + margin-top: 0; + list-style-type: none; +} + +dl.compact > dd { + margin-bottom: 0; + margin-top: 0; + margin-left: 10em; +} + +th, td { + font-size: small; +} diff --git a/docs/docs.js b/docs/docs.js new file mode 100644 index 0000000..0b2a925 --- /dev/null +++ b/docs/docs.js @@ -0,0 +1,53 @@ +window.onload=function() { + var vindex = document.URL.lastIndexOf('venus/'); + var base = document.URL.substring(0,vindex+6); + + var body = document.getElementsByTagName('body')[0]; + var div = document.createElement('div'); + div.setAttribute('class','z'); + var h1 = document.createElement('h1'); + var span = document.createElement('span'); + span.appendChild(document.createTextNode('\u2640')); + span.setAttribute('style','color: magenta'); + h1.appendChild(span); + h1.appendChild(document.createTextNode(' Planet Venus')); + + var inner2=document.createElement('div'); + inner2.setAttribute('class','sectionInner2'); + inner2.appendChild(h1); + + var p = document.createElement('p'); + p.appendChild(document.createTextNode("Planet Venus is an awesome \u2018river of news\u2019 feed reader. It downloads news feeds published by web sites and aggregates their content together into a single combined feed, latest news first.")); + inner2.appendChild(p); + + p = document.createElement('p'); + var a = document.createElement('a'); + a.setAttribute('href',base); + a.appendChild(document.createTextNode('Download')); + p.appendChild(a); + p.appendChild(document.createTextNode(" \u00b7 ")); + a = document.createElement('a'); + a.setAttribute('href',base+'docs/'); + a.appendChild(document.createTextNode('Documentation')); + p.appendChild(a); + p.appendChild(document.createTextNode(" \u00b7 ")); + a = document.createElement('a'); + a.setAttribute('href',base+'tests/'); + a.appendChild(document.createTextNode('Unit tests')); + p.appendChild(a); + p.appendChild(document.createTextNode(" \u00b7 ")); + a = document.createElement('a'); + a.setAttribute('href','http://lists.planetplanet.org/mailman/listinfo/devel'); + a.appendChild(document.createTextNode('Mailing list')); + p.appendChild(a); + inner2.appendChild(p); + + var inner1=document.createElement('div'); + inner1.setAttribute('class','sectionInner'); + inner1.setAttribute('id','inner1'); + inner1.appendChild(inner2); + + div.appendChild(inner1); + + body.insertBefore(div, body.firstChild); +} diff --git a/docs/filters.html b/docs/filters.html new file mode 100644 index 0000000..7efdb88 --- /dev/null +++ b/docs/filters.html @@ -0,0 +1,61 @@ + + + + +Venus Filters + + +

Filters

+

Filters are simple Unix pipes. Input comes in stdin, +parameters come from the config file, and output goes to stdout. +Anything written to stderr is logged as an ERROR message. If no +stdout is produced, the entry is not written to the cache or +processed further.

+ +

Input to a filter is a aggressively +normalized entry. For +example, if a feed is RSS 1.0 with 10 items, the filter will be called ten +times, each with a single Atom 1.0 entry, with all textConstructs +expressed as XHTML, and everything encoded as UTF-8.

+ +

You will find a small set of example filters in the filters directory. The coral cdn filter will change links +to images in the entry itself. The filters in the stripAd subdirectory will strip specific +types of advertisements that you may find in feeds.

+ +

The excerpt filter adds metadata (in +the form of a planet:excerpt element) to the feed itself. You +can see examples of how parameters are passed to this program in either +excerpt-images or +opml-top100.ini.

+ +

The xpath sifter is a variation of +the above, including or excluding feeds based on the presence (or absence) of +data specified by xpath +expressions.

+ +

Notes

+ +
    + +
  • The file extension of the filter is significant. .py invokes +python. .xslt involkes xslt. .sed and +.tmpl (a.k.a. htmltmp) are also options. Other languages, like +perl or ruby or class/jar (java), aren't supported at the moment, but these +would be easy to add.
  • + +
  • Any filters listed in the [planet] section of your config.ini +will be invoked on all feeds. Filters listed in individual +[feed] sections will only be invoked on those feeds.
  • + +
  • Filters are simply invoked in the order they are listed in the +configuration file (think unix pipes). Planet wide filters are executed before +feed specific filters.
  • + +
  • Templates written using htmltmpl currently only have access to a fixed set +of fields, whereas xslt templates have access to everything.
  • +
+ + diff --git a/docs/img/shadow.gif b/docs/img/shadow.gif new file mode 100644 index 0000000000000000000000000000000000000000..f1e6cb53bdc87aa155315f6ba282e3ccda0fc3f5 GIT binary patch literal 4363 zcmeH`i9ZvJUlgR6?-Um44d5M+-x?Rt<4zb zNbYNMGnC}Ma-VbT_xt|-i{I<@eg6fY*ZckY+_JKS7(P-IQWV+-08&#^)6&v1Gc)t@ z@-P?-9*?I`D5a&POeV9uyu7xywxgqi&1Q2roZjBvk&%({@$rd?iOI>ynVFfz#l@wi zrRC-2wf_U~U;b<0|C@n7c7+8101!a)Kg0j?34kacpd+eqo0j)2T=b-ddkYOy|LM3g zEbBHM+ZYSdd-1)6p5Kg8G(#v@72{fyfC3VbT7aNPvi9S)EGtFQAV zUQM)RFTBOyX9cX!|7b7!@-X}*U;M01Iqg@yk&v=SM>&0>IYC4NX;V==)t+8z$LXkG z%yj12`T}iPC3C$*oj5x-t8`&7%&9)dwvzdqTKvz#D7*5#SEXn0v2%7+ke2UFNf#e- z+^@W1vh%HTKb$t)T;MXEF{#y++shFZ;rw&5w&PJ(? zzf?r}jK^S7qQ?=Mjs;$^+D!r6Slt1i2@m~I;skO=q-6qS!b^FaU@qsl|*&5V8C{=4j#*s-N@Fv5DNqA@UbiRD+=zEt^l#j)k8 zr>)k@)#Vwn%Qb|d_T{hlcaN>qT8r7Ne6y5~TdBLQ-my{-F_c(s(6h2xZB%uMTWvC# zYhP^+crLNlA|GS3*6In5TWi}Sb*#1T&L3UxxYTa5&er)Exz2IP=+I*u^CjMNnKEqr zyVcIc>$k!#OZxTNy^(m^2eP-l(&+e5^7VkLUdP)((T|b_-@H(guZFzWW8V$$P}v66 zzF#H(`R>QCe*a^3H2!J@e3>ul`}4z_V*z7apdF+%>KyRzafDubz(k8N(2$;J5BzH? zbsZ5nUGB>;0_BE-~x#wnf z=8t86*t=IF^)Y*~6UEryx)}5EFmRxg-*vc`+byV8i#tIJu`yB<%q^%Dfl)$%MPOm& z=u$C2XCy%HW5DrYmjKc;BKk3KP+lhCQ#}zpKh$UL!V-t(B#Nz0J zYZs*N6}DX{E>5uvx}ce_*6!j!Pi0mqX}u|Ie6Us=TeE)w6t3Q(Bh5(nzNVtvOYC@B zOwZs1DeLE}H$Qh^AP1^c&N2$w*ZmloANExsLh78?(#2WR*Um$G3tQe6Gd?c`sh*!u z@3iV+QIXS|<(&e;Rvbu*2gpd$pF%yo6xWl~SdixRxnZ#A38;yoEX{y2l`LaXik-m7nm z30b@9cXX8dFs=neOT2_b68h2|-ToWa!7mprxPW8Mr zdSdBi@9P(lRMLQbSSdvbcF}!KX|RGBOL=#}{=qsgwR-J}N5H{LvfxGM-#eu=Z$nM5 zRxGy>fu|$cE_TXp$}J9#dJ)xsQFO^eQ_f6=u4r{rg-U zjy1qe_h(px7yZ)Cj~@6ok7|srMwC^ZGrSBp!j5kG;;NS}4ZWLiqwMw!T5MJS^JI+t zGx>Ab*WO>3LzI=q1a9DJkNAp)ovca_(S!T}{IGIUN%L3Oo$@-N3hk)u^`DYtgRf_` zE=HTh4V*{{pqw#Y_0^AiBJwX<7|=E8%%|d$5@&vKAa^^H8aI zuw}_&4W1I`p^`S(Iv%<99^dgmo2D|T%m*kPC?_k&!&W{@%w>Jw8+L&5nC72TLWE4iw!T?cxTH~1KnYf z8xJqAonSNlJ?|Pf+^XZ)XzPW}B3k(>9PvhTa9 z_77M#Zr*t-dEaBZZxAZ7WgBUG&#SqQt7WkTONn>zPU{;|irl(|XWxDCtZ!JZam&0^ z@~-dIz7cVe?VF9Zcl?g_eLpncHtvtNe>d3sV=ZFaXo_tIC-ja^H*7;TCG9@E@BKL} zymLjw&Nl2;?-<8?M^_eU6LqThS6#%;`1V-9xx){WRZ zHpMYz5xSOC8ummtfu=R@yOzPi`ywLtH|uV7tpLsU1!YktO{cn61ta$P=R0q-&2+A9 z)$i}?OWojDyPN#8pvEhd^xK6|QXB=K?{o!PZl;P4<&K^RD&;Qk6 z4_Q0P+5ce1AMHb3-5O*c_=WRFCOZvy1ookKJ)gTFWpMbO&Hw(`OG8dq5EAl6AjBy= zsa{%YcX< zjp26DvexCg_k2ujL6Nz4BUSSw#rz|kx$^E1-A64Z9y^gE0+HU%r=F%q-HMF*i|gvU z6GfB#Jm?-Z6ofe~MfEblNOhS|&Oy8Wa_v6YG34nx7u+{`OOX zntLK7rt#01)M$59dW;e?Cd=6?XD3F@I~>c^Om{};c1NGgM}TAy#M@4U9fYHFY_S@+ z#5s2CZEQKj16LmVY!*=?8deR8`&%@wVK$5v5U21BAyprD`bk_{i*qX|eoZ944%jqU5$vfQ(0ih6xG=aYtHDjYG7LS((nHC)hY72n{9hO+Tw{Bpi2p1yP*l1fle296VbDYxJOL^4at!6$Msmq(GOQ5u$VQDw?)BIiH^@q~jFli%7>G+Mb zkRiQy708IdOR+JqsKE5!pVMc#>Aj{I^WF^M#c*e8apJDTcJsi zx5l}kMHm^Q>F8#`%#spxQHD&hp=Md2b%{&niPp5L3~6d$e8uj?`a@OLG=gA)SK1UQQjG)(xw zBZPp7VNha(D=`XAj7Ad?EMna3FcHZkCV&eQp@qpLf@lIjoCc867Lct4NK1>i>A)AsEfnY zB_4GJ{AGC#4Y88^DzzjRP09b8FQ7@?otqaSq>ko6Qe^-4fM0ATb#0!WTq literal 0 HcmV?d00001 diff --git a/docs/img/shadow2.gif b/docs/img/shadow2.gif new file mode 100644 index 0000000000000000000000000000000000000000..a0b9ed4bfc79c4954979ab7254305c400c9c43a1 GIT binary patch literal 4043 zcmeH``9Bj51IJ1AMWIweLWwqXpxA|q6qSl-6P6>*ea}#mIp$_#HpiADh7!guLlF%{ zZj&RC3@PN+JkR&@893=*Xwi5+zbSEQWaAbTN4pU>r30&+4(O;{=feh_}?pV zVq>?ch{!Gx?SIw({e+0PP((~z>3ZdhcUbX5n)bZP{N}g=Y8JWIs|s2Y<@G#9cvXcT zQdLb7l+3G(+6VyaGW)jbmmOK>UD|Wa>BXONK!LL(ZS;~Z>Lsk?af=#Scj0w{rbBy8 zX>ZA$LW?|$+Oqy~INf8ky|#St&BNw_!F;Z-w@=aFdL^JMC^FbUjFg9@CMb=;nMQ# z5Z!aUv%YR>Zme0DsB*i3i}^j>TaN5%`0Mp&VX}jIyV1ybeRX+mysNQsB}%vl@HKKb zJ`VX@T!Z#CigBFx6??!8aKcU65;YMc@5Z|yqlliFh*J#^|Asq7B)!0C6w|&XEamgQ zC7y3(YiEt>oORnqqa&*Q}l}&kAk@$Melw{HAB+dmo5b70)8ftNPb(5jBh7+l=4hEWTt?AD@=f* zra<^*Z=}(46@gOW^YAW9Xg_0II(UJj_bL3>^&M$gcaw}v&|>Ry(vv07xh~kJPGgzC zKRxuDPgelQRKvDmUzvclvB3Qi>+-3$jasIuGX9&hdLJXU#2aOd-z{~?`2Ag7PJAX@ zU+6Nf7jCI=cL6S;4^~FbKvZ|Ny?nbTs{Fb1l-zDL+-nJ|G&?!2YK<=KvYUS;mba-Y z9#?%o>Yh3w}>O1!n!=0w>0nPWjD`OiHPDmdMX+EA^7AG`1Oq9mLL8`Kg z)@HDRs#x0l2KB1=CFhfep{HAbQ56ZcO2_5sD9)JxonXi9lXFdg*1`0uq-v;|qGw6# z#cvhKJ|oAKCTHrvJvtaPS8Z{L_F;0dDz$w}O*Q8<@A8#5X|cJ=Cl9&TU)9wOPkC}` z?If`6*WGITx4Kgr9VKnI3f>SX_9_4qLBn0VZbUIm{jXJN`&LzT=4QCM_SWeR#I8yr zLrL{)p!-{gCEe!@+v;Li;KzSt=_Fa0hOQRv<0I!va_5NZg+jqQcPqW<0j`Dwz4X(e z0D6w*wg%_{pwqwUx6AZA|4^?&QE)Z=+QO5^q;}wKn-)4nU&uLa^r)!oDJO{{+;3wn z=AjWOn_(?xNQ;*(yCbVplYc@NV5+t9IljWYKrZIqRlS7#*a+g+Mr~l4nY-aBvBd^VBz&pHt zURJN1e*?jwLp-%n6Tso_P6EBSALVYH)74*1q*go?{xrU;^~K~VgYk}i#%IOs%jjMU zX2W+WKkOWHNOmy4)zHT@ynF;I#bgtl&j!_IjtJal*aH{sgX#Nveg=dTjs2}Kf2lR5 z>%`=ifX{{9C>&c!DXw3Tl6o?^Mc(KMxj0e(D{{UZDfyk*D4aMKsipQ+^mg&vy(#;n z4sDb6=&^L9BPxe^T2AU$SxvF*^Rdw7aj6g2nw6#Z<4m@*4iZQ<$BnAOZoYD^uVl5{ zwa`hDIyI>vMr_h==uQk&Dpy=4L7~E`uYTH7{3{Hei=-}|UofR!{<6)|Y+pv97ZGSp z*0ya3AeM5!148(1NXGzDI&Au67J~O!=r7C;lwh!oo4PFdj-A^9+OVzle7waH&p^5mQ@`uoqv%y*5GQL#& zqIhyAAio#`4_>bsc{a3hepRl1Dc>3Mcv}VeT_$H=_RlkqCNk%Dk^TrxM#ba(bI2ma z*1qIuqkF46XOV;+d8vYQ=LzpZmheRTqSHI5b}(lti7`@ej*9wt0shQe_jOt36pc6TzmGohtK{Kq(7Q_Tjg=zJMfB+twYZJMz?`d_6iC;N=72x zhSI^S&O`^&d z65ddq=kq~Z8Uv2;Ok?MTc-EHc>R4RkxYKWc(6*u+GWNqWrzHey`>_6abeD?LpUa@X z(zZzKVB^D8ppf-f96kPg9QknlAV|22h>ZNPgWTL;3b$*=BYshl+Y<&mtNqBQYsN@n z8*}IP%6Rw=(@+#=CL5j z(Y)u_B$w!TY;?L_v?Qfcgg~8YD0=?>W^`R+uxRtos5Zb z9kP6giLI%M$sojf0FHUdgZwdIpY>Qv>p1j`V&IG^h7?y;6_?!`7r|4C0^y29al%k6 z?%sviSb%B*+#nTmHE9SZYKzMND5lFBkZD&5nE0)#cyF-;hrW0UNu_|KUm|W+1W#B= zPk1z$;8K(Digua^O3W5bbiyXOol0cPD07A`Hj>P^Lx~#JiSJPg??@NhcxKI*Btcb@ zjaag8Us5OSz8gGQ- z(3=CL9+FF06?a@BrDocsZo}n&!!L-kuWhZTcI%{F#->HwOWV7lBw1=H97;PWmoAHN zK8#2Qw5G`;qK~rE&km$3E4U~s;NLH%J->iI1-zh2#s@j!!ISvtXdzykf9yO$?_%h6 zT`<9nK!A{s87Sx(mtKeQ3AG0^&bVYGU&t_3a9C$$tUk{Gie;u1WmtyB-9u!CvGDK> zS37p5)j*~r;?Y9|B3z&73d~f;5(z<>uAw+L1)_(7uD`pv7oV82OmqZi9WTrx-^)VB z$79%;PslphHuH#$EW1M_ID&MfnM4gD;rPHb1u~OHvJsFDV#x&;$Qc4;E}zUpku6Kf zQYP8D{TVMLQg)?h|8&Zhn9RNyll`hRg$mA*)X2Uek+Y{T2c(|EFi)-B$oYxOF>T8c zb;*T(&uKy&=kd>d5?HshbM;Mf4L5Q(obxUp$?K^JP3tQq3?a^qo8KE|=SlPP^b{zI zQIu;JDN{g$cYKP7J4L&c^79JSqJ{FiE&Ugn8s$V4e52lqp>89TMC{J)k+j(bd2x?L zm7G2LPuTq>GF}E^BQgAhUI|hlC7XY$G@oBkfUqgh z;KTwH@!EE0^xAFCZWj2-7b+tPyPFD;!G$1?%u9+z2w;J!;!z__1cZ}ru4!u$R#bZM IfQSh6KVhA$B>(^b literal 0 HcmV?d00001 diff --git a/docs/img/shadowAlpha.png b/docs/img/shadowAlpha.png new file mode 100644 index 0000000000000000000000000000000000000000..a2561df971728d988424100c74c817916eca1979 GIT binary patch literal 3403 zcmeAS@N?(olHy`uVBq!ia0y~yV738bR}L1Sh{z?w93Z7#;u=xnT$Gwvl9`{U5R#dj z$`F!Ks$i<%mYSqsWME*TU}$J%1Vly(x&~$j21QvmX+Ul4C7!;n>{pmr1x4l8+mz-4 zg*Xd5B8wRqxP?HN@zUM8KR`j2bVpxD28NCO+HqZdXMAQjaPeGm)a##I4DP>8^|Q}*osX?x zu(w4E^8SQ>2<4nWJ;;$Ch1?$dLgm)?6;Yr9_CdHMW*W(@x+ip*R06EH_T4pml(Y0_%+Z_b^VZki z+Ig-L)GH{z-FHJSJv;l^O{dMW8|Geryoiy(edpWebG3Q>oX-o7q}^hCpz*y@X6IS? ZpGWQ1{0Pup3+%oyc)I$ztaD0e0swh%>OlYi literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..c85f103 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,42 @@ + + + + +Venus Documentation + + +

Table of Contents

+ + + diff --git a/docs/migration.html b/docs/migration.html new file mode 100644 index 0000000..8c6405c --- /dev/null +++ b/docs/migration.html @@ -0,0 +1,21 @@ + + + + +Venus Migration + + +

Migration from Planet 2.0

+

The intent is that existing Planet 2.0 users should be able to reuse +their existing config.ini and .tmpl files, +but the reality is that users will need to be aware of the following:

+
    +
  • You will need to start over with a new cache directory as the format +of the cache has changed dramatically.
  • +
  • Existing .tmpl and .ini files should work, +though some configuration options (e.g., +days_per_page) have not yet been implemented
  • +
  • No testing has been done on Python 2.1, and it is presumed not to work.
  • +
+ + diff --git a/docs/normalization.html b/docs/normalization.html new file mode 100644 index 0000000..2f9a5f2 --- /dev/null +++ b/docs/normalization.html @@ -0,0 +1,87 @@ + + + + +Venus Normalization + + +

Normalization

+

Venus builds on, and extends, the Universal Feed Parser and BeautifulSoup to +convert all feeds into Atom 1.0, with well formed XHTML, and encoded as utf-8, +meaning that you don't have to worry about funky feeds, tag soup, or character +encoding.

+

Encoding

+

Input data in feeds may be enocded in a variety of formats, most commonly +ASCII, ISO-8859-1, WIN-1252, AND UTF-8. Additionally, many feeds make use of +the wide range of +character entity +references provided by HTML. Each is converted to UTF-8, an encoding +which is a proper superset of ASCII, supports the entire range of Unicode +characters, and is one of +only two +encodings required to be supported by all conformant XML processors.

+

Encoding problems are one of the more common feed errors, and every +attempt is made to correct common errors, such as the inclusion of +the so-called +moronic versions +of smart-quotes. In rare cases where individual characters can not be +converted to valid UTF-8 or into +characters allowed in XML 1.0 +documents, such characters will be replaced with the Unicode +Replacement character, with a title that describes the original character whenever possible.

+

In order to support the widest range of inputs, use of Python 2.3 or later, +as well as the installation of the python iconvcodec, is +recommended.

+

HTML

+

A number of different normalizations of HTML are performed. For starters, +the HTML is +sanitized, +meaning that HTML tags and attributes that could introduce javascript or +other security risks are removed.

+

Then, +relative +links are resolved within the HTML. This is also done for links +in other areas in the feed too.

+

Finally, unmatched tags are closed. This is done with a +knowledge of the semantics of HTML. Additionally, a +large +subset of MathML, as well as a +tiny profile of SVG is also supported.

+

Atom 1.0

+

The Universal Feed Parser also +normalizes the content of feeds. This involves a +large number of elements; the best place to start is to look at +annotated examples. Among other things a large number of +date formats +are converted into +RFC 3339 formatted dates.

+

If no ids are found in entries, attempts are made to synthesize one using (in order):

+ +

If no updated dates are found in an entry, or if the dates found +are in the future, the current time is substitued.

+

Overrides

+

All of the above describes what Venus does automatically, either directly +or through its dependencies. There are a number of errors which can not +be corrected automatically, and for these, there are configuration parameters +that can be used to help.

+
    +
  • ignore_in_feed allows you to list any number of elements +which are to be ignored in feeds. This is often handy in the case of feeds +where the id or updated values can't be trusted.
  • +
  • title_type, summary_type, +content_type allow you to override the +type +attributes on these elements.
  • +
  • name_type does something similar for +author names
  • +
+ + diff --git a/docs/templates.html b/docs/templates.html new file mode 100644 index 0000000..8ccf572 --- /dev/null +++ b/docs/templates.html @@ -0,0 +1,121 @@ + + + + +Venus Templates + + +

Templates

+

Template names take the form +name.ext.type, where +name.ext identifies the name of the output file +to be created in the output_directory, and type +indicates which language processor to use for the template.

+

Like with filters, templates may be written +in a variety of languages and are based on the standard Unix pipe convention +of producing stdout from stdin, but in practice +two languages are used more than others:

+

htmltmpl

+

Many find htmltmpl +easier to get started with as you can take a simple example of your +output file, sprinkle in a few <TMPL_VAR>s and +<TMPL_LOOP>s and you are done. Eventually, however, +you may find that your template involves <TMPL_IF> +blocks inside of attribute values, and you may find the result difficult +to read and create correctly.

+

It is also important to note that htmltmpl based templates do not +have access to the full set of information available in the feed, just +the following (rather substantial) subset:

+ +
+ + + + + + + + + + + + + + + + + + +
VARtypesource
authorStringauthor
author_nameStringauthor_detail.name
generatorStringgenerator
idStringid
iconStringicon
last_updated_822Rfc822updated_parsed
last_updated_isoRfc3399updated_parsed
last_updatedPlanetDateupdated_parsed
linkStringlink
logoStringlogo
rightsStringrights_detail.value
subtitleStringsubtitle_detail.value
titleStringtitle_detail.value
title_plainPlaintitle_detail.value
urlStringlinks[rel='self'].href
headers['location']
+
+ +

Note: when multiple sources are listed, the last one wins

+

In addition to these variables, Planet Venus makes available two +arrays, Channels and Items, with one entry +per subscription and per output entry respectively. The data values +within the Channels array exactly match the above list. +The data values within the Items array are as follows:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VARtypesource
authorStringauthor
author_emailStringauthor_detail.email
author_nameStringauthor_detail.name
author_uriStringauthor_detail.href
content_languageStringcontent[0].language
contentStringsummary_detail.value
content[0].value
datePlanetDatepublished_parsed
updated_parsed
date_822Rfc822published_parsed
updated_parsed
date_isoRfc3399published_parsed
updated_parsed
idStringid
linkStringlinks[rel='alternate'].href
new_channelStringid
new_dateNewDatepublished_parsed
updated_parsed
rightsStringrights_detail.value
title_languageStringtitle_detail.language
title_plainPlaintitle_detail.value
titleStringtitle_detail.value
summary_languageStringsummary_detail.language
updatedPlanetDateupdated_parsed
updated_822Rfc822updated_parsed
updated_isoRfc3399updated_parsed
publishedPlanetDatepublished_parsed
published_822Rfc822published_parsed
published_isoRfc3399published_parsed
+
+

Note: variables above which start with +new_ are only set if their values differ from the previous +Item.

+ +

xslt

+

XSLT is a paradox: it actually +makes some simple things easier to do than htmltmpl, and certainly can +make more difficult things possible; but it is fair to say that many +find XSLT less approachable than htmltmpl.

+

But in any case, the XSLT support is easier to document as the +input is a highly normalized feed, +with a few extension elements.

+
    +
  • atom:feed will have the following child elements:
  • +
      +
    • A planet:source element per subscription, with the same child elements as atom:source, as well as +an additional child element in the planet namespace for each +configuration parameter that applies to +this subscription.
    • +
    • planet:format indicating the format and version of the source feed.
    • +
    • planet:bozo which is either true or false.
    • +
    +
  • atom:updated and atom:published will have +a planet:format attribute containing the referenced date +formatted according to the [planet] date_format specified +in the configuration
  • +
+ + From 6df078b8e2fb10604fe1b79270e8559eba29fc9d Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Mon, 16 Oct 2006 19:02:22 -0400 Subject: [PATCH 06/53] Pipe characters in file names --- THANKS | 2 ++ planet/spider.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/THANKS b/THANKS index eae4e9f..9d778b5 100644 --- a/THANKS +++ b/THANKS @@ -4,6 +4,8 @@ Elias Torres - FOAF OnlineAccounts Jacques Distler - Template patches Michael Koziarski - HTTP Auth fix Brian Ewins - Win32 / Portalocker +Joe Gregorio - Invoke same version of Python for filters +Harry Fuecks - Pipe characters in file names This codebase represents a radical refactoring of Planet 2.0, which lists the following contributors: diff --git a/planet/spider.py b/planet/spider.py index 42131ae..ba79c75 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -11,7 +11,7 @@ import planet, config, feedparser, reconstitute, shell # Regular expressions to sanitise cache filenames re_url_scheme = re.compile(r'^\w+:/*(\w+:|www\.)?') -re_slash = re.compile(r'[?/:]+') +re_slash = re.compile(r'[?/:|]+') re_initial_cruft = re.compile(r'^[,.]*') re_final_cruft = re.compile(r'[,.]*$') From 019eb0f96c5a011a38e43f0c49134cfa5fd53af7 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Mon, 16 Oct 2006 19:59:37 -0400 Subject: [PATCH 07/53] Fall back to expat if libxml2 is not present --- planet/idindex.py | 24 ++++++++++++++++++++++-- tests/test_idindex.py | 5 +---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/planet/idindex.py b/planet/idindex.py index 2a3685f..e0184bf 100644 --- a/planet/idindex.py +++ b/planet/idindex.py @@ -25,15 +25,22 @@ def destroy(): log.info(idindex + " deleted") def create(): - import libxml2 from planet import logger as log cache = config.cache_directory() index=os.path.join(cache,'index') if not os.path.exists(index): os.makedirs(index) index = dbhash.open(filename(index, 'id'),'c') + try: + import libxml2 + except: + libxml2 = False + from xml.dom import minidom + for file in glob(cache+"/*"): - if not os.path.isdir(file): + if os.path.isdir(file): + continue + elif libxml2: try: doc = libxml2.parseFile(file) ctxt = doc.xpathNewContext() @@ -45,6 +52,19 @@ def create(): doc.freeDoc() except: log.error(file) + else: + try: + doc = minidom.parse(file) + doc.normalize() + ids = doc.getElementsByTagName('id') + entry = [e for e in ids if e.parentNode.nodeName == 'entry'] + source = [e for e in ids if e.parentNode.nodeName == 'source'] + if entry and source: + index[filename('',entry[0].childNodes[0].nodeValue)] = \ + source[0].childNodes[0].nodeValue + doc.freeDoc() + except: + log.error(file) log.info(str(len(index.keys())) + " entries indexed") index.close() diff --git a/tests/test_idindex.py b/tests/test_idindex.py index b88d1ea..d21803f 100644 --- a/tests/test_idindex.py +++ b/tests/test_idindex.py @@ -52,10 +52,7 @@ class idIndexTest(unittest.TestCase): try: module = 'dbhash' - import dbhash - module = 'libxml2' - import libxml2 except ImportError: - logger.warn(module + " is not available => can't test id index") + logger.warn("dbhash is not available => can't test id index") for method in dir(idIndexTest): if method.startswith('test_'): delattr(idIndexTest,method) From b5e89c8bd2e6b7b4ef3f04340ee770c1e8c74e3d Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Mon, 16 Oct 2006 21:56:09 -0400 Subject: [PATCH 08/53] Make docs validate --- docs/config.html | 3 +++ docs/filters.html | 3 +++ docs/index.html | 18 +++++++++++++----- docs/migration.html | 3 +++ docs/normalization.html | 3 +++ docs/templates.html | 10 +++++++--- 6 files changed, 32 insertions(+), 8 deletions(-) diff --git a/docs/config.html b/docs/config.html index 9370ee8..503f350 100644 --- a/docs/config.html +++ b/docs/config.html @@ -1,3 +1,6 @@ + diff --git a/docs/filters.html b/docs/filters.html index 7efdb88..9f20686 100644 --- a/docs/filters.html +++ b/docs/filters.html @@ -1,3 +1,6 @@ + diff --git a/docs/index.html b/docs/index.html index c85f103..7889335 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,3 +1,6 @@ + @@ -7,22 +10,25 @@

Table of Contents

diff --git a/docs/migration.html b/docs/migration.html index 8c6405c..36072f6 100644 --- a/docs/migration.html +++ b/docs/migration.html @@ -1,3 +1,6 @@ + diff --git a/docs/normalization.html b/docs/normalization.html index 2f9a5f2..6e27e2a 100644 --- a/docs/normalization.html +++ b/docs/normalization.html @@ -1,3 +1,6 @@ + diff --git a/docs/templates.html b/docs/templates.html index 8ccf572..6a2fc32 100644 --- a/docs/templates.html +++ b/docs/templates.html @@ -1,3 +1,6 @@ + @@ -29,7 +32,7 @@ the following (rather substantial) subset:

- + @@ -58,7 +61,7 @@ The data values within the Items array are as follows:

VARtypesource
VARtypesource
authorStringauthor
author_nameStringauthor_detail.name
generatorStringgenerator
- + @@ -103,7 +106,7 @@ find XSLT less approachable than htmltmpl.

input is a highly normalized feed, with a few extension elements.

    -
  • atom:feed will have the following child elements:
  • +
  • atom:feed will have the following child elements:
    • A planet:source element per subscription, with the same child elements as atom:source, as well as an additional child element in the planet namespace for each @@ -112,6 +115,7 @@ this subscription.
    • planet:format indicating the format and version of the source feed.
    • planet:bozo which is either true or false.
    +
  • atom:updated and atom:published will have a planet:format attribute containing the referenced date formatted according to the [planet] date_format specified From 6946febede366e28f1936557134352dd940506b2 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Tue, 17 Oct 2006 09:40:22 -0400 Subject: [PATCH 09/53] Make idindex work on Python 2.2, and recover from corrupt or unindexed input files --- INSTALL | 167 ------------------------------------------ planet/splice.py | 5 +- tests/test_idindex.py | 5 +- 3 files changed, 7 insertions(+), 170 deletions(-) delete mode 100644 INSTALL diff --git a/INSTALL b/INSTALL deleted file mode 100644 index 5992a62..0000000 --- a/INSTALL +++ /dev/null @@ -1,167 +0,0 @@ -Installing Planet ------------------ - -You'll need at least Python 2.2 installed on your system, we recommend -Python 2.4 though as there may be bugs with the earlier libraries. - -Everything Pythonesque Planet need to provide basic operation should be -included in the distribution. Additionally: - * Usage of XSLT requires either xsltproc or python-libxslt. - * The current interface to filters written in non-templating languages - (e.g., python) uses the subprocess module which was introduced in - Python 2.4. - * Usage of FOAF as a reading list requires librdf. - -Instructions: - - i. - First you'll need to extract the files into a folder somewhere. - I expect you've already done this, after all, you're reading this - file. You can place this wherever you like, ~/planet is a good - choice, but so's anywhere else you prefer. - - ii. - This is very important: from within that directory, type the following - command: - - python runtests.py - - This should take anywhere from a one to ten seconds to execute. No network - connection is required, and the script cleans up after itself. If the - script completes with an "OK", you are good to go. Otherwise stopping here - and inquiring on the mailing list is a good idea as it can save you lots of - frustration down the road. - - iii. - Make a copy of one of the 'ini' the files in the 'examples' subdirectory, - and put them wherever you like; I like to use the Planet's name (so - ~/planet/debian), but it's really up to you. - - iv. - Edit the config.ini file in this directory to taste, it's pretty - well documented so you shouldn't have any problems here. Pay - particular attention to the 'output_dir' option, which should be - readable by your web server. If the directory you specify in your - 'cache_dir' exists, make sure that it is empty. - - v. - Run it: python planet.py pathto/config.ini - - You'll want to add this to cron, make sure you run it from the - right directory. - - vi. (Optional) - Tell us about it! We'd love to link to you on planetplanet.org :-) - - vii. (Optional) - Build your own themes, templates, or filters! And share! - - -Template files --------------- - -The template files used are given as a whitespace separated list in the -'template_files' option in config.ini. The extension at the end of the -file name indicates what processor to use. Templates may be implemented -using htmltmpl, xslt, or any programming language. - -The final extension is removed to form the name of the file placed in the -output directory. - -HtmlTmpl files --------------- - -Reading through the example templates is recommended, they're designed to -pretty much drop straight into your site with little modification -anyway. - -Inside these template files, is replaced with the content -of the 'xxx' variable. The variables available are: - - name .... } the value of the equivalent options - link .... } from the [Planet] section of your - owner_name . } Planet's config.ini file - owner_email } - - url .... link with the output filename appended - generator .. version of planet being used - - date .... { your date format - date_iso ... current date and time in { ISO date format - date_822 ... { RFC822 date format - - -There are also two loops, 'Items' and 'Channels'. All of the lines of -the template and variable substitutions are available for each item or -channel. Loops are created using ... -and may be used as many times as you wish. - -The 'Channels' loop iterates all of the channels (feeds) defined in the -configuration file, within it the following variables are available: - - name .... value of the 'name' option in config.ini, or title - title .... title retreived from the channel's feed - tagline .... description retreived from the channel's feed - link .... link for the human-readable content (from the feed) - url .... url of the channel's feed itself - - Additionally the value of any other option specified in config.ini - for the feed, or in the [DEFAULT] section, is available as a - variable of the same name. - - Depending on the feed, there may be a huge variety of other - variables may be available; the best way to find out what you - have is using the 'planet-cache' tool to examine your cache files. - -The 'Items' loop iterates all of the blog entries from all of the channels, -you do not place it inside a 'Channels' loop. Within it, the following -variables are available: - - id .... unique id for this entry (sometimes just the link) - link .... link to a human-readable version at the origin site - - title .... title of the entry - summary .... a short "first page" summary - content .... the full content of the entry - - date .... { your date format - date_iso ... date and time of the entry in { ISO date format - date_822 ... { RFC822 date format - - If the entry takes place on a date that has no prior entry has - taken place on, the 'new_date' variable is set to that date. - This allows you to break up the page by day. - - If the entry is from a different channel to the previous entry, - or is the first entry from this channel on this day - the 'new_channel' variable is set to the same value as the - 'channel_url' variable. This allows you to collate multiple - entries from the same person under the same banner. - - Additionally the value of any variable that would be defined - for the channel is available, with 'channel_' prepended to the - name (e.g. 'channel_name' and 'channel_link'). - - Depending on the feed, there may be a huge variety of other - variables may be available; the best way to find out what you - have is using the 'planet-cache' tool to examine your cache files. - - -There are also a couple of other special things you can do in a template. - - - If you want HTML escaping applied to the value of a variable, use the - form. - - - If you want URI escaping applied to the value of a variable, use the - form. - - - To only include a section of the template if the variable has a - non-empty value, you can use ..... e.g. - - -

    -
    - - You may place a within this block to specify an - alternative, or may use ... to - perform the opposite. diff --git a/planet/splice.py b/planet/splice.py index 015b4cd..e95d57f 100644 --- a/planet/splice.py +++ b/planet/splice.py @@ -68,7 +68,10 @@ def splice(): # insert entry information items = 0 for mtime,file in dir: - if index and index[file.split('/')[-1]] not in sub_ids: continue + if index: + base = file.split('/')[-1] + if index.has_key(base) and index[base] not in sub_ids: continue + try: entry=minidom.parse(file) diff --git a/tests/test_idindex.py b/tests/test_idindex.py index d21803f..d27cf18 100644 --- a/tests/test_idindex.py +++ b/tests/test_idindex.py @@ -39,8 +39,9 @@ class idIndexTest(unittest.TestCase): self.assertEqual('tag:planet.intertwingly.net,2006:testfeed1', index['planet.intertwingly.net,2006,testfeed1,1']) self.assertEqual('http://intertwingly.net/code/venus/tests/data/spider/testfeed3.rss', index['planet.intertwingly.net,2006,testfeed3,1']) - for key,value in index.items(): - if value.find('testfeed2')>0: index[key] = value[::-1] + for key in index.keys(): + value = index[key] + if value.find('testfeed2')>0: index[key] = value.swapcase() index.close() from planet.splice import splice From 17aed2496647ac3591c49188d0cebb212797dd33 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Tue, 17 Oct 2006 09:57:38 -0400 Subject: [PATCH 10/53] Documentation updates --- README | 8 ++--- TODO | 5 --- docs/config.html | 51 ++++++++++++++++++---------- docs/docs.css | 21 ++++-------- docs/docs.js | 2 ++ docs/img/shadow.gif | Bin 4363 -> 0 bytes docs/img/shadow2.gif | Bin 4043 -> 0 bytes docs/index.html | 3 +- docs/installation.html | 66 +++++++++++++++++++++++++++++++++++++ docs/normalization.html | 5 +-- themes/asf/index.html.xslt | 2 +- 11 files changed, 119 insertions(+), 44 deletions(-) delete mode 100644 docs/img/shadow.gif delete mode 100644 docs/img/shadow2.gif create mode 100644 docs/installation.html diff --git a/README b/README index a1fb9e9..3014d89 100644 --- a/README +++ b/README @@ -9,11 +9,11 @@ also actively being maintained. It uses Mark Pilgrim's Universal Feed Parser to read from CDF, RDF, RSS and Atom feeds; Leonard Richardson's Beautiful Soup to correct markup issues; -and Tomas Styblo's templating engine to output static files in any -format you can dream up. +and either Tomas Styblo's templating engine Daniel Viellard's implementation +of XSLT to output static files in any format you can dream up. -To get started, check out the INSTALL file in this directory. If you have any -questions or comments, please don't hesitate to use the planet mailing list: +To get started, check out the documentation in the docs directory. If you have +any questions or comments, please don't hesitate to use the planet mailing list: http://lists.planetplanet.org/mailman/listinfo/devel diff --git a/TODO b/TODO index 62c6c1a..0350a25 100644 --- a/TODO +++ b/TODO @@ -1,11 +1,6 @@ TODO ==== - * Enable per-feed adjustments - - The goal is to better cope with feeds that don't have dates or ids or - consitently encode or escape things incorrectly. - * Expire feed history The feed cache doesn't currently expire old entries, so could get diff --git a/docs/config.html b/docs/config.html index 503f350..4b64564 100644 --- a/docs/config.html +++ b/docs/config.html @@ -27,6 +27,7 @@ either (or both) of template_files and theme.

    Below is a complete list of predefined planet configuration parameters, including ones not (yet) implemented by Venus and ones that are either new or implemented differently by Venus.

    +
    name
    @@ -37,16 +38,35 @@ are either new or implemented differently by Venus.

    Your name
    owner_email
    Your e-mail address
    + +
    +
    +
    cache_directory
    Where cached feeds are stored
    -
    log_level
    -
    One of DEBUG, INFO, WARNING, ERROR or CRITICAL
    -
    output_theme
    +
    output_dir
    +
    Directory to place output files
    + +
    +
    + +
    theme
    Directory containing a config.ini file which is merged with this one. This is typically used to specify templating and bill of material information.
    -
    output_dir
    -
    Directory to place output files
    +
    template_files
    +
    Space-separated list of output template files
    +
    template_directories
    +
    Space-separated list of directories in which template_files +can be found
    +
    bill_of_materials
    +
    Space-separated list of files to be copied as is directly from the template_directories to the output_dir
    +
    filters
    +
    Space-separated list of filters to apply to each entry
    + +
    +
    +
    items_per_page
    How many items to put on each page. Whereas Planet 2.0 allows this to be overridden on a per template basis, Venus currently takes the maximum value @@ -61,22 +81,19 @@ for this across all templates.
    Output encoding for the file, Python 2.3+ users can use the special "xml" value to output ASCII with XML character references
    locale
    Locale to use for (e.g.) strings in dates, default is taken from your system
    +
    activity_threshold
    +
    If non-zero, all feeds which have not been updated in the indicated +number of days will be marked as inactive
    + +
    +
    + +
    log_level
    +
    One of DEBUG, INFO, WARNING, ERROR or CRITICAL
    feed_timeout
    Number of seconds to wait for any given feed
    new_feed_items
    Number of items to take from new feeds
    -
    activity_threshold
    -
    If non-zero, all feeds which have not been updated in the indicated -number of days will be marked as inactive
    -
    template_files
    -
    Space-separated list of output template files
    -
    template_directories
    -
    Space-separated list of directories in which template_files -can be found
    -
    bill_of_materials
    -
    Space-separated list of files to be copied as is directly from the template_directories to the output_dir
    -
    filters
    -
    Space-separated list of filters to apply to each entry
    diff --git a/docs/docs.css b/docs/docs.css index c5a1baf..65b290c 100644 --- a/docs/docs.css +++ b/docs/docs.css @@ -12,21 +12,18 @@ a:link, a:visited { color: #333; text-decoration: none !important; border-bottom: 1px dotted #333 !important; - text-decoration: underline; - border-bottom: 0; } a:hover { background-color: transparent; - color: #993344; + color: #934; text-decoration: none !important; - text-decoration: underline; border-bottom: 1px dotted #993344 !important; - border-bottom: 0; } code { - color: green; + background-color: #FFF; + color: #00F; font-size: large } @@ -42,14 +39,13 @@ h2 { clear: both; } -ul.outer > li { +ul, ul.outer > li { margin: 14px 0 10px 0; } .z { float:left; background: url(img/shadowAlpha.png) no-repeat bottom right !important; - background: url(img/shadow.gif) no-repeat bottom right; margin: -15px 0 20px -15px !important; } @@ -60,21 +56,18 @@ ul.outer > li { .z .sectionInner { width: 730px; background: none !important; - background: url(img/shadow2.gif) no-repeat left top; padding: 0 !important; - padding: 0 6px 6px 10; } .z .sectionInner .sectionInner2 { - background-color: #fff; border: 1px solid #a9a9a9; padding: 4px; margin: -6px 6px 6px -6px !important; - margin: 0; } ins { - color: magenta; + background-color: #FFF; + color: #F0F; text-decoration: none; } @@ -84,7 +77,7 @@ dl.compact { } dl.code > dt { - font-family: mono; + font-family: monospace; } dl.compact > dt { diff --git a/docs/docs.js b/docs/docs.js index 0b2a925..229b13c 100644 --- a/docs/docs.js +++ b/docs/docs.js @@ -1,6 +1,8 @@ window.onload=function() { var vindex = document.URL.lastIndexOf('venus/'); + if (vindex<0) vindex = document.URL.lastIndexOf('planet/'); var base = document.URL.substring(0,vindex+6); + if (vindex<0) vindex = '..'; var body = document.getElementsByTagName('body')[0]; var div = document.createElement('div'); diff --git a/docs/img/shadow.gif b/docs/img/shadow.gif deleted file mode 100644 index f1e6cb53bdc87aa155315f6ba282e3ccda0fc3f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4363 zcmeH`i9ZvJUlgR6?-Um44d5M+-x?Rt<4zb zNbYNMGnC}Ma-VbT_xt|-i{I<@eg6fY*ZckY+_JKS7(P-IQWV+-08&#^)6&v1Gc)t@ z@-P?-9*?I`D5a&POeV9uyu7xywxgqi&1Q2roZjBvk&%({@$rd?iOI>ynVFfz#l@wi zrRC-2wf_U~U;b<0|C@n7c7+8101!a)Kg0j?34kacpd+eqo0j)2T=b-ddkYOy|LM3g zEbBHM+ZYSdd-1)6p5Kg8G(#v@72{fyfC3VbT7aNPvi9S)EGtFQAV zUQM)RFTBOyX9cX!|7b7!@-X}*U;M01Iqg@yk&v=SM>&0>IYC4NX;V==)t+8z$LXkG z%yj12`T}iPC3C$*oj5x-t8`&7%&9)dwvzdqTKvz#D7*5#SEXn0v2%7+ke2UFNf#e- z+^@W1vh%HTKb$t)T;MXEF{#y++shFZ;rw&5w&PJ(? zzf?r}jK^S7qQ?=Mjs;$^+D!r6Slt1i2@m~I;skO=q-6qS!b^FaU@qsl|*&5V8C{=4j#*s-N@Fv5DNqA@UbiRD+=zEt^l#j)k8 zr>)k@)#Vwn%Qb|d_T{hlcaN>qT8r7Ne6y5~TdBLQ-my{-F_c(s(6h2xZB%uMTWvC# zYhP^+crLNlA|GS3*6In5TWi}Sb*#1T&L3UxxYTa5&er)Exz2IP=+I*u^CjMNnKEqr zyVcIc>$k!#OZxTNy^(m^2eP-l(&+e5^7VkLUdP)((T|b_-@H(guZFzWW8V$$P}v66 zzF#H(`R>QCe*a^3H2!J@e3>ul`}4z_V*z7apdF+%>KyRzafDubz(k8N(2$;J5BzH? zbsZ5nUGB>;0_BE-~x#wnf z=8t86*t=IF^)Y*~6UEryx)}5EFmRxg-*vc`+byV8i#tIJu`yB<%q^%Dfl)$%MPOm& z=u$C2XCy%HW5DrYmjKc;BKk3KP+lhCQ#}zpKh$UL!V-t(B#Nz0J zYZs*N6}DX{E>5uvx}ce_*6!j!Pi0mqX}u|Ie6Us=TeE)w6t3Q(Bh5(nzNVtvOYC@B zOwZs1DeLE}H$Qh^AP1^c&N2$w*ZmloANExsLh78?(#2WR*Um$G3tQe6Gd?c`sh*!u z@3iV+QIXS|<(&e;Rvbu*2gpd$pF%yo6xWl~SdixRxnZ#A38;yoEX{y2l`LaXik-m7nm z30b@9cXX8dFs=neOT2_b68h2|-ToWa!7mprxPW8Mr zdSdBi@9P(lRMLQbSSdvbcF}!KX|RGBOL=#}{=qsgwR-J}N5H{LvfxGM-#eu=Z$nM5 zRxGy>fu|$cE_TXp$}J9#dJ)xsQFO^eQ_f6=u4r{rg-U zjy1qe_h(px7yZ)Cj~@6ok7|srMwC^ZGrSBp!j5kG;;NS}4ZWLiqwMw!T5MJS^JI+t zGx>Ab*WO>3LzI=q1a9DJkNAp)ovca_(S!T}{IGIUN%L3Oo$@-N3hk)u^`DYtgRf_` zE=HTh4V*{{pqw#Y_0^AiBJwX<7|=E8%%|d$5@&vKAa^^H8aI zuw}_&4W1I`p^`S(Iv%<99^dgmo2D|T%m*kPC?_k&!&W{@%w>Jw8+L&5nC72TLWE4iw!T?cxTH~1KnYf z8xJqAonSNlJ?|Pf+^XZ)XzPW}B3k(>9PvhTa9 z_77M#Zr*t-dEaBZZxAZ7WgBUG&#SqQt7WkTONn>zPU{;|irl(|XWxDCtZ!JZam&0^ z@~-dIz7cVe?VF9Zcl?g_eLpncHtvtNe>d3sV=ZFaXo_tIC-ja^H*7;TCG9@E@BKL} zymLjw&Nl2;?-<8?M^_eU6LqThS6#%;`1V-9xx){WRZ zHpMYz5xSOC8ummtfu=R@yOzPi`ywLtH|uV7tpLsU1!YktO{cn61ta$P=R0q-&2+A9 z)$i}?OWojDyPN#8pvEhd^xK6|QXB=K?{o!PZl;P4<&K^RD&;Qk6 z4_Q0P+5ce1AMHb3-5O*c_=WRFCOZvy1ookKJ)gTFWpMbO&Hw(`OG8dq5EAl6AjBy= zsa{%YcX< zjp26DvexCg_k2ujL6Nz4BUSSw#rz|kx$^E1-A64Z9y^gE0+HU%r=F%q-HMF*i|gvU z6GfB#Jm?-Z6ofe~MfEblNOhS|&Oy8Wa_v6YG34nx7u+{`OOX zntLK7rt#01)M$59dW;e?Cd=6?XD3F@I~>c^Om{};c1NGgM}TAy#M@4U9fYHFY_S@+ z#5s2CZEQKj16LmVY!*=?8deR8`&%@wVK$5v5U21BAyprD`bk_{i*qX|eoZ944%jqU5$vfQ(0ih6xG=aYtHDjYG7LS((nHC)hY72n{9hO+Tw{Bpi2p1yP*l1fle296VbDYxJOL^4at!6$Msmq(GOQ5u$VQDw?)BIiH^@q~jFli%7>G+Mb zkRiQy708IdOR+JqsKE5!pVMc#>Aj{I^WF^M#c*e8apJDTcJsi zx5l}kMHm^Q>F8#`%#spxQHD&hp=Md2b%{&niPp5L3~6d$e8uj?`a@OLG=gA)SK1UQQjG)(xw zBZPp7VNha(D=`XAj7Ad?EMna3FcHZkCV&eQp@qpLf@lIjoCc867Lct4NK1>i>A)AsEfnY zB_4GJ{AGC#4Y88^DzzjRP09b8FQ7@?otqaSq>ko6Qe^-4fM0ATb#0!WTq diff --git a/docs/img/shadow2.gif b/docs/img/shadow2.gif deleted file mode 100644 index a0b9ed4bfc79c4954979ab7254305c400c9c43a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4043 zcmeH``9Bj51IJ1AMWIweLWwqXpxA|q6qSl-6P6>*ea}#mIp$_#HpiADh7!guLlF%{ zZj&RC3@PN+JkR&@893=*Xwi5+zbSEQWaAbTN4pU>r30&+4(O;{=feh_}?pV zVq>?ch{!Gx?SIw({e+0PP((~z>3ZdhcUbX5n)bZP{N}g=Y8JWIs|s2Y<@G#9cvXcT zQdLb7l+3G(+6VyaGW)jbmmOK>UD|Wa>BXONK!LL(ZS;~Z>Lsk?af=#Scj0w{rbBy8 zX>ZA$LW?|$+Oqy~INf8ky|#St&BNw_!F;Z-w@=aFdL^JMC^FbUjFg9@CMb=;nMQ# z5Z!aUv%YR>Zme0DsB*i3i}^j>TaN5%`0Mp&VX}jIyV1ybeRX+mysNQsB}%vl@HKKb zJ`VX@T!Z#CigBFx6??!8aKcU65;YMc@5Z|yqlliFh*J#^|Asq7B)!0C6w|&XEamgQ zC7y3(YiEt>oORnqqa&*Q}l}&kAk@$Melw{HAB+dmo5b70)8ftNPb(5jBh7+l=4hEWTt?AD@=f* zra<^*Z=}(46@gOW^YAW9Xg_0II(UJj_bL3>^&M$gcaw}v&|>Ry(vv07xh~kJPGgzC zKRxuDPgelQRKvDmUzvclvB3Qi>+-3$jasIuGX9&hdLJXU#2aOd-z{~?`2Ag7PJAX@ zU+6Nf7jCI=cL6S;4^~FbKvZ|Ny?nbTs{Fb1l-zDL+-nJ|G&?!2YK<=KvYUS;mba-Y z9#?%o>Yh3w}>O1!n!=0w>0nPWjD`OiHPDmdMX+EA^7AG`1Oq9mLL8`Kg z)@HDRs#x0l2KB1=CFhfep{HAbQ56ZcO2_5sD9)JxonXi9lXFdg*1`0uq-v;|qGw6# z#cvhKJ|oAKCTHrvJvtaPS8Z{L_F;0dDz$w}O*Q8<@A8#5X|cJ=Cl9&TU)9wOPkC}` z?If`6*WGITx4Kgr9VKnI3f>SX_9_4qLBn0VZbUIm{jXJN`&LzT=4QCM_SWeR#I8yr zLrL{)p!-{gCEe!@+v;Li;KzSt=_Fa0hOQRv<0I!va_5NZg+jqQcPqW<0j`Dwz4X(e z0D6w*wg%_{pwqwUx6AZA|4^?&QE)Z=+QO5^q;}wKn-)4nU&uLa^r)!oDJO{{+;3wn z=AjWOn_(?xNQ;*(yCbVplYc@NV5+t9IljWYKrZIqRlS7#*a+g+Mr~l4nY-aBvBd^VBz&pHt zURJN1e*?jwLp-%n6Tso_P6EBSALVYH)74*1q*go?{xrU;^~K~VgYk}i#%IOs%jjMU zX2W+WKkOWHNOmy4)zHT@ynF;I#bgtl&j!_IjtJal*aH{sgX#Nveg=dTjs2}Kf2lR5 z>%`=ifX{{9C>&c!DXw3Tl6o?^Mc(KMxj0e(D{{UZDfyk*D4aMKsipQ+^mg&vy(#;n z4sDb6=&^L9BPxe^T2AU$SxvF*^Rdw7aj6g2nw6#Z<4m@*4iZQ<$BnAOZoYD^uVl5{ zwa`hDIyI>vMr_h==uQk&Dpy=4L7~E`uYTH7{3{Hei=-}|UofR!{<6)|Y+pv97ZGSp z*0ya3AeM5!148(1NXGzDI&Au67J~O!=r7C;lwh!oo4PFdj-A^9+OVzle7waH&p^5mQ@`uoqv%y*5GQL#& zqIhyAAio#`4_>bsc{a3hepRl1Dc>3Mcv}VeT_$H=_RlkqCNk%Dk^TrxM#ba(bI2ma z*1qIuqkF46XOV;+d8vYQ=LzpZmheRTqSHI5b}(lti7`@ej*9wt0shQe_jOt36pc6TzmGohtK{Kq(7Q_Tjg=zJMfB+twYZJMz?`d_6iC;N=72x zhSI^S&O`^&d z65ddq=kq~Z8Uv2;Ok?MTc-EHc>R4RkxYKWc(6*u+GWNqWrzHey`>_6abeD?LpUa@X z(zZzKVB^D8ppf-f96kPg9QknlAV|22h>ZNPgWTL;3b$*=BYshl+Y<&mtNqBQYsN@n z8*}IP%6Rw=(@+#=CL5j z(Y)u_B$w!TY;?L_v?Qfcgg~8YD0=?>W^`R+uxRtos5Zb z9kP6giLI%M$sojf0FHUdgZwdIpY>Qv>p1j`V&IG^h7?y;6_?!`7r|4C0^y29al%k6 z?%sviSb%B*+#nTmHE9SZYKzMND5lFBkZD&5nE0)#cyF-;hrW0UNu_|KUm|W+1W#B= zPk1z$;8K(Digua^O3W5bbiyXOol0cPD07A`Hj>P^Lx~#JiSJPg??@NhcxKI*Btcb@ zjaag8Us5OSz8gGQ- z(3=CL9+FF06?a@BrDocsZo}n&!!L-kuWhZTcI%{F#->HwOWV7lBw1=H97;PWmoAHN zK8#2Qw5G`;qK~rE&km$3E4U~s;NLH%J->iI1-zh2#s@j!!ISvtXdzykf9yO$?_%h6 zT`<9nK!A{s87Sx(mtKeQ3AG0^&bVYGU&t_3a9C$$tUk{Gie;u1WmtyB-9u!CvGDK> zS37p5)j*~r;?Y9|B3z&73d~f;5(z<>uAw+L1)_(7uD`pv7oV82OmqZi9WTrx-^)VB z$79%;PslphHuH#$EW1M_ID&MfnM4gD;rPHb1u~OHvJsFDV#x&;$Qc4;E}zUpku6Kf zQYP8D{TVMLQg)?h|8&Zhn9RNyll`hRg$mA*)X2Uek+Y{T2c(|EFi)-B$oYxOF>T8c zb;*T(&uKy&=kd>d5?HshbM;Mf4L5Q(obxUp$?K^JP3tQq3?a^qo8KE|=SlPP^b{zI zQIu;JDN{g$cYKP7J4L&c^79JSqJ{FiE&Ugn8s$V4e52lqp>89TMC{J)k+j(bd2x?L zm7G2LPuTq>GF}E^BQgAhUI|hlC7XY$G@oBkfUqgh z;KTwH@!EE0^xAFCZWj2-7b+tPyPFD;!G$1?%u9+z2w;J!;!z__1cZ}ru4!u$R#bZM IfQSh6KVhA$B>(^b diff --git a/docs/index.html b/docs/index.html index 7889335..b19d0c8 100644 --- a/docs/index.html +++ b/docs/index.html @@ -10,6 +10,7 @@

    Table of Contents

      +
    • Getting started
    • Basic Features
    • -
    • Legal +
    • Credits and License
      • Authors
      • Contributors
      • diff --git a/docs/installation.html b/docs/installation.html new file mode 100644 index 0000000..42eff05 --- /dev/null +++ b/docs/installation.html @@ -0,0 +1,66 @@ + + + + + +Venus Installation + + +

        Installation

        +

        Venus has been tested on Linux, and Mac OSX, and Windows.

        + +

        You'll need at least Python 2.2 installed on your system, we recommend +Python 2.4 though as there may be bugs with the earlier libraries.

        + +

        Everything Pythonesque Planet need to provide basic operation should be +included in the distribution. Additionally:

        +
          +
        • Usage of XSLT requires either +xsltproc +or python-libxslt.
        • +
        • The current interface to filters written in non-templating languages +(e.g., python) uses the +subprocess +module which was introduced in Python 2.4.
        • +
        • Usage of FOAF as a reading list requires +librdf.
        • +
        + +

        Instructions

        + +
          +
        1. If you are reading this online, you will need to +download and extract the files into a folder somewhere. +You can place this wherever you like, ~/planet +and ~/venus are good +choices, but so's anywhere else you prefer.

        2. +
        3. This is very important: from within that directory, type the following +command:

          +
          python runtests.py
          +

          This should take anywhere from a one to ten seconds to execute. No network +connection is required, and the script cleans up after itself. If the +script completes with an "OK", you are good to go. Otherwise stopping here +and inquiring on the +mailing list + is a good idea as it can save you lots of frustration down the road.

        4. +
        5. Make a copy of one of the ini the files in the +examples subdirectory, +and put it wherever you like; I like to use the Planet's name (so +~/planet/debian), but it's really up to you.

        6. +
        7. Edit the config.ini file in this directory to taste, +it's pretty well documented so you shouldn't have any problems here. Pay +particular attention to the output_dir option, which should be +readable by your web server. If the directory you specify in your +cache_dir exists; make sure that it is empty.

        8. +
        9. Run it: python planet.py pathto/config.ini

          +

          You'll want to add this to cron, make sure you run it from the +right directory.

        10. +
        11. (Optional)

          +

          Tell us about it! We'd love to link to you on planetplanet.org :-)

        12. +
        13. (Optional)

          +

          Build your own themes, templates, or filters! And share!

        14. +
        + + diff --git a/docs/normalization.html b/docs/normalization.html index 6e27e2a..63455ea 100644 --- a/docs/normalization.html +++ b/docs/normalization.html @@ -51,12 +51,13 @@ in other areas in the feed too.

        knowledge of the semantics of HTML. Additionally, a large subset of MathML, as well as a -tiny profile of SVG is also supported.

        +tiny profile of SVG +is also supported.

        Atom 1.0

        The Universal Feed Parser also normalizes the content of feeds. This involves a large number of elements; the best place to start is to look at -annotated examples. Among other things a large number of +annotated examples. Among other things a wide variety of date formats are converted into RFC 3339 formatted dates.

        diff --git a/themes/asf/index.html.xslt b/themes/asf/index.html.xslt index dbd6246..fffdcd8 100644 --- a/themes/asf/index.html.xslt +++ b/themes/asf/index.html.xslt @@ -153,7 +153,7 @@ - + From 48a4b8984042cdfad949db05e65a6984e28cf1ae Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Tue, 17 Oct 2006 11:17:15 -0400 Subject: [PATCH 11/53] Better recovery on index failures --- planet/idindex.py | 13 +++++++++---- planet/spider.py | 8 +++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/planet/idindex.py b/planet/idindex.py index e0184bf..b0eacf9 100644 --- a/planet/idindex.py +++ b/planet/idindex.py @@ -9,10 +9,15 @@ from planet.spider import filename from planet import config def open(): - cache = config.cache_directory() - index=os.path.join(cache,'index') - if not os.path.exists(index): return None - return dbhash.open(filename(index, 'id'),'w') + try: + cache = config.cache_directory() + index=os.path.join(cache,'index') + if not os.path.exists(index): return None + return dbhash.open(filename(index, 'id'),'w') + except Exception, e: + if e.__class__.__name__ == 'DBError': e = e.args[-1] + from planet import logger as log + log.error(str(e)) def destroy(): from planet import logger as log diff --git a/planet/spider.py b/planet/spider.py index ba79c75..d9b4c00 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -15,6 +15,8 @@ re_slash = re.compile(r'[?/:|]+') re_initial_cruft = re.compile(r'^[,.]*') re_final_cruft = re.compile(r'[,.]*$') +index = True + def filename(directory, filename): """Return a filename suitable for the cache. @@ -197,7 +199,8 @@ def spiderFeed(feed): scrub(feed, data) from planet import idindex - index = idindex.open() + global index + if index != None: index = idindex.open() # write each entry to the cache cache = config.cache_directory() @@ -290,6 +293,9 @@ def spiderPlanet(): log = planet.getLogger(config.log_level()) planet.setTimeout(config.feed_timeout()) + global index + index = True + for feed in config.subscriptions(): try: spiderFeed(feed) From 4a777e1fca47f8ad4418c6643180ebce96026a67 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Tue, 17 Oct 2006 11:17:26 -0400 Subject: [PATCH 12/53] Documentation nits --- docs/config.html | 8 ++++---- docs/docs.css | 1 + docs/filters.html | 4 ++-- docs/installation.html | 5 +++-- docs/normalization.html | 6 +++--- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/docs/config.html b/docs/config.html index 4b64564..70c6710 100644 --- a/docs/config.html +++ b/docs/config.html @@ -40,7 +40,7 @@ are either new or implemented differently by Venus.

        Your e-mail address
        -
        +
        cache_directory
        Where cached feeds are stored
        @@ -48,7 +48,7 @@ are either new or implemented differently by Venus.

        Directory to place output files
        -
        +
        theme
        Directory containing a config.ini file which is merged @@ -65,7 +65,7 @@ can be found
        Space-separated list of filters to apply to each entry
        -
        +
        items_per_page
        How many items to put on each page. Whereas Planet 2.0 allows this to @@ -86,7 +86,7 @@ for this across all templates.
        number of days will be marked as inactive
        -
        +
        log_level
        One of DEBUG, INFO, WARNING, ERROR or CRITICAL
        diff --git a/docs/docs.css b/docs/docs.css index 65b290c..5049baa 100644 --- a/docs/docs.css +++ b/docs/docs.css @@ -78,6 +78,7 @@ dl.compact { dl.code > dt { font-family: monospace; + font-size: large; } dl.compact > dt { diff --git a/docs/filters.html b/docs/filters.html index 9f20686..90cc799 100644 --- a/docs/filters.html +++ b/docs/filters.html @@ -44,7 +44,7 @@ expressions.

        • The file extension of the filter is significant. .py invokes -python. .xslt involkes xslt. .sed and +python. .xslt involkes XSLT. .sed and .tmpl (a.k.a. htmltmp) are also options. Other languages, like perl or ruby or class/jar (java), aren't supported at the moment, but these would be easy to add.
        • @@ -58,7 +58,7 @@ configuration file (think unix pipes). Planet wide filters are executed before feed specific filters.
        • Templates written using htmltmpl currently only have access to a fixed set -of fields, whereas xslt templates have access to everything.
        • +of fields, whereas XSLT templates have access to everything.
        diff --git a/docs/installation.html b/docs/installation.html index 42eff05..8d62ad7 100644 --- a/docs/installation.html +++ b/docs/installation.html @@ -14,8 +14,9 @@

        You'll need at least Python 2.2 installed on your system, we recommend Python 2.4 though as there may be bugs with the earlier libraries.

        -

        Everything Pythonesque Planet need to provide basic operation should be -included in the distribution. Additionally:

        +

        Everything Pythonesque Planet needs to provide basic operation should be +included in the distribution. Some optional features may require +additional libraries, for example:

        • Usage of XSLT requires either xsltproc diff --git a/docs/normalization.html b/docs/normalization.html index 63455ea..5577899 100644 --- a/docs/normalization.html +++ b/docs/normalization.html @@ -12,11 +12,11 @@

          Venus builds on, and extends, the Universal Feed Parser and BeautifulSoup to -convert all feeds into Atom 1.0, with well formed XHTML, and encoded as utf-8, +convert all feeds into Atom 1.0, with well formed XHTML, and encoded as UTF-8, meaning that you don't have to worry about funky feeds, tag soup, or character encoding.

          Encoding

          -

          Input data in feeds may be enocded in a variety of formats, most commonly +

          Input data in feeds may be encoded in a variety of formats, most commonly ASCII, ISO-8859-1, WIN-1252, AND UTF-8. Additionally, many feeds make use of the wide range of character entity @@ -70,7 +70,7 @@ are converted into

        If no updated dates are found in an entry, or if the dates found -are in the future, the current time is substitued.

        +are in the future, the current time is substituted.

        Overrides

        All of the above describes what Venus does automatically, either directly or through its dependencies. There are a number of errors which can not From 59aa2a964c88a3d08cd72fba6a70020e351b0d4c Mon Sep 17 00:00:00 2001 From: Eric van der Vlist Date: Tue, 17 Oct 2006 18:39:09 +0200 Subject: [PATCH 13/53] added a couple of examples --- examples/filters/categories/categories.xslt | 82 + examples/filters/guess-language/README | 37 + examples/filters/guess-language/en.data | 15131 ++++++++++ examples/filters/guess-language/fr.data | 22710 ++++++++++++++++ .../filters/guess-language/guess-language.py | 58 + .../filters/guess-language/learn-language.py | 25 + examples/filters/guess-language/trigram.py | 188 + 7 files changed, 38231 insertions(+) create mode 100644 examples/filters/categories/categories.xslt create mode 100644 examples/filters/guess-language/README create mode 100644 examples/filters/guess-language/en.data create mode 100644 examples/filters/guess-language/fr.data create mode 100644 examples/filters/guess-language/guess-language.py create mode 100755 examples/filters/guess-language/learn-language.py create mode 100644 examples/filters/guess-language/trigram.py diff --git a/examples/filters/categories/categories.xslt b/examples/filters/categories/categories.xslt new file mode 100644 index 0000000..fa95464 --- /dev/null +++ b/examples/filters/categories/categories.xslt @@ -0,0 +1,82 @@ + + +]> + + + ,.;AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzÀàÁáÂâÃãÄäÅ寿ÇçÈèÉéÊêËëÌìÍíÎîÏïÐðÑñÒòÓóÔôÕõÖöØøÙùÚúÛûÜüÝýÞþ + aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzzaaaaaaaaaaaaææcceeeeeeeeiiiiiiiiððnnooooooooooøøuuuuuuuuyyþþ + + wiki semantique + wikis semantiques + web semantique + websemantique + semantic web + semweb + rdf + owl + sparql + topic map + doap + foaf + sioc + ontology + ontologie + dublin core + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/filters/guess-language/README b/examples/filters/guess-language/README new file mode 100644 index 0000000..b1c1c2e --- /dev/null +++ b/examples/filters/guess-language/README @@ -0,0 +1,37 @@ +This filter is released under the same licence as Python +see http://www.intertwingly.net/code/venus/LICENCE. + +Author: Eric van der Vlist + +This filter guesses whether an Atom entry is written +in English or French. It should be trivial to chose between +two other languages, easy to extend to more than two languages +and useful to pass these languages as Venus configuration +parameters. + +The code used to guess the language is the one that has been +described by Douglas Bagnall as the Python recipe titled +"Language detection using character trigrams" +http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/326576. + +To add support for a new language, this language must first be +"learned" using learn-language.py. This learning phase is nothing +more than saving a pickled version of the Trigram object for this +language. + +To learn Finnish, you would execute: + +$ ./learn-language.py http://gutenberg.net/dirs/1/0/4/9/10492/10492-8.txt fi.data + +where http://gutenberg.net/dirs/1/0/4/9/10492/10492-8.txt is a text +representative of the Finnish language and "fi.data" is the name of the +data file for "fi" (ISO code for Finnish). + +To install this filter, copy this directory under the Venus +filter directory and declare it in your filters list, for instance: + +filters= categories.xslt guess-language/guess-language.py + +NOTE: this filter depends on Amara +(http://uche.ogbuji.net/tech/4suite/amara/) + diff --git a/examples/filters/guess-language/en.data b/examples/filters/guess-language/en.data new file mode 100644 index 0000000..a7c5ca6 --- /dev/null +++ b/examples/filters/guess-language/en.data @@ -0,0 +1,15131 @@ +(itrigram +Trigram +p1 +(dp2 +S'length' +p3 +F5471.4726536829185 +sS'lut' +p4 +(dp5 +V b +p6 +(dp7 +Va +I7 +sVe +I568 +sVi +I11 +sVl +I17 +sVo +I20 +sVr +I56 +sVu +I188 +sVy +I148 +ssV c +p8 +(dp9 +Va +I189 +sVe +I20 +sVd +I2 +sVi +I12 +sVh +I74 +sVl +I16 +sVo +I463 +sVr +I22 +sVu +I2 +ssVgu +p10 +(dp11 +Va +I9 +sVe +I5 +sVi +I9 +sVm +I1 +sVl +I2 +sVn +I3 +sVr +I1 +sVt +I1 +ssV a +p12 +(dp13 +V +I330 +sVc +I85 +sVb +I70 +sVd +I47 +sVg +I73 +sVf +I83 +sVi +I3 +sVm +I148 +sVl +I216 +sVn +I858 +sVp +I48 +sVs +I282 +sVr +I101 +sVu +I15 +sVt +I203 +sVw +I28 +sVv +I7 +ssV f +p14 +(dp15 +Va +I109 +sVe +I95 +sVi +I76 +sVl +I16 +sVo +I371 +sVr +I155 +sVu +I23 +sVt +I2 +ssV g +p16 +(dp17 +Va +I16 +sVe +I45 +sVi +I68 +sVl +I8 +sVo +I89 +sVr +I81 +sVu +I11 +ssV d +p18 +(dp19 +Va +I90 +sVe +I275 +sVi +I178 +sVo +I142 +sVr +I24 +sVu +I18 +sVw +I1 +ssV e +p20 +(dp21 +Va +I48 +sVc +I3 +sVd +I12 +sVf +I12 +sVi +I7 +sVm +I13 +sVl +I14 +sVn +I107 +sVq +I17 +sVp +I1 +sVs +I26 +sVr +I5 +sVt +I31 +sVv +I132 +sVy +I10 +sVx +I117 +ssV j +p22 +(dp23 +Ve +I11 +sVu +I41 +sVo +I11 +ssV k +p24 +(dp25 +Vi +I22 +sVe +I14 +sVn +I90 +ssV h +p26 +(dp27 +Va +I525 +sVe +I739 +sVi +I320 +sVo +I168 +sVu +I33 +sVy +I2 +ssV i +p28 +(dp29 +Vd +I17 +sVg +I3 +sVf +I62 +sVm +I87 +sVl +I14 +sVn +I599 +sVs +I287 +sVr +I3 +sVt +I254 +ssV n +p30 +(dp31 +Va +I19 +sVu +I5 +sVe +I98 +sVi +I10 +sVo +I438 +ssV o +p32 +(dp33 +Vc +I14 +sVb +I32 +sVd +I2 +sVf +I741 +sVl +I9 +sVn +I225 +sVp +I36 +sVs +I1 +sVr +I90 +sVu +I70 +sVt +I44 +sVw +I47 +sVv +I20 +ssV l +p34 +(dp35 +Va +I80 +sVe +I154 +sVi +I107 +sVo +I115 +sVs +I4 +sVu +I1 +ssV m +p36 +(dp37 +Va +I319 +sVe +I281 +sVg +I1 +sVi +I107 +sVo +I229 +sVu +I149 +sVy +I347 +ssV r +p38 +(dp39 +Vi +I18 +sVu +I12 +sVe +I378 +sVa +I20 +sVo +I25 +ssV s +p40 +(dp41 +Va +I111 +sVc +I31 +sVe +I206 +sVi +I105 +sVh +I339 +sVm +I7 +sVl +I7 +sVo +I297 +sVp +I70 +sVu +I197 +sVt +I85 +sVw +I6 +sVy +I5 +ssV p +p42 +(dp43 +Va +I102 +sVe +I104 +sVi +I7 +sVh +I2 +sVl +I63 +sVo +I84 +sVr +I205 +sVu +I22 +ssV q +p44 +(dp45 +Vu +I40 +ssV v +p46 +(dp47 +Va +I23 +sVi +I40 +sVe +I95 +sVo +I4 +ssV w +p48 +(dp49 +Va +I243 +sVe +I172 +sVi +I425 +sVh +I382 +sVo +I157 +sVr +I39 +ssV t +p50 +(dp51 +Va +I56 +sVe +I60 +sVi +I69 +sVh +I1425 +sVm +I1 +sVo +I997 +sVr +I66 +sVu +I4 +sVw +I21 +ssV u +p52 +(dp53 +Vg +I1 +sVi +I1 +sVn +I132 +sVp +I26 +sVs +I50 +sVr +I10 +sVt +I4 +ssV z +p54 +(dp55 +Vi +I1 +ssVgn +p56 +(dp57 +Va +I2 +sV +I7 +sVe +I3 +sVi +I6 +sV, +I2 +sVo +I4 +sVs +I1 +ssV x +p58 +(dp59 +V +I1 +ssV y +p60 +(dp61 +Vi +I2 +sVe +I38 +sVo +I469 +ssV-Y +p62 +(dp63 +Vo +I3 +ssVlk +p64 +(dp65 +Vi +I5 +sV +I2 +sVs +I3 +sVe +I3 +ssVgi +p66 +(dp67 +Vb +I1 +sVe +I4 +sVn +I111 +sVr +I29 +sVt +I5 +sVv +I45 +sVz +I2 +ssVgh +p68 +(dp69 +V +I61 +sVb +I1 +sVe +I3 +sVi +I2 +sV, +I7 +sVl +I11 +sVt +I170 +sV; +I2 +ssV B +p70 +(dp71 +Va +I5 +sVE +I1 +sVi +I1 +sVo +I2 +sVR +I2 +sVu +I12 +sVy +I6 +sVU +I2 +sVe +I6 +ssV C +p72 +(dp73 +Va +I15 +sVA +I8 +sVe +I1 +sVh +I58 +sVl +I2 +sVO +I31 +sV. +I6 +sVr +I2 +sVo +I33 +ssV-g +p74 +(dp75 +Vr +I1 +ssV A +p76 +(dp77 +V +I3 +sVr +I1 +sVB +I1 +sVd +I8 +sVg +I1 +sVf +I3 +sVS +I3 +sVm +I4 +sVl +I14 +sVN +I2 +sVs +I11 +sVR +I2 +sVu +I6 +sVT +I1 +sVw +I1 +sVn +I5 +sVL +I5 +sVt +I11 +ssV F +p78 +(dp79 +Va +I2 +sVo +I7 +sVi +I1 +sVl +I1 +sVO +I4 +sV. +I1 +sVI +I1 +sVr +I89 +sVT +I2 +sVR +I2 +ssV G +p80 +(dp81 +VE +I2 +sVi +I1 +sVo +I4 +sVI +I1 +sVu +I17 +sVU +I9 +sVe +I1 +ssV D +p82 +(dp83 +VA +I3 +sVe +I32 +sVi +I3 +sVO +I3 +sVI +I3 +sVu +I2 +sVo +I7 +sVE +I29 +ssV E +p84 +(dp85 +VB +I2 +sVD +I1 +sVv +I4 +sVl +I1 +sVn +I4 +sVd +I9 +sVT +I6 +sVX +I1 +sVV +I2 +sVx +I2 +sVN +I1 +sVt +I9 +ssV J +p86 +(dp87 +Va +I60 +sVu +I1 +sVo +I18 +sVO +I17 +ssVtw +p88 +(dp89 +Vi +I1 +sVa +I2 +sVe +I18 +sVo +I17 +ssVtt +p90 +(dp91 +Va +I28 +sVe +I129 +sVi +I11 +sVl +I36 +sVr +I6 +sVy +I4 +ssV I +p92 +(dp93 +V +I766 +sVF +I3 +sVI +I2 +sVs +I2 +sVf +I25 +sVM +I1 +sVL +I1 +sVN +I7 +sVS +I1 +sVt +I27 +sVV +I1 +sVX +I1 +sV; +I1 +sVn +I12 +sV, +I5 +sVT +I1 +ssVtr +p94 +(dp95 +Va +I39 +sVe +I58 +sVi +I31 +sVo +I23 +sVu +I33 +sVy +I18 +ssVts +p96 +(dp97 +V +I63 +sV" +I1 +sVe +I4 +sV* +I1 +sV, +I20 +sV. +I10 +sV; +I3 +ssV L +p98 +(dp99 +Va +I96 +sVA +I35 +sVE +I1 +sVI +I5 +sVo +I22 +sVi +I1 +sVe +I6 +ssV M +p100 +(dp101 +Va +I62 +sVA +I2 +sVC +I1 +sVe +I1 +sVG +I1 +sVi +I32 +sVO +I1 +sV. +I2 +sVy +I35 +sVR +I40 +sVu +I2 +sVo +I12 +sVY +I1 +sVE +I4 +sVr +I96 +sVU +I1 +sVI +I1 +ssV R +p102 +(dp103 +VE +I5 +sVe +I81 +sVo +I1 +sV. +I4 +ssV S +p104 +(dp105 +VO +I1 +sVA +I4 +sVE +I1 +sV +I1 +sVi +I64 +sVh +I42 +sVM +I2 +sVm +I6 +sVo +I5 +sV. +I20 +sVp +I1 +sVu +I90 +sVt +I24 +sVH +I3 +sVI +I2 +sVU +I24 +sVe +I10 +sVT +I1 +ssV P +p106 +(dp107 +Va +I7 +sVA +I1 +sVe +I1 +sVl +I3 +sVO +I1 +sV. +I1 +sVR +I9 +sVU +I4 +sVo +I7 +sVr +I29 +ssVtm +p108 +(dp109 +Va +I2 +sV +I4 +sV" +I1 +sVe +I12 +sVo +I3 +ssV V +p110 +(dp111 +Va +I1 +sV +I1 +sVe +I66 +sVI +I3 +sVo +I1 +sV. +I4 +sVE +I50 +ssV W +p112 +(dp113 +VA +I4 +sVe +I27 +sVi +I11 +sVh +I33 +sVo +I1 +sVH +I1 +ssVth +p114 +(dp115 +Va +I378 +sV +I240 +sVe +I1023 +sV' +I4 +sVf +I4 +sVi +I255 +sVh +I1 +sVl +I3 +sVo +I105 +sV. +I9 +sVs +I10 +sVr +I15 +sV! +I1 +sVy +I5 +sVu +I1 +sV; +I2 +sV: +I1 +sV, +I10 +ssVti +p116 +(dp117 +Va +I6 +sVc +I42 +sVb +I4 +sVe +I29 +sVf +I21 +sVm +I71 +sVl +I41 +sVo +I338 +sVn +I114 +sVs +I18 +sVr +I16 +sVt +I9 +sVv +I27 +ssVtf +p118 +(dp119 +Vu +I18 +ssV [ +p120 +(dp121 +VE +I1 +sVD +I1 +sVg +I1 +sV* +I3 +sVM +I1 +sV1 +I4 +sV3 +I2 +sV2 +I3 +sVt +I3 +sVx +I1 +ssVG- +p122 +(dp123 +V +I1 +sVt +I4 +sVT +I1 +ssVte +p124 +(dp125 +Va +I11 +sV +I126 +sVc +I5 +sVe +I11 +sVd +I149 +sVg +I2 +sVf +I5 +sVm +I28 +sVl +I69 +sVp +I1 +sVn +I150 +sV. +I8 +sVs +I24 +sVr +I287 +sVv +I8 +sVx +I46 +sV; +I1 +sV: +I1 +sV, +I13 +sV? +I1 +ssV-y +p126 +(dp127 +Vo +I2 +ssVtc +p128 +(dp129 +Vh +I29 +sV. +I1 +ssVta +p130 +(dp131 +Vc +I31 +sVb +I19 +sVg +I12 +sVf +I3 +sVi +I30 +sVk +I50 +sVl +I27 +sVn +I61 +sVs +I1 +sVr +I3 +sVu +I2 +sVt +I57 +sVy +I9 +sVx +I3 +sV, +I1 +ssV " +p132 +(dp133 +VA +I3 +sVC +I2 +sVB +I2 +sVD +I2 +sVG +I1 +sVF +I3 +sVI +I22 +sVH +I3 +sVM +I3 +sVO +I2 +sVN +I4 +sVP +I6 +sVS +I6 +sVR +I1 +sVW +I2 +sVY +I2 +sVa +I1 +sVb +I4 +sVd +I1 +sVi +I2 +sVh +I2 +sVo +I2 +sVp +I1 +sVs +I1 +sVr +I1 +sVt +I2 +sVw +I2 +sVy +I2 +ssV # +p134 +(dp135 +V9 +I1 +sV6 +I1 +ssS' ' +p136 +(dp137 +V +I606 +sV# +I1 +sV" +I9 +sV& +I1 +sV( +I4 +sV* +I12 +sV- +I3 +sV2 +I2 +sVA +I19 +sVC +I47 +sVB +I4 +sVE +I8 +sVD +I8 +sVG +I2 +sVF +I17 +sVI +I68 +sVH +I6 +sVJ +I7 +sVM +I56 +sVL +I34 +sVO +I3 +sVN +I2 +sVP +I12 +sVS +I37 +sVR +I15 +sVU +I9 +sVT +I26 +sVW +I20 +sVV +I18 +sVY +I33 +sVX +I32 +sV[ +I12 +sVa +I172 +sVc +I92 +sVb +I78 +sVe +I62 +sVd +I78 +sVg +I25 +sVf +I67 +sVi +I107 +sVh +I118 +sVk +I7 +sVj +I8 +sVm +I103 +sVl +I35 +sVo +I81 +sVn +I40 +sVq +I4 +sVp +I65 +sVs +I128 +sVr +I49 +sVu +I25 +sVt +I140 +sVw +I108 +sVv +I11 +sVy +I34 +ssV & +p138 +(dp139 +Vc +I20 +ssV $ +p140 +(dp141 +V2 +I1 +ssV * +p142 +(dp143 +VB +I1 +sVE +I2 +sV* +I8 +sVn +I1 +sVT +I1 +sVW +I1 +sVe +I1 +ssV: +p144 +(dp145 +Va +I4 +sV +I4 +sVb +I3 +sVF +I1 +sVi +I3 +sVh +I2 +sVM +I3 +sVl +I1 +sVo +I1 +sVm +I2 +sVI +I3 +sVS +I1 +sV" +I3 +sVt +I3 +sVw +I1 +sVy +I1 +sVs +I1 +ssV ( +p146 +(dp147 +Va +I7 +sVC +I1 +sVI +I2 +sVh +I1 +sV* +I1 +sVo +I5 +sVi +I2 +sVs +I1 +sVT +I1 +sV~ +I1 +sV_ +I1 +sVt +I1 +ssV . +p148 +(dp149 +V +I2 +sVs +I1 +sVt +I1 +ssV / +p150 +(dp151 +V +I1 +sVe +I1 +ssV - +p152 +(dp153 +Va +I1 +sV- +I2 +ssV 2 +p154 +(dp155 +V8 +I1 +sV7 +I1 +sV0 +I5 +ssV 3 +p156 +(dp157 +V1 +I1 +sV0 +I1 +ssVGE +p158 +(dp159 +VS +I3 +sVT +I3 +sVN +I1 +ssV 1 +p160 +(dp161 +V9 +I3 +sV0 +I4 +ssV 6 +p162 +(dp163 +V1 +I1 +sV0 +I1 +ssVWI +p164 +(dp165 +VS +I1 +ssV 4 +p166 +(dp167 +V0 +I1 +ssVg +p168 +(dp169 +V( +I1 +sVA +I2 +sVC +I2 +sVE +I4 +sVD +I1 +sVF +I1 +sVI +I1 +sVH +I1 +sVM +I5 +sVL +I5 +sVP +I1 +sVS +I2 +sVR +I3 +sVV +I1 +sVa +I60 +sVc +I12 +sVb +I25 +sVe +I14 +sVd +I10 +sVg +I4 +sVf +I16 +sVi +I48 +sVh +I50 +sVm +I57 +sVl +I11 +sVo +I35 +sVn +I7 +sVq +I1 +sVp +I9 +sVs +I26 +sVr +I4 +sVu +I6 +sVt +I113 +sVw +I33 +sVv +I5 +sVy +I8 +ssVg/ +p170 +(dp171 +VC +I1 +ssVg. +p172 +(dp173 +V +I22 +ssV 8 +p174 +(dp175 +V0 +I2 +ssVGL +p176 +(dp177 +VI +I1 +ssV < +p178 +(dp179 +Vh +I1 +ssV = +p180 +(dp181 +V +I1 +ssVAS +p182 +(dp183 +V +I1 +sVC +I2 +sV- +I1 +ssVgg +p184 +(dp185 +Ve +I8 +sVl +I1 +ssVGu +p186 +(dp187 +Ve +I2 +sVt +I15 +ssVt: +p188 +(dp189 +V +I2 +ssVt; +p190 +(dp191 +V +I32 +ssVt9 +p192 +(dp193 +V0 +I1 +sV6 +I1 +ssV-- +p194 +(dp195 +V +I2 +sV" +I1 +sV- +I3 +sVF +I1 +sVI +I14 +sVM +I2 +sVS +I1 +sVU +I1 +sVT +I2 +sVY +I3 +sVa +I2 +sVb +I2 +sVe +I1 +sVd +I1 +sVg +I1 +sVf +I1 +sVi +I2 +sVh +I2 +sVm +I1 +sVn +I1 +sVp +I1 +sVs +I4 +sVt +I5 +sVw +I1 +sVv +I1 +sVy +I2 +ssVCl +p196 +(dp197 +Va +I2 +ssVge +p198 +(dp199 +V! +I1 +sV +I49 +sVd +I32 +sVf +I1 +sV) +I1 +sVm +I8 +sV, +I7 +sVo +I1 +sVn +I37 +sVs +I7 +sVr +I35 +sVt +I44 +sV; +I5 +sV. +I8 +ssVt. +p200 +(dp201 +V +I99 +sV" +I2 +ssVt/ +p202 +(dp203 +Va +I1 +sVe +I1 +ssVt, +p204 +(dp205 +V +I187 +sV" +I5 +ssV-I +p206 +(dp207 +V +I14 +sVS +I1 +ssVt* +p208 +(dp209 +V +I1 +ssVVO +p210 +(dp211 +VU +I1 +ssVt) +p212 +(dp213 +V +I2 +sV, +I1 +ssVGo +p214 +(dp215 +Va +I1 +sVd +I2 +sVo +I2 +ssVt' +p216 +(dp217 +Vs +I3 +ssVt" +p218 +(dp219 +V) +I1 +ssVt +p220 +(dp221 +V# +I1 +sV( +I3 +sV1 +I2 +sV< +I1 +sVA +I1 +sVC +I10 +sVB +I1 +sVE +I1 +sVD +I1 +sVG +I15 +sVF +I18 +sVI +I114 +sVH +I3 +sVM +I18 +sVL +I10 +sVO +I1 +sVP +I2 +sVS +I10 +sVR +I10 +sVT +I3 +sVW +I1 +sVY +I1 +sV[ +I1 +sVa +I170 +sVc +I46 +sVb +I98 +sVe +I35 +sVd +I44 +sVg +I21 +sVf +I69 +sVi +I167 +sVh +I180 +sVk +I18 +sVj +I3 +sVm +I104 +sVl +I50 +sVo +I179 +sVn +I42 +sVq +I6 +sVp +I50 +sVs +I123 +sVr +I35 +sVu +I17 +sVt +I253 +sVw +I153 +sVv +I10 +sVy +I60 +ssVt! +p222 +(dp223 +V +I6 +sV" +I7 +ssVEM +p224 +(dp225 +VE +I1 +sVN +I1 +ssVzi +p226 +(dp227 +Vp +I2 +sVn +I3 +ssV3] +p228 +(dp229 +V +I2 +ssVze +p230 +(dp231 +V +I5 +sVs +I1 +sVm +I1 +sVd +I6 +sV. +I1 +ssVM. +p232 +(dp233 +V +I3 +ssVza +p234 +(dp235 +V +I2 +sVr +I1 +ssVgo +p236 +(dp237 +V +I12 +sV: +I1 +sVe +I1 +sVi +I18 +sV, +I4 +sVo +I30 +sVn +I12 +sVu +I8 +sVt +I9 +sVv +I5 +sV. +I3 +ssVaw +p238 +(dp239 +Va +I25 +sV +I11 +sVe +I1 +sV' +I4 +sVi +I4 +sVk +I2 +sV, +I2 +sV. +I1 +sVs +I2 +sVy +I1 +sVn +I5 +ssVEN +p240 +(dp241 +V +I2 +sVC +I1 +sVB +I7 +sVE +I1 +sVD +I4 +sVT +I3 +ssVlw +p242 +(dp243 +Va +I27 +ssVEI +p244 +(dp245 +VT +I1 +ssVyw +p246 +(dp247 +Vh +I2 +ssVgm +p248 +(dp249 +Ve +I8 +sVo +I3 +ssVF +p250 +(dp251 +VA +I1 +sVD +I1 +sVM +I1 +sVS +I1 +sVT +I1 +sVW +I1 +sVY +I3 +ssVgl +p252 +(dp253 +Va +I9 +sVy +I6 +sVe +I7 +sVi +I2 +sVo +I2 +ssVbh +p254 +(dp255 +Vo +I3 +ssVmt +p256 +(dp257 +Vh +I4 +ssVmf +p258 +(dp259 +Vo +I11 +ssV@l +p260 +(dp261 +Vo +I1 +ssV@p +p262 +(dp263 +Vo +I1 +ssVt@ +p264 +(dp265 +Vp +I1 +ssVg, +p266 +(dp267 +V +I40 +ssVrd +p268 +(dp269 +Va +I4 +sV +I51 +sVe +I13 +sVi +I13 +sV, +I5 +sVo +I1 +sV. +I5 +sV) +I1 +sVs +I19 +sVn +I1 +sV! +I3 +sV; +I4 +sV: +I2 +sVl +I7 +ssVe' +p270 +(dp271 +Vs +I8 +ssVMe +p272 +(dp273 +Vl +I4 +ssV-e +p274 +(dp275 +Vn +I1 +ssVMa +p276 +(dp277 +Vi +I46 +sVc +I1 +sVr +I15 +sVm +I2 +ssVms +p278 +(dp279 +V +I18 +sV, +I1 +sVe +I13 +sVt +I9 +sVp +I1 +ssV-d +p280 +(dp281 +Vi +I1 +sVa +I3 +sVo +I1 +ssVe! +p282 +(dp283 +V +I16 +sV" +I2 +ssVMo +p284 +(dp285 +Vt +I10 +sVn +I2 +ssVMi +p286 +(dp287 +Vs +I29 +sVc +I2 +sVd +I1 +ssVSp +p288 +(dp289 +Ve +I1 +ssVMu +p290 +(dp291 +Vc +I2 +ssV-f +p292 +(dp293 +Va +I1 +sVi +I1 +sVo +I1 +ssVbj +p294 +(dp295 +Vu +I1 +sVe +I21 +ssVMr +p296 +(dp297 +Vs +I31 +sV. +I67 +ssV-a +p298 +(dp299 +V +I1 +sVn +I2 +ssVEB +p300 +(dp301 +VC +I2 +ssVMy +p302 +(dp303 +V +I37 +ssVO +p304 +(dp305 +Vw +I1 +sVI +I1 +sVH +I1 +sVM +I21 +sVL +I16 +sVO +I1 +sVS +I2 +sVR +I2 +sVT +I3 +sVW +I1 +sVY +I2 +ssVME +p306 +(dp307 +V +I5 +sVR +I2 +sVD +I2 +sV, +I1 +ssVMG +p308 +(dp309 +VE +I1 +ssVMA +p310 +(dp311 +VI +I3 +sVY +I1 +sVL +I2 +sVG +I3 +sVD +I1 +ssVtx +p312 +(dp313 +Vt +I3 +ssVMC +p314 +(dp315 +VI +I1 +ssVMB +p316 +(dp317 +VE +I1 +ssV31 +p318 +(dp319 +V, +I1 +ssVty +p320 +(dp321 +V +I101 +sV" +I2 +sVi +I1 +sV) +I1 +sV- +I2 +sV, +I21 +sVl +I2 +sVp +I1 +sV; +I5 +sV. +I7 +ssVMI +p322 +(dp323 +VS +I1 +sVT +I3 +ssVMU +p324 +(dp325 +V +I1 +sVS +I1 +sV" +I1 +ssV3* +p326 +(dp327 +VE +I1 +ssV; +p328 +(dp329 +Va +I90 +sVo +I3 +sVb +I62 +sVe +I1 +sVD +I1 +sVf +I12 +sVI +I27 +sVh +I21 +sVm +I2 +sVL +I1 +sVO +I1 +sVn +I9 +sVi +I9 +sVs +I8 +sV" +I7 +sVt +I9 +sVw +I9 +sVy +I11 +sVR +I1 +sVd +I1 +ssVMP +p330 +(dp331 +VL +I1 +ssV K +p332 +(dp333 +VI +I1 +sVi +I1 +sVe +I3 +sVn +I1 +ssVf; +p334 +(dp335 +V +I7 +ssVp- +p336 +(dp337 +V- +I1 +ssVMY +p338 +(dp339 +V +I1 +ssV H +p340 +(dp341 +Va +I7 +sVA +I3 +sVe +I64 +sVi +I7 +sVo +I10 +sVI +I7 +sVu +I4 +sVE +I4 +ssV"d +p342 +(dp343 +Vo +I1 +ssVFR +p344 +(dp345 +VO +I2 +ssVtu +p346 +(dp347 +Va +I25 +sVb +I1 +sVd +I5 +sVi +I1 +sVl +I8 +sVo +I1 +sVn +I20 +sVp +I3 +sVr +I64 +sVt +I3 +ssVFT +p348 +(dp349 +VP +I2 +ssVix +p350 +(dp351 +Vi +I2 +sV +I4 +sVe +I10 +sVt +I4 +ssV N +p352 +(dp353 +Va +I1 +sVE +I2 +sVo +I9 +sVU +I1 +sVO +I7 +sVe +I2 +ssVg? +p354 +(dp355 +V +I1 +sV" +I2 +ssV' +p356 +(dp357 +Vp +I1 +ssV O +p358 +(dp359 +V +I1 +sVC +I1 +sVF +I6 +sVh +I1 +sVf +I1 +sVN +I1 +sVR +I10 +sVu +I4 +sVT +I2 +sVn +I5 +sV. +I1 +ssVS* +p360 +(dp361 +V* +I1 +sVV +I1 +ssVtp +p362 +(dp363 +V +I2 +ssVS- +p364 +(dp365 +VI +I1 +ssVS, +p366 +(dp367 +V +I1 +ssVS" +p368 +(dp369 +V. +I1 +ssVS +p370 +(dp371 +Vc +I1 +sVb +I1 +sVe +I1 +sVd +I1 +sVF +I2 +sVf +I1 +sVv +I1 +sVO +I4 +sVS +I1 +sVo +I1 +sVV +I2 +sVE +I2 +ssV't +p372 +(dp373 +V +I1 +ssVFO +p374 +(dp375 +VR +I6 +ssVtn +p376 +(dp377 +Vi +I4 +sVe +I6 +ssVFr +p378 +(dp379 +Vi +I4 +sVe +I87 +sVo +I2 +ssV"N +p380 +(dp381 +Vo +I4 +ssVm! +p382 +(dp383 +V +I2 +ssVm +p384 +(dp385 +V( +I3 +sVC +I3 +sVI +I12 +sVM +I6 +sVL +I4 +sVS +I1 +sVW +I1 +sVa +I57 +sVc +I6 +sVb +I9 +sVe +I15 +sVd +I6 +sVg +I14 +sVf +I19 +sVi +I17 +sVh +I26 +sVk +I2 +sVm +I14 +sVl +I3 +sVo +I15 +sVn +I14 +sVp +I8 +sVs +I43 +sVr +I7 +sVu +I3 +sVt +I53 +sVw +I14 +sVv +I5 +sVy +I10 +ssVto +p386 +(dp387 +V +I900 +sVg +I12 +sVf +I2 +sVm +I2 +sV- +I5 +sVl +I18 +sVo +I54 +sV. +I1 +sVp +I2 +sVr +I31 +sVu +I1 +sVt +I6 +sVw +I35 +sVn +I18 +sV; +I1 +sV: +I1 +sV, +I1 +sV? +I1 +ssVm- +p388 +(dp389 +V +I1 +sV- +I2 +ssVm, +p390 +(dp391 +V +I52 +ssVO. +p392 +(dp393 +V +I1 +ssVm. +p394 +(dp395 +V +I28 +sV" +I1 +ssVm) +p396 +(dp397 +V. +I1 +ssVtl +p398 +(dp399 +Vy +I53 +sVe +I53 +ssVFa +p400 +(dp401 +Vc +I1 +sVr +I1 +ssVd! +p402 +(dp403 +V +I7 +sV" +I2 +ssV-v +p404 +(dp405 +Ve +I1 +ssVvi +p406 +(dp407 +Vc +I15 +sVe +I9 +sVd +I7 +sVg +I1 +sVl +I8 +sVo +I25 +sVn +I71 +sVs +I26 +sVr +I1 +sVt +I14 +sVv +I2 +ssVFi +p408 +(dp409 +Vl +I1 +ssVu? +p410 +(dp411 +V +I1 +ssVm> +p412 +(dp413 +V +I1 +ssVFl +p414 +(dp415 +Ve +I1 +ssVm; +p416 +(dp417 +V +I6 +ssVFo +p418 +(dp419 +Vr +I7 +ssVoq +p420 +(dp421 +Vu +I6 +ssVir +p422 +(dp423 +Va +I9 +sV +I81 +sVc +I11 +sVe +I64 +sVi +I15 +sVm +I8 +sVl +I29 +sVo +I2 +sV, +I6 +sVs +I31 +sVr +I3 +sVu +I1 +sVt +I11 +sVy +I2 +sV; +I1 +sV. +I1 +ssV T +p424 +(dp425 +Ve +I2 +sVi +I1 +sVh +I69 +sVo +I12 +sVr +I1 +sVu +I2 +sVO +I49 +sVH +I11 +ssV9. +p426 +(dp427 +V9 +I1 +ssViu +p428 +(dp429 +Vc +I1 +sVm +I8 +sVs +I1 +ssV U +p430 +(dp431 +Vp +I9 +sVS +I1 +sVN +I2 +sVn +I8 +ssVSu +p432 +(dp433 +Vs +I79 +sVr +I1 +sVm +I8 +sVc +I2 +ssVSt +p434 +(dp435 +Va +I6 +sVr +I18 +ssV99 +p436 +(dp437 +V7 +I1 +sV6 +I1 +ssVSi +p438 +(dp439 +Vs +I1 +sVr +I59 +sVl +I2 +sVn +I3 +ssVSh +p440 +(dp441 +Ve +I42 +ssVSo +p442 +(dp443 +Vm +I3 +sV, +I1 +sVl +I1 +ssVSm +p444 +(dp445 +Va +I5 +sVi +I6 +ssVG. +p446 +(dp447 +V; +I1 +ssV90 +p448 +(dp449 +V +I2 +ssV93 +p450 +(dp451 +V* +I1 +ssVvo +p452 +(dp453 +Vc +I3 +sVi +I7 +sVk +I7 +sVl +I3 +sVu +I23 +sVt +I4 +sVw +I2 +ssV94 +p454 +(dp455 +V6 +I1 +ssV97 +p456 +(dp457 +V1 +I1 +sV +I1 +ssV96 +p458 +(dp459 +V +I2 +ssVme +p460 +(dp461 +Va +I34 +sV +I265 +sVe +I9 +sVd +I39 +sVf +I1 +sV- +I2 +sVm +I12 +sV, +I52 +sVo +I1 +sVn +I143 +sVs +I75 +sVr +I26 +sV! +I4 +sVt +I30 +sVw +I3 +sV; +I11 +sV. +I37 +sV? +I3 +sVl +I5 +ssV-r +p462 +(dp463 +Vo +I7 +ssVmg +p464 +(dp465 +Ve +I1 +ssV Y +p466 +(dp467 +Ve +I3 +sVO +I8 +sVo +I56 +ssVma +p468 +(dp469 +V +I3 +sVc +I7 +sVz +I1 +sVd +I28 +sVg +I13 +sVi +I23 +sVk +I53 +sV' +I1 +sVm +I4 +sVl +I14 +sVn +I115 +sVs +I6 +sVr +I52 +sVt +I48 +sVy +I75 +sV. +I1 +sV, +I1 +ssVmb +p470 +(dp471 +Vi +I1 +sVa +I3 +sVr +I1 +sVe +I14 +sVl +I7 +ssVmm +p472 +(dp473 +Va +I12 +sVu +I3 +sVe +I34 +sVi +I4 +sVo +I12 +ssVml +p474 +(dp475 +Vy +I6 +sVe +I1 +ssVmo +p476 +(dp477 +Vd +I4 +sVm +I15 +sVo +I1 +sVn +I45 +sVs +I50 +sVr +I91 +sVu +I13 +sVt +I69 +sVv +I13 +ssVmn +p478 +(dp479 +Vi +I3 +sV +I2 +sVs +I1 +sVe +I1 +ssVmi +p480 +(dp481 +Va +I7 +sVe +I1 +sVd +I5 +sVg +I31 +sVl +I40 +sVn +I72 +sVs +I49 +sVr +I10 +sVt +I24 +sVx +I5 +ssVvr +p482 +(dp483 +Ve +I1 +ssVSU +p484 +(dp485 +VC +I1 +sVS +I23 +ssVST +p486 +(dp487 +VA +I2 +sV +I1 +sVR +I2 +sVE +I1 +ssVmu +p488 +(dp489 +Vc +I54 +sVs +I100 +sVl +I2 +sVn +I3 +ssVRW +p490 +(dp491 +VI +I1 +ssVSI +p492 +(dp493 +VR +I2 +sVB +I1 +sVO +I2 +ssVSH +p494 +(dp495 +VE +I3 +ssVSO +p496 +(dp497 +VN +I18 +ssVmp +p498 +(dp499 +Va +I28 +sVe +I16 +sVh +I3 +sVl +I31 +sVo +I23 +sVr +I18 +sVu +I13 +sVt +I17 +ssVSM +p500 +(dp501 +VA +I2 +ssVUT +p502 +(dp503 +VI +I1 +sV +I5 +sV* +I1 +sVE +I7 +ssVSC +p504 +(dp505 +VI +I2 +sVL +I1 +ssV"p +p506 +(dp507 +Vu +I1 +ssVSA +p508 +(dp509 +VM +I4 +sVN +I23 +ssVmy +p510 +(dp511 +V +I292 +sVs +I56 +sV; +I1 +ssV.9 +p512 +(dp513 +V3 +I1 +ssVSE +p514 +(dp515 +VQ +I1 +sV +I2 +sVN +I2 +sV. +I1 +ssVLe +p516 +(dp517 +Va +I1 +sVt +I5 +ssV"r +p518 +(dp519 +Ve +I1 +ssVYO +p520 +(dp521 +VU +I8 +ssVLa +p522 +(dp523 +Vk +I1 +sVd +I76 +sVn +I19 +ssVLo +p524 +(dp525 +Vn +I22 +ssVf: +p526 +(dp527 +V +I1 +ssV"s +p528 +(dp529 +Vm +I1 +ssVGU +p530 +(dp531 +VT +I10 +ssVRP +p532 +(dp533 +VO +I1 +ssVf +p534 +(dp535 +V2 +I1 +sV8 +I1 +sVD +I1 +sVF +I15 +sVI +I14 +sVH +I1 +sVM +I17 +sVL +I12 +sVP +I1 +sVS +I5 +sVR +I6 +sVT +I1 +sVV +I1 +sVa +I75 +sVc +I28 +sVb +I11 +sVe +I14 +sVd +I9 +sVg +I10 +sVf +I16 +sVi +I49 +sVh +I134 +sVk +I1 +sVj +I1 +sVm +I70 +sVl +I16 +sVo +I18 +sVn +I9 +sVq +I3 +sVp +I15 +sVs +I45 +sVr +I17 +sVu +I5 +sVt +I119 +sVw +I22 +sVv +I6 +sVy +I55 +ssVf! +p536 +(dp537 +V +I1 +ssVdm +p538 +(dp539 +Vi +I14 +ssVUS +p540 +(dp541 +VA +I23 +sVI +I1 +sVE +I1 +sVT +I1 +ssV 9 +p542 +(dp543 +V0 +I1 +ssVf, +p544 +(dp545 +V +I22 +ssVf- +p546 +(dp547 +Vc +I1 +sVw +I1 +ssVf. +p548 +(dp549 +V +I11 +ssVs; +p550 +(dp551 +V +I34 +ssVs: +p552 +(dp553 +V +I6 +ssVLD +p554 +(dp555 +V +I3 +ssVLE +p556 +(dp557 +VT +I1 +ssV," +p558 +(dp559 +V +I22 +ssVe" +p560 +(dp561 +V +I1 +ssV, +p562 +(dp563 +V" +I19 +sV& +I19 +sV1 +I1 +sV2 +I2 +sVA +I2 +sVC +I4 +sVB +I1 +sVE +I3 +sVD +I2 +sVF +I4 +sVI +I121 +sVH +I1 +sVM +I3 +sVL +I2 +sVO +I2 +sVP +I1 +sVS +I3 +sVR +I3 +sVT +I1 +sV[ +I1 +sVa +I430 +sVc +I26 +sVb +I111 +sVe +I16 +sVd +I15 +sVg +I4 +sVf +I56 +sVi +I96 +sVh +I73 +sVk +I3 +sVj +I2 +sVm +I59 +sVl +I12 +sVo +I53 +sVn +I18 +sVq +I1 +sVp +I11 +sVs +I46 +sVr +I3 +sVu +I2 +sVt +I180 +sVw +I142 +sVv +I3 +sVy +I28 +ssVLA +p564 +(dp565 +VI +I1 +sVR +I1 +sVD +I35 +ssVLL +p566 +(dp567 +V +I2 +ssV,- +p568 +(dp569 +V- +I19 +ssVYe +p570 +(dp571 +Vt +I3 +ssVLI +p572 +(dp573 +VA +I1 +sV +I1 +sVC +I7 +sVE +I1 +sVG +I1 +sVM +I3 +sVS +I1 +sVT +I3 +ssVs* +p574 +(dp575 +V +I1 +sV* +I1 +ssVs) +p576 +(dp577 +V +I1 +sV; +I1 +ssVLU +p578 +(dp579 +VS +I1 +sVD +I2 +ssVs. +p580 +(dp581 +V +I119 +sV" +I3 +ssV,0 +p582 +(dp583 +V0 +I3 +ssVs, +p584 +(dp585 +V +I191 +sV" +I1 +ssVs" +p586 +(dp587 +V. +I1 +ssVs! +p588 +(dp589 +V! +I1 +sV +I10 +ssVs +p590 +(dp591 +V" +I5 +sV( +I1 +sV* +I1 +sVC +I2 +sVD +I1 +sVF +I5 +sVI +I40 +sVM +I21 +sVL +I8 +sVP +I3 +sVS +I12 +sVR +I4 +sVV +I7 +sV[ +I1 +sVa +I235 +sVc +I71 +sVb +I62 +sVe +I62 +sVd +I53 +sVg +I31 +sVf +I62 +sVi +I126 +sVh +I96 +sVk +I3 +sVj +I15 +sVm +I111 +sVl +I32 +sVo +I127 +sVn +I85 +sVq +I6 +sVp +I53 +sVs +I129 +sVr +I36 +sVu +I17 +sVt +I181 +sVw +I87 +sVv +I24 +sVy +I28 +ssVs' +p592 +(dp593 +V +I1 +sVs +I6 +ssVr! +p594 +(dp595 +V +I6 +ssVfr +p596 +(dp597 +Vi +I36 +sVa +I11 +sVe +I11 +sVo +I110 +ssVo? +p598 +(dp599 +V +I1 +sV" +I1 +ssVft +p600 +(dp601 +Vy +I1 +sVp +I2 +sVe +I36 +sVw +I2 +sV +I12 +ssVfu +p602 +(dp603 +Vs +I12 +sVr +I8 +sVt +I4 +sVl +I58 +sVn +I4 +ssVL +p604 +(dp605 +VP +I2 +sVD +I1 +sVo +I1 +sV6 +I1 +ssVu! +p606 +(dp607 +V) +I1 +sV +I3 +ssVfy +p608 +(dp609 +Vi +I4 +sV +I9 +sV, +I1 +ssVL, +p610 +(dp611 +V +I1 +ssVI; +p612 +(dp613 +V +I1 +ssV?0 +p614 +(dp615 +V0 +I1 +ssVfa +p616 +(dp617 +Vc +I16 +sVi +I19 +sVm +I24 +sVl +I4 +sVn +I7 +sVs +I10 +sVr +I18 +sVu +I6 +sVt +I20 +sVv +I14 +ssVSS +p618 +(dp619 +VI +I1 +sV +I3 +ssVr? +p620 +(dp621 +V +I3 +sV" +I4 +ssVfe +p622 +(dp623 +Va +I20 +sV +I14 +sVc +I72 +sVe +I47 +sV' +I3 +sVm +I1 +sV, +I10 +sV. +I5 +sVs +I9 +sVr +I41 +sV! +I1 +sVt +I4 +sVw +I15 +sV? +I1 +sVl +I10 +ssVff +p624 +(dp625 +Va +I10 +sV +I9 +sVe +I73 +sVi +I14 +sV, +I1 +sVo +I9 +ssVUD +p626 +(dp627 +VI +I2 +ssVfi +p628 +(dp629 +Va +I1 +sVc +I25 +sVe +I22 +sVd +I4 +sVg +I1 +sVf +I2 +sVl +I10 +sVn +I30 +sVs +I2 +sVr +I31 +sVt +I10 +sVv +I2 +sVx +I10 +ssVfl +p630 +(dp631 +Vi +I10 +sVe +I3 +sVu +I11 +sVa +I6 +sVo +I1 +ssVH +p632 +(dp633 +VD +I1 +sVO +I1 +ssVfo +p634 +(dp635 +Vr +I454 +sVu +I20 +sVl +I13 +sVo +I3 +sVn +I3 +ssVCY +p636 +(dp637 +V +I23 +sV. +I5 +ssVg' +p638 +(dp639 +Vs +I7 +ssVsy +p640 +(dp641 +V +I13 +sVm +I2 +sVl +I3 +sV, +I3 +sV; +I1 +sV. +I3 +ssVEv +p642 +(dp643 +Ve +I4 +ssVYo +p644 +(dp645 +Vu +I61 +ssVY. +p646 +(dp647 +V +I5 +ssVss +p648 +(dp649 +Va +I14 +sV +I133 +sV: +I1 +sVe +I40 +sVi +I87 +sVm +I3 +sV, +I17 +sVo +I5 +sV. +I10 +sV! +I3 +sVu +I19 +sVw +I1 +sV; +I8 +sVn +I1 +sVl +I2 +ssVY +p650 +(dp651 +VB +I1 +sVE +I1 +sVD +I12 +sVK +I1 +sVM +I1 +sVO +I3 +sVS +I24 +sVT +I7 +ssVsp +p652 +(dp653 +Va +I5 +sVe +I67 +sVi +I31 +sVl +I8 +sVo +I34 +sVr +I1 +sVu +I2 +ssVsw +p654 +(dp655 +Va +I1 +sVe +I11 +sVo +I1 +ssVsu +p656 +(dp657 +Va +I18 +sVc +I70 +sVb +I30 +sVe +I2 +sVd +I5 +sVg +I2 +sVf +I11 +sVi +I6 +sVm +I1 +sVl +I3 +sVn +I3 +sVp +I31 +sVs +I13 +sVr +I89 +ssVst +p658 +(dp659 +Va +I98 +sV +I307 +sV: +I1 +sVe +I75 +sV! +I1 +sVi +I61 +sV- +I2 +sVm +I2 +sV, +I24 +sVo +I42 +sV. +I5 +sVs +I2 +sVr +I52 +sVu +I7 +sVy +I5 +sV; +I5 +sVn +I2 +sVl +I6 +ssVsk +p660 +(dp661 +V +I8 +sVe +I2 +sV) +I1 +sV, +I2 +sV. +I1 +sVi +I3 +ssVsi +p662 +(dp663 +Vc +I5 +sVb +I39 +sVd +I31 +sVg +I19 +sVm +I3 +sVl +I19 +sVo +I56 +sVn +I82 +sVp +I3 +sVs +I40 +sVr +I17 +sVt +I64 +sVv +I10 +sVx +I5 +sVz +I2 +ssVsh +p664 +(dp665 +Va +I65 +sV +I45 +sVe +I214 +sVi +I34 +sVm +I10 +sV, +I3 +sVo +I83 +sVn +I1 +sVr +I3 +sVu +I2 +sVy +I4 +sVl +I1 +ssVso +p666 +(dp667 +V +I139 +sVc +I9 +sVb +I1 +sVf +I7 +sVm +I81 +sVl +I44 +sVo +I38 +sVn +I73 +sVr +I23 +sVu +I4 +sV. +I5 +sV, +I4 +ssVsn +p668 +(dp669 +V1 +I4 +sVe +I7 +ssVsm +p670 +(dp671 +Va +I7 +sVi +I7 +sVe +I3 +sVo +I1 +ssVsl +p672 +(dp673 +Vi +I13 +sVy +I9 +sVe +I2 +sVa +I3 +ssVsc +p674 +(dp675 +Va +I18 +sVe +I3 +sVi +I9 +sVh +I12 +sVl +I5 +sVo +I17 +sVr +I13 +sVu +I1 +ssVsb +p676 +(dp677 +Va +I17 +sVe +I1 +ssVsa +p678 +(dp679 +Vc +I5 +sVb +I7 +sVd +I8 +sVg +I5 +sVf +I3 +sVi +I25 +sVk +I3 +sVm +I12 +sVl +I5 +sVn +I82 +sVp +I6 +sVr +I12 +sVu +I1 +sVt +I34 +sVw +I10 +sVv +I4 +sVy +I28 +ssVUB +p680 +(dp681 +VL +I2 +ssVsg +p682 +(dp683 +Va +I1 +sVu +I1 +ssVsf +p684 +(dp685 +Vy +I2 +sVi +I10 +sVe +I1 +sVa +I6 +ssVse +p686 +(dp687 +V! +I2 +sV +I179 +sV) +I1 +sV, +I32 +sV. +I15 +sV; +I3 +sV: +I2 +sV? +I2 +sVa +I3 +sVc +I12 +sVe +I85 +sVd +I68 +sVf +I1 +sVm +I6 +sVl +I126 +sVn +I99 +sVq +I8 +sVp +I10 +sVs +I23 +sVr +I54 +sVt +I12 +sVw +I1 +sVv +I14 +sVx +I2 +ssVsd +p688 +(dp689 +Va +I8 +ssVy) +p690 +(dp691 +V +I2 +sV. +I1 +ssVh: +p692 +(dp693 +V +I1 +ssVy- +p694 +(dp695 +V- +I2 +sVm +I1 +sVt +I2 +ssVy, +p696 +(dp697 +V +I106 +sV" +I2 +ssVy. +p698 +(dp699 +V +I56 +sV" +I2 +ssVy! +p700 +(dp701 +V +I3 +sV" +I1 +ssVy +p702 +(dp703 +V( +I4 +sV1 +I1 +sVC +I2 +sVB +I1 +sVD +I2 +sVF +I1 +sVI +I9 +sVH +I3 +sVJ +I5 +sVM +I3 +sVL +I1 +sVO +I1 +sVP +I1 +sVS +I72 +sVR +I2 +sVT +I1 +sVV +I1 +sVa +I136 +sVc +I51 +sVb +I72 +sVe +I40 +sVd +I128 +sVg +I26 +sVf +I64 +sVi +I69 +sVh +I79 +sVk +I7 +sVj +I5 +sVm +I49 +sVl +I35 +sVo +I106 +sVn +I21 +sVp +I53 +sVs +I94 +sVr +I46 +sVu +I22 +sVt +I158 +sVw +I76 +sVv +I10 +sVy +I17 +ssV 5 +p704 +(dp705 +V% +I1 +ssVGI +p706 +(dp707 +VN +I3 +sVV +I1 +ssV% +p708 +(dp709 +Vo +I4 +ssVy' +p710 +(dp711 +Vs +I2 +ssVRe +p712 +(dp713 +Va +I1 +sVp +I1 +sVg +I78 +sVf +I1 +ssVy; +p714 +(dp715 +V +I29 +ssV!" +p716 +(dp717 +V +I14 +ssVV. +p718 +(dp719 +V +I4 +ssVy? +p720 +(dp721 +V +I1 +ssVRo +p722 +(dp723 +Vy +I1 +ssVSa +p724 +(dp725 +Vy +I1 +ssVRi +p726 +(dp727 +Vg +I1 +ssVRT +p728 +(dp729 +VI +I1 +sV* +I2 +ssV25 +p730 +(dp731 +V +I1 +ssVld +p732 +(dp733 +V +I277 +sVe +I5 +sV' +I7 +sVi +I3 +sV- +I1 +sV, +I30 +sVo +I3 +sV. +I11 +sVr +I8 +sVn +I1 +sV; +I2 +sV: +I1 +sV? +I1 +ssVle +p734 +(dp735 +V! +I4 +sV +I203 +sV" +I1 +sV' +I2 +sV, +I36 +sV. +I14 +sV; +I4 +sV: +I1 +sVa +I92 +sVc +I19 +sVb +I1 +sVe +I1 +sVd +I31 +sVg +I8 +sVf +I12 +sVi +I3 +sVm +I7 +sVn +I49 +sVs +I59 +sVr +I6 +sVt +I54 +sVv +I7 +sVx +I4 +ssV20 +p736 +(dp737 +V0 +I4 +sV% +I1 +ssVlc +p738 +(dp739 +Vu +I3 +sVo +I3 +ssVRR +p740 +(dp741 +VA +I4 +ssVla +p742 +(dp743 +V +I1 +sVc +I24 +sVb +I3 +sVd +I27 +sVg +I4 +sVi +I23 +sVm +I15 +sVn +I36 +sVp +I1 +sVs +I25 +sVr +I46 +sVu +I9 +sVt +I36 +sVw +I12 +sVv +I2 +sVy +I11 +sVx +I1 +ssVln +p744 +(dp745 +Ve +I3 +ssVlo +p746 +(dp747 +Vd +I3 +sVg +I5 +sVi +I1 +sVm +I1 +sVo +I34 +sVn +I56 +sVq +I1 +sVp +I2 +sVs +I13 +sVr +I1 +sVu +I24 +sVt +I2 +sVw +I39 +sVv +I30 +sVy +I2 +ssVll +p748 +(dp749 +Va +I9 +sV +I379 +sV: +I1 +sVe +I23 +sVi +I28 +sV- +I11 +sV, +I23 +sVo +I32 +sVn +I1 +sV) +I1 +sVs +I3 +sV! +I1 +sVu +I3 +sVy +I84 +sV; +I6 +sV. +I34 +sV? +I1 +ssVlm +p750 +(dp751 +V +I2 +sVe +I1 +sVl +I2 +sVo +I7 +sVn +I1 +ssV28 +p752 +(dp753 +V, +I1 +ssV29 +p754 +(dp755 +V. +I1 +ssVli +p756 +(dp757 +Va +I20 +sVc +I35 +sVb +I12 +sVe +I49 +sVd +I1 +sVg +I37 +sVf +I15 +sVh +I1 +sVk +I30 +sVm +I4 +sVo +I8 +sVn +I57 +sVp +I3 +sVs +I21 +sVr +I8 +sVt +I58 +sVv +I11 +ssVlv +p758 +(dp759 +Ve +I18 +ssVRE +p760 +(dp761 +V! +I1 +sVA +I2 +sVC +I1 +sVG +I3 +sV +I3 +sVM +I1 +sVS +I2 +ssVlt +p762 +(dp763 +Va +I1 +sV +I9 +sVe +I15 +sVi +I4 +sVh +I5 +sV, +I1 +sVo +I4 +sV. +I3 +sVs +I3 +sVy +I6 +ssVlu +p764 +(dp765 +Vc +I7 +sVe +I14 +sVd +I17 +sVn +I1 +sVs +I7 +sVr +I1 +sVt +I19 +ssVlr +p766 +(dp767 +Ve +I8 +ssVls +p768 +(dp769 +V +I9 +sVu +I4 +sVe +I6 +sVo +I9 +sVt +I1 +ssVlp +p770 +(dp771 +Vi +I1 +sV +I10 +sV- +I1 +ssVRC +p772 +(dp773 +VY +I28 +sVH +I1 +ssV-" +p774 +(dp775 +V +I1 +ssVRN +p776 +(dp777 +VO +I49 +ssVRO +p778 +(dp779 +VJ +I7 +sVM +I2 +sVT +I1 +sVV +I1 +ssVRI +p780 +(dp781 +VC +I1 +sVB +I1 +sVN +I9 +ssVly +p782 +(dp783 +V +I398 +sVi +I4 +sV- +I1 +sV, +I29 +sV. +I17 +sV; +I9 +sVz +I1 +ssVyi +p784 +(dp785 +Vs +I1 +sVe +I2 +sVn +I38 +ssVym +p786 +(dp787 +Ve +I3 +sVm +I1 +sVo +I9 +sVp +I1 +ssVyl +p788 +(dp789 +Ve +I2 +sVl +I3 +ssVyo +p790 +(dp791 +Vu +I473 +sVn +I18 +ssVt? +p792 +(dp793 +V +I3 +sV" +I1 +ssVya +p794 +(dp795 +Vb +I1 +sVl +I4 +ssV2] +p796 +(dp797 +V +I4 +ssVyb +p798 +(dp799 +Vo +I2 +ssVye +p800 +(dp801 +Va +I13 +sVd +I7 +sVl +I1 +sV, +I1 +sVs +I13 +sVr +I1 +sVt +I21 +ssV.0 +p802 +(dp803 +V4 +I1 +ssVyz +p804 +(dp805 +Ve +I1 +ssVR +p806 +(dp807 +VA +I2 +sVC +I1 +sVB +I2 +sVD +I1 +sVF +I2 +sVI +I2 +sVi +I1 +sVs +I1 +sVO +I1 +sVN +I1 +sVP +I3 +sVS +I1 +sVR +I3 +sVt +I2 +sVv +I1 +sV" +I1 +ssVR, +p808 +(dp809 +V +I2 +sV- +I1 +ssVyp +p810 +(dp811 +Ve +I3 +ssVys +p812 +(dp813 +V +I37 +sVe +I55 +sVi +I2 +sVh +I12 +sV- +I1 +sV, +I2 +sV. +I4 +sVt +I1 +ssVyr +p814 +(dp815 +Vi +I8 +ssVyt +p816 +(dp817 +Vh +I27 +sVe +I1 +ssVm" +p818 +(dp819 +V +I1 +ssVCr +p820 +(dp821 +Ve +I1 +sVu +I1 +ssVl' +p822 +(dp823 +Vs +I1 +ssVl +p824 +(dp825 +V( +I1 +sVE +I1 +sVF +I1 +sVI +I6 +sVM +I1 +sVN +I1 +sVP +I6 +sVS +I2 +sVT +I1 +sVW +I1 +sVa +I48 +sVc +I14 +sVb +I43 +sVe +I10 +sVd +I14 +sVg +I8 +sVf +I26 +sVi +I26 +sVh +I24 +sVk +I7 +sVj +I1 +sVm +I23 +sVl +I11 +sVo +I29 +sVn +I31 +sVq +I2 +sVp +I13 +sVs +I32 +sVr +I13 +sVu +I4 +sVt +I74 +sVw +I13 +sVv +I3 +sVy +I16 +ssVl! +p826 +(dp827 +V +I4 +ssVl. +p828 +(dp829 +V +I48 +ssVl, +p830 +(dp831 +V +I48 +ssVl- +p832 +(dp833 +Vb +I1 +sVd +I1 +sVf +I2 +sV- +I1 +sVo +I2 +sVn +I2 +sVu +I1 +sVt +I1 +ssVl) +p834 +(dp835 +V +I1 +sV. +I1 +ssVAs +p836 +(dp837 +V +I7 +sVs +I3 +sVk +I1 +ssV-M +p838 +(dp839 +Vr +I2 +sVe +I3 +ssVl? +p840 +(dp841 +V" +I1 +ssVl: +p842 +(dp843 +V +I2 +ssVl; +p844 +(dp845 +V +I8 +ssVem +p846 +(dp847 +Va +I28 +sV +I27 +sVb +I17 +sVe +I60 +sVi +I4 +sV- +I1 +sV, +I3 +sVo +I21 +sVn +I6 +sVp +I26 +sVs +I12 +sVu +I1 +sVy +I1 +sV; +I1 +sV. +I4 +ssVel +p848 +(dp849 +Va +I11 +sV +I23 +sVc +I3 +sVe +I16 +sVd +I7 +sVf +I116 +sVi +I95 +sVl +I78 +sVo +I8 +sV. +I1 +sVp +I12 +sVs +I5 +sVt +I9 +sVv +I7 +sVy +I111 +ssVeo +p850 +(dp851 +Vp +I2 +sVv +I2 +sVu +I3 +sVn +I1 +ssVen +p852 +(dp853 +V! +I1 +sV +I287 +sV* +I2 +sV- +I1 +sV, +I23 +sV. +I6 +sV; +I3 +sV: +I1 +sV? +I1 +sVa +I11 +sVc +I94 +sVb +I15 +sVe +I47 +sVd +I140 +sVg +I26 +sVi +I21 +sVj +I5 +sVl +I1 +sVo +I20 +sVn +I2 +sVq +I2 +sVs +I57 +sVr +I3 +sVu +I1 +sVt +I388 +sVv +I1 +sVy +I1 +sVz +I2 +ssVei +p854 +(dp855 +Vg +I5 +sVn +I51 +sVp +I1 +sVs +I3 +sVr +I18 +sVt +I17 +sVv +I38 +ssVh, +p856 +(dp857 +V +I30 +ssV8, +p858 +(dp859 +V +I1 +ssVej +p860 +(dp861 +Ve +I2 +sVu +I5 +sVo +I5 +ssVee +p862 +(dp863 +Va +I11 +sV +I62 +sVc +I2 +sVd +I37 +sVi +I15 +sVk +I14 +sVm +I29 +sV, +I1 +sVn +I106 +sVp +I21 +sVs +I4 +sVr +I5 +sVt +I35 +sVl +I43 +ssVed +p864 +(dp865 +V! +I5 +sV +I663 +sVe +I91 +sVd +I1 +sVg +I6 +sVi +I43 +sV- +I2 +sV, +I94 +sVo +I1 +sVn +I4 +sV. +I34 +sVs +I1 +sVu +I13 +sVy +I2 +sV; +I14 +sV: +I2 +sV] +I1 +sV? +I1 +sVl +I4 +ssVeg +p866 +(dp867 +Va +I20 +sV +I1 +sVe +I1 +sVg +I3 +sVi +I84 +sVl +I5 +sVr +I20 +sVu +I5 +ssVef +p868 +(dp869 +Va +I2 +sV +I4 +sVe +I13 +sVf +I12 +sVi +I6 +sV, +I1 +sVo +I59 +sVl +I3 +sVr +I1 +sVu +I19 +sVt +I12 +sVy +I2 +ssVea +p870 +(dp871 +V +I12 +sVc +I24 +sVb +I11 +sVd +I49 +sVg +I9 +sVk +I31 +sVl +I55 +sVn +I30 +sVs +I119 +sVr +I216 +sVu +I5 +sVt +I81 +sVv +I48 +sV; +I1 +sVz +I2 +sV, +I1 +ssVec +p872 +(dp873 +Va +I8 +sVe +I70 +sVi +I17 +sVh +I2 +sVk +I2 +sVl +I14 +sVo +I17 +sV. +I1 +sVr +I1 +sVu +I13 +sVt +I216 +ssVeb +p874 +(dp875 +Vy +I1 +sVa +I1 +sVr +I1 +sVe +I1 +sVt +I3 +ssVEx +p876 +(dp877 +Vc +I1 +sVe +I1 +ssVex +p878 +(dp879 +Va +I14 +sVc +I35 +sVe +I9 +sVi +I9 +sV, +I2 +sVq +I1 +sVp +I55 +sVu +I1 +sVt +I69 +ssV82 +p880 +(dp881 +V +I1 +sV5 +I1 +ssVet +p882 +(dp883 +Va +I7 +sV +I86 +sVc +I14 +sVe +I69 +sVi +I16 +sVh +I38 +sV, +I14 +sVo +I5 +sV. +I16 +sVs +I3 +sVr +I8 +sVu +I27 +sVt +I72 +sVw +I14 +sVy +I20 +sV; +I2 +sVn +I1 +sVl +I2 +ssVew +p884 +(dp885 +Va +I3 +sV +I28 +sVe +I1 +sVi +I2 +sVh +I4 +sV. +I1 +sVs +I8 +sV; +I1 +ssVev +p886 +(dp887 +Vi +I18 +sVa +I3 +sVe +I293 +sVo +I7 +ssVeq +p888 +(dp889 +Vu +I47 +ssVep +p890 +(dp891 +Va +I22 +sV +I10 +sVe +I16 +sVi +I5 +sVl +I16 +sVo +I6 +sVs +I1 +sVr +I17 +sVu +I2 +sVt +I21 +ssVes +p892 +(dp893 +V! +I2 +sV +I212 +sV' +I5 +sV) +I1 +sV- +I1 +sV, +I45 +sV. +I16 +sV; +I7 +sV: +I2 +sV? +I2 +sV] +I2 +sVa +I1 +sVc +I12 +sVe +I63 +sVd +I4 +sVi +I32 +sVh +I1 +sVo +I23 +sVp +I29 +sVs +I204 +sVu +I2 +sVt +I127 +ssVer +p894 +(dp895 +V! +I5 +sV +I839 +sV' +I31 +sV- +I9 +sV, +I166 +sV. +I84 +sV; +I30 +sV: +I3 +sV? +I7 +sVa +I51 +sVc +I17 +sVe +I240 +sVd +I4 +sVg +I17 +sVf +I28 +sVi +I142 +sVh +I15 +sVj +I1 +sVm +I23 +sVl +I9 +sVo +I9 +sVn +I91 +sVp +I4 +sVs +I184 +sVr +I11 +sVt +I46 +sVw +I10 +sVv +I33 +sVy +I142 +ssVrt +p896 +(dp897 +Va +I38 +sV@ +I1 +sVe +I19 +sV +I62 +sVi +I62 +sVh +I20 +sVf +I4 +sVm +I4 +sV, +I13 +sVo +I3 +sVn +I4 +sVs +I8 +sVu +I24 +sVy +I18 +sV; +I2 +sV. +I2 +sVl +I4 +ssVru +p898 +(dp899 +Vc +I4 +sVb +I3 +sVe +I15 +sVd +I6 +sVg +I1 +sVi +I1 +sVm +I1 +sVl +I4 +sVn +I7 +sVp +I5 +sVs +I9 +sVt +I7 +ssVrv +p900 +(dp901 +Va +I6 +sVi +I6 +sVe +I22 +ssVE. +p902 +(dp903 +V +I1 +ssVrp +p904 +(dp905 +Vr +I11 +sVe +I1 +sVl +I1 +sVo +I4 +ssVs] +p906 +(dp907 +V +I2 +ssVrr +p908 +(dp909 +Va +I7 +sVe +I18 +sVi +I48 +sVo +I8 +sVu +I4 +sVy +I35 +ssVrs +p910 +(dp911 +Va +I13 +sV +I92 +sVe +I81 +sVd +I4 +sV' +I1 +sVi +I11 +sVh +I1 +sV, +I39 +sVo +I18 +sV. +I42 +sV) +I1 +sVu +I17 +sVt +I44 +sV; +I4 +sV? +I1 +ssVE! +p912 +(dp913 +V* +I1 +ssVry +p914 +(dp915 +V +I191 +sVb +I1 +sVi +I20 +sV, +I13 +sVo +I1 +sV. +I7 +sVt +I15 +sVw +I1 +sV; +I2 +sV? +I1 +ssVe] +p916 +(dp917 +V +I1 +ssVre +p918 +(dp919 +V! +I3 +sV +I363 +sV) +I1 +sV, +I66 +sV. +I23 +sV; +I13 +sV? +I2 +sVa +I183 +sVc +I68 +sVb +I2 +sVe +I64 +sVd +I194 +sVg +I19 +sVf +I49 +sVi +I1 +sVh +I7 +sVj +I10 +sVm +I50 +sVl +I54 +sVo +I2 +sVn +I43 +sVq +I21 +sVp +I44 +sVs +I183 +sVr +I2 +sVt +I63 +sVw +I4 +sVv +I35 +sVy +I1 +ssVey +p920 +(dp921 +V +I39 +sVe +I10 +sVm +I8 +sV, +I3 +sVo +I10 +sV. +I2 +sV; +I1 +ssVrg +p922 +(dp923 +V +I13 +sVe +I21 +sVi +I9 +sV, +I1 +sV/ +I1 +sVu +I1 +sVo +I4 +sVy +I1 +ssVra +p924 +(dp925 +Vc +I29 +sVb +I34 +sVd +I7 +sVg +I13 +sVi +I18 +sVm +I4 +sVl +I23 +sVo +I4 +sVn +I36 +sVp +I2 +sVs +I5 +sVr +I5 +sVu +I1 +sVt +I64 +sVw +I8 +sVv +I3 +sVy +I4 +ssVrb +p926 +(dp927 +Vi +I5 +sVa +I3 +sVe +I2 +sVo +I1 +ssVrc +p928 +(dp929 +Ve +I25 +sVi +I4 +sVh +I52 +sVo +I7 +sVu +I10 +sVy +I27 +ssVrl +p930 +(dp931 +V! +I2 +sV +I12 +sVe +I9 +sVd +I21 +sV' +I1 +sVi +I2 +sV, +I8 +sVo +I5 +sV. +I3 +sVs +I1 +sVa +I1 +sVy +I21 +sV; +I1 +ssVrm +p932 +(dp933 +Va +I12 +sV +I17 +sVe +I13 +sVi +I28 +sV, +I8 +sVl +I5 +sV) +I1 +sVs +I6 +sVt +I4 +sV. +I1 +ssVrn +p934 +(dp935 +Va +I8 +sV +I20 +sVe +I35 +sVi +I16 +sV, +I1 +sVo +I65 +sV. +I3 +sVs +I1 +sVt +I3 +ssVro +p936 +(dp937 +V- +I1 +sVa +I5 +sVc +I6 +sVb +I13 +sVd +I8 +sVg +I5 +sVf +I8 +sVi +I1 +sVh +I1 +sVk +I1 +sVj +I28 +sVm +I124 +sVl +I5 +sVo +I27 +sVn +I18 +sVp +I21 +sVs +I9 +sVr +I4 +sVu +I38 +sVt +I35 +sVw +I12 +sVv +I20 +sVy +I5 +ssVrh +p938 +(dp939 +Va +I15 +sVo +I1 +ssVri +p940 +(dp941 +Va +I25 +sVc +I94 +sVb +I19 +sVe +I56 +sVd +I10 +sVg +I28 +sVf +I5 +sVk +I2 +sVm +I4 +sVl +I6 +sVo +I28 +sVn +I98 +sVp +I4 +sVs +I12 +sVu +I3 +sVt +I52 +sVv +I34 +sVz +I9 +ssVrj +p942 +(dp943 +Vo +I1 +ssVrk +p944 +(dp945 +Va +I1 +sV +I7 +sVe +I6 +sV- +I1 +sVl +I5 +sV, +I2 +sVs +I2 +sV. +I2 +ssVe- +p946 +(dp947 +V- +I7 +sV +I1 +sVb +I1 +sVM +I3 +ssVe, +p948 +(dp949 +V +I318 +sV" +I6 +sV- +I3 +ssVe. +p950 +(dp951 +V +I157 +sVc +I1 +sV" +I4 +ssVe) +p952 +(dp953 +V +I3 +sV; +I1 +ssVED +p954 +(dp955 +VI +I3 +sV +I5 +sV, +I1 +ssVEG +p956 +(dp957 +VI +I3 +sVL +I1 +ssVEF +p958 +(dp959 +VO +I1 +ssVEA +p960 +(dp961 +VC +I1 +sVR +I1 +sVD +I1 +sVV +I1 +ssVe +p962 +(dp963 +V" +I2 +sV$ +I1 +sV( +I3 +sV1 +I1 +sV6 +I1 +sVA +I8 +sVC +I25 +sVB +I1 +sVE +I2 +sVD +I2 +sVG +I1 +sVF +I4 +sVI +I36 +sVH +I3 +sVM +I10 +sVL +I3 +sVP +I16 +sVS +I5 +sVR +I4 +sVU +I1 +sVT +I3 +sVW +I1 +sVV +I4 +sV[ +I1 +sVa +I268 +sVc +I141 +sVb +I100 +sVe +I83 +sVd +I102 +sVg +I56 +sVf +I115 +sVi +I245 +sVh +I238 +sVk +I17 +sVj +I8 +sVm +I209 +sVl +I70 +sVo +I254 +sVn +I89 +sVq +I7 +sVp +I109 +sVs +I234 +sVr +I68 +sVu +I29 +sVt +I380 +sVw +I233 +sVv +I28 +sVy +I59 +ssVEC +p964 +(dp965 +VT +I8 +ssV") +p966 +(dp967 +V. +I1 +ssVAn +p968 +(dp969 +Vd +I6 +ssVe? +p970 +(dp971 +V +I13 +sV" +I1 +ssVEY +p972 +(dp973 +V +I1 +ssVEX +p974 +(dp975 +VP +I1 +sVT +I6 +sV? +I1 +ssVe; +p976 +(dp977 +V +I55 +ssVe: +p978 +(dp979 +V +I5 +ssVET +p980 +(dp981 +V +I3 +sVE +I6 +sVT +I1 +ssVEW +p982 +(dp983 +V +I1 +ssVEV +p984 +(dp985 +VE +I2 +ssVEQ +p986 +(dp987 +VU +I1 +ssVES +p988 +(dp989 +V +I4 +sVS +I2 +sVE +I1 +sV, +I1 +sV. +I1 +ssVER +p990 +(dp991 +V +I7 +sVC +I1 +sVE +I1 +sVG +I7 +sVI +I7 +sV* +I1 +sV, +I3 +sVN +I49 +sVS +I1 +sVW +I1 +ssVEl +p992 +(dp993 +Ve +I1 +ssVEn +p994 +(dp995 +Vd +I1 +sVg +I3 +ssVEd +p996 +(dp997 +Vw +I9 +ssVNO +p998 +(dp999 +V +I2 +sVT +I5 +sVN +I49 +ssVr: +p1000 +(dp1001 +V +I6 +ssVr; +p1002 +(dp1003 +V +I36 +ssVr' +p1004 +(dp1005 +Vs +I31 +ssVr +p1006 +(dp1007 +V( +I1 +sV3 +I1 +sV4 +I1 +sVA +I8 +sVC +I6 +sVB +I1 +sVE +I1 +sVF +I8 +sVI +I21 +sVH +I1 +sVJ +I49 +sVM +I15 +sVL +I7 +sVS +I20 +sVR +I9 +sV[ +I2 +sVa +I152 +sVc +I53 +sVb +I42 +sVe +I46 +sVd +I55 +sVg +I19 +sVf +I75 +sVi +I59 +sVh +I104 +sVk +I8 +sVj +I3 +sVm +I116 +sVl +I47 +sVo +I88 +sVn +I20 +sVq +I1 +sVp +I47 +sVs +I100 +sVr +I34 +sVu +I21 +sVt +I189 +sVw +I79 +sVv +I8 +sVy +I15 +sVz +I1 +ssVGi +p1008 +(dp1009 +Vv +I1 +ssVr, +p1010 +(dp1011 +V +I181 +sV" +I2 +sV- +I9 +ssVEt +p1012 +(dp1013 +Ve +I11 +ssVr. +p1014 +(dp1015 +V +I158 +sV" +I3 +sV0 +I1 +ssVr@ +p1016 +(dp1017 +Vl +I1 +ssVr) +p1018 +(dp1019 +V, +I1 +ssVr* +p1020 +(dp1021 +V* +I1 +ssVw' +p1022 +(dp1023 +Vs +I5 +ssVNC +p1024 +(dp1025 +VI +I1 +sVE +I1 +sVL +I3 +sVO +I1 +ssVxc +p1026 +(dp1027 +Vi +I2 +sVu +I13 +sVe +I17 +sVl +I3 +sVh +I1 +ssVxa +p1028 +(dp1029 +Vc +I5 +sVm +I4 +sVt +I4 +sVg +I1 +ssV1] +p1030 +(dp1031 +V +I3 +ssVUE +p1032 +(dp1033 +VN +I1 +ssVxe +p1034 +(dp1035 +Vc +I2 +sVr +I5 +sVm +I1 +sVs +I2 +sVd +I12 +ssVxx +p1036 +(dp1037 +V1 +I1 +sVx +I4 +sV] +I1 +ssVjo +p1038 +(dp1039 +Vi +I9 +sVy +I8 +sVk +I1 +sVu +I4 +ssVxp +p1040 +(dp1041 +Vr +I10 +sVe +I27 +sVl +I16 +sVo +I2 +ssVxq +p1042 +(dp1043 +Vu +I1 +ssVxt +p1044 +(dp1045 +V +I31 +sVe +I8 +sV) +I1 +sV, +I6 +sV/ +I2 +sV. +I2 +sVs +I12 +sVr +I10 +sVu +I1 +sVo +I1 +sV9 +I2 +ssVM +p1046 +(dp1047 +VI +I1 +sVE +I1 +sVT +I2 +ssVu, +p1048 +(dp1049 +V +I42 +sV" +I3 +ssVIE +p1050 +(dp1051 +VS +I3 +sVD +I1 +ssVeu +p1052 +(dp1053 +V! +I2 +sVv +I1 +sV, +I5 +sV. +I2 +ssV-F +p1054 +(dp1055 +Vr +I1 +ssV?" +p1056 +(dp1057 +V +I13 +ssV0% +p1058 +(dp1059 +V +I3 +ssV.; +p1060 +(dp1061 +V +I1 +ssV +I1 +ssVol +p1996 +(dp1997 +Va +I1 +sV +I8 +sVe +I39 +sVd +I24 +sVi +I9 +sVl +I25 +sVo +I11 +sV, +I2 +sVs +I1 +sVn +I1 +sVu +I20 +sVt +I1 +sVv +I11 +sVy +I1 +sV: +I1 +ssVok +p1998 +(dp1999 +Vi +I4 +sV +I25 +sVs +I9 +sVe +I24 +sV. +I1 +ssVoj +p2000 +(dp2001 +Ve +I28 +ssVoi +p2002 +(dp2003 +Vc +I13 +sVd +I4 +sVg +I1 +sVl +I1 +sVn +I44 +sVs +I2 +sVt +I1 +ssVoh +p2004 +(dp2005 +Vi +I1 +sVn +I18 +ssVog +p2006 +(dp2007 +Vi +I4 +sVy +I1 +sVr +I4 +sVe +I12 +sVn +I1 +ssVof +p2008 +(dp2009 +V +I710 +sVe +I4 +sVf +I21 +sVi +I4 +sV, +I1 +sVo +I3 +sV. +I3 +sVr +I2 +sVt +I16 +sV; +I1 +ssVoe +p2010 +(dp2011 +Vs +I21 +sVu +I1 +sVv +I1 +ssVod +p2012 +(dp2013 +V! +I1 +sV +I31 +sVe +I2 +sVd +I2 +sVg +I3 +sVi +I3 +sV- +I2 +sV, +I3 +sVn +I3 +sVu +I8 +sVa +I1 +sVy +I3 +sV. +I2 +ssVoc +p2014 +(dp2015 +Va +I3 +sVc +I14 +sVe +I6 +sVi +I9 +sVk +I2 +sVu +I1 +ssVob +p2016 +(dp2017 +Va +I11 +sV +I1 +sVb +I1 +sVe +I2 +sVj +I8 +sVl +I11 +sVo +I2 +sVs +I9 +sVt +I3 +ssVoa +p2018 +(dp2019 +Vc +I5 +sVl +I1 +ssVUR +p2020 +(dp2021 +VP +I1 +sVC +I28 +sV +I1 +ssVUM +p2022 +(dp2023 +V +I1 +sVB +I1 +ssVga +p2024 +(dp2025 +Vg +I11 +sVi +I44 +sVl +I6 +sVn +I5 +sVr +I11 +sVt +I3 +sVv +I8 +sVy +I1 +ssVUN +p2026 +(dp2027 +VI +I1 +sVD +I2 +ssVH. +p2028 +(dp2029 +V +I1 +ssVoy +p2030 +(dp2031 +Va +I4 +sV +I5 +sVe +I2 +sVf +I1 +sVi +I2 +sVm +I3 +ssVox +p2032 +(dp2033 +V +I1 +sV. +I1 +ssVow +p2034 +(dp2035 +Va +I6 +sV +I158 +sVe +I75 +sV' +I1 +sVi +I16 +sV, +I24 +sV. +I3 +sVs +I5 +sVn +I90 +sV! +I1 +sV; +I2 +sV: +I1 +sVl +I6 +ssVov +p2036 +(dp2037 +Vi +I6 +sVa +I6 +sVe +I81 +sVo +I8 +ssVou +p2038 +(dp2039 +V! +I2 +sV +I271 +sVb +I29 +sVd +I2 +sVg +I102 +sVl +I199 +sVn +I86 +sVs +I92 +sVr +I374 +sVt +I80 +sV; +I4 +sV. +I11 +sV, +I40 +sV? +I1 +ssVot +p2040 +(dp2041 +Va +I6 +sV +I297 +sVe +I22 +sVi +I17 +sVh +I183 +sV* +I1 +sV, +I12 +sVo +I1 +sV. +I3 +sV) +I1 +sVt +I2 +sV; +I1 +ssVos +p2042 +(dp2043 +Va +I2 +sVe +I80 +sVi +I21 +sVp +I6 +sVs +I43 +sVu +I2 +sVt +I63 +ssVor +p2044 +(dp2045 +V +I382 +sV) +I1 +sV* +I1 +sV, +I11 +sV. +I2 +sV; +I2 +sV: +I3 +sVa +I4 +sVc +I7 +sVb +I8 +sVe +I142 +sVd +I56 +sVg +I18 +sVi +I10 +sVk +I10 +sVm +I43 +sVl +I21 +sVo +I4 +sVn +I12 +sVs +I13 +sVr +I21 +sVt +I100 +sVw +I8 +sVy +I15 +ssVUC +p2046 +(dp2047 +VH +I1 +ssVop +p2048 +(dp2049 +V +I2 +sVe +I48 +sVi +I19 +sVl +I2 +sVo +I6 +sVp +I14 +sVr +I7 +sVu +I1 +sVt +I2 +sVy +I14 +ssV!! +p2050 +(dp2051 +V +I1 +ssV! +p2052 +(dp2053 +VA +I1 +sVC +I2 +sVB +I1 +sVD +I1 +sVG +I2 +sVF +I3 +sVI +I17 +sVH +I5 +sVK +I1 +sVM +I3 +sVL +I1 +sVO +I1 +sVN +I1 +sVP +I1 +sVT +I4 +sVW +I3 +sVa +I3 +sVb +I4 +sVf +I1 +sVi +I1 +sVh +I2 +sVj +I1 +sVt +I5 +ssVC +p2054 +(dp2055 +VD +I2 +sVo +I1 +ssV** +p2056 +(dp2057 +V +I8 +sVE +I1 +sVF +I1 +sVI +I1 +sV* +I17 +sVS +I2 +sVT +I4 +sVW +I1 +ssVh- +p2058 +(dp2059 +V- +I1 +ssVNo +p2060 +(dp2061 +V +I3 +sV; +I1 +sVt +I5 +sVw +I1 +sV, +I3 +ssV!) +p2062 +(dp2063 +V +I1 +ssVNa +p2064 +(dp2065 +Vy +I1 +ssV!* +p2066 +(dp2067 +V +I1 +sV* +I1 +ssVNe +p2068 +(dp2069 +Vi +I1 +sVv +I1 +ssVh. +p2070 +(dp2071 +V +I13 +sV" +I1 +ssV[E +p2072 +(dp2073 +Vt +I1 +ssV[D +p2074 +(dp2075 +Va +I1 +ssVh +p2076 +(dp2077 +V/ +I1 +sV2 +I1 +sV8 +I1 +sVC +I2 +sVF +I2 +sVI +I35 +sVH +I1 +sVM +I9 +sVL +I6 +sVS +I2 +sVR +I8 +sVa +I100 +sVc +I10 +sVb +I6 +sVe +I8 +sVd +I6 +sVg +I7 +sVf +I12 +sVi +I25 +sVh +I68 +sVk +I2 +sVj +I2 +sVm +I51 +sVl +I7 +sVo +I35 +sVn +I4 +sVp +I15 +sVs +I28 +sVr +I6 +sVu +I4 +sVt +I65 +sVw +I26 +sVv +I1 +sVy +I19 +ssVh! +p2078 +(dp2079 +V +I1 +sV" +I1 +ssVh' +p2080 +(dp2081 +Vs +I4 +ssV[M +p2082 +(dp2083 +Va +I1 +ssVeh +p2084 +(dp2085 +Va +I19 +sVi +I1 +sVe +I7 +ssVNI +p2086 +(dp2087 +VT +I2 +ssV"a +p2088 +(dp2089 +Vs +I1 +ssV., +p2090 +(dp2091 +V +I18 +ssVek +p2092 +(dp2093 +V +I5 +sVs +I6 +sV, +I2 +sV. +I1 +ssVu; +p2094 +(dp2095 +V +I4 +ssV[t +p2096 +(dp2097 +Vr +I1 +sVo +I2 +ssV. +p2098 +(dp2099 +V +I27 +sV" +I13 +sV. +I4 +sVA +I30 +sVC +I10 +sVB +I16 +sVE +I4 +sVD +I33 +sVG +I2 +sVF +I16 +sVI +I209 +sVH +I69 +sVK +I2 +sVJ +I34 +sVM +I51 +sVL +I21 +sVO +I9 +sVN +I9 +sVP +I7 +sVS +I61 +sVR +I7 +sVU +I2 +sVT +I45 +sVW +I33 +sVV +I73 +sVY +I23 +sVa +I2 +sVb +I1 +sVi +I1 +sVw +I2 +ssVNA +p2100 +(dp2101 +VL +I3 +ssVNB +p2102 +(dp2103 +VE +I7 +ssV[x +p2104 +(dp2105 +Vx +I1 +ssVND +p2106 +(dp2107 +VI +I1 +sV +I1 +sV* +I2 +sVE +I5 +sV, +I1 +ssVNE +p2108 +(dp2109 +V +I7 +sVD +I1 +sVG +I1 +sVS +I1 +sVW +I1 +sVY +I1 +ssVNG +p2110 +(dp2111 +V +I2 +ssVNY +p2112 +(dp2113 +V +I2 +ssVu. +p2114 +(dp2115 +V +I13 +ssV[g +p2116 +(dp2117 +Ve +I1 +ssVrw +p2118 +(dp2119 +Va +I14 +sVi +I4 +ssVMO +p2120 +(dp2121 +VN +I1 +ssV.2 +p2122 +(dp2123 +V9 +I1 +ssVNS +p2124 +(dp2125 +V +I2 +sVE +I1 +sVO +I17 +ssVNT +p2126 +(dp2127 +V! +I2 +sVA +I2 +sV +I1 +sVI +I3 +sV* +I1 +sVR +I1 +sVY +I2 +ssVNU +p2128 +(dp2129 +VM +I1 +ssVhy +p2130 +(dp2131 +V +I13 +sVs +I2 +sV, +I4 +sVp +I2 +ssVN, +p2132 +(dp2133 +V +I1 +ssV-t +p2134 +(dp2135 +Vi +I2 +sVh +I4 +sVm +I4 +sVo +I1 +sVw +I1 +ssVN. +p2136 +(dp2137 +V +I19 +ssVhr +p2138 +(dp2139 +Vi +I2 +sVu +I3 +sVe +I9 +sVo +I8 +ssVhs +p2140 +(dp2141 +V +I9 +sV, +I1 +ssVg- +p2142 +(dp2143 +Vh +I1 +sVr +I6 +sV- +I4 +ssVka +p2144 +(dp2145 +Vb +I2 +ssVht +p2146 +(dp2147 +V +I90 +sVe +I50 +sVf +I7 +sVi +I1 +sV, +I12 +sV. +I3 +sVs +I5 +sV; +I1 +sVl +I1 +ssVhu +p2148 +(dp2149 +Vs +I21 +sVr +I54 +sVm +I9 +sVt +I2 +sVn +I5 +ssVTP +p2150 +(dp2151 +V +I2 +ssVhh +p2152 +(dp2153 +Vi +I46 +sVe +I1 +ssVhi +p2154 +(dp2155 +Vc +I117 +sVb +I1 +sVe +I3 +sVg +I13 +sVm +I153 +sVl +I85 +sVo +I3 +sVn +I149 +sVp +I20 +sVs +I283 +sVr +I5 +sVt +I13 +sVv +I2 +ssVhn +p2156 +(dp2157 +Vs +I18 +sVe +I1 +ssVho +p2158 +(dp2159 +V +I30 +sVc +I1 +sVe +I1 +sVd +I1 +sVi +I5 +sVm +I30 +sVl +I23 +sVo +I15 +sVn +I10 +sVp +I29 +sVs +I37 +sVr +I30 +sVu +I184 +sVw +I78 +sV, +I7 +ssVhl +p2160 +(dp2161 +Vy +I14 +sVe +I1 +ssVhm +p2162 +(dp2163 +Ve +I19 +ssVhb +p2164 +(dp2165 +Vo +I1 +ssVD* +p2166 +(dp2167 +V +I1 +sVT +I1 +ssVha +p2168 +(dp2169 +Ve +I2 +sVd +I97 +sVk +I1 +sVm +I3 +sVl +I67 +sVn +I85 +sVp +I47 +sVs +I113 +sVr +I47 +sVt +I403 +sVv +I281 +sVz +I1 +ssVhf +p2170 +(dp2171 +Vu +I4 +ssVs? +p2172 +(dp2173 +V +I2 +sV" +I2 +ssVhe +p2174 +(dp2175 +Va +I67 +sV +I1028 +sVc +I2 +sVe +I4 +sVd +I53 +sVi +I20 +sV- +I1 +sVm +I35 +sVl +I13 +sVn +I102 +sVs +I28 +sVr +I827 +sVt +I9 +sVy +I29 +sV; +I1 +sV. +I1 +sV, +I10 +ssV[3 +p2176 +(dp2177 +V] +I2 +ssV[2 +p2178 +(dp2179 +V] +I3 +ssV[1 +p2180 +(dp2181 +V0 +I1 +sV] +I3 +ssV-w +p2182 +(dp2183 +Va +I1 +sVe +I1 +ssVuy +p2184 +(dp2185 +V +I1 +ssV*S +p2186 +(dp2187 +VT +I2 +ssVXV +p2188 +(dp2189 +VI +I8 +sV +I3 +sVl +I1 +ssVut +p2190 +(dp2191 +Va +I3 +sV +I265 +sVe +I51 +sVi +I22 +sVh +I13 +sVm +I3 +sV, +I11 +sV. +I1 +sVu +I4 +sVt +I2 +sVy +I14 +sV; +I1 +ssVgy +p2192 +(dp2193 +V +I1 +sV, +I1 +ssV.c +p2194 +(dp2195 +Vs +I1 +sVo +I1 +ssVup +p2196 +(dp2197 +V +I14 +sVe +I11 +sVd +I1 +sVi +I3 +sV, +I3 +sVo +I5 +sV. +I1 +sVp +I21 +sVs +I2 +sVr +I1 +sVu +I1 +sVt +I4 +ssVus +p2198 +(dp2199 +Va +I84 +sV +I70 +sVb +I17 +sVe +I79 +sVi +I27 +sVh +I3 +sV, +I10 +sVn +I10 +sVp +I9 +sVs +I2 +sVu +I4 +sVt +I136 +sVy +I7 +sV; +I1 +sV. +I5 +sVl +I7 +ssVur +p2200 +(dp2201 +Va +I32 +sV +I238 +sVc +I75 +sVb +I2 +sVe +I122 +sVg +I10 +sV@ +I1 +sVi +I14 +sVh +I1 +sV, +I5 +sVn +I33 +sVp +I13 +sVs +I79 +sVr +I5 +sV! +I1 +sVt +I9 +sVv +I1 +sVy +I1 +sV; +I2 +sV. +I6 +ssVum +p2202 +(dp2203 +Va +I2 +sV +I3 +sVb +I7 +sVe +I2 +sVi +I3 +sVm +I9 +sV, +I2 +sVo +I3 +sVp +I3 +sVs +I10 +ssVul +p2204 +(dp2205 +Va +I37 +sV +I33 +sVe +I3 +sVd +I198 +sVg +I5 +sVi +I3 +sVl +I18 +sVo +I5 +sV. +I5 +sVs +I1 +sV! +I1 +sVt +I12 +sVy +I1 +sV; +I1 +sVn +I1 +sV, +I2 +ssV.z +p2206 +(dp2207 +Vi +I1 +ssVun +p2208 +(dp2209 +Va +I16 +sV +I5 +sVc +I24 +sVe +I23 +sVd +I66 +sVg +I29 +sVf +I5 +sVi +I27 +sVh +I10 +sVk +I6 +sVm +I1 +sVl +I6 +sVn +I5 +sVp +I4 +sVs +I3 +sVr +I1 +sVu +I1 +sVt +I47 +sVw +I5 +sV. +I1 +ssVui +p2210 +(dp2211 +Va +I1 +sVc +I1 +sVe +I4 +sVl +I6 +sVn +I6 +sVp +I1 +sVs +I9 +sVr +I15 +sVu +I1 +sVt +I28 +sVv +I4 +ssVue +p2212 +(dp2213 +V +I21 +sVd +I12 +sVl +I2 +sV. +I1 +sVs +I24 +sVt +I5 +sVn +I22 +sV, +I4 +ssVud +p2214 +(dp2215 +V +I1 +sVe +I29 +sVd +I5 +sVg +I14 +sVi +I9 +sV. +I1 +ssVug +p2216 +(dp2217 +V +I1 +sVl +I1 +sVg +I3 +sVh +I150 +ssV.s +p2218 +(dp2219 +Ve +I1 +ssV.t +p2220 +(dp2221 +Vy +I1 +sVx +I3 +ssV.u +p2222 +(dp2223 +Vi +I1 +ssVuc +p2224 +(dp2225 +Va +I8 +sVc +I5 +sVe +I10 +sVi +I1 +sVh +I123 +sVk +I9 +sV. +I1 +sVt +I21 +ssVub +p2226 +(dp2227 +Vb +I4 +sVd +I5 +sVj +I13 +sVm +I9 +sVl +I10 +sVs +I3 +sVt +I22 +ssVac +p2228 +(dp2229 +Va +I2 +sV +I1 +sVc +I45 +sVe +I37 +sVi +I4 +sVh +I55 +sVk +I8 +sVq +I16 +sVr +I5 +sVu +I2 +sVt +I59 +sVy +I12 +ssVab +p2230 +(dp2231 +Vi +I16 +sVh +I3 +sVj +I1 +sVl +I128 +sVo +I33 +sVs +I15 +sVu +I1 +ssVae +p2232 +(dp2233 +Vl +I2 +ssVad +p2234 +(dp2235 +Va +I4 +sV +I117 +sVe +I50 +sVd +I12 +sVf +I5 +sVi +I12 +sVm +I14 +sV, +I3 +sVo +I2 +sVn +I1 +sVs +I2 +sVu +I2 +sVv +I23 +sVy +I109 +sV. +I1 +sVl +I1 +ssVag +p2236 +(dp2237 +Va +I38 +sVe +I79 +sVg +I3 +sVi +I16 +sVo +I8 +sVr +I18 +sVu +I3 +ssVaf +p2238 +(dp2239 +Vr +I9 +sVe +I3 +sVt +I18 +sVf +I59 +ssVai +p2240 +(dp2241 +Vd +I39 +sVg +I1 +sVm +I10 +sVl +I11 +sVn +I178 +sVs +I6 +sVr +I22 +sVt +I10 +ssVak +p2242 +(dp2243 +Va +I1 +sV +I15 +sVe +I97 +sVf +I5 +sVi +I19 +sVn +I1 +sVs +I3 +ssVTu +p2244 +(dp2245 +Ve +I2 +ssVam +p2246 +(dp2247 +Va +I5 +sV +I121 +sVb +I2 +sVe +I110 +sVi +I33 +sVm +I6 +sV, +I9 +sVo +I3 +sVp +I7 +sVu +I5 +ssVal +p2248 +(dp2249 +Va +I5 +sV +I91 +sVc +I3 +sVe +I15 +sVd +I78 +sVf +I8 +sVi +I12 +sVk +I12 +sVm +I13 +sVl +I277 +sVo +I24 +sV. +I5 +sVs +I9 +sVr +I8 +sVu +I4 +sVt +I25 +sVw +I27 +sVy +I1 +sV, +I12 +ssVao +p2250 +(dp2251 +Vr +I4 +ssVan +p2252 +(dp2253 +V! +I2 +sV +I307 +sV' +I17 +sV, +I35 +sV. +I9 +sV; +I7 +sV: +I1 +sVa +I12 +sVc +I83 +sVe +I8 +sVd +I717 +sVg +I50 +sVi +I17 +sVk +I7 +sVl +I2 +sVo +I13 +sVn +I67 +sVq +I5 +sVs +I25 +sVt +I68 +sVw +I4 +sVv +I1 +sVy +I103 +sVx +I12 +ssVTo +p2254 +(dp2255 +V +I11 +sV- +I1 +ssVas +p2256 +(dp2257 +Va +I3 +sV +I521 +sVc +I4 +sVe +I28 +sVi +I32 +sVh +I7 +sVk +I9 +sV, +I3 +sVo +I28 +sV. +I1 +sVp +I1 +sVs +I45 +sV! +I1 +sVu +I21 +sVt +I76 +sVy +I13 +sV; +I1 +ssVar +p2258 +(dp2259 +Va +I35 +sV +I114 +sVc +I15 +sVb +I1 +sVe +I138 +sVd +I69 +sVg +I6 +sVf +I2 +sVi +I67 +sVk +I16 +sVm +I21 +sVl +I28 +sVo +I2 +sVn +I16 +sVs +I31 +sVr +I80 +sVt +I121 +sVy +I31 +sV; +I1 +sV. +I2 +sV, +I4 +ssVau +p2260 +(dp2261 +Vc +I1 +sVd +I2 +sVg +I47 +sVl +I6 +sVn +I10 +sVs +I20 +sVt +I12 +ssVat +p2262 +(dp2263 +Va +I1 +sV +I560 +sVc +I15 +sVe +I176 +sV' +I1 +sVi +I215 +sVh +I45 +sV, +I12 +sVo +I3 +sVl +I4 +sVr +I2 +sVu +I27 +sVt +I87 +sVy +I1 +sV; +I1 +sV. +I1 +ssVTh +p2264 +(dp2265 +Va +I4 +sVe +I47 +sVi +I16 +sVo +I3 +sVr +I2 +sVu +I4 +ssVTi +p2266 +(dp2267 +Vm +I1 +ssVay +p2268 +(dp2269 +Va +I1 +sV +I140 +sVe +I5 +sV' +I1 +sVi +I7 +sV, +I16 +sV. +I11 +sVs +I43 +sV; +I8 +ssVax +p2270 +(dp2271 +V +I2 +sVe +I2 +ssVTe +p2272 +(dp2273 +Vx +I1 +sVl +I1 +ssV80 +p2274 +(dp2275 +V0 +I1 +sV +I1 +ssVAf +p2276 +(dp2277 +Vt +I3 +ssV(a +p2278 +(dp2279 +V +I1 +sVs +I3 +sVt +I1 +sVn +I2 +ssVni +p2280 +(dp2281 +Va +I2 +sVc +I11 +sVe +I18 +sVg +I9 +sVf +I2 +sVl +I1 +sVo +I26 +sVn +I50 +sVs +I24 +sVu +I1 +sVt +I24 +sVv +I5 +ssVnj +p2282 +(dp2283 +Vu +I8 +sVe +I2 +sVo +I5 +ssVnk +p2284 +(dp2285 +V +I27 +sVe +I1 +sVf +I1 +sVi +I9 +sV, +I7 +sVs +I4 +ssVnl +p2286 +(dp2287 +Vy +I56 +sVa +I1 +sVi +I1 +sVu +I5 +sVe +I2 +ssVnw +p2288 +(dp2289 +Va +I46 +sVh +I4 +sVe +I2 +sVi +I2 +sVo +I1 +ssVnn +p2290 +(dp2291 +Vi +I6 +sVe +I42 +sVu +I1 +sVo +I42 +ssVno +p2292 +(dp2293 +V +I72 +sVc +I2 +sVb +I1 +sVe +I1 +sVf +I1 +sVi +I1 +sVm +I3 +sVn +I70 +sVs +I1 +sVr +I20 +sVu +I29 +sVt +I345 +sVw +I134 +ssV46 +p2294 +(dp2295 +V] +I1 +ssVna +p2296 +(dp2297 +Vc +I2 +sVb +I19 +sVd +I1 +sVm +I7 +sVl +I99 +sVn +I12 +sVr +I7 +sVt +I67 +sVv +I1 +sVy +I1 +ssVnb +p2298 +(dp2299 +Ve +I15 +ssVnc +p2300 +(dp2301 +Ve +I223 +sVi +I15 +sVh +I3 +sVl +I34 +sVo +I18 +sVr +I7 +sVu +I4 +sVt +I2 +sVy +I12 +ssVnd +p2302 +(dp2303 +Va +I7 +sV +I775 +sV" +I1 +sVe +I127 +sV' +I5 +sVi +I35 +sV- +I3 +sV, +I34 +sVo +I26 +sVn +I8 +sVs +I43 +sVr +I3 +sVu +I26 +sV; +I6 +sV. +I7 +sV? +I1 +sVl +I3 +ssVne +p2304 +(dp2305 +V +I94 +sV' +I2 +sV, +I25 +sV. +I10 +sV; +I5 +sV? +I3 +sVa +I11 +sVc +I31 +sVe +I9 +sVd +I71 +sVg +I9 +sVf +I3 +sVi +I6 +sVm +I3 +sVo +I2 +sVn +I4 +sVq +I1 +sVs +I91 +sVr +I47 +sVt +I5 +sVw +I14 +sVv +I44 +sVy +I13 +sVx +I18 +ssVnf +p2306 +(dp2307 +Va +I2 +sVe +I9 +sVi +I16 +sVl +I11 +sVo +I19 +sVr +I1 +sVu +I7 +ssVng +p2308 +(dp2309 +Va +I12 +sV +I609 +sV! +I1 +sVe +I40 +sV' +I7 +sVf +I19 +sVi +I4 +sV- +I11 +sVl +I11 +sVo +I1 +sV. +I22 +sVs +I47 +sVr +I14 +sVu +I9 +sVt +I11 +sV; +I10 +sV: +I4 +sV, +I39 +sV? +I3 +ssVTN +p2310 +(dp2311 +VE +I1 +ssVny +p2312 +(dp2313 +V +I80 +sVb +I1 +sV) +I2 +sVm +I1 +sV, +I1 +sVo +I7 +sV. +I2 +sVt +I12 +sVw +I1 +ssVnz +p2314 +(dp2315 +Va +I2 +ssVTM +p2316 +(dp2317 +VA +I1 +sV +I1 +ssVTH +p2318 +(dp2319 +VI +I2 +sVA +I2 +sVE +I20 +sV. +I1 +ssVTI +p2320 +(dp2321 +VA +I1 +sVC +I2 +sVE +I2 +sVO +I2 +sVV +I1 +ssVnp +p2322 +(dp2323 +Vr +I2 +sVl +I3 +ssVnq +p2324 +(dp2325 +Vu +I11 +ssVnr +p2326 +(dp2327 +Va +I3 +sVi +I1 +sVe +I1 +ssVTE +p2328 +(dp2329 +VX +I6 +sVR +I1 +sVD +I3 +sVN +I8 +ssVnt +p2330 +(dp2331 +Va +I29 +sV +I220 +sVe +I113 +sVf +I1 +sVi +I95 +sVh +I18 +sVm +I8 +sV, +I45 +sVo +I22 +sV. +I29 +sVs +I33 +sVr +I34 +sV! +I9 +sVy +I3 +sVu +I1 +sV; +I12 +sV? +I1 +sVl +I30 +ssVHu +p2332 +(dp2333 +Vr +I1 +sVm +I2 +sVn +I1 +ssVnv +p2334 +(dp2335 +Vi +I39 +sVa +I2 +sVe +I26 +sVy +I1 +ssVTA +p2336 +(dp2337 +VB +I1 +sVR +I2 +sVL +I1 +ssVa +p2338 +(dp2339 +V" +I1 +sVE +I1 +sVD +I1 +sVM +I1 +sVP +I1 +sVU +I1 +sVV +I2 +sVa +I4 +sVc +I25 +sVb +I6 +sVe +I1 +sVd +I28 +sVg +I16 +sVf +I29 +sVi +I9 +sVh +I18 +sVk +I3 +sVj +I1 +sVm +I41 +sVl +I29 +sVo +I7 +sVn +I4 +sVq +I1 +sVp +I18 +sVs +I41 +sVr +I18 +sVu +I1 +sVt +I14 +sVw +I30 +sVv +I13 +sVy +I9 +ssVAC +p2340 +(dp2341 +VH +I1 +sVT +I1 +ssVAB +p2342 +(dp2343 +VI +I2 +sVO +I1 +ssV's +p2344 +(dp2345 +V +I115 +sV, +I3 +sV. +I2 +ssVAD +p2346 +(dp2347 +VY +I35 +sV +I1 +sVE +I1 +sV, +I1 +ssVAG +p2348 +(dp2349 +VE +I3 +ssVE, +p2350 +(dp2351 +V +I2 +ssVAI +p2352 +(dp2353 +VM +I1 +sVL +I1 +sVN +I2 +ssVxu +p2354 +(dp2355 +Vl +I1 +ssVAM +p2356 +(dp2357 +VA +I3 +sVE +I4 +ssVAL +p2358 +(dp2359 +VI +I5 +sV +I1 +sVL +I2 +sVD +I3 +sV, +I1 +ssVa. +p2360 +(dp2361 +V +I2 +sVt +I1 +ssVy: +p2362 +(dp2363 +V +I1 +ssVT, +p2364 +(dp2365 +V +I2 +ssVAR +p2366 +(dp2367 +V +I2 +sVR +I4 +sVE +I2 +sVT +I3 +ssVT* +p2368 +(dp2369 +V +I2 +sV* +I2 +ssVAT +p2370 +(dp2371 +V +I2 +sV: +I1 +sVT +I1 +sVH +I8 +ssVAV +p2372 +(dp2373 +VE +I2 +sVO +I1 +ssVAY +p2374 +(dp2375 +V +I1 +ssVa; +p2376 +(dp2377 +V +I3 +ssV-s +p2378 +(dp2379 +Vi +I1 +sVa +I1 +sVu +I2 +sVh +I1 +ssVg! +p2380 +(dp2381 +V +I1 +ssVT +p2382 +(dp2383 +VG +I8 +sVP +I1 +sVf +I1 +sVI +I3 +sVH +I1 +sVM +I1 +sVL +I2 +sVO +I1 +sVN +I3 +sVp +I2 +sVm +I1 +sVi +I1 +sVd +I1 +ssVT! +p2384 +(dp2385 +V +I1 +sV* +I1 +ssV"o +p2386 +(dp2387 +Vr +I1 +sVn +I1 +ssVn* +p2388 +(dp2389 +V* +I2 +ssV'T +p2390 +(dp2391 +V +I1 +ssVn, +p2392 +(dp2393 +V +I182 +sV" +I1 +ssVAd +p2394 +(dp2395 +Vi +I8 +ssVn. +p2396 +(dp2397 +V +I68 +sV" +I3 +ssVn/ +p2398 +(dp2399 +VC +I1 +ssVn +p2400 +(dp2401 +V" +I1 +sV/ +I1 +sV1 +I1 +sV3 +I1 +sV2 +I1 +sV5 +I1 +sV9 +I1 +sVA +I2 +sVE +I7 +sVF +I4 +sVI +I30 +sVK +I1 +sVM +I8 +sVL +I13 +sVS +I5 +sVR +I3 +sVU +I4 +sVT +I3 +sVW +I3 +sVV +I2 +sV[ +I1 +sVa +I154 +sVc +I31 +sVb +I51 +sVe +I50 +sVd +I26 +sVg +I19 +sVf +I52 +sVi +I87 +sVh +I109 +sVk +I5 +sVj +I3 +sVm +I91 +sVl +I19 +sVo +I127 +sVn +I14 +sVp +I31 +sVs +I77 +sVr +I24 +sVu +I21 +sVt +I254 +sVw +I88 +sVv +I10 +sVy +I41 +ssVn! +p2402 +(dp2403 +V +I8 +sV" +I1 +ssVn" +p2404 +(dp2405 +V +I1 +ssVTR +p2406 +(dp2407 +VI +I2 +sVA +I1 +ssVAm +p2408 +(dp2409 +V +I1 +sVo +I3 +ssVAl +p2410 +(dp2411 +Vi +I9 +sVl +I5 +ssVn' +p2412 +(dp2413 +Vs +I26 +sVt +I1 +ssVn: +p2414 +(dp2415 +V +I4 +ssVn; +p2416 +(dp2417 +V +I39 +ssVAu +p2418 +(dp2419 +Vs +I6 +ssVAt +p2420 +(dp2421 +V +I11 +ssVAw +p2422 +(dp2423 +Va +I1 +ssVn? +p2424 +(dp2425 +V +I3 +ssVn1 +p2426 +(dp2427 +V1 +I1 +sV0 +I3 +ssVG" +p2428 +(dp2429 +V +I1 +sssb. \ No newline at end of file diff --git a/examples/filters/guess-language/fr.data b/examples/filters/guess-language/fr.data new file mode 100644 index 0000000..597f9c5 --- /dev/null +++ b/examples/filters/guess-language/fr.data @@ -0,0 +1,22710 @@ +(itrigram +Trigram +p1 +(dp2 +S'length' +p3 +F8394.978022603751 +sS'lut' +p4 +(dp5 +V-D +p6 +(dp7 +Va +I3 +ssVG" +p8 +(dp9 +V +I2 +ssVG +p10 +(dp11 +Va +I1 +sVB +I2 +ssVG- +p12 +(dp13 +Vt +I5 +sVT +I1 +ssVGU +p14 +(dp15 +VT +I8 +ssVGR +p16 +(dp17 +V +I1 +ssVGE +p18 +(dp19 +VS +I3 +sVN +I1 +ssVGL +p20 +(dp21 +VI +I1 +ssVGI +p22 +(dp23 +VV +I1 +ssVGu +p24 +(dp25 +Vi +I1 +sVt +I26 +ssVGr +p26 +(dp27 +Va +I5 +sVe +I1 +ssVGe +p28 +(dp29 +Vr +I1 +sVo +I1 +sVn +I3 +ssVGa +p30 +(dp31 +Vr +I1 +sVu +I2 +sVl +I1 +sV +I1 +ssVGo +p32 +(dp33 +Va +I1 +ssVGi +p34 +(dp35 +Vr +I9 +sVv +I1 +ssVZ, +p36 +(dp37 +V +I1 +ssVZ +p38 +(dp39 +VL +I1 +ssVr +p40 +(dp41 +Ve +I319 +ssVs +p42 +(dp43 +V +I148 +sVe +I2 +sV- +I2 +sV, +I3 +sV; +I1 +sV_ +I1 +ssVq +p44 +(dp45 +Vu +I4 +ssVv +p46 +(dp47 +Vr +I2 +sVe +I4 +ssVt +p48 +(dp49 +Vr +I1 +sVe +I9 +ssVn +p50 +(dp51 +Ve +I24 +ssVl +p52 +(dp53 +Ve +I7 +ssVm +p54 +(dp55 +Ve +I30 +ssVc +p56 +(dp57 +Vh +I2 +sVe +I23 +sVl +I14 +ssVg +p58 +(dp59 +Vr +I8 +sVe +I7 +sVl +I1 +ssVd +p60 +(dp61 +Ve +I4 +ssV-c +p62 +(dp63 +Vi +I14 +sVh +I6 +sVe +I16 +sVo +I2 +ssVty +p64 +(dp65 +Va +I1 +sV +I9 +sVr +I2 +sVl +I1 +sV, +I1 +ssVZa +p66 +(dp67 +Vm +I1 +ssVtw +p68 +(dp69 +Va +I3 +sVo +I1 +ssV-o +p70 +(dp71 +Vf +I1 +sVn +I7 +ssV-n +p72 +(dp73 +Ve +I1 +sVo +I15 +ssVt +p74 +(dp75 +Ve +I1 +ssV-i +p76 +(dp77 +V8 +I1 +sVl +I83 +sVn +I5 +ssVM +p78 +(dp79 +Vo +I1 +ssV-h +p80 +(dp81 +Ve +I1 +sVu +I1 +sVo +I3 +ssVtq +p82 +(dp83 +Vu +I1 +ssVm' +p84 +(dp85 +Va +I46 +sVe +I12 +sV +I7 +sVh +I1 +sVo +I6 +sVi +I2 +sVy +I1 +ssVm +p86 +(dp87 +Va +I7 +sV +I1 +sVc +I2 +sVb +I1 +sVe +I6 +sVd +I10 +sVi +I2 +sV( +I2 +sVl +I1 +sVo +I3 +sVq +I1 +sVp +I2 +sVs +I1 +sVr +I1 +sVt +I3 +ssV-t +p88 +(dp89 +Ve +I23 +sVh +I1 +sV- +I20 +sVm +I6 +sVr +I12 +sVu +I4 +ssVm, +p90 +(dp91 +V +I9 +ssVm. +p92 +(dp93 +V +I9 +ssVm) +p94 +(dp95 +V, +I1 +sV. +I1 +ssV-w +p96 +(dp97 +Vi +I1 +ssV"l +p98 +(dp99 +Ve +I1 +ssVtm +p100 +(dp101 +V +I5 +sV" +I1 +sVl +I2 +ssV9] +p102 +(dp103 +V +I2 +ssVm> +p104 +(dp105 +V +I1 +ssVm: +p106 +(dp107 +V +I2 +ssV9, +p108 +(dp109 +V +I8 +ssV9. +p110 +(dp111 +V +I5 +ssV9 +p112 +(dp113 +VU +I1 +sVD +I1 +ssV-r +p114 +(dp115 +Va +I2 +sVo +I1 +ssV99 +p116 +(dp117 +V +I1 +sV, +I1 +sV1 +I1 +sV4 +I1 +sV7 +I1 +sV9 +I1 +sV8 +I1 +ssV98 +p118 +(dp119 +V +I1 +sV, +I1 +ssV9: +p120 +(dp121 +V +I1 +ssV91 +p122 +(dp123 +V +I2 +ssV90 +p124 +(dp125 +V +I2 +sV0 +I1 +ssVm_ +p126 +(dp127 +V, +I2 +sV. +I1 +ssV92 +p128 +(dp129 +V, +I2 +ssV95 +p130 +(dp131 +V, +I1 +ssV94 +p132 +(dp133 +V +I2 +sV, +I2 +ssV97 +p134 +(dp135 +V1 +I2 +sV +I1 +sV; +I1 +sV, +I1 +ssV96 +p136 +(dp137 +V, +I3 +ssVme +p138 +(dp139 +V! +I1 +sV +I462 +sV- +I4 +sV, +I44 +sV. +I16 +sV; +I11 +sV: +I5 +sV? +I1 +sV[ +I3 +sV_ +I4 +sVa +I2 +sVd +I11 +sVi +I20 +sVm +I4 +sVl +I1 +sVo +I1 +sVn +I379 +sVs +I187 +sVr +I54 +sVu +I27 +sVt +I48 +sVz +I6 +ssV +p140 +(dp141 +VQ +I1 +sV. +I1 +ssVma +p142 +(dp143 +V +I46 +sV +I59 +sV- +I1 +sV, +I3 +sVc +I7 +sVb +I4 +sVe +I2 +sVd +I67 +sVg +I25 +sVi +I262 +sVk +I3 +sVj +I14 +sVm +I1 +sVl +I72 +sV +I1 +sVn +I185 +sVs +I17 +sVr +I70 +sVu +I22 +sVt +I39 +sVy +I23 +sVx +I3 +ssVmb +p144 +(dp145 +Va +I34 +sV +I2 +sVe +I25 +sVi +I11 +sV +I1 +sVl +I39 +sVo +I88 +sV. +I1 +sV +I1 +sVr +I40 +ssVmm +p146 +(dp147 +Va +I26 +sVe +I313 +sV +I9 +sV +I4 +sVo +I9 +sVi +I5 +sVu +I13 +ssVml +p148 +(dp149 +V +I2 +sVe +I1 +ssVmo +p150 +(dp151 +Ve +I7 +sVd +I17 +sVi +I197 +sVm +I16 +sVl +I4 +sVn +I286 +sVq +I3 +sVs +I8 +sVr +I57 +sVu +I77 +sVt +I20 +sVv +I3 +sVy +I4 +sV. +I1 +ssVmn +p152 +(dp153 +V +I2 +sVi +I2 +sVa +I1 +sVo +I1 +ssVmi +p154 +(dp155 +V +I15 +sVe +I53 +sVd +I4 +sVg +I1 +sV +I20 +sV- +I1 +sVl +I85 +sVn +I36 +sVq +I1 +sVs +I75 +sVr +I27 +sVt +I39 +sV. +I1 +sV, +I8 +ssVmu +p156 +(dp157 +V +I2 +sVe +I2 +sVm +I1 +sVl +I5 +sVn +I13 +sVp +I3 +sVs +I16 +sVr +I2 +sVt +I2 +ssVmt +p158 +(dp159 +Ve +I2 +ssV 9 +p160 +(dp161 +V1 +I1 +sV0 +I3 +sV3 +I1 +sV2 +I2 +sV5 +I1 +sV4 +I1 +sV7 +I1 +sV6 +I1 +sV9 +I1 +sV8 +I1 +ssVmp +p162 +(dp163 +Va +I30 +sV +I5 +sVe +I17 +sVi +I11 +sVh +I1 +sV +I9 +sVl +I25 +sVo +I32 +sV, +I2 +sV +I3 +sVs +I48 +sVr +I16 +sVu +I8 +sVt +I15 +sV. +I1 +ssVms +p164 +(dp165 +V +I3 +sV, +I1 +sVt +I1 +sV. +I1 +ssV"p +p166 +(dp167 +Vu +I1 +ssVmy +p168 +(dp169 +Vs +I1 +sVr +I2 +ssVLe +p170 +(dp171 +V +I87 +sVc +I4 +sVb +I1 +sVg +I1 +sVi +I3 +sVm +I3 +sVs +I48 +sVu +I4 +sVt +I6 +sVy +I1 +ssVLa +p172 +(dp173 +V +I42 +sVv +I1 +sVm +I3 +sVt +I2 +sVn +I1 +ssVLo +p174 +(dp175 +Vi +I1 +sVm +I1 +sVs +I1 +sVu +I13 +sVn +I1 +ssV"s +p176 +(dp177 +Vm +I1 +ssVLi +p178 +(dp179 +Vs +I11 +sVm +I2 +sVt +I6 +sVn +I2 +ssVLu +p180 +(dp181 +Vc +I2 +ssVLE +p182 +(dp183 +V +I1 +sVF +I1 +sVM +I1 +sVQ +I1 +sVS +I1 +sVT +I2 +ssVLA +p184 +(dp185 +VI +I1 +sV +I1 +sVR +I1 +ssVLO +p186 +(dp187 +VR +I1 +ssVLL +p188 +(dp189 +V +I2 +sVE +I1 +ssVLI +p190 +(dp191 +VA +I1 +sVC +I2 +sVB +I1 +sVE +I1 +sVG +I1 +sVI +I1 +sVM +I3 +sVT +I3 +ssVLT +p192 +(dp193 +VA +I2 +ssVLU +p194 +(dp195 +VD +I2 +ssVLS +p196 +(dp197 +V, +I1 +ssVLP +p198 +(dp199 +VH +I1 +ssVL' +p200 +(dp201 +Va +I16 +sV +I1 +sVE +I1 +sVi +I1 +sV +I1 +sVh +I1 +sVo +I2 +sV +I1 +sVA +I2 +sVO +I2 +sVu +I4 +sVe +I2 +ssVL +p202 +(dp203 +VP +I2 +sVM +I1 +sVd +I1 +sVD +I1 +ssVL, +p204 +(dp205 +V +I1 +ssVm +p206 +(dp207 +Vt +I2 +ssVm +p208 +(dp209 +V +I15 +sVc +I4 +sVe +I11 +sVd +I14 +sVm +I4 +sVl +I5 +sVn +I1 +sVp +I5 +sVs +I8 +sVr +I17 +sVt +I22 +sV. +I2 +sV? +I1 +ssVm +p210 +(dp211 +Vr +I28 +sVt +I1 +sVn +I17 +ssVm +p212 +(dp213 +Vm +I66 +sVl +I5 +ssVm +p214 +(dp215 +Vn +I4 +ssV_[ +p216 +(dp217 +V2 +I1 +ssV_V +p218 +(dp219 +Va +I1 +sVo +I2 +ssV_T +p220 +(dp221 +Ve +I3 +ssV_S +p222 +(dp223 +Vi +I4 +sVe +I2 +ssV_R +p224 +(dp225 +Ve +I1 +ssV_P +p226 +(dp227 +Va +I1 +sVr +I8 +ssV_O +p228 +(dp229 +V +I1 +sVe +I1 +ssV_N +p230 +(dp231 +Vo +I1 +ssV_M +p232 +(dp233 +V +I10 +sVa +I2 +sVo +I2 +ssV_L +p234 +(dp235 +Va +I1 +sVe +I7 +sV' +I1 +ssV_J +p236 +(dp237 +Vo +I2 +ssV_I +p238 +(dp239 +Vt +I1 +ssV_H +p240 +(dp241 +Vi +I3 +sVe +I1 +sVo +I1 +ssV_E +p242 +(dp243 +Vx +I1 +sVl +I1 +ssV_D +p244 +(dp245 +Vi +I3 +ssV_C +p246 +(dp247 +Va +I9 +sVr +I1 +sVo +I2 +ssV_A +p248 +(dp249 +Vr +I1 +sVn +I1 +ssVr +p250 +(dp251 +Vl +I3 +sVt +I3 +sVn +I12 +ssV_u +p252 +(dp253 +Vt +I1 +sVn +I1 +ssVr +p254 +(dp255 +Vl +I13 +ssV_m +p256 +(dp257 +V +I1 +ssVr +p258 +(dp259 +Va +I4 +sVu +I11 +sVo +I6 +ssV_i +p260 +(dp261 +Vn +I1 +ssV_h +p262 +(dp263 +Vo +I1 +ssV_g +p264 +(dp265 +Vl +I1 +ssVr +p266 +(dp267 +Vt +I1 +ssVr +p268 +(dp269 +Vs +I139 +sVr +I38 +sVt +I3 +sVg +I1 +ssVr +p270 +(dp271 +V +I2 +sV +I22 +sV, +I5 +sV; +I2 +sV? +I1 +sVa +I17 +sVc +I33 +sVb +I1 +sVe +I25 +sVd +I10 +sVg +I6 +sVf +I11 +sVi +I2 +sVm +I15 +sVl +I1 +sVn +I1 +sVp +I77 +sVs +I61 +sVr +I1 +sVu +I1 +sVt +I23 +sVv +I26 +ssVr +p272 +(dp273 +Vc +I3 +sVm +I13 +sVt +I27 +sVv +I4 +ssVxf +p274 +(dp275 +Vo +I1 +ssV_; +p276 +(dp277 +V +I10 +ssV_: +p278 +(dp279 +V +I1 +ssV_. +p280 +(dp281 +V +I27 +sV, +I1 +ssV_, +p282 +(dp283 +V +I43 +ssV_) +p284 +(dp285 +V +I1 +ssV_ +p286 +(dp287 +Va +I2 +sVE +I1 +sVd +I4 +sV( +I1 +sVj +I1 +sVq +I1 +sVp +I1 +sVe +I1 +ssVr] +p288 +(dp289 +V +I2 +ssVr_ +p290 +(dp291 +V +I1 +sV; +I1 +sV. +I1 +ssV_ +p292 +(dp293 +Vp +I1 +sVl +I1 +ssVrt +p294 +(dp295 +Va +I43 +sV +I103 +sVe +I78 +sV@ +I2 +sVi +I188 +sVh +I4 +sV, +I10 +sVo +I23 +sV. +I8 +sV +I17 +sVs +I21 +sV! +I1 +sVu +I32 +sV +I1 +sVy +I2 +sV; +I4 +sVr +I2 +sV_ +I1 +ssVru +p296 +(dp297 +Va +I3 +sV +I7 +sVc +I5 +sVb +I5 +sVe +I10 +sVd +I9 +sVi +I28 +sVm +I1 +sV, +I2 +sVn +I5 +sVp +I2 +sVs +I9 +sVr +I9 +sVt +I17 +sVv +I1 +sV. +I1 +sVl +I1 +ssVrv +p298 +(dp299 +Va +I11 +sVe +I10 +sVi +I30 +sVo +I2 +sV +I2 +sVu +I2 +ssVrw +p300 +(dp301 +Va +I1 +sVo +I1 +ssVrp +p302 +(dp303 +V +I1 +sVa +I1 +sVs +I11 +sVr +I15 +sVe +I5 +ssVrq +p304 +(dp305 +Vu +I52 +ssVrr +p306 +(dp307 +Va +I42 +sVe +I106 +sVi +I76 +sVh +I1 +sV +I10 +sVo +I24 +sV +I4 +sVu +I1 +ssVrs +p308 +(dp309 +V! +I4 +sV +I324 +sV) +I1 +sVe +I18 +sVp +I1 +sV +I6 +sV +I1 +sV, +I60 +sVo +I37 +sV. +I24 +sVq +I8 +sVi +I6 +sVu +I5 +sVt +I5 +sVa +I19 +sV[ +I1 +sV: +I2 +sV; +I14 +sV? +I3 +ssVry +p310 +(dp311 +Vi +I2 +sV +I14 +sV* +I1 +sVm +I1 +sV, +I2 +ssVrz +p312 +(dp313 +Ve +I2 +ssVrd +p314 +(dp315 +Va +I30 +sV +I40 +sVe +I47 +sV' +I8 +sVi +I44 +sV +I3 +sV- +I1 +sV, +I8 +sVo +I19 +sV. +I3 +sV +I7 +sVs +I8 +sVr +I11 +sVu +I19 +sVw +I1 +sV; +I2 +sV: +I1 +sV[ +I1 +ssVre +p316 +(dp317 +V! +I8 +sV +I911 +sV) +I2 +sV- +I8 +sV, +I162 +sV. +I75 +sV; +I64 +sV: +I22 +sV? +I19 +sVg +I28 +sV[ +I2 +sV_ +I9 +sVa +I22 +sVc +I52 +sVb +I3 +sVe +I10 +sVd +I17 +sV +I19 +sVf +I15 +sVi +I24 +sVh +I1 +sVj +I1 +sVm +I115 +sVl +I30 +sVn +I335 +sVq +I9 +sVp +I44 +sVs +I370 +sVr +I50 +sVu +I59 +sVt +I62 +sVv +I38 +sVz +I32 +ssVrf +p318 +(dp319 +Va +I6 +sV +I3 +sVf +I1 +sVi +I1 +sVo +I1 +sVs +I2 +sVu +I2 +ssVrg +p320 +(dp321 +Va +I3 +sV +I24 +sVe +I36 +sVi +I14 +sVh +I1 +sV- +I1 +sV, +I4 +sVo +I2 +sVn +I2 +sV +I14 +sVu +I3 +sV/ +I4 +sV +I1 +sV; +I1 +sV. +I3 +ssVra +p322 +(dp323 +V +I17 +sV +I74 +sVp +I21 +sV- +I2 +sV, +I15 +sV. +I2 +sV: +I1 +sVa +I3 +sVc +I32 +sVb +I20 +sVe +I1 +sVd +I39 +sVg +I41 +sVf +I3 +sVi +I267 +sVh +I2 +sV +I1 +sVm +I21 +sVl +I27 +sVo +I6 +sVn +I224 +sV +I2 +sVs +I42 +sVr +I12 +sVu +I3 +sVt +I36 +sVv +I45 +sVy +I2 +ssVrb +p324 +(dp325 +Vi +I4 +sVa +I9 +sVk +I1 +sVr +I6 +sVe +I4 +ssVrc +p326 +(dp327 +V +I4 +sVc +I1 +sVe +I45 +sVi +I18 +sVh +I45 +sVk +I1 +sV, +I4 +sVo +I7 +sV +I1 +sV +I1 +sVs +I3 +sVr +I1 +sV +I1 +sV; +I1 +sV. +I3 +sVl +I1 +ssVrl +p328 +(dp329 +Va +I22 +sVe +I37 +sVd +I3 +sV +I6 +sVo +I3 +sVi +I3 +sVy +I1 +ssVrm +p330 +(dp331 +Va +I33 +sV +I4 +sV) +I1 +sVe +I58 +sVi +I27 +sVl +I1 +sVo +I11 +sV, +I1 +sV +I14 +sV. +I1 +ssVrn +p332 +(dp333 +Va +I44 +sV +I2 +sVe +I39 +sV +I12 +sVo +I3 +sV. +I1 +sVi +I10 +sVu +I1 +ssVro +p334 +(dp335 +V +I1 +sVa +I1 +sVc +I57 +sVb +I17 +sVd +I28 +sVg +I7 +sVf +I30 +sVi +I164 +sVh +I1 +sVj +I32 +sVm +I35 +sVl +I25 +sVo +I2 +sVn +I157 +sVq +I3 +sVp +I49 +sVs +I30 +sVr +I2 +sVu +I138 +sVt +I6 +sVv +I28 +sVy +I34 +ssVrh +p336 +(dp337 +Vu +I2 +ssVri +p338 +(dp339 +V +I8 +sV, +I6 +sV; +I2 +sV? +I1 +sV +I2 +sV_ +I1 +sVa +I35 +sVc +I16 +sVb +I36 +sVe +I146 +sVd +I16 +sVg +I34 +sVf +I5 +sV +I1 +sV +I24 +sVm +I15 +sVl +I15 +sVo +I19 +sVn +I53 +sVq +I12 +sVp +I12 +sVs +I102 +sVr +I38 +sVu +I2 +sVt +I110 +sVv +I63 +sVx +I9 +sVz +I3 +ssV_ +p340 +(dp341 +V +I1 +ssVr? +p342 +(dp343 +V +I10 +sV- +I1 +ssVr: +p344 +(dp345 +V +I11 +ssVr; +p346 +(dp347 +V +I48 +ssVr' +p348 +(dp349 +Va +I1 +sVs +I1 +sVo +I2 +ssVr +p350 +(dp351 +Vj +I13 +sVR +I2 +sVi +I28 +sV( +I1 +sV/ +I1 +sV1 +I2 +sV2 +I1 +sV9 +I1 +sVA +I4 +sVC +I24 +sVB +I2 +sVD +I2 +sVG +I1 +sVI +I2 +sVH +I1 +sVJ +I2 +sVM +I12 +sVL +I3 +sVN +I3 +sVP +I22 +sV +I1 +sVW +I1 +sV[ +I1 +sVZ +I2 +sVa +I84 +sV +I45 +sVc +I66 +sVb +I11 +sVe +I85 +sVd +I242 +sVg +I4 +sVf +I25 +sV +I10 +sVh +I7 +sV +I5 +sVm +I64 +sVl +I302 +sVo +I27 +sVn +I25 +sVq +I53 +sVp +I71 +sVs +I88 +sVr +I17 +sVu +I63 +sVt +I56 +sVw +I3 +sVv +I26 +sVy +I2 +ssVr! +p352 +(dp353 +V +I6 +ssVr, +p354 +(dp355 +V +I204 +ssVr- +p356 +(dp357 +Vd +I3 +sVt +I11 +sVl +I5 +ssVr. +p358 +(dp359 +VA +I1 +sV +I92 +sV +I1 +sV- +I1 +sV0 +I1 +ssVr/ +p360 +(dp361 +VN +I1 +ssVr* +p362 +(dp363 +V +I2 +ssV, +p364 +(dp365 +V +I1 +ssVQu +p366 +(dp367 +Va +I12 +sVi +I5 +sVe +I26 +sVo +I8 +sV' +I6 +ssVQU +p368 +(dp369 +VI +I1 +sVE +I1 +sV' +I2 +ssVd. +p370 +(dp371 +V +I11 +ssVd, +p372 +(dp373 +V +I31 +ssVd- +p374 +(dp375 +Va +I1 +sVi +I6 +sVo +I1 +sVp +I1 +sVs +I2 +sVr +I2 +sVT +I1 +sVw +I1 +ssVd) +p376 +(dp377 +V: +I1 +ssVq +p378 +(dp379 +Vu +I14 +ssVd' +p380 +(dp381 +Va +I91 +sVA +I18 +sV +I1 +sVE +I20 +sVi +I16 +sVh +I27 +sV +I30 +sVo +I21 +sV +I1 +sV +I26 +sVs +I1 +sVu +I109 +sVO +I3 +sVy +I2 +sVe +I53 +sVU +I1 +sVI +I3 +ssVs +p382 +(dp383 +Va +I8 +sV +I81 +sVe +I47 +sVi +I13 +sVh +I2 +sV, +I37 +sVo +I11 +sV. +I11 +sVu +I36 +sV; +I5 +sV? +I3 +ssVr +p384 +(dp385 +Va +I48 +sVe +I31 +sV +I15 +sV +I2 +sVo +I15 +sVi +I75 +sVu +I1 +ssVu +p386 +(dp387 +Vs +I1 +sVo +I1 +ssVt +p388 +(dp389 +Va +I276 +sVe +I34 +sV +I80 +sVh +I1 +sVo +I21 +sVi +I34 +sVr +I51 +sVu +I5 +ssVd +p390 +(dp391 +VC +I1 +sVB +I4 +sVE +I2 +sVI +I3 +sVJ +I1 +sVM +I1 +sVP +I3 +sVS +I2 +sVW +I1 +sVV +I1 +sV[ +I1 +sV_ +I1 +sVa +I22 +sV +I4 +sVc +I9 +sVb +I20 +sVe +I13 +sVd +I24 +sVg +I2 +sVf +I9 +sVi +I26 +sVh +I7 +sVj +I10 +sVm +I15 +sVl +I16 +sVo +I29 +sVn +I5 +sVq +I5 +sVp +I26 +sVs +I14 +sVr +I7 +sVu +I6 +sVt +I16 +sVw +I4 +sVv +I6 +sVy +I8 +ssVv +p392 +(dp393 +Va +I4 +sVe +I6 +sV +I20 +sV +I1 +sVo +I15 +sVi +I2 +sVu +I1 +ssVi +p394 +(dp395 +Vs +I1 +sVm +I1 +sVt +I3 +sVd +I1 +ssVd? +p396 +(dp397 +V +I2 +ssVj +p398 +(dp399 +V +I17 +sVe +I4 +sVo +I3 +ssVd: +p400 +(dp401 +V +I2 +ssVl +p402 +(dp403 +Va +I36 +sVe +I13 +sVi +I21 +sV +I3 +sVo +I4 +sV +I3 +sVu +I1 +ssVo +p404 +(dp405 +Vd +I3 +sVl +I6 +sVt +I1 +ssVn +p406 +(dp407 +Va +I7 +sVe +I5 +sVi +I16 +sV +I1 +sVo +I15 +sV +I16 +sVu +I1 +ssVa +p408 +(dp409 +Vt +I16 +sVb +I9 +sVu +I2 +sVl +I3 +sVn +I3 +ssVc +p410 +(dp411 +Va +I2 +sVe +I20 +sVi +I28 +sVh +I19 +sVl +I9 +sVo +I27 +sVr +I37 +sVu +I22 +ssVb +p412 +(dp413 +Va +I8 +sVi +I1 +sVr +I4 +ssVe +p414 +(dp415 +V +I106 +sV, +I28 +sV. +I16 +sVs +I57 +sVn +I6 +sV; +I9 +sV: +I3 +sV[ +I1 +sV? +I2 +ssVd +p416 +(dp417 +Va +I2 +sVe +I12 +sVi +I47 +sV +I6 +sVr +I2 +sVu +I8 +ssVg +p418 +(dp419 +Va +I8 +sVe +I1 +sVi +I4 +sV +I4 +sVl +I3 +sVo +I140 +sVn +I2 +sV +I1 +sVr +I2 +sVu +I2 +sVy +I1 +ssVf +p420 +(dp421 +Va +I5 +sVe +I5 +sVi +I4 +sVl +I4 +sV +I3 +sVr +I1 +sVu +I3 +ssV[ +p422 +(dp423 +V1 +I1 +ssV_ +p424 +(dp425 +V, +I3 +ssVdn +p426 +(dp427 +Vi +I2 +ssVdo +p428 +(dp429 +V +I13 +sVc +I16 +sVe +I1 +sVg +I2 +sVi +I14 +sVm +I13 +sV, +I11 +sVn +I203 +sVs +I5 +sVr +I37 +sVu +I64 +sVw +I4 +sV[ +I2 +sV. +I5 +sV_ +I1 +sVl +I9 +ssV; +p430 +(dp431 +V +I17 +ssV: +p432 +(dp433 +V +I8 +ssVdj +p434 +(dp435 +Vu +I1 +ssV? +p436 +(dp437 +V +I8 +ssVdi +p438 +(dp439 +V +I3 +sV, +I1 +sV1 +I8 +sVa +I43 +sVc +I13 +sVe +I34 +sVd +I393 +sVg +I13 +sVf +I13 +sV +I1 +sV +I2 +sVk +I1 +sVm +I3 +sVl +I3 +sVo +I2 +sVn +I41 +sVq +I6 +sVp +I1 +sVs +I151 +sVr +I50 +sVu +I5 +sVt +I434 +sVv +I5 +sVx +I25 +ssVdd +p440 +(dp441 +Vi +I8 +sVe +I1 +ssVde +p442 +(dp443 +V! +I12 +sV +I1745 +sV- +I1 +sV, +I177 +sV. +I85 +sV; +I49 +sV: +I18 +sV? +I7 +sVM +I1 +sV_ +I8 +sVa +I11 +sVc +I9 +sVb +I1 +sVd +I11 +sVg +I1 +sVf +I1 +sVm +I130 +sVl +I8 +sVn +I34 +sVp +I9 +sVs +I430 +sVr +I84 +sVu +I155 +sVt +I1 +sVv +I40 +sVy +I3 +sVx +I1 +sVz +I9 +ssVdb +p444 +(dp445 +Ve +I1 +ssVda +p446 +(dp447 +V +I25 +sVb +I6 +sVd +I1 +sVg +I1 +sVi +I54 +sV- +I9 +sVj +I2 +sVm +I46 +sVl +I10 +sVn +I401 +sVy +I5 +sVs +I2 +sVr +I1 +sVt +I33 +sVv +I9 +sV[ +I1 +sV; +I3 +sV: +I1 +sV, +I3 +sV_ +I1 +ssV, +p448 +(dp449 +V +I78 +ssV. +p450 +(dp451 +V +I31 +sV- +I2 +ssVdv +p452 +(dp453 +Vi +I4 +sVa +I1 +sVe +I1 +ssV +p454 +(dp455 +Vp +I47 +sVC +I4 +sVM +I1 +sVR +I2 +sVU +I1 +sV_ +I2 +sVa +I27 +sV +I27 +sVc +I17 +sVb +I5 +sVe +I29 +sVd +I124 +sVg +I2 +sVf +I7 +sVi +I6 +sVh +I2 +sVj +I4 +sVm +I14 +sVl +I32 +sVo +I2 +sVn +I8 +sVq +I23 +sV +I5 +sVs +I15 +sVr +I5 +sVu +I9 +sVt +I11 +sVv +I6 +ssVdu +p456 +(dp457 +V! +I1 +sV +I315 +sVc +I14 +sVe +I11 +sVi +I30 +sVm +I1 +sVl +I1 +sV, +I8 +sVq +I1 +sVs +I2 +sVr +I12 +sVt +I1 +sVv +I1 +sV_ +I1 +sV? +I1 +ssVdr +p458 +(dp459 +Va +I31 +sVi +I9 +sVe +I108 +sV +I2 +sVo +I24 +ssVds +p460 +(dp461 +V +I42 +sV; +I1 +sV- +I1 +sV, +I11 +sV. +I4 +ssVd_ +p462 +(dp463 +V, +I2 +sV. +I1 +ssVd[ +p464 +(dp465 +V3 +I1 +ssVw +p466 +(dp467 +VA +I1 +sVb +I1 +sVd +I1 +sVi +I1 +sVJ +I1 +sVM +I1 +sVL +I2 +sVo +I1 +sVN +I2 +sVy +I1 +sVt +I9 +sVY +I1 +ssVw. +p468 +(dp469 +Vi +I1 +sV +I2 +sVg +I2 +ssVw, +p470 +(dp471 +V +I3 +ssV +p472 +(dp473 +Vt +I2 +ssV +p474 +(dp475 +Vt +I4 +ssV93 +p476 +(dp477 +V, +I1 +ssVw: +p478 +(dp479 +V +I1 +sV/ +I2 +ssV02 +p480 +(dp481 +V +I3 +sV* +I1 +sV] +I1 +sV, +I3 +sV/ +I1 +ssV03 +p482 +(dp483 +V +I4 +sV, +I1 +ssV00 +p484 +(dp485 +V +I13 +sV+ +I1 +sV, +I1 +sV1 +I4 +sV0 +I11 +sV3 +I2 +sV2 +I5 +sV4 +I1 +ssV01 +p486 +(dp487 +V( +I2 +sV, +I1 +sV +I4 +ssV06 +p488 +(dp489 +V. +I1 +ssV04 +p490 +(dp491 +V +I1 +ssV05 +p492 +(dp493 +V, +I1 +ssV0; +p494 +(dp495 +V +I3 +ssV09 +p496 +(dp497 +V +I1 +sV, +I1 +ssV0 +p498 +(dp499 +Va +I1 +sV +I11 +sVe +I1 +sVD +I1 +sVj +I1 +sVm +I2 +sVn +I1 +sVs +I2 +sVd +I3 +ssV0% +p500 +(dp501 +V +I1 +ssV0+ +p502 +(dp503 +V +I1 +ssV0. +p504 +(dp505 +V +I2 +sVz +I2 +sVt +I2 +ssV0, +p506 +(dp507 +V +I4 +ssVd +p508 +(dp509 +Vt +I2 +sVn +I11 +ssVwe +p510 +(dp511 +V +I12 +sVr +I3 +sVv +I1 +ssVd +p512 +(dp513 +Vs +I7 +sVr +I3 +sVl +I6 +ssVd +p514 +(dp515 +V +I15 +sVc +I23 +sVb +I9 +sVe +I14 +sVd +I4 +sVg +I10 +sVf +I12 +sVj +I21 +sVm +I18 +sVl +I17 +sVn +I1 +sVp +I15 +sVs +I31 +sVr +I6 +sVt +I29 +sVv +I10 +sV. +I1 +ssVwo +p516 +(dp517 +V +I1 +sVr +I14 +sVu +I2 +ssVwn +p518 +(dp519 +Vs +I1 +sVl +I3 +ssVwi +p520 +(dp521 +Vc +I1 +sVl +I7 +sVn +I3 +sVs +I3 +sVr +I1 +sVt +I20 +ssVwh +p522 +(dp523 +Va +I2 +sVi +I3 +sVe +I4 +sVo +I3 +ssVww +p524 +(dp525 +V: +I2 +sVw +I5 +sV. +I3 +ssVwt +p526 +(dp527 +Vo +I1 +ssVws +p528 +(dp529 +V +I2 +sVl +I3 +sV, +I1 +ssVwr +p530 +(dp531 +Vi +I2 +sVo +I2 +ssVwy +p532 +(dp533 +Ve +I1 +ssV0a +p534 +(dp535 +V. +I2 +ssVi +p536 +(dp537 +V +I16 +sVe +I2 +sVg +I2 +sV, +I2 +sV. +I2 +sVs +I1 +sVt +I7 +sV; +I2 +sV: +I1 +ssVi +p538 +(dp539 +Vc +I27 +sVr +I87 +sVm +I25 +sVg +I3 +ssVi +p540 +(dp541 +Vt +I2 +ssVC) +p542 +(dp543 +V +I1 +ssVC. +p544 +(dp545 +V +I1 +ssVC +p546 +(dp547 +Vo +I1 +sVL +I1 +sVD +I2 +sVd +I1 +ssVC' +p548 +(dp549 +V +I3 +sVe +I33 +ssVCI +p550 +(dp551 +VI +I2 +sVD +I1 +ssVCH +p552 +(dp553 +VA +I31 +sV +I2 +sVE +I2 +sVO +I2 +ssVCO +p554 +(dp555 +VB +I1 +sVN +I2 +ssVCL +p556 +(dp557 +VA +I1 +sVU +I2 +ssVCC +p558 +(dp559 +VX +I1 +sVC +I1 +ssVV +p560 +(dp561 +VE +I1 +ssVCA +p562 +(dp563 +VN +I4 +ssVCE +p564 +(dp565 +V +I3 +sVS +I1 +ssVCD +p566 +(dp567 +VI +I2 +ssVCX +p568 +(dp569 +VX +I1 +ssVCR +p570 +(dp571 +V. +I1 +ssVCU +p572 +(dp573 +VL +I1 +ssVCT +p574 +(dp575 +V +I9 +sVE +I2 +sV, +I2 +ssVCi +p576 +(dp577 +Vc +I1 +sVn +I2 +ssVCh +p578 +(dp579 +Va +I13 +sV +I1 +sVe +I2 +sVi +I4 +sVo +I1 +sVr +I1 +ssVCo +p580 +(dp581 +Vm +I28 +sVl +I4 +sV +I1 +sVn +I20 +sVp +I1 +sVr +I6 +sVu +I1 +ssVCl +p582 +(dp583 +Va +I2 +sVu +I1 +sVo +I1 +ssVV +p584 +(dp585 +Vn +I3 +ssVCa +p586 +(dp587 +Vc +I85 +sVe +I1 +sVd +I7 +sVm +I2 +sVl +I1 +sVn +I396 +sVs +I1 +sVr +I8 +sVt +I2 +sVy +I3 +ssVCe +p588 +(dp589 +V +I44 +sVc +I1 +sVl +I13 +sVn +I1 +sVp +I8 +sVs +I3 +sVr +I2 +sVu +I1 +sVt +I11 +ssVCr +p590 +(dp591 +V +I1 +sVo +I6 +ssVCu +p592 +(dp593 +Vn +I125 +ssVix +p594 +(dp595 +Va +I7 +sV +I52 +sVe +I1 +sVi +I4 +sV- +I2 +sV, +I6 +sV. +I7 +sV; +I2 +sV: +I1 +ssViz +p596 +(dp597 +Va +I7 +sVi +I4 +sVe +I2 +sVo +I1 +ssViq +p598 +(dp599 +Vu +I115 +ssVip +p600 +(dp601 +Va +I3 +sVe +I8 +sVp +I1 +sVi +I8 +sV* +I2 +sVm +I2 +sVl +I2 +sVo +I9 +sV +I1 +sVs +I1 +sVt +I3 +ssVis +p602 +(dp603 +V! +I1 +sV +I672 +sVp +I22 +sV- +I8 +sV, +I101 +sV. +I26 +sV; +I15 +sV: +I4 +sV? +I6 +sV_ +I2 +sVa +I80 +sVc +I32 +sVb +I11 +sVe +I169 +sVf +I3 +sVi +I110 +sV +I7 +sVk +I4 +sVm +I7 +sVl +I1 +sVo +I73 +sVq +I10 +sV +I23 +sVs +I170 +sVt +I89 +sVh +I4 +ssVir +p604 +(dp605 +Va +I53 +sV +I183 +sVc +I3 +sV +I1 +sVe +I329 +sVg +I3 +sV +I9 +sV +I1 +sVm +I3 +sV, +I25 +sVo +I21 +sV. +I13 +sVi +I14 +sVs +I18 +sVu +I7 +sVt +I1 +sV; +I3 +sV? +I4 +ssViu +p606 +(dp607 +Vs +I6 +sVm +I6 +ssVit +p608 +(dp609 +V! +I1 +sV +I1361 +sV- +I61 +sV, +I64 +sV. +I28 +sV; +I18 +sV: +I34 +sV +I15 +sV[ +I1 +sV_ +I1 +sVa +I59 +sV +I1 +sVe +I203 +sVi +I70 +sVh +I23 +sVl +I2 +sVo +I8 +sV +I75 +sVs +I35 +sVr +I31 +sVu +I22 +sVt +I11 +sVy +I5 +sVz +I2 +ssViv +p610 +(dp611 +Va +I41 +sV +I1 +sVe +I72 +sVi +I25 +sV +I3 +sVo +I3 +sV +I16 +sVr +I38 +ssVii +p612 +(dp613 +V, +I1 +ssVik +p614 +(dp615 +Ve +I2 +sVd +I1 +ssVij +p616 +(dp617 +Vo +I1 +ssVim +p618 +(dp619 +Va +I36 +sV +I7 +sVb +I1 +sVe +I61 +sVi +I15 +sV +I7 +sVm +I5 +sV, +I1 +sVo +I1 +sV. +I1 +sVp +I34 +sVs +I2 +sVu +I1 +ssVil +p620 +(dp621 +Va +I7 +sV +I530 +sVe +I53 +sVd +I1 +sV +I24 +sVi +I26 +sVh +I1 +sVl +I382 +sVo +I26 +sV. +I7 +sV +I1 +sVs +I134 +sVu +I2 +sVt +I3 +sV +I3 +sVy +I1 +sV; +I3 +sV: +I1 +sV, +I42 +ssVio +p622 +(dp623 +Vc +I1 +sVd +I1 +sVm +I1 +sVl +I14 +sVn +I278 +sVs +I8 +sVr +I2 +sVu +I3 +sVt +I4 +sVv +I1 +sV. +I2 +sV, +I1 +ssVin +p624 +(dp625 +V! +I5 +sV +I206 +sV" +I1 +sV- +I6 +sV, +I72 +sV. +I48 +sV; +I21 +sV: +I8 +sV? +I1 +sV +I1 +sV[ +I1 +sVa +I49 +sVc +I66 +sVe +I146 +sVd +I27 +sVg +I108 +sVf +I34 +sV +I13 +sVh +I1 +sVk +I1 +sVj +I4 +sVo +I20 +sVn +I11 +sVq +I57 +sVi +I18 +sVs +I117 +sVr +I4 +sVu +I23 +sVt +I140 +sVv +I6 +sVz +I9 +ssVia +p626 +(dp627 +V +I17 +sVc +I4 +sVb +I16 +sVd +I1 +sVg +I4 +sVi +I13 +sV- +I3 +sVm +I29 +sVl +I18 +sV, +I7 +sVs +I18 +sV: +I1 +sVt +I3 +sVh +I1 +sV; +I1 +sVn +I12 +ssV_p +p628 +(dp629 +Va +I1 +ssVic +p630 +(dp631 +Va +I28 +sV +I8 +sV) +I1 +sVe +I41 +sVi +I68 +sVh +I33 +sVk +I2 +sVl +I2 +sVo +I6 +sV. +I1 +sV +I2 +sVs +I2 +sVu +I15 +sVt +I7 +sV, +I1 +ssVib +p632 +(dp633 +Va +I1 +sVe +I11 +sVi +I6 +sVl +I64 +sVn +I2 +sV +I1 +sVr +I12 +sVu +I16 +ssVie +p634 +(dp635 +V! +I2 +sV +I121 +sV, +I50 +sV. +I27 +sV; +I10 +sV: +I2 +sV? +I5 +sV[ +I5 +sV_ +I1 +sVd +I28 +sVf +I1 +sVi +I71 +sVm +I4 +sVl +I14 +sVn +I505 +sVp +I4 +sVs +I46 +sVr +I133 +sVu +I198 +sVt +I3 +sVw +I1 +sVz +I29 +ssVid +p636 +(dp637 +Va +I6 +sV +I9 +sVe +I449 +sV +I21 +sV +I6 +sV, +I1 +sVo +I1 +sVn +I2 +sVi +I10 +sVr +I1 +sVy +I1 +ssVig +p638 +(dp639 +Va +I6 +sVe +I10 +sV +I9 +sVh +I17 +sVo +I17 +sVn +I79 +sVi +I16 +sVr +I4 +sVu +I17 +sVt +I5 +ssVif +p640 +(dp641 +V +I21 +sVe +I1 +sVf +I14 +sVi +I20 +sV, +I6 +sV. +I3 +sV +I1 +sVs +I6 +sVr +I1 +sVt +I1 +sVy +I3 +ssVV +p642 +(dp643 +Vp +I1 +sV: +I1 +sVd +I2 +ssVn: +p644 +(dp645 +V +I18 +ssVi[ +p646 +(dp647 +V1 +I2 +sV4 +I1 +ssV"A +p648 +(dp649 +VS +I1 +ssVi_ +p650 +(dp651 +V, +I1 +ssVV, +p652 +(dp653 +V +I1 +ssVV. +p654 +(dp655 +V +I7 +ssV"P +p656 +(dp657 +VR +I3 +sVr +I3 +ssV"R +p658 +(dp659 +Vi +I1 +ssV"S +p660 +(dp661 +Vm +I5 +ssVV: +p662 +(dp663 +V +I1 +ssVb +p664 +(dp665 +Vm +I4 +ssVV? +p666 +(dp667 +V +I1 +ssVi8 +p668 +(dp669 +V. +I1 +ssVi; +p670 +(dp671 +V +I14 +ssVi: +p672 +(dp673 +V +I2 +ssV" +p674 +(dp675 +Va +I2 +sVs +I5 +sVt +I2 +sVw +I1 +sVd +I1 +ssVVE +p676 +(dp677 +V +I4 +sVC +I1 +sVR +I3 +sVN +I2 +ssVi? +p678 +(dp679 +V +I11 +ssVi1 +p680 +(dp681 +V1 +I2 +sV0 +I6 +ssVVI +p682 +(dp683 +V +I1 +sVD +I1 +sVI +I20 +sV, +I3 +sV. +I3 +sV; +I1 +ssV". +p684 +(dp685 +V +I2 +ssV") +p686 +(dp687 +V. +I1 +ssVVO +p688 +(dp689 +VL +I2 +ssVVR +p690 +(dp691 +VE +I3 +ssVi- +p692 +(dp693 +Vc +I4 +sVe +I1 +sVh +I1 +sVj +I4 +sVm +I13 +sVl +I2 +ssVi, +p694 +(dp695 +V +I132 +ssVi. +p696 +(dp697 +V +I26 +sV- +I1 +ssVi! +p698 +(dp699 +V +I17 +sV_ +I2 +ssVi +p700 +(dp701 +V +I6 +sVi +I10 +sV. +I1 +sV1 +I1 +sV +I1 +sVA +I1 +sVC +I8 +sVD +I2 +sVI +I2 +sVM +I2 +sVL +I1 +sVN +I1 +sVP +I1 +sVT +I1 +sVV +I1 +sVa +I86 +sV +I19 +sVc +I43 +sVb +I23 +sVe +I51 +sVd +I166 +sVg +I11 +sVf +I50 +sV +I43 +sVh +I4 +sVj +I30 +sVm +I43 +sVl +I82 +sVo +I13 +sVn +I53 +sVq +I29 +sVp +I81 +sVs +I46 +sVr +I42 +sVu +I16 +sVt +I34 +sVv +I52 +sVy +I1 +ssVV_ +p702 +(dp703 +V; +I5 +sV, +I1 +sV. +I5 +ssVVa +p704 +(dp705 +Vl +I2 +sVn +I5 +ssVC +p706 +(dp707 +Vs +I3 +ssVVe +p708 +(dp709 +Vs +I11 +sVr +I2 +sVn +I32 +ssVVi +p710 +(dp711 +Vs +I3 +sVr +I3 +sVe +I1 +sVt +I1 +sVn +I1 +ssVVo +p712 +(dp713 +Vy +I17 +sVi +I10 +sVu +I39 +sVl +I30 +sVt +I6 +ssV5] +p714 +(dp715 +V +I2 +sV; +I1 +sV, +I1 +ssVt- +p716 +(dp717 +V +I5 +sVc +I16 +sVe +I19 +sVG +I1 +sVi +I82 +sVH +I1 +sV +I9 +sVM +I2 +sVS +I1 +sVo +I7 +sVn +I1 +sVq +I3 +sVP +I1 +sVs +I1 +sVl +I1 +ssVt* +p718 +(dp719 +V +I1 +sV* +I1 +ssV +p720 +(dp721 +V2 +I2 +sV6 +I1 +ssVH +p722 +(dp723 +Vb +I1 +sVl +I19 +ssV. +p724 +(dp725 +V +I1 +ssV59 +p726 +(dp727 +V +I2 +sV4 +I2 +sV: +I1 +sV, +I3 +sV. +I1 +ssV55 +p728 +(dp729 +V- +I1 +sV. +I1 +ssV54 +p730 +(dp731 +V1 +I1 +sV. +I1 +ssV57 +p732 +(dp733 +V: +I2 +ssV56 +p734 +(dp735 +V +I1 +sV; +I1 +sV, +I2 +ssV50 +p736 +(dp737 +V1 +I2 +sV0 +I2 +sV] +I1 +sV +I2 +ssV52 +p738 +(dp739 +V8 +I1 +sV. +I1 +ssV5- +p740 +(dp741 +V4 +I1 +ssV5, +p742 +(dp743 +V +I3 +ssV5. +p744 +(dp745 +V +I4 +ssV5) +p746 +(dp747 +V: +I1 +sV, +I1 +ssV5 +p748 +(dp749 +Vj +I1 +ssVHI +p750 +(dp751 +VS +I2 +sVN +I1 +ssVHO +p752 +(dp753 +VT +I2 +ssVHA +p754 +(dp755 +VP +I30 +sVN +I1 +sVM +I1 +sVT +I1 +sVV +I2 +ssVHE +p756 +(dp757 +V +I5 +sVR +I3 +sVZ +I1 +ssVe[ +p758 +(dp759 +Va +I1 +sV1 +I3 +sV3 +I2 +sV2 +I2 +sV5 +I1 +sV7 +I1 +sV6 +I2 +sV9 +I1 +sV8 +I1 +ssVHi +p760 +(dp761 +Vs +I5 +sVd +I2 +ssVHo +p762 +(dp763 +Vr +I4 +sVm +I3 +sVl +I5 +sVn +I2 +ssVHa +p764 +(dp765 +Vy +I1 +sVr +I7 +sVm +I1 +sVw +I1 +ssVHe +p766 +(dp767 +Vr +I1 +sVn +I6 +ssV-4 +p768 +(dp769 +V1 +I1 +ssVm" +p770 +(dp771 +V +I1 +ssVH, +p772 +(dp773 +V +I1 +ssVH +p774 +(dp775 +VD +I1 +sVO +I1 +ssV[P +p776 +(dp777 +Vr +I1 +sVo +I1 +ssV[T +p778 +(dp779 +Vh +I1 +ssV[Y +p780 +(dp781 +Ve +I1 +ssV[E +p782 +(dp783 +Vm +I2 +sVt +I1 +ssV_c +p784 +(dp785 +Vo +I1 +ssVn +p786 +(dp787 +Vq +I1 +sVs +I3 +sVr +I5 +sVg +I8 +ssVn +p788 +(dp789 +Va +I3 +sV +I52 +sVc +I9 +sVe +I48 +sVd +I1 +sVg +I126 +sVi +I1 +sVm +I3 +sV, +I4 +sV. +I2 +sVs +I24 +sVr +I12 +sV; +I1 +ssVn +p790 +(dp791 +Vt +I17 +ssVn +p792 +(dp793 +Vt +I1 +ssVn +p794 +(dp795 +Va +I21 +sVu +I2 +sVo +I7 +ssV[a +p796 +(dp797 +V] +I2 +ssVn +p798 +(dp799 +Vt +I3 +ssV' +p800 +(dp801 +Vn +I1 +ssV' +p802 +(dp803 +Vm +I5 +sVg +I4 +ssV' +p804 +(dp805 +V +I20 +ssV' +p806 +(dp807 +Vt +I38 +ssV' +p808 +(dp809 +Vc +I33 +sVd +I3 +sVg +I4 +sVm +I3 +sVl +I7 +sVn +I1 +sVq +I1 +sVp +I20 +sVt +I99 +sVv +I5 +ssV[3 +p810 +(dp811 +V] +I10 +ssV[2 +p812 +(dp813 +V] +I21 +ssV[1 +p814 +(dp815 +V1 +I2 +sV0 +I2 +sV2 +I2 +sV] +I49 +ssV[7 +p816 +(dp817 +V] +I2 +ssV[6 +p818 +(dp819 +V] +I4 +ssV[5 +p820 +(dp821 +V] +I4 +ssV[4 +p822 +(dp823 +V] +I6 +ssV[9 +p824 +(dp825 +V] +I2 +ssV[8 +p826 +(dp827 +V] +I2 +ssV[* +p828 +(dp829 +V] +I3 +ssV' +p830 +(dp831 +VP +I1 +sVd +I2 +sVg +I1 +ssVn[ +p832 +(dp833 +V1 +I2 +sV2 +I3 +ssVn_ +p834 +(dp835 +V; +I1 +sV, +I1 +ssVnh +p836 +(dp837 +Va +I1 +sVu +I1 +sVe +I8 +ssVni +p838 +(dp839 +V! +I3 +sV +I46 +sV, +I3 +sVa +I6 +sVc +I10 +sVb +I1 +sVe +I44 +sVg +I3 +sVf +I8 +sV +I2 +sV +I13 +sVm +I4 +sVl +I2 +sVo +I1 +sVn +I5 +sVq +I1 +sVs +I46 +sVr +I26 +sVu +I2 +sVt +I20 +sVv +I11 +sVz +I3 +ssVnj +p840 +(dp841 +Vu +I4 +sVo +I1 +ssVnk +p842 +(dp843 +V +I1 +sVs +I1 +ssVnl +p844 +(dp845 +Va +I1 +sVy +I5 +sVe +I6 +sVi +I1 +sVo +I3 +ssVnn +p846 +(dp847 +Va +I78 +sV +I1 +sVe +I204 +sVi +I9 +sV +I4 +sV +I13 +sVo +I17 +sV +I48 +sVs +I1 +sVu +I19 +ssVno +p848 +(dp849 +V +I5 +sVc +I11 +sVb +I8 +sVe +I1 +sVi +I17 +sVm +I33 +sVl +I17 +sVn +I40 +sVp +I14 +sVs +I33 +sVr +I14 +sVu +I206 +sVt +I59 +sVw +I8 +sVv +I4 +sVy +I5 +sVx +I2 +sV, +I1 +ssVna +p850 +(dp851 +Vn +I32 +sV +I48 +sV, +I10 +sV; +I1 +sV: +I1 +sV +I1 +sVc +I5 +sVb +I22 +sVd +I6 +sVg +I14 +sVi +I101 +sVm +I11 +sVl +I21 +sV +I2 +sV +I10 +sVp +I5 +sVs +I3 +sVr +I9 +sVu +I5 +sVt +I61 +sVv +I11 +sVy +I1 +ssVnb +p852 +(dp853 +Ve +I31 +ssVnc +p854 +(dp855 +Va +I3 +sV +I28 +sVe +I151 +sV! +I1 +sV +I8 +sVh +I21 +sVk +I11 +sVl +I17 +sVo +I82 +sV, +I6 +sVi +I25 +sVs +I5 +sVr +I3 +sVu +I3 +sVt +I3 +sV +I6 +sVy +I3 +ssVnd +p856 +(dp857 +Va +I124 +sV +I209 +sV" +I1 +sVe +I278 +sVi +I493 +sV- +I14 +sV, +I10 +sVo +I22 +sV. +I4 +sV +I8 +sVs +I35 +sVr +I101 +sVu +I54 +sV_ +I1 +sV; +I2 +sV +I1 +sV? +I1 +sVl +I1 +ssVne +p858 +(dp859 +V +I743 +sV- +I4 +sV, +I42 +sV. +I19 +sV; +I9 +sV: +I4 +sV? +I3 +sV[ +I1 +sVc +I1 +sVb +I1 +sVe +I4 +sVi +I5 +sVm +I25 +sVl +I14 +sVn +I22 +sVs +I80 +sVr +I105 +sVu +I60 +sVt +I22 +sVw +I7 +sVv +I3 +sVy +I6 +sVx +I3 +sVz +I25 +ssVnf +p860 +(dp861 +Va +I20 +sVe +I12 +sVi +I52 +sVl +I2 +sVo +I30 +sV. +I2 +sVr +I2 +sVu +I8 +ssVng +p862 +(dp863 +Va +I8 +sV +I64 +sVe +I109 +sVi +I1 +sV +I1 +sV- +I12 +sVl +I122 +sVo +I1 +sV. +I4 +sV +I18 +sVs +I4 +sVr +I3 +sVu +I30 +sVt +I28 +sV[ +I1 +sV: +I1 +sV, +I4 +ssVnx +p864 +(dp865 +V +I1 +ssVny +p866 +(dp867 +V) +I2 +sV +I17 +sVs +I1 +sVo +I1 +ssVnz +p868 +(dp869 +Va +I2 +sVi +I1 +sVe +I10 +ssVnq +p870 +(dp871 +V +I13 +sVu +I64 +ssVnr +p872 +(dp873 +V +I1 +sVa +I2 +sVe +I5 +sVi +I6 +ssVns +p874 +(dp875 +V +I690 +sVi +I91 +sV) +I1 +sV- +I17 +sV, +I68 +sV. +I27 +sV; +I8 +sV: +I1 +sV? +I1 +sV[ +I2 +sV_ +I1 +sVa +I5 +sVc +I3 +sVe +I74 +sVf +I1 +sV +I8 +sVk +I1 +sVo +I13 +sVp +I11 +sVs +I1 +sVu +I22 +sVt +I31 +sVw +I2 +sVy +I4 +ssVnt +p876 +(dp877 +V! +I11 +sV +I1213 +sV" +I1 +sV* +I1 +sV- +I12 +sV, +I115 +sV. +I53 +sV; +I32 +sV: +I8 +sV? +I2 +sV[ +I1 +sVa +I70 +sVe +I207 +sVi +I108 +sV +I4 +sVl +I2 +sVo +I14 +sV +I26 +sVs +I127 +sVr +I116 +sVu +I25 +sV +I21 +sVh +I6 +ssVnu +p878 +(dp879 +Va +I11 +sV +I18 +sVe +I21 +sVf +I1 +sVi +I12 +sV +I1 +sVm +I4 +sVl +I5 +sVo +I1 +sV. +I2 +sVq +I6 +sVs +I14 +sVt +I3 +sVy +I4 +sV; +I1 +sV, +I2 +ssVnv +p880 +(dp881 +Vi +I27 +sVa +I3 +sVe +I22 +sVu +I4 +sVo +I16 +ssV'u +p882 +(dp883 +V +I1 +sVs +I6 +sVt +I2 +sVn +I156 +ssV't +p884 +(dp885 +V +I4 +ssV's +p886 +(dp887 +V +I4 +ssV'y +p888 +(dp889 +V +I53 +ssV'e +p890 +(dp891 +Va +I5 +sVf +I7 +sVm +I30 +sVl +I32 +sVn +I120 +sVs +I162 +sVu +I8 +sVx +I23 +sV +I1 +ssV'd +p892 +(dp893 +V +I1 +ssV'a +p894 +(dp895 +V +I33 +sVc +I14 +sVb +I37 +sVd +I6 +sVg +I6 +sVi +I140 +sVm +I20 +sVl +I13 +sVn +I18 +sVp +I41 +sVs +I11 +sVr +I24 +sVu +I79 +sVt +I16 +sVv +I112 +sVy +I9 +ssV'o +p896 +(dp897 +Vb +I3 +sVe +I7 +sVf +I2 +sVn +I93 +sVp +I8 +sVs +I6 +sVr +I27 +sVu +I10 +ssV'i +p898 +(dp899 +Vc +I3 +sVd +I3 +sVg +I1 +sVm +I12 +sVl +I187 +sVn +I45 +sVr +I1 +sVv +I1 +ssV'h +p900 +(dp901 +Va +I6 +sVe +I2 +sV +I2 +sVo +I31 +sVi +I3 +sVu +I10 +sV +I10 +sVy +I1 +ssVn) +p902 +(dp903 +V, +I1 +ssV'U +p904 +(dp905 +Vr +I1 +ssV'T +p906 +(dp907 +V +I1 +ssVn, +p908 +(dp909 +V +I196 +ssVn- +p910 +(dp911 +Va +I1 +sVb +I3 +sVi +I1 +sVh +I3 +sV- +I1 +sV1 +I4 +sVt +I11 +sV8 +I1 +ssVn. +p912 +(dp913 +V +I101 +sV" +I1 +sVh +I2 +sV- +I1 +sV. +I1 +sV] +I1 +ssVn +p914 +(dp915 +V +I7 +sV" +I1 +sVp +I203 +sV( +I2 +sV1 +I24 +sV +I3 +sV3 +I1 +sV2 +I3 +sV9 +I1 +sVA +I11 +sVC +I7 +sVB +I2 +sVE +I7 +sVD +I3 +sVF +I10 +sVI +I12 +sVH +I5 +sVK +I1 +sVJ +I8 +sVM +I4 +sVO +I1 +sVN +I3 +sVP +I7 +sVS +I1 +sV +I3 +sVT +I4 +sVV +I5 +sVX +I3 +sV_ +I4 +sVa +I184 +sV +I23 +sVc +I147 +sVb +I51 +sVe +I101 +sVd +I203 +sVg +I34 +sVf +I70 +sV +I24 +sVh +I41 +sVj +I44 +sVm +I107 +sVl +I81 +sVo +I31 +sVn +I76 +sVq +I35 +sVi +I36 +sVs +I99 +sVr +I48 +sVu +I20 +sVt +I79 +sVw +I4 +sVv +I95 +sVy +I13 +ssVn! +p916 +(dp917 +V +I16 +ssVn" +p918 +(dp919 +V +I2 +ssVf +p920 +(dp921 +Vc +I2 +ssVn' +p922 +(dp923 +Va +I106 +sVe +I67 +sV +I32 +sVh +I2 +sV +I2 +sVo +I11 +sVi +I1 +sVu +I1 +sVt +I4 +sVy +I36 +ssV'E +p924 +(dp925 +Vs +I12 +sVt +I1 +sVu +I7 +sVl +I8 +sVv +I1 +ssVn; +p926 +(dp927 +V +I48 +ssV'A +p928 +(dp929 +Vr +I3 +sVd +I1 +sVf +I3 +sVc +I1 +sVm +I3 +sVL +I1 +sVN +I1 +sVs +I3 +sVn +I7 +sVt +I3 +sVv +I1 +sVz +I1 +sVl +I8 +ssVn? +p930 +(dp931 +V +I4 +sV- +I1 +ssV'O +p932 +(dp933 +VP +I2 +sVr +I1 +sVN +I1 +sVv +I1 +sVp +I2 +ssV'I +p934 +(dp935 +Vs +I1 +sVn +I2 +sVb +I3 +sVL +I1 +sVt +I2 +ssV:/ +p936 +(dp937 +V/ +I8 +ssV: +p938 +(dp939 +V +I2 +sV1 +I1 +sVA +I4 +sVC +I13 +sVE +I4 +sVF +I1 +sVI +I6 +sVH +I2 +sVJ +I7 +sVM +I12 +sVO +I3 +sVN +I4 +sVQ +I2 +sVS +I6 +sVU +I1 +sVT +I1 +sVV +I6 +sV_ +I6 +sVa +I3 +sVc +I9 +sVe +I15 +sVi +I11 +sVj +I12 +sVm +I10 +sVl +I15 +sVo +I10 +sVn +I8 +sVq +I4 +sVp +I4 +sVs +I5 +sVu +I3 +sVt +I2 +sVv +I13 +ssVHu +p940 +(dp941 +Vm +I1 +ssVf +p942 +(dp943 +Vt +I1 +ssVp +p944 +(dp945 +Va +I24 +sVe +I10 +sV +I9 +sVl +I13 +sVo +I81 +sVi +I3 +sVr +I18 +sVu +I5 +ssVf +p946 +(dp947 +Vt +I1 +ssVM +p948 +(dp949 +Vd +I3 +sVm +I2 +sVl +I10 +sVo +I1 +sVq +I1 +sVt +I1 +ssVM +p950 +(dp951 +Vn +I1 +ssVSp +p952 +(dp953 +Ve +I1 +ssVAS +p954 +(dp955 +V +I1 +sVC +I2 +sV- +I1 +ssV:M +p956 +(dp957 +Vo +I1 +ssVM +p958 +(dp959 +VI +I1 +sVE +I1 +ssVM, +p960 +(dp961 +V +I2 +ssVM. +p962 +(dp963 +VA +I1 +sV +I22 +ssVMe +p964 +(dp965 +Va +I2 +sVx +I1 +sVs +I8 +sVc +I1 +ssV.g +p966 +(dp967 +Vu +I2 +ssVMa +p968 +(dp969 +V +I9 +sVd +I7 +sVi +I32 +sVh +I2 +sVj +I1 +sVl +I3 +sVn +I1 +sVs +I6 +sVr +I123 +sVu +I1 +sVt +I1 +sV +I4 +ssVMo +p970 +(dp971 +Va +I1 +sVg +I1 +sVi +I2 +sVk +I1 +sV +I1 +sVn +I32 +sVs +I2 +sVr +I4 +ssVMi +p972 +(dp973 +Vs +I2 +sVc +I7 +sVl +I4 +sVd +I1 +ssVMu +p974 +(dp975 +Vl +I2 +ssVMy +p976 +(dp977 +Vt +I1 +ssVME +p978 +(dp979 +V +I3 +sVD +I2 +sV, +I1 +sV. +I1 +sVR +I3 +sVN +I1 +ssVMD +p980 +(dp981 +VC +I1 +ssVMA +p982 +(dp983 +VD +I1 +sVG +I3 +sVI +I2 +sVL +I2 +sVN +I2 +sVY +I1 +ssVMB +p984 +(dp985 +V +I1 +sVE +I2 +ssVMM +p986 +(dp987 +V. +I1 +ssVMO +p988 +(dp989 +VU +I1 +sVN +I1 +ssVMN +p990 +(dp991 +VI +I1 +ssVMI +p992 +(dp993 +VS +I2 +sVT +I3 +sVN +I2 +ssVMP +p994 +(dp995 +VR +I1 +sVL +I1 +ssVMS +p996 +(dp997 +V +I1 +ssVbr +p998 +(dp999 +Va +I34 +sVe +I37 +sVi +I30 +sVo +I11 +sVu +I19 +sV +I13 +ssVl +p1000 +(dp1001 +Ve +I2 +ssVm +p1002 +(dp1003 +V +I3 +sVe +I3 +ssVn +p1004 +(dp1005 +Va +I2 +sV +I7 +sVe +I15 +ssVc +p1006 +(dp1007 +Vh +I5 +ssVt +p1008 +(dp1009 +V +I14 +sVr +I58 +ssVs +p1010 +(dp1011 +Vr +I1 +ssVs +p1012 +(dp1013 +Va +I1 +sV +I30 +sVc +I2 +sVe +I14 +sVd +I2 +sVj +I3 +sVm +I10 +sV, +I6 +sV. +I1 +sVq +I8 +sVp +I9 +sVs +I11 +sVr +I16 +sVv +I1 +sVn +I6 +sV: +I1 +ssVs +p1014 +(dp1015 +Vc +I1 +sVr +I16 +sVd +I3 +ssVs; +p1016 +(dp1017 +V +I155 +ssVs: +p1018 +(dp1019 +V +I35 +ssVs? +p1020 +(dp1021 +V +I39 +sV- +I4 +ssV, +p1022 +(dp1023 +VR +I2 +sV +I19 +sV0 +I2 +sV1 +I6 +sV +I1 +sV3 +I1 +sV2 +I3 +sV9 +I10 +sV +I1 +sVA +I7 +sVC +I24 +sVE +I4 +sVD +I4 +sVG +I1 +sVF +I1 +sVI +I5 +sVH +I3 +sVK +I3 +sVJ +I3 +sVM +I12 +sVL +I5 +sVO +I4 +sVN +I11 +sVP +I7 +sVS +I4 +sVb +I17 +sVU +I1 +sVT +I4 +sVW +I3 +sVV +I4 +sV_ +I3 +sVa +I120 +sV +I47 +sVc +I133 +sV +I3 +sVe +I601 +sVd +I397 +sVg +I6 +sVf +I26 +sVi +I120 +sVh +I8 +sVj +I93 +sVm +I131 +sVl +I228 +sVo +I59 +sVn +I73 +sVq +I235 +sVp +I116 +sVs +I132 +sVr +I51 +sVu +I38 +sVt +I68 +sVw +I6 +sVv +I62 +sVy +I16 +ssVs* +p1024 +(dp1025 +V* +I1 +ssVs) +p1026 +(dp1027 +V +I1 +sV; +I1 +sV, +I1 +ssVs/ +p1028 +(dp1029 +Vb +I1 +sVg +I1 +ssVs. +p1030 +(dp1031 +V +I302 +sV- +I2 +sV] +I1 +sV. +I1 +ssVs- +p1032 +(dp1033 +VA +I13 +sV +I1 +sVc +I7 +sVe +I1 +sVd +I3 +sV +I4 +sVm +I3 +sVj +I9 +sVM +I1 +sVl +I4 +sVn +I13 +sVt +I3 +sVv +I13 +sVE +I1 +ssVs, +p1034 +(dp1035 +Vy +I1 +sV +I765 +ssVs" +p1036 +(dp1037 +V. +I1 +ssVs! +p1038 +(dp1039 +V +I45 +sV* +I1 +ssVs +p1040 +(dp1041 +V +I11 +sV +I1 +sV +I115 +sV" +I4 +sV( +I2 +sV* +I1 +sV- +I1 +sV1 +I5 +sV3 +I1 +sV2 +I1 +sV: +I1 +sV +I1 +sVA +I7 +sVC +I12 +sVB +I20 +sVE +I9 +sVD +I1 +sVF +I1 +sVI +I4 +sVH +I1 +sVJ +I5 +sVM +I4 +sVL +I2 +sVO +I7 +sVP +I14 +sVS +I3 +sVR +I7 +sVT +I4 +sVW +I1 +sVY +I1 +sVX +I11 +sV_ +I12 +sVa +I375 +sV +I97 +sVc +I294 +sVb +I120 +sVe +I236 +sVd +I770 +sVg +I70 +sVf +I147 +sVi +I93 +sVh +I69 +sVk +I1 +sVj +I75 +sVm +I224 +sVl +I448 +sVo +I76 +sVn +I153 +sVq +I224 +sVp +I375 +sVs +I294 +sVr +I145 +sVu +I116 +sVt +I153 +sVw +I12 +sVv +I122 +sVy +I35 +ssVs' +p1042 +(dp1043 +Va +I30 +sVe +I39 +sV +I35 +sV +I2 +sVo +I5 +sVi +I25 +sVy +I4 +ssVs[ +p1044 +(dp1045 +V1 +I6 +sV2 +I1 +sV5 +I1 +sV4 +I2 +ssVs_ +p1046 +(dp1047 +V +I1 +sV, +I11 +sV. +I5 +ssV?. +p1048 +(dp1049 +V. +I1 +ssV?- +p1050 +(dp1051 +V- +I9 +ssV? +p1052 +(dp1053 +V +I36 +sVC +I8 +sVB +I1 +sVE +I6 +sVD +I1 +sVI +I6 +sVJ +I8 +sVM +I5 +sVL +I2 +sVO +I3 +sVN +I1 +sVQ +I2 +sVP +I2 +sVS +I1 +sVT +I2 +sVV +I2 +sVY +I1 +sVc +I3 +sVe +I6 +sVd +I26 +sVi +I1 +sVj +I1 +sVl +I3 +sVo +I3 +sVn +I1 +sVq +I3 +sVp +I2 +sVs +I2 +sVv +I2 +sVy +I1 +ssVsy +p1054 +(dp1055 +Vs +I3 +sVl +I4 +ssV,c +p1056 +(dp1057 +Ve +I1 +ssVss +p1058 +(dp1059 +Va +I127 +sV +I45 +sVe +I286 +sVi +I149 +sV +I10 +sV, +I30 +sVo +I17 +sV. +I11 +sV +I41 +sV! +I8 +sVu +I24 +sV[ +I1 +sV: +I1 +sV; +I7 +sV? +I1 +ssVsr +p1060 +(dp1061 +Va +I3 +ssVsq +p1062 +(dp1063 +Vu +I55 +sV' +I1 +ssVsp +p1064 +(dp1065 +Va +I27 +sVe +I30 +sV +I14 +sV +I12 +sVl +I2 +sVo +I15 +sVi +I8 +sVr +I15 +sVu +I11 +sVh +I1 +ssVsw +p1066 +(dp1067 +Ve +I2 +ssVsu +p1068 +(dp1069 +Va +I4 +sV +I7 +sVc +I10 +sVb +I12 +sVe +I2 +sVg +I1 +sVf +I6 +sVi +I122 +sVj +I5 +sVm +I3 +sVl +I14 +sVp +I9 +sVs +I9 +sVr +I179 +sVy +I5 +ssVst +p1070 +(dp1071 +Va +I74 +sV +I312 +sVe +I82 +sV +I21 +sVi +I47 +sVh +I1 +sV- +I26 +sV, +I7 +sVo +I23 +sV. +I2 +sVp +I12 +sVs +I1 +sVr +I50 +sVu +I6 +sV_ +I1 +sV +I6 +sVy +I2 +sV[ +I1 +sV? +I1 +ssVsk +p1072 +(dp1073 +Va +I2 +sV +I3 +sVi +I4 +sV, +I1 +sV. +I1 +sV) +I1 +ssVsi +p1074 +(dp1075 +V +I163 +sV, +I10 +sV. +I3 +sV; +I1 +sV? +I2 +sVa +I3 +sVc +I12 +sVb +I26 +sVe +I102 +sVd +I4 +sVg +I15 +sVf +I4 +sV +I3 +sV +I17 +sVm +I7 +sVl +I6 +sVo +I53 +sVn +I50 +sVq +I15 +sVp +I4 +sVs +I10 +sVr +I32 +sVt +I75 +sVv +I1 +sVx +I27 +ssVsh +p1076 +(dp1077 +Va +I2 +sV +I2 +sVi +I3 +sVo +I4 +sV, +I1 +ssVso +p1078 +(dp1079 +V +I8 +sVc +I8 +sVe +I21 +sVf +I4 +sVi +I56 +sVm +I18 +sVl +I47 +sVn +I327 +sVp +I23 +sVr +I31 +sVu +I130 +sVt +I9 +sVy +I1 +sV. +I1 +ssVsm +p1080 +(dp1081 +Va +I5 +sVe +I6 +sVo +I4 +ssV,q +p1082 +(dp1083 +Vu +I1 +ssVsc +p1084 +(dp1085 +Va +I16 +sVe +I4 +sVi +I13 +sVh +I1 +sVl +I15 +sVo +I23 +sV +I1 +sVr +I11 +sVu +I4 +sV +I4 +ssVsb +p1086 +(dp1087 +Vi +I1 +sVo +I11 +ssVsa +p1088 +(dp1089 +V +I122 +sVc +I19 +sVb +I8 +sVd +I1 +sVg +I33 +sVi +I173 +sV- +I2 +sVm +I3 +sVl +I13 +sVn +I129 +sVs +I8 +sVr +I6 +sVu +I16 +sVt +I11 +sVv +I42 +sV; +I2 +sV. +I1 +sV, +I2 +sV_ +I1 +ssVsf +p1090 +(dp1091 +Va +I2 +sVi +I1 +sVe +I1 +ssVse +p1092 +(dp1093 +V! +I1 +sV +I326 +sV- +I3 +sV, +I51 +sV. +I34 +sV; +I15 +sV: +I4 +sV? +I3 +sV_ +I3 +sVa +I55 +sVc +I21 +sVe +I2 +sVd +I8 +sVi +I40 +sVm +I40 +sVl +I73 +sVo +I1 +sVn +I96 +sVq +I5 +sVp +I8 +sVs +I139 +sVr +I166 +sVu +I26 +sVt +I6 +sVv +I2 +sVy +I1 +sVx +I3 +sVz +I46 +ssV,y +p1094 +(dp1095 +V +I1 +ssVRu +p1096 +(dp1097 +Vp +I2 +sVs +I8 +ssVe +p1098 +(dp1099 +V +I1 +sVu +I14 +sVo +I8 +ssVRe +p1100 +(dp1101 +Va +I1 +sVf +I1 +sVm +I2 +sVl +I1 +sVp +I1 +sVv +I1 +ssVRa +p1102 +(dp1103 +Vp +I1 +sVb +I1 +sVl +I1 +sVg +I3 +sVv +I1 +ssVe +p1104 +(dp1105 +Vm +I1 +sVt +I10 +ssVRo +p1106 +(dp1107 +Vb +I3 +sVm +I5 +sVs +I2 +sVu +I4 +sVt +I1 +sVy +I1 +ssVRh +p1108 +(dp1109 +Vo +I1 +ssVRi +p1110 +(dp1111 +Vc +I2 +sVe +I3 +sVg +I2 +ssVRT +p1112 +(dp1113 +VI +I2 +sV* +I2 +ssVRU +p1114 +(dp1115 +VE +I3 +sVT +I1 +ssVRW +p1116 +(dp1117 +VI +I1 +ssVRP +p1118 +(dp1119 +VO +I1 +ssVRR +p1120 +(dp1121 +VA +I4 +ssVRS +p1122 +(dp1123 +VI +I2 +sVQ +I1 +ssVE +p1124 +(dp1125 +VS +I1 +ssVRD +p1126 +(dp1127 +VE +I1 +ssVRE +p1128 +(dp1129 +V! +I1 +sV +I32 +sVC +I1 +sVM +I1 +sV, +I2 +sV. +I1 +sVS +I3 +sVA +I2 +ssVRG +p1130 +(dp1131 +V" +I2 +sV- +I6 +ssVRA +p1132 +(dp1133 +VC +I1 +sVD +I1 +sVI +I1 +sVH +I1 +sVL +I1 +sVN +I4 +ssVRC +p1134 +(dp1135 +VH +I1 +ssVRM +p1136 +(dp1137 +VI +I1 +ssVRO +p1138 +(dp1139 +VU +I1 +sVV +I1 +sVJ +I8 +sVM +I1 +sVN +I1 +ssVRI +p1140 +(dp1141 +VC +I1 +sVB +I1 +sVE +I1 +sVM +I1 +sVN +I2 +sVS +I1 +ssVR +p1142 +(dp1143 +VA +I2 +sV +I1 +sVC +I1 +sVB +I1 +sVF +I2 +sVI +I2 +sVO +I1 +sVN +I1 +sVP +I3 +sVS +I1 +sVR +I2 +sV" +I1 +ssVR, +p1144 +(dp1145 +V +I6 +ssVR. +p1146 +(dp1147 +V +I1 +ssVR* +p1148 +(dp1149 +V: +I1 +ssVem +p1150 +(dp1151 +Va +I83 +sV +I4 +sVb +I79 +sVe +I206 +sVi +I48 +sVm +I44 +sVo +I67 +sVn +I2 +sVp +I104 +sVs +I1 +sVu +I2 +ssVel +p1152 +(dp1153 +Va +I38 +sV +I77 +sVc +I1 +sVe +I16 +sV +I1 +sVi +I15 +sVl +I357 +sVo +I16 +sV, +I8 +sVq +I88 +sV +I6 +sVs +I9 +sV! +I5 +sVu +I19 +sV. +I1 +sVy +I3 +sV; +I3 +sV: +I1 +sVp +I1 +sV[ +I2 +ssV +p1154 +(dp1155 +VA +I4 +sVC +I45 +sVB +I9 +sVE +I1 +sVD +I1 +sVH +I1 +sVM +I20 +sVL +I7 +sVN +I3 +sVP +I16 +sVS +I5 +sVR +I6 +sVU +I1 +sVT +I3 +sVV +I27 +sV_ +I3 +sVa +I2 +sVc +I49 +sVb +I6 +sVe +I11 +sVd +I31 +sVg +I9 +sVf +I10 +sVh +I1 +sVj +I2 +sVm +I38 +sVl +I133 +sVo +I1 +sVn +I4 +sVq +I23 +sVp +I38 +sVs +I37 +sVr +I6 +sVu +I38 +sVt +I41 +sVv +I17 +ssVen +p1156 +(dp1157 +V! +I9 +sV +I590 +sV- +I12 +sV, +I25 +sV. +I14 +sVh +I1 +sV; +I6 +sV: +I5 +sV? +I1 +sV +I1 +sV +I4 +sV[ +I2 +sVa +I69 +sVc +I143 +sVb +I31 +sVe +I32 +sVd +I266 +sVg +I10 +sVf +I64 +sVi +I61 +sV +I4 +sV +I4 +sVl +I5 +sVo +I13 +sVn +I42 +sVq +I1 +sV +I5 +sVs +I130 +sVr +I10 +sVu +I30 +sVt +I1178 +sVv +I36 +sVy +I1 +sVz +I2 +ssVei +p1158 +(dp1159 +Vb +I2 +sVg +I33 +sVl +I144 +sVn +I41 +sVp +I1 +sVt +I2 +sVv +I11 +sVz +I1 +ssVeh +p1160 +(dp1161 +V! +I1 +sVa +I1 +sVl +I4 +ssVej +p1162 +(dp1163 +Ve +I1 +ssVee +p1164 +(dp1165 +V! +I1 +sV +I12 +sVd +I4 +sV, +I1 +sVn +I3 +sVp +I1 +sVs +I4 +sVr +I2 +sVl +I2 +ssVed +p1166 +(dp1167 +V +I70 +sVe +I1 +sVi +I17 +sV, +I9 +sVo +I8 +sV. +I3 +sV) +I1 +sVs +I15 +sVu +I4 +sV_ +I2 +sV? +I1 +ssVeg +p1168 +(dp1169 +Vi +I5 +sVa +I30 +sVr +I2 +sVo +I2 +ssVef +p1170 +(dp1171 +Va +I1 +sV +I3 +sVe +I10 +sVf +I34 +sV- +I2 +sVo +I18 +sVs +I1 +sVr +I1 +sVu +I9 +ssVea +p1172 +(dp1173 +V +I8 +sVc +I6 +sVd +I21 +sVi +I7 +sVm +I1 +sVn +I8 +sVs +I14 +sVr +I9 +sVu +I201 +sVt +I3 +sVv +I1 +ssVec +p1174 +(dp1175 +V +I128 +sVe +I22 +sVi +I14 +sVh +I3 +sVk +I7 +sVo +I37 +sVs +I1 +sVr +I9 +sVu +I7 +sVt +I82 +sVz +I1 +ssVeb +p1176 +(dp1177 +Va +I1 +sV +I2 +sVr +I5 +sVu +I2 +sVo +I1 +ssVey +p1178 +(dp1179 +Vd +I1 +sV +I15 +sV, +I4 +sV_ +I1 +sV. +I1 +ssVex +p1180 +(dp1181 +Va +I7 +sVc +I22 +sVe +I20 +sVi +I9 +sV +I8 +sVo +I1 +sVq +I1 +sVp +I28 +sVt +I44 +sV_ +I1 +ssVez +p1182 +(dp1183 +V! +I3 +sV +I236 +sV- +I63 +sV, +I34 +sV. +I8 +sV; +I3 +ssVeu +p1184 +(dp1185 +V! +I2 +sV +I117 +sVe +I13 +sVf +I7 +sVi +I9 +sVm +I2 +sVl +I22 +sVn +I31 +sVp +I8 +sVs +I34 +sVr +I636 +sVt +I70 +sVv +I17 +sVx +I290 +sV; +I2 +sV. +I4 +sV, +I6 +sV? +I1 +ssVet +p1186 +(dp1187 +Va +I21 +sV +I1033 +sVc +I3 +sVe +I26 +sVi +I46 +sVh +I5 +sV- +I1 +sV, +I24 +sVo +I18 +sV. +I11 +sV +I10 +sVs +I22 +sVr +I12 +sVu +I5 +sVt +I187 +sV; +I4 +sV_ +I1 +sV/ +I3 +ssVew +p1188 +(dp1189 +V +I11 +sVs +I3 +sVt +I1 +ssVev +p1190 +(dp1191 +Va +I52 +sV +I1 +sVe +I54 +sV +I11 +sV +I1 +sV +I1 +sVo +I12 +sVi +I21 +sVr +I3 +sVu +I3 +ssVeq +p1192 +(dp1193 +Vu +I46 +ssVep +p1194 +(dp1195 +Va +I19 +sV +I1 +sVe +I12 +sVl +I4 +sVo +I2 +sVp +I4 +sVr +I22 +sVu +I10 +sVt +I21 +ssVes +p1196 +(dp1197 +Va +I33 +sV +I1914 +sVc +I22 +sVe +I10 +sV) +I1 +sV- +I23 +sV, +I268 +sVo +I8 +sV. +I133 +sVq +I11 +sVp +I67 +sVs +I151 +sV! +I11 +sVu +I3 +sVt +I425 +sV; +I67 +sV: +I23 +sV[ +I3 +sV_ +I10 +sV? +I9 +ssVer +p1198 +(dp1199 +V! +I4 +sV +I531 +sV* +I2 +sV- +I11 +sV, +I79 +sV/ +I1 +sV. +I62 +sV; +I26 +sV: +I7 +sV? +I3 +sV +I13 +sV] +I2 +sVa +I85 +sVc +I36 +sVb +I1 +sVe +I40 +sVd +I43 +sVg +I43 +sVf +I7 +sVi +I46 +sVm +I50 +sVl +I5 +sVo +I20 +sVn +I44 +sVp +I5 +sVs +I197 +sVr +I120 +sVt +I60 +sVw +I1 +sVv +I53 +ssVeM +p1200 +(dp1201 +Va +I1 +ssVeB +p1202 +(dp1203 +Vo +I46 +ssVe] +p1204 +(dp1205 +V +I1 +ssVe_ +p1206 +(dp1207 +V +I6 +sV, +I13 +sV. +I13 +sV[ +I1 +sV: +I1 +sV; +I2 +ssVR +p1208 +(dp1209 +VC +I1 +ssVfy +p1210 +(dp1211 +V +I2 +sV, +I1 +ssVR +p1212 +(dp1213 +VF +I1 +ssVe- +p1214 +(dp1215 +Vc +I9 +sVE +I1 +sVD +I2 +sVG +I2 +sVf +I1 +sVj +I1 +sVm +I6 +sVl +I9 +sVN +I1 +sVs +I2 +sVt +I5 +sVv +I2 +ssVe, +p1216 +(dp1217 +Vq +I1 +sV +I911 +ssVe. +p1218 +(dp1219 +V +I443 +sV- +I2 +sV. +I2 +ssVe) +p1220 +(dp1221 +V +I3 +ssVe! +p1222 +(dp1223 +V) +I1 +sV +I47 +sV- +I1 +ssVe +p1224 +(dp1225 +V +I4 +sV +I1 +sV +I4 +sV +I69 +sV" +I5 +sV$ +I1 +sV( +I2 +sV1 +I22 +sV3 +I2 +sV2 +I3 +sV5 +I1 +sV4 +I7 +sV7 +I1 +sV6 +I1 +sV: +I1 +sV? +I1 +sV +I1 +sVA +I6 +sVC +I141 +sVB +I16 +sVE +I2 +sVD +I11 +sVG +I14 +sVF +I16 +sVI +I11 +sVH +I6 +sVK +I4 +sVJ +I9 +sVM +I32 +sVL +I30 +sVN +I6 +sVP +I65 +sVS +I11 +sVR +I7 +sVU +I4 +sVT +I19 +sVW +I3 +sVV +I23 +sVX +I42 +sV_ +I18 +sVa +I240 +sV +I123 +sVc +I463 +sVb +I169 +sVe +I291 +sVd +I824 +sVg +I88 +sVf +I283 +sVi +I68 +sVh +I53 +sVk +I1 +sVj +I156 +sVm +I479 +sVl +I694 +sVo +I77 +sVn +I264 +sVq +I304 +sVp +I558 +sVs +I511 +sVr +I229 +sVu +I64 +sVt +I320 +sVw +I12 +sVv +I327 +sVy +I8 +sVz +I1 +ssVe? +p1226 +(dp1227 +V +I68 +sV- +I1 +ssVe; +p1228 +(dp1229 +V +I260 +ssVe: +p1230 +(dp1231 +V +I87 +ssV.. +p1232 +(dp1233 +V +I6 +sV- +I1 +sV. +I18 +ssVxi +p1234 +(dp1235 +Vc +I1 +sVb +I1 +sV +I4 +sVm +I3 +sVl +I1 +sVo +I4 +sVs +I2 +ssVxo +p1236 +(dp1237 +Vr +I1 +ssVxc +p1238 +(dp1239 +Ve +I15 +sV +I1 +sV +I1 +sVl +I2 +sVo +I2 +sVu +I2 +ssVxa +p1240 +(dp1241 +Vs +I1 +sVc +I2 +sVm +I2 +sV, +I1 +sVn +I8 +ssV1] +p1242 +(dp1243 +V +I31 +sV, +I8 +sV. +I5 +sV; +I4 +sV: +I1 +sV? +I2 +ssVxe +p1244 +(dp1245 +V +I2 +sVs +I4 +sVr +I9 +sVm +I9 +sV, +I1 +ssVxp +p1246 +(dp1247 +Ve +I5 +sV +I4 +sVl +I7 +sVo +I3 +sVi +I1 +sVr +I6 +sVu +I2 +ssVxq +p1248 +(dp1249 +Vu +I1 +ssVxt +p1250 +(dp1251 +Va +I2 +sV +I17 +sVe +I6 +sVo +I1 +sVs +I4 +sVr +I21 +ssVD +p1252 +(dp1253 +Vs +I3 +ssVD +p1254 +(dp1255 +Vc +I1 +ssVx[ +p1256 +(dp1257 +V1 +I1 +ssV1e +p1258 +(dp1259 +Vr +I1 +ssVx_ +p1260 +(dp1261 +V, +I2 +ssVx. +p1262 +(dp1263 +V) +I1 +sV +I27 +sVc +I2 +ssVx, +p1264 +(dp1265 +V +I40 +ssVx- +p1266 +(dp1267 +Va +I1 +sVb +I2 +sVd +I2 +sVh +I1 +sVm +I3 +sVs +I1 +sVt +I1 +ssVx +p1268 +(dp1269 +Vi +I3 +sVB +I1 +sVD +I1 +sVH +I1 +sVJ +I2 +sVP +I1 +sVa +I26 +sV +I5 +sVc +I20 +sVb +I3 +sVe +I18 +sVd +I42 +sVg +I7 +sVf +I28 +sV +I15 +sVh +I8 +sVj +I3 +sVm +I42 +sVl +I13 +sVo +I3 +sVn +I8 +sVq +I31 +sVp +I27 +sVs +I14 +sVr +I10 +sVu +I3 +sVt +I7 +sVv +I15 +sVy +I1 +ssVx! +p1270 +(dp1271 +V +I1 +ssVx: +p1272 +(dp1273 +V +I2 +ssVx; +p1274 +(dp1275 +V +I15 +ssVx? +p1276 +(dp1277 +V +I1 +ssV11 +p1278 +(dp1279 +V +I1 +sV/ +I1 +sV. +I2 +sV3 +I1 +sV; +I1 +sV] +I2 +ssV10 +p1280 +(dp1281 +Va +I2 +sV +I4 +sV. +I4 +sV0 +I4 +sV9 +I1 +sV] +I2 +ssV13 +p1282 +(dp1283 +V +I1 +ssV12 +p1284 +(dp1285 +V. +I1 +sV4 +I1 +sV6 +I1 +sV; +I1 +sV] +I2 +sV_ +I1 +ssV15 +p1286 +(dp1287 +V +I1 +sV) +I1 +sV, +I1 +sV. +I1 +sV0 +I1 +sV2 +I1 +sV4 +I2 +sV9 +I2 +ssV14 +p1288 +(dp1289 +V +I2 +sV- +I1 +sV7 +I1 +ssV17 +p1290 +(dp1291 +V1 +I2 +sV0 +I2 +sV3 +I8 +sV5 +I14 +sV7 +I2 +sV6 +I20 +sV9 +I1 +sV8 +I3 +ssV16 +p1292 +(dp1293 +V9 +I1 +sV +I1 +sV1 +I2 +sV4 +I1 +sV7 +I1 +ssV19 +p1294 +(dp1295 +V9 +I5 +sV7 +I3 +ssV18 +p1296 +(dp1297 +V1 +I1 +sV0 +I2 +sV2 +I3 +sV, +I1 +sV +I1 +ssV1; +p1298 +(dp1299 +V +I2 +ssV1 +p1300 +(dp1301 +VO +I1 +sV +I1 +sVb +I1 +sVf +I1 +sVJ +I2 +sVo +I1 +sVN +I1 +sVs +I1 +sVT +I1 +ssV1( +p1302 +(dp1303 +Vc +I2 +ssV1* +p1304 +(dp1305 +V* +I1 +ssV1- +p1306 +(dp1307 +V2 +I1 +ssV1, +p1308 +(dp1309 +V +I5 +ssV1/ +p1310 +(dp1311 +V0 +I1 +ssV1. +p1312 +(dp1313 +V +I2 +sVt +I2 +ssVDO +p1314 +(dp1315 +VC +I2 +sVM +I2 +sVT +I1 +sVN +I1 +ssVx +p1316 +(dp1317 +Vc +I8 +ssVDI +p1318 +(dp1319 +VC +I2 +sVE +I1 +sVD +I4 +sVN +I2 +sVS +I2 +sVR +I1 +sVU +I1 +sVT +I3 +ssVDD +p1320 +(dp1321 +VI +I1 +ssVDE +p1322 +(dp1323 +V +I10 +sVD +I1 +sVM +I1 +sV, +I2 +sVN +I2 +sVR +I2 +sVT +I1 +sV. +I1 +ssVDC +p1324 +(dp1325 +VC +I1 +ssVDA +p1326 +(dp1327 +VM +I3 +sVN +I1 +ssVDU +p1328 +(dp1329 +VI +I1 +sV +I2 +ssVDo +p1330 +(dp1331 +V +I1 +sVr +I3 +sVm +I2 +sVn +I4 +ssVDi +p1332 +(dp1333 +Va +I1 +sVs +I2 +sVe +I26 +sVd +I1 +sVo +I1 +ssVDe +p1334 +(dp1335 +V +I11 +sVc +I6 +sVf +I4 +sVm +I1 +sVl +I1 +sVn +I1 +sVs +I5 +sVu +I2 +ssVDa +p1336 +(dp1337 +Vk +I1 +sVr +I2 +sVm +I4 +sVt +I1 +sVn +I10 +ssVD, +p1338 +(dp1339 +V +I2 +ssVD* +p1340 +(dp1341 +V +I1 +ssVD' +p1342 +(dp1343 +VA +I1 +sVa +I1 +sVu +I1 +ssVD +p1344 +(dp1345 +VM +I1 +sVT +I5 +sVW +I1 +ssVWE +p1346 +(dp1347 +VR +I1 +ssVWA +p1348 +(dp1349 +VR +I4 +sVN +I1 +ssVWI +p1350 +(dp1351 +VS +I1 +ssVWH +p1352 +(dp1353 +VA +I1 +ssVWe +p1354 +(dp1355 +V +I10 +sVs +I2 +sVr +I1 +sVb +I2 +sVl +I1 +ssVWa +p1356 +(dp1357 +Vs +I1 +ssVWo +p1358 +(dp1359 +Vr +I1 +ssVWi +p1360 +(dp1361 +Vs +I1 +sVr +I1 +ssVWh +p1362 +(dp1363 +Vi +I1 +sVy +I1 +ssVWy +p1364 +(dp1365 +Vo +I1 +ssVP +p1366 +(dp1367 +VE +I1 +ssVj +p1368 +(dp1369 +Vs +I33 +ssVj +p1370 +(dp1371 +V +I17 +ssVF +p1372 +(dp1373 +VA +I1 +ssV$2 +p1374 +(dp1375 +V +I1 +ssVp +p1376 +(dp1377 +Vi +I1 +ssV.o +p1378 +(dp1379 +Vr +I2 +ssVt +p1380 +(dp1381 +Vo +I1 +ssVl +p1382 +(dp1383 +V +I1 +sVi +I1 +sVa +I1 +ssVn +p1384 +(dp1385 +V +I2 +ssVPM +p1386 +(dp1387 +VB +I1 +ssVd +p1388 +(dp1389 +Vi +I1 +sVe +I1 +sVo +I5 +ssVg +p1390 +(dp1391 +Vy +I1 +sVl +I2 +ssV.c +p1392 +(dp1393 +Vo +I2 +ssVus +p1394 +(dp1395 +V! +I1 +sV +I842 +sVp +I3 +sV- +I9 +sV, +I51 +sV. +I14 +sV; +I6 +sV: +I2 +sV? +I14 +sV[ +I1 +sV_ +I1 +sVa +I17 +sVc +I2 +sVe +I78 +sV +I6 +sV +I1 +sVl +I1 +sVo +I1 +sVq +I26 +sVi +I34 +sVs +I90 +sVu +I4 +sVt +I36 +ssVj' +p1396 +(dp1397 +Va +I81 +sVe +I9 +sVi +I2 +sVo +I1 +sV +I14 +sVy +I6 +ssV#6 +p1398 +(dp1399 +V +I1 +ssV#4 +p1400 +(dp1401 +V6 +I1 +ssV.z +p1402 +(dp1403 +Vi +I2 +ssVju +p1404 +(dp1405 +Vi +I2 +sVp +I1 +sVs +I42 +sVr +I8 +sVg +I16 +ssVjo +p1406 +(dp1407 +Va +I1 +sVi +I9 +sVs +I2 +sVu +I137 +sVl +I10 +ssVje +p1408 +(dp1409 +V +I287 +sVc +I34 +sV, +I1 +sV. +I1 +sVs +I15 +sVu +I30 +sVt +I32 +sV? +I3 +ssVja +p1410 +(dp1411 +Vc +I1 +sVm +I56 +sVl +I4 +sVn +I6 +sVr +I11 +sVu +I2 +ssVua +p1412 +(dp1413 +V +I26 +sV: +I2 +sVd +I4 +sVg +I1 +sVi +I38 +sV- +I1 +sVl +I4 +sVn +I77 +sVq +I1 +sV. +I1 +sVr +I28 +sVu +I1 +sVt +I32 +sVz +I1 +sVb +I1 +sV, +I2 +ssV6 +p1414 +(dp1415 +Vi +I1 +sVa +I1 +sV; +I1 +sVm +I1 +sVn +I1 +ssV6, +p1416 +(dp1417 +V +I8 +ssV6. +p1418 +(dp1419 +V) +I1 +sV +I4 +ssV60 +p1420 +(dp1421 +V0 +I1 +sV +I1 +sV. +I1 +ssV61 +p1422 +(dp1423 +V0 +I2 +sV; +I1 +sV, +I3 +sV. +I2 +ssV62 +p1424 +(dp1425 +V2 +I2 +sV. +I1 +ssV63 +p1426 +(dp1427 +V. +I2 +ssV64 +p1428 +(dp1429 +V4 +I1 +sV- +I2 +sV, +I1 +sV. +I1 +ssV65 +p1430 +(dp1431 +V0 +I1 +sV5 +I1 +ssV66 +p1432 +(dp1433 +V; +I1 +sV, +I3 +ssV67 +p1434 +(dp1435 +V; +I1 +sV2 +I1 +ssV68 +p1436 +(dp1437 +V, +I2 +ssV69 +p1438 +(dp1439 +V, +I1 +sV6 +I1 +ssV6; +p1440 +(dp1441 +V +I2 +ssV +p1442 +(dp1443 +Vc +I1 +ssV_l +p1444 +(dp1445 +Vi +I1 +sVa +I1 +sVe +I2 +sV' +I2 +ssVr +p1446 +(dp1447 +Vc +I13 +sVt +I1 +sVn +I1 +ssV +p1448 +(dp1449 +V( +I1 +ssVo +p1450 +(dp1451 +Vn +I4 +ssVm +p1452 +(dp1453 +Va +I1 +sVb +I1 +ssVf +p1454 +(dp1455 +V +I1 +ssVe +p1456 +(dp1457 +V; +I1 +ssVa +p1458 +(dp1459 +Vr +I2 +sVd +I1 +ssV_a +p1460 +(dp1461 +Vu +I1 +sVl +I1 +ssVv +p1462 +(dp1463 +Ve +I1 +ssVs +p1464 +(dp1465 +V +I1 +sVs +I1 +sVe +I2 +ssV6] +p1466 +(dp1467 +V +I3 +sV; +I1 +ssVq +p1468 +(dp1469 +Vu +I1 +ssV' +p1470 +(dp1471 +VI +I1 +sVL +I1 +ssVI; +p1472 +(dp1473 +V +I1 +ssVI: +p1474 +(dp1475 +V +I1 +ssVI- +p1476 +(dp1477 +V1 +I1 +ssVI, +p1478 +(dp1479 +V +I32 +ssVI. +p1480 +(dp1481 +V +I18 +ssVI +p1482 +(dp1483 +Va +I1 +sVf +I2 +sVd +I12 +sVn +I1 +ssV? +p1484 +(dp1485 +V +I2 +ssVIX +p1486 +(dp1487 +V +I1 +sV. +I4 +ssVI[ +p1488 +(dp1489 +V1 +I2 +ssVI_ +p1490 +(dp1491 +V +I1 +ssVIS +p1492 +(dp1493 +V +I3 +sVC +I1 +sV" +I1 +sVE +I1 +sVM +I2 +sV, +I1 +sVO +I1 +sVS +I1 +sVT +I1 +ssVIR +p1494 +(dp1495 +VM +I1 +sVE +I4 +sV, +I1 +ssVIU +p1496 +(dp1497 +VM +I1 +ssVIT +p1498 +(dp1499 +V +I2 +sVE +I3 +sVI +I4 +sVH +I1 +sVN +I1 +sVR +I30 +sVY +I4 +ssVIV +p1500 +(dp1501 +V +I2 +sVE +I2 +sV. +I3 +sV_ +I2 +sV: +I1 +sV? +I1 +ssVII +p1502 +(dp1503 +V +I16 +sVI +I22 +sV, +I18 +sV. +I10 +sV[ +I2 +sV_ +I1 +ssVIM +p1504 +(dp1505 +VI +I5 +sVP +I2 +sVE +I2 +ssVIL +p1506 +(dp1507 +VI +I3 +sV +I1 +sVS +I1 +ssVIO +p1508 +(dp1509 +VN +I6 +ssVIN +p1510 +(dp1511 +V +I6 +sVC +I3 +sVD +I4 +sVG +I3 +sVT +I2 +ssVIA +p1512 +(dp1513 +VB +I1 +sVL +I1 +ssVIC +p1514 +(dp1515 +V +I4 +sVU +I1 +sVE +I1 +sVT +I1 +ssVIB +p1516 +(dp1517 +VI +I1 +sVR +I1 +sVU +I1 +ssVIE +p1518 +(dp1519 +V +I1 +sVS +I3 +sVD +I1 +sVN +I1 +ssVID +p1520 +(dp1521 +VE +I5 +sVO +I1 +ssVIG +p1522 +(dp1523 +VE +I1 +ssVIF +p1524 +(dp1525 +V +I3 +ssV +p1526 +(dp1527 +Vt +I1 +ssVIs +p1528 +(dp1529 +Vs +I9 +sVr +I3 +sVm +I2 +sVl +I1 +ssVIr +p1530 +(dp1531 +Va +I1 +ssVIt +p1532 +(dp1533 +Va +I11 +sV +I1 +ssVIv +p1534 +(dp1535 +Va +I5 +ssVIm +p1536 +(dp1537 +Va +I1 +ssVIl +p1538 +(dp1539 +V +I129 +sVs +I15 +sVl +I1 +ssVIo +p1540 +(dp1541 +Vw +I1 +ssVIn +p1542 +(dp1543 +Vc +I1 +sVt +I3 +sVd +I3 +sV +I1 +sVf +I2 +ssVIc +p1544 +(dp1545 +Vi +I1 +ssVIb +p1546 +(dp1547 +Va +I3 +ssVIe +p1548 +(dp1549 +Vr +I4 +ssVId +p1550 +(dp1551 +Ve +I2 +ssVIg +p1552 +(dp1553 +Vn +I1 +ssVIf +p1554 +(dp1555 +V +I11 +ssV(~ +p1556 +(dp1557 +V) +I1 +ssV(s +p1558 +(dp1559 +Vu +I1 +ssV(p +p1560 +(dp1561 +Va +I1 +ssVv +p1562 +(dp1563 +Vm +I2 +sVt +I1 +ssV(t +p1564 +(dp1565 +Vh +I1 +ssVA, +p1566 +(dp1567 +V +I1 +ssV(i +p1568 +(dp1569 +Vf +I2 +sVn +I2 +ssV(o +p1570 +(dp1571 +Vr +I3 +sVu +I1 +sVn +I1 +ssV(c +p1572 +(dp1573 +V) +I2 +ssV(a +p1574 +(dp1575 +Vs +I1 +sVn +I2 +ssV(f +p1576 +(dp1577 +Vr +I1 +ssV(d +p1578 +(dp1579 +V +I1 +ssV2O +p1580 +(dp1581 +V. +I1 +ssV(_ +p1582 +(dp1583 +V) +I1 +sVM +I1 +ssV(V +p1584 +(dp1585 +Vo +I1 +ssV(T +p1586 +(dp1587 +Vh +I1 +ssV(J +p1588 +(dp1589 +Ve +I1 +ssVv +p1590 +(dp1591 +Vr +I10 +ssVTM +p1592 +(dp1593 +V +I1 +ssV(N +p1594 +(dp1595 +Vo +I1 +ssV(C +p1596 +(dp1597 +V) +I1 +ssVca +p1598 +(dp1599 +Vc +I7 +sVb +I23 +sVd +I12 +sVf +I3 +sVi +I11 +sVm +I91 +sVl +I16 +sV. +I2 +sVp +I29 +sVs +I15 +sVr +I82 +sVu +I16 +sVt +I17 +sVv +I1 +sVy +I3 +sVn +I49 +ssVt +p1600 +(dp1601 +Va +I2 +sV +I6 +sVe +I67 +sVi +I1 +sV +I1 +sV, +I1 +sV. +I2 +sVr +I105 +sVu +I3 +ssV(3 +p1602 +(dp1603 +V) +I2 +ssVv +p1604 +(dp1605 +Ve +I4 +ssVl +p1606 +(dp1607 +Va +I1 +sV +I1 +sVe +I3 +ssVm +p1608 +(dp1609 +Ve +I79 +ssV(# +p1610 +(dp1611 +V6 +I1 +ssVc +p1612 +(dp1613 +Vh +I9 +ssVo +p1614 +(dp1615 +Vq +I1 +sVa +I3 +sVs +I2 +sVm +I1 +sVo +I1 +ssVo +p1616 +(dp1617 +Vm +I1 +sVt +I2 +ssVo +p1618 +(dp1619 +Vs +I1 +ssVo +p1620 +(dp1621 +Vt +I3 +ssVo +p1622 +(dp1623 +Vt +I31 +ssVo +p1624 +(dp1625 +V +I48 +sV, +I1 +ssVd" +p1626 +(dp1627 +V +I1 +ssVo. +p1628 +(dp1629 +V +I19 +sVo +I2 +sVn +I1 +ssVo- +p1630 +(dp1631 +Vc +I1 +sVt +I1 +sVd +I7 +ssVo, +p1632 +(dp1633 +V +I43 +ssVo! +p1634 +(dp1635 +V +I1 +ssVo +p1636 +(dp1637 +V" +I1 +sVi +I2 +sVG +I1 +sVP +I1 +sVT +I3 +sVa +I14 +sV +I2 +sVc +I8 +sVe +I6 +sVd +I12 +sVg +I3 +sVf +I3 +sV +I2 +sVh +I2 +sVk +I1 +sVm +I5 +sVl +I5 +sVo +I5 +sVn +I9 +sVq +I1 +sVp +I9 +sVs +I7 +sVr +I2 +sVu +I1 +sVt +I17 +sVw +I4 +sVv +I1 +sVy +I3 +ssVo; +p1638 +(dp1639 +V +I9 +ssVo: +p1640 +(dp1641 +V +I4 +ssVo_ +p1642 +(dp1643 +V; +I1 +sV, +I1 +ssV; +p1644 +(dp1645 +V +I1 +sVA +I1 +sVC +I9 +sVD +I3 +sVJ +I1 +sVO +I2 +sVP +I2 +sV_ +I1 +sVa +I10 +sV +I1 +sVc +I66 +sVe +I114 +sVd +I16 +sVf +I1 +sVi +I103 +sVh +I1 +sVj +I81 +sVm +I78 +sVl +I61 +sVo +I22 +sVn +I14 +sVq +I14 +sVp +I6 +sVs +I16 +sVr +I2 +sVu +I7 +sVt +I14 +sVv +I16 +sVy +I1 +ssVo[ +p1646 +(dp1647 +V1 +I2 +ssVoo +p1648 +(dp1649 +Vs +I2 +sVk +I50 +sVd +I1 +sVf +I2 +ssVon +p1650 +(dp1651 +V! +I2 +sV +I749 +sV" +I1 +sV' +I3 +sV- +I3 +sV, +I90 +sV. +I40 +sV; +I19 +sV: +I5 +sV? +I3 +sVg +I47 +sV[ +I1 +sV_ +I1 +sVa +I36 +sVc +I68 +sVe +I20 +sVd +I288 +sV +I8 +sVf +I12 +sVi +I22 +sVh +I8 +sVj +I1 +sVl +I6 +sVo +I11 +sVn +I307 +sVq +I2 +sVs +I381 +sVu +I1 +sVt +I326 +sVv +I29 +sVz +I2 +ssVom +p1652 +(dp1653 +Va +I10 +sV +I18 +sVb +I47 +sVe +I72 +sVi +I16 +sV +I2 +sV +I3 +sVm +I323 +sVo +I2 +sV. +I3 +sVp +I62 +sVs +I2 +sVt +I2 +sVn +I1 +sV> +I1 +ssVol +p1654 +(dp1655 +Va +I19 +sV +I6 +sVc +I1 +sV +I1 +sVe +I45 +sVd +I15 +sVi +I55 +sV +I3 +sVl +I28 +sVo +I26 +sV, +I5 +sV +I18 +sVs +I4 +sVu +I22 +sVt +I31 +sV. +I2 +sV; +I1 +sV: +I1 +ssVok +p1656 +(dp1657 +Va +I1 +sV +I19 +sV) +I1 +sV, +I6 +sV. +I2 +sV0 +I3 +sVs +I19 +ssVoj +p1658 +(dp1659 +Ve +I32 +ssVoi +p1660 +(dp1661 +V! +I14 +sV +I100 +sVc +I6 +sV: +I2 +sVe +I21 +sVd +I7 +sVg +I11 +sV- +I6 +sVl +I34 +sVn +I123 +sVq +I15 +sVs +I250 +sVr +I165 +sVt +I75 +sVv +I2 +sVx +I16 +sV; +I5 +sV. +I6 +sV, +I37 +sV? +I2 +ssVoh +p1662 +(dp1663 +V! +I2 +sVi +I1 +ssVog +p1664 +(dp1665 +Ve +I5 +sVi +I13 +sVl +I4 +sVo +I2 +sVn +I4 +sV +I2 +sVr +I4 +sVu +I4 +ssVof +p1666 +(dp1667 +Va +I1 +sV +I66 +sVe +I3 +sVf +I23 +sV +I3 +sV, +I1 +sVo +I7 +sVl +I10 +sVi +I6 +sVr +I2 +sVt +I5 +sV. +I1 +ssVoe +p1668 +(dp1669 +Vi +I6 +sVs +I2 +sVu +I57 +ssVod +p1670 +(dp1671 +Va +I4 +sV +I3 +sVe +I13 +sVi +I14 +sVo +I4 +sV +I4 +sVs +I1 +sVu +I18 +sV; +I1 +ssVoc +p1672 +(dp1673 +Va +I3 +sV +I3 +sVc +I10 +sVe +I14 +sVi +I12 +sVh +I42 +sVk +I1 +sVo +I22 +sV +I5 +sVs +I1 +sV! +I1 +sVu +I19 +sVt +I15 +sV +I3 +sVr +I2 +ssVob +p1674 +(dp1675 +Va +I5 +sVe +I15 +sV +I3 +sVj +I3 +sVl +I16 +sVo +I4 +sVi +I1 +sVs +I7 +sVr +I2 +sVu +I1 +sVt +I3 +sVv +I1 +ssVoa +p1676 +(dp1677 +Vc +I2 +sVb +I1 +sVd +I3 +sVi +I1 +sVm +I1 +sVl +I1 +sVn +I1 +ssVoy +p1678 +(dp1679 +V +I8 +sVa +I83 +sV +I1 +sVe +I63 +sVo +I1 +ssVox +p1680 +(dp1681 +Ve +I2 +sV. +I2 +ssVow +p1682 +(dp1683 +Va +I1 +sV +I14 +sV: +I1 +sVe +I1 +sVi +I3 +sV, +I3 +sV. +I1 +sVs +I1 +sVn +I4 +ssVov +p1684 +(dp1685 +Vi +I29 +sVe +I16 +ssVou +p1686 +(dp1687 +V! +I1 +sV +I105 +sVp +I113 +sV, +I4 +sV. +I2 +sVh +I3 +sV; +I1 +sV: +I1 +sVa +I23 +sVc +I32 +sVb +I14 +sVe +I37 +sVd +I22 +sVg +I18 +sVf +I11 +sV +I9 +sV +I1 +sVj +I49 +sVm +I1 +sVl +I72 +sV +I2 +sVn +I16 +sVq +I3 +sVi +I36 +sVs +I709 +sVr +I573 +sVt +I372 +sVv +I234 +sVx +I18 +sVz +I13 +ssVot +p1688 +(dp1689 +Va +I6 +sV +I28 +sVe +I21 +sVi +I5 +sVh +I28 +sV* +I1 +sV, +I7 +sV. +I4 +sVs +I17 +sVr +I77 +sVt +I16 +sV: +I1 +ssVos +p1690 +(dp1691 +Va +I14 +sV +I62 +sVc +I2 +sVe +I52 +sVp +I1 +sVi +I12 +sV- +I13 +sVm +I1 +sV, +I12 +sVo +I23 +sV. +I4 +sVq +I1 +sV +I5 +sVs +I134 +sVt +I22 +sV; +I1 +ssVor +p1692 +(dp1693 +V +I6 +sV +I81 +sV, +I8 +sV; +I1 +sV: +I2 +sV +I4 +sVa +I52 +sVc +I16 +sVb +I2 +sVe +I75 +sVd +I83 +sVg +I22 +sVf +I2 +sVi +I17 +sVk +I10 +sVm +I45 +sVl +I3 +sVo +I1 +sVn +I13 +sVq +I1 +sVp +I11 +sVs +I39 +sVr +I32 +sVt +I214 +sVw +I1 +sVy +I1 +sVz +I1 +ssVoq +p1694 +(dp1695 +Vu +I16 +ssVop +p1696 +(dp1697 +V +I8 +sVe +I16 +sVi +I3 +sV +I9 +sVh +I26 +sVl +I17 +sVo +I18 +sVp +I5 +sVr +I7 +sVu +I1 +sVt +I4 +sVy +I15 +ssVNi +p1698 +(dp1699 +V +I1 +sVc +I1 +ssVa +p1700 +(dp1701 +Va +I3 +sVo +I1 +ssVNo +p1702 +(dp1703 +Vi +I1 +sVn +I4 +sVs +I2 +sVr +I6 +sVu +I20 +sVt +I3 +sVv +I4 +ssVa +p1704 +(dp1705 +Vl +I2 +ssVNa +p1706 +(dp1707 +Vp +I3 +sVt +I2 +sVd +I1 +ssVa +p1708 +(dp1709 +Vl +I2 +ssVNe +p1710 +(dp1711 +V +I4 +sVb +I1 +sVw +I7 +sVv +I1 +ssVa +p1712 +(dp1713 +Vf +I1 +sV +I1 +sVm +I1 +sVo +I3 +sVs +I2 +sVv +I1 +ssVa +p1714 +(dp1715 +Vc +I5 +sVt +I68 +sVn +I13 +ssVNu +p1716 +(dp1717 +Vm +I2 +ssVNI +p1718 +(dp1719 +VT +I2 +ssVNO +p1720 +(dp1721 +V +I2 +sVT +I4 +ssVNB +p1722 +(dp1723 +VE +I8 +ssVNC +p1724 +(dp1725 +VI +I1 +sVE +I1 +sVL +I2 +ssVND +p1726 +(dp1727 +VI +I4 +sV +I3 +sV* +I1 +sVE +I4 +sV, +I1 +ssVNE +p1728 +(dp1729 +VY +I1 +sVS +I1 +sVG +I1 +ssVNG +p1730 +(dp1731 +V +I3 +ssVNY +p1732 +(dp1733 +V +I2 +sVT +I1 +ssVNS +p1734 +(dp1735 +V +I6 +sVE +I1 +sV. +I1 +ssVNT +p1736 +(dp1737 +V! +I2 +sVA +I2 +sVI +I3 +sV* +I1 +sVS +I1 +sVR +I1 +sVY +I2 +ssVNU +p1738 +(dp1739 +VM +I2 +ssVN, +p1740 +(dp1741 +V +I3 +ssVN +p1742 +(dp1743 +VA +I1 +sVb +I1 +sVE +I2 +sVD +I3 +sVF +I1 +sVI +I2 +sVU +I1 +sV[ +I1 +ssVN' +p1744 +(dp1745 +Va +I2 +sV +I1 +sVe +I1 +sVT +I1 +ssV'_ +p1746 +(dp1747 +V +I1 +sVH +I2 +ssVaa +p1748 +(dp1749 +Vs +I1 +sV, +I3 +ssVN +p1750 +(dp1751 +Vr +I1 +ssVac +p1752 +(dp1753 +Va +I94 +sV +I3 +sVc +I40 +sV: +I1 +sVe +I29 +sV +I4 +sVh +I64 +sVl +I10 +sVo +I7 +sV, +I2 +sVq +I11 +sVi +I6 +sVs +I1 +sVr +I10 +sVu +I21 +sVt +I30 +sV; +I1 +sV. +I1 +ssVab +p1754 +(dp1755 +Va +I33 +sVb +I28 +sVe +I2 +sVi +I35 +sVh +I1 +sVj +I1 +sVl +I135 +sVo +I39 +sV +I4 +sVs +I9 +sVr +I2 +sVu +I1 +sVy +I2 +sV, +I1 +ssVae +p1756 +(dp1757 +Va +I1 +sV +I1 +sVr +I1 +sVl +I8 +ssVad +p1758 +(dp1759 +Va +I29 +sV +I8 +sVe +I89 +sVd +I9 +sVi +I26 +sVj +I1 +sVm +I12 +sV, +I2 +sVo +I27 +sV +I5 +sVr +I12 +sVu +I2 +sVv +I6 +sVy +I2 +ssVag +p1760 +(dp1761 +Va +I9 +sVe +I180 +sVi +I15 +sV +I1 +sVo +I5 +sVn +I70 +sV +I15 +sVr +I15 +sVu +I16 +ssVaf +p1762 +(dp1763 +Vi +I2 +sV +I3 +sVr +I2 +sVt +I2 +sVf +I20 +ssVai +p1764 +(dp1765 +V! +I1 +sV +I175 +sVb +I10 +sVe +I198 +sVd +I21 +sVg +I14 +sVi +I1 +sV- +I4 +sVm +I44 +sVl +I71 +sVn +I184 +sVs +I600 +sVr +I187 +sVt +I870 +sVx +I3 +sV[ +I1 +sV. +I3 +sV, +I14 +sV? +I1 +ssVah +p1766 +(dp1767 +Va +I1 +sV +I1 +sVe +I1 +sVi +I1 +sVm +I1 +sV, +I1 +sVo +I2 +sV! +I1 +ssVak +p1768 +(dp1769 +V +I1 +sVe +I5 +sVo +I1 +ssVaj +p1770 +(dp1771 +Ve +I15 +sVo +I4 +ssVam +p1772 +(dp1773 +Va +I99 +sV +I5 +sVb +I106 +sVe +I62 +sV +I1 +sV) +I1 +sVi +I47 +sV +I6 +sVm +I7 +sV, +I5 +sVo +I17 +sVn +I3 +sVp +I21 +sVu +I3 +sV. +I2 +sV: +I1 +sV_ +I1 +ssVal +p1774 +(dp1775 +V! +I1 +sV +I95 +sVp +I4 +sV- +I1 +sV, +I16 +sV. +I6 +sV; +I5 +sV? +I3 +sV_ +I1 +sVa +I28 +sVc +I4 +sVe +I66 +sVd +I1 +sVg +I2 +sVf +I2 +sV +I5 +sVh +I23 +sVm +I3 +sVl +I120 +sVo +I33 +sVi +I39 +sVs +I5 +sVr +I2 +sVu +I8 +sVt +I15 +sVw +I1 +sV +I18 +sVy +I1 +ssVao +p1776 +(dp1777 +V +I2 +sVr +I4 +sVs +I1 +sVn +I2 +ssVan +p1778 +(dp1779 +V +I34 +sV' +I1 +sV) +I1 +sV- +I3 +sV, +I8 +sV. +I2 +sV; +I1 +sV +I17 +sV[ +I1 +sV_ +I1 +sVa +I31 +sVc +I92 +sVe +I2 +sVd +I737 +sVg +I235 +sVi +I31 +sVk +I1 +sVo +I16 +sVn +I33 +sVq +I17 +sV +I7 +sVs +I442 +sVu +I6 +sVt +I521 +sVv +I1 +sVy +I20 +ssVaq +p1780 +(dp1781 +Vu +I40 +ssVap +p1782 +(dp1783 +Va +I4 +sV +I5 +sVe +I31 +sV +I3 +sVi +I51 +sVh +I7 +sVl +I3 +sVo +I7 +sV. +I1 +sVp +I104 +sVr +I45 +sVt +I14 +ssVas +p1784 +(dp1785 +V! +I18 +sV +I244 +sVc +I4 +sVe +I21 +sVi +I6 +sV +I1 +sVh +I1 +sVk +I4 +sV, +I34 +sV. +I12 +sVp +I3 +sVs +I197 +sVu +I1 +sVa +I7 +sV[ +I1 +sV; +I4 +sV? +I1 +sVt +I25 +ssVar +p1786 +(dp1787 +V +I177 +sV' +I1 +sVp +I3 +sV- +I3 +sV, +I10 +sV; +I1 +sVg +I33 +sVa +I64 +sVc +I56 +sVb +I15 +sVe +I115 +sVd +I99 +sV +I4 +sVf +I6 +sVi +I40 +sV +I2 +sVk +I6 +sVm +I49 +sVl +I65 +sVo +I85 +sVn +I14 +sVq +I33 +sV +I8 +sVs +I10 +sVr +I78 +sVu +I12 +sVt +I240 +sVy +I15 +ssVau +p1788 +(dp1789 +V +I240 +sV) +I1 +sV- +I8 +sV, +I13 +sV. +I5 +sV; +I3 +sV: +I1 +sV[ +I1 +sVc +I49 +sVb +I4 +sVd +I20 +sVg +I4 +sVf +I3 +sVj +I8 +sVm +I16 +sVl +I3 +sVn +I3 +sVq +I1 +sVp +I21 +sVs +I68 +sVr +I41 +sVt +I218 +sVv +I37 +sVx +I117 +ssVat +p1790 +(dp1791 +Va +I13 +sV +I52 +sVe +I89 +sV' +I1 +sVi +I136 +sVh +I6 +sV, +I11 +sVo +I4 +sV. +I2 +sVq +I1 +sV +I1 +sVs +I28 +sVr +I55 +sVu +I29 +sVt +I66 +sV +I1 +sVy +I1 +sV; +I1 +sV: +I3 +sV? +I1 +ssVaw +p1792 +(dp1793 +Va +I4 +sVy +I1 +sVs +I2 +sV. +I1 +ssVav +p1794 +(dp1795 +Va +I259 +sVe +I250 +sVi +I32 +sVo +I102 +sV +I3 +sVr +I3 +ssVay +p1796 +(dp1797 +Va +I25 +sV +I30 +sVe +I22 +sVi +I1 +sV) +I1 +sVm +I1 +sVo +I1 +sV +I5 +sVs +I54 +ssVax +p1798 +(dp1799 +Vi +I3 +sV- +I2 +sVe +I2 +sV +I1 +ssVaz +p1800 +(dp1801 +Vi +I1 +ssVAs +p1802 +(dp1803 +Vi +I2 +sV +I3 +sVs +I2 +sVc +I1 +sVt +I1 +ssVAu +p1804 +(dp1805 +V +I10 +sVs +I8 +sVt +I1 +sVg +I2 +ssVa[ +p1806 +(dp1807 +V1 +I2 +ssVa] +p1808 +(dp1809 +V +I1 +sV. +I1 +ssVa_ +p1810 +(dp1811 +V, +I2 +ssVu +p1812 +(dp1813 +Vr +I8 +sVd +I1 +ssVa +p1814 +(dp1815 +V" +I1 +sVi +I6 +sV5 +I2 +sVC +I19 +sVB +I4 +sVE +I1 +sVD +I2 +sVG +I3 +sVF +I2 +sVH +I1 +sVM +I5 +sVP +I11 +sVS +I1 +sVR +I1 +sVU +I1 +sVT +I2 +sVV +I4 +sV_ +I9 +sVa +I22 +sV +I28 +sVc +I95 +sVb +I54 +sVe +I26 +sVd +I128 +sVg +I33 +sVf +I61 +sV +I13 +sVh +I9 +sVj +I21 +sVm +I139 +sVl +I61 +sVo +I2 +sVn +I36 +sVq +I30 +sVp +I182 +sVs +I72 +sVr +I63 +sVu +I27 +sVt +I67 +sVw +I2 +sVv +I114 +ssVa- +p1816 +(dp1817 +Vc +I1 +sVb +I1 +sVf +I10 +sVM +I1 +sVC +I2 +sVt +I15 +ssVa, +p1818 +(dp1819 +V +I76 +sVc +I1 +ssVa. +p1820 +(dp1821 +V +I10 +sVb +I2 +sVt +I2 +ssVN +p1822 +(dp1823 +V +I2 +ssVa; +p1824 +(dp1825 +V +I9 +ssVa: +p1826 +(dp1827 +V +I7 +ssVa? +p1828 +(dp1829 +V +I1 +ssV"D +p1830 +(dp1831 +Ve +I1 +ssV-E +p1832 +(dp1833 +Vs +I1 +sVt +I2 +sVd +I1 +ssVt_ +p1834 +(dp1835 +V +I1 +sV, +I2 +sV. +I1 +ssV-G +p1836 +(dp1837 +Vr +I2 +sVe +I1 +ssV-A +p1838 +(dp1839 +Vy +I13 +sVh +I2 +ssVt[ +p1840 +(dp1841 +V1 +I2 +sV2 +I1 +ssV-C +p1842 +(dp1843 +Va +I2 +sVe +I1 +sV' +I2 +sVo +I1 +ssV-M +p1844 +(dp1845 +Va +I3 +sV +I1 +sVe +I1 +sVo +I3 +ssV-L +p1846 +(dp1847 +Va +I1 +sV' +I2 +ssV-O +p1848 +(dp1849 +V +I1 +sVh +I2 +sVu +I1 +ssV-N +p1850 +(dp1851 +Vo +I3 +ssV-I +p1852 +(dp1853 +VI +I1 +sVS +I1 +sVl +I1 +ssV-H +p1854 +(dp1855 +Vo +I1 +ssV-J +p1856 +(dp1857 +Ve +I1 +sV. +I2 +ssV-T +p1858 +(dp1859 +VM +I1 +sVu +I1 +ssV-V +p1860 +(dp1861 +Vo +I2 +ssV-Q +p1862 +(dp1863 +Vu +I1 +ssV-P +p1864 +(dp1865 +Vi +I1 +sVo +I1 +ssV-S +p1866 +(dp1867 +Va +I1 +sVu +I1 +ssVz +p1868 +(dp1869 +Vl +I1 +ssVt@ +p1870 +(dp1871 +Vp +I2 +ssVgr +p1872 +(dp1873 +Va +I94 +sV +I13 +sVe +I17 +sV +I14 +sV +I2 +sVo +I15 +sVi +I5 +ssV-e +p1874 +(dp1875 +Vt +I1 +sVl +I18 +sVn +I3 +ssV-d +p1876 +(dp1877 +Vi +I7 +sVa +I7 +sVe +I9 +sV' +I2 +ssV-f +p1878 +(dp1879 +V +I8 +sVa +I2 +sVr +I1 +sVo +I3 +ssV-a +p1880 +(dp1881 +Vi +I1 +sVr +I1 +sVu +I1 +ssVtx +p1882 +(dp1883 +Vt +I6 +ssV-b +p1884 +(dp1885 +Vu +I1 +sVe +I3 +sVo +I2 +ssV-m +p1886 +(dp1887 +V +I21 +sVo +I15 +ssV-l +p1888 +(dp1889 +Va +I3 +sV +I9 +sVe +I10 +sVu +I2 +ssVtt +p1890 +(dp1891 +Va +I13 +sVe +I195 +sVp +I5 +sVi +I10 +sV +I3 +sVo +I2 +sV +I7 +sVs +I1 +sVr +I43 +sVu +I7 +ssVtu +p1892 +(dp1893 +Va +I11 +sV +I21 +sVc +I1 +sVe +I31 +sVd +I9 +sVg +I12 +sV +I18 +sVm +I4 +sVl +I9 +sVn +I15 +sVp +I2 +sVs +I5 +sVr +I68 +sV, +I1 +sV? +I2 +ssVtr +p1894 +(dp1895 +Va +I145 +sVe +I578 +sV' +I3 +sVi +I54 +sV +I64 +sV +I13 +sVo +I173 +sV +I21 +sVu +I9 +sV +I12 +sVy +I3 +ssVts +p1896 +(dp1897 +V! +I2 +sV +I173 +sV" +I1 +sVk +I3 +sV* +I1 +sVm +I3 +sV, +I45 +sV. +I20 +sV_ +I1 +sV; +I14 +sV: +I2 +sV[ +I1 +sV? +I4 +ssVtp +p1898 +(dp1899 +Vh +I12 +sV: +I6 +sV. +I1 +ssV-j +p1900 +(dp1901 +Ve +I14 +ssV-u +p1902 +(dp1903 +Vp +I1 +ssVto +p1904 +(dp1905 +V +I65 +sVc +I3 +sVb +I3 +sVd +I1 +sVf +I2 +sVi +I25 +sV- +I7 +sVm +I50 +sV, +I2 +sVn +I75 +sVp +I2 +sVr +I5 +sVu +I401 +sVt +I3 +sV: +I2 +sVy +I8 +sV. +I3 +sV_ +I1 +sVl +I3 +ssVtl +p1906 +(dp1907 +Va +I1 +sVy +I5 +sVe +I2 +ssV-v +p1908 +(dp1909 +Vi +I3 +sVa +I1 +sVe +I1 +sVo +I61 +ssV-q +p1910 +(dp1911 +Vu +I3 +ssV-p +p1912 +(dp1913 +V +I2 +ssVth +p1914 +(dp1915 +Va +I22 +sV +I20 +sVe +I130 +sVi +I44 +sV +I3 +sVm +I1 +sV, +I2 +sVo +I18 +sV. +I1 +sV +I23 +sVr +I2 +sVu +I1 +sV; +I1 +sV: +I1 +ssVti +p1916 +(dp1917 +V +I15 +sV, +I2 +sV. +I2 +sV; +I1 +sVa +I2 +sVc +I22 +sVb +I4 +sVe +I72 +sVd +I4 +sVg +I8 +sVf +I8 +sV +I16 +sV +I14 +sVm +I24 +sVl +I17 +sVo +I185 +sVn +I194 +sVq +I26 +sVp +I1 +sVs +I39 +sVr +I41 +sVu +I1 +sVt +I64 +sVv +I20 +ssVte +p1918 +(dp1919 +V! +I10 +sV +I403 +sV- +I4 +sV, +I100 +sV. +I37 +sV; +I21 +sV: +I6 +sV? +I7 +sV[ +I1 +sVa +I37 +sVc +I3 +sVe +I3 +sVd +I28 +sVf +I1 +sVi +I1 +sVm +I72 +sVl +I49 +sVn +I216 +sVp +I1 +sVs +I196 +sVr +I190 +sVu +I87 +sVt +I1 +sVy +I1 +sVx +I16 +sVz +I14 +ssVtb +p1920 +(dp1921 +Vo +I1 +ssVtc +p1922 +(dp1923 +V. +I3 +ssVta +p1924 +(dp1925 +V +I53 +sV- +I1 +sV, +I10 +sV. +I1 +sVc +I20 +sVb +I49 +sVd +I1 +sVg +I25 +sVf +I2 +sVi +I374 +sVh +I1 +sVk +I3 +sVm +I3 +sVl +I35 +sVn +I115 +sVq +I3 +sVp +I8 +sVs +I7 +sVr +I8 +sVt +I49 +sVv +I2 +sVx +I4 +ssV_ +p1926 +(dp1927 +Vt +I2 +ssVV +p1928 +(dp1929 +VR +I1 +ssVgy +p1930 +(dp1931 +Vp +I2 +ssVt? +p1932 +(dp1933 +V +I3 +sV- +I1 +sV. +I1 +ssVt: +p1934 +(dp1935 +V +I46 +sVM +I1 +ssVt; +p1936 +(dp1937 +V +I66 +ssV-- +p1938 +(dp1939 +VA +I2 +sV +I1 +sVC +I4 +sVE +I2 +sVD +I1 +sVI +I2 +sV- +I4 +sVJ +I1 +sVM +I3 +sV, +I1 +sVO +I4 +sVN +I2 +sVQ +I1 +sVP +I1 +sVS +I1 +sVV +I2 +sVL +I2 +ssV-, +p1940 +(dp1941 +V +I1 +ssV p +p1942 +(dp1943 +Va +I805 +sV +I5 +sVe +I337 +sVi +I95 +sV +I36 +sVl +I307 +sVo +I434 +sV +I24 +sVr +I416 +sVu +I65 +sVh +I41 +sVy +I1 +sV +I4 +ssVt. +p1944 +(dp1945 +V +I116 +sV- +I4 +ssVt/ +p1946 +(dp1947 +Vp +I1 +sVd +I2 +ssVt, +p1948 +(dp1949 +V +I265 +ssV-6 +p1950 +(dp1951 +V2 +I2 +ssV-1 +p1952 +(dp1953 +V +I1 +sV2 +I3 +sV8 +I1 +ssV-3 +p1954 +(dp1955 +V1 +I1 +ssV-2 +p1956 +(dp1957 +V% +I1 +ssVt' +p1958 +(dp1959 +Va +I4 +sVy +I1 +sVs +I2 +ssVrk +p1960 +(dp1961 +Va +I1 +sV +I6 +sVe +I1 +sVi +I1 +sV- +I1 +sV, +I3 +sV. +I2 +sVs +I2 +ssVt" +p1962 +(dp1963 +V) +I1 +sV +I1 +ssV-8 +p1964 +(dp1965 +V +I1 +ssVt +p1966 +(dp1967 +V +I22 +sV +I51 +sV# +I1 +sV( +I2 +sV1 +I4 +sV2 +I1 +sV4 +I1 +sV< +I1 +sV +I1 +sVA +I4 +sVC +I178 +sVD +I3 +sVG +I25 +sVI +I4 +sVH +I2 +sVJ +I2 +sVM +I56 +sVP +I27 +sVR +I1 +sVV +I1 +sV_ +I6 +sVa +I271 +sV +I160 +sVc +I196 +sVb +I97 +sVe +I218 +sVd +I603 +sVg +I14 +sVf +I92 +sVi +I83 +sVh +I36 +sVk +I1 +sVj +I77 +sVm +I129 +sVl +I488 +sVo +I74 +sVn +I70 +sVq +I230 +sVp +I336 +sVs +I210 +sVr +I80 +sVu +I182 +sVt +I157 +sVw +I11 +sVv +I91 +sVy +I11 +sV +I1 +ssVt! +p1968 +(dp1969 +V +I7 +sV" +I6 +ssVEM +p1970 +(dp1971 +VA +I1 +sVE +I2 +sVN +I1 +ssVga +p1972 +(dp1973 +V +I1 +sVc +I1 +sVb +I1 +sVg +I24 +sVi +I7 +sVl +I44 +sVn +I8 +sVr +I74 +sVu +I7 +sVt +I3 +sV, +I2 +ssV +p1974 +(dp1975 +Va +I2 +sVj +I7 +sVe +I3 +sVd +I1 +sVp +I1 +sVi +I8 +sV +I1 +sVm +I2 +sVl +I9 +sVn +I5 +sVP +I1 +sVs +I4 +sVt +I3 +ssV- +p1976 +(dp1977 +Vd +I4 +ssV z +p1978 +(dp1979 +V +I1 +ssV? +p1980 +(dp1981 +V- +I1 +ssVgl +p1982 +(dp1983 +Va +I13 +sVi +I8 +sVe +I10 +sVo +I109 +ssV- +p1984 +(dp1985 +V- +I6 +ssVt +p1986 +(dp1987 +Vm +I1 +sVt +I38 +ssV- +p1988 +(dp1989 +Vt +I9 +ssVt +p1990 +(dp1991 +Vm +I1 +ssV@p +p1992 +(dp1993 +Vo +I2 +ssVt +p1994 +(dp1995 +Vt +I16 +ssVt +p1996 +(dp1997 +Vr +I19 +sVm +I3 +ssVt +p1998 +(dp1999 +V +I173 +sVe +I10 +sVm +I7 +sV, +I35 +sV. +I14 +sVs +I29 +sVr +I5 +sV? +I3 +sV; +I4 +sV: +I1 +sV_ +I3 +sVt +I1 +ssVt +p2000 +(dp2001 +Vc +I1 +sVt +I1 +ssVEF +p2002 +(dp2003 +V +I1 +sVO +I1 +ssV/N +p2004 +(dp2005 +Vo +I1 +ssVg[ +p2006 +(dp2007 +V2 +I1 +ssVS* +p2008 +(dp2009 +V* +I1 +sVV +I1 +ssVS. +p2010 +(dp2011 +V +I5 +ssVS- +p2012 +(dp2013 +VI +I1 +ssVS, +p2014 +(dp2015 +V +I6 +ssVS" +p2016 +(dp2017 +V. +I1 +ssVS +p2018 +(dp2019 +VA +I1 +sVb +I2 +sVE +I2 +sVD +I1 +sVF +I2 +sVI +I1 +sVL +I1 +sVo +I2 +sV3 +I1 +sVO +I4 +ssVS' +p2020 +(dp2021 +V +I1 +ssVve +p2022 +(dp2023 +Va +I6 +sV +I65 +sVc +I128 +sVd +I7 +sVi +I8 +sVm +I18 +sVl +I21 +sVn +I151 +sV. +I2 +sVs +I14 +sVr +I174 +sVu +I22 +sVt +I1 +sVy +I1 +sV; +I1 +sVz +I67 +sV, +I7 +sV? +I1 +ssVSy +p2024 +(dp2025 +Vr +I1 +ssVf +p2026 +(dp2027 +Vm +I1 +sVt +I11 +ssVSu +p2028 +(dp2029 +Vi +I1 +sV +I1 +sVr +I14 +ssVSt +p2030 +(dp2031 +Va +I3 +sVu +I1 +ssVSi +p2032 +(dp2033 +Va +I1 +sV +I11 +sVe +I1 +sV +I11 +sVn +I3 +sVr +I3 +ssVSo +p2034 +(dp2035 +Vy +I1 +sVm +I1 +sVu +I5 +sV, +I1 +sVn +I1 +ssVSm +p2036 +(dp2037 +Vy +I2 +sVa +I6 +ssVSc +p2038 +(dp2039 +Vu +I1 +ssVf +p2040 +(dp2041 +V +I3 +sV, +I3 +sV. +I2 +sVs +I1 +sVr +I13 +sVt +I2 +sV; +I1 +sV[ +I1 +sVl +I2 +ssVSa +p2042 +(dp2043 +V +I6 +sVc +I1 +sVi +I7 +sVm +I1 +sVl +I2 +sVn +I1 +sVr +I1 +sVx +I1 +ssVSe +p2044 +(dp2045 +Vc +I2 +sVr +I2 +sVs +I1 +ssVSS +p2046 +(dp2047 +VI +I1 +sV +I2 +sVE +I1 +ssVSQ +p2048 +(dp2049 +VU +I1 +ssVSU +p2050 +(dp2051 +VC +I1 +ssVST +p2052 +(dp2053 +VA +I2 +sVR +I2 +ssVSI +p2054 +(dp2055 +VB +I1 +sVO +I2 +ssVSO +p2056 +(dp2057 +V- +I1 +ssVSM +p2058 +(dp2059 +VA +I2 +sVE +I2 +ssVSC +p2060 +(dp2061 +VI +I2 +sVL +I1 +ssVSE +p2062 +(dp2063 +VQ +I1 +sV +I2 +sVN +I1 +sVM +I1 +sV. +I1 +ssVf +p2064 +(dp2065 +V2 +I1 +sV4 +I1 +sVC +I6 +sVF +I2 +sVP +I3 +sVR +I1 +sVT +I1 +sVV +I1 +sVa +I7 +sV +I1 +sVc +I3 +sVe +I1 +sVd +I5 +sVi +I4 +sVm +I2 +sVo +I4 +sVn +I2 +sVp +I1 +sVs +I6 +sVr +I2 +sVu +I1 +sVt +I32 +sVw +I3 +sVy +I17 +ssVf, +p2066 +(dp2067 +V +I7 +ssVf- +p2068 +(dp2069 +Vt +I1 +sVd +I2 +ssVf. +p2070 +(dp2071 +V +I4 +sVf +I2 +ssVt +p2072 +(dp2073 +Va +I1 +sV +I37 +sVe +I22 +sV +I11 +sVo +I2 +sVi +I3 +sVr +I4 +sV; +I1 +ssVp +p2074 +(dp2075 +Vi +I2 +ssVn +p2076 +(dp2077 +Vi +I2 +sVa +I1 +sVe +I5 +sV +I8 +ssVl +p2078 +(dp2079 +Vi +I1 +sVe +I1 +ssVl +p2080 +(dp2081 +Ve +I3 +ssVm +p2082 +(dp2083 +Ve +I1 +ssVn +p2084 +(dp2085 +Ve +I1 +ssVfr +p2086 +(dp2087 +Va +I30 +sVe +I17 +sVi +I20 +sV +I26 +sV, +I2 +sVo +I30 +sV +I3 +sVu +I5 +ssVfs +p2088 +(dp2089 +V +I5 +sV; +I1 +sV, +I3 +sV. +I1 +ssVft +p2090 +(dp2091 +Vy +I1 +sVp +I2 +sVe +I4 +sVw +I3 +ssVfu +p2092 +(dp2093 +Vg +I3 +sVi +I9 +sVm +I3 +sVl +I2 +sVn +I10 +sVs +I41 +sVr +I35 +sVt +I68 +sVy +I2 +ssVg; +p2094 +(dp2095 +V +I1 +ssV / +p2096 +(dp2097 +Ve +I1 +ssVfa +p2098 +(dp2099 +V +I2 +sVc +I8 +sVb +I2 +sV +I3 +sVi +I197 +sVm +I13 +sVl +I12 +sVn +I20 +sVs +I8 +sVr +I3 +sVu +I56 +sVt +I6 +sVv +I5 +sV: +I1 +ssVS +p2100 +(dp2101 +Vd +I1 +sVn +I1 +ssVfe +p2102 +(dp2103 +Vc +I8 +sVe +I6 +sVm +I32 +sVn +I14 +sVs +I52 +sVr +I39 +sVu +I15 +sVt +I15 +sV: +I1 +ssVff +p2104 +(dp2105 +Va +I16 +sV +I1 +sVe +I29 +sVi +I24 +sV- +I1 +sVl +I8 +sVo +I5 +sV +I6 +sVr +I20 +sV_ +I1 +ssVfi +p2106 +(dp2107 +Va +I5 +sVc +I29 +sVe +I8 +sVd +I10 +sVg +I9 +sVf +I2 +sV +I1 +sV +I2 +sVl +I62 +sVn +I59 +sVq +I3 +sVs +I7 +sVr +I11 +sVt +I76 +sVv +I1 +sVx +I2 +ssVfl +p2108 +(dp2109 +Va +I9 +sVe +I14 +sVi +I3 +sV +I2 +sVo +I7 +sV +I12 +ssVfo +p2110 +(dp2111 +Vi +I47 +sVl +I7 +sVn +I37 +sVs +I2 +sVr +I122 +sVu +I22 +ssVt +p2112 +(dp2113 +Va +I1 +sV +I6 +sVe +I32 +sVi +I3 +sVo +I3 +sV. +I1 +sV +I1 +sVs +I1 +sVr +I11 +sV; +I1 +ssVf_ +p2114 +(dp2115 +V, +I1 +ssV +p2116 +(dp2117 +Vm +I3 +ssVy) +p2118 +(dp2119 +V +I3 +ssVy* +p2120 +(dp2121 +V +I1 +ssVy, +p2122 +(dp2123 +V +I12 +ssVy. +p2124 +(dp2125 +V +I3 +ssVy +p2126 +(dp2127 +Vj +I1 +sV +I1 +sVp +I7 +sV( +I2 +sV1 +I1 +sV2 +I1 +sVA +I7 +sVC +I4 +sVB +I1 +sVD +I1 +sVF +I1 +sVI +I2 +sVM +I4 +sVL +I3 +sVP +I1 +sVS +I2 +sVT +I1 +sVV +I5 +sVa +I84 +sVc +I8 +sVb +I9 +sVe +I19 +sVd +I5 +sVg +I4 +sVf +I12 +sV +I4 +sVh +I4 +sV +I2 +sVm +I4 +sVl +I1 +sVo +I17 +sVn +I6 +sVi +I5 +sVs +I8 +sVr +I8 +sVu +I3 +sVt +I20 +sVw +I3 +sVv +I4 +sVy +I3 +ssV 5 +p2128 +(dp2129 +V0 +I4 +sV2 +I1 +sV +I1 +ssVg/ +p2130 +(dp2131 +Vp +I1 +sVe +I2 +sVg +I1 +ssV ; +p2132 +(dp2133 +V +I1 +ssV24 +p2134 +(dp2135 +V0 +I1 +sV. +I1 +ssV25 +p2136 +(dp2137 +V) +I1 +sV0 +I1 +ssV26 +p2138 +(dp2139 +V +I1 +sV. +I1 +ssV27 +p2140 +(dp2141 +V +I1 +sV, +I1 +ssV20 +p2142 +(dp2143 +V0 +I15 +sV; +I1 +sV% +I1 +sV, +I1 +sV +I1 +ssV21 +p2144 +(dp2145 +V +I1 +sV5 +I2 +ssV22 +p2146 +(dp2147 +V1 +I2 +sV +I1 +ssV28 +p2148 +(dp2149 +V +I1 +sV; +I1 +ssV29 +p2150 +(dp2151 +V. +I2 +ssV2: +p2152 +(dp2153 +V +I1 +ssV2; +p2154 +(dp2155 +V +I1 +ssV2% +p2156 +(dp2157 +V +I1 +ssV2 +p2158 +(dp2159 +Va +I1 +sV( +I1 +sVd +I1 +sVD +I1 +ssV2, +p2160 +(dp2161 +V +I6 +ssV2. +p2162 +(dp2163 +V +I5 +ssV2/ +p2164 +(dp2165 +V1 +I1 +ssV2* +p2166 +(dp2167 +VE +I1 +ssVyi +p2168 +(dp2169 +Vn +I3 +ssVym +p2170 +(dp2171 +Va +I1 +sVe +I1 +ssVyl +p2172 +(dp2173 +Ve +I1 +sVl +I1 +sVo +I1 +sVv +I4 +ssVyo +p2174 +(dp2175 +Vm +I1 +sVu +I62 +sVn +I3 +ssVyn +p2176 +(dp2177 +Vx +I1 +sVg +I3 +ssVya +p2178 +(dp2179 +V +I7 +sVc +I1 +sVb +I7 +sVd +I1 +sVg +I25 +sVi +I20 +sV, +I2 +sVl +I7 +sVu +I11 +sVn +I36 +ssV2] +p2180 +(dp2181 +V +I15 +sV; +I2 +sV, +I1 +sV. +I6 +ssVyc +p2182 +(dp2183 +Vl +I3 +ssV2_ +p2184 +(dp2185 +V. +I1 +ssVye +p2186 +(dp2187 +Va +I4 +sVe +I2 +sVd +I1 +sV, +I2 +sVn +I10 +sVr +I16 +sVu +I23 +sVt +I1 +sVz +I59 +ssVyd +p2188 +(dp2189 +Ve +I1 +ssVyg +p2190 +(dp2191 +Vm +I1 +ssVyz +p2192 +(dp2193 +Ve +I1 +ssVyp +p2194 +(dp2195 +Va +I1 +sVr +I1 +sVe +I2 +sVt +I1 +sVo +I2 +ssVys +p2196 +(dp2197 +V +I35 +sVi +I20 +sV- +I3 +sV, +I8 +sV. +I6 +sVs +I1 +sVt +I4 +sV; +I2 +sV? +I1 +ssVyr +p2198 +(dp2199 +Va +I2 +sVe +I14 +sVi +I11 +sVo +I1 +sVn +I2 +sVr +I1 +ssVyt +p2200 +(dp2201 +Vi +I1 +ssV +p2202 +(dp2203 +VM +I1 +ssVm +p2204 +(dp2205 +Ve +I1 +ssVl +p2206 +(dp2207 +V, +I2 +ssVy_ +p2208 +(dp2209 +V, +I1 +ssVt +p2210 +(dp2211 +Ve +I2 +ssVE, +p2212 +(dp2213 +V +I5 +ssVE. +p2214 +(dp2215 +V +I4 +ssVE! +p2216 +(dp2217 +V* +I1 +ssVE +p2218 +(dp2219 +VA +I1 +sVC +I1 +sVE +I1 +sVD +I5 +sVG +I1 +sVI +I6 +sVJ +I1 +sVM +I2 +sVL +I3 +sVO +I4 +sVN +I2 +sV1 +I1 +sVP +I1 +sVS +I2 +sVT +I2 +sVV +I4 +sVX +I23 +ssVy +p2220 +(dp2221 +V +I15 +sVe +I2 +ssVEN +p2222 +(dp2223 +V +I3 +sVC +I1 +sVB +I8 +sVD +I3 +sV, +I1 +sVT +I3 +ssVEI +p2224 +(dp2225 +VT +I1 +sVN +I2 +ssVED +p2226 +(dp2227 +VI +I4 +sV +I4 +sV, +I1 +ssVEG +p2228 +(dp2229 +VL +I1 +ssVy +p2230 +(dp2231 +Vt +I1 +ssVEA +p2232 +(dp2233 +VC +I1 +sVD +I1 +ssVEC +p2234 +(dp2235 +V +I1 +sVT +I9 +ssVEB +p2236 +(dp2237 +VC +I2 +sVO +I6 +ssVEY +p2238 +(dp2239 +V +I1 +ssVEX +p2240 +(dp2241 +VP +I1 +ssVEZ +p2242 +(dp2243 +V +I1 +ssVEU +p2244 +(dp2245 +VC +I2 +sVR +I2 +sVV +I2 +ssVET +p2246 +(dp2247 +V +I2 +sVC +I1 +sVT +I2 +ssVEV +p2248 +(dp2249 +VE +I2 +ssVEQ +p2250 +(dp2251 +VU +I2 +ssVES +p2252 +(dp2253 +V +I8 +sVS +I2 +sV, +I3 +sV. +I1 +ssVER +p2254 +(dp2255 +V +I4 +sVC +I1 +sVD +I1 +sVG +I8 +sVI +I1 +sV* +I1 +sV, +I4 +sVO +I1 +sVS +I2 +sVT +I1 +sVW +I1 +ssVEm +p2256 +(dp2257 +Vp +I2 +ssVEl +p2258 +(dp2259 +Ve +I1 +sVd +I17 +sVl +I17 +ssVEn +p2260 +(dp2261 +V +I13 +sVs +I3 +sVd +I1 +sVf +I14 +ssVEh +p2262 +(dp2263 +V! +I2 +sV +I10 +ssVEd +p2264 +(dp2265 +Vi +I1 +sVo +I1 +ssVEx +p2266 +(dp2267 +Vc +I1 +sVt +I1 +ssVEu +p2268 +(dp2269 +Vr +I15 +ssVEt +p2270 +(dp2271 +V +I11 +sVr +I1 +sVe +I6 +sV, +I1 +ssVEv +p2272 +(dp2273 +Vh +I1 +ssVEs +p2274 +(dp2275 +Vp +I18 +sVs +I2 +sVt +I7 +ssVEr +p2276 +(dp2277 +Vz +I1 +ssV +p2278 +(dp2279 +V +I1 +ssVX. +p2280 +(dp2281 +V +I8 +ssVX, +p2282 +(dp2283 +V +I4 +ssVX +p2284 +(dp2285 +Ve +I1 +sVd +I2 +ssVX; +p2286 +(dp2287 +V +I1 +ssVXI +p2288 +(dp2289 +V +I3 +sVI +I14 +sV- +I1 +sV, +I10 +sV. +I2 +sVV +I4 +sVX +I3 +ssVXL +p2290 +(dp2291 +VI +I1 +sV +I1 +ssVXX +p2292 +(dp2293 +VI +I24 +sVX +I12 +sV. +I3 +sV, +I3 +sVV +I11 +ssVXP +p2294 +(dp2295 +VR +I1 +ssVXV +p2296 +(dp2297 +VI +I21 +sV +I2 +sV, +I1 +sV_ +I9 +sV. +I3 +ssVk +p2298 +(dp2299 +Va +I1 +sVb +I2 +sVe +I1 +sVd +I2 +sVf +I1 +sVi +I4 +sV( +I3 +sVm +I2 +sVl +I1 +sVo +I7 +sVp +I1 +sVs +I1 +sVr +I1 +sVt +I6 +sVw +I1 +ssVk) +p2300 +(dp2301 +V +I1 +sV, +I1 +ssVk. +p2302 +(dp2303 +V +I5 +ssVk- +p2304 +(dp2305 +Vu +I1 +sVd +I1 +ssVk, +p2306 +(dp2307 +V +I13 +ssVk0 +p2308 +(dp2309 +V3 +I2 +sV2 +I1 +ssV7] +p2310 +(dp2311 +V +I2 +ssV7 +p2312 +(dp2313 +VA +I1 +sVd +I1 +ssV7. +p2314 +(dp2315 +V +I2 +ssV7, +p2316 +(dp2317 +V +I3 +ssV77 +p2318 +(dp2319 +V8 +I1 +sV, +I1 +sV7 +I1 +ssV76 +p2320 +(dp2321 +V1 +I6 +sV0 +I1 +sV3 +I2 +sV2 +I1 +sV4 +I2 +sV7 +I1 +sV6 +I4 +sV9 +I1 +sV8 +I2 +ssV75 +p2322 +(dp2323 +V9 +I7 +sV5 +I1 +sV7 +I2 +sV6 +I4 +ssV73 +p2324 +(dp2325 +V9 +I3 +sV8 +I1 +sV6 +I1 +sV0 +I3 +ssV72 +p2326 +(dp2327 +V, +I1 +ssV71 +p2328 +(dp2329 +V1 +I1 +sV8 +I1 +sV* +I1 +sV +I1 +ssV70 +p2330 +(dp2331 +V; +I1 +sV2 +I1 +sV5 +I1 +sV. +I1 +ssVk[ +p2332 +(dp2333 +V3 +I1 +ssV7; +p2334 +(dp2335 +V +I2 +ssV7: +p2336 +(dp2337 +V +I2 +ssV79 +p2338 +(dp2339 +V6 +I1 +ssV78 +p2340 +(dp2341 +V9 +I1 +sV2 +I1 +sV5 +I1 +sV, +I1 +ssVka +p2342 +(dp2343 +V +I1 +sV, +I2 +sV +I1 +sVn +I1 +ssVke +p2344 +(dp2345 +V +I6 +sVs +I1 +sVe +I1 +sVt +I1 +ssVkd +p2346 +(dp2347 +Vo +I1 +ssVki +p2348 +(dp2349 +V +I2 +sV[ +I1 +sV, +I1 +sVn +I1 +ssVkh +p2350 +(dp2351 +V +I3 +sV; +I3 +sV, +I3 +sV? +I1 +sV. +I1 +ssVko +p2352 +(dp2353 +Vt +I1 +ssVkn +p2354 +(dp2355 +Vo +I5 +ssVkl +p2356 +(dp2357 +Va +I1 +ssVks +p2358 +(dp2359 +V! +I1 +sV +I14 +sV, +I4 +sV/ +I1 +sV. +I1 +sV; +I1 +ssVky +p2360 +(dp2361 +V, +I2 +ssVJE +p2362 +(dp2363 +VC +I8 +ssVJA +p2364 +(dp2365 +VC +I1 +ssVJu +p2366 +(dp2367 +Vi +I17 +sVs +I1 +sVl +I1 +sVg +I1 +ssVJo +p2368 +(dp2369 +Va +I1 +sVu +I5 +sV +I1 +ssVJe +p2370 +(dp2371 +Va +I2 +sV +I101 +sVr +I1 +ssVJa +p2372 +(dp2373 +Vp +I3 +sVc +I9 +sVm +I2 +sVn +I3 +ssVJ. +p2374 +(dp2375 +V +I4 +sV- +I2 +ssVJ' +p2376 +(dp2377 +Va +I22 +sV +I4 +sVi +I1 +sVy +I1 +ssVJ +p2378 +(dp2379 +Vh +I1 +sVc +I1 +sVr +I1 +ssV]? +p2380 +(dp2381 +V +I2 +ssV]; +p2382 +(dp2383 +V +I11 +ssV]: +p2384 +(dp2385 +V +I1 +ssV] +p2386 +(dp2387 +V +I6 +sV6 +I2 +sVA +I4 +sVC +I4 +sVD +I3 +sVF +I2 +sVI +I2 +sVH +I1 +sVM +I2 +sVL +I11 +sVQ +I1 +sVS +I6 +sVR +I1 +sVT +I1 +sVV +I11 +sVY +I1 +sV_ +I2 +sVa +I4 +sVd +I2 +sV +I1 +sVo +I1 +sVq +I1 +sVp +I1 +ssV], +p2388 +(dp2389 +V +I12 +ssV]. +p2390 +(dp2391 +V +I16 +ssV); +p2392 +(dp2393 +V +I1 +ssV): +p2394 +(dp2395 +V +I2 +ssV)( +p2396 +(dp2397 +V3 +I2 +ssV), +p2398 +(dp2399 +V +I6 +ssV). +p2400 +(dp2401 +V +I4 +ssV) +p2402 +(dp2403 +Va +I1 +sVc +I2 +sVe +I1 +sVd +I1 +sVo +I1 +sV2 +I1 +sVt +I1 +sVy +I2 +ssVpr +p2404 +(dp2405 +Va +I4 +sVe +I108 +sVi +I156 +sV +I79 +sV +I18 +sVo +I176 +sV +I1 +sV +I76 +sVu +I8 +ssVps +p2406 +(dp2407 +V +I54 +sVi +I1 +sVh +I1 +sV, +I14 +sV. +I6 +sV; +I5 +sV_ +I1 +ssVpp +p2408 +(dp2409 +Va +I17 +sVe +I28 +sV +I6 +sVl +I10 +sVo +I17 +sVi +I1 +sVr +I39 +sVu +I2 +ssVpt +p2410 +(dp2411 +Va +I4 +sV +I9 +sVe +I14 +sVi +I25 +sV- +I1 +sV, +I1 +sV. +I1 +sV +I4 +sVs +I1 +ssVpu +p2412 +(dp2413 +V +I10 +sVc +I1 +sVb +I16 +sVd +I1 +sVi +I33 +sVl +I7 +sV. +I1 +sVp +I1 +sVs +I5 +sVr +I6 +sVt +I20 +sVy +I1 +sVn +I5 +ssVpy +p2414 +(dp2415 +V +I4 +sVr +I10 +sVg +I1 +sV. +I1 +ssVpa +p2416 +(dp2417 +V +I2 +sVc +I2 +sVd +I5 +sVg +I64 +sVi +I24 +sVv +I1 +sVl +I20 +sVn +I9 +sVp +I12 +sVs +I285 +sVr +I402 +sVu +I17 +sVt +I33 +sV +I1 +sVy +I66 +sV. +I1 +ssVpg +p2418 +(dp2419 +V +I1 +ssVpe +p2420 +(dp2421 +Va +I6 +sV +I24 +sVc +I22 +sVz +I2 +sVi +I23 +sV: +I1 +sVl +I20 +sVo +I3 +sVn +I86 +sVs +I16 +sVr +I164 +sVu +I112 +sVt +I39 +sV; +I3 +sV. +I6 +sV, +I9 +sV_ +I2 +ssVph +p2422 +(dp2423 +Va +I15 +sVe +I21 +sV +I1 +sV +I1 +sVi +I29 +sVr +I1 +sVt +I3 +sVy +I20 +ssVpi +p2424 +(dp2425 +Va +I15 +sVc +I5 +sVe +I44 +sVd +I6 +sVg +I2 +sV +I15 +sVl +I6 +sVn +I3 +sVq +I6 +sVs +I7 +sVr +I21 +sVt +I67 +sV, +I1 +ssVpo +p2426 +(dp2427 +Vc +I4 +sVb +I2 +sVp +I1 +sVi +I65 +sV +I3 +sV +I3 +sVm +I4 +sVl +I19 +sVn +I75 +sVq +I1 +sV +I1 +sVs +I62 +sVr +I79 +sVu +I299 +sVt +I6 +ssVpl +p2428 +(dp2429 +Va +I86 +sVe +I60 +sVi +I34 +sV +I1 +sVo +I5 +sVu +I210 +sVy +I2 +ssVpm +p2430 +(dp2431 +Ve +I2 +ssVp: +p2432 +(dp2433 +V/ +I6 +ssVp; +p2434 +(dp2435 +V +I1 +ssVp +p2436 +(dp2437 +Va +I1 +sV +I3 +sVb +I1 +sVe +I2 +sVd +I20 +sVl +I3 +sVo +I1 +sVq +I1 +sVp +I5 +sVs +I5 +sVr +I2 +sVt +I1 +sVv +I3 +ssVp! +p2438 +(dp2439 +V +I1 +ssVp* +p2440 +(dp2441 +V* +I2 +ssVp. +p2442 +(dp2443 +Vi +I1 +sV +I3 +ssVp, +p2444 +(dp2445 +V +I6 +ssVp +p2446 +(dp2447 +Vt +I4 +ssVp +p2448 +(dp2449 +Vm +I1 +sVt +I2 +sVl +I2 +ssVp +p2450 +(dp2451 +Vo +I3 +ssVp +p2452 +(dp2453 +Vc +I6 +sVt +I3 +ssVp +p2454 +(dp2455 +Vc +I10 +sVr +I41 +ssVp +p2456 +(dp2457 +Va +I1 +sV +I10 +sVc +I2 +sVe +I18 +sVd +I3 +sVf +I2 +sV. +I2 +sVs +I6 +sVr +I47 +sV! +I1 +sVt +I5 +ssV"] +__license__ = "Python" + +import amara +from sys import stdin, stdout +from trigram import Trigram +from xml.dom import XML_NAMESPACE as XML_NS +import cPickle + +ATOM_NSS = { + u'atom': u'http://www.w3.org/2005/Atom', + u'xml': XML_NS +} + +langs = {} + +def tri(lang): + if not langs.has_key(lang): + f = open('filters/guess-language/%s.data' % lang, 'r') + t = cPickle.load(f) + f.close() + langs[lang] = t + return langs[lang] + + +def guess_language(entry): + text = u''; + for child in entry.xml_xpath(u'atom:title|atom:summary|atom:content'): + text = text + u' '+ child.__unicode__() + t = Trigram() + t.parseString(text) + if tri('fr') - t > tri('en') - t: + lang=u'en' + else: + lang=u'fr' + entry.xml_set_attribute((u'xml:lang', XML_NS), lang) + +def main(): + feed = amara.parse(stdin, prefixes=ATOM_NSS) + for entry in feed.xml_xpath(u'//atom:entry[not(@xml:lang)]'): + guess_language(entry) + feed.xml(stdout) + +if __name__ == '__main__': + main() diff --git a/examples/filters/guess-language/learn-language.py b/examples/filters/guess-language/learn-language.py new file mode 100755 index 0000000..d92ca7e --- /dev/null +++ b/examples/filters/guess-language/learn-language.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +"""A filter to guess languages. + +This utility saves a Trigram object on file. + +(See the REAME file for more details). + +Requires Python 2.1, recommends 2.4. +""" +__authors__ = [ "Eric van der Vlist "] +__license__ = "Python" + +from trigram import Trigram +from sys import argv +from cPickle import dump + + +def main(): + tri = Trigram(argv[1]) + out = open(argv[2], 'w') + dump(tri, out) + out.close() + +if __name__ == '__main__': + main() diff --git a/examples/filters/guess-language/trigram.py b/examples/filters/guess-language/trigram.py new file mode 100644 index 0000000..95cbdaa --- /dev/null +++ b/examples/filters/guess-language/trigram.py @@ -0,0 +1,188 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +""" + This class is based on the Python recipe titled + "Language detection using character trigrams" + http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/326576 + by Douglas Bagnall. + It has been (slightly) adapted by Eric van der Vlist to support + Unicode and accept a method to parse strings. +""" +__authors__ = [ "Douglas Bagnall", "Eric van der Vlist "] +__license__ = "Python" + +import random +from urllib import urlopen + +class Trigram: + """ + From one or more text files, the frequency of three character + sequences is calculated. When treated as a vector, this information + can be compared to other trigrams, and the difference between them + seen as an angle. The cosine of this angle varies between 1 for + complete similarity, and 0 for utter difference. Since letter + combinations are characteristic to a language, this can be used to + determine the language of a body of text. For example: + + >>> reference_en = Trigram('/path/to/reference/text/english') + >>> reference_de = Trigram('/path/to/reference/text/german') + >>> unknown = Trigram('url://pointing/to/unknown/text') + >>> unknown.similarity(reference_de) + 0.4 + >>> unknown.similarity(reference_en) + 0.95 + + would indicate the unknown text is almost cetrtainly English. As + syntax sugar, the minus sign is overloaded to return the difference + between texts, so the above objects would give you: + + >>> unknown - reference_de + 0.6 + >>> reference_en - unknown # order doesn't matter. + 0.05 + + As it stands, the Trigram ignores character set information, which + means you can only accurately compare within a single encoding + (iso-8859-1 in the examples). A more complete implementation might + convert to unicode first. + + As an extra bonus, there is a method to make up nonsense words in the + style of the Trigram's text. + + >>> reference_en.makeWords(30) + My withillonquiver and ald, by now wittlectionsurper, may sequia, + tory, I ad my notter. Marriusbabilly She lady for rachalle spen + hat knong al elf + + Beware when using urls: HTML won't be parsed out. + + Most methods chatter away to standard output, to let you know they're + still there. + """ + + length = 0 + + def __init__(self, fn=None): + self.lut = {} + if fn is not None: + self.parseFile(fn) + + def _parseAFragment(self, line, pair=' '): + for letter in line: + d = self.lut.setdefault(pair, {}) + d[letter] = d.get(letter, 0) + 1 + pair = pair[1] + letter + return pair + + def parseString(self, string): + self._parseAFragment(string) + self.measure() + + def parseFile(self, fn, encoding="iso-8859-1"): + pair = ' ' + if '://' in fn: + #print "trying to fetch url, may take time..." + f = urlopen(fn) + else: + f = open(fn) + for z, line in enumerate(f): + #if not z % 1000: + # print "line %s" % z + # \n's are spurious in a prose context + pair = self._parseAFragment(line.strip().decode(encoding) + ' ') + f.close() + self.measure() + + + def measure(self): + """calculates the scalar length of the trigram vector and + stores it in self.length.""" + total = 0 + for y in self.lut.values(): + total += sum([ x * x for x in y.values() ]) + self.length = total ** 0.5 + + def similarity(self, other): + """returns a number between 0 and 1 indicating similarity. + 1 means an identical ratio of trigrams; + 0 means no trigrams in common. + """ + if not isinstance(other, Trigram): + raise TypeError("can't compare Trigram with non-Trigram") + lut1 = self.lut + lut2 = other.lut + total = 0 + for k in lut1.keys(): + if k in lut2: + a = lut1[k] + b = lut2[k] + for x in a: + if x in b: + total += a[x] * b[x] + + return float(total) / (self.length * other.length) + + def __sub__(self, other): + """indicates difference between trigram sets; 1 is entirely + different, 0 is entirely the same.""" + return 1 - self.similarity(other) + + + def makeWords(self, count): + """returns a string of made-up words based on the known text.""" + text = [] + k = ' ' + while count: + n = self.likely(k) + text.append(n) + k = k[1] + n + if n in ' \t': + count -= 1 + return ''.join(text) + + + def likely(self, k): + """Returns a character likely to follow the given string + two character string, or a space if nothing is found.""" + if k not in self.lut: + return ' ' + # if you were using this a lot, caching would a good idea. + letters = [] + for k, v in self.lut[k].items(): + letters.append(k * v) + letters = ''.join(letters) + return random.choice(letters) + + +def test(): + en = Trigram('http://gutenberg.net/dirs/etext97/lsusn11.txt') + #NB fr and some others have English license text. + # no has english excerpts. + fr = Trigram('http://gutenberg.net/dirs/etext03/candi10.txt') + fi = Trigram('http://gutenberg.net/dirs/1/0/4/9/10492/10492-8.txt') + no = Trigram('http://gutenberg.net/dirs/1/2/8/4/12844/12844-8.txt') + se = Trigram('http://gutenberg.net/dirs/1/0/1/1/10117/10117-8.txt') + no2 = Trigram('http://gutenberg.net/dirs/1/3/0/4/13041/13041-8.txt') + en2 = Trigram('http://gutenberg.net/dirs/etext05/cfgsh10.txt') + fr2 = Trigram('http://gutenberg.net/dirs/1/3/7/0/13704/13704-8.txt') + print "calculating difference:" + print "en - fr is %s" % (en - fr) + print "fr - en is %s" % (fr - en) + print "en - en2 is %s" % (en - en2) + print "en - fr2 is %s" % (en - fr2) + print "fr - en2 is %s" % (fr - en2) + print "fr - fr2 is %s" % (fr - fr2) + print "fr2 - en2 is %s" % (fr2 - en2) + print "fi - fr is %s" % (fi - fr) + print "fi - en is %s" % (fi - en) + print "fi - se is %s" % (fi - se) + print "no - se is %s" % (no - se) + print "en - no is %s" % (en - no) + print "no - no2 is %s" % (no - no2) + print "se - no2 is %s" % (se - no2) + print "en - no2 is %s" % (en - no2) + print "fr - no2 is %s" % (fr - no2) + + +if __name__ == '__main__': + test() From 94cbfe4f09b33fb150953a5267327073c5a9f543 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Tue, 17 Oct 2006 14:15:15 -0400 Subject: [PATCH 14/53] Titles on titles... --- themes/asf/index.html.xslt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/themes/asf/index.html.xslt b/themes/asf/index.html.xslt index fffdcd8..d2fbbf5 100644 --- a/themes/asf/index.html.xslt +++ b/themes/asf/index.html.xslt @@ -153,7 +153,9 @@ - + + + From 88d9dac1d06868855a2d2beabeb85424338f9410 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Tue, 17 Oct 2006 14:44:11 -0400 Subject: [PATCH 15/53] Newline at end of feed --- themes/common/atom.xml.xslt | 1 + 1 file changed, 1 insertion(+) diff --git a/themes/common/atom.xml.xslt b/themes/common/atom.xml.xslt index 83dad26..87f8626 100644 --- a/themes/common/atom.xml.xslt +++ b/themes/common/atom.xml.xslt @@ -22,6 +22,7 @@ no + From 045d38c418a30852cfef434f3f1169605507149a Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Tue, 17 Oct 2006 16:08:44 -0400 Subject: [PATCH 16/53] Correct mime type in entry.source.link[rel='self'] --- planet/spider.py | 9 +++++++-- tests/test_spider.py | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/planet/spider.py b/planet/spider.py index d9b4c00..b5cd2a0 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -187,11 +187,16 @@ def spiderFeed(feed): # capture feed and data from the planet configuration file if not data.feed.has_key('links'): data.feed['links'] = list() + feedtype = 'application/atom+xml' + if data.version.startswith('rss'): feedtype = 'application/rss+xml' + if data.version in ['rss090','rss10']: feedtype = 'application/rdf+xml' for link in data.feed.links: - if link.rel == 'self': break + if link.rel == 'self': + link['type'] = feedtype + break else: data.feed.links.append(feedparser.FeedParserDict( - {'rel':'self', 'type':'application/atom+xml', 'href':feed})) + {'rel':'self', 'type':feedtype, 'href':feed})) for name, value in config.feed_options(feed).items(): data.feed['planet_'+name] = value diff --git a/tests/test_spider.py b/tests/test_spider.py index aa0a6c1..01e730a 100644 --- a/tests/test_spider.py +++ b/tests/test_spider.py @@ -58,6 +58,8 @@ class SpiderTest(unittest.TestCase): # verify that the file timestamps match atom:updated data = feedparser.parse(files[2]) + self.assertEqual(['application/atom+xml'], [link.type + for link in data.entries[0].source.links if link.rel=='self']) self.assertEqual('one', data.entries[0].source.planet_name) self.assertEqual(os.stat(files[2]).st_mtime, calendar.timegm(data.entries[0].updated_parsed)) @@ -82,5 +84,7 @@ class SpiderTest(unittest.TestCase): data = feedparser.parse(workdir + '/planet.intertwingly.net,2006,testfeed3,1') + self.assertEqual(['application/rss+xml'], [link.type + for link in data.entries[0].source.links if link.rel=='self']) self.assertEqual('three', data.entries[0].source.author_detail.name) From e8e189c08f87ff91bf14e212affe1a42c0a89bbf Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Tue, 17 Oct 2006 20:59:06 -0400 Subject: [PATCH 17/53] Handle feed errors (no version string) better --- planet/spider.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/planet/spider.py b/planet/spider.py index b5cd2a0..9a422a3 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -186,17 +186,18 @@ def spiderFeed(feed): data.feed['planet_http_last_modified']) # capture feed and data from the planet configuration file - if not data.feed.has_key('links'): data.feed['links'] = list() - feedtype = 'application/atom+xml' - if data.version.startswith('rss'): feedtype = 'application/rss+xml' - if data.version in ['rss090','rss10']: feedtype = 'application/rdf+xml' - for link in data.feed.links: - if link.rel == 'self': - link['type'] = feedtype - break - else: - data.feed.links.append(feedparser.FeedParserDict( - {'rel':'self', 'type':feedtype, 'href':feed})) + if data.version: + if not data.feed.has_key('links'): data.feed['links'] = list() + feedtype = 'application/atom+xml' + if data.version.startswith('rss'): feedtype = 'application/rss+xml' + if data.version in ['rss090','rss10']: feedtype = 'application/rdf+xml' + for link in data.feed.links: + if link.rel == 'self': + link['type'] = feedtype + break + else: + data.feed.links.append(feedparser.FeedParserDict( + {'rel':'self', 'type':feedtype, 'href':feed})) for name, value in config.feed_options(feed).items(): data.feed['planet_'+name] = value @@ -272,6 +273,8 @@ def spiderFeed(feed): # report channel level errors if data.status == 226: if data.feed.has_key('planet_message'): del data.feed['planet_message'] + if feed_info.feed.has_key('planet_updated'): + data.feed['planet_updated'] = feed_info.feed['planet_updated'] elif data.status == 403: data.feed['planet_message'] = "403: forbidden" elif data.status == 404: From 28606f8b527febb64c3debe2190e8e58ee5c40fd Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Tue, 17 Oct 2006 21:08:18 -0400 Subject: [PATCH 18/53] Retain feed version across failures --- planet/spider.py | 1 + 1 file changed, 1 insertion(+) diff --git a/planet/spider.py b/planet/spider.py index 9a422a3..f27db0a 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -173,6 +173,7 @@ def spiderFeed(feed): if not data.version and feed_info.version: data.feed = feed_info.feed data.bozo = feed_info.feed.get('planet_bozo','true') == 'true' + data.version = feed_info.feed.get('planet_format') data.feed['planet_http_status'] = str(data.status) # capture etag and last-modified information From 20b0ba62ceb1f8dbdf42a02ed1fd48a036982e1b Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Wed, 18 Oct 2006 06:57:42 -0400 Subject: [PATCH 19/53] Ensure index is utf-8 --- planet/spider.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/planet/spider.py b/planet/spider.py index f27db0a..8fd10bd 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -249,8 +249,10 @@ def spiderFeed(feed): # optionally index if index != None: - index[filename('', entry.id)] = \ - data.feed.get('id', data.feed.get('link',None)) + feedid = data.feed.get('id', data.feed.get('link',None)) + if feedid: + if type(feedid) == unicode: feedid = feedid.encode('utf-8') + index[filename('', entry.id)] = feedid if index: index.close() From ce86fb15e6ce12ae200e6cb445f5da4882054f4c Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Wed, 18 Oct 2006 10:28:17 -0400 Subject: [PATCH 20/53] Continue processing entries even after one is filtered out Thanks: Harry Fuecks --- THANKS | 2 +- planet/spider.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/THANKS b/THANKS index 99e66ae..8a8e207 100644 --- a/THANKS +++ b/THANKS @@ -5,7 +5,7 @@ Jacques Distler - Template patches Michael Koziarski - HTTP Auth fix Brian Ewins - Win32 / Portalocker Joe Gregorio - Invoke same version of Python for filters -Harry Fuecks - Pipe characters in file names +Harry Fuecks - Pipe characters in file names, filter bug Eric van der Vlist - Filters to add language, category information This codebase represents a radical refactoring of Planet 2.0, which lists diff --git a/planet/spider.py b/planet/spider.py index 8fd10bd..da8253b 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -241,7 +241,8 @@ def spiderFeed(feed): xdoc.unlink() for filter in config.filters(feed): output = shell.run(filter, output, mode="filter") - if not output: return + if not output: break + if not output: continue # write out and timestamp the results write(output, cache_file) From f9e78f3d80153cd6b937fef8d0000a8bbe903564 Mon Sep 17 00:00:00 2001 From: Chris Dolan Date: Wed, 18 Oct 2006 15:32:56 -0500 Subject: [PATCH 21/53] - Auto-create the cache dir if it doesn't exist - template_directories defaults to '.' - Bugfix in xsltproc shell argument order - Add cache dir to .bzrignore, plus Mac .DS_Store file --- .bzrignore | 2 ++ planet/config.py | 6 +++--- planet/shell/xslt.py | 2 +- planet/spider.py | 2 ++ 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.bzrignore b/.bzrignore index f8b5310..1d1886c 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1 +1,3 @@ *.tmplc +.DS_Store +cache diff --git a/planet/config.py b/planet/config.py index 99d3cda..e81bf33 100644 --- a/planet/config.py +++ b/planet/config.py @@ -69,8 +69,8 @@ def __init__(): planet_predefined_options.append(name) # define a list planet-level variable - def define_planet_list(name): - setattr(config, name, lambda : expand(get(None,name,''))) + def define_planet_list(name, default=''): + setattr(config, name, lambda : expand(get(None,name,default))) planet_predefined_options.append(name) # define a string template-level variable @@ -100,7 +100,7 @@ def __init__(): define_planet_list('template_files') define_planet_list('bill_of_materials') - define_planet_list('template_directories') + define_planet_list('template_directories', '.') define_planet_list('filter_directories') # template options diff --git a/planet/shell/xslt.py b/planet/shell/xslt.py index ecdd673..d667598 100644 --- a/planet/shell/xslt.py +++ b/planet/shell/xslt.py @@ -55,7 +55,7 @@ def run(script, doc, output_file=None, options={}): cmdopts += ['--stringparam', key, quote(value, apos=r"\'")] os.system('xsltproc %s %s %s > %s' % - (script, ' '.join(cmdopts), docfile, output_file)) + (' '.join(cmdopts), script, docfile, output_file)) os.unlink(docfile) else: import sys diff --git a/planet/spider.py b/planet/spider.py index da8253b..974b82d 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -115,6 +115,8 @@ def spiderFeed(feed): # read cached feed info sources = config.cache_sources_directory() + if not os.path.exists(sources): + os.makedirs(sources, 0700) feed_source = filename(sources, feed) feed_info = feedparser.parse(feed_source) if feed_info.feed.get('planet_http_status',None) == '410': return From 13d47319c2e234a28beb8f35158123dfe56b7e74 Mon Sep 17 00:00:00 2001 From: Chris Dolan Date: Wed, 18 Oct 2006 21:04:23 -0500 Subject: [PATCH 22/53] Work on docs: - Add explicit index.html for file:// browsing - Add MacOSX+Fink instructions - More Planet migration details - Clean up docs header a little --- docs/docs.css | 4 ++++ docs/docs.js | 9 ++++----- docs/installation.html | 42 ++++++++++++++++++++++++++++++++++++++++-- docs/migration.html | 18 ++++++++++++++++++ 4 files changed, 66 insertions(+), 7 deletions(-) diff --git a/docs/docs.css b/docs/docs.css index 5049baa..916db69 100644 --- a/docs/docs.css +++ b/docs/docs.css @@ -49,6 +49,10 @@ ul, ul.outer > li { margin: -15px 0 20px -15px !important; } +.z .logo { + color: magenta; +} + .z p { margin: 14px 0 10px 15px !important; } diff --git a/docs/docs.js b/docs/docs.js index 229b13c..001f7c8 100644 --- a/docs/docs.js +++ b/docs/docs.js @@ -2,7 +2,6 @@ window.onload=function() { var vindex = document.URL.lastIndexOf('venus/'); if (vindex<0) vindex = document.URL.lastIndexOf('planet/'); var base = document.URL.substring(0,vindex+6); - if (vindex<0) vindex = '..'; var body = document.getElementsByTagName('body')[0]; var div = document.createElement('div'); @@ -10,7 +9,7 @@ window.onload=function() { var h1 = document.createElement('h1'); var span = document.createElement('span'); span.appendChild(document.createTextNode('\u2640')); - span.setAttribute('style','color: magenta'); + span.setAttribute('class','logo'); h1.appendChild(span); h1.appendChild(document.createTextNode(' Planet Venus')); @@ -24,17 +23,17 @@ window.onload=function() { p = document.createElement('p'); var a = document.createElement('a'); - a.setAttribute('href',base); + a.setAttribute('href',base+'index.html'); a.appendChild(document.createTextNode('Download')); p.appendChild(a); p.appendChild(document.createTextNode(" \u00b7 ")); a = document.createElement('a'); - a.setAttribute('href',base+'docs/'); + a.setAttribute('href',base+'docs/index.html'); a.appendChild(document.createTextNode('Documentation')); p.appendChild(a); p.appendChild(document.createTextNode(" \u00b7 ")); a = document.createElement('a'); - a.setAttribute('href',base+'tests/'); + a.setAttribute('href',base+'tests/index.html'); a.appendChild(document.createTextNode('Unit tests')); p.appendChild(a); p.appendChild(document.createTextNode(" \u00b7 ")); diff --git a/docs/installation.html b/docs/installation.html index 8d62ad7..233087b 100644 --- a/docs/installation.html +++ b/docs/installation.html @@ -29,11 +29,16 @@ module which was introduced in Python 2.4. librdf.

      -

      Instructions

      +

      General Instructions

      + +

      +These instructions apply to any platform. Check the instructions +below for more specific instructions for your platform. +

      1. If you are reading this online, you will need to -download and extract the files into a folder somewhere. +download and extract the files into a folder somewhere. You can place this wherever you like, ~/planet and ~/venus are good choices, but so's anywhere else you prefer.

      2. @@ -63,5 +68,38 @@ right directory.

      3. (Optional)

        Build your own themes, templates, or filters! And share!

      + +

      Mac OS X and Fink Instructions

      + +

      +The Fink Project packages +various open source software for MacOS. This makes it a little easier +to get started with projects like Planet Venus. +

      + +

      +Note: in the following, we recommend explicitly +using python2.4. As of this writing, Fink is starting to +support python2.5 but the XML libraries, for example, are +not yet ported to the newer python so Venus will be less featureful. +

      + +
        +
      1. Install the XCode development tools from your Mac OS X install + disks

      2. +
      3. Download + and install Fink

      4. +
      5. Tell fink to install the Planet Venus prerequisites:
        + fink install python24 celementtree-py24 bzr-py24 libxslt-py24 + libxml2-py24

      6. +
      7. Download and extract the Venus files into a + folder somewhere

      8. +
      9. Run the tests: python2.4 runtests.py
        This + will warn you that the RDF library is missing, but that's + OK.

      10. +
      11. Continue with the general steps above, starting with Step 3. You + may want to explicitly specify python2.4.

      12. +
      + diff --git a/docs/migration.html b/docs/migration.html index 36072f6..d97ce6e 100644 --- a/docs/migration.html +++ b/docs/migration.html @@ -19,6 +19,24 @@ of the cache has changed dramatically.
    • though some configuration options (e.g., days_per_page) have not yet been implemented
    • No testing has been done on Python 2.1, and it is presumed not to work.
    • +
    • To take advantage of all features, you should install the optional +XML and RDF libraries described on +the Installation page.
    • +
    + +

    +Common changes to config.ini include: +

    +
      +
    • Filename changes:
      +

      +examples/fancy/index.html.tmpl => themes/classic_fancy/index.html.tmpl
      +examples/atom.xml.tmpl         => themes/common/atom.xml.xslt
      +examples/rss20.xml.tmpl        => themes/common/rss20.xml.tmpl
      +examples/rss10.xml.tmpl        => themes/common/rss10.xml.tmpl
      +examples/opml.xml.tmpl         => themes/common/opml.xml.xslt
      +examples/foafroll.xml.tmpl     => themes/common/foafroll.xml.xslt
      +

    From 42a73b35e8ba594bc7fbc9e8c743f37f7b4d7eb9 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Wed, 18 Oct 2006 22:38:39 -0400 Subject: [PATCH 23/53] Enclosure support --- docs/templates.html | 4 ++++ planet/feedparser.py | 12 ++++++++---- planet/reconstitute.py | 2 ++ planet/shell/tmpl.py | 10 ++++++++++ tests/data/filter/tmpl/enclosure_href.xml | 11 +++++++++++ tests/data/filter/tmpl/enclosure_length.xml | 11 +++++++++++ tests/data/filter/tmpl/enclosure_type.xml | 11 +++++++++++ tests/data/reconstitute/enclosure.xml | 13 +++++++++++++ tests/data/reconstitute/link_length.xml | 11 +++++++++++ themes/common/rss20.xml.tmpl | 5 ++++- 10 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 tests/data/filter/tmpl/enclosure_href.xml create mode 100644 tests/data/filter/tmpl/enclosure_length.xml create mode 100644 tests/data/filter/tmpl/enclosure_type.xml create mode 100644 tests/data/reconstitute/enclosure.xml create mode 100644 tests/data/reconstitute/link_length.xml diff --git a/docs/templates.html b/docs/templates.html index 6a2fc32..8d34e1f 100644 --- a/docs/templates.html +++ b/docs/templates.html @@ -75,6 +75,10 @@ The data values within the Items array are as follows:

+ + + + diff --git a/planet/feedparser.py b/planet/feedparser.py index c5894f4..ef7d75a 100755 --- a/planet/feedparser.py +++ b/planet/feedparser.py @@ -218,6 +218,9 @@ class FeedParserDict(UserDict): def __getitem__(self, key): if key == 'category': return UserDict.__getitem__(self, 'tags')[0]['term'] + if key == 'enclosures': + norel = lambda link: FeedParserDict([(name,value) for (name,value) in link.items() if name!='rel']) + return [norel(link) for link in UserDict.__getitem__(self, 'links') if link['rel']=='enclosure'] if key == 'categories': return [(tag['scheme'], tag['term']) for tag in UserDict.__getitem__(self, 'tags')] realkey = self.keymap.get(key, key) @@ -1303,15 +1306,15 @@ class _FeedParserMixin: attrsD.setdefault('type', 'application/atom+xml') else: attrsD.setdefault('type', 'text/html') + context = self._getContext() attrsD = self._itsAnHrefDamnIt(attrsD) if attrsD.has_key('href'): attrsD['href'] = self.resolveURI(attrsD['href']) + if attrsD.get('rel')=='enclosure' and not context.get('id'): + context['id'] = attrsD.get('href') expectingText = self.infeed or self.inentry or self.insource - context = self._getContext() context.setdefault('links', []) context['links'].append(FeedParserDict(attrsD)) - if attrsD['rel'] == 'enclosure': - self._start_enclosure(attrsD) if attrsD.has_key('href'): expectingText = 0 if (attrsD.get('rel') == 'alternate') and (self.mapContentType(attrsD.get('type')) in self.html_types): @@ -1427,7 +1430,8 @@ class _FeedParserMixin: def _start_enclosure(self, attrsD): attrsD = self._itsAnHrefDamnIt(attrsD) context = self._getContext() - context.setdefault('enclosures', []).append(FeedParserDict(attrsD)) + attrsD['rel']='enclosure' + context.setdefault('links', []).append(FeedParserDict(attrsD)) href = attrsD.get('href') if href and not context.get('id'): context['id'] = href diff --git a/planet/reconstitute.py b/planet/reconstitute.py index 30a5cbb..92bbb59 100644 --- a/planet/reconstitute.py +++ b/planet/reconstitute.py @@ -100,6 +100,8 @@ def links(xentry, entry): xlink.setAttribute('type', link.get('type')) if link.has_key('rel'): xlink.setAttribute('rel', link.get('rel',None)) + if link.has_key('length'): + xlink.setAttribute('length', link.get('length')) xentry.appendChild(xlink) def date(xentry, name, parsed): diff --git a/planet/shell/tmpl.py b/planet/shell/tmpl.py index 81a79d5..620f45e 100644 --- a/planet/shell/tmpl.py +++ b/planet/shell/tmpl.py @@ -97,6 +97,9 @@ Items = [ ['date_822', Rfc822, 'updated_parsed'], ['date_iso', Rfc3399, 'published_parsed'], ['date_iso', Rfc3399, 'updated_parsed'], + ['enclosure_href', String, 'links', {'rel': 'enclosure'}, 'href'], + ['enclosure_length', String, 'links', {'rel': 'enclosure'}, 'length'], + ['enclosure_type', String, 'links', {'rel': 'enclosure'}, 'type'], ['id', String, 'id'], ['link', String, 'links', {'rel': 'alternate'}, 'href'], ['new_channel', String, 'id'], @@ -190,6 +193,13 @@ def template_info(source): for entry in data.entries: output['Items'].append(tmpl_mapper(entry, Items)) + # synthesize isPermaLink attribute + for item in output['Items']: + if item.get('id') == item.get('link'): + item['guid_isPermaLink']='true' + else: + item['guid_isPermaLink']='false' + # feed level information output['generator'] = config.generator_uri() output['name'] = config.name() diff --git a/tests/data/filter/tmpl/enclosure_href.xml b/tests/data/filter/tmpl/enclosure_href.xml new file mode 100644 index 0000000..98b77f7 --- /dev/null +++ b/tests/data/filter/tmpl/enclosure_href.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/tests/data/filter/tmpl/enclosure_length.xml b/tests/data/filter/tmpl/enclosure_length.xml new file mode 100644 index 0000000..e4a4191 --- /dev/null +++ b/tests/data/filter/tmpl/enclosure_length.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/tests/data/filter/tmpl/enclosure_type.xml b/tests/data/filter/tmpl/enclosure_type.xml new file mode 100644 index 0000000..32f35ef --- /dev/null +++ b/tests/data/filter/tmpl/enclosure_type.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/tests/data/reconstitute/enclosure.xml b/tests/data/reconstitute/enclosure.xml new file mode 100644 index 0000000..8820d09 --- /dev/null +++ b/tests/data/reconstitute/enclosure.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/tests/data/reconstitute/link_length.xml b/tests/data/reconstitute/link_length.xml new file mode 100644 index 0000000..a6617ac --- /dev/null +++ b/tests/data/reconstitute/link_length.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/themes/common/rss20.xml.tmpl b/themes/common/rss20.xml.tmpl index 81cbffb..724a104 100644 --- a/themes/common/rss20.xml.tmpl +++ b/themes/common/rss20.xml.tmpl @@ -10,7 +10,7 @@ <TMPL_VAR channel_name ESCAPE="HTML"><TMPL_IF title>: <TMPL_VAR title_plain ESCAPE="HTML"></TMPL_IF> - + @@ -23,6 +23,9 @@ + + " length="" type=""/> + From 7310e14ee5f099f8d87b401283782ba2e9430cab Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Thu, 19 Oct 2006 11:55:33 -0400 Subject: [PATCH 24/53] Add an "only-if-new" option to planet --- planet.py | 6 +++++- planet/spider.py | 7 ++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/planet.py b/planet.py index d3346e1..d4d5976 100755 --- a/planet.py +++ b/planet.py @@ -20,6 +20,7 @@ if __name__ == "__main__": config_file = "config.ini" offline = 0 verbose = 0 + only_if_new = 0 for arg in sys.argv[1:]: if arg == "-h" or arg == "--help": @@ -29,12 +30,15 @@ if __name__ == "__main__": print " -v, --verbose DEBUG level logging during update" print " -o, --offline Update the Planet from the cache only" print " -h, --help Display this help message and exit" + print " -n, --only-if-new Only spider new feeds" print sys.exit(0) elif arg == "-v" or arg == "--verbose": verbose = 1 elif arg == "-o" or arg == "--offline": offline = 1 + elif arg == "-n" or arg == "--only-if-new": + only_if_new = 1 elif arg.startswith("-"): print >>sys.stderr, "Unknown option:", arg sys.exit(1) @@ -50,7 +54,7 @@ if __name__ == "__main__": if not offline: from planet import spider - spider.spiderPlanet() + spider.spiderPlanet(only_if_new=only_if_new) from planet import splice doc = splice.splice() diff --git a/planet/spider.py b/planet/spider.py index 974b82d..a098aee 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -109,7 +109,7 @@ def scrub(feed, data): source.author_detail['name'] = \ str(stripHtml(source.author_detail.name)) -def spiderFeed(feed): +def spiderFeed(feed, only_if_new=0): """ Spider (fetch) a single feed """ log = planet.logger @@ -119,6 +119,7 @@ def spiderFeed(feed): os.makedirs(sources, 0700) feed_source = filename(sources, feed) feed_info = feedparser.parse(feed_source) + if feed_info.feed and only_if_new: return if feed_info.feed.get('planet_http_status',None) == '410': return # read feed itself @@ -302,7 +303,7 @@ def spiderFeed(feed): write(xdoc.toxml('utf-8'), filename(sources, feed)) xdoc.unlink() -def spiderPlanet(): +def spiderPlanet(only_if_new = False): """ Spider (fetch) an entire planet """ log = planet.getLogger(config.log_level()) planet.setTimeout(config.feed_timeout()) @@ -312,7 +313,7 @@ def spiderPlanet(): for feed in config.subscriptions(): try: - spiderFeed(feed) + spiderFeed(feed, only_if_new=only_if_new) except Exception,e: import sys, traceback type, value, tb = sys.exc_info() From a7dda2a59b6dfbb823232b8a33334e8b726c53c3 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Thu, 19 Oct 2006 11:58:50 -0400 Subject: [PATCH 25/53] Add log message --- planet/spider.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/planet/spider.py b/planet/spider.py index a098aee..bf94d48 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -119,7 +119,9 @@ def spiderFeed(feed, only_if_new=0): os.makedirs(sources, 0700) feed_source = filename(sources, feed) feed_info = feedparser.parse(feed_source) - if feed_info.feed and only_if_new: return + if feed_info.feed and only_if_new: + log.info("Feed %s already in cache", feed) + return if feed_info.feed.get('planet_http_status',None) == '410': return # read feed itself From dc2524cd9d5fb729ed81ca56b77c658ca8a91437 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Thu, 19 Oct 2006 13:46:33 -0400 Subject: [PATCH 26/53] Allow reading list parser to be a 'filter' --- planet/config.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/planet/config.py b/planet/config.py index e81bf33..f9fab41 100644 --- a/planet/config.py +++ b/planet/config.py @@ -178,6 +178,12 @@ def load(config_file): opml.opml2config(data, cached_config) elif content_type(list).find('foaf')>=0: foaf.foaf2config(data, cached_config) + else: + from planet import shell + import StringIO + cached_config.readfp(StringIO.StringIO(shell.run( + content_type(list), data.getvalue(), mode="filter"))) + if cached_config.sections() in [[], [list]]: raise Exception @@ -314,7 +320,7 @@ def reading_lists(): for section in parser.sections(): if parser.has_option(section, 'content_type'): type = parser.get(section, 'content_type') - if type.find('opml')>=0 or type.find('foaf')>=0: + if type.find('opml')>=0 or type.find('foaf')>=0 or type.find('.')>=0: result.append(section) return result From 4010d2d42d77e57ae69d873c872146b9fa34cc65 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Fri, 20 Oct 2006 09:53:04 -0400 Subject: [PATCH 27/53] config: log_format only run templates once ensure idindexes are strings, not unicode --- docs/config.html | 4 ++++ planet.py | 2 +- planet/__init__.py | 4 ++-- planet/compat_logging/__init__.py | 4 ++-- planet/config.py | 11 ++++++++--- planet/shell/__init__.py | 2 +- planet/spider.py | 4 +++- planet/splice.py | 4 ++-- runtests.py | 2 +- tests/capture.py | 2 +- tests/test_idindex.py | 9 +++++++++ tests/test_spider.py | 2 +- tests/test_themes.py | 5 +++-- 13 files changed, 38 insertions(+), 17 deletions(-) diff --git a/docs/config.html b/docs/config.html index 70c6710..06d3083 100644 --- a/docs/config.html +++ b/docs/config.html @@ -90,6 +90,10 @@ number of days will be marked as inactive
log_level
One of DEBUG, INFO, WARNING, ERROR or CRITICAL
+
log_format
+
format string to +use for logging output. Note: this configuration value is processed +raw
feed_timeout
Number of seconds to wait for any given feed
new_feed_items
diff --git a/planet.py b/planet.py index d4d5976..62fb7ac 100755 --- a/planet.py +++ b/planet.py @@ -50,7 +50,7 @@ if __name__ == "__main__": if verbose: import planet - planet.getLogger('DEBUG') + planet.getLogger('DEBUG',config.log_format()) if not offline: from planet import spider diff --git a/planet/__init__.py b/planet/__init__.py index 444b30b..6be34ed 100644 --- a/planet/__init__.py +++ b/planet/__init__.py @@ -9,7 +9,7 @@ config.__init__() from ConfigParser import ConfigParser from urlparse import urljoin -def getLogger(level): +def getLogger(level, format): """ get a logger with the specified log level """ global logger if logger: return logger @@ -19,7 +19,7 @@ def getLogger(level): except: import compat_logging as logging - logging.basicConfig() + logging.basicConfig(format=format) logging.getLogger().setLevel(logging.getLevelName(level)) logger = logging.getLogger("planet.runner") try: diff --git a/planet/compat_logging/__init__.py b/planet/compat_logging/__init__.py index 3bd0c6d..3b83493 100644 --- a/planet/compat_logging/__init__.py +++ b/planet/compat_logging/__init__.py @@ -1090,7 +1090,7 @@ Logger.manager = Manager(Logger.root) BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s" -def basicConfig(): +def basicConfig(format=BASIC_FORMAT): """ Do basic configuration for the logging system by creating a StreamHandler with a default Formatter and adding it to the @@ -1098,7 +1098,7 @@ def basicConfig(): """ if len(root.handlers) == 0: hdlr = StreamHandler() - fmt = Formatter(BASIC_FORMAT) + fmt = Formatter(format) hdlr.setFormatter(fmt) root.addHandler(hdlr) diff --git a/planet/config.py b/planet/config.py index f9fab41..5c8ffe3 100644 --- a/planet/config.py +++ b/planet/config.py @@ -43,6 +43,8 @@ def __init__(): if section and parser.has_option(section, option): return parser.get(section, option) elif parser.has_option('Planet', option): + if option == 'log_format': + return parser.get('Planet', option, raw=True) return parser.get('Planet', option) else: return default @@ -88,6 +90,7 @@ def __init__(): define_planet('link', '') define_planet('cache_directory', "cache") define_planet('log_level', "WARNING") + define_planet('log_format', "%(levelname)s:%(name)s:%(message)s") define_planet('feed_timeout', 20) define_planet('date_format', "%B %d, %Y %I:%M %p") define_planet('new_date_format', "%B %d, %Y") @@ -123,7 +126,7 @@ def load(config_file): import config, planet from planet import opml, foaf - log = planet.getLogger(config.log_level()) + log = planet.getLogger(config.log_level(),config.log_format()) # Theme support theme = config.output_theme() @@ -146,10 +149,11 @@ def load(config_file): # complete search list for theme directories dirs += [os.path.join(theme_dir,dir) for dir in - config.template_directories()] + config.template_directories() if dir not in dirs] # merge configurations, allowing current one to override theme template_files = config.template_files() + parser.set('Planet','template_files','') parser.read(config_file) for file in config.bill_of_materials(): if not file in bom: bom.append(file) @@ -334,7 +338,8 @@ def filters(section=None): def planet_options(): """ dictionary of planet wide options""" - return dict(map(lambda opt: (opt, parser.get('Planet',opt)), + return dict(map(lambda opt: (opt, + parser.get('Planet', opt, raw=(opt=="log_format"))), parser.options('Planet'))) def feed_options(section): diff --git a/planet/shell/__init__.py b/planet/shell/__init__.py index bd0e005..8a6fcfa 100644 --- a/planet/shell/__init__.py +++ b/planet/shell/__init__.py @@ -6,7 +6,7 @@ logged_modes = [] def run(template_file, doc, mode='template'): """ select a template module based on file extension and execute it """ - log = planet.getLogger(planet.config.log_level()) + log = planet.getLogger(planet.config.log_level(),planet.config.log_format()) if mode == 'template': dirs = planet.config.template_directories() diff --git a/planet/spider.py b/planet/spider.py index bf94d48..ce473ee 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -31,6 +31,8 @@ def filename(directory, filename): filename=filename.encode('idna') except: pass + if isinstance(filename,unicode): + filename=filename.encode('utf-8') filename = re_url_scheme.sub("", filename) filename = re_slash.sub(",", filename) filename = re_initial_cruft.sub("", filename) @@ -307,7 +309,7 @@ def spiderFeed(feed, only_if_new=0): def spiderPlanet(only_if_new = False): """ Spider (fetch) an entire planet """ - log = planet.getLogger(config.log_level()) + log = planet.getLogger(config.log_level(),config.log_format()) planet.setTimeout(config.feed_timeout()) global index diff --git a/planet/splice.py b/planet/splice.py index e95d57f..e50f927 100644 --- a/planet/splice.py +++ b/planet/splice.py @@ -9,7 +9,7 @@ from planet import idindex def splice(): """ Splice together a planet from a cache of entries """ import planet - log = planet.getLogger(config.log_level()) + log = planet.getLogger(config.log_level(),config.log_format()) log.info("Loading cached data") cache = config.cache_directory() @@ -97,7 +97,7 @@ def splice(): def apply(doc): output_dir = config.output_dir() if not os.path.exists(output_dir): os.makedirs(output_dir) - log = planet.getLogger(config.log_level()) + log = planet.getLogger(config.log_level(),config.log_format()) # Go-go-gadget-template for template_file in config.template_files(): diff --git a/runtests.py b/runtests.py index 3ebe331..1e866cb 100755 --- a/runtests.py +++ b/runtests.py @@ -23,7 +23,7 @@ modules = map(fullmodname, glob.glob(os.path.join('tests', 'test_*.py'))) # enable warnings import planet -planet.getLogger("WARNING") +planet.getLogger("WARNING",None) # load all of the tests into a suite try: diff --git a/tests/capture.py b/tests/capture.py index 1e577b6..0ea3473 100755 --- a/tests/capture.py +++ b/tests/capture.py @@ -18,7 +18,7 @@ os.chdir(sys.path[0]) # copy spider output to splice input import planet from planet import spider, config -planet.getLogger('CRITICAL') +planet.getLogger('CRITICAL',None) config.load('tests/data/spider/config.ini') spider.spiderPlanet() diff --git a/tests/test_idindex.py b/tests/test_idindex.py index d27cf18..0de818d 100644 --- a/tests/test_idindex.py +++ b/tests/test_idindex.py @@ -8,6 +8,15 @@ class idIndexTest(unittest.TestCase): def tearDown(self): idindex.destroy() + def test_unicode(self): + from planet.spider import filename + index = idindex.create() + iri = 'http://www.\xe8\xa9\xb9\xe5\xa7\x86\xe6\x96\xaf.com/' + index[filename('', iri)] = 'data' + index[filename('', iri.decode('utf-8'))] = 'data' + index[filename('', u'1234')] = 'data' + index.close() + def test_index_spider(self): import test_spider config.load(test_spider.configfile) diff --git a/tests/test_spider.py b/tests/test_spider.py index 01e730a..1230c23 100644 --- a/tests/test_spider.py +++ b/tests/test_spider.py @@ -13,7 +13,7 @@ class SpiderTest(unittest.TestCase): def setUp(self): # silence errors planet.logger = None - planet.getLogger('CRITICAL') + planet.getLogger('CRITICAL',None) try: os.makedirs(workdir) diff --git a/tests/test_themes.py b/tests/test_themes.py index 4f171ed..de70c59 100644 --- a/tests/test_themes.py +++ b/tests/test_themes.py @@ -4,7 +4,7 @@ import unittest from planet import config from os.path import split -class ConfigTest(unittest.TestCase): +class ThemesTest(unittest.TestCase): def setUp(self): config.load('tests/data/config/themed.ini') @@ -17,7 +17,8 @@ class ConfigTest(unittest.TestCase): # administrivia def test_template(self): - self.assertTrue('index.html.xslt' in config.template_files()) + self.assertEqual(1, len([1 for file in config.template_files() + if file == 'index.html.xslt'])) def test_feeds(self): feeds = config.subscriptions() From 6244c1f49a8e19de19d231bdf8c020f9959c8b01 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Fri, 20 Oct 2006 11:27:56 -0400 Subject: [PATCH 28/53] Silence an expected error during testing --- THANKS | 1 + tests/test_idindex.py | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/THANKS b/THANKS index 8a8e207..6830275 100644 --- a/THANKS +++ b/THANKS @@ -7,6 +7,7 @@ Brian Ewins - Win32 / Portalocker Joe Gregorio - Invoke same version of Python for filters Harry Fuecks - Pipe characters in file names, filter bug Eric van der Vlist - Filters to add language, category information +Chris Dolan - mkdir cache; default template_dirs; fix xsltproc This codebase represents a radical refactoring of Planet 2.0, which lists the following contributors: diff --git a/tests/test_idindex.py b/tests/test_idindex.py index 0de818d..a383eb6 100644 --- a/tests/test_idindex.py +++ b/tests/test_idindex.py @@ -5,6 +5,12 @@ from planet import idindex, config, logger class idIndexTest(unittest.TestCase): + def setUp(self): + # silence errors + import planet + planet.logger = None + planet.getLogger('CRITICAL',None) + def tearDown(self): idindex.destroy() From e1b6a5ee8383b6f078e7277216f25bb9483e8fe9 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Fri, 20 Oct 2006 12:40:03 -0400 Subject: [PATCH 29/53] RSS 2.0 template in XSLT format --- THANKS | 1 + docs/config.html | 2 +- themes/common/rss20.xml.xslt | 238 +++++++++++++++++++++++++++++++++++ 3 files changed, 240 insertions(+), 1 deletion(-) create mode 100644 themes/common/rss20.xml.xslt diff --git a/THANKS b/THANKS index 6830275..dc58e7b 100644 --- a/THANKS +++ b/THANKS @@ -8,6 +8,7 @@ Joe Gregorio - Invoke same version of Python for filters Harry Fuecks - Pipe characters in file names, filter bug Eric van der Vlist - Filters to add language, category information Chris Dolan - mkdir cache; default template_dirs; fix xsltproc +David Sifry - rss 2.0 xslt template based on http://atom.geekhood.net/ This codebase represents a radical refactoring of Planet 2.0, which lists the following contributors: diff --git a/docs/config.html b/docs/config.html index 06d3083..b20d28c 100644 --- a/docs/config.html +++ b/docs/config.html @@ -50,7 +50,7 @@ are either new or implemented differently by Venus.

-
theme
+
output_theme
Directory containing a config.ini file which is merged with this one. This is typically used to specify templating and bill of material information.
diff --git a/themes/common/rss20.xml.xslt b/themes/common/rss20.xml.xslt new file mode 100644 index 0000000..7f1576e --- /dev/null +++ b/themes/common/rss20.xml.xslt @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + (converted from Atom 1.0) + + + + + + + + + + + + Atom 1.0 XSLT Transform v1 (http://atom.geekhood.net/) + + + + + + + + + + + + <x:call-template name="asHTML" /> + + + + + v () + + + + + + + + + + + + + + + + false + + + + + + + + + + <x:apply-templates select="../atom:title" mode="asText" /> + + + + + + + + + ( ) + + + + + + + + + + + + + + + + + + source: + + + + + + + + + + + + + + + + + + + (...) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <![CDATA[ + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <> + + + + <></> + + + + ="" + + + + + <![CDATA[ + + ]]> + + + + + + + + + + Unknown element + + + + + + + + + + , + + + + + :: GMT + + + + + + From 5da7e1377692d53c675ee9f21ef7d8019d6ae856 Mon Sep 17 00:00:00 2001 From: Joe Gregorio Date: Fri, 20 Oct 2006 13:58:36 -0400 Subject: [PATCH 30/53] Added --quiet, -q, -v and --verbose command-line options to running tests. --- runtests.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/runtests.py b/runtests.py index 1e866cb..d14058d 100755 --- a/runtests.py +++ b/runtests.py @@ -33,5 +33,11 @@ except Exception, exception: for module in modules: __import__(module) raise +verbosity = 1 +if "-q" in sys.argv or '--quiet' in sys.argv: + verbosity = 0 +if "-v" in sys.argv or '--verbose' in sys.argv: + verbosity = 2 + # run test suite -unittest.TextTestRunner().run(suite) +unittest.TextTestRunner(verbosity=verbosity).run(suite) From 9f69ac1c303a423c9df5ab8e4cb5122b52e311a3 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Sun, 22 Oct 2006 17:23:28 -0400 Subject: [PATCH 31/53] Warn if libxslt is not available --- tests/test_filter_xslt.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_filter_xslt.py b/tests/test_filter_xslt.py index ca7994e..061f805 100644 --- a/tests/test_filter_xslt.py +++ b/tests/test_filter_xslt.py @@ -20,6 +20,9 @@ try: except: try: from subprocess import Popen, PIPE - except ImportError: + xsltproc=Popen(['xsltproc','--version'],stdout=PIPE,stderr=PIPE) + xsltproc.communicate() + if xsltproc.returncode != 0: raise ImportError + except: logger.warn("libxslt is not available => can't test xslt filters") del XsltFilterTests.test_xslt_filter From 0a5015d657eb0ccbe744f89b7e2b67da6adb8723 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Sun, 22 Oct 2006 17:48:37 -0400 Subject: [PATCH 32/53] Allow filter parameters to be passed "URI style" --- docs/filters.html | 11 +++++++++-- planet/shell/__init__.py | 9 +++++++++ tests/data/filter/excerpt-images2.ini | 2 ++ tests/data/filter/xpath-sifter2.ini | 2 ++ tests/test_filters.py | 22 ++++++++++++++++++---- 5 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 tests/data/filter/excerpt-images2.ini create mode 100644 tests/data/filter/xpath-sifter2.ini diff --git a/docs/filters.html b/docs/filters.html index 90cc799..2ec73e0 100644 --- a/docs/filters.html +++ b/docs/filters.html @@ -32,12 +32,19 @@ types of advertisements that you may find in feeds.

the form of a planet:excerpt element) to the feed itself. You can see examples of how parameters are passed to this program in either excerpt-images or -opml-top100.ini.

+opml-top100.ini. +Alternately parameters may be passed +URI style, for example: +excerpt-images2. +

The xpath sifter is a variation of the above, including or excluding feeds based on the presence (or absence) of data specified by xpath -expressions.

+expressions. Again, parameters can be passed as +config options or +URI style. +

Notes

diff --git a/planet/shell/__init__.py b/planet/shell/__init__.py index 8a6fcfa..18c764a 100644 --- a/planet/shell/__init__.py +++ b/planet/shell/__init__.py @@ -13,6 +13,14 @@ def run(template_file, doc, mode='template'): else: dirs = planet.config.filter_directories() + # parse out "extra" options + if template_file.find('?') < 0: + extra_options = {} + else: + import cgi + template_file, extra_options = template_file.split('?',1) + extra_options = dict(cgi.parse_qsl(extra_options)) + # see if the template can be located for template_dir in dirs: template_resolved = os.path.join(template_dir, template_file) @@ -43,6 +51,7 @@ def run(template_file, doc, mode='template'): # Execute the shell module options = planet.config.template_options(template_file) + options.update(extra_options) log.debug("Processing %s %s using %s", mode, os.path.realpath(template_resolved), module_name) if mode == 'filter': diff --git a/tests/data/filter/excerpt-images2.ini b/tests/data/filter/excerpt-images2.ini new file mode 100644 index 0000000..051faf0 --- /dev/null +++ b/tests/data/filter/excerpt-images2.ini @@ -0,0 +1,2 @@ +[Planet] +filters = excerpt.py?omit=img diff --git a/tests/data/filter/xpath-sifter2.ini b/tests/data/filter/xpath-sifter2.ini new file mode 100644 index 0000000..ad676f5 --- /dev/null +++ b/tests/data/filter/xpath-sifter2.ini @@ -0,0 +1,2 @@ +[Planet] +filters = xpath_sifter.py?require=//atom%3Acategory%5B%40term%3D%27two%27%5D diff --git a/tests/test_filters.py b/tests/test_filters.py index aac71f2..55361eb 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -14,10 +14,16 @@ class FilterTests(unittest.TestCase): imgsrc = dom.getElementsByTagName('img')[0].getAttribute('src') self.assertEqual('http://example.com.nyud.net:8080/foo.png', imgsrc) - def test_excerpt_images(self): - testfile = 'tests/data/filter/excerpt-images.xml' + def test_excerpt_images1(self): config.load('tests/data/filter/excerpt-images.ini') + self.verify_images() + def test_excerpt_images2(self): + config.load('tests/data/filter/excerpt-images2.ini') + self.verify_images() + + def verify_images(self): + testfile = 'tests/data/filter/excerpt-images.xml' output = open(testfile).read() for filter in config.filters(): output = shell.run(filter, output, mode="filter") @@ -58,8 +64,15 @@ class FilterTests(unittest.TestCase): self.assertEqual(u'before--after', excerpt.firstChild.firstChild.nodeValue) - def test_xpath_filter(self): + def test_xpath_filter1(self): config.load('tests/data/filter/xpath-sifter.ini') + self.verify_xpath() + + def test_xpath_filter2(self): + config.load('tests/data/filter/xpath-sifter2.ini') + self.verify_xpath() + + def verify_xpath(self): testfile = 'tests/data/filter/category-one.xml' output = open(testfile).read() @@ -89,7 +102,8 @@ try: import libxml2 except: logger.warn("libxml2 is not available => can't test xpath_sifter") - del FilterTests.test_xpath_filter + del FilterTests.test_xpath_filter1 + del FilterTests.test_xpath_filter2 except ImportError: logger.warn("Popen is not available => can't test standard filters") From 6ae4fad6e34cc4173be5053c8da041e70631e1dd Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Sun, 22 Oct 2006 18:08:56 -0400 Subject: [PATCH 33/53] Handle WordPress Link Manager dialect of OPML --- THANKS | 1 + planet/opml.py | 4 ++++ tests/test_opml.py | 8 ++++++++ 3 files changed, 13 insertions(+) diff --git a/THANKS b/THANKS index dc58e7b..2699c41 100644 --- a/THANKS +++ b/THANKS @@ -9,6 +9,7 @@ Harry Fuecks - Pipe characters in file names, filter bug Eric van der Vlist - Filters to add language, category information Chris Dolan - mkdir cache; default template_dirs; fix xsltproc David Sifry - rss 2.0 xslt template based on http://atom.geekhood.net/ +Morten Fredericksen - Support WordPress LinkManager OPML This codebase represents a radical refactoring of Planet 2.0, which lists the following contributors: diff --git a/planet/opml.py b/planet/opml.py index d4e9a54..6e0b02a 100755 --- a/planet/opml.py +++ b/planet/opml.py @@ -48,6 +48,10 @@ class OpmlParser(ContentHandler,SGMLParser): # this is an entry in a subscription list, but some leave this # attribute off, and others have placed 'atom' in here if attrs.has_key('type'): + if attrs['type'] == 'link' and not attrs.has_key('url'): + # Auto-correct WordPress link manager OPML files + attrs = dict(attrs.items()) + attrs['type'] = 'rss' if attrs['type'].lower() not in['rss','atom']: return # The feed itself is supposed to be in an attribute named 'xmlUrl' diff --git a/tests/test_opml.py b/tests/test_opml.py index a34a4e8..0111253 100644 --- a/tests/test_opml.py +++ b/tests/test_opml.py @@ -76,6 +76,14 @@ class OpmlTest(unittest.TestCase): text="sample feed"/>''', self.config) self.assertFalse(self.config.has_section("http://example.com/feed.xml")) + def test_WordPress_link_manager(self): + # http://www.wasab.dk/morten/blog/archives/2006/10/22/wp-venus + opml2config('''''', self.config) + self.assertEqual('sample feed', + self.config.get("http://example.com/feed.xml", 'name')) + # # xmlUrl # From 3abadca2b5f2910b921ca9fd35aff230674cefde Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Mon, 23 Oct 2006 17:48:18 -0400 Subject: [PATCH 34/53] Respect feed level language --- planet/reconstitute.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/planet/reconstitute.py b/planet/reconstitute.py index 92bbb59..3707d6d 100644 --- a/planet/reconstitute.py +++ b/planet/reconstitute.py @@ -206,6 +206,8 @@ def reconstitute(feed, entry): if entry.has_key('language'): xentry.setAttribute('xml:lang', entry.language) + elif feed.feed.has_key('language'): + xentry.setAttribute('xml:lang', feed.feed.language) id(xentry, entry) links(xentry, entry) From ce4085889edb4834cc86e5773cb8c1dbc5781148 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Mon, 23 Oct 2006 23:23:08 -0400 Subject: [PATCH 35/53] Forgotten test case --- docs/docs.js | 2 +- tests/data/reconstitute/rss_lang.xml | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 tests/data/reconstitute/rss_lang.xml diff --git a/docs/docs.js b/docs/docs.js index 001f7c8..efd6d3f 100644 --- a/docs/docs.js +++ b/docs/docs.js @@ -33,7 +33,7 @@ window.onload=function() { p.appendChild(a); p.appendChild(document.createTextNode(" \u00b7 ")); a = document.createElement('a'); - a.setAttribute('href',base+'tests/index.html'); + a.setAttribute('href',base+'tests/'); a.appendChild(document.createTextNode('Unit tests')); p.appendChild(a); p.appendChild(document.createTextNode(" \u00b7 ")); diff --git a/tests/data/reconstitute/rss_lang.xml b/tests/data/reconstitute/rss_lang.xml new file mode 100644 index 0000000..7501cf0 --- /dev/null +++ b/tests/data/reconstitute/rss_lang.xml @@ -0,0 +1,14 @@ + + + + + en + + foo + + + + From fdaf129f9b5cead71c29074ae527ca144062800e Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Wed, 25 Oct 2006 10:09:11 -0400 Subject: [PATCH 36/53] Support dc:description --- planet/feedparser.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/planet/feedparser.py b/planet/feedparser.py index ef7d75a..00675e1 100755 --- a/planet/feedparser.py +++ b/planet/feedparser.py @@ -11,7 +11,7 @@ Recommended: Python 2.3 or later Recommended: CJKCodecs and iconv_codec """ -__version__ = "4.2-pre-" + "$Revision: 1.142 $"[11:16] + "-cvs" +__version__ = "4.2-pre-" + "$Revision: 1.144 $"[11:16] + "-cvs" __license__ = """Copyright (c) 2002-2006, Mark Pilgrim, All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -1360,6 +1360,7 @@ class _FeedParserMixin: self._start_content(attrsD) else: self.pushContent('description', attrsD, 'text/html', self.infeed or self.inentry or self.insource) + _start_dc_description = _start_description def _start_abstract(self, attrsD): self.pushContent('description', attrsD, 'text/plain', self.infeed or self.inentry or self.insource) @@ -1371,6 +1372,7 @@ class _FeedParserMixin: value = self.popContent('description') self._summaryKey = None _end_abstract = _end_description + _end_dc_description = _end_description def _start_info(self, attrsD): self.pushContent('info', attrsD, 'text/plain', 1) From 2529bdd36a1cb4d3026495afb4600c970e201a90 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Wed, 25 Oct 2006 12:20:28 -0400 Subject: [PATCH 37/53] Add xml:lang to list of scrubbable attributes --- docs/normalization.html | 5 ++-- planet/reconstitute.py | 2 +- planet/spider.py | 6 +++++ tests/reconstitute.py | 51 +++++++++++++++++++++++++++++++++++++++++ tests/test_scrub.py | 6 +++-- 5 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 tests/reconstitute.py diff --git a/docs/normalization.html b/docs/normalization.html index 5577899..de73812 100644 --- a/docs/normalization.html +++ b/docs/normalization.html @@ -78,8 +78,9 @@ be corrected automatically, and for these, there are configuration parameters that can be used to help.

VARtypesource
VARtypesource
authorStringauthor
author_emailStringauthor_detail.email
author_nameStringauthor_detail.name
updated_parsed
date_isoRfc3399published_parsed
updated_parsed
enclosure_hrefStringenclosures[0].href
enclosure_lengthStringenclosures[0].length
enclosure_typeStringenclosures[0].type
guid_isPermaLinkStringisPermaLink
idStringid
linkStringlinks[rel='alternate'].href
new_channelStringid
+ + + + + + + + + + + + + + +
NameFormatNotes
+ + + + + + + + rss_0_90 + rss_0_91 + rss_0_91 + rss_1_0 + rss_0_90 + + rss_0_90 + rss_2_0 + rss_2_0 + + + atom_0_3 + atom_1_0 + atom_1_0 + + + + + + + + + #FCC + + + + + http://feedvalidator.org/check?url= + + + + + + + + + + + + + + http://www.validome.org/rss-atom/validate? + viewSourceCode=1&version= + + &url= + + + + + + + + + + + + + + + + + message + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ +
+ + + From 41fd17f2c42a8887e94df0cd34324222d4fe9930 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Sat, 11 Nov 2006 13:16:31 -0500 Subject: [PATCH 52/53] Continue to tweak logic to get entry updated time --- planet/spider.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/planet/spider.py b/planet/spider.py index fec376c..aff3884 100644 --- a/planet/spider.py +++ b/planet/spider.py @@ -255,9 +255,7 @@ def spiderFeed(feed, only_if_new=0): except: if data.feed.has_key('updated_parsed'): mtime = calendar.timegm(data.feed.updated_parsed) - else: - mtime = time.time() - if mtime > time.time(): mtime = None + if not mtime or mtime > time.time(): mtime = time.time() entry['updated_parsed'] = time.gmtime(mtime) # apply any filters From 88fd1b80caa7e8091756a1cbba846dfb4cc32ddc Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Sat, 11 Nov 2006 22:23:31 -0500 Subject: [PATCH 53/53] support feedburner origlink relationship --- planet/reconstitute.py | 8 ++++++++ tests/data/reconstitute/feedburner_origlink.xml | 12 ++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 tests/data/reconstitute/feedburner_origlink.xml diff --git a/planet/reconstitute.py b/planet/reconstitute.py index 5841859..989a107 100644 --- a/planet/reconstitute.py +++ b/planet/reconstitute.py @@ -231,6 +231,14 @@ def reconstitute(feed, entry): for tag in entry.get('tags',[]): category(xentry, tag) + # known, simple text extensions + for ns,name in [('feedburner','origlink')]: + if entry.has_key('%s_%s' % (ns,name)) and \ + feed.namespaces.has_key(ns): + xoriglink = createTextElement(xentry, '%s:%s' % (ns,name), + entry['%s_%s' % (ns,name)]) + xoriglink.setAttribute('xmlns:%s' % ns, feed.namespaces[ns]) + author_detail = entry.get('author_detail',{}) if author_detail and not author_detail.has_key('name') and \ feed.feed.has_key('planet_name'): diff --git a/tests/data/reconstitute/feedburner_origlink.xml b/tests/data/reconstitute/feedburner_origlink.xml new file mode 100644 index 0000000..fc98eeb --- /dev/null +++ b/tests/data/reconstitute/feedburner_origlink.xml @@ -0,0 +1,12 @@ + + + + + http://example.com/1 + + +