From 3b5d896ce2e79410ea26b358007918a0c44bac2b Mon Sep 17 00:00:00 2001 From: montefra Date: Mon, 2 Mar 2015 14:39:18 +0100 Subject: [PATCH 001/238] todo list: link only --- sphinx/ext/todo.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sphinx/ext/todo.py b/sphinx/ext/todo.py index 2e91c9eaf..9c54e37d5 100644 --- a/sphinx/ext/todo.py +++ b/sphinx/ext/todo.py @@ -110,9 +110,12 @@ def process_todo_nodes(app, doctree, fromdocname): for todo_info in env.todo_all_todos: para = nodes.paragraph(classes=['todo-source']) - description = _('(The <> is located in ' - ' %s, line %d.)') % \ - (todo_info['source'], todo_info['lineno']) + if app.config['todo_link_only']: + description = _('<>') + else: + description = _('(The <> is located in ' + ' %s, line %d.)') % \ + (todo_info['source'], todo_info['lineno']) desc1 = description[:description.find('<<')] desc2 = description[description.find('>>')+2:] para += nodes.Text(desc1, desc1) @@ -166,6 +169,7 @@ def depart_todo_node(self, node): def setup(app): app.add_config_value('todo_include_todos', False, 'html') + app.add_config_value('todo_link_only', False, 'html') app.add_node(todolist) app.add_node(todo_node, From 765f035ec1b8674092a48cc589de54911bd328d0 Mon Sep 17 00:00:00 2001 From: Enhao Hu Date: Thu, 23 Apr 2015 01:25:42 +0800 Subject: [PATCH 002/238] add Traditional Chinese search --- sphinx/search/zh_TW.py | 291 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 291 insertions(+) create mode 100644 sphinx/search/zh_TW.py diff --git a/sphinx/search/zh_TW.py b/sphinx/search/zh_TW.py new file mode 100644 index 000000000..ba99d2d8f --- /dev/null +++ b/sphinx/search/zh_TW.py @@ -0,0 +1,291 @@ +# -*- coding: utf-8 -*- +""" + sphinx.search.zh_TW + ~~~~~~~~~~~~~~~~ + + Traditional Chinese search language: includes routine to split words. + + :copyright: Copyright 2015 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import os +import re + +from sphinx.search import SearchLanguage + +try: + # http://bitbucket.org/methane/porterstemmer/ + from porterstemmer import Stemmer as CStemmer + CSTEMMER = True + PYSTEMMER = False +except ImportError: + CSTEMMER = False + try: + from Stemmer import Stemmer as PyStemmer + PYSTEMMER = True + except ImportError: + from sphinx.util.stemmer import PorterStemmer + PYSTEMMER = False + +try: + import jieba + JIEBA = True +except ImportError: + JIEBA = False + +english_stopwords = set(""" +a and are as at +be but by +for +if in into is it +near no not +of on or +such +that the their then there these they this to +was will with +""".split()) + +js_porter_stemmer = """ +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|\ +ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|\ +iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} +""" + +class SearchChinese(SearchLanguage): + """ + Traditional Chinese search implementation + """ + + lang = 'zh_TW' + language_name = 'Traditional Chinese' + js_stemmer_code = js_porter_stemmer + stopwords = english_stopwords + latin1_letters = re.compile(r'\w+(?u)[\u0000-\u00ff]') + + def init(self, options): + if JIEBA: + dict = options.get('dict') + if os.path.isfile(dict): + jieba.set_dictionary(dict) + print + print "Dictionary path:", dict + + if CSTEMMER: + class Stemmer(CStemmer): + def stem(self, word): + return self(word.lower()) + elif PYSTEMMER: + class Stemmer(object): + def __init__(self): + self.stemmer = PyStemmer('porter') + + def stem(self, word): + return self.stemmer.stemWord(word) + else: + class Stemmer(PorterStemmer): + """All those porter stemmer implementations look hideous; + make at least the stem method nicer. + """ + def stem(self, word): + word = word.lower() + return PorterStemmer.stem(self, word, 0, len(word) - 1) + + self.stemmer = Stemmer() + + def split(self, input): + if JIEBA: + chinese = list(jieba.cut_for_search(input)) + + latin1 = self.latin1_letters.findall(input) + return chinese + latin1 + + def word_filter(self, stemmed_word): + return len(stemmed_word) > 1 + + def stem(self, word): + return self.stemmer.stem(word) + +def setup(app): + app.add_search_language(SearchChinese) + From 8694088b4cc4b571d4e89852e29c5622bcdb3f74 Mon Sep 17 00:00:00 2001 From: Enhao Hu Date: Thu, 23 Apr 2015 10:29:14 +0800 Subject: [PATCH 003/238] Fix bug for Traditional Chinese search --- sphinx/search/__init__.py | 1 + sphinx/search/zh_TW.py | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/sphinx/search/__init__.py b/sphinx/search/__init__.py index 8126c9aee..a988b8a86 100644 --- a/sphinx/search/__init__.py +++ b/sphinx/search/__init__.py @@ -133,6 +133,7 @@ languages = { 'ru': 'sphinx.search.ru.SearchRussian', 'sv': 'sphinx.search.sv.SearchSwedish', 'tr': 'sphinx.search.tr.SearchTurkish', + 'zh_TW': 'sphinx.search.zh_TW.SearchChinese', } diff --git a/sphinx/search/zh_TW.py b/sphinx/search/zh_TW.py index ba99d2d8f..655ba05f4 100644 --- a/sphinx/search/zh_TW.py +++ b/sphinx/search/zh_TW.py @@ -286,6 +286,3 @@ class SearchChinese(SearchLanguage): def stem(self, word): return self.stemmer.stem(word) -def setup(app): - app.add_search_language(SearchChinese) - From fbd36d98de9a089e7a2b34446e726ecf43552876 Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Fri, 22 May 2015 09:15:04 -0700 Subject: [PATCH 004/238] FIX: Ensure list is sent to OptParse --- sphinx/cmdline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/cmdline.py b/sphinx/cmdline.py index e5335f47d..52a95fa53 100644 --- a/sphinx/cmdline.py +++ b/sphinx/cmdline.py @@ -125,7 +125,7 @@ def main(argv): # parse options try: - opts, args = parser.parse_args(argv[1:]) + opts, args = parser.parse_args(list(argv[1:])) except SystemExit as err: return err.code From 454a4b9c655380dbcb50409127ff98932fc61653 Mon Sep 17 00:00:00 2001 From: kieranh5511 Date: Wed, 27 May 2015 17:40:41 +0100 Subject: [PATCH 005/238] Use xcolor over color where available The boxes drawn around verbatim code (fcolorbox) with the color package seem to display poorly on-screen in some PDF readers (e.g. Adobe Reader). Boxes drawn with xcolor display much better, hence the xcolor package will be used if available. --- sphinx/texinputs/sphinx.sty | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty index b28b204bc..792a106c5 100644 --- a/sphinx/texinputs/sphinx.sty +++ b/sphinx/texinputs/sphinx.sty @@ -18,7 +18,13 @@ \RequirePackage{makeidx} \RequirePackage{framed} \RequirePackage{ifthen} -\RequirePackage{color} +%The xcolor package draws better fcolorboxes +%around verbatim code +\IfFileExists{xcolor.sty}{ + \RequirePackage[xcdraw]{xcolor} +}{ + \RequirePackage{color} +} % For highlighted code. \RequirePackage{fancyvrb} % For table captions. From 9265010609d9caaa8164e77506312e525d9833b2 Mon Sep 17 00:00:00 2001 From: jpic Date: Thu, 18 Jun 2015 00:44:35 +0200 Subject: [PATCH 006/238] Link to Python's Style Guide for documentation. This is a follow-up to #1931 --- doc/rest.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/rest.rst b/doc/rest.rst index c6a4ada04..9fca31b6e 100644 --- a/doc/rest.rst +++ b/doc/rest.rst @@ -223,8 +223,10 @@ as long as the text:: ================= Normally, there are no heading levels assigned to certain characters as the -structure is determined from the succession of headings. However, for the -Python documentation, this convention is used which you may follow: +structure is determined from the succession of headings. However, this +convention is used in `Python's Style Guide for documentating +`_ which you may +follow: * ``#`` with overline, for parts * ``*`` with overline, for chapters From 59dfb47c1ce5fc2541380dfe00ee53fb56e53a54 Mon Sep 17 00:00:00 2001 From: Buck Golemon Date: Tue, 23 Jun 2015 11:59:22 -0700 Subject: [PATCH 007/238] add a dummy builder, for syntax checkers --- AUTHORS | 1 + CHANGES | 1 + doc/builders.rst | 12 ++++++++++++ sphinx/builders/dummy.py | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 sphinx/builders/dummy.py diff --git a/AUTHORS b/AUTHORS index 4574c3d8b..81a194995 100644 --- a/AUTHORS +++ b/AUTHORS @@ -24,6 +24,7 @@ Other contributors, listed alphabetically, are: * Charles Duffy -- original graphviz extension * Kevin Dunn -- MathJax extension * Josip Dzolonga -- coverage builder +* Buck Evan -- dummy builder * Hernan Grecco -- search improvements * Horst Gutmann -- internationalization support * Martin Hans -- autodoc improvements diff --git a/CHANGES b/CHANGES index 9960eb772..589a9efbb 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Incompatible changes Features added -------------- +* Added the ``dummy`` builder: syntax check without output. Bugs fixed ---------- diff --git a/doc/builders.rst b/doc/builders.rst index 4fbd5bae6..bc225c6f9 100644 --- a/doc/builders.rst +++ b/doc/builders.rst @@ -309,6 +309,18 @@ for details. .. autoattribute:: supported_image_types +.. module:: sphinx.builders.dummy +.. class:: DummyBuilder + + This builder produces no output. The input is only parsed and checked for + consistency. This is useful for linting purposes. + + .. autoattribute:: name + + .. autoattribute:: supported_image_types + + .. versionadded:: 1.4 + .. module:: sphinx.builders.linkcheck .. class:: CheckExternalLinksBuilder diff --git a/sphinx/builders/dummy.py b/sphinx/builders/dummy.py new file mode 100644 index 000000000..edf43ab9d --- /dev/null +++ b/sphinx/builders/dummy.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +""" + sphinx.builders.dummy + ~~~~~~~~~~~~~~~~~~~~ + + Do syntax checks, but no writing. + + :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + + +from sphinx.builders import Builder + + +class DummyBuilder(Builder): + name = 'dummy' + allow_parallel = True + + def init(self): + pass + + def get_outdated_docs(self): + return self.env.found_docs + + def get_target_uri(self, docname, typ=None): + return '' + + def prepare_writing(self, docnames): + pass + + def write_doc(self, docname, doctree): + pass + + def finish(self): + pass From e862d8864e5f0753b35ae3dd01265d5c28ffbffe Mon Sep 17 00:00:00 2001 From: Enhao Date: Wed, 15 Jul 2015 15:09:31 +0800 Subject: [PATCH 008/238] Update zh_TW.py --- sphinx/search/zh_TW.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sphinx/search/zh_TW.py b/sphinx/search/zh_TW.py index 655ba05f4..127d45b5d 100644 --- a/sphinx/search/zh_TW.py +++ b/sphinx/search/zh_TW.py @@ -286,3 +286,4 @@ class SearchChinese(SearchLanguage): def stem(self, word): return self.stemmer.stem(word) + From 1b80100dffc2e3bcab2ac7825d2ec7fcfbd941fb Mon Sep 17 00:00:00 2001 From: Timotheus Kampik Date: Sun, 4 Oct 2015 19:44:17 +0200 Subject: [PATCH 009/238] HTML doc: navigate with left/right arrow keys Adjusted basic theme's JS accordingly --- AUTHORS | 2 +- CHANGES | 1 + sphinx/themes/basic/static/doctools.js | 25 +++++++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index c31cb6976..c823072bb 100644 --- a/AUTHORS +++ b/AUTHORS @@ -28,7 +28,7 @@ Other contributors, listed alphabetically, are: * Horst Gutmann -- internationalization support * Martin Hans -- autodoc improvements * Doug Hellmann -- graphviz improvements -* Timotheus Kampik - stop words language fix +* Timotheus Kampik - JS enhancements, stop words language fix * Takeshi Komiya -- numref feature * Dave Kuhlman -- original LaTeX writer * Blaise Laflamme -- pyramid theme diff --git a/CHANGES b/CHANGES index a0ac757d3..7b637443f 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,7 @@ Features added * C++ type alias support (e.g., ``.. type:: T = int``) * C++ template support for classes, functions, type aliases, and variables (#1729, #1314). * C++, added new scope management directives ``namespace-push`` and ``namespace-pop``. +* #1970: Keyboard shortcuts to navigate Next and Previous topics Bugs fixed ---------- diff --git a/sphinx/themes/basic/static/doctools.js b/sphinx/themes/basic/static/doctools.js index c7bfe760a..07a6355af 100644 --- a/sphinx/themes/basic/static/doctools.js +++ b/sphinx/themes/basic/static/doctools.js @@ -124,6 +124,7 @@ var Documentation = { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); + this.initOnKeyListeners(); }, /** @@ -252,6 +253,30 @@ var Documentation = { }); var url = parts.join('/'); return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + /** + * init onKeyListernes (for navigation) + */ + initOnKeyListeners: function() { + $(document).keyup(function(event) { + if (!$(document.activeElement).is('input')) { //don't navigate when in search box + switch (event.keyCode) { + case 37: //left + var prevElement = $('link[rel="prev"]')[0]; + if (prevElement) { + window.location.href = prevElement.href; + } + break; + case 39: //right + var nextElement = $('link[rel="next"]')[0]; + if (nextElement) { + window.location.href = nextElement.href; + } + break; + } + } + }); } }; From 06ac2a0059382bd2494726d16c4de0ebb861c75e Mon Sep 17 00:00:00 2001 From: Timotheus Kampik Date: Fri, 9 Oct 2015 12:08:29 +0200 Subject: [PATCH 010/238] refactored code according to discussion in #2064 --- sphinx/themes/basic/static/doctools.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/sphinx/themes/basic/static/doctools.js b/sphinx/themes/basic/static/doctools.js index 07a6355af..ed24a2da3 100644 --- a/sphinx/themes/basic/static/doctools.js +++ b/sphinx/themes/basic/static/doctools.js @@ -260,20 +260,21 @@ var Documentation = { */ initOnKeyListeners: function() { $(document).keyup(function(event) { - if (!$(document.activeElement).is('input')) { //don't navigate when in search box + var activeElementType = $(document.activeElement).prop('tagName'); + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT') { // don't navigate when in search box or textarea switch (event.keyCode) { - case 37: //left - var prevElement = $('link[rel="prev"]')[0]; - if (prevElement) { - window.location.href = prevElement.href; + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; } - break; - case 39: //right - var nextElement = $('link[rel="next"]')[0]; - if (nextElement) { - window.location.href = nextElement.href; + return false; + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; } - break; + return false; } } }); From 12dde8afdb0a7bb5576e2656692c3478c69d8cc3 Mon Sep 17 00:00:00 2001 From: vitaut Date: Fri, 16 Oct 2015 06:58:12 -0700 Subject: [PATCH 011/238] Make sphinx_rtd_theme optional --- setup.py | 1 - sphinx/theming.py | 9 +++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index cc977f50f..73c57276c 100644 --- a/setup.py +++ b/setup.py @@ -53,7 +53,6 @@ requires = [ 'snowballstemmer>=1.1', 'babel>=1.3,!=2.0', 'alabaster>=0.7,<0.8', - 'sphinx_rtd_theme>=0.1,<2.0', ] extras_require = { # Environment Marker works for wheel 0.24 or later diff --git a/sphinx/theming.py b/sphinx/theming.py index 49bd707d0..6be331194 100644 --- a/sphinx/theming.py +++ b/sphinx/theming.py @@ -27,7 +27,6 @@ from sphinx import package_dir from sphinx.errors import ThemeError import alabaster -import sphinx_rtd_theme NODEFAULT = object() THEMECONF = 'theme.conf' @@ -71,7 +70,13 @@ class Theme(object): @classmethod def load_extra_theme(cls, name): - if name in ('alabaster', 'sphinx_rtd_theme'): + themes = ['alabaster'] + try: + import sphinx_rtd_theme + themes.append('sphinx_rtd_theme') + except ImportError: + pass + if name in themes: if name == 'alabaster': themedir = alabaster.get_path() # alabaster theme also requires 'alabaster' extension, it will be loaded From a6a55898a0695e9f103e360086bc0e2b10fa3ab5 Mon Sep 17 00:00:00 2001 From: Timotheus Kampik Date: Fri, 27 Nov 2015 00:54:10 +0100 Subject: [PATCH 012/238] refactor navigation basic template enable configuration via theme.conf --- .../basic/static/{doctools.js => doctools.js_t} | 14 +++++++------- sphinx/themes/basic/theme.conf | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) rename sphinx/themes/basic/static/{doctools.js => doctools.js_t} (96%) diff --git a/sphinx/themes/basic/static/doctools.js b/sphinx/themes/basic/static/doctools.js_t similarity index 96% rename from sphinx/themes/basic/static/doctools.js rename to sphinx/themes/basic/static/doctools.js_t index ed24a2da3..1700e33bf 100644 --- a/sphinx/themes/basic/static/doctools.js +++ b/sphinx/themes/basic/static/doctools.js_t @@ -124,7 +124,9 @@ var Documentation = { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); + {% if not theme_nonavigationwithkeys|tobool %} this.initOnKeyListeners(); + {% endif %} }, /** @@ -255,26 +257,24 @@ var Documentation = { return path.substring(url.lastIndexOf('/') + 1, path.length - 1); }, - /** - * init onKeyListernes (for navigation) - */ initOnKeyListeners: function() { $(document).keyup(function(event) { - var activeElementType = $(document.activeElement).prop('tagName'); - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT') { // don't navigate when in search box or textarea + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { switch (event.keyCode) { case 37: // left var prevHref = $('link[rel="prev"]').prop('href'); if (prevHref) { window.location.href = prevHref; + return false; } - return false; case 39: // right var nextHref = $('link[rel="next"]').prop('href'); if (nextHref) { window.location.href = nextHref; + return false; } - return false; } } }); diff --git a/sphinx/themes/basic/theme.conf b/sphinx/themes/basic/theme.conf index f7283730b..f25e0e2a9 100644 --- a/sphinx/themes/basic/theme.conf +++ b/sphinx/themes/basic/theme.conf @@ -5,4 +5,5 @@ pygments_style = none [options] nosidebar = false -sidebarwidth = 230 \ No newline at end of file +sidebarwidth = 230 +nonavigationwithkeys = false \ No newline at end of file From 32b483d5bcaca6f5e91fbd1c7f111239de72bda2 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 3 Dec 2015 10:33:15 +0900 Subject: [PATCH 013/238] Fix #2134 figure caption with reference causes latex build error --- CHANGES | 2 ++ sphinx/writers/latex.py | 3 ++- tests/roots/test-references-in-caption/conf.py | 4 ++++ tests/roots/test-references-in-caption/index.rst | 8 ++++++++ tests/roots/test-references-in-caption/rimg.png | Bin 0 -> 218 bytes tests/test_build_latex.py | 11 +++++++++++ 6 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 tests/roots/test-references-in-caption/conf.py create mode 100644 tests/roots/test-references-in-caption/index.rst create mode 100644 tests/roots/test-references-in-caption/rimg.png diff --git a/CHANGES b/CHANGES index e5751c0fb..94a4dd0e4 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,8 @@ Release 1.3.4 (in development) Bugs fixed ---------- +* #2134 Fix figure caption with reference causes latex build error + Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 5ec86019f..dd77bff17 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1382,7 +1382,8 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_reference(self, node): for id in node.get('ids'): - self.body += self.hypertarget(id, anchor=True) + anchor = not self.in_caption + self.body += self.hypertarget(id, anchor=anchor) uri = node.get('refuri', '') if not uri and node.get('refid'): uri = '%' + self.curfilestack[-1] + '#' + node['refid'] diff --git a/tests/roots/test-references-in-caption/conf.py b/tests/roots/test-references-in-caption/conf.py new file mode 100644 index 000000000..cf05c9b5c --- /dev/null +++ b/tests/roots/test-references-in-caption/conf.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' +html_theme = 'classic' diff --git a/tests/roots/test-references-in-caption/index.rst b/tests/roots/test-references-in-caption/index.rst new file mode 100644 index 000000000..aaa0aeef1 --- /dev/null +++ b/tests/roots/test-references-in-caption/index.rst @@ -0,0 +1,8 @@ +test-reference +============== + +.. figure:: rimg.png + + This is the figure caption with a reference to [AuthorYear]_. + +.. [AuthorYear] Author, Title, Year diff --git a/tests/roots/test-references-in-caption/rimg.png b/tests/roots/test-references-in-caption/rimg.png new file mode 100644 index 0000000000000000000000000000000000000000..1081dc1439fb984dfa7ef627afe3c7dc476fdbce GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI|!3HFkf4uMuBv2gW?!>U}oXkrghqJ&VvY3H^ zTNs2H8D`Cq01C2~c>21s-(chw7$R|bZ|_0D0|q>YSbqDzW^|HYIk%*-&O)* Date: Thu, 3 Dec 2015 11:39:25 +0900 Subject: [PATCH 014/238] Fix section and table titles with reference cause latex build error --- sphinx/writers/latex.py | 7 ++++--- tests/roots/test-references-in-caption/index.rst | 12 ++++++++++++ tests/test_build_latex.py | 4 +++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index dd77bff17..2164e14c1 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1381,9 +1381,10 @@ class LaTeXTranslator(nodes.NodeVisitor): raise nodes.SkipNode def visit_reference(self, node): - for id in node.get('ids'): - anchor = not self.in_caption - self.body += self.hypertarget(id, anchor=anchor) + if not self.in_title: + for id in node.get('ids'): + anchor = not self.in_caption + self.body += self.hypertarget(id, anchor=anchor) uri = node.get('refuri', '') if not uri and node.get('refid'): uri = '%' + self.curfilestack[-1] + '#' + node['refid'] diff --git a/tests/roots/test-references-in-caption/index.rst b/tests/roots/test-references-in-caption/index.rst index aaa0aeef1..f71a7b8f4 100644 --- a/tests/roots/test-references-in-caption/index.rst +++ b/tests/roots/test-references-in-caption/index.rst @@ -1,8 +1,20 @@ +============== test-reference ============== +The section with a reference to [AuthorYear]_ +============================================= + .. figure:: rimg.png This is the figure caption with a reference to [AuthorYear]_. +.. list-table:: The table title with a reference to [AuthorYear]_ + :header-rows: 1 + + * - Header1 + - Header2 + * - Content + - Content + .. [AuthorYear] Author, Title, Year diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 067671f7e..77b8dd731 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -327,5 +327,7 @@ def test_reference_in_caption(app, status, warning): print(result) print(status.getvalue()) print(warning.getvalue()) - assert ('\\caption{This is the figure caption with a reference to \\label{index:id1}' + assert ('\\caption{This is the figure caption with a reference to \\label{index:id2}' '{\\hyperref[index:authoryear]{\\emph{{[}AuthorYear{]}}}}.}' in result) + assert '\\chapter{The section with a reference to {[}AuthorYear{]}}' in result + assert '\\caption{The table title with a reference to {[}AuthorYear{]}}' in result From 8648bdeec1daa6342ff2570ed556d51c16877070 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 3 Dec 2015 14:48:00 +0900 Subject: [PATCH 015/238] Fix #2094 rubric with reference not working in Latex --- CHANGES | 1 + sphinx/writers/latex.py | 2 ++ tests/roots/test-references-in-caption/index.rst | 2 ++ tests/test_build_latex.py | 1 + 4 files changed, 6 insertions(+) diff --git a/CHANGES b/CHANGES index 94a4dd0e4..322f39a64 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,7 @@ Bugs fixed ---------- * #2134 Fix figure caption with reference causes latex build error +* #2094 Fix rubric with reference not working in Latex Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 2164e14c1..0edc6dd83 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -749,8 +749,10 @@ class LaTeXTranslator(nodes.NodeVisitor): raise nodes.SkipNode self.body.append('\\paragraph{') self.context.append('}\n') + self.in_title = 1 def depart_rubric(self, node): + self.in_title = 0 self.body.append(self.context.pop()) def visit_footnote(self, node): diff --git a/tests/roots/test-references-in-caption/index.rst b/tests/roots/test-references-in-caption/index.rst index f71a7b8f4..decec1bad 100644 --- a/tests/roots/test-references-in-caption/index.rst +++ b/tests/roots/test-references-in-caption/index.rst @@ -17,4 +17,6 @@ The section with a reference to [AuthorYear]_ * - Content - Content +.. rubric:: The rubric title with a reference to [AuthorYear]_ + .. [AuthorYear] Author, Title, Year diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 77b8dd731..be8b7b604 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -331,3 +331,4 @@ def test_reference_in_caption(app, status, warning): '{\\hyperref[index:authoryear]{\\emph{{[}AuthorYear{]}}}}.}' in result) assert '\\chapter{The section with a reference to {[}AuthorYear{]}}' in result assert '\\caption{The table title with a reference to {[}AuthorYear{]}}' in result + assert '\\paragraph{The rubric title with a reference to {[}AuthorYear{]}}' in result From aa475604dc89a5c5f5477bd3f58a2afac49422ad Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 3 Dec 2015 23:31:54 +0900 Subject: [PATCH 016/238] ``figure_align`` is added at 1.3 --- doc/config.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/config.rst b/doc/config.rst index 552471f54..b48d59616 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -1431,6 +1431,8 @@ These options influence LaTeX output. 'floated' into the next page but may be preceded by any other text. If you don't like this behavior, use 'H' which will disable floating and position figures strictly in the order they appear in the source. + + .. versionadded:: 1.3 ``'footer'`` Additional footer content (before the indices), default empty. From 5bd8930fec9bcd6b74b32f3b862d18602a4d7f48 Mon Sep 17 00:00:00 2001 From: shimizukawa Date: Sun, 6 Dec 2015 13:31:17 +0900 Subject: [PATCH 017/238] tiny fix --- CHANGES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 322f39a64..d1ed209cd 100644 --- a/CHANGES +++ b/CHANGES @@ -4,8 +4,8 @@ Release 1.3.4 (in development) Bugs fixed ---------- -* #2134 Fix figure caption with reference causes latex build error -* #2094 Fix rubric with reference not working in Latex +* #2134: Fix figure caption with reference causes latex build error +* #2094: Fix rubric with reference not working in Latex Release 1.3.3 (released Dec 2, 2015) From 024a3f701ee7dc246fa586b3bd440d4e1a28295c Mon Sep 17 00:00:00 2001 From: shimizukawa Date: Wed, 9 Dec 2015 18:29:46 +0900 Subject: [PATCH 018/238] fix CHANGES --- CHANGES | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index d1ed209cd..e26e817dd 100644 --- a/CHANGES +++ b/CHANGES @@ -61,10 +61,7 @@ Bugs fixed * #1942: Fix a KeyError in websupport. * #1903: Fix strange id generation for glossary terms. * #1796, On py3, automated .mo building cause UnicodeDecodeError -* Fix: ``make text`` will crush if a definition list item has more than 1 classifiers as: -* #1796: On py3, automated .mo building cause UnicodeDecodeError * ``make text`` will crush if a definition list item has more than 1 classifiers as: -* Fixed #1855: make gettext generates broken po file for definition lists with classifier. ``term : classifier1 : classifier2``. * #1855: make gettext generates broken po file for definition lists with classifier. * #1869: Fix problems when dealing with files containing non-ASCII characters. Thanks to @@ -79,6 +76,8 @@ Bugs fixed * #1994: More supporting non-standard parser (like recommonmark parser) for Translation and WebSupport feature. Now node.rawsource is fall backed to node.astext() during docutils transforming. +* #1989: "make blahblah" on Windows indicate help messages for sphinx-build every time. + It was caused by wrong make.bat that generated by Sphinx-1.3.0/1.3.1. * On Py2 environment, conf.py that is generated by sphinx-quickstart should have u prefixed config value for 'version' and 'release'. * #2102: On Windows + Py3, using ``|today|`` and non-ASCII date format will raise From a1240d2cab57aaef1b517a6a9a127a0c48fb8bd8 Mon Sep 17 00:00:00 2001 From: Takaaki AOKI Date: Fri, 4 Dec 2015 13:23:27 +0900 Subject: [PATCH 019/238] resolve issue #2147 Replace legacy float by newfloat package to allow page-break within literal-block environment. capt-of and needspace packages are additionally required. reference: http://tex.stackexchange.com/questions/175650/how-to-allow-page-break-inside-a-float-environment --- sphinx/texinputs/sphinx.sty | 17 ++++++++++++----- sphinx/writers/latex.py | 14 +++++++++++--- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty index b28b204bc..03525faec 100644 --- a/sphinx/texinputs/sphinx.sty +++ b/sphinx/texinputs/sphinx.sty @@ -524,11 +524,18 @@ \fi % Define literal-block environment -\RequirePackage{float} -\floatstyle{plaintop} +\RequirePackage{newfloat} +\DeclareFloatingEnvironment{literal-block} \ifx\thechapter\undefined - \newfloat{literal-block}{htbp}{loc}[section] + \SetupFloatingEnvironment{literal-block}{within=section,placement=h} \else - \newfloat{literal-block}{htbp}{loc}[chapter] + \SetupFloatingEnvironment{literal-block}{within=chapter,placement=h} \fi -\floatname{literal-block}{List} +\SetupFloatingEnvironment{literal-block}{name=List} +% control caption around literal-block +\RequirePackage{capt-of} +\RequirePackage{needspace} +% if the left page space is less than \literalblockneedsapce, insert page-break +\newcommand{\literalblockneedspace}{5\baselineskip} +% margin before the caption of literal-block +\newcommand{\literalblockcaptiontopvspace}{0.5\baselineskip} diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 0edc6dd83..291bedbab 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -296,6 +296,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.in_production_list = 0 self.in_footnote = 0 self.in_caption = 0 + self.in_container_literal_block = 0 self.first_document = 1 self.this_is_the_title = 1 self.literal_whitespace = 0 @@ -400,7 +401,7 @@ class LaTeXTranslator(nodes.NodeVisitor): if len(codeblock) == 1: pass # FIXME else: - ret.append('\\floatname{literal-block}{%s}\n' % + ret.append('\\SetupFloatingEnvironment{literal-block}{name=%s}\n' % text_type(codeblock[0]).translate(tex_escape_map)) if table[1]: pass # FIXME @@ -1222,6 +1223,11 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_caption(self, node): self.in_caption += 1 + if self.in_container_literal_block: + self.body.append('\\needspace{\\literalblockneedspace}') + self.body.append('\\vspace{\\literalblockcaptiontopvspace}') + self.body.append('\\captionof{literal-block}{') + return self.body.append('\\caption{') def depart_caption(self, node): @@ -1774,17 +1780,19 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_container(self, node): if node.get('literal_block'): + self.in_container_literal_block += 1 ids = '' for id in self.next_literal_ids: ids += self.hypertarget(id, anchor=False) if node['ids']: ids += self.hypertarget(node['ids'][0]) self.next_literal_ids.clear() - self.body.append('\n\\begin{literal-block}\n') - self.context.append(ids + '\n\\end{literal-block}\n') + self.body.append('\n') + self.context.append(ids + '\n') def depart_container(self, node): if node.get('literal_block'): + self.in_container_literal_block -= 1 self.body.append(self.context.pop()) def visit_decoration(self, node): From 07ed539ad3ef95dbfbdf8546131ea21ea7d23cf3 Mon Sep 17 00:00:00 2001 From: Takaaki AOKI Date: Fri, 4 Dec 2015 20:13:13 +0900 Subject: [PATCH 020/238] modify test strings to be found after build_latex --- tests/test_build_latex.py | 10 +++++----- tests/test_directive_code.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index be8b7b604..4b4eadbf5 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -168,7 +168,7 @@ def test_numref(app, status, warning): print(warning.getvalue()) assert '\\addto\\captionsenglish{\\renewcommand{\\figurename}{Fig. }}' in result assert '\\addto\\captionsenglish{\\renewcommand{\\tablename}{Table }}' in result - assert '\\floatname{literal-block}{Listing }' in result + assert '\\SetupFloatingEnvironment{literal-block}{name=Listing }' in result assert '\\hyperref[index:fig1]{Fig. \\ref{index:fig1}}' in result assert '\\hyperref[baz:fig22]{Figure\\ref{baz:fig22}}' in result assert '\\hyperref[index:table-1]{Table \\ref{index:table-1}}' in result @@ -190,7 +190,7 @@ def test_numref_with_prefix1(app, status, warning): print(warning.getvalue()) assert '\\addto\\captionsenglish{\\renewcommand{\\figurename}{Figure:}}' in result assert '\\addto\\captionsenglish{\\renewcommand{\\tablename}{Tab\\_}}' in result - assert '\\floatname{literal-block}{Code-}' in result + assert '\\SetupFloatingEnvironment{literal-block}{name=Code-}' in result assert '\\ref{index:fig1}' in result assert '\\ref{baz:fig22}' in result assert '\\ref{index:table-1}' in result @@ -220,7 +220,7 @@ def test_numref_with_prefix2(app, status, warning): assert '\\def\\fnum@figure{\\figurename\\thefigure.}' in result assert '\\addto\\captionsenglish{\\renewcommand{\\tablename}{Tab\\_}}' in result assert '\\def\\fnum@table{\\tablename\\thetable:}' in result - assert '\\floatname{literal-block}{Code-}' in result + assert '\\SetupFloatingEnvironment{literal-block}{name=Code-}' in result assert '\\hyperref[index:fig1]{Figure:\\ref{index:fig1}.}' in result assert '\\hyperref[baz:fig22]{Figure\\ref{baz:fig22}}' in result assert '\\hyperref[index:table-1]{Tab\\_\\ref{index:table-1}:}' in result @@ -239,7 +239,7 @@ def test_numref_with_language_el(app, status, warning): print(warning.getvalue()) assert '\\addto\\captionsgreek{\\renewcommand{\\figurename}{Fig. }}' in result assert '\\addto\\captionsgreek{\\renewcommand{\\tablename}{Table }}' in result - assert '\\floatname{literal-block}{Listing }' in result + assert '\\SetupFloatingEnvironment{literal-block}{name=Listing }' in result assert '\\hyperref[index:fig1]{Fig. \\ref{index:fig1}}' in result assert '\\hyperref[baz:fig22]{Figure\\ref{baz:fig22}}' in result assert '\\hyperref[index:table-1]{Table \\ref{index:table-1}}' in result @@ -258,7 +258,7 @@ def test_numref_with_language_ja(app, status, warning): print(warning.getvalue()) assert u'\\renewcommand{\\figurename}{\u56f3 }' in result assert '\\renewcommand{\\tablename}{TABLE }' in result - assert '\\floatname{literal-block}{LIST }' in result + assert '\\SetupFloatingEnvironment{literal-block}{name=LIST }' in result assert u'\\hyperref[index:fig1]{\u56f3 \\ref{index:fig1}}' in result assert '\\hyperref[baz:fig22]{Figure\\ref{baz:fig22}}' in result assert '\\hyperref[index:table-1]{TABLE \\ref{index:table-1}}' in result diff --git a/tests/test_directive_code.py b/tests/test_directive_code.py index be7ee3add..4f07beb99 100644 --- a/tests/test_directive_code.py +++ b/tests/test_directive_code.py @@ -64,7 +64,7 @@ def test_code_block_caption_html(app, status, warning): def test_code_block_caption_latex(app, status, warning): app.builder.build_all() latex = (app.outdir / 'Python.tex').text(encoding='utf-8') - caption = '\\caption{caption \\emph{test} rb}' + caption = '\\captionof{literal-block}{caption \\emph{test} rb}' assert caption in latex @@ -205,5 +205,5 @@ def test_literalinclude_caption_html(app, status, warning): def test_literalinclude_caption_latex(app, status, warning): app.builder.build('index') latex = (app.outdir / 'Python.tex').text(encoding='utf-8') - caption = '\\caption{caption \\textbf{test} py}' + caption = '\\captionof{literal-block}{caption \\textbf{test} py}' assert caption in latex From 8b47cc52b19dd2b6e6933b2d7fc02f9ae6a6e5bd Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 10 Dec 2015 00:15:07 +0900 Subject: [PATCH 021/238] Update CHANGES --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index e26e817dd..2422fb330 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Bugs fixed * #2134: Fix figure caption with reference causes latex build error * #2094: Fix rubric with reference not working in Latex +* #2147: Fix litralinclude code in latex does not break in pages Release 1.3.3 (released Dec 2, 2015) From c2db93f00bd793193ee6c97dcccf6e40a9b0b11b Mon Sep 17 00:00:00 2001 From: Jakob Lykke Andersen Date: Thu, 10 Dec 2015 09:39:45 +0100 Subject: [PATCH 022/238] C++, parallel build fix Delete operator symbols when clearing. --- sphinx/domains/cpp.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py index fcd352e71..474467b49 100644 --- a/sphinx/domains/cpp.py +++ b/sphinx/domains/cpp.py @@ -2268,11 +2268,19 @@ class Symbol(object): self._assert_invariants() def clear_doc(self, docname): + newChildren = [] for sChild in self.children: sChild.clear_doc(docname) if sChild.declaration and sChild.docname == docname: sChild.declaration = None sChild.docname = None + # Just remove operators, because there is no identification if + # they got removed. + # Don't remove other symbols because they may be used in namespace + # directives. + if sChild.identifier or sChild.declaration: + newChildren.append(sChild) + self.children = newChildren def get_all_symbols(self): yield self @@ -2442,8 +2450,10 @@ class Symbol(object): for otherChild in other.children: if not otherChild.identifier: if not otherChild.declaration: - print("WTF?") + print("Problem in symbol tree merging") + print("OtherChild.dump:") print(otherChild.dump(0)) + print("Other.dump:") print(other.dump(0)) assert otherChild.declaration operator = otherChild.declaration.name.names[-1] @@ -2595,7 +2605,7 @@ class Symbol(object): assert False # should have returned in the loop def to_string(self, indent): - self._assert_invariants() + #self._assert_invariants() res = ['\t'*indent] if not self.parent: res.append('::') From f04c3d849677e199177aed891cb0d679534ce29a Mon Sep 17 00:00:00 2001 From: Jakob Lykke Andersen Date: Thu, 10 Dec 2015 09:52:55 +0100 Subject: [PATCH 023/238] Fix flake8 error --- sphinx/domains/cpp.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py index 474467b49..148766ad9 100644 --- a/sphinx/domains/cpp.py +++ b/sphinx/domains/cpp.py @@ -2605,7 +2605,6 @@ class Symbol(object): assert False # should have returned in the loop def to_string(self, indent): - #self._assert_invariants() res = ['\t'*indent] if not self.parent: res.append('::') From e2f56a64a4a26a4ccf3c6ba809a6790f973a2ae7 Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Sun, 5 Apr 2015 01:36:02 -0700 Subject: [PATCH 024/238] Email addresses should not be showed again if latex_show_urls is not False The latex output shows email addresses even the external links itself is an email address. For example, for an email address me@example.com, latex output will show it as "me@example.com (me@example.com)". This commit fixes this issue by removing the "mailto:" prefix before comparing the text and uri. --- sphinx/writers/latex.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 291bedbab..68c909ac9 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1403,9 +1403,9 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body.append('\\href{%s}{' % self.encode_uri(uri)) # if configured, put the URL after the link show_urls = self.builder.config.latex_show_urls + if uri.startswith('mailto:'): + uri = uri[7:] if node.astext() != uri and show_urls and show_urls != 'no': - if uri.startswith('mailto:'): - uri = uri[7:] if show_urls == 'footnote' and not \ (self.in_footnote or self.in_caption): # obviously, footnotes in footnotes are not going to work From 0084004cfda246ff85557c4dceeb9b2f765d5d5c Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Fri, 11 Dec 2015 15:06:14 -0800 Subject: [PATCH 025/238] Add testing cases for the "latex_show_urls" option --- tests/root/conf.py | 1 + tests/root/footnote.txt | 12 ++++++++++++ tests/test_build_latex.py | 3 +++ 3 files changed, 16 insertions(+) diff --git a/tests/root/conf.py b/tests/root/conf.py index bdf2f8c8d..6ce196c3d 100644 --- a/tests/root/conf.py +++ b/tests/root/conf.py @@ -51,6 +51,7 @@ latex_documents = [ 'Georg Brandl \\and someone else', 'manual'), ] +latex_show_urls = 'footnote' latex_additional_files = ['svgimg.svg'] texinfo_documents = [ diff --git a/tests/root/footnote.txt b/tests/root/footnote.txt index 36ad3fadc..c30a5fe9c 100644 --- a/tests/root/footnote.txt +++ b/tests/root/footnote.txt @@ -35,6 +35,18 @@ footnotes in table * - VIDIOC_CROPCAP - Information about VIDIOC_CROPCAP +URLs as footnotes +----------------- + +`homepage `_ + +URLs should not be footnotes +---------------------------- + +GitHub Page: `https://github.com/sphinx-doc/sphinx `_ + +Mailing list: `sphinx-dev@googlegroups.com `_ + footenotes -------------------- diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 4b4eadbf5..00d3b82c1 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -318,6 +318,9 @@ def test_footnote(app, status, warning): assert ('\\end{threeparttable}\n\n' '\\footnotetext[4]{\nfootnotes in table caption\n}' '\\footnotetext[5]{\nfootnotes in table\n}' in result) + assert r'\href{http://sphinx.org}{homepage}\footnote{http://sphinx.org}' in result + assert r'\footnote{https://github.com/sphinx-doc/sphinx}' not in result + assert r'\footnote{sphinx-dev@googlegroups.com}' not in result @with_app(buildername='latex', testroot='references-in-caption') From b48c18cb035265f90c952565abfff5169ecebb6d Mon Sep 17 00:00:00 2001 From: daoiqi Date: Sun, 23 Aug 2015 21:09:36 +0800 Subject: [PATCH 026/238] zh_TW.py apply pep8 specification --- sphinx/search/zh_TW.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sphinx/search/zh_TW.py b/sphinx/search/zh_TW.py index 127d45b5d..ac5dfd14d 100644 --- a/sphinx/search/zh_TW.py +++ b/sphinx/search/zh_TW.py @@ -232,6 +232,7 @@ iti|ous|ive|ize)$/; } """ + class SearchChinese(SearchLanguage): """ Traditional Chinese search implementation @@ -244,12 +245,12 @@ class SearchChinese(SearchLanguage): latin1_letters = re.compile(r'\w+(?u)[\u0000-\u00ff]') def init(self, options): - if JIEBA: + if JIEBA: dict = options.get('dict') if os.path.isfile(dict): - jieba.set_dictionary(dict) + jieba.set_dictionary(dict) print - print "Dictionary path:", dict + print "Dictionary path:", dict if CSTEMMER: class Stemmer(CStemmer): @@ -274,7 +275,8 @@ class SearchChinese(SearchLanguage): self.stemmer = Stemmer() def split(self, input): - if JIEBA: + chinese = [] + if JIEBA: chinese = list(jieba.cut_for_search(input)) latin1 = self.latin1_letters.findall(input) @@ -285,5 +287,3 @@ class SearchChinese(SearchLanguage): def stem(self, word): return self.stemmer.stem(word) - - From a17af0bcb7db2a88e16e35a65d669b4f6f94dc3c Mon Sep 17 00:00:00 2001 From: daoiqi Date: Sun, 13 Dec 2015 16:23:14 +0800 Subject: [PATCH 027/238] fix if user not set jieba options then os.path.isfile error --- sphinx/search/zh_TW.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/sphinx/search/zh_TW.py b/sphinx/search/zh_TW.py index ac5dfd14d..e38ded513 100644 --- a/sphinx/search/zh_TW.py +++ b/sphinx/search/zh_TW.py @@ -246,11 +246,9 @@ class SearchChinese(SearchLanguage): def init(self, options): if JIEBA: - dict = options.get('dict') - if os.path.isfile(dict): - jieba.set_dictionary(dict) - print - print "Dictionary path:", dict + dict_path = options.get('dict') + if dict_path and os.path.isfile(dict_path): + jieba.set_dictionary(dict_path) if CSTEMMER: class Stemmer(CStemmer): From e196d5f8e54d0f521a530a31d66dcec666f0b2e0 Mon Sep 17 00:00:00 2001 From: daoiqi Date: Sun, 13 Dec 2015 16:27:28 +0800 Subject: [PATCH 028/238] change zh_TW.py to zh.py it also support Simplified Chinese Search --- sphinx/quickstart.py | 5 +++-- sphinx/search/__init__.py | 2 +- sphinx/search/{zh_TW.py => zh.py} | 10 +++++----- 3 files changed, 9 insertions(+), 8 deletions(-) rename sphinx/search/{zh_TW.py => zh.py} (96%) diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index f13a5c7cd..194d59afa 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -261,11 +261,12 @@ html_static_path = ['%(dot)sstatic'] # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' -# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' #html_search_language = 'en' # A dictionary with options for the search language support, empty by default. -# Now only 'ja' uses this config value +# 'ja' uses this config value. +# 'zh' user can custom change `jieba` dictionary path. #html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that diff --git a/sphinx/search/__init__.py b/sphinx/search/__init__.py index a988b8a86..25b7ea238 100644 --- a/sphinx/search/__init__.py +++ b/sphinx/search/__init__.py @@ -133,7 +133,7 @@ languages = { 'ru': 'sphinx.search.ru.SearchRussian', 'sv': 'sphinx.search.sv.SearchSwedish', 'tr': 'sphinx.search.tr.SearchTurkish', - 'zh_TW': 'sphinx.search.zh_TW.SearchChinese', + 'zh': 'sphinx.search.zh.SearchChinese', } diff --git a/sphinx/search/zh_TW.py b/sphinx/search/zh.py similarity index 96% rename from sphinx/search/zh_TW.py rename to sphinx/search/zh.py index e38ded513..9aacde1d7 100644 --- a/sphinx/search/zh_TW.py +++ b/sphinx/search/zh.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- """ - sphinx.search.zh_TW + sphinx.search.zh ~~~~~~~~~~~~~~~~ - Traditional Chinese search language: includes routine to split words. + Chinese search language: includes routine to split words. :copyright: Copyright 2015 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. @@ -235,11 +235,11 @@ iti|ous|ive|ize)$/; class SearchChinese(SearchLanguage): """ - Traditional Chinese search implementation + Chinese search implementation """ - lang = 'zh_TW' - language_name = 'Traditional Chinese' + lang = 'zh' + language_name = 'Chinese' js_stemmer_code = js_porter_stemmer stopwords = english_stopwords latin1_letters = re.compile(r'\w+(?u)[\u0000-\u00ff]') From d76a700fa290858d2d34d4b67ace0981e6a74cf1 Mon Sep 17 00:00:00 2001 From: daoiqi Date: Sun, 13 Dec 2015 17:07:11 +0800 Subject: [PATCH 029/238] add chinese search options into `html_search_options` document --- doc/config.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/config.rst b/doc/config.rst index 0219a9ee0..e98e73824 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -873,6 +873,7 @@ that use Sphinx's HTMLWriter class. * ``es`` -- Spanish * ``sv`` -- Swedish * ``tr`` -- Turkish + * ``zh`` -- Chinese .. admonition:: Accelerating build speed @@ -907,6 +908,12 @@ that use Sphinx's HTMLWriter class. .. versionadded:: 1.1 + + The Chinese support has these options: + + * ``dict`` -- the ``jieba`` dictionary path if want to use + custom dictionary. + .. confval:: html_search_scorer The name of a JavaScript file (relative to the configuration directory) that From 1a1f73547851e9bb51120fdaf35d86dae2e66873 Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Wed, 16 Dec 2015 02:50:17 -0800 Subject: [PATCH 030/238] sphinx.ext.graphviz: use instead of to embed svg If svg files are embedded in in html, all interactive features are lost, which graphviz is able to produce. This commit replace with for svg files. Close #967 --- sphinx/ext/graphviz.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py index 3970edc07..e0c73ecd8 100644 --- a/sphinx/ext/graphviz.py +++ b/sphinx/ext/graphviz.py @@ -223,7 +223,8 @@ def render_dot_html(self, node, code, options, prefix='graphviz', alt = node.get('alt', self.encode(code).strip()) imgcss = imgcls and 'class="%s"' % imgcls or '' if format == 'svg': - svgtag = '%s\n' % (fname, alt, imgcss) + svgtag = ''' +

%s

\n''' % (fname, alt) self.body.append(svgtag) else: mapfile = open(outfn + '.map', 'rb') From 691141d23fe22881d259dc31507c75250daa53c4 Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Wed, 16 Dec 2015 19:33:17 -0800 Subject: [PATCH 031/238] sphinx.ext.graphviz: Add doc to explain how to make the links in svg output work. --- doc/ext/graphviz.rst | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/ext/graphviz.rst b/doc/ext/graphviz.rst index d5a5969f4..ef57da4fd 100644 --- a/doc/ext/graphviz.rst +++ b/doc/ext/graphviz.rst @@ -111,7 +111,18 @@ There are also these new config values: .. confval:: graphviz_output_format The output format for Graphviz when building HTML files. This must be either - ``'png'`` or ``'svg'``; the default is ``'png'``. + ``'png'`` or ``'svg'``; the default is ``'png'``. If ``'svg'`` is used, in + order to make the URL links work properly, an appropriate ``target`` + attribute must be set, such as ``"_top"`` and ``"_blank"``. For example, the + link in the following graph should work in the svg output: :: + + .. graphviz:: + + digraph example { + a [label="sphinx", href="http://sphinx-doc.org", target="_top"]; + b [label="other"]; + a -> b; + } .. versionadded:: 1.0 Previously, output always was PNG. From a44507083b733785d3a0505ed0cae172d955716f Mon Sep 17 00:00:00 2001 From: Daniel Jakob Date: Thu, 17 Dec 2015 15:06:10 +0100 Subject: [PATCH 032/238] perform a lower() on german index terms #2083 --- sphinx/search/de.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sphinx/search/de.py b/sphinx/search/de.py index 89cbe3de5..35c6263c4 100644 --- a/sphinx/search/de.py +++ b/sphinx/search/de.py @@ -311,4 +311,5 @@ class SearchGerman(SearchLanguage): self.stemmer = snowballstemmer.stemmer('german') def stem(self, word): + word = word.lower() return self.stemmer.stemWord(word) From 2ee03a272941da480e933478c7b1ae3153158bca Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Thu, 17 Dec 2015 18:53:30 -0800 Subject: [PATCH 033/238] Fix #981: LaTeX: support image file names with more than 1 dots LaTeX cannot detect image file names with more than 1 dots in it correctly. The solution is to use '{}' to surround the base name. See https://tex.stackexchange.com/questions/10574/includegraphics-dots-in-filename Fix #981 --- sphinx/writers/latex.py | 3 ++- tests/root/images.txt | 3 +++ tests/root/img.foo.png | Bin 0 -> 67765 bytes tests/test_environment.py | 10 ++++++---- 4 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 tests/root/img.foo.png diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 291bedbab..88bf1073f 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1182,7 +1182,8 @@ class LaTeXTranslator(nodes.NodeVisitor): options = '' if include_graphics_options: options = '[%s]' % ','.join(include_graphics_options) - self.body.append('\\includegraphics%s{%s}' % (options, uri)) + base, ext = path.splitext(uri) + self.body.append('\\includegraphics%s{{%s}%s}' % (options, base, ext)) self.body.extend(post) def depart_image(self, node): diff --git a/tests/root/images.txt b/tests/root/images.txt index bd64d573a..e78f8be3c 100644 --- a/tests/root/images.txt +++ b/tests/root/images.txt @@ -26,3 +26,6 @@ Sphinx image handling .. an SVG image (for HTML at least) .. image:: svgimg.* + +.. an image with more than 1 dot in its file name +.. image:: img.foo.png diff --git a/tests/root/img.foo.png b/tests/root/img.foo.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8f89929f2483a249c42ec5358016b9f1073f47 GIT binary patch literal 67765 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 Date: Wed, 16 Dec 2015 15:10:52 +0000 Subject: [PATCH 034/238] Fix #2177: Remove parallel hangs --- CHANGES | 1 + sphinx/builders/__init__.py | 3 +- sphinx/util/parallel.py | 106 +++++++++++++++++------------------- 3 files changed, 53 insertions(+), 57 deletions(-) diff --git a/CHANGES b/CHANGES index 2422fb330..2543cf7ad 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,7 @@ Release 1.3.3 (released Dec 2, 2015) Bugs fixed ---------- +* #2177: Fix parallel hangs * #2012: Fix exception occurred if ``numfig_format`` is invalid * #2142: Provide non-minified JS code in ``sphinx/search/non-minified-js/*.js`` for source distribution on PyPI. diff --git a/sphinx/builders/__init__.py b/sphinx/builders/__init__.py index eebd6af64..2688f8466 100644 --- a/sphinx/builders/__init__.py +++ b/sphinx/builders/__init__.py @@ -14,9 +14,8 @@ from os import path try: import multiprocessing - import threading except ImportError: - multiprocessing = threading = None + multiprocessing = None from docutils import nodes diff --git a/sphinx/util/parallel.py b/sphinx/util/parallel.py index 1d1e0a098..a6985c86b 100644 --- a/sphinx/util/parallel.py +++ b/sphinx/util/parallel.py @@ -14,11 +14,10 @@ import traceback try: import multiprocessing - import threading except ImportError: - multiprocessing = threading = None + multiprocessing = None -from six.moves import queue +from math import sqrt from sphinx.errors import SphinxParallelError @@ -49,17 +48,22 @@ class ParallelTasks(object): def __init__(self, nproc): self.nproc = nproc - # list of threads to join when waiting for completion + # main task performed by each task, returning result + self._task_func = 0 + # (optional) function performed by each task on the result of main task + self._result_func = 0 + # task arguments + self._args = {} + # list of subprocesses (both started and waiting) + self._procs = {} + # list of receiving pipe connections of running subprocesses + self._precvs = {} + # list of receiving pipe connections of waiting subprocesses + self._precvsWaiting = {} + # number of working subprocesses + self._pworking = 0 + # task number of each subprocess self._taskid = 0 - self._threads = {} - self._nthreads = 0 - # queue of result objects to process - self.result_queue = queue.Queue() - self._nprocessed = 0 - # maps tasks to result functions - self._result_funcs = {} - # allow only "nproc" worker processes at once - self._semaphore = threading.Semaphore(self.nproc) def _process(self, pipe, func, arg): try: @@ -71,55 +75,44 @@ class ParallelTasks(object): except BaseException as err: pipe.send((True, (err, traceback.format_exc()))) - def _process_thread(self, tid, func, arg): - precv, psend = multiprocessing.Pipe(False) - proc = multiprocessing.Process(target=self._process, - args=(psend, func, arg)) - proc.start() - result = precv.recv() - self.result_queue.put((tid, arg) + result) - proc.join() - self._semaphore.release() + def _result_func_wrapper(self, arg, result): + result_func = self._result_func(arg, result) + if result_func: + result_func(result) def add_task(self, task_func, arg=None, result_func=None): + self._task_func = task_func # dummy code after first call + self._result_func = result_func or (lambda *x: None) # dummy code after first call tid = self._taskid self._taskid += 1 - self._semaphore.acquire() - thread = threading.Thread(target=self._process_thread, - args=(tid, task_func, arg)) - thread.setDaemon(True) - thread.start() - self._nthreads += 1 - self._threads[tid] = thread - self._result_funcs[tid] = result_func or (lambda *x: None) - # try processing results already in parallel - try: - tid, arg, exc, result = self.result_queue.get(False) - except queue.Empty: - pass + self._args[tid] = arg + precv, psend = multiprocessing.Pipe(False) + proc = multiprocessing.Process(target=self._process, + args=(psend, self._task_func, arg)) + self._procs[tid] = proc + if self._pworking < self.nproc: + self._precvs[tid] = precv + self._pworking += 1 + proc.start() else: - del self._threads[tid] - if exc: - raise SphinxParallelError(*result) - result_func = self._result_funcs.pop(tid)(arg, result) - if result_func: - result_func(result) - self._nprocessed += 1 + self._precvsWaiting[tid] = precv def join(self): - while self._nprocessed < self._nthreads: - tid, arg, exc, result = self.result_queue.get() - del self._threads[tid] - if exc: - raise SphinxParallelError(*result) - result_func = self._result_funcs.pop(tid)(arg, result) - if result_func: - result_func(result) - self._nprocessed += 1 - - # there shouldn't be any threads left... - for t in self._threads.values(): - t.join() + while self._pworking: + for tid, pipe in self._precvs.items(): + if pipe.poll(): + exc, result = pipe.recv() + if exc: + raise SphinxParallelError(*result) + self._result_func_wrapper(self._args[tid], result) + self._procs[tid].join() + if len(self._precvsWaiting) > 0: + newtid, newprecv = self._precvsWaiting.popitem() + self._precvs[newtid] = newprecv + self._procs[newtid].start() + break + else: + self._pworking -= 1 def make_chunks(arguments, nproc, maxbatch=10): @@ -128,6 +121,9 @@ def make_chunks(arguments, nproc, maxbatch=10): chunksize = min(nargs // nproc, maxbatch) if chunksize == 0: chunksize = 1 + if chunksize == maxbatch: + # try to improve batch size vs. number of batches + chunksize = int(sqrt(nargs/nproc * maxbatch)) nchunks, rest = divmod(nargs, chunksize) if rest: nchunks += 1 From 580405c714fc338f45e6694120a52bfdb84f8ca9 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 18 Dec 2015 21:02:46 +0100 Subject: [PATCH 035/238] More parallel code optimizations. --- sphinx/util/parallel.py | 67 +++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/sphinx/util/parallel.py b/sphinx/util/parallel.py index a6985c86b..618fbdc38 100644 --- a/sphinx/util/parallel.py +++ b/sphinx/util/parallel.py @@ -10,14 +10,16 @@ """ import os +import time import traceback +from math import sqrt try: import multiprocessing except ImportError: multiprocessing = None -from math import sqrt +from six import iteritems from sphinx.errors import SphinxParallelError @@ -48,10 +50,8 @@ class ParallelTasks(object): def __init__(self, nproc): self.nproc = nproc - # main task performed by each task, returning result - self._task_func = 0 # (optional) function performed by each task on the result of main task - self._result_func = 0 + self._result_funcs = {} # task arguments self._args = {} # list of subprocesses (both started and waiting) @@ -75,55 +75,50 @@ class ParallelTasks(object): except BaseException as err: pipe.send((True, (err, traceback.format_exc()))) - def _result_func_wrapper(self, arg, result): - result_func = self._result_func(arg, result) - if result_func: - result_func(result) - def add_task(self, task_func, arg=None, result_func=None): - self._task_func = task_func # dummy code after first call - self._result_func = result_func or (lambda *x: None) # dummy code after first call tid = self._taskid self._taskid += 1 + self._result_funcs[tid] = result_func or (lambda arg: None) self._args[tid] = arg precv, psend = multiprocessing.Pipe(False) proc = multiprocessing.Process(target=self._process, - args=(psend, self._task_func, arg)) + args=(psend, task_func, arg)) self._procs[tid] = proc - if self._pworking < self.nproc: - self._precvs[tid] = precv - self._pworking += 1 - proc.start() - else: - self._precvsWaiting[tid] = precv + self._precvsWaiting[tid] = precv + self._join_one() def join(self): while self._pworking: - for tid, pipe in self._precvs.items(): - if pipe.poll(): - exc, result = pipe.recv() - if exc: - raise SphinxParallelError(*result) - self._result_func_wrapper(self._args[tid], result) - self._procs[tid].join() - if len(self._precvsWaiting) > 0: - newtid, newprecv = self._precvsWaiting.popitem() - self._precvs[newtid] = newprecv - self._procs[newtid].start() - break - else: - self._pworking -= 1 + self._join_one() + + def _join_one(self): + for tid, pipe in iteritems(self._precvs): + if pipe.poll(): + exc, result = pipe.recv() + if exc: + raise SphinxParallelError(*result) + self._result_funcs.pop(tid)(self._args.pop(tid), result) + self._procs[tid].join() + self._pworking -= 1 + break + else: + time.sleep(0.02) + while self._precvsWaiting and self._pworking < self.nproc: + newtid, newprecv = self._precvsWaiting.popitem() + self._precvs[newtid] = newprecv + self._procs[newtid].start() + self._pworking += 1 def make_chunks(arguments, nproc, maxbatch=10): # determine how many documents to read in one go nargs = len(arguments) - chunksize = min(nargs // nproc, maxbatch) - if chunksize == 0: - chunksize = 1 - if chunksize == maxbatch: + chunksize = nargs // nproc + if chunksize >= maxbatch: # try to improve batch size vs. number of batches chunksize = int(sqrt(nargs/nproc * maxbatch)) + if chunksize == 0: + chunksize = 1 nchunks, rest = divmod(nargs, chunksize) if rest: nchunks += 1 From 8d373b9ab1ee772680015e94f144916a7a888d93 Mon Sep 17 00:00:00 2001 From: Daniel Rings Date: Wed, 16 Dec 2015 15:10:52 +0000 Subject: [PATCH 036/238] Fix #2177: Remove parallel hangs --- CHANGES | 1 + sphinx/builders/__init__.py | 3 +- sphinx/util/parallel.py | 106 +++++++++++++++++------------------- 3 files changed, 53 insertions(+), 57 deletions(-) diff --git a/CHANGES b/CHANGES index 8c935097d..bcfb47f34 100644 --- a/CHANGES +++ b/CHANGES @@ -55,6 +55,7 @@ Release 1.3.3 (released Dec 2, 2015) Bugs fixed ---------- +* #2177: Fix parallel hangs * #2012: Fix exception occurred if ``numfig_format`` is invalid * #2142: Provide non-minified JS code in ``sphinx/search/non-minified-js/*.js`` for source distribution on PyPI. diff --git a/sphinx/builders/__init__.py b/sphinx/builders/__init__.py index eebd6af64..2688f8466 100644 --- a/sphinx/builders/__init__.py +++ b/sphinx/builders/__init__.py @@ -14,9 +14,8 @@ from os import path try: import multiprocessing - import threading except ImportError: - multiprocessing = threading = None + multiprocessing = None from docutils import nodes diff --git a/sphinx/util/parallel.py b/sphinx/util/parallel.py index 1d1e0a098..a6985c86b 100644 --- a/sphinx/util/parallel.py +++ b/sphinx/util/parallel.py @@ -14,11 +14,10 @@ import traceback try: import multiprocessing - import threading except ImportError: - multiprocessing = threading = None + multiprocessing = None -from six.moves import queue +from math import sqrt from sphinx.errors import SphinxParallelError @@ -49,17 +48,22 @@ class ParallelTasks(object): def __init__(self, nproc): self.nproc = nproc - # list of threads to join when waiting for completion + # main task performed by each task, returning result + self._task_func = 0 + # (optional) function performed by each task on the result of main task + self._result_func = 0 + # task arguments + self._args = {} + # list of subprocesses (both started and waiting) + self._procs = {} + # list of receiving pipe connections of running subprocesses + self._precvs = {} + # list of receiving pipe connections of waiting subprocesses + self._precvsWaiting = {} + # number of working subprocesses + self._pworking = 0 + # task number of each subprocess self._taskid = 0 - self._threads = {} - self._nthreads = 0 - # queue of result objects to process - self.result_queue = queue.Queue() - self._nprocessed = 0 - # maps tasks to result functions - self._result_funcs = {} - # allow only "nproc" worker processes at once - self._semaphore = threading.Semaphore(self.nproc) def _process(self, pipe, func, arg): try: @@ -71,55 +75,44 @@ class ParallelTasks(object): except BaseException as err: pipe.send((True, (err, traceback.format_exc()))) - def _process_thread(self, tid, func, arg): - precv, psend = multiprocessing.Pipe(False) - proc = multiprocessing.Process(target=self._process, - args=(psend, func, arg)) - proc.start() - result = precv.recv() - self.result_queue.put((tid, arg) + result) - proc.join() - self._semaphore.release() + def _result_func_wrapper(self, arg, result): + result_func = self._result_func(arg, result) + if result_func: + result_func(result) def add_task(self, task_func, arg=None, result_func=None): + self._task_func = task_func # dummy code after first call + self._result_func = result_func or (lambda *x: None) # dummy code after first call tid = self._taskid self._taskid += 1 - self._semaphore.acquire() - thread = threading.Thread(target=self._process_thread, - args=(tid, task_func, arg)) - thread.setDaemon(True) - thread.start() - self._nthreads += 1 - self._threads[tid] = thread - self._result_funcs[tid] = result_func or (lambda *x: None) - # try processing results already in parallel - try: - tid, arg, exc, result = self.result_queue.get(False) - except queue.Empty: - pass + self._args[tid] = arg + precv, psend = multiprocessing.Pipe(False) + proc = multiprocessing.Process(target=self._process, + args=(psend, self._task_func, arg)) + self._procs[tid] = proc + if self._pworking < self.nproc: + self._precvs[tid] = precv + self._pworking += 1 + proc.start() else: - del self._threads[tid] - if exc: - raise SphinxParallelError(*result) - result_func = self._result_funcs.pop(tid)(arg, result) - if result_func: - result_func(result) - self._nprocessed += 1 + self._precvsWaiting[tid] = precv def join(self): - while self._nprocessed < self._nthreads: - tid, arg, exc, result = self.result_queue.get() - del self._threads[tid] - if exc: - raise SphinxParallelError(*result) - result_func = self._result_funcs.pop(tid)(arg, result) - if result_func: - result_func(result) - self._nprocessed += 1 - - # there shouldn't be any threads left... - for t in self._threads.values(): - t.join() + while self._pworking: + for tid, pipe in self._precvs.items(): + if pipe.poll(): + exc, result = pipe.recv() + if exc: + raise SphinxParallelError(*result) + self._result_func_wrapper(self._args[tid], result) + self._procs[tid].join() + if len(self._precvsWaiting) > 0: + newtid, newprecv = self._precvsWaiting.popitem() + self._precvs[newtid] = newprecv + self._procs[newtid].start() + break + else: + self._pworking -= 1 def make_chunks(arguments, nproc, maxbatch=10): @@ -128,6 +121,9 @@ def make_chunks(arguments, nproc, maxbatch=10): chunksize = min(nargs // nproc, maxbatch) if chunksize == 0: chunksize = 1 + if chunksize == maxbatch: + # try to improve batch size vs. number of batches + chunksize = int(sqrt(nargs/nproc * maxbatch)) nchunks, rest = divmod(nargs, chunksize) if rest: nchunks += 1 From 0e38d445eca912b0842f7ab886da3eebebfd51ba Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 18 Dec 2015 21:02:46 +0100 Subject: [PATCH 037/238] More parallel code optimizations. --- sphinx/util/parallel.py | 67 +++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/sphinx/util/parallel.py b/sphinx/util/parallel.py index a6985c86b..618fbdc38 100644 --- a/sphinx/util/parallel.py +++ b/sphinx/util/parallel.py @@ -10,14 +10,16 @@ """ import os +import time import traceback +from math import sqrt try: import multiprocessing except ImportError: multiprocessing = None -from math import sqrt +from six import iteritems from sphinx.errors import SphinxParallelError @@ -48,10 +50,8 @@ class ParallelTasks(object): def __init__(self, nproc): self.nproc = nproc - # main task performed by each task, returning result - self._task_func = 0 # (optional) function performed by each task on the result of main task - self._result_func = 0 + self._result_funcs = {} # task arguments self._args = {} # list of subprocesses (both started and waiting) @@ -75,55 +75,50 @@ class ParallelTasks(object): except BaseException as err: pipe.send((True, (err, traceback.format_exc()))) - def _result_func_wrapper(self, arg, result): - result_func = self._result_func(arg, result) - if result_func: - result_func(result) - def add_task(self, task_func, arg=None, result_func=None): - self._task_func = task_func # dummy code after first call - self._result_func = result_func or (lambda *x: None) # dummy code after first call tid = self._taskid self._taskid += 1 + self._result_funcs[tid] = result_func or (lambda arg: None) self._args[tid] = arg precv, psend = multiprocessing.Pipe(False) proc = multiprocessing.Process(target=self._process, - args=(psend, self._task_func, arg)) + args=(psend, task_func, arg)) self._procs[tid] = proc - if self._pworking < self.nproc: - self._precvs[tid] = precv - self._pworking += 1 - proc.start() - else: - self._precvsWaiting[tid] = precv + self._precvsWaiting[tid] = precv + self._join_one() def join(self): while self._pworking: - for tid, pipe in self._precvs.items(): - if pipe.poll(): - exc, result = pipe.recv() - if exc: - raise SphinxParallelError(*result) - self._result_func_wrapper(self._args[tid], result) - self._procs[tid].join() - if len(self._precvsWaiting) > 0: - newtid, newprecv = self._precvsWaiting.popitem() - self._precvs[newtid] = newprecv - self._procs[newtid].start() - break - else: - self._pworking -= 1 + self._join_one() + + def _join_one(self): + for tid, pipe in iteritems(self._precvs): + if pipe.poll(): + exc, result = pipe.recv() + if exc: + raise SphinxParallelError(*result) + self._result_funcs.pop(tid)(self._args.pop(tid), result) + self._procs[tid].join() + self._pworking -= 1 + break + else: + time.sleep(0.02) + while self._precvsWaiting and self._pworking < self.nproc: + newtid, newprecv = self._precvsWaiting.popitem() + self._precvs[newtid] = newprecv + self._procs[newtid].start() + self._pworking += 1 def make_chunks(arguments, nproc, maxbatch=10): # determine how many documents to read in one go nargs = len(arguments) - chunksize = min(nargs // nproc, maxbatch) - if chunksize == 0: - chunksize = 1 - if chunksize == maxbatch: + chunksize = nargs // nproc + if chunksize >= maxbatch: # try to improve batch size vs. number of batches chunksize = int(sqrt(nargs/nproc * maxbatch)) + if chunksize == 0: + chunksize = 1 nchunks, rest = divmod(nargs, chunksize) if rest: nchunks += 1 From cb484a4172f2a547faf40e05c91d672075580fb8 Mon Sep 17 00:00:00 2001 From: Daniel Jakob Date: Thu, 17 Dec 2015 15:06:10 +0100 Subject: [PATCH 038/238] perform a lower() on german index terms #2083 --- sphinx/search/de.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sphinx/search/de.py b/sphinx/search/de.py index 89cbe3de5..35c6263c4 100644 --- a/sphinx/search/de.py +++ b/sphinx/search/de.py @@ -311,4 +311,5 @@ class SearchGerman(SearchLanguage): self.stemmer = snowballstemmer.stemmer('german') def stem(self, word): + word = word.lower() return self.stemmer.stemWord(word) From cc847022576590fdeb1fe75085ef8b45c2eff2a8 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 19 Dec 2015 10:52:53 +0900 Subject: [PATCH 039/238] Update CHANGES for PR #1833 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 2543cf7ad..fe8842fdb 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ Bugs fixed * #2134: Fix figure caption with reference causes latex build error * #2094: Fix rubric with reference not working in Latex * #2147: Fix litralinclude code in latex does not break in pages +* #1833: Fix email addresses is not showed again if latex_show_urls is not None Release 1.3.3 (released Dec 2, 2015) From cb3f8c62ae30718e3fd67d27ac4d454e3b05990b Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 19 Dec 2015 15:12:44 +0900 Subject: [PATCH 040/238] Fix typo in CHANGES --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index fe8842fdb..38c6a771c 100644 --- a/CHANGES +++ b/CHANGES @@ -7,7 +7,7 @@ Bugs fixed * #2134: Fix figure caption with reference causes latex build error * #2094: Fix rubric with reference not working in Latex * #2147: Fix litralinclude code in latex does not break in pages -* #1833: Fix email addresses is not showed again if latex_show_urls is not None +* #1833: Fix email addresses is showed again if latex_show_urls is not None Release 1.3.3 (released Dec 2, 2015) From 39458552ec6ada20c5fd0df2ed0f321023ffc3db Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 19 Dec 2015 15:20:55 +0900 Subject: [PATCH 041/238] Update CHANGES for PR #2176 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 38c6a771c..fb8269d4a 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,7 @@ Bugs fixed * #2094: Fix rubric with reference not working in Latex * #2147: Fix litralinclude code in latex does not break in pages * #1833: Fix email addresses is showed again if latex_show_urls is not None +* #2176: sphinx.ext.graphviz: use instead of to embed svg Release 1.3.3 (released Dec 2, 2015) From e859543f8be260b9f84c0ba6ef51a84a75e89056 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 19 Dec 2015 16:12:26 +0900 Subject: [PATCH 042/238] Fix #967: SVG inheritance diagram is not hyperlinked (clickable) --- CHANGES | 1 + sphinx/ext/inheritance_diagram.py | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index fb8269d4a..5feea324b 100644 --- a/CHANGES +++ b/CHANGES @@ -9,6 +9,7 @@ Bugs fixed * #2147: Fix litralinclude code in latex does not break in pages * #1833: Fix email addresses is showed again if latex_show_urls is not None * #2176: sphinx.ext.graphviz: use instead of to embed svg +* #967: Fix SVG inheritance diagram is not hyperlinked (clickable) Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/ext/inheritance_diagram.py b/sphinx/ext/inheritance_diagram.py index f618aaf15..0f4a18c63 100644 --- a/sphinx/ext/inheritance_diagram.py +++ b/sphinx/ext/inheritance_diagram.py @@ -264,6 +264,7 @@ class InheritanceGraph(object): this_node_attrs = n_attrs.copy() if fullname in urls: this_node_attrs['URL'] = '"%s"' % urls[fullname] + this_node_attrs['target'] = '"_top"' if tooltip: this_node_attrs['tooltip'] = tooltip res.append(' "%s" [%s];\n' % @@ -348,12 +349,20 @@ def html_visit_inheritance_diagram(self, node): name = 'inheritance%s' % graph_hash # Create a mapping from fully-qualified class names to URLs. + graphviz_output_format = self.builder.env.config.graphviz_output_format.upper() + current_filename = self.builder.current_docname + self.builder.out_suffix urls = {} for child in node: if child.get('refuri') is not None: - urls[child['reftitle']] = child.get('refuri') + if graphviz_output_format == 'SVG': + urls[child['reftitle']] = "../" + child.get('refuri') + else: + urls[child['reftitle']] = child.get('refuri') elif child.get('refid') is not None: - urls[child['reftitle']] = '#' + child.get('refid') + if graphviz_output_format == 'SVG': + urls[child['reftitle']] = '../' + current_filename + '#' + child.get('refid') + else: + urls[child['reftitle']] = '#' + child.get('refid') dotcode = graph.generate_dot(name, urls, env=self.builder.env) render_dot_html(self, node, dotcode, [], 'inheritance', 'inheritance', From 885b997a258c88a248f2f2a8514f717274103127 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Mon, 7 Dec 2015 11:02:45 +0900 Subject: [PATCH 043/238] Add testcases for latex_show_urls --- .../conf.py | 0 .../index.rst | 14 ++++-- .../rimg.png | Bin tests/test_build_latex.py | 45 +++++++++++++++++- 4 files changed, 55 insertions(+), 4 deletions(-) rename tests/roots/{test-references-in-caption => test-footnotes}/conf.py (100%) rename tests/roots/{test-references-in-caption => test-footnotes}/index.rst (68%) rename tests/roots/{test-references-in-caption => test-footnotes}/rimg.png (100%) diff --git a/tests/roots/test-references-in-caption/conf.py b/tests/roots/test-footnotes/conf.py similarity index 100% rename from tests/roots/test-references-in-caption/conf.py rename to tests/roots/test-footnotes/conf.py diff --git a/tests/roots/test-references-in-caption/index.rst b/tests/roots/test-footnotes/index.rst similarity index 68% rename from tests/roots/test-references-in-caption/index.rst rename to tests/roots/test-footnotes/index.rst index decec1bad..59211ad78 100644 --- a/tests/roots/test-references-in-caption/index.rst +++ b/tests/roots/test-footnotes/index.rst @@ -1,6 +1,6 @@ -============== -test-reference -============== +=============== +test-footenotes +=============== The section with a reference to [AuthorYear]_ ============================================= @@ -19,4 +19,12 @@ The section with a reference to [AuthorYear]_ .. rubric:: The rubric title with a reference to [AuthorYear]_ +* First footnote: [#]_ +* Second footnote: [1]_ +* `Sphinx `_ +* Third footnote: [#]_ + .. [AuthorYear] Author, Title, Year +.. [#] First +.. [1] Second +.. [#] Third diff --git a/tests/roots/test-references-in-caption/rimg.png b/tests/roots/test-footnotes/rimg.png similarity index 100% rename from tests/roots/test-references-in-caption/rimg.png rename to tests/roots/test-footnotes/rimg.png diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 00d3b82c1..7627e83b7 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -323,7 +323,7 @@ def test_footnote(app, status, warning): assert r'\footnote{sphinx-dev@googlegroups.com}' not in result -@with_app(buildername='latex', testroot='references-in-caption') +@with_app(buildername='latex', testroot='footnotes') def test_reference_in_caption(app, status, warning): app.builder.build_all() result = (app.outdir / 'Python.tex').text(encoding='utf8') @@ -335,3 +335,46 @@ def test_reference_in_caption(app, status, warning): assert '\\chapter{The section with a reference to {[}AuthorYear{]}}' in result assert '\\caption{The table title with a reference to {[}AuthorYear{]}}' in result assert '\\paragraph{The rubric title with a reference to {[}AuthorYear{]}}' in result + + +@with_app(buildername='latex', testroot='footnotes', + confoverrides={'latex_show_urls': 'inline'}) +def test_latex_show_urls_is_inline(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert 'First footnote: \\footnote[2]{\nFirst\n}' in result + assert 'Second footnote: \\footnote[1]{\nSecond\n}' in result + assert '\\href{http://sphinx-doc.org/}{Sphinx} (http://sphinx-doc.org/)' in result + assert 'Third footnote: \\footnote[3]{\nThird\n}' in result + + +@with_app(buildername='latex', testroot='footnotes', + confoverrides={'latex_show_urls': 'footnote'}) +def test_latex_show_urls_is_footnote(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert 'First footnote: \\footnote[2]{\nFirst\n}' in result + assert 'Second footnote: \\footnote[1]{\nSecond\n}' in result + assert ('\\href{http://sphinx-doc.org/}{Sphinx}' + '\\footnote{http://sphinx-doc.org/}' in result) + assert 'Third footnote: \\footnote[3]{\nThird\n}' in result + + +@with_app(buildername='latex', testroot='footnotes', + confoverrides={'latex_show_urls': 'no'}) +def test_latex_show_urls_is_no(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert 'First footnote: \\footnote[2]{\nFirst\n}' in result + assert 'Second footnote: \\footnote[1]{\nSecond\n}' in result + assert '\\href{http://sphinx-doc.org/}{Sphinx}' in result + assert 'Third footnote: \\footnote[3]{\nThird\n}' in result From 9fec96d32742bf753cad0a9b1f9ddff9e24f2a06 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Tue, 8 Dec 2015 00:37:20 +0900 Subject: [PATCH 044/238] Refactor latex_show_urls processor to Transform class --- sphinx/writers/latex.py | 106 +++++++++++++++++++++++---- tests/roots/test-footnotes/index.rst | 4 +- tests/test_build_latex.py | 9 ++- 3 files changed, 100 insertions(+), 19 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index c1667666d..34fe90dc2 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -18,6 +18,7 @@ from os import path from six import itervalues, text_type from docutils import nodes, writers +from docutils.transforms import Transform from docutils.writers.latex2e import Babel from sphinx import addnodes @@ -69,6 +70,8 @@ FOOTER = r''' \end{document} ''' +URI_SCHEMES = ('mailto:', 'http:', 'https:', 'ftp:') + class collected_footnote(nodes.footnote): """Footnotes that are collected are assigned this class.""" @@ -98,6 +101,8 @@ class LaTeXWriter(writers.Writer): self.builder.translator_class or LaTeXTranslator) def translate(self): + transform = ShowUrlsTransform(self.document) + transform.apply() visitor = self.translator_class(self.document, self.builder) self.document.walkabout(visitor) self.output = visitor.astext() @@ -126,6 +131,89 @@ if hasattr(Babel, '_ISO639_TO_BABEL'): Babel._ISO639_TO_BABEL['sl'] = 'slovene' +class ShowUrlsTransform(Transform): + expanded = False + + def apply(self): + self.expand_show_urls() + if self.expanded: + self.renumber_footnotes() + + def expand_show_urls(self): + show_urls = self.document.settings.env.config.latex_show_urls + if show_urls is False or show_urls == 'no': + return + + for node in self.document.traverse(nodes.reference): + uri = node.get('refuri', '') + if uri.startswith(URI_SCHEMES): + if uri.startswith('mailto:'): + uri = uri[7:] + if node.astext() != uri: + index = node.parent.index(node) + if show_urls == 'footnote': + footnote_nodes = self.create_footnote(uri) + for i, fn in enumerate(footnote_nodes): + node.parent.insert(index + i + 1, fn) + + self.expanded = True + else: # all other true values (b/w compat) + textnode = nodes.Text(" (%s)" % uri) + node.parent.insert(index + 1, textnode) + + def create_footnote(self, uri): + label = nodes.label('', '#') + para = nodes.paragraph() + para.append(nodes.Text(uri)) + footnote = nodes.footnote(uri, label, para, auto=1) + footnote['names'].append('#') + self.document.note_autofootnote(footnote) + + label = nodes.Text('#') + footnote_ref = nodes.footnote_reference('[#]_', label, auto=1, + refid=footnote['ids'][0]) + self.document.note_autofootnote_ref(footnote_ref) + footnote.add_backref(footnote_ref['ids'][0]) + + return [footnote, footnote_ref] + + def renumber_footnotes(self): + def is_used_number(number): + for node in self.document.traverse(nodes.footnote): + if not node.get('auto') and number in node['names']: + return True + + return False + + def is_auto_footnote(node): + return isinstance(node, nodes.footnote) and node.get('auto') + + def footnote_ref_by(ids): + def is_footnote_ref(node): + return isinstance(node, nodes.footnote_reference) and ids[0] == node['refid'] + + return is_footnote_ref + + startnum = 1 + for footnote in self.document.traverse(is_auto_footnote): + while True: + label = str(startnum) + startnum += 1 + if not is_used_number(label): + break + + old_label = footnote[0].astext() + footnote.remove(footnote[0]) + footnote.insert(0, nodes.label('', label)) + if old_label in footnote['names']: + footnote['names'].remove(old_label) + footnote['names'].append(label) + + for footnote_ref in self.document.traverse(footnote_ref_by(footnote['ids'])): + footnote_ref.remove(footnote_ref[0]) + footnote_ref += nodes.Text(label) + + class Table(object): def __init__(self): self.col = 0 @@ -1399,23 +1487,9 @@ class LaTeXTranslator(nodes.NodeVisitor): uri = '%' + self.curfilestack[-1] + '#' + node['refid'] if self.in_title or not uri: self.context.append('') - elif uri.startswith('mailto:') or uri.startswith('http:') or \ - uri.startswith('https:') or uri.startswith('ftp:'): + elif uri.startswith(URI_SCHEMES): self.body.append('\\href{%s}{' % self.encode_uri(uri)) - # if configured, put the URL after the link - show_urls = self.builder.config.latex_show_urls - if uri.startswith('mailto:'): - uri = uri[7:] - if node.astext() != uri and show_urls and show_urls != 'no': - if show_urls == 'footnote' and not \ - (self.in_footnote or self.in_caption): - # obviously, footnotes in footnotes are not going to work - self.context.append( - r'}\footnote{%s}' % self.encode_uri(uri)) - else: # all other true values (b/w compat) - self.context.append('} (%s)' % self.encode_uri(uri)) - else: - self.context.append('}') + self.context.append('}') elif uri.startswith('#'): # references to labels in the same document id = self.curfilestack[-1] + ':' + uri[1:] diff --git a/tests/roots/test-footnotes/index.rst b/tests/roots/test-footnotes/index.rst index 59211ad78..ceace70c2 100644 --- a/tests/roots/test-footnotes/index.rst +++ b/tests/roots/test-footnotes/index.rst @@ -19,12 +19,14 @@ The section with a reference to [AuthorYear]_ .. rubric:: The rubric title with a reference to [AuthorYear]_ +.. [#] First + * First footnote: [#]_ * Second footnote: [1]_ * `Sphinx `_ * Third footnote: [#]_ +* `URL including tilde `_ .. [AuthorYear] Author, Title, Year -.. [#] First .. [1] Second .. [#] Third diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 7627e83b7..5a060efe5 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -349,6 +349,8 @@ def test_latex_show_urls_is_inline(app, status, warning): assert 'Second footnote: \\footnote[1]{\nSecond\n}' in result assert '\\href{http://sphinx-doc.org/}{Sphinx} (http://sphinx-doc.org/)' in result assert 'Third footnote: \\footnote[3]{\nThird\n}' in result + assert ('\\href{http://sphinx-doc.org/~test/}{URL including tilde} ' + '(http://sphinx-doc.org/\\textasciitilde{}test/)' in result) @with_app(buildername='latex', testroot='footnotes', @@ -362,8 +364,10 @@ def test_latex_show_urls_is_footnote(app, status, warning): assert 'First footnote: \\footnote[2]{\nFirst\n}' in result assert 'Second footnote: \\footnote[1]{\nSecond\n}' in result assert ('\\href{http://sphinx-doc.org/}{Sphinx}' - '\\footnote{http://sphinx-doc.org/}' in result) - assert 'Third footnote: \\footnote[3]{\nThird\n}' in result + '\\footnote[3]{\nhttp://sphinx-doc.org/\n}' in result) + assert 'Third footnote: \\footnote[5]{\nThird\n}' in result + assert ('\\href{http://sphinx-doc.org/~test/}{URL including tilde}' + '\\footnote[4]{\nhttp://sphinx-doc.org/\\textasciitilde{}test/\n}' in result) @with_app(buildername='latex', testroot='footnotes', @@ -378,3 +382,4 @@ def test_latex_show_urls_is_no(app, status, warning): assert 'Second footnote: \\footnote[1]{\nSecond\n}' in result assert '\\href{http://sphinx-doc.org/}{Sphinx}' in result assert 'Third footnote: \\footnote[3]{\nThird\n}' in result + assert '\\href{http://sphinx-doc.org/~test/}{URL including tilde}' in result From 5fc4536040ac4993558d28a37456edeb4659bba7 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Tue, 8 Dec 2015 12:10:20 +0900 Subject: [PATCH 045/238] Fix invalid node id was assigned Because document.ids is reset on pickling doctree... --- sphinx/writers/latex.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 34fe90dc2..7b1094b31 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -135,10 +135,17 @@ class ShowUrlsTransform(Transform): expanded = False def apply(self): + # replace id_prefix temporarily + id_prefix = self.document.settings.id_prefix + self.document.settings.id_prefix = 'show_urls' + self.expand_show_urls() if self.expanded: self.renumber_footnotes() + # restore id_prefix + self.document.settings.id_prefix = id_prefix + def expand_show_urls(self): show_urls = self.document.settings.env.config.latex_show_urls if show_urls is False or show_urls == 'no': From 5983d027876c0e8992f71d8478294cacbbd8849c Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Tue, 8 Dec 2015 12:16:15 +0900 Subject: [PATCH 046/238] Fix #1237 footnotes not working in definition list in LaTeX --- CHANGES | 1 + sphinx/writers/latex.py | 19 ++++++++++++++++--- tests/roots/test-footnotes/index.rst | 11 +++++++++++ tests/test_build_latex.py | 18 ++++++++++++++++++ 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 5feea324b..996337a23 100644 --- a/CHANGES +++ b/CHANGES @@ -10,6 +10,7 @@ Bugs fixed * #1833: Fix email addresses is showed again if latex_show_urls is not None * #2176: sphinx.ext.graphviz: use instead of to embed svg * #967: Fix SVG inheritance diagram is not hyperlinked (clickable) +* #1237: Fix footnotes not working in definition list in LaTeX Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 7b1094b31..388fe81e1 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -373,6 +373,7 @@ class LaTeXTranslator(nodes.NodeVisitor): sys.maxsize]] self.bodystack = [] self.footnotestack = [] + self.termfootnotestack = [] self.curfilestack = [] self.handled_abbrs = set() if document.settings.docclass == 'howto': @@ -392,6 +393,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.in_footnote = 0 self.in_caption = 0 self.in_container_literal_block = 0 + self.in_term = 0 self.first_document = 1 self.this_is_the_title = 1 self.literal_whitespace = 0 @@ -856,7 +858,7 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_collected_footnote(self, node): self.in_footnote += 1 - if 'in_table' in node: + if 'footnotetext' in node: self.body.append('\\footnotetext[%s]{' % node['number']) else: self.body.append('\\footnote[%s]{' % node['number']) @@ -959,7 +961,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body.append('\\end{threeparttable}\n\n') if self.table.footnotes: for footnode in self.table.footnotes: - footnode['in_table'] = True + footnode['footnotetext'] = True footnode.walkabout(self) self.table = None self.tablebody = None @@ -1126,14 +1128,22 @@ class LaTeXTranslator(nodes.NodeVisitor): pass def visit_term(self, node): + self.in_term += 1 ctx = '}] \\leavevmode' if node.get('ids'): ctx += self.hypertarget(node['ids'][0]) self.body.append('\\item[{') + self.termfootnotestack.append([]) self.context.append(ctx) def depart_term(self, node): self.body.append(self.context.pop()) + footnotes = self.termfootnotestack.pop() + for footnode in footnotes: + footnode['footnotetext'] = True + footnode.walkabout(self) + + self.in_term -= 1 def visit_termsep(self, node): self.body.append(', ') @@ -1647,7 +1657,7 @@ class LaTeXTranslator(nodes.NodeVisitor): # if a footnote has been inserted once, it shouldn't be repeated # by the next reference if used: - if self.table: + if self.table or self.in_term: self.body.append('\\protect\\footnotemark[%s]' % num) else: self.body.append('\\footnotemark[%s]' % num) @@ -1655,6 +1665,9 @@ class LaTeXTranslator(nodes.NodeVisitor): self.footnotestack[-1][num][1] = True self.body.append('\\protect\\footnotemark[%s]' % num) self.table.footnotes.append(footnode) + elif self.in_term: + self.body.append('\\footnotemark[%s]' % num) + self.termfootnotestack[-1].append(footnode) else: if self.in_caption: raise UnsupportedError('%s:%s: footnotes in float captions ' diff --git a/tests/roots/test-footnotes/index.rst b/tests/roots/test-footnotes/index.rst index ceace70c2..5c3bf6f36 100644 --- a/tests/roots/test-footnotes/index.rst +++ b/tests/roots/test-footnotes/index.rst @@ -30,3 +30,14 @@ The section with a reference to [AuthorYear]_ .. [AuthorYear] Author, Title, Year .. [1] Second .. [#] Third + +`URL in term `_ + Description Description Description ... + +Footnote in term [#]_ + Description Description Description ... + + `Term in deflist `_ + Description2 + +.. [#] Footnote in term diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 5a060efe5..844c524fa 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -351,6 +351,12 @@ def test_latex_show_urls_is_inline(app, status, warning): assert 'Third footnote: \\footnote[3]{\nThird\n}' in result assert ('\\href{http://sphinx-doc.org/~test/}{URL including tilde} ' '(http://sphinx-doc.org/\\textasciitilde{}test/)' in result) + assert ('\\item[{\\href{http://sphinx-doc.org/}{URL in term} (http://sphinx-doc.org/)}] ' + '\\leavevmode\nDescription' in result) + assert ('\\item[{Footnote in term \\footnotemark[4]}] ' + '\\leavevmode\\footnotetext[4]{\nFootnote in term\n}\nDescription' in result) + assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist} (http://sphinx-doc.org/)}] ' + '\\leavevmode\nDescription' in result) @with_app(buildername='latex', testroot='footnotes', @@ -368,6 +374,12 @@ def test_latex_show_urls_is_footnote(app, status, warning): assert 'Third footnote: \\footnote[5]{\nThird\n}' in result assert ('\\href{http://sphinx-doc.org/~test/}{URL including tilde}' '\\footnote[4]{\nhttp://sphinx-doc.org/\\textasciitilde{}test/\n}' in result) + assert ('\\item[{\\href{http://sphinx-doc.org/}{URL in term}\\footnotemark[6]}] ' + '\\leavevmode\\footnotetext[6]{\nhttp://sphinx-doc.org/\n}\nDescription' in result) + assert ('\\item[{Footnote in term \\footnotemark[8]}] ' + '\\leavevmode\\footnotetext[8]{\nFootnote in term\n}\nDescription' in result) + assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist}\\footnotemark[7]}] ' + '\\leavevmode\\footnotetext[7]{\nhttp://sphinx-doc.org/\n}\nDescription' in result) @with_app(buildername='latex', testroot='footnotes', @@ -383,3 +395,9 @@ def test_latex_show_urls_is_no(app, status, warning): assert '\\href{http://sphinx-doc.org/}{Sphinx}' in result assert 'Third footnote: \\footnote[3]{\nThird\n}' in result assert '\\href{http://sphinx-doc.org/~test/}{URL including tilde}' in result + assert ('\\item[{\\href{http://sphinx-doc.org/}{URL in term}}] ' + '\\leavevmode\nDescription' in result) + assert ('\\item[{Footnote in term \\footnotemark[4]}] ' + '\\leavevmode\\footnotetext[4]{\nFootnote in term\n}\nDescription' in result) + assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist}}] ' + '\\leavevmode\nDescription' in result) From 9f96bbaf35dd5423eeb62ef4a5c8f32aad2e0186 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 19 Dec 2015 14:42:01 +0900 Subject: [PATCH 047/238] Move testcases for footnotes to roots/test-footnote --- tests/root/conf.py | 1 - tests/root/footnote.txt | 12 ------------ tests/roots/test-footnotes/index.rst | 2 ++ tests/test_build_latex.py | 19 ++++++++++++++----- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/tests/root/conf.py b/tests/root/conf.py index 6ce196c3d..bdf2f8c8d 100644 --- a/tests/root/conf.py +++ b/tests/root/conf.py @@ -51,7 +51,6 @@ latex_documents = [ 'Georg Brandl \\and someone else', 'manual'), ] -latex_show_urls = 'footnote' latex_additional_files = ['svgimg.svg'] texinfo_documents = [ diff --git a/tests/root/footnote.txt b/tests/root/footnote.txt index c30a5fe9c..36ad3fadc 100644 --- a/tests/root/footnote.txt +++ b/tests/root/footnote.txt @@ -35,18 +35,6 @@ footnotes in table * - VIDIOC_CROPCAP - Information about VIDIOC_CROPCAP -URLs as footnotes ------------------ - -`homepage `_ - -URLs should not be footnotes ----------------------------- - -GitHub Page: `https://github.com/sphinx-doc/sphinx `_ - -Mailing list: `sphinx-dev@googlegroups.com `_ - footenotes -------------------- diff --git a/tests/roots/test-footnotes/index.rst b/tests/roots/test-footnotes/index.rst index 5c3bf6f36..c7fe38ff9 100644 --- a/tests/roots/test-footnotes/index.rst +++ b/tests/roots/test-footnotes/index.rst @@ -26,6 +26,8 @@ The section with a reference to [AuthorYear]_ * `Sphinx `_ * Third footnote: [#]_ * `URL including tilde `_ +* GitHub Page: `https://github.com/sphinx-doc/sphinx `_ +* Mailing list: `sphinx-dev@googlegroups.com `_ .. [AuthorYear] Author, Title, Year .. [1] Second diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 844c524fa..d4f9f8451 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -318,9 +318,6 @@ def test_footnote(app, status, warning): assert ('\\end{threeparttable}\n\n' '\\footnotetext[4]{\nfootnotes in table caption\n}' '\\footnotetext[5]{\nfootnotes in table\n}' in result) - assert r'\href{http://sphinx.org}{homepage}\footnote{http://sphinx.org}' in result - assert r'\footnote{https://github.com/sphinx-doc/sphinx}' not in result - assert r'\footnote{sphinx-dev@googlegroups.com}' not in result @with_app(buildername='latex', testroot='footnotes') @@ -355,8 +352,12 @@ def test_latex_show_urls_is_inline(app, status, warning): '\\leavevmode\nDescription' in result) assert ('\\item[{Footnote in term \\footnotemark[4]}] ' '\\leavevmode\\footnotetext[4]{\nFootnote in term\n}\nDescription' in result) - assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist} (http://sphinx-doc.org/)}] ' - '\\leavevmode\nDescription' in result) + assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist} ' + '(http://sphinx-doc.org/)}] \\leavevmode\nDescription' in result) + assert ('\\href{https://github.com/sphinx-doc/sphinx}' + '{https://github.com/sphinx-doc/sphinx}\n' in result) + assert ('\\href{mailto:sphinx-dev@googlegroups.com}' + '{sphinx-dev@googlegroups.com}' in result) @with_app(buildername='latex', testroot='footnotes', @@ -380,6 +381,10 @@ def test_latex_show_urls_is_footnote(app, status, warning): '\\leavevmode\\footnotetext[8]{\nFootnote in term\n}\nDescription' in result) assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist}\\footnotemark[7]}] ' '\\leavevmode\\footnotetext[7]{\nhttp://sphinx-doc.org/\n}\nDescription' in result) + assert ('\\href{https://github.com/sphinx-doc/sphinx}' + '{https://github.com/sphinx-doc/sphinx}\n' in result) + assert ('\\href{mailto:sphinx-dev@googlegroups.com}' + '{sphinx-dev@googlegroups.com}\n' in result) @with_app(buildername='latex', testroot='footnotes', @@ -401,3 +406,7 @@ def test_latex_show_urls_is_no(app, status, warning): '\\leavevmode\\footnotetext[4]{\nFootnote in term\n}\nDescription' in result) assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist}}] ' '\\leavevmode\nDescription' in result) + assert ('\\href{https://github.com/sphinx-doc/sphinx}' + '{https://github.com/sphinx-doc/sphinx}\n' in result) + assert ('\\href{mailto:sphinx-dev@googlegroups.com}' + '{sphinx-dev@googlegroups.com}\n' in result) From a21bfb1061150f95a40cf091aeca12436b2e46bb Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 19 Dec 2015 16:53:15 +0900 Subject: [PATCH 048/238] Make ShowUrlsTransform plain class --- sphinx/writers/latex.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 388fe81e1..af1c6af7a 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -18,7 +18,6 @@ from os import path from six import itervalues, text_type from docutils import nodes, writers -from docutils.transforms import Transform from docutils.writers.latex2e import Babel from sphinx import addnodes @@ -131,9 +130,12 @@ if hasattr(Babel, '_ISO639_TO_BABEL'): Babel._ISO639_TO_BABEL['sl'] = 'slovene' -class ShowUrlsTransform(Transform): +class ShowUrlsTransform(object): expanded = False + def __init__(self, document): + self.document = document + def apply(self): # replace id_prefix temporarily id_prefix = self.document.settings.id_prefix From 0b0f6d66cb03faa8e9e442556d58e63a7e8cf8d6 Mon Sep 17 00:00:00 2001 From: shimizukawa Date: Sat, 19 Dec 2015 18:57:40 +0900 Subject: [PATCH 049/238] Fix #2158: test_latex_build.test_footnote and some tests fail on Windows environment with py3 --- tests/path.py | 12 +++++++----- tests/test_build.py | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/path.py b/tests/path.py index 2f0cdc062..9e6baa36e 100755 --- a/tests/path.py +++ b/tests/path.py @@ -10,7 +10,7 @@ import os import sys import shutil -from codecs import open +from io import open from six import PY2, text_type @@ -126,21 +126,23 @@ class path(text_type): def utime(self, arg): os.utime(self, arg) - def write_text(self, text, **kwargs): + def write_text(self, text, encoding='utf-8', **kwargs): """ Writes the given `text` to the file. """ - f = open(self, 'w', **kwargs) + if isinstance(text, bytes): + text = text.decode(encoding) + f = open(self, 'w', encoding=encoding, **kwargs) try: f.write(text) finally: f.close() - def text(self, **kwargs): + def text(self, encoding='utf-8', **kwargs): """ Returns the text in the file. """ - f = open(self, mode='U', **kwargs) + f = open(self, mode='U', encoding=encoding, **kwargs) try: return f.read() finally: diff --git a/tests/test_build.py b/tests/test_build.py index ed39f6971..5b9d7a756 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -58,12 +58,12 @@ def test_build_all(): """)) master_doc = srcdir / 'contents.txt' - master_doc.write_bytes((master_doc.text() + dedent(""" + master_doc.write_text(master_doc.text() + dedent(u""" .. toctree:: %(test_name)s/%(test_name)s """ % {'test_name': test_name}) - ).encode('utf-8')) + ) # note: no 'html' - if it's ok with dirhtml it's ok with html for buildername in ['dirhtml', 'singlehtml', 'latex', 'texinfo', 'pickle', From 209e5f29b1263076d55584728a2971c4c23e0305 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 19 Dec 2015 20:33:43 +0900 Subject: [PATCH 050/238] Fix #2168: raw directive does not work for text writer --- CHANGES | 1 + sphinx/writers/text.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 996337a23..cc132f465 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,7 @@ Bugs fixed * #2176: sphinx.ext.graphviz: use instead of to embed svg * #967: Fix SVG inheritance diagram is not hyperlinked (clickable) * #1237: Fix footnotes not working in definition list in LaTeX +* #2168: Fix raw directive does not work for text writer Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/writers/text.py b/sphinx/writers/text.py index a4785a980..8e5fd237d 100644 --- a/sphinx/writers/text.py +++ b/sphinx/writers/text.py @@ -940,7 +940,9 @@ class TextTranslator(nodes.NodeVisitor): def visit_raw(self, node): if 'text' in node.get('format', '').split(): - self.body.append(node.astext()) + self.new_state(0) + self.add_text(node.astext()) + self.end_state(wrap = False) raise nodes.SkipNode def visit_math(self, node): From 788c0ebffc7d6a481a95c341a13150c4cdb0e333 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 19 Dec 2015 22:49:14 +0900 Subject: [PATCH 051/238] Add testcase for encoding URIs in linkcheck builder --- sphinx/builders/linkcheck.py | 13 +++---------- sphinx/util/__init__.py | 13 +++++++++++++ tests/test_util.py | 19 +++++++++++++++++++ 3 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 tests/test_util.py diff --git a/sphinx/builders/linkcheck.py b/sphinx/builders/linkcheck.py index b05c5b2e0..15b22d9e1 100644 --- a/sphinx/builders/linkcheck.py +++ b/sphinx/builders/linkcheck.py @@ -17,7 +17,7 @@ from os import path from six.moves import queue from six.moves.urllib.request import build_opener, Request, HTTPRedirectHandler -from six.moves.urllib.parse import unquote, urlsplit, quote +from six.moves.urllib.parse import unquote from six.moves.urllib.error import HTTPError from six.moves.html_parser import HTMLParser from docutils import nodes @@ -33,6 +33,7 @@ except ImportError: pass from sphinx.builders import Builder +from sphinx.util import encode_uri from sphinx.util.console import purple, red, darkgreen, darkgray, \ darkred, turquoise from sphinx.util.pycompat import TextIOWrapper @@ -153,15 +154,7 @@ class CheckExternalLinksBuilder(Builder): try: req_url.encode('ascii') except UnicodeError: - split = urlsplit(req_url) - req_url = (split[0].encode() + '://' + # scheme - split[1].encode('idna') + # netloc - quote(split[2].encode('utf-8'))) # path - if split[3]: # query - req_url += '?' + quote(split[3].encode('utf-8')) - # go back to Unicode strings which is required by Python 3 - # (but now all parts are pure ascii) - req_url = req_url.decode('ascii') + req_url = encode_uri(req_url) # need to actually check the URI try: diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index e23539fdc..11af02f82 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -23,6 +23,7 @@ from collections import deque from six import iteritems, text_type, binary_type from six.moves import range +from six.moves.urllib.parse import urlsplit, quote import docutils from docutils.utils import relative_path @@ -523,3 +524,15 @@ def import_object(objname, source=None): raise ExtensionError('Could not find %s' % objname + (source and ' (needed for %s)' % source or ''), err) + + +def encode_uri(uri): + split = urlsplit(uri) + req_url = (split[0].encode() + '://' + # scheme + split[1].encode('idna') + # netloc + quote(split[2].encode('utf-8'))) # path + if split[3]: # query + req_url += '?' + quote(split[3].encode('utf-8')) + # go back to Unicode strings which is required by Python 3 + # (but now all parts are pure ascii) + return req_url.decode('ascii') diff --git a/tests/test_util.py b/tests/test_util.py new file mode 100644 index 000000000..1e2eee5a0 --- /dev/null +++ b/tests/test_util.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +""" + test_util + ~~~~~~~~~~~~~~~ + + Tests util functions. + + :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" +from sphinx.util import encode_uri + + +def test_encode_uri(): + expected = (u'https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_' + u'%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_' + u'%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85') + uri = 'https://ru.wikipedia.org/wiki/Система_управления_базами_данных' + assert expected, encode_uri(uri) From 9669f2a48b3c91ba4fa9398a0a607a5f75f0b5ae Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 19 Dec 2015 22:58:53 +0900 Subject: [PATCH 052/238] Fix #2171: cannot linkcheck url with unicode --- CHANGES | 1 + sphinx/util/__init__.py | 18 ++++++++---------- tests/test_util.py | 8 +++++++- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index cc132f465..ef7083505 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,7 @@ Bugs fixed * #967: Fix SVG inheritance diagram is not hyperlinked (clickable) * #1237: Fix footnotes not working in definition list in LaTeX * #2168: Fix raw directive does not work for text writer +* #2171: Fix cannot linkcheck url with unicode Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index 11af02f82..bd7f564f7 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -23,7 +23,7 @@ from collections import deque from six import iteritems, text_type, binary_type from six.moves import range -from six.moves.urllib.parse import urlsplit, quote +from six.moves.urllib.parse import urlsplit, urlunsplit, quote_plus, parse_qsl, urlencode import docutils from docutils.utils import relative_path @@ -527,12 +527,10 @@ def import_object(objname, source=None): def encode_uri(uri): - split = urlsplit(uri) - req_url = (split[0].encode() + '://' + # scheme - split[1].encode('idna') + # netloc - quote(split[2].encode('utf-8'))) # path - if split[3]: # query - req_url += '?' + quote(split[3].encode('utf-8')) - # go back to Unicode strings which is required by Python 3 - # (but now all parts are pure ascii) - return req_url.decode('ascii') + split = list(urlsplit(uri)) + split[1] = split[1].encode('idna').decode('ascii') + split[2] = quote_plus(split[2].encode('utf-8'), '/').decode('ascii') + query = list((q, quote_plus(v.encode('utf-8'))) + for (q, v) in parse_qsl(split[3])) + split[3] = urlencode(query).decode('ascii') + return urlunsplit(split) diff --git a/tests/test_util.py b/tests/test_util.py index 1e2eee5a0..3d30b6fe0 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -15,5 +15,11 @@ def test_encode_uri(): expected = (u'https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_' u'%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_' u'%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85') - uri = 'https://ru.wikipedia.org/wiki/Система_управления_базами_данных' + uri = u'https://ru.wikipedia.org/wiki/Система_управления_базами_данных' + assert expected, encode_uri(uri) + + expected = (u'https://github.com/search?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+is%3A' + u'sprint-friendly+user%3Ajupyter&type=Issues&ref=searchresults') + uri = (u'https://github.com/search?utf8=✓&q=is%3Aissue+is%3Aopen+is%3A' + u'sprint-friendly+user%3Ajupyter&type=Issues&ref=searchresults') assert expected, encode_uri(uri) From 61d18a533fbe37c10259dd2ceb5ebd0674753d56 Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Sat, 19 Dec 2015 12:51:52 -0800 Subject: [PATCH 053/238] Update changes for #2182 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index ef7083505..2ffb8c1a8 100644 --- a/CHANGES +++ b/CHANGES @@ -13,6 +13,7 @@ Bugs fixed * #1237: Fix footnotes not working in definition list in LaTeX * #2168: Fix raw directive does not work for text writer * #2171: Fix cannot linkcheck url with unicode +* #2182: LaTeX: support image file names with more than 1 dots Release 1.3.3 (released Dec 2, 2015) From 91fe0b6ceb340ff7a7a83f0e195d5cbbadb830e6 Mon Sep 17 00:00:00 2001 From: shimizukawa Date: Sun, 20 Dec 2015 08:07:40 +0900 Subject: [PATCH 054/238] Fix #2185: Use with syntax to open files on testing. --- tests/path.py | 23 +++++++---------------- tests/test_build_html.py | 40 ++++++++-------------------------------- 2 files changed, 15 insertions(+), 48 deletions(-) diff --git a/tests/path.py b/tests/path.py index 9e6baa36e..68984e0ae 100755 --- a/tests/path.py +++ b/tests/path.py @@ -126,37 +126,31 @@ class path(text_type): def utime(self, arg): os.utime(self, arg) + def open(self, mode='r', **kwargs): + return open(self, mode, **kwargs) + def write_text(self, text, encoding='utf-8', **kwargs): """ Writes the given `text` to the file. """ if isinstance(text, bytes): text = text.decode(encoding) - f = open(self, 'w', encoding=encoding, **kwargs) - try: + with open(self, 'w', encoding=encoding, **kwargs) as f: f.write(text) - finally: - f.close() def text(self, encoding='utf-8', **kwargs): """ Returns the text in the file. """ - f = open(self, mode='U', encoding=encoding, **kwargs) - try: + with open(self, mode='U', encoding=encoding, **kwargs) as f: return f.read() - finally: - f.close() def bytes(self): """ Returns the bytes in the file. """ - f = open(self, mode='rb') - try: + with open(self, mode='rb') as f: return f.read() - finally: - f.close() def write_bytes(self, bytes, append=False): """ @@ -169,11 +163,8 @@ class path(text_type): mode = 'ab' else: mode = 'wb' - f = open(self, mode=mode) - try: + with open(self, mode=mode) as f: f.write(bytes) - finally: - f.close() def exists(self): """ diff --git a/tests/test_build_html.py b/tests/test_build_html.py index accf5b140..eaffad00c 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -376,11 +376,8 @@ def test_html_output(app, status, warning): for fname, paths in iteritems(HTML_XPATH): parser = NslessParser() parser.entity.update(html_entities.entitydefs) - fp = open(os.path.join(app.outdir, fname), 'rb') - try: + with (app.outdir / fname).open('rb') as fp: etree = ET.parse(fp, parser) - finally: - fp.close() for path, check in paths: yield check_xpath, etree, fname, path, check @@ -429,11 +426,8 @@ def test_tocdepth(app, status, warning): for fname, paths in iteritems(expects): parser = NslessParser() parser.entity.update(html_entities.entitydefs) - fp = open(os.path.join(app.outdir, fname), 'rb') - try: + with (app.outdir / fname).open('rb') as fp: etree = ET.parse(fp, parser) - finally: - fp.close() for xpath, check, be_found in paths: yield check_xpath, etree, fname, xpath, check, be_found @@ -474,11 +468,8 @@ def test_tocdepth_singlehtml(app, status, warning): for fname, paths in iteritems(expects): parser = NslessParser() parser.entity.update(html_entities.entitydefs) - fp = open(os.path.join(app.outdir, fname), 'rb') - try: + with (app.outdir / fname).open('rb') as fp: etree = ET.parse(fp, parser) - finally: - fp.close() for xpath, check, be_found in paths: yield check_xpath, etree, fname, xpath, check, be_found @@ -531,11 +522,8 @@ def test_numfig_disabled(app, status, warning): for fname, paths in iteritems(expects): parser = NslessParser() parser.entity.update(html_entities.entitydefs) - fp = open(os.path.join(app.outdir, fname), 'rb') - try: + with (app.outdir / fname).open('rb') as fp: etree = ET.parse(fp, parser) - finally: - fp.close() for xpath, check, be_found in paths: yield check_xpath, etree, fname, xpath, check, be_found @@ -633,11 +621,8 @@ def test_numfig_without_numbered_toctree(app, status, warning): for fname, paths in iteritems(expects): parser = NslessParser() parser.entity.update(html_entities.entitydefs) - fp = open(os.path.join(app.outdir, fname), 'rb') - try: + with (app.outdir / fname).open('rb') as fp: etree = ET.parse(fp, parser) - finally: - fp.close() for xpath, check, be_found in paths: yield check_xpath, etree, fname, xpath, check, be_found @@ -731,11 +716,8 @@ def test_numfig_with_numbered_toctree(app, status, warning): for fname, paths in iteritems(expects): parser = NslessParser() parser.entity.update(html_entities.entitydefs) - fp = open(os.path.join(app.outdir, fname), 'rb') - try: + with (app.outdir / fname).open('rb') as fp: etree = ET.parse(fp, parser) - finally: - fp.close() for xpath, check, be_found in paths: yield check_xpath, etree, fname, xpath, check, be_found @@ -832,11 +814,8 @@ def test_numfig_with_prefix(app, status, warning): for fname, paths in iteritems(expects): parser = NslessParser() parser.entity.update(html_entities.entitydefs) - fp = open(os.path.join(app.outdir, fname), 'rb') - try: + with (app.outdir / fname).open('rb') as fp: etree = ET.parse(fp, parser) - finally: - fp.close() for xpath, check, be_found in paths: yield check_xpath, etree, fname, xpath, check, be_found @@ -930,11 +909,8 @@ def test_numfig_with_secnum_depth(app, status, warning): for fname, paths in iteritems(expects): parser = NslessParser() parser.entity.update(html_entities.entitydefs) - fp = open(os.path.join(app.outdir, fname), 'rb') - try: + with (app.outdir / fname).open('rb') as fp: etree = ET.parse(fp, parser) - finally: - fp.close() for xpath, check, be_found in paths: yield check_xpath, etree, fname, xpath, check, be_found From eac142f8b894d3af34e73752ecc9cba3e31a3d76 Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Sat, 19 Dec 2015 19:24:16 -0800 Subject: [PATCH 055/238] LaTeX: Support math in section titles Fix #1480 --- sphinx/ext/mathbase.py | 18 +++++++++++++++++- tests/root/math.txt | 4 ++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/sphinx/ext/mathbase.py b/sphinx/ext/mathbase.py index 1c5de3cd7..5cd157275 100644 --- a/sphinx/ext/mathbase.py +++ b/sphinx/ext/mathbase.py @@ -56,6 +56,17 @@ def eq_role(role, rawtext, text, lineno, inliner, options={}, content=[]): return [node], [] +def is_in_section_title(node): + """Determine whether the node is in a section title""" + from sphinx.util.nodes import traverse_parent + + for ancestor in traverse_parent(node): + if isinstance(ancestor, nodes.title) and \ + isinstance(ancestor.parent, nodes.section): + return True + return False + + class MathDirective(Directive): has_content = True @@ -91,7 +102,12 @@ class MathDirective(Directive): def latex_visit_math(self, node): - self.body.append('\\(' + node['latex'] + '\\)') + if is_in_section_title(node): + protect = r'\protect' + else: + protect = '' + equation = protect + r'\(' + node['latex'] + protect + r'\)' + self.body.append(equation) raise nodes.SkipNode diff --git a/tests/root/math.txt b/tests/root/math.txt index 36b244943..b252353c7 100644 --- a/tests/root/math.txt +++ b/tests/root/math.txt @@ -1,5 +1,5 @@ -Test math extensions -==================== +Test math extensions :math:`E = m c^2` +====================================== This is inline math: :math:`a^2 + b^2 = c^2`. From 4234c88f21f7f2a120a8d3df8aea1244ee8e2986 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sun, 20 Dec 2015 22:44:32 +0900 Subject: [PATCH 056/238] Fix #2113: Allow ``:class:`` option to code-block directive --- CHANGES | 1 + sphinx/directives/code.py | 4 ++++ tests/roots/test-directive-code/classes.rst | 21 +++++++++++++++++++++ tests/test_directive_code.py | 17 +++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 tests/roots/test-directive-code/classes.rst diff --git a/CHANGES b/CHANGES index 0355e9e4c..71a2b137f 100644 --- a/CHANGES +++ b/CHANGES @@ -18,6 +18,7 @@ Features added using HTTP basic auth * C++, added support for template parameter in function info field lists. * C++, added support for pointers to member (function). +* #2113: Allow ``:class:`` option to code-block directive Bugs fixed ---------- diff --git a/sphinx/directives/code.py b/sphinx/directives/code.py index f31ba7a99..5b4bcde6d 100644 --- a/sphinx/directives/code.py +++ b/sphinx/directives/code.py @@ -93,6 +93,7 @@ class CodeBlock(Directive): 'lineno-start': int, 'emphasize-lines': directives.unchanged_required, 'caption': directives.unchanged_required, + 'class': directives.class_option, 'name': directives.unchanged, } @@ -119,6 +120,7 @@ class CodeBlock(Directive): literal['language'] = self.arguments[0] literal['linenos'] = 'linenos' in self.options or \ 'lineno-start' in self.options + literal['classes'] += self.options.get('class', []) extra_args = literal['highlight_args'] = {} if hl_lines is not None: extra_args['hl_lines'] = hl_lines @@ -165,6 +167,7 @@ class LiteralInclude(Directive): 'append': directives.unchanged_required, 'emphasize-lines': directives.unchanged_required, 'caption': directives.unchanged, + 'class': directives.class_option, 'name': directives.unchanged, 'diff': directives.unchanged_required, } @@ -322,6 +325,7 @@ class LiteralInclude(Directive): retnode['linenos'] = 'linenos' in self.options or \ 'lineno-start' in self.options or \ 'lineno-match' in self.options + retnode['classes'] += self.options.get('class', []) extra_args = retnode['highlight_args'] = {} if hl_lines is not None: extra_args['hl_lines'] = hl_lines diff --git a/tests/roots/test-directive-code/classes.rst b/tests/roots/test-directive-code/classes.rst new file mode 100644 index 000000000..e9aa5d9c4 --- /dev/null +++ b/tests/roots/test-directive-code/classes.rst @@ -0,0 +1,21 @@ +classes +======= + +Code blocks +----------- + +.. code-block:: ruby + :class: foo bar + :name: code_block + + def ruby? + false + end + + +Literal Includes +---------------- + +.. literalinclude:: literal.inc + :class: bar baz + :name: literal_include diff --git a/tests/test_directive_code.py b/tests/test_directive_code.py index 4f07beb99..25bed6c05 100644 --- a/tests/test_directive_code.py +++ b/tests/test_directive_code.py @@ -207,3 +207,20 @@ def test_literalinclude_caption_latex(app, status, warning): latex = (app.outdir / 'Python.tex').text(encoding='utf-8') caption = '\\captionof{literal-block}{caption \\textbf{test} py}' assert caption in latex + + +@with_app('xml', testroot='directive-code') +def test_literalinclude_classes(app, status, warning): + app.builder.build(['classes']) + et = ElementTree.parse(app.outdir / 'classes.xml') + secs = et.findall('./section/section') + + code_block = secs[0].findall('literal_block') + assert len(code_block) > 0 + assert 'foo bar' == code_block[0].get('classes') + assert 'code_block' == code_block[0].get('names') + + literalinclude = secs[1].findall('literal_block') + assert len(literalinclude) > 0 + assert 'bar baz' == literalinclude[0].get('classes') + assert 'literal_include' == literalinclude[0].get('names') From f85d1a0b999796ee3bb653b8cdf219de14e87542 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Mon, 21 Dec 2015 11:40:53 +0900 Subject: [PATCH 057/238] Fix #2189: previous sibling link has broken if the file was appeared twice or more --- CHANGES | 1 + sphinx/environment.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index 2ffb8c1a8..0b9878189 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,7 @@ Bugs fixed * #2168: Fix raw directive does not work for text writer * #2171: Fix cannot linkcheck url with unicode * #2182: LaTeX: support image file names with more than 1 dots +* #2189: Fix previous sibling link for first file in subdirectory uses last file, not intended previous from root toctree Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/environment.py b/sphinx/environment.py index da92f2e81..ac95a4eb6 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -1958,6 +1958,8 @@ class BuildEnvironment: if docname in parents_set: # we will warn about this in resolve_toctree() return + if docname in relations: + return includes = getinc(docname) # previous if not previous: From 4d3fdc0e47b88c8afe31acfe0cebe076481afe2c Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Sat, 19 Dec 2015 19:34:39 -0800 Subject: [PATCH 058/238] Fix LaTeX output of \mathbb in math If \mathbb is used in math, which is commonly used to represent sets, the output LaTeX won't compile. This commit fixes this issue by adding amsfonts package in the setup of sphinx.ext.mathbase . --- sphinx/ext/mathbase.py | 1 + tests/root/math.txt | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/sphinx/ext/mathbase.py b/sphinx/ext/mathbase.py index 1c5de3cd7..97c9eac5b 100644 --- a/sphinx/ext/mathbase.py +++ b/sphinx/ext/mathbase.py @@ -214,3 +214,4 @@ def setup_math(app, htmlinlinevisitors, htmldisplayvisitors): app.add_role('eq', eq_role) app.add_directive('math', MathDirective) app.connect('doctree-resolved', number_equations) + app.add_latex_package('amsfonts') diff --git a/tests/root/math.txt b/tests/root/math.txt index 36b244943..4c3c363dc 100644 --- a/tests/root/math.txt +++ b/tests/root/math.txt @@ -19,4 +19,8 @@ This is inline math: :math:`a^2 + b^2 = c^2`. e^{ix} = \cos x + i\sin x +.. math:: + + n \in \mathbb N + Referencing equation :eq:`foo`. From 8b57bc72277ed3b230a1aa96ab31b1cb48bb080b Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Mon, 21 Dec 2015 22:34:04 +0900 Subject: [PATCH 059/238] Fix #2003: decode error under python2 (only) when ``make linkcheck`` is run --- CHANGES | 2 ++ sphinx/builders/linkcheck.py | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/CHANGES b/CHANGES index 0b9878189..6952a7f4b 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,8 @@ Bugs fixed * #2171: Fix cannot linkcheck url with unicode * #2182: LaTeX: support image file names with more than 1 dots * #2189: Fix previous sibling link for first file in subdirectory uses last file, not intended previous from root toctree +* #2003: Fix decode error under python2 (only) when ``make linkcheck`` is run + Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/builders/linkcheck.py b/sphinx/builders/linkcheck.py index 15b22d9e1..5dac89e2f 100644 --- a/sphinx/builders/linkcheck.py +++ b/sphinx/builders/linkcheck.py @@ -95,6 +95,17 @@ def check_anchor(f, hash): return parser.found +def get_content_charset(f): + content_type = f.headers.get('content-type') + if content_type: + params = (p.strip() for p in content_type.split(';')[1:]) + for param in params: + if param.startswith('charset='): + return param[8:] + + return None + + class CheckExternalLinksBuilder(Builder): """ Checks for broken external links. @@ -165,6 +176,8 @@ class CheckExternalLinksBuilder(Builder): encoding = 'utf-8' if hasattr(f.headers, 'get_content_charset'): encoding = f.headers.get_content_charset() or encoding + else: + encoding = get_content_charset(f) or encoding found = check_anchor(TextIOWrapper(f, encoding), unquote(hash)) f.close() From 21093adfeeb8d3e60ecdda8f6712954eb3a8454d Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Tue, 22 Dec 2015 10:29:27 +0900 Subject: [PATCH 060/238] Update CHANGES for #2186 --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 6952a7f4b..d4f5c5e35 100644 --- a/CHANGES +++ b/CHANGES @@ -16,7 +16,7 @@ Bugs fixed * #2182: LaTeX: support image file names with more than 1 dots * #2189: Fix previous sibling link for first file in subdirectory uses last file, not intended previous from root toctree * #2003: Fix decode error under python2 (only) when ``make linkcheck`` is run - +* #2186: Fix LaTeX output of \mathbb in math Release 1.3.3 (released Dec 2, 2015) From ae1d9d8ff7bbc2bf4166cb5fef15cdacad4ac3e0 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Tue, 22 Dec 2015 11:35:30 +0900 Subject: [PATCH 061/238] Update CHANGES for PR #2188 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index d4f5c5e35..1710efb35 100644 --- a/CHANGES +++ b/CHANGES @@ -17,6 +17,7 @@ Bugs fixed * #2189: Fix previous sibling link for first file in subdirectory uses last file, not intended previous from root toctree * #2003: Fix decode error under python2 (only) when ``make linkcheck`` is run * #2186: Fix LaTeX output of \mathbb in math +* #1480, #2188: LaTeX: Support math in section titles Release 1.3.3 (released Dec 2, 2015) From 02f013aba556d5d84429afb15e417f4d1c292b9e Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 24 Dec 2015 10:57:03 +0900 Subject: [PATCH 062/238] Fix TestApp.cleanup_trees was obsoleted --- tests/test_build_latex.py | 1 - tests/test_build_texinfo.py | 1 - 2 files changed, 2 deletions(-) diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index d4f9f8451..521572ac3 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -87,7 +87,6 @@ def test_latex(app, status, warning): if p.returncode != 0: print(stdout) print(stderr) - del app.cleanup_trees[:] assert False, 'latex exited with return code %s' % p.returncode finally: os.chdir(cwd) diff --git a/tests/test_build_texinfo.py b/tests/test_build_texinfo.py index 8050695d9..618d79015 100644 --- a/tests/test_build_texinfo.py +++ b/tests/test_build_texinfo.py @@ -58,7 +58,6 @@ def test_texinfo(app, status, warning): if retcode != 0: print(stdout) print(stderr) - del app.cleanup_trees[:] assert False, 'makeinfo exited with return code %s' % retcode finally: os.chdir(cwd) From ee7e3cc078365ab20be24e846fbc868b422d252d Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Thu, 24 Dec 2015 12:41:07 +0900 Subject: [PATCH 063/238] Fix empty cell in table header causes LaTeX error (#1574) --- sphinx/writers/latex.py | 7 +++++-- tests/root/markup.txt | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index af1c6af7a..192207bce 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1061,8 +1061,11 @@ class LaTeXTranslator(nodes.NodeVisitor): self.remember_multirowcol[self.table.col] = node.get('morecols') self.table.col += node.get('morecols') if isinstance(node.parent.parent, nodes.thead): - self.body.append('\\textsf{\\relax ') - context += '}' + if len(node) == 1 and isinstance(node[0], nodes.paragraph) and node.astext() == '': + pass + else: + self.body.append('\\textsf{\\relax ') + context += '}' while self.remember_multirow.get(self.table.col + 1, 0): self.table.col += 1 self.remember_multirow[self.table.col] -= 1 diff --git a/tests/root/markup.txt b/tests/root/markup.txt index 9e8c6bc86..b322b39fa 100644 --- a/tests/root/markup.txt +++ b/tests/root/markup.txt @@ -187,6 +187,15 @@ Tables | 2 | Empty cells: | | +----+----------------+----+ +.. table:: empty cell in table header + + ===== ====== + \ + ===== ====== + 1 2 + 3 4 + ===== ====== + Tables with multirow and multicol: .. only:: latex From 0719611d54b7f40233c2e69439b35dd2b08f98b0 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Fri, 25 Dec 2015 10:43:41 +0900 Subject: [PATCH 064/238] Fix #2071: Same footnote in more than two section titles => LaTeX/PDF Bug --- CHANGES | 1 + sphinx/writers/latex.py | 2 +- tests/roots/test-footnotes/index.rst | 3 +++ tests/test_build_latex.py | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 1710efb35..9d2aee6b1 100644 --- a/CHANGES +++ b/CHANGES @@ -18,6 +18,7 @@ Bugs fixed * #2003: Fix decode error under python2 (only) when ``make linkcheck`` is run * #2186: Fix LaTeX output of \mathbb in math * #1480, #2188: LaTeX: Support math in section titles +* #2071: Fix same footnote in more than two section titles => LaTeX/PDF Bug Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 192207bce..f5f3b64b2 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1662,7 +1662,7 @@ class LaTeXTranslator(nodes.NodeVisitor): # if a footnote has been inserted once, it shouldn't be repeated # by the next reference if used: - if self.table or self.in_term: + if self.table or self.in_term or self.in_title: self.body.append('\\protect\\footnotemark[%s]' % num) else: self.body.append('\\footnotemark[%s]' % num) diff --git a/tests/roots/test-footnotes/index.rst b/tests/roots/test-footnotes/index.rst index c7fe38ff9..e8137da71 100644 --- a/tests/roots/test-footnotes/index.rst +++ b/tests/roots/test-footnotes/index.rst @@ -33,6 +33,9 @@ The section with a reference to [AuthorYear]_ .. [1] Second .. [#] Third +The section with a reference to [1]_ +===================================== + `URL in term `_ Description Description Description ... diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 521572ac3..3b2fdaaaa 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -331,6 +331,7 @@ def test_reference_in_caption(app, status, warning): assert '\\chapter{The section with a reference to {[}AuthorYear{]}}' in result assert '\\caption{The table title with a reference to {[}AuthorYear{]}}' in result assert '\\paragraph{The rubric title with a reference to {[}AuthorYear{]}}' in result + assert '\\chapter{The section with a reference to \\protect\\footnotemark[1]}' in result @with_app(buildername='latex', testroot='footnotes', From f1cf5d594a8cdb3a5008d700af6b88084e634dc6 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Fri, 25 Dec 2015 15:52:51 +0900 Subject: [PATCH 065/238] Fix #2040: UnicodeDecodeError in sphinx-apidoc when author contains non-ascii characters --- CHANGES | 1 + sphinx/apidoc.py | 19 +++++++++++++++---- tests/test_apidoc.py | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 9d2aee6b1..8ac51f522 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,7 @@ Bugs fixed * #2186: Fix LaTeX output of \mathbb in math * #1480, #2188: LaTeX: Support math in section titles * #2071: Fix same footnote in more than two section titles => LaTeX/PDF Bug +* #2040: Fix UnicodeDecodeError in sphinx-apidoc when author contains non-ascii characters Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/apidoc.py b/sphinx/apidoc.py index 10311e6f3..73bb963ce 100644 --- a/sphinx/apidoc.py +++ b/sphinx/apidoc.py @@ -353,10 +353,10 @@ Note: By default this script will not overwrite already created files.""") path = opts.destdir, sep = False, dot = '_', - project = opts.header, - author = opts.author or 'Author', - version = opts.version or '', - release = opts.release or opts.version or '', + project = None, + author = 'Author', + version = '', + release = '', suffix = '.' + opts.suffix, master = 'index', epub = True, @@ -369,6 +369,17 @@ Note: By default this script will not overwrite already created files.""") mastertoctree = text, language = 'en', ) + if opts.header: + d['project'] = opts.header.decode('utf-8') + if opts.author: + d['author'] = opts.author.decode('utf-8') + if opts.version: + d['version'] = opts.version.decode('utf-8') + if opts.release: + d['release'] = opts.release.decode('utf-8') + elif opts.version: + d['release'] = opts.version.decode('utf-8') + if not opts.dryrun: qs.generate(d, silent=True, overwrite=opts.force) elif not opts.notoc: diff --git a/tests/test_apidoc.py b/tests/test_apidoc.py index 215b2e571..64fcd8fc0 100644 --- a/tests/test_apidoc.py +++ b/tests/test_apidoc.py @@ -40,3 +40,37 @@ def test_simple(tempdir): assert_build() finally: sys.path.remove(codedir) + + +@with_tempdir +def test_multibyte_parameters(tempdir): + codedir = rootdir / 'root' + outdir = tempdir / 'out' + args = ['sphinx-apidoc', '-o', outdir, '-F', codedir, + '--doc-project', u'プロジェクト名'.encode('utf-8'), + '--doc-author', u'著者名'.encode('utf-8'), + '--doc-version', u'バージョン'.encode('utf-8'), + '--doc-release', u'リリース'.encode('utf-8')] + apidoc.main(args) + + assert (outdir / 'conf.py').isfile() + assert (outdir / 'autodoc_fodder.rst').isfile() + assert (outdir / 'index.rst').isfile() + + conf_py = (outdir / 'conf.py').text() + assert u"project = u'プロジェクト名'" in conf_py + assert u"author = u'著者名'" in conf_py + assert u"version = u'バージョン'" in conf_py + assert u"release = u'リリース'" in conf_py + + @with_app('text', srcdir=outdir) + def assert_build(app, status, warning): + app.build() + print(status.getvalue()) + print(warning.getvalue()) + + sys.path.append(codedir) + try: + assert_build() + finally: + sys.path.remove(codedir) From 66ef8102c47415c5249b8973661927251ca810f5 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Fri, 25 Dec 2015 16:10:37 +0900 Subject: [PATCH 066/238] Fix broken in py3 --- sphinx/apidoc.py | 27 +++++++++++++-------------- tests/test_apidoc.py | 15 +++++++++++---- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/sphinx/apidoc.py b/sphinx/apidoc.py index 73bb963ce..1238693c8 100644 --- a/sphinx/apidoc.py +++ b/sphinx/apidoc.py @@ -20,6 +20,7 @@ import os import sys import optparse from os import path +from six import binary_type from sphinx.util.osutil import walk from sphinx import __display_version__ @@ -353,10 +354,10 @@ Note: By default this script will not overwrite already created files.""") path = opts.destdir, sep = False, dot = '_', - project = None, - author = 'Author', - version = '', - release = '', + project = opts.header, + author = opts.author or 'Author', + version = opts.version or '', + release = opts.release or opts.version or '', suffix = '.' + opts.suffix, master = 'index', epub = True, @@ -369,16 +370,14 @@ Note: By default this script will not overwrite already created files.""") mastertoctree = text, language = 'en', ) - if opts.header: - d['project'] = opts.header.decode('utf-8') - if opts.author: - d['author'] = opts.author.decode('utf-8') - if opts.version: - d['version'] = opts.version.decode('utf-8') - if opts.release: - d['release'] = opts.release.decode('utf-8') - elif opts.version: - d['release'] = opts.version.decode('utf-8') + if isinstance(opts.header, binary_type): + d['project'] = d['project'].decode('utf-8') + if isinstance(opts.author, binary_type): + d['author'] = d['author'].decode('utf-8') + if isinstance(opts.version, binary_type): + d['version'] = d['version'].decode('utf-8') + if isinstance(opts.release, binary_type): + d['release'] = d['release'].decode('utf-8') if not opts.dryrun: qs.generate(d, silent=True, overwrite=opts.force) diff --git a/tests/test_apidoc.py b/tests/test_apidoc.py index 64fcd8fc0..794b1a293 100644 --- a/tests/test_apidoc.py +++ b/tests/test_apidoc.py @@ -12,6 +12,7 @@ from __future__ import print_function import sys +from six import PY2 from sphinx import apidoc @@ -58,10 +59,16 @@ def test_multibyte_parameters(tempdir): assert (outdir / 'index.rst').isfile() conf_py = (outdir / 'conf.py').text() - assert u"project = u'プロジェクト名'" in conf_py - assert u"author = u'著者名'" in conf_py - assert u"version = u'バージョン'" in conf_py - assert u"release = u'リリース'" in conf_py + if PY2: + assert u"project = u'プロジェクト名'" in conf_py + assert u"author = u'著者名'" in conf_py + assert u"version = u'バージョン'" in conf_py + assert u"release = u'リリース'" in conf_py + else: + assert u"project = 'プロジェクト名'" in conf_py + assert u"author = '著者名'" in conf_py + assert u"version = 'バージョン'" in conf_py + assert u"release = 'リリース'" in conf_py @with_app('text', srcdir=outdir) def assert_build(app, status, warning): From 9c2704b705d9989ff235625fbf735c79b8086753 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 26 Dec 2015 01:44:40 +0900 Subject: [PATCH 067/238] Fix #2193: shutil.SameFileError if source directory and destination directory are same --- CHANGES | 1 + sphinx/cmdline.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/CHANGES b/CHANGES index 8ac51f522..561d0f45c 100644 --- a/CHANGES +++ b/CHANGES @@ -20,6 +20,7 @@ Bugs fixed * #1480, #2188: LaTeX: Support math in section titles * #2071: Fix same footnote in more than two section titles => LaTeX/PDF Bug * #2040: Fix UnicodeDecodeError in sphinx-apidoc when author contains non-ascii characters +* #2193: Fix shutil.SameFileError if source directory and destination directory are same Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/cmdline.py b/sphinx/cmdline.py index e411836c3..e9d76bb83 100644 --- a/sphinx/cmdline.py +++ b/sphinx/cmdline.py @@ -144,6 +144,10 @@ def main(argv): file=sys.stderr) return 1 outdir = abspath(args[1]) + if srcdir == outdir: + print('Error: source directory and destination directory are same.', + file=sys.stderr) + return 1 except IndexError: parser.print_help() return 1 From f1518c5fc4446d63c0ba92150f5a226e3691aa62 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 26 Dec 2015 11:17:04 +0900 Subject: [PATCH 068/238] Fix #2183 porterstemmer causes `make json` to fail Drop PorterStemmer package support. For now, PyStemmer can accelarate stemming process of snowballstemmer. --- CHANGES | 1 + sphinx/search/en.py | 21 +++++---------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/CHANGES b/CHANGES index 561d0f45c..af3293ff6 100644 --- a/CHANGES +++ b/CHANGES @@ -21,6 +21,7 @@ Bugs fixed * #2071: Fix same footnote in more than two section titles => LaTeX/PDF Bug * #2040: Fix UnicodeDecodeError in sphinx-apidoc when author contains non-ascii characters * #2193: Fix shutil.SameFileError if source directory and destination directory are same +* #2183: Fix porterstemmer causes `make json` to fail Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/search/en.py b/sphinx/search/en.py index de77ae294..08b113c62 100644 --- a/sphinx/search/en.py +++ b/sphinx/search/en.py @@ -12,18 +12,11 @@ from sphinx.search import SearchLanguage try: - # http://bitbucket.org/methane/porterstemmer/ - from porterstemmer import Stemmer as CStemmer - CSTEMMER = True - PYSTEMMER = False + from Stemmer import Stemmer as PyStemmer + PYSTEMMER = True except ImportError: - CSTEMMER = False - try: - from Stemmer import Stemmer as PyStemmer - PYSTEMMER = True - except ImportError: - from sphinx.util.stemmer import PorterStemmer - PYSTEMMER = False + from sphinx.util.stemmer import PorterStemmer + PYSTEMMER = False english_stopwords = set(""" a and are as at @@ -231,11 +224,7 @@ class SearchEnglish(SearchLanguage): stopwords = english_stopwords def init(self, options): - if CSTEMMER: - class Stemmer(CStemmer): - def stem(self, word): - return self(word.lower()) - elif PYSTEMMER: + if PYSTEMMER: class Stemmer(object): def __init__(self): self.stemmer = PyStemmer('porter') From 026fde47b03be4157d73093d18044cde83681cb8 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 26 Dec 2015 11:17:04 +0900 Subject: [PATCH 069/238] Fix #2183 porterstemmer causes `make json` to fail Drop PorterStemmer package support. For now, PyStemmer can accelarate stemming process of snowballstemmer. --- CHANGES | 3 +++ sphinx/search/en.py | 21 +++++---------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/CHANGES b/CHANGES index 71a2b137f..e3318bd5e 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,8 @@ Release 1.4 (in development) Incompatible changes -------------------- +* Drop ``PorterStemmer`` package support. Use ``PyStemmer`` instead of ``PorterStemmer`` + to accelerate stemming. Features added -------------- @@ -33,6 +35,7 @@ Bugs fixed * C++, add support for user-defined literals. * #1804: Now html output wraps overflowed long-line-text in the sidebar. Thanks to Hassen ben tanfous. +* #2183: Fix porterstemmer causes `make json` to fail Documentation ------------- diff --git a/sphinx/search/en.py b/sphinx/search/en.py index de77ae294..08b113c62 100644 --- a/sphinx/search/en.py +++ b/sphinx/search/en.py @@ -12,18 +12,11 @@ from sphinx.search import SearchLanguage try: - # http://bitbucket.org/methane/porterstemmer/ - from porterstemmer import Stemmer as CStemmer - CSTEMMER = True - PYSTEMMER = False + from Stemmer import Stemmer as PyStemmer + PYSTEMMER = True except ImportError: - CSTEMMER = False - try: - from Stemmer import Stemmer as PyStemmer - PYSTEMMER = True - except ImportError: - from sphinx.util.stemmer import PorterStemmer - PYSTEMMER = False + from sphinx.util.stemmer import PorterStemmer + PYSTEMMER = False english_stopwords = set(""" a and are as at @@ -231,11 +224,7 @@ class SearchEnglish(SearchLanguage): stopwords = english_stopwords def init(self, options): - if CSTEMMER: - class Stemmer(CStemmer): - def stem(self, word): - return self(word.lower()) - elif PYSTEMMER: + if PYSTEMMER: class Stemmer(object): def __init__(self): self.stemmer = PyStemmer('porter') From 9fc83df2de5c59ce066ee684e72fd80ebcd73dd9 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 26 Dec 2015 13:15:36 +0900 Subject: [PATCH 070/238] Revert "Fix #2183 porterstemmer causes `make json` to fail" This is a breaking change. So we move the change into master branch. This reverts commit f1518c5fc4446d63c0ba92150f5a226e3691aa62. --- CHANGES | 1 - sphinx/search/en.py | 21 ++++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index af3293ff6..561d0f45c 100644 --- a/CHANGES +++ b/CHANGES @@ -21,7 +21,6 @@ Bugs fixed * #2071: Fix same footnote in more than two section titles => LaTeX/PDF Bug * #2040: Fix UnicodeDecodeError in sphinx-apidoc when author contains non-ascii characters * #2193: Fix shutil.SameFileError if source directory and destination directory are same -* #2183: Fix porterstemmer causes `make json` to fail Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/search/en.py b/sphinx/search/en.py index 08b113c62..de77ae294 100644 --- a/sphinx/search/en.py +++ b/sphinx/search/en.py @@ -12,11 +12,18 @@ from sphinx.search import SearchLanguage try: - from Stemmer import Stemmer as PyStemmer - PYSTEMMER = True -except ImportError: - from sphinx.util.stemmer import PorterStemmer + # http://bitbucket.org/methane/porterstemmer/ + from porterstemmer import Stemmer as CStemmer + CSTEMMER = True PYSTEMMER = False +except ImportError: + CSTEMMER = False + try: + from Stemmer import Stemmer as PyStemmer + PYSTEMMER = True + except ImportError: + from sphinx.util.stemmer import PorterStemmer + PYSTEMMER = False english_stopwords = set(""" a and are as at @@ -224,7 +231,11 @@ class SearchEnglish(SearchLanguage): stopwords = english_stopwords def init(self, options): - if PYSTEMMER: + if CSTEMMER: + class Stemmer(CStemmer): + def stem(self, word): + return self(word.lower()) + elif PYSTEMMER: class Stemmer(object): def __init__(self): self.stemmer = PyStemmer('porter') From 222a51e0cf0080b74f3a8a233590c707ee4eec32 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 26 Dec 2015 21:43:54 +0900 Subject: [PATCH 071/238] Fix #2189: next sibling link has broken if the file was appeared twice or more --- sphinx/environment.py | 13 ++++++++--- tests/roots/test-toctree-glob/bar/bar_1.rst | 4 ++++ tests/roots/test-toctree-glob/bar/bar_2.rst | 4 ++++ tests/roots/test-toctree-glob/bar/bar_3.rst | 4 ++++ tests/roots/test-toctree-glob/bar/index.rst | 7 ++++++ tests/roots/test-toctree-glob/baz.rst | 4 ++++ tests/roots/test-toctree-glob/conf.py | 4 ++++ tests/roots/test-toctree-glob/foo.rst | 4 ++++ tests/roots/test-toctree-glob/index.rst | 10 +++++++++ tests/test_toctree.py | 24 +++++++++++++++++++++ 10 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 tests/roots/test-toctree-glob/bar/bar_1.rst create mode 100644 tests/roots/test-toctree-glob/bar/bar_2.rst create mode 100644 tests/roots/test-toctree-glob/bar/bar_3.rst create mode 100644 tests/roots/test-toctree-glob/bar/index.rst create mode 100644 tests/roots/test-toctree-glob/baz.rst create mode 100644 tests/roots/test-toctree-glob/conf.py create mode 100644 tests/roots/test-toctree-glob/foo.rst create mode 100644 tests/roots/test-toctree-glob/index.rst create mode 100644 tests/test_toctree.py diff --git a/sphinx/environment.py b/sphinx/environment.py index ac95a4eb6..6c3a2cc98 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -1987,9 +1987,16 @@ class BuildEnvironment: # else the grandparent's sibling, if present, and so forth for parname, parindex in parents: parincs = getinc(parname) - if parincs and parindex + 1 < len(parincs): - next = parincs[parindex+1] - break + if parincs: + for parinc in parincs[parindex + 1:]: + if parinc in relations or parinc == docname: + pass + else: + next = parinc + break + + if next: + break # else it will stay None # same for children if includes: diff --git a/tests/roots/test-toctree-glob/bar/bar_1.rst b/tests/roots/test-toctree-glob/bar/bar_1.rst new file mode 100644 index 000000000..6229a1561 --- /dev/null +++ b/tests/roots/test-toctree-glob/bar/bar_1.rst @@ -0,0 +1,4 @@ +Bar-1 +===== + +bar diff --git a/tests/roots/test-toctree-glob/bar/bar_2.rst b/tests/roots/test-toctree-glob/bar/bar_2.rst new file mode 100644 index 000000000..ed7862100 --- /dev/null +++ b/tests/roots/test-toctree-glob/bar/bar_2.rst @@ -0,0 +1,4 @@ +Bar-2 +===== + +bar diff --git a/tests/roots/test-toctree-glob/bar/bar_3.rst b/tests/roots/test-toctree-glob/bar/bar_3.rst new file mode 100644 index 000000000..93c58d41f --- /dev/null +++ b/tests/roots/test-toctree-glob/bar/bar_3.rst @@ -0,0 +1,4 @@ +Bar-3 +===== + +bar diff --git a/tests/roots/test-toctree-glob/bar/index.rst b/tests/roots/test-toctree-glob/bar/index.rst new file mode 100644 index 000000000..290bd2b75 --- /dev/null +++ b/tests/roots/test-toctree-glob/bar/index.rst @@ -0,0 +1,7 @@ +Bar +=== + +.. toctree:: + :glob: + + * diff --git a/tests/roots/test-toctree-glob/baz.rst b/tests/roots/test-toctree-glob/baz.rst new file mode 100644 index 000000000..2c1bbbc72 --- /dev/null +++ b/tests/roots/test-toctree-glob/baz.rst @@ -0,0 +1,4 @@ +Baz +=== + +baz diff --git a/tests/roots/test-toctree-glob/conf.py b/tests/roots/test-toctree-glob/conf.py new file mode 100644 index 000000000..cf05c9b5c --- /dev/null +++ b/tests/roots/test-toctree-glob/conf.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' +html_theme = 'classic' diff --git a/tests/roots/test-toctree-glob/foo.rst b/tests/roots/test-toctree-glob/foo.rst new file mode 100644 index 000000000..83f952239 --- /dev/null +++ b/tests/roots/test-toctree-glob/foo.rst @@ -0,0 +1,4 @@ +Foo +=== + +foo diff --git a/tests/roots/test-toctree-glob/index.rst b/tests/roots/test-toctree-glob/index.rst new file mode 100644 index 000000000..4a8acecbc --- /dev/null +++ b/tests/roots/test-toctree-glob/index.rst @@ -0,0 +1,10 @@ +test-toctree-glob +================= + +.. toctree:: + :glob: + + foo + bar/index + bar/* + baz diff --git a/tests/test_toctree.py b/tests/test_toctree.py new file mode 100644 index 000000000..17e1a780d --- /dev/null +++ b/tests/test_toctree.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +""" + test_toctree + ~~~~~~~~~~~~ + + Test the HTML builder and check output against XPath. + + :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from util import with_app + + +@with_app(testroot='toctree-glob') +def test_relations(app, status, warning): + app.builder.build_all() + assert app.builder.relations['index'] == [None, None, 'foo'] + assert app.builder.relations['foo'] == ['index', 'index', 'bar/index'] + assert app.builder.relations['bar/index'] == ['index', 'foo', 'bar/bar_1'] + assert app.builder.relations['bar/bar_1'] == ['bar/index', 'bar/index', 'bar/bar_2'] + assert app.builder.relations['bar/bar_2'] == ['bar/index', 'bar/bar_1', 'bar/bar_3'] + assert app.builder.relations['bar/bar_3'] == ['bar/index', 'bar/bar_2', 'baz'] + assert app.builder.relations['baz'] == ['index', 'bar/bar_3', None] From 8a763feb6b92404a4acea0894dc23d4060e9f36e Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 26 Dec 2015 23:57:09 +0900 Subject: [PATCH 072/238] Fix #2189: previous sibling link has broken if previous doc is under nested toctree --- sphinx/environment.py | 76 ++++++------------- .../test-toctree-glob/bar/bar_4/index.rst | 4 + tests/roots/test-toctree-glob/bar/index.rst | 1 + tests/roots/test-toctree-glob/index.rst | 1 + tests/roots/test-toctree-glob/quux.rst | 4 + tests/roots/test-toctree-glob/qux/index.rst | 8 ++ tests/roots/test-toctree-glob/qux/qux_1.rst | 4 + tests/roots/test-toctree-glob/qux/qux_2.rst | 4 + tests/test_toctree.py | 9 ++- 9 files changed, 55 insertions(+), 56 deletions(-) create mode 100644 tests/roots/test-toctree-glob/bar/bar_4/index.rst create mode 100644 tests/roots/test-toctree-glob/quux.rst create mode 100644 tests/roots/test-toctree-glob/qux/index.rst create mode 100644 tests/roots/test-toctree-glob/qux/qux_1.rst create mode 100644 tests/roots/test-toctree-glob/qux/qux_2.rst diff --git a/sphinx/environment.py b/sphinx/environment.py index 6c3a2cc98..743021e0f 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -1950,63 +1950,31 @@ class BuildEnvironment: for (key_, group) in groupby(newlist, keyfunc2)] def collect_relations(self): + traversed = set() + + def traverse_toctree(parent, docname): + # traverse toctree by pre-order + yield parent, docname + traversed.add(docname) + + for child in (self.toctree_includes.get(docname) or []): + for subparent, subdocname in traverse_toctree(docname, child): + if subdocname not in traversed: + yield subparent, subdocname + traversed.add(subdocname) + relations = {} - getinc = self.toctree_includes.get + docnames = traverse_toctree(None, self.config.master_doc) + prevdoc = None + parent, docname = docnames.next() + for nextparent, nextdoc in docnames: + relations[docname] = [parent, prevdoc, nextdoc] + prevdoc = docname + docname = nextdoc + parent = nextparent - def collect(parents, parents_set, docname, previous, next): - # circular relationship? - if docname in parents_set: - # we will warn about this in resolve_toctree() - return - if docname in relations: - return - includes = getinc(docname) - # previous - if not previous: - # if no previous sibling, go to parent - previous = parents[0][0] - else: - # else, go to previous sibling, or if it has children, to - # the last of its children, or if that has children, to the - # last of those, and so forth - while 1: - previncs = getinc(previous) - if previncs: - previous = previncs[-1] - else: - break - # next - if includes: - # if it has children, go to first of them - next = includes[0] - elif next: - # else, if next sibling, go to it - pass - else: - # else, go to the next sibling of the parent, if present, - # else the grandparent's sibling, if present, and so forth - for parname, parindex in parents: - parincs = getinc(parname) - if parincs: - for parinc in parincs[parindex + 1:]: - if parinc in relations or parinc == docname: - pass - else: - next = parinc - break + relations[docname] = [parent, prevdoc, None] - if next: - break - # else it will stay None - # same for children - if includes: - for subindex, args in enumerate(zip(includes, - [None] + includes, - includes[1:] + [None])): - collect([(docname, subindex)] + parents, - parents_set.union([docname]), *args) - relations[docname] = [parents[0][0], previous, next] - collect([(None, 0)], set(), self.config.master_doc, None, None) return relations def check_consistency(self): diff --git a/tests/roots/test-toctree-glob/bar/bar_4/index.rst b/tests/roots/test-toctree-glob/bar/bar_4/index.rst new file mode 100644 index 000000000..4fae623ce --- /dev/null +++ b/tests/roots/test-toctree-glob/bar/bar_4/index.rst @@ -0,0 +1,4 @@ +Bar-4 +===== + +bar diff --git a/tests/roots/test-toctree-glob/bar/index.rst b/tests/roots/test-toctree-glob/bar/index.rst index 290bd2b75..74a9ba942 100644 --- a/tests/roots/test-toctree-glob/bar/index.rst +++ b/tests/roots/test-toctree-glob/bar/index.rst @@ -5,3 +5,4 @@ Bar :glob: * + bar_4/index diff --git a/tests/roots/test-toctree-glob/index.rst b/tests/roots/test-toctree-glob/index.rst index 4a8acecbc..079cd6027 100644 --- a/tests/roots/test-toctree-glob/index.rst +++ b/tests/roots/test-toctree-glob/index.rst @@ -8,3 +8,4 @@ test-toctree-glob bar/index bar/* baz + qux/index diff --git a/tests/roots/test-toctree-glob/quux.rst b/tests/roots/test-toctree-glob/quux.rst new file mode 100644 index 000000000..340389d0a --- /dev/null +++ b/tests/roots/test-toctree-glob/quux.rst @@ -0,0 +1,4 @@ +Quux +==== + +quux diff --git a/tests/roots/test-toctree-glob/qux/index.rst b/tests/roots/test-toctree-glob/qux/index.rst new file mode 100644 index 000000000..ad0bee51f --- /dev/null +++ b/tests/roots/test-toctree-glob/qux/index.rst @@ -0,0 +1,8 @@ +Qux +=== + +.. toctree:: + :glob: + :hidden: + + * diff --git a/tests/roots/test-toctree-glob/qux/qux_1.rst b/tests/roots/test-toctree-glob/qux/qux_1.rst new file mode 100644 index 000000000..bac227b42 --- /dev/null +++ b/tests/roots/test-toctree-glob/qux/qux_1.rst @@ -0,0 +1,4 @@ +Qux-1 +===== + +qux diff --git a/tests/roots/test-toctree-glob/qux/qux_2.rst b/tests/roots/test-toctree-glob/qux/qux_2.rst new file mode 100644 index 000000000..bac227b42 --- /dev/null +++ b/tests/roots/test-toctree-glob/qux/qux_2.rst @@ -0,0 +1,4 @@ +Qux-1 +===== + +qux diff --git a/tests/test_toctree.py b/tests/test_toctree.py index 17e1a780d..d91d92389 100644 --- a/tests/test_toctree.py +++ b/tests/test_toctree.py @@ -20,5 +20,10 @@ def test_relations(app, status, warning): assert app.builder.relations['bar/index'] == ['index', 'foo', 'bar/bar_1'] assert app.builder.relations['bar/bar_1'] == ['bar/index', 'bar/index', 'bar/bar_2'] assert app.builder.relations['bar/bar_2'] == ['bar/index', 'bar/bar_1', 'bar/bar_3'] - assert app.builder.relations['bar/bar_3'] == ['bar/index', 'bar/bar_2', 'baz'] - assert app.builder.relations['baz'] == ['index', 'bar/bar_3', None] + assert app.builder.relations['bar/bar_3'] == ['bar/index', 'bar/bar_2', 'bar/bar_4/index'] + assert app.builder.relations['bar/bar_4/index'] == ['bar/index', 'bar/bar_3', 'baz'] + assert app.builder.relations['baz'] == ['index', 'bar/bar_4/index', 'qux/index'] + assert app.builder.relations['qux/index'] == ['index', 'baz', 'qux/qux_1'] + assert app.builder.relations['qux/qux_1'] == ['qux/index', 'qux/index', 'qux/qux_2'] + assert app.builder.relations['qux/qux_2'] == ['qux/index', 'qux/qux_1', None] + assert 'quux' not in app.builder.relations From 2f27459e8082c73bf95205ef2f63d17519680509 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sun, 27 Dec 2015 00:46:14 +0900 Subject: [PATCH 073/238] Fix flake8 violation --- sphinx/environment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/environment.py b/sphinx/environment.py index 743021e0f..ebf579c59 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -24,7 +24,7 @@ from glob import glob from itertools import groupby from six import iteritems, itervalues, text_type, class_types, string_types -from six.moves import cPickle as pickle, zip +from six.moves import cPickle as pickle from docutils import nodes from docutils.io import FileInput, NullOutput from docutils.core import Publisher From 98ac902650f1d0e498f974eeee0f87425613040f Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sun, 27 Dec 2015 00:52:58 +0900 Subject: [PATCH 074/238] Fix broken in py3 (for 8a763feb6b92404a4acea0894dc23d4060e9f36e) --- sphinx/environment.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sphinx/environment.py b/sphinx/environment.py index ebf579c59..371b3a6c4 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -23,7 +23,7 @@ from os import path from glob import glob from itertools import groupby -from six import iteritems, itervalues, text_type, class_types, string_types +from six import iteritems, itervalues, text_type, class_types, string_types, next from six.moves import cPickle as pickle from docutils import nodes from docutils.io import FileInput, NullOutput @@ -1966,7 +1966,7 @@ class BuildEnvironment: relations = {} docnames = traverse_toctree(None, self.config.master_doc) prevdoc = None - parent, docname = docnames.next() + parent, docname = next(docnames) for nextparent, nextdoc in docnames: relations[docname] = [parent, prevdoc, nextdoc] prevdoc = docname From 87998df9cbef2380345d436121e6bca43345d2bd Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sun, 27 Dec 2015 01:32:40 +0900 Subject: [PATCH 075/238] Fix a documentation for sphinx.ext.viewcode --- doc/ext/viewcode.rst | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/doc/ext/viewcode.rst b/doc/ext/viewcode.rst index f2b6c9283..5bf8eb033 100644 --- a/doc/ext/viewcode.rst +++ b/doc/ext/viewcode.rst @@ -15,11 +15,7 @@ a highlighted version of the source code, and a link will be added to all object descriptions that leads to the source code of the described object. A link back from the source to the description will also be inserted. -There are currently no configuration values for this extension; you just need to -add ``'sphinx.ext.viewcode'`` to your :confval:`extensions` value for it to -work. - -There is also an additional config value: +There is an additional config value: .. confval:: viewcode_import From 07cc02a512923610eac65ff5cb23c8b6a9fc44ed Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sun, 27 Dec 2015 16:29:07 +0900 Subject: [PATCH 076/238] Fix #2178: Unparseable C++ cross-reference when referencing a function with :cpp:any: --- CHANGES | 1 + sphinx/domains/cpp.py | 12 ++++++ tests/roots/test-domain-cpp/any-role.rst | 10 +++++ tests/roots/test-domain-cpp/conf.py | 4 ++ tests/roots/test-domain-cpp/index.rst | 37 ++++++++++++++++++ tests/roots/test-domain-cpp/roles.rst | 10 +++++ tests/test_domain_cpp.py | 50 +++++++++++++++++++++++- 7 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 tests/roots/test-domain-cpp/any-role.rst create mode 100644 tests/roots/test-domain-cpp/conf.py create mode 100644 tests/roots/test-domain-cpp/index.rst create mode 100644 tests/roots/test-domain-cpp/roles.rst diff --git a/CHANGES b/CHANGES index 561d0f45c..5e3fbc71b 100644 --- a/CHANGES +++ b/CHANGES @@ -21,6 +21,7 @@ Bugs fixed * #2071: Fix same footnote in more than two section titles => LaTeX/PDF Bug * #2040: Fix UnicodeDecodeError in sphinx-apidoc when author contains non-ascii characters * #2193: Fix shutil.SameFileError if source directory and destination directory are same +* #2178: Fix unparseable C++ cross-reference when referencing a function with :cpp:any: Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py index 09c2204d5..69b99d269 100644 --- a/sphinx/domains/cpp.py +++ b/sphinx/domains/cpp.py @@ -2659,6 +2659,9 @@ class CPPXRefRole(XRefRole): parent = env.ref_context.get('cpp:parent') if parent: refnode['cpp:parent'] = parent[:] + if refnode['reftype'] == 'any': + # Remove parentheses from the target (not from title) + title, target = self._fix_parens(env, True, title, target) if not has_explicit_title: target = target.lstrip('~') # only has a meaning for the title # if the first character is a tilde, don't display the module/class @@ -2731,6 +2734,15 @@ class CPPDomain(Domain): if name not in self.data['objects']: return None, None docname, ast = self.data['objects'][name] + if node['reftype'] == 'any' and ast.objectType == 'function': + title = contnode.pop(0).astext() + if title.endswith('()'): + # remove parentheses + title = title[:-2] + if env.config.add_function_parentheses: + # add them back to all occurrences if configured + title += '()' + contnode.insert(0, nodes.Text(title)) return make_refnode(builder, fromdocname, docname, ast.newestId, contnode, name), ast.objectType diff --git a/tests/roots/test-domain-cpp/any-role.rst b/tests/roots/test-domain-cpp/any-role.rst new file mode 100644 index 000000000..dacd2f600 --- /dev/null +++ b/tests/roots/test-domain-cpp/any-role.rst @@ -0,0 +1,10 @@ +any role +-------- + +* :cpp:any:`Sphinx` +* ref function without parens :cpp:any:`hello`. +* ref function with parens :cpp:any:`hello()`. +* :cpp:any:`Sphinx::version` +* :cpp:any:`version` +* :cpp:any:`List` +* :cpp:any:`MyEnum` diff --git a/tests/roots/test-domain-cpp/conf.py b/tests/roots/test-domain-cpp/conf.py new file mode 100644 index 000000000..cf05c9b5c --- /dev/null +++ b/tests/roots/test-domain-cpp/conf.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' +html_theme = 'classic' diff --git a/tests/roots/test-domain-cpp/index.rst b/tests/roots/test-domain-cpp/index.rst new file mode 100644 index 000000000..9be739f1e --- /dev/null +++ b/tests/roots/test-domain-cpp/index.rst @@ -0,0 +1,37 @@ +test-domain-cpp +=============== + +directives +---------- + +.. cpp:class:: public Sphinx + + The description of Sphinx class. + +.. cpp:function:: int hello(char *name) + + The description of hello function. + +.. cpp:member:: float Sphinx::version + + The description of Sphinx::version. + +.. cpp:var:: int version + + The description of version. + +.. cpp:type:: std::vector List + + The description of List type. + +.. cpp:enum:: MyEnum + + An unscoped enum. + +.. cpp:enum-class:: MyScopedEnum + + A scoped enum. + +.. cpp:enum-struct:: protected MyScopedVisibilityEnum : std::underlying_type::type + + A scoped enum with non-default visibility, and with a specified underlying type. diff --git a/tests/roots/test-domain-cpp/roles.rst b/tests/roots/test-domain-cpp/roles.rst new file mode 100644 index 000000000..8baf29b4c --- /dev/null +++ b/tests/roots/test-domain-cpp/roles.rst @@ -0,0 +1,10 @@ +roles +----- + +* :cpp:class:`Sphinx` +* ref function without parens :cpp:func:`hello`. +* ref function with parens :cpp:func:`hello()`. +* :cpp:member:`Sphinx::version` +* :cpp:var:`version` +* :cpp:type:`List` +* :cpp:enum:`MyEnum` diff --git a/tests/test_domain_cpp.py b/tests/test_domain_cpp.py index 886fe8031..6975d7ab2 100644 --- a/tests/test_domain_cpp.py +++ b/tests/test_domain_cpp.py @@ -9,9 +9,11 @@ :license: BSD, see LICENSE for details. """ +import re + from six import text_type -from util import raises +from util import raises, with_app from sphinx.domains.cpp import DefinitionParser, DefinitionError, NoOldIdError @@ -262,3 +264,49 @@ def test_operators(): # for a in ids: # print(a) # raise DefinitionError("") + + +@with_app(testroot='domain-cpp') +def test_build_domain_cpp(app, status, warning): + app.builder.build_all() + + roles = (app.outdir / 'roles.html').text() + assert re.search('
  • Sphinx
  • ', roles) + assert re.search(('
  • ref function without parens ' + 'hello\(\)\.
  • '), roles) + assert re.search(('
  • ref function with parens ' + 'hello\(\)\.
  • '), roles) + assert re.search('
  • Sphinx::version
  • ', + roles) + assert re.search('
  • version
  • ', roles) + assert re.search('
  • List
  • ', roles) + assert re.search('
  • MyEnum
  • ', roles) + + any_role = (app.outdir / 'any-role.html').text() + assert re.search('
  • Sphinx
  • ', any_role) + assert re.search(('
  • ref function without parens ' + 'hello\(\)\.
  • '), any_role) + assert re.search(('
  • ref function with parens ' + 'hello\(\)\.
  • '), any_role) + assert re.search('
  • Sphinx::version
  • ', + any_role) + assert re.search('
  • version
  • ', any_role) + assert re.search('
  • List
  • ', any_role) + assert re.search('
  • MyEnum
  • ', any_role) + + +@with_app(testroot='domain-cpp', confoverrides={'add_function_parentheses': False}) +def test_build_domain_cpp_with_add_function_parentheses_is_False(app, status, warning): + app.builder.build_all() + + roles = (app.outdir / 'roles.html').text() + assert re.search(('
  • ref function without parens ' + 'hello\.
  • '), roles) + assert re.search(('
  • ref function with parens ' + 'hello\.
  • '), roles) + + any_role = (app.outdir / 'any-role.html').text() + assert re.search(('
  • ref function without parens ' + 'hello\.
  • '), any_role) + assert re.search(('
  • ref function with parens ' + 'hello\.
  • '), any_role) From 355fe2a2334aac1e44acb502c68a51555e76162c Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Sun, 20 Dec 2015 00:25:46 -0800 Subject: [PATCH 077/238] Add the imgmath extension, the successor of pngmath. In addition to the features which pngmath supports, imgmath also supports svg output format. --- sphinx/ext/imgmath.py | 280 +++++++++++++++++++++++++ tests/roots/test-ext-imgmath/conf.py | 4 + tests/roots/test-ext-imgmath/index.rst | 6 + tests/test_ext_imgmath.py | 42 ++++ 4 files changed, 332 insertions(+) create mode 100644 sphinx/ext/imgmath.py create mode 100644 tests/roots/test-ext-imgmath/conf.py create mode 100644 tests/roots/test-ext-imgmath/index.rst create mode 100644 tests/test_ext_imgmath.py diff --git a/sphinx/ext/imgmath.py b/sphinx/ext/imgmath.py new file mode 100644 index 000000000..9b735b208 --- /dev/null +++ b/sphinx/ext/imgmath.py @@ -0,0 +1,280 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.imgmath + ~~~~~~~~~~~~~~~~~~ + + Render math in HTML via dvipng or dvisvgm. + + :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re +import codecs +import shutil +import tempfile +import posixpath +from os import path +from subprocess import Popen, PIPE +from hashlib import sha1 + +from six import text_type +from docutils import nodes + +import sphinx +from sphinx.errors import SphinxError +from sphinx.util.png import read_png_depth, write_png_depth +from sphinx.util.osutil import ensuredir, ENOENT, cd +from sphinx.util.pycompat import sys_encoding +from sphinx.ext.mathbase import setup_math as mathbase_setup, wrap_displaymath + + +class MathExtError(SphinxError): + category = 'Math extension error' + + def __init__(self, msg, stderr=None, stdout=None): + if stderr: + msg += '\n[stderr]\n' + stderr.decode(sys_encoding, 'replace') + if stdout: + msg += '\n[stdout]\n' + stdout.decode(sys_encoding, 'replace') + SphinxError.__init__(self, msg) + + +DOC_HEAD = r''' +\documentclass[12pt]{article} +\usepackage[utf8x]{inputenc} +\usepackage{amsmath} +\usepackage{amsthm} +\usepackage{amssymb} +\usepackage{amsfonts} +\usepackage{bm} +\pagestyle{empty} +''' + +DOC_BODY = r''' +\begin{document} +%s +\end{document} +''' + +DOC_BODY_PREVIEW = r''' +\usepackage[active]{preview} +\begin{document} +\begin{preview} +%s +\end{preview} +\end{document} +''' + +depth_re = re.compile(br'\[\d+ depth=(-?\d+)\]') + + +def render_math(self, math): + """Render the LaTeX math expression *math* using latex and dvipng or + dvisvgm. + + Return the filename relative to the built document and the "depth", + that is, the distance of image bottom and baseline in pixels, if the + option to use preview_latex is switched on. + + Error handling may seem strange, but follows a pattern: if LaTeX or dvipng + (dvisvgm) aren't available, only a warning is generated (since that enables + people on machines without these programs to at least build the rest of the + docs successfully). If the programs are there, however, they may not fail + since that indicates a problem in the math source. + """ + image_format = self.builder.config.imgmath_image_format + if image_format not in ('png', 'svg'): + raise MathExtError( + 'imgmath_image_format must be either "png" or "svg"') + + use_preview = self.builder.config.imgmath_use_preview + latex = DOC_HEAD + self.builder.config.imgmath_latex_preamble + latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math + + shasum = "%s.%s" % (sha1(latex.encode('utf-8')).hexdigest(), image_format) + relfn = posixpath.join(self.builder.imgpath, 'math', shasum) + outfn = path.join(self.builder.outdir, self.builder.imagedir, 'math', shasum) + if path.isfile(outfn): + depth = read_png_depth(outfn) + return relfn, depth + + # if latex or dvipng (dvisvgm) has failed once, don't bother to try again + if hasattr(self.builder, '_imgmath_warned_latex') or \ + hasattr(self.builder, '_imgmath_warned_image_translator'): + return None, None + + # use only one tempdir per build -- the use of a directory is cleaner + # than using temporary files, since we can clean up everything at once + # just removing the whole directory (see cleanup_tempdir) + if not hasattr(self.builder, '_imgmath_tempdir'): + tempdir = self.builder._imgmath_tempdir = tempfile.mkdtemp() + else: + tempdir = self.builder._imgmath_tempdir + + tf = codecs.open(path.join(tempdir, 'math.tex'), 'w', 'utf-8') + tf.write(latex) + tf.close() + + # build latex command; old versions of latex don't have the + # --output-directory option, so we have to manually chdir to the + # temp dir to run it. + ltx_args = [self.builder.config.imgmath_latex, '--interaction=nonstopmode'] + # add custom args from the config file + ltx_args.extend(self.builder.config.imgmath_latex_args) + ltx_args.append('math.tex') + + with cd(tempdir): + try: + p = Popen(ltx_args, stdout=PIPE, stderr=PIPE) + except OSError as err: + if err.errno != ENOENT: # No such file or directory + raise + self.builder.warn('LaTeX command %r cannot be run (needed for math ' + 'display), check the imgmath_latex setting' % + self.builder.config.imgmath_latex) + self.builder._imgmath_warned_latex = True + return None, None + + stdout, stderr = p.communicate() + if p.returncode != 0: + raise MathExtError('latex exited with error', stderr, stdout) + + ensuredir(path.dirname(outfn)) + if image_format == 'png': + image_translator = 'dvipng' + image_translator_executable = self.builder.config.imgmath_dvipng + # use some standard dvipng arguments + image_translator_args = [self.builder.config.imgmath_dvipng] + image_translator_args += ['-o', outfn, '-T', 'tight', '-z9'] + # add custom ones from config value + image_translator_args.extend(self.builder.config.imgmath_dvipng_args) + if use_preview: + image_translator_args.append('--depth') + elif image_format == 'svg': + image_translator = 'dvisvgm' + image_translator_executable = self.builder.config.imgmath_dvisvgm + # use some standard dvisvgm arguments + image_translator_args = [self.builder.config.imgmath_dvisvgm] + image_translator_args += ['-o', outfn] + # add custom ones from config value + image_translator_args.extend(self.builder.config.imgmath_dvisvgm_args) + # last, the input file name + image_translator_args.append(path.join(tempdir, 'math.dvi')) + else: + raise MathExtError( + 'imgmath_image_format must be either "png" or "svg"') + + # last, the input file name + image_translator_args.append(path.join(tempdir, 'math.dvi')) + + try: + p = Popen(image_translator_args, stdout=PIPE, stderr=PIPE) + except OSError as err: + if err.errno != ENOENT: # No such file or directory + raise + self.builder.warn('%s command %r cannot be run (needed for math ' + 'display), check the imgmath_%s setting' % + image_translator, image_translator_executable, + image_translator) + self.builder._imgmath_warned_image_translator = True + return None, None + + stdout, stderr = p.communicate() + if p.returncode != 0: + raise MathExtError('%s exited with error', + image_translator, stderr, stdout) + depth = None + if use_preview and image_format == 'png': # depth is only useful for png + for line in stdout.splitlines(): + m = depth_re.match(line) + if m: + depth = int(m.group(1)) + write_png_depth(outfn, depth) + break + + return relfn, depth + + +def cleanup_tempdir(app, exc): + if exc: + return + if not hasattr(app.builder, '_imgmath_tempdir'): + return + try: + shutil.rmtree(app.builder._mathpng_tempdir) + except Exception: + pass + + +def get_tooltip(self, node): + if self.builder.config.imgmath_add_tooltips: + return ' alt="%s"' % self.encode(node['latex']).strip() + return '' + + +def html_visit_math(self, node): + try: + fname, depth = render_math(self, '$'+node['latex']+'$') + except MathExtError as exc: + msg = text_type(exc) + sm = nodes.system_message(msg, type='WARNING', level=2, + backrefs=[], source=node['latex']) + sm.walkabout(self) + self.builder.warn('display latex %r: ' % node['latex'] + msg) + raise nodes.SkipNode + if fname is None: + # something failed -- use text-only as a bad substitute + self.body.append('%s' % + self.encode(node['latex']).strip()) + else: + c = ('') + raise nodes.SkipNode + + +def html_visit_displaymath(self, node): + if node['nowrap']: + latex = node['latex'] + else: + latex = wrap_displaymath(node['latex'], None) + try: + fname, depth = render_math(self, latex) + except MathExtError as exc: + sm = nodes.system_message(str(exc), type='WARNING', level=2, + backrefs=[], source=node['latex']) + sm.walkabout(self) + self.builder.warn('inline latex %r: ' % node['latex'] + str(exc)) + raise nodes.SkipNode + self.body.append(self.starttag(node, 'div', CLASS='math')) + self.body.append('

    ') + if node['number']: + self.body.append('(%s)' % node['number']) + if fname is None: + # something failed -- use text-only as a bad substitute + self.body.append('%s

    \n' % + self.encode(node['latex']).strip()) + else: + self.body.append(('

    \n') + raise nodes.SkipNode + + +def setup(app): + mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None)) + app.add_config_value('imgmath_image_format', 'png', 'html') + app.add_config_value('imgmath_dvipng', 'dvipng', 'html') + app.add_config_value('imgmath_dvisvgm', 'dvisvgm', 'html') + app.add_config_value('imgmath_latex', 'latex', 'html') + app.add_config_value('imgmath_use_preview', False, 'html') + app.add_config_value('imgmath_dvipng_args', + ['-gamma', '1.5', '-D', '110', '-bg', 'Transparent'], + 'html') + app.add_config_value('imgmath_dvisvgm_args', ['--no-fonts'], 'html') + app.add_config_value('imgmath_latex_args', [], 'html') + app.add_config_value('imgmath_latex_preamble', '', 'html') + app.add_config_value('imgmath_add_tooltips', True, 'html') + app.connect('build-finished', cleanup_tempdir) + return {'version': sphinx.__display_version__, 'parallel_read_safe': True} diff --git a/tests/roots/test-ext-imgmath/conf.py b/tests/roots/test-ext-imgmath/conf.py new file mode 100644 index 000000000..3f3e2a783 --- /dev/null +++ b/tests/roots/test-ext-imgmath/conf.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +extensions = ['sphinx.ext.imgmath'] +master_doc = 'index' diff --git a/tests/roots/test-ext-imgmath/index.rst b/tests/roots/test-ext-imgmath/index.rst new file mode 100644 index 000000000..f7780a422 --- /dev/null +++ b/tests/roots/test-ext-imgmath/index.rst @@ -0,0 +1,6 @@ +Test imgmath +============ + +.. math:: a^2+b^2=c^2 + +Inline :math:`E=mc^2` diff --git a/tests/test_ext_imgmath.py b/tests/test_ext_imgmath.py new file mode 100644 index 000000000..bf0f016db --- /dev/null +++ b/tests/test_ext_imgmath.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +""" + test_ext_imgmath + ~~~~~~~~~~~~~~~~ + + Test sphinx.ext.imgmath extension. + + :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re + +from util import with_app, SkipTest + + +@with_app('html', testroot='ext-imgmath') +def test_imgmath_png(app, status, warning): + app.builder.build_all() + if "LaTeX command 'latex' cannot be run" in warning.getvalue(): + raise SkipTest('LaTeX command "latex" is not available') + if "dvipng command 'dvipng' cannot be run" in warning.getvalue(): + raise SkipTest('dvipng command "dvipng" is not available') + + content = (app.outdir / 'index.html').text() + html = ('
    \s*

    \s*\s*

    \s*
    ') + assert re.search(html, content, re.S) + +@with_app('html', testroot='ext-imgmath', + confoverrides={'imgmath_image_format': 'svg'}) +def test_imgmath_svg(app, status, warning): + app.builder.build_all() + if "LaTeX command 'latex' cannot be run" in warning.getvalue(): + raise SkipTest('LaTeX command "latex" is not available') + if "dvisvgm command 'dvisvgm' cannot be run" in warning.getvalue(): + raise SkipTest('dvisvgm command "dvisvgm" is not available') + + content = (app.outdir / 'index.html').text() + html = ('
    \s*

    \s*\s*

    \s*
    ') + assert re.search(html, content, re.S) From f68bfbdbb7e8dee9740a864dc36108c4aff52371 Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Tue, 22 Dec 2015 19:48:21 -0800 Subject: [PATCH 078/238] Update the pngmath doc to synchronize with imgmath --- doc/ext/math.rst | 76 ++++++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/doc/ext/math.rst b/doc/ext/math.rst index 4c1546109..4b73b5f63 100644 --- a/doc/ext/math.rst +++ b/doc/ext/math.rst @@ -4,7 +4,7 @@ Math support in Sphinx ====================== .. module:: sphinx.ext.mathbase - :synopsis: Common math support for pngmath and mathjax / jsmath. + :synopsis: Common math support for imgmath and mathjax / jsmath. .. versionadded:: 0.5 @@ -17,7 +17,7 @@ support extensions should, if possible, reuse that support too. .. note:: :mod:`.mathbase` is not meant to be added to the :confval:`extensions` config - value, instead, use either :mod:`sphinx.ext.pngmath` or + value, instead, use either :mod:`sphinx.ext.imgmath` or :mod:`sphinx.ext.mathjax` as described below. The input language for mathematics is LaTeX markup. This is the de-facto @@ -96,20 +96,27 @@ or use Python raw strings (``r"raw"``). beautiful mathematical formulas. -:mod:`sphinx.ext.pngmath` -- Render math as PNG images ------------------------------------------------------- +:mod:`sphinx.ext.imgmath` -- Render math as images +-------------------------------------------------- -.. module:: sphinx.ext.pngmath - :synopsis: Render math as PNG images. +.. module:: sphinx.ext.imgmath + :synopsis: Render math as PNG or SVG images. -This extension renders math via LaTeX and dvipng_ into PNG images. This of -course means that the computer where the docs are built must have both programs -available. +.. versionadded:: 1.4 + +This extension renders math via LaTeX and dvipng_ or dvisvgm_ into PNG or SVG +images. This of course means that the computer where the docs are built must +have both programs available. There are various config values you can set to influence how the images are built: -.. confval:: pngmath_latex +.. confval:: imgmath_image_format + + The output image format. The default is ``'png'``. It should be either + ``'png'`` or ``'svg'``. + +.. confval:: imgmath_latex The command name with which to invoke LaTeX. The default is ``'latex'``; you may need to set this to a full path if ``latex`` is not in the executable @@ -120,42 +127,51 @@ built: :program:`sphinx-build` command line via the :option:`-D` option should be preferable, like this:: - sphinx-build -b html -D pngmath_latex=C:\tex\latex.exe . _build/html + sphinx-build -b html -D imgmath_latex=C:\tex\latex.exe . _build/html - .. versionchanged:: 0.5.1 - This value should only contain the path to the latex executable, not - further arguments; use :confval:`pngmath_latex_args` for that purpose. + This value should only contain the path to the latex executable, not further + arguments; use :confval:`imgmath_latex_args` for that purpose. -.. confval:: pngmath_dvipng +.. confval:: imgmath_dvipng The command name with which to invoke ``dvipng``. The default is ``'dvipng'``; you may need to set this to a full path if ``dvipng`` is not in - the executable search path. + the executable search path. This option is only used when + ``imgmath_image_format`` is set to ``'png'``. -.. confval:: pngmath_latex_args +.. confval:: imgmath_dvisvgm + + The command name with which to invoke ``dvisvgm``. The default is + ``'dvisvgm'``; you may need to set this to a full path if ``dvisvgm`` is not + in the executable search path. This option is only used when + ``imgmath_image_format`` is ``'svg'``. + +.. confval:: imgmath_latex_args Additional arguments to give to latex, as a list. The default is an empty list. - .. versionadded:: 0.5.1 - -.. confval:: pngmath_latex_preamble +.. confval:: imgmath_latex_preamble Additional LaTeX code to put into the preamble of the short LaTeX files that are used to translate the math snippets. This is empty by default. Use it e.g. to add more packages whose commands you want to use in the math. -.. confval:: pngmath_dvipng_args +.. confval:: imgmath_dvipng_args Additional arguments to give to dvipng, as a list. The default value is ``['-gamma', '1.5', '-D', '110', '-bg', 'Transparent']`` which makes the image a bit darker and larger then it is by default, and produces PNGs with a - transparent background. + transparent background. This option is used only when + ``imgmath_image_format`` is ``'png'``. - .. versionchanged:: 1.2 - Now includes ``-bg Transparent`` by default. +.. confval:: imgmath_dvisvgm_args -.. confval:: pngmath_use_preview + Additional arguments to give to dvisvgm, as a list. The default value is + ``['--no-fonts']``. This option is used only when ``imgmath_image_format`` + is ``'svg'``. + +.. confval:: imgmath_use_preview ``dvipng`` has the ability to determine the "depth" of the rendered text: for example, when typesetting a fraction inline, the baseline of surrounding text @@ -165,15 +181,16 @@ built: ``vertical-align`` style that correctly aligns the baselines. Unfortunately, this only works when the `preview-latex package`_ is - installed. Therefore, the default for this option is ``False``. + installed. Therefore, the default for this option is ``False``. -.. confval:: pngmath_add_tooltips + Currently this option is only used when ``imgmath_image_format`` is + ``'png'``. + +.. confval:: imgmath_add_tooltips Default: ``True``. If false, do not add the LaTeX code as an "alt" attribute for math images. - .. versionadded:: 1.1 - :mod:`sphinx.ext.mathjax` -- Render math via JavaScript ------------------------------------------------------- @@ -235,6 +252,7 @@ package jsMath_. It provides this config value: .. _dvipng: http://savannah.nongnu.org/projects/dvipng/ +.. _dvisvgm: http://dvisvgm.bplaced.net/ .. _MathJax: http://www.mathjax.org/ .. _jsMath: http://www.math.union.edu/~dpvc/jsmath/ .. _preview-latex package: http://www.gnu.org/software/auctex/preview-latex.html From 657ebc2ab00c1bcbc53552f9d092692c583aadf4 Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Tue, 22 Dec 2015 19:51:33 -0800 Subject: [PATCH 079/238] Add Hong Xu to the AUTHOR list --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index f30631c42..e8051429f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -60,6 +60,7 @@ Other contributors, listed alphabetically, are: * Sebastian Wiesner -- image handling, distutils support * Michael Wilson -- Intersphinx HTTP basic auth support * Joel Wurtz -- cellspanning support in LaTeX +* Hong Xu -- svg support in imgmath extension and various bug fixes Many thanks for all contributions! From ea25284d0a8474aa55de54df23208c88c76a8128 Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Wed, 23 Dec 2015 19:08:30 -0800 Subject: [PATCH 080/238] Replace pngmath with imgmath in quickstart. --- sphinx/quickstart.py | 16 ++++++++-------- tests/test_quickstart.py | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index ffc4961dc..f4514a2b2 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -60,7 +60,7 @@ DEFAULT_VALUE = { } EXTENSIONS = ('autodoc', 'doctest', 'intersphinx', 'todo', 'coverage', - 'pngmath', 'mathjax', 'ifconfig', 'viewcode') + 'imgmath', 'mathjax', 'ifconfig', 'viewcode') PROMPT_PREFIX = '> ' @@ -1255,16 +1255,16 @@ Please indicate if you want to use one of the following Sphinx extensions:''') if 'ext_coverage' not in d: do_prompt(d, 'ext_coverage', 'coverage: checks for documentation ' 'coverage (y/n)', 'n', boolean) - if 'ext_pngmath' not in d: - do_prompt(d, 'ext_pngmath', 'pngmath: include math, rendered ' - 'as PNG images (y/n)', 'n', boolean) + if 'ext_imgmath' not in d: + do_prompt(d, 'ext_imgmath', 'imgmath: include math, rendered ' + 'as PNG or SVG images (y/n)', 'n', boolean) if 'ext_mathjax' not in d: do_prompt(d, 'ext_mathjax', 'mathjax: include math, rendered in the ' 'browser by MathJax (y/n)', 'n', boolean) - if d['ext_pngmath'] and d['ext_mathjax']: - print('''Note: pngmath and mathjax cannot be enabled at the same time. -pngmath has been deselected.''') - d['ext_pngmath'] = False + if d['ext_imgmath'] and d['ext_mathjax']: + print('''Note: imgmath and mathjax cannot be enabled at the same time. +imgmath has been deselected.''') + d['ext_imgmath'] = False if 'ext_ifconfig' not in d: do_prompt(d, 'ext_ifconfig', 'ifconfig: conditional inclusion of ' 'content based on config values (y/n)', 'n', boolean) diff --git a/tests/test_quickstart.py b/tests/test_quickstart.py index 013700417..45ff8671d 100644 --- a/tests/test_quickstart.py +++ b/tests/test_quickstart.py @@ -181,7 +181,7 @@ def test_quickstart_all_answers(tempdir): 'intersphinx': 'no', 'todo': 'y', 'coverage': 'no', - 'pngmath': 'N', + 'imgmath': 'N', 'mathjax': 'no', 'ifconfig': 'no', 'viewcode': 'no', From f233c604ef1e0dc60082dbdfd74e592368a61d3f Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Wed, 23 Dec 2015 21:28:32 -0800 Subject: [PATCH 081/238] imgmath: Make the size of the displayed math customizable. --- doc/ext/math.rst | 5 +++++ sphinx/ext/imgmath.py | 10 +++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/doc/ext/math.rst b/doc/ext/math.rst index 4b73b5f63..2635596ab 100644 --- a/doc/ext/math.rst +++ b/doc/ext/math.rst @@ -191,6 +191,11 @@ built: Default: ``True``. If false, do not add the LaTeX code as an "alt" attribute for math images. +.. confval:: imgmath_font_size + + The font size (in ``pt``) of the displayed math. The default value is + ``12``. It must be a positive integer. + :mod:`sphinx.ext.mathjax` -- Render math via JavaScript ------------------------------------------------------- diff --git a/sphinx/ext/imgmath.py b/sphinx/ext/imgmath.py index 9b735b208..c4b39f4c8 100644 --- a/sphinx/ext/imgmath.py +++ b/sphinx/ext/imgmath.py @@ -47,13 +47,14 @@ DOC_HEAD = r''' \usepackage{amsthm} \usepackage{amssymb} \usepackage{amsfonts} +\usepackage{anyfontsize} \usepackage{bm} \pagestyle{empty} ''' DOC_BODY = r''' \begin{document} -%s +\fontsize{%d}{%d}\selectfont %s \end{document} ''' @@ -61,7 +62,7 @@ DOC_BODY_PREVIEW = r''' \usepackage[active]{preview} \begin{document} \begin{preview} -%s +\fontsize{%s}{%s}\selectfont %s \end{preview} \end{document} ''' @@ -88,9 +89,11 @@ def render_math(self, math): raise MathExtError( 'imgmath_image_format must be either "png" or "svg"') + font_size = self.builder.config.imgmath_font_size use_preview = self.builder.config.imgmath_use_preview latex = DOC_HEAD + self.builder.config.imgmath_latex_preamble - latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % math + latex += (use_preview and DOC_BODY_PREVIEW or DOC_BODY) % ( + font_size, int(round(font_size * 1.2)), math) shasum = "%s.%s" % (sha1(latex.encode('utf-8')).hexdigest(), image_format) relfn = posixpath.join(self.builder.imgpath, 'math', shasum) @@ -276,5 +279,6 @@ def setup(app): app.add_config_value('imgmath_latex_args', [], 'html') app.add_config_value('imgmath_latex_preamble', '', 'html') app.add_config_value('imgmath_add_tooltips', True, 'html') + app.add_config_value('imgmath_font_size', 12, 'html') app.connect('build-finished', cleanup_tempdir) return {'version': sphinx.__display_version__, 'parallel_read_safe': True} From d8990b4612e9864cbb143a8e4d3089312b824d52 Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Sat, 26 Dec 2015 21:40:18 -0800 Subject: [PATCH 082/238] Add deprecation information to sphinx.ext.pngmath --- sphinx/ext/pngmath.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sphinx/ext/pngmath.py b/sphinx/ext/pngmath.py index 8ef860f80..8f9014acd 100644 --- a/sphinx/ext/pngmath.py +++ b/sphinx/ext/pngmath.py @@ -3,7 +3,8 @@ sphinx.ext.pngmath ~~~~~~~~~~~~~~~~~~ - Render math in HTML via dvipng. + Render math in HTML via dvipng. This extension has been deprecated; please + use sphinx.ext.imgmath instead. :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. @@ -236,6 +237,7 @@ def html_visit_displaymath(self, node): def setup(app): + app.warn('sphinx.ext.pngmath has been deprecated. Please use sphinx.ext.imgmath instead.') mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None)) app.add_config_value('pngmath_dvipng', 'dvipng', 'html') app.add_config_value('pngmath_latex', 'latex', 'html') From ed196a8adf650272f40b1f66e7ff57e317702f33 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Fri, 1 Jan 2016 01:29:35 +0900 Subject: [PATCH 083/238] Fix README --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index e3318bd5e..4b8b16a7b 100644 --- a/CHANGES +++ b/CHANGES @@ -35,7 +35,7 @@ Bugs fixed * C++, add support for user-defined literals. * #1804: Now html output wraps overflowed long-line-text in the sidebar. Thanks to Hassen ben tanfous. -* #2183: Fix porterstemmer causes `make json` to fail +* #2183: Fix porterstemmer causes ``make json`` to fail Documentation ------------- From 3c907f233787d6774a8dd714f201adb9a4592163 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Fri, 1 Jan 2016 10:35:42 +0900 Subject: [PATCH 084/238] Fix #2027: ``make epub`` got errors if ``html_title`` is None Sphinx does not expect setting None value as ``html_title`` in spite of documented. This changed that to deny None value as ``html_title``. --- doc/config.rst | 3 +-- sphinx/config.py | 2 +- sphinx/quickstart.py | 6 +++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/doc/config.rst b/doc/config.rst index 69cd066b4..77a24dbbd 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -565,8 +565,7 @@ that use Sphinx's HTMLWriter class. The "title" for HTML documentation generated with Sphinx's own templates. This is appended to the ```` tag of individual pages, and used in the navigation bar as the "topmost" element. It defaults to :samp:`'{<project>} - v{<revision>} documentation'` (with the values coming from the config - values). + v{<revision>} documentation'`. .. confval:: html_short_title diff --git a/sphinx/config.py b/sphinx/config.py index 0b7ac9cad..10e320fe0 100644 --- a/sphinx/config.py +++ b/sphinx/config.py @@ -92,7 +92,7 @@ class Config(object): html_theme_options = ({}, 'html'), html_title = (lambda self: l_('%s %s documentation') % (self.project, self.release), - 'html'), + 'html', [str]), html_short_title = (lambda self: self.html_title, 'html'), html_style = (None, 'html', [str]), html_logo = (None, 'html', [str]), diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index ffc4961dc..913e4a2bb 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -190,9 +190,9 @@ html_theme = 'alabaster' # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] -# The name for this set of Sphinx documents. If None, it defaults to -# "<project> v<release> documentation". -#html_title = None +# The name for this set of Sphinx documents. +# "<project> v<release> documentation" by default. +#html_title = u'%(project_str)s v%(release_str)s' # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None From 525a03b21ba1775ffb1e08296f7e401b446bafd5 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 1 Jan 2016 11:04:28 +0900 Subject: [PATCH 085/238] Upate CHANGES for PR #1899 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 4b8b16a7b..c618698c9 100644 --- a/CHANGES +++ b/CHANGES @@ -36,6 +36,7 @@ Bugs fixed * #1804: Now html output wraps overflowed long-line-text in the sidebar. Thanks to Hassen ben tanfous. * #2183: Fix porterstemmer causes ``make json`` to fail +* #1899: Ensure list is sent to OptParse Documentation ------------- From e49d167450987cb08f8f5cdd107331734b4028d3 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade <quantum.analyst@gmail.com> Date: Fri, 1 Jan 2016 04:55:33 -0500 Subject: [PATCH 086/238] Sort attributes in inheritance diagrams. This ensures that the graphviz script is always the same and thus the filename (which is the hash of the script and other things) remains consistent. --- sphinx/ext/inheritance_diagram.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sphinx/ext/inheritance_diagram.py b/sphinx/ext/inheritance_diagram.py index 0f4a18c63..24af6f168 100644 --- a/sphinx/ext/inheritance_diagram.py +++ b/sphinx/ext/inheritance_diagram.py @@ -227,10 +227,10 @@ class InheritanceGraph(object): } def _format_node_attrs(self, attrs): - return ','.join(['%s=%s' % x for x in attrs.items()]) + return ','.join(['%s=%s' % x for x in sorted(attrs.items())]) def _format_graph_attrs(self, attrs): - return ''.join(['%s=%s;\n' % x for x in attrs.items()]) + return ''.join(['%s=%s;\n' % x for x in sorted(attrs.items())]) def generate_dot(self, name, urls={}, env=None, graph_attrs={}, node_attrs={}, edge_attrs={}): From 584f05154bdce3c5c4eef3105b50fb9d5c28cc68 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 1 Jan 2016 17:28:22 +0900 Subject: [PATCH 087/238] Fix #2206: Sphinx latex doc build failed if footnotes in caption of figure At same time, refactored around pending footnotes (tables, terms and figures). They are all controled as ``pending_footnotes``. --- CHANGES | 1 + sphinx/writers/latex.py | 45 +++++++++++++++------------- tests/roots/test-footnotes/index.rst | 6 ++++ tests/test_build_latex.py | 13 ++++---- 4 files changed, 39 insertions(+), 26 deletions(-) diff --git a/CHANGES b/CHANGES index 5e3fbc71b..169e17de0 100644 --- a/CHANGES +++ b/CHANGES @@ -22,6 +22,7 @@ Bugs fixed * #2040: Fix UnicodeDecodeError in sphinx-apidoc when author contains non-ascii characters * #2193: Fix shutil.SameFileError if source directory and destination directory are same * #2178: Fix unparseable C++ cross-reference when referencing a function with :cpp:any: +* #2206: Fix Sphinx latex doc build failed due to a footnotes Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index f5f3b64b2..42acdd820 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -234,7 +234,6 @@ class Table(object): self.has_verbatim = False self.caption = None self.longtable = False - self.footnotes = [] class LaTeXTranslator(nodes.NodeVisitor): @@ -375,7 +374,8 @@ class LaTeXTranslator(nodes.NodeVisitor): sys.maxsize]] self.bodystack = [] self.footnotestack = [] - self.termfootnotestack = [] + self.footnote_restricted = False + self.pending_footnotes = [] self.curfilestack = [] self.handled_abbrs = set() if document.settings.docclass == 'howto': @@ -414,6 +414,20 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body = self.bodystack.pop() return body + def restrict_footnote(self, node): + if self.footnote_restricted is False: + self.footnote_restricted = node + self.pending_footnotes = [] + + def unrestrict_footnote(self, node): + print self.footnote_restricted, self.pending_footnotes + if self.footnote_restricted == node: + self.footnote_restricted = False + for footnode in self.pending_footnotes: + footnode['footnotetext'] = True + footnode.walkabout(self) + self.pending_footnotes = [] + def format_docclass(self, docclass): """ prepends prefix to sphinx document classes """ @@ -891,6 +905,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.tableheaders = [] # Redirect body output until table is finished. self.pushbody(self.tablebody) + self.restrict_footnote(node) def depart_table(self, node): if self.table.rowcount > 30: @@ -961,10 +976,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body.append(endmacro) if not self.table.longtable and self.table.caption is not None: self.body.append('\\end{threeparttable}\n\n') - if self.table.footnotes: - for footnode in self.table.footnotes: - footnode['footnotetext'] = True - footnode.walkabout(self) + self.unrestrict_footnote(node) self.table = None self.tablebody = None @@ -1138,16 +1150,12 @@ class LaTeXTranslator(nodes.NodeVisitor): if node.get('ids'): ctx += self.hypertarget(node['ids'][0]) self.body.append('\\item[{') - self.termfootnotestack.append([]) + self.restrict_footnote(node) self.context.append(ctx) def depart_term(self, node): self.body.append(self.context.pop()) - footnotes = self.termfootnotestack.pop() - for footnode in footnotes: - footnode['footnotetext'] = True - footnode.walkabout(self) - + self.unrestrict_footnote(node) self.in_term -= 1 def visit_termsep(self, node): @@ -1304,6 +1312,7 @@ class LaTeXTranslator(nodes.NodeVisitor): for id in self.next_figure_ids: ids += self.hypertarget(id, anchor=False) self.next_figure_ids.clear() + self.restrict_footnote(node) if (len(node.children) and isinstance(node.children[0], nodes.image) and node.children[0]['ids']): @@ -1331,6 +1340,7 @@ class LaTeXTranslator(nodes.NodeVisitor): def depart_figure(self, node): self.body.append(self.context.pop()) + self.unrestrict_footnote(node) def visit_caption(self, node): self.in_caption += 1 @@ -1666,18 +1676,11 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body.append('\\protect\\footnotemark[%s]' % num) else: self.body.append('\\footnotemark[%s]' % num) - elif self.table: + elif self.footnote_restricted: self.footnotestack[-1][num][1] = True self.body.append('\\protect\\footnotemark[%s]' % num) - self.table.footnotes.append(footnode) - elif self.in_term: - self.body.append('\\footnotemark[%s]' % num) - self.termfootnotestack[-1].append(footnode) + self.pending_footnotes.append(footnode) else: - if self.in_caption: - raise UnsupportedError('%s:%s: footnotes in float captions ' - 'are not supported by LaTeX' % - (self.curfilestack[-1], node.line)) self.footnotestack[-1][num][1] = True footnode.walkabout(self) raise nodes.SkipChildren diff --git a/tests/roots/test-footnotes/index.rst b/tests/roots/test-footnotes/index.rst index e8137da71..ba830dab3 100644 --- a/tests/roots/test-footnotes/index.rst +++ b/tests/roots/test-footnotes/index.rst @@ -46,3 +46,9 @@ Footnote in term [#]_ Description2 .. [#] Footnote in term + +.. figure:: rimg.png + + This is the figure caption with a footnote to [#]_. + +.. [#] Footnote in caption diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 3b2fdaaaa..bed636ec8 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -332,6 +332,9 @@ def test_reference_in_caption(app, status, warning): assert '\\caption{The table title with a reference to {[}AuthorYear{]}}' in result assert '\\paragraph{The rubric title with a reference to {[}AuthorYear{]}}' in result assert '\\chapter{The section with a reference to \\protect\\footnotemark[1]}' in result + assert ('\\caption{This is the figure caption with a footnote to ' + '\\protect\\footnotemark[5].}\end{figure}\n' + '\\footnotetext[5]{\nFootnote in caption\n}')in result @with_app(buildername='latex', testroot='footnotes', @@ -350,7 +353,7 @@ def test_latex_show_urls_is_inline(app, status, warning): '(http://sphinx-doc.org/\\textasciitilde{}test/)' in result) assert ('\\item[{\\href{http://sphinx-doc.org/}{URL in term} (http://sphinx-doc.org/)}] ' '\\leavevmode\nDescription' in result) - assert ('\\item[{Footnote in term \\footnotemark[4]}] ' + assert ('\\item[{Footnote in term \\protect\\footnotemark[4]}] ' '\\leavevmode\\footnotetext[4]{\nFootnote in term\n}\nDescription' in result) assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist} ' '(http://sphinx-doc.org/)}] \\leavevmode\nDescription' in result) @@ -375,11 +378,11 @@ def test_latex_show_urls_is_footnote(app, status, warning): assert 'Third footnote: \\footnote[5]{\nThird\n}' in result assert ('\\href{http://sphinx-doc.org/~test/}{URL including tilde}' '\\footnote[4]{\nhttp://sphinx-doc.org/\\textasciitilde{}test/\n}' in result) - assert ('\\item[{\\href{http://sphinx-doc.org/}{URL in term}\\footnotemark[6]}] ' + assert ('\\item[{\\href{http://sphinx-doc.org/}{URL in term}\\protect\\footnotemark[6]}] ' '\\leavevmode\\footnotetext[6]{\nhttp://sphinx-doc.org/\n}\nDescription' in result) - assert ('\\item[{Footnote in term \\footnotemark[8]}] ' + assert ('\\item[{Footnote in term \\protect\\footnotemark[8]}] ' '\\leavevmode\\footnotetext[8]{\nFootnote in term\n}\nDescription' in result) - assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist}\\footnotemark[7]}] ' + assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist}\\protect\\footnotemark[7]}] ' '\\leavevmode\\footnotetext[7]{\nhttp://sphinx-doc.org/\n}\nDescription' in result) assert ('\\href{https://github.com/sphinx-doc/sphinx}' '{https://github.com/sphinx-doc/sphinx}\n' in result) @@ -402,7 +405,7 @@ def test_latex_show_urls_is_no(app, status, warning): assert '\\href{http://sphinx-doc.org/~test/}{URL including tilde}' in result assert ('\\item[{\\href{http://sphinx-doc.org/}{URL in term}}] ' '\\leavevmode\nDescription' in result) - assert ('\\item[{Footnote in term \\footnotemark[4]}] ' + assert ('\\item[{Footnote in term \\protect\\footnotemark[4]}] ' '\\leavevmode\\footnotetext[4]{\nFootnote in term\n}\nDescription' in result) assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist}}] ' '\\leavevmode\nDescription' in result) From 532dec6076065bcdee931f4645dabb2363b193e4 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 1 Jan 2016 19:20:28 +0900 Subject: [PATCH 088/238] Remove debug print --- sphinx/writers/latex.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 42acdd820..5ff721803 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -420,7 +420,6 @@ class LaTeXTranslator(nodes.NodeVisitor): self.pending_footnotes = [] def unrestrict_footnote(self, node): - print self.footnote_restricted, self.pending_footnotes if self.footnote_restricted == node: self.footnote_restricted = False for footnode in self.pending_footnotes: From b0f376fdb8946ae476027019e3e335f5a60ee0ed Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 1 Jan 2016 19:31:36 +0900 Subject: [PATCH 089/238] Fix #2201: wrong table caption for tables with over 30 rows --- CHANGES | 1 + sphinx/writers/latex.py | 5 +- tests/roots/test-footnotes/index.rst | 86 ++++++++++++++++++++++++++++ tests/test_build_latex.py | 5 ++ 4 files changed, 96 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 169e17de0..e9bdda0d4 100644 --- a/CHANGES +++ b/CHANGES @@ -23,6 +23,7 @@ Bugs fixed * #2193: Fix shutil.SameFileError if source directory and destination directory are same * #2178: Fix unparseable C++ cross-reference when referencing a function with :cpp:any: * #2206: Fix Sphinx latex doc build failed due to a footnotes +* #2201: Fix wrong table caption for tables with over 30 rows Release 1.3.3 (released Dec 2, 2015) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 5ff721803..a4b42e1e4 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -948,7 +948,10 @@ class LaTeXTranslator(nodes.NodeVisitor): else: self.body.append('{|' + ('L|' * self.table.colcount) + '}\n') if self.table.longtable and self.table.caption is not None: - self.body.append(u'\\caption{%s}' % self.table.caption) + self.body.append(u'\\caption{') + for caption in self.table.caption: + self.body.append(caption) + self.body.append('}') for id in self.next_table_ids: self.body.append(self.hypertarget(id, anchor=False)) self.next_table_ids.clear() diff --git a/tests/roots/test-footnotes/index.rst b/tests/roots/test-footnotes/index.rst index ba830dab3..0c0e29b39 100644 --- a/tests/roots/test-footnotes/index.rst +++ b/tests/roots/test-footnotes/index.rst @@ -52,3 +52,89 @@ Footnote in term [#]_ This is the figure caption with a footnote to [#]_. .. [#] Footnote in caption + +.. list-table:: footnote [#]_ in caption of normal table + :widths: 1 1 + :header-rows: 1 + + * - name + - desc + * - a + - b + * - a + - b + +.. [#] Foot note in table + +.. list-table:: footnote [#]_ in caption of longtable + :widths: 1 1 + :header-rows: 1 + + * - name + - desc + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + * - a + - b + +.. [#] Foot note in longtable diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index bed636ec8..36f55923f 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -335,6 +335,11 @@ def test_reference_in_caption(app, status, warning): assert ('\\caption{This is the figure caption with a footnote to ' '\\protect\\footnotemark[5].}\end{figure}\n' '\\footnotetext[5]{\nFootnote in caption\n}')in result + assert ('\\caption{footnote \\protect\\footnotemark[6] ' + 'in caption of normal table}') in result + assert '\\end{threeparttable}\n\n\\footnotetext[6]{\nFoot note in table\n}' in result + assert '\\caption{footnote \\protect\\footnotemark[7] in caption of longtable}' in result + assert '\end{longtable}\n\n\\footnotetext[7]{\nFoot note in longtable\n}' in result @with_app(buildername='latex', testroot='footnotes', From 5f9547bc21fa4424d4b2366a598966e9edd0a5ea Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 1 Jan 2016 21:07:43 +0900 Subject: [PATCH 090/238] Update CHANGES for PR #2192 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index c618698c9..2ec35184c 100644 --- a/CHANGES +++ b/CHANGES @@ -21,6 +21,7 @@ Features added * C++, added support for template parameter in function info field lists. * C++, added support for pointers to member (function). * #2113: Allow ``:class:`` option to code-block directive +* #2192: Imgmath (pngmath with svg support) Bugs fixed ---------- From f86217c9d1b0f483e44a66eccbbc8fed27c3b9f1 Mon Sep 17 00:00:00 2001 From: Jakub Wilk <jwilk@jwilk.net> Date: Fri, 1 Jan 2016 20:54:30 +0100 Subject: [PATCH 091/238] Fix typos. --- doc/config.rst | 2 +- doc/domains.rst | 4 ++-- doc/extdev/appapi.rst | 2 +- doc/web/quickstart.rst | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/config.rst b/doc/config.rst index 69cd066b4..e4f085365 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -453,7 +453,7 @@ documentation on :ref:`intl` for details. this path are searched by the standard :mod:`gettext` module. Internal messages are fetched from a text domain of ``sphinx``; so if you - add the directory :file:`./locale` to this settting, the message catalogs + add the directory :file:`./locale` to this setting, the message catalogs (compiled from ``.po`` format using :program:`msgfmt`) must be in :file:`./locale/{language}/LC_MESSAGES/sphinx.mo`. The text domain of individual documents depends on :confval:`gettext_compact`. diff --git a/doc/domains.rst b/doc/domains.rst index e7bfc1a53..803a4343c 100644 --- a/doc/domains.rst +++ b/doc/domains.rst @@ -594,7 +594,7 @@ a visibility statement (``public``, ``private`` or ``protected``). .. rst:directive:: .. cpp:member:: (member) variable declaration .. cpp:var:: (member) variable declaration - Describe a varible or member variable, e.g.,:: + Describe a variable or member variable, e.g.,:: .. cpp:member:: std::string MyClass::myMember @@ -671,7 +671,7 @@ a visibility statement (``public``, ``private`` or ``protected``). Namespacing ~~~~~~~~~~~~~~~~~ -Declarations in the C++ doamin are as default placed in global scope. +Declarations in the C++ domain are as default placed in global scope. The current scope can be changed using three namespace directives. They manage a stack declarations where ``cpp:namespace`` resets the stack and changes a given scope. diff --git a/doc/extdev/appapi.rst b/doc/extdev/appapi.rst index c2ee4cc86..d1912676a 100644 --- a/doc/extdev/appapi.rst +++ b/doc/extdev/appapi.rst @@ -155,7 +155,7 @@ package. add_directive('literalinclude', literalinclude_directive, content = 0, arguments = (1, 0, 0), linenos = directives.flag, - language = direcitves.unchanged, + language = directives.unchanged, encoding = directives.encoding) .. versionchanged:: 0.6 diff --git a/doc/web/quickstart.rst b/doc/web/quickstart.rst index 996942db6..1611774c1 100644 --- a/doc/web/quickstart.rst +++ b/doc/web/quickstart.rst @@ -135,7 +135,7 @@ add this data to the ``COMMENT_OPTIONS`` that are used in the template. .. note:: - This only works works if your documentation is served from your + This only works if your documentation is served from your document root. If it is served from another directory, you will need to prefix the url route with that directory, and give the `docroot` keyword argument when creating the web support object:: From 3db02ede82708f512402ced631934696b4a6f399 Mon Sep 17 00:00:00 2001 From: Hong Xu <hong@topbug.net> Date: Fri, 1 Jan 2016 12:21:24 -0800 Subject: [PATCH 092/238] Set <blockquote> in the classic theme to fit with <p>. A blockquote looks better if its text style is close to <p>. --- sphinx/themes/classic/static/classic.css_t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/themes/classic/static/classic.css_t b/sphinx/themes/classic/static/classic.css_t index 15d072954..3f3274ec3 100644 --- a/sphinx/themes/classic/static/classic.css_t +++ b/sphinx/themes/classic/static/classic.css_t @@ -223,7 +223,7 @@ a.headerlink:hover { color: white; } -div.body p, div.body dd, div.body li { +div.body p, div.body dd, div.body li, div.body blockquote { text-align: justify; line-height: 130%; } From 01a526793d2a5ad980b7333c5707fc622ace8058 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 2 Jan 2016 11:17:59 +0900 Subject: [PATCH 093/238] Fix typos #2122 (cherry-picked by hand) --- doc/config.rst | 2 +- doc/domains.rst | 2 +- doc/extdev/appapi.rst | 2 +- doc/web/quickstart.rst | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/config.rst b/doc/config.rst index b48d59616..3fd1df658 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -453,7 +453,7 @@ documentation on :ref:`intl` for details. this path are searched by the standard :mod:`gettext` module. Internal messages are fetched from a text domain of ``sphinx``; so if you - add the directory :file:`./locale` to this settting, the message catalogs + add the directory :file:`./locale` to this setting, the message catalogs (compiled from ``.po`` format using :program:`msgfmt`) must be in :file:`./locale/{language}/LC_MESSAGES/sphinx.mo`. The text domain of individual documents depends on :confval:`gettext_compact`. diff --git a/doc/domains.rst b/doc/domains.rst index 2e85841e6..f2e437b06 100644 --- a/doc/domains.rst +++ b/doc/domains.rst @@ -561,7 +561,7 @@ a visibility statement (``public``, ``private`` or ``protected``). .. rst:directive:: .. cpp:member:: (member-)variable declaration .. cpp:var:: (member-)variable declaration - Describe a varible or member variable, e.g.,:: + Describe a variable or member variable, e.g.,:: .. cpp:member:: std::string theclass::name diff --git a/doc/extdev/appapi.rst b/doc/extdev/appapi.rst index c2ee4cc86..d1912676a 100644 --- a/doc/extdev/appapi.rst +++ b/doc/extdev/appapi.rst @@ -155,7 +155,7 @@ package. add_directive('literalinclude', literalinclude_directive, content = 0, arguments = (1, 0, 0), linenos = directives.flag, - language = direcitves.unchanged, + language = directives.unchanged, encoding = directives.encoding) .. versionchanged:: 0.6 diff --git a/doc/web/quickstart.rst b/doc/web/quickstart.rst index 996942db6..1611774c1 100644 --- a/doc/web/quickstart.rst +++ b/doc/web/quickstart.rst @@ -135,7 +135,7 @@ add this data to the ``COMMENT_OPTIONS`` that are used in the template. .. note:: - This only works works if your documentation is served from your + This only works if your documentation is served from your document root. If it is served from another directory, you will need to prefix the url route with that directory, and give the `docroot` keyword argument when creating the web support object:: From 6d0a74b689f9851be1e7f84cdc9d265d5cfe0599 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 2 Jan 2016 11:42:06 +0900 Subject: [PATCH 094/238] Update CHANGES for PR #2213 --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index e9bdda0d4..9dce4c1b4 100644 --- a/CHANGES +++ b/CHANGES @@ -24,7 +24,7 @@ Bugs fixed * #2178: Fix unparseable C++ cross-reference when referencing a function with :cpp:any: * #2206: Fix Sphinx latex doc build failed due to a footnotes * #2201: Fix wrong table caption for tables with over 30 rows - +* #2213: Set <blockquote> in the classic theme to fit with <p> Release 1.3.3 (released Dec 2, 2015) ==================================== From b6efc7327f38d5aa96075fe37b8ba65874f359bd Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 2 Jan 2016 16:01:52 +0900 Subject: [PATCH 095/238] Make ``conf.py`` less flake8 warnings (ref #1817, #2077) --- sphinx/quickstart.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index d70725ae6..9cb1fd589 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -87,7 +87,6 @@ QUICKSTART_CONF += u'''\ import sys import os -import shlex # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the @@ -295,8 +294,8 @@ latex_elements = { # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, '%(project_fn)s.tex', u'%(project_doc_texescaped_str)s', - u'%(author_texescaped_str)s', 'manual'), + (master_doc, '%(project_fn)s.tex', u'%(project_doc_texescaped_str)s', + u'%(author_texescaped_str)s', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of @@ -339,9 +338,9 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, '%(project_fn)s', u'%(project_doc_str)s', - author, '%(project_fn)s', 'One line description of project.', - 'Miscellaneous'), + (master_doc, '%(project_fn)s', u'%(project_doc_str)s', + author, '%(project_fn)s', 'One line description of project.', + 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. @@ -370,10 +369,10 @@ epub_copyright = copyright # The basename for the epub file. It defaults to the project name. #epub_basename = project -# The HTML theme for the epub output. Since the default themes are not optimized -# for small screen space, using the same theme for HTML and epub output is -# usually not wise. This defaults to 'epub', a theme designed to save visual -# space. +# The HTML theme for the epub output. Since the default themes are not +# optimized for small screen space, using the same theme for HTML and epub +# output is usually not wise. This defaults to 'epub', a theme designed to save +# visual space. #epub_theme = 'epub' # The language of the text. It defaults to the language option From 00b909f9b6a251854de78c2445cc09c021d3125e Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 2 Jan 2016 17:58:16 +0900 Subject: [PATCH 096/238] Fix warnings caused by renaming pngmath in CHANGES and docs --- CHANGES | 4 ++-- doc/invocation.rst | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 2ec35184c..98f7dfca8 100644 --- a/CHANGES +++ b/CHANGES @@ -625,7 +625,7 @@ Bugs fixed if they contain uppercase letters. * #923: Take the entire LaTeX document into account when caching pngmath-generated images. This rebuilds them correctly when - `pngmath_latex_preamble` changes. + ``pngmath_latex_preamble`` changes. * #901: Emit a warning when using docutils' new "math" markup without a Sphinx math extension active. * #845: In code blocks, when the selected lexer fails, display line numbers @@ -1244,7 +1244,7 @@ Features added indicators. - #367: Added automatic exclusion of hidden members in inheritance diagrams, and an option to selectively enable it. - - Added `pngmath_add_tooltips`. + - Added ``pngmath_add_tooltips``. - The math extension displaymath directives now support ``name`` in addition to ``label`` for giving the equation label, for compatibility with Docutils. diff --git a/doc/invocation.rst b/doc/invocation.rst index 1d0c613c3..8fe01bf8d 100644 --- a/doc/invocation.rst +++ b/doc/invocation.rst @@ -100,9 +100,9 @@ Extension options Enable `sphinx.ext.coverage` extension. -.. option:: --ext-pngmath +.. option:: --ext-imgmath - Enable `sphinx.ext.pngmath` extension. + Enable `sphinx.ext.imgmath` extension. .. option:: --ext-mathjax From 83da5df5059b988b6ebc53018790425260bbe74c Mon Sep 17 00:00:00 2001 From: Hong Xu <hong@topbug.net> Date: Tue, 29 Dec 2015 14:36:57 -0800 Subject: [PATCH 097/238] LaTeX: Disable specific UTF-8 support commands for XeTeX and LuaTeX XeTeX and LuaTeX have builtin UTF-8 support. --- sphinx/writers/latex.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 6f56c5fb0..28410257e 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -249,7 +249,9 @@ class LaTeXTranslator(nodes.NodeVisitor): 'classoptions': '', 'extraclassoptions': '', 'inputenc': '\\usepackage[utf8]{inputenc}', - 'utf8extra': '\\DeclareUnicodeCharacter{00A0}{\\nobreakspace}', + 'utf8extra': ('\\ifdefined\\DeclareUnicodeCharacter\n' + ' \\DeclareUnicodeCharacter{00A0}{\\nobreakspace}\n' + '\\else\\fi'), 'cmappkg': '\\usepackage{cmap}', 'fontenc': '\\usepackage[T1]{fontenc}', 'babel': '\\usepackage{babel}', From 01c381363e3ae314f4b2449873636c1406f827c1 Mon Sep 17 00:00:00 2001 From: Hong Xu <hong@topbug.net> Date: Tue, 29 Dec 2015 14:40:01 -0800 Subject: [PATCH 098/238] Run xelatex and lualatex as well in latex tests. --- tests/test_build_latex.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index d4f9f8451..5cdd3f592 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -77,18 +77,21 @@ def test_latex(app, status, warning): cwd = os.getcwd() os.chdir(app.outdir) try: - try: - p = Popen(['pdflatex', '--interaction=nonstopmode', - 'SphinxTests.tex'], stdout=PIPE, stderr=PIPE) - except OSError: - raise SkipTest # most likely pdflatex was not found - else: - stdout, stderr = p.communicate() - if p.returncode != 0: - print(stdout) - print(stderr) - del app.cleanup_trees[:] - assert False, 'latex exited with return code %s' % p.returncode + for latex in ('pdflatex', 'xelatex', 'lualatex'): + try: + os.mkdir(latex) + p = Popen([latex, '--interaction=nonstopmode', + '-output-directory=%s' % latex, 'SphinxTests.tex'], + stdout=PIPE, stderr=PIPE) + except OSError: + raise SkipTest # most likely pdflatex was not found + else: + stdout, stderr = p.communicate() + if p.returncode != 0: + print(stdout) + print(stderr) + del app.cleanup_trees[:] + assert False, 'latex exited with return code %s' % p.returncode finally: os.chdir(cwd) From a4e37fe7bf43cda2915a5ddd8e73c8a0070b65a2 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 2 Jan 2016 17:59:50 +0900 Subject: [PATCH 099/238] Update CHANGES for PR #2200 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 98f7dfca8..c72025b8c 100644 --- a/CHANGES +++ b/CHANGES @@ -22,6 +22,7 @@ Features added * C++, added support for pointers to member (function). * #2113: Allow ``:class:`` option to code-block directive * #2192: Imgmath (pngmath with svg support) +* #2200: Support XeTeX and LuaTeX for the LaTeX builder Bugs fixed ---------- From 297c1647110b766c6d0aeadcbaa74a365d75d2a1 Mon Sep 17 00:00:00 2001 From: jfbu <jfbu@users.noreply.github.com> Date: Wed, 30 Dec 2015 10:22:09 +0100 Subject: [PATCH 100/238] Load graphicx without specifying the driver This is issue #2164. On the current main TeX installations (TeXLive, MikTeX), \pdftexversion is defined also when running latex to produce dvi files. This commit deletes TeX code which resulted in the "pdftex" driver being always assumed, which made it a priori impossible to compile via latex. The graphicx packages is smart enough to detect correctly the driver (pdftex, xetex, ...) and defaults to dvips. --- sphinx/texinputs/sphinx.sty | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty index fe22111c2..e9c35b9b5 100644 --- a/sphinx/texinputs/sphinx.sty +++ b/sphinx/texinputs/sphinx.sty @@ -58,12 +58,7 @@ \fi \fi -% For graphicx, check if we are compiling under latex or pdflatex. -\ifx\pdftexversion\undefined - \usepackage{graphicx} -\else - \usepackage[pdftex]{graphicx} -\fi +\RequirePackage{graphicx} % for PDF output, use colors and maximal compression \newif\ifsphinxpdfoutput\sphinxpdfoutputfalse From ddf6acd33c31af56738566363efc0ac21396a1fe Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 2 Jan 2016 20:23:01 +0900 Subject: [PATCH 101/238] Update CHANGES for PR #2204 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index c72025b8c..136a0402b 100644 --- a/CHANGES +++ b/CHANGES @@ -39,6 +39,7 @@ Bugs fixed Hassen ben tanfous. * #2183: Fix porterstemmer causes ``make json`` to fail * #1899: Ensure list is sent to OptParse +* #2164: Fix wrong check for pdftex inside sphinx.sty (for graphicx package option) Documentation ------------- From c305f30ae408bed3a754a497709411085ab6197f Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 2 Jan 2016 22:42:16 +0900 Subject: [PATCH 102/238] Add .swp to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 298a9c370..be28908ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.pyc *.egg *.so +*.swp .dir-locals.el .ropeproject/ From e41f831fc4fb4e33db8ef53e15f405b985554c29 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 23 Dec 2015 23:32:48 +0900 Subject: [PATCH 103/238] Fix paragraphs in table cell doesn't work in Latex output (ref #1574) --- sphinx/writers/latex.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index a4b42e1e4..16756798c 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -42,6 +42,7 @@ HEADER = r'''%% Generated by Sphinx. %(longtable)s \usepackage{sphinx} \usepackage{multirow} +\usepackage{eqparbox} %(usepackages)s %(contentsname)s %(numfig_format)s @@ -396,6 +397,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.in_caption = 0 self.in_container_literal_block = 0 self.in_term = 0 + self.in_merged_cell = 0 self.first_document = 1 self.this_is_the_title = 1 self.literal_whitespace = 0 @@ -1074,6 +1076,13 @@ class LaTeXTranslator(nodes.NodeVisitor): if 'morerows' in node: self.remember_multirowcol[self.table.col] = node.get('morecols') self.table.col += node.get('morecols') + if (('morecols' in node or 'morerows' in node) and + (len(node) > 2 or len(node.astext().split('\n')) > 2)): + self.in_merged_cell = 1 + self.literal_whitespace += 1 + self.body.append('\\eqparbox{%d}{\\vspace{.5\\baselineskip}\n' % id(node)) + self.pushbody([]) + context += '}' if isinstance(node.parent.parent, nodes.thead): if len(node) == 1 and isinstance(node[0], nodes.paragraph) and node.astext() == '': pass @@ -1093,6 +1102,16 @@ class LaTeXTranslator(nodes.NodeVisitor): self.context.append(context) def depart_entry(self, node): + if self.in_merged_cell: + self.in_merged_cell = 0 + self.literal_whitespace -= 1 + body = self.popbody() + # Remove empty lines from top of merged cell + while body and body[0] == "\n": + body.pop(0) + for line in body: + line = re.sub(u'(?<!~\\\\\\\\)\n', u'~\\\\\\\\\n', line) # escape return code + self.body.append(line) self.body.append(self.context.pop()) # header def visit_acks(self, node): From 2bcf92dfb0837f3be804662770fb4d45b767c284 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 3 Jan 2016 20:12:33 +0900 Subject: [PATCH 104/238] Fix #1815: linkcheck does not raise an exception if warniserror set to true and link is broken --- CHANGES | 1 + sphinx/builders/linkcheck.py | 5 +++-- sphinx/ext/doctest.py | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 9dce4c1b4..51d22aa76 100644 --- a/CHANGES +++ b/CHANGES @@ -25,6 +25,7 @@ Bugs fixed * #2206: Fix Sphinx latex doc build failed due to a footnotes * #2201: Fix wrong table caption for tables with over 30 rows * #2213: Set <blockquote> in the classic theme to fit with <p> +* #1815: Fix linkcheck does not raise an exception if warniserror set to true and link is broken Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/builders/linkcheck.py b/sphinx/builders/linkcheck.py index 5dac89e2f..72010113a 100644 --- a/sphinx/builders/linkcheck.py +++ b/sphinx/builders/linkcheck.py @@ -243,11 +243,12 @@ class CheckExternalLinksBuilder(Builder): elif status == 'working': self.info(darkgreen('ok ') + uri + info) elif status == 'broken': - self.info(red('broken ') + uri + red(' - ' + info)) self.write_entry('broken', docname, lineno, uri + ': ' + info) - if self.app.quiet: + if self.app.quiet or self.app.warningiserror: self.warn('broken link: %s' % uri, '%s:%s' % (self.env.doc2path(docname), lineno)) + else: + self.info(red('broken ') + uri + red(' - ' + info)) elif status == 'redirected': text, color = { 301: ('permanently', darkred), diff --git a/sphinx/ext/doctest.py b/sphinx/ext/doctest.py index e22024d42..5877be2eb 100644 --- a/sphinx/ext/doctest.py +++ b/sphinx/ext/doctest.py @@ -262,9 +262,10 @@ Results of doctest builder run on %s self.outfile.write(text) def _warn_out(self, text): - self.info(text, nonl=True) - if self.app.quiet: + if self.app.quiet or self.app.warningiserror: self.warn(text) + else: + self.info(text, nonl=True) if isinstance(text, binary_type): text = force_decode(text, None) self.outfile.write(text) From 7bb685bbe97824bc2c65bf8cb1d7ac38e5f91cd4 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 3 Jan 2016 20:26:38 +0900 Subject: [PATCH 105/238] Fix #2197: Slightly cryptic error message for missing index.rst file --- CHANGES | 1 + sphinx/environment.py | 4 ++-- tests/test_build.py | 11 +++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 51d22aa76..66464bd3b 100644 --- a/CHANGES +++ b/CHANGES @@ -26,6 +26,7 @@ Bugs fixed * #2201: Fix wrong table caption for tables with over 30 rows * #2213: Set <blockquote> in the classic theme to fit with <p> * #1815: Fix linkcheck does not raise an exception if warniserror set to true and link is broken +* #2197: Fix slightly cryptic error message for missing index.rst file Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/environment.py b/sphinx/environment.py index 371b3a6c4..5d2107299 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -618,8 +618,8 @@ class BuildEnvironment: self._read_serial(docnames, app) if config.master_doc not in self.all_docs: - self.warn(None, 'master file %s not found' % - self.doc2path(config.master_doc)) + raise SphinxError('master file %s not found' % + self.doc2path(config.master_doc)) self.app = None diff --git a/tests/test_build.py b/tests/test_build.py index 5b9d7a756..aa5d72ce9 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -12,6 +12,7 @@ from six import BytesIO from textwrap import dedent +from sphinx.errors import SphinxError from util import with_app, rootdir, tempdir, SkipTest, TestApp @@ -73,6 +74,16 @@ def test_build_all(): yield verify_build, buildername, srcdir +@with_app(buildername='text') +def test_master_doc_not_found(app, status, warning): + (app.srcdir / 'contents.txt').unlink() + try: + app.builder.build_all() + assert False # SphinxError not raised + except Exception as exc: + assert isinstance(exc, SphinxError) + + @with_app(buildername='text', testroot='circular') def test_circular_toctree(app, status, warning): app.builder.build_all() From 26c43643d349553c1acb45884ac5f73a359f16db Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 3 Jan 2016 20:52:39 +0900 Subject: [PATCH 106/238] Fix broken tests by 7bb685bbe97824bc2c65bf8cb1d7ac38e5f91cd4 --- tests/roots/test-doctest/conf.py | 2 +- tests/test_build.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/roots/test-doctest/conf.py b/tests/roots/test-doctest/conf.py index f6a12edb9..2e721fb57 100644 --- a/tests/roots/test-doctest/conf.py +++ b/tests/roots/test-doctest/conf.py @@ -1,5 +1,5 @@ extensions = ['sphinx.ext.doctest'] project = 'test project for doctest' -master_doc = 'doctest.txt' +master_doc = 'doctest' source_suffix = '.txt' diff --git a/tests/test_build.py b/tests/test_build.py index aa5d72ce9..97ef651a6 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -76,12 +76,14 @@ def test_build_all(): @with_app(buildername='text') def test_master_doc_not_found(app, status, warning): - (app.srcdir / 'contents.txt').unlink() + (app.srcdir / 'contents.txt').move(app.srcdir / 'contents.txt.bak') try: app.builder.build_all() assert False # SphinxError not raised except Exception as exc: assert isinstance(exc, SphinxError) + finally: + (app.srcdir / 'contents.txt.bak').move(app.srcdir / 'contents.txt') @with_app(buildername='text', testroot='circular') From f81ab1e8b9690902721901eda378a47d7dc6e8a0 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 1 Jan 2016 12:06:46 +0900 Subject: [PATCH 107/238] Fix #2162: Add Sphinx.add_source_parser() to add source_suffix and source_parsers from extension --- doc/extdev/appapi.rst | 6 ++++++ sphinx/application.py | 14 ++++++++++++++ .../conf.py | 18 ++++++++++++++++++ .../test_source_parser.py | 11 +++++++++++ tests/roots/test-add_source_parser/conf.py | 18 ++++++++++++++++++ .../test_source_parser.py | 11 +++++++++++ tests/test_application.py | 15 +++++++++++++++ 7 files changed, 93 insertions(+) create mode 100644 tests/roots/test-add_source_parser-conflicts-with-users-setting/conf.py create mode 100644 tests/roots/test-add_source_parser-conflicts-with-users-setting/test_source_parser.py create mode 100644 tests/roots/test-add_source_parser/conf.py create mode 100644 tests/roots/test-add_source_parser/test_source_parser.py diff --git a/doc/extdev/appapi.rst b/doc/extdev/appapi.rst index d1912676a..d16f3a597 100644 --- a/doc/extdev/appapi.rst +++ b/doc/extdev/appapi.rst @@ -336,6 +336,12 @@ package. .. versionadded:: 1.1 +.. method:: Sphinx.add_source_parser(name, suffix, parser) + + Register a parser class for specified *suffix*. + + .. versionadded:: 1.4 + .. method:: Sphinx.require_sphinx(version) Compare *version* (which must be a ``major.minor`` version string, diff --git a/sphinx/application.py b/sphinx/application.py index 1e3435c5a..09916530e 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -77,6 +77,7 @@ class Sphinx(object): self.next_listener_id = 0 self._extensions = {} self._extension_metadata = {} + self._additional_source_parsers = {} self._listeners = {} self._setting_up_extension = ['?'] self.domains = BUILTIN_DOMAINS.copy() @@ -185,6 +186,8 @@ class Sphinx(object): self._init_i18n() # check all configuration values for permissible types self.config.check_types(self.warn) + # set up source_parsers + self._init_source_parsers() # set up the build environment self._init_env(freshenv) # set up the builder @@ -211,6 +214,13 @@ class Sphinx(object): else: self.info('not available for built-in messages') + def _init_source_parsers(self): + for suffix, parser in iteritems(self._additional_source_parsers): + if suffix not in self.config.source_suffix: + self.config.source_suffix.append(suffix) + if suffix not in self.config.source_parsers: + self.config.source_parsers[suffix] = parser + def _init_env(self, freshenv): if freshenv: self.env = BuildEnvironment(self.srcdir, self.doctreedir, @@ -752,6 +762,10 @@ class Sphinx(object): assert issubclass(cls, SearchLanguage) languages[cls.lang] = cls + def add_source_parser(self, suffix, parser): + self.debug('[app] adding search source_parser: %r, %r', (suffix, parser)) + self._additional_source_parsers[suffix] = parser + class TemplateBridge(object): """ diff --git a/tests/roots/test-add_source_parser-conflicts-with-users-setting/conf.py b/tests/roots/test-add_source_parser-conflicts-with-users-setting/conf.py new file mode 100644 index 000000000..db9fe54a9 --- /dev/null +++ b/tests/roots/test-add_source_parser-conflicts-with-users-setting/conf.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +import os +import sys +from docutils.parsers import Parser + +sys.path.insert(0, os.path.abspath('.')) + + +class DummyTestParser(Parser): + pass + + +extensions = ['test_source_parser'] +source_suffix = ['.rst', '.test'] +source_parsers = { + '.test': DummyTestParser +} diff --git a/tests/roots/test-add_source_parser-conflicts-with-users-setting/test_source_parser.py b/tests/roots/test-add_source_parser-conflicts-with-users-setting/test_source_parser.py new file mode 100644 index 000000000..0dff7e311 --- /dev/null +++ b/tests/roots/test-add_source_parser-conflicts-with-users-setting/test_source_parser.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- + +from docutils.parsers import Parser + + +class TestSourceParser(Parser): + pass + + +def setup(app): + app.add_source_parser('.test', TestSourceParser) diff --git a/tests/roots/test-add_source_parser/conf.py b/tests/roots/test-add_source_parser/conf.py new file mode 100644 index 000000000..f9969341a --- /dev/null +++ b/tests/roots/test-add_source_parser/conf.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +import os +import sys +from docutils.parsers import Parser + +sys.path.insert(0, os.path.abspath('.')) + + +class DummyMarkdownParser(Parser): + pass + + +extensions = ['test_source_parser'] +source_suffix = ['.rst', '.md'] +source_parsers = { + '.md': DummyMarkdownParser +} diff --git a/tests/roots/test-add_source_parser/test_source_parser.py b/tests/roots/test-add_source_parser/test_source_parser.py new file mode 100644 index 000000000..0dff7e311 --- /dev/null +++ b/tests/roots/test-add_source_parser/test_source_parser.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- + +from docutils.parsers import Parser + + +class TestSourceParser(Parser): + pass + + +def setup(app): + app.add_source_parser('.test', TestSourceParser) diff --git a/tests/test_application.py b/tests/test_application.py index c878cc1b6..a19664bf7 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -88,3 +88,18 @@ def test_domain_override(app, status, warning): assert app.override_domain(B) is None raises_msg(ExtensionError, 'new domain not a subclass of registered ' 'foo domain', app.override_domain, C) + + +@with_app(testroot='add_source_parser') +def test_add_source_parser(app, status, warning): + assert set(app.config.source_suffix) == set(['.rst', '.md', '.test']) + assert set(app.config.source_parsers.keys()) == set(['.md', '.test']) + assert app.config.source_parsers['.md'].__name__ == 'DummyMarkdownParser' + assert app.config.source_parsers['.test'].__name__ == 'TestSourceParser' + + +@with_app(testroot='add_source_parser-conflicts-with-users-setting') +def test_add_source_parser_conflicts_with_users_setting(app, status, warning): + assert set(app.config.source_suffix) == set(['.rst', '.test']) + assert set(app.config.source_parsers.keys()) == set(['.test']) + assert app.config.source_parsers['.test'].__name__ == 'DummyTestParser' From e8e5391e611b13e0939abb4b9ad50cf959214254 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Mon, 4 Jan 2016 11:19:50 +0900 Subject: [PATCH 108/238] Fix #1894: Unlisted phony targets in quickstart Makefile --- CHANGES | 1 + sphinx/quickstart.py | 29 ++++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 66464bd3b..1ec247ec2 100644 --- a/CHANGES +++ b/CHANGES @@ -27,6 +27,7 @@ Bugs fixed * #2213: Set <blockquote> in the classic theme to fit with <p> * #1815: Fix linkcheck does not raise an exception if warniserror set to true and link is broken * #2197: Fix slightly cryptic error message for missing index.rst file +* #1894: Unlisted phony targets in quickstart Makefile Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index 9cb1fd589..e785ab207 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -487,9 +487,7 @@ $(SPHINXOPTS) %(rsrcdir)s # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) %(rsrcdir)s -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp \ -epub latex latexpdf text man changes linkcheck doctest coverage gettext - +.PHONY: help help: \t@echo "Please use \\`make <target>' where <target> is one of" \t@echo " html to make standalone HTML files" @@ -518,40 +516,48 @@ help: (if enabled)" \t@echo " coverage to run coverage check of the documentation (if enabled)" +.PHONY: clean clean: \trm -rf $(BUILDDIR)/* +.PHONY: html html: \t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html \t@echo \t@echo "Build finished. The HTML pages are in $(BUILDDIR)/html." +.PHONY: dirhtml dirhtml: \t$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml \t@echo \t@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." +.PHONY: singlehtml singlehtml: \t$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml \t@echo \t@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." +.PHONY: pickle pickle: \t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle \t@echo \t@echo "Build finished; now you can process the pickle files." +.PHONY: json json: \t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json \t@echo \t@echo "Build finished; now you can process the JSON files." +.PHONY: htmlhelp htmlhelp: \t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp \t@echo \t@echo "Build finished; now you can run HTML Help Workshop with the" \\ \t ".hhp project file in $(BUILDDIR)/htmlhelp." +.PHONY: qthelp qthelp: \t$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp \t@echo @@ -561,6 +567,7 @@ qthelp: \t@echo "To view the help file:" \t@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/%(project_fn)s.qhc" +.PHONY: applehelp applehelp: \t$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp \t@echo @@ -569,6 +576,7 @@ applehelp: \t "~/Library/Documentation/Help or install it in your application" \\ \t "bundle." +.PHONY: devhelp devhelp: \t$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp \t@echo @@ -579,11 +587,13 @@ devhelp: $$HOME/.local/share/devhelp/%(project_fn)s" \t@echo "# devhelp" +.PHONY: epub epub: \t$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub \t@echo \t@echo "Build finished. The epub file is in $(BUILDDIR)/epub." +.PHONY: latex latex: \t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex \t@echo @@ -591,28 +601,33 @@ latex: \t@echo "Run \\`make' in that directory to run these through (pdf)latex" \\ \t "(use \\`make latexpdf' here to do that automatically)." +.PHONY: latexpdf latexpdf: \t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex \t@echo "Running LaTeX files through pdflatex..." \t$(MAKE) -C $(BUILDDIR)/latex all-pdf \t@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." +.PHONY: latexpdfja latexpdfja: \t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex \t@echo "Running LaTeX files through platex and dvipdfmx..." \t$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja \t@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." +.PHONY: text text: \t$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text \t@echo \t@echo "Build finished. The text files are in $(BUILDDIR)/text." +.PHONY: man man: \t$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man \t@echo \t@echo "Build finished. The manual pages are in $(BUILDDIR)/man." +.PHONY: texinfo texinfo: \t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo \t@echo @@ -620,43 +635,51 @@ texinfo: \t@echo "Run \\`make' in that directory to run these through makeinfo" \\ \t "(use \\`make info' here to do that automatically)." +.PHONY: info info: \t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo \t@echo "Running Texinfo files through makeinfo..." \tmake -C $(BUILDDIR)/texinfo info \t@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." +.PHONY: gettext gettext: \t$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale \t@echo \t@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." +.PHONY: changes changes: \t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes \t@echo \t@echo "The overview file is in $(BUILDDIR)/changes." +.PHONY: linkcheck linkcheck: \t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck \t@echo \t@echo "Link check complete; look for any errors in the above output " \\ \t "or in $(BUILDDIR)/linkcheck/output.txt." +.PHONY: doctest doctest: \t$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest \t@echo "Testing of doctests in the sources finished, look at the " \\ \t "results in $(BUILDDIR)/doctest/output.txt." +.PHONY: coverage coverage: \t$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage \t@echo "Testing of coverage in the sources finished, look at the " \\ \t "results in $(BUILDDIR)/coverage/python.txt." +.PHONY: xml xml: \t$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml \t@echo \t@echo "Build finished. The XML files are in $(BUILDDIR)/xml." +.PHONY: pseudoxml pseudoxml: \t$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml \t@echo From 070cf51764673cb43ef09419c876dec8a25be78f Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Mon, 4 Jan 2016 22:23:47 +0900 Subject: [PATCH 109/238] Update CHANGES for #1906 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 136a0402b..1cde4e2d1 100644 --- a/CHANGES +++ b/CHANGES @@ -23,6 +23,7 @@ Features added * #2113: Allow ``:class:`` option to code-block directive * #2192: Imgmath (pngmath with svg support) * #2200: Support XeTeX and LuaTeX for the LaTeX builder +* #1906: Use xcolor over color for \fcolorbox where available for LaTeX output Bugs fixed ---------- From af5edc31ee5598f35365c9cb15f4786b84877218 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20K=C3=B6hl?= <mail@koehlma.de> Date: Fri, 20 Nov 2015 21:40:20 +0100 Subject: [PATCH 110/238] beautify collapsed grouped field --- sphinx/util/docfields.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sphinx/util/docfields.py b/sphinx/util/docfields.py index d503ac58b..4c566390b 100644 --- a/sphinx/util/docfields.py +++ b/sphinx/util/docfields.py @@ -107,7 +107,14 @@ class GroupedField(Field): fieldname = nodes.field_name('', self.label) listnode = self.list_type() if len(items) == 1 and self.can_collapse: - return Field.make_field(self, types, domain, items[0]) + fieldarg, content = items[0] + par = nodes.paragraph() + par += self.make_xref(self.rolename, domain, fieldarg, + addnodes.literal_strong) + par += nodes.Text(' -- ') + par += content + fieldbody = nodes.field_body('', par) + return nodes.field('', fieldname, fieldbody) for fieldarg, content in items: par = nodes.paragraph() par += self.make_xref(self.rolename, domain, fieldarg, From 65ad78daece1b1a895936c895aca85fe3e8f0bfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20K=C3=B6hl?= <mail@koehlma.de> Date: Fri, 20 Nov 2015 22:07:39 +0100 Subject: [PATCH 111/238] [tests] beautify collapsed grouped field --- tests/test_intl.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_intl.py b/tests/test_intl.py index dabb2a3f5..0086b63f2 100644 --- a/tests/test_intl.py +++ b/tests/test_intl.py @@ -280,8 +280,8 @@ def test_text_builder(app, status, warning): u"\n * **foo** -- DESCRIPTION OF PARAMETER foo\n" u"\n * **bar** -- DESCRIPTION OF PARAMETER bar\n" u"\nclass Cls3(values)\n" - u"\n Raises ValueError:" - u"\n IF THE VALUES ARE OUT OF RANGE\n" + u"\n Raises:" + u"\n **ValueError** -- IF THE VALUES ARE OUT OF RANGE\n" u"\nclass Cls4(values)\n" u"\n Raises:" u"\n * **TypeError** -- IF THE VALUES ARE NOT VALID\n" From 1ac571cd7e9c9a90d6c3c2e9d63a69777871a5f1 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 5 Jan 2016 00:25:53 +0900 Subject: [PATCH 112/238] Fix #2125: unifies behavior of collapsed fields (`GroupedField` and `TypedField`) --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 1ec247ec2..54647a909 100644 --- a/CHANGES +++ b/CHANGES @@ -28,6 +28,7 @@ Bugs fixed * #1815: Fix linkcheck does not raise an exception if warniserror set to true and link is broken * #2197: Fix slightly cryptic error message for missing index.rst file * #1894: Unlisted phony targets in quickstart Makefile +* #2125: Fix unifies behavior of collapsed fields (`GroupedField` and `TypedField`) Release 1.3.3 (released Dec 2, 2015) ==================================== From 51b101f0067a340bc948f9e66480d265c9444146 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 5 Jan 2016 00:26:31 +0900 Subject: [PATCH 113/238] Refactor GroupedField.make_field() --- sphinx/util/docfields.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/sphinx/util/docfields.py b/sphinx/util/docfields.py index 4c566390b..f556f302f 100644 --- a/sphinx/util/docfields.py +++ b/sphinx/util/docfields.py @@ -106,15 +106,6 @@ class GroupedField(Field): def make_field(self, types, domain, items): fieldname = nodes.field_name('', self.label) listnode = self.list_type() - if len(items) == 1 and self.can_collapse: - fieldarg, content = items[0] - par = nodes.paragraph() - par += self.make_xref(self.rolename, domain, fieldarg, - addnodes.literal_strong) - par += nodes.Text(' -- ') - par += content - fieldbody = nodes.field_body('', par) - return nodes.field('', fieldname, fieldbody) for fieldarg, content in items: par = nodes.paragraph() par += self.make_xref(self.rolename, domain, fieldarg, @@ -122,6 +113,9 @@ class GroupedField(Field): par += nodes.Text(' -- ') par += content listnode += nodes.list_item('', par) + if len(items) == 1 and self.can_collapse: + fieldbody = nodes.field_body('', listnode[0][0]) + return nodes.field('', fieldname, fieldbody) fieldbody = nodes.field_body('', listnode) return nodes.field('', fieldname, fieldbody) From 789c298c66e1d204ace770d8447b7e0b9da4d29b Mon Sep 17 00:00:00 2001 From: Akihiro Uchida <uchida@turbare.net> Date: Mon, 4 Jan 2016 23:29:21 +0900 Subject: [PATCH 114/238] Fix #2165: Remove faulty and non-need conditional --- sphinx/texinputs/sphinx.sty | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty index 4458afb15..25eef2a74 100644 --- a/sphinx/texinputs/sphinx.sty +++ b/sphinx/texinputs/sphinx.sty @@ -58,10 +58,9 @@ %\renewcommand{\paperwidth}{7in} % O'Reilly ``Programmming Python'' % use pdfoutput for pTeX and dvipdfmx +% when pTeX (\kanjiskip is defined), set pdfoutput to evade \include{pdfcolor} \ifx\kanjiskip\undefined\else - \ifx\Gin@driver{dvipdfmx.def}\undefined\else - \newcount\pdfoutput\pdfoutput=0 - \fi + \newcount\pdfoutput\pdfoutput=0 \fi \RequirePackage{graphicx} From ce1db22a504248e661e4f7081c82b541327f9980 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 5 Jan 2016 00:31:08 +0900 Subject: [PATCH 115/238] Update CHANGES for #2165 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 1cde4e2d1..3ce9cffc9 100644 --- a/CHANGES +++ b/CHANGES @@ -41,6 +41,7 @@ Bugs fixed * #2183: Fix porterstemmer causes ``make json`` to fail * #1899: Ensure list is sent to OptParse * #2164: Fix wrong check for pdftex inside sphinx.sty (for graphicx package option) +* #2165, #2218: Remove faulty and non-need conditional from sphinx.sty Documentation ------------- From ec4a1ae8636fb70eaf34b4f7892824babfed917b Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 5 Jan 2016 16:47:52 +0900 Subject: [PATCH 116/238] Fix typo in README --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 54647a909..28abeb45f 100644 --- a/CHANGES +++ b/CHANGES @@ -28,7 +28,7 @@ Bugs fixed * #1815: Fix linkcheck does not raise an exception if warniserror set to true and link is broken * #2197: Fix slightly cryptic error message for missing index.rst file * #1894: Unlisted phony targets in quickstart Makefile -* #2125: Fix unifies behavior of collapsed fields (`GroupedField` and `TypedField`) +* #2125: Fix unifies behavior of collapsed fields (``GroupedField`` and ``TypedField``) Release 1.3.3 (released Dec 2, 2015) ==================================== From d0576cd01212b57699cbf7d8e9d8375baecf665c Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 5 Jan 2016 16:48:22 +0900 Subject: [PATCH 117/238] Fix #1408: Check latex_logo validity before copying --- CHANGES | 1 + sphinx/builders/latex.py | 8 ++++++-- tests/test_build_latex.py | 10 ++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 28abeb45f..7d56602bc 100644 --- a/CHANGES +++ b/CHANGES @@ -29,6 +29,7 @@ Bugs fixed * #2197: Fix slightly cryptic error message for missing index.rst file * #1894: Unlisted phony targets in quickstart Makefile * #2125: Fix unifies behavior of collapsed fields (``GroupedField`` and ``TypedField``) +* #1408: Check latex_logo validity before copying Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/builders/latex.py b/sphinx/builders/latex.py index 1eef58d66..f98d2153e 100644 --- a/sphinx/builders/latex.py +++ b/sphinx/builders/latex.py @@ -20,6 +20,7 @@ from docutils.frontend import OptionParser from sphinx import package_dir, addnodes from sphinx.util import texescape +from sphinx.errors import SphinxError from sphinx.locale import _ from sphinx.builders import Builder from sphinx.environment import NoUri @@ -191,6 +192,9 @@ class LaTeXBuilder(Builder): # the logo is handled differently if self.config.latex_logo: logobase = path.basename(self.config.latex_logo) - copyfile(path.join(self.confdir, self.config.latex_logo), - path.join(self.outdir, logobase)) + logotarget = path.join(self.outdir, logobase) + if not path.isfile(path.join(self.confdir, self.config.latex_logo)): + raise SphinxError('logo file %r does not exist' % self.config.latex_logo) + elif not path.isfile(logotarget): + copyfile(path.join(self.confdir, self.config.latex_logo), logotarget) self.info('done') diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 36f55923f..9177ecb94 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -16,6 +16,7 @@ from subprocess import Popen, PIPE from six import PY3 +from sphinx.errors import SphinxError from sphinx.writers.latex import LaTeXTranslator from util import SkipTest, remove_unicode_literals, with_app @@ -418,3 +419,12 @@ def test_latex_show_urls_is_no(app, status, warning): '{https://github.com/sphinx-doc/sphinx}\n' in result) assert ('\\href{mailto:sphinx-dev@googlegroups.com}' '{sphinx-dev@googlegroups.com}\n' in result) + + +@with_app(buildername='latex', confoverrides={'latex_logo': 'notfound.jpg'}) +def test_latex_logo_if_not_found(app, status, warning): + try: + app.builder.build_all() + assert False # SphinxError not raised + except Exception as exc: + assert isinstance(exc, SphinxError) From b0a5a1339ecddf46dac96e594309eb5fa85ebe11 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 6 Jan 2016 01:34:29 +0900 Subject: [PATCH 118/238] Fix #771: latex output doesn't set tocdepth --- CHANGES | 2 +- sphinx/builders/latex.py | 9 +++++++++ sphinx/writers/latex.py | 9 +++++++++ tests/roots/test-tocdepth/index.rst | 1 + tests/test_build_latex.py | 28 ++++++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 7d56602bc..6bd03e17e 100644 --- a/CHANGES +++ b/CHANGES @@ -30,7 +30,7 @@ Bugs fixed * #1894: Unlisted phony targets in quickstart Makefile * #2125: Fix unifies behavior of collapsed fields (``GroupedField`` and ``TypedField``) * #1408: Check latex_logo validity before copying - +* #771: Fix latex output doesn't set tocdepth Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/builders/latex.py b/sphinx/builders/latex.py index f98d2153e..85b71b578 100644 --- a/sphinx/builders/latex.py +++ b/sphinx/builders/latex.py @@ -95,6 +95,14 @@ class LaTeXBuilder(Builder): destination_path=path.join(self.outdir, targetname), encoding='utf-8') self.info("processing " + targetname + "... ", nonl=1) + toctrees = self.env.get_doctree(docname).traverse(addnodes.toctree) + if toctrees: + if toctrees[0].get('maxdepth'): + tocdepth = int(toctrees[0].get('maxdepth')) + else: + tocdepth = None + else: + tocdepth = None doctree = self.assemble_doctree( docname, toctree_only, appendices=((docclass != 'howto') and self.config.latex_appendices or [])) @@ -106,6 +114,7 @@ class LaTeXBuilder(Builder): doctree.settings.contentsname = self.get_contentsname(docname) doctree.settings.docname = docname doctree.settings.docclass = docclass + doctree.settings.tocdepth = tocdepth docwriter.write(doctree, destination) self.info("done") diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index a4b42e1e4..c381bf823 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -53,6 +53,7 @@ HEADER = r'''%% Generated by Sphinx. \author{%(author)s} \newcommand{\sphinxlogo}{%(logo)s} \renewcommand{\releasename}{%(releasename)s} +%(tocdepth)s %(makeindex)s ''' @@ -273,6 +274,7 @@ class LaTeXTranslator(nodes.NodeVisitor): 'printindex': '\\printindex', 'transition': '\n\n\\bigskip\\hrule{}\\bigskip\n\n', 'figure_align': 'htbp', + 'tocdepth': '', } # sphinx specific document classes @@ -357,6 +359,13 @@ class LaTeXTranslator(nodes.NodeVisitor): if self.elements['extraclassoptions']: self.elements['classoptions'] += ',' + \ self.elements['extraclassoptions'] + if document.settings.tocdepth: + if document.settings.docclass == 'howto': + self.elements['tocdepth'] = ('\\setcounter{tocdepth}{%d}' % + document.settings.tocdepth) + else: + self.elements['tocdepth'] = ('\\setcounter{tocdepth}{%d}' % + (document.settings.tocdepth - 1)) self.highlighter = highlighting.PygmentsBridge( 'latex', diff --git a/tests/roots/test-tocdepth/index.rst b/tests/roots/test-tocdepth/index.rst index 0b651d483..a702cb88b 100644 --- a/tests/roots/test-tocdepth/index.rst +++ b/tests/roots/test-tocdepth/index.rst @@ -3,6 +3,7 @@ test-tocdepth .. toctree:: :numbered: + :maxdepth: 2 foo bar diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 9177ecb94..81f436c3a 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -428,3 +428,31 @@ def test_latex_logo_if_not_found(app, status, warning): assert False # SphinxError not raised except Exception as exc: assert isinstance(exc, SphinxError) + + +@with_app(buildername='latex', testroot='tocdepth', + confoverrides={'latex_documents': [ + ('index', 'SphinxTests.tex', 'Sphinx Tests Documentation', + 'Georg Brandl', 'manual'), + ]}) +def test_toctree_maxdepth_manual(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'SphinxTests.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert '\\setcounter{tocdepth}{1}' in result + + +@with_app(buildername='latex', testroot='tocdepth', + confoverrides={'latex_documents': [ + ('index', 'SphinxTests.tex', 'Sphinx Tests Documentation', + 'Georg Brandl', 'howto'), + ]}) +def test_toctree_maxdepth_howto(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'SphinxTests.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert '\\setcounter{tocdepth}{2}' in result From dc0873adf63b9097ea4705f7186158de373d17c3 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Wed, 6 Jan 2016 07:27:34 +0900 Subject: [PATCH 119/238] Fix #1820: On Windows, console coloring is broken with colorama version 0.3.3. Now sphinx use colorama>=0.3.5 to avoid this problem. --- CHANGES | 3 +++ setup.py | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 6bd03e17e..87c8530d8 100644 --- a/CHANGES +++ b/CHANGES @@ -31,6 +31,9 @@ Bugs fixed * #2125: Fix unifies behavior of collapsed fields (``GroupedField`` and ``TypedField``) * #1408: Check latex_logo validity before copying * #771: Fix latex output doesn't set tocdepth +* #1820: On Windows, console coloring is broken with colorama version 0.3.3. + Now sphinx use colorama>=0.3.5 to avoid this problem. + Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/setup.py b/setup.py index 6bc288757..4ff63150d 100644 --- a/setup.py +++ b/setup.py @@ -58,7 +58,7 @@ requires = [ extras_require = { # Environment Marker works for wheel 0.24 or later ':sys_platform=="win32"': [ - 'colorama', + 'colorama>=0.3.5', ], 'websupport': [ 'sqlalchemy>=0.9', @@ -73,7 +73,7 @@ extras_require = { # for sdist installation with pip-1.5.6 if sys.platform == 'win32': - requires.append('colorama') + requires.append('colorama>=0.3.5') # Provide a "compile_catalog" command that also creates the translated # JavaScript files if Babel is available. From acea9900b5a6dd5cd2063f1515652ab6fc6af401 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Wed, 6 Jan 2016 07:28:19 +0900 Subject: [PATCH 120/238] fix over 90 columns --- CHANGES | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 87c8530d8..de0e01bfa 100644 --- a/CHANGES +++ b/CHANGES @@ -14,7 +14,8 @@ Bugs fixed * #2168: Fix raw directive does not work for text writer * #2171: Fix cannot linkcheck url with unicode * #2182: LaTeX: support image file names with more than 1 dots -* #2189: Fix previous sibling link for first file in subdirectory uses last file, not intended previous from root toctree +* #2189: Fix previous sibling link for first file in subdirectory uses last file, not + intended previous from root toctree * #2003: Fix decode error under python2 (only) when ``make linkcheck`` is run * #2186: Fix LaTeX output of \mathbb in math * #1480, #2188: LaTeX: Support math in section titles @@ -25,7 +26,8 @@ Bugs fixed * #2206: Fix Sphinx latex doc build failed due to a footnotes * #2201: Fix wrong table caption for tables with over 30 rows * #2213: Set <blockquote> in the classic theme to fit with <p> -* #1815: Fix linkcheck does not raise an exception if warniserror set to true and link is broken +* #1815: Fix linkcheck does not raise an exception if warniserror set to true and link is + broken * #2197: Fix slightly cryptic error message for missing index.rst file * #1894: Unlisted phony targets in quickstart Makefile * #2125: Fix unifies behavior of collapsed fields (``GroupedField`` and ``TypedField``) From 924f65d737d008338db83118e9cd86ab58e1c69f Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 6 Jan 2016 09:45:19 +0900 Subject: [PATCH 121/238] Use document['tocdepth'] instead of document.setting.tocdepth --- sphinx/builders/latex.py | 2 +- sphinx/writers/latex.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sphinx/builders/latex.py b/sphinx/builders/latex.py index 85b71b578..18041eae3 100644 --- a/sphinx/builders/latex.py +++ b/sphinx/builders/latex.py @@ -106,6 +106,7 @@ class LaTeXBuilder(Builder): doctree = self.assemble_doctree( docname, toctree_only, appendices=((docclass != 'howto') and self.config.latex_appendices or [])) + doctree['tocdepth'] = tocdepth self.post_process_images(doctree) self.info("writing... ", nonl=1) doctree.settings = docsettings @@ -114,7 +115,6 @@ class LaTeXBuilder(Builder): doctree.settings.contentsname = self.get_contentsname(docname) doctree.settings.docname = docname doctree.settings.docclass = docclass - doctree.settings.tocdepth = tocdepth docwriter.write(doctree, destination) self.info("done") diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index c381bf823..478d50318 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -359,13 +359,13 @@ class LaTeXTranslator(nodes.NodeVisitor): if self.elements['extraclassoptions']: self.elements['classoptions'] += ',' + \ self.elements['extraclassoptions'] - if document.settings.tocdepth: + if document.get('tocdepth'): if document.settings.docclass == 'howto': self.elements['tocdepth'] = ('\\setcounter{tocdepth}{%d}' % - document.settings.tocdepth) + document['tocdepth']) else: self.elements['tocdepth'] = ('\\setcounter{tocdepth}{%d}' % - (document.settings.tocdepth - 1)) + (document['tocdepth'] - 1)) self.highlighter = highlighting.PygmentsBridge( 'latex', From 26e29de9045103f4a23be59ff7ab964c974ab3e1 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 6 Jan 2016 09:51:34 +0900 Subject: [PATCH 122/238] Fix broken testcase; Split test-toctree-maxdepth from test-tocdepth --- tests/roots/test-tocdepth/index.rst | 1 - tests/roots/test-toctree-maxdepth/bar.rst | 27 +++++++++++++++++++++ tests/roots/test-toctree-maxdepth/baz.rst | 5 ++++ tests/roots/test-toctree-maxdepth/conf.py | 4 +++ tests/roots/test-toctree-maxdepth/foo.rst | 26 ++++++++++++++++++++ tests/roots/test-toctree-maxdepth/index.rst | 9 +++++++ tests/test_build_latex.py | 4 +-- 7 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 tests/roots/test-toctree-maxdepth/bar.rst create mode 100644 tests/roots/test-toctree-maxdepth/baz.rst create mode 100644 tests/roots/test-toctree-maxdepth/conf.py create mode 100644 tests/roots/test-toctree-maxdepth/foo.rst create mode 100644 tests/roots/test-toctree-maxdepth/index.rst diff --git a/tests/roots/test-tocdepth/index.rst b/tests/roots/test-tocdepth/index.rst index a702cb88b..0b651d483 100644 --- a/tests/roots/test-tocdepth/index.rst +++ b/tests/roots/test-tocdepth/index.rst @@ -3,7 +3,6 @@ test-tocdepth .. toctree:: :numbered: - :maxdepth: 2 foo bar diff --git a/tests/roots/test-toctree-maxdepth/bar.rst b/tests/roots/test-toctree-maxdepth/bar.rst new file mode 100644 index 000000000..d70dec90d --- /dev/null +++ b/tests/roots/test-toctree-maxdepth/bar.rst @@ -0,0 +1,27 @@ +:tocdepth: 2 + +=== +Bar +=== + +should be 2 + +Bar A +===== + +should be 2.1 + +.. toctree:: + + baz + +Bar B +===== + +should be 2.2 + +Bar B1 +------ + +should be 2.2.1 + diff --git a/tests/roots/test-toctree-maxdepth/baz.rst b/tests/roots/test-toctree-maxdepth/baz.rst new file mode 100644 index 000000000..b07fa0507 --- /dev/null +++ b/tests/roots/test-toctree-maxdepth/baz.rst @@ -0,0 +1,5 @@ +Baz A +----- + +should be 2.1.1 + diff --git a/tests/roots/test-toctree-maxdepth/conf.py b/tests/roots/test-toctree-maxdepth/conf.py new file mode 100644 index 000000000..cf05c9b5c --- /dev/null +++ b/tests/roots/test-toctree-maxdepth/conf.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' +html_theme = 'classic' diff --git a/tests/roots/test-toctree-maxdepth/foo.rst b/tests/roots/test-toctree-maxdepth/foo.rst new file mode 100644 index 000000000..61fd539ff --- /dev/null +++ b/tests/roots/test-toctree-maxdepth/foo.rst @@ -0,0 +1,26 @@ +=== +Foo +=== + +should be 1 + +Foo A +===== + +should be 1.1 + +Foo A1 +------ + +should be 1.1.1 + +Foo B +===== + +should be 1.2 + +Foo B1 +------ + +should be 1.2.1 + diff --git a/tests/roots/test-toctree-maxdepth/index.rst b/tests/roots/test-toctree-maxdepth/index.rst new file mode 100644 index 000000000..30dc61c8b --- /dev/null +++ b/tests/roots/test-toctree-maxdepth/index.rst @@ -0,0 +1,9 @@ +test-toctree-max-depth +====================== + +.. toctree:: + :numbered: + :maxdepth: 2 + + foo + bar diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 81f436c3a..9b58a6746 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -430,7 +430,7 @@ def test_latex_logo_if_not_found(app, status, warning): assert isinstance(exc, SphinxError) -@with_app(buildername='latex', testroot='tocdepth', +@with_app(buildername='latex', testroot='toctree-maxdepth', confoverrides={'latex_documents': [ ('index', 'SphinxTests.tex', 'Sphinx Tests Documentation', 'Georg Brandl', 'manual'), @@ -444,7 +444,7 @@ def test_toctree_maxdepth_manual(app, status, warning): assert '\\setcounter{tocdepth}{1}' in result -@with_app(buildername='latex', testroot='tocdepth', +@with_app(buildername='latex', testroot='toctree-maxdepth', confoverrides={'latex_documents': [ ('index', 'SphinxTests.tex', 'Sphinx Tests Documentation', 'Georg Brandl', 'howto'), From e03dc8d27e7eeecea6801cf18d4360c37e877376 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 6 Jan 2016 11:13:30 +0900 Subject: [PATCH 123/238] Fix #2072: Footnotes in chapter-titles do not appear in PDF output --- CHANGES | 1 + sphinx/writers/latex.py | 2 ++ tests/roots/test-footnotes/index.rst | 4 +++- tests/test_build_latex.py | 34 +++++++++++++++------------- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/CHANGES b/CHANGES index de0e01bfa..a3b950e64 100644 --- a/CHANGES +++ b/CHANGES @@ -35,6 +35,7 @@ Bugs fixed * #771: Fix latex output doesn't set tocdepth * #1820: On Windows, console coloring is broken with colorama version 0.3.3. Now sphinx use colorama>=0.3.5 to avoid this problem. +* #2072: Fix footnotes in chapter-titles do not appear in PDF output Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 478d50318..784c58c21 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -724,6 +724,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body.append(r'\%s{' % self.sectionnames[-1]) self.context.append('}\n') + self.restrict_footnote(node) if self.next_section_ids: for id in self.next_section_ids: self.context[-1] += self.hypertarget(id, anchor=False) @@ -753,6 +754,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.table.caption = self.popbody() else: self.body.append(self.context.pop()) + self.unrestrict_footnote(node) def visit_subtitle(self, node): if isinstance(node.parent, nodes.sidebar): diff --git a/tests/roots/test-footnotes/index.rst b/tests/roots/test-footnotes/index.rst index 0c0e29b39..a20052037 100644 --- a/tests/roots/test-footnotes/index.rst +++ b/tests/roots/test-footnotes/index.rst @@ -33,9 +33,11 @@ The section with a reference to [AuthorYear]_ .. [1] Second .. [#] Third -The section with a reference to [1]_ +The section with a reference to [#]_ ===================================== +.. [#] Footnote in section + `URL in term <http://sphinx-doc.org/>`_ Description Description Description ... diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 9b58a6746..e86a794fa 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -332,15 +332,17 @@ def test_reference_in_caption(app, status, warning): assert '\\chapter{The section with a reference to {[}AuthorYear{]}}' in result assert '\\caption{The table title with a reference to {[}AuthorYear{]}}' in result assert '\\paragraph{The rubric title with a reference to {[}AuthorYear{]}}' in result - assert '\\chapter{The section with a reference to \\protect\\footnotemark[1]}' in result + assert ('\\chapter{The section with a reference to \\protect\\footnotemark[4]}\n' + '\\label{index:the-section-with-a-reference-to}' + '\\footnotetext[4]{\nFootnote in section\n}' in result) assert ('\\caption{This is the figure caption with a footnote to ' - '\\protect\\footnotemark[5].}\end{figure}\n' - '\\footnotetext[5]{\nFootnote in caption\n}')in result - assert ('\\caption{footnote \\protect\\footnotemark[6] ' + '\\protect\\footnotemark[6].}\end{figure}\n' + '\\footnotetext[6]{\nFootnote in caption\n}')in result + assert ('\\caption{footnote \\protect\\footnotemark[7] ' 'in caption of normal table}') in result - assert '\\end{threeparttable}\n\n\\footnotetext[6]{\nFoot note in table\n}' in result - assert '\\caption{footnote \\protect\\footnotemark[7] in caption of longtable}' in result - assert '\end{longtable}\n\n\\footnotetext[7]{\nFoot note in longtable\n}' in result + assert '\\end{threeparttable}\n\n\\footnotetext[7]{\nFoot note in table\n}' in result + assert '\\caption{footnote \\protect\\footnotemark[8] in caption of longtable}' in result + assert '\end{longtable}\n\n\\footnotetext[8]{\nFoot note in longtable\n}' in result @with_app(buildername='latex', testroot='footnotes', @@ -359,8 +361,8 @@ def test_latex_show_urls_is_inline(app, status, warning): '(http://sphinx-doc.org/\\textasciitilde{}test/)' in result) assert ('\\item[{\\href{http://sphinx-doc.org/}{URL in term} (http://sphinx-doc.org/)}] ' '\\leavevmode\nDescription' in result) - assert ('\\item[{Footnote in term \\protect\\footnotemark[4]}] ' - '\\leavevmode\\footnotetext[4]{\nFootnote in term\n}\nDescription' in result) + assert ('\\item[{Footnote in term \\protect\\footnotemark[5]}] ' + '\\leavevmode\\footnotetext[5]{\nFootnote in term\n}\nDescription' in result) assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist} ' '(http://sphinx-doc.org/)}] \\leavevmode\nDescription' in result) assert ('\\href{https://github.com/sphinx-doc/sphinx}' @@ -384,12 +386,12 @@ def test_latex_show_urls_is_footnote(app, status, warning): assert 'Third footnote: \\footnote[5]{\nThird\n}' in result assert ('\\href{http://sphinx-doc.org/~test/}{URL including tilde}' '\\footnote[4]{\nhttp://sphinx-doc.org/\\textasciitilde{}test/\n}' in result) - assert ('\\item[{\\href{http://sphinx-doc.org/}{URL in term}\\protect\\footnotemark[6]}] ' - '\\leavevmode\\footnotetext[6]{\nhttp://sphinx-doc.org/\n}\nDescription' in result) - assert ('\\item[{Footnote in term \\protect\\footnotemark[8]}] ' - '\\leavevmode\\footnotetext[8]{\nFootnote in term\n}\nDescription' in result) - assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist}\\protect\\footnotemark[7]}] ' + assert ('\\item[{\\href{http://sphinx-doc.org/}{URL in term}\\protect\\footnotemark[7]}] ' '\\leavevmode\\footnotetext[7]{\nhttp://sphinx-doc.org/\n}\nDescription' in result) + assert ('\\item[{Footnote in term \\protect\\footnotemark[9]}] ' + '\\leavevmode\\footnotetext[9]{\nFootnote in term\n}\nDescription' in result) + assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist}\\protect\\footnotemark[8]}] ' + '\\leavevmode\\footnotetext[8]{\nhttp://sphinx-doc.org/\n}\nDescription' in result) assert ('\\href{https://github.com/sphinx-doc/sphinx}' '{https://github.com/sphinx-doc/sphinx}\n' in result) assert ('\\href{mailto:sphinx-dev@googlegroups.com}' @@ -411,8 +413,8 @@ def test_latex_show_urls_is_no(app, status, warning): assert '\\href{http://sphinx-doc.org/~test/}{URL including tilde}' in result assert ('\\item[{\\href{http://sphinx-doc.org/}{URL in term}}] ' '\\leavevmode\nDescription' in result) - assert ('\\item[{Footnote in term \\protect\\footnotemark[4]}] ' - '\\leavevmode\\footnotetext[4]{\nFootnote in term\n}\nDescription' in result) + assert ('\\item[{Footnote in term \\protect\\footnotemark[5]}] ' + '\\leavevmode\\footnotetext[5]{\nFootnote in term\n}\nDescription' in result) assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist}}] ' '\\leavevmode\nDescription' in result) assert ('\\href{https://github.com/sphinx-doc/sphinx}' From b323900d936236880d6999cdf79f112885af1bb4 Mon Sep 17 00:00:00 2001 From: Hong Xu <hong@topbug.net> Date: Sat, 2 Jan 2016 13:55:37 -0800 Subject: [PATCH 124/238] Specify a default format (pdf) in the LaTeX output Makefile --- sphinx/texinputs/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sphinx/texinputs/Makefile b/sphinx/texinputs/Makefile index 5e6030c0d..71cc69f48 100644 --- a/sphinx/texinputs/Makefile +++ b/sphinx/texinputs/Makefile @@ -8,6 +8,8 @@ ALLDVI = $(addsuffix .dvi,$(ALLDOCS)) ARCHIVEPRREFIX = # Additional LaTeX options LATEXOPTS = +# format: pdf or dvi +FMT = pdf LATEX = latex PDFLATEX = pdflatex From e3687bb47d25d0817e39e130453524b6d4033da7 Mon Sep 17 00:00:00 2001 From: Hong Xu <hong@topbug.net> Date: Sat, 2 Jan 2016 14:06:38 -0800 Subject: [PATCH 125/238] Add "gz" and "xz" archive target to the LaTeX output Makefile --- sphinx/texinputs/Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sphinx/texinputs/Makefile b/sphinx/texinputs/Makefile index 71cc69f48..50d0622d7 100644 --- a/sphinx/texinputs/Makefile +++ b/sphinx/texinputs/Makefile @@ -43,9 +43,15 @@ tar: all-$(FMT) tar cf $(ARCHIVEPREFIX)docs-$(FMT).tar $(ARCHIVEPREFIX)docs-$(FMT) rm -r $(ARCHIVEPREFIX)docs-$(FMT) +gz: tar + gzip -9 < $(ARCHIVEPREFIX)docs-$(FMT).tar > $(ARCHIVEPREFIX)docs-$(FMT).tar.gz + bz2: tar bzip2 -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar +xz: tar + xz -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar + # The number of LaTeX runs is quite conservative, but I don't expect it # to get run often, so the little extra time won't hurt. %.dvi: %.tex From 8241b3d16f5afa57b7c929e95fc8fbd6422aaa2d Mon Sep 17 00:00:00 2001 From: Hong Xu <hong@topbug.net> Date: Sat, 2 Jan 2016 14:10:24 -0800 Subject: [PATCH 126/238] The clean target the LaTeX ouput Makefile should remove more files --- sphinx/texinputs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/texinputs/Makefile b/sphinx/texinputs/Makefile index 50d0622d7..dc818f387 100644 --- a/sphinx/texinputs/Makefile +++ b/sphinx/texinputs/Makefile @@ -71,7 +71,7 @@ xz: tar $(PDFLATEX) $(LATEXOPTS) '$<' clean: - rm -f *.dvi *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla + rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz $(ALLPDF) $(ALLDVI) .PHONY: all all-pdf all-dvi all-ps clean .PHONY: all-pdf-ja From 715b460c8c6db4cbec6e59b9583ec48c0d5f101c Mon Sep 17 00:00:00 2001 From: Hong Xu <hong@topbug.net> Date: Sat, 2 Jan 2016 14:29:16 -0800 Subject: [PATCH 127/238] Add more PHONY targets in the LaTeX output Makefile --- sphinx/texinputs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/texinputs/Makefile b/sphinx/texinputs/Makefile index dc818f387..d748006cc 100644 --- a/sphinx/texinputs/Makefile +++ b/sphinx/texinputs/Makefile @@ -73,6 +73,6 @@ xz: tar clean: rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz $(ALLPDF) $(ALLDVI) -.PHONY: all all-pdf all-dvi all-ps clean +.PHONY: all all-pdf all-dvi all-ps clean zip tar gz bz2 xz .PHONY: all-pdf-ja From 4036dffd516158988045b60c31376cad5031003b Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 6 Jan 2016 12:43:33 +0900 Subject: [PATCH 128/238] Update CHANGES for PR #2216 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 3ce9cffc9..2cb244c93 100644 --- a/CHANGES +++ b/CHANGES @@ -24,6 +24,7 @@ Features added * #2192: Imgmath (pngmath with svg support) * #2200: Support XeTeX and LuaTeX for the LaTeX builder * #1906: Use xcolor over color for \fcolorbox where available for LaTeX output +* #2216: Texinputs makefile improvrments Bugs fixed ---------- From c100089334acccf9ed29a409ac7821ee75359ad6 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade <quantum.analyst@gmail.com> Date: Fri, 1 Jan 2016 04:55:33 -0500 Subject: [PATCH 129/238] Sort attributes in inheritance diagrams. This ensures that the graphviz script is always the same and thus the filename (which is the hash of the script and other things) remains consistent. --- sphinx/ext/inheritance_diagram.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sphinx/ext/inheritance_diagram.py b/sphinx/ext/inheritance_diagram.py index 0f4a18c63..24af6f168 100644 --- a/sphinx/ext/inheritance_diagram.py +++ b/sphinx/ext/inheritance_diagram.py @@ -227,10 +227,10 @@ class InheritanceGraph(object): } def _format_node_attrs(self, attrs): - return ','.join(['%s=%s' % x for x in attrs.items()]) + return ','.join(['%s=%s' % x for x in sorted(attrs.items())]) def _format_graph_attrs(self, attrs): - return ''.join(['%s=%s;\n' % x for x in attrs.items()]) + return ''.join(['%s=%s;\n' % x for x in sorted(attrs.items())]) def generate_dot(self, name, urls={}, env=None, graph_attrs={}, node_attrs={}, edge_attrs={}): From ba73c484e50fc3de22299753bdb966ccd2d9c179 Mon Sep 17 00:00:00 2001 From: Georg Brandl <georg@python.org> Date: Wed, 6 Jan 2016 10:37:30 +0100 Subject: [PATCH 130/238] chinese search: add to changelog, remote porterstemmer support --- CHANGES | 28 +++++++++++++++------------- sphinx/search/zh.py | 21 +++++---------------- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/CHANGES b/CHANGES index 2cb244c93..62be9d0d1 100644 --- a/CHANGES +++ b/CHANGES @@ -3,28 +3,30 @@ Release 1.4 (in development) Incompatible changes -------------------- + * Drop ``PorterStemmer`` package support. Use ``PyStemmer`` instead of ``PorterStemmer`` to accelerate stemming. Features added -------------- -* #2092: add todo directive support in napoleon package +* #2092: add todo directive support in napoleon package. * #1962: when adding directives, roles or nodes from an extension, warn if such an element is already present (built-in or added by another extension). * #1909: Add "doc" references to Intersphinx inventories. -* C++ type alias support (e.g., ``.. type:: T = int``) +* C++ type alias support (e.g., ``.. type:: T = int``). * C++ template support for classes, functions, type aliases, and variables (#1729, #1314). * C++, added new scope management directives ``namespace-push`` and ``namespace-pop``. * Intersphinx: Added support for fetching Intersphinx inventories with URLs - using HTTP basic auth + using HTTP basic auth. * C++, added support for template parameter in function info field lists. * C++, added support for pointers to member (function). -* #2113: Allow ``:class:`` option to code-block directive -* #2192: Imgmath (pngmath with svg support) -* #2200: Support XeTeX and LuaTeX for the LaTeX builder -* #1906: Use xcolor over color for \fcolorbox where available for LaTeX output -* #2216: Texinputs makefile improvrments +* #2113: Allow ``:class:`` option to code-block directive. +* #2192: Imgmath (pngmath with svg support). +* #2200: Support XeTeX and LuaTeX for the LaTeX builder. +* #1906: Use xcolor over color for \fcolorbox where available for LaTeX output. +* #2216: Texinputs makefile improvements. +* #2170: Support for Chinese language search index. Bugs fixed ---------- @@ -35,14 +37,14 @@ Bugs fixed * C++, add missing support for virtual base classes (thanks to Rapptz). * C++, add support for final classes. * C++, fix parsing of types prefixed with 'enum'. -* #2023: Dutch search support uses Danish stemming info +* #2023: Dutch search support uses Danish stemming info. * C++, add support for user-defined literals. * #1804: Now html output wraps overflowed long-line-text in the sidebar. Thanks to Hassen ben tanfous. -* #2183: Fix porterstemmer causes ``make json`` to fail -* #1899: Ensure list is sent to OptParse -* #2164: Fix wrong check for pdftex inside sphinx.sty (for graphicx package option) -* #2165, #2218: Remove faulty and non-need conditional from sphinx.sty +* #2183: Fix porterstemmer causes ``make json`` to fail. +* #1899: Ensure list is sent to OptParse. +* #2164: Fix wrong check for pdftex inside sphinx.sty (for graphicx package option). +* #2165, #2218: Remove faulty and non-need conditional from sphinx.sty. Documentation ------------- diff --git a/sphinx/search/zh.py b/sphinx/search/zh.py index 9aacde1d7..3caae22d4 100644 --- a/sphinx/search/zh.py +++ b/sphinx/search/zh.py @@ -15,18 +15,11 @@ import re from sphinx.search import SearchLanguage try: - # http://bitbucket.org/methane/porterstemmer/ - from porterstemmer import Stemmer as CStemmer - CSTEMMER = True - PYSTEMMER = False + from Stemmer import Stemmer as PyStemmer + PYSTEMMER = True except ImportError: - CSTEMMER = False - try: - from Stemmer import Stemmer as PyStemmer - PYSTEMMER = True - except ImportError: - from sphinx.util.stemmer import PorterStemmer - PYSTEMMER = False + from sphinx.util.stemmer import PorterStemmer + PYSTEMMER = False try: import jieba @@ -250,11 +243,7 @@ class SearchChinese(SearchLanguage): if dict_path and os.path.isfile(dict_path): jieba.set_dictionary(dict_path) - if CSTEMMER: - class Stemmer(CStemmer): - def stem(self, word): - return self(word.lower()) - elif PYSTEMMER: + if PYSTEMMER: class Stemmer(object): def __init__(self): self.stemmer = PyStemmer('porter') From 0ea518d563c4fcf2d1f9c694749f8a917e5a4198 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 2 Jan 2016 22:02:21 +0900 Subject: [PATCH 131/238] Add sphinx.ext.githubpages to publish the docs on GitHub Pages --- doc/ext/githubpages.rst | 12 +++++++++++ doc/extensions.rst | 1 + sphinx/ext/githubpages.py | 24 ++++++++++++++++++++++ sphinx/quickstart.py | 5 ++++- tests/roots/test-ext-githubpages/conf.py | 4 ++++ tests/roots/test-ext-githubpages/index.rst | 3 +++ tests/test_ext_githubpages.py | 20 ++++++++++++++++++ tests/test_quickstart.py | 1 + 8 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 doc/ext/githubpages.rst create mode 100644 sphinx/ext/githubpages.py create mode 100644 tests/roots/test-ext-githubpages/conf.py create mode 100644 tests/roots/test-ext-githubpages/index.rst create mode 100644 tests/test_ext_githubpages.py diff --git a/doc/ext/githubpages.rst b/doc/ext/githubpages.rst new file mode 100644 index 000000000..0cd76a2c9 --- /dev/null +++ b/doc/ext/githubpages.rst @@ -0,0 +1,12 @@ +.. highlight:: rest + +:mod:`sphinx.ext.githubpages` -- Publish HTML docs in GitHub Pages +================================================================== + +.. module:: sphinx.ext.githubpages + :synopsis: Publish HTML docs in GitHub Pages + +.. versionadded:: 1.4 + +This extension creates ``.nojekyll`` file on generated HTML directory to publish +the document on GitHub Pages. diff --git a/doc/extensions.rst b/doc/extensions.rst index 8347f4965..47632e593 100644 --- a/doc/extensions.rst +++ b/doc/extensions.rst @@ -32,6 +32,7 @@ These extensions are built in and can be activated by respective entries in the ext/viewcode ext/linkcode ext/napoleon + ext/githubpages Third-party extensions diff --git a/sphinx/ext/githubpages.py b/sphinx/ext/githubpages.py new file mode 100644 index 000000000..17b858a32 --- /dev/null +++ b/sphinx/ext/githubpages.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +""" + sphinx.ext.githubpages + ~~~~~~~~~~~~~~~~~~~~~~ + + To publish HTML docs at GitHub Pages, create .nojekyll file. + + :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import os +import sphinx + + +def create_nojekyll(app, env): + if app.builder.format == 'html': + path = os.path.join(app.builder.outdir, '.nojekyll') + open(path, 'wt').close() + + +def setup(app): + app.connect('env-updated', create_nojekyll) + return {'version': sphinx.__display_version__, 'parallel_read_safe': True} diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index f4514a2b2..471aa3bdf 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -60,7 +60,7 @@ DEFAULT_VALUE = { } EXTENSIONS = ('autodoc', 'doctest', 'intersphinx', 'todo', 'coverage', - 'imgmath', 'mathjax', 'ifconfig', 'viewcode') + 'imgmath', 'mathjax', 'ifconfig', 'viewcode', 'githubpages') PROMPT_PREFIX = '> ' @@ -1271,6 +1271,9 @@ imgmath has been deselected.''') if 'ext_viewcode' not in d: do_prompt(d, 'ext_viewcode', 'viewcode: include links to the source ' 'code of documented Python objects (y/n)', 'n', boolean) + if 'ext_githubpages' not in d: + do_prompt(d, 'ext_githubpages', 'githubpages: create .nojekyll file ' + 'to publish the document on GitHub pages (y/n)', 'n', boolean) if 'no_makefile' in d: d['makefile'] = False diff --git a/tests/roots/test-ext-githubpages/conf.py b/tests/roots/test-ext-githubpages/conf.py new file mode 100644 index 000000000..a05848fa6 --- /dev/null +++ b/tests/roots/test-ext-githubpages/conf.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +extensions = ['sphinx.ext.githubpages'] +master_doc = 'index' diff --git a/tests/roots/test-ext-githubpages/index.rst b/tests/roots/test-ext-githubpages/index.rst new file mode 100644 index 000000000..711847f80 --- /dev/null +++ b/tests/roots/test-ext-githubpages/index.rst @@ -0,0 +1,3 @@ +githubpages +=========== + diff --git a/tests/test_ext_githubpages.py b/tests/test_ext_githubpages.py new file mode 100644 index 000000000..00a3b77e4 --- /dev/null +++ b/tests/test_ext_githubpages.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +""" + test_ext_githubpages + ~~~~~~~~~~~~~~~~~~~~ + + Test sphinx.ext.githubpages extension. + + :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re + +from util import with_app + + +@with_app('html', testroot='ext-githubpages') +def test_githubpages(app, status, warning): + app.builder.build_all() + assert (app.outdir / '.nojekyll').exists() diff --git a/tests/test_quickstart.py b/tests/test_quickstart.py index 45ff8671d..156bf49e1 100644 --- a/tests/test_quickstart.py +++ b/tests/test_quickstart.py @@ -185,6 +185,7 @@ def test_quickstart_all_answers(tempdir): 'mathjax': 'no', 'ifconfig': 'no', 'viewcode': 'no', + 'githubpages': 'no', 'Create Makefile': 'no', 'Create Windows command file': 'no', 'Do you want to use the epub builder': 'yes', From 7c6a3b250167911963461f94fa9a56d621a6d64d Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 6 Jan 2016 22:38:11 +0900 Subject: [PATCH 132/238] Update CHANGES for PR #2214 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 62be9d0d1..319547ce1 100644 --- a/CHANGES +++ b/CHANGES @@ -27,6 +27,7 @@ Features added * #1906: Use xcolor over color for \fcolorbox where available for LaTeX output. * #2216: Texinputs makefile improvements. * #2170: Support for Chinese language search index. +* #2214: Add sphinx.ext.githubpages to publish the docs on GitHub Pages Bugs fixed ---------- From 2be21e340e2e5b2d22ec069a9c3d5549d2b78c6b Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Thu, 7 Jan 2016 14:15:34 +0900 Subject: [PATCH 133/238] Fix #1580: Paragraphs in longtable don't work in Latex output --- CHANGES | 1 + sphinx/writers/latex.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index a3b950e64..bff398d76 100644 --- a/CHANGES +++ b/CHANGES @@ -36,6 +36,7 @@ Bugs fixed * #1820: On Windows, console coloring is broken with colorama version 0.3.3. Now sphinx use colorama>=0.3.5 to avoid this problem. * #2072: Fix footnotes in chapter-titles do not appear in PDF output +* #1580: Fix paragraphs in longtable don't work in Latex output Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 784c58c21..38a2a8459 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1209,6 +1209,8 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_paragraph(self, node): self.body.append('\n') + if self.table: + self.table.has_problematic = True def depart_paragraph(self, node): self.body.append('\n') From bef3025c3c668fff60dfdf26c22c3d38a7b05ee8 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Thu, 7 Jan 2016 14:18:40 +0900 Subject: [PATCH 134/238] Fix #1900: BuildEnvironment.srcdir documentation gives false information --- doc/extdev/envapi.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/extdev/envapi.rst b/doc/extdev/envapi.rst index 84ad3e0d9..729725fc5 100644 --- a/doc/extdev/envapi.rst +++ b/doc/extdev/envapi.rst @@ -17,7 +17,11 @@ Build environment API .. attribute:: srcdir - Source directory (the directory containing ``conf.py``). + Source directory. + + .. attribute:: confdir + + Directory containing ``conf.py``. .. attribute:: doctreedir From eea055dfb262f3d50235e6e245e0c250299b6c42 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Thu, 7 Jan 2016 17:08:54 +0900 Subject: [PATCH 135/238] Fix #1366: centered image not centered in latex --- CHANGES | 1 + sphinx/writers/latex.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index bff398d76..8e77f1099 100644 --- a/CHANGES +++ b/CHANGES @@ -37,6 +37,7 @@ Bugs fixed Now sphinx use colorama>=0.3.5 to avoid this problem. * #2072: Fix footnotes in chapter-titles do not appear in PDF output * #1580: Fix paragraphs in longtable don't work in Latex output +* #1366: Fix centered image not centered in latex Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 38a2a8459..ce27dd07b 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1285,12 +1285,12 @@ class LaTeXTranslator(nodes.NodeVisitor): (1, 'top'): ('', ''), (1, 'middle'): ('\\raisebox{-0.5\\height}{', '}'), (1, 'bottom'): ('\\raisebox{-\\height}{', '}'), - (0, 'center'): ('{\\hfill', '\\hfill}'), + (0, 'center'): ('{\\hspace*{\\fill}', '\\hspace*{\\fill}}'), # These 2 don't exactly do the right thing. The image should # be floated alongside the paragraph. See # http://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG - (0, 'left'): ('{', '\\hfill}'), - (0, 'right'): ('{\\hfill', '}'), + (0, 'left'): ('{', '\\hspace*{\\fill}}'), + (0, 'right'): ('{\\hspace*{\\fill}', '}'), } try: pre.append(align_prepost[is_inline, attrs['align']][0]) From c6c9c5c26438853ae20ae40e3b29d030f8b7fd31 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 8 Jan 2016 00:37:33 +0900 Subject: [PATCH 136/238] Fix #1860: Man page using :samp: with braces - font doesn't reset --- CHANGES | 1 + sphinx/writers/manpage.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/CHANGES b/CHANGES index 8e77f1099..a5d6dc2e5 100644 --- a/CHANGES +++ b/CHANGES @@ -38,6 +38,7 @@ Bugs fixed * #2072: Fix footnotes in chapter-titles do not appear in PDF output * #1580: Fix paragraphs in longtable don't work in Latex output * #1366: Fix centered image not centered in latex +* #1860: Fix man page using ``:samp:`` with braces - font doesn't reset Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/writers/manpage.py b/sphinx/writers/manpage.py index 4343f6a33..30e77165f 100644 --- a/sphinx/writers/manpage.py +++ b/sphinx/writers/manpage.py @@ -30,12 +30,42 @@ class ManualPageWriter(Writer): self.builder.translator_class or ManualPageTranslator) def translate(self): + transform = NestedInlineTransform(self.document) + transform.apply() visitor = self.translator_class(self.builder, self.document) self.visitor = visitor self.document.walkabout(visitor) self.output = visitor.astext() +class NestedInlineTransform(object): + """ + Flatten nested inline nodes: + + Before: + <strong>foo=<emphasis>1</emphasis>&bar=<emphasis>2</emphasis></strong> + After: + <strong>foo=</strong><emphasis>var</emphasis><strong>&bar=</strong><emphasis>2</emphasis> + """ + def __init__(self, document): + self.document = document + + def apply(self): + def is_inline(node): + return isinstance(node, (nodes.literal, nodes.emphasis, nodes.strong)) + + for node in self.document.traverse(is_inline): + if any(is_inline(subnode) for subnode in node): + pos = node.parent.index(node) + for subnode in reversed(node[1:]): + node.remove(subnode) + if is_inline(subnode): + node.parent.insert(pos + 1, subnode) + else: + newnode = node.__class__('', subnode, **node.attributes) + node.parent.insert(pos + 1, newnode) + + class ManualPageTranslator(BaseTranslator): """ Custom translator. From 23eb0e24fcd3020611a8dddcc4bb31db83a9f193 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 8 Jan 2016 16:00:26 +0900 Subject: [PATCH 137/238] Add testcase for #1860 --- sphinx/search/ja.py | 5 +++++ tests/test_build_manpage.py | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 tests/test_build_manpage.py diff --git a/sphinx/search/ja.py b/sphinx/search/ja.py index 23de74d37..7c8e2ea97 100644 --- a/sphinx/search/ja.py +++ b/sphinx/search/ja.py @@ -29,6 +29,7 @@ try: except ImportError: native_module = False +from sphinx.errors import SphinxError from sphinx.search import SearchLanguage @@ -49,10 +50,14 @@ class MecabBinder(object): else: result = self.ctypes_libmecab.mecab_sparse_tostr( self.ctypes_mecab, input.encode(self.dict_encode)) + if result is None: + raise SphinxError('Failed to tokenize text:\nMecab: %s\nInput:\n%s' % + (self.ctypes_mecab, input)) if PY3: return result.split(' ') else: return result.decode(self.dict_encode).split(' ') + return result.decode(self.dict_encode).split(' ') def init_native(self, options): param = '-Owakati' diff --git a/tests/test_build_manpage.py b/tests/test_build_manpage.py new file mode 100644 index 000000000..85ae5be44 --- /dev/null +++ b/tests/test_build_manpage.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +""" + test_build_manpage + ~~~~~~~~~~~~~~~~~~ + + Test the build process with manpage builder with the test root. + + :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" +from __future__ import print_function + +from util import with_app + + +@with_app(buildername='man') +def test_all(app, status, warning): + app.builder.build_all() + assert (app.outdir / 'SphinxTests.1').exists() + + content = (app.outdir / 'SphinxTests.1').text() + assert r'\fBprint \fP\fIi\fP\fB\en\fP' in content From 24c42817ed2524415c1a0d11f374a020d7ca8828 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 8 Jan 2016 16:27:30 +0900 Subject: [PATCH 138/238] Revert search/ja.py It is not a part of 'testcase for #1860'. It's my miss commit. Sorry. --- sphinx/search/ja.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sphinx/search/ja.py b/sphinx/search/ja.py index 7c8e2ea97..23de74d37 100644 --- a/sphinx/search/ja.py +++ b/sphinx/search/ja.py @@ -29,7 +29,6 @@ try: except ImportError: native_module = False -from sphinx.errors import SphinxError from sphinx.search import SearchLanguage @@ -50,14 +49,10 @@ class MecabBinder(object): else: result = self.ctypes_libmecab.mecab_sparse_tostr( self.ctypes_mecab, input.encode(self.dict_encode)) - if result is None: - raise SphinxError('Failed to tokenize text:\nMecab: %s\nInput:\n%s' % - (self.ctypes_mecab, input)) if PY3: return result.split(' ') else: return result.decode(self.dict_encode).split(' ') - return result.decode(self.dict_encode).split(' ') def init_native(self, options): param = '-Owakati' From 62c49763f8e17c8c8835a88ecd19a0ed7ca5a162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= <aklitzing@gmail.com> Date: Wed, 16 Sep 2015 12:08:12 +0200 Subject: [PATCH 139/238] Fix broken TOC of PDFs if section includes an image If someone adds an image to a section it will be added to the sidebar TOC of a PDF, too. A PDF viewer will show the "width and height" data instead of an image. So we need to filter out images for this with the optional "short title" of latex sections. --- sphinx/writers/latex.py | 9 +++++++-- tests/roots/test-image-in-section/conf.py | 11 +++++++++++ tests/roots/test-image-in-section/index.rst | 18 ++++++++++++++++++ tests/roots/test-image-in-section/pic.png | Bin 0 -> 218 bytes tests/test_build_latex.py | 13 +++++++++++++ 5 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 tests/roots/test-image-in-section/conf.py create mode 100644 tests/roots/test-image-in-section/index.rst create mode 100644 tests/roots/test-image-in-section/pic.png diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 784c58c21..f9dc620c5 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -25,6 +25,7 @@ from sphinx import highlighting from sphinx.errors import SphinxError from sphinx.locale import admonitionlabels, _ from sphinx.util import split_into +from sphinx.util.nodes import clean_astext from sphinx.util.osutil import ustrftime from sphinx.util.texescape import tex_escape_map, tex_replace_map from sphinx.util.smartypants import educate_quotes_latex @@ -717,11 +718,15 @@ class LaTeXTranslator(nodes.NodeVisitor): self.this_is_the_title = 0 raise nodes.SkipNode elif isinstance(parent, nodes.section): + short = '' + if node.traverse(nodes.image): + short = '[%s]' % ' '.join(clean_astext(node).split()).translate(tex_escape_map) + try: - self.body.append(r'\%s{' % self.sectionnames[self.sectionlevel]) + self.body.append(r'\%s%s{' % (self.sectionnames[self.sectionlevel], short)) except IndexError: # just use "subparagraph", it's not numbered anyway - self.body.append(r'\%s{' % self.sectionnames[-1]) + self.body.append(r'\%s%s{' % (self.sectionnames[-1], short)) self.context.append('}\n') self.restrict_footnote(node) diff --git a/tests/roots/test-image-in-section/conf.py b/tests/roots/test-image-in-section/conf.py new file mode 100644 index 000000000..255345e45 --- /dev/null +++ b/tests/roots/test-image-in-section/conf.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' + +rst_epilog = ''' +.. |picture| image:: pic.png + :width: 15pt + :height: 15pt + :alt: alternative_text +''' + diff --git a/tests/roots/test-image-in-section/index.rst b/tests/roots/test-image-in-section/index.rst new file mode 100644 index 000000000..a69db0a77 --- /dev/null +++ b/tests/roots/test-image-in-section/index.rst @@ -0,0 +1,18 @@ +test-image-in-section +===================== +this is dummy content + + +|picture| Test section +---------------------- +blah blah blah + + +Another section +--------------- +another blah + + +Other [blah] |picture| section +------------------------------ +other blah diff --git a/tests/roots/test-image-in-section/pic.png b/tests/roots/test-image-in-section/pic.png new file mode 100644 index 0000000000000000000000000000000000000000..1081dc1439fb984dfa7ef627afe3c7dc476fdbce GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI|!3HFkf4uMuBv2gW?!>U}oXkrghqJ&VvY3H^ zTNs2H8D`Cq01C2~c>21s-(chw<zuM4+c^s;Bw6AbQR1ARo12<f!r)w#npl#WqEMb$ zlA+-4=^GH<$R`d|<nHO>7$R|bZ|_0D0|q>YSbqDzW^|HYIk%*-&O)*<eU%p5hFqPM zoCZSI1cj<~W;wMTU^!DV{f1fo9KD%^zhWZgXV;bV*7viUUsLj7{xJDI&`1VPS3j3^ HP6<r_1g=6L literal 0 HcmV?d00001 diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index e86a794fa..d233c12b8 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -423,6 +423,19 @@ def test_latex_show_urls_is_no(app, status, warning): '{sphinx-dev@googlegroups.com}\n' in result) +@with_app(buildername='latex', testroot='image-in-section') +def test_image_in_section(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert ('\chapter[Test section]{\includegraphics[width=15pt,height=15pt]{{pic}.png} Test section}' + in result) + assert ('\chapter[Other {[}blah{]} section]{Other {[}blah{]} \includegraphics[width=15pt,height=15pt]{{pic}.png} section}' in result) + assert ('\chapter{Another section}' in result) + + @with_app(buildername='latex', confoverrides={'latex_logo': 'notfound.jpg'}) def test_latex_logo_if_not_found(app, status, warning): try: From d0bc66da589b7a75fbf3da4a4f72f2cdce4ce14d Mon Sep 17 00:00:00 2001 From: Natsuki Maruyama <gashiforce@operamail.com> Date: Wed, 25 Mar 2015 23:20:12 +0900 Subject: [PATCH 140/238] Fix #1807: Sphinx crashes in japanese indexing in some systems. Modified to specify the C type, if directly using the libmecab. --- CHANGES | 1 + sphinx/search/ja.py | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index a5d6dc2e5..70c1e9fa8 100644 --- a/CHANGES +++ b/CHANGES @@ -39,6 +39,7 @@ Bugs fixed * #1580: Fix paragraphs in longtable don't work in Latex output * #1366: Fix centered image not centered in latex * #1860: Fix man page using ``:samp:`` with braces - font doesn't reset +* #1610 Sphinx crashes in japanese indexing in some systems. Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/search/ja.py b/sphinx/search/ja.py index 23de74d37..8536173ff 100644 --- a/sphinx/search/ja.py +++ b/sphinx/search/ja.py @@ -85,10 +85,15 @@ class MecabBinder(object): dict = options.get('dict') if dict: param += ' -d %s' % dict + + fs_enc = sys.getfilesystemencoding() or sys.getdefaultencoding() self.ctypes_libmecab = ctypes.CDLL(libpath) + self.ctypes_libmecab.mecab_new2.argtypes = (ctypes.c_char_p,) + self.ctypes_libmecab.mecab_new2.restype = ctypes.c_void_p + self.ctypes_libmecab.mecab_sparse_tostr.argtypes = (ctypes.c_void_p, ctypes.c_char_p) self.ctypes_libmecab.mecab_sparse_tostr.restype = ctypes.c_char_p - self.ctypes_mecab = self.ctypes_libmecab.mecab_new2(param) + self.ctypes_mecab = ctypes.c_void_p(self.ctypes_libmecab.mecab_new2(param.encode(fs_enc))) def __del__(self): if self.ctypes_libmecab: From fe101177c365471ef466143b30854f92d38db23b Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 8 Jan 2016 21:27:10 +0900 Subject: [PATCH 141/238] Fix indentation --- sphinx/search/ja.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/search/ja.py b/sphinx/search/ja.py index 8536173ff..5ccff34b6 100644 --- a/sphinx/search/ja.py +++ b/sphinx/search/ja.py @@ -85,7 +85,7 @@ class MecabBinder(object): dict = options.get('dict') if dict: param += ' -d %s' % dict - + fs_enc = sys.getfilesystemencoding() or sys.getdefaultencoding() self.ctypes_libmecab = ctypes.CDLL(libpath) From 85a9e820dc94d4bf44414fb2caea894fc9c95480 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 8 Jan 2016 21:36:42 +0900 Subject: [PATCH 142/238] Fix Sphinx crashes if mecab initialization failed --- CHANGES | 3 ++- sphinx/search/ja.py | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 70c1e9fa8..8979c4049 100644 --- a/CHANGES +++ b/CHANGES @@ -39,7 +39,8 @@ Bugs fixed * #1580: Fix paragraphs in longtable don't work in Latex output * #1366: Fix centered image not centered in latex * #1860: Fix man page using ``:samp:`` with braces - font doesn't reset -* #1610 Sphinx crashes in japanese indexing in some systems. +* #1610: Sphinx crashes in japanese indexing in some systems +* Fix Sphinx crashes if mecab initialization failed Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/search/ja.py b/sphinx/search/ja.py index 5ccff34b6..3acbb649a 100644 --- a/sphinx/search/ja.py +++ b/sphinx/search/ja.py @@ -29,6 +29,7 @@ try: except ImportError: native_module = False +from sphinx.errors import SphinxError from sphinx.search import SearchLanguage @@ -93,7 +94,9 @@ class MecabBinder(object): self.ctypes_libmecab.mecab_new2.restype = ctypes.c_void_p self.ctypes_libmecab.mecab_sparse_tostr.argtypes = (ctypes.c_void_p, ctypes.c_char_p) self.ctypes_libmecab.mecab_sparse_tostr.restype = ctypes.c_char_p - self.ctypes_mecab = ctypes.c_void_p(self.ctypes_libmecab.mecab_new2(param.encode(fs_enc))) + self.ctypes_mecab = self.ctypes_libmecab.mecab_new2(param.encode(fs_enc)) + if self.ctypes_mecab is None: + raise SphinxError('mecab initialization failed') def __del__(self): if self.ctypes_libmecab: From 386a74a0ee91865f8479c6275d4e38e0392d32b3 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 8 Jan 2016 21:41:52 +0900 Subject: [PATCH 143/238] Update CHANGES for PR #2160 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 8979c4049..f38349088 100644 --- a/CHANGES +++ b/CHANGES @@ -41,6 +41,7 @@ Bugs fixed * #1860: Fix man page using ``:samp:`` with braces - font doesn't reset * #1610: Sphinx crashes in japanese indexing in some systems * Fix Sphinx crashes if mecab initialization failed +* #2160: Fix broken TOC of PDFs if section includes an image Release 1.3.3 (released Dec 2, 2015) ==================================== From 8ca05af9bc199aa59209dc9552aeec3889ce042c Mon Sep 17 00:00:00 2001 From: vitaut <victor.zverovich@gmail.com> Date: Fri, 8 Jan 2016 08:08:04 -0800 Subject: [PATCH 144/238] Warn about sphinx_rtd_theme being unbundled --- sphinx/theming.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sphinx/theming.py b/sphinx/theming.py index 6be331194..1078997ce 100644 --- a/sphinx/theming.py +++ b/sphinx/theming.py @@ -102,8 +102,12 @@ class Theme(object): if name not in self.themes: self.load_extra_theme(name) if name not in self.themes: - raise ThemeError('no theme named %r found ' - '(missing theme.conf?)' % name) + if name == 'sphinx_rtd_theme': + raise ThemeError('sphinx_rtd_theme has been unbundled since version ' + '1.4.0. Please install it manually.') + else: + raise ThemeError('no theme named %r found ' + '(missing theme.conf?)' % name) self.name = name # Do not warn yet -- to be compatible with old Sphinxes, people *have* From 119790cffb2e8e191d9eb69432bcef6b1e53871b Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 9 Jan 2016 09:45:32 +0900 Subject: [PATCH 145/238] Fix #2172: Dysfunctional admonition \py@lightbox in sphinx.sty --- CHANGES | 1 + sphinx/texinputs/sphinx.sty | 19 +++++++++---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index f38349088..07b0dcaab 100644 --- a/CHANGES +++ b/CHANGES @@ -42,6 +42,7 @@ Bugs fixed * #1610: Sphinx crashes in japanese indexing in some systems * Fix Sphinx crashes if mecab initialization failed * #2160: Fix broken TOC of PDFs if section includes an image +* #2172: Fix dysfunctional admonition \py@lightbox in sphinx.sty Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty index 03525faec..a5425e542 100644 --- a/sphinx/texinputs/sphinx.sty +++ b/sphinx/texinputs/sphinx.sty @@ -269,16 +269,15 @@ \fbox{\TheSbox} } -\newcommand{\py@lightbox}{{% - \setlength\parskip{0pt}\par - \noindent\rule[0ex]{\linewidth}{0.5pt}% - \par\noindent\vspace{-0.5ex}% - }} -\newcommand{\py@endlightbox}{{% - \setlength{\parskip}{0pt}% - \par\noindent\rule[0.5ex]{\linewidth}{0.5pt}% - \par\vspace{-0.5ex}% - }} +\newcommand{\py@lightbox}{% + \par\allowbreak + \noindent\rule{\linewidth}{0.5pt}\par\nobreak + {\parskip\z@skip\noindent}% + } +\newcommand{\py@endlightbox}{% + \par\nobreak + {\parskip\z@skip\noindent\rule[.4\baselineskip]{\linewidth}{0.5pt}}\par + } % Some are quite plain: \newcommand{\py@noticestart@note}{\py@lightbox} From 2ebf9d64561a7812a6649940c09da5b07516729c Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 9 Jan 2016 09:49:11 +0900 Subject: [PATCH 146/238] Update CHANGES for #2172 --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 07b0dcaab..3b347ba5a 100644 --- a/CHANGES +++ b/CHANGES @@ -42,7 +42,7 @@ Bugs fixed * #1610: Sphinx crashes in japanese indexing in some systems * Fix Sphinx crashes if mecab initialization failed * #2160: Fix broken TOC of PDFs if section includes an image -* #2172: Fix dysfunctional admonition \py@lightbox in sphinx.sty +* #2172: Fix dysfunctional admonition \py@lightbox in sphinx.sty. Thanks to jfbu. Release 1.3.3 (released Dec 2, 2015) ==================================== From e7fa8a6c2b39b15ef08c30b9ac536cf33ab900af Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 9 Jan 2016 10:03:21 +0900 Subject: [PATCH 147/238] Fix ``p`` is always used for table spec (refs #1580) --- sphinx/writers/latex.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 49e4b5101..9d94f28a6 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1106,6 +1106,8 @@ class LaTeXTranslator(nodes.NodeVisitor): context += str(extracols + 1) context += '}{l|}{}' self.table.col += extracols + if len(node.traverse(nodes.paragraph)) >= 2: + self.table.has_problematic = True self.context.append(context) def depart_entry(self, node): @@ -1214,8 +1216,6 @@ class LaTeXTranslator(nodes.NodeVisitor): def visit_paragraph(self, node): self.body.append('\n') - if self.table: - self.table.has_problematic = True def depart_paragraph(self, node): self.body.append('\n') From ac28f9b27125d866f3fe1ff67ed051f27e7d3771 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Sat, 9 Jan 2016 15:33:43 +0900 Subject: [PATCH 148/238] Fix #2198,#2205: ``make gettext`` generate broken msgid for definition lists. It's a regression by #1855. --- CHANGES | 1 + sphinx/util/nodes.py | 6 ++-- tests/roots/test-intl/definition_terms.po | 8 +++--- tests/roots/test-intl/definition_terms.txt | 4 +-- tests/test_intl.py | 32 ++++++++++++++++++++-- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index 3b347ba5a..8c0a33dde 100644 --- a/CHANGES +++ b/CHANGES @@ -43,6 +43,7 @@ Bugs fixed * Fix Sphinx crashes if mecab initialization failed * #2160: Fix broken TOC of PDFs if section includes an image * #2172: Fix dysfunctional admonition \py@lightbox in sphinx.sty. Thanks to jfbu. +* #2198,#2205: ``make gettext`` generate broken msgid for definition lists. Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py index 2b0fff81d..d35f45265 100644 --- a/sphinx/util/nodes.py +++ b/sphinx/util/nodes.py @@ -47,8 +47,10 @@ def apply_source_workaround(node): node.line = definition_list_item.line - 1 node.rawsource = node.astext() # set 'classifier1' (or 'classifier2') if isinstance(node, nodes.term): - # overwrite: ``term : classifier1 : classifier2`` -> ``term text`` - node.rawsource = node.astext() + # strip classifier from rawsource of term + for classifier in reversed(node.parent.traverse(nodes.classifier)): + node.rawsource = re.sub( + '\s*:\s*%s' % classifier.astext(), '', node.rawsource) # workaround: recommonmark-0.2.0 doesn't set rawsource attribute if not node.rawsource: diff --git a/tests/roots/test-intl/definition_terms.po b/tests/roots/test-intl/definition_terms.po index 6de1d1c42..8a8199378 100644 --- a/tests/roots/test-intl/definition_terms.po +++ b/tests/roots/test-intl/definition_terms.po @@ -25,14 +25,14 @@ msgstr "SOME TERM" msgid "The corresponding definition" msgstr "THE CORRESPONDING DEFINITION" -msgid "Some other term" -msgstr "SOME OTHER TERM" +msgid "Some *term* `with link <http://sphinx-doc.org/>`__" +msgstr "SOME *TERM* `WITH LINK <http://sphinx-doc.org/>`__" msgid "The corresponding definition #2" msgstr "THE CORRESPONDING DEFINITION #2" -msgid "Some term with" -msgstr "SOME TERM WITH" +msgid "Some **term** with" +msgstr "SOME **TERM** WITH" msgid "classifier1" msgstr "CLASSIFIER1" diff --git a/tests/roots/test-intl/definition_terms.txt b/tests/roots/test-intl/definition_terms.txt index 66230f98f..e85953024 100644 --- a/tests/roots/test-intl/definition_terms.txt +++ b/tests/roots/test-intl/definition_terms.txt @@ -6,9 +6,9 @@ i18n with definition terms Some term The corresponding definition -Some other term +Some *term* `with link <http://sphinx-doc.org/>`__ The corresponding definition #2 -Some term with : classifier1 : classifier2 +Some **term** with : classifier1 : classifier2 The corresponding definition diff --git a/tests/test_intl.py b/tests/test_intl.py index 0086b63f2..35c18b1e6 100644 --- a/tests/test_intl.py +++ b/tests/test_intl.py @@ -16,6 +16,7 @@ import re from subprocess import Popen, PIPE from xml.etree import ElementTree +from babel.messages import pofile from nose.tools import assert_equal from six import string_types @@ -175,16 +176,16 @@ def test_text_builder(app, status, warning): u'WARNING: Literal block expected; none found.' yield assert_re_search, expected_warning_expr, warnings - # --- definition terms: regression test for #975 + # --- definition terms: regression test for #975, #2198, #2205 result = (app.outdir / 'definition_terms.txt').text(encoding='utf-8') expect = (u"\nI18N WITH DEFINITION TERMS" u"\n**************************\n" u"\nSOME TERM" u"\n THE CORRESPONDING DEFINITION\n" - u"\nSOME OTHER TERM" + u"\nSOME *TERM* WITH LINK" u"\n THE CORRESPONDING DEFINITION #2\n" - u"\nSOME TERM WITH : CLASSIFIER1 : CLASSIFIER2" + u"\nSOME **TERM** WITH : CLASSIFIER1 : CLASSIFIER2" u"\n THE CORRESPONDING DEFINITION\n" ) yield assert_equal, result, expect @@ -304,6 +305,31 @@ def test_text_builder(app, status, warning): yield assert_in, d.upper() + " BODY", result +@gen_with_intl_app('gettext', freshenv=True) +def test_gettext_builder(app, status, warning): + app.builder.build_all() + + # --- definition terms: regression test for #2198, #2205 + expect = pofile.read_po((app.srcdir / 'definition_terms.po').open()) + actual = pofile.read_po((app.outdir / 'definition_terms.pot').open()) + for expect_msg in [m for m in expect if m.id]: + yield assert_in, expect_msg.id, [m.id for m in actual if m.id] + + # --- glossary terms: regression test for #1090 + expect = pofile.read_po((app.srcdir / 'glossary_terms.po').open()) + actual = pofile.read_po((app.outdir / 'glossary_terms.pot').open()) + for expect_msg in [m for m in expect if m.id]: + yield assert_in, expect_msg.id, [m.id for m in actual if m.id] + warnings = warning.getvalue().replace(os.sep, '/') + yield assert_not_in, 'term not in glossary', warnings + + # --- glossary term inconsistencies: regression test for #1090 + expect = pofile.read_po((app.srcdir / 'glossary_terms_inconsistency.po').open()) + actual = pofile.read_po((app.outdir / 'glossary_terms_inconsistency.pot').open()) + for expect_msg in [m for m in expect if m.id]: + yield assert_in, expect_msg.id, [m.id for m in actual if m.id] + + @gen_with_intl_app('html', freshenv=True) def test_html_builder(app, status, warning): app.builder.build_all() From 39e403b8ac134fb0dc5b733d5b7ac7ebc38825e0 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Sat, 9 Jan 2016 15:35:56 +0900 Subject: [PATCH 149/238] fix testing for text builder that generate _build/text/_build/text/_build/... recursive directories because *.txt in _build/text previously generated was detected as source file. --- tests/roots/test-autosummary/conf.py | 2 ++ tests/roots/test-build-text/conf.py | 1 + tests/roots/test-circular/conf.py | 1 + tests/roots/test-contentsname/conf.py | 1 + tests/roots/test-directive-code/conf.py | 1 + tests/roots/test-directive-only/conf.py | 1 + tests/roots/test-doctest/conf.py | 1 + tests/roots/test-docutilsconf/conf.py | 1 + tests/roots/test-domain-cpp/conf.py | 1 + tests/roots/test-double-inheriting-theme/conf.py | 1 + tests/roots/test-ext-graphviz/conf.py | 1 + tests/roots/test-ext-ifconfig/conf.py | 1 + tests/roots/test-ext-viewcode/conf.py | 1 + tests/roots/test-footnotes/conf.py | 1 + tests/roots/test-image-in-section/conf.py | 1 + tests/roots/test-intl/conf.py | 1 + tests/roots/test-numbered-circular/conf.py | 1 + tests/roots/test-numfig/conf.py | 1 + tests/roots/test-setup/doc/conf.py | 1 + tests/roots/test-templating/conf.py | 1 + tests/roots/test-theming/conf.py | 1 + tests/roots/test-tocdepth/conf.py | 1 + tests/roots/test-toctree-glob/conf.py | 1 + tests/roots/test-toctree-maxdepth/conf.py | 1 + tests/roots/test-versioning/conf.py | 1 + 25 files changed, 26 insertions(+) diff --git a/tests/roots/test-autosummary/conf.py b/tests/roots/test-autosummary/conf.py index d9a447480..5cb589cda 100644 --- a/tests/roots/test-autosummary/conf.py +++ b/tests/roots/test-autosummary/conf.py @@ -7,3 +7,5 @@ extensions = ['sphinx.ext.autosummary'] # The suffix of source filenames. source_suffix = '.rst' autosummary_generate = True + +exclude_patterns = ['_build'] diff --git a/tests/roots/test-build-text/conf.py b/tests/roots/test-build-text/conf.py index 1ba342a65..23d0ae840 100644 --- a/tests/roots/test-build-text/conf.py +++ b/tests/roots/test-build-text/conf.py @@ -1,2 +1,3 @@ master_doc = 'contents' source_suffix = '.txt' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-circular/conf.py b/tests/roots/test-circular/conf.py index e69de29bb..027d21cda 100644 --- a/tests/roots/test-circular/conf.py +++ b/tests/roots/test-circular/conf.py @@ -0,0 +1 @@ +exclude_patterns = ['_build'] diff --git a/tests/roots/test-contentsname/conf.py b/tests/roots/test-contentsname/conf.py index cf05c9b5c..c46e40773 100644 --- a/tests/roots/test-contentsname/conf.py +++ b/tests/roots/test-contentsname/conf.py @@ -2,3 +2,4 @@ master_doc = 'index' html_theme = 'classic' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-directive-code/conf.py b/tests/roots/test-directive-code/conf.py index f81c30bc4..e10f5e5fb 100644 --- a/tests/roots/test-directive-code/conf.py +++ b/tests/roots/test-directive-code/conf.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- master_doc = 'index' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-directive-only/conf.py b/tests/roots/test-directive-only/conf.py index eb3a3d0d2..b9209f08b 100644 --- a/tests/roots/test-directive-only/conf.py +++ b/tests/roots/test-directive-only/conf.py @@ -1,2 +1,3 @@ project = 'test-directive-only' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-doctest/conf.py b/tests/roots/test-doctest/conf.py index 2e721fb57..fcf6a6cda 100644 --- a/tests/roots/test-doctest/conf.py +++ b/tests/roots/test-doctest/conf.py @@ -3,3 +3,4 @@ extensions = ['sphinx.ext.doctest'] project = 'test project for doctest' master_doc = 'doctest' source_suffix = '.txt' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-docutilsconf/conf.py b/tests/roots/test-docutilsconf/conf.py index 67074ec64..0a88a65fd 100644 --- a/tests/roots/test-docutilsconf/conf.py +++ b/tests/roots/test-docutilsconf/conf.py @@ -3,3 +3,4 @@ project = 'Sphinx docutils conf <Tests>' source_suffix = '.txt' keep_warnings = True +exclude_patterns = ['_build'] diff --git a/tests/roots/test-domain-cpp/conf.py b/tests/roots/test-domain-cpp/conf.py index cf05c9b5c..c46e40773 100644 --- a/tests/roots/test-domain-cpp/conf.py +++ b/tests/roots/test-domain-cpp/conf.py @@ -2,3 +2,4 @@ master_doc = 'index' html_theme = 'classic' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-double-inheriting-theme/conf.py b/tests/roots/test-double-inheriting-theme/conf.py index dfdccc49b..c2f8db3b0 100644 --- a/tests/roots/test-double-inheriting-theme/conf.py +++ b/tests/roots/test-double-inheriting-theme/conf.py @@ -5,3 +5,4 @@ import sys, os templates_path = ['_templates'] master_doc = 'index' html_theme = 'base_theme2' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-ext-graphviz/conf.py b/tests/roots/test-ext-graphviz/conf.py index cecd53668..6dce9d0c6 100644 --- a/tests/roots/test-ext-graphviz/conf.py +++ b/tests/roots/test-ext-graphviz/conf.py @@ -2,3 +2,4 @@ extensions = ['sphinx.ext.graphviz'] master_doc = 'index' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-ext-ifconfig/conf.py b/tests/roots/test-ext-ifconfig/conf.py index 327bd126d..d205fe9f5 100644 --- a/tests/roots/test-ext-ifconfig/conf.py +++ b/tests/roots/test-ext-ifconfig/conf.py @@ -2,6 +2,7 @@ extensions = ['sphinx.ext.ifconfig'] master_doc = 'index' +exclude_patterns = ['_build'] confval1 = True diff --git a/tests/roots/test-ext-viewcode/conf.py b/tests/roots/test-ext-viewcode/conf.py index a99a72bbc..c2b358fb5 100644 --- a/tests/roots/test-ext-viewcode/conf.py +++ b/tests/roots/test-ext-viewcode/conf.py @@ -6,6 +6,7 @@ import os sys.path.insert(0, os.path.abspath('.')) extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode'] master_doc = 'index' +exclude_patterns = ['_build'] if 'test_linkcode' in tags: diff --git a/tests/roots/test-footnotes/conf.py b/tests/roots/test-footnotes/conf.py index cf05c9b5c..c46e40773 100644 --- a/tests/roots/test-footnotes/conf.py +++ b/tests/roots/test-footnotes/conf.py @@ -2,3 +2,4 @@ master_doc = 'index' html_theme = 'classic' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-image-in-section/conf.py b/tests/roots/test-image-in-section/conf.py index 255345e45..7da44fdae 100644 --- a/tests/roots/test-image-in-section/conf.py +++ b/tests/roots/test-image-in-section/conf.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- master_doc = 'index' +exclude_patterns = ['_build'] rst_epilog = ''' .. |picture| image:: pic.png diff --git a/tests/roots/test-intl/conf.py b/tests/roots/test-intl/conf.py index 74446a143..aafd9ba79 100644 --- a/tests/roots/test-intl/conf.py +++ b/tests/roots/test-intl/conf.py @@ -7,3 +7,4 @@ templates_path = ['_templates'] html_additional_pages = {'index': 'index.html'} release = version = '2013.120' gettext_additional_targets = ['index'] +exclude_patterns = ['_build'] diff --git a/tests/roots/test-numbered-circular/conf.py b/tests/roots/test-numbered-circular/conf.py index e69de29bb..027d21cda 100644 --- a/tests/roots/test-numbered-circular/conf.py +++ b/tests/roots/test-numbered-circular/conf.py @@ -0,0 +1 @@ +exclude_patterns = ['_build'] diff --git a/tests/roots/test-numfig/conf.py b/tests/roots/test-numfig/conf.py index cf05c9b5c..c46e40773 100644 --- a/tests/roots/test-numfig/conf.py +++ b/tests/roots/test-numfig/conf.py @@ -2,3 +2,4 @@ master_doc = 'index' html_theme = 'classic' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-setup/doc/conf.py b/tests/roots/test-setup/doc/conf.py index a55679a4b..b1c9acf46 100644 --- a/tests/roots/test-setup/doc/conf.py +++ b/tests/roots/test-setup/doc/conf.py @@ -3,3 +3,4 @@ project = 'Sphinx smallest project' source_suffix = '.txt' keep_warnings = True +exclude_patterns = ['_build'] diff --git a/tests/roots/test-templating/conf.py b/tests/roots/test-templating/conf.py index 225da82e7..ff8207454 100644 --- a/tests/roots/test-templating/conf.py +++ b/tests/roots/test-templating/conf.py @@ -5,6 +5,7 @@ source_suffix = '.txt' keep_warnings = True templates_path = ['_templates'] release = version = '2013.120' +exclude_patterns = ['_build'] extensions = ['sphinx.ext.autosummary'] autosummary_generate = ['autosummary_templating'] diff --git a/tests/roots/test-theming/conf.py b/tests/roots/test-theming/conf.py index 2717087d1..608afcfcd 100644 --- a/tests/roots/test-theming/conf.py +++ b/tests/roots/test-theming/conf.py @@ -2,4 +2,5 @@ html_theme = 'test-theme' master_doc = 'index' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-tocdepth/conf.py b/tests/roots/test-tocdepth/conf.py index cf05c9b5c..c46e40773 100644 --- a/tests/roots/test-tocdepth/conf.py +++ b/tests/roots/test-tocdepth/conf.py @@ -2,3 +2,4 @@ master_doc = 'index' html_theme = 'classic' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-toctree-glob/conf.py b/tests/roots/test-toctree-glob/conf.py index cf05c9b5c..c46e40773 100644 --- a/tests/roots/test-toctree-glob/conf.py +++ b/tests/roots/test-toctree-glob/conf.py @@ -2,3 +2,4 @@ master_doc = 'index' html_theme = 'classic' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-toctree-maxdepth/conf.py b/tests/roots/test-toctree-maxdepth/conf.py index cf05c9b5c..c46e40773 100644 --- a/tests/roots/test-toctree-maxdepth/conf.py +++ b/tests/roots/test-toctree-maxdepth/conf.py @@ -2,3 +2,4 @@ master_doc = 'index' html_theme = 'classic' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-versioning/conf.py b/tests/roots/test-versioning/conf.py index edcf92951..fb54e7972 100644 --- a/tests/roots/test-versioning/conf.py +++ b/tests/roots/test-versioning/conf.py @@ -1,3 +1,4 @@ project = 'versioning test root' master_doc = 'index' source_suffix = '.txt' +exclude_patterns = ['_build'] From e85ea7ed83b019bb8d7433f127e81b7e062f2de4 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Sat, 9 Jan 2016 17:22:30 +0900 Subject: [PATCH 150/238] Fix #2062: Escape characters in doctests are treated incorrectly with Python 2 In my current environment with Win10+Py2.7.10, SpoofOut result string doesn't necessary to decode. This commit might cause regression in older python versions.... --- CHANGES | 1 + sphinx/ext/doctest.py | 13 ------------- tests/roots/test-doctest/doctest.txt | 11 +++++++++++ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/CHANGES b/CHANGES index 8c0a33dde..d062fb417 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,7 @@ Bugs fixed * #2160: Fix broken TOC of PDFs if section includes an image * #2172: Fix dysfunctional admonition \py@lightbox in sphinx.sty. Thanks to jfbu. * #2198,#2205: ``make gettext`` generate broken msgid for definition lists. +* #2062: Escape characters in doctests are treated incorrectly with Python 2. Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/ext/doctest.py b/sphinx/ext/doctest.py index 5877be2eb..72ee9f85d 100644 --- a/sphinx/ext/doctest.py +++ b/sphinx/ext/doctest.py @@ -45,14 +45,6 @@ else: return text -class _SpoofOutSphinx(doctest._SpoofOut): - # override: convert console encoding to unicode - if PY2: - def getvalue(self): - result = doctest._SpoofOut.getvalue(self) - return result.decode('string_escape') - - # set up the necessary directives class TestDirective(Directive): @@ -184,11 +176,6 @@ class TestCode(object): class SphinxDocTestRunner(doctest.DocTestRunner): - def __init__(self, *args, **kw): - doctest.DocTestRunner.__init__(self, *args, **kw) - # Override a fake output target for capturing doctest output. - self._fakeout = _SpoofOutSphinx() - def summarize(self, out, verbose=None): string_io = StringIO() old_stdout = sys.stdout diff --git a/tests/roots/test-doctest/doctest.txt b/tests/roots/test-doctest/doctest.txt index ac5da0d15..053601f3c 100644 --- a/tests/roots/test-doctest/doctest.txt +++ b/tests/roots/test-doctest/doctest.txt @@ -136,3 +136,14 @@ umlauts: äöü. >>> print('Japanese: 日本語') Japanese: 日本語 +keep control char in raw string +------------------------------- + +.. doctest:: + + >>> print('one\ntwo') + one + two + >>> print(r'one\ntwo') + one\ntwo + From 7894f0bd9ca6796e329797a4a4da97dec4ff72f6 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 9 Jan 2016 19:56:07 +0900 Subject: [PATCH 151/238] Fix #2225: If the option does not begin with dash, linking is not performed --- CHANGES | 1 + doc/markup/inline.rst | 5 ++--- sphinx/domains/std.py | 33 +++++++++++++++------------------ tests/root/objects.txt | 12 +++++++++++- tests/test_build_html.py | 21 ++++++++++++++++++--- 5 files changed, 47 insertions(+), 25 deletions(-) diff --git a/CHANGES b/CHANGES index d062fb417..6991f6846 100644 --- a/CHANGES +++ b/CHANGES @@ -45,6 +45,7 @@ Bugs fixed * #2172: Fix dysfunctional admonition \py@lightbox in sphinx.sty. Thanks to jfbu. * #2198,#2205: ``make gettext`` generate broken msgid for definition lists. * #2062: Escape characters in doctests are treated incorrectly with Python 2. +* #2225: Fix if the option does not begin with dash, linking is not performed Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/doc/markup/inline.rst b/doc/markup/inline.rst index 10db17d79..0e825b66a 100644 --- a/doc/markup/inline.rst +++ b/doc/markup/inline.rst @@ -242,9 +242,8 @@ objects: .. rst:role:: option - A command-line option to an executable program. The leading hyphen(s) must - be included. This generates a link to a :rst:dir:`option` directive, if it - exists. + A command-line option to an executable program. This generates a link to + a :rst:dir:`option` directive, if it exists. The following role creates a cross-reference to a term in a diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py index b0bf3031f..aa15279a0 100644 --- a/sphinx/domains/std.py +++ b/sphinx/domains/std.py @@ -210,10 +210,6 @@ class Program(Directive): class OptionXRefRole(XRefRole): def process_link(self, env, refnode, has_explicit_title, title, target): - # validate content - if not re.match(r'(.+ )?[-/+\w]', target): - env.warn_node('Malformed :option: %r, does not contain option ' - 'marker - or -- or / or +' % target, refnode) refnode['std:program'] = env.ref_context.get('std:program') return title, target @@ -664,22 +660,23 @@ class StandardDomain(Domain): return make_refnode(builder, fromdocname, docname, labelid, contnode) elif typ == 'option': + progname = node.get('std:program') target = target.strip() - # most obvious thing: we are a flag option without program - if target.startswith(('-', '/', '+')): - progname = node.get('std:program') - elif re.search(r'[-/+]', target): - try: - progname, target = re.split(r' (?=-|--|/|\+)', target, 1) - except ValueError: - return None - progname = ws_re.sub('-', progname.strip()) - else: - progname = None - docname, labelid = self.data['progoptions'].get((progname, target), - ('', '')) + docname, labelid = self.data['progoptions'].get((progname, target), ('', '')) if not docname: - return None + commands = [] + while ws_re.search(target): + subcommand, target = ws_re.split(target, 1) + commands.append(subcommand) + progname = "-".join(commands) + + docname, labelid = self.data['progoptions'].get((progname, target), + ('', '')) + if docname: + break + else: + return None + return make_refnode(builder, fromdocname, docname, labelid, contnode) else: diff --git a/tests/root/objects.txt b/tests/root/objects.txt index 02986f170..78d467472 100644 --- a/tests/root/objects.txt +++ b/tests/root/objects.txt @@ -174,7 +174,17 @@ Others .. option:: arg -Link to :option:`perl +p` and :option:`arg`. +Link to :option:`perl +p` and :option:`arg` + +.. program:: hg + +.. option:: commit + +.. program:: git commit + +.. option:: -p + +Link to :option:`hg commit` and :option:`git commit -p`. User markup diff --git a/tests/test_build_html.py b/tests/test_build_html.py index eaffad00c..7b04af8c8 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -31,9 +31,7 @@ http://www.python.org/logo.png reading included file u'.*?wrongenc.inc' seems to be wrong, try giving an \ :encoding: option\\n? %(root)s/includes.txt:4: WARNING: download file not readable: .*?nonexisting.png -(%(root)s/markup.txt:\\d+: WARNING: Malformed :option: u'&option', does \ -not contain option marker - or -- or / or \\+ -%(root)s/undecodable.txt:3: WARNING: undecodable source characters, replacing \ +(%(root)s/undecodable.txt:3: WARNING: undecodable source characters, replacing \ with "\\?": b?'here: >>>(\\\\|/)xbb<<<' )?""" @@ -234,6 +232,23 @@ HTML_XPATH = { (".//td[@class='field-body']/ul/li/strong", '^hour$'), (".//td[@class='field-body']/ul/li/em", '^DuplicateType$'), (".//td[@class='field-body']/ul/li/em", tail_check(r'.* Some parameter')), + # others + (".//a[@class='reference internal'][@href='#cmdoption-perl-arg-+p']/code/span", + 'perl'), + (".//a[@class='reference internal'][@href='#cmdoption-perl-arg-+p']/code/span", + '\+p'), + (".//a[@class='reference internal'][@href='#cmdoption-perl-arg-arg']/code/span", + 'arg'), + (".//a[@class='reference internal'][@href='#cmdoption-hg-arg-commit']/code/span", + 'hg'), + (".//a[@class='reference internal'][@href='#cmdoption-hg-arg-commit']/code/span", + 'commit'), + (".//a[@class='reference internal'][@href='#cmdoption-git-commit-p']/code/span", + 'git'), + (".//a[@class='reference internal'][@href='#cmdoption-git-commit-p']/code/span", + 'commit'), + (".//a[@class='reference internal'][@href='#cmdoption-git-commit-p']/code/span", + '-p'), ], 'contents.html': [ (".//meta[@name='hc'][@content='hcval']", ''), From 053d7806fee5e781b6854846bdf2582e9897c226 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 10 Jan 2016 01:04:38 +0900 Subject: [PATCH 152/238] Refactoring testcases to reduce ResourceWarning (refs: #1409) --- tests/test_intl.py | 17 +++++++++++------ tests/test_util_i18n.py | 3 ++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/tests/test_intl.py b/tests/test_intl.py index 35c18b1e6..691b68061 100644 --- a/tests/test_intl.py +++ b/tests/test_intl.py @@ -41,6 +41,11 @@ def gen_with_intl_app(builder, confoverrides={}, *args, **kw): return gen_with_app(builder, *args, **default_kw) +def read_po(pathname): + with pathname.open() as f: + return pofile.read_po(f) + + def setup_module(): if not root.exists(): (rootdir / 'roots' / 'test-intl').copytree(root) @@ -310,22 +315,22 @@ def test_gettext_builder(app, status, warning): app.builder.build_all() # --- definition terms: regression test for #2198, #2205 - expect = pofile.read_po((app.srcdir / 'definition_terms.po').open()) - actual = pofile.read_po((app.outdir / 'definition_terms.pot').open()) + expect = read_po(app.srcdir / 'definition_terms.po') + actual = read_po(app.outdir / 'definition_terms.pot') for expect_msg in [m for m in expect if m.id]: yield assert_in, expect_msg.id, [m.id for m in actual if m.id] # --- glossary terms: regression test for #1090 - expect = pofile.read_po((app.srcdir / 'glossary_terms.po').open()) - actual = pofile.read_po((app.outdir / 'glossary_terms.pot').open()) + expect = read_po(app.srcdir / 'glossary_terms.po') + actual = read_po(app.outdir / 'glossary_terms.pot') for expect_msg in [m for m in expect if m.id]: yield assert_in, expect_msg.id, [m.id for m in actual if m.id] warnings = warning.getvalue().replace(os.sep, '/') yield assert_not_in, 'term not in glossary', warnings # --- glossary term inconsistencies: regression test for #1090 - expect = pofile.read_po((app.srcdir / 'glossary_terms_inconsistency.po').open()) - actual = pofile.read_po((app.outdir / 'glossary_terms_inconsistency.pot').open()) + expect = read_po(app.srcdir / 'glossary_terms_inconsistency.po') + actual = read_po(app.outdir / 'glossary_terms_inconsistency.pot') for expect_msg in [m for m in expect if m.id]: yield assert_in, expect_msg.id, [m.id for m in actual if m.id] diff --git a/tests/test_util_i18n.py b/tests/test_util_i18n.py index 47ef8ecce..03ca13266 100644 --- a/tests/test_util_i18n.py +++ b/tests/test_util_i18n.py @@ -55,7 +55,8 @@ def test_catalog_write_mo(dir): cat = i18n.CatalogInfo(dir, 'test', 'utf-8') cat.write_mo('en') assert path.exists(cat.mo_path) - assert read_mo(open(cat.mo_path, 'rb')) is not None + with open(cat.mo_path, 'rb') as f: + assert read_mo(f) is not None @with_tempdir From 1e2fbd463b2b2d22f0ed866ec512968e39af80a5 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 10 Jan 2016 01:27:08 +0900 Subject: [PATCH 153/238] Refactoring ``sphinx.ext.todo``; because of deprecation of make_admonition() --- sphinx/ext/todo.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/sphinx/ext/todo.py b/sphinx/ext/todo.py index faa086fc8..ce456e27d 100644 --- a/sphinx/ext/todo.py +++ b/sphinx/ext/todo.py @@ -19,7 +19,8 @@ import sphinx from sphinx.locale import _ from sphinx.environment import NoUri from sphinx.util.nodes import set_source_info -from sphinx.util.compat import Directive, make_admonition +from docutils.parsers.rst import Directive +from docutils.parsers.rst.directives.admonitions import BaseAdmonition class todo_node(nodes.Admonition, nodes.Element): @@ -30,11 +31,12 @@ class todolist(nodes.General, nodes.Element): pass -class Todo(Directive): +class Todo(BaseAdmonition): """ A todo entry, displayed (if configured) in the form of an admonition. """ + node_class = todo_node has_content = True required_arguments = 0 optional_arguments = 0 @@ -44,18 +46,20 @@ class Todo(Directive): } def run(self): - env = self.state.document.settings.env - targetid = 'index-%s' % env.new_serialno('index') - targetnode = nodes.target('', '', ids=[targetid]) - if not self.options.get('class'): self.options['class'] = ['admonition-todo'] - ad = make_admonition(todo_node, self.name, [_('Todo')], self.options, - self.content, self.lineno, self.content_offset, - self.block_text, self.state, self.state_machine) - set_source_info(self, ad[0]) - return [targetnode] + ad + (todo,) = super(Todo, self).run() + if isinstance(todo, nodes.system_message): + return [todo] + + todo.insert(0, nodes.title(text=_('Todo'))) + set_source_info(self, todo) + + env = self.state.document.settings.env + targetid = 'index-%s' % env.new_serialno('index') + targetnode = nodes.target('', '', ids=[targetid]) + return [targetnode, todo] def process_todos(app, doctree): From c8c6dc1fe9b15ad179333c312de36955252e79a6 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 10 Jan 2016 02:20:39 +0900 Subject: [PATCH 154/238] Fix #2226: Math is not HTML-encoded when :nowrap: is given (jsmath, mathjax) --- CHANGES | 1 + sphinx/ext/jsmath.py | 2 +- sphinx/ext/mathjax.py | 2 +- tests/root/math.txt | 7 ++++++- tests/test_build_html.py | 17 ++++++++++++++++- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 6991f6846..fc3e8e002 100644 --- a/CHANGES +++ b/CHANGES @@ -46,6 +46,7 @@ Bugs fixed * #2198,#2205: ``make gettext`` generate broken msgid for definition lists. * #2062: Escape characters in doctests are treated incorrectly with Python 2. * #2225: Fix if the option does not begin with dash, linking is not performed +* #2226: Fix math is not HTML-encoded when :nowrap: is given (jsmath, mathjax) Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/ext/jsmath.py b/sphinx/ext/jsmath.py index 2cc661430..f5e4ce0d7 100644 --- a/sphinx/ext/jsmath.py +++ b/sphinx/ext/jsmath.py @@ -26,7 +26,7 @@ def html_visit_math(self, node): def html_visit_displaymath(self, node): if node['nowrap']: self.body.append(self.starttag(node, 'div', CLASS='math')) - self.body.append(node['latex']) + self.body.append(self.encode(node['latex'])) self.body.append('</div>') raise nodes.SkipNode for i, part in enumerate(node['latex'].split('\n\n')): diff --git a/sphinx/ext/mathjax.py b/sphinx/ext/mathjax.py index d512db465..61e8c05b5 100644 --- a/sphinx/ext/mathjax.py +++ b/sphinx/ext/mathjax.py @@ -30,7 +30,7 @@ def html_visit_displaymath(self, node): self.body.append(self.starttag(node, 'div', CLASS='math')) if node['nowrap']: self.body.append(self.builder.config.mathjax_display[0] + - node['latex'] + + self.encode(node['latex']) + self.builder.config.mathjax_display[1]) self.body.append('</div>') raise nodes.SkipNode diff --git a/tests/root/math.txt b/tests/root/math.txt index aeba85f24..5a209bed4 100644 --- a/tests/root/math.txt +++ b/tests/root/math.txt @@ -7,7 +7,7 @@ This is inline math: :math:`a^2 + b^2 = c^2`. .. math:: - a^2 + b^2 = c^2 + a + 1 < b .. math:: :label: foo @@ -23,4 +23,9 @@ This is inline math: :math:`a^2 + b^2 = c^2`. n \in \mathbb N +.. math:: + :nowrap: + + a + 1 < b + Referencing equation :eq:`foo`. diff --git a/tests/test_build_html.py b/tests/test_build_html.py index 7b04af8c8..9ab944451 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -16,7 +16,7 @@ from six import PY3, iteritems from six.moves import html_entities from sphinx import __display_version__ -from util import remove_unicode_literals, gen_with_app +from util import remove_unicode_literals, gen_with_app, with_app from etree13 import ElementTree as ET @@ -929,3 +929,18 @@ def test_numfig_with_secnum_depth(app, status, warning): for xpath, check, be_found in paths: yield check_xpath, etree, fname, xpath, check, be_found + + +@with_app(buildername='html') +def test_jsmath(app, status, warning): + app.builder.build_all() + content = (app.outdir / 'math.html').text() + + assert '<div class="math">\na^2 + b^2 = c^2</div>' in content + assert '<div class="math">\n\\begin{split}a + 1 < b\\end{split}</div>' in content + assert ('<span class="eqno">(1)</span><div class="math" id="equation-foo">\n' + 'e^{i\\pi} = 1</div>' in content) + assert ('<span class="eqno">(2)</span><div class="math">\n' + 'e^{ix} = \\cos x + i\\sin x</div>' in content) + assert '<div class="math">\nn \\in \\mathbb N</div>' in content + assert '<div class="math">\na + 1 < b</div>' in content From ff01b7841274c53646a108e7a831cde7d1475240 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Sun, 10 Jan 2016 11:08:25 +0900 Subject: [PATCH 155/238] Remove version specific installation procedure and link to stable/latest document page because sphinx site has been moved to ReadTheDocs so the information is obsoleted. --- doc/_templates/indexsidebar.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/doc/_templates/indexsidebar.html b/doc/_templates/indexsidebar.html index 56094809f..b6f12f031 100644 --- a/doc/_templates/indexsidebar.html +++ b/doc/_templates/indexsidebar.html @@ -14,15 +14,7 @@ <p>{%trans%}Current version: <b>{{ version }}</b>{%endtrans%}</p> <p>{%trans%}Get Sphinx from the <a href="https://pypi.python.org/pypi/Sphinx">Python Package Index</a>, or install it with:{%endtrans%}</p> -{% if version.split('b')|length > 1 %} -<pre>pip install Sphinx=={{ version }}</pre> -<p>{%trans%}<a href="http://sphinx-doc.org/">Stable version docs</a> -are also available.{%endtrans%}</p> -{% else %} <pre>pip install -U Sphinx</pre> -<p>{%trans%}Latest <a href="http://sphinx-doc.org/latest/">development version docs</a> -are also available.{%endtrans%}</p> -{% endif %} {% endif %} <h3>{%trans%}Questions? Suggestions?{%endtrans%}</h3> From 09b931745d14462a4c728fa5fc868984eff5687a Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Sun, 10 Jan 2016 11:17:45 +0900 Subject: [PATCH 156/238] Switch links for pdf version documentation to on ReadTheDocs. --- doc/_templates/index.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/_templates/index.html b/doc/_templates/index.html index ccef89a78..4c23114db 100644 --- a/doc/_templates/index.html +++ b/doc/_templates/index.html @@ -62,11 +62,11 @@ </table> <p>{%trans%} - You can also download PDF versions of the Sphinx documentation: - a <a href="http://sphinx-doc.org/sphinx.pdf">version</a> generated from + You can also download PDF/EPUB versions of the Sphinx documentation: + a <a href="http://readthedocs.org/projects/sphinx/downloads/pdf/stable/">PDF version</a> generated from the LaTeX Sphinx produces, and - a <a href="http://sphinx-doc.org/sphinx-rst2pdf.pdf">version</a> generated - by rst2pdf.{%endtrans%} + a <a href="http://readthedocs.org/projects/sphinx/downloads/epub/stable/">EPUB version</a>. + {%endtrans%} </p> <h2>{%trans%}Examples{%endtrans%}</h2> From 92ca8d92b3c7c4119f9f252676150827ac0f276f Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Sun, 10 Jan 2016 23:27:11 +0900 Subject: [PATCH 157/238] Fix #1601, #2220: 'any' role breaks extended domains behavior. Affected extensions doesn't support resolve_any_xref and resolve_xref returns problematic node instead of None. sphinxcontrib-httpdomain is one of them. --- CHANGES | 3 +++ sphinx/environment.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index fc3e8e002..de9557ddc 100644 --- a/CHANGES +++ b/CHANGES @@ -47,6 +47,9 @@ Bugs fixed * #2062: Escape characters in doctests are treated incorrectly with Python 2. * #2225: Fix if the option does not begin with dash, linking is not performed * #2226: Fix math is not HTML-encoded when :nowrap: is given (jsmath, mathjax) +* #1601, #2220: 'any' role breaks extended domains behavior. Affected extensions doesn't + support resolve_any_xref and resolve_xref returns problematic node instead of None. + sphinxcontrib-httpdomain is one of them. Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/environment.py b/sphinx/environment.py index 5d2107299..355901cc9 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -1655,7 +1655,7 @@ class BuildEnvironment: for role in domain.roles: res = domain.resolve_xref(self, refdoc, builder, role, target, node, contnode) - if res: + if res and isinstance(res[0], nodes.Element): results.append(('%s:%s' % (domain.name, role), res)) # now, see how many matches we got... if not results: From bba3f388e96bac2b106d89d51367d2974f70f49c Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Mon, 11 Jan 2016 23:01:17 +0900 Subject: [PATCH 158/238] Fix #2229: No warning is given for unknown options --- CHANGES | 1 + sphinx/domains/std.py | 2 ++ tests/test_build_html.py | 9 +++++++++ tests/test_build_latex.py | 9 +++++++++ 4 files changed, 21 insertions(+) diff --git a/CHANGES b/CHANGES index de9557ddc..b1f2a3060 100644 --- a/CHANGES +++ b/CHANGES @@ -50,6 +50,7 @@ Bugs fixed * #1601, #2220: 'any' role breaks extended domains behavior. Affected extensions doesn't support resolve_any_xref and resolve_xref returns problematic node instead of None. sphinxcontrib-httpdomain is one of them. +* #2229: Fix no warning is given for unknown options Release 1.3.3 (released Dec 2, 2015) ==================================== diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py index aa15279a0..ade081c70 100644 --- a/sphinx/domains/std.py +++ b/sphinx/domains/std.py @@ -675,6 +675,8 @@ class StandardDomain(Domain): if docname: break else: + env.warn(fromdocname, 'unknown option: %s' % (contnode.astext()), + lineno=node.line) return None return make_refnode(builder, fromdocname, docname, diff --git a/tests/test_build_html.py b/tests/test_build_html.py index 9ab944451..d463cab87 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -38,6 +38,15 @@ with "\\?": b?'here: >>>(\\\\|/)xbb<<<' HTML_WARNINGS = ENV_WARNINGS + """\ %(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*' None:\\d+: WARNING: citation not found: missing +%(root)s/markup.txt:158: WARNING: unknown option: &option +%(root)s/markup.txt:395: WARNING: unknown option: headings +%(root)s/markup.txt:395: WARNING: unknown option: objects +%(root)s/markup.txt:395: WARNING: unknown option: modules +%(root)s/markup.txt:395: WARNING: unknown option: classes +%(root)s/markup.txt:400: WARNING: unknown option: JS +%(root)s/markup.txt:401: WARNING: unknown option: C +%(root)s/markup.txt:402: WARNING: unknown option: myobj +%(root)s/markup.txt:403: WARNING: unknown option: n::Array %(root)s/markup.txt:: WARNING: invalid single index entry u'' %(root)s/markup.txt:: WARNING: invalid pair index entry u'' %(root)s/markup.txt:: WARNING: invalid pair index entry u'keyword; ' diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index d233c12b8..6049be6fb 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -24,6 +24,15 @@ from test_build_html import ENV_WARNINGS LATEX_WARNINGS = ENV_WARNINGS + """\ +%(root)s/markup.txt:: WARNING: unknown option: &option +%(root)s/markup.txt:: WARNING: unknown option: headings +%(root)s/markup.txt:: WARNING: unknown option: objects +%(root)s/markup.txt:: WARNING: unknown option: modules +%(root)s/markup.txt:: WARNING: unknown option: classes +%(root)s/markup.txt:: WARNING: unknown option: JS +%(root)s/markup.txt:: WARNING: unknown option: C +%(root)s/markup.txt:: WARNING: unknown option: myobj +%(root)s/markup.txt:: WARNING: unknown option: n::Array None:None: WARNING: citation not found: missing None:None: WARNING: no matching candidate for image URI u'foo.\\*' WARNING: invalid pair index entry u'' From b1715eb0b5018e082c675aef9f00a5c0f70734ff Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 12 Jan 2016 01:09:23 +0900 Subject: [PATCH 159/238] Fix broken test by bba3f388e96bac2b106d89d51367d2974f70f49c --- tests/test_build_texinfo.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_build_texinfo.py b/tests/test_build_texinfo.py index 618d79015..e06d362a0 100644 --- a/tests/test_build_texinfo.py +++ b/tests/test_build_texinfo.py @@ -23,6 +23,15 @@ from test_build_html import ENV_WARNINGS TEXINFO_WARNINGS = ENV_WARNINGS + """\ +%(root)s/markup.txt:: WARNING: unknown option: &option +%(root)s/markup.txt:: WARNING: unknown option: headings +%(root)s/markup.txt:: WARNING: unknown option: objects +%(root)s/markup.txt:: WARNING: unknown option: modules +%(root)s/markup.txt:: WARNING: unknown option: classes +%(root)s/markup.txt:: WARNING: unknown option: JS +%(root)s/markup.txt:: WARNING: unknown option: C +%(root)s/markup.txt:: WARNING: unknown option: myobj +%(root)s/markup.txt:: WARNING: unknown option: n::Array None:None: WARNING: citation not found: missing None:None: WARNING: no matching candidate for image URI u'foo.\\*' None:None: WARNING: no matching candidate for image URI u'svgimg.\\*' From ca896755a94ccbc7b5fc4eda924716a7b3db4bfa Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 12 Jan 2016 13:35:52 +0900 Subject: [PATCH 160/238] Fix #2229, any-role and ``-W`` option are conflicted --- sphinx/domains/std.py | 5 ++--- tests/test_build_html.py | 8 -------- tests/test_build_latex.py | 10 +--------- tests/test_build_texinfo.py | 10 +--------- 4 files changed, 4 insertions(+), 29 deletions(-) diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py index ade081c70..6e132e539 100644 --- a/sphinx/domains/std.py +++ b/sphinx/domains/std.py @@ -453,7 +453,7 @@ class StandardDomain(Domain): 'productionlist': ProductionList, } roles = { - 'option': OptionXRefRole(), + 'option': OptionXRefRole(warn_dangling=True), 'envvar': EnvVarXRefRole(), # links to tokens in grammar productions 'token': XRefRole(), @@ -491,6 +491,7 @@ class StandardDomain(Domain): 'the label must precede a section header)', 'numref': 'undefined label: %(target)s', 'keyword': 'unknown keyword: %(target)s', + 'option': 'unknown option: %(target)s', } def clear_doc(self, docname): @@ -675,8 +676,6 @@ class StandardDomain(Domain): if docname: break else: - env.warn(fromdocname, 'unknown option: %s' % (contnode.astext()), - lineno=node.line) return None return make_refnode(builder, fromdocname, docname, diff --git a/tests/test_build_html.py b/tests/test_build_html.py index d463cab87..18f0e8c29 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -39,14 +39,6 @@ HTML_WARNINGS = ENV_WARNINGS + """\ %(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*' None:\\d+: WARNING: citation not found: missing %(root)s/markup.txt:158: WARNING: unknown option: &option -%(root)s/markup.txt:395: WARNING: unknown option: headings -%(root)s/markup.txt:395: WARNING: unknown option: objects -%(root)s/markup.txt:395: WARNING: unknown option: modules -%(root)s/markup.txt:395: WARNING: unknown option: classes -%(root)s/markup.txt:400: WARNING: unknown option: JS -%(root)s/markup.txt:401: WARNING: unknown option: C -%(root)s/markup.txt:402: WARNING: unknown option: myobj -%(root)s/markup.txt:403: WARNING: unknown option: n::Array %(root)s/markup.txt:: WARNING: invalid single index entry u'' %(root)s/markup.txt:: WARNING: invalid pair index entry u'' %(root)s/markup.txt:: WARNING: invalid pair index entry u'keyword; ' diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 6049be6fb..7b6ce6d14 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -24,15 +24,7 @@ from test_build_html import ENV_WARNINGS LATEX_WARNINGS = ENV_WARNINGS + """\ -%(root)s/markup.txt:: WARNING: unknown option: &option -%(root)s/markup.txt:: WARNING: unknown option: headings -%(root)s/markup.txt:: WARNING: unknown option: objects -%(root)s/markup.txt:: WARNING: unknown option: modules -%(root)s/markup.txt:: WARNING: unknown option: classes -%(root)s/markup.txt:: WARNING: unknown option: JS -%(root)s/markup.txt:: WARNING: unknown option: C -%(root)s/markup.txt:: WARNING: unknown option: myobj -%(root)s/markup.txt:: WARNING: unknown option: n::Array +None:None: WARNING: unknown option: &option None:None: WARNING: citation not found: missing None:None: WARNING: no matching candidate for image URI u'foo.\\*' WARNING: invalid pair index entry u'' diff --git a/tests/test_build_texinfo.py b/tests/test_build_texinfo.py index e06d362a0..5137cfbac 100644 --- a/tests/test_build_texinfo.py +++ b/tests/test_build_texinfo.py @@ -23,15 +23,7 @@ from test_build_html import ENV_WARNINGS TEXINFO_WARNINGS = ENV_WARNINGS + """\ -%(root)s/markup.txt:: WARNING: unknown option: &option -%(root)s/markup.txt:: WARNING: unknown option: headings -%(root)s/markup.txt:: WARNING: unknown option: objects -%(root)s/markup.txt:: WARNING: unknown option: modules -%(root)s/markup.txt:: WARNING: unknown option: classes -%(root)s/markup.txt:: WARNING: unknown option: JS -%(root)s/markup.txt:: WARNING: unknown option: C -%(root)s/markup.txt:: WARNING: unknown option: myobj -%(root)s/markup.txt:: WARNING: unknown option: n::Array +None:None: WARNING: unknown option: &option None:None: WARNING: citation not found: missing None:None: WARNING: no matching candidate for image URI u'foo.\\*' None:None: WARNING: no matching candidate for image URI u'svgimg.\\*' From 8ea92359baecc8a54f6b86023658958b47e40656 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 12 Jan 2016 13:36:12 +0900 Subject: [PATCH 161/238] Fix warnings in CHANGES and docs --- CHANGES | 11 +++++------ doc/config.rst | 4 ++-- doc/ext/graphviz.rst | 4 ++-- doc/ext/math.rst | 4 ++-- doc/intl.rst | 2 +- doc/tutorial.rst | 5 +++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/CHANGES b/CHANGES index b1f2a3060..54ea9694c 100644 --- a/CHANGES +++ b/CHANGES @@ -943,13 +943,12 @@ Features added * Command-line interfaces: - PR#75: Added ``--follow-links`` option to sphinx-apidoc. - - #869: sphinx-build now has the option :option:`-T` for printing the full + - #869: sphinx-build now has the option ``-T`` for printing the full traceback after an unhandled exception. - - sphinx-build now supports the standard :option:`--help` and - :option:`--version` options. + - sphinx-build now supports the standard ``--help`` and ``--version`` options. - sphinx-build now provides more specific error messages when called with invalid options or arguments. - - sphinx-build now has a verbose option :option:`-v` which can be repeated for + - sphinx-build now has a verbose option ``-v`` which can be repeated for greater effect. A single occurrence provides a slightly more verbose output than normal. Two or more occurrences of this option provides more detailed output which may be useful for debugging. @@ -971,7 +970,7 @@ Features added stemming routines. Saves about 20 seconds when building the Python documentation. - PR#108: Add experimental support for parallel building with a new - :option:`-j` option. + :option:`sphinx-build -j` option. Documentation ------------- @@ -1561,7 +1560,7 @@ Features added * General: - Added a "nitpicky" mode that emits warnings for all missing - references. It is activated by the :option:`-n` command-line switch + references. It is activated by the :option:`sphinx-build -n` command-line switch or the `nitpicky` config value. - Added ``latexpdf`` target in quickstart Makefile. diff --git a/doc/config.rst b/doc/config.rst index 3fd1df658..086e0dc0d 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -234,7 +234,7 @@ General configuration If true, Sphinx will warn about *all* references where the target cannot be found. Default is ``False``. You can activate this mode temporarily using - the :option:`-n` command-line switch. + the :option:`-n <sphinx-build -n>` command-line switch. .. versionadded:: 1.0 @@ -580,7 +580,7 @@ that use Sphinx's HTMLWriter class. A dictionary of values to pass into the template engine's context for all pages. Single values can also be put in this dictionary using the - :option:`-A` command-line option of ``sphinx-build``. + :option:`-A <sphinx-build -A>` command-line option of ``sphinx-build``. .. versionadded:: 0.5 diff --git a/doc/ext/graphviz.rst b/doc/ext/graphviz.rst index ef57da4fd..db7fe7ea6 100644 --- a/doc/ext/graphviz.rst +++ b/doc/ext/graphviz.rst @@ -97,8 +97,8 @@ There are also these new config values: Since this setting is not portable from system to system, it is normally not useful to set it in ``conf.py``; rather, giving it on the - :program:`sphinx-build` command line via the :option:`-D` option should be - preferable, like this:: + :program:`sphinx-build` command line via the :option:`-D <sphinx-build -D>` + option should be preferable, like this:: sphinx-build -b html -D graphviz_dot=C:\graphviz\bin\dot.exe . _build/html diff --git a/doc/ext/math.rst b/doc/ext/math.rst index 4c1546109..a2499324c 100644 --- a/doc/ext/math.rst +++ b/doc/ext/math.rst @@ -117,8 +117,8 @@ built: Since this setting is not portable from system to system, it is normally not useful to set it in ``conf.py``; rather, giving it on the - :program:`sphinx-build` command line via the :option:`-D` option should be - preferable, like this:: + :program:`sphinx-build` command line via the :option:`-D <sphinx-build -D>` + option should be preferable, like this:: sphinx-build -b html -D pngmath_latex=C:\tex\latex.exe . _build/html diff --git a/doc/intl.rst b/doc/intl.rst index a358c436a..bd4f9e889 100644 --- a/doc/intl.rst +++ b/doc/intl.rst @@ -63,7 +63,7 @@ be translated you need to follow these instructions: msgfmt "usage.po" -o "locale/es/LC_MESSAGES/usage.mo" * Set :confval:`locale_dirs` to ``["locale/"]``. -* Set :confval:`language` to ``es`` (also possible via :option:`-D`). +* Set :confval:`language` to ``es`` (also possible via :option:`-D <sphinx-build -D>`). * Run your desired build. diff --git a/doc/tutorial.rst b/doc/tutorial.rst index 95bd61ebc..385746f72 100644 --- a/doc/tutorial.rst +++ b/doc/tutorial.rst @@ -122,8 +122,9 @@ this:: $ sphinx-build -b html sourcedir builddir where *sourcedir* is the :term:`source directory`, and *builddir* is the -directory in which you want to place the built documentation. The :option:`-b` -option selects a builder; in this example Sphinx will build HTML files. +directory in which you want to place the built documentation. +The :option:`-b <sphinx-build -b>` option selects a builder; in this example +Sphinx will build HTML files. |more| See :ref:`invocation` for all options that :program:`sphinx-build` supports. From 9dc74f50ae5078a808bd7c8544a0ac84883b0d44 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Tue, 12 Jan 2016 22:29:28 +0900 Subject: [PATCH 162/238] remove a duplicated line in CHANGES. --- CHANGES | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGES b/CHANGES index 54ea9694c..ae25291d9 100644 --- a/CHANGES +++ b/CHANGES @@ -105,7 +105,6 @@ Bugs fixed * #1923: Use babel features only if the babel latex element is nonempty. * #1942: Fix a KeyError in websupport. * #1903: Fix strange id generation for glossary terms. -* #1796, On py3, automated .mo building cause UnicodeDecodeError * ``make text`` will crush if a definition list item has more than 1 classifiers as: ``term : classifier1 : classifier2``. * #1855: make gettext generates broken po file for definition lists with classifier. From c6b9d3a494f11427ce3497b59982dc67f51a007b Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Tue, 12 Jan 2016 22:48:56 +0900 Subject: [PATCH 163/238] tiny fix --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index ae25291d9..27eac7f78 100644 --- a/CHANGES +++ b/CHANGES @@ -134,7 +134,7 @@ Bugs fixed Suzumizaki. * #1818: `sphinx.ext.todo` directive generates broken html class attribute as 'admonition-' when :confval:`language` is specified with non-ASCII linguistic area like - 'ru' or 'ja'. To fix this, now ``todo`` directive can use ```:class:`` option. + 'ru' or 'ja'. To fix this, now ``todo`` directive can use ``:class:`` option. * #2140: Fix footnotes in table has broken in LaTeX * #2127: MecabBinder for html searching feature doesn't work with Python 3. Thanks to Tomoko Uchida. From 8bd5b2256144190abea4247d3ff8cd5563a310a6 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Tue, 12 Jan 2016 23:47:25 +0900 Subject: [PATCH 164/238] accept 95 chars including CRLF. It is same as flake8 check. --- utils/check_sources.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/check_sources.py b/utils/check_sources.py index 447c3a637..0538b1116 100755 --- a/utils/check_sources.py +++ b/utils/check_sources.py @@ -57,7 +57,7 @@ if sys.version_info < (3, 0): def check_style_and_encoding(fn, lines): encoding = 'ascii' for lno, line in enumerate(lines): - if len(line) > 95: + if len(line.rstrip('\n')) > 95: yield lno+1, "line too long" if lno < 2: co = coding_re.search(line) From d33b32323f99662f904598d4d454dac3b6c947fc Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Tue, 12 Jan 2016 23:53:45 +0900 Subject: [PATCH 165/238] 95 chars in line. It was warned by `make check`. --- sphinx/writers/manpage.py | 6 ++++-- tests/test_build_latex.py | 9 ++++++--- tests/test_util.py | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/sphinx/writers/manpage.py b/sphinx/writers/manpage.py index 30e77165f..482b60596 100644 --- a/sphinx/writers/manpage.py +++ b/sphinx/writers/manpage.py @@ -43,9 +43,11 @@ class NestedInlineTransform(object): Flatten nested inline nodes: Before: - <strong>foo=<emphasis>1</emphasis>&bar=<emphasis>2</emphasis></strong> + <strong>foo=<emphasis>1</emphasis> + &bar=<emphasis>2</emphasis></strong> After: - <strong>foo=</strong><emphasis>var</emphasis><strong>&bar=</strong><emphasis>2</emphasis> + <strong>foo=</strong><emphasis>var</emphasis> + <strong>&bar=</strong><emphasis>2</emphasis> """ def __init__(self, document): self.document = document diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 7b6ce6d14..ac843c897 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -391,7 +391,8 @@ def test_latex_show_urls_is_footnote(app, status, warning): '\\leavevmode\\footnotetext[7]{\nhttp://sphinx-doc.org/\n}\nDescription' in result) assert ('\\item[{Footnote in term \\protect\\footnotemark[9]}] ' '\\leavevmode\\footnotetext[9]{\nFootnote in term\n}\nDescription' in result) - assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist}\\protect\\footnotemark[8]}] ' + assert ('\\item[{\\href{http://sphinx-doc.org/}{Term in deflist}\\protect' + '\\footnotemark[8]}] ' '\\leavevmode\\footnotetext[8]{\nhttp://sphinx-doc.org/\n}\nDescription' in result) assert ('\\href{https://github.com/sphinx-doc/sphinx}' '{https://github.com/sphinx-doc/sphinx}\n' in result) @@ -431,9 +432,11 @@ def test_image_in_section(app, status, warning): print(result) print(status.getvalue()) print(warning.getvalue()) - assert ('\chapter[Test section]{\includegraphics[width=15pt,height=15pt]{{pic}.png} Test section}' + assert ('\chapter[Test section]' + '{\includegraphics[width=15pt,height=15pt]{{pic}.png} Test section}' in result) - assert ('\chapter[Other {[}blah{]} section]{Other {[}blah{]} \includegraphics[width=15pt,height=15pt]{{pic}.png} section}' in result) + assert ('\chapter[Other {[}blah{]} section]{Other {[}blah{]} ' + '\includegraphics[width=15pt,height=15pt]{{pic}.png} section}' in result) assert ('\chapter{Another section}' in result) diff --git a/tests/test_util.py b/tests/test_util.py index 3d30b6fe0..b0bca861f 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -15,7 +15,8 @@ def test_encode_uri(): expected = (u'https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_' u'%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_' u'%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85') - uri = u'https://ru.wikipedia.org/wiki/Система_управления_базами_данных' + uri = (u'https://ru.wikipedia.org/wiki' + u'/Система_управления_базами_данных') assert expected, encode_uri(uri) expected = (u'https://github.com/search?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+is%3A' From 8e7107b1a2d0fa55a5b81bb95073e8ab4dfa971b Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Tue, 12 Jan 2016 23:57:44 +0900 Subject: [PATCH 166/238] Bump to 1.3.4 final --- CHANGES | 4 ++-- sphinx/__init__.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 27eac7f78..7ba27dc2e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,5 @@ -Release 1.3.4 (in development) -============================== +Release 1.3.4 (released Jan 12, 2016) +===================================== Bugs fixed ---------- diff --git a/sphinx/__init__.py b/sphinx/__init__.py index 0e6881df5..d159c2729 100644 --- a/sphinx/__init__.py +++ b/sphinx/__init__.py @@ -15,13 +15,13 @@ import sys from os import path -__version__ = '1.3.3+' -__released__ = '1.3.3+' # used when Sphinx builds its own docs +__version__ = '1.3.4' +__released__ = '1.3.4' # used when Sphinx builds its own docs # version info for better programmatic use # possible values for 3rd element: 'alpha', 'beta', 'rc', 'final' # 'final' has 0 as the last element -version_info = (1, 3, 4, 'beta', 1) +version_info = (1, 3, 4, 'final', 0) package_dir = path.abspath(path.dirname(__file__)) From 9b45d10abd0e7dca72c564b54bb02ab880e96d18 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Wed, 13 Jan 2016 00:10:58 +0900 Subject: [PATCH 167/238] bump version --- CHANGES | 7 +++++++ sphinx/__init__.py | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 7ba27dc2e..ea325dc56 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,10 @@ +Release 1.3.5 (in development) +============================== + +Bugs fixed +---------- + + Release 1.3.4 (released Jan 12, 2016) ===================================== diff --git a/sphinx/__init__.py b/sphinx/__init__.py index d159c2729..0ad54f524 100644 --- a/sphinx/__init__.py +++ b/sphinx/__init__.py @@ -15,13 +15,13 @@ import sys from os import path -__version__ = '1.3.4' -__released__ = '1.3.4' # used when Sphinx builds its own docs +__version__ = '1.3.4+' +__released__ = '1.3.4+' # used when Sphinx builds its own docs # version info for better programmatic use # possible values for 3rd element: 'alpha', 'beta', 'rc', 'final' # 'final' has 0 as the last element -version_info = (1, 3, 4, 'final', 0) +version_info = (1, 3, 5, 'beta', 1) package_dir = path.abspath(path.dirname(__file__)) From 6dc7ca0234638436f3decfb85990613e69f7809f Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 12 Jan 2016 10:50:02 +0900 Subject: [PATCH 168/238] Fix line numbers were not shown on warnings in LaTeX and texinfo builder --- CHANGES | 1 + sphinx/util/nodes.py | 8 ++++++-- tests/test_build_latex.py | 6 +++--- tests/test_build_texinfo.py | 8 ++++---- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/CHANGES b/CHANGES index ea325dc56..051423a52 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ Release 1.3.5 (in development) Bugs fixed ---------- +* Fix line numbers was not shown on warnings in LaTeX and texinfo builders Release 1.3.4 (released Jan 12, 2016) ===================================== diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py index d35f45265..aa4a9462b 100644 --- a/sphinx/util/nodes.py +++ b/sphinx/util/nodes.py @@ -292,9 +292,13 @@ def set_role_source_info(inliner, lineno, node): node.source, node.line = inliner.reporter.get_source_and_line(lineno) -# monkey-patch Element.copy to copy the rawsource +# monkey-patch Element.copy to copy the rawsource and line def _new_copy(self): - return self.__class__(self.rawsource, **self.attributes) + newnode = self.__class__(self.rawsource, **self.attributes) + if isinstance(self, nodes.Element): + newnode.source = self.source + newnode.line = self.line + return newnode nodes.Element.copy = _new_copy diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index ac843c897..c8026ba54 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -24,9 +24,9 @@ from test_build_html import ENV_WARNINGS LATEX_WARNINGS = ENV_WARNINGS + """\ -None:None: WARNING: unknown option: &option -None:None: WARNING: citation not found: missing -None:None: WARNING: no matching candidate for image URI u'foo.\\*' +%(root)s/markup.txt:158: WARNING: unknown option: &option +None:60: WARNING: citation not found: missing +%(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*' WARNING: invalid pair index entry u'' WARNING: invalid pair index entry u'keyword; ' """ diff --git a/tests/test_build_texinfo.py b/tests/test_build_texinfo.py index 5137cfbac..51b0b57dd 100644 --- a/tests/test_build_texinfo.py +++ b/tests/test_build_texinfo.py @@ -23,10 +23,10 @@ from test_build_html import ENV_WARNINGS TEXINFO_WARNINGS = ENV_WARNINGS + """\ -None:None: WARNING: unknown option: &option -None:None: WARNING: citation not found: missing -None:None: WARNING: no matching candidate for image URI u'foo.\\*' -None:None: WARNING: no matching candidate for image URI u'svgimg.\\*' +%(root)s/markup.txt:158: WARNING: unknown option: &option +None:60: WARNING: citation not found: missing +%(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*' +%(root)s/images.txt:29: WARNING: no matching candidate for image URI u'svgimg.\\*' """ if PY3: From 4c8b575dcc1f81b80b89c1656332cfa877642f10 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 12 Jan 2016 12:03:13 +0900 Subject: [PATCH 169/238] Fix filenames were not shown on warnings of citations --- CHANGES | 1 + sphinx/transforms.py | 1 + tests/test_build_html.py | 2 +- tests/test_build_latex.py | 2 +- tests/test_build_texinfo.py | 2 +- 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 051423a52..ebeb32476 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,7 @@ Bugs fixed ---------- * Fix line numbers was not shown on warnings in LaTeX and texinfo builders +* Fix filenames were not shown on warnings of citations Release 1.3.4 (released Jan 12, 2016) ===================================== diff --git a/sphinx/transforms.py b/sphinx/transforms.py index d4ad4316e..9cecbd5e5 100644 --- a/sphinx/transforms.py +++ b/sphinx/transforms.py @@ -156,6 +156,7 @@ class CitationReferences(Transform): refnode = addnodes.pending_xref(cittext, reftype='citation', reftarget=cittext, refwarn=True, ids=citnode["ids"]) + refnode.source = citnode.source or citnode.parent.source refnode.line = citnode.line or citnode.parent.line refnode += nodes.Text('[' + cittext + ']') citnode.parent.replace(citnode, refnode) diff --git a/tests/test_build_html.py b/tests/test_build_html.py index 18f0e8c29..538d8581d 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -37,7 +37,7 @@ with "\\?": b?'here: >>>(\\\\|/)xbb<<<' HTML_WARNINGS = ENV_WARNINGS + """\ %(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*' -None:\\d+: WARNING: citation not found: missing +%(root)s/footnote.txt:60: WARNING: citation not found: missing %(root)s/markup.txt:158: WARNING: unknown option: &option %(root)s/markup.txt:: WARNING: invalid single index entry u'' %(root)s/markup.txt:: WARNING: invalid pair index entry u'' diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index c8026ba54..509a19d4e 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -25,7 +25,7 @@ from test_build_html import ENV_WARNINGS LATEX_WARNINGS = ENV_WARNINGS + """\ %(root)s/markup.txt:158: WARNING: unknown option: &option -None:60: WARNING: citation not found: missing +%(root)s/footnote.txt:60: WARNING: citation not found: missing %(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*' WARNING: invalid pair index entry u'' WARNING: invalid pair index entry u'keyword; ' diff --git a/tests/test_build_texinfo.py b/tests/test_build_texinfo.py index 51b0b57dd..9b264a3fb 100644 --- a/tests/test_build_texinfo.py +++ b/tests/test_build_texinfo.py @@ -24,7 +24,7 @@ from test_build_html import ENV_WARNINGS TEXINFO_WARNINGS = ENV_WARNINGS + """\ %(root)s/markup.txt:158: WARNING: unknown option: &option -None:60: WARNING: citation not found: missing +%(root)s/footnote.txt:60: WARNING: citation not found: missing %(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*' %(root)s/images.txt:29: WARNING: no matching candidate for image URI u'svgimg.\\*' """ From 7898c64cf409cabab97934691aa0024a14a2621f Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 12 Jan 2016 17:27:05 +0900 Subject: [PATCH 170/238] Fix line numbers were not show on warnings of numfigs --- CHANGES | 1 + sphinx/domains/std.py | 6 ++++-- tests/test_build_html.py | 30 ++++++++++++++++++++---------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/CHANGES b/CHANGES index ebeb32476..613321268 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Bugs fixed * Fix line numbers was not shown on warnings in LaTeX and texinfo builders * Fix filenames were not shown on warnings of citations +* Fix line numbers was not shown on warnings in LaTeX and texinfo builders Release 1.3.4 (released Jan 12, 2016) ===================================== diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py index 6e132e539..1ba67c380 100644 --- a/sphinx/domains/std.py +++ b/sphinx/domains/std.py @@ -628,7 +628,8 @@ class StandardDomain(Domain): return None if env.config.numfig is False: - env.warn(fromdocname, 'numfig is disabled. :numref: is ignored.') + env.warn(fromdocname, 'numfig is disabled. :numref: is ignored.', + lineno=node.line) return contnode try: @@ -646,7 +647,8 @@ class StandardDomain(Domain): try: newtitle = title % '.'.join(map(str, fignumber)) except TypeError: - env.warn(fromdocname, 'invalid numfig_format: %s' % title) + env.warn(fromdocname, 'invalid numfig_format: %s' % title, + lineno=node.line) return None return self.build_reference_node(fromdocname, builder, diff --git a/tests/test_build_html.py b/tests/test_build_html.py index 538d8581d..ef84bbcb4 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -495,8 +495,10 @@ def test_tocdepth_singlehtml(app, status, warning): def test_numfig_disabled(app, status, warning): app.builder.build_all() - assert 'WARNING: invalid numfig_format: invalid' not in warning.getvalue() - assert 'WARNING: invalid numfig_format: Fig %s %s' not in warning.getvalue() + assert ('index.rst:45: WARNING: numfig is disabled. :numref: is ignored.' + in warning.getvalue()) + assert 'index.rst:51: WARNING: invalid numfig_format: invalid' not in warning.getvalue() + assert 'index.rst:52: WARNING: invalid numfig_format: Fig %s %s' not in warning.getvalue() expects = { 'index.html': [ @@ -554,8 +556,10 @@ def test_numfig_without_numbered_toctree(app, status, warning): (app.srcdir / 'index.rst').write_text(index, encoding='utf-8') app.builder.build_all() - assert 'WARNING: invalid numfig_format: invalid' in warning.getvalue() - assert 'WARNING: invalid numfig_format: Fig %s %s' in warning.getvalue() + assert ('index.rst:45: WARNING: numfig is disabled. :numref: is ignored.' + not in warning.getvalue()) + assert 'index.rst:51: WARNING: invalid numfig_format: invalid' in warning.getvalue() + assert 'index.rst:52: WARNING: invalid numfig_format: Fig %s %s' in warning.getvalue() expects = { 'index.html': [ @@ -649,8 +653,10 @@ def test_numfig_without_numbered_toctree(app, status, warning): def test_numfig_with_numbered_toctree(app, status, warning): app.builder.build_all() - assert 'WARNING: invalid numfig_format: invalid' in warning.getvalue() - assert 'WARNING: invalid numfig_format: Fig %s %s' in warning.getvalue() + assert ('index.rst:45: WARNING: numfig is disabled. :numref: is ignored.' + not in warning.getvalue()) + assert 'index.rst:51: WARNING: invalid numfig_format: invalid' in warning.getvalue() + assert 'index.rst:52: WARNING: invalid numfig_format: Fig %s %s' in warning.getvalue() expects = { 'index.html': [ @@ -747,8 +753,10 @@ def test_numfig_with_numbered_toctree(app, status, warning): def test_numfig_with_prefix(app, status, warning): app.builder.build_all() - assert 'WARNING: invalid numfig_format: invalid' in warning.getvalue() - assert 'WARNING: invalid numfig_format: Fig %s %s' in warning.getvalue() + assert ('index.rst:45: WARNING: numfig is disabled. :numref: is ignored.' + not in warning.getvalue()) + assert 'index.rst:51: WARNING: invalid numfig_format: invalid' in warning.getvalue() + assert 'index.rst:52: WARNING: invalid numfig_format: Fig %s %s' in warning.getvalue() expects = { 'index.html': [ @@ -842,8 +850,10 @@ def test_numfig_with_prefix(app, status, warning): def test_numfig_with_secnum_depth(app, status, warning): app.builder.build_all() - assert 'WARNING: invalid numfig_format: invalid' in warning.getvalue() - assert 'WARNING: invalid numfig_format: Fig %s %s' in warning.getvalue() + assert ('index.rst:45: WARNING: numfig is disabled. :numref: is ignored.' + not in warning.getvalue()) + assert 'index.rst:51: WARNING: invalid numfig_format: invalid' in warning.getvalue() + assert 'index.rst:52: WARNING: invalid numfig_format: Fig %s %s' in warning.getvalue() expects = { 'index.html': [ From 3f998a0096021d1e99e99fc01a9222d075ae6b3f Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 13 Jan 2016 11:37:07 +0900 Subject: [PATCH 171/238] Fix line numbers was not shown on warnings of indecies --- CHANGES | 1 + sphinx/environment.py | 11 +++++++++-- sphinx/util/__init__.py | 32 +++++++++++++++----------------- tests/test_build_html.py | 6 ++---- tests/test_build_latex.py | 6 ++---- tests/test_build_texinfo.py | 2 +- 6 files changed, 30 insertions(+), 28 deletions(-) diff --git a/CHANGES b/CHANGES index 613321268..794caa1ac 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ Bugs fixed * Fix line numbers was not shown on warnings in LaTeX and texinfo builders * Fix filenames were not shown on warnings of citations * Fix line numbers was not shown on warnings in LaTeX and texinfo builders +* Fix line numbers was not shown on warnings of indecies Release 1.3.4 (released Jan 12, 2016) ===================================== diff --git a/sphinx/environment.py b/sphinx/environment.py index 355901cc9..c65e6279d 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -38,7 +38,7 @@ from docutils.frontend import OptionParser from sphinx import addnodes from sphinx.util import url_re, get_matching_docs, docname_join, split_into, \ - FilenameUniqDict, get_figtype, import_object + FilenameUniqDict, get_figtype, import_object, split_index_msg from sphinx.util.nodes import clean_astext, make_refnode, WarningStream, is_translatable from sphinx.util.osutil import SEP, getcwd, fs_encoding from sphinx.util.i18n import find_catalog_files @@ -1123,7 +1123,14 @@ class BuildEnvironment: def note_indexentries_from(self, docname, document): entries = self.indexentries[docname] = [] for node in document.traverse(addnodes.index): - entries.extend(node['entries']) + try: + for type, value, tid, main in node['entries']: + split_index_msg(type, value) + except ValueError as exc: + self.warn_node(exc, node) + node.parent.remove(node) + else: + entries.extend(node['entries']) def note_citations_from(self, docname, document): for node in document.traverse(nodes.citation): diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index bd7f564f7..177098d1c 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -421,23 +421,21 @@ def split_into(n, type, value): def split_index_msg(type, value): # new entry types must be listed in directives/other.py! - result = [] - try: - if type == 'single': - try: - result = split_into(2, 'single', value) - except ValueError: - result = split_into(1, 'single', value) - elif type == 'pair': - result = split_into(2, 'pair', value) - elif type == 'triple': - result = split_into(3, 'triple', value) - elif type == 'see': - result = split_into(2, 'see', value) - elif type == 'seealso': - result = split_into(2, 'see', value) - except ValueError: - pass + if type == 'single': + try: + result = split_into(2, 'single', value) + except ValueError: + result = split_into(1, 'single', value) + elif type == 'pair': + result = split_into(2, 'pair', value) + elif type == 'triple': + result = split_into(3, 'triple', value) + elif type == 'see': + result = split_into(2, 'see', value) + elif type == 'seealso': + result = split_into(2, 'see', value) + else: + raise ValueError('invalid %s index entry %r' % (type, value)) return result diff --git a/tests/test_build_html.py b/tests/test_build_html.py index ef84bbcb4..34b987852 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -31,6 +31,7 @@ http://www.python.org/logo.png reading included file u'.*?wrongenc.inc' seems to be wrong, try giving an \ :encoding: option\\n? %(root)s/includes.txt:4: WARNING: download file not readable: .*?nonexisting.png +(%(root)s/markup.txt:351: WARNING: invalid single index entry u'')? (%(root)s/undecodable.txt:3: WARNING: undecodable source characters, replacing \ with "\\?": b?'here: >>>(\\\\|/)xbb<<<' )?""" @@ -39,9 +40,6 @@ HTML_WARNINGS = ENV_WARNINGS + """\ %(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*' %(root)s/footnote.txt:60: WARNING: citation not found: missing %(root)s/markup.txt:158: WARNING: unknown option: &option -%(root)s/markup.txt:: WARNING: invalid single index entry u'' -%(root)s/markup.txt:: WARNING: invalid pair index entry u'' -%(root)s/markup.txt:: WARNING: invalid pair index entry u'keyword; ' """ if PY3: @@ -376,7 +374,7 @@ def check_extra_entries(outdir): assert (outdir / 'robots.txt').isfile() -@gen_with_app(buildername='html', +@gen_with_app(buildername='html', freshenv=True, # use freshenv to check warnings confoverrides={'html_context.hckey_co': 'hcval_co'}, tags=['testtag']) def test_html_output(app, status, warning): diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 509a19d4e..18e1063fb 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -27,15 +27,13 @@ LATEX_WARNINGS = ENV_WARNINGS + """\ %(root)s/markup.txt:158: WARNING: unknown option: &option %(root)s/footnote.txt:60: WARNING: citation not found: missing %(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*' -WARNING: invalid pair index entry u'' -WARNING: invalid pair index entry u'keyword; ' """ if PY3: LATEX_WARNINGS = remove_unicode_literals(LATEX_WARNINGS) -@with_app(buildername='latex') +@with_app(buildername='latex', freshenv=True) # use freshenv to check warnings def test_latex(app, status, warning): LaTeXTranslator.ignore_missing_images = True app.builder.build_all() @@ -94,7 +92,7 @@ def test_latex(app, status, warning): os.chdir(cwd) -@with_app(buildername='latex', +@with_app(buildername='latex', freshenv=True, # use freshenv to check warnings confoverrides={'latex_documents': [ ('contents', 'SphinxTests.tex', 'Sphinx Tests Documentation', 'Georg Brandl \\and someone else', 'howto'), diff --git a/tests/test_build_texinfo.py b/tests/test_build_texinfo.py index 9b264a3fb..65b873238 100644 --- a/tests/test_build_texinfo.py +++ b/tests/test_build_texinfo.py @@ -33,7 +33,7 @@ if PY3: TEXINFO_WARNINGS = remove_unicode_literals(TEXINFO_WARNINGS) -@with_app('texinfo') +@with_app('texinfo', freshenv=True) # use freshenv to check warnings def test_texinfo(app, status, warning): TexinfoTranslator.ignore_missing_images = True app.builder.build_all() From 53cd2d4f3f386a8dfea28b314112b1a9a882b7c9 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Thu, 14 Jan 2016 10:58:57 +0900 Subject: [PATCH 172/238] Fix #2026: LaTeX builder rais error if parsed-literal includes links --- CHANGES | 1 + sphinx/writers/latex.py | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 794caa1ac..b6e8a953f 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,7 @@ Bugs fixed * Fix filenames were not shown on warnings of citations * Fix line numbers was not shown on warnings in LaTeX and texinfo builders * Fix line numbers was not shown on warnings of indecies +* #2026: Fix LaTeX builder rais error if parsed-literal includes links Release 1.3.4 (released Jan 12, 2016) ===================================== diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 9d94f28a6..35ceffee4 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -459,7 +459,7 @@ class LaTeXTranslator(nodes.NodeVisitor): '\\label{%s}' % self.idescape(id) def hyperlink(self, id): - return '{\\hyperref[%s]{' % self.idescape(id) + return '{\\hyperref[%s]{' % self.hyperrefescape(id) def hyperpageref(self, id): return '\\autopageref*{%s}' % self.idescape(id) @@ -469,6 +469,9 @@ class LaTeXTranslator(nodes.NodeVisitor): encode('ascii', 'backslashreplace').decode('ascii').\ replace('\\', '_') + def hyperrefescape(self, ref): + return self.idescape(ref).replace('-', '\\string-') + def babel_renewcommand(self, builder, command, definition): if builder.config.language == 'ja': babel_prefix = '' From 46d7e8558e49f9b314ff77dbbe3ca6d2691c5895 Mon Sep 17 00:00:00 2001 From: Georg Brandl <georg@python.org> Date: Thu, 14 Jan 2016 22:54:04 +0100 Subject: [PATCH 173/238] Obligatory copyright update. --- LICENSE | 2 +- doc/_themes/sphinx13/layout.html | 2 +- doc/_themes/sphinx13/static/sphinx13.css | 2 +- doc/conf.py | 2 +- sphinx-apidoc.py | 2 +- sphinx-autogen.py | 2 +- sphinx-build.py | 2 +- sphinx-quickstart.py | 2 +- sphinx/__init__.py | 2 +- sphinx/__main__.py | 2 +- sphinx/addnodes.py | 2 +- sphinx/apidoc.py | 2 +- sphinx/application.py | 2 +- sphinx/builders/__init__.py | 2 +- sphinx/builders/applehelp.py | 2 +- sphinx/builders/changes.py | 2 +- sphinx/builders/devhelp.py | 2 +- sphinx/builders/epub.py | 2 +- sphinx/builders/gettext.py | 2 +- sphinx/builders/html.py | 2 +- sphinx/builders/htmlhelp.py | 2 +- sphinx/builders/latex.py | 2 +- sphinx/builders/linkcheck.py | 2 +- sphinx/builders/manpage.py | 2 +- sphinx/builders/qthelp.py | 2 +- sphinx/builders/texinfo.py | 2 +- sphinx/builders/text.py | 2 +- sphinx/builders/websupport.py | 2 +- sphinx/builders/xml.py | 2 +- sphinx/cmdline.py | 2 +- sphinx/config.py | 2 +- sphinx/directives/__init__.py | 2 +- sphinx/directives/code.py | 2 +- sphinx/directives/other.py | 2 +- sphinx/domains/__init__.py | 2 +- sphinx/domains/c.py | 2 +- sphinx/domains/cpp.py | 2 +- sphinx/domains/javascript.py | 2 +- sphinx/domains/python.py | 2 +- sphinx/domains/rst.py | 2 +- sphinx/domains/std.py | 2 +- sphinx/environment.py | 2 +- sphinx/errors.py | 2 +- sphinx/ext/__init__.py | 2 +- sphinx/ext/autodoc.py | 2 +- sphinx/ext/autosummary/__init__.py | 2 +- sphinx/ext/autosummary/generate.py | 2 +- sphinx/ext/coverage.py | 2 +- sphinx/ext/doctest.py | 2 +- sphinx/ext/extlinks.py | 2 +- sphinx/ext/graphviz.py | 2 +- sphinx/ext/ifconfig.py | 2 +- sphinx/ext/inheritance_diagram.py | 2 +- sphinx/ext/intersphinx.py | 2 +- sphinx/ext/jsmath.py | 2 +- sphinx/ext/linkcode.py | 2 +- sphinx/ext/mathbase.py | 2 +- sphinx/ext/mathjax.py | 2 +- sphinx/ext/napoleon/__init__.py | 2 +- sphinx/ext/napoleon/docstring.py | 2 +- sphinx/ext/napoleon/iterators.py | 2 +- sphinx/ext/pngmath.py | 2 +- sphinx/ext/todo.py | 2 +- sphinx/ext/viewcode.py | 2 +- sphinx/highlighting.py | 2 +- sphinx/jinja2glue.py | 2 +- sphinx/locale/__init__.py | 2 +- sphinx/make_mode.py | 2 +- sphinx/pycode/__init__.py | 2 +- sphinx/pycode/nodes.py | 2 +- sphinx/pygments_styles.py | 2 +- sphinx/quickstart.py | 2 +- sphinx/roles.py | 2 +- sphinx/search/__init__.py | 2 +- sphinx/search/en.py | 2 +- sphinx/search/ja.py | 2 +- sphinx/setup_command.py | 2 +- sphinx/themes/agogo/layout.html | 2 +- sphinx/themes/agogo/static/agogo.css_t | 2 +- sphinx/themes/basic/defindex.html | 2 +- sphinx/themes/basic/domainindex.html | 2 +- sphinx/themes/basic/genindex-single.html | 2 +- sphinx/themes/basic/genindex-split.html | 2 +- sphinx/themes/basic/genindex.html | 2 +- sphinx/themes/basic/globaltoc.html | 2 +- sphinx/themes/basic/layout.html | 2 +- sphinx/themes/basic/localtoc.html | 2 +- sphinx/themes/basic/page.html | 2 +- sphinx/themes/basic/relations.html | 2 +- sphinx/themes/basic/search.html | 2 +- sphinx/themes/basic/searchbox.html | 2 +- sphinx/themes/basic/searchresults.html | 2 +- sphinx/themes/basic/sourcelink.html | 2 +- sphinx/themes/basic/static/basic.css_t | 2 +- sphinx/themes/basic/static/doctools.js | 2 +- sphinx/themes/basic/static/searchtools.js_t | 2 +- sphinx/themes/basic/static/websupport.js | 2 +- sphinx/themes/classic/layout.html | 2 +- sphinx/themes/classic/static/classic.css_t | 2 +- sphinx/themes/classic/static/sidebar.js_t | 2 +- sphinx/themes/epub/epub-cover.html | 2 +- sphinx/themes/epub/layout.html | 2 +- sphinx/themes/epub/static/epub.css | 2 +- sphinx/themes/haiku/layout.html | 2 +- sphinx/themes/haiku/static/haiku.css_t | 2 +- sphinx/themes/nature/static/nature.css_t | 2 +- sphinx/themes/pyramid/static/epub.css | 2 +- sphinx/themes/pyramid/static/pyramid.css_t | 2 +- sphinx/themes/scrolls/layout.html | 2 +- sphinx/themes/scrolls/static/scrolls.css_t | 2 +- sphinx/themes/sphinxdoc/layout.html | 2 +- sphinx/themes/sphinxdoc/static/sphinxdoc.css_t | 2 +- sphinx/themes/traditional/static/traditional.css_t | 2 +- sphinx/theming.py | 2 +- sphinx/transforms.py | 2 +- sphinx/util/__init__.py | 2 +- sphinx/util/compat.py | 2 +- sphinx/util/console.py | 2 +- sphinx/util/docfields.py | 2 +- sphinx/util/docstrings.py | 2 +- sphinx/util/i18n.py | 2 +- sphinx/util/inspect.py | 2 +- sphinx/util/jsdump.py | 2 +- sphinx/util/jsonimpl.py | 2 +- sphinx/util/matching.py | 2 +- sphinx/util/nodes.py | 2 +- sphinx/util/osutil.py | 2 +- sphinx/util/parallel.py | 2 +- sphinx/util/png.py | 2 +- sphinx/util/pycompat.py | 2 +- sphinx/util/tags.py | 2 +- sphinx/util/texescape.py | 2 +- sphinx/util/websupport.py | 2 +- sphinx/versioning.py | 2 +- sphinx/websupport/__init__.py | 2 +- sphinx/websupport/errors.py | 2 +- sphinx/websupport/search/__init__.py | 2 +- sphinx/websupport/search/nullsearch.py | 2 +- sphinx/websupport/search/whooshsearch.py | 2 +- sphinx/websupport/search/xapiansearch.py | 2 +- sphinx/websupport/storage/__init__.py | 2 +- sphinx/websupport/storage/differ.py | 2 +- sphinx/websupport/storage/sqlalchemy_db.py | 2 +- sphinx/websupport/storage/sqlalchemystorage.py | 2 +- sphinx/writers/__init__.py | 2 +- sphinx/writers/html.py | 2 +- sphinx/writers/latex.py | 2 +- sphinx/writers/manpage.py | 2 +- sphinx/writers/texinfo.py | 2 +- sphinx/writers/text.py | 2 +- sphinx/writers/websupport.py | 2 +- sphinx/writers/xml.py | 2 +- tests/path.py | 2 +- tests/root/conf.py | 2 +- tests/run.py | 2 +- tests/test_api_translator.py | 2 +- tests/test_apidoc.py | 2 +- tests/test_application.py | 2 +- tests/test_autodoc.py | 2 +- tests/test_build.py | 2 +- tests/test_build_applehelp.py | 2 +- tests/test_build_gettext.py | 2 +- tests/test_build_html.py | 2 +- tests/test_build_latex.py | 2 +- tests/test_build_manpage.py | 2 +- tests/test_build_texinfo.py | 2 +- tests/test_build_text.py | 2 +- tests/test_catalogs.py | 2 +- tests/test_config.py | 2 +- tests/test_directive_code.py | 2 +- tests/test_directive_only.py | 2 +- tests/test_docutilsconf.py | 2 +- tests/test_domain_cpp.py | 2 +- tests/test_domain_py.py | 2 +- tests/test_domain_rst.py | 2 +- tests/test_domain_std.py | 2 +- tests/test_environment.py | 2 +- tests/test_ext_autosummary.py | 2 +- tests/test_ext_coverage.py | 2 +- tests/test_ext_doctest.py | 2 +- tests/test_ext_graphviz.py | 2 +- tests/test_ext_ifconfig.py | 2 +- tests/test_ext_intersphinx.py | 2 +- tests/test_ext_napoleon.py | 2 +- tests/test_ext_napoleon_docstring.py | 2 +- tests/test_ext_napoleon_iterators.py | 2 +- tests/test_ext_viewcode.py | 2 +- tests/test_highlighting.py | 2 +- tests/test_i18n.py | 2 +- tests/test_intl.py | 2 +- tests/test_markup.py | 2 +- tests/test_metadata.py | 2 +- tests/test_quickstart.py | 2 +- tests/test_search.py | 2 +- tests/test_searchadapters.py | 2 +- tests/test_setup_command.py | 2 +- tests/test_templating.py | 2 +- tests/test_theming.py | 2 +- tests/test_toctree.py | 2 +- tests/test_util.py | 2 +- tests/test_util_i18n.py | 2 +- tests/test_util_nodes.py | 2 +- tests/test_versioning.py | 2 +- tests/test_websupport.py | 2 +- tests/util.py | 2 +- utils/check_sources.py | 2 +- 206 files changed, 206 insertions(+), 206 deletions(-) diff --git a/LICENSE b/LICENSE index 4944ef5a1..8f9e7f1ac 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ License for Sphinx ================== -Copyright (c) 2007-2015 by the Sphinx team (see AUTHORS file). +Copyright (c) 2007-2016 by the Sphinx team (see AUTHORS file). All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/doc/_themes/sphinx13/layout.html b/doc/_themes/sphinx13/layout.html index 0e6294cc4..bf28cd089 100644 --- a/doc/_themes/sphinx13/layout.html +++ b/doc/_themes/sphinx13/layout.html @@ -4,7 +4,7 @@ Sphinx layout template for the sphinxdoc theme. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "basic/layout.html" %} diff --git a/doc/_themes/sphinx13/static/sphinx13.css b/doc/_themes/sphinx13/static/sphinx13.css index 222432d5c..8b3ebdf3a 100644 --- a/doc/_themes/sphinx13/static/sphinx13.css +++ b/doc/_themes/sphinx13/static/sphinx13.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- sphinx13 theme. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/doc/conf.py b/doc/conf.py index 22ab60972..753ffab4c 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -15,7 +15,7 @@ templates_path = ['_templates'] exclude_patterns = ['_build'] project = 'Sphinx' -copyright = '2007-2015, Georg Brandl and the Sphinx team' +copyright = '2007-2016, Georg Brandl and the Sphinx team' version = sphinx.__released__ release = version show_authors = True diff --git a/sphinx-apidoc.py b/sphinx-apidoc.py index 7752fc0d1..56394ea96 100755 --- a/sphinx-apidoc.py +++ b/sphinx-apidoc.py @@ -4,7 +4,7 @@ Sphinx - Python documentation toolchain ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx-autogen.py b/sphinx-autogen.py index ea085573f..bcb630855 100755 --- a/sphinx-autogen.py +++ b/sphinx-autogen.py @@ -4,7 +4,7 @@ Sphinx - Python documentation toolchain ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx-build.py b/sphinx-build.py index 7c539d643..ab7919dbb 100755 --- a/sphinx-build.py +++ b/sphinx-build.py @@ -4,7 +4,7 @@ Sphinx - Python documentation toolchain ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx-quickstart.py b/sphinx-quickstart.py index 89ad8f891..fcc594132 100755 --- a/sphinx-quickstart.py +++ b/sphinx-quickstart.py @@ -4,7 +4,7 @@ Sphinx - Python documentation toolchain ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/__init__.py b/sphinx/__init__.py index 0ad54f524..2bc25685c 100644 --- a/sphinx/__init__.py +++ b/sphinx/__init__.py @@ -5,7 +5,7 @@ The Sphinx documentation toolchain. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/__main__.py b/sphinx/__main__.py index cd19db393..42022bf50 100644 --- a/sphinx/__main__.py +++ b/sphinx/__main__.py @@ -5,7 +5,7 @@ The Sphinx documentation toolchain. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import sys diff --git a/sphinx/addnodes.py b/sphinx/addnodes.py index b30bd40ae..f5ad7adad 100644 --- a/sphinx/addnodes.py +++ b/sphinx/addnodes.py @@ -5,7 +5,7 @@ Additional docutils nodes. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/apidoc.py b/sphinx/apidoc.py index 1238693c8..b3e184f68 100644 --- a/sphinx/apidoc.py +++ b/sphinx/apidoc.py @@ -11,7 +11,7 @@ Copyright 2008 Société des arts technologiques (SAT), http://www.sat.qc.ca/ - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/sphinx/application.py b/sphinx/application.py index 16b1c8176..957a1be26 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -7,7 +7,7 @@ Gracefully adapted from the TextPress system by Armin. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/sphinx/builders/__init__.py b/sphinx/builders/__init__.py index 2688f8466..30c1f73d9 100644 --- a/sphinx/builders/__init__.py +++ b/sphinx/builders/__init__.py @@ -5,7 +5,7 @@ Builder superclass for all builders. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/applehelp.py b/sphinx/builders/applehelp.py index c98962633..53a0c99ad 100644 --- a/sphinx/builders/applehelp.py +++ b/sphinx/builders/applehelp.py @@ -5,7 +5,7 @@ Build Apple help books. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/sphinx/builders/changes.py b/sphinx/builders/changes.py index 4fb98ba12..c077b7dd2 100644 --- a/sphinx/builders/changes.py +++ b/sphinx/builders/changes.py @@ -5,7 +5,7 @@ Changelog builder. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/devhelp.py b/sphinx/builders/devhelp.py index 56e63625e..5ebaf2dc5 100644 --- a/sphinx/builders/devhelp.py +++ b/sphinx/builders/devhelp.py @@ -7,7 +7,7 @@ .. _Devhelp: http://live.gnome.org/devhelp - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import absolute_import diff --git a/sphinx/builders/epub.py b/sphinx/builders/epub.py index cdcfed2b7..61990c0d2 100644 --- a/sphinx/builders/epub.py +++ b/sphinx/builders/epub.py @@ -6,7 +6,7 @@ Build epub files. Originally derived from qthelp.py. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/gettext.py b/sphinx/builders/gettext.py index ec6a18805..ef4992a26 100644 --- a/sphinx/builders/gettext.py +++ b/sphinx/builders/gettext.py @@ -5,7 +5,7 @@ The MessageCatalogBuilder class. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py index 7006eff79..8dcb905d3 100644 --- a/sphinx/builders/html.py +++ b/sphinx/builders/html.py @@ -5,7 +5,7 @@ Several HTML builders. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/htmlhelp.py b/sphinx/builders/htmlhelp.py index 9a21fb15b..2f06cb0e1 100644 --- a/sphinx/builders/htmlhelp.py +++ b/sphinx/builders/htmlhelp.py @@ -6,7 +6,7 @@ Build HTML help support files. Parts adapted from Python's Doc/tools/prechm.py. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/sphinx/builders/latex.py b/sphinx/builders/latex.py index 18041eae3..d50e53a61 100644 --- a/sphinx/builders/latex.py +++ b/sphinx/builders/latex.py @@ -5,7 +5,7 @@ LaTeX builder. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/linkcheck.py b/sphinx/builders/linkcheck.py index 72010113a..5904d659b 100644 --- a/sphinx/builders/linkcheck.py +++ b/sphinx/builders/linkcheck.py @@ -5,7 +5,7 @@ The CheckExternalLinksBuilder class. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/manpage.py b/sphinx/builders/manpage.py index 2af853dd8..a2e75f9f7 100644 --- a/sphinx/builders/manpage.py +++ b/sphinx/builders/manpage.py @@ -5,7 +5,7 @@ Manual pages builder. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/qthelp.py b/sphinx/builders/qthelp.py index 825f5651f..f6cfa84c5 100644 --- a/sphinx/builders/qthelp.py +++ b/sphinx/builders/qthelp.py @@ -5,7 +5,7 @@ Build input files for the Qt collection generator. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/texinfo.py b/sphinx/builders/texinfo.py index 7528c0777..dec278c86 100644 --- a/sphinx/builders/texinfo.py +++ b/sphinx/builders/texinfo.py @@ -5,7 +5,7 @@ Texinfo builder. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/text.py b/sphinx/builders/text.py index 9e624d0d5..85da4a1a2 100644 --- a/sphinx/builders/text.py +++ b/sphinx/builders/text.py @@ -5,7 +5,7 @@ Plain-text Sphinx builder. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/websupport.py b/sphinx/builders/websupport.py index 66af0ab80..843b0899e 100644 --- a/sphinx/builders/websupport.py +++ b/sphinx/builders/websupport.py @@ -5,7 +5,7 @@ Builder for the web support package. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/builders/xml.py b/sphinx/builders/xml.py index 18d8cbfb5..91cb273f5 100644 --- a/sphinx/builders/xml.py +++ b/sphinx/builders/xml.py @@ -5,7 +5,7 @@ Docutils-native XML and pseudo-XML builders. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/cmdline.py b/sphinx/cmdline.py index e9d76bb83..21422be51 100644 --- a/sphinx/cmdline.py +++ b/sphinx/cmdline.py @@ -5,7 +5,7 @@ sphinx-build command-line handling. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/sphinx/config.py b/sphinx/config.py index 090875a79..4501863c3 100644 --- a/sphinx/config.py +++ b/sphinx/config.py @@ -5,7 +5,7 @@ Build configuration file handling. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/directives/__init__.py b/sphinx/directives/__init__.py index 2200cdb6c..36ca3d34d 100644 --- a/sphinx/directives/__init__.py +++ b/sphinx/directives/__init__.py @@ -5,7 +5,7 @@ Handlers for additional ReST directives. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/directives/code.py b/sphinx/directives/code.py index f31ba7a99..3d0363a7a 100644 --- a/sphinx/directives/code.py +++ b/sphinx/directives/code.py @@ -3,7 +3,7 @@ sphinx.directives.code ~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/directives/other.py b/sphinx/directives/other.py index 794dbda5e..51294570c 100644 --- a/sphinx/directives/other.py +++ b/sphinx/directives/other.py @@ -3,7 +3,7 @@ sphinx.directives.other ~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/domains/__init__.py b/sphinx/domains/__init__.py index 5d530ae5b..e4d397efe 100644 --- a/sphinx/domains/__init__.py +++ b/sphinx/domains/__init__.py @@ -6,7 +6,7 @@ Support for domains, which are groupings of description directives and roles describing e.g. constructs of one programming language. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/domains/c.py b/sphinx/domains/c.py index 6b71f882d..23ed04d05 100644 --- a/sphinx/domains/c.py +++ b/sphinx/domains/c.py @@ -5,7 +5,7 @@ The C language domain. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py index 69b99d269..a7a139333 100644 --- a/sphinx/domains/cpp.py +++ b/sphinx/domains/cpp.py @@ -5,7 +5,7 @@ The C++ language domain. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/domains/javascript.py b/sphinx/domains/javascript.py index 843629b3b..f7e2703e4 100644 --- a/sphinx/domains/javascript.py +++ b/sphinx/domains/javascript.py @@ -5,7 +5,7 @@ The JavaScript domain. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/domains/python.py b/sphinx/domains/python.py index b64e797b0..ba5998084 100644 --- a/sphinx/domains/python.py +++ b/sphinx/domains/python.py @@ -5,7 +5,7 @@ The Python domain. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/domains/rst.py b/sphinx/domains/rst.py index b47961469..f0ad66ddc 100644 --- a/sphinx/domains/rst.py +++ b/sphinx/domains/rst.py @@ -5,7 +5,7 @@ The reStructuredText domain. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py index 1ba67c380..b60cc4eb9 100644 --- a/sphinx/domains/std.py +++ b/sphinx/domains/std.py @@ -5,7 +5,7 @@ The standard domain. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/environment.py b/sphinx/environment.py index c65e6279d..8d0789cfa 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -5,7 +5,7 @@ Global creation environment. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/errors.py b/sphinx/errors.py index 6761e87f6..8d695c190 100644 --- a/sphinx/errors.py +++ b/sphinx/errors.py @@ -6,7 +6,7 @@ Contains SphinxError and a few subclasses (in an extra module to avoid circular import problems). - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/__init__.py b/sphinx/ext/__init__.py index 62c6416c3..776250c4d 100644 --- a/sphinx/ext/__init__.py +++ b/sphinx/ext/__init__.py @@ -5,6 +5,6 @@ Contains Sphinx features not activated by default. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py index ff6a30ecc..929ae758d 100644 --- a/sphinx/ext/autodoc.py +++ b/sphinx/ext/autodoc.py @@ -7,7 +7,7 @@ the doctree, thus avoiding duplication between docstrings and documentation for those who like elaborate docstrings. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/autosummary/__init__.py b/sphinx/ext/autosummary/__init__.py index a53b125d5..134e323f6 100644 --- a/sphinx/ext/autosummary/__init__.py +++ b/sphinx/ext/autosummary/__init__.py @@ -49,7 +49,7 @@ resolved to a Python object, and otherwise it becomes simple emphasis. This can be used as the default role to make links 'smart'. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/autosummary/generate.py b/sphinx/ext/autosummary/generate.py index 2cacadfd7..8495da7b4 100644 --- a/sphinx/ext/autosummary/generate.py +++ b/sphinx/ext/autosummary/generate.py @@ -14,7 +14,7 @@ generate: sphinx-autogen -o source/generated source/*.rst - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/sphinx/ext/coverage.py b/sphinx/ext/coverage.py index c564aeedd..78281bb85 100644 --- a/sphinx/ext/coverage.py +++ b/sphinx/ext/coverage.py @@ -6,7 +6,7 @@ Check Python modules and C API for coverage. Mostly written by Josip Dzolonga for the Google Highly Open Participation contest. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/doctest.py b/sphinx/ext/doctest.py index 72ee9f85d..0f5241a19 100644 --- a/sphinx/ext/doctest.py +++ b/sphinx/ext/doctest.py @@ -6,7 +6,7 @@ Mimic doctest by automatically executing code snippets and checking their results. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import absolute_import diff --git a/sphinx/ext/extlinks.py b/sphinx/ext/extlinks.py index 1f93fc944..8bd8017a9 100644 --- a/sphinx/ext/extlinks.py +++ b/sphinx/ext/extlinks.py @@ -20,7 +20,7 @@ You can also give an explicit caption, e.g. :exmpl:`Foo <foo>`. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py index e0c73ecd8..3701d40fe 100644 --- a/sphinx/ext/graphviz.py +++ b/sphinx/ext/graphviz.py @@ -6,7 +6,7 @@ Allow graphviz-formatted graphs to be included in Sphinx-generated documents inline. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/ifconfig.py b/sphinx/ext/ifconfig.py index 3c77566ef..74580fb4a 100644 --- a/sphinx/ext/ifconfig.py +++ b/sphinx/ext/ifconfig.py @@ -16,7 +16,7 @@ namespace of the project configuration (that is, all variables from ``conf.py`` are available.) - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/inheritance_diagram.py b/sphinx/ext/inheritance_diagram.py index 24af6f168..4ac2bd2fd 100644 --- a/sphinx/ext/inheritance_diagram.py +++ b/sphinx/ext/inheritance_diagram.py @@ -32,7 +32,7 @@ r""" The graph is inserted as a PNG+image map into HTML and a PDF in LaTeX. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/intersphinx.py b/sphinx/ext/intersphinx.py index b0a7fda8f..42e2c9d8f 100644 --- a/sphinx/ext/intersphinx.py +++ b/sphinx/ext/intersphinx.py @@ -20,7 +20,7 @@ also be specified individually, e.g. if the docs should be buildable without Internet access. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/jsmath.py b/sphinx/ext/jsmath.py index f5e4ce0d7..ff77c2d1b 100644 --- a/sphinx/ext/jsmath.py +++ b/sphinx/ext/jsmath.py @@ -6,7 +6,7 @@ Set up everything for use of JSMath to display math in HTML via JavaScript. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/linkcode.py b/sphinx/ext/linkcode.py index b0ee5e43e..63bd38727 100644 --- a/sphinx/ext/linkcode.py +++ b/sphinx/ext/linkcode.py @@ -5,7 +5,7 @@ Add external links to module code in Python object descriptions. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/mathbase.py b/sphinx/ext/mathbase.py index 78754d5c1..14b1a8a67 100644 --- a/sphinx/ext/mathbase.py +++ b/sphinx/ext/mathbase.py @@ -5,7 +5,7 @@ Set up math support in source files and LaTeX/text output. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/mathjax.py b/sphinx/ext/mathjax.py index 61e8c05b5..511c4f3dd 100644 --- a/sphinx/ext/mathjax.py +++ b/sphinx/ext/mathjax.py @@ -7,7 +7,7 @@ Sphinx's HTML writer -- requires the MathJax JavaScript library on your webserver/computer. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/napoleon/__init__.py b/sphinx/ext/napoleon/__init__.py index d96c66a76..3328b4f44 100644 --- a/sphinx/ext/napoleon/__init__.py +++ b/sphinx/ext/napoleon/__init__.py @@ -5,7 +5,7 @@ Support for NumPy and Google style docstrings. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/napoleon/docstring.py b/sphinx/ext/napoleon/docstring.py index 0cc1f96f1..0be0a5ba8 100644 --- a/sphinx/ext/napoleon/docstring.py +++ b/sphinx/ext/napoleon/docstring.py @@ -7,7 +7,7 @@ Classes for docstring parsing and formatting. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/napoleon/iterators.py b/sphinx/ext/napoleon/iterators.py index f59a3f088..f66d67f2c 100644 --- a/sphinx/ext/napoleon/iterators.py +++ b/sphinx/ext/napoleon/iterators.py @@ -7,7 +7,7 @@ A collection of helpful iterators. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/pngmath.py b/sphinx/ext/pngmath.py index 8ef860f80..2e66b2e8f 100644 --- a/sphinx/ext/pngmath.py +++ b/sphinx/ext/pngmath.py @@ -5,7 +5,7 @@ Render math in HTML via dvipng. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/todo.py b/sphinx/ext/todo.py index faa086fc8..bb61669d1 100644 --- a/sphinx/ext/todo.py +++ b/sphinx/ext/todo.py @@ -8,7 +8,7 @@ all todos of your project and lists them along with a backlink to the original location. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/viewcode.py b/sphinx/ext/viewcode.py index e6af4f550..d64cc88f7 100644 --- a/sphinx/ext/viewcode.py +++ b/sphinx/ext/viewcode.py @@ -5,7 +5,7 @@ Add links to module code in Python object descriptions. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/highlighting.py b/sphinx/highlighting.py index dd40bc308..5d2f686dc 100644 --- a/sphinx/highlighting.py +++ b/sphinx/highlighting.py @@ -5,7 +5,7 @@ Highlight code blocks using Pygments. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/jinja2glue.py b/sphinx/jinja2glue.py index c8a7165fc..f3ce87a8c 100644 --- a/sphinx/jinja2glue.py +++ b/sphinx/jinja2glue.py @@ -5,7 +5,7 @@ Glue code for the jinja2 templating engine. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/locale/__init__.py b/sphinx/locale/__init__.py index 444ad5d0c..f7a375dec 100644 --- a/sphinx/locale/__init__.py +++ b/sphinx/locale/__init__.py @@ -5,7 +5,7 @@ Locale utilities. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/make_mode.py b/sphinx/make_mode.py index 7d239f51c..67ba9e1e1 100644 --- a/sphinx/make_mode.py +++ b/sphinx/make_mode.py @@ -11,7 +11,7 @@ This is in its own module so that importing it is fast. It should not import the main Sphinx modules (like sphinx.applications, sphinx.builders). - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/sphinx/pycode/__init__.py b/sphinx/pycode/__init__.py index 57707e9d0..8e8ecf706 100644 --- a/sphinx/pycode/__init__.py +++ b/sphinx/pycode/__init__.py @@ -5,7 +5,7 @@ Utilities parsing and analyzing Python code. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/sphinx/pycode/nodes.py b/sphinx/pycode/nodes.py index 3b244db7f..ee40f3c0d 100644 --- a/sphinx/pycode/nodes.py +++ b/sphinx/pycode/nodes.py @@ -5,7 +5,7 @@ Parse tree node implementations. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/pygments_styles.py b/sphinx/pygments_styles.py index ff2263e1c..469947149 100644 --- a/sphinx/pygments_styles.py +++ b/sphinx/pygments_styles.py @@ -5,7 +5,7 @@ Sphinx theme specific highlighting styles. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index e785ab207..3ddc0c6f7 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -5,7 +5,7 @@ Quickly setup documentation source to work with Sphinx. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/sphinx/roles.py b/sphinx/roles.py index d3a73f0dd..78e1e2c39 100644 --- a/sphinx/roles.py +++ b/sphinx/roles.py @@ -5,7 +5,7 @@ Handlers for additional ReST roles. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/search/__init__.py b/sphinx/search/__init__.py index e248088ab..06b835150 100644 --- a/sphinx/search/__init__.py +++ b/sphinx/search/__init__.py @@ -5,7 +5,7 @@ Create a full-text search index for offline search. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re diff --git a/sphinx/search/en.py b/sphinx/search/en.py index de77ae294..ee9795ce3 100644 --- a/sphinx/search/en.py +++ b/sphinx/search/en.py @@ -5,7 +5,7 @@ English search language: includes the JS porter stemmer. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/search/ja.py b/sphinx/search/ja.py index 3acbb649a..6e9ead616 100644 --- a/sphinx/search/ja.py +++ b/sphinx/search/ja.py @@ -5,7 +5,7 @@ Japanese search language: includes routine to split words. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/setup_command.py b/sphinx/setup_command.py index 1a942c5da..128c1415c 100644 --- a/sphinx/setup_command.py +++ b/sphinx/setup_command.py @@ -8,7 +8,7 @@ :author: Sebastian Wiesner :contact: basti.wiesner@gmx.net - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/sphinx/themes/agogo/layout.html b/sphinx/themes/agogo/layout.html index 6a80a207f..9a24b834f 100644 --- a/sphinx/themes/agogo/layout.html +++ b/sphinx/themes/agogo/layout.html @@ -5,7 +5,7 @@ Sphinx layout template for the agogo theme, originally written by Andi Albrecht. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "basic/layout.html" %} diff --git a/sphinx/themes/agogo/static/agogo.css_t b/sphinx/themes/agogo/static/agogo.css_t index 87801d685..26df9d6d5 100644 --- a/sphinx/themes/agogo/static/agogo.css_t +++ b/sphinx/themes/agogo/static/agogo.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- agogo theme. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/basic/defindex.html b/sphinx/themes/basic/defindex.html index 3c1240ebd..020f7e396 100644 --- a/sphinx/themes/basic/defindex.html +++ b/sphinx/themes/basic/defindex.html @@ -4,7 +4,7 @@ Default template for the "index" page. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "layout.html" %} diff --git a/sphinx/themes/basic/domainindex.html b/sphinx/themes/basic/domainindex.html index 2ca1111e1..33f1b8a2a 100644 --- a/sphinx/themes/basic/domainindex.html +++ b/sphinx/themes/basic/domainindex.html @@ -4,7 +4,7 @@ Template for domain indices (module index, ...). - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "layout.html" %} diff --git a/sphinx/themes/basic/genindex-single.html b/sphinx/themes/basic/genindex-single.html index ddc988381..a771c587b 100644 --- a/sphinx/themes/basic/genindex-single.html +++ b/sphinx/themes/basic/genindex-single.html @@ -4,7 +4,7 @@ Template for a "single" page of a split index. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% macro indexentries(firstname, links) %} diff --git a/sphinx/themes/basic/genindex-split.html b/sphinx/themes/basic/genindex-split.html index ca8db18b0..f6545dea0 100644 --- a/sphinx/themes/basic/genindex-split.html +++ b/sphinx/themes/basic/genindex-split.html @@ -4,7 +4,7 @@ Template for a "split" index overview page. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "layout.html" %} diff --git a/sphinx/themes/basic/genindex.html b/sphinx/themes/basic/genindex.html index 18e29b5e3..69c4ec564 100644 --- a/sphinx/themes/basic/genindex.html +++ b/sphinx/themes/basic/genindex.html @@ -4,7 +4,7 @@ Template for an "all-in-one" index. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {% macro indexentries(firstname, links) %} diff --git a/sphinx/themes/basic/globaltoc.html b/sphinx/themes/basic/globaltoc.html index 9f0296a93..b16bb9f51 100644 --- a/sphinx/themes/basic/globaltoc.html +++ b/sphinx/themes/basic/globaltoc.html @@ -4,7 +4,7 @@ Sphinx sidebar template: global table of contents. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} <h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3> diff --git a/sphinx/themes/basic/layout.html b/sphinx/themes/basic/layout.html index 4c0ebd658..2576d564e 100644 --- a/sphinx/themes/basic/layout.html +++ b/sphinx/themes/basic/layout.html @@ -4,7 +4,7 @@ Master layout template for Sphinx themes. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- block doctype -%} diff --git a/sphinx/themes/basic/localtoc.html b/sphinx/themes/basic/localtoc.html index 02e7cf38e..82c2599c3 100644 --- a/sphinx/themes/basic/localtoc.html +++ b/sphinx/themes/basic/localtoc.html @@ -4,7 +4,7 @@ Sphinx sidebar template: local table of contents. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- if display_toc %} diff --git a/sphinx/themes/basic/page.html b/sphinx/themes/basic/page.html index e8be92e09..e30385338 100644 --- a/sphinx/themes/basic/page.html +++ b/sphinx/themes/basic/page.html @@ -4,7 +4,7 @@ Master template for simple pages. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "layout.html" %} diff --git a/sphinx/themes/basic/relations.html b/sphinx/themes/basic/relations.html index 907b38be1..e3faec04a 100644 --- a/sphinx/themes/basic/relations.html +++ b/sphinx/themes/basic/relations.html @@ -4,7 +4,7 @@ Sphinx sidebar template: relation links. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- if prev %} diff --git a/sphinx/themes/basic/search.html b/sphinx/themes/basic/search.html index d4a0b7d77..4e7f383ba 100644 --- a/sphinx/themes/basic/search.html +++ b/sphinx/themes/basic/search.html @@ -4,7 +4,7 @@ Template for the search page. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "layout.html" %} diff --git a/sphinx/themes/basic/searchbox.html b/sphinx/themes/basic/searchbox.html index 4e128f4c1..c2727fb91 100644 --- a/sphinx/themes/basic/searchbox.html +++ b/sphinx/themes/basic/searchbox.html @@ -4,7 +4,7 @@ Sphinx sidebar template: quick search box. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- if pagename != "search" and builder != "singlehtml" %} diff --git a/sphinx/themes/basic/searchresults.html b/sphinx/themes/basic/searchresults.html index dccd20b6e..2d7537aec 100644 --- a/sphinx/themes/basic/searchresults.html +++ b/sphinx/themes/basic/searchresults.html @@ -4,7 +4,7 @@ Template for the body of the search results page. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} <h1 id="search-documentation">{{ _('Search') }}</h1> diff --git a/sphinx/themes/basic/sourcelink.html b/sphinx/themes/basic/sourcelink.html index a104b8923..fdeb49da6 100644 --- a/sphinx/themes/basic/sourcelink.html +++ b/sphinx/themes/basic/sourcelink.html @@ -4,7 +4,7 @@ Sphinx sidebar template: "show source" link. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- if show_source and has_source and sourcename %} diff --git a/sphinx/themes/basic/static/basic.css_t b/sphinx/themes/basic/static/basic.css_t index d2afc4a3d..815ca591e 100644 --- a/sphinx/themes/basic/static/basic.css_t +++ b/sphinx/themes/basic/static/basic.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/basic/static/doctools.js b/sphinx/themes/basic/static/doctools.js index c7bfe760a..e2e70cc28 100644 --- a/sphinx/themes/basic/static/doctools.js +++ b/sphinx/themes/basic/static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/basic/static/searchtools.js_t b/sphinx/themes/basic/static/searchtools.js_t index 7ac49eab7..260401202 100644 --- a/sphinx/themes/basic/static/searchtools.js_t +++ b/sphinx/themes/basic/static/searchtools.js_t @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilties for the full-text search. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/basic/static/websupport.js b/sphinx/themes/basic/static/websupport.js index 28d65db4a..ffd9b2bfd 100644 --- a/sphinx/themes/basic/static/websupport.js +++ b/sphinx/themes/basic/static/websupport.js @@ -4,7 +4,7 @@ * * sphinx.websupport utilties for all documentation. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/classic/layout.html b/sphinx/themes/classic/layout.html index 149cd86b7..934d62c0d 100644 --- a/sphinx/themes/classic/layout.html +++ b/sphinx/themes/classic/layout.html @@ -4,7 +4,7 @@ Sphinx layout template for the default theme. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "basic/layout.html" %} diff --git a/sphinx/themes/classic/static/classic.css_t b/sphinx/themes/classic/static/classic.css_t index 3f3274ec3..93673b01f 100644 --- a/sphinx/themes/classic/static/classic.css_t +++ b/sphinx/themes/classic/static/classic.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- default theme. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/classic/static/sidebar.js_t b/sphinx/themes/classic/static/sidebar.js_t index 5b38e532e..cecef37ff 100644 --- a/sphinx/themes/classic/static/sidebar.js_t +++ b/sphinx/themes/classic/static/sidebar.js_t @@ -16,7 +16,7 @@ * Once the browser is closed the cookie is deleted and the position * reset to the default (expanded). * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/epub/epub-cover.html b/sphinx/themes/epub/epub-cover.html index 86de4d488..d933c2548 100644 --- a/sphinx/themes/epub/epub-cover.html +++ b/sphinx/themes/epub/epub-cover.html @@ -4,7 +4,7 @@ Sample template for the html cover page. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "layout.html" %} diff --git a/sphinx/themes/epub/layout.html b/sphinx/themes/epub/layout.html index 83706cf5f..bdbcec21d 100644 --- a/sphinx/themes/epub/layout.html +++ b/sphinx/themes/epub/layout.html @@ -4,7 +4,7 @@ Sphinx layout template for the epub theme. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "basic/layout.html" %} diff --git a/sphinx/themes/epub/static/epub.css b/sphinx/themes/epub/static/epub.css index d4cc62afa..84db952c4 100644 --- a/sphinx/themes/epub/static/epub.css +++ b/sphinx/themes/epub/static/epub.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- epub theme. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/haiku/layout.html b/sphinx/themes/haiku/layout.html index 0f4c96f28..f89d859cf 100644 --- a/sphinx/themes/haiku/layout.html +++ b/sphinx/themes/haiku/layout.html @@ -4,7 +4,7 @@ Sphinx layout template for the haiku theme. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "basic/layout.html" %} diff --git a/sphinx/themes/haiku/static/haiku.css_t b/sphinx/themes/haiku/static/haiku.css_t index e2f32368c..0c20fd5c1 100644 --- a/sphinx/themes/haiku/static/haiku.css_t +++ b/sphinx/themes/haiku/static/haiku.css_t @@ -16,7 +16,7 @@ * Braden Ewing <brewin@gmail.com> * Humdinger <humdingerb@gmail.com> * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/nature/static/nature.css_t b/sphinx/themes/nature/static/nature.css_t index 391de6e79..4406956b4 100644 --- a/sphinx/themes/nature/static/nature.css_t +++ b/sphinx/themes/nature/static/nature.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- nature theme. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/pyramid/static/epub.css b/sphinx/themes/pyramid/static/epub.css index 7c6e67806..6fdf47704 100644 --- a/sphinx/themes/pyramid/static/epub.css +++ b/sphinx/themes/pyramid/static/epub.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- default theme. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/pyramid/static/pyramid.css_t b/sphinx/themes/pyramid/static/pyramid.css_t index 80252d209..d40da6661 100644 --- a/sphinx/themes/pyramid/static/pyramid.css_t +++ b/sphinx/themes/pyramid/static/pyramid.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- pylons theme. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/scrolls/layout.html b/sphinx/themes/scrolls/layout.html index 7120750a9..d07fec556 100644 --- a/sphinx/themes/scrolls/layout.html +++ b/sphinx/themes/scrolls/layout.html @@ -5,7 +5,7 @@ Sphinx layout template for the scrolls theme, originally written by Armin Ronacher. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "basic/layout.html" %} diff --git a/sphinx/themes/scrolls/static/scrolls.css_t b/sphinx/themes/scrolls/static/scrolls.css_t index a6833cf7b..83752c9d1 100644 --- a/sphinx/themes/scrolls/static/scrolls.css_t +++ b/sphinx/themes/scrolls/static/scrolls.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- scrolls theme. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/sphinxdoc/layout.html b/sphinx/themes/sphinxdoc/layout.html index 54c03fd55..ea05440eb 100644 --- a/sphinx/themes/sphinxdoc/layout.html +++ b/sphinx/themes/sphinxdoc/layout.html @@ -4,7 +4,7 @@ Sphinx layout template for the sphinxdoc theme. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. #} {%- extends "basic/layout.html" %} diff --git a/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t b/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t index 712eec085..c47a03d4c 100644 --- a/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t +++ b/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t @@ -5,7 +5,7 @@ * Sphinx stylesheet -- sphinxdoc theme. Originally created by * Armin Ronacher for Werkzeug. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/themes/traditional/static/traditional.css_t b/sphinx/themes/traditional/static/traditional.css_t index ba96ca6e8..b98de2268 100644 --- a/sphinx/themes/traditional/static/traditional.css_t +++ b/sphinx/themes/traditional/static/traditional.css_t @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- traditional docs.python.org theme. * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/sphinx/theming.py b/sphinx/theming.py index 0f1a0e226..b4d940dfe 100644 --- a/sphinx/theming.py +++ b/sphinx/theming.py @@ -5,7 +5,7 @@ Theming support for HTML builders. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/transforms.py b/sphinx/transforms.py index 9cecbd5e5..49c0aba1e 100644 --- a/sphinx/transforms.py +++ b/sphinx/transforms.py @@ -5,7 +5,7 @@ Docutils transforms used by Sphinx when reading documents. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index 177098d1c..5e5c8ac9e 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -5,7 +5,7 @@ Utility functions for Sphinx. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/compat.py b/sphinx/util/compat.py index 2203634aa..5329cb668 100644 --- a/sphinx/util/compat.py +++ b/sphinx/util/compat.py @@ -5,7 +5,7 @@ Stuff for docutils compatibility. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import warnings diff --git a/sphinx/util/console.py b/sphinx/util/console.py index ee6e4ea91..972b0df8b 100644 --- a/sphinx/util/console.py +++ b/sphinx/util/console.py @@ -5,7 +5,7 @@ Format colored console output. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/docfields.py b/sphinx/util/docfields.py index f556f302f..f4eb703ce 100644 --- a/sphinx/util/docfields.py +++ b/sphinx/util/docfields.py @@ -6,7 +6,7 @@ "Doc fields" are reST field lists in object descriptions that will be domain-specifically transformed to a more appealing presentation. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/docstrings.py b/sphinx/util/docstrings.py index 22c3696ab..fba9bf490 100644 --- a/sphinx/util/docstrings.py +++ b/sphinx/util/docstrings.py @@ -5,7 +5,7 @@ Utilities for docstring processing. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/i18n.py b/sphinx/util/i18n.py index a72e138c5..47d981773 100644 --- a/sphinx/util/i18n.py +++ b/sphinx/util/i18n.py @@ -5,7 +5,7 @@ Builder superclass for all builders. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import gettext diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py index 42b79ab75..5dc2008c8 100644 --- a/sphinx/util/inspect.py +++ b/sphinx/util/inspect.py @@ -5,7 +5,7 @@ Helpers for inspecting Python modules. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/jsdump.py b/sphinx/util/jsdump.py index 362f67942..fd553bd40 100644 --- a/sphinx/util/jsdump.py +++ b/sphinx/util/jsdump.py @@ -6,7 +6,7 @@ This module implements a simple JavaScript serializer. Uses the basestring encode function from simplejson by Bob Ippolito. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/jsonimpl.py b/sphinx/util/jsonimpl.py index 38e1b13cb..215dfe44d 100644 --- a/sphinx/util/jsonimpl.py +++ b/sphinx/util/jsonimpl.py @@ -5,7 +5,7 @@ JSON serializer implementation wrapper. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/matching.py b/sphinx/util/matching.py index b3bbdcd14..91fda6378 100644 --- a/sphinx/util/matching.py +++ b/sphinx/util/matching.py @@ -5,7 +5,7 @@ Pattern-matching utility functions for Sphinx. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py index aa4a9462b..5110f0ebd 100644 --- a/sphinx/util/nodes.py +++ b/sphinx/util/nodes.py @@ -5,7 +5,7 @@ Docutils node-related utility functions for Sphinx. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/osutil.py b/sphinx/util/osutil.py index b4488b5c6..70d5cf5e3 100644 --- a/sphinx/util/osutil.py +++ b/sphinx/util/osutil.py @@ -5,7 +5,7 @@ Operating system-related utility functions for Sphinx. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/sphinx/util/parallel.py b/sphinx/util/parallel.py index 618fbdc38..bace0b5fd 100644 --- a/sphinx/util/parallel.py +++ b/sphinx/util/parallel.py @@ -5,7 +5,7 @@ Parallel building utilities. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/png.py b/sphinx/util/png.py index b308a171a..e28445a42 100644 --- a/sphinx/util/png.py +++ b/sphinx/util/png.py @@ -5,7 +5,7 @@ PNG image manipulation helpers. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/pycompat.py b/sphinx/util/pycompat.py index 062cee739..a9adeb711 100644 --- a/sphinx/util/pycompat.py +++ b/sphinx/util/pycompat.py @@ -5,7 +5,7 @@ Stuff for Python version compatibility. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/tags.py b/sphinx/util/tags.py index a44c265d1..180cb49ec 100644 --- a/sphinx/util/tags.py +++ b/sphinx/util/tags.py @@ -3,7 +3,7 @@ sphinx.util.tags ~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/texescape.py b/sphinx/util/texescape.py index f9ae3adfd..51458d185 100644 --- a/sphinx/util/texescape.py +++ b/sphinx/util/texescape.py @@ -5,7 +5,7 @@ TeX escaping helper. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/util/websupport.py b/sphinx/util/websupport.py index 6c9cfeb9a..f91cca97a 100644 --- a/sphinx/util/websupport.py +++ b/sphinx/util/websupport.py @@ -3,7 +3,7 @@ sphinx.util.websupport ~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/versioning.py b/sphinx/versioning.py index c6691d52d..f6c446b4f 100644 --- a/sphinx/versioning.py +++ b/sphinx/versioning.py @@ -6,7 +6,7 @@ Implements the low-level algorithms Sphinx uses for the versioning of doctrees. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from uuid import uuid4 diff --git a/sphinx/websupport/__init__.py b/sphinx/websupport/__init__.py index 8e6288756..606d549a6 100644 --- a/sphinx/websupport/__init__.py +++ b/sphinx/websupport/__init__.py @@ -5,7 +5,7 @@ Base Module for web support functions. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/websupport/errors.py b/sphinx/websupport/errors.py index 1eda97e5c..608caaa52 100644 --- a/sphinx/websupport/errors.py +++ b/sphinx/websupport/errors.py @@ -5,7 +5,7 @@ Contains Error classes for the web support package. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/websupport/search/__init__.py b/sphinx/websupport/search/__init__.py index 3aafbda55..844a3b468 100644 --- a/sphinx/websupport/search/__init__.py +++ b/sphinx/websupport/search/__init__.py @@ -5,7 +5,7 @@ Server side search support for the web support package. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/websupport/search/nullsearch.py b/sphinx/websupport/search/nullsearch.py index 3d46555c0..9e990b1cf 100644 --- a/sphinx/websupport/search/nullsearch.py +++ b/sphinx/websupport/search/nullsearch.py @@ -5,7 +5,7 @@ The default search adapter, does nothing. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/websupport/search/whooshsearch.py b/sphinx/websupport/search/whooshsearch.py index 17a6e75a6..4b0769f50 100644 --- a/sphinx/websupport/search/whooshsearch.py +++ b/sphinx/websupport/search/whooshsearch.py @@ -5,7 +5,7 @@ Whoosh search adapter. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/websupport/search/xapiansearch.py b/sphinx/websupport/search/xapiansearch.py index c097e5e6e..ee9b33da7 100644 --- a/sphinx/websupport/search/xapiansearch.py +++ b/sphinx/websupport/search/xapiansearch.py @@ -5,7 +5,7 @@ Xapian search adapter. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/websupport/storage/__init__.py b/sphinx/websupport/storage/__init__.py index e04ac6ed5..6939fe577 100644 --- a/sphinx/websupport/storage/__init__.py +++ b/sphinx/websupport/storage/__init__.py @@ -5,7 +5,7 @@ Storage for the websupport package. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/websupport/storage/differ.py b/sphinx/websupport/storage/differ.py index 9ddd54764..393f92bc0 100644 --- a/sphinx/websupport/storage/differ.py +++ b/sphinx/websupport/storage/differ.py @@ -5,7 +5,7 @@ A differ for creating an HTML representations of proposal diffs - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/websupport/storage/sqlalchemy_db.py b/sphinx/websupport/storage/sqlalchemy_db.py index d96eb090d..b412ad488 100644 --- a/sphinx/websupport/storage/sqlalchemy_db.py +++ b/sphinx/websupport/storage/sqlalchemy_db.py @@ -6,7 +6,7 @@ SQLAlchemy table and mapper definitions used by the :class:`sphinx.websupport.storage.sqlalchemystorage.SQLAlchemyStorage`. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/websupport/storage/sqlalchemystorage.py b/sphinx/websupport/storage/sqlalchemystorage.py index 2842526c1..c8794f75c 100644 --- a/sphinx/websupport/storage/sqlalchemystorage.py +++ b/sphinx/websupport/storage/sqlalchemystorage.py @@ -5,7 +5,7 @@ An SQLAlchemy storage backend. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/writers/__init__.py b/sphinx/writers/__init__.py index fd795b0b9..ae763875a 100644 --- a/sphinx/writers/__init__.py +++ b/sphinx/writers/__init__.py @@ -5,6 +5,6 @@ Custom docutils writers. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py index 13480d4fc..d647898f1 100644 --- a/sphinx/writers/html.py +++ b/sphinx/writers/html.py @@ -5,7 +5,7 @@ docutils writers handling Sphinx' custom nodes. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 35ceffee4..3f53e2ee7 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -8,7 +8,7 @@ Much of this code is adapted from Dave Kuhlman's "docpy" writer from his docutils sandbox. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/writers/manpage.py b/sphinx/writers/manpage.py index 482b60596..0da784a27 100644 --- a/sphinx/writers/manpage.py +++ b/sphinx/writers/manpage.py @@ -5,7 +5,7 @@ Manual page writer, extended for Sphinx custom nodes. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/writers/texinfo.py b/sphinx/writers/texinfo.py index c066a3900..61e8a5eaf 100644 --- a/sphinx/writers/texinfo.py +++ b/sphinx/writers/texinfo.py @@ -5,7 +5,7 @@ Custom docutils writer for Texinfo. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/writers/text.py b/sphinx/writers/text.py index 8e5fd237d..2fea7c6d8 100644 --- a/sphinx/writers/text.py +++ b/sphinx/writers/text.py @@ -5,7 +5,7 @@ Custom docutils writer for plain text. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import os diff --git a/sphinx/writers/websupport.py b/sphinx/writers/websupport.py index 0ba290249..3da5d6dba 100644 --- a/sphinx/writers/websupport.py +++ b/sphinx/writers/websupport.py @@ -5,7 +5,7 @@ sphinx.websupport writer that adds comment-related annotations. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/writers/xml.py b/sphinx/writers/xml.py index 4d44d7687..5aa0ad96a 100644 --- a/sphinx/writers/xml.py +++ b/sphinx/writers/xml.py @@ -5,7 +5,7 @@ Docutils-native XML and pseudo-XML writers. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/path.py b/tests/path.py index 68984e0ae..f4b2612f6 100755 --- a/tests/path.py +++ b/tests/path.py @@ -4,7 +4,7 @@ path ~~~~ - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import os diff --git a/tests/root/conf.py b/tests/root/conf.py index bdf2f8c8d..f2684e33f 100644 --- a/tests/root/conf.py +++ b/tests/root/conf.py @@ -16,7 +16,7 @@ source_suffix = ['.txt', '.add', '.foo'] source_parsers = {'.foo': 'parsermod.Parser'} project = 'Sphinx <Tests>' -copyright = '2010-2015, Georg Brandl & Team' +copyright = '2010-2016, Georg Brandl & Team' # If this is changed, remember to update the versionchanges! version = '0.6' release = '0.6alpha1' diff --git a/tests/run.py b/tests/run.py index 432e2318e..b4bbf9822 100755 --- a/tests/run.py +++ b/tests/run.py @@ -6,7 +6,7 @@ This script runs the Sphinx unit test suite. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/tests/test_api_translator.py b/tests/test_api_translator.py index 4f862eea4..8f0f88a1d 100644 --- a/tests/test_api_translator.py +++ b/tests/test_api_translator.py @@ -5,7 +5,7 @@ Test the Sphinx API for translator. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_apidoc.py b/tests/test_apidoc.py index 794b1a293..596890041 100644 --- a/tests/test_apidoc.py +++ b/tests/test_apidoc.py @@ -5,7 +5,7 @@ Test the sphinx.apidoc module. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_application.py b/tests/test_application.py index c878cc1b6..3a3ee6728 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -5,7 +5,7 @@ Test the Sphinx class. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_autodoc.py b/tests/test_autodoc.py index 2d61edabd..5c2bc7ff5 100644 --- a/tests/test_autodoc.py +++ b/tests/test_autodoc.py @@ -6,7 +6,7 @@ Test the autodoc extension. This tests mainly the Documenters; the auto directives are tested in a test source file translated by test_build. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_build.py b/tests/test_build.py index 97ef651a6..a8a6455b8 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -5,7 +5,7 @@ Test all builders. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_build_applehelp.py b/tests/test_build_applehelp.py index 163cc86e3..66b24e1bd 100644 --- a/tests/test_build_applehelp.py +++ b/tests/test_build_applehelp.py @@ -7,7 +7,7 @@ test the HTML itself; that's already handled by :file:`test_build_html.py`. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_build_gettext.py b/tests/test_build_gettext.py index ed2b6e5f1..22fec975e 100644 --- a/tests/test_build_gettext.py +++ b/tests/test_build_gettext.py @@ -5,7 +5,7 @@ Test the build process with gettext builder with the test root. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/tests/test_build_html.py b/tests/test_build_html.py index 34b987852..e3307615d 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -5,7 +5,7 @@ Test the HTML builder and check output against XPath. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 18e1063fb..5de1c8624 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -5,7 +5,7 @@ Test the build process with LaTeX builder with the test root. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/tests/test_build_manpage.py b/tests/test_build_manpage.py index 85ae5be44..f42fee9cf 100644 --- a/tests/test_build_manpage.py +++ b/tests/test_build_manpage.py @@ -5,7 +5,7 @@ Test the build process with manpage builder with the test root. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/tests/test_build_texinfo.py b/tests/test_build_texinfo.py index 65b873238..4f6813653 100644 --- a/tests/test_build_texinfo.py +++ b/tests/test_build_texinfo.py @@ -5,7 +5,7 @@ Test the build process with Texinfo builder with the test root. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/tests/test_build_text.py b/tests/test_build_text.py index 5a1ec227f..613d95d1f 100644 --- a/tests/test_build_text.py +++ b/tests/test_build_text.py @@ -5,7 +5,7 @@ Test the build process with Text builder with the test root. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_catalogs.py b/tests/test_catalogs.py index 7b1cc05e0..ed9eb5fa3 100644 --- a/tests/test_catalogs.py +++ b/tests/test_catalogs.py @@ -5,7 +5,7 @@ Test the base build process. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import shutil diff --git a/tests/test_config.py b/tests/test_config.py index 77e61fee0..d0cd0dde1 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -6,7 +6,7 @@ Test the sphinx.config.Config class and its handling in the Application class. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from six import PY2, PY3, StringIO diff --git a/tests/test_directive_code.py b/tests/test_directive_code.py index 4f07beb99..1a488b0c7 100644 --- a/tests/test_directive_code.py +++ b/tests/test_directive_code.py @@ -5,7 +5,7 @@ Test the code-block directive. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_directive_only.py b/tests/test_directive_only.py index de7bea46b..7e499a3a1 100644 --- a/tests/test_directive_only.py +++ b/tests/test_directive_only.py @@ -5,7 +5,7 @@ Test the only directive with the test root. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_docutilsconf.py b/tests/test_docutilsconf.py index 5f956942d..ebd0782bd 100644 --- a/tests/test_docutilsconf.py +++ b/tests/test_docutilsconf.py @@ -5,7 +5,7 @@ Test docutils.conf support for several writers. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_domain_cpp.py b/tests/test_domain_cpp.py index 6975d7ab2..d9057f989 100644 --- a/tests/test_domain_cpp.py +++ b/tests/test_domain_cpp.py @@ -5,7 +5,7 @@ Tests the C++ Domain - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_domain_py.py b/tests/test_domain_py.py index 3918662dd..568038cfd 100644 --- a/tests/test_domain_py.py +++ b/tests/test_domain_py.py @@ -5,7 +5,7 @@ Tests the Python Domain - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_domain_rst.py b/tests/test_domain_rst.py index 7dabebe06..c1f8c6caa 100644 --- a/tests/test_domain_rst.py +++ b/tests/test_domain_rst.py @@ -5,7 +5,7 @@ Tests the reStructuredText domain. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_domain_std.py b/tests/test_domain_std.py index 1e361f172..6a6ff5315 100644 --- a/tests/test_domain_std.py +++ b/tests/test_domain_std.py @@ -5,7 +5,7 @@ Tests the std domain - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_environment.py b/tests/test_environment.py index 580a4992d..5b5c166d3 100644 --- a/tests/test_environment.py +++ b/tests/test_environment.py @@ -5,7 +5,7 @@ Test the BuildEnvironment class. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_ext_autosummary.py b/tests/test_ext_autosummary.py index 6bf9f3b9c..b2b04aea0 100644 --- a/tests/test_ext_autosummary.py +++ b/tests/test_ext_autosummary.py @@ -5,7 +5,7 @@ Test the autosummary extension. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_ext_coverage.py b/tests/test_ext_coverage.py index 9f401670d..ddf8efe51 100644 --- a/tests/test_ext_coverage.py +++ b/tests/test_ext_coverage.py @@ -5,7 +5,7 @@ Test the coverage builder. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_ext_doctest.py b/tests/test_ext_doctest.py index 68a0b17e8..d2a2d90ce 100644 --- a/tests/test_ext_doctest.py +++ b/tests/test_ext_doctest.py @@ -5,7 +5,7 @@ Test the doctest extension. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_ext_graphviz.py b/tests/test_ext_graphviz.py index 53f5be4df..0f3d95674 100644 --- a/tests/test_ext_graphviz.py +++ b/tests/test_ext_graphviz.py @@ -5,7 +5,7 @@ Test sphinx.ext.graphviz extension. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_ext_ifconfig.py b/tests/test_ext_ifconfig.py index 3f1bdd29a..56e31acae 100644 --- a/tests/test_ext_ifconfig.py +++ b/tests/test_ext_ifconfig.py @@ -5,7 +5,7 @@ Test sphinx.ext.ifconfig extension. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_ext_intersphinx.py b/tests/test_ext_intersphinx.py index 427bc87db..482df1378 100644 --- a/tests/test_ext_intersphinx.py +++ b/tests/test_ext_intersphinx.py @@ -5,7 +5,7 @@ Test the intersphinx extension. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_ext_napoleon.py b/tests/test_ext_napoleon.py index 162f98e81..d4ce96001 100644 --- a/tests/test_ext_napoleon.py +++ b/tests/test_ext_napoleon.py @@ -6,7 +6,7 @@ Tests for :mod:`sphinx.ext.napoleon.__init__` module. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_ext_napoleon_docstring.py b/tests/test_ext_napoleon_docstring.py index 81707c2e1..ae2995d40 100644 --- a/tests/test_ext_napoleon_docstring.py +++ b/tests/test_ext_napoleon_docstring.py @@ -6,7 +6,7 @@ Tests for :mod:`sphinx.ext.napoleon.docstring` module. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_ext_napoleon_iterators.py b/tests/test_ext_napoleon_iterators.py index b99e50f96..2faa11d40 100644 --- a/tests/test_ext_napoleon_iterators.py +++ b/tests/test_ext_napoleon_iterators.py @@ -6,7 +6,7 @@ Tests for :mod:`sphinx.ext.napoleon.iterators` module. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_ext_viewcode.py b/tests/test_ext_viewcode.py index 42700f4de..93e681a5d 100644 --- a/tests/test_ext_viewcode.py +++ b/tests/test_ext_viewcode.py @@ -5,7 +5,7 @@ Test sphinx.ext.viewcode extension. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_highlighting.py b/tests/test_highlighting.py index 02b928916..d3c36f478 100644 --- a/tests/test_highlighting.py +++ b/tests/test_highlighting.py @@ -5,7 +5,7 @@ Test the Pygments highlighting bridge. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_i18n.py b/tests/test_i18n.py index 986b62566..fcb35fc42 100644 --- a/tests/test_i18n.py +++ b/tests/test_i18n.py @@ -5,7 +5,7 @@ Test locale features. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_intl.py b/tests/test_intl.py index 691b68061..aab547c36 100644 --- a/tests/test_intl.py +++ b/tests/test_intl.py @@ -6,7 +6,7 @@ Test message patching for internationalization purposes. Runs the text builder in the test root. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/tests/test_markup.py b/tests/test_markup.py index a5804366f..c5ab8187b 100644 --- a/tests/test_markup.py +++ b/tests/test_markup.py @@ -5,7 +5,7 @@ Test various Sphinx-specific markup extensions. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_metadata.py b/tests/test_metadata.py index d61f1b522..14ab51ccd 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -5,7 +5,7 @@ Test our handling of metadata in files with bibliographic metadata. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_quickstart.py b/tests/test_quickstart.py index 013700417..ba250ae08 100644 --- a/tests/test_quickstart.py +++ b/tests/test_quickstart.py @@ -5,7 +5,7 @@ Test the sphinx.quickstart module. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_search.py b/tests/test_search.py index 391c2ee83..6b20f14d1 100644 --- a/tests/test_search.py +++ b/tests/test_search.py @@ -5,7 +5,7 @@ Test the search index builder. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_searchadapters.py b/tests/test_searchadapters.py index 7818ec807..f6a389fea 100644 --- a/tests/test_searchadapters.py +++ b/tests/test_searchadapters.py @@ -5,7 +5,7 @@ Test the Web Support Package search adapters. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_setup_command.py b/tests/test_setup_command.py index 7816fd183..77c9ade46 100644 --- a/tests/test_setup_command.py +++ b/tests/test_setup_command.py @@ -5,7 +5,7 @@ Test setup_command for distutils. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_templating.py b/tests/test_templating.py index 3cf331bbc..3cfb69ba2 100644 --- a/tests/test_templating.py +++ b/tests/test_templating.py @@ -5,7 +5,7 @@ Test templating. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_theming.py b/tests/test_theming.py index 3467ca2b8..07787ecca 100644 --- a/tests/test_theming.py +++ b/tests/test_theming.py @@ -5,7 +5,7 @@ Test the Theme class. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_toctree.py b/tests/test_toctree.py index d91d92389..64cb8cfd6 100644 --- a/tests/test_toctree.py +++ b/tests/test_toctree.py @@ -5,7 +5,7 @@ Test the HTML builder and check output against XPath. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_util.py b/tests/test_util.py index b0bca861f..23c4ad1ca 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -5,7 +5,7 @@ Tests util functions. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from sphinx.util import encode_uri diff --git a/tests/test_util_i18n.py b/tests/test_util_i18n.py index 03ca13266..df59653b3 100644 --- a/tests/test_util_i18n.py +++ b/tests/test_util_i18n.py @@ -5,7 +5,7 @@ Test i18n util. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function diff --git a/tests/test_util_nodes.py b/tests/test_util_nodes.py index c90139c88..a41af3cc8 100644 --- a/tests/test_util_nodes.py +++ b/tests/test_util_nodes.py @@ -5,7 +5,7 @@ Tests uti.nodes functions. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from textwrap import dedent diff --git a/tests/test_versioning.py b/tests/test_versioning.py index 140082e15..f5b5057d7 100644 --- a/tests/test_versioning.py +++ b/tests/test_versioning.py @@ -5,7 +5,7 @@ Test the versioning implementation. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_websupport.py b/tests/test_websupport.py index 6ea4588dd..bb41ae1ab 100644 --- a/tests/test_websupport.py +++ b/tests/test_websupport.py @@ -5,7 +5,7 @@ Test the Web Support Package - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/util.py b/tests/util.py index f7d8411c7..d4516f4f4 100644 --- a/tests/util.py +++ b/tests/util.py @@ -3,7 +3,7 @@ Sphinx test suite utilities ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/utils/check_sources.py b/utils/check_sources.py index 0538b1116..2ee016966 100755 --- a/utils/check_sources.py +++ b/utils/check_sources.py @@ -7,7 +7,7 @@ Make sure each Python file has a correct file header including copyright and license information. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import print_function From 6b7b51a55aa0dc419d9fd8dae17bbec197bd2724 Mon Sep 17 00:00:00 2001 From: Georg Brandl <georg@python.org> Date: Thu, 14 Jan 2016 22:55:22 +0100 Subject: [PATCH 174/238] Obligatory copyright update. --- sphinx/ext/githubpages.py | 2 +- sphinx/ext/imgmath.py | 2 +- sphinx/search/zh.py | 2 +- tests/test_autodoc_py35.py | 2 +- tests/test_ext_githubpages.py | 2 +- tests/test_ext_imgmath.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sphinx/ext/githubpages.py b/sphinx/ext/githubpages.py index 17b858a32..1d5c4c55d 100644 --- a/sphinx/ext/githubpages.py +++ b/sphinx/ext/githubpages.py @@ -5,7 +5,7 @@ To publish HTML docs at GitHub Pages, create .nojekyll file. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/ext/imgmath.py b/sphinx/ext/imgmath.py index c4b39f4c8..461cba17e 100644 --- a/sphinx/ext/imgmath.py +++ b/sphinx/ext/imgmath.py @@ -5,7 +5,7 @@ Render math in HTML via dvipng or dvisvgm. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/sphinx/search/zh.py b/sphinx/search/zh.py index 3caae22d4..92f66e971 100644 --- a/sphinx/search/zh.py +++ b/sphinx/search/zh.py @@ -5,7 +5,7 @@ Chinese search language: includes routine to split words. - :copyright: Copyright 2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_autodoc_py35.py b/tests/test_autodoc_py35.py index dc1bbee08..9bacc3d65 100644 --- a/tests/test_autodoc_py35.py +++ b/tests/test_autodoc_py35.py @@ -6,7 +6,7 @@ Test the autodoc extension. This tests mainly the Documenters; the auto directives are tested in a test source file translated by test_build. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_ext_githubpages.py b/tests/test_ext_githubpages.py index 00a3b77e4..65276df7a 100644 --- a/tests/test_ext_githubpages.py +++ b/tests/test_ext_githubpages.py @@ -5,7 +5,7 @@ Test sphinx.ext.githubpages extension. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/tests/test_ext_imgmath.py b/tests/test_ext_imgmath.py index bf0f016db..2e28d2baa 100644 --- a/tests/test_ext_imgmath.py +++ b/tests/test_ext_imgmath.py @@ -5,7 +5,7 @@ Test sphinx.ext.imgmath extension. - :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ From 0d5bdd3d8fbcd426221768cac6dd5a90425f517d Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Fri, 15 Jan 2016 12:02:02 +0900 Subject: [PATCH 175/238] update CHANGES for #2087 --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index 3232664ec..0ba260bc5 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,9 @@ Incompatible changes * Drop ``PorterStemmer`` package support. Use ``PyStemmer`` instead of ``PorterStemmer`` to accelerate stemming. +* Now sphinx_rtd_theme become optional. Please install it manually. + Refs #2087, #2086, #1845 and #2097. Thanks to Victor Zverovich. + Features added -------------- From afcc7f4626bde13f87d2aff1e1ae2c7e858f0279 Mon Sep 17 00:00:00 2001 From: Hong Xu <hong@topbug.net> Date: Fri, 15 Jan 2016 01:48:49 -0800 Subject: [PATCH 176/238] Move the testing code which spawns pdflatex to a function There are currently two locations in the testing code running the same code to spawn pdflatex. This commit puts these code into one single function to reduce redundancy. --- tests/test_build_latex.py | 61 ++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 5c8cb3438..76a7c7031 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -33,6 +33,29 @@ if PY3: LATEX_WARNINGS = remove_unicode_literals(LATEX_WARNINGS) +def run_latex(outdir): + """Run pdflatex, xelatex, and lualatex in the outdir""" + cwd = os.getcwd() + os.chdir(outdir) + try: + for latex in ('pdflatex', 'xelatex', 'lualatex'): + try: + os.mkdir(latex) + p = Popen([latex, '--interaction=nonstopmode', + '-output-directory=%s' % latex, 'SphinxTests.tex'], + stdout=PIPE, stderr=PIPE) + except OSError: + raise SkipTest # most likely pdflatex was not found + else: + stdout, stderr = p.communicate() + if p.returncode != 0: + print(stdout) + print(stderr) + assert False, '%s exited with return code %s' % ( + latex, p.returncode) + finally: + os.chdir(cwd) + @with_app(buildername='latex', freshenv=True) # use freshenv to check warnings def test_latex(app, status, warning): LaTeXTranslator.ignore_missing_images = True @@ -74,25 +97,7 @@ def test_latex(app, status, warning): 'seem to be installed' % filename) # now, try to run latex over it - cwd = os.getcwd() - os.chdir(app.outdir) - try: - for latex in ('pdflatex', 'xelatex', 'lualatex'): - try: - os.mkdir(latex) - p = Popen([latex, '--interaction=nonstopmode', - '-output-directory=%s' % latex, 'SphinxTests.tex'], - stdout=PIPE, stderr=PIPE) - except OSError: - raise SkipTest # most likely pdflatex was not found - else: - stdout, stderr = p.communicate() - if p.returncode != 0: - print(stdout) - print(stderr) - assert False, 'latex exited with return code %s' % p.returncode - finally: - os.chdir(cwd) + run_latex(app.outdir) @with_app(buildername='latex', freshenv=True, # use freshenv to check warnings @@ -141,23 +146,7 @@ def test_latex_howto(app, status, warning): 'seem to be installed' % filename) # now, try to run latex over it - cwd = os.getcwd() - os.chdir(app.outdir) - try: - try: - p = Popen(['pdflatex', '--interaction=nonstopmode', - 'SphinxTests.tex'], stdout=PIPE, stderr=PIPE) - except OSError: - raise SkipTest # most likely pdflatex was not found - else: - stdout, stderr = p.communicate() - if p.returncode != 0: - print(stdout) - print(stderr) - app.cleanup() - assert False, 'latex exited with return code %s' % p.returncode - finally: - os.chdir(cwd) + run_latex(app.outdir) @with_app(buildername='latex', testroot='numfig', From 34323776693ec25ce33e8d71992a5e044ec4c828 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 15 Jan 2016 21:14:04 +0900 Subject: [PATCH 177/238] Update error message if sphinx_rtd_theme not found --- sphinx/theming.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sphinx/theming.py b/sphinx/theming.py index b27368c79..7c53479ca 100644 --- a/sphinx/theming.py +++ b/sphinx/theming.py @@ -103,8 +103,8 @@ class Theme(object): self.load_extra_theme(name) if name not in self.themes: if name == 'sphinx_rtd_theme': - raise ThemeError('sphinx_rtd_theme has been unbundled since version ' - '1.4.0. Please install it manually.') + raise ThemeError('sphinx_rtd_theme is no longer a hard dependency ' + 'since version 1.4.0. Please install it manually.') else: raise ThemeError('no theme named %r found ' '(missing theme.conf?)' % name) From 6b36b31984083faa88862bbff475c610bf409a04 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 16 Jan 2016 02:12:17 +0900 Subject: [PATCH 178/238] Fix #2231: Use DUrole instead of DUspan for custom roles in LaTeX writer --- CHANGES | 2 ++ sphinx/texinputs/sphinx.sty | 19 +++++++++++-------- sphinx/writers/latex.py | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/CHANGES b/CHANGES index 0ba260bc5..347d53286 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,8 @@ Incompatible changes to accelerate stemming. * Now sphinx_rtd_theme become optional. Please install it manually. Refs #2087, #2086, #1845 and #2097. Thanks to Victor Zverovich. +* #2231: Use DUrole instead of DUspan for custom roles in LaTeX writer. It enables to take + title of roles as an argument of custom macros. Features added diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty index 138e84f54..f94d5c934 100644 --- a/sphinx/texinputs/sphinx.sty +++ b/sphinx/texinputs/sphinx.sty @@ -444,15 +444,18 @@ \RequirePackage{hypcap} % From docutils.writers.latex2e -\providecommand{\DUspan}[2]{% - {% group ("span") to limit the scope of styling commands - \@for\node@class@name:=#1\do{% - \ifcsname docutilsrole\node@class@name\endcsname% - \csname docutilsrole\node@class@name\endcsname% +% inline markup (custom roles) +% \DUrole{#1}{#2} tries \DUrole#1{#2} +\providecommand*{\DUrole}[2]{% + \ifcsname DUrole#1\endcsname% + \csname DUrole#1\endcsname{#2}% + \else% backwards compatibility: try \docutilsrole#1{#2} + \ifcsname docutilsrole#1\endcsname% + \csname docutilsrole#1\endcsname{#2}% + \else% + #2% \fi% - }% - {#2}% node content - }% close "span" + \fi% } \providecommand*{\DUprovidelength}[2]{ diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index a04804fa0..dd997361c 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1886,7 +1886,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.body.append(r'\underline{') self.context.append('}') elif classes and not self.in_title: - self.body.append(r'\DUspan{%s}{' % ','.join(classes)) + self.body.append(r'\DUrole{%s}{' % ','.join(classes)) self.context.append('}') else: self.context.append('') From 875e6a503bf9e1d7564371d57683d44d19a7203c Mon Sep 17 00:00:00 2001 From: Hong Xu <hong@topbug.net> Date: Fri, 15 Jan 2016 11:34:29 -0800 Subject: [PATCH 179/238] Run LaTeX in testing: don't skip the test unless all latexes do not exist Until now when one of the 3 latexes (pdflatex, xelatex, lualatex) does not exist, the test was skipped. This commit changes the behavior to "unless none of the 3 latexes exists, don't skip the test". --- tests/test_build_latex.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 76a7c7031..c4f5f18e7 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -38,14 +38,16 @@ def run_latex(outdir): cwd = os.getcwd() os.chdir(outdir) try: - for latex in ('pdflatex', 'xelatex', 'lualatex'): + latexes = ('pdflatex', 'xelatex', 'lualatex') + available_latexes = len(latexes) + for latex in latexes: try: os.mkdir(latex) p = Popen([latex, '--interaction=nonstopmode', '-output-directory=%s' % latex, 'SphinxTests.tex'], stdout=PIPE, stderr=PIPE) - except OSError: - raise SkipTest # most likely pdflatex was not found + except OSError: # most likely the latex executable was not found + available_latexes -= 1 else: stdout, stderr = p.communicate() if p.returncode != 0: @@ -56,6 +58,9 @@ def run_latex(outdir): finally: os.chdir(cwd) + if available_latexes == 0: # no latex is available, skip the test + raise SkipTest + @with_app(buildername='latex', freshenv=True) # use freshenv to check warnings def test_latex(app, status, warning): LaTeXTranslator.ignore_missing_images = True From 350d8aade0521f4741e33b08132d525c45c1aa40 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 16 Jan 2016 11:29:31 +0900 Subject: [PATCH 180/238] Fix broken LaTeX code is generated if unknown language is given --- CHANGES | 1 + sphinx/writers/latex.py | 3 +- tests/roots/test-contentsname/conf.py | 5 -- .../bar.rst | 0 tests/roots/test-latex-babel/conf.py | 8 ++ .../foo.rst | 0 .../index.rst | 0 tests/test_build_latex.py | 82 +++++++++++++++++-- 8 files changed, 86 insertions(+), 13 deletions(-) delete mode 100644 tests/roots/test-contentsname/conf.py rename tests/roots/{test-contentsname => test-latex-babel}/bar.rst (100%) create mode 100644 tests/roots/test-latex-babel/conf.py rename tests/roots/{test-contentsname => test-latex-babel}/foo.rst (100%) rename tests/roots/{test-contentsname => test-latex-babel}/index.rst (100%) diff --git a/CHANGES b/CHANGES index 347d53286..089c57d93 100644 --- a/CHANGES +++ b/CHANGES @@ -51,6 +51,7 @@ Bugs fixed * #1899: Ensure list is sent to OptParse. * #2164: Fix wrong check for pdftex inside sphinx.sty (for graphicx package option). * #2165, #2218: Remove faulty and non-need conditional from sphinx.sty. +* Fix broken LaTeX code is generated if unknown language is given Documentation ------------- diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index dd997361c..d3a07da60 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -327,6 +327,7 @@ class LaTeXTranslator(nodes.NodeVisitor): else: self.builder.warn('no Babel option known for language %r' % builder.config.language) + self.elements['classoptions'] += ',english' # fallback to english self.elements['shorthandoff'] = babel.get_shorthandoff() self.elements['fncychap'] = '\\usepackage[Sonny]{fncychap}' @@ -481,7 +482,7 @@ class LaTeXTranslator(nodes.NodeVisitor): else: if builder.config.language: language = ExtBabel(builder.config.language).get_language() - if language is None: + if not language: language = 'english' else: language = 'english' diff --git a/tests/roots/test-contentsname/conf.py b/tests/roots/test-contentsname/conf.py deleted file mode 100644 index c46e40773..000000000 --- a/tests/roots/test-contentsname/conf.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- - -master_doc = 'index' -html_theme = 'classic' -exclude_patterns = ['_build'] diff --git a/tests/roots/test-contentsname/bar.rst b/tests/roots/test-latex-babel/bar.rst similarity index 100% rename from tests/roots/test-contentsname/bar.rst rename to tests/roots/test-latex-babel/bar.rst diff --git a/tests/roots/test-latex-babel/conf.py b/tests/roots/test-latex-babel/conf.py new file mode 100644 index 000000000..d35acc89f --- /dev/null +++ b/tests/roots/test-latex-babel/conf.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' +numfig_format = { + 'figure': 'Fig. %s', + 'table': 'Table. %s', + 'code-block': 'List.', +} diff --git a/tests/roots/test-contentsname/foo.rst b/tests/roots/test-latex-babel/foo.rst similarity index 100% rename from tests/roots/test-contentsname/foo.rst rename to tests/roots/test-latex-babel/foo.rst diff --git a/tests/roots/test-contentsname/index.rst b/tests/roots/test-latex-babel/index.rst similarity index 100% rename from tests/roots/test-contentsname/index.rst rename to tests/roots/test-latex-babel/index.rst diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index c4f5f18e7..aa443e55e 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -273,26 +273,94 @@ def test_latex_add_latex_package(app, status, warning): assert '\\usepackage[baz]{bar}' in result -@with_app(buildername='latex', testroot='contentsname') -def test_contentsname(app, status, warning): +@with_app(buildername='latex', testroot='latex-babel') +def test_babel_with_no_language_settings(app, status, warning): app.builder.build_all() result = (app.outdir / 'Python.tex').text(encoding='utf8') print(result) print(status.getvalue()) print(warning.getvalue()) - assert ('\\addto\\captionsenglish{\\renewcommand{\\contentsname}{Table of content}}' + assert '\\documentclass[letterpaper,10pt,english]{sphinxmanual}' in result + assert '\\usepackage{babel}' in result + assert '\\usepackage{times}' in result + assert '\\usepackage[Bjarne]{fncychap}' in result + assert ('\\addto\\captionsenglish{\\renewcommand{\\contentsname}{Table of content}}\n' in result) + assert '\\addto\\captionsenglish{\\renewcommand{\\figurename}{Fig. }}\n' in result + assert '\\addto\\captionsenglish{\\renewcommand{\\tablename}{Table. }}\n' in result -@with_app(buildername='latex', testroot='contentsname', - confoverrides={'language': 'ja'}) -def test_contentsname_with_language_ja(app, status, warning): +@with_app(buildername='latex', testroot='latex-babel', + confoverrides={'language': 'de'}) +def test_babel_with_language_de(app, status, warning): app.builder.build_all() result = (app.outdir / 'Python.tex').text(encoding='utf8') print(result) print(status.getvalue()) print(warning.getvalue()) - assert '\\renewcommand{\\contentsname}{Table of content}' in result + assert '\\documentclass[letterpaper,10pt,ngerman]{sphinxmanual}' in result + assert '\\usepackage{babel}' in result + assert '\\usepackage{times}' in result + assert '\\usepackage[Sonny]{fncychap}' in result + assert ('\\addto\\captionsngerman{\\renewcommand{\\contentsname}{Table of content}}\n' + in result) + assert '\\addto\\captionsngerman{\\renewcommand{\\figurename}{Fig. }}\n' in result + assert '\\addto\\captionsngerman{\\renewcommand{\\tablename}{Table. }}\n' in result + + +@with_app(buildername='latex', testroot='latex-babel', + confoverrides={'language': 'ru'}) +def test_babel_with_language_ru(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert '\\documentclass[letterpaper,10pt,russian]{sphinxmanual}' in result + assert '\\usepackage{babel}' in result + assert '\\usepackage{times}' not in result + assert '\\usepackage[Sonny]{fncychap}' in result + assert ('\\addto\\captionsrussian{\\renewcommand{\\contentsname}{Table of content}}\n' + in result) + assert '\\addto\\captionsrussian{\\renewcommand{\\figurename}{Fig. }}\n' in result + assert '\\addto\\captionsrussian{\\renewcommand{\\tablename}{Table. }}\n' in result + + +@with_app(buildername='latex', testroot='latex-babel', + confoverrides={'language': 'ja'}) +def test_babel_with_language_ja(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert '\\documentclass[letterpaper,10pt,dvipdfmx]{sphinxmanual}' in result + assert '\\usepackage{babel}' not in result + assert '\\usepackage{times}' in result + assert '\\usepackage[Sonny]{fncychap}' not in result + assert '\\renewcommand{\\contentsname}{Table of content}\n' in result + assert '\\renewcommand{\\figurename}{Fig. }\n' in result + assert '\\renewcommand{\\tablename}{Table. }\n' in result + + +@with_app(buildername='latex', testroot='latex-babel', + confoverrides={'language': 'unknown'}) +def test_babel_with_unknown_language(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert '\\documentclass[letterpaper,10pt,english]{sphinxmanual}' in result + assert '\\usepackage{babel}' in result + assert '\\usepackage{times}' in result + assert '\\usepackage[Sonny]{fncychap}' in result + assert ('\\addto\\captionsenglish{\\renewcommand{\\contentsname}{Table of content}}\n' + in result) + assert '\\addto\\captionsenglish{\\renewcommand{\\figurename}{Fig. }}\n' in result + assert '\\addto\\captionsenglish{\\renewcommand{\\tablename}{Table. }}\n' in result + + assert "WARNING: no Babel option known for language 'unknown'" in warning.getvalue() @with_app(buildername='latex') From 2803b64b5d42c859f85dcc0fd2fc63b6836b98fa Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 16 Jan 2016 11:50:30 +0900 Subject: [PATCH 181/238] Refactor around babel --- sphinx/writers/latex.py | 65 ++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index d3a07da60..775bfe462 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -112,6 +112,10 @@ class LaTeXWriter(writers.Writer): # Helper classes class ExtBabel(Babel): + def __init__(self, language_code): + super(ExtBabel, self).__init__(language_code or '') + self.language_code = language_code + def get_shorthandoff(self): shortlang = self.language.split('_')[0] if shortlang in ('de', 'ngerman', 'sl', 'slovene', 'pt', 'portuges', @@ -126,6 +130,16 @@ class ExtBabel(Babel): 'mn', 'mongolian', 'ru', 'russian', 'uk', 'ukrainian') + def is_supported_language(self): + return bool(super(ExtBabel, self).get_language()) + + def get_language(self): + language = super(ExtBabel, self).get_language() + if not language: + return 'english' # fallback to english + else: + return language + # in latest trunk, the attribute is called Babel.language_codes and already # includes Slovene if hasattr(Babel, '_ISO639_TO_BABEL'): @@ -319,20 +333,18 @@ class LaTeXTranslator(nodes.NodeVisitor): if builder.config.latex_logo: self.elements['logo'] = '\\includegraphics{%s}\\par' % \ path.basename(builder.config.latex_logo) + # setup babel + self.babel = ExtBabel(builder.config.language) + self.elements['classoptions'] += ',' + self.babel.get_language() if builder.config.language: - babel = ExtBabel(builder.config.language) - lang = babel.get_language() - if lang: - self.elements['classoptions'] += ',' + babel.get_language() - else: + if not self.babel.is_supported_language(): self.builder.warn('no Babel option known for language %r' % builder.config.language) - self.elements['classoptions'] += ',english' # fallback to english - self.elements['shorthandoff'] = babel.get_shorthandoff() + self.elements['shorthandoff'] = self.babel.get_shorthandoff() self.elements['fncychap'] = '\\usepackage[Sonny]{fncychap}' # Times fonts don't work with Cyrillic languages - if babel.uses_cyrillic(): + if self.babel.uses_cyrillic(): self.elements['fontpkg'] = '' # pTeX (Japanese TeX) for support @@ -343,8 +355,6 @@ class LaTeXTranslator(nodes.NodeVisitor): self.elements['babel'] = '' # disable fncychap in Japanese documents self.elements['fncychap'] = '' - else: - self.elements['classoptions'] += ',english' if getattr(builder, 'usepackages', None): def declare_package(packagename, options=None): if options: @@ -355,8 +365,7 @@ class LaTeXTranslator(nodes.NodeVisitor): self.elements['usepackages'] += "\n".join(usepackages) if getattr(document.settings, 'contentsname', None): self.elements['contentsname'] = \ - self.babel_renewcommand(builder, '\\contentsname', - document.settings.contentsname) + self.babel_renewcommand('\\contentsname', document.settings.contentsname) self.elements['numfig_format'] = self.generate_numfig_format(builder) # allow the user to override them all self.elements.update(builder.config.latex_elements) @@ -475,27 +484,15 @@ class LaTeXTranslator(nodes.NodeVisitor): def hyperrefescape(self, ref): return self.idescape(ref).replace('-', '\\string-') - def babel_renewcommand(self, builder, command, definition): - if builder.config.language == 'ja': - babel_prefix = '' - babel_suffix = '' - else: - if builder.config.language: - language = ExtBabel(builder.config.language).get_language() - if not language: - language = 'english' - else: - language = 'english' + def babel_renewcommand(self, command, definition): + if self.elements['babel']: + prefix = '\\addto\\captions%s{' % self.babel.get_language() + suffix = '}' + else: # babel is disabled (mainly for Japanese environment) + prefix = '' + suffix = '' - if self.elements['babel']: - babel_prefix = '\\addto\\captions%s{' % language - babel_suffix = '}' - else: - babel_prefix = '' - babel_suffix = '' - - return ('%s\\renewcommand{%s}{%s}%s\n' % - (babel_prefix, command, definition, babel_suffix)) + return ('%s\\renewcommand{%s}{%s}%s\n' % (prefix, command, definition, suffix)) def generate_numfig_format(self, builder): ret = [] @@ -505,7 +502,7 @@ class LaTeXTranslator(nodes.NodeVisitor): text_type(figure[0]).translate(tex_escape_map)) else: definition = text_type(figure[0]).translate(tex_escape_map) - ret.append(self.babel_renewcommand(builder, '\\figurename', definition)) + ret.append(self.babel_renewcommand('\\figurename', definition)) if figure[1]: ret.append('\\makeatletter\n') ret.append('\\def\\fnum@figure{\\figurename\\thefigure%s}\n' % @@ -518,7 +515,7 @@ class LaTeXTranslator(nodes.NodeVisitor): text_type(table[0]).translate(tex_escape_map)) else: definition = text_type(table[0]).translate(tex_escape_map) - ret.append(self.babel_renewcommand(builder, '\\tablename', definition)) + ret.append(self.babel_renewcommand('\\tablename', definition)) if table[1]: ret.append('\\makeatletter\n') ret.append('\\def\\fnum@table{\\tablename\\thetable%s}\n' % From 121fc4a32685f6276bfbe728d0318bc83259456e Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 16 Jan 2016 14:32:23 +0900 Subject: [PATCH 182/238] Fix #1030: Make page reference names for latex_show_pagerefs translatable --- CHANGES | 1 + sphinx/writers/latex.py | 45 ++++++++++++++++++++++++++------------- tests/test_build_latex.py | 5 +++++ 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/CHANGES b/CHANGES index 089c57d93..b8a90deca 100644 --- a/CHANGES +++ b/CHANGES @@ -33,6 +33,7 @@ Features added * #2216: Texinputs makefile improvements. * #2170: Support for Chinese language search index. * #2214: Add sphinx.ext.githubpages to publish the docs on GitHub Pages +* #1030: Make page reference names for latex_show_pagerefs translatable Bugs fixed ---------- diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 775bfe462..96d9e03a6 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -46,6 +46,7 @@ HEADER = r'''%% Generated by Sphinx. %(usepackages)s %(contentsname)s %(numfig_format)s +%(pageautorefname)s %(preamble)s \title{%(title)s} @@ -292,6 +293,7 @@ class LaTeXTranslator(nodes.NodeVisitor): 'transition': '\n\n\\bigskip\\hrule{}\\bigskip\n\n', 'figure_align': 'htbp', 'tocdepth': '', + 'pageautorefname': '', } # sphinx specific document classes @@ -302,6 +304,22 @@ class LaTeXTranslator(nodes.NodeVisitor): self.builder = builder self.body = [] + # flags + self.in_title = 0 + self.in_production_list = 0 + self.in_footnote = 0 + self.in_caption = 0 + self.in_container_literal_block = 0 + self.in_term = 0 + self.first_document = 1 + self.this_is_the_title = 1 + self.literal_whitespace = 0 + self.no_contractions = 0 + self.compact_list = 0 + self.first_param = 0 + self.remember_multirow = {} + self.remember_multirowcol = {} + # sort out some elements papersize = builder.config.latex_paper_size + 'paper' if papersize == 'paper': # e.g. command line "-D latex_paper_size=" @@ -366,6 +384,8 @@ class LaTeXTranslator(nodes.NodeVisitor): if getattr(document.settings, 'contentsname', None): self.elements['contentsname'] = \ self.babel_renewcommand('\\contentsname', document.settings.contentsname) + self.elements['pageautorefname'] = \ + self.babel_defmacro('\\pageautorefname', self.encode(_('page'))) self.elements['numfig_format'] = self.generate_numfig_format(builder) # allow the user to override them all self.elements.update(builder.config.latex_elements) @@ -411,21 +431,6 @@ class LaTeXTranslator(nodes.NodeVisitor): self.next_figure_ids = set() self.next_table_ids = set() self.next_literal_ids = set() - # flags - self.in_title = 0 - self.in_production_list = 0 - self.in_footnote = 0 - self.in_caption = 0 - self.in_container_literal_block = 0 - self.in_term = 0 - self.first_document = 1 - self.this_is_the_title = 1 - self.literal_whitespace = 0 - self.no_contractions = 0 - self.compact_list = 0 - self.first_param = 0 - self.remember_multirow = {} - self.remember_multirowcol = {} def pushbody(self, newbody): self.bodystack.append(self.body) @@ -494,6 +499,16 @@ class LaTeXTranslator(nodes.NodeVisitor): return ('%s\\renewcommand{%s}{%s}%s\n' % (prefix, command, definition, suffix)) + def babel_defmacro(self, name, definition): + if self.elements['babel']: + prefix = '\\addto\\extras%s{' % self.babel.get_language() + suffix = '}' + else: # babel is disabled (mainly for Japanese environment) + prefix = '' + suffix = '' + + return ('%s\\def%s{%s}%s\n' % (prefix, name, definition, suffix)) + def generate_numfig_format(self, builder): ret = [] figure = self.builder.config.numfig_format['figure'].split('%s', 1) diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index aa443e55e..fdd735244 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -288,6 +288,7 @@ def test_babel_with_no_language_settings(app, status, warning): in result) assert '\\addto\\captionsenglish{\\renewcommand{\\figurename}{Fig. }}\n' in result assert '\\addto\\captionsenglish{\\renewcommand{\\tablename}{Table. }}\n' in result + assert '\\addto\\extrasenglish{\\def\\pageautorefname{page}}\n' in result @with_app(buildername='latex', testroot='latex-babel', @@ -306,6 +307,7 @@ def test_babel_with_language_de(app, status, warning): in result) assert '\\addto\\captionsngerman{\\renewcommand{\\figurename}{Fig. }}\n' in result assert '\\addto\\captionsngerman{\\renewcommand{\\tablename}{Table. }}\n' in result + assert '\\addto\\extrasngerman{\\def\\pageautorefname{page}}\n' in result @with_app(buildername='latex', testroot='latex-babel', @@ -324,6 +326,7 @@ def test_babel_with_language_ru(app, status, warning): in result) assert '\\addto\\captionsrussian{\\renewcommand{\\figurename}{Fig. }}\n' in result assert '\\addto\\captionsrussian{\\renewcommand{\\tablename}{Table. }}\n' in result + assert '\\addto\\extrasrussian{\\def\\pageautorefname{page}}\n' in result @with_app(buildername='latex', testroot='latex-babel', @@ -341,6 +344,7 @@ def test_babel_with_language_ja(app, status, warning): assert '\\renewcommand{\\contentsname}{Table of content}\n' in result assert '\\renewcommand{\\figurename}{Fig. }\n' in result assert '\\renewcommand{\\tablename}{Table. }\n' in result + assert '\\def\\pageautorefname{page}\n' in result @with_app(buildername='latex', testroot='latex-babel', @@ -359,6 +363,7 @@ def test_babel_with_unknown_language(app, status, warning): in result) assert '\\addto\\captionsenglish{\\renewcommand{\\figurename}{Fig. }}\n' in result assert '\\addto\\captionsenglish{\\renewcommand{\\tablename}{Table. }}\n' in result + assert '\\addto\\extrasenglish{\\def\\pageautorefname{page}}\n' in result assert "WARNING: no Babel option known for language 'unknown'" in warning.getvalue() From 8167a9b7ad8d4256f785df37e670eb6fce959e6e Mon Sep 17 00:00:00 2001 From: Georg Brandl <georg@python.org> Date: Sun, 17 Jan 2016 09:08:29 +0100 Subject: [PATCH 183/238] Closes #2243: ignore strange docstring types in class docs, like already done for method docs. --- CHANGES | 1 + sphinx/ext/autodoc.py | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index b6e8a953f..3e3238387 100644 --- a/CHANGES +++ b/CHANGES @@ -9,6 +9,7 @@ Bugs fixed * Fix line numbers was not shown on warnings in LaTeX and texinfo builders * Fix line numbers was not shown on warnings of indecies * #2026: Fix LaTeX builder rais error if parsed-literal includes links +* #2243: Ignore strange docstring types for classes, do not crash Release 1.3.4 (released Jan 12, 2016) ===================================== diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py index 929ae758d..f906d9666 100644 --- a/sphinx/ext/autodoc.py +++ b/sphinx/ext/autodoc.py @@ -1170,9 +1170,11 @@ class ClassDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter): docstrings.append(initdocstring) doc = [] for docstring in docstrings: - if not isinstance(docstring, text_type): - docstring = force_decode(docstring, encoding) - doc.append(prepare_docstring(docstring)) + if isinstance(docstring, text_type): + doc.append(prepare_docstring(docstring, ignore)) + elif isinstance(docstring, str): # this will not trigger on Py3 + doc.append(prepare_docstring(force_decode(docstring, encoding), + ignore)) return doc def add_content(self, more_content, no_docstring=False): From 198d4a41ada737bbff02f29c350ea9641d60f6b4 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Sun, 17 Jan 2016 17:02:50 +0900 Subject: [PATCH 184/238] refs #2022: 'Thumbs.db' and '.DS_Store' are added to `exclude_patterns` default values in conf.py that will be provided on sphinx-quickstart. --- CHANGES | 2 ++ sphinx/quickstart.py | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index ae94fde8a..a7a27cee5 100644 --- a/CHANGES +++ b/CHANGES @@ -10,6 +10,8 @@ Incompatible changes Refs #2087, #2086, #1845 and #2097. Thanks to Victor Zverovich. * #2231: Use DUrole instead of DUspan for custom roles in LaTeX writer. It enables to take title of roles as an argument of custom macros. +* #2022: 'Thumbs.db' and '.DS_Store' are added to `exclude_patterns` default values in + conf.py that will be provided on sphinx-quickstart. Features added diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index de45272ce..2f5f76cbd 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -1364,7 +1364,11 @@ def generate(d, overwrite=True, silent=False): d['exclude_patterns'] = '' else: builddir = path.join(srcdir, d['dot'] + 'build') - d['exclude_patterns'] = repr(d['dot'] + 'build') + exclude_patterns = map(repr, [ + d['dot'] + 'build', + 'Thumbs.db', '.DS_Store', + ]) + d['exclude_patterns'] = ', '.join(exclude_patterns) mkdir_p(builddir) mkdir_p(path.join(srcdir, d['dot'] + 'templates')) mkdir_p(path.join(srcdir, d['dot'] + 'static')) From a43bacdcb3d652d980cf107905b7f6eba3adddf0 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 17 Jan 2016 19:07:11 +0900 Subject: [PATCH 185/238] Update CHANGES for PR #2208 --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index a7a27cee5..8dfdb4cb6 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,8 @@ Incompatible changes title of roles as an argument of custom macros. * #2022: 'Thumbs.db' and '.DS_Store' are added to `exclude_patterns` default values in conf.py that will be provided on sphinx-quickstart. +* #2027, #2208: The ``html_title`` accepts string values only. And The None value cannot be + accepted. Features added From 78be129fc5e5881530e6dbff752dad725c12a65a Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 17 Jan 2016 19:08:42 +0900 Subject: [PATCH 186/238] Update CHANGES for #2162 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 8dfdb4cb6..fe1b9ba10 100644 --- a/CHANGES +++ b/CHANGES @@ -38,6 +38,7 @@ Features added * #2170: Support for Chinese language search index. * #2214: Add sphinx.ext.githubpages to publish the docs on GitHub Pages * #1030: Make page reference names for latex_show_pagerefs translatable +* #2162: Add Sphinx.add_source_parser() to add source_suffix and source_parsers from extension Bugs fixed ---------- From f1765c25763743edb027abe2ed504ef4f8a48775 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 1 Jan 2016 01:31:59 +0900 Subject: [PATCH 187/238] Add sphinx.parsers.Parser class; a base class for new parsers The class inherits ``docutils.parsers.Parser`` and implements ``set_application()`` in addition. It enables subclasses to read configurations, to access environments and to logging. --- sphinx/environment.py | 9 ++++++--- sphinx/parsers.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 sphinx/parsers.py diff --git a/sphinx/environment.py b/sphinx/environment.py index 58463cae8..60287031c 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -105,13 +105,16 @@ class SphinxStandaloneReader(standalone.Reader): DefaultSubstitutions, MoveModuleTargets, HandleCodeBlocks, AutoNumbering, SortIds, RemoveTranslatableInline] - def __init__(self, parsers={}, *args, **kwargs): + def __init__(self, app, parsers={}, *args, **kwargs): standalone.Reader.__init__(self, *args, **kwargs) self.parser_map = {} for suffix, parser_class in parsers.items(): if isinstance(parser_class, string_types): parser_class = import_object(parser_class, 'source parser') - self.parser_map[suffix] = parser_class() + parser = parser_class() + if hasattr(parser, 'set_application'): + parser.set_application(app) + self.parser_map[suffix] = parser def read(self, source, parser, settings): self.source = source @@ -776,7 +779,7 @@ class BuildEnvironment: codecs.register_error('sphinx', self.warn_and_replace) # publish manually - reader = SphinxStandaloneReader(parsers=self.config.source_parsers) + reader = SphinxStandaloneReader(self.app, parsers=self.config.source_parsers) pub = Publisher(reader=reader, writer=SphinxDummyWriter(), destination_class=NullOutput) diff --git a/sphinx/parsers.py b/sphinx/parsers.py new file mode 100644 index 000000000..b7ca89aa5 --- /dev/null +++ b/sphinx/parsers.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +""" + sphinx.parsers + ~~~~~~~~~~~~~~ + + A Base class for additional parsers. + + :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import docutils.parsers + + +class Parser(docutils.parsers.Parser): + """ + A base class of parsers. + """ + + def set_application(self, app): + """set_application will be called from Sphinx to set app and other instance variables + + :param sphinx.application.Sphinx app: Sphinx application object + """ + self.app = app + self.config = app.config + self.env = app.env + self.warn = app.warn + self.info = app.info From f89e3dfee3f0f65411e8518385f96d5f096e79e8 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 2 Jan 2016 16:38:17 +0900 Subject: [PATCH 188/238] Update docs about sphinx.parsers.Parser class --- doc/config.rst | 7 +++++-- doc/extdev/index.rst | 1 + doc/extdev/parserapi.rst | 8 ++++++++ sphinx/parsers.py | 17 ++++++++++++++++- 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 doc/extdev/parserapi.rst diff --git a/doc/config.rst b/doc/config.rst index 69cd066b4..a08a3e66f 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -96,8 +96,11 @@ General configuration If given, a dictionary of parser classes for different source suffices. The keys are the suffix, the values can be either a class or a string giving a - fully-qualified name of a parser class. Files with a suffix that is not in - the dictionary will be parsed with the default reStructuredText parser. + fully-qualified name of a parser class. The parser class can be either + ``docutils.parsers.Parser`` or :class:`sphinx.parsers.Parser`. Files with a + suffix that is not in the dictionary will be parsed with the default + reStructuredText parser. + For example:: diff --git a/doc/extdev/index.rst b/doc/extdev/index.rst index 5144c5f8b..b27db4b2d 100644 --- a/doc/extdev/index.rst +++ b/doc/extdev/index.rst @@ -52,4 +52,5 @@ APIs used for writing extensions builderapi markupapi domainapi + parserapi nodes diff --git a/doc/extdev/parserapi.rst b/doc/extdev/parserapi.rst new file mode 100644 index 000000000..7008a15a8 --- /dev/null +++ b/doc/extdev/parserapi.rst @@ -0,0 +1,8 @@ +.. _parser-api: + +Parser API +========== + +.. module:: sphinx.parsers + +.. autoclass:: Parser diff --git a/sphinx/parsers.py b/sphinx/parsers.py index b7ca89aa5..926de9f1c 100644 --- a/sphinx/parsers.py +++ b/sphinx/parsers.py @@ -14,7 +14,22 @@ import docutils.parsers class Parser(docutils.parsers.Parser): """ - A base class of parsers. + A base class of source parsers. The additonal parsers should inherits this class instead + of ``docutils.parsers.Parser``. Compared with ``docutils.parsers.Parser``, this class + improves accessibility to Sphinx APIs. + + The subclasses can access following objects and functions: + + self.app + The application object (:class:`sphinx.application.Sphinx`) + self.config + The config object (:class:`sphinx.config.Config`) + self.env + The environment object (:class:`sphinx.environment.BuildEnvironment`) + self.warn() + Emit a warning. (Same as :meth:`sphinx.application.Sphinx.warn()`) + self.info() + Emit a informational message. (Same as :meth:`sphinx.application.Sphinx.info()`) """ def set_application(self, app): From 492f60c37185dccee1e42c01fb5d87ed42f45608 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 17 Jan 2016 19:19:29 +0900 Subject: [PATCH 189/238] Update CHANGES for PR #2207 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index fe1b9ba10..8aa32fac4 100644 --- a/CHANGES +++ b/CHANGES @@ -39,6 +39,7 @@ Features added * #2214: Add sphinx.ext.githubpages to publish the docs on GitHub Pages * #1030: Make page reference names for latex_show_pagerefs translatable * #2162: Add Sphinx.add_source_parser() to add source_suffix and source_parsers from extension +* #2207: Add sphinx.parsers.Parser class; a base class for new parsers Bugs fixed ---------- From 14f58e66199393a2fb4903dc807c82ca56951340 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 6 Jan 2016 21:56:21 +0900 Subject: [PATCH 190/238] ``sphinx.ext.graphviz``: show graph image in inline by default To support subsutituion syntax, make graphviz node inline (ref: #1149). Now graphviz directive behaves like ``image`` directive when no captions. If specified, it generates ``figure`` node and ``caption`` node like ``figure`` directive. --- CHANGES | 2 +- sphinx/ext/graphviz.py | 32 +++++++++++++++---------- tests/roots/test-ext-graphviz/conf.py | 8 +++++++ tests/roots/test-ext-graphviz/index.rst | 6 +++++ tests/test_ext_graphviz.py | 25 ++++++++++++++++--- 5 files changed, 56 insertions(+), 17 deletions(-) diff --git a/CHANGES b/CHANGES index 8aa32fac4..5d682ddb8 100644 --- a/CHANGES +++ b/CHANGES @@ -14,7 +14,7 @@ Incompatible changes conf.py that will be provided on sphinx-quickstart. * #2027, #2208: The ``html_title`` accepts string values only. And The None value cannot be accepted. - +* ``sphinx.ext.graphviz``: show graph image in inline by default Features added -------------- diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py index 3701d40fe..f795976e7 100644 --- a/sphinx/ext/graphviz.py +++ b/sphinx/ext/graphviz.py @@ -36,7 +36,7 @@ class GraphvizError(SphinxError): category = 'Graphviz error' -class graphviz(nodes.General, nodes.Element): +class graphviz(nodes.General, nodes.Inline, nodes.Element): pass @@ -102,7 +102,7 @@ class Graphviz(Directive): node['inline'] = 'inline' in self.options caption = self.options.get('caption') - if caption and not node['inline']: + if caption: node = figure_wrapper(self, node, caption) return [node] @@ -132,7 +132,7 @@ class GraphvizSimple(Directive): node['inline'] = 'inline' in self.options caption = self.options.get('caption') - if caption and not node['inline']: + if caption: node = figure_wrapper(self, node, caption) return [node] @@ -197,6 +197,15 @@ def render_dot(self, code, options, format, prefix='graphviz'): return relfn, outfn +def warn_for_deprecated_option(self, node): + if hasattr(self.builder, '_graphviz_warned_inline'): + return + + if 'inline' in node: + self.builder.warn(':inline: option for graphviz is deprecated since version 1.4.0.') + self.builder._graphviz_warned_inline = True + + def render_dot_html(self, node, code, options, prefix='graphviz', imgcls=None, alt=None): format = self.builder.config.graphviz_output_format @@ -209,13 +218,6 @@ def render_dot_html(self, node, code, options, prefix='graphviz', self.builder.warn('dot code %r: ' % code + str(exc)) raise nodes.SkipNode - inline = node.get('inline', False) - if inline: - wrapper = 'span' - else: - wrapper = 'p' - - self.body.append(self.starttag(node, wrapper, CLASS='graphviz')) if fname is None: self.body.append(self.encode(code)) else: @@ -243,11 +245,11 @@ def render_dot_html(self, node, code, options, prefix='graphviz', (fname, alt, mapname, imgcss)) self.body.extend([item.decode('utf-8') for item in imgmap]) - self.body.append('</%s>\n' % wrapper) raise nodes.SkipNode def html_visit_graphviz(self, node): + warn_for_deprecated_option(self, node) render_dot_html(self, node, node['code'], node['options']) @@ -258,8 +260,8 @@ def render_dot_latex(self, node, code, options, prefix='graphviz'): self.builder.warn('dot code %r: ' % code + str(exc)) raise nodes.SkipNode - inline = node.get('inline', False) - if inline: + is_inline = self.is_inline(node) + if is_inline: para_separator = '' else: para_separator = '\n' @@ -271,6 +273,7 @@ def render_dot_latex(self, node, code, options, prefix='graphviz'): def latex_visit_graphviz(self, node): + warn_for_deprecated_option(self, node) render_dot_latex(self, node, node['code'], node['options']) @@ -286,10 +289,12 @@ def render_dot_texinfo(self, node, code, options, prefix='graphviz'): def texinfo_visit_graphviz(self, node): + warn_for_deprecated_option(self, node) render_dot_texinfo(self, node, node['code'], node['options']) def text_visit_graphviz(self, node): + warn_for_deprecated_option(self, node) if 'alt' in node.attributes: self.add_text(_('[graph: %s]') % node['alt']) else: @@ -298,6 +303,7 @@ def text_visit_graphviz(self, node): def man_visit_graphviz(self, node): + warn_for_deprecated_option(self, node) if 'alt' in node.attributes: self.body.append(_('[graph: %s]') % node['alt']) else: diff --git a/tests/roots/test-ext-graphviz/conf.py b/tests/roots/test-ext-graphviz/conf.py index 6dce9d0c6..6754fbab6 100644 --- a/tests/roots/test-ext-graphviz/conf.py +++ b/tests/roots/test-ext-graphviz/conf.py @@ -2,4 +2,12 @@ extensions = ['sphinx.ext.graphviz'] master_doc = 'index' +<<<<<<< 492f60c37185dccee1e42c01fb5d87ed42f45608 exclude_patterns = ['_build'] +======= + +latex_documents = [ + (master_doc, 'SphinxTests.tex', 'Sphinx Tests Documentation', + 'Georg Brandl', 'manual'), +] +>>>>>>> ``sphinx.ext.graphviz``: show graph image in inline by default diff --git a/tests/roots/test-ext-graphviz/index.rst b/tests/roots/test-ext-graphviz/index.rst index 39c755e9d..62eca8790 100644 --- a/tests/roots/test-ext-graphviz/index.rst +++ b/tests/roots/test-ext-graphviz/index.rst @@ -5,3 +5,9 @@ graphviz :caption: caption of graph bar -> baz + +.. |graph| digraph:: bar + + bar -> baz + +Hello |graph| graphviz world diff --git a/tests/test_ext_graphviz.py b/tests/test_ext_graphviz.py index d1e86937c..d39adccd1 100644 --- a/tests/test_ext_graphviz.py +++ b/tests/test_ext_graphviz.py @@ -15,12 +15,31 @@ from util import with_app, SkipTest @with_app('html', testroot='ext-graphviz') -def test_graphviz(app, status, warning): +def test_graphviz_html(app, status, warning): app.builder.build_all() if "dot command 'dot' cannot be run" in warning.getvalue(): raise SkipTest('graphviz "dot" is not available') content = (app.outdir / 'index.html').text() - html = ('<p class="graphviz">\s*<img .*?/>\s*</p>\s*' - '<p class="caption"><span class="caption-text">caption of graph</span>') + html = ('<div class="figure" .*?>\s*<img .*?/>\s*<p class="caption">' + '<span class="caption-text">caption of graph</span>.*</p>\s*</div>') assert re.search(html, content, re.S) + + html = 'Hello <img .*?/>\n graphviz world' + assert re.search(html, content, re.S) + + +@with_app('latex', testroot='ext-graphviz') +def test_graphviz_latex(app, status, warning): + app.builder.build_all() + if "dot command 'dot' cannot be run" in warning.getvalue(): + raise SkipTest('graphviz "dot" is not available') + + content = (app.outdir / 'SphinxTests.tex').text() + macro = ('\\\\begin{figure}\[htbp\]\n\\\\centering\n\\\\capstart\n\n' + '\\\\includegraphics{graphviz-\w+.pdf}\n' + '\\\\caption{caption of graph}\\\\end{figure}') + assert re.search(macro, content, re.S) + + macro = 'Hello \\\\includegraphics{graphviz-\w+.pdf} graphviz world' + assert re.search(macro, content, re.S) From f44fd9f9949f1d324dd32ef4d757db0fc20d5d03 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 17 Jan 2016 19:38:05 +0900 Subject: [PATCH 191/238] Fix broken test by 14f58e66199393a2fb4903dc807c82ca56951340 --- tests/roots/test-ext-graphviz/conf.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/roots/test-ext-graphviz/conf.py b/tests/roots/test-ext-graphviz/conf.py index 6754fbab6..2696280ee 100644 --- a/tests/roots/test-ext-graphviz/conf.py +++ b/tests/roots/test-ext-graphviz/conf.py @@ -2,12 +2,9 @@ extensions = ['sphinx.ext.graphviz'] master_doc = 'index' -<<<<<<< 492f60c37185dccee1e42c01fb5d87ed42f45608 exclude_patterns = ['_build'] -======= latex_documents = [ (master_doc, 'SphinxTests.tex', 'Sphinx Tests Documentation', 'Georg Brandl', 'manual'), ] ->>>>>>> ``sphinx.ext.graphviz``: show graph image in inline by default From 50426a711c6312116775838733e74f97b3d18e12 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 8 Jan 2016 22:17:45 +0900 Subject: [PATCH 192/238] Fix #2060: ``:manpage:`` role uses incorrect style (node) It should be use bold style to reference man pages in man format. On other formats, it is still represented as emphasis. --- sphinx/addnodes.py | 4 ++++ sphinx/roles.py | 2 +- sphinx/writers/html.py | 6 ++++++ sphinx/writers/latex.py | 6 ++++++ sphinx/writers/manpage.py | 6 ++++++ sphinx/writers/texinfo.py | 6 ++++++ sphinx/writers/text.py | 6 ++++++ tests/test_build_manpage.py | 1 + 8 files changed, 36 insertions(+), 1 deletion(-) diff --git a/sphinx/addnodes.py b/sphinx/addnodes.py index f5ad7adad..3ff5772ca 100644 --- a/sphinx/addnodes.py +++ b/sphinx/addnodes.py @@ -212,6 +212,10 @@ class termsep(nodes.Structural, nodes.Element): """Separates two terms within a <term> node.""" +class manpage(nodes.Inline, nodes.TextElement): + """Node for references to manpages.""" + + # make the new nodes known to docutils; needed because the HTML writer will # choke at some point if these are not added nodes._add_node_class_names(k for k in globals().keys() diff --git a/sphinx/roles.py b/sphinx/roles.py index afded2961..59d69a1f1 100644 --- a/sphinx/roles.py +++ b/sphinx/roles.py @@ -29,7 +29,7 @@ generic_docroles = { 'kbd': nodes.literal, 'mailheader': addnodes.literal_emphasis, 'makevar': addnodes.literal_strong, - 'manpage': addnodes.literal_emphasis, + 'manpage': addnodes.manpage, 'mimetype': addnodes.literal_emphasis, 'newsgroup': addnodes.literal_emphasis, 'program': addnodes.literal_strong, # XXX should be an x-ref diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py index d647898f1..bd65fc52e 100644 --- a/sphinx/writers/html.py +++ b/sphinx/writers/html.py @@ -640,6 +640,12 @@ class HTMLTranslator(BaseTranslator): self.body.append('<br />') raise nodes.SkipNode + def visit_manpage(self, node): + return self.visit_literal_emphasis(node) + + def depart_manpage(self, node): + return self.depart_literal_emphasis(node) + def depart_title(self, node): close_tag = self.context[-1] if (self.permalink_text and self.builder.add_permalinks and diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 96d9e03a6..6286688a5 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -1666,6 +1666,12 @@ class LaTeXTranslator(nodes.NodeVisitor): def depart_abbreviation(self, node): self.body.append(self.context.pop()) + def visit_manpage(self, node): + return self.visit_literal_emphasis(node) + + def depart_manpage(self, node): + return self.depart_literal_emphasis(node) + def visit_title_reference(self, node): self.body.append(r'\emph{') diff --git a/sphinx/writers/manpage.py b/sphinx/writers/manpage.py index 0da784a27..d1c65bfb7 100644 --- a/sphinx/writers/manpage.py +++ b/sphinx/writers/manpage.py @@ -375,6 +375,12 @@ class ManualPageTranslator(BaseTranslator): def depart_abbreviation(self, node): pass + def visit_manpage(self, node): + return self.visit_strong(node) + + def depart_manpage(self, node): + return self.depart_strong(node) + # overwritten: handle section titles better than in 0.6 release def visit_title(self, node): if isinstance(node.parent, addnodes.seealso): diff --git a/sphinx/writers/texinfo.py b/sphinx/writers/texinfo.py index 61e8a5eaf..14345e664 100644 --- a/sphinx/writers/texinfo.py +++ b/sphinx/writers/texinfo.py @@ -1476,6 +1476,12 @@ class TexinfoTranslator(nodes.NodeVisitor): def depart_abbreviation(self, node): self.body.append(self.context.pop()) + def visit_manpage(self, node): + return self.visit_literal_emphasis(node) + + def depart_manpage(self, node): + return self.depart_literal_emphasis(node) + def visit_download_reference(self, node): pass diff --git a/sphinx/writers/text.py b/sphinx/writers/text.py index 2fea7c6d8..1e8bbf023 100644 --- a/sphinx/writers/text.py +++ b/sphinx/writers/text.py @@ -861,6 +861,12 @@ class TextTranslator(nodes.NodeVisitor): if node.hasattr('explanation'): self.add_text(' (%s)' % node['explanation']) + def visit_manpage(self, node): + return self.visit_literal_emphasis(node) + + def depart_manpage(self, node): + return self.depart_literal_emphasis(node) + def visit_title_reference(self, node): self.add_text('*') diff --git a/tests/test_build_manpage.py b/tests/test_build_manpage.py index f42fee9cf..26fa8c494 100644 --- a/tests/test_build_manpage.py +++ b/tests/test_build_manpage.py @@ -20,3 +20,4 @@ def test_all(app, status, warning): content = (app.outdir / 'SphinxTests.1').text() assert r'\fBprint \fP\fIi\fP\fB\en\fP' in content + assert r'\fBmanpage\en\fP' in content From c5b3da32123a6e6782745359a755f58754a4bfb6 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 17 Jan 2016 20:05:51 +0900 Subject: [PATCH 193/238] Update CHANGES for #2060 --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index 5d682ddb8..e29593fcc 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,8 @@ Incompatible changes * #2027, #2208: The ``html_title`` accepts string values only. And The None value cannot be accepted. * ``sphinx.ext.graphviz``: show graph image in inline by default +* #2060, #2224: The ``manpage`` role now generate ``sphinx.addnodes.manpage`` node instead + of ``sphinx.addnodes.literal_emphasis` node. Features added -------------- From 6c0ea6718521a10b1130974a9bc3a996fdb51b45 Mon Sep 17 00:00:00 2001 From: Timotheus Kampik <timotheus.kampik@signavio.com> Date: Sun, 17 Jan 2016 17:05:28 +0100 Subject: [PATCH 194/238] make navigation with keys in basic theme non-default --- sphinx/themes/basic/static/doctools.js_t | 2 +- sphinx/themes/basic/theme.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sphinx/themes/basic/static/doctools.js_t b/sphinx/themes/basic/static/doctools.js_t index 1700e33bf..bf2856286 100644 --- a/sphinx/themes/basic/static/doctools.js_t +++ b/sphinx/themes/basic/static/doctools.js_t @@ -124,7 +124,7 @@ var Documentation = { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); - {% if not theme_nonavigationwithkeys|tobool %} + {% if theme_navigation_with_keys|tobool %} this.initOnKeyListeners(); {% endif %} }, diff --git a/sphinx/themes/basic/theme.conf b/sphinx/themes/basic/theme.conf index f25e0e2a9..c0b8edee6 100644 --- a/sphinx/themes/basic/theme.conf +++ b/sphinx/themes/basic/theme.conf @@ -6,4 +6,4 @@ pygments_style = none [options] nosidebar = false sidebarwidth = 230 -nonavigationwithkeys = false \ No newline at end of file +navigation_with_keys = False \ No newline at end of file From 34cbf3bad7e81ac0bc7994ec206df5e978e0b116 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Mon, 18 Jan 2016 11:31:48 +0900 Subject: [PATCH 195/238] Fix #2247: #2205 breaks make html for definition list with classifiers that contains regular-expression like string --- CHANGES | 2 ++ sphinx/util/nodes.py | 2 +- tests/roots/test-intl/definition_terms.po | 5 +++++ tests/roots/test-intl/definition_terms.txt | 2 ++ tests/test_intl.py | 2 ++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 3e3238387..d52c68280 100644 --- a/CHANGES +++ b/CHANGES @@ -10,6 +10,8 @@ Bugs fixed * Fix line numbers was not shown on warnings of indecies * #2026: Fix LaTeX builder rais error if parsed-literal includes links * #2243: Ignore strange docstring types for classes, do not crash +* #2247: Fix #2205 breaks make html for definition list with classifiers + that contains regular-expression like string Release 1.3.4 (released Jan 12, 2016) ===================================== diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py index 5110f0ebd..f8d2d0a93 100644 --- a/sphinx/util/nodes.py +++ b/sphinx/util/nodes.py @@ -50,7 +50,7 @@ def apply_source_workaround(node): # strip classifier from rawsource of term for classifier in reversed(node.parent.traverse(nodes.classifier)): node.rawsource = re.sub( - '\s*:\s*%s' % classifier.astext(), '', node.rawsource) + '\s*:\s*%s' % re.escape(classifier.astext()), '', node.rawsource) # workaround: recommonmark-0.2.0 doesn't set rawsource attribute if not node.rawsource: diff --git a/tests/roots/test-intl/definition_terms.po b/tests/roots/test-intl/definition_terms.po index 8a8199378..1752dd66f 100644 --- a/tests/roots/test-intl/definition_terms.po +++ b/tests/roots/test-intl/definition_terms.po @@ -40,3 +40,8 @@ msgstr "CLASSIFIER1" msgid "classifier2" msgstr "CLASSIFIER2" +msgid "Some term with" +msgstr "SOME TERM WITH" + +msgid "classifier[]" +msgstr "CLASSIFIER[]" diff --git a/tests/roots/test-intl/definition_terms.txt b/tests/roots/test-intl/definition_terms.txt index e85953024..4c562881a 100644 --- a/tests/roots/test-intl/definition_terms.txt +++ b/tests/roots/test-intl/definition_terms.txt @@ -12,3 +12,5 @@ Some *term* `with link <http://sphinx-doc.org/>`__ Some **term** with : classifier1 : classifier2 The corresponding definition +Some term with : classifier[] + The corresponding definition diff --git a/tests/test_intl.py b/tests/test_intl.py index aab547c36..4c665d413 100644 --- a/tests/test_intl.py +++ b/tests/test_intl.py @@ -192,6 +192,8 @@ def test_text_builder(app, status, warning): u"\n THE CORRESPONDING DEFINITION #2\n" u"\nSOME **TERM** WITH : CLASSIFIER1 : CLASSIFIER2" u"\n THE CORRESPONDING DEFINITION\n" + u"\nSOME TERM WITH : CLASSIFIER[]" + u"\n THE CORRESPONDING DEFINITION\n" ) yield assert_equal, result, expect From 5574aba60ed76f2bae947722122ac4d71ab8ed5a Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Mon, 18 Jan 2016 12:38:02 +0900 Subject: [PATCH 196/238] Fix tests are broken with pygments-2.1 --- tests/test_build_html.py | 2 +- tests/test_intl.py | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/test_build_html.py b/tests/test_build_html.py index e3307615d..17ea08944 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -82,7 +82,7 @@ HTML_XPATH = { (".//a[@href='_downloads/img1.png']", ''), (".//pre", u'"quotes"'), (".//pre", u"'included'"), - (".//pre/span[@class='s']", u'üöä'), + (".//pre/span[@class='s2']", u'üöä'), (".//div[@class='inc-pyobj1 highlight-text']//pre", r'^class Foo:\n pass\n\s*$'), (".//div[@class='inc-pyobj2 highlight-text']//pre", diff --git a/tests/test_intl.py b/tests/test_intl.py index 4c665d413..b24ec65d2 100644 --- a/tests/test_intl.py +++ b/tests/test_intl.py @@ -694,14 +694,15 @@ def test_additional_targets_should_not_be_translated(app, status, warning): yield assert_count(expected_expr, result, 1) # C code block with lang should not be translated but be *C* highlighted - expected_expr = """<span class="cp">#include <stdio.h></span>""" + expected_expr = ("""<span class="cp">#include</span> """ + """<span class="cpf"><stdio.h></span>""") yield assert_count(expected_expr, result, 1) # doctest block should not be translated but be highlighted expected_expr = ( """<span class="gp">>>> </span>""" """<span class="kn">import</span> <span class="nn">sys</span> """ - """<span class="c"># sys importing</span>""") + """<span class="c1"># sys importing</span>""") yield assert_count(expected_expr, result, 1) ## raw.txt @@ -754,14 +755,15 @@ def test_additional_targets_should_be_translated(app, status, warning): yield assert_count(expected_expr, result, 1) # C code block with lang should be translated and be *C* highlighted - expected_expr = """<span class="cp">#include <STDIO.H></span>""" + expected_expr = ("""<span class="cp">#include</span> """ + """<span class="cpf"><STDIO.H></span>""") yield assert_count(expected_expr, result, 1) # doctest block should not be translated but be highlighted expected_expr = ( """<span class="gp">>>> </span>""" """<span class="kn">import</span> <span class="nn">sys</span> """ - """<span class="c"># SYS IMPORTING</span>""") + """<span class="c1"># SYS IMPORTING</span>""") yield assert_count(expected_expr, result, 1) ## raw.txt From 0329edc5107bae03342e7ca446a3d03ab8adeb13 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Mon, 18 Jan 2016 15:31:44 +0900 Subject: [PATCH 197/238] Fix #1565: Show warning if Pygments throws an ErrorToken --- CHANGES | 1 + sphinx/highlighting.py | 6 +++++- tests/root/markup.txt | 6 ++++++ tests/test_build_html.py | 3 ++- tests/test_build_latex.py | 1 + 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index d52c68280..c64d86ddc 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,7 @@ Bugs fixed * #2243: Ignore strange docstring types for classes, do not crash * #2247: Fix #2205 breaks make html for definition list with classifiers that contains regular-expression like string +* #1565: Show warning if Pygments throws an ErrorToken Release 1.3.4 (released Jan 12, 2016) ===================================== diff --git a/sphinx/highlighting.py b/sphinx/highlighting.py index 5d2f686dc..aa78b5b2e 100644 --- a/sphinx/highlighting.py +++ b/sphinx/highlighting.py @@ -183,9 +183,13 @@ class PygmentsBridge(object): formatter = self.get_formatter(**kwargs) try: hlsource = highlight(source, lexer, formatter) - except ErrorToken: + except ErrorToken as exc: # this is most probably not the selected language, # so let it pass unhighlighted + if warn: + warn('Could not parse literal_block as "%s". highlighting skipped.' % lang) + else: + raise exc hlsource = highlight(source, lexers['none'], formatter) if self.dest == 'html': return hlsource diff --git a/tests/root/markup.txt b/tests/root/markup.txt index b322b39fa..1700b3844 100644 --- a/tests/root/markup.txt +++ b/tests/root/markup.txt @@ -266,6 +266,12 @@ Code blocks false end +.. code-block:: c + + import sys + + sys.stdout.write('hello world!\n') + Misc stuff ---------- diff --git a/tests/test_build_html.py b/tests/test_build_html.py index 17ea08944..b97d9d57e 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -31,13 +31,14 @@ http://www.python.org/logo.png reading included file u'.*?wrongenc.inc' seems to be wrong, try giving an \ :encoding: option\\n? %(root)s/includes.txt:4: WARNING: download file not readable: .*?nonexisting.png -(%(root)s/markup.txt:351: WARNING: invalid single index entry u'')? +(%(root)s/markup.txt:357: WARNING: invalid single index entry u'')? (%(root)s/undecodable.txt:3: WARNING: undecodable source characters, replacing \ with "\\?": b?'here: >>>(\\\\|/)xbb<<<' )?""" HTML_WARNINGS = ENV_WARNINGS + """\ %(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*' +%(root)s/markup.txt:269: WARNING: Could not parse literal_block as "c". highlighting skipped. %(root)s/footnote.txt:60: WARNING: citation not found: missing %(root)s/markup.txt:158: WARNING: unknown option: &option """ diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 5de1c8624..16f55471f 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -27,6 +27,7 @@ LATEX_WARNINGS = ENV_WARNINGS + """\ %(root)s/markup.txt:158: WARNING: unknown option: &option %(root)s/footnote.txt:60: WARNING: citation not found: missing %(root)s/images.txt:20: WARNING: no matching candidate for image URI u'foo.\\*' +%(root)s/markup.txt:269: WARNING: Could not parse literal_block as "c". highlighting skipped. """ if PY3: From 8c930a39183727b75217d395e1d183e1887b81b3 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Mon, 18 Jan 2016 18:18:46 +0900 Subject: [PATCH 198/238] Fix typo in CHANGES --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index e29593fcc..ef561b8b2 100644 --- a/CHANGES +++ b/CHANGES @@ -6,7 +6,7 @@ Incompatible changes * Drop ``PorterStemmer`` package support. Use ``PyStemmer`` instead of ``PorterStemmer`` to accelerate stemming. -* Now sphinx_rtd_theme become optional. Please install it manually. +* sphinx_rtd_theme has become optional. Please install it manually. Refs #2087, #2086, #1845 and #2097. Thanks to Victor Zverovich. * #2231: Use DUrole instead of DUspan for custom roles in LaTeX writer. It enables to take title of roles as an argument of custom macros. From ed527f86f173c2494625a6ebced75afceda9ec9b Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Mon, 18 Jan 2016 18:49:37 +0900 Subject: [PATCH 199/238] Fix typo in CHANGES --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 2bc5eae09..1cd178b31 100644 --- a/CHANGES +++ b/CHANGES @@ -16,7 +16,7 @@ Incompatible changes accepted. * ``sphinx.ext.graphviz``: show graph image in inline by default * #2060, #2224: The ``manpage`` role now generate ``sphinx.addnodes.manpage`` node instead - of ``sphinx.addnodes.literal_emphasis` node. + of ``sphinx.addnodes.literal_emphasis`` node. Features added -------------- From e4480baa98ff39b393ef8e2fc71175fe60f8cbef Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Mon, 18 Jan 2016 23:18:43 +0900 Subject: [PATCH 200/238] Fix #2221: graphviz always warns about :inline: option --- sphinx/ext/graphviz.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py index f795976e7..187759b55 100644 --- a/sphinx/ext/graphviz.py +++ b/sphinx/ext/graphviz.py @@ -99,7 +99,8 @@ class Graphviz(Directive): node['options'] = [] if 'alt' in self.options: node['alt'] = self.options['alt'] - node['inline'] = 'inline' in self.options + if 'inline' in self.options: + node['inline'] = True caption = self.options.get('caption') if caption: @@ -129,7 +130,8 @@ class GraphvizSimple(Directive): node['options'] = [] if 'alt' in self.options: node['alt'] = self.options['alt'] - node['inline'] = 'inline' in self.options + if 'inline' in self.options: + node['inline'] = True caption = self.options.get('caption') if caption: From 388ee36d9f3f9405c68a1d2bf61fb6fdf6830b7f Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Mon, 18 Jan 2016 23:25:28 +0900 Subject: [PATCH 201/238] Remove unused variable: _graphviz_warned_ps2pdf --- sphinx/ext/graphviz.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py index 187759b55..e10901855 100644 --- a/sphinx/ext/graphviz.py +++ b/sphinx/ext/graphviz.py @@ -153,8 +153,7 @@ def render_dot(self, code, options, format, prefix='graphviz'): if path.isfile(outfn): return relfn, outfn - if hasattr(self.builder, '_graphviz_warned_dot') or \ - hasattr(self.builder, '_graphviz_warned_ps2pdf'): + if hasattr(self.builder, '_graphviz_warned_dot'): return None, None ensuredir(path.dirname(outfn)) From 4c4450d958b8bffaf7db62466ec4652e562cd649 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Mon, 18 Jan 2016 23:56:05 +0900 Subject: [PATCH 202/238] Fix #656: Add ``graphviz_dot`` option to graphviz directives to switch the ``dot`` command --- CHANGES | 1 + doc/ext/graphviz.rst | 4 ++++ sphinx/ext/graphviz.py | 27 ++++++++++++++++--------- tests/roots/test-ext-graphviz/index.rst | 5 +++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 1cd178b31..bc328a833 100644 --- a/CHANGES +++ b/CHANGES @@ -42,6 +42,7 @@ Features added * #1030: Make page reference names for latex_show_pagerefs translatable * #2162: Add Sphinx.add_source_parser() to add source_suffix and source_parsers from extension * #2207: Add sphinx.parsers.Parser class; a base class for new parsers +* #656: Add ``graphviz_dot`` option to graphviz directives to switch the ``dot`` command Bugs fixed ---------- diff --git a/doc/ext/graphviz.rst b/doc/ext/graphviz.rst index db7fe7ea6..57371cc01 100644 --- a/doc/ext/graphviz.rst +++ b/doc/ext/graphviz.rst @@ -87,6 +87,10 @@ It adds these directives: caption to the diagram. Naturally, diagrams marked as "inline" cannot have a caption. +.. versionchanged:: 1.4 + All three directives support a ``graphviz_dot`` option that can be switch the + ``dot`` command within the directive. + There are also these new config values: .. confval:: graphviz_dot diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py index e10901855..e486310b1 100644 --- a/sphinx/ext/graphviz.py +++ b/sphinx/ext/graphviz.py @@ -66,6 +66,7 @@ class Graphviz(Directive): 'alt': directives.unchanged, 'inline': directives.flag, 'caption': directives.unchanged, + 'graphviz_dot': directives.unchanged, } def run(self): @@ -96,7 +97,9 @@ class Graphviz(Directive): line=self.lineno)] node = graphviz() node['code'] = dotcode - node['options'] = [] + node['options'] = {} + if 'graphviz_dot' in self.options: + node['options']['graphviz_dot'] = self.options['graphviz_dot'] if 'alt' in self.options: node['alt'] = self.options['alt'] if 'inline' in self.options: @@ -121,13 +124,16 @@ class GraphvizSimple(Directive): 'alt': directives.unchanged, 'inline': directives.flag, 'caption': directives.unchanged, + 'graphviz_dot': directives.unchanged, } def run(self): node = graphviz() node['code'] = '%s %s {\n%s\n}\n' % \ (self.name, self.arguments[0], '\n'.join(self.content)) - node['options'] = [] + node['options'] = {} + if 'graphviz_dot' in self.options: + node['options']['graphviz_dot'] = self.options['graphviz_dot'] if 'alt' in self.options: node['alt'] = self.options['alt'] if 'inline' in self.options: @@ -142,8 +148,8 @@ class GraphvizSimple(Directive): def render_dot(self, code, options, format, prefix='graphviz'): """Render graphviz code into a PNG or PDF output file.""" - hashkey = (code + str(options) + - str(self.builder.config.graphviz_dot) + + graphviz_dot = options.get('graphviz_dot', self.builder.config.graphviz_dot) + hashkey = (code + str(options) + str(graphviz_dot) + str(self.builder.config.graphviz_dot_args)).encode('utf-8') fname = '%s-%s.%s' % (prefix, sha1(hashkey).hexdigest(), format) @@ -153,7 +159,8 @@ def render_dot(self, code, options, format, prefix='graphviz'): if path.isfile(outfn): return relfn, outfn - if hasattr(self.builder, '_graphviz_warned_dot'): + if (hasattr(self.builder, '_graphviz_warned_dot') and + self.builder._graphviz_warned_dot[graphviz_dot]): return None, None ensuredir(path.dirname(outfn)) @@ -162,9 +169,8 @@ def render_dot(self, code, options, format, prefix='graphviz'): if isinstance(code, text_type): code = code.encode('utf-8') - dot_args = [self.builder.config.graphviz_dot] + dot_args = [graphviz_dot] dot_args.extend(self.builder.config.graphviz_dot_args) - dot_args.extend(options) dot_args.extend(['-T' + format, '-o' + outfn]) if format == 'png': dot_args.extend(['-Tcmapx', '-o%s.map' % outfn]) @@ -174,9 +180,10 @@ def render_dot(self, code, options, format, prefix='graphviz'): if err.errno != ENOENT: # No such file or directory raise self.builder.warn('dot command %r cannot be run (needed for graphviz ' - 'output), check the graphviz_dot setting' % - self.builder.config.graphviz_dot) - self.builder._graphviz_warned_dot = True + 'output), check the graphviz_dot setting' % graphviz_dot) + if not hasattr(self.builder, '_graphviz_warned_dot'): + self.builder._graphviz_warned_dot = {} + self.builder._graphviz_warned_dot[graphviz_dot] = True return None, None try: # Graphviz may close standard input when an error occurs, diff --git a/tests/roots/test-ext-graphviz/index.rst b/tests/roots/test-ext-graphviz/index.rst index 62eca8790..c04ca42a0 100644 --- a/tests/roots/test-ext-graphviz/index.rst +++ b/tests/roots/test-ext-graphviz/index.rst @@ -11,3 +11,8 @@ graphviz bar -> baz Hello |graph| graphviz world + +.. digraph:: foo + :graphviz_dot: neato + + bar -> baz From 0cbb29e3423dfe88dfb7464e80e179548a75d248 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 19 Jan 2016 00:53:10 +0900 Subject: [PATCH 203/238] Update docs for #2221 --- doc/ext/graphviz.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/ext/graphviz.rst b/doc/ext/graphviz.rst index 57371cc01..ca34fa281 100644 --- a/doc/ext/graphviz.rst +++ b/doc/ext/graphviz.rst @@ -87,6 +87,11 @@ It adds these directives: caption to the diagram. Naturally, diagrams marked as "inline" cannot have a caption. +.. deprecated:: 1.4 + ``inline`` option is deprecated. + All three directives generate inline node by default. If ``caption`` is given, + these generate block node instead. + .. versionchanged:: 1.4 All three directives support a ``graphviz_dot`` option that can be switch the ``dot`` command within the directive. From 5b92c708f823b1749c102f92a22693d4b86d2c77 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Tue, 19 Jan 2016 01:10:49 +0900 Subject: [PATCH 204/238] Fix condition of graphviz warning --- sphinx/ext/graphviz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py index e486310b1..44a47d5e1 100644 --- a/sphinx/ext/graphviz.py +++ b/sphinx/ext/graphviz.py @@ -160,7 +160,7 @@ def render_dot(self, code, options, format, prefix='graphviz'): return relfn, outfn if (hasattr(self.builder, '_graphviz_warned_dot') and - self.builder._graphviz_warned_dot[graphviz_dot]): + self.builder._graphviz_warned_dot.get(graphviz_dot)): return None, None ensuredir(path.dirname(outfn)) From 540400635add4bf7e656c9d6e7d8ef3285fd6d68 Mon Sep 17 00:00:00 2001 From: Hong Xu <hong@topbug.net> Date: Sat, 9 Jan 2016 16:55:56 -0800 Subject: [PATCH 205/238] math: Add math_number_all to enforce numbering all displayed math. --- doc/ext/math.rst | 7 +++++++ sphinx/ext/imgmath.py | 3 ++- sphinx/ext/mathbase.py | 15 ++++++++++----- sphinx/ext/pngmath.py | 3 ++- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/doc/ext/math.rst b/doc/ext/math.rst index 081027b92..61fa0ca83 100644 --- a/doc/ext/math.rst +++ b/doc/ext/math.rst @@ -28,6 +28,13 @@ Keep in mind that when you put math markup in **Python docstrings** read by :mod:`autodoc <sphinx.ext.autodoc>`, you either have to double all backslashes, or use Python raw strings (``r"raw"``). +:mod:`.mathbase` provides the following config values: + +.. confval:: math_number_all + + Set this option to ``True`` if you want all displayed math to be numbered. + The default is ``False``. + :mod:`.mathbase` defines these new markup elements: .. rst:role:: math diff --git a/sphinx/ext/imgmath.py b/sphinx/ext/imgmath.py index 461cba17e..40a9c1402 100644 --- a/sphinx/ext/imgmath.py +++ b/sphinx/ext/imgmath.py @@ -242,7 +242,8 @@ def html_visit_displaymath(self, node): if node['nowrap']: latex = node['latex'] else: - latex = wrap_displaymath(node['latex'], None) + latex = wrap_displaymath(node['latex'], None, + self.builder.config.math_number_all) try: fname, depth = render_math(self, latex) except MathExtError as exc: diff --git a/sphinx/ext/mathbase.py b/sphinx/ext/mathbase.py index 5673fcf25..6dc1c7323 100644 --- a/sphinx/ext/mathbase.py +++ b/sphinx/ext/mathbase.py @@ -28,7 +28,7 @@ class eqref(nodes.Inline, nodes.TextElement): pass -def wrap_displaymath(math, label): +def wrap_displaymath(math, label, numbering): parts = math.split('\n\n') ret = [] for i, part in enumerate(parts): @@ -38,7 +38,9 @@ def wrap_displaymath(math, label): ret.append('\\begin{split}%s\\end{split}' % part + (label and '\\label{'+label+'}' or '')) else: - ret.append('\\begin{split}%s\\end{split}\\notag' % part) + ret.append(r'\begin{split}%s\end{split}' % part) + if not numbering: + ret.append(r'\notag') if not ret: return '' return '\\begin{gather}\n' + '\\\\'.join(ret) + '\n\\end{gather}' @@ -116,7 +118,8 @@ def latex_visit_displaymath(self, node): self.body.append(node['latex']) else: label = node['label'] and node['docname'] + '-' + node['label'] or None - self.body.append(wrap_displaymath(node['latex'], label)) + self.body.append(wrap_displaymath(node['latex'], label, + self.builder.config.math_number_all)) raise nodes.SkipNode @@ -194,10 +197,11 @@ def number_equations(app, doctree, docname): num = 0 numbers = {} for node in doctree.traverse(displaymath): - if node['label'] is not None: + if node['label'] is not None or app.config.math_number_all: num += 1 node['number'] = num - numbers[node['label']] = num + if node['label'] is not None: + numbers[node['label']] = num else: node['number'] = None for node in doctree.traverse(eqref): @@ -208,6 +212,7 @@ def number_equations(app, doctree, docname): def setup_math(app, htmlinlinevisitors, htmldisplayvisitors): + app.add_config_value('math_number_all', False, 'html') app.add_node(math, override=True, latex=(latex_visit_math, None), text=(text_visit_math, None), diff --git a/sphinx/ext/pngmath.py b/sphinx/ext/pngmath.py index 74ab29666..a2801bd1f 100644 --- a/sphinx/ext/pngmath.py +++ b/sphinx/ext/pngmath.py @@ -213,7 +213,8 @@ def html_visit_displaymath(self, node): if node['nowrap']: latex = node['latex'] else: - latex = wrap_displaymath(node['latex'], None) + latex = wrap_displaymath(node['latex'], None, + self.builder.config.math_number_all) try: fname, depth = render_math(self, latex) except MathExtError as exc: From a75bf5af3c8af884db1c71d38de78e074901ae71 Mon Sep 17 00:00:00 2001 From: Hong Xu <hong@topbug.net> Date: Sat, 9 Jan 2016 17:33:51 -0800 Subject: [PATCH 206/238] Refactor the tests of math extensions. --- tests/roots/test-ext-imgmath/index.rst | 6 ----- .../conf.py | 1 - tests/roots/test-ext-math/index.rst | 10 ++++++++ .../{test_ext_imgmath.py => test_ext_math.py} | 25 ++++++++++++++----- 4 files changed, 29 insertions(+), 13 deletions(-) delete mode 100644 tests/roots/test-ext-imgmath/index.rst rename tests/roots/{test-ext-imgmath => test-ext-math}/conf.py (56%) create mode 100644 tests/roots/test-ext-math/index.rst rename tests/{test_ext_imgmath.py => test_ext_math.py} (63%) diff --git a/tests/roots/test-ext-imgmath/index.rst b/tests/roots/test-ext-imgmath/index.rst deleted file mode 100644 index f7780a422..000000000 --- a/tests/roots/test-ext-imgmath/index.rst +++ /dev/null @@ -1,6 +0,0 @@ -Test imgmath -============ - -.. math:: a^2+b^2=c^2 - -Inline :math:`E=mc^2` diff --git a/tests/roots/test-ext-imgmath/conf.py b/tests/roots/test-ext-math/conf.py similarity index 56% rename from tests/roots/test-ext-imgmath/conf.py rename to tests/roots/test-ext-math/conf.py index 3f3e2a783..f81c30bc4 100644 --- a/tests/roots/test-ext-imgmath/conf.py +++ b/tests/roots/test-ext-math/conf.py @@ -1,4 +1,3 @@ # -*- coding: utf-8 -*- -extensions = ['sphinx.ext.imgmath'] master_doc = 'index' diff --git a/tests/roots/test-ext-math/index.rst b/tests/roots/test-ext-math/index.rst new file mode 100644 index 000000000..491edda95 --- /dev/null +++ b/tests/roots/test-ext-math/index.rst @@ -0,0 +1,10 @@ +Test Math +========= + +.. math:: a^2+b^2=c^2 + +Inline :math:`E=mc^2` + +Second math + +.. math:: e^{i\pi}+1=0 diff --git a/tests/test_ext_imgmath.py b/tests/test_ext_math.py similarity index 63% rename from tests/test_ext_imgmath.py rename to tests/test_ext_math.py index 2e28d2baa..84bca95a3 100644 --- a/tests/test_ext_imgmath.py +++ b/tests/test_ext_math.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- """ - test_ext_imgmath - ~~~~~~~~~~~~~~~~ + test_ext_math + ~~~~~~~~~~~~~ - Test sphinx.ext.imgmath extension. + Test math extensions. :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. @@ -14,7 +14,8 @@ import re from util import with_app, SkipTest -@with_app('html', testroot='ext-imgmath') +@with_app('html', testroot='ext-math', + confoverrides = {'extensions': ['sphinx.ext.imgmath']}) def test_imgmath_png(app, status, warning): app.builder.build_all() if "LaTeX command 'latex' cannot be run" in warning.getvalue(): @@ -27,8 +28,9 @@ def test_imgmath_png(app, status, warning): '\s*alt="a\^2\+b\^2=c\^2"/>\s*</p>\s*</div>') assert re.search(html, content, re.S) -@with_app('html', testroot='ext-imgmath', - confoverrides={'imgmath_image_format': 'svg'}) +@with_app('html', testroot='ext-math', + confoverrides={'extensions': ['sphinx.ext.imgmath'], + 'imgmath_image_format': 'svg'}) def test_imgmath_svg(app, status, warning): app.builder.build_all() if "LaTeX command 'latex' cannot be run" in warning.getvalue(): @@ -40,3 +42,14 @@ def test_imgmath_svg(app, status, warning): html = ('<div class="math">\s*<p>\s*<img src="_images/math/\w+.svg"' '\s*alt="a\^2\+b\^2=c\^2"/>\s*</p>\s*</div>') assert re.search(html, content, re.S) + +@with_app('html', testroot='ext-math', + confoverrides={'math_number_all': True, + 'extensions': ['sphinx.ext.mathjax']}) +def test_math_number_all(app, status, warning): + app.builder.build_all() + + content = (app.outdir / 'index.html').text() + html = (r'<div class="math">\s*' + r'<span class="eqno">\(1\)</span>\\\[a\^2\+b\^2=c\^2\\\]</div>') + assert re.search(html, content, re.S) From 32591a7f7787dc2dcabb0cea197a3c7c536d8ab8 Mon Sep 17 00:00:00 2001 From: Dmitry Shachnev <mitya57@gmail.com> Date: Sat, 24 Oct 2015 19:18:40 +0300 Subject: [PATCH 207/238] Make alabaster and sphinx_rtd_theme dependencies optional There is no need to pull these dependencies if i.e. the documentation is using the classic theme. There will be no change in behavior for projects using alabaster or sphinx_rtd_theme. --- sphinx/theming.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sphinx/theming.py b/sphinx/theming.py index b4d940dfe..4b885a22e 100644 --- a/sphinx/theming.py +++ b/sphinx/theming.py @@ -26,9 +26,6 @@ except ImportError: from sphinx import package_dir from sphinx.errors import ThemeError -import alabaster -import sphinx_rtd_theme - NODEFAULT = object() THEMECONF = 'theme.conf' @@ -73,10 +70,12 @@ class Theme(object): def load_extra_theme(cls, name): if name in ('alabaster', 'sphinx_rtd_theme'): if name == 'alabaster': + import alabaster themedir = alabaster.get_path() # alabaster theme also requires 'alabaster' extension, it will be loaded # at sphinx.application module. elif name == 'sphinx_rtd_theme': + import sphinx_rtd_theme themedir = sphinx_rtd_theme.get_html_theme_path() else: raise NotImplementedError('Programming Error') From e96d0d87bceb976bfa2f634412336cd8ca7a6bc4 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 20 Jan 2016 10:37:05 +0900 Subject: [PATCH 208/238] Update CHANGES for PR #1939 --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 2877569b0..7f88f33c1 100644 --- a/CHANGES +++ b/CHANGES @@ -20,7 +20,6 @@ Incompatible changes Features added -------------- -* Added the ``dummy`` builder: syntax check without output. * #2092: add todo directive support in napoleon package. * #1962: when adding directives, roles or nodes from an extension, warn if such @@ -44,6 +43,7 @@ Features added * #2162: Add Sphinx.add_source_parser() to add source_suffix and source_parsers from extension * #2207: Add sphinx.parsers.Parser class; a base class for new parsers * #656: Add ``graphviz_dot`` option to graphviz directives to switch the ``dot`` command +* #1939: Added the ``dummy`` builder: syntax check without output. Bugs fixed ---------- From b0e02b4a12873409ee11040ebfbd6b88e7b24dbd Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 20 Jan 2016 10:38:13 +0900 Subject: [PATCH 209/238] Update CHANGES for PR #2230 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 7f88f33c1..2f54670b8 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,7 @@ Features added * #2207: Add sphinx.parsers.Parser class; a base class for new parsers * #656: Add ``graphviz_dot`` option to graphviz directives to switch the ``dot`` command * #1939: Added the ``dummy`` builder: syntax check without output. +* #2230: Add ``math_number_all`` option to number all displayed math in math extensions Bugs fixed ---------- From e89d8777f2fed9a339ecc614297a967d03200123 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 20 Jan 2016 10:39:56 +0900 Subject: [PATCH 210/238] Update CHANGES for PR #2211 --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index c64d86ddc..1cde57abd 100644 --- a/CHANGES +++ b/CHANGES @@ -13,6 +13,7 @@ Bugs fixed * #2247: Fix #2205 breaks make html for definition list with classifiers that contains regular-expression like string * #1565: Show warning if Pygments throws an ErrorToken +* #2211: Fix paragraphs in table cell doesn't work in Latex output Release 1.3.4 (released Jan 12, 2016) ===================================== From 0f2e62db24aa4e484da08c558d8c873598576943 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Wed, 20 Jan 2016 22:48:16 +0900 Subject: [PATCH 211/238] Fix #2253: ``:pyobject:`` option of ``literalinclude`` directive can't detect indented body block when the block starts with blank or comment lines. --- CHANGES | 2 ++ sphinx/pycode/__init__.py | 2 +- tests/roots/test-directive-code/python.rst | 13 ++++++++++++ tests/roots/test-directive-code/target.py | 22 ++++++++++++++++++++ tests/test_directive_code.py | 24 ++++++++++++++++++++++ 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 tests/roots/test-directive-code/python.rst create mode 100644 tests/roots/test-directive-code/target.py diff --git a/CHANGES b/CHANGES index 1cde57abd..f0e7e1b2d 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,8 @@ Bugs fixed that contains regular-expression like string * #1565: Show warning if Pygments throws an ErrorToken * #2211: Fix paragraphs in table cell doesn't work in Latex output +* #2253: ``:pyobject:`` option of ``literalinclude`` directive can't detect indented + body block when the block starts with blank or comment lines. Release 1.3.4 (released Jan 12, 2016) ===================================== diff --git a/sphinx/pycode/__init__.py b/sphinx/pycode/__init__.py index 8e8ecf706..3da887d6c 100644 --- a/sphinx/pycode/__init__.py +++ b/sphinx/pycode/__init__.py @@ -300,7 +300,7 @@ class ModuleAnalyzer(object): yield tokentup tokeniter = tokeniter() for type, tok, spos, epos, line in tokeniter: - if expect_indent: + if expect_indent and type != token.NL: if type != token.INDENT: # no suite -- one-line definition assert stack diff --git a/tests/roots/test-directive-code/python.rst b/tests/roots/test-directive-code/python.rst new file mode 100644 index 000000000..794c190f1 --- /dev/null +++ b/tests/roots/test-directive-code/python.rst @@ -0,0 +1,13 @@ +=========================== +Literal Includes for python +=========================== + +block start with blank or comment +================================= + +.. literalinclude:: target.py + :pyobject: block_start_with_comment + +.. literalinclude:: target.py + :pyobject: block_start_with_blank + diff --git a/tests/roots/test-directive-code/target.py b/tests/roots/test-directive-code/target.py new file mode 100644 index 000000000..61ad717ec --- /dev/null +++ b/tests/roots/test-directive-code/target.py @@ -0,0 +1,22 @@ +# Literally included file using Python highlighting +# -*- coding: utf-8 -*- + +foo = "Including Unicode characters: üöä" + +class Foo: + pass + +class Bar: + def baz(): + pass + +# comment after Bar class definition +def bar(): pass + +def block_start_with_comment(): + # Comment + return 1 + +def block_start_with_blank(): + + return 1 diff --git a/tests/test_directive_code.py b/tests/test_directive_code.py index 1a488b0c7..8f3fb3161 100644 --- a/tests/test_directive_code.py +++ b/tests/test_directive_code.py @@ -98,6 +98,30 @@ def test_literal_include_dedent(app, status, warning): assert blocks[5].text == '\n\n' # dedent: 1000 +@with_app('xml', testroot='directive-code') +def test_literal_include_block_start_with_comment_or_brank(app, status, warning): + app.builder.build(['python']) + et = ElementTree.parse(app.outdir / 'python.xml') + secs = et.findall('./section/section') + literal_include = secs[0].findall('literal_block') + assert len(literal_include) > 0 + actual = literal_include[0].text + expect = ( + 'def block_start_with_comment():\n' + ' # Comment\n' + ' return 1\n' + ) + assert actual == expect + + actual = literal_include[1].text + expect = ( + 'def block_start_with_blank():\n' + '\n' + ' return 1\n' + ) + assert actual == expect + + @with_app('html', testroot='directive-code') def test_literal_include_linenos(app, status, warning): app.builder.build(['linenos']) From 43c77a2838538e87b485d2d4c17150f61c1b2672 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Thu, 21 Jan 2016 11:32:25 +0900 Subject: [PATCH 212/238] Fix TOC is not shown when no ``:maxdepth:`` for toctrees (ref: #771) --- CHANGES | 1 + sphinx/builders/latex.py | 4 ++-- tests/test_build_latex.py | 22 ++++++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index f0e7e1b2d..76634d44e 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,7 @@ Bugs fixed * #2211: Fix paragraphs in table cell doesn't work in Latex output * #2253: ``:pyobject:`` option of ``literalinclude`` directive can't detect indented body block when the block starts with blank or comment lines. +* Fix TOC is not shown when no ``:maxdepth:`` for toctrees (ref: #771) Release 1.3.4 (released Jan 12, 2016) ===================================== diff --git a/sphinx/builders/latex.py b/sphinx/builders/latex.py index d50e53a61..49922dfb5 100644 --- a/sphinx/builders/latex.py +++ b/sphinx/builders/latex.py @@ -97,8 +97,8 @@ class LaTeXBuilder(Builder): self.info("processing " + targetname + "... ", nonl=1) toctrees = self.env.get_doctree(docname).traverse(addnodes.toctree) if toctrees: - if toctrees[0].get('maxdepth'): - tocdepth = int(toctrees[0].get('maxdepth')) + if toctrees[0].get('maxdepth') > 0: + tocdepth = toctrees[0].get('maxdepth') else: tocdepth = None else: diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py index 16f55471f..1957128e8 100644 --- a/tests/test_build_latex.py +++ b/tests/test_build_latex.py @@ -474,3 +474,25 @@ def test_toctree_maxdepth_howto(app, status, warning): print(status.getvalue()) print(warning.getvalue()) assert '\\setcounter{tocdepth}{2}' in result + + +@with_app(buildername='latex', testroot='toctree-maxdepth', + confoverrides={'master_doc': 'foo'}) +def test_toctree_not_found(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert '\\setcounter{tocdepth}' not in result + + +@with_app(buildername='latex', testroot='toctree-maxdepth', + confoverrides={'master_doc': 'bar'}) +def test_toctree_without_maxdepth(app, status, warning): + app.builder.build_all() + result = (app.outdir / 'Python.tex').text(encoding='utf8') + print(result) + print(status.getvalue()) + print(warning.getvalue()) + assert '\\setcounter{tocdepth}' not in result From 04a8c26eabba3e728a5b74afd15f328f9235b2d0 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Thu, 21 Jan 2016 13:51:17 +0900 Subject: [PATCH 213/238] Fix #2235: ``needs_sphinx`` supports micro version comparison --- CHANGES | 1 + doc/config.rst | 3 +++ sphinx/application.py | 2 +- tests/test_config.py | 26 +++++++++++++++++++++++++- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 2f54670b8..23f752b26 100644 --- a/CHANGES +++ b/CHANGES @@ -45,6 +45,7 @@ Features added * #656: Add ``graphviz_dot`` option to graphviz directives to switch the ``dot`` command * #1939: Added the ``dummy`` builder: syntax check without output. * #2230: Add ``math_number_all`` option to number all displayed math in math extensions +* #2235: ``needs_sphinx`` supports micro version comparison Bugs fixed ---------- diff --git a/doc/config.rst b/doc/config.rst index 542c36245..5076d62e0 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -220,6 +220,9 @@ General configuration .. versionadded:: 1.0 + .. versionchanged:: 1.4 + also accepts micro version string + .. confval:: needs_extensions This value can be a dictionary specifying version requirements for extensions diff --git a/sphinx/application.py b/sphinx/application.py index 3842b13fa..b88fb311c 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -162,7 +162,7 @@ class Sphinx(object): # check the Sphinx version if requested if self.config.needs_sphinx and \ - self.config.needs_sphinx > sphinx.__display_version__[:3]: + self.config.needs_sphinx > sphinx.__display_version__: raise VersionRequirementError( 'This project needs at least Sphinx v%s and therefore cannot ' 'be built with this version.' % self.config.needs_sphinx) diff --git a/tests/test_config.py b/tests/test_config.py index 506071d3a..b813ab557 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -10,10 +10,12 @@ :license: BSD, see LICENSE for details. """ from six import PY2, PY3, StringIO, iteritems +from mock import patch from util import TestApp, with_app, gen_with_app, with_tempdir, \ raises, raises_msg, assert_in, assert_not_in +import sphinx from sphinx.config import Config from sphinx.errors import ExtensionError, ConfigError, VersionRequirementError @@ -120,9 +122,31 @@ def test_errors_if_setup_is_not_callable(dir): raises_msg(ConfigError, 'callable', TestApp, srcdir=dir) +@patch.object(sphinx, '__display_version__', '1.3.4') def test_needs_sphinx(): + # micro version + app = TestApp(confoverrides={'needs_sphinx': '1.3.3'}) # OK: less + app.cleanup() + app = TestApp(confoverrides={'needs_sphinx': '1.3.4'}) # OK: equals + app.cleanup() raises(VersionRequirementError, TestApp, - confoverrides={'needs_sphinx': '9.9'}) + confoverrides={'needs_sphinx': '1.3.5'}) # NG: greater + + # minor version + app = TestApp(confoverrides={'needs_sphinx': '1.2'}) # OK: less + app.cleanup() + app = TestApp(confoverrides={'needs_sphinx': '1.3'}) # OK: equals + app.cleanup() + raises(VersionRequirementError, TestApp, + confoverrides={'needs_sphinx': '1.4'}) # NG: greater + + # major version + app = TestApp(confoverrides={'needs_sphinx': '0'}) # OK: less + app.cleanup() + app = TestApp(confoverrides={'needs_sphinx': '1'}) # OK: equals + app.cleanup() + raises(VersionRequirementError, TestApp, + confoverrides={'needs_sphinx': '2'}) # NG: greater @with_tempdir From 76e29ca5b3ddf0f745fdc905e36480f1e8472098 Mon Sep 17 00:00:00 2001 From: Hong Xu <hong@topbug.net> Date: Fri, 15 Jan 2016 01:39:31 -0800 Subject: [PATCH 214/238] Use "align" environment to wrap math equations instead of "gather" Using align brings the benefit when multiple math equations are in one math directive, alignment is provided. We also use "aligned" to wrap the equations since in this way all the equations will be given only one label/tag, while previously only the first equation is labeled. --- sphinx/ext/mathbase.py | 19 +++++++++++-------- tests/roots/test-ext-math/conf.py | 3 +++ tests/roots/test-ext-math/index.rst | 8 ++++++++ tests/test_ext_math.py | 7 +++++++ 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/sphinx/ext/mathbase.py b/sphinx/ext/mathbase.py index 6dc1c7323..8ede05b87 100644 --- a/sphinx/ext/mathbase.py +++ b/sphinx/ext/mathbase.py @@ -34,16 +34,19 @@ def wrap_displaymath(math, label, numbering): for i, part in enumerate(parts): if not part.strip(): continue - if label is not None and i == 0: - ret.append('\\begin{split}%s\\end{split}' % part + - (label and '\\label{'+label+'}' or '')) - else: - ret.append(r'\begin{split}%s\end{split}' % part) - if not numbering: - ret.append(r'\notag') + ret.append(r'\begin{split}%s\end{split}' % part) if not ret: return '' - return '\\begin{gather}\n' + '\\\\'.join(ret) + '\n\\end{gather}' + if label is not None or numbering: + env_begin = r'\begin{align}' + if label is not None: + env_begin += r'\label{%s}' % label + env_end = r'\end{align}' + else: + env_begin = r'\begin{align*}' + env_end = r'\end{align*}' + return ('%s\\begin{aligned}\n%s\\end{aligned}%s') % ( + env_begin, '\\\\\n'.join(ret), env_end) def math_role(role, rawtext, text, lineno, inliner, options={}, content=[]): diff --git a/tests/roots/test-ext-math/conf.py b/tests/roots/test-ext-math/conf.py index f81c30bc4..3fe886c17 100644 --- a/tests/roots/test-ext-math/conf.py +++ b/tests/roots/test-ext-math/conf.py @@ -1,3 +1,6 @@ # -*- coding: utf-8 -*- master_doc = 'index' + +latex_documents = [ + (master_doc, 'test.tex', 'Math Extension Testing', 'Sphinx', 'report')] diff --git a/tests/roots/test-ext-math/index.rst b/tests/roots/test-ext-math/index.rst index 491edda95..02f50c20a 100644 --- a/tests/roots/test-ext-math/index.rst +++ b/tests/roots/test-ext-math/index.rst @@ -8,3 +8,11 @@ Inline :math:`E=mc^2` Second math .. math:: e^{i\pi}+1=0 + +Multi math equations + +.. math:: + + S &= \pi r^2 + + V &= \frac{4}{3} \pi r^3 diff --git a/tests/test_ext_math.py b/tests/test_ext_math.py index 84bca95a3..d72da7934 100644 --- a/tests/test_ext_math.py +++ b/tests/test_ext_math.py @@ -53,3 +53,10 @@ def test_math_number_all(app, status, warning): html = (r'<div class="math">\s*' r'<span class="eqno">\(1\)</span>\\\[a\^2\+b\^2=c\^2\\\]</div>') assert re.search(html, content, re.S) + +@with_app('latex', testroot='ext-math', + confoverrides={'extensions': ['sphinx.ext.mathjax']}) +def test_math_number_all(app, status, warning): + app.builder.build_all() + + content = (app.outdir / 'test.tex').text() From 16626bd8ee9cc5c8183a9d9a10c0b81f46452c51 Mon Sep 17 00:00:00 2001 From: Jakub Wilk <jwilk@jwilk.net> Date: Thu, 21 Jan 2016 22:53:07 +0100 Subject: [PATCH 215/238] Fix typo in quickstart --- sphinx/quickstart.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index c69681d1f..f7a6731dc 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -401,7 +401,7 @@ epub_copyright = copyright # The format is a list of tuples containing the path and title. #epub_pre_files = [] -# HTML files shat should be inserted after the pages created by sphinx. +# HTML files that should be inserted after the pages created by sphinx. # The format is a list of tuples containing the path and title. #epub_post_files = [] From 1aeef288fc2f0760d4d74c43982873b7ec1243a9 Mon Sep 17 00:00:00 2001 From: Jakub Wilk <jwilk@jwilk.net> Date: Thu, 21 Jan 2016 22:53:07 +0100 Subject: [PATCH 216/238] Fix typo in quickstart --- sphinx/quickstart.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index 3ddc0c6f7..9a60785b4 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -399,7 +399,7 @@ epub_copyright = copyright # The format is a list of tuples containing the path and title. #epub_pre_files = [] -# HTML files shat should be inserted after the pages created by sphinx. +# HTML files that should be inserted after the pages created by sphinx. # The format is a list of tuples containing the path and title. #epub_post_files = [] From c84dad28e9b1fa89b4c5bf61d48f39ba62335723 Mon Sep 17 00:00:00 2001 From: Dmitry Shachnev <mitya57@gmail.com> Date: Fri, 22 Jan 2016 18:14:04 +0300 Subject: [PATCH 217/238] transforms: Don't try to call has_child on parent nodes that are None Otherwise the build can fail with the following error: File "/usr/lib/python2.7/dist-packages/sphinx/environment.py", line 791, in read_doc pub.publish() File "/usr/lib/python2.7/dist-packages/docutils/core.py", line 218, in publish self.apply_transforms() File "/usr/lib/python2.7/dist-packages/docutils/core.py", line 199, in apply_transforms self.document.transformer.apply_transforms() File "/usr/lib/python2.7/dist-packages/docutils/transforms/__init__.py", line 171, in apply_transforms transform.apply(**kwargs) File "/usr/lib/python2.7/dist-packages/sphinx/transforms.py", line 124, in apply if has_child(node.parent, nodes.caption): File "/usr/lib/python2.7/dist-packages/sphinx/transforms.py", line 117, in has_child return any(isinstance(child, cls) for child in node) TypeError: 'NoneType' object is not iterable The error could be reproduced with lp:autopilot/legacy branch from Launchpad. --- sphinx/transforms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sphinx/transforms.py b/sphinx/transforms.py index 49c0aba1e..4619449e7 100644 --- a/sphinx/transforms.py +++ b/sphinx/transforms.py @@ -121,13 +121,13 @@ class AutoNumbering(Transform): if has_child(node, nodes.caption): self.document.note_implicit_target(node) elif isinstance(node, nodes.image): - if has_child(node.parent, nodes.caption): + if node.parent and has_child(node.parent, nodes.caption): self.document.note_implicit_target(node.parent) elif isinstance(node, nodes.table): if has_child(node, nodes.title): self.document.note_implicit_target(node) elif isinstance(node, nodes.literal_block): - if has_child(node.parent, nodes.caption): + if node.parent and has_child(node.parent, nodes.caption): self.document.note_implicit_target(node.parent) From 883ae3c5a785e1b30606e38013c5c6b226664c8a Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sat, 23 Jan 2016 21:51:52 +0900 Subject: [PATCH 218/238] Fix warning message for ``:numref:`` if target is in orphaned doc (ref: #2244) --- CHANGES | 1 + sphinx/domains/std.py | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 76634d44e..32aff2b03 100644 --- a/CHANGES +++ b/CHANGES @@ -17,6 +17,7 @@ Bugs fixed * #2253: ``:pyobject:`` option of ``literalinclude`` directive can't detect indented body block when the block starts with blank or comment lines. * Fix TOC is not shown when no ``:maxdepth:`` for toctrees (ref: #771) +* Fix warning message for ``:numref:`` if target is in orphaned doc (ref: #2244) Release 1.3.4 (released Jan 12, 2016) ===================================== diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py index b60cc4eb9..425b62aa5 100644 --- a/sphinx/domains/std.py +++ b/sphinx/domains/std.py @@ -635,10 +635,18 @@ class StandardDomain(Domain): try: target_node = env.get_doctree(docname).ids[labelid] figtype = get_figtype(target_node) + except: + return None + + try: figure_id = target_node['ids'][0] fignumber = env.toc_fignumbers[docname][figtype][figure_id] except (KeyError, IndexError): - return None + # target_node is found, but fignumber is not assigned. + # Maybe it is defined in orphaned document. + env.warn(fromdocname, "no number is assigned for %s: %s" % (figtype, labelid), + lineno=node.line) + return contnode title = contnode.astext() if target == fully_normalize_name(title): From cd1eeff70a336f9543e45f2c8bb71a2d3e6da545 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 24 Jan 2016 00:53:16 +0900 Subject: [PATCH 219/238] Remove Babel._ISO639_TO_BABEL; deprecated at docutils-0.8 --- sphinx/writers/latex.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index dc3f4675a..21ab1549b 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -127,11 +127,6 @@ class ExtBabel(Babel): 'mn', 'mongolian', 'ru', 'russian', 'uk', 'ukrainian') -# in latest trunk, the attribute is called Babel.language_codes and already -# includes Slovene -if hasattr(Babel, '_ISO639_TO_BABEL'): - Babel._ISO639_TO_BABEL['sl'] = 'slovene' - class ShowUrlsTransform(object): expanded = False From 50951bdc9814109df848e12dd08b6a6bbdb01889 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Sun, 24 Jan 2016 12:30:49 +0900 Subject: [PATCH 220/238] Bump to 1.3.5 final --- CHANGES | 4 ++-- sphinx/__init__.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 32aff2b03..8b7544278 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,5 @@ -Release 1.3.5 (in development) -============================== +Release 1.3.5 (released Jan 24, 2016) +===================================== Bugs fixed ---------- diff --git a/sphinx/__init__.py b/sphinx/__init__.py index 2bc25685c..a6e8b4334 100644 --- a/sphinx/__init__.py +++ b/sphinx/__init__.py @@ -15,13 +15,13 @@ import sys from os import path -__version__ = '1.3.4+' -__released__ = '1.3.4+' # used when Sphinx builds its own docs +__version__ = '1.3.5' +__released__ = '1.3.5' # used when Sphinx builds its own docs # version info for better programmatic use # possible values for 3rd element: 'alpha', 'beta', 'rc', 'final' # 'final' has 0 as the last element -version_info = (1, 3, 5, 'beta', 1) +version_info = (1, 3, 5, 'final', 0) package_dir = path.abspath(path.dirname(__file__)) From 7d946358d3bdacf6de71294d82c362e8d1a9eb28 Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Sun, 24 Jan 2016 13:10:31 +0900 Subject: [PATCH 221/238] Bump version --- CHANGES | 7 +++++++ sphinx/__init__.py | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 8b7544278..3357efe4b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,10 @@ +Release 1.3.6 (in development) +============================== + +Bugs fixed +---------- + + Release 1.3.5 (released Jan 24, 2016) ===================================== diff --git a/sphinx/__init__.py b/sphinx/__init__.py index a6e8b4334..a44de7946 100644 --- a/sphinx/__init__.py +++ b/sphinx/__init__.py @@ -15,13 +15,13 @@ import sys from os import path -__version__ = '1.3.5' -__released__ = '1.3.5' # used when Sphinx builds its own docs +__version__ = '1.3.5+' +__released__ = '1.3.5+' # used when Sphinx builds its own docs # version info for better programmatic use # possible values for 3rd element: 'alpha', 'beta', 'rc', 'final' # 'final' has 0 as the last element -version_info = (1, 3, 5, 'final', 0) +version_info = (1, 3, 6, 'beta', 1) package_dir = path.abspath(path.dirname(__file__)) From 6ef4bd3e1e5e1fef43642d6dc47ca5ecc785942f Mon Sep 17 00:00:00 2001 From: shimizukawa <shimizukawa@gmail.com> Date: Sun, 24 Jan 2016 13:11:51 +0900 Subject: [PATCH 222/238] fix typos --- CHANGES | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 3357efe4b..29c03329a 100644 --- a/CHANGES +++ b/CHANGES @@ -14,8 +14,8 @@ Bugs fixed * Fix line numbers was not shown on warnings in LaTeX and texinfo builders * Fix filenames were not shown on warnings of citations * Fix line numbers was not shown on warnings in LaTeX and texinfo builders -* Fix line numbers was not shown on warnings of indecies -* #2026: Fix LaTeX builder rais error if parsed-literal includes links +* Fix line numbers was not shown on warnings of indices +* #2026: Fix LaTeX builder raises error if parsed-literal includes links * #2243: Ignore strange docstring types for classes, do not crash * #2247: Fix #2205 breaks make html for definition list with classifiers that contains regular-expression like string From 9ed3d518267c0c02e34982480aa88ed4060fa8bd Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Sun, 24 Jan 2016 17:32:12 +0900 Subject: [PATCH 223/238] Fix #1944: rst_prolog breaks file-wide metadata --- CHANGES | 1 + sphinx/environment.py | 5 +++-- sphinx/util/__init__.py | 9 +++++++++ tests/test_util.py | 19 ++++++++++++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index f9671af6c..cc53820d8 100644 --- a/CHANGES +++ b/CHANGES @@ -65,6 +65,7 @@ Bugs fixed * #2164: Fix wrong check for pdftex inside sphinx.sty (for graphicx package option). * #2165, #2218: Remove faulty and non-need conditional from sphinx.sty. * Fix broken LaTeX code is generated if unknown language is given +* #1944: Fix rst_prolog breaks file-wide metadata Documentation ------------- diff --git a/sphinx/environment.py b/sphinx/environment.py index f919c0048..ad07b642a 100644 --- a/sphinx/environment.py +++ b/sphinx/environment.py @@ -38,7 +38,7 @@ from docutils.frontend import OptionParser from sphinx import addnodes from sphinx.util import url_re, get_matching_docs, docname_join, split_into, \ - FilenameUniqDict, get_figtype, import_object, split_index_msg + FilenameUniqDict, get_figtype, import_object, split_index_msg, split_docinfo from sphinx.util.nodes import clean_astext, make_refnode, WarningStream, is_translatable from sphinx.util.osutil import SEP, getcwd, fs_encoding from sphinx.util.i18n import find_catalog_files @@ -160,11 +160,12 @@ class SphinxFileInput(FileInput): arg = [data] self.app.emit('source-read', self.env.docname, arg) data = arg[0] + docinfo, data = split_docinfo(data) if self.env.config.rst_epilog: data = data + '\n' + self.env.config.rst_epilog + '\n' if self.env.config.rst_prolog: data = self.env.config.rst_prolog + '\n' + data - return data + return docinfo + data class BuildEnvironment: diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index 5e5c8ac9e..b3b065f8e 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -532,3 +532,12 @@ def encode_uri(uri): for (q, v) in parse_qsl(split[3])) split[3] = urlencode(query).decode('ascii') return urlunsplit(split) + + +def split_docinfo(text): + docinfo_re = re.compile('\A((?:\s*:\w+:.*?\n)+)', re.M) + result = docinfo_re.split(text, 1) + if len(result) == 1: + return '', result[0] + else: + return result[1:] diff --git a/tests/test_util.py b/tests/test_util.py index 23c4ad1ca..dbecfb1a2 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -8,7 +8,7 @@ :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ -from sphinx.util import encode_uri +from sphinx.util import encode_uri, split_docinfo def test_encode_uri(): @@ -24,3 +24,20 @@ def test_encode_uri(): uri = (u'https://github.com/search?utf8=✓&q=is%3Aissue+is%3Aopen+is%3A' u'sprint-friendly+user%3Ajupyter&type=Issues&ref=searchresults') assert expected, encode_uri(uri) + + +def test_splitdocinfo(): + source = "Hello world.\n" + docinfo, content = split_docinfo(source) + assert docinfo == '' + assert content == 'Hello world.\n' + + source = ":orphan:\n\nHello world.\n" + docinfo, content = split_docinfo(source) + assert docinfo == ':orphan:\n' + assert content == '\nHello world.\n' + + source = ":author: Georg Brandl\n:title: Manual of Sphinx\n\nHello world.\n" + docinfo, content = split_docinfo(source) + assert docinfo == ':author: Georg Brandl\n:title: Manual of Sphinx\n' + assert content == '\nHello world.\n' From ae478f678e48c519cceef6e6e19de8ce46574532 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Fri, 15 Jan 2016 20:44:03 +0900 Subject: [PATCH 224/238] Fix #2022: html_extra_path also copies dotfiles and refers exclude_patterns --- CHANGES | 2 ++ doc/config.rst | 7 +++- sphinx/builders/html.py | 5 +-- sphinx/quickstart.py | 1 + sphinx/util/__init__.py | 30 ++++++++++++++++++ tests/roots/test-html_extra_path/conf.py | 6 ++++ .../test-html_extra_path/extra/.htaccess | 0 .../test-html_extra_path/extra/.htpasswd | 0 .../test-html_extra_path/extra/API.html_t | 0 .../test-html_extra_path/extra/css/style.css | 0 .../roots/test-html_extra_path/extra/rimg.png | Bin 0 -> 218 bytes tests/roots/test-html_extra_path/index.rst | 3 ++ .../subdir/_build/index.html | 0 .../subdir/background.png | Bin 0 -> 218 bytes tests/test_build_html.py | 13 ++++++++ 15 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 tests/roots/test-html_extra_path/conf.py create mode 100644 tests/roots/test-html_extra_path/extra/.htaccess create mode 100644 tests/roots/test-html_extra_path/extra/.htpasswd create mode 100644 tests/roots/test-html_extra_path/extra/API.html_t create mode 100644 tests/roots/test-html_extra_path/extra/css/style.css create mode 100644 tests/roots/test-html_extra_path/extra/rimg.png create mode 100644 tests/roots/test-html_extra_path/index.rst create mode 100644 tests/roots/test-html_extra_path/subdir/_build/index.html create mode 100644 tests/roots/test-html_extra_path/subdir/background.png diff --git a/CHANGES b/CHANGES index cc53820d8..94a38204b 100644 --- a/CHANGES +++ b/CHANGES @@ -17,6 +17,8 @@ Incompatible changes * ``sphinx.ext.graphviz``: show graph image in inline by default * #2060, #2224: The ``manpage`` role now generate ``sphinx.addnodes.manpage`` node instead of ``sphinx.addnodes.literal_emphasis`` node. +* #2022: :confval:`html_extra_path` also copies dotfiles in the extra directory, and + refers to :confval:`exclude_patterns` to exclude extra files and directories. Features added -------------- diff --git a/doc/config.rst b/doc/config.rst index 5076d62e0..b0c148c04 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -131,7 +131,7 @@ General configuration :confval:`exclude_dirnames`) :confval:`exclude_patterns` is also consulted when looking for static files - in :confval:`html_static_path`. + in :confval:`html_static_path` and :confval:`html_extra_path`. .. versionadded:: 1.0 @@ -640,6 +640,11 @@ that use Sphinx's HTMLWriter class. .. versionadded:: 1.2 + .. versionchanged:: 1.4 + The dotfiles in the extra directory will be copied to the output directory. + And it refers :confval:`exclude_patterns` on copying extra files and + directories, and ignores if path matches to patterns. + .. confval:: html_last_updated_fmt If this is not None, a 'Last updated on:' timestamp is inserted diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py index 01c593b72..03199f3b9 100644 --- a/sphinx/builders/html.py +++ b/sphinx/builders/html.py @@ -27,7 +27,7 @@ from docutils.frontend import OptionParser from docutils.readers.doctree import Reader as DoctreeReader from sphinx import package_dir, __display_version__ -from sphinx.util import jsonimpl, copy_static_entry +from sphinx.util import jsonimpl, copy_static_entry, copy_extra_entry from sphinx.util.osutil import SEP, os_path, relative_uri, ensuredir, \ movefile, ustrftime, copyfile from sphinx.util.nodes import inline_all_toctrees @@ -644,11 +644,12 @@ class StandaloneHTMLBuilder(Builder): self.info(bold('copying extra files... '), nonl=True) extraentries = [path.join(self.confdir, epath) for epath in self.config.html_extra_path] + matchers = compile_matchers(self.config.exclude_patterns) for entry in extraentries: if not path.exists(entry): self.warn('html_extra_path entry %r does not exist' % entry) continue - copy_static_entry(entry, self.outdir, self) + copy_extra_entry(entry, self.outdir, matchers) self.info('done') def write_buildinfo(self): diff --git a/sphinx/quickstart.py b/sphinx/quickstart.py index f7a6731dc..e2f6edd45 100644 --- a/sphinx/quickstart.py +++ b/sphinx/quickstart.py @@ -146,6 +146,7 @@ language = %(language)r # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path exclude_patterns = [%(exclude_patterns)s] # The reST default role (used for this markup: `text`) to use for all diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index b3b065f8e..0d2e70c18 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -182,6 +182,36 @@ def copy_static_entry(source, targetdir, builder, context={}, exclude_matchers=exclude_matchers) +def copy_extra_entry(source, targetdir, exclude_matchers=()): + """Copy a HTML builder extra_path entry from source to targetdir. + + Handles all possible cases of files, directories and subdirectories. + """ + def excluded(path): + relpath = relative_path(os.path.dirname(source), path) + return any(matcher(relpath) for matcher in exclude_matchers) + + def copy_extra_file(source_, targetdir_): + if not excluded(source_): + target = path.join(targetdir_, os.path.basename(source_)) + copyfile(source_, target) + + if os.path.isfile(source): + copy_extra_file(source, targetdir) + return + + for root, dirs, files in os.walk(source): + reltargetdir = os.path.join(targetdir, relative_path(source, root)) + for dir in dirs[:]: + if excluded(os.path.join(root, dir)): + dirs.remove(dir) + else: + target = os.path.join(reltargetdir, dir) + if not path.exists(target): + os.mkdir(target) + for file in files: + copy_extra_file(os.path.join(root, file), reltargetdir) + _DEBUG_HEADER = '''\ # Sphinx version: %s # Python version: %s (%s) diff --git a/tests/roots/test-html_extra_path/conf.py b/tests/roots/test-html_extra_path/conf.py new file mode 100644 index 000000000..53ee62197 --- /dev/null +++ b/tests/roots/test-html_extra_path/conf.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' + +html_extra_path = ['extra', 'subdir'] +exclude_patterns = ['**/_build', '**/.htpasswd'] diff --git a/tests/roots/test-html_extra_path/extra/.htaccess b/tests/roots/test-html_extra_path/extra/.htaccess new file mode 100644 index 000000000..e69de29bb diff --git a/tests/roots/test-html_extra_path/extra/.htpasswd b/tests/roots/test-html_extra_path/extra/.htpasswd new file mode 100644 index 000000000..e69de29bb diff --git a/tests/roots/test-html_extra_path/extra/API.html_t b/tests/roots/test-html_extra_path/extra/API.html_t new file mode 100644 index 000000000..e69de29bb diff --git a/tests/roots/test-html_extra_path/extra/css/style.css b/tests/roots/test-html_extra_path/extra/css/style.css new file mode 100644 index 000000000..e69de29bb diff --git a/tests/roots/test-html_extra_path/extra/rimg.png b/tests/roots/test-html_extra_path/extra/rimg.png new file mode 100644 index 0000000000000000000000000000000000000000..1081dc1439fb984dfa7ef627afe3c7dc476fdbce GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI|!3HFkf4uMuBv2gW?!>U}oXkrghqJ&VvY3H^ zTNs2H8D`Cq01C2~c>21s-(chw<zuM4+c^s;Bw6AbQR1ARo12<f!r)w#npl#WqEMb$ zlA+-4=^GH<$R`d|<nHO>7$R|bZ|_0D0|q>YSbqDzW^|HYIk%*-&O)*<eU%p5hFqPM zoCZSI1cj<~W;wMTU^!DV{f1fo9KD%^zhWZgXV;bV*7viUUsLj7{xJDI&`1VPS3j3^ HP6<r_1g=6L literal 0 HcmV?d00001 diff --git a/tests/roots/test-html_extra_path/index.rst b/tests/roots/test-html_extra_path/index.rst new file mode 100644 index 000000000..6d5619455 --- /dev/null +++ b/tests/roots/test-html_extra_path/index.rst @@ -0,0 +1,3 @@ +test-html_extra_path +===================== +this is dummy content diff --git a/tests/roots/test-html_extra_path/subdir/_build/index.html b/tests/roots/test-html_extra_path/subdir/_build/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/tests/roots/test-html_extra_path/subdir/background.png b/tests/roots/test-html_extra_path/subdir/background.png new file mode 100644 index 0000000000000000000000000000000000000000..1081dc1439fb984dfa7ef627afe3c7dc476fdbce GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI|!3HFkf4uMuBv2gW?!>U}oXkrghqJ&VvY3H^ zTNs2H8D`Cq01C2~c>21s-(chw<zuM4+c^s;Bw6AbQR1ARo12<f!r)w#npl#WqEMb$ zlA+-4=^GH<$R`d|<nHO>7$R|bZ|_0D0|q>YSbqDzW^|HYIk%*-&O)*<eU%p5hFqPM zoCZSI1cj<~W;wMTU^!DV{f1fo9KD%^zhWZgXV;bV*7viUUsLj7{xJDI&`1VPS3j3^ HP6<r_1g=6L literal 0 HcmV?d00001 diff --git a/tests/test_build_html.py b/tests/test_build_html.py index 40fda97f9..2afeaace6 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -954,3 +954,16 @@ def test_jsmath(app, status, warning): 'e^{ix} = \\cos x + i\\sin x</div>' in content) assert '<div class="math">\nn \\in \\mathbb N</div>' in content assert '<div class="math">\na + 1 < b</div>' in content + + +@with_app(buildername='html', testroot='html_extra_path') +def test_html_extra_path(app, status, warning): + app.builder.build_all() + + assert (app.outdir / '.htaccess').exists() + assert not (app.outdir / '.htpasswd').exists() + assert (app.outdir / 'API.html_t').exists() + assert (app.outdir / 'css/style.css').exists() + assert (app.outdir / 'rimg.png').exists() + assert not (app.outdir / '_build/index.html').exists() + assert (app.outdir / 'background.png').exists() From 773dc9dac31f14588569c0c316b33ba63e7b33f4 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 27 Jan 2016 01:06:57 +0900 Subject: [PATCH 225/238] Register DummyBuilder as built-in --- sphinx/builders/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sphinx/builders/__init__.py b/sphinx/builders/__init__.py index 30c1f73d9..3c4f2fd2c 100644 --- a/sphinx/builders/__init__.py +++ b/sphinx/builders/__init__.py @@ -450,6 +450,7 @@ class Builder(object): return getattr(self.config, optname) BUILTIN_BUILDERS = { + 'dummy': ('dummy', 'DummyBuilder'), 'html': ('html', 'StandaloneHTMLBuilder'), 'dirhtml': ('html', 'DirectoryHTMLBuilder'), 'singlehtml': ('html', 'SingleFileHTMLBuilder'), From dd08a3ac29d2b94762866944e8cb1971b986fb9e Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA <i.tkomiya@gmail.com> Date: Wed, 27 Jan 2016 01:27:05 +0900 Subject: [PATCH 226/238] Add testcase for image globbing --- tests/roots/test-image-glob/conf.py | 3 + tests/roots/test-image-glob/img.gif | Bin 0 -> 24976 bytes tests/roots/test-image-glob/img.pdf | Bin 0 -> 141783 bytes tests/roots/test-image-glob/img.png | Bin 0 -> 67765 bytes tests/roots/test-image-glob/index.rst | 14 ++ tests/roots/test-image-glob/rimg.png | Bin 0 -> 218 bytes tests/roots/test-image-glob/subdir/index.rst | 8 + tests/roots/test-image-glob/subdir/svgimg.pdf | Bin 0 -> 141783 bytes tests/roots/test-image-glob/subdir/svgimg.svg | 158 ++++++++++++++++++ tests/test_build.py | 46 +++++ 10 files changed, 229 insertions(+) create mode 100644 tests/roots/test-image-glob/conf.py create mode 100644 tests/roots/test-image-glob/img.gif create mode 100644 tests/roots/test-image-glob/img.pdf create mode 100644 tests/roots/test-image-glob/img.png create mode 100644 tests/roots/test-image-glob/index.rst create mode 100644 tests/roots/test-image-glob/rimg.png create mode 100644 tests/roots/test-image-glob/subdir/index.rst create mode 100644 tests/roots/test-image-glob/subdir/svgimg.pdf create mode 100644 tests/roots/test-image-glob/subdir/svgimg.svg diff --git a/tests/roots/test-image-glob/conf.py b/tests/roots/test-image-glob/conf.py new file mode 100644 index 000000000..f81c30bc4 --- /dev/null +++ b/tests/roots/test-image-glob/conf.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' diff --git a/tests/roots/test-image-glob/img.gif b/tests/roots/test-image-glob/img.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f02686552ab65ce74f3e0b6d60404df3e3b6852 GIT binary patch literal 24976 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 Ze;uT|07DFDiyYklRAaI`83Y2H{truh7^wgN literal 0 HcmV?d00001 diff --git a/tests/roots/test-image-glob/img.pdf b/tests/roots/test-image-glob/img.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cacbd855df4ffdb1c9acd5dbd22fad2fce51b532 GIT binary patch literal 141783 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 Y+uk4b>tlj<)Hl%MId|^COJkn@7dPrOEC2ui literal 0 HcmV?d00001 diff --git a/tests/roots/test-image-glob/img.png b/tests/roots/test-image-glob/img.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8f89929f2483a249c42ec5358016b9f1073f47 GIT binary patch literal 67765 zcmV)ZK&!urP)<h;3K|Lk000e1NJLTq0077U006ZJ0ssI2m4+wQ00001b5ch_0Itp) z=>P!;Z%IT!RCwBayjznb-I5)&{IYjkGOMb)zsvdNc8&%!gan4cm;}!}$qY;n!g%1H z^1>eg3|<io0yG12Msqpc{dHAkM(n-aod=K1s_#ffSzB3kbyap`Y!CP4Yb|%8<)48N z0RYU1h%h4&1c6-?5oQ)}P<VJ_slip&N3N^4X8SezMz%8spa`LmAjj<^=>8=<zfS-& z2RRjpBEVn|BZ}Yvgjt9v+?DEZ^I<Fu6y}}CLnnvS<y=l5j8w@dMZdhX%gb&X0RS;E zD1s317#<WLh6{nKDzgw16Hn8bRGpcMgsO^Et;@17L%D=#u(F7VFte(PR%Xt>GBXpg z2r~m<5f(Nx3NSMfMFbHAfCx~&X9wJ@xjPX9d22XdGXmgu_bq~n#8FgjfSHLY5C{Mu zA^<_Vo4Y$RkKwmpbdiW)fX%|)BO)T)9sTO=V+=QQ^N1KWdhhNYZUKuhGbbV<8e^zx zWMt&&5fgC)fH1S;HEp=Nn|Xwr<;A(X5{0{g7yt)Hz&u0<q9h#3b(!~l#27So33fw- zhmB=YnwDL-Uwn)nED?FH0`ETF#TX!b`zpVn<5s{y6abTegos3>EH%o6KFrK|2Z%@* z%p_Wu51+m>DrH*dQpWy@zF{ubqxapdGqbunK&&Dh)Cn9!3?2|TD8LME4Z}jDL=E^b zVZf|1R}z`(yqRYRsVXzSy)h#E@`HegAP^`50T75H0z?^Jgz(`OBLcUO3xM3asuF>S z+~3`-fVl@iMBxMi2NO|7Rv-uj1mIwRL4^EuA{yq1BR<|oDn%fIiNJhZGT<Ie?t}=q z1Hw3>iSAKF1c2QmVi3VS|F3ZOxCIj;Se1Zqw+Nlq^S<pKⅆj2bbbN1R|Vy?j{b0 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 literal 0 HcmV?d00001 diff --git a/tests/roots/test-image-glob/index.rst b/tests/roots/test-image-glob/index.rst new file mode 100644 index 000000000..6ac4a90ef --- /dev/null +++ b/tests/roots/test-image-glob/index.rst @@ -0,0 +1,14 @@ +test-image-glob +=============== + +.. image:: rimg.png + +.. figure:: rimg.png + + The caption of pic + +.. image:: img.* + +.. figure:: img.* + + The caption of img diff --git a/tests/roots/test-image-glob/rimg.png b/tests/roots/test-image-glob/rimg.png new file mode 100644 index 0000000000000000000000000000000000000000..1081dc1439fb984dfa7ef627afe3c7dc476fdbce GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI|!3HFkf4uMuBv2gW?!>U}oXkrghqJ&VvY3H^ zTNs2H8D`Cq01C2~c>21s-(chw<zuM4+c^s;Bw6AbQR1ARo12<f!r)w#npl#WqEMb$ zlA+-4=^GH<$R`d|<nHO>7$R|bZ|_0D0|q>YSbqDzW^|HYIk%*-&O)*<eU%p5hFqPM zoCZSI1cj<~W;wMTU^!DV{f1fo9KD%^zhWZgXV;bV*7viUUsLj7{xJDI&`1VPS3j3^ HP6<r_1g=6L literal 0 HcmV?d00001 diff --git a/tests/roots/test-image-glob/subdir/index.rst b/tests/roots/test-image-glob/subdir/index.rst new file mode 100644 index 000000000..f086458d5 --- /dev/null +++ b/tests/roots/test-image-glob/subdir/index.rst @@ -0,0 +1,8 @@ +test-image-glob/subdir +====================== + +.. image:: svgimg.* + +.. figure:: svgimg.* + + The caption of svgimg diff --git a/tests/roots/test-image-glob/subdir/svgimg.pdf b/tests/roots/test-image-glob/subdir/svgimg.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cacbd855df4ffdb1c9acd5dbd22fad2fce51b532 GIT binary patch literal 141783 zcmZs@iCdG`+W(7yh=731Ghv1hrT`&KA%qY@2qA=dh7cfxIRs?#5fKm(5fLdOqNP?5 z6%|nt5tUlUYOS^1ZFl!>cX!|Y?)Ufp&bhAhADr*XqqM*GoNM1*K6w(tkk9_!_xi4T zEkC(X6cP~{$uNsxgfm){8nc81voLv8T}?ZKjXMgnu-xv}8b(-3m9DC>rOu4UGplJ< zkr$GuKYjuI8vU1<g=N&M+8HH`Nb=>3GPAIhmX2l}BjQhAN}l@veku9B+8Vs{!#7sc zw6}C<tMQYNpQ$iQsi~>f;hGVa-W1N@>fatePMBQVQk_$yV{o?bWY(zas{}1wjFNEN zV~2+`BDfLcC(*XF{{P)>Y1ZNUwlkv0JK#4~cQh#(5#%qT_|s2Kp8fb!OKY0zbZSQQ z$CtG0v^7;tW^HEVo00$F8|we9ZZgyVxWX2*Z1R`;@WKy&L-O_HEh8g7{#D5@LGF|= z!tl{B!g6c6bmSMtCz66c=7+C~`S2?IVgC3)$Y12+&qseCAO2=$VL2U2o&ICgzmZv( ztf~p0DgKORVWRp*U5yr>SD2!snf|qeHPtPu8uHN<)T{7Y;&(C&6W7$&sqry#BgiM( z*rLs8t*WkJM37$=e=|Y7u3cWEO=)RrZD}SSBG)YJ!yhSD{|fw^AAWag$8OOMGm*h= z5{BluPBqviz)0?!3yrOWMwZD2=6r+Q{2it|0~4;{ZXUUBuP|{fHMY;+VVP;LJ9UQ% z&&VXs2;<IVV`HJwPQi8<nh3VTU>Bc+Dc`_MV7NQQz)WmF?U5Q-NDVDy2Id(%EF=b& z=?0ckL+dP~y>de<nTd6-p=Gv#napsH+;C5xv6XD6wba-y$Ivd{)LpqJP-_;{Y01>t zhw7|-)n+cGMvl40B=St03QU~yce>;oyW|=<C=4C54V`if9rBGF3U|Adn!8n4cvM<? zD((HLW(TI$j-|7Y*k>2r>%^rz5(WcOj|HV23rU}3NvDHlvmx1M!*kEG^A|Y97h}t> z##b)$s&DdZZVBpc3)Oc-4fn)N_YsoTO=<h1^wtNGmIu<dhnd<(A4dI!6r*-arh6pQ zZDzEsrMKLXw5~~7?@{<q(t2O2eUR0G=N`#AH@73R<3U#Erb4$_(6yDT+sf~JQqc8f ze%F)yeI#&A9(Hf$c5Wzi>lo$Qbvm-z))czC+3okT+waR-*QL#C8BKR3jd#SFRdLM~ zQT1g(#pnFe1zyqlM5^#yY~GnD`7~QL6(KzlE*%fcILZ<q2}vIfl^kV?4r9di#~2Bf zjD}^5g-Q@dgVRRvf<WO=VDdr#qyxSQectiC3~m>R*lv%QeTIO^RA8`Mh%h!28SPFr z03T)|V++YnE2*)qY_}VgZ)mUBu@@h3nz04na5q82$VO)6U1{xIv)ifA*fPUlC*N>a zA`shQlDuPQ%8s3a?JzVJYzMF<f$wJ~G{m<wOE(~Ffhs~6E)1<Q4Xx!yd$UdKa?M?e z%{;42T*@dT$6^DUJOi72Bin2fTlp^gd{fs7r?3wD@E(_#LGOek9?_J2P@}bX)h_oE zL#JE=d%2;b!i1odZ|qcP;#|DbCC|jAV5f88E^=LgFmbH}p4JStwReM+U$b4X&NiaM zj@{+LrF;dWL1`1A(o<22c~;h37?pF5CW~9T$lZpkcJ+V2mC?GHp?wI%B&`oJ+BWqx z5x#IiKqKR0Y3pWs%euIEEv@OUxS5VMQ6oTG&uo7H?xebnKcam@+IC;oM%~Zpc&N}m z%I(;qnWEtWWqP<C<aVwrI@fc%HnQ8-ffYioy(eqCBWt~z)rLFwx8X{wza>^JiIj`N z%8P>X3;fd0fLKD|xtN?;PWDVx)>NeIL<GU>SQw#aj42ucRTNDYutI=4FvSuBtC2wA zFv#*39P;B)2;ap0fXh3f&j*yn^|*67ciUwfLNLt5hI=H&)|p0-4ND1P#~!GN#Lzz1 z*ty8SKG(o5*U&cG$X04-Bi*rAYT~Fc_bA%yS8v6rGPIN$P!KOu{*GPA1}1{-*s&|c z&{Sx+>yI!n6_MB_+Oa#$&@|1!Ok%Jn)4)PvY?TGE0#=6B*@iYb#&-G8L^Ib?%fLo! zW;4RrL%GAX)X=He#Ie}Kxzy5E;~u@=BleJc9Dcn?Hx4!66wzhnS8wiKY3f*HVyiH< zk?*vT7};eSImvfA<rq8Vn>ZKjaxOG=DKc}&Ls&Q!Sh^IMx+*OgYAfF+JEqo!)5}O0 zbm1O!jT`b$oeY=GM&&I;6<vraxdh2V{K1y;#{Up53Tj1yW~%)Wp{#8a0ph@yto`u^ z#M&O>W#XoFL|W6DP_vraa7)~L2a(o<aho`Dk=}SGqj?R=qvvB?-nyBidz{z##Wq{O ztFY&BZs!99rMnN2f^2~=jC#KA(`4c65t%LbfLMCN?X=pfBGr<xdQqrc6jWVI(!&*( zHy4`=zNVw)ry_}hO@wD050#9wM1W~DL?5_diN{!Jqk6GA#1w(5gTDL&-n{)j2~;1* zB5)=2LBD9q+@d=y-78ET3JomrxhhOt3QgUL5oR8xCa(EAopVjy3XL3dj2*J^=@>f| z8QA3**ykBK<{2UJxD=Q%YOK6eM%FR|<W<O#X$q}?2Bt&@p-v>nnvn|xMIP^#7?>i` z4b3D*W*IxoWd@cq0<*OYYGrJbyTdxiU~i6zQ!%pEPRAls&pIprCOcNUg-?UATa~Ft zorO=6xqqW|V5?2A&L#SQ8+XtnY0QH+>dil96WV7P*lgvm*~3uob}6)QP?$O>kRgp7 z@S7BxP>?XEd{d|V-Ofd3F2$A}<(3{5Rzc0SA?@~|olX(m9-Mw=>O{EoOmyz&?CeiD zc^BeK7vsv8;w!GimR+VVkP;J>H<DB<$^WNtff!&!*lK?y?RYHFJ`}fYB5)sUW$Csu zwUl1J+8$=KK1^@k6gNFcYg|vMza`Y%1Ye@YRiS1DqgZ`wJJQrEpaBU@+;}Im`M#`W zL*BNTt$hdu%kBIS1zk^bbX(clM{<0d)(47qTx`l(H)PElcztFINr?!sMd2Tk85?h; z)?Z7hyCSGv5~waGSLr3Jcp*Oj4EW;G5+;L$og_&zV<J>SB1AmSN;}3%!$^{0Q0icy z@DQ+KB=j&6dLdK)N5uDf>4nR}xfo$=qcF6}+CkZ7p*}HnEwJ{jwDhVp^C&ZOFSYcp zLM3Bpm%YPQZeS+|WxL%=%stBxrXEU5FO{)fu7O#afeC6dfstwIPO~&*RYQFkker)} znv5>#c9^E`*p+U$TVi4%Gd7nR0j#~*Mtc>=ipG{Q6FVx$z*=Fr7YVJ<%DcwQU1{uE zY38j4Tzi>q<~|xTZ;gd-gC*b!YQwdCXcw}g3un+Xe#C*@zc-}EDQ4I)vfm-B+l*0f z=~ZRPP$B7Ado^2mYAoH=79MI-?|RF?R=d!BP7%G%>^|41{m$%Om&iUw?0{G7Au1sG zSZKx!C;#)LitGH!>wM*n)Ve#Vnl+%5TyqN}?;}}!z@@$;tiMZ2uI3F%EAru^^tMNm z_AT%Q%1G@6+?q*xl;LI@)a;Q&i<)dx)Vz`2{6N&WE>HuhJ4rRm$#pjb>Xj6#ekHZ$ zhN$)?9cgtdxWF9*umBvi3V|<37!U(Wg<Vg{h4vB10#<S@319^z@p`(_qQ91AOWM3D z*4z-)FQ=-nrPMAZD=#G@J(eIho{h_==DE3ZF*!4kFnx;rz!xYBlN@KIjj@23cr-X| zI4E^EfIom7=*jK!jO|2$wH+RDT^@1W?y+5N+<nF#<re;RX1+B$8I?xPCFWk$Hi4SG z0rlqI%H51A6Zi5xzN+1x6*~ZsEy<A7E{1B4zs4%C(cDLE&ZshW%r~@^8{1{=u*ovC zksDZ{5?2@^*OBsEO7fn$1a&&X5EYe$bcgweFf^AMU@l;**a5I@^9=SXAXXM$wFdU6 zuL_Nw%gw#&44sw6ZnYNvtrh{=U7nhq9`z=aN4*&luVxFsX3HR*Gk4f4dD2%n<t><W zi970^c+`zM<Qz#s*KAnbdjmV|0{1yFd+nH=_RLO<HmpvYur7pMM4vO~pa*ZnEBUCm zV9Y1wm~Zk}VA^E3Vm_+)VqC>FU_@#v%^GA1!Kb5^S_M|LY!Tx0`X$n=p`IsYRy*qP zFS0tnl<A&G+qW{bk5NTs?|ZE1+9J`7rygZ@ZDG_`_4m_TP<!Eftfthj2-M)~rckvk zR9zRUKo~&^;|J6}iWmh_zz+CQ=pG?Z=hN3f3>QSRT8L~xs%Ww>(xB0-Nt*%b9ZBPD zVeJi}`i8Lfx<GlAU%8Z2c{QnQDXI7~UjA$xGNb|(*r^EVWR(0*A|@UWrbwlA2xS&C zg_QBWJc<#w57m`3TkFEsVswkrxkl-b62YB`TcxG1dar-O9`8C+Z<V=komF6iT}Z2C zK)sP$xv@v(9)GokZ;g>tF$x|7$3k3K`qbDn8*Tj6W*+5+4!Jw*<OVh}L+cC>W^5zd zv4@fvS!NgksNHEMge;lChd_0eLF#tY@CY-&m4#By0Ljp{z{tK}uW!9A5vT@3r>Y%} zWk${wX1>ifAzjw2E@RI|Grv|VW{0`IcDHZq9%j2mpmuLaw`;<fcj_k$;dEfeS&!tC zzRAa3xr3Agn{tTQZy&kep55mZwcjOrzeCgkhbYP+l5%2GV9G6an2|W@n>-Pad?F}i zk|~@*1g4z~5Kpn>a}fm#m=hxVCD*N{Xzq#{@1-`NIzrujPoReh(9r?TP<y37!7ypm z0F-rc%SJlYjPeT!Q6H`MGTS$@IyMoQ1fo`#caaGpZeo@QvM_5DHQokXdhw#+T2856 z7AQ&3I))J_h}0`&vZq;<Hm-vnC=~+P5=sRfBgqhH5XrNd(*M)C4h*+7>kq^l*E1UL zNgCEf>eV#OD&7=tEl@4<l*_z|tNhYSyyE%z!g+4qnP|lfJL{Cb2qOxH2nAevwgOTH z{rLj`3za+A0!A)TI+w_HIw+blfVLAAFhgk-P;VRDZ0TQb=3TSLS8W}jaR}9#GOA5H zs?2?A_xRVFxK|mwl<#6xTLv}ShqpViI~^i)HvY91jLKauC76*J+UM<bDl)Pw*y&KT z%e{OjU<5Rl*+zS0h8CI7D+82R`Z*y+LuyZ^5vjMbP+%F^<r~=-A|Dz%7F&3O<i=ed zDnt8XgsE?n3#Z>bZqSL-Z-<#7r{9`IoClk*Zd_Q0_Sr@sc1s+0=N<PIO*4`wnc}Gc z;RK3&o3LJ>XA`mCIbp<!H|h{KY@cx0F>cr;YS1(8h;I@#9w?k*rJW8+KZOXE&LBc1 zv#gBM%*@%)-1*qjD^M=z67pVJ^L?Z^aq9-aL79Xk37U`+5qJR+H6+ZMo5^)6DfO$V zjdxQUZeuo>-f~YL>ltkuuo<LU$Qp_4F38toN~U|5(FXHk9pZ&z9^!?x2;~A+1SJ*7 zx|&>d6)Fbt!ibMQweBV+dx&(+UGO1oUI$7LD~t$$hC9+Ga+5suC*gu*{W*w^QTp;r zs#%rP-xAf`6xJ-K)Lh|LE%7QYC6s@bP&gl#KNpib3%-yZ*_oK!pu(R3T&%Psdf^)I zO+0|Ch|&sh!E=CKfiFmwb3~g{cq={bW>lMbtIWJqcEQbiLv;uXW~)U|i**R4+v%k? z^{ln>Yqa)nvG#2?^QyN9Y;oZnKsZMBxyKGTNA=nSYmHp1%ow$1UJb?`wL5*(mdrK_ zR-0vzcDJ|M(4lyTUB01Bp0P!)p^4nULT<1p8)0abLn?PGg#qS=cCe+82~pJ*TKZ`0 zLv*OJcDhwjhR$U>eH$IPhny2fJd;Ol*uB;f`&|={IdDfo6GJfRmM~_^9<b*ewu>6Z z=#ezxB|POTp79i%bmLDr#~t<HO}NC3IdexHxkng$pm!!9btWWzK1%+1l>9=d<Q!8r z8wjwn&Ooma@U!4*g=f!)=Pq!lVifaNlj>FljccOTjkLB0bO@W*afc3J!y2?KS$UJM zy2Y<q;nyw;)YnrQZl<-|PH(%55I2Iy`v~Y*rglr-`Gve|E4%w)rf!4Cmv$qwagCNE zjF1p9)JaVjTGWkH09CUrthvEgg0f}gM}4VJo)*=vpdgcIZUdq}2c7zW4_%yn7->aA zwrtq|eKdgNnlAA5@}<|xYe^ML38k0fOD=K?Kck{@&#@Kr9NEd}%t>~}adyT;gydM5 zcq~YG#GgOxmw3o0{vac^&poEyHCpQ&+3FI7Xmbf`c8h3r4R7&?)S9?gnlV%s-nAA! zwbmi+PEkDwTv)MM%>x=Od^Ps0cDoRrQ`kNycDE~+^5Ty$k`8<DhTRedJ*oIX=cqnF zXY8Uh^;E$wF!8OmB$R3$BKO&Zx0?so8+nuy7X$2&`Dl)zb*|Cg+#Oa5z(x47$=4fL zxjP*TcG%>?ezFhg*c;Sp=BqJutu*#+aOWR!PCRTM)9)BFU>9}Jfiq~s9so2x!c%@} z)C@qgju_YzdH?~Myi%t8(q?=`Gv2~ectudgoUiB;Z{d`G+6+7YQi5_NUbPypx|6Kg z5HxJ?>ee_VmqK&q5#f2~!}Ay5l!7mI?xzv?7dXX>@fFwNRX2Djx|`QiTkg{%2up8& zh=&MD)U-}i49OAtRg1WR;+(I(k)l}<YHp=yZb9adE@_(;?w73nVJ4j(+c#j4A~)jW zhuZ+pK~#TBP<ta?b4Of%J59YRLM^YSEJcNx#TA+@Af+$JuG864OsQAs)JKo>%#u!k ze})TMM(Qv<VstWvsX@wqy+MK3<IC~ZU>1oOd?l7G#uZ=S<bTS^KOZGO#g?56C$$%; zz#v~C;$y(eH(|g#j_PN`^|^7hZXBet7RQKYhwvshb}Qf_!EQBzq3Bj+=2dIyr?Fyb zErZ+a*<B8i-Hwr6cH#T%!uHvO>~o6T?-F$Y#fw|wkhk!dPwKb_|A<rE0J4-LyU#A9 zYloB4Hn<yAj7Q>_d;FMZ!k9<mF_-vJx8zaECbG*qq}9-+$N(m+O&$nBAQ|r1n`>Z= zivokag+R>MzG#O{fq`B5PIt9k$iBTH9fqDYM&3<syrV9>F>5wu7dhY(J8aGBHV@F+ zhEt5BanGa)hG5E*e*%foA!fuWb`*FaH~OYddkIcL*?dHwgiwkFcHttY_-cak7Jy3A zK9RINNo$5z@I>DAQrK`eLAe}Lb{RE%WYGn7;R4K3xLGl!OHeITU2&*HU^}R9liI6k z9SSDaZc22IfEXr($dj1zr8eF}aYopxyOpd)ZH^3wxP=gEC`<=Qz$ZnnL>ffZMGSb| z1HeVx(zf*s<i=(Icw5x4D$<~KyZcAfgEGhzohq+GUg!W~;0po015$KlMN@(iinPrZ zMF^tdLaE=nL9oJ{QtxQcFQWB}o|xj@K{BuWGWgQ#*M;buxhTaMwtR*yKOHVR6)v3$ zO&<>xjRqtQfiJM-!PP;yoY<`n;mvlT4Nf7AP%VH31>5PS+(mh)%rV^$ZnKNnXA{=3 zhuLZy-su$C>l{V7a0cAChrM}6efi@)f^mjm+(R%%hilRiXU>34Xt%jvtFc?17w>48 zd_E-mQ>OGB1jAo^#!ozBA3J0l-R~4bS^6VG=IyY}!>Y|6qivyqE%G5%y2G}_(6-pn z7Sn_3oo;Fi|29jO&d5h&!R+zigOStzX{TMdqjv0py{s;CBxoP}9zE`HBQ9}AT;j)Q zrl3y9fp|!d&@O+;8UM_=(1MGx$`xJ>KHSH$_GhxLm+9Ik;<hg^VsZy!C|=D<yz)A? zVu@3F5ygCD!Dk#jTnUxS1g@Huq}p42=ofNe;~Mk}h!M(Afi)93BcZti`tX7j%^IpS zQti`~KZ+<a4<w_gk(j0FZTF-)SYqoE?YbC&6(Fh=RTriWx8b5f;}EFq^b1NG;>LU8 z`qd20EqwL>3ZMO-l#93)bP)!`{;XigliP6N0u>mcN{<wTi(F_oVPbq_iz4oq9xl4p zyN0<VuN?VtF`@J##0$Yz%poGOXTviA*YPm%QI?SK1@jbexkPE9S|H1YRd3I%2Vc&i zO^&PvQ_mVy&&Dp5NPt$%w!O%Kp`93=IepI2n04)UjT!dhjZ!F+gC(Z|(k9(_BaX3$ zToQ)tV-8reyR4ZyQ_lw1n1jB837?cnztmIV*$Xj6SECD;q6(Knb1pa~j@U)@IYqR? znFU$K4uy2=bS&QKSYm8ny3?WD(5}S5ro_;$+{mud#9eJ2+yPlMVd*S_dtBm1k>>&^ z$()aH%87dzb3yy?UK^&?%)iwpyw5&*$S&%Tee~e&pe_f_uuH<2d(v^w<P*;EM^S$H zOJ@D0bHO<ak)>BSrPq_x>yqxLIs4z{Qr{^0zLs^p%If}-q&O&#`gT(7O`hs{g7O-- z{Bl(3#hCKTv6WZis;(wf-{7gJ6<#gTFH~Us`r9cDYpG4^smPU0>q7knu!4jMQHp7Z z^@UVPJPKsX+GT$2H9GVjDJF+&8Eu3qIz)P79#qi*!wgiV6Wa_v*+xb)W_IMGr-0A) zybg%bX^}Q5fCXKtk)<6>CH02sb{z(Sa1DoFuH7Ib$kJ;UCIYylM^Eppk`xTKh#J!J zMW@HuqJ@}(^U+k^d{pjyH29KDhe;>HGRBz@FTsdULcb@s(=`e%bdwEBV--|q8&K=O ztalD+v=367xL2Eb)tR^{F`D{l%>A1z0-N^)wpg>YcI<AHIxa~^Jd#Ekf-x`QcwojU zfAORTe-!sE!@KN5x-7h!O*}N7yixyjYT83^+%;*OrT8?e_zI_NnO(HR%Kbb*de)0S zY0Elb?YD1-bESbp`7X~|L+8pJ&ZRq?%62%H8#t94J5?Gxl^Z#g8afmiI+pHqtHC_b zA$G)pGqfwP%PxA@DekCW`YcmA@6H={i5)@J<q$P!9nxpb?6C{)cjF#$U?0N&69ycj z4?A&20z@-G;#p)&55Y;lj9FIhLU_?)eAO*63hD!2<sW`mIPxB&;?SF%1240BzRZB3 z-u^HRH9N8#aDlT0r9vT(YO4MYaKUw=>Sk=^wS=ncD6XJODfEgp?5)OiC`~H#hQd|j zJt6e#PjCs;q{4@Tl~PYkEa+Ei!zx+h!4we|7xYSx6<O(NLCz%g8L86r+LhJ}FX5iF zX$>_Q%@*(iKzi*W>5-N)5T;ih>Ly-<6p5e_+s==Gi%xx@lvXZ`BvtCo3YuA9B~U`L zt{^Z;MF1|OM`%}E@n_sZ$k#c#2;=0<heEzGPX&sO`y>r}#`QU~JFJ5mDeIsHTUHBl zqGPbeo~b5qAuZ~&qLqK+F7JBqwcED=aGCnn8^aX{>vT*Qa!ow!oG^?u=p~x)OFIG3 zAYV37eYSx*TfcT2W|vdkkX_u6Q{t!tZ;T<HW+^@kEx5$W`#h{@k)@aqkj%KmjJk0~ zttsF7-R??Lw<;U|1~d0M6Bp%9=SmZoDkGOFIPu1=<%Z5ByWFY_U6jUNZFVuEcAOE^ zQa0>EuJNOuf+>ITtUgK3c&1FdCrvm+4q60sn)!9wh8}Q;7;uRmwuu--O7u>i@)4YZ zaQUQt;x9cDD4!2foadG=i?!6_Eb2w^*muQa?+Zu2#YM@H?~8`N&Fg=o=mTX>W!+CQ z_kAJN!AIW|p@4_21%C^2RDTCq5$W+m<qp2|y0kq)skY<KZ1HQaCe?fhe$6t)Q(fb$ zmQ!HGlUzwgl>NBS*JQUzV$`!rvLYl5a5d?bOJ7CN(0~uj7$GmT*$Tuy!bRA^v-Hbw zy&bfmk%yFKl~`PjYZys<?2~}U0olTP(OA)x(X+<5VxnAnvd(b|&qwE<=N2wR$j`8( zQvsq0@1(=-v3)L)o%W$^4q-4+J5gyN=)wzZ8M{`I!plPisw{)3R_kCb@}mW_$&%G- z9RfSM$ANRuC4SgBe#j}Ffaa1g47iZEtb#jif?%M*A|H3<A7!LYGDK653TD>%(A*15 z`T0PE4AcGd-uSSSCLP#4rhZL3+-ope2kXpyn~dORxhqXPlsny3#%?u+E-K2{wc6OT z-ZW^RRn#EFCs1<6E^5#+q|Y^eEGYd<pm^3lZ8lIc>&6?m=L}hfQkKEJmaIO<s6n^b zBX0Z?zT(rKDMYfoh0{#gd_=)TR_=u$#kuH`D?Ihx6zv0f|Eq$LZ%fAhQZeyY<>cR$ z6Mri^`a{v+yMn=Y`2%nBr~_{ly)UzSUPwEhh+7|tnm0)qk98XGrLUr3YoWr2vxPw4 z4QhVc52LMmc&UGe3uN(BR}!n25|oz{tF9n;%Bu)~mZT!Vhd&NiUO%_gr%j3oAq^K% zt|kz$Cea%U5FeU`bQJj?W{nUp82H4L0AkxT;esy3K8TXue#IR;6xHEtSJTwD#q|V3 zz)0T*t(Yi+Eeik9B|S6?egx8DG)akboc#Id{IfCn=i&;_N6Kf>F%l>o_vQ^jxd4|F z8y43-x9BeT53~#6!Pf5fs@vsRv(vrW*iC8TRlD1_-W1Ee%w|g#5~FS}YoA?cmvdyl zJ9o$dg?a2D;N?Q`MqB__{E%JrpmoGSlth8jxxn;UR5*dMvjOsR$U_l@mqPO{_(3<a z=9!A~zMw%k$q=4$iW{?F_8Ku7cQbqKqXzB5dodR<X4LQUX)yI_HuY*Z4eYQA-*3wu zcH$jHogO4P!<5d!d9VsUfY~QAW6ps~jra;CF&l-~1!oJRHG2Rr4IvmW_)F$})93so z^M2`PIb}CeS{@489`c(u#U0N??OWo`Em{8yq{QN}A1Wq(R?YlgcjiB9Xa7|>^=tXb zzg3L?RC@S*{-HMo18;Npe<kaBDg$BKP0S2Yv!j-$?Nf>ttfU&$V%L+Zufy7=jZ|bz z=ojE3FQ7|$HSk#mT-<UjC|yjfyu>eG<d>q~<*K0aD%`82Y7}IIFFL@@c8Jxh#KuBa zY`6obLV~F#l&0x!I#s`_r-@YffI_cgq*{VZ3TmzjR990}SD{4++Ij~ybPm<$(`!N% z;wmPfbfHEslGDNk$pTwQhIBrRExLe|h+2!SI1`yOhrqm%n?s%D$Yw(&Cj*klyyFHu zIo)6iWO;IXF*?CTjnZQJh}s@@rMV9o!IzO+)lN^<PDYJ+K!ZhKlO+=hrh^Y|7Ybiu zzfE|z9c+i_e&`s&DR$6}H|EG4@fV*ClAgu<Fi<iFv0^C}nDTQJXbR3gACNhRg4!?R zjJJ5kLpbFlKF!KnU?iWkVD(rq`&{FWz`VdR%}!6XiD#WDR+{~Fdx9X8!|uY9Uea0E zp1#6qmUKQyG6%x}0Ksj5S&EViE(E}WpB0pGmXu<6$UhM%TL@8H49j2QQkAQG^@gDF zp{V^yX5XulqkpZM_($>Rk9osy^GCiZ8vU+(;^*qAUu#bPUVrw#0GE31-!-$p*G~OI zdF-!cqkkzq{9PgV>ibIG{an`d1T`7Tejui=sn$@6LBx19H+d-a5z6b^Y(c*CLFwTF zUusxi*AuI+B6!tTcyPcg7kTBENa6umkT4a!WDU5;oD!e$M<F6|q~{BW{gL7zU!V^_ zK&ikATztHhK9-ZKuLzVRQj}MS{?HCTDWMP*SNIi6{Bl%LmlDe^CRHqgFHnhZM#BY+ z^=kMbH-6NvOUQ~*xo0s;BojsXY4{S{-1(@i(}XR-7$f$e8+eMq!cQm77FHA)+<i6_ zQ@xu}4&|Z)a2dK(8ah{C-0h>@<EydsZ$+P{C9~Z;plwf3J940HShsy-A01eZagKx6 zH457@KyoH9V-AR63{@<IDLz9&Linf8!fAqC?#@5KNSSgIOa^Ct#*$w^_Hs#}#z6!e zDR1FP@3b>6NfS04Ohd=**h6-lBQE?&Pw{DA;c0KdC!R@D4E`y95%S?_JI=5}%rFpx zo5e^ug;ho0wAld3S(p_;(sRMNi{VAfoT}UWhRux5msx#ZXCHW5c=#`+V?URV|GjeJ z??{HF<9{ii_^E30@04o#x7wLs8|VKM(RA+Lb#uSh&-_z;^0%53zgCR>R6P71`jtn$ zR`e0Rq@7zZw<PV4#BC2SMHDpL#ncf+7@ZsG6-FS2f}hTrBuSF>p<8-q^(M^K#44=b zAthenRWG6R;!(70=`$mqrb9nr`yYnG4I)zjjjZ~hWV$2K+|egSvI<G3GL+s3e&r%U zfT&nZu2@VeyT~j3oL7o|t&54p7ZQp;BY`{R7eN@ml3IeCfiFG7#Oa`wa+_P=i8sX; zpyWbU1X&UC(@?HRP?j|lnsG8H^|(*MpgRYvifC6Nd=bQA_IX6<_WIZCaw{>#s*SfA zqlt&g#1#z)qyhtNdweuj{;d?&hW7+v(%)hc*apu5VH4T~#IVZe!0yAxY!8u1ngBk4 z2q;0tkhqwj3<i^!xa0`3Ov9T9z_SFsi{W`o!Pyu5Gd>N=TMErz@<^Qx$-N?|-{6+r zh{(SZnE9z!>S;#GX&=#CASIq>Nf!dr&iV>xeTAsENb+Uq*L9eg^B#gJ=fvYKyh+FS z;~s+PfQ)nOvYXLWtC5wr5;PmB?axJ>&qW>2GJ0O-4t|?I{C(lb_xgPJzVd`#wWfco zKJ_=v-0#ij|J^wMuiCla>SundpZaI*<Ui|9{f1Jk@+kFVF$%H%ufSJ!FZ{7TBn&DB zmka&_W|kk-iZ~Cbz({4L&x**Q$dD+)=u$tqW;F?7r@ER{i#qI@K9-Yfu0z?j<4;pI zf(r$|2^ykTD5NqhGGh7XL%$cD4CxviFNG~dutJoRNU6BY2UA5@Bt$FCLVUrearx&F zaI8>7#g|+FH25k67^0^Je|mFbN|1M^Ncn~NBH;@zSCnEdI`=Fn3(1@gN;@8)FS*<} z-5|>{K(m+G<QCQC#o6Z;(PracgT_FjT8vr*90}CaCLS=out=yj^KV3(izS3BupJkB z0@|#CbQb;uHLGCV-jFW4Fs$?S+eA{Rc8)l3hcS!8ItzlVzogFk>DOFPDtV_&L7lJ= z1Ba8P_&lQE3M*$ZqG*|wdpV-;8mIJTpbRnx+wuw>u@$Q!Ig8%nv#!b0ZhS1|obeN# z36`7-5YGAwXIZlI;dvKB6`zF@i(@`K{}Pp=zRxYa0Xg)~ILFLij3~X%QLYMGwo-M^ zQ#+msbzcZ|kJ9%&&**t2?R%L?y(l>RP5H!+)u;Zhn)ye~sb3oB{?&5szcfgRpZv4# zlYiDv|5H8rt9t6U+KFGQ#(pXv{jPZMn}UOH^7>!rQm@ENvU3X=5_uAhrf^WjRLcfj zG8!V3S+q|9%>r5QtI%l*V_wvVrqX+<n!8AS$#p2OkS8HtS5WPL^uS1EM%E>ja01|5 zUckq%C*T5|!=N_EWGU5G)9SX<Ch77Lswf!hABrSYa}X>9O&OFcq3E;NymMd*BeGdc z&RJ46<(|dd54h-s?83*l-geH&dL`rw?@lWl=!R8~Wk%HX_$s8wp!7+9(J`;&QLn^7 z%7fF5MQOCvpw+>KNz5%9e-$iEG-n!lsCT&4V#EZ^gwbg1sWI_tH1^P#Ff^v#jb^?r zh&=&7jD)#wyG1~UWf0bc4md{*!oNiEW5YgZ8##bPg~A$Zc>2|3EXquJr=0ZQonY{% z85Dn-DLEe~p7)i^bIVs^D{seCtR|?|aUoDYU>9C>Pd?=>!us)fjKSF#x#hRQ^RM6n zwK;+zobi*K4b58&$zP1Bx)H5fiLJgZZhw;2{zTIGJYDxRxoI<^Y}r@-DKmQ^EdNq? z;bKh1^`tsj2xxJ6p3zPbPd=;XwSsz+4HX*rN^$6Q!I5{BlRsBa{-T=tRXzQC?euTz zncoq0CrQ;+d*YXxiC>iCKUa=@Uq1S-Xy|qRz{}kJ=eg8NTET!AbZnb7Vx@vGy_+h6 zvkJqWzHVH{ypO_M6QQ30;sU=k94`nQmX%P7k*TDfHQ)vrfta8syGRQL_`(t&MyL%B za#RibX^H;Sp*f%mvO@<5AX%|uk<1s$NmZv$iJv1M#!-6B0$d!3k9-yZFO)olDXIqz z?+)96mPlwPz5y~X0v8`7tm^8=)kdsj&oU)bfnqr3V_0c+3U9Y#HCy=BTKU%#$h=8^ zsfkO`F4tlc??z*W#>AUy#MLfejj>nV4iD8%Z#5p8`Zn+OYay*u0quJI(%Q0mZ9^%C z@Bx>oVb|y*a0ndWk4GNDtj{s#Fj#Zq9)V$iy4xilO?$^tFM05$5Wd1Wf6=_Z^juW& za-!;9Y}K7O<=x2Q>zvY+$f9KcMBzW^7o-X)E+qSN`eB&jA|rK%<j|~7gXN!dD{k>M z8`7SaGU^SgsFGtp7mogrb>M4p*R!kxZ_>M;^8pkV51SuKv|9qrIzrs?IBVYvuqE$# zokP9J>U%Cf@G|@0tDM2tsOyUle^)Z{eZ|oqmDKpp%Hu%kr}D8MtH%GTn)n%rRUZAJ z;^=o}qj=q$!lAG72VVj%dCyb0`Ut>9kF=JdAj7nh?wz0)hsgR6={F^zzjz>q(vf`` zq`d|X7hUN?!QlVnKN12ZfeUH{l#q?K;ewXI7$C?X=_#+#$q-n5tl0@-bTLnlNO9y& z#T5avC0GMu@TYR;xj7_a6lY@;bDZ3>dbZ}dg`ZOJ9Donr8bDzZN!MYh?C=mb!5z{r zm<Q@ek1XjarsRabXu>1zpbNVLOj-MD_69aUyUabyO<anNoeOunmqMLPy_=v;7|s3B zey7{z-Ga8fon8&Qe45Ps+RXg5=6;A)ODa%j8Q5jT?6wXjrZ{{{xJwAD5cJ^<V$sh! z?7-geekbmT1NSgSC+?`X;Iv=rnc$31Q8-0pUkb}x49mlk%I(COb?^naV#-!n3S_y9 zP%YP_lMZp?wlQ$x&!U3b8-2uqbJSaSIyC2EM9~#i9<`L9zMtIsIA`d6`S`Dz+5cTX z_kXEo{#|+E*OIZnR!{v?HT`?p(Z3Z8eV=piTRHVs*7H?n_X|nq6Un}<te#hRDC>Qd z(etIO@2PD6v&{X^WE2si{DIenhrTX7{0{R&MDgMGrK3MUuPR4>C?6%NRea=|q7h6A zzNYd9zrq)w{GyqX;k|mEWOhH1c9C59N6n9}d8}+}$u=Nq>!Xa;M;NiA3@y;u_k$f| z^fC{8dh`aOg93U*YZpf774!!H;Q}OqClK}lG75kcL%*Ofe+U-pd73o{4s;DB13Gj> zwbzMvMR!LlmxYx}$z^B&ynxy(uJF@1<io-RUdaWz+Sk7!zU5^aEEIO&2?4zR%oeHt z@lt3UQfjz-h9x~2D4t{_9C8fP+A^Df6%Ch_Z}lGUDpU7TGf%Xck~9d7GV^QR?b~h{ z)Mf79feVX3G~{)e!~XWySp;=k1az7DqU7qrLo;6;Ub81~pLKAbO(<m-h916thwy_K zDeG`lVFR$fU?!kL)QJl#>ZE@fku9cVA)@$tM9Foo@(#c85wCGGu4au}eupJrL?sTm zkQ>35SK4eu!IEDFQs^90I2R`S9MUG#K1pu*QltYGuS-V%T08x3^~`@a&;Q?=GykfY z{;lfdFRGc}YG?nWnmYL(WygLg9s7IHk-rum{vmhpojwP?Pz=1x>VJ{h_Y^BVbSeW4 zG!PIX;DVYx@8DMjhu#zqe^WH{7PCZ{swKnkVMpM)@X$9H^ZVZv93)dm1WGPgtRJG2 z%p?&R9TYJvAYo)R2{TJX=cDuv5*hop()B&{>H2O%vI<$hCLoOz!~=uDN(Wsv2`VqA zRKYeN=@BA^fPx`FnLc5DSe^Np#<o4IWlE^RLeMP<HWO*!sG@827L2acI(;WImIjnd zAP9=4&!JcNWtWLNf!=1!8sKP<)-e=uWU7ji3vlTl5_oChLJbFvL)8_YJsX-i4dL?P zA9jmEceBnWxXCI|V@CPZ*f47m<~|j>y~@x;Y~-%q1)cJ007}-Zo;^WbCf=<;X-{DH zUe^BIz8!$elG%fYxCVC!Ge5$YWe`NH*Cu2?5QC1{hV|Qo_gjYS#|pAJs|QOqd&37E zIHMlClb%VW=!&jbWtUPnBP&;9RBK6^&A94&ag}!>@~?&ETtcyhl!$3!K<4?7oQueW zO!-2f2<GV&Q+6S-?!L6|o9u(%79RPba^fGVssB(-{i}BRUzHPoQ_q60f2wBw39qW= z)PF+Lz*he74|#*%<qy8c5+dsNg2V6fhrh`gc%#_=f&vAY>Cu6HEL;Ex6jI<0%Rlno zX9z{#t6b`J!NIQ)`3JwI5yJ%-%-R0}a1ojS7r{!8Smzea><6T1u=J48oFQSN4nrqv zI@LmU{2)@)ca!UGrPRZuxVF7Ogf37XJOt=h)#XGe7fNy>UL;BCgIH8_GNkjN{^KV= zAaF;|7IDR}90}{4UJ8N@Py70?=Os-P*{lXTmb8!6tq49g@T7n&IBZx1Lhl6{7P0*d zJKoeQxQV9-lBCQ2a(w9rQ#C{iYv{N)Z<q)ds~L-mXoWX)Ewf>&_XgFOd7}$LX&biR z)K|OHyV;o0Xa=zYTdZ!%Dzq2Nz(kMOhpdA8cKH#$@KDcJyQz;B;)OLms2lX_V|3$L zFlZ6jZ63JKJh0OusK+X}-<Cb>%pG%y9rsSgD&K|3;+3e<TkO)6nDRTE(p6+d4n5J+ zS6q-UP!&NHEcv9*;VM9eO6x*Y@%7MxEBuxxiUE-FeaX?EVJQ@i{FHO(y^Q)waqt_I zUsaR;sGa%G`qTeiIq_S`(Z7*#^yl0|-{ud!FB<v2_{a~$g&6!M_rO=c0$zJc(>>a8 zC#HMLeUPzTN6EUVC$fD{VV+_I2<t$(2VP_4ks$Wbl=x6}q0sAkhF4~Geo0u<2jHTy z1x;XfyY?a%&G$*Ek8TS6%Cu0umQsHk8_M*vL`)h#M$J_!iIiVU#0{%Lmb{!y+Fuq? zis?)JOSFMNk0_IH0j!`l!WyK+6;TbmP?%xpH$|&6S+16~V0{{0&}cthlc7OTdmkej zey~>!7?Cd|U|z$u5Q{@t^QN$>j>UA)*RYB)6_lYwgvE;)NEPuVunxq^m;zi-F3c4j z!?k;vjcBRb#Za32R3rBI)gT;WM{T2rO#-`i2JSOs?lTSSH1Q|vFV^7$a4TIC&`&&K z5!{Qi$|mdp0%=pPT@=ZibkJ~tDWpy;AzS$GBbgLSIKe%ZLHn&j588weI!2FrBush> zV1Qi=mM!|Ged;f{5G=pUlwV*fE}(vgYN4D*dJNCMjLsOI3JrX>IW@OanjQt`U1nFT z@HJZ^?U(5DL+vE*e@!V4zRRNC77Txn3y4(NvA;vk>OT3esuTYNTo_A_{w;s#FUXBW zBR}R3{UGjop52d<{v}EyeEc8_Owp8q1Hgs*fCg|7HEVsCq5A^T1a7i=o@e)AqDU5m z3J2cM+Lc4?f05Jo3IPDg8d2911l|QYg}1{u_<$7_B|ipf&%rXdej|t8xPU_jj{=1~ zrjEp&*pB2nm=eUJNUkC4I3naTQi^>DeO99&Bc$*`m5r1IG{8t|%{5WYtyI+=VKtmE zv{P(g7YFI<YWc8{1C0>qQOw%+kaSmfJRsYS(6(QFEd|R^AQZM1QYe}goA0DH-TpA5 zy$sQe-ViJwpdaK)V);dG{yFM{awQFWaJrBd(NAR;(qb71Z?qn!1X`NSy=#0^VLyH1 z$)7-(M3#U<_9IZ9TLka73O|Upb35+H-mn8!VNf#)+GQ2gWA4|v+XvPc*y=(G#fU(q zPv1B7*6#L0mDXiJF}ux~-Ma&OOar>D!v>sUj@rc>-y3z*j(gmVH|>^$)u35l$yr}? z#-z;z$v=-*uEA}9oW)h5aqcOqF%)Nr=!#qMHTRM<kA$tLx}FJIw@`t}x?iVvy^s%l zgXv-}N~0rKC;UY@^_%kKZ@AD0^-JlopCM{RBR@dG<o#dE54@IjJqItCN{U)GK@bQ4 zUjPcS1G13ukRAaCx*&*y)k0dT@D#W~A)j~P73wguvfcj%YL?p%;$A7Jms!0}KS-H= z0*Tk-ZIc`BQV>P_!$-T0<_<1kwxXF3-8)zS*H0Gd&Qxd_npM#hLB}n8y81SWn}WI< zDG(EU-e^6p24!SPkX|+fadaeAT|uRUNCqOPmuis4(1yP%thpni>h4M!?q;^ENwHhI zeN(P`B**@su19o$FL4{1#qNPhl5k5Gfmkv&9Fd>nrnq@Et%(k_FQQiiiw)#QNmgD# zUXID150Rb@L`MYg5QNJ;s)xbtbC2#qhQz!PcmXU^PfCf!8~B`L1y3~X!5hbRhuy#@ zxEIztd{HZQza4iNt1}MqM=ZiA(vuf?2=hY=X4me(4%2|1-GRLba^c@&>fdGRrw?Bg z|6RNM@EW|J$1JGNGPK`1^pGukgbusN5y$AGE=g0AbIOcY#)5Cwh0vm#Nt&$~<y}tI zo%q@fe&bex`azs(Ewu1zRQU=@F23dwPyIm9@JP_GnbLq=rC+9NpJw*HQuM#gqTZmo zDjxl*X!J+S8_UN3h9rq7KmPZE!+!x-$eejY?=yOy%X?nt^u5mNdXd@rEJOFDjM57Z zoe)t-fgr#II*`!lv_=<981XDL3yBeYAz<61@-H0x8hl~8iD&VJ2v7zR@eTkM?*Pi^ z5eR=!FkCca4?kv%7}5Vg%CCDOZ2thyWcwPLy-2?*`8YK<^c%795R2hAK14m~pCCRN ztk^nY*rV=7U{z4RC`k-fgrpH|U8`VA(r_=M;hwB{Q=!EvCQqSSik>Y*cK2i1zAXxH zLG|KbrWIjz=wfW~=bW;OaWMJS*YR`Us1!_W>7!EM1Y<iua_#kms>M(REJ^er03CFZ z4!gznJ4E)_hId#7x7xE>Xt=QH$2DQxCH@#1puEs3C7SWzPmoN=8G%a$?DnG3g^C=o zi8<`VA9qX~v*R4bUAyQZ^e0$`qHgaq1zbUWX3YH-EXq8XvS1ysVD+2%_w4fTHUVe^ zJp!ObFf?%heAz?{AxSz!9dU{p^-P)Z5T6UoUyiC=4=q~dH$F*j-ioW+NT}b$7^Auu zU2&VMr11a##~>?N^C(t%H&M05Q?0?n=a#NuSvs|COVa%Ut2^@kxA{ZgLBjG6e-9Od ze!-xqocy)y*v~lw?*Jf-u~Z$@32?nZ-@Ls0Ra)y7XaE*85Hvji2!!Dd%?CiC=yZpt zF;k@B!rYP6_5<)$p<k~s%f#0}^)QmRBMaS6QHr6|2U&E`wBi~Uq%4ChqPE9gwH9<r zZ;D$<q_;lQ9~MER0vD;++uwLgNP(<|6(M;*@>N>PT?8)h5V?y?>flL{?LxS~$`Dz9 z#O{vtrdwk0g|4lp2hv9DkKN2_c`R@J0(wQmmDBr$y!#7T+Xm__2v<xY77x#|(e_Yy zKBn{n=C7Dyq++(&Op*O@Qtbxzz@@jsD8>TTwXnQ7mSUQjJ?)o1!AO8mP<HGdge6N$ z><E2s#C9Kl(P;+%q+7yqm$+l-DL{vmO9Hy&Px_%}N<8bDG~vdd#JHC;?3_4`<r|-r zQ})rr#BX2^STHFIfECzFnFS#A=>sZ8gsj^%uxD3bw`ow18I&uq*PMxLd(bLu2(c&R zkOODTE^5qGFykY;z%E-&YIqW>+6*ne$*EpNwI5!5gOzucU9!T=UE);U5j1WgKwM1q zUD#v%+I3KcMI%o6N<#fQS{_m<?H9tfEm<#oceIw0P)_~^vXB+Aq?k^Mt+&#?SG>k` zv~vj>?k8*TN7@jz5OqS}!$z?Lpa2Jos^Y=7g@bRh_dkbwC5LyR_e+5e*dltRPmDR3 zM^G;idc5G3!N@r9iY60v7-j)<HAV{`z5!VMKSH-9(LTn$e-f<^=uQ9Rq6NDcQETI9 ziOmcM93~qLz(`;AG~G_aCh69DXpp7@8$HDOQ*x;E=DTG2*Njt~?x8Ifky?LS+_;vG zZfP9qgv5_+jM&!JMp7a)E4S}SKJ`@5`!q}Y05XSJX>1ub`kVt?;kjob3(v*D0a0E~ zuDymeD|{R543~G}Ac6;?rn@N1qKX#6^X4P+=h-=D!ll!Gl;Ega>_Ke4z=lM~7WhKI zu@97?mG9G_tOXbVzT!Cq+)IS7<eaB)29~CM>``alq#bw6I(!Hvd2q&gAHj?*dkE@= zQXPtfqzACf{OKG>k|d;TSAhN^up3~R1@u}5Q<Qb+L2LFAtB4V6_EC$_!`AFEU&(@> z?4obx=l)rj{ACvd6<EYxW|yuq6-&6oskqC^yB1n-on3M(UbVrkc@R~$8ee%Qxejyq zM|}0eq}u!O<=FK6kXL;l^;xQBOVaZ)qxU7o?1OKMj{KNE{GGJ#E7<l~{a;g=y<Z6$ z(OUXA1G%B=Wk$!d)RxDj{y|NxuekAHqZ)(k$a`ND?0=QB|D_z!2X5XFy*l)+Waxdx z=nut1-{Ov<=Ovjac0NVR7b<#M0WogN7Zi*x;Ajz)Qh$OA#DQ4w4CrXQF=7fpILG-* zsPbB|nembS931R+B(8-%d1CV;4y0HGUt~8L_7CZB4g~>in>d`ygySdZ15We}_~a-G zL~0{N+FEfy1(XYXLA(GL5W~(Rh+tyPwb+Wqs1odYI*X+pbZ)`TLTQC51g5lUm>0A? z&eA=R>9+7DScS))D0bmzk%jQS=fY*v0jc9|aRZLgeS5<?P<0_3LfdSZO)!@*M?;_w zh6>MJWalqo{TGHnP}T*8=rrK6##YnVW6lW^d%_1TSO;x6qn`XzHtaz-SilO31hPmD z^zSB!1@_TJ7)g~RXOf3z%s%AIJ*)#(>?5e?o#LmQ<4?IJe&U;P!Cf?O&zp7?&bg$V z@u#vbMHH{ZsW!q2Z}><rfT_sRRp18taED!amtDLPU9tjWpI^Hv&}^kNJWi;*lcd^+ zuUv~M#ir*CUgHM8c{8PLOQd^(B_c`J3vuUD1g@psFH@Ru=FAt_y|0T7eV5n&E}Qxq z(nLPr_RSPh)KkzF{p_&onY`~w?*8Y62j3J8d{YL;{>Z!1qwh+`-zmp_Dub^v_zpnH z^-}{N1|*R=X@P_G(YX<K=xhs;kO@K3pM?w0;vw$SNYR8*1TOs%O!R?E68)+XxdT_f zg&?Efvq5BJJIF3IEoL1k->@)_Y0y3WTGJ+BiZo>05x~jPw`h<KM)e)Q1ia|n2)sz) z)wzkiNSH*#Q_3qG(z%8GJ!jB4fn}bgip%6UgIX97YxoHOJl>S_eN<iNmM=vWT?);f zi^%!}aCs&UImb|dOFwVaVYSgdv^4}IWt<C=o)3kaRCqPI=o;{f$h(YI7_{6uB}_QR zkAW~O#9+bCHHkXul6b-~ZX5?P*pU6rV>XdTEJM+XdKh8B8Xz1Y0x8pgE`nR&L6g8f z(;&)>)o&R#XdN}?5IgB9nDY}a_=?UmMCZID3qU6@`!XnV;7vom!i#RQa<2x+7o%Z= zmEVafyNx@LufQB4YZQ^TvenqCd-1gok{h;?>o${XH+f3r%1uG-W}NCaPmRUn&6LIm z{Ce#6+DvVEBx-$>rri>2zesI;ggcqtFY^YzEgt!?bo8gZK@@7=C<fk0y1qnYc0bGN zewI(Yk@vmL?tYQo_hs?e8@#N1?AP*RzgJHDFC}&CuMn@&;rFy)0Y<nLpbQ+*0kUub z(0~uvp(mrXjfVT%h=I86go&4JzY<g-^dxP7E$9SI7?LDbkECtXBP309TF}yl<G#{y z$bde`qyU?bNa**6Xzuc{zoZ%`^juGZzm9`V&=ifzzvV8?7gVdT|2fHxJzIKH0=;QB z;wvt53$SvCj%IYp!z{gs-ZZcUD(RLXinOSq7qaG7OxYr*<TBt26pi}|j(TB>bix2m z%%k^HJ4JOnu)9KKpM_*DV8qg2Q0Ax5FIY}cFf6!)=Pkl}a!NSn&Yyym0WKf$9Fiy2 z{TQj!4zX|)&_#91jepu(blxFu(v;c1ht+RI1yeR5hxRc0tRm2+I*S}=$~=TL=*GjA ziZg)Al{dpknfDhjxC&++`7^-ELySiIMP|+w8Z=xm(mxH(y^6#bSACyf|2V326*&_r zG%$N9xbS8~$!b*PT}WJf^*X=i0RmtFvIG@cPpLIg6P$z%ELo>EJxI~qPieSMmsxzx zdP3bDs2l44GQI0sGWG+a^w^KE@r#apS3L4v+2QZ=sn@v&N&Bg^_m!ys>-=Nimrwmv zIr*+~;x%T8u<8q8e;gz&gpe-?7dS(?MF)~0MUzDf6Rl0OrABn=&&xs|J$&4x(<2z9 zvmy-_S?ktsFhd1Jim=wl(zY#}>V;F75c*f5{{QeAWKI|z#GIuXNP8k$7_mPtv4X7Y zz+;6UhPs`Y`8fKkbq#z$vry7w#PkslaS#gjhbJkQ6HAu31s9`pKjY-1591OJB};$@ zh8^eFx~bnR0M$ZP1Y6iL47LCk4)}y{fi1T<c<xk>V^ptGRG(c$7fPtGtP4!ZIjqp2 z<qoYaXhuNch1`h1L-1vR?KHgO&b)EI^m)h`!Yz3k4eGw>3tpmgj8trdzv>}4vnOmA z6Gh7ql=?$<>=Ea<$)L=OZv0t?xRXu^)38j#6ias83487Y<(x3(C7O2^%sM4wzBmv4 zLOu*Fyn#Tyh3v<WEC4P@81zff@CC9W#0xL;mcnvf3eLF_TDZb4y#;Tdr`q7xZ3>Yj zHIL&}x04`TsH~t-O^?NGPsqksoIu+7Qr7((YuMtB7oxUDVyfdw?!f!9v0sXg{!lXV zzGURviiw{}CVwg&`%C5Ize<OH%pUwv-t%=%-?#gybDe{C)rYt8hhAj#zs&5~!a{Wp z^{U{&+tNXJ_HS@qI`o#95{KSl4vAR+bWEyyLL6BAf+M&=>O;^BLCVtFs1Fb5TNpti zojw1oTz|kt?_tz)M0@){iBwcX+R$SGGROtJAuX-p9@+6mTKHG^%H{Ynvh<DFpx(m2 zCcsQmfBx#aw0#35dL}s_69zKcYwrsia2&xhe6xg-E1bN~WAZP?6<x-0cVz2%384&` zFt!340hXdmE`l#k>0)@^xlq{*`0`8~24b$U*zDJb@{7SE5B)`0P(I_6GUJv&dO5Lb zj9Q*RMhRzNmV+-mcH=>9CY<8N?KtE1+!G$jv#z{Pd_-7j{@fdI3C}Ww^9;efU)q9a z@~mytQJbhytMJ1viI}P`0gmv(8v$9DTvN^f7Z<@SLwp_umS_5T@5~E6vWu+3>+JG7 zm?-iazlg2bK!!xE6_QUalS;mH6;&4^NU`Ld@fnm0K?Dw8R<sgV`ydKaM&%m6;jy^= zg-H7>x#_W>2{!&yVe6CBc2rtlNqb&p?SGR)(%{b}hkwc+c#}(gCDFm;+{{1twqWpe z&e*T=iT{)x`KhS?b?xZmrc+yOllS|NT%=A+pX=4>=J!|6x8=>W)(v#b<*FazLsfJ= z&+U0xJ`Atxhr<51NRs&@e?dQC`H>&WNB&Yc_?Dg}qTnZG*~bh?>llp@tzfwRAGs0S zfh|(JH{8SdOC%?f6o)=m9I-=hzSbA#aQNwVecTso?up2Vb;5PA`mRs~V}4Cki!&eY z2$VOIE3fgPT@^T41P=eQuo}4COsU1jTAT}UKZ8C6vGoD=YKmL**%i*4<}UUz#gtM@ zNP67TCBTJ)I-?44XvRgHaRAD2K{lfoUkuATAC<olopYX*KJA%s1m{tC#E<x;90hCs z!ejozF<;?~dm_$>fr)yGR8#TC9b%86rgDlOcS^wZ7}+<-9YZIvC40ysY}kx7%*wj# zk$h%v)Hvl7e+pNQaZ}C-)ArnxNR9y+pL?d9b>V#i=vdiHp5pUCdCOeYgOH*X_w)tV zw0UpY=OINmqN~<oYVPwik3$M?1Y<&2yb@fnOpFNSJ!lllETq9GeZ2)i!;CSea*dUL zBfj=wlI9DZdMmbOGqwFI0oD2}v2KH-S`)OQXn&Q~@lvRLmejPB()v`WeJbgGoip&A z;^4Q%M}Df9{H^wr|D`(lAEjg8lbIf|qP~>FlJ9;eZhw>8@vy1y`smR7*|B3IEviXP z;be2^jU(Dq4MoQ~8$YF5#vAjGH!9BeDf<U**J>AYwKuc-pUVcQAJ8@p+oE{jCAuhz zhu))wqU7+qlEH6D>g<18(2wQrH%OP5MA8L3XaZ%p#uPxWYoubsvtW>Z0gkrZF1d)K z&~%>^=GbfdaU^&2hnhgaC<0yW9fY{<ZmMckpj=6=goTQ=pIai;ofPGYpz?Z3<+7k^ zg<pOnsr))FQgBp8)d~U_it6sB)ZR`;)RBq`z#{J<aC`wW9*!~qUVsT;(Sh?>qKiJK z*+M>KQnFbb*22!34-igzCmr)h7!A)n6E6ECBx8yxJ^{p_SzgK0uJJfy=s2VaQ$fp! zAv>~6gL&N%>&PLL?buEeS#;Go=_FIW=qLRQ&F=Bad*S)ZjFhuh>@iyoG;IoMhV17p z{?uP~$wzV_y7)G?>RxCGwGvjc%2D1&@EgC3QQnU%zZ;;q!psFqw>VYn(PeAFimQ+# zq(Mv>y(J5nB|@4YUJx!O5@X&q2p{0$)I7-A|DCMwy`<|c#`Lat89i^sy60luOF`=s z5-m>zO^*`Q8*w%FVr$mGS@wbVlx+Xk1;am7P5y??32g2upZpzb*Rt+s;`WEq4s^q8 z$r>*74t#QQu;=<o-JO}f`LUkWh4Imrf=?$0XLPEG)@tB3uB-W^ulf1)3tvAP`|0)B z+bid%=5Cb_Z02CI_V8Z-5bUmOtTFbzgqsSgP>>ZLdPjm9d|PygG*W<P8XuJOpow1Y z#t4DK*CQ|yz*F*$FEHH)Uv#ncVY&$apdII1JSJyB>!pokLRbROt9r=PZK3KGz~Yyq z*%{|8t%9l))onrbt>h}|20%jqIzi<PJR!tp%Sw2r*LdYvnp{r8(XLfE-Ss-^s<?_P z@l{t5$as(}ZrK%#D7F%-uHhV5kQFYU56zlm$<Ty~?N+C7=v27;Tv)~&*zy-lu+l#X zlg@@^P6I5TWUM0(2c*qW_z#GoVbnPRaE+i)cZxq|A2)7+rAGDuLom%QSW3}s#={xc zY;tSY66)cg!#=+oRlFLKbp<thuxu%|bj>AsmYK8Uk#WvCb^=usyX<yg?lt5ye<Zr{ zyJFqzl$NI~cnnz={S}M;S&LDXYtpW_DOB6@q=qjzmFti&5Aj(>#saH=ObEHv>+z~5 zto&6U*&?_4en!umvhjc9AN^Z;|2N6HXDRz$<_`UsO?@kBe}RP}vG#?i^;v>?GpX@0 zynSKo(~Ny@L>({W2Z-HOJN=9L{BP<rf3F?=Hf#TrY?3X%<msMBG|SDM)Z|G@JF6== z+ut>Rpl7bXdbGayK&fn^O><aXeV)?Ibg0kvX|9fUo*$^48=$TXb}#hRu1+7ldG%52 z*iHF<SQbz62EIXmMq&T^+yS!w2$;454{65>69j^kezj?PgcC*q$l_sAwUKqoeP0s3 zU~x5X;CK|$YKS9rJD=btA{$1D{wdH0jRRll>NU`mRK84PO1VNrOs``EDNv@mg&^0U zs+s_Z7t?`<DHS&oDwgA^N>cX6;Xn+GRm(BuU<$_pp{OD!4Ac1+BS6FXQeil=Eb|OY zG|d#AWMNZ%#tc(5g=4gX#W*_xXI!2Sk<0)z&x8@2=HV^GDOR(A>GK#-xg!B0CA#t^ zU3e4LoI(4z(GbN2P8oFzE6O}Imir#2v_47GJ<sU+3W<kTyU8iN9VopRU3@F4=23XT zN_6>MU;zmVFTTmsYzdm5LBCKqB{x0I=z5#p@mkRQG(r7{i)minBZRmE9>Ck;k$;sR z{daoDJ7)e$Na6M9%DeoAt<=_Mp@r*_r8q(BB_(KhQ8fCCYWlzH&;CDEGyh$F;&;XH z5AuQUGrHdhTEBp7q0CCtK9lvnm3F`3H*ZP0zC!RCAIkc^Dja@acKrK_slO^G-q(&k z&l`Rt*!LD&sFk`KYMHDygEy#_pXe%IJh5->{E=(ZtxJ>IvqKFV3&$=D_Z+RO7^yFr zp}K3&AJoiI%88EZiMHD5cI84(>&3R>Bh+vuwW>JqRp#K|@(#W$?|o57eFLoMi6gX# zc2O~V#5FBeSQDayehA`V^`qZ{bo5|7yyv;1^9dM25U|M6syIRwcEP?c@dQSk2MzS- z><PF;I3^R~MM@~NKp^gCG~qC}2e?i}x>I7g8<~&<p-G9&Y3Sg(gQqYOy;I#nffZYF zCARc~SmB&bB4Xt@I*J6@ZBn~R;UB_R*<x(TVszdDOEMFXG8rJ60$hQ@lYWAUz|@oA zD?&C0){r3?I8{68sGr`F_r^9Z;S57~#x-f$DPa<>f^*`uSL%W*e?BB{g;)0w3wyEE zYkbXvjIP&m>Ro2f*NBwXFT)C!JyPemRcjoo@-AeHTeTiqa0As6N_1iCi{$3#aH{;} zmjnJ^uHFMG$}HUio#|2A91)Q$A_5|kb0~7o8H%DPiUJBKiXx|9GDrr=Ns?p{kt85V zKr)C3NSn3Mwr$()>FJs2nRoBog>&z_>#g;1JQRP4OE&xa&i=x2=+t99G-S^Lai-zR z0G&Q-RyPQt(So}FglEAHt@L}R%uS2<Rm+4&+6c*`7IoQElCGWFtO?`DIV<9k=k*<* zvLF4czp$JB;aC01Iq!u>{wv2+)O0<yPh8UvAtsE&pj0j5U#G`@U_+oR`6-a)uv@)g z6+300H1C!5*e7$%CgY81{2U{?HH{T+D0({3T$kf$66a~{r7jU>twVU2aBQ?fEL9p) z11hctbXVr(gix#FnGJ~n4GBIs^O-%>$vu^Ew{pW86BtE7?$Ml7`-o9e{42tOSanXg z=a|HmP~rE$R$n28&Hn~ffR$|w>cbXsptO#9xO=9YGDpE-6v|`g9Ec_7*jbnOd6;9& zL+gl1m~GUQUGy|Qg*jjvc=QZ-jO!kEgEPPjBxV~v=|Du!0Daiu3vj7;6#*HL#SN{v z)m{C@yPSoiBtki;Rxo|WT?3yUU9UUpZXN3GoiG)*R%N&5uOU3>3oa3mLNtcc1Y9u4 z4KFIWG+`F8xFO0Mu1lGf?$T72s5XHxz5w`=GA<U;%HmT_I;}u(y92qf;u?fa$OWjg zlC-!fW7{ld+$dsvQ_QkefikG=4}6VjF$Q%4CoH0uVV1DCCA08ZQS(|<D{J}>U36%M zr~uJQgE3|iwQ9g#&<UJDU@lMY1yhk&GX!W$(QD9{GjA5Lj4$i6=H<Qa$$8y#$a+Pq z{NP>oj#~V|v*>%{_+`tab-VPZj#<y#^4>UJd*Pn{j(q){YyK<m(hp&+|D;!bbSrq} zS@gys<q0|GJEW_jTcO6wE^);zbJIR))jDC(HFL`YVrRyNZOjbUgJ9%85xd}?wBwh! z8lTx&mYJ4DSJoHjXPE1I>ubb0nb0&OX<D*m6&bdbPFA2tZ9FYI&_0jD&=EbIALJfu zuao4Y(^n8XR75mhrPU<{G-d?WMYu(Ixp=ecOi`Z^Ib$2u@0jq28-eX+!V$THxPUNZ zB*9%)QN#m)3*{IV;j@+zD7=7RF$1N<Bos*ksH<}@fCKFG6-PGQanKI{B|wZzT)Xxa zT-*o@3>J=Y&=`L?<rp_>AF~U(@CjrmzxGjbRe3rWTVLaSz>B~RhXEi3J-k4THm2)R zx-{K76`k5tki$h=m1C2FLmiHSI2Iyw=aLtuS^M0<;Q@yV412}k0(A=F{APLQdMWD) z3De>WdIjfna?X?TBn%1xEVxQBog99(RKSZ{m9U#ggn)J4<i-WUjEk?!_P6Anx>ej! zTXk2$y6e2{O$D#J8va9wx0GoE=8=o=JutACS>ytaW(b^3qvrKl2#~tYnKh~TjvBI; zOe0oxgU02!$U<&q-Yk68JbKMGVbePPiAngfap;0Rdrm8G$~bDpHhqg){N6q9wM!Q9 zoL2hLqu?E-^aHKplW+CUl#&nbMekhm-gxA{!4uBe&wR>1cox1U7rZ6sy>>``<dy%z zyYP)?{wqr18%q95v{a+=8Ad63ODTNep1BSpLCvxWd)kCGZj`!`n18#D;8ge<7YA9Y zojpb&snYaRy|u0+x|@5dUL@k(OqixBVKy2~sX<vmE}20T!;1povUG|`0mC+fW}4+| zp2M)n@i#AFJC%pna`Z2SG6)BHBPnE*gr*Gkgmvr;lrYrI8;77A@xBH0dv2Z29GD7; zNb|5M<OsAGgQNfmyLe#Sh&2v`nTJgq29H?~Y}~OiX$uuD2L5rzI_v>*dg$)hP3s}> z+GVZ?gk^A&*w0#V@ik?STE^%ZI~+hm$1!#lwbPjN1oY_pBJe_w1_t8XgP8?jNHA3V zAzk`iTrLA=sOH+Pi2h{jMp+9~XVqS|CTe65v?E>Ucmn~J0tQy%b_XwX?{WtgX!`(J z9hkj{!JbzfYNV{t{9b%sHyfj~C5?+E42!sjM(v!lN=YX%<5)KOj3&CcAS6Ihs1!4- zmD;Tlm9}n&Ix1t|dC8$u&i$^WV<${2V9X$7T95UB&}Jg=!f)z=Wy}Kl<k2hPoVH<& zDi-1qiN%$fEMr&gu5Nf-dx<h+W88w2whnILM%J0%k+WVvxpYn6c1+$fj+`fPW=!K( zopN5-W;}JydTw!b%|7#)XYqS_^=F@|&y4Dy>6JghfHtRV&&dVvJPO{p5IN86(>L+7 zQ^q!`|G-ebB|H8VKl+ruM>RdQ@OePxdu~Df^%vCZAKaikqz`(=J-3P3cFA10R@s>o z!D{fcte_c`#(I!W9|<(p2{6`-b~NNztLORK7Y93)vK$FVjcgy&G>RcrQ@keD?{+$; zI)q&6@0J%}na?Dw6W#R_T=di3?4#^REMqygvm1+<r%&%!qR(p~FA$7IjEANX4>0gV zpK(v$4?-2H5+*D{K{E3;Q48i_v%nGZ=SXuRg$`s{M`4)GL%e7jgv$`%@!<ES%tI#d zE^E%TT_kWe=NJv2x$GD-M{r#vd|(v5FlEjLf6drLJj9AeE!huDgU3yS#z?-Hn%}R3 zzF^;bCd^Uu;Bhlp5E_vt@ePcb_YM4pG$=io;;H1?ridX|*7cXIYA>3WOJX>YRoxZz zEjzZzq2tO4x6yQHP;RSxcB!~^D7&`F5e_$HZ0e+~s>O^;`O&AUmM)@s?YwRd{Nn|^ zd_h$INk<(#7kpTZb<VIB#-oaCAy-U5Ugo?>ovKH_ibo#=fb&*OD5*j<3{<M!U}?cT z3g@h4BM$!a=Fz~6Iw_Rpk@HaL`4pT17Qx>8I`M{H`j&eA6}@!FGxrs>;O*Cr2};g8 zm}mA|m$c_*(eoty_r@)nCM<!utdrKw;#ag-6Q=PiyWI7bT*!5jUf17y7Jkp&6z+KB zzCj3&$1JWsvQOVOj$T9^s(tb!&{SacXW#N4DEZ$3TbNoy;DeI4>6-rB`P#a5#-L5= zR#4Vjd`?4iIxX8-tJzDZiDBFnZezs%ZM=(tmySd_!@Q#~;$B_yowDeuj-2kYn94+Y zZ+YBgb6Q@YMIqCyA;!Ie?Huo}l^<kR9^uuL7@X;88)a|AGFA4~y2!NBiVX~p;uO31 zbdo&ps1siJ;Y~WTMxA1o91#YF&zc2K7z7L(1dN!nr_4FC;3=!fS@i0{AAa2fWv1*& z)1V29kSVLs8LW7VNg&{cbK|5<*sNW|f<x4zWAvN@(oHDskDSI_Xp=wyaLSTBvuo3M zqgn8zp+9k7ht{u6?bW0por4+@X!z)90}`i90s+0r-M@X(FaT+@dz#cc7(p!O*eqjH zk0xeR^PSVjG}#hd7jeP36eC_RSmv^Iy{t`xjO7jP<SOHG6lh^a2ftSCaarW~qEB3o z0!?8quAo}-Ny+dd=UK!)LCg_kTyf}70*Fj*oHMGCg8XgKBxTp8&zv?4oYnQ4l!m<N zaYq%B0J6iZ2jDAU$~1Bw(vor5EEFWyjHl?p@wxuJcfl*a@|~a?A48je4r%=CU-OP$ z@rGXZ-naZcy$s-ZMJ;~mfljagG~{fMh@eSj+Mw;#$JSRLTg9)MMK6+A4@mf*347?6 zvS~>?vW5PczHNhj;yP%{IrD{W@}_mt6AR*zL&i2<G>Jij8H%;mozgd`MQ<4u9|J0P zSaqM!FpW+#O7Sat&UfgXcCQ5MZA7Pcm#0UqG{%$#S`{#DhHnx@12;0fbuU*XFv}DC z8q<Q>vso=U?4Ih>d(HVzrn{!PYsOoP?l+|m)n2WPal1i~XPVPj?v&287c^(E8&ZNJ z?R8w`WTGsrsWM_2HpXE_3QUa)>7LHPk(EZAAr<y4(tCFJ^^2KzNm#Z;Wk&FQ;~>~5 zru~AW2-GP8P5MmkCoqE`q}oRTD2tE>mTcf<$`m<w<}l1S5JCGSfCCD1ik-KQ0+G$y zhR@)2ea4W1-!L!;0OGxP7dCpn_q3^Z)ycQjJW(=wSJ!6%&lod-#4$tv5j=)x3<$qr zJ>PyqzabKBKn*Dp=hn-14JhJ6pXq58%q-3k(kT>xj{dcU-k=!s7|!coKZnsV8d;~6 z(u8z!Pb#Gxl!`cfAsC(0-v}}Go?{-m$i|%b{b<@3!pumTf-79;E%ZYudvqy5(WDJ4 zPzRx>s~`XmA|606Qb2t%w{m?(KjeW<AYv&bR%VPjT<Ow0cF_?5b@p?B3lIyb|ApQ3 zCA{s|$oAi{Vb^^Mto{&O|0$>rXFLqQ`W}sjU)yqU#xp>HT=Xm@_mxN1D_i2Rb^Mxf z_?$`joK5^A_*+DE*b_!ktNLM!I;>ff2vm`78AmKyBFf{Sc4iq*K;@#9e{{;)woF=f z&E58|{sdHqxBfNs<`?`6g6e-^Rla36{EEY6WcBl+jKbzf@6qz;JGrcuT+ZE_S>;8X z9Di~ylakGJFJOBVvR$q*ZSz8%3nD#wN)!4jlIn<b)=)!MS6*aaIZ+WyEsby=ZA$N} zh^tEpXiDeQCx@1Eyg9}y!6exrGo=t4jSOGY9I6GI9>%#g%1B%DAXeRy7hO}JFsyJJ z+O94*5G&4C*Bpse0LvI%04$W&jsQ|$-6PjSvQWV_0Rxy!gNRYU2jDV9s1$G?6b4+_ zMa+T4zOtJ!a|~ZK@V^H~XT}0>h793?{qE_}`!zgoD>=8qk71)pLCU$;fH8;%07et2 zN&drdiArvmR@<TC+O6)|bJ@C4!lXvbpi)@3?2K~GX~islwS0mXB`osjdrm;FAy!^A zqN3^fQXIxO;B_=j>=#43G#jnc-w0v28WRoF+z~dI@U}b1M%klV!S$A`W4n@jw;FAP zYd&1l@<WXZ_lIr7nFf+}gZD*!)+7`z<FJR&l*}UM&7)?`i0E09$Qk?OHFVlAt3L+a z;QoLk+y4>X`ZrF~7iQ&qFbTWy=a7caK{tM+m%Kyw1iknjszYgoJAS2~sD&R~GG4i) zZCl4bQu7^Bqu+yg25{jUgD8P5-H<tD`l!0!gkjjC3C<3o+<y&N&W>33F52;}B7UM4 z@3`eXb3%V~@eZp2-~0Edj=y7#ZTlnc&c9;s{*mARQ`ODU!cfotRIi>qCS>@TyTvoZ zwYOWdX(XjEJ424GPHvD>aWpy8-?BQ=wLaRtJ)Pc~Mz1F*nGEBuf{64$>zYJ*0+|$I zEAMYA73WS$^R^Cm&@Tug6Af2`vI1QylY&}{lOibw=`_m{rc+*YY+}x!d-ew?Y%Xcs zLVJ&NRJJ0K$u06H=RNmG+jLG`vxSrk#~6k@5O+0Zje}tTBhU+0JtVb!aSIF(Gpvni zQ23OAYErngX?Q}IK4S#)mk?L=<89n`Vi1`xkTqz)7=lYwal57FaT_&M>f~+>&pUX9 z<TIe*h4Ps`9iO{uo}G%W?U!vE#SE)Nbjt+P^H0j9^QmMXzLa=KIv$002c_b$qR$IG zgnL9;-vUM#!qIrMS2P6uguBhqahN}eCa;jMutG~UHr(Mg=ll<d`0Wv(p|MNO>6V&j zzcy`1jXI=ByRYEZiw((tQja+ajzXLcVbUrV2^ZM1Ma+UJrhY`tqW4B0bq5?wk(mMo zk+YuxG>ozxX7#7groVA+{*6`lnO^c1{q+Q+9O3o{X4OY#?MIC83$FhOgVw@Ze+z5< z&A;XcS_QE7#y(}sK54`D>bhIj3#W91-p`<T>9FUGB3DSPSvks}EV*ARXk0(^fob$2 z9HV>oON8^((hv0VPp&!79j|S>=e-H8{VBBJ7hpWF`bSRdZ>+9At`7WONAzx2r4sox z!=XZUTWZi~O~TqhS#w@^1lhzxLzb)w<w5Nl!=ftOxs2o3luD~2+`Ec6T}5Hd*+KnP z2`yQ{3*ANcYOhwsQ+kUy{UzZ|iN2+w<TR>fps|9lp<H<!qbV<T?cqRbs7ttwTC|~d ziJvQxkmQv*<%-01GV#P2=^)Gpi(hb#TXIc&?4GvanemjG^^Bapg_=djgcTI?e+3tb zKCDB#r|UCh5;&<(AJ+33`f6HUecDt6QT-$zs8m1}BKL=QMu$3}?$M*>en;D@Ux(VS zMd{U{4jM8>ckMojb`P%;2)w{kSYbNeBP5?um=5i}CZ%81tw+iEwzOH}8Rfj=vgrcq zdFaqOdim-R8DigssBa~>V;jEq-UDL$&xh_4#dVh$Q-d+1L4OerMw{!m=YzgI$2AOs zz`BQ@zE{8(>z{e4VkQle)~&LHW0w|ngycJ}Ngb9&(hr}~P$)I5i|7yMnAnxCdN<lp zZLhAN&Bh9a!_l*PLBm=oN@R~>McJoU9@=c4qR|=IJ354fqPOV7;YLJhPmtZE7QFH) zL$m!3{3NIOOVq7@#&-X~YWd>d@R3?de00cs=A8Y~E$6js?km^4R~`j#owA>s#;%#g zJT{GbbkV6>8WlH`JL))g#V@-Ty!FU?Lxwa__|`q|txd{?*YzFeEN%mT$c<mnXN{Rj z%<3<(xBgnt^Q^L{IE!K0k?cLvoH<w&H{O^q-+iq<!=K|wGP-!yQ~Pof#gr(IaB0t? zcNc{W*2H(0$M#poPIqK4_m#|a<=-j_A8AbPDhbO7FzYShG^KbqCDThe9?3W{I%@lo zE=4<%x{H$so6E;q@?tC$!wt-XHD$uREc27A8QE)|sSD)PCHEA})<Mk=`Xv{^SD1+6 zkgx)5xu+tFzUD$CuAyawD|!V_n*=^EfM$&hhG)M9xlh|`P>TZK+|!{BX;B98qMq-4 zqX2|WGg!4K18VMf6;T=B4v5_aR`3dm22_q1_>N+azd_NdQ`WXc*0xpFwpq@xTgjzY z)qOyXJg7k)QF822b?sMjB)X-{nuT>Lgh^!rT7~FfJ|>&IPdo+&o&sTkr_eOL|2!Mx zLtuXq4&2?a{vyKsMudS`5Pue6{E3hLr?d3GoTY!m_jUC_E!JiG4jJ2a1?O%Ra=!)@ zh3J^vFr?`{qD<*k^BpwcOe1~=wg`NfMPs(rB6@5bQXX3qOU9fj5^Eep1_8`4Yzk99 ztm2pOfK|dG#xppluiGXfkeWu@gig?XJ=VAt@et#R0;=G>eu`}UJ)-k>R`VDC8z23u zzIYUTPcHhwz2Jju{u`(e)Y6ZZDH|pc%eui_315{lDowa`>xa(iu&3?P*Xb3X+zP&T zFL>vk`@$w^-5i{n_}G$IbI#cE$bF7xSx11m>T_!2R#9eVUZhWbv}I>LbGp4?s5G@C z)UqbgZK^XbhGL~Ja?;O4HH&UtMNnH(sXf=jhia2<6^0Gf6Zh&<R{JX!yYp@&Q=6~( z_m&dTo%x)mRIeL^XJe9Ybu2C0*EZ9`B-KGb(o{Xm%eFFxIbNGp;A@)Y?vqNkPIOc+ zbTLe-SPL&+4l3TJm2Wr};5Tj4F=4?ba^5m>PCsY_Rs7aa45PSXovfnfF-y#t`M}VB zLZ30FN57BiZ8h>;W!G*Mw{8#=q2oRHA6D{*_Z%}}PU_K7%RZvxGpO#_Bj*G?p;N)B zL&Xg-791er^dW4NT)Jc|>&5hOz$-y{!Z`!X_H4dl*P-ZiTaB9+Zj*PorR;L&vQ^6^ z^P6INmFMw{ZV9ha)^XWX_(=?DI3W{%1i=+?K5VZT=Pv-4D07bpE_Y(>5n+M6{v^o! zMvwt;!La!gulJvLX}ha8iV?n6AD|`=$znNBtj`eaid!EtIGXe!y#Uln&6{xM4OvLt z&FKX_FonDxwqPEP*m@ad2=JDG9m-wIqXD<@Ii&UQkO^lNnL+)a8Fl)&hVO)u*YFkh zeht3?lZa_ZV$eK;tA7cu|Ak(KB89hZxi7p+-+Pz+KrR31Q})p@^BK$~`-M%)69;G% z$<Qd4jiVQw(qA~FzBG+}Y!tC%mH5>4+H2SJXU?fl5u%~U#wKBnFd)9Sj~S<AEjw3y z@h;q`t!Qsb3A~vS+L=tBs)-z}W)BpH+(>jBZ;CICr9`_}DG48=o2VAj>{?^I?>8ns z=*YTV8lB8A&0*Qrr837GGfTo9uexZ2n8+l#l30dvg&_`|*H~@ofwghe9HvDU)g;M5 zE63ZsEX*aJ<32>xrd39flRZf(UPgIzn@A(21WtHX`E&?k%hE5j;tfj9id*s~LVA~^ zb(CD=ss;UkF$>m1bNmW1#y~h+_u(^c<Ueh~d`O~=gJBdLdlZ~{v^<AN-edZ-aRd6K z0b|OTIcwxUV;t}hdy>xtOv7_n$%*JuaOhTayrbmYqwYSa=Gw33HlXO(BW`d*Si1tN zsBV>zE;My+c{w&%fihtd=3$rfsTZA5DLf%}O<1eoqEQthu%j}`Fh1q1(+U}<<kF5` zPTtSuvCzGutZ#&Z0W8E}Sicbp`bL2HXa0ac@%t0_fJ5BF?+gC=^BLM@=Pnd2pnwVm z>q2HX&f7M_WZk<jIp30YYE>Y2YWVbN2MlTX-_u|WXfOt^xOHGOmR=xg*Y9ikk0KRh z82Zo%N5{xT{B*Gz0#zXo&|;%OA3#T#3T;ROxoyOAIDIlF^oZaoq!*0=&PedgGuNDF zfR7b&HaX9b%b{F<3y}flmix-P<b!Y3FFqANyXAimV^sb~F4%EOe{B@`$T)n_Fl@;( z_OUT%PRAeLX-M4%GasgOqZX|q$8C}yn<uX)<+U}(G4EzEyD|gX^Mc2lh>6Ceo&qAa zI?kmwk(w7mwv~}qIDOb%LoV6L^hP+fkZs>r8Vk8A+DWZ0k=~xo8Lm#eQxH@c>6FDV ztBfG0dRb)nm?u*V8wgrGLCx?r&!$?(TatV=E;Yn(!fXwgmP)k=UXbvMg50jUniDRj zr7Y{T*!<YiO~2Bgf-u6caFZZsd<R$Pl)Ubix^5r4XvP9kKv<Ke$W-`Ge#MK9_n4vI zv?02i=p!obJ(um;l$^U%T<^f?!PMX?;UsB8I^Hn!J`HMl-NT9p6dZ3|vT7DLM$KlO zjCG5=LnmI5G;b6pVQ^?IzgCF=p<ODfUkx<zsul7m<q2t(9lw$#Zip)*%1$fgAHAG@ zQZ7wUqW~RVqB_NARdY|tXM(?u%A_2Wyt@B<^j=YJJpX4w1Y5hv5)R@Lmq6g3`I&z@ z8vuh#+%+Fy3(XMc%<54(jN(rj$F2)jt%8O`t)y-HCEGjr1l2L}lmQv{yI08l>Wp!% zfCuuFK3Q^)0<|B8F*RBN_aRWAOaiVGnPO0wQP@L0){LhA7~U&nepB40U7kFs;CatD zbdePNP@OTULLbu%m{F#Ts4_-$IS<U^7R=(895Krw7kTJ6wkaC~L{h87$K<>>?)fi# z%HMkyy`~nwqm=B}rad)}U(*kt(+{1|3!5jgXSAR*v!@|m;D`xjSC2DgAG4~$9CwWE zY|hW_3bW`h5AVribQLm3nv-Taa{6<^`f_3^TC$GHmt>EgxWaeJR!J`0h?GUPDT{P( z%?|0UPG~0zLh6!y%Ht?GA=Vjwx|zPDI9HWKvVNkwVSbQRX_#YMntv9<Jdvz@)s_^b zekIaGEuUr|q%Rw4snB%QuOPstB-kO7W?dfU+Yo71N^nvNZZUJW7zH1E3V)#FZF^@u z^U8baigRP~x;1CcDs0}I{m_&(jn&X^Qq`U4lXK`&cD<|VIig3ORQDK?we6O*xy?1} zE|{FdT?NNptS}|#UU|o!EB4)T_IJ2nwe6BJZxbQi;Mb^>G;Ni(=#aC!bIGzplvF2X z&>*N)&Bd2?DIaRiHLeS5mkDSTpH#qjnCoX$3wadtcocJZ6f@BNmkQ3pdf;NhLCiF| z7`;a<47T?iZboG9hV;A41@hW;jDHaXc?EvM&xC=s_V6=6TyTsM_H7sK+tBeW<Jci> z*LA_NQ^??^gk`6=Wrw6aV(4CJ_kL;T0SWuN687Df-S5hw9F*L9nV<~Hq56;8A2Fcg zKcvMNMlp^d1VKbsAyXOwlj?pCm1qyd?YqV8d$gGIa+FaLYuPw<$vAr1FmgpR@F8AN z_n%VtAJ+;R)e4@{gJzbnW`1=YM?}-OWeZ}>Hf75pW0O*Zu>BP_&M0t5TEmwtuOhf2 z)=c7-j3VbCwOPh5J0?FtS)gm`OKW1xHfG%^a<rtj@@8gGT_oj3yjN8mr7qcfv^IID zII1biak??fPF3dYo^J#W9+VP3qsq_gA}e0x?^u)I-d7pZSDi50lseXu-d{_s_FbR2 z5qqa7xHT)FI?k)e-@YM{GEzgdXN3^u;p7At5=&2(rYM%`YTOVT&=5_znc!U+L5;Lg zOK>F>1UfWc^=l`5YZ3zUQi=GY0iV3LJ_YZ6^0#P(&lwmKoxP4p_m0GdXZj1*q%FJH zHOq)alHa5{br_~X8C0hXYEbU0k;l}?ql!)gvbH@^7PnyH#;xLnajS%BJ51cT<(xs2 zsD2|>n3!R+sD6WhcCDapt)zK}nBmQfW*vA;R3FbYomQ<lrJVQGcvSMwYL@bAl%7<` zJ*9x|`U3QCosdfxP(!?xckFV;Vd>O^lF0|fqmNvS+b0^nS0rqoNcgv+q5E(P&pCqq z7hwcm2)_{C|HnE0SrA%R5Kf8^=HVN^;iJj8_FO^g(5_w5w(XqxO;OVpVdG{o^Hx#w zHlXQ(UALIcEn$l$al2dSx0i5i6Gx7d+N*|wJob!1$U~h#)MX7KKcqzMSN9*%WR9vZ zMpS&cxFM8i6N=trN;CxXi>kiU3e<5c6w;-CXCAwz?msEz(x>h>t>iNy>p3h>8B(B* zDEmyP_&(4LUN+!7*5|C5#cmr%0c)7t_S!W1iBTl<_%%ynRVQ>*3#|xoOVBRJnXg>Z zA(DLuk<2=7%{mVy4;uxUH%p_8D~Wj5k@D33%BY@PR)2B$cthIFG<tg`b+j=vp5c7- zn{W32d5_r1qgPHIrD@4!Qq79lww-xF-KCt~vZ$U?&QxpWQdd!B4EbgPy)`+gfncSQ z9g0}aB^*!GKj$%A*ycJ6k`h@-D$GhR(cO%om{-L3Rz^|FIn*05e!2dHa}moU)86g| z!>O5|7v+{RvgRSNpn%^c`4MXEy|OkbnOjZ-=J;-Vq;0#WK6OY~bBf=x4qvs4UN>gV z>oX=aC}T=4!^*D1;I2znT^G&Tr7dp(F(P_sRDhV?unQ(Qz51^vsB=R|w@y%}?yP1t zaYnt8U#o^!4Qs7139r_kQZ7BI1X(@zgd#2$%sQr!!K0dkz6o@`qdEDw+_h5**}O^x zd@2RUWitUT*ddA7!vL39<X+M6eWH>3&T;mEyUuaG$`M>(A+8tZ23~NFfY%-Y#$G|c zy#juF2!4h<c}UK!U)uimMVod}i&g>SW<ldtA=8%Aq=s`=UFU7OMa(-zEpJIV-4izN z!Yh1+%@TIKSIDE<Om4-DK`83gA80Wrlzi?fc=yYD_se+=%2NlGXu}tsZYz0@=>{*U zF=mXz*8wsO)NVzr=!Y&U(MDy-sIMTVHT>sf$)lHC5SmTOd5+7tjmeUSm1yI7p^KKp zCW$?#&6+WbUDFMj1)h~?BN_qID)h;VPQ5CO2aajm-i6OFQl4J4V-@>E(|2A!eyOPV zZeygw{o?4s+Sq%Q@m<$Lnv<!W*#VF47LVMBzf;T{ZAh$3XYuX-^O5}r3E{&B75RB> zuSmo=8YZ}C7l+%|rFdNnvWRffrjcYrtaWwH@o1dmwUiNJ>R$=akxZtV=LNZ3^R<t& z*N-+)qiZWzE6MVF^Jh~Hm9{i?e|kWDtXFNcM{}Z2XC|{L$!FjyqdJ0C8R6PQgv4gu zhD2h6?#7q}r^HqF)O9+M_tHHT71B@KQc#8u#cP9-{?;Sqm0Qva+vs(}fEi7%aYg50 zX{#Pt+q;tH;H<WbW}PsQmzW_at64xBII88-s5z@y10?ZjQ~^LdD&>OO4ZAN^pH?kD zsZ;{vQGqk8Jfl{^qg=$J!nNay1pX-HRV_QEc>TD1{t1PG6Y{x;x{k`EpOVi8dF?%) zaOmRI{TJf*ipA^`i^aNEEF8%CmJ777ecbR1(!_3H4}9(FUVjl_!u9}Vf`Ky5{a0KE zrS0#CnIW8S=Qr*UG4JL#ZUct+ja&JRS}}j7h2OXt$P%@<BW%_wXwuGa)GlV-qvA6M zdIFRn4?u^~Va+J}4#{ytv0(+Tdzaj9UqX`wbrj&z@SoKTn7ib5Pl-MS64MEs2a@0< zEn~Nh!XBy6CoVemDEmyBL_XCGd7?(2QK3ID3|ldeeQX}Hrc0oXl`*c*p0|qM&<|Y( z?qng(P{(B{W7@0*C&=9C-`OWV(G8l`V$Ap@wlpRu_GMEB>QV=h608j9E@0oUjh$&t zpJ~m!TO8V%MIEgS87_-*)w#lZ;DFGfz0$lV6wmUys3`{M=~8v%?UlsMFNtaM^QoLX zC9!WG-I6f%G}S-<?Ke^fzafe9s_~yt<v(hC{tQD~nQf@$tSqe|!Y6h7V0kpXJ0r9^ zHJ~-gyE&F}E1A)i=3gJ<(Um}{y~?~1>(UnCn3-7OmHEsyam_kv(Ip9;kC?Xl!Zihs z5iOAGi1EFyedn04?GXReJ{C@L6W9V}5t0^nB+PG%8{Il@*m+LBT~Pa`fL4=`PP4FX z3pV_kjeP3$ys9^N)#^^GR`YAt3urY6YB!$KZ{t(1J+4rELg_lMYUvrZGJefUK8<n# zty+GKY8bCd`Ei9JUbS)_<q{sH;zP1IM`hs{a}G*l_Q$S2l-%7Al8O7oiGAYn`@|FW zh{x>_i-e2Z1s8Y21=lWfebprp>T_eS|1nY1)?I74V9_Dra97Z@m4{TvXLwV<u#L~C z^{h!7P<6(jiHFo6V$mhzIxOWpBw*SpXm;zO;~*DF-h&F5KLb~&>^H8=7?z{-%25Wc zPzIF!#^k(*q+RaFk?*TBW^`D~q|j9oYYCXr=d7yWEFJmSF#M5L5Q<P|)dL@@20S#3 z*i;Kxa!lPJu~!UH>=nIi1f?T#(Ev%t*hj9}Z)qieHI3d>p^dBgPwB80RD7otsT11% zlZ5@%b&bILR++C7BE#y~#(jCT8zr%K8d64^BL+(&@0Ew&zd^vuO*X`jRt8O#GyC(H z$-WLkhxVU2_LoZ{ys~_!RQPzc1w>TOo>AmGsv>+?OYDe_*a^dnyx7>P%E+EQA$t6< zD9<UW;|DZF`BcuHG?EY`YbaSO$$06?-XPd6-SOm}6#wP~T5BS;Db}++(WfUfuq)MX zFf*(<i`~SrE+H!=GQwS>$DNb6+|#$+QXe}eJ#x#~^1SxcF<})F7cP8+I$;y}$TDo% zg0p1CUa&y!EofPdJSAn_BW>9uZqgw{x+$R3ETGdUpxtm*tDaX4Oa)XCH9X3dClxDB zD3za9tL9OyI-`y+z#mres8sN(m!4EEKCM>9t5$YgvFMaiF_`MCMkOfgq(U*TO37)J zVu0)5rJRE@*#~4Y4qQy$FPXgmV$weGtFVKTiQisG*n2(>288Vui$GAn?_9(l(cS1? zG<1&$n}GDStA24$kbe?j!nom=V2~*86>#a4c526*8Byzoa~KF>cT2<q?9_VNsD;O* zmEXKmz_RnKc_%hP);+>DeSBuOVZ6qjV%8mUo<q{kcO@LU<vhpqILm55GYbBb8lel? z;mb;lNlB+3S+^lopD7(8aM6Ihsv5YU#a^{d-_Z<xWE%fe$$v%#Vh$k2c_hb}lJ}cZ z445$|UYN!|Cxxx+gg!P++%QYrG>(64obcEh2l&Dt?9*RaCq8w#_R1yal|k&Ly#Jbe z<d}cuCvwfN=E;vM<9x;%GM0MEXWOrJm9x68`*r592CBmc%Lq<aeo$9Yz(AG%cx~`} zdulAjLhR@Pfqe&L&hp9f@hF@*DR=U){Hdd|#}26Q9#i1uQ5EFZ6&KbMKdUNqLP>~6 z`pk)od^}1*r}Zz1T|BZ^>d0R4gZrJ8FBY*}o0FJ#i^BTL!`gHFThjd7vx4pvhP7rg z@xAMESk=+q4MCnnO<Z(5iyd6JfU7+0i8br6Mcc?H&R1W!q&-9B8@H}EW*G@KlTeIF znL*#23YDAW)$yBC^PZKm?-w=c6u0OSG-wgj@8HvJKCRKnqtS3mt)5r8?vz5!NxABi z^3^95Dq$z&E3h7yuQ;JleL|t)xI)QE#qtw`LisVd(&O@F$K{GoDVFi7;8B1J5m+(& z;W4>_{Zi@sr85r7TsthCeNZyvfMhyW7?AbV_Dc}oUI2q(Om5`2=cD$Bh67(*--sYg zgtJ#TbdMnWFM=5V&2^GcRsk<1?_qWNn3C5$^q=05bZLh-lXmG5v+m?KY~eF&J7d`) zWPeB0xnII#<ebx>sN;aJ{UDF&Ek4UT*oatk!$hrmU}9Fik}mhe-TUPNW>iBKb)(jG zxE^ncOE2CN;4UryIh}|V&9FsdV#_3X+aPvJm9-%6|3HN`s~^2-p8SH)k6Bj;m{JLz z*5oW|g|FyFu9+rnc@+QXS^AT0)+_ahIn#tS$IKVd@ck<O;amBePxY^ci5s+>MfR=V z!u$VywQ@3#Wzm`!(peDPS;QW!jvi}BoNddQyqPvw9yL;#Fxiwmax;3gF0{8Sl;x}^ z$#dk~{$o-+r{(y0<<A^fBKVGKiJVd5J)v;&m?|%i67MNpVLsDyXADL848?@BgalOh z&dBl}zj$o_<<m!Gcn*mk-ft%>T+VhYV7s-XGuyNMyYiTQ1!1>ySc4@|2)VklgS!hk zcZz~0s>7zy^^p;om)Gi_HK!jvqaO9hoOo&({n#>U-8gK;h=UFjVo^5;-34=6{<9j4 zX$8uCX~$k^#{p@_At{G@7p;56%x;}C?c&pIJ*(S#2Kdr!I;qyctJ1)ubmJuO1p~gg z5UV~RR|RC9RIELzSbb8d4Dr?p#o}Y~MaLDcAC<*LUIj-k7af-?0nU!g7af+(1#2CU z&Ls9rXCAnewF|Dy0~bMIT>C%BO88dd>Ry0LJnCEV=x@%2e<K?9mB020hwl{%+at(< zakGuP>I5QusE?ZTVf0q0BL=75mm?3!dk&ws?UJ<VL5w8k)XQhxDdyZSM}K(1ZR9Kg z5IGE9biFTReV5;&Tgb9c#Ckx?c1YN&U&!pPnC)Fz>ivrz1G3(uTAURP_L64sJlIK# zwWQ|%P|WU*EOm-&v>BDaWkm$?^arZJv&uo!Y9X_F_<v4$Wt{L#H+<tV?STe+)jaW~ z@zqVYqK~eHKafj58zyY1Gl>ZtG%44AcFlR^n2vhp4?%UGQhNR#+xth-$iGu^+J?#! z2kHyP8m|pCTpMjlyx$ZvSRFi86Me5PY_u+VtUhYIHFCL=m}^UorkIKz+b?+Np!mt7 zO2TJBT&nyhwa@XZiSVh2o>db*BPYP4CdzLhDxfbWtSc&{DJ-NREKFz!omJ*PEysIY z=Hy|q!+WA!%sSH9omp%ssyEY^-9_Q8*XW(O%-&KESwvrH*m!-)L~Gh~cglDjajz)C zMVmwkZZb{SHop48F>M`_@qs6!kVo2nbDF*nHRv-MKJ)6{bLzA?tdcgp;^y7Lh8@C) zwM@E1j5{O<%bpA7eIoj|1WD~@wOUTAHS(y|o>Hkfsay>^g;lBggkmLk1&b-xU<Gqw zJtklN)lMmvo{%p-DqD0^w(zKI@e$dALozvsF6AAN%H0pjk^#0rS(#t$kkmEs73{#p ztFUh+h@^cN;2fj(U5G{OwMRS>UJ?|BbL1Y8usy;!L2~|sEMZi41>sH<WAyv6U{m_c zSuMtt24hl#KA}LqC+|5ZNgX`rbX(M+SHg8v*mgkJwpY-)SHymR->Qet;`S-1CyxCx z-jfm@L*lL@VlI7G=wpOh@S-H8U)pO}EqG2pYE79rBkMCM<~$@xo|Gof$kFC5xQ<G= zjmgpH6&Uk+kxxjGYnq&8t*})M_9LC}O-=TixZ8-F@2rB~oCaskA^Q!v<R_=R_l61U zdXY;G=`TF5f3it=Y7n^$-^i~2J-+w9Qv3gv)Bo47iq%UZXH$tlyXrju$!21uJ8iZ% zZKgH$ena$d9cQjHX{0V<<Ywe}b=1g>xU>*^p@VzRojiH&)CpN3K1HFkYUj?V3h~IE zJ}hy3pXAA7f`<-?96l_*f8Y5-`_CWTFT-<ON${*9zn~l+&t;y&lE?R+KfEt3*r_&_ zQcp0NlKk7!L)x=~Z{-mIePtoT)e%FL5d)BK%R~Drqq?p~w&jHPR3tQICxoT6YH_x7 zd{H+zs};71mIIRij2d-J*>haMZ9>^|O3rQklH-u1-Jq=Fppx6926g_j!>FX?poB%g zm}!roUI(vMlK`oeU$=!<v+<N#-TxYoTHQ(28^m!SOQrUxV%0Ils^bckN98MyU->^K zR}63+m-`B?>!2_o>#$7z!Asa+%>kf}NM#+CytZpu2PBjKk0tGwh{w_Kpm^dQ939Wc z?Kuwy<9s6){=c?|KtfwMa4+u05D7A7O&SJGko@oK`k^&&5^51rgr*S-XeLG5mqNe; z3D<sM$9`dldjd9t!uCUAj(um$Zt+_n_8O8P51w<mtKc^Y0I9KNRf8YO(I>S+p>Dp^ zV66aNiU_|#mK7MY(v%06yrvcXmH;Uc2Vzi?JgyS7qTsiH&$UChR01C<1uQA}FX)7C z=tn=3V=O2$SJgw-4WV5@6-(W+NZTTp{^(Ww6Rq@1;Eg|A^FCOoKC@2w&a3ESc-=4Y zH$TO9|H2;lS8(P4*_B4KGo%|Rx@pVAP%OIg7>k{mtK9`-wF#3q6K8Iv&$SZ7!;Y-- zlu(fqd(NLaA;Ei6>6`%Eojm^$RpC=A2=Dn%O7WkNILj+7z<))6PgO)nLqtSPQ0U6Z zQ}Sm|EAaEkojD=Ldss(WI5*N0vO`srD{3Sf2zq^jZ+BK$M;7}|end|}bWcG{cTwcs zvZ&5N6z@d0WCe8=r2EIz=@OA!#_UIW{!^rIZuSb`l6CHrwucQ}w7v_%lD6%~dLBna zi(U!K0b!%tg8H3jw3>O;8~L<b&+4@DX}6q$OVqpxWC2rO@dac7RmYWUj;quj0jj`P zyVyD=R{=XNSGjAY$K?ool)yi7nTrdqe1PjPm&>jnzMOwh5+PUCA*t-IwjYzP{>KhT zCVeY`Y4LI3vj2cfEasbYVgDbpz+*zedxcprY%l-@_1uO*=suZ1YTi0w*@jrLC05Y? zzHEZliKs=LkU2%1``t&Rokz}D4xTaUzU(n+7{0E;m^4XvY?AOqF<?@bK6=S(5+KrG zFX%-rnJ2Fq5lf1J6Y~BuGT!3|*JP-ZmuXWPA&+&#Hx>OCWa%@PydTKYXD?A7N>LtO zp|7a1p2+#ls{}1tq`WeW-%=o$4<)Jh5ssN&-LlJm?NRcPT=CH{>wAm%ZMW?AwDRBR zm0w(Q-`b|4-|S6L#k-KYkMxGWMmNrmjNExSSMuy()%TBDUrkg$Y)foTr+4N1w`5Xo zmoV=&5o_JVd{_8HOO~b>|M_D)m-zVA#l<y5gf&G4v_u3nMFdra`BjAoekB1R1wQ`E zr;ce$NjU4N*=tJsSSZ;lT~X%aQ#;GADa7w-q+S{yP|6`!#(G!B`_?7-wq6Tpx#o8} zmwh`obf6@rry#OB%eNzo-jKm;%uZ-1iq42FHFIyaiQKSDe61fer^`fSh01^lQ=E<i zS9BQ5N|b3?*RhNCgM^IpeOb3LY5Ngz^FDF29udP%VS`(OdYuBKPJZ3?Gg>V$0F6hz z{;T~je*t3H|A)ACxeN65)qu6HG5<-#`Em&DOOIVCJuCxM6&<<4jmEG!CIfF-aFCGB zJ17lR0&C{~v2@^Tza)VZ<UaA(uL8whWE;=JNpcM@?iFV56A9fX%-$muf^Ioe?sTCk z^axm@mo9GJ`YQ0XjH$GkO>39AVVSU~8#-fvqWKs!j&19+A1P4BjKkNo0*QyZ5%W06 zX>pdMy+&kc<M3v1bUK_hU_vo)j1;|SnetkNIfEcyhqFS8Sd;gg)8ecvF#*6$)2nYU zc~75rzc21FDn*@E2v`#L7*h#e)sK6v5x%X)+0u;ojug3#=dIJ<xfXn~$a?Bt_>*Dy zrcosBI{)BX{)q^v{v1^OyI0<h`?VKnPNWw-^Q-%=y{mKUe$vu-&eFY<&Hk9Rf&3R! zrOzizw?+#W1`AgvTE=gsE{|j_57w~U)a3-vDv1e_E}hpp2gDrH5jt)ndB#>*G?wPj zlud+rm~KqoM5$n1GJUKjvA-ak@G`fPldzH!cU6{3CHyR_L0CzQ`fGu=ud^R?q|Of( z%np`~-N}D4dvk57X?wBb*;dE1Crv+Wb^o|F^6QI@sQ4y%w`NOdFp*noj7iIIZmEfR z*s2nF<g(+Sp8u+5;A6eeZLOduiav{1$di|x#$@bABrJRQNjF6dZ;2Xp3zE9{wA#;T zww=)=+OPw%PHQym9vr#+#r2F>)$8FKx$aSk8-!tVOsN`hgPl^ShMknJ+I5xXz}Jz> zh`_ENxxytbP}vFDQULAH<-&t91y~PAU;AG>D4mTnB%I_y$rJ=#+_U4i7q0FG{9GAq z?|H5gwofFCtAQZ`6J(=~+bj%|6VU>UqVxqT?v+bRwh1e!S$0f+Y?robo3U)0zGjoU zVVkz)jPBI@S0=HmnoL|hx1_`zR}Olh7V=Pn+$Tesxac}6={_#)K7NG`b>XpL^kY3D zdP$8vrOKW%OWv?d-7<=MX_53!C1^>8HmMi+OegF+ImV(CWl}L1h+CB)Kai#^O3{`s zQWq2gx0HgulcysCy{-}RM3eK#JYm~4>w``5OUI0Nl)_KmWuLvvKC<io!MXVl6bw3~ z;x^%Bo18C(&WR1#QM31|SNhU72Z`j3iM-A6%+;aP?;llsKUY)1B4;pNXD91dXIm#* z;#I}@FPu88A$~?n?6{MzVsB0A(9PJPhQyh!yyh(b@y@KZg|5-Q%8{<}NU9yff>a$t zzY*`3L@}$0^_^@YdP;(NiX%IVSe<$Fu5!PzcAQ5ukioo_9WqiL8)>IRBzRh1r@5s$ zDj3O%U6fX%q|TCyel$z^&OH4!`P!BTrb{P3w@Y|t8n!OuG$?`7l6C(@hhePZwy*(F z^Bz%?+Y%PNB8FYU`duI{fa{EQ8?RO?3>zpCTv0;30g&RFDtCoI0iVeOBk+m(4ImEq z;yOx293rc@r%8pXT}N5E8`1+@2<)+PKRqT}$Yn9P;;*(}>e@l+tOL7t7$hc@#*M(F z68DNH>=nPdUn1#{RPrGyNMi9{xr>{B+|5FMBgnSK{LkH{-3N}bv(8r+orndrR=Ovz zlG7g}r|O#i1Q%1dq(7nNzoF*8rRKe&<h@6|yJPZqws9LqI1n-(nuc#1vA5-@b5d?o zV)nxl?xSMPeTIqO+2y`BC$>qfRr|y@#^D?8nI8?4U+WRC)FZb=$O!NsNVw0-P*(|A z+Nu(BN!EK(j{X4LciwaIB6VJpx*|bYmGWMcrY_1e7M1<yY*U^(Uwi42^~$I8lYjNE zXk+xR{SsLHYgof?<eZndI|EZCZF9CA3!by$^WTr8ZwzEi^%p)GDOexMdeocx<A<4_ zzpTyO$#2T0j5Kj(+v8r1Bu{h~7Za)e?xxa_-nwH0RlTjLH*+YJ9NUe-8?ysdQxnzG z(<MEPm>J>PkxA{%V#IkEwPmq#gYErHWm<Ehr&@A)3jL;Q6GqCTYa?mJfzAz)t}XHI z!`ImhO{p&iD>nPDJ-gfTZmM=`vmzm9h>`V!Wy~5fpzf(}ZR5A~Adq?!b855&!{7~) z|Ed~gO3P<W)_F?8YDm&%NXQ5$#cp6qNVih}{!kD8u#-=_gI}lftab+s8-CpmJ^)R# zg-@%EPa9OmUC-*YpVnyR)o3}b(R5O^0X)VH#Z+psa$|gum_p?d`HG_oRoD>t!0w<d zB>K|Bpe=5wUwl}m@X)0KXch+`eO=1L`qlPJWqb?iOEP1>Bv1w!3@6JJoFl)UDY5Q5 zANj3#6wZ*}h;q1X;h4!DKIuv<x@Y3bw>4K>DxSLRnu!~j9y@1jx@JH3B8pz4)s({R zZ+=cg?MuOPddVx=_2;g+&#jU-v_t1rnUH5zw1XaBbR83M=$G{xQ4X0iAU5ohpHoYI zv`c?(n~vyv+Z8R1B_C{3pV_6q(T~O(ACtnj<b7u?Gv9ev{laMayJg;6t;omH^eIt9 z8$L_tJSHTm(|S?FhI95CPV;ZExBo@-{8v!@XL`jCA<chf)_o4B`s`c0<A8zS*Wdb- zeDJUO5Ze1kMAh(8PwBJq^u>wt<&nJQo~utsGuNl9yW8`ZXZwEGS^4eb@*iI|U#@j8 zjWzuI?&0!e)5z_-sln3e_U!IlMprI#slW8ohm~Ld_VTZv*PqV!5O-?g@7G847khUV zvFg&P6@=SNNBT&8^hkT!WPj%3XwB`?h#T=fz4;L%)iEnQ1>5&)pN`c%9;)6PzPa9? z{IEUC-Zb2W*tSSQN^2Qawc7Ma^N3CBm{*$gr7Q0DHGOB*sFRl*?q0T^l69PxbDoyA z9XoG2C~DX%Y|tY}=-mOb1ogZ4NnK}kZ}I7L{;%=tcJXR<oYp`P*2$;Uc}5dh<8FA= z04@Y%H@V<aYdE0-?yBY5ZnTe;>m-$GzuGaS+QSOvN8}OzR~%C)J)ux~Y?ru>%a<I! zoPGE*k$p%e3$WVduWastQYLR71Te{K@RFEz3+DP?rIjmCoafqK#3G!DMc1p#PVoya z#F9tyI?NS$E@Bmg?UDM#Ee)3pKJ(6fLCtwd&V1^X`;>P51+@rw_P+D0{(usBkK9)_ ziBHU8SJ8hxsSz+^LA-R#`oSP_U6;M!n1RwiZh@&S^0Vb1Xr(*!>K$go=kSg{f}4Kx ztNq2j;0KfVEr-l^wDP|N)cqdN_;<hNf0D~TLl-qmd*)gGi+=2u@zw3Hu77iG|2?qo zQ%KX7pa$^O50M?e$M*c2)%3-u_`Pk?x>M$Q1~K~Ik+=SVYW%A`|IWSrVsfx%WiWlQ zFMWQnXahg~p45$ptv`NTfA@ZE=iTEsuOIHbTmJN6dFRE*cN_i7^X+R(?T_Y~7Z=** zhOQ6fh1W72pA6RSJfC>?VzQ?(@$q>1P(5d<JN{mM<ZxqjPi4qxbNqB$>Of2S*5c64 z)B9VKM9q`_l&R*h?`E482Cr|=+<1Jy^zq2`m66J|q4>p#UQXUS{m{quncFTYn;0Tx z9{WT;ct(>ku0orVCyz_m_FuFal(rp`vYWVQGkU>#SlGDdoJpUEaj&4!T>--$01GCd zcblJd`;2ZEAL%v>o3px|XSCaSwb}@L{7)>#-JI6Axob@zFBrV!NfkKFdLETp*eS5s zZZyW#!<4{fm0X=nX;*TEn6Fe0h#iqDK78dmWU$?YW5J<Ixd&h}IR|7iks{i+%V7JZ zQV&WKz}5j`m%MiKk5RZU1-9>elym%|TjC0k1yAT4zk<m>cBtl#n6(R^b&OfGkHcNg zt1h^GE_vNK`LSE}HZE#H0|fdGapN5Q`Ui6MD|+z{LDj!d3*I@WZ~GR13~Ts%$c^7w zwSQw&eDW%K=XmX@b;@I};&-%CVkfZS*U;8~#NPSu@Xminb^eRp^mmsmw4(hpq~Tw| zb^jn2eX!4e<y`pIyZW<V<8Qw8zfy|O)ANqq_|Ndxe+AV30(geC{?2LnM@aKOIj#R< zHvEQ$MbF}Q^r|1@@BUX**S{lr|48lmS7z<Iyn?vZk(5Whc?(0=*ZVRb4`we8*AU;o zod4~Yt>1oLef50o*PkDK{IKxp!`z!!V=MFRtF!Ivt9Kqgs8|^(n5pITW%*2YX8iEB z|HHe{vD+DoJ$d8pnGajC-aTp^?}&f3(z-cY3w({VCqAEVefpq$zB~1CU&iyvlBd(v zPsU4OPp2xkr>ZxnDxQvByWQMG#q1^`<D*;3Guvcz1%L0F_S!n;F)Bl@P$w0<rc`_u z<jAu!&NH&EGm`e>VwOXq=7Ykfy@JMf1&s#;jR()__wwuaV&&7jdq(dLpMKBRl~=ce zm(<Ct)6RqN3vvD~&~S!4t={tgGhPj%6<l^ol^cPb1h|wTyjB5ITrN`vqun^JTzyQr z;;2&TG3D~3N@a%?iucPF{zt~&6)w20QYPmxSHjN$eI2|663f_sDe<sW3haPH;=c3T zL=k)=R^SW+aV$bH%Y2eMS1fXlu*U(9Gi?=yfdez9m|BER``z&?=+s2J3OC44d4hIn z)Qz}jJ>y=TS@Z(^%|SIku<E$xSMetJ#)pvlAJ`3_(EjRIwL>re!Rz`v5Es`fKYEwF zrxd^QtNAIo;Wt(T+RFYJ()2fK>G!Cf_bUG2%DsQH>PLFRudby#Ho4EqMceF~zoM<* zEoa9r^^Nnj*MT>F1-Jt0ehH}i64~`fboaj_I{z!M;Ww=8=6{6W`51lo??lHR3HdkI zM_bnWD;I|f)_XITy3<!D>VEs{_S^Rhvy*K*Z)X4g`?HT9AANX#e`jal`LkP_8|~{G ztuJ2?BX8bJzuB4p;ltF{=G|wTcVBLfjND2eYEFH#-t+KI?m|!2`f%1nD>2?lJm^Rq zYKeWn+5c?5Woz{MOndyp&iKvgqK(Po<)NIl`}y0`Wm{9VFD6QFHFWBSOsG@l%$X}j zK^ywM%Z98C`?%Nk39pSKw=cU*NZ1WQ<GElnMqISJf6ih6uo5-z7dGt^H0~EPf(>xN zWzdK945^2g)D3WbHC~-gUR{8zlSjLqM+@pIm&E`v9`$A(ZphV&l?Oo6K>Xi!hI_U| z1jaSQ{9g~2yYc_7&s45CMkrSvRRXfgcTrY;NFIecDA(cI3B@u*_(x>(j>zU7<*s>0 zuM`}<oOR$*>LFB7TuM1C4Y8G*;s&gMFT`Qo$vBvT;@5}aIHn=v=FlZVCeYl(g%oC0 zgyF`fDFX~}NB=LHHlydA5{Wg(#5L!n$MBNOn$NJn+MmOk{~p==kLcDv*mb|su47F5 z%ix;N=v(x!{ES$Q)BJmM=f7DEzXsHP#zZYLH*`Z={|=+_qkruuR^u0X^#}L-=bnXc zyf8zgc!yT@fl>7nwdB2h`b$RTU!AjFn<qS>m40SaeWI4UCW7jJ3U2xvNHC)F4|ePC z=n}$=3Fq9G9!2lmOPA@@zti(S<lN|bGTpE~aQ)GE>H58r<=$(f%}L$mk)7E=gSF9< z9clO5lmE6e{_B@#8*{DGovFQLAupyoHU^6yv_;Nzm%i9s{POEhTPx#3WdTFAArCsD z@707)cNDx_?O7u3mwkCXy0d-v^;YYAcgose+5hv$<BvNtfBd{Yk9SVDY)#g!->-Ty zTD>+>xiwS%Z0veZ^Ig-3S^cPW{XmS4nv`=Nz2Y(@V?QqKI4<usEA2QY<uE2;I|{xM zF&hMBVHGwV5H=YUGUl4F$vvRzE4%~@iGBg2zOx4Z;V(YY9X?VIAE}#H=QgiS7q8AO z;ENALrq%j??X(tnt&LZ^{kU4w|5)R3gkoy-IA0=xbo8rO!97xfyDE>XRKvI%h0>!6 zrH6MtBvjVJvU$Ye%Q^T1X`+KNATNL`oy%enDWnmWWkCRgmxN)1Dbj`ky$1fhh5>!J z28R@I4=cuN16*cdxS(VKd}S5Qy?e<4_t~SEIAI0db}or)^xT)snx6w}zc8ymhcx`= zSN1Wm>T}4AU$LPRTu1qZRsSoq_7eyzsO}4Z1`JY5cYrLoNUUhezzig2?H5eia^H>2 zJPTgB<$cF&_~mN<f3sWAZ}vB+?=~shwkglt^LFTEUzjz&dY62p7JsCceI#Gsp_II* zmVKaCe_}TL3YQq(@h`91555H-GwX<_x4N${jaF_A*A92(&JUN(4p+~Q)wY#~_f>@V z*2eeL#Xp{Dn4746_olDAo;lIVe%Kkewb-^i)wD2M^X22Kk00Ov{;z+2{^`|N&(*c5 z)}P*QZY+*WOx7%oHQlO>ee$sR$9MN%tTk^el)hTMxjI_XQ59N~>eF2s^>Xg!$HzUy zvzeyN@f+*+tJlX%UyN7ZC~DW?=JJ;`eI^v#C*@qmE<250c6cCVJ9*K5Qrvn3$by}> z8Wytz#757V-xoC<;jU(gy#Ta9e#3qNLoS1H&G<j?0>a=b1r7VS4pVQJ%1A)iEj|Kt zrqd2Pz3VQyDAR7^`c0kolNzo6G0oPKnk}a^Z}Mt1p3(Rpg-n%8VUWajT_soNKd!>% zvBL@_u%q%N#}o>WqnuCyDC5?C9g)pPz>hkeT?5*(j>@DSyG*3v4-grK=)*u;xDNr7 z|1mPk0M`KoVbCU|uUXr8On_ZSJ1`8ro7kh64L#^Kz#68Hq;I)khEe(k+Qb}EpODcS zcKt1_7{v94R<z@h{lX(>8{;EzV{1_LXRNd`v{}4iHU7$O{+*y#d|*_g`T8@hY{#$W zOJLp4p)J3$+x{NZ@Ef!Kue3@)<~M5bC+Dm;l)@kBWxqIId*hn@z4NvIm#a68YBF8c zhX1~6o%8N}cJJ=i?zU~)R$CFrR@(t5KtKd!1`z@xA}S)HA|gH_A|N6nA|fgxB9q8W z2qA<JLI@#*5JCu<=Q$yS5E0#d-g-jsKIi+^x+v}-`p0Wk)m?YhRVuG^p4(+;^O_8K zpo}Pz#=kHmH(0=rCA`pMN=>QHjV+CY@xh0zwgP&`yY8k(?BPZZy@`k|YpTi~#aD3Y zZ9)!?jf}O=*@Q|l0sA(SMR+-<=V*0CsZnjR>2-6K8LM^v%Yt!MtWguGJ*}TUEq?jq zi`2q0%cz2JZ0EadQd4$Y<z*uNE~zt%QjOGR$9BEVY^q3aDNClcJYeIWv$~$qTJo9L zr{m3!UOj5ubfU-k6n#f{mvaz)Ybe1f2q8EH_OA2mbqXAC3Le-HL|%Iw$VFJ|M_PNF zw8pQ`!7|b+Z{kX?o|RsNm0oxUy3q`5iDG|Q4;=giV&?bm9gv58bFk@aC{VaHf9Ki+ z*%(mjpAaO0WCt4lI=~MR_`D1XW&g&vd#k@jGyk{W?s)~33&_cq`1Q{{Kru8_LY(|+ zM=7*cK!?s(JAq||f8Sp8x2=VL+nD#C&IM?w+yZeD=C$*d@V8C5AT9?0u{g&8wDS8s z6Z^d`I+Rk7t5jHy10$PDDLrKMz^|AGd=Tji$s7ZLMUShXp2RqM9rP<F{BDjzPg3aJ z>F|4?(!~Qo5ucmPi2P|F+EVg=;e`p91juavZ}4Nu)$?hMi>VEtlB(vezyH^b_n$Lb z{<vJXc%f=O?u9w5P!?T^=;F(bNmU;&RD6mp0q!g$y;(S0ZuLf=ubDx)^5{p#=sYbZ zPZIk~=XqDUKUKQ@`fT`Za%)4)R9B%wh?h>0rGg$I7b|9Cr$#=|aL<R@o(Krf8MrdJ zlx6wyMJk|jCU6Qh(`wh+7iTo8G0tGURx~<iQ7zcD$Z-F=zNSp(Aa3!?;>XYbvi|Y$ zkN;l$_-X!Me^_VDeD-kD<Y?1y?+Z4mlGXE+(vVB6x{ZB)g;142Z!2QqpAR%W9BV4$ zwB74ydb=&*-OgC*_K0rhlLV(o(&iKWki0tuQa6TBz^)IVtUFHr)qh~MA90O;AK;hc z#MQ_#!m6YApO5zZ?A`OzF+5<UH-3c|4)tXoT|Yu92ENQ4>o{~mZ2azUJNU2fT~U0y zzZtOnVC(mX+n2kxe{-PapDrK%>C%Me{|Ddy>CpDqedSX7)xMgqTx$LS(Q;4CKlWCC zySEAemHvP1LL8Mb=#bw1{2#vqxk~?Q=d=IXS^D=KPyfE7<o|Ae@}Ivw{Tnp!I5-8N z@;^}jmH)S`xq$!NeDD7_-9h&hff}`ABZJokqQ`jx=z$$gM8$QEr3}J@5G3+oQN=qD zR7`~(ydc+t4%<PGZqS`61f<)5Q@}5HeFZH_u->UKhr@**dZ&#><nclK1_Zj{ehHUL zlwak>D{tpP3J0nfNw2M!tL86O%%)V^Q>x}bS}U&13=t3JtP@^auQq&vod4V_V3j>E zTOM#%ajIk{@%8-Gx{nDj=faEBez{T~BwKncPj@U$bL66I=NX~bnfkJ75_^&^5#hT# z%5W{u#bbo&5n_4awYuk-W%*ZL6x~RT+22!*Oi<p*MGPUMV{)ubE+3kjB$IkuIAeGU zu4I(aK&8}}XXP4`cJW_}Dka-EuQFMU2CG#r<y&VoR-=$N+OC}L=8qtaJlfk)V#y@_ zrIcL7>?mgSJ|Au?BG=u;KEFKHoQto|6E>!gx0L!OR&0!-J4X#|3Gaon*5(srXDDR_ z0VqyEL+b+u*ZBdtDC>NPzxwn6;IJCF<qem{9$?rnUVxs}UihCqa6fr={|N5OK`aE# z_8q4m9KjLwUv3@X!ce09`*I2Q%WvTpZ~)RW00hhrX#Vfg_|N_IUqQfhIJK`JNV+rt z%f8+R1%I^ay7ZFt_1>3&f9`ql)$a0t{0@aN2$FD_gq!5E|JeTQKauSv5G4Vq3)@oo z_pPv_;QrsX<-wYQ|Ja-Z8mb`23f6JJ!A1txv#>=E^qP8LwF#v3o=N>68U+WC_W}78 zk7Q8dX9Xh@VRyJdEEseKuLU~=U|<o(tYK&nTG_+z@dFVU_=HwoSfqpS;eHAH0=Xnm z(TXY%FP)<bWar9^3D1mB!hk=51=JW+_CXU-qy~gNR75{D#Fm=kpU)<~UVy-OrflwH zA?O1tF~w@k6GLLvy#MXVfE$zk+1A6?K@pDspqa0i@?_KxQ<NqxkD^g2Mg}@YNKFWX z(#-5{;?jEflMJm%x%kO4HrO&g^g%3SDAk-%CQ+*3Nwi|MO*8Z5vvq!MX4Y)9nM|KP zTfY3aW#P;0g3b8JwD{%Y;-@bb`<&LK6^mKC3A~)!E1c?^VqwXhrBefS)Q*yoj*=;S zC8;)Ng7k_#Sj%Vi)Rt!VAkQziKD(5ZRsx#o8%`3oMfNyH4Qzyb{zUKk5Q0-MZDTMM zD7HR;ygqPXbpYj;K+0<WfmMFwRX%-ypN<j1t~f^g(Wmc6AL0sc;tDUq_a6A~j&y@v z0-Tq-<GwqBTYdx!`0hyO_eZdR@7z0<yCUr<*C0D{M@i>k))KkiLn?-5W>ClgU$(Cn z&B^w|wXzb(^%uT%fyN7XxP%HBC<DIwYDf7$cA%})|MlB*sEz$&2XwN+OvmH@+J-U= z#a5UfD){@>2mg2TeV`Ov6jA+WP-O)PR#5hZ4Grl2n2SKJ9#_zIxJWtz9_<pSD}uy3 z?f7+OC^88)ID-TFMxZa~fr=@CV)!U3f&;vRIrVIQ$ld9a_oXNA%TC@G2i@U<R4Q1Q zqKL>B2i@f*l$oG57GI)|gl30)X)uz_gFil9qK_&zgycc0uY?5tM1d;ukv_6eA9zoC zsR|0Ff5g9>yI5^ccs+BXNS+P}eB&af+;pzxU;g={*B{j4U*(OHYhFG$PiiR`>?r0@ zYx+OraEZkuP4{|VT*JS(!Nisj8gskf=P-yBJjMs!XroRt%wzVLb;z`UKQcB>5sF!S zAyY2rC}mu^lBY3AlxB(flfk}dnw!_y7j*VdwuMEDLdl)8D(B7o8U3_U%(R&J3s#|g zvRlpRVzj>y(CUQDI_AJzE~D3=mXJS`4t=<btH`-?Db?lV^OfP04WXmX!7S%s>edq! zr(h}^5cqNmg!o8V9Xtg1If(jG0A;2B|KJB-(h9%+6@FwC-o)>Z_Wl6&FC6V%?nPMc zNm%C5{jEpmGS80X9$nvgb$t(Y45(l@@Pk_?;M;?(j#5V3*ZZ5l*$;lKX&G<}^8c?7 zeSlcG`~W0j)zB;kZDN1%Ysry8687~jaAz;S+6|8E)!%nL|7sWP-vM$Jef3-MSKEt$ zVqk$~Z~zYmNf?j|EkRuDSpp<p{;30ju&?b3$vcGv6HpKd{Zqjrs6edmby!vjLS|E8 znIQNBFJvr`<6aUA2MspRY6#2((Nlg{4j<f^Kf>|7ISzCKzXnbX+QY%qVG86Cd19c| zxfhnShA%hX|8e1!HM!CjnJ*2$FA2U6a+Jbgc(}}y0?9Cs^^uRX@nzQYuk6U#7q-MV z3s>qEld9)2PxKHjFV}oNSGAB_W4%|yE-ok_ytso-8MZwdX)b29y_o8H#px;?tiRjy z=0;o9U21CywjvY%HnX+j2E0Q{m7FmVTPa}-ky}Z<&1??UHfOfmEqw8`R3p_GRkI&0 z_Rlu^7n@ix(bMrxfN*g1!PnD-GFEpPcc5N2L1Ht=Y)0E4=>-{I+SgIUBovR}p9;8r zz3o|~wv3*dt0S!sh&4Aj#On7Yce%Z7>WS9s!b{H|l!b&pa79-bQJkX~n}f-~FTe%} zkHLcuZc%|-e_?endS2;|3;^96j2rmThqMB44BVLmjx*2=<=Rog_eb&Hdv`AfFXo9` z?tw*PBb3L`Y#-qG=!lj;vE_%_mmO?IlQ4Kpa&2Dj3T1yNlGOskzS;K<vU>;6b_)RF z_y$e;6<_at_07K5aESzReFb(0EJQ4YQ8vdk8+7Ow{fVtbAW{xW=7DL{@LM1n1;YFz zn0xHV?D1e&otr)kZ$j`g6alJISz{5|6EIO1bc+?@(9Z})#shDIni)UxzA*NYJOSQ; z5L7x6+!HVOE(e4xAw+^~1Vl;5y+C{kSO!Txz!6OOFm4EHTnW$3=gMa;zOtT$X01Z- zSK9Cg%9Dkf)1@<!h1$^jim-eoToj{=jc|^AI&%_rXbMcRDkN8gDbbvMWja@3Nl2<} zdirAaBVuQCl=s!$CpYGGzrEdFiI7^Ja2XvV<VK^2PVcViZ7pXr8j0O+COHE#t<YdM z!ewz%I5oFuS6fY5t64p3)Y+|S`;6K?575rrXaBWmwA=L-tL3BJy7<Zdhh00P)?2jJ zg*o+%k}n>dGtj4~^|bDCxFaA_^k#{aMI%&+Ii2Iwn!%oz@KnhmHyNelZ=YOit<P>P zy(j2<HrD$J$*9{FOkNQ-wkB+3UFaZSZSVj9c(f{T@P9FD=$8=Mn$Y2u{^XVZ0|0Pe zEB(kTefxo7f0FFq-1-4oB9}Me2k+kH;KDp{-+Fc}Khg;l`xfG%15nObf}<eYx!kp7 z+2Ie%4mW+XROdg`xa=_GWc7|ZM*T9lU%FKN51?UxZ^b|Ny!?9iE6Bi5C-(b`f9!gO zGHhoV%pX8O4EkIDO|ET4kZ*zK0*3{9=Eq^_N7`V}O?2^mK-v(H3*NMWaS?ZzkvZ(B z91cv?Ve<HA9?75_5nCWmc&bf&Zj67TK2xkpdNq^$dKL-}s3PSfNmPL-GG7=1O*#nd z2ou2qOvv#Akx9faofVwP^-dl2xq(i*1Z8p~a>Wt((wIVJ+*8BZm-FDQARdA}|I!xs z%obT_j4CogqYb3=&}akgHc*1_za#a}1UU(LV7@FcUlV<?(k2zbf4NjGR~gi{MZ3mq zu-NBk?2AIJRxxWdEqt_mTAcgxS&P^$VuM0$w+Sp3-mFz?)k#%itywGA%auB{N~c!q zHENwkKdV=p)jF%*U^ALNnvHWtjahG;x6RpgI+IXsm^NAETBFD?BiEbdCaYp*PGPkh z^)u?Z1*3Iw-nwA5EzB(}eiW#MOdj3#c~P!cefhFzn?>wwdOP-g&Y8IT&fbKzQ7osE zLmMK7*Po!R3!|<Jr2>!Egwh>=1JDX(*4i*S(Cx2ixyqjc0Dk@CM_vNZ%|SFGI5aq{ z^g$!%cgG0JeF)!s<9|4Y|L!PmxfgbsCl>O5M<K&OvE_%sskMFY-txVB+w#L7zH@6{ zcDVW5!_AQDLuLlgmVmDhR0ICG|Ls>URsV3Q{>r7|YnO^;dtZOEryOD<__43{K#&B+ zRs7?3wB!nb@v9xh5GR3TASn*Q;s@he-Os}!1)SSi>|x{#<X+uqtVC~+1n*0I-YLBx za_)DP5_E%c{3avx&Y$J^Q;(zxrRv0TLqe(M>{IReGJS#rP+A3+C6qxv4l&IXQ>;1l zL>pV80|K4M6#*b816F~0pjX<cC#XZfJXHoK_#VVVA?*JWLTl+sh=wn$m_oaMrp`NE z>32)xdrRY<Dm<R44!&phye9FyE^xmraJwenbB-4r@nC|`G;33ST3q<JU|;wIU-o&M z#cWcUj0%HZKE)eV$tILKiC!}y;txoLLzY>Y!KT-nHCltwXw_S6Hn<9!t$L$XiD)fK ztyZMb%JfFHc~)lwPJA?5tcE$8#b#9)v^=GZWibhjdcH-+f{uz=u<9YZk)@ZydBUWo z&+1t-I+j9A70byc3)eg&fqz`B)tcu%Sr#-h&EVOK4|WFOSDzwnjAS@PGB%tX*>I8$ zc3n7g9RgqB%wNNq8^DG#)`fs;W2^}oS>v#)gNFZyWr2gM0~`RlfjdLJ+rNRjHu4I{ z|9yHKKq-a-t-#`-R0a`pnJX;Mfrrbs6`qjn1IbV<JB&1cbMONc%Dz2>mdn0%ty|_= z_syZ2f4EeAwI8xEbX0QrewaCe>*EXXV&Ckm_|~NYES%Aw>@4|u7gWNE|F-qf?#PZk z&}18f+ZzqL?mG^|V-KIhxx}^aKizroOqculp2KHxZXm9kM1*y|up|e{_V6-<K<NuM zGC`p}<n}oDG7w&jf@(t^I^2mV5XKeD;~vRk3dGUy2vjk9w#)#4HFT$owXsENxFv=| zvqZiGQ>+OoR2|Qg`{l?zZi)_H<$0t{`(*I_Z;Qh7l*e!L4`zsWUz>7C7y9Izy>pDN zh%BP)qj#?UH{_z=_hj|1B<-$*iBoB+#*W6(o+M7kOGaBU8~2=4lhgMuhg6&0RgsFV zxJszb=&#Er*C8DhS9@x2^jBTzdKx*>k&Evt@9C?e(;LQ_Rl}r`!H(O#wU==f7fCe; z_D#xQV-6krbadz~n^8B#ZkgtGPEBHk+-Cm7d!-2Jkn)?SCK`C$9_C2L^h77KuTnbR zG(;%jPu8#~mE6%r$z-=#%@lHaHL?+-ZpsREGppKcG};%evvX>H{|YB>)|$AH^(V<2 zqR8uE<n`o;QzXi&KZzB=a*AO68aBH2e{(CC?%);;fkX__uT_DRRRNTr0|!w@cKqM8 zTH+VnHIEOj^d&+1^(U>4;eln#y&%uW0hW7Wm%-r(Tp(M%cWYSzT^B$!;Fl{ri9@JF z83y!P?gmr$4c{KF{pW#dV3_0T`1)JKrE2*B6wCI%`PQWpm<4$l8ZJ>=`t{zjf9{5o z*pq{Cc$ZUMF0ow);<`aq7)tU`HATx>m#J_$JemUahyEkU{T|8vu$Bh)s=^B+C=Wx? z3zYcbsS$n?7zR{>HdgPeu*!MZFP$Eo2@91F7*vP7T@z6c#qsb^_)Ht~ScWN7#ujT& zKLI6YB~&Xg;La-Si4A{5moEesm;-WWT+^h#Cv)90<SwcF9ZBrHDH6YXw!JAb_nQWn zE3&;QeD@5w*B$kq6yEM6_)Vo-{9sde#~3z~`sP;O``rHe+}fgxgG~>HS{@>#_k|)_ zjga=1iGSAr{z3P<td7cCyfIuSwsMq1>FR6K>iKFBm(8RyMi>gUS|k^X<XrM_*OYwR zV9=`cYJrTeH_0tl6;CiBkWO0`jB=$MV%_|LjW3#3%B4KPI8QVpmow<(CN86Wi1eCD zen}sx>?fB?5E)S*B=VSzgZO81Hda7uV^do>j2FD&XN^UP{p}?MPv0EE)NjEIIYpD5 zFoPR04Cg5J`Uutr2iBh$TLO5nbz!3@90%}V5F{Z~g8PDO%#r`27812pfsn5KiIu)c z|4QEhAlHw+;JFBZAAJcc{UGQ6w+lOlU+&ZMy%*NuxjKIIK(XQo__9A;7*OmxHy~Qw zckT^9G2j<Cv2PDnqpUjkZrT2-We2K&Yfz(r*ywOyufcu=lidy=U+pe+Jx_8wPdc1H z^tv<%LmD0+L6!v7tbwCfs7J3-ysnUZ(#WufDLj`Q^<esB-gFccMM3Tq`no_RHrMeH zb{gahB0;AuXF4n!Hm;1pdS6)E8=MJx#iA1+i;%;QxG##hFN`dZ#ujVNJvW1md8i6Q z?n|Rev=NWh$8#is_qE~0))OVRpu*X(;yJ&3eQ2@8|Ni`e>q@r_ol7e8MN5BA67IVq zK9DNiox<OnBHn#f7M03*S#fvx&CSubCA~E{<2_~g>MRDfn2CEzsLAfFyF+TsBG%vO zsZNKh+*tP$0f+W^5kluDi)D_>LqtQ=huE%cv2@sA5l>2~MDp8FdIOWzL?cyO^%END zuuM+l3FuN8S1F$q3dm;j7;g&8X16Mp<cX<Hm7F-uZsD?8d7KubtPdInWfSfE;btil ztLKxU!%)kkL(-+y2tO{`wMrF_KR8CGnMCHX`mEO(@yMyD2Ww)W6L)AMW_V-N=tjuE zBH0@qa5^~-0HOii06?+zj!?N4;$%48!7m!v|1Y_KU;hR;E<Z=8^y~fUIB}&P$}PaZ zgQSCS2r$kYx5B&Qd+*L4j&`m%iUs>U+T_#m!x1!4qWp4ifT#$x0)8!XYgm5x-FJto zmoK?6D1hy+`o`tWvi+4ySbpHm*Za!8b}0kj1r*yGi`#z&1e=M6&%x^YL62mr=j9={ zivwQCG|x*Ek7T6J@A?32ZaxW3&IN)H*hqPg8*y(c3|b0vrj}kCAu67FAcCz0n1`}> zkYy~^pDNaXg8~~>sE9As1C>rbkVfP~50e-Q4wwQN)FNUE6c8a}ia?a!a=yZT3{)ty zrGfeC;37j<k?GX)j{&)Amumt99N7^>?Q&JV=aOt+ih6H~(j`T{Cq?R#%K9x;nw|B& zslIHe{Q<F}6!$iZMXIE9lyE53bbNVVQxU7LhKj2mCAC<z)51|))w9fL{(wYGA05T& zj9h_)(br!j5i^V`gWdemXi$uj>x(jD7R>C|MQ0ixW7xe<M-e*S`f+Y%abf18MZ~As z%wnyA{mG`Z&4{PR`g)t5@<-}vy=9D^mt1PyIHks@9#RVNz&IYOslU5ygqXu37gBp4 zP|3wTghE<Z33Cw3<Fh$ryoYbxI!wprSo)UJ!<%A8oH0yi4BI(s0)>NKn<F_+kqCQz zBx@ap{YwOMT?F&j6U_BtqmYNK2ZW6RR)x}k4yCUO8U87lwlZjFRS<1;AZ<+m?U%rz zUjk{X0-%J^x5~e7iC-)IfMvaae-jP3*1f_9yTS*z+#9=WiDB;TK&&4<JHdkELRNS* zedpe|%oQjG{_FjpaBcYJAVf)UWDqEUSxXTTf+TS5`L{0RV1Zn)XB^!&ey;z(8N#7B z*kILj5Og15wa*1`UqjxP={{FRy^|SU$-}Tn#4CmBcMXbObl<B(0cj)0p^-3SEEqw? zK{fW+wIL9Tg(_D__B5KV-<b-yJqd->C6W2lK(qomQ0&BgF(4RZg7RQBj~Y^a48+MY z%c(M}J0x3q%7_x%$tQD>Ppy9U<iU@uzIpoHS9mVhq`zO1?z=4Cmjba-emGU^k}f)! zp&I$nmU#v78mHE2q!N>vX|t;T_`|AJ@{M|_LCZH9Byfd;bX`3o*BRtSlgwxl>WzH8 zaY_zNsAj%g&ej`vYVEjO$xtZA6smDZ)n^R+so@SCpD5$BGih}yEl*(-7_8G$3BjbJ zs^xuh2|+5vE7c^qjA+y|5v`gfR}Y&^<4XCEP}t9#?p3Mi8ZASv7&7amTDg!$9nc#M zrn%1xpX^4v+4jZK*HZfEPR;fp;`TGc+s=$^jb(0*VQr4#Y>we>ImO)+4YXoAMY5ct z*iIPshUkfPk*xJm;~P$b6LUmMhaZEm`Aaxs4HC{+9nJuXtq!IC5;}s$O*HwZ!{L|U z;h%%ZzXXw22lfNSmhf``3AhF>?1y7LKl<WV`r}sm;eYVKeea9=@fh4BA;X7GGU&sA z#*6lq-jMA#1HDjIfpu?$^Y`wJ-yW_(*#`7-K~Qp`xtI$|uCMn2vt9tcb}5G;YfsoK zbFts|%8=*fk)u~fJyS+JlIh^W{L{w0l1Ds}hW)Owk6mHH?p0W5a44C!|Ki|Ls3L&G zS{fv0w4+yOKB@Ghmxq9Q9w~#K*J$3?nE)s=KuIewlN+8RKtK-{>h^)zLQIhsTpL&z zlt#}b##1Hc@Iu9@QfScnl-&3w?u{+1NbiX#TvO$TGnB5kR7dZcT{8?Wsam%*)uB}R zfi(5*RMnB|lfTDOD()onIV8D!_|qrN=Z|W`tVk#ylPD)`3&!~`HiJcD|7e+;HChmh z$!s>5tSW_>V_uZY3~aq+TCN<|i-(Oes!>jvQPO85RI`q0GBYHiP8q*NE$Y-sJ56fr zH2a-FP14ILMhQiy?2!uFW{m>|b?=OhJYyKN&I~JMIF+bP%&yf=HyXt)CRw|Z*DxdR zFatzQHf7hm4(Zb?dJNirgPZ_tG#c5TX4#ihYMsJ3TjPeob8SAwSR$A6DfXt=39wGl zEGG=hDSF%~dcp}au>k`=LG1>hSmgM6lw~ZitHVZsUtqz5t%htL5Q36yWiWMBFzx4H z+Nwa5TZn^S=;<%#1%VRItNeRcfeZtX%Xf)f&|QH>MPSwvfLVa=9qtP__5G0#fFC@X zmb=!XbOV7VG_QaA7ro%#2oI6p?0dERKqV}f4@!q(Dcui&-D;_HzpJ#9cP68A_?SF# z^nEcVPl(AAK<_*T+UN7du|=xWkL0n1a1WG%Xn*K!ZeYelXy#N@t~l<YIxK5C^e!(v zR}hpn1!TfJRDiRBjTlfw4Y|t$Zu#Be2jxfr$Fl^dO09rk7)H$32Ip%|79hsh(mBj? z%ZaBZ-+NHLGRHjqf_b?ZS-uci{yC!b^ZpxJ*XuI(8}b9`8rPdT_bZc!5+}w9RdOM9 z-ohNAR?O(9EHf&jUTHS!p;|QuWzSiw(Pl9&%$n^M4U|1U&d-<^OeTv?BQ)z6vgvlI zdPHU5n&)I%BOejS#*|8?RzjZ|?h-RQv=d!3Vxn0KMbgnlEANv<XgBb!8o_6aa#qck zbLm>)m`XA+Ym&~H_#gEgqj<=wq|a&S^SWV+lA;mxnB`<WugS=7Gm5*-s(!19VU>`q zX0F;g^~owoPJOv1oV@kS2so~7abw$&IL`Ldye;wU&GF-#&aj;0#x|ZF-x$kwKE>H| zY6_)T^u&4$8zLlXAyl3m`xB1yniHdI!$;SEBRes=CW856D9u4PNcB-lt@+aq{BQTQ z>Nx2yZmsY|y1{d;^uhh)pw&-Dp%WGh7I=j6%cJQpW-ajx$OWG3JJ1PptpR)wdDwxs z%MYN|;lv;hs|rjf1>ETKPa__`-Wz;{6p=O<a+MTuWAM}+dPL@MbUr8M!BlkNRLsLE z%zX|LbDtBN&y6qS$35i183-7eBRu_30eXv|=ZU#5jRZax$f48_^*{<1^H_y}YWhRP zsUl6xBQ<!c2v}5Bq=kcjCf7Gpa^$+iCqo^Wsq@d&2Hw;8+*1Itf(x{P4>bOHD*p#+ zpZiL$d|}{2i%*Wx4M~-GAaXavuqS=SJxv&#!G)Pqjhv#8c4}34t%9nQldYC9t#Zh$ zpD-x7Y9U$8>r!&DDgj=_$C-5`u>z}<_vn;FqmneEBpIQ@S=y<QbSQ-_(y3-OzeT~V zld|5JgpD8NjkC%+jj~=PYcy&*3>xg51tBe%Mr?YTSxL62DOSUfK|P??lC3jT`^=zG zjx|ZzjFM)Zv`H&&)XSRn(k27H$s*~n$O&fkfXzH&l#*v>r!_MS`E(O@knbGbu|0vg zBLS2SCU%_VZI9<}O#n=8j^}KSpV)GSy)}-zC62fC3~yu11OR~$xjqWwBWnX@{MX1a zz<Lb&5di0PCmoE79Q`$tu_lbZHhcsun&AhLe-8c=Yk~*X1XIAGj0=Jxz`m8oaX<QY z|LB8T!b;!npMAQ2f~a^DyYgrkN-VDyU>F(<5r^9XFNS(9xA)(<zW?6+{g3XT%v`s^ zt?mccS^yC3yQK@|fhy07c<6$FCVJS+4Ndf+8T1pkM?*74LO@jUIt*Wf@b?fjp+dC* z5PBQ-*6<_lO=Do+VV>aB195zjJP!O=z6kD$Fd-CEh(Nk7I$NSXQzSoKB#$hB3!*6E zfdK5;XIi)>o_VT=LPUJ2;o@s+!kdMdR||nfX16Sr`)w^mKetT1TZZ;Pn%qC%awuK0 z|C)Y(s=_60`Vb;La?85==G?(smLu0JJ8yp8kwihBVCB3PlV14AZvJAo{{g*xiyslQ zPAudNX%wuvS*dMCxHzX=nAO=Wdiy-oNY(JNGe57gT4eCo3>w~oe$1+*&C02>a*9Pt z*7C40cEN(~nSruVT%n9vBOY(G8b=mwT)SOln&BJOlo=fjeqy(b8P!y!ggB$8S~Nt9 zv};DtY~t0L5y3mVs6of7(6e7lX;1az<#KxQ48K-0RWF}z*0QSf{1(wvgNff!-8AGB zg57+UhD!aM9oc!7wG-tO*Ewziu;~nE>lx1G(>&)G?xs^*CkzJw=gqM^)Q@2}>met@ zaMnez{=%=3z%T?D#{jH7IlLx<23Q?NT^&ySIgGL@bl|5D^14vUuVK`+Arwfwe)fkv zjPR3xH&~QkzL4AF0KhM>KX_vSKY6z;0S0s7utYR8PC{%v()0slU~V<b-D*I^4Y1s; z76E3#T)2Z@)vjluB?1Mk81lSC3``#mOs5~aLiS1ShZ2`}D(sIR3C>`_dt$&%rvFW5 zz-<tjrw3*-Pvml7nFzEH0?-GcCyM9-QH%pnwugE}3^cSq5W*IVs7I27a{ZZSn$u4- zkjtM&o@h@!R>eJ1fdcr+$7)Q8DXwBJ?!`jvvxVci+9TN#k8E*pu_5BQ#pAB-=xvKv zrsZ&!z%_UBV4flX<VLe<k}eeAM4qU5G>wpEkW!U=l91goMtwtWemIORo*Jr|=&Qn4 zWj7Y3ytp0R{TgBSz2-CDa~XBh^x8=}@}4u?z!|FN4mWVg6@2O&DWe8Pz$nd7GcACb zi!nk0tG8^Vt7xpJkcQ13?JDT5K^VO+w8CDEim8;-0SXyiqomHwa*SHKT1?an@CE_S zAZXJHnv~N`;)z<Vs7=DD(+YYNT<pA&1)g-)JT<EvG;4+tgO2t|HBi^V-4Vvvnn>Aw zX>{j#_O67<-_NptyTIR?Ftz0@_^+w$3EXY*(_7-Ex1N~>egUmE$4)t);-ZL|+!zg9 zn_Q13{E(AzHb8|8vN6oq1`HD>h}TBa)<n|QMGeDYT_o+76TmPEkPKM04hf~eH*j8S zg9m>JBK;iLvpNtik@%mE_W;WPD+35Cj^lsu>jwPn)3Ms8W0g+_FbnwgqgM+=NFdjb zM_bUdCq&CS5I0@n1wyA#selLxzN-!_(Cct~3v|!BpN9teHhAuV4ctD^HkgP&Ybw?w z34iQLKO|+rw-{lW@E*vF%;!bt2|{4~;SFew7!A$jfSxDl!}_N)L$kR-cQ`??7A2Dd zlV;Hca%g*qdZY-?m!5>MSs;fu>F@$s{Bv`BnHhHUU<y?s4}_rw;#2TzkF_wFA6YVk zsj!`X{W<2vC&cTn+Uu^)?T*4LQ+gzQ=0Jw^=nYy)RS&5&gY!OTq$P_x_(nTg!Nyhy zNmZ=QB1T&ty(Nd<oITWdn^1Xmpbnw8WR14uvRWVX*W8}yF67`I@yO4Zq!R8x*<f1^ z4V%v-J{D2S_ybSJ@%hxoTeOx;PHzzdTfpjm!b1kj6s$VsXbro&NJ^`qHf6JWo(#1< zfDmUAw$6y#wNs5^`di*`wS2POBqqpM4T`Y_4X0(A{!YzplZ`h@#~ZcN9ddSybnJtY zhgXZKS|v-X855~SW~>awRFiCim2~a-rgN+viK3m!qq{GT?>(>GkvRR^1>W}a$P|3r zah|(9VQOnUgv+Tdag%_}r@@yw5X*6n{h!PqIECi_Xz~x1xgG=J2#obnDAq>M)<w{M zg}2Ly;a?+Yz^ea2@Zj1I@|sZMx=@IjeSlR##Ge9tfocd!F+ViVU+voo{91BbaB*A- zghDyhyb|<{;N#JjmEMgjy&8Y?e80k@0f+|7`q2$6Bw_EolCYi^JC9sw_eku3jmH45 zL;~8G3eSm`(7o=^TMy9^S|<F{s8BeCcWY>!hbn#qlFfyOLTJxAmd^5VbUUD}4j_OH zfD9~O5}GZ9e)qs^v1j_kpS?4MvS6481wxf-6W`jCYrZ7DS&V;fk1wA;_j2L%3rkF; zF1~suzS<fKF|&FxwqfC7r9P%?HuU8m5t*I1x>`o_bK3h-2CkgZjy$T!jKGzr)0+zE zA0CRyRm$Od`9zCah!e1yG}AcYNR3WF(u*jQwEEt<EEpeDjn!}|&#Blvpa^fMLOuCG zIab9VEFHz=(AqM`VGxY)2w$DX!WT^vN+=D;P|H1H!#!-}4K|F(R-`sQJ~!4|tmA#q z@|x7#Mubm&reM|bX_e}!_hRN-G5w{S@s>+|3p0$o!7BbxwSv_oXQB@TN=_SxR;QN_ zse}VYB}1bcQcH)qOj7szn%^+pE@$Q2ukv<W9X*g>+?B-t3)?SDY&$o(?Hq60Iqv58 zN$_S%*b151naRz_>4~jzKs3n3fKX%3r^cOQS<bOzPBEkFF(d0RBThiE$dL^vXzRo2 z>rc=(M2t8^z%%90x=<R}wZZU64y_oJbz%MM!uoy*?p+f?ToX+CC8!So`~rIY9MHSw zco)j8W9>k))xOvzo~=TOg)D_jAQzx%h1dHZJR88SaI60dK354#@J_))-;G}i$^RO< z0{-|l0NM9S|Itgm@Olm8^1Vj!a`e+f7=&RU$7lv0Exp5P9%$c!r<?*=NH#Cv4ooyc zNnQ|<CqaB}!#V<fXdaAL=wa~nC^8lX8|xkjFtE}5kuoGl5Sk}FRjfZ-HXB`}20`#+ znbP1#GeL#$CS=CER7Dieq`a_Pdiy2f)x!0161L$jv9Xvt^8S;KNyC;fd!Ly_c<p4% z7~$Da$0IqjVS0K<Zx%|GY@wJr%^Q{?G6s)FGV9rLexH=xspPcirkW%puldv$dTs+8 zG^`rqWIeaHsHQM_xFefSEfEesHBMI>`L#2`8ndY3qnZ49mi&j6GBr>#hRYixmdr}A zb~QoIZ{^ZnYNwh^qBeH#V=42UkX|7isRAb^Wi|?i>$Kbs%_P!c<h5%#ZNia8Xu#o( zwJNwBQf8})-DebWc=Vd7;qu^X?SAK^2a?60NVX?Mz5BB8FYHX>f+O3J$OoW7@;rF7 zY2ey#3B2uR!J$FSM6t!eFtA%4SAb2YSwOE}F(cr<kPT5I8zSi&A{pxeCr5sbpaa*O zz>9?g#g<&yz`9T%7imo}@Qb)6goJ(!?Ozjuegym)hzEZC;)h-9j|0GAHRxvgb)YT_ z^;*p<y*~g@R(S!p8drKW{2TQ?NOF%)3Lzks6qGg)m_`n|F#rh7poSu}=$!G$yDY~D zHXZW(@Jwa^43!~}dyT?dHIOUd7Ap)?t_vj4(G>=M?4cB{h){Y*+a7WR{>UUW{rP0_ z0`G~TrxZrRKt9(sjdv_d7MQ2?%h3cC82$1Qy;qLfJ5TGGCG*MEAH8SszNd>QUGU2{ z1{Tg7yQ?^ntqi_De>86)?ICrzu6Vc}R2e!x+U@i~oS22R$OaY+43m^>5cgS?)cIMy z-6sC@NntTVo4Zh>9y4f}8Y$#R1PQl&MoOBMkxlTM8j4LzHcGHYX(wV+<7Mo3&}^mW zelYTyRTH%~d8bj>Vi0_oQxc5QKD~@MucH`6ogB(@9jns9tJSjJe3G~SOWUQMsIut^ zA7_W8>?+~tEBQpVic@RV;uV})v!qSKZ`5-;XGMK>4MQ#Hw^>D6Db=oJTji5_0Y%Hf zj}t2{Ah$r3n71QE<eEIW`zkz^3V>W-cU|J|y0pYBA?W-7zkpUiF}O_vvrstv7s@OL zxi&$NJk0`t?*eRyX8Z{>LNfnE)aYh-z67?N82UAA@YgWPx=@6?Hl!c0CKx~h=k-f4 zVNEdMm*Ae&!65L52Xd_kDY`)Xx`1vV*P7$lHOD*G_;-Sg{3=kv^=Von*Al-#QXckV zIPh+z$2*_IZU^vwmk7RB2*<Ax{ZsoQGU=h2)Du}CbTb4AJ_24WB%Ky@ZvwJ(^qJ@0 z6g)^ne1vu`=!Jj-*wE~WpiDOO143+s_S1-5A(S9sLK@mhgL9<NR|@3vyak;PQulPp zkqnuCj=}Se()G5?JzMFKqjE*$?zd$g_oQx_V$ZwsqxaN)_YEHRb>3N0FXW!yB~zJG z*vM=vXJMa`>dHpjYblK-vau#HyNTKVl0RB!l;D-zHptV5`>VKPEqqp+T1ryOnMO5# z)+jW~Syma-$m>^5;4EU2S%}w9w<;%U41x{=zfHl0*!Ge|e9R;iNtx9OcD;JC(I{v& z^1D9jS<rtos26st;j;q!MMtoRS{HT1FZw>a0&kWyT9gfHVU<~4qZPiLS2h~hFJ{;; z=B6su^x|30D+#m0!2e*DVa*z%Qj9Z5@t@2TtFBuo?UIhy&B(h>r*!POF4%WdcI*;+ zf2z{usuZyIirC@41iO+%yOP9+<C|zlqVO-zwevh50B#E?27m)ZNT^((#f$g}0I+Ox z92zIr$Ba5bh93>l5<D7fGluRQ3BHTE@#GL3Hk=q-9}c%iu+;V8gTIE8)`s@34JE7# z?Ohi}1fbkPf_l~i94uQG&;`s|<KOYK56C<LT4C)4P;8Y?GYH6o|5|;l4wkO`>|Oiw z(OOT~nG7vl&@_J$wj|;_ueKk%))kOS@lEOXPbK@N5`C@=_@xd8UZ(`ZH8Nu~EORU* zlO1@IdGZeX6qFzeA#)d<%tNM6<W58vK#djcrim_4L_d%OXHWZOp>Zz)`brDbC-T*P zIco4$UUy{fw?uyTR3SyyW4T)QI}+df2G6@Hk1Qns&c||f{sm^QY_&(B)#riaNRDpL zbx!Gv5AxxLLBeZl-EBcz!9-gwy*-;pFK3ZUr|2({32G^4=qY#b-Q-|3pI#4EKx^QS zcQA$<m_s#_qi9J%!hA1dHcLmFAY{o{waSS)C8v%*T)`nj&vH3upo~v{DS*UjyoNtq zK8h;<F%hkVVwRHhLY#WKSubv}LU~<?HB0eOw=&7_7BOK~(!Zb^u^~#jSxWe*rK-6- zW-)n2O4Upe)Eul)O#Wiw*tM+BW`RLDYSE0%C`RU#44aZ+ln?!3RYfQDZavT6on~~s z&fSeD_g|MCNL3v`CCeoHuS)l&i1#Fm_a;ksCy94m6z)tE>`D~wgu_MQt|XLdza>oV zIM3U04&lMg(orJgZb?9~>C6Pw$~MJwHpa1?0cW7P!A8%~bSL0cq~o0&GYqX5>rYbP zqf_LdQxqJ?8^cH-uJ#vzTqwVSdYnRfH--Y&a3C1AHlSl|K>NA?EC{Ep@oV|TuML5( zpM6??0)0)NhBdzL!Txfr{zT%7;PWq!pR4e_Q01F|_d3(>c@9>2ce!3@aZSP=N+j;T z)a{yrKbk`DP9b_<AN0?F_O0O)*)WU<k2+J~pske43(21J%@~8}3g~tYzdI3@!@(3x zV+sXPMbZ<6^5FYYzbuIlavOSQ6kfMQUYTP5JoT|Gu~)XjC)eO{2c^}~dm5nC60>~r z^bi$+Uy=7ehL&o)o~bY7X}Wv*c*IOHG;0w`M_LP+UB!&<Vscv^rRCmae<{1Km`{Dq zrdEi@>sgeSlf!Q&$S=ppuO;KH3U-^6*)CxsEs%0)c`a6Hmu~8Vk>6qzv}oD&n(^A+ zn)H_E=f`k`6I~^g>N_HQiGkTD>3gnY)>!ym8g9p&oHQ#XsyS`i$<BEtWmZPAD#){P z@PJ)nMwLa@X5=^NrW@p(I<vTEMn%y}$rdfmq9o57rmR}7Q8})bj36^gu1PgvH}mI= zT;VuQK1J1wNkm#tUU{caI@L8<y(fOo{nDt%HQvD#-u@KvzH8FGS0%fl^&>^HE19>` zfgP8ob|y{jy2JzfTjJ!73y_v^x1Z;1OPJVtp1mc3wK<--DV_;-^VzY#;1tJLkDMCb z5KG@21CQejrzpA;hQ2Wh4nrV+4BceT7%FJhI)M~&7||)5v>tdA(hJr(jNlwj0J|Z$ zdjqKdf>e1Bc6~5pU|s7_w5{=PT<6!k&JUK{eOT+;^s{#jV6}Jc8lU>AysMS>Gb#%T z%JYiKA0StY3NljC9>gTp1z#KqIL|nKq0j4VJM6gix<>WBIplML8gzpem^Ks)jrO<4 z{BAK|Pi%PZbXd-`f7WR5U2br;$p1F~c-C}amLM>T4_i24;Nk={!RM-i?}Fn}2Hw|r z-;n^lyt71}S#qzt8qX}XD<TDYf$u_&K;<D@?VY0qu7UMO7r-u_C}0)8uVoM_`${uO zwONeTQW#|hF$OKGnNN8!(N{9kRlp%Vg%Z^WzK}<I0l|$s_?%07!5euwO@AdEdBf^2 z7PITP!<ACjTX0P>RyEYkAsCu@%{Fnza9d7)!_ASlTmdrpTu6VV;??VUAJm*$-cY5H zPnegJ6s#5l52xXD%9%|TQLj;mx61patQMmfr{vZ%dkc8fmu4~6A}1=iovO+AO6~`P zu>EaO9H|}TzRD(OwMHe;08kC;<s&w;P{<+T8jJc{%M2p5euDnlIK}LLuT&sCAny!1 z!>*}P*K3jkP(4ls=}w8uHOcSEqCLQ}%i>*^AXW<ZTo&(6hKMNuiUD?9<Ze&oI1+xe zybsuNma}9xonZq|-vvQ3ZhUhL17#J4zA1*W33wI*3drP*(F4wyK_?6aamG-#MpCv! zkT->soWn@YV8eR=PNDb>Avly=!8l;ny1)+f5QJMF*tRb4!-jyCU;Uca`F#Mp#s^r| z41hyP?!AJnjGT;=yv!>lnVGL1<X05tl^14~<Rum4re^0nL~>rA&uWBDWViI`zzouH z1fl!hg;r5c;8lt*>}kFYn}$I*6=p6tKDT&2SwgS7yrWqHkDEN#)NxOQ?Ulv%%;dY@ z;<;r^d1gvoGlU+uB}Wi3=*+uk%3TqO$6fhfArbfl+ya0H1K;KT*m(S=xa2Vj-&sa! z%o}Tmeih`|aK}S>_Y-PIF?-;pPTa_)J!ey%siqo*%<3`FW?(iN<^4tl8M1vAxl%sW zEaSC7bz*9~S;%fwva4o99SdrLn%khC{-75$LsT4S$t5=4H3^A~-eNkTNX^AA=;<Gg zlzBZ#J>6lIljc+dMqxLfUc(`kBZlcVv#=A=`%k7}n~}OW%aD#W@~E$^O5#T|)u<uZ z4P=XkWR&Bl>6KO!_2ca1$2q}_k*QPA7A%uiHNz~Ss;B#PJn|^<P3y}ndQ-8W?>VLV zF{?4}WRCJsGSe+pc{ok&3N}@K@S5aMs`%hl;r<l9%jIbo1lriH^7ma8fLQFVOWd7F z(@WTq$lH;`*>Q1V3ER%I09((qHYYGQogLi_NMLRO#L_pNq5+`K$AKZ|m_eY}Mhpej z*^V06e3JAhB1oGe`Zk3V0nTB)P9eas?)AZ-za5O-5CYDt9S%-#4sPEN)V3k84Xjg8 z+giWcb;s-0`qi!Rt+|<WJ}Wh)Fbe^c+|R2lEh#T5EXmJ%Rru&Zc1nKM*%!GfubyO= z6~DZh^DY*isBcXAWK8>J@d7gGK3PM)_gFr6C;c+{{yB2*J3_B~iGQvH@yML?%$hu! z&3C`eKax4^p2>Gx0wQ*YhrwHNcl022M`RwiWnK=S<#`wNT;4ev?_6+Ps$;ntzkI{K zJZt(R9HHvb2>vCXT25`d$s1`<@!Ay=Z7MEaG*%~)v<!lL4WpJn-X`I8O9cHQUY{0G z4o^?wC1Q$zPta<IH5&S?g{3!fZL?gn6sr@q$=UCr=4ldPEoz)e*2y3~#W!S|v}`Cv zLF#7Lj(pN{7f^B$j1uC!cF3+BvZ)7WWF!WzU_sq$5@YA#MRKxHFX+??utr5Ms1+)> z?M5*{%WbvlkRhv)zA(eki}6Nz-;A1UR?}wG%#UWiQ8D~!L8%jwXB5Lwf0Il=hEHXa z8*p!O#s{1AjEdm&QSZ!&Be&s!Ugw@FbH6G&m<GKe0{3g;gI5GDS5RW@y*j-Qr5Atq z<*A()r~j&o?YzYQ4LsOIHUj;-ThBAMo*&zGeti3R_O^u4t!Eiv(L)^l|A)<|Xj@`O zHe!HfRCMpeNmwEW3%g)rT;G;Rl5+%cvx8;MCx|e=yYU1bw#qq&W7mhYZV2fFZmkb) za|&z&EyN|jisAK0Ks|hemDUe4GVZ3NWL~<IbM4xl)T^1-t`y~Dm*(d^$;&U!DSCY8 zUU5cpWm<fGQet{SSYGnUawO@={l~~-VrVAK72&yNa6E3pTJ#Yw*e#OEa=*p)$Qbju z$vt{=%<bm*!A$XiJF-J}q^`HYP4N$9iVxqG9?pPALIix4{4gRrd|U1Y<jT?jv%Kyq zfmYu4v`4eG-uLu=_sxEH#n;pBv71tcJFer)GtAR{(#aM+t$KQ-PR)nc=uVZAWiU+6 zn8i}bm_o|3*`WtnFwJL6<$R4!DOdBQigCGuB~-E$2A)>OR)`29E*8=u#AX_kOUOD= zi-=WCY|d#cPf>{pYJS_imiSRO`q?;P)An1{gn2FH%N$cJ>f(&N(}=sva)O1!6=reQ zCq3C_p(w=NbLKINnPs0H|1{5CoaagTgimJpyQ5as@Pd(L)YIh>;+K!2MXUIuRjie; z7wsm4p8pB4X%_7&n^ibB%QI@|d}b4_>5+D#8vMU&8hd|+^w2$-cN)+8I@c{t>TyHv zo+fs^E;@J(IK^|hI(;BjaPYcte=2`hGJn_QKd~FmXkm=K<05-U;`q+Q@m&|$yTFxQ zV1YvRwgi-3p#Sdx$hSLA+v6F)we9gEn`4JIpQde%rEZNPZ^fY4h8ft7p*TknHl6H+ zO@&L?1e<Cja9d8|HimZs#Wse*)|eJ2So8`AYS|dv>J-$lF}MNj`hdFBi}5#8E+E&E zt|gwio)DLs5O*u-d|rBL!QGoker8JX-K%$#Pp7BGKgzq7o^-0{cGktn;D@QPuXD~d zmEU@ubGx9hDl`MXFKyyL+6b`hK<3o$^oc#`tOK{k58vV)x+Oi7E<BVWIg}wgoT)l= zTXiH`>wZ_|en)lWw$Lq;cjVr*M?T*(PvDUw_R3Xy=jnZNb-sB<6iA-w_#GY*KWZF$ zK0&V5NEx5ZGS=W5@nGHLV7Z+8Rx5a?(~)g<nN-GCsx?--&20Z-n78X}X1<!QwJT>n ztBh8GKukAVCT$iT%q9M7(Pp(w*k-8~BmIxhHlw)1s=)DvUJ~EmnW9!{_#J;(d5b2l zRW<U(icEgCjL+-oU*;zMSl}6D{W30gx~E{G1GEDXPFLC#E^VSMT|z97_dgcl^QXIV z*ll;@l&7lEmmEU=Bq5*Dm?q|S2{|3J+EF2^$7T`IiLctLvOh1{%<!UaS6ODna~7%1 zthF1Z+;O5@2@Qo!Elrhag?%2k%!pT}#P=5ONV>!|RqUQFhExm$(;b*TaE-VB>ePX& zkogM^rU(HCE(`W0bN41q?oHwVb|-Q7pmyT-i>%#A<2x@fLCSc?dFZ`hECKCKM4cFf zN6MDdgWJvw!={pLr-!yhp_JMNKroc;(Suu}2!CN~WY6XZ{FaFBtr2+VuukVN?55C; zjloUMA<eL~8nvM<&Ovp~!FA4obxr{_xv3YCi*adZF*g#TFULkDV!~5mF-g%88A%Cu zE}u_Lh`Ez`@ygi<|3f<>JY4+tZH)8xxDpkdeeo2jru=Ool2rHnHleMO&|W{-`kaNW zBegX&R#m*IZYitjF0SgStRoj!k?+1BUo0ZU7E+=g(@s2O_-2iHA$<4i+C!-dH$?4v zN9CTSISTi~hoCTz_Sg8_S9#|uymOSkIgBxeScK2xGwbzA2D7__KU}8dG$>isCPABo zQH>Z?G`m%6w^^-ordhkfXjWKewQ&CO1t!bp#eBL+Ni|CGnyFSDw@${cpD}_)CDW`P z(g|^P{lF&^1yU|}5MtpAxuhqP!{t^j{a?1RFSb!=srfuRI&U0M^IK=+_!$LW$f{*` zWLi0umho~Mx7^Arl_Nv>5^|n&AWuqpIL9s5GoJ`)MRIxxK*KCm(u*a7B{~k;y`vYl zfTyE0AtQCEI%&U3KoK+B_~ciF*Oy!FgchGU#A+%ARRHl=HSJw`a$*h)JMGId9l0ew z0@*``$ODnM-xRv0@t1J;`ZSdD52Yf!Lsx}MK$Eh|T$f}Al6ZR(fn}3>E{^ZM$o&1{ z7+`l2u#B|>8ZQ#YcO<ZWiy!;#ED(*pEuOj^w#3C#x5m@9$I*U+?Itlp+oP%5FoP&! z2-{<N!EV9yz*ahNS->p^y}GwW;1O8;x+T1Mb6E4HP$1U_)CRuW6jb9JSmWehof7JO z4db7FI^<HA_vM)Iq^Qu;xah=)@JrDV*W#n&LIci(1|~&?xo>w)!h{!QrI+R)Hxr_t z+`3F|C?|F`5^*)yrizxDm#ua6osA7GbyaN*Z`vDPwbZ_7se9SgT-~<6r4rv!gKw*W zryDx4j@tVkkF9HMeOJ@<;X`|CV;!!zs`pX}CEy|FKqkknK<52W=U=P~c%t!ttoF~N z{s96ajVXNgJGr2rSaW%_^9}=-!y%O@M{1;uHobIIFX!qMBC&XkC+>wN1wFL>!4#K< zJ7-cEVU$`sVX%qJX0Ap}Q^^NxHu9{IIinsmN_%FN4MuUJlJjny^kk?rf4mp&2PFnY z$KnF>lZ`%a8Teyy<g<lhL3CKVxyPo%jSoKUC_5$SDKIjh=vj|UjE8#01MS!Y6X&sh z{E?cP$0r~&)6YfJ`)XFPdaRh&pKWB-eo^;pCpx~E$3JT6e0-siTwvlhTBQW#XoZ^g zY^W{+`#8nOq0G&hY!;pU^Nd+RpJ4LtypzMyc&|HRpG-vUeoO3`30-Uw_jI90h8QIL z-EWB8(uAnJE=B<{GgWx-is;}KuqYfJjJqe1y~HhG)t*b^fZd546c;9To*Vz|{Mh#M z^zG+i@eX6#nW61xhJK41+7UOjD~`7P6lE)18>1<(E)^C?leV8CZHelI1yEZefnN|9 zJGVsRw@3BDMuu$>UE3mXTSMD6hqP`CX?G5&*&6h2b3pZ`fa;7>!6}&I4{s;kPKn7( zh>r7d$9NpP78RO;IgxqcbZTtKsbl-X+;$&y`pI?kFA?4cVvf5eMh6$>+{SgZwl`IE zw7ltPdW}VztFdiWZ7r{{?Qd|M)r5`)0=5C)S%+<}?rwjFZK>*Ltf+re@}eZCv#GKd zTTj9_G5R_Nuq}Pfb!2=!5#NL-l51Ot1#g&1PZ(j3c;0z}@caCT91e~+teU9ei?DN6 z!D!bDC_G5%ui4Z>Egw5)m{99jas_S9hVbP|y1_7^(XwpwVxyUBwF#|r0=<E0wv5^A z+{Hzs&8}YjVwqhKS*&uKO|4drKx-km6AiCXJXWdXRFC(AIAEog_ikR@X%ICSrfV$9 zwvTqIX1W=ksJ~dKJo59Qj)(ufz_!U7ZBs8z;{_^Orka*1r(_~>N{*89K-^!zrxaPZ zl>&0X47YNUkRu<;GO<fFtk(<LKD&V}q*qVjvZaJ#RbR<a<+aY@Q+<`^$t`&X1)EEI z|DiAjS9o@$rCdp`Z-0^#kw$gDul37Rc;A(QiofSAo_hutRtS0^{3FOTSO9o4fE$u7 zIFLGZD3$jouJiU?X1k<J!Y0c-$&5Y8BfFF6u*&53q~X2s)O}}RBO&eJ1^R)+5tnmA zdlRVp5@<W)DLdlGzs2^$V&325$iJhO0@xWx*dB|8J?5J+Z5v~7zr}Rz!gTF8Mc5hH z`CAlrE2eF0%m?RKq-9fdgLCA&4H0jhPc}M5Hm?b9`Z@GH5*v0cCMfU5`9#d|_~WiA zCw=cFMW>uRcHU?2DX-n<!@W|^pQtLy!_~hcW9$37-?ueZVOy#@KD;L58)y{l0I>~- zLhNcF;Xe?%fKv56opoI;RRnBZe{U1MtB#0mXn$YP+583};u@f`)7|=xgnLiusOjmd z!#2I|Xlue_8%TsV{kYeZ=2~3aQ+!it^ZTmWrv3*nsfkbNXJasxh!2DGW|I7Z*O$+w zl!@78TFLuQb1c1%Ww!9<ZAzV<J!hNN8pe(0Nu7bM)ic$)5rdJfR@3x4x>iLuYuO(W zn`qvuu+Iw?tjfhX)gND!A1(BGVVh>ON=Sa%R+`XOjOi|q!IxvWoi~WDV+O0vkl$Tk z;P0|<nS=GoZI8nn^ZefDc&eGDi~7bz?fZFE&CJwe6Dv<WoU0!#(leeISuc(3N(JMY za<oi6R<56@ut~d2ye6x>%Pd1W?6ZRl>LGf~eKouLLt$cLPRs<Z?8~BBIZftwJ@|h- zeG6RDcl-9%I<0juGcz+YGiN6&JFHr#wQ{YjtgOt;%sgct5b=cg6A=|rQ4tjp5fKp) z5djfVQBhG5QSoeQW@gTgYg^m1=lMVHd%OPc`}y4a?uQEdEU&Kn`rgNhmi%TWVN^w{ zDI<KCkXKXCxGb$>{0xW#=cHLD!pzTj$bvn)gnxc19v&70IgZHW`RJ(&(a%8apT&F@ zV~Z!;Ex$(%fdKm+HFz?#{}kE)O9heR!FsThLAvh)|DOeQ91nnP;ho1Gcb<6M0SoLG zVf9FT#2X-{hE>o2w4>fChllkJp2~kt#gPZ{!}n_rKd3$AUVFf!=Ae7+VOQl*SM>?E zR<OgjTfV<eKYP32+I^;zb27^1=g0>){hZIc{ctP{@w`?*0{!k5{>Z7AM(9-XRH8h7 z4k9c}60t~99z|S6QHb(t1T>|HF0aTDmlsF{ocd~kxQtOFEatN_r9!&6JX=yh6O~bG ztJw82zJ$+|35#SRwyc_?s49^NSc~wK@N1+zSt&~<=Bnz!wN}b&s_P_3eXT;#(jcvu zl~fDpTy{1`Dp$xQG8Q6dLp4m+hXMLvbL6~%^ju4vGi1Ip<Sh)aUyqdiF{}7vuIb~P z>d%+8|C(36eJXlCS^Z&3@@Zc2_iN>!^U6OL8vl5u{By4Pw-=I+Q<4u8qBo<(BW(%K zw8VwMjOSX?WIOStE(dut&irMX_3^FnU+=}gEeJlo5`3ByeVP&d`Aje<$BQX<swvlh z>7@UAR`l1~+TTB_KhE;!`zW(Llo>5~zK`0*4^+?}=*q*?MUT69s0jsOT0!dOp!+ML z2W7Fd?c|yM(wU)(j|=KguiHL>+Upa3oN1d-GlwN<V$y>U<eYUU7yIj&dO^?ZWXC(+ z48M~0;x=*qB5C%glxIIBPD1qX3SrVIe*6+LdJ#ADQ_SEc+~~!ak)N=`=ObZ<(Er+n z$iW}NdVfIopAFNWMQhK7^_)fP&irGigSt)ycAoslfV)ol_kQo&cidZdBCz{Af28B6 zpXP{n>mhHAgID`eh+TMTzVoX+>Z?5B4eRQg4neThOTWt-N_*4?J!L1nWIwoNopii= z_Wae;$G-ph#8H<YjtAbkh6MUz?z_aeUG%<qI?(xC_`RQ~kq_~{SJQExYI)(fPT3@3 zvSH5_GeOKCR5KGA_?gvgaygxdhzrTm;&fSQChWjb3RpFKMm0CLijz|(VvBjX0Io7l z8jq7E<WrS3oQB%+Mukw*B5P1oR0&uDZcc-|tWL^>Q{7P2q7;GiR8(_o#cV}2uTH{m zuB~WNR>D_W>VyDT4l{*Ci({r?7>Q3(L#~j5FHIx8f<NcmeuEjxz5Exw+-C;f^8vx^ zxMX%pJ~LhS{+V)NTrxLY^>Ro&J5oJ6Ts1#h4Pk?K&+Fe#Dc()i|Ng4$-Lr=Oyw`ku zsrdbuhTmTbe;Hv;YO`nbMQ_K2vjde2lgjt6nm@hK{O4o;fBx+M^r7juSMqn0mD5_L znupaZkg(sUng8>?;=jL%Kh2l^He3D|pl`Ztu0QvAcb1Cd-zUU$a#8Ii!AknW5gAq| zCh{phy$!TyJ!SQra42w|(-*%PDg&F=70z@P%rw(xTIsJkI5REmHZEa8POdK{sd9qH z#OZ|`kr(tALs3b}#Kp8{7gJ`h6Q3g2h?7_GqgU`lSK<dR#`Ir}8@Uu?xER%Y5etju z1{@<6H-Y~Y1t^1QReD%E3*b73?mUZHY}on%r8^niek!;V>~wJZnIP?PwBm4>_%K?2 zG^qY)Nb|9v*5f{^laFD?X5%qW<uT8?T>(w@zIDeQRbF_+bMa(7MEp_$9|c8t`9^!( zjBq~n@Z=uUZD-_3Kx}}2d~gsF5D<9BCD`?Lz^xnpH=J>v*NFjl@K0_KQ7#SKw2@X` zhm=;wNs`bJ1)Eq&kF8=PNLfi@W@05Xsgg;OaI<R4X!7#hT0yQ%kX<9pkpq>9a>1Ep zlQ0}QxmJX5mDT0-5}ra-Qd`MY%1T=sMJh$Ptdb=c=c(%0P0C_r4O1e@Qb?IfX=#J3 zqP|9`l$AHgI5qst+VX4}FSDkUqTpvTk}#RL05awgA@H8prSGwiu7}+HkrMS_cD!z3 zO7ilVeCCB_YPNm+Y3;L7(accUSf6+pR=*mwe1lfl52sErH6))IQ;rWvXU64I!-}_a zLmw6fet$nO|3W<pwekbJ@m}uScnuUUzZ_A`j@G_|kmrlm`N_KXvu*R!^{=L-uU{zs zde^pCc{3p!>!mL|Et~BtS{UHG?`6Hz=8raKOtofBYw|{#)B5WYW;B_TNNf63Yua>s z`Wpjdx-+xB6!mdh_}g<3cl_U{gwNZvMrz_-w55&I#f>ZDhb1_DMbvXu#)KlRF2{eM ziZIww)mf3OXZqI_#-P&buOu0q(t2;EPPrt_yAq~h>M#_TILA-jz)xMpjbB8DFXDzT zMh{=bjlm|lpP~&HB9PvnA`L%<_5BFoiqyk=mmed#0b*xR9cM!{KLl&e1Z!bY{fR)> zIoRcZ8af;@`ki0TWmNmM$MxsE<p+K0PWVe5gJsu)MYjWaLBZ*vA*ArYsA#~=!`uE3 z++3WTem-~p-sKy9cYGoqhoHROF<x*7bOj52a5LKbA%eQ+ioWj_aQjA#=g)YrO9hb+ z1PK9EX`!-=kfNwN!epNwK3OkHZ?7P$h3PGoSt>!6keR@z<0~0N8Jn!+Wva?)jZ%6w zKV2foXl-Dtlm!h6c5Ab^wx(PzE3Z@VVbZZ&#;cK(%OreRHD6I9Y*v8MXV*)Mnh^z8 zB`;CQISn#aU3I=vR@kiMHcHuwvI4b;RgxY{2)c*!bs_k=q@%quFusXT?&ExJq(pde zDB;+LKXgdb)K$0+MN(fU=hu17^oac33(d!Q-5<Z|=4KjS%`|`db#URO{@;I0{{C+G zEmR>a=>PMt@lU^v{{8o>zy6&4{Ub8^$A|tmbM3PuyqC{p|N3k2??1<$4K7x_KkMhc z8U@M|%s-Qi>R97_?5BO47o$RmwSHP?{4k@L8&|z~p?N#swJ=`$c1HPfqWaxz-TbiR z<yiHrr`4}UMK4Aw=0+e6mpeNudIt^N{gNpi>sd#}f+l%hL!M9)r&MHQt}}O5lR43x zI;zSXZ_XU9&*-a3?G_W|%m@h+tFNWc^vODexjI2E$OBw<TWIln-}Gk>5=YKLP7OP- zDCXlwe@+@+tVW6(`x(+9NS{-z;iqU=$J=%ZuRjypdkmvH5Y+J<Mt3@F^oOwV^O(^e zQ2NW5c9$siBLuGuNT`ZT6OrRHic=DqX~Zlf3NCM?FyE}G2x6c=gMcd`6L4N`!5()o zKAxCI?%6m@L3~*96TgfwG&$rk(cdo>gNk_I9`(Q@;?V=lLl3N<_Y+qaALlD5cUO$3 zd#L+eyvKQZlzXR;(hb9n>u5S2jPk&a)Mn{<2vJu~Xk=kV8>o|A<&d_0+AW+NQp}Dv z478W)>e)~Zsua>x62_!KsfB)dWpQT%w?kFd*(~U6D(`IKH_F&8a(-)_ph;F*Tgg&Z zu~o8S_#&9Hnx%s80>WyFBm%08pDh(;)`{uO(h_<S2IF;&8utW20&d0m-3oE}5$Acu z@6u7<pB)H+t}HSd@As3sJPC?!TFSyZWyp-4$<6Rm35f5;mD3ZV*RSf{%&T6{sXxBy zdH1RvnowsaBoONQ<IV8z?}p~)+kgLc;J<$ly`52vYgseB%)ZW|;vzi1B)KdrNRW-? zWyTe!#^fTw3?u=?CP$P|aQR4JM#Q7sxF`9<5N<}4f}5t~rz?2m4h6tRI6KUHHzArG zDurUhcT=+8pViIumhsX&wc^B&GpaXZ)eFPISuOj+pg_ZmnCr-!X{EmE%%9iLM{5XE zO_Z_b-0_y|=N-(MPS)Fj(%EiymjJIVC-qe#)V5MeUu8mP1zA=Y|7KeEX}bC2bQ6qh zt<h>}f(`<6C?KWhZd~sTY|qbOx{KlcKSuUCp(mXEdoJHEKX*PTGljt`F3V*K6A)Gu zik28nPmD^V;G(FpQ8X+n(f@8*pc^5;H#3&NB4^|#r<G9i1^H|NgO#6{=;nAHxqbG; z@g3$T?d^X&`dy^oqhxeIn5RozfEV7+FU~t4%-uC9Ffb`ND9YzSu$!yT^=miJo(j0* zg7xuoJ^#b)A5Qz<bSB+9Rg&QSW?a7TtY)||yGwxU;zsmUAR1=ypp-DGB)`$JUh4(@ zQdoFHT$on=`(00SHAN#!m$1U+2#3^Cncc|GY_7;|;!|Pfr$)xqt9Y;^v#+_lx0$bP zD(P=2*Q?4}rG@RXq6RUmsivq!QCu%&)r%npmMgEK)e3WK$}`J3sjYQfVSZA?LuW#u zdtq_}Jt>?X7nqLmN<e#%0`CXjIztX}OG4j`^}bNYiD@W{>k=W@&Z?MBG0vbM@hP6e zu<%Zk^XrWCSs(YQj`L<*1_h#Tei6*iO5Xj__I9BkVi}+Q9RKj9?ZtT2+o{T@9n?3^ zq{x$t944O6%@i{6G8W8_$BFY}#09Z(RvafSM8qKSsWIi*F{K$%#i?PrgdipfT}da@ zmu13<ND9ykhJul1vY{b$pfTygFy~oYUZ034%Xy+H$M;IfdR~->bWcGG&{xE3xpA$m z=%&Jm*3wvgC2>?vnQo@{R+Gk>vnJYdpQ^Jb+HzjBP!+k4%M;z@)F%R>XJwLKZFXc? za$vJGM^=@uY7l7Kss=m6{jGd`Giw~ta`n}WHqazOMm4`MpFz*d&Q8b2X5qpL@DW*o z50iXuV*_pn-E~3TaSgoc6z%4O_<CX7?+4y=4|aKoa>GP;1x5P!#P|m!1P3JsV=}RL zVmO8p8=D!Au(L9%*qkCdog9Zy2}n^|5+xdqedLjc;Ig736H&n#SR^U~8<iS?Nyebl zu#xH5C`wE;AviF`&nG1!EDMQAxqrT%fqWR1PiZ;2W(I6sYRP@rL37s@qPohWpS9D+ zTXJ;Ogg!B0Ku#KM$$d8}>QkimDaa}=M!|`L6%^HsXpJbNr82#qm)u@OZLQ4gRWQ0F zdC)(huAw5$a$0L0vrARlURT;&%V=wWC>Kj1W+|%JvT~NPGEc^hQ}7bCqCCXYIThu_ zNyDawJ|v?b@@a(JXz#QLPY#nnNem3R^+Q_ljYQN{)XkIH2EnTth?|Q+P(9U^y`Pkh zw`JFJf|NXLdo@vAg>MnXwN;b*8goXGPUh5L<<z9&&%Z}LEEpzXl&-$*f8LM185Q*^ z2t%qOT<}!}BcfW6Dx$|UaN-)uW2FTsNg*OHikB4N72I^VEK7<=<+*XP;uKLnzKj~l z%?uOLu{>&I6(bsWN!OS*)JX2EjnXR-#KWPxHW9+IBRcMYjz6J6N?+=Pb6vvz>Rfqt zn3@wQqIgtMyqnqBkvi(IlBzDpkJM!k)MWHjrGV*Vq&@`&#)}Wv(}$I;p;|_tB)g7@ z<0S|4GqL)*;;9bdq`GoQ$!q3hauYFBLM$QlNnC($$Q{>!i%tR8Zu>a9-Z_88?W~jA z`AhyTuE>MS*Swsr-aGH)_Ty#OAI{%CbJ6+OnM;QbpSRz4?dVaL@4vfy_SF6JjzO+& z5s$o{xVxi#g96?Cae-(?5}Af1WJIB;SWGG=m=Y06i;v7rz*4a2WK;lHVvv7guzynU z<D?*;6cjuxo}@5;Vz4&}<BxyhN%g<lgcK4!J#Coo<h>k|_t%nD)O&pl4?}UNmWLfu zW_C-HI;x4VMs7es(bZCBdwB{jwpke8Tc5GGlB)?UZ@8I0*h24CWRAA7pX(}yn^?WI zxq2n76*|4-6fI0Lsw+?nsV&mXP9<GkLvIu_ngv;{k`kaYnE)YisDWkV&<vDkZaj*N zdJyY%ogCtUa=VDV_fuNL13ou}nTw0?xD@Mk9)16Gz?HMXSASd>YkoVc`t8rrKmHh) z9#_my)_;Od)fwfdSE|3?s6W1}pBv_P)sWgn#7;?EOGzXXe_5L2DbMsy^4J^WY(@2Q zAm6d`Jz+@>xQYll2@+naC>y6>;2QXNIV(cOimhegtLZpJNm3OH+bAS8R3xh^Q<Pka zFc&YN;rLW+QAQ{)HBdl&s4qd(><Bd%)y9juY`c1}f&cq+&CHNwa!5EkCZ8LXP3r`+ zJrx60v;jGFUSB%f$?mVq98u>@>)7)Az*mTlGY8gPY*0|9)Qk~j&agZOmb~jlxmrHC zy@b#sq_mZ1&2&m<bP7RkLVDDbXs`PLS8v_=?x!=m>`vJ1JZWoxz<l?96B~Oo>w}io z2P`c2m~Gj$#qz-R-N$wwIke5%VcU*F+rQmqW_ieJ$G**$d(F1(HM2UjeeWJ~E8C5T zslBDeG22}Swr;hzv^s3J|K#2SSH3^te(^l&-d&vUU7Wu=5#^s66`C1~$%+Xhhdm(% zJt72nk<bAt=zug#Abcw=8l4oj_>d8aPLBvBql3~gs7&9Bno`oAQ>}9b`MaTNtpI6f zK33B`hj_t#6*1Zhd|PRxh98Y|lty%x<AxfkeYNDl#*DT~M6XCOG*b=Dv_2K}X%}lo z&zbJwPUv{rhWx(vBIqZa=w#0tc+g@4J8wFq<es`Loh(x;qiDqGU6LF*mn`Q|WTh#* zT(l%Fdc2{uJS~O_r57O{0as5)xLrcsaSXbCCNtWXMnY2{--PjWBKW(Y?q7C2{hiy{ z0|RXmLo0u%Px@j)HKrH6o>0v637+ejqis3k?fK8Nuskz+?s?;1|6cg}@8=71ZU6o6 z)c^eV*}p!G|L4=wfB!c0?nU$O^UeBt4lgA{T8NVrM9K<qb%j__0lF+RK*Eer7RSq& zIAs}L#zvH&KkG^pz-rh;UM8k^(Om*#6W9sv)szRR-Y2sj9V^3}XQ3{i+Pqd>Mg3)@ zW^S}{VM;VVu6PZl`s4ChgAm#o|Nd=g0cs?k%ik<?&ciOW{)*S5H81-r<_ARMZS2X; zk`ee5Rc5pa61uC?4Dx(f653Lp&;tW}+pFjTDlzExt=s1=-Tl$|>~4pn+pG_mnb~jI zalpcQpQ+`36RW)@J8d^u*qK@GHMiblZnJ;Oj@>2}cBb&sZuh1gJJxNnF|ydPe(SDH z)_cuu>@9ZMTYPJ6v}LD>#df2OJ50=MO)PesS{&SFdDznG*p3~icG)>P9DQ`j@v-w| zG;;f9*d3RU+czWJUGcsT@ZR@{fxc;BLHT$rB|L-#{1xaE@8_8m=$jHAn1l`pf9M(? z<V}0xq!Us;j5d6jXr9&brknFL{3vDCqo*=LHwV=xCJt67jnt&HvBP^rgueRJsm}cF znk0=l{$($FT3bBOoI9=OKtI)seuO*L$$r)+oHA6t9F;)@`>=*HtbtWs1!JAe5lwz~ zeY&nXO<PUrt1oDi&@>8Wvp8SC#5D@3au#u-kuRY}Ck5P%xOWlb>KN;FE!^#=0GBgq zQQk#qF}&QQv<UAouS;PMoUS?Si*Ua++*t$7WxZPQ%xL2;lTE`NCCKYh$;$!WR1bT! zqi}Yx>fLzV^sszx-tgh|;KFR*(_Y1NU(Ix%WKz$c?iWCDs;)6bL=O|uBGmk}8g^VY zBdWeMuC_R;B;6M<)htL*a*<kAT$2FC6J~+qR}|ruoD@-RR24nCwumUsi{a7y<|dl{ z`m68XzYatEt!$>JOu>zx?XP@ksGJ)R{xU3jHCR2<2i1vH&wGUvon=$~qN!oY%&6?c zLi^klEdG>Fbn@m5l9vX_FT?WrA=#T@$+VU~-BsQ#%hd?8HI>YEAvY&B^3nNA2aUIX zXTIyq?)}HC?Hnw3I9OUAG`BinW_ft)jsu&w?KeX#_nB?AH?y=i-v;DmZvhV$yUi?Y zjknqwZ?QAk3bu2-`L`S3!4l5T57ukV;K9boe8;-Y)@wKIHZ?!Eb?XUR+haC1N38*0 zdu|>%bnnbb*R!V|Ty*rkdfDgV`M|4=Nl&~z&z*2TeH7#BjCQ>q=IV@l<ch?2xf1;! zkpeu@QQq<1u4yRmyZ|SCMb>X)>i1(U)BTdRN|Kz7=@lonu+TbQq`Ejl%Zprul_+6Y zk*2RBkG9bImFb3h%6va})=>Jqw*;W`YDDn7k2j^~PwIuE-MpDW@w2|Fxe>|Bk&3Y{ zR(~^1t4M9DCTfw&q&7ifZ*5MCAXUjv1z3rT<Eo2^?G;pcK2ekv>2h?Z@8x6YJLj<v zoWfi$_+39qMFMgY&;Twf5{UJ6M!Wy~v%PgTKB`+S>DN{ckG2jPRL`e6rbbnx2KnqX z)X>b&&uX7d$evG0e_v33e5IV~q#GI{MpT%IHYCzek1|M5<BGT*e$<QR>}Q6W5=vkr zkI+(1t}7-8bI?j~af0O5N>WP&v4M+Mu<*JX=*4Dqi8C8Y2pUm#H6uoljZv@(wOnd> zl6T<uJ0gDGOY}Z2$_#unTsc2p4iy_8o;AD~Z+bn_`ulS=477POs$3XZ>^DMQkJr8& zteEXDfpYuT6EIb&>D_26beD~^mW{OWht%9gQKp!kRLi5)^632BRCy8W`teiWu32ku zw%K8;&Ef5KC->|<X}kC6c3TGv>%->T_k*KbBrc1+Cg$H7Z?fB9W^263#@KY*H|wm| zt+z8V+q21P&n8PSI}`Jr$a*uojTScR&A_bJnS$9Enc10G>|DQj>#FsZtBh^dnb?__ z9I)8xU}*)|g!6|TmY4S0UEaUj?ewv`XHMQbeJt?WPgsxJVYjZJT$}=(FQRT;4!#8t zbB=U(!Fzk8_*|!<+(|ypsgGS4k#~j~*zc#i=BGMd_Sfnv5K2Qqq=pj<NeB%a-BJ?W z#*Lg*({(~(8xMKfo<FDO8tO9#8nQs!KZSnIPVQhkcV<xfVzBbnXw9@i46R+$29ZI{ z8P%3f50;Jhutz!|*__`gCU#fGD+|Nxm{HZa7%3x0<)z(PAbJu4w`Wo=$q~<#Y@Q zxOx)ha_%#@0&kzi`Mb~)F~WjW62>dq>uT8D3r}vGsxC<CkTdlS1?q;9HWjz0y+Whn zj`T{q+W4K#6)+g^)7#$papl`*%`@Yw@vf3TAvo1rKHtxuGYFsQ*f0C|Gu<Unn9wSt z33AbDL1F`!AY)=A1;O<Qxc}+|jhNITz^iz14JGlNlFXi(Y>g<jt%B52o>tAkmQzDz z%-Du9qBJ99LPng?pk-+R9DL|lTggZ#bGok#hDAV{;FnSHhp8Iq1c93B`QgeJgQdR= z3ttb2KaSVEooM{D(4m&oq@^St6<eB#6eh(Lr;r5M2wBR^6y_$ii3&Ot1q>2?+e)LO zTX*i*uwlohO<RqOE!P;?7?~Wh+;PI%?wGl?gSpkooqGUZ_M5hTXZ`Jd^KAeqJJUs= z*%%qy8k_6^+?iT@yWZ5+$aL2RGaF-*oyHq&)|-550zY74z0TNbt<lz1Yb;l-wfx#> z+sd_w<;qpt*R0*Se#2g~E%2W?V7cw29mu*Jj`sVUk2>5vc_i4`(e2ccM~-J6Ii7xU z<;P&>3sJ5Y6Fe>x?p}y<y+HQ9L=C(_3Ao0>dI|{MPn&ojXY}u08fJRMJ>?`dJ6czc zHwX}YS#*yywM`JOlcf$TGW%p{y>%I#;$$r%B~P?7bv0=nby?2`MgRGzfAv&3J1U*f zL&>jlP{V<?_4zTy+_=o3Wj-4$18@yB!S2+!VuFh}%SWDzQWZwm<wZ3X#_Po7dJZ@n z5-%${1>+id?-J&&BRIy;+dl^1I2&~5T$smYN=$&HIEzVGwh=zNlfL%cd`nVK4U zT`94lhSk+t*4HKK>k{i)g?(BXM01<uc~b`HkdS<QKl9)J`7b&ANt=+`%*AR2QLV-3 z_OfuD5T~z<(F-HWsJ==zu3ea_;6mgf3OF0u_|>2@EAc9RR0B7vhKXtBCv{Y%HFEKC zW@H05QBr_Ks_5aeLY#~lU6q6RFjUqjkM#d}Ushzmt07U3GNVz5^fzTgU(u{VFbnM; zlade9viXsU7lzXLen7ZrN+(ouQ&}mv90Ze%^=FeI%n{E?Ln`ygGIqL>M^g#t4g5T9 z4g1d7vj?}>d~33Cuf?{V7F)J$G~Kq^csH`q9GL6aHru0SR^StlTiXG10ltpg?Ao?! zo%!-r7GJNiSh2=z>GEygtln#8Zf|P7%Xp*RdXt@N)^A@6*fib&xZAK1sBNb);A_44 z%2gY`Tw?m=a?>xCnSQavbji}q%T`#dTn*^6H8I{}YT{sKa%Q{5RR{Z<NB4Q0MUJ|D z@8Evs_@fIaeH_0JzIqPh`Xk=$e8Sxy7!mHwXb)D5XI_L`IVn&?e*9)o^$BKUO!dw5 zO1eeKEyXxJpD+LuJUEMUJQR%JjtauCiUtrHY@q4oaAQpWFeUwCz5$YO<2?fCe;Dd0 zg)uJk6N-grb&x!n84w{0@Or#<sH*_dD}7BgP-m?Iq@Il)SHaafi%<5c$_On_^5^0` zg=F7Sa$s)M{RCg<D38mbt{1}HFNL}Ngud$-?*7x08>f>Zz0x9li6~F({Y#IXj%MP# z>bRt4Aw?z1Qp=gG%3_VGq(>v@=~$eP+uq0#u;b-OISDobf1Gdq^rlP9iK#9K(h8Cx zEZmgi-b8<>=Y@0?Kh|@f$crLWe0(DxU(3O%$`j?R@Va75Q+YI;V!FSKiRu)kHI@>9 zvRca%rTLh8xK+}z5=K-_VGKkn$|&9-I4P0m_kXi8747?eUj2Sj{JfV74g7)^{k*Xb z=42OZO2;1WVovB-Q(Z-~eZ28D7CYISMGDW4Luk0T%qVo6_r0_TzsB-xy@K5-%dIUT zDL9!Gxg;(bIbsRwXv_AsraLy7TbOJx`DUf@%B7ZTO%84am$>by+17&=+YejXfHSl+ zHrr*gdC@T%o7r!+MD}j7fUoW`G2gp!3!EU$4wzfn8JTWhy&eE)y#`3l6nJg7DY#J+ zfYRn=%gvXs+_GY&`SKN}OTIGsVhOyo`exluW8<AhYY&>4>@`}o*Lc;Xz1COlci#T) zz<IlE9zUM&zIZaw=@k0L*;v;L6kq53u)8I3e%yHfA|%#Jm=-c1%b3zhKLWUBM&3Tx zJkt~@nHU{6#=yaK7lpTR<9aI-`>T@rD~RKD)NXldrx0Jq4r>?1>ubpnYUrt>!s6zq z9c+UtPc2IBt<M{4D}CC{9n)|}+hG4LZL}qCO2c~5&4I}=Y978<LT%$Ea+4m2Gm$_c z*}s|+%tjuRrJ`sN?s%UoXty8G_s<94{W0L?k7##ito!AV+vmx|Kqd`I#dw6@Jc+sS zT~4%nyEs!NO>3!1)7R%3)FnC?A+IjeYJ@`_a&0}gq5vmkL=5)||9IK_YDm)8%)jZd zQ&*m)FDEGTd}TCm=$>yW3PLnolrZ~|q9{aF7S$$-lNV#;MJQQ8U=tr#UmB_8hRNAs zE#*m|>gzbM&3u9&D^SHt0#(0=EEcY{GL4&s{`<G*ub=m`NTKN4C;ynyP4<WkD(2jP z7=--7u<Vx+;p?%gSHr^JW}pW|41df>;G?L3+hO;vh9Y;b1>d=T_uT2r-|dr?(9{x^ zN|@6r=POES5>`qLn?ww_dcxM~^nQl}w$}SBwpguOZN0&GyUAudQ`7wxmix`E9Jbg1 zTz0MB1n0NwHtzUl{mwNTtXCQBHa4?aYizyR2*9y><7Rtv%iX41_HWsCz+(G;bIa{( zj4W2H+PoB5X|ZzEXEXh389)hO^%-A)wM}0w-}uF{O-oiDG&SC5y!MpM_Oo`j2h27e z+iG^g!u038c24&8m-g+w?r^~E*a7b!4x=s}54mv2`-Cmw`Z<!TW3uZH6feh@oxB-C z{regHtC`{X33az5Rlz`avLiIPD1C7hGSQIxqM2@}A`MlNhNS5*_hq`fsJ|hzO+;uH z6FVx>2Ws=XtFroJxhhVQUP^(r^gXhq&Wc!dNkmIgSQ|S`m5=TfCUus@sW}mHdbpGp z#vweYAp2IN`O2sv!W4fF-jj)VrH8mA1YE;Byb%7-5wI2NekI)F7J@vu5#{MjA_U}R zMJEM$_@8&c-Z-5Rbi08^t}Rb)l~du4KGa?^)Fpsjnz|0LuC2PWv9yv6%M^W@>nQJM zAWxM?PYu3#{wOudwJPm_D$o0QQ`WGAI9P=@R3bpkawfX1BB5JKuIEM6bI|gFAlQdq z3u04%l`#<%WSJUD;_5j#c|mwhL70+FXy6cGJGLknQ(uz6refazHt}*!_i<q~Ez;w! z_hTOyx<9??hwhBu=6l|~=zKS){p;=EpKpf#emDA`f4z{DWI68Min@OB-VZ<CK6&EW z(eF;%?D@&zkch!(EH6=Ta>^Lw#;Rg*ajvkCrm8MS)N=kno4i9(USC#0kH=p)uy2R4 z>5g@#-<q1+Y%;UiYz8>`Y@p}i;WO53RvX){GX{KFu3BxrVx{TQ6`Pi>+`4M5&H9ZX zrM9g28X&dpn>C;D1p3Ni<=30OS_%gAWwCN4oZuKuzW8c0vUH`r(dyl6zd3DVa~f`t z)>db1teg()y|{PRaf^+PyKH{iwcYi*-7$Bs5bj-xzvCEl<8<nS3uUn$B{6q+_}deW zoVVj0Fvt_eUcaAcRx%@6xyZ0MrH>P>Wrt}i2>MDwM_If^K<uhY=@29v<g{LCCY*iJ ztm(F*J{gjsuTC3MWcOC5>Z%eof>^DH&?$htM-t><Arsroi!mrNda6mSWzo$g*jh%Y zA`dOe3gspF)?|ZY^b%40If>qMoJT6=ZW6{F@xKuQj?v><l;^Dw*GtjfF2u-3^dvMc z;6{LxL&VLaSz#_Zd3JAo?v#$-*UEwV2jQSjZ0ME@=%72SOd~H;@KQ3O@A2u8^HW_4 zd750DIjSw6)|ML-nIjG9V@;{;f{2caa5WFbqj+{n65D`=73s>7s9IL2q7YTjiD)bi zuV;rYs<g^9IUOU*MGI1WL>Z4E?gfsqGA9hM1qzH!L;r?+diM5B?}v}$<HIfQe;xem z*O~cw!@GB*zy3PDurN3~-~0SU&#PC1^Dl>g|1js{;&jQu{`!fNR}UY&uxIc0);1@1 z>^Ql@GC4R{mQTZb-Q>|}0v1DB$!l+`*Y-3wwJG%m?bAtvO3sq7lbZN+b}IRt{kOX| zZ?ZPqX0p!QdJSR>F3x(bG59*r<expB<=1Psul&Yx#VRv^$<k%E>rHnWZG<1QS!-gw z)(E5+;K*z#kQL}EK-p?AtJQ13K0jNoTDkS>m1awqf_vP${41N)D-Uhibi&%|pqc40 z3$t@JR&Y9)tasdPyJzhR<goGAj&_@aolZpFI30HNX!^tR+~|7@lyh##mGK77ho|~q zpZCta(Ed8BZebzP%z#Elh_)zds48JXNg0%-sY{|Y!j!>!=5q~arjt9`$e3th&1kp~ zXCAE00Mkpz-J&F&C`nTu-y<gV%hJXha)*`K5U<cwCutE`O0ObaS3~ZsjH_qCuPTI> z^ss^)SV<17Nbyn^<EwHbx#WP1h`X6F593j{qaHaUer}N-H&AX@5<|SGNJwh5cc{k& z)a_GP*JFZAw3?sTSDQ22Cmh%FMtfiir1I5-db(dZtgh^m6=q;PQ^W7FNg*FUJe`_p z8P*{c)B1{v^pG|VZdjQ(EKkr@M(IRYeI-_$<JVk{bjzSc2VcuZDT^@;EOZ?sP(t;t z%Jizu3vT7$>+-{DazZN8{oro_M8Xusak9b~QC_&LAexyO`u26-F94<wqaS|Nzgc)X z`*L7nN;~^%XnMMD{^jV*YyJE?1M>Fu;QX|quAF(w*6hSiTgL<Tr+4f)v3=`-EvAQe zSRJ+4e93;d`<Y`9If@JPBcek~=`;zSt<yF4>Xf?H+GZK2Syb2|pf_<cTSY8pGVX}A z#XgJerYlV>SFW{MZ3MUhv9&0oj5flZ5a`Qpz1iLk=HMqS;U0*r0{Fmn@PAJL6hLgp zVw_@=)#|lY->lmH%}P5E_G<u}Ut6zTZMAl_wb5EQEmp0xT(QLJo8^bML7Z&;E>ojp z=9@3>w!M4^{s%0a4<9&hyJPq26;20i5Ra?Tcg|w(p3HpY$U@&{qHg8}U7Jvre3&x) zK8F~l#vA$?^4r;QjRhDr3!^KI83N`J5wzv_c0qiPjMCpg>#j+G@{r*M%7mIW)s{Qb zK<kAYq%2KWO#*y@byOq_Dl!NDxmoIK(ni$uiB1NXzAjBIj8k)QYEF!j5#GeYHkTwc zv*X3o$8G$?nnD~R&5tf1_)=qilfv90ysn3Px`aJ&LAg681bZ_`SYR#&Ih2(YLh$^d zO+b;*F~!MVV{Obnh~Rd!r+fHXISmR`@d3_=uM^JuB0cUQ9q;>YuCL!90cPt~&>?!I z;o~}sL$sXGK{3)_8PmlH<&xc7EAU+sk{S^pGG>s98!gXANobFyxdGKQe|bK-zA#2Y zLqP<qEXAih)lb1jK+J<zTy%^%XaPO))7ya$zYM>h8=D?z=xgB*>1Ye%6*KL5gM4fU z#pCzi#%G^v7iJ8f=BE{fS>KtiK4xWpZny1;?c0uRvp8UGe!z0aQ9HZC)`<0C3yZ4< z58gO)0&1WVQ2{(Esgg?Kr^hyO@&=XV9pXHVl-9r}$qEvxbBSkd&Gv8JxX0WY5CcE~ zUkAb*%+3U&4S*~Yn>EIE>rA$P4P3Nn@M8d}tzUlwCwN8p%0HB~2EMXw71-CvqC;G< za{FrdxHa3>t+rhI4H!IZTfKDa*GmprZaTcpZ1+YZd*ijowrsk7^x*XqM?D<RKm6&! z)x-N8?JUA?{21!=U9$JjG+!q+#+4C#oe_Ftw7vY#4=;Xy(c4r?l0X2FiV{<N8|kR# zLR3d-WCt&*S47lTB=iZ114uQgSCV9?P8pP>_5x1{2zq%Mm{yVkiB?FJ_1040<zNH# zX&dud2Xmw)?`aozsD(A4Vh%PI=xcM-qNHYFl8hBq!;V&R5K%Ttkm*xO@q^zNpAt;N zd1YdK;{sgJ51fPCZ-n{X!#s4w1$fd35n1@)>?A0GNeCuBJYSO^S4H+}WCW;-gS8@D zb4i4{9I0l6remBa5pFc>gQy2TCI>nv1>fv$;Lc2_3_UWnEVr*AtGy(&kAqfbcy^bd z+u0%gf@lH7Q&UBR<fB@E)UiVwI8ikWjFgV5&IuM~K9<qZk{nD0B~VO5!-;T{ePj%5 zbzX#s76u^*5f#lq?g?@+e}9B|s8DR1@L{yEyC&{!U-rNBSrZl55h+bAD_)q=^fs5W zsgX{{4xO;HI$~pWcK`m9b~Z-=T${}uw%HunYQ1OE=7Uz&SI_=%dbizaJKH$F2NaAS z2)?qkNGTm+L3uh!p$3uVb;|M;Oj1*EW`dW?F$;6+^%g)lV0$)h+PQ8$h^OtV*M18? z+hA(5Zmpe>vH4fv0GDlCvUJnZ<r}|R3Lf$wEwyChmtVnyB|z-!Z@_bcd;EXs1A+gw z)$$eAE5F_j4=YxJzumD8u8YR@X2|A4TTCzPwmrPb__Wm)_u~g2oIH5<yFFfKkGMGO zd~)Gv$i>6BTPM>z9JBqL@&d0gLY-&2CI9;E)tIift|+#p5Ub1zuE`E+F2De+{)q*} z^@<YoVtgNLrLQ7%RY7DA_UFVlSKxb<lz|3nzcLf>)K{0$tIW{XQIKJE?o=mhy1Qh& zJr7cf!<rIcLtvF2MUGYql%CoqO0DO{byTG)II&_nMnn%Nrv>sTfz|XVdYmsM$`9(b zqW$ioyxnk^$M|61DBlOTK+ohTKT@o3dZZWD_2iI(-OR?R3PZrLjjJgAQj)4PrbQ56 zPW7iDab8vQ*j&V$hI^D8d|k#S$%Pry6P-$FZfgb7$qLZ3QLTVVR$yBRN>hqvC*EnV zgrGZ7!U(Ekp#WSmMua#I4W}?WP(%x<$U^bb0{N7nf6l-fdX$)k5oUz&Q=jls0@<;y zQ1-kqEt?q>3TfUiR7l=jQ^KSot(i}8blC0V^fMLfm4o>CI-j|8c+ZcAc71PUeZ<=A z?5<r$thYIAHQR4)YHzXm+YLs0Oid4Nu{dT8h_i7!ci#QNX^f{cHOj9f6(h<{YUE^g zO6WRyu2x1<@zNTLlf;zpLz}*_-e_jK-pFo)@!n0Q-x{yCF<OV%7_Hr9vf<nHMpmm= z+OA!*<*Vfo$FkeF$!7hAt*chU3G4>`5NHcddkYJQbph+y0@E281D!1@{1q!VuUKxj ze7Wher5l$nG5X>wfaI1H%lDcX?=@O|z|`oZmH7o*s~dZ4?jPUldHR6caeLo$N4!t& z4ZC<0huk=s?Q=ED=W-$XCIfwSVYKb94^x_2b`u+Epod8^0@^vTU3@|(KU&9+8599$ z#rMmI!y<xSNYE-MZIYyB5urm)HmGw3RkZ#FDqJ8T?$xgV)=D34&YA2goa*L4GJCwE zXjsi2({M)G*u4$;{VGO>n4*;;kfQ^ILsAKnlpLIp2Gx1N+)RHiDS(diq2YrFL9S6g zw=q6$Nmvvi#3wGuixl;Qf=5&0g9}p7)X;mg8qqLp`eg+6L6lb(Kdi`TD2{5cBuWdz zX^0Oo_(qKP<;vVRYNUsplTcAikcx8+x++js8g}3SKLY6!L^TyWX=MjD75Q@#?x=<M zW*!b=4vnReb?hj40l)_(V}=Q-fg);%BsW5w8(x`>7G#ESNPc2QR0S1PK?yD)`V=So zaw2c48IK{?x-ceK7^ryJ%y@X^n8k{(&K=(4d+vCFw_9aSgvYr9*N+@=ayWhRTg&4% zR!0#l%M&}S4p^8vm~T3`W%D5`OJJV8re=^Tc7X80CUb`^=C@8Aqo4!GA#Nq9;D1wV z+2nR{UT-~HQ%%)~Gh0gHVP=WTseOCQO>B*fcWv0XZ_{SrE<o95vtF~>YSl_OAub9& z5ZoqsKTz@iJRtw;89{7WuQoPc2EKANd>aT31iaab<;F{w87*77cIj7ZmMmGlWXaku zzcg98)N0i#`wbg*uUU22%;dy2GsivKZym6^>#)c5&~DE&hi=$g`JFo$dilHHpY{`7 z9T_3FS>d;{122C1Wq8aWla~-$S@B9nh$25kD~v}v1#umMgucq8fy#s-al%kd>YyU6 zuQt6~MuC;{-8HoSM&@7(dq7oaXkhj!8S2V3og%A8NrT|lgcf=x#AEH8kyiFtJ1`h$ zsHsq|$Q^8AYO2!pwU9+2*RgTUd}4JDN}L^B11>Qmlu3S)PYTS4^dvmK5sUZ(xNZ|; zp2UZE;hwk?&|X>bsFdg+IuVl|c<1$?Y_2_jT%Pn)PU$SesY}D9+5Q?(RK@rb!lOKl zH}=*wlD9k2`zj;;epwERo`UXF@fvvenq04bQKX)a)|W;#Wd{%QllaK}#v-JF1x^*C z;KhmyBdQ9}RWJslijLxE1_-i(DzZYV7SR+~lH|=L`Bvp)gxM%*E~Y&7u^_=a&Eu3J z)Bk;M^^8^kbLr=vxAwQmAvgX^FLc^#66fKJ^Y^@Tc;Cgtd(R%Q-DhEX%*NVb^VTEg z7Dpg;XJ&qIllcMjMaKsCSOnJQEw<(sd$(F4@FLRvZb@25QKElseo{kWlD;};K*4CQ z1eB$8i_+foNaMZloVMN$@7Zl)3ZDY-+`Z8R_zTXRM(b>i)&i-)W$&LL{i5muYFfn8 zTBFYn5I_g<Qh2sp1=q!I{s~GfGheYB{O4w5$uhGqmTvmuE3+?`8h^Qb^YWDz%a`sl zT5Yp(*%9;g=f1UY++*o%zw_n++uMhC-#)g-{rK*HpT7%sKJM>y5Owiv@`LlGxI3H( zmrt+9S{01y!sz-uY$Gd7&5iC5#C0utin#8|#13Afu7aW!kvpa2?z*gg;Gc#(-Qu)0 zgr=|0>2G2TwX()KIKyp4qn$j1x(G(hj(0*2bS1ErLB$wsW(~Kp2b!5Z%3Lr2RBJ^t z+~CEzXkNO%fZ|`8?9EN`D<_2%5Fh8p`{qVIOhLI4gWUY@T#O2Ei}JsV_PT+2bb}E3 zfEemW3h^dCzBSrWJk&{r_ycWJ&+Sk^9epyF5|H%d8p+=|G2A)Y@A_eDbKpK=h)at& zRV~jHz@qe;yyj|>DD(bsWz?`NVOW~{v<3=9V@j}h8j7&>g;+T|s;(rejvZSM{V3GP z%3KUTD?~s=SLR^K(*ybGPb#S>9{Djd$%~gBP)2@Sj3juK;vQ5`9(O58PkZ@uLp2;4 zs!KxEWMlb6kJ?<+rR~O7_8z|V{a(09{k-4i+}<4y))vQYb{;mjJOcQ#usUqE_0VPu z$VLPC0KNcEa9RK+pj^gmYnbb8Zd!<ng(#@lj*{daL5j9KvArCxslX3Z6X)9yR!*4P z$*o54HUJmc;-{DxgG=0PYGP|_WM^!&ef2jRzW5Tr^$&0saRdbQPg3W91E=5{0a=!- zzP4JuYU`@6%~wF6Yl+z+gDu~*WSQxgOE-S;mC2IDu&UWtOSZ09V)50Nd)6;MVP$k| z%Ua~}j;)RsrnmRoUfXST>+nwR^9LU}9&kUm)8o7SBrnIJ$Q#0V&-wAL_8OK}miM%= zP)UzyX2qyj*tSxFx}4YxE9T|doi$nQk}REq)}zePD(U*hg1+X$esvLy;-1zo=Ez?3 zLzRmZa*4A8qM2Ual(y)Ffj`|_@&YkH(Y<J_t8}o9-Pg?QsLgIHjc+W)%NXGjdRR3B zgbi8-s*4)V0WqK8%SsE&i4P=&xf6r$M|$4E2Y4c(Uf2Nln8)`BD9<GH!>Iet9ef%T z1HS0v%s&&)j7Z;&ONLvRHEdjGb%vaclx9Z82VKYdIN^M+<q{BYLWoNy0<7m*$Hjxg ze%eAAsl$(p(W4@44;Nca@=AXEa}^^-oD1N>%Qy*Q7D2)yh#9fMyqL1A2mv)hT7U?s zn6eC1MK-1+HL!r_Q<UgelJuC9;LAX}RYKKQjz>Qa`@AkA<<0>OE3q~erDjI42oJ8> zn<E$Z?l@~}1;L=RwmVMm+Ua1i>8Q08To4bMo9{C--?woSNTuDIHhgw#KtVu0JB_~C zX=GxxYR#z~7HNU^YBEA=(n7R+qCrfCB#D+Eqpv__K!cPe#JitAYi$DW0!V^Ov{`Ee zzyitw?gCWV7_GKMR<1Ppa>=5e|MDvU2!IRNYU7fx-~@;P&;VSYBU=D5h&*grxzzN_ zFF>VjUb-BRW%`fihr0kMe6yur*{)x=+jxV6+1g_kYtL*qJ-uzCqs<oAWBXi=?YVbi zkI%V-K4<raUOgOq{&14V#eDQFPAuX!-XhdV7&S~pS&Y<Vg{T-&O@(m(iif%zjX1SQ zkl0#9*2<{eHJPBwVT0jt2M=sQUj-Ehv%}KKUg66T85CMR9~3_y5KZaJp7-&`wI%c8 zvf0t<$zA~v+OUQT@Y2Ys&HO~*uDYU_x*}|Ac``gB$`ZVSlh7{B&mjerF=80W!Rawx z@qw-}KCZ+k-U!+&GSnk72;!>u5>ejxM>lnn{J9bF+;Hh=XMS&EzClHM+R5&erpb$< ztMkK((?ScAf{T&^iGf%6+2J9#PUgcc0DTvV7n=Ea6&J6}@{<vr4SAk=Mu<4hoqz;7 zajBRp7M@29E6GF)a-&2{q?(1VEhC9p_)2<=n2xK=j;zXw7Gz@h6f`r*hk<{{L>^K@ zZ{-Bv)(BI_A<81ev@run{^xY6+@6LQohr7zEaLR;EyvB*AF(hyZUsKj3_@B*w`@9T zYjbd`<vxh2o0tF;_Lw3Y4_a)oH(PX$Ae-RfFoYL?%Ql#t-?h{IkS!<j79eXH_BYBY zhU!GU5I-Oyj8`WaDiTAk9yw#XY41P8XTKRzh$axO0yz)#1!8O4N?@BWO#xd=7O#uI zMSv=R8e9<pTc6J@%U2-~jo-RzIRs20{s7OPQ;LvPg!lZDZ3Nm{X0Z~u4??bAS*}@a zzj4heE8{aeOu;VfvUEDI^Qwcb+o^rt=N){{*<+lJdY-Vw-9An9bYw)ibym^)<jh(o zt|lKNBKs?IF)c-L%^bX@3feO9>Pk`@B2MkC%j=Y+_caz6T47NHWFtzZ4H8&2GCxrV z)6{>NP`;k3e=$@&)+2Z^BA*zPOpnTEp4Pq`ubu9zn$QWJb}!ZpcGu^rD@bZVl7bxr zj&U&&T#>Bg5jrH<-O3_bqCbm*&P05(;{37R*YN@FvA%AxD9`8+!~+-Xf$_Wnb+*uB zrm4*O1?B^e3VT(V(>-OQ8iuwuqmCO}l@}J~c09_{5q0OJ$N60m?q}n?E+=?hqGRr- zK6chgO9eSebCUxLlf5I2^l@bd%o9{g@wtcx;EA6Db?{hd$0(y>N+_t(Of)Mkm`?O9 zNe`*Y!y<APUPyyvPgHp(x{&D0O7Ja;_bG^ZknVeliS=q>6Lh>7A^C1<)b;lt#((>5 z>h(hZvth}rkw({JcE`4DIlXf`oX0H9_nR0U*bH%~jr+|vgB)6PU5n)g8$S~luomzS zr17AHVW;tii~DwkJDn!oJ1s{tQJUg7gE(neN`~lT71^VYhntd9AD*>4ZDR^pwJ}<h zS$4+j;X^+&7l6xh<qD8V=F0&VUju6apa5Ts5c~2g;41(ZJa1kKU|O<y`I2qlfT)L` zSq>r$?6c>DP(5&+=@Mj#$roRMyM%AsZ8AN)#l+EW>q#q<Gds+Hm@h&S+hOO;qqdKJ zJP_dM5ahT&`sVk@-Lq+rud<Pc8WF8il%-^1A^u#I`WT2yNsofth`J&f8hx}inH^F} zmn=)Kpz7=Mdz;xqno_9Unl?yhhH7TV>Sh38lZ^=c1F(8FD1}J*^r&*IU-EoRF$sRN zzY1szQhx?DtE(=jLz>aZhdL>;x`L=GBLZ}l`~<Z)Q>!Q}BBP4aFnL5&M(pEg@9Pl{ zuVKAz;89+<AP?;0dl)YlwAU@H*X0foWnrx5_45W8=xu1G!=OrC0~O*w>7x7yV3mZR zoARQ#{CKbYI6t)8MdZ;Xc7iWG*0ZxQH;e53>C?ntzYey_h<z&Z?{C`2`^6a%cdGJZ z_}LMF9;p5UtDuFKQbJ17gUhL5{46vt1I14E=cR{K(jrR8fxML9LcA}B7?2m~LGt{W zfx9uK&3`wIC|l}EszpVA{pY{``TPI;=fD4+99B>0>u)&hI=Xf9BC@t^fr6Don>X5< znL>~gm<w<K%(dthL4B`V50VMMwJ6EgePg%L6u@=Z+%(|);h3Kfu`q7x0!$|-Vnm!e zR7Gyc4brir2P?=f2Q5xm8t*oRE20SkpR#4yQot1WL@>au&6+jl%a&|e4z#t%T%T1J z!0I!^;QR+)E8sS1wrmMVF00j$Z3H9&0GENhw_dvzo`K2$QX9Vb!eZr$jZ41Vws!5& zt(z`<Yk6YprqkQET-?3$(mtD;-|coqPVNo3bj<(4fyd|eAa~CsdOD`~UdqF`$_ntc z%vcpWMwI3w%M4aSroR{uw~;3JtqYSux@+ZG;1%_dIc#9`s91VvyJ#+YGo|`vq5-Cv zO$<n%k1F5<NI^X@U~PJ!dUj9&I2+VLUZxDN)!S6q*NiZG8uPV^Y_%u_qNueTY;7^p zButWWa0-5MV?_oHdBjc$%ZhzM!3D(n-wyM*g!R6P3vfqyI1@r1;)6XS{M{lwf08ny z7RF@1zS1lfRri$+YZ)z2&fmd;MmHIU&?rb_rub5@cd0Sni2)utQ4i9BuTer>N;1L_ zy_);!_h%p94r&_m2D@@!PSno~=rb_4#q=1ERsfvRv|vuk6Fvn6SJy?Opvs{6A``_; z4J;--W|REcN&bb1FDD_8h4|%1d!>cAi76oiP(>)ERp#TMuj}tmA4a-W|MRaI*i}0{ zpt|f}<6v%j$lTNcTpeP(_Pec{51MZV=5p9-0h|TMvNtmWD1cgmuqP-dFkrX6o6P}$ zuBVRU?l|T=xF*1Q3yE&ZOm7V{N=^x^B0to!qV(Lv8}{a>wr|=6NHkicKU<^4aMwPw zP2g}ra#?--HF(9%OTiyPbpv=fWKouX2G?gV2`6~W&C8aVuLM!G++r0#Y1wD~0w`In zUj2_hgf~Oo4bU8r;4)hi69CsK%graZS)AAkNuY0myRICxxp8Etuj66wvwH%5+>6{j zneOkD6?}t@d)UM$3$j85ss2^zen@>Drl}yhy_5)20%j!xZFSdXchyk4WR%{zoPJdy z)NBoDxQ15F?2vq_PcqS8J=#+V=fbn5x#vwYu+4C+c5+ZWX{Z|M5svqXruu}FJ>{U~ z^(uz0fv&I5gB~D|aSc3zgb^XiLrGXs)hsNZ7RF2p$U_nW)3Lr;h(8hKfqCE*>h2is zeLL#Oy@YVzl&Hr9)I+S7vyzMdbxJiq1iQ$EPkRanI~ZN6+{ylmu6nw*fgxrgso}S2 zI1j9kWAp>3q`+HjqF<ulCFos!Kil!tAbb1f>0iH({rN{f`0l>uN=DqHYI;m@@)H3y zyn>2^mym<F<Y0aVnwuV6mKh4P1uVu(3uYzyG6)X~h+eFCUwX7RH!-9n!5<<WS$@|T zK`!co_+-yZH&579P$P0sx7i8zWo*1w!8x~Q8|ba?EX_|?TLQ$u_L-XO-DKvl&2pcq z*#USkw*c|Jea)Jk>w#>H5%||$(=|{Rv&+QH<;39#=O2l;&r>|k@o{%rn4y!h>?)FP zW$HsU9j!<Uyu8!+{B9dNV@O4>*}cISz-6;`E#S)*xNCzkaLzx@Y%vTE_L;cA%R##O zAIbvIE&KneYk<z?WlOgpE0)8>5va;+8RUDQ`Udz8l-if@44-B4<(H6Wv<G~dZ9HXd zac+m@kG9*uH~zfe>XN;c*I9e7Q@fuy9*DSlDAV7G9qop_byNW%0pbHunm^ROs2DMg zdC{HFJt!o%SETnU^Ly**Iz@K3BD-Hn2W$<tBP9k6&(K!#tXDMAT|PA+1!N8Dgp&rz z^U=E5;kxJj(s5no1em^hQZJs=RZMj8ASm&F*?RA=Cey8JTsnj*O{58kfQYDw=-9@= zj)>S15djgA5(0z{4?TnsLI@#*5JCtcKnS7tA|fIpB7^9t<2W-;Ic>i4&MEKtPM!B# z51jM<{`p<keI7#&Aak+Yd*5rXz4puL#upPpQ1y!=wGUNgQ|%=aio)UMY$c!CB~0(+ zXGrp6nweBCBbHTgkC7Quo}N&Y5M7*opH2-UGVYe;#DnUBbe@<}l|dT(^N$bz`={yO zen0T*Z-!niw|%+V{l!xEkgB>@T#$A9Bt7(4b>=NL{YG70w7e{-3?<hv_YXgee|)X@ z>z^0?`LB0>|L51QpQ*Yzv9;M@%IXw3J3#@)y^1Dd#UV^7Dlr_GvVJ*K@={ybscn@Y z@?)Edq8o_PdyU0$jd`&xL>wnPkQ;SDM!(sfd3}Tz7wW(DPViCR&E|(~Hl5k-8nDCp zn7x^wqb)FntVmY%j+=dLZ4bL_+hc9B-3(;+MsH9EXf~T#x*Bctgp9_>Y^S-gm$faV zduX$y1s#$khgU_N?I@0(5@kJaD}UHXWIt2oFSg}R*JmHKH}$b|L~cc!2bC6{=r_BY zli+eT2IqjHT@$Dw1JqhQkINyzwOQN1PS+5<ZhJk1CMde}ZFThVL|^egXI(S+Z&??x z1&|?pA(U-1HzT~v%=|W4?XocOcXK$o-Ql#C<D~<h7Y=N@cXnSwfNy-j?v(Sstg!t9 z%v-X88-s#W1v93PPahKHOo_ASWQ9wrip8$Vd3EK|s9=78j9p8UB8cB`UOtq3{-}9* zx(QX+%A@Ab=M*?APug&Ru+_)7DE59wtPa4I{hQDGKd$uu_!5?q9V^q~_fK2FbuEp7 zWEMUhsCwARm{1f?D@zBPa{3!`1|>zUWl8PaOffH=$Gp$Tj;bl97f>T}GotgdVgN2? zZbA_)ihASJ>p3a5x?<|%``4X|Q@r`1YVwZI!5V7FS5;?-SV`@CA{$;fy!^Xak^ZIe zS9tW>tc1%W&BSlNo%q{NQ@{JN`~Uvw#sB>4<GVQ(C;DVlNsOGG*v3hcvErr7`-oAf zu8<+yI5ZURO^jF>Gp?1LfRu>W^#xIq;)Lc>suaS-yx59+!QA*ujkL@1<ly$q`)6Do z&+PP$4hSSJ9zJm4fM1}GkDtwEToZTOSo+#+!U4*>%*}UOqOLOAVQ%S0G4eDscL(jD zZ{loV3Vk0WSbH~F@7!d&-O}=;=eE3%Q*Al1-6e@5yv*r_f`t}FWA@dB&iqAX;UjV0 zrw$f-Y@JbSA=r?|089h<Vhe%d+|a;AM`yFHj*F=YT0RI{YtagM4|O}}R8wdLos1yQ zF?KXCa)caOA7CU8UPEAk|7(jO)DaNW<4yfd+FAe?Ql+!0@m?F7BaZgIHs(iNY)*RG z2kdbUJ8>ZHivOK6zKKBxs2BX=0*S)~p+_aTH}G$?lNF_8MvU+irp2k#Xj8WrJX4h~ zsL-S-`+TzI^GV^$Dao5BiWM;NlcLuoFIu<!py9)E&+4<TFBVnEiXT=7K7KL$;myG7 zg|;uBE5BY*V>ILA>wXMS{rI{Ej_q&e<sX)m?=g5h-wN7(^?`_31Sq=M2w@}5d6;rg zH{_{B1#PwY?R6!hvQ&0XVnuFpA^m<X{Z3A5WDz}@nRbssi@I>Y?c3$fzy6<vAKrC; z{Zjq`K18p&S7#*?%90TUA>+ohRnfWho0YWd6|`&O;uwBbbOkk}f*L$5%liAz3m;eH zfBt6Rhc}(e#58BDDFcdc86&Z=_`akhPRdNcQ^8JYtw_efov@i1hYAdJn4AT0QF|q< zKmGW6W?0V6j;zlN7t?NXZ=MrI9+xErNz-rLI_QCdeZQ-_zt5iC5IWhTHpgs(6(F_C z+T7RP2Ef{FX|}@*sIuCziLmyvg1*n(6B-v2k~K${5A-=&eA_K7-7PG)o0)l0^ka|j zlV`>%v+s81N6$$LUaQ$X<<U#3l4orNleL+jI+~$f<Y{dMKp}e}SmDZt*LDVaIMxVR zI@+j_&`Vsq@{xjg@*wjWQ3xl{4&;|1^`Q<!CBOc}3*gfb)EB-6m&G+QAH<jjzAx}) zL(y~8)AhD6^|iM;>}-2-hr_wO+v0-H-3>Yx;qRMp?m*IogDF9uP|x|cl_WIgMzs}Q z>tjca@a|8GQf69HAGZ-miBCFM%S0dJ-E7_KM=dYcDE4=AZC}o{e0VB`g67?V3^(oX zzk$ok%&$I7etbLf?VI6mUJbokXn((~0=OWb{{dVC_P~LQz@X>zj;~j`zF25|yP$ZD zcsEi1e6)79n>F9Z!Mx3IQ(jj?o|K>3(O9e&SBfjLs)&@TA|ksuom!N6FFQG+kRHvV z$1-X6Qm=pZ?MnY&e|q`tO84)-g>=95H(!msU4WB}{P~nnB}o+(+(`>La`%*1e%SHM zn@4%{@Vd-9M8t8Ji~I?@2Hy4j=AH7VH!Z(=*D@;0ObGOAt4wdL0DG0LV5iAhsU20B z?d-JX(!|#CBtphYX=l+S%qT%YWT%j56&8Pd_w@I_|8Di!)M%S%q(#_W#i~vYDTwrs z@b|Gb(6*-Nde~VV*y`xL*=nb?`5||gJ<hg}oqJoFp{hrE1cBvgZi4z9H8=<<H**tD zYik4vCkmMKjayADoD9KEkbRsJp6(ZkJsyD`ww$PovXonO3Bi4=m}x;;N71bbQQ~4} z(Qr-bAzLGmu%0&72vbO0h%h*)m+TGnNC}py5%5JSP}k-x)?^O|K`5fM0TfVL_+;?$ zYp4QSPl|EYpAZRdF*bBGA}II+ysE9fuBE1iD_9ehi<>uX+hp$RVvqkIUt5!NUe0HC zxWrxwj5zyg{Dse`K}TZG_{AUhOg^`_ttg=>H%5{Z)W?Y)tiCrcNP4KCJ#No?s$$P| zaF+W^SEsnhgy`&ii!sDm`FAf=Zyz@-j`6-;R(`dj{@r&o1Pb^MtNm}5y1srj_`}ze zA6^c9{e0+$rLm98qrZDU`+q)6|M|NaP^jN5tKVUz<-FqkLhGyP#^o_o^)(MvWpjO1 z6N-{id9i|@F0H0_ii_I>#iH`GDuTu)(hAZNa#A9aW3MGeUBacYASR56y8Qjyx!-;F zc6CNEt!6zUdbq!P{qU=$f%y@sT3py!m)TX5Js>KqriU@(F7eZERwjioVlQ%NS4XAU zfByZ0Km9QL)2d==r1;~rh6gPL#Sww+oV1p5S~Cn7IB805W@|;NydtHQO_!D>ic8}K zIZ=bHW!R1QdU;UYS^M$(<v;!XU;p^!mw)}wFMt1^fBoZMzx+b{^Os-#{?kvtdGp1q zI$>>m>^)58Y}VI9S8tyqm{ALFYl|J`W>B5`Y_|5YfUMmN41}wx8JWWjbWz114WR-8 zs-O=A!XRHjy$@Atl>dP%yPfM3Z}Ou82O04XYSWhFC9@Jp;V|l#JzA4`*w)a;#)iOe z99TgyzFvHT=0tB0*$W~+90#(qgG1I@IGeP!*D5HC1K}NLx}ZT_m(Z_aOK(l?MbX0- z;yVCWnE62rw9?W*tix*uioTcaCbZiRIH7{HI^kh|p4j6S9dsh`%Gu~s`{U30-9F+; zJGGO3&Zp}BrF!~pRpIp!Fc8eBM|CMrWa&>8Ige!-i^|;PzOt7S+%INjUp$tqPB(q? zT=msL+wud^%UKC>-cR35{^rBPSIbylKLobxN36p6a_r+9?0K92)%VYS`flOJZyx>X zo2g%YiG5&%{PkQt24Znu&tMT0XK{%2xS#oGfIHh?HKnQ;ZYgRPq<4!7rEGdLH&eu< zv9e-`l<2JFJH^yUDjcT6f>|js;JKnM`~T`!U;Lk+KK}imfBeTk|Mts2VU|1hn-5c8 z%y-PFIn`NLA%YO(-VtO+<wc&&y7?J5B?O0HQ?CrkOTPLr`Rk9<KfND$_d@kzS~T0o zY8OyDxO7EjioAjbDx!;@(OyMYaMR_SbSVJGPU7X<c{<a*yfppe5AXi)=imL|FF*hE z*T4Mzmw){0Um&x7`O`oD{?~v0?O(tA?Z5x}U%&nR4}baFfBoy1|NB3`{Iam{c-t07 zCkqpA$4$7yxf3Y0O^ndz!<`O-ymgr;r~&{G;Bq!1qZTQcGO@r5dn6-@;qFc5{w~(n zeO>C~Z!j(%Zl+#V<weX2(kE(CW@QCW#90ponaAvnd~I#KY#<{w1XLke08o&*&>#d9 z><n}P1yo56`h@;g6B9SHjkrwWxz@KvK?PyWdcjUA>HmG!z(rDB`nm{)I0#*cf#x8& zDEegRva-N`1F3R!aX8>&eP)-7|8~2GQwNi;1<)=Y%e;In?c&kGkfQ~m$9RdDguOi_ zqK?+aqv>;RMw0%ZnZBSZo$q8k?_s?j;k}*`yr1v*>RB7Y*OyOQG5Y%YN$XD-BK~^f z58uuF{_Ck9-;Dn1?HJlXA6GF33t!0T-@Tjt5sOh)R9`N2d|Xlf__7Tf3tvpsd@(C} zF~M6JW-kp?E)G;pbd-!J83T&q$*zjQ))F~UlOpG&$=GQ!UOK<vUP<b00<{+X4v`R^ zaOF(;txE-ox6{LeAaDBDKY#n*KY#n*fBqUv3jXW2t8gCq@?{U|zlWVH86zqq<VeE# zeMQj$jQc@6dKmCkm3+M+@2<Gy&WGi(H&6S&T<QAhSF>L&b&Yp0o{rV1>oQx|iK<!x zoJeM`5I5KKc7Ar7AXi#Jm$DP#X@e~Ix4-@V4}bja$k@PNu<+uyzkc)T^FRIh=fD2r zZ-4mXfBp9#zyIS;q^I1s?;rgPSKsee{`Jql{{5f-SXo@yVq)xOX6RuK@(PzZGZ!Oc zTmT^<c7e(hVi-h%jV5bB#TfTC!a*OnGbIzF3GRJnKAX*hyj^bixmJb;rhU4d8~SN& zxPM35l|km+fy%^1an2)t<{20BeYRF0%Shd*v5}jZDN-GhqO*w+z-4csV-I|h;L^ht z5*JByg>Zl^XJZmuWM!{!>_FD>hW5nTqy{+<3$3aF39j|X1$^OqA#x#p0ccLfMxGnZ zd^TAgc6B`9V)NM!2Y)a7u+My>&m2s>^l5(Rse+rQxCs}Uaw8gZBbBV=`L@EPZpN5| z{<yPXT$T?~{;|4Zp}%^0Lj3Z9<jZ-i(^afYi@tk7sDE4?`0iC7Myo%(P<{Qm`u+1x z{E~29&nwUm`h2GO>m~KOImP=q#a9cmuNI^qpUW_rz4EYjbw;p^1pBb&)o9&pXZfrO z)9Ly0>Wl{Fz3#@0fo4J_E|jpSf`S-PIjy=NrZnwNUP@GUauhQ;I_{!>;?<MMH_sC} zcdzn`lK%mtzz_4wv+du%dHC(C@psFeYRr4}aGnnflvVLP{9F+clN){lm|`Ye;$=s0 z=r^iUt|-~@({<VNa>nvh{hxk%`t54>;)LMcA{y*nOQYf;SxKiLONOewJVDM*kua&^ zvN(BJ!lYXG^WT2^!|%WQ?uReLM1A!i|M16*``1OBe5rt`5Lef82yRg(w;+dKm?thR zfJv;Ngb=eCiaOrIzMk7b=e;*u15@sn7ETnS9UHA&O;B7JI+LX`nXB-dMm{5d#|DPz z%-{uCJR@OJC_79k{*IQHcR27OF65ou%@02#iYCsouYb~C6xqXw8Z3-dW`+AZnCykd zaJ@zSA9@S;!uKTu7Qz-XuRe|*{$hkIU=|0k!U4p{V@T=+5vkDbaWNrd8V<srExrW2 zt~tUe?w|MsBu`y*AoW1@yBHbz*jj-{J?8Edu*c(^&$b&!cgF=C%esEDBs_q5C%8KP zQbWcqX<n3)kucLhOg9k2f{gigG-TLMdU<fuTA6BoJKOPg7W9<t-Fyq^hqsT>z>$1> z4eO5Xua|q@Jneop+x_OL^3_}$o*!R=dQg8PR(ii(?OlB$fBm%e!*b`Fg%)TtS0?x? z6E$-^jA>=T%4GdAn9kvvnV!nAw%loT#iO2@hdtF}iVBq=TU>HqQbrRN+^@=v&5XH` z9d|1~;YL*8{_N=Bte7iA{N;?OlV3clUmW6(D{|)tDj&jGptq>Ip4!Pzga!t)qxV?U zYX#APB{6}e_s(P7kCS+Xoe(T%-<PxR&ZtZKnlmT5iU*pr)j}Hjo2!$J&mYTI!Na}k zf49>6{<Zqevhw+qc(#{2rmj$l=%OOHxSalO^@)Iy(JdFh{`~dDLwngdsl}NzX+5`5 zS}mw$%cWv@Q-f68z^!Bw;yR8@#Ay()g@Ous6Th{Q<Fy$s3??qd2w`aZ;g_fHy3yFp z!W1>Piz$9>P<NsP2Wv@!3r}0z&&<rW>TB;c)4#UUDgXT8jH8}q!G}a)C#APfkEGum zNWV5(aI-f*@`#<Ww}azud)sw_i@YTe=H^>Tg`fd2<xHU<Q3Aboh+Jm)rl`OuE~e<| zkogy*90*h3xz_%Avf~2~krx6AaHL~rpyO<6h^S?w`yU2^jJ1X~`XDxp+%1fK?5+H^ zSnhW)yX50~`|!@VfKQ0f6XlUaKxOm=9`&3!^LkTmcry{%S9Yhb;@)_D+G9lt%n;`L zYM%7htV~IlCnTRwG%k$^-^|Gn#h@mA@t|&XUij`s!<)s1*YlFMn0Q@KzF$&*z1;I2 zY{ZiKyVd^Rd^z$KV>qk5@QV0mwHL0nua}kIyc<}CpWGby3_0=cX)D-_m(vZeABh)+ z>gR`>A@&(>XSWM78_VK2^jn;)NKW?s^q7!@+n3U#E>J`K^J0QA%wLjpo1Jp))lkKY z9`;fX;}s^p)urR&lu1c)XGL@uJ3(0ySD$wm1Qe2Cb?S|h`+=;uV7SC}L#)iBE(~$O z1;2#O7E+I4Nyd;Q3n6xCMz%aFfBRhZ66<51bi7{ZTz;Z>yMq2g&zqH=Uw?SW&5gm@ znczbQ+|4bnojLAjZ$7OQNx6iSU)a?uXqVKq2sjF1l~h>XBCHg#OWSLC9RglQy`Wnn zlCVqeUyF3mF>*KC=x%AYg`)3dOi(~Wx?7nesyLe>1L@-u2YLXoT35f=AW%>!0lRmc z*=Bonhf~H0U#hQj?up&iH;(Z`{5#@;`_e9s<X%&xUiG!m^|XcPYtve=B2%KHp5B(V z+G{KFq#>|{@2PL2tGyW#EwmU7)))xfAIL)?6CxB5fE8|xxC=mPvvzcFSF{J;fHosV zA76&XBR*%n{<qN9a9bPx*==umz}fPwx0An%MdXp4v1k1<E+1ippW@yNu8Io~q+F5` z;j;XQ&VukhcHD$GcSgaO?_tfUnV10MVEgLQIPcBlCg}WDr=<(S{4bv<K7QWy&1%QH z#nvCb=>73cKiWF)mpZ{}VSfdlU>&dn?z@#<kfz^%-t#4ts4x3b=YO@>_imy4#Z=1| zbIRpu$+Ho`+gT|%uB8#-lR?f@FKbNAe%J@s=28WpUPTY9pb|IAsS(7zu()dh^jqf( zW3Cc+FcNz)E9z2xcIX!)MJq#?UL#(Qmc1EgEp+A2wdM`iB=?lZDT|`2Qg5P|&yPHf zz*P`=MqQUzl^fp5p-!sUpHDTtn}ZHW`Nd<!lfmlx@~D+L>C%k!&7yMUiG1OKc&eug z>a@4>a^j0elKGyh`CiU+d%m<R^xb61f2~S>wK@=R^l-3`TVo*|KVKt*KG`Lh?UU9O z(PWjG$~va1p4lZVRn-+W6eTs5Wh(jbSYnGfxgHiqkU)8Eb^vJv3^^H_I2anil)=H! z(9VFeNt=|upofgWg<8lGU1Bhxdp4P$akIU$eM?F3XSx1+h?73Tu;YrD%j%?Sii8u2 z!~j{+r32Om7`gVcv0nS#qv=dRF^@~*S`yO(Y_}Luki%?odxXw!O$`C^3e9LVnYLS@ zR<m?9wLsg+$=Cn{nWLee6N-0ebhHVGP5~}sz}_6{W^}d5rlKBtMOGw_s_SLF(S0Mu zXOqb%4&YHOLk@Y~JNF6o{DHjdpB0Cn5vGI-Q$riG!$lb(irmnFs>D%Y+9O2~W~=5f zMm7o^GYf8%Zy$@_&9}arYke~#eGPf(i_RZNR(t^4!wDek-C_qsTpw5a@G-eskTf>~ zl-j>tQhzZk2fjXjj#VZDAD7|DA$&H>U!D-6sra~;^Q50U*T<RZszCF4tewC@5{v<& z>%z;r#i8BeB!!m3n=9%{^yO33%l>#>aQ8~)t-zG4CwQ4*Py0*e)y0nqW$vu90Iw#R zlSjq$A*c>(Qbrr{l$`X^`xjBqr(Qk8jJ?#w&unHVD!8fW4wlkGh`95Tg76kr3_bGG zIs7z_WlOWoEAt9GU!p<vtaIs6Gk~^An)39$n#UctWm=s0q5IAU)x9_Utep-vaTiXN z$46Bp6L*IdytbO`{w8KCH*ct!+b3o!1!Zb6b4?gl@<1i*6LXaO3WYHL`e*xHDEOsX zJDQo=VU)(mWD9B=W7G8tXS256+OLlkC_rpwx~7-fW4-a1y?N+PC;DeTS;xGyKJ~1< zeoS)flq~9m{Jy{J-U&hy7xal01&S~51K<r1o=}6YRd5J`04h{~`bfdJjM``c7NpJw z$_R28*34v^#m4QMtZ=q&G{uMO2h}=01aU$BG@3e_AQRkxqlE$=!Y)KrAaskq=~gpS zA1B*S2v?_1oNPXIwK?Ho8-Bts>Xcu^;T<u@yb?}%r=CAR3-DpZ1hC@*S~5dMxwMfQ z`kcJvu@df7c?<o_`5xv%fBDO4(cAgf4+|Y{Ag_6jrAvJ%=Yb*M3#{db7hNBg)v!qd z!hZTN{+suszj+5kneHD~dp<07{J2V}k^Md{cVHv$$^*f(;R^UmJR7PZORfPPfHv31 zo$V@n*j_XxD^PI~T1%pZV5Q=&v1vDpVy|an3(>8M;m3U#@u5Yr*J6VXNBHmR<Y&Y3 z3U}6(DcR=_;HXg8(-5b`E|ta<RUNgzF;mV;X468l!%vjl3nYqS0>@g))D2jwoG?Ek zdN|Ph^T+2;`Y;#*hcHf`qUhO-<k5)m`C4LJn3AkKZbb`g@p0Sga^Lb&@3UvUkH$ob z!qY4A+aJ2_^e}I@n;I6yMpRHqPyf08)`2Fby1sO-PclCsn`{>>3@OIjYe(d)X%$~B zEKw76ObH{KR|?X4=N3dI19N*5BZLHC3bS16tP`F#Isg|bafeL<^q#gx81tfdm>3+j zH4k*LPB^qP|BPSeF)#MTLz0L9S=1@%ozLX4C#CTh4%tw)Sy%vDKo#J%hOIRM6~(xj znTrWwj9|1DiAYHel+FMb97^y7pcH^F9P;{SVgyX#9oz}=!d71&!3sae8q~G%lR2B2 zZ`K1y$-X+8QhS{ob~#ud@z{FW+bzHwN-ne&y)OB=-8#5E*58|Y#)r7>UmAX@_||6x zBl5GZ!rOgiF%RoA7Uac`T5~bEKG#)>;fbd(Egj;|^jAL}5unC>IV<~e5p_Epw|a0t z#O3gd`L=h9?H`uAKziZ%?aSUDzv%t;^R|zlw|}$T{&rsS`BW`jD&IqLHOXBbtHl1d z7bEQFV7R)AW;%&!W$qNwo-rm(85B~xYLl9ZBkHols-TZa4J(cdDU7+99(F1E?16IX zEgag_6Ge9~3rpgE`g#O1vR8AmS5IVUDd7eJGIpwiIn_}<Br8(a=46JSEQ&qPPPv{H zaYD{b=N3e_3epy*nwx6lN7N<LeS+d-Xz?#T9;urdCIrim+n~akpO7p)YJKrYzA)Xg z_(Zw5(6zGAzw&Hsx?kE`8TDS7@>~>Aa{K7^%?{1%OeXbOPSn|ls=85mb-$#dS6u#3 zRX?K^Pbh^$GR}-rFy6xL6);96oGN;BFE2kP_>?u0jj4qVm`+_icMB`P3y}bLB9I>~ zw6#q(Y%txRu~Adg65<$LLk|n<Lt7kAZ*#chx#gypQ(@52xP8v7%ZK?PC&b~WB#|d1 zQJ>XDp4e}xj|$!0$^s+-kg-Vz`ag7XaPcE+bHpxS3m>AgB9RNYXkd893}9NPM)8F% zgqaBlhjoZqYip9UgQ<xz`O|E`PlIEop<#_{22!U9z-8*S$-)nVOJE^f9RRMNy&f0$ zxgT}40l1<*^}c_6SK{g2^uPo8*FG)2@hSK2nJHd^lDP3mNPpUt`$(2G-JA&*&cy*3 zdx)?xb9I)GznB)kTU0@Gx{ChvBRQULo_3&;{|dCjA}X*Bl9X6d0(5T{WWRZ<hX2&J zD~eyeQo=*_{bSM62p1MNucvAkddo1{_<XQpR#i0KlGQD^KdZ`{RAlwk(|YQXWJTe^ ztea)DtEJTI1u<8%!>`aT1w@_pBM`aLZw6$9oughpURRRv^S7g4FRMSFZp5TTw}{?Y zbVpWxPmmWXXT^?4a)rgQMRCF668Lgn%!v-18<2Kj4?}C&SXbpF>dDdCN23jM<I?9d zit%3l+(Z-X%gHk>$2*HNilxWx&u3vECkMj5T%HI#dGrPmcqlL7cIZ*x9Z>bTc|pg> zqJ<<}JUAqU^0j76&R5qnIt9fr0DPbpjmWt}4eUMvvrouqV`YknxK>7LS;{>#EiH3x zinYETS}|Z7>>ye<G$w~>jEpUGbbu`kZkcIoTaY3>6i#{v9UV`&*q`@sj6F>3VqQBH zz1y)cXn#ZGd2x7v;(l;@LZCE0=<sHWlPQAN#?5*<D7}FUWI_^C6f%AxLvAr5v1YG_ zghrC3)|!CWzu8eh45-3c#~Of!vdThpgC($OW`dD2V@(aph7E=rHV}rIS{t>sx0rz9 z((|x1+T&=u&&Bbuhtrwe9ygEqUh?zs_prZmz$0}3wuDnY38!|ap4(3k@FgxDsJ?S* zN)W3mzWPv@FxQy8(2@PLvjF}!tLXU5w5-lF&yNU~A2gBPfKS^Or!X{6YEU7bfA@?G zVqhIUzUupqc!j!s=+|Ekf3u|g;iVj!<Cimn&!?+bAM!z)VyN-;L)7r~$ciB5vH5;X zmOd&?!T9N{ig?hL)h9~ou1%COB5Sil%MyYLV=fR;m-3@RQbU5G&iK)909fafub)V~ zbWF-gTY22@c&KVh%^Xvfj<yv|ca`>u2;2peL<Ql3oDg2-?K&a`6R1Q?P<=_9T3k}g zh@R{gJm}*;9H^P<<BoT6XGg{3JvA?8+g2A;a}&}hlg)@%&mSq~XXH<3T5+Bre9d(| zo#`7>)gN@;SV*ImrX*iGa^%J*``c^s*crErsn-XZD@S0q-_xMP1jvM<wx_AGzqw+f zoj<FRwsZ2P<h;=)j+~X*#mR?JVBpas76t~EkPairphc{MTcU}LHVG~>U2S6xfNO)9 zmZmwW$1}Fkr8racj=R`i_HvEd>zR4>V8nLYoD<$<K?g<Qr^OMUiEkZ~!~}h2i=vHW zI;{vz4PXjH0ccZT3Y{L%3kY5~PywRBgUDs2iNv@8+IU+n9edch>EP!e$1=8>!U1mM z&ds(EP*`rzFx#-fOjFZbTYICH7GB^OYHMM3(b3Gr-D=}5TT5Rj+x<><$KYz?<$7kP z8~)K<@Fm=Wyd6XQTp|v+#`<qhIlVjns7Lyloh4WIjq{?%s-tHclD<$EEq9eHsTr@w z>)uQ^y?u;*1k&dZnx0QJLU+0}CBX}FEMva?%f&9xS|48YykG7A>eaxT&$~Z<Ir{b6 zkv9t<<Dtmme)+87%@e`OH22vE`{h&(rmqPg>*+xG!T=La5r|fU5?Uw!-n24%OrECV z$F;HVVz{h6{YF{DY0T;8-#$Y`1;t)E5_-ZfCfGkI^mOdygDK&kbvG3u^L||JgAL}B z;p(yWys=jLU?Y4lQxp|3?d*H?xpBPosFWN2+0lV*f}-~NLJ5yHHBdWFba5xTIS=}( zAM^rcwU0;YXNRFHlsuYfo_iplos_LVXU3(oQ?mIP#p9{g#mA~~HGj92`Q3}BI7BLs zk;yKgvgo&{A)hu?rcMutN80%lD#5UV^LRk?WKaxC>WTKMDJ(0JbFmhwN5WExnUd^8 zX$hU1NhH#4T;FPDY^tkcqN}&r&~THHiKV`QC52+Bt7)jYfuga&NOOa!u9mr`zPXOR zx%LLINTEBn(hl#dzH=jXpBMf39_Gd4<>wBG!^o^Cy?5T<(r7nkdyG(kZ}_+RT_1Nk z)bb=}hGe*=jVE=c01bhv3&?_4%SsEA)7q9u!2l5ur>VI~R~MH~TWusz3g%t`B~vXe z6HLNx*nnd}(cNNhhW8yPhEQT-hWmh%{ZV(PPd(kv`0Nb*^uP^2uPfe;5&PZl9dwKK z+d@0)Nj>P6ddxlNjOReb?MZ&@jF9>{(U$kL4Qp5#uP5r>%t&6%w7h)OvOLrLIqKc% zrstF5XXB!mj}XE-Kxlot(g$+u%hf)dH_P20UJtG=b*;|9aaXYVko$g7{O)Pp>I?+; zRWNUSHc~m=RW#ef0JdNvGo{EH5L5f=6CNlshQvuKUaXvRS6W8g;nS}bN1QB+3}8fG zDvi6D5*8R8bS&Z8S=!CB(ZL6@;{tmc^1okde=%DB>Ou3;kN|GukCX)?QhFOZT3Qm` z!njkN8qtswiwWg=2DMLKRi1ZySjirR`B8i2PzP&VT{WTRP4(7Jbk{r{70(Qb9zRgb zP6AtUfQcagm~5RHlTD9ecZ_K6L9<%M*lA^Xe8)C+4!tlfuC<{;QOzo*-mNRiX%kkr z^2)o#)iO>&pQLiERWK~$Ppc$@vTC)Us8__m=@u4C*fB~`M!T?(n@wk@&^+uM^fh%% zQNrs{%wgQ1r;lVv0k$+Z7!q0=O!c%)G_{S9L$x-zo9dmgrd)NlP7gR#c*#G>&qWv! z#JPFAE#vB7S(G&O8i<HpHs;>;ws!g$p(Z6)NQOv&BoC`gK|=|Oz)hO)2Gqs%57=5a z-9qgJ7?D>&4J|xzEwq9;rG}QBE<s*nZ4D^kLaZQQ)zd>VL^?Oq)!c5k3AX@rCw*+~ z4sCUI(%1Dgr|dM<_ug#j@9i19&-aL<jjx5#x$X9sytjmSI)?3bN%Y?xcgzFe8mo?( z;KjaZ&3!1#T<T+z+X`kyFDC^rri6==;^isX(^28VSpCwJm;lONJ&~i#BE?#3Jn6gV z$~Oz`U$1n7k_XxP)iW`+_@deKe7q9KS{&m7T#I9z`9aoGWW|2w6IJ2E)~w+M>QG%m zzaVx<m@rVA(9VdEA*-ccD+)isxO+A~G5{vK^ss<CfrsO-oQw!K6dQajDJ(!rlu%*y zJJFmz3E3GeOeA!qSJ-|H2$NM+iOogPENU?GZeZrk(=fvsQF8cY5h&pMTT7peN?<`U zqGV6?)Q<MlJ{)bt@{XBN$=sw2=9aS)via#&`1DSXN+t$H{i<rnS%=hog{W|^qotpV zbrZXAy0b~fB66gH{HE%x(KcS6lrtdV3`u#Mj5vNyQgK3fJC7l+E>;K%u(L&2LT#<i z6%-}ZGH5OQVqShq87)Fsm@Z-F9{2IwsI5amgwWA8*Vi@H(L%^F)F6+MriQVGmYJ5e zy|(sIJDbqmyW>7N5WaUucEGVP&&`GBj}Z+qR~uu4Mi?=Q%m`mgT`ybf{oA%~GvByY zY>`U%H7OQ^4J7Zr#!QiLLpg=uMQW5$+-Yi>l1B^Gl_h8_Ep1#Pto8IwH4w_ckWo+% z+EENQBm6<qWn#A3$Y`s@#!cFqj`~_YguUgS&E|((><&2DoZsiW)zbW|pVuij+vouQ z!%jAre79ZP;}m~*N0gsy>=C!@OZ)oRw<l`uP4Z%w<vAdZR<JT>8kG|KM7T?1HH#B< z^J9W1L%fAi-r__p1n@5&ieEmKzF$HWulnLi3r1ZbkB18I-J<f%)8<!?2&kBONQH=2 zOXJ+tM|G&TR;Fqe$Jn#|rH{J`aT%Rxq>l)xqxFgH%up3OqK6yX&WMuahE~R1C<;Hx zx_^NYb2%&QeEO}R*o&XVUh<C$Je+X#WK8g9;xg)@x(LJIGwr!O+`D}>F=~EvpCDe& zifU!vEss50PlON{%gK%iYGP-$H)MjB?UR?PrNsknj8SFzL{If-uVAdFcC1G*HBdi2 z)bL<Xgfl%PUVky(D;!bR&Wwl$Ra_idZRT#fjYqxg>lqm`R&EEUpi5fPFJtyeN(aOx zV~vb{VTp=g)ZbV+A;aQ8-cU2Aj}S2)C~Aiq+2b<a!}dD3u=Wbe1{x|Jwuz=yqS?+S zW*XH<TgOn}#7viBp{r*~*3KJHJ0o}*XlyW8D|Ku%HM~uX{Oz4??b{u;+oL=zB+AD< z<(M}&EI=3&pvnzvO%L<ksO@d*fblf+en6i>6k!LImOepo)HAkUn<GOFkF(xWA}@=u z2-F~}C{qm$Tp{oR__ET|LxF`$1>VH5F+jWf-yRaU&w|t4YH8_dW8>>&=Vneh?7GR@ z+SqHOk+-?gF?VN39}hWgI&5#88Ftafl5)u2^0=D~5wXub#M?gM1n924W8A1&5p{wW zgDJShp3;@^s)a#NTxCmx%*Bz4C!_4g<CP2J+-H+mrc(86O0e_*Q;U+f3$1U^#F>*} z$`#{c5So5T_OKPp(|klN>@rxHu7$kj`Be4%5NocViF`QU2mZfgMgjhzIb%db8?1}( z<=-8wi|b@Zw=yDSg|`K%Ayx60IEj~w?gXcW1i+;dkt_QAk+kq2>h;r+0S6Tv`h0uA zNF%+Cd8?0iuZ?vJHf;k!s<Jw+nQ=#$8Olxyu1>vq+uysPIAy4V(J9Ft>L}}1lnyA$ zhuh0XySPJLHN)5dHr&M<QS;Xz)-cg0n(P-1D7k8^@laJOn@f8XESy0luem1MYm>3J z6(#rHO&&q5&Wh%xL3kJ?CGLwe?=<J!713|;lS69hHze72YU#J?Gww8H->XT!U6UMM zn;Kc2bc;_9<)>a3Wrd5fq7;R3ic&fit5ePOw9QQ|Ec8vxwMlRxa*^QDAn}DF2erMa z=7#O|Hf9F8hixpww!5&xgA+dS$_+SBe)VMGc^^^CSx)$AA0y4Zn>Rx$ztt47d1D9< z9YCTQ7&-u3dSs7sU39wMQd)nFVMRb{Bk`YFoxGy1747SY1GqMm6b5<LSvY*L(?+zf z%>k~hrUt(DW{6turW7Ar3%HAUTbthvIB{;LBlXhh>-)U|w>tzOEAHP3F-O=D@8G@8 zQ#JReYU3U^r$6h+TkT`7^s}F<nb?5IKw-bs!<<tWzM8IH8RaYtl)ZrU));?rOt3m5 z!Flzl>E$EbBPEDm0M~2K_zSXE^9`#IZaw5LOjIpR*DOv|KON&d9by5kPu0bbI`gO7 za>ts}$E5TQZd6NoXj|p&9zjCCFh#+<E6Tc6op^<L?>yt)Wdd78({7!Q2|5~o<perF zc!r)n(7~opaHEw)7aNIyc6KOYmVy~IP!BEE-2q`{JB!LMiY4MM=Eh!ZuFmZcm119V zzr3=ixqP6NJ>7$KXqAI1-e@;}NX5f)NJOyycHWSZj}6MBYN4`;)!WAEYiACsIQ@i@ zGo}`c*ctBTMqZBQ(bocn1ht2m1ieLVW&|e7FjFQ>kLIO>*QSLx<ld>x2&;oBcE)W% zN*FKUx_}lcpxxwCLj<&I7zBc9j-Pl_Knt(SPIa@kF)=bUGcmH%Hw8O^OlYE|0fd?A zuGL;^{L&^3LNhin$llxn9Mfmpw$l6$#_n-WJmgsrbc`Q<oEa7n=C@<FIRwrwyX<Vq z?j){rP?nmKmXoNr$hvARYC$v&k<XfN3zIwKm^BDD#4B6{5wCF8gBVGLtc5aQ%T^D! zO(WueDPDlf-P+2}1v@y*y{%35*jl-p895spcx{5+lle(6j|)B?p+|f|4|s*{+ZN-$ zEB5%F@K4+#k9sCwI55Regu&ZXQ^rC!V@_Q@(^WRBW<JH_em{3<xO%>i2_@=_QTEe; zvc)0J>U86)nWi_7vAtaKhIouRpBxrj4_+@HHLrn7{Okb_GZRn8InSqS=EphDrmCL| zFoCHFaVkphDMj`pRRPXmV^UY`-7y(`NRo=30xE8TIOle4atJ5k5<BrmMra@{<P0_B zOyadu>9;Q=Tsw8`gs&hkt{$`D1A^au{p9<1#Q5uZnUo!&;>D>2$=$VSDozSWC~kIC zbdX;QH%BQdQArrx&Ddtk9B8c?LuhJd^mT9muKo@VVi(R(XWe8UxsPvlv=ygcS<$B~ z>sByTGDfe0UqX-aurS=Q$<)t%i>M?;PJ}lX-WO#@in5~w>EQ(aKwuK2->ORw$1MWG z8p4bSae728EwnuP0w?YYH~y+1<w{*DiLb_tXi-XZ*wKS9yTYB&%!Fd5V`QdDg3DM- zgN$988}v7ji4pIB!t~s1n|}F{tDcd+i)&FxP|=zF35PrxSI!C}P6}ghT=RBwCs0<K zK)YuNW}X}ZgN+DDMS-0)0q2iU1$?cG@&Od!3sDH*`d^aae_sG!2wdwxvm$vmkgz1a z@FjRUn3%Yjn;mlB>gQs6c&nW=MHj;X+pNrX+Y=Dxn;do98tm(J!N>jbE|(j7oNxI$ zMIG5r3p_vz+@BDz?^y?HrLSgr&6MrwAUYUzi(?J19?4&fOVFK}?kGg;dZaE~9zz$m z9JKv>AAnW`ORWzJ?awELOH)FOMnD*~JYE0#N#pX2;Kf7UB2p;uIL;xKX9X{&c@xT< zQCZqpQ_2HH)}%aRT9J*KslT48<VBCmGGLz6%}Z5s68UM@c?nm_p_RECoOJa>#_dbk z4oka9>I7qg4&Od;pokV)5P$9U{LtV2^6~dSfA!smM;J*{^5S7XQ=56SvE*(!{Z>NA zr-?U@%Xt`r%vTZO5@lmiS5ry1tPB^w7D0{@4kPWH77@{kt%{N&77-g8da5-24wsQ! zLXT0)%EtSuhPpW_Ib%dE$fI8MMBuW4!b-O~=e~-WAT5fMl_Ydlrb!B76--)Nd5Wxr zDkfsvD`<EjCE`>pT1#QPyePgQE3&PWNa*5Z$_wxFlP(GA(fs5ncO!i}ioT_xuBnc$ zsW!z#Th~OJL>9ORAWIjdrG|#SrnWXY4W^lY;i|KyrjM;n!Vy2#rDJjXJcx6LIAQ** zuyX;f*50NRPk4Z@O+>G=TDa?hpGBFp7Pa(XxJ9^{S)dUFjI1X*@-~Q8qoE;ggSe%d zYm!+Ku!7Yf!WlBM6<Uy*q&Wn>1wI*HXotaCGm~BRn|9impWMCUGf#In6C=N^_I^%w zuEqvFn=FF&cwXA$8RY30e$YMa;I^ov9^nUFZ|-+a3iJ~b*<teHXa(b5FE>S6ct_5N zl@>*}RU~w95_^SdJtBIKI2CKV`ox*TQh2Zzc8lp~IZr8BU(B{HkHa0c3J2Yt)hWTt zDgM$3=fzm%!ch6MLFV&;^5=bJ3%v~N2k5O&7?RLNMaj4s4%H=+6}{m8s3>zlNaU)x zYc^M$xJKeuWo%Gs)Y+`i6Uo<3^0E_!`LXoSQ+Ln$M;t#Gand`VdcLtDc5bR+{z22T zY58C~LnWbgHKvSq6weLuCsnM-z$57q7mAZZ>zULpNq(D{P&DFMsBA9jkQTQ$70E=o z3Ng`Ap9?EEob-h2#33&iKUa4jr=5G9oc6kG4m{`?jSceA*KP(J@!#pN$I8gV#=_Rr zfLluMhDnRKsE3!)Uz^=onWE;VV|1gVBBh6yJu0o}78G>X=3vpxU=t=Wi+dY#y6ZFB zcm)$ptiIZeiDq_o%q<H&T}u-)GYVy+o(^DyyP_$f3u846GG=Yqpttrk*3hNs7~q}o z!@KM?H|(<B7`}UR<&|Uf!#fzkM_TD2oTzJuZOx#~hjbq3!QdA>=GVr*$O0Uh5Wxq0 z7QnUD#C#1~DC$YV9?A#U<~SRg;B3}{fsK}>HlafjT5E+DJl?Ef`K$pl?BCWmfS9AM z_BInE*biWWd#}B-kFDiF7aLgOAKYSh!pp-+UwfCOQNV83u){kqdTmD30<1#)oI-qo zHCMQF%Zs9=xwqv+l$Z#EtC_ecLdv+KWXBDOGU4i>u1|#(d*)zM`nVi}g=vG5jM0|7 z2TBIo&(FrH7Dg+dj<Dy4*$ZRrhdsqJy(P1KB@cRwW_pWfdy1yobEf6#BNAAs#SAwm zO-Yl-8>x7XHY5zxMD@W-unN<E5o*%%Dpr_zqxkm8lE^dAGL+m8Vbbofl0(wNPDK-^ zKa2D~9CP--!jN!U$(ZS_d^}M3q^A-KpJw{-A#1dg2`&!iG{Pb*sLLr$4R5SSk@M+o z;=C47P6H(JjRgap990XWQ&uXg%Wf6rH48E&HS|_F_x$nw$98%h^W5#{wq>siT4o+Q zEFE@2BxP&sZDR+)rI!tXrAsEQHB6N-ua!lWGUD1RljY@!3T9$ED@nnmB7}8u)A|L3 zikmwqWQ~Z~BjO5Gb^btoX=8D!B>SG4No}vls7#Nyf;W+gk(Is<Sa~C@4cLIOR?cez zSOAmW1`PwU=b~$%O`&LL1^c;rSz=#>IdR+9zAE%&w!e4r`TdpQ$5|04_nK+$wls&; zDHMO}^R0jq$($O%GYMnX&}d=G6|z=1P@?zqZzUi}h9S{mOvBI^)^0W+x^(r-bajlh zG*NPqe5ocmnT@YSO2oyIe4($mjW99ZV`m4J%ZXy*ZEdz^lgTlUt%scKk8E?ga9~gH zz8#kidSmqI&N1(heXi6%Kg6v2C%nV_oRrv#Qgo+-dB3wFp`Cf31X@9)vLe2RmpW9R zi9$$Gc^5v7s%lziHHKrLAx`cSru2$v&j-sNsR(StTj(!Y93sk=$6(S-JXDfrx{ZLj z=z|X8VQ0ZaYr%vZn*s8M8Z-Na^j-n!#MM`qiX&&o$jf7z3hu~C?$zalRlpfHG7wp@ zBK{h{Rh}H35pgyrDkwATYUIg-F@b)hh83x~Js(p%<1Iw5FkMwe>#9zDHq?L#NJ(ub zoWx^!d9f_KD2Qw3q&IQXr8VhtK~^(AOD4#c@Y3aVxvj!{2`{6rf+nn>)t9C0-eR$L zyPKE0*Pg9TURxYIo$NhbY`t9^JRGguZEZd6Ox$cO?M*2BqO@sswVIcW(_5P-XTs<? zcR-LYElL;?6b%JRSZZN@SA79`L6hymq2?-;kTKFyrQl_%E8vJ-)L+jixgTw=r(<qx zWI@q0*VjWP1jJ0V^$<2F8#IlyP|xe=Z_w1<p#6&mv2nwOV@{6ec5ZhwqJ(0&X0LPZ zDW6zh$4Ebi08gi#urD!(-zk~xfB-z#5+kV<1H2G;5W66b$J_@RK=_2UB8nXTf!5j? z4)ywmn<1&u(gDw9O`#x1;@SvoAx%R5gZDAfPfj!98=1qw#J~VVEfOP4$v<&&bkfm2 z42Isr`H-vQDX(q8KJK@V9|}9X=ZK?O^r?e!0ef#9bdB-%Libw5jO$?BgJ4iz7=@=a zFC6+oWm)V1KYb9Z1o`w%ZgNizy_cUhD1>!(c7J{PU_;s*L{xGjeMXh@s4I7_Cx2m} z_(^ZUWLw6JDi>;pna=!Y1LRiL>GtCB=3H3T4mPA?Sx!$)Dm+BnS#c^3wUrqoEsn&H zH$VLnvau*PrY8AT*`2eDI{^q>WeGQn;=>DKgJ>Zq5-*%f2tE~kW-n$s;CMJ9O@r&s zLluWuoD{wJu=w@&i*H^(Xb|M~byxF>W9u1-@z*~EJ>OKB(OR3^TA$lgn=XMfjWAm- z%$4%<8mn`}m@eX^H&mrHmC<%@G2iLp?CrK=x3jaivy+#Tqr2l~FGq*%j`mw@Oq?8z zTsK?7?X0nqnCN6<><q(aIC2a#65MoUc}f>MeOy{T)6RR)Q;SuIqb<DYPNAx<WUQ5^ zs3xQp)WN#!VfcM<b4n8KleChtvAGejrHjCYsAZz9Z=|V1*#O&7UA!>R(AM0brHO>8 ztL^XRam>m7=6>%GU(cLN{@KTUr3qJC3X*)RO+BovoQ(-HcLU5HQk<}1g(MG1dVLLL z|Mo~Cp#<I7nsqKvvJOMM3H0Ih`e?t^8n|$QMCoM=QJ@woE>cv8@C7`AQ#D3Y9fSP( zI$QL$w_BQAIOrSVf7spJ_!B2PVn1A=TpiB3+g<hb3i5V6zSZXLiNn#Syzd_0nQ+E8 z;e-#OR#V=sE<`OxOfwPDQV`Xc9VW|<9H>oEapF3;2}*84XH`-+KXsr!b4Zju)Q~+S z&K#Fz&#DU7!8F%X@Te;fLF-8mjJAtm@r*5Bi$i7ey^J|R&76?s_F_whFr~Ye)>;wQ zQAJhr=?Zon(x8%)ATNs%WL_8LgbOlm*QA71#GEgS4j{tM=0*n7Le3S(Uj(=^L$5`h zJREY=>*)Y*9?QsO>0{lDnTh(hZ^pj=!(V>=$De=t-M33K%9iS+{KP9oiC3sM{Og&t zItER`CDI$YX_A`sCU{WPq&4v~rF_7xu&E|TCIHGZ6fk?fc6#Sl7cVUCb=kU;1lJZ1 zM|%%D+ikX+9V|^;?95zk%n>1KOVU~ZCT^yhpVM1MG?gZ(YO*@m=`D=pK2h=FU~`YO ztgEpUOQ3+N$@bcDMGdqP1fp4IWvU?QqLQ0kmK<lUqitzqWMO1Lf(wmA5?s258d_@= zmxjRxlwMjI8#J}RacXJov9$4b+T!oHi57S~!p}(*eMv^WK3!jV%5&>M56}JEwjXtM z@wVGyqw{Z~bRAoWHvk6?i7nzk;97?g8Isnd`gj69HdyHc7ZO85fD2SA+KJZS@_{dH zjMh@%4u&2!1wOl|#B{Yb>tTV0rr#FZQ#(C;ZLPK$>3Lh4?6x#M<LP+qz^?PVT>WfJ zZXEK7JmD2_Y<v6}pY-5E12qJ-pGTDz+-!r#CnG|^xZRW=qUPKi5~OrjC$@89VJkV@ zm^C3Io^+M3jtQRjG9JNby9bKG>=_j>mG__{8wZ=chMQ8cHf{obqRpwG8B{g*JFDYi zu?=jsRmP4<bEeyv(+cK9OG&o?R--8`tXNTQI8m2zvpVIPC^v#jyH*i%VGUeoQbW$r zLINS3i3>iGe&cG`r+x{S{O9^=$YqGCvL^$aSMx1XFv5Q^_H?psqPx0BlBE(PFq5t` zsMiuhj@6Y>Yne&nsx&b-UBsa`)ntpR=y=gsO@=H1D;e(#*(pUC^fSc4y*r(4J-0b| zxoq`xa`JTC;_2wPW6Ks-8ygpE>#dtDoXjbHj@Hdp=wNdC>WhXNOV#|m7FG&^m!dL# zK+IGN84o(^yTxVLSk}VHexR&V))vV)+0Z-p)H4)iG&QUeE7KYoc^0}_WZ)vVjp>`} zXaQknx&;2Gi(Vo~R6I>K=;~<TuBd^PWIHz5e6q#%Qx}^%rw(27vK7T$=f?z#Gvcv} z?#zKB$MzmL;^FSM)g7L0phi)@BOI*<rT-6H|G^fCB(laQ?||z`lKdPk9e{~I-otef zbQ&TT7!X(x!ng#ou!C-HFbTIXrkH?#LwQKiv(VG=b#p%Kxz*Fg^vrIzW7}*4yj>1% zvGg`KIJ?u?%S`vme(&g`J0lOc#~#^1^WWW46elf+RkBjXu%Vd<M;z-ckHaz^CF@=f zk2)#=s`91?n3p!djGe0DQx)ucKniM};l_-?CK}F=G`Y7Sp}!%%PZZzZkT@Vt!upBf zCR%?(65<uWg^;CS$09w>bXH6&S(6I1b2Gc^F+d*=NY$m^;wE3^rH9mK-KvVa%!m%a zRgoSFY@N%yd+u)Ffs`vm@Xe!sw5!LcA)i#FTz)atIx``jpX*tkQ_MZ=cskRu@=Wz+ zLD45l!x}vnHKZW!GPfwUsw9rjOcJnC>RG9Em_Oua*K<-Dsz|KWBbKm|L|i(P$lK*; zv)joQsPb@fakX=FwIyAYU2SY_O*Udz=C)1NF6M^BUR#THK10nf>u)F?ld<p|lHkK! z8JphDFYIrs>XlaYHL==xdHs^|VOdpA12#rNg~K0`RQK@<I#9<l5(Ncx8;Y)tnW?3b zp}D>Rln0g+eOr7;(I=^S98#gDtEZ`}t)YPry*8Q!c)DKM?RuB+-*^A`Cm~+Wb+j9t zgxjZfcpmpXbad~*!=9eL&fA~~TaQ)%7Y>5b|1Y@K>-2SS;nVN}oT{akHn4?cZK<md z`IdzifCW*G2H=HRILO1GIooAN*n8R8f$MUyuy8Pf$lt)z!sw`*-Lb7!fxBET?Dq=t z^@PmX-^1>Ri_H~Z_Y*D_AwJGghql82NKu$5NC_8b+!1F+v=-i10B*U_ZKc!}IPv9# zbk`;g!QWX5!WwRR_pocHho3$vD;X5!qE|d10*0vA7e|aqQ-?t{G@~R+8E#4$X-OHB z!bUf(i${jPE<Sapy?COXF@+Y43~K~3`<t?rTv}~<7>MrL%+MNoNNsv3JN{y6R6zF4 zlgNr$k(Y9!PDP#eO}KC_;>6*U(8I6i`~LXTyFdQ^tH1pD$DjZB;oa)g+qV-xe0V%R zDOC`4^uDGnR`N}LZcNtQ^9>w2uOzOj=)Rbf-pbFH^0Gy2I0fLDB4ASa44R-UDLv-Q zPDg7u8w(#dR}@%oTb$hN?47MPIbrFb-4;i4OD9XqtyY%K8!4Z-*iLszdTL9hOqz<H zi)Uv|PIq0Qx~@oGl{45<)gdNII`~*pTsa_NLzXJ7fNVbtX;D>M++ULmHx5Zbyr3l0 z-c--p(sHALF4{UKdfKM&2{AQs++=O6qidwAtEYi(G6nr?18oh8_6GRC2YEZ+KejV1 z=xA#pJ@(9@+O#<4-SETPTn>Bf`owFuFKkuqw~&n<U2Ig*CW|UEa_LcQwb$zTwZ`Cj z$pvH~B_eVGdh7TC0LfGdaR#E3t}aS03ka>T{Z3ck3f?6U3{nj66Kv7b-EFgJ2X-e| zTEHzjVBcOJM_X@O3m;o^EL%M3wizZQ@Td+XU=@DQC&1f1^swKReO_1hZNK2{2-mlk z{AgKzbZgPQ)}k0?8GIum8?(Y?xp$=G&{_B}KcfpZI5SpRk<f-KWi_q8J`-C>u##j< zT-Ybb>Jw%>P!vJ1JOZj+noOQXTCd<<KR<3lkUmrk5{TMXb$_gl$RAYX4Yw5zwH6G? za|aY9>bi{joUq2+Th%F7fvhUp6-<GZ#s(GM3Cx1-G~`@nSYU*|Uu?js=+g&cFC2I} zAbP(t_1zC&y?yig<>JK0rLoyb<>Tr0#X0rjoT|OKv|X5wb!O?&=UVvLlJbn|q68k3 z$|;ExR-{O(G6`{II-e2GE2Rop*+LeP5_uVM%6qGui;cazgR`51ouh@Ni?xlTg|&;# z=FP^Yn~jYfAw=J3cF5Iftc^b)D(Yz{>J;RmX^j`nmGn^wOInfMt>oeKHM85fL|1L` z!hmd6Ek;F;@TIOV=;Wp=m?^62qGp1iyBcYkQuIwIx&{;tUF{9}5K@_#;BPX~)ItGo zuB)l5r%ll(If~;x-rly@lV}j&<&++LL{UOdxOlp*u;9wkQwN>49&p{h$H{q@lif~x z2Z$Fi{J(jPQU|uk*5X=U5EU3WFBD$uVa-mDAYrv0-SBw;7chtq5%@qy;Ir{%*4nz3 zu%*;DFxSyFfkp!Re++fp%qZSA8*wmWbmgeeiJdMU78d*5oR7IVp7yZ4a=<NUw|($l zr_1}cUf$<=`zV%aI8)E=NjSX=F{&{uQbxq6m^4MvJ)*rdPLzIAm=-F@zauNX+fo`m zRF?&^qL)ikl*P1_$AXSf^J(pzI5j_6U7dn(hM+Ve%@}V@pHO6=l`|p%zEXyou?Len zRGW%=uA7&r;KU5ebB0<f2AV5+8W>%|LV0y2%u1_MLMjt3vg3lvV*@#~D@-EpLP_j- zA|jv|b7a>7u)Z?f-zVnuiI_9TQg0r8(8+ke()X)hzg}LQoqN=}G%fx5{nVRhJu^cM zLn<x^EN=e&lv`)wuN=ef77<b+$cCD90Y6<V&J_qUtE*FZJQ|-%tL9{I+1WuS_u6eV zv^CLpFf-h0ZDwz2yxoDY!Elbf*+zTwjpPL#i<ZnRoJ>tmc)Lw?3VQ2u+jv<mob*ls zF@Ua8Ly>}=-qTPjsn2hdv3sO!s3Yo&61zoZN`4WtA|e<Dw-sz!Qz=zkM3)q%Bws%t zd;MC>g>xyPS7R>)g#`sz8|ouQp`t+=G||){bP=|+NZ~rn>Cf-n8GrtK#L@k?eVhad zVKFBU6-37zbn-mt>bBq66<N#K!o<Ve%0Z8^&D7jhTOUH1bvXkNLuwh;%$U}}wH~s7 zr~kzk-XUWhqTE_ig(Em<Rae5?Vy)+>XQ7MhqYe~jPKMg<7DhWZ!3oo7yR~_k|NfIZ zoZKzVy|>t(@Nzwe(Tu$==XPwld1zOFr~QRp&e5N`$DQ<!J-$2kxKCyLIZ<W^HfT2G z-onaQV68sw7M@Lc_u5Kg`#6cCHOXprTsPP*$UHgsRXhTlZ|?O7k}+XAAi(yLl;OtA z>9+i-wk*JET#^E*!dQLMkT7mQ5ZBF)S5!pHS$8_Ha)lk;!K119=~x88%eY=ezg$JT z#Gzhb(}FAGf~sj(>T_;mI{{)>K}0}7L~!n{;M=DUgrD-me^03Yj?|m}-Oa_*BMrpr z(}DLZW3QG5uqkT1SMYF5KGrAdYp+yFiv<-aiu%GX8A~OvXc80-^-4wt+h(VSrYF^t zV_h>3dZ#8j`-U1uCfbL`+Gl5b9?g!>=`q=v@w}>{q<bM=PMbdQa@*(W=I&s(#lm8X zh1C`_D@fD>_U=&Cm!c$x$VP=_!F?jES1%csVxdBMZzE%@t$J7~M5Gkt-G_+^0v1L# zP}0k*ayvPh;-Y&PM{2LkZ7t1854}W>icSr^LA`c0{_4fV8<#SoZ}vz<yrPV_kW+yN zJg%HPc4FVIt?+ubx87r8bAI=ZyC?T&Ui0TChqDsHXd&l4%m`y&mn|^-g5wtc2{@UX zZ-Q~Wl@%H~Ti_Fb#?RW+HbN8nK<HTiZ{%8!TL1gR3mec_|G8Nr{NWutq(t-{$;%<G zk=h{ZA>_f@VRv)0UA9<IY<ByzW5o4?`#h|TJ*~|?b+HZfbUNeVc=rEs^%hWVZfm>f zYFCxg;_mM5E+Hg9fDqg*K|%<@{lneeol@N0-JMc*_jawd*Z$A`@3{AzH|_rSIOC4- zjLDZk81(7$%6#XX@01ttFj4~N<z^`Bp)KxZAnju!A84TtOJ3Cxj&SO_Imxp=(y1}h zzB$UFJ<+o()o(C2s6U4|kn6YHlrT?k`v=#)!QwFN8V%_yBhR)b^p{4AR7b<Za1C|3 z5z;T}T2InyPr??`o4VGUxOgXV9B%!Bw&V0GnL<EcxAV#E*#Sf4;SGpKMYLTW*)pGE z0|)I(!|Zd()(y$Nm2n;gG=~IFOo9tG9B1fhs_Aa3?q;S8ND8)_xLwdyozzksHQbUl z*pdnRk6}~8!g%e<bkp)w<Md#~#8A!jXno&pq^P?+zq2`~vnjWyy?msnabl=>YNT~; z^7iC#%h*Wc>`dq6X!G=V>&ReZZ&y`Uduc~YVQWJMMn_&%gilqRUr|(0l$TeOPk;}u zSG~o6*HP}T&+aLW?k<YzEsY(nO`T}W>MDYZu;`uYU~BVuV{vzBW)97_uQIK#It{5# zqqOG7G-QW&717#rsm&RoHA%sBNul8`c$$YR&CQMCMhJCv1{daPsy^OPy*_@st2Xm= zV`y=_Wv0Krzp=PJFA1Y4rN+k`;b@xSNANLJh$I*$`4FI!oDx3=9E9e*b&H*W5%!A0 z6c3(3TfC6H-D2VgZ9)ALJk)>01y1T$h7a=j{{g-Qi5ETh`Z<+^m(WEJJ_|2l0tyK~ z^o{#<hy&Vx!QmfwJzWP4Wi3g56%ig|5kW(4PLv1_T8f{bF7Bc)MbH#>fFiF6BJX7= z8)Bu|kwF?RjeyYCS43T_jTz4+4rTZZXZg<*hmIGJ>1P>BX%p2T5x7b`5iT}_awtT_ z;p)g~xFqpT-g;j?+=MaS7_;7&xILPAIA8war2E+kTzt@ex>^gHD>nPHp%5`t9X4DG zH{MYoiq<8$l}Fnnl`)RF!Iq#bsLJOC<6x|eaf2wCL$*!w!p1n6hg$0gS)2G^bpr7E zAx_4H@xFtt*^R}KZDp~|CD6hveW)X^zdfg?HGPo2g(0)AJ#*kr$xu((<Z$h9Z+UNL z{=!t#{A6R_?ZV-nvZ3y>p7w&tp_-|_`u^79PNXWUy*wRiU41QC4MmYq$nS5>i6g@y zE?!k>Nm+hAK~8qKqMY{z{D(2PqI5e-lLjjjhG2cCGHIkPeeq5yG+UZ(&l#vg#@n)c zD>CcSqdJR{hwHPt%aNA+=(fVx-pbU*^dNe%wK%>dGrTr|8e(Tfb|l34`%~Qzmmmj+ zB%)6m*(-zQH_}ov(OJGYSbw_Q3{6p99E_hV_EyAs#d})cDNN}sNNCTF?JZ7jNRO6g zhrS`#q&PTb1%<`<_yk#5>BT8H#0qVb;J`F}4Vx|?&<7+@|F`4%mC^sF$c6lRf*<{* zJNPyL&g0Vcb%S2^hk`#;H#jf-4o7XF=^NLTOQOt7>RcQ;e4NVsY+B;{E(Y2J6-AT; zKVDS^nmD`aN)l8B9n?jfG(|o1Whgiuxc{NA2(C(^jn^a$<puU<c=x7yjunNB<ok>x zr2#7~(JO6no41qTcG$UkXdVu&yW-|+sQcZ>Mr+JsW7J|(<YH6AQgg)lO!-Q0_Wh09 z5BG;ow{AZ@9(}modp6&+(18qAQo-MiH$?W8le>!po716hw^J$2zC6+?k8E8)u?4_G zU7Tlqymv9xKFJe9!fFvM5Ul{5u@6Sa4W%6Eg@sKHx2u!dD&sn<61t(kTWcot9~`+| zFwkDy+gdo@Q#I93*HlkOL4Q~AXn$pIN9kZ!WoJ{~*g*YgU;Wf@^Tc4|<Y3d_oyz{M z@{anP#){Og=FHmS$kvMZ4k)hXQw!t$lm(cTc{ycx_{8}*5pE_1p<68cH?D=b;49NZ zCmPcFDnULOoyGCp70B)4q}IIn-inOcw20=M*ve!oY{{ug32x4d0@S33LaGmi)6V?p z;z;k(XusxEGMvQBpn8`jQBy;_qP*;oU^kkZWwaL|CxVn86PzDIE>8~0iSQ_nhwai) z-3TOWnY6atgo)<jj$#D1A7xU!5{S+a`s4+rWkh6odHGncUxigcu3I-*VWS0H+H;E@ z6-9ntO!iA$5FSA;0MO7c2lY!#Fw(^Y-if}qp1zz&U+1Q8zNarjLXk`8266)yC7~EW z?{UM(z;@v`K}JSsi>SzcQ<0m=R89h?s(@3GL(2*~=_-30t9t6oK+89Oa}`&8DGx(g zysBVbyjKCmt`hS1R8mv2Pj_}8)VdA_%f`y0r|T1ETa!i`A?_tXk!!prY`Hmx-n^?J za=9^Tsv=~zF#?%uii9uA?Qx53F>v=d?DsmJuYR%L^=Py6WDfcyWk6tr`&T9#A*6<O zmk>v)sm<vgWl;qBDq@fo%o4kD$o0wIwF#aLuvIh0Ge6Ke-QSvmH}tinYs=9<(Zy6T z&fli7Aab}Px2-y%wLAtkI1F~?bT_8oM(R@9Yf{>3kUNc;gB=hFv%6YzL1G}T@xjW0 zuF^ZLMZ?{-{oNI#1GNL)6+NA$-R;HQZN<IqB`sAMgCorolO4nTbzQB+wfPBc)tTM| zv<7tV<`Wj?V1|7V!f+YkjcXwexIWm+Tprhu71mxD2dPwlZ59+B+6s~Q?y|Jo#mID9 z>7CNlilmT^qL@47$xXSiizFBHRUS*MLqa-oqua70D`Wg(y=)Q#oT)ArpefjJpGb1c zqy*8NY!ZCkW4v5qyxquNP9bh~QJxNA4wiKYtt^gMn@Vm-3-2mNx{47vWLujOf|3vw zy>?UZCM!SN4FuM}S*~9NWwG73&T;bwA6y*_n{IwyNe0OlbXJA&KjQk2tbV-%TKgrd zpI(a|82PT!JJEx<Kw@xC4MtEE9EgMiv+NgtgQK#>a+2CY+$!8G^rb~fVN*n2+(K0f z#N}hG?yWE9t1s_nAQz0&rP>*V;tlIy>tviqb(BkWlyf;W)K2he%MMw+Q`}V$K3WF_ z_@c$`!r9xo6HUlib>w_w>~c%&R%g;;L&Q`?@JwR_V5*+B+L<ud9KFyQz1E$yGn~FR zlDpoUvf7h8ULQVLk3@}D)A~!v-G!u{Lh^J&d~>Q#W2$#cDych{TAu(rH$AK4Jn9l) z>##>*C{($ykq$-_*t$e8B-xlc7%G!&jmndP+hMu6J_V}muz~}!>aI_1E{m-#jcTn< z>a0&|uT5>LNa$$F2Ha`OZ>&yfZ^#8<^|Y5D@TI%8c%ZBDPHS;jOHo&IVMk*gNDN$9 zTYE)wb19&%Hov_A+J&SeRDW4Mc0~bUVV0YMEH}BCnR%~Y4R*GkYAd{*7g~t~-YHAC zU785TFWL)Zn{%V`BRmTuy}^BT6eg4>1ymvdO*u4B7>up?QI!eA9;7(FBR8@-F`z8U zE8NX0%EvLn9iQOm>~C!x?0}2*@d<Z!j`Q-0bajnzaUnXn1UR{dd3yQd?Z`H^MbV^8 zic@hkDaj8`ayle<S>#aclRTVIvXa6~@b}%~WnluZ#RSbt85uYs4}<G2nAt>F*+p)# z@<ShHCTK7jO%Ig+Nvi&DeQ{l+uK+={6eI@gJ@75?T(Ce1vI5XM-oPC#Q00X_0gT}O zE(x(PK{G*ZJ`Q;nSh3*J7UI<w<isk7;I(9(w4~iM#XU782<k#E`jRvU<BJr$ekucr zN{oz(Ao+&UpThje3_8Nf!t}2y$~x*A8vpaIit@kTRx%^S1pAW+7}NiJOXc6+(${BD zG7qLiks^fMg_Q`=R2+#K7!_nj@(&}DggqIQoP&u`LBcA^nhZ)<QgC2Ul&}swqQWR) z5%x4+e-eBPeiea1$uu}B5>JXig@w|>s3dBXur`CzuU{stqWbek3=J9n{bwT=uABXK z9ewdS`odMyi`UIBu~_`hYIWfT>f$y1i%b?b1ide_+FiI}coA?Jb@8(4fAHH?li#kJ z&_B*-b%D{EJ~CPV&Vs+j<$Q_V`8Ou}-<fSMvD)1f4PsMH=21;z7WKcx<?uTv;WD?= zB_4poC2r@d2#?1#KJQz?BsR$~Hl=7zjYLu790kh?1=|KC`xXt?E?w^dBjTuO;DmX| zj0JVxDtyV3wt$OR!bL3q#ENyql113GMc5RKR<t>rs3q&@1v;V@2vLg;QL9d|>rQd& z&T$*g@hkQ*vxMk5+wd8D#1uYa+BO`SwF;fKAdh4GdrZALjojLF92?YZt5mE@6fFxB zEb`^Cc`zziz({|PHP4koWl9<%qI!uUx(PzsaaVz!8<v+?Z7;FGKi8K2PvmmC$YFnh z)#f6b4WqCRBfs}=*H9O(8vl0H^tY?13)jqk0`=Q9%!O+h<l=RU-xzThZ&_bt!e3w} zT;XzI5cFk{4ZA8#yv*yxAn4Dj7$c;YBVw4(p%}v;<adqB=_;Ew(0Ga4=?b^=HE!n{ zJg$s_zPH3fxfEkW46-H7%2n}AT5erh9(S}odvty1{GopGXBoC&8NO&0xoi=>Xh~bN z4qvuLB9^Uai`dY4^N?vX@)#y`0uwrEL7Bu-=p!y{#yV_{5V`Cav*sAP<`lPPAH9f= zn750Vw+)}Qq0L!`&02@eSW+g<1Nu<JZWEs_L)TUvhdK>>wW@WwvQ>!!wh$nXEtJFL z$)GdEjZ;MplEn3s#PsQ-kTw!Wml&4|kakndmr>M*LCEVGzv~4y!tdNJ48riz_bRW) zg_{-^ZkYehXmODNbAbW#8{h`!!gb4w47lGJtuL_PFEH6&;c&Xh?tG2c^D4g|gJ{St zsj#a;!HkmBo03#6wG?5)A|9=5E{zN}`RH4sfy|;5W)aFQkznMe6qQ{ennyi}Upq}$ zH&fQUT-&wV&}Rr0Fm6m5Gx8q+_DllCL4auTv}M?$Rm6&Q^qOVFGB9ZywF1CJEn9^H zg|lYlanqm?RL}^TG;B^9!32z;14b;!6FBM&K77GGYQ-UX%|2=sAHIYSU$hCE!-Y;; zB0w^A8b_V73>`xU51EqsOuV}c+&c7}nzacvYBrTBbQ;SPu*GtiTp6=Waf4(bomfFF zK#ZVvtblghH4%R%De`p@BC}M;Ey>_3LcTY|NEbL=FY$S@%7!va23_KEyvUBf#7_8~ z#qJ`L%|!;Qi@@1Wi~Wre!Ckn4`;FE9H&#am0iT=VlnWdlR|JSG@^Lq%qi#w^-jJj* zO3^sfGsMhm#m#F(jf%L`5LTr`F7;F{%`^^Ggj+2|KsQIiq*TVdQU+5gV_B`@++pZH zVn&`qhs>ZurcptYKps#CbeaWCVnS!ZfI)Ls;qx}p3y5vZl1<DKJ{CBf#Zo6hgC>E) zX2e01KON=)!)5`)81k4EW!jdu0I-W#1oo_{b3mX~=%iKX6p#l@;zDOE$dj0$F*DMT zk>7xkXP3T9lO~~7-L?vpsAO3pi_VrbO_wl4M0Df$)T4M+BY9LKco5ZyYeIgvB!XBK zBADc8H)W{Tgaeo*Lm9=$?8-5GS}A;5$xKp|EBwB{^Lbwr3%DsAdYRwrHx|N02K)s^ z{DoU~7nlh2m+YWECl+bybz#!){C+%oS-iR#92%)y+PQ*;#avpstZJD&x&@M$8X=QX zKD~T?gCbu2LJ15~D`(lHVSh)-wnfIeRsr9nVB4r@*R18<V?-J?51Ye;FTjYR%%DQ1 zO-bX%{v*Z#!=}N*n6L?K=nRH32X<^5y=oh~1pW@p6&o^P7C4Ft90d)cfyJM|1dW=* zn?Ym1lQne)1P4wJMr+y(0_F>30&vvXpPHP)lE;95BcEP9_fAcxR&{)hDy~$;s#F0} zAZeT_s*4C}NAs$O^QwjOsn7tI`F$D1f>;!z*j3|zGd6`7Zq+0{%~T=dJP}kOzkW8S za>7-?ARf&$KD``%y<AS6G)B45-#HyGu-IQfSRF2~IQ+)qe1VOQs{%pHvJt<F1oIjc zaOq^TtES$Pixbo@6gDa6)XwA9$rm&(6G2sqp{r$WTGX7oO@n7Kv{fu^&78Ub&Q8tk zwu)1mnscYNXP=(mka5ts8ITmdfQ?+j(&o{W8I!<q<G@kVpfLa{c-)MPOkgNeRuOX$ zFmO@xxQICm>J%En0eR{tCeZ=IXwr}waR|f+lme6B>_Bud0)ccV7zUUJVd80vb`eW9 z;XvdxPz^tC=+&d^-lgf#tctHyv8_?EDw9LyiRq;YXh(Cag>fiSc$KIKpGw#j0e=RO zKxX*}X1NG%wFDl`bYX)6Y4dUsvtnL@98T>tMoAi{O0ukFy&}F{&8bJ)x|v5W`=)r{ z1vaPOIbAPuxctuHagp8QBAe$WZX&Z{><#%?KD{CdOdYRIE{k0BE$Ij@jZALsTmYYb zp@2a#P$+HNtl>Feije2+k`8PW_HE*}FtmB2fKff)el5>#ZLdCkzd=LNs8QgUN$>>F zXil9&11K|Q0P>V+z=Ubws7c@;U5wO8uwIMs84PV2OP#_1C}7O<7SuT_$`m$u3`H6O zCDPquzz9%?C68N#On~xiXb40RdLXe4p9ixB0&T;=tfw%6Bfz;S*s(Xr@V16ii<*6t zicOWGMUj+Aj*xaNhZ2=pHi%O;m{X2?RlxtcaKLr(5JoBL4XIEjm3UsmTtSlp2}~Kk zVJ@pu9Fu4mk8T!^VSy;NM%A@f$)#J;vYtmZ>zV)&xhmjyO^|qz+v^gq?<HQZ-?`kb zh=g)z=dq}y@#+;ySu_ZnRPgE*+?0uDkx$}KN#oSa5l2-4f#Q~RvV>L>@~mU_iEF{R zOU|i7%DzqPx>fXw1#N+Du0T@oqycdRf`|!e3_>utKeON|AP+{<z)6#UVPjauG6@)j zCvbdbAt1<cbjSp72-yxM6vRkRPe5zH81M#W39S6&a17oA4gvHB3jKj@!=XUlw0SW6 z<dBJPKL9ic{As(iYC5-SIkzd}>!i$!1$C0y6=<AF;k=4SD7OOTsvr?Gcug!A+}}-E zDwA9kmwF11PA0c*CcjZ0hh{35T822fQq;Uk!n#r3zC#Az0uaO0^5|q=6$@jOiGdh# zk<a(CK)@BDkQ?%G-1>!*<~3Ye*+Ryp5H(=r*3M&7O&8EFlEBuBplhWpo3wm}wf#pC z)6jWb(w1xfxnIR|V%00pqDOAI=T4~yb_qL{5i6Lmc{-DU6ZBY295L`4`W24Nf`0{- z5kq3Ho=>-dPmi%ruL;P7I7kn{!J`=RBsOHqB4i2#Xa)X`It76kO`@v`LNhvW1RXRC zqd5{Z3gR>aXBjX8BXA4JASf2J3haUU^gX(?UE0+hn$#Q`wH%w(ZR;gX3k0<i_|#+h zHRAZxB6wA43}V4og##|~`CJwv-UI>4L^8|Auqwu}t0i-4rf}<I@f(%O;+kb}P4a|x zIee?Mb(0vjRuEMoX@xWin^r+=5H>1dS4(43NMu$>;Wj7|!PH8k>m<zU1Pn{q)HC_? z3PsU1;+Q&!!V31?8lIzOp)1yj`yPc)yo#SX=bd_%JR;V-A~$^qZhjw7_0qTKv1`_u zebSzF?3zX75{5d5B2R&B8~P6ee{_(3CN)9hh!JVXz<<Edx7WzG*Vu2sm^cXW*A$ou zfE?y0A3<Zl2VH0(lMq+HuK_W}zI`UXJ*L39Pp`3ekFjUBq30b#uP%5Kn8U(Hg2v1P z=s#@i(+2`nvu_0HX%HGzZEK}W3xGLZwHSWQI6*`+=BBvcb&<epLZnN4evo=Fiid#1 zx*<ioDILKi8^x*^!>)>OLKrnJmB7|XS=38gHi(&3iI`T1qAKNV+Z7#q<Op5z_IKp% zyEQ$AmF&AkF^wW-^^%xI33P)rrcn%CC61{T!_-MxHH%>y6<zzaNz<5^9c<jTZ3=Se zka_Bocjj05j8yX?wE0~~)7zlh*Flx9iKWjxa_%~&?Aax5flXs07D0?=WV#r^nt?+| zY#=2xBZEy(8k2^N0{RVz{l=t0;{X8oF0j3B09}~A{SZX3LE|7V5TKEFpOII$sW%;n zk;iR4=QdrZR&B=?uu)yN4)~0TZ{IH(E&fM|x^A7oAwbTmLc+8_Kr?|^I)qa(oKJ~* zUBKg#P|#(e;LF0n@Nh*Wgh4!vQ8N6NbmT4R7<NU3OFfHKEuCFGli#3N(5Mt3Y+NpE zTrFwdAde8bbbKbXyeD*hCZw!dBrThzt=p6wd!=x#V%P>rt7c{AUcI1c^N2O8_#I5- zhPuy)vP+My->7l$ES9#4i`lVF+{dTxIpv;smp&$zzX+&$MXGo~EPYBUedbem-#zEZ zDSelav<05gCT<-UvkEMtsk6U;p(1lw$}D&~Oeiop3e*`A`wfYGMx;JtFl)~)$U%S- z7>#{;Kur)4=<4$Ufb?L#(F05xy3r}rA~dPv8#D=xnhs4`&Mo>Lci`tiuol5|+D&{1 zz>+ncT4XINL{0O#Ric?BgIT1=2!nvf6<*gXB9!amR0hfLtD@8^qM_F%!f!}MGD=1< z$;7iNB(o}}uqdT)sAaIKq;Y6u{mkjgL0ocH?TQZFy8cso#A!9RAvt`fuvsmaUWvFx zlb}(hEUs0}b678M);{AbsP1!6!zYiT$G#OWTyq}Sr=Hp*?BU`zY>~tro5Wq4#0{II zO*>@AIqlFr`^-J(u1Eeo@BI6oxo569$Ih7t4#=);{DyVhIsg~DW)-svW^D<GSh5OV zwu0FRZ2?OK3MY(6g9iS+27X|c-C&tuminMD_s*Xb(v=7l0x<xHCYT^(*c^Nz5bNEe z@7Ag3(xLC#0S~~up*NjyG;s(x1ZMzt3{-2ov?+lFn-}w_MzhLLn5BYY)^=Uc<BBll zvM~9kbnH!;I7aC>CfURrQt+H`T|DZVSOlX~46|I~FCuR#B;Qm>VpRp7Rtgj%s&2zt z{!<3Q3p(DD3U*z>W;GI)&2ofJNo=Duw#AUVgiky3Dt<<+eCJ#C+`sZgK>a&n)jRjX zXU;hfoU%`xb50yG4nbLv<w5>p0keaIO}nHmLh_D7%As@Gk#pLybNVruG4O|rUZ*2w z4HvUQ=Pzp65{X{6j9v!g#)i#9Hf<IR_B~=q>Z5DWr`y=K$I$x@kYV6SA0Zt4A`pz2 z&JAf4d?I8kzoIbAQXu=rhD<^nG4&gSutE<oK@f_@;Q>V)0;j3x(Wy#kkVF^rsmC$P zhFlXt{F$XmjN*P=S~=HbVy{U>-;j-ER!W6%2}Cg~Bs0k-T>nYnP3ah*mr*MAhD7uY zspwm>iOh=WJlc@uwaVDsk+JDka_Et<X_c~URv>g~x({o3jez>py~ZqK_wdM}UD^pg z_1H1%+_(G{sp_3q@eB9-CoVbn5vQ#Cgw#VI$Ba6Q3Y`H!%z&3biDl%fP0WT}(ymkb zkyF|MA!(bCxPy=1wvJu@6<5$SNC{^lA4J3C_vcIx5*u^~%z_~b1BQ$PAR_mp{QK!) z;#Z6Y8F}{t6DZ;Unly%nZnTymP)3-s4PT%mX3-`Z=F(Fr{{d6qeluW?ItefjoiL|N zKxl{m5e@q$AW%><o?AJBStbPXU`8>LkZ~D+M<<^NY*i(VRU?y2H<wjCgH<^dQa1*v zSO)2Y8`233QgPQMVy{caU6+o(CY`{ngk-R)=CY~f@#vHapzFkNZCbul+I~~U<Q0R! zc@6I|7)?T!jYAgE)K#0LeL}{mYu*FT;-}uF&wa{XxaB{xPd~Lu-nUEGvyR!aidv(S zm#_)u3LyhL9oQ$hJb38>Q6}TWCF95;bq|OHk%DG{W5kR)2h2l$4Vg8XGHp(o#z3x3 znF63g#sH|`5j1%O6*vqq3xd%6Q(2^8dd@-`F%KNWk|$txY!kLXh+M<RE#u=?aFL6k zQ+?OldY;`7lgue&FtdiF5=|a6_U~7=uNN~b5YS2G)kx$(l%rUrLl}gKLPq5RhGoL0 z6+C){LM9bF`bC_2g<SNRR|UAdTZ$<RGD(2zFv=!hlS}~i7^D+#%B3(XWdb-g3q`Fv zG<@f@{O7d68+wf^yN~Gj&zOd;=@O@nNHaR#<Ay<Vn5YfwggyJrGuQlwewDABvXOJ! zlq2(~HB9)5MfjRU#0t;_%z(YRq#xoFH^JY57~!Q`=BZQKkweO!W7<BvbWDMuvSXLH z3u2_(G1Oq9SFEB|fN%@i;=civsjyiP6Fsq}Oqf$AEnt2E_-V29B3H;1LeCOmItN)O zb-^Zl1qgIV-mr^ZHT56VbZJ$wZ%}t_HT3TV^;t(iO>q%^mx^<X0-;XYyp&rrg-Jew zMVfp|GDsQ+X<eJFO*@2839A+!!!i!tA{Mn=aC3aRCCp0cH)N8oO2l24O1Lhacnu&G zPv;MjLzq?b*fdIb464O&og$X);?|vN?qjlqK4sSt1;+t3uL%vW2?Jn~ykbb4HSnF$ z_nSpWu47}j>{5>{<9BdL`{v<mR#6*viHF$86);Hiuz6hcnqA_yBeLzBy6>KO;*opq zo&Ufw<<KT(6AaikeiM=!P$eM|p-T}s2i^V};eqZA0pSZ!TfjlRHEaPJI)|mgI1AG} z+o(lc#JnYK)`B);5jKYnU4-zBCQqS)r=YfD6SHWaxMrWY4m=wW2h?3!z~4axH})UK zQ0A>8S1=(ndfo%7&Yj9OHNuA32)jxww{j$hB2C`9UEZc$#i3ipu}9UpU(mFQOSg#E zuw2lzS_oCeu2sOMQN*cT${?T0D3i=6n{-n#>#9sDlX5nfZn>awy|{TRzgeRYwp9qz zB4^(xZP%mXI->0}t>iK+L+Dj@9n~Su8wD;J!$_RhCrzS4=1s|SW=QA)n!034nKz@Y zxaL0eD17XkeN0H*vrjp+M~-pv2ezQq(pTQ)&wL8*xn&&NC2ZToZW0o=!H9vwUu>bn z=0JeJA87EG7%iff%xUvb<pT1cY7M~AmT=)K@Q(G*iYrWwVTxxSf=r{xlQ6R}f|SN@ zz${<{cmoYOA{%z`%h<3<eeYfkhc->ec0I2?W74SU&oY|6@1VMC7dSy-!z@0X6fU)R zPSrSht2POAJ)cp9sCm7NbsHpe+<Ks@5>fL;fC#!#4BIYY*~zV2&Z3+J7AuNw5yiG4 zLS{{(m{x9sDk1YG0Zg+rp;z-KX|ncx@{R+#{&OHhP^F~p9eL*=4X<&-fCY5ux^eJ4 zI&8%}eBA;JI&KG_cz^}p7r*14|G>HMiBsWI@8Wy@1xNnrOVNq7scDVQ@r$T12qi~u z=_fAfN08vSWu4h2?pPx+8^0_V6bB(0#$N=&Xc0k|9#9AB1Fq;Aqzi2t%8K;z0=%Tm znnSz^nlvGfz&zK;s~3#cEO^3-HV>-+xTr;o@HuqQxPjMzrt=*gj~*@eJK7%IP$tsy z=+<!SQnaoWHb8RtbTS0=GDVDXL`<sr^~-=X&>ELs@lW-YaqE||Y7|RYbO@R>aO+iZ z>Qo4$nuN??BGD>i*Q4e=t>8K$ZhJ?@p<mT|QrUe>+P+uDv0u?;7}TfYKBnX{1kXC8 zMT4LfW9pW1=&BKA1rxnvLR~WoS+<PZN9@z@dY8NmsQKWUeb**t85g^QPuNb(=&Z`k zDN71(P6?@v_Nk^i*Cof5SM}2hXYI4@xn!NWW*kC9am_e(Nj-K+I|7FYPSYx81x8#9 zB-)!GPixR)_|pIIM<)!Pfk=qa=0Q`KfJv19s3~0kfhJC%{6<l}!zMn%roJPlzN0Xj zk;b89YZ5R9q64{Udi3ge_G-FysW`N%I<_ehnicGtRBW5YjEbS?tB9+TKox@e#89<B z8@pCMyLLX4YPynr7i7jdq#2`-MIFBxG4nQAT(>N~7a|4Nq^94joD(u=61r&;x*_X0 zpy)b^qHe)UMVC=QOpB_=n3m6+oc*YN;Ic>YD?-jAtK?JL<WtZQng$<PH4IrYkKD0I zI`pf05#0FPHFMuQcF!_&G&(e@6SitrA&sd4)$yTKQK8lG<ld6#!P2OqqJ)x?+YYH4 z_Gu?hDMwBz`-pSe0pO=E1k2vAjoW|`@*LN!W5{{zV%Dv}146+$Y6YJ0(QEX|H7uBr zXMi(PzfqtO8#sj`j-&j?=q&m{>4pAa>@%eAGob6$tL@zn%z^q~?hQo@4cFVs_$FC& zr7X5u7E>jIm{+RWHc6w)1@&^oF%1Ag(>gxGDgl!ke$z%RpBbZ|1vA>ZP11=~+<~&o zkgEGA5F_t6sO~dmO5Ij+8PO&#pu*_1nS^fXlh+(`o_m$PHjCOdjo8wstQv-H5HcV7 z*M6q7{lmTdl|$Bjo8&`u__}rCp+(#tJ_R`@AP06S+n(9`PMMFq)0Tp4aKTuuBu^aT zX_@M4)sjYrO#lTU?sYMq?KyDrD5@*LD=f0qJn4Z8vhMsdnE~?b5s>XBct(8uj&1A~ zE*iW7<ly^G3EPhGTQ<?F_}F#(xJ>|1_$#IWuXfRE2)IK_m=Oli)o4zdKog<%It_&~ zRKS>l=a9B*zn0s-4HpQ6>9<MXn2txcqD_Mown`FJCSq79hpiSjDdE-1<TrsxQ7dWD zE{*F_u<Mh>4@ueggZgv>A@A6=PCPOT-!PBb(jrcaTX&%&4$Npf8i?-{Dr_4YbBK#S zv4}a+30k#Izvo@`*0cPrOUWzmnvY&pA6!dbyB5Fjule9v{@Nw)5ma1U^B=nxJn|`d z=3VyEJ@2k<)T&wZ0VQ{}9SIIZNjqw(hnQ)R3=}9B&0;bk+8IN!)GzeG)xrILq4qW5 zj!CZ81j?{M#I{X5vTd6HbC;!`(%ZC++s1^inT0NyhpkvdY*<8q`j!d6YV^8I<SIUT zg8)$<Qu62xe9XFC{1zc@3rrj$FDMI5n!pClV1wz-(a?WX$GuP8{*JOuJFF}y*|(}W zcW8O^K-I!HU`)rmU)7~k#=1_-xEKKrVdX|hCx=Zj0el>fezl-+os9JzH5X9XfQsih zm?^M_j@ZIPZ9C`O_b7VmoPFOh>z;ezQ_qs;u6d8#@*jKTKldznX&HBbir&I!-M2zc zu!%=L)gOIpKKWLE^elVpTKK{?^BkY~z$)<oW^=&}Uwz7+`By&oMoOML<-zRaG_q&` zI>6lt!o=EYlT1|e$ac{2W2h{;B^8eS6Pse)T4O!SsD#Qe*JKB5u(5Keqq{q)0shg3 z<Yg=B5{|Zxr9hzzlI}HZ_?l(phE>!iEDcydoh*FAB6Qi3x`L0|afsV@h~Ku4-L#}G zTZL^{ha;QtNwc7N17BEMnZkyyScbu8R<V>7W8$>7$AB`SL)^R?)*ECj8>OupmF;h< zI&{h5S|l*Fd<I4AN=e-6DFQl~%#snXbfM-lAcwyVw5fVdnuKg<z*K@bYf4>5(KaxV zI~Fm!E;$eV%HNP1KS%ZaMZ5it-1q?rY5q*Ad+S~N0=|c$t>IJ72x<4=17_iyR`Cax z3CHNzBb$`_wkhXU@rPE4$1eF#9dgcnDqe-Pf2Fp6CD*+TZulHr^Qbc?VJO`b+6vUB zk@JIG8WB=Mia*>?vv9k3x;f)^c5r(-ak4(SBa2!P>=uPJ3O7?uBd8}Lq45q$yY>mY zuIWegcpS5Zi-CoJRa6M%Ma%F2yjjuKFq8!|SZWDbw29at#Owg2s2~W+3qUM3WYO4v zQq#3h$8*S-IAsR!lNU?_XLP-WwcUml@wbIdsyH<AxV4M8G;%oAGkCRfxzsZ`)iRhB zldp*(p%(=MuZo6T6%4q{=dbM4ujw(SM_knKp3x6j!bEPv>=hS(h>hOHL~WTzZJ;C9 zAnOgR{XlK|9^Lc5D2<=UjUTD4-+~%G5^Ly81lE6c&3}fC*#j}!CZC{V_6?~!8vct$ z)HQVEHX-fYull2V*-O`=XW^ZHMs)s(M0Wo(WBz~FR<?J=In6hvtc;Y$`Pv4eGz!T0 z3L2p~$-O5p7#j2pRmQ>ouwtrBNvK1Hw{^O=WmkD>X>vfCoqkSAnOpu7r?g|&v_qHl zGY_zc%zO69N49ahFr_gKm@^AnFeS|a41K4J{HL)Yt5#u~Cd65N?{O1^IAiQLWeSNs zl;Au@^t?t5d?t*EGX{QB>dphQR-HVWP#Dg=DNmn&-H?vEDoVR18h%AM?5b$^b@9k+ z;?%366e#)q;t%pWHRn+S-+2wU2_5elsGfj^a0!R_lw+9vV`DarsSC!`Mf<c<$L#xH zy>9u)V~7W~$dOm+V`}@CgrWZq@BP!S?xRc5YxmN(URCdLDd*_O14WMs6`u*~v{TQD z_wFUH9CM%8=REc)d+m^Um(=vFxOJg6%3-P|ezFSMD@4QA_W(1sR>X6nCVH$sVWm5F zqpxtdDypZDGEhYBNDIjHFb_9ZZAqm~)@LH|7N*Je21)7N{>6`6bB^#y2l%*Me8Qen z>X`#_Y!$U-7QA8_u&C!XspCFw=re8TGh<3x#8TExNefzTqw3CsTCO9;{&OhOqPE+p zJY*J@ZHjgST5eO?Zc`f0qte(;VdENJouV5uDL16zZb`>NLF$rF$nSyx%0)yl_#%Jc z1zyrcZvP8hesT`|Fz13K4yIj@%|QVGMO}sXYeZhcgl}Rax6u(0Ea>7wg>RUJtr~}{ zKys(%HDyR%uunVlFMsb>``)eSnNQVw&x*Ish0k4!UfAb6u}M33$bM#-cy5(^ZlC@T z9ll{g+p<bHu+2v9N0)E(W>N<7gH}6I;0*blJTgH;j)KwdO%EEWiOUPIzLOu;n;(+u zrl0ABEu|3JQ~XQF_;iACmKToRQGn)@<!YAcLqMtyiM5}+3eKET?t%@YLzaOgv%qB& z;tD!&-PnIo)p1DMZQRIb&V;yx3S316fQws1wB09E?7_|T16S}MY+NsBSR-QEC~Vpw zih{+7MnS_m4)r2o!wPQALJqZDHsve^siaH7VZRH8!gzr{<N|N-Z@huOa}zIc`AgW` zmayrPvh5YN=#<9y%Q+7zfpom4)P1Lvy~b62CiDX5P+?F@-bY7m8<1C}5c@$n=P~`D zbyM1oZt%Jmam6HJ0~5dNnD@v&=OHfT)T8v3Z_Rt3s<%!B&oFU^X3@Jwp=;>yO$#XC z$Lv}qZZu@X4rO=^l+%`4QU~Dlx|RZ5ne3>lP!?d{Qxw)+MC~o6b?5n4!x0D~t~T1a z74c1RF^)7<FZQ)d^FYkXLhN$<@J*49rI}eF<<I;}-}n|k@yvTbh(ENB+_R)@gE^_Y zj2ZeaYP-)U*$pe&4l39VDiKDM2_uSjL-0}-*DGMuBw>CV-iMLjppjd*f=j2IN4uOu zy@XS<gjG40T{VwIDTh%Oxh4^JStR<3Fzu31C;$N(FY-|?@&;d`YtT=@bre!#F{^GN z^E)C|y%K~GQTU~VVR1sQlJ~SBWeb$3<v*<*FryW;ph;R$_FB*m*aTQ4ouH!+l|1Lv z{Z~}H=QM~bIzgMJ5l5K#yEZ8gu<@s+k-Nqb8>Z3QuDMS<@}J=nPwg|$OOTAb!2(iW z0d2U1HeL}iT^p;fBm+$v%)|xq{VWE{pn+!0Sap00LM#t+E)8;Qf;NKDzL6HXE^0E- zPMFS=z^X9U>PYv7Fz>cV_spVhr<}*GnI}+faLat)p7q!%^&B62W)Xg1;Jc*ZvY<p5 zm$vMe!1M^4b^`bfkyZi2Rz8CkUj63(j9fZ(tm?%qYA}%~;nFH&Q7K?kE#y=yW|Yff zkc5~Kds!&@ib%vS4lfH)fkKesW&XfRe1Y<g6H+z<f)>5J=pG*Q9ezwNpLw^i)sT?o zfCz3xi?pd9vT97*RwK?Rdrd01k0Q#RQ-&e?S^=B7!P|O4TL$DEldvNN_Zhw5eeHlf z1Ims?{E0qg!z^+i6>+5GKBwflV4ZyClyOg&vLBOFJ5@-U?noc6q%OBX<FUk*ridgT z9Lwd4aQUK#wpyUMhNF(85kEUdUP4ERTbGa7N<r9DTRzlG7w({nb;gb(xuLfcJ^M2Q z`%?ot;@zsF0^L#}5Ffc`-SfzXip{Zm)&rN+r;bSv(ZSmawiA-rK~YqXkZ~7)Prsc@ zr<qf`iA$%EPrr>@w~1A~l0&nKOQ)7cx1Lk023~S%R^L)Cy{V9YLl!Df8P}y!uZSmI z7EAo8!Kf?3NaQ6U>Mto?<O>0a<9j9Xy&|@Egsi%OKu$~#uVo*fRlk`16c=_-*mhXn zbxhuEN-J<xHDFnnwyWqlqw2Y6Og%ITKSn3qN5!1!P<Hgg549+}rZMN}xO=F$Q;U>y z%d~qg#qV)R_wkv}w1T%CQqSy*9yg>>koo4s!TRW_+Njxvgo&DnjdmLB2Zt@cGF)t` z9IQ&rH<ei#wD~#E(!6@2++wUuN^oYB?S`%(ce<y=R57(LFR&*oXdpMFCy&~d<XcPg zCuOYIrrfnly6c?r2p4x?9e;$O?HLBG8V0Vbd#s9E4ho{Wxeab}=(cfawX!2>O)M() zZ0Zf{>J2cms@Je-)G(`7vZ__FYt*u-Rk5g+U6;$dE|+^<I{TVr<~7OGs}f09B$BUy z3`L?Z2}fQQ4!<l&yCe{H5iD7NqDz{Gsjjlegq+KSC~i=|Zb-y=Qp$Z%z-~eSKfz-; zEMz?)Xf-ZIn2_^Z)S@DL`e6r}ft#wnD=MT7UD~lW^-ztxVGwnQPJXCEJJ1N(MJ3*M zul!=0|I#pG+r8wyXW3`Js(0~Y|DDo#-jW(P*Pgl74ej8Q=bB>YTjO@1zj3T9w4RgY zVAtSd(-q{<;9*zi<un%JF%sm_6BN+k<CJE;rpeFN9Pi(m6^sm&P)EwbCaNOGYoeDr zQ<fW(6C$(BU^0|=7ZZ745_+H?xTQzh)%01HA%JO3h+B<_Sq=-B_H!HDVb^M7QwPyC zv8pw)s5Y>u!dT0!Qp2QD&7@RuOR*fr8}dchWC|GM@^8rGGDzoLmrB1Ti2#dNBoZ!* z#r=+mMqd_*x-1xVNdTg9D1>A*W!a3pWJcXa(RPeOHkAD4g&igY@iTnZV*)ng0{C$$ zk69(+nu6bwHf2YHyrn_jP!HagbX!vN-4S<Ql=s=t2|dvbJJAU{HjKKbMBLU1+sEfU zwJ(Gc!gHU>uU4rKyvshMjr=RF?~{KJ5?K`O)|5t^s0&|dPnv6u-Rn<l%MKP|x*^NM zr6I(nDZnnnep3MMnZ9;in(3Az2b(Gnm*mZ>Hd?ansnBW9zau4JpnyDH9ywkSIZz(e zUmRARkzpQjgrXi8QMa|d7nR{}vY(T|Ps-w_Wbtz%<|F(jeY{4X!7g^4c7#p46~L<5 z%%stDOSPU!rH)ytj#;^mMWqVZyQxsYC||;;P<}(M=!SG2qjUj-bmnzw<hpd~HOb_w z;>nlA5-y5FT@;P_T{QBNAmy@PC?<Rz9kyx}w_}@n42hjZ@{t~8U4yux=&`2mw{8@^ zXB>N=;J>Koziu3TVuZx*>CkrM{g%~&wsgZzwJ3)=VJFgFYYP5*ilklR*oXQt_cf`9 z*p$aEl^-1P-`b_W^soKyQTpDu<b`j;=e+LC{fSIy!MxX>zSfnz(2=w`l(RLGr!Orc z!@;S=oSVWleNW}-`Rv`8j7rV(wSla8?vf08e*Ifc}jgFv^Eq?z`NrLO$>&h(k~ z<fX2%==f$7?F1chh@!3=25e~iY-;%KD0{BSJ1<IFPYR-X`AzzH40}2Cx;b<^*>!-w z7FMkm7NAhAfkmwWMkdvIR?s7z%j%m7<+qe7m=uA_G6wk)2DyUkvN;U0V9)8-q>>SE zhgZZC=^jxu{)$k<WdWK+_zJy{k+cVJ$~bk*IkV3`b18W0Ui```@vbp-S2uJ=Jz!hP zWm(K|PMdaMk@C<We9toFp*iwGHRMp4bSUq;uRz?9^Iezl+>r4<Q6Qcv6ORldPwlf` zIOo0bt^N|${!dcXM_3oOK~lDF*X2B3Dma@jc)DHj^0=ohn|!oT)|wlDRu%KYs=+0Y zBURyRgJnlsZL{53l~L}M5gwU-xIsA02gmVBLk7!eQ&n)tDru-RW}zxJCz0%wypKzJ zYM=T57jqXyJymsEQgYjnaaa_^O^9Mf1W^P0CIdVMecbxJ+y=-`4s|<$NjjO@9qig| zz~n9UMi#Y3CYAbI%C)zYYZw))ZYov+jW-p+pbM|d<}%3UU6;weDwTd!GMzy>18f>7 zyaEnUD8eCr%OPRgJqs4Rj@+_OVY%C<<fU)fE1y!B@xSt|cx9b(--vpkN!nBL+eEaf zyI_}2xi1`ZpL<lkb1nOTNq(#sb{Cia(x>5vdBzhJ@}3I$SUddGxAtRX_g|sy-^058 z3atO)p8ts4@SfQ5cYV+F!-edfsiM2H`6maXPwp>%c(U;R;q=MooweE8&56>1EdPgF zLvLPh&fUqFt%p)zaBpewY<tT7Lc=O@CugW2WUD9p-fZ2&g@$`GrBPXP*6EKeqxUi4 zCt7~nYM!gAu1gB`Ytpt0!su~+(-A(C0bb()ZX-H)j0U)XMtvZ&A09Y#!KOP|wc1!T znprfPnA97Y)L{H+*s68Rs#Uj?DsL*5Fv{m&2ma&=uE`>KSEX|pWYVuor9fP{EFODF zEXE;W2mTA4laC2;`*zVgcJX^K6LL&Dg*7wJV&L#Ckm*<P+O6P8NYjtN+Rwg~Z=4Dq z`&7LNY5N}4_pj)_|0dRcqqO`Nsqqi@+K*n1Up=Zn1U7yT?fBcj_G5V0-w{3kBDek^ z)_;m0`G1ha@&BFQaj-d(b2eLcIGXeB#rD^)=U={@ef@Iu;@Rxo)1mXz{_TFa6QKCz z<LTAGyo2#lxMlTV1`f_354O7>E?3=OD7d##e|Nd+;ab(^WSwj3ecOabgp{YaxVt(* z+X}8LGWILdge76iNkPmwzxgCDYMjS(jLUe0+jNu*F&^YJ?B&q!;RJv|>vVDG+@S-Q z1kb41%%;%@Oah<G8ud&XwT!A&H<c?{RH}a|@rHZ>gM2=NTsosn`ZWmzC<MTA3hX<^ zhAqPe6{rOP%%P4Exq(lDHJuZ`vR9PW?~%9v5!3Z|P#yA~+VYjs@;$ieTUf_G{Odlt zmAvq&d>h*KhhObGSjzCOeiz*K1Lkt>C2zodeXBl^TfURq|D^T&7qQ_Rsqte#+vk{u z`#aP1C)4G7<3&sT1(R*5dvnzvUoS(K`mNENyK9XPj>o@zf4e_hyEc%qJzfb{t3TQA zyt`iYbhjOOax$<#Uh!<J{cNHB$!6{5NIN!sTR&h&-F;2db63r0SBkJ8W-~8hH6w(b z7Q{>om{0SfCg?C52LicGM!1cKIgN%m4f;6^df4^5*?~p<Zg^(Vxy_=}$)W=$-3k=m zQg67W4iq*rsn_08tp*lvDiz;E6pI-ZiWubb0Cc}7oq9ti4FfwoVS^nRHUz*L3alg^ zIHjGsq~CSVy6=>7?3{7#R`AR%|EX8;OaF>@-X(9mOJ4@oehh8?;aBrMr1g7X<LBU} zuK^8TDQ(|FJO83|{6(z)=2H09xALoh^*7tJ$GFr-o~7@|t)EFP$alwrZ#_Nz_m`@+ z=iAP9`(}D_w}wj2_6A?RSX&#-efwzr>9hS0@1OniU;jMW?R@j}{L_yY4^O5}H}34M zRO~I3jMv9Px2pZIlGFL7vzfB_J1shat12D~3QqIV_(dt(Wog2SxXq%N&61e)l8EJ^ z5Oz)gJ0n0Ra*7{4iSV0E@}s9flU&BbTwu+{1005Z>;}DT2E9MW9y*zNx7l?&AX>9& zwJ?KaYc<@`sJW$9&7xk(tX6hQx#Xro;SGgCMukFV#hhCTS+LGR-_k@`FefiU0TLGt z>x4VDbTdA3$vCr1KC(_cwTRt^)eAh5d<M0BC>?kdKJ_hoO>X!?1${Ms4e$7y*7jFK z=idR1KfJ3y1-JYW+V)=_#b5j?zxz~taLj*A$arCw{@yV9ZE)WH>F(s|?$Cqd#qEWz znZdfr&b-sjzBez=o;+TC^XciM`x_6>=01FW`r_H~=kIU+{(t|!zyH_YUq0M_a5#Lt zinN~2)a(rxuXJa@{jVFndAq$CCcz_;&Kt^}i}KEEvJRUvgbhjCRSBCVfQZ$cu*IB+ zC5*Fz=F`9&oj<clUeobkX3cFp`qQ{aIShw5jrutZ`q=cl*$jGE^}1R0=t(y{-_dDe z(`jJQs$){GL4Za^)oLb{(p#WLrNUb(xi=KEOn;skpzoNa?<b+l(2TMKWpQlyrhU?> zeezxF#AEZQ9c=WjUCLdj3@98ub<DhPmwMMV?}=;PQ&Q!}fU3_<*$-Xwo`LS13txMc zfATK>5>WS#fQG*U8oyE6{`9T+f-icXi&PDt%r+j)w?d1l-HFPjuH5a(=G_&z7QXZ8 zy~Ri8>yMruy?X!b&D%#GzP<bL-+zDk^UaU%uRecz{_@H0hv&PG?=Cz&nYh2&c|2Qt zywY&EI=tMOQk+$!<<Tc$za{UqF7LQ5XAcyvi`j3A*sTlMtO5kAmj$d>_$?QCvB*3x zmJS}w9Jl!txA_FGIbDnZKGZm;(J;`+VbIS7Od9ra8r<R3Yv<5y=b(>mAVxMVaE=Wu z>UFGYWiU|zFsqc@QYwPAKAXrDSZZ-e*|$&Jwu|3(OoBBoz?n<hJ$vNTKJ~6k)<dUE z`u?8>b}4iXLV4LTcHb`L+%@~DZ~6Ps=07Qoe|VR^b1rz}S_lRFw_atRi8X%&H2moY zRsG5j<U9WzS#_}3*S<4avC@;jJzTywTfaZwzCKzrKU{kLaQDUgC+Fw8uRpx}`2EwX zFYiD9^N;WU`t#}Yhp%3rzJ9Xx_T}9dukJoX?oRG6wcOhsI@urETdLiisyUqR+nK1H zZp+Tks8x4am2}>faa@;jSQl~F6afzHH$@${h3wV^@oNG$D+0J>{-5BrSmd<;B4@cU zQ{3nYZZkT-OY)dbaGQ*RRdbnuZTE2*LZAT`*~zBY#-`W7ri(PQ=`^xx)w62U09e$j zm{m#vu*nlPGr&TXb>y;j)T(Xds(r$ibIO4W7;5$dpTcM4+D{>MpQ%mXgK9q!E8lt+ zz3?b}=~?v3DdQm_<=i^)<fm2NcQ1V9R`kxJ<b6QxUrsrn2$}C}(jfnNiA#8bM&3D6 zXOMSK&wl*<=eO^lK7M}x`s3RVU*CWF{^8ZT^VgrAzxw|1!?zC~zkhi5>DBvBFJ8ZY z`sv4qAOH3JkAMF4{m<7QzdZW#?eW)7cfWo-{rc(Qj~_4o`s2;Z*C+43JpJ(H^FRLj zvOL=<Z#^pRbtLPyE$Ol??zAW2yeH|jE8(;&=C~tbza?z9A%x)9gl*}dYtm*}(0YZ> zYLVA!j@NRA2MZ2ziqC8k44Mx;!h;&-HU&Kna2gGA827Lnb+YJpaOk&k>e4A>*KK0g zg&1AOrd|Ou)bpOu^O-aWg3V#`^f6=}MS%r{Me{J&ssme}b{$fVT{F%dQ;}oW?0en? zPrM4B2Go8EsQKt${=vKWjeGuc*YXc``R^=}Uz)`}vP7Pulb##Jzcx#LZ=UkjGV_CG z=nGx)^P0xqld0^ziH7ab>fMRz{i!nOD84+9yD?t8HCuanyl{LpbAB?lzuvL8+WFvM z=E;NACy!R2J==NvYWK~{&8LsokVg+!A03aKZFe4Rw>-Hw@#@L)>&I(f-#q&I<^IOP z2q9od&U;<fb3@kSP|Ed4+Vx1r^+?ibU()G7!f~HY<4;wJ5;leG)_$o{$a;+*H_wlo z1Mpf*^H@xCW2b;W0rVKZ*%+|MX)?rZ+Q)_JW;gEQLJZou=xF26Yvs^uX4h?G)2U|B zsxk^(FbQ77(qIj6iw>~n<Sp14@0xWEyt!rq?zv~*cg=q2nEAjV?c6QziC57}kAi2O zMK7TW?OE{3xB9bZ)i>L`Pqukq2t{8lGd`Fkyw#6<tsVB<F#4H#_;Z)!gXL}{eYG_U zZm!rIE?nu)+ZZj`ovK<NEr0&(?Cr-7C#O@#hZCQ_e_7w?-&yawyEFLW+3uUq@7}z7 z`0@SOyLV>~?k(Rv7&_k{ytmu`@M!qa$@uwB|AWKPhxeBEHijN;PL`y^E4a_f`|inm z9?5x}%DJD&x}Qk9A4|F(O1T_JI`1JMNHM1!5yx#|`%Pg2_{a?r+jSw^B|)170qc1H zKL9t&Z#lthG0BI81ah30PU8R<s)q~J%WZmx%jh<zK_`cP8?eY_(8{h?%cfgn8U)Lt z%dlt4guG%#*}#NtTSe^SqW3MMcW|-$_{1YZ(h)x40FNXcIc7d|$e_cw^sPt1OV>PD z7I^^=ew82nYQ8!ZzxSyA?pFT8D&w7L@@u`QS9%d|45MCZM!!tX>e-m6djIO|(}(jn zukOBkeg5IYi?879Uf+NB`TXt2vzIUTKD;^k^8WtwN9#|{XU|p}ADs-p|MKX=`@{FI zmOi~(fAtKRd;N6b*~6LFPv%}fUwrj!9v+^Z&pvs&_5S_CZ(r`k#C1x#@2C>@6}(Rs zea_{*PGvn#WV}wLJWpgij_G=IIg)TW5OLlUcH9wl*cEfw6?FjPUK1rO3*(oBY!~Si z;^qWxXLzlr`79;{%*O?=ll+)bUi1Jrst@6zf9d5i>ESZy;L>mB)CVOtaOgMK!BRbJ zhltvCOgMB)KX=Qx@1Fh8CF_A})&sZfhfZnt2uTo29ylQ95I*eF?z`kXg$)D%hn(jw z^pNq+Dffdz_B-FIKfLO{<8$8I7kqcD{KGo$PqWyUDCDC?*z2;Yfgi~G#g8BMzx{ae z<?HKz{QbwD|M>Lf+pBMXzWx0D<>!xw?_aNf`gri}&Gx5vd#@kPe1AUs{r%kck1PN9 zbnw^5qpz>GKfm7j<J;XIAGW?epZoD<{>#gm?=L3*csc#&$BpkF_W$*-^TL`rakp)? zfFl+Edy1qp1>&)s--&|nxtz~kX*!F@iIm5Yr2CPC`=PkY0YKE{CzJLNuvY=Vp)h_~ zgwEtFzx9lO)szr+QpjRT05i&GKFDL%4>a<c^>Lf_@R{D>HSXj#?EERiHVfE!7&dDk zyXKm->zuG<kL)?59Xq8Sxo6(>$$#jb_sF;4IRNo3df`|4idg#EyX1vu(R0}6>|goO zx9q(yWO+qjtg}DiGQOB5y|&7F2VT!K`IUL*TfL+&#xWm^B2HH~mjC(V{OhMjpWd9l zdA9ZX@z#s8xz8^TzI-_T{NeD^n}g4<Hom-Ac>ien`EmDy&AKPs^{>vmKD}A^@$K-( z=Yt=g_P-(@cfWqz{NwH7x2Hqjp7wpX-}UaS{maAtFR$i5KAHLR{Y+!`nz-ktcF3`M zz+I)la|O~}Wzs!G{|E9u=W^aa<GGCIsk8^M_!FK-QXYHaZaZQwTOv;D!j7wwP8;G5 zYod0`Likw$;Lmzm(0Yd7YD&OzOweLP0E-OsVTOQ7UNfMvn-AU1ivk*N^B8r)-Xnl{ z=o~I$)toYir7hdV@7gEBzNd58ZswGB=9Kz>>Us;fHn%O|y9N|1?ohNvN^xq`g}Oj# zffg_BlHfeJLvV)x2@r!22oQo6_uvl2rN(K`Id|^N`}=0*Tj{+s@Asa0KiJLh$>s?u zD{Jp1d++t1dm9aI%p$0yZQ7<SX4@haHe~GDW$!!W9NOm`*ybHN6#lR;{PSJmZ)Ta_ zpQnC#9R2MUvV+cSr(~tJRA;XCRU=D%gqhCbk%r`v#+0Gj_%2-37#*`TSU%HN%IYp& z=r3FDEf{Z3f=b_`&1o}T1rsgl{k8Gqt@#J*ZHMb^Tl0<kt8M!Wje9e-o73d286aKP z?JhKb*%>?78~^!zpp)^@(6L|NXZEW5lD_+juKS{%>!Oa+k~ZigG~~nlMf<r6cC+d> zFs!FFY$w%h##F6GVbGrkvu!za?oB_tnf0l>=~jH*rC{2rVA3h~vR&ahL-8qH{wZDV z5e?eeCk?WXYGof$K#H<=i86O;p87MN__aQPorkcyBmj=de*|9!_Kd)`##bTZZ=>hU z6IM+kk$Lm@6_^1n6W7e*KfR1ugRyIxuwt39=}_?1F6WzL{?B(A`|t9;+n4>cD?M^A z`<qq%H)=)E=5Wn?U*%|H#$tErau4=!duV54aBHP!e{*ngl(aobTpPu1PgNbv64wUv z`)b1%da~9>inqs0*C%khvn0T^tqqs_w%&kjjF<1s5ZA`a*T--hth!IE+Qa#VEmqz7 zY|HLS_x{@0?kvqWy2;Svlac@WWuNuSzAFZv3wrKLI<5;ku8X=Z3p!5oI!<$%4%1p6 zW-fl1QnMXbvmR4_KdSa_O#R)Mn#IWZw}T+U^X5G&Z@N^>y3d(?RC?X1V$!DkyjdA} z!BBeMtnjq)>|>hzlX|&F6j(BnyHA1!n-5?3e}t3CZ^HWCM~}XX9*4A+IWhr(Ff2}+ zN6%U(ty(8T?6Lede$^s=^>y6(>jc=%vSl2;{wQ+mMf|~|xZOtydk><vjbrv-q<npr zwEsNrt6Ab^XHEWOJ9%!fb$=OQ?60;SuC?u~_wVnF9qvsY?$3VR8~d`_eYF1ZXrt}R zY6G;@QS2rQ_jRrQ+dA#f!=XP82M$)KM=O+n*>3)GyXog%)8QKVaH-~Kh4gKq`tv;T z=Vr&(-GQT>z8~9zKi3<hFzwnN8+XtvS5cc+{njq~tQvZ)8+xwkx-BDmu1or^%eqb= zMo5;=YCC}pr!UyE)NP?nf<9if9#MZcsAk!J{%s$$b8oxPz3EVS+j-usUCp#j)wJ#0 zs}`jfbj4>hg=f^WPpP1T3Xcg2k7{1HQJ%Qh!(mW3n+pk;d%nHKejv`?H^{g})Pz;i zl1<tt3nYHtB4P1;(wcS3s%0uzj_o%IJ1-OVA4P3GkKcQeaA+L6_bC40Ny5R?#Lur% zzTZ##@*!<zy0c`ImNwmxGRDNPfa*O^Fx!Wn=`CFts#;{x)>zc->H59dhJ*RK!v)H6 zfAKIqakevOeV}xur|@9D`RiKym$jxJn;pOJARy%SuPgMQ+il<1o4>7fuz$AF@pEtd zXqWZlVCrah^ykh%4Q=#Z$kNTggInnJTc~xTfQ_qu8<&07482zjz1U6PebK;uLDzLo z+jUmUc?Q}=r|AohQyLDFnl_^v)*}~eM%1nPFIW$1yzf=F=vK4nR)5=}Zq|-yyy;Li zZ9QkweEwC7%1fHcbDGjqs`673w4Atz^qAPp_=E@~#}$pUMUhO=%m=}&CvaLfZ0dEy zsA<fUS?ru?%z{bW%FE~_Q}6^6*Iz_$JdNFY9KG=<>eIuR-3QS-599V9#~(aRIDDS= z-7@`vNUa;GjUR3Vf)sWI0X|u0##~SSbbs-uDZ&Cc!Q++dlY~`P_5M8J^CIPFmA2ep z2oR0guDq>D!qFQ2aIx{{M%Vr<{b087w~h9r&Cb0A%Ia|0(N^2nP3GP*jnz}Kwbc0; zwC`a2`_9C~$C~MG%2FSl+1U6jbm2B?^Jd`Ab@awH|Fx@r$m$h8Xe)-^O9ozx`kwQ8 z9&<WwGdiv_S}s$XPLmg%SQqU^HEl=X@q%sN1)F|N>prb_J(?EXnii0tXjeC5s+loV zU$>}1Go`7$qN%>5syw4Wiw{C2heK`N7;IKbDJD860act76&_vU8PRALKk+1T>K-zO zJP2938@_%wdhKrb!p-odo5=c|$d$Xu#{Gz`2ay{OqBhxsICl3*{QmRAgS!bw3F$Rc z^w^n?#j6wK^@+NT75Wk|oR>N_*N3(?Mn0_%Z*LDCe3}0Ine};<ez@BDeVYl`%F)iU z%>~-gX3zgR8vA{}8^-X~JZ-io|4(GE^Ju5zXn$aTz3phP|L5V*-@c9=?f3n0H1+5A z#XpbMetw?&ZI89J^l`2iKh;+JJYxP<#Norh^?N}Z_X5{%1gsdLR<5I0F8eNnGG6jo zG4P((_nOx8n9}o@)^VNCh2}K+kEZ=$RMT!)%eGJ3s$1K-N9%p}MN6bh^IeywCG&!L zllq%xbu+rg>qd>&4Qi$&)mOyG0IyIlH<YVmgs*oJ5}pzsn22_Y@URSbe4Q2URhWSZ zO(NJO^t&VvS|$v=jvIZGxcD+|#W;HHUfdSgS)<?`BV_AV?9KzwzQn`lNnf7E@3m72 z8$+c#OFgTjRXelQ$k*NO-+ml^{r=^*zx}!Q?eNR*2m6P!d)os)zRVnbo&NcC^l#r- zYvbhujmcj(+Wwy(^Z)X7?C;-3{`@w)F-MzfirXE@*&NB(94b6uRqTwG?yzth!$oW3 z_=EM1ABW>pz4(Kj**|{Y`nEeU-$PlRZL6&(n}m<tMRp&CuH6gWxPt_(-U?j4iC(%H zuyVtH?YiIcRqy#LUUR?N^d-+p19z6b3ro)##5ktoIH=<^tm`nOYtyf50~xZ9+BO|J z)}7k#+q5iOFIu!{zNy!IP1Q7`UWDVQrZpiBZ^B*Q`9VP~3$p+RYhODHtLG1%T-Ecm zeiPwl+W`a(8j{~hEAMH<GpQ8~wbhMOBCVcMMIcv^DP<&jZgp37c~4-`sAcBz^R%5u zX`i1YZ*;U!4%QkcI*VqzGqxsb4nGZk`?9&aKYRFj`p0h@KaaK#KTjQfVSNE*`Z@P) z7ks<sjY<4;SN19k_iulU{{6?`-+%P~@ug#LxptuwgZw^U{B<;OcPMUuIB91vd3Pdf zXFOwjDC5U+-JhR_RyxuS#wxZ(Dmn_B1_+ohJF{PAspa^NhtZp0;vORF_rq52hppWU zS-BUyb}wlCHhT3I2-0u)nm34$b=jMB#e4FK+tg*ZDMPn0eYYV!=RtkPLBkJ&dUpN# z_8;{S`*v-cR$Z$WX!=&Iy4DQs_e~efY3gR=^QPobd$SO?_udu&)qIMwdKv0s9_?$N zmk?Z%9g8c*v@>cuTB)s##AbR;E4`|{sj7oPVANN%)?=AeY;SAL0F(H!i7?Pr)7e~K zL$1rHWcufg7v?4}kCtyu;8sU5pEr<(@1I#mUnjqRojm$J_3i7#(YJ}C?_+=aedS;O zzWukKD}VmB@a<Fm9;<AahK$ie)&`Rnx}w%6^4ErPI<ao!jZy#pt?9>l>ET5D!D#Bv zP}b&P_U2IbA*=YyRK?G2#=&g;N>@ogK74hYvOV3%EDRW-VOBbdtiw8=Bz}Ds^9gwv zx%xP2{UNey9KLoxWc_yF(w(5?+vr6j-`VSaQ%1h5tKMVR-A7;}%1w{q>#ifPs|Pko zLA&G#tGeB~_Dn6iPHnqhcC+o!v8dHGtJXIuyZx@n*fQJ4?6I%;!z7dq6-v_K(i$p~ z=oLv!Qg$;jhe^q2Pzsw65|&OZq2hCDt23#@+%|f3M+>>7v5H<-&Y)K_=rxQ+BD0Ca zY^?p*O6q4+(rU|ag$d;efHm>ho2&f3Lfo6HIb5TE*=qg1-n2JYyE|X|ZN2emqxtAl z>+jp0Kew6=mn(KySzDuppO;8K4qE>Hz58!png6oWFiZ)VZAF6q<9q#|hjrf<N)9G- z#_9tGaULTCpIKVi05NR2Cu?iG{Od~n{sL)lqI#nvmyzK<)s#I;i3*G(8^;~qPyF;G zW`n(=fXqLOn0p#F`zUzYIB3c^X!?G@<Q>1UTYkegeMYW%j$H8=GxQk0=su+HF|6w{ z1S8qdap;PBFJk1{{J@U**sjRLD#qfqyOoK#i=~B^g&Eq$9A)`3!v1+S>U~>jWM_F) zFFt`;5z|(aN{4#NB?*k0?Do0>Al!Ghlr&OuTN<jFO@x+)s<sviqmj_ogzaKfbTnf- zns7`yuA`~4ja*oniDZO0rTW{4*qH>{zbr}cT0jPhmuG4}t+pL}YTw)J+*<3{-RL{m z7&zGM{kA{)$B(t2N7FmY4WGAKKX3Manx;Z%v9r{?K1beJqJI6<asW1FrSaQR?fyJ* zZ<??%QL#H!xi*x$w^+MARsC(D^7B~kc2C-7Ptrn5^lDe;Tyt^{DRH(rtA|_^p55+Q zjO;pNww}kWK19~;gst5STD}{+cn3Xu3&pw}IQ}3M_LR*T2TZ&`_nC)w*o4)4N0PnK zg>F8XF232Go(Z;=Za$7~alX!>j!@mrG|b*Q$l-m^hxdLq7M|vB+~1mIdcB(OE}N#O z4q#C%0y0Za*crypb(ifgGg%#_jH(2rn^rj3Qr6#$9qA&Bb`uBMYx<dluExslrpnHy ziVk`Ov!SqwoYme~QkonR=WCN5<QU@yAB}Ommw6sy^N|=aLJJ$DMgoa-Z?$%3g?6;t zbM(3G$G6dc``4Yn|Le-X91ZL*RM(T@$+(32;xKY<7$Fl4MeZt+0?JbY2uKdXsLAMU z%sE)9*_gy0t<|mc7IamIZI0k)n$u=!@e}0mS$g7H8)m69d--GT_DJbOeQZZrSbsUv zRUF#iQZX~$Ixsd++tgKD)tQ*b49Z~oMYni*q^E>NCB-J9T%!<=pag&aXcwnA7pI(% zfWoNos`QkiXaI3J_}U`xLfoCxgMAXbJ(7I=68(ImJ>5}uwn2{ee%9|$c2<N)r>_h2 zg~76+634Mp_l5S1X-4uyL)_*V4yfwAwNX9f#334Hkd`sYES_pD9%1ARGxLWT*j`3a zcXJ7oQqo$R--M4UjrK`LIi?0UWS|@hlYG*m+`??{h1fkorh96>Y<KQ1H7@k#&G#0p zj+9P!=gjux%np?-j8qL!a|VbJ)U*%jh#kOUTe0Dc%8;hg$VMotS{~DciznxW*JK4% zW%&11g^kvQP%xI{boc$GhWWwrPXqWVTJ}IS(q9uX$IKpYOkC;8n`NX=Hl>V^6UOT@ z`|z=y2rhoQt7f1!kCGai;P%e{-Ajl2_ut*V_1fs#tIJnSjjlg8y!2R4-&kA!hU&$8 zT9@wY>b<#p-^}=l<ukJ=Z~yGbu=HTRY$PZv0uAh`6qI)w+9y58H$BKF744mZ_NFFz z{8;MP8LjRwbDOI2nW&2%CWVhuklBumk;b@%UL<#Epy<;Wc4Hh5l$yn%s^y`w1&H{W znPW{Eqs@6Asre06Y;Xy)C_dKB9Bui?%k)+z;+7NZ6XN*d%{ATn;*`D3zU|enFDosF z3&icos?AB#=l$`W)sD^i#`OvELVrnTbyRJ3U`u&qOIc`bfp2Ri!l;bwBqel_l8}ay zNJ@SvIR`~A4Cup$<0Icua>9S#Za-LVJX~h%PSt(c=sMi#-2KGdnxuT4Z`hxvYz$+k z8F^#WoZ<Q$LVC3CTZ?B`ZX29EuO=d^DlB`BUshRAT2)+5Rb2MGsJyDEf}((oim<G@ zgu;1|vkC$d3IgKiMI`m*<u5BMn;}M5JzhQaF*ggcHji+4hd5d%csWP9*u{A|C;7QX zx!KV%em~a-)`p1PxX|IM;GwFZX<9ss8V8I0Gi~V`BW0_jxGk7@CP|;B>eeUg*qNr` z(uub8Axdl?IjMt`PKS?~m_f=2`tZ;o*y^#5`Q5Y-XM9$4sM9Oppxx-IFP)iaT$pAq zu^P6PyAQYezHGI9+3eVvs@fXQ`!tffHB`9NU)Ed^2^)myrRZ)_bZ>2ZJ3eNjIe(xw zt+gVCRvgw;5?Pn($S6TA^_3s4)O}fE{I=Th+bZ+(V)Ncy{nzEjpSx}A<J8G^+)xv? zlbqW@%IhGN+C6-Vs0oRyiOTBBD;u0uHjq&=kW<o@lGBuwRTYK$?xGsvvg%^8sv=UV zqSEJtBvk~(;ZcE4R7F5UOIlh-R^CWi`LVX9nbDOG#<zW6KXrM0$IJ9_pydn1+BD7e zb-MeT-pcqt4rW*S2>lgdQzRG*p(FJP(+tdHYsTWof)!+>Vq=!Jx6*pB!q{1$?=3WM z%u`k;D<>Igj3O`C)7O-XZYv9IERDzrwfB8{4{iC-%j{OTt63!m3AB2WhPEDVD(Gy; zAL=1a4pHH8tf%V7&fv!4An=^#Targ9q4P~K{lw5#d}Mo7WJ@`!uQsx?I=CGlK2Vq1 zU5!MyU=dnTa8pUxd<zo(&S;2UurQFnIa#$kL;SK_yETRTGDlwS!!=?tB?*C0#F&&F zPcKUYx?oXUkSwQwf{3WBh|oC^@vHLZFUu<H$tmf|D4rJ*S2`o2z$b7)OzNVzw5p(} z(ix$1!lLIz#Gov(<S8zxlTZr%lsxYlL{&^eOH%BX@>z>(x|T-z4i9d4zq*T9-plbY zEe)}$i2ShJRq@;I{MK|+KR%RI89YjeWYxtlv|z@Yl1G~o7W<25x=ZJK%4fPuR!8tF z?0pn@OCR%RnHdA5xDISMImMZh=u#Qu6z^u@|Nfr0rE!48lTa7aoJ4<=>CJ2qVmA#l z(452ih#wmukN4IRih@@sNqY;8@m_Dc3jI0@K8)afy0Bht_@Hhw2++TyDu_|(*HMjh z5n>tG5C%4~1q(Hb!&YZnQqhhhEhXPpTlQzE`?Ix>fB0j!ZM>s0)X^lw?!Dc^hZ$kM zlbwXF+JctK^so<a9$iK*-__HX6*wcyC#Wl{pe-S%0lFqAe*TQ8y08Rj*?A!`by2B{ zl5%h@cbZL7gi_5=?G!4RLP=B6W2aR3_zY!Wo1*khC7H*XsxNdeez<of=+*6r*SB(9 zOpE-?_QvTyKQDcnpmmp_Cn|#H8WN}Klg4V37CH(hn=_HArp#IR>uH!_a_n$z<On5l zh!{RZiW;qpX)8n5rMXd3-0IWZ@NrIQ0p?+@F9NKep{-1!ysgrs+}$4Q=A$hqJB#NA za0}zqrRlc$VLCp`zoQ;AIZ{n5LVBx_#kQo$2BZt;-$McfY#amY(@}|Puk`P!j$#xC z)+5=Tt>sZbg(ByncK0W~eVN%=ANu{r`q9zqm#=eQ4yOP9$4;<|^<%AzPxW+lrKE!G zY^qYCtMfBjX~dD?j)l45zNVVunBW)JuF8u_$iw(NBcgIfM44YinNLW8hac)(%ku(P zM1)O4;$l}*hicXGJiGw^gH5uMKrfNwIH@Noc3I)<EoFsUN@uUhN#2qd^M83e*yLKF z=SwWwbbq|<$Nn@d@H2D0$ErhTX>o(3=!urB<*xj-?t+cJk{KAy^px@X#EFLFg|?je zuH3nvya`5XA0eDk=--rwZqD;%mPcR{T$4~%K@P8d-@i;ox#q@r$GX2ns*_xSj|E0z zb(}EXR*FwU#k##{EKl6q8=n4%9jHMjDZx|J(Do9KUP^QiIf9AxZ!Yj?$aZco4Q|Z# zCZ{?#m4?zwLWtQu>kFMfkCr!<yY@F*4<~B2=NNzfeRFY$c~?#GhU&R1^0IpJ@>i4; zpX+J6y*0(AC$^Ex`Vbm!u(5cIUW88x(Uy^x=ND5xBd97O4tfVOqv{z^Hs<;lDjllq zLLp~Rz_Z-k3Ou}ue0%^P23&z052uEh;6*9X%hD20bTr-?UAcQ+!P)pywAI}r&sW7h zroU}Xu8h)~GCi3&-u*cA7$tm?8Z%WNJ4%Ziszah#%_%H!3R*E!Ow3Ym!P;Q)(g1e$ zV;QS8x3?~-lMn;b7A4oCHqW;*(JS89+TY<#kegkUmt$6(A127AArswE>@`szK3X3~ z$a291zfVJ%7st9z4c8BKRg6@l1`1t=@V<;9myaZ*vnq&*MFWwMmgh~)@gryWAS8@u zLw;agwtr=e!%#!Y=0e>#HFmZ!ye7)FCOM#?JjvPg;S~kB>+0tW<YjbZWiLobT~;}N zPg4_RWl|98)>H^v<BI$0v%AWZ-d@v|;}y^p7ds~;bWTuERY*vYht1_;%a5CV0hRid z1%ctrFAog))7&y#T+#>^rz9uT>F3vx5W6HJ{#Z@P{)V3IO+CjOS`nt#^ITsP`M&(N zJ>EmXF!Q|ntH5=Mny!tWYmA$wCl1ro2I*-t-G$Tb`J+wgEN0gFX!Xia<w9Tid=GXK zh~7=v19d6w_(&+MPt5cxjdM@(vkG#t0Hj!?mt9(<Pii3YVVs)1*qqFwM)g#Mv|~f^ z!|dZ--xWoCsKp}PjMAP8pGhKm2#0FR^Jv2cGjTyJ<v|UFeziHCaO4J9&o!xT)ck<j zOrO%Ax4mTn-`AQ}hM?xXhlk1iScliIuj^h_QM#mf_L7{OzO<CKl+*<=aa|d?3z9N+ zkM5Tz_#h1haU-<+L0aZaYi=gW{+xioMG5vzY9hh_T9M}gDFH@Z02*8Mc=*6(0M!7H z29lf{qNg~3Lo9IYgfthI8Xvczv<Q&N%yrewFKIa4)$w{_m}2*&BIxzXB%`Z3zNaDt z9MR#rxQY6-Q5t5vH5()}g>=FiPv!Dp^~x||b(F9%MgSQu58@X3D#qLLdnt*)qOQyF zs>|@KO7<#>_s9se4RM5|gjKMsd5oWZvbV!bXTjDyerdR(6&FTG^~wmfaej3-2XUx| zE%k(iq1uqyx`4&nC|aT;Ef>Y8jA*WiYJfN-2UVMkCTAePZ1kv1cBx5nt&Ff4qDIX! za~XwUlcYG*>nr!wRG#Xo8>uN6$jj?X$>~YSYKlu}h)P_PlsbDx@Wy$ysszuT5`<No zGDt)=Ix>l|uDTMU8e)=a!Xh9)pwz$|CwlxOh!C_72Jo*7_6#V;ds_132|&^#633vb zKc@^Qrvf*Zo+RIG1+i!6<<0a}9qwv7+|>**y;&XcZkmbjs)}#T3xHk5eUwDl1v*5} z9B<8=>BB9JlJ=Hbb{8NFWo*q-KTVN#7HK>44J)IB$?lSFVm#1Ax@)4l2yu++<Wh`( zc9aX^ViD!#5b9?e>|~LH1iKu}*RQcER)#AlTC+$w-f4kW@m{Zze9aQwU(<`jCt8cg zYeE-D!R0a5xU7IW5M6#qU2z04FPNGSFq}|QRzO+2b76>eX{a5mA)c1_wgrc*valIp zHrM1Nt|^|qa#mVjPF7P=0z?9=F)c}HZAmFjG0}_S5<xGKYl9WY5+ie@CS<iSG1K#< zrnr!Xn7FEtpo*Y?5<j2xsgq!Bp;$ds5{ClfZ~;spIc^xSfNeP?aRLnSX+R=Ko;oSd z$9q{;<d%|{v4*^fp_=_2Z7*ZppjTIO{ml9)nJqvv$9VKsMD~#4`e`X+%~`Crf~lTL zWOclD50?LzTK86%8*@#Yi>(_AEo)PC3xidYA4~gbY2BolE@EtVU2=C_R%w!N7UCZ4 z0GY72;hr`D4sVitEq7<A8<RCNJ$XZnbX=N8E@GP*{65mrBqzY4CL6u6HoP`jyERYj zqGsV!y(qbX#7zHcj1N8y@Ogd&1mi=%_~PQ-OCuaJyiDfXbKC1O_jWe^^FRM%YrgZb z)_FZ?34JM$mAHnun7WvVx~Pbnu&Ab(xVnh2f&5w2<Ex|yoAK(fo)R>xDm>BQk($sM zHBm8@GyEWJ74T~~*}{Vcasv5*EJ2VmT&K?Ro|fj~l;cL&+6blC0c$D8!(*f<b5l|J zftvD5{qqj@bUlr=V{Go__`RhUhEUVp+VW6?)o}y0DPxSB(dNwQ&f=-QN|4|7eDlgA zZF`xyyVAZf)3C~_Utv)e1}Y~yipH3^-Q@UYY)At(n350fs~ZM!i*Pd!{9qd9Z5tEd zge3S{?9S95Z8DZ8%IC)LlYRJ_?0|T0P{4PY0p^Wm$hW=0qi?X7-q#F_qZCh&URA0W z$P6xOGJJ8#9>vjiWl`W^dS-gQrKfn8Ar1hR$Hsb8XNKHXmDiV%G?bOlWzT)m+Ts%G zB4R26LTbW78loasRa6k<jd7v-^Pb{>_WXcBY+#Uyk(!X8sxaV~1wqux0%s)tQNI2c zI2*Xd06_bthEU2L%GZNb*_;GP4$#e$vfSKy5@OforSG4Ye|S;e`lhDqy^AUK_lo>Y z>eAidkk3bK_$V=Pv>|hXna64`oari^f&HIz{rLGI!rTaXiA7yw)o)DEK26cKr)eug zcrYX&<l#n47cs608%oU!sZK}bBzvWXx<{j2B0`*^1Dq24-+$j~|NM!*I9f5v%xkSm zD313?541`{Tc&wiv{%RezSsJ1e@tx5HWvoItxEI8r+R?=s?)q{(tY3p!6kVTGXhFu z-HHNjQ>-6Vc)d)wGrp&;{P3dYO(l6lX>kMDUjh`D&=M8b0MS7#!7F(F3}7k6G(?1B z-#@91cIz#TYA;01HzxW#y{>#lNQs|UftOd2AIvUW%g*xhf#iP8ef;1I%ARJEGT|v) z$RXg~a04U<2m&YMc(}FUQ-Q-~8nPC*^_-tx_IP$F!r}%Y-kzLj-InjwR}(x;Nntgm z&h>!Rz^@G87kUboMyofMnVSpEn~N<=6BJm$-kopSha4S?vc{sU4A;Q+g29ILu9{ew zyGSK5_^c=l5)d8a9)Yrt@<8k|0v&$e9atL1ewrXmc9k{Z!;2z6MA|*X071#slvWb> zx4pJ6i}+r0c&f)+0wxd#)Wb9sKFOyt(Gw46)6=}hd+X;Xx*Lj9N%4V2fmTlqE-H&c zgvzHUE2#^rC&51dbwL>5XAn&Y0;oy>9O5&=7sMrv<Yf@wN7o1;4jnlG;GMB3G478p zE1waN<2fyN8k}V=z$3_TbN>V2A#sXB<}?>fbHB(OK(l2#(ePAJ;0)kj;73Y=XVk=n z4cUkFWF4N~bA5Kp)mT5^`K9u3=h`?+W~SRfRp1aIda5yTp|=!F?)nH}4(Th|TcSgb zV{@))XNj>3&g*jD;d<}aPwndy)$;?8j42#vWc1T9AL~*ng&{S0;n=jm#1M}NKS#8K zS+M<^%t+rqe(dajVjXS_ZA>@U76cbYIHUo{+T}&En+d%l>gU&i?P<agJrx`8icj_- zXTl5^SPiV<7*__7D{FmqcztvBKmP4Mk$?a9|Fv`YX<)EBF)B)3O8kPDkOquX5h0k& zK$jHxV5&N!$P3yf44lH-=j41IT`q8X(VXb|u{fATjP-eZ3GM`xge(`Q6ek;40%8Qs zQsM{D6KENDfNT^KTm9ILTaJed+-Jb%NO5tV6Bg7#WF)UC%iK|wwlTiuV{+H$iDASW zqkRAOeU%}dWvJeo$YE;o3^Q+asCsFj^3ynZbGjZ*x$Mq0!+2etsD%i5YpQXbRkJyP zoA1e+?8sm>r-K7iTM|mgA$7&!*ks?rc+aQ+JH*%CAC^=spJFq@|K;cE*S*<|<+ibI zq=Zo(p6K>6*6CS_w^^Ex88OXgqNR9qsd;9gVzf1nfs3OShLEz+I1H*Z&SiCR=<9EL zD=Q1_O|^r)?E^iG-d0K<gEZ0Ky1TiCc5^<<&2>&t=-e4WMLvEQju0)Jg}93y!wSgr z^XrK4dEV7cHocK=d#^U){a`*C@qK8ZBESzu1Jo1*{!4nC-~qzZbL<`gaFgY@`9XB> zLBQ{l<z}lK2vFuUCyZS<_HCpjd-sC8#Z8^SH}@0lo))4ks$yK*^HAO8$N)8Cj8QcA zv1+cTe7?7QaiC=<n1g(2e7C>gBC7BT~3B(1R^kwsn@t{m&gg(w7k#J>8JURrJk zIin)gI}dS*^>aWwz4f;;M%%wEOK_QEW(`pj`YBP=91l{OM}DY%g6oSUk5^eJ^M*qI z5qfHWV`^u0<a|HuOsJb1Ax;nAN7{;d8Z*d+NOoLk2&8*$%?eY)i*k{~qKuRROmbF2 zWI=LFZDo;{l_db?RD}hU&hRP=p7~`m*%)7TFu~7nC?VuvsD>EpXPMt7d%Wt3v39tA zK?QOwAT0p_MP42S9(DsEo#i_%&j%DSL3th^)&V_}13G27Il&18ww?IN6Y@Mf06{^N z1Yyb$xqDv9%IHF<`P~fX7e(kd_$Y_kSo=<F_;5qYcr#|EGiRy4a;_V@3e(;!d1oG6 zKFZEq<KAL3q${_l>Ni=`{YA#gICZ)QH`!S-)d9mdx2F-)PD!au^G^497wP)W!~AiS z)9ZkD&#*D}(@n7xw3uN^cq>xiOHJ`8if}~ij5GW!aH(F@;;?pNN)I`?t~6+(uY7j6 zn$=seFhW=wsa_bwGt2!Ko5BL^U%5PcP?Z+WsL3Sf$JQ1l))glbav-OL!DYr?Qjk;R z7di_eKLiha{8Aj?_HsZ@K!Th5s;sEfWsR`AI@xb-*SI{bM<LIxFR3a3Gm;PHHt>i! z<hW16wG1bh_{me?KdXRY7KKC>KqYw<_~9OK{J^sTK-NiV0B3P<sR*6XlNB|R7q+;r z>G9-JnAyz~r{{SAW_7V2dP>6w$kBt;xUr_R+1~PnJ{;JIgJs6XRQ>8WNU;IZf5`q4 zeS4bnX&m-W;bGbvp(l+sXN)vq`lyLrHQ}^e-@*{9bl>+;E*2i94`N--Jzw1-WTCca zY9~92yGW7E<w0##(IwF?Ay#*@f~-mT!S&_Q9n@?}ZUCh$bgZ{xyr&Y}8&-ey^f;9@ zM(?Wd+oOK)eSO2<(gd4;Zbk4IW>r=nwTxMl-By!ED@-m=4!o^-PJ)vckY4|Yz93cw zShVPgQ?k5#pn#Sa6@u^Sq?s6%+dUw9KDIJYmgD1t!`omCWVygc=4I<F2e8afg3UQ6 zDtul{SW%E4W<7;7d_b8NK6V_ahf)Bq=H*irMnrVwWp1b`J<(Enu7BRzNW<g4Hpnp1 z?jAkKz6XwmSA_zDaH_p@yuD<$AHO(4oExZK8X>KL(Vc|NclFydl$}|^+E@i7@aMbp zrrR(R?B%WqK$CY?2T^l9iz2KNeBMSnT6meTIpaRB?^kCBZOu`8=|JxeM@X4Ilx)8| z<U^vjSx&ekr8Ks!F0HpEtF1n#vmtlvBYw0SKi*qC)>}O}LhfxRqa9yII+)zm)JzGq z%MNw;SX<mslEkRaZYSh2O4DnzBFU*C77y;8I(AGR<i~pkV7GwW=0A2!7%V9l-!(bu zcY136w{;>O>Xq6)CLtcrtPPZ;xVhNYmz!;X*^fLh;@O_F_zAW?DuO8zICD-!2n>uU z2Zs;`2M{UwPMnbB;Z_qnW1uK==Yq<ct6ERA6|IcaydUbKpBg4w-e}Eq7{dBb*2X|^ zxzu07>Moz^sbF<uL4NBj>gFtceU84lgtV?tl9mVa7KieuI>Ecn9%rNvHzqJ~=w_^M zM|BV>%e6S{eXQNX=np0?uWoyoJ#c$%R9}XCVvz@$vO0+ow0!T1IJ<&S=U5N3vNSZg zEV7f9(^;R{(^N3jUOL=`8|cChc2~h;e<yxwm}>v*j>kKT<WTQ;pZBGyK?svv&{CDr zLC)zQ<}_ENH<YCiFd+p|zL4AFJ9bQzi(8VLSCEqfu)~5JCk0P%DxTqbe^EL3p;6FX z-7NFFB(LWm4A0BK&^^s{7K{QHP@W*P00tB=#!f)G8HT>ZFB-Z$AHO^|ujr{$f~QWM zIeuJ#<D?8f?>R(JNLO0oih}eboeO4{E}Ck}I$l+AzjhvVU!x`6VW7lslpH<Zoj==C zGTB`|-cdT%UNqZ}`!rd%IZIn%)vip|Ee=EOB^MUYCOa}G+A{{}NyD`GPF!Gfp+{4J z2RY3tFW^m_opFq#iMRPf=T~=}Ol}e~0w$Z&2Z(W9RY-7Ckq<8JLx#_r^Z>h>qVRfL zOlN&odtF95E%#$fabH_`e+O=`tE#6B7DWqsT1#Hv*7dS{Nyp`uXGYYOrZ$yl;nE^& zGGgf!*_6T<N?r^h52?<LtV)mZwY3oBIxWD#A;@_O<i~dsl;)%oH>bIpitoLv0k?It ztRExHBxhSA4OKBw2z_DtW5Z2P0~hO;_8mVVb^;jBCq+)26g$Zwdh(RmDd4p6NO1!y zo?G?|KNw;SQ2~8vC^{gnFE8^<SN-1kv(GhT9Sl@_jJ24VANq^DCmR!4t*H}DNh3_m zFf((sEpxoHU||TiJX#IW+8Q!WTpq>G_T)`><xF;EPqbmiT2cmTqdLk^jXBPB7zc8S zV}8Kf6xWxL4zIl58oQa^ae8s5BEh|@%)2VqtUlYZKHsY>(k9*4G}hg`zA~n<I=-nU zsg0V+sLyR{$nT^Vb<&GlYO@;%=?#Rmw)(sm*EQ{*-3BOUd6G9V6$v23`v86spWw%C zaelZs|C&Tpd9-I8CX|#Oc~)Hf3<r-8$0^?9$9PU0=RI}|!ZU3Nap!CL{&x(bUl^5p zzO>Lgrz*@2+rarbdzx2<6Ra&4*bcB1kcSaGaRQpqsZ#)~K6C7t1lMW6szXy06uKZK zj%Z5>=t>IeND3P%%b8!h`1XqCQw_OymsIU<Y4jEQkC37!n=>Zpuzs33(VQ~Vkv_pl zo9!x@@5RpbVyAnt^8>iW5#01Z!FX5J*vIT)W?CN!>8=Td#5=9fy*}TCUhH2U>5%DV z7VT&Xqu2laQ)knA>Aseo*igvT(2-IU3FAu1@J|b}jq-e3SC&*?k<?OyX(FUGQ?gp> zvYN@+Olo0w6Sln}n?b{LG!#EFRKKR7h>P(k4gt=cT^`CNH{gAKkWB&FCfnm}nzKo^ zr)j49i()^U_cyQdaGVt3W;5yePaWqyd4luUv5V5uSC!5^QCAJQZy5Ouxt99=p^=n0 zB(ET71CIrUDJ&I%*Q_Ea3^J5B#VG<)-buC?1&$wwM==ggc0!+rPmYgYOHS&tqNJvn z@OhCl+S1}ChFazZs&-dZo$hG4KhlTFR2>zOK>1@-#&p&swpAf8U-eSrKT;9~8ZhAJ zO?BlWQ(gHpJ%y~!%#qd<R(nP-HL9t^tF7F>3m4d0;?q=wYRC_$h_+90eir=xah#VG z+Ul9T@wFg_#{=!S&-;_Dl(@P=zxtxk;14h3{48rrqlsnFb(IMuYzz?_L#d1_NDr`m zb>H#z3zU;-Mznikh?9|ul&XX<u=J=I0P;-rBP9D&C;Ct_g2`!6t}>9A>PyB1l2iQ3 z5KlF6Q31|V0vwz$TfqqCI(F>zu@l1FJjN<YH{`@)o?J;Zy@|1VsxKx0`2~;)_{R|H zvEvOcUS$D6upMj|EH9q~=V=(jf*{3{Fqlt)=K`XY<K|WqMT88XJjhw8D@w9DlA<>h zW!@N^x4xomYjn>3hAJ+~9vA6Q8D$RxjFRqIpXUb&`G!JNeZF67WjJh&A8Ae)XQmD` z#P!rg^-*Jb$&u}qLCskIRzN8h`Oxz`Yf{{x6$HPFvwN7}W}f12i+=aS_RbZ0N$3zQ zsSO{AG?k)z>Qh^5QZmEbvLfB^If0e=Ayq{Yr1DsNVR%JuP!R@oLtEp5jJ%qp_yuVh z4QWXYaiNQH(uDjNsLw`951?RB<kW!1f~fj}C`JXQr973G6+zDmu1XG35EB*T;t=3C zA;7jEC%BKF;5v4S_Y~(<1<C7YMT72XM<9=MT<=`e5afe^O@<SqT!{Dhf29c^>C6Y? z7=jqE;&Pnaki`<_;^aGiO!)Z8U->__8>l8KqA4MvBOz?0D0^2!<%NO9yX#t3MjEch zI*vEhNeRw`cqe?cLnUI@m>p1;1)r>UV}4L`QE*#jNDn!zpNd3`G{*GTMfOr6hiP&B zb@8ph0WU&RGJN1xLaKX3tX*-qO}4*P;)f@3E^i{7O#`i-I~ZSQmWTI}kgmF<x!I3v zs}ps&#MDsRXs@>wm|)=Gmgfdm<ibTnX;w&Cn*TjR%?rw^I?9R~3bJZ)(r2akFUm<) zWrx@2g&_dh2Ih7hCgdYIhl)*LR%N$TW|DHlX&7H@On{=On80Ze;7R_IAi$G+Cr+I_ zcH;EO6W3(rUTLZN-qWk_vaq;r0K88%At5jg>;UZ-+ZtAoV2J)B1qiwZ8Yd2kKpq~L z2Sp&YdWs8XK>iaag%OSuDgxZb+8PG35_(di&n_xIy`W@fsP6hm$LFyjIoS;=@m0s! z*Tma5WO>o@d>}L5fsgF2j_kmPb`!(8h{0`DC?+f};)9sD0GR9mg<hZM3z_SdGK7@n zT^4Ddi?+-|zfX307HIh}(B^4?#bf&iH;Q8&yC?}GACclIR?GBQ3!@5&aeWB_EJ*b$ z!JtdCf=aUjOEZH@Gf{=<VfQcVsw>D}P*Bv6JF6lgbyh^cP)Q2Fs{kpd=0!kerZz7c zBuC1N1n7NjVO&E=3MtXEBEe5hRz~RbX%RqK@^JH?I>mSVIQMZ5&J)LV#KlZ>Rb6gs zAr*dBZqFax&^EYwP8B9T&@2!axPI^mng~h<*U-rp;7JY<PEKJCP9eZKpE#i=Dk{mt zBhJes&dsF>8MCuuw^gL>smk3`lY?Zm)fH9e8yE1AZk31|KFYZ!*0nkY)*GA|r6JU8 zUl@~+U2Q1|p(Dk9jEVq8xo=CkUo+OHx!Aup)019;{#cj7tcs;$!^$EZf$W`&wn%b$ z9%A(**!HRW^E)4muTe{5_P1s>*T-ka>66101~CDHwn;==<t2LOCU}>mp-R#Maud7? zll|X4y`d~7rYa|=Bq^;ZE+sE2F2m0UwPKpf(kQt|cpV$cjgSjssTHZTqJ)+T3@JCd zp(L4#39O9sSCtXxJaLTc_%R_6AP0L8^PJ=m<l%yhz2hzIXls*rXDhR7S1+jnS6)$u zllvd?18MzQHDb#TbP&cf^h=!N6yxL)Wkaz!#5p)5xHuJfc@QlLQ7vhy%gXZF(jpJk z&py*pGP$JoLQmDqK=s|FbEU!7xJbvEShvz(+mcW_VxlVza_5OI073_jdVNkneYSsl zRai%LU~`ENz1X8U*PDuQug&*v!o^aHk*bV<yrB0P-X<A7W(jUDq8(nM-WuCKxaRQS zQX4Vx@Nj7sVKHZi>qdHrbV_DQs6(9ZyYh_SlDvq@vbgf%=%T!k(t>#Nm-jUk<@MB6 zRHVd|BqU@61;tPE-qBKPDNiKjgi?#6sriwl!sxo1jA~3+eNlX4St=<f9I{^3iNPP9 zJ$P}`=;f_z`fBG@q$NbTPJ#A;-rQGLx4x#8>V&-Ze)Hz4lIlfiDHRc6c|HMIwqam5 zNOyq({$m8gnEs`Mr=>tWPxHv~@Ct)hd6H9>hf4#H&(dP1SG6^zC2pyneW@dFqOW3R zpzM5C!`)aHO7Fq+hYPc*2zp0|cA_P_wdD8$hn|w-P099XEDS`NOF~=A(e0I}K0;VO zIh;|3s>|^vX1Eg5y(;6JFupHSJf5ezzsNybruvvcd1BA!x8L2>cYJ=OIxm!7ozg+g zX{Y6NG!@cG>2=j<R6+)!GP#*n&TN7`nboZ=m5k=fc1BfcVM1A9-1FN8T8gsgWo0FJ z&)m~dtIb0wNEYmZiG`A>jpcETWobpxexw|vGCc&J8h}gkE|2jGwYNsw*m_&M33IZd z<MZ%2NL7AZVvxrZU3FiRy9tgaZZGbr2=Xb53QO?u!vrUD1`?xSI8KB7AbkFnxBsUC zLMJ?Bk7o`x<Q)<WuoZy=0%KKC5feQf2m@~`$r&rlni!~<T~@NZqT=*Gw<_M1nuTgi zb*qoJZ^5`T^L#qXg4)XiJ4;a=C8&=TVO^DB-MHY9#^mKO;-~4lnXZynYzVEuw>I0O zH1a*h=T(~Lt2D1yxhRY501MQcJI+t8TirJdae6^4io|B15JGWeU1cJrGO3Z6QBTUE zQL<@Z2nbm;Qf>n|uaR6(Q<7Yf7gbdpNiL2=Ihv?Til38_66NB0c0~^aSeqMOn;#A1 zn35NbOARYcK;zScvB_wBDjFN-QxxtV;b<P}VjXC25oBkU7VKV~6H6_LX{$;pjd91P zgyNCZu+#uY{j;*ll4qrag&@)sgIqIYPEYeFu~&b=8Dy^?ff_=C>tAeNkQ)bNV&q^o z{WKTw?WMU-gYAIAUC;Hko@kx7G`jfSNcH^<b(>q7d4ccp1K&dqr7i<p637a`hN#%) zB2*7Hun&u779d{C65sBMz)oBU9P*oK&+8#ZHx&g?b3CC{#M<WuT0&{M;&9ud5NnKw ziT|71j?ZtH-_}h=+X87Gu;7&PxQe_mKsDEt!~zDKh)*Tq(}|TCfM%{E<knQA6DraO zRoOL!g36MV?0B@1`gtW$VG%A4)7w|;3nCHl1FJH_ap|E2QQpMNsG=Ajc27n~QM6}8 zykAkcOW23kXj>DM%}c;^2Ux!KerslL`pW6mvv?2N+%T8SV3+)GSC1DDlmvvN1o?$| zxdF&6%YQ~mKv<q%@GLJ|0spJPa^^pR;$IA8z#s!`8xpCI7nI}Uy{0UuFDZOYN%oP> zx%bz#tgoor-qkwc_3Fm|g?Ic5D9i>P>+4*;bm_mL#`^z+8vm1utZVSk=l|zjhX3pZ z^f3^L|LfjM|JQpj|L=RX&D>C)P6}#nUM^a`j?U@;K?Vdf%FW07zC8;1?_bl?(YXTO zy1G{kF6&)^8=m_({{Q~$mA{W8`U7B>)gF7<yEr|!cX9jRp>RpdKnq~Wm$daRY3p23 zFwwoF@Y2`G`}r#cR}{+knznXOP>_}z`vve1UZCaU@1p+y`7?t3ot$}e6m+lf==}GW z!X-mPeM1Fjh5znjBb(V@3f}*_&kz{Wf9Zoi<bU+(!>j&!pZ*mP{9j&cpaX>IzxL_> z&-XC6^q1eKtE&Uw|L1GjeR_X+4|bp7Utengoa(>67W)4B|I>xOtAF{wK%cJO|9q{k z!C&7O?z;pk^k07)%HQ72)5)KQ4bpz?779FU;9fuWcJ@)wWh)PWu}yt^Pzvyy;rbT= Y+uk4b>tlj<)Hl%MId|^COJkn@7dPrOEC2ui literal 0 HcmV?d00001 diff --git a/tests/roots/test-image-glob/subdir/svgimg.svg b/tests/roots/test-image-glob/subdir/svgimg.svg new file mode 100644 index 000000000..10e035b6d --- /dev/null +++ b/tests/roots/test-image-glob/subdir/svgimg.svg @@ -0,0 +1,158 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="60" + width="60" + _SVGFile__filename="oldscale/apps/warning.svg" + version="1.0" + y="0" + x="0" + id="svg1" + sodipodi:version="0.32" + inkscape:version="0.41" + sodipodi:docname="exclamation.svg" + sodipodi:docbase="/home/danny/work/icons/primary/scalable/actions"> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0000000" + inkscape:pageshadow="2" + inkscape:zoom="7.5136000" + inkscape:cx="42.825186" + inkscape:cy="24.316071" + inkscape:window-width="1020" + inkscape:window-height="691" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:current-layer="svg1" /> + <defs + id="defs3"> + <linearGradient + id="linearGradient1160"> + <stop + style="stop-color: #000000;stop-opacity: 1.0;" + id="stop1161" + offset="0" /> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + id="stop1162" + offset="1" /> + </linearGradient> + <linearGradient + xlink:href="#linearGradient1160" + id="linearGradient1163" /> + </defs> + <metadata + id="metadata12"> + <RDF + id="RDF13"> + <Work + about="" + id="Work14"> + <title + id="title15">Part of the Flat Icon Collection (Thu Aug 26 14:31:40 2004) + + + +
  • + + + + + + </Agent> + </publisher> + <creator + id="creator24"> + <Agent + about="" + id="Agent25"> + <title + id="title26">Danny Allen + + + + + Danny Allen + + + + image/svg+xml + + + + + en + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/tests/test_build.py b/tests/test_build.py index a8a6455b8..6022aaf1a 100644 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -11,6 +11,8 @@ from six import BytesIO +import pickle +from docutils import nodes from textwrap import dedent from sphinx.errors import SphinxError @@ -108,3 +110,47 @@ def test_numbered_circular_toctree(app, status, warning): assert ( 'circular toctree references detected, ignoring: ' 'contents <- sub <- contents') in warnings + + +@with_app(buildername='html', testroot='image-glob') +def test_image_glob(app, status, warning): + app.builder.build_all() + + # index.rst + doctree = pickle.loads((app.doctreedir / 'index.doctree').bytes()) + + assert isinstance(doctree[0][1], nodes.image) + assert doctree[0][1]['candidates'] == {'*': 'rimg.png'} + assert doctree[0][1]['uri'] == 'rimg.png' + + assert isinstance(doctree[0][2], nodes.figure) + assert isinstance(doctree[0][2][0], nodes.image) + assert doctree[0][2][0]['candidates'] == {'*': 'rimg.png'} + assert doctree[0][2][0]['uri'] == 'rimg.png' + + assert isinstance(doctree[0][3], nodes.image) + assert doctree[0][3]['candidates'] == {'application/pdf': 'img.pdf', + 'image/gif': 'img.gif', + 'image/png': 'img.png'} + assert doctree[0][3]['uri'] == 'img.*' + + assert isinstance(doctree[0][4], nodes.figure) + assert isinstance(doctree[0][4][0], nodes.image) + assert doctree[0][4][0]['candidates'] == {'application/pdf': 'img.pdf', + 'image/gif': 'img.gif', + 'image/png': 'img.png'} + assert doctree[0][4][0]['uri'] == 'img.*' + + # subdir/index.rst + doctree = pickle.loads((app.doctreedir / 'subdir/index.doctree').bytes()) + + assert isinstance(doctree[0][1], nodes.image) + assert doctree[0][1]['candidates'] == {'application/pdf': 'subdir/svgimg.pdf', + 'image/svg+xml': 'subdir/svgimg.svg'} + assert doctree[0][1]['uri'] == 'subdir/svgimg.*' + + assert isinstance(doctree[0][2], nodes.figure) + assert isinstance(doctree[0][2][0], nodes.image) + assert doctree[0][2][0]['candidates'] == {'application/pdf': 'subdir/svgimg.pdf', + 'image/svg+xml': 'subdir/svgimg.svg'} + assert doctree[0][2][0]['uri'] == 'subdir/svgimg.*' From a66041b54106bd0f7c9b1d23154e969d285adb20 Mon Sep 17 00:00:00 2001 From: Jakob Lykke Andersen Date: Wed, 27 Jan 2016 23:46:29 +0900 Subject: [PATCH 227/238] Fix exception on reference lookup in C++ domain. Fixes sphinx-doc/sphinx#2271. --- sphinx/domains/cpp.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py index 5a7bddc84..8868fe285 100644 --- a/sphinx/domains/cpp.py +++ b/sphinx/domains/cpp.py @@ -4009,7 +4009,7 @@ class CPPDomain(Domain): else: ourNames[name] = docname - def _resolve_xref_inner(self, env, fromdocname, builder, + def _resolve_xref_inner(self, env, fromdocname, builder, typ, target, node, contnode, emitWarnings=True): class Warner(object): def warn(self, msg): @@ -4051,7 +4051,7 @@ class CPPDomain(Domain): name = text_type(fullNestedName).lstrip(':') docname = s.docname assert docname - if declaration.objectType == 'function': + if typ == 'any' and declaration.objectType == 'function': title = name if title.endswith('()'): title = title[:-2] # remove parentheses @@ -4065,13 +4065,13 @@ class CPPDomain(Domain): def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode): - return self._resolve_xref_inner(env, fromdocname, builder, target, - node, contnode)[0] + return self._resolve_xref_inner(env, fromdocname, builder, typ, + target, node, contnode)[0] def resolve_any_xref(self, env, fromdocname, builder, target, node, contnode): node, objtype = self._resolve_xref_inner(env, fromdocname, builder, - target, node, contnode, + 'any', target, node, contnode, emitWarnings=False) if node: return [('cpp:' + self.role_for_objtype(objtype), node)] From 678f6066f5b3b0dfaaef52b51879f22f5b61696c Mon Sep 17 00:00:00 2001 From: Rob Ruana Date: Wed, 27 Jan 2016 10:16:12 -0800 Subject: [PATCH 228/238] Fix #2227: [Napoleon] Fixes issue in which bulleted lists in parameter descriptions could cause the sphinx builder to fail --- sphinx/ext/napoleon/docstring.py | 41 +- tests/test_ext_napoleon_docstring.py | 548 ++++++++++++++++++++++++++- 2 files changed, 582 insertions(+), 7 deletions(-) diff --git a/sphinx/ext/napoleon/docstring.py b/sphinx/ext/napoleon/docstring.py index 27ea1617f..742a9fbba 100644 --- a/sphinx/ext/napoleon/docstring.py +++ b/sphinx/ext/napoleon/docstring.py @@ -27,6 +27,11 @@ _google_section_regex = re.compile(r'^(\s|\w)+:\s*$') _google_typed_arg_regex = re.compile(r'\s*(.+?)\s*\(\s*(.+?)\s*\)') _numpy_section_regex = re.compile(r'^[=\-`:\'"~^_*+#<>]{2,}\s*$') _xref_regex = re.compile(r'(:\w+:\S+:`.+?`|:\S+:`.+?`|`.+?`)') +_bullet_list_regex = re.compile(r'^(\*|\+|\-)(\s+\S|\s*$)') +_enumerated_list_regex = re.compile( + r'^(?P\()?' + r'(\d+|#|[ivxlcdm]+|[IVXLCDM]+|[a-zA-Z])' + r'(?(paren)\)|\.)(\s+\S|\s*$)') class GoogleDocstring(UnicodeMixin): @@ -349,6 +354,8 @@ class GoogleDocstring(UnicodeMixin): field = '' if has_desc: + if self._is_list(_desc): + return [field, ''] + _desc return [field + _desc[0]] + _desc[1:] else: return [field] @@ -408,6 +415,23 @@ class GoogleDocstring(UnicodeMixin): return False return False + def _is_list(self, lines): + if not lines: + return False + if _bullet_list_regex.match(lines[0]): + return True + if _enumerated_list_regex.match(lines[0]): + return True + if len(lines) < 2 or lines[0].endswith('::'): + return False + indent = self._get_indent(lines[0]) + next_indent = indent + for line in lines[1:]: + if line: + next_indent = self._get_indent(line) + break + return next_indent > indent + def _is_section_header(self): section = self._line_iter.peek().lower() match = _google_section_regex.match(section) @@ -530,10 +554,18 @@ class GoogleDocstring(UnicodeMixin): if self._config.napoleon_use_param: lines = [] for _name, _type, _desc in fields: - field = ':param %s: ' % _name - lines.extend(self._format_block(field, _desc)) + _desc = self._strip_empty(_desc) + if any(_desc): + if self._is_list(_desc): + _desc = [''] + _desc + field = ':param %s: ' % _name + lines.extend(self._format_block(field, _desc)) + else: + lines.append(':param %s:' % _name) + if _type: lines.append(':type %s: %s' % (_name, _type)) + return lines + [''] else: return self._format_fields('Parameters', fields) @@ -777,10 +809,11 @@ class NumpyDocstring(GoogleDocstring): _name, _type = line, '' _name, _type = _name.strip(), _type.strip() _name = self._escape_args_and_kwargs(_name) + if prefer_type and not _type: _type, _name = _name, _type - indent = self._get_indent(line) - _desc = self._dedent(self._consume_indented_block(indent + 1)) + indent = self._get_indent(line) + 1 + _desc = self._dedent(self._consume_indented_block(indent)) _desc = self.__class__(_desc, self._config).lines() return _name, _type, _desc diff --git a/tests/test_ext_napoleon_docstring.py b/tests/test_ext_napoleon_docstring.py index e53efdf34..17c1a7a56 100644 --- a/tests/test_ext_napoleon_docstring.py +++ b/tests/test_ext_napoleon_docstring.py @@ -280,14 +280,11 @@ This class should only be used by runtimes. :param runtime: Use it to access the environment. It is available in XBlock code as ``self.runtime``. - :type runtime: :class:`Runtime` :param field_data: Interface used by the XBlock fields to access their data from wherever it is persisted. - :type field_data: :class:`FieldData` :param scope_ids: Identifiers needed to resolve scopes. - :type scope_ids: :class:`ScopeIds` """ self.assertEqual(expected, actual) @@ -615,6 +612,285 @@ Summary line actual = str(GoogleDocstring(docstring)) self.assertEqual(expected, actual) + def test_list_in_parameter_description(self): + docstring = """One line summary. + +Parameters: + no_list (int): + one_bullet_empty (int): + * + one_bullet_single_line (int): + - first line + one_bullet_two_lines (int): + + first line + continued + two_bullets_single_line (int): + - first line + - second line + two_bullets_two_lines (int): + * first line + continued + * second line + continued + one_enumeration_single_line (int): + 1. first line + one_enumeration_two_lines (int): + 1) first line + continued + two_enumerations_one_line (int): + (iii) first line + (iv) second line + two_enumerations_two_lines (int): + a. first line + continued + b. second line + continued + one_definition_one_line (int): + item 1 + first line + one_definition_two_lines (int): + item 1 + first line + continued + two_definitions_one_line (int): + item 1 + first line + item 2 + second line + two_definitions_two_lines (int): + item 1 + first line + continued + item 2 + second line + continued + one_definition_blank_line (int): + item 1 + + first line + + extra first line + + two_definitions_blank_lines (int): + item 1 + + first line + + extra first line + + item 2 + + second line + + extra second line + + definition_after_inline_text (int): text line + + item 1 + first line + + definition_after_normal_text (int): + text line + + item 1 + first line +""" + + expected = """One line summary. + +:param no_list: +:type no_list: int +:param one_bullet_empty: + * +:type one_bullet_empty: int +:param one_bullet_single_line: + - first line +:type one_bullet_single_line: int +:param one_bullet_two_lines: + + first line + continued +:type one_bullet_two_lines: int +:param two_bullets_single_line: + - first line + - second line +:type two_bullets_single_line: int +:param two_bullets_two_lines: + * first line + continued + * second line + continued +:type two_bullets_two_lines: int +:param one_enumeration_single_line: + 1. first line +:type one_enumeration_single_line: int +:param one_enumeration_two_lines: + 1) first line + continued +:type one_enumeration_two_lines: int +:param two_enumerations_one_line: + (iii) first line + (iv) second line +:type two_enumerations_one_line: int +:param two_enumerations_two_lines: + a. first line + continued + b. second line + continued +:type two_enumerations_two_lines: int +:param one_definition_one_line: + item 1 + first line +:type one_definition_one_line: int +:param one_definition_two_lines: + item 1 + first line + continued +:type one_definition_two_lines: int +:param two_definitions_one_line: + item 1 + first line + item 2 + second line +:type two_definitions_one_line: int +:param two_definitions_two_lines: + item 1 + first line + continued + item 2 + second line + continued +:type two_definitions_two_lines: int +:param one_definition_blank_line: + item 1 + + first line + + extra first line +:type one_definition_blank_line: int +:param two_definitions_blank_lines: + item 1 + + first line + + extra first line + + item 2 + + second line + + extra second line +:type two_definitions_blank_lines: int +:param definition_after_inline_text: text line + + item 1 + first line +:type definition_after_inline_text: int +:param definition_after_normal_text: text line + + item 1 + first line +:type definition_after_normal_text: int +""" + config = Config(napoleon_use_param=True) + actual = str(GoogleDocstring(docstring, config)) + self.assertEqual(expected, actual) + + expected = """One line summary. + +:Parameters: * **no_list** (*int*) + * **one_bullet_empty** (*int*) -- + + * + * **one_bullet_single_line** (*int*) -- + + - first line + * **one_bullet_two_lines** (*int*) -- + + + first line + continued + * **two_bullets_single_line** (*int*) -- + + - first line + - second line + * **two_bullets_two_lines** (*int*) -- + + * first line + continued + * second line + continued + * **one_enumeration_single_line** (*int*) -- + + 1. first line + * **one_enumeration_two_lines** (*int*) -- + + 1) first line + continued + * **two_enumerations_one_line** (*int*) -- + + (iii) first line + (iv) second line + * **two_enumerations_two_lines** (*int*) -- + + a. first line + continued + b. second line + continued + * **one_definition_one_line** (*int*) -- + + item 1 + first line + * **one_definition_two_lines** (*int*) -- + + item 1 + first line + continued + * **two_definitions_one_line** (*int*) -- + + item 1 + first line + item 2 + second line + * **two_definitions_two_lines** (*int*) -- + + item 1 + first line + continued + item 2 + second line + continued + * **one_definition_blank_line** (*int*) -- + + item 1 + + first line + + extra first line + * **two_definitions_blank_lines** (*int*) -- + + item 1 + + first line + + extra first line + + item 2 + + second line + + extra second line + * **definition_after_inline_text** (*int*) -- text line + + item 1 + first line + * **definition_after_normal_text** (*int*) -- text line + + item 1 + first line +""" + config = Config(napoleon_use_param=False) + actual = str(GoogleDocstring(docstring, config)) + self.assertEqual(expected, actual) + class NumpyDocstringTest(BaseDocstringTest): docstrings = [( @@ -1194,3 +1470,269 @@ body for docstring, expected in docstrings: actual = str(NumpyDocstring(docstring)) self.assertEqual(expected, actual) + + def test_list_in_parameter_description(self): + docstring = """One line summary. + +Parameters +---------- +no_list : int +one_bullet_empty : int + * +one_bullet_single_line : int + - first line +one_bullet_two_lines : int + + first line + continued +two_bullets_single_line : int + - first line + - second line +two_bullets_two_lines : int + * first line + continued + * second line + continued +one_enumeration_single_line : int + 1. first line +one_enumeration_two_lines : int + 1) first line + continued +two_enumerations_one_line : int + (iii) first line + (iv) second line +two_enumerations_two_lines : int + a. first line + continued + b. second line + continued +one_definition_one_line : int + item 1 + first line +one_definition_two_lines : int + item 1 + first line + continued +two_definitions_one_line : int + item 1 + first line + item 2 + second line +two_definitions_two_lines : int + item 1 + first line + continued + item 2 + second line + continued +one_definition_blank_line : int + item 1 + + first line + + extra first line + +two_definitions_blank_lines : int + item 1 + + first line + + extra first line + + item 2 + + second line + + extra second line + +definition_after_normal_text : int + text line + + item 1 + first line +""" + + expected = """One line summary. + +:param no_list: +:type no_list: int +:param one_bullet_empty: + * +:type one_bullet_empty: int +:param one_bullet_single_line: + - first line +:type one_bullet_single_line: int +:param one_bullet_two_lines: + + first line + continued +:type one_bullet_two_lines: int +:param two_bullets_single_line: + - first line + - second line +:type two_bullets_single_line: int +:param two_bullets_two_lines: + * first line + continued + * second line + continued +:type two_bullets_two_lines: int +:param one_enumeration_single_line: + 1. first line +:type one_enumeration_single_line: int +:param one_enumeration_two_lines: + 1) first line + continued +:type one_enumeration_two_lines: int +:param two_enumerations_one_line: + (iii) first line + (iv) second line +:type two_enumerations_one_line: int +:param two_enumerations_two_lines: + a. first line + continued + b. second line + continued +:type two_enumerations_two_lines: int +:param one_definition_one_line: + item 1 + first line +:type one_definition_one_line: int +:param one_definition_two_lines: + item 1 + first line + continued +:type one_definition_two_lines: int +:param two_definitions_one_line: + item 1 + first line + item 2 + second line +:type two_definitions_one_line: int +:param two_definitions_two_lines: + item 1 + first line + continued + item 2 + second line + continued +:type two_definitions_two_lines: int +:param one_definition_blank_line: + item 1 + + first line + + extra first line +:type one_definition_blank_line: int +:param two_definitions_blank_lines: + item 1 + + first line + + extra first line + + item 2 + + second line + + extra second line +:type two_definitions_blank_lines: int +:param definition_after_normal_text: text line + + item 1 + first line +:type definition_after_normal_text: int +""" + config = Config(napoleon_use_param=True) + actual = str(NumpyDocstring(docstring, config)) + self.assertEqual(expected, actual) + + expected = """One line summary. + +:Parameters: * **no_list** (*int*) + * **one_bullet_empty** (*int*) -- + + * + * **one_bullet_single_line** (*int*) -- + + - first line + * **one_bullet_two_lines** (*int*) -- + + + first line + continued + * **two_bullets_single_line** (*int*) -- + + - first line + - second line + * **two_bullets_two_lines** (*int*) -- + + * first line + continued + * second line + continued + * **one_enumeration_single_line** (*int*) -- + + 1. first line + * **one_enumeration_two_lines** (*int*) -- + + 1) first line + continued + * **two_enumerations_one_line** (*int*) -- + + (iii) first line + (iv) second line + * **two_enumerations_two_lines** (*int*) -- + + a. first line + continued + b. second line + continued + * **one_definition_one_line** (*int*) -- + + item 1 + first line + * **one_definition_two_lines** (*int*) -- + + item 1 + first line + continued + * **two_definitions_one_line** (*int*) -- + + item 1 + first line + item 2 + second line + * **two_definitions_two_lines** (*int*) -- + + item 1 + first line + continued + item 2 + second line + continued + * **one_definition_blank_line** (*int*) -- + + item 1 + + first line + + extra first line + * **two_definitions_blank_lines** (*int*) -- + + item 1 + + first line + + extra first line + + item 2 + + second line + + extra second line + * **definition_after_normal_text** (*int*) -- text line + + item 1 + first line +""" + config = Config(napoleon_use_param=False) + actual = str(NumpyDocstring(docstring, config)) + self.assertEqual(expected, actual) From 5c363a683e61f471c8b6c3311a9ce42aeec09ca5 Mon Sep 17 00:00:00 2001 From: Jakob Lykke Andersen Date: Thu, 28 Jan 2016 13:19:23 +0900 Subject: [PATCH 229/238] Fix :cpp:any: fix_paren with explicit title. --- sphinx/domains/cpp.py | 17 +++-- tests/roots/test-domain-cpp/any-role.rst | 7 +- tests/roots/test-domain-cpp/index.rst | 9 +++ tests/roots/test-domain-cpp/roles.rst | 7 +- tests/test_domain_cpp.py | 96 +++++++++++++++--------- 5 files changed, 90 insertions(+), 46 deletions(-) diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py index 8868fe285..10602931d 100644 --- a/sphinx/domains/cpp.py +++ b/sphinx/domains/cpp.py @@ -3925,8 +3925,12 @@ class CPPXRefRole(XRefRole): if parent: refnode['cpp:parentKey'] = parent.get_lookup_key() if refnode['reftype'] == 'any': - # Remove parentheses from the target (not from title) - title, target = self._fix_parens(env, True, title, target) + # Assume the removal part of fix_parens for :any: refs. + # The addition part is done with the reference is resolved. + if not has_explicit_title and title.endswith('()'): + title = title[:-2] + if target.endswith('()'): + target = target[:-2] # TODO: should this really be here? if not has_explicit_title: target = target.lstrip('~') # only has a meaning for the title @@ -4052,13 +4056,10 @@ class CPPDomain(Domain): docname = s.docname assert docname if typ == 'any' and declaration.objectType == 'function': - title = name - if title.endswith('()'): - title = title[:-2] # remove parentheses if env.config.add_function_parentheses: - title += '()' - contnode.pop(0) - contnode.insert(0, nodes.Text(title)) + if not node['refexplicit']: + title = contnode.pop(0).astext() + contnode += nodes.Text(title + '()') return make_refnode(builder, fromdocname, docname, declaration.get_newest_id(), contnode, name ), declaration.objectType diff --git a/tests/roots/test-domain-cpp/any-role.rst b/tests/roots/test-domain-cpp/any-role.rst index dacd2f600..4ca7e34f2 100644 --- a/tests/roots/test-domain-cpp/any-role.rst +++ b/tests/roots/test-domain-cpp/any-role.rst @@ -2,9 +2,12 @@ any role -------- * :cpp:any:`Sphinx` -* ref function without parens :cpp:any:`hello`. -* ref function with parens :cpp:any:`hello()`. * :cpp:any:`Sphinx::version` * :cpp:any:`version` * :cpp:any:`List` * :cpp:any:`MyEnum` + +* ref function without parens :cpp:any:`paren_1` +* ref function with parens :cpp:any:`paren_2()` +* ref function without parens, explicit title :cpp:any:`paren_3_title ` +* ref function with parens, explicit title :cpp:any:`paren_4_title ` diff --git a/tests/roots/test-domain-cpp/index.rst b/tests/roots/test-domain-cpp/index.rst index 9be739f1e..e46545b06 100644 --- a/tests/roots/test-domain-cpp/index.rst +++ b/tests/roots/test-domain-cpp/index.rst @@ -35,3 +35,12 @@ directives .. cpp:enum-struct:: protected MyScopedVisibilityEnum : std::underlying_type::type A scoped enum with non-default visibility, and with a specified underlying type. + + +.. cpp:function:: void paren_1(int, float) + +.. cpp:function:: void paren_2(int, float) + +.. cpp:function:: void paren_3(int, float) + +.. cpp:function:: void paren_4(int, float) diff --git a/tests/roots/test-domain-cpp/roles.rst b/tests/roots/test-domain-cpp/roles.rst index 8baf29b4c..5609ee451 100644 --- a/tests/roots/test-domain-cpp/roles.rst +++ b/tests/roots/test-domain-cpp/roles.rst @@ -2,9 +2,12 @@ roles ----- * :cpp:class:`Sphinx` -* ref function without parens :cpp:func:`hello`. -* ref function with parens :cpp:func:`hello()`. * :cpp:member:`Sphinx::version` * :cpp:var:`version` * :cpp:type:`List` * :cpp:enum:`MyEnum` + +* ref function without parens :cpp:func:`paren_1` +* ref function with parens :cpp:func:`paren_2()` +* ref function without parens, explicit title :cpp:func:`paren_3_title ` +* ref function with parens, explicit title :cpp:func:`paren_4_title ` diff --git a/tests/test_domain_cpp.py b/tests/test_domain_cpp.py index b4c795125..aef7e8ed4 100644 --- a/tests/test_domain_cpp.py +++ b/tests/test_domain_cpp.py @@ -397,47 +397,75 @@ def test_templates(): # raise DefinitionError("") -@with_app(testroot='domain-cpp') -def test_build_domain_cpp(app, status, warning): +@with_app(testroot='domain-cpp', confoverrides={'add_function_parentheses': True}) +def test_build_domain_cpp_with_add_function_parentheses_is_True(app, status, warning): app.builder.build_all() - roles = (app.outdir / 'roles.html').text() - assert re.search('
  • Sphinx
  • ', roles) - assert re.search(('
  • ref function without parens ' - 'hello\(\)\.
  • '), roles) - assert re.search(('
  • ref function with parens ' - 'hello\(\)\.
  • '), roles) - assert re.search('
  • Sphinx::version
  • ', - roles) - assert re.search('
  • version
  • ', roles) - assert re.search('
  • List
  • ', roles) - assert re.search('
  • MyEnum
  • ', roles) + def check(spec, text, file): + pattern = '
  • %s%s
  • ' % spec + res = re.search(pattern, text) + if not res: + print("Pattern\n\t%s\nnot found in %s" % (pattern, file)) + assert False + rolePatterns = [ + ('', 'Sphinx'), + ('', 'Sphinx::version'), + ('', 'version'), + ('', 'List'), + ('', 'MyEnum') + ] + parenPatterns = [ + ('ref function without parens ', 'paren_1\(\)'), + ('ref function with parens ', 'paren_2\(\)'), + ('ref function without parens, explicit title ', 'paren_3_title'), + ('ref function with parens, explicit title ', 'paren_4_title') + ] - any_role = (app.outdir / 'any-role.html').text() - assert re.search('
  • Sphinx
  • ', any_role) - assert re.search(('
  • ref function without parens ' - 'hello\(\)\.
  • '), any_role) - assert re.search(('
  • ref function with parens ' - 'hello\(\)\.
  • '), any_role) - assert re.search('
  • Sphinx::version
  • ', - any_role) - assert re.search('
  • version
  • ', any_role) - assert re.search('
  • List
  • ', any_role) - assert re.search('
  • MyEnum
  • ', any_role) + f = 'roles.html' + t = (app.outdir / f).text() + for s in rolePatterns: + check(s, t, f) + for s in parenPatterns: + check(s, t, f) + + f = 'any-role.html' + t = (app.outdir / f).text() + for s in parenPatterns: + check(s, t, f) @with_app(testroot='domain-cpp', confoverrides={'add_function_parentheses': False}) def test_build_domain_cpp_with_add_function_parentheses_is_False(app, status, warning): app.builder.build_all() - roles = (app.outdir / 'roles.html').text() - assert re.search(('
  • ref function without parens ' - 'hello\.
  • '), roles) - assert re.search(('
  • ref function with parens ' - 'hello\.
  • '), roles) + def check(spec, text, file): + pattern = '
  • %s%s
  • ' % spec + res = re.search(pattern, text) + if not res: + print("Pattern\n\t%s\nnot found in %s" % (pattern, file)) + assert False + rolePatterns = [ + ('', 'Sphinx'), + ('', 'Sphinx::version'), + ('', 'version'), + ('', 'List'), + ('', 'MyEnum') + ] + parenPatterns = [ + ('ref function without parens ', 'paren_1'), + ('ref function with parens ', 'paren_2'), + ('ref function without parens, explicit title ', 'paren_3_title'), + ('ref function with parens, explicit title ', 'paren_4_title') + ] - any_role = (app.outdir / 'any-role.html').text() - assert re.search(('
  • ref function without parens ' - 'hello\.
  • '), any_role) - assert re.search(('
  • ref function with parens ' - 'hello\.
  • '), any_role) + f = 'roles.html' + t = (app.outdir / f).text() + for s in rolePatterns: + check(s, t, f) + for s in parenPatterns: + check(s, t, f) + + f = 'any-role.html' + t = (app.outdir / f).text() + for s in parenPatterns: + check(s, t, f) From 30d3d4d82f00d43c04890679058e283e9faf3925 Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Sun, 24 Jan 2016 18:08:30 -0800 Subject: [PATCH 230/238] Add "language" attribute to html in the "basic" theme --- sphinx/themes/basic/changes/frameset.html | 2 +- sphinx/themes/basic/changes/rstsource.html | 2 +- sphinx/themes/basic/changes/versionchanges.html | 2 +- sphinx/themes/basic/layout.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sphinx/themes/basic/changes/frameset.html b/sphinx/themes/basic/changes/frameset.html index 9d9af9eb5..e14cb9e15 100644 --- a/sphinx/themes/basic/changes/frameset.html +++ b/sphinx/themes/basic/changes/frameset.html @@ -1,6 +1,6 @@ - + {% trans version=version|e, docstitle=docstitle|e %}Changes in Version {{ version }} — {{ docstitle }}{% endtrans %} diff --git a/sphinx/themes/basic/changes/rstsource.html b/sphinx/themes/basic/changes/rstsource.html index abd12c1d0..0a27479b0 100644 --- a/sphinx/themes/basic/changes/rstsource.html +++ b/sphinx/themes/basic/changes/rstsource.html @@ -1,6 +1,6 @@ - + {% trans filename=filename, docstitle=docstitle|e %}{{ filename }} — {{ docstitle }}{% endtrans %}